diff -Nru pypy-7.1.1+dfsg/debian/changelog pypy-7.3.1+dfsg/debian/changelog --- pypy-7.1.1+dfsg/debian/changelog 2019-08-08 23:10:56.000000000 +0000 +++ pypy-7.3.1+dfsg/debian/changelog 2020-04-23 02:39:53.000000000 +0000 @@ -1,3 +1,86 @@ +pypy (7.3.1+dfsg-2~ppa1~ubuntu19.10) eoan; urgency=medium + + * Build for the PyPy PPA. + + -- Stefano Rivera Wed, 22 Apr 2020 19:39:53 -0700 + +pypy (7.3.1+dfsg-2) unstable; urgency=medium + + * Point to the installed stdlib in the pypy-local sysconfig layout, to + support virtualenv 20. + * Build out autopkgtests a little. Test: cffi lib importability, local + package installation, virtualenvs, byte-compilation. + + -- Stefano Rivera Mon, 20 Apr 2020 15:35:45 -0700 + +pypy (7.3.1+dfsg-1) unstable; urgency=medium + + * New upstream release, upload to unstable. + * Refresh patches. + + -- Stefano Rivera Fri, 10 Apr 2020 12:33:52 -0700 + +pypy (7.3.1~rc1+dfsg-1) experimental; urgency=medium + + * New upstream RC, upload to experimental + * Update copyright. + * Bump Standards-Version to 4.5.0, no changes needed. + * Refresh patches. + * Update build-cffi-modules to use upstream's new library location. + + -- Stefano Rivera Thu, 09 Apr 2020 16:06:11 -0700 + +pypy (7.3.0+dfsg-3) unstable; urgency=medium + + * Patch: Force s390x port to target z10 by default. + * Patch: Build Sphinx docs with Python 3. This requires disabling autodoc + and other custom extensions. + * Execute python2 (instead of python) during the build. + * We don't need python-docutils, any more. + + -- Stefano Rivera Tue, 24 Mar 2020 19:16:40 -0700 + +pypy (7.3.0+dfsg-2) unstable; urgency=medium + + * Build-Depend on python2 instead of python. + + -- Stefano Rivera Tue, 14 Jan 2020 07:58:52 +0200 + +pypy (7.3.0+dfsg-1) unstable; urgency=medium + + * New upstream release. + * Refresh patches. + * Drop patch arm64-gcc-bug, superseded upstream. + * Update copyright. + * Build with pypy on arm64, now that we've bootstrapped the JIT. + + -- Stefano Rivera Tue, 24 Dec 2019 08:33:03 +0200 + +pypy (7.2.0+dfsg-1) unstable; urgency=medium + + * New upstream final release. + * Upload to unstable. + * Enable JIT and continuation module on arm64. + * Refresh patches. + * Drop patch fix-revdb, superseded upstream. + * Patch arm64-gcc-bug: Avoid a GCC bug in the new arm64 JIT. + * Bump Standards-Version to 4.4.1, no changes needed. + + -- Stefano Rivera Sat, 02 Nov 2019 11:37:59 -0700 + +pypy (7.2.0~rc0+dfsg-1) experimental; urgency=medium + + * New upstream RC, upload to experimental. + * Drop Pre-Depends dpkg (>= 1.15.6~). xz is always supported, these days. + * Move more translation logic into debian/scripts/translate.sh + * Refresh patches. + * Drop patch version-7.1.1, superseded upstream. + * Refresh copyright. + * Bump Standards-Version to 4.4.0, no changes needed. + * Patch fix-revdb: Make RevDB build. + + -- Stefano Rivera Thu, 03 Oct 2019 14:50:09 +0300 + pypy (7.1.1+dfsg-1) unstable; urgency=medium * New upstream minor release. diff -Nru pypy-7.1.1+dfsg/debian/clean pypy-7.3.1+dfsg/debian/clean --- pypy-7.1.1+dfsg/debian/clean 2019-08-08 23:10:56.000000000 +0000 +++ pypy-7.3.1+dfsg/debian/clean 2020-04-20 22:35:45.000000000 +0000 @@ -19,7 +19,10 @@ find include '(' -name '*.h' -o -name '*.inl' ')' \ -a ! -name 'PyPy.h' find lib_pypy '(' -name '*.so' -o -name '*.o' -o -name '*.c' ')' \ - -a ! -name '_ctypes_test.c' -a ! -name '_testcapimodule.c' + -a ! -name '_ctypes_test.c' -a ! -name '_testcapimodule.c' \ + -a ! -path 'lib_pypy/_cffi_ssl/_cffi_src/hazmat_src/*' \ + -a ! -path 'lib_pypy/_cffi_ssl/_cffi_src/openssl/src/*' \ + -a ! -path 'lib_pypy/_cffi_ssl/openssl/src/*' # Tests echo pypy/test.db diff -Nru pypy-7.1.1+dfsg/debian/control pypy-7.3.1+dfsg/debian/control --- pypy-7.1.1+dfsg/debian/control 2019-08-08 23:10:56.000000000 +0000 +++ pypy-7.3.1+dfsg/debian/control 2020-04-20 22:35:45.000000000 +0000 @@ -16,18 +16,17 @@ netbase, pkg-config, procps, - pypy [any-amd64 any-i386 armhf ppc64 ppc64el s390x] , - python (>= 2.6.6-11~), - python-docutils, + pypy [any-amd64 any-i386 arm64 armhf ppc64 ppc64el s390x] , python-pycparser, - python-sphinx (>= 1.0.7+dfsg), + python2, python2.7-dev, + python3-sphinx (>= 1.0.7+dfsg), tcl-dev, tk-dev, valgrind [amd64 arm64 armhf i386 mips mips64el mipsel powerpc ppc64 ppc64el s390x], zlib1g-dev Build-Depends-Indep: graphviz -Standards-Version: 4.3.0 +Standards-Version: 4.5.0 Homepage: http://pypy.org/ Vcs-Git: https://salsa.debian.org/debian/pypy.git Vcs-Browser: https://salsa.debian.org/debian/pypy @@ -41,7 +40,6 @@ pypy-dev (<< ${source:Version}) Provides: ${pypy-abi} Suggests: pypy-doc, pypy-tk (= ${binary:Version}) -Pre-Depends: dpkg (>= 1.15.6~), ${misc:Pre-Depends} Description: fast alternative implementation of Python - PyPy interpreter PyPy is a fast, compliant alternative implementation of the Python language (2.7). It has several advantages and distinct features: @@ -61,7 +59,6 @@ Architecture: any Depends: pypy (= ${binary:Version}), ${misc:Depends}, ${shlibs:Depends} Replaces: pypy-lib (<< 2.2) -Pre-Depends: dpkg (>= 1.15.6~), ${misc:Pre-Depends} Description: Tkinter module for PyPy (an alternative Python interpreter) A module for writing portable GUI applications with PyPy using Tk. Also known as Tkinter. @@ -73,7 +70,6 @@ Architecture: any Multi-Arch: same Depends: ${misc:Depends} -Pre-Depends: dpkg (>= 1.15.6~), ${misc:Pre-Depends} Provides: ${cffi:Provides} Description: standard library for PyPy (an alternative Python interpreter) The PyPy standard library. This is a combination of modules, copied directly @@ -87,7 +83,6 @@ Architecture: all Depends: pypy, pypy-lib (>= ${source:Version}), ${misc:Depends} Replaces: pypy-lib (<< 2.2) -Pre-Depends: dpkg (>= 1.15.6~), ${misc:Pre-Depends} Description: standard library test suite for PyPy (an alternative Python interpreter) The complete test suite for the PyPy standard library. . @@ -98,8 +93,7 @@ Section: doc Architecture: all Depends: ${misc:Depends}, ${sphinxdoc:Depends} -Pre-Depends: dpkg (>= 1.15.6~), ${misc:Pre-Depends} -Suggests: python-doc +Suggests: python2-doc Description: developer Documentation for PyPy (an alternative Python interpreter) The Developer documentation for PyPy. This mostly covers the internals of PyPy, and development of PyPy itself. @@ -110,7 +104,6 @@ Package: pypy-dev Architecture: all Depends: pypy (>= ${source:Version}), ${misc:Depends} -Pre-Depends: dpkg (>= 1.15.6~), ${misc:Pre-Depends} Provides: libpypy-dev Description: header files for PyPy (an alternative Python interpreter) Header files for compiling cpython C extension modules for use with PyPy. diff -Nru pypy-7.1.1+dfsg/debian/copyright pypy-7.3.1+dfsg/debian/copyright --- pypy-7.1.1+dfsg/debian/copyright 2019-08-08 23:10:56.000000000 +0000 +++ pypy-7.3.1+dfsg/debian/copyright 2020-04-20 22:35:45.000000000 +0000 @@ -9,21 +9,21 @@ disable Files: * -Copyright: 2003-2019, +Copyright: 2003-2020, Armin Rigo Maciej Fijalkowski Carl Friedrich Bolz-Tereick + Matti Picus Antonio Cuni Amaury Forgeot d'Arc - Matti Picus - Samuele Pedroni Ronan Lamy + Samuele Pedroni Alex Gaynor Philip Jenvey Richard Plangger Brian Kearns - Michael Hudson-Doyle Manuel Jacob + Michael Hudson-Doyle David Schneider Holger Krekel Christian Tismer @@ -66,15 +66,17 @@ Jacob Hallen Jason Creighton Mark Young + Andrew Lawrence Alex Martelli Spenser Bauman Michal Bendowski Jan de Mooij + Stefan Beyer + Stefano Rivera Tyler Wade Vincent Legoll Michael Foord Stephan Diehl - Stefano Rivera Jean-Paul Calderone Stefan Schwarzer Tomek Meka @@ -83,7 +85,6 @@ Devin Jeanpierre Bob Ippolito Bruno Gola - Andrew Lawrence David Malcolm Squeaky Edd Barrett @@ -96,8 +97,8 @@ Martin Matusiak Wenzhu Man Konstantin Lopuhin + Yannick Jadoul John Witulski - Stefan Beyer Jeremy Thurgood Greg Price Ivan Sichmann Freitas @@ -107,8 +108,10 @@ Tobias Pape Andreas Stührk Jean-Philippe St. Pierre + Stian Andreassen Guido van Rossum Pavel Vinogradov + Julian Berman William Leslie Paweł Piotr Przeradowski marky1991 @@ -119,14 +122,13 @@ Taavi Burns Adrian Kuhn tav - Stian Andreassen - Georg Brandl Joannah Nanjekye + Georg Brandl + quejebo Bert Freudenberg Wanja Saatkamp Mike Blume Gerald Klix - Julian Berman Oscar Nierstrasz Rami Chowdhury Stefan H. Muller @@ -165,6 +167,7 @@ Lucian Branescu Mihaila Mariano Anaya anatoly techtonik + Lin Cheng Karl Bartel Gabriel Lavoie Jared Grubb @@ -195,6 +198,7 @@ Anders Qvist Corbin Simpson Chirag Jadwani + Mike Pavone Pauli Virtanen Jonathan David Riehl Beatrice During @@ -218,6 +222,7 @@ Valentina Mukhamedzhanova Stefano Parmesan touilleMan + Anthony Sottile Marc Abramowitz Arjun Naik Aaron Gallagher @@ -227,7 +232,6 @@ Omer Katz Jacek Generowicz Tomasz Dziopa - Lin Cheng Sylvain Thenault Jakub Stasiak Andrew Dalke @@ -243,9 +247,12 @@ Yasir Suhail Sergey Kishchenko Martin Blais + Catalin Fierut Lutz Paelike Ian Foote Philipp Rustemeuer + Bernd Schoeller + olliemath Logan Chien Catalin Gabriel Manciu Jacob Oscarson @@ -258,7 +265,6 @@ Lene Wagner Tomo Cocoa Miro Hrončok - Anthony Sottile David Lievens Neil Blakey-Milner Henrik Vendelbo @@ -267,24 +273,31 @@ Christoph Gerum Miguel de Val Borro Artur Lisiecki + joserubiovidales@gmail.com afteryu Toni Mattis + Vincent Michel Laurens Van Houtven Bobby Impollonia Roberto De Ioris + Sreepathi Pai Jeong YunWon + dakarpov@gmail.com Christopher Armstrong Aaron Tubbs Vasantha Ganesh K Jason Michalski Radu Ciorba + Ryan Hileman Markus Holtermann + Georges Racinet Andrew Thompson Yusei Tahara Ruochen Huang Fabio Niephaus Akira Li Gustavo Niemeyer + joachim-ballmann@bitbucket.org Nate Bragg Lucas Stadler roberto@goyle @@ -300,12 +313,17 @@ Kim Jin Su Amber Brown Andrew Stepanov + ashwinahuja Rafał Gałczyński Ben Darnell Juan Francisco Cantero Hurtado Godefroid Chappelle + Paul Ganssle + Michal Kuffa Stephan Busemann + Bystroushaak Dan Colish + Ram Rachum timo Volodymyr Vladymyrov Daniel Neuhäuser @@ -315,21 +333,28 @@ Chris Lambacher John Aldis coolbutuseless@gmail.com + Yasen Kiprov Mike Bayer Rodrigo Araújo Daniil Yarancev Min RK OlivierBlanvillain + bernd.schoeller@inf.ethz.ch Jonas Pfannschmidt + Alex Kashirin Zearin + Joannah Nanjekye nanjekyejoannah@gmail.com + Ihar Shabes Johan Forsberg Andrey Churin Dan Crosta reubano@gmail.com Stanisław Halik + DeVerne Jones Julien Phalip Roman Podoliaka Steve Papanik + Henri Tuhola Eli Stevens Boglarka Vezer gabrielg@ec2-54-146-239-158.compute-1.amazonaws.com @@ -342,24 +367,29 @@ Jim Hunziker shoma hosaka Buck Golemon + whitequark Iraklis D. JohnDoe yrttyr Michael Chermside Anna Ravencroft remarkablerocket + Ivan Petre Vijiac Berker Peksag Christian Muirhead soareschen Matthew Miller + Jesdi Konrad Delong Dinu Gherman + Sam Edwards pizi Tomáš Pružina James Robert Armin Ronacher Diana Popa + Mike Kaplinskiy Mads Kiilerich Brett Cannon Caleb Hattingh @@ -371,17 +401,21 @@ Markus Unterwaditzer Kristoffer Kleine Graham Markall + paugier Dan Loewenherz werat Filip Salomonsson Niclas Olofsson + Zsolt Cserna Chris Pressey Tobias Diaz Paul Graydon + mkuffa Nikolaos-Digenis Karagiannis Kurt Griffiths Ben Mather Donald Stufft + kotus9 Dan Sanders Jason Madden Yaroslav Fedevych @@ -402,12 +436,20 @@ King's College London License: Expat +Files: lib_pypy/_cffi_ssl/cryptography/* +Copyright: 2013-2017, The cryptography developers +License: BSD-3-generic or Apache-2.0 + +Files: lib_pypy/_cffi_ssl/osx-roots.diff +Copyright: 2009 Apple Inc. +License: BSD-2 + Files: lib_pypy/cffi/_pycparser/* -Copyright: 2008-2012, Eli Bendersky +Copyright: 2008-2015, Eli Bendersky License: BSD-3-Bendersky Files: lib_pypy/cffi/_pycparser/ply/* -Copyright: 2001-2012, David M. Beazley (Dabeaz LLC) +Copyright: 2001-2017, David M. Beazley (Dabeaz LLC) License: BSD-3-Dabeaz Files: lib_pypy/_tkinter/* diff -Nru pypy-7.1.1+dfsg/debian/patches/ctypes-arm pypy-7.3.1+dfsg/debian/patches/ctypes-arm --- pypy-7.1.1+dfsg/debian/patches/ctypes-arm 2019-08-08 23:10:56.000000000 +0000 +++ pypy-7.3.1+dfsg/debian/patches/ctypes-arm 2020-04-20 22:35:45.000000000 +0000 @@ -17,10 +17,10 @@ 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/lib-python/2.7/ctypes/util.py b/lib-python/2.7/ctypes/util.py -index 16930e4..eb1c8e1 100644 +index ccfdfba..e2d7798 100644 --- a/lib-python/2.7/ctypes/util.py +++ b/lib-python/2.7/ctypes/util.py -@@ -237,16 +237,27 @@ elif os.name == "posix": +@@ -233,16 +233,27 @@ elif os.name == "posix": def _findSoname_ldconfig(name): import struct diff -Nru pypy-7.1.1+dfsg/debian/patches/distutils-install-layout pypy-7.3.1+dfsg/debian/patches/distutils-install-layout --- pypy-7.1.1+dfsg/debian/patches/distutils-install-layout 2019-08-08 23:10:56.000000000 +0000 +++ pypy-7.3.1+dfsg/debian/patches/distutils-install-layout 2020-04-20 22:35:45.000000000 +0000 @@ -23,11 +23,11 @@ 8 files changed, 119 insertions(+), 14 deletions(-) diff --git a/lib-python/2.7/distutils/command/install.py b/lib-python/2.7/distutils/command/install.py -index fc43951..76fdd75 100644 +index 6fe62be..21a0b21 100644 --- a/lib-python/2.7/distutils/command/install.py +++ b/lib-python/2.7/distutils/command/install.py -@@ -90,6 +90,20 @@ INSTALL_SCHEMES = { - 'scripts': '$base/bin', +@@ -97,6 +97,20 @@ INSTALL_SCHEMES = { + 'scripts': '$base/Scripts', 'data' : '$base', }, + 'pypy-deb': { @@ -47,7 +47,7 @@ } # The keys to an installation scheme; if any new types of files are to be -@@ -161,6 +175,9 @@ class install (Command): +@@ -168,6 +182,9 @@ class install (Command): ('record=', None, "filename in which to record list of installed files"), @@ -57,7 +57,7 @@ ] boolean_options = ['compile', 'force', 'skip-build', 'user'] -@@ -175,6 +192,7 @@ class install (Command): +@@ -182,6 +199,7 @@ class install (Command): self.exec_prefix = None self.home = None self.user = 0 @@ -65,7 +65,7 @@ # These select only the installation base; it's up to the user to # specify the installation scheme (currently, that means supplying -@@ -196,6 +214,9 @@ class install (Command): +@@ -203,6 +221,9 @@ class install (Command): self.install_userbase = USER_BASE self.install_usersite = USER_SITE @@ -75,7 +75,7 @@ self.compile = None self.optimize = None -@@ -428,6 +449,7 @@ class install (Command): +@@ -435,6 +456,7 @@ class install (Command): self.install_base = self.install_platbase = self.home self.select_scheme("unix_home") else: @@ -83,7 +83,7 @@ if self.prefix is None: if self.exec_prefix is not None: raise DistutilsOptionError, \ -@@ -442,7 +464,25 @@ class install (Command): +@@ -449,7 +471,25 @@ class install (Command): self.install_base = self.prefix self.install_platbase = self.exec_prefix @@ -110,15 +110,15 @@ # finalize_unix () -@@ -475,7 +515,7 @@ class install (Command): +@@ -482,7 +522,7 @@ class install (Command): def select_scheme (self, name): # it's the caller's problem if they supply a bad name! if (hasattr(sys, 'pypy_version_info') and -- not name.endswith(('_user', '_home'))): -+ not (name.endswith(('_user', '_home')) or name.startswith('pypy'))): - name = 'pypy' - scheme = INSTALL_SCHEMES[name] - for key in SCHEME_KEYS: +- not name.endswith(('_user', '_home'))): ++ not (name.endswith(('_user', '_home')) or name.startswith('pypy-'))): + if os.name == 'nt': + name = 'pypy_nt' + else: diff --git a/lib-python/2.7/distutils/command/install_egg_info.py b/lib-python/2.7/distutils/command/install_egg_info.py index c888031..88b5d94 100644 --- a/lib-python/2.7/distutils/command/install_egg_info.py @@ -168,7 +168,7 @@ self.outputs = [self.target] diff --git a/lib-python/2.7/distutils/sysconfig_pypy.py b/lib-python/2.7/distutils/sysconfig_pypy.py -index bbc648e..ca74219 100644 +index a10c53d..5279455 100644 --- a/lib-python/2.7/distutils/sysconfig_pypy.py +++ b/lib-python/2.7/distutils/sysconfig_pypy.py @@ -49,11 +49,15 @@ def get_python_lib(plat_specific=0, standard_lib=0, prefix=None): @@ -249,7 +249,7 @@ elif os.sep == '/': sitepackages.append(os.path.join(prefix, "lib", diff --git a/lib-python/2.7/sysconfig.py b/lib-python/2.7/sysconfig.py -index 2defd50..1e1bbc0 100644 +index 8f71ee7..6bfe991 100644 --- a/lib-python/2.7/sysconfig.py +++ b/lib-python/2.7/sysconfig.py @@ -36,6 +36,26 @@ _INSTALL_SCHEMES = { @@ -267,12 +267,12 @@ + 'data' : '{base}', + }, + 'pypy-local': { -+ 'stdlib': '{base}/../../local/lib/pypy{py_version_short}/lib-python', -+ 'platstdlib': '{base}/../../local/lib/pypy{py_version_short}/lib-python', ++ 'stdlib': '{base}/lib-python/{py_version_short}', ++ 'platstdlib': '{base}/lib-python/{py_version_short}', + 'purelib': '{base}/../../local/lib/pypy{py_version_short}/lib-python', + 'platlib': '{base}/../../local/lib/pypy{py_version_short}/lib-python', -+ 'include': '{base}/../../local/include', -+ 'platinclude': '{base}/../../local/include', ++ 'include': '{base}/include', ++ 'platinclude': '{base}/include', + 'scripts': '{base}/../../local/bin', + 'data' : '{base}/../../local', + }, @@ -292,7 +292,7 @@ elif os.name == 'posix': # the default scheme for posix is posix_prefix return 'posix_prefix' -@@ -425,7 +449,8 @@ def get_config_h_filename(): +@@ -430,7 +454,8 @@ def get_config_h_filename(): else: inc_dir = _PROJECT_BASE else: diff -Nru pypy-7.1.1+dfsg/debian/patches/ensurepip-disabled pypy-7.3.1+dfsg/debian/patches/ensurepip-disabled --- pypy-7.1.1+dfsg/debian/patches/ensurepip-disabled 2019-08-08 23:10:56.000000000 +0000 +++ pypy-7.3.1+dfsg/debian/patches/ensurepip-disabled 2020-04-20 22:35:45.000000000 +0000 @@ -10,10 +10,10 @@ 2 files changed, 18 insertions(+) diff --git a/lib-python/2.7/ensurepip/__init__.py b/lib-python/2.7/ensurepip/__init__.py -index f1cdbd1..896feee 100644 +index fa2ccec..7c37509 100644 --- a/lib-python/2.7/ensurepip/__init__.py +++ b/lib-python/2.7/ensurepip/__init__.py -@@ -12,6 +12,21 @@ import tempfile +@@ -13,6 +13,21 @@ import warnings __all__ = ["version", "bootstrap"] @@ -35,7 +35,7 @@ _PROJECTS = [ "setuptools", -@@ -33,6 +48,7 @@ def version(): +@@ -37,6 +52,7 @@ def version(): """ Returns a string specifying the bundled version of pip. """ @@ -43,7 +43,7 @@ whl_name = 'pip' wheel_names = glob.glob('/usr/share/python-wheels/%s-*.whl' % whl_name) if len(wheel_names) == 1: -@@ -61,6 +77,7 @@ def bootstrap(root=None, upgrade=False, user=False, +@@ -65,6 +81,7 @@ def bootstrap(root=None, upgrade=False, user=False, Note that calling this function will alter both sys.path and os.environ. """ diff -Nru pypy-7.1.1+dfsg/debian/patches/ensurepip-wheels pypy-7.3.1+dfsg/debian/patches/ensurepip-wheels --- pypy-7.1.1+dfsg/debian/patches/ensurepip-wheels 2019-08-08 23:10:56.000000000 +0000 +++ pypy-7.3.1+dfsg/debian/patches/ensurepip-wheels 2020-04-20 22:35:45.000000000 +0000 @@ -11,7 +11,7 @@ 1 file changed, 54 insertions(+), 20 deletions(-) diff --git a/lib-python/2.7/ensurepip/__init__.py b/lib-python/2.7/ensurepip/__init__.py -index c2abed8..f1cdbd1 100644 +index 78ffd23..fa2ccec 100644 --- a/lib-python/2.7/ensurepip/__init__.py +++ b/lib-python/2.7/ensurepip/__init__.py @@ -1,6 +1,7 @@ @@ -22,13 +22,13 @@ import os import os.path import pkgutil -@@ -12,13 +13,9 @@ import tempfile +@@ -13,13 +14,9 @@ import warnings __all__ = ["version", "bootstrap"] --_SETUPTOOLS_VERSION = "28.8.0" +-_SETUPTOOLS_VERSION = "44.0.0" - --_PIP_VERSION = "9.0.1" +-_PIP_VERSION = "20.0.2" - _PROJECTS = [ - ("setuptools", _SETUPTOOLS_VERSION), @@ -38,7 +38,7 @@ ] -@@ -36,7 +33,11 @@ def version(): +@@ -40,7 +37,11 @@ def version(): """ Returns a string specifying the bundled version of pip. """ @@ -51,7 +51,7 @@ def _disable_pip_configuration_settings(): -@@ -78,21 +79,53 @@ def bootstrap(root=None, upgrade=False, user=False, +@@ -82,21 +83,53 @@ def bootstrap(root=None, upgrade=False, user=False, # omit pip and easy_install os.environ["ENSUREPIP_OPTIONS"] = "install" @@ -114,8 +114,8 @@ + copy_wheels(_PROJECTS, tmpdir, additional_paths) # Construct the arguments to be passed to the pip command - args = ["install", "--no-index", "--find-links", tmpdir] -@@ -105,7 +138,7 @@ def bootstrap(root=None, upgrade=False, user=False, + args = ["install", "--no-warn-script-location", "--no-index", +@@ -110,7 +143,7 @@ def bootstrap(root=None, upgrade=False, user=False, if verbosity: args += ["-" + "v" * verbosity] @@ -124,7 +124,7 @@ finally: shutil.rmtree(tmpdir, ignore_errors=True) -@@ -122,7 +155,8 @@ def _uninstall_helper(verbosity=0): +@@ -127,7 +160,8 @@ def _uninstall_helper(verbosity=0): return # If the pip version doesn't match the bundled one, leave it alone @@ -134,7 +134,7 @@ msg = ("ensurepip will only uninstall a matching version " "({!r} installed, {!r} bundled)") print(msg.format(pip.__version__, _PIP_VERSION), file=sys.stderr) -@@ -135,7 +169,7 @@ def _uninstall_helper(verbosity=0): +@@ -140,7 +174,7 @@ def _uninstall_helper(verbosity=0): if verbosity: args += ["-" + "v" * verbosity] diff -Nru pypy-7.1.1+dfsg/debian/patches/multiarch pypy-7.3.1+dfsg/debian/patches/multiarch --- pypy-7.1.1+dfsg/debian/patches/multiarch 2019-08-08 23:10:56.000000000 +0000 +++ pypy-7.3.1+dfsg/debian/patches/multiarch 2020-04-20 22:35:45.000000000 +0000 @@ -19,17 +19,17 @@ pypy/module/imp/importing.py | 5 ++++- pypy/module/imp/interp_imp.py | 8 ++++++-- pypy/module/imp/test/test_import.py | 3 ++- - pypy/module/sys/__init__.py | 4 ++++ pypy/module/sys/debian.py | 12 ++++++++++++ + pypy/module/sys/moduledef.py | 4 ++++ pypy/module/sys/test/test_sysmodule.py | 5 +++++ 9 files changed, 46 insertions(+), 4 deletions(-) create mode 100644 pypy/module/sys/debian.py diff --git a/lib-python/2.7/sysconfig.py b/lib-python/2.7/sysconfig.py -index f126b1d..2defd50 100644 +index ca860cd..8f71ee7 100644 --- a/lib-python/2.7/sysconfig.py +++ b/lib-python/2.7/sysconfig.py -@@ -525,6 +525,9 @@ def get_config_vars(*args): +@@ -531,6 +531,9 @@ def get_config_vars(*args): import imp for suffix, mode, type_ in imp.get_suffixes(): if type_ == imp.C_EXTENSION: @@ -71,10 +71,10 @@ + 'MULTIARCH': sys._multiarch, + }) diff --git a/pypy/module/imp/importing.py b/pypy/module/imp/importing.py -index bcdce96..9b34946 100644 +index 573cfc6..8579296 100644 --- a/pypy/module/imp/importing.py +++ b/pypy/module/imp/importing.py -@@ -42,7 +42,7 @@ DEFAULT_SOABI = 'pypy-41' +@@ -39,7 +39,7 @@ DEFAULT_SOABI = 'pypy-%d%d' % PYPY_VERSION[:2] DEFAULT_MAGIC_TAG = DEFAULT_SOABI @specialize.memo() @@ -83,7 +83,7 @@ if space.config.objspace.soabi is not None: soabi = space.config.objspace.soabi else: -@@ -54,6 +54,9 @@ def get_so_extension(space): +@@ -51,6 +51,9 @@ def get_so_extension(space): if not space.config.translating: soabi += 'i' @@ -94,7 +94,7 @@ def log_pyverbose(space, level, message): diff --git a/pypy/module/imp/interp_imp.py b/pypy/module/imp/interp_imp.py -index 8444349..efac05a 100644 +index 7d133f5..21b9f3d 100644 --- a/pypy/module/imp/interp_imp.py +++ b/pypy/module/imp/interp_imp.py @@ -11,10 +11,14 @@ from pypy.interpreter.streamutil import wrap_streamerror @@ -115,10 +115,10 @@ space.newtuple([space.newtext('.py'), space.newtext('U'), diff --git a/pypy/module/imp/test/test_import.py b/pypy/module/imp/test/test_import.py -index e5851ea..ba85776 100644 +index dcd0472..5c0d199 100644 --- a/pypy/module/imp/test/test_import.py +++ b/pypy/module/imp/test/test_import.py -@@ -850,11 +850,12 @@ class TestAbi: +@@ -864,11 +864,12 @@ class TestAbi: def test_abi_tag(self): space1 = maketestobjspace(make_config(None, soabi='TEST')) space2 = maketestobjspace(make_config(None, soabi='')) @@ -132,10 +132,28 @@ assert importing.get_so_extension(space2) == '.so' def _getlong(data): -diff --git a/pypy/module/sys/__init__.py b/pypy/module/sys/__init__.py +diff --git a/pypy/module/sys/debian.py b/pypy/module/sys/debian.py +new file mode 100644 +index 0000000..6c5fbdb +--- /dev/null ++++ b/pypy/module/sys/debian.py +@@ -0,0 +1,12 @@ ++import os ++import sys ++ ++_multiarch = getattr(getattr(sys, 'implementation', sys), '_multiarch', None) ++# Support building under the Debian buildsystem, on older releases ++if not _multiarch: ++ _multiarch = os.environ['DEB_HOST_MULTIARCH'] ++del os, sys ++ ++ ++def get_multiarch_tuple(space): ++ return space.wrap(_multiarch) +diff --git a/pypy/module/sys/moduledef.py b/pypy/module/sys/moduledef.py index 5a7d4bd..32944d6 100644 ---- a/pypy/module/sys/__init__.py -+++ b/pypy/module/sys/__init__.py +--- a/pypy/module/sys/moduledef.py ++++ b/pypy/module/sys/moduledef.py @@ -2,6 +2,7 @@ from pypy.interpreter.mixedmodule import MixedModule from pypy.interpreter.error import OperationError from rpython.rlib.objectmodel import we_are_translated @@ -154,24 +172,6 @@ appleveldefs = { 'excepthook' : 'app.excepthook', '__excepthook__' : 'app.excepthook', -diff --git a/pypy/module/sys/debian.py b/pypy/module/sys/debian.py -new file mode 100644 -index 0000000..6c5fbdb ---- /dev/null -+++ b/pypy/module/sys/debian.py -@@ -0,0 +1,12 @@ -+import os -+import sys -+ -+_multiarch = getattr(getattr(sys, 'implementation', sys), '_multiarch', None) -+# Support building under the Debian buildsystem, on older releases -+if not _multiarch: -+ _multiarch = os.environ['DEB_HOST_MULTIARCH'] -+del os, sys -+ -+ -+def get_multiarch_tuple(space): -+ return space.wrap(_multiarch) diff --git a/pypy/module/sys/test/test_sysmodule.py b/pypy/module/sys/test/test_sysmodule.py index cf0812a..f498809 100644 --- a/pypy/module/sys/test/test_sysmodule.py diff -Nru pypy-7.1.1+dfsg/debian/patches/pep3147-core pypy-7.3.1+dfsg/debian/patches/pep3147-core --- pypy-7.1.1+dfsg/debian/patches/pep3147-core 2019-08-08 23:10:56.000000000 +0000 +++ pypy-7.3.1+dfsg/debian/patches/pep3147-core 2020-04-20 22:35:45.000000000 +0000 @@ -12,19 +12,19 @@ pypy/interpreter/app_main.py | 1 + pypy/interpreter/main.py | 1 + pypy/interpreter/test/test_main.py | 11 + - pypy/module/imp/__init__.py | 3 + pypy/module/imp/importing.py | 81 +++++- pypy/module/imp/interp_imp.py | 12 + + pypy/module/imp/moduledef.py | 3 + pypy/module/imp/test/test_app.py | 7 +- pypy/module/imp/test/test_import.py | 323 ++++++++++++++++++++++-- pypy/module/zipimport/test/test_undocumented.py | 23 +- 11 files changed, 430 insertions(+), 38 deletions(-) diff --git a/pypy/config/pypyoption.py b/pypy/config/pypyoption.py -index 10424b3..46a4618 100644 +index be49345..7dae240 100644 --- a/pypy/config/pypyoption.py +++ b/pypy/config/pypyoption.py -@@ -186,6 +186,11 @@ pypy_optiondescription = OptionDescription("objspace", "Object Space Options", [ +@@ -149,6 +149,11 @@ pypy_optiondescription = OptionDescription("objspace", "Object Space Options", [ cmdline="--soabi", default=None), @@ -49,10 +49,10 @@ Apart from the basic Module used for importing diff --git a/pypy/interpreter/app_main.py b/pypy/interpreter/app_main.py -index 48285ea..9e5d326 100755 +index ec5dcab..d9f154d 100755 --- a/pypy/interpreter/app_main.py +++ b/pypy/interpreter/app_main.py -@@ -740,6 +740,7 @@ def run_command_line(interactive, +@@ -742,6 +742,7 @@ def run_command_line(interactive, # on the command-line. filename = sys.argv[0] mainmodule.__file__ = filename @@ -61,7 +61,7 @@ # assume it's a pyc file only if its name says so. # CPython goes to great lengths to detect other cases diff --git a/pypy/interpreter/main.py b/pypy/interpreter/main.py -index f47e118..b76c330 100644 +index e1141a5..24f58b7 100644 --- a/pypy/interpreter/main.py +++ b/pypy/interpreter/main.py @@ -43,6 +43,7 @@ def _run_eval_string(source, filename, space, eval): @@ -111,42 +111,28 @@ + + def test__file__file(self): + checkoutput(self.space, testresultoutput, main.run_file, str(test__file__fn)) -diff --git a/pypy/module/imp/__init__.py b/pypy/module/imp/__init__.py -index 39b577a..fb1023a 100644 ---- a/pypy/module/imp/__init__.py -+++ b/pypy/module/imp/__init__.py -@@ -17,6 +17,9 @@ class Module(MixedModule): - 'get_suffixes': 'interp_imp.get_suffixes', - - 'get_magic': 'interp_imp.get_magic', -+ 'get_tag': 'interp_imp.get_tag', -+ 'cache_from_source': 'interp_imp.cache_from_source', -+ 'source_from_cache': 'interp_imp.source_from_cache', - 'find_module': 'interp_imp.find_module', - 'load_module': 'interp_imp.load_module', - 'load_source': 'interp_imp.load_source', diff --git a/pypy/module/imp/importing.py b/pypy/module/imp/importing.py -index ec04589..bcdce96 100644 +index 471aa4e..573cfc6 100644 --- a/pypy/module/imp/importing.py +++ b/pypy/module/imp/importing.py -@@ -11,7 +11,7 @@ from pypy.interpreter.error import OperationError, oefmt - from pypy.interpreter.baseobjspace import W_Root, CannotHaveLock +@@ -12,7 +12,7 @@ from pypy.interpreter.baseobjspace import W_Root, CannotHaveLock from pypy.interpreter.eval import Code from pypy.interpreter.pycode import PyCode + from pypy.interpreter.streamutil import wrap_streamerror -from rpython.rlib import streamio, jit +from rpython.rlib import rstring, streamio, jit from rpython.rlib.streamio import StreamErrors from rpython.rlib.objectmodel import we_are_translated, specialize from pypy.module.sys.version import PYPY_VERSION -@@ -39,6 +39,7 @@ SO = '.pyd' if _WIN32 else '.so' +@@ -36,6 +36,7 @@ SO = '.pyd' if _WIN32 else '.so' + # and cffi so's. If we do have to update it, we'd likely need a way to # split the two usages again. - #DEFAULT_SOABI = 'pypy-%d%d' % PYPY_VERSION[:2] - DEFAULT_SOABI = 'pypy-41' + DEFAULT_SOABI = 'pypy-%d%d' % PYPY_VERSION[:2] +DEFAULT_MAGIC_TAG = DEFAULT_SOABI @specialize.memo() def get_so_extension(space): -@@ -604,6 +605,7 @@ def find_module(space, modulename, w_modulename, partname, w_path, +@@ -606,6 +607,7 @@ def find_module(space, modulename, w_modulename, partname, w_path, def _prepare_module(space, w_mod, filename, pkgdir): space.sys.setmodule(w_mod) space.setattr(w_mod, space.newtext('__file__'), space.newtext(filename)) @@ -154,7 +140,7 @@ space.setattr(w_mod, space.newtext('__doc__'), space.w_None) if pkgdir is not None: space.setattr(w_mod, space.newtext('__path__'), space.newlist([space.newtext(pkgdir)])) -@@ -889,6 +891,65 @@ def get_pyc_magic(space): +@@ -886,6 +888,65 @@ def get_pyc_magic(space): return default_magic @@ -221,24 +207,24 @@ def parse_source_module(space, pathname, source): """ Parse a source file and return the corresponding code object """ @@ -928,7 +989,7 @@ def load_source_module(space, w_modulename, w_mod, pathname, source, fd, - (space.text_w(w_modulename), pathname)) - - src_stat = os.fstat(fd) + src_stat = os.fstat(fd) + except OSError as e: + raise wrap_oserror(space, e, pathname) # better report this error - cpathname = pathname + 'c' + cpathname = make_compiled_pathname(space, pathname) mtime = int(src_stat[stat.ST_MTIME]) mode = src_stat[stat.ST_MODE] stream = check_compiled_module(space, cpathname, mtime) -@@ -942,7 +1003,7 @@ def load_source_module(space, w_modulename, w_mod, pathname, source, fd, - stream.close() - except StreamErrors: - pass +@@ -940,7 +1001,7 @@ def load_source_module(space, w_modulename, w_mod, pathname, source, fd, + _wrap_readall(space, stream)) + finally: + _close_ignore(stream) - space.setattr(w_mod, space.newtext('__file__'), space.newtext(cpathname)) + space.setattr(w_mod, space.newtext('__file__'), space.newtext(pathname)) else: code_w = parse_source_module(space, pathname, source) -@@ -958,6 +1019,7 @@ def load_source_module(space, w_modulename, w_mod, pathname, source, fd, +@@ -956,6 +1017,7 @@ def load_source_module(space, w_modulename, w_mod, pathname, source, fd, if optimize >= 2: code_w.remove_docstrings(space) @@ -246,7 +232,7 @@ update_code_filenames(space, code_w, pathname) return exec_code_module(space, w_mod, code_w, w_modulename, check_afterwards=check_afterwards) -@@ -1094,6 +1156,19 @@ def write_compiled_module(space, co, cpathname, src_mode, src_mtime): +@@ -1118,6 +1180,19 @@ def write_compiled_module(space, co, cpathname, src_mode, src_mtime): raise #print "Problem while marshalling %s, skipping" % cpathname return @@ -267,7 +253,7 @@ # Careful here: we must not crash nor leave behind something that looks # too much like a valid pyc file but really isn't one. diff --git a/pypy/module/imp/interp_imp.py b/pypy/module/imp/interp_imp.py -index c0bd0c6..8444349 100644 +index 09127ab..7d133f5 100644 --- a/pypy/module/imp/interp_imp.py +++ b/pypy/module/imp/interp_imp.py @@ -36,6 +36,18 @@ def get_magic(space): @@ -289,11 +275,25 @@ def get_file(space, w_file, filename, filemode): if space.is_none(w_file): try: +diff --git a/pypy/module/imp/moduledef.py b/pypy/module/imp/moduledef.py +index 39b577a..fb1023a 100644 +--- a/pypy/module/imp/moduledef.py ++++ b/pypy/module/imp/moduledef.py +@@ -17,6 +17,9 @@ class Module(MixedModule): + 'get_suffixes': 'interp_imp.get_suffixes', + + 'get_magic': 'interp_imp.get_magic', ++ 'get_tag': 'interp_imp.get_tag', ++ 'cache_from_source': 'interp_imp.cache_from_source', ++ 'source_from_cache': 'interp_imp.source_from_cache', + 'find_module': 'interp_imp.find_module', + 'load_module': 'interp_imp.load_module', + 'load_source': 'interp_imp.load_source', diff --git a/pypy/module/imp/test/test_app.py b/pypy/module/imp/test/test_app.py -index f095168..70c0a00 100644 +index 8f3c2cf..a3b2d97 100644 --- a/pypy/module/imp/test/test_app.py +++ b/pypy/module/imp/test/test_app.py -@@ -150,6 +150,7 @@ class AppTestImpModule: +@@ -151,6 +151,7 @@ class AppTestImpModule: def test_rewrite_pyc_check_code_name(self): # This one is adapted from cpython's Lib/test/test_import.py @@ -301,7 +301,7 @@ from os import chmod from os.path import join from sys import modules, path -@@ -159,6 +160,7 @@ class AppTestImpModule: +@@ -160,6 +161,7 @@ class AppTestImpModule: import sys code_filename = sys._getframe().f_code.co_filename module_filename = __file__ @@ -309,7 +309,7 @@ constant = 1 def func(): pass -@@ -170,7 +172,7 @@ class AppTestImpModule: +@@ -171,7 +173,7 @@ class AppTestImpModule: file_name = join(dir_name, module_name + '.py') with open(file_name, "wb") as f: f.write(code) @@ -318,7 +318,7 @@ chmod(file_name, 0777) # Setup -@@ -188,7 +190,8 @@ class AppTestImpModule: +@@ -189,7 +191,8 @@ class AppTestImpModule: try: # Ensure proper results assert mod != orig_module @@ -329,7 +329,7 @@ assert mod.func_filename == file_name finally: diff --git a/pypy/module/imp/test/test_import.py b/pypy/module/imp/test/test_import.py -index a7b92a0..e5851ea 100644 +index a8df581..dcd0472 100644 --- a/pypy/module/imp/test/test_import.py +++ b/pypy/module/imp/test/test_import.py @@ -8,7 +8,7 @@ from rpython.rlib import streamio @@ -373,7 +373,7 @@ # create a .pyw file p = setuppkg("windows", x = "x = 78") -@@ -873,6 +880,8 @@ def _testfilesource(source="x=42"): +@@ -887,6 +894,8 @@ def _testfilesource(source="x=42"): class TestPycStuff: # ___________________ .pyc related stuff _________________ @@ -382,7 +382,7 @@ def test_check_compiled_module(self): space = self.space -@@ -1013,7 +1022,8 @@ class TestPycStuff: +@@ -1027,7 +1036,8 @@ class TestPycStuff: ret = space.int_w(w_ret) assert ret == 42 @@ -392,7 +392,7 @@ assert cpathname.check() cpathname.remove() -@@ -1031,7 +1041,8 @@ class TestPycStuff: +@@ -1045,7 +1055,8 @@ class TestPycStuff: write_pyc=False) finally: stream.close() @@ -402,7 +402,7 @@ assert not cpathname.check() def test_load_source_module_dont_write_bytecode(self): -@@ -1051,7 +1062,8 @@ class TestPycStuff: +@@ -1065,7 +1076,8 @@ class TestPycStuff: space.setattr(space.sys, space.wrap('dont_write_bytecode'), space.w_False) stream.close() @@ -412,7 +412,7 @@ assert not cpathname.check() def test_load_source_module_syntaxerror(self): -@@ -1071,7 +1083,8 @@ class TestPycStuff: +@@ -1085,7 +1097,8 @@ class TestPycStuff: pass stream.close() @@ -422,7 +422,7 @@ assert not cpathname.check() def test_load_source_module_importerror(self): -@@ -1092,7 +1105,8 @@ class TestPycStuff: +@@ -1106,7 +1119,8 @@ class TestPycStuff: stream.close() # And the .pyc has been generated @@ -432,7 +432,7 @@ assert cpathname.check() def test_write_compiled_module(self): -@@ -1109,7 +1123,8 @@ class TestPycStuff: +@@ -1123,7 +1137,8 @@ class TestPycStuff: pycode = w_ret assert type(pycode) is pypy.interpreter.pycode.PyCode @@ -442,7 +442,7 @@ mode = 0777 mtime = 12345 importing.write_compiled_module(space, -@@ -1181,6 +1196,271 @@ class TestPycStuff: +@@ -1195,6 +1210,271 @@ class TestPycStuff: finally: stream.close() @@ -714,7 +714,7 @@ def test_PYTHONPATH_takes_precedence(space): if sys.platform == "win32": -@@ -1486,24 +1766,21 @@ class AppTestWriteBytecode(object): +@@ -1500,24 +1780,21 @@ class AppTestWriteBytecode(object): def test_default(self): import os.path from test_bytecode import a @@ -742,7 +742,7 @@ class AppTestWriteBytecodeSandbox(AppTestWriteBytecode): -@@ -1523,25 +1800,21 @@ class _AppTestLonePycFileBase(object): +@@ -1537,25 +1814,21 @@ class _AppTestLonePycFileBase(object): def test_import_possibly_from_pyc(self): from compiled import x diff -Nru pypy-7.1.1+dfsg/debian/patches/pep3147-issue11254 pypy-7.3.1+dfsg/debian/patches/pep3147-issue11254 --- pypy-7.1.1+dfsg/debian/patches/pep3147-issue11254 2019-08-08 23:10:56.000000000 +0000 +++ pypy-7.3.1+dfsg/debian/patches/pep3147-issue11254 2020-04-20 22:35:45.000000000 +0000 @@ -297,7 +297,7 @@ cmd.compile = 1 cmd.optimize = 1 diff --git a/lib-python/2.7/distutils/util.py b/lib-python/2.7/distutils/util.py -index 2b4d784..5792df7 100644 +index 273d234..37cdf7c 100644 --- a/lib-python/2.7/distutils/util.py +++ b/lib-python/2.7/distutils/util.py @@ -6,7 +6,11 @@ one of the other *util.py modules. @@ -313,7 +313,7 @@ from distutils.errors import DistutilsPlatformError from distutils.dep_util import newer from distutils.spawn import spawn -@@ -331,9 +335,9 @@ def byte_compile (py_files, +@@ -334,9 +338,9 @@ def byte_compile (py_files, verbose=1, dry_run=0, direct=None): """Byte-compile a collection of Python source files to either .pyc @@ -326,7 +326,7 @@ 0 - don't optimize (generate .pyc) 1 - normal optimization (like "python -O") 2 - extra optimization (like "python -OO") -@@ -445,7 +449,10 @@ byte_compile(files, optimize=%r, force=%r, +@@ -448,7 +452,10 @@ byte_compile(files, optimize=%r, force=%r, # Terminology from the py_compile module: # cfile - byte-compiled file # dfile - purported source filename (same as 'file' by default) diff -Nru pypy-7.1.1+dfsg/debian/patches/pep3147-stdlib pypy-7.3.1+dfsg/debian/patches/pep3147-stdlib --- pypy-7.1.1+dfsg/debian/patches/pep3147-stdlib 2019-08-08 23:10:56.000000000 +0000 +++ pypy-7.3.1+dfsg/debian/patches/pep3147-stdlib 2020-04-20 22:35:45.000000000 +0000 @@ -749,7 +749,7 @@ LockTests, ] diff --git a/lib-python/2.7/test/test_import.py b/lib-python/2.7/test/test_import.py -index 716f8e0..0618068 100644 +index 767e5f0..f9ff5cc 100644 --- a/lib-python/2.7/test/test_import.py +++ b/lib-python/2.7/test/test_import.py @@ -13,7 +13,8 @@ import shutil @@ -774,7 +774,7 @@ class ImportTests(unittest.TestCase): -@@ -95,9 +101,9 @@ class ImportTests(unittest.TestCase): +@@ -97,9 +103,9 @@ class ImportTests(unittest.TestCase): except ImportError, err: self.fail("import from .pyc/.pyo failed: %s" % err) finally: @@ -782,10 +782,10 @@ unlink(pyc) unlink(pyo) - unload(TESTFN) + # in pypy, remove the .py file now (instead of above) + unlink(source) - sys.path.insert(0, os.curdir) - try: -@@ -115,28 +121,26 @@ class ImportTests(unittest.TestCase): +@@ -119,28 +125,26 @@ class ImportTests(unittest.TestCase): def test_execute_bit_not_copied(self): # Issue 6070: under posix .pyc files got their execute bit set if # the .py file had the execute bit set, but they aren't executable. @@ -831,7 +831,7 @@ @unittest.skipIf(sys.dont_write_bytecode, "test meaningful only when writing bytecode") -@@ -205,12 +209,14 @@ class ImportTests(unittest.TestCase): +@@ -209,12 +213,14 @@ class ImportTests(unittest.TestCase): f.write('"",\n') f.write(']') @@ -847,7 +847,7 @@ # Need to be able to load from current dir. sys.path.append('') -@@ -345,7 +351,7 @@ class ImportTests(unittest.TestCase): +@@ -349,7 +355,7 @@ class ImportTests(unittest.TestCase): sys.path.insert(0, os.curdir) try: source = TESTFN + ".py" @@ -856,7 +856,7 @@ with open(source, 'w') as f: pass try: -@@ -440,6 +446,7 @@ class PycRewritingTests(unittest.TestCase): +@@ -444,6 +450,7 @@ class PycRewritingTests(unittest.TestCase): import sys code_filename = sys._getframe().f_code.co_filename module_filename = __file__ @@ -864,7 +864,7 @@ constant = 1 def func(): pass -@@ -447,7 +454,7 @@ func_filename = func.func_code.co_filename +@@ -451,7 +458,7 @@ func_filename = func.func_code.co_filename """ dir_name = os.path.abspath(TESTFN) file_name = os.path.join(dir_name, module_name) + os.extsep + "py" @@ -873,7 +873,7 @@ def setUp(self): self.sys_path = sys.path[:] -@@ -475,19 +482,22 @@ func_filename = func.func_code.co_filename +@@ -479,19 +486,22 @@ func_filename = func.func_code.co_filename def test_basics(self): mod = self.import_module() self.assertEqual(mod.module_filename, self.file_name) @@ -898,7 +898,7 @@ self.assertEqual(mod.code_filename, self.file_name) self.assertEqual(mod.func_filename, self.file_name) -@@ -496,8 +506,9 @@ func_filename = func.func_code.co_filename +@@ -500,8 +510,9 @@ func_filename = func.func_code.co_filename target = "another_module.py" py_compile.compile(self.file_name, dfile=target) os.remove(self.file_name) diff -Nru pypy-7.1.1+dfsg/debian/patches/python3-sphinx pypy-7.3.1+dfsg/debian/patches/python3-sphinx --- pypy-7.1.1+dfsg/debian/patches/python3-sphinx 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/debian/patches/python3-sphinx 2020-04-20 22:35:45.000000000 +0000 @@ -0,0 +1,100 @@ +From: Stefano Rivera +Date: Mon, 23 Mar 2020 15:13:49 -0700 +Subject: Disable some extensions to support Python 3 Sphinx + +Stop building any autodoc and configuration sections, that require +parsing the Python 2 source code. + +This supports building the Sphinx docs with Python 3. +--- + pypy/doc/conf.py | 10 ++-------- + pypy/doc/config/index.rst | 11 +++++------ + pypy/doc/cpython_differences.rst | 2 +- + pypy/doc/objspace.rst | 12 ++++++++++-- + 4 files changed, 18 insertions(+), 17 deletions(-) + +diff --git a/pypy/doc/conf.py b/pypy/doc/conf.py +index fbd3674..dd38d32 100644 +--- a/pypy/doc/conf.py ++++ b/pypy/doc/conf.py +@@ -13,12 +13,6 @@ + + import sys, os + +-# If extensions (or modules to document with autodoc) are in another directory, +-# add these directories to sys.path here. If the directory is relative to the +-# documentation root, use os.path.abspath to make it absolute, like shown here. +-sys.path.append(os.path.abspath('.')) +-sys.path.append(os.path.abspath('../../')) +- + + # -- Read The Docs theme config ------------------------------------------------ + +@@ -41,9 +35,9 @@ if not on_rtd: # only import and set the theme if we're building docs locally + + # Add any Sphinx extension module names here, as strings. They can be extensions + # coming with Sphinx (named 'sphinx.ext.*') or your custom ones. +-extensions = ['sphinx.ext.autodoc', 'sphinx.ext.doctest', 'sphinx.ext.extlinks', ++extensions = ['sphinx.ext.doctest', 'sphinx.ext.extlinks', + 'sphinx.ext.intersphinx', 'sphinx.ext.todo', 'sphinx.ext.ifconfig', +- 'sphinx.ext.graphviz', 'pypyconfig'] ++ 'sphinx.ext.graphviz',] + + # Add any paths that contain templates here, relative to this directory. + templates_path = ['_templates'] +diff --git a/pypy/doc/config/index.rst b/pypy/doc/config/index.rst +index 6282f80..eb482f1 100644 +--- a/pypy/doc/config/index.rst ++++ b/pypy/doc/config/index.rst +@@ -52,10 +52,9 @@ with which other PyPy features: + .. _`What PyPy can do for your objects`: ../objspace-proxies.html + + +-.. toctree:: +- :maxdepth: 2 ++.. note:: + +- commandline +- translation +- objspace +- opt ++ Parts of this document are not included in the Debian package. ++ See the missing sections `online`_. ++ ++.. _`online`: https://doc.pypy.org/en/latest/config/index.html +diff --git a/pypy/doc/cpython_differences.rst b/pypy/doc/cpython_differences.rst +index 9cdc4d8..4ab5d64 100644 +--- a/pypy/doc/cpython_differences.rst ++++ b/pypy/doc/cpython_differences.rst +@@ -518,7 +518,7 @@ List of extension modules that we support: + _locale + _lsprof + _md5 +- :doc:`_minimal_curses ` ++ `_minimal_curses ` + _multiprocessing + _random + :doc:`_rawffi ` +diff --git a/pypy/doc/objspace.rst b/pypy/doc/objspace.rst +index 399114d..01ff84d 100644 +--- a/pypy/doc/objspace.rst ++++ b/pypy/doc/objspace.rst +@@ -291,8 +291,16 @@ Conversions from Application Level to Interpreter Level + If :py:obj:`w_x` is an application-level integer or long, return an interpreter-level + :py:class:`rbigint`. Otherwise raise :py:exc:`TypeError`. + +-.. automethod:: pypy.interpreter.baseobjspace.ObjSpace.bytes_w(w_x) +-.. automethod:: pypy.interpreter.baseobjspace.ObjSpace.text_w(w_x) ++.. py:function:: bytes_w(w_x) ++ ++ Takes an application level :py:class:`bytes` (on PyPy2 this equals ++ `str`) and returns a rpython byte string. ++ ++.. py:function:: text_w(w_x) ++ ++ PyPy2 takes either a :py:class:`str` and returns a rpython byte ++ string, or it takes an :py:class:`unicode` and uses the systems ++ default encoding to return a rpython byte string. + + .. py:function:: str_w(w_x) + diff -Nru pypy-7.1.1+dfsg/debian/patches/s390x-z10 pypy-7.3.1+dfsg/debian/patches/s390x-z10 --- pypy-7.1.1+dfsg/debian/patches/s390x-z10 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/debian/patches/s390x-z10 2020-04-20 22:35:45.000000000 +0000 @@ -0,0 +1,24 @@ +From: Stefano Rivera +Date: Wed, 15 Jan 2020 09:56:01 +0000 +Subject: That's the oldest version that Debian targets. + +Forwarded: not-needed +--- + rpython/translator/platform/arch/s390x.py | 4 +--- + 1 file changed, 1 insertion(+), 3 deletions(-) + +diff --git a/rpython/translator/platform/arch/s390x.py b/rpython/translator/platform/arch/s390x.py +index a44af09..f80abf9 100644 +--- a/rpython/translator/platform/arch/s390x.py ++++ b/rpython/translator/platform/arch/s390x.py +@@ -103,9 +103,7 @@ def update_cflags(cflags): + if cflag.startswith('-march='): + break + else: +- # the default cpu architecture is zEC12 +- # one can directly specifying -march=... if needed +- revision = 'zEC12' ++ revision = 'z10' + cflags += ('-march='+revision,) + cflags += ('-m64','-mzarch') + return cflags diff -Nru pypy-7.1.1+dfsg/debian/patches/series pypy-7.3.1+dfsg/debian/patches/series --- pypy-7.1.1+dfsg/debian/patches/series 2019-08-08 23:10:56.000000000 +0000 +++ pypy-7.3.1+dfsg/debian/patches/series 2020-04-20 22:35:45.000000000 +0000 @@ -21,4 +21,5 @@ tkinter-import noise skip-hurd-deadlock -version-7.1.1 +s390x-z10 +python3-sphinx diff -Nru pypy-7.1.1+dfsg/debian/patches/version-7.1.1 pypy-7.3.1+dfsg/debian/patches/version-7.1.1 --- pypy-7.1.1+dfsg/debian/patches/version-7.1.1 2019-08-08 23:10:56.000000000 +0000 +++ pypy-7.3.1+dfsg/debian/patches/version-7.1.1 1970-01-01 00:00:00.000000000 +0000 @@ -1,25 +0,0 @@ -From: Stefano Rivera -Date: Sun, 24 Mar 2019 17:31:32 -0400 -Subject: Version is still 7.1.1 - -A post-release bump got caught up in the 7.1.1 release, upstream. ---- - pypy/doc/conf.py | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/pypy/doc/conf.py b/pypy/doc/conf.py -index 4041fd6..66997d2 100644 ---- a/pypy/doc/conf.py -+++ b/pypy/doc/conf.py -@@ -71,9 +71,9 @@ copyright = u'2019, The PyPy Project' - # module/cpyext/include/patchlevel.h - # - # The short X.Y version. --version = '7.2' -+version = '7.1' - # The full version, including alpha/beta/rc tags. --release = '7.2.0' -+release = '7.1.1' - - # The language for content autogenerated by Sphinx. Refer to documentation - # for a list of supported languages. diff -Nru pypy-7.1.1+dfsg/debian/patches/version-info pypy-7.3.1+dfsg/debian/patches/version-info --- pypy-7.1.1+dfsg/debian/patches/version-info 2019-08-08 23:10:56.000000000 +0000 +++ pypy-7.3.1+dfsg/debian/patches/version-info 2020-04-20 22:35:45.000000000 +0000 @@ -15,7 +15,7 @@ 2 files changed, 11 insertions(+) diff --git a/pypy/module/sys/version.py b/pypy/module/sys/version.py -index 354a35b..3f049c2 100644 +index 33ba624..44d895f 100644 --- a/pypy/module/sys/version.py +++ b/pypy/module/sys/version.py @@ -90,6 +90,7 @@ def get_subversion_info(space): diff -Nru pypy-7.1.1+dfsg/debian/pypy.dirs pypy-7.3.1+dfsg/debian/pypy.dirs --- pypy-7.1.1+dfsg/debian/pypy.dirs 2019-08-08 23:10:56.000000000 +0000 +++ pypy-7.3.1+dfsg/debian/pypy.dirs 2020-04-20 22:35:45.000000000 +0000 @@ -1,2 +1,2 @@ -/usr/share/pypy/ns /usr/local/lib/pypy2.7/dist-packages +/usr/share/pypy/ns diff -Nru pypy-7.1.1+dfsg/debian/pypy.install pypy-7.3.1+dfsg/debian/pypy.install --- pypy-7.1.1+dfsg/debian/pypy.install 2019-08-08 23:10:56.000000000 +0000 +++ pypy-7.3.1+dfsg/debian/pypy.install 2020-04-20 22:35:45.000000000 +0000 @@ -1,6 +1,6 @@ debian/scripts/pypyclean /usr/bin debian/scripts/pypycompile /usr/bin include/pypy_*.h /usr/lib/pypy/include -lib_pypy/_*_cffi.*.so /usr/lib/pypy/lib_pypy +lib_pypy/_*.so /usr/lib/pypy/lib_pypy pypy/goal/libpypy-c.so /usr/lib/pypy/bin pypy/goal/pypy-c /usr/lib/pypy/bin diff -Nru pypy-7.1.1+dfsg/debian/rules pypy-7.3.1+dfsg/debian/rules --- pypy-7.1.1+dfsg/debian/rules 2019-08-08 23:10:56.000000000 +0000 +++ pypy-7.3.1+dfsg/debian/rules 2020-04-20 22:35:45.000000000 +0000 @@ -9,14 +9,9 @@ export CFLAGS = $(shell $(BUILDFLAGS_ENV) dpkg-buildflags --get CFLAGS) export LDFLAGS = $(shell $(BUILDFLAGS_ENV) dpkg-buildflags --get LDFLAGS) -export PYPY_USESSION_BASENAME := debian # Our multiarch patch expects DEB_HOST_MULTIARCH include /usr/share/dpkg/architecture.mk -ifneq (,$(filter parallel=%,$(DEB_BUILD_OPTIONS))) - SUB_MAKEFLAGS = -j$(patsubst parallel=%,%,$(filter parallel=%,$(DEB_BUILD_OPTIONS))) -endif - %: dh $@ --with sphinxdoc @@ -33,15 +28,8 @@ override_dh_auto_build-indep: $(MAKE) -C pypy/doc html BUILDDIR=$(CURDIR)/build-docs -pypy/goal/pypy-c: export TMPDIR = $(CURDIR)/build-tmp -pypy/goal/pypy-c: C_SRC_DIR = $(TMPDIR)/usession-$(PYPY_USESSION_BASENAME)-0/testing_1 pypy/goal/pypy-c: - rm -rf $(TMPDIR) - mkdir $(TMPDIR) debian/scripts/translate.sh --python $(PYTHON) - # PyPy captures all make output, so we call it ourselves, to avoid timeouts: - $(MAKE) -C $(C_SRC_DIR) $(SUB_MAKEFLAGS) - cp $(C_SRC_DIR)/pypy-c $(C_SRC_DIR)/libpypy-c.so $(dir $@) ifeq (,$(findstring nocheck,$(DEB_BUILD_OPTIONS))) override_dh_auto_test-arch: export TMPDIR = $(CURDIR)/build-tests-tmp @@ -95,7 +83,7 @@ HG_REPO ?= https://bitbucket.org/pypy/pypy REV=$(shell dpkg-parsechangelog | sed -rne 's,^Version: .*hg([0-9]+).*,\1,p') -VER=$(shell dpkg-parsechangelog | sed -rne 's,^Version: (.+)\+dfsg-.*,\1,p') +VER=$(shell dpkg-parsechangelog | sed -rne 's,^Version: (.+)\+dfsg-.*,\1,p' | sed -e 's/~//') get-packaged-orig-source: @echo "You can build this from a local repo by supplying the HG_REPO variable" rm -rf pypy-$(VER).orig diff -Nru pypy-7.1.1+dfsg/debian/scripts/build-cffi-modules.py pypy-7.3.1+dfsg/debian/scripts/build-cffi-modules.py --- pypy-7.1.1+dfsg/debian/scripts/build-cffi-modules.py 2019-08-08 23:10:56.000000000 +0000 +++ pypy-7.3.1+dfsg/debian/scripts/build-cffi-modules.py 2020-04-20 22:35:45.000000000 +0000 @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/python2 import os import sys @@ -6,7 +6,7 @@ import py.path -from pypy.tool.build_cffi_imports import create_cffi_import_libraries +from lib_pypy.tools.build_cffi_imports import create_cffi_import_libraries class FakeOptions(object): @@ -21,5 +21,4 @@ os.environ['LD_LIBRARY_PATH'] = 'pypy/goal' pypy_c = py.path.local('pypy/goal/pypy-c') options = FakeOptions() -basedir = py.path.local('.') -create_cffi_import_libraries(pypy_c, options, basedir) +create_cffi_import_libraries(pypy_c, options, '.') diff -Nru pypy-7.1.1+dfsg/debian/scripts/gen-backend-versions.py pypy-7.3.1+dfsg/debian/scripts/gen-backend-versions.py --- pypy-7.1.1+dfsg/debian/scripts/gen-backend-versions.py 2019-08-08 23:10:56.000000000 +0000 +++ pypy-7.3.1+dfsg/debian/scripts/gen-backend-versions.py 2020-04-20 22:35:45.000000000 +0000 @@ -1,4 +1,4 @@ -#!/usr/bin/python +#!/usr/bin/python2 import codecs import os diff -Nru pypy-7.1.1+dfsg/debian/scripts/timeout-inactive.py pypy-7.3.1+dfsg/debian/scripts/timeout-inactive.py --- pypy-7.1.1+dfsg/debian/scripts/timeout-inactive.py 2019-08-08 23:10:56.000000000 +0000 +++ pypy-7.3.1+dfsg/debian/scripts/timeout-inactive.py 2020-04-20 22:35:45.000000000 +0000 @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/python2 import argparse import re diff -Nru pypy-7.1.1+dfsg/debian/scripts/translate.sh pypy-7.3.1+dfsg/debian/scripts/translate.sh --- pypy-7.1.1+dfsg/debian/scripts/translate.sh 2019-08-08 23:10:56.000000000 +0000 +++ pypy-7.3.1+dfsg/debian/scripts/translate.sh 2020-04-20 22:35:45.000000000 +0000 @@ -13,7 +13,7 @@ EOF } -PYTHON=python +PYTHON=python2 while [ $# -ge 1 ]; do case "$1" in @@ -53,6 +53,8 @@ if ! dpkg-architecture -elinux-armel; then OPT=jit fi +elif dpkg-architecture -iany-arm64; then + OPT=jit elif dpkg-architecture -iany-ppc64el || dpkg-architecture -iany-ppc64; then OPT=jit elif dpkg-architecture -iany-s390x; then @@ -68,6 +70,7 @@ if dpkg-architecture -iany-i386 \ || dpkg-architecture -iany-amd64 \ || dpkg-architecture -iany-arm \ + || dpkg-architecture -iany-arm64 \ || dpkg-architecture -iany-mips64el \ || dpkg-architecture -iany-ppc64 \ || dpkg-architecture -iany-ppc64el \ @@ -95,8 +98,24 @@ fi fi -RPYTHON="$(pwd)/rpython/bin/rpython" +CURDIR=$(pwd) +RPYTHON=$CURDIR/rpython/bin/rpython +TMPDIR=$CURDIR/build-tmp +PYPY_USESSION_BASENAME=debian +C_SRC_DIR=$TMPDIR/usession-$PYPY_USESSION_BASENAME-0/testing_1 +SUB_MAKEFLAGS=$(echo ${DEB_BUILD_OPTIONS:-} | tr ' ' '\n' | sed -ne 's/parallel=/-j/p') set -x +export TMPDIR PYPY_USESSION_BASENAME +rm -rf "$TMPDIR" +mkdir "$TMPDIR" + cd pypy/goal -exec $PYTHON -u $RPYTHON $RPYOPTS targetpypystandalone $TARGETOPTS 2>&1 +$PYTHON -u $RPYTHON $RPYOPTS targetpypystandalone $TARGETOPTS 2>&1 +cd "$CURDIR" + +# PyPy captures all make output, so we call it ourselves (--source), to save +# memory and avoid timeouts: +make -C $C_SRC_DIR $SUB_MAKEFLAGS + +cp $C_SRC_DIR/pypy-c $C_SRC_DIR/libpypy-c.so pypy/goal diff -Nru pypy-7.1.1+dfsg/debian/tests/byte-compilation pypy-7.3.1+dfsg/debian/tests/byte-compilation --- pypy-7.1.1+dfsg/debian/tests/byte-compilation 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/debian/tests/byte-compilation 2020-04-20 22:35:45.000000000 +0000 @@ -0,0 +1,45 @@ +#!/bin/sh + +base="$AUTOPKGTEST_TMP/module" +tag=$(pypy -c 'import imp; print(imp.get_tag())') + +setUp() { + mkdir -p $base/a + touch $base/a/__init__.py + touch $base/a/a_impl.py + touch $base/b.py +} + +tearDown() { + rm -rf "$base" +} + +testDirectory() { + pypycompile "$base" + assertTrue $? + assertTrue 'base __pycache__ exists' "[ -d $base/__pycache__ ]" + assertTrue 'a __pycache__ exists' "[ -d $base/a/__pycache__ ]" + assertTrue 'b compiled' "[ -f $base/__pycache__/b.$tag.pyc ]" + assertTrue 'a compiled' "[ -f $base/a/__pycache__/__init__.$tag.pyc ]" + assertTrue 'a.a_impl compiled' "[ -f $base/a/__pycache__/a_impl.$tag.pyc ]" + + pypyclean "$base" + assertTrue $? + assertTrue 'base __pycache__ cleaned' "[ ! -d $base/__pycache__ ]" + assertTrue 'a __pycache__ cleaned' "[ ! -d $base/a/__pycache__ ]" + assertTrue 'b cleaned' "[ ! -f $base/__pycache__/b.$tag.pyc ]" + assertTrue 'a cleaned' "[ ! -f $base/a/__pycache__/__init__.$tag.pyc ]" + assertTrue 'a.a_impl cleaned' "[ ! -f $base/a/__pycache__/a_impl.$tag.pyc ]" +} + +testDirectoryExclude() { + pypycompile "$base" -X '.*_impl' + assertTrue $? + assertTrue 'base __pycache__ exists' "[ -d $base/__pycache__ ]" + assertTrue 'a __pycache__ exists' "[ -d $base/a/__pycache__ ]" + assertTrue 'b compiled' "[ -f $base/__pycache__/b.$tag.pyc ]" + assertTrue 'a compiled' "[ -f $base/a/__pycache__/__init__.$tag.pyc ]" + assertTrue 'a.a_impl NOT compiled' "[ ! -f $base/a/__pycache__/a_impl.$tag.pyc ]" +} + +. shunit2 diff -Nru pypy-7.1.1+dfsg/debian/tests/command-line pypy-7.3.1+dfsg/debian/tests/command-line --- pypy-7.1.1+dfsg/debian/tests/command-line 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/debian/tests/command-line 2020-04-20 22:35:45.000000000 +0000 @@ -0,0 +1,56 @@ +#!/bin/sh + +# Superficial execution tests + +testPrintFromStdin() { + stdout=$(echo 'print("Hello")' | pypy) + assertEquals 'Execute code from stdin' Hello "$stdout" +} + +testPrintFromMinusC() { + stdout=$(pypy -c 'print("Hello")') + assertEquals 'Execute code from -c' Hello "$stdout" +} + +# Stdlib + +testImportStdLib() { + pypy -c 'import os.path' + assertTrue 'Import os.path' $? +} + +testImportTk() { + # Tkinter's cffi library lives in a separate binary package, to keep + # Depends manageable. Check that we point users to it. + if dpkg-query -f '${db:Status-Abbrev}\n' -W pypy-tk | grep -q ^.i; then + # autopkgtest can't Conflict, so we just skip if it's present + startSkipping + fi + stderr=$(pypy -c 'import Tkinter' 2>&1) + assertFalse 'Fail to import Tk when not installed' $? + echo "$stderr" | grep -Fq 'please install the pypy-tk package' + assertTrue 'Suggest installing pypy-tk' $? +} + +testImportCFFI() { + # Are all the modules that use cffi importable? + # They're built separately, and often link to shared libs + pypy -c 'import audioop' + assertTrue 'Import audioop' $? + pypy -c 'import curses' + assertTrue 'Import curses' $? + pypy -c 'import gdbm' + assertTrue 'Import gdbm' $? + pypy -c 'import pwd, grp' + assertTrue 'Import pwd, grp' $? + pypy -c 'import ssl' + assertTrue 'Import ssl' $? + pypy -c 'import resource' + assertTrue 'Import resource' $? + pypy -c 'import sqlite3' + assertTrue 'Import sqlite3' $? + pypy -c 'import syslog' + assertTrue 'Import syslog' $? +} + +. shunit2 diff -Nru pypy-7.1.1+dfsg/debian/tests/control pypy-7.3.1+dfsg/debian/tests/control --- pypy-7.1.1+dfsg/debian/tests/control 2019-08-08 23:10:56.000000000 +0000 +++ pypy-7.3.1+dfsg/debian/tests/control 2020-04-20 22:35:45.000000000 +0000 @@ -1,15 +1,20 @@ -Test-Command: echo 'print "Hello"' | pypy | grep Hello -Depends: pypy -Restrictions: superficial +Tests: byte-compilation +Depends: pypy, shunit2 -Test-Command: pypy -c 'print "Hello"' | grep Hello -Depends: pypy +Tests: command-line +Depends: pypy, shunit2 Restrictions: superficial -Test-Command: pypy -c 'import os.path' -Depends: pypy +Tests: pypy-tk +Depends: pypy-tk, shunit2 Restrictions: superficial -Test-Command: pypy -c 'import Tkinter' -Depends: pypy-tk -Restrictions: superficial +Tests: module-install-local +Depends: build-essential, pypy-dev, pypy-setuptools, shunit2 +Restrictions: needs-root + +Tests: module-install-user +Depends: build-essential, pypy-dev, pypy-setuptools, shunit2 + +Tests: module-install-virtualenv +Depends: build-essential, pypy-dev, shunit2, virtualenv diff -Nru pypy-7.1.1+dfsg/debian/tests/module-install-local pypy-7.3.1+dfsg/debian/tests/module-install-local --- pypy-7.1.1+dfsg/debian/tests/module-install-local 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/debian/tests/module-install-local 2020-04-20 22:35:45.000000000 +0000 @@ -0,0 +1,43 @@ +#!/bin/sh + +cp -a debian/tests/packages "$AUTOPKGTEST_TMP" + +setUp() { + mount -t tmpfs tmpfs /usr/local/lib/pypy2.7/dist-packages +} + +tearDown() { + umount /usr/local/lib/pypy2.7/dist-packages +} + +testFibPy() { + cd "$AUTOPKGTEST_TMP/packages/fibpy" + pypy setup.py install + assertTrue 'Install fibpy in /usr/local' $? + cd "$AUTOPKGTEST_TMP" + stdout=$(pypy -m fibpy 5) + assertTrue 'Execute fibpy from a virtualenv' $? + assertEquals 'Correct result' 8 "$stdout" +} + +testFibC() { + cd "$AUTOPKGTEST_TMP/packages/fibc" + pypy setup.py install + assertTrue 'Install fibc in /usr/local' $? + cd "$AUTOPKGTEST_TMP" + stdout=$(pypy -c 'from fibc import fib; print(fib(5))') + assertTrue 'Execute fibc from a virtualenv' $? + assertEquals 'Correct result' 8 "$stdout" +} + +testFibCFFI() { + cd "$AUTOPKGTEST_TMP/packages/fibcffi" + pypy setup.py install + assertTrue 'Install fibcffi in /usr/local' $? + cd "$AUTOPKGTEST_TMP" + stdout=$(pypy -m fibcffi 5) + assertTrue 'Execute fibcffi from a virtualenv' $? + assertEquals 'Correct result' 8 "$stdout" +} + +. shunit2 diff -Nru pypy-7.1.1+dfsg/debian/tests/module-install-user pypy-7.3.1+dfsg/debian/tests/module-install-user --- pypy-7.1.1+dfsg/debian/tests/module-install-user 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/debian/tests/module-install-user 2020-04-20 22:35:45.000000000 +0000 @@ -0,0 +1,43 @@ +#!/bin/sh + +cp -a debian/tests/packages "$AUTOPKGTEST_TMP" + +HOME="$AUTOPKGTEST_TMP/home" +mkdir "$HOME" + +tearDown() { + # Remove the --user install directory + rm -rf "$HOME/.local/lib/pypy2.7/site-packages" +} + +testFibPy() { + cd "$AUTOPKGTEST_TMP/packages/fibpy" + pypy setup.py install --user + assertTrue 'Install fibpy in --user' $? + cd "$AUTOPKGTEST_TMP" + stdout=$(pypy -m fibpy 5) + assertTrue 'Execute fibpy from a virtualenv' $? + assertEquals 'Correct result' 8 "$stdout" +} + +testFibC() { + cd "$AUTOPKGTEST_TMP/packages/fibc" + pypy setup.py install --user + assertTrue 'Install fibc in --user' $? + cd "$AUTOPKGTEST_TMP" + stdout=$(pypy -c 'from fibc import fib; print(fib(5))') + assertTrue 'Execute fibc from a virtualenv' $? + assertEquals 'Correct result' 8 "$stdout" +} + +testFibCFFI() { + cd "$AUTOPKGTEST_TMP/packages/fibcffi" + pypy setup.py install --user + assertTrue 'Install fibcffi in --user' $? + cd "$AUTOPKGTEST_TMP" + stdout=$(pypy -m fibcffi 5) + assertTrue 'Execute fibcffi from a virtualenv' $? + assertEquals 'Correct result' 8 "$stdout" +} + +. shunit2 diff -Nru pypy-7.1.1+dfsg/debian/tests/module-install-virtualenv pypy-7.3.1+dfsg/debian/tests/module-install-virtualenv --- pypy-7.1.1+dfsg/debian/tests/module-install-virtualenv 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/debian/tests/module-install-virtualenv 2020-04-20 22:35:45.000000000 +0000 @@ -0,0 +1,40 @@ +#!/bin/sh + +cp -a debian/tests/packages "$AUTOPKGTEST_TMP" +HOME="$AUTOPKGTEST_TMP/home" +mkdir -p "$HOME" +virtualenv -p pypy "$AUTOPKGTEST_TMP/pypyve" + +VP="$AUTOPKGTEST_TMP/pypyve/bin/python" + +testFibPy() { + cd "$AUTOPKGTEST_TMP/packages/fibpy" + $VP setup.py install + assertTrue 'Install fibpy in a virtualenv' $? + cd "$AUTOPKGTEST_TMP" + stdout=$($VP -m fibpy 5) + assertTrue 'Execute fibpy from a virtualenv' $? + assertEquals 'Correct result' 8 "$stdout" +} + +testFibC() { + cd "$AUTOPKGTEST_TMP/packages/fibc" + $VP setup.py install + assertTrue 'Install fibc in a virtualenv' $? + cd "$AUTOPKGTEST_TMP" + stdout=$($VP -c 'from fibc import fib; print(fib(5))') + assertTrue 'Execute fibc from a virtualenv' $? + assertEquals 'Correct result' 8 "$stdout" +} + +testFibCFFI() { + cd "$AUTOPKGTEST_TMP/packages/fibcffi" + $VP setup.py install + assertTrue 'Install fibcffi in a virtualenv' $? + cd "$AUTOPKGTEST_TMP" + stdout=$($VP -m fibcffi 5) + assertTrue 'Execute fibcffi from a virtualenv' $? + assertEquals 'Correct result' 8 "$stdout" +} + +. shunit2 diff -Nru pypy-7.1.1+dfsg/debian/tests/packages/fibc/fibc.c pypy-7.3.1+dfsg/debian/tests/packages/fibc/fibc.c --- pypy-7.1.1+dfsg/debian/tests/packages/fibc/fibc.c 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/debian/tests/packages/fibc/fibc.c 2020-04-20 22:35:45.000000000 +0000 @@ -0,0 +1,30 @@ +#include + +int fib(int n) { + if (n < 0) { + return -1; // Raise + } + if (n < 2) { + return 1; + } + return fib(n - 1) + fib(n - 2); +} + +static PyObject * fibc_fib(PyObject *self, PyObject *args) { + int sts; + int n; + + if (!PyArg_ParseTuple(args, "i", &n)) + return NULL; + int r = fib(n); + return Py_BuildValue("i", r); +} + +static PyMethodDef FibcMethods[] = { + {"fib", fibc_fib, METH_VARARGS, "Calculate a fibonacci sequence value."}, + {NULL, NULL, 0, NULL}, +}; + +PyMODINIT_FUNC initfibc(void) { + (void) Py_InitModule("fibc", FibcMethods); +}; diff -Nru pypy-7.1.1+dfsg/debian/tests/packages/fibc/setup.py pypy-7.3.1+dfsg/debian/tests/packages/fibc/setup.py --- pypy-7.1.1+dfsg/debian/tests/packages/fibc/setup.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/debian/tests/packages/fibc/setup.py 2020-04-20 22:35:45.000000000 +0000 @@ -0,0 +1,14 @@ +#!/usr/bin/env python + +from setuptools import setup, Extension + +setup( + name='fibc', + version='42.0.0', + description='C Fibonacci', + ext_modules=[Extension( + 'fibc', + sources=['fibc.c'], + )], + zip_safe=True, +) diff -Nru pypy-7.1.1+dfsg/debian/tests/packages/fibcffi/fibcffi_build.py pypy-7.3.1+dfsg/debian/tests/packages/fibcffi/fibcffi_build.py --- pypy-7.1.1+dfsg/debian/tests/packages/fibcffi/fibcffi_build.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/debian/tests/packages/fibcffi/fibcffi_build.py 2020-04-20 22:35:45.000000000 +0000 @@ -0,0 +1,25 @@ +#!/usr/bin/env python +from cffi import FFI + + +ffibuilder = FFI() +ffibuilder.set_source('_fib', + """ + int fib(int n) { + if (n < 0) { + return -1; // Raise + } + if (n < 2) { + return 1; + } + return fib(n - 1) + fib(n - 2); + } + """, + libraries=[]) +ffibuilder.cdef(""" + int fib(int n); +""") + + +if __name__ == '__main__': + ffibuilder.compile(verbose=True) diff -Nru pypy-7.1.1+dfsg/debian/tests/packages/fibcffi/fibcffi.py pypy-7.3.1+dfsg/debian/tests/packages/fibcffi/fibcffi.py --- pypy-7.1.1+dfsg/debian/tests/packages/fibcffi/fibcffi.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/debian/tests/packages/fibcffi/fibcffi.py 2020-04-20 22:35:45.000000000 +0000 @@ -0,0 +1,7 @@ +import sys + +from _fib import lib + + +if __name__ == '__main__': + print(lib.fib(int(sys.argv[1]))) diff -Nru pypy-7.1.1+dfsg/debian/tests/packages/fibcffi/setup.py pypy-7.3.1+dfsg/debian/tests/packages/fibcffi/setup.py --- pypy-7.1.1+dfsg/debian/tests/packages/fibcffi/setup.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/debian/tests/packages/fibcffi/setup.py 2020-04-20 22:35:45.000000000 +0000 @@ -0,0 +1,12 @@ +#!/usr/bin/env python + +from setuptools import setup + +setup( + name='fibcffi', + version='42.0.0', + description='CFFI Fibonacci', + py_modules=['fibcffi'], + cffi_modules=['fibcffi_build.py:ffibuilder'], + zip_safe=True, +) diff -Nru pypy-7.1.1+dfsg/debian/tests/packages/fibpy/fibpy.py pypy-7.3.1+dfsg/debian/tests/packages/fibpy/fibpy.py --- pypy-7.1.1+dfsg/debian/tests/packages/fibpy/fibpy.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/debian/tests/packages/fibpy/fibpy.py 2020-04-20 22:35:45.000000000 +0000 @@ -0,0 +1,13 @@ +import sys + + +def fib(n): + if n < 0: + raise ValueError() + if n < 2: + return 1 + return fib(n - 1) + fib(n - 2) + + +if __name__ == '__main__': + print(fib(int(sys.argv[1]))) diff -Nru pypy-7.1.1+dfsg/debian/tests/packages/fibpy/setup.py pypy-7.3.1+dfsg/debian/tests/packages/fibpy/setup.py --- pypy-7.1.1+dfsg/debian/tests/packages/fibpy/setup.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/debian/tests/packages/fibpy/setup.py 2020-04-20 22:35:45.000000000 +0000 @@ -0,0 +1,11 @@ +#!/usr/bin/env python + +from setuptools import setup + +setup( + name='fibpy', + version='42.0.0', + description='Pure Python Fibonacci', + py_modules=['fibpy'], + zip_safe=True, +) diff -Nru pypy-7.1.1+dfsg/debian/tests/pypy-tk pypy-7.3.1+dfsg/debian/tests/pypy-tk --- pypy-7.1.1+dfsg/debian/tests/pypy-tk 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/debian/tests/pypy-tk 2020-04-20 22:35:45.000000000 +0000 @@ -0,0 +1,8 @@ +#!/bin/sh + +testImportTk() { + pypy -c 'import Tkinter' + assertTrue 'Tkinter is importable' $? +} + +. shunit2 diff -Nru pypy-7.1.1+dfsg/extra_tests/cffi_tests/cffi0/backend_tests.py pypy-7.3.1+dfsg/extra_tests/cffi_tests/cffi0/backend_tests.py --- pypy-7.1.1+dfsg/extra_tests/cffi_tests/cffi0/backend_tests.py 2019-08-08 19:42:53.000000000 +0000 +++ pypy-7.3.1+dfsg/extra_tests/cffi_tests/cffi0/backend_tests.py 2020-04-10 19:28:40.000000000 +0000 @@ -1242,7 +1242,7 @@ py.test.skip(str(e)) f.write(ffi.buffer(a, 1000 * ffi.sizeof("int"))) f.seek(0) - assert f.read() == array.array('i', range(1000)).tostring() + assert f.read() == arraytostring(array.array('i', range(1000))) f.seek(0) b = ffi.new("int[]", 1005) f.readinto(ffi.buffer(b, 1000 * ffi.sizeof("int"))) @@ -1261,7 +1261,7 @@ py.test.skip(str(e)) f.write(ffi.buffer(a, 1000 * ffi.sizeof("int"))) f.seek(0) - assert f.read() == array.array('i', range(1000)).tostring() + assert f.read() == arraytostring(array.array('i', range(1000))) f.seek(0) b = ffi.new("int[]", 1005) f.readinto(ffi.buffer(b, 1000 * ffi.sizeof("int"))) diff -Nru pypy-7.1.1+dfsg/extra_tests/cffi_tests/cffi0/test_function.py pypy-7.3.1+dfsg/extra_tests/cffi_tests/cffi0/test_function.py --- pypy-7.1.1+dfsg/extra_tests/cffi_tests/cffi0/test_function.py 2019-08-08 19:42:53.000000000 +0000 +++ pypy-7.3.1+dfsg/extra_tests/cffi_tests/cffi0/test_function.py 2020-04-10 19:28:40.000000000 +0000 @@ -114,7 +114,7 @@ ffi = FFI(backend=self.Backend()) ffi.cdef(""" int fputs(const char *, void *); - void *stderr; + extern void *stderr; """) needs_dlopen_none() ffi.C = ffi.dlopen(None) @@ -131,7 +131,7 @@ ffi = FFI(backend=self.Backend()) ffi.cdef(""" int fputs(char *, void *); - void *stderr; + extern void *stderr; """) needs_dlopen_none() ffi.C = ffi.dlopen(None) @@ -148,7 +148,7 @@ ffi = FFI(backend=self.Backend()) ffi.cdef(""" int fprintf(void *, const char *format, ...); - void *stderr; + extern void *stderr; """) needs_dlopen_none() ffi.C = ffi.dlopen(None) @@ -210,7 +210,7 @@ py.test.skip("probably no symbol 'stderr' in the lib") ffi.cdef(""" int fputs(const char *, void *); - void *stderr; + extern void *stderr; """) needs_dlopen_none() ffi.C = ffi.dlopen(None) @@ -257,7 +257,7 @@ py.test.skip("probably no symbol 'stdout' in the lib") ffi = FFI(backend=self.Backend()) ffi.cdef(""" - void *stdout; + extern void *stdout; """) needs_dlopen_none() C = ffi.dlopen(None) @@ -497,7 +497,7 @@ ffi.cdef(""" typedef enum { MYE1, MYE2 } myenum_t; double myfunc(double); - double myvar; + extern double myvar; const double myconst; #define MYFOO 42 """) @@ -508,7 +508,7 @@ if self.Backend is CTypesBackend: py.test.skip("not with the ctypes backend") ffi = FFI(backend=self.Backend()) - ffi.cdef("int foobar(void); int foobaz;") + ffi.cdef("int foobar(void); extern int foobaz;") lib = ffi.dlopen(lib_m) ffi.dlclose(lib) e = py.test.raises(ValueError, getattr, lib, 'foobar') @@ -521,3 +521,16 @@ assert str(e.value).startswith("library '") assert str(e.value).endswith("' has already been closed") ffi.dlclose(lib) # does not raise + + def test_passing_large_list(self): + if self.Backend is CTypesBackend: + py.test.skip("the ctypes backend doesn't support this") + ffi = FFI(backend=self.Backend()) + ffi.cdef(""" + void getenv(char *); + """) + needs_dlopen_none() + m = ffi.dlopen(None) + arg = [b"F", b"O", b"O"] + [b"\x00"] * 20000000 + x = m.getenv(arg) + assert x is None diff -Nru pypy-7.1.1+dfsg/extra_tests/cffi_tests/cffi0/test_ownlib.py pypy-7.3.1+dfsg/extra_tests/cffi_tests/cffi0/test_ownlib.py --- pypy-7.1.1+dfsg/extra_tests/cffi_tests/cffi0/test_ownlib.py 2019-08-08 19:42:53.000000000 +0000 +++ pypy-7.3.1+dfsg/extra_tests/cffi_tests/cffi0/test_ownlib.py 2020-04-10 19:28:40.000000000 +0000 @@ -202,7 +202,7 @@ py.test.skip("fix the auto-generation of the tiny test lib") ffi = FFI(backend=self.Backend()) ffi.cdef(""" - int my_array[7]; + extern int my_array[7]; """) ownlib = ffi.dlopen(self.module) for i in range(7): @@ -224,7 +224,7 @@ py.test.skip("not supported by the ctypes backend") ffi = FFI(backend=self.Backend()) ffi.cdef(""" - int my_array[]; + extern int my_array[]; """) ownlib = ffi.dlopen(self.module) for i in range(7): @@ -292,7 +292,7 @@ long bottom; } RECT; - long left, top, right, bottom; + extern long left, top, right, bottom; RECT ReturnRect(int i, RECT ar, RECT* br, POINT cp, RECT dr, RECT *er, POINT fp, RECT gr); @@ -322,7 +322,7 @@ if self.Backend is CTypesBackend: py.test.skip("not implemented with the ctypes backend") ffi = FFI(backend=self.Backend()) - ffi.cdef("long left; int test_getting_errno(void);") + ffi.cdef("extern long left; int test_getting_errno(void);") lib = ffi.dlopen(self.module) lib.left = 123456 p = ffi.addressof(lib, "left") @@ -372,3 +372,29 @@ assert s.top == 22 assert s.right == 33 assert s.bottom == 44 + + def test_dlopen_handle(self): + if self.module is None: + py.test.skip("fix the auto-generation of the tiny test lib") + if sys.platform == 'win32': + py.test.skip("uses 'dl' explicitly") + if self.__class__.Backend is CTypesBackend: + py.test.skip("not for the ctypes backend") + backend = self.Backend() + ffi1 = FFI(backend=backend) + ffi1.cdef("""void *dlopen(const char *filename, int flags); + int dlclose(void *handle);""") + lib1 = ffi1.dlopen('dl') + handle = lib1.dlopen(self.module.encode(sys.getfilesystemencoding()), + backend.RTLD_LAZY) + assert ffi1.typeof(handle) == ffi1.typeof("void *") + assert handle + + ffi = FFI(backend=backend) + ffi.cdef("""unsigned short foo_2bytes(unsigned short a);""") + lib = ffi.dlopen(handle) + x = lib.foo_2bytes(1000) + assert x == 1042 + + err = lib1.dlclose(handle) + assert err == 0 diff -Nru pypy-7.1.1+dfsg/extra_tests/cffi_tests/cffi0/test_parsing.py pypy-7.3.1+dfsg/extra_tests/cffi_tests/cffi0/test_parsing.py --- pypy-7.1.1+dfsg/extra_tests/cffi_tests/cffi0/test_parsing.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/extra_tests/cffi_tests/cffi0/test_parsing.py 2020-04-10 19:28:40.000000000 +0000 @@ -325,6 +325,7 @@ assert value == sys.maxsize * 2 - 40 def test__is_constant_globalvar(): + import warnings for input, expected_output in [ ("int a;", False), ("const int a;", True), @@ -342,10 +343,13 @@ ("const int a[5][6];", False), ]: ffi = FFI() - ffi.cdef(input) + with warnings.catch_warnings(record=True) as log: + warnings.simplefilter("always") + ffi.cdef(input) declarations = ffi._parser._declarations assert ('constant a' in declarations) == expected_output assert ('variable a' in declarations) == (not expected_output) + assert len(log) == (1 - expected_output) def test_restrict(): from cffi import model @@ -355,7 +359,7 @@ ("int *a;", False), ]: ffi = FFI() - ffi.cdef(input) + ffi.cdef("extern " + input) tp, quals = ffi._parser._declarations['variable a'] assert bool(quals & model.Q_RESTRICT) == expected_output @@ -410,7 +414,17 @@ def test_enum(): ffi = FFI() ffi.cdef(""" - enum Enum { POS = +1, TWO = 2, NIL = 0, NEG = -1, OP = (POS+TWO)-1}; + enum Enum { + POS = +1, + TWO = 2, + NIL = 0, + NEG = -1, + ADDSUB = (POS+TWO)-1, + DIVMULINT = (3 * 3) / 2, + SHIFT = (1 << 3) >> 1, + BINOPS = (0x7 & 0x1) | 0x8, + XOR = 0xf ^ 0xa + }; """) needs_dlopen_none() C = ffi.dlopen(None) @@ -418,7 +432,11 @@ assert C.TWO == 2 assert C.NIL == 0 assert C.NEG == -1 - assert C.OP == 2 + assert C.ADDSUB == 2 + assert C.DIVMULINT == 4 + assert C.SHIFT == 4 + assert C.BINOPS == 0b1001 + assert C.XOR == 0b0101 def test_stdcall(): ffi = FFI() diff -Nru pypy-7.1.1+dfsg/extra_tests/cffi_tests/cffi0/test_verify.py pypy-7.3.1+dfsg/extra_tests/cffi_tests/cffi0/test_verify.py --- pypy-7.1.1+dfsg/extra_tests/cffi_tests/cffi0/test_verify.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/extra_tests/cffi_tests/cffi0/test_verify.py 2020-04-10 19:28:40.000000000 +0000 @@ -4,6 +4,7 @@ import sys, os, math, weakref from cffi import FFI, VerificationError, VerificationMissing, model, FFIError from extra_tests.cffi_tests.support import * +from extra_tests.cffi_tests.support import extra_compile_args lib_m = ['m'] @@ -14,17 +15,6 @@ lib_m = ['msvcrt'] pass # no obvious -Werror equivalent on MSVC else: - if (sys.platform == 'darwin' and - [int(x) for x in os.uname()[2].split('.')] >= [11, 0, 0]): - # assume a standard clang or gcc - extra_compile_args = ['-Werror', '-Wall', '-Wextra', '-Wconversion'] - # special things for clang - extra_compile_args.append('-Qunused-arguments') - else: - # assume a standard gcc - extra_compile_args = ['-Werror', '-Wall', '-Wextra', '-Wconversion', - '-Wno-unused-parameter'] - class FFI(FFI): def verify(self, *args, **kwds): return super(FFI, self).verify( @@ -287,7 +277,7 @@ def test_var_signed_integer_types(): ffi = FFI() lst = all_signed_integer_types(ffi) - csource = "\n".join(["%s somevar_%s;" % (tp, tp.replace(' ', '_')) + csource = "\n".join(["static %s somevar_%s;" % (tp, tp.replace(' ', '_')) for tp in lst]) ffi.cdef(csource) lib = ffi.verify(csource) @@ -306,7 +296,7 @@ def test_var_unsigned_integer_types(): ffi = FFI() lst = all_unsigned_integer_types(ffi) - csource = "\n".join(["%s somevar_%s;" % (tp, tp.replace(' ', '_')) + csource = "\n".join(["static %s somevar_%s;" % (tp, tp.replace(' ', '_')) for tp in lst]) ffi.cdef(csource) lib = ffi.verify(csource) @@ -818,8 +808,8 @@ def test_access_variable(): ffi = FFI() - ffi.cdef("int foo(void);\n" - "int somenumber;") + ffi.cdef("static int foo(void);\n" + "static int somenumber;") lib = ffi.verify(""" static int somenumber = 2; static int foo(void) { @@ -836,7 +826,7 @@ def test_access_address_of_variable(): # access the address of 'somenumber': need a trick ffi = FFI() - ffi.cdef("int somenumber; static int *const somenumberptr;") + ffi.cdef("static int somenumber; static int *const somenumberptr;") lib = ffi.verify(""" static int somenumber = 2; #define somenumberptr (&somenumber) @@ -849,7 +839,7 @@ def test_access_array_variable(length=5): ffi = FFI() ffi.cdef("int foo(int);\n" - "int somenumber[%s];" % (length,)) + "static int somenumber[%s];" % (length,)) lib = ffi.verify(""" static int somenumber[] = {2, 2, 3, 4, 5}; static int foo(int i) { @@ -881,7 +871,7 @@ ffi = FFI() ffi.cdef("struct foo { int x; ...; };\n" "int foo(int);\n" - "struct foo stuff;") + "static struct foo stuff;") lib = ffi.verify(""" struct foo { int x, y, z; }; static struct foo stuff = {2, 5, 8}; @@ -905,9 +895,9 @@ def test_access_callback(): ffi = FFI() - ffi.cdef("int (*cb)(int);\n" - "int foo(int);\n" - "void reset_cb(void);") + ffi.cdef("static int (*cb)(int);\n" + "static int foo(int);\n" + "static void reset_cb(void);") lib = ffi.verify(""" static int g(int x) { return x * 7; } static int (*cb)(int); @@ -923,9 +913,9 @@ def test_access_callback_function_typedef(): ffi = FFI() ffi.cdef("typedef int mycallback_t(int);\n" - "mycallback_t *cb;\n" - "int foo(int);\n" - "void reset_cb(void);") + "static mycallback_t *cb;\n" + "static int foo(int);\n" + "static void reset_cb(void);") lib = ffi.verify(""" static int g(int x) { return x * 7; } static int (*cb)(int); @@ -1075,7 +1065,7 @@ def test_autofilled_struct_as_argument_dynamic(): ffi = FFI() ffi.cdef("struct foo_s { long a; ...; };\n" - "int (*foo)(struct foo_s);") + "static int (*foo)(struct foo_s);") lib = ffi.verify(""" struct foo_s { double b; @@ -1084,7 +1074,7 @@ int foo1(struct foo_s s) { return (int)s.a - (int)s.b; } - int (*foo)(struct foo_s s) = &foo1; + static int (*foo)(struct foo_s s) = &foo1; """) e = py.test.raises(NotImplementedError, lib.foo, "?") msg = ("ctype 'struct foo_s' not supported as argument. It is a struct " @@ -1454,7 +1444,7 @@ py.test.skip("_Bool not in MSVC") ffi = FFI() ffi.cdef("struct foo_s { _Bool x; };" - "_Bool foo(_Bool); _Bool (*foop)(_Bool);") + "_Bool foo(_Bool); static _Bool (*foop)(_Bool);") lib = ffi.verify(""" struct foo_s { _Bool x; }; int foo(int arg) { @@ -1463,7 +1453,7 @@ _Bool _foofunc(_Bool x) { return !x; } - _Bool (*foop)(_Bool) = _foofunc; + static _Bool (*foop)(_Bool) = _foofunc; """) p = ffi.new("struct foo_s *") p.x = 1 @@ -1654,7 +1644,7 @@ def test_FILE_stored_explicitly(): ffi = FFI() - ffi.cdef("int myprintf11(const char *, int); FILE *myfile;") + ffi.cdef("int myprintf11(const char *, int); extern FILE *myfile;") lib = ffi.verify(""" #include FILE *myfile; @@ -1680,19 +1670,19 @@ def test_global_array_with_missing_length(): ffi = FFI() - ffi.cdef("int fooarray[];") + ffi.cdef("extern int fooarray[];") lib = ffi.verify("int fooarray[50];") assert repr(lib.fooarray).startswith("" def test_bug_const_char_ptr_array_2(): from cffi import FFI # ignore warnings ffi = FFI() - ffi.cdef("""const int a[];""") + ffi.cdef("""extern const int a[];""") lib = ffi.verify("""const int a[5];""") assert repr(ffi.typeof(lib.a)) == "" def _test_various_calls(force_libffi): cdef_source = """ - int xvalue; - long long ivalue, rvalue; - float fvalue; - double dvalue; - long double Dvalue; + extern int xvalue; + extern long long ivalue, rvalue; + extern float fvalue; + extern double dvalue; + extern long double Dvalue; signed char tf_bb(signed char x, signed char c); unsigned char tf_bB(signed char x, unsigned char c); short tf_bh(signed char x, short c); @@ -2148,7 +2138,7 @@ # exported symbols as well. So we must not export a simple name # like 'foo'! ffi1 = FFI() - ffi1.cdef("int foo_verify_dlopen_flags;") + ffi1.cdef("extern int foo_verify_dlopen_flags;") lib1 = ffi1.verify("int foo_verify_dlopen_flags;", flags=ffi1.RTLD_GLOBAL | ffi1.RTLD_LAZY) @@ -2162,7 +2152,7 @@ def get_second_lib(): # Hack, using modulename makes the test fail ffi2 = FFI() - ffi2.cdef("int foo_verify_dlopen_flags;") + ffi2.cdef("extern int foo_verify_dlopen_flags;") lib2 = ffi2.verify("int foo_verify_dlopen_flags;", flags=ffi2.RTLD_GLOBAL | ffi2.RTLD_LAZY) return lib2 @@ -2535,3 +2525,39 @@ x.p = p x.cyclic = x del p, x + +def test_arithmetic_in_cdef(): + for a in [0, 11, 15]: + ffi = FFI() + ffi.cdef(""" + enum FOO { + DIVNN = ((-?) / (-3)), + DIVNP = ((-?) / (+3)), + DIVPN = ((+?) / (-3)), + MODNN = ((-?) % (-3)), + MODNP = ((-?) % (+3)), + MODPN = ((+?) % (-3)), + }; + """.replace('?', str(a))) + lib = ffi.verify(""" + enum FOO { + DIVNN = ((-?) / (-3)), + DIVNP = ((-?) / (+3)), + DIVPN = ((+?) / (-3)), + MODNN = ((-?) % (-3)), + MODNP = ((-?) % (+3)), + MODPN = ((+?) % (-3)), + }; + """.replace('?', str(a))) + # the verify() crashes if the values in the enum are different from + # the values we computed ourselves from the cdef() + +def test_passing_large_list(): + ffi = FFI() + ffi.cdef("""void passing_large_list(long[]);""") + lib = ffi.verify(""" + static void passing_large_list(long a[]) { } + """) + arg = list(range(20000000)) + lib.passing_large_list(arg) + # assert did not segfault diff -Nru pypy-7.1.1+dfsg/extra_tests/cffi_tests/cffi0/test_zdistutils.py pypy-7.3.1+dfsg/extra_tests/cffi_tests/cffi0/test_zdistutils.py --- pypy-7.1.1+dfsg/extra_tests/cffi_tests/cffi0/test_zdistutils.py 2019-08-08 19:42:53.000000000 +0000 +++ pypy-7.3.1+dfsg/extra_tests/cffi_tests/cffi0/test_zdistutils.py 2020-04-10 19:28:40.000000000 +0000 @@ -90,7 +90,7 @@ csrc = '/*hi there %s!2*/\n#include \n' % self v = Verifier(ffi, csrc, force_generic_engine=self.generic, libraries=[self.lib_m]) - basename = self.__class__.__name__ + 'test_compile_module' + basename = self.__class__.__name__[:10] + '_test_compile_module' v.modulefilename = filename = str(udir.join(basename + '.so')) v.compile_module() assert filename == v.modulefilename diff -Nru pypy-7.1.1+dfsg/extra_tests/cffi_tests/cffi0/test_zintegration.py pypy-7.3.1+dfsg/extra_tests/cffi_tests/cffi0/test_zintegration.py --- pypy-7.1.1+dfsg/extra_tests/cffi_tests/cffi0/test_zintegration.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/extra_tests/cffi_tests/cffi0/test_zintegration.py 2020-04-10 19:28:40.000000000 +0000 @@ -2,11 +2,13 @@ import py, os, sys, shutil import subprocess from extra_tests.cffi_tests.udir import udir +import pytest if sys.platform == 'win32': - py.test.skip('snippets do not run on win32') + pytestmark = pytest.mark.skip('snippets do not run on win32') if sys.version_info < (2, 7): - py.test.skip('fails e.g. on a Debian/Ubuntu which patches virtualenv' + pytestmark = pytest.mark.skip( + 'fails e.g. on a Debian/Ubuntu which patches virtualenv' ' in a non-2.6-friendly way') def create_venv(name): diff -Nru pypy-7.1.1+dfsg/extra_tests/cffi_tests/cffi1/test_dlopen.py pypy-7.3.1+dfsg/extra_tests/cffi_tests/cffi1/test_dlopen.py --- pypy-7.1.1+dfsg/extra_tests/cffi_tests/cffi1/test_dlopen.py 2019-08-08 19:42:53.000000000 +0000 +++ pypy-7.3.1+dfsg/extra_tests/cffi_tests/cffi1/test_dlopen.py 2020-04-10 19:28:40.000000000 +0000 @@ -7,7 +7,7 @@ def test_simple(): ffi = FFI() - ffi.cdef("int close(int); static const int BB = 42; int somevar;") + ffi.cdef("int close(int); static const int BB = 42; extern int somevar;") target = udir.join('test_simple.py') make_py_source(ffi, 'test_simple', str(target)) assert target.read() == r"""# auto-generated file @@ -197,7 +197,7 @@ def test_global_var(): ffi = FFI() - ffi.cdef("int myglob;") + ffi.cdef("extern int myglob;") target = udir.join('test_global_var.py') make_py_source(ffi, 'test_global_var', str(target)) assert target.read() == r"""# auto-generated file diff -Nru pypy-7.1.1+dfsg/extra_tests/cffi_tests/cffi1/test_new_ffi_1.py pypy-7.3.1+dfsg/extra_tests/cffi_tests/cffi1/test_new_ffi_1.py --- pypy-7.1.1+dfsg/extra_tests/cffi_tests/cffi1/test_new_ffi_1.py 2019-08-08 19:42:53.000000000 +0000 +++ pypy-7.3.1+dfsg/extra_tests/cffi_tests/cffi1/test_new_ffi_1.py 2020-04-10 19:28:40.000000000 +0000 @@ -1221,7 +1221,7 @@ py.test.skip(str(e)) f.write(ffi.buffer(a, 1000 * ffi.sizeof("int"))) f.seek(0) - assert f.read() == array.array('i', range(1000)).tostring() + assert f.read() == arraytostring(array.array('i', range(1000))) f.seek(0) b = ffi.new("int[]", 1005) f.readinto(ffi.buffer(b, 1000 * ffi.sizeof("int"))) @@ -1239,7 +1239,7 @@ py.test.skip(str(e)) f.write(ffi.buffer(a, 1000 * ffi.sizeof("int"))) f.seek(0) - assert f.read() == array.array('i', range(1000)).tostring() + assert f.read() == arraytostring(array.array('i', range(1000))) f.seek(0) b = ffi.new("int[]", 1005) f.readinto(ffi.buffer(b, 1000 * ffi.sizeof("int"))) @@ -1780,7 +1780,7 @@ def test_import_from_lib(self): ffi2 = cffi.FFI() - ffi2.cdef("int myfunc(int); int myvar;\n#define MYFOO ...\n") + ffi2.cdef("int myfunc(int); extern int myvar;\n#define MYFOO ...\n") outputfilename = recompile(ffi2, "_test_import_from_lib", "int myfunc(int x) { return x + 1; }\n" "int myvar = -5;\n" diff -Nru pypy-7.1.1+dfsg/extra_tests/cffi_tests/cffi1/test_recompiler.py pypy-7.3.1+dfsg/extra_tests/cffi_tests/cffi1/test_recompiler.py --- pypy-7.1.1+dfsg/extra_tests/cffi_tests/cffi1/test_recompiler.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/extra_tests/cffi_tests/cffi1/test_recompiler.py 2020-04-10 19:28:40.000000000 +0000 @@ -27,16 +27,21 @@ def verify(ffi, module_name, source, *args, **kwds): no_cpp = kwds.pop('no_cpp', False) + ignore_warnings = kwds.pop('ignore_warnings', False) kwds.setdefault('undef_macros', ['NDEBUG']) module_name = '_CFFI_' + module_name ffi.set_source(module_name, source) if not os.environ.get('NO_CPP') and not no_cpp: # test the .cpp mode too kwds.setdefault('source_extension', '.cpp') source = 'extern "C" {\n%s\n}' % (source,) - elif sys.platform != 'win32': + elif sys.platform != 'win32' and not ignore_warnings: # add '-Werror' to the existing 'extra_compile_args' flags + from extra_tests.cffi_tests.support import extra_compile_args kwds['extra_compile_args'] = (kwds.get('extra_compile_args', []) + - ['-Werror']) + extra_compile_args) + if sys.platform == 'darwin': + kwds['extra_link_args'] = (kwds.get('extra_link_args', []) + + ['-stdlib=libc++']) return _verify(ffi, module_name, source, *args, **kwds) def test_set_source_no_slashes(): @@ -84,7 +89,7 @@ "(FUNCTION 1)(PRIMITIVE 7)(FUNCTION_END 1)(POINTER 0)") def test_type_table_array(): - check_type_table("int a[100];", + check_type_table("extern int a[100];", "(PRIMITIVE 7)(ARRAY 0)(None 100)") def test_type_table_typedef(): @@ -136,7 +141,8 @@ import math ffi = FFI() ffi.cdef("float sin(double); double cos(double);") - lib = verify(ffi, 'test_math_sin', '#include ') + lib = verify(ffi, 'test_math_sin', '#include ', + ignore_warnings=True) assert lib.cos(1.43) == math.cos(1.43) def test_repr_lib(): @@ -159,7 +165,7 @@ def test_global_var_array(): ffi = FFI() - ffi.cdef("int a[100];") + ffi.cdef("extern int a[100];") lib = verify(ffi, 'test_global_var_array', 'int a[100] = { 9999 };') lib.a[42] = 123456 assert lib.a[42] == 123456 @@ -183,7 +189,7 @@ def test_global_var_int(): ffi = FFI() - ffi.cdef("int a, b, c;") + ffi.cdef("extern int a, b, c;") lib = verify(ffi, 'test_global_var_int', 'int a = 999, b, c;') assert lib.a == 999 lib.a -= 1001 @@ -284,7 +290,7 @@ def test_dir(): ffi = FFI() - ffi.cdef("int ff(int); int aa; static const int my_constant;") + ffi.cdef("int ff(int); extern int aa; static const int my_constant;") lib = verify(ffi, 'test_dir', """ #define my_constant (-45) int aa; @@ -348,9 +354,9 @@ lib = verify(ffi, 'test_verify_exact_field_offset', """struct foo_s { short a; int b; };""") e = py.test.raises(ffi.error, ffi.new, "struct foo_s *", []) # lazily - assert str(e.value) == ("struct foo_s: wrong offset for field 'b' (cdef " - 'says 0, but C compiler says 4). fix it or use "...;" ' - "in the cdef for struct foo_s to make it flexible") + assert str(e.value).startswith( + "struct foo_s: wrong offset for field 'b' (cdef " + 'says 0, but C compiler says 4). fix it or use "...;" ') def test_type_caching(): ffi1 = FFI(); ffi1.cdef("struct foo_s;") @@ -406,7 +412,7 @@ def test_dotdotdot_global_array(): ffi = FFI() - ffi.cdef("int aa[...]; int bb[...];") + ffi.cdef("extern int aa[...]; extern int bb[...];") lib = verify(ffi, 'test_dotdotdot_global_array', "int aa[41]; int bb[12];") assert ffi.sizeof(lib.aa) == 41 * 4 @@ -561,37 +567,37 @@ def test_bad_size_of_global_1(): ffi = FFI() - ffi.cdef("short glob;") + ffi.cdef("extern short glob;") py.test.raises(VerificationError, verify, ffi, "test_bad_size_of_global_1", "long glob;") def test_bad_size_of_global_2(): ffi = FFI() - ffi.cdef("int glob[10];") + ffi.cdef("extern int glob[10];") py.test.raises(VerificationError, verify, ffi, "test_bad_size_of_global_2", "int glob[9];") def test_unspecified_size_of_global_1(): ffi = FFI() - ffi.cdef("int glob[];") + ffi.cdef("extern int glob[];") lib = verify(ffi, "test_unspecified_size_of_global_1", "int glob[10];") assert ffi.typeof(lib.glob) == ffi.typeof("int *") def test_unspecified_size_of_global_2(): ffi = FFI() - ffi.cdef("int glob[][5];") + ffi.cdef("extern int glob[][5];") lib = verify(ffi, "test_unspecified_size_of_global_2", "int glob[10][5];") assert ffi.typeof(lib.glob) == ffi.typeof("int(*)[5]") def test_unspecified_size_of_global_3(): ffi = FFI() - ffi.cdef("int glob[][...];") + ffi.cdef("extern int glob[][...];") lib = verify(ffi, "test_unspecified_size_of_global_3", "int glob[10][5];") assert ffi.typeof(lib.glob) == ffi.typeof("int(*)[5]") def test_unspecified_size_of_global_4(): ffi = FFI() - ffi.cdef("int glob[...][...];") + ffi.cdef("extern int glob[...][...];") lib = verify(ffi, "test_unspecified_size_of_global_4", "int glob[10][5];") assert ffi.typeof(lib.glob) == ffi.typeof("int[10][5]") @@ -645,7 +651,7 @@ ffi.cdef("sshort_t ff3(sshort_t);") lib = verify(ffi, "test_include_3", "typedef short sshort_t; //usually from a #include\n" - "sshort_t ff3(sshort_t x) { return x + 42; }") + "sshort_t ff3(sshort_t x) { return (sshort_t)(x + 42); }") assert lib.ff3(10) == 52 assert ffi.typeof(ffi.cast("sshort_t", 42)) is ffi.typeof("short") assert ffi1.typeof("sshort_t") is ffi.typeof("sshort_t") @@ -754,7 +760,7 @@ ffi = FFI() ffi.cdef(unicode("float sin(double); double cos(double);")) lib = verify(ffi, 'test_math_sin_unicode', unicode('#include '), - libraries=[unicode(lib_m)]) + libraries=[unicode(lib_m)], ignore_warnings=True) assert lib.cos(1.43) == math.cos(1.43) def test_incomplete_struct_as_arg(): @@ -814,7 +820,7 @@ def test_address_of_global_var(): ffi = FFI() ffi.cdef(""" - long bottom, bottoms[2]; + extern long bottom, bottoms[2]; long FetchRectBottom(void); long FetchRectBottoms1(void); #define FOOBAR 42 @@ -882,15 +888,20 @@ e5 = py.test.raises(TypeError, lib.foo2) e6 = py.test.raises(TypeError, lib.foo2, 42) e7 = py.test.raises(TypeError, lib.foo2, 45, 46, 47) - assert str(e1.value) == "foo0() takes no arguments (1 given)" - assert str(e2.value) == "foo0() takes no arguments (2 given)" - assert str(e3.value) == "foo1() takes exactly one argument (0 given)" - assert str(e4.value) == "foo1() takes exactly one argument (2 given)" - assert str(e5.value) in ["foo2 expected 2 arguments, got 0", + def st1(s): + s = str(s) + if s.startswith("_CFFI_test_unpack_args.CompiledLib."): + s = s[len("_CFFI_test_unpack_args.CompiledLib."):] + return s + assert st1(e1.value) == "foo0() takes no arguments (1 given)" + assert st1(e2.value) == "foo0() takes no arguments (2 given)" + assert st1(e3.value) == "foo1() takes exactly one argument (0 given)" + assert st1(e4.value) == "foo1() takes exactly one argument (2 given)" + assert st1(e5.value) in ["foo2 expected 2 arguments, got 0", "foo2() takes exactly 2 arguments (0 given)"] - assert str(e6.value) in ["foo2 expected 2 arguments, got 1", + assert st1(e6.value) in ["foo2 expected 2 arguments, got 1", "foo2() takes exactly 2 arguments (1 given)"] - assert str(e7.value) in ["foo2 expected 2 arguments, got 3", + assert st1(e7.value) in ["foo2 expected 2 arguments, got 3", "foo2() takes exactly 2 arguments (3 given)"] def test_address_of_function(): @@ -898,7 +909,7 @@ ffi.cdef("long myfunc(long x);") lib = verify(ffi, "test_addressof_function", """ char myfunc(char x) { return (char)(x + 42); } - """) + """, ignore_warnings=True) assert lib.myfunc(5) == 47 assert lib.myfunc(0xABC05) == 47 assert not isinstance(lib.myfunc, ffi.CData) @@ -969,7 +980,7 @@ ffi = FFI() ffi.cdef(""" typedef ... opaque_t; - opaque_t globvar; + extern opaque_t globvar; """) lib = verify(ffi, 'test_variable_of_unknown_size', """ typedef char opaque_t[6]; @@ -1014,7 +1025,7 @@ def test_call_with_incomplete_structs(): ffi = FFI() ffi.cdef("typedef struct {...;} foo_t; " - "foo_t myglob; " + "extern foo_t myglob; " "foo_t increment(foo_t s); " "double getx(foo_t s);") lib = verify(ffi, 'test_call_with_incomplete_structs', """ @@ -1058,7 +1069,7 @@ def test_global_var_array_2(): ffi = FFI() - ffi.cdef("int a[...][...];") + ffi.cdef("extern int a[...][...];") lib = verify(ffi, 'test_global_var_array_2', 'int a[10][8];') lib.a[9][7] = 123456 assert lib.a[9][7] == 123456 @@ -1071,7 +1082,7 @@ def test_global_var_array_3(): ffi = FFI() - ffi.cdef("int a[][...];") + ffi.cdef("extern int a[][...];") lib = verify(ffi, 'test_global_var_array_3', 'int a[10][8];') lib.a[9][7] = 123456 assert lib.a[9][7] == 123456 @@ -1082,7 +1093,7 @@ def test_global_var_array_4(): ffi = FFI() - ffi.cdef("int a[10][...];") + ffi.cdef("extern int a[10][...];") lib = verify(ffi, 'test_global_var_array_4', 'int a[10][8];') lib.a[9][7] = 123456 assert lib.a[9][7] == 123456 @@ -1171,7 +1182,7 @@ lib = verify(ffi, 'test_some_float_invalid_3', """ typedef long double foo_t; foo_t neg(foo_t x) { return -x; } - """) + """, ignore_warnings=True) if ffi.sizeof("long double") == ffi.sizeof("double"): assert lib.neg(12.3) == -12.3 else: @@ -1205,7 +1216,7 @@ def test_import_from_lib(): ffi = FFI() - ffi.cdef("int mybar(int); int myvar;\n#define MYFOO ...") + ffi.cdef("int mybar(int); static int myvar;\n#define MYFOO ...") lib = verify(ffi, 'test_import_from_lib', "#define MYFOO 42\n" "static int mybar(int x) { return x + 1; }\n" @@ -1221,7 +1232,7 @@ def test_macro_var_callback(): ffi = FFI() - ffi.cdef("int my_value; int *(*get_my_value)(void);") + ffi.cdef("extern int my_value; extern int *(*get_my_value)(void);") lib = verify(ffi, 'test_macro_var_callback', "int *(*get_my_value)(void);\n" "#define my_value (*get_my_value())") @@ -1336,7 +1347,7 @@ def test_const_function_type_args(): ffi = FFI() - ffi.cdef("""int (*foobar)(const int a, const int *b, const int c[]);""") + ffi.cdef("""extern int(*foobar)(const int a,const int*b,const int c[]);""") lib = verify(ffi, 'test_const_function_type_args', """ int (*foobar)(const int a, const int *b, const int c[]); """) @@ -1626,7 +1637,7 @@ def test_extern_python_bogus_name(): ffi = FFI() - ffi.cdef("int abc;") + ffi.cdef("extern int abc;") lib = verify(ffi, 'test_extern_python_bogus_name', "int abc;") def fn(): pass @@ -1787,8 +1798,8 @@ ffi.cdef(""" extern "Python" int __stdcall foo(int); extern "Python" int WINAPI bar(int); - int (__stdcall * mycb1)(int); - int indirect_call(int); + static int (__stdcall * mycb1)(int); + static int indirect_call(int); """) lib = verify(ffi, 'test_extern_python_stdcall', """ #ifndef _MSC_VER @@ -1845,7 +1856,7 @@ ffi = FFI() ffi.cdef("float f1(double);") lib = verify(ffi, 'test_introspect_function', """ - float f1(double x) { return x; } + float f1(double x) { return (float)x; } """) assert dir(lib) == ['f1'] FUNC = ffi.typeof(lib.f1) @@ -1856,7 +1867,7 @@ def test_introspect_global_var(): ffi = FFI() - ffi.cdef("float g1;") + ffi.cdef("extern float g1;") lib = verify(ffi, 'test_introspect_global_var', """ float g1; """) @@ -1867,7 +1878,7 @@ def test_introspect_global_var_array(): ffi = FFI() - ffi.cdef("float g1[100];") + ffi.cdef("extern float g1[100];") lib = verify(ffi, 'test_introspect_global_var_array', """ float g1[100]; """) @@ -2039,7 +2050,7 @@ ffi.cdef("float _Complex f1(float a, float b);"); lib = verify(ffi, "test_function_returns_float_complex", """ #include - static float _Complex f1(float a, float b) { return a + I*2.0*b; } + static float _Complex f1(float a, float b) { return a + I*2.0f*b; } """, no_cpp=True) # fails on some systems with C++ result = lib.f1(1.25, 5.1) assert type(result) == complex @@ -2090,7 +2101,7 @@ ffi = FFI() ffi.cdef(""" typedef int foo_t[...], bar_t[...]; - int gv[...]; + extern int gv[...]; typedef int mat_t[...][...]; typedef int vmat_t[][...]; """) @@ -2150,7 +2161,8 @@ lib = verify(ffi, "test_call_with_nested_anonymous_struct", """ struct foo { int a; union { int b, c; }; }; struct foo f(void) { - struct foo s = { 40 }; + struct foo s; + s.a = 40; s.b = 200; return s; } @@ -2339,3 +2351,111 @@ typedef int foo_t; struct foo_s { void (*x)(foo_t); }; """) py.test.raises(TypeError, ffi.new, "struct foo_s *") + +def test_from_buffer_struct(): + ffi = FFI() + ffi.cdef("""struct foo_s { int a, b; };""") + lib = verify(ffi, "test_from_buffer_struct_p", """ + struct foo_s { int a, b; }; + """) + p = ffi.new("struct foo_s *", [-219239, 58974983]) + q = ffi.from_buffer("struct foo_s[]", ffi.buffer(p)) + assert ffi.typeof(q) == ffi.typeof("struct foo_s[]") + assert len(q) == 1 + assert q[0].a == p.a + assert q[0].b == p.b + assert q == p + q = ffi.from_buffer("struct foo_s *", ffi.buffer(p)) + assert ffi.typeof(q) == ffi.typeof("struct foo_s *") + assert q.a == p.a + assert q.b == p.b + assert q[0].a == p.a + assert q[0].b == p.b + assert q == p + +def test_unnamed_bitfield_1(): + ffi = FFI() + ffi.cdef("""struct A { char : 1; };""") + lib = verify(ffi, "test_unnamed_bitfield_1", """ + struct A { char : 1; }; + """) + p = ffi.new("struct A *") + assert ffi.sizeof(p[0]) == 1 + # Note: on gcc, the type name is ignored for anonymous bitfields + # and that's why the result is 1. On MSVC, the result is + # sizeof("char") which is also 1. + +def test_unnamed_bitfield_2(): + ffi = FFI() + ffi.cdef("""struct A { + short c : 1; short : 1; short d : 1; short : 1; };""") + lib = verify(ffi, "test_unnamed_bitfield_2", """ + struct A { + short c : 1; short : 1; short d : 1; short : 1; + }; + """) + p = ffi.new("struct A *") + assert ffi.sizeof(p[0]) == ffi.sizeof("short") + +def test_unnamed_bitfield_3(): + ffi = FFI() + ffi.cdef("""struct A { struct { char : 1; char : 1; } b; };""") + lib = verify(ffi, "test_unnamed_bitfield_3", """ + struct A { struct { char : 1; char : 1; } b; }; + """) + p = ffi.new("struct A *") + assert ffi.sizeof(p[0]) == 1 + # Note: on gcc, the type name is ignored for anonymous bitfields + # and that's why the result is 1. On MSVC, the result is + # sizeof("char") which is also 1. + +def test_unnamed_bitfield_4(): + ffi = FFI() + ffi.cdef("""struct A { struct { + unsigned c : 1; unsigned : 1; unsigned d : 1; unsigned : 1; } a; + }; + struct B { struct A a; };""") + lib = verify(ffi, "test_unnamed_bitfield_4", """ + struct A { struct { + unsigned c : 1; unsigned : 1; unsigned d : 1; unsigned : 1; } a; + }; + struct B { struct A a; }; + """) + b = ffi.new("struct B *") + a = ffi.new("struct A *") + assert ffi.sizeof(a[0]) == ffi.sizeof("unsigned") + assert ffi.sizeof(b[0]) == ffi.sizeof(a[0]) + +def test_struct_with_func_with_struct_pointer_arg(): + ffi = FFI() + ffi.cdef("""struct BinaryTree { + int (* CompareKey)(struct BinaryTree *tree); + };""") + lib = verify(ffi, "test_struct_with_func_with_struct_pointer_arg", """ + struct BinaryTree { + int (* CompareKey)(struct BinaryTree *tree); + }; + """) + ffi.new("struct BinaryTree *") + +def test_struct_with_func_with_struct_arg(): + ffi = FFI() + ffi.cdef("""struct BinaryTree { + int (* CompareKey)(struct BinaryTree tree); + };""") + lib = verify(ffi, "test_struct_with_func_with_struct_arg", """ + struct BinaryTree { + int (* CompareKey)(struct BinaryTree tree); + }; + """) + py.test.raises(RuntimeError, ffi.new, "struct BinaryTree *") + +def test_passing_large_list(): + ffi = FFI() + ffi.cdef("""void passing_large_list(long[]);""") + lib = verify(ffi, "test_passing_large_list", """ + static void passing_large_list(long a[]) { } + """) + arg = list(range(20000000)) + lib.passing_large_list(arg) + # assert did not segfault diff -Nru pypy-7.1.1+dfsg/extra_tests/cffi_tests/cffi1/test_re_python.py pypy-7.3.1+dfsg/extra_tests/cffi_tests/cffi1/test_re_python.py --- pypy-7.1.1+dfsg/extra_tests/cffi_tests/cffi1/test_re_python.py 2019-08-08 19:42:53.000000000 +0000 +++ pypy-7.3.1+dfsg/extra_tests/cffi_tests/cffi1/test_re_python.py 2020-04-10 19:28:40.000000000 +0000 @@ -64,11 +64,11 @@ #define BIGNEG -420000000000L int add42(int); int add43(int, ...); - int globalvar42; + extern int globalvar42; const int globalconst42; - const char *const globalconsthello = "hello"; + const char *const globalconsthello; int no_such_function(int); - int no_such_globalvar; + extern int no_such_globalvar; struct foo_s; typedef struct bar_s { int x; signed char a[]; } bar_t; enum foo_e { AA, BB, CC }; @@ -76,6 +76,7 @@ struct with_union { union { int a; char b; }; }; union with_struct { struct { int a; char b; }; }; struct NVGcolor { union { float rgba[4]; struct { float r,g,b,a; }; }; }; + typedef struct selfref { struct selfref *next; } *selfref_ptr_t; """) ffi.set_source('re_python_pysrc', None) ffi.emit_python_code(str(tmpdir.join('re_python_pysrc.py'))) @@ -255,3 +256,29 @@ assert ffi.offsetof("struct NVGcolor", "g") == FLOAT assert ffi.offsetof("struct NVGcolor", "b") == FLOAT * 2 assert ffi.offsetof("struct NVGcolor", "a") == FLOAT * 3 + +def test_selfref(): + # based on issue #429 + from re_python_pysrc import ffi + ffi.new("selfref_ptr_t") + +def test_dlopen_handle(): + import _cffi_backend + from re_python_pysrc import ffi + if sys.platform == 'win32': + py.test.skip("uses 'dl' explicitly") + ffi1 = FFI() + ffi1.cdef("""void *dlopen(const char *filename, int flags); + int dlclose(void *handle);""") + lib1 = ffi1.dlopen('dl') + handle = lib1.dlopen(extmod.encode(sys.getfilesystemencoding()), + _cffi_backend.RTLD_LAZY) + assert ffi1.typeof(handle) == ffi1.typeof("void *") + assert handle + + lib = ffi.dlopen(handle) + assert lib.add42(-10) == 32 + assert type(lib.add42) is _cffi_backend.FFI.CData + + err = lib1.dlclose(handle) + assert err == 0 diff -Nru pypy-7.1.1+dfsg/extra_tests/cffi_tests/cffi1/test_verify1.py pypy-7.3.1+dfsg/extra_tests/cffi_tests/cffi1/test_verify1.py --- pypy-7.1.1+dfsg/extra_tests/cffi_tests/cffi1/test_verify1.py 2019-08-08 19:42:53.000000000 +0000 +++ pypy-7.3.1+dfsg/extra_tests/cffi_tests/cffi1/test_verify1.py 2020-04-10 19:28:40.000000000 +0000 @@ -5,7 +5,7 @@ from cffi import CDefError from cffi import recompiler from extra_tests.cffi_tests.support import * -from extra_tests.cffi_tests.support import _verify +from extra_tests.cffi_tests.support import _verify, extra_compile_args import _cffi_backend lib_m = ['m'] @@ -14,18 +14,6 @@ import distutils.ccompiler if distutils.ccompiler.get_default_compiler() == 'msvc': lib_m = ['msvcrt'] - extra_compile_args = [] # no obvious -Werror equivalent on MSVC -else: - if (sys.platform == 'darwin' and - [int(x) for x in os.uname()[2].split('.')] >= [11, 0, 0]): - # assume a standard clang or gcc - extra_compile_args = ['-Werror', '-Wall', '-Wextra', '-Wconversion'] - # special things for clang - extra_compile_args.append('-Qunused-arguments') - else: - # assume a standard gcc - extra_compile_args = ['-Werror', '-Wall', '-Wextra', '-Wconversion', - '-Wno-unused-parameter'] class FFI(FFI): error = _cffi_backend.FFI.error @@ -268,7 +256,7 @@ def test_var_signed_integer_types(): ffi = FFI() lst = all_signed_integer_types(ffi) - csource = "\n".join(["%s somevar_%s;" % (tp, tp.replace(' ', '_')) + csource = "\n".join(["static %s somevar_%s;" % (tp, tp.replace(' ', '_')) for tp in lst]) ffi.cdef(csource) lib = ffi.verify(csource) @@ -287,7 +275,7 @@ def test_var_unsigned_integer_types(): ffi = FFI() lst = all_unsigned_integer_types(ffi) - csource = "\n".join(["%s somevar_%s;" % (tp, tp.replace(' ', '_')) + csource = "\n".join(["static %s somevar_%s;" % (tp, tp.replace(' ', '_')) for tp in lst]) ffi.cdef(csource) lib = ffi.verify(csource) @@ -791,8 +779,8 @@ def test_access_variable(): ffi = FFI() - ffi.cdef("int foo(void);\n" - "int somenumber;") + ffi.cdef("static int foo(void);\n" + "static int somenumber;") lib = ffi.verify(""" static int somenumber = 2; static int foo(void) { @@ -809,7 +797,7 @@ def test_access_address_of_variable(): # access the address of 'somenumber': need a trick ffi = FFI() - ffi.cdef("int somenumber; static int *const somenumberptr;") + ffi.cdef("static int somenumber; static int *const somenumberptr;") lib = ffi.verify(""" static int somenumber = 2; #define somenumberptr (&somenumber) @@ -821,8 +809,8 @@ def test_access_array_variable(length=5): ffi = FFI() - ffi.cdef("int foo(int);\n" - "int somenumber[%s];" % (length,)) + ffi.cdef("static int foo(int);\n" + "static int somenumber[%s];" % (length,)) lib = ffi.verify(""" static int somenumber[] = {2, 2, 3, 4, 5}; static int foo(int i) { @@ -853,8 +841,8 @@ def test_access_struct_variable(): ffi = FFI() ffi.cdef("struct foo { int x; ...; };\n" - "int foo(int);\n" - "struct foo stuff;") + "static int foo(int);\n" + "static struct foo stuff;") lib = ffi.verify(""" struct foo { int x, y, z; }; static struct foo stuff = {2, 5, 8}; @@ -878,9 +866,9 @@ def test_access_callback(): ffi = FFI() - ffi.cdef("int (*cb)(int);\n" - "int foo(int);\n" - "void reset_cb(void);") + ffi.cdef("static int (*cb)(int);\n" + "static int foo(int);\n" + "static void reset_cb(void);") lib = ffi.verify(""" static int g(int x) { return x * 7; } static int (*cb)(int); @@ -896,9 +884,9 @@ def test_access_callback_function_typedef(): ffi = FFI() ffi.cdef("typedef int mycallback_t(int);\n" - "mycallback_t *cb;\n" - "int foo(int);\n" - "void reset_cb(void);") + "static mycallback_t *cb;\n" + "static int foo(int);\n" + "static void reset_cb(void);") lib = ffi.verify(""" static int g(int x) { return x * 7; } static int (*cb)(int); @@ -1039,7 +1027,7 @@ def test_autofilled_struct_as_argument_dynamic(): ffi = FFI() ffi.cdef("struct foo_s { long a; ...; };\n" - "int (*foo)(struct foo_s);") + "static int (*foo)(struct foo_s);") lib = ffi.verify(""" struct foo_s { double b; @@ -1048,7 +1036,7 @@ int foo1(struct foo_s s) { return (int)s.a - (int)s.b; } - int (*foo)(struct foo_s s) = &foo1; + static int (*foo)(struct foo_s s) = &foo1; """) e = py.test.raises(NotImplementedError, lib.foo, "?") msg = ("ctype 'struct foo_s' not supported as argument. It is a struct " @@ -1424,7 +1412,7 @@ py.test.skip("_Bool not in MSVC") ffi = FFI() ffi.cdef("struct foo_s { _Bool x; };" - "_Bool foo(_Bool); _Bool (*foop)(_Bool);") + "_Bool foo(_Bool); static _Bool (*foop)(_Bool);") lib = ffi.verify(""" struct foo_s { _Bool x; }; int foo(int arg) { @@ -1433,7 +1421,7 @@ _Bool _foofunc(_Bool x) { return !x; } - _Bool (*foop)(_Bool) = _foofunc; + static _Bool (*foop)(_Bool) = _foofunc; """) p = ffi.new("struct foo_s *") p.x = 1 @@ -1618,7 +1606,7 @@ def test_FILE_stored_explicitly(): ffi = FFI() - ffi.cdef("int myprintf11(const char *, int); FILE *myfile;") + ffi.cdef("int myprintf11(const char *, int); extern FILE *myfile;") lib = ffi.verify(""" #include FILE *myfile; @@ -1644,13 +1632,13 @@ def test_global_array_with_missing_length(): ffi = FFI() - ffi.cdef("int fooarray[];") + ffi.cdef("extern int fooarray[];") lib = ffi.verify("int fooarray[50];") assert repr(lib.fooarray).startswith("" def test_bug_const_char_ptr_array_2(): ffi = FFI() - ffi.cdef("""const int a[];""") + ffi.cdef("""extern const int a[];""") lib = ffi.verify("""const int a[5];""") assert repr(ffi.typeof(lib.a)) == "" def _test_various_calls(force_libffi): cdef_source = """ - int xvalue; - long long ivalue, rvalue; - float fvalue; - double dvalue; - long double Dvalue; + extern int xvalue; + extern long long ivalue, rvalue; + extern float fvalue; + extern double dvalue; + extern long double Dvalue; signed char tf_bb(signed char x, signed char c); unsigned char tf_bB(signed char x, unsigned char c); short tf_bh(signed char x, short c); @@ -2112,7 +2100,7 @@ old = sys.getdlopenflags() try: ffi1 = FFI() - ffi1.cdef("int foo_verify_dlopen_flags_1;") + ffi1.cdef("extern int foo_verify_dlopen_flags_1;") sys.setdlopenflags(ffi1.RTLD_GLOBAL | ffi1.RTLD_NOW) lib1 = ffi1.verify("int foo_verify_dlopen_flags_1;") finally: @@ -2253,7 +2241,7 @@ def test_macro_var(): ffi = FFI() - ffi.cdef("int myarray[50], my_value;") + ffi.cdef("extern int myarray[50], my_value;") lib = ffi.verify(""" int myarray[50]; int *get_my_value(void) { diff -Nru pypy-7.1.1+dfsg/extra_tests/cffi_tests/embedding/add1.py pypy-7.3.1+dfsg/extra_tests/cffi_tests/embedding/add1.py --- pypy-7.1.1+dfsg/extra_tests/cffi_tests/embedding/add1.py 2019-08-08 19:42:53.000000000 +0000 +++ pypy-7.3.1+dfsg/extra_tests/cffi_tests/embedding/add1.py 2020-04-10 19:28:40.000000000 +0000 @@ -12,7 +12,11 @@ sys.stdout.write("preparing") for i in range(3): sys.stdout.flush() - time.sleep(0.2) + # Windows: sometimes time.sleep() doesn't sleep at all. + # This appears to occur on recent versions of python only. + t_end = time.time() + 0.19 + while time.time() < t_end: + time.sleep(0.2) sys.stdout.write(".") sys.stdout.write("\n") diff -Nru pypy-7.1.1+dfsg/extra_tests/cffi_tests/embedding/add_recursive.py pypy-7.3.1+dfsg/extra_tests/cffi_tests/embedding/add_recursive.py --- pypy-7.1.1+dfsg/extra_tests/cffi_tests/embedding/add_recursive.py 2019-08-08 19:42:53.000000000 +0000 +++ pypy-7.3.1+dfsg/extra_tests/cffi_tests/embedding/add_recursive.py 2020-04-10 19:28:40.000000000 +0000 @@ -4,7 +4,7 @@ ffi = cffi.FFI() ffi.embedding_api(""" - int (*my_callback)(int); + extern int (*my_callback)(int); int add_rec(int, int); """) diff -Nru pypy-7.1.1+dfsg/extra_tests/cffi_tests/embedding/test_basic.py pypy-7.3.1+dfsg/extra_tests/cffi_tests/embedding/test_basic.py --- pypy-7.1.1+dfsg/extra_tests/cffi_tests/embedding/test_basic.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/extra_tests/cffi_tests/embedding/test_basic.py 2020-04-10 19:28:40.000000000 +0000 @@ -64,8 +64,8 @@ output = popen.stdout.read() err = popen.wait() if err: - raise OSError("popen failed with exit code %r: %r" % ( - err, args)) + raise OSError(("popen failed with exit code %r: %r\n\n%s" % ( + err, args, output)).rstrip()) print(output.rstrip()) return output diff -Nru pypy-7.1.1+dfsg/extra_tests/cffi_tests/embedding/test_performance.py pypy-7.3.1+dfsg/extra_tests/cffi_tests/embedding/test_performance.py --- pypy-7.1.1+dfsg/extra_tests/cffi_tests/embedding/test_performance.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/extra_tests/cffi_tests/embedding/test_performance.py 2020-04-10 19:28:40.000000000 +0000 @@ -3,8 +3,8 @@ from extra_tests.cffi_tests.embedding.test_basic import EmbeddingTests if sys.platform == 'win32': - import py - py.test.skip("written with POSIX functions") + import pytest + pytestmark = pytest.mark.skip("written with POSIX functions") class TestPerformance(EmbeddingTests): diff -Nru pypy-7.1.1+dfsg/extra_tests/cffi_tests/embedding/test_thread.py pypy-7.3.1+dfsg/extra_tests/cffi_tests/embedding/test_thread.py --- pypy-7.1.1+dfsg/extra_tests/cffi_tests/embedding/test_thread.py 2019-08-08 19:42:53.000000000 +0000 +++ pypy-7.3.1+dfsg/extra_tests/cffi_tests/embedding/test_thread.py 2020-04-10 19:28:40.000000000 +0000 @@ -22,17 +22,21 @@ add1_cffi = self.prepare_module('add1') add2_cffi = self.prepare_module('add2') self.compile('thread2-test', [add1_cffi, add2_cffi], threads=True) - output = self.execute('thread2-test') - output = self._take_out(output, "preparing") - output = self._take_out(output, ".") - output = self._take_out(output, ".") - # at least the 3rd dot should be after everything from ADD2 - assert output == ("starting\n" - "prepADD2\n" - "adding 1000 and 200 and 30\n" - ".\n" - "adding 40 and 2\n" - "done\n") + for i in range(3): + output = self.execute('thread2-test') + print('='*79) + print(output) + print('='*79) + output = self._take_out(output, "preparing") + output = self._take_out(output, ".") + output = self._take_out(output, ".") + # at least the 3rd dot should be after everything from ADD2 + assert output == ("starting\n" + "prepADD2\n" + "adding 1000 and 200 and 30\n" + ".\n" + "adding 40 and 2\n" + "done\n") def test_alt_issue(self): add1_cffi = self.prepare_module('add1') diff -Nru pypy-7.1.1+dfsg/extra_tests/cffi_tests/support.py pypy-7.3.1+dfsg/extra_tests/cffi_tests/support.py --- pypy-7.1.1+dfsg/extra_tests/cffi_tests/support.py 2019-08-08 19:42:53.000000000 +0000 +++ pypy-7.3.1+dfsg/extra_tests/cffi_tests/support.py 2020-04-10 19:28:40.000000000 +0000 @@ -1,8 +1,8 @@ # Generated by pypy/tool/import_cffi.py -import sys +import sys, os if sys.version_info < (3,): - __all__ = ['u'] + __all__ = ['u', 'arraytostring'] class U(object): def __add__(self, other): @@ -13,12 +13,16 @@ assert u+'a\x00b' == eval(r"u'a\x00b'") assert u+'a\u1234b' == eval(r"u'a\u1234b'") assert u+'a\U00012345b' == eval(r"u'a\U00012345b'") + def arraytostring(a): + return a.tostring() else: - __all__ = ['u', 'unicode', 'long'] + __all__ = ['u', 'unicode', 'long', 'arraytostring'] u = "" unicode = str long = int + def arraytostring(a): + return a.tobytes() class StdErrCapture(object): @@ -87,3 +91,25 @@ if not name.startswith('_') and not hasattr(module.ffi, name): setattr(ffi, name, NotImplemented) return module.lib + + +# For testing, we call gcc with "-Werror". This is fragile because newer +# versions of gcc are always better at producing warnings, particularly for +# auto-generated code. We need here to adapt and silence them as needed. + +if sys.platform == 'win32': + extra_compile_args = [] # no obvious -Werror equivalent on MSVC +else: + if (sys.platform == 'darwin' and + [int(x) for x in os.uname()[2].split('.')] >= [11, 0, 0]): + # assume a standard clang or gcc + extra_compile_args = ['-Werror', '-Wall', '-Wextra', '-Wconversion', + '-Wno-unused-parameter', + '-Wno-unreachable-code'] + # special things for clang + extra_compile_args.append('-Qunused-arguments') + else: + # assume a standard gcc + extra_compile_args = ['-Werror', '-Wall', '-Wextra', '-Wconversion', + '-Wno-unused-parameter', + '-Wno-unreachable-code'] diff -Nru pypy-7.1.1+dfsg/extra_tests/cffi_tests/test_egg_version.py pypy-7.3.1+dfsg/extra_tests/cffi_tests/test_egg_version.py --- pypy-7.1.1+dfsg/extra_tests/cffi_tests/test_egg_version.py 2019-08-08 19:42:53.000000000 +0000 +++ pypy-7.3.1+dfsg/extra_tests/cffi_tests/test_egg_version.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,12 +0,0 @@ -from email.parser import Parser - -import py - -import cffi -import pypy - -egg_info = py.path.local(pypy.__file__)/'../../lib_pypy/cffi.egg-info/PKG-INFO' - -def test_egg_version(): - info = Parser().parsestr(egg_info.read()) - assert info['version'] == cffi.__version__ diff -Nru pypy-7.1.1+dfsg/extra_tests/cffi_tests/test_version.py pypy-7.3.1+dfsg/extra_tests/cffi_tests/test_version.py --- pypy-7.1.1+dfsg/extra_tests/cffi_tests/test_version.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/extra_tests/cffi_tests/test_version.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,22 @@ +from email.parser import Parser + +import py +import urllib2 + +import cffi +import pypy + +egg_info = py.path.local(pypy.__file__)/'../../lib_pypy/cffi.egg-info/PKG-INFO' + +def test_egg_version(): + info = Parser().parsestr(egg_info.read()) + assert info['version'] == cffi.__version__ + +def test_pycparser_version(): + url = 'https://raw.githubusercontent.com/eliben/pycparser/master/pycparser/__init__.py' + source = urllib2.urlopen(url).read() + dest = py.path.local(__file__).join('..', '..', '..', 'lib_pypy', 'cffi', + '_pycparser', '__init__.py').read() + # if this fails, the vendored pycparser is not the latest version + assert source.strip() == dest.strip() + diff -Nru pypy-7.1.1+dfsg/extra_tests/cffi_tests/udir.py pypy-7.3.1+dfsg/extra_tests/cffi_tests/udir.py --- pypy-7.1.1+dfsg/extra_tests/cffi_tests/udir.py 2019-08-08 19:42:53.000000000 +0000 +++ pypy-7.3.1+dfsg/extra_tests/cffi_tests/udir.py 2020-04-10 19:28:40.000000000 +0000 @@ -1,8 +1,135 @@ # Generated by pypy/tool/import_cffi.py import py -import sys +import sys, os, atexit -udir = py.path.local.make_numbered_dir(prefix = 'ffi-') + +# This is copied from PyPy's vendored py lib. The latest py lib release +# (1.8.1) contains a bug and crashes if it sees another temporary directory +# in which we don't have write permission (e.g. because it's owned by someone +# else). +def make_numbered_dir(prefix='session-', rootdir=None, keep=3, + lock_timeout = 172800, # two days + min_timeout = 300): # five minutes + """ return unique directory with a number greater than the current + maximum one. The number is assumed to start directly after prefix. + if keep is true directories with a number less than (maxnum-keep) + will be removed. + """ + if rootdir is None: + rootdir = py.path.local.get_temproot() + + def parse_num(path): + """ parse the number out of a path (if it matches the prefix) """ + bn = path.basename + if bn.startswith(prefix): + try: + return int(bn[len(prefix):]) + except ValueError: + pass + + # compute the maximum number currently in use with the + # prefix + lastmax = None + while True: + maxnum = -1 + for path in rootdir.listdir(): + num = parse_num(path) + if num is not None: + maxnum = max(maxnum, num) + + # make the new directory + try: + udir = rootdir.mkdir(prefix + str(maxnum+1)) + except py.error.EEXIST: + # race condition: another thread/process created the dir + # in the meantime. Try counting again + if lastmax == maxnum: + raise + lastmax = maxnum + continue + break + + # put a .lock file in the new directory that will be removed at + # process exit + if lock_timeout: + lockfile = udir.join('.lock') + mypid = os.getpid() + if hasattr(lockfile, 'mksymlinkto'): + lockfile.mksymlinkto(str(mypid)) + else: + lockfile.write(str(mypid)) + def try_remove_lockfile(): + # in a fork() situation, only the last process should + # remove the .lock, otherwise the other processes run the + # risk of seeing their temporary dir disappear. For now + # we remove the .lock in the parent only (i.e. we assume + # that the children finish before the parent). + if os.getpid() != mypid: + return + try: + lockfile.remove() + except py.error.Error: + pass + atexit.register(try_remove_lockfile) + + # prune old directories + if keep: + for path in rootdir.listdir(): + num = parse_num(path) + if num is not None and num <= (maxnum - keep): + if min_timeout: + # NB: doing this is needed to prevent (or reduce + # a lot the chance of) the following situation: + # 'keep+1' processes call make_numbered_dir() at + # the same time, they create dirs, but then the + # last process notices the first dir doesn't have + # (yet) a .lock in it and kills it. + try: + t1 = path.lstat().mtime + t2 = lockfile.lstat().mtime + if abs(t2-t1) < min_timeout: + continue # skip directories too recent + except py.error.Error: + continue # failure to get a time, better skip + lf = path.join('.lock') + try: + t1 = lf.lstat().mtime + t2 = lockfile.lstat().mtime + if not lock_timeout or abs(t2-t1) < lock_timeout: + continue # skip directories still locked + except py.error.Error: + pass # assume that it means that there is no 'lf' + try: + path.remove(rec=1) + except KeyboardInterrupt: + raise + except: # this might be py.error.Error, WindowsError ... + pass + + # make link... + try: + username = os.environ['USER'] #linux, et al + except KeyError: + try: + username = os.environ['USERNAME'] #windows + except KeyError: + username = 'current' + + src = str(udir) + dest = src[:src.rfind('-')] + '-' + username + try: + os.unlink(dest) + except OSError: + pass + try: + os.symlink(src, dest) + except (OSError, AttributeError, NotImplementedError): + pass + + return udir + + +udir = make_numbered_dir(prefix = 'ffi-') # Windows-only workaround for some configurations: see diff -Nru pypy-7.1.1+dfsg/extra_tests/ctypes_tests/test_cast.py pypy-7.3.1+dfsg/extra_tests/ctypes_tests/test_cast.py --- pypy-7.1.1+dfsg/extra_tests/ctypes_tests/test_cast.py 2019-08-08 19:42:53.000000000 +0000 +++ pypy-7.3.1+dfsg/extra_tests/ctypes_tests/test_cast.py 2020-04-10 19:28:40.000000000 +0000 @@ -28,3 +28,13 @@ assert x.value is False x = c_bool(['yadda']) assert x.value is True + +def test_cast_array(): + import sys + data = b'data' + ubyte = c_ubyte * len(data) + byteslike = ubyte.from_buffer_copy(data) + m = memoryview(byteslike) + if sys.version_info > (3, 3): + b = m.cast('B') + assert bytes(b) == data diff -Nru pypy-7.1.1+dfsg/extra_tests/ctypes_tests/test_structures.py pypy-7.3.1+dfsg/extra_tests/ctypes_tests/test_structures.py --- pypy-7.1.1+dfsg/extra_tests/ctypes_tests/test_structures.py 2019-08-08 19:42:53.000000000 +0000 +++ pypy-7.3.1+dfsg/extra_tests/ctypes_tests/test_structures.py 2020-04-10 19:28:40.000000000 +0000 @@ -1,6 +1,7 @@ from ctypes import * import pytest +import sys def test_subclass_initializer(): @@ -207,6 +208,9 @@ ) mv = memoryview(c_array) - assert mv.format == 'T{h:a:>h:b:}' assert mv.shape == (2, 3) assert mv.itemsize == 4 diff -Nru pypy-7.1.1+dfsg/extra_tests/ctypes_tests/test_win32.py pypy-7.3.1+dfsg/extra_tests/ctypes_tests/test_win32.py --- pypy-7.1.1+dfsg/extra_tests/ctypes_tests/test_win32.py 2019-08-08 19:42:53.000000000 +0000 +++ pypy-7.3.1+dfsg/extra_tests/ctypes_tests/test_win32.py 2020-04-10 19:28:40.000000000 +0000 @@ -5,7 +5,7 @@ import pytest @pytest.mark.skipif("sys.platform != 'win32'") -def test_VARIANT(self): +def test_VARIANT(): from ctypes import wintypes a = wintypes.VARIANT_BOOL() assert a.value is False diff -Nru pypy-7.1.1+dfsg/extra_tests/test_binop_overriding.py pypy-7.3.1+dfsg/extra_tests/test_binop_overriding.py --- pypy-7.1.1+dfsg/extra_tests/test_binop_overriding.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/extra_tests/test_binop_overriding.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,136 @@ +# test about the binop operation rule, see issue 412 +from pypy.conftest import option + +class Base(object): + def __init__(self, name): + self.name = name + +def lookup_where(obj, name): + mro = type(obj).__mro__ + for t in mro: + if name in t.__dict__: + return t.__dict__[name], t + return None, None + +def refop(x, y, opname, ropname): + # this has been validated by running the tests on top of cpython + # so for the space of possibilities that the tests touch it is known + # to behave like cpython as long as the latter doesn't change its own + # algorithm + t1 = type(x) + t2 = type(y) + op, where1 = lookup_where(x, opname) + rop, where2 = lookup_where(y, ropname) + if op is None and rop is not None: + return rop(y, x) + if rop and where1 is not where2: + if (issubclass(t2, t1) and not issubclass(where1, where2) + and not issubclass(t1, where2) + ): + return rop(y, x) + if op is None: + return "TypeError" + return op(x,y) + +def do_test(X, Y, name, impl): + x = X('x') + y = Y('y') + opname = '__%s__' % name + ropname = '__r%s__' % name + + count = [0] + fail = [] + + def check(z1, z2): + ref = refop(z1, z2, opname, ropname) + try: + v = impl(z1, z2) + except TypeError: + v = "TypeError" + if v != ref: + fail.append(count[0]) + + def override_in_hier(n=6): + if n == 0: + count[0] += 1 + check(x, y) + check(y, x) + return + + f = lambda self, other: (n, self.name, other.name) + if n%2 == 0: + name = opname + else: + name = ropname + + for C in Y.__mro__: + if name in C.__dict__: + continue + if C is not object: + setattr(C, name, f) + override_in_hier(n-1) + if C is not object: + delattr(C, name) + + override_in_hier() + #print count[0] + return fail + +def test_binop_combinations_mul(): + class X(Base): + pass + class Y(X): + pass + + fail = do_test(X, Y, 'mul', lambda x,y: x*y) + #print len(fail) + assert not fail + + + +def test_binop_combinations_sub(): + class X(Base): + pass + class Y(X): + pass + + fail = do_test(X, Y, 'sub', lambda x,y: x-y) + #print len(fail) + assert not fail + + +def test_binop_combinations_pow(): + class X(Base): + pass + class Y(X): + pass + + fail = do_test(X, Y, 'pow', lambda x,y: x**y) + #print len(fail) + assert not fail + +def test_binop_combinations_more_exhaustive(): + class X(Base): + pass + + class B1(object): + pass + + class B2(object): + pass + + class X1(B1, X, B2): + pass + + class C1(object): + pass + + class C2(object): + pass + + class Y(C1, X1, C2): + pass + + fail = do_test(X, Y, 'sub', lambda x,y: x-y) + #print len(fail) + assert not fail diff -Nru pypy-7.1.1+dfsg/extra_tests/test_datetime.py pypy-7.3.1+dfsg/extra_tests/test_datetime.py --- pypy-7.1.1+dfsg/extra_tests/test_datetime.py 2019-08-08 19:42:53.000000000 +0000 +++ pypy-7.3.1+dfsg/extra_tests/test_datetime.py 2020-04-10 19:28:40.000000000 +0000 @@ -128,7 +128,7 @@ import os import time if os.name == 'nt': - skip("setting os.environ['TZ'] ineffective on windows") + pytest.skip("setting os.environ['TZ'] ineffective on windows") try: prev_tz = os.environ.get("TZ") os.environ["TZ"] = "GMT" diff -Nru pypy-7.1.1+dfsg/extra_tests/test_json.py pypy-7.3.1+dfsg/extra_tests/test_json.py --- pypy-7.1.1+dfsg/extra_tests/test_json.py 2019-08-08 19:42:53.000000000 +0000 +++ pypy-7.3.1+dfsg/extra_tests/test_json.py 2020-04-10 19:28:40.000000000 +0000 @@ -31,3 +31,31 @@ @given(jsondata) def test_roundtrip(d): assert json.loads(json.dumps(d)) == d + +def test_skipkeys(): + assert json.dumps({Ellipsis: 42}, skipkeys=True) == '{}' + assert json.dumps({Ellipsis: 42, 3: 4}, skipkeys=True) == '{"3": 4}' + assert json.dumps({3: 4, Ellipsis: 42}, skipkeys=True) == '{"3": 4}' + assert json.dumps({Ellipsis: 42, NotImplemented: 43}, skipkeys=True) \ + == '{}' + assert json.dumps({3: 4, Ellipsis: 42, NotImplemented: 43}, skipkeys=True)\ + == '{"3": 4}' + assert json.dumps({Ellipsis: 42, 3: 4, NotImplemented: 43}, skipkeys=True)\ + == '{"3": 4}' + assert json.dumps({Ellipsis: 42, NotImplemented: 43, 3: 4}, skipkeys=True)\ + == '{"3": 4}' + assert json.dumps({3: 4, 5: 6, Ellipsis: 42}, skipkeys=True) \ + == '{"3": 4, "5": 6}' + assert json.dumps({3: 4, Ellipsis: 42, 5: 6}, skipkeys=True) \ + == '{"3": 4, "5": 6}' + assert json.dumps({Ellipsis: 42, 3: 4, 5: 6}, skipkeys=True) \ + == '{"3": 4, "5": 6}' + +def test_boolean_as_dict_key(): + # In CPython 2.x, dumps({True:...}) gives {"True":...}. It should be + # "true" instead; it's a bug as far as I can tell. In 3.x it was fixed. + # BUT! if we call dumps() with sort_keys=True, then CPython (any version) + # gives "true" instead of "True". Surprize! + # I don't want to understand why, let's just not attempt to reproduce that. + assert json.dumps({True: 5}) == '{"true": 5}' + assert json.dumps({False: 5}) == '{"false": 5}' diff -Nru pypy-7.1.1+dfsg/extra_tests/test_semlock.py pypy-7.3.1+dfsg/extra_tests/test_semlock.py --- pypy-7.1.1+dfsg/extra_tests/test_semlock.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/extra_tests/test_semlock.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,38 @@ +from _multiprocessing import SemLock +from threading import Thread +import thread +import time +import sys +import pytest + +@pytest.mark.skipif(sys.platform=='win32', reason='segfaults on win32') +def test_notify_all(): + """A low-level variation on test_notify_all() in lib-python's + test_multiprocessing.py + """ + N_THREADS = 1000 + lock = SemLock(0, 1, 1) + results = [] + + def f(n): + if lock.acquire(timeout=5.): + results.append(n) + lock.release() + + threads = [Thread(target=f, args=(i,)) for i in range(N_THREADS)] + n_started = N_THREADS + with lock: + for t in threads: + try: + t.start() + except thread.error: + # too many threads for this system + t.started = False + n_started -= 1 + else: + t.started = True + time.sleep(0.1) + for t in threads: + if t.started: + t.join() + assert len(results) == n_started diff -Nru pypy-7.1.1+dfsg/extra_tests/test_stringio.py pypy-7.3.1+dfsg/extra_tests/test_stringio.py --- pypy-7.1.1+dfsg/extra_tests/test_stringio.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/extra_tests/test_stringio.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,54 @@ +from hypothesis import given, strategies as st + +from io import StringIO +from os import linesep + +LINE_ENDINGS = [u'\n', u'\r', u'\r\n'] + +@given(txt=st.text(), newline=st.sampled_from(['', '\n'])) +def test_simple(txt, newline): + sio = StringIO(txt, newline=newline) + assert sio.getvalue() == txt + +@given(values=st.lists( + st.tuples( + st.text(st.characters(blacklist_characters='\r\n'), min_size=1), + st.sampled_from(LINE_ENDINGS)))) +def test_universal(values): + output_lines = [line + linesep for line, ending in values] + output = u''.join(output_lines) + + input = u''.join(line + ending for line, ending in values) + sio = StringIO(input, newline=None) + sio.seek(0) + assert list(sio) == output_lines + assert sio.getvalue() == output + + sio2 = StringIO(newline=None) + for line, ending in values: + sio2.write(line) + sio2.write(ending) + sio2.seek(0) + assert list(sio2) == output_lines + assert sio2.getvalue() == output + +@given( + lines=st.lists(st.text(st.characters(blacklist_characters='\r\n'))), + newline=st.sampled_from(['\r', '\r\n'])) +def test_crlf(lines, newline): + output_lines = [line + newline for line in lines] + output = u''.join(output_lines) + + input = u''.join(line + '\n' for line in lines) + sio = StringIO(input, newline=newline) + sio.seek(0) + assert list(sio) == output_lines + assert sio.getvalue() == output + + sio2 = StringIO(newline=newline) + for line in lines: + sio2.write(line) + sio2.write(u'\n') + sio2.seek(0) + assert list(sio2) == output_lines + assert sio2.getvalue() == ''.join(output_lines) diff -Nru pypy-7.1.1+dfsg/get_externals.py pypy-7.3.1+dfsg/get_externals.py --- pypy-7.1.1+dfsg/get_externals.py 2019-08-08 19:42:53.000000000 +0000 +++ pypy-7.3.1+dfsg/get_externals.py 2020-04-10 19:28:40.000000000 +0000 @@ -27,10 +27,12 @@ raise RuntimeError(stderr) def checkout_repo(dest='externals', org='pypy', branch='default', verbose=False): - url = 'https://bitbucket.org/{}/externals'.format(org) - if not os.path.exists(dest): - cmd = ['hg','clone',url,dest] - runcmd(cmd, verbose) + url = 'https://foss.heptapod.net/{}/externals'.format(org) + if os.path.exists(dest): + cmd = ['hg', '-R', dest, 'pull', url] + else: + cmd = ['hg','clone',url, dest] + runcmd(cmd, verbose) cmd = ['hg','-R', dest, 'update',branch] runcmd(cmd, verbose) diff -Nru pypy-7.1.1+dfsg/.gitlab-ci.yml pypy-7.3.1+dfsg/.gitlab-ci.yml --- pypy-7.1.1+dfsg/.gitlab-ci.yml 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/.gitlab-ci.yml 2020-04-10 19:28:39.000000000 +0000 @@ -0,0 +1,4 @@ +check_rpython_annotations: + image: octobus/ci-for-pypy + script: + - (cd pypy/goal; python2 ../../rpython/bin/rpython --batch -O2 --annotate targetpypystandalone) diff -Nru pypy-7.1.1+dfsg/lib_pypy/cffi/api.py pypy-7.3.1+dfsg/lib_pypy/cffi/api.py --- pypy-7.1.1+dfsg/lib_pypy/cffi/api.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/cffi/api.py 2020-04-10 19:28:40.000000000 +0000 @@ -141,7 +141,11 @@ linked to a particular library, just like C headers; in the library we only look for the actual (untyped) symbols. """ - assert isinstance(name, basestring) or name is None + if not (isinstance(name, basestring) or + name is None or + isinstance(name, self.CData)): + raise TypeError("dlopen(name): name must be a file name, None, " + "or an already-opened 'void *' handle") with self._lock: lib, function_cache = _make_ffi_library(self, name, flags) self._function_caches.append(function_cache) @@ -799,9 +803,9 @@ def _load_backend_lib(backend, name, flags): import os - if name is None: - if sys.platform != "win32": - return backend.load_library(None, flags) + if not isinstance(name, basestring): + if sys.platform != "win32" or name is not None: + return backend.load_library(name, flags) name = "c" # Windows: load_library(None) fails, but this works # on Python 2 (backward compatibility hack only) first_error = None @@ -935,7 +939,7 @@ backendlib.close_lib() self.__dict__.clear() # - if libname is not None: + if isinstance(libname, basestring): try: if not isinstance(libname, str): # unicode, on Python 2 libname = libname.encode('utf-8') diff -Nru pypy-7.1.1+dfsg/lib_pypy/cffi/backend_ctypes.py pypy-7.3.1+dfsg/lib_pypy/cffi/backend_ctypes.py --- pypy-7.1.1+dfsg/lib_pypy/cffi/backend_ctypes.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/cffi/backend_ctypes.py 2020-04-10 19:28:40.000000000 +0000 @@ -403,7 +403,7 @@ source = _cast_source_to_int(source) return cls(bool(source)) def __int__(self): - return self._value + return int(self._value) if kind == 'char': @classmethod diff -Nru pypy-7.1.1+dfsg/lib_pypy/cffi/_cffi_include.h pypy-7.3.1+dfsg/lib_pypy/cffi/_cffi_include.h --- pypy-7.1.1+dfsg/lib_pypy/cffi/_cffi_include.h 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/cffi/_cffi_include.h 2020-04-10 19:28:40.000000000 +0000 @@ -261,14 +261,62 @@ return (int)_cffi_to_c_wchar3216_t(o); } -_CFFI_UNUSED_FN static PyObject *_cffi_from_c_char32_t(int x) +_CFFI_UNUSED_FN static PyObject *_cffi_from_c_char32_t(unsigned int x) { if (sizeof(_cffi_wchar_t) == 4) return _cffi_from_c_wchar_t((_cffi_wchar_t)x); else - return _cffi_from_c_wchar3216_t(x); + return _cffi_from_c_wchar3216_t((int)x); } +union _cffi_union_alignment_u { + unsigned char m_char; + unsigned short m_short; + unsigned int m_int; + unsigned long m_long; + unsigned long long m_longlong; + float m_float; + double m_double; + long double m_longdouble; +}; + +struct _cffi_freeme_s { + struct _cffi_freeme_s *next; + union _cffi_union_alignment_u alignment; +}; + +_CFFI_UNUSED_FN static int +_cffi_convert_array_argument(struct _cffi_ctypedescr *ctptr, PyObject *arg, + char **output_data, Py_ssize_t datasize, + struct _cffi_freeme_s **freeme) +{ + char *p; + if (datasize < 0) + return -1; + + p = *output_data; + if (p == NULL) { + struct _cffi_freeme_s *fp = (struct _cffi_freeme_s *)PyObject_Malloc( + offsetof(struct _cffi_freeme_s, alignment) + (size_t)datasize); + if (fp == NULL) + return -1; + fp->next = *freeme; + *freeme = fp; + p = *output_data = (char *)&fp->alignment; + } + memset((void *)p, 0, (size_t)datasize); + return _cffi_convert_array_from_object(p, ctptr, arg); +} + +_CFFI_UNUSED_FN static void +_cffi_free_array_arguments(struct _cffi_freeme_s *freeme) +{ + do { + void *p = (void *)freeme; + freeme = freeme->next; + PyObject_Free(p); + } while (freeme != NULL); +} /********** end CPython-specific section **********/ #else diff -Nru pypy-7.1.1+dfsg/lib_pypy/cffi/cparser.py pypy-7.3.1+dfsg/lib_pypy/cffi/cparser.py --- pypy-7.1.1+dfsg/lib_pypy/cffi/cparser.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/cffi/cparser.py 2020-04-10 19:28:40.000000000 +0000 @@ -145,12 +145,23 @@ return ''.join(parts) def _warn_for_string_literal(csource): - if '"' in csource: + if '"' not in csource: + return + for line in csource.splitlines(): + if '"' in line and not line.lstrip().startswith('#'): + import warnings + warnings.warn("String literal found in cdef() or type source. " + "String literals are ignored here, but you should " + "remove them anyway because some character sequences " + "confuse pre-parsing.") + break + +def _warn_for_non_extern_non_static_global_variable(decl): + if not decl.storage: import warnings - warnings.warn("String literal found in cdef() or type source. " - "String literals are ignored here, but you should " - "remove them anyway because some character sequences " - "confuse pre-parsing.") + warnings.warn("Global variable '%s' in cdef(): for consistency " + "with C it should have a storage class specifier " + "(usually 'extern')" % (decl.name,)) def _preprocess(csource): # Remove comments. NOTE: this only work because the cdef() section @@ -502,6 +513,7 @@ if (quals & model.Q_CONST) and not tp.is_array_type: self._declare('constant ' + decl.name, tp, quals=quals) else: + _warn_for_non_extern_non_static_global_variable(decl) self._declare('variable ' + decl.name, tp, quals=quals) def parse_type(self, cdecl): @@ -858,19 +870,39 @@ "the actual array length in this context" % exprnode.coord.line) # - if (isinstance(exprnode, pycparser.c_ast.BinaryOp) and - exprnode.op == '+'): - return (self._parse_constant(exprnode.left) + - self._parse_constant(exprnode.right)) - # - if (isinstance(exprnode, pycparser.c_ast.BinaryOp) and - exprnode.op == '-'): - return (self._parse_constant(exprnode.left) - - self._parse_constant(exprnode.right)) + if isinstance(exprnode, pycparser.c_ast.BinaryOp): + left = self._parse_constant(exprnode.left) + right = self._parse_constant(exprnode.right) + if exprnode.op == '+': + return left + right + elif exprnode.op == '-': + return left - right + elif exprnode.op == '*': + return left * right + elif exprnode.op == '/': + return self._c_div(left, right) + elif exprnode.op == '%': + return left - self._c_div(left, right) * right + elif exprnode.op == '<<': + return left << right + elif exprnode.op == '>>': + return left >> right + elif exprnode.op == '&': + return left & right + elif exprnode.op == '|': + return left | right + elif exprnode.op == '^': + return left ^ right # raise FFIError(":%d: unsupported expression: expected a " "simple numeric constant" % exprnode.coord.line) + def _c_div(self, a, b): + result = a // b + if ((a < 0) ^ (b < 0)) and (a % b) != 0: + result += 1 + return result + def _build_enum_type(self, explicit_name, decls): if decls is not None: partial = False diff -Nru pypy-7.1.1+dfsg/lib_pypy/cffi/_embedding.h pypy-7.3.1+dfsg/lib_pypy/cffi/_embedding.h --- pypy-7.1.1+dfsg/lib_pypy/cffi/_embedding.h 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/cffi/_embedding.h 2020-04-10 19:28:40.000000000 +0000 @@ -145,6 +145,7 @@ int result; PyGILState_STATE state; PyObject *pycode=NULL, *global_dict=NULL, *x; + PyObject *builtins; state = PyGILState_Ensure(); @@ -169,7 +170,7 @@ global_dict = PyDict_New(); if (global_dict == NULL) goto error; - PyObject *builtins = PyEval_GetBuiltins(); + builtins = PyEval_GetBuiltins(); if (builtins == NULL) goto error; if (PyDict_SetItemString(global_dict, "__builtins__", builtins) < 0) @@ -223,7 +224,7 @@ if (f != NULL && f != Py_None) { PyFile_WriteString("\nFrom: " _CFFI_MODULE_NAME - "\ncompiled with cffi version: 1.12.3" + "\ncompiled with cffi version: 1.14.0" "\n_cffi_backend module: ", f); modules = PyImport_GetModuleDict(); mod = PyDict_GetItemString(modules, "_cffi_backend"); @@ -326,13 +327,15 @@ #endif /* call Py_InitializeEx() */ - { - PyGILState_STATE state = PyGILState_UNLOCKED; - if (!Py_IsInitialized()) - _cffi_py_initialize(); - else - state = PyGILState_Ensure(); - + if (!Py_IsInitialized()) { + _cffi_py_initialize(); + PyEval_InitThreads(); + PyEval_SaveThread(); /* release the GIL */ + /* the returned tstate must be the one that has been stored into the + autoTLSkey by _PyGILState_Init() called from Py_Initialize(). */ + } + else { + PyGILState_STATE state = PyGILState_Ensure(); PyEval_InitThreads(); PyGILState_Release(state); } diff -Nru pypy-7.1.1+dfsg/lib_pypy/cffi/__init__.py pypy-7.3.1+dfsg/lib_pypy/cffi/__init__.py --- pypy-7.1.1+dfsg/lib_pypy/cffi/__init__.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/cffi/__init__.py 2020-04-10 19:28:40.000000000 +0000 @@ -5,8 +5,8 @@ from .error import CDefError, FFIError, VerificationError, VerificationMissing from .error import PkgConfigError -__version__ = "1.12.3" -__version_info__ = (1, 12, 3) +__version__ = "1.14.0" +__version_info__ = (1, 14, 0) # The verifier module file names are based on the CRC32 of a string that # contains the following version number. It may be older than __version__ diff -Nru pypy-7.1.1+dfsg/lib_pypy/cffi/_pycparser/_ast_gen.py pypy-7.3.1+dfsg/lib_pypy/cffi/_pycparser/_ast_gen.py --- pypy-7.1.1+dfsg/lib_pypy/cffi/_pycparser/_ast_gen.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/cffi/_pycparser/_ast_gen.py 2020-04-10 19:28:40.000000000 +0000 @@ -7,7 +7,7 @@ # The design of this module was inspired by astgen.py from the # Python 2.5 code-base. # -# Copyright (C) 2008-2015, Eli Bendersky +# Eli Bendersky [https://eli.thegreenplace.net/] # License: BSD #----------------------------------------------------------------- import pprint @@ -63,6 +63,7 @@ contents: a list of contents - attributes and child nodes See comment at the top of the configuration file for details. """ + def __init__(self, name, contents): self.name = name self.all_entries = [] @@ -84,6 +85,8 @@ def generate_source(self): src = self._gen_init() src += '\n' + self._gen_children() + src += '\n' + self._gen_iter() + src += '\n' + self._gen_attr_names() return src @@ -131,6 +134,33 @@ return src + def _gen_iter(self): + src = ' def __iter__(self):\n' + + if self.all_entries: + for child in self.child: + src += ( + ' if self.%(child)s is not None:\n' + + ' yield self.%(child)s\n') % (dict(child=child)) + + for seq_child in self.seq_child: + src += ( + ' for child in (self.%(child)s or []):\n' + ' yield child\n') % (dict(child=seq_child)) + + if not (self.child or self.seq_child): + # Empty generator + src += ( + ' return\n' + + ' yield\n') + else: + # Empty generator + src += ( + ' return\n' + + ' yield\n') + + return src + def _gen_attr_names(self): src = " attr_names = (" + ''.join("%r, " % nm for nm in self.attr) + ')' return src @@ -150,7 +180,7 @@ # # AST Node classes. # -# Copyright (C) 2008-2015, Eli Bendersky +# Eli Bendersky [https://eli.thegreenplace.net/] # License: BSD #----------------------------------------------------------------- @@ -159,11 +189,38 @@ _PROLOGUE_CODE = r''' import sys +def _repr(obj): + """ + Get the representation of an object, with dedicated pprint-like format for lists. + """ + if isinstance(obj, list): + return '[' + (',\n '.join((_repr(e).replace('\n', '\n ') for e in obj))) + '\n]' + else: + return repr(obj) class Node(object): __slots__ = () """ Abstract base class for AST nodes. """ + def __repr__(self): + """ Generates a python representation of the current node + """ + result = self.__class__.__name__ + '(' + + indent = '' + separator = '' + for name in self.__slots__[:-2]: + result += separator + result += indent + result += name + '=' + (_repr(getattr(self, name)).replace('\n', '\n ' + (' ' * (len(name) + len(self.__class__.__name__))))) + + separator = ',' + indent = '\n ' + (' ' * len(self.__class__.__name__)) + + result += indent + ')' + + return result + def children(self): """ A sequence of all children that are Nodes """ @@ -253,26 +310,29 @@ * Modeled after Python's own AST visiting facilities (the ast module of Python 3.0) """ + + _method_cache = None + def visit(self, node): """ Visit a node. """ - method = 'visit_' + node.__class__.__name__ - visitor = getattr(self, method, self.generic_visit) + + if self._method_cache is None: + self._method_cache = {} + + visitor = self._method_cache.get(node.__class__.__name__, None) + if visitor is None: + method = 'visit_' + node.__class__.__name__ + visitor = getattr(self, method, self.generic_visit) + self._method_cache[node.__class__.__name__] = visitor + return visitor(node) def generic_visit(self, node): """ Called if no explicit visitor function exists for a node. Implements preorder visiting of the node. """ - for c_name, c in node.children(): + for c in node: self.visit(c) - ''' - - -if __name__ == "__main__": - import sys - ast_gen = ASTCodeGenerator('_c_ast.cfg') - ast_gen.generate(open('c_ast.py', 'w')) - diff -Nru pypy-7.1.1+dfsg/lib_pypy/cffi/_pycparser/ast_transforms.py pypy-7.3.1+dfsg/lib_pypy/cffi/_pycparser/ast_transforms.py --- pypy-7.1.1+dfsg/lib_pypy/cffi/_pycparser/ast_transforms.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/cffi/_pycparser/ast_transforms.py 2020-04-10 19:28:40.000000000 +0000 @@ -3,7 +3,7 @@ # # Some utilities used by the parser to create a friendlier AST. # -# Copyright (C) 2008-2015, Eli Bendersky +# Eli Bendersky [https://eli.thegreenplace.net/] # License: BSD #------------------------------------------------------------------------------ @@ -43,7 +43,7 @@ Default: break - The goal of this transform it to fix this mess, turning it into the + The goal of this transform is to fix this mess, turning it into the following: Switch @@ -74,7 +74,8 @@ # Goes over the children of the Compound below the Switch, adding them # either directly below new_compound or below the last Case as appropriate - for child in switch_node.stmt.block_items: + # (for `switch(cond) {}`, block_items would have been None) + for child in (switch_node.stmt.block_items or []): if isinstance(child, (c_ast.Case, c_ast.Default)): # If it's a Case/Default: # 1. Add it to the Compound and mark as "last case" diff -Nru pypy-7.1.1+dfsg/lib_pypy/cffi/_pycparser/_build_tables.py pypy-7.3.1+dfsg/lib_pypy/cffi/_pycparser/_build_tables.py --- pypy-7.1.1+dfsg/lib_pypy/cffi/_pycparser/_build_tables.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/cffi/_pycparser/_build_tables.py 2020-04-10 19:28:40.000000000 +0000 @@ -6,17 +6,21 @@ # Also generates AST code from the configuration file. # Should be called from the pycparser directory. # -# Copyright (C) 2008-2015, Eli Bendersky +# Eli Bendersky [https://eli.thegreenplace.net/] # License: BSD #----------------------------------------------------------------- +# Insert '.' and '..' as first entries to the search path for modules. +# Restricted environments like embeddable python do not include the +# current working directory on startup. +import sys +sys.path[0:0] = ['.', '..'] + # Generate c_ast.py from _ast_gen import ASTCodeGenerator ast_gen = ASTCodeGenerator('_c_ast.cfg') ast_gen.generate(open('c_ast.py', 'w')) -import sys -sys.path[0:0] = ['.', '..'] from pycparser import c_parser # Generates the tables diff -Nru pypy-7.1.1+dfsg/lib_pypy/cffi/_pycparser/_c_ast.cfg pypy-7.3.1+dfsg/lib_pypy/cffi/_pycparser/_c_ast.cfg --- pypy-7.1.1+dfsg/lib_pypy/cffi/_pycparser/_c_ast.cfg 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/cffi/_pycparser/_c_ast.cfg 2020-04-10 19:28:40.000000000 +0000 @@ -9,7 +9,7 @@ # ** - a sequence of child nodes # - an attribute # -# Copyright (C) 2008-2015, Eli Bendersky +# Eli Bendersky [https://eli.thegreenplace.net/] # License: BSD #----------------------------------------------------------------- @@ -187,3 +187,5 @@ Union: [name, decls**] While: [cond*, stmt*] + +Pragma: [string] diff -Nru pypy-7.1.1+dfsg/lib_pypy/cffi/_pycparser/c_ast.py pypy-7.3.1+dfsg/lib_pypy/cffi/_pycparser/c_ast.py --- pypy-7.1.1+dfsg/lib_pypy/cffi/_pycparser/c_ast.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/cffi/_pycparser/c_ast.py 2020-04-10 19:28:40.000000000 +0000 @@ -11,18 +11,45 @@ # # AST Node classes. # -# Copyright (C) 2008-2015, Eli Bendersky +# Eli Bendersky [https://eli.thegreenplace.net/] # License: BSD #----------------------------------------------------------------- import sys +def _repr(obj): + """ + Get the representation of an object, with dedicated pprint-like format for lists. + """ + if isinstance(obj, list): + return '[' + (',\n '.join((_repr(e).replace('\n', '\n ') for e in obj))) + '\n]' + else: + return repr(obj) class Node(object): __slots__ = () """ Abstract base class for AST nodes. """ + def __repr__(self): + """ Generates a python representation of the current node + """ + result = self.__class__.__name__ + '(' + + indent = '' + separator = '' + for name in self.__slots__[:-2]: + result += separator + result += indent + result += name + '=' + (_repr(getattr(self, name)).replace('\n', '\n ' + (' ' * (len(name) + len(self.__class__.__name__))))) + + separator = ',' + indent = '\n ' + (' ' * len(self.__class__.__name__)) + + result += indent + ')' + + return result + def children(self): """ A sequence of all children that are Nodes """ @@ -112,21 +139,31 @@ * Modeled after Python's own AST visiting facilities (the ast module of Python 3.0) """ + + _method_cache = None + def visit(self, node): """ Visit a node. """ - method = 'visit_' + node.__class__.__name__ - visitor = getattr(self, method, self.generic_visit) + + if self._method_cache is None: + self._method_cache = {} + + visitor = self._method_cache.get(node.__class__.__name__, None) + if visitor is None: + method = 'visit_' + node.__class__.__name__ + visitor = getattr(self, method, self.generic_visit) + self._method_cache[node.__class__.__name__] = visitor + return visitor(node) def generic_visit(self, node): """ Called if no explicit visitor function exists for a node. Implements preorder visiting of the node. """ - for c_name, c in node.children(): + for c in node: self.visit(c) - class ArrayDecl(Node): __slots__ = ('type', 'dim', 'dim_quals', 'coord', '__weakref__') def __init__(self, type, dim, dim_quals, coord=None): @@ -141,6 +178,12 @@ if self.dim is not None: nodelist.append(("dim", self.dim)) return tuple(nodelist) + def __iter__(self): + if self.type is not None: + yield self.type + if self.dim is not None: + yield self.dim + attr_names = ('dim_quals', ) class ArrayRef(Node): @@ -156,6 +199,12 @@ if self.subscript is not None: nodelist.append(("subscript", self.subscript)) return tuple(nodelist) + def __iter__(self): + if self.name is not None: + yield self.name + if self.subscript is not None: + yield self.subscript + attr_names = () class Assignment(Node): @@ -172,6 +221,12 @@ if self.rvalue is not None: nodelist.append(("rvalue", self.rvalue)) return tuple(nodelist) + def __iter__(self): + if self.lvalue is not None: + yield self.lvalue + if self.rvalue is not None: + yield self.rvalue + attr_names = ('op', ) class BinaryOp(Node): @@ -188,6 +243,12 @@ if self.right is not None: nodelist.append(("right", self.right)) return tuple(nodelist) + def __iter__(self): + if self.left is not None: + yield self.left + if self.right is not None: + yield self.right + attr_names = ('op', ) class Break(Node): @@ -198,6 +259,10 @@ def children(self): return () + def __iter__(self): + return + yield + attr_names = () class Case(Node): @@ -214,6 +279,12 @@ nodelist.append(("stmts[%d]" % i, child)) return tuple(nodelist) + def __iter__(self): + if self.expr is not None: + yield self.expr + for child in (self.stmts or []): + yield child + attr_names = () class Cast(Node): @@ -229,6 +300,12 @@ if self.expr is not None: nodelist.append(("expr", self.expr)) return tuple(nodelist) + def __iter__(self): + if self.to_type is not None: + yield self.to_type + if self.expr is not None: + yield self.expr + attr_names = () class Compound(Node): @@ -243,6 +320,10 @@ nodelist.append(("block_items[%d]" % i, child)) return tuple(nodelist) + def __iter__(self): + for child in (self.block_items or []): + yield child + attr_names = () class CompoundLiteral(Node): @@ -258,6 +339,12 @@ if self.init is not None: nodelist.append(("init", self.init)) return tuple(nodelist) + def __iter__(self): + if self.type is not None: + yield self.type + if self.init is not None: + yield self.init + attr_names = () class Constant(Node): @@ -271,6 +358,10 @@ nodelist = [] return tuple(nodelist) + def __iter__(self): + return + yield + attr_names = ('type', 'value', ) class Continue(Node): @@ -281,6 +372,10 @@ def children(self): return () + def __iter__(self): + return + yield + attr_names = () class Decl(Node): @@ -302,6 +397,14 @@ if self.bitsize is not None: nodelist.append(("bitsize", self.bitsize)) return tuple(nodelist) + def __iter__(self): + if self.type is not None: + yield self.type + if self.init is not None: + yield self.init + if self.bitsize is not None: + yield self.bitsize + attr_names = ('name', 'quals', 'storage', 'funcspec', ) class DeclList(Node): @@ -316,6 +419,10 @@ nodelist.append(("decls[%d]" % i, child)) return tuple(nodelist) + def __iter__(self): + for child in (self.decls or []): + yield child + attr_names = () class Default(Node): @@ -330,6 +437,10 @@ nodelist.append(("stmts[%d]" % i, child)) return tuple(nodelist) + def __iter__(self): + for child in (self.stmts or []): + yield child + attr_names = () class DoWhile(Node): @@ -345,6 +456,12 @@ if self.stmt is not None: nodelist.append(("stmt", self.stmt)) return tuple(nodelist) + def __iter__(self): + if self.cond is not None: + yield self.cond + if self.stmt is not None: + yield self.stmt + attr_names = () class EllipsisParam(Node): @@ -355,6 +472,10 @@ def children(self): return () + def __iter__(self): + return + yield + attr_names = () class EmptyStatement(Node): @@ -365,6 +486,10 @@ def children(self): return () + def __iter__(self): + return + yield + attr_names = () class Enum(Node): @@ -379,6 +504,10 @@ if self.values is not None: nodelist.append(("values", self.values)) return tuple(nodelist) + def __iter__(self): + if self.values is not None: + yield self.values + attr_names = ('name', ) class Enumerator(Node): @@ -393,6 +522,10 @@ if self.value is not None: nodelist.append(("value", self.value)) return tuple(nodelist) + def __iter__(self): + if self.value is not None: + yield self.value + attr_names = ('name', ) class EnumeratorList(Node): @@ -407,6 +540,10 @@ nodelist.append(("enumerators[%d]" % i, child)) return tuple(nodelist) + def __iter__(self): + for child in (self.enumerators or []): + yield child + attr_names = () class ExprList(Node): @@ -421,6 +558,10 @@ nodelist.append(("exprs[%d]" % i, child)) return tuple(nodelist) + def __iter__(self): + for child in (self.exprs or []): + yield child + attr_names = () class FileAST(Node): @@ -435,6 +576,10 @@ nodelist.append(("ext[%d]" % i, child)) return tuple(nodelist) + def __iter__(self): + for child in (self.ext or []): + yield child + attr_names = () class For(Node): @@ -454,6 +599,16 @@ if self.stmt is not None: nodelist.append(("stmt", self.stmt)) return tuple(nodelist) + def __iter__(self): + if self.init is not None: + yield self.init + if self.cond is not None: + yield self.cond + if self.next is not None: + yield self.next + if self.stmt is not None: + yield self.stmt + attr_names = () class FuncCall(Node): @@ -469,6 +624,12 @@ if self.args is not None: nodelist.append(("args", self.args)) return tuple(nodelist) + def __iter__(self): + if self.name is not None: + yield self.name + if self.args is not None: + yield self.args + attr_names = () class FuncDecl(Node): @@ -484,6 +645,12 @@ if self.type is not None: nodelist.append(("type", self.type)) return tuple(nodelist) + def __iter__(self): + if self.args is not None: + yield self.args + if self.type is not None: + yield self.type + attr_names = () class FuncDef(Node): @@ -502,6 +669,14 @@ nodelist.append(("param_decls[%d]" % i, child)) return tuple(nodelist) + def __iter__(self): + if self.decl is not None: + yield self.decl + if self.body is not None: + yield self.body + for child in (self.param_decls or []): + yield child + attr_names = () class Goto(Node): @@ -514,6 +689,10 @@ nodelist = [] return tuple(nodelist) + def __iter__(self): + return + yield + attr_names = ('name', ) class ID(Node): @@ -526,6 +705,10 @@ nodelist = [] return tuple(nodelist) + def __iter__(self): + return + yield + attr_names = ('name', ) class IdentifierType(Node): @@ -538,6 +721,10 @@ nodelist = [] return tuple(nodelist) + def __iter__(self): + return + yield + attr_names = ('names', ) class If(Node): @@ -555,6 +742,14 @@ if self.iffalse is not None: nodelist.append(("iffalse", self.iffalse)) return tuple(nodelist) + def __iter__(self): + if self.cond is not None: + yield self.cond + if self.iftrue is not None: + yield self.iftrue + if self.iffalse is not None: + yield self.iffalse + attr_names = () class InitList(Node): @@ -569,6 +764,10 @@ nodelist.append(("exprs[%d]" % i, child)) return tuple(nodelist) + def __iter__(self): + for child in (self.exprs or []): + yield child + attr_names = () class Label(Node): @@ -583,6 +782,10 @@ if self.stmt is not None: nodelist.append(("stmt", self.stmt)) return tuple(nodelist) + def __iter__(self): + if self.stmt is not None: + yield self.stmt + attr_names = ('name', ) class NamedInitializer(Node): @@ -599,6 +802,12 @@ nodelist.append(("name[%d]" % i, child)) return tuple(nodelist) + def __iter__(self): + if self.expr is not None: + yield self.expr + for child in (self.name or []): + yield child + attr_names = () class ParamList(Node): @@ -613,6 +822,10 @@ nodelist.append(("params[%d]" % i, child)) return tuple(nodelist) + def __iter__(self): + for child in (self.params or []): + yield child + attr_names = () class PtrDecl(Node): @@ -627,6 +840,10 @@ if self.type is not None: nodelist.append(("type", self.type)) return tuple(nodelist) + def __iter__(self): + if self.type is not None: + yield self.type + attr_names = ('quals', ) class Return(Node): @@ -640,6 +857,10 @@ if self.expr is not None: nodelist.append(("expr", self.expr)) return tuple(nodelist) + def __iter__(self): + if self.expr is not None: + yield self.expr + attr_names = () class Struct(Node): @@ -655,6 +876,10 @@ nodelist.append(("decls[%d]" % i, child)) return tuple(nodelist) + def __iter__(self): + for child in (self.decls or []): + yield child + attr_names = ('name', ) class StructRef(Node): @@ -671,6 +896,12 @@ if self.field is not None: nodelist.append(("field", self.field)) return tuple(nodelist) + def __iter__(self): + if self.name is not None: + yield self.name + if self.field is not None: + yield self.field + attr_names = ('type', ) class Switch(Node): @@ -686,6 +917,12 @@ if self.stmt is not None: nodelist.append(("stmt", self.stmt)) return tuple(nodelist) + def __iter__(self): + if self.cond is not None: + yield self.cond + if self.stmt is not None: + yield self.stmt + attr_names = () class TernaryOp(Node): @@ -703,6 +940,14 @@ if self.iffalse is not None: nodelist.append(("iffalse", self.iffalse)) return tuple(nodelist) + def __iter__(self): + if self.cond is not None: + yield self.cond + if self.iftrue is not None: + yield self.iftrue + if self.iffalse is not None: + yield self.iffalse + attr_names = () class TypeDecl(Node): @@ -718,6 +963,10 @@ if self.type is not None: nodelist.append(("type", self.type)) return tuple(nodelist) + def __iter__(self): + if self.type is not None: + yield self.type + attr_names = ('declname', 'quals', ) class Typedef(Node): @@ -734,6 +983,10 @@ if self.type is not None: nodelist.append(("type", self.type)) return tuple(nodelist) + def __iter__(self): + if self.type is not None: + yield self.type + attr_names = ('name', 'quals', 'storage', ) class Typename(Node): @@ -749,6 +1002,10 @@ if self.type is not None: nodelist.append(("type", self.type)) return tuple(nodelist) + def __iter__(self): + if self.type is not None: + yield self.type + attr_names = ('name', 'quals', ) class UnaryOp(Node): @@ -763,6 +1020,10 @@ if self.expr is not None: nodelist.append(("expr", self.expr)) return tuple(nodelist) + def __iter__(self): + if self.expr is not None: + yield self.expr + attr_names = ('op', ) class Union(Node): @@ -778,6 +1039,10 @@ nodelist.append(("decls[%d]" % i, child)) return tuple(nodelist) + def __iter__(self): + for child in (self.decls or []): + yield child + attr_names = ('name', ) class While(Node): @@ -793,5 +1058,27 @@ if self.stmt is not None: nodelist.append(("stmt", self.stmt)) return tuple(nodelist) + def __iter__(self): + if self.cond is not None: + yield self.cond + if self.stmt is not None: + yield self.stmt + attr_names = () +class Pragma(Node): + __slots__ = ('string', 'coord', '__weakref__') + def __init__(self, string, coord=None): + self.string = string + self.coord = coord + + def children(self): + nodelist = [] + return tuple(nodelist) + + def __iter__(self): + return + yield + + attr_names = ('string', ) + diff -Nru pypy-7.1.1+dfsg/lib_pypy/cffi/_pycparser/c_generator.py pypy-7.3.1+dfsg/lib_pypy/cffi/_pycparser/c_generator.py --- pypy-7.1.1+dfsg/lib_pypy/cffi/_pycparser/c_generator.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/cffi/_pycparser/c_generator.py 2020-04-10 19:28:40.000000000 +0000 @@ -3,7 +3,7 @@ # # C code generator from pycparser AST nodes. # -# Copyright (C) 2008-2015, Eli Bendersky +# Eli Bendersky [https://eli.thegreenplace.net/] # License: BSD #------------------------------------------------------------------------------ from . import c_ast @@ -40,6 +40,12 @@ def visit_ID(self, n): return n.name + def visit_Pragma(self, n): + ret = '#pragma' + if n.string: + ret += ' ' + n.string + return ret + def visit_ArrayRef(self, n): arrref = self._parenthesize_unless_simple(n.name) return arrref + '[' + self.visit(n.subscript) + ']' @@ -113,7 +119,7 @@ return s def visit_Cast(self, n): - s = '(' + self._generate_type(n.to_type) + ')' + s = '(' + self._generate_type(n.to_type, emit_declname=False) + ')' return s + ' ' + self._parenthesize_unless_simple(n.expr) def visit_ExprList(self, n): @@ -129,18 +135,20 @@ return ', '.join(visited_subexprs) def visit_Enum(self, n): - s = 'enum' - if n.name: s += ' ' + n.name - if n.values: - s += ' {' - for i, enumerator in enumerate(n.values.enumerators): - s += enumerator.name - if enumerator.value: - s += ' = ' + self.visit(enumerator.value) - if i != len(n.values.enumerators) - 1: - s += ', ' - s += '}' - return s + return self._generate_struct_union_enum(n, name='enum') + + def visit_Enumerator(self, n): + if not n.value: + return '{indent}{name},\n'.format( + indent=self._make_indent(), + name=n.name, + ) + else: + return '{indent}{name} = {value},\n'.format( + indent=self._make_indent(), + name=n.name, + value=self.visit(n.value), + ) def visit_FuncDef(self, n): decl = self.visit(n.decl) @@ -157,6 +165,8 @@ for ext in n.ext: if isinstance(ext, c_ast.FuncDef): s += self.visit(ext) + elif isinstance(ext, c_ast.Pragma): + s += self.visit(ext) + '\n' else: s += self.visit(ext) + ';\n' return s @@ -170,6 +180,10 @@ s += self._make_indent() + '}\n' return s + def visit_CompoundLiteral(self, n): + return '(' + self.visit(n.type) + '){' + self.visit(n.init) + '}' + + def visit_EmptyStatement(self, n): return ';' @@ -188,9 +202,9 @@ return 'continue;' def visit_TernaryOp(self, n): - s = self._visit_expr(n.cond) + ' ? ' - s += self._visit_expr(n.iftrue) + ' : ' - s += self._visit_expr(n.iffalse) + s = '(' + self._visit_expr(n.cond) + ') ? ' + s += '(' + self._visit_expr(n.iftrue) + ') : ' + s += '(' + self._visit_expr(n.iffalse) + ')' return s def visit_If(self, n): @@ -256,43 +270,67 @@ return '...' def visit_Struct(self, n): - return self._generate_struct_union(n, 'struct') + return self._generate_struct_union_enum(n, 'struct') def visit_Typename(self, n): return self._generate_type(n.type) def visit_Union(self, n): - return self._generate_struct_union(n, 'union') + return self._generate_struct_union_enum(n, 'union') def visit_NamedInitializer(self, n): s = '' for name in n.name: if isinstance(name, c_ast.ID): s += '.' + name.name - elif isinstance(name, c_ast.Constant): - s += '[' + name.value + ']' - s += ' = ' + self.visit(n.expr) + else: + s += '[' + self.visit(name) + ']' + s += ' = ' + self._visit_expr(n.expr) return s def visit_FuncDecl(self, n): return self._generate_type(n) - def _generate_struct_union(self, n, name): - """ Generates code for structs and unions. name should be either - 'struct' or union. + def visit_ArrayDecl(self, n): + return self._generate_type(n, emit_declname=False) + + def visit_TypeDecl(self, n): + return self._generate_type(n, emit_declname=False) + + def visit_PtrDecl(self, n): + return self._generate_type(n, emit_declname=False) + + def _generate_struct_union_enum(self, n, name): + """ Generates code for structs, unions, and enums. name should be + 'struct', 'union', or 'enum'. """ + if name in ('struct', 'union'): + members = n.decls + body_function = self._generate_struct_union_body + else: + assert name == 'enum' + members = None if n.values is None else n.values.enumerators + body_function = self._generate_enum_body s = name + ' ' + (n.name or '') - if n.decls: + if members is not None: + # None means no members + # Empty sequence means an empty list of members s += '\n' s += self._make_indent() self.indent_level += 2 s += '{\n' - for decl in n.decls: - s += self._generate_stmt(decl) + s += body_function(members) self.indent_level -= 2 s += self._make_indent() + '}' return s + def _generate_struct_union_body(self, members): + return ''.join(self._generate_stmt(decl) for decl in members) + + def _generate_enum_body(self, members): + # `[:-2] + '\n'` removes the final `,` from the enumerator list + return ''.join(self.visit(value) for value in members)[:-2] + '\n' + def _generate_stmt(self, n, add_indent=False): """ Generation from a statement node. This method exists as a wrapper for individual visit_* methods to handle different treatment of @@ -330,7 +368,7 @@ s += self._generate_type(n.type) return s - def _generate_type(self, n, modifiers=[]): + def _generate_type(self, n, modifiers=[], emit_declname = True): """ Recursive generation from a type node. n is the type node. modifiers collects the PtrDecl, ArrayDecl and FuncDecl modifiers encountered on the way down to a TypeDecl, to allow proper @@ -344,23 +382,29 @@ if n.quals: s += ' '.join(n.quals) + ' ' s += self.visit(n.type) - nstr = n.declname if n.declname else '' + nstr = n.declname if n.declname and emit_declname else '' # Resolve modifiers. # Wrap in parens to distinguish pointer to array and pointer to # function syntax. # for i, modifier in enumerate(modifiers): if isinstance(modifier, c_ast.ArrayDecl): - if (i != 0 and isinstance(modifiers[i - 1], c_ast.PtrDecl)): - nstr = '(' + nstr + ')' - nstr += '[' + self.visit(modifier.dim) + ']' + if (i != 0 and + isinstance(modifiers[i - 1], c_ast.PtrDecl)): + nstr = '(' + nstr + ')' + nstr += '[' + if modifier.dim_quals: + nstr += ' '.join(modifier.dim_quals) + ' ' + nstr += self.visit(modifier.dim) + ']' elif isinstance(modifier, c_ast.FuncDecl): - if (i != 0 and isinstance(modifiers[i - 1], c_ast.PtrDecl)): - nstr = '(' + nstr + ')' + if (i != 0 and + isinstance(modifiers[i - 1], c_ast.PtrDecl)): + nstr = '(' + nstr + ')' nstr += '(' + self.visit(modifier.args) + ')' elif isinstance(modifier, c_ast.PtrDecl): if modifier.quals: - nstr = '* %s %s' % (' '.join(modifier.quals), nstr) + nstr = '* %s%s' % (' '.join(modifier.quals), + ' ' + nstr if nstr else '') else: nstr = '*' + nstr if nstr: s += ' ' + nstr @@ -368,11 +412,12 @@ elif typ == c_ast.Decl: return self._generate_decl(n.type) elif typ == c_ast.Typename: - return self._generate_type(n.type) + return self._generate_type(n.type, emit_declname = emit_declname) elif typ == c_ast.IdentifierType: return ' '.join(n.names) + ' ' elif typ in (c_ast.ArrayDecl, c_ast.PtrDecl, c_ast.FuncDecl): - return self._generate_type(n.type, modifiers + [n]) + return self._generate_type(n.type, modifiers + [n], + emit_declname = emit_declname) else: return self.visit(n) @@ -395,5 +440,5 @@ """ Returns True for nodes that are "simple" - i.e. nodes that always have higher precedence than operators. """ - return isinstance(n,( c_ast.Constant, c_ast.ID, c_ast.ArrayRef, - c_ast.StructRef, c_ast.FuncCall)) + return isinstance(n, (c_ast.Constant, c_ast.ID, c_ast.ArrayRef, + c_ast.StructRef, c_ast.FuncCall)) diff -Nru pypy-7.1.1+dfsg/lib_pypy/cffi/_pycparser/c_lexer.py pypy-7.3.1+dfsg/lib_pypy/cffi/_pycparser/c_lexer.py --- pypy-7.1.1+dfsg/lib_pypy/cffi/_pycparser/c_lexer.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/cffi/_pycparser/c_lexer.py 2020-04-10 19:28:40.000000000 +0000 @@ -3,7 +3,7 @@ # # CLexer class: lexer for the C language # -# Copyright (C) 2008-2015, Eli Bendersky +# Eli Bendersky [https://eli.thegreenplace.net/] # License: BSD #------------------------------------------------------------------------------ import re @@ -19,7 +19,7 @@ tokens. The public attribute filename can be set to an initial - filaneme, but the lexer will update it upon #line + filename, but the lexer will update it upon #line directives. """ def __init__(self, error_func, on_lbrace_func, on_rbrace_func, @@ -52,8 +52,8 @@ # Allow either "# line" or "# " to support GCC's # cpp output # - self.line_pattern = re.compile('([ \t]*line\W)|([ \t]*\d+)') - self.pragma_pattern = re.compile('[ \t]*pragma\W') + self.line_pattern = re.compile(r'([ \t]*line\W)|([ \t]*\d+)') + self.pragma_pattern = re.compile(r'[ \t]*pragma\W') def build(self, **kwargs): """ Builds the lexer from the specification. Must be @@ -102,11 +102,11 @@ keywords = ( '_BOOL', '_COMPLEX', 'AUTO', 'BREAK', 'CASE', 'CHAR', 'CONST', 'CONTINUE', 'DEFAULT', 'DO', 'DOUBLE', 'ELSE', 'ENUM', 'EXTERN', - 'FLOAT', 'FOR', 'GOTO', 'IF', 'INLINE', 'INT', 'LONG', + 'FLOAT', 'FOR', 'GOTO', 'IF', 'INLINE', 'INT', 'LONG', 'REGISTER', 'OFFSETOF', 'RESTRICT', 'RETURN', 'SHORT', 'SIGNED', 'SIZEOF', 'STATIC', 'STRUCT', 'SWITCH', 'TYPEDEF', 'UNION', 'UNSIGNED', 'VOID', - 'VOLATILE', 'WHILE', + 'VOLATILE', 'WHILE', '__INT128', ) keyword_map = {} @@ -130,7 +130,7 @@ 'TYPEID', # constants - 'INT_CONST_DEC', 'INT_CONST_OCT', 'INT_CONST_HEX', 'INT_CONST_BIN', + 'INT_CONST_DEC', 'INT_CONST_OCT', 'INT_CONST_HEX', 'INT_CONST_BIN', 'INT_CONST_CHAR', 'FLOAT_CONST', 'HEX_FLOAT_CONST', 'CHAR_CONST', 'WCHAR_CONST', @@ -171,7 +171,9 @@ 'ELLIPSIS', # pre-processor - 'PPHASH', # '#' + 'PPHASH', # '#' + 'PPPRAGMA', # 'pragma' + 'PPPRAGMASTR', ) ## @@ -203,20 +205,46 @@ # parse all correct code, even if it means to sometimes parse incorrect # code. # - simple_escape = r"""([a-zA-Z._~!=&\^\-\\?'"])""" - decimal_escape = r"""(\d+)""" - hex_escape = r"""(x[0-9a-fA-F]+)""" - bad_escape = r"""([\\][^a-zA-Z._~^!=&\^\-\\?'"x0-7])""" + # The original regexes were taken verbatim from the C syntax definition, + # and were later modified to avoid worst-case exponential running time. + # + # simple_escape = r"""([a-zA-Z._~!=&\^\-\\?'"])""" + # decimal_escape = r"""(\d+)""" + # hex_escape = r"""(x[0-9a-fA-F]+)""" + # bad_escape = r"""([\\][^a-zA-Z._~^!=&\^\-\\?'"x0-7])""" + # + # The following modifications were made to avoid the ambiguity that allowed backtracking: + # (https://github.com/eliben/pycparser/issues/61) + # + # - \x was removed from simple_escape, unless it was not followed by a hex digit, to avoid ambiguity with hex_escape. + # - hex_escape allows one or more hex characters, but requires that the next character(if any) is not hex + # - decimal_escape allows one or more decimal characters, but requires that the next character(if any) is not a decimal + # - bad_escape does not allow any decimals (8-9), to avoid conflicting with the permissive decimal_escape. + # + # Without this change, python's `re` module would recursively try parsing each ambiguous escape sequence in multiple ways. + # e.g. `\123` could be parsed as `\1`+`23`, `\12`+`3`, and `\123`. + + simple_escape = r"""([a-wyzA-Z._~!=&\^\-\\?'"]|x(?![0-9a-fA-F]))""" + decimal_escape = r"""(\d+)(?!\d)""" + hex_escape = r"""(x[0-9a-fA-F]+)(?![0-9a-fA-F])""" + bad_escape = r"""([\\][^a-zA-Z._~^!=&\^\-\\?'"x0-9])""" escape_sequence = r"""(\\("""+simple_escape+'|'+decimal_escape+'|'+hex_escape+'))' + + # This complicated regex with lookahead might be slow for strings, so because all of the valid escapes (including \x) allowed + # 0 or more non-escaped characters after the first character, simple_escape+decimal_escape+hex_escape got simplified to + + escape_sequence_start_in_string = r"""(\\[0-9a-zA-Z._~!=&\^\-\\?'"])""" + cconst_char = r"""([^'\\\n]|"""+escape_sequence+')' char_const = "'"+cconst_char+"'" wchar_const = 'L'+char_const + multicharacter_constant = "'"+cconst_char+"{2,4}'" unmatched_quote = "('"+cconst_char+"*\\n)|('"+cconst_char+"*$)" bad_char_const = r"""('"""+cconst_char+"""[^'\n]+')|('')|('"""+bad_escape+r"""[^'\n]*')""" # string literals (K&R2: A.2.6) - string_char = r"""([^"\\\n]|"""+escape_sequence+')' + string_char = r"""([^"\\\n]|"""+escape_sequence_start_in_string+')' string_literal = '"'+string_char+'*"' wstring_literal = 'L'+string_literal bad_string_literal = '"'+string_char+'*'+bad_escape+string_char+'*"' @@ -274,7 +302,6 @@ def t_ppline_NEWLINE(self, t): r'\n' - if self.pp_line is None: self._error('line number missing in #line', t) else: @@ -304,15 +331,14 @@ def t_pppragma_PPPRAGMA(self, t): r'pragma' - pass + return t - t_pppragma_ignore = ' \t<>.-{}();=+-*/$%@&^~!?:,0123456789' + t_pppragma_ignore = ' \t' - @TOKEN(string_literal) - def t_pppragma_STR(self, t): pass - - @TOKEN(identifier) - def t_pppragma_ID(self, t): pass + def t_pppragma_STR(self, t): + '.+' + t.type = 'PPPRAGMASTR' + return t def t_pppragma_error(self, t): self._error('invalid #pragma directive', t) @@ -443,6 +469,10 @@ # Must come before bad_char_const, to prevent it from # catching valid char constants as invalid # + @TOKEN(multicharacter_constant) + def t_INT_CONST_CHAR(self, t): + return t + @TOKEN(char_const) def t_CHAR_CONST(self, t): return t @@ -482,4 +512,3 @@ def t_error(self, t): msg = 'Illegal character %s' % repr(t.value[0]) self._error(msg, t) - diff -Nru pypy-7.1.1+dfsg/lib_pypy/cffi/_pycparser/c_parser.py pypy-7.3.1+dfsg/lib_pypy/cffi/_pycparser/c_parser.py --- pypy-7.1.1+dfsg/lib_pypy/cffi/_pycparser/c_parser.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/cffi/_pycparser/c_parser.py 2020-04-10 19:28:40.000000000 +0000 @@ -3,7 +3,7 @@ # # CParser class: Parser and AST builder for the C language # -# Copyright (C) 2008-2015, Eli Bendersky +# Eli Bendersky [https://eli.thegreenplace.net/] # License: BSD #------------------------------------------------------------------------------ import re @@ -12,14 +12,16 @@ from . import c_ast from .c_lexer import CLexer -from .plyparser import PLYParser, Coord, ParseError +from .plyparser import PLYParser, Coord, ParseError, parameterized, template from .ast_transforms import fix_switch_cases +@template class CParser(PLYParser): def __init__( self, lex_optimize=True, + lexer=CLexer, lextab='cffi._pycparser.lextab', yacc_optimize=True, yacctab='cffi._pycparser.yacctab', @@ -42,6 +44,10 @@ to save the re-generation of the lexer table on each run. + lexer: + Set this parameter to define the lexer to use if + you're not using the default CLexer. + lextab: Points to the lex table that's used for optimized mode. Only if you're modifying the lexer and want @@ -70,7 +76,7 @@ Set this parameter to control the location of generated lextab and yacctab files. """ - self.clex = CLexer( + self.clex = lexer( error_func=self._lex_error_func, on_lbrace_func=self._lex_on_lbrace_func, on_rbrace_func=self._lex_on_rbrace_func, @@ -86,14 +92,14 @@ 'abstract_declarator', 'assignment_expression', 'declaration_list', - 'declaration_specifiers', + 'declaration_specifiers_no_type', 'designation', 'expression', 'identifier_list', 'init_declarator_list', + 'id_init_declarator_list', 'initializer_list', 'parameter_type_list', - 'specifier_qualifier_list', 'block_item_list', 'type_qualifier_list', 'struct_declarator_list' @@ -342,7 +348,7 @@ coord=typename[0].coord) return decl - def _add_declaration_specifier(self, declspec, newspec, kind): + def _add_declaration_specifier(self, declspec, newspec, kind, append=False): """ Declaration specifiers are represented by a dictionary with the entries: * qual: a list of type qualifiers @@ -352,11 +358,18 @@ This method is given a declaration specifier, and a new specifier of a given kind. + If `append` is True, the new specifier is added to the end of + the specifiers list, otherwise it's added at the beginning. Returns the declaration specifier, with the new specifier incorporated. """ spec = declspec or dict(qual=[], storage=[], type=[], function=[]) - spec[kind].insert(0, newspec) + + if append: + spec[kind].append(newspec) + else: + spec[kind].insert(0, newspec) + return spec def _build_declarations(self, spec, decls, typedef_namespace=False): @@ -516,8 +529,7 @@ def p_translation_unit_2(self, p): """ translation_unit : translation_unit external_declaration """ - if p[2] is not None: - p[1].extend(p[2]) + p[1].extend(p[2]) p[0] = p[1] # Declarations always come as lists (because they can be @@ -537,32 +549,42 @@ def p_external_declaration_3(self, p): """ external_declaration : pp_directive + | pppragma_directive """ - p[0] = p[1] + p[0] = [p[1]] def p_external_declaration_4(self, p): """ external_declaration : SEMI """ - p[0] = None + p[0] = [] def p_pp_directive(self, p): """ pp_directive : PPHASH """ self._parse_error('Directives not supported yet', - self._coord(p.lineno(1))) + self._token_coord(p, 1)) + + def p_pppragma_directive(self, p): + """ pppragma_directive : PPPRAGMA + | PPPRAGMA PPPRAGMASTR + """ + if len(p) == 3: + p[0] = c_ast.Pragma(p[2], self._token_coord(p, 2)) + else: + p[0] = c_ast.Pragma("", self._token_coord(p, 1)) # In function definitions, the declarator can be followed by # a declaration list, for old "K&R style" function definitios. # def p_function_definition_1(self, p): - """ function_definition : declarator declaration_list_opt compound_statement + """ function_definition : id_declarator declaration_list_opt compound_statement """ # no declaration specifiers - 'int' becomes the default type spec = dict( qual=[], storage=[], type=[c_ast.IdentifierType(['int'], - coord=self._coord(p.lineno(1)))], + coord=self._token_coord(p, 1))], function=[]) p[0] = self._build_function_definition( @@ -572,7 +594,7 @@ body=p[3]) def p_function_definition_2(self, p): - """ function_definition : declaration_specifiers declarator declaration_list_opt compound_statement + """ function_definition : declaration_specifiers id_declarator declaration_list_opt compound_statement """ spec = p[1] @@ -589,9 +611,63 @@ | selection_statement | iteration_statement | jump_statement + | pppragma_directive """ p[0] = p[1] + # A pragma is generally considered a decorator rather than an actual statement. + # Still, for the purposes of analyzing an abstract syntax tree of C code, + # pragma's should not be ignored and were previously treated as a statement. + # This presents a problem for constructs that take a statement such as labeled_statements, + # selection_statements, and iteration_statements, causing a misleading structure + # in the AST. For example, consider the following C code. + # + # for (int i = 0; i < 3; i++) + # #pragma omp critical + # sum += 1; + # + # This code will compile and execute "sum += 1;" as the body of the for loop. + # Previous implementations of PyCParser would render the AST for this + # block of code as follows: + # + # For: + # DeclList: + # Decl: i, [], [], [] + # TypeDecl: i, [] + # IdentifierType: ['int'] + # Constant: int, 0 + # BinaryOp: < + # ID: i + # Constant: int, 3 + # UnaryOp: p++ + # ID: i + # Pragma: omp critical + # Assignment: += + # ID: sum + # Constant: int, 1 + # + # This AST misleadingly takes the Pragma as the body of the loop and the + # assignment then becomes a sibling of the loop. + # + # To solve edge cases like these, the pragmacomp_or_statement rule groups + # a pragma and its following statement (which would otherwise be orphaned) + # using a compound block, effectively turning the above code into: + # + # for (int i = 0; i < 3; i++) { + # #pragma omp critical + # sum += 1; + # } + def p_pragmacomp_or_statement(self, p): + """ pragmacomp_or_statement : pppragma_directive statement + | statement + """ + if isinstance(p[1], c_ast.Pragma) and len(p) == 3: + p[0] = c_ast.Compound( + block_items=[p[1], p[2]], + coord=self._token_coord(p, 1)) + else: + p[0] = p[1] + # In C, declarations can come several in a line: # int x, *px, romulo = 5; # @@ -603,6 +679,7 @@ # def p_decl_body(self, p): """ decl_body : declaration_specifiers init_declarator_list_opt + | declaration_specifiers_no_type id_init_declarator_list_opt """ spec = p[1] @@ -675,25 +752,57 @@ """ p[0] = p[1] if len(p) == 2 else p[1] + p[2] - def p_declaration_specifiers_1(self, p): - """ declaration_specifiers : type_qualifier declaration_specifiers_opt + # To know when declaration-specifiers end and declarators begin, + # we require declaration-specifiers to have at least one + # type-specifier, and disallow typedef-names after we've seen any + # type-specifier. These are both required by the spec. + # + def p_declaration_specifiers_no_type_1(self, p): + """ declaration_specifiers_no_type : type_qualifier declaration_specifiers_no_type_opt """ p[0] = self._add_declaration_specifier(p[2], p[1], 'qual') + def p_declaration_specifiers_no_type_2(self, p): + """ declaration_specifiers_no_type : storage_class_specifier declaration_specifiers_no_type_opt + """ + p[0] = self._add_declaration_specifier(p[2], p[1], 'storage') + + def p_declaration_specifiers_no_type_3(self, p): + """ declaration_specifiers_no_type : function_specifier declaration_specifiers_no_type_opt + """ + p[0] = self._add_declaration_specifier(p[2], p[1], 'function') + + + def p_declaration_specifiers_1(self, p): + """ declaration_specifiers : declaration_specifiers type_qualifier + """ + p[0] = self._add_declaration_specifier(p[1], p[2], 'qual', append=True) + def p_declaration_specifiers_2(self, p): - """ declaration_specifiers : type_specifier declaration_specifiers_opt + """ declaration_specifiers : declaration_specifiers storage_class_specifier """ - p[0] = self._add_declaration_specifier(p[2], p[1], 'type') + p[0] = self._add_declaration_specifier(p[1], p[2], 'storage', append=True) def p_declaration_specifiers_3(self, p): - """ declaration_specifiers : storage_class_specifier declaration_specifiers_opt + """ declaration_specifiers : declaration_specifiers function_specifier """ - p[0] = self._add_declaration_specifier(p[2], p[1], 'storage') + p[0] = self._add_declaration_specifier(p[1], p[2], 'function', append=True) def p_declaration_specifiers_4(self, p): - """ declaration_specifiers : function_specifier declaration_specifiers_opt + """ declaration_specifiers : declaration_specifiers type_specifier_no_typeid """ - p[0] = self._add_declaration_specifier(p[2], p[1], 'function') + p[0] = self._add_declaration_specifier(p[1], p[2], 'type', append=True) + + def p_declaration_specifiers_5(self, p): + """ declaration_specifiers : type_specifier + """ + p[0] = self._add_declaration_specifier(None, p[1], 'type') + + def p_declaration_specifiers_6(self, p): + """ declaration_specifiers : declaration_specifiers_no_type type_specifier + """ + p[0] = self._add_declaration_specifier(p[1], p[2], 'type', append=True) + def p_storage_class_specifier(self, p): """ storage_class_specifier : AUTO @@ -709,25 +818,27 @@ """ p[0] = p[1] - def p_type_specifier_1(self, p): - """ type_specifier : VOID - | _BOOL - | CHAR - | SHORT - | INT - | LONG - | FLOAT - | DOUBLE - | _COMPLEX - | SIGNED - | UNSIGNED + def p_type_specifier_no_typeid(self, p): + """ type_specifier_no_typeid : VOID + | _BOOL + | CHAR + | SHORT + | INT + | LONG + | FLOAT + | DOUBLE + | _COMPLEX + | SIGNED + | UNSIGNED + | __INT128 """ - p[0] = c_ast.IdentifierType([p[1]], coord=self._coord(p.lineno(1))) + p[0] = c_ast.IdentifierType([p[1]], coord=self._token_coord(p, 1)) - def p_type_specifier_2(self, p): + def p_type_specifier(self, p): """ type_specifier : typedef_name | enum_specifier | struct_or_union_specifier + | type_specifier_no_typeid """ p[0] = p[1] @@ -738,30 +849,12 @@ """ p[0] = p[1] - def p_init_declarator_list_1(self, p): + def p_init_declarator_list(self, p): """ init_declarator_list : init_declarator | init_declarator_list COMMA init_declarator """ p[0] = p[1] + [p[3]] if len(p) == 4 else [p[1]] - # If the code is declaring a variable that was declared a typedef in an - # outer scope, yacc will think the name is part of declaration_specifiers, - # not init_declarator, and will then get confused by EQUALS. Pass None - # up in place of declarator, and handle this at a higher level. - # - def p_init_declarator_list_2(self, p): - """ init_declarator_list : EQUALS initializer - """ - p[0] = [dict(decl=None, init=p[2])] - - # Similarly, if the code contains duplicate typedefs of, for example, - # array types, the array portion will appear as an abstract declarator. - # - def p_init_declarator_list_3(self, p): - """ init_declarator_list : abstract_declarator - """ - p[0] = [dict(decl=p[1], init=None)] - # Returns a {decl= : init=} dictionary # If there's no initializer, uses None # @@ -771,15 +864,40 @@ """ p[0] = dict(decl=p[1], init=(p[3] if len(p) > 2 else None)) + def p_id_init_declarator_list(self, p): + """ id_init_declarator_list : id_init_declarator + | id_init_declarator_list COMMA init_declarator + """ + p[0] = p[1] + [p[3]] if len(p) == 4 else [p[1]] + + def p_id_init_declarator(self, p): + """ id_init_declarator : id_declarator + | id_declarator EQUALS initializer + """ + p[0] = dict(decl=p[1], init=(p[3] if len(p) > 2 else None)) + + # Require at least one type specifier in a specifier-qualifier-list + # def p_specifier_qualifier_list_1(self, p): - """ specifier_qualifier_list : type_qualifier specifier_qualifier_list_opt + """ specifier_qualifier_list : specifier_qualifier_list type_specifier_no_typeid """ - p[0] = self._add_declaration_specifier(p[2], p[1], 'qual') + p[0] = self._add_declaration_specifier(p[1], p[2], 'type', append=True) def p_specifier_qualifier_list_2(self, p): - """ specifier_qualifier_list : type_specifier specifier_qualifier_list_opt + """ specifier_qualifier_list : specifier_qualifier_list type_qualifier + """ + p[0] = self._add_declaration_specifier(p[1], p[2], 'qual', append=True) + + def p_specifier_qualifier_list_3(self, p): + """ specifier_qualifier_list : type_specifier """ - p[0] = self._add_declaration_specifier(p[2], p[1], 'type') + p[0] = self._add_declaration_specifier(None, p[1], 'type') + + def p_specifier_qualifier_list_4(self, p): + """ specifier_qualifier_list : type_qualifier_list type_specifier + """ + spec = dict(qual=p[1], storage=[], type=[], function=[]) + p[0] = self._add_declaration_specifier(spec, p[2], 'type', append=True) # TYPEID is allowed here (and in other struct/enum related tag names), because # struct/enum tags reside in their own namespace and can be named the same as types @@ -789,29 +907,48 @@ | struct_or_union TYPEID """ klass = self._select_struct_union_class(p[1]) + # None means no list of members p[0] = klass( name=p[2], decls=None, - coord=self._coord(p.lineno(2))) + coord=self._token_coord(p, 2)) def p_struct_or_union_specifier_2(self, p): """ struct_or_union_specifier : struct_or_union brace_open struct_declaration_list brace_close + | struct_or_union brace_open brace_close """ klass = self._select_struct_union_class(p[1]) - p[0] = klass( - name=None, - decls=p[3], - coord=self._coord(p.lineno(2))) + if len(p) == 4: + # Empty sequence means an empty list of members + p[0] = klass( + name=None, + decls=[], + coord=self._token_coord(p, 2)) + else: + p[0] = klass( + name=None, + decls=p[3], + coord=self._token_coord(p, 2)) + def p_struct_or_union_specifier_3(self, p): """ struct_or_union_specifier : struct_or_union ID brace_open struct_declaration_list brace_close + | struct_or_union ID brace_open brace_close | struct_or_union TYPEID brace_open struct_declaration_list brace_close + | struct_or_union TYPEID brace_open brace_close """ klass = self._select_struct_union_class(p[1]) - p[0] = klass( - name=p[2], - decls=p[4], - coord=self._coord(p.lineno(2))) + if len(p) == 5: + # Empty sequence means an empty list of members + p[0] = klass( + name=p[2], + decls=[], + coord=self._token_coord(p, 2)) + else: + p[0] = klass( + name=p[2], + decls=p[4], + coord=self._token_coord(p, 2)) def p_struct_or_union(self, p): """ struct_or_union : STRUCT @@ -825,7 +962,10 @@ """ struct_declaration_list : struct_declaration | struct_declaration_list struct_declaration """ - p[0] = p[1] if len(p) == 2 else p[1] + p[2] + if len(p) == 2: + p[0] = p[1] or [] + else: + p[0] = p[1] + (p[2] or []) def p_struct_declaration_1(self, p): """ struct_declaration : specifier_qualifier_list struct_declarator_list_opt SEMI @@ -866,18 +1006,14 @@ p[0] = decls def p_struct_declaration_2(self, p): - """ struct_declaration : specifier_qualifier_list abstract_declarator SEMI + """ struct_declaration : SEMI """ - # "Abstract declarator?!", you ask? Structure members can have the - # same names as typedefs. The trouble is that the member's name gets - # grouped into specifier_qualifier_list, leaving any remainder to - # appear as an abstract declarator, as in: - # typedef int Foo; - # struct { Foo Foo[3]; }; - # - p[0] = self._build_declarations( - spec=p[1], - decls=[dict(decl=p[2], init=None)]) + p[0] = None + + def p_struct_declaration_3(self, p): + """ struct_declaration : pppragma_directive + """ + p[0] = [p[1]] def p_struct_declarator_list(self, p): """ struct_declarator_list : struct_declarator @@ -906,18 +1042,18 @@ """ enum_specifier : ENUM ID | ENUM TYPEID """ - p[0] = c_ast.Enum(p[2], None, self._coord(p.lineno(1))) + p[0] = c_ast.Enum(p[2], None, self._token_coord(p, 1)) def p_enum_specifier_2(self, p): """ enum_specifier : ENUM brace_open enumerator_list brace_close """ - p[0] = c_ast.Enum(None, p[3], self._coord(p.lineno(1))) + p[0] = c_ast.Enum(None, p[3], self._token_coord(p, 1)) def p_enum_specifier_3(self, p): """ enum_specifier : ENUM ID brace_open enumerator_list brace_close | ENUM TYPEID brace_open enumerator_list brace_close """ - p[0] = c_ast.Enum(p[2], p[4], self._coord(p.lineno(1))) + p[0] = c_ast.Enum(p[2], p[4], self._token_coord(p, 1)) def p_enumerator_list(self, p): """ enumerator_list : enumerator @@ -939,56 +1075,52 @@ if len(p) == 2: enumerator = c_ast.Enumerator( p[1], None, - self._coord(p.lineno(1))) + self._token_coord(p, 1)) else: enumerator = c_ast.Enumerator( p[1], p[3], - self._coord(p.lineno(1))) + self._token_coord(p, 1)) self._add_identifier(enumerator.name, enumerator.coord) p[0] = enumerator - def p_declarator_1(self, p): - """ declarator : direct_declarator + def p_declarator(self, p): + """ declarator : id_declarator + | typeid_declarator """ p[0] = p[1] - def p_declarator_2(self, p): - """ declarator : pointer direct_declarator + @parameterized(('id', 'ID'), ('typeid', 'TYPEID'), ('typeid_noparen', 'TYPEID')) + def p_xxx_declarator_1(self, p): + """ xxx_declarator : direct_xxx_declarator """ - p[0] = self._type_modify_decl(p[2], p[1]) + p[0] = p[1] - # Since it's impossible for a type to be specified after a pointer, assume - # it's intended to be the name for this declaration. _add_identifier will - # raise an error if this TYPEID can't be redeclared. - # - def p_declarator_3(self, p): - """ declarator : pointer TYPEID + @parameterized(('id', 'ID'), ('typeid', 'TYPEID'), ('typeid_noparen', 'TYPEID')) + def p_xxx_declarator_2(self, p): + """ xxx_declarator : pointer direct_xxx_declarator """ - decl = c_ast.TypeDecl( - declname=p[2], - type=None, - quals=None, - coord=self._coord(p.lineno(2))) - - p[0] = self._type_modify_decl(decl, p[1]) + p[0] = self._type_modify_decl(p[2], p[1]) - def p_direct_declarator_1(self, p): - """ direct_declarator : ID + @parameterized(('id', 'ID'), ('typeid', 'TYPEID'), ('typeid_noparen', 'TYPEID')) + def p_direct_xxx_declarator_1(self, p): + """ direct_xxx_declarator : yyy """ p[0] = c_ast.TypeDecl( declname=p[1], type=None, quals=None, - coord=self._coord(p.lineno(1))) + coord=self._token_coord(p, 1)) - def p_direct_declarator_2(self, p): - """ direct_declarator : LPAREN declarator RPAREN + @parameterized(('id', 'ID'), ('typeid', 'TYPEID')) + def p_direct_xxx_declarator_2(self, p): + """ direct_xxx_declarator : LPAREN xxx_declarator RPAREN """ p[0] = p[2] - def p_direct_declarator_3(self, p): - """ direct_declarator : direct_declarator LBRACKET type_qualifier_list_opt assignment_expression_opt RBRACKET + @parameterized(('id', 'ID'), ('typeid', 'TYPEID'), ('typeid_noparen', 'TYPEID')) + def p_direct_xxx_declarator_3(self, p): + """ direct_xxx_declarator : direct_xxx_declarator LBRACKET type_qualifier_list_opt assignment_expression_opt RBRACKET """ quals = (p[3] if len(p) > 5 else []) or [] # Accept dimension qualifiers @@ -1001,9 +1133,10 @@ p[0] = self._type_modify_decl(decl=p[1], modifier=arr) - def p_direct_declarator_4(self, p): - """ direct_declarator : direct_declarator LBRACKET STATIC type_qualifier_list_opt assignment_expression RBRACKET - | direct_declarator LBRACKET type_qualifier_list STATIC assignment_expression RBRACKET + @parameterized(('id', 'ID'), ('typeid', 'TYPEID'), ('typeid_noparen', 'TYPEID')) + def p_direct_xxx_declarator_4(self, p): + """ direct_xxx_declarator : direct_xxx_declarator LBRACKET STATIC type_qualifier_list_opt assignment_expression RBRACKET + | direct_xxx_declarator LBRACKET type_qualifier_list STATIC assignment_expression RBRACKET """ # Using slice notation for PLY objects doesn't work in Python 3 for the # version of PLY embedded with pycparser; see PLY Google Code issue 30. @@ -1022,20 +1155,22 @@ # Special for VLAs # - def p_direct_declarator_5(self, p): - """ direct_declarator : direct_declarator LBRACKET type_qualifier_list_opt TIMES RBRACKET + @parameterized(('id', 'ID'), ('typeid', 'TYPEID'), ('typeid_noparen', 'TYPEID')) + def p_direct_xxx_declarator_5(self, p): + """ direct_xxx_declarator : direct_xxx_declarator LBRACKET type_qualifier_list_opt TIMES RBRACKET """ arr = c_ast.ArrayDecl( type=None, - dim=c_ast.ID(p[4], self._coord(p.lineno(4))), + dim=c_ast.ID(p[4], self._token_coord(p, 4)), dim_quals=p[3] if p[3] != None else [], coord=p[1].coord) p[0] = self._type_modify_decl(decl=p[1], modifier=arr) - def p_direct_declarator_6(self, p): - """ direct_declarator : direct_declarator LPAREN parameter_type_list RPAREN - | direct_declarator LPAREN identifier_list_opt RPAREN + @parameterized(('id', 'ID'), ('typeid', 'TYPEID'), ('typeid_noparen', 'TYPEID')) + def p_direct_xxx_declarator_6(self, p): + """ direct_xxx_declarator : direct_xxx_declarator LPAREN parameter_type_list RPAREN + | direct_xxx_declarator LPAREN identifier_list_opt RPAREN """ func = c_ast.FuncDecl( args=p[3], @@ -1065,7 +1200,7 @@ """ pointer : TIMES type_qualifier_list_opt | TIMES type_qualifier_list_opt pointer """ - coord = self._coord(p.lineno(1)) + coord = self._token_coord(p, 1) # Pointer decls nest from inside out. This is important when different # levels have different qualifiers. For example: # @@ -1073,7 +1208,7 @@ # # Means "pointer to const pointer to char" # - # While: + # While: # # char ** const p; # @@ -1102,7 +1237,7 @@ | parameter_list COMMA ELLIPSIS """ if len(p) > 2: - p[1].params.append(c_ast.EllipsisParam(self._coord(p.lineno(3)))) + p[1].params.append(c_ast.EllipsisParam(self._token_coord(p, 3))) p[0] = p[1] @@ -1116,13 +1251,24 @@ p[1].params.append(p[3]) p[0] = p[1] + # From ISO/IEC 9899:TC2, 6.7.5.3.11: + # "If, in a parameter declaration, an identifier can be treated either + # as a typedef name or as a parameter name, it shall be taken as a + # typedef name." + # + # Inside a parameter declaration, once we've reduced declaration specifiers, + # if we shift in an LPAREN and see a TYPEID, it could be either an abstract + # declarator or a declarator nested inside parens. This rule tells us to + # always treat it as an abstract declarator. Therefore, we only accept + # `id_declarator`s and `typeid_noparen_declarator`s. def p_parameter_declaration_1(self, p): - """ parameter_declaration : declaration_specifiers declarator + """ parameter_declaration : declaration_specifiers id_declarator + | declaration_specifiers typeid_noparen_declarator """ spec = p[1] if not spec['type']: spec['type'] = [c_ast.IdentifierType(['int'], - coord=self._coord(p.lineno(1)))] + coord=self._token_coord(p, 1))] p[0] = self._build_declarations( spec=spec, decls=[dict(decl=p[2])])[0] @@ -1133,7 +1279,7 @@ spec = p[1] if not spec['type']: spec['type'] = [c_ast.IdentifierType(['int'], - coord=self._coord(p.lineno(1)))] + coord=self._token_coord(p, 1))] # Parameters can have the same names as typedefs. The trouble is that # the parameter's name gets grouped into declaration_specifiers, making @@ -1152,7 +1298,7 @@ name='', quals=spec['qual'], type=p[2] or c_ast.TypeDecl(None, None, None), - coord=self._coord(p.lineno(2))) + coord=self._token_coord(p, 2)) typename = spec['type'] decl = self._fix_decl_name_type(decl, typename) @@ -1178,7 +1324,7 @@ | brace_open initializer_list COMMA brace_close """ if p[2] is None: - p[0] = c_ast.InitList([], self._coord(p.lineno(1))) + p[0] = c_ast.InitList([], self._token_coord(p, 1)) else: p[0] = p[2] @@ -1217,17 +1363,11 @@ def p_type_name(self, p): """ type_name : specifier_qualifier_list abstract_declarator_opt """ - #~ print '==========' - #~ print p[1] - #~ print p[2] - #~ print p[2].children() - #~ print '==========' - typename = c_ast.Typename( name='', quals=p[1]['qual'], type=p[2] or c_ast.TypeDecl(None, None, None), - coord=self._coord(p.lineno(2))) + coord=self._token_coord(p, 2)) p[0] = self._fix_decl_name_type(typename, p[1]['type']) @@ -1270,20 +1410,21 @@ p[0] = self._type_modify_decl(decl=p[1], modifier=arr) def p_direct_abstract_declarator_3(self, p): - """ direct_abstract_declarator : LBRACKET assignment_expression_opt RBRACKET + """ direct_abstract_declarator : LBRACKET type_qualifier_list_opt assignment_expression_opt RBRACKET """ + quals = (p[2] if len(p) > 4 else []) or [] p[0] = c_ast.ArrayDecl( type=c_ast.TypeDecl(None, None, None), - dim=p[2], - dim_quals=[], - coord=self._coord(p.lineno(1))) + dim=p[3] if len(p) > 4 else p[2], + dim_quals=quals, + coord=self._token_coord(p, 1)) def p_direct_abstract_declarator_4(self, p): """ direct_abstract_declarator : direct_abstract_declarator LBRACKET TIMES RBRACKET """ arr = c_ast.ArrayDecl( type=None, - dim=c_ast.ID(p[3], self._coord(p.lineno(3))), + dim=c_ast.ID(p[3], self._token_coord(p, 3)), dim_quals=[], coord=p[1].coord) @@ -1294,9 +1435,9 @@ """ p[0] = c_ast.ArrayDecl( type=c_ast.TypeDecl(None, None, None), - dim=c_ast.ID(p[3], self._coord(p.lineno(3))), + dim=c_ast.ID(p[3], self._token_coord(p, 3)), dim_quals=[], - coord=self._coord(p.lineno(1))) + coord=self._token_coord(p, 1)) def p_direct_abstract_declarator_6(self, p): """ direct_abstract_declarator : direct_abstract_declarator LPAREN parameter_type_list_opt RPAREN @@ -1314,7 +1455,7 @@ p[0] = c_ast.FuncDecl( args=p[2], type=c_ast.TypeDecl(None, None, None), - coord=self._coord(p.lineno(1))) + coord=self._token_coord(p, 1)) # declaration is a list, statement isn't. To make it consistent, block_item # will always be a list @@ -1338,72 +1479,72 @@ """ compound_statement : brace_open block_item_list_opt brace_close """ p[0] = c_ast.Compound( block_items=p[2], - coord=self._coord(p.lineno(1))) + coord=self._token_coord(p, 1)) def p_labeled_statement_1(self, p): - """ labeled_statement : ID COLON statement """ - p[0] = c_ast.Label(p[1], p[3], self._coord(p.lineno(1))) + """ labeled_statement : ID COLON pragmacomp_or_statement """ + p[0] = c_ast.Label(p[1], p[3], self._token_coord(p, 1)) def p_labeled_statement_2(self, p): - """ labeled_statement : CASE constant_expression COLON statement """ - p[0] = c_ast.Case(p[2], [p[4]], self._coord(p.lineno(1))) + """ labeled_statement : CASE constant_expression COLON pragmacomp_or_statement """ + p[0] = c_ast.Case(p[2], [p[4]], self._token_coord(p, 1)) def p_labeled_statement_3(self, p): - """ labeled_statement : DEFAULT COLON statement """ - p[0] = c_ast.Default([p[3]], self._coord(p.lineno(1))) + """ labeled_statement : DEFAULT COLON pragmacomp_or_statement """ + p[0] = c_ast.Default([p[3]], self._token_coord(p, 1)) def p_selection_statement_1(self, p): - """ selection_statement : IF LPAREN expression RPAREN statement """ - p[0] = c_ast.If(p[3], p[5], None, self._coord(p.lineno(1))) + """ selection_statement : IF LPAREN expression RPAREN pragmacomp_or_statement """ + p[0] = c_ast.If(p[3], p[5], None, self._token_coord(p, 1)) def p_selection_statement_2(self, p): - """ selection_statement : IF LPAREN expression RPAREN statement ELSE statement """ - p[0] = c_ast.If(p[3], p[5], p[7], self._coord(p.lineno(1))) + """ selection_statement : IF LPAREN expression RPAREN statement ELSE pragmacomp_or_statement """ + p[0] = c_ast.If(p[3], p[5], p[7], self._token_coord(p, 1)) def p_selection_statement_3(self, p): - """ selection_statement : SWITCH LPAREN expression RPAREN statement """ + """ selection_statement : SWITCH LPAREN expression RPAREN pragmacomp_or_statement """ p[0] = fix_switch_cases( - c_ast.Switch(p[3], p[5], self._coord(p.lineno(1)))) + c_ast.Switch(p[3], p[5], self._token_coord(p, 1))) def p_iteration_statement_1(self, p): - """ iteration_statement : WHILE LPAREN expression RPAREN statement """ - p[0] = c_ast.While(p[3], p[5], self._coord(p.lineno(1))) + """ iteration_statement : WHILE LPAREN expression RPAREN pragmacomp_or_statement """ + p[0] = c_ast.While(p[3], p[5], self._token_coord(p, 1)) def p_iteration_statement_2(self, p): - """ iteration_statement : DO statement WHILE LPAREN expression RPAREN SEMI """ - p[0] = c_ast.DoWhile(p[5], p[2], self._coord(p.lineno(1))) + """ iteration_statement : DO pragmacomp_or_statement WHILE LPAREN expression RPAREN SEMI """ + p[0] = c_ast.DoWhile(p[5], p[2], self._token_coord(p, 1)) def p_iteration_statement_3(self, p): - """ iteration_statement : FOR LPAREN expression_opt SEMI expression_opt SEMI expression_opt RPAREN statement """ - p[0] = c_ast.For(p[3], p[5], p[7], p[9], self._coord(p.lineno(1))) + """ iteration_statement : FOR LPAREN expression_opt SEMI expression_opt SEMI expression_opt RPAREN pragmacomp_or_statement """ + p[0] = c_ast.For(p[3], p[5], p[7], p[9], self._token_coord(p, 1)) def p_iteration_statement_4(self, p): - """ iteration_statement : FOR LPAREN declaration expression_opt SEMI expression_opt RPAREN statement """ - p[0] = c_ast.For(c_ast.DeclList(p[3], self._coord(p.lineno(1))), - p[4], p[6], p[8], self._coord(p.lineno(1))) + """ iteration_statement : FOR LPAREN declaration expression_opt SEMI expression_opt RPAREN pragmacomp_or_statement """ + p[0] = c_ast.For(c_ast.DeclList(p[3], self._token_coord(p, 1)), + p[4], p[6], p[8], self._token_coord(p, 1)) def p_jump_statement_1(self, p): """ jump_statement : GOTO ID SEMI """ - p[0] = c_ast.Goto(p[2], self._coord(p.lineno(1))) + p[0] = c_ast.Goto(p[2], self._token_coord(p, 1)) def p_jump_statement_2(self, p): """ jump_statement : BREAK SEMI """ - p[0] = c_ast.Break(self._coord(p.lineno(1))) + p[0] = c_ast.Break(self._token_coord(p, 1)) def p_jump_statement_3(self, p): """ jump_statement : CONTINUE SEMI """ - p[0] = c_ast.Continue(self._coord(p.lineno(1))) + p[0] = c_ast.Continue(self._token_coord(p, 1)) def p_jump_statement_4(self, p): """ jump_statement : RETURN expression SEMI | RETURN SEMI """ - p[0] = c_ast.Return(p[2] if len(p) == 4 else None, self._coord(p.lineno(1))) + p[0] = c_ast.Return(p[2] if len(p) == 4 else None, self._token_coord(p, 1)) def p_expression_statement(self, p): """ expression_statement : expression_opt SEMI """ if p[1] is None: - p[0] = c_ast.EmptyStatement(self._coord(p.lineno(1))) + p[0] = c_ast.EmptyStatement(self._token_coord(p, 2)) else: p[0] = p[1] @@ -1422,7 +1563,7 @@ def p_typedef_name(self, p): """ typedef_name : TYPEID """ - p[0] = c_ast.IdentifierType([p[1]], coord=self._coord(p.lineno(1))) + p[0] = c_ast.IdentifierType([p[1]], coord=self._token_coord(p, 1)) def p_assignment_expression(self, p): """ assignment_expression : conditional_expression @@ -1498,7 +1639,7 @@ def p_cast_expression_2(self, p): """ cast_expression : LPAREN type_name RPAREN cast_expression """ - p[0] = c_ast.Cast(p[2], p[4], self._coord(p.lineno(1))) + p[0] = c_ast.Cast(p[2], p[4], self._token_coord(p, 1)) def p_unary_expression_1(self, p): """ unary_expression : postfix_expression """ @@ -1518,7 +1659,7 @@ p[0] = c_ast.UnaryOp( p[1], p[2] if len(p) == 3 else p[3], - self._coord(p.lineno(1))) + self._token_coord(p, 1)) def p_unary_operator(self, p): """ unary_operator : AND @@ -1550,7 +1691,7 @@ | postfix_expression ARROW ID | postfix_expression ARROW TYPEID """ - field = c_ast.ID(p[3], self._coord(p.lineno(3))) + field = c_ast.ID(p[3], self._token_coord(p, 3)) p[0] = c_ast.StructRef(p[1], p[2], field, p[1].coord) def p_postfix_expression_5(self, p): @@ -1584,13 +1725,27 @@ p[0] = p[2] def p_primary_expression_5(self, p): - """ primary_expression : OFFSETOF LPAREN type_name COMMA identifier RPAREN + """ primary_expression : OFFSETOF LPAREN type_name COMMA offsetof_member_designator RPAREN """ - coord = self._coord(p.lineno(1)) + coord = self._token_coord(p, 1) p[0] = c_ast.FuncCall(c_ast.ID(p[1], coord), c_ast.ExprList([p[3], p[5]], coord), coord) + def p_offsetof_member_designator(self, p): + """ offsetof_member_designator : identifier + | offsetof_member_designator PERIOD identifier + | offsetof_member_designator LBRACKET expression RBRACKET + """ + if len(p) == 2: + p[0] = p[1] + elif len(p) == 4: + p[0] = c_ast.StructRef(p[1], p[2], p[3], p[1].coord) + elif len(p) == 5: + p[0] = c_ast.ArrayRef(p[1], p[3], p[1].coord) + else: + raise NotImplementedError("Unexpected parsing state. len(p): %u" % len(p)) + def p_argument_expression_list(self, p): """ argument_expression_list : assignment_expression | argument_expression_list COMMA assignment_expression @@ -1603,30 +1758,54 @@ def p_identifier(self, p): """ identifier : ID """ - p[0] = c_ast.ID(p[1], self._coord(p.lineno(1))) + p[0] = c_ast.ID(p[1], self._token_coord(p, 1)) def p_constant_1(self, p): """ constant : INT_CONST_DEC | INT_CONST_OCT | INT_CONST_HEX | INT_CONST_BIN + | INT_CONST_CHAR """ + uCount = 0 + lCount = 0 + for x in p[1][-3:]: + if x in ('l', 'L'): + lCount += 1 + elif x in ('u', 'U'): + uCount += 1 + t = '' + if uCount > 1: + raise ValueError('Constant cannot have more than one u/U suffix.') + elif lCount > 2: + raise ValueError('Constant cannot have more than two l/L suffix.') + prefix = 'unsigned ' * uCount + 'long ' * lCount p[0] = c_ast.Constant( - 'int', p[1], self._coord(p.lineno(1))) + prefix + 'int', p[1], self._token_coord(p, 1)) def p_constant_2(self, p): """ constant : FLOAT_CONST | HEX_FLOAT_CONST """ + if 'x' in p[1].lower(): + t = 'float' + else: + if p[1][-1] in ('f', 'F'): + t = 'float' + elif p[1][-1] in ('l', 'L'): + t = 'long double' + else: + t = 'double' + p[0] = c_ast.Constant( - 'float', p[1], self._coord(p.lineno(1))) + t, p[1], self._token_coord(p, 1)) def p_constant_3(self, p): """ constant : CHAR_CONST | WCHAR_CONST """ p[0] = c_ast.Constant( - 'char', p[1], self._coord(p.lineno(1))) + 'char', p[1], self._token_coord(p, 1)) # The "unified" string and wstring literal rules are for supporting # concatenation of adjacent string literals. @@ -1639,7 +1818,7 @@ """ if len(p) == 2: # single literal p[0] = c_ast.Constant( - 'string', p[1], self._coord(p.lineno(1))) + 'string', p[1], self._token_coord(p, 1)) else: p[1].value = p[1].value[:-1] + p[2][1:] p[0] = p[1] @@ -1650,7 +1829,7 @@ """ if len(p) == 2: # single literal p[0] = c_ast.Constant( - 'string', p[1], self._coord(p.lineno(1))) + 'string', p[1], self._token_coord(p, 1)) else: p[1].value = p[1].value.rstrip()[:-1] + p[2][2:] p[0] = p[1] @@ -1659,11 +1838,13 @@ """ brace_open : LBRACE """ p[0] = p[1] + p.set_lineno(0, p.lineno(1)) def p_brace_close(self, p): """ brace_close : RBRACE """ p[0] = p[1] + p.set_lineno(0, p.lineno(1)) def p_empty(self, p): 'empty : ' @@ -1679,23 +1860,4 @@ self._coord(lineno=p.lineno, column=self.clex.find_tok_column(p))) else: - self._parse_error('At end of input', '') - - -#------------------------------------------------------------------------------ -if __name__ == "__main__": - import pprint - import time, sys - - #t1 = time.time() - #parser = CParser(lex_optimize=True, yacc_debug=True, yacc_optimize=False) - #sys.write(time.time() - t1) - - #buf = ''' - #int (*k)(int); - #''' - - ## set debuglevel to 2 for debugging - #t = parser.parse(buf, 'x.c', debuglevel=0) - #t.show(showcoord=True) - + self._parse_error('At end of input', self.clex.filename) diff -Nru pypy-7.1.1+dfsg/lib_pypy/cffi/_pycparser/__init__.py pypy-7.3.1+dfsg/lib_pypy/cffi/_pycparser/__init__.py --- pypy-7.1.1+dfsg/lib_pypy/cffi/_pycparser/__init__.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/cffi/_pycparser/__init__.py 2020-04-10 19:28:40.000000000 +0000 @@ -4,12 +4,14 @@ # This package file exports some convenience functions for # interacting with pycparser # -# Copyright (C) 2008-2015, Eli Bendersky +# Eli Bendersky [https://eli.thegreenplace.net/] # License: BSD #----------------------------------------------------------------- __all__ = ['c_lexer', 'c_parser', 'c_ast'] -__version__ = '2.14' +__version__ = '2.20' +import io +from subprocess import check_output from .c_parser import CParser @@ -27,7 +29,6 @@ When successful, returns the preprocessed file's contents. Errors from cpp will be printed out. """ - from subprocess import Popen, PIPE path_list = [cpp_path] if isinstance(cpp_args, list): path_list += cpp_args @@ -38,11 +39,7 @@ try: # Note the use of universal_newlines to treat all newlines # as \n for Python's purpose - # - pipe = Popen( path_list, - stdout=PIPE, - universal_newlines=True) - text = pipe.communicate()[0] + text = check_output(path_list, universal_newlines=True) except OSError as e: raise RuntimeError("Unable to invoke 'cpp'. " + 'Make sure its path was passed correctly\n' + @@ -85,7 +82,7 @@ if use_cpp: text = preprocess_file(filename, cpp_path, cpp_args) else: - with open(filename, 'rU') as f: + with io.open(filename) as f: text = f.read() if parser is None: diff -Nru pypy-7.1.1+dfsg/lib_pypy/cffi/_pycparser/lextab.py pypy-7.3.1+dfsg/lib_pypy/cffi/_pycparser/lextab.py --- pypy-7.1.1+dfsg/lib_pypy/cffi/_pycparser/lextab.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/cffi/_pycparser/lextab.py 2020-04-10 19:28:40.000000000 +0000 @@ -1,9 +1,10 @@ -# pycparser.lextab.py. This file automatically created by PLY (version 3.4). Don't edit! -_tabversion = '3.4' -_lextokens = {'VOID': 1, 'LBRACKET': 1, 'WCHAR_CONST': 1, 'FLOAT_CONST': 1, 'MINUS': 1, 'RPAREN': 1, 'LONG': 1, 'PLUS': 1, 'ELLIPSIS': 1, 'GT': 1, 'GOTO': 1, 'ENUM': 1, 'PERIOD': 1, 'GE': 1, 'INT_CONST_DEC': 1, 'ARROW': 1, 'HEX_FLOAT_CONST': 1, 'DOUBLE': 1, 'MINUSEQUAL': 1, 'INT_CONST_OCT': 1, 'TIMESEQUAL': 1, 'OR': 1, 'SHORT': 1, 'RETURN': 1, 'RSHIFTEQUAL': 1, 'RESTRICT': 1, 'STATIC': 1, 'SIZEOF': 1, 'UNSIGNED': 1, 'UNION': 1, 'COLON': 1, 'WSTRING_LITERAL': 1, 'DIVIDE': 1, 'FOR': 1, 'PLUSPLUS': 1, 'EQUALS': 1, 'ELSE': 1, 'INLINE': 1, 'EQ': 1, 'AND': 1, 'TYPEID': 1, 'LBRACE': 1, 'PPHASH': 1, 'INT': 1, 'SIGNED': 1, 'CONTINUE': 1, 'NOT': 1, 'OREQUAL': 1, 'MOD': 1, 'RSHIFT': 1, 'DEFAULT': 1, 'CHAR': 1, 'WHILE': 1, 'DIVEQUAL': 1, 'EXTERN': 1, 'CASE': 1, 'LAND': 1, 'REGISTER': 1, 'MODEQUAL': 1, 'NE': 1, 'SWITCH': 1, 'INT_CONST_HEX': 1, '_COMPLEX': 1, 'PLUSEQUAL': 1, 'STRUCT': 1, 'CONDOP': 1, 'BREAK': 1, 'VOLATILE': 1, 'ANDEQUAL': 1, 'INT_CONST_BIN': 1, 'DO': 1, 'LNOT': 1, 'CONST': 1, 'LOR': 1, 'CHAR_CONST': 1, 'LSHIFT': 1, 'RBRACE': 1, '_BOOL': 1, 'LE': 1, 'SEMI': 1, 'LT': 1, 'COMMA': 1, 'OFFSETOF': 1, 'TYPEDEF': 1, 'XOR': 1, 'AUTO': 1, 'TIMES': 1, 'LPAREN': 1, 'MINUSMINUS': 1, 'ID': 1, 'IF': 1, 'STRING_LITERAL': 1, 'FLOAT': 1, 'XOREQUAL': 1, 'LSHIFTEQUAL': 1, 'RBRACKET': 1} -_lexreflags = 0 +# lextab.py. This file automatically created by PLY (version 3.10). Don't edit! +_tabversion = '3.10' +_lextokens = set(('_BOOL', '_COMPLEX', 'AUTO', 'BREAK', 'CASE', 'CHAR', 'CONST', 'CONTINUE', 'DEFAULT', 'DO', 'DOUBLE', 'ELSE', 'ENUM', 'EXTERN', 'FLOAT', 'FOR', 'GOTO', 'IF', 'INLINE', 'INT', 'LONG', 'REGISTER', 'OFFSETOF', 'RESTRICT', 'RETURN', 'SHORT', 'SIGNED', 'SIZEOF', 'STATIC', 'STRUCT', 'SWITCH', 'TYPEDEF', 'UNION', 'UNSIGNED', 'VOID', 'VOLATILE', 'WHILE', '__INT128', 'ID', 'TYPEID', 'INT_CONST_DEC', 'INT_CONST_OCT', 'INT_CONST_HEX', 'INT_CONST_BIN', 'INT_CONST_CHAR', 'FLOAT_CONST', 'HEX_FLOAT_CONST', 'CHAR_CONST', 'WCHAR_CONST', 'STRING_LITERAL', 'WSTRING_LITERAL', 'PLUS', 'MINUS', 'TIMES', 'DIVIDE', 'MOD', 'OR', 'AND', 'NOT', 'XOR', 'LSHIFT', 'RSHIFT', 'LOR', 'LAND', 'LNOT', 'LT', 'LE', 'GT', 'GE', 'EQ', 'NE', 'EQUALS', 'TIMESEQUAL', 'DIVEQUAL', 'MODEQUAL', 'PLUSEQUAL', 'MINUSEQUAL', 'LSHIFTEQUAL', 'RSHIFTEQUAL', 'ANDEQUAL', 'XOREQUAL', 'OREQUAL', 'PLUSPLUS', 'MINUSMINUS', 'ARROW', 'CONDOP', 'LPAREN', 'RPAREN', 'LBRACKET', 'RBRACKET', 'LBRACE', 'RBRACE', 'COMMA', 'PERIOD', 'SEMI', 'COLON', 'ELLIPSIS', 'PPHASH', 'PPPRAGMA', 'PPPRAGMASTR')) +_lexreflags = 64 _lexliterals = '' -_lexstateinfo = {'ppline': 'exclusive', 'pppragma': 'exclusive', 'INITIAL': 'inclusive'} -_lexstatere = {'ppline': [('(?P"([^"\\\\\\n]|(\\\\(([a-zA-Z._~!=&\\^\\-\\\\?\'"])|(\\d+)|(x[0-9a-fA-F]+))))*")|(?P(0(([uU]ll)|([uU]LL)|(ll[uU]?)|(LL[uU]?)|([uU][lL])|([lL][uU]?)|[uU])?)|([1-9][0-9]*(([uU]ll)|([uU]LL)|(ll[uU]?)|(LL[uU]?)|([uU][lL])|([lL][uU]?)|[uU])?))|(?P\\n)|(?Pline)', [None, ('t_ppline_FILENAME', 'FILENAME'), None, None, None, None, None, None, ('t_ppline_LINE_NUMBER', 'LINE_NUMBER'), None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, ('t_ppline_NEWLINE', 'NEWLINE'), ('t_ppline_PPLINE', 'PPLINE')])], 'pppragma': [('(?P\\n)|(?Ppragma)|(?P"([^"\\\\\\n]|(\\\\(([a-zA-Z._~!=&\\^\\-\\\\?\'"])|(\\d+)|(x[0-9a-fA-F]+))))*")|(?P[a-zA-Z_$][0-9a-zA-Z_$]*)', [None, ('t_pppragma_NEWLINE', 'NEWLINE'), ('t_pppragma_PPPRAGMA', 'PPPRAGMA'), ('t_pppragma_STR', 'STR'), None, None, None, None, None, None, ('t_pppragma_ID', 'ID')])], 'INITIAL': [('(?P[ \\t]*\\#)|(?P\\n+)|(?P\\{)|(?P\\})|(?P((((([0-9]*\\.[0-9]+)|([0-9]+\\.))([eE][-+]?[0-9]+)?)|([0-9]+([eE][-+]?[0-9]+)))[FfLl]?))|(?P(0[xX]([0-9a-fA-F]+|((([0-9a-fA-F]+)?\\.[0-9a-fA-F]+)|([0-9a-fA-F]+\\.)))([pP][+-]?[0-9]+)[FfLl]?))|(?P0[xX][0-9a-fA-F]+(([uU]ll)|([uU]LL)|(ll[uU]?)|(LL[uU]?)|([uU][lL])|([lL][uU]?)|[uU])?)', [None, ('t_PPHASH', 'PPHASH'), ('t_NEWLINE', 'NEWLINE'), ('t_LBRACE', 'LBRACE'), ('t_RBRACE', 'RBRACE'), ('t_FLOAT_CONST', 'FLOAT_CONST'), None, None, None, None, None, None, None, None, None, ('t_HEX_FLOAT_CONST', 'HEX_FLOAT_CONST'), None, None, None, None, None, None, None, ('t_INT_CONST_HEX', 'INT_CONST_HEX')]), ('(?P0[bB][01]+(([uU]ll)|([uU]LL)|(ll[uU]?)|(LL[uU]?)|([uU][lL])|([lL][uU]?)|[uU])?)|(?P0[0-7]*[89])|(?P0[0-7]*(([uU]ll)|([uU]LL)|(ll[uU]?)|(LL[uU]?)|([uU][lL])|([lL][uU]?)|[uU])?)|(?P(0(([uU]ll)|([uU]LL)|(ll[uU]?)|(LL[uU]?)|([uU][lL])|([lL][uU]?)|[uU])?)|([1-9][0-9]*(([uU]ll)|([uU]LL)|(ll[uU]?)|(LL[uU]?)|([uU][lL])|([lL][uU]?)|[uU])?))|(?P\'([^\'\\\\\\n]|(\\\\(([a-zA-Z._~!=&\\^\\-\\\\?\'"])|(\\d+)|(x[0-9a-fA-F]+))))\')|(?PL\'([^\'\\\\\\n]|(\\\\(([a-zA-Z._~!=&\\^\\-\\\\?\'"])|(\\d+)|(x[0-9a-fA-F]+))))\')|(?P(\'([^\'\\\\\\n]|(\\\\(([a-zA-Z._~!=&\\^\\-\\\\?\'"])|(\\d+)|(x[0-9a-fA-F]+))))*\\n)|(\'([^\'\\\\\\n]|(\\\\(([a-zA-Z._~!=&\\^\\-\\\\?\'"])|(\\d+)|(x[0-9a-fA-F]+))))*$))|(?P(\'([^\'\\\\\\n]|(\\\\(([a-zA-Z._~!=&\\^\\-\\\\?\'"])|(\\d+)|(x[0-9a-fA-F]+))))[^\'\n]+\')|(\'\')|(\'([\\\\][^a-zA-Z._~^!=&\\^\\-\\\\?\'"x0-7])[^\'\\n]*\'))', [None, ('t_INT_CONST_BIN', 'INT_CONST_BIN'), None, None, None, None, None, None, None, ('t_BAD_CONST_OCT', 'BAD_CONST_OCT'), ('t_INT_CONST_OCT', 'INT_CONST_OCT'), None, None, None, None, None, None, None, ('t_INT_CONST_DEC', 'INT_CONST_DEC'), None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, ('t_CHAR_CONST', 'CHAR_CONST'), None, None, None, None, None, None, ('t_WCHAR_CONST', 'WCHAR_CONST'), None, None, None, None, None, None, ('t_UNMATCHED_QUOTE', 'UNMATCHED_QUOTE'), None, None, None, None, None, None, None, None, None, None, None, None, None, None, ('t_BAD_CHAR_CONST', 'BAD_CHAR_CONST')]), ('(?PL"([^"\\\\\\n]|(\\\\(([a-zA-Z._~!=&\\^\\-\\\\?\'"])|(\\d+)|(x[0-9a-fA-F]+))))*")|(?P"([^"\\\\\\n]|(\\\\(([a-zA-Z._~!=&\\^\\-\\\\?\'"])|(\\d+)|(x[0-9a-fA-F]+))))*([\\\\][^a-zA-Z._~^!=&\\^\\-\\\\?\'"x0-7])([^"\\\\\\n]|(\\\\(([a-zA-Z._~!=&\\^\\-\\\\?\'"])|(\\d+)|(x[0-9a-fA-F]+))))*")|(?P[a-zA-Z_$][0-9a-zA-Z_$]*)|(?P"([^"\\\\\\n]|(\\\\(([a-zA-Z._~!=&\\^\\-\\\\?\'"])|(\\d+)|(x[0-9a-fA-F]+))))*")|(?P\\.\\.\\.)|(?P\\+\\+)|(?P\\|\\|)|(?P\\^=)|(?P\\|=)|(?P<<=)|(?P>>=)|(?P\\+=)|(?P\\*=)|(?P\\+)|(?P%=)|(?P/=)', [None, ('t_WSTRING_LITERAL', 'WSTRING_LITERAL'), None, None, None, None, None, None, ('t_BAD_STRING_LITERAL', 'BAD_STRING_LITERAL'), None, None, None, None, None, None, None, None, None, None, None, None, None, ('t_ID', 'ID'), (None, 'STRING_LITERAL'), None, None, None, None, None, None, (None, 'ELLIPSIS'), (None, 'PLUSPLUS'), (None, 'LOR'), (None, 'XOREQUAL'), (None, 'OREQUAL'), (None, 'LSHIFTEQUAL'), (None, 'RSHIFTEQUAL'), (None, 'PLUSEQUAL'), (None, 'TIMESEQUAL'), (None, 'PLUS'), (None, 'MODEQUAL'), (None, 'DIVEQUAL')]), ('(?P\\])|(?P\\?)|(?P\\^)|(?P<<)|(?P<=)|(?P\\()|(?P->)|(?P==)|(?P!=)|(?P--)|(?P\\|)|(?P\\*)|(?P\\[)|(?P>=)|(?P\\))|(?P&&)|(?P>>)|(?P-=)|(?P\\.)|(?P&=)|(?P=)|(?P<)|(?P,)|(?P/)|(?P&)|(?P%)|(?P;)|(?P-)|(?P>)|(?P:)|(?P~)|(?P!)', [None, (None, 'RBRACKET'), (None, 'CONDOP'), (None, 'XOR'), (None, 'LSHIFT'), (None, 'LE'), (None, 'LPAREN'), (None, 'ARROW'), (None, 'EQ'), (None, 'NE'), (None, 'MINUSMINUS'), (None, 'OR'), (None, 'TIMES'), (None, 'LBRACKET'), (None, 'GE'), (None, 'RPAREN'), (None, 'LAND'), (None, 'RSHIFT'), (None, 'MINUSEQUAL'), (None, 'PERIOD'), (None, 'ANDEQUAL'), (None, 'EQUALS'), (None, 'LT'), (None, 'COMMA'), (None, 'DIVIDE'), (None, 'AND'), (None, 'MOD'), (None, 'SEMI'), (None, 'MINUS'), (None, 'GT'), (None, 'COLON'), (None, 'NOT'), (None, 'LNOT')])]} -_lexstateignore = {'ppline': ' \t', 'pppragma': ' \t<>.-{}();=+-*/$%@&^~!?:,0123456789', 'INITIAL': ' \t'} -_lexstateerrorf = {'ppline': 't_ppline_error', 'pppragma': 't_pppragma_error', 'INITIAL': 't_error'} +_lexstateinfo = {'INITIAL': 'inclusive', 'ppline': 'exclusive', 'pppragma': 'exclusive'} +_lexstatere = {'INITIAL': [('(?P[ \\t]*\\#)|(?P\\n+)|(?P\\{)|(?P\\})|(?P((((([0-9]*\\.[0-9]+)|([0-9]+\\.))([eE][-+]?[0-9]+)?)|([0-9]+([eE][-+]?[0-9]+)))[FfLl]?))|(?P(0[xX]([0-9a-fA-F]+|((([0-9a-fA-F]+)?\\.[0-9a-fA-F]+)|([0-9a-fA-F]+\\.)))([pP][+-]?[0-9]+)[FfLl]?))|(?P0[xX][0-9a-fA-F]+(([uU]ll)|([uU]LL)|(ll[uU]?)|(LL[uU]?)|([uU][lL])|([lL][uU]?)|[uU])?)|(?P0[bB][01]+(([uU]ll)|([uU]LL)|(ll[uU]?)|(LL[uU]?)|([uU][lL])|([lL][uU]?)|[uU])?)', [None, ('t_PPHASH', 'PPHASH'), ('t_NEWLINE', 'NEWLINE'), ('t_LBRACE', 'LBRACE'), ('t_RBRACE', 'RBRACE'), ('t_FLOAT_CONST', 'FLOAT_CONST'), None, None, None, None, None, None, None, None, None, ('t_HEX_FLOAT_CONST', 'HEX_FLOAT_CONST'), None, None, None, None, None, None, None, ('t_INT_CONST_HEX', 'INT_CONST_HEX'), None, None, None, None, None, None, None, ('t_INT_CONST_BIN', 'INT_CONST_BIN')]), ('(?P0[0-7]*[89])|(?P0[0-7]*(([uU]ll)|([uU]LL)|(ll[uU]?)|(LL[uU]?)|([uU][lL])|([lL][uU]?)|[uU])?)|(?P(0(([uU]ll)|([uU]LL)|(ll[uU]?)|(LL[uU]?)|([uU][lL])|([lL][uU]?)|[uU])?)|([1-9][0-9]*(([uU]ll)|([uU]LL)|(ll[uU]?)|(LL[uU]?)|([uU][lL])|([lL][uU]?)|[uU])?))|(?P\'([^\'\\\\\\n]|(\\\\(([a-wyzA-Z._~!=&\\^\\-\\\\?\'"]|x(?![0-9a-fA-F]))|(\\d+)(?!\\d)|(x[0-9a-fA-F]+)(?![0-9a-fA-F])))){2,4}\')|(?P\'([^\'\\\\\\n]|(\\\\(([a-wyzA-Z._~!=&\\^\\-\\\\?\'"]|x(?![0-9a-fA-F]))|(\\d+)(?!\\d)|(x[0-9a-fA-F]+)(?![0-9a-fA-F]))))\')|(?PL\'([^\'\\\\\\n]|(\\\\(([a-wyzA-Z._~!=&\\^\\-\\\\?\'"]|x(?![0-9a-fA-F]))|(\\d+)(?!\\d)|(x[0-9a-fA-F]+)(?![0-9a-fA-F]))))\')|(?P(\'([^\'\\\\\\n]|(\\\\(([a-wyzA-Z._~!=&\\^\\-\\\\?\'"]|x(?![0-9a-fA-F]))|(\\d+)(?!\\d)|(x[0-9a-fA-F]+)(?![0-9a-fA-F]))))*\\n)|(\'([^\'\\\\\\n]|(\\\\(([a-wyzA-Z._~!=&\\^\\-\\\\?\'"]|x(?![0-9a-fA-F]))|(\\d+)(?!\\d)|(x[0-9a-fA-F]+)(?![0-9a-fA-F]))))*$))|(?P(\'([^\'\\\\\\n]|(\\\\(([a-wyzA-Z._~!=&\\^\\-\\\\?\'"]|x(?![0-9a-fA-F]))|(\\d+)(?!\\d)|(x[0-9a-fA-F]+)(?![0-9a-fA-F]))))[^\'\n]+\')|(\'\')|(\'([\\\\][^a-zA-Z._~^!=&\\^\\-\\\\?\'"x0-9])[^\'\\n]*\'))', [None, ('t_BAD_CONST_OCT', 'BAD_CONST_OCT'), ('t_INT_CONST_OCT', 'INT_CONST_OCT'), None, None, None, None, None, None, None, ('t_INT_CONST_DEC', 'INT_CONST_DEC'), None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, ('t_INT_CONST_CHAR', 'INT_CONST_CHAR'), None, None, None, None, None, None, ('t_CHAR_CONST', 'CHAR_CONST'), None, None, None, None, None, None, ('t_WCHAR_CONST', 'WCHAR_CONST'), None, None, None, None, None, None, ('t_UNMATCHED_QUOTE', 'UNMATCHED_QUOTE'), None, None, None, None, None, None, None, None, None, None, None, None, None, None, ('t_BAD_CHAR_CONST', 'BAD_CHAR_CONST')]), ('(?PL"([^"\\\\\\n]|(\\\\[0-9a-zA-Z._~!=&\\^\\-\\\\?\'"]))*")|(?P"([^"\\\\\\n]|(\\\\[0-9a-zA-Z._~!=&\\^\\-\\\\?\'"]))*([\\\\][^a-zA-Z._~^!=&\\^\\-\\\\?\'"x0-9])([^"\\\\\\n]|(\\\\[0-9a-zA-Z._~!=&\\^\\-\\\\?\'"]))*")|(?P[a-zA-Z_$][0-9a-zA-Z_$]*)|(?P"([^"\\\\\\n]|(\\\\[0-9a-zA-Z._~!=&\\^\\-\\\\?\'"]))*")|(?P\\.\\.\\.)|(?P\\|\\|)|(?P\\+\\+)|(?P<<=)|(?P\\|=)|(?P\\+=)|(?P>>=)|(?P\\*=)|(?P\\^=)|(?P&=)|(?P->)|(?P\\?)', [None, ('t_WSTRING_LITERAL', 'WSTRING_LITERAL'), None, None, ('t_BAD_STRING_LITERAL', 'BAD_STRING_LITERAL'), None, None, None, None, None, ('t_ID', 'ID'), (None, 'STRING_LITERAL'), None, None, (None, 'ELLIPSIS'), (None, 'LOR'), (None, 'PLUSPLUS'), (None, 'LSHIFTEQUAL'), (None, 'OREQUAL'), (None, 'PLUSEQUAL'), (None, 'RSHIFTEQUAL'), (None, 'TIMESEQUAL'), (None, 'XOREQUAL'), (None, 'ANDEQUAL'), (None, 'ARROW'), (None, 'CONDOP')]), ('(?P/=)|(?P==)|(?P>=)|(?P&&)|(?P\\[)|(?P<=)|(?P\\()|(?P<<)|(?P-=)|(?P--)|(?P%=)|(?P!=)|(?P\\|)|(?P\\.)|(?P\\+)|(?P\\])|(?P\\))|(?P>>)|(?P\\*)|(?P\\^)|(?P&)|(?P:)|(?P,)|(?P/)|(?P=)|(?P>)|(?P!)|(?P<)|(?P-)|(?P%)|(?P~)|(?P;)', [None, (None, 'DIVEQUAL'), (None, 'EQ'), (None, 'GE'), (None, 'LAND'), (None, 'LBRACKET'), (None, 'LE'), (None, 'LPAREN'), (None, 'LSHIFT'), (None, 'MINUSEQUAL'), (None, 'MINUSMINUS'), (None, 'MODEQUAL'), (None, 'NE'), (None, 'OR'), (None, 'PERIOD'), (None, 'PLUS'), (None, 'RBRACKET'), (None, 'RPAREN'), (None, 'RSHIFT'), (None, 'TIMES'), (None, 'XOR'), (None, 'AND'), (None, 'COLON'), (None, 'COMMA'), (None, 'DIVIDE'), (None, 'EQUALS'), (None, 'GT'), (None, 'LNOT'), (None, 'LT'), (None, 'MINUS'), (None, 'MOD'), (None, 'NOT'), (None, 'SEMI')])], 'ppline': [('(?P"([^"\\\\\\n]|(\\\\[0-9a-zA-Z._~!=&\\^\\-\\\\?\'"]))*")|(?P(0(([uU]ll)|([uU]LL)|(ll[uU]?)|(LL[uU]?)|([uU][lL])|([lL][uU]?)|[uU])?)|([1-9][0-9]*(([uU]ll)|([uU]LL)|(ll[uU]?)|(LL[uU]?)|([uU][lL])|([lL][uU]?)|[uU])?))|(?P\\n)|(?Pline)', [None, ('t_ppline_FILENAME', 'FILENAME'), None, None, ('t_ppline_LINE_NUMBER', 'LINE_NUMBER'), None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, ('t_ppline_NEWLINE', 'NEWLINE'), ('t_ppline_PPLINE', 'PPLINE')])], 'pppragma': [('(?P\\n)|(?Ppragma)|(?P.+)', [None, ('t_pppragma_NEWLINE', 'NEWLINE'), ('t_pppragma_PPPRAGMA', 'PPPRAGMA'), ('t_pppragma_STR', 'STR')])]} +_lexstateignore = {'INITIAL': ' \t', 'ppline': ' \t', 'pppragma': ' \t'} +_lexstateerrorf = {'INITIAL': 't_error', 'ppline': 't_ppline_error', 'pppragma': 't_pppragma_error'} +_lexstateeoff = {} diff -Nru pypy-7.1.1+dfsg/lib_pypy/cffi/_pycparser/ply/cpp.py pypy-7.3.1+dfsg/lib_pypy/cffi/_pycparser/ply/cpp.py --- pypy-7.1.1+dfsg/lib_pypy/cffi/_pycparser/ply/cpp.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/cffi/_pycparser/ply/cpp.py 2020-04-10 19:28:40.000000000 +0000 @@ -2,12 +2,19 @@ # cpp.py # # Author: David Beazley (http://www.dabeaz.com) -# Copyright (C) 2007 +# Copyright (C) 2017 # All rights reserved # -# This module implements an ANSI-C style lexical preprocessor for PLY. +# This module implements an ANSI-C style lexical preprocessor for PLY. # ----------------------------------------------------------------------------- -from __future__ import generators +import sys + +# Some Python 3 compatibility shims +if sys.version_info.major < 3: + STRING_TYPES = (str, unicode) +else: + STRING_TYPES = str + xrange = range # ----------------------------------------------------------------------------- # Default preprocessor lexer definitions. These tokens are enough to get @@ -15,7 +22,7 @@ # ----------------------------------------------------------------------------- tokens = ( - 'CPP_ID','CPP_INTEGER', 'CPP_FLOAT', 'CPP_STRING', 'CPP_CHAR', 'CPP_WS', 'CPP_COMMENT', 'CPP_POUND','CPP_DPOUND' + 'CPP_ID','CPP_INTEGER', 'CPP_FLOAT', 'CPP_STRING', 'CPP_CHAR', 'CPP_WS', 'CPP_COMMENT1', 'CPP_COMMENT2', 'CPP_POUND','CPP_DPOUND' ) literals = "+-*/%|&~^<>=!?()[]{}.,;:\\\'\"" @@ -34,7 +41,7 @@ # Integer literal def CPP_INTEGER(t): - r'(((((0x)|(0X))[0-9a-fA-F]+)|(\d+))([uU]|[lL]|[uU][lL]|[lL][uU])?)' + r'(((((0x)|(0X))[0-9a-fA-F]+)|(\d+))([uU][lL]|[lL][uU]|[uU]|[lL])?)' return t t_CPP_INTEGER = CPP_INTEGER @@ -55,11 +62,21 @@ return t # Comment -def t_CPP_COMMENT(t): - r'(/\*(.|\n)*?\*/)|(//.*?\n)' - t.lexer.lineno += t.value.count("\n") +def t_CPP_COMMENT1(t): + r'(/\*(.|\n)*?\*/)' + ncr = t.value.count("\n") + t.lexer.lineno += ncr + # replace with one space or a number of '\n' + t.type = 'CPP_WS'; t.value = '\n' * ncr if ncr else ' ' return t - + +# Line comment +def t_CPP_COMMENT2(t): + r'(//.*?(\n|$))' + # replace with '/n' + t.type = 'CPP_WS'; t.value = '\n' + return t + def t_error(t): t.type = t.value[0] t.value = t.value[0] @@ -73,8 +90,8 @@ # ----------------------------------------------------------------------------- # trigraph() -# -# Given an input string, this function replaces all trigraph sequences. +# +# Given an input string, this function replaces all trigraph sequences. # The following mapping is used: # # ??= # @@ -244,7 +261,7 @@ # ---------------------------------------------------------------------- # add_path() # - # Adds a search path to the preprocessor. + # Adds a search path to the preprocessor. # ---------------------------------------------------------------------- def add_path(self,path): @@ -288,7 +305,7 @@ # ---------------------------------------------------------------------- # tokenstrip() - # + # # Remove leading/trailing whitespace tokens from a token list # ---------------------------------------------------------------------- @@ -314,7 +331,7 @@ # argument. Each argument is represented by a list of tokens. # # When collecting arguments, leading and trailing whitespace is removed - # from each argument. + # from each argument. # # This function properly handles nested parenthesis and commas---these do not # define new arguments. @@ -326,7 +343,7 @@ current_arg = [] nesting = 1 tokenlen = len(tokenlist) - + # Search for the opening '('. i = 0 while (i < tokenlen) and (tokenlist[i].type in self.t_WS): @@ -360,7 +377,7 @@ else: current_arg.append(t) i += 1 - + # Missing end argument self.error(self.source,tokenlist[-1].lineno,"Missing ')' in macro arguments") return 0, [],[] @@ -372,9 +389,9 @@ # This is used to speed up macro expansion later on---we'll know # right away where to apply patches to the value to form the expansion # ---------------------------------------------------------------------- - + def macro_prescan(self,macro): - macro.patch = [] # Standard macro arguments + macro.patch = [] # Standard macro arguments macro.str_patch = [] # String conversion expansion macro.var_comma_patch = [] # Variadic macro comma patch i = 0 @@ -421,7 +438,7 @@ rep = [copy.copy(_x) for _x in macro.value] # Make string expansion patches. These do not alter the length of the replacement sequence - + str_expansion = {} for argnum, i in macro.str_patch: if argnum not in str_expansion: @@ -439,7 +456,7 @@ # Make all other patches. The order of these matters. It is assumed that the patch list # has been sorted in reverse order of patch location since replacements will cause the # size of the replacement sequence to expand from the patch point. - + expanded = { } for ptype, argnum, i in macro.patch: # Concatenation. Argument is left unexpanded @@ -476,7 +493,7 @@ if t.value in self.macros and t.value not in expanded: # Yes, we found a macro match expanded[t.value] = True - + m = self.macros[t.value] if not m.arglist: # A simple macro @@ -508,7 +525,7 @@ else: args[len(m.arglist)-1] = tokens[j+positions[len(m.arglist)-1]:j+tokcount-1] del args[len(m.arglist):] - + # Get macro replacement text rep = self.macro_expand_args(m,args) rep = self.expand_macros(rep,expanded) @@ -521,13 +538,13 @@ elif t.value == '__LINE__': t.type = self.t_INTEGER t.value = self.t_INTEGER_TYPE(t.lineno) - + i += 1 return tokens - # ---------------------------------------------------------------------- + # ---------------------------------------------------------------------- # evalexpr() - # + # # Evaluate an expression token sequence for the purposes of evaluating # integral expressions. # ---------------------------------------------------------------------- @@ -574,14 +591,14 @@ tokens[i].value = str(tokens[i].value) while tokens[i].value[-1] not in "0123456789abcdefABCDEF": tokens[i].value = tokens[i].value[:-1] - + expr = "".join([str(x.value) for x in tokens]) expr = expr.replace("&&"," and ") expr = expr.replace("||"," or ") expr = expr.replace("!"," not ") try: result = eval(expr) - except StandardError: + except Exception: self.error(self.source,tokens[0].lineno,"Couldn't evaluate expression") result = 0 return result @@ -599,7 +616,7 @@ if not source: source = "" - + self.define("__FILE__ \"%s\"" % source) self.source = source @@ -614,10 +631,11 @@ if tok.value == '#': # Preprocessor directive + # insert necessary whitespace instead of eaten tokens for tok in x: - if tok in self.t_WS and '\n' in tok.value: + if tok.type in self.t_WS and '\n' in tok.value: chunk.append(tok) - + dirtokens = self.tokenstrip(x[i+1:]) if dirtokens: name = dirtokens[0].value @@ -625,7 +643,7 @@ else: name = "" args = [] - + if name == 'define': if enable: for tok in self.expand_macros(chunk): @@ -685,7 +703,7 @@ iftrigger = True else: self.error(self.source,dirtokens[0].lineno,"Misplaced #elif") - + elif name == 'else': if ifstack: if ifstack[-1][0]: @@ -771,7 +789,7 @@ # ---------------------------------------------------------------------- def define(self,tokens): - if isinstance(tokens,(str,unicode)): + if isinstance(tokens,STRING_TYPES): tokens = self.tokenize(tokens) linetok = tokens @@ -855,7 +873,7 @@ def parse(self,input,source=None,ignore={}): self.ignore = ignore self.parser = self.parsegen(input,source) - + # ---------------------------------------------------------------------- # token() # @@ -885,14 +903,3 @@ tok = p.token() if not tok: break print(p.source, tok) - - - - - - - - - - - diff -Nru pypy-7.1.1+dfsg/lib_pypy/cffi/_pycparser/ply/ctokens.py pypy-7.3.1+dfsg/lib_pypy/cffi/_pycparser/ply/ctokens.py --- pypy-7.1.1+dfsg/lib_pypy/cffi/_pycparser/ply/ctokens.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/cffi/_pycparser/ply/ctokens.py 2020-04-10 19:28:40.000000000 +0000 @@ -9,10 +9,10 @@ tokens = [ # Literals (identifier, integer constant, float constant, string constant, char const) - 'ID', 'TYPEID', 'ICONST', 'FCONST', 'SCONST', 'CCONST', + 'ID', 'TYPEID', 'INTEGER', 'FLOAT', 'STRING', 'CHARACTER', # Operators (+,-,*,/,%,|,&,~,^,<<,>>, ||, &&, !, <, <=, >, >=, ==, !=) - 'PLUS', 'MINUS', 'TIMES', 'DIVIDE', 'MOD', + 'PLUS', 'MINUS', 'TIMES', 'DIVIDE', 'MODULO', 'OR', 'AND', 'NOT', 'XOR', 'LSHIFT', 'RSHIFT', 'LOR', 'LAND', 'LNOT', 'LT', 'LE', 'GT', 'GE', 'EQ', 'NE', @@ -22,7 +22,7 @@ 'LSHIFTEQUAL','RSHIFTEQUAL', 'ANDEQUAL', 'XOREQUAL', 'OREQUAL', # Increment/decrement (++,--) - 'PLUSPLUS', 'MINUSMINUS', + 'INCREMENT', 'DECREMENT', # Structure dereference (->) 'ARROW', @@ -74,7 +74,7 @@ t_RSHIFTEQUAL = r'>>=' t_ANDEQUAL = r'&=' t_OREQUAL = r'\|=' -t_XOREQUAL = r'^=' +t_XOREQUAL = r'\^=' # Increment/decrement t_INCREMENT = r'\+\+' diff -Nru pypy-7.1.1+dfsg/lib_pypy/cffi/_pycparser/ply/__init__.py pypy-7.3.1+dfsg/lib_pypy/cffi/_pycparser/ply/__init__.py --- pypy-7.1.1+dfsg/lib_pypy/cffi/_pycparser/ply/__init__.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/cffi/_pycparser/ply/__init__.py 2020-04-10 19:28:40.000000000 +0000 @@ -1,4 +1,5 @@ # PLY package # Author: David Beazley (dave@dabeaz.com) +__version__ = '3.9' __all__ = ['lex','yacc'] diff -Nru pypy-7.1.1+dfsg/lib_pypy/cffi/_pycparser/ply/lex.py pypy-7.3.1+dfsg/lib_pypy/cffi/_pycparser/ply/lex.py --- pypy-7.1.1+dfsg/lib_pypy/cffi/_pycparser/ply/lex.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/cffi/_pycparser/ply/lex.py 2020-04-10 19:28:40.000000000 +0000 @@ -1,22 +1,22 @@ # ----------------------------------------------------------------------------- # ply: lex.py # -# Copyright (C) 2001-2011, +# Copyright (C) 2001-2017 # David M. Beazley (Dabeaz LLC) # 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. +# * 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. +# and/or other materials provided with the distribution. # * Neither the name of the David Beazley or Dabeaz LLC may be used to # endorse or promote products derived from this software without -# specific prior written permission. +# 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 @@ -31,10 +31,15 @@ # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # ----------------------------------------------------------------------------- -__version__ = "3.4" -__tabversion__ = "3.2" # Version of table file used +__version__ = '3.10' +__tabversion__ = '3.10' -import re, sys, types, copy, os +import re +import sys +import types +import copy +import os +import inspect # This tuple contains known string types try: @@ -44,59 +49,55 @@ # Python 3.0 StringTypes = (str, bytes) -# Extract the code attribute of a function. Different implementations -# are for Python 2/3 compatibility. - -if sys.version_info[0] < 3: - def func_code(f): - return f.func_code -else: - def func_code(f): - return f.__code__ - # This regular expression is used to match valid token names _is_identifier = re.compile(r'^[a-zA-Z0-9_]+$') # Exception thrown when invalid token encountered and no default error # handler is defined. - class LexError(Exception): - def __init__(self,message,s): - self.args = (message,) - self.text = s + def __init__(self, message, s): + self.args = (message,) + self.text = s + # Token class. This class is used to represent the tokens produced. class LexToken(object): def __str__(self): - return "LexToken(%s,%r,%d,%d)" % (self.type,self.value,self.lineno,self.lexpos) + return 'LexToken(%s,%r,%d,%d)' % (self.type, self.value, self.lineno, self.lexpos) + def __repr__(self): return str(self) -# This object is a stand-in for a logging object created by the -# logging module. + +# This object is a stand-in for a logging object created by the +# logging module. class PlyLogger(object): - def __init__(self,f): + def __init__(self, f): self.f = f - def critical(self,msg,*args,**kwargs): - self.f.write((msg % args) + "\n") - def warning(self,msg,*args,**kwargs): - self.f.write("WARNING: "+ (msg % args) + "\n") + def critical(self, msg, *args, **kwargs): + self.f.write((msg % args) + '\n') + + def warning(self, msg, *args, **kwargs): + self.f.write('WARNING: ' + (msg % args) + '\n') - def error(self,msg,*args,**kwargs): - self.f.write("ERROR: " + (msg % args) + "\n") + def error(self, msg, *args, **kwargs): + self.f.write('ERROR: ' + (msg % args) + '\n') info = critical debug = critical + # Null logger is used when no output is generated. Does nothing. class NullLogger(object): - def __getattribute__(self,name): + def __getattribute__(self, name): return self - def __call__(self,*args,**kwargs): + + def __call__(self, *args, **kwargs): return self + # ----------------------------------------------------------------------------- # === Lexing Engine === # @@ -114,31 +115,33 @@ class Lexer: def __init__(self): self.lexre = None # Master regular expression. This is a list of - # tuples (re,findex) where re is a compiled + # tuples (re, findex) where re is a compiled # regular expression and findex is a list # mapping regex group numbers to rules self.lexretext = None # Current regular expression strings self.lexstatere = {} # Dictionary mapping lexer states to master regexs self.lexstateretext = {} # Dictionary mapping lexer states to regex strings self.lexstaterenames = {} # Dictionary mapping lexer states to symbol names - self.lexstate = "INITIAL" # Current lexer state + self.lexstate = 'INITIAL' # Current lexer state self.lexstatestack = [] # Stack of lexer states self.lexstateinfo = None # State information self.lexstateignore = {} # Dictionary of ignored characters for each state self.lexstateerrorf = {} # Dictionary of error functions for each state + self.lexstateeoff = {} # Dictionary of eof functions for each state self.lexreflags = 0 # Optional re compile flags self.lexdata = None # Actual input data (as a string) self.lexpos = 0 # Current position in input text self.lexlen = 0 # Length of the input text self.lexerrorf = None # Error rule (if any) + self.lexeoff = None # EOF rule (if any) self.lextokens = None # List of valid tokens - self.lexignore = "" # Ignored characters - self.lexliterals = "" # Literal characters that can be passed through + self.lexignore = '' # Ignored characters + self.lexliterals = '' # Literal characters that can be passed through self.lexmodule = None # Module self.lineno = 1 # Current line number - self.lexoptimize = 0 # Optimized mode + self.lexoptimize = False # Optimized mode - def clone(self,object=None): + def clone(self, object=None): c = copy.copy(self) # If the object parameter has been supplied, it means we are attaching the @@ -146,113 +149,110 @@ # the lexstatere and lexstateerrorf tables. if object: - newtab = { } + newtab = {} for key, ritem in self.lexstatere.items(): newre = [] for cre, findex in ritem: - newfindex = [] - for f in findex: - if not f or not f[0]: - newfindex.append(f) - continue - newfindex.append((getattr(object,f[0].__name__),f[1])) - newre.append((cre,newfindex)) + newfindex = [] + for f in findex: + if not f or not f[0]: + newfindex.append(f) + continue + newfindex.append((getattr(object, f[0].__name__), f[1])) + newre.append((cre, newfindex)) newtab[key] = newre c.lexstatere = newtab - c.lexstateerrorf = { } + c.lexstateerrorf = {} for key, ef in self.lexstateerrorf.items(): - c.lexstateerrorf[key] = getattr(object,ef.__name__) + c.lexstateerrorf[key] = getattr(object, ef.__name__) c.lexmodule = object return c # ------------------------------------------------------------ # writetab() - Write lexer information to a table file # ------------------------------------------------------------ - def writetab(self,tabfile,outputdir=""): - if isinstance(tabfile,types.ModuleType): - return - basetabfilename = tabfile.split(".")[-1] - filename = os.path.join(outputdir,basetabfilename)+".py" - tf = open(filename,"w") - tf.write("# %s.py. This file automatically created by PLY (version %s). Don't edit!\n" % (tabfile,__version__)) - tf.write("_tabversion = %s\n" % repr(__version__)) - tf.write("_lextokens = %s\n" % repr(self.lextokens)) - tf.write("_lexreflags = %s\n" % repr(self.lexreflags)) - tf.write("_lexliterals = %s\n" % repr(self.lexliterals)) - tf.write("_lexstateinfo = %s\n" % repr(self.lexstateinfo)) - - tabre = { } - # Collect all functions in the initial state - initial = self.lexstatere["INITIAL"] - initialfuncs = [] - for part in initial: - for f in part[1]: - if f and f[0]: - initialfuncs.append(f) - - for key, lre in self.lexstatere.items(): - titem = [] - for i in range(len(lre)): - titem.append((self.lexstateretext[key][i],_funcs_to_names(lre[i][1],self.lexstaterenames[key][i]))) - tabre[key] = titem - - tf.write("_lexstatere = %s\n" % repr(tabre)) - tf.write("_lexstateignore = %s\n" % repr(self.lexstateignore)) - - taberr = { } - for key, ef in self.lexstateerrorf.items(): - if ef: - taberr[key] = ef.__name__ - else: - taberr[key] = None - tf.write("_lexstateerrorf = %s\n" % repr(taberr)) - tf.close() + def writetab(self, lextab, outputdir=''): + if isinstance(lextab, types.ModuleType): + raise IOError("Won't overwrite existing lextab module") + basetabmodule = lextab.split('.')[-1] + filename = os.path.join(outputdir, basetabmodule) + '.py' + with open(filename, 'w') as tf: + tf.write('# %s.py. This file automatically created by PLY (version %s). Don\'t edit!\n' % (basetabmodule, __version__)) + tf.write('_tabversion = %s\n' % repr(__tabversion__)) + tf.write('_lextokens = set(%s)\n' % repr(tuple(self.lextokens))) + tf.write('_lexreflags = %s\n' % repr(self.lexreflags)) + tf.write('_lexliterals = %s\n' % repr(self.lexliterals)) + tf.write('_lexstateinfo = %s\n' % repr(self.lexstateinfo)) + + # Rewrite the lexstatere table, replacing function objects with function names + tabre = {} + for statename, lre in self.lexstatere.items(): + titem = [] + for (pat, func), retext, renames in zip(lre, self.lexstateretext[statename], self.lexstaterenames[statename]): + titem.append((retext, _funcs_to_names(func, renames))) + tabre[statename] = titem + + tf.write('_lexstatere = %s\n' % repr(tabre)) + tf.write('_lexstateignore = %s\n' % repr(self.lexstateignore)) + + taberr = {} + for statename, ef in self.lexstateerrorf.items(): + taberr[statename] = ef.__name__ if ef else None + tf.write('_lexstateerrorf = %s\n' % repr(taberr)) + + tabeof = {} + for statename, ef in self.lexstateeoff.items(): + tabeof[statename] = ef.__name__ if ef else None + tf.write('_lexstateeoff = %s\n' % repr(tabeof)) # ------------------------------------------------------------ # readtab() - Read lexer information from a tab file # ------------------------------------------------------------ - def readtab(self,tabfile,fdict): - if isinstance(tabfile,types.ModuleType): + def readtab(self, tabfile, fdict): + if isinstance(tabfile, types.ModuleType): lextab = tabfile else: - if sys.version_info[0] < 3: - exec("import %s as lextab" % tabfile) - else: - env = { } - exec("import %s as lextab" % tabfile, env,env) - lextab = env['lextab'] + exec('import %s' % tabfile) + lextab = sys.modules[tabfile] - if getattr(lextab,"_tabversion","0.0") != __version__: - raise ImportError("Inconsistent PLY version") + if getattr(lextab, '_tabversion', '0.0') != __tabversion__: + raise ImportError('Inconsistent PLY version') self.lextokens = lextab._lextokens self.lexreflags = lextab._lexreflags self.lexliterals = lextab._lexliterals + self.lextokens_all = self.lextokens | set(self.lexliterals) self.lexstateinfo = lextab._lexstateinfo self.lexstateignore = lextab._lexstateignore - self.lexstatere = { } - self.lexstateretext = { } - for key,lre in lextab._lexstatere.items(): - titem = [] - txtitem = [] - for i in range(len(lre)): - titem.append((re.compile(lre[i][0],lextab._lexreflags | re.VERBOSE),_names_to_funcs(lre[i][1],fdict))) - txtitem.append(lre[i][0]) - self.lexstatere[key] = titem - self.lexstateretext[key] = txtitem - self.lexstateerrorf = { } - for key,ef in lextab._lexstateerrorf.items(): - self.lexstateerrorf[key] = fdict[ef] + self.lexstatere = {} + self.lexstateretext = {} + for statename, lre in lextab._lexstatere.items(): + titem = [] + txtitem = [] + for pat, func_name in lre: + titem.append((re.compile(pat, lextab._lexreflags), _names_to_funcs(func_name, fdict))) + + self.lexstatere[statename] = titem + self.lexstateretext[statename] = txtitem + + self.lexstateerrorf = {} + for statename, ef in lextab._lexstateerrorf.items(): + self.lexstateerrorf[statename] = fdict[ef] + + self.lexstateeoff = {} + for statename, ef in lextab._lexstateeoff.items(): + self.lexstateeoff[statename] = fdict[ef] + self.begin('INITIAL') # ------------------------------------------------------------ # input() - Push a new string into the lexer # ------------------------------------------------------------ - def input(self,s): + def input(self, s): # Pull off the first character to see if s looks like a string c = s[:1] - if not isinstance(c,StringTypes): - raise ValueError("Expected a string") + if not isinstance(c, StringTypes): + raise ValueError('Expected a string') self.lexdata = s self.lexpos = 0 self.lexlen = len(s) @@ -260,19 +260,20 @@ # ------------------------------------------------------------ # begin() - Changes the lexing state # ------------------------------------------------------------ - def begin(self,state): - if not state in self.lexstatere: - raise ValueError("Undefined state") + def begin(self, state): + if state not in self.lexstatere: + raise ValueError('Undefined state') self.lexre = self.lexstatere[state] self.lexretext = self.lexstateretext[state] - self.lexignore = self.lexstateignore.get(state,"") - self.lexerrorf = self.lexstateerrorf.get(state,None) + self.lexignore = self.lexstateignore.get(state, '') + self.lexerrorf = self.lexstateerrorf.get(state, None) + self.lexeoff = self.lexstateeoff.get(state, None) self.lexstate = state # ------------------------------------------------------------ # push_state() - Changes the lexing state and saves old on stack # ------------------------------------------------------------ - def push_state(self,state): + def push_state(self, state): self.lexstatestack.append(self.lexstate) self.begin(state) @@ -291,7 +292,7 @@ # ------------------------------------------------------------ # skip() - Skip ahead n characters # ------------------------------------------------------------ - def skip(self,n): + def skip(self, n): self.lexpos += n # ------------------------------------------------------------ @@ -315,9 +316,10 @@ continue # Look for a regular expression match - for lexre,lexindexfunc in self.lexre: - m = lexre.match(lexdata,lexpos) - if not m: continue + for lexre, lexindexfunc in self.lexre: + m = lexre.match(lexdata, lexpos) + if not m: + continue # Create a token for return tok = LexToken() @@ -326,16 +328,16 @@ tok.lexpos = lexpos i = m.lastindex - func,tok.type = lexindexfunc[i] + func, tok.type = lexindexfunc[i] if not func: - # If no token type was set, it's an ignored token - if tok.type: - self.lexpos = m.end() - return tok - else: - lexpos = m.end() - break + # If no token type was set, it's an ignored token + if tok.type: + self.lexpos = m.end() + return tok + else: + lexpos = m.end() + break lexpos = m.end() @@ -355,10 +357,10 @@ # Verify type of the token. If not in the token map, raise an error if not self.lexoptimize: - if not newtok.type in self.lextokens: + if newtok.type not in self.lextokens_all: raise LexError("%s:%d: Rule '%s' returned an unknown token type '%s'" % ( - func_code(func).co_filename, func_code(func).co_firstlineno, - func.__name__, newtok.type),lexdata[lexpos:]) + func.__code__.co_filename, func.__code__.co_firstlineno, + func.__name__, newtok.type), lexdata[lexpos:]) return newtok else: @@ -377,7 +379,7 @@ tok = LexToken() tok.value = self.lexdata[lexpos:] tok.lineno = self.lineno - tok.type = "error" + tok.type = 'error' tok.lexer = self tok.lexpos = lexpos self.lexpos = lexpos @@ -386,15 +388,27 @@ # Error method didn't change text position at all. This is an error. raise LexError("Scanning error. Illegal character '%s'" % (lexdata[lexpos]), lexdata[lexpos:]) lexpos = self.lexpos - if not newtok: continue + if not newtok: + continue return newtok self.lexpos = lexpos - raise LexError("Illegal character '%s' at index %d" % (lexdata[lexpos],lexpos), lexdata[lexpos:]) + raise LexError("Illegal character '%s' at index %d" % (lexdata[lexpos], lexpos), lexdata[lexpos:]) + + if self.lexeoff: + tok = LexToken() + tok.type = 'eof' + tok.value = '' + tok.lineno = self.lineno + tok.lexpos = lexpos + tok.lexer = self + self.lexpos = lexpos + newtok = self.lexeoff(tok) + return newtok self.lexpos = lexpos + 1 if self.lexdata is None: - raise RuntimeError("No input string given with input()") + raise RuntimeError('No input string given with input()') return None # Iterator interface @@ -417,27 +431,27 @@ # ----------------------------------------------------------------------------- # ----------------------------------------------------------------------------- +# _get_regex(func) +# +# Returns the regular expression assigned to a function either as a doc string +# or as a .regex attribute attached by the @TOKEN decorator. +# ----------------------------------------------------------------------------- +def _get_regex(func): + return getattr(func, 'regex', func.__doc__) + +# ----------------------------------------------------------------------------- # get_caller_module_dict() # # This function returns a dictionary containing all of the symbols defined within # a caller further down the call stack. This is used to get the environment # associated with the yacc() call if none was provided. # ----------------------------------------------------------------------------- - def get_caller_module_dict(levels): - try: - raise RuntimeError - except RuntimeError: - e,b,t = sys.exc_info() - f = t.tb_frame - while levels > 0: - f = f.f_back - levels -= 1 - ldict = f.f_globals.copy() - if f.f_globals != f.f_locals: - ldict.update(f.f_locals) - - return ldict + f = sys._getframe(levels) + ldict = f.f_globals.copy() + if f.f_globals != f.f_locals: + ldict.update(f.f_locals) + return ldict # ----------------------------------------------------------------------------- # _funcs_to_names() @@ -445,14 +459,13 @@ # Given a list of regular expression functions, this converts it to a list # suitable for output to a table file # ----------------------------------------------------------------------------- - -def _funcs_to_names(funclist,namelist): +def _funcs_to_names(funclist, namelist): result = [] - for f,name in zip(funclist,namelist): - if f and f[0]: - result.append((name, f[1])) - else: - result.append(f) + for f, name in zip(funclist, namelist): + if f and f[0]: + result.append((name, f[1])) + else: + result.append(f) return result # ----------------------------------------------------------------------------- @@ -461,15 +474,14 @@ # Given a list of regular expression function names, this converts it back to # functions. # ----------------------------------------------------------------------------- - -def _names_to_funcs(namelist,fdict): - result = [] - for n in namelist: - if n and n[0]: - result.append((fdict[n[0]],n[1])) - else: - result.append(n) - return result +def _names_to_funcs(namelist, fdict): + result = [] + for n in namelist: + if n and n[0]: + result.append((fdict[n[0]], n[1])) + else: + result.append(n) + return result # ----------------------------------------------------------------------------- # _form_master_re() @@ -478,36 +490,37 @@ # form the master regular expression. Given limitations in the Python re # module, it may be necessary to break the master regex into separate expressions. # ----------------------------------------------------------------------------- - -def _form_master_re(relist,reflags,ldict,toknames): - if not relist: return [] - regex = "|".join(relist) +def _form_master_re(relist, reflags, ldict, toknames): + if not relist: + return [] + regex = '|'.join(relist) try: - lexre = re.compile(regex,re.VERBOSE | reflags) + lexre = re.compile(regex, reflags) # Build the index to function map for the matching engine - lexindexfunc = [ None ] * (max(lexre.groupindex.values())+1) + lexindexfunc = [None] * (max(lexre.groupindex.values()) + 1) lexindexnames = lexindexfunc[:] - for f,i in lexre.groupindex.items(): - handle = ldict.get(f,None) + for f, i in lexre.groupindex.items(): + handle = ldict.get(f, None) if type(handle) in (types.FunctionType, types.MethodType): - lexindexfunc[i] = (handle,toknames[f]) + lexindexfunc[i] = (handle, toknames[f]) lexindexnames[i] = f elif handle is not None: lexindexnames[i] = f - if f.find("ignore_") > 0: - lexindexfunc[i] = (None,None) + if f.find('ignore_') > 0: + lexindexfunc[i] = (None, None) else: lexindexfunc[i] = (None, toknames[f]) - - return [(lexre,lexindexfunc)],[regex],[lexindexnames] + + return [(lexre, lexindexfunc)], [regex], [lexindexnames] except Exception: m = int(len(relist)/2) - if m == 0: m = 1 - llist, lre, lnames = _form_master_re(relist[:m],reflags,ldict,toknames) - rlist, rre, rnames = _form_master_re(relist[m:],reflags,ldict,toknames) - return llist+rlist, lre+rre, lnames+rnames + if m == 0: + m = 1 + llist, lre, lnames = _form_master_re(relist[:m], reflags, ldict, toknames) + rlist, rre, rnames = _form_master_re(relist[m:], reflags, ldict, toknames) + return (llist+rlist), (lre+rre), (lnames+rnames) # ----------------------------------------------------------------------------- # def _statetoken(s,names) @@ -517,22 +530,23 @@ # is a tuple of state names and tokenname is the name of the token. For example, # calling this with s = "t_foo_bar_SPAM" might return (('foo','bar'),'SPAM') # ----------------------------------------------------------------------------- - -def _statetoken(s,names): +def _statetoken(s, names): nonstate = 1 - parts = s.split("_") - for i in range(1,len(parts)): - if not parts[i] in names and parts[i] != 'ANY': break + parts = s.split('_') + for i, part in enumerate(parts[1:], 1): + if part not in names and part != 'ANY': + break + if i > 1: - states = tuple(parts[1:i]) + states = tuple(parts[1:i]) else: - states = ('INITIAL',) + states = ('INITIAL',) if 'ANY' in states: - states = tuple(names) + states = tuple(names) - tokenname = "_".join(parts[i:]) - return (states,tokenname) + tokenname = '_'.join(parts[i:]) + return (states, tokenname) # ----------------------------------------------------------------------------- @@ -542,19 +556,15 @@ # user's input file. # ----------------------------------------------------------------------------- class LexerReflect(object): - def __init__(self,ldict,log=None,reflags=0): + def __init__(self, ldict, log=None, reflags=0): self.ldict = ldict self.error_func = None self.tokens = [] self.reflags = reflags - self.stateinfo = { 'INITIAL' : 'inclusive'} - self.files = {} - self.error = 0 - - if log is None: - self.log = PlyLogger(sys.stderr) - else: - self.log = log + self.stateinfo = {'INITIAL': 'inclusive'} + self.modules = set() + self.error = False + self.log = PlyLogger(sys.stderr) if log is None else log # Get all of the basic information def get_all(self): @@ -562,7 +572,7 @@ self.get_literals() self.get_states() self.get_rules() - + # Validate all of the information def validate_all(self): self.validate_tokens() @@ -572,20 +582,20 @@ # Get the tokens map def get_tokens(self): - tokens = self.ldict.get("tokens",None) + tokens = self.ldict.get('tokens', None) if not tokens: - self.log.error("No token list is defined") - self.error = 1 + self.log.error('No token list is defined') + self.error = True return - if not isinstance(tokens,(list, tuple)): - self.log.error("tokens must be a list or tuple") - self.error = 1 + if not isinstance(tokens, (list, tuple)): + self.log.error('tokens must be a list or tuple') + self.error = True return - + if not tokens: - self.log.error("tokens is empty") - self.error = 1 + self.log.error('tokens is empty') + self.error = True return self.tokens = tokens @@ -595,280 +605,274 @@ terminals = {} for n in self.tokens: if not _is_identifier.match(n): - self.log.error("Bad token name '%s'",n) - self.error = 1 + self.log.error("Bad token name '%s'", n) + self.error = True if n in terminals: self.log.warning("Token '%s' multiply defined", n) terminals[n] = 1 # Get the literals specifier def get_literals(self): - self.literals = self.ldict.get("literals","") + self.literals = self.ldict.get('literals', '') + if not self.literals: + self.literals = '' # Validate literals def validate_literals(self): try: for c in self.literals: - if not isinstance(c,StringTypes) or len(c) > 1: - self.log.error("Invalid literal %s. Must be a single character", repr(c)) - self.error = 1 - continue + if not isinstance(c, StringTypes) or len(c) > 1: + self.log.error('Invalid literal %s. Must be a single character', repr(c)) + self.error = True except TypeError: - self.log.error("Invalid literals specification. literals must be a sequence of characters") - self.error = 1 + self.log.error('Invalid literals specification. literals must be a sequence of characters') + self.error = True def get_states(self): - self.states = self.ldict.get("states",None) + self.states = self.ldict.get('states', None) # Build statemap if self.states: - if not isinstance(self.states,(tuple,list)): - self.log.error("states must be defined as a tuple or list") - self.error = 1 - else: - for s in self.states: - if not isinstance(s,tuple) or len(s) != 2: - self.log.error("Invalid state specifier %s. Must be a tuple (statename,'exclusive|inclusive')",repr(s)) - self.error = 1 - continue - name, statetype = s - if not isinstance(name,StringTypes): - self.log.error("State name %s must be a string", repr(name)) - self.error = 1 - continue - if not (statetype == 'inclusive' or statetype == 'exclusive'): - self.log.error("State type for state %s must be 'inclusive' or 'exclusive'",name) - self.error = 1 - continue - if name in self.stateinfo: - self.log.error("State '%s' already defined",name) - self.error = 1 - continue - self.stateinfo[name] = statetype + if not isinstance(self.states, (tuple, list)): + self.log.error('states must be defined as a tuple or list') + self.error = True + else: + for s in self.states: + if not isinstance(s, tuple) or len(s) != 2: + self.log.error("Invalid state specifier %s. Must be a tuple (statename,'exclusive|inclusive')", repr(s)) + self.error = True + continue + name, statetype = s + if not isinstance(name, StringTypes): + self.log.error('State name %s must be a string', repr(name)) + self.error = True + continue + if not (statetype == 'inclusive' or statetype == 'exclusive'): + self.log.error("State type for state %s must be 'inclusive' or 'exclusive'", name) + self.error = True + continue + if name in self.stateinfo: + self.log.error("State '%s' already defined", name) + self.error = True + continue + self.stateinfo[name] = statetype # Get all of the symbols with a t_ prefix and sort them into various # categories (functions, strings, error functions, and ignore characters) def get_rules(self): - tsymbols = [f for f in self.ldict if f[:2] == 't_' ] + tsymbols = [f for f in self.ldict if f[:2] == 't_'] # Now build up a list of functions and a list of strings - - self.toknames = { } # Mapping of symbols to token names - self.funcsym = { } # Symbols defined as functions - self.strsym = { } # Symbols defined as strings - self.ignore = { } # Ignore strings by state - self.errorf = { } # Error functions by state + self.toknames = {} # Mapping of symbols to token names + self.funcsym = {} # Symbols defined as functions + self.strsym = {} # Symbols defined as strings + self.ignore = {} # Ignore strings by state + self.errorf = {} # Error functions by state + self.eoff = {} # EOF functions by state for s in self.stateinfo: - self.funcsym[s] = [] - self.strsym[s] = [] + self.funcsym[s] = [] + self.strsym[s] = [] if len(tsymbols) == 0: - self.log.error("No rules of the form t_rulename are defined") - self.error = 1 + self.log.error('No rules of the form t_rulename are defined') + self.error = True return for f in tsymbols: t = self.ldict[f] - states, tokname = _statetoken(f,self.stateinfo) + states, tokname = _statetoken(f, self.stateinfo) self.toknames[f] = tokname - if hasattr(t,"__call__"): + if hasattr(t, '__call__'): if tokname == 'error': for s in states: self.errorf[s] = t + elif tokname == 'eof': + for s in states: + self.eoff[s] = t elif tokname == 'ignore': - line = func_code(t).co_firstlineno - file = func_code(t).co_filename - self.log.error("%s:%d: Rule '%s' must be defined as a string",file,line,t.__name__) - self.error = 1 + line = t.__code__.co_firstlineno + file = t.__code__.co_filename + self.log.error("%s:%d: Rule '%s' must be defined as a string", file, line, t.__name__) + self.error = True else: - for s in states: - self.funcsym[s].append((f,t)) + for s in states: + self.funcsym[s].append((f, t)) elif isinstance(t, StringTypes): if tokname == 'ignore': for s in states: self.ignore[s] = t - if "\\" in t: - self.log.warning("%s contains a literal backslash '\\'",f) + if '\\' in t: + self.log.warning("%s contains a literal backslash '\\'", f) elif tokname == 'error': self.log.error("Rule '%s' must be defined as a function", f) - self.error = 1 + self.error = True else: - for s in states: - self.strsym[s].append((f,t)) + for s in states: + self.strsym[s].append((f, t)) else: - self.log.error("%s not defined as a function or string", f) - self.error = 1 + self.log.error('%s not defined as a function or string', f) + self.error = True # Sort the functions by line number for f in self.funcsym.values(): - if sys.version_info[0] < 3: - f.sort(lambda x,y: cmp(func_code(x[1]).co_firstlineno,func_code(y[1]).co_firstlineno)) - else: - # Python 3.0 - f.sort(key=lambda x: func_code(x[1]).co_firstlineno) + f.sort(key=lambda x: x[1].__code__.co_firstlineno) # Sort the strings by regular expression length for s in self.strsym.values(): - if sys.version_info[0] < 3: - s.sort(lambda x,y: (len(x[1]) < len(y[1])) - (len(x[1]) > len(y[1]))) - else: - # Python 3.0 - s.sort(key=lambda x: len(x[1]),reverse=True) + s.sort(key=lambda x: len(x[1]), reverse=True) - # Validate all of the t_rules collected + # Validate all of the t_rules collected def validate_rules(self): for state in self.stateinfo: # Validate all rules defined by functions - - for fname, f in self.funcsym[state]: - line = func_code(f).co_firstlineno - file = func_code(f).co_filename - self.files[file] = 1 + line = f.__code__.co_firstlineno + file = f.__code__.co_filename + module = inspect.getmodule(f) + self.modules.add(module) tokname = self.toknames[fname] if isinstance(f, types.MethodType): reqargs = 2 else: reqargs = 1 - nargs = func_code(f).co_argcount + nargs = f.__code__.co_argcount if nargs > reqargs: - self.log.error("%s:%d: Rule '%s' has too many arguments",file,line,f.__name__) - self.error = 1 + self.log.error("%s:%d: Rule '%s' has too many arguments", file, line, f.__name__) + self.error = True continue if nargs < reqargs: - self.log.error("%s:%d: Rule '%s' requires an argument", file,line,f.__name__) - self.error = 1 + self.log.error("%s:%d: Rule '%s' requires an argument", file, line, f.__name__) + self.error = True continue - if not f.__doc__: - self.log.error("%s:%d: No regular expression defined for rule '%s'",file,line,f.__name__) - self.error = 1 + if not _get_regex(f): + self.log.error("%s:%d: No regular expression defined for rule '%s'", file, line, f.__name__) + self.error = True continue try: - c = re.compile("(?P<%s>%s)" % (fname,f.__doc__), re.VERBOSE | self.reflags) - if c.match(""): - self.log.error("%s:%d: Regular expression for rule '%s' matches empty string", file,line,f.__name__) - self.error = 1 - except re.error: - _etype, e, _etrace = sys.exc_info() - self.log.error("%s:%d: Invalid regular expression for rule '%s'. %s", file,line,f.__name__,e) - if '#' in f.__doc__: - self.log.error("%s:%d. Make sure '#' in rule '%s' is escaped with '\\#'",file,line, f.__name__) - self.error = 1 + c = re.compile('(?P<%s>%s)' % (fname, _get_regex(f)), self.reflags) + if c.match(''): + self.log.error("%s:%d: Regular expression for rule '%s' matches empty string", file, line, f.__name__) + self.error = True + except re.error as e: + self.log.error("%s:%d: Invalid regular expression for rule '%s'. %s", file, line, f.__name__, e) + if '#' in _get_regex(f): + self.log.error("%s:%d. Make sure '#' in rule '%s' is escaped with '\\#'", file, line, f.__name__) + self.error = True # Validate all rules defined by strings - for name,r in self.strsym[state]: + for name, r in self.strsym[state]: tokname = self.toknames[name] if tokname == 'error': self.log.error("Rule '%s' must be defined as a function", name) - self.error = 1 + self.error = True continue - if not tokname in self.tokens and tokname.find("ignore_") < 0: - self.log.error("Rule '%s' defined for an unspecified token %s",name,tokname) - self.error = 1 + if tokname not in self.tokens and tokname.find('ignore_') < 0: + self.log.error("Rule '%s' defined for an unspecified token %s", name, tokname) + self.error = True continue try: - c = re.compile("(?P<%s>%s)" % (name,r),re.VERBOSE | self.reflags) - if (c.match("")): - self.log.error("Regular expression for rule '%s' matches empty string",name) - self.error = 1 - except re.error: - _etype, e, _etrace = sys.exc_info() - self.log.error("Invalid regular expression for rule '%s'. %s",name,e) + c = re.compile('(?P<%s>%s)' % (name, r), self.reflags) + if (c.match('')): + self.log.error("Regular expression for rule '%s' matches empty string", name) + self.error = True + except re.error as e: + self.log.error("Invalid regular expression for rule '%s'. %s", name, e) if '#' in r: - self.log.error("Make sure '#' in rule '%s' is escaped with '\\#'",name) - self.error = 1 + self.log.error("Make sure '#' in rule '%s' is escaped with '\\#'", name) + self.error = True if not self.funcsym[state] and not self.strsym[state]: - self.log.error("No rules defined for state '%s'",state) - self.error = 1 + self.log.error("No rules defined for state '%s'", state) + self.error = True # Validate the error function - efunc = self.errorf.get(state,None) + efunc = self.errorf.get(state, None) if efunc: f = efunc - line = func_code(f).co_firstlineno - file = func_code(f).co_filename - self.files[file] = 1 + line = f.__code__.co_firstlineno + file = f.__code__.co_filename + module = inspect.getmodule(f) + self.modules.add(module) if isinstance(f, types.MethodType): reqargs = 2 else: reqargs = 1 - nargs = func_code(f).co_argcount + nargs = f.__code__.co_argcount if nargs > reqargs: - self.log.error("%s:%d: Rule '%s' has too many arguments",file,line,f.__name__) - self.error = 1 + self.log.error("%s:%d: Rule '%s' has too many arguments", file, line, f.__name__) + self.error = True if nargs < reqargs: - self.log.error("%s:%d: Rule '%s' requires an argument", file,line,f.__name__) - self.error = 1 - - for f in self.files: - self.validate_file(f) + self.log.error("%s:%d: Rule '%s' requires an argument", file, line, f.__name__) + self.error = True + for module in self.modules: + self.validate_module(module) # ----------------------------------------------------------------------------- - # validate_file() + # validate_module() # # This checks to see if there are duplicated t_rulename() functions or strings # in the parser input file. This is done using a simple regular expression - # match on each line in the given file. + # match on each line in the source code of the given module. # ----------------------------------------------------------------------------- - def validate_file(self,filename): - import os.path - base,ext = os.path.splitext(filename) - if ext != '.py': return # No idea what the file is. Return OK - + def validate_module(self, module): try: - f = open(filename) - lines = f.readlines() - f.close() + lines, linen = inspect.getsourcelines(module) except IOError: - return # Couldn't find the file. Don't worry about it + return fre = re.compile(r'\s*def\s+(t_[a-zA-Z_0-9]*)\(') sre = re.compile(r'\s*(t_[a-zA-Z_0-9]*)\s*=') - counthash = { } - linen = 1 - for l in lines: - m = fre.match(l) + counthash = {} + linen += 1 + for line in lines: + m = fre.match(line) if not m: - m = sre.match(l) + m = sre.match(line) if m: name = m.group(1) prev = counthash.get(name) if not prev: counthash[name] = linen else: - self.log.error("%s:%d: Rule %s redefined. Previously defined on line %d",filename,linen,name,prev) - self.error = 1 + filename = inspect.getsourcefile(module) + self.log.error('%s:%d: Rule %s redefined. Previously defined on line %d', filename, linen, name, prev) + self.error = True linen += 1 - + # ----------------------------------------------------------------------------- # lex(module) # # Build all of the regular expression rules from definitions in the supplied module # ----------------------------------------------------------------------------- -def lex(module=None,object=None,debug=0,optimize=0,lextab="lextab",reflags=0,nowarn=0,outputdir="", debuglog=None, errorlog=None): +def lex(module=None, object=None, debug=False, optimize=False, lextab='lextab', + reflags=int(re.VERBOSE), nowarn=False, outputdir=None, debuglog=None, errorlog=None): + + if lextab is None: + lextab = 'lextab' + global lexer + ldict = None - stateinfo = { 'INITIAL' : 'inclusive'} + stateinfo = {'INITIAL': 'inclusive'} lexobj = Lexer() lexobj.lexoptimize = optimize - global token,input + global token, input if errorlog is None: errorlog = PlyLogger(sys.stderr) @@ -878,16 +882,28 @@ debuglog = PlyLogger(sys.stderr) # Get the module dictionary used for the lexer - if object: module = object + if object: + module = object + # Get the module dictionary used for the parser if module: - _items = [(k,getattr(module,k)) for k in dir(module)] + _items = [(k, getattr(module, k)) for k in dir(module)] ldict = dict(_items) + # If no __file__ attribute is available, try to obtain it from the __module__ instead + if '__file__' not in ldict: + ldict['__file__'] = sys.modules[ldict['__module__']].__file__ else: ldict = get_caller_module_dict(2) + # Determine if the module is package of a package or not. + # If so, fix the tabmodule setting so that tables load correctly + pkg = ldict.get('__package__') + if pkg and isinstance(lextab, str): + if '.' not in lextab: + lextab = pkg + '.' + lextab + # Collect parser information from the dictionary - linfo = LexerReflect(ldict,log=errorlog,reflags=reflags) + linfo = LexerReflect(ldict, log=errorlog, reflags=reflags) linfo.get_all() if not optimize: if linfo.validate_all(): @@ -895,7 +911,7 @@ if optimize and lextab: try: - lexobj.readtab(lextab,ldict) + lexobj.readtab(lextab, ldict) token = lexobj.token input = lexobj.input lexer = lexobj @@ -906,93 +922,99 @@ # Dump some basic debugging information if debug: - debuglog.info("lex: tokens = %r", linfo.tokens) - debuglog.info("lex: literals = %r", linfo.literals) - debuglog.info("lex: states = %r", linfo.stateinfo) + debuglog.info('lex: tokens = %r', linfo.tokens) + debuglog.info('lex: literals = %r', linfo.literals) + debuglog.info('lex: states = %r', linfo.stateinfo) # Build a dictionary of valid token names - lexobj.lextokens = { } + lexobj.lextokens = set() for n in linfo.tokens: - lexobj.lextokens[n] = 1 + lexobj.lextokens.add(n) # Get literals specification - if isinstance(linfo.literals,(list,tuple)): + if isinstance(linfo.literals, (list, tuple)): lexobj.lexliterals = type(linfo.literals[0])().join(linfo.literals) else: lexobj.lexliterals = linfo.literals + lexobj.lextokens_all = lexobj.lextokens | set(lexobj.lexliterals) + # Get the stateinfo dictionary stateinfo = linfo.stateinfo - regexs = { } + regexs = {} # Build the master regular expressions for state in stateinfo: regex_list = [] # Add rules defined by functions first for fname, f in linfo.funcsym[state]: - line = func_code(f).co_firstlineno - file = func_code(f).co_filename - regex_list.append("(?P<%s>%s)" % (fname,f.__doc__)) + line = f.__code__.co_firstlineno + file = f.__code__.co_filename + regex_list.append('(?P<%s>%s)' % (fname, _get_regex(f))) if debug: - debuglog.info("lex: Adding rule %s -> '%s' (state '%s')",fname,f.__doc__, state) + debuglog.info("lex: Adding rule %s -> '%s' (state '%s')", fname, _get_regex(f), state) # Now add all of the simple rules - for name,r in linfo.strsym[state]: - regex_list.append("(?P<%s>%s)" % (name,r)) + for name, r in linfo.strsym[state]: + regex_list.append('(?P<%s>%s)' % (name, r)) if debug: - debuglog.info("lex: Adding rule %s -> '%s' (state '%s')",name,r, state) + debuglog.info("lex: Adding rule %s -> '%s' (state '%s')", name, r, state) regexs[state] = regex_list # Build the master regular expressions if debug: - debuglog.info("lex: ==== MASTER REGEXS FOLLOW ====") + debuglog.info('lex: ==== MASTER REGEXS FOLLOW ====') for state in regexs: - lexre, re_text, re_names = _form_master_re(regexs[state],reflags,ldict,linfo.toknames) + lexre, re_text, re_names = _form_master_re(regexs[state], reflags, ldict, linfo.toknames) lexobj.lexstatere[state] = lexre lexobj.lexstateretext[state] = re_text lexobj.lexstaterenames[state] = re_names if debug: - for i in range(len(re_text)): - debuglog.info("lex: state '%s' : regex[%d] = '%s'",state, i, re_text[i]) + for i, text in enumerate(re_text): + debuglog.info("lex: state '%s' : regex[%d] = '%s'", state, i, text) # For inclusive states, we need to add the regular expressions from the INITIAL state - for state,stype in stateinfo.items(): - if state != "INITIAL" and stype == 'inclusive': - lexobj.lexstatere[state].extend(lexobj.lexstatere['INITIAL']) - lexobj.lexstateretext[state].extend(lexobj.lexstateretext['INITIAL']) - lexobj.lexstaterenames[state].extend(lexobj.lexstaterenames['INITIAL']) + for state, stype in stateinfo.items(): + if state != 'INITIAL' and stype == 'inclusive': + lexobj.lexstatere[state].extend(lexobj.lexstatere['INITIAL']) + lexobj.lexstateretext[state].extend(lexobj.lexstateretext['INITIAL']) + lexobj.lexstaterenames[state].extend(lexobj.lexstaterenames['INITIAL']) lexobj.lexstateinfo = stateinfo - lexobj.lexre = lexobj.lexstatere["INITIAL"] - lexobj.lexretext = lexobj.lexstateretext["INITIAL"] + lexobj.lexre = lexobj.lexstatere['INITIAL'] + lexobj.lexretext = lexobj.lexstateretext['INITIAL'] lexobj.lexreflags = reflags # Set up ignore variables lexobj.lexstateignore = linfo.ignore - lexobj.lexignore = lexobj.lexstateignore.get("INITIAL","") + lexobj.lexignore = lexobj.lexstateignore.get('INITIAL', '') # Set up error functions lexobj.lexstateerrorf = linfo.errorf - lexobj.lexerrorf = linfo.errorf.get("INITIAL",None) + lexobj.lexerrorf = linfo.errorf.get('INITIAL', None) if not lexobj.lexerrorf: - errorlog.warning("No t_error rule is defined") + errorlog.warning('No t_error rule is defined') + + # Set up eof functions + lexobj.lexstateeoff = linfo.eoff + lexobj.lexeoff = linfo.eoff.get('INITIAL', None) # Check state information for ignore and error rules - for s,stype in stateinfo.items(): + for s, stype in stateinfo.items(): if stype == 'exclusive': - if not s in linfo.errorf: - errorlog.warning("No error rule is defined for exclusive state '%s'", s) - if not s in linfo.ignore and lexobj.lexignore: - errorlog.warning("No ignore rule is defined for exclusive state '%s'", s) + if s not in linfo.errorf: + errorlog.warning("No error rule is defined for exclusive state '%s'", s) + if s not in linfo.ignore and lexobj.lexignore: + errorlog.warning("No ignore rule is defined for exclusive state '%s'", s) elif stype == 'inclusive': - if not s in linfo.errorf: - linfo.errorf[s] = linfo.errorf.get("INITIAL",None) - if not s in linfo.ignore: - linfo.ignore[s] = linfo.ignore.get("INITIAL","") + if s not in linfo.errorf: + linfo.errorf[s] = linfo.errorf.get('INITIAL', None) + if s not in linfo.ignore: + linfo.ignore[s] = linfo.ignore.get('INITIAL', '') # Create global versions of the token() and input() functions token = lexobj.token @@ -1001,7 +1023,26 @@ # If in optimize mode, we write the lextab if lextab and optimize: - lexobj.writetab(lextab,outputdir) + if outputdir is None: + # If no output directory is set, the location of the output files + # is determined according to the following rules: + # - If lextab specifies a package, files go into that package directory + # - Otherwise, files go in the same directory as the specifying module + if isinstance(lextab, types.ModuleType): + srcfile = lextab.__file__ + else: + if '.' not in lextab: + srcfile = ldict['__file__'] + else: + parts = lextab.split('.') + pkgname = '.'.join(parts[:-1]) + exec('import %s' % pkgname) + srcfile = getattr(sys.modules[pkgname], '__file__', '') + outputdir = os.path.dirname(srcfile) + try: + lexobj.writetab(lextab, outputdir) + except IOError as e: + errorlog.warning("Couldn't write lextab module %r. %s" % (lextab, e)) return lexobj @@ -1011,7 +1052,7 @@ # This runs the lexer as a main program # ----------------------------------------------------------------------------- -def runmain(lexer=None,data=None): +def runmain(lexer=None, data=None): if not data: try: filename = sys.argv[1] @@ -1019,7 +1060,7 @@ data = f.read() f.close() except IndexError: - sys.stdout.write("Reading from standard input (type EOF to end):\n") + sys.stdout.write('Reading from standard input (type EOF to end):\n') data = sys.stdin.read() if lexer: @@ -1032,10 +1073,11 @@ else: _token = token - while 1: + while True: tok = _token() - if not tok: break - sys.stdout.write("(%s,%r,%d,%d)\n" % (tok.type, tok.value, tok.lineno,tok.lexpos)) + if not tok: + break + sys.stdout.write('(%s,%r,%d,%d)\n' % (tok.type, tok.value, tok.lineno, tok.lexpos)) # ----------------------------------------------------------------------------- # @TOKEN(regex) @@ -1045,14 +1087,13 @@ # ----------------------------------------------------------------------------- def TOKEN(r): - def set_doc(f): - if hasattr(r,"__call__"): - f.__doc__ = r.__doc__ + def set_regex(f): + if hasattr(r, '__call__'): + f.regex = _get_regex(r) else: - f.__doc__ = r + f.regex = r return f - return set_doc + return set_regex # Alternative spelling of the TOKEN decorator Token = TOKEN - diff -Nru pypy-7.1.1+dfsg/lib_pypy/cffi/_pycparser/ply/LICENSE pypy-7.3.1+dfsg/lib_pypy/cffi/_pycparser/ply/LICENSE --- pypy-7.1.1+dfsg/lib_pypy/cffi/_pycparser/ply/LICENSE 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/cffi/_pycparser/ply/LICENSE 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,34 @@ +PLY (Python Lex-Yacc) Version 3.10 + +Copyright (C) 2001-2017 +David M. Beazley (Dabeaz LLC) +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 David Beazley or Dabeaz LLC may be used to + endorse or promote products derived from this software without + specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +More information about PLY can be obtained on the PLY webpage at: + + http://www.dabeaz.com/ply diff -Nru pypy-7.1.1+dfsg/lib_pypy/cffi/_pycparser/ply/yacc.py pypy-7.3.1+dfsg/lib_pypy/cffi/_pycparser/ply/yacc.py --- pypy-7.1.1+dfsg/lib_pypy/cffi/_pycparser/ply/yacc.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/cffi/_pycparser/ply/yacc.py 2020-04-10 19:28:40.000000000 +0000 @@ -1,22 +1,22 @@ # ----------------------------------------------------------------------------- # ply: yacc.py # -# Copyright (C) 2001-2011, +# Copyright (C) 2001-2017 # David M. Beazley (Dabeaz LLC) # 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. +# * 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. +# and/or other materials provided with the distribution. # * Neither the name of the David Beazley or Dabeaz LLC may be used to # endorse or promote products derived from this software without -# specific prior written permission. +# 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 @@ -59,8 +59,16 @@ # own risk! # ---------------------------------------------------------------------------- -__version__ = "3.4" -__tabversion__ = "3.2" # Table version +import re +import types +import sys +import os.path +import inspect +import base64 +import warnings + +__version__ = '3.10' +__tabversion__ = '3.10' #----------------------------------------------------------------------------- # === User configurable parameters === @@ -68,7 +76,7 @@ # Change these to modify the default behavior of yacc (if you wish) #----------------------------------------------------------------------------- -yaccdebug = 1 # Debugging mode. If set, yacc generates a +yaccdebug = True # Debugging mode. If set, yacc generates a # a 'parser.out' file in the current directory debug_file = 'parser.out' # Default name of the debugging file @@ -77,86 +85,117 @@ error_count = 3 # Number of symbols that must be shifted to leave recovery mode -yaccdevel = 0 # Set to True if developing yacc. This turns off optimized +yaccdevel = False # Set to True if developing yacc. This turns off optimized # implementations of certain functions. resultlimit = 40 # Size limit of results when running in debug mode. pickle_protocol = 0 # Protocol to use when writing pickle files -import re, types, sys, os.path - -# Compatibility function for python 2.6/3.0 +# String type-checking compatibility if sys.version_info[0] < 3: - def func_code(f): - return f.func_code + string_types = basestring else: - def func_code(f): - return f.__code__ + string_types = str -# Compatibility -try: - MAXINT = sys.maxint -except AttributeError: - MAXINT = sys.maxsize - -# Python 2.x/3.0 compatibility. -def load_ply_lex(): - if sys.version_info[0] < 3: - import lex - else: - import ply.lex as lex - return lex +MAXINT = sys.maxsize -# This object is a stand-in for a logging object created by the +# This object is a stand-in for a logging object created by the # logging module. PLY will use this by default to create things # such as the parser.out file. If a user wants more detailed # information, they can create their own logging object and pass # it into PLY. class PlyLogger(object): - def __init__(self,f): + def __init__(self, f): self.f = f - def debug(self,msg,*args,**kwargs): - self.f.write((msg % args) + "\n") - info = debug - def warning(self,msg,*args,**kwargs): - self.f.write("WARNING: "+ (msg % args) + "\n") + def debug(self, msg, *args, **kwargs): + self.f.write((msg % args) + '\n') + + info = debug + + def warning(self, msg, *args, **kwargs): + self.f.write('WARNING: ' + (msg % args) + '\n') - def error(self,msg,*args,**kwargs): - self.f.write("ERROR: " + (msg % args) + "\n") + def error(self, msg, *args, **kwargs): + self.f.write('ERROR: ' + (msg % args) + '\n') critical = debug # Null logger is used when no output is generated. Does nothing. class NullLogger(object): - def __getattribute__(self,name): + def __getattribute__(self, name): return self - def __call__(self,*args,**kwargs): + + def __call__(self, *args, **kwargs): return self - + # Exception raised for yacc-related errors -class YaccError(Exception): pass +class YaccError(Exception): + pass # Format the result message that the parser produces when running in debug mode. def format_result(r): repr_str = repr(r) - if '\n' in repr_str: repr_str = repr(repr_str) + if '\n' in repr_str: + repr_str = repr(repr_str) if len(repr_str) > resultlimit: - repr_str = repr_str[:resultlimit]+" ..." - result = "<%s @ 0x%x> (%s)" % (type(r).__name__,id(r),repr_str) + repr_str = repr_str[:resultlimit] + ' ...' + result = '<%s @ 0x%x> (%s)' % (type(r).__name__, id(r), repr_str) return result - # Format stack entries when the parser is running in debug mode def format_stack_entry(r): repr_str = repr(r) - if '\n' in repr_str: repr_str = repr(repr_str) + if '\n' in repr_str: + repr_str = repr(repr_str) if len(repr_str) < 16: return repr_str else: - return "<%s @ 0x%x>" % (type(r).__name__,id(r)) + return '<%s @ 0x%x>' % (type(r).__name__, id(r)) + +# Panic mode error recovery support. This feature is being reworked--much of the +# code here is to offer a deprecation/backwards compatible transition + +_errok = None +_token = None +_restart = None +_warnmsg = '''PLY: Don't use global functions errok(), token(), and restart() in p_error(). +Instead, invoke the methods on the associated parser instance: + + def p_error(p): + ... + # Use parser.errok(), parser.token(), parser.restart() + ... + + parser = yacc.yacc() +''' + +def errok(): + warnings.warn(_warnmsg) + return _errok() + +def restart(): + warnings.warn(_warnmsg) + return _restart() + +def token(): + warnings.warn(_warnmsg) + return _token() + +# Utility function to call the p_error() function with some deprecation hacks +def call_errorfunc(errorfunc, token, parser): + global _errok, _token, _restart + _errok = parser.errok + _token = parser.token + _restart = parser.restart + r = errorfunc(token) + try: + del _errok, _token, _restart + except NameError: + pass + return r #----------------------------------------------------------------------------- # === LR Parsing Engine === @@ -176,8 +215,11 @@ # .endlexpos = Ending lex position (optional, set automatically) class YaccSymbol: - def __str__(self): return self.type - def __repr__(self): return str(self) + def __str__(self): + return self.type + + def __repr__(self): + return str(self) # This class is a wrapper around the objects actually passed to each # grammar rule. Index lookup and assignment actually assign the @@ -189,46 +231,50 @@ # representing the range of positional information for a symbol. class YaccProduction: - def __init__(self,s,stack=None): + def __init__(self, s, stack=None): self.slice = s self.stack = stack self.lexer = None - self.parser= None - def __getitem__(self,n): - if n >= 0: return self.slice[n].value - else: return self.stack[n].value + self.parser = None + + def __getitem__(self, n): + if isinstance(n, slice): + return [s.value for s in self.slice[n]] + elif n >= 0: + return self.slice[n].value + else: + return self.stack[n].value - def __setitem__(self,n,v): + def __setitem__(self, n, v): self.slice[n].value = v - def __getslice__(self,i,j): + def __getslice__(self, i, j): return [s.value for s in self.slice[i:j]] def __len__(self): return len(self.slice) - def lineno(self,n): - return getattr(self.slice[n],"lineno",0) + def lineno(self, n): + return getattr(self.slice[n], 'lineno', 0) - def set_lineno(self,n,lineno): + def set_lineno(self, n, lineno): self.slice[n].lineno = lineno - def linespan(self,n): - startline = getattr(self.slice[n],"lineno",0) - endline = getattr(self.slice[n],"endlineno",startline) - return startline,endline - - def lexpos(self,n): - return getattr(self.slice[n],"lexpos",0) - - def lexspan(self,n): - startpos = getattr(self.slice[n],"lexpos",0) - endpos = getattr(self.slice[n],"endlexpos",startpos) - return startpos,endpos + def linespan(self, n): + startline = getattr(self.slice[n], 'lineno', 0) + endline = getattr(self.slice[n], 'endlineno', startline) + return startline, endline + + def lexpos(self, n): + return getattr(self.slice[n], 'lexpos', 0) + + def lexspan(self, n): + startpos = getattr(self.slice[n], 'lexpos', 0) + endpos = getattr(self.slice[n], 'endlexpos', startpos) + return startpos, endpos def error(self): - raise SyntaxError - + raise SyntaxError # ----------------------------------------------------------------------------- # == LRParser == @@ -237,14 +283,16 @@ # ----------------------------------------------------------------------------- class LRParser: - def __init__(self,lrtab,errorf): + def __init__(self, lrtab, errorf): self.productions = lrtab.lr_productions - self.action = lrtab.lr_action - self.goto = lrtab.lr_goto - self.errorfunc = errorf + self.action = lrtab.lr_action + self.goto = lrtab.lr_goto + self.errorfunc = errorf + self.set_defaulted_states() + self.errorok = True def errok(self): - self.errorok = 1 + self.errorok = True def restart(self): del self.statestack[:] @@ -254,24 +302,42 @@ self.symstack.append(sym) self.statestack.append(0) - def parse(self,input=None,lexer=None,debug=0,tracking=0,tokenfunc=None): + # Defaulted state support. + # This method identifies parser states where there is only one possible reduction action. + # For such states, the parser can make a choose to make a rule reduction without consuming + # the next look-ahead token. This delayed invocation of the tokenizer can be useful in + # certain kinds of advanced parsing situations where the lexer and parser interact with + # each other or change states (i.e., manipulation of scope, lexer states, etc.). + # + # See: https://www.gnu.org/software/bison/manual/html_node/Default-Reductions.html#Default-Reductions + def set_defaulted_states(self): + self.defaulted_states = {} + for state, actions in self.action.items(): + rules = list(actions.values()) + if len(rules) == 1 and rules[0] < 0: + self.defaulted_states[state] = rules[0] + + def disable_defaulted_states(self): + self.defaulted_states = {} + + def parse(self, input=None, lexer=None, debug=False, tracking=False, tokenfunc=None): if debug or yaccdevel: - if isinstance(debug,int): + if isinstance(debug, int): debug = PlyLogger(sys.stderr) - return self.parsedebug(input,lexer,debug,tracking,tokenfunc) + return self.parsedebug(input, lexer, debug, tracking, tokenfunc) elif tracking: - return self.parseopt(input,lexer,debug,tracking,tokenfunc) + return self.parseopt(input, lexer, debug, tracking, tokenfunc) else: - return self.parseopt_notrack(input,lexer,debug,tracking,tokenfunc) - + return self.parseopt_notrack(input, lexer, debug, tracking, tokenfunc) + # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! # parsedebug(). # # This is the debugging enabled version of parse(). All changes made to the - # parsing engine should be made here. For the non-debugging version, - # copy this code to a method parseopt() and delete all of the sections - # enclosed in: + # parsing engine should be made here. Optimized versions of this function + # are automatically created by the ply/ygen.py script. This script cuts out + # sections enclosed in markers such as this: # # #--! DEBUG # statements @@ -279,22 +345,24 @@ # # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - def parsedebug(self,input=None,lexer=None,debug=None,tracking=0,tokenfunc=None): - lookahead = None # Current lookahead symbol - lookaheadstack = [ ] # Stack of lookahead symbols - actions = self.action # Local reference to action table (to avoid lookup on self.) - goto = self.goto # Local reference to goto table (to avoid lookup on self.) - prod = self.productions # Local reference to production list (to avoid lookup on self.) - pslice = YaccProduction(None) # Production object passed to grammar rules - errorcount = 0 # Used during error recovery - - # --! DEBUG - debug.info("PLY: PARSE DEBUG START") - # --! DEBUG + def parsedebug(self, input=None, lexer=None, debug=False, tracking=False, tokenfunc=None): + #--! parsedebug-start + lookahead = None # Current lookahead symbol + lookaheadstack = [] # Stack of lookahead symbols + actions = self.action # Local reference to action table (to avoid lookup on self.) + goto = self.goto # Local reference to goto table (to avoid lookup on self.) + prod = self.productions # Local reference to production list (to avoid lookup on self.) + defaulted_states = self.defaulted_states # Local reference to defaulted states + pslice = YaccProduction(None) # Production object passed to grammar rules + errorcount = 0 # Used during error recovery + + #--! DEBUG + debug.info('PLY: PARSE DEBUG START') + #--! DEBUG # If no lexer was given, we will try to use the lex module if not lexer: - lex = load_ply_lex() + from . import lex lexer = lex.lexer # Set up the lexer and parser objects on pslice @@ -306,16 +374,19 @@ lexer.input(input) if tokenfunc is None: - # Tokenize function - get_token = lexer.token + # Tokenize function + get_token = lexer.token else: - get_token = tokenfunc + get_token = tokenfunc + + # Set the parser() token method (sometimes used in error recovery) + self.token = get_token # Set up the state and symbol stacks - statestack = [ ] # Stack of parsing states + statestack = [] # Stack of parsing states self.statestack = statestack - symstack = [ ] # Stack of grammar symbols + symstack = [] # Stack of grammar symbols self.symstack = symstack pslice.stack = symstack # Put in the production @@ -325,52 +396,59 @@ statestack.append(0) sym = YaccSymbol() - sym.type = "$end" + sym.type = '$end' symstack.append(sym) state = 0 - while 1: + while True: # Get the next symbol on the input. If a lookahead symbol # is already set, we just use that. Otherwise, we'll pull # the next token off of the lookaheadstack or from the lexer - # --! DEBUG + #--! DEBUG debug.debug('') debug.debug('State : %s', state) - # --! DEBUG + #--! DEBUG - if not lookahead: - if not lookaheadstack: - lookahead = get_token() # Get the next token - else: - lookahead = lookaheadstack.pop() + if state not in defaulted_states: if not lookahead: - lookahead = YaccSymbol() - lookahead.type = "$end" + if not lookaheadstack: + lookahead = get_token() # Get the next token + else: + lookahead = lookaheadstack.pop() + if not lookahead: + lookahead = YaccSymbol() + lookahead.type = '$end' + + # Check the action table + ltype = lookahead.type + t = actions[state].get(ltype) + else: + t = defaulted_states[state] + #--! DEBUG + debug.debug('Defaulted state %s: Reduce using %d', state, -t) + #--! DEBUG - # --! DEBUG + #--! DEBUG debug.debug('Stack : %s', - ("%s . %s" % (" ".join([xx.type for xx in symstack][1:]), str(lookahead))).lstrip()) - # --! DEBUG - - # Check the action table - ltype = lookahead.type - t = actions[state].get(ltype) + ('%s . %s' % (' '.join([xx.type for xx in symstack][1:]), str(lookahead))).lstrip()) + #--! DEBUG if t is not None: if t > 0: # shift a symbol on the stack statestack.append(t) state = t - - # --! DEBUG - debug.debug("Action : Shift and goto state %s", t) - # --! DEBUG + + #--! DEBUG + debug.debug('Action : Shift and goto state %s', t) + #--! DEBUG symstack.append(lookahead) lookahead = None # Decrease error count on successful shift - if errorcount: errorcount -=1 + if errorcount: + errorcount -= 1 continue if t < 0: @@ -384,72 +462,77 @@ sym.type = pname # Production name sym.value = None - # --! DEBUG + #--! DEBUG if plen: - debug.info("Action : Reduce rule [%s] with %s and goto state %d", p.str, "["+",".join([format_stack_entry(_v.value) for _v in symstack[-plen:]])+"]",-t) + debug.info('Action : Reduce rule [%s] with %s and goto state %d', p.str, + '['+','.join([format_stack_entry(_v.value) for _v in symstack[-plen:]])+']', + goto[statestack[-1-plen]][pname]) else: - debug.info("Action : Reduce rule [%s] with %s and goto state %d", p.str, [],-t) - - # --! DEBUG + debug.info('Action : Reduce rule [%s] with %s and goto state %d', p.str, [], + goto[statestack[-1]][pname]) + + #--! DEBUG if plen: targ = symstack[-plen-1:] targ[0] = sym - # --! TRACKING + #--! TRACKING if tracking: - t1 = targ[1] - sym.lineno = t1.lineno - sym.lexpos = t1.lexpos - t1 = targ[-1] - sym.endlineno = getattr(t1,"endlineno",t1.lineno) - sym.endlexpos = getattr(t1,"endlexpos",t1.lexpos) - - # --! TRACKING + t1 = targ[1] + sym.lineno = t1.lineno + sym.lexpos = t1.lexpos + t1 = targ[-1] + sym.endlineno = getattr(t1, 'endlineno', t1.lineno) + sym.endlexpos = getattr(t1, 'endlexpos', t1.lexpos) + #--! TRACKING # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - # The code enclosed in this section is duplicated + # The code enclosed in this section is duplicated # below as a performance optimization. Make sure # changes get made in both locations. pslice.slice = targ - + try: # Call the grammar rule with our special slice object del symstack[-plen:] - del statestack[-plen:] + self.state = state p.callable(pslice) - # --! DEBUG - debug.info("Result : %s", format_result(pslice[0])) - # --! DEBUG + del statestack[-plen:] + #--! DEBUG + debug.info('Result : %s', format_result(pslice[0])) + #--! DEBUG symstack.append(sym) state = goto[statestack[-1]][pname] statestack.append(state) except SyntaxError: # If an error was set. Enter error recovery state - lookaheadstack.append(lookahead) - symstack.pop() - statestack.pop() + lookaheadstack.append(lookahead) # Save the current lookahead token + symstack.extend(targ[1:-1]) # Put the production slice back on the stack + statestack.pop() # Pop back one state (before the reduce) state = statestack[-1] sym.type = 'error' + sym.value = 'error' lookahead = sym errorcount = error_count - self.errorok = 0 + self.errorok = False + continue # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - + else: - # --! TRACKING + #--! TRACKING if tracking: - sym.lineno = lexer.lineno - sym.lexpos = lexer.lexpos - # --! TRACKING + sym.lineno = lexer.lineno + sym.lexpos = lexer.lexpos + #--! TRACKING - targ = [ sym ] + targ = [sym] # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - # The code enclosed in this section is duplicated + # The code enclosed in this section is duplicated # above as a performance optimization. Make sure # changes get made in both locations. @@ -457,41 +540,43 @@ try: # Call the grammar rule with our special slice object + self.state = state p.callable(pslice) - # --! DEBUG - debug.info("Result : %s", format_result(pslice[0])) - # --! DEBUG + #--! DEBUG + debug.info('Result : %s', format_result(pslice[0])) + #--! DEBUG symstack.append(sym) state = goto[statestack[-1]][pname] statestack.append(state) except SyntaxError: # If an error was set. Enter error recovery state - lookaheadstack.append(lookahead) - symstack.pop() - statestack.pop() + lookaheadstack.append(lookahead) # Save the current lookahead token + statestack.pop() # Pop back one state (before the reduce) state = statestack[-1] sym.type = 'error' + sym.value = 'error' lookahead = sym errorcount = error_count - self.errorok = 0 + self.errorok = False + continue # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! if t == 0: n = symstack[-1] - result = getattr(n,"value",None) - # --! DEBUG - debug.info("Done : Returning %s", format_result(result)) - debug.info("PLY: PARSE DEBUG END") - # --! DEBUG + result = getattr(n, 'value', None) + #--! DEBUG + debug.info('Done : Returning %s', format_result(result)) + debug.info('PLY: PARSE DEBUG END') + #--! DEBUG return result - if t == None: + if t is None: - # --! DEBUG + #--! DEBUG debug.error('Error : %s', - ("%s . %s" % (" ".join([xx.type for xx in symstack][1:]), str(lookahead))).lstrip()) - # --! DEBUG + ('%s . %s' % (' '.join([xx.type for xx in symstack][1:]), str(lookahead))).lstrip()) + #--! DEBUG # We have some kind of parsing error here. To handle # this, we are going to push the current token onto @@ -505,20 +590,15 @@ # errorcount == 0. if errorcount == 0 or self.errorok: errorcount = error_count - self.errorok = 0 + self.errorok = False errtoken = lookahead - if errtoken.type == "$end": + if errtoken.type == '$end': errtoken = None # End of file! if self.errorfunc: - global errok,token,restart - errok = self.errok # Set some special functions available in error recovery - token = get_token - restart = self.restart - if errtoken and not hasattr(errtoken,'lexer'): + if errtoken and not hasattr(errtoken, 'lexer'): errtoken.lexer = lexer - tok = self.errorfunc(errtoken) - del errok, token, restart # Delete special functions - + self.state = state + tok = call_errorfunc(self.errorfunc, errtoken, self) if self.errorok: # User must have done some kind of panic # mode recovery on their own. The @@ -528,14 +608,16 @@ continue else: if errtoken: - if hasattr(errtoken,"lineno"): lineno = lookahead.lineno - else: lineno = 0 + if hasattr(errtoken, 'lineno'): + lineno = lookahead.lineno + else: + lineno = 0 if lineno: - sys.stderr.write("yacc: Syntax error at line %d, token=%s\n" % (lineno, errtoken.type)) + sys.stderr.write('yacc: Syntax error at line %d, token=%s\n' % (lineno, errtoken.type)) else: - sys.stderr.write("yacc: Syntax error, token=%s" % errtoken.type) + sys.stderr.write('yacc: Syntax error, token=%s' % errtoken.type) else: - sys.stderr.write("yacc: Parse error in input. EOF\n") + sys.stderr.write('yacc: Parse error in input. EOF\n') return else: @@ -545,7 +627,7 @@ # entire parse has been rolled back and we're completely hosed. The token is # discarded and we just keep going. - if len(statestack) <= 1 and lookahead.type != "$end": + if len(statestack) <= 1 and lookahead.type != '$end': lookahead = None errtoken = None state = 0 @@ -557,7 +639,7 @@ # at the end of the file. nuke the top entry and generate an error token # Start nuking entries on the stack - if lookahead.type == "$end": + if lookahead.type == '$end': # Whoa. We're really hosed here. Bail out return @@ -566,48 +648,67 @@ if sym.type == 'error': # Hmmm. Error is on top of stack, we'll just nuke input # symbol and continue + #--! TRACKING + if tracking: + sym.endlineno = getattr(lookahead, 'lineno', sym.lineno) + sym.endlexpos = getattr(lookahead, 'lexpos', sym.lexpos) + #--! TRACKING lookahead = None continue + + # Create the error symbol for the first time and make it the new lookahead symbol t = YaccSymbol() t.type = 'error' - if hasattr(lookahead,"lineno"): - t.lineno = lookahead.lineno + + if hasattr(lookahead, 'lineno'): + t.lineno = t.endlineno = lookahead.lineno + if hasattr(lookahead, 'lexpos'): + t.lexpos = t.endlexpos = lookahead.lexpos t.value = lookahead lookaheadstack.append(lookahead) lookahead = t else: - symstack.pop() + sym = symstack.pop() + #--! TRACKING + if tracking: + lookahead.lineno = sym.lineno + lookahead.lexpos = sym.lexpos + #--! TRACKING statestack.pop() - state = statestack[-1] # Potential bug fix + state = statestack[-1] continue # Call an error function here - raise RuntimeError("yacc: internal parser error!!!\n") + raise RuntimeError('yacc: internal parser error!!!\n') + + #--! parsedebug-end # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! # parseopt(). # - # Optimized version of parse() method. DO NOT EDIT THIS CODE DIRECTLY. - # Edit the debug version above, then copy any modifications to the method - # below while removing #--! DEBUG sections. + # Optimized version of parse() method. DO NOT EDIT THIS CODE DIRECTLY! + # This code is automatically generated by the ply/ygen.py script. Make + # changes to the parsedebug() method instead. # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + def parseopt(self, input=None, lexer=None, debug=False, tracking=False, tokenfunc=None): + #--! parseopt-start + lookahead = None # Current lookahead symbol + lookaheadstack = [] # Stack of lookahead symbols + actions = self.action # Local reference to action table (to avoid lookup on self.) + goto = self.goto # Local reference to goto table (to avoid lookup on self.) + prod = self.productions # Local reference to production list (to avoid lookup on self.) + defaulted_states = self.defaulted_states # Local reference to defaulted states + pslice = YaccProduction(None) # Production object passed to grammar rules + errorcount = 0 # Used during error recovery - def parseopt(self,input=None,lexer=None,debug=0,tracking=0,tokenfunc=None): - lookahead = None # Current lookahead symbol - lookaheadstack = [ ] # Stack of lookahead symbols - actions = self.action # Local reference to action table (to avoid lookup on self.) - goto = self.goto # Local reference to goto table (to avoid lookup on self.) - prod = self.productions # Local reference to production list (to avoid lookup on self.) - pslice = YaccProduction(None) # Production object passed to grammar rules - errorcount = 0 # Used during error recovery # If no lexer was given, we will try to use the lex module if not lexer: - lex = load_ply_lex() + from . import lex lexer = lex.lexer - + # Set up the lexer and parser objects on pslice pslice.lexer = lexer pslice.parser = self @@ -617,16 +718,19 @@ lexer.input(input) if tokenfunc is None: - # Tokenize function - get_token = lexer.token + # Tokenize function + get_token = lexer.token else: - get_token = tokenfunc + get_token = tokenfunc + + # Set the parser() token method (sometimes used in error recovery) + self.token = get_token # Set up the state and symbol stacks - statestack = [ ] # Stack of parsing states + statestack = [] # Stack of parsing states self.statestack = statestack - symstack = [ ] # Stack of grammar symbols + symstack = [] # Stack of grammar symbols self.symstack = symstack pslice.stack = symstack # Put in the production @@ -639,23 +743,28 @@ sym.type = '$end' symstack.append(sym) state = 0 - while 1: + while True: # Get the next symbol on the input. If a lookahead symbol # is already set, we just use that. Otherwise, we'll pull # the next token off of the lookaheadstack or from the lexer - if not lookahead: - if not lookaheadstack: - lookahead = get_token() # Get the next token - else: - lookahead = lookaheadstack.pop() + + if state not in defaulted_states: if not lookahead: - lookahead = YaccSymbol() - lookahead.type = '$end' + if not lookaheadstack: + lookahead = get_token() # Get the next token + else: + lookahead = lookaheadstack.pop() + if not lookahead: + lookahead = YaccSymbol() + lookahead.type = '$end' + + # Check the action table + ltype = lookahead.type + t = actions[state].get(ltype) + else: + t = defaulted_states[state] - # Check the action table - ltype = lookahead.type - t = actions[state].get(ltype) if t is not None: if t > 0: @@ -663,11 +772,13 @@ statestack.append(t) state = t + symstack.append(lookahead) lookahead = None # Decrease error count on successful shift - if errorcount: errorcount -=1 + if errorcount: + errorcount -= 1 continue if t < 0: @@ -681,61 +792,64 @@ sym.type = pname # Production name sym.value = None + if plen: targ = symstack[-plen-1:] targ[0] = sym - # --! TRACKING + #--! TRACKING if tracking: - t1 = targ[1] - sym.lineno = t1.lineno - sym.lexpos = t1.lexpos - t1 = targ[-1] - sym.endlineno = getattr(t1,"endlineno",t1.lineno) - sym.endlexpos = getattr(t1,"endlexpos",t1.lexpos) - - # --! TRACKING + t1 = targ[1] + sym.lineno = t1.lineno + sym.lexpos = t1.lexpos + t1 = targ[-1] + sym.endlineno = getattr(t1, 'endlineno', t1.lineno) + sym.endlexpos = getattr(t1, 'endlexpos', t1.lexpos) + #--! TRACKING # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - # The code enclosed in this section is duplicated + # The code enclosed in this section is duplicated # below as a performance optimization. Make sure # changes get made in both locations. pslice.slice = targ - + try: # Call the grammar rule with our special slice object del symstack[-plen:] - del statestack[-plen:] + self.state = state p.callable(pslice) + del statestack[-plen:] symstack.append(sym) state = goto[statestack[-1]][pname] statestack.append(state) except SyntaxError: # If an error was set. Enter error recovery state - lookaheadstack.append(lookahead) - symstack.pop() - statestack.pop() + lookaheadstack.append(lookahead) # Save the current lookahead token + symstack.extend(targ[1:-1]) # Put the production slice back on the stack + statestack.pop() # Pop back one state (before the reduce) state = statestack[-1] sym.type = 'error' + sym.value = 'error' lookahead = sym errorcount = error_count - self.errorok = 0 + self.errorok = False + continue # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - + else: - # --! TRACKING + #--! TRACKING if tracking: - sym.lineno = lexer.lineno - sym.lexpos = lexer.lexpos - # --! TRACKING + sym.lineno = lexer.lineno + sym.lexpos = lexer.lexpos + #--! TRACKING - targ = [ sym ] + targ = [sym] # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - # The code enclosed in this section is duplicated + # The code enclosed in this section is duplicated # above as a performance optimization. Make sure # changes get made in both locations. @@ -743,28 +857,32 @@ try: # Call the grammar rule with our special slice object + self.state = state p.callable(pslice) symstack.append(sym) state = goto[statestack[-1]][pname] statestack.append(state) except SyntaxError: # If an error was set. Enter error recovery state - lookaheadstack.append(lookahead) - symstack.pop() - statestack.pop() + lookaheadstack.append(lookahead) # Save the current lookahead token + statestack.pop() # Pop back one state (before the reduce) state = statestack[-1] sym.type = 'error' + sym.value = 'error' lookahead = sym errorcount = error_count - self.errorok = 0 + self.errorok = False + continue # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! if t == 0: n = symstack[-1] - return getattr(n,"value",None) + result = getattr(n, 'value', None) + return result + + if t is None: - if t == None: # We have some kind of parsing error here. To handle # this, we are going to push the current token onto @@ -778,20 +896,15 @@ # errorcount == 0. if errorcount == 0 or self.errorok: errorcount = error_count - self.errorok = 0 + self.errorok = False errtoken = lookahead if errtoken.type == '$end': errtoken = None # End of file! if self.errorfunc: - global errok,token,restart - errok = self.errok # Set some special functions available in error recovery - token = get_token - restart = self.restart - if errtoken and not hasattr(errtoken,'lexer'): + if errtoken and not hasattr(errtoken, 'lexer'): errtoken.lexer = lexer - tok = self.errorfunc(errtoken) - del errok, token, restart # Delete special functions - + self.state = state + tok = call_errorfunc(self.errorfunc, errtoken, self) if self.errorok: # User must have done some kind of panic # mode recovery on their own. The @@ -801,14 +914,16 @@ continue else: if errtoken: - if hasattr(errtoken,"lineno"): lineno = lookahead.lineno - else: lineno = 0 + if hasattr(errtoken, 'lineno'): + lineno = lookahead.lineno + else: + lineno = 0 if lineno: - sys.stderr.write("yacc: Syntax error at line %d, token=%s\n" % (lineno, errtoken.type)) + sys.stderr.write('yacc: Syntax error at line %d, token=%s\n' % (lineno, errtoken.type)) else: - sys.stderr.write("yacc: Syntax error, token=%s" % errtoken.type) + sys.stderr.write('yacc: Syntax error, token=%s' % errtoken.type) else: - sys.stderr.write("yacc: Parse error in input. EOF\n") + sys.stderr.write('yacc: Parse error in input. EOF\n') return else: @@ -839,47 +954,67 @@ if sym.type == 'error': # Hmmm. Error is on top of stack, we'll just nuke input # symbol and continue + #--! TRACKING + if tracking: + sym.endlineno = getattr(lookahead, 'lineno', sym.lineno) + sym.endlexpos = getattr(lookahead, 'lexpos', sym.lexpos) + #--! TRACKING lookahead = None continue + + # Create the error symbol for the first time and make it the new lookahead symbol t = YaccSymbol() t.type = 'error' - if hasattr(lookahead,"lineno"): - t.lineno = lookahead.lineno + + if hasattr(lookahead, 'lineno'): + t.lineno = t.endlineno = lookahead.lineno + if hasattr(lookahead, 'lexpos'): + t.lexpos = t.endlexpos = lookahead.lexpos t.value = lookahead lookaheadstack.append(lookahead) lookahead = t else: - symstack.pop() + sym = symstack.pop() + #--! TRACKING + if tracking: + lookahead.lineno = sym.lineno + lookahead.lexpos = sym.lexpos + #--! TRACKING statestack.pop() - state = statestack[-1] # Potential bug fix + state = statestack[-1] continue # Call an error function here - raise RuntimeError("yacc: internal parser error!!!\n") + raise RuntimeError('yacc: internal parser error!!!\n') + + #--! parseopt-end # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! # parseopt_notrack(). # - # Optimized version of parseopt() with line number tracking removed. - # DO NOT EDIT THIS CODE DIRECTLY. Copy the optimized version and remove - # code in the #--! TRACKING sections + # Optimized version of parseopt() with line number tracking removed. + # DO NOT EDIT THIS CODE DIRECTLY. This code is automatically generated + # by the ply/ygen.py script. Make changes to the parsedebug() method instead. # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - def parseopt_notrack(self,input=None,lexer=None,debug=0,tracking=0,tokenfunc=None): - lookahead = None # Current lookahead symbol - lookaheadstack = [ ] # Stack of lookahead symbols - actions = self.action # Local reference to action table (to avoid lookup on self.) - goto = self.goto # Local reference to goto table (to avoid lookup on self.) - prod = self.productions # Local reference to production list (to avoid lookup on self.) - pslice = YaccProduction(None) # Production object passed to grammar rules - errorcount = 0 # Used during error recovery + def parseopt_notrack(self, input=None, lexer=None, debug=False, tracking=False, tokenfunc=None): + #--! parseopt-notrack-start + lookahead = None # Current lookahead symbol + lookaheadstack = [] # Stack of lookahead symbols + actions = self.action # Local reference to action table (to avoid lookup on self.) + goto = self.goto # Local reference to goto table (to avoid lookup on self.) + prod = self.productions # Local reference to production list (to avoid lookup on self.) + defaulted_states = self.defaulted_states # Local reference to defaulted states + pslice = YaccProduction(None) # Production object passed to grammar rules + errorcount = 0 # Used during error recovery + # If no lexer was given, we will try to use the lex module if not lexer: - lex = load_ply_lex() + from . import lex lexer = lex.lexer - + # Set up the lexer and parser objects on pslice pslice.lexer = lexer pslice.parser = self @@ -889,16 +1024,19 @@ lexer.input(input) if tokenfunc is None: - # Tokenize function - get_token = lexer.token + # Tokenize function + get_token = lexer.token else: - get_token = tokenfunc + get_token = tokenfunc + + # Set the parser() token method (sometimes used in error recovery) + self.token = get_token # Set up the state and symbol stacks - statestack = [ ] # Stack of parsing states + statestack = [] # Stack of parsing states self.statestack = statestack - symstack = [ ] # Stack of grammar symbols + symstack = [] # Stack of grammar symbols self.symstack = symstack pslice.stack = symstack # Put in the production @@ -911,23 +1049,28 @@ sym.type = '$end' symstack.append(sym) state = 0 - while 1: + while True: # Get the next symbol on the input. If a lookahead symbol # is already set, we just use that. Otherwise, we'll pull # the next token off of the lookaheadstack or from the lexer - if not lookahead: - if not lookaheadstack: - lookahead = get_token() # Get the next token - else: - lookahead = lookaheadstack.pop() + + if state not in defaulted_states: if not lookahead: - lookahead = YaccSymbol() - lookahead.type = '$end' + if not lookaheadstack: + lookahead = get_token() # Get the next token + else: + lookahead = lookaheadstack.pop() + if not lookahead: + lookahead = YaccSymbol() + lookahead.type = '$end' + + # Check the action table + ltype = lookahead.type + t = actions[state].get(ltype) + else: + t = defaulted_states[state] - # Check the action table - ltype = lookahead.type - t = actions[state].get(ltype) if t is not None: if t > 0: @@ -935,11 +1078,13 @@ statestack.append(t) state = t + symstack.append(lookahead) lookahead = None # Decrease error count on successful shift - if errorcount: errorcount -=1 + if errorcount: + errorcount -= 1 continue if t < 0: @@ -953,44 +1098,50 @@ sym.type = pname # Production name sym.value = None + if plen: targ = symstack[-plen-1:] targ[0] = sym + # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - # The code enclosed in this section is duplicated + # The code enclosed in this section is duplicated # below as a performance optimization. Make sure # changes get made in both locations. pslice.slice = targ - + try: # Call the grammar rule with our special slice object del symstack[-plen:] - del statestack[-plen:] + self.state = state p.callable(pslice) + del statestack[-plen:] symstack.append(sym) state = goto[statestack[-1]][pname] statestack.append(state) except SyntaxError: # If an error was set. Enter error recovery state - lookaheadstack.append(lookahead) - symstack.pop() - statestack.pop() + lookaheadstack.append(lookahead) # Save the current lookahead token + symstack.extend(targ[1:-1]) # Put the production slice back on the stack + statestack.pop() # Pop back one state (before the reduce) state = statestack[-1] sym.type = 'error' + sym.value = 'error' lookahead = sym errorcount = error_count - self.errorok = 0 + self.errorok = False + continue # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - + else: - targ = [ sym ] + + targ = [sym] # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - # The code enclosed in this section is duplicated + # The code enclosed in this section is duplicated # above as a performance optimization. Make sure # changes get made in both locations. @@ -998,28 +1149,32 @@ try: # Call the grammar rule with our special slice object + self.state = state p.callable(pslice) symstack.append(sym) state = goto[statestack[-1]][pname] statestack.append(state) except SyntaxError: # If an error was set. Enter error recovery state - lookaheadstack.append(lookahead) - symstack.pop() - statestack.pop() + lookaheadstack.append(lookahead) # Save the current lookahead token + statestack.pop() # Pop back one state (before the reduce) state = statestack[-1] sym.type = 'error' + sym.value = 'error' lookahead = sym errorcount = error_count - self.errorok = 0 + self.errorok = False + continue # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! if t == 0: n = symstack[-1] - return getattr(n,"value",None) + result = getattr(n, 'value', None) + return result + + if t is None: - if t == None: # We have some kind of parsing error here. To handle # this, we are going to push the current token onto @@ -1033,20 +1188,15 @@ # errorcount == 0. if errorcount == 0 or self.errorok: errorcount = error_count - self.errorok = 0 + self.errorok = False errtoken = lookahead if errtoken.type == '$end': errtoken = None # End of file! if self.errorfunc: - global errok,token,restart - errok = self.errok # Set some special functions available in error recovery - token = get_token - restart = self.restart - if errtoken and not hasattr(errtoken,'lexer'): + if errtoken and not hasattr(errtoken, 'lexer'): errtoken.lexer = lexer - tok = self.errorfunc(errtoken) - del errok, token, restart # Delete special functions - + self.state = state + tok = call_errorfunc(self.errorfunc, errtoken, self) if self.errorok: # User must have done some kind of panic # mode recovery on their own. The @@ -1056,14 +1206,16 @@ continue else: if errtoken: - if hasattr(errtoken,"lineno"): lineno = lookahead.lineno - else: lineno = 0 + if hasattr(errtoken, 'lineno'): + lineno = lookahead.lineno + else: + lineno = 0 if lineno: - sys.stderr.write("yacc: Syntax error at line %d, token=%s\n" % (lineno, errtoken.type)) + sys.stderr.write('yacc: Syntax error at line %d, token=%s\n' % (lineno, errtoken.type)) else: - sys.stderr.write("yacc: Syntax error, token=%s" % errtoken.type) + sys.stderr.write('yacc: Syntax error, token=%s' % errtoken.type) else: - sys.stderr.write("yacc: Parse error in input. EOF\n") + sys.stderr.write('yacc: Parse error in input. EOF\n') return else: @@ -1096,32 +1248,37 @@ # symbol and continue lookahead = None continue + + # Create the error symbol for the first time and make it the new lookahead symbol t = YaccSymbol() t.type = 'error' - if hasattr(lookahead,"lineno"): - t.lineno = lookahead.lineno + + if hasattr(lookahead, 'lineno'): + t.lineno = t.endlineno = lookahead.lineno + if hasattr(lookahead, 'lexpos'): + t.lexpos = t.endlexpos = lookahead.lexpos t.value = lookahead lookaheadstack.append(lookahead) lookahead = t else: - symstack.pop() + sym = symstack.pop() statestack.pop() - state = statestack[-1] # Potential bug fix + state = statestack[-1] continue # Call an error function here - raise RuntimeError("yacc: internal parser error!!!\n") + raise RuntimeError('yacc: internal parser error!!!\n') + + #--! parseopt-notrack-end # ----------------------------------------------------------------------------- # === Grammar Representation === # # The following functions, classes, and variables are used to represent and -# manipulate the rules that make up a grammar. +# manipulate the rules that make up a grammar. # ----------------------------------------------------------------------------- -import re - # regex matching identifiers _is_identifier = re.compile(r'^[a-zA-Z0-9_-]+$') @@ -1131,7 +1288,7 @@ # This class stores the raw information about a single production or grammar rule. # A grammar rule refers to a specification such as this: # -# expr : expr PLUS term +# expr : expr PLUS term # # Here are the basic attributes defined on all productions # @@ -1151,7 +1308,7 @@ class Production(object): reduced = 0 - def __init__(self,number,name,prod,precedence=('right',0),func=None,file='',line=0): + def __init__(self, number, name, prod, precedence=('right', 0), func=None, file='', line=0): self.name = name self.prod = tuple(prod) self.number = number @@ -1162,11 +1319,11 @@ self.prec = precedence # Internal settings used during table construction - + self.len = len(self.prod) # Length of the production # Create a list of unique production symbols used in the production - self.usyms = [ ] + self.usyms = [] for s in self.prod: if s not in self.usyms: self.usyms.append(s) @@ -1177,15 +1334,15 @@ # Create a string representation if self.prod: - self.str = "%s -> %s" % (self.name," ".join(self.prod)) + self.str = '%s -> %s' % (self.name, ' '.join(self.prod)) else: - self.str = "%s -> " % self.name + self.str = '%s -> ' % self.name def __str__(self): return self.str def __repr__(self): - return "Production("+str(self)+")" + return 'Production(' + str(self) + ')' def __len__(self): return len(self.prod) @@ -1193,28 +1350,27 @@ def __nonzero__(self): return 1 - def __getitem__(self,index): + def __getitem__(self, index): return self.prod[index] - - # Return the nth lr_item from the production (or None if at the end) - def lr_item(self,n): - if n > len(self.prod): return None - p = LRItem(self,n) - # Precompute the list of productions immediately following. Hack. Remove later + # Return the nth lr_item from the production (or None if at the end) + def lr_item(self, n): + if n > len(self.prod): + return None + p = LRItem(self, n) + # Precompute the list of productions immediately following. try: p.lr_after = Prodnames[p.prod[n+1]] - except (IndexError,KeyError): + except (IndexError, KeyError): p.lr_after = [] try: p.lr_before = p.prod[n-1] except IndexError: p.lr_before = None - return p - + # Bind the production function name to a callable - def bind(self,pdict): + def bind(self, pdict): if self.func: self.callable = pdict[self.func] @@ -1223,7 +1379,7 @@ # actually used by the LR parsing engine, plus some additional # debugging information. class MiniProduction(object): - def __init__(self,str,name,len,func,file,line): + def __init__(self, str, name, len, func, file, line): self.name = name self.len = len self.func = func @@ -1231,13 +1387,15 @@ self.file = file self.line = line self.str = str + def __str__(self): return self.str + def __repr__(self): - return "MiniProduction(%s)" % self.str + return 'MiniProduction(%s)' % self.str # Bind the production function name to a callable - def bind(self,pdict): + def bind(self, pdict): if self.func: self.callable = pdict[self.func] @@ -1246,9 +1404,9 @@ # class LRItem # # This class represents a specific stage of parsing a production rule. For -# example: +# example: # -# expr : expr . PLUS term +# expr : expr . PLUS term # # In the above, the "." represents the current location of the parse. Here # basic attributes: @@ -1267,26 +1425,26 @@ # ----------------------------------------------------------------------------- class LRItem(object): - def __init__(self,p,n): + def __init__(self, p, n): self.name = p.name self.prod = list(p.prod) self.number = p.number self.lr_index = n - self.lookaheads = { } - self.prod.insert(n,".") + self.lookaheads = {} + self.prod.insert(n, '.') self.prod = tuple(self.prod) self.len = len(self.prod) self.usyms = p.usyms def __str__(self): if self.prod: - s = "%s -> %s" % (self.name," ".join(self.prod)) + s = '%s -> %s' % (self.name, ' '.join(self.prod)) else: - s = "%s -> " % self.name + s = '%s -> ' % self.name return s def __repr__(self): - return "LRItem("+str(self)+")" + return 'LRItem(' + str(self) + ')' # ----------------------------------------------------------------------------- # rightmost_terminal() @@ -1309,21 +1467,22 @@ # This data is used for critical parts of the table generation process later. # ----------------------------------------------------------------------------- -class GrammarError(YaccError): pass +class GrammarError(YaccError): + pass class Grammar(object): - def __init__(self,terminals): + def __init__(self, terminals): self.Productions = [None] # A list of all of the productions. The first # entry is always reserved for the purpose of # building an augmented grammar - self.Prodnames = { } # A dictionary mapping the names of nonterminals to a list of all + self.Prodnames = {} # A dictionary mapping the names of nonterminals to a list of all # productions of that nonterminal. - self.Prodmap = { } # A dictionary that is only used to detect duplicate + self.Prodmap = {} # A dictionary that is only used to detect duplicate # productions. - self.Terminals = { } # A dictionary mapping the names of terminal symbols to a + self.Terminals = {} # A dictionary mapping the names of terminal symbols to a # list of the rules where they are used. for term in terminals: @@ -1331,17 +1490,17 @@ self.Terminals['error'] = [] - self.Nonterminals = { } # A dictionary mapping names of nonterminals to a list + self.Nonterminals = {} # A dictionary mapping names of nonterminals to a list # of rule numbers where they are used. - self.First = { } # A dictionary of precomputed FIRST(x) symbols + self.First = {} # A dictionary of precomputed FIRST(x) symbols - self.Follow = { } # A dictionary of precomputed FOLLOW(x) symbols + self.Follow = {} # A dictionary of precomputed FOLLOW(x) symbols - self.Precedence = { } # Precedence rules for each terminal. Contains tuples of the + self.Precedence = {} # Precedence rules for each terminal. Contains tuples of the # form ('right',level) or ('nonassoc', level) or ('left',level) - self.UsedPrecedence = { } # Precedence rules that were actually used by the grammer. + self.UsedPrecedence = set() # Precedence rules that were actually used by the grammer. # This is only used to provide error checking and to generate # a warning about unused precedence rules. @@ -1351,7 +1510,7 @@ def __len__(self): return len(self.Productions) - def __getitem__(self,index): + def __getitem__(self, index): return self.Productions[index] # ----------------------------------------------------------------------------- @@ -1362,14 +1521,14 @@ # # ----------------------------------------------------------------------------- - def set_precedence(self,term,assoc,level): - assert self.Productions == [None],"Must call set_precedence() before add_production()" + def set_precedence(self, term, assoc, level): + assert self.Productions == [None], 'Must call set_precedence() before add_production()' if term in self.Precedence: - raise GrammarError("Precedence already specified for terminal '%s'" % term) - if assoc not in ['left','right','nonassoc']: + raise GrammarError('Precedence already specified for terminal %r' % term) + if assoc not in ['left', 'right', 'nonassoc']: raise GrammarError("Associativity must be one of 'left','right', or 'nonassoc'") - self.Precedence[term] = (assoc,level) - + self.Precedence[term] = (assoc, level) + # ----------------------------------------------------------------------------- # add_production() # @@ -1387,72 +1546,74 @@ # are valid and that %prec is used correctly. # ----------------------------------------------------------------------------- - def add_production(self,prodname,syms,func=None,file='',line=0): + def add_production(self, prodname, syms, func=None, file='', line=0): if prodname in self.Terminals: - raise GrammarError("%s:%d: Illegal rule name '%s'. Already defined as a token" % (file,line,prodname)) + raise GrammarError('%s:%d: Illegal rule name %r. Already defined as a token' % (file, line, prodname)) if prodname == 'error': - raise GrammarError("%s:%d: Illegal rule name '%s'. error is a reserved word" % (file,line,prodname)) + raise GrammarError('%s:%d: Illegal rule name %r. error is a reserved word' % (file, line, prodname)) if not _is_identifier.match(prodname): - raise GrammarError("%s:%d: Illegal rule name '%s'" % (file,line,prodname)) + raise GrammarError('%s:%d: Illegal rule name %r' % (file, line, prodname)) - # Look for literal tokens - for n,s in enumerate(syms): + # Look for literal tokens + for n, s in enumerate(syms): if s[0] in "'\"": - try: - c = eval(s) - if (len(c) > 1): - raise GrammarError("%s:%d: Literal token %s in rule '%s' may only be a single character" % (file,line,s, prodname)) - if not c in self.Terminals: - self.Terminals[c] = [] - syms[n] = c - continue - except SyntaxError: - pass + try: + c = eval(s) + if (len(c) > 1): + raise GrammarError('%s:%d: Literal token %s in rule %r may only be a single character' % + (file, line, s, prodname)) + if c not in self.Terminals: + self.Terminals[c] = [] + syms[n] = c + continue + except SyntaxError: + pass if not _is_identifier.match(s) and s != '%prec': - raise GrammarError("%s:%d: Illegal name '%s' in rule '%s'" % (file,line,s, prodname)) - + raise GrammarError('%s:%d: Illegal name %r in rule %r' % (file, line, s, prodname)) + # Determine the precedence level if '%prec' in syms: if syms[-1] == '%prec': - raise GrammarError("%s:%d: Syntax error. Nothing follows %%prec" % (file,line)) + raise GrammarError('%s:%d: Syntax error. Nothing follows %%prec' % (file, line)) if syms[-2] != '%prec': - raise GrammarError("%s:%d: Syntax error. %%prec can only appear at the end of a grammar rule" % (file,line)) + raise GrammarError('%s:%d: Syntax error. %%prec can only appear at the end of a grammar rule' % + (file, line)) precname = syms[-1] - prodprec = self.Precedence.get(precname,None) + prodprec = self.Precedence.get(precname) if not prodprec: - raise GrammarError("%s:%d: Nothing known about the precedence of '%s'" % (file,line,precname)) + raise GrammarError('%s:%d: Nothing known about the precedence of %r' % (file, line, precname)) else: - self.UsedPrecedence[precname] = 1 + self.UsedPrecedence.add(precname) del syms[-2:] # Drop %prec from the rule else: # If no %prec, precedence is determined by the rightmost terminal symbol - precname = rightmost_terminal(syms,self.Terminals) - prodprec = self.Precedence.get(precname,('right',0)) - + precname = rightmost_terminal(syms, self.Terminals) + prodprec = self.Precedence.get(precname, ('right', 0)) + # See if the rule is already in the rulemap - map = "%s -> %s" % (prodname,syms) + map = '%s -> %s' % (prodname, syms) if map in self.Prodmap: m = self.Prodmap[map] - raise GrammarError("%s:%d: Duplicate rule %s. " % (file,line, m) + - "Previous definition at %s:%d" % (m.file, m.line)) + raise GrammarError('%s:%d: Duplicate rule %s. ' % (file, line, m) + + 'Previous definition at %s:%d' % (m.file, m.line)) # From this point on, everything is valid. Create a new Production instance pnumber = len(self.Productions) - if not prodname in self.Nonterminals: - self.Nonterminals[prodname] = [ ] + if prodname not in self.Nonterminals: + self.Nonterminals[prodname] = [] # Add the production number to Terminals and Nonterminals for t in syms: if t in self.Terminals: self.Terminals[t].append(pnumber) else: - if not t in self.Nonterminals: - self.Nonterminals[t] = [ ] + if t not in self.Nonterminals: + self.Nonterminals[t] = [] self.Nonterminals[t].append(pnumber) # Create a production and add it to the list of productions - p = Production(pnumber,prodname,syms,prodprec,func,file,line) + p = Production(pnumber, prodname, syms, prodprec, func, file, line) self.Productions.append(p) self.Prodmap[map] = p @@ -1460,22 +1621,21 @@ try: self.Prodnames[prodname].append(p) except KeyError: - self.Prodnames[prodname] = [ p ] - return 0 + self.Prodnames[prodname] = [p] # ----------------------------------------------------------------------------- # set_start() # - # Sets the starting symbol and creates the augmented grammar. Production + # Sets the starting symbol and creates the augmented grammar. Production # rule 0 is S' -> start where start is the start symbol. # ----------------------------------------------------------------------------- - def set_start(self,start=None): + def set_start(self, start=None): if not start: start = self.Productions[1].name if start not in self.Nonterminals: - raise GrammarError("start symbol %s undefined" % start) - self.Productions[0] = Production(0,"S'",[start]) + raise GrammarError('start symbol %s undefined' % start) + self.Productions[0] = Production(0, "S'", [start]) self.Nonterminals[start].append(0) self.Start = start @@ -1487,26 +1647,20 @@ # ----------------------------------------------------------------------------- def find_unreachable(self): - + # Mark all symbols that are reachable from a symbol s def mark_reachable_from(s): - if reachable[s]: - # We've already reached symbol s. + if s in reachable: return - reachable[s] = 1 - for p in self.Prodnames.get(s,[]): + reachable.add(s) + for p in self.Prodnames.get(s, []): for r in p.prod: mark_reachable_from(r) - reachable = { } - for s in list(self.Terminals) + list(self.Nonterminals): - reachable[s] = 0 - - mark_reachable_from( self.Productions[0].prod[0] ) - - return [s for s in list(self.Nonterminals) - if not reachable[s]] - + reachable = set() + mark_reachable_from(self.Productions[0].prod[0]) + return [s for s in self.Nonterminals if s not in reachable] + # ----------------------------------------------------------------------------- # infinite_cycles() # @@ -1520,20 +1674,20 @@ # Terminals: for t in self.Terminals: - terminates[t] = 1 + terminates[t] = True - terminates['$end'] = 1 + terminates['$end'] = True # Nonterminals: # Initialize to false: for n in self.Nonterminals: - terminates[n] = 0 + terminates[n] = False # Then propagate termination until no change: - while 1: - some_change = 0 - for (n,pl) in self.Prodnames.items(): + while True: + some_change = False + for (n, pl) in self.Prodnames.items(): # Nonterminal n terminates iff any of its productions terminates. for p in pl: # Production p terminates iff all of its rhs symbols terminate. @@ -1541,19 +1695,19 @@ if not terminates[s]: # The symbol s does not terminate, # so production p does not terminate. - p_terminates = 0 + p_terminates = False break else: # didn't break from the loop, # so every symbol s terminates # so production p terminates. - p_terminates = 1 + p_terminates = True if p_terminates: # symbol n terminates! if not terminates[n]: - terminates[n] = 1 - some_change = 1 + terminates[n] = True + some_change = True # Don't need to consider any more productions for this n. break @@ -1561,9 +1715,9 @@ break infinite = [] - for (s,term) in terminates.items(): + for (s, term) in terminates.items(): if not term: - if not s in self.Prodnames and not s in self.Terminals and s != 'error': + if s not in self.Prodnames and s not in self.Terminals and s != 'error': # s is used-but-not-defined, and we've already warned of that, # so it would be overkill to say that it's also non-terminating. pass @@ -1572,22 +1726,22 @@ return infinite - # ----------------------------------------------------------------------------- # undefined_symbols() # # Find all symbols that were used the grammar, but not defined as tokens or # grammar rules. Returns a list of tuples (sym, prod) where sym in the symbol - # and prod is the production where the symbol was used. + # and prod is the production where the symbol was used. # ----------------------------------------------------------------------------- def undefined_symbols(self): result = [] for p in self.Productions: - if not p: continue + if not p: + continue for s in p.prod: - if not s in self.Prodnames and not s in self.Terminals and s != 'error': - result.append((s,p)) + if s not in self.Prodnames and s not in self.Terminals and s != 'error': + result.append((s, p)) return result # ----------------------------------------------------------------------------- @@ -1598,7 +1752,7 @@ # ----------------------------------------------------------------------------- def unused_terminals(self): unused_tok = [] - for s,v in self.Terminals.items(): + for s, v in self.Terminals.items(): if s != 'error' and not v: unused_tok.append(s) @@ -1613,7 +1767,7 @@ def unused_rules(self): unused_prod = [] - for s,v in self.Nonterminals.items(): + for s, v in self.Nonterminals.items(): if not v: p = self.Prodnames[s][0] unused_prod.append(p) @@ -1625,15 +1779,15 @@ # Returns a list of tuples (term,precedence) corresponding to precedence # rules that were never used by the grammar. term is the name of the terminal # on which precedence was applied and precedence is a string such as 'left' or - # 'right' corresponding to the type of precedence. + # 'right' corresponding to the type of precedence. # ----------------------------------------------------------------------------- def unused_precedence(self): unused = [] for termname in self.Precedence: if not (termname in self.Terminals or termname in self.UsedPrecedence): - unused.append((termname,self.Precedence[termname][0])) - + unused.append((termname, self.Precedence[termname][0])) + return unused # ------------------------------------------------------------------------- @@ -1644,19 +1798,20 @@ # During execution of compute_first1, the result may be incomplete. # Afterward (e.g., when called from compute_follow()), it will be complete. # ------------------------------------------------------------------------- - def _first(self,beta): + def _first(self, beta): # We are computing First(x1,x2,x3,...,xn) - result = [ ] + result = [] for x in beta: - x_produces_empty = 0 + x_produces_empty = False # Add all the non- symbols of First[x] to the result. for f in self.First[x]: if f == '': - x_produces_empty = 1 + x_produces_empty = True else: - if f not in result: result.append(f) + if f not in result: + result.append(f) if x_produces_empty: # We have to consider the next x in beta, @@ -1695,17 +1850,17 @@ self.First[n] = [] # Then propagate symbols until no change: - while 1: - some_change = 0 + while True: + some_change = False for n in self.Nonterminals: for p in self.Prodnames[n]: for f in self._first(p.prod): if f not in self.First[n]: - self.First[n].append( f ) - some_change = 1 + self.First[n].append(f) + some_change = True if not some_change: break - + return self.First # --------------------------------------------------------------------- @@ -1715,7 +1870,7 @@ # follow set is the set of all symbols that might follow a given # non-terminal. See the Dragon book, 2nd Ed. p. 189. # --------------------------------------------------------------------- - def compute_follow(self,start=None): + def compute_follow(self, start=None): # If already computed, return the result if self.Follow: return self.Follow @@ -1726,36 +1881,36 @@ # Add '$end' to the follow list of the start symbol for k in self.Nonterminals: - self.Follow[k] = [ ] + self.Follow[k] = [] if not start: start = self.Productions[1].name - self.Follow[start] = [ '$end' ] + self.Follow[start] = ['$end'] - while 1: - didadd = 0 + while True: + didadd = False for p in self.Productions[1:]: # Here is the production set - for i in range(len(p.prod)): - B = p.prod[i] + for i, B in enumerate(p.prod): if B in self.Nonterminals: # Okay. We got a non-terminal in a production fst = self._first(p.prod[i+1:]) - hasempty = 0 + hasempty = False for f in fst: if f != '' and f not in self.Follow[B]: self.Follow[B].append(f) - didadd = 1 + didadd = True if f == '': - hasempty = 1 + hasempty = True if hasempty or i == (len(p.prod)-1): # Add elements of follow(a) to follow(b) for f in self.Follow[p.name]: if f not in self.Follow[B]: self.Follow[B].append(f) - didadd = 1 - if not didadd: break + didadd = True + if not didadd: + break return self.Follow @@ -1779,15 +1934,15 @@ lastlri = p i = 0 lr_items = [] - while 1: + while True: if i > len(p): lri = None else: - lri = LRItem(p,i) + lri = LRItem(p, i) # Precompute the list of productions immediately following try: lri.lr_after = self.Prodnames[lri.prod[i+1]] - except (IndexError,KeyError): + except (IndexError, KeyError): lri.lr_after = [] try: lri.lr_before = lri.prod[i-1] @@ -1795,7 +1950,8 @@ lri.lr_before = None lastlri.lr_next = lri - if not lri: break + if not lri: + break lr_items.append(lri) lastlri = lri i += 1 @@ -1804,12 +1960,13 @@ # ----------------------------------------------------------------------------- # == Class LRTable == # -# This basic class represents a basic table of LR parsing information. +# This basic class represents a basic table of LR parsing information. # Methods for generating the tables are not defined here. They are defined # in the derived class LRGeneratedTable. # ----------------------------------------------------------------------------- -class VersionError(YaccError): pass +class VersionError(YaccError): + pass class LRTable(object): def __init__(self): @@ -1818,19 +1975,15 @@ self.lr_productions = None self.lr_method = None - def read_table(self,module): - if isinstance(module,types.ModuleType): + def read_table(self, module): + if isinstance(module, types.ModuleType): parsetab = module else: - if sys.version_info[0] < 3: - exec("import %s as parsetab" % module) - else: - env = { } - exec("import %s as parsetab" % module, env, env) - parsetab = env['parsetab'] + exec('import %s' % module) + parsetab = sys.modules[module] if parsetab._tabversion != __tabversion__: - raise VersionError("yacc table file version is out of date") + raise VersionError('yacc table file version is out of date') self.lr_action = parsetab._lr_action self.lr_goto = parsetab._lr_goto @@ -1842,17 +1995,20 @@ self.lr_method = parsetab._lr_method return parsetab._lr_signature - def read_pickle(self,filename): + def read_pickle(self, filename): try: import cPickle as pickle except ImportError: import pickle - in_f = open(filename,"rb") + if not os.path.exists(filename): + raise ImportError + + in_f = open(filename, 'rb') tabversion = pickle.load(in_f) if tabversion != __tabversion__: - raise VersionError("yacc table file version is out of date") + raise VersionError('yacc table file version is out of date') self.lr_method = pickle.load(in_f) signature = pickle.load(in_f) self.lr_action = pickle.load(in_f) @@ -1867,14 +2023,15 @@ return signature # Bind all production function names to callable objects in pdict - def bind_callables(self,pdict): + def bind_callables(self, pdict): for p in self.lr_productions: p.bind(pdict) - + + # ----------------------------------------------------------------------------- # === LR Generator === # -# The following classes and functions are used to generate LR parsing tables on +# The following classes and functions are used to generate LR parsing tables on # a grammar. # ----------------------------------------------------------------------------- @@ -1895,17 +2052,18 @@ # FP - Set-valued function # ------------------------------------------------------------------------------ -def digraph(X,R,FP): - N = { } +def digraph(X, R, FP): + N = {} for x in X: - N[x] = 0 + N[x] = 0 stack = [] - F = { } + F = {} for x in X: - if N[x] == 0: traverse(x,N,stack,F,X,R,FP) + if N[x] == 0: + traverse(x, N, stack, F, X, R, FP) return F -def traverse(x,N,stack,F,X,R,FP): +def traverse(x, N, stack, F, X, R, FP): stack.append(x) d = len(stack) N[x] = d @@ -1914,20 +2072,22 @@ rel = R(x) # Get y's related to x for y in rel: if N[y] == 0: - traverse(y,N,stack,F,X,R,FP) - N[x] = min(N[x],N[y]) - for a in F.get(y,[]): - if a not in F[x]: F[x].append(a) + traverse(y, N, stack, F, X, R, FP) + N[x] = min(N[x], N[y]) + for a in F.get(y, []): + if a not in F[x]: + F[x].append(a) if N[x] == d: - N[stack[-1]] = MAXINT - F[stack[-1]] = F[x] - element = stack.pop() - while element != x: - N[stack[-1]] = MAXINT - F[stack[-1]] = F[x] - element = stack.pop() + N[stack[-1]] = MAXINT + F[stack[-1]] = F[x] + element = stack.pop() + while element != x: + N[stack[-1]] = MAXINT + F[stack[-1]] = F[x] + element = stack.pop() -class LALRError(YaccError): pass +class LALRError(YaccError): + pass # ----------------------------------------------------------------------------- # == LRGeneratedTable == @@ -1937,9 +2097,9 @@ # ----------------------------------------------------------------------------- class LRGeneratedTable(LRTable): - def __init__(self,grammar,method='LALR',log=None): - if method not in ['SLR','LALR']: - raise LALRError("Unsupported method %s" % method) + def __init__(self, grammar, method='LALR', log=None): + if method not in ['SLR', 'LALR']: + raise LALRError('Unsupported method %s' % method) self.grammar = grammar self.lr_method = method @@ -1974,21 +2134,22 @@ # Compute the LR(0) closure operation on I, where I is a set of LR(0) items. - def lr0_closure(self,I): + def lr0_closure(self, I): self._add_count += 1 # Add everything in I to J J = I[:] - didadd = 1 + didadd = True while didadd: - didadd = 0 + didadd = False for j in J: for x in j.lr_after: - if getattr(x,"lr0_added",0) == self._add_count: continue + if getattr(x, 'lr0_added', 0) == self._add_count: + continue # Add B --> .G to J J.append(x.lr_next) x.lr0_added = self._add_count - didadd = 1 + didadd = True return J @@ -1999,43 +2160,43 @@ # objects). With uniqueness, we can later do fast set comparisons using # id(obj) instead of element-wise comparison. - def lr0_goto(self,I,x): + def lr0_goto(self, I, x): # First we look for a previously cached entry - g = self.lr_goto_cache.get((id(I),x),None) - if g: return g + g = self.lr_goto_cache.get((id(I), x)) + if g: + return g # Now we generate the goto set in a way that guarantees uniqueness # of the result - s = self.lr_goto_cache.get(x,None) + s = self.lr_goto_cache.get(x) if not s: - s = { } + s = {} self.lr_goto_cache[x] = s - gs = [ ] + gs = [] for p in I: n = p.lr_next if n and n.lr_before == x: - s1 = s.get(id(n),None) + s1 = s.get(id(n)) if not s1: - s1 = { } + s1 = {} s[id(n)] = s1 gs.append(n) s = s1 - g = s.get('$end',None) + g = s.get('$end') if not g: if gs: g = self.lr0_closure(gs) s['$end'] = g else: s['$end'] = gs - self.lr_goto_cache[(id(I),x)] = g + self.lr_goto_cache[(id(I), x)] = g return g # Compute the LR(0) sets of item function def lr0_items(self): - - C = [ self.lr0_closure([self.grammar.Productions[0].lr_next]) ] + C = [self.lr0_closure([self.grammar.Productions[0].lr_next])] i = 0 for I in C: self.lr0_cidhash[id(I)] = i @@ -2048,15 +2209,15 @@ i += 1 # Collect all of the symbols that could possibly be in the goto(I,X) sets - asyms = { } + asyms = {} for ii in I: for s in ii.usyms: asyms[s] = None for x in asyms: - g = self.lr0_goto(I,x) - if not g: continue - if id(g) in self.lr0_cidhash: continue + g = self.lr0_goto(I, x) + if not g or id(g) in self.lr0_cidhash: + continue self.lr0_cidhash[id(g)] = len(C) C.append(g) @@ -2091,19 +2252,21 @@ # ----------------------------------------------------------------------------- def compute_nullable_nonterminals(self): - nullable = {} + nullable = set() num_nullable = 0 - while 1: - for p in self.grammar.Productions[1:]: - if p.len == 0: - nullable[p.name] = 1 + while True: + for p in self.grammar.Productions[1:]: + if p.len == 0: + nullable.add(p.name) continue - for t in p.prod: - if not t in nullable: break - else: - nullable[p.name] = 1 - if len(nullable) == num_nullable: break - num_nullable = len(nullable) + for t in p.prod: + if t not in nullable: + break + else: + nullable.add(p.name) + if len(nullable) == num_nullable: + break + num_nullable = len(nullable) return nullable # ----------------------------------------------------------------------------- @@ -2117,16 +2280,16 @@ # The input C is the set of LR(0) items. # ----------------------------------------------------------------------------- - def find_nonterminal_transitions(self,C): - trans = [] - for state in range(len(C)): - for p in C[state]: - if p.lr_index < p.len - 1: - t = (state,p.prod[p.lr_index+1]) - if t[1] in self.grammar.Nonterminals: - if t not in trans: trans.append(t) - state = state + 1 - return trans + def find_nonterminal_transitions(self, C): + trans = [] + for stateno, state in enumerate(C): + for p in state: + if p.lr_index < p.len - 1: + t = (stateno, p.prod[p.lr_index+1]) + if t[1] in self.grammar.Nonterminals: + if t not in trans: + trans.append(t) + return trans # ----------------------------------------------------------------------------- # dr_relation() @@ -2137,21 +2300,22 @@ # Returns a list of terminals. # ----------------------------------------------------------------------------- - def dr_relation(self,C,trans,nullable): - dr_set = { } - state,N = trans + def dr_relation(self, C, trans, nullable): + dr_set = {} + state, N = trans terms = [] - g = self.lr0_goto(C[state],N) + g = self.lr0_goto(C[state], N) for p in g: - if p.lr_index < p.len - 1: - a = p.prod[p.lr_index+1] - if a in self.grammar.Terminals: - if a not in terms: terms.append(a) + if p.lr_index < p.len - 1: + a = p.prod[p.lr_index+1] + if a in self.grammar.Terminals: + if a not in terms: + terms.append(a) # This extra bit is to handle the start state if state == 0 and N == self.grammar.Productions[0].prod[0]: - terms.append('$end') + terms.append('$end') return terms @@ -2161,18 +2325,18 @@ # Computes the READS() relation (p,A) READS (t,C). # ----------------------------------------------------------------------------- - def reads_relation(self,C, trans, empty): + def reads_relation(self, C, trans, empty): # Look for empty transitions rel = [] state, N = trans - g = self.lr0_goto(C[state],N) - j = self.lr0_cidhash.get(id(g),-1) + g = self.lr0_goto(C[state], N) + j = self.lr0_cidhash.get(id(g), -1) for p in g: if p.lr_index < p.len - 1: - a = p.prod[p.lr_index + 1] - if a in empty: - rel.append((j,a)) + a = p.prod[p.lr_index + 1] + if a in empty: + rel.append((j, a)) return rel @@ -2204,8 +2368,7 @@ # # ----------------------------------------------------------------------------- - def compute_lookback_includes(self,C,trans,nullable): - + def compute_lookback_includes(self, C, trans, nullable): lookdict = {} # Dictionary of lookback relations includedict = {} # Dictionary of include relations @@ -2215,11 +2378,12 @@ dtrans[t] = 1 # Loop over all transitions and compute lookbacks and includes - for state,N in trans: + for state, N in trans: lookb = [] includes = [] for p in C[state]: - if p.name != N: continue + if p.name != N: + continue # Okay, we have a name match. We now follow the production all the way # through the state machine until we get the . on the right hand side @@ -2227,44 +2391,50 @@ lr_index = p.lr_index j = state while lr_index < p.len - 1: - lr_index = lr_index + 1 - t = p.prod[lr_index] + lr_index = lr_index + 1 + t = p.prod[lr_index] - # Check to see if this symbol and state are a non-terminal transition - if (j,t) in dtrans: - # Yes. Okay, there is some chance that this is an includes relation - # the only way to know for certain is whether the rest of the - # production derives empty - - li = lr_index + 1 - while li < p.len: - if p.prod[li] in self.grammar.Terminals: break # No forget it - if not p.prod[li] in nullable: break - li = li + 1 - else: - # Appears to be a relation between (j,t) and (state,N) - includes.append((j,t)) + # Check to see if this symbol and state are a non-terminal transition + if (j, t) in dtrans: + # Yes. Okay, there is some chance that this is an includes relation + # the only way to know for certain is whether the rest of the + # production derives empty + + li = lr_index + 1 + while li < p.len: + if p.prod[li] in self.grammar.Terminals: + break # No forget it + if p.prod[li] not in nullable: + break + li = li + 1 + else: + # Appears to be a relation between (j,t) and (state,N) + includes.append((j, t)) - g = self.lr0_goto(C[j],t) # Go to next set - j = self.lr0_cidhash.get(id(g),-1) # Go to next state + g = self.lr0_goto(C[j], t) # Go to next set + j = self.lr0_cidhash.get(id(g), -1) # Go to next state # When we get here, j is the final state, now we have to locate the production for r in C[j]: - if r.name != p.name: continue - if r.len != p.len: continue - i = 0 - # This look is comparing a production ". A B C" with "A B C ." - while i < r.lr_index: - if r.prod[i] != p.prod[i+1]: break - i = i + 1 - else: - lookb.append((j,r)) + if r.name != p.name: + continue + if r.len != p.len: + continue + i = 0 + # This look is comparing a production ". A B C" with "A B C ." + while i < r.lr_index: + if r.prod[i] != p.prod[i+1]: + break + i = i + 1 + else: + lookb.append((j, r)) for i in includes: - if not i in includedict: includedict[i] = [] - includedict[i].append((state,N)) - lookdict[(state,N)] = lookb + if i not in includedict: + includedict[i] = [] + includedict[i].append((state, N)) + lookdict[(state, N)] = lookb - return lookdict,includedict + return lookdict, includedict # ----------------------------------------------------------------------------- # compute_read_sets() @@ -2278,10 +2448,10 @@ # Returns a set containing the read sets # ----------------------------------------------------------------------------- - def compute_read_sets(self,C, ntrans, nullable): - FP = lambda x: self.dr_relation(C,x,nullable) - R = lambda x: self.reads_relation(C,x,nullable) - F = digraph(ntrans,R,FP) + def compute_read_sets(self, C, ntrans, nullable): + FP = lambda x: self.dr_relation(C, x, nullable) + R = lambda x: self.reads_relation(C, x, nullable) + F = digraph(ntrans, R, FP) return F # ----------------------------------------------------------------------------- @@ -2300,11 +2470,11 @@ # Returns a set containing the follow sets # ----------------------------------------------------------------------------- - def compute_follow_sets(self,ntrans,readsets,inclsets): - FP = lambda x: readsets[x] - R = lambda x: inclsets.get(x,[]) - F = digraph(ntrans,R,FP) - return F + def compute_follow_sets(self, ntrans, readsets, inclsets): + FP = lambda x: readsets[x] + R = lambda x: inclsets.get(x, []) + F = digraph(ntrans, R, FP) + return F # ----------------------------------------------------------------------------- # add_lookaheads() @@ -2318,15 +2488,16 @@ # in the lookbacks set # ----------------------------------------------------------------------------- - def add_lookaheads(self,lookbacks,followset): - for trans,lb in lookbacks.items(): + def add_lookaheads(self, lookbacks, followset): + for trans, lb in lookbacks.items(): # Loop over productions in lookback - for state,p in lb: - if not state in p.lookaheads: - p.lookaheads[state] = [] - f = followset.get(trans,[]) - for a in f: - if a not in p.lookaheads[state]: p.lookaheads[state].append(a) + for state, p in lb: + if state not in p.lookaheads: + p.lookaheads[state] = [] + f = followset.get(trans, []) + for a in f: + if a not in p.lookaheads[state]: + p.lookaheads[state].append(a) # ----------------------------------------------------------------------------- # add_lalr_lookaheads() @@ -2335,7 +2506,7 @@ # with LALR parsing # ----------------------------------------------------------------------------- - def add_lalr_lookaheads(self,C): + def add_lalr_lookaheads(self, C): # Determine all of the nullable nonterminals nullable = self.compute_nullable_nonterminals() @@ -2343,16 +2514,16 @@ trans = self.find_nonterminal_transitions(C) # Compute read sets - readsets = self.compute_read_sets(C,trans,nullable) + readsets = self.compute_read_sets(C, trans, nullable) # Compute lookback/includes relations - lookd, included = self.compute_lookback_includes(C,trans,nullable) + lookd, included = self.compute_lookback_includes(C, trans, nullable) # Compute LALR FOLLOW sets - followsets = self.compute_follow_sets(trans,readsets,included) + followsets = self.compute_follow_sets(trans, readsets, included) # Add all of the lookaheads - self.add_lookaheads(lookd,followsets) + self.add_lookaheads(lookd, followsets) # ----------------------------------------------------------------------------- # lr_parse_table() @@ -2366,9 +2537,9 @@ action = self.lr_action # Action array log = self.log # Logger for output - actionp = { } # Action production array (temporary) - - log.info("Parsing method: %s", self.lr_method) + actionp = {} # Action production array (temporary) + + log.info('Parsing method: %s', self.lr_method) # Step 1: Construct C = { I0, I1, ... IN}, collection of LR(0) items # This determines the number of states @@ -2382,23 +2553,23 @@ st = 0 for I in C: # Loop over each production in I - actlist = [ ] # List of actions - st_action = { } - st_actionp = { } - st_goto = { } - log.info("") - log.info("state %d", st) - log.info("") + actlist = [] # List of actions + st_action = {} + st_actionp = {} + st_goto = {} + log.info('') + log.info('state %d', st) + log.info('') for p in I: - log.info(" (%d) %s", p.number, str(p)) - log.info("") + log.info(' (%d) %s', p.number, p) + log.info('') for p in I: if p.len == p.lr_index + 1: if p.name == "S'": # Start symbol. Accept! - st_action["$end"] = 0 - st_actionp["$end"] = p + st_action['$end'] = 0 + st_actionp['$end'] = p else: # We are at the end of a production. Reduce! if self.lr_method == 'LALR': @@ -2406,31 +2577,36 @@ else: laheads = self.grammar.Follow[p.name] for a in laheads: - actlist.append((a,p,"reduce using rule %d (%s)" % (p.number,p))) - r = st_action.get(a,None) + actlist.append((a, p, 'reduce using rule %d (%s)' % (p.number, p))) + r = st_action.get(a) if r is not None: # Whoa. Have a shift/reduce or reduce/reduce conflict if r > 0: # Need to decide on shift or reduce here # By default we favor shifting. Need to add # some precedence rules here. - sprec,slevel = Productions[st_actionp[a].number].prec - rprec,rlevel = Precedence.get(a,('right',0)) + + # Shift precedence comes from the token + sprec, slevel = Precedence.get(a, ('right', 0)) + + # Reduce precedence comes from rule being reduced (p) + rprec, rlevel = Productions[p.number].prec + if (slevel < rlevel) or ((slevel == rlevel) and (rprec == 'left')): # We really need to reduce here. st_action[a] = -p.number st_actionp[a] = p if not slevel and not rlevel: - log.info(" ! shift/reduce conflict for %s resolved as reduce",a) - self.sr_conflicts.append((st,a,'reduce')) + log.info(' ! shift/reduce conflict for %s resolved as reduce', a) + self.sr_conflicts.append((st, a, 'reduce')) Productions[p.number].reduced += 1 elif (slevel == rlevel) and (rprec == 'nonassoc'): st_action[a] = None else: # Hmmm. Guess we'll keep the shift if not rlevel: - log.info(" ! shift/reduce conflict for %s resolved as shift",a) - self.sr_conflicts.append((st,a,'shift')) + log.info(' ! shift/reduce conflict for %s resolved as shift', a) + self.sr_conflicts.append((st, a, 'shift')) elif r < 0: # Reduce/reduce conflict. In this case, we favor the rule # that was defined first in the grammar file @@ -2439,15 +2615,16 @@ if oldp.line > pp.line: st_action[a] = -p.number st_actionp[a] = p - chosenp,rejectp = pp,oldp + chosenp, rejectp = pp, oldp Productions[p.number].reduced += 1 Productions[oldp.number].reduced -= 1 else: - chosenp,rejectp = oldp,pp - self.rr_conflicts.append((st,chosenp,rejectp)) - log.info(" ! reduce/reduce conflict for %s resolved using rule %d (%s)", a,st_actionp[a].number, st_actionp[a]) + chosenp, rejectp = oldp, pp + self.rr_conflicts.append((st, chosenp, rejectp)) + log.info(' ! reduce/reduce conflict for %s resolved using rule %d (%s)', + a, st_actionp[a].number, st_actionp[a]) else: - raise LALRError("Unknown conflict in state %d" % st) + raise LALRError('Unknown conflict in state %d' % st) else: st_action[a] = -p.number st_actionp[a] = p @@ -2456,99 +2633,106 @@ i = p.lr_index a = p.prod[i+1] # Get symbol right after the "." if a in self.grammar.Terminals: - g = self.lr0_goto(I,a) - j = self.lr0_cidhash.get(id(g),-1) + g = self.lr0_goto(I, a) + j = self.lr0_cidhash.get(id(g), -1) if j >= 0: # We are in a shift state - actlist.append((a,p,"shift and go to state %d" % j)) - r = st_action.get(a,None) + actlist.append((a, p, 'shift and go to state %d' % j)) + r = st_action.get(a) if r is not None: # Whoa have a shift/reduce or shift/shift conflict if r > 0: if r != j: - raise LALRError("Shift/shift conflict in state %d" % st) + raise LALRError('Shift/shift conflict in state %d' % st) elif r < 0: # Do a precedence check. # - if precedence of reduce rule is higher, we reduce. # - if precedence of reduce is same and left assoc, we reduce. # - otherwise we shift - rprec,rlevel = Productions[st_actionp[a].number].prec - sprec,slevel = Precedence.get(a,('right',0)) + + # Shift precedence comes from the token + sprec, slevel = Precedence.get(a, ('right', 0)) + + # Reduce precedence comes from the rule that could have been reduced + rprec, rlevel = Productions[st_actionp[a].number].prec + if (slevel > rlevel) or ((slevel == rlevel) and (rprec == 'right')): # We decide to shift here... highest precedence to shift Productions[st_actionp[a].number].reduced -= 1 st_action[a] = j st_actionp[a] = p if not rlevel: - log.info(" ! shift/reduce conflict for %s resolved as shift",a) - self.sr_conflicts.append((st,a,'shift')) + log.info(' ! shift/reduce conflict for %s resolved as shift', a) + self.sr_conflicts.append((st, a, 'shift')) elif (slevel == rlevel) and (rprec == 'nonassoc'): st_action[a] = None else: # Hmmm. Guess we'll keep the reduce if not slevel and not rlevel: - log.info(" ! shift/reduce conflict for %s resolved as reduce",a) - self.sr_conflicts.append((st,a,'reduce')) + log.info(' ! shift/reduce conflict for %s resolved as reduce', a) + self.sr_conflicts.append((st, a, 'reduce')) else: - raise LALRError("Unknown conflict in state %d" % st) + raise LALRError('Unknown conflict in state %d' % st) else: st_action[a] = j st_actionp[a] = p # Print the actions associated with each terminal - _actprint = { } - for a,p,m in actlist: + _actprint = {} + for a, p, m in actlist: if a in st_action: if p is st_actionp[a]: - log.info(" %-15s %s",a,m) - _actprint[(a,m)] = 1 - log.info("") + log.info(' %-15s %s', a, m) + _actprint[(a, m)] = 1 + log.info('') # Print the actions that were not used. (debugging) not_used = 0 - for a,p,m in actlist: + for a, p, m in actlist: if a in st_action: if p is not st_actionp[a]: - if not (a,m) in _actprint: - log.debug(" ! %-15s [ %s ]",a,m) + if not (a, m) in _actprint: + log.debug(' ! %-15s [ %s ]', a, m) not_used = 1 - _actprint[(a,m)] = 1 + _actprint[(a, m)] = 1 if not_used: - log.debug("") + log.debug('') # Construct the goto table for this state - nkeys = { } + nkeys = {} for ii in I: for s in ii.usyms: if s in self.grammar.Nonterminals: nkeys[s] = None for n in nkeys: - g = self.lr0_goto(I,n) - j = self.lr0_cidhash.get(id(g),-1) + g = self.lr0_goto(I, n) + j = self.lr0_cidhash.get(id(g), -1) if j >= 0: st_goto[n] = j - log.info(" %-30s shift and go to state %d",n,j) + log.info(' %-30s shift and go to state %d', n, j) action[st] = st_action actionp[st] = st_actionp goto[st] = st_goto st += 1 - # ----------------------------------------------------------------------------- # write() # # This function writes the LR parsing tables to a file # ----------------------------------------------------------------------------- - def write_table(self,modulename,outputdir='',signature=""): - basemodulename = modulename.split(".")[-1] - filename = os.path.join(outputdir,basemodulename) + ".py" + def write_table(self, tabmodule, outputdir='', signature=''): + if isinstance(tabmodule, types.ModuleType): + raise IOError("Won't overwrite existing tabmodule") + + basemodulename = tabmodule.split('.')[-1] + filename = os.path.join(outputdir, basemodulename) + '.py' try: - f = open(filename,"w") + f = open(filename, 'w') - f.write(""" + f.write(''' # %s # This file is automatically generated. Do not edit. _tabversion = %r @@ -2556,105 +2740,103 @@ _lr_method = %r _lr_signature = %r - """ % (filename, __tabversion__, self.lr_method, signature)) + ''' % (os.path.basename(filename), __tabversion__, self.lr_method, signature)) # Change smaller to 0 to go back to original tables smaller = 1 # Factor out names to try and make smaller if smaller: - items = { } + items = {} - for s,nd in self.lr_action.items(): - for name,v in nd.items(): - i = items.get(name) - if not i: - i = ([],[]) - items[name] = i - i[0].append(s) - i[1].append(v) - - f.write("\n_lr_action_items = {") - for k,v in items.items(): - f.write("%r:([" % k) + for s, nd in self.lr_action.items(): + for name, v in nd.items(): + i = items.get(name) + if not i: + i = ([], []) + items[name] = i + i[0].append(s) + i[1].append(v) + + f.write('\n_lr_action_items = {') + for k, v in items.items(): + f.write('%r:([' % k) for i in v[0]: - f.write("%r," % i) - f.write("],[") + f.write('%r,' % i) + f.write('],[') for i in v[1]: - f.write("%r," % i) + f.write('%r,' % i) - f.write("]),") - f.write("}\n") + f.write(']),') + f.write('}\n') - f.write(""" -_lr_action = { } + f.write(''' +_lr_action = {} for _k, _v in _lr_action_items.items(): for _x,_y in zip(_v[0],_v[1]): - if not _x in _lr_action: _lr_action[_x] = { } + if not _x in _lr_action: _lr_action[_x] = {} _lr_action[_x][_k] = _y del _lr_action_items -""") +''') else: - f.write("\n_lr_action = { "); - for k,v in self.lr_action.items(): - f.write("(%r,%r):%r," % (k[0],k[1],v)) - f.write("}\n"); + f.write('\n_lr_action = { ') + for k, v in self.lr_action.items(): + f.write('(%r,%r):%r,' % (k[0], k[1], v)) + f.write('}\n') if smaller: # Factor out names to try and make smaller - items = { } + items = {} - for s,nd in self.lr_goto.items(): - for name,v in nd.items(): - i = items.get(name) - if not i: - i = ([],[]) - items[name] = i - i[0].append(s) - i[1].append(v) - - f.write("\n_lr_goto_items = {") - for k,v in items.items(): - f.write("%r:([" % k) + for s, nd in self.lr_goto.items(): + for name, v in nd.items(): + i = items.get(name) + if not i: + i = ([], []) + items[name] = i + i[0].append(s) + i[1].append(v) + + f.write('\n_lr_goto_items = {') + for k, v in items.items(): + f.write('%r:([' % k) for i in v[0]: - f.write("%r," % i) - f.write("],[") + f.write('%r,' % i) + f.write('],[') for i in v[1]: - f.write("%r," % i) + f.write('%r,' % i) - f.write("]),") - f.write("}\n") + f.write(']),') + f.write('}\n') - f.write(""" -_lr_goto = { } + f.write(''' +_lr_goto = {} for _k, _v in _lr_goto_items.items(): - for _x,_y in zip(_v[0],_v[1]): - if not _x in _lr_goto: _lr_goto[_x] = { } + for _x, _y in zip(_v[0], _v[1]): + if not _x in _lr_goto: _lr_goto[_x] = {} _lr_goto[_x][_k] = _y del _lr_goto_items -""") +''') else: - f.write("\n_lr_goto = { "); - for k,v in self.lr_goto.items(): - f.write("(%r,%r):%r," % (k[0],k[1],v)) - f.write("}\n"); + f.write('\n_lr_goto = { ') + for k, v in self.lr_goto.items(): + f.write('(%r,%r):%r,' % (k[0], k[1], v)) + f.write('}\n') # Write production table - f.write("_lr_productions = [\n") + f.write('_lr_productions = [\n') for p in self.lr_productions: if p.func: - f.write(" (%r,%r,%d,%r,%r,%d),\n" % (p.str,p.name, p.len, p.func,p.file,p.line)) + f.write(' (%r,%r,%d,%r,%r,%d),\n' % (p.str, p.name, p.len, + p.func, os.path.basename(p.file), p.line)) else: - f.write(" (%r,%r,%d,None,None,None),\n" % (str(p),p.name, p.len)) - f.write("]\n") + f.write(' (%r,%r,%d,None,None,None),\n' % (str(p), p.name, p.len)) + f.write(']\n') f.close() - except IOError: - e = sys.exc_info()[1] - sys.stderr.write("Unable to create '%s'\n" % filename) - sys.stderr.write(str(e)+"\n") - return + except IOError as e: + raise # ----------------------------------------------------------------------------- @@ -2663,26 +2845,25 @@ # This function pickles the LR parsing tables to a supplied file object # ----------------------------------------------------------------------------- - def pickle_table(self,filename,signature=""): + def pickle_table(self, filename, signature=''): try: import cPickle as pickle except ImportError: import pickle - outf = open(filename,"wb") - pickle.dump(__tabversion__,outf,pickle_protocol) - pickle.dump(self.lr_method,outf,pickle_protocol) - pickle.dump(signature,outf,pickle_protocol) - pickle.dump(self.lr_action,outf,pickle_protocol) - pickle.dump(self.lr_goto,outf,pickle_protocol) + with open(filename, 'wb') as outf: + pickle.dump(__tabversion__, outf, pickle_protocol) + pickle.dump(self.lr_method, outf, pickle_protocol) + pickle.dump(signature, outf, pickle_protocol) + pickle.dump(self.lr_action, outf, pickle_protocol) + pickle.dump(self.lr_goto, outf, pickle_protocol) - outp = [] - for p in self.lr_productions: - if p.func: - outp.append((p.str,p.name, p.len, p.func,p.file,p.line)) - else: - outp.append((str(p),p.name,p.len,None,None,None)) - pickle.dump(outp,outf,pickle_protocol) - outf.close() + outp = [] + for p in self.lr_productions: + if p.func: + outp.append((p.str, p.name, p.len, p.func, os.path.basename(p.file), p.line)) + else: + outp.append((str(p), p.name, p.len, None, None, None)) + pickle.dump(outp, outf, pickle_protocol) # ----------------------------------------------------------------------------- # === INTROSPECTION === @@ -2700,26 +2881,18 @@ # ----------------------------------------------------------------------------- def get_caller_module_dict(levels): - try: - raise RuntimeError - except RuntimeError: - e,b,t = sys.exc_info() - f = t.tb_frame - while levels > 0: - f = f.f_back - levels -= 1 - ldict = f.f_globals.copy() - if f.f_globals != f.f_locals: - ldict.update(f.f_locals) - - return ldict + f = sys._getframe(levels) + ldict = f.f_globals.copy() + if f.f_globals != f.f_locals: + ldict.update(f.f_locals) + return ldict # ----------------------------------------------------------------------------- # parse_grammar() # # This takes a raw grammar rule string and parses it into production data # ----------------------------------------------------------------------------- -def parse_grammar(doc,file,line): +def parse_grammar(doc, file, line): grammar = [] # Split the doc string into lines pstrings = doc.splitlines() @@ -2728,12 +2901,13 @@ for ps in pstrings: dline += 1 p = ps.split() - if not p: continue + if not p: + continue try: if p[0] == '|': # This is a continuation of a previous rule if not lastp: - raise SyntaxError("%s:%d: Misplaced '|'" % (file,dline)) + raise SyntaxError("%s:%d: Misplaced '|'" % (file, dline)) prodname = lastp syms = p[1:] else: @@ -2742,13 +2916,13 @@ syms = p[2:] assign = p[1] if assign != ':' and assign != '::=': - raise SyntaxError("%s:%d: Syntax error. Expected ':'" % (file,dline)) + raise SyntaxError("%s:%d: Syntax error. Expected ':'" % (file, dline)) - grammar.append((file,dline,prodname,syms)) + grammar.append((file, dline, prodname, syms)) except SyntaxError: raise except Exception: - raise SyntaxError("%s:%d: Syntax error in rule '%s'" % (file,dline,ps.strip())) + raise SyntaxError('%s:%d: Syntax error in rule %r' % (file, dline, ps.strip())) return grammar @@ -2760,14 +2934,14 @@ # etc. # ----------------------------------------------------------------------------- class ParserReflect(object): - def __init__(self,pdict,log=None): + def __init__(self, pdict, log=None): self.pdict = pdict self.start = None self.error_func = None self.tokens = None - self.files = {} + self.modules = set() self.grammar = [] - self.error = 0 + self.error = False if log is None: self.log = PlyLogger(sys.stderr) @@ -2781,7 +2955,7 @@ self.get_tokens() self.get_precedence() self.get_pfunctions() - + # Validate all of the information def validate_all(self): self.validate_start() @@ -2789,32 +2963,28 @@ self.validate_tokens() self.validate_precedence() self.validate_pfunctions() - self.validate_files() + self.validate_modules() return self.error # Compute a signature over the grammar def signature(self): + parts = [] try: - from hashlib import md5 - except ImportError: - from md5 import md5 - try: - sig = md5() if self.start: - sig.update(self.start.encode('latin-1')) + parts.append(self.start) if self.prec: - sig.update("".join(["".join(p) for p in self.prec]).encode('latin-1')) + parts.append(''.join([''.join(p) for p in self.prec])) if self.tokens: - sig.update(" ".join(self.tokens).encode('latin-1')) + parts.append(' '.join(self.tokens)) for f in self.pfuncs: if f[3]: - sig.update(f[3].encode('latin-1')) - except (TypeError,ValueError): + parts.append(f[3]) + except (TypeError, ValueError): pass - return sig.digest() + return ''.join(parts) # ----------------------------------------------------------------------------- - # validate_file() + # validate_modules() # # This method checks to see if there are duplicated p_rulename() functions # in the parser module file. Without this function, it is really easy for @@ -2824,32 +2994,29 @@ # to try and detect duplicates. # ----------------------------------------------------------------------------- - def validate_files(self): + def validate_modules(self): # Match def p_funcname( fre = re.compile(r'\s*def\s+(p_[a-zA-Z_0-9]*)\(') - for filename in self.files.keys(): - base,ext = os.path.splitext(filename) - if ext != '.py': return 1 # No idea. Assume it's okay. - + for module in self.modules: try: - f = open(filename) - lines = f.readlines() - f.close() + lines, linen = inspect.getsourcelines(module) except IOError: continue - counthash = { } - for linen,l in enumerate(lines): + counthash = {} + for linen, line in enumerate(lines): linen += 1 - m = fre.match(l) + m = fre.match(line) if m: name = m.group(1) prev = counthash.get(name) if not prev: counthash[name] = linen else: - self.log.warning("%s:%d: Function %s redefined. Previously defined on line %d", filename,linen,name,prev) + filename = inspect.getsourcefile(module) + self.log.warning('%s:%d: Function %s redefined. Previously defined on line %d', + filename, linen, name, prev) # Get the start symbol def get_start(self): @@ -2858,7 +3025,7 @@ # Validate the start symbol def validate_start(self): if self.start is not None: - if not isinstance(self.start,str): + if not isinstance(self.start, string_types): self.log.error("'start' must be a string") # Look for error handler @@ -2868,39 +3035,41 @@ # Validate the error function def validate_error_func(self): if self.error_func: - if isinstance(self.error_func,types.FunctionType): + if isinstance(self.error_func, types.FunctionType): ismethod = 0 elif isinstance(self.error_func, types.MethodType): ismethod = 1 else: self.log.error("'p_error' defined, but is not a function or method") - self.error = 1 + self.error = True return - eline = func_code(self.error_func).co_firstlineno - efile = func_code(self.error_func).co_filename - self.files[efile] = 1 - - if (func_code(self.error_func).co_argcount != 1+ismethod): - self.log.error("%s:%d: p_error() requires 1 argument",efile,eline) - self.error = 1 + eline = self.error_func.__code__.co_firstlineno + efile = self.error_func.__code__.co_filename + module = inspect.getmodule(self.error_func) + self.modules.add(module) + + argcount = self.error_func.__code__.co_argcount - ismethod + if argcount != 1: + self.log.error('%s:%d: p_error() requires 1 argument', efile, eline) + self.error = True # Get the tokens map def get_tokens(self): - tokens = self.pdict.get("tokens",None) + tokens = self.pdict.get('tokens') if not tokens: - self.log.error("No token list is defined") - self.error = 1 + self.log.error('No token list is defined') + self.error = True return - if not isinstance(tokens,(list, tuple)): - self.log.error("tokens must be a list or tuple") - self.error = 1 + if not isinstance(tokens, (list, tuple)): + self.log.error('tokens must be a list or tuple') + self.error = True return - + if not tokens: - self.log.error("tokens is empty") - self.error = 1 + self.log.error('tokens is empty') + self.error = True return self.tokens = tokens @@ -2910,120 +3079,129 @@ # Validate the tokens. if 'error' in self.tokens: self.log.error("Illegal token name 'error'. Is a reserved word") - self.error = 1 + self.error = True return - terminals = {} + terminals = set() for n in self.tokens: if n in terminals: - self.log.warning("Token '%s' multiply defined", n) - terminals[n] = 1 + self.log.warning('Token %r multiply defined', n) + terminals.add(n) # Get the precedence map (if any) def get_precedence(self): - self.prec = self.pdict.get("precedence",None) + self.prec = self.pdict.get('precedence') # Validate and parse the precedence map def validate_precedence(self): preclist = [] if self.prec: - if not isinstance(self.prec,(list,tuple)): - self.log.error("precedence must be a list or tuple") - self.error = 1 + if not isinstance(self.prec, (list, tuple)): + self.log.error('precedence must be a list or tuple') + self.error = True return - for level,p in enumerate(self.prec): - if not isinstance(p,(list,tuple)): - self.log.error("Bad precedence table") - self.error = 1 + for level, p in enumerate(self.prec): + if not isinstance(p, (list, tuple)): + self.log.error('Bad precedence table') + self.error = True return if len(p) < 2: - self.log.error("Malformed precedence entry %s. Must be (assoc, term, ..., term)",p) - self.error = 1 + self.log.error('Malformed precedence entry %s. Must be (assoc, term, ..., term)', p) + self.error = True return assoc = p[0] - if not isinstance(assoc,str): - self.log.error("precedence associativity must be a string") - self.error = 1 + if not isinstance(assoc, string_types): + self.log.error('precedence associativity must be a string') + self.error = True return for term in p[1:]: - if not isinstance(term,str): - self.log.error("precedence items must be strings") - self.error = 1 + if not isinstance(term, string_types): + self.log.error('precedence items must be strings') + self.error = True return - preclist.append((term,assoc,level+1)) + preclist.append((term, assoc, level+1)) self.preclist = preclist # Get all p_functions from the grammar def get_pfunctions(self): p_functions = [] for name, item in self.pdict.items(): - if name[:2] != 'p_': continue - if name == 'p_error': continue - if isinstance(item,(types.FunctionType,types.MethodType)): - line = func_code(item).co_firstlineno - file = func_code(item).co_filename - p_functions.append((line,file,name,item.__doc__)) - - # Sort all of the actions by line number - p_functions.sort() + if not name.startswith('p_') or name == 'p_error': + continue + if isinstance(item, (types.FunctionType, types.MethodType)): + line = getattr(item, 'co_firstlineno', item.__code__.co_firstlineno) + module = inspect.getmodule(item) + p_functions.append((line, module, name, item.__doc__)) + + # Sort all of the actions by line number; make sure to stringify + # modules to make them sortable, since `line` may not uniquely sort all + # p functions + p_functions.sort(key=lambda p_function: ( + p_function[0], + str(p_function[1]), + p_function[2], + p_function[3])) self.pfuncs = p_functions - # Validate all of the p_functions def validate_pfunctions(self): grammar = [] # Check for non-empty symbols if len(self.pfuncs) == 0: - self.log.error("no rules of the form p_rulename are defined") - self.error = 1 - return - - for line, file, name, doc in self.pfuncs: + self.log.error('no rules of the form p_rulename are defined') + self.error = True + return + + for line, module, name, doc in self.pfuncs: + file = inspect.getsourcefile(module) func = self.pdict[name] if isinstance(func, types.MethodType): reqargs = 2 else: reqargs = 1 - if func_code(func).co_argcount > reqargs: - self.log.error("%s:%d: Rule '%s' has too many arguments",file,line,func.__name__) - self.error = 1 - elif func_code(func).co_argcount < reqargs: - self.log.error("%s:%d: Rule '%s' requires an argument",file,line,func.__name__) - self.error = 1 + if func.__code__.co_argcount > reqargs: + self.log.error('%s:%d: Rule %r has too many arguments', file, line, func.__name__) + self.error = True + elif func.__code__.co_argcount < reqargs: + self.log.error('%s:%d: Rule %r requires an argument', file, line, func.__name__) + self.error = True elif not func.__doc__: - self.log.warning("%s:%d: No documentation string specified in function '%s' (ignored)",file,line,func.__name__) + self.log.warning('%s:%d: No documentation string specified in function %r (ignored)', + file, line, func.__name__) else: try: - parsed_g = parse_grammar(doc,file,line) + parsed_g = parse_grammar(doc, file, line) for g in parsed_g: grammar.append((name, g)) - except SyntaxError: - e = sys.exc_info()[1] + except SyntaxError as e: self.log.error(str(e)) - self.error = 1 + self.error = True # Looks like a valid grammar rule # Mark the file in which defined. - self.files[file] = 1 + self.modules.add(module) # Secondary validation step that looks for p_ definitions that are not functions # or functions that look like they might be grammar rules. - for n,v in self.pdict.items(): - if n[0:2] == 'p_' and isinstance(v, (types.FunctionType, types.MethodType)): continue - if n[0:2] == 't_': continue - if n[0:2] == 'p_' and n != 'p_error': - self.log.warning("'%s' not defined as a function", n) - if ((isinstance(v,types.FunctionType) and func_code(v).co_argcount == 1) or - (isinstance(v,types.MethodType) and func_code(v).co_argcount == 2)): - try: - doc = v.__doc__.split(" ") - if doc[1] == ':': - self.log.warning("%s:%d: Possible grammar rule '%s' defined without p_ prefix", - func_code(v).co_filename, func_code(v).co_firstlineno,n) - except Exception: - pass + for n, v in self.pdict.items(): + if n.startswith('p_') and isinstance(v, (types.FunctionType, types.MethodType)): + continue + if n.startswith('t_'): + continue + if n.startswith('p_') and n != 'p_error': + self.log.warning('%r not defined as a function', n) + if ((isinstance(v, types.FunctionType) and v.__code__.co_argcount == 1) or + (isinstance(v, types.MethodType) and v.__func__.__code__.co_argcount == 2)): + if v.__doc__: + try: + doc = v.__doc__.split(' ') + if doc[1] == ':': + self.log.warning('%s:%d: Possible grammar rule %r defined without p_ prefix', + v.__code__.co_filename, v.__code__.co_firstlineno, n) + except IndexError: + pass self.grammar = grammar @@ -3033,14 +3211,17 @@ # Build a parser # ----------------------------------------------------------------------------- -def yacc(method='LALR', debug=yaccdebug, module=None, tabmodule=tab_module, start=None, - check_recursion=1, optimize=0, write_tables=1, debugfile=debug_file,outputdir='', - debuglog=None, errorlog = None, picklefile=None): +def yacc(method='LALR', debug=yaccdebug, module=None, tabmodule=tab_module, start=None, + check_recursion=True, optimize=False, write_tables=True, debugfile=debug_file, + outputdir=None, debuglog=None, errorlog=None, picklefile=None): - global parse # Reference to the parsing method of the last built parser + if tabmodule is None: + tabmodule = tab_module - # If pickling is enabled, table files are not created + # Reference to the parsing method of the last built parser + global parse + # If pickling is enabled, table files are not created if picklefile: write_tables = 0 @@ -3049,17 +3230,50 @@ # Get the module dictionary used for the parser if module: - _items = [(k,getattr(module,k)) for k in dir(module)] + _items = [(k, getattr(module, k)) for k in dir(module)] pdict = dict(_items) + # If no __file__ attribute is available, try to obtain it from the __module__ instead + if '__file__' not in pdict: + pdict['__file__'] = sys.modules[pdict['__module__']].__file__ else: pdict = get_caller_module_dict(2) + if outputdir is None: + # If no output directory is set, the location of the output files + # is determined according to the following rules: + # - If tabmodule specifies a package, files go into that package directory + # - Otherwise, files go in the same directory as the specifying module + if isinstance(tabmodule, types.ModuleType): + srcfile = tabmodule.__file__ + else: + if '.' not in tabmodule: + srcfile = pdict['__file__'] + else: + parts = tabmodule.split('.') + pkgname = '.'.join(parts[:-1]) + exec('import %s' % pkgname) + srcfile = getattr(sys.modules[pkgname], '__file__', '') + outputdir = os.path.dirname(srcfile) + + # Determine if the module is package of a package or not. + # If so, fix the tabmodule setting so that tables load correctly + pkg = pdict.get('__package__') + if pkg and isinstance(tabmodule, str): + if '.' not in tabmodule: + tabmodule = pkg + '.' + tabmodule + + + + # Set start symbol if it's specified directly using an argument + if start is not None: + pdict['start'] = start + # Collect parser information from the dictionary - pinfo = ParserReflect(pdict,log=errorlog) + pinfo = ParserReflect(pdict, log=errorlog) pinfo.get_all() if pinfo.error: - raise YaccError("Unable to build parser") + raise YaccError('Unable to build parser') # Check signature against table files (if any) signature = pinfo.signature() @@ -3074,35 +3288,36 @@ if optimize or (read_signature == signature): try: lr.bind_callables(pinfo.pdict) - parser = LRParser(lr,pinfo.error_func) + parser = LRParser(lr, pinfo.error_func) parse = parser.parse return parser - except Exception: - e = sys.exc_info()[1] - errorlog.warning("There was a problem loading the table file: %s", repr(e)) - except VersionError: - e = sys.exc_info() + except Exception as e: + errorlog.warning('There was a problem loading the table file: %r', e) + except VersionError as e: errorlog.warning(str(e)) - except Exception: + except ImportError: pass if debuglog is None: if debug: - debuglog = PlyLogger(open(debugfile,"w")) + try: + debuglog = PlyLogger(open(os.path.join(outputdir, debugfile), 'w')) + except IOError as e: + errorlog.warning("Couldn't open %r. %s" % (debugfile, e)) + debuglog = NullLogger() else: debuglog = NullLogger() - debuglog.info("Created by PLY version %s (http://www.dabeaz.com/ply)", __version__) - + debuglog.info('Created by PLY version %s (http://www.dabeaz.com/ply)', __version__) - errors = 0 + errors = False # Validate the parser information if pinfo.validate_all(): - raise YaccError("Unable to build parser") - + raise YaccError('Unable to build parser') + if not pinfo.error_func: - errorlog.warning("no p_error() function is defined") + errorlog.warning('no p_error() function is defined') # Create a grammar object grammar = Grammar(pinfo.tokens) @@ -3110,20 +3325,18 @@ # Set precedence level for terminals for term, assoc, level in pinfo.preclist: try: - grammar.set_precedence(term,assoc,level) - except GrammarError: - e = sys.exc_info()[1] - errorlog.warning("%s",str(e)) + grammar.set_precedence(term, assoc, level) + except GrammarError as e: + errorlog.warning('%s', e) # Add productions to the grammar for funcname, gram in pinfo.grammar: file, line, prodname, syms = gram try: - grammar.add_production(prodname,syms,funcname,file,line) - except GrammarError: - e = sys.exc_info()[1] - errorlog.error("%s",str(e)) - errors = 1 + grammar.add_production(prodname, syms, funcname, file, line) + except GrammarError as e: + errorlog.error('%s', e) + errors = True # Set the grammar start symbols try: @@ -3131,146 +3344,151 @@ grammar.set_start(pinfo.start) else: grammar.set_start(start) - except GrammarError: - e = sys.exc_info()[1] + except GrammarError as e: errorlog.error(str(e)) - errors = 1 + errors = True if errors: - raise YaccError("Unable to build parser") + raise YaccError('Unable to build parser') # Verify the grammar structure undefined_symbols = grammar.undefined_symbols() for sym, prod in undefined_symbols: - errorlog.error("%s:%d: Symbol '%s' used, but not defined as a token or a rule",prod.file,prod.line,sym) - errors = 1 + errorlog.error('%s:%d: Symbol %r used, but not defined as a token or a rule', prod.file, prod.line, sym) + errors = True unused_terminals = grammar.unused_terminals() if unused_terminals: - debuglog.info("") - debuglog.info("Unused terminals:") - debuglog.info("") + debuglog.info('') + debuglog.info('Unused terminals:') + debuglog.info('') for term in unused_terminals: - errorlog.warning("Token '%s' defined, but not used", term) - debuglog.info(" %s", term) + errorlog.warning('Token %r defined, but not used', term) + debuglog.info(' %s', term) # Print out all productions to the debug log if debug: - debuglog.info("") - debuglog.info("Grammar") - debuglog.info("") - for n,p in enumerate(grammar.Productions): - debuglog.info("Rule %-5d %s", n, p) + debuglog.info('') + debuglog.info('Grammar') + debuglog.info('') + for n, p in enumerate(grammar.Productions): + debuglog.info('Rule %-5d %s', n, p) # Find unused non-terminals unused_rules = grammar.unused_rules() for prod in unused_rules: - errorlog.warning("%s:%d: Rule '%s' defined, but not used", prod.file, prod.line, prod.name) + errorlog.warning('%s:%d: Rule %r defined, but not used', prod.file, prod.line, prod.name) if len(unused_terminals) == 1: - errorlog.warning("There is 1 unused token") + errorlog.warning('There is 1 unused token') if len(unused_terminals) > 1: - errorlog.warning("There are %d unused tokens", len(unused_terminals)) + errorlog.warning('There are %d unused tokens', len(unused_terminals)) if len(unused_rules) == 1: - errorlog.warning("There is 1 unused rule") + errorlog.warning('There is 1 unused rule') if len(unused_rules) > 1: - errorlog.warning("There are %d unused rules", len(unused_rules)) + errorlog.warning('There are %d unused rules', len(unused_rules)) if debug: - debuglog.info("") - debuglog.info("Terminals, with rules where they appear") - debuglog.info("") + debuglog.info('') + debuglog.info('Terminals, with rules where they appear') + debuglog.info('') terms = list(grammar.Terminals) terms.sort() for term in terms: - debuglog.info("%-20s : %s", term, " ".join([str(s) for s in grammar.Terminals[term]])) - - debuglog.info("") - debuglog.info("Nonterminals, with rules where they appear") - debuglog.info("") + debuglog.info('%-20s : %s', term, ' '.join([str(s) for s in grammar.Terminals[term]])) + + debuglog.info('') + debuglog.info('Nonterminals, with rules where they appear') + debuglog.info('') nonterms = list(grammar.Nonterminals) nonterms.sort() for nonterm in nonterms: - debuglog.info("%-20s : %s", nonterm, " ".join([str(s) for s in grammar.Nonterminals[nonterm]])) - debuglog.info("") + debuglog.info('%-20s : %s', nonterm, ' '.join([str(s) for s in grammar.Nonterminals[nonterm]])) + debuglog.info('') if check_recursion: unreachable = grammar.find_unreachable() for u in unreachable: - errorlog.warning("Symbol '%s' is unreachable",u) + errorlog.warning('Symbol %r is unreachable', u) infinite = grammar.infinite_cycles() for inf in infinite: - errorlog.error("Infinite recursion detected for symbol '%s'", inf) - errors = 1 - + errorlog.error('Infinite recursion detected for symbol %r', inf) + errors = True + unused_prec = grammar.unused_precedence() for term, assoc in unused_prec: - errorlog.error("Precedence rule '%s' defined for unknown symbol '%s'", assoc, term) - errors = 1 + errorlog.error('Precedence rule %r defined for unknown symbol %r', assoc, term) + errors = True if errors: - raise YaccError("Unable to build parser") - + raise YaccError('Unable to build parser') + # Run the LRGeneratedTable on the grammar if debug: - errorlog.debug("Generating %s tables", method) - - lr = LRGeneratedTable(grammar,method,debuglog) + errorlog.debug('Generating %s tables', method) + + lr = LRGeneratedTable(grammar, method, debuglog) if debug: num_sr = len(lr.sr_conflicts) # Report shift/reduce and reduce/reduce conflicts if num_sr == 1: - errorlog.warning("1 shift/reduce conflict") + errorlog.warning('1 shift/reduce conflict') elif num_sr > 1: - errorlog.warning("%d shift/reduce conflicts", num_sr) + errorlog.warning('%d shift/reduce conflicts', num_sr) num_rr = len(lr.rr_conflicts) if num_rr == 1: - errorlog.warning("1 reduce/reduce conflict") + errorlog.warning('1 reduce/reduce conflict') elif num_rr > 1: - errorlog.warning("%d reduce/reduce conflicts", num_rr) + errorlog.warning('%d reduce/reduce conflicts', num_rr) # Write out conflicts to the output file if debug and (lr.sr_conflicts or lr.rr_conflicts): - debuglog.warning("") - debuglog.warning("Conflicts:") - debuglog.warning("") + debuglog.warning('') + debuglog.warning('Conflicts:') + debuglog.warning('') for state, tok, resolution in lr.sr_conflicts: - debuglog.warning("shift/reduce conflict for %s in state %d resolved as %s", tok, state, resolution) - - already_reported = {} + debuglog.warning('shift/reduce conflict for %s in state %d resolved as %s', tok, state, resolution) + + already_reported = set() for state, rule, rejected in lr.rr_conflicts: - if (state,id(rule),id(rejected)) in already_reported: + if (state, id(rule), id(rejected)) in already_reported: continue - debuglog.warning("reduce/reduce conflict in state %d resolved using rule (%s)", state, rule) - debuglog.warning("rejected rule (%s) in state %d", rejected,state) - errorlog.warning("reduce/reduce conflict in state %d resolved using rule (%s)", state, rule) - errorlog.warning("rejected rule (%s) in state %d", rejected, state) - already_reported[state,id(rule),id(rejected)] = 1 - + debuglog.warning('reduce/reduce conflict in state %d resolved using rule (%s)', state, rule) + debuglog.warning('rejected rule (%s) in state %d', rejected, state) + errorlog.warning('reduce/reduce conflict in state %d resolved using rule (%s)', state, rule) + errorlog.warning('rejected rule (%s) in state %d', rejected, state) + already_reported.add((state, id(rule), id(rejected))) + warned_never = [] for state, rule, rejected in lr.rr_conflicts: if not rejected.reduced and (rejected not in warned_never): - debuglog.warning("Rule (%s) is never reduced", rejected) - errorlog.warning("Rule (%s) is never reduced", rejected) + debuglog.warning('Rule (%s) is never reduced', rejected) + errorlog.warning('Rule (%s) is never reduced', rejected) warned_never.append(rejected) # Write the table file if requested if write_tables: - lr.write_table(tabmodule,outputdir,signature) + try: + lr.write_table(tabmodule, outputdir, signature) + except IOError as e: + errorlog.warning("Couldn't create %r. %s" % (tabmodule, e)) # Write a pickled version of the tables if picklefile: - lr.pickle_table(picklefile,signature) + try: + lr.pickle_table(picklefile, signature) + except IOError as e: + errorlog.warning("Couldn't create %r. %s" % (picklefile, e)) # Build the parser lr.bind_callables(pinfo.pdict) - parser = LRParser(lr,pinfo.error_func) + parser = LRParser(lr, pinfo.error_func) parse = parser.parse return parser diff -Nru pypy-7.1.1+dfsg/lib_pypy/cffi/_pycparser/ply/ygen.py pypy-7.3.1+dfsg/lib_pypy/cffi/_pycparser/ply/ygen.py --- pypy-7.1.1+dfsg/lib_pypy/cffi/_pycparser/ply/ygen.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/cffi/_pycparser/ply/ygen.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,74 @@ +# ply: ygen.py +# +# This is a support program that auto-generates different versions of the YACC parsing +# function with different features removed for the purposes of performance. +# +# Users should edit the method LParser.parsedebug() in yacc.py. The source code +# for that method is then used to create the other methods. See the comments in +# yacc.py for further details. + +import os.path +import shutil + +def get_source_range(lines, tag): + srclines = enumerate(lines) + start_tag = '#--! %s-start' % tag + end_tag = '#--! %s-end' % tag + + for start_index, line in srclines: + if line.strip().startswith(start_tag): + break + + for end_index, line in srclines: + if line.strip().endswith(end_tag): + break + + return (start_index + 1, end_index) + +def filter_section(lines, tag): + filtered_lines = [] + include = True + tag_text = '#--! %s' % tag + for line in lines: + if line.strip().startswith(tag_text): + include = not include + elif include: + filtered_lines.append(line) + return filtered_lines + +def main(): + dirname = os.path.dirname(__file__) + shutil.copy2(os.path.join(dirname, 'yacc.py'), os.path.join(dirname, 'yacc.py.bak')) + with open(os.path.join(dirname, 'yacc.py'), 'r') as f: + lines = f.readlines() + + parse_start, parse_end = get_source_range(lines, 'parsedebug') + parseopt_start, parseopt_end = get_source_range(lines, 'parseopt') + parseopt_notrack_start, parseopt_notrack_end = get_source_range(lines, 'parseopt-notrack') + + # Get the original source + orig_lines = lines[parse_start:parse_end] + + # Filter the DEBUG sections out + parseopt_lines = filter_section(orig_lines, 'DEBUG') + + # Filter the TRACKING sections out + parseopt_notrack_lines = filter_section(parseopt_lines, 'TRACKING') + + # Replace the parser source sections with updated versions + lines[parseopt_notrack_start:parseopt_notrack_end] = parseopt_notrack_lines + lines[parseopt_start:parseopt_end] = parseopt_lines + + lines = [line.rstrip()+'\n' for line in lines] + with open(os.path.join(dirname, 'yacc.py'), 'w') as f: + f.writelines(lines) + + print('Updated yacc.py') + +if __name__ == '__main__': + main() + + + + + diff -Nru pypy-7.1.1+dfsg/lib_pypy/cffi/_pycparser/plyparser.py pypy-7.3.1+dfsg/lib_pypy/cffi/_pycparser/plyparser.py --- pypy-7.1.1+dfsg/lib_pypy/cffi/_pycparser/plyparser.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/cffi/_pycparser/plyparser.py 2020-04-10 19:28:40.000000000 +0000 @@ -4,10 +4,11 @@ # PLYParser class and other utilites for simplifying programming # parsers with PLY # -# Copyright (C) 2008-2015, Eli Bendersky +# Eli Bendersky [https://eli.thegreenplace.net/] # License: BSD #----------------------------------------------------------------- +import warnings class Coord(object): """ Coordinates of a syntactic element. Consists of: @@ -51,5 +52,82 @@ line=lineno, column=column) + def _token_coord(self, p, token_idx): + """ Returns the coordinates for the YaccProduction objet 'p' indexed + with 'token_idx'. The coordinate includes the 'lineno' and + 'column'. Both follow the lex semantic, starting from 1. + """ + last_cr = p.lexer.lexer.lexdata.rfind('\n', 0, p.lexpos(token_idx)) + if last_cr < 0: + last_cr = -1 + column = (p.lexpos(token_idx) - (last_cr)) + return self._coord(p.lineno(token_idx), column) + def _parse_error(self, msg, coord): raise ParseError("%s: %s" % (coord, msg)) + + +def parameterized(*params): + """ Decorator to create parameterized rules. + + Parameterized rule methods must be named starting with 'p_' and contain + 'xxx', and their docstrings may contain 'xxx' and 'yyy'. These will be + replaced by the given parameter tuples. For example, ``p_xxx_rule()`` with + docstring 'xxx_rule : yyy' when decorated with + ``@parameterized(('id', 'ID'))`` produces ``p_id_rule()`` with the docstring + 'id_rule : ID'. Using multiple tuples produces multiple rules. + """ + def decorate(rule_func): + rule_func._params = params + return rule_func + return decorate + + +def template(cls): + """ Class decorator to generate rules from parameterized rule templates. + + See `parameterized` for more information on parameterized rules. + """ + issued_nodoc_warning = False + for attr_name in dir(cls): + if attr_name.startswith('p_'): + method = getattr(cls, attr_name) + if hasattr(method, '_params'): + # Remove the template method + delattr(cls, attr_name) + # Create parameterized rules from this method; only run this if + # the method has a docstring. This is to address an issue when + # pycparser's users are installed in -OO mode which strips + # docstrings away. + # See: https://github.com/eliben/pycparser/pull/198/ and + # https://github.com/eliben/pycparser/issues/197 + # for discussion. + if method.__doc__ is not None: + _create_param_rules(cls, method) + elif not issued_nodoc_warning: + warnings.warn( + 'parsing methods must have __doc__ for pycparser to work properly', + RuntimeWarning, + stacklevel=2) + issued_nodoc_warning = True + return cls + + +def _create_param_rules(cls, func): + """ Create ply.yacc rules based on a parameterized rule function + + Generates new methods (one per each pair of parameters) based on the + template rule function `func`, and attaches them to `cls`. The rule + function's parameters must be accessible via its `_params` attribute. + """ + for xxx, yyy in func._params: + # Use the template method's body for each new method + def param_rule(self, p): + func(self, p) + + # Substitute in the params for the grammar rule and function name + param_rule.__doc__ = func.__doc__.replace('xxx', xxx).replace('yyy', yyy) + param_rule.__name__ = func.__name__.replace('xxx', xxx) + + # Attach the new method to the class + setattr(cls, param_rule.__name__, param_rule) diff -Nru pypy-7.1.1+dfsg/lib_pypy/cffi/_pycparser/README pypy-7.3.1+dfsg/lib_pypy/cffi/_pycparser/README --- pypy-7.1.1+dfsg/lib_pypy/cffi/_pycparser/README 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/cffi/_pycparser/README 2020-04-10 19:28:40.000000000 +0000 @@ -10,3 +10,8 @@ ^^^^^^^^^^^^^^^ yacctab='cffi._pycparser.yacctab', ^^^^^^^^^^^^^^^ + +Also, when updating the version of this in-place, you must regenerate the +lextab.py and yacctab.py files. They will be regenerated on import if they +are not found, so they should be removed, then regenrated, then the new +versions committed. diff -Nru pypy-7.1.1+dfsg/lib_pypy/cffi/_pycparser/yacctab.py pypy-7.3.1+dfsg/lib_pypy/cffi/_pycparser/yacctab.py --- pypy-7.1.1+dfsg/lib_pypy/cffi/_pycparser/yacctab.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/cffi/_pycparser/yacctab.py 2020-04-10 19:28:40.000000000 +0000 @@ -1,292 +1,339 @@ # yacctab.py # This file is automatically generated. Do not edit. -_tabversion = '3.2' +_tabversion = '3.10' _lr_method = 'LALR' -_lr_signature = '\x11\x82\x05\xfb:\x10\xfeo5\xb4\x11N\xe7S\xb4b' +_lr_signature = 'translation_unit_or_emptyleftLORleftLANDleftORleftXORleftANDleftEQNEleftGTGELTLEleftRSHIFTLSHIFTleftPLUSMINUSleftTIMESDIVIDEMOD_BOOL _COMPLEX AUTO BREAK CASE CHAR CONST CONTINUE DEFAULT DO DOUBLE ELSE ENUM EXTERN FLOAT FOR GOTO IF INLINE INT LONG REGISTER OFFSETOF RESTRICT RETURN SHORT SIGNED SIZEOF STATIC STRUCT SWITCH TYPEDEF UNION UNSIGNED VOID VOLATILE WHILE __INT128 ID TYPEID INT_CONST_DEC INT_CONST_OCT INT_CONST_HEX INT_CONST_BIN INT_CONST_CHAR FLOAT_CONST HEX_FLOAT_CONST CHAR_CONST WCHAR_CONST STRING_LITERAL WSTRING_LITERAL PLUS MINUS TIMES DIVIDE MOD OR AND NOT XOR LSHIFT RSHIFT LOR LAND LNOT LT LE GT GE EQ NE EQUALS TIMESEQUAL DIVEQUAL MODEQUAL PLUSEQUAL MINUSEQUAL LSHIFTEQUAL RSHIFTEQUAL ANDEQUAL XOREQUAL OREQUAL PLUSPLUS MINUSMINUS ARROW CONDOP LPAREN RPAREN LBRACKET RBRACKET LBRACE RBRACE COMMA PERIOD SEMI COLON ELLIPSIS PPHASH PPPRAGMA PPPRAGMASTRabstract_declarator_opt : empty\n| abstract_declaratorassignment_expression_opt : empty\n| assignment_expressionblock_item_list_opt : empty\n| block_item_listdeclaration_list_opt : empty\n| declaration_listdeclaration_specifiers_no_type_opt : empty\n| declaration_specifiers_no_typedesignation_opt : empty\n| designationexpression_opt : empty\n| expressionid_init_declarator_list_opt : empty\n| id_init_declarator_listidentifier_list_opt : empty\n| identifier_listinit_declarator_list_opt : empty\n| init_declarator_listinitializer_list_opt : empty\n| initializer_listparameter_type_list_opt : empty\n| parameter_type_liststruct_declarator_list_opt : empty\n| struct_declarator_listtype_qualifier_list_opt : empty\n| type_qualifier_list direct_id_declarator : ID\n direct_id_declarator : LPAREN id_declarator RPAREN\n direct_id_declarator : direct_id_declarator LBRACKET type_qualifier_list_opt assignment_expression_opt RBRACKET\n direct_id_declarator : direct_id_declarator LBRACKET STATIC type_qualifier_list_opt assignment_expression RBRACKET\n | direct_id_declarator LBRACKET type_qualifier_list STATIC assignment_expression RBRACKET\n direct_id_declarator : direct_id_declarator LBRACKET type_qualifier_list_opt TIMES RBRACKET\n direct_id_declarator : direct_id_declarator LPAREN parameter_type_list RPAREN\n | direct_id_declarator LPAREN identifier_list_opt RPAREN\n direct_typeid_declarator : TYPEID\n direct_typeid_declarator : LPAREN typeid_declarator RPAREN\n direct_typeid_declarator : direct_typeid_declarator LBRACKET type_qualifier_list_opt assignment_expression_opt RBRACKET\n direct_typeid_declarator : direct_typeid_declarator LBRACKET STATIC type_qualifier_list_opt assignment_expression RBRACKET\n | direct_typeid_declarator LBRACKET type_qualifier_list STATIC assignment_expression RBRACKET\n direct_typeid_declarator : direct_typeid_declarator LBRACKET type_qualifier_list_opt TIMES RBRACKET\n direct_typeid_declarator : direct_typeid_declarator LPAREN parameter_type_list RPAREN\n | direct_typeid_declarator LPAREN identifier_list_opt RPAREN\n direct_typeid_noparen_declarator : TYPEID\n direct_typeid_noparen_declarator : direct_typeid_noparen_declarator LBRACKET type_qualifier_list_opt assignment_expression_opt RBRACKET\n direct_typeid_noparen_declarator : direct_typeid_noparen_declarator LBRACKET STATIC type_qualifier_list_opt assignment_expression RBRACKET\n | direct_typeid_noparen_declarator LBRACKET type_qualifier_list STATIC assignment_expression RBRACKET\n direct_typeid_noparen_declarator : direct_typeid_noparen_declarator LBRACKET type_qualifier_list_opt TIMES RBRACKET\n direct_typeid_noparen_declarator : direct_typeid_noparen_declarator LPAREN parameter_type_list RPAREN\n | direct_typeid_noparen_declarator LPAREN identifier_list_opt RPAREN\n id_declarator : direct_id_declarator\n id_declarator : pointer direct_id_declarator\n typeid_declarator : direct_typeid_declarator\n typeid_declarator : pointer direct_typeid_declarator\n typeid_noparen_declarator : direct_typeid_noparen_declarator\n typeid_noparen_declarator : pointer direct_typeid_noparen_declarator\n translation_unit_or_empty : translation_unit\n | empty\n translation_unit : external_declaration\n translation_unit : translation_unit external_declaration\n external_declaration : function_definition\n external_declaration : declaration\n external_declaration : pp_directive\n | pppragma_directive\n external_declaration : SEMI\n pp_directive : PPHASH\n pppragma_directive : PPPRAGMA\n | PPPRAGMA PPPRAGMASTR\n function_definition : id_declarator declaration_list_opt compound_statement\n function_definition : declaration_specifiers id_declarator declaration_list_opt compound_statement\n statement : labeled_statement\n | expression_statement\n | compound_statement\n | selection_statement\n | iteration_statement\n | jump_statement\n | pppragma_directive\n pragmacomp_or_statement : pppragma_directive statement\n | statement\n decl_body : declaration_specifiers init_declarator_list_opt\n | declaration_specifiers_no_type id_init_declarator_list_opt\n declaration : decl_body SEMI\n declaration_list : declaration\n | declaration_list declaration\n declaration_specifiers_no_type : type_qualifier declaration_specifiers_no_type_opt\n declaration_specifiers_no_type : storage_class_specifier declaration_specifiers_no_type_opt\n declaration_specifiers_no_type : function_specifier declaration_specifiers_no_type_opt\n declaration_specifiers : declaration_specifiers type_qualifier\n declaration_specifiers : declaration_specifiers storage_class_specifier\n declaration_specifiers : declaration_specifiers function_specifier\n declaration_specifiers : declaration_specifiers type_specifier_no_typeid\n declaration_specifiers : type_specifier\n declaration_specifiers : declaration_specifiers_no_type type_specifier\n storage_class_specifier : AUTO\n | REGISTER\n | STATIC\n | EXTERN\n | TYPEDEF\n function_specifier : INLINE\n type_specifier_no_typeid : VOID\n | _BOOL\n | CHAR\n | SHORT\n | INT\n | LONG\n | FLOAT\n | DOUBLE\n | _COMPLEX\n | SIGNED\n | UNSIGNED\n | __INT128\n type_specifier : typedef_name\n | enum_specifier\n | struct_or_union_specifier\n | type_specifier_no_typeid\n type_qualifier : CONST\n | RESTRICT\n | VOLATILE\n init_declarator_list : init_declarator\n | init_declarator_list COMMA init_declarator\n init_declarator : declarator\n | declarator EQUALS initializer\n id_init_declarator_list : id_init_declarator\n | id_init_declarator_list COMMA init_declarator\n id_init_declarator : id_declarator\n | id_declarator EQUALS initializer\n specifier_qualifier_list : specifier_qualifier_list type_specifier_no_typeid\n specifier_qualifier_list : specifier_qualifier_list type_qualifier\n specifier_qualifier_list : type_specifier\n specifier_qualifier_list : type_qualifier_list type_specifier\n struct_or_union_specifier : struct_or_union ID\n | struct_or_union TYPEID\n struct_or_union_specifier : struct_or_union brace_open struct_declaration_list brace_close\n | struct_or_union brace_open brace_close\n struct_or_union_specifier : struct_or_union ID brace_open struct_declaration_list brace_close\n | struct_or_union ID brace_open brace_close\n | struct_or_union TYPEID brace_open struct_declaration_list brace_close\n | struct_or_union TYPEID brace_open brace_close\n struct_or_union : STRUCT\n | UNION\n struct_declaration_list : struct_declaration\n | struct_declaration_list struct_declaration\n struct_declaration : specifier_qualifier_list struct_declarator_list_opt SEMI\n struct_declaration : SEMI\n struct_declaration : pppragma_directive\n struct_declarator_list : struct_declarator\n | struct_declarator_list COMMA struct_declarator\n struct_declarator : declarator\n struct_declarator : declarator COLON constant_expression\n | COLON constant_expression\n enum_specifier : ENUM ID\n | ENUM TYPEID\n enum_specifier : ENUM brace_open enumerator_list brace_close\n enum_specifier : ENUM ID brace_open enumerator_list brace_close\n | ENUM TYPEID brace_open enumerator_list brace_close\n enumerator_list : enumerator\n | enumerator_list COMMA\n | enumerator_list COMMA enumerator\n enumerator : ID\n | ID EQUALS constant_expression\n declarator : id_declarator\n | typeid_declarator\n pointer : TIMES type_qualifier_list_opt\n | TIMES type_qualifier_list_opt pointer\n type_qualifier_list : type_qualifier\n | type_qualifier_list type_qualifier\n parameter_type_list : parameter_list\n | parameter_list COMMA ELLIPSIS\n parameter_list : parameter_declaration\n | parameter_list COMMA parameter_declaration\n parameter_declaration : declaration_specifiers id_declarator\n | declaration_specifiers typeid_noparen_declarator\n parameter_declaration : declaration_specifiers abstract_declarator_opt\n identifier_list : identifier\n | identifier_list COMMA identifier\n initializer : assignment_expression\n initializer : brace_open initializer_list_opt brace_close\n | brace_open initializer_list COMMA brace_close\n initializer_list : designation_opt initializer\n | initializer_list COMMA designation_opt initializer\n designation : designator_list EQUALS\n designator_list : designator\n | designator_list designator\n designator : LBRACKET constant_expression RBRACKET\n | PERIOD identifier\n type_name : specifier_qualifier_list abstract_declarator_opt\n abstract_declarator : pointer\n abstract_declarator : pointer direct_abstract_declarator\n abstract_declarator : direct_abstract_declarator\n direct_abstract_declarator : LPAREN abstract_declarator RPAREN direct_abstract_declarator : direct_abstract_declarator LBRACKET assignment_expression_opt RBRACKET\n direct_abstract_declarator : LBRACKET type_qualifier_list_opt assignment_expression_opt RBRACKET\n direct_abstract_declarator : direct_abstract_declarator LBRACKET TIMES RBRACKET\n direct_abstract_declarator : LBRACKET TIMES RBRACKET\n direct_abstract_declarator : direct_abstract_declarator LPAREN parameter_type_list_opt RPAREN\n direct_abstract_declarator : LPAREN parameter_type_list_opt RPAREN\n block_item : declaration\n | statement\n block_item_list : block_item\n | block_item_list block_item\n compound_statement : brace_open block_item_list_opt brace_close labeled_statement : ID COLON pragmacomp_or_statement labeled_statement : CASE constant_expression COLON pragmacomp_or_statement labeled_statement : DEFAULT COLON pragmacomp_or_statement selection_statement : IF LPAREN expression RPAREN pragmacomp_or_statement selection_statement : IF LPAREN expression RPAREN statement ELSE pragmacomp_or_statement selection_statement : SWITCH LPAREN expression RPAREN pragmacomp_or_statement iteration_statement : WHILE LPAREN expression RPAREN pragmacomp_or_statement iteration_statement : DO pragmacomp_or_statement WHILE LPAREN expression RPAREN SEMI iteration_statement : FOR LPAREN expression_opt SEMI expression_opt SEMI expression_opt RPAREN pragmacomp_or_statement iteration_statement : FOR LPAREN declaration expression_opt SEMI expression_opt RPAREN pragmacomp_or_statement jump_statement : GOTO ID SEMI jump_statement : BREAK SEMI jump_statement : CONTINUE SEMI jump_statement : RETURN expression SEMI\n | RETURN SEMI\n expression_statement : expression_opt SEMI expression : assignment_expression\n | expression COMMA assignment_expression\n typedef_name : TYPEID assignment_expression : conditional_expression\n | unary_expression assignment_operator assignment_expression\n assignment_operator : EQUALS\n | XOREQUAL\n | TIMESEQUAL\n | DIVEQUAL\n | MODEQUAL\n | PLUSEQUAL\n | MINUSEQUAL\n | LSHIFTEQUAL\n | RSHIFTEQUAL\n | ANDEQUAL\n | OREQUAL\n constant_expression : conditional_expression conditional_expression : binary_expression\n | binary_expression CONDOP expression COLON conditional_expression\n binary_expression : cast_expression\n | binary_expression TIMES binary_expression\n | binary_expression DIVIDE binary_expression\n | binary_expression MOD binary_expression\n | binary_expression PLUS binary_expression\n | binary_expression MINUS binary_expression\n | binary_expression RSHIFT binary_expression\n | binary_expression LSHIFT binary_expression\n | binary_expression LT binary_expression\n | binary_expression LE binary_expression\n | binary_expression GE binary_expression\n | binary_expression GT binary_expression\n | binary_expression EQ binary_expression\n | binary_expression NE binary_expression\n | binary_expression AND binary_expression\n | binary_expression OR binary_expression\n | binary_expression XOR binary_expression\n | binary_expression LAND binary_expression\n | binary_expression LOR binary_expression\n cast_expression : unary_expression cast_expression : LPAREN type_name RPAREN cast_expression unary_expression : postfix_expression unary_expression : PLUSPLUS unary_expression\n | MINUSMINUS unary_expression\n | unary_operator cast_expression\n unary_expression : SIZEOF unary_expression\n | SIZEOF LPAREN type_name RPAREN\n unary_operator : AND\n | TIMES\n | PLUS\n | MINUS\n | NOT\n | LNOT\n postfix_expression : primary_expression postfix_expression : postfix_expression LBRACKET expression RBRACKET postfix_expression : postfix_expression LPAREN argument_expression_list RPAREN\n | postfix_expression LPAREN RPAREN\n postfix_expression : postfix_expression PERIOD ID\n | postfix_expression PERIOD TYPEID\n | postfix_expression ARROW ID\n | postfix_expression ARROW TYPEID\n postfix_expression : postfix_expression PLUSPLUS\n | postfix_expression MINUSMINUS\n postfix_expression : LPAREN type_name RPAREN brace_open initializer_list brace_close\n | LPAREN type_name RPAREN brace_open initializer_list COMMA brace_close\n primary_expression : identifier primary_expression : constant primary_expression : unified_string_literal\n | unified_wstring_literal\n primary_expression : LPAREN expression RPAREN primary_expression : OFFSETOF LPAREN type_name COMMA offsetof_member_designator RPAREN\n offsetof_member_designator : identifier\n | offsetof_member_designator PERIOD identifier\n | offsetof_member_designator LBRACKET expression RBRACKET\n argument_expression_list : assignment_expression\n | argument_expression_list COMMA assignment_expression\n identifier : ID constant : INT_CONST_DEC\n | INT_CONST_OCT\n | INT_CONST_HEX\n | INT_CONST_BIN\n | INT_CONST_CHAR\n constant : FLOAT_CONST\n | HEX_FLOAT_CONST\n constant : CHAR_CONST\n | WCHAR_CONST\n unified_string_literal : STRING_LITERAL\n | unified_string_literal STRING_LITERAL\n unified_wstring_literal : WSTRING_LITERAL\n | unified_wstring_literal WSTRING_LITERAL\n brace_open : LBRACE\n brace_close : RBRACE\n empty : ' -_lr_action_items = {'VOID':([0,1,2,3,5,6,9,10,11,12,13,14,15,17,18,19,21,22,23,25,26,27,29,31,32,33,35,36,37,38,39,40,42,43,44,45,46,48,49,54,55,56,57,59,60,61,62,63,66,78,80,82,87,89,90,91,92,93,94,95,96,141,165,167,169,170,171,172,173,174,175,176,191,197,198,204,219,229,230,233,272,276,277,280,282,289,291,292,293,295,298,302,303,307,308,310,311,314,315,338,370,371,373,374,379,381,383,388,389,405,406,409,414,424,433,434,436,444,445,447,448,],[6,6,-63,-74,-73,-60,-56,-57,-35,-31,-61,6,-36,-55,-70,-65,-54,6,-58,-178,-111,-68,-71,-34,-75,-114,-66,-33,-62,-37,-64,-67,6,-69,6,-72,-76,6,-59,-86,-261,-85,6,-113,-112,-32,-102,-101,6,6,6,-47,-48,6,-115,6,6,6,6,-92,6,6,6,6,-38,6,-49,6,6,-87,-93,-262,-103,-121,-120,6,6,6,6,6,-39,-41,-44,-40,-42,6,-156,-155,-45,-157,-43,-89,-88,-94,-95,-105,-104,-116,-119,6,-175,-174,6,-172,-158,-171,-159,-118,-117,-170,-173,-162,-160,-161,-166,-165,-163,-167,-164,-169,-168,]),'LBRACKET':([1,2,3,5,6,9,10,13,14,17,18,19,21,23,25,26,27,28,29,30,32,33,35,37,39,40,42,43,44,45,46,49,50,51,52,54,55,56,58,60,62,63,67,68,69,70,74,78,81,83,84,86,90,94,96,97,110,112,115,116,118,121,122,123,124,125,126,129,130,138,140,143,145,146,148,149,153,155,166,167,174,176,177,178,179,180,191,197,198,218,221,222,224,228,235,239,262,267,269,270,300,302,303,310,311,314,315,323,324,325,326,329,334,338,339,360,362,364,366,367,368,388,389,391,392,399,401,428,429,430,437,],[-263,-63,-74,-73,-60,-56,-57,-61,-263,-55,-70,-65,-54,-58,-178,65,-68,-263,-71,72,-75,-114,-66,-62,-64,-67,-263,-69,-263,-72,-76,-59,-52,-9,-10,-86,-261,-85,-51,65,-102,-101,-28,-122,-124,-27,72,72,164,-50,-53,72,-115,-263,-263,72,72,-248,-125,-123,-252,-243,-255,-259,-256,-253,-241,-242,226,-251,-228,-257,-249,-240,-254,-250,164,264,72,72,-87,-262,-23,-84,-24,-83,-103,-121,-120,-260,-258,-237,-236,-150,-152,72,-140,264,-154,-148,-248,-89,-88,-105,-104,-116,-119,-235,-234,-233,-232,-231,-244,72,72,-143,264,-141,-149,-151,-153,-118,-117,-229,-230,264,-142,-245,264,-238,-239,]),'WCHAR_CONST':([3,32,46,55,65,67,69,70,72,77,82,103,104,105,115,119,127,128,134,135,137,139,141,142,144,152,155,157,162,164,170,176,181,192,194,195,196,206,207,208,209,210,211,212,213,214,215,216,217,219,226,227,230,233,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,264,266,268,274,276,277,280,281,282,288,289,291,292,293,295,297,298,309,335,336,362,365,370,371,373,374,375,376,379,380,381,383,384,385,393,395,399,400,402,403,405,406,408,409,411,414,421,423,424,425,426,427,429,432,433,434,436,438,441,443,444,445,446,447,448,],[-74,-75,-76,-261,-263,-28,-124,-27,124,124,-47,124,-28,-263,-125,-227,124,-225,124,-224,124,-223,124,124,-222,-226,-263,-223,124,124,124,-262,124,124,-223,124,124,-184,-187,-185,-181,-182,-186,-188,124,-190,-191,-183,-189,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,-12,124,124,-11,-223,-41,-44,-40,124,-42,124,124,-156,-155,-45,-157,124,-43,124,124,124,-263,-139,-175,-174,124,-172,124,124,-158,124,-171,-159,124,124,124,124,-263,124,124,-11,-170,-173,124,-162,124,-160,124,124,-161,124,124,124,-263,124,-166,-165,-163,124,124,124,-167,-164,124,-169,-168,]),'FLOAT_CONST':([3,32,46,55,65,67,69,70,72,77,82,103,104,105,115,119,127,128,134,135,137,139,141,142,144,152,155,157,162,164,170,176,181,192,194,195,196,206,207,208,209,210,211,212,213,214,215,216,217,219,226,227,230,233,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,264,266,268,274,276,277,280,281,282,288,289,291,292,293,295,297,298,309,335,336,362,365,370,371,373,374,375,376,379,380,381,383,384,385,393,395,399,400,402,403,405,406,408,409,411,414,421,423,424,425,426,427,429,432,433,434,436,438,441,443,444,445,446,447,448,],[-74,-75,-76,-261,-263,-28,-124,-27,125,125,-47,125,-28,-263,-125,-227,125,-225,125,-224,125,-223,125,125,-222,-226,-263,-223,125,125,125,-262,125,125,-223,125,125,-184,-187,-185,-181,-182,-186,-188,125,-190,-191,-183,-189,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,-12,125,125,-11,-223,-41,-44,-40,125,-42,125,125,-156,-155,-45,-157,125,-43,125,125,125,-263,-139,-175,-174,125,-172,125,125,-158,125,-171,-159,125,125,125,125,-263,125,125,-11,-170,-173,125,-162,125,-160,125,125,-161,125,125,125,-263,125,-166,-165,-163,125,125,125,-167,-164,125,-169,-168,]),'MINUS':([3,32,46,55,65,67,69,70,72,77,82,103,104,105,112,115,118,119,120,121,122,123,124,125,126,127,128,129,130,132,134,135,137,138,139,140,141,142,143,144,145,146,147,148,149,152,155,157,162,164,170,176,181,192,194,195,196,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,224,226,227,230,231,232,233,234,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,264,266,268,274,276,277,280,281,282,288,289,291,292,293,295,297,298,300,309,323,324,325,326,329,334,335,336,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,357,358,362,365,370,371,373,374,375,376,379,380,381,383,384,385,390,391,392,393,395,398,399,400,402,403,405,406,408,409,411,414,421,423,424,425,426,427,428,429,430,432,433,434,436,437,438,441,443,444,445,446,447,448,],[-74,-75,-76,-261,-263,-28,-124,-27,128,128,-47,128,-28,-263,-248,-125,-252,-227,-214,-243,-255,-259,-256,-253,-241,128,-225,-242,-216,-195,128,-224,128,-251,-223,-228,128,128,-257,-222,-249,-240,244,-254,-250,-226,-263,-223,128,128,128,-262,128,128,-223,128,128,-184,-187,-185,-181,-182,-186,-188,128,-190,-191,-183,-189,-260,128,-220,-258,-237,-236,128,128,128,-214,-219,128,-217,-218,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,-12,128,128,-11,-223,-41,-44,-40,128,-42,128,128,-156,-155,-45,-157,128,-43,-248,128,-235,-234,-233,-232,-231,-244,128,128,244,244,244,-200,244,244,244,-199,244,244,-197,-196,244,244,244,244,244,-198,-263,-139,-175,-174,128,-172,128,128,-158,128,-171,-159,128,128,-221,-229,-230,128,128,-215,-263,128,128,-11,-170,-173,128,-162,128,-160,128,128,-161,128,128,128,-245,-263,-238,128,-166,-165,-163,-239,128,128,128,-167,-164,128,-169,-168,]),'RPAREN':([1,2,3,5,6,9,10,13,14,17,18,19,21,23,25,26,27,28,29,32,33,35,37,39,40,42,43,44,45,46,49,50,51,52,53,54,56,58,59,60,62,63,66,67,68,69,70,74,78,81,83,84,90,94,96,106,107,108,109,110,111,112,113,114,115,116,118,120,121,122,123,124,125,126,129,130,132,138,140,143,145,146,147,148,149,151,153,158,159,160,161,165,166,167,174,176,177,178,179,180,191,197,198,199,200,201,202,218,220,221,222,224,227,228,231,232,234,235,236,237,238,239,240,269,270,275,285,302,303,310,311,314,315,318,319,320,321,322,323,324,325,326,328,329,330,332,333,334,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,357,358,366,367,368,378,388,389,390,391,392,397,398,410,412,415,416,417,419,428,430,432,435,437,438,439,442,],[-263,-63,-74,-73,-60,-56,-57,-61,-263,-55,-70,-65,-54,-58,-178,-111,-68,-263,-71,-75,-114,-66,-62,-64,-67,-263,-69,-263,-72,-76,-59,-52,-9,-10,90,-86,-85,-51,-113,-112,-102,-101,-263,-28,-122,-124,-27,-145,-263,-147,-50,-53,-115,-263,-263,197,-15,198,-128,-263,-16,-248,-126,-132,-125,-123,-252,-214,-243,-255,-259,-256,-253,-241,-242,-216,-195,-251,-228,-257,-249,-240,-193,-254,-250,-179,-146,-21,-22,269,270,-263,-145,-263,-87,-262,-23,-84,-24,-83,-103,-121,-120,-131,-1,-2,-130,-260,-220,-258,-237,-236,329,-150,-214,-219,-217,-152,334,336,-176,-263,-218,-154,-148,368,-14,-89,-88,-105,-104,-116,-119,-133,-127,-129,-180,390,-235,-234,-233,-232,-246,-231,392,395,396,-244,-144,-263,-145,-201,-213,-202,-200,-204,-208,-203,-199,-206,-211,-197,-196,-205,-212,-207,-209,-210,-198,-149,-151,-153,-13,-118,-117,-221,-229,-230,-177,-215,423,425,427,-247,428,-194,-245,-238,-263,440,-239,-263,443,446,]),'LONG':([0,1,2,3,5,6,9,10,11,12,13,14,15,17,18,19,21,22,23,25,26,27,29,31,32,33,35,36,37,38,39,40,42,43,44,45,46,48,49,54,55,56,57,59,60,61,62,63,66,78,80,82,87,89,90,91,92,93,94,95,96,141,165,167,169,170,171,172,173,174,175,176,191,197,198,204,219,229,230,233,272,276,277,280,282,289,291,292,293,295,298,302,303,307,308,310,311,314,315,338,370,371,373,374,379,381,383,388,389,405,406,409,414,424,433,434,436,444,445,447,448,],[19,19,-63,-74,-73,-60,-56,-57,-35,-31,-61,19,-36,-55,-70,-65,-54,19,-58,-178,-111,-68,-71,-34,-75,-114,-66,-33,-62,-37,-64,-67,19,-69,19,-72,-76,19,-59,-86,-261,-85,19,-113,-112,-32,-102,-101,19,19,19,-47,-48,19,-115,19,19,19,19,-92,19,19,19,19,-38,19,-49,19,19,-87,-93,-262,-103,-121,-120,19,19,19,19,19,-39,-41,-44,-40,-42,19,-156,-155,-45,-157,-43,-89,-88,-94,-95,-105,-104,-116,-119,19,-175,-174,19,-172,-158,-171,-159,-118,-117,-170,-173,-162,-160,-161,-166,-165,-163,-167,-164,-169,-168,]),'PLUS':([3,32,46,55,65,67,69,70,72,77,82,103,104,105,112,115,118,119,120,121,122,123,124,125,126,127,128,129,130,132,134,135,137,138,139,140,141,142,143,144,145,146,147,148,149,152,155,157,162,164,170,176,181,192,194,195,196,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,224,226,227,230,231,232,233,234,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,264,266,268,274,276,277,280,281,282,288,289,291,292,293,295,297,298,300,309,323,324,325,326,329,334,335,336,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,357,358,362,365,370,371,373,374,375,376,379,380,381,383,384,385,390,391,392,393,395,398,399,400,402,403,405,406,408,409,411,414,421,423,424,425,426,427,428,429,430,432,433,434,436,437,438,441,443,444,445,446,447,448,],[-74,-75,-76,-261,-263,-28,-124,-27,135,135,-47,135,-28,-263,-248,-125,-252,-227,-214,-243,-255,-259,-256,-253,-241,135,-225,-242,-216,-195,135,-224,135,-251,-223,-228,135,135,-257,-222,-249,-240,248,-254,-250,-226,-263,-223,135,135,135,-262,135,135,-223,135,135,-184,-187,-185,-181,-182,-186,-188,135,-190,-191,-183,-189,-260,135,-220,-258,-237,-236,135,135,135,-214,-219,135,-217,-218,135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,-12,135,135,-11,-223,-41,-44,-40,135,-42,135,135,-156,-155,-45,-157,135,-43,-248,135,-235,-234,-233,-232,-231,-244,135,135,248,248,248,-200,248,248,248,-199,248,248,-197,-196,248,248,248,248,248,-198,-263,-139,-175,-174,135,-172,135,135,-158,135,-171,-159,135,135,-221,-229,-230,135,135,-215,-263,135,135,-11,-170,-173,135,-162,135,-160,135,135,-161,135,135,135,-245,-263,-238,135,-166,-165,-163,-239,135,135,135,-167,-164,135,-169,-168,]),'ELLIPSIS':([204,],[319,]),'GT':([112,118,120,121,122,123,124,125,126,129,130,132,138,140,143,145,146,147,148,149,176,218,220,221,222,224,231,232,234,240,300,323,324,325,326,329,334,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,357,358,390,391,392,398,428,430,437,],[-248,-252,-214,-243,-255,-259,-256,-253,-241,-242,-216,-195,-251,-228,-257,-249,-240,249,-254,-250,-262,-260,-220,-258,-237,-236,-214,-219,-217,-218,-248,-235,-234,-233,-232,-231,-244,-201,249,-202,-200,-204,249,-203,-199,-206,249,-197,-196,-205,249,249,249,249,-198,-221,-229,-230,-215,-245,-238,-239,]),'GOTO':([55,82,170,176,276,277,280,282,289,291,292,293,295,297,298,370,371,374,375,379,381,383,384,405,406,409,411,414,423,424,425,427,433,434,436,441,443,444,445,446,447,448,],[-261,-47,278,-262,-41,-44,-40,-42,278,-156,-155,-45,-157,278,-43,-175,-174,-172,278,-158,-171,-159,278,-170,-173,-162,278,-160,278,-161,278,278,-166,-165,-163,278,278,-167,-164,278,-169,-168,]),'ENUM':([0,1,2,3,5,6,9,10,11,12,13,14,15,17,18,19,21,22,23,25,26,27,29,31,32,33,35,36,37,38,39,40,42,43,44,45,46,48,49,54,55,56,57,59,60,61,62,63,66,78,80,82,87,89,90,91,92,93,94,95,96,141,165,167,169,170,171,172,173,174,175,176,191,197,198,204,219,229,230,233,272,276,277,280,282,289,291,292,293,295,298,302,303,307,308,310,311,314,315,338,370,371,373,374,379,381,383,388,389,405,406,409,414,424,433,434,436,444,445,447,448,],[24,24,-63,-74,-73,-60,-56,-57,-35,-31,-61,24,-36,-55,-70,-65,-54,24,-58,-178,-111,-68,-71,-34,-75,-114,-66,-33,-62,-37,-64,-67,24,-69,24,-72,-76,24,-59,-86,-261,-85,24,-113,-112,-32,-102,-101,24,24,24,-47,-48,24,-115,24,24,24,24,-92,24,24,24,24,-38,24,-49,24,24,-87,-93,-262,-103,-121,-120,24,24,24,24,24,-39,-41,-44,-40,-42,24,-156,-155,-45,-157,-43,-89,-88,-94,-95,-105,-104,-116,-119,24,-175,-174,24,-172,-158,-171,-159,-118,-117,-170,-173,-162,-160,-161,-166,-165,-163,-167,-164,-169,-168,]),'PERIOD':([55,112,118,121,122,123,124,125,126,129,130,138,140,143,145,146,148,149,155,176,218,221,222,224,262,267,300,323,324,325,326,329,334,360,362,364,391,392,399,401,428,429,430,437,],[-261,-248,-252,-243,-255,-259,-256,-253,-241,-242,225,-251,-228,-257,-249,-240,-254,-250,263,-262,-260,-258,-237,-236,-140,263,-248,-235,-234,-233,-232,-231,-244,-143,263,-141,-229,-230,263,-142,-245,263,-238,-239,]),'GE':([112,118,120,121,122,123,124,125,126,129,130,132,138,140,143,145,146,147,148,149,176,218,220,221,222,224,231,232,234,240,300,323,324,325,326,329,334,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,357,358,390,391,392,398,428,430,437,],[-248,-252,-214,-243,-255,-259,-256,-253,-241,-242,-216,-195,-251,-228,-257,-249,-240,253,-254,-250,-262,-260,-220,-258,-237,-236,-214,-219,-217,-218,-248,-235,-234,-233,-232,-231,-244,-201,253,-202,-200,-204,253,-203,-199,-206,253,-197,-196,-205,253,253,253,253,-198,-221,-229,-230,-215,-245,-238,-239,]),'INT_CONST_DEC':([3,32,46,55,65,67,69,70,72,77,82,103,104,105,115,119,127,128,134,135,137,139,141,142,144,152,155,157,162,164,170,176,181,192,194,195,196,206,207,208,209,210,211,212,213,214,215,216,217,219,226,227,230,233,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,264,266,268,274,276,277,280,281,282,288,289,291,292,293,295,297,298,309,335,336,362,365,370,371,373,374,375,376,379,380,381,383,384,385,393,395,399,400,402,403,405,406,408,409,411,414,421,423,424,425,426,427,429,432,433,434,436,438,441,443,444,445,446,447,448,],[-74,-75,-76,-261,-263,-28,-124,-27,145,145,-47,145,-28,-263,-125,-227,145,-225,145,-224,145,-223,145,145,-222,-226,-263,-223,145,145,145,-262,145,145,-223,145,145,-184,-187,-185,-181,-182,-186,-188,145,-190,-191,-183,-189,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,-12,145,145,-11,-223,-41,-44,-40,145,-42,145,145,-156,-155,-45,-157,145,-43,145,145,145,-263,-139,-175,-174,145,-172,145,145,-158,145,-171,-159,145,145,145,145,-263,145,145,-11,-170,-173,145,-162,145,-160,145,145,-161,145,145,145,-263,145,-166,-165,-163,145,145,145,-167,-164,145,-169,-168,]),'ARROW':([112,118,121,122,123,124,125,126,129,130,138,140,143,145,146,148,149,176,218,221,222,224,300,323,324,325,326,329,334,391,392,428,430,437,],[-248,-252,-243,-255,-259,-256,-253,-241,-242,223,-251,-228,-257,-249,-240,-254,-250,-262,-260,-258,-237,-236,-248,-235,-234,-233,-232,-231,-244,-229,-230,-245,-238,-239,]),'HEX_FLOAT_CONST':([3,32,46,55,65,67,69,70,72,77,82,103,104,105,115,119,127,128,134,135,137,139,141,142,144,152,155,157,162,164,170,176,181,192,194,195,196,206,207,208,209,210,211,212,213,214,215,216,217,219,226,227,230,233,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,264,266,268,274,276,277,280,281,282,288,289,291,292,293,295,297,298,309,335,336,362,365,370,371,373,374,375,376,379,380,381,383,384,385,393,395,399,400,402,403,405,406,408,409,411,414,421,423,424,425,426,427,429,432,433,434,436,438,441,443,444,445,446,447,448,],[-74,-75,-76,-261,-263,-28,-124,-27,148,148,-47,148,-28,-263,-125,-227,148,-225,148,-224,148,-223,148,148,-222,-226,-263,-223,148,148,148,-262,148,148,-223,148,148,-184,-187,-185,-181,-182,-186,-188,148,-190,-191,-183,-189,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,-12,148,148,-11,-223,-41,-44,-40,148,-42,148,148,-156,-155,-45,-157,148,-43,148,148,148,-263,-139,-175,-174,148,-172,148,148,-158,148,-171,-159,148,148,148,148,-263,148,148,-11,-170,-173,148,-162,148,-160,148,148,-161,148,148,148,-263,148,-166,-165,-163,148,148,148,-167,-164,148,-169,-168,]),'DOUBLE':([0,1,2,3,5,6,9,10,11,12,13,14,15,17,18,19,21,22,23,25,26,27,29,31,32,33,35,36,37,38,39,40,42,43,44,45,46,48,49,54,55,56,57,59,60,61,62,63,66,78,80,82,87,89,90,91,92,93,94,95,96,141,165,167,169,170,171,172,173,174,175,176,191,197,198,204,219,229,230,233,272,276,277,280,282,289,291,292,293,295,298,302,303,307,308,310,311,314,315,338,370,371,373,374,379,381,383,388,389,405,406,409,414,424,433,434,436,444,445,447,448,],[40,40,-63,-74,-73,-60,-56,-57,-35,-31,-61,40,-36,-55,-70,-65,-54,40,-58,-178,-111,-68,-71,-34,-75,-114,-66,-33,-62,-37,-64,-67,40,-69,40,-72,-76,40,-59,-86,-261,-85,40,-113,-112,-32,-102,-101,40,40,40,-47,-48,40,-115,40,40,40,40,-92,40,40,40,40,-38,40,-49,40,40,-87,-93,-262,-103,-121,-120,40,40,40,40,40,-39,-41,-44,-40,-42,40,-156,-155,-45,-157,-43,-89,-88,-94,-95,-105,-104,-116,-119,40,-175,-174,40,-172,-158,-171,-159,-118,-117,-170,-173,-162,-160,-161,-166,-165,-163,-167,-164,-169,-168,]),'MINUSEQUAL':([112,118,120,121,122,123,124,125,126,129,130,138,140,143,145,146,148,149,176,218,220,221,222,224,231,232,234,240,300,323,324,325,326,329,334,390,391,392,398,428,430,437,],[-248,-252,207,-243,-255,-259,-256,-253,-241,-242,-216,-251,-228,-257,-249,-240,-254,-250,-262,-260,-220,-258,-237,-236,-214,-219,-217,-218,-248,-235,-234,-233,-232,-231,-244,-221,-229,-230,-215,-245,-238,-239,]),'INT_CONST_OCT':([3,32,46,55,65,67,69,70,72,77,82,103,104,105,115,119,127,128,134,135,137,139,141,142,144,152,155,157,162,164,170,176,181,192,194,195,196,206,207,208,209,210,211,212,213,214,215,216,217,219,226,227,230,233,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,264,266,268,274,276,277,280,281,282,288,289,291,292,293,295,297,298,309,335,336,362,365,370,371,373,374,375,376,379,380,381,383,384,385,393,395,399,400,402,403,405,406,408,409,411,414,421,423,424,425,426,427,429,432,433,434,436,438,441,443,444,445,446,447,448,],[-74,-75,-76,-261,-263,-28,-124,-27,149,149,-47,149,-28,-263,-125,-227,149,-225,149,-224,149,-223,149,149,-222,-226,-263,-223,149,149,149,-262,149,149,-223,149,149,-184,-187,-185,-181,-182,-186,-188,149,-190,-191,-183,-189,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,-12,149,149,-11,-223,-41,-44,-40,149,-42,149,149,-156,-155,-45,-157,149,-43,149,149,149,-263,-139,-175,-174,149,-172,149,149,-158,149,-171,-159,149,149,149,149,-263,149,149,-11,-170,-173,149,-162,149,-160,149,149,-161,149,149,149,-263,149,-166,-165,-163,149,149,149,-167,-164,149,-169,-168,]),'TIMESEQUAL':([112,118,120,121,122,123,124,125,126,129,130,138,140,143,145,146,148,149,176,218,220,221,222,224,231,232,234,240,300,323,324,325,326,329,334,390,391,392,398,428,430,437,],[-248,-252,216,-243,-255,-259,-256,-253,-241,-242,-216,-251,-228,-257,-249,-240,-254,-250,-262,-260,-220,-258,-237,-236,-214,-219,-217,-218,-248,-235,-234,-233,-232,-231,-244,-221,-229,-230,-215,-245,-238,-239,]),'OR':([112,118,120,121,122,123,124,125,126,129,130,132,138,140,143,145,146,147,148,149,176,218,220,221,222,224,231,232,234,240,300,323,324,325,326,329,334,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,357,358,390,391,392,398,428,430,437,],[-248,-252,-214,-243,-255,-259,-256,-253,-241,-242,-216,-195,-251,-228,-257,-249,-240,258,-254,-250,-262,-260,-220,-258,-237,-236,-214,-219,-217,-218,-248,-235,-234,-233,-232,-231,-244,-201,258,-202,-200,-204,-208,-203,-199,-206,-211,-197,-196,-205,258,-207,-209,-210,-198,-221,-229,-230,-215,-245,-238,-239,]),'SHORT':([0,1,2,3,5,6,9,10,11,12,13,14,15,17,18,19,21,22,23,25,26,27,29,31,32,33,35,36,37,38,39,40,42,43,44,45,46,48,49,54,55,56,57,59,60,61,62,63,66,78,80,82,87,89,90,91,92,93,94,95,96,141,165,167,169,170,171,172,173,174,175,176,191,197,198,204,219,229,230,233,272,276,277,280,282,289,291,292,293,295,298,302,303,307,308,310,311,314,315,338,370,371,373,374,379,381,383,388,389,405,406,409,414,424,433,434,436,444,445,447,448,],[2,2,-63,-74,-73,-60,-56,-57,-35,-31,-61,2,-36,-55,-70,-65,-54,2,-58,-178,-111,-68,-71,-34,-75,-114,-66,-33,-62,-37,-64,-67,2,-69,2,-72,-76,2,-59,-86,-261,-85,2,-113,-112,-32,-102,-101,2,2,2,-47,-48,2,-115,2,2,2,2,-92,2,2,2,2,-38,2,-49,2,2,-87,-93,-262,-103,-121,-120,2,2,2,2,2,-39,-41,-44,-40,-42,2,-156,-155,-45,-157,-43,-89,-88,-94,-95,-105,-104,-116,-119,2,-175,-174,2,-172,-158,-171,-159,-118,-117,-170,-173,-162,-160,-161,-166,-165,-163,-167,-164,-169,-168,]),'RETURN':([55,82,170,176,276,277,280,282,289,291,292,293,295,297,298,370,371,374,375,379,381,383,384,405,406,409,411,414,423,424,425,427,433,434,436,441,443,444,445,446,447,448,],[-261,-47,281,-262,-41,-44,-40,-42,281,-156,-155,-45,-157,281,-43,-175,-174,-172,281,-158,-171,-159,281,-170,-173,-162,281,-160,281,-161,281,281,-166,-165,-163,281,281,-167,-164,281,-169,-168,]),'RSHIFTEQUAL':([112,118,120,121,122,123,124,125,126,129,130,138,140,143,145,146,148,149,176,218,220,221,222,224,231,232,234,240,300,323,324,325,326,329,334,390,391,392,398,428,430,437,],[-248,-252,217,-243,-255,-259,-256,-253,-241,-242,-216,-251,-228,-257,-249,-240,-254,-250,-262,-260,-220,-258,-237,-236,-214,-219,-217,-218,-248,-235,-234,-233,-232,-231,-244,-221,-229,-230,-215,-245,-238,-239,]),'RESTRICT':([0,1,2,3,5,6,9,10,11,12,13,14,15,17,18,19,21,22,23,25,26,27,28,29,31,32,33,35,36,37,38,39,40,42,43,44,45,46,48,49,54,55,56,57,59,60,61,62,63,65,66,67,69,78,80,82,87,89,90,91,92,93,94,95,96,104,105,115,141,165,167,169,170,171,172,173,174,175,176,191,197,198,204,219,229,230,233,272,276,277,280,282,289,291,292,293,295,298,302,303,307,308,310,311,314,315,338,370,371,373,374,379,381,383,388,389,405,406,409,414,424,433,434,436,444,445,447,448,],[32,32,-63,-74,-73,-60,-56,-57,-35,-31,-61,32,-36,-55,-70,-65,-54,32,-58,-178,-111,-68,32,-71,-34,-75,-114,-66,-33,-62,-37,-64,-67,32,-69,32,-72,-76,32,-59,-86,-261,-85,32,-113,-112,-32,-102,-101,32,32,32,-124,32,32,-47,-48,32,-115,32,32,32,32,-92,32,32,32,-125,32,32,32,-38,32,-49,32,32,-87,-93,-262,-103,-121,-120,32,32,32,32,32,-39,-41,-44,-40,-42,32,-156,-155,-45,-157,-43,-89,-88,-94,-95,-105,-104,-116,-119,32,-175,-174,32,-172,-158,-171,-159,-118,-117,-170,-173,-162,-160,-161,-166,-165,-163,-167,-164,-169,-168,]),'STATIC':([0,1,2,3,5,6,9,10,11,12,13,14,15,17,18,19,21,22,23,25,26,27,29,31,32,33,35,36,37,38,39,40,42,43,44,45,46,48,49,54,55,56,59,60,61,62,63,65,66,69,78,80,82,87,89,90,104,115,165,167,169,170,171,174,176,191,197,198,204,272,276,277,280,282,289,291,292,293,295,298,302,303,310,311,314,315,338,370,371,373,374,379,381,383,388,389,405,406,409,414,424,433,434,436,444,445,447,448,],[9,9,-63,-74,-73,-60,-56,-57,-35,-31,-61,9,-36,-55,-70,-65,-54,9,-58,-178,-111,-68,-71,-34,-75,-114,-66,-33,-62,-37,-64,-67,9,-69,9,-72,-76,9,-59,-86,-261,-85,-113,-112,-32,-102,-101,105,9,-124,9,9,-47,-48,9,-115,195,-125,9,9,-38,9,-49,-87,-262,-103,-121,-120,9,-39,-41,-44,-40,-42,9,-156,-155,-45,-157,-43,-89,-88,-105,-104,-116,-119,9,-175,-174,9,-172,-158,-171,-159,-118,-117,-170,-173,-162,-160,-161,-166,-165,-163,-167,-164,-169,-168,]),'SIZEOF':([3,32,46,55,65,67,69,70,72,77,82,103,104,105,115,119,127,128,134,135,137,139,141,142,144,152,155,157,162,164,170,176,181,192,194,195,196,206,207,208,209,210,211,212,213,214,215,216,217,219,226,227,230,233,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,264,266,268,274,276,277,280,281,282,288,289,291,292,293,295,297,298,309,335,336,362,365,370,371,373,374,375,376,379,380,381,383,384,385,393,395,399,400,402,403,405,406,408,409,411,414,421,423,424,425,426,427,429,432,433,434,436,438,441,443,444,445,446,447,448,],[-74,-75,-76,-261,-263,-28,-124,-27,127,127,-47,127,-28,-263,-125,-227,127,-225,127,-224,127,-223,127,127,-222,-226,-263,-223,127,127,127,-262,127,127,-223,127,127,-184,-187,-185,-181,-182,-186,-188,127,-190,-191,-183,-189,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,-12,127,127,-11,-223,-41,-44,-40,127,-42,127,127,-156,-155,-45,-157,127,-43,127,127,127,-263,-139,-175,-174,127,-172,127,127,-158,127,-171,-159,127,127,127,127,-263,127,127,-11,-170,-173,127,-162,127,-160,127,127,-161,127,127,127,-263,127,-166,-165,-163,127,127,127,-167,-164,127,-169,-168,]),'UNSIGNED':([0,1,2,3,5,6,9,10,11,12,13,14,15,17,18,19,21,22,23,25,26,27,29,31,32,33,35,36,37,38,39,40,42,43,44,45,46,48,49,54,55,56,57,59,60,61,62,63,66,78,80,82,87,89,90,91,92,93,94,95,96,141,165,167,169,170,171,172,173,174,175,176,191,197,198,204,219,229,230,233,272,276,277,280,282,289,291,292,293,295,298,302,303,307,308,310,311,314,315,338,370,371,373,374,379,381,383,388,389,405,406,409,414,424,433,434,436,444,445,447,448,],[18,18,-63,-74,-73,-60,-56,-57,-35,-31,-61,18,-36,-55,-70,-65,-54,18,-58,-178,-111,-68,-71,-34,-75,-114,-66,-33,-62,-37,-64,-67,18,-69,18,-72,-76,18,-59,-86,-261,-85,18,-113,-112,-32,-102,-101,18,18,18,-47,-48,18,-115,18,18,18,18,-92,18,18,18,18,-38,18,-49,18,18,-87,-93,-262,-103,-121,-120,18,18,18,18,18,-39,-41,-44,-40,-42,18,-156,-155,-45,-157,-43,-89,-88,-94,-95,-105,-104,-116,-119,18,-175,-174,18,-172,-158,-171,-159,-118,-117,-170,-173,-162,-160,-161,-166,-165,-163,-167,-164,-169,-168,]),'UNION':([0,1,2,3,5,6,9,10,11,12,13,14,15,17,18,19,21,22,23,25,26,27,29,31,32,33,35,36,37,38,39,40,42,43,44,45,46,48,49,54,55,56,57,59,60,61,62,63,66,78,80,82,87,89,90,91,92,93,94,95,96,141,165,167,169,170,171,172,173,174,175,176,191,197,198,204,219,229,230,233,272,276,277,280,282,289,291,292,293,295,298,302,303,307,308,310,311,314,315,338,370,371,373,374,379,381,383,388,389,405,406,409,414,424,433,434,436,444,445,447,448,],[20,20,-63,-74,-73,-60,-56,-57,-35,-31,-61,20,-36,-55,-70,-65,-54,20,-58,-178,-111,-68,-71,-34,-75,-114,-66,-33,-62,-37,-64,-67,20,-69,20,-72,-76,20,-59,-86,-261,-85,20,-113,-112,-32,-102,-101,20,20,20,-47,-48,20,-115,20,20,20,20,-92,20,20,20,20,-38,20,-49,20,20,-87,-93,-262,-103,-121,-120,20,20,20,20,20,-39,-41,-44,-40,-42,20,-156,-155,-45,-157,-43,-89,-88,-94,-95,-105,-104,-116,-119,20,-175,-174,20,-172,-158,-171,-159,-118,-117,-170,-173,-162,-160,-161,-166,-165,-163,-167,-164,-169,-168,]),'COLON':([2,3,5,6,13,18,19,25,26,27,29,32,33,35,37,39,40,43,45,46,54,56,59,60,62,63,90,94,96,97,112,118,120,121,122,123,124,125,126,129,130,132,138,140,143,145,146,147,148,149,151,174,176,177,178,179,180,187,191,197,198,218,220,221,222,224,231,232,234,238,240,286,300,302,303,305,306,310,311,314,315,321,323,324,325,326,329,334,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,377,388,389,390,391,392,397,398,419,428,430,437,],[-63,-74,-73,-60,-61,-70,-65,-178,-111,-68,-71,-75,-114,-66,-62,-64,-67,-69,-72,-76,-86,-85,-113,-112,-102,-101,-115,-263,-263,181,-248,-252,-214,-243,-255,-259,-256,-253,-241,-242,-216,-195,-251,-228,-257,-249,-240,-193,-254,-250,-179,-87,-262,-23,-84,-24,-83,309,-103,-121,-120,-260,-220,-258,-237,-236,-214,-219,-217,-176,-218,375,384,-89,-88,-192,181,-105,-104,-116,-119,-180,-235,-234,-233,-232,-231,-244,-201,-213,-202,-200,-204,-208,-203,-199,-206,-211,-197,-196,-205,-212,-207,-209,400,-210,-198,411,-118,-117,-221,-229,-230,-177,-215,-194,-245,-238,-239,]),'$end':([0,8,11,12,15,22,31,36,38,47,61,82,169,176,272,383,],[-263,0,-35,-31,-36,-29,-34,-33,-37,-30,-32,-47,-38,-262,-39,-159,]),'WSTRING_LITERAL':([3,32,46,55,65,67,69,70,72,77,82,103,104,105,115,119,121,123,127,128,134,135,137,139,141,142,144,152,155,157,162,164,170,176,181,192,194,195,196,206,207,208,209,210,211,212,213,214,215,216,217,218,219,226,227,230,233,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,264,266,268,274,276,277,280,281,282,288,289,291,292,293,295,297,298,309,335,336,362,365,370,371,373,374,375,376,379,380,381,383,384,385,393,395,399,400,402,403,405,406,408,409,411,414,421,423,424,425,426,427,429,432,433,434,436,438,441,443,444,445,446,447,448,],[-74,-75,-76,-261,-263,-28,-124,-27,123,123,-47,123,-28,-263,-125,-227,218,-259,123,-225,123,-224,123,-223,123,123,-222,-226,-263,-223,123,123,123,-262,123,123,-223,123,123,-184,-187,-185,-181,-182,-186,-188,123,-190,-191,-183,-189,-260,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,-12,123,123,-11,-223,-41,-44,-40,123,-42,123,123,-156,-155,-45,-157,123,-43,123,123,123,-263,-139,-175,-174,123,-172,123,123,-158,123,-171,-159,123,123,123,123,-263,123,123,-11,-170,-173,123,-162,123,-160,123,123,-161,123,123,123,-263,123,-166,-165,-163,123,123,123,-167,-164,123,-169,-168,]),'DIVIDE':([112,118,120,121,122,123,124,125,126,129,130,132,138,140,143,145,146,147,148,149,176,218,220,221,222,224,231,232,234,240,300,323,324,325,326,329,334,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,357,358,390,391,392,398,428,430,437,],[-248,-252,-214,-243,-255,-259,-256,-253,-241,-242,-216,-195,-251,-228,-257,-249,-240,251,-254,-250,-262,-260,-220,-258,-237,-236,-214,-219,-217,-218,-248,-235,-234,-233,-232,-231,-244,251,251,251,251,251,251,251,251,251,251,-197,-196,251,251,251,251,251,-198,-221,-229,-230,-215,-245,-238,-239,]),'FOR':([55,82,170,176,276,277,280,282,289,291,292,293,295,297,298,370,371,374,375,379,381,383,384,405,406,409,411,414,423,424,425,427,433,434,436,441,443,444,445,446,447,448,],[-261,-47,283,-262,-41,-44,-40,-42,283,-156,-155,-45,-157,283,-43,-175,-174,-172,283,-158,-171,-159,283,-170,-173,-162,283,-160,283,-161,283,283,-166,-165,-163,283,283,-167,-164,283,-169,-168,]),'PLUSPLUS':([3,32,46,55,65,67,69,70,72,77,82,103,104,105,112,115,118,119,121,122,123,124,125,126,127,128,129,130,134,135,137,138,139,140,141,142,143,144,145,146,148,149,152,155,157,162,164,170,176,181,192,194,195,196,206,207,208,209,210,211,212,213,214,215,216,217,218,219,221,222,224,226,227,230,233,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,264,266,268,274,276,277,280,281,282,288,289,291,292,293,295,297,298,300,309,323,324,325,326,329,334,335,336,362,365,370,371,373,374,375,376,379,380,381,383,384,385,391,392,393,395,399,400,402,403,405,406,408,409,411,414,421,423,424,425,426,427,428,429,430,432,433,434,436,437,438,441,443,444,445,446,447,448,],[-74,-75,-76,-261,-263,-28,-124,-27,137,137,-47,137,-28,-263,-248,-125,-252,-227,-243,-255,-259,-256,-253,-241,137,-225,-242,224,137,-224,137,-251,-223,-228,137,137,-257,-222,-249,-240,-254,-250,-226,-263,-223,137,137,137,-262,137,137,-223,137,137,-184,-187,-185,-181,-182,-186,-188,137,-190,-191,-183,-189,-260,137,-258,-237,-236,137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,-12,137,137,-11,-223,-41,-44,-40,137,-42,137,137,-156,-155,-45,-157,137,-43,-248,137,-235,-234,-233,-232,-231,-244,137,137,-263,-139,-175,-174,137,-172,137,137,-158,137,-171,-159,137,137,-229,-230,137,137,-263,137,137,-11,-170,-173,137,-162,137,-160,137,137,-161,137,137,137,-245,-263,-238,137,-166,-165,-163,-239,137,137,137,-167,-164,137,-169,-168,]),'EQUALS':([1,2,3,5,6,9,10,13,14,17,18,19,21,23,25,26,27,29,30,32,33,35,37,39,40,42,43,44,45,46,49,50,51,52,54,56,58,59,60,62,63,80,83,84,86,90,102,112,118,120,121,122,123,124,125,126,129,130,138,140,143,145,146,148,149,168,174,176,191,197,198,218,220,221,222,224,231,232,234,240,262,267,300,302,303,310,311,314,315,323,324,325,326,329,334,360,364,388,389,390,391,392,398,401,428,430,437,],[-263,-63,-74,-73,-60,-56,-57,-61,-263,-55,-70,-65,-54,-58,-178,-111,-68,-71,77,-75,-114,-66,-62,-64,-67,-263,-69,-263,-72,-76,-59,-52,-9,-10,-86,-85,-51,-113,-112,-102,-101,162,-50,-53,77,-115,192,-248,-252,209,-243,-255,-259,-256,-253,-241,-242,-216,-251,-228,-257,-249,-240,-254,-250,162,-87,-262,-103,-121,-120,-260,-220,-258,-237,-236,-214,-219,-217,-218,-140,365,-248,-89,-88,-105,-104,-116,-119,-235,-234,-233,-232,-231,-244,-143,-141,-118,-117,-221,-229,-230,-215,-142,-245,-238,-239,]),'ELSE':([176,276,277,280,282,293,298,370,371,374,381,383,405,406,409,414,424,433,434,436,444,445,447,448,],[-262,-41,-44,-40,-42,-45,-43,-175,-174,-172,-171,-159,-170,-173,-162,-160,-161,-166,-165,441,-167,-164,-169,-168,]),'ANDEQUAL':([112,118,120,121,122,123,124,125,126,129,130,138,140,143,145,146,148,149,176,218,220,221,222,224,231,232,234,240,300,323,324,325,326,329,334,390,391,392,398,428,430,437,],[-248,-252,214,-243,-255,-259,-256,-253,-241,-242,-216,-251,-228,-257,-249,-240,-254,-250,-262,-260,-220,-258,-237,-236,-214,-219,-217,-218,-248,-235,-234,-233,-232,-231,-244,-221,-229,-230,-215,-245,-238,-239,]),'EQ':([112,118,120,121,122,123,124,125,126,129,130,132,138,140,143,145,146,147,148,149,176,218,220,221,222,224,231,232,234,240,300,323,324,325,326,329,334,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,357,358,390,391,392,398,428,430,437,],[-248,-252,-214,-243,-255,-259,-256,-253,-241,-242,-216,-195,-251,-228,-257,-249,-240,255,-254,-250,-262,-260,-220,-258,-237,-236,-214,-219,-217,-218,-248,-235,-234,-233,-232,-231,-244,-201,255,-202,-200,-204,-208,-203,-199,-206,255,-197,-196,-205,255,-207,255,255,-198,-221,-229,-230,-215,-245,-238,-239,]),'AND':([3,32,46,55,65,67,69,70,72,77,82,103,104,105,112,115,118,119,120,121,122,123,124,125,126,127,128,129,130,132,134,135,137,138,139,140,141,142,143,144,145,146,147,148,149,152,155,157,162,164,170,176,181,192,194,195,196,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,224,226,227,230,231,232,233,234,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,264,266,268,274,276,277,280,281,282,288,289,291,292,293,295,297,298,300,309,323,324,325,326,329,334,335,336,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,357,358,362,365,370,371,373,374,375,376,379,380,381,383,384,385,390,391,392,393,395,398,399,400,402,403,405,406,408,409,411,414,421,423,424,425,426,427,428,429,430,432,433,434,436,437,438,441,443,444,445,446,447,448,],[-74,-75,-76,-261,-263,-28,-124,-27,144,144,-47,144,-28,-263,-248,-125,-252,-227,-214,-243,-255,-259,-256,-253,-241,144,-225,-242,-216,-195,144,-224,144,-251,-223,-228,144,144,-257,-222,-249,-240,256,-254,-250,-226,-263,-223,144,144,144,-262,144,144,-223,144,144,-184,-187,-185,-181,-182,-186,-188,144,-190,-191,-183,-189,-260,144,-220,-258,-237,-236,144,144,144,-214,-219,144,-217,-218,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,-12,144,144,-11,-223,-41,-44,-40,144,-42,144,144,-156,-155,-45,-157,144,-43,-248,144,-235,-234,-233,-232,-231,-244,144,144,-201,256,-202,-200,-204,-208,-203,-199,-206,256,-197,-196,-205,256,-207,-209,256,-198,-263,-139,-175,-174,144,-172,144,144,-158,144,-171,-159,144,144,-221,-229,-230,144,144,-215,-263,144,144,-11,-170,-173,144,-162,144,-160,144,144,-161,144,144,144,-245,-263,-238,144,-166,-165,-163,-239,144,144,144,-167,-164,144,-169,-168,]),'TYPEID':([0,1,2,3,5,6,7,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,31,32,33,34,35,36,37,38,39,40,42,43,44,45,46,48,49,54,55,56,57,59,60,61,62,63,66,67,68,69,70,74,78,80,82,87,89,90,91,92,93,94,95,96,115,116,141,165,166,167,169,170,171,172,173,174,175,176,191,197,198,204,219,223,225,229,230,233,272,276,277,280,282,289,291,292,293,295,298,302,303,307,308,310,311,314,315,338,370,371,373,374,379,381,383,388,389,405,406,409,414,424,433,434,436,444,445,447,448,],[25,25,-63,-74,-73,-60,54,-56,-57,-35,-31,-61,25,-36,59,-55,-70,-65,-91,-54,25,-58,62,-178,-111,-68,-263,-71,-34,-75,-114,-90,-66,-33,-62,-37,-64,-67,25,-69,25,-72,-76,25,-59,-86,-261,-85,25,-113,-112,-32,-102,-101,25,-28,-122,-124,-27,59,25,25,-47,-48,25,-115,25,25,25,25,-92,25,-125,-123,25,25,59,25,-38,25,-49,25,25,-87,-93,-262,-103,-121,-120,25,25,323,325,25,25,25,-39,-41,-44,-40,-42,25,-156,-155,-45,-157,-43,-89,-88,-94,-95,-105,-104,-116,-119,25,-175,-174,25,-172,-158,-171,-159,-118,-117,-170,-173,-162,-160,-161,-166,-165,-163,-167,-164,-169,-168,]),'LBRACE':([7,20,24,26,33,34,48,54,55,56,59,60,62,63,77,80,82,85,87,88,89,90,155,162,163,170,171,176,197,198,260,266,268,276,277,280,282,289,291,292,293,295,297,298,314,315,336,362,365,370,371,374,375,379,381,383,384,388,389,390,395,396,399,402,403,405,406,409,411,414,423,424,425,427,429,433,434,436,441,443,444,445,446,447,448,],[55,-91,55,-111,-114,-90,-263,55,-261,55,-113,-112,55,55,55,-263,-47,-7,-48,55,-8,-115,-263,55,55,55,-49,-262,-121,-120,-12,55,-11,-41,-44,-40,-42,55,-156,-155,-45,-157,55,-43,-116,-119,55,-263,-139,-175,-174,-172,55,-158,-171,-159,55,-118,-117,55,55,55,-263,55,-11,-170,-173,-162,55,-160,55,-161,55,55,-263,-166,-165,-163,55,55,-167,-164,55,-169,-168,]),'PPHASH':([0,11,12,15,22,31,36,38,61,82,169,176,272,383,],[38,-35,-31,-36,38,-34,-33,-37,-32,-47,-38,-262,-39,-159,]),'INT':([0,1,2,3,5,6,9,10,11,12,13,14,15,17,18,19,21,22,23,25,26,27,29,31,32,33,35,36,37,38,39,40,42,43,44,45,46,48,49,54,55,56,57,59,60,61,62,63,66,78,80,82,87,89,90,91,92,93,94,95,96,141,165,167,169,170,171,172,173,174,175,176,191,197,198,204,219,229,230,233,272,276,277,280,282,289,291,292,293,295,298,302,303,307,308,310,311,314,315,338,370,371,373,374,379,381,383,388,389,405,406,409,414,424,433,434,436,444,445,447,448,],[39,39,-63,-74,-73,-60,-56,-57,-35,-31,-61,39,-36,-55,-70,-65,-54,39,-58,-178,-111,-68,-71,-34,-75,-114,-66,-33,-62,-37,-64,-67,39,-69,39,-72,-76,39,-59,-86,-261,-85,39,-113,-112,-32,-102,-101,39,39,39,-47,-48,39,-115,39,39,39,39,-92,39,39,39,39,-38,39,-49,39,39,-87,-93,-262,-103,-121,-120,39,39,39,39,39,-39,-41,-44,-40,-42,39,-156,-155,-45,-157,-43,-89,-88,-94,-95,-105,-104,-116,-119,39,-175,-174,39,-172,-158,-171,-159,-118,-117,-170,-173,-162,-160,-161,-166,-165,-163,-167,-164,-169,-168,]),'SIGNED':([0,1,2,3,5,6,9,10,11,12,13,14,15,17,18,19,21,22,23,25,26,27,29,31,32,33,35,36,37,38,39,40,42,43,44,45,46,48,49,54,55,56,57,59,60,61,62,63,66,78,80,82,87,89,90,91,92,93,94,95,96,141,165,167,169,170,171,172,173,174,175,176,191,197,198,204,219,229,230,233,272,276,277,280,282,289,291,292,293,295,298,302,303,307,308,310,311,314,315,338,370,371,373,374,379,381,383,388,389,405,406,409,414,424,433,434,436,444,445,447,448,],[43,43,-63,-74,-73,-60,-56,-57,-35,-31,-61,43,-36,-55,-70,-65,-54,43,-58,-178,-111,-68,-71,-34,-75,-114,-66,-33,-62,-37,-64,-67,43,-69,43,-72,-76,43,-59,-86,-261,-85,43,-113,-112,-32,-102,-101,43,43,43,-47,-48,43,-115,43,43,43,43,-92,43,43,43,43,-38,43,-49,43,43,-87,-93,-262,-103,-121,-120,43,43,43,43,43,-39,-41,-44,-40,-42,43,-156,-155,-45,-157,-43,-89,-88,-94,-95,-105,-104,-116,-119,43,-175,-174,43,-172,-158,-171,-159,-118,-117,-170,-173,-162,-160,-161,-166,-165,-163,-167,-164,-169,-168,]),'CONTINUE':([55,82,170,176,276,277,280,282,289,291,292,293,295,297,298,370,371,374,375,379,381,383,384,405,406,409,411,414,423,424,425,427,433,434,436,441,443,444,445,446,447,448,],[-261,-47,284,-262,-41,-44,-40,-42,284,-156,-155,-45,-157,284,-43,-175,-174,-172,284,-158,-171,-159,284,-170,-173,-162,284,-160,284,-161,284,284,-166,-165,-163,284,284,-167,-164,284,-169,-168,]),'NOT':([3,32,46,55,65,67,69,70,72,77,82,103,104,105,115,119,127,128,134,135,137,139,141,142,144,152,155,157,162,164,170,176,181,192,194,195,196,206,207,208,209,210,211,212,213,214,215,216,217,219,226,227,230,233,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,264,266,268,274,276,277,280,281,282,288,289,291,292,293,295,297,298,309,335,336,362,365,370,371,373,374,375,376,379,380,381,383,384,385,393,395,399,400,402,403,405,406,408,409,411,414,421,423,424,425,426,427,429,432,433,434,436,438,441,443,444,445,446,447,448,],[-74,-75,-76,-261,-263,-28,-124,-27,152,152,-47,152,-28,-263,-125,-227,152,-225,152,-224,152,-223,152,152,-222,-226,-263,-223,152,152,152,-262,152,152,-223,152,152,-184,-187,-185,-181,-182,-186,-188,152,-190,-191,-183,-189,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,-12,152,152,-11,-223,-41,-44,-40,152,-42,152,152,-156,-155,-45,-157,152,-43,152,152,152,-263,-139,-175,-174,152,-172,152,152,-158,152,-171,-159,152,152,152,152,-263,152,152,-11,-170,-173,152,-162,152,-160,152,152,-161,152,152,152,-263,152,-166,-165,-163,152,152,152,-167,-164,152,-169,-168,]),'OREQUAL':([112,118,120,121,122,123,124,125,126,129,130,138,140,143,145,146,148,149,176,218,220,221,222,224,231,232,234,240,300,323,324,325,326,329,334,390,391,392,398,428,430,437,],[-248,-252,215,-243,-255,-259,-256,-253,-241,-242,-216,-251,-228,-257,-249,-240,-254,-250,-262,-260,-220,-258,-237,-236,-214,-219,-217,-218,-248,-235,-234,-233,-232,-231,-244,-221,-229,-230,-215,-245,-238,-239,]),'MOD':([112,118,120,121,122,123,124,125,126,129,130,132,138,140,143,145,146,147,148,149,176,218,220,221,222,224,231,232,234,240,300,323,324,325,326,329,334,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,357,358,390,391,392,398,428,430,437,],[-248,-252,-214,-243,-255,-259,-256,-253,-241,-242,-216,-195,-251,-228,-257,-249,-240,259,-254,-250,-262,-260,-220,-258,-237,-236,-214,-219,-217,-218,-248,-235,-234,-233,-232,-231,-244,259,259,259,259,259,259,259,259,259,259,-197,-196,259,259,259,259,259,-198,-221,-229,-230,-215,-245,-238,-239,]),'RSHIFT':([112,118,120,121,122,123,124,125,126,129,130,132,138,140,143,145,146,147,148,149,176,218,220,221,222,224,231,232,234,240,300,323,324,325,326,329,334,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,357,358,390,391,392,398,428,430,437,],[-248,-252,-214,-243,-255,-259,-256,-253,-241,-242,-216,-195,-251,-228,-257,-249,-240,241,-254,-250,-262,-260,-220,-258,-237,-236,-214,-219,-217,-218,-248,-235,-234,-233,-232,-231,-244,-201,241,-202,-200,241,241,241,-199,241,241,-197,-196,241,241,241,241,241,-198,-221,-229,-230,-215,-245,-238,-239,]),'DEFAULT':([55,82,170,176,276,277,280,282,289,291,292,293,295,297,298,370,371,374,375,379,381,383,384,405,406,409,411,414,423,424,425,427,433,434,436,441,443,444,445,446,447,448,],[-261,-47,286,-262,-41,-44,-40,-42,286,-156,-155,-45,-157,286,-43,-175,-174,-172,286,-158,-171,-159,286,-170,-173,-162,286,-160,286,-161,286,286,-166,-165,-163,286,286,-167,-164,286,-169,-168,]),'CHAR':([0,1,2,3,5,6,9,10,11,12,13,14,15,17,18,19,21,22,23,25,26,27,29,31,32,33,35,36,37,38,39,40,42,43,44,45,46,48,49,54,55,56,57,59,60,61,62,63,66,78,80,82,87,89,90,91,92,93,94,95,96,141,165,167,169,170,171,172,173,174,175,176,191,197,198,204,219,229,230,233,272,276,277,280,282,289,291,292,293,295,298,302,303,307,308,310,311,314,315,338,370,371,373,374,379,381,383,388,389,405,406,409,414,424,433,434,436,444,445,447,448,],[37,37,-63,-74,-73,-60,-56,-57,-35,-31,-61,37,-36,-55,-70,-65,-54,37,-58,-178,-111,-68,-71,-34,-75,-114,-66,-33,-62,-37,-64,-67,37,-69,37,-72,-76,37,-59,-86,-261,-85,37,-113,-112,-32,-102,-101,37,37,37,-47,-48,37,-115,37,37,37,37,-92,37,37,37,37,-38,37,-49,37,37,-87,-93,-262,-103,-121,-120,37,37,37,37,37,-39,-41,-44,-40,-42,37,-156,-155,-45,-157,-43,-89,-88,-94,-95,-105,-104,-116,-119,37,-175,-174,37,-172,-158,-171,-159,-118,-117,-170,-173,-162,-160,-161,-166,-165,-163,-167,-164,-169,-168,]),'WHILE':([55,82,170,176,276,277,280,282,289,291,292,293,295,297,298,370,371,374,375,379,381,382,383,384,405,406,409,411,414,423,424,425,427,433,434,436,441,443,444,445,446,447,448,],[-261,-47,287,-262,-41,-44,-40,-42,287,-156,-155,-45,-157,287,-43,-175,-174,-172,287,-158,-171,413,-159,287,-170,-173,-162,287,-160,287,-161,287,287,-166,-165,-163,287,287,-167,-164,287,-169,-168,]),'DIVEQUAL':([112,118,120,121,122,123,124,125,126,129,130,138,140,143,145,146,148,149,176,218,220,221,222,224,231,232,234,240,300,323,324,325,326,329,334,390,391,392,398,428,430,437,],[-248,-252,206,-243,-255,-259,-256,-253,-241,-242,-216,-251,-228,-257,-249,-240,-254,-250,-262,-260,-220,-258,-237,-236,-214,-219,-217,-218,-248,-235,-234,-233,-232,-231,-244,-221,-229,-230,-215,-245,-238,-239,]),'EXTERN':([0,1,2,3,5,6,9,10,11,12,13,14,15,17,18,19,21,22,23,25,26,27,29,31,32,33,35,36,37,38,39,40,42,43,44,45,46,48,49,54,55,56,59,60,61,62,63,66,78,80,82,87,89,90,165,167,169,170,171,174,176,191,197,198,204,272,276,277,280,282,289,291,292,293,295,298,302,303,310,311,314,315,338,370,371,373,374,379,381,383,388,389,405,406,409,414,424,433,434,436,444,445,447,448,],[10,10,-63,-74,-73,-60,-56,-57,-35,-31,-61,10,-36,-55,-70,-65,-54,10,-58,-178,-111,-68,-71,-34,-75,-114,-66,-33,-62,-37,-64,-67,10,-69,10,-72,-76,10,-59,-86,-261,-85,-113,-112,-32,-102,-101,10,10,10,-47,-48,10,-115,10,10,-38,10,-49,-87,-262,-103,-121,-120,10,-39,-41,-44,-40,-42,10,-156,-155,-45,-157,-43,-89,-88,-105,-104,-116,-119,10,-175,-174,10,-172,-158,-171,-159,-118,-117,-170,-173,-162,-160,-161,-166,-165,-163,-167,-164,-169,-168,]),'CASE':([55,82,170,176,276,277,280,282,289,291,292,293,295,297,298,370,371,374,375,379,381,383,384,405,406,409,411,414,423,424,425,427,433,434,436,441,443,444,445,446,447,448,],[-261,-47,288,-262,-41,-44,-40,-42,288,-156,-155,-45,-157,288,-43,-175,-174,-172,288,-158,-171,-159,288,-170,-173,-162,288,-160,288,-161,288,288,-166,-165,-163,288,288,-167,-164,288,-169,-168,]),'LAND':([112,118,120,121,122,123,124,125,126,129,130,132,138,140,143,145,146,147,148,149,176,218,220,221,222,224,231,232,234,240,300,323,324,325,326,329,334,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,357,358,390,391,392,398,428,430,437,],[-248,-252,-214,-243,-255,-259,-256,-253,-241,-242,-216,-195,-251,-228,-257,-249,-240,254,-254,-250,-262,-260,-220,-258,-237,-236,-214,-219,-217,-218,-248,-235,-234,-233,-232,-231,-244,-201,254,-202,-200,-204,-208,-203,-199,-206,-211,-197,-196,-205,-212,-207,-209,-210,-198,-221,-229,-230,-215,-245,-238,-239,]),'REGISTER':([0,1,2,3,5,6,9,10,11,12,13,14,15,17,18,19,21,22,23,25,26,27,29,31,32,33,35,36,37,38,39,40,42,43,44,45,46,48,49,54,55,56,59,60,61,62,63,66,78,80,82,87,89,90,165,167,169,170,171,174,176,191,197,198,204,272,276,277,280,282,289,291,292,293,295,298,302,303,310,311,314,315,338,370,371,373,374,379,381,383,388,389,405,406,409,414,424,433,434,436,444,445,447,448,],[17,17,-63,-74,-73,-60,-56,-57,-35,-31,-61,17,-36,-55,-70,-65,-54,17,-58,-178,-111,-68,-71,-34,-75,-114,-66,-33,-62,-37,-64,-67,17,-69,17,-72,-76,17,-59,-86,-261,-85,-113,-112,-32,-102,-101,17,17,17,-47,-48,17,-115,17,17,-38,17,-49,-87,-262,-103,-121,-120,17,-39,-41,-44,-40,-42,17,-156,-155,-45,-157,-43,-89,-88,-105,-104,-116,-119,17,-175,-174,17,-172,-158,-171,-159,-118,-117,-170,-173,-162,-160,-161,-166,-165,-163,-167,-164,-169,-168,]),'MODEQUAL':([112,118,120,121,122,123,124,125,126,129,130,138,140,143,145,146,148,149,176,218,220,221,222,224,231,232,234,240,300,323,324,325,326,329,334,390,391,392,398,428,430,437,],[-248,-252,208,-243,-255,-259,-256,-253,-241,-242,-216,-251,-228,-257,-249,-240,-254,-250,-262,-260,-220,-258,-237,-236,-214,-219,-217,-218,-248,-235,-234,-233,-232,-231,-244,-221,-229,-230,-215,-245,-238,-239,]),'NE':([112,118,120,121,122,123,124,125,126,129,130,132,138,140,143,145,146,147,148,149,176,218,220,221,222,224,231,232,234,240,300,323,324,325,326,329,334,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,357,358,390,391,392,398,428,430,437,],[-248,-252,-214,-243,-255,-259,-256,-253,-241,-242,-216,-195,-251,-228,-257,-249,-240,246,-254,-250,-262,-260,-220,-258,-237,-236,-214,-219,-217,-218,-248,-235,-234,-233,-232,-231,-244,-201,246,-202,-200,-204,-208,-203,-199,-206,246,-197,-196,-205,246,-207,246,246,-198,-221,-229,-230,-215,-245,-238,-239,]),'SWITCH':([55,82,170,176,276,277,280,282,289,291,292,293,295,297,298,370,371,374,375,379,381,383,384,405,406,409,411,414,423,424,425,427,433,434,436,441,443,444,445,446,447,448,],[-261,-47,290,-262,-41,-44,-40,-42,290,-156,-155,-45,-157,290,-43,-175,-174,-172,290,-158,-171,-159,290,-170,-173,-162,290,-160,290,-161,290,290,-166,-165,-163,290,290,-167,-164,290,-169,-168,]),'INT_CONST_HEX':([3,32,46,55,65,67,69,70,72,77,82,103,104,105,115,119,127,128,134,135,137,139,141,142,144,152,155,157,162,164,170,176,181,192,194,195,196,206,207,208,209,210,211,212,213,214,215,216,217,219,226,227,230,233,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,264,266,268,274,276,277,280,281,282,288,289,291,292,293,295,297,298,309,335,336,362,365,370,371,373,374,375,376,379,380,381,383,384,385,393,395,399,400,402,403,405,406,408,409,411,414,421,423,424,425,426,427,429,432,433,434,436,438,441,443,444,445,446,447,448,],[-74,-75,-76,-261,-263,-28,-124,-27,138,138,-47,138,-28,-263,-125,-227,138,-225,138,-224,138,-223,138,138,-222,-226,-263,-223,138,138,138,-262,138,138,-223,138,138,-184,-187,-185,-181,-182,-186,-188,138,-190,-191,-183,-189,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,-12,138,138,-11,-223,-41,-44,-40,138,-42,138,138,-156,-155,-45,-157,138,-43,138,138,138,-263,-139,-175,-174,138,-172,138,138,-158,138,-171,-159,138,138,138,138,-263,138,138,-11,-170,-173,138,-162,138,-160,138,138,-161,138,138,138,-263,138,-166,-165,-163,138,138,138,-167,-164,138,-169,-168,]),'_COMPLEX':([0,1,2,3,5,6,9,10,11,12,13,14,15,17,18,19,21,22,23,25,26,27,29,31,32,33,35,36,37,38,39,40,42,43,44,45,46,48,49,54,55,56,57,59,60,61,62,63,66,78,80,82,87,89,90,91,92,93,94,95,96,141,165,167,169,170,171,172,173,174,175,176,191,197,198,204,219,229,230,233,272,276,277,280,282,289,291,292,293,295,298,302,303,307,308,310,311,314,315,338,370,371,373,374,379,381,383,388,389,405,406,409,414,424,433,434,436,444,445,447,448,],[27,27,-63,-74,-73,-60,-56,-57,-35,-31,-61,27,-36,-55,-70,-65,-54,27,-58,-178,-111,-68,-71,-34,-75,-114,-66,-33,-62,-37,-64,-67,27,-69,27,-72,-76,27,-59,-86,-261,-85,27,-113,-112,-32,-102,-101,27,27,27,-47,-48,27,-115,27,27,27,27,-92,27,27,27,27,-38,27,-49,27,27,-87,-93,-262,-103,-121,-120,27,27,27,27,27,-39,-41,-44,-40,-42,27,-156,-155,-45,-157,-43,-89,-88,-94,-95,-105,-104,-116,-119,27,-175,-174,27,-172,-158,-171,-159,-118,-117,-170,-173,-162,-160,-161,-166,-165,-163,-167,-164,-169,-168,]),'PLUSEQUAL':([112,118,120,121,122,123,124,125,126,129,130,138,140,143,145,146,148,149,176,218,220,221,222,224,231,232,234,240,300,323,324,325,326,329,334,390,391,392,398,428,430,437,],[-248,-252,211,-243,-255,-259,-256,-253,-241,-242,-216,-251,-228,-257,-249,-240,-254,-250,-262,-260,-220,-258,-237,-236,-214,-219,-217,-218,-248,-235,-234,-233,-232,-231,-244,-221,-229,-230,-215,-245,-238,-239,]),'STRUCT':([0,1,2,3,5,6,9,10,11,12,13,14,15,17,18,19,21,22,23,25,26,27,29,31,32,33,35,36,37,38,39,40,42,43,44,45,46,48,49,54,55,56,57,59,60,61,62,63,66,78,80,82,87,89,90,91,92,93,94,95,96,141,165,167,169,170,171,172,173,174,175,176,191,197,198,204,219,229,230,233,272,276,277,280,282,289,291,292,293,295,298,302,303,307,308,310,311,314,315,338,370,371,373,374,379,381,383,388,389,405,406,409,414,424,433,434,436,444,445,447,448,],[34,34,-63,-74,-73,-60,-56,-57,-35,-31,-61,34,-36,-55,-70,-65,-54,34,-58,-178,-111,-68,-71,-34,-75,-114,-66,-33,-62,-37,-64,-67,34,-69,34,-72,-76,34,-59,-86,-261,-85,34,-113,-112,-32,-102,-101,34,34,34,-47,-48,34,-115,34,34,34,34,-92,34,34,34,34,-38,34,-49,34,34,-87,-93,-262,-103,-121,-120,34,34,34,34,34,-39,-41,-44,-40,-42,34,-156,-155,-45,-157,-43,-89,-88,-94,-95,-105,-104,-116,-119,34,-175,-174,34,-172,-158,-171,-159,-118,-117,-170,-173,-162,-160,-161,-166,-165,-163,-167,-164,-169,-168,]),'CONDOP':([112,118,120,121,122,123,124,125,126,129,130,132,138,140,143,145,146,147,148,149,176,218,220,221,222,224,231,232,234,240,300,323,324,325,326,329,334,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,357,358,390,391,392,398,428,430,437,],[-248,-252,-214,-243,-255,-259,-256,-253,-241,-242,-216,-195,-251,-228,-257,-249,-240,257,-254,-250,-262,-260,-220,-258,-237,-236,-214,-219,-217,-218,-248,-235,-234,-233,-232,-231,-244,-201,-213,-202,-200,-204,-208,-203,-199,-206,-211,-197,-196,-205,-212,-207,-209,-210,-198,-221,-229,-230,-215,-245,-238,-239,]),'BREAK':([55,82,170,176,276,277,280,282,289,291,292,293,295,297,298,370,371,374,375,379,381,383,384,405,406,409,411,414,423,424,425,427,433,434,436,441,443,444,445,446,447,448,],[-261,-47,294,-262,-41,-44,-40,-42,294,-156,-155,-45,-157,294,-43,-175,-174,-172,294,-158,-171,-159,294,-170,-173,-162,294,-160,294,-161,294,294,-166,-165,-163,294,294,-167,-164,294,-169,-168,]),'VOLATILE':([0,1,2,3,5,6,9,10,11,12,13,14,15,17,18,19,21,22,23,25,26,27,28,29,31,32,33,35,36,37,38,39,40,42,43,44,45,46,48,49,54,55,56,57,59,60,61,62,63,65,66,67,69,78,80,82,87,89,90,91,92,93,94,95,96,104,105,115,141,165,167,169,170,171,172,173,174,175,176,191,197,198,204,219,229,230,233,272,276,277,280,282,289,291,292,293,295,298,302,303,307,308,310,311,314,315,338,370,371,373,374,379,381,383,388,389,405,406,409,414,424,433,434,436,444,445,447,448,],[46,46,-63,-74,-73,-60,-56,-57,-35,-31,-61,46,-36,-55,-70,-65,-54,46,-58,-178,-111,-68,46,-71,-34,-75,-114,-66,-33,-62,-37,-64,-67,46,-69,46,-72,-76,46,-59,-86,-261,-85,46,-113,-112,-32,-102,-101,46,46,46,-124,46,46,-47,-48,46,-115,46,46,46,46,-92,46,46,46,-125,46,46,46,-38,46,-49,46,46,-87,-93,-262,-103,-121,-120,46,46,46,46,46,-39,-41,-44,-40,-42,46,-156,-155,-45,-157,-43,-89,-88,-94,-95,-105,-104,-116,-119,46,-175,-174,46,-172,-158,-171,-159,-118,-117,-170,-173,-162,-160,-161,-166,-165,-163,-167,-164,-169,-168,]),'INLINE':([0,1,2,3,5,6,9,10,11,12,13,14,15,17,18,19,21,22,23,25,26,27,29,31,32,33,35,36,37,38,39,40,42,43,44,45,46,48,49,54,55,56,59,60,61,62,63,66,78,80,82,87,89,90,165,167,169,170,171,174,176,191,197,198,204,272,276,277,280,282,289,291,292,293,295,298,302,303,310,311,314,315,338,370,371,373,374,379,381,383,388,389,405,406,409,414,424,433,434,436,444,445,447,448,],[49,49,-63,-74,-73,-60,-56,-57,-35,-31,-61,49,-36,-55,-70,-65,-54,49,-58,-178,-111,-68,-71,-34,-75,-114,-66,-33,-62,-37,-64,-67,49,-69,49,-72,-76,49,-59,-86,-261,-85,-113,-112,-32,-102,-101,49,49,49,-47,-48,49,-115,49,49,-38,49,-49,-87,-262,-103,-121,-120,49,-39,-41,-44,-40,-42,49,-156,-155,-45,-157,-43,-89,-88,-105,-104,-116,-119,49,-175,-174,49,-172,-158,-171,-159,-118,-117,-170,-173,-162,-160,-161,-166,-165,-163,-167,-164,-169,-168,]),'INT_CONST_BIN':([3,32,46,55,65,67,69,70,72,77,82,103,104,105,115,119,127,128,134,135,137,139,141,142,144,152,155,157,162,164,170,176,181,192,194,195,196,206,207,208,209,210,211,212,213,214,215,216,217,219,226,227,230,233,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,264,266,268,274,276,277,280,281,282,288,289,291,292,293,295,297,298,309,335,336,362,365,370,371,373,374,375,376,379,380,381,383,384,385,393,395,399,400,402,403,405,406,408,409,411,414,421,423,424,425,426,427,429,432,433,434,436,438,441,443,444,445,446,447,448,],[-74,-75,-76,-261,-263,-28,-124,-27,118,118,-47,118,-28,-263,-125,-227,118,-225,118,-224,118,-223,118,118,-222,-226,-263,-223,118,118,118,-262,118,118,-223,118,118,-184,-187,-185,-181,-182,-186,-188,118,-190,-191,-183,-189,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,-12,118,118,-11,-223,-41,-44,-40,118,-42,118,118,-156,-155,-45,-157,118,-43,118,118,118,-263,-139,-175,-174,118,-172,118,118,-158,118,-171,-159,118,118,118,118,-263,118,118,-11,-170,-173,118,-162,118,-160,118,118,-161,118,118,118,-263,118,-166,-165,-163,118,118,118,-167,-164,118,-169,-168,]),'DO':([55,82,170,176,276,277,280,282,289,291,292,293,295,297,298,370,371,374,375,379,381,383,384,405,406,409,411,414,423,424,425,427,433,434,436,441,443,444,445,446,447,448,],[-261,-47,297,-262,-41,-44,-40,-42,297,-156,-155,-45,-157,297,-43,-175,-174,-172,297,-158,-171,-159,297,-170,-173,-162,297,-160,297,-161,297,297,-166,-165,-163,297,297,-167,-164,297,-169,-168,]),'LNOT':([3,32,46,55,65,67,69,70,72,77,82,103,104,105,115,119,127,128,134,135,137,139,141,142,144,152,155,157,162,164,170,176,181,192,194,195,196,206,207,208,209,210,211,212,213,214,215,216,217,219,226,227,230,233,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,264,266,268,274,276,277,280,281,282,288,289,291,292,293,295,297,298,309,335,336,362,365,370,371,373,374,375,376,379,380,381,383,384,385,393,395,399,400,402,403,405,406,408,409,411,414,421,423,424,425,426,427,429,432,433,434,436,438,441,443,444,445,446,447,448,],[-74,-75,-76,-261,-263,-28,-124,-27,119,119,-47,119,-28,-263,-125,-227,119,-225,119,-224,119,-223,119,119,-222,-226,-263,-223,119,119,119,-262,119,119,-223,119,119,-184,-187,-185,-181,-182,-186,-188,119,-190,-191,-183,-189,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,-12,119,119,-11,-223,-41,-44,-40,119,-42,119,119,-156,-155,-45,-157,119,-43,119,119,119,-263,-139,-175,-174,119,-172,119,119,-158,119,-171,-159,119,119,119,119,-263,119,119,-11,-170,-173,119,-162,119,-160,119,119,-161,119,119,119,-263,119,-166,-165,-163,119,119,119,-167,-164,119,-169,-168,]),'CONST':([0,1,2,3,5,6,9,10,11,12,13,14,15,17,18,19,21,22,23,25,26,27,28,29,31,32,33,35,36,37,38,39,40,42,43,44,45,46,48,49,54,55,56,57,59,60,61,62,63,65,66,67,69,78,80,82,87,89,90,91,92,93,94,95,96,104,105,115,141,165,167,169,170,171,172,173,174,175,176,191,197,198,204,219,229,230,233,272,276,277,280,282,289,291,292,293,295,298,302,303,307,308,310,311,314,315,338,370,371,373,374,379,381,383,388,389,405,406,409,414,424,433,434,436,444,445,447,448,],[3,3,-63,-74,-73,-60,-56,-57,-35,-31,-61,3,-36,-55,-70,-65,-54,3,-58,-178,-111,-68,3,-71,-34,-75,-114,-66,-33,-62,-37,-64,-67,3,-69,3,-72,-76,3,-59,-86,-261,-85,3,-113,-112,-32,-102,-101,3,3,3,-124,3,3,-47,-48,3,-115,3,3,3,3,-92,3,3,3,-125,3,3,3,-38,3,-49,3,3,-87,-93,-262,-103,-121,-120,3,3,3,3,3,-39,-41,-44,-40,-42,3,-156,-155,-45,-157,-43,-89,-88,-94,-95,-105,-104,-116,-119,3,-175,-174,3,-172,-158,-171,-159,-118,-117,-170,-173,-162,-160,-161,-166,-165,-163,-167,-164,-169,-168,]),'LOR':([112,118,120,121,122,123,124,125,126,129,130,132,138,140,143,145,146,147,148,149,176,218,220,221,222,224,231,232,234,240,300,323,324,325,326,329,334,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,357,358,390,391,392,398,428,430,437,],[-248,-252,-214,-243,-255,-259,-256,-253,-241,-242,-216,-195,-251,-228,-257,-249,-240,242,-254,-250,-262,-260,-220,-258,-237,-236,-214,-219,-217,-218,-248,-235,-234,-233,-232,-231,-244,-201,-213,-202,-200,-204,-208,-203,-199,-206,-211,-197,-196,-205,-212,-207,-209,-210,-198,-221,-229,-230,-215,-245,-238,-239,]),'CHAR_CONST':([3,32,46,55,65,67,69,70,72,77,82,103,104,105,115,119,127,128,134,135,137,139,141,142,144,152,155,157,162,164,170,176,181,192,194,195,196,206,207,208,209,210,211,212,213,214,215,216,217,219,226,227,230,233,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,264,266,268,274,276,277,280,281,282,288,289,291,292,293,295,297,298,309,335,336,362,365,370,371,373,374,375,376,379,380,381,383,384,385,393,395,399,400,402,403,405,406,408,409,411,414,421,423,424,425,426,427,429,432,433,434,436,438,441,443,444,445,446,447,448,],[-74,-75,-76,-261,-263,-28,-124,-27,122,122,-47,122,-28,-263,-125,-227,122,-225,122,-224,122,-223,122,122,-222,-226,-263,-223,122,122,122,-262,122,122,-223,122,122,-184,-187,-185,-181,-182,-186,-188,122,-190,-191,-183,-189,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,-12,122,122,-11,-223,-41,-44,-40,122,-42,122,122,-156,-155,-45,-157,122,-43,122,122,122,-263,-139,-175,-174,122,-172,122,122,-158,122,-171,-159,122,122,122,122,-263,122,122,-11,-170,-173,122,-162,122,-160,122,122,-161,122,122,122,-263,122,-166,-165,-163,122,122,122,-167,-164,122,-169,-168,]),'LSHIFT':([112,118,120,121,122,123,124,125,126,129,130,132,138,140,143,145,146,147,148,149,176,218,220,221,222,224,231,232,234,240,300,323,324,325,326,329,334,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,357,358,390,391,392,398,428,430,437,],[-248,-252,-214,-243,-255,-259,-256,-253,-241,-242,-216,-195,-251,-228,-257,-249,-240,243,-254,-250,-262,-260,-220,-258,-237,-236,-214,-219,-217,-218,-248,-235,-234,-233,-232,-231,-244,-201,243,-202,-200,243,243,243,-199,243,243,-197,-196,243,243,243,243,243,-198,-221,-229,-230,-215,-245,-238,-239,]),'RBRACE':([55,82,93,95,100,101,102,112,118,120,121,122,123,124,125,126,129,130,132,138,140,143,145,146,147,148,149,151,155,156,170,172,173,175,176,188,189,190,218,220,221,222,224,231,232,234,240,261,265,268,276,277,280,282,289,291,292,293,295,296,298,299,305,307,308,312,313,321,323,324,325,326,329,334,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,357,358,359,362,363,370,371,374,379,381,383,390,391,392,398,404,405,406,409,414,418,419,420,424,428,429,430,433,434,436,437,444,445,447,448,],[-261,-47,176,-92,-106,176,-109,-248,-252,-214,-243,-255,-259,-256,-253,-241,-242,-216,-195,-251,-228,-257,-249,-240,-193,-254,-250,-179,-263,-134,-263,176,176,-93,-262,176,176,-107,-260,-220,-258,-237,-236,-214,-219,-217,-218,176,-20,-19,-41,-44,-40,-42,-6,-156,-155,-45,-157,-5,-43,176,-192,-94,-95,-108,-110,-180,-235,-234,-233,-232,-231,-244,-201,-213,-202,-200,-204,-208,-203,-199,-206,-211,-197,-196,-205,-212,-207,-209,-210,-198,-135,176,-137,-175,-174,-172,-158,-171,-159,-221,-229,-230,-215,-136,-170,-173,-162,-160,176,-194,-138,-161,-245,176,-238,-166,-165,-163,-239,-167,-164,-169,-168,]),'_BOOL':([0,1,2,3,5,6,9,10,11,12,13,14,15,17,18,19,21,22,23,25,26,27,29,31,32,33,35,36,37,38,39,40,42,43,44,45,46,48,49,54,55,56,57,59,60,61,62,63,66,78,80,82,87,89,90,91,92,93,94,95,96,141,165,167,169,170,171,172,173,174,175,176,191,197,198,204,219,229,230,233,272,276,277,280,282,289,291,292,293,295,298,302,303,307,308,310,311,314,315,338,370,371,373,374,379,381,383,388,389,405,406,409,414,424,433,434,436,444,445,447,448,],[13,13,-63,-74,-73,-60,-56,-57,-35,-31,-61,13,-36,-55,-70,-65,-54,13,-58,-178,-111,-68,-71,-34,-75,-114,-66,-33,-62,-37,-64,-67,13,-69,13,-72,-76,13,-59,-86,-261,-85,13,-113,-112,-32,-102,-101,13,13,13,-47,-48,13,-115,13,13,13,13,-92,13,13,13,13,-38,13,-49,13,13,-87,-93,-262,-103,-121,-120,13,13,13,13,13,-39,-41,-44,-40,-42,13,-156,-155,-45,-157,-43,-89,-88,-94,-95,-105,-104,-116,-119,13,-175,-174,13,-172,-158,-171,-159,-118,-117,-170,-173,-162,-160,-161,-166,-165,-163,-167,-164,-169,-168,]),'LE':([112,118,120,121,122,123,124,125,126,129,130,132,138,140,143,145,146,147,148,149,176,218,220,221,222,224,231,232,234,240,300,323,324,325,326,329,334,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,357,358,390,391,392,398,428,430,437,],[-248,-252,-214,-243,-255,-259,-256,-253,-241,-242,-216,-195,-251,-228,-257,-249,-240,245,-254,-250,-262,-260,-220,-258,-237,-236,-214,-219,-217,-218,-248,-235,-234,-233,-232,-231,-244,-201,245,-202,-200,-204,245,-203,-199,-206,245,-197,-196,-205,245,245,245,245,-198,-221,-229,-230,-215,-245,-238,-239,]),'SEMI':([0,1,2,3,5,6,9,10,11,12,13,14,15,17,18,19,21,22,23,25,26,27,28,29,30,31,32,33,35,36,37,38,39,40,41,42,43,44,45,46,49,50,51,52,54,55,56,58,59,60,61,62,63,67,68,69,70,71,73,74,75,76,79,80,81,82,83,84,86,90,94,96,97,112,115,116,118,120,121,122,123,124,125,126,129,130,132,138,140,143,145,146,147,148,149,151,153,154,156,166,168,169,170,174,176,177,178,179,180,182,183,184,185,186,187,191,197,198,205,218,220,221,222,224,228,231,232,234,235,238,240,269,270,271,272,276,277,279,280,281,282,284,285,289,291,292,293,294,295,296,297,298,300,302,303,304,305,310,311,314,315,321,323,324,325,326,329,334,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,357,358,359,366,367,368,369,370,371,372,373,374,375,378,379,381,383,384,386,387,388,389,390,391,392,397,398,404,405,406,407,408,409,411,414,419,421,422,423,424,425,427,428,430,431,433,434,436,437,440,441,443,444,445,446,447,448,],[15,-263,-63,-74,-73,-60,-56,-57,-35,-31,-61,-263,-36,-55,-70,-65,-54,15,-58,-178,-111,-68,-263,-71,-263,-34,-75,-114,-66,-33,-62,-37,-64,-67,82,-263,-69,-263,-72,-76,-59,-52,-9,-10,-86,-261,-85,-51,-113,-112,-32,-102,-101,-28,-122,-124,-27,-18,-46,-145,-77,-17,-80,-81,-147,-47,-50,-53,-263,-115,-263,-263,-263,-248,-125,-123,-252,-214,-243,-255,-259,-256,-253,-241,-242,-216,-195,-251,-228,-257,-249,-240,-193,-254,-250,-179,-146,-79,-134,-145,-81,-38,-263,-87,-262,-23,-84,-24,-83,-26,307,-96,308,-25,-98,-103,-121,-120,-78,-260,-220,-258,-237,-236,-150,-214,-219,-217,-152,-176,-218,-154,-148,-82,-39,-41,-44,370,-40,371,-42,374,-14,-263,-156,-155,-45,381,-157,-13,-263,-43,-248,-89,-88,-100,-192,-105,-104,-116,-119,-180,-235,-234,-233,-232,-231,-244,-201,-213,-202,-200,-204,-208,-203,-199,-206,-211,-197,-196,-205,-212,-207,-209,-210,-198,-135,-149,-151,-153,405,-175,-174,406,-263,-172,-263,-13,-158,-171,-159,-263,-97,-99,-118,-117,-221,-229,-230,-177,-215,-136,-170,-173,421,-263,-162,-263,-160,-194,-263,432,-263,-161,-263,-263,-245,-238,438,-166,-165,-163,-239,444,-263,-263,-167,-164,-263,-169,-168,]),'LT':([112,118,120,121,122,123,124,125,126,129,130,132,138,140,143,145,146,147,148,149,176,218,220,221,222,224,231,232,234,240,300,323,324,325,326,329,334,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,357,358,390,391,392,398,428,430,437,],[-248,-252,-214,-243,-255,-259,-256,-253,-241,-242,-216,-195,-251,-228,-257,-249,-240,247,-254,-250,-262,-260,-220,-258,-237,-236,-214,-219,-217,-218,-248,-235,-234,-233,-232,-231,-244,-201,247,-202,-200,-204,247,-203,-199,-206,247,-197,-196,-205,247,247,247,247,-198,-221,-229,-230,-215,-245,-238,-239,]),'COMMA':([1,2,3,5,6,9,10,13,14,17,18,19,21,23,25,26,27,28,29,32,33,35,37,39,40,42,43,44,45,46,49,50,51,52,54,56,58,59,60,62,63,67,68,69,70,71,74,75,79,80,81,83,84,90,94,96,100,101,102,109,110,111,112,113,114,115,116,118,120,121,122,123,124,125,126,129,130,132,138,140,143,145,146,147,148,149,151,153,154,156,166,168,174,176,177,178,179,180,182,184,187,188,189,190,191,197,198,199,200,201,202,205,218,220,221,222,224,228,231,232,234,235,236,238,239,240,265,269,270,271,285,300,302,303,304,305,310,311,312,313,314,315,318,320,321,323,324,325,326,327,328,329,330,331,334,337,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,363,366,367,368,372,386,387,388,389,390,391,392,397,398,404,410,412,415,416,418,419,420,428,430,435,437,],[-263,-63,-74,-73,-60,-56,-57,-61,-263,-55,-70,-65,-54,-58,-178,-111,-68,-263,-71,-75,-114,-66,-62,-64,-67,-263,-69,-263,-72,-76,-59,-52,-9,-10,-86,-85,-51,-113,-112,-102,-101,-28,-122,-124,-27,117,-145,-77,-80,-81,-147,-50,-53,-115,-263,-263,-106,190,-109,-128,-263,203,-248,204,-132,-125,-123,-252,-214,-243,-255,-259,-256,-253,-241,-242,-216,-195,-251,-228,-257,-249,-240,-193,-254,-250,-179,-146,-79,-134,-145,-81,-87,-262,-23,-84,-24,-83,306,-96,-98,190,190,-107,-103,-121,-120,-131,-1,-2,-130,-78,-260,-220,-258,-237,-236,-150,-214,-219,-217,-152,335,-176,-263,-218,362,-154,-148,-82,335,-248,-89,-88,-100,-192,-105,-104,-108,-110,-116,-119,-133,-129,-180,-235,-234,-233,-232,335,-246,-231,393,394,-244,-144,-145,-201,-213,-202,-200,-204,-208,-203,-199,-206,-211,-197,-196,-205,-212,-207,-209,335,-210,-198,-135,-137,-149,-151,-153,335,-97,-99,-118,-117,-221,-229,-230,-177,-215,-136,335,335,335,-247,429,-194,-138,-245,-238,335,-239,]),'OFFSETOF':([3,32,46,55,65,67,69,70,72,77,82,103,104,105,115,119,127,128,134,135,137,139,141,142,144,152,155,157,162,164,170,176,181,192,194,195,196,206,207,208,209,210,211,212,213,214,215,216,217,219,226,227,230,233,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,264,266,268,274,276,277,280,281,282,288,289,291,292,293,295,297,298,309,335,336,362,365,370,371,373,374,375,376,379,380,381,383,384,385,393,395,399,400,402,403,405,406,408,409,411,414,421,423,424,425,426,427,429,432,433,434,436,438,441,443,444,445,446,447,448,],[-74,-75,-76,-261,-263,-28,-124,-27,133,133,-47,133,-28,-263,-125,-227,133,-225,133,-224,133,-223,133,133,-222,-226,-263,-223,133,133,133,-262,133,133,-223,133,133,-184,-187,-185,-181,-182,-186,-188,133,-190,-191,-183,-189,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,-12,133,133,-11,-223,-41,-44,-40,133,-42,133,133,-156,-155,-45,-157,133,-43,133,133,133,-263,-139,-175,-174,133,-172,133,133,-158,133,-171,-159,133,133,133,133,-263,133,133,-11,-170,-173,133,-162,133,-160,133,133,-161,133,133,133,-263,133,-166,-165,-163,133,133,133,-167,-164,133,-169,-168,]),'TYPEDEF':([0,1,2,3,5,6,9,10,11,12,13,14,15,17,18,19,21,22,23,25,26,27,29,31,32,33,35,36,37,38,39,40,42,43,44,45,46,48,49,54,55,56,59,60,61,62,63,66,78,80,82,87,89,90,165,167,169,170,171,174,176,191,197,198,204,272,276,277,280,282,289,291,292,293,295,298,302,303,310,311,314,315,338,370,371,373,374,379,381,383,388,389,405,406,409,414,424,433,434,436,444,445,447,448,],[23,23,-63,-74,-73,-60,-56,-57,-35,-31,-61,23,-36,-55,-70,-65,-54,23,-58,-178,-111,-68,-71,-34,-75,-114,-66,-33,-62,-37,-64,-67,23,-69,23,-72,-76,23,-59,-86,-261,-85,-113,-112,-32,-102,-101,23,23,23,-47,-48,23,-115,23,23,-38,23,-49,-87,-262,-103,-121,-120,23,-39,-41,-44,-40,-42,23,-156,-155,-45,-157,-43,-89,-88,-105,-104,-116,-119,23,-175,-174,23,-172,-158,-171,-159,-118,-117,-170,-173,-162,-160,-161,-166,-165,-163,-167,-164,-169,-168,]),'XOR':([112,118,120,121,122,123,124,125,126,129,130,132,138,140,143,145,146,147,148,149,176,218,220,221,222,224,231,232,234,240,300,323,324,325,326,329,334,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,357,358,390,391,392,398,428,430,437,],[-248,-252,-214,-243,-255,-259,-256,-253,-241,-242,-216,-195,-251,-228,-257,-249,-240,250,-254,-250,-262,-260,-220,-258,-237,-236,-214,-219,-217,-218,-248,-235,-234,-233,-232,-231,-244,-201,250,-202,-200,-204,-208,-203,-199,-206,-211,-197,-196,-205,250,-207,-209,250,-198,-221,-229,-230,-215,-245,-238,-239,]),'AUTO':([0,1,2,3,5,6,9,10,11,12,13,14,15,17,18,19,21,22,23,25,26,27,29,31,32,33,35,36,37,38,39,40,42,43,44,45,46,48,49,54,55,56,59,60,61,62,63,66,78,80,82,87,89,90,165,167,169,170,171,174,176,191,197,198,204,272,276,277,280,282,289,291,292,293,295,298,302,303,310,311,314,315,338,370,371,373,374,379,381,383,388,389,405,406,409,414,424,433,434,436,444,445,447,448,],[21,21,-63,-74,-73,-60,-56,-57,-35,-31,-61,21,-36,-55,-70,-65,-54,21,-58,-178,-111,-68,-71,-34,-75,-114,-66,-33,-62,-37,-64,-67,21,-69,21,-72,-76,21,-59,-86,-261,-85,-113,-112,-32,-102,-101,21,21,21,-47,-48,21,-115,21,21,-38,21,-49,-87,-262,-103,-121,-120,21,-39,-41,-44,-40,-42,21,-156,-155,-45,-157,-43,-89,-88,-105,-104,-116,-119,21,-175,-174,21,-172,-158,-171,-159,-118,-117,-170,-173,-162,-160,-161,-166,-165,-163,-167,-164,-169,-168,]),'TIMES':([0,1,2,3,4,5,6,9,10,11,12,13,14,15,17,18,19,21,22,23,25,27,28,29,30,31,32,35,36,37,38,39,40,42,43,44,45,46,49,50,51,52,54,55,56,58,61,62,63,65,67,68,69,70,72,77,78,82,83,84,86,94,96,97,103,104,105,110,112,115,117,118,119,120,121,122,123,124,125,126,127,128,129,130,132,134,135,137,138,139,140,141,142,143,144,145,146,147,148,149,152,155,157,162,164,167,169,170,174,176,177,178,179,180,181,191,192,194,195,196,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,224,226,227,230,231,232,233,234,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,264,266,268,272,274,276,277,280,281,282,288,289,291,292,293,295,297,298,300,302,303,306,309,310,311,323,324,325,326,329,334,335,336,338,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,357,358,362,365,370,371,373,374,375,376,379,380,381,383,384,385,390,391,392,393,395,398,399,400,402,403,405,406,408,409,411,414,421,423,424,425,426,427,428,429,430,432,433,434,436,437,438,441,443,444,445,446,447,448,],[28,-263,-63,-74,28,-73,-60,-56,-57,-35,-31,-61,-263,-36,-55,-70,-65,-54,28,-58,-178,-68,-263,-71,28,-34,-75,-66,-33,-62,-37,-64,-67,-263,-69,-263,-72,-76,-59,-52,-9,-10,-86,-261,-85,-51,-32,-102,-101,-263,-28,28,-124,-27,139,157,28,-47,-50,-53,28,-263,-263,28,194,-28,-263,28,-248,-125,28,-252,-227,-214,-243,-255,-259,-256,-253,-241,157,-225,-242,-216,-195,157,-224,157,-251,-223,-228,157,157,-257,-222,-249,-240,252,-254,-250,-226,-263,-223,157,274,28,-38,157,-87,-262,-23,-84,-24,-83,157,-103,157,-223,157,157,-184,-187,-185,-181,-182,-186,-188,157,-190,-191,-183,-189,-260,157,-220,-258,-237,-236,157,157,157,-214,-219,157,-217,28,-218,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,-12,157,157,-11,-39,-223,-41,-44,-40,157,-42,157,157,-156,-155,-45,-157,157,-43,-248,-89,-88,28,157,-105,-104,-235,-234,-233,-232,-231,-244,157,157,28,252,252,252,252,252,252,252,252,252,252,-197,-196,252,252,252,252,252,-198,-263,-139,-175,-174,157,-172,157,157,-158,157,-171,-159,157,157,-221,-229,-230,157,157,-215,-263,157,157,-11,-170,-173,157,-162,157,-160,157,157,-161,157,157,157,-245,-263,-238,157,-166,-165,-163,-239,157,157,157,-167,-164,157,-169,-168,]),'LPAREN':([0,1,2,3,4,5,6,9,10,11,12,13,14,15,16,17,18,19,21,22,23,25,26,27,28,29,30,31,32,33,35,36,37,38,39,40,42,43,44,45,46,49,50,51,52,54,55,56,58,60,61,62,63,65,67,68,69,70,72,74,77,78,81,82,83,84,86,90,94,96,97,103,104,105,110,112,115,116,117,118,119,121,122,123,124,125,126,127,128,129,130,133,134,135,137,138,139,140,141,142,143,144,145,146,148,149,152,153,155,157,162,164,166,167,169,170,174,176,177,178,179,180,181,191,192,194,195,196,197,198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,221,222,224,226,227,228,230,233,235,239,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,264,266,268,269,270,272,274,276,277,280,281,282,283,287,288,289,290,291,292,293,295,297,298,300,301,302,303,306,309,310,311,314,315,323,324,325,326,329,334,335,336,338,339,362,365,366,367,368,370,371,373,374,375,376,379,380,381,383,384,385,388,389,391,392,393,395,399,400,402,403,405,406,408,409,411,413,414,421,423,424,425,426,427,428,429,430,432,433,434,436,437,438,441,443,444,445,446,447,448,],[4,-263,-63,-74,4,-73,-60,-56,-57,-35,-31,-61,-263,-36,4,-55,-70,-65,-54,4,-58,-178,66,-68,-263,-71,78,-34,-75,-114,-66,-33,-62,-37,-64,-67,-263,-69,-263,-72,-76,-59,-52,-9,-10,-86,-261,-85,-51,66,-32,-102,-101,-263,-28,-122,-124,-27,141,78,141,78,165,-47,-50,-53,167,-115,-263,-263,167,141,-28,-263,78,-248,-125,-123,4,-252,-227,-243,-255,-259,-256,-253,-241,219,-225,-242,227,229,230,-224,233,-251,-223,-228,141,233,-257,-222,-249,-240,-254,-250,-226,165,-263,-223,141,141,167,167,-38,141,-87,-262,-23,-84,-24,-83,230,-103,230,-223,141,141,-121,-120,-184,-187,-185,-181,-182,-186,-188,141,-190,-191,-183,-189,-260,141,-258,-237,-236,141,141,-150,141,141,-152,338,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,141,230,230,-12,230,141,-11,-154,-148,-39,-223,-41,-44,-40,141,-42,373,376,230,141,380,-156,-155,-45,-157,141,-43,-248,385,-89,-88,4,230,-105,-104,-116,-119,-235,-234,-233,-232,-231,-244,141,230,338,338,-263,-139,-149,-151,-153,-175,-174,141,-172,141,141,-158,141,-171,-159,141,141,-118,-117,-229,-230,141,230,-263,230,141,-11,-170,-173,141,-162,141,426,-160,141,141,-161,141,141,141,-245,-263,-238,141,-166,-165,-163,-239,141,141,141,-167,-164,141,-169,-168,]),'MINUSMINUS':([3,32,46,55,65,67,69,70,72,77,82,103,104,105,112,115,118,119,121,122,123,124,125,126,127,128,129,130,134,135,137,138,139,140,141,142,143,144,145,146,148,149,152,155,157,162,164,170,176,181,192,194,195,196,206,207,208,209,210,211,212,213,214,215,216,217,218,219,221,222,224,226,227,230,233,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,264,266,268,274,276,277,280,281,282,288,289,291,292,293,295,297,298,300,309,323,324,325,326,329,334,335,336,362,365,370,371,373,374,375,376,379,380,381,383,384,385,391,392,393,395,399,400,402,403,405,406,408,409,411,414,421,423,424,425,426,427,428,429,430,432,433,434,436,437,438,441,443,444,445,446,447,448,],[-74,-75,-76,-261,-263,-28,-124,-27,142,142,-47,142,-28,-263,-248,-125,-252,-227,-243,-255,-259,-256,-253,-241,142,-225,-242,222,142,-224,142,-251,-223,-228,142,142,-257,-222,-249,-240,-254,-250,-226,-263,-223,142,142,142,-262,142,142,-223,142,142,-184,-187,-185,-181,-182,-186,-188,142,-190,-191,-183,-189,-260,142,-258,-237,-236,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,-12,142,142,-11,-223,-41,-44,-40,142,-42,142,142,-156,-155,-45,-157,142,-43,-248,142,-235,-234,-233,-232,-231,-244,142,142,-263,-139,-175,-174,142,-172,142,142,-158,142,-171,-159,142,142,-229,-230,142,142,-263,142,142,-11,-170,-173,142,-162,142,-160,142,142,-161,142,142,142,-245,-263,-238,142,-166,-165,-163,-239,142,142,142,-167,-164,142,-169,-168,]),'ID':([0,1,2,3,4,5,6,7,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,27,28,29,30,31,32,34,35,36,37,38,39,40,42,43,44,45,46,49,50,51,52,54,55,56,58,61,62,63,64,65,66,67,68,69,70,72,74,77,78,82,83,84,86,94,96,97,98,99,103,104,105,110,115,116,117,119,127,128,134,135,137,139,141,142,144,152,155,157,162,164,166,167,169,170,174,176,177,178,179,180,181,190,191,192,194,195,196,203,206,207,208,209,210,211,212,213,214,215,216,217,219,223,225,226,227,230,233,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,263,264,266,268,272,274,276,277,278,280,281,282,288,289,291,292,293,295,297,298,302,303,306,309,310,311,335,336,362,365,370,371,373,374,375,376,379,380,381,383,384,385,393,394,395,399,400,402,403,405,406,408,409,411,414,421,423,424,425,426,427,429,432,433,434,436,438,441,443,444,445,446,447,448,],[33,-263,-63,-74,33,-73,-60,56,-56,-57,-35,-31,-61,-263,-36,33,-55,-70,-65,-91,-54,33,-58,63,-178,-68,-263,-71,33,-34,-75,-90,-66,-33,-62,-37,-64,-67,-263,-69,-263,-72,-76,-59,-52,-9,-10,-86,-261,-85,-51,-32,-102,-101,102,-263,112,-28,-122,-124,-27,112,33,112,33,-47,-50,-53,33,-263,-263,33,102,102,112,-28,-263,33,-125,-123,33,-227,112,-225,112,-224,112,-223,112,112,-222,-226,-263,-223,112,112,33,33,-38,300,-87,-262,-23,-84,-24,-83,112,102,-103,112,-223,112,112,112,-184,-187,-185,-181,-182,-186,-188,112,-190,-191,-183,-189,112,324,326,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,-12,112,112,112,-11,-39,-223,-41,-44,369,-40,112,-42,112,300,-156,-155,-45,-157,300,-43,-89,-88,33,112,-105,-104,112,112,-263,-139,-175,-174,112,-172,300,112,-158,112,-171,-159,300,112,112,112,112,-263,112,112,-11,-170,-173,112,-162,300,-160,112,300,-161,300,112,300,-263,112,-166,-165,-163,112,300,300,-167,-164,300,-169,-168,]),'IF':([55,82,170,176,276,277,280,282,289,291,292,293,295,297,298,370,371,374,375,379,381,383,384,405,406,409,411,414,423,424,425,427,433,434,436,441,443,444,445,446,447,448,],[-261,-47,301,-262,-41,-44,-40,-42,301,-156,-155,-45,-157,301,-43,-175,-174,-172,301,-158,-171,-159,301,-170,-173,-162,301,-160,301,-161,301,301,-166,-165,-163,301,301,-167,-164,301,-169,-168,]),'STRING_LITERAL':([3,32,46,55,65,67,69,70,72,77,82,103,104,105,115,119,127,128,129,134,135,137,139,141,142,143,144,152,155,157,162,164,170,176,181,192,194,195,196,206,207,208,209,210,211,212,213,214,215,216,217,219,221,226,227,230,233,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,264,266,268,274,276,277,280,281,282,288,289,291,292,293,295,297,298,309,335,336,362,365,370,371,373,374,375,376,379,380,381,383,384,385,393,395,399,400,402,403,405,406,408,409,411,414,421,423,424,425,426,427,429,432,433,434,436,438,441,443,444,445,446,447,448,],[-74,-75,-76,-261,-263,-28,-124,-27,143,143,-47,143,-28,-263,-125,-227,143,-225,221,143,-224,143,-223,143,143,-257,-222,-226,-263,-223,143,143,143,-262,143,143,-223,143,143,-184,-187,-185,-181,-182,-186,-188,143,-190,-191,-183,-189,143,-258,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,-12,143,143,-11,-223,-41,-44,-40,143,-42,143,143,-156,-155,-45,-157,143,-43,143,143,143,-263,-139,-175,-174,143,-172,143,143,-158,143,-171,-159,143,143,143,143,-263,143,143,-11,-170,-173,143,-162,143,-160,143,143,-161,143,143,143,-263,143,-166,-165,-163,143,143,143,-167,-164,143,-169,-168,]),'FLOAT':([0,1,2,3,5,6,9,10,11,12,13,14,15,17,18,19,21,22,23,25,26,27,29,31,32,33,35,36,37,38,39,40,42,43,44,45,46,48,49,54,55,56,57,59,60,61,62,63,66,78,80,82,87,89,90,91,92,93,94,95,96,141,165,167,169,170,171,172,173,174,175,176,191,197,198,204,219,229,230,233,272,276,277,280,282,289,291,292,293,295,298,302,303,307,308,310,311,314,315,338,370,371,373,374,379,381,383,388,389,405,406,409,414,424,433,434,436,444,445,447,448,],[35,35,-63,-74,-73,-60,-56,-57,-35,-31,-61,35,-36,-55,-70,-65,-54,35,-58,-178,-111,-68,-71,-34,-75,-114,-66,-33,-62,-37,-64,-67,35,-69,35,-72,-76,35,-59,-86,-261,-85,35,-113,-112,-32,-102,-101,35,35,35,-47,-48,35,-115,35,35,35,35,-92,35,35,35,35,-38,35,-49,35,35,-87,-93,-262,-103,-121,-120,35,35,35,35,35,-39,-41,-44,-40,-42,35,-156,-155,-45,-157,-43,-89,-88,-94,-95,-105,-104,-116,-119,35,-175,-174,35,-172,-158,-171,-159,-118,-117,-170,-173,-162,-160,-161,-166,-165,-163,-167,-164,-169,-168,]),'XOREQUAL':([112,118,120,121,122,123,124,125,126,129,130,138,140,143,145,146,148,149,176,218,220,221,222,224,231,232,234,240,300,323,324,325,326,329,334,390,391,392,398,428,430,437,],[-248,-252,210,-243,-255,-259,-256,-253,-241,-242,-216,-251,-228,-257,-249,-240,-254,-250,-262,-260,-220,-258,-237,-236,-214,-219,-217,-218,-248,-235,-234,-233,-232,-231,-244,-221,-229,-230,-215,-245,-238,-239,]),'LSHIFTEQUAL':([112,118,120,121,122,123,124,125,126,129,130,138,140,143,145,146,148,149,176,218,220,221,222,224,231,232,234,240,300,323,324,325,326,329,334,390,391,392,398,428,430,437,],[-248,-252,212,-243,-255,-259,-256,-253,-241,-242,-216,-251,-228,-257,-249,-240,-254,-250,-262,-260,-220,-258,-237,-236,-214,-219,-217,-218,-248,-235,-234,-233,-232,-231,-244,-221,-229,-230,-215,-245,-238,-239,]),'RBRACKET':([3,32,46,65,69,70,72,103,104,112,115,118,120,121,122,123,124,125,126,129,130,131,132,136,138,139,140,143,145,146,147,148,149,150,151,164,176,193,194,218,220,221,222,224,231,232,234,238,240,273,274,305,316,317,321,323,324,325,326,327,329,334,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,357,358,361,390,391,392,397,398,419,428,430,437,],[-74,-75,-76,-263,-124,-27,-263,-263,-28,-248,-125,-252,-214,-243,-255,-259,-256,-253,-241,-242,-216,228,-195,-4,-251,235,-228,-257,-249,-240,-193,-254,-250,-3,-179,-263,-262,314,315,-260,-220,-258,-237,-236,-214,-219,-217,-176,-218,366,367,-192,388,389,-180,-235,-234,-233,-232,391,-231,-244,-201,-213,-202,-200,-204,-208,-203,-199,-206,-211,-197,-196,-205,-212,-207,-209,-210,-198,401,-221,-229,-230,-177,-215,-194,-245,-238,-239,]),} +_lr_action_items = {'$end':([0,1,2,3,4,5,6,7,8,9,13,14,55,77,78,105,144,211,265,],[-310,0,-58,-59,-60,-62,-63,-64,-65,-66,-67,-68,-61,-83,-69,-70,-309,-71,-202,]),'SEMI':([0,2,4,5,6,7,8,9,11,12,13,14,15,17,18,19,20,21,22,23,25,27,28,29,30,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,55,60,61,62,63,64,65,66,67,69,70,72,73,74,75,76,77,78,81,82,83,84,85,86,87,88,89,90,91,92,98,99,101,102,103,104,105,106,108,110,127,131,139,140,141,142,143,144,145,146,147,148,151,152,153,154,155,156,157,158,159,160,161,162,163,166,169,172,175,176,177,178,179,180,181,182,186,192,195,196,197,198,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,228,229,243,244,247,250,251,252,253,254,255,256,257,258,259,260,261,262,264,265,266,267,268,270,271,273,274,283,284,285,286,287,288,289,290,326,327,328,330,331,332,334,335,350,351,352,353,372,373,376,377,378,381,382,383,385,388,392,396,397,398,399,400,401,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,423,425,426,427,428,432,439,440,443,444,457,458,459,461,463,464,465,467,468,470,471,474,476,480,481,492,493,495,496,498,500,509,510,512,515,520,521,522,524,527,528,530,],[9,9,-60,-62,-63,-64,-65,-66,-310,77,-67,-68,-52,-310,-310,-310,-116,-93,-310,-29,-97,-113,-114,-115,-221,-101,-102,-103,-104,-105,-106,-107,-108,-109,-110,-111,-112,-117,-118,-119,-95,-96,-98,-99,-100,-61,-310,-310,-162,-89,-90,-91,-92,-81,-19,-20,-120,-122,-163,-54,-37,-83,-69,-53,-86,-9,-10,-87,-88,-94,-82,-15,-16,-124,-126,-152,-153,-308,-132,-133,146,-70,-310,-162,-55,-294,-30,146,146,146,-135,-142,-309,-310,-145,-146,-130,-13,-310,-200,-198,-199,-72,-73,-74,-75,-76,-77,-78,-294,274,-14,-310,287,288,290,-219,-222,-257,-236,-259,-238,-271,-283,-284,-285,-286,-295,-296,-297,-298,-299,-300,-301,-302,-303,-304,-306,-71,-121,-38,-123,-177,-35,-36,-125,-127,-154,146,-137,146,-139,-134,-143,378,-128,-129,-25,-26,-147,-149,-131,-202,-201,-13,-310,-235,-257,-310,-218,-78,-80,-310,399,-214,-215,400,-217,-279,-280,-260,-261,-262,-263,-305,-307,-43,-44,-31,-34,-155,-156,-136,-138,-144,-151,-203,-310,-205,-287,-220,-79,467,-310,-213,-216,-223,-239,-240,-241,-242,-243,-244,-245,-246,-247,-248,-249,-250,-251,-252,-253,-254,-255,-256,-274,-275,-276,-277,-278,-178,-39,-42,-32,-33,-148,-150,-204,-310,-258,-310,-310,-310,499,-272,-273,-264,-179,-40,-41,-206,-80,-208,-209,513,-237,-310,-281,522,-288,-207,-282,-210,-310,-310,-212,-211,]),'PPHASH':([0,2,4,5,6,7,8,9,13,14,55,77,78,105,144,211,265,],[13,13,-60,-62,-63,-64,-65,-66,-67,-68,-61,-83,-69,-70,-309,-71,-202,]),'PPPRAGMA':([0,2,4,5,6,7,8,9,13,14,55,77,78,101,104,105,106,139,140,141,143,144,146,147,152,153,154,155,156,157,158,159,160,161,162,172,211,250,252,255,265,266,268,273,274,283,284,287,288,290,378,382,383,385,396,399,400,459,461,464,465,492,493,495,496,509,520,522,524,527,528,530,],[14,14,-60,-62,-63,-64,-65,-66,-67,-68,-61,-83,-69,-308,14,-70,14,14,14,14,-142,-309,-145,-146,14,-200,-198,-199,-72,-73,-74,-75,-76,-77,-78,14,-71,14,14,-143,-202,-201,14,14,-218,14,-80,-214,-215,-217,-144,-203,14,-205,-79,-213,-216,-204,14,14,14,-206,-80,-208,-209,14,-207,-210,14,14,-212,-211,]),'ID':([0,2,4,5,6,7,8,9,11,13,14,16,17,18,19,20,21,22,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,60,61,63,64,65,66,68,71,77,78,79,80,82,83,84,85,86,87,94,95,96,97,98,99,100,101,102,103,105,106,111,113,114,115,116,117,118,126,129,130,132,133,134,135,142,144,145,148,152,153,154,155,156,157,158,159,160,161,162,164,168,172,174,177,183,184,185,187,188,189,190,191,193,194,211,216,217,218,219,223,226,227,231,235,239,240,247,248,249,251,253,254,257,258,263,264,265,266,268,272,273,274,275,279,280,281,283,284,285,287,288,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,329,333,339,340,341,344,345,347,348,349,361,362,365,368,370,372,373,376,377,379,380,382,383,385,387,396,398,399,400,433,435,445,446,447,455,459,460,461,462,464,465,466,467,469,472,475,477,478,483,484,485,492,493,495,496,499,509,511,513,516,517,520,522,524,527,528,530,],[23,23,-60,-62,-63,-64,-65,-66,23,-67,-68,23,-310,-310,-310,-116,-93,23,23,-97,-310,-113,-114,-115,-221,98,102,-101,-102,-103,-104,-105,-106,-107,-108,-109,-110,-111,-112,-117,-118,-119,-95,-96,-98,-99,-100,-140,-141,-61,23,23,-89,-90,-91,-92,23,23,-83,-69,-310,127,-86,-9,-10,-87,-88,-94,-164,-27,-28,-166,-152,-153,138,-308,-132,-133,-70,163,23,127,-310,127,127,-310,-28,23,23,127,-165,-167,138,138,-135,-309,23,-130,163,-200,-198,-199,-72,-73,-74,-75,-76,-77,-78,127,127,163,286,127,127,127,127,127,-266,-267,-268,-265,-269,-270,-71,-310,127,-310,-28,-266,127,127,127,23,23,-310,-154,138,127,-137,-139,-134,-128,-129,127,-131,-202,-201,163,127,163,-218,127,127,127,127,163,-80,127,-214,-215,-217,127,-224,-225,-226,-227,-228,-229,-230,-231,-232,-233,-234,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,425,427,127,127,-11,127,-12,127,127,-266,127,127,-310,127,23,127,127,-155,-156,-136,-138,23,127,-203,163,-205,127,-79,127,-213,-216,-310,-182,127,-310,-28,-266,-204,127,163,-310,163,163,127,127,127,127,127,127,-11,-266,127,127,-206,-80,-208,-209,127,163,-310,127,127,127,-207,-210,163,163,-212,-211,]),'LPAREN':([0,2,4,5,6,7,8,9,11,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,55,60,61,63,64,65,66,68,71,75,76,77,78,79,81,82,83,84,85,86,87,94,95,96,97,98,99,101,102,103,105,106,110,111,113,114,116,117,118,126,127,129,130,131,132,133,142,144,145,148,152,153,154,155,156,157,158,159,160,161,162,163,164,167,168,170,171,172,173,177,182,183,184,185,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,213,216,217,218,219,223,226,227,228,229,235,236,239,240,241,242,247,249,251,253,254,257,258,263,264,265,266,268,272,273,274,275,278,279,280,281,283,284,285,287,288,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,326,327,329,333,334,335,339,340,341,344,347,348,349,350,351,352,353,359,360,361,365,368,370,372,373,376,377,379,380,382,383,385,387,388,390,391,395,396,398,399,400,423,425,426,427,428,433,435,439,440,443,444,445,446,447,450,451,453,455,459,460,461,462,464,465,466,467,469,470,471,472,477,478,480,481,483,484,485,486,487,488,489,490,491,492,493,495,496,499,505,506,509,510,511,513,515,517,518,519,520,521,522,524,527,528,530,],[24,24,-60,-62,-63,-64,-65,-66,71,-67,-68,80,24,-310,-310,-310,-116,-93,24,-29,24,-97,-310,-113,-114,-115,-221,-101,-102,-103,-104,-105,-106,-107,-108,-109,-110,-111,-112,-117,-118,-119,-95,-96,-98,-99,-100,-61,71,24,-89,-90,-91,-92,71,71,115,-37,-83,-69,-310,80,-86,-9,-10,-87,-88,-94,-164,-27,-28,-166,-152,-153,-308,-132,-133,-70,168,115,71,168,-310,168,-310,-28,239,-294,71,168,-30,-165,-167,-135,-309,71,-130,168,-200,-198,-199,-72,-73,-74,-75,-76,-77,-78,-294,272,275,168,280,281,168,285,168,323,329,329,272,333,-266,-267,-268,-265,-271,-269,-270,-283,-284,-285,-286,336,-295,-296,-297,-298,-299,-300,-301,-302,-303,-304,-306,-71,-38,-310,168,-310,-28,-266,168,168,-35,-36,239,362,239,-310,-45,371,-154,272,-137,-139,-134,-128,-129,272,-131,-202,-201,168,168,168,-218,168,391,168,168,168,168,-80,168,-214,-215,-217,168,-224,-225,-226,-227,-228,-229,-230,-231,-232,-233,-234,168,272,272,272,272,272,272,272,272,272,272,272,272,272,272,272,272,272,272,168,168,-279,-280,168,168,-305,-307,-11,168,-12,272,-266,168,168,-43,-44,-31,-34,362,371,-310,239,168,168,-155,-156,-136,-138,71,272,-203,168,-205,272,-287,391,391,466,-79,168,-213,-216,-274,-275,-276,-277,-278,-310,-182,-39,-42,-32,-33,168,-310,-28,-191,-197,-195,-266,-204,272,168,-310,168,168,168,168,272,-272,-273,168,168,-11,-40,-41,-266,168,168,-50,-51,-193,-192,-194,-196,-206,-80,-208,-209,168,-46,-49,168,-281,-310,168,-288,168,-47,-48,-207,-282,-210,168,168,-212,-211,]),'TIMES':([0,2,4,5,6,7,8,9,11,13,14,17,18,19,20,21,22,24,25,26,27,28,29,30,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,55,60,61,63,64,65,66,71,77,78,79,82,83,84,85,86,87,94,95,96,97,98,99,101,102,103,105,106,111,113,114,116,117,118,126,127,129,130,133,142,144,145,148,152,153,154,155,156,157,158,159,160,161,162,163,164,168,172,177,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,200,201,202,203,204,205,206,207,208,209,210,211,216,217,218,219,223,226,227,239,240,247,249,251,253,254,257,258,263,264,265,266,268,271,272,273,274,275,278,279,280,281,283,284,285,287,288,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,326,327,328,329,330,331,332,333,334,335,339,340,341,344,347,348,349,361,368,370,372,373,376,377,379,380,382,383,385,387,388,391,396,398,399,400,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,423,425,426,427,428,433,435,445,446,447,455,459,460,461,462,463,464,465,466,467,469,470,471,472,474,477,478,483,484,485,492,493,495,496,499,509,510,511,513,515,517,520,521,522,524,527,528,530,],[26,26,-60,-62,-63,-64,-65,-66,26,-67,-68,-310,-310,-310,-116,-93,26,26,-97,-310,-113,-114,-115,-221,-101,-102,-103,-104,-105,-106,-107,-108,-109,-110,-111,-112,-117,-118,-119,-95,-96,-98,-99,-100,-61,26,26,-89,-90,-91,-92,26,-83,-69,-310,-86,-9,-10,-87,-88,-94,26,-27,-28,-166,-152,-153,-308,-132,-133,-70,188,26,188,-310,223,-310,-28,26,-294,26,188,-167,-135,-309,26,-130,188,-200,-198,-199,-72,-73,-74,-75,-76,-77,-78,-294,188,188,188,188,-257,304,-259,188,188,188,-238,188,-266,-267,-268,-265,-271,-269,-270,-283,-284,-285,-286,-295,-296,-297,-298,-299,-300,-301,-302,-303,-304,-306,-71,-310,347,-310,-28,-266,188,188,26,369,-154,188,-137,-139,-134,-128,-129,188,-131,-202,-201,188,-257,188,188,-218,188,26,188,188,188,188,-80,188,-214,-215,-217,188,-224,-225,-226,-227,-228,-229,-230,-231,-232,-233,-234,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,-279,-280,-260,188,-261,-262,-263,188,-305,-307,-11,188,-12,188,-266,188,188,-310,188,455,-155,-156,-136,-138,26,188,-203,188,-205,188,-287,26,-79,188,-213,-216,-239,-240,-241,304,304,304,304,304,304,304,304,304,304,304,304,304,304,304,-274,-275,-276,-277,-278,-310,-182,483,-310,-28,-266,-204,188,188,-310,-258,188,188,188,188,188,-272,-273,188,-264,188,-11,-266,188,188,-206,-80,-208,-209,188,188,-281,-310,188,-288,188,-207,-282,-210,188,188,-212,-211,]),'TYPEID':([0,2,4,5,6,7,8,9,10,11,13,14,15,17,18,19,20,21,22,23,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,58,59,60,61,62,63,64,65,66,68,71,77,78,80,81,82,83,84,85,86,87,94,95,96,97,98,99,101,102,103,104,105,106,107,111,115,126,128,129,131,132,133,139,140,141,142,143,144,145,146,147,148,149,152,153,154,155,156,157,158,159,160,161,162,168,211,228,229,230,235,239,247,250,251,252,253,254,255,257,258,264,265,266,272,274,283,284,285,287,288,290,324,325,329,333,336,352,353,362,371,372,373,376,377,378,379,382,385,391,396,399,400,443,444,459,492,493,495,496,520,522,528,530,],[30,30,-60,-62,-63,-64,-65,-66,30,76,-67,-68,-52,-310,-310,-310,-116,-93,30,-29,-97,-310,-113,-114,-115,-221,99,103,-101,-102,-103,-104,-105,-106,-107,-108,-109,-110,-111,-112,-117,-118,-119,-95,-96,-98,-99,-100,-140,-141,-61,30,-84,76,30,30,-89,-90,-91,-92,76,76,-83,-69,30,-53,-86,-9,-10,-87,-88,-94,-164,-27,-28,-166,-152,-153,-308,-132,-133,30,-70,30,-85,76,30,241,30,76,-30,-165,-167,30,30,30,-135,-142,-309,76,-145,-146,-130,30,30,-200,-198,-199,-72,-73,-74,-75,-76,-77,-78,30,-71,-35,-36,30,241,30,-154,30,-137,30,-139,-134,-143,-128,-129,-131,-202,-201,30,-218,-78,-80,30,-214,-215,-217,426,428,30,30,30,-31,-34,30,30,-155,-156,-136,-138,-144,76,-203,-205,30,-79,-213,-216,-32,-33,-204,-206,-80,-208,-209,-207,-210,-212,-211,]),'ENUM':([0,2,4,5,6,7,8,9,10,13,14,15,17,18,19,22,23,25,45,46,47,48,49,50,51,52,55,58,59,61,62,77,78,80,81,82,83,84,85,86,97,101,104,105,106,107,115,128,131,133,139,140,141,143,144,146,147,149,152,153,154,155,156,157,158,159,160,161,162,168,211,228,229,230,239,250,252,255,265,266,272,274,283,284,285,287,288,290,329,333,336,352,353,362,371,378,382,385,391,396,399,400,443,444,459,492,493,495,496,520,522,528,530,],[31,31,-60,-62,-63,-64,-65,-66,31,-67,-68,-52,-310,-310,-310,31,-29,-97,-117,-118,-119,-95,-96,-98,-99,-100,-61,31,-84,31,31,-83,-69,31,-53,-86,-9,-10,-87,-88,-166,-308,31,-70,31,-85,31,31,-30,-167,31,31,31,-142,-309,-145,-146,31,31,-200,-198,-199,-72,-73,-74,-75,-76,-77,-78,31,-71,-35,-36,31,31,31,31,-143,-202,-201,31,-218,-78,-80,31,-214,-215,-217,31,31,31,-31,-34,31,31,-144,-203,-205,31,-79,-213,-216,-32,-33,-204,-206,-80,-208,-209,-207,-210,-212,-211,]),'VOID':([0,2,4,5,6,7,8,9,10,11,13,14,15,17,18,19,20,21,22,23,25,27,28,29,30,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,55,58,59,60,61,62,63,64,65,66,77,78,80,81,82,83,84,85,86,87,97,98,99,101,102,103,104,105,106,107,115,126,128,131,133,139,140,141,142,143,144,145,146,147,148,149,152,153,154,155,156,157,158,159,160,161,162,168,211,228,229,230,239,247,250,251,252,253,254,255,257,258,264,265,266,272,274,278,283,284,285,287,288,290,329,333,336,352,353,362,371,372,373,376,377,378,382,385,391,396,399,400,443,444,459,492,493,495,496,520,522,528,530,],[33,33,-60,-62,-63,-64,-65,-66,33,33,-67,-68,-52,-310,-310,-310,-116,-93,33,-29,-97,-113,-114,-115,-221,-101,-102,-103,-104,-105,-106,-107,-108,-109,-110,-111,-112,-117,-118,-119,-95,-96,-98,-99,-100,-61,33,-84,33,33,33,-89,-90,-91,-92,-83,-69,33,-53,-86,-9,-10,-87,-88,-94,-166,-152,-153,-308,-132,-133,33,-70,33,-85,33,33,33,-30,-167,33,33,33,-135,-142,-309,33,-145,-146,-130,33,33,-200,-198,-199,-72,-73,-74,-75,-76,-77,-78,33,-71,-35,-36,33,33,-154,33,-137,33,-139,-134,-143,-128,-129,-131,-202,-201,33,-218,33,-78,-80,33,-214,-215,-217,33,33,33,-31,-34,33,33,-155,-156,-136,-138,-144,-203,-205,33,-79,-213,-216,-32,-33,-204,-206,-80,-208,-209,-207,-210,-212,-211,]),'_BOOL':([0,2,4,5,6,7,8,9,10,11,13,14,15,17,18,19,20,21,22,23,25,27,28,29,30,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,55,58,59,60,61,62,63,64,65,66,77,78,80,81,82,83,84,85,86,87,97,98,99,101,102,103,104,105,106,107,115,126,128,131,133,139,140,141,142,143,144,145,146,147,148,149,152,153,154,155,156,157,158,159,160,161,162,168,211,228,229,230,239,247,250,251,252,253,254,255,257,258,264,265,266,272,274,278,283,284,285,287,288,290,329,333,336,352,353,362,371,372,373,376,377,378,382,385,391,396,399,400,443,444,459,492,493,495,496,520,522,528,530,],[34,34,-60,-62,-63,-64,-65,-66,34,34,-67,-68,-52,-310,-310,-310,-116,-93,34,-29,-97,-113,-114,-115,-221,-101,-102,-103,-104,-105,-106,-107,-108,-109,-110,-111,-112,-117,-118,-119,-95,-96,-98,-99,-100,-61,34,-84,34,34,34,-89,-90,-91,-92,-83,-69,34,-53,-86,-9,-10,-87,-88,-94,-166,-152,-153,-308,-132,-133,34,-70,34,-85,34,34,34,-30,-167,34,34,34,-135,-142,-309,34,-145,-146,-130,34,34,-200,-198,-199,-72,-73,-74,-75,-76,-77,-78,34,-71,-35,-36,34,34,-154,34,-137,34,-139,-134,-143,-128,-129,-131,-202,-201,34,-218,34,-78,-80,34,-214,-215,-217,34,34,34,-31,-34,34,34,-155,-156,-136,-138,-144,-203,-205,34,-79,-213,-216,-32,-33,-204,-206,-80,-208,-209,-207,-210,-212,-211,]),'CHAR':([0,2,4,5,6,7,8,9,10,11,13,14,15,17,18,19,20,21,22,23,25,27,28,29,30,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,55,58,59,60,61,62,63,64,65,66,77,78,80,81,82,83,84,85,86,87,97,98,99,101,102,103,104,105,106,107,115,126,128,131,133,139,140,141,142,143,144,145,146,147,148,149,152,153,154,155,156,157,158,159,160,161,162,168,211,228,229,230,239,247,250,251,252,253,254,255,257,258,264,265,266,272,274,278,283,284,285,287,288,290,329,333,336,352,353,362,371,372,373,376,377,378,382,385,391,396,399,400,443,444,459,492,493,495,496,520,522,528,530,],[35,35,-60,-62,-63,-64,-65,-66,35,35,-67,-68,-52,-310,-310,-310,-116,-93,35,-29,-97,-113,-114,-115,-221,-101,-102,-103,-104,-105,-106,-107,-108,-109,-110,-111,-112,-117,-118,-119,-95,-96,-98,-99,-100,-61,35,-84,35,35,35,-89,-90,-91,-92,-83,-69,35,-53,-86,-9,-10,-87,-88,-94,-166,-152,-153,-308,-132,-133,35,-70,35,-85,35,35,35,-30,-167,35,35,35,-135,-142,-309,35,-145,-146,-130,35,35,-200,-198,-199,-72,-73,-74,-75,-76,-77,-78,35,-71,-35,-36,35,35,-154,35,-137,35,-139,-134,-143,-128,-129,-131,-202,-201,35,-218,35,-78,-80,35,-214,-215,-217,35,35,35,-31,-34,35,35,-155,-156,-136,-138,-144,-203,-205,35,-79,-213,-216,-32,-33,-204,-206,-80,-208,-209,-207,-210,-212,-211,]),'SHORT':([0,2,4,5,6,7,8,9,10,11,13,14,15,17,18,19,20,21,22,23,25,27,28,29,30,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,55,58,59,60,61,62,63,64,65,66,77,78,80,81,82,83,84,85,86,87,97,98,99,101,102,103,104,105,106,107,115,126,128,131,133,139,140,141,142,143,144,145,146,147,148,149,152,153,154,155,156,157,158,159,160,161,162,168,211,228,229,230,239,247,250,251,252,253,254,255,257,258,264,265,266,272,274,278,283,284,285,287,288,290,329,333,336,352,353,362,371,372,373,376,377,378,382,385,391,396,399,400,443,444,459,492,493,495,496,520,522,528,530,],[36,36,-60,-62,-63,-64,-65,-66,36,36,-67,-68,-52,-310,-310,-310,-116,-93,36,-29,-97,-113,-114,-115,-221,-101,-102,-103,-104,-105,-106,-107,-108,-109,-110,-111,-112,-117,-118,-119,-95,-96,-98,-99,-100,-61,36,-84,36,36,36,-89,-90,-91,-92,-83,-69,36,-53,-86,-9,-10,-87,-88,-94,-166,-152,-153,-308,-132,-133,36,-70,36,-85,36,36,36,-30,-167,36,36,36,-135,-142,-309,36,-145,-146,-130,36,36,-200,-198,-199,-72,-73,-74,-75,-76,-77,-78,36,-71,-35,-36,36,36,-154,36,-137,36,-139,-134,-143,-128,-129,-131,-202,-201,36,-218,36,-78,-80,36,-214,-215,-217,36,36,36,-31,-34,36,36,-155,-156,-136,-138,-144,-203,-205,36,-79,-213,-216,-32,-33,-204,-206,-80,-208,-209,-207,-210,-212,-211,]),'INT':([0,2,4,5,6,7,8,9,10,11,13,14,15,17,18,19,20,21,22,23,25,27,28,29,30,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,55,58,59,60,61,62,63,64,65,66,77,78,80,81,82,83,84,85,86,87,97,98,99,101,102,103,104,105,106,107,115,126,128,131,133,139,140,141,142,143,144,145,146,147,148,149,152,153,154,155,156,157,158,159,160,161,162,168,211,228,229,230,239,247,250,251,252,253,254,255,257,258,264,265,266,272,274,278,283,284,285,287,288,290,329,333,336,352,353,362,371,372,373,376,377,378,382,385,391,396,399,400,443,444,459,492,493,495,496,520,522,528,530,],[37,37,-60,-62,-63,-64,-65,-66,37,37,-67,-68,-52,-310,-310,-310,-116,-93,37,-29,-97,-113,-114,-115,-221,-101,-102,-103,-104,-105,-106,-107,-108,-109,-110,-111,-112,-117,-118,-119,-95,-96,-98,-99,-100,-61,37,-84,37,37,37,-89,-90,-91,-92,-83,-69,37,-53,-86,-9,-10,-87,-88,-94,-166,-152,-153,-308,-132,-133,37,-70,37,-85,37,37,37,-30,-167,37,37,37,-135,-142,-309,37,-145,-146,-130,37,37,-200,-198,-199,-72,-73,-74,-75,-76,-77,-78,37,-71,-35,-36,37,37,-154,37,-137,37,-139,-134,-143,-128,-129,-131,-202,-201,37,-218,37,-78,-80,37,-214,-215,-217,37,37,37,-31,-34,37,37,-155,-156,-136,-138,-144,-203,-205,37,-79,-213,-216,-32,-33,-204,-206,-80,-208,-209,-207,-210,-212,-211,]),'LONG':([0,2,4,5,6,7,8,9,10,11,13,14,15,17,18,19,20,21,22,23,25,27,28,29,30,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,55,58,59,60,61,62,63,64,65,66,77,78,80,81,82,83,84,85,86,87,97,98,99,101,102,103,104,105,106,107,115,126,128,131,133,139,140,141,142,143,144,145,146,147,148,149,152,153,154,155,156,157,158,159,160,161,162,168,211,228,229,230,239,247,250,251,252,253,254,255,257,258,264,265,266,272,274,278,283,284,285,287,288,290,329,333,336,352,353,362,371,372,373,376,377,378,382,385,391,396,399,400,443,444,459,492,493,495,496,520,522,528,530,],[38,38,-60,-62,-63,-64,-65,-66,38,38,-67,-68,-52,-310,-310,-310,-116,-93,38,-29,-97,-113,-114,-115,-221,-101,-102,-103,-104,-105,-106,-107,-108,-109,-110,-111,-112,-117,-118,-119,-95,-96,-98,-99,-100,-61,38,-84,38,38,38,-89,-90,-91,-92,-83,-69,38,-53,-86,-9,-10,-87,-88,-94,-166,-152,-153,-308,-132,-133,38,-70,38,-85,38,38,38,-30,-167,38,38,38,-135,-142,-309,38,-145,-146,-130,38,38,-200,-198,-199,-72,-73,-74,-75,-76,-77,-78,38,-71,-35,-36,38,38,-154,38,-137,38,-139,-134,-143,-128,-129,-131,-202,-201,38,-218,38,-78,-80,38,-214,-215,-217,38,38,38,-31,-34,38,38,-155,-156,-136,-138,-144,-203,-205,38,-79,-213,-216,-32,-33,-204,-206,-80,-208,-209,-207,-210,-212,-211,]),'FLOAT':([0,2,4,5,6,7,8,9,10,11,13,14,15,17,18,19,20,21,22,23,25,27,28,29,30,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,55,58,59,60,61,62,63,64,65,66,77,78,80,81,82,83,84,85,86,87,97,98,99,101,102,103,104,105,106,107,115,126,128,131,133,139,140,141,142,143,144,145,146,147,148,149,152,153,154,155,156,157,158,159,160,161,162,168,211,228,229,230,239,247,250,251,252,253,254,255,257,258,264,265,266,272,274,278,283,284,285,287,288,290,329,333,336,352,353,362,371,372,373,376,377,378,382,385,391,396,399,400,443,444,459,492,493,495,496,520,522,528,530,],[39,39,-60,-62,-63,-64,-65,-66,39,39,-67,-68,-52,-310,-310,-310,-116,-93,39,-29,-97,-113,-114,-115,-221,-101,-102,-103,-104,-105,-106,-107,-108,-109,-110,-111,-112,-117,-118,-119,-95,-96,-98,-99,-100,-61,39,-84,39,39,39,-89,-90,-91,-92,-83,-69,39,-53,-86,-9,-10,-87,-88,-94,-166,-152,-153,-308,-132,-133,39,-70,39,-85,39,39,39,-30,-167,39,39,39,-135,-142,-309,39,-145,-146,-130,39,39,-200,-198,-199,-72,-73,-74,-75,-76,-77,-78,39,-71,-35,-36,39,39,-154,39,-137,39,-139,-134,-143,-128,-129,-131,-202,-201,39,-218,39,-78,-80,39,-214,-215,-217,39,39,39,-31,-34,39,39,-155,-156,-136,-138,-144,-203,-205,39,-79,-213,-216,-32,-33,-204,-206,-80,-208,-209,-207,-210,-212,-211,]),'DOUBLE':([0,2,4,5,6,7,8,9,10,11,13,14,15,17,18,19,20,21,22,23,25,27,28,29,30,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,55,58,59,60,61,62,63,64,65,66,77,78,80,81,82,83,84,85,86,87,97,98,99,101,102,103,104,105,106,107,115,126,128,131,133,139,140,141,142,143,144,145,146,147,148,149,152,153,154,155,156,157,158,159,160,161,162,168,211,228,229,230,239,247,250,251,252,253,254,255,257,258,264,265,266,272,274,278,283,284,285,287,288,290,329,333,336,352,353,362,371,372,373,376,377,378,382,385,391,396,399,400,443,444,459,492,493,495,496,520,522,528,530,],[40,40,-60,-62,-63,-64,-65,-66,40,40,-67,-68,-52,-310,-310,-310,-116,-93,40,-29,-97,-113,-114,-115,-221,-101,-102,-103,-104,-105,-106,-107,-108,-109,-110,-111,-112,-117,-118,-119,-95,-96,-98,-99,-100,-61,40,-84,40,40,40,-89,-90,-91,-92,-83,-69,40,-53,-86,-9,-10,-87,-88,-94,-166,-152,-153,-308,-132,-133,40,-70,40,-85,40,40,40,-30,-167,40,40,40,-135,-142,-309,40,-145,-146,-130,40,40,-200,-198,-199,-72,-73,-74,-75,-76,-77,-78,40,-71,-35,-36,40,40,-154,40,-137,40,-139,-134,-143,-128,-129,-131,-202,-201,40,-218,40,-78,-80,40,-214,-215,-217,40,40,40,-31,-34,40,40,-155,-156,-136,-138,-144,-203,-205,40,-79,-213,-216,-32,-33,-204,-206,-80,-208,-209,-207,-210,-212,-211,]),'_COMPLEX':([0,2,4,5,6,7,8,9,10,11,13,14,15,17,18,19,20,21,22,23,25,27,28,29,30,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,55,58,59,60,61,62,63,64,65,66,77,78,80,81,82,83,84,85,86,87,97,98,99,101,102,103,104,105,106,107,115,126,128,131,133,139,140,141,142,143,144,145,146,147,148,149,152,153,154,155,156,157,158,159,160,161,162,168,211,228,229,230,239,247,250,251,252,253,254,255,257,258,264,265,266,272,274,278,283,284,285,287,288,290,329,333,336,352,353,362,371,372,373,376,377,378,382,385,391,396,399,400,443,444,459,492,493,495,496,520,522,528,530,],[41,41,-60,-62,-63,-64,-65,-66,41,41,-67,-68,-52,-310,-310,-310,-116,-93,41,-29,-97,-113,-114,-115,-221,-101,-102,-103,-104,-105,-106,-107,-108,-109,-110,-111,-112,-117,-118,-119,-95,-96,-98,-99,-100,-61,41,-84,41,41,41,-89,-90,-91,-92,-83,-69,41,-53,-86,-9,-10,-87,-88,-94,-166,-152,-153,-308,-132,-133,41,-70,41,-85,41,41,41,-30,-167,41,41,41,-135,-142,-309,41,-145,-146,-130,41,41,-200,-198,-199,-72,-73,-74,-75,-76,-77,-78,41,-71,-35,-36,41,41,-154,41,-137,41,-139,-134,-143,-128,-129,-131,-202,-201,41,-218,41,-78,-80,41,-214,-215,-217,41,41,41,-31,-34,41,41,-155,-156,-136,-138,-144,-203,-205,41,-79,-213,-216,-32,-33,-204,-206,-80,-208,-209,-207,-210,-212,-211,]),'SIGNED':([0,2,4,5,6,7,8,9,10,11,13,14,15,17,18,19,20,21,22,23,25,27,28,29,30,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,55,58,59,60,61,62,63,64,65,66,77,78,80,81,82,83,84,85,86,87,97,98,99,101,102,103,104,105,106,107,115,126,128,131,133,139,140,141,142,143,144,145,146,147,148,149,152,153,154,155,156,157,158,159,160,161,162,168,211,228,229,230,239,247,250,251,252,253,254,255,257,258,264,265,266,272,274,278,283,284,285,287,288,290,329,333,336,352,353,362,371,372,373,376,377,378,382,385,391,396,399,400,443,444,459,492,493,495,496,520,522,528,530,],[42,42,-60,-62,-63,-64,-65,-66,42,42,-67,-68,-52,-310,-310,-310,-116,-93,42,-29,-97,-113,-114,-115,-221,-101,-102,-103,-104,-105,-106,-107,-108,-109,-110,-111,-112,-117,-118,-119,-95,-96,-98,-99,-100,-61,42,-84,42,42,42,-89,-90,-91,-92,-83,-69,42,-53,-86,-9,-10,-87,-88,-94,-166,-152,-153,-308,-132,-133,42,-70,42,-85,42,42,42,-30,-167,42,42,42,-135,-142,-309,42,-145,-146,-130,42,42,-200,-198,-199,-72,-73,-74,-75,-76,-77,-78,42,-71,-35,-36,42,42,-154,42,-137,42,-139,-134,-143,-128,-129,-131,-202,-201,42,-218,42,-78,-80,42,-214,-215,-217,42,42,42,-31,-34,42,42,-155,-156,-136,-138,-144,-203,-205,42,-79,-213,-216,-32,-33,-204,-206,-80,-208,-209,-207,-210,-212,-211,]),'UNSIGNED':([0,2,4,5,6,7,8,9,10,11,13,14,15,17,18,19,20,21,22,23,25,27,28,29,30,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,55,58,59,60,61,62,63,64,65,66,77,78,80,81,82,83,84,85,86,87,97,98,99,101,102,103,104,105,106,107,115,126,128,131,133,139,140,141,142,143,144,145,146,147,148,149,152,153,154,155,156,157,158,159,160,161,162,168,211,228,229,230,239,247,250,251,252,253,254,255,257,258,264,265,266,272,274,278,283,284,285,287,288,290,329,333,336,352,353,362,371,372,373,376,377,378,382,385,391,396,399,400,443,444,459,492,493,495,496,520,522,528,530,],[43,43,-60,-62,-63,-64,-65,-66,43,43,-67,-68,-52,-310,-310,-310,-116,-93,43,-29,-97,-113,-114,-115,-221,-101,-102,-103,-104,-105,-106,-107,-108,-109,-110,-111,-112,-117,-118,-119,-95,-96,-98,-99,-100,-61,43,-84,43,43,43,-89,-90,-91,-92,-83,-69,43,-53,-86,-9,-10,-87,-88,-94,-166,-152,-153,-308,-132,-133,43,-70,43,-85,43,43,43,-30,-167,43,43,43,-135,-142,-309,43,-145,-146,-130,43,43,-200,-198,-199,-72,-73,-74,-75,-76,-77,-78,43,-71,-35,-36,43,43,-154,43,-137,43,-139,-134,-143,-128,-129,-131,-202,-201,43,-218,43,-78,-80,43,-214,-215,-217,43,43,43,-31,-34,43,43,-155,-156,-136,-138,-144,-203,-205,43,-79,-213,-216,-32,-33,-204,-206,-80,-208,-209,-207,-210,-212,-211,]),'__INT128':([0,2,4,5,6,7,8,9,10,11,13,14,15,17,18,19,20,21,22,23,25,27,28,29,30,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,55,58,59,60,61,62,63,64,65,66,77,78,80,81,82,83,84,85,86,87,97,98,99,101,102,103,104,105,106,107,115,126,128,131,133,139,140,141,142,143,144,145,146,147,148,149,152,153,154,155,156,157,158,159,160,161,162,168,211,228,229,230,239,247,250,251,252,253,254,255,257,258,264,265,266,272,274,278,283,284,285,287,288,290,329,333,336,352,353,362,371,372,373,376,377,378,382,385,391,396,399,400,443,444,459,492,493,495,496,520,522,528,530,],[44,44,-60,-62,-63,-64,-65,-66,44,44,-67,-68,-52,-310,-310,-310,-116,-93,44,-29,-97,-113,-114,-115,-221,-101,-102,-103,-104,-105,-106,-107,-108,-109,-110,-111,-112,-117,-118,-119,-95,-96,-98,-99,-100,-61,44,-84,44,44,44,-89,-90,-91,-92,-83,-69,44,-53,-86,-9,-10,-87,-88,-94,-166,-152,-153,-308,-132,-133,44,-70,44,-85,44,44,44,-30,-167,44,44,44,-135,-142,-309,44,-145,-146,-130,44,44,-200,-198,-199,-72,-73,-74,-75,-76,-77,-78,44,-71,-35,-36,44,44,-154,44,-137,44,-139,-134,-143,-128,-129,-131,-202,-201,44,-218,44,-78,-80,44,-214,-215,-217,44,44,44,-31,-34,44,44,-155,-156,-136,-138,-144,-203,-205,44,-79,-213,-216,-32,-33,-204,-206,-80,-208,-209,-207,-210,-212,-211,]),'CONST':([0,2,4,5,6,7,8,9,10,11,13,14,15,17,18,19,20,21,23,25,26,27,28,29,30,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,55,58,59,60,62,63,64,65,66,77,78,79,80,81,87,96,97,98,99,101,102,103,104,105,106,107,114,115,117,118,126,131,133,139,140,141,142,143,144,145,146,147,148,149,152,153,154,155,156,157,158,159,160,161,162,168,211,218,219,228,229,230,239,240,247,250,251,252,253,254,255,257,258,264,265,266,272,274,278,283,284,285,287,288,290,329,333,336,352,353,361,362,371,372,373,376,377,378,382,385,391,396,399,400,443,444,446,447,459,492,493,495,496,520,522,528,530,],[45,45,-60,-62,-63,-64,-65,-66,45,45,-67,-68,-52,45,45,45,-116,-93,-29,-97,45,-113,-114,-115,-221,-101,-102,-103,-104,-105,-106,-107,-108,-109,-110,-111,-112,-117,-118,-119,-95,-96,-98,-99,-100,-61,45,-84,45,45,-89,-90,-91,-92,-83,-69,45,45,-53,-94,45,-166,-152,-153,-308,-132,-133,45,-70,45,-85,45,45,45,45,45,-30,-167,45,45,45,-135,-142,-309,45,-145,-146,-130,45,45,-200,-198,-199,-72,-73,-74,-75,-76,-77,-78,45,-71,45,45,-35,-36,45,45,45,-154,45,-137,45,-139,-134,-143,-128,-129,-131,-202,-201,45,-218,45,-78,-80,45,-214,-215,-217,45,45,45,-31,-34,45,45,45,-155,-156,-136,-138,-144,-203,-205,45,-79,-213,-216,-32,-33,45,45,-204,-206,-80,-208,-209,-207,-210,-212,-211,]),'RESTRICT':([0,2,4,5,6,7,8,9,10,11,13,14,15,17,18,19,20,21,23,25,26,27,28,29,30,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,55,58,59,60,62,63,64,65,66,77,78,79,80,81,87,96,97,98,99,101,102,103,104,105,106,107,114,115,117,118,126,131,133,139,140,141,142,143,144,145,146,147,148,149,152,153,154,155,156,157,158,159,160,161,162,168,211,218,219,228,229,230,239,240,247,250,251,252,253,254,255,257,258,264,265,266,272,274,278,283,284,285,287,288,290,329,333,336,352,353,361,362,371,372,373,376,377,378,382,385,391,396,399,400,443,444,446,447,459,492,493,495,496,520,522,528,530,],[46,46,-60,-62,-63,-64,-65,-66,46,46,-67,-68,-52,46,46,46,-116,-93,-29,-97,46,-113,-114,-115,-221,-101,-102,-103,-104,-105,-106,-107,-108,-109,-110,-111,-112,-117,-118,-119,-95,-96,-98,-99,-100,-61,46,-84,46,46,-89,-90,-91,-92,-83,-69,46,46,-53,-94,46,-166,-152,-153,-308,-132,-133,46,-70,46,-85,46,46,46,46,46,-30,-167,46,46,46,-135,-142,-309,46,-145,-146,-130,46,46,-200,-198,-199,-72,-73,-74,-75,-76,-77,-78,46,-71,46,46,-35,-36,46,46,46,-154,46,-137,46,-139,-134,-143,-128,-129,-131,-202,-201,46,-218,46,-78,-80,46,-214,-215,-217,46,46,46,-31,-34,46,46,46,-155,-156,-136,-138,-144,-203,-205,46,-79,-213,-216,-32,-33,46,46,-204,-206,-80,-208,-209,-207,-210,-212,-211,]),'VOLATILE':([0,2,4,5,6,7,8,9,10,11,13,14,15,17,18,19,20,21,23,25,26,27,28,29,30,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,55,58,59,60,62,63,64,65,66,77,78,79,80,81,87,96,97,98,99,101,102,103,104,105,106,107,114,115,117,118,126,131,133,139,140,141,142,143,144,145,146,147,148,149,152,153,154,155,156,157,158,159,160,161,162,168,211,218,219,228,229,230,239,240,247,250,251,252,253,254,255,257,258,264,265,266,272,274,278,283,284,285,287,288,290,329,333,336,352,353,361,362,371,372,373,376,377,378,382,385,391,396,399,400,443,444,446,447,459,492,493,495,496,520,522,528,530,],[47,47,-60,-62,-63,-64,-65,-66,47,47,-67,-68,-52,47,47,47,-116,-93,-29,-97,47,-113,-114,-115,-221,-101,-102,-103,-104,-105,-106,-107,-108,-109,-110,-111,-112,-117,-118,-119,-95,-96,-98,-99,-100,-61,47,-84,47,47,-89,-90,-91,-92,-83,-69,47,47,-53,-94,47,-166,-152,-153,-308,-132,-133,47,-70,47,-85,47,47,47,47,47,-30,-167,47,47,47,-135,-142,-309,47,-145,-146,-130,47,47,-200,-198,-199,-72,-73,-74,-75,-76,-77,-78,47,-71,47,47,-35,-36,47,47,47,-154,47,-137,47,-139,-134,-143,-128,-129,-131,-202,-201,47,-218,47,-78,-80,47,-214,-215,-217,47,47,47,-31,-34,47,47,47,-155,-156,-136,-138,-144,-203,-205,47,-79,-213,-216,-32,-33,47,47,-204,-206,-80,-208,-209,-207,-210,-212,-211,]),'AUTO':([0,2,4,5,6,7,8,9,10,11,13,14,15,17,18,19,20,21,23,25,27,28,29,30,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,55,58,59,60,62,63,64,65,66,77,78,80,81,87,98,99,101,102,103,105,106,107,115,126,131,142,144,152,153,154,155,156,157,158,159,160,161,162,211,228,229,230,239,247,251,253,254,265,266,274,283,284,285,287,288,290,352,353,362,371,372,373,376,377,382,385,391,396,399,400,443,444,459,492,493,495,496,520,522,528,530,],[48,48,-60,-62,-63,-64,-65,-66,48,48,-67,-68,-52,48,48,48,-116,-93,-29,-97,-113,-114,-115,-221,-101,-102,-103,-104,-105,-106,-107,-108,-109,-110,-111,-112,-117,-118,-119,-95,-96,-98,-99,-100,-61,48,-84,48,48,-89,-90,-91,-92,-83,-69,48,-53,-94,-152,-153,-308,-132,-133,-70,48,-85,48,48,-30,-135,-309,48,-200,-198,-199,-72,-73,-74,-75,-76,-77,-78,-71,-35,-36,48,48,-154,-137,-139,-134,-202,-201,-218,-78,-80,48,-214,-215,-217,-31,-34,48,48,-155,-156,-136,-138,-203,-205,48,-79,-213,-216,-32,-33,-204,-206,-80,-208,-209,-207,-210,-212,-211,]),'REGISTER':([0,2,4,5,6,7,8,9,10,11,13,14,15,17,18,19,20,21,23,25,27,28,29,30,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,55,58,59,60,62,63,64,65,66,77,78,80,81,87,98,99,101,102,103,105,106,107,115,126,131,142,144,152,153,154,155,156,157,158,159,160,161,162,211,228,229,230,239,247,251,253,254,265,266,274,283,284,285,287,288,290,352,353,362,371,372,373,376,377,382,385,391,396,399,400,443,444,459,492,493,495,496,520,522,528,530,],[49,49,-60,-62,-63,-64,-65,-66,49,49,-67,-68,-52,49,49,49,-116,-93,-29,-97,-113,-114,-115,-221,-101,-102,-103,-104,-105,-106,-107,-108,-109,-110,-111,-112,-117,-118,-119,-95,-96,-98,-99,-100,-61,49,-84,49,49,-89,-90,-91,-92,-83,-69,49,-53,-94,-152,-153,-308,-132,-133,-70,49,-85,49,49,-30,-135,-309,49,-200,-198,-199,-72,-73,-74,-75,-76,-77,-78,-71,-35,-36,49,49,-154,-137,-139,-134,-202,-201,-218,-78,-80,49,-214,-215,-217,-31,-34,49,49,-155,-156,-136,-138,-203,-205,49,-79,-213,-216,-32,-33,-204,-206,-80,-208,-209,-207,-210,-212,-211,]),'STATIC':([0,2,4,5,6,7,8,9,10,11,13,14,15,17,18,19,20,21,23,25,27,28,29,30,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,55,58,59,60,62,63,64,65,66,77,78,79,80,81,87,97,98,99,101,102,103,105,106,107,114,115,118,126,131,133,142,144,152,153,154,155,156,157,158,159,160,161,162,211,219,228,229,230,239,247,251,253,254,265,266,274,283,284,285,287,288,290,352,353,361,362,371,372,373,376,377,382,385,391,396,399,400,443,444,447,459,492,493,495,496,520,522,528,530,],[25,25,-60,-62,-63,-64,-65,-66,25,25,-67,-68,-52,25,25,25,-116,-93,-29,-97,-113,-114,-115,-221,-101,-102,-103,-104,-105,-106,-107,-108,-109,-110,-111,-112,-117,-118,-119,-95,-96,-98,-99,-100,-61,25,-84,25,25,-89,-90,-91,-92,-83,-69,117,25,-53,-94,-166,-152,-153,-308,-132,-133,-70,25,-85,218,25,227,25,-30,-167,-135,-309,25,-200,-198,-199,-72,-73,-74,-75,-76,-77,-78,-71,349,-35,-36,25,25,-154,-137,-139,-134,-202,-201,-218,-78,-80,25,-214,-215,-217,-31,-34,446,25,25,-155,-156,-136,-138,-203,-205,25,-79,-213,-216,-32,-33,485,-204,-206,-80,-208,-209,-207,-210,-212,-211,]),'EXTERN':([0,2,4,5,6,7,8,9,10,11,13,14,15,17,18,19,20,21,23,25,27,28,29,30,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,55,58,59,60,62,63,64,65,66,77,78,80,81,87,98,99,101,102,103,105,106,107,115,126,131,142,144,152,153,154,155,156,157,158,159,160,161,162,211,228,229,230,239,247,251,253,254,265,266,274,283,284,285,287,288,290,352,353,362,371,372,373,376,377,382,385,391,396,399,400,443,444,459,492,493,495,496,520,522,528,530,],[50,50,-60,-62,-63,-64,-65,-66,50,50,-67,-68,-52,50,50,50,-116,-93,-29,-97,-113,-114,-115,-221,-101,-102,-103,-104,-105,-106,-107,-108,-109,-110,-111,-112,-117,-118,-119,-95,-96,-98,-99,-100,-61,50,-84,50,50,-89,-90,-91,-92,-83,-69,50,-53,-94,-152,-153,-308,-132,-133,-70,50,-85,50,50,-30,-135,-309,50,-200,-198,-199,-72,-73,-74,-75,-76,-77,-78,-71,-35,-36,50,50,-154,-137,-139,-134,-202,-201,-218,-78,-80,50,-214,-215,-217,-31,-34,50,50,-155,-156,-136,-138,-203,-205,50,-79,-213,-216,-32,-33,-204,-206,-80,-208,-209,-207,-210,-212,-211,]),'TYPEDEF':([0,2,4,5,6,7,8,9,10,11,13,14,15,17,18,19,20,21,23,25,27,28,29,30,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,55,58,59,60,62,63,64,65,66,77,78,80,81,87,98,99,101,102,103,105,106,107,115,126,131,142,144,152,153,154,155,156,157,158,159,160,161,162,211,228,229,230,239,247,251,253,254,265,266,274,283,284,285,287,288,290,352,353,362,371,372,373,376,377,382,385,391,396,399,400,443,444,459,492,493,495,496,520,522,528,530,],[51,51,-60,-62,-63,-64,-65,-66,51,51,-67,-68,-52,51,51,51,-116,-93,-29,-97,-113,-114,-115,-221,-101,-102,-103,-104,-105,-106,-107,-108,-109,-110,-111,-112,-117,-118,-119,-95,-96,-98,-99,-100,-61,51,-84,51,51,-89,-90,-91,-92,-83,-69,51,-53,-94,-152,-153,-308,-132,-133,-70,51,-85,51,51,-30,-135,-309,51,-200,-198,-199,-72,-73,-74,-75,-76,-77,-78,-71,-35,-36,51,51,-154,-137,-139,-134,-202,-201,-218,-78,-80,51,-214,-215,-217,-31,-34,51,51,-155,-156,-136,-138,-203,-205,51,-79,-213,-216,-32,-33,-204,-206,-80,-208,-209,-207,-210,-212,-211,]),'INLINE':([0,2,4,5,6,7,8,9,10,11,13,14,15,17,18,19,20,21,23,25,27,28,29,30,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,55,58,59,60,62,63,64,65,66,77,78,80,81,87,98,99,101,102,103,105,106,107,115,126,131,142,144,152,153,154,155,156,157,158,159,160,161,162,211,228,229,230,239,247,251,253,254,265,266,274,283,284,285,287,288,290,352,353,362,371,372,373,376,377,382,385,391,396,399,400,443,444,459,492,493,495,496,520,522,528,530,],[52,52,-60,-62,-63,-64,-65,-66,52,52,-67,-68,-52,52,52,52,-116,-93,-29,-97,-113,-114,-115,-221,-101,-102,-103,-104,-105,-106,-107,-108,-109,-110,-111,-112,-117,-118,-119,-95,-96,-98,-99,-100,-61,52,-84,52,52,-89,-90,-91,-92,-83,-69,52,-53,-94,-152,-153,-308,-132,-133,-70,52,-85,52,52,-30,-135,-309,52,-200,-198,-199,-72,-73,-74,-75,-76,-77,-78,-71,-35,-36,52,52,-154,-137,-139,-134,-202,-201,-218,-78,-80,52,-214,-215,-217,-31,-34,52,52,-155,-156,-136,-138,-203,-205,52,-79,-213,-216,-32,-33,-204,-206,-80,-208,-209,-207,-210,-212,-211,]),'STRUCT':([0,2,4,5,6,7,8,9,10,13,14,15,17,18,19,22,23,25,45,46,47,48,49,50,51,52,55,58,59,61,62,77,78,80,81,82,83,84,85,86,97,101,104,105,106,107,115,128,131,133,139,140,141,143,144,146,147,149,152,153,154,155,156,157,158,159,160,161,162,168,211,228,229,230,239,250,252,255,265,266,272,274,283,284,285,287,288,290,329,333,336,352,353,362,371,378,382,385,391,396,399,400,443,444,459,492,493,495,496,520,522,528,530,],[53,53,-60,-62,-63,-64,-65,-66,53,-67,-68,-52,-310,-310,-310,53,-29,-97,-117,-118,-119,-95,-96,-98,-99,-100,-61,53,-84,53,53,-83,-69,53,-53,-86,-9,-10,-87,-88,-166,-308,53,-70,53,-85,53,53,-30,-167,53,53,53,-142,-309,-145,-146,53,53,-200,-198,-199,-72,-73,-74,-75,-76,-77,-78,53,-71,-35,-36,53,53,53,53,-143,-202,-201,53,-218,-78,-80,53,-214,-215,-217,53,53,53,-31,-34,53,53,-144,-203,-205,53,-79,-213,-216,-32,-33,-204,-206,-80,-208,-209,-207,-210,-212,-211,]),'UNION':([0,2,4,5,6,7,8,9,10,13,14,15,17,18,19,22,23,25,45,46,47,48,49,50,51,52,55,58,59,61,62,77,78,80,81,82,83,84,85,86,97,101,104,105,106,107,115,128,131,133,139,140,141,143,144,146,147,149,152,153,154,155,156,157,158,159,160,161,162,168,211,228,229,230,239,250,252,255,265,266,272,274,283,284,285,287,288,290,329,333,336,352,353,362,371,378,382,385,391,396,399,400,443,444,459,492,493,495,496,520,522,528,530,],[54,54,-60,-62,-63,-64,-65,-66,54,-67,-68,-52,-310,-310,-310,54,-29,-97,-117,-118,-119,-95,-96,-98,-99,-100,-61,54,-84,54,54,-83,-69,54,-53,-86,-9,-10,-87,-88,-166,-308,54,-70,54,-85,54,54,-30,-167,54,54,54,-142,-309,-145,-146,54,54,-200,-198,-199,-72,-73,-74,-75,-76,-77,-78,54,-71,-35,-36,54,54,54,54,-143,-202,-201,54,-218,-78,-80,54,-214,-215,-217,54,54,54,-31,-34,54,54,-144,-203,-205,54,-79,-213,-216,-32,-33,-204,-206,-80,-208,-209,-207,-210,-212,-211,]),'LBRACE':([10,14,15,23,31,32,53,54,56,57,58,59,62,77,78,81,98,99,101,102,103,106,107,109,113,130,131,144,152,153,154,155,156,157,158,159,160,161,162,172,216,228,229,265,266,268,273,274,283,284,287,288,290,339,340,341,352,353,382,383,385,387,396,399,400,433,435,443,444,459,460,461,462,464,465,473,474,477,478,492,493,495,496,509,511,520,522,524,527,528,530,],[-310,-68,-52,-29,101,101,-140,-141,101,-7,-8,-84,-310,-83,-69,-53,101,101,-308,101,101,101,-85,101,101,101,-30,-309,101,-200,-198,-199,-72,-73,-74,-75,-76,-77,-78,101,-310,-35,-36,-202,-201,101,101,-218,101,-80,-214,-215,-217,-11,101,-12,-31,-34,-203,101,-205,101,-79,-213,-216,-310,-182,-32,-33,-204,101,101,-310,101,101,101,101,101,-11,-206,-80,-208,-209,101,-310,-207,-210,101,101,-212,-211,]),'RBRACE':([14,77,78,101,104,106,127,136,137,138,139,140,141,143,144,146,147,150,151,152,153,154,155,156,157,158,159,160,161,162,179,180,181,182,186,192,195,196,197,198,200,201,202,203,204,205,206,207,208,209,210,215,216,245,246,248,250,252,255,265,266,270,271,274,283,284,287,288,290,326,327,328,330,331,332,334,335,337,338,339,374,375,378,382,385,388,396,399,400,401,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,423,425,426,427,428,432,433,434,459,463,470,471,474,476,492,493,494,495,496,500,504,510,511,515,520,521,522,528,530,],[-68,-83,-69,-308,144,-310,-294,144,-157,-160,144,144,144,-142,-309,-145,-146,144,-5,-6,-200,-198,-199,-72,-73,-74,-75,-76,-77,-78,-222,-257,-236,-259,-238,-271,-283,-284,-285,-286,-295,-296,-297,-298,-299,-300,-301,-302,-303,-304,-306,-177,-310,144,144,-158,144,144,-143,-202,-201,-235,-257,-218,-78,-80,-214,-215,-217,-279,-280,-260,-261,-262,-263,-305,-307,144,-22,-21,-159,-161,-144,-203,-205,-287,-79,-213,-216,-223,-239,-240,-241,-242,-243,-244,-245,-246,-247,-248,-249,-250,-251,-252,-253,-254,-255,-256,-274,-275,-276,-277,-278,-178,144,-180,-204,-258,-272,-273,-264,-179,-206,-80,144,-208,-209,-237,-181,-281,144,-288,-207,-282,-210,-212,-211,]),'CASE':([14,77,78,101,106,144,152,153,154,155,156,157,158,159,160,161,162,172,265,266,268,273,274,283,284,287,288,290,382,383,385,396,399,400,459,461,464,465,492,493,495,496,509,520,522,524,527,528,530,],[-68,-83,-69,-308,164,-309,164,-200,-198,-199,-72,-73,-74,-75,-76,-77,-78,164,-202,-201,164,164,-218,164,-80,-214,-215,-217,-203,164,-205,-79,-213,-216,-204,164,164,164,-206,-80,-208,-209,164,-207,-210,164,164,-212,-211,]),'DEFAULT':([14,77,78,101,106,144,152,153,154,155,156,157,158,159,160,161,162,172,265,266,268,273,274,283,284,287,288,290,382,383,385,396,399,400,459,461,464,465,492,493,495,496,509,520,522,524,527,528,530,],[-68,-83,-69,-308,165,-309,165,-200,-198,-199,-72,-73,-74,-75,-76,-77,-78,165,-202,-201,165,165,-218,165,-80,-214,-215,-217,-203,165,-205,-79,-213,-216,-204,165,165,165,-206,-80,-208,-209,165,-207,-210,165,165,-212,-211,]),'IF':([14,77,78,101,106,144,152,153,154,155,156,157,158,159,160,161,162,172,265,266,268,273,274,283,284,287,288,290,382,383,385,396,399,400,459,461,464,465,492,493,495,496,509,520,522,524,527,528,530,],[-68,-83,-69,-308,167,-309,167,-200,-198,-199,-72,-73,-74,-75,-76,-77,-78,167,-202,-201,167,167,-218,167,-80,-214,-215,-217,-203,167,-205,-79,-213,-216,-204,167,167,167,-206,-80,-208,-209,167,-207,-210,167,167,-212,-211,]),'SWITCH':([14,77,78,101,106,144,152,153,154,155,156,157,158,159,160,161,162,172,265,266,268,273,274,283,284,287,288,290,382,383,385,396,399,400,459,461,464,465,492,493,495,496,509,520,522,524,527,528,530,],[-68,-83,-69,-308,170,-309,170,-200,-198,-199,-72,-73,-74,-75,-76,-77,-78,170,-202,-201,170,170,-218,170,-80,-214,-215,-217,-203,170,-205,-79,-213,-216,-204,170,170,170,-206,-80,-208,-209,170,-207,-210,170,170,-212,-211,]),'WHILE':([14,77,78,101,106,144,152,153,154,155,156,157,158,159,160,161,162,172,265,266,268,273,274,282,283,284,287,288,290,382,383,385,396,399,400,459,461,464,465,492,493,495,496,509,520,522,524,527,528,530,],[-68,-83,-69,-308,171,-309,171,-200,-198,-199,-72,-73,-74,-75,-76,-77,-78,171,-202,-201,171,171,-218,395,171,-80,-214,-215,-217,-203,171,-205,-79,-213,-216,-204,171,171,171,-206,-80,-208,-209,171,-207,-210,171,171,-212,-211,]),'DO':([14,77,78,101,106,144,152,153,154,155,156,157,158,159,160,161,162,172,265,266,268,273,274,283,284,287,288,290,382,383,385,396,399,400,459,461,464,465,492,493,495,496,509,520,522,524,527,528,530,],[-68,-83,-69,-308,172,-309,172,-200,-198,-199,-72,-73,-74,-75,-76,-77,-78,172,-202,-201,172,172,-218,172,-80,-214,-215,-217,-203,172,-205,-79,-213,-216,-204,172,172,172,-206,-80,-208,-209,172,-207,-210,172,172,-212,-211,]),'FOR':([14,77,78,101,106,144,152,153,154,155,156,157,158,159,160,161,162,172,265,266,268,273,274,283,284,287,288,290,382,383,385,396,399,400,459,461,464,465,492,493,495,496,509,520,522,524,527,528,530,],[-68,-83,-69,-308,173,-309,173,-200,-198,-199,-72,-73,-74,-75,-76,-77,-78,173,-202,-201,173,173,-218,173,-80,-214,-215,-217,-203,173,-205,-79,-213,-216,-204,173,173,173,-206,-80,-208,-209,173,-207,-210,173,173,-212,-211,]),'GOTO':([14,77,78,101,106,144,152,153,154,155,156,157,158,159,160,161,162,172,265,266,268,273,274,283,284,287,288,290,382,383,385,396,399,400,459,461,464,465,492,493,495,496,509,520,522,524,527,528,530,],[-68,-83,-69,-308,174,-309,174,-200,-198,-199,-72,-73,-74,-75,-76,-77,-78,174,-202,-201,174,174,-218,174,-80,-214,-215,-217,-203,174,-205,-79,-213,-216,-204,174,174,174,-206,-80,-208,-209,174,-207,-210,174,174,-212,-211,]),'BREAK':([14,77,78,101,106,144,152,153,154,155,156,157,158,159,160,161,162,172,265,266,268,273,274,283,284,287,288,290,382,383,385,396,399,400,459,461,464,465,492,493,495,496,509,520,522,524,527,528,530,],[-68,-83,-69,-308,175,-309,175,-200,-198,-199,-72,-73,-74,-75,-76,-77,-78,175,-202,-201,175,175,-218,175,-80,-214,-215,-217,-203,175,-205,-79,-213,-216,-204,175,175,175,-206,-80,-208,-209,175,-207,-210,175,175,-212,-211,]),'CONTINUE':([14,77,78,101,106,144,152,153,154,155,156,157,158,159,160,161,162,172,265,266,268,273,274,283,284,287,288,290,382,383,385,396,399,400,459,461,464,465,492,493,495,496,509,520,522,524,527,528,530,],[-68,-83,-69,-308,176,-309,176,-200,-198,-199,-72,-73,-74,-75,-76,-77,-78,176,-202,-201,176,176,-218,176,-80,-214,-215,-217,-203,176,-205,-79,-213,-216,-204,176,176,176,-206,-80,-208,-209,176,-207,-210,176,176,-212,-211,]),'RETURN':([14,77,78,101,106,144,152,153,154,155,156,157,158,159,160,161,162,172,265,266,268,273,274,283,284,287,288,290,382,383,385,396,399,400,459,461,464,465,492,493,495,496,509,520,522,524,527,528,530,],[-68,-83,-69,-308,177,-309,177,-200,-198,-199,-72,-73,-74,-75,-76,-77,-78,177,-202,-201,177,177,-218,177,-80,-214,-215,-217,-203,177,-205,-79,-213,-216,-204,177,177,177,-206,-80,-208,-209,177,-207,-210,177,177,-212,-211,]),'PLUSPLUS':([14,45,46,47,77,78,79,95,96,97,101,106,113,114,116,117,118,127,130,133,144,152,153,154,155,156,157,158,159,160,161,162,163,164,168,172,177,182,183,184,185,187,188,189,190,191,192,193,194,195,196,197,198,200,201,202,203,204,205,206,207,208,209,210,216,217,218,219,223,226,227,240,249,263,265,266,268,272,273,274,275,279,280,281,283,284,285,287,288,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,326,327,329,333,334,335,339,340,341,344,347,348,349,361,368,370,380,382,383,385,387,388,396,398,399,400,423,425,426,427,428,433,435,445,446,447,455,459,460,461,462,464,465,466,467,469,470,471,472,477,478,483,484,485,492,493,495,496,499,509,510,511,513,515,517,520,521,522,524,527,528,530,],[-68,-117,-118,-119,-83,-69,-310,-27,-28,-166,-308,183,183,-310,183,-310,-28,-294,183,-167,-309,183,-200,-198,-199,-72,-73,-74,-75,-76,-77,-78,-294,183,183,183,183,326,183,183,183,183,-266,-267,-268,-265,-271,-269,-270,-283,-284,-285,-286,-295,-296,-297,-298,-299,-300,-301,-302,-303,-304,-306,-310,183,-310,-28,-266,183,183,-310,183,183,-202,-201,183,183,183,-218,183,183,183,183,183,-80,183,-214,-215,-217,183,-224,-225,-226,-227,-228,-229,-230,-231,-232,-233,-234,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,-279,-280,183,183,-305,-307,-11,183,-12,183,-266,183,183,-310,183,183,183,-203,183,-205,183,-287,-79,183,-213,-216,-274,-275,-276,-277,-278,-310,-182,183,-310,-28,-266,-204,183,183,-310,183,183,183,183,183,-272,-273,183,183,-11,-266,183,183,-206,-80,-208,-209,183,183,-281,-310,183,-288,183,-207,-282,-210,183,183,-212,-211,]),'MINUSMINUS':([14,45,46,47,77,78,79,95,96,97,101,106,113,114,116,117,118,127,130,133,144,152,153,154,155,156,157,158,159,160,161,162,163,164,168,172,177,182,183,184,185,187,188,189,190,191,192,193,194,195,196,197,198,200,201,202,203,204,205,206,207,208,209,210,216,217,218,219,223,226,227,240,249,263,265,266,268,272,273,274,275,279,280,281,283,284,285,287,288,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,326,327,329,333,334,335,339,340,341,344,347,348,349,361,368,370,380,382,383,385,387,388,396,398,399,400,423,425,426,427,428,433,435,445,446,447,455,459,460,461,462,464,465,466,467,469,470,471,472,477,478,483,484,485,492,493,495,496,499,509,510,511,513,515,517,520,521,522,524,527,528,530,],[-68,-117,-118,-119,-83,-69,-310,-27,-28,-166,-308,184,184,-310,184,-310,-28,-294,184,-167,-309,184,-200,-198,-199,-72,-73,-74,-75,-76,-77,-78,-294,184,184,184,184,327,184,184,184,184,-266,-267,-268,-265,-271,-269,-270,-283,-284,-285,-286,-295,-296,-297,-298,-299,-300,-301,-302,-303,-304,-306,-310,184,-310,-28,-266,184,184,-310,184,184,-202,-201,184,184,184,-218,184,184,184,184,184,-80,184,-214,-215,-217,184,-224,-225,-226,-227,-228,-229,-230,-231,-232,-233,-234,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,-279,-280,184,184,-305,-307,-11,184,-12,184,-266,184,184,-310,184,184,184,-203,184,-205,184,-287,-79,184,-213,-216,-274,-275,-276,-277,-278,-310,-182,184,-310,-28,-266,-204,184,184,-310,184,184,184,184,184,-272,-273,184,184,-11,-266,184,184,-206,-80,-208,-209,184,184,-281,-310,184,-288,184,-207,-282,-210,184,184,-212,-211,]),'SIZEOF':([14,45,46,47,77,78,79,95,96,97,101,106,113,114,116,117,118,130,133,144,152,153,154,155,156,157,158,159,160,161,162,164,168,172,177,183,184,185,187,188,189,190,191,193,194,216,217,218,219,223,226,227,240,249,263,265,266,268,272,273,274,275,279,280,281,283,284,285,287,288,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,329,333,339,340,341,344,347,348,349,361,368,370,380,382,383,385,387,396,398,399,400,433,435,445,446,447,455,459,460,461,462,464,465,466,467,469,472,477,478,483,484,485,492,493,495,496,499,509,511,513,517,520,522,524,527,528,530,],[-68,-117,-118,-119,-83,-69,-310,-27,-28,-166,-308,187,187,-310,187,-310,-28,187,-167,-309,187,-200,-198,-199,-72,-73,-74,-75,-76,-77,-78,187,187,187,187,187,187,187,187,-266,-267,-268,-265,-269,-270,-310,187,-310,-28,-266,187,187,-310,187,187,-202,-201,187,187,187,-218,187,187,187,187,187,-80,187,-214,-215,-217,187,-224,-225,-226,-227,-228,-229,-230,-231,-232,-233,-234,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,-11,187,-12,187,-266,187,187,-310,187,187,187,-203,187,-205,187,-79,187,-213,-216,-310,-182,187,-310,-28,-266,-204,187,187,-310,187,187,187,187,187,187,187,-11,-266,187,187,-206,-80,-208,-209,187,187,-310,187,187,-207,-210,187,187,-212,-211,]),'AND':([14,45,46,47,77,78,79,95,96,97,101,106,113,114,116,117,118,127,130,133,144,152,153,154,155,156,157,158,159,160,161,162,163,164,168,172,177,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,200,201,202,203,204,205,206,207,208,209,210,216,217,218,219,223,226,227,240,249,263,265,266,268,271,272,273,274,275,279,280,281,283,284,285,287,288,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,326,327,328,329,330,331,332,333,334,335,339,340,341,344,347,348,349,361,368,370,380,382,383,385,387,388,396,398,399,400,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,423,425,426,427,428,433,435,445,446,447,455,459,460,461,462,463,464,465,466,467,469,470,471,472,474,477,478,483,484,485,492,493,495,496,499,509,510,511,513,515,517,520,521,522,524,527,528,530,],[-68,-117,-118,-119,-83,-69,-310,-27,-28,-166,-308,191,191,-310,191,-310,-28,-294,191,-167,-309,191,-200,-198,-199,-72,-73,-74,-75,-76,-77,-78,-294,191,191,191,191,-257,317,-259,191,191,191,-238,191,-266,-267,-268,-265,-271,-269,-270,-283,-284,-285,-286,-295,-296,-297,-298,-299,-300,-301,-302,-303,-304,-306,-310,191,-310,-28,-266,191,191,-310,191,191,-202,-201,191,-257,191,191,-218,191,191,191,191,191,-80,191,-214,-215,-217,191,-224,-225,-226,-227,-228,-229,-230,-231,-232,-233,-234,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,-279,-280,-260,191,-261,-262,-263,191,-305,-307,-11,191,-12,191,-266,191,191,-310,191,191,191,-203,191,-205,191,-287,-79,191,-213,-216,-239,-240,-241,-242,-243,-244,-245,-246,-247,-248,-249,-250,-251,-252,317,317,317,317,-274,-275,-276,-277,-278,-310,-182,191,-310,-28,-266,-204,191,191,-310,-258,191,191,191,191,191,-272,-273,191,-264,191,-11,-266,191,191,-206,-80,-208,-209,191,191,-281,-310,191,-288,191,-207,-282,-210,191,191,-212,-211,]),'PLUS':([14,45,46,47,77,78,79,95,96,97,101,106,113,114,116,117,118,127,130,133,144,152,153,154,155,156,157,158,159,160,161,162,163,164,168,172,177,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,200,201,202,203,204,205,206,207,208,209,210,216,217,218,219,223,226,227,240,249,263,265,266,268,271,272,273,274,275,279,280,281,283,284,285,287,288,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,326,327,328,329,330,331,332,333,334,335,339,340,341,344,347,348,349,361,368,370,380,382,383,385,387,388,396,398,399,400,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,423,425,426,427,428,433,435,445,446,447,455,459,460,461,462,463,464,465,466,467,469,470,471,472,474,477,478,483,484,485,492,493,495,496,499,509,510,511,513,515,517,520,521,522,524,527,528,530,],[-68,-117,-118,-119,-83,-69,-310,-27,-28,-166,-308,189,189,-310,189,-310,-28,-294,189,-167,-309,189,-200,-198,-199,-72,-73,-74,-75,-76,-77,-78,-294,189,189,189,189,-257,307,-259,189,189,189,-238,189,-266,-267,-268,-265,-271,-269,-270,-283,-284,-285,-286,-295,-296,-297,-298,-299,-300,-301,-302,-303,-304,-306,-310,189,-310,-28,-266,189,189,-310,189,189,-202,-201,189,-257,189,189,-218,189,189,189,189,189,-80,189,-214,-215,-217,189,-224,-225,-226,-227,-228,-229,-230,-231,-232,-233,-234,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,-279,-280,-260,189,-261,-262,-263,189,-305,-307,-11,189,-12,189,-266,189,189,-310,189,189,189,-203,189,-205,189,-287,-79,189,-213,-216,-239,-240,-241,-242,-243,307,307,307,307,307,307,307,307,307,307,307,307,307,-274,-275,-276,-277,-278,-310,-182,189,-310,-28,-266,-204,189,189,-310,-258,189,189,189,189,189,-272,-273,189,-264,189,-11,-266,189,189,-206,-80,-208,-209,189,189,-281,-310,189,-288,189,-207,-282,-210,189,189,-212,-211,]),'MINUS':([14,45,46,47,77,78,79,95,96,97,101,106,113,114,116,117,118,127,130,133,144,152,153,154,155,156,157,158,159,160,161,162,163,164,168,172,177,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,200,201,202,203,204,205,206,207,208,209,210,216,217,218,219,223,226,227,240,249,263,265,266,268,271,272,273,274,275,279,280,281,283,284,285,287,288,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,326,327,328,329,330,331,332,333,334,335,339,340,341,344,347,348,349,361,368,370,380,382,383,385,387,388,396,398,399,400,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,423,425,426,427,428,433,435,445,446,447,455,459,460,461,462,463,464,465,466,467,469,470,471,472,474,477,478,483,484,485,492,493,495,496,499,509,510,511,513,515,517,520,521,522,524,527,528,530,],[-68,-117,-118,-119,-83,-69,-310,-27,-28,-166,-308,190,190,-310,190,-310,-28,-294,190,-167,-309,190,-200,-198,-199,-72,-73,-74,-75,-76,-77,-78,-294,190,190,190,190,-257,308,-259,190,190,190,-238,190,-266,-267,-268,-265,-271,-269,-270,-283,-284,-285,-286,-295,-296,-297,-298,-299,-300,-301,-302,-303,-304,-306,-310,190,-310,-28,-266,190,190,-310,190,190,-202,-201,190,-257,190,190,-218,190,190,190,190,190,-80,190,-214,-215,-217,190,-224,-225,-226,-227,-228,-229,-230,-231,-232,-233,-234,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,-279,-280,-260,190,-261,-262,-263,190,-305,-307,-11,190,-12,190,-266,190,190,-310,190,190,190,-203,190,-205,190,-287,-79,190,-213,-216,-239,-240,-241,-242,-243,308,308,308,308,308,308,308,308,308,308,308,308,308,-274,-275,-276,-277,-278,-310,-182,190,-310,-28,-266,-204,190,190,-310,-258,190,190,190,190,190,-272,-273,190,-264,190,-11,-266,190,190,-206,-80,-208,-209,190,190,-281,-310,190,-288,190,-207,-282,-210,190,190,-212,-211,]),'NOT':([14,45,46,47,77,78,79,95,96,97,101,106,113,114,116,117,118,130,133,144,152,153,154,155,156,157,158,159,160,161,162,164,168,172,177,183,184,185,187,188,189,190,191,193,194,216,217,218,219,223,226,227,240,249,263,265,266,268,272,273,274,275,279,280,281,283,284,285,287,288,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,329,333,339,340,341,344,347,348,349,361,368,370,380,382,383,385,387,396,398,399,400,433,435,445,446,447,455,459,460,461,462,464,465,466,467,469,472,477,478,483,484,485,492,493,495,496,499,509,511,513,517,520,522,524,527,528,530,],[-68,-117,-118,-119,-83,-69,-310,-27,-28,-166,-308,193,193,-310,193,-310,-28,193,-167,-309,193,-200,-198,-199,-72,-73,-74,-75,-76,-77,-78,193,193,193,193,193,193,193,193,-266,-267,-268,-265,-269,-270,-310,193,-310,-28,-266,193,193,-310,193,193,-202,-201,193,193,193,-218,193,193,193,193,193,-80,193,-214,-215,-217,193,-224,-225,-226,-227,-228,-229,-230,-231,-232,-233,-234,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,-11,193,-12,193,-266,193,193,-310,193,193,193,-203,193,-205,193,-79,193,-213,-216,-310,-182,193,-310,-28,-266,-204,193,193,-310,193,193,193,193,193,193,193,-11,-266,193,193,-206,-80,-208,-209,193,193,-310,193,193,-207,-210,193,193,-212,-211,]),'LNOT':([14,45,46,47,77,78,79,95,96,97,101,106,113,114,116,117,118,130,133,144,152,153,154,155,156,157,158,159,160,161,162,164,168,172,177,183,184,185,187,188,189,190,191,193,194,216,217,218,219,223,226,227,240,249,263,265,266,268,272,273,274,275,279,280,281,283,284,285,287,288,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,329,333,339,340,341,344,347,348,349,361,368,370,380,382,383,385,387,396,398,399,400,433,435,445,446,447,455,459,460,461,462,464,465,466,467,469,472,477,478,483,484,485,492,493,495,496,499,509,511,513,517,520,522,524,527,528,530,],[-68,-117,-118,-119,-83,-69,-310,-27,-28,-166,-308,194,194,-310,194,-310,-28,194,-167,-309,194,-200,-198,-199,-72,-73,-74,-75,-76,-77,-78,194,194,194,194,194,194,194,194,-266,-267,-268,-265,-269,-270,-310,194,-310,-28,-266,194,194,-310,194,194,-202,-201,194,194,194,-218,194,194,194,194,194,-80,194,-214,-215,-217,194,-224,-225,-226,-227,-228,-229,-230,-231,-232,-233,-234,194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,-11,194,-12,194,-266,194,194,-310,194,194,194,-203,194,-205,194,-79,194,-213,-216,-310,-182,194,-310,-28,-266,-204,194,194,-310,194,194,194,194,194,194,194,-11,-266,194,194,-206,-80,-208,-209,194,194,-310,194,194,-207,-210,194,194,-212,-211,]),'OFFSETOF':([14,45,46,47,77,78,79,95,96,97,101,106,113,114,116,117,118,130,133,144,152,153,154,155,156,157,158,159,160,161,162,164,168,172,177,183,184,185,187,188,189,190,191,193,194,216,217,218,219,223,226,227,240,249,263,265,266,268,272,273,274,275,279,280,281,283,284,285,287,288,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,329,333,339,340,341,344,347,348,349,361,368,370,380,382,383,385,387,396,398,399,400,433,435,445,446,447,455,459,460,461,462,464,465,466,467,469,472,477,478,483,484,485,492,493,495,496,499,509,511,513,517,520,522,524,527,528,530,],[-68,-117,-118,-119,-83,-69,-310,-27,-28,-166,-308,199,199,-310,199,-310,-28,199,-167,-309,199,-200,-198,-199,-72,-73,-74,-75,-76,-77,-78,199,199,199,199,199,199,199,199,-266,-267,-268,-265,-269,-270,-310,199,-310,-28,-266,199,199,-310,199,199,-202,-201,199,199,199,-218,199,199,199,199,199,-80,199,-214,-215,-217,199,-224,-225,-226,-227,-228,-229,-230,-231,-232,-233,-234,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,-11,199,-12,199,-266,199,199,-310,199,199,199,-203,199,-205,199,-79,199,-213,-216,-310,-182,199,-310,-28,-266,-204,199,199,-310,199,199,199,199,199,199,199,-11,-266,199,199,-206,-80,-208,-209,199,199,-310,199,199,-207,-210,199,199,-212,-211,]),'INT_CONST_DEC':([14,45,46,47,77,78,79,95,96,97,101,106,113,114,116,117,118,130,133,144,152,153,154,155,156,157,158,159,160,161,162,164,168,172,177,183,184,185,187,188,189,190,191,193,194,216,217,218,219,223,226,227,240,249,263,265,266,268,272,273,274,275,279,280,281,283,284,285,287,288,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,329,333,339,340,341,344,347,348,349,361,368,370,380,382,383,385,387,396,398,399,400,433,435,445,446,447,455,459,460,461,462,464,465,466,467,469,472,477,478,483,484,485,492,493,495,496,499,509,511,513,517,520,522,524,527,528,530,],[-68,-117,-118,-119,-83,-69,-310,-27,-28,-166,-308,200,200,-310,200,-310,-28,200,-167,-309,200,-200,-198,-199,-72,-73,-74,-75,-76,-77,-78,200,200,200,200,200,200,200,200,-266,-267,-268,-265,-269,-270,-310,200,-310,-28,-266,200,200,-310,200,200,-202,-201,200,200,200,-218,200,200,200,200,200,-80,200,-214,-215,-217,200,-224,-225,-226,-227,-228,-229,-230,-231,-232,-233,-234,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,-11,200,-12,200,-266,200,200,-310,200,200,200,-203,200,-205,200,-79,200,-213,-216,-310,-182,200,-310,-28,-266,-204,200,200,-310,200,200,200,200,200,200,200,-11,-266,200,200,-206,-80,-208,-209,200,200,-310,200,200,-207,-210,200,200,-212,-211,]),'INT_CONST_OCT':([14,45,46,47,77,78,79,95,96,97,101,106,113,114,116,117,118,130,133,144,152,153,154,155,156,157,158,159,160,161,162,164,168,172,177,183,184,185,187,188,189,190,191,193,194,216,217,218,219,223,226,227,240,249,263,265,266,268,272,273,274,275,279,280,281,283,284,285,287,288,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,329,333,339,340,341,344,347,348,349,361,368,370,380,382,383,385,387,396,398,399,400,433,435,445,446,447,455,459,460,461,462,464,465,466,467,469,472,477,478,483,484,485,492,493,495,496,499,509,511,513,517,520,522,524,527,528,530,],[-68,-117,-118,-119,-83,-69,-310,-27,-28,-166,-308,201,201,-310,201,-310,-28,201,-167,-309,201,-200,-198,-199,-72,-73,-74,-75,-76,-77,-78,201,201,201,201,201,201,201,201,-266,-267,-268,-265,-269,-270,-310,201,-310,-28,-266,201,201,-310,201,201,-202,-201,201,201,201,-218,201,201,201,201,201,-80,201,-214,-215,-217,201,-224,-225,-226,-227,-228,-229,-230,-231,-232,-233,-234,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,-11,201,-12,201,-266,201,201,-310,201,201,201,-203,201,-205,201,-79,201,-213,-216,-310,-182,201,-310,-28,-266,-204,201,201,-310,201,201,201,201,201,201,201,-11,-266,201,201,-206,-80,-208,-209,201,201,-310,201,201,-207,-210,201,201,-212,-211,]),'INT_CONST_HEX':([14,45,46,47,77,78,79,95,96,97,101,106,113,114,116,117,118,130,133,144,152,153,154,155,156,157,158,159,160,161,162,164,168,172,177,183,184,185,187,188,189,190,191,193,194,216,217,218,219,223,226,227,240,249,263,265,266,268,272,273,274,275,279,280,281,283,284,285,287,288,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,329,333,339,340,341,344,347,348,349,361,368,370,380,382,383,385,387,396,398,399,400,433,435,445,446,447,455,459,460,461,462,464,465,466,467,469,472,477,478,483,484,485,492,493,495,496,499,509,511,513,517,520,522,524,527,528,530,],[-68,-117,-118,-119,-83,-69,-310,-27,-28,-166,-308,202,202,-310,202,-310,-28,202,-167,-309,202,-200,-198,-199,-72,-73,-74,-75,-76,-77,-78,202,202,202,202,202,202,202,202,-266,-267,-268,-265,-269,-270,-310,202,-310,-28,-266,202,202,-310,202,202,-202,-201,202,202,202,-218,202,202,202,202,202,-80,202,-214,-215,-217,202,-224,-225,-226,-227,-228,-229,-230,-231,-232,-233,-234,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,-11,202,-12,202,-266,202,202,-310,202,202,202,-203,202,-205,202,-79,202,-213,-216,-310,-182,202,-310,-28,-266,-204,202,202,-310,202,202,202,202,202,202,202,-11,-266,202,202,-206,-80,-208,-209,202,202,-310,202,202,-207,-210,202,202,-212,-211,]),'INT_CONST_BIN':([14,45,46,47,77,78,79,95,96,97,101,106,113,114,116,117,118,130,133,144,152,153,154,155,156,157,158,159,160,161,162,164,168,172,177,183,184,185,187,188,189,190,191,193,194,216,217,218,219,223,226,227,240,249,263,265,266,268,272,273,274,275,279,280,281,283,284,285,287,288,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,329,333,339,340,341,344,347,348,349,361,368,370,380,382,383,385,387,396,398,399,400,433,435,445,446,447,455,459,460,461,462,464,465,466,467,469,472,477,478,483,484,485,492,493,495,496,499,509,511,513,517,520,522,524,527,528,530,],[-68,-117,-118,-119,-83,-69,-310,-27,-28,-166,-308,203,203,-310,203,-310,-28,203,-167,-309,203,-200,-198,-199,-72,-73,-74,-75,-76,-77,-78,203,203,203,203,203,203,203,203,-266,-267,-268,-265,-269,-270,-310,203,-310,-28,-266,203,203,-310,203,203,-202,-201,203,203,203,-218,203,203,203,203,203,-80,203,-214,-215,-217,203,-224,-225,-226,-227,-228,-229,-230,-231,-232,-233,-234,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,-11,203,-12,203,-266,203,203,-310,203,203,203,-203,203,-205,203,-79,203,-213,-216,-310,-182,203,-310,-28,-266,-204,203,203,-310,203,203,203,203,203,203,203,-11,-266,203,203,-206,-80,-208,-209,203,203,-310,203,203,-207,-210,203,203,-212,-211,]),'INT_CONST_CHAR':([14,45,46,47,77,78,79,95,96,97,101,106,113,114,116,117,118,130,133,144,152,153,154,155,156,157,158,159,160,161,162,164,168,172,177,183,184,185,187,188,189,190,191,193,194,216,217,218,219,223,226,227,240,249,263,265,266,268,272,273,274,275,279,280,281,283,284,285,287,288,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,329,333,339,340,341,344,347,348,349,361,368,370,380,382,383,385,387,396,398,399,400,433,435,445,446,447,455,459,460,461,462,464,465,466,467,469,472,477,478,483,484,485,492,493,495,496,499,509,511,513,517,520,522,524,527,528,530,],[-68,-117,-118,-119,-83,-69,-310,-27,-28,-166,-308,204,204,-310,204,-310,-28,204,-167,-309,204,-200,-198,-199,-72,-73,-74,-75,-76,-77,-78,204,204,204,204,204,204,204,204,-266,-267,-268,-265,-269,-270,-310,204,-310,-28,-266,204,204,-310,204,204,-202,-201,204,204,204,-218,204,204,204,204,204,-80,204,-214,-215,-217,204,-224,-225,-226,-227,-228,-229,-230,-231,-232,-233,-234,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,-11,204,-12,204,-266,204,204,-310,204,204,204,-203,204,-205,204,-79,204,-213,-216,-310,-182,204,-310,-28,-266,-204,204,204,-310,204,204,204,204,204,204,204,-11,-266,204,204,-206,-80,-208,-209,204,204,-310,204,204,-207,-210,204,204,-212,-211,]),'FLOAT_CONST':([14,45,46,47,77,78,79,95,96,97,101,106,113,114,116,117,118,130,133,144,152,153,154,155,156,157,158,159,160,161,162,164,168,172,177,183,184,185,187,188,189,190,191,193,194,216,217,218,219,223,226,227,240,249,263,265,266,268,272,273,274,275,279,280,281,283,284,285,287,288,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,329,333,339,340,341,344,347,348,349,361,368,370,380,382,383,385,387,396,398,399,400,433,435,445,446,447,455,459,460,461,462,464,465,466,467,469,472,477,478,483,484,485,492,493,495,496,499,509,511,513,517,520,522,524,527,528,530,],[-68,-117,-118,-119,-83,-69,-310,-27,-28,-166,-308,205,205,-310,205,-310,-28,205,-167,-309,205,-200,-198,-199,-72,-73,-74,-75,-76,-77,-78,205,205,205,205,205,205,205,205,-266,-267,-268,-265,-269,-270,-310,205,-310,-28,-266,205,205,-310,205,205,-202,-201,205,205,205,-218,205,205,205,205,205,-80,205,-214,-215,-217,205,-224,-225,-226,-227,-228,-229,-230,-231,-232,-233,-234,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,-11,205,-12,205,-266,205,205,-310,205,205,205,-203,205,-205,205,-79,205,-213,-216,-310,-182,205,-310,-28,-266,-204,205,205,-310,205,205,205,205,205,205,205,-11,-266,205,205,-206,-80,-208,-209,205,205,-310,205,205,-207,-210,205,205,-212,-211,]),'HEX_FLOAT_CONST':([14,45,46,47,77,78,79,95,96,97,101,106,113,114,116,117,118,130,133,144,152,153,154,155,156,157,158,159,160,161,162,164,168,172,177,183,184,185,187,188,189,190,191,193,194,216,217,218,219,223,226,227,240,249,263,265,266,268,272,273,274,275,279,280,281,283,284,285,287,288,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,329,333,339,340,341,344,347,348,349,361,368,370,380,382,383,385,387,396,398,399,400,433,435,445,446,447,455,459,460,461,462,464,465,466,467,469,472,477,478,483,484,485,492,493,495,496,499,509,511,513,517,520,522,524,527,528,530,],[-68,-117,-118,-119,-83,-69,-310,-27,-28,-166,-308,206,206,-310,206,-310,-28,206,-167,-309,206,-200,-198,-199,-72,-73,-74,-75,-76,-77,-78,206,206,206,206,206,206,206,206,-266,-267,-268,-265,-269,-270,-310,206,-310,-28,-266,206,206,-310,206,206,-202,-201,206,206,206,-218,206,206,206,206,206,-80,206,-214,-215,-217,206,-224,-225,-226,-227,-228,-229,-230,-231,-232,-233,-234,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,-11,206,-12,206,-266,206,206,-310,206,206,206,-203,206,-205,206,-79,206,-213,-216,-310,-182,206,-310,-28,-266,-204,206,206,-310,206,206,206,206,206,206,206,-11,-266,206,206,-206,-80,-208,-209,206,206,-310,206,206,-207,-210,206,206,-212,-211,]),'CHAR_CONST':([14,45,46,47,77,78,79,95,96,97,101,106,113,114,116,117,118,130,133,144,152,153,154,155,156,157,158,159,160,161,162,164,168,172,177,183,184,185,187,188,189,190,191,193,194,216,217,218,219,223,226,227,240,249,263,265,266,268,272,273,274,275,279,280,281,283,284,285,287,288,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,329,333,339,340,341,344,347,348,349,361,368,370,380,382,383,385,387,396,398,399,400,433,435,445,446,447,455,459,460,461,462,464,465,466,467,469,472,477,478,483,484,485,492,493,495,496,499,509,511,513,517,520,522,524,527,528,530,],[-68,-117,-118,-119,-83,-69,-310,-27,-28,-166,-308,207,207,-310,207,-310,-28,207,-167,-309,207,-200,-198,-199,-72,-73,-74,-75,-76,-77,-78,207,207,207,207,207,207,207,207,-266,-267,-268,-265,-269,-270,-310,207,-310,-28,-266,207,207,-310,207,207,-202,-201,207,207,207,-218,207,207,207,207,207,-80,207,-214,-215,-217,207,-224,-225,-226,-227,-228,-229,-230,-231,-232,-233,-234,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,-11,207,-12,207,-266,207,207,-310,207,207,207,-203,207,-205,207,-79,207,-213,-216,-310,-182,207,-310,-28,-266,-204,207,207,-310,207,207,207,207,207,207,207,-11,-266,207,207,-206,-80,-208,-209,207,207,-310,207,207,-207,-210,207,207,-212,-211,]),'WCHAR_CONST':([14,45,46,47,77,78,79,95,96,97,101,106,113,114,116,117,118,130,133,144,152,153,154,155,156,157,158,159,160,161,162,164,168,172,177,183,184,185,187,188,189,190,191,193,194,216,217,218,219,223,226,227,240,249,263,265,266,268,272,273,274,275,279,280,281,283,284,285,287,288,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,329,333,339,340,341,344,347,348,349,361,368,370,380,382,383,385,387,396,398,399,400,433,435,445,446,447,455,459,460,461,462,464,465,466,467,469,472,477,478,483,484,485,492,493,495,496,499,509,511,513,517,520,522,524,527,528,530,],[-68,-117,-118,-119,-83,-69,-310,-27,-28,-166,-308,208,208,-310,208,-310,-28,208,-167,-309,208,-200,-198,-199,-72,-73,-74,-75,-76,-77,-78,208,208,208,208,208,208,208,208,-266,-267,-268,-265,-269,-270,-310,208,-310,-28,-266,208,208,-310,208,208,-202,-201,208,208,208,-218,208,208,208,208,208,-80,208,-214,-215,-217,208,-224,-225,-226,-227,-228,-229,-230,-231,-232,-233,-234,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,-11,208,-12,208,-266,208,208,-310,208,208,208,-203,208,-205,208,-79,208,-213,-216,-310,-182,208,-310,-28,-266,-204,208,208,-310,208,208,208,208,208,208,208,-11,-266,208,208,-206,-80,-208,-209,208,208,-310,208,208,-207,-210,208,208,-212,-211,]),'STRING_LITERAL':([14,45,46,47,77,78,79,95,96,97,101,106,113,114,116,117,118,130,133,144,152,153,154,155,156,157,158,159,160,161,162,164,168,172,177,183,184,185,187,188,189,190,191,193,194,197,209,216,217,218,219,223,226,227,240,249,263,265,266,268,272,273,274,275,279,280,281,283,284,285,287,288,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,329,333,334,339,340,341,344,347,348,349,361,368,370,380,382,383,385,387,396,398,399,400,433,435,445,446,447,455,459,460,461,462,464,465,466,467,469,472,477,478,483,484,485,492,493,495,496,499,509,511,513,517,520,522,524,527,528,530,],[-68,-117,-118,-119,-83,-69,-310,-27,-28,-166,-308,209,209,-310,209,-310,-28,209,-167,-309,209,-200,-198,-199,-72,-73,-74,-75,-76,-77,-78,209,209,209,209,209,209,209,209,-266,-267,-268,-265,-269,-270,334,-304,-310,209,-310,-28,-266,209,209,-310,209,209,-202,-201,209,209,209,-218,209,209,209,209,209,-80,209,-214,-215,-217,209,-224,-225,-226,-227,-228,-229,-230,-231,-232,-233,-234,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,-305,-11,209,-12,209,-266,209,209,-310,209,209,209,-203,209,-205,209,-79,209,-213,-216,-310,-182,209,-310,-28,-266,-204,209,209,-310,209,209,209,209,209,209,209,-11,-266,209,209,-206,-80,-208,-209,209,209,-310,209,209,-207,-210,209,209,-212,-211,]),'WSTRING_LITERAL':([14,45,46,47,77,78,79,95,96,97,101,106,113,114,116,117,118,130,133,144,152,153,154,155,156,157,158,159,160,161,162,164,168,172,177,183,184,185,187,188,189,190,191,193,194,198,210,216,217,218,219,223,226,227,240,249,263,265,266,268,272,273,274,275,279,280,281,283,284,285,287,288,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,329,333,335,339,340,341,344,347,348,349,361,368,370,380,382,383,385,387,396,398,399,400,433,435,445,446,447,455,459,460,461,462,464,465,466,467,469,472,477,478,483,484,485,492,493,495,496,499,509,511,513,517,520,522,524,527,528,530,],[-68,-117,-118,-119,-83,-69,-310,-27,-28,-166,-308,210,210,-310,210,-310,-28,210,-167,-309,210,-200,-198,-199,-72,-73,-74,-75,-76,-77,-78,210,210,210,210,210,210,210,210,-266,-267,-268,-265,-269,-270,335,-306,-310,210,-310,-28,-266,210,210,-310,210,210,-202,-201,210,210,210,-218,210,210,210,210,210,-80,210,-214,-215,-217,210,-224,-225,-226,-227,-228,-229,-230,-231,-232,-233,-234,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,-307,-11,210,-12,210,-266,210,210,-310,210,210,210,-203,210,-205,210,-79,210,-213,-216,-310,-182,210,-310,-28,-266,-204,210,210,-310,210,210,210,210,210,210,210,-11,-266,210,210,-206,-80,-208,-209,210,210,-310,210,210,-207,-210,210,210,-212,-211,]),'ELSE':([14,78,144,156,157,158,159,160,161,162,265,274,283,284,287,288,290,382,385,396,399,400,459,492,493,495,496,520,522,528,530,],[-68,-69,-309,-72,-73,-74,-75,-76,-77,-78,-202,-218,-78,-80,-214,-215,-217,-203,-205,-79,-213,-216,-204,-206,509,-208,-209,-207,-210,-212,-211,]),'PPPRAGMASTR':([14,],[78,]),'EQUALS':([15,23,62,73,74,75,76,81,92,108,110,127,131,138,144,163,180,182,192,195,196,197,198,200,201,202,203,204,205,206,207,208,209,210,213,228,229,271,326,327,328,330,331,332,334,335,342,343,350,351,352,353,388,423,425,426,427,428,436,438,439,440,443,444,463,470,471,474,479,480,481,510,515,521,],[-52,-29,-162,113,-163,-54,-37,-53,130,-162,-55,-294,-30,249,-309,-294,292,-259,-271,-283,-284,-285,-286,-295,-296,-297,-298,-299,-300,-301,-302,-303,-304,-306,-38,-35,-36,-257,-279,-280,-260,-261,-262,-263,-305,-307,435,-183,-43,-44,-31,-34,-287,-274,-275,-276,-277,-278,-184,-186,-39,-42,-32,-33,-258,-272,-273,-264,-185,-40,-41,-281,-288,-282,]),'COMMA':([15,20,21,23,25,26,27,28,29,30,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,62,63,64,65,66,70,72,73,74,75,76,81,87,90,91,92,94,95,96,97,98,99,102,103,108,110,121,123,124,125,126,127,131,132,133,136,137,138,142,144,148,163,169,178,179,180,181,182,186,192,195,196,197,198,200,201,202,203,204,205,206,207,208,209,210,212,213,214,215,228,229,232,233,234,235,236,237,238,241,242,243,244,245,246,247,248,251,253,254,257,258,260,261,262,264,270,271,277,278,289,326,327,328,330,331,332,334,335,338,350,351,352,353,357,358,359,360,372,373,374,375,376,377,381,386,388,389,390,392,393,394,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,431,432,434,439,440,443,444,450,451,453,457,458,463,470,471,474,476,480,481,486,487,488,489,490,491,494,497,500,501,504,505,506,510,515,518,519,521,526,],[-52,-116,-93,-29,-97,-310,-113,-114,-115,-221,-101,-102,-103,-104,-105,-106,-107,-108,-109,-110,-111,-112,-117,-118,-119,-95,-96,-98,-99,-100,-162,-89,-90,-91,-92,111,-120,-122,-163,-54,-37,-53,-94,129,-124,-126,-164,-27,-28,-166,-152,-153,-132,-133,-162,-55,230,231,-170,-175,-310,-294,-30,-165,-167,248,-157,-160,-135,-309,-130,-294,279,-219,-222,-257,-236,-259,-238,-271,-283,-284,-285,-286,-295,-296,-297,-298,-299,-300,-301,-302,-303,-304,-306,-121,-38,-123,-177,-35,-36,-172,-173,-174,-188,-56,-1,-2,-45,-190,-125,-127,248,248,-154,-158,-137,-139,-134,-128,-129,379,-147,-149,-131,-235,-257,279,-310,279,-279,-280,-260,-261,-262,-263,-305,-307,433,-43,-44,-31,-34,-171,-176,-57,-189,-155,-156,-159,-161,-136,-138,-151,279,-287,-187,-188,-220,279,279,-223,279,-239,-240,-241,-242,-243,-244,-245,-246,-247,-248,-249,-250,-251,-252,-253,-254,-255,-256,279,472,-274,-292,-275,-276,-277,-278,475,-178,-180,-39,-42,-32,-33,-191,-197,-195,-148,-150,-258,-272,-273,-264,-179,-40,-41,-50,-51,-193,-192,-194,-196,511,279,-237,-293,-181,-46,-49,-281,-288,-47,-48,-282,279,]),'RPAREN':([15,20,21,23,25,26,27,28,29,30,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,63,64,65,66,75,76,80,81,87,93,94,95,96,97,98,99,102,103,110,112,115,119,120,121,122,123,124,125,126,127,131,132,133,142,144,148,169,178,179,180,181,182,186,192,195,196,197,198,200,201,202,203,204,205,206,207,208,209,210,213,220,221,228,229,232,233,234,235,236,237,238,239,241,242,247,251,253,254,257,258,264,267,271,276,277,278,323,326,327,328,330,331,332,334,335,350,351,352,353,356,357,358,359,360,362,363,364,365,366,367,371,372,373,376,377,384,386,388,389,390,391,392,393,394,401,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,422,423,424,425,426,427,428,429,430,439,440,443,444,448,449,450,451,453,456,463,470,471,474,480,481,486,487,488,489,490,491,497,499,500,501,502,503,505,506,510,513,514,515,518,519,521,523,525,529,],[-52,-116,-93,-29,-97,-310,-113,-114,-115,-221,-101,-102,-103,-104,-105,-106,-107,-108,-109,-110,-111,-112,-117,-118,-119,-95,-96,-98,-99,-100,-89,-90,-91,-92,-54,-37,-310,-53,-94,131,-164,-27,-28,-166,-152,-153,-132,-133,-55,213,-310,228,229,-168,-17,-18,-170,-175,-310,-294,-30,-165,-167,-135,-309,-130,-14,-219,-222,-257,-236,-259,-238,-271,-283,-284,-285,-286,-295,-296,-297,-298,-299,-300,-301,-302,-303,-304,-306,-38,350,351,-35,-36,-172,-173,-174,-188,-56,-1,-2,-310,-45,-190,-154,-137,-139,-134,-128,-129,-131,-13,-257,387,388,-310,423,-279,-280,-260,-261,-262,-263,-305,-307,-43,-44,-31,-34,-169,-171,-176,-57,-189,-310,450,451,-188,-23,-24,-310,-155,-156,-136,-138,460,461,-287,-187,-188,-310,-220,464,465,-223,-239,-240,-241,-242,-243,-244,-245,-246,-247,-248,-249,-250,-251,-252,-253,-254,-255,-256,471,-274,-292,-275,-276,-277,-278,473,474,-39,-42,-32,-33,486,487,-191,-197,-195,491,-258,-272,-273,-264,-40,-41,-50,-51,-193,-192,-194,-196,512,-310,-237,-293,515,-289,-46,-49,-281,-310,524,-288,-47,-48,-282,527,-290,-291,]),'COLON':([15,20,23,27,28,29,30,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,74,75,76,81,98,99,102,103,108,110,127,131,142,144,145,148,163,165,178,179,180,181,182,186,192,195,196,197,198,200,201,202,203,204,205,206,207,208,209,210,213,228,229,247,251,253,254,257,258,262,264,269,270,271,326,327,328,330,331,332,334,335,350,351,352,353,372,373,376,377,379,388,392,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,423,425,426,427,428,439,440,443,444,463,470,471,474,480,481,500,510,515,521,],[-52,-116,-29,-113,-114,-115,-221,-101,-102,-103,-104,-105,-106,-107,-108,-109,-110,-111,-112,-117,-118,-119,-163,-54,-37,-53,-152,-153,-132,-133,-162,-55,-294,-30,-135,-309,263,-130,268,273,-219,-222,-257,-236,-259,-238,-271,-283,-284,-285,-286,-295,-296,-297,-298,-299,-300,-301,-302,-303,-304,-306,-38,-35,-36,-154,-137,-139,-134,-128,-129,380,-131,383,-235,-257,-279,-280,-260,-261,-262,-263,-305,-307,-43,-44,-31,-34,-155,-156,-136,-138,263,-287,-220,-223,469,-239,-240,-241,-242,-243,-244,-245,-246,-247,-248,-249,-250,-251,-252,-253,-254,-255,-256,-274,-275,-276,-277,-278,-39,-42,-32,-33,-258,-272,-273,-264,-40,-41,-237,-281,-288,-282,]),'LBRACKET':([15,20,21,23,25,26,27,28,29,30,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,63,64,65,66,75,76,81,87,94,95,96,97,98,99,101,102,103,110,126,127,131,132,133,142,144,148,163,182,192,195,196,197,198,200,201,202,203,204,205,206,207,208,209,210,213,216,228,229,235,236,239,241,242,247,251,253,254,257,258,264,278,326,327,334,335,342,343,350,351,352,353,359,360,365,372,373,376,377,388,390,391,423,425,426,427,428,433,436,438,439,440,443,444,450,451,453,462,470,471,479,480,481,486,487,488,489,490,491,502,503,505,506,510,511,515,518,519,521,525,529,],[79,-116,-93,-29,-97,-310,-113,-114,-115,-221,-101,-102,-103,-104,-105,-106,-107,-108,-109,-110,-111,-112,-117,-118,-119,-95,-96,-98,-99,-100,-89,-90,-91,-92,114,-37,79,-94,-164,-27,-28,-166,-152,-153,-308,-132,-133,114,240,-294,-30,-165,-167,-135,-309,-130,-294,322,-271,-283,-284,-285,-286,-295,-296,-297,-298,-299,-300,-301,-302,-303,-304,-306,-38,344,-35,-36,240,361,240,-45,370,-154,-137,-139,-134,-128,-129,-131,240,-279,-280,-305,-307,344,-183,-43,-44,-31,-34,361,370,240,-155,-156,-136,-138,-287,240,240,-274,-275,-276,-277,-278,344,-184,-186,-39,-42,-32,-33,-191,-197,-195,344,-272,-273,-185,-40,-41,-50,-51,-193,-192,-194,-196,517,-289,-46,-49,-281,344,-288,-47,-48,-282,-290,-291,]),'RBRACKET':([45,46,47,79,95,96,97,114,116,118,127,133,144,178,179,180,181,182,186,192,195,196,197,198,200,201,202,203,204,205,206,207,208,209,210,217,219,222,223,224,225,240,270,271,326,327,328,330,331,332,334,335,346,347,354,355,361,368,369,370,388,392,401,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,423,425,426,427,428,437,441,442,445,447,452,454,455,463,470,471,474,482,483,500,507,508,510,515,521,526,],[-117,-118,-119,-310,-27,-28,-166,-310,-310,-28,-294,-167,-309,-219,-222,-257,-236,-259,-238,-271,-283,-284,-285,-286,-295,-296,-297,-298,-299,-300,-301,-302,-303,-304,-306,-310,-28,352,353,-3,-4,-310,-235,-257,-279,-280,-260,-261,-262,-263,-305,-307,439,440,443,444,-310,-310,453,-310,-287,-220,-223,-239,-240,-241,-242,-243,-244,-245,-246,-247,-248,-249,-250,-251,-252,-253,-254,-255,-256,470,-274,-275,-276,-277,-278,479,480,481,-310,-28,488,489,490,-258,-272,-273,-264,505,506,-237,518,519,-281,-288,-282,529,]),'PERIOD':([101,127,144,163,182,192,195,196,197,198,200,201,202,203,204,205,206,207,208,209,210,216,326,327,334,335,342,343,388,423,425,426,427,428,433,436,438,462,470,471,479,502,503,510,511,515,521,525,529,],[-308,-294,-309,-294,324,-271,-283,-284,-285,-286,-295,-296,-297,-298,-299,-300,-301,-302,-303,-304,-306,345,-279,-280,-305,-307,345,-183,-287,-274,-275,-276,-277,-278,345,-184,-186,345,-272,-273,-185,516,-289,-281,345,-288,-282,-290,-291,]),'ARROW':([127,144,163,182,192,195,196,197,198,200,201,202,203,204,205,206,207,208,209,210,326,327,334,335,388,423,425,426,427,428,470,471,510,515,521,],[-294,-309,-294,325,-271,-283,-284,-285,-286,-295,-296,-297,-298,-299,-300,-301,-302,-303,-304,-306,-279,-280,-305,-307,-287,-274,-275,-276,-277,-278,-272,-273,-281,-288,-282,]),'XOREQUAL':([127,144,163,180,182,192,195,196,197,198,200,201,202,203,204,205,206,207,208,209,210,271,326,327,328,330,331,332,334,335,388,423,425,426,427,428,463,470,471,474,510,515,521,],[-294,-309,-294,293,-259,-271,-283,-284,-285,-286,-295,-296,-297,-298,-299,-300,-301,-302,-303,-304,-306,-257,-279,-280,-260,-261,-262,-263,-305,-307,-287,-274,-275,-276,-277,-278,-258,-272,-273,-264,-281,-288,-282,]),'TIMESEQUAL':([127,144,163,180,182,192,195,196,197,198,200,201,202,203,204,205,206,207,208,209,210,271,326,327,328,330,331,332,334,335,388,423,425,426,427,428,463,470,471,474,510,515,521,],[-294,-309,-294,294,-259,-271,-283,-284,-285,-286,-295,-296,-297,-298,-299,-300,-301,-302,-303,-304,-306,-257,-279,-280,-260,-261,-262,-263,-305,-307,-287,-274,-275,-276,-277,-278,-258,-272,-273,-264,-281,-288,-282,]),'DIVEQUAL':([127,144,163,180,182,192,195,196,197,198,200,201,202,203,204,205,206,207,208,209,210,271,326,327,328,330,331,332,334,335,388,423,425,426,427,428,463,470,471,474,510,515,521,],[-294,-309,-294,295,-259,-271,-283,-284,-285,-286,-295,-296,-297,-298,-299,-300,-301,-302,-303,-304,-306,-257,-279,-280,-260,-261,-262,-263,-305,-307,-287,-274,-275,-276,-277,-278,-258,-272,-273,-264,-281,-288,-282,]),'MODEQUAL':([127,144,163,180,182,192,195,196,197,198,200,201,202,203,204,205,206,207,208,209,210,271,326,327,328,330,331,332,334,335,388,423,425,426,427,428,463,470,471,474,510,515,521,],[-294,-309,-294,296,-259,-271,-283,-284,-285,-286,-295,-296,-297,-298,-299,-300,-301,-302,-303,-304,-306,-257,-279,-280,-260,-261,-262,-263,-305,-307,-287,-274,-275,-276,-277,-278,-258,-272,-273,-264,-281,-288,-282,]),'PLUSEQUAL':([127,144,163,180,182,192,195,196,197,198,200,201,202,203,204,205,206,207,208,209,210,271,326,327,328,330,331,332,334,335,388,423,425,426,427,428,463,470,471,474,510,515,521,],[-294,-309,-294,297,-259,-271,-283,-284,-285,-286,-295,-296,-297,-298,-299,-300,-301,-302,-303,-304,-306,-257,-279,-280,-260,-261,-262,-263,-305,-307,-287,-274,-275,-276,-277,-278,-258,-272,-273,-264,-281,-288,-282,]),'MINUSEQUAL':([127,144,163,180,182,192,195,196,197,198,200,201,202,203,204,205,206,207,208,209,210,271,326,327,328,330,331,332,334,335,388,423,425,426,427,428,463,470,471,474,510,515,521,],[-294,-309,-294,298,-259,-271,-283,-284,-285,-286,-295,-296,-297,-298,-299,-300,-301,-302,-303,-304,-306,-257,-279,-280,-260,-261,-262,-263,-305,-307,-287,-274,-275,-276,-277,-278,-258,-272,-273,-264,-281,-288,-282,]),'LSHIFTEQUAL':([127,144,163,180,182,192,195,196,197,198,200,201,202,203,204,205,206,207,208,209,210,271,326,327,328,330,331,332,334,335,388,423,425,426,427,428,463,470,471,474,510,515,521,],[-294,-309,-294,299,-259,-271,-283,-284,-285,-286,-295,-296,-297,-298,-299,-300,-301,-302,-303,-304,-306,-257,-279,-280,-260,-261,-262,-263,-305,-307,-287,-274,-275,-276,-277,-278,-258,-272,-273,-264,-281,-288,-282,]),'RSHIFTEQUAL':([127,144,163,180,182,192,195,196,197,198,200,201,202,203,204,205,206,207,208,209,210,271,326,327,328,330,331,332,334,335,388,423,425,426,427,428,463,470,471,474,510,515,521,],[-294,-309,-294,300,-259,-271,-283,-284,-285,-286,-295,-296,-297,-298,-299,-300,-301,-302,-303,-304,-306,-257,-279,-280,-260,-261,-262,-263,-305,-307,-287,-274,-275,-276,-277,-278,-258,-272,-273,-264,-281,-288,-282,]),'ANDEQUAL':([127,144,163,180,182,192,195,196,197,198,200,201,202,203,204,205,206,207,208,209,210,271,326,327,328,330,331,332,334,335,388,423,425,426,427,428,463,470,471,474,510,515,521,],[-294,-309,-294,301,-259,-271,-283,-284,-285,-286,-295,-296,-297,-298,-299,-300,-301,-302,-303,-304,-306,-257,-279,-280,-260,-261,-262,-263,-305,-307,-287,-274,-275,-276,-277,-278,-258,-272,-273,-264,-281,-288,-282,]),'OREQUAL':([127,144,163,180,182,192,195,196,197,198,200,201,202,203,204,205,206,207,208,209,210,271,326,327,328,330,331,332,334,335,388,423,425,426,427,428,463,470,471,474,510,515,521,],[-294,-309,-294,302,-259,-271,-283,-284,-285,-286,-295,-296,-297,-298,-299,-300,-301,-302,-303,-304,-306,-257,-279,-280,-260,-261,-262,-263,-305,-307,-287,-274,-275,-276,-277,-278,-258,-272,-273,-264,-281,-288,-282,]),'CONDOP':([127,144,163,180,181,182,186,192,195,196,197,198,200,201,202,203,204,205,206,207,208,209,210,271,326,327,328,330,331,332,334,335,388,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,423,425,426,427,428,463,470,471,474,510,515,521,],[-294,-309,-294,-257,303,-259,-238,-271,-283,-284,-285,-286,-295,-296,-297,-298,-299,-300,-301,-302,-303,-304,-306,-257,-279,-280,-260,-261,-262,-263,-305,-307,-287,-239,-240,-241,-242,-243,-244,-245,-246,-247,-248,-249,-250,-251,-252,-253,-254,-255,-256,-274,-275,-276,-277,-278,-258,-272,-273,-264,-281,-288,-282,]),'DIVIDE':([127,144,163,180,181,182,186,192,195,196,197,198,200,201,202,203,204,205,206,207,208,209,210,271,326,327,328,330,331,332,334,335,388,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,423,425,426,427,428,463,470,471,474,510,515,521,],[-294,-309,-294,-257,305,-259,-238,-271,-283,-284,-285,-286,-295,-296,-297,-298,-299,-300,-301,-302,-303,-304,-306,-257,-279,-280,-260,-261,-262,-263,-305,-307,-287,-239,-240,-241,305,305,305,305,305,305,305,305,305,305,305,305,305,305,305,-274,-275,-276,-277,-278,-258,-272,-273,-264,-281,-288,-282,]),'MOD':([127,144,163,180,181,182,186,192,195,196,197,198,200,201,202,203,204,205,206,207,208,209,210,271,326,327,328,330,331,332,334,335,388,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,423,425,426,427,428,463,470,471,474,510,515,521,],[-294,-309,-294,-257,306,-259,-238,-271,-283,-284,-285,-286,-295,-296,-297,-298,-299,-300,-301,-302,-303,-304,-306,-257,-279,-280,-260,-261,-262,-263,-305,-307,-287,-239,-240,-241,306,306,306,306,306,306,306,306,306,306,306,306,306,306,306,-274,-275,-276,-277,-278,-258,-272,-273,-264,-281,-288,-282,]),'RSHIFT':([127,144,163,180,181,182,186,192,195,196,197,198,200,201,202,203,204,205,206,207,208,209,210,271,326,327,328,330,331,332,334,335,388,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,423,425,426,427,428,463,470,471,474,510,515,521,],[-294,-309,-294,-257,309,-259,-238,-271,-283,-284,-285,-286,-295,-296,-297,-298,-299,-300,-301,-302,-303,-304,-306,-257,-279,-280,-260,-261,-262,-263,-305,-307,-287,-239,-240,-241,-242,-243,-244,-245,309,309,309,309,309,309,309,309,309,309,309,-274,-275,-276,-277,-278,-258,-272,-273,-264,-281,-288,-282,]),'LSHIFT':([127,144,163,180,181,182,186,192,195,196,197,198,200,201,202,203,204,205,206,207,208,209,210,271,326,327,328,330,331,332,334,335,388,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,423,425,426,427,428,463,470,471,474,510,515,521,],[-294,-309,-294,-257,310,-259,-238,-271,-283,-284,-285,-286,-295,-296,-297,-298,-299,-300,-301,-302,-303,-304,-306,-257,-279,-280,-260,-261,-262,-263,-305,-307,-287,-239,-240,-241,-242,-243,-244,-245,310,310,310,310,310,310,310,310,310,310,310,-274,-275,-276,-277,-278,-258,-272,-273,-264,-281,-288,-282,]),'LT':([127,144,163,180,181,182,186,192,195,196,197,198,200,201,202,203,204,205,206,207,208,209,210,271,326,327,328,330,331,332,334,335,388,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,423,425,426,427,428,463,470,471,474,510,515,521,],[-294,-309,-294,-257,311,-259,-238,-271,-283,-284,-285,-286,-295,-296,-297,-298,-299,-300,-301,-302,-303,-304,-306,-257,-279,-280,-260,-261,-262,-263,-305,-307,-287,-239,-240,-241,-242,-243,-244,-245,-246,-247,-248,-249,311,311,311,311,311,311,311,-274,-275,-276,-277,-278,-258,-272,-273,-264,-281,-288,-282,]),'LE':([127,144,163,180,181,182,186,192,195,196,197,198,200,201,202,203,204,205,206,207,208,209,210,271,326,327,328,330,331,332,334,335,388,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,423,425,426,427,428,463,470,471,474,510,515,521,],[-294,-309,-294,-257,312,-259,-238,-271,-283,-284,-285,-286,-295,-296,-297,-298,-299,-300,-301,-302,-303,-304,-306,-257,-279,-280,-260,-261,-262,-263,-305,-307,-287,-239,-240,-241,-242,-243,-244,-245,-246,-247,-248,-249,312,312,312,312,312,312,312,-274,-275,-276,-277,-278,-258,-272,-273,-264,-281,-288,-282,]),'GE':([127,144,163,180,181,182,186,192,195,196,197,198,200,201,202,203,204,205,206,207,208,209,210,271,326,327,328,330,331,332,334,335,388,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,423,425,426,427,428,463,470,471,474,510,515,521,],[-294,-309,-294,-257,313,-259,-238,-271,-283,-284,-285,-286,-295,-296,-297,-298,-299,-300,-301,-302,-303,-304,-306,-257,-279,-280,-260,-261,-262,-263,-305,-307,-287,-239,-240,-241,-242,-243,-244,-245,-246,-247,-248,-249,313,313,313,313,313,313,313,-274,-275,-276,-277,-278,-258,-272,-273,-264,-281,-288,-282,]),'GT':([127,144,163,180,181,182,186,192,195,196,197,198,200,201,202,203,204,205,206,207,208,209,210,271,326,327,328,330,331,332,334,335,388,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,423,425,426,427,428,463,470,471,474,510,515,521,],[-294,-309,-294,-257,314,-259,-238,-271,-283,-284,-285,-286,-295,-296,-297,-298,-299,-300,-301,-302,-303,-304,-306,-257,-279,-280,-260,-261,-262,-263,-305,-307,-287,-239,-240,-241,-242,-243,-244,-245,-246,-247,-248,-249,314,314,314,314,314,314,314,-274,-275,-276,-277,-278,-258,-272,-273,-264,-281,-288,-282,]),'EQ':([127,144,163,180,181,182,186,192,195,196,197,198,200,201,202,203,204,205,206,207,208,209,210,271,326,327,328,330,331,332,334,335,388,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,423,425,426,427,428,463,470,471,474,510,515,521,],[-294,-309,-294,-257,315,-259,-238,-271,-283,-284,-285,-286,-295,-296,-297,-298,-299,-300,-301,-302,-303,-304,-306,-257,-279,-280,-260,-261,-262,-263,-305,-307,-287,-239,-240,-241,-242,-243,-244,-245,-246,-247,-248,-249,-250,-251,315,315,315,315,315,-274,-275,-276,-277,-278,-258,-272,-273,-264,-281,-288,-282,]),'NE':([127,144,163,180,181,182,186,192,195,196,197,198,200,201,202,203,204,205,206,207,208,209,210,271,326,327,328,330,331,332,334,335,388,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,423,425,426,427,428,463,470,471,474,510,515,521,],[-294,-309,-294,-257,316,-259,-238,-271,-283,-284,-285,-286,-295,-296,-297,-298,-299,-300,-301,-302,-303,-304,-306,-257,-279,-280,-260,-261,-262,-263,-305,-307,-287,-239,-240,-241,-242,-243,-244,-245,-246,-247,-248,-249,-250,-251,316,316,316,316,316,-274,-275,-276,-277,-278,-258,-272,-273,-264,-281,-288,-282,]),'OR':([127,144,163,180,181,182,186,192,195,196,197,198,200,201,202,203,204,205,206,207,208,209,210,271,326,327,328,330,331,332,334,335,388,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,423,425,426,427,428,463,470,471,474,510,515,521,],[-294,-309,-294,-257,318,-259,-238,-271,-283,-284,-285,-286,-295,-296,-297,-298,-299,-300,-301,-302,-303,-304,-306,-257,-279,-280,-260,-261,-262,-263,-305,-307,-287,-239,-240,-241,-242,-243,-244,-245,-246,-247,-248,-249,-250,-251,-252,-253,-254,318,318,-274,-275,-276,-277,-278,-258,-272,-273,-264,-281,-288,-282,]),'XOR':([127,144,163,180,181,182,186,192,195,196,197,198,200,201,202,203,204,205,206,207,208,209,210,271,326,327,328,330,331,332,334,335,388,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,423,425,426,427,428,463,470,471,474,510,515,521,],[-294,-309,-294,-257,319,-259,-238,-271,-283,-284,-285,-286,-295,-296,-297,-298,-299,-300,-301,-302,-303,-304,-306,-257,-279,-280,-260,-261,-262,-263,-305,-307,-287,-239,-240,-241,-242,-243,-244,-245,-246,-247,-248,-249,-250,-251,-252,319,-254,319,319,-274,-275,-276,-277,-278,-258,-272,-273,-264,-281,-288,-282,]),'LAND':([127,144,163,180,181,182,186,192,195,196,197,198,200,201,202,203,204,205,206,207,208,209,210,271,326,327,328,330,331,332,334,335,388,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,423,425,426,427,428,463,470,471,474,510,515,521,],[-294,-309,-294,-257,320,-259,-238,-271,-283,-284,-285,-286,-295,-296,-297,-298,-299,-300,-301,-302,-303,-304,-306,-257,-279,-280,-260,-261,-262,-263,-305,-307,-287,-239,-240,-241,-242,-243,-244,-245,-246,-247,-248,-249,-250,-251,-252,-253,-254,-255,320,-274,-275,-276,-277,-278,-258,-272,-273,-264,-281,-288,-282,]),'LOR':([127,144,163,180,181,182,186,192,195,196,197,198,200,201,202,203,204,205,206,207,208,209,210,271,326,327,328,330,331,332,334,335,388,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,423,425,426,427,428,463,470,471,474,510,515,521,],[-294,-309,-294,-257,321,-259,-238,-271,-283,-284,-285,-286,-295,-296,-297,-298,-299,-300,-301,-302,-303,-304,-306,-257,-279,-280,-260,-261,-262,-263,-305,-307,-287,-239,-240,-241,-242,-243,-244,-245,-246,-247,-248,-249,-250,-251,-252,-253,-254,-255,-256,-274,-275,-276,-277,-278,-258,-272,-273,-264,-281,-288,-282,]),'ELLIPSIS':([230,],[356,]),} -_lr_action = { } +_lr_action = {} for _k, _v in _lr_action_items.items(): for _x,_y in zip(_v[0],_v[1]): - if not _x in _lr_action: _lr_action[_x] = { } + if not _x in _lr_action: _lr_action[_x] = {} _lr_action[_x][_k] = _y del _lr_action_items -_lr_goto_items = {'storage_class_specifier':([0,1,14,22,42,44,48,66,78,80,89,165,167,170,204,289,338,373,],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,]),'identifier_list_opt':([66,],[106,]),'selection_statement':([170,289,297,375,384,411,423,425,427,441,443,446,],[298,298,298,298,298,298,298,298,298,298,298,298,]),'constant':([72,77,103,127,134,137,141,142,162,164,170,181,192,195,196,213,219,226,227,230,233,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,264,266,281,288,289,297,309,335,336,373,375,376,380,384,385,393,395,400,402,408,411,421,423,425,426,427,432,438,441,443,446,],[126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,]),'unary_expression':([72,77,103,127,134,137,141,142,162,164,170,181,192,195,196,213,219,226,227,230,233,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,264,266,281,288,289,297,309,335,336,373,375,376,380,384,385,393,395,400,402,408,411,421,423,425,426,427,432,438,441,443,446,],[120,120,120,220,231,234,120,240,120,120,120,231,231,120,120,120,120,120,120,120,120,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,120,231,231,231,120,120,231,120,120,231,120,231,120,120,120,120,120,120,120,231,231,120,120,120,120,120,120,120,120,120,120,120,120,120,]),'conditional_expression':([72,77,103,141,162,164,170,181,192,195,196,213,219,226,227,230,233,257,264,266,281,288,289,297,309,335,373,375,376,380,384,385,393,400,402,408,411,421,423,425,426,427,432,438,441,443,446,],[151,151,151,151,151,151,151,305,305,151,151,151,151,151,151,151,151,151,305,151,151,305,151,151,305,151,151,151,151,151,151,151,151,419,151,151,151,151,151,151,151,151,151,151,151,151,151,]),'brace_close':([93,101,172,173,188,189,261,299,362,418,429,],[174,191,302,303,310,311,359,383,404,430,437,]),'struct_or_union_specifier':([0,1,14,22,42,44,48,57,66,78,80,89,91,92,93,94,96,141,165,167,170,172,173,204,219,229,230,233,289,338,373,],[5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,]),'unified_wstring_literal':([72,77,103,127,134,137,141,142,162,164,170,181,192,195,196,213,219,226,227,230,233,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,264,266,281,288,289,297,309,335,336,373,375,376,380,384,385,393,395,400,402,408,411,421,423,425,426,427,432,438,441,443,446,],[121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,]),'abstract_declarator_opt':([110,239,],[199,337,]),'iteration_statement':([170,289,297,375,384,411,423,425,427,441,443,446,],[277,277,277,277,277,277,277,277,277,277,277,277,]),'init_declarator_list':([30,86,],[71,71,]),'translation_unit_or_empty':([0,],[8,]),'struct_declaration_list':([57,91,92,],[93,172,173,]),'block_item_list_opt':([170,],[299,]),'enumerator':([64,98,99,190,],[100,100,100,312,]),'pp_directive':([0,22,],[11,11,]),'abstract_declarator':([30,78,86,97,110,167,239,338,],[79,161,79,185,201,161,201,161,]),'declaration_specifiers_opt':([1,14,42,44,],[50,58,83,84,]),'external_declaration':([0,22,],[12,61,]),'type_specifier':([0,1,14,22,42,44,48,57,66,78,80,89,91,92,93,94,96,141,165,167,170,172,173,204,219,229,230,233,289,338,373,],[14,14,14,14,14,14,14,94,14,14,14,14,94,94,94,94,94,94,14,14,14,94,94,14,94,94,94,94,14,14,14,]),'designation':([155,362,399,429,],[260,260,260,260,]),'compound_statement':([88,163,170,289,297,375,384,411,423,425,427,441,443,446,],[169,272,282,282,282,282,282,282,282,282,282,282,282,282,]),'pointer':([0,4,22,30,68,78,86,97,110,117,167,239,306,338,],[16,16,16,74,116,74,166,166,74,16,166,339,16,339,]),'type_name':([141,219,229,230,233,],[237,322,331,332,333,]),'unified_string_literal':([72,77,103,127,134,137,141,142,162,164,170,181,192,195,196,213,219,226,227,230,233,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,264,266,281,288,289,297,309,335,336,373,375,376,380,384,385,393,395,400,402,408,411,421,423,425,426,427,432,438,441,443,446,],[129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,]),'postfix_expression':([72,77,103,127,134,137,141,142,162,164,170,181,192,195,196,213,219,226,227,230,233,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,264,266,281,288,289,297,309,335,336,373,375,376,380,384,385,393,395,400,402,408,411,421,423,425,426,427,432,438,441,443,446,],[130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,]),'assignment_expression_opt':([72,103,164,],[131,193,273,]),'designation_opt':([155,362,399,429,],[266,402,266,402,]),'expression_statement':([170,289,297,375,384,411,423,425,427,441,443,446,],[276,276,276,276,276,276,276,276,276,276,276,276,]),'parameter_declaration':([66,78,165,167,204,338,],[109,109,109,109,320,109,]),'initializer_list_opt':([155,],[261,]),'cast_expression':([72,77,103,134,141,162,164,170,181,192,195,196,213,219,226,227,230,233,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,264,266,281,288,289,297,309,335,336,373,375,376,380,384,385,393,395,400,402,408,411,421,423,425,426,427,432,438,441,443,446,],[132,132,132,232,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,398,132,132,132,132,132,132,132,398,132,132,132,132,132,132,132,132,132,132,132,132,132,132,]),'init_declarator':([30,86,117,],[75,75,205,]),'struct_declarator_list':([97,],[182,]),'unary_operator':([72,77,103,127,134,137,141,142,162,164,170,181,192,195,196,213,219,226,227,230,233,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,264,266,281,288,289,297,309,335,336,373,375,376,380,384,385,393,395,400,402,408,411,421,423,425,426,427,432,438,441,443,446,],[134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,]),'brace_open':([7,24,54,56,62,63,77,88,162,163,170,266,289,297,336,375,384,390,395,396,402,411,423,425,427,441,443,446,],[57,64,91,92,98,99,155,170,155,170,170,155,170,170,399,170,170,399,399,399,155,170,170,170,170,170,170,170,]),'assignment_operator':([120,],[213,]),'struct_or_union':([0,1,14,22,42,44,48,57,66,78,80,89,91,92,93,94,96,141,165,167,170,172,173,204,219,229,230,233,289,338,373,],[7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,]),'identifier':([66,72,77,103,127,134,137,141,142,162,164,170,181,192,195,196,203,213,219,226,227,230,233,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,263,264,266,281,288,289,297,309,335,336,373,375,376,380,384,385,393,394,395,400,402,408,411,421,423,425,426,427,432,438,441,443,446,],[114,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,318,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,360,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,417,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,]),'struct_declaration':([57,91,92,93,172,173,],[95,95,95,175,175,175,]),'assignment_expression':([72,77,103,141,162,164,170,195,196,213,219,226,227,230,233,257,266,281,289,297,335,373,375,376,380,384,385,393,402,408,411,421,423,425,426,427,432,438,441,443,446,],[136,156,136,238,156,136,238,316,317,321,238,238,328,238,238,238,156,238,238,238,397,238,238,238,238,238,238,416,156,238,238,238,238,238,238,238,238,238,238,238,238,]),'parameter_type_list':([66,78,165,167,338,],[108,159,159,159,159,]),'type_qualifier_list_opt':([28,65,105,],[68,103,196,]),'direct_declarator':([0,4,16,22,30,74,78,86,97,110,117,166,167,306,],[26,26,60,26,26,60,26,26,26,26,26,60,26,26,]),'type_qualifier_list':([28,65,105,],[67,104,67,]),'designator':([155,267,362,399,429,],[262,364,262,262,262,]),'argument_expression_list':([227,],[330,]),'initializer':([77,162,266,402,],[154,271,363,420,]),'specifier_qualifier_list_opt':([94,96,],[178,180,]),'constant_expression':([181,192,264,288,309,],[304,313,361,377,387,]),'expression_opt':([170,289,297,373,375,384,408,411,421,423,425,427,432,438,441,443,446,],[279,279,279,407,279,279,422,279,431,279,279,279,439,442,279,279,279,]),'primary_expression':([72,77,103,127,134,137,141,142,162,164,170,181,192,195,196,213,219,226,227,230,233,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,264,266,281,288,289,297,309,335,336,373,375,376,380,384,385,393,395,400,402,408,411,421,423,425,426,427,432,438,441,443,446,],[140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,]),'declaration_specifiers':([0,1,14,22,42,44,48,66,78,80,89,165,167,170,204,289,338,373,],[30,52,52,30,52,52,86,110,110,86,86,110,110,86,110,86,110,86,]),'declaration':([0,22,48,80,89,170,289,373,],[31,31,87,87,171,292,292,408,]),'struct_declarator_list_opt':([97,],[183,]),'identifier_list':([66,],[111,]),'typedef_name':([0,1,14,22,42,44,48,57,66,78,80,89,91,92,93,94,96,141,165,167,170,172,173,204,219,229,230,233,289,338,373,],[29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,]),'parameter_type_list_opt':([78,165,167,338,],[160,275,160,160,]),'jump_statement':([170,289,297,375,384,411,423,425,427,441,443,446,],[293,293,293,293,293,293,293,293,293,293,293,293,]),'declaration_list_opt':([48,80,],[88,163,]),'struct_declarator':([97,306,],[184,386,]),'function_definition':([0,22,],[36,36,]),'binary_expression':([72,77,103,141,162,164,170,181,192,195,196,213,219,226,227,230,233,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,264,266,281,288,289,297,309,335,373,375,376,380,384,385,393,400,402,408,411,421,423,425,426,427,432,438,441,443,446,],[147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,147,357,358,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,]),'parameter_list':([66,78,165,167,338,],[113,113,113,113,113,]),'init_declarator_list_opt':([30,86,],[73,73,]),'enum_specifier':([0,1,14,22,42,44,48,57,66,78,80,89,91,92,93,94,96,141,165,167,170,172,173,204,219,229,230,233,289,338,373,],[45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,]),'decl_body':([0,22,48,80,89,170,289,373,],[41,41,41,41,41,41,41,41,]),'type_qualifier':([0,1,14,22,28,42,44,48,57,65,66,67,78,80,89,91,92,93,94,96,104,105,141,165,167,170,172,173,204,219,229,230,233,289,338,373,],[42,42,42,42,69,42,42,42,96,69,42,115,42,42,42,96,96,96,96,96,115,69,96,42,42,42,96,96,42,96,96,96,96,42,42,42,]),'statement':([170,289,297,375,384,411,423,425,427,441,443,446,],[291,291,382,409,414,424,433,434,436,445,447,448,]),'enumerator_list':([64,98,99,],[101,188,189,]),'labeled_statement':([170,289,297,375,384,411,423,425,427,441,443,446,],[280,280,280,280,280,280,280,280,280,280,280,280,]),'function_specifier':([0,1,14,22,42,44,48,66,78,80,89,165,167,170,204,289,338,373,],[44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,]),'specifier_qualifier_list':([57,91,92,93,94,96,141,172,173,219,229,230,233,],[97,97,97,97,179,179,239,97,97,239,239,239,239,]),'block_item':([170,289,],[295,379,]),'block_item_list':([170,],[289,]),'empty':([0,1,14,28,30,42,44,48,65,66,72,78,80,86,94,96,97,103,105,110,155,164,165,167,170,239,289,297,338,362,373,375,384,399,408,411,421,423,425,427,429,432,438,441,443,446,],[47,51,51,70,76,51,51,85,70,107,150,158,85,76,177,177,186,150,70,200,268,150,158,158,296,200,378,378,158,403,378,378,378,403,378,378,378,378,378,378,403,378,378,378,378,378,]),'translation_unit':([0,],[22,]),'initializer_list':([155,399,],[265,418,]),'declarator':([0,4,22,30,78,86,97,110,117,167,306,],[48,53,48,80,53,168,187,202,168,53,187,]),'direct_abstract_declarator':([30,74,78,86,97,110,166,167,239,338,339,],[81,153,81,81,81,81,153,81,81,81,153,]),'designator_list':([155,362,399,429,],[267,267,267,267,]),'declaration_list':([48,80,],[89,89,]),'expression':([141,170,219,226,230,233,257,281,289,297,373,375,376,380,384,385,408,411,421,423,425,426,427,432,438,441,443,446,],[236,285,236,327,236,236,356,372,285,285,285,285,410,412,285,415,285,285,285,285,285,435,285,285,285,285,285,285,]),} +_lr_goto_items = {'translation_unit_or_empty':([0,],[1,]),'translation_unit':([0,],[2,]),'empty':([0,10,11,17,18,19,22,26,60,61,62,79,80,106,114,115,116,117,126,145,152,172,216,217,218,239,240,268,273,278,283,285,361,362,368,370,371,383,391,398,433,445,446,461,462,464,465,467,499,509,511,513,524,527,],[3,57,69,83,83,83,89,95,69,89,57,95,122,151,95,122,224,95,237,259,267,267,339,224,95,366,95,267,267,237,267,267,95,122,224,224,366,267,366,267,478,224,95,267,478,267,267,267,267,267,478,267,267,267,]),'external_declaration':([0,2,],[4,55,]),'function_definition':([0,2,],[5,5,]),'declaration':([0,2,10,58,62,106,152,285,],[6,6,59,107,59,154,154,398,]),'pp_directive':([0,2,],[7,7,]),'pppragma_directive':([0,2,104,106,139,140,141,152,172,250,252,268,273,283,383,461,464,465,509,524,527,],[8,8,147,162,147,147,147,162,283,147,147,283,283,162,283,283,283,283,283,283,283,]),'id_declarator':([0,2,11,22,24,60,61,71,111,126,129,145,239,379,],[10,10,62,92,93,108,92,93,108,232,108,108,93,108,]),'declaration_specifiers':([0,2,10,58,62,80,106,115,152,230,239,285,362,371,391,],[11,11,60,60,60,126,60,126,60,126,126,60,126,126,126,]),'decl_body':([0,2,10,58,62,106,152,285,],[12,12,12,12,12,12,12,12,]),'direct_id_declarator':([0,2,11,16,22,24,60,61,68,71,111,126,129,145,235,239,365,379,],[15,15,15,81,15,15,15,15,81,15,15,15,15,15,81,15,81,15,]),'pointer':([0,2,11,22,24,60,61,71,94,111,126,129,145,239,278,379,391,],[16,16,68,16,16,68,16,68,132,68,235,68,68,365,390,68,390,]),'type_qualifier':([0,2,10,11,17,18,19,26,58,60,62,79,80,96,104,106,114,115,117,118,126,139,140,141,145,149,152,168,218,219,230,239,240,250,252,272,278,285,329,333,336,361,362,371,391,446,447,],[17,17,17,63,17,17,17,97,17,63,17,97,17,133,97,17,97,17,97,133,63,97,97,97,258,133,17,97,97,133,17,17,97,97,97,97,258,17,97,97,97,97,17,17,17,97,133,]),'storage_class_specifier':([0,2,10,11,17,18,19,58,60,62,80,106,115,126,152,230,239,285,362,371,391,],[18,18,18,64,18,18,18,18,64,18,18,18,18,64,18,18,18,18,18,18,18,]),'function_specifier':([0,2,10,11,17,18,19,58,60,62,80,106,115,126,152,230,239,285,362,371,391,],[19,19,19,65,19,19,19,19,65,19,19,19,19,65,19,19,19,19,19,19,19,]),'type_specifier_no_typeid':([0,2,10,11,22,58,60,61,62,80,104,106,115,126,128,139,140,141,145,149,152,168,230,239,250,252,272,278,285,329,333,336,362,371,391,],[20,20,20,66,20,20,66,20,20,20,20,20,20,66,20,20,20,20,257,20,20,20,20,20,20,20,20,257,20,20,20,20,20,20,20,]),'type_specifier':([0,2,10,22,58,61,62,80,104,106,115,128,139,140,141,149,152,168,230,239,250,252,272,285,329,333,336,362,371,391,],[21,21,21,87,21,87,21,21,148,21,21,87,148,148,148,264,21,148,21,21,148,148,148,21,148,148,148,21,21,21,]),'declaration_specifiers_no_type':([0,2,10,17,18,19,58,62,80,106,115,152,230,239,285,362,371,391,],[22,22,61,84,84,84,61,61,128,61,128,61,128,128,61,128,128,128,]),'typedef_name':([0,2,10,22,58,61,62,80,104,106,115,128,139,140,141,149,152,168,230,239,250,252,272,285,329,333,336,362,371,391,],[27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,]),'enum_specifier':([0,2,10,22,58,61,62,80,104,106,115,128,139,140,141,149,152,168,230,239,250,252,272,285,329,333,336,362,371,391,],[28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,]),'struct_or_union_specifier':([0,2,10,22,58,61,62,80,104,106,115,128,139,140,141,149,152,168,230,239,250,252,272,285,329,333,336,362,371,391,],[29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,]),'struct_or_union':([0,2,10,22,58,61,62,80,104,106,115,128,139,140,141,149,152,168,230,239,250,252,272,285,329,333,336,362,371,391,],[32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,]),'declaration_list_opt':([10,62,],[56,109,]),'declaration_list':([10,62,],[58,58,]),'init_declarator_list_opt':([11,60,],[67,67,]),'init_declarator_list':([11,60,],[70,70,]),'init_declarator':([11,60,111,129,],[72,72,212,243,]),'declarator':([11,60,111,129,145,379,],[73,73,73,73,262,262,]),'typeid_declarator':([11,60,71,111,129,145,379,],[74,74,112,74,74,74,74,]),'direct_typeid_declarator':([11,60,68,71,111,129,145,379,],[75,75,110,75,75,75,75,75,]),'declaration_specifiers_no_type_opt':([17,18,19,],[82,85,86,]),'id_init_declarator_list_opt':([22,61,],[88,88,]),'id_init_declarator_list':([22,61,],[90,90,]),'id_init_declarator':([22,61,],[91,91,]),'type_qualifier_list_opt':([26,79,114,117,218,240,361,446,],[94,116,217,226,348,368,445,484,]),'type_qualifier_list':([26,79,104,114,117,139,140,141,168,218,240,250,252,272,329,333,336,361,446,],[96,118,149,219,96,149,149,149,149,96,96,149,149,149,149,149,149,447,96,]),'brace_open':([31,32,56,98,99,102,103,106,109,113,130,152,172,268,273,283,340,383,387,460,461,464,465,473,474,477,509,524,527,],[100,104,106,134,135,139,140,106,106,216,216,106,106,106,106,106,216,106,462,462,106,106,106,462,462,216,106,106,106,]),'compound_statement':([56,106,109,152,172,268,273,283,383,461,464,465,509,524,527,],[105,158,211,158,158,158,158,158,158,158,158,158,158,158,158,]),'parameter_type_list':([80,115,239,362,371,391,],[119,220,367,448,367,367,]),'identifier_list_opt':([80,115,362,],[120,221,449,]),'parameter_list':([80,115,239,362,371,391,],[121,121,121,121,121,121,]),'identifier_list':([80,115,362,],[123,123,123,]),'parameter_declaration':([80,115,230,239,362,371,391,],[124,124,357,124,124,124,124,]),'identifier':([80,106,113,115,116,130,152,164,168,172,177,183,184,185,187,217,226,227,231,249,263,268,272,273,275,279,280,281,283,285,291,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,329,333,340,344,345,348,349,362,368,370,380,383,387,398,445,460,461,464,465,466,467,469,472,475,477,484,485,499,509,513,516,517,524,527,],[125,195,195,125,195,195,195,195,195,195,195,195,195,195,195,195,195,195,358,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,438,195,195,125,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,503,195,195,195,195,195,195,525,195,195,195,]),'enumerator_list':([100,134,135,],[136,245,246,]),'enumerator':([100,134,135,248,],[137,137,137,374,]),'struct_declaration_list':([104,139,140,],[141,250,252,]),'brace_close':([104,136,139,140,141,150,245,246,250,252,337,433,494,511,],[142,247,251,253,254,265,372,373,376,377,432,476,510,521,]),'struct_declaration':([104,139,140,141,250,252,],[143,143,143,255,255,255,]),'specifier_qualifier_list':([104,139,140,141,168,250,252,272,329,333,336,],[145,145,145,145,278,145,145,278,278,278,278,]),'block_item_list_opt':([106,],[150,]),'block_item_list':([106,],[152,]),'block_item':([106,152,],[153,266,]),'statement':([106,152,172,268,273,283,383,461,464,465,509,524,527,],[155,155,284,284,284,396,284,493,284,284,284,284,284,]),'labeled_statement':([106,152,172,268,273,283,383,461,464,465,509,524,527,],[156,156,156,156,156,156,156,156,156,156,156,156,156,]),'expression_statement':([106,152,172,268,273,283,383,461,464,465,509,524,527,],[157,157,157,157,157,157,157,157,157,157,157,157,157,]),'selection_statement':([106,152,172,268,273,283,383,461,464,465,509,524,527,],[159,159,159,159,159,159,159,159,159,159,159,159,159,]),'iteration_statement':([106,152,172,268,273,283,383,461,464,465,509,524,527,],[160,160,160,160,160,160,160,160,160,160,160,160,160,]),'jump_statement':([106,152,172,268,273,283,383,461,464,465,509,524,527,],[161,161,161,161,161,161,161,161,161,161,161,161,161,]),'expression_opt':([106,152,172,268,273,283,285,383,398,461,464,465,467,499,509,513,524,527,],[166,166,166,166,166,166,397,166,468,166,166,166,498,514,166,523,166,166,]),'expression':([106,152,168,172,177,268,272,273,275,280,281,283,285,303,322,329,333,383,398,461,464,465,466,467,499,509,513,517,524,527,],[169,169,277,169,289,169,277,169,386,393,394,169,169,402,421,277,277,169,169,169,169,169,497,169,169,169,169,526,169,169,]),'assignment_expression':([106,113,116,130,152,168,172,177,217,226,227,268,272,273,275,279,280,281,283,285,291,303,322,323,329,333,340,348,349,368,370,383,398,445,461,464,465,466,467,472,477,484,485,499,509,513,517,524,527,],[178,215,225,215,178,178,178,178,225,354,355,178,178,178,178,392,178,178,178,178,401,178,178,424,178,178,215,441,442,225,225,178,178,225,178,178,178,178,178,501,215,507,508,178,178,178,178,178,178,]),'conditional_expression':([106,113,116,130,152,164,168,172,177,217,226,227,249,263,268,272,273,275,279,280,281,283,285,291,303,322,323,329,333,340,344,348,349,368,370,380,383,398,445,461,464,465,466,467,469,472,477,484,485,499,509,513,517,524,527,],[179,179,179,179,179,270,179,179,179,179,179,179,270,270,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,270,179,179,179,179,270,179,179,179,179,179,179,179,179,500,179,179,179,179,179,179,179,179,179,179,]),'unary_expression':([106,113,116,130,152,164,168,172,177,183,184,185,187,217,226,227,249,263,268,272,273,275,279,280,281,283,285,291,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,329,333,340,344,348,349,368,370,380,383,387,398,445,460,461,464,465,466,467,469,472,477,484,485,499,509,513,517,524,527,],[180,180,180,180,180,271,180,180,180,328,330,271,332,180,180,180,271,271,180,180,180,180,180,180,180,180,180,180,180,271,271,271,271,271,271,271,271,271,271,271,271,271,271,271,271,271,271,180,180,180,180,180,271,180,180,180,180,271,180,271,180,180,271,180,180,180,180,180,271,180,180,180,180,180,180,180,180,180,180,]),'binary_expression':([106,113,116,130,152,164,168,172,177,217,226,227,249,263,268,272,273,275,279,280,281,283,285,291,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,329,333,340,344,348,349,368,370,380,383,398,445,461,464,465,466,467,469,472,477,484,485,499,509,513,517,524,527,],[181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,]),'postfix_expression':([106,113,116,130,152,164,168,172,177,183,184,185,187,217,226,227,249,263,268,272,273,275,279,280,281,283,285,291,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,329,333,340,344,348,349,368,370,380,383,387,398,445,460,461,464,465,466,467,469,472,477,484,485,499,509,513,517,524,527,],[182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,]),'unary_operator':([106,113,116,130,152,164,168,172,177,183,184,185,187,217,226,227,249,263,268,272,273,275,279,280,281,283,285,291,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,329,333,340,344,348,349,368,370,380,383,387,398,445,460,461,464,465,466,467,469,472,477,484,485,499,509,513,517,524,527,],[185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,]),'cast_expression':([106,113,116,130,152,164,168,172,177,185,217,226,227,249,263,268,272,273,275,279,280,281,283,285,291,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,329,333,340,344,348,349,368,370,380,383,387,398,445,460,461,464,465,466,467,469,472,477,484,485,499,509,513,517,524,527,],[186,186,186,186,186,186,186,186,186,331,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,463,186,186,463,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,]),'primary_expression':([106,113,116,130,152,164,168,172,177,183,184,185,187,217,226,227,249,263,268,272,273,275,279,280,281,283,285,291,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,329,333,340,344,348,349,368,370,380,383,387,398,445,460,461,464,465,466,467,469,472,477,484,485,499,509,513,517,524,527,],[192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,]),'constant':([106,113,116,130,152,164,168,172,177,183,184,185,187,217,226,227,249,263,268,272,273,275,279,280,281,283,285,291,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,329,333,340,344,348,349,368,370,380,383,387,398,445,460,461,464,465,466,467,469,472,477,484,485,499,509,513,517,524,527,],[196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,]),'unified_string_literal':([106,113,116,130,152,164,168,172,177,183,184,185,187,217,226,227,249,263,268,272,273,275,279,280,281,283,285,291,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,329,333,340,344,348,349,368,370,380,383,387,398,445,460,461,464,465,466,467,469,472,477,484,485,499,509,513,517,524,527,],[197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,]),'unified_wstring_literal':([106,113,116,130,152,164,168,172,177,183,184,185,187,217,226,227,249,263,268,272,273,275,279,280,281,283,285,291,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,329,333,340,344,348,349,368,370,380,383,387,398,445,460,461,464,465,466,467,469,472,477,484,485,499,509,513,517,524,527,],[198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,]),'initializer':([113,130,340,477,],[214,244,434,504,]),'assignment_expression_opt':([116,217,368,370,445,],[222,346,452,454,482,]),'typeid_noparen_declarator':([126,],[233,]),'abstract_declarator_opt':([126,278,],[234,389,]),'direct_typeid_noparen_declarator':([126,235,],[236,359,]),'abstract_declarator':([126,239,278,391,],[238,363,238,363,]),'direct_abstract_declarator':([126,235,239,278,365,390,391,],[242,360,242,242,360,360,242,]),'struct_declarator_list_opt':([145,],[256,]),'struct_declarator_list':([145,],[260,]),'struct_declarator':([145,379,],[261,457,]),'constant_expression':([164,249,263,344,380,],[269,375,381,437,458,]),'type_name':([168,272,329,333,336,],[276,384,429,430,431,]),'pragmacomp_or_statement':([172,268,273,383,461,464,465,509,524,527,],[282,382,385,459,492,495,496,520,528,530,]),'assignment_operator':([180,],[291,]),'initializer_list_opt':([216,],[337,]),'initializer_list':([216,462,],[338,494,]),'designation_opt':([216,433,462,511,],[340,477,340,477,]),'designation':([216,433,462,511,],[341,341,341,341,]),'designator_list':([216,433,462,511,],[342,342,342,342,]),'designator':([216,342,433,462,511,],[343,436,343,343,343,]),'parameter_type_list_opt':([239,371,391,],[364,456,364,]),'argument_expression_list':([323,],[422,]),'offsetof_member_designator':([475,],[502,]),} -_lr_goto = { } +_lr_goto = {} for _k, _v in _lr_goto_items.items(): - for _x,_y in zip(_v[0],_v[1]): - if not _x in _lr_goto: _lr_goto[_x] = { } + for _x, _y in zip(_v[0], _v[1]): + if not _x in _lr_goto: _lr_goto[_x] = {} _lr_goto[_x][_k] = _y del _lr_goto_items _lr_productions = [ ("S' -> translation_unit_or_empty","S'",1,None,None,None), - ('abstract_declarator_opt -> empty','abstract_declarator_opt',1,'p_abstract_declarator_opt','../pycparser/plyparser.py',42), - ('abstract_declarator_opt -> abstract_declarator','abstract_declarator_opt',1,'p_abstract_declarator_opt','../pycparser/plyparser.py',43), - ('assignment_expression_opt -> empty','assignment_expression_opt',1,'p_assignment_expression_opt','../pycparser/plyparser.py',42), - ('assignment_expression_opt -> assignment_expression','assignment_expression_opt',1,'p_assignment_expression_opt','../pycparser/plyparser.py',43), - ('block_item_list_opt -> empty','block_item_list_opt',1,'p_block_item_list_opt','../pycparser/plyparser.py',42), - ('block_item_list_opt -> block_item_list','block_item_list_opt',1,'p_block_item_list_opt','../pycparser/plyparser.py',43), - ('declaration_list_opt -> empty','declaration_list_opt',1,'p_declaration_list_opt','../pycparser/plyparser.py',42), - ('declaration_list_opt -> declaration_list','declaration_list_opt',1,'p_declaration_list_opt','../pycparser/plyparser.py',43), - ('declaration_specifiers_opt -> empty','declaration_specifiers_opt',1,'p_declaration_specifiers_opt','../pycparser/plyparser.py',42), - ('declaration_specifiers_opt -> declaration_specifiers','declaration_specifiers_opt',1,'p_declaration_specifiers_opt','../pycparser/plyparser.py',43), - ('designation_opt -> empty','designation_opt',1,'p_designation_opt','../pycparser/plyparser.py',42), - ('designation_opt -> designation','designation_opt',1,'p_designation_opt','../pycparser/plyparser.py',43), - ('expression_opt -> empty','expression_opt',1,'p_expression_opt','../pycparser/plyparser.py',42), - ('expression_opt -> expression','expression_opt',1,'p_expression_opt','../pycparser/plyparser.py',43), - ('identifier_list_opt -> empty','identifier_list_opt',1,'p_identifier_list_opt','../pycparser/plyparser.py',42), - ('identifier_list_opt -> identifier_list','identifier_list_opt',1,'p_identifier_list_opt','../pycparser/plyparser.py',43), - ('init_declarator_list_opt -> empty','init_declarator_list_opt',1,'p_init_declarator_list_opt','../pycparser/plyparser.py',42), - ('init_declarator_list_opt -> init_declarator_list','init_declarator_list_opt',1,'p_init_declarator_list_opt','../pycparser/plyparser.py',43), - ('initializer_list_opt -> empty','initializer_list_opt',1,'p_initializer_list_opt','../pycparser/plyparser.py',42), - ('initializer_list_opt -> initializer_list','initializer_list_opt',1,'p_initializer_list_opt','../pycparser/plyparser.py',43), - ('parameter_type_list_opt -> empty','parameter_type_list_opt',1,'p_parameter_type_list_opt','../pycparser/plyparser.py',42), - ('parameter_type_list_opt -> parameter_type_list','parameter_type_list_opt',1,'p_parameter_type_list_opt','../pycparser/plyparser.py',43), - ('specifier_qualifier_list_opt -> empty','specifier_qualifier_list_opt',1,'p_specifier_qualifier_list_opt','../pycparser/plyparser.py',42), - ('specifier_qualifier_list_opt -> specifier_qualifier_list','specifier_qualifier_list_opt',1,'p_specifier_qualifier_list_opt','../pycparser/plyparser.py',43), - ('struct_declarator_list_opt -> empty','struct_declarator_list_opt',1,'p_struct_declarator_list_opt','../pycparser/plyparser.py',42), - ('struct_declarator_list_opt -> struct_declarator_list','struct_declarator_list_opt',1,'p_struct_declarator_list_opt','../pycparser/plyparser.py',43), - ('type_qualifier_list_opt -> empty','type_qualifier_list_opt',1,'p_type_qualifier_list_opt','../pycparser/plyparser.py',42), - ('type_qualifier_list_opt -> type_qualifier_list','type_qualifier_list_opt',1,'p_type_qualifier_list_opt','../pycparser/plyparser.py',43), - ('translation_unit_or_empty -> translation_unit','translation_unit_or_empty',1,'p_translation_unit_or_empty','../pycparser/c_parser.py',494), - ('translation_unit_or_empty -> empty','translation_unit_or_empty',1,'p_translation_unit_or_empty','../pycparser/c_parser.py',495), - ('translation_unit -> external_declaration','translation_unit',1,'p_translation_unit_1','../pycparser/c_parser.py',503), - ('translation_unit -> translation_unit external_declaration','translation_unit',2,'p_translation_unit_2','../pycparser/c_parser.py',510), - ('external_declaration -> function_definition','external_declaration',1,'p_external_declaration_1','../pycparser/c_parser.py',522), - ('external_declaration -> declaration','external_declaration',1,'p_external_declaration_2','../pycparser/c_parser.py',527), - ('external_declaration -> pp_directive','external_declaration',1,'p_external_declaration_3','../pycparser/c_parser.py',532), - ('external_declaration -> SEMI','external_declaration',1,'p_external_declaration_4','../pycparser/c_parser.py',537), - ('pp_directive -> PPHASH','pp_directive',1,'p_pp_directive','../pycparser/c_parser.py',542), - ('function_definition -> declarator declaration_list_opt compound_statement','function_definition',3,'p_function_definition_1','../pycparser/c_parser.py',551), - ('function_definition -> declaration_specifiers declarator declaration_list_opt compound_statement','function_definition',4,'p_function_definition_2','../pycparser/c_parser.py',568), - ('statement -> labeled_statement','statement',1,'p_statement','../pycparser/c_parser.py',579), - ('statement -> expression_statement','statement',1,'p_statement','../pycparser/c_parser.py',580), - ('statement -> compound_statement','statement',1,'p_statement','../pycparser/c_parser.py',581), - ('statement -> selection_statement','statement',1,'p_statement','../pycparser/c_parser.py',582), - ('statement -> iteration_statement','statement',1,'p_statement','../pycparser/c_parser.py',583), - ('statement -> jump_statement','statement',1,'p_statement','../pycparser/c_parser.py',584), - ('decl_body -> declaration_specifiers init_declarator_list_opt','decl_body',2,'p_decl_body','../pycparser/c_parser.py',598), - ('declaration -> decl_body SEMI','declaration',2,'p_declaration','../pycparser/c_parser.py',657), - ('declaration_list -> declaration','declaration_list',1,'p_declaration_list','../pycparser/c_parser.py',666), - ('declaration_list -> declaration_list declaration','declaration_list',2,'p_declaration_list','../pycparser/c_parser.py',667), - ('declaration_specifiers -> type_qualifier declaration_specifiers_opt','declaration_specifiers',2,'p_declaration_specifiers_1','../pycparser/c_parser.py',672), - ('declaration_specifiers -> type_specifier declaration_specifiers_opt','declaration_specifiers',2,'p_declaration_specifiers_2','../pycparser/c_parser.py',677), - ('declaration_specifiers -> storage_class_specifier declaration_specifiers_opt','declaration_specifiers',2,'p_declaration_specifiers_3','../pycparser/c_parser.py',682), - ('declaration_specifiers -> function_specifier declaration_specifiers_opt','declaration_specifiers',2,'p_declaration_specifiers_4','../pycparser/c_parser.py',687), - ('storage_class_specifier -> AUTO','storage_class_specifier',1,'p_storage_class_specifier','../pycparser/c_parser.py',692), - ('storage_class_specifier -> REGISTER','storage_class_specifier',1,'p_storage_class_specifier','../pycparser/c_parser.py',693), - ('storage_class_specifier -> STATIC','storage_class_specifier',1,'p_storage_class_specifier','../pycparser/c_parser.py',694), - ('storage_class_specifier -> EXTERN','storage_class_specifier',1,'p_storage_class_specifier','../pycparser/c_parser.py',695), - ('storage_class_specifier -> TYPEDEF','storage_class_specifier',1,'p_storage_class_specifier','../pycparser/c_parser.py',696), - ('function_specifier -> INLINE','function_specifier',1,'p_function_specifier','../pycparser/c_parser.py',701), - ('type_specifier -> VOID','type_specifier',1,'p_type_specifier_1','../pycparser/c_parser.py',706), - ('type_specifier -> _BOOL','type_specifier',1,'p_type_specifier_1','../pycparser/c_parser.py',707), - ('type_specifier -> CHAR','type_specifier',1,'p_type_specifier_1','../pycparser/c_parser.py',708), - ('type_specifier -> SHORT','type_specifier',1,'p_type_specifier_1','../pycparser/c_parser.py',709), - ('type_specifier -> INT','type_specifier',1,'p_type_specifier_1','../pycparser/c_parser.py',710), - ('type_specifier -> LONG','type_specifier',1,'p_type_specifier_1','../pycparser/c_parser.py',711), - ('type_specifier -> FLOAT','type_specifier',1,'p_type_specifier_1','../pycparser/c_parser.py',712), - ('type_specifier -> DOUBLE','type_specifier',1,'p_type_specifier_1','../pycparser/c_parser.py',713), - ('type_specifier -> _COMPLEX','type_specifier',1,'p_type_specifier_1','../pycparser/c_parser.py',714), - ('type_specifier -> SIGNED','type_specifier',1,'p_type_specifier_1','../pycparser/c_parser.py',715), - ('type_specifier -> UNSIGNED','type_specifier',1,'p_type_specifier_1','../pycparser/c_parser.py',716), - ('type_specifier -> typedef_name','type_specifier',1,'p_type_specifier_2','../pycparser/c_parser.py',721), - ('type_specifier -> enum_specifier','type_specifier',1,'p_type_specifier_2','../pycparser/c_parser.py',722), - ('type_specifier -> struct_or_union_specifier','type_specifier',1,'p_type_specifier_2','../pycparser/c_parser.py',723), - ('type_qualifier -> CONST','type_qualifier',1,'p_type_qualifier','../pycparser/c_parser.py',728), - ('type_qualifier -> RESTRICT','type_qualifier',1,'p_type_qualifier','../pycparser/c_parser.py',729), - ('type_qualifier -> VOLATILE','type_qualifier',1,'p_type_qualifier','../pycparser/c_parser.py',730), - ('init_declarator_list -> init_declarator','init_declarator_list',1,'p_init_declarator_list_1','../pycparser/c_parser.py',735), - ('init_declarator_list -> init_declarator_list COMMA init_declarator','init_declarator_list',3,'p_init_declarator_list_1','../pycparser/c_parser.py',736), - ('init_declarator_list -> EQUALS initializer','init_declarator_list',2,'p_init_declarator_list_2','../pycparser/c_parser.py',746), - ('init_declarator_list -> abstract_declarator','init_declarator_list',1,'p_init_declarator_list_3','../pycparser/c_parser.py',754), - ('init_declarator -> declarator','init_declarator',1,'p_init_declarator','../pycparser/c_parser.py',762), - ('init_declarator -> declarator EQUALS initializer','init_declarator',3,'p_init_declarator','../pycparser/c_parser.py',763), - ('specifier_qualifier_list -> type_qualifier specifier_qualifier_list_opt','specifier_qualifier_list',2,'p_specifier_qualifier_list_1','../pycparser/c_parser.py',768), - ('specifier_qualifier_list -> type_specifier specifier_qualifier_list_opt','specifier_qualifier_list',2,'p_specifier_qualifier_list_2','../pycparser/c_parser.py',773), - ('struct_or_union_specifier -> struct_or_union ID','struct_or_union_specifier',2,'p_struct_or_union_specifier_1','../pycparser/c_parser.py',781), - ('struct_or_union_specifier -> struct_or_union TYPEID','struct_or_union_specifier',2,'p_struct_or_union_specifier_1','../pycparser/c_parser.py',782), - ('struct_or_union_specifier -> struct_or_union brace_open struct_declaration_list brace_close','struct_or_union_specifier',4,'p_struct_or_union_specifier_2','../pycparser/c_parser.py',791), - ('struct_or_union_specifier -> struct_or_union ID brace_open struct_declaration_list brace_close','struct_or_union_specifier',5,'p_struct_or_union_specifier_3','../pycparser/c_parser.py',800), - ('struct_or_union_specifier -> struct_or_union TYPEID brace_open struct_declaration_list brace_close','struct_or_union_specifier',5,'p_struct_or_union_specifier_3','../pycparser/c_parser.py',801), - ('struct_or_union -> STRUCT','struct_or_union',1,'p_struct_or_union','../pycparser/c_parser.py',810), - ('struct_or_union -> UNION','struct_or_union',1,'p_struct_or_union','../pycparser/c_parser.py',811), - ('struct_declaration_list -> struct_declaration','struct_declaration_list',1,'p_struct_declaration_list','../pycparser/c_parser.py',818), - ('struct_declaration_list -> struct_declaration_list struct_declaration','struct_declaration_list',2,'p_struct_declaration_list','../pycparser/c_parser.py',819), - ('struct_declaration -> specifier_qualifier_list struct_declarator_list_opt SEMI','struct_declaration',3,'p_struct_declaration_1','../pycparser/c_parser.py',824), - ('struct_declaration -> specifier_qualifier_list abstract_declarator SEMI','struct_declaration',3,'p_struct_declaration_2','../pycparser/c_parser.py',862), - ('struct_declarator_list -> struct_declarator','struct_declarator_list',1,'p_struct_declarator_list','../pycparser/c_parser.py',876), - ('struct_declarator_list -> struct_declarator_list COMMA struct_declarator','struct_declarator_list',3,'p_struct_declarator_list','../pycparser/c_parser.py',877), - ('struct_declarator -> declarator','struct_declarator',1,'p_struct_declarator_1','../pycparser/c_parser.py',885), - ('struct_declarator -> declarator COLON constant_expression','struct_declarator',3,'p_struct_declarator_2','../pycparser/c_parser.py',890), - ('struct_declarator -> COLON constant_expression','struct_declarator',2,'p_struct_declarator_2','../pycparser/c_parser.py',891), - ('enum_specifier -> ENUM ID','enum_specifier',2,'p_enum_specifier_1','../pycparser/c_parser.py',899), - ('enum_specifier -> ENUM TYPEID','enum_specifier',2,'p_enum_specifier_1','../pycparser/c_parser.py',900), - ('enum_specifier -> ENUM brace_open enumerator_list brace_close','enum_specifier',4,'p_enum_specifier_2','../pycparser/c_parser.py',905), - ('enum_specifier -> ENUM ID brace_open enumerator_list brace_close','enum_specifier',5,'p_enum_specifier_3','../pycparser/c_parser.py',910), - ('enum_specifier -> ENUM TYPEID brace_open enumerator_list brace_close','enum_specifier',5,'p_enum_specifier_3','../pycparser/c_parser.py',911), - ('enumerator_list -> enumerator','enumerator_list',1,'p_enumerator_list','../pycparser/c_parser.py',916), - ('enumerator_list -> enumerator_list COMMA','enumerator_list',2,'p_enumerator_list','../pycparser/c_parser.py',917), - ('enumerator_list -> enumerator_list COMMA enumerator','enumerator_list',3,'p_enumerator_list','../pycparser/c_parser.py',918), - ('enumerator -> ID','enumerator',1,'p_enumerator','../pycparser/c_parser.py',929), - ('enumerator -> ID EQUALS constant_expression','enumerator',3,'p_enumerator','../pycparser/c_parser.py',930), - ('declarator -> direct_declarator','declarator',1,'p_declarator_1','../pycparser/c_parser.py',945), - ('declarator -> pointer direct_declarator','declarator',2,'p_declarator_2','../pycparser/c_parser.py',950), - ('declarator -> pointer TYPEID','declarator',2,'p_declarator_3','../pycparser/c_parser.py',959), - ('direct_declarator -> ID','direct_declarator',1,'p_direct_declarator_1','../pycparser/c_parser.py',970), - ('direct_declarator -> LPAREN declarator RPAREN','direct_declarator',3,'p_direct_declarator_2','../pycparser/c_parser.py',979), - ('direct_declarator -> direct_declarator LBRACKET type_qualifier_list_opt assignment_expression_opt RBRACKET','direct_declarator',5,'p_direct_declarator_3','../pycparser/c_parser.py',984), - ('direct_declarator -> direct_declarator LBRACKET STATIC type_qualifier_list_opt assignment_expression RBRACKET','direct_declarator',6,'p_direct_declarator_4','../pycparser/c_parser.py',998), - ('direct_declarator -> direct_declarator LBRACKET type_qualifier_list STATIC assignment_expression RBRACKET','direct_declarator',6,'p_direct_declarator_4','../pycparser/c_parser.py',999), - ('direct_declarator -> direct_declarator LBRACKET type_qualifier_list_opt TIMES RBRACKET','direct_declarator',5,'p_direct_declarator_5','../pycparser/c_parser.py',1019), - ('direct_declarator -> direct_declarator LPAREN parameter_type_list RPAREN','direct_declarator',4,'p_direct_declarator_6','../pycparser/c_parser.py',1030), - ('direct_declarator -> direct_declarator LPAREN identifier_list_opt RPAREN','direct_declarator',4,'p_direct_declarator_6','../pycparser/c_parser.py',1031), - ('pointer -> TIMES type_qualifier_list_opt','pointer',2,'p_pointer','../pycparser/c_parser.py',1058), - ('pointer -> TIMES type_qualifier_list_opt pointer','pointer',3,'p_pointer','../pycparser/c_parser.py',1059), - ('type_qualifier_list -> type_qualifier','type_qualifier_list',1,'p_type_qualifier_list','../pycparser/c_parser.py',1088), - ('type_qualifier_list -> type_qualifier_list type_qualifier','type_qualifier_list',2,'p_type_qualifier_list','../pycparser/c_parser.py',1089), - ('parameter_type_list -> parameter_list','parameter_type_list',1,'p_parameter_type_list','../pycparser/c_parser.py',1094), - ('parameter_type_list -> parameter_list COMMA ELLIPSIS','parameter_type_list',3,'p_parameter_type_list','../pycparser/c_parser.py',1095), - ('parameter_list -> parameter_declaration','parameter_list',1,'p_parameter_list','../pycparser/c_parser.py',1103), - ('parameter_list -> parameter_list COMMA parameter_declaration','parameter_list',3,'p_parameter_list','../pycparser/c_parser.py',1104), - ('parameter_declaration -> declaration_specifiers declarator','parameter_declaration',2,'p_parameter_declaration_1','../pycparser/c_parser.py',1113), - ('parameter_declaration -> declaration_specifiers abstract_declarator_opt','parameter_declaration',2,'p_parameter_declaration_2','../pycparser/c_parser.py',1124), - ('identifier_list -> identifier','identifier_list',1,'p_identifier_list','../pycparser/c_parser.py',1155), - ('identifier_list -> identifier_list COMMA identifier','identifier_list',3,'p_identifier_list','../pycparser/c_parser.py',1156), - ('initializer -> assignment_expression','initializer',1,'p_initializer_1','../pycparser/c_parser.py',1165), - ('initializer -> brace_open initializer_list_opt brace_close','initializer',3,'p_initializer_2','../pycparser/c_parser.py',1170), - ('initializer -> brace_open initializer_list COMMA brace_close','initializer',4,'p_initializer_2','../pycparser/c_parser.py',1171), - ('initializer_list -> designation_opt initializer','initializer_list',2,'p_initializer_list','../pycparser/c_parser.py',1179), - ('initializer_list -> initializer_list COMMA designation_opt initializer','initializer_list',4,'p_initializer_list','../pycparser/c_parser.py',1180), - ('designation -> designator_list EQUALS','designation',2,'p_designation','../pycparser/c_parser.py',1191), - ('designator_list -> designator','designator_list',1,'p_designator_list','../pycparser/c_parser.py',1199), - ('designator_list -> designator_list designator','designator_list',2,'p_designator_list','../pycparser/c_parser.py',1200), - ('designator -> LBRACKET constant_expression RBRACKET','designator',3,'p_designator','../pycparser/c_parser.py',1205), - ('designator -> PERIOD identifier','designator',2,'p_designator','../pycparser/c_parser.py',1206), - ('type_name -> specifier_qualifier_list abstract_declarator_opt','type_name',2,'p_type_name','../pycparser/c_parser.py',1211), - ('abstract_declarator -> pointer','abstract_declarator',1,'p_abstract_declarator_1','../pycparser/c_parser.py',1228), - ('abstract_declarator -> pointer direct_abstract_declarator','abstract_declarator',2,'p_abstract_declarator_2','../pycparser/c_parser.py',1236), - ('abstract_declarator -> direct_abstract_declarator','abstract_declarator',1,'p_abstract_declarator_3','../pycparser/c_parser.py',1241), - ('direct_abstract_declarator -> LPAREN abstract_declarator RPAREN','direct_abstract_declarator',3,'p_direct_abstract_declarator_1','../pycparser/c_parser.py',1251), - ('direct_abstract_declarator -> direct_abstract_declarator LBRACKET assignment_expression_opt RBRACKET','direct_abstract_declarator',4,'p_direct_abstract_declarator_2','../pycparser/c_parser.py',1255), - ('direct_abstract_declarator -> LBRACKET assignment_expression_opt RBRACKET','direct_abstract_declarator',3,'p_direct_abstract_declarator_3','../pycparser/c_parser.py',1266), - ('direct_abstract_declarator -> direct_abstract_declarator LBRACKET TIMES RBRACKET','direct_abstract_declarator',4,'p_direct_abstract_declarator_4','../pycparser/c_parser.py',1275), - ('direct_abstract_declarator -> LBRACKET TIMES RBRACKET','direct_abstract_declarator',3,'p_direct_abstract_declarator_5','../pycparser/c_parser.py',1286), - ('direct_abstract_declarator -> direct_abstract_declarator LPAREN parameter_type_list_opt RPAREN','direct_abstract_declarator',4,'p_direct_abstract_declarator_6','../pycparser/c_parser.py',1295), - ('direct_abstract_declarator -> LPAREN parameter_type_list_opt RPAREN','direct_abstract_declarator',3,'p_direct_abstract_declarator_7','../pycparser/c_parser.py',1305), - ('block_item -> declaration','block_item',1,'p_block_item','../pycparser/c_parser.py',1316), - ('block_item -> statement','block_item',1,'p_block_item','../pycparser/c_parser.py',1317), - ('block_item_list -> block_item','block_item_list',1,'p_block_item_list','../pycparser/c_parser.py',1324), - ('block_item_list -> block_item_list block_item','block_item_list',2,'p_block_item_list','../pycparser/c_parser.py',1325), - ('compound_statement -> brace_open block_item_list_opt brace_close','compound_statement',3,'p_compound_statement_1','../pycparser/c_parser.py',1331), - ('labeled_statement -> ID COLON statement','labeled_statement',3,'p_labeled_statement_1','../pycparser/c_parser.py',1337), - ('labeled_statement -> CASE constant_expression COLON statement','labeled_statement',4,'p_labeled_statement_2','../pycparser/c_parser.py',1341), - ('labeled_statement -> DEFAULT COLON statement','labeled_statement',3,'p_labeled_statement_3','../pycparser/c_parser.py',1345), - ('selection_statement -> IF LPAREN expression RPAREN statement','selection_statement',5,'p_selection_statement_1','../pycparser/c_parser.py',1349), - ('selection_statement -> IF LPAREN expression RPAREN statement ELSE statement','selection_statement',7,'p_selection_statement_2','../pycparser/c_parser.py',1353), - ('selection_statement -> SWITCH LPAREN expression RPAREN statement','selection_statement',5,'p_selection_statement_3','../pycparser/c_parser.py',1357), - ('iteration_statement -> WHILE LPAREN expression RPAREN statement','iteration_statement',5,'p_iteration_statement_1','../pycparser/c_parser.py',1362), - ('iteration_statement -> DO statement WHILE LPAREN expression RPAREN SEMI','iteration_statement',7,'p_iteration_statement_2','../pycparser/c_parser.py',1366), - ('iteration_statement -> FOR LPAREN expression_opt SEMI expression_opt SEMI expression_opt RPAREN statement','iteration_statement',9,'p_iteration_statement_3','../pycparser/c_parser.py',1370), - ('iteration_statement -> FOR LPAREN declaration expression_opt SEMI expression_opt RPAREN statement','iteration_statement',8,'p_iteration_statement_4','../pycparser/c_parser.py',1374), - ('jump_statement -> GOTO ID SEMI','jump_statement',3,'p_jump_statement_1','../pycparser/c_parser.py',1379), - ('jump_statement -> BREAK SEMI','jump_statement',2,'p_jump_statement_2','../pycparser/c_parser.py',1383), - ('jump_statement -> CONTINUE SEMI','jump_statement',2,'p_jump_statement_3','../pycparser/c_parser.py',1387), - ('jump_statement -> RETURN expression SEMI','jump_statement',3,'p_jump_statement_4','../pycparser/c_parser.py',1391), - ('jump_statement -> RETURN SEMI','jump_statement',2,'p_jump_statement_4','../pycparser/c_parser.py',1392), - ('expression_statement -> expression_opt SEMI','expression_statement',2,'p_expression_statement','../pycparser/c_parser.py',1397), - ('expression -> assignment_expression','expression',1,'p_expression','../pycparser/c_parser.py',1404), - ('expression -> expression COMMA assignment_expression','expression',3,'p_expression','../pycparser/c_parser.py',1405), - ('typedef_name -> TYPEID','typedef_name',1,'p_typedef_name','../pycparser/c_parser.py',1417), - ('assignment_expression -> conditional_expression','assignment_expression',1,'p_assignment_expression','../pycparser/c_parser.py',1421), - ('assignment_expression -> unary_expression assignment_operator assignment_expression','assignment_expression',3,'p_assignment_expression','../pycparser/c_parser.py',1422), - ('assignment_operator -> EQUALS','assignment_operator',1,'p_assignment_operator','../pycparser/c_parser.py',1435), - ('assignment_operator -> XOREQUAL','assignment_operator',1,'p_assignment_operator','../pycparser/c_parser.py',1436), - ('assignment_operator -> TIMESEQUAL','assignment_operator',1,'p_assignment_operator','../pycparser/c_parser.py',1437), - ('assignment_operator -> DIVEQUAL','assignment_operator',1,'p_assignment_operator','../pycparser/c_parser.py',1438), - ('assignment_operator -> MODEQUAL','assignment_operator',1,'p_assignment_operator','../pycparser/c_parser.py',1439), - ('assignment_operator -> PLUSEQUAL','assignment_operator',1,'p_assignment_operator','../pycparser/c_parser.py',1440), - ('assignment_operator -> MINUSEQUAL','assignment_operator',1,'p_assignment_operator','../pycparser/c_parser.py',1441), - ('assignment_operator -> LSHIFTEQUAL','assignment_operator',1,'p_assignment_operator','../pycparser/c_parser.py',1442), - ('assignment_operator -> RSHIFTEQUAL','assignment_operator',1,'p_assignment_operator','../pycparser/c_parser.py',1443), - ('assignment_operator -> ANDEQUAL','assignment_operator',1,'p_assignment_operator','../pycparser/c_parser.py',1444), - ('assignment_operator -> OREQUAL','assignment_operator',1,'p_assignment_operator','../pycparser/c_parser.py',1445), - ('constant_expression -> conditional_expression','constant_expression',1,'p_constant_expression','../pycparser/c_parser.py',1450), - ('conditional_expression -> binary_expression','conditional_expression',1,'p_conditional_expression','../pycparser/c_parser.py',1454), - ('conditional_expression -> binary_expression CONDOP expression COLON conditional_expression','conditional_expression',5,'p_conditional_expression','../pycparser/c_parser.py',1455), - ('binary_expression -> cast_expression','binary_expression',1,'p_binary_expression','../pycparser/c_parser.py',1463), - ('binary_expression -> binary_expression TIMES binary_expression','binary_expression',3,'p_binary_expression','../pycparser/c_parser.py',1464), - ('binary_expression -> binary_expression DIVIDE binary_expression','binary_expression',3,'p_binary_expression','../pycparser/c_parser.py',1465), - ('binary_expression -> binary_expression MOD binary_expression','binary_expression',3,'p_binary_expression','../pycparser/c_parser.py',1466), - ('binary_expression -> binary_expression PLUS binary_expression','binary_expression',3,'p_binary_expression','../pycparser/c_parser.py',1467), - ('binary_expression -> binary_expression MINUS binary_expression','binary_expression',3,'p_binary_expression','../pycparser/c_parser.py',1468), - ('binary_expression -> binary_expression RSHIFT binary_expression','binary_expression',3,'p_binary_expression','../pycparser/c_parser.py',1469), - ('binary_expression -> binary_expression LSHIFT binary_expression','binary_expression',3,'p_binary_expression','../pycparser/c_parser.py',1470), - ('binary_expression -> binary_expression LT binary_expression','binary_expression',3,'p_binary_expression','../pycparser/c_parser.py',1471), - ('binary_expression -> binary_expression LE binary_expression','binary_expression',3,'p_binary_expression','../pycparser/c_parser.py',1472), - ('binary_expression -> binary_expression GE binary_expression','binary_expression',3,'p_binary_expression','../pycparser/c_parser.py',1473), - ('binary_expression -> binary_expression GT binary_expression','binary_expression',3,'p_binary_expression','../pycparser/c_parser.py',1474), - ('binary_expression -> binary_expression EQ binary_expression','binary_expression',3,'p_binary_expression','../pycparser/c_parser.py',1475), - ('binary_expression -> binary_expression NE binary_expression','binary_expression',3,'p_binary_expression','../pycparser/c_parser.py',1476), - ('binary_expression -> binary_expression AND binary_expression','binary_expression',3,'p_binary_expression','../pycparser/c_parser.py',1477), - ('binary_expression -> binary_expression OR binary_expression','binary_expression',3,'p_binary_expression','../pycparser/c_parser.py',1478), - ('binary_expression -> binary_expression XOR binary_expression','binary_expression',3,'p_binary_expression','../pycparser/c_parser.py',1479), - ('binary_expression -> binary_expression LAND binary_expression','binary_expression',3,'p_binary_expression','../pycparser/c_parser.py',1480), - ('binary_expression -> binary_expression LOR binary_expression','binary_expression',3,'p_binary_expression','../pycparser/c_parser.py',1481), - ('cast_expression -> unary_expression','cast_expression',1,'p_cast_expression_1','../pycparser/c_parser.py',1489), - ('cast_expression -> LPAREN type_name RPAREN cast_expression','cast_expression',4,'p_cast_expression_2','../pycparser/c_parser.py',1493), - ('unary_expression -> postfix_expression','unary_expression',1,'p_unary_expression_1','../pycparser/c_parser.py',1497), - ('unary_expression -> PLUSPLUS unary_expression','unary_expression',2,'p_unary_expression_2','../pycparser/c_parser.py',1501), - ('unary_expression -> MINUSMINUS unary_expression','unary_expression',2,'p_unary_expression_2','../pycparser/c_parser.py',1502), - ('unary_expression -> unary_operator cast_expression','unary_expression',2,'p_unary_expression_2','../pycparser/c_parser.py',1503), - ('unary_expression -> SIZEOF unary_expression','unary_expression',2,'p_unary_expression_3','../pycparser/c_parser.py',1508), - ('unary_expression -> SIZEOF LPAREN type_name RPAREN','unary_expression',4,'p_unary_expression_3','../pycparser/c_parser.py',1509), - ('unary_operator -> AND','unary_operator',1,'p_unary_operator','../pycparser/c_parser.py',1517), - ('unary_operator -> TIMES','unary_operator',1,'p_unary_operator','../pycparser/c_parser.py',1518), - ('unary_operator -> PLUS','unary_operator',1,'p_unary_operator','../pycparser/c_parser.py',1519), - ('unary_operator -> MINUS','unary_operator',1,'p_unary_operator','../pycparser/c_parser.py',1520), - ('unary_operator -> NOT','unary_operator',1,'p_unary_operator','../pycparser/c_parser.py',1521), - ('unary_operator -> LNOT','unary_operator',1,'p_unary_operator','../pycparser/c_parser.py',1522), - ('postfix_expression -> primary_expression','postfix_expression',1,'p_postfix_expression_1','../pycparser/c_parser.py',1527), - ('postfix_expression -> postfix_expression LBRACKET expression RBRACKET','postfix_expression',4,'p_postfix_expression_2','../pycparser/c_parser.py',1531), - ('postfix_expression -> postfix_expression LPAREN argument_expression_list RPAREN','postfix_expression',4,'p_postfix_expression_3','../pycparser/c_parser.py',1535), - ('postfix_expression -> postfix_expression LPAREN RPAREN','postfix_expression',3,'p_postfix_expression_3','../pycparser/c_parser.py',1536), - ('postfix_expression -> postfix_expression PERIOD ID','postfix_expression',3,'p_postfix_expression_4','../pycparser/c_parser.py',1541), - ('postfix_expression -> postfix_expression PERIOD TYPEID','postfix_expression',3,'p_postfix_expression_4','../pycparser/c_parser.py',1542), - ('postfix_expression -> postfix_expression ARROW ID','postfix_expression',3,'p_postfix_expression_4','../pycparser/c_parser.py',1543), - ('postfix_expression -> postfix_expression ARROW TYPEID','postfix_expression',3,'p_postfix_expression_4','../pycparser/c_parser.py',1544), - ('postfix_expression -> postfix_expression PLUSPLUS','postfix_expression',2,'p_postfix_expression_5','../pycparser/c_parser.py',1550), - ('postfix_expression -> postfix_expression MINUSMINUS','postfix_expression',2,'p_postfix_expression_5','../pycparser/c_parser.py',1551), - ('postfix_expression -> LPAREN type_name RPAREN brace_open initializer_list brace_close','postfix_expression',6,'p_postfix_expression_6','../pycparser/c_parser.py',1556), - ('postfix_expression -> LPAREN type_name RPAREN brace_open initializer_list COMMA brace_close','postfix_expression',7,'p_postfix_expression_6','../pycparser/c_parser.py',1557), - ('primary_expression -> identifier','primary_expression',1,'p_primary_expression_1','../pycparser/c_parser.py',1562), - ('primary_expression -> constant','primary_expression',1,'p_primary_expression_2','../pycparser/c_parser.py',1566), - ('primary_expression -> unified_string_literal','primary_expression',1,'p_primary_expression_3','../pycparser/c_parser.py',1570), - ('primary_expression -> unified_wstring_literal','primary_expression',1,'p_primary_expression_3','../pycparser/c_parser.py',1571), - ('primary_expression -> LPAREN expression RPAREN','primary_expression',3,'p_primary_expression_4','../pycparser/c_parser.py',1576), - ('primary_expression -> OFFSETOF LPAREN type_name COMMA identifier RPAREN','primary_expression',6,'p_primary_expression_5','../pycparser/c_parser.py',1580), - ('argument_expression_list -> assignment_expression','argument_expression_list',1,'p_argument_expression_list','../pycparser/c_parser.py',1588), - ('argument_expression_list -> argument_expression_list COMMA assignment_expression','argument_expression_list',3,'p_argument_expression_list','../pycparser/c_parser.py',1589), - ('identifier -> ID','identifier',1,'p_identifier','../pycparser/c_parser.py',1598), - ('constant -> INT_CONST_DEC','constant',1,'p_constant_1','../pycparser/c_parser.py',1602), - ('constant -> INT_CONST_OCT','constant',1,'p_constant_1','../pycparser/c_parser.py',1603), - ('constant -> INT_CONST_HEX','constant',1,'p_constant_1','../pycparser/c_parser.py',1604), - ('constant -> INT_CONST_BIN','constant',1,'p_constant_1','../pycparser/c_parser.py',1605), - ('constant -> FLOAT_CONST','constant',1,'p_constant_2','../pycparser/c_parser.py',1611), - ('constant -> HEX_FLOAT_CONST','constant',1,'p_constant_2','../pycparser/c_parser.py',1612), - ('constant -> CHAR_CONST','constant',1,'p_constant_3','../pycparser/c_parser.py',1618), - ('constant -> WCHAR_CONST','constant',1,'p_constant_3','../pycparser/c_parser.py',1619), - ('unified_string_literal -> STRING_LITERAL','unified_string_literal',1,'p_unified_string_literal','../pycparser/c_parser.py',1630), - ('unified_string_literal -> unified_string_literal STRING_LITERAL','unified_string_literal',2,'p_unified_string_literal','../pycparser/c_parser.py',1631), - ('unified_wstring_literal -> WSTRING_LITERAL','unified_wstring_literal',1,'p_unified_wstring_literal','../pycparser/c_parser.py',1641), - ('unified_wstring_literal -> unified_wstring_literal WSTRING_LITERAL','unified_wstring_literal',2,'p_unified_wstring_literal','../pycparser/c_parser.py',1642), - ('brace_open -> LBRACE','brace_open',1,'p_brace_open','../pycparser/c_parser.py',1652), - ('brace_close -> RBRACE','brace_close',1,'p_brace_close','../pycparser/c_parser.py',1657), - ('empty -> ','empty',0,'p_empty','../pycparser/c_parser.py',1662), + ('abstract_declarator_opt -> empty','abstract_declarator_opt',1,'p_abstract_declarator_opt','plyparser.py',43), + ('abstract_declarator_opt -> abstract_declarator','abstract_declarator_opt',1,'p_abstract_declarator_opt','plyparser.py',44), + ('assignment_expression_opt -> empty','assignment_expression_opt',1,'p_assignment_expression_opt','plyparser.py',43), + ('assignment_expression_opt -> assignment_expression','assignment_expression_opt',1,'p_assignment_expression_opt','plyparser.py',44), + ('block_item_list_opt -> empty','block_item_list_opt',1,'p_block_item_list_opt','plyparser.py',43), + ('block_item_list_opt -> block_item_list','block_item_list_opt',1,'p_block_item_list_opt','plyparser.py',44), + ('declaration_list_opt -> empty','declaration_list_opt',1,'p_declaration_list_opt','plyparser.py',43), + ('declaration_list_opt -> declaration_list','declaration_list_opt',1,'p_declaration_list_opt','plyparser.py',44), + ('declaration_specifiers_no_type_opt -> empty','declaration_specifiers_no_type_opt',1,'p_declaration_specifiers_no_type_opt','plyparser.py',43), + ('declaration_specifiers_no_type_opt -> declaration_specifiers_no_type','declaration_specifiers_no_type_opt',1,'p_declaration_specifiers_no_type_opt','plyparser.py',44), + ('designation_opt -> empty','designation_opt',1,'p_designation_opt','plyparser.py',43), + ('designation_opt -> designation','designation_opt',1,'p_designation_opt','plyparser.py',44), + ('expression_opt -> empty','expression_opt',1,'p_expression_opt','plyparser.py',43), + ('expression_opt -> expression','expression_opt',1,'p_expression_opt','plyparser.py',44), + ('id_init_declarator_list_opt -> empty','id_init_declarator_list_opt',1,'p_id_init_declarator_list_opt','plyparser.py',43), + ('id_init_declarator_list_opt -> id_init_declarator_list','id_init_declarator_list_opt',1,'p_id_init_declarator_list_opt','plyparser.py',44), + ('identifier_list_opt -> empty','identifier_list_opt',1,'p_identifier_list_opt','plyparser.py',43), + ('identifier_list_opt -> identifier_list','identifier_list_opt',1,'p_identifier_list_opt','plyparser.py',44), + ('init_declarator_list_opt -> empty','init_declarator_list_opt',1,'p_init_declarator_list_opt','plyparser.py',43), + ('init_declarator_list_opt -> init_declarator_list','init_declarator_list_opt',1,'p_init_declarator_list_opt','plyparser.py',44), + ('initializer_list_opt -> empty','initializer_list_opt',1,'p_initializer_list_opt','plyparser.py',43), + ('initializer_list_opt -> initializer_list','initializer_list_opt',1,'p_initializer_list_opt','plyparser.py',44), + ('parameter_type_list_opt -> empty','parameter_type_list_opt',1,'p_parameter_type_list_opt','plyparser.py',43), + ('parameter_type_list_opt -> parameter_type_list','parameter_type_list_opt',1,'p_parameter_type_list_opt','plyparser.py',44), + ('struct_declarator_list_opt -> empty','struct_declarator_list_opt',1,'p_struct_declarator_list_opt','plyparser.py',43), + ('struct_declarator_list_opt -> struct_declarator_list','struct_declarator_list_opt',1,'p_struct_declarator_list_opt','plyparser.py',44), + ('type_qualifier_list_opt -> empty','type_qualifier_list_opt',1,'p_type_qualifier_list_opt','plyparser.py',43), + ('type_qualifier_list_opt -> type_qualifier_list','type_qualifier_list_opt',1,'p_type_qualifier_list_opt','plyparser.py',44), + ('direct_id_declarator -> ID','direct_id_declarator',1,'p_direct_id_declarator_1','plyparser.py',126), + ('direct_id_declarator -> LPAREN id_declarator RPAREN','direct_id_declarator',3,'p_direct_id_declarator_2','plyparser.py',126), + ('direct_id_declarator -> direct_id_declarator LBRACKET type_qualifier_list_opt assignment_expression_opt RBRACKET','direct_id_declarator',5,'p_direct_id_declarator_3','plyparser.py',126), + ('direct_id_declarator -> direct_id_declarator LBRACKET STATIC type_qualifier_list_opt assignment_expression RBRACKET','direct_id_declarator',6,'p_direct_id_declarator_4','plyparser.py',126), + ('direct_id_declarator -> direct_id_declarator LBRACKET type_qualifier_list STATIC assignment_expression RBRACKET','direct_id_declarator',6,'p_direct_id_declarator_4','plyparser.py',127), + ('direct_id_declarator -> direct_id_declarator LBRACKET type_qualifier_list_opt TIMES RBRACKET','direct_id_declarator',5,'p_direct_id_declarator_5','plyparser.py',126), + ('direct_id_declarator -> direct_id_declarator LPAREN parameter_type_list RPAREN','direct_id_declarator',4,'p_direct_id_declarator_6','plyparser.py',126), + ('direct_id_declarator -> direct_id_declarator LPAREN identifier_list_opt RPAREN','direct_id_declarator',4,'p_direct_id_declarator_6','plyparser.py',127), + ('direct_typeid_declarator -> TYPEID','direct_typeid_declarator',1,'p_direct_typeid_declarator_1','plyparser.py',126), + ('direct_typeid_declarator -> LPAREN typeid_declarator RPAREN','direct_typeid_declarator',3,'p_direct_typeid_declarator_2','plyparser.py',126), + ('direct_typeid_declarator -> direct_typeid_declarator LBRACKET type_qualifier_list_opt assignment_expression_opt RBRACKET','direct_typeid_declarator',5,'p_direct_typeid_declarator_3','plyparser.py',126), + ('direct_typeid_declarator -> direct_typeid_declarator LBRACKET STATIC type_qualifier_list_opt assignment_expression RBRACKET','direct_typeid_declarator',6,'p_direct_typeid_declarator_4','plyparser.py',126), + ('direct_typeid_declarator -> direct_typeid_declarator LBRACKET type_qualifier_list STATIC assignment_expression RBRACKET','direct_typeid_declarator',6,'p_direct_typeid_declarator_4','plyparser.py',127), + ('direct_typeid_declarator -> direct_typeid_declarator LBRACKET type_qualifier_list_opt TIMES RBRACKET','direct_typeid_declarator',5,'p_direct_typeid_declarator_5','plyparser.py',126), + ('direct_typeid_declarator -> direct_typeid_declarator LPAREN parameter_type_list RPAREN','direct_typeid_declarator',4,'p_direct_typeid_declarator_6','plyparser.py',126), + ('direct_typeid_declarator -> direct_typeid_declarator LPAREN identifier_list_opt RPAREN','direct_typeid_declarator',4,'p_direct_typeid_declarator_6','plyparser.py',127), + ('direct_typeid_noparen_declarator -> TYPEID','direct_typeid_noparen_declarator',1,'p_direct_typeid_noparen_declarator_1','plyparser.py',126), + ('direct_typeid_noparen_declarator -> direct_typeid_noparen_declarator LBRACKET type_qualifier_list_opt assignment_expression_opt RBRACKET','direct_typeid_noparen_declarator',5,'p_direct_typeid_noparen_declarator_3','plyparser.py',126), + ('direct_typeid_noparen_declarator -> direct_typeid_noparen_declarator LBRACKET STATIC type_qualifier_list_opt assignment_expression RBRACKET','direct_typeid_noparen_declarator',6,'p_direct_typeid_noparen_declarator_4','plyparser.py',126), + ('direct_typeid_noparen_declarator -> direct_typeid_noparen_declarator LBRACKET type_qualifier_list STATIC assignment_expression RBRACKET','direct_typeid_noparen_declarator',6,'p_direct_typeid_noparen_declarator_4','plyparser.py',127), + ('direct_typeid_noparen_declarator -> direct_typeid_noparen_declarator LBRACKET type_qualifier_list_opt TIMES RBRACKET','direct_typeid_noparen_declarator',5,'p_direct_typeid_noparen_declarator_5','plyparser.py',126), + ('direct_typeid_noparen_declarator -> direct_typeid_noparen_declarator LPAREN parameter_type_list RPAREN','direct_typeid_noparen_declarator',4,'p_direct_typeid_noparen_declarator_6','plyparser.py',126), + ('direct_typeid_noparen_declarator -> direct_typeid_noparen_declarator LPAREN identifier_list_opt RPAREN','direct_typeid_noparen_declarator',4,'p_direct_typeid_noparen_declarator_6','plyparser.py',127), + ('id_declarator -> direct_id_declarator','id_declarator',1,'p_id_declarator_1','plyparser.py',126), + ('id_declarator -> pointer direct_id_declarator','id_declarator',2,'p_id_declarator_2','plyparser.py',126), + ('typeid_declarator -> direct_typeid_declarator','typeid_declarator',1,'p_typeid_declarator_1','plyparser.py',126), + ('typeid_declarator -> pointer direct_typeid_declarator','typeid_declarator',2,'p_typeid_declarator_2','plyparser.py',126), + ('typeid_noparen_declarator -> direct_typeid_noparen_declarator','typeid_noparen_declarator',1,'p_typeid_noparen_declarator_1','plyparser.py',126), + ('typeid_noparen_declarator -> pointer direct_typeid_noparen_declarator','typeid_noparen_declarator',2,'p_typeid_noparen_declarator_2','plyparser.py',126), + ('translation_unit_or_empty -> translation_unit','translation_unit_or_empty',1,'p_translation_unit_or_empty','c_parser.py',514), + ('translation_unit_or_empty -> empty','translation_unit_or_empty',1,'p_translation_unit_or_empty','c_parser.py',515), + ('translation_unit -> external_declaration','translation_unit',1,'p_translation_unit_1','c_parser.py',523), + ('translation_unit -> translation_unit external_declaration','translation_unit',2,'p_translation_unit_2','c_parser.py',530), + ('external_declaration -> function_definition','external_declaration',1,'p_external_declaration_1','c_parser.py',541), + ('external_declaration -> declaration','external_declaration',1,'p_external_declaration_2','c_parser.py',546), + ('external_declaration -> pp_directive','external_declaration',1,'p_external_declaration_3','c_parser.py',551), + ('external_declaration -> pppragma_directive','external_declaration',1,'p_external_declaration_3','c_parser.py',552), + ('external_declaration -> SEMI','external_declaration',1,'p_external_declaration_4','c_parser.py',557), + ('pp_directive -> PPHASH','pp_directive',1,'p_pp_directive','c_parser.py',562), + ('pppragma_directive -> PPPRAGMA','pppragma_directive',1,'p_pppragma_directive','c_parser.py',568), + ('pppragma_directive -> PPPRAGMA PPPRAGMASTR','pppragma_directive',2,'p_pppragma_directive','c_parser.py',569), + ('function_definition -> id_declarator declaration_list_opt compound_statement','function_definition',3,'p_function_definition_1','c_parser.py',580), + ('function_definition -> declaration_specifiers id_declarator declaration_list_opt compound_statement','function_definition',4,'p_function_definition_2','c_parser.py',597), + ('statement -> labeled_statement','statement',1,'p_statement','c_parser.py',608), + ('statement -> expression_statement','statement',1,'p_statement','c_parser.py',609), + ('statement -> compound_statement','statement',1,'p_statement','c_parser.py',610), + ('statement -> selection_statement','statement',1,'p_statement','c_parser.py',611), + ('statement -> iteration_statement','statement',1,'p_statement','c_parser.py',612), + ('statement -> jump_statement','statement',1,'p_statement','c_parser.py',613), + ('statement -> pppragma_directive','statement',1,'p_statement','c_parser.py',614), + ('pragmacomp_or_statement -> pppragma_directive statement','pragmacomp_or_statement',2,'p_pragmacomp_or_statement','c_parser.py',661), + ('pragmacomp_or_statement -> statement','pragmacomp_or_statement',1,'p_pragmacomp_or_statement','c_parser.py',662), + ('decl_body -> declaration_specifiers init_declarator_list_opt','decl_body',2,'p_decl_body','c_parser.py',681), + ('decl_body -> declaration_specifiers_no_type id_init_declarator_list_opt','decl_body',2,'p_decl_body','c_parser.py',682), + ('declaration -> decl_body SEMI','declaration',2,'p_declaration','c_parser.py',741), + ('declaration_list -> declaration','declaration_list',1,'p_declaration_list','c_parser.py',750), + ('declaration_list -> declaration_list declaration','declaration_list',2,'p_declaration_list','c_parser.py',751), + ('declaration_specifiers_no_type -> type_qualifier declaration_specifiers_no_type_opt','declaration_specifiers_no_type',2,'p_declaration_specifiers_no_type_1','c_parser.py',761), + ('declaration_specifiers_no_type -> storage_class_specifier declaration_specifiers_no_type_opt','declaration_specifiers_no_type',2,'p_declaration_specifiers_no_type_2','c_parser.py',766), + ('declaration_specifiers_no_type -> function_specifier declaration_specifiers_no_type_opt','declaration_specifiers_no_type',2,'p_declaration_specifiers_no_type_3','c_parser.py',771), + ('declaration_specifiers -> declaration_specifiers type_qualifier','declaration_specifiers',2,'p_declaration_specifiers_1','c_parser.py',777), + ('declaration_specifiers -> declaration_specifiers storage_class_specifier','declaration_specifiers',2,'p_declaration_specifiers_2','c_parser.py',782), + ('declaration_specifiers -> declaration_specifiers function_specifier','declaration_specifiers',2,'p_declaration_specifiers_3','c_parser.py',787), + ('declaration_specifiers -> declaration_specifiers type_specifier_no_typeid','declaration_specifiers',2,'p_declaration_specifiers_4','c_parser.py',792), + ('declaration_specifiers -> type_specifier','declaration_specifiers',1,'p_declaration_specifiers_5','c_parser.py',797), + ('declaration_specifiers -> declaration_specifiers_no_type type_specifier','declaration_specifiers',2,'p_declaration_specifiers_6','c_parser.py',802), + ('storage_class_specifier -> AUTO','storage_class_specifier',1,'p_storage_class_specifier','c_parser.py',808), + ('storage_class_specifier -> REGISTER','storage_class_specifier',1,'p_storage_class_specifier','c_parser.py',809), + ('storage_class_specifier -> STATIC','storage_class_specifier',1,'p_storage_class_specifier','c_parser.py',810), + ('storage_class_specifier -> EXTERN','storage_class_specifier',1,'p_storage_class_specifier','c_parser.py',811), + ('storage_class_specifier -> TYPEDEF','storage_class_specifier',1,'p_storage_class_specifier','c_parser.py',812), + ('function_specifier -> INLINE','function_specifier',1,'p_function_specifier','c_parser.py',817), + ('type_specifier_no_typeid -> VOID','type_specifier_no_typeid',1,'p_type_specifier_no_typeid','c_parser.py',822), + ('type_specifier_no_typeid -> _BOOL','type_specifier_no_typeid',1,'p_type_specifier_no_typeid','c_parser.py',823), + ('type_specifier_no_typeid -> CHAR','type_specifier_no_typeid',1,'p_type_specifier_no_typeid','c_parser.py',824), + ('type_specifier_no_typeid -> SHORT','type_specifier_no_typeid',1,'p_type_specifier_no_typeid','c_parser.py',825), + ('type_specifier_no_typeid -> INT','type_specifier_no_typeid',1,'p_type_specifier_no_typeid','c_parser.py',826), + ('type_specifier_no_typeid -> LONG','type_specifier_no_typeid',1,'p_type_specifier_no_typeid','c_parser.py',827), + ('type_specifier_no_typeid -> FLOAT','type_specifier_no_typeid',1,'p_type_specifier_no_typeid','c_parser.py',828), + ('type_specifier_no_typeid -> DOUBLE','type_specifier_no_typeid',1,'p_type_specifier_no_typeid','c_parser.py',829), + ('type_specifier_no_typeid -> _COMPLEX','type_specifier_no_typeid',1,'p_type_specifier_no_typeid','c_parser.py',830), + ('type_specifier_no_typeid -> SIGNED','type_specifier_no_typeid',1,'p_type_specifier_no_typeid','c_parser.py',831), + ('type_specifier_no_typeid -> UNSIGNED','type_specifier_no_typeid',1,'p_type_specifier_no_typeid','c_parser.py',832), + ('type_specifier_no_typeid -> __INT128','type_specifier_no_typeid',1,'p_type_specifier_no_typeid','c_parser.py',833), + ('type_specifier -> typedef_name','type_specifier',1,'p_type_specifier','c_parser.py',838), + ('type_specifier -> enum_specifier','type_specifier',1,'p_type_specifier','c_parser.py',839), + ('type_specifier -> struct_or_union_specifier','type_specifier',1,'p_type_specifier','c_parser.py',840), + ('type_specifier -> type_specifier_no_typeid','type_specifier',1,'p_type_specifier','c_parser.py',841), + ('type_qualifier -> CONST','type_qualifier',1,'p_type_qualifier','c_parser.py',846), + ('type_qualifier -> RESTRICT','type_qualifier',1,'p_type_qualifier','c_parser.py',847), + ('type_qualifier -> VOLATILE','type_qualifier',1,'p_type_qualifier','c_parser.py',848), + ('init_declarator_list -> init_declarator','init_declarator_list',1,'p_init_declarator_list','c_parser.py',853), + ('init_declarator_list -> init_declarator_list COMMA init_declarator','init_declarator_list',3,'p_init_declarator_list','c_parser.py',854), + ('init_declarator -> declarator','init_declarator',1,'p_init_declarator','c_parser.py',862), + ('init_declarator -> declarator EQUALS initializer','init_declarator',3,'p_init_declarator','c_parser.py',863), + ('id_init_declarator_list -> id_init_declarator','id_init_declarator_list',1,'p_id_init_declarator_list','c_parser.py',868), + ('id_init_declarator_list -> id_init_declarator_list COMMA init_declarator','id_init_declarator_list',3,'p_id_init_declarator_list','c_parser.py',869), + ('id_init_declarator -> id_declarator','id_init_declarator',1,'p_id_init_declarator','c_parser.py',874), + ('id_init_declarator -> id_declarator EQUALS initializer','id_init_declarator',3,'p_id_init_declarator','c_parser.py',875), + ('specifier_qualifier_list -> specifier_qualifier_list type_specifier_no_typeid','specifier_qualifier_list',2,'p_specifier_qualifier_list_1','c_parser.py',882), + ('specifier_qualifier_list -> specifier_qualifier_list type_qualifier','specifier_qualifier_list',2,'p_specifier_qualifier_list_2','c_parser.py',887), + ('specifier_qualifier_list -> type_specifier','specifier_qualifier_list',1,'p_specifier_qualifier_list_3','c_parser.py',892), + ('specifier_qualifier_list -> type_qualifier_list type_specifier','specifier_qualifier_list',2,'p_specifier_qualifier_list_4','c_parser.py',897), + ('struct_or_union_specifier -> struct_or_union ID','struct_or_union_specifier',2,'p_struct_or_union_specifier_1','c_parser.py',906), + ('struct_or_union_specifier -> struct_or_union TYPEID','struct_or_union_specifier',2,'p_struct_or_union_specifier_1','c_parser.py',907), + ('struct_or_union_specifier -> struct_or_union brace_open struct_declaration_list brace_close','struct_or_union_specifier',4,'p_struct_or_union_specifier_2','c_parser.py',917), + ('struct_or_union_specifier -> struct_or_union brace_open brace_close','struct_or_union_specifier',3,'p_struct_or_union_specifier_2','c_parser.py',918), + ('struct_or_union_specifier -> struct_or_union ID brace_open struct_declaration_list brace_close','struct_or_union_specifier',5,'p_struct_or_union_specifier_3','c_parser.py',935), + ('struct_or_union_specifier -> struct_or_union ID brace_open brace_close','struct_or_union_specifier',4,'p_struct_or_union_specifier_3','c_parser.py',936), + ('struct_or_union_specifier -> struct_or_union TYPEID brace_open struct_declaration_list brace_close','struct_or_union_specifier',5,'p_struct_or_union_specifier_3','c_parser.py',937), + ('struct_or_union_specifier -> struct_or_union TYPEID brace_open brace_close','struct_or_union_specifier',4,'p_struct_or_union_specifier_3','c_parser.py',938), + ('struct_or_union -> STRUCT','struct_or_union',1,'p_struct_or_union','c_parser.py',954), + ('struct_or_union -> UNION','struct_or_union',1,'p_struct_or_union','c_parser.py',955), + ('struct_declaration_list -> struct_declaration','struct_declaration_list',1,'p_struct_declaration_list','c_parser.py',962), + ('struct_declaration_list -> struct_declaration_list struct_declaration','struct_declaration_list',2,'p_struct_declaration_list','c_parser.py',963), + ('struct_declaration -> specifier_qualifier_list struct_declarator_list_opt SEMI','struct_declaration',3,'p_struct_declaration_1','c_parser.py',971), + ('struct_declaration -> SEMI','struct_declaration',1,'p_struct_declaration_2','c_parser.py',1009), + ('struct_declaration -> pppragma_directive','struct_declaration',1,'p_struct_declaration_3','c_parser.py',1014), + ('struct_declarator_list -> struct_declarator','struct_declarator_list',1,'p_struct_declarator_list','c_parser.py',1019), + ('struct_declarator_list -> struct_declarator_list COMMA struct_declarator','struct_declarator_list',3,'p_struct_declarator_list','c_parser.py',1020), + ('struct_declarator -> declarator','struct_declarator',1,'p_struct_declarator_1','c_parser.py',1028), + ('struct_declarator -> declarator COLON constant_expression','struct_declarator',3,'p_struct_declarator_2','c_parser.py',1033), + ('struct_declarator -> COLON constant_expression','struct_declarator',2,'p_struct_declarator_2','c_parser.py',1034), + ('enum_specifier -> ENUM ID','enum_specifier',2,'p_enum_specifier_1','c_parser.py',1042), + ('enum_specifier -> ENUM TYPEID','enum_specifier',2,'p_enum_specifier_1','c_parser.py',1043), + ('enum_specifier -> ENUM brace_open enumerator_list brace_close','enum_specifier',4,'p_enum_specifier_2','c_parser.py',1048), + ('enum_specifier -> ENUM ID brace_open enumerator_list brace_close','enum_specifier',5,'p_enum_specifier_3','c_parser.py',1053), + ('enum_specifier -> ENUM TYPEID brace_open enumerator_list brace_close','enum_specifier',5,'p_enum_specifier_3','c_parser.py',1054), + ('enumerator_list -> enumerator','enumerator_list',1,'p_enumerator_list','c_parser.py',1059), + ('enumerator_list -> enumerator_list COMMA','enumerator_list',2,'p_enumerator_list','c_parser.py',1060), + ('enumerator_list -> enumerator_list COMMA enumerator','enumerator_list',3,'p_enumerator_list','c_parser.py',1061), + ('enumerator -> ID','enumerator',1,'p_enumerator','c_parser.py',1072), + ('enumerator -> ID EQUALS constant_expression','enumerator',3,'p_enumerator','c_parser.py',1073), + ('declarator -> id_declarator','declarator',1,'p_declarator','c_parser.py',1088), + ('declarator -> typeid_declarator','declarator',1,'p_declarator','c_parser.py',1089), + ('pointer -> TIMES type_qualifier_list_opt','pointer',2,'p_pointer','c_parser.py',1200), + ('pointer -> TIMES type_qualifier_list_opt pointer','pointer',3,'p_pointer','c_parser.py',1201), + ('type_qualifier_list -> type_qualifier','type_qualifier_list',1,'p_type_qualifier_list','c_parser.py',1230), + ('type_qualifier_list -> type_qualifier_list type_qualifier','type_qualifier_list',2,'p_type_qualifier_list','c_parser.py',1231), + ('parameter_type_list -> parameter_list','parameter_type_list',1,'p_parameter_type_list','c_parser.py',1236), + ('parameter_type_list -> parameter_list COMMA ELLIPSIS','parameter_type_list',3,'p_parameter_type_list','c_parser.py',1237), + ('parameter_list -> parameter_declaration','parameter_list',1,'p_parameter_list','c_parser.py',1245), + ('parameter_list -> parameter_list COMMA parameter_declaration','parameter_list',3,'p_parameter_list','c_parser.py',1246), + ('parameter_declaration -> declaration_specifiers id_declarator','parameter_declaration',2,'p_parameter_declaration_1','c_parser.py',1265), + ('parameter_declaration -> declaration_specifiers typeid_noparen_declarator','parameter_declaration',2,'p_parameter_declaration_1','c_parser.py',1266), + ('parameter_declaration -> declaration_specifiers abstract_declarator_opt','parameter_declaration',2,'p_parameter_declaration_2','c_parser.py',1277), + ('identifier_list -> identifier','identifier_list',1,'p_identifier_list','c_parser.py',1308), + ('identifier_list -> identifier_list COMMA identifier','identifier_list',3,'p_identifier_list','c_parser.py',1309), + ('initializer -> assignment_expression','initializer',1,'p_initializer_1','c_parser.py',1318), + ('initializer -> brace_open initializer_list_opt brace_close','initializer',3,'p_initializer_2','c_parser.py',1323), + ('initializer -> brace_open initializer_list COMMA brace_close','initializer',4,'p_initializer_2','c_parser.py',1324), + ('initializer_list -> designation_opt initializer','initializer_list',2,'p_initializer_list','c_parser.py',1332), + ('initializer_list -> initializer_list COMMA designation_opt initializer','initializer_list',4,'p_initializer_list','c_parser.py',1333), + ('designation -> designator_list EQUALS','designation',2,'p_designation','c_parser.py',1344), + ('designator_list -> designator','designator_list',1,'p_designator_list','c_parser.py',1352), + ('designator_list -> designator_list designator','designator_list',2,'p_designator_list','c_parser.py',1353), + ('designator -> LBRACKET constant_expression RBRACKET','designator',3,'p_designator','c_parser.py',1358), + ('designator -> PERIOD identifier','designator',2,'p_designator','c_parser.py',1359), + ('type_name -> specifier_qualifier_list abstract_declarator_opt','type_name',2,'p_type_name','c_parser.py',1364), + ('abstract_declarator -> pointer','abstract_declarator',1,'p_abstract_declarator_1','c_parser.py',1375), + ('abstract_declarator -> pointer direct_abstract_declarator','abstract_declarator',2,'p_abstract_declarator_2','c_parser.py',1383), + ('abstract_declarator -> direct_abstract_declarator','abstract_declarator',1,'p_abstract_declarator_3','c_parser.py',1388), + ('direct_abstract_declarator -> LPAREN abstract_declarator RPAREN','direct_abstract_declarator',3,'p_direct_abstract_declarator_1','c_parser.py',1398), + ('direct_abstract_declarator -> direct_abstract_declarator LBRACKET assignment_expression_opt RBRACKET','direct_abstract_declarator',4,'p_direct_abstract_declarator_2','c_parser.py',1402), + ('direct_abstract_declarator -> LBRACKET type_qualifier_list_opt assignment_expression_opt RBRACKET','direct_abstract_declarator',4,'p_direct_abstract_declarator_3','c_parser.py',1413), + ('direct_abstract_declarator -> direct_abstract_declarator LBRACKET TIMES RBRACKET','direct_abstract_declarator',4,'p_direct_abstract_declarator_4','c_parser.py',1423), + ('direct_abstract_declarator -> LBRACKET TIMES RBRACKET','direct_abstract_declarator',3,'p_direct_abstract_declarator_5','c_parser.py',1434), + ('direct_abstract_declarator -> direct_abstract_declarator LPAREN parameter_type_list_opt RPAREN','direct_abstract_declarator',4,'p_direct_abstract_declarator_6','c_parser.py',1443), + ('direct_abstract_declarator -> LPAREN parameter_type_list_opt RPAREN','direct_abstract_declarator',3,'p_direct_abstract_declarator_7','c_parser.py',1453), + ('block_item -> declaration','block_item',1,'p_block_item','c_parser.py',1464), + ('block_item -> statement','block_item',1,'p_block_item','c_parser.py',1465), + ('block_item_list -> block_item','block_item_list',1,'p_block_item_list','c_parser.py',1472), + ('block_item_list -> block_item_list block_item','block_item_list',2,'p_block_item_list','c_parser.py',1473), + ('compound_statement -> brace_open block_item_list_opt brace_close','compound_statement',3,'p_compound_statement_1','c_parser.py',1479), + ('labeled_statement -> ID COLON pragmacomp_or_statement','labeled_statement',3,'p_labeled_statement_1','c_parser.py',1485), + ('labeled_statement -> CASE constant_expression COLON pragmacomp_or_statement','labeled_statement',4,'p_labeled_statement_2','c_parser.py',1489), + ('labeled_statement -> DEFAULT COLON pragmacomp_or_statement','labeled_statement',3,'p_labeled_statement_3','c_parser.py',1493), + ('selection_statement -> IF LPAREN expression RPAREN pragmacomp_or_statement','selection_statement',5,'p_selection_statement_1','c_parser.py',1497), + ('selection_statement -> IF LPAREN expression RPAREN statement ELSE pragmacomp_or_statement','selection_statement',7,'p_selection_statement_2','c_parser.py',1501), + ('selection_statement -> SWITCH LPAREN expression RPAREN pragmacomp_or_statement','selection_statement',5,'p_selection_statement_3','c_parser.py',1505), + ('iteration_statement -> WHILE LPAREN expression RPAREN pragmacomp_or_statement','iteration_statement',5,'p_iteration_statement_1','c_parser.py',1510), + ('iteration_statement -> DO pragmacomp_or_statement WHILE LPAREN expression RPAREN SEMI','iteration_statement',7,'p_iteration_statement_2','c_parser.py',1514), + ('iteration_statement -> FOR LPAREN expression_opt SEMI expression_opt SEMI expression_opt RPAREN pragmacomp_or_statement','iteration_statement',9,'p_iteration_statement_3','c_parser.py',1518), + ('iteration_statement -> FOR LPAREN declaration expression_opt SEMI expression_opt RPAREN pragmacomp_or_statement','iteration_statement',8,'p_iteration_statement_4','c_parser.py',1522), + ('jump_statement -> GOTO ID SEMI','jump_statement',3,'p_jump_statement_1','c_parser.py',1527), + ('jump_statement -> BREAK SEMI','jump_statement',2,'p_jump_statement_2','c_parser.py',1531), + ('jump_statement -> CONTINUE SEMI','jump_statement',2,'p_jump_statement_3','c_parser.py',1535), + ('jump_statement -> RETURN expression SEMI','jump_statement',3,'p_jump_statement_4','c_parser.py',1539), + ('jump_statement -> RETURN SEMI','jump_statement',2,'p_jump_statement_4','c_parser.py',1540), + ('expression_statement -> expression_opt SEMI','expression_statement',2,'p_expression_statement','c_parser.py',1545), + ('expression -> assignment_expression','expression',1,'p_expression','c_parser.py',1552), + ('expression -> expression COMMA assignment_expression','expression',3,'p_expression','c_parser.py',1553), + ('typedef_name -> TYPEID','typedef_name',1,'p_typedef_name','c_parser.py',1565), + ('assignment_expression -> conditional_expression','assignment_expression',1,'p_assignment_expression','c_parser.py',1569), + ('assignment_expression -> unary_expression assignment_operator assignment_expression','assignment_expression',3,'p_assignment_expression','c_parser.py',1570), + ('assignment_operator -> EQUALS','assignment_operator',1,'p_assignment_operator','c_parser.py',1583), + ('assignment_operator -> XOREQUAL','assignment_operator',1,'p_assignment_operator','c_parser.py',1584), + ('assignment_operator -> TIMESEQUAL','assignment_operator',1,'p_assignment_operator','c_parser.py',1585), + ('assignment_operator -> DIVEQUAL','assignment_operator',1,'p_assignment_operator','c_parser.py',1586), + ('assignment_operator -> MODEQUAL','assignment_operator',1,'p_assignment_operator','c_parser.py',1587), + ('assignment_operator -> PLUSEQUAL','assignment_operator',1,'p_assignment_operator','c_parser.py',1588), + ('assignment_operator -> MINUSEQUAL','assignment_operator',1,'p_assignment_operator','c_parser.py',1589), + ('assignment_operator -> LSHIFTEQUAL','assignment_operator',1,'p_assignment_operator','c_parser.py',1590), + ('assignment_operator -> RSHIFTEQUAL','assignment_operator',1,'p_assignment_operator','c_parser.py',1591), + ('assignment_operator -> ANDEQUAL','assignment_operator',1,'p_assignment_operator','c_parser.py',1592), + ('assignment_operator -> OREQUAL','assignment_operator',1,'p_assignment_operator','c_parser.py',1593), + ('constant_expression -> conditional_expression','constant_expression',1,'p_constant_expression','c_parser.py',1598), + ('conditional_expression -> binary_expression','conditional_expression',1,'p_conditional_expression','c_parser.py',1602), + ('conditional_expression -> binary_expression CONDOP expression COLON conditional_expression','conditional_expression',5,'p_conditional_expression','c_parser.py',1603), + ('binary_expression -> cast_expression','binary_expression',1,'p_binary_expression','c_parser.py',1611), + ('binary_expression -> binary_expression TIMES binary_expression','binary_expression',3,'p_binary_expression','c_parser.py',1612), + ('binary_expression -> binary_expression DIVIDE binary_expression','binary_expression',3,'p_binary_expression','c_parser.py',1613), + ('binary_expression -> binary_expression MOD binary_expression','binary_expression',3,'p_binary_expression','c_parser.py',1614), + ('binary_expression -> binary_expression PLUS binary_expression','binary_expression',3,'p_binary_expression','c_parser.py',1615), + ('binary_expression -> binary_expression MINUS binary_expression','binary_expression',3,'p_binary_expression','c_parser.py',1616), + ('binary_expression -> binary_expression RSHIFT binary_expression','binary_expression',3,'p_binary_expression','c_parser.py',1617), + ('binary_expression -> binary_expression LSHIFT binary_expression','binary_expression',3,'p_binary_expression','c_parser.py',1618), + ('binary_expression -> binary_expression LT binary_expression','binary_expression',3,'p_binary_expression','c_parser.py',1619), + ('binary_expression -> binary_expression LE binary_expression','binary_expression',3,'p_binary_expression','c_parser.py',1620), + ('binary_expression -> binary_expression GE binary_expression','binary_expression',3,'p_binary_expression','c_parser.py',1621), + ('binary_expression -> binary_expression GT binary_expression','binary_expression',3,'p_binary_expression','c_parser.py',1622), + ('binary_expression -> binary_expression EQ binary_expression','binary_expression',3,'p_binary_expression','c_parser.py',1623), + ('binary_expression -> binary_expression NE binary_expression','binary_expression',3,'p_binary_expression','c_parser.py',1624), + ('binary_expression -> binary_expression AND binary_expression','binary_expression',3,'p_binary_expression','c_parser.py',1625), + ('binary_expression -> binary_expression OR binary_expression','binary_expression',3,'p_binary_expression','c_parser.py',1626), + ('binary_expression -> binary_expression XOR binary_expression','binary_expression',3,'p_binary_expression','c_parser.py',1627), + ('binary_expression -> binary_expression LAND binary_expression','binary_expression',3,'p_binary_expression','c_parser.py',1628), + ('binary_expression -> binary_expression LOR binary_expression','binary_expression',3,'p_binary_expression','c_parser.py',1629), + ('cast_expression -> unary_expression','cast_expression',1,'p_cast_expression_1','c_parser.py',1637), + ('cast_expression -> LPAREN type_name RPAREN cast_expression','cast_expression',4,'p_cast_expression_2','c_parser.py',1641), + ('unary_expression -> postfix_expression','unary_expression',1,'p_unary_expression_1','c_parser.py',1645), + ('unary_expression -> PLUSPLUS unary_expression','unary_expression',2,'p_unary_expression_2','c_parser.py',1649), + ('unary_expression -> MINUSMINUS unary_expression','unary_expression',2,'p_unary_expression_2','c_parser.py',1650), + ('unary_expression -> unary_operator cast_expression','unary_expression',2,'p_unary_expression_2','c_parser.py',1651), + ('unary_expression -> SIZEOF unary_expression','unary_expression',2,'p_unary_expression_3','c_parser.py',1656), + ('unary_expression -> SIZEOF LPAREN type_name RPAREN','unary_expression',4,'p_unary_expression_3','c_parser.py',1657), + ('unary_operator -> AND','unary_operator',1,'p_unary_operator','c_parser.py',1665), + ('unary_operator -> TIMES','unary_operator',1,'p_unary_operator','c_parser.py',1666), + ('unary_operator -> PLUS','unary_operator',1,'p_unary_operator','c_parser.py',1667), + ('unary_operator -> MINUS','unary_operator',1,'p_unary_operator','c_parser.py',1668), + ('unary_operator -> NOT','unary_operator',1,'p_unary_operator','c_parser.py',1669), + ('unary_operator -> LNOT','unary_operator',1,'p_unary_operator','c_parser.py',1670), + ('postfix_expression -> primary_expression','postfix_expression',1,'p_postfix_expression_1','c_parser.py',1675), + ('postfix_expression -> postfix_expression LBRACKET expression RBRACKET','postfix_expression',4,'p_postfix_expression_2','c_parser.py',1679), + ('postfix_expression -> postfix_expression LPAREN argument_expression_list RPAREN','postfix_expression',4,'p_postfix_expression_3','c_parser.py',1683), + ('postfix_expression -> postfix_expression LPAREN RPAREN','postfix_expression',3,'p_postfix_expression_3','c_parser.py',1684), + ('postfix_expression -> postfix_expression PERIOD ID','postfix_expression',3,'p_postfix_expression_4','c_parser.py',1689), + ('postfix_expression -> postfix_expression PERIOD TYPEID','postfix_expression',3,'p_postfix_expression_4','c_parser.py',1690), + ('postfix_expression -> postfix_expression ARROW ID','postfix_expression',3,'p_postfix_expression_4','c_parser.py',1691), + ('postfix_expression -> postfix_expression ARROW TYPEID','postfix_expression',3,'p_postfix_expression_4','c_parser.py',1692), + ('postfix_expression -> postfix_expression PLUSPLUS','postfix_expression',2,'p_postfix_expression_5','c_parser.py',1698), + ('postfix_expression -> postfix_expression MINUSMINUS','postfix_expression',2,'p_postfix_expression_5','c_parser.py',1699), + ('postfix_expression -> LPAREN type_name RPAREN brace_open initializer_list brace_close','postfix_expression',6,'p_postfix_expression_6','c_parser.py',1704), + ('postfix_expression -> LPAREN type_name RPAREN brace_open initializer_list COMMA brace_close','postfix_expression',7,'p_postfix_expression_6','c_parser.py',1705), + ('primary_expression -> identifier','primary_expression',1,'p_primary_expression_1','c_parser.py',1710), + ('primary_expression -> constant','primary_expression',1,'p_primary_expression_2','c_parser.py',1714), + ('primary_expression -> unified_string_literal','primary_expression',1,'p_primary_expression_3','c_parser.py',1718), + ('primary_expression -> unified_wstring_literal','primary_expression',1,'p_primary_expression_3','c_parser.py',1719), + ('primary_expression -> LPAREN expression RPAREN','primary_expression',3,'p_primary_expression_4','c_parser.py',1724), + ('primary_expression -> OFFSETOF LPAREN type_name COMMA offsetof_member_designator RPAREN','primary_expression',6,'p_primary_expression_5','c_parser.py',1728), + ('offsetof_member_designator -> identifier','offsetof_member_designator',1,'p_offsetof_member_designator','c_parser.py',1736), + ('offsetof_member_designator -> offsetof_member_designator PERIOD identifier','offsetof_member_designator',3,'p_offsetof_member_designator','c_parser.py',1737), + ('offsetof_member_designator -> offsetof_member_designator LBRACKET expression RBRACKET','offsetof_member_designator',4,'p_offsetof_member_designator','c_parser.py',1738), + ('argument_expression_list -> assignment_expression','argument_expression_list',1,'p_argument_expression_list','c_parser.py',1750), + ('argument_expression_list -> argument_expression_list COMMA assignment_expression','argument_expression_list',3,'p_argument_expression_list','c_parser.py',1751), + ('identifier -> ID','identifier',1,'p_identifier','c_parser.py',1760), + ('constant -> INT_CONST_DEC','constant',1,'p_constant_1','c_parser.py',1764), + ('constant -> INT_CONST_OCT','constant',1,'p_constant_1','c_parser.py',1765), + ('constant -> INT_CONST_HEX','constant',1,'p_constant_1','c_parser.py',1766), + ('constant -> INT_CONST_BIN','constant',1,'p_constant_1','c_parser.py',1767), + ('constant -> INT_CONST_CHAR','constant',1,'p_constant_1','c_parser.py',1768), + ('constant -> FLOAT_CONST','constant',1,'p_constant_2','c_parser.py',1787), + ('constant -> HEX_FLOAT_CONST','constant',1,'p_constant_2','c_parser.py',1788), + ('constant -> CHAR_CONST','constant',1,'p_constant_3','c_parser.py',1804), + ('constant -> WCHAR_CONST','constant',1,'p_constant_3','c_parser.py',1805), + ('unified_string_literal -> STRING_LITERAL','unified_string_literal',1,'p_unified_string_literal','c_parser.py',1816), + ('unified_string_literal -> unified_string_literal STRING_LITERAL','unified_string_literal',2,'p_unified_string_literal','c_parser.py',1817), + ('unified_wstring_literal -> WSTRING_LITERAL','unified_wstring_literal',1,'p_unified_wstring_literal','c_parser.py',1827), + ('unified_wstring_literal -> unified_wstring_literal WSTRING_LITERAL','unified_wstring_literal',2,'p_unified_wstring_literal','c_parser.py',1828), + ('brace_open -> LBRACE','brace_open',1,'p_brace_open','c_parser.py',1838), + ('brace_close -> RBRACE','brace_close',1,'p_brace_close','c_parser.py',1844), + ('empty -> ','empty',0,'p_empty','c_parser.py',1850), ] diff -Nru pypy-7.1.1+dfsg/lib_pypy/cffi/recompiler.py pypy-7.3.1+dfsg/lib_pypy/cffi/recompiler.py --- pypy-7.1.1+dfsg/lib_pypy/cffi/recompiler.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/cffi/recompiler.py 2020-04-10 19:28:40.000000000 +0000 @@ -560,23 +560,24 @@ tovar, tp.get_c_name(''), errvalue)) self._prnt(' %s;' % errcode) - def _extra_local_variables(self, tp, localvars): + def _extra_local_variables(self, tp, localvars, freelines): if isinstance(tp, model.PointerType): localvars.add('Py_ssize_t datasize') + localvars.add('struct _cffi_freeme_s *large_args_free = NULL') + freelines.add('if (large_args_free != NULL)' + ' _cffi_free_array_arguments(large_args_free);') def _convert_funcarg_to_c_ptr_or_array(self, tp, fromvar, tovar, errcode): self._prnt(' datasize = _cffi_prepare_pointer_call_argument(') self._prnt(' _cffi_type(%d), %s, (char **)&%s);' % ( self._gettypenum(tp), fromvar, tovar)) self._prnt(' if (datasize != 0) {') - self._prnt(' if (datasize < 0)') - self._prnt(' %s;' % errcode) - self._prnt(' %s = (%s)alloca((size_t)datasize);' % ( + self._prnt(' %s = ((size_t)datasize) <= 640 ? ' + '(%s)alloca((size_t)datasize) : NULL;' % ( tovar, tp.get_c_name(''))) - self._prnt(' memset((void *)%s, 0, (size_t)datasize);' % (tovar,)) - self._prnt(' if (_cffi_convert_array_from_object(' - '(char *)%s, _cffi_type(%d), %s) < 0)' % ( - tovar, self._gettypenum(tp), fromvar)) + self._prnt(' if (_cffi_convert_array_argument(_cffi_type(%d), %s, ' + '(char **)&%s,' % (self._gettypenum(tp), fromvar, tovar)) + self._prnt(' datasize, &large_args_free) < 0)') self._prnt(' %s;' % errcode) self._prnt(' }') @@ -699,9 +700,10 @@ prnt(' %s;' % arg) # localvars = set() + freelines = set() for type in tp.args: - self._extra_local_variables(type, localvars) - for decl in localvars: + self._extra_local_variables(type, localvars, freelines) + for decl in sorted(localvars): prnt(' %s;' % (decl,)) # if not isinstance(tp.result, model.VoidType): @@ -709,6 +711,7 @@ context = 'result of %s' % name result_decl = ' %s;' % tp.result.get_c_name(' result', context) prnt(result_decl) + prnt(' PyObject *pyresult;') else: result_decl = None result_code = '' @@ -742,9 +745,14 @@ if numargs == 0: prnt(' (void)noarg; /* unused */') if result_code: - prnt(' return %s;' % + prnt(' pyresult = %s;' % self._convert_expr_from_c(tp.result, 'result', 'result type')) + for freeline in freelines: + prnt(' ' + freeline) + prnt(' return pyresult;') else: + for freeline in freelines: + prnt(' ' + freeline) prnt(' Py_INCREF(Py_None);') prnt(' return Py_None;') prnt('}') @@ -855,8 +863,9 @@ try: if ftype.is_integer_type() or fbitsize >= 0: # accept all integers, but complain on float or double - prnt(" (void)((p->%s) | 0); /* check that '%s.%s' is " - "an integer */" % (fname, cname, fname)) + if fname != '': + prnt(" (void)((p->%s) | 0); /* check that '%s.%s' is " + "an integer */" % (fname, cname, fname)) continue # only accept exactly the type declared, except that '[]' # is interpreted as a '*' and so will match any array length. @@ -1215,7 +1224,8 @@ size_of_result = '(int)sizeof(%s)' % ( tp.result.get_c_name('', context),) prnt('static struct _cffi_externpy_s _cffi_externpy__%s =' % name) - prnt(' { "%s.%s", %s };' % (self.module_name, name, size_of_result)) + prnt(' { "%s.%s", %s, 0, 0 };' % ( + self.module_name, name, size_of_result)) prnt() # arguments = [] diff -Nru pypy-7.1.1+dfsg/lib_pypy/cffi/vengine_cpy.py pypy-7.3.1+dfsg/lib_pypy/cffi/vengine_cpy.py --- pypy-7.1.1+dfsg/lib_pypy/cffi/vengine_cpy.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/cffi/vengine_cpy.py 2020-04-10 19:28:40.000000000 +0000 @@ -275,22 +275,23 @@ tovar, tp.get_c_name(''), errvalue)) self._prnt(' %s;' % errcode) - def _extra_local_variables(self, tp, localvars): + def _extra_local_variables(self, tp, localvars, freelines): if isinstance(tp, model.PointerType): localvars.add('Py_ssize_t datasize') + localvars.add('struct _cffi_freeme_s *large_args_free = NULL') + freelines.add('if (large_args_free != NULL)' + ' _cffi_free_array_arguments(large_args_free);') def _convert_funcarg_to_c_ptr_or_array(self, tp, fromvar, tovar, errcode): self._prnt(' datasize = _cffi_prepare_pointer_call_argument(') self._prnt(' _cffi_type(%d), %s, (char **)&%s);' % ( self._gettypenum(tp), fromvar, tovar)) self._prnt(' if (datasize != 0) {') - self._prnt(' if (datasize < 0)') - self._prnt(' %s;' % errcode) - self._prnt(' %s = alloca((size_t)datasize);' % (tovar,)) - self._prnt(' memset((void *)%s, 0, (size_t)datasize);' % (tovar,)) - self._prnt(' if (_cffi_convert_array_from_object(' - '(char *)%s, _cffi_type(%d), %s) < 0)' % ( - tovar, self._gettypenum(tp), fromvar)) + self._prnt(' %s = ((size_t)datasize) <= 640 ? ' + 'alloca((size_t)datasize) : NULL;' % (tovar,)) + self._prnt(' if (_cffi_convert_array_argument(_cffi_type(%d), %s, ' + '(char **)&%s,' % (self._gettypenum(tp), fromvar, tovar)) + self._prnt(' datasize, &large_args_free) < 0)') self._prnt(' %s;' % errcode) self._prnt(' }') @@ -369,15 +370,17 @@ prnt(' %s;' % type.get_c_name(' x%d' % i, context)) # localvars = set() + freelines = set() for type in tp.args: - self._extra_local_variables(type, localvars) - for decl in localvars: + self._extra_local_variables(type, localvars, freelines) + for decl in sorted(localvars): prnt(' %s;' % (decl,)) # if not isinstance(tp.result, model.VoidType): result_code = 'result = ' context = 'result of %s' % name prnt(' %s;' % tp.result.get_c_name(' result', context)) + prnt(' PyObject *pyresult;') else: result_code = '' # @@ -409,9 +412,14 @@ if numargs == 0: prnt(' (void)noarg; /* unused */') if result_code: - prnt(' return %s;' % + prnt(' pyresult = %s;' % self._convert_expr_from_c(tp.result, 'result', 'result type')) + for freeline in freelines: + prnt(' ' + freeline) + prnt(' return pyresult;') else: + for freeline in freelines: + prnt(' ' + freeline) prnt(' Py_INCREF(Py_None);') prnt(' return Py_None;') prnt('}') @@ -981,6 +989,59 @@ return PyBool_FromLong(was_alive); } +union _cffi_union_alignment_u { + unsigned char m_char; + unsigned short m_short; + unsigned int m_int; + unsigned long m_long; + unsigned long long m_longlong; + float m_float; + double m_double; + long double m_longdouble; +}; + +struct _cffi_freeme_s { + struct _cffi_freeme_s *next; + union _cffi_union_alignment_u alignment; +}; + +#ifdef __GNUC__ + __attribute__((unused)) +#endif +static int _cffi_convert_array_argument(CTypeDescrObject *ctptr, PyObject *arg, + char **output_data, Py_ssize_t datasize, + struct _cffi_freeme_s **freeme) +{ + char *p; + if (datasize < 0) + return -1; + + p = *output_data; + if (p == NULL) { + struct _cffi_freeme_s *fp = (struct _cffi_freeme_s *)PyObject_Malloc( + offsetof(struct _cffi_freeme_s, alignment) + (size_t)datasize); + if (fp == NULL) + return -1; + fp->next = *freeme; + *freeme = fp; + p = *output_data = (char *)&fp->alignment; + } + memset((void *)p, 0, (size_t)datasize); + return _cffi_convert_array_from_object(p, ctptr, arg); +} + +#ifdef __GNUC__ + __attribute__((unused)) +#endif +static void _cffi_free_array_arguments(struct _cffi_freeme_s *freeme) +{ + do { + void *p = (void *)freeme; + freeme = freeme->next; + PyObject_Free(p); + } while (freeme != NULL); +} + static int _cffi_init(void) { PyObject *module, *c_api_object = NULL; diff -Nru pypy-7.1.1+dfsg/lib_pypy/cffi.egg-info/PKG-INFO pypy-7.3.1+dfsg/lib_pypy/cffi.egg-info/PKG-INFO --- pypy-7.1.1+dfsg/lib_pypy/cffi.egg-info/PKG-INFO 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/cffi.egg-info/PKG-INFO 2020-04-10 19:28:40.000000000 +0000 @@ -1,6 +1,6 @@ Metadata-Version: 1.1 Name: cffi -Version: 1.12.3 +Version: 1.14.0 Summary: Foreign Function Interface for Python calling C code. Home-page: http://cffi.readthedocs.org Author: Armin Rigo, Maciej Fijalkowski diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/build_constant_time.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/build_constant_time.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/build_constant_time.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/build_constant_time.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,27 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +import os + +from _cffi_src.utils import build_ffi, compiler_type, extra_link_args + + +with open(os.path.join( + os.path.dirname(__file__), "hazmat_src/constant_time.h" +)) as f: + types = f.read() + +with open(os.path.join( + os.path.dirname(__file__), "hazmat_src/constant_time.c" +)) as f: + functions = f.read() + +ffi = build_ffi( + module_name="_constant_time", + cdef_source=types, + verify_source=functions, + extra_link_args=extra_link_args(compiler_type()), +) diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/build_openssl.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/build_openssl.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/build_openssl.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/build_openssl.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,107 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +import os +import sys + +from _cffi_src.utils import ( + build_ffi_for_binding, compiler_type, extra_link_args +) + + +def _get_openssl_libraries(platform): + if os.environ.get("CRYPTOGRAPHY_SUPPRESS_LINK_FLAGS", None): + return [] + # OpenSSL goes by a different library name on different operating systems. + if platform == "win32" and compiler_type() == "msvc": + windows_link_legacy_openssl = os.environ.get( + "CRYPTOGRAPHY_WINDOWS_LINK_LEGACY_OPENSSL", None + ) + if 0 and windows_link_legacy_openssl is None: + # Link against the 1.1.0 names + libs = ["libssl", "libcrypto"] + else: + # Link against the 1.0.2 and lower names + libs = ["libeay32", "ssleay32"] + return libs + ["advapi32", "crypt32", "gdi32", "user32", "ws2_32"] + else: + # darwin, linux, mingw all use this path + # In some circumstances, the order in which these libs are + # specified on the linker command-line is significant; + # libssl must come before libcrypto + # (https://marc.info/?l=openssl-users&m=135361825921871) + return ["ssl", "crypto"] + + +def _extra_compile_args(platform): + """ + We set -Wconversion args here so that we only do Wconversion checks on the + code we're compiling and not on cffi itself (as passing -Wconversion in + CFLAGS would do). We set no error on sign conversion because some + function signatures in OpenSSL have changed from long -> unsigned long + in the past. Since that isn't a precision issue we don't care. + When we drop support for CRYPTOGRAPHY_OPENSSL_LESS_THAN_110 we can + revisit this. + """ + if platform not in ["win32", "hp-ux11", "sunos5"]: + return ["-Wconversion", "-Wno-error=sign-conversion"] + else: + return [] + + +ffi = build_ffi_for_binding( + module_name="_openssl", + module_prefix="_cffi_src.openssl.", + modules=[ + # This goes first so we can define some cryptography-wide symbols. + "cryptography", + + "aes", + "asn1", + "bignum", + "bio", + "cmac", + "conf", + "crypto", + "ct", + "dh", + "dsa", + "ec", + "ecdh", + "ecdsa", + "engine", + "err", + "evp", + "fips", + "hmac", + "nid", + "objects", + "ocsp", + "opensslv", + "osrandom_engine", + "pem", + "pkcs12", + "rand", + "rsa", + "ssl", + "x509", + "x509name", + "x509v3", + "x509_vfy", + "pkcs7", + "callbacks", + ], + libraries=_get_openssl_libraries(sys.platform), + # These args are passed here so that we only do Wconversion checks on the + # code we're compiling and not on cffi itself (as passing -Wconversion in + # CFLAGS would do). We set no error on sign convesrion because some + # function signatures in OpenSSL have changed from long -> unsigned long + # in the past. Since that isn't a precision issue we don't care. + # When we drop support for CRYPTOGRAPHY_OPENSSL_LESS_THAN_110 we can + # revisit this. + extra_compile_args=_extra_compile_args(sys.platform), + extra_link_args=extra_link_args(compiler_type()), +) diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/build_padding.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/build_padding.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/build_padding.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/build_padding.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,27 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +import os + +from _cffi_src.utils import build_ffi, compiler_type, extra_link_args + + +with open(os.path.join( + os.path.dirname(__file__), "hazmat_src/padding.h" +)) as f: + types = f.read() + +with open(os.path.join( + os.path.dirname(__file__), "hazmat_src/padding.c" +)) as f: + functions = f.read() + +ffi = build_ffi( + module_name="_padding", + cdef_source=types, + verify_source=functions, + extra_link_args=extra_link_args(compiler_type()), +) diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/hazmat_src/constant_time.c pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/hazmat_src/constant_time.c --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/hazmat_src/constant_time.c 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/hazmat_src/constant_time.c 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,22 @@ +// This file is dual licensed under the terms of the Apache License, Version +// 2.0, and the BSD License. See the LICENSE file in the root of this +// repository for complete details. + +uint8_t Cryptography_constant_time_bytes_eq(uint8_t *a, size_t len_a, + uint8_t *b, size_t len_b) { + size_t i = 0; + uint8_t mismatch = 0; + if (len_a != len_b) { + return 0; + } + for (i = 0; i < len_a; i++) { + mismatch |= a[i] ^ b[i]; + } + + /* Make sure any bits set are copied to the lowest bit */ + mismatch |= mismatch >> 4; + mismatch |= mismatch >> 2; + mismatch |= mismatch >> 1; + /* Now check the low bit to see if it's set */ + return (mismatch & 1) == 0; +} diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/hazmat_src/constant_time.h pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/hazmat_src/constant_time.h --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/hazmat_src/constant_time.h 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/hazmat_src/constant_time.h 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,6 @@ +// This file is dual licensed under the terms of the Apache License, Version +// 2.0, and the BSD License. See the LICENSE file in the root of this +// repository for complete details. + +uint8_t Cryptography_constant_time_bytes_eq(uint8_t *, size_t, uint8_t *, + size_t); diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/hazmat_src/padding.c pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/hazmat_src/padding.c --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/hazmat_src/padding.c 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/hazmat_src/padding.c 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,65 @@ +// This file is dual licensed under the terms of the Apache License, Version +// 2.0, and the BSD License. See the LICENSE file in the root of this +// repository for complete details. + +/* Returns the value of the input with the most-significant-bit copied to all + of the bits. */ +static uint16_t Cryptography_DUPLICATE_MSB_TO_ALL(uint16_t a) { + return (1 - (a >> (sizeof(uint16_t) * 8 - 1))) - 1; +} + +/* This returns 0xFFFF if a < b else 0x0000, but does so in a constant time + fashion */ +static uint16_t Cryptography_constant_time_lt(uint16_t a, uint16_t b) { + a -= b; + return Cryptography_DUPLICATE_MSB_TO_ALL(a); +} + +uint8_t Cryptography_check_pkcs7_padding(const uint8_t *data, + uint16_t block_len) { + uint16_t i; + uint16_t pad_size = data[block_len - 1]; + uint16_t mismatch = 0; + for (i = 0; i < block_len; i++) { + unsigned int mask = Cryptography_constant_time_lt(i, pad_size); + uint16_t b = data[block_len - 1 - i]; + mismatch |= (mask & (pad_size ^ b)); + } + + /* Check to make sure the pad_size was within the valid range. */ + mismatch |= ~Cryptography_constant_time_lt(0, pad_size); + mismatch |= Cryptography_constant_time_lt(block_len, pad_size); + + /* Make sure any bits set are copied to the lowest bit */ + mismatch |= mismatch >> 8; + mismatch |= mismatch >> 4; + mismatch |= mismatch >> 2; + mismatch |= mismatch >> 1; + /* Now check the low bit to see if it's set */ + return (mismatch & 1) == 0; +} + +uint8_t Cryptography_check_ansix923_padding(const uint8_t *data, + uint16_t block_len) { + uint16_t i; + uint16_t pad_size = data[block_len - 1]; + uint16_t mismatch = 0; + /* Skip the first one with the pad size */ + for (i = 1; i < block_len; i++) { + unsigned int mask = Cryptography_constant_time_lt(i, pad_size); + uint16_t b = data[block_len - 1 - i]; + mismatch |= (mask & b); + } + + /* Check to make sure the pad_size was within the valid range. */ + mismatch |= ~Cryptography_constant_time_lt(0, pad_size); + mismatch |= Cryptography_constant_time_lt(block_len, pad_size); + + /* Make sure any bits set are copied to the lowest bit */ + mismatch |= mismatch >> 8; + mismatch |= mismatch >> 4; + mismatch |= mismatch >> 2; + mismatch |= mismatch >> 1; + /* Now check the low bit to see if it's set */ + return (mismatch & 1) == 0; +} diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/hazmat_src/padding.h pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/hazmat_src/padding.h --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/hazmat_src/padding.h 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/hazmat_src/padding.h 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,6 @@ +// This file is dual licensed under the terms of the Apache License, Version +// 2.0, and the BSD License. See the LICENSE file in the root of this +// repository for complete details. + +uint8_t Cryptography_check_pkcs7_padding(const uint8_t *, uint8_t); +uint8_t Cryptography_check_ansix923_padding(const uint8_t *, uint8_t); diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/aes.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/aes.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/aes.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/aes.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,26 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +INCLUDES = """ +#include +""" + +TYPES = """ +typedef ... AES_KEY; +""" + +FUNCTIONS = """ +int AES_set_encrypt_key(const unsigned char *, const int, AES_KEY *); +int AES_set_decrypt_key(const unsigned char *, const int, AES_KEY *); + +int AES_wrap_key(AES_KEY *, const unsigned char *, unsigned char *, + const unsigned char *, unsigned int); +int AES_unwrap_key(AES_KEY *, const unsigned char *, unsigned char *, + const unsigned char *, unsigned int); +""" + +CUSTOMIZATIONS = """ +""" diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/asn1.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/asn1.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/asn1.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/asn1.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,115 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +INCLUDES = """ +#include +""" + +TYPES = """ +typedef int... time_t; + +typedef ... ASN1_INTEGER; + +struct asn1_string_st { + int length; + int type; + unsigned char *data; + long flags; +}; + +typedef struct asn1_string_st ASN1_OCTET_STRING; +typedef struct asn1_string_st ASN1_IA5STRING; +typedef struct asn1_string_st ASN1_BIT_STRING; +typedef struct asn1_string_st ASN1_TIME; +typedef ... ASN1_OBJECT; +typedef struct asn1_string_st ASN1_STRING; +typedef struct asn1_string_st ASN1_UTF8STRING; +typedef ... ASN1_TYPE; +typedef ... ASN1_GENERALIZEDTIME; +typedef ... ASN1_ENUMERATED; +typedef ... ASN1_ITEM; +typedef ... ASN1_VALUE; + +typedef ... ASN1_ITEM_EXP; +typedef ... ASN1_NULL; + +static const int V_ASN1_GENERALIZEDTIME; + +static const int MBSTRING_UTF8; +""" + +FUNCTIONS = """ +void ASN1_OBJECT_free(ASN1_OBJECT *); + +/* ASN1 STRING */ +unsigned char *ASN1_STRING_data(ASN1_STRING *); +int ASN1_STRING_set(ASN1_STRING *, const void *, int); + +/* ASN1 OCTET STRING */ +ASN1_OCTET_STRING *ASN1_OCTET_STRING_new(void); +void ASN1_OCTET_STRING_free(ASN1_OCTET_STRING *); +int ASN1_OCTET_STRING_set(ASN1_OCTET_STRING *, const unsigned char *, int); + +/* ASN1 IA5STRING */ +ASN1_IA5STRING *ASN1_IA5STRING_new(void); + +/* ASN1 INTEGER */ +void ASN1_INTEGER_free(ASN1_INTEGER *); +int ASN1_INTEGER_set(ASN1_INTEGER *, long); + +/* ASN1 TIME */ +ASN1_TIME *ASN1_TIME_new(void); +void ASN1_TIME_free(ASN1_TIME *); +ASN1_TIME *ASN1_TIME_set(ASN1_TIME *, time_t); +int ASN1_TIME_set_string(ASN1_TIME *, const char *); + +/* ASN1 GENERALIZEDTIME */ +ASN1_GENERALIZEDTIME *ASN1_GENERALIZEDTIME_set(ASN1_GENERALIZEDTIME *, time_t); +void ASN1_GENERALIZEDTIME_free(ASN1_GENERALIZEDTIME *); + +/* ASN1 ENUMERATED */ +ASN1_ENUMERATED *ASN1_ENUMERATED_new(void); +void ASN1_ENUMERATED_free(ASN1_ENUMERATED *); +int ASN1_ENUMERATED_set(ASN1_ENUMERATED *, long); + +ASN1_VALUE *ASN1_item_d2i(ASN1_VALUE **, const unsigned char **, long, + const ASN1_ITEM *); +int ASN1_BIT_STRING_set_bit(ASN1_BIT_STRING *, int, int); +/* These became const ASN1_* in 1.1.0 */ +int ASN1_STRING_type(ASN1_STRING *); +int ASN1_STRING_to_UTF8(unsigned char **, ASN1_STRING *); +long ASN1_ENUMERATED_get(ASN1_ENUMERATED *); +int i2a_ASN1_INTEGER(BIO *, ASN1_INTEGER *); + +/* This became const ASN1_TIME in 1.1.0f */ +ASN1_GENERALIZEDTIME *ASN1_TIME_to_generalizedtime(ASN1_TIME *, + ASN1_GENERALIZEDTIME **); + +ASN1_UTF8STRING *ASN1_UTF8STRING_new(void); +void ASN1_UTF8STRING_free(ASN1_UTF8STRING *); + +ASN1_BIT_STRING *ASN1_BIT_STRING_new(void); +void ASN1_BIT_STRING_free(ASN1_BIT_STRING *); +const ASN1_ITEM *ASN1_ITEM_ptr(ASN1_ITEM_EXP *); + +/* This is not a macro, but is const on some versions of OpenSSL */ +int ASN1_BIT_STRING_get_bit(ASN1_BIT_STRING *, int); + +int ASN1_TIME_print(BIO *, ASN1_TIME *); +int ASN1_STRING_length(ASN1_STRING *); +int ASN1_STRING_set_default_mask_asc(char *); + +BIGNUM *ASN1_INTEGER_to_BN(ASN1_INTEGER *, BIGNUM *); +ASN1_INTEGER *BN_to_ASN1_INTEGER(BIGNUM *, ASN1_INTEGER *); + +int i2d_ASN1_TYPE(ASN1_TYPE *, unsigned char **); +ASN1_TYPE *d2i_ASN1_TYPE(ASN1_TYPE **, const unsigned char **, long); + +ASN1_NULL *ASN1_NULL_new(void); +""" + +CUSTOMIZATIONS = """ +""" diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/bignum.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/bignum.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/bignum.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/bignum.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,85 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +INCLUDES = """ +#include +""" + +TYPES = """ +typedef ... BN_CTX; +typedef ... BN_MONT_CTX; +typedef ... BIGNUM; +typedef int... BN_ULONG; +""" + +FUNCTIONS = """ +#define BN_FLG_CONSTTIME ... + +void BN_set_flags(BIGNUM *, int); + +BIGNUM *BN_new(void); +void BN_free(BIGNUM *); +void BN_clear_free(BIGNUM *); + +int BN_rand_range(BIGNUM *, const BIGNUM *); + +BN_CTX *BN_CTX_new(void); +void BN_CTX_free(BN_CTX *); + +void BN_CTX_start(BN_CTX *); +BIGNUM *BN_CTX_get(BN_CTX *); +void BN_CTX_end(BN_CTX *); + +BN_MONT_CTX *BN_MONT_CTX_new(void); +int BN_MONT_CTX_set(BN_MONT_CTX *, const BIGNUM *, BN_CTX *); +void BN_MONT_CTX_free(BN_MONT_CTX *); + +BIGNUM *BN_dup(const BIGNUM *); + +int BN_set_word(BIGNUM *, BN_ULONG); + +const BIGNUM *BN_value_one(void); + +char *BN_bn2hex(const BIGNUM *); +int BN_hex2bn(BIGNUM **, const char *); + +int BN_bn2bin(const BIGNUM *, unsigned char *); +BIGNUM *BN_bin2bn(const unsigned char *, int, BIGNUM *); + +int BN_num_bits(const BIGNUM *); + +int BN_cmp(const BIGNUM *, const BIGNUM *); +int BN_is_negative(const BIGNUM *); +int BN_add(BIGNUM *, const BIGNUM *, const BIGNUM *); +int BN_sub(BIGNUM *, const BIGNUM *, const BIGNUM *); +int BN_nnmod(BIGNUM *, const BIGNUM *, const BIGNUM *, BN_CTX *); +int BN_mod_add(BIGNUM *, const BIGNUM *, const BIGNUM *, const BIGNUM *, + BN_CTX *); +int BN_mod_sub(BIGNUM *, const BIGNUM *, const BIGNUM *, const BIGNUM *, + BN_CTX *); +int BN_mod_mul(BIGNUM *, const BIGNUM *, const BIGNUM *, const BIGNUM *, + BN_CTX *); +int BN_mod_exp(BIGNUM *, const BIGNUM *, const BIGNUM *, const BIGNUM *, + BN_CTX *); +int BN_mod_exp_mont(BIGNUM *, const BIGNUM *, const BIGNUM *, const BIGNUM *, + BN_CTX *, BN_MONT_CTX *); +int BN_mod_exp_mont_consttime(BIGNUM *, const BIGNUM *, const BIGNUM *, + const BIGNUM *, BN_CTX *, BN_MONT_CTX *); +BIGNUM *BN_mod_inverse(BIGNUM *, const BIGNUM *, const BIGNUM *, BN_CTX *); + +int BN_num_bytes(const BIGNUM *); + +int BN_mod(BIGNUM *, const BIGNUM *, const BIGNUM *, BN_CTX *); + +/* The following 3 prime methods are exposed for Tribler. */ +int BN_generate_prime_ex(BIGNUM *, int, int, const BIGNUM *, + const BIGNUM *, BN_GENCB *); +int BN_is_prime_ex(const BIGNUM *, int, BN_CTX *, BN_GENCB *); +const int BN_prime_checks_for_size(int); +""" + +CUSTOMIZATIONS = """ +""" diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/bio.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/bio.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/bio.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/bio.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,53 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +INCLUDES = """ +#include +""" + +TYPES = """ +typedef ... BIO; +typedef ... BIO_METHOD; +""" + +FUNCTIONS = """ +int BIO_free(BIO *); +void BIO_free_all(BIO *); +BIO *BIO_new_file(const char *, const char *); +BIO *BIO_new_dgram(int, int); +size_t BIO_ctrl_pending(BIO *); +int BIO_read(BIO *, void *, int); +int BIO_gets(BIO *, char *, int); +int BIO_write(BIO *, const void *, int); +/* Added in 1.1.0 */ +int BIO_up_ref(BIO *); + +BIO *BIO_new(BIO_METHOD *); +BIO_METHOD *BIO_s_mem(void); +BIO_METHOD *BIO_s_file(void); +BIO_METHOD *BIO_s_datagram(void); +BIO *BIO_new_mem_buf(const void *, int); +long BIO_set_mem_eof_return(BIO *, int); +long BIO_get_mem_data(BIO *, char **); +long BIO_read_filename(BIO *, char *); +int BIO_should_read(BIO *); +int BIO_should_write(BIO *); +int BIO_should_io_special(BIO *); +int BIO_should_retry(BIO *); +int BIO_reset(BIO *); +long BIO_set_nbio(BIO *, long); +void BIO_set_retry_read(BIO *); +void BIO_clear_retry_flags(BIO *); +""" + +CUSTOMIZATIONS = """ +#if CRYPTOGRAPHY_OPENSSL_LESS_THAN_110 && !CRYPTOGRAPHY_LIBRESSL_27_OR_GREATER +int BIO_up_ref(BIO *b) { + CRYPTO_add(&b->references, 1, CRYPTO_LOCK_BIO); + return 1; +} +#endif +""" diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/callbacks.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/callbacks.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/callbacks.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/callbacks.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,168 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +INCLUDES = """ +#include +#include +#include +#include + +#ifdef _WIN32 +#define WIN32_LEAN_AND_MEAN +#include +#include +#include +#else +#include +#include +#include +#endif +""" + +TYPES = """ +typedef struct { + char *password; + int length; + int called; + int error; + int maxsize; +} CRYPTOGRAPHY_PASSWORD_DATA; +""" + +FUNCTIONS = """ +int Cryptography_setup_ssl_threads(void); +int Cryptography_pem_password_cb(char *, int, int, void *); +""" + +CUSTOMIZATIONS = """ +/* This code is derived from the locking code found in the Python _ssl module's + locking callback for OpenSSL. + + Copyright 2001-2016 Python Software Foundation; All Rights Reserved. + + It has been subsequently modified to use cross platform locking without + using CPython APIs by Armin Rigo of the PyPy project. +*/ + +#if CRYPTOGRAPHY_OPENSSL_LESS_THAN_110 +#ifdef _WIN32 +typedef CRITICAL_SECTION Cryptography_mutex; +static __inline void cryptography_mutex_init(Cryptography_mutex *mutex) { + InitializeCriticalSection(mutex); +} +static __inline void cryptography_mutex_lock(Cryptography_mutex *mutex) { + EnterCriticalSection(mutex); +} +static __inline void cryptography_mutex_unlock(Cryptography_mutex *mutex) { + LeaveCriticalSection(mutex); +} +#else +typedef pthread_mutex_t Cryptography_mutex; +#define ASSERT_STATUS(call) \ + if ((call) != 0) { \ + perror("Fatal error in callback initialization: " #call); \ + abort(); \ + } +static inline void cryptography_mutex_init(Cryptography_mutex *mutex) { +#if !defined(pthread_mutexattr_default) +# define pthread_mutexattr_default ((pthread_mutexattr_t *)NULL) +#endif + ASSERT_STATUS(pthread_mutex_init(mutex, pthread_mutexattr_default)); +} +static inline void cryptography_mutex_lock(Cryptography_mutex *mutex) { + ASSERT_STATUS(pthread_mutex_lock(mutex)); +} +static inline void cryptography_mutex_unlock(Cryptography_mutex *mutex) { + ASSERT_STATUS(pthread_mutex_unlock(mutex)); +} +#endif + + +static unsigned int _ssl_locks_count = 0; +static Cryptography_mutex *_ssl_locks = NULL; + +static void _ssl_thread_locking_function(int mode, int n, const char *file, + int line) { + /* this function is needed to perform locking on shared data + structures. (Note that OpenSSL uses a number of global data + structures that will be implicitly shared whenever multiple + threads use OpenSSL.) Multi-threaded applications will + crash at random if it is not set. + + locking_function() must be able to handle up to + CRYPTO_num_locks() different mutex locks. It sets the n-th + lock if mode & CRYPTO_LOCK, and releases it otherwise. + + file and line are the file number of the function setting the + lock. They can be useful for debugging. + */ + + if ((_ssl_locks == NULL) || + (n < 0) || ((unsigned)n >= _ssl_locks_count)) { + return; + } + + if (mode & CRYPTO_LOCK) { + cryptography_mutex_lock(_ssl_locks + n); + } else { + cryptography_mutex_unlock(_ssl_locks + n); + } +} + +static void init_mutexes(void) { + int i; + for (i = 0; i < _ssl_locks_count; i++) { + cryptography_mutex_init(_ssl_locks + i); + } +} + + +int Cryptography_setup_ssl_threads(void) { + if (_ssl_locks == NULL) { + _ssl_locks_count = CRYPTO_num_locks(); + _ssl_locks = calloc(_ssl_locks_count, sizeof(Cryptography_mutex)); + if (_ssl_locks == NULL) { + return 0; + } + init_mutexes(); + CRYPTO_set_locking_callback(_ssl_thread_locking_function); +#ifndef _WIN32 + pthread_atfork(NULL, NULL, &init_mutexes); +#endif + } + return 1; +} +#else +int (*Cryptography_setup_ssl_threads)(void) = NULL; +#endif + +typedef struct { + char *password; + int length; + int called; + int error; + int maxsize; +} CRYPTOGRAPHY_PASSWORD_DATA; + +int Cryptography_pem_password_cb(char *buf, int size, + int rwflag, void *userdata) { + /* The password cb is only invoked if OpenSSL decides the private + key is encrypted. So this path only occurs if it needs a password */ + CRYPTOGRAPHY_PASSWORD_DATA *st = (CRYPTOGRAPHY_PASSWORD_DATA *)userdata; + st->called += 1; + st->maxsize = size; + if (st->length == 0) { + st->error = -1; + return 0; + } else if (st->length < size) { + memcpy(buf, st->password, st->length); + return st->length; + } else { + st->error = -2; + return 0; + } +} +""" diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/cmac.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/cmac.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/cmac.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/cmac.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,27 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +INCLUDES = """ +#if !defined(OPENSSL_NO_CMAC) +#include +#endif +""" + +TYPES = """ +typedef ... CMAC_CTX; +""" + +FUNCTIONS = """ +CMAC_CTX *CMAC_CTX_new(void); +int CMAC_Init(CMAC_CTX *, const void *, size_t, const EVP_CIPHER *, ENGINE *); +int CMAC_Update(CMAC_CTX *, const void *, size_t); +int CMAC_Final(CMAC_CTX *, unsigned char *, size_t *); +int CMAC_CTX_copy(CMAC_CTX *, const CMAC_CTX *); +void CMAC_CTX_free(CMAC_CTX *); +""" + +CUSTOMIZATIONS = """ +""" diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/conf.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/conf.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/conf.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/conf.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,21 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +INCLUDES = """ +#include +""" + +TYPES = """ +""" + +FUNCTIONS = """ +void OPENSSL_config(const char *); +/* This is a macro in 1.1.0 */ +void OPENSSL_no_config(void); +""" + +CUSTOMIZATIONS = """ +""" diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/cryptography.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/cryptography.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/cryptography.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/cryptography.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,91 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +INCLUDES = """ +/* define our OpenSSL API compatibility level to 1.0.1. Any symbols older than + that will raise an error during compilation. We can raise this number again + after we drop 1.0.2 support in the distant future. */ +#define OPENSSL_API_COMPAT 0x10001000L + +#include + + +#if defined(LIBRESSL_VERSION_NUMBER) +#define CRYPTOGRAPHY_IS_LIBRESSL 1 +#else +#define CRYPTOGRAPHY_IS_LIBRESSL 0 +#endif + +/* + LibreSSL removed e_os2.h from the public headers so we'll only include it + if we're using vanilla OpenSSL. +*/ +#if !CRYPTOGRAPHY_IS_LIBRESSL +#include +#endif +#if defined(_WIN32) +#define WIN32_LEAN_AND_MEAN +#include +#include +#include +#endif + +#if CRYPTOGRAPHY_IS_LIBRESSL +#define CRYPTOGRAPHY_LIBRESSL_27_OR_GREATER \ + (LIBRESSL_VERSION_NUMBER >= 0x2070000f) +#define CRYPTOGRAPHY_LIBRESSL_28_OR_GREATER \ + (LIBRESSL_VERSION_NUMBER >= 0x2080000f) +#define CRYPTOGRAPHY_LIBRESSL_291_OR_GREATER \ + (LIBRESSL_VERSION_NUMBER >= 0x2090100f) +#else +#define CRYPTOGRAPHY_LIBRESSL_27_OR_GREATER (0) +#define CRYPTOGRAPHY_LIBRESSL_28_OR_GREATER (0) +#define CRYPTOGRAPHY_LIBRESSL_291_OR_GREATER (0) +#endif + +#define CRYPTOGRAPHY_OPENSSL_102_OR_GREATER \ + (OPENSSL_VERSION_NUMBER >= 0x10002000 && !CRYPTOGRAPHY_IS_LIBRESSL) +#define CRYPTOGRAPHY_OPENSSL_102L_OR_GREATER \ + (OPENSSL_VERSION_NUMBER >= 0x100020cf && !CRYPTOGRAPHY_IS_LIBRESSL) +#define CRYPTOGRAPHY_OPENSSL_110_OR_GREATER \ + (OPENSSL_VERSION_NUMBER >= 0x10100000 && !CRYPTOGRAPHY_IS_LIBRESSL) +#define CRYPTOGRAPHY_OPENSSL_110F_OR_GREATER \ + (OPENSSL_VERSION_NUMBER >= 0x1010006f && !CRYPTOGRAPHY_IS_LIBRESSL) + +#define CRYPTOGRAPHY_OPENSSL_LESS_THAN_102 \ + (OPENSSL_VERSION_NUMBER < 0x10002000 || CRYPTOGRAPHY_IS_LIBRESSL) +#define CRYPTOGRAPHY_OPENSSL_LESS_THAN_102I \ + (OPENSSL_VERSION_NUMBER < 0x1000209f || CRYPTOGRAPHY_IS_LIBRESSL) +#define CRYPTOGRAPHY_OPENSSL_LESS_THAN_110 \ + (OPENSSL_VERSION_NUMBER < 0x10100000 || CRYPTOGRAPHY_IS_LIBRESSL) +#define CRYPTOGRAPHY_OPENSSL_LESS_THAN_110J \ + (OPENSSL_VERSION_NUMBER < 0x101000af || CRYPTOGRAPHY_IS_LIBRESSL) +#define CRYPTOGRAPHY_OPENSSL_LESS_THAN_111 \ + (OPENSSL_VERSION_NUMBER < 0x10101000 || CRYPTOGRAPHY_IS_LIBRESSL) +#define CRYPTOGRAPHY_OPENSSL_LESS_THAN_111B \ + (OPENSSL_VERSION_NUMBER < 0x10101020 || CRYPTOGRAPHY_IS_LIBRESSL) +""" + +TYPES = """ +static const int CRYPTOGRAPHY_OPENSSL_102L_OR_GREATER; +static const int CRYPTOGRAPHY_OPENSSL_110_OR_GREATER; +static const int CRYPTOGRAPHY_OPENSSL_110F_OR_GREATER; + +static const int CRYPTOGRAPHY_OPENSSL_LESS_THAN_102I; +static const int CRYPTOGRAPHY_OPENSSL_LESS_THAN_102; +static const int CRYPTOGRAPHY_OPENSSL_LESS_THAN_111; +static const int CRYPTOGRAPHY_OPENSSL_LESS_THAN_111B; + +static const int CRYPTOGRAPHY_IS_LIBRESSL; + +static const int CRYPTOGRAPHY_LIBRESSL_28_OR_GREATER; +""" + +FUNCTIONS = """ +""" + +CUSTOMIZATIONS = """ +""" diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/crypto.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/crypto.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/crypto.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/crypto.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,133 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +INCLUDES = """ +#include +""" + +TYPES = """ +static const long Cryptography_HAS_LOCKING_CALLBACKS; +static const long Cryptography_HAS_MEM_FUNCTIONS; +static const long Cryptography_HAS_OPENSSL_CLEANUP; + +static const int SSLEAY_VERSION; +static const int SSLEAY_CFLAGS; +static const int SSLEAY_PLATFORM; +static const int SSLEAY_DIR; +static const int SSLEAY_BUILT_ON; +static const int OPENSSL_VERSION; +static const int OPENSSL_CFLAGS; +static const int OPENSSL_BUILT_ON; +static const int OPENSSL_PLATFORM; +static const int OPENSSL_DIR; +static const int CRYPTO_MEM_CHECK_ON; +static const int CRYPTO_MEM_CHECK_OFF; +static const int CRYPTO_MEM_CHECK_ENABLE; +static const int CRYPTO_MEM_CHECK_DISABLE; +""" + +FUNCTIONS = """ +int CRYPTO_mem_ctrl(int); + +void OPENSSL_cleanup(void); + +/* as of 1.1.0 OpenSSL does its own locking *angelic chorus*. This function + is now a noop macro. We can delete this once we drop 1.0.2 support. */ +void (*CRYPTO_get_locking_callback(void))(int, int, const char *, int); + +/* SSLeay was removed in 1.1.0 */ +unsigned long SSLeay(void); +const char *SSLeay_version(int); +/* these functions were added to replace the SSLeay functions in 1.1.0 */ +unsigned long OpenSSL_version_num(void); +const char *OpenSSL_version(int); + +/* this is a macro in 1.1.0 */ +void *OPENSSL_malloc(size_t); +void OPENSSL_free(void *); + + +/* Signature changed significantly in 1.1.0, only expose there for sanity */ +int Cryptography_CRYPTO_set_mem_functions( + void *(*)(size_t, const char *, int), + void *(*)(void *, size_t, const char *, int), + void (*)(void *, const char *, int)); + +void *Cryptography_malloc_wrapper(size_t, const char *, int); +void *Cryptography_realloc_wrapper(void *, size_t, const char *, int); +void Cryptography_free_wrapper(void *, const char *, int); +""" + +CUSTOMIZATIONS = """ +/* In 1.1.0 SSLeay has finally been retired. We bidirectionally define the + values so you can use either one. This is so we can use the new function + names no matter what OpenSSL we're running on, but users on older pyOpenSSL + releases won't see issues if they're running OpenSSL 1.1.0 */ +#if !defined(SSLEAY_VERSION) +# define SSLeay OpenSSL_version_num +# define SSLeay_version OpenSSL_version +# define SSLEAY_VERSION_NUMBER OPENSSL_VERSION_NUMBER +# define SSLEAY_VERSION OPENSSL_VERSION +# define SSLEAY_CFLAGS OPENSSL_CFLAGS +# define SSLEAY_BUILT_ON OPENSSL_BUILT_ON +# define SSLEAY_PLATFORM OPENSSL_PLATFORM +# define SSLEAY_DIR OPENSSL_DIR +#endif +#if !defined(OPENSSL_VERSION) +# define OpenSSL_version_num SSLeay +# define OpenSSL_version SSLeay_version +# define OPENSSL_VERSION SSLEAY_VERSION +# define OPENSSL_CFLAGS SSLEAY_CFLAGS +# define OPENSSL_BUILT_ON SSLEAY_BUILT_ON +# define OPENSSL_PLATFORM SSLEAY_PLATFORM +# define OPENSSL_DIR SSLEAY_DIR +#endif +#if CRYPTOGRAPHY_OPENSSL_LESS_THAN_110 +static const long Cryptography_HAS_LOCKING_CALLBACKS = 1; +#else +static const long Cryptography_HAS_LOCKING_CALLBACKS = 0; +#endif + +#if CRYPTOGRAPHY_OPENSSL_LESS_THAN_110 +static const long Cryptography_HAS_OPENSSL_CLEANUP = 0; + +void (*OPENSSL_cleanup)(void) = NULL; + +/* This function has a significantly different signature pre-1.1.0. since it is + * for testing only, we don't bother to expose it on older OpenSSLs. + */ +static const long Cryptography_HAS_MEM_FUNCTIONS = 0; +int (*Cryptography_CRYPTO_set_mem_functions)( + void *(*)(size_t, const char *, int), + void *(*)(void *, size_t, const char *, int), + void (*)(void *, const char *, int)) = NULL; + +#else +static const long Cryptography_HAS_OPENSSL_CLEANUP = 1; +static const long Cryptography_HAS_MEM_FUNCTIONS = 1; + +int Cryptography_CRYPTO_set_mem_functions( + void *(*m)(size_t, const char *, int), + void *(*r)(void *, size_t, const char *, int), + void (*f)(void *, const char *, int) +) { + return CRYPTO_set_mem_functions(m, r, f); +} +#endif + +void *Cryptography_malloc_wrapper(size_t size, const char *path, int line) { + return malloc(size); +} + +void *Cryptography_realloc_wrapper(void *ptr, size_t size, const char *path, + int line) { + return realloc(ptr, size); +} + +void Cryptography_free_wrapper(void *ptr, const char *path, int line) { + free(ptr); +} +""" diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/ct.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/ct.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/ct.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/ct.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,111 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +INCLUDES = """ +#if CRYPTOGRAPHY_OPENSSL_110_OR_GREATER +#include + +typedef STACK_OF(SCT) Cryptography_STACK_OF_SCT; +#endif +""" + +TYPES = """ +static const long Cryptography_HAS_SCT; + +typedef enum { + SCT_VERSION_NOT_SET, + SCT_VERSION_V1 +} sct_version_t; + +typedef enum { + CT_LOG_ENTRY_TYPE_NOT_SET, + CT_LOG_ENTRY_TYPE_X509, + CT_LOG_ENTRY_TYPE_PRECERT +} ct_log_entry_type_t; + +typedef enum { + SCT_SOURCE_UNKNOWN, + SCT_SOURCE_TLS_EXTENSION, + SCT_SOURCE_X509V3_EXTENSION, + SCT_SOURCE_OCSP_STAPLED_RESPONSE +} sct_source_t; + +typedef ... SCT; +typedef ... Cryptography_STACK_OF_SCT; +""" + +FUNCTIONS = """ +sct_version_t SCT_get_version(const SCT *); + +ct_log_entry_type_t SCT_get_log_entry_type(const SCT *); + +size_t SCT_get0_log_id(const SCT *, unsigned char **); + +size_t SCT_get0_signature(const SCT *, unsigned char **); + +uint64_t SCT_get_timestamp(const SCT *); + +int SCT_set_source(SCT *, sct_source_t); + +int sk_SCT_num(const Cryptography_STACK_OF_SCT *); +SCT *sk_SCT_value(const Cryptography_STACK_OF_SCT *, int); + +void SCT_LIST_free(Cryptography_STACK_OF_SCT *); + +int sk_SCT_push(Cryptography_STACK_OF_SCT *, SCT *); +Cryptography_STACK_OF_SCT *sk_SCT_new_null(void); +SCT *SCT_new(void); +int SCT_set1_log_id(SCT *, unsigned char *, size_t); +void SCT_set_timestamp(SCT *, uint64_t); +int SCT_set_version(SCT *, sct_version_t); +int SCT_set_log_entry_type(SCT *, ct_log_entry_type_t); +""" + +CUSTOMIZATIONS = """ +#if CRYPTOGRAPHY_OPENSSL_110_OR_GREATER +static const long Cryptography_HAS_SCT = 1; +#else +static const long Cryptography_HAS_SCT = 0; + +typedef enum { + SCT_VERSION_NOT_SET, + SCT_VERSION_V1 +} sct_version_t; +typedef enum { + CT_LOG_ENTRY_TYPE_NOT_SET, + CT_LOG_ENTRY_TYPE_X509, + CT_LOG_ENTRY_TYPE_PRECERT +} ct_log_entry_type_t; +typedef enum { + SCT_SOURCE_UNKNOWN, + SCT_SOURCE_TLS_EXTENSION, + SCT_SOURCE_X509V3_EXTENSION, + SCT_SOURCE_OCSP_STAPLED_RESPONSE +} sct_source_t; +typedef void SCT; +typedef void Cryptography_STACK_OF_SCT; + +sct_version_t (*SCT_get_version)(const SCT *) = NULL; +ct_log_entry_type_t (*SCT_get_log_entry_type)(const SCT *) = NULL; +size_t (*SCT_get0_log_id)(const SCT *, unsigned char **) = NULL; +size_t (*SCT_get0_signature)(const SCT *, unsigned char **) = NULL; +uint64_t (*SCT_get_timestamp)(const SCT *) = NULL; + +int (*SCT_set_source)(SCT *, sct_source_t) = NULL; + +int (*sk_SCT_num)(const Cryptography_STACK_OF_SCT *) = NULL; +SCT *(*sk_SCT_value)(const Cryptography_STACK_OF_SCT *, int) = NULL; + +void (*SCT_LIST_free)(Cryptography_STACK_OF_SCT *) = NULL; +int (*sk_SCT_push)(Cryptography_STACK_OF_SCT *, SCT *) = NULL; +Cryptography_STACK_OF_SCT *(*sk_SCT_new_null)(void) = NULL; +SCT *(*SCT_new)(void) = NULL; +int (*SCT_set1_log_id)(SCT *, unsigned char *, size_t) = NULL; +void (*SCT_set_timestamp)(SCT *, uint64_t) = NULL; +int (*SCT_set_version)(SCT *, sct_version_t) = NULL; +int (*SCT_set_log_entry_type)(SCT *, ct_log_entry_type_t) = NULL; +#endif +""" diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/dh.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/dh.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/dh.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/dh.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,238 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +INCLUDES = """ +#include +""" + +TYPES = """ +typedef ... DH; + +const long DH_NOT_SUITABLE_GENERATOR; +""" + +FUNCTIONS = """ +DH *DH_new(void); +void DH_free(DH *); +int DH_size(const DH *); +int DH_generate_key(DH *); +int DH_compute_key(unsigned char *, const BIGNUM *, DH *); +DH *DHparams_dup(DH *); + +/* added in 1.1.0 when the DH struct was opaqued */ +void DH_get0_pqg(const DH *, const BIGNUM **, const BIGNUM **, + const BIGNUM **); +int DH_set0_pqg(DH *, BIGNUM *, BIGNUM *, BIGNUM *); +void DH_get0_key(const DH *, const BIGNUM **, const BIGNUM **); +int DH_set0_key(DH *, BIGNUM *, BIGNUM *); + +int Cryptography_DH_check(const DH *, int *); +int DH_generate_parameters_ex(DH *, int, int, BN_GENCB *); +DH *d2i_DHparams_bio(BIO *, DH **); +int i2d_DHparams_bio(BIO *, DH *); +DH *Cryptography_d2i_DHxparams_bio(BIO *bp, DH **x); +int Cryptography_i2d_DHxparams_bio(BIO *bp, DH *x); +""" + +CUSTOMIZATIONS = """ +/* These functions were added in OpenSSL 1.1.0 */ +#if CRYPTOGRAPHY_OPENSSL_LESS_THAN_110 && !CRYPTOGRAPHY_LIBRESSL_27_OR_GREATER +void DH_get0_pqg(const DH *dh, + const BIGNUM **p, const BIGNUM **q, const BIGNUM **g) +{ + if (p != NULL) + *p = dh->p; + if (q != NULL) + *q = dh->q; + if (g != NULL) + *g = dh->g; +} + +int DH_set0_pqg(DH *dh, BIGNUM *p, BIGNUM *q, BIGNUM *g) +{ + /* If the fields p and g in d are NULL, the corresponding input + * parameters MUST be non-NULL. q may remain NULL. + */ + if ((dh->p == NULL && p == NULL) + || (dh->g == NULL && g == NULL)) + return 0; + + if (p != NULL) { + BN_free(dh->p); + dh->p = p; + } + if (q != NULL) { + BN_free(dh->q); + dh->q = q; + } + if (g != NULL) { + BN_free(dh->g); + dh->g = g; + } + + if (q != NULL) { + dh->length = BN_num_bits(q); + } + + return 1; +} + +void DH_get0_key(const DH *dh, const BIGNUM **pub_key, const BIGNUM **priv_key) +{ + if (pub_key != NULL) + *pub_key = dh->pub_key; + if (priv_key != NULL) + *priv_key = dh->priv_key; +} + +int DH_set0_key(DH *dh, BIGNUM *pub_key, BIGNUM *priv_key) +{ + /* If the field pub_key in dh is NULL, the corresponding input + * parameters MUST be non-NULL. The priv_key field may + * be left NULL. + */ + if (dh->pub_key == NULL && pub_key == NULL) + return 0; + + if (pub_key != NULL) { + BN_free(dh->pub_key); + dh->pub_key = pub_key; + } + if (priv_key != NULL) { + BN_free(dh->priv_key); + dh->priv_key = priv_key; + } + + return 1; +} +#endif + +#if CRYPTOGRAPHY_OPENSSL_LESS_THAN_110 +#ifndef DH_CHECK_Q_NOT_PRIME +#define DH_CHECK_Q_NOT_PRIME 0x10 +#endif + +#ifndef DH_CHECK_INVALID_Q_VALUE +#define DH_CHECK_INVALID_Q_VALUE 0x20 +#endif + +#ifndef DH_CHECK_INVALID_J_VALUE +#define DH_CHECK_INVALID_J_VALUE 0x40 +#endif + +/* DH_check implementation taken from OpenSSL 1.1.0pre6 */ + +/*- + * Check that p is a safe prime and + * if g is 2, 3 or 5, check that it is a suitable generator + * where + * for 2, p mod 24 == 11 + * for 3, p mod 12 == 5 + * for 5, p mod 10 == 3 or 7 + * should hold. + */ + +int Cryptography_DH_check(const DH *dh, int *ret) +{ + int ok = 0, r; + BN_CTX *ctx = NULL; + BN_ULONG l; + BIGNUM *t1 = NULL, *t2 = NULL; + + *ret = 0; + ctx = BN_CTX_new(); + if (ctx == NULL) + goto err; + BN_CTX_start(ctx); + t1 = BN_CTX_get(ctx); + if (t1 == NULL) + goto err; + t2 = BN_CTX_get(ctx); + if (t2 == NULL) + goto err; + + if (dh->q) { + if (BN_cmp(dh->g, BN_value_one()) <= 0) + *ret |= DH_NOT_SUITABLE_GENERATOR; + else if (BN_cmp(dh->g, dh->p) >= 0) + *ret |= DH_NOT_SUITABLE_GENERATOR; + else { + /* Check g^q == 1 mod p */ + if (!BN_mod_exp(t1, dh->g, dh->q, dh->p, ctx)) + goto err; + if (!BN_is_one(t1)) + *ret |= DH_NOT_SUITABLE_GENERATOR; + } + r = BN_is_prime_ex(dh->q, BN_prime_checks, ctx, NULL); + if (r < 0) + goto err; + if (!r) + *ret |= DH_CHECK_Q_NOT_PRIME; + /* Check p == 1 mod q i.e. q divides p - 1 */ + if (!BN_div(t1, t2, dh->p, dh->q, ctx)) + goto err; + if (!BN_is_one(t2)) + *ret |= DH_CHECK_INVALID_Q_VALUE; + if (dh->j && BN_cmp(dh->j, t1)) + *ret |= DH_CHECK_INVALID_J_VALUE; + + } else if (BN_is_word(dh->g, DH_GENERATOR_2)) { + l = BN_mod_word(dh->p, 24); + if (l == (BN_ULONG)-1) + goto err; + if (l != 11) + *ret |= DH_NOT_SUITABLE_GENERATOR; + } else if (BN_is_word(dh->g, DH_GENERATOR_5)) { + l = BN_mod_word(dh->p, 10); + if (l == (BN_ULONG)-1) + goto err; + if ((l != 3) && (l != 7)) + *ret |= DH_NOT_SUITABLE_GENERATOR; + } else + *ret |= DH_UNABLE_TO_CHECK_GENERATOR; + + r = BN_is_prime_ex(dh->p, BN_prime_checks, ctx, NULL); + if (r < 0) + goto err; + if (!r) + *ret |= DH_CHECK_P_NOT_PRIME; + else if (!dh->q) { + if (!BN_rshift1(t1, dh->p)) + goto err; + r = BN_is_prime_ex(t1, BN_prime_checks, ctx, NULL); + if (r < 0) + goto err; + if (!r) + *ret |= DH_CHECK_P_NOT_SAFE_PRIME; + } + ok = 1; + err: + if (ctx != NULL) { + BN_CTX_end(ctx); + BN_CTX_free(ctx); + } + return (ok); +} +#else +int Cryptography_DH_check(const DH *dh, int *ret) { + return DH_check(dh, ret); +} +#endif + +/* These functions were added in OpenSSL 1.1.0f commit d0c50e80a8 */ +/* Define our own to simplify support across all versions. */ +#if defined(EVP_PKEY_DHX) && EVP_PKEY_DHX != -1 +DH *Cryptography_d2i_DHxparams_bio(BIO *bp, DH **x) { + return ASN1_d2i_bio_of(DH, DH_new, d2i_DHxparams, bp, x); +} +int Cryptography_i2d_DHxparams_bio(BIO *bp, DH *x) { + return ASN1_i2d_bio_of_const(DH, i2d_DHxparams, bp, x); +} +#else +DH *(*Cryptography_d2i_DHxparams_bio)(BIO *bp, DH **x) = NULL; +int (*Cryptography_i2d_DHxparams_bio)(BIO *bp, DH *x) = NULL; +#endif +""" diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/dsa.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/dsa.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/dsa.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/dsa.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,103 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +INCLUDES = """ +#include +""" + +TYPES = """ +typedef ... DSA; +""" + +FUNCTIONS = """ +int DSA_generate_key(DSA *); +DSA *DSA_new(void); +void DSA_free(DSA *); +DSA *DSAparams_dup(DSA *); +int DSA_size(const DSA *); +int DSA_sign(int, const unsigned char *, int, unsigned char *, unsigned int *, + DSA *); +int DSA_verify(int, const unsigned char *, int, const unsigned char *, int, + DSA *); + +/* added in 1.1.0 to access the opaque struct */ +void DSA_get0_pqg(const DSA *, const BIGNUM **, const BIGNUM **, + const BIGNUM **); +int DSA_set0_pqg(DSA *, BIGNUM *, BIGNUM *, BIGNUM *); +void DSA_get0_key(const DSA *, const BIGNUM **, const BIGNUM **); +int DSA_set0_key(DSA *, BIGNUM *, BIGNUM *); +int DSA_generate_parameters_ex(DSA *, int, unsigned char *, int, + int *, unsigned long *, BN_GENCB *); +""" + +CUSTOMIZATIONS = """ +/* These functions were added in OpenSSL 1.1.0 */ +#if CRYPTOGRAPHY_OPENSSL_LESS_THAN_110 && !CRYPTOGRAPHY_LIBRESSL_27_OR_GREATER +void DSA_get0_pqg(const DSA *d, + const BIGNUM **p, const BIGNUM **q, const BIGNUM **g) +{ + if (p != NULL) + *p = d->p; + if (q != NULL) + *q = d->q; + if (g != NULL) + *g = d->g; +} +int DSA_set0_pqg(DSA *d, BIGNUM *p, BIGNUM *q, BIGNUM *g) +{ + /* If the fields p, q and g in d are NULL, the corresponding input + * parameters MUST be non-NULL. + */ + if ((d->p == NULL && p == NULL) + || (d->q == NULL && q == NULL) + || (d->g == NULL && g == NULL)) + return 0; + + if (p != NULL) { + BN_free(d->p); + d->p = p; + } + if (q != NULL) { + BN_free(d->q); + d->q = q; + } + if (g != NULL) { + BN_free(d->g); + d->g = g; + } + + return 1; +} +void DSA_get0_key(const DSA *d, + const BIGNUM **pub_key, const BIGNUM **priv_key) +{ + if (pub_key != NULL) + *pub_key = d->pub_key; + if (priv_key != NULL) + *priv_key = d->priv_key; +} +int DSA_set0_key(DSA *d, BIGNUM *pub_key, BIGNUM *priv_key) +{ + /* If the field pub_key in d is NULL, the corresponding input + * parameters MUST be non-NULL. The priv_key field may + * be left NULL. + */ + if (d->pub_key == NULL && pub_key == NULL) + return 0; + + if (pub_key != NULL) { + BN_free(d->pub_key); + d->pub_key = pub_key; + } + if (priv_key != NULL) { + BN_free(d->priv_key); + d->priv_key = priv_key; + } + + return 1; +} +#endif +""" diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/ecdh.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/ecdh.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/ecdh.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/ecdh.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,28 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +INCLUDES = """ +#include +""" + +TYPES = """ +static const int Cryptography_HAS_SET_ECDH_AUTO; +""" + +FUNCTIONS = """ +int ECDH_compute_key(void *, size_t, const EC_POINT *, EC_KEY *, + void *(*)(const void *, size_t, void *, size_t *)); +long SSL_CTX_set_ecdh_auto(SSL_CTX *, int); +""" + +CUSTOMIZATIONS = """ +#ifndef SSL_CTX_set_ecdh_auto +static const long Cryptography_HAS_SET_ECDH_AUTO = 0; +long (*SSL_CTX_set_ecdh_auto)(SSL_CTX *, int) = NULL; +#else +static const long Cryptography_HAS_SET_ECDH_AUTO = 1; +#endif +""" diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/ecdsa.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/ecdsa.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/ecdsa.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/ecdsa.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,38 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +INCLUDES = """ +#include +""" + +TYPES = """ +static const int Cryptography_HAS_ECDSA; + +typedef ... ECDSA_SIG; + +typedef ... CRYPTO_EX_new; +typedef ... CRYPTO_EX_dup; +typedef ... CRYPTO_EX_free; +""" + +FUNCTIONS = """ +ECDSA_SIG *ECDSA_SIG_new(); +void ECDSA_SIG_free(ECDSA_SIG *); +int i2d_ECDSA_SIG(const ECDSA_SIG *, unsigned char **); +ECDSA_SIG *d2i_ECDSA_SIG(ECDSA_SIG **s, const unsigned char **, long); +ECDSA_SIG *ECDSA_do_sign(const unsigned char *, int, EC_KEY *); +int ECDSA_do_verify(const unsigned char *, int, const ECDSA_SIG *, EC_KEY *); +int ECDSA_sign(int, const unsigned char *, int, unsigned char *, + unsigned int *, EC_KEY *); +int ECDSA_verify(int, const unsigned char *, int, const unsigned char *, int, + EC_KEY *); +int ECDSA_size(const EC_KEY *); + +""" + +CUSTOMIZATIONS = """ +static const long Cryptography_HAS_ECDSA = 1; +""" diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/ec.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/ec.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/ec.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/ec.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,132 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +INCLUDES = """ +#include +#include +""" + +TYPES = """ +static const int Cryptography_HAS_EC2M; +static const int Cryptography_HAS_EC_1_0_2; + +static const int OPENSSL_EC_NAMED_CURVE; + +typedef ... EC_KEY; +typedef ... EC_GROUP; +typedef ... EC_POINT; +typedef ... EC_METHOD; +typedef struct { + int nid; + const char *comment; +} EC_builtin_curve; +typedef enum { + POINT_CONVERSION_COMPRESSED, + POINT_CONVERSION_UNCOMPRESSED, + ... +} point_conversion_form_t; +""" + +FUNCTIONS = """ +void EC_GROUP_free(EC_GROUP *); + +EC_GROUP *EC_GROUP_new_by_curve_name(int); + +int EC_GROUP_get_degree(const EC_GROUP *); + +const EC_METHOD *EC_GROUP_method_of(const EC_GROUP *); +const EC_POINT *EC_GROUP_get0_generator(const EC_GROUP *); +int EC_GROUP_get_curve_name(const EC_GROUP *); + +size_t EC_get_builtin_curves(EC_builtin_curve *, size_t); + +EC_KEY *EC_KEY_new(void); +void EC_KEY_free(EC_KEY *); + +EC_KEY *EC_KEY_new_by_curve_name(int); +const EC_GROUP *EC_KEY_get0_group(const EC_KEY *); +int EC_GROUP_get_order(const EC_GROUP *, BIGNUM *, BN_CTX *); +int EC_KEY_set_group(EC_KEY *, const EC_GROUP *); +const BIGNUM *EC_KEY_get0_private_key(const EC_KEY *); +int EC_KEY_set_private_key(EC_KEY *, const BIGNUM *); +const EC_POINT *EC_KEY_get0_public_key(const EC_KEY *); +int EC_KEY_set_public_key(EC_KEY *, const EC_POINT *); +void EC_KEY_set_asn1_flag(EC_KEY *, int); +int EC_KEY_generate_key(EC_KEY *); +int EC_KEY_set_public_key_affine_coordinates(EC_KEY *, BIGNUM *, BIGNUM *); + +EC_POINT *EC_POINT_new(const EC_GROUP *); +void EC_POINT_free(EC_POINT *); +void EC_POINT_clear_free(EC_POINT *); +EC_POINT *EC_POINT_dup(const EC_POINT *, const EC_GROUP *); + +int EC_POINT_set_affine_coordinates_GFp(const EC_GROUP *, EC_POINT *, + const BIGNUM *, const BIGNUM *, BN_CTX *); + +int EC_POINT_get_affine_coordinates_GFp(const EC_GROUP *, + const EC_POINT *, BIGNUM *, BIGNUM *, BN_CTX *); + +int EC_POINT_set_compressed_coordinates_GFp(const EC_GROUP *, EC_POINT *, + const BIGNUM *, int, BN_CTX *); + +int EC_POINT_set_affine_coordinates_GF2m(const EC_GROUP *, EC_POINT *, + const BIGNUM *, const BIGNUM *, BN_CTX *); + +int EC_POINT_get_affine_coordinates_GF2m(const EC_GROUP *, + const EC_POINT *, BIGNUM *, BIGNUM *, BN_CTX *); + +int EC_POINT_set_compressed_coordinates_GF2m(const EC_GROUP *, EC_POINT *, + const BIGNUM *, int, BN_CTX *); + +size_t EC_POINT_point2oct(const EC_GROUP *, const EC_POINT *, + point_conversion_form_t, + unsigned char *, size_t, BN_CTX *); + +int EC_POINT_oct2point(const EC_GROUP *, EC_POINT *, + const unsigned char *, size_t, BN_CTX *); + +int EC_POINT_add(const EC_GROUP *, EC_POINT *, const EC_POINT *, + const EC_POINT *, BN_CTX *); + +int EC_POINT_dbl(const EC_GROUP *, EC_POINT *, const EC_POINT *, BN_CTX *); +int EC_POINT_invert(const EC_GROUP *, EC_POINT *, BN_CTX *); +int EC_POINT_is_at_infinity(const EC_GROUP *, const EC_POINT *); +int EC_POINT_is_on_curve(const EC_GROUP *, const EC_POINT *, BN_CTX *); + +int EC_POINT_cmp( + const EC_GROUP *, const EC_POINT *, const EC_POINT *, BN_CTX *); + +int EC_POINT_mul(const EC_GROUP *, EC_POINT *, const BIGNUM *, + const EC_POINT *, const BIGNUM *, BN_CTX *); + +int EC_METHOD_get_field_type(const EC_METHOD *); + +const char *EC_curve_nid2nist(int); +""" + +CUSTOMIZATIONS = """ +#if defined(OPENSSL_NO_EC2M) +static const long Cryptography_HAS_EC2M = 0; + +int (*EC_POINT_set_affine_coordinates_GF2m)(const EC_GROUP *, EC_POINT *, + const BIGNUM *, const BIGNUM *, BN_CTX *) = NULL; + +int (*EC_POINT_get_affine_coordinates_GF2m)(const EC_GROUP *, + const EC_POINT *, BIGNUM *, BIGNUM *, BN_CTX *) = NULL; + +int (*EC_POINT_set_compressed_coordinates_GF2m)(const EC_GROUP *, EC_POINT *, + const BIGNUM *, int, BN_CTX *) = NULL; +#else +static const long Cryptography_HAS_EC2M = 1; +#endif + +#if (!CRYPTOGRAPHY_IS_LIBRESSL && CRYPTOGRAPHY_OPENSSL_LESS_THAN_102) +static const long Cryptography_HAS_EC_1_0_2 = 0; +const char *(*EC_curve_nid2nist)(int) = NULL; +#else +static const long Cryptography_HAS_EC_1_0_2 = 1; +#endif +""" diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/engine.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/engine.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/engine.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/engine.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,50 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +INCLUDES = """ +#include +""" + +TYPES = """ +typedef ... ENGINE; + +static const long Cryptography_HAS_ENGINE; +""" + +FUNCTIONS = """ +ENGINE *ENGINE_by_id(const char *); +int ENGINE_init(ENGINE *); +int ENGINE_finish(ENGINE *); +ENGINE *ENGINE_get_default_RAND(void); +int ENGINE_set_default_RAND(ENGINE *); +void ENGINE_unregister_RAND(ENGINE *); +int ENGINE_ctrl_cmd(ENGINE *, const char *, long, void *, void (*)(void), int); +int ENGINE_free(ENGINE *); +const char *ENGINE_get_name(const ENGINE *); + +""" + +CUSTOMIZATIONS = """ +#ifdef OPENSSL_NO_ENGINE +static const long Cryptography_HAS_ENGINE = 0; + +ENGINE *(*ENGINE_by_id)(const char *) = NULL; +int (*ENGINE_init)(ENGINE *) = NULL; +int (*ENGINE_finish)(ENGINE *) = NULL; +ENGINE *(*ENGINE_get_default_RAND)(void) = NULL; +int (*ENGINE_set_default_RAND)(ENGINE *) = NULL; +void (*ENGINE_unregister_RAND)(ENGINE *) = NULL; +int (*ENGINE_ctrl_cmd)(ENGINE *, const char *, long, void *, + void (*)(void), int) = NULL; + +int (*ENGINE_free)(ENGINE *) = NULL; +const char *(*ENGINE_get_id)(const ENGINE *) = NULL; +const char *(*ENGINE_get_name)(const ENGINE *) = NULL; + +#else +static const long Cryptography_HAS_ENGINE = 1; +#endif +""" diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/err.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/err.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/err.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/err.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,182 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +INCLUDES = """ +#include +""" + +TYPES = """ +static const int Cryptography_HAS_EC_CODES; +static const int Cryptography_HAS_RSA_R_PKCS_DECODING_ERROR; +static const int Cryptography_HAS_EVP_R_MEMORY_LIMIT_EXCEEDED; + +static const int ERR_LIB_DH; +static const int ERR_LIB_EVP; +static const int ERR_LIB_EC; +static const int ERR_LIB_PEM; +static const int ERR_LIB_ASN1; +static const int ERR_LIB_RSA; +static const int ERR_LIB_PKCS12; +static const int ERR_LIB_SSL; +static const int ERR_LIB_X509; + +static const int ERR_R_MALLOC_FAILURE; +static const int EVP_R_MEMORY_LIMIT_EXCEEDED; + +static const int ASN1_R_BOOLEAN_IS_WRONG_LENGTH; +static const int ASN1_R_BUFFER_TOO_SMALL; +static const int ASN1_R_CIPHER_HAS_NO_OBJECT_IDENTIFIER; +static const int ASN1_R_DATA_IS_WRONG; +static const int ASN1_R_DECODE_ERROR; +static const int ASN1_R_DEPTH_EXCEEDED; +static const int ASN1_R_ENCODE_ERROR; +static const int ASN1_R_ERROR_GETTING_TIME; +static const int ASN1_R_ERROR_LOADING_SECTION; +static const int ASN1_R_MSTRING_WRONG_TAG; +static const int ASN1_R_NESTED_ASN1_STRING; +static const int ASN1_R_NO_MATCHING_CHOICE_TYPE; +static const int ASN1_R_UNKNOWN_MESSAGE_DIGEST_ALGORITHM; +static const int ASN1_R_UNKNOWN_OBJECT_TYPE; +static const int ASN1_R_UNKNOWN_PUBLIC_KEY_TYPE; +static const int ASN1_R_UNKNOWN_TAG; +static const int ASN1_R_UNSUPPORTED_ANY_DEFINED_BY_TYPE; +static const int ASN1_R_UNSUPPORTED_PUBLIC_KEY_TYPE; +static const int ASN1_R_UNSUPPORTED_TYPE; +static const int ASN1_R_WRONG_TAG; +static const int ASN1_R_NO_CONTENT_TYPE; +static const int ASN1_R_NO_MULTIPART_BODY_FAILURE; +static const int ASN1_R_NO_MULTIPART_BOUNDARY; +static const int ASN1_R_HEADER_TOO_LONG; + +static const int DH_R_INVALID_PUBKEY; + +static const int EVP_F_EVP_ENCRYPTFINAL_EX; + +static const int EVP_R_AES_KEY_SETUP_FAILED; +static const int EVP_R_BAD_DECRYPT; +static const int EVP_R_CIPHER_PARAMETER_ERROR; +static const int EVP_R_CTRL_NOT_IMPLEMENTED; +static const int EVP_R_CTRL_OPERATION_NOT_IMPLEMENTED; +static const int EVP_R_DATA_NOT_MULTIPLE_OF_BLOCK_LENGTH; +static const int EVP_R_DECODE_ERROR; +static const int EVP_R_DIFFERENT_KEY_TYPES; +static const int EVP_R_INITIALIZATION_ERROR; +static const int EVP_R_INPUT_NOT_INITIALIZED; +static const int EVP_R_INVALID_KEY_LENGTH; +static const int EVP_R_KEYGEN_FAILURE; +static const int EVP_R_MISSING_PARAMETERS; +static const int EVP_R_NO_CIPHER_SET; +static const int EVP_R_NO_DIGEST_SET; +static const int EVP_R_PUBLIC_KEY_NOT_RSA; +static const int EVP_R_UNKNOWN_PBE_ALGORITHM; +static const int EVP_R_UNSUPPORTED_CIPHER; +static const int EVP_R_UNSUPPORTED_KEY_DERIVATION_FUNCTION; +static const int EVP_R_UNSUPPORTED_KEYLENGTH; +static const int EVP_R_UNSUPPORTED_SALT_TYPE; +static const int EVP_R_UNSUPPORTED_PRIVATE_KEY_ALGORITHM; +static const int EVP_R_WRONG_FINAL_BLOCK_LENGTH; +static const int EVP_R_CAMELLIA_KEY_SETUP_FAILED; + +static const int EC_R_UNKNOWN_GROUP; + +static const int PEM_R_BAD_BASE64_DECODE; +static const int PEM_R_BAD_DECRYPT; +static const int PEM_R_BAD_END_LINE; +static const int PEM_R_BAD_IV_CHARS; +static const int PEM_R_BAD_PASSWORD_READ; +static const int PEM_R_ERROR_CONVERTING_PRIVATE_KEY; +static const int PEM_R_NO_START_LINE; +static const int PEM_R_NOT_DEK_INFO; +static const int PEM_R_NOT_ENCRYPTED; +static const int PEM_R_NOT_PROC_TYPE; +static const int PEM_R_PROBLEMS_GETTING_PASSWORD; +static const int PEM_R_READ_KEY; +static const int PEM_R_SHORT_HEADER; +static const int PEM_R_UNSUPPORTED_CIPHER; +static const int PEM_R_UNSUPPORTED_ENCRYPTION; + +static const int PKCS12_R_PKCS12_CIPHERFINAL_ERROR; + +static const int RSA_R_DATA_TOO_LARGE_FOR_KEY_SIZE; +static const int RSA_R_DATA_TOO_LARGE_FOR_MODULUS; +static const int RSA_R_DIGEST_TOO_BIG_FOR_RSA_KEY; +static const int RSA_R_BLOCK_TYPE_IS_NOT_01; +static const int RSA_R_BLOCK_TYPE_IS_NOT_02; +static const int RSA_R_PKCS_DECODING_ERROR; +static const int RSA_R_OAEP_DECODING_ERROR; + +static const int SSL_TLSEXT_ERR_OK; +static const int SSL_TLSEXT_ERR_ALERT_WARNING; +static const int SSL_TLSEXT_ERR_ALERT_FATAL; +static const int SSL_TLSEXT_ERR_NOACK; + +static const int SSL_AD_CLOSE_NOTIFY; +static const int SSL_AD_UNEXPECTED_MESSAGE; +static const int SSL_AD_BAD_RECORD_MAC; +static const int SSL_AD_RECORD_OVERFLOW; +static const int SSL_AD_DECOMPRESSION_FAILURE; +static const int SSL_AD_HANDSHAKE_FAILURE; +static const int SSL_AD_BAD_CERTIFICATE; +static const int SSL_AD_UNSUPPORTED_CERTIFICATE; +static const int SSL_AD_CERTIFICATE_REVOKED; +static const int SSL_AD_CERTIFICATE_EXPIRED; +static const int SSL_AD_CERTIFICATE_UNKNOWN; +static const int SSL_AD_ILLEGAL_PARAMETER; +static const int SSL_AD_UNKNOWN_CA; +static const int SSL_AD_ACCESS_DENIED; +static const int SSL_AD_DECODE_ERROR; +static const int SSL_AD_DECRYPT_ERROR; +static const int SSL_AD_PROTOCOL_VERSION; +static const int SSL_AD_INSUFFICIENT_SECURITY; +static const int SSL_AD_INTERNAL_ERROR; +static const int SSL_AD_USER_CANCELLED; +static const int SSL_AD_NO_RENEGOTIATION; + +static const int SSL_AD_UNSUPPORTED_EXTENSION; +static const int SSL_AD_CERTIFICATE_UNOBTAINABLE; +static const int SSL_AD_UNRECOGNIZED_NAME; +static const int SSL_AD_BAD_CERTIFICATE_STATUS_RESPONSE; +static const int SSL_AD_BAD_CERTIFICATE_HASH_VALUE; +static const int SSL_AD_UNKNOWN_PSK_IDENTITY; + +static const int X509_R_CERT_ALREADY_IN_HASH_TABLE; +static const int X509_R_KEY_VALUES_MISMATCH; +""" + +FUNCTIONS = """ +void ERR_error_string_n(unsigned long, char *, size_t); +const char *ERR_lib_error_string(unsigned long); +const char *ERR_func_error_string(unsigned long); +const char *ERR_reason_error_string(unsigned long); +unsigned long ERR_get_error(void); +unsigned long ERR_peek_error(void); +unsigned long ERR_peek_last_error(void); +void ERR_clear_error(void); +void ERR_put_error(int, int, int, const char *, int); + +int ERR_GET_LIB(unsigned long); +int ERR_GET_FUNC(unsigned long); +int ERR_GET_REASON(unsigned long); + +""" + +CUSTOMIZATIONS = """ +static const long Cryptography_HAS_EC_CODES = 1; + +#ifdef RSA_R_PKCS_DECODING_ERROR +static const long Cryptography_HAS_RSA_R_PKCS_DECODING_ERROR = 1; +#else +static const long Cryptography_HAS_RSA_R_PKCS_DECODING_ERROR = 0; +static const long RSA_R_PKCS_DECODING_ERROR = 0; +#endif + +#ifdef EVP_R_MEMORY_LIMIT_EXCEEDED +static const long Cryptography_HAS_EVP_R_MEMORY_LIMIT_EXCEEDED = 1; +#else +static const long EVP_R_MEMORY_LIMIT_EXCEEDED = 0; +static const long Cryptography_HAS_EVP_R_MEMORY_LIMIT_EXCEEDED = 0; +#endif +""" diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/evp.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/evp.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/evp.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/evp.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,280 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +INCLUDES = """ +#include +""" + +TYPES = """ +typedef ... EVP_CIPHER; +typedef ... EVP_CIPHER_CTX; +typedef ... EVP_MD; +typedef ... EVP_MD_CTX; + +typedef ... EVP_PKEY; +typedef ... EVP_PKEY_CTX; +static const int EVP_PKEY_RSA; +static const int EVP_PKEY_DSA; +static const int EVP_PKEY_DH; +static const int EVP_PKEY_DHX; +static const int EVP_PKEY_EC; +static const int EVP_PKEY_X25519; +static const int EVP_PKEY_ED25519; +static const int EVP_PKEY_X448; +static const int EVP_PKEY_ED448; +static const int EVP_PKEY_POLY1305; +static const int EVP_MAX_MD_SIZE; +static const int EVP_CTRL_AEAD_SET_IVLEN; +static const int EVP_CTRL_AEAD_GET_TAG; +static const int EVP_CTRL_AEAD_SET_TAG; + +static const int Cryptography_HAS_SCRYPT; +static const int Cryptography_HAS_EVP_PKEY_DHX; +static const int Cryptography_HAS_EVP_PKEY_get_set_tls_encodedpoint; +static const int Cryptography_HAS_ONESHOT_EVP_DIGEST_SIGN_VERIFY; +static const long Cryptography_HAS_RAW_KEY; +static const long Cryptography_HAS_EVP_DIGESTFINAL_XOF; +""" + +FUNCTIONS = """ +const EVP_CIPHER *EVP_get_cipherbyname(const char *); +int EVP_CIPHER_CTX_set_padding(EVP_CIPHER_CTX *, int); +int EVP_CipherInit_ex(EVP_CIPHER_CTX *, const EVP_CIPHER *, ENGINE *, + const unsigned char *, const unsigned char *, int); +int EVP_CipherUpdate(EVP_CIPHER_CTX *, unsigned char *, int *, + const unsigned char *, int); +int EVP_CipherFinal_ex(EVP_CIPHER_CTX *, unsigned char *, int *); +int EVP_CIPHER_CTX_cleanup(EVP_CIPHER_CTX *); +EVP_CIPHER_CTX *EVP_CIPHER_CTX_new(void); +void EVP_CIPHER_CTX_free(EVP_CIPHER_CTX *); +int EVP_CIPHER_CTX_set_key_length(EVP_CIPHER_CTX *, int); +const EVP_CIPHER *EVP_CIPHER_CTX_cipher(const EVP_CIPHER_CTX *); + +int EVP_MD_CTX_copy_ex(EVP_MD_CTX *, const EVP_MD_CTX *); +int EVP_DigestInit_ex(EVP_MD_CTX *, const EVP_MD *, ENGINE *); +int EVP_DigestUpdate(EVP_MD_CTX *, const void *, size_t); +int EVP_DigestFinal_ex(EVP_MD_CTX *, unsigned char *, unsigned int *); +int EVP_DigestFinalXOF(EVP_MD_CTX *, unsigned char *, size_t); +const EVP_MD *EVP_get_digestbyname(const char *); +int EVP_MD_size(const EVP_MD *); + +EVP_PKEY *EVP_PKEY_new(void); +void EVP_PKEY_free(EVP_PKEY *); +int EVP_PKEY_type(int); +int EVP_PKEY_size(EVP_PKEY *); +RSA *EVP_PKEY_get1_RSA(EVP_PKEY *); +DSA *EVP_PKEY_get1_DSA(EVP_PKEY *); +DH *EVP_PKEY_get1_DH(EVP_PKEY *); + +int EVP_PKEY_encrypt(EVP_PKEY_CTX *, unsigned char *, size_t *, + const unsigned char *, size_t); +int EVP_PKEY_decrypt(EVP_PKEY_CTX *, unsigned char *, size_t *, + const unsigned char *, size_t); + +int EVP_SignInit(EVP_MD_CTX *, const EVP_MD *); +int EVP_SignUpdate(EVP_MD_CTX *, const void *, size_t); +int EVP_SignFinal(EVP_MD_CTX *, unsigned char *, unsigned int *, EVP_PKEY *); + +int EVP_VerifyInit(EVP_MD_CTX *, const EVP_MD *); +int EVP_VerifyUpdate(EVP_MD_CTX *, const void *, size_t); +int EVP_VerifyFinal(EVP_MD_CTX *, const unsigned char *, unsigned int, + EVP_PKEY *); + +int EVP_DigestSignInit(EVP_MD_CTX *, EVP_PKEY_CTX **, const EVP_MD *, + ENGINE *, EVP_PKEY *); +int EVP_DigestSignUpdate(EVP_MD_CTX *, const void *, size_t); +int EVP_DigestSignFinal(EVP_MD_CTX *, unsigned char *, size_t *); +int EVP_DigestVerifyInit(EVP_MD_CTX *, EVP_PKEY_CTX **, const EVP_MD *, + ENGINE *, EVP_PKEY *); + +int PKCS5_PBKDF2_HMAC_SHA1(const char *, int, const unsigned char *, int, int, + int, unsigned char *); + +EVP_PKEY_CTX *EVP_PKEY_CTX_new(EVP_PKEY *, ENGINE *); +EVP_PKEY_CTX *EVP_PKEY_CTX_new_id(int, ENGINE *); +EVP_PKEY_CTX *EVP_PKEY_CTX_dup(EVP_PKEY_CTX *); +void EVP_PKEY_CTX_free(EVP_PKEY_CTX *); +int EVP_PKEY_sign_init(EVP_PKEY_CTX *); +int EVP_PKEY_sign(EVP_PKEY_CTX *, unsigned char *, size_t *, + const unsigned char *, size_t); +int EVP_PKEY_verify_init(EVP_PKEY_CTX *); +int EVP_PKEY_verify(EVP_PKEY_CTX *, const unsigned char *, size_t, + const unsigned char *, size_t); +int EVP_PKEY_encrypt_init(EVP_PKEY_CTX *); +int EVP_PKEY_decrypt_init(EVP_PKEY_CTX *); + +int EVP_PKEY_set1_RSA(EVP_PKEY *, RSA *); +int EVP_PKEY_set1_DSA(EVP_PKEY *, DSA *); +int EVP_PKEY_set1_DH(EVP_PKEY *, DH *); + +int EVP_PKEY_cmp(const EVP_PKEY *, const EVP_PKEY *); + +int EVP_PKEY_keygen_init(EVP_PKEY_CTX *); +int EVP_PKEY_keygen(EVP_PKEY_CTX *, EVP_PKEY **); +int EVP_PKEY_derive_init(EVP_PKEY_CTX *); +int EVP_PKEY_derive_set_peer(EVP_PKEY_CTX *, EVP_PKEY *); +int EVP_PKEY_derive(EVP_PKEY_CTX *, unsigned char *, size_t *); +int EVP_PKEY_set_type(EVP_PKEY *, int); + +int EVP_PKEY_id(const EVP_PKEY *); +int Cryptography_EVP_PKEY_id(const EVP_PKEY *); + +/* in 1.1.0 _create and _destroy were renamed to _new and _free. The following + two functions wrap both the old and new functions so we can call them + without worrying about what OpenSSL we're running against. */ +EVP_MD_CTX *Cryptography_EVP_MD_CTX_new(void); +void Cryptography_EVP_MD_CTX_free(EVP_MD_CTX *); +/* Added in 1.1.1 */ +int EVP_DigestSign(EVP_MD_CTX *, unsigned char *, size_t *, + const unsigned char *, size_t); +int EVP_DigestVerify(EVP_MD_CTX *, const unsigned char *, size_t, + const unsigned char *, size_t); +/* Added in 1.1.0 */ +size_t EVP_PKEY_get1_tls_encodedpoint(EVP_PKEY *, unsigned char **); +int EVP_PKEY_set1_tls_encodedpoint(EVP_PKEY *, const unsigned char *, + size_t); + +/* EVP_PKEY * became const in 1.1.0 */ +int EVP_PKEY_bits(EVP_PKEY *); + +void OpenSSL_add_all_algorithms(void); +int EVP_PKEY_assign_RSA(EVP_PKEY *, RSA *); + +EC_KEY *EVP_PKEY_get1_EC_KEY(EVP_PKEY *); +int EVP_PKEY_set1_EC_KEY(EVP_PKEY *, EC_KEY *); + +int EVP_MD_CTX_block_size(const EVP_MD_CTX *); +int EVP_CIPHER_CTX_block_size(const EVP_CIPHER_CTX *); +int EVP_CIPHER_CTX_ctrl(EVP_CIPHER_CTX *, int, int, void *); + +int PKCS5_PBKDF2_HMAC(const char *, int, const unsigned char *, int, int, + const EVP_MD *, int, unsigned char *); + +int EVP_PKEY_CTX_set_signature_md(EVP_PKEY_CTX *, const EVP_MD *); + +int EVP_PBE_scrypt(const char *, size_t, const unsigned char *, size_t, + uint64_t, uint64_t, uint64_t, uint64_t, unsigned char *, + size_t); + +EVP_PKEY *EVP_PKEY_new_raw_private_key(int, ENGINE *, const unsigned char *, + size_t); +EVP_PKEY *EVP_PKEY_new_raw_public_key(int, ENGINE *, const unsigned char *, + size_t); +int EVP_PKEY_get_raw_private_key(const EVP_PKEY *, unsigned char *, size_t *); +int EVP_PKEY_get_raw_public_key(const EVP_PKEY *, unsigned char *, size_t *); +""" + +CUSTOMIZATIONS = """ +#ifdef EVP_PKEY_DHX +const long Cryptography_HAS_EVP_PKEY_DHX = 1; +#else +const long Cryptography_HAS_EVP_PKEY_DHX = 0; +const long EVP_PKEY_DHX = -1; +#endif + +int Cryptography_EVP_PKEY_id(const EVP_PKEY *key) { + return EVP_PKEY_id(key); +} + +EVP_MD_CTX *Cryptography_EVP_MD_CTX_new(void) { +#if CRYPTOGRAPHY_OPENSSL_LESS_THAN_110 + return EVP_MD_CTX_create(); +#else + return EVP_MD_CTX_new(); +#endif +} +void Cryptography_EVP_MD_CTX_free(EVP_MD_CTX *ctx) { +#if CRYPTOGRAPHY_OPENSSL_LESS_THAN_110 + EVP_MD_CTX_destroy(ctx); +#else + EVP_MD_CTX_free(ctx); +#endif +} +#if CRYPTOGRAPHY_OPENSSL_LESS_THAN_110 || defined(OPENSSL_NO_SCRYPT) +static const long Cryptography_HAS_SCRYPT = 0; +int (*EVP_PBE_scrypt)(const char *, size_t, const unsigned char *, size_t, + uint64_t, uint64_t, uint64_t, uint64_t, unsigned char *, + size_t) = NULL; +#else +static const long Cryptography_HAS_SCRYPT = 1; +#endif + +#if CRYPTOGRAPHY_OPENSSL_110_OR_GREATER +static const long Cryptography_HAS_EVP_PKEY_get_set_tls_encodedpoint = 1; +#else +static const long Cryptography_HAS_EVP_PKEY_get_set_tls_encodedpoint = 0; +size_t (*EVP_PKEY_get1_tls_encodedpoint)(EVP_PKEY *, unsigned char **) = NULL; +int (*EVP_PKEY_set1_tls_encodedpoint)(EVP_PKEY *, const unsigned char *, + size_t) = NULL; +#endif + +#if CRYPTOGRAPHY_OPENSSL_LESS_THAN_111 +static const long Cryptography_HAS_ONESHOT_EVP_DIGEST_SIGN_VERIFY = 0; +static const long Cryptography_HAS_RAW_KEY = 0; +static const long Cryptography_HAS_EVP_DIGESTFINAL_XOF = 0; +int (*EVP_DigestFinalXOF)(EVP_MD_CTX *, unsigned char *, size_t) = NULL; +int (*EVP_DigestSign)(EVP_MD_CTX *, unsigned char *, size_t *, + const unsigned char *tbs, size_t) = NULL; +int (*EVP_DigestVerify)(EVP_MD_CTX *, const unsigned char *, size_t, + const unsigned char *, size_t) = NULL; +EVP_PKEY *(*EVP_PKEY_new_raw_private_key)(int, ENGINE *, const unsigned char *, + size_t) = NULL; +EVP_PKEY *(*EVP_PKEY_new_raw_public_key)(int, ENGINE *, const unsigned char *, + size_t) = NULL; +int (*EVP_PKEY_get_raw_private_key)(const EVP_PKEY *, unsigned char *, + size_t *) = NULL; +int (*EVP_PKEY_get_raw_public_key)(const EVP_PKEY *, unsigned char *, + size_t *) = NULL; +#else +static const long Cryptography_HAS_ONESHOT_EVP_DIGEST_SIGN_VERIFY = 1; +static const long Cryptography_HAS_RAW_KEY = 1; +static const long Cryptography_HAS_EVP_DIGESTFINAL_XOF = 1; +#endif + +/* OpenSSL 1.1.0+ does this define for us, but if not present we'll do it */ +#if !defined(EVP_CTRL_AEAD_SET_IVLEN) +# define EVP_CTRL_AEAD_SET_IVLEN EVP_CTRL_GCM_SET_IVLEN +#endif +#if !defined(EVP_CTRL_AEAD_GET_TAG) +# define EVP_CTRL_AEAD_GET_TAG EVP_CTRL_GCM_GET_TAG +#endif +#if !defined(EVP_CTRL_AEAD_SET_TAG) +# define EVP_CTRL_AEAD_SET_TAG EVP_CTRL_GCM_SET_TAG +#endif + +/* This is tied to X25519 support so we reuse the Cryptography_HAS_X25519 + conditional to remove it. OpenSSL 1.1.0 didn't have this define, but + 1.1.1 will when it is released. We can remove this in the distant + future when we drop 1.1.0 support. */ +#ifndef EVP_PKEY_X25519 +#define EVP_PKEY_X25519 NID_X25519 +#endif + +/* This is tied to X448 support so we reuse the Cryptography_HAS_X448 + conditional to remove it. OpenSSL 1.1.1 adds this define. We can remove + this in the distant future when we drop 1.1.0 support. */ +#ifndef EVP_PKEY_X448 +#define EVP_PKEY_X448 NID_X448 +#endif + +/* This is tied to ED25519 support so we reuse the Cryptography_HAS_ED25519 + conditional to remove it. */ +#ifndef EVP_PKEY_ED25519 +#define EVP_PKEY_ED25519 NID_ED25519 +#endif + +/* This is tied to ED448 support so we reuse the Cryptography_HAS_ED448 + conditional to remove it. */ +#ifndef EVP_PKEY_ED448 +#define EVP_PKEY_ED448 NID_ED448 +#endif + +/* This is tied to poly1305 support so we reuse the Cryptography_HAS_POLY1305 + conditional to remove it. */ +#ifndef EVP_PKEY_POLY1305 +#define EVP_PKEY_POLY1305 NID_poly1305 +#endif +""" diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/fips.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/fips.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/fips.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/fips.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,28 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +INCLUDES = """ +#include +""" + +TYPES = """ +static const long Cryptography_HAS_FIPS; +""" + +FUNCTIONS = """ +int FIPS_mode_set(int); +int FIPS_mode(void); +""" + +CUSTOMIZATIONS = """ +#if CRYPTOGRAPHY_IS_LIBRESSL +static const long Cryptography_HAS_FIPS = 0; +int (*FIPS_mode_set)(int) = NULL; +int (*FIPS_mode)(void) = NULL; +#else +static const long Cryptography_HAS_FIPS = 1; +#endif +""" diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/hmac.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/hmac.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/hmac.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/hmac.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,48 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +INCLUDES = """ +#include +""" + +TYPES = """ +typedef ... HMAC_CTX; +""" + +FUNCTIONS = """ +int HMAC_Init_ex(HMAC_CTX *, const void *, int, const EVP_MD *, ENGINE *); +int HMAC_Update(HMAC_CTX *, const unsigned char *, size_t); +int HMAC_Final(HMAC_CTX *, unsigned char *, unsigned int *); +int HMAC_CTX_copy(HMAC_CTX *, HMAC_CTX *); + +HMAC_CTX *Cryptography_HMAC_CTX_new(void); +void Cryptography_HMAC_CTX_free(HMAC_CTX *ctx); +""" + +CUSTOMIZATIONS = """ +HMAC_CTX *Cryptography_HMAC_CTX_new(void) { +#if CRYPTOGRAPHY_OPENSSL_110_OR_GREATER + return HMAC_CTX_new(); +#else + /* This uses OPENSSL_zalloc in 1.1.0, which is malloc + memset */ + HMAC_CTX *ctx = (HMAC_CTX *)OPENSSL_malloc(sizeof(HMAC_CTX)); + memset(ctx, 0, sizeof(HMAC_CTX)); + return ctx; +#endif +} + + +void Cryptography_HMAC_CTX_free(HMAC_CTX *ctx) { +#if CRYPTOGRAPHY_OPENSSL_110_OR_GREATER + return HMAC_CTX_free(ctx); +#else + if (ctx != NULL) { + HMAC_CTX_cleanup(ctx); + OPENSSL_free(ctx); + } +#endif +} +""" diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/__init__.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/__init__.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/__init__.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/__init__.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,5 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/nid.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/nid.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/nid.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/nid.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,69 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +INCLUDES = """ +#include +""" + +TYPES = """ +static const int Cryptography_HAS_X25519; +static const int Cryptography_HAS_X448; +static const int Cryptography_HAS_ED448; +static const int Cryptography_HAS_ED25519; +static const int Cryptography_HAS_POLY1305; + +static const int NID_undef; +static const int NID_pbe_WithSHA1And3_Key_TripleDES_CBC; +static const int NID_X25519; +static const int NID_X448; +static const int NID_ED25519; +static const int NID_ED448; +static const int NID_poly1305; + +static const int NID_X9_62_prime256v1; +static const int NID_info_access; +static const int NID_subject_alt_name; +static const int NID_crl_distribution_points; +static const int NID_crl_reason; +static const int NID_ad_OCSP; +static const int NID_ad_ca_issuers; +""" + +FUNCTIONS = """ +""" + +CUSTOMIZATIONS = """ +#ifndef NID_X25519 +static const long Cryptography_HAS_X25519 = 0; +static const int NID_X25519 = 0; +#else +static const long Cryptography_HAS_X25519 = 1; +#endif +#ifndef NID_ED25519 +static const long Cryptography_HAS_ED25519 = 0; +static const int NID_ED25519 = 0; +#else +static const long Cryptography_HAS_ED25519 = 1; +#endif +#ifndef NID_X448 +static const long Cryptography_HAS_X448 = 0; +static const int NID_X448 = 0; +#else +static const long Cryptography_HAS_X448 = 1; +#endif +#ifndef NID_ED448 +static const long Cryptography_HAS_ED448 = 0; +static const int NID_ED448 = 0; +#else +static const long Cryptography_HAS_ED448 = 1; +#endif +#ifndef NID_poly1305 +static const long Cryptography_HAS_POLY1305 = 0; +static const int NID_poly1305 = 0; +#else +static const long Cryptography_HAS_POLY1305 = 1; +#endif +""" diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/objects.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/objects.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/objects.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/objects.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,41 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +INCLUDES = """ +#include +""" + +TYPES = """ +typedef struct { + int type; + int alias; + const char *name; + const char *data; +} OBJ_NAME; + +static const long OBJ_NAME_TYPE_MD_METH; +""" + +FUNCTIONS = """ +ASN1_OBJECT *OBJ_nid2obj(int); +const char *OBJ_nid2ln(int); +const char *OBJ_nid2sn(int); +int OBJ_obj2nid(const ASN1_OBJECT *); +int OBJ_ln2nid(const char *); +int OBJ_sn2nid(const char *); +int OBJ_txt2nid(const char *); +ASN1_OBJECT *OBJ_txt2obj(const char *, int); +int OBJ_obj2txt(char *, int, const ASN1_OBJECT *, int); +int OBJ_cmp(const ASN1_OBJECT *, const ASN1_OBJECT *); +ASN1_OBJECT *OBJ_dup(const ASN1_OBJECT *); +int OBJ_create(const char *, const char *, const char *); +void OBJ_NAME_do_all(int, void (*) (const OBJ_NAME *, void *), void *); +/* OBJ_cleanup became a macro in 1.1.0 */ +void OBJ_cleanup(void); +""" + +CUSTOMIZATIONS = """ +""" diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/ocsp.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/ocsp.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/ocsp.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/ocsp.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,170 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +INCLUDES = """ +#include +""" + +TYPES = """ +typedef ... OCSP_REQUEST; +typedef ... OCSP_ONEREQ; +typedef ... OCSP_RESPONSE; +typedef ... OCSP_BASICRESP; +typedef ... OCSP_SINGLERESP; +typedef ... OCSP_CERTID; +typedef ... OCSP_RESPDATA; +static const long OCSP_NOCERTS; +static const long OCSP_RESPID_KEY; +""" + +FUNCTIONS = """ +int OCSP_response_status(OCSP_RESPONSE *); +OCSP_BASICRESP *OCSP_response_get1_basic(OCSP_RESPONSE *); +int OCSP_BASICRESP_get_ext_count(OCSP_BASICRESP *); +const ASN1_OCTET_STRING *OCSP_resp_get0_signature(const OCSP_BASICRESP *); +Cryptography_STACK_OF_X509 *OCSP_resp_get0_certs(const OCSP_BASICRESP *); +const ASN1_GENERALIZEDTIME *OCSP_resp_get0_produced_at( + const OCSP_BASICRESP *); +const OCSP_CERTID *OCSP_SINGLERESP_get0_id(const OCSP_SINGLERESP *); +int OCSP_resp_get0_id(const OCSP_BASICRESP *, const ASN1_OCTET_STRING **, + const X509_NAME **); +const X509_ALGOR *OCSP_resp_get0_tbs_sigalg(const OCSP_BASICRESP *); +const OCSP_RESPDATA *OCSP_resp_get0_respdata(const OCSP_BASICRESP *); +X509_EXTENSION *OCSP_BASICRESP_get_ext(OCSP_BASICRESP *, int); +int OCSP_resp_count(OCSP_BASICRESP *); +OCSP_SINGLERESP *OCSP_resp_get0(OCSP_BASICRESP *, int); +int OCSP_SINGLERESP_get_ext_count(OCSP_SINGLERESP *); +X509_EXTENSION *OCSP_SINGLERESP_get_ext(OCSP_SINGLERESP *, int); + +int OCSP_single_get0_status(OCSP_SINGLERESP *, int *, ASN1_GENERALIZEDTIME **, + ASN1_GENERALIZEDTIME **, ASN1_GENERALIZEDTIME **); + +int OCSP_REQUEST_get_ext_count(OCSP_REQUEST *); +X509_EXTENSION *OCSP_REQUEST_get_ext(OCSP_REQUEST *, int); +int OCSP_request_onereq_count(OCSP_REQUEST *); +OCSP_ONEREQ *OCSP_request_onereq_get0(OCSP_REQUEST *, int); +int OCSP_ONEREQ_get_ext_count(OCSP_ONEREQ *); +X509_EXTENSION *OCSP_ONEREQ_get_ext(OCSP_ONEREQ *, int); +OCSP_CERTID *OCSP_onereq_get0_id(OCSP_ONEREQ *); +OCSP_ONEREQ *OCSP_request_add0_id(OCSP_REQUEST *, OCSP_CERTID *); +OCSP_CERTID *OCSP_cert_to_id(const EVP_MD *, const X509 *, const X509 *); +void OCSP_CERTID_free(OCSP_CERTID *); + + +OCSP_BASICRESP *OCSP_BASICRESP_new(void); +void OCSP_BASICRESP_free(OCSP_BASICRESP *); +OCSP_SINGLERESP *OCSP_basic_add1_status(OCSP_BASICRESP *, OCSP_CERTID *, int, + int, ASN1_TIME *, ASN1_TIME *, + ASN1_TIME *); +int OCSP_basic_add1_nonce(OCSP_BASICRESP *, unsigned char *, int); +int OCSP_basic_add1_cert(OCSP_BASICRESP *, X509 *); +int OCSP_BASICRESP_add_ext(OCSP_BASICRESP *, X509_EXTENSION *, int); +int OCSP_basic_sign(OCSP_BASICRESP *, X509 *, EVP_PKEY *, const EVP_MD *, + Cryptography_STACK_OF_X509 *, unsigned long); +OCSP_RESPONSE *OCSP_response_create(int, OCSP_BASICRESP *); +void OCSP_RESPONSE_free(OCSP_RESPONSE *); + +OCSP_REQUEST *OCSP_REQUEST_new(void); +void OCSP_REQUEST_free(OCSP_REQUEST *); +int OCSP_request_add1_nonce(OCSP_REQUEST *, unsigned char *, int); +int OCSP_REQUEST_add_ext(OCSP_REQUEST *, X509_EXTENSION *, int); +int OCSP_id_get0_info(ASN1_OCTET_STRING **, ASN1_OBJECT **, + ASN1_OCTET_STRING **, ASN1_INTEGER **, OCSP_CERTID *); +OCSP_REQUEST *d2i_OCSP_REQUEST_bio(BIO *, OCSP_REQUEST **); +OCSP_RESPONSE *d2i_OCSP_RESPONSE_bio(BIO *, OCSP_RESPONSE **); +int i2d_OCSP_REQUEST_bio(BIO *, OCSP_REQUEST *); +int i2d_OCSP_RESPONSE_bio(BIO *, OCSP_RESPONSE *); +int i2d_OCSP_RESPDATA(OCSP_RESPDATA *, unsigned char **); +""" + +CUSTOMIZATIONS = """ +#if ( \ + CRYPTOGRAPHY_OPENSSL_110_OR_GREATER && \ + CRYPTOGRAPHY_OPENSSL_LESS_THAN_110J \ + ) +/* These structs come from ocsp_lcl.h and are needed to de-opaque the struct + for the getters in OpenSSL 1.1.0 through 1.1.0i */ +struct ocsp_responder_id_st { + int type; + union { + X509_NAME *byName; + ASN1_OCTET_STRING *byKey; + } value; +}; +struct ocsp_response_data_st { + ASN1_INTEGER *version; + OCSP_RESPID responderId; + ASN1_GENERALIZEDTIME *producedAt; + STACK_OF(OCSP_SINGLERESP) *responses; + STACK_OF(X509_EXTENSION) *responseExtensions; +}; +struct ocsp_basic_response_st { + OCSP_RESPDATA tbsResponseData; + X509_ALGOR signatureAlgorithm; + ASN1_BIT_STRING *signature; + STACK_OF(X509) *certs; +}; +#endif + +#if CRYPTOGRAPHY_OPENSSL_LESS_THAN_110 +/* These functions are all taken from ocsp_cl.c in OpenSSL 1.1.0 */ +const OCSP_CERTID *OCSP_SINGLERESP_get0_id(const OCSP_SINGLERESP *single) +{ + return single->certId; +} +const Cryptography_STACK_OF_X509 *OCSP_resp_get0_certs( + const OCSP_BASICRESP *bs) +{ + return bs->certs; +} +int OCSP_resp_get0_id(const OCSP_BASICRESP *bs, + const ASN1_OCTET_STRING **pid, + const X509_NAME **pname) +{ + const OCSP_RESPID *rid = bs->tbsResponseData->responderId; + + if (rid->type == V_OCSP_RESPID_NAME) { + *pname = rid->value.byName; + *pid = NULL; + } else if (rid->type == V_OCSP_RESPID_KEY) { + *pid = rid->value.byKey; + *pname = NULL; + } else { + return 0; + } + return 1; +} +const ASN1_GENERALIZEDTIME *OCSP_resp_get0_produced_at( + const OCSP_BASICRESP* bs) +{ + return bs->tbsResponseData->producedAt; +} +const ASN1_OCTET_STRING *OCSP_resp_get0_signature(const OCSP_BASICRESP *bs) +{ + return bs->signature; +} +#endif + +#if CRYPTOGRAPHY_OPENSSL_LESS_THAN_110J +const X509_ALGOR *OCSP_resp_get0_tbs_sigalg(const OCSP_BASICRESP *bs) +{ +#if CRYPTOGRAPHY_OPENSSL_LESS_THAN_110 + return bs->signatureAlgorithm; +#else + return &bs->signatureAlgorithm; +#endif +} + +const OCSP_RESPDATA *OCSP_resp_get0_respdata(const OCSP_BASICRESP *bs) +{ +#if CRYPTOGRAPHY_OPENSSL_LESS_THAN_110 + return bs->tbsResponseData; +#else + return &bs->tbsResponseData; +#endif +} +#endif +""" diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/opensslv.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/opensslv.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/opensslv.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/opensslv.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,22 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +INCLUDES = """ +#include +""" + +TYPES = """ +/* Note that these will be resolved when cryptography is compiled and are NOT + guaranteed to be the version that it actually loads. */ +static const int OPENSSL_VERSION_NUMBER; +static const char *const OPENSSL_VERSION_TEXT; +""" + +FUNCTIONS = """ +""" + +CUSTOMIZATIONS = """ +""" diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/osrandom_engine.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/osrandom_engine.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/osrandom_engine.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/osrandom_engine.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,24 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +import os + +HERE = os.path.dirname(os.path.abspath(__file__)) + +with open(os.path.join(HERE, "src/osrandom_engine.h")) as f: + INCLUDES = f.read() + +TYPES = """ +static const char *const Cryptography_osrandom_engine_name; +static const char *const Cryptography_osrandom_engine_id; +""" + +FUNCTIONS = """ +int Cryptography_add_osrandom_engine(void); +""" + +with open(os.path.join(HERE, "src/osrandom_engine.c")) as f: + CUSTOMIZATIONS = f.read() diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/pem.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/pem.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/pem.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/pem.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,79 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +INCLUDES = """ +#include +""" + +TYPES = """ +typedef int pem_password_cb(char *buf, int size, int rwflag, void *userdata); +""" + +FUNCTIONS = """ +X509 *PEM_read_bio_X509(BIO *, X509 **, pem_password_cb *, void *); +int PEM_write_bio_X509(BIO *, X509 *); + +int PEM_write_bio_PrivateKey(BIO *, EVP_PKEY *, const EVP_CIPHER *, + unsigned char *, int, pem_password_cb *, void *); + +EVP_PKEY *PEM_read_bio_PrivateKey(BIO *, EVP_PKEY **, pem_password_cb *, + void *); + +int PEM_write_bio_PKCS8PrivateKey(BIO *, EVP_PKEY *, const EVP_CIPHER *, + char *, int, pem_password_cb *, void *); +int PEM_write_bio_PKCS8PrivateKey_nid(BIO *, EVP_PKEY *, int, char *, int, + pem_password_cb *, void *); + +int i2d_PKCS8PrivateKey_bio(BIO *, EVP_PKEY *, const EVP_CIPHER *, + char *, int, pem_password_cb *, void *); +int i2d_PKCS8PrivateKey_nid_bio(BIO *, EVP_PKEY *, int, + char *, int, pem_password_cb *, void *); + +int i2d_PKCS7_bio(BIO *, PKCS7 *); +PKCS7 *d2i_PKCS7_bio(BIO *, PKCS7 **); + +EVP_PKEY *d2i_PKCS8PrivateKey_bio(BIO *, EVP_PKEY **, pem_password_cb *, + void *); + +int PEM_write_bio_X509_REQ(BIO *, X509_REQ *); + +X509_REQ *PEM_read_bio_X509_REQ(BIO *, X509_REQ **, pem_password_cb *, void *); + +X509_CRL *PEM_read_bio_X509_CRL(BIO *, X509_CRL **, pem_password_cb *, void *); + +int PEM_write_bio_X509_CRL(BIO *, X509_CRL *); + +PKCS7 *PEM_read_bio_PKCS7(BIO *, PKCS7 **, pem_password_cb *, void *); +int PEM_write_bio_PKCS7(BIO *, PKCS7 *); + +DH *PEM_read_bio_DHparams(BIO *, DH **, pem_password_cb *, void *); + +int PEM_write_bio_DSAPrivateKey(BIO *, DSA *, const EVP_CIPHER *, + unsigned char *, int, + pem_password_cb *, void *); + +int PEM_write_bio_RSAPrivateKey(BIO *, RSA *, const EVP_CIPHER *, + unsigned char *, int, + pem_password_cb *, void *); + +RSA *PEM_read_bio_RSAPublicKey(BIO *, RSA **, pem_password_cb *, void *); + +int PEM_write_bio_RSAPublicKey(BIO *, const RSA *); + +EVP_PKEY *PEM_read_bio_PUBKEY(BIO *, EVP_PKEY **, pem_password_cb *, void *); +int PEM_write_bio_PUBKEY(BIO *, EVP_PKEY *); +int PEM_write_bio_ECPrivateKey(BIO *, EC_KEY *, const EVP_CIPHER *, + unsigned char *, int, pem_password_cb *, + void *); +int PEM_write_bio_DHparams(BIO *, DH *); +int PEM_write_bio_DHxparams(BIO *, DH *); +""" + +CUSTOMIZATIONS = """ +#if !defined(EVP_PKEY_DHX) || EVP_PKEY_DHX == -1 +int (*PEM_write_bio_DHxparams)(BIO *, DH *) = NULL; +#endif +""" diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/pkcs12.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/pkcs12.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/pkcs12.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/pkcs12.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,27 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +INCLUDES = """ +#include +""" + +TYPES = """ +typedef ... PKCS12; +""" + +FUNCTIONS = """ +void PKCS12_free(PKCS12 *); + +PKCS12 *d2i_PKCS12_bio(BIO *, PKCS12 **); +int i2d_PKCS12_bio(BIO *, PKCS12 *); +int PKCS12_parse(PKCS12 *, const char *, EVP_PKEY **, X509 **, + Cryptography_STACK_OF_X509 **); +PKCS12 *PKCS12_create(char *, char *, EVP_PKEY *, X509 *, + Cryptography_STACK_OF_X509 *, int, int, int, int, int); +""" + +CUSTOMIZATIONS = """ +""" diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/pkcs7.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/pkcs7.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/pkcs7.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/pkcs7.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,83 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +INCLUDES = """ +#include +""" + +TYPES = """ +typedef struct { + Cryptography_STACK_OF_X509 *cert; + Cryptography_STACK_OF_X509_CRL *crl; + ...; +} PKCS7_SIGNED; + +typedef struct { + Cryptography_STACK_OF_X509 *cert; + Cryptography_STACK_OF_X509_CRL *crl; + ...; +} PKCS7_SIGN_ENVELOPE; + +typedef ... PKCS7_DIGEST; +typedef ... PKCS7_ENCRYPT; +typedef ... PKCS7_ENVELOPE; + +typedef struct { + ASN1_OBJECT *type; + union { + char *ptr; + ASN1_OCTET_STRING *data; + PKCS7_SIGNED *sign; + PKCS7_ENVELOPE *enveloped; + PKCS7_SIGN_ENVELOPE *signed_and_enveloped; + PKCS7_DIGEST *digest; + PKCS7_ENCRYPT *encrypted; + ASN1_TYPE *other; + } d; + ...; +} PKCS7; + +static const int PKCS7_BINARY; +static const int PKCS7_DETACHED; +static const int PKCS7_NOATTR; +static const int PKCS7_NOCERTS; +static const int PKCS7_NOCHAIN; +static const int PKCS7_NOINTERN; +static const int PKCS7_NOSIGS; +static const int PKCS7_NOSMIMECAP; +static const int PKCS7_NOVERIFY; +static const int PKCS7_STREAM; +static const int PKCS7_TEXT; +""" + +FUNCTIONS = """ +PKCS7 *SMIME_read_PKCS7(BIO *, BIO **); +int SMIME_write_PKCS7(BIO *, PKCS7 *, BIO *, int); + +void PKCS7_free(PKCS7 *); + +PKCS7 *PKCS7_sign(X509 *, EVP_PKEY *, Cryptography_STACK_OF_X509 *, + BIO *, int); +int PKCS7_verify(PKCS7 *, Cryptography_STACK_OF_X509 *, X509_STORE *, BIO *, + BIO *, int); +Cryptography_STACK_OF_X509 *PKCS7_get0_signers(PKCS7 *, + Cryptography_STACK_OF_X509 *, + int); + +PKCS7 *PKCS7_encrypt(Cryptography_STACK_OF_X509 *, BIO *, + const EVP_CIPHER *, int); +int PKCS7_decrypt(PKCS7 *, EVP_PKEY *, X509 *, BIO *, int); + +BIO *PKCS7_dataInit(PKCS7 *, BIO *); +int PKCS7_type_is_encrypted(PKCS7 *); +int PKCS7_type_is_signed(PKCS7 *); +int PKCS7_type_is_enveloped(PKCS7 *); +int PKCS7_type_is_signedAndEnveloped(PKCS7 *); +int PKCS7_type_is_data(PKCS7 *); +int PKCS7_type_is_digest(PKCS7 *); +""" + +CUSTOMIZATIONS = "" diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/pypy_win32_extra.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/pypy_win32_extra.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/pypy_win32_extra.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/pypy_win32_extra.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,86 @@ +# +# An extra bit of logic for the Win32-only functionality that is missing from the +# version from cryptography. +# + +import sys + +INCLUDES = """ +#include +""" + +TYPES = """ +typedef ... *HCERTSTORE; +typedef ... *HCRYPTPROV_LEGACY; + +typedef struct { + DWORD dwCertEncodingType; + BYTE *pbCertEncoded; + DWORD cbCertEncoded; + ...; +} CERT_CONTEXT, *PCCERT_CONTEXT; + +typedef struct { + DWORD dwCertEncodingType; + BYTE *pbCrlEncoded; + DWORD cbCrlEncoded; + ...; +} CRL_CONTEXT, *PCCRL_CONTEXT; + +typedef struct { + DWORD cUsageIdentifier; + LPSTR *rgpszUsageIdentifier; + ...; +} CERT_ENHKEY_USAGE, *PCERT_ENHKEY_USAGE; +""" + +FUNCTIONS = """ +HCERTSTORE WINAPI CertOpenStore( + LPCSTR lpszStoreProvider, + DWORD dwMsgAndCertEncodingType, + HCRYPTPROV_LEGACY hCryptProv, + DWORD dwFlags, + const char *pvPara +); +PCCERT_CONTEXT WINAPI CertEnumCertificatesInStore( + HCERTSTORE hCertStore, + PCCERT_CONTEXT pPrevCertContext +); +BOOL WINAPI CertFreeCertificateContext( + PCCERT_CONTEXT pCertContext +); +BOOL WINAPI CertFreeCRLContext( + PCCRL_CONTEXT pCrlContext +); +BOOL WINAPI CertCloseStore( + HCERTSTORE hCertStore, + DWORD dwFlags +); +BOOL WINAPI CertGetEnhancedKeyUsage( + PCCERT_CONTEXT pCertContext, + DWORD dwFlags, + PCERT_ENHKEY_USAGE pUsage, + DWORD *pcbUsage +); +PCCRL_CONTEXT WINAPI CertEnumCRLsInStore( + HCERTSTORE hCertStore, + PCCRL_CONTEXT pPrevCrlContext +); +""" + +# cryptography does not use MACROS anymore +# MACROS = """ +TYPES += """ +#define CERT_STORE_READONLY_FLAG ... +#define CERT_SYSTEM_STORE_LOCAL_MACHINE ... +#define CRYPT_E_NOT_FOUND ... +#define CERT_FIND_PROP_ONLY_ENHKEY_USAGE_FLAG ... +#define CERT_FIND_EXT_ONLY_ENHKEY_USAGE_FLAG ... +#define X509_ASN_ENCODING ... +#define PKCS_7_ASN_ENCODING ... + +static const LPCSTR CERT_STORE_PROV_SYSTEM_A; +""" + +CUSTOMIZATIONS = """ +""" diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/rand.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/rand.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/rand.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/rand.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,31 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +INCLUDES = """ +#include +""" + +TYPES = """ +static const long Cryptography_HAS_EGD; +""" + +FUNCTIONS = """ +void RAND_add(const void *, int, double); +int RAND_status(void); +int RAND_bytes(unsigned char *, int); +/* ERR_load_RAND_strings started returning an int in 1.1.0. Unfortunately we + can't declare a conditional signature like that. Since it always returns + 1 we'll just lie about the signature to preserve compatibility for + pyOpenSSL (which calls this in its rand.py as of mid-2016) */ +void ERR_load_RAND_strings(void); + +/* RAND_cleanup became a macro in 1.1.0 */ +void RAND_cleanup(void); +""" + +CUSTOMIZATIONS = """ +static const long Cryptography_HAS_EGD = 0; +""" diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/rsa.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/rsa.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/rsa.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/rsa.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,184 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +INCLUDES = """ +#include +""" + +TYPES = """ +typedef ... RSA; +typedef ... BN_GENCB; +static const int RSA_PKCS1_PADDING; +static const int RSA_NO_PADDING; +static const int RSA_PKCS1_OAEP_PADDING; +static const int RSA_PKCS1_PSS_PADDING; +static const int RSA_F4; + +static const int Cryptography_HAS_PSS_PADDING; +static const int Cryptography_HAS_RSA_OAEP_MD; +static const int Cryptography_HAS_RSA_OAEP_LABEL; +""" + +FUNCTIONS = """ +RSA *RSA_new(void); +void RSA_free(RSA *); +int RSA_size(const RSA *); +int RSA_generate_key_ex(RSA *, int, BIGNUM *, BN_GENCB *); +int RSA_check_key(const RSA *); +RSA *RSAPublicKey_dup(RSA *); +int RSA_blinding_on(RSA *, BN_CTX *); +int RSA_public_encrypt(int, const unsigned char *, unsigned char *, + RSA *, int); +int RSA_private_encrypt(int, const unsigned char *, unsigned char *, + RSA *, int); +int RSA_public_decrypt(int, const unsigned char *, unsigned char *, + RSA *, int); +int RSA_private_decrypt(int, const unsigned char *, unsigned char *, + RSA *, int); +int RSA_print(BIO *, const RSA *, int); + +/* added in 1.1.0 when the RSA struct was opaqued */ +int RSA_set0_key(RSA *, BIGNUM *, BIGNUM *, BIGNUM *); +int RSA_set0_factors(RSA *, BIGNUM *, BIGNUM *); +int RSA_set0_crt_params(RSA *, BIGNUM *, BIGNUM *, BIGNUM *); +void RSA_get0_key(const RSA *, const BIGNUM **, const BIGNUM **, + const BIGNUM **); +void RSA_get0_factors(const RSA *, const BIGNUM **, const BIGNUM **); +void RSA_get0_crt_params(const RSA *, const BIGNUM **, const BIGNUM **, + const BIGNUM **); +int EVP_PKEY_CTX_set_rsa_padding(EVP_PKEY_CTX *, int); +int EVP_PKEY_CTX_set_rsa_pss_saltlen(EVP_PKEY_CTX *, int); +int EVP_PKEY_CTX_set_rsa_mgf1_md(EVP_PKEY_CTX *, EVP_MD *); +int EVP_PKEY_CTX_set0_rsa_oaep_label(EVP_PKEY_CTX *, unsigned char *, int); + +int EVP_PKEY_CTX_set_rsa_oaep_md(EVP_PKEY_CTX *, EVP_MD *); +""" + +CUSTOMIZATIONS = """ +static const long Cryptography_HAS_PSS_PADDING = 1; + +#if defined(EVP_PKEY_CTX_set_rsa_oaep_md) +static const long Cryptography_HAS_RSA_OAEP_MD = 1; +#else +static const long Cryptography_HAS_RSA_OAEP_MD = 0; +int (*EVP_PKEY_CTX_set_rsa_oaep_md)(EVP_PKEY_CTX *, EVP_MD *) = NULL; +#endif + +#if defined(EVP_PKEY_CTX_set0_rsa_oaep_label) +static const long Cryptography_HAS_RSA_OAEP_LABEL = 1; +#else +static const long Cryptography_HAS_RSA_OAEP_LABEL = 0; +int (*EVP_PKEY_CTX_set0_rsa_oaep_label)(EVP_PKEY_CTX *, unsigned char *, + int) = NULL; +#endif + +/* These functions were added in OpenSSL 1.1.0 */ +#if CRYPTOGRAPHY_OPENSSL_LESS_THAN_110 && !CRYPTOGRAPHY_LIBRESSL_27_OR_GREATER +int RSA_set0_key(RSA *r, BIGNUM *n, BIGNUM *e, BIGNUM *d) +{ + /* If the fields n and e in r are NULL, the corresponding input + * parameters MUST be non-NULL for n and e. d may be + * left NULL (in case only the public key is used). + */ + if ((r->n == NULL && n == NULL) + || (r->e == NULL && e == NULL)) + return 0; + + if (n != NULL) { + BN_free(r->n); + r->n = n; + } + if (e != NULL) { + BN_free(r->e); + r->e = e; + } + if (d != NULL) { + BN_free(r->d); + r->d = d; + } + + return 1; +} + +int RSA_set0_factors(RSA *r, BIGNUM *p, BIGNUM *q) +{ + /* If the fields p and q in r are NULL, the corresponding input + * parameters MUST be non-NULL. + */ + if ((r->p == NULL && p == NULL) + || (r->q == NULL && q == NULL)) + return 0; + + if (p != NULL) { + BN_free(r->p); + r->p = p; + } + if (q != NULL) { + BN_free(r->q); + r->q = q; + } + + return 1; +} + +int RSA_set0_crt_params(RSA *r, BIGNUM *dmp1, BIGNUM *dmq1, BIGNUM *iqmp) +{ + /* If the fields dmp1, dmq1 and iqmp in r are NULL, the corresponding input + * parameters MUST be non-NULL. + */ + if ((r->dmp1 == NULL && dmp1 == NULL) + || (r->dmq1 == NULL && dmq1 == NULL) + || (r->iqmp == NULL && iqmp == NULL)) + return 0; + + if (dmp1 != NULL) { + BN_free(r->dmp1); + r->dmp1 = dmp1; + } + if (dmq1 != NULL) { + BN_free(r->dmq1); + r->dmq1 = dmq1; + } + if (iqmp != NULL) { + BN_free(r->iqmp); + r->iqmp = iqmp; + } + + return 1; +} + +void RSA_get0_key(const RSA *r, + const BIGNUM **n, const BIGNUM **e, const BIGNUM **d) +{ + if (n != NULL) + *n = r->n; + if (e != NULL) + *e = r->e; + if (d != NULL) + *d = r->d; +} + +void RSA_get0_factors(const RSA *r, const BIGNUM **p, const BIGNUM **q) +{ + if (p != NULL) + *p = r->p; + if (q != NULL) + *q = r->q; +} + +void RSA_get0_crt_params(const RSA *r, + const BIGNUM **dmp1, const BIGNUM **dmq1, + const BIGNUM **iqmp) +{ + if (dmp1 != NULL) + *dmp1 = r->dmp1; + if (dmq1 != NULL) + *dmq1 = r->dmq1; + if (iqmp != NULL) + *iqmp = r->iqmp; +} +#endif +""" diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/src/osrandom_engine.c pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/src/osrandom_engine.c --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/src/osrandom_engine.c 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/src/osrandom_engine.c 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,655 @@ +/* osurandom engine + * + * Windows CryptGenRandom() + * macOS >= 10.12 getentropy() + * OpenBSD 5.6+ getentropy() + * other BSD getentropy() if SYS_getentropy is defined + * Linux 3.17+ getrandom() with fallback to /dev/urandom + * other /dev/urandom with cached fd + * + * The /dev/urandom, getrandom and getentropy code is derived from Python's + * Python/random.c, written by Antoine Pitrou and Victor Stinner. + * + * Copyright 2001-2016 Python Software Foundation; All Rights Reserved. + */ + +#ifdef __linux__ +#include +#endif + +#ifndef OPENSSL_NO_ENGINE +/* OpenSSL has ENGINE support so build the engine. */ +static const char *Cryptography_osrandom_engine_id = "osrandom"; + +/**************************************************************************** + * Windows + */ +#if CRYPTOGRAPHY_OSRANDOM_ENGINE == CRYPTOGRAPHY_OSRANDOM_ENGINE_CRYPTGENRANDOM +static const char *Cryptography_osrandom_engine_name = "osrandom_engine CryptGenRandom()"; +static HCRYPTPROV hCryptProv = 0; + +static int osrandom_init(ENGINE *e) { + if (hCryptProv != 0) { + return 1; + } + if (CryptAcquireContext(&hCryptProv, NULL, NULL, + PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)) { + return 1; + } else { + ERR_Cryptography_OSRandom_error( + CRYPTOGRAPHY_OSRANDOM_F_INIT, + CRYPTOGRAPHY_OSRANDOM_R_CRYPTACQUIRECONTEXT, + __FILE__, __LINE__ + ); + return 0; + } +} + +static int osrandom_rand_bytes(unsigned char *buffer, int size) { + if (hCryptProv == 0) { + return 0; + } + + if (!CryptGenRandom(hCryptProv, (DWORD)size, buffer)) { + ERR_Cryptography_OSRandom_error( + CRYPTOGRAPHY_OSRANDOM_F_RAND_BYTES, + CRYPTOGRAPHY_OSRANDOM_R_CRYPTGENRANDOM, + __FILE__, __LINE__ + ); + return 0; + } + return 1; +} + +static int osrandom_finish(ENGINE *e) { + if (CryptReleaseContext(hCryptProv, 0)) { + hCryptProv = 0; + return 1; + } else { + ERR_Cryptography_OSRandom_error( + CRYPTOGRAPHY_OSRANDOM_F_FINISH, + CRYPTOGRAPHY_OSRANDOM_R_CRYPTRELEASECONTEXT, + __FILE__, __LINE__ + ); + return 0; + } +} + +static int osrandom_rand_status(void) { + return hCryptProv != 0; +} + +static const char *osurandom_get_implementation(void) { + return "CryptGenRandom"; +} + +#endif /* CRYPTOGRAPHY_OSRANDOM_ENGINE_CRYPTGENRANDOM */ + +/**************************************************************************** + * /dev/urandom helpers for all non-BSD Unix platforms + */ +#ifdef CRYPTOGRAPHY_OSRANDOM_NEEDS_DEV_URANDOM + +static struct { + int fd; + dev_t st_dev; + ino_t st_ino; +} urandom_cache = { -1 }; + +static int open_cloexec(const char *path) { + int open_flags = O_RDONLY; +#ifdef O_CLOEXEC + open_flags |= O_CLOEXEC; +#endif + + int fd = open(path, open_flags); + if (fd == -1) { + return -1; + } + +#ifndef O_CLOEXEC + int flags = fcntl(fd, F_GETFD); + if (flags == -1) { + return -1; + } + if (fcntl(fd, F_SETFD, flags | FD_CLOEXEC) == -1) { + return -1; + } +#endif + return fd; +} + +#ifdef __linux__ +/* On Linux, we open("/dev/random") and use poll() to wait until it's readable + * before we read from /dev/urandom, this ensures that we don't read from + * /dev/urandom before the kernel CSPRNG is initialized. This isn't necessary on + * other platforms because they don't have the same _bug_ as Linux does with + * /dev/urandom and early boot. */ +static int wait_on_devrandom(void) { + struct pollfd pfd = {}; + int ret = 0; + int random_fd = open_cloexec("/dev/random"); + if (random_fd < 0) { + return -1; + } + pfd.fd = random_fd; + pfd.events = POLLIN; + pfd.revents = 0; + do { + ret = poll(&pfd, 1, -1); + } while (ret < 0 && (errno == EINTR || errno == EAGAIN)); + close(random_fd); + return ret; +} +#endif + +/* return -1 on error */ +static int dev_urandom_fd(void) { + int fd = -1; + struct stat st; + + /* Check that fd still points to the correct device */ + if (urandom_cache.fd >= 0) { + if (fstat(urandom_cache.fd, &st) + || st.st_dev != urandom_cache.st_dev + || st.st_ino != urandom_cache.st_ino) { + /* Somebody replaced our FD. Invalidate our cache but don't + * close the fd. */ + urandom_cache.fd = -1; + } + } + if (urandom_cache.fd < 0) { +#ifdef __linux__ + if (wait_on_devrandom() < 0) { + goto error; + } +#endif + + fd = open_cloexec("/dev/urandom"); + if (fd < 0) { + goto error; + } + if (fstat(fd, &st)) { + goto error; + } + /* Another thread initialized the fd */ + if (urandom_cache.fd >= 0) { + close(fd); + return urandom_cache.fd; + } + urandom_cache.st_dev = st.st_dev; + urandom_cache.st_ino = st.st_ino; + urandom_cache.fd = fd; + } + return urandom_cache.fd; + + error: + if (fd != -1) { + close(fd); + } + ERR_Cryptography_OSRandom_error( + CRYPTOGRAPHY_OSRANDOM_F_DEV_URANDOM_FD, + CRYPTOGRAPHY_OSRANDOM_R_DEV_URANDOM_OPEN_FAILED, + __FILE__, __LINE__ + ); + return -1; +} + +static int dev_urandom_read(unsigned char *buffer, int size) { + int fd; + int n; + + fd = dev_urandom_fd(); + if (fd < 0) { + return 0; + } + + while (size > 0) { + do { + n = (int)read(fd, buffer, (size_t)size); + } while (n < 0 && errno == EINTR); + + if (n <= 0) { + ERR_Cryptography_OSRandom_error( + CRYPTOGRAPHY_OSRANDOM_F_DEV_URANDOM_READ, + CRYPTOGRAPHY_OSRANDOM_R_DEV_URANDOM_READ_FAILED, + __FILE__, __LINE__ + ); + return 0; + } + buffer += n; + size -= n; + } + return 1; +} + +static void dev_urandom_close(void) { + if (urandom_cache.fd >= 0) { + int fd; + struct stat st; + + if (fstat(urandom_cache.fd, &st) + && st.st_dev == urandom_cache.st_dev + && st.st_ino == urandom_cache.st_ino) { + fd = urandom_cache.fd; + urandom_cache.fd = -1; + close(fd); + } + } +} +#endif /* CRYPTOGRAPHY_OSRANDOM_NEEDS_DEV_URANDOM */ + +/**************************************************************************** + * BSD getentropy + */ +#if CRYPTOGRAPHY_OSRANDOM_ENGINE == CRYPTOGRAPHY_OSRANDOM_ENGINE_GETENTROPY +static const char *Cryptography_osrandom_engine_name = "osrandom_engine getentropy()"; + +static int getentropy_works = CRYPTOGRAPHY_OSRANDOM_GETENTROPY_NOT_INIT; + +static int osrandom_init(ENGINE *e) { +#if !defined(__APPLE__) + getentropy_works = CRYPTOGRAPHY_OSRANDOM_GETENTROPY_WORKS; +#else + if (&getentropy != NULL) { + getentropy_works = CRYPTOGRAPHY_OSRANDOM_GETENTROPY_WORKS; + } else { + getentropy_works = CRYPTOGRAPHY_OSRANDOM_GETENTROPY_FALLBACK; + int fd = dev_urandom_fd(); + if (fd < 0) { + return 0; + } + } +#endif + return 1; +} + +static int osrandom_rand_bytes(unsigned char *buffer, int size) { + int len; + int res; + + switch(getentropy_works) { +#if defined(__APPLE__) + case CRYPTOGRAPHY_OSRANDOM_GETENTROPY_FALLBACK: + return dev_urandom_read(buffer, size); +#endif + case CRYPTOGRAPHY_OSRANDOM_GETENTROPY_WORKS: + while (size > 0) { + /* OpenBSD and macOS restrict maximum buffer size to 256. */ + len = size > 256 ? 256 : size; + res = getentropy(buffer, (size_t)len); + if (res < 0) { + ERR_Cryptography_OSRandom_error( + CRYPTOGRAPHY_OSRANDOM_F_RAND_BYTES, + CRYPTOGRAPHY_OSRANDOM_R_GETENTROPY_FAILED, + __FILE__, __LINE__ + ); + return 0; + } + buffer += len; + size -= len; + } + return 1; + } + __builtin_unreachable(); +} + +static int osrandom_finish(ENGINE *e) { + return 1; +} + +static int osrandom_rand_status(void) { + return 1; +} + +static const char *osurandom_get_implementation(void) { + switch(getentropy_works) { + case CRYPTOGRAPHY_OSRANDOM_GETENTROPY_FALLBACK: + return "/dev/urandom"; + case CRYPTOGRAPHY_OSRANDOM_GETENTROPY_WORKS: + return "getentropy"; + } + __builtin_unreachable(); +} +#endif /* CRYPTOGRAPHY_OSRANDOM_ENGINE_GETENTROPY */ + +/**************************************************************************** + * Linux getrandom engine with fallback to dev_urandom + */ + +#if CRYPTOGRAPHY_OSRANDOM_ENGINE == CRYPTOGRAPHY_OSRANDOM_ENGINE_GETRANDOM +static const char *Cryptography_osrandom_engine_name = "osrandom_engine getrandom()"; + +static int getrandom_works = CRYPTOGRAPHY_OSRANDOM_GETRANDOM_NOT_INIT; + +static int osrandom_init(ENGINE *e) { + /* We try to detect working getrandom until we succeed. */ + if (getrandom_works != CRYPTOGRAPHY_OSRANDOM_GETRANDOM_WORKS) { + long n; + char dest[1]; + /* if the kernel CSPRNG is not initialized this will block */ + n = syscall(SYS_getrandom, dest, sizeof(dest), 0); + if (n == sizeof(dest)) { + getrandom_works = CRYPTOGRAPHY_OSRANDOM_GETRANDOM_WORKS; + } else { + int e = errno; + switch(e) { + case ENOSYS: + /* Fallback: Kernel does not support the syscall. */ + getrandom_works = CRYPTOGRAPHY_OSRANDOM_GETRANDOM_FALLBACK; + break; + case EPERM: + /* Fallback: seccomp prevents syscall */ + getrandom_works = CRYPTOGRAPHY_OSRANDOM_GETRANDOM_FALLBACK; + break; + default: + /* EINTR cannot occur for buflen < 256. */ + ERR_Cryptography_OSRandom_error( + CRYPTOGRAPHY_OSRANDOM_F_INIT, + CRYPTOGRAPHY_OSRANDOM_R_GETRANDOM_INIT_FAILED_UNEXPECTED, + "errno", e + ); + getrandom_works = CRYPTOGRAPHY_OSRANDOM_GETRANDOM_INIT_FAILED; + break; + } + } + } + + /* fallback to dev urandom */ + if (getrandom_works == CRYPTOGRAPHY_OSRANDOM_GETRANDOM_FALLBACK) { + int fd = dev_urandom_fd(); + if (fd < 0) { + return 0; + } + } + return 1; +} + +static int osrandom_rand_bytes(unsigned char *buffer, int size) { + long n; + + switch(getrandom_works) { + case CRYPTOGRAPHY_OSRANDOM_GETRANDOM_INIT_FAILED: + ERR_Cryptography_OSRandom_error( + CRYPTOGRAPHY_OSRANDOM_F_RAND_BYTES, + CRYPTOGRAPHY_OSRANDOM_R_GETRANDOM_INIT_FAILED, + __FILE__, __LINE__ + ); + return 0; + case CRYPTOGRAPHY_OSRANDOM_GETRANDOM_NOT_INIT: + ERR_Cryptography_OSRandom_error( + CRYPTOGRAPHY_OSRANDOM_F_RAND_BYTES, + CRYPTOGRAPHY_OSRANDOM_R_GETRANDOM_NOT_INIT, + __FILE__, __LINE__ + ); + return 0; + case CRYPTOGRAPHY_OSRANDOM_GETRANDOM_FALLBACK: + return dev_urandom_read(buffer, size); + case CRYPTOGRAPHY_OSRANDOM_GETRANDOM_WORKS: + while (size > 0) { + do { + n = syscall(SYS_getrandom, buffer, size, 0); + } while (n < 0 && errno == EINTR); + + if (n <= 0) { + ERR_Cryptography_OSRandom_error( + CRYPTOGRAPHY_OSRANDOM_F_RAND_BYTES, + CRYPTOGRAPHY_OSRANDOM_R_GETRANDOM_FAILED, + __FILE__, __LINE__ + ); + return 0; + } + buffer += n; + size -= (int)n; + } + return 1; + } + __builtin_unreachable(); +} + +static int osrandom_finish(ENGINE *e) { + dev_urandom_close(); + return 1; +} + +static int osrandom_rand_status(void) { + switch(getrandom_works) { + case CRYPTOGRAPHY_OSRANDOM_GETRANDOM_INIT_FAILED: + return 0; + case CRYPTOGRAPHY_OSRANDOM_GETRANDOM_NOT_INIT: + return 0; + case CRYPTOGRAPHY_OSRANDOM_GETRANDOM_FALLBACK: + return urandom_cache.fd >= 0; + case CRYPTOGRAPHY_OSRANDOM_GETRANDOM_WORKS: + return 1; + } + __builtin_unreachable(); +} + +static const char *osurandom_get_implementation(void) { + switch(getrandom_works) { + case CRYPTOGRAPHY_OSRANDOM_GETRANDOM_INIT_FAILED: + return ""; + case CRYPTOGRAPHY_OSRANDOM_GETRANDOM_NOT_INIT: + return ""; + case CRYPTOGRAPHY_OSRANDOM_GETRANDOM_FALLBACK: + return "/dev/urandom"; + case CRYPTOGRAPHY_OSRANDOM_GETRANDOM_WORKS: + return "getrandom"; + } + __builtin_unreachable(); +} +#endif /* CRYPTOGRAPHY_OSRANDOM_ENGINE_GETRANDOM */ + +/**************************************************************************** + * dev_urandom engine for all remaining platforms + */ + +#if CRYPTOGRAPHY_OSRANDOM_ENGINE == CRYPTOGRAPHY_OSRANDOM_ENGINE_DEV_URANDOM +static const char *Cryptography_osrandom_engine_name = "osrandom_engine /dev/urandom"; + +static int osrandom_init(ENGINE *e) { + int fd = dev_urandom_fd(); + if (fd < 0) { + return 0; + } + return 1; +} + +static int osrandom_rand_bytes(unsigned char *buffer, int size) { + return dev_urandom_read(buffer, size); +} + +static int osrandom_finish(ENGINE *e) { + dev_urandom_close(); + return 1; +} + +static int osrandom_rand_status(void) { + return urandom_cache.fd >= 0; +} + +static const char *osurandom_get_implementation(void) { + return "/dev/urandom"; +} +#endif /* CRYPTOGRAPHY_OSRANDOM_ENGINE_DEV_URANDOM */ + +/**************************************************************************** + * ENGINE boiler plate + */ + +/* This replicates the behavior of the OpenSSL FIPS RNG, which returns a + -1 in the event that there is an error when calling RAND_pseudo_bytes. */ +static int osrandom_pseudo_rand_bytes(unsigned char *buffer, int size) { + int res = osrandom_rand_bytes(buffer, size); + if (res == 0) { + return -1; + } else { + return res; + } +} + +static RAND_METHOD osrandom_rand = { + NULL, + osrandom_rand_bytes, + NULL, + NULL, + osrandom_pseudo_rand_bytes, + osrandom_rand_status, +}; + +static const ENGINE_CMD_DEFN osrandom_cmd_defns[] = { + {CRYPTOGRAPHY_OSRANDOM_GET_IMPLEMENTATION, + "get_implementation", + "Get CPRNG implementation.", + ENGINE_CMD_FLAG_NO_INPUT}, + {0, NULL, NULL, 0} +}; + +static int osrandom_ctrl(ENGINE *e, int cmd, long i, void *p, void (*f) (void)) { + const char *name; + size_t len; + + switch (cmd) { + case CRYPTOGRAPHY_OSRANDOM_GET_IMPLEMENTATION: + /* i: buffer size, p: char* buffer */ + name = osurandom_get_implementation(); + len = strlen(name); + if ((p == NULL) && (i == 0)) { + /* return required buffer len */ + return (int)len; + } + if ((p == NULL) || i < 0 || ((size_t)i <= len)) { + /* no buffer or buffer too small */ + ENGINEerr(ENGINE_F_ENGINE_CTRL, ENGINE_R_INVALID_ARGUMENT); + return 0; + } + strncpy((char *)p, name, len); + return (int)len; + default: + ENGINEerr(ENGINE_F_ENGINE_CTRL, ENGINE_R_CTRL_COMMAND_NOT_IMPLEMENTED); + return 0; + } +} + +/* error reporting */ +#define ERR_FUNC(func) ERR_PACK(0, func, 0) +#define ERR_REASON(reason) ERR_PACK(0, 0, reason) + +static ERR_STRING_DATA CRYPTOGRAPHY_OSRANDOM_lib_name[] = { + {0, "osrandom_engine"}, + {0, NULL} +}; + +static ERR_STRING_DATA CRYPTOGRAPHY_OSRANDOM_str_funcs[] = { + {ERR_FUNC(CRYPTOGRAPHY_OSRANDOM_F_INIT), + "osrandom_init"}, + {ERR_FUNC(CRYPTOGRAPHY_OSRANDOM_F_RAND_BYTES), + "osrandom_rand_bytes"}, + {ERR_FUNC(CRYPTOGRAPHY_OSRANDOM_F_FINISH), + "osrandom_finish"}, + {ERR_FUNC(CRYPTOGRAPHY_OSRANDOM_F_DEV_URANDOM_FD), + "dev_urandom_fd"}, + {ERR_FUNC(CRYPTOGRAPHY_OSRANDOM_F_DEV_URANDOM_READ), + "dev_urandom_read"}, + {0, NULL} +}; + +static ERR_STRING_DATA CRYPTOGRAPHY_OSRANDOM_str_reasons[] = { + {ERR_REASON(CRYPTOGRAPHY_OSRANDOM_R_CRYPTACQUIRECONTEXT), + "CryptAcquireContext() failed."}, + {ERR_REASON(CRYPTOGRAPHY_OSRANDOM_R_CRYPTGENRANDOM), + "CryptGenRandom() failed."}, + {ERR_REASON(CRYPTOGRAPHY_OSRANDOM_R_CRYPTRELEASECONTEXT), + "CryptReleaseContext() failed."}, + {ERR_REASON(CRYPTOGRAPHY_OSRANDOM_R_GETENTROPY_FAILED), + "getentropy() failed"}, + {ERR_REASON(CRYPTOGRAPHY_OSRANDOM_R_DEV_URANDOM_OPEN_FAILED), + "open('/dev/urandom') failed."}, + {ERR_REASON(CRYPTOGRAPHY_OSRANDOM_R_DEV_URANDOM_READ_FAILED), + "Reading from /dev/urandom fd failed."}, + {ERR_REASON(CRYPTOGRAPHY_OSRANDOM_R_GETRANDOM_INIT_FAILED), + "getrandom() initialization failed."}, + {ERR_REASON(CRYPTOGRAPHY_OSRANDOM_R_GETRANDOM_INIT_FAILED_UNEXPECTED), + "getrandom() initialization failed with unexpected errno."}, + {ERR_REASON(CRYPTOGRAPHY_OSRANDOM_R_GETRANDOM_FAILED), + "getrandom() syscall failed."}, + {ERR_REASON(CRYPTOGRAPHY_OSRANDOM_R_GETRANDOM_NOT_INIT), + "getrandom() engine was not properly initialized."}, + {0, NULL} +}; + +static int Cryptography_OSRandom_lib_error_code = 0; + +static void ERR_load_Cryptography_OSRandom_strings(void) +{ + if (Cryptography_OSRandom_lib_error_code == 0) { + Cryptography_OSRandom_lib_error_code = ERR_get_next_error_library(); + ERR_load_strings(Cryptography_OSRandom_lib_error_code, + CRYPTOGRAPHY_OSRANDOM_lib_name); + ERR_load_strings(Cryptography_OSRandom_lib_error_code, + CRYPTOGRAPHY_OSRANDOM_str_funcs); + ERR_load_strings(Cryptography_OSRandom_lib_error_code, + CRYPTOGRAPHY_OSRANDOM_str_reasons); + } +} + +static void ERR_Cryptography_OSRandom_error(int function, int reason, + char *file, int line) +{ + ERR_PUT_error(Cryptography_OSRandom_lib_error_code, function, reason, + file, line); +} + +/* Returns 1 if successfully added, 2 if engine has previously been added, + and 0 for error. */ +int Cryptography_add_osrandom_engine(void) { + ENGINE *e; + + ERR_load_Cryptography_OSRandom_strings(); + + e = ENGINE_by_id(Cryptography_osrandom_engine_id); + if (e != NULL) { + ENGINE_free(e); + return 2; + } else { + ERR_clear_error(); + } + + e = ENGINE_new(); + if (e == NULL) { + return 0; + } + if (!ENGINE_set_id(e, Cryptography_osrandom_engine_id) || + !ENGINE_set_name(e, Cryptography_osrandom_engine_name) || + !ENGINE_set_RAND(e, &osrandom_rand) || + !ENGINE_set_init_function(e, osrandom_init) || + !ENGINE_set_finish_function(e, osrandom_finish) || + !ENGINE_set_cmd_defns(e, osrandom_cmd_defns) || + !ENGINE_set_ctrl_function(e, osrandom_ctrl)) { + ENGINE_free(e); + return 0; + } + if (!ENGINE_add(e)) { + ENGINE_free(e); + return 0; + } + if (!ENGINE_free(e)) { + return 0; + } + + return 1; +} + +#else +/* If OpenSSL has no ENGINE support then we don't want + * to compile the osrandom engine, but we do need some + * placeholders */ +static const char *Cryptography_osrandom_engine_id = "no-engine-support"; +static const char *Cryptography_osrandom_engine_name = "osrandom_engine disabled due to no engine support"; + +int Cryptography_add_osrandom_engine(void) { + return 0; +} + +#endif diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/src/osrandom_engine.h pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/src/osrandom_engine.h --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/src/osrandom_engine.h 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/src/osrandom_engine.h 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,114 @@ +#ifndef OPENSSL_NO_ENGINE +/* OpenSSL has ENGINE support so include all of this. */ +#ifdef _WIN32 + #include +#else + #include + #include + /* for defined(BSD) */ + #include + + #ifdef BSD + /* for SYS_getentropy */ + #include + #endif + + #ifdef __APPLE__ + #include + /* To support weak linking we need to declare this as a weak import even if + * it's not present in sys/random (e.g. macOS < 10.12). */ + extern int getentropy(void *buffer, size_t size) __attribute((weak_import)); + #endif + + #ifdef __linux__ + /* for SYS_getrandom */ + #include + #ifndef GRND_NONBLOCK + #define GRND_NONBLOCK 0x0001 + #endif /* GRND_NONBLOCK */ + + #ifndef SYS_getrandom + /* We only bother to define the constants for platforms where we ship + * wheels, since that's the predominant way you get a situation where + * you don't have SYS_getrandom at compile time but do have the syscall + * at runtime */ + #if defined __x86_64__ + #define SYS_getrandom 318 + #elif defined(__i386__) + #define SYS_getrandom 355 + #endif + #endif + #endif /* __linux__ */ +#endif /* _WIN32 */ + +#define CRYPTOGRAPHY_OSRANDOM_ENGINE_CRYPTGENRANDOM 1 +#define CRYPTOGRAPHY_OSRANDOM_ENGINE_GETENTROPY 2 +#define CRYPTOGRAPHY_OSRANDOM_ENGINE_GETRANDOM 3 +#define CRYPTOGRAPHY_OSRANDOM_ENGINE_DEV_URANDOM 4 + +#ifndef CRYPTOGRAPHY_OSRANDOM_ENGINE + #if defined(_WIN32) + /* Windows */ + #define CRYPTOGRAPHY_OSRANDOM_ENGINE CRYPTOGRAPHY_OSRANDOM_ENGINE_CRYPTGENRANDOM + #elif defined(BSD) && defined(SYS_getentropy) + /* OpenBSD 5.6+ & macOS with SYS_getentropy defined, although < 10.12 will fallback + * to urandom */ + #define CRYPTOGRAPHY_OSRANDOM_ENGINE CRYPTOGRAPHY_OSRANDOM_ENGINE_GETENTROPY + #elif defined(__linux__) && defined(SYS_getrandom) + /* Linux 3.17+ */ + #define CRYPTOGRAPHY_OSRANDOM_ENGINE CRYPTOGRAPHY_OSRANDOM_ENGINE_GETRANDOM + #else + /* Keep this as last entry, fall back to /dev/urandom */ + #define CRYPTOGRAPHY_OSRANDOM_ENGINE CRYPTOGRAPHY_OSRANDOM_ENGINE_DEV_URANDOM + #endif +#endif /* CRYPTOGRAPHY_OSRANDOM_ENGINE */ + +/* Fallbacks need /dev/urandom helper functions. */ +#if CRYPTOGRAPHY_OSRANDOM_ENGINE == CRYPTOGRAPHY_OSRANDOM_ENGINE_GETRANDOM || \ + CRYPTOGRAPHY_OSRANDOM_ENGINE == CRYPTOGRAPHY_OSRANDOM_ENGINE_DEV_URANDOM || \ + (CRYPTOGRAPHY_OSRANDOM_ENGINE == CRYPTOGRAPHY_OSRANDOM_ENGINE_GETENTROPY && \ + defined(__APPLE__)) + #define CRYPTOGRAPHY_OSRANDOM_NEEDS_DEV_URANDOM 1 +#endif + +enum { + CRYPTOGRAPHY_OSRANDOM_GETRANDOM_INIT_FAILED = -2, + CRYPTOGRAPHY_OSRANDOM_GETRANDOM_NOT_INIT, + CRYPTOGRAPHY_OSRANDOM_GETRANDOM_FALLBACK, + CRYPTOGRAPHY_OSRANDOM_GETRANDOM_WORKS +}; + +enum { + CRYPTOGRAPHY_OSRANDOM_GETENTROPY_NOT_INIT, + CRYPTOGRAPHY_OSRANDOM_GETENTROPY_FALLBACK, + CRYPTOGRAPHY_OSRANDOM_GETENTROPY_WORKS +}; + +/* engine ctrl */ +#define CRYPTOGRAPHY_OSRANDOM_GET_IMPLEMENTATION ENGINE_CMD_BASE + +/* error reporting */ +static void ERR_load_Cryptography_OSRandom_strings(void); +static void ERR_Cryptography_OSRandom_error(int function, int reason, + char *file, int line); + +#define CRYPTOGRAPHY_OSRANDOM_F_INIT 100 +#define CRYPTOGRAPHY_OSRANDOM_F_RAND_BYTES 101 +#define CRYPTOGRAPHY_OSRANDOM_F_FINISH 102 +#define CRYPTOGRAPHY_OSRANDOM_F_DEV_URANDOM_FD 300 +#define CRYPTOGRAPHY_OSRANDOM_F_DEV_URANDOM_READ 301 + +#define CRYPTOGRAPHY_OSRANDOM_R_CRYPTACQUIRECONTEXT 100 +#define CRYPTOGRAPHY_OSRANDOM_R_CRYPTGENRANDOM 101 +#define CRYPTOGRAPHY_OSRANDOM_R_CRYPTRELEASECONTEXT 102 + +#define CRYPTOGRAPHY_OSRANDOM_R_GETENTROPY_FAILED 200 + +#define CRYPTOGRAPHY_OSRANDOM_R_DEV_URANDOM_OPEN_FAILED 300 +#define CRYPTOGRAPHY_OSRANDOM_R_DEV_URANDOM_READ_FAILED 301 + +#define CRYPTOGRAPHY_OSRANDOM_R_GETRANDOM_INIT_FAILED 400 +#define CRYPTOGRAPHY_OSRANDOM_R_GETRANDOM_INIT_FAILED_UNEXPECTED 402 +#define CRYPTOGRAPHY_OSRANDOM_R_GETRANDOM_FAILED 403 +#define CRYPTOGRAPHY_OSRANDOM_R_GETRANDOM_NOT_INIT 404 +#endif diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/ssl.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/ssl.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/ssl.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/ssl.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,854 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +INCLUDES = """ +#include + +typedef STACK_OF(SSL_CIPHER) Cryptography_STACK_OF_SSL_CIPHER; +""" + +TYPES = """ +static const long Cryptography_HAS_SSL_ST; +static const long Cryptography_HAS_TLS_ST; +static const long Cryptography_HAS_SSL2; +static const long Cryptography_HAS_SSL3_METHOD; +static const long Cryptography_HAS_TLSv1_1; +static const long Cryptography_HAS_TLSv1_2; +static const long Cryptography_HAS_TLSv1_3; +static const long Cryptography_HAS_SECURE_RENEGOTIATION; +static const long Cryptography_HAS_COMPRESSION; +static const long Cryptography_HAS_TLSEXT_STATUS_REQ_CB; +static const long Cryptography_HAS_STATUS_REQ_OCSP_RESP; +static const long Cryptography_HAS_TLSEXT_STATUS_REQ_TYPE; +static const long Cryptography_HAS_GET_SERVER_TMP_KEY; +static const long Cryptography_HAS_SSL_CTX_SET_CLIENT_CERT_ENGINE; +static const long Cryptography_HAS_SSL_CTX_CLEAR_OPTIONS; +static const long Cryptography_HAS_DTLS; +static const long Cryptography_HAS_GENERIC_DTLS_METHOD; +static const long Cryptography_HAS_SIGALGS; +static const long Cryptography_HAS_PSK; +static const long Cryptography_HAS_CIPHER_DETAILS; + +/* Internally invented symbol to tell us if SNI is supported */ +static const long Cryptography_HAS_TLSEXT_HOSTNAME; + +/* Internally invented symbol to tell us if SSL_MODE_RELEASE_BUFFERS is + * supported + */ +static const long Cryptography_HAS_RELEASE_BUFFERS; + +/* Internally invented symbol to tell us if SSL_OP_NO_COMPRESSION is + * supported + */ +static const long Cryptography_HAS_OP_NO_COMPRESSION; +static const long Cryptography_HAS_SSL_OP_MSIE_SSLV2_RSA_PADDING; +static const long Cryptography_HAS_SSL_SET_SSL_CTX; +static const long Cryptography_HAS_SSL_OP_NO_TICKET; +static const long Cryptography_HAS_ALPN; +static const long Cryptography_HAS_NEXTPROTONEG; +static const long Cryptography_HAS_SET_CERT_CB; +static const long Cryptography_HAS_CUSTOM_EXT; + +static const long SSL_FILETYPE_PEM; +static const long SSL_FILETYPE_ASN1; +static const long SSL_ERROR_NONE; +static const long SSL_ERROR_ZERO_RETURN; +static const long SSL_ERROR_WANT_READ; +static const long SSL_ERROR_WANT_WRITE; +static const long SSL_ERROR_WANT_X509_LOOKUP; +static const long SSL_ERROR_WANT_CONNECT; +static const long SSL_ERROR_SYSCALL; +static const long SSL_ERROR_SSL; +static const long SSL_SENT_SHUTDOWN; +static const long SSL_RECEIVED_SHUTDOWN; +static const long SSL_OP_NO_SSLv2; +static const long SSL_OP_NO_SSLv3; +static const long SSL_OP_NO_TLSv1; +static const long SSL_OP_NO_TLSv1_1; +static const long SSL_OP_NO_TLSv1_2; +static const long SSL_OP_NO_TLSv1_3; +static const long SSL_OP_NO_DTLSv1; +static const long SSL_OP_NO_DTLSv1_2; +static const long SSL_OP_NO_COMPRESSION; +static const long SSL_OP_SINGLE_DH_USE; +static const long SSL_OP_EPHEMERAL_RSA; +static const long SSL_OP_MICROSOFT_SESS_ID_BUG; +static const long SSL_OP_NETSCAPE_CHALLENGE_BUG; +static const long SSL_OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUG; +static const long SSL_OP_SSLREF2_REUSE_CERT_TYPE_BUG; +static const long SSL_OP_MICROSOFT_BIG_SSLV3_BUFFER; +static const long SSL_OP_MSIE_SSLV2_RSA_PADDING; +static const long SSL_OP_SSLEAY_080_CLIENT_DH_BUG; +static const long SSL_OP_TLS_D5_BUG; +static const long SSL_OP_TLS_BLOCK_PADDING_BUG; +static const long SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS; +static const long SSL_OP_CIPHER_SERVER_PREFERENCE; +static const long SSL_OP_TLS_ROLLBACK_BUG; +static const long SSL_OP_PKCS1_CHECK_1; +static const long SSL_OP_PKCS1_CHECK_2; +static const long SSL_OP_NETSCAPE_CA_DN_BUG; +static const long SSL_OP_NETSCAPE_DEMO_CIPHER_CHANGE_BUG; +static const long SSL_OP_NO_QUERY_MTU; +static const long SSL_OP_COOKIE_EXCHANGE; +static const long SSL_OP_NO_TICKET; +static const long SSL_OP_ALL; +static const long SSL_OP_SINGLE_ECDH_USE; +static const long SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION; +static const long SSL_OP_LEGACY_SERVER_CONNECT; +static const long SSL_VERIFY_PEER; +static const long SSL_VERIFY_FAIL_IF_NO_PEER_CERT; +static const long SSL_VERIFY_CLIENT_ONCE; +static const long SSL_VERIFY_NONE; +static const long SSL_VERIFY_POST_HANDSHAKE; +static const long SSL_SESS_CACHE_OFF; +static const long SSL_SESS_CACHE_CLIENT; +static const long SSL_SESS_CACHE_SERVER; +static const long SSL_SESS_CACHE_BOTH; +static const long SSL_SESS_CACHE_NO_AUTO_CLEAR; +static const long SSL_SESS_CACHE_NO_INTERNAL_LOOKUP; +static const long SSL_SESS_CACHE_NO_INTERNAL_STORE; +static const long SSL_SESS_CACHE_NO_INTERNAL; +static const long SSL_ST_CONNECT; +static const long SSL_ST_ACCEPT; +static const long SSL_ST_MASK; +static const long SSL_ST_INIT; +static const long SSL_ST_BEFORE; +static const long SSL_ST_OK; +static const long SSL_ST_RENEGOTIATE; +static const long SSL_CB_LOOP; +static const long SSL_CB_EXIT; +static const long SSL_CB_READ; +static const long SSL_CB_WRITE; +static const long SSL_CB_ALERT; +static const long SSL_CB_READ_ALERT; +static const long SSL_CB_WRITE_ALERT; +static const long SSL_CB_ACCEPT_LOOP; +static const long SSL_CB_ACCEPT_EXIT; +static const long SSL_CB_CONNECT_LOOP; +static const long SSL_CB_CONNECT_EXIT; +static const long SSL_CB_HANDSHAKE_START; +static const long SSL_CB_HANDSHAKE_DONE; +static const long SSL_MODE_RELEASE_BUFFERS; +static const long SSL_MODE_ENABLE_PARTIAL_WRITE; +static const long SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER; +static const long SSL_MODE_AUTO_RETRY; +static const long SSL3_RANDOM_SIZE; +static const long TLS_ST_BEFORE; +static const long TLS_ST_OK; + +static const long OPENSSL_NPN_NEGOTIATED; + +typedef ... SSL_METHOD; +typedef ... SSL_CTX; + +typedef ... SSL_SESSION; + +typedef ... SSL; + +static const long TLSEXT_NAMETYPE_host_name; +static const long TLSEXT_STATUSTYPE_ocsp; + +typedef ... SSL_CIPHER; +typedef ... Cryptography_STACK_OF_SSL_CIPHER; +typedef ... COMP_METHOD; + +typedef struct { + const char *name; + unsigned long id; +} SRTP_PROTECTION_PROFILE; +""" + +FUNCTIONS = """ +/* SSL */ +const char *SSL_state_string_long(const SSL *); +SSL_SESSION *SSL_get1_session(SSL *); +int SSL_set_session(SSL *, SSL_SESSION *); +int SSL_get_verify_mode(const SSL *); +void SSL_set_verify(SSL *, int, int (*)(int, X509_STORE_CTX *)); +void SSL_set_verify_depth(SSL *, int); +int SSL_get_verify_depth(const SSL *); +int (*SSL_get_verify_callback(const SSL *))(int, X509_STORE_CTX *); +void SSL_set_info_callback(SSL *ssl, void (*)(const SSL *, int, int)); +void (*SSL_get_info_callback(const SSL *))(const SSL *, int, int); +SSL *SSL_new(SSL_CTX *); +void SSL_free(SSL *); +int SSL_set_fd(SSL *, int); +SSL_CTX *SSL_get_SSL_CTX(const SSL *); +SSL_CTX *SSL_set_SSL_CTX(SSL *, SSL_CTX *); +BIO *SSL_get_rbio(const SSL *); +BIO *SSL_get_wbio(const SSL *); +void SSL_set_bio(SSL *, BIO *, BIO *); +void SSL_set_connect_state(SSL *); +void SSL_set_accept_state(SSL *); +void SSL_set_shutdown(SSL *, int); +int SSL_get_shutdown(const SSL *); +int SSL_pending(const SSL *); +int SSL_write(SSL *, const void *, int); +int SSL_read(SSL *, void *, int); +int SSL_peek(SSL *, void *, int); +X509 *SSL_get_certificate(const SSL *); +X509 *SSL_get_peer_certificate(const SSL *); +int SSL_get_ex_data_X509_STORE_CTX_idx(void); + +/* Added in 1.0.2 */ +X509_VERIFY_PARAM *SSL_get0_param(SSL *); + +int SSL_use_certificate(SSL *, X509 *); +int SSL_use_certificate_ASN1(SSL *, const unsigned char *, int); +int SSL_use_certificate_file(SSL *, const char *, int); +int SSL_use_PrivateKey(SSL *, EVP_PKEY *); +int SSL_use_PrivateKey_ASN1(int, SSL *, const unsigned char *, long); +int SSL_use_PrivateKey_file(SSL *, const char *, int); +int SSL_check_private_key(const SSL *); + +int SSL_get_sigalgs(SSL *, int, int *, int *, int *, unsigned char *, + unsigned char *); + +Cryptography_STACK_OF_X509 *SSL_get_peer_cert_chain(const SSL *); +Cryptography_STACK_OF_X509_NAME *SSL_get_client_CA_list(const SSL *); + +int SSL_get_error(const SSL *, int); +int SSL_do_handshake(SSL *); +int SSL_shutdown(SSL *); +int SSL_renegotiate(SSL *); +int SSL_renegotiate_pending(SSL *); +const char *SSL_get_cipher_list(const SSL *, int); +Cryptography_STACK_OF_SSL_CIPHER *SSL_get_ciphers(const SSL *); + +/* context */ +void SSL_CTX_free(SSL_CTX *); +long SSL_CTX_set_timeout(SSL_CTX *, long); +int SSL_CTX_set_default_verify_paths(SSL_CTX *); +void SSL_CTX_set_verify(SSL_CTX *, int, int (*)(int, X509_STORE_CTX *)); +void SSL_CTX_set_verify_depth(SSL_CTX *, int); +int (*SSL_CTX_get_verify_callback(const SSL_CTX *))(int, X509_STORE_CTX *); +int SSL_CTX_get_verify_mode(const SSL_CTX *); +int SSL_CTX_get_verify_depth(const SSL_CTX *); +int SSL_CTX_set_cipher_list(SSL_CTX *, const char *); +int SSL_CTX_load_verify_locations(SSL_CTX *, const char *, const char *); +void SSL_CTX_set_default_passwd_cb(SSL_CTX *, pem_password_cb *); +void SSL_CTX_set_default_passwd_cb_userdata(SSL_CTX *, void *); +int SSL_CTX_use_certificate(SSL_CTX *, X509 *); +int SSL_CTX_use_certificate_ASN1(SSL_CTX *, int, const unsigned char *); +int SSL_CTX_use_certificate_file(SSL_CTX *, const char *, int); +int SSL_CTX_use_certificate_chain_file(SSL_CTX *, const char *); +int SSL_CTX_use_PrivateKey(SSL_CTX *, EVP_PKEY *); +int SSL_CTX_use_PrivateKey_ASN1(int, SSL_CTX *, const unsigned char *, long); +int SSL_CTX_use_PrivateKey_file(SSL_CTX *, const char *, int); +int SSL_CTX_check_private_key(const SSL_CTX *); +void SSL_CTX_set_cert_verify_callback(SSL_CTX *, + int (*)(X509_STORE_CTX *, void *), + void *); + +void SSL_CTX_set_cookie_generate_cb(SSL_CTX *, + int (*)( + SSL *, + unsigned char *, + unsigned int * + )); +long SSL_CTX_get_read_ahead(SSL_CTX *); +long SSL_CTX_set_read_ahead(SSL_CTX *, long); + +int SSL_CTX_use_psk_identity_hint(SSL_CTX *, const char *); +void SSL_CTX_set_psk_server_callback(SSL_CTX *, + unsigned int (*)( + SSL *, + const char *, + unsigned char *, + unsigned int + )); +void SSL_CTX_set_psk_client_callback(SSL_CTX *, + unsigned int (*)( + SSL *, + const char *, + char *, + unsigned int, + unsigned char *, + unsigned int + )); + +int SSL_CTX_set_session_id_context(SSL_CTX *, const unsigned char *, + unsigned int); + +void SSL_CTX_set_cert_store(SSL_CTX *, X509_STORE *); +X509_STORE *SSL_CTX_get_cert_store(const SSL_CTX *); +int SSL_CTX_add_client_CA(SSL_CTX *, X509 *); + +void SSL_CTX_set_client_CA_list(SSL_CTX *, Cryptography_STACK_OF_X509_NAME *); + +void SSL_CTX_set_info_callback(SSL_CTX *, void (*)(const SSL *, int, int)); +void (*SSL_CTX_get_info_callback(SSL_CTX *))(const SSL *, int, int); + +long SSL_CTX_set1_sigalgs_list(SSL_CTX *, const char *); + +/* SSL_SESSION */ +void SSL_SESSION_free(SSL_SESSION *); + +/* Information about actually used cipher */ +const char *SSL_CIPHER_get_name(const SSL_CIPHER *); +int SSL_CIPHER_get_bits(const SSL_CIPHER *, int *); +/* the modern signature of this is uint32_t, but older openssl declared it + as unsigned long. To make our compiler flags happy we'll declare it as a + 64-bit wide value, which should always be safe */ +uint64_t SSL_CIPHER_get_id(const SSL_CIPHER *); +int SSL_CIPHER_is_aead(const SSL_CIPHER *); +int SSL_CIPHER_get_cipher_nid(const SSL_CIPHER *); +int SSL_CIPHER_get_digest_nid(const SSL_CIPHER *); +int SSL_CIPHER_get_kx_nid(const SSL_CIPHER *); +int SSL_CIPHER_get_auth_nid(const SSL_CIPHER *); + +size_t SSL_get_finished(const SSL *, void *, size_t); +size_t SSL_get_peer_finished(const SSL *, void *, size_t); +Cryptography_STACK_OF_X509_NAME *SSL_load_client_CA_file(const char *); + +const char *SSL_get_servername(const SSL *, const int); +/* Function signature changed to const char * in 1.1.0 */ +const char *SSL_CIPHER_get_version(const SSL_CIPHER *); +/* These became macros in 1.1.0 */ +int SSL_library_init(void); +void SSL_load_error_strings(void); + +/* these CRYPTO_EX_DATA functions became macros in 1.1.0 */ +int SSL_get_ex_new_index(long, void *, CRYPTO_EX_new *, CRYPTO_EX_dup *, + CRYPTO_EX_free *); +int SSL_set_ex_data(SSL *, int, void *); +int SSL_CTX_get_ex_new_index(long, void *, CRYPTO_EX_new *, CRYPTO_EX_dup *, + CRYPTO_EX_free *); +int SSL_CTX_set_ex_data(SSL_CTX *, int, void *); + +SSL_SESSION *SSL_get_session(const SSL *); +const unsigned char *SSL_SESSION_get_id(const SSL_SESSION *, unsigned int *); +long SSL_SESSION_get_time(const SSL_SESSION *); +long SSL_SESSION_get_timeout(const SSL_SESSION *); +int SSL_SESSION_has_ticket(const SSL_SESSION *); +long SSL_SESSION_get_ticket_lifetime_hint(const SSL_SESSION *); + +/* not a macro, but older OpenSSLs don't pass the args as const */ +char *SSL_CIPHER_description(const SSL_CIPHER *, char *, int); +int SSL_SESSION_print(BIO *, const SSL_SESSION *); + +/* not macros, but will be conditionally bound so can't live in functions */ +const COMP_METHOD *SSL_get_current_compression(SSL *); +const COMP_METHOD *SSL_get_current_expansion(SSL *); +const char *SSL_COMP_get_name(const COMP_METHOD *); + +unsigned long SSL_set_mode(SSL *, unsigned long); +unsigned long SSL_get_mode(SSL *); + +unsigned long SSL_set_options(SSL *, unsigned long); +unsigned long SSL_get_options(SSL *); + +void SSL_set_app_data(SSL *, char *); +char * SSL_get_app_data(SSL *); +void SSL_set_read_ahead(SSL *, int); + +int SSL_want_read(const SSL *); +int SSL_want_write(const SSL *); + +long SSL_total_renegotiations(SSL *); +long SSL_get_secure_renegotiation_support(SSL *); + +/* Defined as unsigned long because SSL_OP_ALL is greater than signed 32-bit + and Windows defines long as 32-bit. */ +unsigned long SSL_CTX_set_options(SSL_CTX *, unsigned long); +unsigned long SSL_CTX_clear_options(SSL_CTX *, unsigned long); +unsigned long SSL_CTX_get_options(SSL_CTX *); +unsigned long SSL_CTX_set_mode(SSL_CTX *, unsigned long); +unsigned long SSL_CTX_get_mode(SSL_CTX *); +unsigned long SSL_CTX_set_session_cache_mode(SSL_CTX *, unsigned long); +unsigned long SSL_CTX_get_session_cache_mode(SSL_CTX *); +unsigned long SSL_CTX_set_tmp_dh(SSL_CTX *, DH *); +unsigned long SSL_CTX_set_tmp_ecdh(SSL_CTX *, EC_KEY *); +unsigned long SSL_CTX_add_extra_chain_cert(SSL_CTX *, X509 *); + +/*- These aren't macros these functions are all const X on openssl > 1.0.x -*/ + +/* methods */ + +/* + * TLSv1_1 and TLSv1_2 are recent additions. Only sufficiently new versions of + * OpenSSL support them. + */ +const SSL_METHOD *TLSv1_1_method(void); +const SSL_METHOD *TLSv1_1_server_method(void); +const SSL_METHOD *TLSv1_1_client_method(void); + +const SSL_METHOD *TLSv1_2_method(void); +const SSL_METHOD *TLSv1_2_server_method(void); +const SSL_METHOD *TLSv1_2_client_method(void); + +const SSL_METHOD *SSLv3_method(void); +const SSL_METHOD *SSLv3_server_method(void); +const SSL_METHOD *SSLv3_client_method(void); + +const SSL_METHOD *TLSv1_method(void); +const SSL_METHOD *TLSv1_server_method(void); +const SSL_METHOD *TLSv1_client_method(void); + +const SSL_METHOD *DTLSv1_method(void); +const SSL_METHOD *DTLSv1_server_method(void); +const SSL_METHOD *DTLSv1_client_method(void); + +/* Added in 1.0.2 */ +const SSL_METHOD *DTLS_method(void); +const SSL_METHOD *DTLS_server_method(void); +const SSL_METHOD *DTLS_client_method(void); + +const SSL_METHOD *SSLv23_method(void); +const SSL_METHOD *SSLv23_server_method(void); +const SSL_METHOD *SSLv23_client_method(void); + +/*- These aren't macros these arguments are all const X on openssl > 1.0.x -*/ +SSL_CTX *SSL_CTX_new(SSL_METHOD *); +long SSL_CTX_get_timeout(const SSL_CTX *); + +const SSL_CIPHER *SSL_get_current_cipher(const SSL *); +const char *SSL_get_version(const SSL *); +int SSL_version(const SSL *); + +void *SSL_CTX_get_ex_data(const SSL_CTX *, int); +void *SSL_get_ex_data(const SSL *, int); + +void SSL_set_tlsext_host_name(SSL *, char *); +void SSL_CTX_set_tlsext_servername_callback( + SSL_CTX *, + int (*)(SSL *, int *, void *)); +void SSL_CTX_set_tlsext_servername_arg( + SSL_CTX *, void *); + +long SSL_set_tlsext_status_ocsp_resp(SSL *, unsigned char *, int); +long SSL_get_tlsext_status_ocsp_resp(SSL *, const unsigned char **); +long SSL_set_tlsext_status_type(SSL *, long); +long SSL_CTX_set_tlsext_status_cb(SSL_CTX *, int(*)(SSL *, void *)); +long SSL_CTX_set_tlsext_status_arg(SSL_CTX *, void *); + +int SSL_CTX_set_tlsext_use_srtp(SSL_CTX *, const char *); +int SSL_set_tlsext_use_srtp(SSL *, const char *); +SRTP_PROTECTION_PROFILE *SSL_get_selected_srtp_profile(SSL *); + +long SSL_session_reused(SSL *); + +void SSL_CTX_set_next_protos_advertised_cb(SSL_CTX *, + int (*)(SSL *, + const unsigned char **, + unsigned int *, + void *), + void *); +void SSL_CTX_set_next_proto_select_cb(SSL_CTX *, + int (*)(SSL *, + unsigned char **, + unsigned char *, + const unsigned char *, + unsigned int, + void *), + void *); +int SSL_select_next_proto(unsigned char **, unsigned char *, + const unsigned char *, unsigned int, + const unsigned char *, unsigned int); +void SSL_get0_next_proto_negotiated(const SSL *, + const unsigned char **, unsigned *); + +int sk_SSL_CIPHER_num(Cryptography_STACK_OF_SSL_CIPHER *); +const SSL_CIPHER *sk_SSL_CIPHER_value(Cryptography_STACK_OF_SSL_CIPHER *, int); + +/* ALPN APIs were introduced in OpenSSL 1.0.2. To continue to support earlier + * versions some special handling of these is necessary. + */ +int SSL_CTX_set_alpn_protos(SSL_CTX *, const unsigned char *, unsigned); +int SSL_set_alpn_protos(SSL *, const unsigned char *, unsigned); +void SSL_CTX_set_alpn_select_cb(SSL_CTX *, + int (*) (SSL *, + const unsigned char **, + unsigned char *, + const unsigned char *, + unsigned int, + void *), + void *); +void SSL_get0_alpn_selected(const SSL *, const unsigned char **, unsigned *); + +long SSL_get_server_tmp_key(SSL *, EVP_PKEY **); + +/* SSL_CTX_set_cert_cb is introduced in OpenSSL 1.0.2. To continue to support + * earlier versions some special handling of these is necessary. + */ +void SSL_CTX_set_cert_cb(SSL_CTX *, int (*)(SSL *, void *), void *); +void SSL_set_cert_cb(SSL *, int (*)(SSL *, void *), void *); + +/* Added in 1.0.2 */ +const SSL_METHOD *SSL_CTX_get_ssl_method(SSL_CTX *); + +int SSL_SESSION_set1_id_context(SSL_SESSION *, const unsigned char *, + unsigned int); +/* Added in 1.1.0 for the great opaquing of structs */ +size_t SSL_SESSION_get_master_key(const SSL_SESSION *, unsigned char *, + size_t); +size_t SSL_get_client_random(const SSL *, unsigned char *, size_t); +size_t SSL_get_server_random(const SSL *, unsigned char *, size_t); +int SSL_export_keying_material(SSL *, unsigned char *, size_t, const char *, + size_t, const unsigned char *, size_t, int); + +long SSL_CTX_sess_number(SSL_CTX *); +long SSL_CTX_sess_connect(SSL_CTX *); +long SSL_CTX_sess_connect_good(SSL_CTX *); +long SSL_CTX_sess_connect_renegotiate(SSL_CTX *); +long SSL_CTX_sess_accept(SSL_CTX *); +long SSL_CTX_sess_accept_good(SSL_CTX *); +long SSL_CTX_sess_accept_renegotiate(SSL_CTX *); +long SSL_CTX_sess_hits(SSL_CTX *); +long SSL_CTX_sess_cb_hits(SSL_CTX *); +long SSL_CTX_sess_misses(SSL_CTX *); +long SSL_CTX_sess_timeouts(SSL_CTX *); +long SSL_CTX_sess_cache_full(SSL_CTX *); + +/* DTLS support */ +long Cryptography_DTLSv1_get_timeout(SSL *, time_t *, long *); +long DTLSv1_handle_timeout(SSL *); +long DTLS_set_link_mtu(SSL *, long); +long DTLS_get_link_min_mtu(SSL *); + +/* Custom extensions. */ +typedef int (*custom_ext_add_cb)(SSL *, unsigned int, + const unsigned char **, + size_t *, int *, + void *); + +typedef void (*custom_ext_free_cb)(SSL *, unsigned int, + const unsigned char *, + void *); + +typedef int (*custom_ext_parse_cb)(SSL *, unsigned int, + const unsigned char *, + size_t, int *, + void *); + +int SSL_CTX_add_client_custom_ext(SSL_CTX *, unsigned int, + custom_ext_add_cb, + custom_ext_free_cb, void *, + custom_ext_parse_cb, + void *); + +int SSL_CTX_add_server_custom_ext(SSL_CTX *, unsigned int, + custom_ext_add_cb, + custom_ext_free_cb, void *, + custom_ext_parse_cb, + void *); + +int SSL_extension_supported(unsigned int); + +int SSL_CTX_set_ciphersuites(SSL_CTX *, const char *); +int SSL_verify_client_post_handshake(SSL *); +void SSL_CTX_set_post_handshake_auth(SSL_CTX *, int); +void SSL_set_post_handshake_auth(SSL *, int); + +uint32_t SSL_SESSION_get_max_early_data(const SSL_SESSION *); +int SSL_write_early_data(SSL *, const void *, size_t, size_t *); +int SSL_read_early_data(SSL *, void *, size_t, size_t *); +int SSL_CTX_set_max_early_data(SSL_CTX *, uint32_t); +""" + +CUSTOMIZATIONS = """ +/* Added in 1.0.2 but we need it in all versions now due to the great + opaquing. */ +#if CRYPTOGRAPHY_OPENSSL_LESS_THAN_102 +/* from ssl/ssl_lib.c */ +const SSL_METHOD *SSL_CTX_get_ssl_method(SSL_CTX *ctx) { + return ctx->method; +} +#endif + +/* Added in 1.1.0 in the great opaquing, but we need to define it for older + OpenSSLs. Such is our burden. */ +#if CRYPTOGRAPHY_OPENSSL_LESS_THAN_110 && !CRYPTOGRAPHY_LIBRESSL_27_OR_GREATER +/* from ssl/ssl_lib.c */ +size_t SSL_get_client_random(const SSL *ssl, unsigned char *out, size_t outlen) +{ + if (outlen == 0) + return sizeof(ssl->s3->client_random); + if (outlen > sizeof(ssl->s3->client_random)) + outlen = sizeof(ssl->s3->client_random); + memcpy(out, ssl->s3->client_random, outlen); + return outlen; +} +/* Added in 1.1.0 as well */ +/* from ssl/ssl_lib.c */ +size_t SSL_get_server_random(const SSL *ssl, unsigned char *out, size_t outlen) +{ + if (outlen == 0) + return sizeof(ssl->s3->server_random); + if (outlen > sizeof(ssl->s3->server_random)) + outlen = sizeof(ssl->s3->server_random); + memcpy(out, ssl->s3->server_random, outlen); + return outlen; +} +/* Added in 1.1.0 as well */ +/* from ssl/ssl_lib.c */ +size_t SSL_SESSION_get_master_key(const SSL_SESSION *session, + unsigned char *out, size_t outlen) +{ + if (session->master_key_length < 0) { + /* Should never happen */ + return 0; + } + if (outlen == 0) + return session->master_key_length; + if (outlen > (size_t)session->master_key_length) + outlen = session->master_key_length; + memcpy(out, session->master_key, outlen); + return outlen; +} +/* from ssl/ssl_sess.c */ +int SSL_SESSION_has_ticket(const SSL_SESSION *s) +{ + return (s->tlsext_ticklen > 0) ? 1 : 0; +} +/* from ssl/ssl_sess.c */ +unsigned long SSL_SESSION_get_ticket_lifetime_hint(const SSL_SESSION *s) +{ + return s->tlsext_tick_lifetime_hint; +} +#endif + +static const long Cryptography_HAS_SECURE_RENEGOTIATION = 1; + +/* Cryptography now compiles out all SSLv2 bindings. This exists to allow + * clients that use it to check for SSLv2 support to keep functioning as + * expected. + */ +static const long Cryptography_HAS_SSL2 = 0; + +#ifdef OPENSSL_NO_SSL3_METHOD +static const long Cryptography_HAS_SSL3_METHOD = 0; +const SSL_METHOD* (*SSLv3_method)(void) = NULL; +const SSL_METHOD* (*SSLv3_client_method)(void) = NULL; +const SSL_METHOD* (*SSLv3_server_method)(void) = NULL; +#else +static const long Cryptography_HAS_SSL3_METHOD = 1; +#endif + +static const long Cryptography_HAS_TLSEXT_HOSTNAME = 1; +static const long Cryptography_HAS_TLSEXT_STATUS_REQ_CB = 1; +static const long Cryptography_HAS_STATUS_REQ_OCSP_RESP = 1; +static const long Cryptography_HAS_TLSEXT_STATUS_REQ_TYPE = 1; +static const long Cryptography_HAS_RELEASE_BUFFERS = 1; +static const long Cryptography_HAS_OP_NO_COMPRESSION = 1; +static const long Cryptography_HAS_TLSv1_1 = 1; +static const long Cryptography_HAS_TLSv1_2 = 1; +static const long Cryptography_HAS_SSL_OP_MSIE_SSLV2_RSA_PADDING = 1; +static const long Cryptography_HAS_SSL_OP_NO_TICKET = 1; +static const long Cryptography_HAS_SSL_SET_SSL_CTX = 1; +static const long Cryptography_HAS_NEXTPROTONEG = 1; + +/* SSL_get0_param was added in OpenSSL 1.0.2. */ +#if CRYPTOGRAPHY_OPENSSL_LESS_THAN_102 && !CRYPTOGRAPHY_LIBRESSL_27_OR_GREATER +X509_VERIFY_PARAM *(*SSL_get0_param)(SSL *) = NULL; +#else +#endif + +/* ALPN was added in OpenSSL 1.0.2. */ +#if CRYPTOGRAPHY_OPENSSL_LESS_THAN_102 && !CRYPTOGRAPHY_IS_LIBRESSL +int (*SSL_CTX_set_alpn_protos)(SSL_CTX *, + const unsigned char *, + unsigned) = NULL; +int (*SSL_set_alpn_protos)(SSL *, const unsigned char *, unsigned) = NULL; +void (*SSL_CTX_set_alpn_select_cb)(SSL_CTX *, + int (*) (SSL *, + const unsigned char **, + unsigned char *, + const unsigned char *, + unsigned int, + void *), + void *) = NULL; +void (*SSL_get0_alpn_selected)(const SSL *, + const unsigned char **, + unsigned *) = NULL; +static const long Cryptography_HAS_ALPN = 0; +#else +static const long Cryptography_HAS_ALPN = 1; +#endif + +/* SSL_CTX_set_cert_cb was added in OpenSSL 1.0.2. */ +#if CRYPTOGRAPHY_OPENSSL_LESS_THAN_102 +void (*SSL_CTX_set_cert_cb)(SSL_CTX *, int (*)(SSL *, void *), void *) = NULL; +void (*SSL_set_cert_cb)(SSL *, int (*)(SSL *, void *), void *) = NULL; +static const long Cryptography_HAS_SET_CERT_CB = 0; +#else +static const long Cryptography_HAS_SET_CERT_CB = 1; +#endif + + +/* In OpenSSL 1.0.2i+ the handling of COMP_METHOD when OPENSSL_NO_COMP was + changed and we no longer need to typedef void */ +#if (defined(OPENSSL_NO_COMP) && CRYPTOGRAPHY_OPENSSL_LESS_THAN_102I) || \ + CRYPTOGRAPHY_IS_LIBRESSL +static const long Cryptography_HAS_COMPRESSION = 0; +typedef void COMP_METHOD; +#else +static const long Cryptography_HAS_COMPRESSION = 1; +#endif + +#if defined(SSL_CTRL_GET_SERVER_TMP_KEY) +static const long Cryptography_HAS_GET_SERVER_TMP_KEY = 1; +#else +static const long Cryptography_HAS_GET_SERVER_TMP_KEY = 0; +long (*SSL_get_server_tmp_key)(SSL *, EVP_PKEY **) = NULL; +#endif + +static const long Cryptography_HAS_SSL_CTX_SET_CLIENT_CERT_ENGINE = 1; + +static const long Cryptography_HAS_SSL_CTX_CLEAR_OPTIONS = 1; + +/* in OpenSSL 1.1.0 the SSL_ST values were renamed to TLS_ST and several were + removed */ +#if CRYPTOGRAPHY_OPENSSL_LESS_THAN_110 +static const long Cryptography_HAS_SSL_ST = 1; +#else +static const long Cryptography_HAS_SSL_ST = 0; +static const long SSL_ST_BEFORE = 0; +static const long SSL_ST_OK = 0; +static const long SSL_ST_INIT = 0; +static const long SSL_ST_RENEGOTIATE = 0; +#endif +#if CRYPTOGRAPHY_OPENSSL_110_OR_GREATER +static const long Cryptography_HAS_TLS_ST = 1; +#else +static const long Cryptography_HAS_TLS_ST = 0; +static const long TLS_ST_BEFORE = 0; +static const long TLS_ST_OK = 0; +#endif + +/* LibreSSL 2.9.1 added only the DTLS_*_method functions */ +#if CRYPTOGRAPHY_OPENSSL_LESS_THAN_102 && !CRYPTOGRAPHY_LIBRESSL_291_OR_GREATER +static const long Cryptography_HAS_GENERIC_DTLS_METHOD = 0; +const SSL_METHOD *(*DTLS_method)(void) = NULL; +const SSL_METHOD *(*DTLS_server_method)(void) = NULL; +const SSL_METHOD *(*DTLS_client_method)(void) = NULL; +#else +static const long Cryptography_HAS_GENERIC_DTLS_METHOD = 1; +#endif +#if CRYPTOGRAPHY_OPENSSL_LESS_THAN_102 +static const long SSL_OP_NO_DTLSv1 = 0; +static const long SSL_OP_NO_DTLSv1_2 = 0; +long (*DTLS_set_link_mtu)(SSL *, long) = NULL; +long (*DTLS_get_link_min_mtu)(SSL *) = NULL; +#endif + +static const long Cryptography_HAS_DTLS = 1; +/* Wrap DTLSv1_get_timeout to avoid cffi to handle a 'struct timeval'. */ +long Cryptography_DTLSv1_get_timeout(SSL *ssl, time_t *ptv_sec, + long *ptv_usec) { + struct timeval tv = { 0 }; + long r = DTLSv1_get_timeout(ssl, &tv); + + if (r == 1) { + if (ptv_sec) { + *ptv_sec = tv.tv_sec; + } + + if (ptv_usec) { + *ptv_usec = tv.tv_usec; + } + } + + return r; +} + +#if CRYPTOGRAPHY_OPENSSL_LESS_THAN_102 +static const long Cryptography_HAS_SIGALGS = 0; +const int (*SSL_get_sigalgs)(SSL *, int, int *, int *, int *, unsigned char *, + unsigned char *) = NULL; +const long (*SSL_CTX_set1_sigalgs_list)(SSL_CTX *, const char *) = NULL; +#else +static const long Cryptography_HAS_SIGALGS = 1; +#endif + +#if CRYPTOGRAPHY_IS_LIBRESSL || defined(OPENSSL_NO_PSK) +static const long Cryptography_HAS_PSK = 0; +int (*SSL_CTX_use_psk_identity_hint)(SSL_CTX *, const char *) = NULL; +void (*SSL_CTX_set_psk_server_callback)(SSL_CTX *, + unsigned int (*)( + SSL *, + const char *, + unsigned char *, + unsigned int + )) = NULL; +void (*SSL_CTX_set_psk_client_callback)(SSL_CTX *, + unsigned int (*)( + SSL *, + const char *, + char *, + unsigned int, + unsigned char *, + unsigned int + )) = NULL; +#else +static const long Cryptography_HAS_PSK = 1; +#endif + +/* + * Custom extensions were added in 1.0.2. 1.1.1 is adding a more general + * SSL_CTX_add_custom_ext function, but we're not binding that yet. + */ +#if CRYPTOGRAPHY_OPENSSL_102_OR_GREATER +static const long Cryptography_HAS_CUSTOM_EXT = 1; +#else +static const long Cryptography_HAS_CUSTOM_EXT = 0; + +typedef int (*custom_ext_add_cb)(SSL *, unsigned int, + const unsigned char **, + size_t *, int *, + void *); + +typedef void (*custom_ext_free_cb)(SSL *, unsigned int, + const unsigned char *, + void *); + +typedef int (*custom_ext_parse_cb)(SSL *, unsigned int, + const unsigned char *, + size_t, int *, + void *); + +int (*SSL_CTX_add_client_custom_ext)(SSL_CTX *, unsigned int, + custom_ext_add_cb, + custom_ext_free_cb, void *, + custom_ext_parse_cb, + void *) = NULL; + +int (*SSL_CTX_add_server_custom_ext)(SSL_CTX *, unsigned int, + custom_ext_add_cb, + custom_ext_free_cb, void *, + custom_ext_parse_cb, + void *) = NULL; + +int (*SSL_extension_supported)(unsigned int) = NULL; +#endif + +#if CRYPTOGRAPHY_OPENSSL_LESS_THAN_110 && !CRYPTOGRAPHY_LIBRESSL_27_OR_GREATER +int (*SSL_CIPHER_is_aead)(const SSL_CIPHER *) = NULL; +int (*SSL_CIPHER_get_cipher_nid)(const SSL_CIPHER *) = NULL; +int (*SSL_CIPHER_get_digest_nid)(const SSL_CIPHER *) = NULL; +int (*SSL_CIPHER_get_kx_nid)(const SSL_CIPHER *) = NULL; +int (*SSL_CIPHER_get_auth_nid)(const SSL_CIPHER *) = NULL; +static const long Cryptography_HAS_CIPHER_DETAILS = 0; +#else +static const long Cryptography_HAS_CIPHER_DETAILS = 1; +#endif + +#if CRYPTOGRAPHY_OPENSSL_LESS_THAN_111 +static const long Cryptography_HAS_TLSv1_3 = 0; +static const long SSL_OP_NO_TLSv1_3 = 0; +static const long SSL_VERIFY_POST_HANDSHAKE = 0; +int (*SSL_CTX_set_ciphersuites)(SSL_CTX *, const char *) = NULL; +int (*SSL_verify_client_post_handshake)(SSL *) = NULL; +void (*SSL_CTX_set_post_handshake_auth)(SSL_CTX *, int) = NULL; +void (*SSL_set_post_handshake_auth)(SSL *, int) = NULL; +uint32_t (*SSL_SESSION_get_max_early_data)(const SSL_SESSION *) = NULL; +int (*SSL_write_early_data)(SSL *, const void *, size_t, size_t *) = NULL; +int (*SSL_read_early_data)(SSL *, void *, size_t, size_t *) = NULL; +int (*SSL_CTX_set_max_early_data)(SSL_CTX *, uint32_t) = NULL; +#else +static const long Cryptography_HAS_TLSv1_3 = 1; +#endif +""" diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/x509name.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/x509name.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/x509name.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/x509name.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,87 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +INCLUDES = """ +#include + +/* + * See the comment above Cryptography_STACK_OF_X509 in x509.py + */ +typedef STACK_OF(X509_NAME) Cryptography_STACK_OF_X509_NAME; +typedef STACK_OF(X509_NAME_ENTRY) Cryptography_STACK_OF_X509_NAME_ENTRY; +""" + +TYPES = """ +typedef ... Cryptography_STACK_OF_X509_NAME_ENTRY; +typedef ... X509_NAME; +typedef ... X509_NAME_ENTRY; +typedef ... Cryptography_STACK_OF_X509_NAME; +""" + +FUNCTIONS = """ +X509_NAME *X509_NAME_new(void); +void X509_NAME_free(X509_NAME *); + +unsigned long X509_NAME_hash(X509_NAME *); + +int i2d_X509_NAME(X509_NAME *, unsigned char **); +int X509_NAME_add_entry_by_txt(X509_NAME *, const char *, int, + const unsigned char *, int, int, int); +X509_NAME_ENTRY *X509_NAME_delete_entry(X509_NAME *, int); +void X509_NAME_ENTRY_free(X509_NAME_ENTRY *); +int X509_NAME_get_index_by_NID(X509_NAME *, int, int); +int X509_NAME_cmp(const X509_NAME *, const X509_NAME *); +X509_NAME *X509_NAME_dup(X509_NAME *); +int Cryptography_X509_NAME_ENTRY_set(X509_NAME_ENTRY *); +/* These became const X509_NAME * in 1.1.0 */ +int X509_NAME_entry_count(X509_NAME *); +X509_NAME_ENTRY *X509_NAME_get_entry(X509_NAME *, int); +char *X509_NAME_oneline(X509_NAME *, char *, int); +int X509_NAME_print_ex(BIO *, X509_NAME *, int, unsigned long); + +/* These became const X509_NAME_ENTRY * in 1.1.0 */ +ASN1_OBJECT *X509_NAME_ENTRY_get_object(X509_NAME_ENTRY *); +ASN1_STRING *X509_NAME_ENTRY_get_data(X509_NAME_ENTRY *); +int X509_NAME_add_entry(X509_NAME *, X509_NAME_ENTRY *, int, int); + +/* this became const unsigned char * in 1.1.0 */ +int X509_NAME_add_entry_by_NID(X509_NAME *, int, int, unsigned char *, + int, int, int); + +/* These became const ASN1_OBJECT * in 1.1.0 */ +X509_NAME_ENTRY *X509_NAME_ENTRY_create_by_OBJ(X509_NAME_ENTRY **, + ASN1_OBJECT *, int, + const unsigned char *, int); +int X509_NAME_add_entry_by_OBJ(X509_NAME *, ASN1_OBJECT *, int, + unsigned char *, int, int, int); + +Cryptography_STACK_OF_X509_NAME *sk_X509_NAME_new_null(void); +int sk_X509_NAME_num(Cryptography_STACK_OF_X509_NAME *); +int sk_X509_NAME_push(Cryptography_STACK_OF_X509_NAME *, X509_NAME *); +X509_NAME *sk_X509_NAME_value(Cryptography_STACK_OF_X509_NAME *, int); +void sk_X509_NAME_free(Cryptography_STACK_OF_X509_NAME *); +int sk_X509_NAME_ENTRY_num(Cryptography_STACK_OF_X509_NAME_ENTRY *); +Cryptography_STACK_OF_X509_NAME_ENTRY *sk_X509_NAME_ENTRY_new_null(void); +int sk_X509_NAME_ENTRY_push(Cryptography_STACK_OF_X509_NAME_ENTRY *, + X509_NAME_ENTRY *); +X509_NAME_ENTRY *sk_X509_NAME_ENTRY_value( + Cryptography_STACK_OF_X509_NAME_ENTRY *, int); +Cryptography_STACK_OF_X509_NAME_ENTRY *sk_X509_NAME_ENTRY_dup( + Cryptography_STACK_OF_X509_NAME_ENTRY * +); +""" + +CUSTOMIZATIONS = """ +#if CRYPTOGRAPHY_OPENSSL_110_OR_GREATER +int Cryptography_X509_NAME_ENTRY_set(X509_NAME_ENTRY *ne) { + return X509_NAME_ENTRY_set(ne); +} +#else +int Cryptography_X509_NAME_ENTRY_set(X509_NAME_ENTRY *ne) { + return ne->set; +} +#endif +""" diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/x509.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/x509.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/x509.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/x509.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,359 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +INCLUDES = """ +#include + +/* + * This is part of a work-around for the difficulty cffi has in dealing with + * `STACK_OF(foo)` as the name of a type. We invent a new, simpler name that + * will be an alias for this type and use the alias throughout. This works + * together with another opaque typedef for the same name in the TYPES section. + * Note that the result is an opaque type. + */ +typedef STACK_OF(X509) Cryptography_STACK_OF_X509; +typedef STACK_OF(X509_CRL) Cryptography_STACK_OF_X509_CRL; +typedef STACK_OF(X509_REVOKED) Cryptography_STACK_OF_X509_REVOKED; +""" + +TYPES = """ +typedef ... Cryptography_STACK_OF_X509; +typedef ... Cryptography_STACK_OF_X509_CRL; +typedef ... Cryptography_STACK_OF_X509_REVOKED; + +typedef struct { + ASN1_OBJECT *algorithm; + ...; +} X509_ALGOR; + +typedef ... X509_EXTENSION; +typedef ... X509_EXTENSIONS; +typedef ... X509_REQ; +typedef ... X509_REVOKED; +typedef ... X509_CRL; +typedef ... X509; + +typedef ... NETSCAPE_SPKI; + +typedef ... PKCS8_PRIV_KEY_INFO; + +typedef void (*sk_X509_EXTENSION_freefunc)(X509_EXTENSION *); +""" + +FUNCTIONS = """ +X509 *X509_new(void); +void X509_free(X509 *); +X509 *X509_dup(X509 *); +int X509_cmp(const X509 *, const X509 *); +int X509_up_ref(X509 *); + +int X509_print_ex(BIO *, X509 *, unsigned long, unsigned long); + +int X509_set_version(X509 *, long); + +EVP_PKEY *X509_get_pubkey(X509 *); +int X509_set_pubkey(X509 *, EVP_PKEY *); + +unsigned char *X509_alias_get0(X509 *, int *); +int X509_sign(X509 *, EVP_PKEY *, const EVP_MD *); + +int X509_digest(const X509 *, const EVP_MD *, unsigned char *, unsigned int *); + +ASN1_TIME *X509_gmtime_adj(ASN1_TIME *, long); + +unsigned long X509_subject_name_hash(X509 *); + +int X509_set_subject_name(X509 *, X509_NAME *); + +int X509_set_issuer_name(X509 *, X509_NAME *); + +int X509_add_ext(X509 *, X509_EXTENSION *, int); +X509_EXTENSION *X509_EXTENSION_dup(X509_EXTENSION *); + +ASN1_OBJECT *X509_EXTENSION_get_object(X509_EXTENSION *); +void X509_EXTENSION_free(X509_EXTENSION *); + +int i2d_X509(X509 *, unsigned char **); + +int X509_REQ_set_version(X509_REQ *, long); +X509_REQ *X509_REQ_new(void); +void X509_REQ_free(X509_REQ *); +int X509_REQ_set_pubkey(X509_REQ *, EVP_PKEY *); +int X509_REQ_set_subject_name(X509_REQ *, X509_NAME *); +int X509_REQ_sign(X509_REQ *, EVP_PKEY *, const EVP_MD *); +int X509_REQ_verify(X509_REQ *, EVP_PKEY *); +EVP_PKEY *X509_REQ_get_pubkey(X509_REQ *); +int X509_REQ_print_ex(BIO *, X509_REQ *, unsigned long, unsigned long); +int X509_REQ_add_extensions(X509_REQ *, X509_EXTENSIONS *); +X509_EXTENSIONS *X509_REQ_get_extensions(X509_REQ *); + +int X509V3_EXT_print(BIO *, X509_EXTENSION *, unsigned long, int); +ASN1_OCTET_STRING *X509_EXTENSION_get_data(X509_EXTENSION *); + +X509_REVOKED *X509_REVOKED_new(void); +void X509_REVOKED_free(X509_REVOKED *); + +int X509_REVOKED_set_serialNumber(X509_REVOKED *, ASN1_INTEGER *); + +int X509_REVOKED_add_ext(X509_REVOKED *, X509_EXTENSION*, int); +int X509_REVOKED_add1_ext_i2d(X509_REVOKED *, int, void *, int, unsigned long); +X509_EXTENSION *X509_REVOKED_delete_ext(X509_REVOKED *, int); + +int X509_REVOKED_set_revocationDate(X509_REVOKED *, ASN1_TIME *); + +X509_CRL *X509_CRL_new(void); +X509_CRL *X509_CRL_dup(X509_CRL *); +X509_CRL *d2i_X509_CRL_bio(BIO *, X509_CRL **); +int X509_CRL_add0_revoked(X509_CRL *, X509_REVOKED *); +int X509_CRL_add_ext(X509_CRL *, X509_EXTENSION *, int); +int X509_CRL_cmp(const X509_CRL *, const X509_CRL *); +int X509_CRL_print(BIO *, X509_CRL *); +int X509_CRL_set_issuer_name(X509_CRL *, X509_NAME *); +int X509_CRL_set_version(X509_CRL *, long); +int X509_CRL_sign(X509_CRL *, EVP_PKEY *, const EVP_MD *); +int X509_CRL_sort(X509_CRL *); +int X509_CRL_verify(X509_CRL *, EVP_PKEY *); +int i2d_X509_CRL_bio(BIO *, X509_CRL *); +void X509_CRL_free(X509_CRL *); + +int NETSCAPE_SPKI_verify(NETSCAPE_SPKI *, EVP_PKEY *); +int NETSCAPE_SPKI_sign(NETSCAPE_SPKI *, EVP_PKEY *, const EVP_MD *); +char *NETSCAPE_SPKI_b64_encode(NETSCAPE_SPKI *); +NETSCAPE_SPKI *NETSCAPE_SPKI_b64_decode(const char *, int); +EVP_PKEY *NETSCAPE_SPKI_get_pubkey(NETSCAPE_SPKI *); +int NETSCAPE_SPKI_set_pubkey(NETSCAPE_SPKI *, EVP_PKEY *); +NETSCAPE_SPKI *NETSCAPE_SPKI_new(void); +void NETSCAPE_SPKI_free(NETSCAPE_SPKI *); + +/* ASN1 serialization */ +int i2d_X509_bio(BIO *, X509 *); +X509 *d2i_X509_bio(BIO *, X509 **); + +int i2d_X509_REQ_bio(BIO *, X509_REQ *); +X509_REQ *d2i_X509_REQ_bio(BIO *, X509_REQ **); + +int i2d_PrivateKey_bio(BIO *, EVP_PKEY *); +EVP_PKEY *d2i_PrivateKey_bio(BIO *, EVP_PKEY **); +int i2d_PUBKEY_bio(BIO *, EVP_PKEY *); +EVP_PKEY *d2i_PUBKEY_bio(BIO *, EVP_PKEY **); + +ASN1_INTEGER *X509_get_serialNumber(X509 *); +int X509_set_serialNumber(X509 *, ASN1_INTEGER *); + +const char *X509_verify_cert_error_string(long); + +const char *X509_get_default_cert_dir(void); +const char *X509_get_default_cert_file(void); +const char *X509_get_default_cert_dir_env(void); +const char *X509_get_default_cert_file_env(void); + +int i2d_RSAPrivateKey_bio(BIO *, RSA *); +RSA *d2i_RSAPublicKey_bio(BIO *, RSA **); +int i2d_RSAPublicKey_bio(BIO *, RSA *); +int i2d_DSAPrivateKey_bio(BIO *, DSA *); + +/* These became const X509 in 1.1.0 */ +int X509_get_ext_count(X509 *); +X509_EXTENSION *X509_get_ext(X509 *, int); +int X509_get_ext_by_NID(X509 *, int, int); +X509_NAME *X509_get_subject_name(X509 *); +X509_NAME *X509_get_issuer_name(X509 *); + +/* This became const ASN1_OBJECT * in 1.1.0 */ +X509_EXTENSION *X509_EXTENSION_create_by_OBJ(X509_EXTENSION **, + ASN1_OBJECT *, int, + ASN1_OCTET_STRING *); + + +/* This became const X509_EXTENSION * in 1.1.0 */ +int X509_EXTENSION_get_critical(X509_EXTENSION *); + +/* This became const X509_REVOKED * in 1.1.0 */ +int X509_REVOKED_get_ext_count(X509_REVOKED *); +X509_EXTENSION *X509_REVOKED_get_ext(X509_REVOKED *, int); + +/* This became const X509_CRL * in 1.1.0 */ +X509_EXTENSION *X509_CRL_get_ext(X509_CRL *, int); +int X509_CRL_get_ext_count(X509_CRL *); + +int X509_CRL_get0_by_serial(X509_CRL *, X509_REVOKED **, ASN1_INTEGER *); + +X509_REVOKED *Cryptography_X509_REVOKED_dup(X509_REVOKED *); + +/* new in 1.0.2 */ +int i2d_re_X509_tbs(X509 *, unsigned char **); +int X509_get_signature_nid(const X509 *); + +const X509_ALGOR *X509_get0_tbs_sigalg(const X509 *); + +void X509_get0_signature(const ASN1_BIT_STRING **, + const X509_ALGOR **, const X509 *); + +long X509_get_version(X509 *); + +ASN1_TIME *X509_get_notBefore(X509 *); +ASN1_TIME *X509_get_notAfter(X509 *); + +long X509_REQ_get_version(X509_REQ *); +X509_NAME *X509_REQ_get_subject_name(X509_REQ *); + +Cryptography_STACK_OF_X509 *sk_X509_new_null(void); +void sk_X509_free(Cryptography_STACK_OF_X509 *); +int sk_X509_num(Cryptography_STACK_OF_X509 *); +int sk_X509_push(Cryptography_STACK_OF_X509 *, X509 *); +X509 *sk_X509_value(Cryptography_STACK_OF_X509 *, int); + +X509_EXTENSIONS *sk_X509_EXTENSION_new_null(void); +int sk_X509_EXTENSION_num(X509_EXTENSIONS *); +X509_EXTENSION *sk_X509_EXTENSION_value(X509_EXTENSIONS *, int); +int sk_X509_EXTENSION_push(X509_EXTENSIONS *, X509_EXTENSION *); +int sk_X509_EXTENSION_insert(X509_EXTENSIONS *, X509_EXTENSION *, int); +X509_EXTENSION *sk_X509_EXTENSION_delete(X509_EXTENSIONS *, int); +void sk_X509_EXTENSION_free(X509_EXTENSIONS *); +void sk_X509_EXTENSION_pop_free(X509_EXTENSIONS *, sk_X509_EXTENSION_freefunc); + +int sk_X509_REVOKED_num(Cryptography_STACK_OF_X509_REVOKED *); +X509_REVOKED *sk_X509_REVOKED_value(Cryptography_STACK_OF_X509_REVOKED *, int); + +Cryptography_STACK_OF_X509_CRL *sk_X509_CRL_new_null(void); +void sk_X509_CRL_free(Cryptography_STACK_OF_X509_CRL *); +int sk_X509_CRL_num(Cryptography_STACK_OF_X509_CRL *); +int sk_X509_CRL_push(Cryptography_STACK_OF_X509_CRL *, X509_CRL *); +X509_CRL *sk_X509_CRL_value(Cryptography_STACK_OF_X509_CRL *, int); + +long X509_CRL_get_version(X509_CRL *); +ASN1_TIME *X509_CRL_get_lastUpdate(X509_CRL *); +ASN1_TIME *X509_CRL_get_nextUpdate(X509_CRL *); +X509_NAME *X509_CRL_get_issuer(X509_CRL *); +Cryptography_STACK_OF_X509_REVOKED *X509_CRL_get_REVOKED(X509_CRL *); + +/* These aren't macros these arguments are all const X on openssl > 1.0.x */ +int X509_CRL_set_lastUpdate(X509_CRL *, ASN1_TIME *); +int X509_CRL_set_nextUpdate(X509_CRL *, ASN1_TIME *); +int X509_set_notBefore(X509 *, ASN1_TIME *); +int X509_set_notAfter(X509 *, ASN1_TIME *); + +EC_KEY *d2i_EC_PUBKEY_bio(BIO *, EC_KEY **); +int i2d_EC_PUBKEY_bio(BIO *, EC_KEY *); +EC_KEY *d2i_ECPrivateKey_bio(BIO *, EC_KEY **); +int i2d_ECPrivateKey_bio(BIO *, EC_KEY *); + +// declared in safestack +int sk_ASN1_OBJECT_num(Cryptography_STACK_OF_ASN1_OBJECT *); +ASN1_OBJECT *sk_ASN1_OBJECT_value(Cryptography_STACK_OF_ASN1_OBJECT *, int); +void sk_ASN1_OBJECT_free(Cryptography_STACK_OF_ASN1_OBJECT *); +Cryptography_STACK_OF_ASN1_OBJECT *sk_ASN1_OBJECT_new_null(void); +int sk_ASN1_OBJECT_push(Cryptography_STACK_OF_ASN1_OBJECT *, ASN1_OBJECT *); + +/* these functions were added in 1.1.0 */ +const ASN1_INTEGER *X509_REVOKED_get0_serialNumber(const X509_REVOKED *); +const ASN1_TIME *X509_REVOKED_get0_revocationDate(const X509_REVOKED *); +void X509_CRL_get0_signature(const X509_CRL *, const ASN1_BIT_STRING **, + const X509_ALGOR **); +int i2d_re_X509_REQ_tbs(X509_REQ *, unsigned char **); +int i2d_re_X509_CRL_tbs(X509_CRL *, unsigned char **); +void X509_REQ_get0_signature(const X509_REQ *, const ASN1_BIT_STRING **, + const X509_ALGOR **); +""" + +CUSTOMIZATIONS = """ +/* Added in 1.0.2 beta but we need it in all versions now due to the great + opaquing. */ +#if CRYPTOGRAPHY_OPENSSL_LESS_THAN_102 && !CRYPTOGRAPHY_LIBRESSL_27_OR_GREATER +/* from x509/x_x509.c version 1.0.2 */ +void X509_get0_signature(const ASN1_BIT_STRING **psig, + const X509_ALGOR **palg, const X509 *x) +{ + if (psig) + *psig = x->signature; + if (palg) + *palg = x->sig_alg; +} + +int X509_get_signature_nid(const X509 *x) +{ + return OBJ_obj2nid(x->sig_alg->algorithm); +} + +#endif + +/* Added in 1.0.2 but we need it in all versions now due to the great + opaquing. */ +#if CRYPTOGRAPHY_OPENSSL_LESS_THAN_102 +/* from x509/x_x509.c */ +int i2d_re_X509_tbs(X509 *x, unsigned char **pp) +{ + /* in 1.0.2+ this function also sets x->cert_info->enc.modified = 1 + but older OpenSSLs don't have the enc ASN1_ENCODING member in the + X509 struct. Setting modified to 1 marks the encoding + (x->cert_info->enc.enc) as invalid, but since the entire struct isn't + present we don't care. */ + return i2d_X509_CINF(x->cert_info, pp); +} +#endif + +/* X509_REVOKED_dup only exists on 1.0.2+. It is implemented using + IMPLEMENT_ASN1_DUP_FUNCTION. The below is the equivalent so we have + it available on all OpenSSLs. */ +X509_REVOKED *Cryptography_X509_REVOKED_dup(X509_REVOKED *rev) { +#if CRYPTOGRAPHY_OPENSSL_LESS_THAN_102 + return ASN1_item_dup(ASN1_ITEM_rptr(X509_REVOKED), rev); +#else + return X509_REVOKED_dup(rev); +#endif +} + +/* Added in 1.1.0 but we need it in all versions now due to the great + opaquing. */ +#if CRYPTOGRAPHY_OPENSSL_LESS_THAN_110 +int i2d_re_X509_REQ_tbs(X509_REQ *req, unsigned char **pp) +{ + req->req_info->enc.modified = 1; + return i2d_X509_REQ_INFO(req->req_info, pp); +} +int i2d_re_X509_CRL_tbs(X509_CRL *crl, unsigned char **pp) { + crl->crl->enc.modified = 1; + return i2d_X509_CRL_INFO(crl->crl, pp); +} + +#if !CRYPTOGRAPHY_LIBRESSL_27_OR_GREATER +int X509_up_ref(X509 *x) { + return CRYPTO_add(&x->references, 1, CRYPTO_LOCK_X509); +} + +const X509_ALGOR *X509_get0_tbs_sigalg(const X509 *x) +{ + return x->cert_info->signature; +} + +/* from x509/x509_req.c */ +void X509_REQ_get0_signature(const X509_REQ *req, const ASN1_BIT_STRING **psig, + const X509_ALGOR **palg) +{ + if (psig != NULL) + *psig = req->signature; + if (palg != NULL) + *palg = req->sig_alg; +} +void X509_CRL_get0_signature(const X509_CRL *crl, const ASN1_BIT_STRING **psig, + const X509_ALGOR **palg) +{ + if (psig != NULL) + *psig = crl->signature; + if (palg != NULL) + *palg = crl->sig_alg; +} +const ASN1_TIME *X509_REVOKED_get0_revocationDate(const X509_REVOKED *x) +{ + return x->revocationDate; +} +const ASN1_INTEGER *X509_REVOKED_get0_serialNumber(const X509_REVOKED *x) +{ + return x->serialNumber; +} +#endif +#endif +""" diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/x509v3.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/x509v3.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/x509v3.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/x509v3.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,321 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +INCLUDES = """ +#include + +/* + * This is part of a work-around for the difficulty cffi has in dealing with + * `LHASH_OF(foo)` as the name of a type. We invent a new, simpler name that + * will be an alias for this type and use the alias throughout. This works + * together with another opaque typedef for the same name in the TYPES section. + * Note that the result is an opaque type. + */ +typedef LHASH_OF(CONF_VALUE) Cryptography_LHASH_OF_CONF_VALUE; + +typedef STACK_OF(ACCESS_DESCRIPTION) Cryptography_STACK_OF_ACCESS_DESCRIPTION; +typedef STACK_OF(DIST_POINT) Cryptography_STACK_OF_DIST_POINT; +typedef STACK_OF(POLICYQUALINFO) Cryptography_STACK_OF_POLICYQUALINFO; +typedef STACK_OF(POLICYINFO) Cryptography_STACK_OF_POLICYINFO; +typedef STACK_OF(ASN1_INTEGER) Cryptography_STACK_OF_ASN1_INTEGER; +typedef STACK_OF(GENERAL_SUBTREE) Cryptography_STACK_OF_GENERAL_SUBTREE; +""" + +TYPES = """ +typedef ... Cryptography_STACK_OF_ACCESS_DESCRIPTION; +typedef ... Cryptography_STACK_OF_POLICYQUALINFO; +typedef ... Cryptography_STACK_OF_POLICYINFO; +typedef ... Cryptography_STACK_OF_ASN1_INTEGER; +typedef ... Cryptography_STACK_OF_GENERAL_SUBTREE; +typedef ... EXTENDED_KEY_USAGE; +typedef ... CONF; + +typedef struct { + X509 *issuer_cert; + X509 *subject_cert; + ...; +} X509V3_CTX; + +typedef void * (*X509V3_EXT_D2I)(void *, const unsigned char **, long); + +typedef struct { + ASN1_ITEM_EXP *it; + X509V3_EXT_D2I d2i; + ...; +} X509V3_EXT_METHOD; + +static const int GEN_OTHERNAME; +static const int GEN_EMAIL; +static const int GEN_X400; +static const int GEN_DNS; +static const int GEN_URI; +static const int GEN_DIRNAME; +static const int GEN_EDIPARTY; +static const int GEN_IPADD; +static const int GEN_RID; + +typedef struct { + ASN1_OBJECT *type_id; + ASN1_TYPE *value; +} OTHERNAME; + +typedef struct { + ...; +} EDIPARTYNAME; + +typedef struct { + int ca; + ASN1_INTEGER *pathlen; +} BASIC_CONSTRAINTS; + +typedef struct { + Cryptography_STACK_OF_GENERAL_SUBTREE *permittedSubtrees; + Cryptography_STACK_OF_GENERAL_SUBTREE *excludedSubtrees; +} NAME_CONSTRAINTS; + +typedef struct { + ASN1_INTEGER *requireExplicitPolicy; + ASN1_INTEGER *inhibitPolicyMapping; +} POLICY_CONSTRAINTS; + + +typedef struct { + int type; + union { + char *ptr; + OTHERNAME *otherName; /* otherName */ + ASN1_IA5STRING *rfc822Name; + ASN1_IA5STRING *dNSName; + ASN1_TYPE *x400Address; + X509_NAME *directoryName; + EDIPARTYNAME *ediPartyName; + ASN1_IA5STRING *uniformResourceIdentifier; + ASN1_OCTET_STRING *iPAddress; + ASN1_OBJECT *registeredID; + + /* Old names */ + ASN1_OCTET_STRING *ip; /* iPAddress */ + X509_NAME *dirn; /* dirn */ + ASN1_IA5STRING *ia5; /* rfc822Name, dNSName, */ + /* uniformResourceIdentifier */ + ASN1_OBJECT *rid; /* registeredID */ + ASN1_TYPE *other; /* x400Address */ + } d; + ...; +} GENERAL_NAME; + +typedef struct { + GENERAL_NAME *base; + ASN1_INTEGER *minimum; + ASN1_INTEGER *maximum; +} GENERAL_SUBTREE; + +typedef struct stack_st_GENERAL_NAME GENERAL_NAMES; + +typedef struct { + ASN1_OCTET_STRING *keyid; + GENERAL_NAMES *issuer; + ASN1_INTEGER *serial; +} AUTHORITY_KEYID; + +typedef struct { + ASN1_OBJECT *method; + GENERAL_NAME *location; +} ACCESS_DESCRIPTION; + +typedef ... Cryptography_LHASH_OF_CONF_VALUE; + + +typedef ... Cryptography_STACK_OF_DIST_POINT; + +typedef struct { + int type; + union { + GENERAL_NAMES *fullname; + Cryptography_STACK_OF_X509_NAME_ENTRY *relativename; + } name; + ...; +} DIST_POINT_NAME; + +typedef struct { + DIST_POINT_NAME *distpoint; + ASN1_BIT_STRING *reasons; + GENERAL_NAMES *CRLissuer; + ...; +} DIST_POINT; + +typedef struct { + DIST_POINT_NAME *distpoint; + int onlyuser; + int onlyCA; + ASN1_BIT_STRING *onlysomereasons; + int indirectCRL; + int onlyattr; +} ISSUING_DIST_POINT; + +typedef struct { + ASN1_STRING *organization; + Cryptography_STACK_OF_ASN1_INTEGER *noticenos; +} NOTICEREF; + +typedef struct { + NOTICEREF *noticeref; + ASN1_STRING *exptext; +} USERNOTICE; + +typedef struct { + ASN1_OBJECT *pqualid; + union { + ASN1_IA5STRING *cpsuri; + USERNOTICE *usernotice; + ASN1_TYPE *other; + } d; +} POLICYQUALINFO; + +typedef struct { + ASN1_OBJECT *policyid; + Cryptography_STACK_OF_POLICYQUALINFO *qualifiers; +} POLICYINFO; + +typedef void (*sk_GENERAL_NAME_freefunc)(GENERAL_NAME *); +typedef void (*sk_DIST_POINT_freefunc)(DIST_POINT *); +typedef void (*sk_POLICYINFO_freefunc)(POLICYINFO *); +typedef void (*sk_ACCESS_DESCRIPTION_freefunc)(ACCESS_DESCRIPTION *); +""" + + +FUNCTIONS = """ +int X509V3_EXT_add_alias(int, int); +void X509V3_set_ctx(X509V3_CTX *, X509 *, X509 *, X509_REQ *, X509_CRL *, int); +int GENERAL_NAME_print(BIO *, GENERAL_NAME *); +GENERAL_NAMES *GENERAL_NAMES_new(void); +void GENERAL_NAMES_free(GENERAL_NAMES *); +void *X509V3_EXT_d2i(X509_EXTENSION *); +int X509_check_ca(X509 *); +/* X509 became a const arg in 1.1.0 */ +void *X509_get_ext_d2i(X509 *, int, int *, int *); +/* The last two char * args became const char * in 1.1.0 */ +X509_EXTENSION *X509V3_EXT_nconf(CONF *, X509V3_CTX *, char *, char *); +/* This is a macro defined by a call to DECLARE_ASN1_FUNCTIONS in the + x509v3.h header. */ +BASIC_CONSTRAINTS *BASIC_CONSTRAINTS_new(void); +void BASIC_CONSTRAINTS_free(BASIC_CONSTRAINTS *); +/* This is a macro defined by a call to DECLARE_ASN1_FUNCTIONS in the + x509v3.h header. */ +AUTHORITY_KEYID *AUTHORITY_KEYID_new(void); +void AUTHORITY_KEYID_free(AUTHORITY_KEYID *); + +NAME_CONSTRAINTS *NAME_CONSTRAINTS_new(void); +void NAME_CONSTRAINTS_free(NAME_CONSTRAINTS *); + +OTHERNAME *OTHERNAME_new(void); +void OTHERNAME_free(OTHERNAME *); + +POLICY_CONSTRAINTS *POLICY_CONSTRAINTS_new(void); +void POLICY_CONSTRAINTS_free(POLICY_CONSTRAINTS *); + +void *X509V3_set_ctx_nodb(X509V3_CTX *); + +int i2d_GENERAL_NAMES(GENERAL_NAMES *, unsigned char **); +GENERAL_NAMES *d2i_GENERAL_NAMES(GENERAL_NAMES **, const unsigned char **, + long); + +int sk_GENERAL_NAME_num(struct stack_st_GENERAL_NAME *); +int sk_GENERAL_NAME_push(struct stack_st_GENERAL_NAME *, GENERAL_NAME *); +GENERAL_NAME *sk_GENERAL_NAME_value(struct stack_st_GENERAL_NAME *, int); +void sk_GENERAL_NAME_pop_free(struct stack_st_GENERAL_NAME *, + sk_GENERAL_NAME_freefunc); + +Cryptography_STACK_OF_ACCESS_DESCRIPTION *sk_ACCESS_DESCRIPTION_new_null(void); +int sk_ACCESS_DESCRIPTION_num(Cryptography_STACK_OF_ACCESS_DESCRIPTION *); +ACCESS_DESCRIPTION *sk_ACCESS_DESCRIPTION_value( + Cryptography_STACK_OF_ACCESS_DESCRIPTION *, int +); +void sk_ACCESS_DESCRIPTION_free(Cryptography_STACK_OF_ACCESS_DESCRIPTION *); +void sk_ACCESS_DESCRIPTION_pop_free(Cryptography_STACK_OF_ACCESS_DESCRIPTION *, + sk_ACCESS_DESCRIPTION_freefunc); +int sk_ACCESS_DESCRIPTION_push(Cryptography_STACK_OF_ACCESS_DESCRIPTION *, + ACCESS_DESCRIPTION *); + +ACCESS_DESCRIPTION *ACCESS_DESCRIPTION_new(void); +void ACCESS_DESCRIPTION_free(ACCESS_DESCRIPTION *); + +X509_EXTENSION *X509V3_EXT_conf_nid(Cryptography_LHASH_OF_CONF_VALUE *, + X509V3_CTX *, int, char *); + +const X509V3_EXT_METHOD *X509V3_EXT_get(X509_EXTENSION *); +Cryptography_STACK_OF_DIST_POINT *sk_DIST_POINT_new_null(void); +void sk_DIST_POINT_free(Cryptography_STACK_OF_DIST_POINT *); +int sk_DIST_POINT_num(Cryptography_STACK_OF_DIST_POINT *); +DIST_POINT *sk_DIST_POINT_value(Cryptography_STACK_OF_DIST_POINT *, int); +int sk_DIST_POINT_push(Cryptography_STACK_OF_DIST_POINT *, DIST_POINT *); +void sk_DIST_POINT_pop_free(Cryptography_STACK_OF_DIST_POINT *, + sk_DIST_POINT_freefunc); +void CRL_DIST_POINTS_free(Cryptography_STACK_OF_DIST_POINT *); + +void sk_POLICYINFO_free(Cryptography_STACK_OF_POLICYINFO *); +int sk_POLICYINFO_num(Cryptography_STACK_OF_POLICYINFO *); +POLICYINFO *sk_POLICYINFO_value(Cryptography_STACK_OF_POLICYINFO *, int); +int sk_POLICYINFO_push(Cryptography_STACK_OF_POLICYINFO *, POLICYINFO *); +Cryptography_STACK_OF_POLICYINFO *sk_POLICYINFO_new_null(void); +void sk_POLICYINFO_pop_free(Cryptography_STACK_OF_POLICYINFO *, + sk_POLICYINFO_freefunc); +void CERTIFICATEPOLICIES_free(Cryptography_STACK_OF_POLICYINFO *); + +POLICYINFO *POLICYINFO_new(void); +void POLICYINFO_free(POLICYINFO *); + +POLICYQUALINFO *POLICYQUALINFO_new(void); +void POLICYQUALINFO_free(POLICYQUALINFO *); + +NOTICEREF *NOTICEREF_new(void); +void NOTICEREF_free(NOTICEREF *); + +USERNOTICE *USERNOTICE_new(void); +void USERNOTICE_free(USERNOTICE *); + +void sk_POLICYQUALINFO_free(Cryptography_STACK_OF_POLICYQUALINFO *); +int sk_POLICYQUALINFO_num(Cryptography_STACK_OF_POLICYQUALINFO *); +POLICYQUALINFO *sk_POLICYQUALINFO_value(Cryptography_STACK_OF_POLICYQUALINFO *, + int); +int sk_POLICYQUALINFO_push(Cryptography_STACK_OF_POLICYQUALINFO *, + POLICYQUALINFO *); +Cryptography_STACK_OF_POLICYQUALINFO *sk_POLICYQUALINFO_new_null(void); + +Cryptography_STACK_OF_GENERAL_SUBTREE *sk_GENERAL_SUBTREE_new_null(void); +void sk_GENERAL_SUBTREE_free(Cryptography_STACK_OF_GENERAL_SUBTREE *); +int sk_GENERAL_SUBTREE_num(Cryptography_STACK_OF_GENERAL_SUBTREE *); +GENERAL_SUBTREE *sk_GENERAL_SUBTREE_value( + Cryptography_STACK_OF_GENERAL_SUBTREE *, int +); +int sk_GENERAL_SUBTREE_push(Cryptography_STACK_OF_GENERAL_SUBTREE *, + GENERAL_SUBTREE *); + +GENERAL_SUBTREE *GENERAL_SUBTREE_new(void); + +void sk_ASN1_INTEGER_free(Cryptography_STACK_OF_ASN1_INTEGER *); +int sk_ASN1_INTEGER_num(Cryptography_STACK_OF_ASN1_INTEGER *); +ASN1_INTEGER *sk_ASN1_INTEGER_value(Cryptography_STACK_OF_ASN1_INTEGER *, int); +int sk_ASN1_INTEGER_push(Cryptography_STACK_OF_ASN1_INTEGER *, ASN1_INTEGER *); +Cryptography_STACK_OF_ASN1_INTEGER *sk_ASN1_INTEGER_new_null(void); + +X509_EXTENSION *X509V3_EXT_i2d(int, int, void *); + +DIST_POINT *DIST_POINT_new(void); +void DIST_POINT_free(DIST_POINT *); + +DIST_POINT_NAME *DIST_POINT_NAME_new(void); +void DIST_POINT_NAME_free(DIST_POINT_NAME *); + +GENERAL_NAME *GENERAL_NAME_new(void); +void GENERAL_NAME_free(GENERAL_NAME *); + +ISSUING_DIST_POINT *ISSUING_DIST_POINT_new(void); +void ISSUING_DIST_POINT_free(ISSUING_DIST_POINT *); +""" + +CUSTOMIZATIONS = """ +""" diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/x509_vfy.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/x509_vfy.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/x509_vfy.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/openssl/x509_vfy.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,341 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +INCLUDES = """ +#include + +/* + * This is part of a work-around for the difficulty cffi has in dealing with + * `STACK_OF(foo)` as the name of a type. We invent a new, simpler name that + * will be an alias for this type and use the alias throughout. This works + * together with another opaque typedef for the same name in the TYPES section. + * Note that the result is an opaque type. + */ +typedef STACK_OF(ASN1_OBJECT) Cryptography_STACK_OF_ASN1_OBJECT; +typedef STACK_OF(X509_OBJECT) Cryptography_STACK_OF_X509_OBJECT; +""" + +TYPES = """ +static const long Cryptography_HAS_102_VERIFICATION_ERROR_CODES; +static const long Cryptography_HAS_102_VERIFICATION_PARAMS; +static const long Cryptography_HAS_110_VERIFICATION_PARAMS; +static const long Cryptography_HAS_X509_V_FLAG_TRUSTED_FIRST; +static const long Cryptography_HAS_X509_V_FLAG_PARTIAL_CHAIN; +static const long Cryptography_HAS_X509_STORE_CTX_GET_ISSUER; + +typedef ... Cryptography_STACK_OF_ASN1_OBJECT; +typedef ... Cryptography_STACK_OF_X509_OBJECT; + +typedef ... X509_OBJECT; +typedef ... X509_STORE; +typedef ... X509_VERIFY_PARAM; +typedef ... X509_STORE_CTX; + +typedef int (*X509_STORE_CTX_get_issuer_fn)(X509 **, X509_STORE_CTX *, X509 *); + +/* While these are defined in the source as ints, they're tagged here + as longs, just in case they ever grow to large, such as what we saw + with OP_ALL. */ + +/* Verification error codes */ +static const int X509_V_OK; +static const int X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT; +static const int X509_V_ERR_UNABLE_TO_GET_CRL; +static const int X509_V_ERR_UNABLE_TO_DECRYPT_CERT_SIGNATURE; +static const int X509_V_ERR_UNABLE_TO_DECRYPT_CRL_SIGNATURE; +static const int X509_V_ERR_UNABLE_TO_DECODE_ISSUER_PUBLIC_KEY; +static const int X509_V_ERR_CERT_SIGNATURE_FAILURE; +static const int X509_V_ERR_CRL_SIGNATURE_FAILURE; +static const int X509_V_ERR_CERT_NOT_YET_VALID; +static const int X509_V_ERR_CERT_HAS_EXPIRED; +static const int X509_V_ERR_CRL_NOT_YET_VALID; +static const int X509_V_ERR_CRL_HAS_EXPIRED; +static const int X509_V_ERR_ERROR_IN_CERT_NOT_BEFORE_FIELD; +static const int X509_V_ERR_ERROR_IN_CERT_NOT_AFTER_FIELD; +static const int X509_V_ERR_ERROR_IN_CRL_LAST_UPDATE_FIELD; +static const int X509_V_ERR_ERROR_IN_CRL_NEXT_UPDATE_FIELD; +static const int X509_V_ERR_OUT_OF_MEM; +static const int X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT; +static const int X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN; +static const int X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY; +static const int X509_V_ERR_UNABLE_TO_VERIFY_LEAF_SIGNATURE; +static const int X509_V_ERR_CERT_CHAIN_TOO_LONG; +static const int X509_V_ERR_CERT_REVOKED; +static const int X509_V_ERR_INVALID_CA; +static const int X509_V_ERR_PATH_LENGTH_EXCEEDED; +static const int X509_V_ERR_INVALID_PURPOSE; +static const int X509_V_ERR_CERT_UNTRUSTED; +static const int X509_V_ERR_CERT_REJECTED; +static const int X509_V_ERR_SUBJECT_ISSUER_MISMATCH; +static const int X509_V_ERR_AKID_SKID_MISMATCH; +static const int X509_V_ERR_AKID_ISSUER_SERIAL_MISMATCH; +static const int X509_V_ERR_KEYUSAGE_NO_CERTSIGN; +static const int X509_V_ERR_UNABLE_TO_GET_CRL_ISSUER; +static const int X509_V_ERR_UNHANDLED_CRITICAL_EXTENSION; +static const int X509_V_ERR_KEYUSAGE_NO_CRL_SIGN; +static const int X509_V_ERR_UNHANDLED_CRITICAL_CRL_EXTENSION; +static const int X509_V_ERR_INVALID_NON_CA; +static const int X509_V_ERR_PROXY_PATH_LENGTH_EXCEEDED; +static const int X509_V_ERR_KEYUSAGE_NO_DIGITAL_SIGNATURE; +static const int X509_V_ERR_PROXY_CERTIFICATES_NOT_ALLOWED; +static const int X509_V_ERR_INVALID_EXTENSION; +static const int X509_V_ERR_INVALID_POLICY_EXTENSION; +static const int X509_V_ERR_NO_EXPLICIT_POLICY; +static const int X509_V_ERR_DIFFERENT_CRL_SCOPE; +static const int X509_V_ERR_UNSUPPORTED_EXTENSION_FEATURE; +static const int X509_V_ERR_UNNESTED_RESOURCE; +static const int X509_V_ERR_PERMITTED_VIOLATION; +static const int X509_V_ERR_EXCLUDED_VIOLATION; +static const int X509_V_ERR_SUBTREE_MINMAX; +static const int X509_V_ERR_UNSUPPORTED_CONSTRAINT_TYPE; +static const int X509_V_ERR_UNSUPPORTED_CONSTRAINT_SYNTAX; +static const int X509_V_ERR_UNSUPPORTED_NAME_SYNTAX; +static const int X509_V_ERR_CRL_PATH_VALIDATION_ERROR; +static const int X509_V_ERR_SUITE_B_INVALID_VERSION; +static const int X509_V_ERR_SUITE_B_INVALID_ALGORITHM; +static const int X509_V_ERR_SUITE_B_INVALID_CURVE; +static const int X509_V_ERR_SUITE_B_INVALID_SIGNATURE_ALGORITHM; +static const int X509_V_ERR_SUITE_B_LOS_NOT_ALLOWED; +static const int X509_V_ERR_SUITE_B_CANNOT_SIGN_P_384_WITH_P_256; +static const int X509_V_ERR_HOSTNAME_MISMATCH; +static const int X509_V_ERR_EMAIL_MISMATCH; +static const int X509_V_ERR_IP_ADDRESS_MISMATCH; +static const int X509_V_ERR_APPLICATION_VERIFICATION; + +/* Verification parameters */ +static const long X509_V_FLAG_CB_ISSUER_CHECK; +static const long X509_V_FLAG_USE_CHECK_TIME; +static const long X509_V_FLAG_CRL_CHECK; +static const long X509_V_FLAG_CRL_CHECK_ALL; +static const long X509_V_FLAG_IGNORE_CRITICAL; +static const long X509_V_FLAG_X509_STRICT; +static const long X509_V_FLAG_ALLOW_PROXY_CERTS; +static const long X509_V_FLAG_POLICY_CHECK; +static const long X509_V_FLAG_EXPLICIT_POLICY; +static const long X509_V_FLAG_INHIBIT_ANY; +static const long X509_V_FLAG_INHIBIT_MAP; +static const long X509_V_FLAG_NOTIFY_POLICY; +static const long X509_V_FLAG_EXTENDED_CRL_SUPPORT; +static const long X509_V_FLAG_USE_DELTAS; +static const long X509_V_FLAG_CHECK_SS_SIGNATURE; +static const long X509_V_FLAG_TRUSTED_FIRST; +static const long X509_V_FLAG_SUITEB_128_LOS_ONLY; +static const long X509_V_FLAG_SUITEB_192_LOS; +static const long X509_V_FLAG_SUITEB_128_LOS; +static const long X509_V_FLAG_PARTIAL_CHAIN; + +static const long X509_LU_X509; +static const long X509_LU_CRL; + +static const long X509_CHECK_FLAG_ALWAYS_CHECK_SUBJECT; +static const long X509_CHECK_FLAG_NO_WILDCARDS; +static const long X509_CHECK_FLAG_NO_PARTIAL_WILDCARDS; +static const long X509_CHECK_FLAG_MULTI_LABEL_WILDCARDS; +static const long X509_CHECK_FLAG_SINGLE_LABEL_SUBDOMAINS; +static const long X509_CHECK_FLAG_NEVER_CHECK_SUBJECT; +""" + +FUNCTIONS = """ +int X509_verify_cert(X509_STORE_CTX *); + +/* X509_STORE */ +X509_STORE *X509_STORE_new(void); +int X509_STORE_add_cert(X509_STORE *, X509 *); +int X509_STORE_add_crl(X509_STORE *, X509_CRL *); +int X509_STORE_load_locations(X509_STORE *, const char *, const char *); +int X509_STORE_set1_param(X509_STORE *, X509_VERIFY_PARAM *); +int X509_STORE_set_default_paths(X509_STORE *); +int X509_STORE_set_flags(X509_STORE *, unsigned long); +void X509_STORE_free(X509_STORE *); + +/* X509_STORE_CTX */ +X509_STORE_CTX *X509_STORE_CTX_new(void); +void X509_STORE_CTX_cleanup(X509_STORE_CTX *); +void X509_STORE_CTX_free(X509_STORE_CTX *); +int X509_STORE_CTX_init(X509_STORE_CTX *, X509_STORE *, X509 *, + Cryptography_STACK_OF_X509 *); +void X509_STORE_CTX_trusted_stack(X509_STORE_CTX *, + Cryptography_STACK_OF_X509 *); +void X509_STORE_CTX_set_cert(X509_STORE_CTX *, X509 *); +void X509_STORE_CTX_set_chain(X509_STORE_CTX *,Cryptography_STACK_OF_X509 *); +X509_VERIFY_PARAM *X509_STORE_CTX_get0_param(X509_STORE_CTX *); +void X509_STORE_CTX_set0_param(X509_STORE_CTX *, X509_VERIFY_PARAM *); +int X509_STORE_CTX_set_default(X509_STORE_CTX *, const char *); +void X509_STORE_CTX_set_verify_cb(X509_STORE_CTX *, + int (*)(int, X509_STORE_CTX *)); +Cryptography_STACK_OF_X509 *X509_STORE_CTX_get_chain(X509_STORE_CTX *); +Cryptography_STACK_OF_X509 *X509_STORE_CTX_get1_chain(X509_STORE_CTX *); +int X509_STORE_CTX_get_error(X509_STORE_CTX *); +void X509_STORE_CTX_set_error(X509_STORE_CTX *, int); +int X509_STORE_CTX_get_error_depth(X509_STORE_CTX *); +X509 *X509_STORE_CTX_get_current_cert(X509_STORE_CTX *); +int X509_STORE_CTX_set_ex_data(X509_STORE_CTX *, int, void *); +void *X509_STORE_CTX_get_ex_data(X509_STORE_CTX *, int); +int X509_STORE_CTX_get1_issuer(X509 **, X509_STORE_CTX *, X509 *); + +/* X509_VERIFY_PARAM */ +X509_VERIFY_PARAM *X509_VERIFY_PARAM_new(void); +int X509_VERIFY_PARAM_set_flags(X509_VERIFY_PARAM *, unsigned long); +int X509_VERIFY_PARAM_clear_flags(X509_VERIFY_PARAM *, unsigned long); +unsigned long X509_VERIFY_PARAM_get_flags(X509_VERIFY_PARAM *); +int X509_VERIFY_PARAM_set_purpose(X509_VERIFY_PARAM *, int); +int X509_VERIFY_PARAM_set_trust(X509_VERIFY_PARAM *, int); +void X509_VERIFY_PARAM_set_time(X509_VERIFY_PARAM *, time_t); +int X509_VERIFY_PARAM_add0_policy(X509_VERIFY_PARAM *, ASN1_OBJECT *); +int X509_VERIFY_PARAM_set1_policies(X509_VERIFY_PARAM *, + Cryptography_STACK_OF_ASN1_OBJECT *); +void X509_VERIFY_PARAM_set_depth(X509_VERIFY_PARAM *, int); +int X509_VERIFY_PARAM_get_depth(const X509_VERIFY_PARAM *); +void X509_VERIFY_PARAM_free(X509_VERIFY_PARAM *); +/* this CRYPTO_EX_DATA function became a macro in 1.1.0 */ +int X509_STORE_CTX_get_ex_new_index(long, void *, CRYPTO_EX_new *, + CRYPTO_EX_dup *, CRYPTO_EX_free *); + +/* X509_STORE_CTX */ +void X509_STORE_CTX_set0_crls(X509_STORE_CTX *, + Cryptography_STACK_OF_X509_CRL *); + +/* X509_VERIFY_PARAM */ +int X509_VERIFY_PARAM_set1_host(X509_VERIFY_PARAM *, const char *, + size_t); +void X509_VERIFY_PARAM_set_hostflags(X509_VERIFY_PARAM *, unsigned int); +int X509_VERIFY_PARAM_set1_email(X509_VERIFY_PARAM *, const char *, + size_t); +int X509_VERIFY_PARAM_set1_ip(X509_VERIFY_PARAM *, const unsigned char *, + size_t); +int X509_VERIFY_PARAM_set1_ip_asc(X509_VERIFY_PARAM *, const char *); + +int sk_X509_OBJECT_num(Cryptography_STACK_OF_X509_OBJECT *); +X509_OBJECT *sk_X509_OBJECT_value(Cryptography_STACK_OF_X509_OBJECT *, int); +X509_VERIFY_PARAM *X509_STORE_get0_param(X509_STORE *); +Cryptography_STACK_OF_X509_OBJECT *X509_STORE_get0_objects(X509_STORE *); +X509 *X509_OBJECT_get0_X509(X509_OBJECT *); +int X509_OBJECT_get_type(const X509_OBJECT *); + +/* added in 1.1.0 */ +X509 *X509_STORE_CTX_get0_cert(X509_STORE_CTX *); +X509_STORE_CTX_get_issuer_fn X509_STORE_get_get_issuer(X509_STORE *); +void X509_STORE_set_get_issuer(X509_STORE *, X509_STORE_CTX_get_issuer_fn); +""" + +CUSTOMIZATIONS = """ +/* OpenSSL 1.0.2+ verification parameters and error codes */ +#if CRYPTOGRAPHY_OPENSSL_102_OR_GREATER +static const long Cryptography_HAS_102_VERIFICATION_ERROR_CODES = 1; +static const long Cryptography_HAS_102_VERIFICATION_PARAMS = 1; +#else +static const long Cryptography_HAS_102_VERIFICATION_ERROR_CODES = 0; +static const long Cryptography_HAS_102_VERIFICATION_PARAMS = 0; + +static const long X509_V_ERR_SUITE_B_INVALID_VERSION = 0; +static const long X509_V_ERR_SUITE_B_INVALID_ALGORITHM = 0; +static const long X509_V_ERR_SUITE_B_INVALID_CURVE = 0; +static const long X509_V_ERR_SUITE_B_INVALID_SIGNATURE_ALGORITHM = 0; +static const long X509_V_ERR_SUITE_B_LOS_NOT_ALLOWED = 0; +static const long X509_V_ERR_SUITE_B_CANNOT_SIGN_P_384_WITH_P_256 = 0; +/* These 3 defines are unavailable in LibreSSL 2.5.x, but may be added + in the future... */ +#ifndef X509_V_ERR_HOSTNAME_MISMATCH +static const long X509_V_ERR_HOSTNAME_MISMATCH = 0; +#endif +#ifndef X509_V_ERR_EMAIL_MISMATCH +static const long X509_V_ERR_EMAIL_MISMATCH = 0; +#endif +#ifndef X509_V_ERR_IP_ADDRESS_MISMATCH +static const long X509_V_ERR_IP_ADDRESS_MISMATCH = 0; +#endif +#ifndef X509_CHECK_FLAG_ALWAYS_CHECK_SUBJECT +static const long X509_CHECK_FLAG_ALWAYS_CHECK_SUBJECT = 0; +#endif +#ifndef X509_CHECK_FLAG_NO_WILDCARDS +static const long X509_CHECK_FLAG_NO_WILDCARDS = 0; +#endif +#ifndef X509_CHECK_FLAG_NO_PARTIAL_WILDCARDS +static const long X509_CHECK_FLAG_NO_PARTIAL_WILDCARDS = 0; +#endif +#ifndef X509_CHECK_FLAG_MULTI_LABEL_WILDCARDS +static const long X509_CHECK_FLAG_MULTI_LABEL_WILDCARDS = 0; +#endif +#ifndef X509_CHECK_FLAG_SINGLE_LABEL_SUBDOMAINS +static const long X509_CHECK_FLAG_SINGLE_LABEL_SUBDOMAINS = 0; +#endif + +/* X509_V_FLAG_TRUSTED_FIRST is also new in 1.0.2+, but it is added separately + below because it shows up in some earlier 3rd party OpenSSL packages. */ +static const long X509_V_FLAG_SUITEB_128_LOS_ONLY = 0; +static const long X509_V_FLAG_SUITEB_192_LOS = 0; +static const long X509_V_FLAG_SUITEB_128_LOS = 0; + +#if !CRYPTOGRAPHY_LIBRESSL_27_OR_GREATER +int (*X509_VERIFY_PARAM_set1_host)(X509_VERIFY_PARAM *, const char *, + size_t) = NULL; +int (*X509_VERIFY_PARAM_set1_email)(X509_VERIFY_PARAM *, const char *, + size_t) = NULL; +int (*X509_VERIFY_PARAM_set1_ip)(X509_VERIFY_PARAM *, const unsigned char *, + size_t) = NULL; +int (*X509_VERIFY_PARAM_set1_ip_asc)(X509_VERIFY_PARAM *, const char *) = NULL; +void (*X509_VERIFY_PARAM_set_hostflags)(X509_VERIFY_PARAM *, + unsigned int) = NULL; +#endif +#endif + +#if CRYPTOGRAPHY_OPENSSL_LESS_THAN_110 || CRYPTOGRAPHY_IS_LIBRESSL +static const long Cryptography_HAS_110_VERIFICATION_PARAMS = 0; +#ifndef X509_CHECK_FLAG_NEVER_CHECK_SUBJECT +static const long X509_CHECK_FLAG_NEVER_CHECK_SUBJECT = 0; +#endif +#else +static const long Cryptography_HAS_110_VERIFICATION_PARAMS = 1; +#endif + +/* OpenSSL 1.0.2+ or Solaris's backport */ +#ifdef X509_V_FLAG_PARTIAL_CHAIN +static const long Cryptography_HAS_X509_V_FLAG_PARTIAL_CHAIN = 1; +#else +static const long Cryptography_HAS_X509_V_FLAG_PARTIAL_CHAIN = 0; +static const long X509_V_FLAG_PARTIAL_CHAIN = 0; +#endif + +/* OpenSSL 1.0.2+, *or* Fedora 20's flavor of OpenSSL 1.0.1e... */ +#ifdef X509_V_FLAG_TRUSTED_FIRST +static const long Cryptography_HAS_X509_V_FLAG_TRUSTED_FIRST = 1; +#else +static const long Cryptography_HAS_X509_V_FLAG_TRUSTED_FIRST = 0; +static const long X509_V_FLAG_TRUSTED_FIRST = 0; +#endif + +#if CRYPTOGRAPHY_OPENSSL_LESS_THAN_110 && !CRYPTOGRAPHY_LIBRESSL_27_OR_GREATER +Cryptography_STACK_OF_X509_OBJECT *X509_STORE_get0_objects(X509_STORE *ctx) { + return ctx->objs; +} +X509_VERIFY_PARAM *X509_STORE_get0_param(X509_STORE *store) { + return store->param; +} +int X509_OBJECT_get_type(const X509_OBJECT *x) { + return x->type; +} + +/* from x509/x509_vfy.c */ +X509 *X509_STORE_CTX_get0_cert(X509_STORE_CTX *ctx) +{ + return ctx->cert; +} + +X509 *X509_OBJECT_get0_X509(X509_OBJECT *x) { + return x->data.x509; +} +#endif + +#if CRYPTOGRAPHY_OPENSSL_LESS_THAN_110 +static const long Cryptography_HAS_X509_STORE_CTX_GET_ISSUER = 0; +typedef void *X509_STORE_CTX_get_issuer_fn; +X509_STORE_CTX_get_issuer_fn (*X509_STORE_get_get_issuer)(X509_STORE *) = NULL; +void (*X509_STORE_set_get_issuer)(X509_STORE *, + X509_STORE_CTX_get_issuer_fn) = NULL; +#else +static const long Cryptography_HAS_X509_STORE_CTX_GET_ISSUER = 1; +#endif +""" diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/utils.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/utils.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/utils.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/_cffi_src/utils.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,101 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +import os +import sys +from distutils.ccompiler import new_compiler +from distutils.dist import Distribution + +from cffi import FFI + + +# Load the cryptography __about__ to get the current package version +base_src = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) +about = {} +with open(os.path.join(base_src, "cryptography", "__about__.py")) as f: + exec(f.read(), about) + + +def build_ffi_for_binding(module_name, module_prefix, modules, libraries=[], + extra_compile_args=[], extra_link_args=[]): + """ + Modules listed in ``modules`` should have the following attributes: + + * ``INCLUDES``: A string containing C includes. + * ``TYPES``: A string containing C declarations for types. + * ``FUNCTIONS``: A string containing C declarations for functions & macros. + * ``CUSTOMIZATIONS``: A string containing arbitrary top-level C code, this + can be used to do things like test for a define and provide an + alternate implementation based on that. + """ + types = [] + includes = [] + functions = [] + customizations = [] + for name in modules: + __import__(module_prefix + name) + module = sys.modules[module_prefix + name] + + types.append(module.TYPES) + functions.append(module.FUNCTIONS) + includes.append(module.INCLUDES) + customizations.append(module.CUSTOMIZATIONS) + + verify_source = "\n".join( + includes + + customizations + ) + ffi = build_ffi( + module_name, + cdef_source="\n".join(types + functions), + verify_source=verify_source, + libraries=libraries, + extra_compile_args=extra_compile_args, + extra_link_args=extra_link_args, + ) + + return ffi + + +def build_ffi(module_name, cdef_source, verify_source, libraries=[], + extra_compile_args=[], extra_link_args=[]): + ffi = FFI() + # Always add the CRYPTOGRAPHY_PACKAGE_VERSION to the shared object + cdef_source += "\nstatic const char *const CRYPTOGRAPHY_PACKAGE_VERSION;" + verify_source += '\n#define CRYPTOGRAPHY_PACKAGE_VERSION "{}"'.format( + about["__version__"] + ) + ffi.cdef(cdef_source) + ffi.set_source( + module_name, + verify_source, + libraries=libraries, + extra_compile_args=extra_compile_args, + extra_link_args=extra_link_args, + ) + return ffi + + +def extra_link_args(compiler_type): + if compiler_type == 'msvc': + # Enable NX and ASLR for Windows builds on MSVC. These are enabled by + # default on Python 3.3+ but not on 2.x. + return ['/NXCOMPAT', '/DYNAMICBASE'] + else: + return [] + + +def compiler_type(): + """ + Gets the compiler type from distutils. On Windows with MSVC it will be + "msvc". On macOS and linux it is "unix". + """ + dist = Distribution() + dist.parse_config_files() + cmd = dist.get_command_obj('build') + cmd.ensure_finalized() + compiler = new_compiler(compiler=cmd.compiler) + return compiler.compiler_type diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/__about__.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/__about__.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/__about__.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/__about__.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,23 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +__all__ = [ + "__title__", "__summary__", "__uri__", "__version__", "__author__", + "__email__", "__license__", "__copyright__", +] + +__title__ = "cryptography" +__summary__ = ("cryptography is a package which provides cryptographic recipes" + " and primitives to Python developers.") +__uri__ = "https://github.com/pyca/cryptography" + +__version__ = "2.7" + +__author__ = "The cryptography developers" +__email__ = "cryptography-dev@python.org" + +__license__ = "BSD or Apache License, Version 2.0" +__copyright__ = "Copyright 2013-2017 {}".format(__author__) diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/exceptions.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/exceptions.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/exceptions.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/exceptions.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,58 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +from enum import Enum + + +class _Reasons(Enum): + BACKEND_MISSING_INTERFACE = 0 + UNSUPPORTED_HASH = 1 + UNSUPPORTED_CIPHER = 2 + UNSUPPORTED_PADDING = 3 + UNSUPPORTED_MGF = 4 + UNSUPPORTED_PUBLIC_KEY_ALGORITHM = 5 + UNSUPPORTED_ELLIPTIC_CURVE = 6 + UNSUPPORTED_SERIALIZATION = 7 + UNSUPPORTED_X509 = 8 + UNSUPPORTED_EXCHANGE_ALGORITHM = 9 + UNSUPPORTED_DIFFIE_HELLMAN = 10 + UNSUPPORTED_MAC = 11 + + +class UnsupportedAlgorithm(Exception): + def __init__(self, message, reason=None): + super(UnsupportedAlgorithm, self).__init__(message) + self._reason = reason + + +class AlreadyFinalized(Exception): + pass + + +class AlreadyUpdated(Exception): + pass + + +class NotYetFinalized(Exception): + pass + + +class InvalidTag(Exception): + pass + + +class InvalidSignature(Exception): + pass + + +class InternalError(Exception): + def __init__(self, msg, err_code): + super(InternalError, self).__init__(msg) + self.err_code = err_code + + +class InvalidKey(Exception): + pass diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/fernet.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/fernet.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/fernet.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/fernet.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,171 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +import base64 +import binascii +import os +import struct +import time + +import six + +from cryptography import utils +from cryptography.exceptions import InvalidSignature +from cryptography.hazmat.backends import default_backend +from cryptography.hazmat.primitives import hashes, padding +from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes +from cryptography.hazmat.primitives.hmac import HMAC + + +class InvalidToken(Exception): + pass + + +_MAX_CLOCK_SKEW = 60 + + +class Fernet(object): + def __init__(self, key, backend=None): + if backend is None: + backend = default_backend() + + key = base64.urlsafe_b64decode(key) + if len(key) != 32: + raise ValueError( + "Fernet key must be 32 url-safe base64-encoded bytes." + ) + + self._signing_key = key[:16] + self._encryption_key = key[16:] + self._backend = backend + + @classmethod + def generate_key(cls): + return base64.urlsafe_b64encode(os.urandom(32)) + + def encrypt(self, data): + current_time = int(time.time()) + iv = os.urandom(16) + return self._encrypt_from_parts(data, current_time, iv) + + def _encrypt_from_parts(self, data, current_time, iv): + utils._check_bytes("data", data) + + padder = padding.PKCS7(algorithms.AES.block_size).padder() + padded_data = padder.update(data) + padder.finalize() + encryptor = Cipher( + algorithms.AES(self._encryption_key), modes.CBC(iv), self._backend + ).encryptor() + ciphertext = encryptor.update(padded_data) + encryptor.finalize() + + basic_parts = ( + b"\x80" + struct.pack(">Q", current_time) + iv + ciphertext + ) + + h = HMAC(self._signing_key, hashes.SHA256(), backend=self._backend) + h.update(basic_parts) + hmac = h.finalize() + return base64.urlsafe_b64encode(basic_parts + hmac) + + def decrypt(self, token, ttl=None): + timestamp, data = Fernet._get_unverified_token_data(token) + return self._decrypt_data(data, timestamp, ttl) + + def extract_timestamp(self, token): + timestamp, data = Fernet._get_unverified_token_data(token) + # Verify the token was not tampered with. + self._verify_signature(data) + return timestamp + + @staticmethod + def _get_unverified_token_data(token): + utils._check_bytes("token", token) + try: + data = base64.urlsafe_b64decode(token) + except (TypeError, binascii.Error): + raise InvalidToken + + if not data or six.indexbytes(data, 0) != 0x80: + raise InvalidToken + + try: + timestamp, = struct.unpack(">Q", data[1:9]) + except struct.error: + raise InvalidToken + return timestamp, data + + def _verify_signature(self, data): + h = HMAC(self._signing_key, hashes.SHA256(), backend=self._backend) + h.update(data[:-32]) + try: + h.verify(data[-32:]) + except InvalidSignature: + raise InvalidToken + + def _decrypt_data(self, data, timestamp, ttl): + current_time = int(time.time()) + if ttl is not None: + if timestamp + ttl < current_time: + raise InvalidToken + + if current_time + _MAX_CLOCK_SKEW < timestamp: + raise InvalidToken + + self._verify_signature(data) + + iv = data[9:25] + ciphertext = data[25:-32] + decryptor = Cipher( + algorithms.AES(self._encryption_key), modes.CBC(iv), self._backend + ).decryptor() + plaintext_padded = decryptor.update(ciphertext) + try: + plaintext_padded += decryptor.finalize() + except ValueError: + raise InvalidToken + unpadder = padding.PKCS7(algorithms.AES.block_size).unpadder() + + unpadded = unpadder.update(plaintext_padded) + try: + unpadded += unpadder.finalize() + except ValueError: + raise InvalidToken + return unpadded + + +class MultiFernet(object): + def __init__(self, fernets): + fernets = list(fernets) + if not fernets: + raise ValueError( + "MultiFernet requires at least one Fernet instance" + ) + self._fernets = fernets + + def encrypt(self, msg): + return self._fernets[0].encrypt(msg) + + def rotate(self, msg): + timestamp, data = Fernet._get_unverified_token_data(msg) + for f in self._fernets: + try: + p = f._decrypt_data(data, timestamp, None) + break + except InvalidToken: + pass + else: + raise InvalidToken + + iv = os.urandom(16) + return self._fernets[0]._encrypt_from_parts(p, timestamp, iv) + + def decrypt(self, msg, ttl=None): + for f in self._fernets: + try: + return f.decrypt(msg, ttl) + except InvalidToken: + pass + raise InvalidToken diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/backends/__init__.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/backends/__init__.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/backends/__init__.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/backends/__init__.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,18 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + + +_default_backend = None + + +def default_backend(): + global _default_backend + + if _default_backend is None: + from cryptography.hazmat.backends.openssl.backend import backend + _default_backend = backend + + return _default_backend diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/backends/interfaces.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/backends/interfaces.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/backends/interfaces.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/backends/interfaces.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,395 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +import abc + +import six + + +@six.add_metaclass(abc.ABCMeta) +class CipherBackend(object): + @abc.abstractmethod + def cipher_supported(self, cipher, mode): + """ + Return True if the given cipher and mode are supported. + """ + + @abc.abstractmethod + def create_symmetric_encryption_ctx(self, cipher, mode): + """ + Get a CipherContext that can be used for encryption. + """ + + @abc.abstractmethod + def create_symmetric_decryption_ctx(self, cipher, mode): + """ + Get a CipherContext that can be used for decryption. + """ + + +@six.add_metaclass(abc.ABCMeta) +class HashBackend(object): + @abc.abstractmethod + def hash_supported(self, algorithm): + """ + Return True if the hash algorithm is supported by this backend. + """ + + @abc.abstractmethod + def create_hash_ctx(self, algorithm): + """ + Create a HashContext for calculating a message digest. + """ + + +@six.add_metaclass(abc.ABCMeta) +class HMACBackend(object): + @abc.abstractmethod + def hmac_supported(self, algorithm): + """ + Return True if the hash algorithm is supported for HMAC by this + backend. + """ + + @abc.abstractmethod + def create_hmac_ctx(self, key, algorithm): + """ + Create a context for calculating a message authentication code. + """ + + +@six.add_metaclass(abc.ABCMeta) +class CMACBackend(object): + @abc.abstractmethod + def cmac_algorithm_supported(self, algorithm): + """ + Returns True if the block cipher is supported for CMAC by this backend + """ + + @abc.abstractmethod + def create_cmac_ctx(self, algorithm): + """ + Create a context for calculating a message authentication code. + """ + + +@six.add_metaclass(abc.ABCMeta) +class PBKDF2HMACBackend(object): + @abc.abstractmethod + def pbkdf2_hmac_supported(self, algorithm): + """ + Return True if the hash algorithm is supported for PBKDF2 by this + backend. + """ + + @abc.abstractmethod + def derive_pbkdf2_hmac(self, algorithm, length, salt, iterations, + key_material): + """ + Return length bytes derived from provided PBKDF2 parameters. + """ + + +@six.add_metaclass(abc.ABCMeta) +class RSABackend(object): + @abc.abstractmethod + def generate_rsa_private_key(self, public_exponent, key_size): + """ + Generate an RSAPrivateKey instance with public_exponent and a modulus + of key_size bits. + """ + + @abc.abstractmethod + def rsa_padding_supported(self, padding): + """ + Returns True if the backend supports the given padding options. + """ + + @abc.abstractmethod + def generate_rsa_parameters_supported(self, public_exponent, key_size): + """ + Returns True if the backend supports the given parameters for key + generation. + """ + + @abc.abstractmethod + def load_rsa_private_numbers(self, numbers): + """ + Returns an RSAPrivateKey provider. + """ + + @abc.abstractmethod + def load_rsa_public_numbers(self, numbers): + """ + Returns an RSAPublicKey provider. + """ + + +@six.add_metaclass(abc.ABCMeta) +class DSABackend(object): + @abc.abstractmethod + def generate_dsa_parameters(self, key_size): + """ + Generate a DSAParameters instance with a modulus of key_size bits. + """ + + @abc.abstractmethod + def generate_dsa_private_key(self, parameters): + """ + Generate a DSAPrivateKey instance with parameters as a DSAParameters + object. + """ + + @abc.abstractmethod + def generate_dsa_private_key_and_parameters(self, key_size): + """ + Generate a DSAPrivateKey instance using key size only. + """ + + @abc.abstractmethod + def dsa_hash_supported(self, algorithm): + """ + Return True if the hash algorithm is supported by the backend for DSA. + """ + + @abc.abstractmethod + def dsa_parameters_supported(self, p, q, g): + """ + Return True if the parameters are supported by the backend for DSA. + """ + + @abc.abstractmethod + def load_dsa_private_numbers(self, numbers): + """ + Returns a DSAPrivateKey provider. + """ + + @abc.abstractmethod + def load_dsa_public_numbers(self, numbers): + """ + Returns a DSAPublicKey provider. + """ + + @abc.abstractmethod + def load_dsa_parameter_numbers(self, numbers): + """ + Returns a DSAParameters provider. + """ + + +@six.add_metaclass(abc.ABCMeta) +class EllipticCurveBackend(object): + @abc.abstractmethod + def elliptic_curve_signature_algorithm_supported( + self, signature_algorithm, curve + ): + """ + Returns True if the backend supports the named elliptic curve with the + specified signature algorithm. + """ + + @abc.abstractmethod + def elliptic_curve_supported(self, curve): + """ + Returns True if the backend supports the named elliptic curve. + """ + + @abc.abstractmethod + def generate_elliptic_curve_private_key(self, curve): + """ + Return an object conforming to the EllipticCurvePrivateKey interface. + """ + + @abc.abstractmethod + def load_elliptic_curve_public_numbers(self, numbers): + """ + Return an EllipticCurvePublicKey provider using the given numbers. + """ + + @abc.abstractmethod + def load_elliptic_curve_private_numbers(self, numbers): + """ + Return an EllipticCurvePrivateKey provider using the given numbers. + """ + + @abc.abstractmethod + def elliptic_curve_exchange_algorithm_supported(self, algorithm, curve): + """ + Returns whether the exchange algorithm is supported by this backend. + """ + + @abc.abstractmethod + def derive_elliptic_curve_private_key(self, private_value, curve): + """ + Compute the private key given the private value and curve. + """ + + +@six.add_metaclass(abc.ABCMeta) +class PEMSerializationBackend(object): + @abc.abstractmethod + def load_pem_private_key(self, data, password): + """ + Loads a private key from PEM encoded data, using the provided password + if the data is encrypted. + """ + + @abc.abstractmethod + def load_pem_public_key(self, data): + """ + Loads a public key from PEM encoded data. + """ + + @abc.abstractmethod + def load_pem_parameters(self, data): + """ + Load encryption parameters from PEM encoded data. + """ + + +@six.add_metaclass(abc.ABCMeta) +class DERSerializationBackend(object): + @abc.abstractmethod + def load_der_private_key(self, data, password): + """ + Loads a private key from DER encoded data. Uses the provided password + if the data is encrypted. + """ + + @abc.abstractmethod + def load_der_public_key(self, data): + """ + Loads a public key from DER encoded data. + """ + + @abc.abstractmethod + def load_der_parameters(self, data): + """ + Load encryption parameters from DER encoded data. + """ + + +@six.add_metaclass(abc.ABCMeta) +class X509Backend(object): + @abc.abstractmethod + def load_pem_x509_certificate(self, data): + """ + Load an X.509 certificate from PEM encoded data. + """ + + @abc.abstractmethod + def load_der_x509_certificate(self, data): + """ + Load an X.509 certificate from DER encoded data. + """ + + @abc.abstractmethod + def load_der_x509_csr(self, data): + """ + Load an X.509 CSR from DER encoded data. + """ + + @abc.abstractmethod + def load_pem_x509_csr(self, data): + """ + Load an X.509 CSR from PEM encoded data. + """ + + @abc.abstractmethod + def create_x509_csr(self, builder, private_key, algorithm): + """ + Create and sign an X.509 CSR from a CSR builder object. + """ + + @abc.abstractmethod + def create_x509_certificate(self, builder, private_key, algorithm): + """ + Create and sign an X.509 certificate from a CertificateBuilder object. + """ + + @abc.abstractmethod + def create_x509_crl(self, builder, private_key, algorithm): + """ + Create and sign an X.509 CertificateRevocationList from a + CertificateRevocationListBuilder object. + """ + + @abc.abstractmethod + def create_x509_revoked_certificate(self, builder): + """ + Create a RevokedCertificate object from a RevokedCertificateBuilder + object. + """ + + @abc.abstractmethod + def x509_name_bytes(self, name): + """ + Compute the DER encoded bytes of an X509 Name object. + """ + + +@six.add_metaclass(abc.ABCMeta) +class DHBackend(object): + @abc.abstractmethod + def generate_dh_parameters(self, generator, key_size): + """ + Generate a DHParameters instance with a modulus of key_size bits. + Using the given generator. Often 2 or 5. + """ + + @abc.abstractmethod + def generate_dh_private_key(self, parameters): + """ + Generate a DHPrivateKey instance with parameters as a DHParameters + object. + """ + + @abc.abstractmethod + def generate_dh_private_key_and_parameters(self, generator, key_size): + """ + Generate a DHPrivateKey instance using key size only. + Using the given generator. Often 2 or 5. + """ + + @abc.abstractmethod + def load_dh_private_numbers(self, numbers): + """ + Load a DHPrivateKey from DHPrivateNumbers + """ + + @abc.abstractmethod + def load_dh_public_numbers(self, numbers): + """ + Load a DHPublicKey from DHPublicNumbers. + """ + + @abc.abstractmethod + def load_dh_parameter_numbers(self, numbers): + """ + Load DHParameters from DHParameterNumbers. + """ + + @abc.abstractmethod + def dh_parameters_supported(self, p, g, q=None): + """ + Returns whether the backend supports DH with these parameter values. + """ + + @abc.abstractmethod + def dh_x942_serialization_supported(self): + """ + Returns True if the backend supports the serialization of DH objects + with subgroup order (q). + """ + + +@six.add_metaclass(abc.ABCMeta) +class ScryptBackend(object): + @abc.abstractmethod + def derive_scrypt(self, key_material, salt, length, n, r, p): + """ + Return bytes derived from provided Scrypt parameters. + """ diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/backends/openssl/aead.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/backends/openssl/aead.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/backends/openssl/aead.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/backends/openssl/aead.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,161 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +from cryptography.exceptions import InvalidTag + + +_ENCRYPT = 1 +_DECRYPT = 0 + + +def _aead_cipher_name(cipher): + from cryptography.hazmat.primitives.ciphers.aead import ( + AESCCM, AESGCM, ChaCha20Poly1305 + ) + if isinstance(cipher, ChaCha20Poly1305): + return b"chacha20-poly1305" + elif isinstance(cipher, AESCCM): + return "aes-{}-ccm".format(len(cipher._key) * 8).encode("ascii") + else: + assert isinstance(cipher, AESGCM) + return "aes-{}-gcm".format(len(cipher._key) * 8).encode("ascii") + + +def _aead_setup(backend, cipher_name, key, nonce, tag, tag_len, operation): + evp_cipher = backend._lib.EVP_get_cipherbyname(cipher_name) + backend.openssl_assert(evp_cipher != backend._ffi.NULL) + ctx = backend._lib.EVP_CIPHER_CTX_new() + ctx = backend._ffi.gc(ctx, backend._lib.EVP_CIPHER_CTX_free) + res = backend._lib.EVP_CipherInit_ex( + ctx, evp_cipher, + backend._ffi.NULL, + backend._ffi.NULL, + backend._ffi.NULL, + int(operation == _ENCRYPT) + ) + backend.openssl_assert(res != 0) + res = backend._lib.EVP_CIPHER_CTX_set_key_length(ctx, len(key)) + backend.openssl_assert(res != 0) + res = backend._lib.EVP_CIPHER_CTX_ctrl( + ctx, backend._lib.EVP_CTRL_AEAD_SET_IVLEN, len(nonce), + backend._ffi.NULL + ) + backend.openssl_assert(res != 0) + if operation == _DECRYPT: + res = backend._lib.EVP_CIPHER_CTX_ctrl( + ctx, backend._lib.EVP_CTRL_AEAD_SET_TAG, len(tag), tag + ) + backend.openssl_assert(res != 0) + else: + res = backend._lib.EVP_CIPHER_CTX_ctrl( + ctx, backend._lib.EVP_CTRL_AEAD_SET_TAG, tag_len, backend._ffi.NULL + ) + + nonce_ptr = backend._ffi.from_buffer(nonce) + key_ptr = backend._ffi.from_buffer(key) + res = backend._lib.EVP_CipherInit_ex( + ctx, + backend._ffi.NULL, + backend._ffi.NULL, + key_ptr, + nonce_ptr, + int(operation == _ENCRYPT) + ) + backend.openssl_assert(res != 0) + return ctx + + +def _set_length(backend, ctx, data_len): + intptr = backend._ffi.new("int *") + res = backend._lib.EVP_CipherUpdate( + ctx, + backend._ffi.NULL, + intptr, + backend._ffi.NULL, + data_len + ) + backend.openssl_assert(res != 0) + + +def _process_aad(backend, ctx, associated_data): + outlen = backend._ffi.new("int *") + res = backend._lib.EVP_CipherUpdate( + ctx, backend._ffi.NULL, outlen, associated_data, len(associated_data) + ) + backend.openssl_assert(res != 0) + + +def _process_data(backend, ctx, data): + outlen = backend._ffi.new("int *") + buf = backend._ffi.new("unsigned char[]", len(data)) + res = backend._lib.EVP_CipherUpdate(ctx, buf, outlen, data, len(data)) + backend.openssl_assert(res != 0) + return backend._ffi.buffer(buf, outlen[0])[:] + + +def _encrypt(backend, cipher, nonce, data, associated_data, tag_length): + from cryptography.hazmat.primitives.ciphers.aead import AESCCM + cipher_name = _aead_cipher_name(cipher) + ctx = _aead_setup( + backend, cipher_name, cipher._key, nonce, None, tag_length, _ENCRYPT + ) + # CCM requires us to pass the length of the data before processing anything + # However calling this with any other AEAD results in an error + if isinstance(cipher, AESCCM): + _set_length(backend, ctx, len(data)) + + _process_aad(backend, ctx, associated_data) + processed_data = _process_data(backend, ctx, data) + outlen = backend._ffi.new("int *") + res = backend._lib.EVP_CipherFinal_ex(ctx, backend._ffi.NULL, outlen) + backend.openssl_assert(res != 0) + backend.openssl_assert(outlen[0] == 0) + tag_buf = backend._ffi.new("unsigned char[]", tag_length) + res = backend._lib.EVP_CIPHER_CTX_ctrl( + ctx, backend._lib.EVP_CTRL_AEAD_GET_TAG, tag_length, tag_buf + ) + backend.openssl_assert(res != 0) + tag = backend._ffi.buffer(tag_buf)[:] + + return processed_data + tag + + +def _decrypt(backend, cipher, nonce, data, associated_data, tag_length): + from cryptography.hazmat.primitives.ciphers.aead import AESCCM + if len(data) < tag_length: + raise InvalidTag + tag = data[-tag_length:] + data = data[:-tag_length] + cipher_name = _aead_cipher_name(cipher) + ctx = _aead_setup( + backend, cipher_name, cipher._key, nonce, tag, tag_length, _DECRYPT + ) + # CCM requires us to pass the length of the data before processing anything + # However calling this with any other AEAD results in an error + if isinstance(cipher, AESCCM): + _set_length(backend, ctx, len(data)) + + _process_aad(backend, ctx, associated_data) + # CCM has a different error path if the tag doesn't match. Errors are + # raised in Update and Final is irrelevant. + if isinstance(cipher, AESCCM): + outlen = backend._ffi.new("int *") + buf = backend._ffi.new("unsigned char[]", len(data)) + res = backend._lib.EVP_CipherUpdate(ctx, buf, outlen, data, len(data)) + if res != 1: + backend._consume_errors() + raise InvalidTag + + processed_data = backend._ffi.buffer(buf, outlen[0])[:] + else: + processed_data = _process_data(backend, ctx, data) + outlen = backend._ffi.new("int *") + res = backend._lib.EVP_CipherFinal_ex(ctx, backend._ffi.NULL, outlen) + if res == 0: + backend._consume_errors() + raise InvalidTag + + return processed_data diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/backends/openssl/backend.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/backends/openssl/backend.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/backends/openssl/backend.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/backends/openssl/backend.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,2445 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +import base64 +import collections +import contextlib +import itertools +from contextlib import contextmanager + +import asn1crypto.core + +import six +from six.moves import range + +from cryptography import utils, x509 +from cryptography.exceptions import UnsupportedAlgorithm, _Reasons +from cryptography.hazmat.backends.interfaces import ( + CMACBackend, CipherBackend, DERSerializationBackend, DHBackend, DSABackend, + EllipticCurveBackend, HMACBackend, HashBackend, PBKDF2HMACBackend, + PEMSerializationBackend, RSABackend, ScryptBackend, X509Backend +) +from cryptography.hazmat.backends.openssl import aead +from cryptography.hazmat.backends.openssl.ciphers import _CipherContext +from cryptography.hazmat.backends.openssl.cmac import _CMACContext +from cryptography.hazmat.backends.openssl.decode_asn1 import ( + _CRL_ENTRY_REASON_ENUM_TO_CODE, _Integers +) +from cryptography.hazmat.backends.openssl.dh import ( + _DHParameters, _DHPrivateKey, _DHPublicKey, _dh_params_dup +) +from cryptography.hazmat.backends.openssl.dsa import ( + _DSAParameters, _DSAPrivateKey, _DSAPublicKey +) +from cryptography.hazmat.backends.openssl.ec import ( + _EllipticCurvePrivateKey, _EllipticCurvePublicKey +) +from cryptography.hazmat.backends.openssl.ed25519 import ( + _Ed25519PrivateKey, _Ed25519PublicKey +) +from cryptography.hazmat.backends.openssl.ed448 import ( + _ED448_KEY_SIZE, _Ed448PrivateKey, _Ed448PublicKey +) +from cryptography.hazmat.backends.openssl.encode_asn1 import ( + _CRL_ENTRY_EXTENSION_ENCODE_HANDLERS, + _CRL_EXTENSION_ENCODE_HANDLERS, _EXTENSION_ENCODE_HANDLERS, + _OCSP_BASICRESP_EXTENSION_ENCODE_HANDLERS, + _OCSP_REQUEST_EXTENSION_ENCODE_HANDLERS, + _encode_asn1_int_gc, _encode_asn1_str_gc, _encode_name_gc, _txt2obj_gc, +) +from cryptography.hazmat.backends.openssl.hashes import _HashContext +from cryptography.hazmat.backends.openssl.hmac import _HMACContext +from cryptography.hazmat.backends.openssl.ocsp import ( + _OCSPRequest, _OCSPResponse +) +from cryptography.hazmat.backends.openssl.poly1305 import ( + _POLY1305_KEY_SIZE, _Poly1305Context +) +from cryptography.hazmat.backends.openssl.rsa import ( + _RSAPrivateKey, _RSAPublicKey +) +from cryptography.hazmat.backends.openssl.x25519 import ( + _X25519PrivateKey, _X25519PublicKey +) +from cryptography.hazmat.backends.openssl.x448 import ( + _X448PrivateKey, _X448PublicKey +) +from cryptography.hazmat.backends.openssl.x509 import ( + _Certificate, _CertificateRevocationList, + _CertificateSigningRequest, _RevokedCertificate +) +from cryptography.hazmat.bindings.openssl import binding +from cryptography.hazmat.primitives import hashes, serialization +from cryptography.hazmat.primitives.asymmetric import dsa, ec, ed25519, rsa +from cryptography.hazmat.primitives.asymmetric.padding import ( + MGF1, OAEP, PKCS1v15, PSS +) +from cryptography.hazmat.primitives.ciphers.algorithms import ( + AES, ARC4, Blowfish, CAST5, Camellia, ChaCha20, IDEA, SEED, TripleDES +) +from cryptography.hazmat.primitives.ciphers.modes import ( + CBC, CFB, CFB8, CTR, ECB, GCM, OFB, XTS +) +from cryptography.hazmat.primitives.kdf import scrypt +from cryptography.hazmat.primitives.serialization import ssh +from cryptography.x509 import ocsp + + +_MemoryBIO = collections.namedtuple("_MemoryBIO", ["bio", "char_ptr"]) + + +@utils.register_interface(CipherBackend) +@utils.register_interface(CMACBackend) +@utils.register_interface(DERSerializationBackend) +@utils.register_interface(DHBackend) +@utils.register_interface(DSABackend) +@utils.register_interface(EllipticCurveBackend) +@utils.register_interface(HashBackend) +@utils.register_interface(HMACBackend) +@utils.register_interface(PBKDF2HMACBackend) +@utils.register_interface(RSABackend) +@utils.register_interface(PEMSerializationBackend) +@utils.register_interface(X509Backend) +@utils.register_interface_if( + binding.Binding().lib.Cryptography_HAS_SCRYPT, ScryptBackend +) +class Backend(object): + """ + OpenSSL API binding interfaces. + """ + name = "openssl" + + def __init__(self): + self._binding = binding.Binding() + self._ffi = self._binding.ffi + self._lib = self._binding.lib + + self._cipher_registry = {} + self._register_default_ciphers() + self.activate_osrandom_engine() + self._dh_types = [self._lib.EVP_PKEY_DH] + if self._lib.Cryptography_HAS_EVP_PKEY_DHX: + self._dh_types.append(self._lib.EVP_PKEY_DHX) + + def openssl_assert(self, ok): + return binding._openssl_assert(self._lib, ok) + + def activate_builtin_random(self): + if self._lib.Cryptography_HAS_ENGINE: + # Obtain a new structural reference. + e = self._lib.ENGINE_get_default_RAND() + if e != self._ffi.NULL: + self._lib.ENGINE_unregister_RAND(e) + # Reset the RNG to use the new engine. + self._lib.RAND_cleanup() + # decrement the structural reference from get_default_RAND + res = self._lib.ENGINE_finish(e) + self.openssl_assert(res == 1) + + @contextlib.contextmanager + def _get_osurandom_engine(self): + # Fetches an engine by id and returns it. This creates a structural + # reference. + e = self._lib.ENGINE_by_id(self._lib.Cryptography_osrandom_engine_id) + self.openssl_assert(e != self._ffi.NULL) + # Initialize the engine for use. This adds a functional reference. + res = self._lib.ENGINE_init(e) + self.openssl_assert(res == 1) + + try: + yield e + finally: + # Decrement the structural ref incremented by ENGINE_by_id. + res = self._lib.ENGINE_free(e) + self.openssl_assert(res == 1) + # Decrement the functional ref incremented by ENGINE_init. + res = self._lib.ENGINE_finish(e) + self.openssl_assert(res == 1) + + def activate_osrandom_engine(self): + if self._lib.Cryptography_HAS_ENGINE: + # Unregister and free the current engine. + self.activate_builtin_random() + with self._get_osurandom_engine() as e: + # Set the engine as the default RAND provider. + res = self._lib.ENGINE_set_default_RAND(e) + self.openssl_assert(res == 1) + # Reset the RNG to use the new engine. + self._lib.RAND_cleanup() + + def osrandom_engine_implementation(self): + buf = self._ffi.new("char[]", 64) + with self._get_osurandom_engine() as e: + res = self._lib.ENGINE_ctrl_cmd(e, b"get_implementation", + len(buf), buf, + self._ffi.NULL, 0) + self.openssl_assert(res > 0) + return self._ffi.string(buf).decode('ascii') + + def openssl_version_text(self): + """ + Friendly string name of the loaded OpenSSL library. This is not + necessarily the same version as it was compiled against. + + Example: OpenSSL 1.0.1e 11 Feb 2013 + """ + return self._ffi.string( + self._lib.OpenSSL_version(self._lib.OPENSSL_VERSION) + ).decode("ascii") + + def openssl_version_number(self): + return self._lib.OpenSSL_version_num() + + def create_hmac_ctx(self, key, algorithm): + return _HMACContext(self, key, algorithm) + + def _evp_md_from_algorithm(self, algorithm): + if algorithm.name == "blake2b" or algorithm.name == "blake2s": + alg = "{}{}".format( + algorithm.name, algorithm.digest_size * 8 + ).encode("ascii") + else: + alg = algorithm.name.encode("ascii") + + evp_md = self._lib.EVP_get_digestbyname(alg) + return evp_md + + def _evp_md_non_null_from_algorithm(self, algorithm): + evp_md = self._evp_md_from_algorithm(algorithm) + self.openssl_assert(evp_md != self._ffi.NULL) + return evp_md + + def hash_supported(self, algorithm): + evp_md = self._evp_md_from_algorithm(algorithm) + return evp_md != self._ffi.NULL + + def hmac_supported(self, algorithm): + return self.hash_supported(algorithm) + + def create_hash_ctx(self, algorithm): + return _HashContext(self, algorithm) + + def cipher_supported(self, cipher, mode): + try: + adapter = self._cipher_registry[type(cipher), type(mode)] + except KeyError: + return False + evp_cipher = adapter(self, cipher, mode) + return self._ffi.NULL != evp_cipher + + def register_cipher_adapter(self, cipher_cls, mode_cls, adapter): + if (cipher_cls, mode_cls) in self._cipher_registry: + raise ValueError("Duplicate registration for: {} {}.".format( + cipher_cls, mode_cls) + ) + self._cipher_registry[cipher_cls, mode_cls] = adapter + + def _register_default_ciphers(self): + for mode_cls in [CBC, CTR, ECB, OFB, CFB, CFB8, GCM]: + self.register_cipher_adapter( + AES, + mode_cls, + GetCipherByName("{cipher.name}-{cipher.key_size}-{mode.name}") + ) + for mode_cls in [CBC, CTR, ECB, OFB, CFB]: + self.register_cipher_adapter( + Camellia, + mode_cls, + GetCipherByName("{cipher.name}-{cipher.key_size}-{mode.name}") + ) + for mode_cls in [CBC, CFB, CFB8, OFB]: + self.register_cipher_adapter( + TripleDES, + mode_cls, + GetCipherByName("des-ede3-{mode.name}") + ) + self.register_cipher_adapter( + TripleDES, + ECB, + GetCipherByName("des-ede3") + ) + for mode_cls in [CBC, CFB, OFB, ECB]: + self.register_cipher_adapter( + Blowfish, + mode_cls, + GetCipherByName("bf-{mode.name}") + ) + for mode_cls in [CBC, CFB, OFB, ECB]: + self.register_cipher_adapter( + SEED, + mode_cls, + GetCipherByName("seed-{mode.name}") + ) + for cipher_cls, mode_cls in itertools.product( + [CAST5, IDEA], + [CBC, OFB, CFB, ECB], + ): + self.register_cipher_adapter( + cipher_cls, + mode_cls, + GetCipherByName("{cipher.name}-{mode.name}") + ) + self.register_cipher_adapter( + ARC4, + type(None), + GetCipherByName("rc4") + ) + self.register_cipher_adapter( + ChaCha20, + type(None), + GetCipherByName("chacha20") + ) + self.register_cipher_adapter(AES, XTS, _get_xts_cipher) + + def create_symmetric_encryption_ctx(self, cipher, mode): + return _CipherContext(self, cipher, mode, _CipherContext._ENCRYPT) + + def create_symmetric_decryption_ctx(self, cipher, mode): + return _CipherContext(self, cipher, mode, _CipherContext._DECRYPT) + + def pbkdf2_hmac_supported(self, algorithm): + return self.hmac_supported(algorithm) + + def derive_pbkdf2_hmac(self, algorithm, length, salt, iterations, + key_material): + buf = self._ffi.new("unsigned char[]", length) + evp_md = self._evp_md_non_null_from_algorithm(algorithm) + key_material_ptr = self._ffi.from_buffer(key_material) + res = self._lib.PKCS5_PBKDF2_HMAC( + key_material_ptr, + len(key_material), + salt, + len(salt), + iterations, + evp_md, + length, + buf + ) + self.openssl_assert(res == 1) + return self._ffi.buffer(buf)[:] + + def _consume_errors(self): + return binding._consume_errors(self._lib) + + def _bn_to_int(self, bn): + assert bn != self._ffi.NULL + + if not six.PY2: + # Python 3 has constant time from_bytes, so use that. + bn_num_bytes = self._lib.BN_num_bytes(bn) + bin_ptr = self._ffi.new("unsigned char[]", bn_num_bytes) + bin_len = self._lib.BN_bn2bin(bn, bin_ptr) + # A zero length means the BN has value 0 + self.openssl_assert(bin_len >= 0) + val = int.from_bytes(self._ffi.buffer(bin_ptr)[:bin_len], "big") + if self._lib.BN_is_negative(bn): + val = -val + return val + else: + # Under Python 2 the best we can do is hex() + hex_cdata = self._lib.BN_bn2hex(bn) + self.openssl_assert(hex_cdata != self._ffi.NULL) + hex_str = self._ffi.string(hex_cdata) + self._lib.OPENSSL_free(hex_cdata) + return int(hex_str, 16) + + def _int_to_bn(self, num, bn=None): + """ + Converts a python integer to a BIGNUM. The returned BIGNUM will not + be garbage collected (to support adding them to structs that take + ownership of the object). Be sure to register it for GC if it will + be discarded after use. + """ + assert bn is None or bn != self._ffi.NULL + + if bn is None: + bn = self._ffi.NULL + + if not six.PY2: + # Python 3 has constant time to_bytes, so use that. + + binary = num.to_bytes(int(num.bit_length() / 8.0 + 1), "big") + bn_ptr = self._lib.BN_bin2bn(binary, len(binary), bn) + self.openssl_assert(bn_ptr != self._ffi.NULL) + return bn_ptr + + else: + # Under Python 2 the best we can do is hex(), [2:] removes the 0x + # prefix. + hex_num = hex(num).rstrip("L")[2:].encode("ascii") + bn_ptr = self._ffi.new("BIGNUM **") + bn_ptr[0] = bn + res = self._lib.BN_hex2bn(bn_ptr, hex_num) + self.openssl_assert(res != 0) + self.openssl_assert(bn_ptr[0] != self._ffi.NULL) + return bn_ptr[0] + + def generate_rsa_private_key(self, public_exponent, key_size): + rsa._verify_rsa_parameters(public_exponent, key_size) + + rsa_cdata = self._lib.RSA_new() + self.openssl_assert(rsa_cdata != self._ffi.NULL) + rsa_cdata = self._ffi.gc(rsa_cdata, self._lib.RSA_free) + + bn = self._int_to_bn(public_exponent) + bn = self._ffi.gc(bn, self._lib.BN_free) + + res = self._lib.RSA_generate_key_ex( + rsa_cdata, key_size, bn, self._ffi.NULL + ) + self.openssl_assert(res == 1) + evp_pkey = self._rsa_cdata_to_evp_pkey(rsa_cdata) + + return _RSAPrivateKey(self, rsa_cdata, evp_pkey) + + def generate_rsa_parameters_supported(self, public_exponent, key_size): + return (public_exponent >= 3 and public_exponent & 1 != 0 and + key_size >= 512) + + def load_rsa_private_numbers(self, numbers): + rsa._check_private_key_components( + numbers.p, + numbers.q, + numbers.d, + numbers.dmp1, + numbers.dmq1, + numbers.iqmp, + numbers.public_numbers.e, + numbers.public_numbers.n + ) + rsa_cdata = self._lib.RSA_new() + self.openssl_assert(rsa_cdata != self._ffi.NULL) + rsa_cdata = self._ffi.gc(rsa_cdata, self._lib.RSA_free) + p = self._int_to_bn(numbers.p) + q = self._int_to_bn(numbers.q) + d = self._int_to_bn(numbers.d) + dmp1 = self._int_to_bn(numbers.dmp1) + dmq1 = self._int_to_bn(numbers.dmq1) + iqmp = self._int_to_bn(numbers.iqmp) + e = self._int_to_bn(numbers.public_numbers.e) + n = self._int_to_bn(numbers.public_numbers.n) + res = self._lib.RSA_set0_factors(rsa_cdata, p, q) + self.openssl_assert(res == 1) + res = self._lib.RSA_set0_key(rsa_cdata, n, e, d) + self.openssl_assert(res == 1) + res = self._lib.RSA_set0_crt_params(rsa_cdata, dmp1, dmq1, iqmp) + self.openssl_assert(res == 1) + res = self._lib.RSA_blinding_on(rsa_cdata, self._ffi.NULL) + self.openssl_assert(res == 1) + evp_pkey = self._rsa_cdata_to_evp_pkey(rsa_cdata) + + return _RSAPrivateKey(self, rsa_cdata, evp_pkey) + + def load_rsa_public_numbers(self, numbers): + rsa._check_public_key_components(numbers.e, numbers.n) + rsa_cdata = self._lib.RSA_new() + self.openssl_assert(rsa_cdata != self._ffi.NULL) + rsa_cdata = self._ffi.gc(rsa_cdata, self._lib.RSA_free) + e = self._int_to_bn(numbers.e) + n = self._int_to_bn(numbers.n) + res = self._lib.RSA_set0_key(rsa_cdata, n, e, self._ffi.NULL) + self.openssl_assert(res == 1) + evp_pkey = self._rsa_cdata_to_evp_pkey(rsa_cdata) + + return _RSAPublicKey(self, rsa_cdata, evp_pkey) + + def _create_evp_pkey_gc(self): + evp_pkey = self._lib.EVP_PKEY_new() + self.openssl_assert(evp_pkey != self._ffi.NULL) + evp_pkey = self._ffi.gc(evp_pkey, self._lib.EVP_PKEY_free) + return evp_pkey + + def _rsa_cdata_to_evp_pkey(self, rsa_cdata): + evp_pkey = self._create_evp_pkey_gc() + res = self._lib.EVP_PKEY_set1_RSA(evp_pkey, rsa_cdata) + self.openssl_assert(res == 1) + return evp_pkey + + def _bytes_to_bio(self, data): + """ + Return a _MemoryBIO namedtuple of (BIO, char*). + + The char* is the storage for the BIO and it must stay alive until the + BIO is finished with. + """ + data_ptr = self._ffi.from_buffer(data) + bio = self._lib.BIO_new_mem_buf( + data_ptr, len(data) + ) + self.openssl_assert(bio != self._ffi.NULL) + + return _MemoryBIO(self._ffi.gc(bio, self._lib.BIO_free), data_ptr) + + def _create_mem_bio_gc(self): + """ + Creates an empty memory BIO. + """ + bio_method = self._lib.BIO_s_mem() + self.openssl_assert(bio_method != self._ffi.NULL) + bio = self._lib.BIO_new(bio_method) + self.openssl_assert(bio != self._ffi.NULL) + bio = self._ffi.gc(bio, self._lib.BIO_free) + return bio + + def _read_mem_bio(self, bio): + """ + Reads a memory BIO. This only works on memory BIOs. + """ + buf = self._ffi.new("char **") + buf_len = self._lib.BIO_get_mem_data(bio, buf) + self.openssl_assert(buf_len > 0) + self.openssl_assert(buf[0] != self._ffi.NULL) + bio_data = self._ffi.buffer(buf[0], buf_len)[:] + return bio_data + + def _evp_pkey_to_private_key(self, evp_pkey): + """ + Return the appropriate type of PrivateKey given an evp_pkey cdata + pointer. + """ + + key_type = self._lib.EVP_PKEY_id(evp_pkey) + + if key_type == self._lib.EVP_PKEY_RSA: + rsa_cdata = self._lib.EVP_PKEY_get1_RSA(evp_pkey) + self.openssl_assert(rsa_cdata != self._ffi.NULL) + rsa_cdata = self._ffi.gc(rsa_cdata, self._lib.RSA_free) + return _RSAPrivateKey(self, rsa_cdata, evp_pkey) + elif key_type == self._lib.EVP_PKEY_DSA: + dsa_cdata = self._lib.EVP_PKEY_get1_DSA(evp_pkey) + self.openssl_assert(dsa_cdata != self._ffi.NULL) + dsa_cdata = self._ffi.gc(dsa_cdata, self._lib.DSA_free) + return _DSAPrivateKey(self, dsa_cdata, evp_pkey) + elif key_type == self._lib.EVP_PKEY_EC: + ec_cdata = self._lib.EVP_PKEY_get1_EC_KEY(evp_pkey) + self.openssl_assert(ec_cdata != self._ffi.NULL) + ec_cdata = self._ffi.gc(ec_cdata, self._lib.EC_KEY_free) + return _EllipticCurvePrivateKey(self, ec_cdata, evp_pkey) + elif key_type in self._dh_types: + dh_cdata = self._lib.EVP_PKEY_get1_DH(evp_pkey) + self.openssl_assert(dh_cdata != self._ffi.NULL) + dh_cdata = self._ffi.gc(dh_cdata, self._lib.DH_free) + return _DHPrivateKey(self, dh_cdata, evp_pkey) + elif key_type == getattr(self._lib, "EVP_PKEY_ED25519", None): + # EVP_PKEY_ED25519 is not present in OpenSSL < 1.1.1 + return _Ed25519PrivateKey(self, evp_pkey) + elif key_type == getattr(self._lib, "EVP_PKEY_X448", None): + # EVP_PKEY_X448 is not present in OpenSSL < 1.1.1 + return _X448PrivateKey(self, evp_pkey) + elif key_type == getattr(self._lib, "EVP_PKEY_X25519", None): + # EVP_PKEY_X25519 is not present in OpenSSL < 1.1.0 + return _X25519PrivateKey(self, evp_pkey) + elif key_type == getattr(self._lib, "EVP_PKEY_ED448", None): + # EVP_PKEY_ED448 is not present in OpenSSL < 1.1.1 + return _Ed448PrivateKey(self, evp_pkey) + else: + raise UnsupportedAlgorithm("Unsupported key type.") + + def _evp_pkey_to_public_key(self, evp_pkey): + """ + Return the appropriate type of PublicKey given an evp_pkey cdata + pointer. + """ + + key_type = self._lib.EVP_PKEY_id(evp_pkey) + + if key_type == self._lib.EVP_PKEY_RSA: + rsa_cdata = self._lib.EVP_PKEY_get1_RSA(evp_pkey) + self.openssl_assert(rsa_cdata != self._ffi.NULL) + rsa_cdata = self._ffi.gc(rsa_cdata, self._lib.RSA_free) + return _RSAPublicKey(self, rsa_cdata, evp_pkey) + elif key_type == self._lib.EVP_PKEY_DSA: + dsa_cdata = self._lib.EVP_PKEY_get1_DSA(evp_pkey) + self.openssl_assert(dsa_cdata != self._ffi.NULL) + dsa_cdata = self._ffi.gc(dsa_cdata, self._lib.DSA_free) + return _DSAPublicKey(self, dsa_cdata, evp_pkey) + elif key_type == self._lib.EVP_PKEY_EC: + ec_cdata = self._lib.EVP_PKEY_get1_EC_KEY(evp_pkey) + self.openssl_assert(ec_cdata != self._ffi.NULL) + ec_cdata = self._ffi.gc(ec_cdata, self._lib.EC_KEY_free) + return _EllipticCurvePublicKey(self, ec_cdata, evp_pkey) + elif key_type in self._dh_types: + dh_cdata = self._lib.EVP_PKEY_get1_DH(evp_pkey) + self.openssl_assert(dh_cdata != self._ffi.NULL) + dh_cdata = self._ffi.gc(dh_cdata, self._lib.DH_free) + return _DHPublicKey(self, dh_cdata, evp_pkey) + elif key_type == getattr(self._lib, "EVP_PKEY_ED25519", None): + # EVP_PKEY_ED25519 is not present in OpenSSL < 1.1.1 + return _Ed25519PublicKey(self, evp_pkey) + elif key_type == getattr(self._lib, "EVP_PKEY_X448", None): + # EVP_PKEY_X448 is not present in OpenSSL < 1.1.1 + return _X448PublicKey(self, evp_pkey) + elif key_type == getattr(self._lib, "EVP_PKEY_X25519", None): + # EVP_PKEY_X25519 is not present in OpenSSL < 1.1.0 + return _X25519PublicKey(self, evp_pkey) + elif key_type == getattr(self._lib, "EVP_PKEY_ED448", None): + # EVP_PKEY_X25519 is not present in OpenSSL < 1.1.1 + return _Ed448PublicKey(self, evp_pkey) + else: + raise UnsupportedAlgorithm("Unsupported key type.") + + def _oaep_hash_supported(self, algorithm): + if self._lib.Cryptography_HAS_RSA_OAEP_MD: + return isinstance( + algorithm, ( + hashes.SHA1, + hashes.SHA224, + hashes.SHA256, + hashes.SHA384, + hashes.SHA512, + ) + ) + else: + return isinstance(algorithm, hashes.SHA1) + + def rsa_padding_supported(self, padding): + if isinstance(padding, PKCS1v15): + return True + elif isinstance(padding, PSS) and isinstance(padding._mgf, MGF1): + return self.hash_supported(padding._mgf._algorithm) + elif isinstance(padding, OAEP) and isinstance(padding._mgf, MGF1): + return ( + self._oaep_hash_supported(padding._mgf._algorithm) and + self._oaep_hash_supported(padding._algorithm) and + ( + (padding._label is None or len(padding._label) == 0) or + self._lib.Cryptography_HAS_RSA_OAEP_LABEL == 1 + ) + ) + else: + return False + + def generate_dsa_parameters(self, key_size): + if key_size not in (1024, 2048, 3072): + raise ValueError("Key size must be 1024 or 2048 or 3072 bits.") + + ctx = self._lib.DSA_new() + self.openssl_assert(ctx != self._ffi.NULL) + ctx = self._ffi.gc(ctx, self._lib.DSA_free) + + res = self._lib.DSA_generate_parameters_ex( + ctx, key_size, self._ffi.NULL, 0, + self._ffi.NULL, self._ffi.NULL, self._ffi.NULL + ) + + self.openssl_assert(res == 1) + + return _DSAParameters(self, ctx) + + def generate_dsa_private_key(self, parameters): + ctx = self._lib.DSAparams_dup(parameters._dsa_cdata) + self.openssl_assert(ctx != self._ffi.NULL) + ctx = self._ffi.gc(ctx, self._lib.DSA_free) + self._lib.DSA_generate_key(ctx) + evp_pkey = self._dsa_cdata_to_evp_pkey(ctx) + + return _DSAPrivateKey(self, ctx, evp_pkey) + + def generate_dsa_private_key_and_parameters(self, key_size): + parameters = self.generate_dsa_parameters(key_size) + return self.generate_dsa_private_key(parameters) + + def _dsa_cdata_set_values(self, dsa_cdata, p, q, g, pub_key, priv_key): + res = self._lib.DSA_set0_pqg(dsa_cdata, p, q, g) + self.openssl_assert(res == 1) + res = self._lib.DSA_set0_key(dsa_cdata, pub_key, priv_key) + self.openssl_assert(res == 1) + + def load_dsa_private_numbers(self, numbers): + dsa._check_dsa_private_numbers(numbers) + parameter_numbers = numbers.public_numbers.parameter_numbers + + dsa_cdata = self._lib.DSA_new() + self.openssl_assert(dsa_cdata != self._ffi.NULL) + dsa_cdata = self._ffi.gc(dsa_cdata, self._lib.DSA_free) + + p = self._int_to_bn(parameter_numbers.p) + q = self._int_to_bn(parameter_numbers.q) + g = self._int_to_bn(parameter_numbers.g) + pub_key = self._int_to_bn(numbers.public_numbers.y) + priv_key = self._int_to_bn(numbers.x) + self._dsa_cdata_set_values(dsa_cdata, p, q, g, pub_key, priv_key) + + evp_pkey = self._dsa_cdata_to_evp_pkey(dsa_cdata) + + return _DSAPrivateKey(self, dsa_cdata, evp_pkey) + + def load_dsa_public_numbers(self, numbers): + dsa._check_dsa_parameters(numbers.parameter_numbers) + dsa_cdata = self._lib.DSA_new() + self.openssl_assert(dsa_cdata != self._ffi.NULL) + dsa_cdata = self._ffi.gc(dsa_cdata, self._lib.DSA_free) + + p = self._int_to_bn(numbers.parameter_numbers.p) + q = self._int_to_bn(numbers.parameter_numbers.q) + g = self._int_to_bn(numbers.parameter_numbers.g) + pub_key = self._int_to_bn(numbers.y) + priv_key = self._ffi.NULL + self._dsa_cdata_set_values(dsa_cdata, p, q, g, pub_key, priv_key) + + evp_pkey = self._dsa_cdata_to_evp_pkey(dsa_cdata) + + return _DSAPublicKey(self, dsa_cdata, evp_pkey) + + def load_dsa_parameter_numbers(self, numbers): + dsa._check_dsa_parameters(numbers) + dsa_cdata = self._lib.DSA_new() + self.openssl_assert(dsa_cdata != self._ffi.NULL) + dsa_cdata = self._ffi.gc(dsa_cdata, self._lib.DSA_free) + + p = self._int_to_bn(numbers.p) + q = self._int_to_bn(numbers.q) + g = self._int_to_bn(numbers.g) + res = self._lib.DSA_set0_pqg(dsa_cdata, p, q, g) + self.openssl_assert(res == 1) + + return _DSAParameters(self, dsa_cdata) + + def _dsa_cdata_to_evp_pkey(self, dsa_cdata): + evp_pkey = self._create_evp_pkey_gc() + res = self._lib.EVP_PKEY_set1_DSA(evp_pkey, dsa_cdata) + self.openssl_assert(res == 1) + return evp_pkey + + def dsa_hash_supported(self, algorithm): + return self.hash_supported(algorithm) + + def dsa_parameters_supported(self, p, q, g): + return True + + def cmac_algorithm_supported(self, algorithm): + return self.cipher_supported( + algorithm, CBC(b"\x00" * algorithm.block_size) + ) + + def create_cmac_ctx(self, algorithm): + return _CMACContext(self, algorithm) + + def create_x509_csr(self, builder, private_key, algorithm): + if not isinstance(algorithm, hashes.HashAlgorithm): + raise TypeError('Algorithm must be a registered hash algorithm.') + + if ( + isinstance(algorithm, hashes.MD5) and not + isinstance(private_key, rsa.RSAPrivateKey) + ): + raise ValueError( + "MD5 is not a supported hash algorithm for EC/DSA CSRs" + ) + + # Resolve the signature algorithm. + evp_md = self._evp_md_non_null_from_algorithm(algorithm) + + # Create an empty request. + x509_req = self._lib.X509_REQ_new() + self.openssl_assert(x509_req != self._ffi.NULL) + x509_req = self._ffi.gc(x509_req, self._lib.X509_REQ_free) + + # Set x509 version. + res = self._lib.X509_REQ_set_version(x509_req, x509.Version.v1.value) + self.openssl_assert(res == 1) + + # Set subject name. + res = self._lib.X509_REQ_set_subject_name( + x509_req, _encode_name_gc(self, builder._subject_name) + ) + self.openssl_assert(res == 1) + + # Set subject public key. + public_key = private_key.public_key() + res = self._lib.X509_REQ_set_pubkey( + x509_req, public_key._evp_pkey + ) + self.openssl_assert(res == 1) + + # Add extensions. + sk_extension = self._lib.sk_X509_EXTENSION_new_null() + self.openssl_assert(sk_extension != self._ffi.NULL) + sk_extension = self._ffi.gc( + sk_extension, + lambda x: self._lib.sk_X509_EXTENSION_pop_free( + x, self._ffi.addressof( + self._lib._original_lib, "X509_EXTENSION_free" + ) + ) + ) + # Don't GC individual extensions because the memory is owned by + # sk_extensions and will be freed along with it. + self._create_x509_extensions( + extensions=builder._extensions, + handlers=_EXTENSION_ENCODE_HANDLERS, + x509_obj=sk_extension, + add_func=self._lib.sk_X509_EXTENSION_insert, + gc=False + ) + res = self._lib.X509_REQ_add_extensions(x509_req, sk_extension) + self.openssl_assert(res == 1) + + # Sign the request using the requester's private key. + res = self._lib.X509_REQ_sign( + x509_req, private_key._evp_pkey, evp_md + ) + if res == 0: + errors = self._consume_errors() + self.openssl_assert( + errors[0]._lib_reason_match( + self._lib.ERR_LIB_RSA, + self._lib.RSA_R_DIGEST_TOO_BIG_FOR_RSA_KEY + ) + ) + + raise ValueError("Digest too big for RSA key") + + return _CertificateSigningRequest(self, x509_req) + + def create_x509_certificate(self, builder, private_key, algorithm): + if not isinstance(builder, x509.CertificateBuilder): + raise TypeError('Builder type mismatch.') + if not isinstance(algorithm, hashes.HashAlgorithm): + raise TypeError('Algorithm must be a registered hash algorithm.') + + if ( + isinstance(algorithm, hashes.MD5) and not + isinstance(private_key, rsa.RSAPrivateKey) + ): + raise ValueError( + "MD5 is not a supported hash algorithm for EC/DSA certificates" + ) + + # Resolve the signature algorithm. + evp_md = self._evp_md_non_null_from_algorithm(algorithm) + + # Create an empty certificate. + x509_cert = self._lib.X509_new() + x509_cert = self._ffi.gc(x509_cert, backend._lib.X509_free) + + # Set the x509 version. + res = self._lib.X509_set_version(x509_cert, builder._version.value) + self.openssl_assert(res == 1) + + # Set the subject's name. + res = self._lib.X509_set_subject_name( + x509_cert, _encode_name_gc(self, builder._subject_name) + ) + self.openssl_assert(res == 1) + + # Set the subject's public key. + res = self._lib.X509_set_pubkey( + x509_cert, builder._public_key._evp_pkey + ) + self.openssl_assert(res == 1) + + # Set the certificate serial number. + serial_number = _encode_asn1_int_gc(self, builder._serial_number) + res = self._lib.X509_set_serialNumber(x509_cert, serial_number) + self.openssl_assert(res == 1) + + # Set the "not before" time. + self._set_asn1_time( + self._lib.X509_get_notBefore(x509_cert), builder._not_valid_before + ) + + # Set the "not after" time. + self._set_asn1_time( + self._lib.X509_get_notAfter(x509_cert), builder._not_valid_after + ) + + # Add extensions. + self._create_x509_extensions( + extensions=builder._extensions, + handlers=_EXTENSION_ENCODE_HANDLERS, + x509_obj=x509_cert, + add_func=self._lib.X509_add_ext, + gc=True + ) + + # Set the issuer name. + res = self._lib.X509_set_issuer_name( + x509_cert, _encode_name_gc(self, builder._issuer_name) + ) + self.openssl_assert(res == 1) + + # Sign the certificate with the issuer's private key. + res = self._lib.X509_sign( + x509_cert, private_key._evp_pkey, evp_md + ) + if res == 0: + errors = self._consume_errors() + self.openssl_assert( + errors[0]._lib_reason_match( + self._lib.ERR_LIB_RSA, + self._lib.RSA_R_DIGEST_TOO_BIG_FOR_RSA_KEY + ) + ) + raise ValueError("Digest too big for RSA key") + + return _Certificate(self, x509_cert) + + def _set_asn1_time(self, asn1_time, time): + if time.year >= 2050: + asn1_str = time.strftime('%Y%m%d%H%M%SZ').encode('ascii') + else: + asn1_str = time.strftime('%y%m%d%H%M%SZ').encode('ascii') + res = self._lib.ASN1_TIME_set_string(asn1_time, asn1_str) + self.openssl_assert(res == 1) + + def _create_asn1_time(self, time): + asn1_time = self._lib.ASN1_TIME_new() + self.openssl_assert(asn1_time != self._ffi.NULL) + asn1_time = self._ffi.gc(asn1_time, self._lib.ASN1_TIME_free) + self._set_asn1_time(asn1_time, time) + return asn1_time + + def create_x509_crl(self, builder, private_key, algorithm): + if not isinstance(builder, x509.CertificateRevocationListBuilder): + raise TypeError('Builder type mismatch.') + if not isinstance(algorithm, hashes.HashAlgorithm): + raise TypeError('Algorithm must be a registered hash algorithm.') + + if ( + isinstance(algorithm, hashes.MD5) and not + isinstance(private_key, rsa.RSAPrivateKey) + ): + raise ValueError( + "MD5 is not a supported hash algorithm for EC/DSA CRLs" + ) + + evp_md = self._evp_md_non_null_from_algorithm(algorithm) + + # Create an empty CRL. + x509_crl = self._lib.X509_CRL_new() + x509_crl = self._ffi.gc(x509_crl, backend._lib.X509_CRL_free) + + # Set the x509 CRL version. We only support v2 (integer value 1). + res = self._lib.X509_CRL_set_version(x509_crl, 1) + self.openssl_assert(res == 1) + + # Set the issuer name. + res = self._lib.X509_CRL_set_issuer_name( + x509_crl, _encode_name_gc(self, builder._issuer_name) + ) + self.openssl_assert(res == 1) + + # Set the last update time. + last_update = self._create_asn1_time(builder._last_update) + res = self._lib.X509_CRL_set_lastUpdate(x509_crl, last_update) + self.openssl_assert(res == 1) + + # Set the next update time. + next_update = self._create_asn1_time(builder._next_update) + res = self._lib.X509_CRL_set_nextUpdate(x509_crl, next_update) + self.openssl_assert(res == 1) + + # Add extensions. + self._create_x509_extensions( + extensions=builder._extensions, + handlers=_CRL_EXTENSION_ENCODE_HANDLERS, + x509_obj=x509_crl, + add_func=self._lib.X509_CRL_add_ext, + gc=True + ) + + # add revoked certificates + for revoked_cert in builder._revoked_certificates: + # Duplicating because the X509_CRL takes ownership and will free + # this memory when X509_CRL_free is called. + revoked = self._lib.Cryptography_X509_REVOKED_dup( + revoked_cert._x509_revoked + ) + self.openssl_assert(revoked != self._ffi.NULL) + res = self._lib.X509_CRL_add0_revoked(x509_crl, revoked) + self.openssl_assert(res == 1) + + res = self._lib.X509_CRL_sign( + x509_crl, private_key._evp_pkey, evp_md + ) + if res == 0: + errors = self._consume_errors() + self.openssl_assert( + errors[0]._lib_reason_match( + self._lib.ERR_LIB_RSA, + self._lib.RSA_R_DIGEST_TOO_BIG_FOR_RSA_KEY + ) + ) + raise ValueError("Digest too big for RSA key") + + return _CertificateRevocationList(self, x509_crl) + + def _create_x509_extensions(self, extensions, handlers, x509_obj, + add_func, gc): + for i, extension in enumerate(extensions): + x509_extension = self._create_x509_extension( + handlers, extension + ) + self.openssl_assert(x509_extension != self._ffi.NULL) + + if gc: + x509_extension = self._ffi.gc( + x509_extension, self._lib.X509_EXTENSION_free + ) + res = add_func(x509_obj, x509_extension, i) + self.openssl_assert(res >= 1) + + def _create_raw_x509_extension(self, extension, value): + obj = _txt2obj_gc(self, extension.oid.dotted_string) + return self._lib.X509_EXTENSION_create_by_OBJ( + self._ffi.NULL, obj, 1 if extension.critical else 0, value + ) + + def _create_x509_extension(self, handlers, extension): + if isinstance(extension.value, x509.UnrecognizedExtension): + value = _encode_asn1_str_gc(self, extension.value.value) + return self._create_raw_x509_extension(extension, value) + elif isinstance(extension.value, x509.TLSFeature): + asn1 = _Integers([x.value for x in extension.value]).dump() + value = _encode_asn1_str_gc(self, asn1) + return self._create_raw_x509_extension(extension, value) + elif isinstance(extension.value, x509.PrecertPoison): + asn1 = asn1crypto.core.Null().dump() + value = _encode_asn1_str_gc(self, asn1) + return self._create_raw_x509_extension(extension, value) + else: + try: + encode = handlers[extension.oid] + except KeyError: + raise NotImplementedError( + 'Extension not supported: {}'.format(extension.oid) + ) + + ext_struct = encode(self, extension.value) + nid = self._lib.OBJ_txt2nid( + extension.oid.dotted_string.encode("ascii") + ) + backend.openssl_assert(nid != self._lib.NID_undef) + return self._lib.X509V3_EXT_i2d( + nid, 1 if extension.critical else 0, ext_struct + ) + + def create_x509_revoked_certificate(self, builder): + if not isinstance(builder, x509.RevokedCertificateBuilder): + raise TypeError('Builder type mismatch.') + + x509_revoked = self._lib.X509_REVOKED_new() + self.openssl_assert(x509_revoked != self._ffi.NULL) + x509_revoked = self._ffi.gc(x509_revoked, self._lib.X509_REVOKED_free) + serial_number = _encode_asn1_int_gc(self, builder._serial_number) + res = self._lib.X509_REVOKED_set_serialNumber( + x509_revoked, serial_number + ) + self.openssl_assert(res == 1) + rev_date = self._create_asn1_time(builder._revocation_date) + res = self._lib.X509_REVOKED_set_revocationDate(x509_revoked, rev_date) + self.openssl_assert(res == 1) + # add CRL entry extensions + self._create_x509_extensions( + extensions=builder._extensions, + handlers=_CRL_ENTRY_EXTENSION_ENCODE_HANDLERS, + x509_obj=x509_revoked, + add_func=self._lib.X509_REVOKED_add_ext, + gc=True + ) + return _RevokedCertificate(self, None, x509_revoked) + + def load_pem_private_key(self, data, password): + return self._load_key( + self._lib.PEM_read_bio_PrivateKey, + self._evp_pkey_to_private_key, + data, + password, + ) + + def load_pem_public_key(self, data): + mem_bio = self._bytes_to_bio(data) + evp_pkey = self._lib.PEM_read_bio_PUBKEY( + mem_bio.bio, self._ffi.NULL, self._ffi.NULL, self._ffi.NULL + ) + if evp_pkey != self._ffi.NULL: + evp_pkey = self._ffi.gc(evp_pkey, self._lib.EVP_PKEY_free) + return self._evp_pkey_to_public_key(evp_pkey) + else: + # It's not a (RSA/DSA/ECDSA) subjectPublicKeyInfo, but we still + # need to check to see if it is a pure PKCS1 RSA public key (not + # embedded in a subjectPublicKeyInfo) + self._consume_errors() + res = self._lib.BIO_reset(mem_bio.bio) + self.openssl_assert(res == 1) + rsa_cdata = self._lib.PEM_read_bio_RSAPublicKey( + mem_bio.bio, self._ffi.NULL, self._ffi.NULL, self._ffi.NULL + ) + if rsa_cdata != self._ffi.NULL: + rsa_cdata = self._ffi.gc(rsa_cdata, self._lib.RSA_free) + evp_pkey = self._rsa_cdata_to_evp_pkey(rsa_cdata) + return _RSAPublicKey(self, rsa_cdata, evp_pkey) + else: + self._handle_key_loading_error() + + def load_pem_parameters(self, data): + mem_bio = self._bytes_to_bio(data) + # only DH is supported currently + dh_cdata = self._lib.PEM_read_bio_DHparams( + mem_bio.bio, self._ffi.NULL, self._ffi.NULL, self._ffi.NULL) + if dh_cdata != self._ffi.NULL: + dh_cdata = self._ffi.gc(dh_cdata, self._lib.DH_free) + return _DHParameters(self, dh_cdata) + else: + self._handle_key_loading_error() + + def load_der_private_key(self, data, password): + # OpenSSL has a function called d2i_AutoPrivateKey that in theory + # handles this automatically, however it doesn't handle encrypted + # private keys. Instead we try to load the key two different ways. + # First we'll try to load it as a traditional key. + bio_data = self._bytes_to_bio(data) + key = self._evp_pkey_from_der_traditional_key(bio_data, password) + if key: + return self._evp_pkey_to_private_key(key) + else: + # Finally we try to load it with the method that handles encrypted + # PKCS8 properly. + return self._load_key( + self._lib.d2i_PKCS8PrivateKey_bio, + self._evp_pkey_to_private_key, + data, + password, + ) + + def _evp_pkey_from_der_traditional_key(self, bio_data, password): + key = self._lib.d2i_PrivateKey_bio(bio_data.bio, self._ffi.NULL) + if key != self._ffi.NULL: + key = self._ffi.gc(key, self._lib.EVP_PKEY_free) + if password is not None: + raise TypeError( + "Password was given but private key is not encrypted." + ) + + return key + else: + self._consume_errors() + return None + + def load_der_public_key(self, data): + mem_bio = self._bytes_to_bio(data) + evp_pkey = self._lib.d2i_PUBKEY_bio(mem_bio.bio, self._ffi.NULL) + if evp_pkey != self._ffi.NULL: + evp_pkey = self._ffi.gc(evp_pkey, self._lib.EVP_PKEY_free) + return self._evp_pkey_to_public_key(evp_pkey) + else: + # It's not a (RSA/DSA/ECDSA) subjectPublicKeyInfo, but we still + # need to check to see if it is a pure PKCS1 RSA public key (not + # embedded in a subjectPublicKeyInfo) + self._consume_errors() + res = self._lib.BIO_reset(mem_bio.bio) + self.openssl_assert(res == 1) + rsa_cdata = self._lib.d2i_RSAPublicKey_bio( + mem_bio.bio, self._ffi.NULL + ) + if rsa_cdata != self._ffi.NULL: + rsa_cdata = self._ffi.gc(rsa_cdata, self._lib.RSA_free) + evp_pkey = self._rsa_cdata_to_evp_pkey(rsa_cdata) + return _RSAPublicKey(self, rsa_cdata, evp_pkey) + else: + self._handle_key_loading_error() + + def load_der_parameters(self, data): + mem_bio = self._bytes_to_bio(data) + dh_cdata = self._lib.d2i_DHparams_bio( + mem_bio.bio, self._ffi.NULL + ) + if dh_cdata != self._ffi.NULL: + dh_cdata = self._ffi.gc(dh_cdata, self._lib.DH_free) + return _DHParameters(self, dh_cdata) + elif self._lib.Cryptography_HAS_EVP_PKEY_DHX: + # We check to see if the is dhx. + self._consume_errors() + res = self._lib.BIO_reset(mem_bio.bio) + self.openssl_assert(res == 1) + dh_cdata = self._lib.Cryptography_d2i_DHxparams_bio( + mem_bio.bio, self._ffi.NULL + ) + if dh_cdata != self._ffi.NULL: + dh_cdata = self._ffi.gc(dh_cdata, self._lib.DH_free) + return _DHParameters(self, dh_cdata) + + self._handle_key_loading_error() + + def load_pem_x509_certificate(self, data): + mem_bio = self._bytes_to_bio(data) + x509 = self._lib.PEM_read_bio_X509( + mem_bio.bio, self._ffi.NULL, self._ffi.NULL, self._ffi.NULL + ) + if x509 == self._ffi.NULL: + self._consume_errors() + raise ValueError( + "Unable to load certificate. See https://cryptography.io/en/la" + "test/faq/#why-can-t-i-import-my-pem-file for more details." + ) + + x509 = self._ffi.gc(x509, self._lib.X509_free) + return _Certificate(self, x509) + + def load_der_x509_certificate(self, data): + mem_bio = self._bytes_to_bio(data) + x509 = self._lib.d2i_X509_bio(mem_bio.bio, self._ffi.NULL) + if x509 == self._ffi.NULL: + self._consume_errors() + raise ValueError("Unable to load certificate") + + x509 = self._ffi.gc(x509, self._lib.X509_free) + return _Certificate(self, x509) + + def load_pem_x509_crl(self, data): + mem_bio = self._bytes_to_bio(data) + x509_crl = self._lib.PEM_read_bio_X509_CRL( + mem_bio.bio, self._ffi.NULL, self._ffi.NULL, self._ffi.NULL + ) + if x509_crl == self._ffi.NULL: + self._consume_errors() + raise ValueError( + "Unable to load CRL. See https://cryptography.io/en/la" + "test/faq/#why-can-t-i-import-my-pem-file for more details." + ) + + x509_crl = self._ffi.gc(x509_crl, self._lib.X509_CRL_free) + return _CertificateRevocationList(self, x509_crl) + + def load_der_x509_crl(self, data): + mem_bio = self._bytes_to_bio(data) + x509_crl = self._lib.d2i_X509_CRL_bio(mem_bio.bio, self._ffi.NULL) + if x509_crl == self._ffi.NULL: + self._consume_errors() + raise ValueError("Unable to load CRL") + + x509_crl = self._ffi.gc(x509_crl, self._lib.X509_CRL_free) + return _CertificateRevocationList(self, x509_crl) + + def load_pem_x509_csr(self, data): + mem_bio = self._bytes_to_bio(data) + x509_req = self._lib.PEM_read_bio_X509_REQ( + mem_bio.bio, self._ffi.NULL, self._ffi.NULL, self._ffi.NULL + ) + if x509_req == self._ffi.NULL: + self._consume_errors() + raise ValueError( + "Unable to load request. See https://cryptography.io/en/la" + "test/faq/#why-can-t-i-import-my-pem-file for more details." + ) + + x509_req = self._ffi.gc(x509_req, self._lib.X509_REQ_free) + return _CertificateSigningRequest(self, x509_req) + + def load_der_x509_csr(self, data): + mem_bio = self._bytes_to_bio(data) + x509_req = self._lib.d2i_X509_REQ_bio(mem_bio.bio, self._ffi.NULL) + if x509_req == self._ffi.NULL: + self._consume_errors() + raise ValueError("Unable to load request") + + x509_req = self._ffi.gc(x509_req, self._lib.X509_REQ_free) + return _CertificateSigningRequest(self, x509_req) + + def _load_key(self, openssl_read_func, convert_func, data, password): + mem_bio = self._bytes_to_bio(data) + + userdata = self._ffi.new("CRYPTOGRAPHY_PASSWORD_DATA *") + if password is not None: + utils._check_byteslike("password", password) + password_ptr = self._ffi.from_buffer(password) + userdata.password = password_ptr + userdata.length = len(password) + + evp_pkey = openssl_read_func( + mem_bio.bio, + self._ffi.NULL, + self._ffi.addressof( + self._lib._original_lib, "Cryptography_pem_password_cb" + ), + userdata, + ) + + if evp_pkey == self._ffi.NULL: + if userdata.error != 0: + errors = self._consume_errors() + self.openssl_assert(errors) + if userdata.error == -1: + raise TypeError( + "Password was not given but private key is encrypted" + ) + else: + assert userdata.error == -2 + raise ValueError( + "Passwords longer than {} bytes are not supported " + "by this backend.".format(userdata.maxsize - 1) + ) + else: + self._handle_key_loading_error() + + evp_pkey = self._ffi.gc(evp_pkey, self._lib.EVP_PKEY_free) + + if password is not None and userdata.called == 0: + raise TypeError( + "Password was given but private key is not encrypted.") + + assert ( + (password is not None and userdata.called == 1) or + password is None + ) + + return convert_func(evp_pkey) + + def _handle_key_loading_error(self): + errors = self._consume_errors() + + if not errors: + raise ValueError("Could not deserialize key data.") + + elif ( + errors[0]._lib_reason_match( + self._lib.ERR_LIB_EVP, self._lib.EVP_R_BAD_DECRYPT + ) or errors[0]._lib_reason_match( + self._lib.ERR_LIB_PKCS12, + self._lib.PKCS12_R_PKCS12_CIPHERFINAL_ERROR + ) + ): + raise ValueError("Bad decrypt. Incorrect password?") + + elif ( + errors[0]._lib_reason_match( + self._lib.ERR_LIB_EVP, self._lib.EVP_R_UNKNOWN_PBE_ALGORITHM + ) or errors[0]._lib_reason_match( + self._lib.ERR_LIB_PEM, self._lib.PEM_R_UNSUPPORTED_ENCRYPTION + ) + ): + raise UnsupportedAlgorithm( + "PEM data is encrypted with an unsupported cipher", + _Reasons.UNSUPPORTED_CIPHER + ) + + elif any( + error._lib_reason_match( + self._lib.ERR_LIB_EVP, + self._lib.EVP_R_UNSUPPORTED_PRIVATE_KEY_ALGORITHM + ) + for error in errors + ): + raise ValueError("Unsupported public key algorithm.") + + else: + assert errors[0].lib in ( + self._lib.ERR_LIB_EVP, + self._lib.ERR_LIB_PEM, + self._lib.ERR_LIB_ASN1, + ) + raise ValueError("Could not deserialize key data.") + + def elliptic_curve_supported(self, curve): + try: + curve_nid = self._elliptic_curve_to_nid(curve) + except UnsupportedAlgorithm: + curve_nid = self._lib.NID_undef + + group = self._lib.EC_GROUP_new_by_curve_name(curve_nid) + + if group == self._ffi.NULL: + errors = self._consume_errors() + self.openssl_assert( + curve_nid == self._lib.NID_undef or + errors[0]._lib_reason_match( + self._lib.ERR_LIB_EC, + self._lib.EC_R_UNKNOWN_GROUP + ) + ) + return False + else: + self.openssl_assert(curve_nid != self._lib.NID_undef) + self._lib.EC_GROUP_free(group) + return True + + def elliptic_curve_signature_algorithm_supported( + self, signature_algorithm, curve + ): + # We only support ECDSA right now. + if not isinstance(signature_algorithm, ec.ECDSA): + return False + + return self.elliptic_curve_supported(curve) + + def generate_elliptic_curve_private_key(self, curve): + """ + Generate a new private key on the named curve. + """ + + if self.elliptic_curve_supported(curve): + ec_cdata = self._ec_key_new_by_curve(curve) + + res = self._lib.EC_KEY_generate_key(ec_cdata) + self.openssl_assert(res == 1) + + evp_pkey = self._ec_cdata_to_evp_pkey(ec_cdata) + + return _EllipticCurvePrivateKey(self, ec_cdata, evp_pkey) + else: + raise UnsupportedAlgorithm( + "Backend object does not support {}.".format(curve.name), + _Reasons.UNSUPPORTED_ELLIPTIC_CURVE + ) + + def load_elliptic_curve_private_numbers(self, numbers): + public = numbers.public_numbers + + ec_cdata = self._ec_key_new_by_curve(public.curve) + + private_value = self._ffi.gc( + self._int_to_bn(numbers.private_value), self._lib.BN_clear_free + ) + res = self._lib.EC_KEY_set_private_key(ec_cdata, private_value) + self.openssl_assert(res == 1) + + ec_cdata = self._ec_key_set_public_key_affine_coordinates( + ec_cdata, public.x, public.y) + + evp_pkey = self._ec_cdata_to_evp_pkey(ec_cdata) + + return _EllipticCurvePrivateKey(self, ec_cdata, evp_pkey) + + def load_elliptic_curve_public_numbers(self, numbers): + ec_cdata = self._ec_key_new_by_curve(numbers.curve) + ec_cdata = self._ec_key_set_public_key_affine_coordinates( + ec_cdata, numbers.x, numbers.y) + evp_pkey = self._ec_cdata_to_evp_pkey(ec_cdata) + + return _EllipticCurvePublicKey(self, ec_cdata, evp_pkey) + + def load_elliptic_curve_public_bytes(self, curve, point_bytes): + ec_cdata = self._ec_key_new_by_curve(curve) + group = self._lib.EC_KEY_get0_group(ec_cdata) + self.openssl_assert(group != self._ffi.NULL) + point = self._lib.EC_POINT_new(group) + self.openssl_assert(point != self._ffi.NULL) + point = self._ffi.gc(point, self._lib.EC_POINT_free) + with self._tmp_bn_ctx() as bn_ctx: + res = self._lib.EC_POINT_oct2point( + group, point, point_bytes, len(point_bytes), bn_ctx + ) + if res != 1: + self._consume_errors() + raise ValueError("Invalid public bytes for the given curve") + + res = self._lib.EC_KEY_set_public_key(ec_cdata, point) + self.openssl_assert(res == 1) + evp_pkey = self._ec_cdata_to_evp_pkey(ec_cdata) + return _EllipticCurvePublicKey(self, ec_cdata, evp_pkey) + + def derive_elliptic_curve_private_key(self, private_value, curve): + ec_cdata = self._ec_key_new_by_curve(curve) + + get_func, group = self._ec_key_determine_group_get_func(ec_cdata) + + point = self._lib.EC_POINT_new(group) + self.openssl_assert(point != self._ffi.NULL) + point = self._ffi.gc(point, self._lib.EC_POINT_free) + + value = self._int_to_bn(private_value) + value = self._ffi.gc(value, self._lib.BN_clear_free) + + with self._tmp_bn_ctx() as bn_ctx: + res = self._lib.EC_POINT_mul(group, point, value, self._ffi.NULL, + self._ffi.NULL, bn_ctx) + self.openssl_assert(res == 1) + + bn_x = self._lib.BN_CTX_get(bn_ctx) + bn_y = self._lib.BN_CTX_get(bn_ctx) + + res = get_func(group, point, bn_x, bn_y, bn_ctx) + self.openssl_assert(res == 1) + + res = self._lib.EC_KEY_set_public_key(ec_cdata, point) + self.openssl_assert(res == 1) + private = self._int_to_bn(private_value) + private = self._ffi.gc(private, self._lib.BN_clear_free) + res = self._lib.EC_KEY_set_private_key(ec_cdata, private) + self.openssl_assert(res == 1) + + evp_pkey = self._ec_cdata_to_evp_pkey(ec_cdata) + + return _EllipticCurvePrivateKey(self, ec_cdata, evp_pkey) + + def _ec_key_new_by_curve(self, curve): + curve_nid = self._elliptic_curve_to_nid(curve) + ec_cdata = self._lib.EC_KEY_new_by_curve_name(curve_nid) + self.openssl_assert(ec_cdata != self._ffi.NULL) + return self._ffi.gc(ec_cdata, self._lib.EC_KEY_free) + + def load_der_ocsp_request(self, data): + mem_bio = self._bytes_to_bio(data) + request = self._lib.d2i_OCSP_REQUEST_bio(mem_bio.bio, self._ffi.NULL) + if request == self._ffi.NULL: + self._consume_errors() + raise ValueError("Unable to load OCSP request") + + request = self._ffi.gc(request, self._lib.OCSP_REQUEST_free) + return _OCSPRequest(self, request) + + def load_der_ocsp_response(self, data): + mem_bio = self._bytes_to_bio(data) + response = self._lib.d2i_OCSP_RESPONSE_bio(mem_bio.bio, self._ffi.NULL) + if response == self._ffi.NULL: + self._consume_errors() + raise ValueError("Unable to load OCSP response") + + response = self._ffi.gc(response, self._lib.OCSP_RESPONSE_free) + return _OCSPResponse(self, response) + + def create_ocsp_request(self, builder): + ocsp_req = self._lib.OCSP_REQUEST_new() + self.openssl_assert(ocsp_req != self._ffi.NULL) + ocsp_req = self._ffi.gc(ocsp_req, self._lib.OCSP_REQUEST_free) + cert, issuer, algorithm = builder._request + evp_md = self._evp_md_non_null_from_algorithm(algorithm) + certid = self._lib.OCSP_cert_to_id( + evp_md, cert._x509, issuer._x509 + ) + self.openssl_assert(certid != self._ffi.NULL) + onereq = self._lib.OCSP_request_add0_id(ocsp_req, certid) + self.openssl_assert(onereq != self._ffi.NULL) + self._create_x509_extensions( + extensions=builder._extensions, + handlers=_OCSP_REQUEST_EXTENSION_ENCODE_HANDLERS, + x509_obj=ocsp_req, + add_func=self._lib.OCSP_REQUEST_add_ext, + gc=True, + ) + return _OCSPRequest(self, ocsp_req) + + def _create_ocsp_basic_response(self, builder, private_key, algorithm): + basic = self._lib.OCSP_BASICRESP_new() + self.openssl_assert(basic != self._ffi.NULL) + basic = self._ffi.gc(basic, self._lib.OCSP_BASICRESP_free) + evp_md = self._evp_md_non_null_from_algorithm( + builder._response._algorithm + ) + certid = self._lib.OCSP_cert_to_id( + evp_md, builder._response._cert._x509, + builder._response._issuer._x509 + ) + self.openssl_assert(certid != self._ffi.NULL) + certid = self._ffi.gc(certid, self._lib.OCSP_CERTID_free) + if builder._response._revocation_reason is None: + reason = -1 + else: + reason = _CRL_ENTRY_REASON_ENUM_TO_CODE[ + builder._response._revocation_reason + ] + if builder._response._revocation_time is None: + rev_time = self._ffi.NULL + else: + rev_time = self._create_asn1_time( + builder._response._revocation_time + ) + + next_update = self._ffi.NULL + if builder._response._next_update is not None: + next_update = self._create_asn1_time( + builder._response._next_update + ) + + this_update = self._create_asn1_time(builder._response._this_update) + + res = self._lib.OCSP_basic_add1_status( + basic, + certid, + builder._response._cert_status.value, + reason, + rev_time, + this_update, + next_update + ) + self.openssl_assert(res != self._ffi.NULL) + # okay, now sign the basic structure + evp_md = self._evp_md_non_null_from_algorithm(algorithm) + responder_cert, responder_encoding = builder._responder_id + flags = self._lib.OCSP_NOCERTS + if responder_encoding is ocsp.OCSPResponderEncoding.HASH: + flags |= self._lib.OCSP_RESPID_KEY + + if builder._certs is not None: + for cert in builder._certs: + res = self._lib.OCSP_basic_add1_cert(basic, cert._x509) + self.openssl_assert(res == 1) + + self._create_x509_extensions( + extensions=builder._extensions, + handlers=_OCSP_BASICRESP_EXTENSION_ENCODE_HANDLERS, + x509_obj=basic, + add_func=self._lib.OCSP_BASICRESP_add_ext, + gc=True, + ) + + res = self._lib.OCSP_basic_sign( + basic, responder_cert._x509, private_key._evp_pkey, + evp_md, self._ffi.NULL, flags + ) + if res != 1: + errors = self._consume_errors() + self.openssl_assert( + errors[0]._lib_reason_match( + self._lib.ERR_LIB_X509, + self._lib.X509_R_KEY_VALUES_MISMATCH + ) + ) + raise ValueError("responder_cert must be signed by private_key") + + return basic + + def create_ocsp_response(self, response_status, builder, private_key, + algorithm): + if response_status is ocsp.OCSPResponseStatus.SUCCESSFUL: + basic = self._create_ocsp_basic_response( + builder, private_key, algorithm + ) + else: + basic = self._ffi.NULL + + ocsp_resp = self._lib.OCSP_response_create( + response_status.value, basic + ) + self.openssl_assert(ocsp_resp != self._ffi.NULL) + ocsp_resp = self._ffi.gc(ocsp_resp, self._lib.OCSP_RESPONSE_free) + return _OCSPResponse(self, ocsp_resp) + + def elliptic_curve_exchange_algorithm_supported(self, algorithm, curve): + return ( + self.elliptic_curve_supported(curve) and + isinstance(algorithm, ec.ECDH) + ) + + def _ec_cdata_to_evp_pkey(self, ec_cdata): + evp_pkey = self._create_evp_pkey_gc() + res = self._lib.EVP_PKEY_set1_EC_KEY(evp_pkey, ec_cdata) + self.openssl_assert(res == 1) + return evp_pkey + + def _elliptic_curve_to_nid(self, curve): + """ + Get the NID for a curve name. + """ + + curve_aliases = { + "secp192r1": "prime192v1", + "secp256r1": "prime256v1" + } + + curve_name = curve_aliases.get(curve.name, curve.name) + + curve_nid = self._lib.OBJ_sn2nid(curve_name.encode()) + if curve_nid == self._lib.NID_undef: + raise UnsupportedAlgorithm( + "{} is not a supported elliptic curve".format(curve.name), + _Reasons.UNSUPPORTED_ELLIPTIC_CURVE + ) + return curve_nid + + @contextmanager + def _tmp_bn_ctx(self): + bn_ctx = self._lib.BN_CTX_new() + self.openssl_assert(bn_ctx != self._ffi.NULL) + bn_ctx = self._ffi.gc(bn_ctx, self._lib.BN_CTX_free) + self._lib.BN_CTX_start(bn_ctx) + try: + yield bn_ctx + finally: + self._lib.BN_CTX_end(bn_ctx) + + def _ec_key_determine_group_get_func(self, ctx): + """ + Given an EC_KEY determine the group and what function is required to + get point coordinates. + """ + self.openssl_assert(ctx != self._ffi.NULL) + + nid_two_field = self._lib.OBJ_sn2nid(b"characteristic-two-field") + self.openssl_assert(nid_two_field != self._lib.NID_undef) + + group = self._lib.EC_KEY_get0_group(ctx) + self.openssl_assert(group != self._ffi.NULL) + + method = self._lib.EC_GROUP_method_of(group) + self.openssl_assert(method != self._ffi.NULL) + + nid = self._lib.EC_METHOD_get_field_type(method) + self.openssl_assert(nid != self._lib.NID_undef) + + if nid == nid_two_field and self._lib.Cryptography_HAS_EC2M: + get_func = self._lib.EC_POINT_get_affine_coordinates_GF2m + else: + get_func = self._lib.EC_POINT_get_affine_coordinates_GFp + + assert get_func + + return get_func, group + + def _ec_key_set_public_key_affine_coordinates(self, ctx, x, y): + """ + Sets the public key point in the EC_KEY context to the affine x and y + values. + """ + + if x < 0 or y < 0: + raise ValueError( + "Invalid EC key. Both x and y must be non-negative." + ) + + x = self._ffi.gc(self._int_to_bn(x), self._lib.BN_free) + y = self._ffi.gc(self._int_to_bn(y), self._lib.BN_free) + res = self._lib.EC_KEY_set_public_key_affine_coordinates(ctx, x, y) + if res != 1: + self._consume_errors() + raise ValueError("Invalid EC key.") + + return ctx + + def _private_key_bytes(self, encoding, format, encryption_algorithm, + evp_pkey, cdata): + if not isinstance(format, serialization.PrivateFormat): + raise TypeError( + "format must be an item from the PrivateFormat enum" + ) + + # X9.62 encoding is only valid for EC public keys + if encoding is serialization.Encoding.X962: + raise ValueError("X9.62 format is only valid for EC public keys") + + # Raw format and encoding are only valid for X25519, Ed25519, X448, and + # Ed448 keys. We capture those cases before this method is called so if + # we see those enum values here it means the caller has passed them to + # a key that doesn't support raw type + if format is serialization.PrivateFormat.Raw: + raise ValueError("raw format is invalid with this key or encoding") + + if encoding is serialization.Encoding.Raw: + raise ValueError("raw encoding is invalid with this key or format") + + if not isinstance(encryption_algorithm, + serialization.KeySerializationEncryption): + raise TypeError( + "Encryption algorithm must be a KeySerializationEncryption " + "instance" + ) + + if isinstance(encryption_algorithm, serialization.NoEncryption): + password = b"" + passlen = 0 + evp_cipher = self._ffi.NULL + elif isinstance(encryption_algorithm, + serialization.BestAvailableEncryption): + # This is a curated value that we will update over time. + evp_cipher = self._lib.EVP_get_cipherbyname( + b"aes-256-cbc" + ) + password = encryption_algorithm.password + passlen = len(password) + if passlen > 1023: + raise ValueError( + "Passwords longer than 1023 bytes are not supported by " + "this backend" + ) + else: + raise ValueError("Unsupported encryption type") + + key_type = self._lib.EVP_PKEY_id(evp_pkey) + if encoding is serialization.Encoding.PEM: + if format is serialization.PrivateFormat.PKCS8: + write_bio = self._lib.PEM_write_bio_PKCS8PrivateKey + key = evp_pkey + else: + assert format is serialization.PrivateFormat.TraditionalOpenSSL + if key_type == self._lib.EVP_PKEY_RSA: + write_bio = self._lib.PEM_write_bio_RSAPrivateKey + elif key_type == self._lib.EVP_PKEY_DSA: + write_bio = self._lib.PEM_write_bio_DSAPrivateKey + else: + assert key_type == self._lib.EVP_PKEY_EC + write_bio = self._lib.PEM_write_bio_ECPrivateKey + + key = cdata + elif encoding is serialization.Encoding.DER: + if format is serialization.PrivateFormat.TraditionalOpenSSL: + if not isinstance( + encryption_algorithm, serialization.NoEncryption + ): + raise ValueError( + "Encryption is not supported for DER encoded " + "traditional OpenSSL keys" + ) + + return self._private_key_bytes_traditional_der(key_type, cdata) + else: + assert format is serialization.PrivateFormat.PKCS8 + write_bio = self._lib.i2d_PKCS8PrivateKey_bio + key = evp_pkey + else: + raise TypeError("encoding must be Encoding.PEM or Encoding.DER") + + bio = self._create_mem_bio_gc() + res = write_bio( + bio, + key, + evp_cipher, + password, + passlen, + self._ffi.NULL, + self._ffi.NULL + ) + self.openssl_assert(res == 1) + return self._read_mem_bio(bio) + + def _private_key_bytes_traditional_der(self, key_type, cdata): + if key_type == self._lib.EVP_PKEY_RSA: + write_bio = self._lib.i2d_RSAPrivateKey_bio + elif key_type == self._lib.EVP_PKEY_EC: + write_bio = self._lib.i2d_ECPrivateKey_bio + else: + self.openssl_assert(key_type == self._lib.EVP_PKEY_DSA) + write_bio = self._lib.i2d_DSAPrivateKey_bio + + bio = self._create_mem_bio_gc() + res = write_bio(bio, cdata) + self.openssl_assert(res == 1) + return self._read_mem_bio(bio) + + def _public_key_bytes(self, encoding, format, key, evp_pkey, cdata): + if not isinstance(encoding, serialization.Encoding): + raise TypeError("encoding must be an item from the Encoding enum") + + # Compressed/UncompressedPoint are only valid for EC keys and those + # cases are handled by the ECPublicKey public_bytes method before this + # method is called + if format in (serialization.PublicFormat.UncompressedPoint, + serialization.PublicFormat.CompressedPoint): + raise ValueError("Point formats are not valid for this key type") + + # Raw format and encoding are only valid for X25519, Ed25519, X448, and + # Ed448 keys. We capture those cases before this method is called so if + # we see those enum values here it means the caller has passed them to + # a key that doesn't support raw type + if format is serialization.PublicFormat.Raw: + raise ValueError("raw format is invalid with this key or encoding") + + if encoding is serialization.Encoding.Raw: + raise ValueError("raw encoding is invalid with this key or format") + + if ( + format is serialization.PublicFormat.OpenSSH or + encoding is serialization.Encoding.OpenSSH + ): + if ( + format is not serialization.PublicFormat.OpenSSH or + encoding is not serialization.Encoding.OpenSSH + ): + raise ValueError( + "OpenSSH format must be used with OpenSSH encoding" + ) + return self._openssh_public_key_bytes(key) + elif format is serialization.PublicFormat.SubjectPublicKeyInfo: + if encoding is serialization.Encoding.PEM: + write_bio = self._lib.PEM_write_bio_PUBKEY + else: + assert encoding is serialization.Encoding.DER + write_bio = self._lib.i2d_PUBKEY_bio + + key = evp_pkey + elif format is serialization.PublicFormat.PKCS1: + # Only RSA is supported here. + assert self._lib.EVP_PKEY_id(evp_pkey) == self._lib.EVP_PKEY_RSA + if encoding is serialization.Encoding.PEM: + write_bio = self._lib.PEM_write_bio_RSAPublicKey + else: + assert encoding is serialization.Encoding.DER + write_bio = self._lib.i2d_RSAPublicKey_bio + + key = cdata + else: + raise TypeError( + "format must be an item from the PublicFormat enum" + ) + + bio = self._create_mem_bio_gc() + res = write_bio(bio, key) + self.openssl_assert(res == 1) + return self._read_mem_bio(bio) + + def _openssh_public_key_bytes(self, key): + if isinstance(key, rsa.RSAPublicKey): + public_numbers = key.public_numbers() + return b"ssh-rsa " + base64.b64encode( + ssh._ssh_write_string(b"ssh-rsa") + + ssh._ssh_write_mpint(public_numbers.e) + + ssh._ssh_write_mpint(public_numbers.n) + ) + elif isinstance(key, dsa.DSAPublicKey): + public_numbers = key.public_numbers() + parameter_numbers = public_numbers.parameter_numbers + return b"ssh-dss " + base64.b64encode( + ssh._ssh_write_string(b"ssh-dss") + + ssh._ssh_write_mpint(parameter_numbers.p) + + ssh._ssh_write_mpint(parameter_numbers.q) + + ssh._ssh_write_mpint(parameter_numbers.g) + + ssh._ssh_write_mpint(public_numbers.y) + ) + elif isinstance(key, ed25519.Ed25519PublicKey): + raw_bytes = key.public_bytes(serialization.Encoding.Raw, + serialization.PublicFormat.Raw) + return b"ssh-ed25519 " + base64.b64encode( + ssh._ssh_write_string(b"ssh-ed25519") + + ssh._ssh_write_string(raw_bytes) + ) + elif isinstance(key, ec.EllipticCurvePublicKey): + public_numbers = key.public_numbers() + try: + curve_name = { + ec.SECP256R1: b"nistp256", + ec.SECP384R1: b"nistp384", + ec.SECP521R1: b"nistp521", + }[type(public_numbers.curve)] + except KeyError: + raise ValueError( + "Only SECP256R1, SECP384R1, and SECP521R1 curves are " + "supported by the SSH public key format" + ) + + point = key.public_bytes( + serialization.Encoding.X962, + serialization.PublicFormat.UncompressedPoint + ) + return b"ecdsa-sha2-" + curve_name + b" " + base64.b64encode( + ssh._ssh_write_string(b"ecdsa-sha2-" + curve_name) + + ssh._ssh_write_string(curve_name) + + ssh._ssh_write_string(point) + ) + else: + raise ValueError( + "OpenSSH encoding is not supported for this key type" + ) + + def _parameter_bytes(self, encoding, format, cdata): + if encoding is serialization.Encoding.OpenSSH: + raise TypeError( + "OpenSSH encoding is not supported" + ) + + # Only DH is supported here currently. + q = self._ffi.new("BIGNUM **") + self._lib.DH_get0_pqg(cdata, + self._ffi.NULL, + q, + self._ffi.NULL) + if encoding is serialization.Encoding.PEM: + if q[0] != self._ffi.NULL: + write_bio = self._lib.PEM_write_bio_DHxparams + else: + write_bio = self._lib.PEM_write_bio_DHparams + elif encoding is serialization.Encoding.DER: + if q[0] != self._ffi.NULL: + write_bio = self._lib.Cryptography_i2d_DHxparams_bio + else: + write_bio = self._lib.i2d_DHparams_bio + else: + raise TypeError("encoding must be an item from the Encoding enum") + + bio = self._create_mem_bio_gc() + res = write_bio(bio, cdata) + self.openssl_assert(res == 1) + return self._read_mem_bio(bio) + + def generate_dh_parameters(self, generator, key_size): + if key_size < 512: + raise ValueError("DH key_size must be at least 512 bits") + + if generator not in (2, 5): + raise ValueError("DH generator must be 2 or 5") + + dh_param_cdata = self._lib.DH_new() + self.openssl_assert(dh_param_cdata != self._ffi.NULL) + dh_param_cdata = self._ffi.gc(dh_param_cdata, self._lib.DH_free) + + res = self._lib.DH_generate_parameters_ex( + dh_param_cdata, + key_size, + generator, + self._ffi.NULL + ) + self.openssl_assert(res == 1) + + return _DHParameters(self, dh_param_cdata) + + def _dh_cdata_to_evp_pkey(self, dh_cdata): + evp_pkey = self._create_evp_pkey_gc() + res = self._lib.EVP_PKEY_set1_DH(evp_pkey, dh_cdata) + self.openssl_assert(res == 1) + return evp_pkey + + def generate_dh_private_key(self, parameters): + dh_key_cdata = _dh_params_dup(parameters._dh_cdata, self) + + res = self._lib.DH_generate_key(dh_key_cdata) + self.openssl_assert(res == 1) + + evp_pkey = self._dh_cdata_to_evp_pkey(dh_key_cdata) + + return _DHPrivateKey(self, dh_key_cdata, evp_pkey) + + def generate_dh_private_key_and_parameters(self, generator, key_size): + return self.generate_dh_private_key( + self.generate_dh_parameters(generator, key_size)) + + def load_dh_private_numbers(self, numbers): + parameter_numbers = numbers.public_numbers.parameter_numbers + + dh_cdata = self._lib.DH_new() + self.openssl_assert(dh_cdata != self._ffi.NULL) + dh_cdata = self._ffi.gc(dh_cdata, self._lib.DH_free) + + p = self._int_to_bn(parameter_numbers.p) + g = self._int_to_bn(parameter_numbers.g) + + if parameter_numbers.q is not None: + q = self._int_to_bn(parameter_numbers.q) + else: + q = self._ffi.NULL + + pub_key = self._int_to_bn(numbers.public_numbers.y) + priv_key = self._int_to_bn(numbers.x) + + res = self._lib.DH_set0_pqg(dh_cdata, p, q, g) + self.openssl_assert(res == 1) + + res = self._lib.DH_set0_key(dh_cdata, pub_key, priv_key) + self.openssl_assert(res == 1) + + codes = self._ffi.new("int[]", 1) + res = self._lib.Cryptography_DH_check(dh_cdata, codes) + self.openssl_assert(res == 1) + + # DH_check will return DH_NOT_SUITABLE_GENERATOR if p % 24 does not + # equal 11 when the generator is 2 (a quadratic nonresidue). + # We want to ignore that error because p % 24 == 23 is also fine. + # Specifically, g is then a quadratic residue. Within the context of + # Diffie-Hellman this means it can only generate half the possible + # values. That sounds bad, but quadratic nonresidues leak a bit of + # the key to the attacker in exchange for having the full key space + # available. See: https://crypto.stackexchange.com/questions/12961 + if codes[0] != 0 and not ( + parameter_numbers.g == 2 and + codes[0] ^ self._lib.DH_NOT_SUITABLE_GENERATOR == 0 + ): + raise ValueError( + "DH private numbers did not pass safety checks." + ) + + evp_pkey = self._dh_cdata_to_evp_pkey(dh_cdata) + + return _DHPrivateKey(self, dh_cdata, evp_pkey) + + def load_dh_public_numbers(self, numbers): + dh_cdata = self._lib.DH_new() + self.openssl_assert(dh_cdata != self._ffi.NULL) + dh_cdata = self._ffi.gc(dh_cdata, self._lib.DH_free) + + parameter_numbers = numbers.parameter_numbers + + p = self._int_to_bn(parameter_numbers.p) + g = self._int_to_bn(parameter_numbers.g) + + if parameter_numbers.q is not None: + q = self._int_to_bn(parameter_numbers.q) + else: + q = self._ffi.NULL + + pub_key = self._int_to_bn(numbers.y) + + res = self._lib.DH_set0_pqg(dh_cdata, p, q, g) + self.openssl_assert(res == 1) + + res = self._lib.DH_set0_key(dh_cdata, pub_key, self._ffi.NULL) + self.openssl_assert(res == 1) + + evp_pkey = self._dh_cdata_to_evp_pkey(dh_cdata) + + return _DHPublicKey(self, dh_cdata, evp_pkey) + + def load_dh_parameter_numbers(self, numbers): + dh_cdata = self._lib.DH_new() + self.openssl_assert(dh_cdata != self._ffi.NULL) + dh_cdata = self._ffi.gc(dh_cdata, self._lib.DH_free) + + p = self._int_to_bn(numbers.p) + g = self._int_to_bn(numbers.g) + + if numbers.q is not None: + q = self._int_to_bn(numbers.q) + else: + q = self._ffi.NULL + + res = self._lib.DH_set0_pqg(dh_cdata, p, q, g) + self.openssl_assert(res == 1) + + return _DHParameters(self, dh_cdata) + + def dh_parameters_supported(self, p, g, q=None): + dh_cdata = self._lib.DH_new() + self.openssl_assert(dh_cdata != self._ffi.NULL) + dh_cdata = self._ffi.gc(dh_cdata, self._lib.DH_free) + + p = self._int_to_bn(p) + g = self._int_to_bn(g) + + if q is not None: + q = self._int_to_bn(q) + else: + q = self._ffi.NULL + + res = self._lib.DH_set0_pqg(dh_cdata, p, q, g) + self.openssl_assert(res == 1) + + codes = self._ffi.new("int[]", 1) + res = self._lib.Cryptography_DH_check(dh_cdata, codes) + self.openssl_assert(res == 1) + + return codes[0] == 0 + + def dh_x942_serialization_supported(self): + return self._lib.Cryptography_HAS_EVP_PKEY_DHX == 1 + + def x509_name_bytes(self, name): + x509_name = _encode_name_gc(self, name) + pp = self._ffi.new("unsigned char **") + res = self._lib.i2d_X509_NAME(x509_name, pp) + self.openssl_assert(pp[0] != self._ffi.NULL) + pp = self._ffi.gc( + pp, lambda pointer: self._lib.OPENSSL_free(pointer[0]) + ) + self.openssl_assert(res > 0) + return self._ffi.buffer(pp[0], res)[:] + + def x25519_load_public_bytes(self, data): + # When we drop support for CRYPTOGRAPHY_OPENSSL_LESS_THAN_111 we can + # switch this to EVP_PKEY_new_raw_public_key + if len(data) != 32: + raise ValueError("An X25519 public key is 32 bytes long") + + evp_pkey = self._create_evp_pkey_gc() + res = self._lib.EVP_PKEY_set_type(evp_pkey, self._lib.NID_X25519) + backend.openssl_assert(res == 1) + res = self._lib.EVP_PKEY_set1_tls_encodedpoint( + evp_pkey, data, len(data) + ) + backend.openssl_assert(res == 1) + return _X25519PublicKey(self, evp_pkey) + + def x25519_load_private_bytes(self, data): + # When we drop support for CRYPTOGRAPHY_OPENSSL_LESS_THAN_111 we can + # switch this to EVP_PKEY_new_raw_private_key and drop the + # zeroed_bytearray garbage. + # OpenSSL only has facilities for loading PKCS8 formatted private + # keys using the algorithm identifiers specified in + # https://tools.ietf.org/html/draft-ietf-curdle-pkix-09. + # This is the standard PKCS8 prefix for a 32 byte X25519 key. + # The form is: + # 0:d=0 hl=2 l= 46 cons: SEQUENCE + # 2:d=1 hl=2 l= 1 prim: INTEGER :00 + # 5:d=1 hl=2 l= 5 cons: SEQUENCE + # 7:d=2 hl=2 l= 3 prim: OBJECT :1.3.101.110 + # 12:d=1 hl=2 l= 34 prim: OCTET STRING (the key) + # Of course there's a bit more complexity. In reality OCTET STRING + # contains an OCTET STRING of length 32! So the last two bytes here + # are \x04\x20, which is an OCTET STRING of length 32. + if len(data) != 32: + raise ValueError("An X25519 private key is 32 bytes long") + + pkcs8_prefix = b'0.\x02\x01\x000\x05\x06\x03+en\x04"\x04 ' + with self._zeroed_bytearray(48) as ba: + ba[0:16] = pkcs8_prefix + ba[16:] = data + bio = self._bytes_to_bio(ba) + evp_pkey = backend._lib.d2i_PrivateKey_bio(bio.bio, self._ffi.NULL) + + self.openssl_assert(evp_pkey != self._ffi.NULL) + evp_pkey = self._ffi.gc(evp_pkey, self._lib.EVP_PKEY_free) + self.openssl_assert( + self._lib.EVP_PKEY_id(evp_pkey) == self._lib.EVP_PKEY_X25519 + ) + return _X25519PrivateKey(self, evp_pkey) + + def _evp_pkey_keygen_gc(self, nid): + evp_pkey_ctx = self._lib.EVP_PKEY_CTX_new_id(nid, self._ffi.NULL) + self.openssl_assert(evp_pkey_ctx != self._ffi.NULL) + evp_pkey_ctx = self._ffi.gc(evp_pkey_ctx, self._lib.EVP_PKEY_CTX_free) + res = self._lib.EVP_PKEY_keygen_init(evp_pkey_ctx) + self.openssl_assert(res == 1) + evp_ppkey = self._ffi.new("EVP_PKEY **") + res = self._lib.EVP_PKEY_keygen(evp_pkey_ctx, evp_ppkey) + self.openssl_assert(res == 1) + self.openssl_assert(evp_ppkey[0] != self._ffi.NULL) + evp_pkey = self._ffi.gc(evp_ppkey[0], self._lib.EVP_PKEY_free) + return evp_pkey + + def x25519_generate_key(self): + evp_pkey = self._evp_pkey_keygen_gc(self._lib.NID_X25519) + return _X25519PrivateKey(self, evp_pkey) + + def x25519_supported(self): + return self._lib.CRYPTOGRAPHY_OPENSSL_110_OR_GREATER + + def x448_load_public_bytes(self, data): + if len(data) != 56: + raise ValueError("An X448 public key is 56 bytes long") + + evp_pkey = self._lib.EVP_PKEY_new_raw_public_key( + self._lib.NID_X448, self._ffi.NULL, data, len(data) + ) + self.openssl_assert(evp_pkey != self._ffi.NULL) + evp_pkey = self._ffi.gc(evp_pkey, self._lib.EVP_PKEY_free) + return _X448PublicKey(self, evp_pkey) + + def x448_load_private_bytes(self, data): + if len(data) != 56: + raise ValueError("An X448 private key is 56 bytes long") + + data_ptr = self._ffi.from_buffer(data) + evp_pkey = self._lib.EVP_PKEY_new_raw_private_key( + self._lib.NID_X448, self._ffi.NULL, data_ptr, len(data) + ) + self.openssl_assert(evp_pkey != self._ffi.NULL) + evp_pkey = self._ffi.gc(evp_pkey, self._lib.EVP_PKEY_free) + return _X448PrivateKey(self, evp_pkey) + + def x448_generate_key(self): + evp_pkey = self._evp_pkey_keygen_gc(self._lib.NID_X448) + return _X448PrivateKey(self, evp_pkey) + + def x448_supported(self): + return not self._lib.CRYPTOGRAPHY_OPENSSL_LESS_THAN_111 + + def ed25519_supported(self): + return not self._lib.CRYPTOGRAPHY_OPENSSL_LESS_THAN_111B + + def ed25519_load_public_bytes(self, data): + utils._check_bytes("data", data) + + if len(data) != ed25519._ED25519_KEY_SIZE: + raise ValueError("An Ed25519 public key is 32 bytes long") + + evp_pkey = self._lib.EVP_PKEY_new_raw_public_key( + self._lib.NID_ED25519, self._ffi.NULL, data, len(data) + ) + self.openssl_assert(evp_pkey != self._ffi.NULL) + evp_pkey = self._ffi.gc(evp_pkey, self._lib.EVP_PKEY_free) + + return _Ed25519PublicKey(self, evp_pkey) + + def ed25519_load_private_bytes(self, data): + if len(data) != ed25519._ED25519_KEY_SIZE: + raise ValueError("An Ed25519 private key is 32 bytes long") + + utils._check_byteslike("data", data) + data_ptr = self._ffi.from_buffer(data) + evp_pkey = self._lib.EVP_PKEY_new_raw_private_key( + self._lib.NID_ED25519, self._ffi.NULL, data_ptr, len(data) + ) + self.openssl_assert(evp_pkey != self._ffi.NULL) + evp_pkey = self._ffi.gc(evp_pkey, self._lib.EVP_PKEY_free) + + return _Ed25519PrivateKey(self, evp_pkey) + + def ed25519_generate_key(self): + evp_pkey = self._evp_pkey_keygen_gc(self._lib.NID_ED25519) + return _Ed25519PrivateKey(self, evp_pkey) + + def ed448_supported(self): + return not self._lib.CRYPTOGRAPHY_OPENSSL_LESS_THAN_111B + + def ed448_load_public_bytes(self, data): + utils._check_bytes("data", data) + if len(data) != _ED448_KEY_SIZE: + raise ValueError("An Ed448 public key is 57 bytes long") + + evp_pkey = self._lib.EVP_PKEY_new_raw_public_key( + self._lib.NID_ED448, self._ffi.NULL, data, len(data) + ) + self.openssl_assert(evp_pkey != self._ffi.NULL) + evp_pkey = self._ffi.gc(evp_pkey, self._lib.EVP_PKEY_free) + + return _Ed448PublicKey(self, evp_pkey) + + def ed448_load_private_bytes(self, data): + utils._check_byteslike("data", data) + if len(data) != _ED448_KEY_SIZE: + raise ValueError("An Ed448 private key is 57 bytes long") + + data_ptr = self._ffi.from_buffer(data) + evp_pkey = self._lib.EVP_PKEY_new_raw_private_key( + self._lib.NID_ED448, self._ffi.NULL, data_ptr, len(data) + ) + self.openssl_assert(evp_pkey != self._ffi.NULL) + evp_pkey = self._ffi.gc(evp_pkey, self._lib.EVP_PKEY_free) + + return _Ed448PrivateKey(self, evp_pkey) + + def ed448_generate_key(self): + evp_pkey = self._evp_pkey_keygen_gc(self._lib.NID_ED448) + return _Ed448PrivateKey(self, evp_pkey) + + def derive_scrypt(self, key_material, salt, length, n, r, p): + buf = self._ffi.new("unsigned char[]", length) + key_material_ptr = self._ffi.from_buffer(key_material) + res = self._lib.EVP_PBE_scrypt( + key_material_ptr, len(key_material), salt, len(salt), n, r, p, + scrypt._MEM_LIMIT, buf, length + ) + if res != 1: + errors = self._consume_errors() + if not self._lib.CRYPTOGRAPHY_OPENSSL_LESS_THAN_111: + # This error is only added to the stack in 1.1.1+ + self.openssl_assert( + errors[0]._lib_reason_match( + self._lib.ERR_LIB_EVP, + self._lib.ERR_R_MALLOC_FAILURE + ) or + errors[0]._lib_reason_match( + self._lib.ERR_LIB_EVP, + self._lib.EVP_R_MEMORY_LIMIT_EXCEEDED + ) + ) + + # memory required formula explained here: + # https://blog.filippo.io/the-scrypt-parameters/ + min_memory = 128 * n * r // (1024**2) + raise MemoryError( + "Not enough memory to derive key. These parameters require" + " {} MB of memory.".format(min_memory) + ) + return self._ffi.buffer(buf)[:] + + def aead_cipher_supported(self, cipher): + cipher_name = aead._aead_cipher_name(cipher) + return ( + self._lib.EVP_get_cipherbyname(cipher_name) != self._ffi.NULL + ) + + @contextlib.contextmanager + def _zeroed_bytearray(self, length): + """ + This method creates a bytearray, which we copy data into (hopefully + also from a mutable buffer that can be dynamically erased!), and then + zero when we're done. + """ + ba = bytearray(length) + try: + yield ba + finally: + self._zero_data(ba, length) + + def _zero_data(self, data, length): + # We clear things this way because at the moment we're not + # sure of a better way that can guarantee it overwrites the + # memory of a bytearray and doesn't just replace the underlying char *. + for i in range(length): + data[i] = 0 + + @contextlib.contextmanager + def _zeroed_null_terminated_buf(self, data): + """ + This method takes bytes, which can be a bytestring or a mutable + buffer like a bytearray, and yields a null-terminated version of that + data. This is required because PKCS12_parse doesn't take a length with + its password char * and ffi.from_buffer doesn't provide null + termination. So, to support zeroing the data via bytearray we + need to build this ridiculous construct that copies the memory, but + zeroes it after use. + """ + if data is None: + yield self._ffi.NULL + else: + data_len = len(data) + buf = self._ffi.new("char[]", data_len + 1) + self._ffi.memmove(buf, data, data_len) + try: + yield buf + finally: + # Cast to a uint8_t * so we can assign by integer + self._zero_data(self._ffi.cast("uint8_t *", buf), data_len) + + def load_key_and_certificates_from_pkcs12(self, data, password): + if password is not None: + utils._check_byteslike("password", password) + + bio = self._bytes_to_bio(data) + p12 = self._lib.d2i_PKCS12_bio(bio.bio, self._ffi.NULL) + if p12 == self._ffi.NULL: + self._consume_errors() + raise ValueError("Could not deserialize PKCS12 data") + + p12 = self._ffi.gc(p12, self._lib.PKCS12_free) + evp_pkey_ptr = self._ffi.new("EVP_PKEY **") + x509_ptr = self._ffi.new("X509 **") + sk_x509_ptr = self._ffi.new("Cryptography_STACK_OF_X509 **") + with self._zeroed_null_terminated_buf(password) as password_buf: + res = self._lib.PKCS12_parse( + p12, password_buf, evp_pkey_ptr, x509_ptr, sk_x509_ptr + ) + + if res == 0: + self._consume_errors() + raise ValueError("Invalid password or PKCS12 data") + + cert = None + key = None + additional_certificates = [] + + if evp_pkey_ptr[0] != self._ffi.NULL: + evp_pkey = self._ffi.gc(evp_pkey_ptr[0], self._lib.EVP_PKEY_free) + key = self._evp_pkey_to_private_key(evp_pkey) + + if x509_ptr[0] != self._ffi.NULL: + x509 = self._ffi.gc(x509_ptr[0], self._lib.X509_free) + cert = _Certificate(self, x509) + + if sk_x509_ptr[0] != self._ffi.NULL: + sk_x509 = self._ffi.gc(sk_x509_ptr[0], self._lib.sk_X509_free) + num = self._lib.sk_X509_num(sk_x509_ptr[0]) + for i in range(num): + x509 = self._lib.sk_X509_value(sk_x509, i) + x509 = self._ffi.gc(x509, self._lib.X509_free) + self.openssl_assert(x509 != self._ffi.NULL) + additional_certificates.append(_Certificate(self, x509)) + + return (key, cert, additional_certificates) + + def poly1305_supported(self): + return self._lib.Cryptography_HAS_POLY1305 == 1 + + def create_poly1305_ctx(self, key): + utils._check_byteslike("key", key) + if len(key) != _POLY1305_KEY_SIZE: + raise ValueError("A poly1305 key is 32 bytes long") + + return _Poly1305Context(self, key) + + +class GetCipherByName(object): + def __init__(self, fmt): + self._fmt = fmt + + def __call__(self, backend, cipher, mode): + cipher_name = self._fmt.format(cipher=cipher, mode=mode).lower() + return backend._lib.EVP_get_cipherbyname(cipher_name.encode("ascii")) + + +def _get_xts_cipher(backend, cipher, mode): + cipher_name = "aes-{}-xts".format(cipher.key_size // 2) + return backend._lib.EVP_get_cipherbyname(cipher_name.encode("ascii")) + + +backend = Backend() diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/backends/openssl/ciphers.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/backends/openssl/ciphers.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/backends/openssl/ciphers.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/backends/openssl/ciphers.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,229 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +from cryptography import utils +from cryptography.exceptions import InvalidTag, UnsupportedAlgorithm, _Reasons +from cryptography.hazmat.primitives import ciphers +from cryptography.hazmat.primitives.ciphers import modes + + +@utils.register_interface(ciphers.CipherContext) +@utils.register_interface(ciphers.AEADCipherContext) +@utils.register_interface(ciphers.AEADEncryptionContext) +@utils.register_interface(ciphers.AEADDecryptionContext) +class _CipherContext(object): + _ENCRYPT = 1 + _DECRYPT = 0 + + def __init__(self, backend, cipher, mode, operation): + self._backend = backend + self._cipher = cipher + self._mode = mode + self._operation = operation + self._tag = None + + if isinstance(self._cipher, ciphers.BlockCipherAlgorithm): + self._block_size_bytes = self._cipher.block_size // 8 + else: + self._block_size_bytes = 1 + + ctx = self._backend._lib.EVP_CIPHER_CTX_new() + ctx = self._backend._ffi.gc( + ctx, self._backend._lib.EVP_CIPHER_CTX_free + ) + + registry = self._backend._cipher_registry + try: + adapter = registry[type(cipher), type(mode)] + except KeyError: + raise UnsupportedAlgorithm( + "cipher {} in {} mode is not supported " + "by this backend.".format( + cipher.name, mode.name if mode else mode), + _Reasons.UNSUPPORTED_CIPHER + ) + + evp_cipher = adapter(self._backend, cipher, mode) + if evp_cipher == self._backend._ffi.NULL: + msg = "cipher {0.name} ".format(cipher) + if mode is not None: + msg += "in {0.name} mode ".format(mode) + msg += ( + "is not supported by this backend (Your version of OpenSSL " + "may be too old. Current version: {}.)" + ).format(self._backend.openssl_version_text()) + raise UnsupportedAlgorithm(msg, _Reasons.UNSUPPORTED_CIPHER) + + if isinstance(mode, modes.ModeWithInitializationVector): + iv_nonce = self._backend._ffi.from_buffer( + mode.initialization_vector + ) + elif isinstance(mode, modes.ModeWithTweak): + iv_nonce = self._backend._ffi.from_buffer(mode.tweak) + elif isinstance(mode, modes.ModeWithNonce): + iv_nonce = self._backend._ffi.from_buffer(mode.nonce) + elif isinstance(cipher, modes.ModeWithNonce): + iv_nonce = self._backend._ffi.from_buffer(cipher.nonce) + else: + iv_nonce = self._backend._ffi.NULL + # begin init with cipher and operation type + res = self._backend._lib.EVP_CipherInit_ex(ctx, evp_cipher, + self._backend._ffi.NULL, + self._backend._ffi.NULL, + self._backend._ffi.NULL, + operation) + self._backend.openssl_assert(res != 0) + # set the key length to handle variable key ciphers + res = self._backend._lib.EVP_CIPHER_CTX_set_key_length( + ctx, len(cipher.key) + ) + self._backend.openssl_assert(res != 0) + if isinstance(mode, modes.GCM): + res = self._backend._lib.EVP_CIPHER_CTX_ctrl( + ctx, self._backend._lib.EVP_CTRL_AEAD_SET_IVLEN, + len(iv_nonce), self._backend._ffi.NULL + ) + self._backend.openssl_assert(res != 0) + if mode.tag is not None: + res = self._backend._lib.EVP_CIPHER_CTX_ctrl( + ctx, self._backend._lib.EVP_CTRL_AEAD_SET_TAG, + len(mode.tag), mode.tag + ) + self._backend.openssl_assert(res != 0) + self._tag = mode.tag + elif ( + self._operation == self._DECRYPT and + self._backend._lib.CRYPTOGRAPHY_OPENSSL_LESS_THAN_102 and + not self._backend._lib.CRYPTOGRAPHY_IS_LIBRESSL + ): + raise NotImplementedError( + "delayed passing of GCM tag requires OpenSSL >= 1.0.2." + " To use this feature please update OpenSSL" + ) + + # pass key/iv + res = self._backend._lib.EVP_CipherInit_ex( + ctx, + self._backend._ffi.NULL, + self._backend._ffi.NULL, + self._backend._ffi.from_buffer(cipher.key), + iv_nonce, + operation + ) + self._backend.openssl_assert(res != 0) + # We purposely disable padding here as it's handled higher up in the + # API. + self._backend._lib.EVP_CIPHER_CTX_set_padding(ctx, 0) + self._ctx = ctx + + def update(self, data): + buf = bytearray(len(data) + self._block_size_bytes - 1) + n = self.update_into(data, buf) + return bytes(buf[:n]) + + def update_into(self, data, buf): + if len(buf) < (len(data) + self._block_size_bytes - 1): + raise ValueError( + "buffer must be at least {} bytes for this " + "payload".format(len(data) + self._block_size_bytes - 1) + ) + + buf = self._backend._ffi.cast( + "unsigned char *", self._backend._ffi.from_buffer(buf) + ) + outlen = self._backend._ffi.new("int *") + res = self._backend._lib.EVP_CipherUpdate( + self._ctx, buf, outlen, + self._backend._ffi.from_buffer(data), len(data) + ) + self._backend.openssl_assert(res != 0) + return outlen[0] + + def finalize(self): + # OpenSSL 1.0.1 on Ubuntu 12.04 (and possibly other distributions) + # appears to have a bug where you must make at least one call to update + # even if you are only using authenticate_additional_data or the + # GCM tag will be wrong. An (empty) call to update resolves this + # and is harmless for all other versions of OpenSSL. + if isinstance(self._mode, modes.GCM): + self.update(b"") + + if ( + self._operation == self._DECRYPT and + isinstance(self._mode, modes.ModeWithAuthenticationTag) and + self.tag is None + ): + raise ValueError( + "Authentication tag must be provided when decrypting." + ) + + buf = self._backend._ffi.new("unsigned char[]", self._block_size_bytes) + outlen = self._backend._ffi.new("int *") + res = self._backend._lib.EVP_CipherFinal_ex(self._ctx, buf, outlen) + if res == 0: + errors = self._backend._consume_errors() + + if not errors and isinstance(self._mode, modes.GCM): + raise InvalidTag + + self._backend.openssl_assert( + errors[0]._lib_reason_match( + self._backend._lib.ERR_LIB_EVP, + self._backend._lib.EVP_R_DATA_NOT_MULTIPLE_OF_BLOCK_LENGTH + ) + ) + raise ValueError( + "The length of the provided data is not a multiple of " + "the block length." + ) + + if (isinstance(self._mode, modes.GCM) and + self._operation == self._ENCRYPT): + tag_buf = self._backend._ffi.new( + "unsigned char[]", self._block_size_bytes + ) + res = self._backend._lib.EVP_CIPHER_CTX_ctrl( + self._ctx, self._backend._lib.EVP_CTRL_AEAD_GET_TAG, + self._block_size_bytes, tag_buf + ) + self._backend.openssl_assert(res != 0) + self._tag = self._backend._ffi.buffer(tag_buf)[:] + + res = self._backend._lib.EVP_CIPHER_CTX_cleanup(self._ctx) + self._backend.openssl_assert(res == 1) + return self._backend._ffi.buffer(buf)[:outlen[0]] + + def finalize_with_tag(self, tag): + if ( + self._backend._lib.CRYPTOGRAPHY_OPENSSL_LESS_THAN_102 and + not self._backend._lib.CRYPTOGRAPHY_IS_LIBRESSL + ): + raise NotImplementedError( + "finalize_with_tag requires OpenSSL >= 1.0.2. To use this " + "method please update OpenSSL" + ) + if len(tag) < self._mode._min_tag_length: + raise ValueError( + "Authentication tag must be {} bytes or longer.".format( + self._mode._min_tag_length) + ) + res = self._backend._lib.EVP_CIPHER_CTX_ctrl( + self._ctx, self._backend._lib.EVP_CTRL_AEAD_SET_TAG, + len(tag), tag + ) + self._backend.openssl_assert(res != 0) + self._tag = tag + return self.finalize() + + def authenticate_additional_data(self, data): + outlen = self._backend._ffi.new("int *") + res = self._backend._lib.EVP_CipherUpdate( + self._ctx, self._backend._ffi.NULL, outlen, + self._backend._ffi.from_buffer(data), len(data) + ) + self._backend.openssl_assert(res != 0) + + tag = utils.read_only_property("_tag") diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/backends/openssl/cmac.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/backends/openssl/cmac.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/backends/openssl/cmac.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/backends/openssl/cmac.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,81 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + + +from cryptography import utils +from cryptography.exceptions import ( + InvalidSignature, UnsupportedAlgorithm, _Reasons +) +from cryptography.hazmat.primitives import constant_time +from cryptography.hazmat.primitives.ciphers.modes import CBC + + +class _CMACContext(object): + def __init__(self, backend, algorithm, ctx=None): + if not backend.cmac_algorithm_supported(algorithm): + raise UnsupportedAlgorithm("This backend does not support CMAC.", + _Reasons.UNSUPPORTED_CIPHER) + + self._backend = backend + self._key = algorithm.key + self._algorithm = algorithm + self._output_length = algorithm.block_size // 8 + + if ctx is None: + registry = self._backend._cipher_registry + adapter = registry[type(algorithm), CBC] + + evp_cipher = adapter(self._backend, algorithm, CBC) + + ctx = self._backend._lib.CMAC_CTX_new() + + self._backend.openssl_assert(ctx != self._backend._ffi.NULL) + ctx = self._backend._ffi.gc(ctx, self._backend._lib.CMAC_CTX_free) + + key_ptr = self._backend._ffi.from_buffer(self._key) + res = self._backend._lib.CMAC_Init( + ctx, key_ptr, len(self._key), + evp_cipher, self._backend._ffi.NULL + ) + self._backend.openssl_assert(res == 1) + + self._ctx = ctx + + algorithm = utils.read_only_property("_algorithm") + + def update(self, data): + res = self._backend._lib.CMAC_Update(self._ctx, data, len(data)) + self._backend.openssl_assert(res == 1) + + def finalize(self): + buf = self._backend._ffi.new("unsigned char[]", self._output_length) + length = self._backend._ffi.new("size_t *", self._output_length) + res = self._backend._lib.CMAC_Final( + self._ctx, buf, length + ) + self._backend.openssl_assert(res == 1) + + self._ctx = None + + return self._backend._ffi.buffer(buf)[:] + + def copy(self): + copied_ctx = self._backend._lib.CMAC_CTX_new() + copied_ctx = self._backend._ffi.gc( + copied_ctx, self._backend._lib.CMAC_CTX_free + ) + res = self._backend._lib.CMAC_CTX_copy( + copied_ctx, self._ctx + ) + self._backend.openssl_assert(res == 1) + return _CMACContext( + self._backend, self._algorithm, ctx=copied_ctx + ) + + def verify(self, signature): + digest = self.finalize() + if not constant_time.bytes_eq(digest, signature): + raise InvalidSignature("Signature did not match digest.") diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/backends/openssl/decode_asn1.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/backends/openssl/decode_asn1.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/backends/openssl/decode_asn1.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/backends/openssl/decode_asn1.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,899 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +import datetime +import ipaddress + +import asn1crypto.core + +import six + +from cryptography import x509 +from cryptography.x509.extensions import _TLS_FEATURE_TYPE_TO_ENUM +from cryptography.x509.name import _ASN1_TYPE_TO_ENUM +from cryptography.x509.oid import ( + CRLEntryExtensionOID, CertificatePoliciesOID, ExtensionOID, + OCSPExtensionOID, +) + + +class _Integers(asn1crypto.core.SequenceOf): + _child_spec = asn1crypto.core.Integer + + +def _obj2txt(backend, obj): + # Set to 80 on the recommendation of + # https://www.openssl.org/docs/crypto/OBJ_nid2ln.html#return_values + # + # But OIDs longer than this occur in real life (e.g. Active + # Directory makes some very long OIDs). So we need to detect + # and properly handle the case where the default buffer is not + # big enough. + # + buf_len = 80 + buf = backend._ffi.new("char[]", buf_len) + + # 'res' is the number of bytes that *would* be written if the + # buffer is large enough. If 'res' > buf_len - 1, we need to + # alloc a big-enough buffer and go again. + res = backend._lib.OBJ_obj2txt(buf, buf_len, obj, 1) + if res > buf_len - 1: # account for terminating null byte + buf_len = res + 1 + buf = backend._ffi.new("char[]", buf_len) + res = backend._lib.OBJ_obj2txt(buf, buf_len, obj, 1) + backend.openssl_assert(res > 0) + return backend._ffi.buffer(buf, res)[:].decode() + + +def _decode_x509_name_entry(backend, x509_name_entry): + obj = backend._lib.X509_NAME_ENTRY_get_object(x509_name_entry) + backend.openssl_assert(obj != backend._ffi.NULL) + data = backend._lib.X509_NAME_ENTRY_get_data(x509_name_entry) + backend.openssl_assert(data != backend._ffi.NULL) + value = _asn1_string_to_utf8(backend, data) + oid = _obj2txt(backend, obj) + type = _ASN1_TYPE_TO_ENUM[data.type] + + return x509.NameAttribute(x509.ObjectIdentifier(oid), value, type) + + +def _decode_x509_name(backend, x509_name): + count = backend._lib.X509_NAME_entry_count(x509_name) + attributes = [] + prev_set_id = -1 + for x in range(count): + entry = backend._lib.X509_NAME_get_entry(x509_name, x) + attribute = _decode_x509_name_entry(backend, entry) + set_id = backend._lib.Cryptography_X509_NAME_ENTRY_set(entry) + if set_id != prev_set_id: + attributes.append(set([attribute])) + else: + # is in the same RDN a previous entry + attributes[-1].add(attribute) + prev_set_id = set_id + + return x509.Name(x509.RelativeDistinguishedName(rdn) for rdn in attributes) + + +def _decode_general_names(backend, gns): + num = backend._lib.sk_GENERAL_NAME_num(gns) + names = [] + for i in range(num): + gn = backend._lib.sk_GENERAL_NAME_value(gns, i) + backend.openssl_assert(gn != backend._ffi.NULL) + names.append(_decode_general_name(backend, gn)) + + return names + + +def _decode_general_name(backend, gn): + if gn.type == backend._lib.GEN_DNS: + # Convert to bytes and then decode to utf8. We don't use + # asn1_string_to_utf8 here because it doesn't properly convert + # utf8 from ia5strings. + data = _asn1_string_to_bytes(backend, gn.d.dNSName).decode("utf8") + # We don't use the constructor for DNSName so we can bypass validation + # This allows us to create DNSName objects that have unicode chars + # when a certificate (against the RFC) contains them. + return x509.DNSName._init_without_validation(data) + elif gn.type == backend._lib.GEN_URI: + # Convert to bytes and then decode to utf8. We don't use + # asn1_string_to_utf8 here because it doesn't properly convert + # utf8 from ia5strings. + data = _asn1_string_to_bytes( + backend, gn.d.uniformResourceIdentifier + ).decode("utf8") + # We don't use the constructor for URI so we can bypass validation + # This allows us to create URI objects that have unicode chars + # when a certificate (against the RFC) contains them. + return x509.UniformResourceIdentifier._init_without_validation(data) + elif gn.type == backend._lib.GEN_RID: + oid = _obj2txt(backend, gn.d.registeredID) + return x509.RegisteredID(x509.ObjectIdentifier(oid)) + elif gn.type == backend._lib.GEN_IPADD: + data = _asn1_string_to_bytes(backend, gn.d.iPAddress) + data_len = len(data) + if data_len == 8 or data_len == 32: + # This is an IPv4 or IPv6 Network and not a single IP. This + # type of data appears in Name Constraints. Unfortunately, + # ipaddress doesn't support packed bytes + netmask. Additionally, + # IPv6Network can only handle CIDR rather than the full 16 byte + # netmask. To handle this we convert the netmask to integer, then + # find the first 0 bit, which will be the prefix. If another 1 + # bit is present after that the netmask is invalid. + base = ipaddress.ip_address(data[:data_len // 2]) + netmask = ipaddress.ip_address(data[data_len // 2:]) + bits = bin(int(netmask))[2:] + prefix = bits.find('0') + # If no 0 bits are found it is a /32 or /128 + if prefix == -1: + prefix = len(bits) + + if "1" in bits[prefix:]: + raise ValueError("Invalid netmask") + + ip = ipaddress.ip_network(base.exploded + u"/{}".format(prefix)) + else: + ip = ipaddress.ip_address(data) + + return x509.IPAddress(ip) + elif gn.type == backend._lib.GEN_DIRNAME: + return x509.DirectoryName( + _decode_x509_name(backend, gn.d.directoryName) + ) + elif gn.type == backend._lib.GEN_EMAIL: + # Convert to bytes and then decode to utf8. We don't use + # asn1_string_to_utf8 here because it doesn't properly convert + # utf8 from ia5strings. + data = _asn1_string_to_bytes(backend, gn.d.rfc822Name).decode("utf8") + # We don't use the constructor for RFC822Name so we can bypass + # validation. This allows us to create RFC822Name objects that have + # unicode chars when a certificate (against the RFC) contains them. + return x509.RFC822Name._init_without_validation(data) + elif gn.type == backend._lib.GEN_OTHERNAME: + type_id = _obj2txt(backend, gn.d.otherName.type_id) + value = _asn1_to_der(backend, gn.d.otherName.value) + return x509.OtherName(x509.ObjectIdentifier(type_id), value) + else: + # x400Address or ediPartyName + raise x509.UnsupportedGeneralNameType( + "{} is not a supported type".format( + x509._GENERAL_NAMES.get(gn.type, gn.type) + ), + gn.type + ) + + +def _decode_ocsp_no_check(backend, ext): + return x509.OCSPNoCheck() + + +def _decode_crl_number(backend, ext): + asn1_int = backend._ffi.cast("ASN1_INTEGER *", ext) + asn1_int = backend._ffi.gc(asn1_int, backend._lib.ASN1_INTEGER_free) + return x509.CRLNumber(_asn1_integer_to_int(backend, asn1_int)) + + +def _decode_delta_crl_indicator(backend, ext): + asn1_int = backend._ffi.cast("ASN1_INTEGER *", ext) + asn1_int = backend._ffi.gc(asn1_int, backend._lib.ASN1_INTEGER_free) + return x509.DeltaCRLIndicator(_asn1_integer_to_int(backend, asn1_int)) + + +class _X509ExtensionParser(object): + def __init__(self, ext_count, get_ext, handlers): + self.ext_count = ext_count + self.get_ext = get_ext + self.handlers = handlers + + def parse(self, backend, x509_obj): + extensions = [] + seen_oids = set() + for i in range(self.ext_count(backend, x509_obj)): + ext = self.get_ext(backend, x509_obj, i) + backend.openssl_assert(ext != backend._ffi.NULL) + crit = backend._lib.X509_EXTENSION_get_critical(ext) + critical = crit == 1 + oid = x509.ObjectIdentifier( + _obj2txt(backend, backend._lib.X509_EXTENSION_get_object(ext)) + ) + if oid in seen_oids: + raise x509.DuplicateExtension( + "Duplicate {} extension found".format(oid), oid + ) + + # These OIDs are only supported in OpenSSL 1.1.0+ but we want + # to support them in all versions of OpenSSL so we decode them + # ourselves. + if oid == ExtensionOID.TLS_FEATURE: + data = backend._lib.X509_EXTENSION_get_data(ext) + parsed = _Integers.load(_asn1_string_to_bytes(backend, data)) + value = x509.TLSFeature( + [_TLS_FEATURE_TYPE_TO_ENUM[x.native] for x in parsed] + ) + extensions.append(x509.Extension(oid, critical, value)) + seen_oids.add(oid) + continue + elif oid == ExtensionOID.PRECERT_POISON: + data = backend._lib.X509_EXTENSION_get_data(ext) + parsed = asn1crypto.core.Null.load( + _asn1_string_to_bytes(backend, data) + ) + assert parsed == asn1crypto.core.Null() + extensions.append(x509.Extension( + oid, critical, x509.PrecertPoison() + )) + seen_oids.add(oid) + continue + + try: + handler = self.handlers[oid] + except KeyError: + # Dump the DER payload into an UnrecognizedExtension object + data = backend._lib.X509_EXTENSION_get_data(ext) + backend.openssl_assert(data != backend._ffi.NULL) + der = backend._ffi.buffer(data.data, data.length)[:] + unrecognized = x509.UnrecognizedExtension(oid, der) + extensions.append( + x509.Extension(oid, critical, unrecognized) + ) + else: + ext_data = backend._lib.X509V3_EXT_d2i(ext) + if ext_data == backend._ffi.NULL: + backend._consume_errors() + raise ValueError( + "The {} extension is invalid and can't be " + "parsed".format(oid) + ) + + value = handler(backend, ext_data) + extensions.append(x509.Extension(oid, critical, value)) + + seen_oids.add(oid) + + return x509.Extensions(extensions) + + +def _decode_certificate_policies(backend, cp): + cp = backend._ffi.cast("Cryptography_STACK_OF_POLICYINFO *", cp) + cp = backend._ffi.gc(cp, backend._lib.CERTIFICATEPOLICIES_free) + + num = backend._lib.sk_POLICYINFO_num(cp) + certificate_policies = [] + for i in range(num): + qualifiers = None + pi = backend._lib.sk_POLICYINFO_value(cp, i) + oid = x509.ObjectIdentifier(_obj2txt(backend, pi.policyid)) + if pi.qualifiers != backend._ffi.NULL: + qnum = backend._lib.sk_POLICYQUALINFO_num(pi.qualifiers) + qualifiers = [] + for j in range(qnum): + pqi = backend._lib.sk_POLICYQUALINFO_value( + pi.qualifiers, j + ) + pqualid = x509.ObjectIdentifier( + _obj2txt(backend, pqi.pqualid) + ) + if pqualid == CertificatePoliciesOID.CPS_QUALIFIER: + cpsuri = backend._ffi.buffer( + pqi.d.cpsuri.data, pqi.d.cpsuri.length + )[:].decode('ascii') + qualifiers.append(cpsuri) + else: + assert pqualid == CertificatePoliciesOID.CPS_USER_NOTICE + user_notice = _decode_user_notice( + backend, pqi.d.usernotice + ) + qualifiers.append(user_notice) + + certificate_policies.append( + x509.PolicyInformation(oid, qualifiers) + ) + + return x509.CertificatePolicies(certificate_policies) + + +def _decode_user_notice(backend, un): + explicit_text = None + notice_reference = None + + if un.exptext != backend._ffi.NULL: + explicit_text = _asn1_string_to_utf8(backend, un.exptext) + + if un.noticeref != backend._ffi.NULL: + organization = _asn1_string_to_utf8( + backend, un.noticeref.organization + ) + + num = backend._lib.sk_ASN1_INTEGER_num( + un.noticeref.noticenos + ) + notice_numbers = [] + for i in range(num): + asn1_int = backend._lib.sk_ASN1_INTEGER_value( + un.noticeref.noticenos, i + ) + notice_num = _asn1_integer_to_int(backend, asn1_int) + notice_numbers.append(notice_num) + + notice_reference = x509.NoticeReference( + organization, notice_numbers + ) + + return x509.UserNotice(notice_reference, explicit_text) + + +def _decode_basic_constraints(backend, bc_st): + basic_constraints = backend._ffi.cast("BASIC_CONSTRAINTS *", bc_st) + basic_constraints = backend._ffi.gc( + basic_constraints, backend._lib.BASIC_CONSTRAINTS_free + ) + # The byte representation of an ASN.1 boolean true is \xff. OpenSSL + # chooses to just map this to its ordinal value, so true is 255 and + # false is 0. + ca = basic_constraints.ca == 255 + path_length = _asn1_integer_to_int_or_none( + backend, basic_constraints.pathlen + ) + + return x509.BasicConstraints(ca, path_length) + + +def _decode_subject_key_identifier(backend, asn1_string): + asn1_string = backend._ffi.cast("ASN1_OCTET_STRING *", asn1_string) + asn1_string = backend._ffi.gc( + asn1_string, backend._lib.ASN1_OCTET_STRING_free + ) + return x509.SubjectKeyIdentifier( + backend._ffi.buffer(asn1_string.data, asn1_string.length)[:] + ) + + +def _decode_authority_key_identifier(backend, akid): + akid = backend._ffi.cast("AUTHORITY_KEYID *", akid) + akid = backend._ffi.gc(akid, backend._lib.AUTHORITY_KEYID_free) + key_identifier = None + authority_cert_issuer = None + + if akid.keyid != backend._ffi.NULL: + key_identifier = backend._ffi.buffer( + akid.keyid.data, akid.keyid.length + )[:] + + if akid.issuer != backend._ffi.NULL: + authority_cert_issuer = _decode_general_names( + backend, akid.issuer + ) + + authority_cert_serial_number = _asn1_integer_to_int_or_none( + backend, akid.serial + ) + + return x509.AuthorityKeyIdentifier( + key_identifier, authority_cert_issuer, authority_cert_serial_number + ) + + +def _decode_authority_information_access(backend, aia): + aia = backend._ffi.cast("Cryptography_STACK_OF_ACCESS_DESCRIPTION *", aia) + aia = backend._ffi.gc( + aia, + lambda x: backend._lib.sk_ACCESS_DESCRIPTION_pop_free( + x, backend._ffi.addressof( + backend._lib._original_lib, "ACCESS_DESCRIPTION_free" + ) + ) + ) + num = backend._lib.sk_ACCESS_DESCRIPTION_num(aia) + access_descriptions = [] + for i in range(num): + ad = backend._lib.sk_ACCESS_DESCRIPTION_value(aia, i) + backend.openssl_assert(ad.method != backend._ffi.NULL) + oid = x509.ObjectIdentifier(_obj2txt(backend, ad.method)) + backend.openssl_assert(ad.location != backend._ffi.NULL) + gn = _decode_general_name(backend, ad.location) + access_descriptions.append(x509.AccessDescription(oid, gn)) + + return x509.AuthorityInformationAccess(access_descriptions) + + +def _decode_key_usage(backend, bit_string): + bit_string = backend._ffi.cast("ASN1_BIT_STRING *", bit_string) + bit_string = backend._ffi.gc(bit_string, backend._lib.ASN1_BIT_STRING_free) + get_bit = backend._lib.ASN1_BIT_STRING_get_bit + digital_signature = get_bit(bit_string, 0) == 1 + content_commitment = get_bit(bit_string, 1) == 1 + key_encipherment = get_bit(bit_string, 2) == 1 + data_encipherment = get_bit(bit_string, 3) == 1 + key_agreement = get_bit(bit_string, 4) == 1 + key_cert_sign = get_bit(bit_string, 5) == 1 + crl_sign = get_bit(bit_string, 6) == 1 + encipher_only = get_bit(bit_string, 7) == 1 + decipher_only = get_bit(bit_string, 8) == 1 + return x509.KeyUsage( + digital_signature, + content_commitment, + key_encipherment, + data_encipherment, + key_agreement, + key_cert_sign, + crl_sign, + encipher_only, + decipher_only + ) + + +def _decode_general_names_extension(backend, gns): + gns = backend._ffi.cast("GENERAL_NAMES *", gns) + gns = backend._ffi.gc(gns, backend._lib.GENERAL_NAMES_free) + general_names = _decode_general_names(backend, gns) + return general_names + + +def _decode_subject_alt_name(backend, ext): + return x509.SubjectAlternativeName( + _decode_general_names_extension(backend, ext) + ) + + +def _decode_issuer_alt_name(backend, ext): + return x509.IssuerAlternativeName( + _decode_general_names_extension(backend, ext) + ) + + +def _decode_name_constraints(backend, nc): + nc = backend._ffi.cast("NAME_CONSTRAINTS *", nc) + nc = backend._ffi.gc(nc, backend._lib.NAME_CONSTRAINTS_free) + permitted = _decode_general_subtrees(backend, nc.permittedSubtrees) + excluded = _decode_general_subtrees(backend, nc.excludedSubtrees) + return x509.NameConstraints( + permitted_subtrees=permitted, excluded_subtrees=excluded + ) + + +def _decode_general_subtrees(backend, stack_subtrees): + if stack_subtrees == backend._ffi.NULL: + return None + + num = backend._lib.sk_GENERAL_SUBTREE_num(stack_subtrees) + subtrees = [] + + for i in range(num): + obj = backend._lib.sk_GENERAL_SUBTREE_value(stack_subtrees, i) + backend.openssl_assert(obj != backend._ffi.NULL) + name = _decode_general_name(backend, obj.base) + subtrees.append(name) + + return subtrees + + +def _decode_issuing_dist_point(backend, idp): + idp = backend._ffi.cast("ISSUING_DIST_POINT *", idp) + idp = backend._ffi.gc(idp, backend._lib.ISSUING_DIST_POINT_free) + if idp.distpoint != backend._ffi.NULL: + full_name, relative_name = _decode_distpoint(backend, idp.distpoint) + else: + full_name = None + relative_name = None + + only_user = idp.onlyuser == 255 + only_ca = idp.onlyCA == 255 + indirect_crl = idp.indirectCRL == 255 + only_attr = idp.onlyattr == 255 + if idp.onlysomereasons != backend._ffi.NULL: + only_some_reasons = _decode_reasons(backend, idp.onlysomereasons) + else: + only_some_reasons = None + + return x509.IssuingDistributionPoint( + full_name, relative_name, only_user, only_ca, only_some_reasons, + indirect_crl, only_attr + ) + + +def _decode_policy_constraints(backend, pc): + pc = backend._ffi.cast("POLICY_CONSTRAINTS *", pc) + pc = backend._ffi.gc(pc, backend._lib.POLICY_CONSTRAINTS_free) + + require_explicit_policy = _asn1_integer_to_int_or_none( + backend, pc.requireExplicitPolicy + ) + inhibit_policy_mapping = _asn1_integer_to_int_or_none( + backend, pc.inhibitPolicyMapping + ) + + return x509.PolicyConstraints( + require_explicit_policy, inhibit_policy_mapping + ) + + +def _decode_extended_key_usage(backend, sk): + sk = backend._ffi.cast("Cryptography_STACK_OF_ASN1_OBJECT *", sk) + sk = backend._ffi.gc(sk, backend._lib.sk_ASN1_OBJECT_free) + num = backend._lib.sk_ASN1_OBJECT_num(sk) + ekus = [] + + for i in range(num): + obj = backend._lib.sk_ASN1_OBJECT_value(sk, i) + backend.openssl_assert(obj != backend._ffi.NULL) + oid = x509.ObjectIdentifier(_obj2txt(backend, obj)) + ekus.append(oid) + + return x509.ExtendedKeyUsage(ekus) + + +_DISTPOINT_TYPE_FULLNAME = 0 +_DISTPOINT_TYPE_RELATIVENAME = 1 + + +def _decode_dist_points(backend, cdps): + cdps = backend._ffi.cast("Cryptography_STACK_OF_DIST_POINT *", cdps) + cdps = backend._ffi.gc(cdps, backend._lib.CRL_DIST_POINTS_free) + + num = backend._lib.sk_DIST_POINT_num(cdps) + dist_points = [] + for i in range(num): + full_name = None + relative_name = None + crl_issuer = None + reasons = None + cdp = backend._lib.sk_DIST_POINT_value(cdps, i) + if cdp.reasons != backend._ffi.NULL: + reasons = _decode_reasons(backend, cdp.reasons) + + if cdp.CRLissuer != backend._ffi.NULL: + crl_issuer = _decode_general_names(backend, cdp.CRLissuer) + + # Certificates may have a crl_issuer/reasons and no distribution + # point so make sure it's not null. + if cdp.distpoint != backend._ffi.NULL: + full_name, relative_name = _decode_distpoint( + backend, cdp.distpoint + ) + + dist_points.append( + x509.DistributionPoint( + full_name, relative_name, reasons, crl_issuer + ) + ) + + return dist_points + + +# ReasonFlags ::= BIT STRING { +# unused (0), +# keyCompromise (1), +# cACompromise (2), +# affiliationChanged (3), +# superseded (4), +# cessationOfOperation (5), +# certificateHold (6), +# privilegeWithdrawn (7), +# aACompromise (8) } +_REASON_BIT_MAPPING = { + 1: x509.ReasonFlags.key_compromise, + 2: x509.ReasonFlags.ca_compromise, + 3: x509.ReasonFlags.affiliation_changed, + 4: x509.ReasonFlags.superseded, + 5: x509.ReasonFlags.cessation_of_operation, + 6: x509.ReasonFlags.certificate_hold, + 7: x509.ReasonFlags.privilege_withdrawn, + 8: x509.ReasonFlags.aa_compromise, +} + + +def _decode_reasons(backend, reasons): + # We will check each bit from RFC 5280 + enum_reasons = [] + for bit_position, reason in six.iteritems(_REASON_BIT_MAPPING): + if backend._lib.ASN1_BIT_STRING_get_bit(reasons, bit_position): + enum_reasons.append(reason) + + return frozenset(enum_reasons) + + +def _decode_distpoint(backend, distpoint): + if distpoint.type == _DISTPOINT_TYPE_FULLNAME: + full_name = _decode_general_names(backend, distpoint.name.fullname) + return full_name, None + + # OpenSSL code doesn't test for a specific type for + # relativename, everything that isn't fullname is considered + # relativename. Per RFC 5280: + # + # DistributionPointName ::= CHOICE { + # fullName [0] GeneralNames, + # nameRelativeToCRLIssuer [1] RelativeDistinguishedName } + rns = distpoint.name.relativename + rnum = backend._lib.sk_X509_NAME_ENTRY_num(rns) + attributes = set() + for i in range(rnum): + rn = backend._lib.sk_X509_NAME_ENTRY_value( + rns, i + ) + backend.openssl_assert(rn != backend._ffi.NULL) + attributes.add( + _decode_x509_name_entry(backend, rn) + ) + + relative_name = x509.RelativeDistinguishedName(attributes) + + return None, relative_name + + +def _decode_crl_distribution_points(backend, cdps): + dist_points = _decode_dist_points(backend, cdps) + return x509.CRLDistributionPoints(dist_points) + + +def _decode_freshest_crl(backend, cdps): + dist_points = _decode_dist_points(backend, cdps) + return x509.FreshestCRL(dist_points) + + +def _decode_inhibit_any_policy(backend, asn1_int): + asn1_int = backend._ffi.cast("ASN1_INTEGER *", asn1_int) + asn1_int = backend._ffi.gc(asn1_int, backend._lib.ASN1_INTEGER_free) + skip_certs = _asn1_integer_to_int(backend, asn1_int) + return x509.InhibitAnyPolicy(skip_certs) + + +def _decode_precert_signed_certificate_timestamps(backend, asn1_scts): + from cryptography.hazmat.backends.openssl.x509 import ( + _SignedCertificateTimestamp + ) + asn1_scts = backend._ffi.cast("Cryptography_STACK_OF_SCT *", asn1_scts) + asn1_scts = backend._ffi.gc(asn1_scts, backend._lib.SCT_LIST_free) + + scts = [] + for i in range(backend._lib.sk_SCT_num(asn1_scts)): + sct = backend._lib.sk_SCT_value(asn1_scts, i) + + scts.append(_SignedCertificateTimestamp(backend, asn1_scts, sct)) + return x509.PrecertificateSignedCertificateTimestamps(scts) + + +# CRLReason ::= ENUMERATED { +# unspecified (0), +# keyCompromise (1), +# cACompromise (2), +# affiliationChanged (3), +# superseded (4), +# cessationOfOperation (5), +# certificateHold (6), +# -- value 7 is not used +# removeFromCRL (8), +# privilegeWithdrawn (9), +# aACompromise (10) } +_CRL_ENTRY_REASON_CODE_TO_ENUM = { + 0: x509.ReasonFlags.unspecified, + 1: x509.ReasonFlags.key_compromise, + 2: x509.ReasonFlags.ca_compromise, + 3: x509.ReasonFlags.affiliation_changed, + 4: x509.ReasonFlags.superseded, + 5: x509.ReasonFlags.cessation_of_operation, + 6: x509.ReasonFlags.certificate_hold, + 8: x509.ReasonFlags.remove_from_crl, + 9: x509.ReasonFlags.privilege_withdrawn, + 10: x509.ReasonFlags.aa_compromise, +} + + +_CRL_ENTRY_REASON_ENUM_TO_CODE = { + x509.ReasonFlags.unspecified: 0, + x509.ReasonFlags.key_compromise: 1, + x509.ReasonFlags.ca_compromise: 2, + x509.ReasonFlags.affiliation_changed: 3, + x509.ReasonFlags.superseded: 4, + x509.ReasonFlags.cessation_of_operation: 5, + x509.ReasonFlags.certificate_hold: 6, + x509.ReasonFlags.remove_from_crl: 8, + x509.ReasonFlags.privilege_withdrawn: 9, + x509.ReasonFlags.aa_compromise: 10 +} + + +def _decode_crl_reason(backend, enum): + enum = backend._ffi.cast("ASN1_ENUMERATED *", enum) + enum = backend._ffi.gc(enum, backend._lib.ASN1_ENUMERATED_free) + code = backend._lib.ASN1_ENUMERATED_get(enum) + + try: + return x509.CRLReason(_CRL_ENTRY_REASON_CODE_TO_ENUM[code]) + except KeyError: + raise ValueError("Unsupported reason code: {}".format(code)) + + +def _decode_invalidity_date(backend, inv_date): + generalized_time = backend._ffi.cast( + "ASN1_GENERALIZEDTIME *", inv_date + ) + generalized_time = backend._ffi.gc( + generalized_time, backend._lib.ASN1_GENERALIZEDTIME_free + ) + return x509.InvalidityDate( + _parse_asn1_generalized_time(backend, generalized_time) + ) + + +def _decode_cert_issuer(backend, gns): + gns = backend._ffi.cast("GENERAL_NAMES *", gns) + gns = backend._ffi.gc(gns, backend._lib.GENERAL_NAMES_free) + general_names = _decode_general_names(backend, gns) + return x509.CertificateIssuer(general_names) + + +def _asn1_to_der(backend, asn1_type): + buf = backend._ffi.new("unsigned char **") + res = backend._lib.i2d_ASN1_TYPE(asn1_type, buf) + backend.openssl_assert(res >= 0) + backend.openssl_assert(buf[0] != backend._ffi.NULL) + buf = backend._ffi.gc( + buf, lambda buffer: backend._lib.OPENSSL_free(buffer[0]) + ) + return backend._ffi.buffer(buf[0], res)[:] + + +def _asn1_integer_to_int(backend, asn1_int): + bn = backend._lib.ASN1_INTEGER_to_BN(asn1_int, backend._ffi.NULL) + backend.openssl_assert(bn != backend._ffi.NULL) + bn = backend._ffi.gc(bn, backend._lib.BN_free) + return backend._bn_to_int(bn) + + +def _asn1_integer_to_int_or_none(backend, asn1_int): + if asn1_int == backend._ffi.NULL: + return None + else: + return _asn1_integer_to_int(backend, asn1_int) + + +def _asn1_string_to_bytes(backend, asn1_string): + return backend._ffi.buffer(asn1_string.data, asn1_string.length)[:] + + +def _asn1_string_to_ascii(backend, asn1_string): + return _asn1_string_to_bytes(backend, asn1_string).decode("ascii") + + +def _asn1_string_to_utf8(backend, asn1_string): + buf = backend._ffi.new("unsigned char **") + res = backend._lib.ASN1_STRING_to_UTF8(buf, asn1_string) + if res == -1: + raise ValueError( + "Unsupported ASN1 string type. Type: {}".format(asn1_string.type) + ) + + backend.openssl_assert(buf[0] != backend._ffi.NULL) + buf = backend._ffi.gc( + buf, lambda buffer: backend._lib.OPENSSL_free(buffer[0]) + ) + return backend._ffi.buffer(buf[0], res)[:].decode('utf8') + + +def _parse_asn1_time(backend, asn1_time): + backend.openssl_assert(asn1_time != backend._ffi.NULL) + generalized_time = backend._lib.ASN1_TIME_to_generalizedtime( + asn1_time, backend._ffi.NULL + ) + if generalized_time == backend._ffi.NULL: + raise ValueError( + "Couldn't parse ASN.1 time as generalizedtime {!r}".format( + _asn1_string_to_bytes(backend, asn1_time) + ) + ) + + generalized_time = backend._ffi.gc( + generalized_time, backend._lib.ASN1_GENERALIZEDTIME_free + ) + return _parse_asn1_generalized_time(backend, generalized_time) + + +def _parse_asn1_generalized_time(backend, generalized_time): + time = _asn1_string_to_ascii( + backend, backend._ffi.cast("ASN1_STRING *", generalized_time) + ) + return datetime.datetime.strptime(time, "%Y%m%d%H%M%SZ") + + +def _decode_nonce(backend, nonce): + nonce = backend._ffi.cast("ASN1_OCTET_STRING *", nonce) + nonce = backend._ffi.gc(nonce, backend._lib.ASN1_OCTET_STRING_free) + return x509.OCSPNonce(_asn1_string_to_bytes(backend, nonce)) + + +_EXTENSION_HANDLERS_NO_SCT = { + ExtensionOID.BASIC_CONSTRAINTS: _decode_basic_constraints, + ExtensionOID.SUBJECT_KEY_IDENTIFIER: _decode_subject_key_identifier, + ExtensionOID.KEY_USAGE: _decode_key_usage, + ExtensionOID.SUBJECT_ALTERNATIVE_NAME: _decode_subject_alt_name, + ExtensionOID.EXTENDED_KEY_USAGE: _decode_extended_key_usage, + ExtensionOID.AUTHORITY_KEY_IDENTIFIER: _decode_authority_key_identifier, + ExtensionOID.AUTHORITY_INFORMATION_ACCESS: ( + _decode_authority_information_access + ), + ExtensionOID.CERTIFICATE_POLICIES: _decode_certificate_policies, + ExtensionOID.CRL_DISTRIBUTION_POINTS: _decode_crl_distribution_points, + ExtensionOID.FRESHEST_CRL: _decode_freshest_crl, + ExtensionOID.OCSP_NO_CHECK: _decode_ocsp_no_check, + ExtensionOID.INHIBIT_ANY_POLICY: _decode_inhibit_any_policy, + ExtensionOID.ISSUER_ALTERNATIVE_NAME: _decode_issuer_alt_name, + ExtensionOID.NAME_CONSTRAINTS: _decode_name_constraints, + ExtensionOID.POLICY_CONSTRAINTS: _decode_policy_constraints, +} +_EXTENSION_HANDLERS = _EXTENSION_HANDLERS_NO_SCT.copy() +_EXTENSION_HANDLERS[ + ExtensionOID.PRECERT_SIGNED_CERTIFICATE_TIMESTAMPS +] = _decode_precert_signed_certificate_timestamps + + +_REVOKED_EXTENSION_HANDLERS = { + CRLEntryExtensionOID.CRL_REASON: _decode_crl_reason, + CRLEntryExtensionOID.INVALIDITY_DATE: _decode_invalidity_date, + CRLEntryExtensionOID.CERTIFICATE_ISSUER: _decode_cert_issuer, +} + +_CRL_EXTENSION_HANDLERS = { + ExtensionOID.CRL_NUMBER: _decode_crl_number, + ExtensionOID.DELTA_CRL_INDICATOR: _decode_delta_crl_indicator, + ExtensionOID.AUTHORITY_KEY_IDENTIFIER: _decode_authority_key_identifier, + ExtensionOID.ISSUER_ALTERNATIVE_NAME: _decode_issuer_alt_name, + ExtensionOID.AUTHORITY_INFORMATION_ACCESS: ( + _decode_authority_information_access + ), + ExtensionOID.ISSUING_DISTRIBUTION_POINT: _decode_issuing_dist_point, +} + +_OCSP_REQ_EXTENSION_HANDLERS = { + OCSPExtensionOID.NONCE: _decode_nonce, +} + +_OCSP_BASICRESP_EXTENSION_HANDLERS = { + OCSPExtensionOID.NONCE: _decode_nonce, +} + +_CERTIFICATE_EXTENSION_PARSER_NO_SCT = _X509ExtensionParser( + ext_count=lambda backend, x: backend._lib.X509_get_ext_count(x), + get_ext=lambda backend, x, i: backend._lib.X509_get_ext(x, i), + handlers=_EXTENSION_HANDLERS_NO_SCT +) + +_CERTIFICATE_EXTENSION_PARSER = _X509ExtensionParser( + ext_count=lambda backend, x: backend._lib.X509_get_ext_count(x), + get_ext=lambda backend, x, i: backend._lib.X509_get_ext(x, i), + handlers=_EXTENSION_HANDLERS +) + +_CSR_EXTENSION_PARSER = _X509ExtensionParser( + ext_count=lambda backend, x: backend._lib.sk_X509_EXTENSION_num(x), + get_ext=lambda backend, x, i: backend._lib.sk_X509_EXTENSION_value(x, i), + handlers=_EXTENSION_HANDLERS +) + +_REVOKED_CERTIFICATE_EXTENSION_PARSER = _X509ExtensionParser( + ext_count=lambda backend, x: backend._lib.X509_REVOKED_get_ext_count(x), + get_ext=lambda backend, x, i: backend._lib.X509_REVOKED_get_ext(x, i), + handlers=_REVOKED_EXTENSION_HANDLERS, +) + +_CRL_EXTENSION_PARSER = _X509ExtensionParser( + ext_count=lambda backend, x: backend._lib.X509_CRL_get_ext_count(x), + get_ext=lambda backend, x, i: backend._lib.X509_CRL_get_ext(x, i), + handlers=_CRL_EXTENSION_HANDLERS, +) + +_OCSP_REQ_EXT_PARSER = _X509ExtensionParser( + ext_count=lambda backend, x: backend._lib.OCSP_REQUEST_get_ext_count(x), + get_ext=lambda backend, x, i: backend._lib.OCSP_REQUEST_get_ext(x, i), + handlers=_OCSP_REQ_EXTENSION_HANDLERS, +) + +_OCSP_BASICRESP_EXT_PARSER = _X509ExtensionParser( + ext_count=lambda backend, x: backend._lib.OCSP_BASICRESP_get_ext_count(x), + get_ext=lambda backend, x, i: backend._lib.OCSP_BASICRESP_get_ext(x, i), + handlers=_OCSP_BASICRESP_EXTENSION_HANDLERS, +) diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/backends/openssl/dh.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/backends/openssl/dh.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/backends/openssl/dh.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/backends/openssl/dh.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,280 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +from cryptography import utils +from cryptography.exceptions import UnsupportedAlgorithm, _Reasons +from cryptography.hazmat.primitives import serialization +from cryptography.hazmat.primitives.asymmetric import dh + + +def _dh_params_dup(dh_cdata, backend): + lib = backend._lib + ffi = backend._ffi + + param_cdata = lib.DHparams_dup(dh_cdata) + backend.openssl_assert(param_cdata != ffi.NULL) + param_cdata = ffi.gc(param_cdata, lib.DH_free) + if lib.CRYPTOGRAPHY_OPENSSL_LESS_THAN_102: + # In OpenSSL versions < 1.0.2 or libressl DHparams_dup don't copy q + q = ffi.new("BIGNUM **") + lib.DH_get0_pqg(dh_cdata, ffi.NULL, q, ffi.NULL) + q_dup = lib.BN_dup(q[0]) + res = lib.DH_set0_pqg(param_cdata, ffi.NULL, q_dup, ffi.NULL) + backend.openssl_assert(res == 1) + + return param_cdata + + +def _dh_cdata_to_parameters(dh_cdata, backend): + param_cdata = _dh_params_dup(dh_cdata, backend) + return _DHParameters(backend, param_cdata) + + +@utils.register_interface(dh.DHParametersWithSerialization) +class _DHParameters(object): + def __init__(self, backend, dh_cdata): + self._backend = backend + self._dh_cdata = dh_cdata + + def parameter_numbers(self): + p = self._backend._ffi.new("BIGNUM **") + g = self._backend._ffi.new("BIGNUM **") + q = self._backend._ffi.new("BIGNUM **") + self._backend._lib.DH_get0_pqg(self._dh_cdata, p, q, g) + self._backend.openssl_assert(p[0] != self._backend._ffi.NULL) + self._backend.openssl_assert(g[0] != self._backend._ffi.NULL) + if q[0] == self._backend._ffi.NULL: + q_val = None + else: + q_val = self._backend._bn_to_int(q[0]) + return dh.DHParameterNumbers( + p=self._backend._bn_to_int(p[0]), + g=self._backend._bn_to_int(g[0]), + q=q_val + ) + + def generate_private_key(self): + return self._backend.generate_dh_private_key(self) + + def parameter_bytes(self, encoding, format): + if format is not serialization.ParameterFormat.PKCS3: + raise ValueError( + "Only PKCS3 serialization is supported" + ) + if not self._backend._lib.Cryptography_HAS_EVP_PKEY_DHX: + q = self._backend._ffi.new("BIGNUM **") + self._backend._lib.DH_get0_pqg(self._dh_cdata, + self._backend._ffi.NULL, + q, + self._backend._ffi.NULL) + if q[0] != self._backend._ffi.NULL: + raise UnsupportedAlgorithm( + "DH X9.42 serialization is not supported", + _Reasons.UNSUPPORTED_SERIALIZATION) + + return self._backend._parameter_bytes( + encoding, + format, + self._dh_cdata + ) + + +def _handle_dh_compute_key_error(errors, backend): + lib = backend._lib + + backend.openssl_assert( + errors[0]._lib_reason_match( + lib.ERR_LIB_DH, lib.DH_R_INVALID_PUBKEY + ) + ) + + raise ValueError("Public key value is invalid for this exchange.") + + +def _get_dh_num_bits(backend, dh_cdata): + p = backend._ffi.new("BIGNUM **") + backend._lib.DH_get0_pqg(dh_cdata, p, + backend._ffi.NULL, + backend._ffi.NULL) + backend.openssl_assert(p[0] != backend._ffi.NULL) + return backend._lib.BN_num_bits(p[0]) + + +@utils.register_interface(dh.DHPrivateKeyWithSerialization) +class _DHPrivateKey(object): + def __init__(self, backend, dh_cdata, evp_pkey): + self._backend = backend + self._dh_cdata = dh_cdata + self._evp_pkey = evp_pkey + self._key_size_bytes = self._backend._lib.DH_size(dh_cdata) + + @property + def key_size(self): + return _get_dh_num_bits(self._backend, self._dh_cdata) + + def private_numbers(self): + p = self._backend._ffi.new("BIGNUM **") + g = self._backend._ffi.new("BIGNUM **") + q = self._backend._ffi.new("BIGNUM **") + self._backend._lib.DH_get0_pqg(self._dh_cdata, p, q, g) + self._backend.openssl_assert(p[0] != self._backend._ffi.NULL) + self._backend.openssl_assert(g[0] != self._backend._ffi.NULL) + if q[0] == self._backend._ffi.NULL: + q_val = None + else: + q_val = self._backend._bn_to_int(q[0]) + pub_key = self._backend._ffi.new("BIGNUM **") + priv_key = self._backend._ffi.new("BIGNUM **") + self._backend._lib.DH_get0_key(self._dh_cdata, pub_key, priv_key) + self._backend.openssl_assert(pub_key[0] != self._backend._ffi.NULL) + self._backend.openssl_assert(priv_key[0] != self._backend._ffi.NULL) + return dh.DHPrivateNumbers( + public_numbers=dh.DHPublicNumbers( + parameter_numbers=dh.DHParameterNumbers( + p=self._backend._bn_to_int(p[0]), + g=self._backend._bn_to_int(g[0]), + q=q_val + ), + y=self._backend._bn_to_int(pub_key[0]) + ), + x=self._backend._bn_to_int(priv_key[0]) + ) + + def exchange(self, peer_public_key): + + buf = self._backend._ffi.new("unsigned char[]", self._key_size_bytes) + pub_key = self._backend._ffi.new("BIGNUM **") + self._backend._lib.DH_get0_key(peer_public_key._dh_cdata, pub_key, + self._backend._ffi.NULL) + self._backend.openssl_assert(pub_key[0] != self._backend._ffi.NULL) + res = self._backend._lib.DH_compute_key( + buf, + pub_key[0], + self._dh_cdata + ) + + if res == -1: + errors = self._backend._consume_errors() + return _handle_dh_compute_key_error(errors, self._backend) + else: + self._backend.openssl_assert(res >= 1) + + key = self._backend._ffi.buffer(buf)[:res] + pad = self._key_size_bytes - len(key) + + if pad > 0: + key = (b"\x00" * pad) + key + + return key + + def public_key(self): + dh_cdata = _dh_params_dup(self._dh_cdata, self._backend) + pub_key = self._backend._ffi.new("BIGNUM **") + self._backend._lib.DH_get0_key(self._dh_cdata, + pub_key, self._backend._ffi.NULL) + self._backend.openssl_assert(pub_key[0] != self._backend._ffi.NULL) + pub_key_dup = self._backend._lib.BN_dup(pub_key[0]) + self._backend.openssl_assert(pub_key_dup != self._backend._ffi.NULL) + + res = self._backend._lib.DH_set0_key(dh_cdata, + pub_key_dup, + self._backend._ffi.NULL) + self._backend.openssl_assert(res == 1) + evp_pkey = self._backend._dh_cdata_to_evp_pkey(dh_cdata) + return _DHPublicKey(self._backend, dh_cdata, evp_pkey) + + def parameters(self): + return _dh_cdata_to_parameters(self._dh_cdata, self._backend) + + def private_bytes(self, encoding, format, encryption_algorithm): + if format is not serialization.PrivateFormat.PKCS8: + raise ValueError( + "DH private keys support only PKCS8 serialization" + ) + if not self._backend._lib.Cryptography_HAS_EVP_PKEY_DHX: + q = self._backend._ffi.new("BIGNUM **") + self._backend._lib.DH_get0_pqg(self._dh_cdata, + self._backend._ffi.NULL, + q, + self._backend._ffi.NULL) + if q[0] != self._backend._ffi.NULL: + raise UnsupportedAlgorithm( + "DH X9.42 serialization is not supported", + _Reasons.UNSUPPORTED_SERIALIZATION) + + return self._backend._private_key_bytes( + encoding, + format, + encryption_algorithm, + self._evp_pkey, + self._dh_cdata + ) + + +@utils.register_interface(dh.DHPublicKeyWithSerialization) +class _DHPublicKey(object): + def __init__(self, backend, dh_cdata, evp_pkey): + self._backend = backend + self._dh_cdata = dh_cdata + self._evp_pkey = evp_pkey + self._key_size_bits = _get_dh_num_bits(self._backend, self._dh_cdata) + + @property + def key_size(self): + return self._key_size_bits + + def public_numbers(self): + p = self._backend._ffi.new("BIGNUM **") + g = self._backend._ffi.new("BIGNUM **") + q = self._backend._ffi.new("BIGNUM **") + self._backend._lib.DH_get0_pqg(self._dh_cdata, p, q, g) + self._backend.openssl_assert(p[0] != self._backend._ffi.NULL) + self._backend.openssl_assert(g[0] != self._backend._ffi.NULL) + if q[0] == self._backend._ffi.NULL: + q_val = None + else: + q_val = self._backend._bn_to_int(q[0]) + pub_key = self._backend._ffi.new("BIGNUM **") + self._backend._lib.DH_get0_key(self._dh_cdata, + pub_key, self._backend._ffi.NULL) + self._backend.openssl_assert(pub_key[0] != self._backend._ffi.NULL) + return dh.DHPublicNumbers( + parameter_numbers=dh.DHParameterNumbers( + p=self._backend._bn_to_int(p[0]), + g=self._backend._bn_to_int(g[0]), + q=q_val + ), + y=self._backend._bn_to_int(pub_key[0]) + ) + + def parameters(self): + return _dh_cdata_to_parameters(self._dh_cdata, self._backend) + + def public_bytes(self, encoding, format): + if format is not serialization.PublicFormat.SubjectPublicKeyInfo: + raise ValueError( + "DH public keys support only " + "SubjectPublicKeyInfo serialization" + ) + + if not self._backend._lib.Cryptography_HAS_EVP_PKEY_DHX: + q = self._backend._ffi.new("BIGNUM **") + self._backend._lib.DH_get0_pqg(self._dh_cdata, + self._backend._ffi.NULL, + q, + self._backend._ffi.NULL) + if q[0] != self._backend._ffi.NULL: + raise UnsupportedAlgorithm( + "DH X9.42 serialization is not supported", + _Reasons.UNSUPPORTED_SERIALIZATION) + + return self._backend._public_key_bytes( + encoding, + format, + self, + self._evp_pkey, + None + ) diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/backends/openssl/dsa.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/backends/openssl/dsa.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/backends/openssl/dsa.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/backends/openssl/dsa.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,268 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +from cryptography import utils +from cryptography.exceptions import InvalidSignature +from cryptography.hazmat.backends.openssl.utils import ( + _calculate_digest_and_algorithm, _check_not_prehashed, + _warn_sign_verify_deprecated +) +from cryptography.hazmat.primitives import hashes, serialization +from cryptography.hazmat.primitives.asymmetric import ( + AsymmetricSignatureContext, AsymmetricVerificationContext, dsa +) + + +def _dsa_sig_sign(backend, private_key, data): + sig_buf_len = backend._lib.DSA_size(private_key._dsa_cdata) + sig_buf = backend._ffi.new("unsigned char[]", sig_buf_len) + buflen = backend._ffi.new("unsigned int *") + + # The first parameter passed to DSA_sign is unused by OpenSSL but + # must be an integer. + res = backend._lib.DSA_sign( + 0, data, len(data), sig_buf, buflen, private_key._dsa_cdata + ) + backend.openssl_assert(res == 1) + backend.openssl_assert(buflen[0]) + + return backend._ffi.buffer(sig_buf)[:buflen[0]] + + +def _dsa_sig_verify(backend, public_key, signature, data): + # The first parameter passed to DSA_verify is unused by OpenSSL but + # must be an integer. + res = backend._lib.DSA_verify( + 0, data, len(data), signature, len(signature), public_key._dsa_cdata + ) + + if res != 1: + backend._consume_errors() + raise InvalidSignature + + +@utils.register_interface(AsymmetricVerificationContext) +class _DSAVerificationContext(object): + def __init__(self, backend, public_key, signature, algorithm): + self._backend = backend + self._public_key = public_key + self._signature = signature + self._algorithm = algorithm + + self._hash_ctx = hashes.Hash(self._algorithm, self._backend) + + def update(self, data): + self._hash_ctx.update(data) + + def verify(self): + data_to_verify = self._hash_ctx.finalize() + + _dsa_sig_verify( + self._backend, self._public_key, self._signature, data_to_verify + ) + + +@utils.register_interface(AsymmetricSignatureContext) +class _DSASignatureContext(object): + def __init__(self, backend, private_key, algorithm): + self._backend = backend + self._private_key = private_key + self._algorithm = algorithm + self._hash_ctx = hashes.Hash(self._algorithm, self._backend) + + def update(self, data): + self._hash_ctx.update(data) + + def finalize(self): + data_to_sign = self._hash_ctx.finalize() + return _dsa_sig_sign(self._backend, self._private_key, data_to_sign) + + +@utils.register_interface(dsa.DSAParametersWithNumbers) +class _DSAParameters(object): + def __init__(self, backend, dsa_cdata): + self._backend = backend + self._dsa_cdata = dsa_cdata + + def parameter_numbers(self): + p = self._backend._ffi.new("BIGNUM **") + q = self._backend._ffi.new("BIGNUM **") + g = self._backend._ffi.new("BIGNUM **") + self._backend._lib.DSA_get0_pqg(self._dsa_cdata, p, q, g) + self._backend.openssl_assert(p[0] != self._backend._ffi.NULL) + self._backend.openssl_assert(q[0] != self._backend._ffi.NULL) + self._backend.openssl_assert(g[0] != self._backend._ffi.NULL) + return dsa.DSAParameterNumbers( + p=self._backend._bn_to_int(p[0]), + q=self._backend._bn_to_int(q[0]), + g=self._backend._bn_to_int(g[0]) + ) + + def generate_private_key(self): + return self._backend.generate_dsa_private_key(self) + + +@utils.register_interface(dsa.DSAPrivateKeyWithSerialization) +class _DSAPrivateKey(object): + def __init__(self, backend, dsa_cdata, evp_pkey): + self._backend = backend + self._dsa_cdata = dsa_cdata + self._evp_pkey = evp_pkey + + p = self._backend._ffi.new("BIGNUM **") + self._backend._lib.DSA_get0_pqg( + dsa_cdata, p, self._backend._ffi.NULL, self._backend._ffi.NULL + ) + self._backend.openssl_assert(p[0] != backend._ffi.NULL) + self._key_size = self._backend._lib.BN_num_bits(p[0]) + + key_size = utils.read_only_property("_key_size") + + def signer(self, signature_algorithm): + _warn_sign_verify_deprecated() + _check_not_prehashed(signature_algorithm) + return _DSASignatureContext(self._backend, self, signature_algorithm) + + def private_numbers(self): + p = self._backend._ffi.new("BIGNUM **") + q = self._backend._ffi.new("BIGNUM **") + g = self._backend._ffi.new("BIGNUM **") + pub_key = self._backend._ffi.new("BIGNUM **") + priv_key = self._backend._ffi.new("BIGNUM **") + self._backend._lib.DSA_get0_pqg(self._dsa_cdata, p, q, g) + self._backend.openssl_assert(p[0] != self._backend._ffi.NULL) + self._backend.openssl_assert(q[0] != self._backend._ffi.NULL) + self._backend.openssl_assert(g[0] != self._backend._ffi.NULL) + self._backend._lib.DSA_get0_key(self._dsa_cdata, pub_key, priv_key) + self._backend.openssl_assert(pub_key[0] != self._backend._ffi.NULL) + self._backend.openssl_assert(priv_key[0] != self._backend._ffi.NULL) + return dsa.DSAPrivateNumbers( + public_numbers=dsa.DSAPublicNumbers( + parameter_numbers=dsa.DSAParameterNumbers( + p=self._backend._bn_to_int(p[0]), + q=self._backend._bn_to_int(q[0]), + g=self._backend._bn_to_int(g[0]) + ), + y=self._backend._bn_to_int(pub_key[0]) + ), + x=self._backend._bn_to_int(priv_key[0]) + ) + + def public_key(self): + dsa_cdata = self._backend._lib.DSAparams_dup(self._dsa_cdata) + self._backend.openssl_assert(dsa_cdata != self._backend._ffi.NULL) + dsa_cdata = self._backend._ffi.gc( + dsa_cdata, self._backend._lib.DSA_free + ) + pub_key = self._backend._ffi.new("BIGNUM **") + self._backend._lib.DSA_get0_key( + self._dsa_cdata, pub_key, self._backend._ffi.NULL + ) + self._backend.openssl_assert(pub_key[0] != self._backend._ffi.NULL) + pub_key_dup = self._backend._lib.BN_dup(pub_key[0]) + res = self._backend._lib.DSA_set0_key( + dsa_cdata, pub_key_dup, self._backend._ffi.NULL + ) + self._backend.openssl_assert(res == 1) + evp_pkey = self._backend._dsa_cdata_to_evp_pkey(dsa_cdata) + return _DSAPublicKey(self._backend, dsa_cdata, evp_pkey) + + def parameters(self): + dsa_cdata = self._backend._lib.DSAparams_dup(self._dsa_cdata) + self._backend.openssl_assert(dsa_cdata != self._backend._ffi.NULL) + dsa_cdata = self._backend._ffi.gc( + dsa_cdata, self._backend._lib.DSA_free + ) + return _DSAParameters(self._backend, dsa_cdata) + + def private_bytes(self, encoding, format, encryption_algorithm): + return self._backend._private_key_bytes( + encoding, + format, + encryption_algorithm, + self._evp_pkey, + self._dsa_cdata + ) + + def sign(self, data, algorithm): + data, algorithm = _calculate_digest_and_algorithm( + self._backend, data, algorithm + ) + return _dsa_sig_sign(self._backend, self, data) + + +@utils.register_interface(dsa.DSAPublicKeyWithSerialization) +class _DSAPublicKey(object): + def __init__(self, backend, dsa_cdata, evp_pkey): + self._backend = backend + self._dsa_cdata = dsa_cdata + self._evp_pkey = evp_pkey + p = self._backend._ffi.new("BIGNUM **") + self._backend._lib.DSA_get0_pqg( + dsa_cdata, p, self._backend._ffi.NULL, self._backend._ffi.NULL + ) + self._backend.openssl_assert(p[0] != backend._ffi.NULL) + self._key_size = self._backend._lib.BN_num_bits(p[0]) + + key_size = utils.read_only_property("_key_size") + + def verifier(self, signature, signature_algorithm): + _warn_sign_verify_deprecated() + utils._check_bytes("signature", signature) + + _check_not_prehashed(signature_algorithm) + return _DSAVerificationContext( + self._backend, self, signature, signature_algorithm + ) + + def public_numbers(self): + p = self._backend._ffi.new("BIGNUM **") + q = self._backend._ffi.new("BIGNUM **") + g = self._backend._ffi.new("BIGNUM **") + pub_key = self._backend._ffi.new("BIGNUM **") + self._backend._lib.DSA_get0_pqg(self._dsa_cdata, p, q, g) + self._backend.openssl_assert(p[0] != self._backend._ffi.NULL) + self._backend.openssl_assert(q[0] != self._backend._ffi.NULL) + self._backend.openssl_assert(g[0] != self._backend._ffi.NULL) + self._backend._lib.DSA_get0_key( + self._dsa_cdata, pub_key, self._backend._ffi.NULL + ) + self._backend.openssl_assert(pub_key[0] != self._backend._ffi.NULL) + return dsa.DSAPublicNumbers( + parameter_numbers=dsa.DSAParameterNumbers( + p=self._backend._bn_to_int(p[0]), + q=self._backend._bn_to_int(q[0]), + g=self._backend._bn_to_int(g[0]) + ), + y=self._backend._bn_to_int(pub_key[0]) + ) + + def parameters(self): + dsa_cdata = self._backend._lib.DSAparams_dup(self._dsa_cdata) + dsa_cdata = self._backend._ffi.gc( + dsa_cdata, self._backend._lib.DSA_free + ) + return _DSAParameters(self._backend, dsa_cdata) + + def public_bytes(self, encoding, format): + if format is serialization.PublicFormat.PKCS1: + raise ValueError( + "DSA public keys do not support PKCS1 serialization" + ) + + return self._backend._public_key_bytes( + encoding, + format, + self, + self._evp_pkey, + None + ) + + def verify(self, signature, data, algorithm): + data, algorithm = _calculate_digest_and_algorithm( + self._backend, data, algorithm + ) + return _dsa_sig_verify(self._backend, self, signature, data) diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/backends/openssl/ec.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/backends/openssl/ec.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/backends/openssl/ec.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/backends/openssl/ec.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,340 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +from cryptography import utils +from cryptography.exceptions import ( + InvalidSignature, UnsupportedAlgorithm, _Reasons +) +from cryptography.hazmat.backends.openssl.utils import ( + _calculate_digest_and_algorithm, _check_not_prehashed, + _warn_sign_verify_deprecated +) +from cryptography.hazmat.primitives import hashes, serialization +from cryptography.hazmat.primitives.asymmetric import ( + AsymmetricSignatureContext, AsymmetricVerificationContext, ec +) + + +def _check_signature_algorithm(signature_algorithm): + if not isinstance(signature_algorithm, ec.ECDSA): + raise UnsupportedAlgorithm( + "Unsupported elliptic curve signature algorithm.", + _Reasons.UNSUPPORTED_PUBLIC_KEY_ALGORITHM) + + +def _ec_key_curve_sn(backend, ec_key): + group = backend._lib.EC_KEY_get0_group(ec_key) + backend.openssl_assert(group != backend._ffi.NULL) + + nid = backend._lib.EC_GROUP_get_curve_name(group) + # The following check is to find EC keys with unnamed curves and raise + # an error for now. + if nid == backend._lib.NID_undef: + raise NotImplementedError( + "ECDSA certificates with unnamed curves are unsupported " + "at this time" + ) + + curve_name = backend._lib.OBJ_nid2sn(nid) + backend.openssl_assert(curve_name != backend._ffi.NULL) + + sn = backend._ffi.string(curve_name).decode('ascii') + return sn + + +def _mark_asn1_named_ec_curve(backend, ec_cdata): + """ + Set the named curve flag on the EC_KEY. This causes OpenSSL to + serialize EC keys along with their curve OID which makes + deserialization easier. + """ + + backend._lib.EC_KEY_set_asn1_flag( + ec_cdata, backend._lib.OPENSSL_EC_NAMED_CURVE + ) + + +def _sn_to_elliptic_curve(backend, sn): + try: + return ec._CURVE_TYPES[sn]() + except KeyError: + raise UnsupportedAlgorithm( + "{} is not a supported elliptic curve".format(sn), + _Reasons.UNSUPPORTED_ELLIPTIC_CURVE + ) + + +def _ecdsa_sig_sign(backend, private_key, data): + max_size = backend._lib.ECDSA_size(private_key._ec_key) + backend.openssl_assert(max_size > 0) + + sigbuf = backend._ffi.new("unsigned char[]", max_size) + siglen_ptr = backend._ffi.new("unsigned int[]", 1) + res = backend._lib.ECDSA_sign( + 0, data, len(data), sigbuf, siglen_ptr, private_key._ec_key + ) + backend.openssl_assert(res == 1) + return backend._ffi.buffer(sigbuf)[:siglen_ptr[0]] + + +def _ecdsa_sig_verify(backend, public_key, signature, data): + res = backend._lib.ECDSA_verify( + 0, data, len(data), signature, len(signature), public_key._ec_key + ) + if res != 1: + backend._consume_errors() + raise InvalidSignature + + +@utils.register_interface(AsymmetricSignatureContext) +class _ECDSASignatureContext(object): + def __init__(self, backend, private_key, algorithm): + self._backend = backend + self._private_key = private_key + self._digest = hashes.Hash(algorithm, backend) + + def update(self, data): + self._digest.update(data) + + def finalize(self): + digest = self._digest.finalize() + + return _ecdsa_sig_sign(self._backend, self._private_key, digest) + + +@utils.register_interface(AsymmetricVerificationContext) +class _ECDSAVerificationContext(object): + def __init__(self, backend, public_key, signature, algorithm): + self._backend = backend + self._public_key = public_key + self._signature = signature + self._digest = hashes.Hash(algorithm, backend) + + def update(self, data): + self._digest.update(data) + + def verify(self): + digest = self._digest.finalize() + _ecdsa_sig_verify( + self._backend, self._public_key, self._signature, digest + ) + + +@utils.register_interface(ec.EllipticCurvePrivateKeyWithSerialization) +class _EllipticCurvePrivateKey(object): + def __init__(self, backend, ec_key_cdata, evp_pkey): + self._backend = backend + _mark_asn1_named_ec_curve(backend, ec_key_cdata) + self._ec_key = ec_key_cdata + self._evp_pkey = evp_pkey + + sn = _ec_key_curve_sn(backend, ec_key_cdata) + self._curve = _sn_to_elliptic_curve(backend, sn) + + curve = utils.read_only_property("_curve") + + @property + def key_size(self): + return self.curve.key_size + + def signer(self, signature_algorithm): + _warn_sign_verify_deprecated() + _check_signature_algorithm(signature_algorithm) + _check_not_prehashed(signature_algorithm.algorithm) + return _ECDSASignatureContext( + self._backend, self, signature_algorithm.algorithm + ) + + def exchange(self, algorithm, peer_public_key): + if not ( + self._backend.elliptic_curve_exchange_algorithm_supported( + algorithm, self.curve + ) + ): + raise UnsupportedAlgorithm( + "This backend does not support the ECDH algorithm.", + _Reasons.UNSUPPORTED_EXCHANGE_ALGORITHM + ) + + if peer_public_key.curve.name != self.curve.name: + raise ValueError( + "peer_public_key and self are not on the same curve" + ) + + group = self._backend._lib.EC_KEY_get0_group(self._ec_key) + z_len = (self._backend._lib.EC_GROUP_get_degree(group) + 7) // 8 + self._backend.openssl_assert(z_len > 0) + z_buf = self._backend._ffi.new("uint8_t[]", z_len) + peer_key = self._backend._lib.EC_KEY_get0_public_key( + peer_public_key._ec_key + ) + + r = self._backend._lib.ECDH_compute_key( + z_buf, z_len, peer_key, self._ec_key, self._backend._ffi.NULL + ) + self._backend.openssl_assert(r > 0) + return self._backend._ffi.buffer(z_buf)[:z_len] + + def public_key(self): + group = self._backend._lib.EC_KEY_get0_group(self._ec_key) + self._backend.openssl_assert(group != self._backend._ffi.NULL) + + curve_nid = self._backend._lib.EC_GROUP_get_curve_name(group) + + public_ec_key = self._backend._lib.EC_KEY_new_by_curve_name(curve_nid) + self._backend.openssl_assert(public_ec_key != self._backend._ffi.NULL) + public_ec_key = self._backend._ffi.gc( + public_ec_key, self._backend._lib.EC_KEY_free + ) + + point = self._backend._lib.EC_KEY_get0_public_key(self._ec_key) + self._backend.openssl_assert(point != self._backend._ffi.NULL) + + res = self._backend._lib.EC_KEY_set_public_key(public_ec_key, point) + self._backend.openssl_assert(res == 1) + + evp_pkey = self._backend._ec_cdata_to_evp_pkey(public_ec_key) + + return _EllipticCurvePublicKey(self._backend, public_ec_key, evp_pkey) + + def private_numbers(self): + bn = self._backend._lib.EC_KEY_get0_private_key(self._ec_key) + private_value = self._backend._bn_to_int(bn) + return ec.EllipticCurvePrivateNumbers( + private_value=private_value, + public_numbers=self.public_key().public_numbers() + ) + + def private_bytes(self, encoding, format, encryption_algorithm): + return self._backend._private_key_bytes( + encoding, + format, + encryption_algorithm, + self._evp_pkey, + self._ec_key + ) + + def sign(self, data, signature_algorithm): + _check_signature_algorithm(signature_algorithm) + data, algorithm = _calculate_digest_and_algorithm( + self._backend, data, signature_algorithm._algorithm + ) + return _ecdsa_sig_sign(self._backend, self, data) + + +@utils.register_interface(ec.EllipticCurvePublicKeyWithSerialization) +class _EllipticCurvePublicKey(object): + def __init__(self, backend, ec_key_cdata, evp_pkey): + self._backend = backend + _mark_asn1_named_ec_curve(backend, ec_key_cdata) + self._ec_key = ec_key_cdata + self._evp_pkey = evp_pkey + + sn = _ec_key_curve_sn(backend, ec_key_cdata) + self._curve = _sn_to_elliptic_curve(backend, sn) + + curve = utils.read_only_property("_curve") + + @property + def key_size(self): + return self.curve.key_size + + def verifier(self, signature, signature_algorithm): + _warn_sign_verify_deprecated() + utils._check_bytes("signature", signature) + + _check_signature_algorithm(signature_algorithm) + _check_not_prehashed(signature_algorithm.algorithm) + return _ECDSAVerificationContext( + self._backend, self, signature, signature_algorithm.algorithm + ) + + def public_numbers(self): + get_func, group = ( + self._backend._ec_key_determine_group_get_func(self._ec_key) + ) + point = self._backend._lib.EC_KEY_get0_public_key(self._ec_key) + self._backend.openssl_assert(point != self._backend._ffi.NULL) + + with self._backend._tmp_bn_ctx() as bn_ctx: + bn_x = self._backend._lib.BN_CTX_get(bn_ctx) + bn_y = self._backend._lib.BN_CTX_get(bn_ctx) + + res = get_func(group, point, bn_x, bn_y, bn_ctx) + self._backend.openssl_assert(res == 1) + + x = self._backend._bn_to_int(bn_x) + y = self._backend._bn_to_int(bn_y) + + return ec.EllipticCurvePublicNumbers( + x=x, + y=y, + curve=self._curve + ) + + def _encode_point(self, format): + if format is serialization.PublicFormat.CompressedPoint: + conversion = self._backend._lib.POINT_CONVERSION_COMPRESSED + else: + assert format is serialization.PublicFormat.UncompressedPoint + conversion = self._backend._lib.POINT_CONVERSION_UNCOMPRESSED + + group = self._backend._lib.EC_KEY_get0_group(self._ec_key) + self._backend.openssl_assert(group != self._backend._ffi.NULL) + point = self._backend._lib.EC_KEY_get0_public_key(self._ec_key) + self._backend.openssl_assert(point != self._backend._ffi.NULL) + with self._backend._tmp_bn_ctx() as bn_ctx: + buflen = self._backend._lib.EC_POINT_point2oct( + group, point, conversion, self._backend._ffi.NULL, 0, bn_ctx + ) + self._backend.openssl_assert(buflen > 0) + buf = self._backend._ffi.new("char[]", buflen) + res = self._backend._lib.EC_POINT_point2oct( + group, point, conversion, buf, buflen, bn_ctx + ) + self._backend.openssl_assert(buflen == res) + + return self._backend._ffi.buffer(buf)[:] + + def public_bytes(self, encoding, format): + if format is serialization.PublicFormat.PKCS1: + raise ValueError( + "EC public keys do not support PKCS1 serialization" + ) + + if ( + encoding is serialization.Encoding.X962 or + format is serialization.PublicFormat.CompressedPoint or + format is serialization.PublicFormat.UncompressedPoint + ): + if ( + encoding is not serialization.Encoding.X962 or + format not in ( + serialization.PublicFormat.CompressedPoint, + serialization.PublicFormat.UncompressedPoint + ) + ): + raise ValueError( + "X962 encoding must be used with CompressedPoint or " + "UncompressedPoint format" + ) + + return self._encode_point(format) + else: + return self._backend._public_key_bytes( + encoding, + format, + self, + self._evp_pkey, + None + ) + + def verify(self, signature, data, signature_algorithm): + _check_signature_algorithm(signature_algorithm) + data, algorithm = _calculate_digest_and_algorithm( + self._backend, data, signature_algorithm._algorithm + ) + _ecdsa_sig_verify(self._backend, self, signature, data) diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/backends/openssl/ed25519.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/backends/openssl/ed25519.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/backends/openssl/ed25519.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/backends/openssl/ed25519.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,151 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +from cryptography import exceptions, utils +from cryptography.hazmat.primitives import serialization +from cryptography.hazmat.primitives.asymmetric.ed25519 import ( + Ed25519PrivateKey, Ed25519PublicKey, _ED25519_KEY_SIZE, _ED25519_SIG_SIZE +) + + +@utils.register_interface(Ed25519PublicKey) +class _Ed25519PublicKey(object): + def __init__(self, backend, evp_pkey): + self._backend = backend + self._evp_pkey = evp_pkey + + def public_bytes(self, encoding, format): + if ( + encoding is serialization.Encoding.Raw or + format is serialization.PublicFormat.Raw + ): + if ( + encoding is not serialization.Encoding.Raw or + format is not serialization.PublicFormat.Raw + ): + raise ValueError( + "When using Raw both encoding and format must be Raw" + ) + + return self._raw_public_bytes() + + if ( + encoding in serialization._PEM_DER and + format is not serialization.PublicFormat.SubjectPublicKeyInfo + ): + raise ValueError( + "format must be SubjectPublicKeyInfo when encoding is PEM or " + "DER" + ) + + return self._backend._public_key_bytes( + encoding, format, self, self._evp_pkey, None + ) + + def _raw_public_bytes(self): + buf = self._backend._ffi.new("unsigned char []", _ED25519_KEY_SIZE) + buflen = self._backend._ffi.new("size_t *", _ED25519_KEY_SIZE) + res = self._backend._lib.EVP_PKEY_get_raw_public_key( + self._evp_pkey, buf, buflen + ) + self._backend.openssl_assert(res == 1) + self._backend.openssl_assert(buflen[0] == _ED25519_KEY_SIZE) + return self._backend._ffi.buffer(buf, _ED25519_KEY_SIZE)[:] + + def verify(self, signature, data): + evp_md_ctx = self._backend._lib.Cryptography_EVP_MD_CTX_new() + self._backend.openssl_assert(evp_md_ctx != self._backend._ffi.NULL) + evp_md_ctx = self._backend._ffi.gc( + evp_md_ctx, self._backend._lib.Cryptography_EVP_MD_CTX_free + ) + res = self._backend._lib.EVP_DigestVerifyInit( + evp_md_ctx, self._backend._ffi.NULL, self._backend._ffi.NULL, + self._backend._ffi.NULL, self._evp_pkey + ) + self._backend.openssl_assert(res == 1) + res = self._backend._lib.EVP_DigestVerify( + evp_md_ctx, signature, len(signature), data, len(data) + ) + if res != 1: + self._backend._consume_errors() + raise exceptions.InvalidSignature + + +@utils.register_interface(Ed25519PrivateKey) +class _Ed25519PrivateKey(object): + def __init__(self, backend, evp_pkey): + self._backend = backend + self._evp_pkey = evp_pkey + + def public_key(self): + buf = self._backend._ffi.new("unsigned char []", _ED25519_KEY_SIZE) + buflen = self._backend._ffi.new("size_t *", _ED25519_KEY_SIZE) + res = self._backend._lib.EVP_PKEY_get_raw_public_key( + self._evp_pkey, buf, buflen + ) + self._backend.openssl_assert(res == 1) + self._backend.openssl_assert(buflen[0] == _ED25519_KEY_SIZE) + public_bytes = self._backend._ffi.buffer(buf)[:] + return self._backend.ed25519_load_public_bytes(public_bytes) + + def sign(self, data): + evp_md_ctx = self._backend._lib.Cryptography_EVP_MD_CTX_new() + self._backend.openssl_assert(evp_md_ctx != self._backend._ffi.NULL) + evp_md_ctx = self._backend._ffi.gc( + evp_md_ctx, self._backend._lib.Cryptography_EVP_MD_CTX_free + ) + res = self._backend._lib.EVP_DigestSignInit( + evp_md_ctx, self._backend._ffi.NULL, self._backend._ffi.NULL, + self._backend._ffi.NULL, self._evp_pkey + ) + self._backend.openssl_assert(res == 1) + buf = self._backend._ffi.new("unsigned char[]", _ED25519_SIG_SIZE) + buflen = self._backend._ffi.new("size_t *", len(buf)) + res = self._backend._lib.EVP_DigestSign( + evp_md_ctx, buf, buflen, data, len(data) + ) + self._backend.openssl_assert(res == 1) + self._backend.openssl_assert(buflen[0] == _ED25519_SIG_SIZE) + return self._backend._ffi.buffer(buf, buflen[0])[:] + + def private_bytes(self, encoding, format, encryption_algorithm): + if ( + encoding is serialization.Encoding.Raw or + format is serialization.PublicFormat.Raw + ): + if ( + format is not serialization.PrivateFormat.Raw or + encoding is not serialization.Encoding.Raw or not + isinstance(encryption_algorithm, serialization.NoEncryption) + ): + raise ValueError( + "When using Raw both encoding and format must be Raw " + "and encryption_algorithm must be NoEncryption" + ) + + return self._raw_private_bytes() + + if ( + encoding in serialization._PEM_DER and + format is not serialization.PrivateFormat.PKCS8 + ): + raise ValueError( + "format must be PKCS8 when encoding is PEM or DER" + ) + + return self._backend._private_key_bytes( + encoding, format, encryption_algorithm, self._evp_pkey, None + ) + + def _raw_private_bytes(self): + buf = self._backend._ffi.new("unsigned char []", _ED25519_KEY_SIZE) + buflen = self._backend._ffi.new("size_t *", _ED25519_KEY_SIZE) + res = self._backend._lib.EVP_PKEY_get_raw_private_key( + self._evp_pkey, buf, buflen + ) + self._backend.openssl_assert(res == 1) + self._backend.openssl_assert(buflen[0] == _ED25519_KEY_SIZE) + return self._backend._ffi.buffer(buf, _ED25519_KEY_SIZE)[:] diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/backends/openssl/ed448.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/backends/openssl/ed448.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/backends/openssl/ed448.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/backends/openssl/ed448.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,154 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +from cryptography import exceptions, utils +from cryptography.hazmat.primitives import serialization +from cryptography.hazmat.primitives.asymmetric.ed448 import ( + Ed448PrivateKey, Ed448PublicKey +) + +_ED448_KEY_SIZE = 57 +_ED448_SIG_SIZE = 114 + + +@utils.register_interface(Ed448PublicKey) +class _Ed448PublicKey(object): + def __init__(self, backend, evp_pkey): + self._backend = backend + self._evp_pkey = evp_pkey + + def public_bytes(self, encoding, format): + if ( + encoding is serialization.Encoding.Raw or + format is serialization.PublicFormat.Raw + ): + if ( + encoding is not serialization.Encoding.Raw or + format is not serialization.PublicFormat.Raw + ): + raise ValueError( + "When using Raw both encoding and format must be Raw" + ) + + return self._raw_public_bytes() + + if ( + encoding in serialization._PEM_DER and + format is not serialization.PublicFormat.SubjectPublicKeyInfo + ): + raise ValueError( + "format must be SubjectPublicKeyInfo when encoding is PEM or " + "DER" + ) + + return self._backend._public_key_bytes( + encoding, format, self, self._evp_pkey, None + ) + + def _raw_public_bytes(self): + buf = self._backend._ffi.new("unsigned char []", _ED448_KEY_SIZE) + buflen = self._backend._ffi.new("size_t *", _ED448_KEY_SIZE) + res = self._backend._lib.EVP_PKEY_get_raw_public_key( + self._evp_pkey, buf, buflen + ) + self._backend.openssl_assert(res == 1) + self._backend.openssl_assert(buflen[0] == _ED448_KEY_SIZE) + return self._backend._ffi.buffer(buf, _ED448_KEY_SIZE)[:] + + def verify(self, signature, data): + evp_md_ctx = self._backend._lib.Cryptography_EVP_MD_CTX_new() + self._backend.openssl_assert(evp_md_ctx != self._backend._ffi.NULL) + evp_md_ctx = self._backend._ffi.gc( + evp_md_ctx, self._backend._lib.Cryptography_EVP_MD_CTX_free + ) + res = self._backend._lib.EVP_DigestVerifyInit( + evp_md_ctx, self._backend._ffi.NULL, self._backend._ffi.NULL, + self._backend._ffi.NULL, self._evp_pkey + ) + self._backend.openssl_assert(res == 1) + res = self._backend._lib.EVP_DigestVerify( + evp_md_ctx, signature, len(signature), data, len(data) + ) + if res != 1: + self._backend._consume_errors() + raise exceptions.InvalidSignature + + +@utils.register_interface(Ed448PrivateKey) +class _Ed448PrivateKey(object): + def __init__(self, backend, evp_pkey): + self._backend = backend + self._evp_pkey = evp_pkey + + def public_key(self): + buf = self._backend._ffi.new("unsigned char []", _ED448_KEY_SIZE) + buflen = self._backend._ffi.new("size_t *", _ED448_KEY_SIZE) + res = self._backend._lib.EVP_PKEY_get_raw_public_key( + self._evp_pkey, buf, buflen + ) + self._backend.openssl_assert(res == 1) + self._backend.openssl_assert(buflen[0] == _ED448_KEY_SIZE) + public_bytes = self._backend._ffi.buffer(buf)[:] + return self._backend.ed448_load_public_bytes(public_bytes) + + def sign(self, data): + evp_md_ctx = self._backend._lib.Cryptography_EVP_MD_CTX_new() + self._backend.openssl_assert(evp_md_ctx != self._backend._ffi.NULL) + evp_md_ctx = self._backend._ffi.gc( + evp_md_ctx, self._backend._lib.Cryptography_EVP_MD_CTX_free + ) + res = self._backend._lib.EVP_DigestSignInit( + evp_md_ctx, self._backend._ffi.NULL, self._backend._ffi.NULL, + self._backend._ffi.NULL, self._evp_pkey + ) + self._backend.openssl_assert(res == 1) + buf = self._backend._ffi.new("unsigned char[]", _ED448_SIG_SIZE) + buflen = self._backend._ffi.new("size_t *", len(buf)) + res = self._backend._lib.EVP_DigestSign( + evp_md_ctx, buf, buflen, data, len(data) + ) + self._backend.openssl_assert(res == 1) + self._backend.openssl_assert(buflen[0] == _ED448_SIG_SIZE) + return self._backend._ffi.buffer(buf, buflen[0])[:] + + def private_bytes(self, encoding, format, encryption_algorithm): + if ( + encoding is serialization.Encoding.Raw or + format is serialization.PublicFormat.Raw + ): + if ( + format is not serialization.PrivateFormat.Raw or + encoding is not serialization.Encoding.Raw or not + isinstance(encryption_algorithm, serialization.NoEncryption) + ): + raise ValueError( + "When using Raw both encoding and format must be Raw " + "and encryption_algorithm must be NoEncryption" + ) + + return self._raw_private_bytes() + + if ( + encoding in serialization._PEM_DER and + format is not serialization.PrivateFormat.PKCS8 + ): + raise ValueError( + "format must be PKCS8 when encoding is PEM or DER" + ) + + return self._backend._private_key_bytes( + encoding, format, encryption_algorithm, self._evp_pkey, None + ) + + def _raw_private_bytes(self): + buf = self._backend._ffi.new("unsigned char []", _ED448_KEY_SIZE) + buflen = self._backend._ffi.new("size_t *", _ED448_KEY_SIZE) + res = self._backend._lib.EVP_PKEY_get_raw_private_key( + self._evp_pkey, buf, buflen + ) + self._backend.openssl_assert(res == 1) + self._backend.openssl_assert(buflen[0] == _ED448_KEY_SIZE) + return self._backend._ffi.buffer(buf, _ED448_KEY_SIZE)[:] diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/backends/openssl/encode_asn1.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/backends/openssl/encode_asn1.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/backends/openssl/encode_asn1.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/backends/openssl/encode_asn1.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,657 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +import calendar +import ipaddress + +import six + +from cryptography import utils, x509 +from cryptography.hazmat.backends.openssl.decode_asn1 import ( + _CRL_ENTRY_REASON_ENUM_TO_CODE, _DISTPOINT_TYPE_FULLNAME, + _DISTPOINT_TYPE_RELATIVENAME +) +from cryptography.x509.name import _ASN1Type +from cryptography.x509.oid import ( + CRLEntryExtensionOID, ExtensionOID, OCSPExtensionOID, +) + + +def _encode_asn1_int(backend, x): + """ + Converts a python integer to an ASN1_INTEGER. The returned ASN1_INTEGER + will not be garbage collected (to support adding them to structs that take + ownership of the object). Be sure to register it for GC if it will be + discarded after use. + + """ + # Convert Python integer to OpenSSL "bignum" in case value exceeds + # machine's native integer limits (note: `int_to_bn` doesn't automatically + # GC). + i = backend._int_to_bn(x) + i = backend._ffi.gc(i, backend._lib.BN_free) + + # Wrap in an ASN.1 integer. Don't GC -- as documented. + i = backend._lib.BN_to_ASN1_INTEGER(i, backend._ffi.NULL) + backend.openssl_assert(i != backend._ffi.NULL) + return i + + +def _encode_asn1_int_gc(backend, x): + i = _encode_asn1_int(backend, x) + i = backend._ffi.gc(i, backend._lib.ASN1_INTEGER_free) + return i + + +def _encode_asn1_str(backend, data): + """ + Create an ASN1_OCTET_STRING from a Python byte string. + """ + s = backend._lib.ASN1_OCTET_STRING_new() + res = backend._lib.ASN1_OCTET_STRING_set(s, data, len(data)) + backend.openssl_assert(res == 1) + return s + + +def _encode_asn1_utf8_str(backend, string): + """ + Create an ASN1_UTF8STRING from a Python unicode string. + This object will be an ASN1_STRING with UTF8 type in OpenSSL and + can be decoded with ASN1_STRING_to_UTF8. + """ + s = backend._lib.ASN1_UTF8STRING_new() + res = backend._lib.ASN1_STRING_set( + s, string.encode("utf8"), len(string.encode("utf8")) + ) + backend.openssl_assert(res == 1) + return s + + +def _encode_asn1_str_gc(backend, data): + s = _encode_asn1_str(backend, data) + s = backend._ffi.gc(s, backend._lib.ASN1_OCTET_STRING_free) + return s + + +def _encode_inhibit_any_policy(backend, inhibit_any_policy): + return _encode_asn1_int_gc(backend, inhibit_any_policy.skip_certs) + + +def _encode_name(backend, name): + """ + The X509_NAME created will not be gc'd. Use _encode_name_gc if needed. + """ + subject = backend._lib.X509_NAME_new() + for rdn in name.rdns: + set_flag = 0 # indicate whether to add to last RDN or create new RDN + for attribute in rdn: + name_entry = _encode_name_entry(backend, attribute) + # X509_NAME_add_entry dups the object so we need to gc this copy + name_entry = backend._ffi.gc( + name_entry, backend._lib.X509_NAME_ENTRY_free + ) + res = backend._lib.X509_NAME_add_entry( + subject, name_entry, -1, set_flag) + backend.openssl_assert(res == 1) + set_flag = -1 + return subject + + +def _encode_name_gc(backend, attributes): + subject = _encode_name(backend, attributes) + subject = backend._ffi.gc(subject, backend._lib.X509_NAME_free) + return subject + + +def _encode_sk_name_entry(backend, attributes): + """ + The sk_X509_NAME_ENTRY created will not be gc'd. + """ + stack = backend._lib.sk_X509_NAME_ENTRY_new_null() + for attribute in attributes: + name_entry = _encode_name_entry(backend, attribute) + res = backend._lib.sk_X509_NAME_ENTRY_push(stack, name_entry) + backend.openssl_assert(res >= 1) + return stack + + +def _encode_name_entry(backend, attribute): + if attribute._type is _ASN1Type.BMPString: + value = attribute.value.encode('utf_16_be') + else: + value = attribute.value.encode('utf8') + + obj = _txt2obj_gc(backend, attribute.oid.dotted_string) + + name_entry = backend._lib.X509_NAME_ENTRY_create_by_OBJ( + backend._ffi.NULL, obj, attribute._type.value, value, len(value) + ) + return name_entry + + +def _encode_crl_number_delta_crl_indicator(backend, ext): + return _encode_asn1_int_gc(backend, ext.crl_number) + + +def _encode_issuing_dist_point(backend, ext): + idp = backend._lib.ISSUING_DIST_POINT_new() + backend.openssl_assert(idp != backend._ffi.NULL) + idp = backend._ffi.gc(idp, backend._lib.ISSUING_DIST_POINT_free) + idp.onlyuser = 255 if ext.only_contains_user_certs else 0 + idp.onlyCA = 255 if ext.only_contains_ca_certs else 0 + idp.indirectCRL = 255 if ext.indirect_crl else 0 + idp.onlyattr = 255 if ext.only_contains_attribute_certs else 0 + if ext.only_some_reasons: + idp.onlysomereasons = _encode_reasonflags( + backend, ext.only_some_reasons + ) + + if ext.full_name: + idp.distpoint = _encode_full_name(backend, ext.full_name) + + if ext.relative_name: + idp.distpoint = _encode_relative_name(backend, ext.relative_name) + + return idp + + +def _encode_crl_reason(backend, crl_reason): + asn1enum = backend._lib.ASN1_ENUMERATED_new() + backend.openssl_assert(asn1enum != backend._ffi.NULL) + asn1enum = backend._ffi.gc(asn1enum, backend._lib.ASN1_ENUMERATED_free) + res = backend._lib.ASN1_ENUMERATED_set( + asn1enum, _CRL_ENTRY_REASON_ENUM_TO_CODE[crl_reason.reason] + ) + backend.openssl_assert(res == 1) + + return asn1enum + + +def _encode_invalidity_date(backend, invalidity_date): + time = backend._lib.ASN1_GENERALIZEDTIME_set( + backend._ffi.NULL, calendar.timegm( + invalidity_date.invalidity_date.timetuple() + ) + ) + backend.openssl_assert(time != backend._ffi.NULL) + time = backend._ffi.gc(time, backend._lib.ASN1_GENERALIZEDTIME_free) + + return time + + +def _encode_certificate_policies(backend, certificate_policies): + cp = backend._lib.sk_POLICYINFO_new_null() + backend.openssl_assert(cp != backend._ffi.NULL) + cp = backend._ffi.gc(cp, backend._lib.sk_POLICYINFO_free) + for policy_info in certificate_policies: + pi = backend._lib.POLICYINFO_new() + backend.openssl_assert(pi != backend._ffi.NULL) + res = backend._lib.sk_POLICYINFO_push(cp, pi) + backend.openssl_assert(res >= 1) + oid = _txt2obj(backend, policy_info.policy_identifier.dotted_string) + pi.policyid = oid + if policy_info.policy_qualifiers: + pqis = backend._lib.sk_POLICYQUALINFO_new_null() + backend.openssl_assert(pqis != backend._ffi.NULL) + for qualifier in policy_info.policy_qualifiers: + pqi = backend._lib.POLICYQUALINFO_new() + backend.openssl_assert(pqi != backend._ffi.NULL) + res = backend._lib.sk_POLICYQUALINFO_push(pqis, pqi) + backend.openssl_assert(res >= 1) + if isinstance(qualifier, six.text_type): + pqi.pqualid = _txt2obj( + backend, x509.OID_CPS_QUALIFIER.dotted_string + ) + pqi.d.cpsuri = _encode_asn1_str( + backend, + qualifier.encode("ascii"), + ) + else: + assert isinstance(qualifier, x509.UserNotice) + pqi.pqualid = _txt2obj( + backend, x509.OID_CPS_USER_NOTICE.dotted_string + ) + un = backend._lib.USERNOTICE_new() + backend.openssl_assert(un != backend._ffi.NULL) + pqi.d.usernotice = un + if qualifier.explicit_text: + un.exptext = _encode_asn1_utf8_str( + backend, qualifier.explicit_text + ) + + un.noticeref = _encode_notice_reference( + backend, qualifier.notice_reference + ) + + pi.qualifiers = pqis + + return cp + + +def _encode_notice_reference(backend, notice): + if notice is None: + return backend._ffi.NULL + else: + nr = backend._lib.NOTICEREF_new() + backend.openssl_assert(nr != backend._ffi.NULL) + # organization is a required field + nr.organization = _encode_asn1_utf8_str(backend, notice.organization) + + notice_stack = backend._lib.sk_ASN1_INTEGER_new_null() + nr.noticenos = notice_stack + for number in notice.notice_numbers: + num = _encode_asn1_int(backend, number) + res = backend._lib.sk_ASN1_INTEGER_push(notice_stack, num) + backend.openssl_assert(res >= 1) + + return nr + + +def _txt2obj(backend, name): + """ + Converts a Python string with an ASN.1 object ID in dotted form to a + ASN1_OBJECT. + """ + name = name.encode('ascii') + obj = backend._lib.OBJ_txt2obj(name, 1) + backend.openssl_assert(obj != backend._ffi.NULL) + return obj + + +def _txt2obj_gc(backend, name): + obj = _txt2obj(backend, name) + obj = backend._ffi.gc(obj, backend._lib.ASN1_OBJECT_free) + return obj + + +def _encode_ocsp_nocheck(backend, ext): + # Doesn't need to be GC'd + return backend._lib.ASN1_NULL_new() + + +def _encode_key_usage(backend, key_usage): + set_bit = backend._lib.ASN1_BIT_STRING_set_bit + ku = backend._lib.ASN1_BIT_STRING_new() + ku = backend._ffi.gc(ku, backend._lib.ASN1_BIT_STRING_free) + res = set_bit(ku, 0, key_usage.digital_signature) + backend.openssl_assert(res == 1) + res = set_bit(ku, 1, key_usage.content_commitment) + backend.openssl_assert(res == 1) + res = set_bit(ku, 2, key_usage.key_encipherment) + backend.openssl_assert(res == 1) + res = set_bit(ku, 3, key_usage.data_encipherment) + backend.openssl_assert(res == 1) + res = set_bit(ku, 4, key_usage.key_agreement) + backend.openssl_assert(res == 1) + res = set_bit(ku, 5, key_usage.key_cert_sign) + backend.openssl_assert(res == 1) + res = set_bit(ku, 6, key_usage.crl_sign) + backend.openssl_assert(res == 1) + if key_usage.key_agreement: + res = set_bit(ku, 7, key_usage.encipher_only) + backend.openssl_assert(res == 1) + res = set_bit(ku, 8, key_usage.decipher_only) + backend.openssl_assert(res == 1) + else: + res = set_bit(ku, 7, 0) + backend.openssl_assert(res == 1) + res = set_bit(ku, 8, 0) + backend.openssl_assert(res == 1) + + return ku + + +def _encode_authority_key_identifier(backend, authority_keyid): + akid = backend._lib.AUTHORITY_KEYID_new() + backend.openssl_assert(akid != backend._ffi.NULL) + akid = backend._ffi.gc(akid, backend._lib.AUTHORITY_KEYID_free) + if authority_keyid.key_identifier is not None: + akid.keyid = _encode_asn1_str( + backend, + authority_keyid.key_identifier, + ) + + if authority_keyid.authority_cert_issuer is not None: + akid.issuer = _encode_general_names( + backend, authority_keyid.authority_cert_issuer + ) + + if authority_keyid.authority_cert_serial_number is not None: + akid.serial = _encode_asn1_int( + backend, authority_keyid.authority_cert_serial_number + ) + + return akid + + +def _encode_basic_constraints(backend, basic_constraints): + constraints = backend._lib.BASIC_CONSTRAINTS_new() + constraints = backend._ffi.gc( + constraints, backend._lib.BASIC_CONSTRAINTS_free + ) + constraints.ca = 255 if basic_constraints.ca else 0 + if basic_constraints.ca and basic_constraints.path_length is not None: + constraints.pathlen = _encode_asn1_int( + backend, basic_constraints.path_length + ) + + return constraints + + +def _encode_authority_information_access(backend, authority_info_access): + aia = backend._lib.sk_ACCESS_DESCRIPTION_new_null() + backend.openssl_assert(aia != backend._ffi.NULL) + aia = backend._ffi.gc( + aia, + lambda x: backend._lib.sk_ACCESS_DESCRIPTION_pop_free( + x, backend._ffi.addressof( + backend._lib._original_lib, "ACCESS_DESCRIPTION_free" + ) + ) + ) + for access_description in authority_info_access: + ad = backend._lib.ACCESS_DESCRIPTION_new() + method = _txt2obj( + backend, access_description.access_method.dotted_string + ) + _encode_general_name_preallocated( + backend, access_description.access_location, ad.location + ) + ad.method = method + res = backend._lib.sk_ACCESS_DESCRIPTION_push(aia, ad) + backend.openssl_assert(res >= 1) + + return aia + + +def _encode_general_names(backend, names): + general_names = backend._lib.GENERAL_NAMES_new() + backend.openssl_assert(general_names != backend._ffi.NULL) + for name in names: + gn = _encode_general_name(backend, name) + res = backend._lib.sk_GENERAL_NAME_push(general_names, gn) + backend.openssl_assert(res != 0) + + return general_names + + +def _encode_alt_name(backend, san): + general_names = _encode_general_names(backend, san) + general_names = backend._ffi.gc( + general_names, backend._lib.GENERAL_NAMES_free + ) + return general_names + + +def _encode_subject_key_identifier(backend, ski): + return _encode_asn1_str_gc(backend, ski.digest) + + +def _encode_general_name(backend, name): + gn = backend._lib.GENERAL_NAME_new() + _encode_general_name_preallocated(backend, name, gn) + return gn + + +def _encode_general_name_preallocated(backend, name, gn): + if isinstance(name, x509.DNSName): + backend.openssl_assert(gn != backend._ffi.NULL) + gn.type = backend._lib.GEN_DNS + + ia5 = backend._lib.ASN1_IA5STRING_new() + backend.openssl_assert(ia5 != backend._ffi.NULL) + # ia5strings are supposed to be ITU T.50 but to allow round-tripping + # of broken certs that encode utf8 we'll encode utf8 here too. + value = name.value.encode("utf8") + + res = backend._lib.ASN1_STRING_set(ia5, value, len(value)) + backend.openssl_assert(res == 1) + gn.d.dNSName = ia5 + elif isinstance(name, x509.RegisteredID): + backend.openssl_assert(gn != backend._ffi.NULL) + gn.type = backend._lib.GEN_RID + obj = backend._lib.OBJ_txt2obj( + name.value.dotted_string.encode('ascii'), 1 + ) + backend.openssl_assert(obj != backend._ffi.NULL) + gn.d.registeredID = obj + elif isinstance(name, x509.DirectoryName): + backend.openssl_assert(gn != backend._ffi.NULL) + dir_name = _encode_name(backend, name.value) + gn.type = backend._lib.GEN_DIRNAME + gn.d.directoryName = dir_name + elif isinstance(name, x509.IPAddress): + backend.openssl_assert(gn != backend._ffi.NULL) + if isinstance(name.value, ipaddress.IPv4Network): + packed = ( + name.value.network_address.packed + + utils.int_to_bytes(((1 << 32) - name.value.num_addresses), 4) + ) + elif isinstance(name.value, ipaddress.IPv6Network): + packed = ( + name.value.network_address.packed + + utils.int_to_bytes((1 << 128) - name.value.num_addresses, 16) + ) + else: + packed = name.value.packed + ipaddr = _encode_asn1_str(backend, packed) + gn.type = backend._lib.GEN_IPADD + gn.d.iPAddress = ipaddr + elif isinstance(name, x509.OtherName): + backend.openssl_assert(gn != backend._ffi.NULL) + other_name = backend._lib.OTHERNAME_new() + backend.openssl_assert(other_name != backend._ffi.NULL) + + type_id = backend._lib.OBJ_txt2obj( + name.type_id.dotted_string.encode('ascii'), 1 + ) + backend.openssl_assert(type_id != backend._ffi.NULL) + data = backend._ffi.new("unsigned char[]", name.value) + data_ptr_ptr = backend._ffi.new("unsigned char **") + data_ptr_ptr[0] = data + value = backend._lib.d2i_ASN1_TYPE( + backend._ffi.NULL, data_ptr_ptr, len(name.value) + ) + if value == backend._ffi.NULL: + backend._consume_errors() + raise ValueError("Invalid ASN.1 data") + other_name.type_id = type_id + other_name.value = value + gn.type = backend._lib.GEN_OTHERNAME + gn.d.otherName = other_name + elif isinstance(name, x509.RFC822Name): + backend.openssl_assert(gn != backend._ffi.NULL) + # ia5strings are supposed to be ITU T.50 but to allow round-tripping + # of broken certs that encode utf8 we'll encode utf8 here too. + data = name.value.encode("utf8") + asn1_str = _encode_asn1_str(backend, data) + gn.type = backend._lib.GEN_EMAIL + gn.d.rfc822Name = asn1_str + elif isinstance(name, x509.UniformResourceIdentifier): + backend.openssl_assert(gn != backend._ffi.NULL) + # ia5strings are supposed to be ITU T.50 but to allow round-tripping + # of broken certs that encode utf8 we'll encode utf8 here too. + data = name.value.encode("utf8") + asn1_str = _encode_asn1_str(backend, data) + gn.type = backend._lib.GEN_URI + gn.d.uniformResourceIdentifier = asn1_str + else: + raise ValueError( + "{} is an unknown GeneralName type".format(name) + ) + + +def _encode_extended_key_usage(backend, extended_key_usage): + eku = backend._lib.sk_ASN1_OBJECT_new_null() + eku = backend._ffi.gc(eku, backend._lib.sk_ASN1_OBJECT_free) + for oid in extended_key_usage: + obj = _txt2obj(backend, oid.dotted_string) + res = backend._lib.sk_ASN1_OBJECT_push(eku, obj) + backend.openssl_assert(res >= 1) + + return eku + + +_CRLREASONFLAGS = { + x509.ReasonFlags.key_compromise: 1, + x509.ReasonFlags.ca_compromise: 2, + x509.ReasonFlags.affiliation_changed: 3, + x509.ReasonFlags.superseded: 4, + x509.ReasonFlags.cessation_of_operation: 5, + x509.ReasonFlags.certificate_hold: 6, + x509.ReasonFlags.privilege_withdrawn: 7, + x509.ReasonFlags.aa_compromise: 8, +} + + +def _encode_reasonflags(backend, reasons): + bitmask = backend._lib.ASN1_BIT_STRING_new() + backend.openssl_assert(bitmask != backend._ffi.NULL) + for reason in reasons: + res = backend._lib.ASN1_BIT_STRING_set_bit( + bitmask, _CRLREASONFLAGS[reason], 1 + ) + backend.openssl_assert(res == 1) + + return bitmask + + +def _encode_full_name(backend, full_name): + dpn = backend._lib.DIST_POINT_NAME_new() + backend.openssl_assert(dpn != backend._ffi.NULL) + dpn.type = _DISTPOINT_TYPE_FULLNAME + dpn.name.fullname = _encode_general_names(backend, full_name) + return dpn + + +def _encode_relative_name(backend, relative_name): + dpn = backend._lib.DIST_POINT_NAME_new() + backend.openssl_assert(dpn != backend._ffi.NULL) + dpn.type = _DISTPOINT_TYPE_RELATIVENAME + dpn.name.relativename = _encode_sk_name_entry(backend, relative_name) + return dpn + + +def _encode_cdps_freshest_crl(backend, cdps): + cdp = backend._lib.sk_DIST_POINT_new_null() + cdp = backend._ffi.gc(cdp, backend._lib.sk_DIST_POINT_free) + for point in cdps: + dp = backend._lib.DIST_POINT_new() + backend.openssl_assert(dp != backend._ffi.NULL) + + if point.reasons: + dp.reasons = _encode_reasonflags(backend, point.reasons) + + if point.full_name: + dp.distpoint = _encode_full_name(backend, point.full_name) + + if point.relative_name: + dp.distpoint = _encode_relative_name(backend, point.relative_name) + + if point.crl_issuer: + dp.CRLissuer = _encode_general_names(backend, point.crl_issuer) + + res = backend._lib.sk_DIST_POINT_push(cdp, dp) + backend.openssl_assert(res >= 1) + + return cdp + + +def _encode_name_constraints(backend, name_constraints): + nc = backend._lib.NAME_CONSTRAINTS_new() + backend.openssl_assert(nc != backend._ffi.NULL) + nc = backend._ffi.gc(nc, backend._lib.NAME_CONSTRAINTS_free) + permitted = _encode_general_subtree( + backend, name_constraints.permitted_subtrees + ) + nc.permittedSubtrees = permitted + excluded = _encode_general_subtree( + backend, name_constraints.excluded_subtrees + ) + nc.excludedSubtrees = excluded + + return nc + + +def _encode_policy_constraints(backend, policy_constraints): + pc = backend._lib.POLICY_CONSTRAINTS_new() + backend.openssl_assert(pc != backend._ffi.NULL) + pc = backend._ffi.gc(pc, backend._lib.POLICY_CONSTRAINTS_free) + if policy_constraints.require_explicit_policy is not None: + pc.requireExplicitPolicy = _encode_asn1_int( + backend, policy_constraints.require_explicit_policy + ) + + if policy_constraints.inhibit_policy_mapping is not None: + pc.inhibitPolicyMapping = _encode_asn1_int( + backend, policy_constraints.inhibit_policy_mapping + ) + + return pc + + +def _encode_general_subtree(backend, subtrees): + if subtrees is None: + return backend._ffi.NULL + else: + general_subtrees = backend._lib.sk_GENERAL_SUBTREE_new_null() + for name in subtrees: + gs = backend._lib.GENERAL_SUBTREE_new() + gs.base = _encode_general_name(backend, name) + res = backend._lib.sk_GENERAL_SUBTREE_push(general_subtrees, gs) + assert res >= 1 + + return general_subtrees + + +def _encode_nonce(backend, nonce): + return _encode_asn1_str_gc(backend, nonce.nonce) + + +_EXTENSION_ENCODE_HANDLERS = { + ExtensionOID.BASIC_CONSTRAINTS: _encode_basic_constraints, + ExtensionOID.SUBJECT_KEY_IDENTIFIER: _encode_subject_key_identifier, + ExtensionOID.KEY_USAGE: _encode_key_usage, + ExtensionOID.SUBJECT_ALTERNATIVE_NAME: _encode_alt_name, + ExtensionOID.ISSUER_ALTERNATIVE_NAME: _encode_alt_name, + ExtensionOID.EXTENDED_KEY_USAGE: _encode_extended_key_usage, + ExtensionOID.AUTHORITY_KEY_IDENTIFIER: _encode_authority_key_identifier, + ExtensionOID.CERTIFICATE_POLICIES: _encode_certificate_policies, + ExtensionOID.AUTHORITY_INFORMATION_ACCESS: ( + _encode_authority_information_access + ), + ExtensionOID.CRL_DISTRIBUTION_POINTS: _encode_cdps_freshest_crl, + ExtensionOID.FRESHEST_CRL: _encode_cdps_freshest_crl, + ExtensionOID.INHIBIT_ANY_POLICY: _encode_inhibit_any_policy, + ExtensionOID.OCSP_NO_CHECK: _encode_ocsp_nocheck, + ExtensionOID.NAME_CONSTRAINTS: _encode_name_constraints, + ExtensionOID.POLICY_CONSTRAINTS: _encode_policy_constraints, +} + +_CRL_EXTENSION_ENCODE_HANDLERS = { + ExtensionOID.ISSUER_ALTERNATIVE_NAME: _encode_alt_name, + ExtensionOID.AUTHORITY_KEY_IDENTIFIER: _encode_authority_key_identifier, + ExtensionOID.AUTHORITY_INFORMATION_ACCESS: ( + _encode_authority_information_access + ), + ExtensionOID.CRL_NUMBER: _encode_crl_number_delta_crl_indicator, + ExtensionOID.DELTA_CRL_INDICATOR: _encode_crl_number_delta_crl_indicator, + ExtensionOID.ISSUING_DISTRIBUTION_POINT: _encode_issuing_dist_point, +} + +_CRL_ENTRY_EXTENSION_ENCODE_HANDLERS = { + CRLEntryExtensionOID.CERTIFICATE_ISSUER: _encode_alt_name, + CRLEntryExtensionOID.CRL_REASON: _encode_crl_reason, + CRLEntryExtensionOID.INVALIDITY_DATE: _encode_invalidity_date, +} + +_OCSP_REQUEST_EXTENSION_ENCODE_HANDLERS = { + OCSPExtensionOID.NONCE: _encode_nonce, +} + +_OCSP_BASICRESP_EXTENSION_ENCODE_HANDLERS = { + OCSPExtensionOID.NONCE: _encode_nonce, +} diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/backends/openssl/hashes.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/backends/openssl/hashes.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/backends/openssl/hashes.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/backends/openssl/hashes.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,78 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + + +from cryptography import utils +from cryptography.exceptions import UnsupportedAlgorithm, _Reasons +from cryptography.hazmat.primitives import hashes + + +@utils.register_interface(hashes.HashContext) +class _HashContext(object): + def __init__(self, backend, algorithm, ctx=None): + self._algorithm = algorithm + + self._backend = backend + + if ctx is None: + ctx = self._backend._lib.Cryptography_EVP_MD_CTX_new() + ctx = self._backend._ffi.gc( + ctx, self._backend._lib.Cryptography_EVP_MD_CTX_free + ) + evp_md = self._backend._evp_md_from_algorithm(algorithm) + if evp_md == self._backend._ffi.NULL: + raise UnsupportedAlgorithm( + "{} is not a supported hash on this backend.".format( + algorithm.name), + _Reasons.UNSUPPORTED_HASH + ) + res = self._backend._lib.EVP_DigestInit_ex(ctx, evp_md, + self._backend._ffi.NULL) + self._backend.openssl_assert(res != 0) + + self._ctx = ctx + + algorithm = utils.read_only_property("_algorithm") + + def copy(self): + copied_ctx = self._backend._lib.Cryptography_EVP_MD_CTX_new() + copied_ctx = self._backend._ffi.gc( + copied_ctx, self._backend._lib.Cryptography_EVP_MD_CTX_free + ) + res = self._backend._lib.EVP_MD_CTX_copy_ex(copied_ctx, self._ctx) + self._backend.openssl_assert(res != 0) + return _HashContext(self._backend, self.algorithm, ctx=copied_ctx) + + def update(self, data): + data_ptr = self._backend._ffi.from_buffer(data) + res = self._backend._lib.EVP_DigestUpdate( + self._ctx, data_ptr, len(data) + ) + self._backend.openssl_assert(res != 0) + + def finalize(self): + if isinstance(self.algorithm, hashes.ExtendableOutputFunction): + # extendable output functions use a different finalize + return self._finalize_xof() + else: + buf = self._backend._ffi.new("unsigned char[]", + self._backend._lib.EVP_MAX_MD_SIZE) + outlen = self._backend._ffi.new("unsigned int *") + res = self._backend._lib.EVP_DigestFinal_ex(self._ctx, buf, outlen) + self._backend.openssl_assert(res != 0) + self._backend.openssl_assert( + outlen[0] == self.algorithm.digest_size + ) + return self._backend._ffi.buffer(buf)[:outlen[0]] + + def _finalize_xof(self): + buf = self._backend._ffi.new("unsigned char[]", + self.algorithm.digest_size) + res = self._backend._lib.EVP_DigestFinalXOF( + self._ctx, buf, self.algorithm.digest_size + ) + self._backend.openssl_assert(res != 0) + return self._backend._ffi.buffer(buf)[:self.algorithm.digest_size] diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/backends/openssl/hmac.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/backends/openssl/hmac.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/backends/openssl/hmac.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/backends/openssl/hmac.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,74 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + + +from cryptography import utils +from cryptography.exceptions import ( + InvalidSignature, UnsupportedAlgorithm, _Reasons +) +from cryptography.hazmat.primitives import constant_time, hashes + + +@utils.register_interface(hashes.HashContext) +class _HMACContext(object): + def __init__(self, backend, key, algorithm, ctx=None): + self._algorithm = algorithm + self._backend = backend + + if ctx is None: + ctx = self._backend._lib.Cryptography_HMAC_CTX_new() + self._backend.openssl_assert(ctx != self._backend._ffi.NULL) + ctx = self._backend._ffi.gc( + ctx, self._backend._lib.Cryptography_HMAC_CTX_free + ) + evp_md = self._backend._evp_md_from_algorithm(algorithm) + if evp_md == self._backend._ffi.NULL: + raise UnsupportedAlgorithm( + "{} is not a supported hash on this backend".format( + algorithm.name), + _Reasons.UNSUPPORTED_HASH + ) + key_ptr = self._backend._ffi.from_buffer(key) + res = self._backend._lib.HMAC_Init_ex( + ctx, key_ptr, len(key), evp_md, self._backend._ffi.NULL + ) + self._backend.openssl_assert(res != 0) + + self._ctx = ctx + self._key = key + + algorithm = utils.read_only_property("_algorithm") + + def copy(self): + copied_ctx = self._backend._lib.Cryptography_HMAC_CTX_new() + self._backend.openssl_assert(copied_ctx != self._backend._ffi.NULL) + copied_ctx = self._backend._ffi.gc( + copied_ctx, self._backend._lib.Cryptography_HMAC_CTX_free + ) + res = self._backend._lib.HMAC_CTX_copy(copied_ctx, self._ctx) + self._backend.openssl_assert(res != 0) + return _HMACContext( + self._backend, self._key, self.algorithm, ctx=copied_ctx + ) + + def update(self, data): + data_ptr = self._backend._ffi.from_buffer(data) + res = self._backend._lib.HMAC_Update(self._ctx, data_ptr, len(data)) + self._backend.openssl_assert(res != 0) + + def finalize(self): + buf = self._backend._ffi.new("unsigned char[]", + self._backend._lib.EVP_MAX_MD_SIZE) + outlen = self._backend._ffi.new("unsigned int *") + res = self._backend._lib.HMAC_Final(self._ctx, buf, outlen) + self._backend.openssl_assert(res != 0) + self._backend.openssl_assert(outlen[0] == self.algorithm.digest_size) + return self._backend._ffi.buffer(buf)[:outlen[0]] + + def verify(self, signature): + digest = self.finalize() + if not constant_time.bytes_eq(digest, signature): + raise InvalidSignature("Signature did not match digest.") diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/backends/openssl/__init__.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/backends/openssl/__init__.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/backends/openssl/__init__.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/backends/openssl/__init__.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,10 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +from cryptography.hazmat.backends.openssl.backend import backend + + +__all__ = ["backend"] diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/backends/openssl/ocsp.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/backends/openssl/ocsp.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/backends/openssl/ocsp.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/backends/openssl/ocsp.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,381 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +import functools + +from cryptography import utils, x509 +from cryptography.exceptions import UnsupportedAlgorithm +from cryptography.hazmat.backends.openssl.decode_asn1 import ( + _CRL_ENTRY_REASON_CODE_TO_ENUM, _OCSP_BASICRESP_EXT_PARSER, + _OCSP_REQ_EXT_PARSER, _asn1_integer_to_int, + _asn1_string_to_bytes, _decode_x509_name, _obj2txt, + _parse_asn1_generalized_time, +) +from cryptography.hazmat.backends.openssl.x509 import _Certificate +from cryptography.hazmat.primitives import serialization +from cryptography.x509.ocsp import ( + OCSPCertStatus, OCSPRequest, OCSPResponse, OCSPResponseStatus, + _CERT_STATUS_TO_ENUM, _OIDS_TO_HASH, _RESPONSE_STATUS_TO_ENUM, +) + + +def _requires_successful_response(func): + @functools.wraps(func) + def wrapper(self, *args): + if self.response_status != OCSPResponseStatus.SUCCESSFUL: + raise ValueError( + "OCSP response status is not successful so the property " + "has no value" + ) + else: + return func(self, *args) + + return wrapper + + +def _issuer_key_hash(backend, cert_id): + key_hash = backend._ffi.new("ASN1_OCTET_STRING **") + res = backend._lib.OCSP_id_get0_info( + backend._ffi.NULL, backend._ffi.NULL, + key_hash, backend._ffi.NULL, cert_id + ) + backend.openssl_assert(res == 1) + backend.openssl_assert(key_hash[0] != backend._ffi.NULL) + return _asn1_string_to_bytes(backend, key_hash[0]) + + +def _issuer_name_hash(backend, cert_id): + name_hash = backend._ffi.new("ASN1_OCTET_STRING **") + res = backend._lib.OCSP_id_get0_info( + name_hash, backend._ffi.NULL, + backend._ffi.NULL, backend._ffi.NULL, cert_id + ) + backend.openssl_assert(res == 1) + backend.openssl_assert(name_hash[0] != backend._ffi.NULL) + return _asn1_string_to_bytes(backend, name_hash[0]) + + +def _serial_number(backend, cert_id): + num = backend._ffi.new("ASN1_INTEGER **") + res = backend._lib.OCSP_id_get0_info( + backend._ffi.NULL, backend._ffi.NULL, + backend._ffi.NULL, num, cert_id + ) + backend.openssl_assert(res == 1) + backend.openssl_assert(num[0] != backend._ffi.NULL) + return _asn1_integer_to_int(backend, num[0]) + + +def _hash_algorithm(backend, cert_id): + asn1obj = backend._ffi.new("ASN1_OBJECT **") + res = backend._lib.OCSP_id_get0_info( + backend._ffi.NULL, asn1obj, + backend._ffi.NULL, backend._ffi.NULL, cert_id + ) + backend.openssl_assert(res == 1) + backend.openssl_assert(asn1obj[0] != backend._ffi.NULL) + oid = _obj2txt(backend, asn1obj[0]) + try: + return _OIDS_TO_HASH[oid] + except KeyError: + raise UnsupportedAlgorithm( + "Signature algorithm OID: {} not recognized".format(oid) + ) + + +@utils.register_interface(OCSPResponse) +class _OCSPResponse(object): + def __init__(self, backend, ocsp_response): + self._backend = backend + self._ocsp_response = ocsp_response + status = self._backend._lib.OCSP_response_status(self._ocsp_response) + self._backend.openssl_assert(status in _RESPONSE_STATUS_TO_ENUM) + self._status = _RESPONSE_STATUS_TO_ENUM[status] + if self._status is OCSPResponseStatus.SUCCESSFUL: + basic = self._backend._lib.OCSP_response_get1_basic( + self._ocsp_response + ) + self._backend.openssl_assert(basic != self._backend._ffi.NULL) + self._basic = self._backend._ffi.gc( + basic, self._backend._lib.OCSP_BASICRESP_free + ) + self._backend.openssl_assert( + self._backend._lib.OCSP_resp_count(self._basic) == 1 + ) + self._single = self._backend._lib.OCSP_resp_get0(self._basic, 0) + self._backend.openssl_assert( + self._single != self._backend._ffi.NULL + ) + self._cert_id = self._backend._lib.OCSP_SINGLERESP_get0_id( + self._single + ) + self._backend.openssl_assert( + self._cert_id != self._backend._ffi.NULL + ) + + response_status = utils.read_only_property("_status") + + @property + @_requires_successful_response + def signature_algorithm_oid(self): + alg = self._backend._lib.OCSP_resp_get0_tbs_sigalg(self._basic) + self._backend.openssl_assert(alg != self._backend._ffi.NULL) + oid = _obj2txt(self._backend, alg.algorithm) + return x509.ObjectIdentifier(oid) + + @property + @_requires_successful_response + def signature_hash_algorithm(self): + oid = self.signature_algorithm_oid + try: + return x509._SIG_OIDS_TO_HASH[oid] + except KeyError: + raise UnsupportedAlgorithm( + "Signature algorithm OID:{} not recognized".format(oid) + ) + + @property + @_requires_successful_response + def signature(self): + sig = self._backend._lib.OCSP_resp_get0_signature(self._basic) + self._backend.openssl_assert(sig != self._backend._ffi.NULL) + return _asn1_string_to_bytes(self._backend, sig) + + @property + @_requires_successful_response + def tbs_response_bytes(self): + respdata = self._backend._lib.OCSP_resp_get0_respdata(self._basic) + self._backend.openssl_assert(respdata != self._backend._ffi.NULL) + pp = self._backend._ffi.new("unsigned char **") + res = self._backend._lib.i2d_OCSP_RESPDATA(respdata, pp) + self._backend.openssl_assert(pp[0] != self._backend._ffi.NULL) + pp = self._backend._ffi.gc( + pp, lambda pointer: self._backend._lib.OPENSSL_free(pointer[0]) + ) + self._backend.openssl_assert(res > 0) + return self._backend._ffi.buffer(pp[0], res)[:] + + @property + @_requires_successful_response + def certificates(self): + sk_x509 = self._backend._lib.OCSP_resp_get0_certs(self._basic) + num = self._backend._lib.sk_X509_num(sk_x509) + certs = [] + for i in range(num): + x509 = self._backend._lib.sk_X509_value(sk_x509, i) + self._backend.openssl_assert(x509 != self._backend._ffi.NULL) + cert = _Certificate(self._backend, x509) + # We need to keep the OCSP response that the certificate came from + # alive until the Certificate object itself goes out of scope, so + # we give it a private reference. + cert._ocsp_resp = self + certs.append(cert) + + return certs + + @property + @_requires_successful_response + def responder_key_hash(self): + _, asn1_string = self._responder_key_name() + if asn1_string == self._backend._ffi.NULL: + return None + else: + return _asn1_string_to_bytes(self._backend, asn1_string) + + @property + @_requires_successful_response + def responder_name(self): + x509_name, _ = self._responder_key_name() + if x509_name == self._backend._ffi.NULL: + return None + else: + return _decode_x509_name(self._backend, x509_name) + + def _responder_key_name(self): + asn1_string = self._backend._ffi.new("ASN1_OCTET_STRING **") + x509_name = self._backend._ffi.new("X509_NAME **") + res = self._backend._lib.OCSP_resp_get0_id( + self._basic, asn1_string, x509_name + ) + self._backend.openssl_assert(res == 1) + return x509_name[0], asn1_string[0] + + @property + @_requires_successful_response + def produced_at(self): + produced_at = self._backend._lib.OCSP_resp_get0_produced_at( + self._basic + ) + return _parse_asn1_generalized_time(self._backend, produced_at) + + @property + @_requires_successful_response + def certificate_status(self): + status = self._backend._lib.OCSP_single_get0_status( + self._single, + self._backend._ffi.NULL, + self._backend._ffi.NULL, + self._backend._ffi.NULL, + self._backend._ffi.NULL, + ) + self._backend.openssl_assert(status in _CERT_STATUS_TO_ENUM) + return _CERT_STATUS_TO_ENUM[status] + + @property + @_requires_successful_response + def revocation_time(self): + if self.certificate_status is not OCSPCertStatus.REVOKED: + return None + + asn1_time = self._backend._ffi.new("ASN1_GENERALIZEDTIME **") + self._backend._lib.OCSP_single_get0_status( + self._single, + self._backend._ffi.NULL, + asn1_time, + self._backend._ffi.NULL, + self._backend._ffi.NULL, + ) + self._backend.openssl_assert(asn1_time[0] != self._backend._ffi.NULL) + return _parse_asn1_generalized_time(self._backend, asn1_time[0]) + + @property + @_requires_successful_response + def revocation_reason(self): + if self.certificate_status is not OCSPCertStatus.REVOKED: + return None + + reason_ptr = self._backend._ffi.new("int *") + self._backend._lib.OCSP_single_get0_status( + self._single, + reason_ptr, + self._backend._ffi.NULL, + self._backend._ffi.NULL, + self._backend._ffi.NULL, + ) + # If no reason is encoded OpenSSL returns -1 + if reason_ptr[0] == -1: + return None + else: + self._backend.openssl_assert( + reason_ptr[0] in _CRL_ENTRY_REASON_CODE_TO_ENUM + ) + return _CRL_ENTRY_REASON_CODE_TO_ENUM[reason_ptr[0]] + + @property + @_requires_successful_response + def this_update(self): + asn1_time = self._backend._ffi.new("ASN1_GENERALIZEDTIME **") + self._backend._lib.OCSP_single_get0_status( + self._single, + self._backend._ffi.NULL, + self._backend._ffi.NULL, + asn1_time, + self._backend._ffi.NULL, + ) + self._backend.openssl_assert(asn1_time[0] != self._backend._ffi.NULL) + return _parse_asn1_generalized_time(self._backend, asn1_time[0]) + + @property + @_requires_successful_response + def next_update(self): + asn1_time = self._backend._ffi.new("ASN1_GENERALIZEDTIME **") + self._backend._lib.OCSP_single_get0_status( + self._single, + self._backend._ffi.NULL, + self._backend._ffi.NULL, + self._backend._ffi.NULL, + asn1_time, + ) + if asn1_time[0] != self._backend._ffi.NULL: + return _parse_asn1_generalized_time(self._backend, asn1_time[0]) + else: + return None + + @property + @_requires_successful_response + def issuer_key_hash(self): + return _issuer_key_hash(self._backend, self._cert_id) + + @property + @_requires_successful_response + def issuer_name_hash(self): + return _issuer_name_hash(self._backend, self._cert_id) + + @property + @_requires_successful_response + def hash_algorithm(self): + return _hash_algorithm(self._backend, self._cert_id) + + @property + @_requires_successful_response + def serial_number(self): + return _serial_number(self._backend, self._cert_id) + + @utils.cached_property + @_requires_successful_response + def extensions(self): + return _OCSP_BASICRESP_EXT_PARSER.parse(self._backend, self._basic) + + def public_bytes(self, encoding): + if encoding is not serialization.Encoding.DER: + raise ValueError( + "The only allowed encoding value is Encoding.DER" + ) + + bio = self._backend._create_mem_bio_gc() + res = self._backend._lib.i2d_OCSP_RESPONSE_bio( + bio, self._ocsp_response + ) + self._backend.openssl_assert(res > 0) + return self._backend._read_mem_bio(bio) + + +@utils.register_interface(OCSPRequest) +class _OCSPRequest(object): + def __init__(self, backend, ocsp_request): + if backend._lib.OCSP_request_onereq_count(ocsp_request) > 1: + raise NotImplementedError( + 'OCSP request contains more than one request' + ) + self._backend = backend + self._ocsp_request = ocsp_request + self._request = self._backend._lib.OCSP_request_onereq_get0( + self._ocsp_request, 0 + ) + self._backend.openssl_assert(self._request != self._backend._ffi.NULL) + self._cert_id = self._backend._lib.OCSP_onereq_get0_id(self._request) + self._backend.openssl_assert(self._cert_id != self._backend._ffi.NULL) + + @property + def issuer_key_hash(self): + return _issuer_key_hash(self._backend, self._cert_id) + + @property + def issuer_name_hash(self): + return _issuer_name_hash(self._backend, self._cert_id) + + @property + def serial_number(self): + return _serial_number(self._backend, self._cert_id) + + @property + def hash_algorithm(self): + return _hash_algorithm(self._backend, self._cert_id) + + @utils.cached_property + def extensions(self): + return _OCSP_REQ_EXT_PARSER.parse(self._backend, self._ocsp_request) + + def public_bytes(self, encoding): + if encoding is not serialization.Encoding.DER: + raise ValueError( + "The only allowed encoding value is Encoding.DER" + ) + + bio = self._backend._create_mem_bio_gc() + res = self._backend._lib.i2d_OCSP_REQUEST_bio(bio, self._ocsp_request) + self._backend.openssl_assert(res > 0) + return self._backend._read_mem_bio(bio) diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/backends/openssl/poly1305.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/backends/openssl/poly1305.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/backends/openssl/poly1305.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/backends/openssl/poly1305.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,60 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + + +from cryptography.exceptions import InvalidSignature +from cryptography.hazmat.primitives import constant_time + + +_POLY1305_TAG_SIZE = 16 +_POLY1305_KEY_SIZE = 32 + + +class _Poly1305Context(object): + def __init__(self, backend, key): + self._backend = backend + + key_ptr = self._backend._ffi.from_buffer(key) + # This function copies the key into OpenSSL-owned memory so we don't + # need to retain it ourselves + evp_pkey = self._backend._lib.EVP_PKEY_new_raw_private_key( + self._backend._lib.NID_poly1305, + self._backend._ffi.NULL, key_ptr, len(key) + ) + self._backend.openssl_assert(evp_pkey != self._backend._ffi.NULL) + self._evp_pkey = self._backend._ffi.gc( + evp_pkey, self._backend._lib.EVP_PKEY_free + ) + ctx = self._backend._lib.Cryptography_EVP_MD_CTX_new() + self._backend.openssl_assert(ctx != self._backend._ffi.NULL) + self._ctx = self._backend._ffi.gc( + ctx, self._backend._lib.Cryptography_EVP_MD_CTX_free + ) + res = self._backend._lib.EVP_DigestSignInit( + self._ctx, self._backend._ffi.NULL, self._backend._ffi.NULL, + self._backend._ffi.NULL, self._evp_pkey + ) + self._backend.openssl_assert(res == 1) + + def update(self, data): + data_ptr = self._backend._ffi.from_buffer(data) + res = self._backend._lib.EVP_DigestSignUpdate( + self._ctx, data_ptr, len(data) + ) + self._backend.openssl_assert(res != 0) + + def finalize(self): + buf = self._backend._ffi.new("unsigned char[]", _POLY1305_TAG_SIZE) + outlen = self._backend._ffi.new("size_t *") + res = self._backend._lib.EVP_DigestSignFinal(self._ctx, buf, outlen) + self._backend.openssl_assert(res != 0) + self._backend.openssl_assert(outlen[0] == _POLY1305_TAG_SIZE) + return self._backend._ffi.buffer(buf)[:outlen[0]] + + def verify(self, tag): + mac = self.finalize() + if not constant_time.bytes_eq(mac, tag): + raise InvalidSignature("Value did not match computed tag.") diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/backends/openssl/rsa.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/backends/openssl/rsa.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/backends/openssl/rsa.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/backends/openssl/rsa.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,478 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +import math + +from cryptography import utils +from cryptography.exceptions import ( + InvalidSignature, UnsupportedAlgorithm, _Reasons +) +from cryptography.hazmat.backends.openssl.utils import ( + _calculate_digest_and_algorithm, _check_not_prehashed, + _warn_sign_verify_deprecated +) +from cryptography.hazmat.primitives import hashes +from cryptography.hazmat.primitives.asymmetric import ( + AsymmetricSignatureContext, AsymmetricVerificationContext, rsa +) +from cryptography.hazmat.primitives.asymmetric.padding import ( + AsymmetricPadding, MGF1, OAEP, PKCS1v15, PSS, calculate_max_pss_salt_length +) +from cryptography.hazmat.primitives.asymmetric.rsa import ( + RSAPrivateKeyWithSerialization, RSAPublicKeyWithSerialization +) + + +def _get_rsa_pss_salt_length(pss, key, hash_algorithm): + salt = pss._salt_length + + if salt is MGF1.MAX_LENGTH or salt is PSS.MAX_LENGTH: + return calculate_max_pss_salt_length(key, hash_algorithm) + else: + return salt + + +def _enc_dec_rsa(backend, key, data, padding): + if not isinstance(padding, AsymmetricPadding): + raise TypeError("Padding must be an instance of AsymmetricPadding.") + + if isinstance(padding, PKCS1v15): + padding_enum = backend._lib.RSA_PKCS1_PADDING + elif isinstance(padding, OAEP): + padding_enum = backend._lib.RSA_PKCS1_OAEP_PADDING + + if not isinstance(padding._mgf, MGF1): + raise UnsupportedAlgorithm( + "Only MGF1 is supported by this backend.", + _Reasons.UNSUPPORTED_MGF + ) + + if not backend.rsa_padding_supported(padding): + raise UnsupportedAlgorithm( + "This combination of padding and hash algorithm is not " + "supported by this backend.", + _Reasons.UNSUPPORTED_PADDING + ) + + else: + raise UnsupportedAlgorithm( + "{} is not supported by this backend.".format( + padding.name + ), + _Reasons.UNSUPPORTED_PADDING + ) + + return _enc_dec_rsa_pkey_ctx(backend, key, data, padding_enum, padding) + + +def _enc_dec_rsa_pkey_ctx(backend, key, data, padding_enum, padding): + if isinstance(key, _RSAPublicKey): + init = backend._lib.EVP_PKEY_encrypt_init + crypt = backend._lib.EVP_PKEY_encrypt + else: + init = backend._lib.EVP_PKEY_decrypt_init + crypt = backend._lib.EVP_PKEY_decrypt + + pkey_ctx = backend._lib.EVP_PKEY_CTX_new( + key._evp_pkey, backend._ffi.NULL + ) + backend.openssl_assert(pkey_ctx != backend._ffi.NULL) + pkey_ctx = backend._ffi.gc(pkey_ctx, backend._lib.EVP_PKEY_CTX_free) + res = init(pkey_ctx) + backend.openssl_assert(res == 1) + res = backend._lib.EVP_PKEY_CTX_set_rsa_padding( + pkey_ctx, padding_enum) + backend.openssl_assert(res > 0) + buf_size = backend._lib.EVP_PKEY_size(key._evp_pkey) + backend.openssl_assert(buf_size > 0) + if ( + isinstance(padding, OAEP) and + backend._lib.Cryptography_HAS_RSA_OAEP_MD + ): + mgf1_md = backend._evp_md_non_null_from_algorithm( + padding._mgf._algorithm) + res = backend._lib.EVP_PKEY_CTX_set_rsa_mgf1_md(pkey_ctx, mgf1_md) + backend.openssl_assert(res > 0) + oaep_md = backend._evp_md_non_null_from_algorithm(padding._algorithm) + res = backend._lib.EVP_PKEY_CTX_set_rsa_oaep_md(pkey_ctx, oaep_md) + backend.openssl_assert(res > 0) + + if ( + isinstance(padding, OAEP) and + padding._label is not None and + len(padding._label) > 0 + ): + # set0_rsa_oaep_label takes ownership of the char * so we need to + # copy it into some new memory + labelptr = backend._lib.OPENSSL_malloc(len(padding._label)) + backend.openssl_assert(labelptr != backend._ffi.NULL) + backend._ffi.memmove(labelptr, padding._label, len(padding._label)) + res = backend._lib.EVP_PKEY_CTX_set0_rsa_oaep_label( + pkey_ctx, labelptr, len(padding._label) + ) + backend.openssl_assert(res == 1) + + outlen = backend._ffi.new("size_t *", buf_size) + buf = backend._ffi.new("unsigned char[]", buf_size) + res = crypt(pkey_ctx, buf, outlen, data, len(data)) + if res <= 0: + _handle_rsa_enc_dec_error(backend, key) + + return backend._ffi.buffer(buf)[:outlen[0]] + + +def _handle_rsa_enc_dec_error(backend, key): + errors = backend._consume_errors() + backend.openssl_assert(errors) + backend.openssl_assert(errors[0].lib == backend._lib.ERR_LIB_RSA) + if isinstance(key, _RSAPublicKey): + backend.openssl_assert( + errors[0].reason == backend._lib.RSA_R_DATA_TOO_LARGE_FOR_KEY_SIZE + ) + raise ValueError( + "Data too long for key size. Encrypt less data or use a " + "larger key size." + ) + else: + decoding_errors = [ + backend._lib.RSA_R_BLOCK_TYPE_IS_NOT_01, + backend._lib.RSA_R_BLOCK_TYPE_IS_NOT_02, + backend._lib.RSA_R_OAEP_DECODING_ERROR, + # Though this error looks similar to the + # RSA_R_DATA_TOO_LARGE_FOR_KEY_SIZE, this occurs on decrypts, + # rather than on encrypts + backend._lib.RSA_R_DATA_TOO_LARGE_FOR_MODULUS, + ] + if backend._lib.Cryptography_HAS_RSA_R_PKCS_DECODING_ERROR: + decoding_errors.append(backend._lib.RSA_R_PKCS_DECODING_ERROR) + + backend.openssl_assert(errors[0].reason in decoding_errors) + raise ValueError("Decryption failed.") + + +def _rsa_sig_determine_padding(backend, key, padding, algorithm): + if not isinstance(padding, AsymmetricPadding): + raise TypeError("Expected provider of AsymmetricPadding.") + + pkey_size = backend._lib.EVP_PKEY_size(key._evp_pkey) + backend.openssl_assert(pkey_size > 0) + + if isinstance(padding, PKCS1v15): + padding_enum = backend._lib.RSA_PKCS1_PADDING + elif isinstance(padding, PSS): + if not isinstance(padding._mgf, MGF1): + raise UnsupportedAlgorithm( + "Only MGF1 is supported by this backend.", + _Reasons.UNSUPPORTED_MGF + ) + + # Size of key in bytes - 2 is the maximum + # PSS signature length (salt length is checked later) + if pkey_size - algorithm.digest_size - 2 < 0: + raise ValueError("Digest too large for key size. Use a larger " + "key or different digest.") + + padding_enum = backend._lib.RSA_PKCS1_PSS_PADDING + else: + raise UnsupportedAlgorithm( + "{} is not supported by this backend.".format(padding.name), + _Reasons.UNSUPPORTED_PADDING + ) + + return padding_enum + + +def _rsa_sig_setup(backend, padding, algorithm, key, data, init_func): + padding_enum = _rsa_sig_determine_padding(backend, key, padding, algorithm) + evp_md = backend._evp_md_non_null_from_algorithm(algorithm) + pkey_ctx = backend._lib.EVP_PKEY_CTX_new(key._evp_pkey, backend._ffi.NULL) + backend.openssl_assert(pkey_ctx != backend._ffi.NULL) + pkey_ctx = backend._ffi.gc(pkey_ctx, backend._lib.EVP_PKEY_CTX_free) + res = init_func(pkey_ctx) + backend.openssl_assert(res == 1) + res = backend._lib.EVP_PKEY_CTX_set_signature_md(pkey_ctx, evp_md) + if res == 0: + backend._consume_errors() + raise UnsupportedAlgorithm( + "{} is not supported by this backend for RSA signing.".format( + algorithm.name + ), + _Reasons.UNSUPPORTED_HASH + ) + res = backend._lib.EVP_PKEY_CTX_set_rsa_padding(pkey_ctx, padding_enum) + backend.openssl_assert(res > 0) + if isinstance(padding, PSS): + res = backend._lib.EVP_PKEY_CTX_set_rsa_pss_saltlen( + pkey_ctx, _get_rsa_pss_salt_length(padding, key, algorithm) + ) + backend.openssl_assert(res > 0) + + mgf1_md = backend._evp_md_non_null_from_algorithm( + padding._mgf._algorithm) + res = backend._lib.EVP_PKEY_CTX_set_rsa_mgf1_md(pkey_ctx, mgf1_md) + backend.openssl_assert(res > 0) + + return pkey_ctx + + +def _rsa_sig_sign(backend, padding, algorithm, private_key, data): + pkey_ctx = _rsa_sig_setup( + backend, padding, algorithm, private_key, data, + backend._lib.EVP_PKEY_sign_init + ) + buflen = backend._ffi.new("size_t *") + res = backend._lib.EVP_PKEY_sign( + pkey_ctx, + backend._ffi.NULL, + buflen, + data, + len(data) + ) + backend.openssl_assert(res == 1) + buf = backend._ffi.new("unsigned char[]", buflen[0]) + res = backend._lib.EVP_PKEY_sign( + pkey_ctx, buf, buflen, data, len(data)) + if res != 1: + errors = backend._consume_errors() + backend.openssl_assert(errors[0].lib == backend._lib.ERR_LIB_RSA) + if ( + errors[0].reason == + backend._lib.RSA_R_DATA_TOO_LARGE_FOR_KEY_SIZE + ): + reason = ("Salt length too long for key size. Try using " + "MAX_LENGTH instead.") + else: + backend.openssl_assert( + errors[0].reason == + backend._lib.RSA_R_DIGEST_TOO_BIG_FOR_RSA_KEY + ) + reason = "Digest too large for key size. Use a larger key." + raise ValueError(reason) + + return backend._ffi.buffer(buf)[:] + + +def _rsa_sig_verify(backend, padding, algorithm, public_key, signature, data): + pkey_ctx = _rsa_sig_setup( + backend, padding, algorithm, public_key, data, + backend._lib.EVP_PKEY_verify_init + ) + res = backend._lib.EVP_PKEY_verify( + pkey_ctx, signature, len(signature), data, len(data) + ) + # The previous call can return negative numbers in the event of an + # error. This is not a signature failure but we need to fail if it + # occurs. + backend.openssl_assert(res >= 0) + if res == 0: + backend._consume_errors() + raise InvalidSignature + + +@utils.register_interface(AsymmetricSignatureContext) +class _RSASignatureContext(object): + def __init__(self, backend, private_key, padding, algorithm): + self._backend = backend + self._private_key = private_key + + # We now call _rsa_sig_determine_padding in _rsa_sig_setup. However + # we need to make a pointless call to it here so we maintain the + # API of erroring on init with this context if the values are invalid. + _rsa_sig_determine_padding(backend, private_key, padding, algorithm) + self._padding = padding + self._algorithm = algorithm + self._hash_ctx = hashes.Hash(self._algorithm, self._backend) + + def update(self, data): + self._hash_ctx.update(data) + + def finalize(self): + return _rsa_sig_sign( + self._backend, + self._padding, + self._algorithm, + self._private_key, + self._hash_ctx.finalize() + ) + + +@utils.register_interface(AsymmetricVerificationContext) +class _RSAVerificationContext(object): + def __init__(self, backend, public_key, signature, padding, algorithm): + self._backend = backend + self._public_key = public_key + self._signature = signature + self._padding = padding + # We now call _rsa_sig_determine_padding in _rsa_sig_setup. However + # we need to make a pointless call to it here so we maintain the + # API of erroring on init with this context if the values are invalid. + _rsa_sig_determine_padding(backend, public_key, padding, algorithm) + + padding = padding + self._algorithm = algorithm + self._hash_ctx = hashes.Hash(self._algorithm, self._backend) + + def update(self, data): + self._hash_ctx.update(data) + + def verify(self): + return _rsa_sig_verify( + self._backend, + self._padding, + self._algorithm, + self._public_key, + self._signature, + self._hash_ctx.finalize() + ) + + +@utils.register_interface(RSAPrivateKeyWithSerialization) +class _RSAPrivateKey(object): + def __init__(self, backend, rsa_cdata, evp_pkey): + self._backend = backend + self._rsa_cdata = rsa_cdata + self._evp_pkey = evp_pkey + + n = self._backend._ffi.new("BIGNUM **") + self._backend._lib.RSA_get0_key( + self._rsa_cdata, n, self._backend._ffi.NULL, + self._backend._ffi.NULL + ) + self._backend.openssl_assert(n[0] != self._backend._ffi.NULL) + self._key_size = self._backend._lib.BN_num_bits(n[0]) + + key_size = utils.read_only_property("_key_size") + + def signer(self, padding, algorithm): + _warn_sign_verify_deprecated() + _check_not_prehashed(algorithm) + return _RSASignatureContext(self._backend, self, padding, algorithm) + + def decrypt(self, ciphertext, padding): + key_size_bytes = int(math.ceil(self.key_size / 8.0)) + if key_size_bytes != len(ciphertext): + raise ValueError("Ciphertext length must be equal to key size.") + + return _enc_dec_rsa(self._backend, self, ciphertext, padding) + + def public_key(self): + ctx = self._backend._lib.RSAPublicKey_dup(self._rsa_cdata) + self._backend.openssl_assert(ctx != self._backend._ffi.NULL) + ctx = self._backend._ffi.gc(ctx, self._backend._lib.RSA_free) + res = self._backend._lib.RSA_blinding_on(ctx, self._backend._ffi.NULL) + self._backend.openssl_assert(res == 1) + evp_pkey = self._backend._rsa_cdata_to_evp_pkey(ctx) + return _RSAPublicKey(self._backend, ctx, evp_pkey) + + def private_numbers(self): + n = self._backend._ffi.new("BIGNUM **") + e = self._backend._ffi.new("BIGNUM **") + d = self._backend._ffi.new("BIGNUM **") + p = self._backend._ffi.new("BIGNUM **") + q = self._backend._ffi.new("BIGNUM **") + dmp1 = self._backend._ffi.new("BIGNUM **") + dmq1 = self._backend._ffi.new("BIGNUM **") + iqmp = self._backend._ffi.new("BIGNUM **") + self._backend._lib.RSA_get0_key(self._rsa_cdata, n, e, d) + self._backend.openssl_assert(n[0] != self._backend._ffi.NULL) + self._backend.openssl_assert(e[0] != self._backend._ffi.NULL) + self._backend.openssl_assert(d[0] != self._backend._ffi.NULL) + self._backend._lib.RSA_get0_factors(self._rsa_cdata, p, q) + self._backend.openssl_assert(p[0] != self._backend._ffi.NULL) + self._backend.openssl_assert(q[0] != self._backend._ffi.NULL) + self._backend._lib.RSA_get0_crt_params( + self._rsa_cdata, dmp1, dmq1, iqmp + ) + self._backend.openssl_assert(dmp1[0] != self._backend._ffi.NULL) + self._backend.openssl_assert(dmq1[0] != self._backend._ffi.NULL) + self._backend.openssl_assert(iqmp[0] != self._backend._ffi.NULL) + return rsa.RSAPrivateNumbers( + p=self._backend._bn_to_int(p[0]), + q=self._backend._bn_to_int(q[0]), + d=self._backend._bn_to_int(d[0]), + dmp1=self._backend._bn_to_int(dmp1[0]), + dmq1=self._backend._bn_to_int(dmq1[0]), + iqmp=self._backend._bn_to_int(iqmp[0]), + public_numbers=rsa.RSAPublicNumbers( + e=self._backend._bn_to_int(e[0]), + n=self._backend._bn_to_int(n[0]), + ) + ) + + def private_bytes(self, encoding, format, encryption_algorithm): + return self._backend._private_key_bytes( + encoding, + format, + encryption_algorithm, + self._evp_pkey, + self._rsa_cdata + ) + + def sign(self, data, padding, algorithm): + data, algorithm = _calculate_digest_and_algorithm( + self._backend, data, algorithm + ) + return _rsa_sig_sign(self._backend, padding, algorithm, self, data) + + +@utils.register_interface(RSAPublicKeyWithSerialization) +class _RSAPublicKey(object): + def __init__(self, backend, rsa_cdata, evp_pkey): + self._backend = backend + self._rsa_cdata = rsa_cdata + self._evp_pkey = evp_pkey + + n = self._backend._ffi.new("BIGNUM **") + self._backend._lib.RSA_get0_key( + self._rsa_cdata, n, self._backend._ffi.NULL, + self._backend._ffi.NULL + ) + self._backend.openssl_assert(n[0] != self._backend._ffi.NULL) + self._key_size = self._backend._lib.BN_num_bits(n[0]) + + key_size = utils.read_only_property("_key_size") + + def verifier(self, signature, padding, algorithm): + _warn_sign_verify_deprecated() + utils._check_bytes("signature", signature) + + _check_not_prehashed(algorithm) + return _RSAVerificationContext( + self._backend, self, signature, padding, algorithm + ) + + def encrypt(self, plaintext, padding): + return _enc_dec_rsa(self._backend, self, plaintext, padding) + + def public_numbers(self): + n = self._backend._ffi.new("BIGNUM **") + e = self._backend._ffi.new("BIGNUM **") + self._backend._lib.RSA_get0_key( + self._rsa_cdata, n, e, self._backend._ffi.NULL + ) + self._backend.openssl_assert(n[0] != self._backend._ffi.NULL) + self._backend.openssl_assert(e[0] != self._backend._ffi.NULL) + return rsa.RSAPublicNumbers( + e=self._backend._bn_to_int(e[0]), + n=self._backend._bn_to_int(n[0]), + ) + + def public_bytes(self, encoding, format): + return self._backend._public_key_bytes( + encoding, + format, + self, + self._evp_pkey, + self._rsa_cdata + ) + + def verify(self, signature, data, padding, algorithm): + data, algorithm = _calculate_digest_and_algorithm( + self._backend, data, algorithm + ) + return _rsa_sig_verify( + self._backend, padding, algorithm, self, signature, data + ) diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/backends/openssl/utils.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/backends/openssl/utils.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/backends/openssl/utils.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/backends/openssl/utils.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,69 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +import warnings + +from cryptography import utils +from cryptography.hazmat.primitives import hashes +from cryptography.hazmat.primitives.asymmetric.utils import Prehashed + + +def _evp_pkey_derive(backend, evp_pkey, peer_public_key): + ctx = backend._lib.EVP_PKEY_CTX_new(evp_pkey, backend._ffi.NULL) + backend.openssl_assert(ctx != backend._ffi.NULL) + ctx = backend._ffi.gc(ctx, backend._lib.EVP_PKEY_CTX_free) + res = backend._lib.EVP_PKEY_derive_init(ctx) + backend.openssl_assert(res == 1) + res = backend._lib.EVP_PKEY_derive_set_peer( + ctx, peer_public_key._evp_pkey + ) + backend.openssl_assert(res == 1) + keylen = backend._ffi.new("size_t *") + res = backend._lib.EVP_PKEY_derive(ctx, backend._ffi.NULL, keylen) + backend.openssl_assert(res == 1) + backend.openssl_assert(keylen[0] > 0) + buf = backend._ffi.new("unsigned char[]", keylen[0]) + res = backend._lib.EVP_PKEY_derive(ctx, buf, keylen) + if res != 1: + raise ValueError( + "Null shared key derived from public/private pair." + ) + + return backend._ffi.buffer(buf, keylen[0])[:] + + +def _calculate_digest_and_algorithm(backend, data, algorithm): + if not isinstance(algorithm, Prehashed): + hash_ctx = hashes.Hash(algorithm, backend) + hash_ctx.update(data) + data = hash_ctx.finalize() + else: + algorithm = algorithm._algorithm + + if len(data) != algorithm.digest_size: + raise ValueError( + "The provided data must be the same length as the hash " + "algorithm's digest size." + ) + + return (data, algorithm) + + +def _check_not_prehashed(signature_algorithm): + if isinstance(signature_algorithm, Prehashed): + raise TypeError( + "Prehashed is only supported in the sign and verify methods. " + "It cannot be used with signer or verifier." + ) + + +def _warn_sign_verify_deprecated(): + warnings.warn( + "signer and verifier have been deprecated. Please use sign " + "and verify instead.", + utils.PersistentlyDeprecated2017, + stacklevel=3 + ) diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/backends/openssl/x25519.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/backends/openssl/x25519.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/backends/openssl/x25519.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/backends/openssl/x25519.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,149 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +import warnings + +from cryptography import utils +from cryptography.hazmat.backends.openssl.utils import _evp_pkey_derive +from cryptography.hazmat.primitives import serialization +from cryptography.hazmat.primitives.asymmetric.x25519 import ( + X25519PrivateKey, X25519PublicKey +) + + +_X25519_KEY_SIZE = 32 + + +@utils.register_interface(X25519PublicKey) +class _X25519PublicKey(object): + def __init__(self, backend, evp_pkey): + self._backend = backend + self._evp_pkey = evp_pkey + + def public_bytes(self, encoding=None, format=None): + if encoding is None or format is None: + if encoding is not None or format is not None: + raise ValueError("Both encoding and format are required") + else: + warnings.warn( + "public_bytes now requires encoding and format arguments. " + "Support for calling without arguments will be removed in " + "cryptography 2.7", + utils.DeprecatedIn25, + ) + encoding = serialization.Encoding.Raw + format = serialization.PublicFormat.Raw + if ( + encoding is serialization.Encoding.Raw or + format is serialization.PublicFormat.Raw + ): + if ( + encoding is not serialization.Encoding.Raw or + format is not serialization.PublicFormat.Raw + ): + raise ValueError( + "When using Raw both encoding and format must be Raw" + ) + + return self._raw_public_bytes() + + if ( + encoding in serialization._PEM_DER and + format is not serialization.PublicFormat.SubjectPublicKeyInfo + ): + raise ValueError( + "format must be SubjectPublicKeyInfo when encoding is PEM or " + "DER" + ) + + return self._backend._public_key_bytes( + encoding, format, self, self._evp_pkey, None + ) + + def _raw_public_bytes(self): + ucharpp = self._backend._ffi.new("unsigned char **") + res = self._backend._lib.EVP_PKEY_get1_tls_encodedpoint( + self._evp_pkey, ucharpp + ) + self._backend.openssl_assert(res == 32) + self._backend.openssl_assert(ucharpp[0] != self._backend._ffi.NULL) + data = self._backend._ffi.gc( + ucharpp[0], self._backend._lib.OPENSSL_free + ) + return self._backend._ffi.buffer(data, res)[:] + + +@utils.register_interface(X25519PrivateKey) +class _X25519PrivateKey(object): + def __init__(self, backend, evp_pkey): + self._backend = backend + self._evp_pkey = evp_pkey + + def public_key(self): + bio = self._backend._create_mem_bio_gc() + res = self._backend._lib.i2d_PUBKEY_bio(bio, self._evp_pkey) + self._backend.openssl_assert(res == 1) + evp_pkey = self._backend._lib.d2i_PUBKEY_bio( + bio, self._backend._ffi.NULL + ) + self._backend.openssl_assert(evp_pkey != self._backend._ffi.NULL) + evp_pkey = self._backend._ffi.gc( + evp_pkey, self._backend._lib.EVP_PKEY_free + ) + return _X25519PublicKey(self._backend, evp_pkey) + + def exchange(self, peer_public_key): + if not isinstance(peer_public_key, X25519PublicKey): + raise TypeError("peer_public_key must be X25519PublicKey.") + + return _evp_pkey_derive( + self._backend, self._evp_pkey, peer_public_key + ) + + def private_bytes(self, encoding, format, encryption_algorithm): + if ( + encoding is serialization.Encoding.Raw or + format is serialization.PublicFormat.Raw + ): + if ( + format is not serialization.PrivateFormat.Raw or + encoding is not serialization.Encoding.Raw or not + isinstance(encryption_algorithm, serialization.NoEncryption) + ): + raise ValueError( + "When using Raw both encoding and format must be Raw " + "and encryption_algorithm must be NoEncryption" + ) + + return self._raw_private_bytes() + + if ( + encoding in serialization._PEM_DER and + format is not serialization.PrivateFormat.PKCS8 + ): + raise ValueError( + "format must be PKCS8 when encoding is PEM or DER" + ) + + return self._backend._private_key_bytes( + encoding, format, encryption_algorithm, self._evp_pkey, None + ) + + def _raw_private_bytes(self): + # When we drop support for CRYPTOGRAPHY_OPENSSL_LESS_THAN_111 we can + # switch this to EVP_PKEY_new_raw_private_key + # The trick we use here is serializing to a PKCS8 key and just + # using the last 32 bytes, which is the key itself. + bio = self._backend._create_mem_bio_gc() + res = self._backend._lib.i2d_PKCS8PrivateKey_bio( + bio, self._evp_pkey, + self._backend._ffi.NULL, self._backend._ffi.NULL, + 0, self._backend._ffi.NULL, self._backend._ffi.NULL + ) + self._backend.openssl_assert(res == 1) + pkcs8 = self._backend._read_mem_bio(bio) + self._backend.openssl_assert(len(pkcs8) == 48) + return pkcs8[-_X25519_KEY_SIZE:] diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/backends/openssl/x448.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/backends/openssl/x448.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/backends/openssl/x448.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/backends/openssl/x448.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,123 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +from cryptography import utils +from cryptography.hazmat.backends.openssl.utils import _evp_pkey_derive +from cryptography.hazmat.primitives import serialization +from cryptography.hazmat.primitives.asymmetric.x448 import ( + X448PrivateKey, X448PublicKey +) + +_X448_KEY_SIZE = 56 + + +@utils.register_interface(X448PublicKey) +class _X448PublicKey(object): + def __init__(self, backend, evp_pkey): + self._backend = backend + self._evp_pkey = evp_pkey + + def public_bytes(self, encoding, format): + if ( + encoding is serialization.Encoding.Raw or + format is serialization.PublicFormat.Raw + ): + if ( + encoding is not serialization.Encoding.Raw or + format is not serialization.PublicFormat.Raw + ): + raise ValueError( + "When using Raw both encoding and format must be Raw" + ) + + return self._raw_public_bytes() + + if ( + encoding in serialization._PEM_DER and + format is not serialization.PublicFormat.SubjectPublicKeyInfo + ): + raise ValueError( + "format must be SubjectPublicKeyInfo when encoding is PEM or " + "DER" + ) + + return self._backend._public_key_bytes( + encoding, format, self, self._evp_pkey, None + ) + + def _raw_public_bytes(self): + buf = self._backend._ffi.new("unsigned char []", _X448_KEY_SIZE) + buflen = self._backend._ffi.new("size_t *", _X448_KEY_SIZE) + res = self._backend._lib.EVP_PKEY_get_raw_public_key( + self._evp_pkey, buf, buflen + ) + self._backend.openssl_assert(res == 1) + self._backend.openssl_assert(buflen[0] == _X448_KEY_SIZE) + return self._backend._ffi.buffer(buf, _X448_KEY_SIZE)[:] + + +@utils.register_interface(X448PrivateKey) +class _X448PrivateKey(object): + def __init__(self, backend, evp_pkey): + self._backend = backend + self._evp_pkey = evp_pkey + + def public_key(self): + buf = self._backend._ffi.new("unsigned char []", _X448_KEY_SIZE) + buflen = self._backend._ffi.new("size_t *", _X448_KEY_SIZE) + res = self._backend._lib.EVP_PKEY_get_raw_public_key( + self._evp_pkey, buf, buflen + ) + self._backend.openssl_assert(res == 1) + self._backend.openssl_assert(buflen[0] == _X448_KEY_SIZE) + return self._backend.x448_load_public_bytes(buf) + + def exchange(self, peer_public_key): + if not isinstance(peer_public_key, X448PublicKey): + raise TypeError("peer_public_key must be X448PublicKey.") + + return _evp_pkey_derive( + self._backend, self._evp_pkey, peer_public_key + ) + + def private_bytes(self, encoding, format, encryption_algorithm): + if ( + encoding is serialization.Encoding.Raw or + format is serialization.PublicFormat.Raw + ): + if ( + format is not serialization.PrivateFormat.Raw or + encoding is not serialization.Encoding.Raw or not + isinstance(encryption_algorithm, serialization.NoEncryption) + ): + raise ValueError( + "When using Raw both encoding and format must be Raw " + "and encryption_algorithm must be NoEncryption" + ) + + return self._raw_private_bytes() + + if ( + encoding in serialization._PEM_DER and + format is not serialization.PrivateFormat.PKCS8 + ): + raise ValueError( + "format must be PKCS8 when encoding is PEM or DER" + ) + + return self._backend._private_key_bytes( + encoding, format, encryption_algorithm, self._evp_pkey, None + ) + + def _raw_private_bytes(self): + buf = self._backend._ffi.new("unsigned char []", _X448_KEY_SIZE) + buflen = self._backend._ffi.new("size_t *", _X448_KEY_SIZE) + res = self._backend._lib.EVP_PKEY_get_raw_private_key( + self._evp_pkey, buf, buflen + ) + self._backend.openssl_assert(res == 1) + self._backend.openssl_assert(buflen[0] == _X448_KEY_SIZE) + return self._backend._ffi.buffer(buf, _X448_KEY_SIZE)[:] diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/backends/openssl/x509.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/backends/openssl/x509.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/backends/openssl/x509.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/backends/openssl/x509.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,546 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +import datetime +import operator + +from cryptography import utils, x509 +from cryptography.exceptions import UnsupportedAlgorithm +from cryptography.hazmat.backends.openssl.decode_asn1 import ( + _CERTIFICATE_EXTENSION_PARSER, _CERTIFICATE_EXTENSION_PARSER_NO_SCT, + _CRL_EXTENSION_PARSER, _CSR_EXTENSION_PARSER, + _REVOKED_CERTIFICATE_EXTENSION_PARSER, _asn1_integer_to_int, + _asn1_string_to_bytes, _decode_x509_name, _obj2txt, _parse_asn1_time +) +from cryptography.hazmat.backends.openssl.encode_asn1 import ( + _encode_asn1_int_gc +) +from cryptography.hazmat.primitives import hashes, serialization +from cryptography.hazmat.primitives.asymmetric import dsa, ec, rsa + + +@utils.register_interface(x509.Certificate) +class _Certificate(object): + def __init__(self, backend, x509): + self._backend = backend + self._x509 = x509 + + def __repr__(self): + return "".format(self.subject) + + def __eq__(self, other): + if not isinstance(other, x509.Certificate): + return NotImplemented + + res = self._backend._lib.X509_cmp(self._x509, other._x509) + return res == 0 + + def __ne__(self, other): + return not self == other + + def __hash__(self): + return hash(self.public_bytes(serialization.Encoding.DER)) + + def fingerprint(self, algorithm): + h = hashes.Hash(algorithm, self._backend) + h.update(self.public_bytes(serialization.Encoding.DER)) + return h.finalize() + + @property + def version(self): + version = self._backend._lib.X509_get_version(self._x509) + if version == 0: + return x509.Version.v1 + elif version == 2: + return x509.Version.v3 + else: + raise x509.InvalidVersion( + "{} is not a valid X509 version".format(version), version + ) + + @property + def serial_number(self): + asn1_int = self._backend._lib.X509_get_serialNumber(self._x509) + self._backend.openssl_assert(asn1_int != self._backend._ffi.NULL) + return _asn1_integer_to_int(self._backend, asn1_int) + + def public_key(self): + pkey = self._backend._lib.X509_get_pubkey(self._x509) + if pkey == self._backend._ffi.NULL: + # Remove errors from the stack. + self._backend._consume_errors() + raise ValueError("Certificate public key is of an unknown type") + + pkey = self._backend._ffi.gc(pkey, self._backend._lib.EVP_PKEY_free) + + return self._backend._evp_pkey_to_public_key(pkey) + + @property + def not_valid_before(self): + asn1_time = self._backend._lib.X509_get_notBefore(self._x509) + return _parse_asn1_time(self._backend, asn1_time) + + @property + def not_valid_after(self): + asn1_time = self._backend._lib.X509_get_notAfter(self._x509) + return _parse_asn1_time(self._backend, asn1_time) + + @property + def issuer(self): + issuer = self._backend._lib.X509_get_issuer_name(self._x509) + self._backend.openssl_assert(issuer != self._backend._ffi.NULL) + return _decode_x509_name(self._backend, issuer) + + @property + def subject(self): + subject = self._backend._lib.X509_get_subject_name(self._x509) + self._backend.openssl_assert(subject != self._backend._ffi.NULL) + return _decode_x509_name(self._backend, subject) + + @property + def signature_hash_algorithm(self): + oid = self.signature_algorithm_oid + try: + return x509._SIG_OIDS_TO_HASH[oid] + except KeyError: + raise UnsupportedAlgorithm( + "Signature algorithm OID:{} not recognized".format(oid) + ) + + @property + def signature_algorithm_oid(self): + alg = self._backend._ffi.new("X509_ALGOR **") + self._backend._lib.X509_get0_signature( + self._backend._ffi.NULL, alg, self._x509 + ) + self._backend.openssl_assert(alg[0] != self._backend._ffi.NULL) + oid = _obj2txt(self._backend, alg[0].algorithm) + return x509.ObjectIdentifier(oid) + + @utils.cached_property + def extensions(self): + if self._backend._lib.CRYPTOGRAPHY_OPENSSL_110_OR_GREATER: + return _CERTIFICATE_EXTENSION_PARSER.parse( + self._backend, self._x509 + ) + else: + return _CERTIFICATE_EXTENSION_PARSER_NO_SCT.parse( + self._backend, self._x509 + ) + + @property + def signature(self): + sig = self._backend._ffi.new("ASN1_BIT_STRING **") + self._backend._lib.X509_get0_signature( + sig, self._backend._ffi.NULL, self._x509 + ) + self._backend.openssl_assert(sig[0] != self._backend._ffi.NULL) + return _asn1_string_to_bytes(self._backend, sig[0]) + + @property + def tbs_certificate_bytes(self): + pp = self._backend._ffi.new("unsigned char **") + res = self._backend._lib.i2d_re_X509_tbs(self._x509, pp) + self._backend.openssl_assert(res > 0) + pp = self._backend._ffi.gc( + pp, lambda pointer: self._backend._lib.OPENSSL_free(pointer[0]) + ) + return self._backend._ffi.buffer(pp[0], res)[:] + + def public_bytes(self, encoding): + bio = self._backend._create_mem_bio_gc() + if encoding is serialization.Encoding.PEM: + res = self._backend._lib.PEM_write_bio_X509(bio, self._x509) + elif encoding is serialization.Encoding.DER: + res = self._backend._lib.i2d_X509_bio(bio, self._x509) + else: + raise TypeError("encoding must be an item from the Encoding enum") + + self._backend.openssl_assert(res == 1) + return self._backend._read_mem_bio(bio) + + +@utils.register_interface(x509.RevokedCertificate) +class _RevokedCertificate(object): + def __init__(self, backend, crl, x509_revoked): + self._backend = backend + # The X509_REVOKED_value is a X509_REVOKED * that has + # no reference counting. This means when X509_CRL_free is + # called then the CRL and all X509_REVOKED * are freed. Since + # you can retain a reference to a single revoked certificate + # and let the CRL fall out of scope we need to retain a + # private reference to the CRL inside the RevokedCertificate + # object to prevent the gc from being called inappropriately. + self._crl = crl + self._x509_revoked = x509_revoked + + @property + def serial_number(self): + asn1_int = self._backend._lib.X509_REVOKED_get0_serialNumber( + self._x509_revoked + ) + self._backend.openssl_assert(asn1_int != self._backend._ffi.NULL) + return _asn1_integer_to_int(self._backend, asn1_int) + + @property + def revocation_date(self): + return _parse_asn1_time( + self._backend, + self._backend._lib.X509_REVOKED_get0_revocationDate( + self._x509_revoked + ) + ) + + @utils.cached_property + def extensions(self): + return _REVOKED_CERTIFICATE_EXTENSION_PARSER.parse( + self._backend, self._x509_revoked + ) + + +@utils.register_interface(x509.CertificateRevocationList) +class _CertificateRevocationList(object): + def __init__(self, backend, x509_crl): + self._backend = backend + self._x509_crl = x509_crl + + def __eq__(self, other): + if not isinstance(other, x509.CertificateRevocationList): + return NotImplemented + + res = self._backend._lib.X509_CRL_cmp(self._x509_crl, other._x509_crl) + return res == 0 + + def __ne__(self, other): + return not self == other + + def fingerprint(self, algorithm): + h = hashes.Hash(algorithm, self._backend) + bio = self._backend._create_mem_bio_gc() + res = self._backend._lib.i2d_X509_CRL_bio( + bio, self._x509_crl + ) + self._backend.openssl_assert(res == 1) + der = self._backend._read_mem_bio(bio) + h.update(der) + return h.finalize() + + @utils.cached_property + def _sorted_crl(self): + # X509_CRL_get0_by_serial sorts in place, which breaks a variety of + # things we don't want to break (like iteration and the signature). + # Let's dupe it and sort that instead. + dup = self._backend._lib.X509_CRL_dup(self._x509_crl) + self._backend.openssl_assert(dup != self._backend._ffi.NULL) + dup = self._backend._ffi.gc(dup, self._backend._lib.X509_CRL_free) + return dup + + def get_revoked_certificate_by_serial_number(self, serial_number): + revoked = self._backend._ffi.new("X509_REVOKED **") + asn1_int = _encode_asn1_int_gc(self._backend, serial_number) + res = self._backend._lib.X509_CRL_get0_by_serial( + self._sorted_crl, revoked, asn1_int + ) + if res == 0: + return None + else: + self._backend.openssl_assert( + revoked[0] != self._backend._ffi.NULL + ) + return _RevokedCertificate( + self._backend, self._sorted_crl, revoked[0] + ) + + @property + def signature_hash_algorithm(self): + oid = self.signature_algorithm_oid + try: + return x509._SIG_OIDS_TO_HASH[oid] + except KeyError: + raise UnsupportedAlgorithm( + "Signature algorithm OID:{} not recognized".format(oid) + ) + + @property + def signature_algorithm_oid(self): + alg = self._backend._ffi.new("X509_ALGOR **") + self._backend._lib.X509_CRL_get0_signature( + self._x509_crl, self._backend._ffi.NULL, alg + ) + self._backend.openssl_assert(alg[0] != self._backend._ffi.NULL) + oid = _obj2txt(self._backend, alg[0].algorithm) + return x509.ObjectIdentifier(oid) + + @property + def issuer(self): + issuer = self._backend._lib.X509_CRL_get_issuer(self._x509_crl) + self._backend.openssl_assert(issuer != self._backend._ffi.NULL) + return _decode_x509_name(self._backend, issuer) + + @property + def next_update(self): + nu = self._backend._lib.X509_CRL_get_nextUpdate(self._x509_crl) + self._backend.openssl_assert(nu != self._backend._ffi.NULL) + return _parse_asn1_time(self._backend, nu) + + @property + def last_update(self): + lu = self._backend._lib.X509_CRL_get_lastUpdate(self._x509_crl) + self._backend.openssl_assert(lu != self._backend._ffi.NULL) + return _parse_asn1_time(self._backend, lu) + + @property + def signature(self): + sig = self._backend._ffi.new("ASN1_BIT_STRING **") + self._backend._lib.X509_CRL_get0_signature( + self._x509_crl, sig, self._backend._ffi.NULL + ) + self._backend.openssl_assert(sig[0] != self._backend._ffi.NULL) + return _asn1_string_to_bytes(self._backend, sig[0]) + + @property + def tbs_certlist_bytes(self): + pp = self._backend._ffi.new("unsigned char **") + res = self._backend._lib.i2d_re_X509_CRL_tbs(self._x509_crl, pp) + self._backend.openssl_assert(res > 0) + pp = self._backend._ffi.gc( + pp, lambda pointer: self._backend._lib.OPENSSL_free(pointer[0]) + ) + return self._backend._ffi.buffer(pp[0], res)[:] + + def public_bytes(self, encoding): + bio = self._backend._create_mem_bio_gc() + if encoding is serialization.Encoding.PEM: + res = self._backend._lib.PEM_write_bio_X509_CRL( + bio, self._x509_crl + ) + elif encoding is serialization.Encoding.DER: + res = self._backend._lib.i2d_X509_CRL_bio(bio, self._x509_crl) + else: + raise TypeError("encoding must be an item from the Encoding enum") + + self._backend.openssl_assert(res == 1) + return self._backend._read_mem_bio(bio) + + def _revoked_cert(self, idx): + revoked = self._backend._lib.X509_CRL_get_REVOKED(self._x509_crl) + r = self._backend._lib.sk_X509_REVOKED_value(revoked, idx) + self._backend.openssl_assert(r != self._backend._ffi.NULL) + return _RevokedCertificate(self._backend, self, r) + + def __iter__(self): + for i in range(len(self)): + yield self._revoked_cert(i) + + def __getitem__(self, idx): + if isinstance(idx, slice): + start, stop, step = idx.indices(len(self)) + return [self._revoked_cert(i) for i in range(start, stop, step)] + else: + idx = operator.index(idx) + if idx < 0: + idx += len(self) + if not 0 <= idx < len(self): + raise IndexError + return self._revoked_cert(idx) + + def __len__(self): + revoked = self._backend._lib.X509_CRL_get_REVOKED(self._x509_crl) + if revoked == self._backend._ffi.NULL: + return 0 + else: + return self._backend._lib.sk_X509_REVOKED_num(revoked) + + @utils.cached_property + def extensions(self): + return _CRL_EXTENSION_PARSER.parse(self._backend, self._x509_crl) + + def is_signature_valid(self, public_key): + if not isinstance(public_key, (dsa.DSAPublicKey, rsa.RSAPublicKey, + ec.EllipticCurvePublicKey)): + raise TypeError('Expecting one of DSAPublicKey, RSAPublicKey,' + ' or EllipticCurvePublicKey.') + res = self._backend._lib.X509_CRL_verify( + self._x509_crl, public_key._evp_pkey + ) + + if res != 1: + self._backend._consume_errors() + return False + + return True + + +@utils.register_interface(x509.CertificateSigningRequest) +class _CertificateSigningRequest(object): + def __init__(self, backend, x509_req): + self._backend = backend + self._x509_req = x509_req + + def __eq__(self, other): + if not isinstance(other, _CertificateSigningRequest): + return NotImplemented + + self_bytes = self.public_bytes(serialization.Encoding.DER) + other_bytes = other.public_bytes(serialization.Encoding.DER) + return self_bytes == other_bytes + + def __ne__(self, other): + return not self == other + + def __hash__(self): + return hash(self.public_bytes(serialization.Encoding.DER)) + + def public_key(self): + pkey = self._backend._lib.X509_REQ_get_pubkey(self._x509_req) + self._backend.openssl_assert(pkey != self._backend._ffi.NULL) + pkey = self._backend._ffi.gc(pkey, self._backend._lib.EVP_PKEY_free) + return self._backend._evp_pkey_to_public_key(pkey) + + @property + def subject(self): + subject = self._backend._lib.X509_REQ_get_subject_name(self._x509_req) + self._backend.openssl_assert(subject != self._backend._ffi.NULL) + return _decode_x509_name(self._backend, subject) + + @property + def signature_hash_algorithm(self): + oid = self.signature_algorithm_oid + try: + return x509._SIG_OIDS_TO_HASH[oid] + except KeyError: + raise UnsupportedAlgorithm( + "Signature algorithm OID:{} not recognized".format(oid) + ) + + @property + def signature_algorithm_oid(self): + alg = self._backend._ffi.new("X509_ALGOR **") + self._backend._lib.X509_REQ_get0_signature( + self._x509_req, self._backend._ffi.NULL, alg + ) + self._backend.openssl_assert(alg[0] != self._backend._ffi.NULL) + oid = _obj2txt(self._backend, alg[0].algorithm) + return x509.ObjectIdentifier(oid) + + @utils.cached_property + def extensions(self): + x509_exts = self._backend._lib.X509_REQ_get_extensions(self._x509_req) + x509_exts = self._backend._ffi.gc( + x509_exts, + lambda x: self._backend._lib.sk_X509_EXTENSION_pop_free( + x, self._backend._ffi.addressof( + self._backend._lib._original_lib, "X509_EXTENSION_free" + ) + ) + ) + return _CSR_EXTENSION_PARSER.parse(self._backend, x509_exts) + + def public_bytes(self, encoding): + bio = self._backend._create_mem_bio_gc() + if encoding is serialization.Encoding.PEM: + res = self._backend._lib.PEM_write_bio_X509_REQ( + bio, self._x509_req + ) + elif encoding is serialization.Encoding.DER: + res = self._backend._lib.i2d_X509_REQ_bio(bio, self._x509_req) + else: + raise TypeError("encoding must be an item from the Encoding enum") + + self._backend.openssl_assert(res == 1) + return self._backend._read_mem_bio(bio) + + @property + def tbs_certrequest_bytes(self): + pp = self._backend._ffi.new("unsigned char **") + res = self._backend._lib.i2d_re_X509_REQ_tbs(self._x509_req, pp) + self._backend.openssl_assert(res > 0) + pp = self._backend._ffi.gc( + pp, lambda pointer: self._backend._lib.OPENSSL_free(pointer[0]) + ) + return self._backend._ffi.buffer(pp[0], res)[:] + + @property + def signature(self): + sig = self._backend._ffi.new("ASN1_BIT_STRING **") + self._backend._lib.X509_REQ_get0_signature( + self._x509_req, sig, self._backend._ffi.NULL + ) + self._backend.openssl_assert(sig[0] != self._backend._ffi.NULL) + return _asn1_string_to_bytes(self._backend, sig[0]) + + @property + def is_signature_valid(self): + pkey = self._backend._lib.X509_REQ_get_pubkey(self._x509_req) + self._backend.openssl_assert(pkey != self._backend._ffi.NULL) + pkey = self._backend._ffi.gc(pkey, self._backend._lib.EVP_PKEY_free) + res = self._backend._lib.X509_REQ_verify(self._x509_req, pkey) + + if res != 1: + self._backend._consume_errors() + return False + + return True + + +@utils.register_interface( + x509.certificate_transparency.SignedCertificateTimestamp +) +class _SignedCertificateTimestamp(object): + def __init__(self, backend, sct_list, sct): + self._backend = backend + # Keep the SCT_LIST that this SCT came from alive. + self._sct_list = sct_list + self._sct = sct + + @property + def version(self): + version = self._backend._lib.SCT_get_version(self._sct) + assert version == self._backend._lib.SCT_VERSION_V1 + return x509.certificate_transparency.Version.v1 + + @property + def log_id(self): + out = self._backend._ffi.new("unsigned char **") + log_id_length = self._backend._lib.SCT_get0_log_id(self._sct, out) + assert log_id_length >= 0 + return self._backend._ffi.buffer(out[0], log_id_length)[:] + + @property + def timestamp(self): + timestamp = self._backend._lib.SCT_get_timestamp(self._sct) + milliseconds = timestamp % 1000 + return datetime.datetime.utcfromtimestamp( + timestamp // 1000 + ).replace(microsecond=milliseconds * 1000) + + @property + def entry_type(self): + entry_type = self._backend._lib.SCT_get_log_entry_type(self._sct) + # We currently only support loading SCTs from the X.509 extension, so + # we only have precerts. + assert entry_type == self._backend._lib.CT_LOG_ENTRY_TYPE_PRECERT + return x509.certificate_transparency.LogEntryType.PRE_CERTIFICATE + + @property + def _signature(self): + ptrptr = self._backend._ffi.new("unsigned char **") + res = self._backend._lib.SCT_get0_signature(self._sct, ptrptr) + self._backend.openssl_assert(res > 0) + self._backend.openssl_assert(ptrptr[0] != self._backend._ffi.NULL) + return self._backend._ffi.buffer(ptrptr[0], res)[:] + + def __hash__(self): + return hash(self._signature) + + def __eq__(self, other): + if not isinstance(other, _SignedCertificateTimestamp): + return NotImplemented + + return self._signature == other._signature + + def __ne__(self, other): + return not self == other diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/bindings/__init__.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/bindings/__init__.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/bindings/__init__.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/bindings/__init__.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,5 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/bindings/openssl/binding.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/bindings/openssl/binding.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/bindings/openssl/binding.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/bindings/openssl/binding.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,197 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +import collections +import threading +import types +import warnings + +import cryptography +from cryptography import utils +from cryptography.exceptions import InternalError +from cryptography.hazmat.bindings._openssl import ffi, lib +from cryptography.hazmat.bindings.openssl._conditional import CONDITIONAL_NAMES + +_OpenSSLErrorWithText = collections.namedtuple( + "_OpenSSLErrorWithText", ["code", "lib", "func", "reason", "reason_text"] +) + + +class _OpenSSLError(object): + def __init__(self, code, lib, func, reason): + self._code = code + self._lib = lib + self._func = func + self._reason = reason + + def _lib_reason_match(self, lib, reason): + return lib == self.lib and reason == self.reason + + code = utils.read_only_property("_code") + lib = utils.read_only_property("_lib") + func = utils.read_only_property("_func") + reason = utils.read_only_property("_reason") + + +def _consume_errors(lib): + errors = [] + while True: + code = lib.ERR_get_error() + if code == 0: + break + + err_lib = lib.ERR_GET_LIB(code) + err_func = lib.ERR_GET_FUNC(code) + err_reason = lib.ERR_GET_REASON(code) + + errors.append(_OpenSSLError(code, err_lib, err_func, err_reason)) + + return errors + + +def _openssl_assert(lib, ok): + if not ok: + errors = _consume_errors(lib) + errors_with_text = [] + for err in errors: + buf = ffi.new("char[]", 256) + lib.ERR_error_string_n(err.code, buf, len(buf)) + err_text_reason = ffi.string(buf) + + errors_with_text.append( + _OpenSSLErrorWithText( + err.code, err.lib, err.func, err.reason, err_text_reason + ) + ) + + raise InternalError( + "Unknown OpenSSL error. This error is commonly encountered when " + "another library is not cleaning up the OpenSSL error stack. If " + "you are using cryptography with another library that uses " + "OpenSSL try disabling it before reporting a bug. Otherwise " + "please file an issue at https://github.com/pyca/cryptography/" + "issues with information on how to reproduce " + "this. ({0!r})".format(errors_with_text), + errors_with_text + ) + + +def build_conditional_library(lib, conditional_names): + conditional_lib = types.ModuleType("lib") + conditional_lib._original_lib = lib + excluded_names = set() + for condition, names_cb in conditional_names.items(): + if not getattr(lib, condition): + excluded_names.update(names_cb()) + + for attr in dir(lib): + if attr not in excluded_names: + setattr(conditional_lib, attr, getattr(lib, attr)) + + return conditional_lib + + +class Binding(object): + """ + OpenSSL API wrapper. + """ + lib = None + ffi = ffi + _lib_loaded = False + _init_lock = threading.Lock() + _lock_init_lock = threading.Lock() + + def __init__(self): + self._ensure_ffi_initialized() + + @classmethod + def _register_osrandom_engine(cls): + # Clear any errors extant in the queue before we start. In many + # scenarios other things may be interacting with OpenSSL in the same + # process space and it has proven untenable to assume that they will + # reliably clear the error queue. Once we clear it here we will + # error on any subsequent unexpected item in the stack. + cls.lib.ERR_clear_error() + if cls.lib.Cryptography_HAS_ENGINE: + result = cls.lib.Cryptography_add_osrandom_engine() + _openssl_assert(cls.lib, result in (1, 2)) + + @classmethod + def _ensure_ffi_initialized(cls): + with cls._init_lock: + if not cls._lib_loaded: + cls.lib = build_conditional_library(lib, CONDITIONAL_NAMES) + cls._lib_loaded = True + # initialize the SSL library + cls.lib.SSL_library_init() + # adds all ciphers/digests for EVP + cls.lib.OpenSSL_add_all_algorithms() + # loads error strings for libcrypto and libssl functions + cls.lib.SSL_load_error_strings() + cls._register_osrandom_engine() + + @classmethod + def init_static_locks(cls): + with cls._lock_init_lock: + cls._ensure_ffi_initialized() + # Use Python's implementation if available, importing _ssl triggers + # the setup for this. + __import__("_ssl") + + if (not cls.lib.Cryptography_HAS_LOCKING_CALLBACKS or + cls.lib.CRYPTO_get_locking_callback() != cls.ffi.NULL): + return + + # If nothing else has setup a locking callback already, we set up + # our own + res = lib.Cryptography_setup_ssl_threads() + _openssl_assert(cls.lib, res == 1) + + +def _verify_openssl_version(lib): + if ( + lib.CRYPTOGRAPHY_OPENSSL_LESS_THAN_102 and + not lib.CRYPTOGRAPHY_IS_LIBRESSL + ): + warnings.warn( + "OpenSSL version 1.0.1 is no longer supported by the OpenSSL " + "project, please upgrade. A future version of cryptography will " + "drop support for it.", + utils.CryptographyDeprecationWarning + ) + + +def _verify_package_version(version): + # Occasionally we run into situations where the version of the Python + # package does not match the version of the shared object that is loaded. + # This may occur in environments where multiple versions of cryptography + # are installed and available in the python path. To avoid errors cropping + # up later this code checks that the currently imported package and the + # shared object that were loaded have the same version and raise an + # ImportError if they do not + so_package_version = ffi.string(lib.CRYPTOGRAPHY_PACKAGE_VERSION) + if version.encode("ascii") != so_package_version: + raise ImportError( + "The version of cryptography does not match the loaded " + "shared object. This can happen if you have multiple copies of " + "cryptography installed in your Python path. Please try creating " + "a new virtual environment to resolve this issue. " + "Loaded python version: {}, shared object version: {}".format( + version, so_package_version + ) + ) + + +_verify_package_version(cryptography.__version__) + +# OpenSSL is not thread safe until the locks are initialized. We call this +# method in module scope so that it executes with the import lock. On +# Pythons < 3.4 this import lock is a global lock, which can prevent a race +# condition registering the OpenSSL locks. On Python 3.4+ the import lock +# is per module so this approach will not work. +Binding.init_static_locks() + +_verify_openssl_version(Binding.lib) diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/bindings/openssl/_conditional.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/bindings/openssl/_conditional.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/bindings/openssl/_conditional.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/bindings/openssl/_conditional.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,434 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + + +def cryptography_has_ec2m(): + return [ + "EC_POINT_set_affine_coordinates_GF2m", + "EC_POINT_get_affine_coordinates_GF2m", + "EC_POINT_set_compressed_coordinates_GF2m", + ] + + +def cryptography_has_ec_1_0_2(): + return [ + "EC_curve_nid2nist", + ] + + +def cryptography_has_set_ecdh_auto(): + return [ + "SSL_CTX_set_ecdh_auto", + ] + + +def cryptography_has_rsa_r_pkcs_decoding_error(): + return [ + "RSA_R_PKCS_DECODING_ERROR" + ] + + +def cryptography_has_rsa_oaep_md(): + return [ + "EVP_PKEY_CTX_set_rsa_oaep_md", + ] + + +def cryptography_has_rsa_oaep_label(): + return [ + "EVP_PKEY_CTX_set0_rsa_oaep_label", + ] + + +def cryptography_has_ssl3_method(): + return [ + "SSLv3_method", + "SSLv3_client_method", + "SSLv3_server_method", + ] + + +def cryptography_has_alpn(): + return [ + "SSL_CTX_set_alpn_protos", + "SSL_set_alpn_protos", + "SSL_CTX_set_alpn_select_cb", + "SSL_get0_alpn_selected", + ] + + +def cryptography_has_compression(): + return [ + "SSL_get_current_compression", + "SSL_get_current_expansion", + "SSL_COMP_get_name", + ] + + +def cryptography_has_get_server_tmp_key(): + return [ + "SSL_get_server_tmp_key", + ] + + +def cryptography_has_102_verification_error_codes(): + return [ + 'X509_V_ERR_SUITE_B_INVALID_VERSION', + 'X509_V_ERR_SUITE_B_INVALID_ALGORITHM', + 'X509_V_ERR_SUITE_B_INVALID_CURVE', + 'X509_V_ERR_SUITE_B_INVALID_SIGNATURE_ALGORITHM', + 'X509_V_ERR_SUITE_B_LOS_NOT_ALLOWED', + 'X509_V_ERR_SUITE_B_CANNOT_SIGN_P_384_WITH_P_256', + 'X509_V_ERR_HOSTNAME_MISMATCH', + 'X509_V_ERR_EMAIL_MISMATCH', + 'X509_V_ERR_IP_ADDRESS_MISMATCH' + ] + + +def cryptography_has_102_verification_params(): + return [ + "X509_V_FLAG_SUITEB_128_LOS_ONLY", + "X509_V_FLAG_SUITEB_192_LOS", + "X509_V_FLAG_SUITEB_128_LOS", + "X509_VERIFY_PARAM_set1_host", + "X509_VERIFY_PARAM_set1_email", + "X509_VERIFY_PARAM_set1_ip", + "X509_VERIFY_PARAM_set1_ip_asc", + "X509_VERIFY_PARAM_set_hostflags", + "SSL_get0_param", + "X509_CHECK_FLAG_ALWAYS_CHECK_SUBJECT", + "X509_CHECK_FLAG_NO_WILDCARDS", + "X509_CHECK_FLAG_NO_PARTIAL_WILDCARDS", + "X509_CHECK_FLAG_MULTI_LABEL_WILDCARDS", + "X509_CHECK_FLAG_SINGLE_LABEL_SUBDOMAINS" + ] + + +def cryptography_has_110_verification_params(): + return [ + "X509_CHECK_FLAG_NEVER_CHECK_SUBJECT" + ] + + +def cryptography_has_x509_v_flag_trusted_first(): + return [ + "X509_V_FLAG_TRUSTED_FIRST", + ] + + +def cryptography_has_x509_v_flag_partial_chain(): + return [ + "X509_V_FLAG_PARTIAL_CHAIN", + ] + + +def cryptography_has_set_cert_cb(): + return [ + "SSL_CTX_set_cert_cb", + "SSL_set_cert_cb", + ] + + +def cryptography_has_ssl_st(): + return [ + "SSL_ST_BEFORE", + "SSL_ST_OK", + "SSL_ST_INIT", + "SSL_ST_RENEGOTIATE", + ] + + +def cryptography_has_tls_st(): + return [ + "TLS_ST_BEFORE", + "TLS_ST_OK", + ] + + +def cryptography_has_locking_callbacks(): + return [ + "Cryptography_setup_ssl_threads", + ] + + +def cryptography_has_scrypt(): + return [ + "EVP_PBE_scrypt", + ] + + +def cryptography_has_generic_dtls_method(): + return [ + "DTLS_method", + "DTLS_server_method", + "DTLS_client_method", + "SSL_OP_NO_DTLSv1", + "SSL_OP_NO_DTLSv1_2", + "DTLS_set_link_mtu", + "DTLS_get_link_min_mtu", + ] + + +def cryptography_has_evp_pkey_dhx(): + return [ + "EVP_PKEY_DHX", + ] + + +def cryptography_has_mem_functions(): + return [ + "Cryptography_CRYPTO_set_mem_functions", + ] + + +def cryptography_has_sct(): + return [ + "SCT_get_version", + "SCT_get_log_entry_type", + "SCT_get0_log_id", + "SCT_get0_signature", + "SCT_get_timestamp", + "SCT_set_source", + "sk_SCT_num", + "sk_SCT_value", + "SCT_LIST_free", + "sk_SCT_push", + "sk_SCT_new_null", + "SCT_new", + "SCT_set1_log_id", + "SCT_set_timestamp", + "SCT_set_version", + "SCT_set_log_entry_type", + ] + + +def cryptography_has_x509_store_ctx_get_issuer(): + return [ + "X509_STORE_get_get_issuer", + "X509_STORE_set_get_issuer", + ] + + +def cryptography_has_x25519(): + return [ + "EVP_PKEY_X25519", + "NID_X25519", + ] + + +def cryptography_has_x448(): + return [ + "EVP_PKEY_X448", + "NID_X448", + ] + + +def cryptography_has_ed448(): + return [ + "EVP_PKEY_ED448", + "NID_ED448", + ] + + +def cryptography_has_ed25519(): + return [ + "NID_ED25519", + "EVP_PKEY_ED25519", + ] + + +def cryptography_has_poly1305(): + return [ + "NID_poly1305", + "EVP_PKEY_POLY1305", + ] + + +def cryptography_has_oneshot_evp_digest_sign_verify(): + return [ + "EVP_DigestSign", + "EVP_DigestVerify", + ] + + +def cryptography_has_evp_digestfinal_xof(): + return [ + "EVP_DigestFinalXOF", + ] + + +def cryptography_has_evp_pkey_get_set_tls_encodedpoint(): + return [ + "EVP_PKEY_get1_tls_encodedpoint", + "EVP_PKEY_set1_tls_encodedpoint", + ] + + +def cryptography_has_fips(): + return [ + "FIPS_set_mode", + "FIPS_mode", + ] + + +def cryptography_has_ssl_sigalgs(): + return [ + "SSL_CTX_set1_sigalgs_list", + "SSL_get_sigalgs", + ] + + +def cryptography_has_psk(): + return [ + "SSL_CTX_use_psk_identity_hint", + "SSL_CTX_set_psk_server_callback", + "SSL_CTX_set_psk_client_callback", + ] + + +def cryptography_has_custom_ext(): + return [ + "SSL_CTX_add_client_custom_ext", + "SSL_CTX_add_server_custom_ext", + "SSL_extension_supported", + ] + + +def cryptography_has_openssl_cleanup(): + return [ + "OPENSSL_cleanup", + ] + + +def cryptography_has_cipher_details(): + return [ + "SSL_CIPHER_is_aead", + "SSL_CIPHER_get_cipher_nid", + "SSL_CIPHER_get_digest_nid", + "SSL_CIPHER_get_kx_nid", + "SSL_CIPHER_get_auth_nid", + ] + + +def cryptography_has_tlsv13(): + return [ + "SSL_OP_NO_TLSv1_3", + "SSL_VERIFY_POST_HANDSHAKE", + "SSL_CTX_set_ciphersuites", + "SSL_verify_client_post_handshake", + "SSL_CTX_set_post_handshake_auth", + "SSL_set_post_handshake_auth", + "SSL_SESSION_get_max_early_data", + "SSL_write_early_data", + "SSL_read_early_data", + "SSL_CTX_set_max_early_data", + ] + + +def cryptography_has_raw_key(): + return [ + "EVP_PKEY_new_raw_private_key", + "EVP_PKEY_new_raw_public_key", + "EVP_PKEY_get_raw_private_key", + "EVP_PKEY_get_raw_public_key", + ] + + +def cryptography_has_evp_r_memory_limit_exceeded(): + return [ + "EVP_R_MEMORY_LIMIT_EXCEEDED", + ] + + +def cryptography_has_engine(): + return [ + "ENGINE_by_id", + "ENGINE_init", + "ENGINE_finish", + "ENGINE_get_default_RAND", + "ENGINE_set_default_RAND", + "ENGINE_unregister_RAND", + "ENGINE_ctrl_cmd", + "ENGINE_free", + "ENGINE_get_name", + "Cryptography_add_osrandom_engine", + ] + + +# This is a mapping of +# {condition: function-returning-names-dependent-on-that-condition} so we can +# loop over them and delete unsupported names at runtime. It will be removed +# when cffi supports #if in cdef. We use functions instead of just a dict of +# lists so we can use coverage to measure which are used. +CONDITIONAL_NAMES = { + "Cryptography_HAS_EC2M": cryptography_has_ec2m, + "Cryptography_HAS_EC_1_0_2": cryptography_has_ec_1_0_2, + "Cryptography_HAS_SET_ECDH_AUTO": cryptography_has_set_ecdh_auto, + "Cryptography_HAS_RSA_R_PKCS_DECODING_ERROR": ( + cryptography_has_rsa_r_pkcs_decoding_error + ), + "Cryptography_HAS_RSA_OAEP_MD": cryptography_has_rsa_oaep_md, + "Cryptography_HAS_RSA_OAEP_LABEL": cryptography_has_rsa_oaep_label, + "Cryptography_HAS_SSL3_METHOD": cryptography_has_ssl3_method, + "Cryptography_HAS_ALPN": cryptography_has_alpn, + "Cryptography_HAS_COMPRESSION": cryptography_has_compression, + "Cryptography_HAS_GET_SERVER_TMP_KEY": cryptography_has_get_server_tmp_key, + "Cryptography_HAS_102_VERIFICATION_ERROR_CODES": ( + cryptography_has_102_verification_error_codes + ), + "Cryptography_HAS_102_VERIFICATION_PARAMS": ( + cryptography_has_102_verification_params + ), + "Cryptography_HAS_110_VERIFICATION_PARAMS": ( + cryptography_has_110_verification_params + ), + "Cryptography_HAS_X509_V_FLAG_TRUSTED_FIRST": ( + cryptography_has_x509_v_flag_trusted_first + ), + "Cryptography_HAS_X509_V_FLAG_PARTIAL_CHAIN": ( + cryptography_has_x509_v_flag_partial_chain + ), + "Cryptography_HAS_SET_CERT_CB": cryptography_has_set_cert_cb, + "Cryptography_HAS_SSL_ST": cryptography_has_ssl_st, + "Cryptography_HAS_TLS_ST": cryptography_has_tls_st, + "Cryptography_HAS_LOCKING_CALLBACKS": cryptography_has_locking_callbacks, + "Cryptography_HAS_SCRYPT": cryptography_has_scrypt, + "Cryptography_HAS_GENERIC_DTLS_METHOD": ( + cryptography_has_generic_dtls_method + ), + "Cryptography_HAS_EVP_PKEY_DHX": cryptography_has_evp_pkey_dhx, + "Cryptography_HAS_MEM_FUNCTIONS": cryptography_has_mem_functions, + "Cryptography_HAS_SCT": cryptography_has_sct, + "Cryptography_HAS_X509_STORE_CTX_GET_ISSUER": ( + cryptography_has_x509_store_ctx_get_issuer + ), + "Cryptography_HAS_X25519": cryptography_has_x25519, + "Cryptography_HAS_X448": cryptography_has_x448, + "Cryptography_HAS_ED448": cryptography_has_ed448, + "Cryptography_HAS_ED25519": cryptography_has_ed25519, + "Cryptography_HAS_POLY1305": cryptography_has_poly1305, + "Cryptography_HAS_ONESHOT_EVP_DIGEST_SIGN_VERIFY": ( + cryptography_has_oneshot_evp_digest_sign_verify + ), + "Cryptography_HAS_EVP_PKEY_get_set_tls_encodedpoint": ( + cryptography_has_evp_pkey_get_set_tls_encodedpoint + ), + "Cryptography_HAS_FIPS": cryptography_has_fips, + "Cryptography_HAS_SIGALGS": cryptography_has_ssl_sigalgs, + "Cryptography_HAS_PSK": cryptography_has_psk, + "Cryptography_HAS_CUSTOM_EXT": cryptography_has_custom_ext, + "Cryptography_HAS_OPENSSL_CLEANUP": cryptography_has_openssl_cleanup, + "Cryptography_HAS_CIPHER_DETAILS": cryptography_has_cipher_details, + "Cryptography_HAS_TLSv1_3": cryptography_has_tlsv13, + "Cryptography_HAS_RAW_KEY": cryptography_has_raw_key, + "Cryptography_HAS_EVP_DIGESTFINAL_XOF": ( + cryptography_has_evp_digestfinal_xof + ), + "Cryptography_HAS_EVP_R_MEMORY_LIMIT_EXCEEDED": ( + cryptography_has_evp_r_memory_limit_exceeded + ), + "Cryptography_HAS_ENGINE": cryptography_has_engine, +} diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/bindings/openssl/__init__.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/bindings/openssl/__init__.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/bindings/openssl/__init__.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/bindings/openssl/__init__.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,5 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/__init__.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/__init__.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/__init__.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/__init__.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,11 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +""" +Hazardous Materials + +This is a "Hazardous Materials" module. You should ONLY use it if you're +100% absolutely sure that you know what you're doing because this module +is full of land mines, dragons, and dinosaurs with laser guns. +""" +from __future__ import absolute_import, division, print_function diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/_oid.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/_oid.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/_oid.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/_oid.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,67 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +from cryptography import utils + + +class ObjectIdentifier(object): + def __init__(self, dotted_string): + self._dotted_string = dotted_string + + nodes = self._dotted_string.split(".") + intnodes = [] + + # There must be at least 2 nodes, the first node must be 0..2, and + # if less than 2, the second node cannot have a value outside the + # range 0..39. All nodes must be integers. + for node in nodes: + try: + intnodes.append(int(node, 0)) + except ValueError: + raise ValueError( + "Malformed OID: %s (non-integer nodes)" % ( + self._dotted_string)) + + if len(nodes) < 2: + raise ValueError( + "Malformed OID: %s (insufficient number of nodes)" % ( + self._dotted_string)) + + if intnodes[0] > 2: + raise ValueError( + "Malformed OID: %s (first node outside valid range)" % ( + self._dotted_string)) + + if intnodes[0] < 2 and intnodes[1] >= 40: + raise ValueError( + "Malformed OID: %s (second node outside valid range)" % ( + self._dotted_string)) + + def __eq__(self, other): + if not isinstance(other, ObjectIdentifier): + return NotImplemented + + return self.dotted_string == other.dotted_string + + def __ne__(self, other): + return not self == other + + def __repr__(self): + return "".format( + self.dotted_string, + self._name + ) + + def __hash__(self): + return hash(self.dotted_string) + + @property + def _name(self): + # Lazy import to avoid an import cycle + from cryptography.x509.oid import _OID_NAMES + return _OID_NAMES.get(self, "Unknown OID") + + dotted_string = utils.read_only_property("_dotted_string") diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/asymmetric/dh.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/asymmetric/dh.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/asymmetric/dh.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/asymmetric/dh.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,212 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +import abc + +import six + +from cryptography import utils + + +def generate_parameters(generator, key_size, backend): + return backend.generate_dh_parameters(generator, key_size) + + +class DHPrivateNumbers(object): + def __init__(self, x, public_numbers): + if not isinstance(x, six.integer_types): + raise TypeError("x must be an integer.") + + if not isinstance(public_numbers, DHPublicNumbers): + raise TypeError("public_numbers must be an instance of " + "DHPublicNumbers.") + + self._x = x + self._public_numbers = public_numbers + + def __eq__(self, other): + if not isinstance(other, DHPrivateNumbers): + return NotImplemented + + return ( + self._x == other._x and + self._public_numbers == other._public_numbers + ) + + def __ne__(self, other): + return not self == other + + def private_key(self, backend): + return backend.load_dh_private_numbers(self) + + public_numbers = utils.read_only_property("_public_numbers") + x = utils.read_only_property("_x") + + +class DHPublicNumbers(object): + def __init__(self, y, parameter_numbers): + if not isinstance(y, six.integer_types): + raise TypeError("y must be an integer.") + + if not isinstance(parameter_numbers, DHParameterNumbers): + raise TypeError( + "parameters must be an instance of DHParameterNumbers.") + + self._y = y + self._parameter_numbers = parameter_numbers + + def __eq__(self, other): + if not isinstance(other, DHPublicNumbers): + return NotImplemented + + return ( + self._y == other._y and + self._parameter_numbers == other._parameter_numbers + ) + + def __ne__(self, other): + return not self == other + + def public_key(self, backend): + return backend.load_dh_public_numbers(self) + + y = utils.read_only_property("_y") + parameter_numbers = utils.read_only_property("_parameter_numbers") + + +class DHParameterNumbers(object): + def __init__(self, p, g, q=None): + if ( + not isinstance(p, six.integer_types) or + not isinstance(g, six.integer_types) + ): + raise TypeError("p and g must be integers") + if q is not None and not isinstance(q, six.integer_types): + raise TypeError("q must be integer or None") + + if g < 2: + raise ValueError("DH generator must be 2 or greater") + + self._p = p + self._g = g + self._q = q + + def __eq__(self, other): + if not isinstance(other, DHParameterNumbers): + return NotImplemented + + return ( + self._p == other._p and + self._g == other._g and + self._q == other._q + ) + + def __ne__(self, other): + return not self == other + + def parameters(self, backend): + return backend.load_dh_parameter_numbers(self) + + p = utils.read_only_property("_p") + g = utils.read_only_property("_g") + q = utils.read_only_property("_q") + + +@six.add_metaclass(abc.ABCMeta) +class DHParameters(object): + @abc.abstractmethod + def generate_private_key(self): + """ + Generates and returns a DHPrivateKey. + """ + + @abc.abstractmethod + def parameter_bytes(self, encoding, format): + """ + Returns the parameters serialized as bytes. + """ + + @abc.abstractmethod + def parameter_numbers(self): + """ + Returns a DHParameterNumbers. + """ + + +DHParametersWithSerialization = DHParameters + + +@six.add_metaclass(abc.ABCMeta) +class DHPrivateKey(object): + @abc.abstractproperty + def key_size(self): + """ + The bit length of the prime modulus. + """ + + @abc.abstractmethod + def public_key(self): + """ + The DHPublicKey associated with this private key. + """ + + @abc.abstractmethod + def parameters(self): + """ + The DHParameters object associated with this private key. + """ + + @abc.abstractmethod + def exchange(self, peer_public_key): + """ + Given peer's DHPublicKey, carry out the key exchange and + return shared key as bytes. + """ + + +@six.add_metaclass(abc.ABCMeta) +class DHPrivateKeyWithSerialization(DHPrivateKey): + @abc.abstractmethod + def private_numbers(self): + """ + Returns a DHPrivateNumbers. + """ + + @abc.abstractmethod + def private_bytes(self, encoding, format, encryption_algorithm): + """ + Returns the key serialized as bytes. + """ + + +@six.add_metaclass(abc.ABCMeta) +class DHPublicKey(object): + @abc.abstractproperty + def key_size(self): + """ + The bit length of the prime modulus. + """ + + @abc.abstractmethod + def parameters(self): + """ + The DHParameters object associated with this public key. + """ + + @abc.abstractmethod + def public_numbers(self): + """ + Returns a DHPublicNumbers. + """ + + @abc.abstractmethod + def public_bytes(self, encoding, format): + """ + Returns the key serialized as bytes. + """ + + +DHPublicKeyWithSerialization = DHPublicKey diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/asymmetric/dsa.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/asymmetric/dsa.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/asymmetric/dsa.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/asymmetric/dsa.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,254 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +import abc + +import six + +from cryptography import utils + + +@six.add_metaclass(abc.ABCMeta) +class DSAParameters(object): + @abc.abstractmethod + def generate_private_key(self): + """ + Generates and returns a DSAPrivateKey. + """ + + +@six.add_metaclass(abc.ABCMeta) +class DSAParametersWithNumbers(DSAParameters): + @abc.abstractmethod + def parameter_numbers(self): + """ + Returns a DSAParameterNumbers. + """ + + +@six.add_metaclass(abc.ABCMeta) +class DSAPrivateKey(object): + @abc.abstractproperty + def key_size(self): + """ + The bit length of the prime modulus. + """ + + @abc.abstractmethod + def public_key(self): + """ + The DSAPublicKey associated with this private key. + """ + + @abc.abstractmethod + def parameters(self): + """ + The DSAParameters object associated with this private key. + """ + + @abc.abstractmethod + def signer(self, signature_algorithm): + """ + Returns an AsymmetricSignatureContext used for signing data. + """ + + @abc.abstractmethod + def sign(self, data, algorithm): + """ + Signs the data + """ + + +@six.add_metaclass(abc.ABCMeta) +class DSAPrivateKeyWithSerialization(DSAPrivateKey): + @abc.abstractmethod + def private_numbers(self): + """ + Returns a DSAPrivateNumbers. + """ + + @abc.abstractmethod + def private_bytes(self, encoding, format, encryption_algorithm): + """ + Returns the key serialized as bytes. + """ + + +@six.add_metaclass(abc.ABCMeta) +class DSAPublicKey(object): + @abc.abstractproperty + def key_size(self): + """ + The bit length of the prime modulus. + """ + + @abc.abstractmethod + def parameters(self): + """ + The DSAParameters object associated with this public key. + """ + + @abc.abstractmethod + def verifier(self, signature, signature_algorithm): + """ + Returns an AsymmetricVerificationContext used for signing data. + """ + + @abc.abstractmethod + def public_numbers(self): + """ + Returns a DSAPublicNumbers. + """ + + @abc.abstractmethod + def public_bytes(self, encoding, format): + """ + Returns the key serialized as bytes. + """ + + @abc.abstractmethod + def verify(self, signature, data, algorithm): + """ + Verifies the signature of the data. + """ + + +DSAPublicKeyWithSerialization = DSAPublicKey + + +def generate_parameters(key_size, backend): + return backend.generate_dsa_parameters(key_size) + + +def generate_private_key(key_size, backend): + return backend.generate_dsa_private_key_and_parameters(key_size) + + +def _check_dsa_parameters(parameters): + if parameters.p.bit_length() not in [1024, 2048, 3072]: + raise ValueError("p must be exactly 1024, 2048, or 3072 bits long") + if parameters.q.bit_length() not in [160, 224, 256]: + raise ValueError("q must be exactly 160, 224, or 256 bits long") + + if not (1 < parameters.g < parameters.p): + raise ValueError("g, p don't satisfy 1 < g < p.") + + +def _check_dsa_private_numbers(numbers): + parameters = numbers.public_numbers.parameter_numbers + _check_dsa_parameters(parameters) + if numbers.x <= 0 or numbers.x >= parameters.q: + raise ValueError("x must be > 0 and < q.") + + if numbers.public_numbers.y != pow(parameters.g, numbers.x, parameters.p): + raise ValueError("y must be equal to (g ** x % p).") + + +class DSAParameterNumbers(object): + def __init__(self, p, q, g): + if ( + not isinstance(p, six.integer_types) or + not isinstance(q, six.integer_types) or + not isinstance(g, six.integer_types) + ): + raise TypeError( + "DSAParameterNumbers p, q, and g arguments must be integers." + ) + + self._p = p + self._q = q + self._g = g + + p = utils.read_only_property("_p") + q = utils.read_only_property("_q") + g = utils.read_only_property("_g") + + def parameters(self, backend): + return backend.load_dsa_parameter_numbers(self) + + def __eq__(self, other): + if not isinstance(other, DSAParameterNumbers): + return NotImplemented + + return self.p == other.p and self.q == other.q and self.g == other.g + + def __ne__(self, other): + return not self == other + + def __repr__(self): + return ( + "".format( + self=self + ) + ) + + +class DSAPublicNumbers(object): + def __init__(self, y, parameter_numbers): + if not isinstance(y, six.integer_types): + raise TypeError("DSAPublicNumbers y argument must be an integer.") + + if not isinstance(parameter_numbers, DSAParameterNumbers): + raise TypeError( + "parameter_numbers must be a DSAParameterNumbers instance." + ) + + self._y = y + self._parameter_numbers = parameter_numbers + + y = utils.read_only_property("_y") + parameter_numbers = utils.read_only_property("_parameter_numbers") + + def public_key(self, backend): + return backend.load_dsa_public_numbers(self) + + def __eq__(self, other): + if not isinstance(other, DSAPublicNumbers): + return NotImplemented + + return ( + self.y == other.y and + self.parameter_numbers == other.parameter_numbers + ) + + def __ne__(self, other): + return not self == other + + def __repr__(self): + return ( + "".format(self=self) + ) + + +class DSAPrivateNumbers(object): + def __init__(self, x, public_numbers): + if not isinstance(x, six.integer_types): + raise TypeError("DSAPrivateNumbers x argument must be an integer.") + + if not isinstance(public_numbers, DSAPublicNumbers): + raise TypeError( + "public_numbers must be a DSAPublicNumbers instance." + ) + self._public_numbers = public_numbers + self._x = x + + x = utils.read_only_property("_x") + public_numbers = utils.read_only_property("_public_numbers") + + def private_key(self, backend): + return backend.load_dsa_private_numbers(self) + + def __eq__(self, other): + if not isinstance(other, DSAPrivateNumbers): + return NotImplemented + + return ( + self.x == other.x and self.public_numbers == other.public_numbers + ) + + def __ne__(self, other): + return not self == other diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/asymmetric/ec.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/asymmetric/ec.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/asymmetric/ec.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/asymmetric/ec.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,500 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +import abc +import warnings + +import six + +from cryptography import utils +from cryptography.hazmat._oid import ObjectIdentifier + + +class EllipticCurveOID(object): + SECP192R1 = ObjectIdentifier("1.2.840.10045.3.1.1") + SECP224R1 = ObjectIdentifier("1.3.132.0.33") + SECP256K1 = ObjectIdentifier("1.3.132.0.10") + SECP256R1 = ObjectIdentifier("1.2.840.10045.3.1.7") + SECP384R1 = ObjectIdentifier("1.3.132.0.34") + SECP521R1 = ObjectIdentifier("1.3.132.0.35") + BRAINPOOLP256R1 = ObjectIdentifier("1.3.36.3.3.2.8.1.1.7") + BRAINPOOLP384R1 = ObjectIdentifier("1.3.36.3.3.2.8.1.1.11") + BRAINPOOLP512R1 = ObjectIdentifier("1.3.36.3.3.2.8.1.1.13") + SECT163K1 = ObjectIdentifier("1.3.132.0.1") + SECT163R2 = ObjectIdentifier("1.3.132.0.15") + SECT233K1 = ObjectIdentifier("1.3.132.0.26") + SECT233R1 = ObjectIdentifier("1.3.132.0.27") + SECT283K1 = ObjectIdentifier("1.3.132.0.16") + SECT283R1 = ObjectIdentifier("1.3.132.0.17") + SECT409K1 = ObjectIdentifier("1.3.132.0.36") + SECT409R1 = ObjectIdentifier("1.3.132.0.37") + SECT571K1 = ObjectIdentifier("1.3.132.0.38") + SECT571R1 = ObjectIdentifier("1.3.132.0.39") + + +@six.add_metaclass(abc.ABCMeta) +class EllipticCurve(object): + @abc.abstractproperty + def name(self): + """ + The name of the curve. e.g. secp256r1. + """ + + @abc.abstractproperty + def key_size(self): + """ + Bit size of a secret scalar for the curve. + """ + + +@six.add_metaclass(abc.ABCMeta) +class EllipticCurveSignatureAlgorithm(object): + @abc.abstractproperty + def algorithm(self): + """ + The digest algorithm used with this signature. + """ + + +@six.add_metaclass(abc.ABCMeta) +class EllipticCurvePrivateKey(object): + @abc.abstractmethod + def signer(self, signature_algorithm): + """ + Returns an AsymmetricSignatureContext used for signing data. + """ + + @abc.abstractmethod + def exchange(self, algorithm, peer_public_key): + """ + Performs a key exchange operation using the provided algorithm with the + provided peer's public key. + """ + + @abc.abstractmethod + def public_key(self): + """ + The EllipticCurvePublicKey for this private key. + """ + + @abc.abstractproperty + def curve(self): + """ + The EllipticCurve that this key is on. + """ + + @abc.abstractproperty + def key_size(self): + """ + Bit size of a secret scalar for the curve. + """ + + @abc.abstractmethod + def sign(self, data, signature_algorithm): + """ + Signs the data + """ + + +@six.add_metaclass(abc.ABCMeta) +class EllipticCurvePrivateKeyWithSerialization(EllipticCurvePrivateKey): + @abc.abstractmethod + def private_numbers(self): + """ + Returns an EllipticCurvePrivateNumbers. + """ + + @abc.abstractmethod + def private_bytes(self, encoding, format, encryption_algorithm): + """ + Returns the key serialized as bytes. + """ + + +@six.add_metaclass(abc.ABCMeta) +class EllipticCurvePublicKey(object): + @abc.abstractmethod + def verifier(self, signature, signature_algorithm): + """ + Returns an AsymmetricVerificationContext used for signing data. + """ + + @abc.abstractproperty + def curve(self): + """ + The EllipticCurve that this key is on. + """ + + @abc.abstractproperty + def key_size(self): + """ + Bit size of a secret scalar for the curve. + """ + + @abc.abstractmethod + def public_numbers(self): + """ + Returns an EllipticCurvePublicNumbers. + """ + + @abc.abstractmethod + def public_bytes(self, encoding, format): + """ + Returns the key serialized as bytes. + """ + + @abc.abstractmethod + def verify(self, signature, data, signature_algorithm): + """ + Verifies the signature of the data. + """ + + @classmethod + def from_encoded_point(cls, curve, data): + utils._check_bytes("data", data) + + if not isinstance(curve, EllipticCurve): + raise TypeError("curve must be an EllipticCurve instance") + + if len(data) == 0: + raise ValueError("data must not be an empty byte string") + + if six.indexbytes(data, 0) not in [0x02, 0x03, 0x04]: + raise ValueError("Unsupported elliptic curve point type") + + from cryptography.hazmat.backends.openssl.backend import backend + return backend.load_elliptic_curve_public_bytes(curve, data) + + +EllipticCurvePublicKeyWithSerialization = EllipticCurvePublicKey + + +@utils.register_interface(EllipticCurve) +class SECT571R1(object): + name = "sect571r1" + key_size = 570 + + +@utils.register_interface(EllipticCurve) +class SECT409R1(object): + name = "sect409r1" + key_size = 409 + + +@utils.register_interface(EllipticCurve) +class SECT283R1(object): + name = "sect283r1" + key_size = 283 + + +@utils.register_interface(EllipticCurve) +class SECT233R1(object): + name = "sect233r1" + key_size = 233 + + +@utils.register_interface(EllipticCurve) +class SECT163R2(object): + name = "sect163r2" + key_size = 163 + + +@utils.register_interface(EllipticCurve) +class SECT571K1(object): + name = "sect571k1" + key_size = 571 + + +@utils.register_interface(EllipticCurve) +class SECT409K1(object): + name = "sect409k1" + key_size = 409 + + +@utils.register_interface(EllipticCurve) +class SECT283K1(object): + name = "sect283k1" + key_size = 283 + + +@utils.register_interface(EllipticCurve) +class SECT233K1(object): + name = "sect233k1" + key_size = 233 + + +@utils.register_interface(EllipticCurve) +class SECT163K1(object): + name = "sect163k1" + key_size = 163 + + +@utils.register_interface(EllipticCurve) +class SECP521R1(object): + name = "secp521r1" + key_size = 521 + + +@utils.register_interface(EllipticCurve) +class SECP384R1(object): + name = "secp384r1" + key_size = 384 + + +@utils.register_interface(EllipticCurve) +class SECP256R1(object): + name = "secp256r1" + key_size = 256 + + +@utils.register_interface(EllipticCurve) +class SECP256K1(object): + name = "secp256k1" + key_size = 256 + + +@utils.register_interface(EllipticCurve) +class SECP224R1(object): + name = "secp224r1" + key_size = 224 + + +@utils.register_interface(EllipticCurve) +class SECP192R1(object): + name = "secp192r1" + key_size = 192 + + +@utils.register_interface(EllipticCurve) +class BrainpoolP256R1(object): + name = "brainpoolP256r1" + key_size = 256 + + +@utils.register_interface(EllipticCurve) +class BrainpoolP384R1(object): + name = "brainpoolP384r1" + key_size = 384 + + +@utils.register_interface(EllipticCurve) +class BrainpoolP512R1(object): + name = "brainpoolP512r1" + key_size = 512 + + +_CURVE_TYPES = { + "prime192v1": SECP192R1, + "prime256v1": SECP256R1, + + "secp192r1": SECP192R1, + "secp224r1": SECP224R1, + "secp256r1": SECP256R1, + "secp384r1": SECP384R1, + "secp521r1": SECP521R1, + "secp256k1": SECP256K1, + + "sect163k1": SECT163K1, + "sect233k1": SECT233K1, + "sect283k1": SECT283K1, + "sect409k1": SECT409K1, + "sect571k1": SECT571K1, + + "sect163r2": SECT163R2, + "sect233r1": SECT233R1, + "sect283r1": SECT283R1, + "sect409r1": SECT409R1, + "sect571r1": SECT571R1, + + "brainpoolP256r1": BrainpoolP256R1, + "brainpoolP384r1": BrainpoolP384R1, + "brainpoolP512r1": BrainpoolP512R1, +} + + +@utils.register_interface(EllipticCurveSignatureAlgorithm) +class ECDSA(object): + def __init__(self, algorithm): + self._algorithm = algorithm + + algorithm = utils.read_only_property("_algorithm") + + +def generate_private_key(curve, backend): + return backend.generate_elliptic_curve_private_key(curve) + + +def derive_private_key(private_value, curve, backend): + if not isinstance(private_value, six.integer_types): + raise TypeError("private_value must be an integer type.") + + if private_value <= 0: + raise ValueError("private_value must be a positive integer.") + + if not isinstance(curve, EllipticCurve): + raise TypeError("curve must provide the EllipticCurve interface.") + + return backend.derive_elliptic_curve_private_key(private_value, curve) + + +class EllipticCurvePublicNumbers(object): + def __init__(self, x, y, curve): + if ( + not isinstance(x, six.integer_types) or + not isinstance(y, six.integer_types) + ): + raise TypeError("x and y must be integers.") + + if not isinstance(curve, EllipticCurve): + raise TypeError("curve must provide the EllipticCurve interface.") + + self._y = y + self._x = x + self._curve = curve + + def public_key(self, backend): + return backend.load_elliptic_curve_public_numbers(self) + + def encode_point(self): + warnings.warn( + "encode_point has been deprecated on EllipticCurvePublicNumbers" + " and will be removed in a future version. Please use " + "EllipticCurvePublicKey.public_bytes to obtain both " + "compressed and uncompressed point encoding.", + utils.DeprecatedIn25, + stacklevel=2, + ) + # key_size is in bits. Convert to bytes and round up + byte_length = (self.curve.key_size + 7) // 8 + return ( + b'\x04' + utils.int_to_bytes(self.x, byte_length) + + utils.int_to_bytes(self.y, byte_length) + ) + + @classmethod + def from_encoded_point(cls, curve, data): + if not isinstance(curve, EllipticCurve): + raise TypeError("curve must be an EllipticCurve instance") + + warnings.warn( + "Support for unsafe construction of public numbers from " + "encoded data will be removed in a future version. " + "Please use EllipticCurvePublicKey.from_encoded_point", + utils.DeprecatedIn25, + stacklevel=2, + ) + + if data.startswith(b'\x04'): + # key_size is in bits. Convert to bytes and round up + byte_length = (curve.key_size + 7) // 8 + if len(data) == 2 * byte_length + 1: + x = utils.int_from_bytes(data[1:byte_length + 1], 'big') + y = utils.int_from_bytes(data[byte_length + 1:], 'big') + return cls(x, y, curve) + else: + raise ValueError('Invalid elliptic curve point data length') + else: + raise ValueError('Unsupported elliptic curve point type') + + curve = utils.read_only_property("_curve") + x = utils.read_only_property("_x") + y = utils.read_only_property("_y") + + def __eq__(self, other): + if not isinstance(other, EllipticCurvePublicNumbers): + return NotImplemented + + return ( + self.x == other.x and + self.y == other.y and + self.curve.name == other.curve.name and + self.curve.key_size == other.curve.key_size + ) + + def __ne__(self, other): + return not self == other + + def __hash__(self): + return hash((self.x, self.y, self.curve.name, self.curve.key_size)) + + def __repr__(self): + return ( + "".format(self) + ) + + +class EllipticCurvePrivateNumbers(object): + def __init__(self, private_value, public_numbers): + if not isinstance(private_value, six.integer_types): + raise TypeError("private_value must be an integer.") + + if not isinstance(public_numbers, EllipticCurvePublicNumbers): + raise TypeError( + "public_numbers must be an EllipticCurvePublicNumbers " + "instance." + ) + + self._private_value = private_value + self._public_numbers = public_numbers + + def private_key(self, backend): + return backend.load_elliptic_curve_private_numbers(self) + + private_value = utils.read_only_property("_private_value") + public_numbers = utils.read_only_property("_public_numbers") + + def __eq__(self, other): + if not isinstance(other, EllipticCurvePrivateNumbers): + return NotImplemented + + return ( + self.private_value == other.private_value and + self.public_numbers == other.public_numbers + ) + + def __ne__(self, other): + return not self == other + + def __hash__(self): + return hash((self.private_value, self.public_numbers)) + + +class ECDH(object): + pass + + +_OID_TO_CURVE = { + EllipticCurveOID.SECP192R1: SECP192R1, + EllipticCurveOID.SECP224R1: SECP224R1, + EllipticCurveOID.SECP256K1: SECP256K1, + EllipticCurveOID.SECP256R1: SECP256R1, + EllipticCurveOID.SECP384R1: SECP384R1, + EllipticCurveOID.SECP521R1: SECP521R1, + EllipticCurveOID.BRAINPOOLP256R1: BrainpoolP256R1, + EllipticCurveOID.BRAINPOOLP384R1: BrainpoolP384R1, + EllipticCurveOID.BRAINPOOLP512R1: BrainpoolP512R1, + EllipticCurveOID.SECT163K1: SECT163K1, + EllipticCurveOID.SECT163R2: SECT163R2, + EllipticCurveOID.SECT233K1: SECT233K1, + EllipticCurveOID.SECT233R1: SECT233R1, + EllipticCurveOID.SECT283K1: SECT283K1, + EllipticCurveOID.SECT283R1: SECT283R1, + EllipticCurveOID.SECT409K1: SECT409K1, + EllipticCurveOID.SECT409R1: SECT409R1, + EllipticCurveOID.SECT571K1: SECT571K1, + EllipticCurveOID.SECT571R1: SECT571R1, +} + + +def get_curve_for_oid(oid): + try: + return _OID_TO_CURVE[oid] + except KeyError: + raise LookupError( + "The provided object identifier has no matching elliptic " + "curve class" + ) diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/asymmetric/ed25519.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/asymmetric/ed25519.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/asymmetric/ed25519.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/asymmetric/ed25519.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,84 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +import abc + +import six + +from cryptography.exceptions import UnsupportedAlgorithm, _Reasons + + +_ED25519_KEY_SIZE = 32 +_ED25519_SIG_SIZE = 64 + + +@six.add_metaclass(abc.ABCMeta) +class Ed25519PublicKey(object): + @classmethod + def from_public_bytes(cls, data): + from cryptography.hazmat.backends.openssl.backend import backend + if not backend.ed25519_supported(): + raise UnsupportedAlgorithm( + "ed25519 is not supported by this version of OpenSSL.", + _Reasons.UNSUPPORTED_PUBLIC_KEY_ALGORITHM + ) + + return backend.ed25519_load_public_bytes(data) + + @abc.abstractmethod + def public_bytes(self, encoding, format): + """ + The serialized bytes of the public key. + """ + + @abc.abstractmethod + def verify(self, signature, data): + """ + Verify the signature. + """ + + +@six.add_metaclass(abc.ABCMeta) +class Ed25519PrivateKey(object): + @classmethod + def generate(cls): + from cryptography.hazmat.backends.openssl.backend import backend + if not backend.ed25519_supported(): + raise UnsupportedAlgorithm( + "ed25519 is not supported by this version of OpenSSL.", + _Reasons.UNSUPPORTED_PUBLIC_KEY_ALGORITHM + ) + + return backend.ed25519_generate_key() + + @classmethod + def from_private_bytes(cls, data): + from cryptography.hazmat.backends.openssl.backend import backend + if not backend.ed25519_supported(): + raise UnsupportedAlgorithm( + "ed25519 is not supported by this version of OpenSSL.", + _Reasons.UNSUPPORTED_PUBLIC_KEY_ALGORITHM + ) + + return backend.ed25519_load_private_bytes(data) + + @abc.abstractmethod + def public_key(self): + """ + The Ed25519PublicKey derived from the private key. + """ + + @abc.abstractmethod + def private_bytes(self, encoding, format, encryption_algorithm): + """ + The serialized bytes of the private key. + """ + + @abc.abstractmethod + def sign(self, data): + """ + Signs the data. + """ diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/asymmetric/ed448.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/asymmetric/ed448.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/asymmetric/ed448.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/asymmetric/ed448.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,79 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +import abc + +import six + +from cryptography.exceptions import UnsupportedAlgorithm, _Reasons + + +@six.add_metaclass(abc.ABCMeta) +class Ed448PublicKey(object): + @classmethod + def from_public_bytes(cls, data): + from cryptography.hazmat.backends.openssl.backend import backend + if not backend.ed448_supported(): + raise UnsupportedAlgorithm( + "ed448 is not supported by this version of OpenSSL.", + _Reasons.UNSUPPORTED_PUBLIC_KEY_ALGORITHM + ) + + return backend.ed448_load_public_bytes(data) + + @abc.abstractmethod + def public_bytes(self, encoding, format): + """ + The serialized bytes of the public key. + """ + + @abc.abstractmethod + def verify(self, signature, data): + """ + Verify the signature. + """ + + +@six.add_metaclass(abc.ABCMeta) +class Ed448PrivateKey(object): + @classmethod + def generate(cls): + from cryptography.hazmat.backends.openssl.backend import backend + if not backend.ed448_supported(): + raise UnsupportedAlgorithm( + "ed448 is not supported by this version of OpenSSL.", + _Reasons.UNSUPPORTED_PUBLIC_KEY_ALGORITHM + ) + return backend.ed448_generate_key() + + @classmethod + def from_private_bytes(cls, data): + from cryptography.hazmat.backends.openssl.backend import backend + if not backend.ed448_supported(): + raise UnsupportedAlgorithm( + "ed448 is not supported by this version of OpenSSL.", + _Reasons.UNSUPPORTED_PUBLIC_KEY_ALGORITHM + ) + + return backend.ed448_load_private_bytes(data) + + @abc.abstractmethod + def public_key(self): + """ + The Ed448PublicKey derived from the private key. + """ + + @abc.abstractmethod + def sign(self, data): + """ + Signs the data. + """ + + @abc.abstractmethod + def private_bytes(self, encoding, format, encryption_algorithm): + """ + The serialized bytes of the private key. + """ diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/asymmetric/__init__.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/asymmetric/__init__.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/asymmetric/__init__.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/asymmetric/__init__.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,40 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +import abc + +import six + + +@six.add_metaclass(abc.ABCMeta) +class AsymmetricSignatureContext(object): + @abc.abstractmethod + def update(self, data): + """ + Processes the provided bytes and returns nothing. + """ + + @abc.abstractmethod + def finalize(self): + """ + Returns the signature as bytes. + """ + + +@six.add_metaclass(abc.ABCMeta) +class AsymmetricVerificationContext(object): + @abc.abstractmethod + def update(self, data): + """ + Processes the provided bytes and returns nothing. + """ + + @abc.abstractmethod + def verify(self): + """ + Raises an exception if the bytes provided to update do not match the + signature or the signature does not match the public key. + """ diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/asymmetric/padding.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/asymmetric/padding.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/asymmetric/padding.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/asymmetric/padding.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,79 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +import abc +import math + +import six + +from cryptography import utils +from cryptography.hazmat.primitives import hashes +from cryptography.hazmat.primitives.asymmetric import rsa + + +@six.add_metaclass(abc.ABCMeta) +class AsymmetricPadding(object): + @abc.abstractproperty + def name(self): + """ + A string naming this padding (e.g. "PSS", "PKCS1"). + """ + + +@utils.register_interface(AsymmetricPadding) +class PKCS1v15(object): + name = "EMSA-PKCS1-v1_5" + + +@utils.register_interface(AsymmetricPadding) +class PSS(object): + MAX_LENGTH = object() + name = "EMSA-PSS" + + def __init__(self, mgf, salt_length): + self._mgf = mgf + + if (not isinstance(salt_length, six.integer_types) and + salt_length is not self.MAX_LENGTH): + raise TypeError("salt_length must be an integer.") + + if salt_length is not self.MAX_LENGTH and salt_length < 0: + raise ValueError("salt_length must be zero or greater.") + + self._salt_length = salt_length + + +@utils.register_interface(AsymmetricPadding) +class OAEP(object): + name = "EME-OAEP" + + def __init__(self, mgf, algorithm, label): + if not isinstance(algorithm, hashes.HashAlgorithm): + raise TypeError("Expected instance of hashes.HashAlgorithm.") + + self._mgf = mgf + self._algorithm = algorithm + self._label = label + + +class MGF1(object): + MAX_LENGTH = object() + + def __init__(self, algorithm): + if not isinstance(algorithm, hashes.HashAlgorithm): + raise TypeError("Expected instance of hashes.HashAlgorithm.") + + self._algorithm = algorithm + + +def calculate_max_pss_salt_length(key, hash_algorithm): + if not isinstance(key, (rsa.RSAPrivateKey, rsa.RSAPublicKey)): + raise TypeError("key must be an RSA public or private key") + # bit length - 1 per RFC 3447 + emlen = int(math.ceil((key.key_size - 1) / 8.0)) + salt_length = emlen - hash_algorithm.digest_size - 2 + assert salt_length >= 0 + return salt_length diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/asymmetric/rsa.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/asymmetric/rsa.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/asymmetric/rsa.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/asymmetric/rsa.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,368 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +import abc +try: + # Only available in math in 3.5+ + from math import gcd +except ImportError: + from fractions import gcd + +import six + +from cryptography import utils +from cryptography.exceptions import UnsupportedAlgorithm, _Reasons +from cryptography.hazmat.backends.interfaces import RSABackend + + +@six.add_metaclass(abc.ABCMeta) +class RSAPrivateKey(object): + @abc.abstractmethod + def signer(self, padding, algorithm): + """ + Returns an AsymmetricSignatureContext used for signing data. + """ + + @abc.abstractmethod + def decrypt(self, ciphertext, padding): + """ + Decrypts the provided ciphertext. + """ + + @abc.abstractproperty + def key_size(self): + """ + The bit length of the public modulus. + """ + + @abc.abstractmethod + def public_key(self): + """ + The RSAPublicKey associated with this private key. + """ + + @abc.abstractmethod + def sign(self, data, padding, algorithm): + """ + Signs the data. + """ + + +@six.add_metaclass(abc.ABCMeta) +class RSAPrivateKeyWithSerialization(RSAPrivateKey): + @abc.abstractmethod + def private_numbers(self): + """ + Returns an RSAPrivateNumbers. + """ + + @abc.abstractmethod + def private_bytes(self, encoding, format, encryption_algorithm): + """ + Returns the key serialized as bytes. + """ + + +@six.add_metaclass(abc.ABCMeta) +class RSAPublicKey(object): + @abc.abstractmethod + def verifier(self, signature, padding, algorithm): + """ + Returns an AsymmetricVerificationContext used for verifying signatures. + """ + + @abc.abstractmethod + def encrypt(self, plaintext, padding): + """ + Encrypts the given plaintext. + """ + + @abc.abstractproperty + def key_size(self): + """ + The bit length of the public modulus. + """ + + @abc.abstractmethod + def public_numbers(self): + """ + Returns an RSAPublicNumbers + """ + + @abc.abstractmethod + def public_bytes(self, encoding, format): + """ + Returns the key serialized as bytes. + """ + + @abc.abstractmethod + def verify(self, signature, data, padding, algorithm): + """ + Verifies the signature of the data. + """ + + +RSAPublicKeyWithSerialization = RSAPublicKey + + +def generate_private_key(public_exponent, key_size, backend): + if not isinstance(backend, RSABackend): + raise UnsupportedAlgorithm( + "Backend object does not implement RSABackend.", + _Reasons.BACKEND_MISSING_INTERFACE + ) + + _verify_rsa_parameters(public_exponent, key_size) + return backend.generate_rsa_private_key(public_exponent, key_size) + + +def _verify_rsa_parameters(public_exponent, key_size): + if public_exponent < 3: + raise ValueError("public_exponent must be >= 3.") + + if public_exponent & 1 == 0: + raise ValueError("public_exponent must be odd.") + + if key_size < 512: + raise ValueError("key_size must be at least 512-bits.") + + +def _check_private_key_components(p, q, private_exponent, dmp1, dmq1, iqmp, + public_exponent, modulus): + if modulus < 3: + raise ValueError("modulus must be >= 3.") + + if p >= modulus: + raise ValueError("p must be < modulus.") + + if q >= modulus: + raise ValueError("q must be < modulus.") + + if dmp1 >= modulus: + raise ValueError("dmp1 must be < modulus.") + + if dmq1 >= modulus: + raise ValueError("dmq1 must be < modulus.") + + if iqmp >= modulus: + raise ValueError("iqmp must be < modulus.") + + if private_exponent >= modulus: + raise ValueError("private_exponent must be < modulus.") + + if public_exponent < 3 or public_exponent >= modulus: + raise ValueError("public_exponent must be >= 3 and < modulus.") + + if public_exponent & 1 == 0: + raise ValueError("public_exponent must be odd.") + + if dmp1 & 1 == 0: + raise ValueError("dmp1 must be odd.") + + if dmq1 & 1 == 0: + raise ValueError("dmq1 must be odd.") + + if p * q != modulus: + raise ValueError("p*q must equal modulus.") + + +def _check_public_key_components(e, n): + if n < 3: + raise ValueError("n must be >= 3.") + + if e < 3 or e >= n: + raise ValueError("e must be >= 3 and < n.") + + if e & 1 == 0: + raise ValueError("e must be odd.") + + +def _modinv(e, m): + """ + Modular Multiplicative Inverse. Returns x such that: (x*e) mod m == 1 + """ + x1, y1, x2, y2 = 1, 0, 0, 1 + a, b = e, m + while b > 0: + q, r = divmod(a, b) + xn, yn = x1 - q * x2, y1 - q * y2 + a, b, x1, y1, x2, y2 = b, r, x2, y2, xn, yn + return x1 % m + + +def rsa_crt_iqmp(p, q): + """ + Compute the CRT (q ** -1) % p value from RSA primes p and q. + """ + return _modinv(q, p) + + +def rsa_crt_dmp1(private_exponent, p): + """ + Compute the CRT private_exponent % (p - 1) value from the RSA + private_exponent (d) and p. + """ + return private_exponent % (p - 1) + + +def rsa_crt_dmq1(private_exponent, q): + """ + Compute the CRT private_exponent % (q - 1) value from the RSA + private_exponent (d) and q. + """ + return private_exponent % (q - 1) + + +# Controls the number of iterations rsa_recover_prime_factors will perform +# to obtain the prime factors. Each iteration increments by 2 so the actual +# maximum attempts is half this number. +_MAX_RECOVERY_ATTEMPTS = 1000 + + +def rsa_recover_prime_factors(n, e, d): + """ + Compute factors p and q from the private exponent d. We assume that n has + no more than two factors. This function is adapted from code in PyCrypto. + """ + # See 8.2.2(i) in Handbook of Applied Cryptography. + ktot = d * e - 1 + # The quantity d*e-1 is a multiple of phi(n), even, + # and can be represented as t*2^s. + t = ktot + while t % 2 == 0: + t = t // 2 + # Cycle through all multiplicative inverses in Zn. + # The algorithm is non-deterministic, but there is a 50% chance + # any candidate a leads to successful factoring. + # See "Digitalized Signatures and Public Key Functions as Intractable + # as Factorization", M. Rabin, 1979 + spotted = False + a = 2 + while not spotted and a < _MAX_RECOVERY_ATTEMPTS: + k = t + # Cycle through all values a^{t*2^i}=a^k + while k < ktot: + cand = pow(a, k, n) + # Check if a^k is a non-trivial root of unity (mod n) + if cand != 1 and cand != (n - 1) and pow(cand, 2, n) == 1: + # We have found a number such that (cand-1)(cand+1)=0 (mod n). + # Either of the terms divides n. + p = gcd(cand + 1, n) + spotted = True + break + k *= 2 + # This value was not any good... let's try another! + a += 2 + if not spotted: + raise ValueError("Unable to compute factors p and q from exponent d.") + # Found ! + q, r = divmod(n, p) + assert r == 0 + p, q = sorted((p, q), reverse=True) + return (p, q) + + +class RSAPrivateNumbers(object): + def __init__(self, p, q, d, dmp1, dmq1, iqmp, + public_numbers): + if ( + not isinstance(p, six.integer_types) or + not isinstance(q, six.integer_types) or + not isinstance(d, six.integer_types) or + not isinstance(dmp1, six.integer_types) or + not isinstance(dmq1, six.integer_types) or + not isinstance(iqmp, six.integer_types) + ): + raise TypeError( + "RSAPrivateNumbers p, q, d, dmp1, dmq1, iqmp arguments must" + " all be an integers." + ) + + if not isinstance(public_numbers, RSAPublicNumbers): + raise TypeError( + "RSAPrivateNumbers public_numbers must be an RSAPublicNumbers" + " instance." + ) + + self._p = p + self._q = q + self._d = d + self._dmp1 = dmp1 + self._dmq1 = dmq1 + self._iqmp = iqmp + self._public_numbers = public_numbers + + p = utils.read_only_property("_p") + q = utils.read_only_property("_q") + d = utils.read_only_property("_d") + dmp1 = utils.read_only_property("_dmp1") + dmq1 = utils.read_only_property("_dmq1") + iqmp = utils.read_only_property("_iqmp") + public_numbers = utils.read_only_property("_public_numbers") + + def private_key(self, backend): + return backend.load_rsa_private_numbers(self) + + def __eq__(self, other): + if not isinstance(other, RSAPrivateNumbers): + return NotImplemented + + return ( + self.p == other.p and + self.q == other.q and + self.d == other.d and + self.dmp1 == other.dmp1 and + self.dmq1 == other.dmq1 and + self.iqmp == other.iqmp and + self.public_numbers == other.public_numbers + ) + + def __ne__(self, other): + return not self == other + + def __hash__(self): + return hash(( + self.p, + self.q, + self.d, + self.dmp1, + self.dmq1, + self.iqmp, + self.public_numbers, + )) + + +class RSAPublicNumbers(object): + def __init__(self, e, n): + if ( + not isinstance(e, six.integer_types) or + not isinstance(n, six.integer_types) + ): + raise TypeError("RSAPublicNumbers arguments must be integers.") + + self._e = e + self._n = n + + e = utils.read_only_property("_e") + n = utils.read_only_property("_n") + + def public_key(self, backend): + return backend.load_rsa_public_numbers(self) + + def __repr__(self): + return "".format(self) + + def __eq__(self, other): + if not isinstance(other, RSAPublicNumbers): + return NotImplemented + + return self.e == other.e and self.n == other.n + + def __ne__(self, other): + return not self == other + + def __hash__(self): + return hash((self.e, self.n)) diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/asymmetric/utils.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/asymmetric/utils.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/asymmetric/utils.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/asymmetric/utils.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,38 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +from asn1crypto.algos import DSASignature + +import six + +from cryptography import utils +from cryptography.hazmat.primitives import hashes + + +def decode_dss_signature(signature): + data = DSASignature.load(signature, strict=True).native + return data['r'], data['s'] + + +def encode_dss_signature(r, s): + if ( + not isinstance(r, six.integer_types) or + not isinstance(s, six.integer_types) + ): + raise ValueError("Both r and s must be integers") + + return DSASignature({'r': r, 's': s}).dump() + + +class Prehashed(object): + def __init__(self, algorithm): + if not isinstance(algorithm, hashes.HashAlgorithm): + raise TypeError("Expected instance of HashAlgorithm.") + + self._algorithm = algorithm + self._digest_size = algorithm.digest_size + + digest_size = utils.read_only_property("_digest_size") diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/asymmetric/x25519.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/asymmetric/x25519.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/asymmetric/x25519.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/asymmetric/x25519.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,73 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +import abc + +import six + +from cryptography.exceptions import UnsupportedAlgorithm, _Reasons + + +@six.add_metaclass(abc.ABCMeta) +class X25519PublicKey(object): + @classmethod + def from_public_bytes(cls, data): + from cryptography.hazmat.backends.openssl.backend import backend + if not backend.x25519_supported(): + raise UnsupportedAlgorithm( + "X25519 is not supported by this version of OpenSSL.", + _Reasons.UNSUPPORTED_EXCHANGE_ALGORITHM + ) + + return backend.x25519_load_public_bytes(data) + + @abc.abstractmethod + def public_bytes(self, encoding=None, format=None): + """ + The serialized bytes of the public key. + """ + + +@six.add_metaclass(abc.ABCMeta) +class X25519PrivateKey(object): + @classmethod + def generate(cls): + from cryptography.hazmat.backends.openssl.backend import backend + if not backend.x25519_supported(): + raise UnsupportedAlgorithm( + "X25519 is not supported by this version of OpenSSL.", + _Reasons.UNSUPPORTED_EXCHANGE_ALGORITHM + ) + return backend.x25519_generate_key() + + @classmethod + def from_private_bytes(cls, data): + from cryptography.hazmat.backends.openssl.backend import backend + if not backend.x25519_supported(): + raise UnsupportedAlgorithm( + "X25519 is not supported by this version of OpenSSL.", + _Reasons.UNSUPPORTED_EXCHANGE_ALGORITHM + ) + + return backend.x25519_load_private_bytes(data) + + @abc.abstractmethod + def public_key(self): + """ + The serialized bytes of the public key. + """ + + @abc.abstractmethod + def private_bytes(self, encoding, format, encryption_algorithm): + """ + The serialized bytes of the private key. + """ + + @abc.abstractmethod + def exchange(self, peer_public_key): + """ + Performs a key exchange operation using the provided peer's public key. + """ diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/asymmetric/x448.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/asymmetric/x448.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/asymmetric/x448.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/asymmetric/x448.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,73 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +import abc + +import six + +from cryptography.exceptions import UnsupportedAlgorithm, _Reasons + + +@six.add_metaclass(abc.ABCMeta) +class X448PublicKey(object): + @classmethod + def from_public_bytes(cls, data): + from cryptography.hazmat.backends.openssl.backend import backend + if not backend.x448_supported(): + raise UnsupportedAlgorithm( + "X448 is not supported by this version of OpenSSL.", + _Reasons.UNSUPPORTED_EXCHANGE_ALGORITHM + ) + + return backend.x448_load_public_bytes(data) + + @abc.abstractmethod + def public_bytes(self, encoding, format): + """ + The serialized bytes of the public key. + """ + + +@six.add_metaclass(abc.ABCMeta) +class X448PrivateKey(object): + @classmethod + def generate(cls): + from cryptography.hazmat.backends.openssl.backend import backend + if not backend.x448_supported(): + raise UnsupportedAlgorithm( + "X448 is not supported by this version of OpenSSL.", + _Reasons.UNSUPPORTED_EXCHANGE_ALGORITHM + ) + return backend.x448_generate_key() + + @classmethod + def from_private_bytes(cls, data): + from cryptography.hazmat.backends.openssl.backend import backend + if not backend.x448_supported(): + raise UnsupportedAlgorithm( + "X448 is not supported by this version of OpenSSL.", + _Reasons.UNSUPPORTED_EXCHANGE_ALGORITHM + ) + + return backend.x448_load_private_bytes(data) + + @abc.abstractmethod + def public_key(self): + """ + The serialized bytes of the public key. + """ + + @abc.abstractmethod + def private_bytes(self, encoding, format, encryption_algorithm): + """ + The serialized bytes of the private key. + """ + + @abc.abstractmethod + def exchange(self, peer_public_key): + """ + Performs a key exchange operation using the provided peer's public key. + """ diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/ciphers/aead.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/ciphers/aead.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/ciphers/aead.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/ciphers/aead.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,188 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +import os + +from cryptography import exceptions, utils +from cryptography.hazmat.backends.openssl import aead +from cryptography.hazmat.backends.openssl.backend import backend + + +class ChaCha20Poly1305(object): + _MAX_SIZE = 2 ** 32 + + def __init__(self, key): + if not backend.aead_cipher_supported(self): + raise exceptions.UnsupportedAlgorithm( + "ChaCha20Poly1305 is not supported by this version of OpenSSL", + exceptions._Reasons.UNSUPPORTED_CIPHER + ) + utils._check_byteslike("key", key) + + if len(key) != 32: + raise ValueError("ChaCha20Poly1305 key must be 32 bytes.") + + self._key = key + + @classmethod + def generate_key(cls): + return os.urandom(32) + + def encrypt(self, nonce, data, associated_data): + if associated_data is None: + associated_data = b"" + + if len(data) > self._MAX_SIZE or len(associated_data) > self._MAX_SIZE: + # This is OverflowError to match what cffi would raise + raise OverflowError( + "Data or associated data too long. Max 2**32 bytes" + ) + + self._check_params(nonce, data, associated_data) + return aead._encrypt( + backend, self, nonce, data, associated_data, 16 + ) + + def decrypt(self, nonce, data, associated_data): + if associated_data is None: + associated_data = b"" + + self._check_params(nonce, data, associated_data) + return aead._decrypt( + backend, self, nonce, data, associated_data, 16 + ) + + def _check_params(self, nonce, data, associated_data): + utils._check_byteslike("nonce", nonce) + utils._check_bytes("data", data) + utils._check_bytes("associated_data", associated_data) + if len(nonce) != 12: + raise ValueError("Nonce must be 12 bytes") + + +class AESCCM(object): + _MAX_SIZE = 2 ** 32 + + def __init__(self, key, tag_length=16): + utils._check_byteslike("key", key) + if len(key) not in (16, 24, 32): + raise ValueError("AESCCM key must be 128, 192, or 256 bits.") + + self._key = key + if not isinstance(tag_length, int): + raise TypeError("tag_length must be an integer") + + if tag_length not in (4, 6, 8, 10, 12, 14, 16): + raise ValueError("Invalid tag_length") + + self._tag_length = tag_length + + if not backend.aead_cipher_supported(self): + raise exceptions.UnsupportedAlgorithm( + "AESCCM is not supported by this version of OpenSSL", + exceptions._Reasons.UNSUPPORTED_CIPHER + ) + + @classmethod + def generate_key(cls, bit_length): + if not isinstance(bit_length, int): + raise TypeError("bit_length must be an integer") + + if bit_length not in (128, 192, 256): + raise ValueError("bit_length must be 128, 192, or 256") + + return os.urandom(bit_length // 8) + + def encrypt(self, nonce, data, associated_data): + if associated_data is None: + associated_data = b"" + + if len(data) > self._MAX_SIZE or len(associated_data) > self._MAX_SIZE: + # This is OverflowError to match what cffi would raise + raise OverflowError( + "Data or associated data too long. Max 2**32 bytes" + ) + + self._check_params(nonce, data, associated_data) + self._validate_lengths(nonce, len(data)) + return aead._encrypt( + backend, self, nonce, data, associated_data, self._tag_length + ) + + def decrypt(self, nonce, data, associated_data): + if associated_data is None: + associated_data = b"" + + self._check_params(nonce, data, associated_data) + return aead._decrypt( + backend, self, nonce, data, associated_data, self._tag_length + ) + + def _validate_lengths(self, nonce, data_len): + # For information about computing this, see + # https://tools.ietf.org/html/rfc3610#section-2.1 + l_val = 15 - len(nonce) + if 2 ** (8 * l_val) < data_len: + raise ValueError("Nonce too long for data") + + def _check_params(self, nonce, data, associated_data): + utils._check_byteslike("nonce", nonce) + utils._check_bytes("data", data) + utils._check_bytes("associated_data", associated_data) + if not 7 <= len(nonce) <= 13: + raise ValueError("Nonce must be between 7 and 13 bytes") + + +class AESGCM(object): + _MAX_SIZE = 2 ** 32 + + def __init__(self, key): + utils._check_byteslike("key", key) + if len(key) not in (16, 24, 32): + raise ValueError("AESGCM key must be 128, 192, or 256 bits.") + + self._key = key + + @classmethod + def generate_key(cls, bit_length): + if not isinstance(bit_length, int): + raise TypeError("bit_length must be an integer") + + if bit_length not in (128, 192, 256): + raise ValueError("bit_length must be 128, 192, or 256") + + return os.urandom(bit_length // 8) + + def encrypt(self, nonce, data, associated_data): + if associated_data is None: + associated_data = b"" + + if len(data) > self._MAX_SIZE or len(associated_data) > self._MAX_SIZE: + # This is OverflowError to match what cffi would raise + raise OverflowError( + "Data or associated data too long. Max 2**32 bytes" + ) + + self._check_params(nonce, data, associated_data) + return aead._encrypt( + backend, self, nonce, data, associated_data, 16 + ) + + def decrypt(self, nonce, data, associated_data): + if associated_data is None: + associated_data = b"" + + self._check_params(nonce, data, associated_data) + return aead._decrypt( + backend, self, nonce, data, associated_data, 16 + ) + + def _check_params(self, nonce, data, associated_data): + utils._check_byteslike("nonce", nonce) + utils._check_bytes("data", data) + utils._check_bytes("associated_data", associated_data) + if len(nonce) == 0: + raise ValueError("Nonce must be at least 1 byte") diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/ciphers/algorithms.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/ciphers/algorithms.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/ciphers/algorithms.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/ciphers/algorithms.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,167 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +from cryptography import utils +from cryptography.hazmat.primitives.ciphers import ( + BlockCipherAlgorithm, CipherAlgorithm +) +from cryptography.hazmat.primitives.ciphers.modes import ModeWithNonce + + +def _verify_key_size(algorithm, key): + # Verify that the key is instance of bytes + utils._check_byteslike("key", key) + + # Verify that the key size matches the expected key size + if len(key) * 8 not in algorithm.key_sizes: + raise ValueError("Invalid key size ({}) for {}.".format( + len(key) * 8, algorithm.name + )) + return key + + +@utils.register_interface(BlockCipherAlgorithm) +@utils.register_interface(CipherAlgorithm) +class AES(object): + name = "AES" + block_size = 128 + # 512 added to support AES-256-XTS, which uses 512-bit keys + key_sizes = frozenset([128, 192, 256, 512]) + + def __init__(self, key): + self.key = _verify_key_size(self, key) + + @property + def key_size(self): + return len(self.key) * 8 + + +@utils.register_interface(BlockCipherAlgorithm) +@utils.register_interface(CipherAlgorithm) +class Camellia(object): + name = "camellia" + block_size = 128 + key_sizes = frozenset([128, 192, 256]) + + def __init__(self, key): + self.key = _verify_key_size(self, key) + + @property + def key_size(self): + return len(self.key) * 8 + + +@utils.register_interface(BlockCipherAlgorithm) +@utils.register_interface(CipherAlgorithm) +class TripleDES(object): + name = "3DES" + block_size = 64 + key_sizes = frozenset([64, 128, 192]) + + def __init__(self, key): + if len(key) == 8: + key += key + key + elif len(key) == 16: + key += key[:8] + self.key = _verify_key_size(self, key) + + @property + def key_size(self): + return len(self.key) * 8 + + +@utils.register_interface(BlockCipherAlgorithm) +@utils.register_interface(CipherAlgorithm) +class Blowfish(object): + name = "Blowfish" + block_size = 64 + key_sizes = frozenset(range(32, 449, 8)) + + def __init__(self, key): + self.key = _verify_key_size(self, key) + + @property + def key_size(self): + return len(self.key) * 8 + + +@utils.register_interface(BlockCipherAlgorithm) +@utils.register_interface(CipherAlgorithm) +class CAST5(object): + name = "CAST5" + block_size = 64 + key_sizes = frozenset(range(40, 129, 8)) + + def __init__(self, key): + self.key = _verify_key_size(self, key) + + @property + def key_size(self): + return len(self.key) * 8 + + +@utils.register_interface(CipherAlgorithm) +class ARC4(object): + name = "RC4" + key_sizes = frozenset([40, 56, 64, 80, 128, 160, 192, 256]) + + def __init__(self, key): + self.key = _verify_key_size(self, key) + + @property + def key_size(self): + return len(self.key) * 8 + + +@utils.register_interface(CipherAlgorithm) +class IDEA(object): + name = "IDEA" + block_size = 64 + key_sizes = frozenset([128]) + + def __init__(self, key): + self.key = _verify_key_size(self, key) + + @property + def key_size(self): + return len(self.key) * 8 + + +@utils.register_interface(BlockCipherAlgorithm) +@utils.register_interface(CipherAlgorithm) +class SEED(object): + name = "SEED" + block_size = 128 + key_sizes = frozenset([128]) + + def __init__(self, key): + self.key = _verify_key_size(self, key) + + @property + def key_size(self): + return len(self.key) * 8 + + +@utils.register_interface(CipherAlgorithm) +@utils.register_interface(ModeWithNonce) +class ChaCha20(object): + name = "ChaCha20" + key_sizes = frozenset([256]) + + def __init__(self, key, nonce): + self.key = _verify_key_size(self, key) + utils._check_byteslike("nonce", nonce) + + if len(nonce) != 16: + raise ValueError("nonce must be 128-bits (16 bytes)") + + self._nonce = nonce + + nonce = utils.read_only_property("_nonce") + + @property + def key_size(self): + return len(self.key) * 8 diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/ciphers/base.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/ciphers/base.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/ciphers/base.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/ciphers/base.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,235 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +import abc + +import six + +from cryptography import utils +from cryptography.exceptions import ( + AlreadyFinalized, AlreadyUpdated, NotYetFinalized, UnsupportedAlgorithm, + _Reasons +) +from cryptography.hazmat.backends.interfaces import CipherBackend +from cryptography.hazmat.primitives.ciphers import modes + + +@six.add_metaclass(abc.ABCMeta) +class CipherAlgorithm(object): + @abc.abstractproperty + def name(self): + """ + A string naming this mode (e.g. "AES", "Camellia"). + """ + + @abc.abstractproperty + def key_size(self): + """ + The size of the key being used as an integer in bits (e.g. 128, 256). + """ + + +@six.add_metaclass(abc.ABCMeta) +class BlockCipherAlgorithm(object): + @abc.abstractproperty + def block_size(self): + """ + The size of a block as an integer in bits (e.g. 64, 128). + """ + + +@six.add_metaclass(abc.ABCMeta) +class CipherContext(object): + @abc.abstractmethod + def update(self, data): + """ + Processes the provided bytes through the cipher and returns the results + as bytes. + """ + + @abc.abstractmethod + def update_into(self, data, buf): + """ + Processes the provided bytes and writes the resulting data into the + provided buffer. Returns the number of bytes written. + """ + + @abc.abstractmethod + def finalize(self): + """ + Returns the results of processing the final block as bytes. + """ + + +@six.add_metaclass(abc.ABCMeta) +class AEADCipherContext(object): + @abc.abstractmethod + def authenticate_additional_data(self, data): + """ + Authenticates the provided bytes. + """ + + +@six.add_metaclass(abc.ABCMeta) +class AEADDecryptionContext(object): + @abc.abstractmethod + def finalize_with_tag(self, tag): + """ + Returns the results of processing the final block as bytes and allows + delayed passing of the authentication tag. + """ + + +@six.add_metaclass(abc.ABCMeta) +class AEADEncryptionContext(object): + @abc.abstractproperty + def tag(self): + """ + Returns tag bytes. This is only available after encryption is + finalized. + """ + + +class Cipher(object): + def __init__(self, algorithm, mode, backend): + if not isinstance(backend, CipherBackend): + raise UnsupportedAlgorithm( + "Backend object does not implement CipherBackend.", + _Reasons.BACKEND_MISSING_INTERFACE + ) + + if not isinstance(algorithm, CipherAlgorithm): + raise TypeError("Expected interface of CipherAlgorithm.") + + if mode is not None: + mode.validate_for_algorithm(algorithm) + + self.algorithm = algorithm + self.mode = mode + self._backend = backend + + def encryptor(self): + if isinstance(self.mode, modes.ModeWithAuthenticationTag): + if self.mode.tag is not None: + raise ValueError( + "Authentication tag must be None when encrypting." + ) + ctx = self._backend.create_symmetric_encryption_ctx( + self.algorithm, self.mode + ) + return self._wrap_ctx(ctx, encrypt=True) + + def decryptor(self): + ctx = self._backend.create_symmetric_decryption_ctx( + self.algorithm, self.mode + ) + return self._wrap_ctx(ctx, encrypt=False) + + def _wrap_ctx(self, ctx, encrypt): + if isinstance(self.mode, modes.ModeWithAuthenticationTag): + if encrypt: + return _AEADEncryptionContext(ctx) + else: + return _AEADCipherContext(ctx) + else: + return _CipherContext(ctx) + + +@utils.register_interface(CipherContext) +class _CipherContext(object): + def __init__(self, ctx): + self._ctx = ctx + + def update(self, data): + if self._ctx is None: + raise AlreadyFinalized("Context was already finalized.") + return self._ctx.update(data) + + def update_into(self, data, buf): + if self._ctx is None: + raise AlreadyFinalized("Context was already finalized.") + return self._ctx.update_into(data, buf) + + def finalize(self): + if self._ctx is None: + raise AlreadyFinalized("Context was already finalized.") + data = self._ctx.finalize() + self._ctx = None + return data + + +@utils.register_interface(AEADCipherContext) +@utils.register_interface(CipherContext) +@utils.register_interface(AEADDecryptionContext) +class _AEADCipherContext(object): + def __init__(self, ctx): + self._ctx = ctx + self._bytes_processed = 0 + self._aad_bytes_processed = 0 + self._tag = None + self._updated = False + + def _check_limit(self, data_size): + if self._ctx is None: + raise AlreadyFinalized("Context was already finalized.") + self._updated = True + self._bytes_processed += data_size + if self._bytes_processed > self._ctx._mode._MAX_ENCRYPTED_BYTES: + raise ValueError( + "{} has a maximum encrypted byte limit of {}".format( + self._ctx._mode.name, self._ctx._mode._MAX_ENCRYPTED_BYTES + ) + ) + + def update(self, data): + self._check_limit(len(data)) + return self._ctx.update(data) + + def update_into(self, data, buf): + self._check_limit(len(data)) + return self._ctx.update_into(data, buf) + + def finalize(self): + if self._ctx is None: + raise AlreadyFinalized("Context was already finalized.") + data = self._ctx.finalize() + self._tag = self._ctx.tag + self._ctx = None + return data + + def finalize_with_tag(self, tag): + if self._ctx is None: + raise AlreadyFinalized("Context was already finalized.") + data = self._ctx.finalize_with_tag(tag) + self._tag = self._ctx.tag + self._ctx = None + return data + + def authenticate_additional_data(self, data): + if self._ctx is None: + raise AlreadyFinalized("Context was already finalized.") + if self._updated: + raise AlreadyUpdated("Update has been called on this context.") + + self._aad_bytes_processed += len(data) + if self._aad_bytes_processed > self._ctx._mode._MAX_AAD_BYTES: + raise ValueError( + "{} has a maximum AAD byte limit of {}".format( + self._ctx._mode.name, self._ctx._mode._MAX_AAD_BYTES + ) + ) + + self._ctx.authenticate_additional_data(data) + + +@utils.register_interface(AEADEncryptionContext) +class _AEADEncryptionContext(_AEADCipherContext): + @property + def tag(self): + if self._ctx is not None: + raise NotYetFinalized("You must finalize encryption before " + "getting the tag.") + return self._tag diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/ciphers/__init__.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/ciphers/__init__.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/ciphers/__init__.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/ciphers/__init__.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,21 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +from cryptography.hazmat.primitives.ciphers.base import ( + AEADCipherContext, AEADDecryptionContext, AEADEncryptionContext, + BlockCipherAlgorithm, Cipher, CipherAlgorithm, CipherContext +) + + +__all__ = [ + "Cipher", + "CipherAlgorithm", + "BlockCipherAlgorithm", + "CipherContext", + "AEADCipherContext", + "AEADDecryptionContext", + "AEADEncryptionContext", +] diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/ciphers/modes.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/ciphers/modes.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/ciphers/modes.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/ciphers/modes.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,218 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +import abc + +import six + +from cryptography import utils + + +@six.add_metaclass(abc.ABCMeta) +class Mode(object): + @abc.abstractproperty + def name(self): + """ + A string naming this mode (e.g. "ECB", "CBC"). + """ + + @abc.abstractmethod + def validate_for_algorithm(self, algorithm): + """ + Checks that all the necessary invariants of this (mode, algorithm) + combination are met. + """ + + +@six.add_metaclass(abc.ABCMeta) +class ModeWithInitializationVector(object): + @abc.abstractproperty + def initialization_vector(self): + """ + The value of the initialization vector for this mode as bytes. + """ + + +@six.add_metaclass(abc.ABCMeta) +class ModeWithTweak(object): + @abc.abstractproperty + def tweak(self): + """ + The value of the tweak for this mode as bytes. + """ + + +@six.add_metaclass(abc.ABCMeta) +class ModeWithNonce(object): + @abc.abstractproperty + def nonce(self): + """ + The value of the nonce for this mode as bytes. + """ + + +@six.add_metaclass(abc.ABCMeta) +class ModeWithAuthenticationTag(object): + @abc.abstractproperty + def tag(self): + """ + The value of the tag supplied to the constructor of this mode. + """ + + +def _check_aes_key_length(self, algorithm): + if algorithm.key_size > 256 and algorithm.name == "AES": + raise ValueError( + "Only 128, 192, and 256 bit keys are allowed for this AES mode" + ) + + +def _check_iv_length(self, algorithm): + if len(self.initialization_vector) * 8 != algorithm.block_size: + raise ValueError("Invalid IV size ({}) for {}.".format( + len(self.initialization_vector), self.name + )) + + +def _check_iv_and_key_length(self, algorithm): + _check_aes_key_length(self, algorithm) + _check_iv_length(self, algorithm) + + +@utils.register_interface(Mode) +@utils.register_interface(ModeWithInitializationVector) +class CBC(object): + name = "CBC" + + def __init__(self, initialization_vector): + utils._check_byteslike("initialization_vector", initialization_vector) + self._initialization_vector = initialization_vector + + initialization_vector = utils.read_only_property("_initialization_vector") + validate_for_algorithm = _check_iv_and_key_length + + +@utils.register_interface(Mode) +@utils.register_interface(ModeWithTweak) +class XTS(object): + name = "XTS" + + def __init__(self, tweak): + utils._check_byteslike("tweak", tweak) + + if len(tweak) != 16: + raise ValueError("tweak must be 128-bits (16 bytes)") + + self._tweak = tweak + + tweak = utils.read_only_property("_tweak") + + def validate_for_algorithm(self, algorithm): + if algorithm.key_size not in (256, 512): + raise ValueError( + "The XTS specification requires a 256-bit key for AES-128-XTS" + " and 512-bit key for AES-256-XTS" + ) + + +@utils.register_interface(Mode) +class ECB(object): + name = "ECB" + + validate_for_algorithm = _check_aes_key_length + + +@utils.register_interface(Mode) +@utils.register_interface(ModeWithInitializationVector) +class OFB(object): + name = "OFB" + + def __init__(self, initialization_vector): + utils._check_byteslike("initialization_vector", initialization_vector) + self._initialization_vector = initialization_vector + + initialization_vector = utils.read_only_property("_initialization_vector") + validate_for_algorithm = _check_iv_and_key_length + + +@utils.register_interface(Mode) +@utils.register_interface(ModeWithInitializationVector) +class CFB(object): + name = "CFB" + + def __init__(self, initialization_vector): + utils._check_byteslike("initialization_vector", initialization_vector) + self._initialization_vector = initialization_vector + + initialization_vector = utils.read_only_property("_initialization_vector") + validate_for_algorithm = _check_iv_and_key_length + + +@utils.register_interface(Mode) +@utils.register_interface(ModeWithInitializationVector) +class CFB8(object): + name = "CFB8" + + def __init__(self, initialization_vector): + utils._check_byteslike("initialization_vector", initialization_vector) + self._initialization_vector = initialization_vector + + initialization_vector = utils.read_only_property("_initialization_vector") + validate_for_algorithm = _check_iv_and_key_length + + +@utils.register_interface(Mode) +@utils.register_interface(ModeWithNonce) +class CTR(object): + name = "CTR" + + def __init__(self, nonce): + utils._check_byteslike("nonce", nonce) + self._nonce = nonce + + nonce = utils.read_only_property("_nonce") + + def validate_for_algorithm(self, algorithm): + _check_aes_key_length(self, algorithm) + if len(self.nonce) * 8 != algorithm.block_size: + raise ValueError("Invalid nonce size ({}) for {}.".format( + len(self.nonce), self.name + )) + + +@utils.register_interface(Mode) +@utils.register_interface(ModeWithInitializationVector) +@utils.register_interface(ModeWithAuthenticationTag) +class GCM(object): + name = "GCM" + _MAX_ENCRYPTED_BYTES = (2 ** 39 - 256) // 8 + _MAX_AAD_BYTES = (2 ** 64) // 8 + + def __init__(self, initialization_vector, tag=None, min_tag_length=16): + # len(initialization_vector) must in [1, 2 ** 64), but it's impossible + # to actually construct a bytes object that large, so we don't check + # for it + utils._check_byteslike("initialization_vector", initialization_vector) + if len(initialization_vector) == 0: + raise ValueError("initialization_vector must be at least 1 byte") + self._initialization_vector = initialization_vector + if tag is not None: + utils._check_bytes("tag", tag) + if min_tag_length < 4: + raise ValueError("min_tag_length must be >= 4") + if len(tag) < min_tag_length: + raise ValueError( + "Authentication tag must be {} bytes or longer.".format( + min_tag_length) + ) + self._tag = tag + self._min_tag_length = min_tag_length + + tag = utils.read_only_property("_tag") + initialization_vector = utils.read_only_property("_initialization_vector") + + def validate_for_algorithm(self, algorithm): + _check_aes_key_length(self, algorithm) diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/cmac.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/cmac.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/cmac.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/cmac.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,64 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +from cryptography import utils +from cryptography.exceptions import ( + AlreadyFinalized, UnsupportedAlgorithm, _Reasons +) +from cryptography.hazmat.backends.interfaces import CMACBackend +from cryptography.hazmat.primitives import ciphers + + +class CMAC(object): + def __init__(self, algorithm, backend, ctx=None): + if not isinstance(backend, CMACBackend): + raise UnsupportedAlgorithm( + "Backend object does not implement CMACBackend.", + _Reasons.BACKEND_MISSING_INTERFACE + ) + + if not isinstance(algorithm, ciphers.BlockCipherAlgorithm): + raise TypeError( + "Expected instance of BlockCipherAlgorithm." + ) + self._algorithm = algorithm + + self._backend = backend + if ctx is None: + self._ctx = self._backend.create_cmac_ctx(self._algorithm) + else: + self._ctx = ctx + + def update(self, data): + if self._ctx is None: + raise AlreadyFinalized("Context was already finalized.") + + utils._check_bytes("data", data) + self._ctx.update(data) + + def finalize(self): + if self._ctx is None: + raise AlreadyFinalized("Context was already finalized.") + digest = self._ctx.finalize() + self._ctx = None + return digest + + def verify(self, signature): + utils._check_bytes("signature", signature) + if self._ctx is None: + raise AlreadyFinalized("Context was already finalized.") + + ctx, self._ctx = self._ctx, None + ctx.verify(signature) + + def copy(self): + if self._ctx is None: + raise AlreadyFinalized("Context was already finalized.") + return CMAC( + self._algorithm, + backend=self._backend, + ctx=self._ctx.copy() + ) diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/constant_time.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/constant_time.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/constant_time.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/constant_time.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,35 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +import hmac +import warnings + +from cryptography import utils +from cryptography.hazmat.bindings._constant_time import lib + + +if hasattr(hmac, "compare_digest"): + def bytes_eq(a, b): + if not isinstance(a, bytes) or not isinstance(b, bytes): + raise TypeError("a and b must be bytes.") + + return hmac.compare_digest(a, b) + +else: + warnings.warn( + "Support for your Python version is deprecated. The next version of " + "cryptography will remove support. Please upgrade to a release " + "(2.7.7+) that supports hmac.compare_digest as soon as possible.", + utils.PersistentlyDeprecated2018, + ) + + def bytes_eq(a, b): + if not isinstance(a, bytes) or not isinstance(b, bytes): + raise TypeError("a and b must be bytes.") + + return lib.Cryptography_constant_time_bytes_eq( + a, len(a), b, len(b) + ) == 1 diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/hashes.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/hashes.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/hashes.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/hashes.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,255 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +import abc + +import six + +from cryptography import utils +from cryptography.exceptions import ( + AlreadyFinalized, UnsupportedAlgorithm, _Reasons +) +from cryptography.hazmat.backends.interfaces import HashBackend + + +@six.add_metaclass(abc.ABCMeta) +class HashAlgorithm(object): + @abc.abstractproperty + def name(self): + """ + A string naming this algorithm (e.g. "sha256", "md5"). + """ + + @abc.abstractproperty + def digest_size(self): + """ + The size of the resulting digest in bytes. + """ + + +@six.add_metaclass(abc.ABCMeta) +class HashContext(object): + @abc.abstractproperty + def algorithm(self): + """ + A HashAlgorithm that will be used by this context. + """ + + @abc.abstractmethod + def update(self, data): + """ + Processes the provided bytes through the hash. + """ + + @abc.abstractmethod + def finalize(self): + """ + Finalizes the hash context and returns the hash digest as bytes. + """ + + @abc.abstractmethod + def copy(self): + """ + Return a HashContext that is a copy of the current context. + """ + + +@six.add_metaclass(abc.ABCMeta) +class ExtendableOutputFunction(object): + """ + An interface for extendable output functions. + """ + + +@utils.register_interface(HashContext) +class Hash(object): + def __init__(self, algorithm, backend, ctx=None): + if not isinstance(backend, HashBackend): + raise UnsupportedAlgorithm( + "Backend object does not implement HashBackend.", + _Reasons.BACKEND_MISSING_INTERFACE + ) + + if not isinstance(algorithm, HashAlgorithm): + raise TypeError("Expected instance of hashes.HashAlgorithm.") + self._algorithm = algorithm + + self._backend = backend + + if ctx is None: + self._ctx = self._backend.create_hash_ctx(self.algorithm) + else: + self._ctx = ctx + + algorithm = utils.read_only_property("_algorithm") + + def update(self, data): + if self._ctx is None: + raise AlreadyFinalized("Context was already finalized.") + utils._check_byteslike("data", data) + self._ctx.update(data) + + def copy(self): + if self._ctx is None: + raise AlreadyFinalized("Context was already finalized.") + return Hash( + self.algorithm, backend=self._backend, ctx=self._ctx.copy() + ) + + def finalize(self): + if self._ctx is None: + raise AlreadyFinalized("Context was already finalized.") + digest = self._ctx.finalize() + self._ctx = None + return digest + + +@utils.register_interface(HashAlgorithm) +class SHA1(object): + name = "sha1" + digest_size = 20 + block_size = 64 + + +@utils.register_interface(HashAlgorithm) +class SHA512_224(object): # noqa: N801 + name = "sha512-224" + digest_size = 28 + block_size = 128 + + +@utils.register_interface(HashAlgorithm) +class SHA512_256(object): # noqa: N801 + name = "sha512-256" + digest_size = 32 + block_size = 128 + + +@utils.register_interface(HashAlgorithm) +class SHA224(object): + name = "sha224" + digest_size = 28 + block_size = 64 + + +@utils.register_interface(HashAlgorithm) +class SHA256(object): + name = "sha256" + digest_size = 32 + block_size = 64 + + +@utils.register_interface(HashAlgorithm) +class SHA384(object): + name = "sha384" + digest_size = 48 + block_size = 128 + + +@utils.register_interface(HashAlgorithm) +class SHA512(object): + name = "sha512" + digest_size = 64 + block_size = 128 + + +@utils.register_interface(HashAlgorithm) +class SHA3_224(object): # noqa: N801 + name = "sha3-224" + digest_size = 28 + + +@utils.register_interface(HashAlgorithm) +class SHA3_256(object): # noqa: N801 + name = "sha3-256" + digest_size = 32 + + +@utils.register_interface(HashAlgorithm) +class SHA3_384(object): # noqa: N801 + name = "sha3-384" + digest_size = 48 + + +@utils.register_interface(HashAlgorithm) +class SHA3_512(object): # noqa: N801 + name = "sha3-512" + digest_size = 64 + + +@utils.register_interface(HashAlgorithm) +@utils.register_interface(ExtendableOutputFunction) +class SHAKE128(object): + name = "shake128" + + def __init__(self, digest_size): + if not isinstance(digest_size, six.integer_types): + raise TypeError("digest_size must be an integer") + + if digest_size < 1: + raise ValueError("digest_size must be a positive integer") + + self._digest_size = digest_size + + digest_size = utils.read_only_property("_digest_size") + + +@utils.register_interface(HashAlgorithm) +@utils.register_interface(ExtendableOutputFunction) +class SHAKE256(object): + name = "shake256" + + def __init__(self, digest_size): + if not isinstance(digest_size, six.integer_types): + raise TypeError("digest_size must be an integer") + + if digest_size < 1: + raise ValueError("digest_size must be a positive integer") + + self._digest_size = digest_size + + digest_size = utils.read_only_property("_digest_size") + + +@utils.register_interface(HashAlgorithm) +class MD5(object): + name = "md5" + digest_size = 16 + block_size = 64 + + +@utils.register_interface(HashAlgorithm) +class BLAKE2b(object): + name = "blake2b" + _max_digest_size = 64 + _min_digest_size = 1 + block_size = 128 + + def __init__(self, digest_size): + + if digest_size != 64: + raise ValueError("Digest size must be 64") + + self._digest_size = digest_size + + digest_size = utils.read_only_property("_digest_size") + + +@utils.register_interface(HashAlgorithm) +class BLAKE2s(object): + name = "blake2s" + block_size = 64 + _max_digest_size = 32 + _min_digest_size = 1 + + def __init__(self, digest_size): + + if digest_size != 32: + raise ValueError("Digest size must be 32") + + self._digest_size = digest_size + + digest_size = utils.read_only_property("_digest_size") diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/hmac.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/hmac.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/hmac.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/hmac.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,66 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +from cryptography import utils +from cryptography.exceptions import ( + AlreadyFinalized, UnsupportedAlgorithm, _Reasons +) +from cryptography.hazmat.backends.interfaces import HMACBackend +from cryptography.hazmat.primitives import hashes + + +@utils.register_interface(hashes.HashContext) +class HMAC(object): + def __init__(self, key, algorithm, backend, ctx=None): + if not isinstance(backend, HMACBackend): + raise UnsupportedAlgorithm( + "Backend object does not implement HMACBackend.", + _Reasons.BACKEND_MISSING_INTERFACE + ) + + if not isinstance(algorithm, hashes.HashAlgorithm): + raise TypeError("Expected instance of hashes.HashAlgorithm.") + self._algorithm = algorithm + + self._backend = backend + self._key = key + if ctx is None: + self._ctx = self._backend.create_hmac_ctx(key, self.algorithm) + else: + self._ctx = ctx + + algorithm = utils.read_only_property("_algorithm") + + def update(self, data): + if self._ctx is None: + raise AlreadyFinalized("Context was already finalized.") + utils._check_byteslike("data", data) + self._ctx.update(data) + + def copy(self): + if self._ctx is None: + raise AlreadyFinalized("Context was already finalized.") + return HMAC( + self._key, + self.algorithm, + backend=self._backend, + ctx=self._ctx.copy() + ) + + def finalize(self): + if self._ctx is None: + raise AlreadyFinalized("Context was already finalized.") + digest = self._ctx.finalize() + self._ctx = None + return digest + + def verify(self, signature): + utils._check_bytes("signature", signature) + if self._ctx is None: + raise AlreadyFinalized("Context was already finalized.") + + ctx, self._ctx = self._ctx, None + ctx.verify(signature) diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/__init__.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/__init__.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/__init__.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/__init__.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,5 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/kdf/concatkdf.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/kdf/concatkdf.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/kdf/concatkdf.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/kdf/concatkdf.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,124 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +import struct + +from cryptography import utils +from cryptography.exceptions import ( + AlreadyFinalized, InvalidKey, UnsupportedAlgorithm, _Reasons +) +from cryptography.hazmat.backends.interfaces import HMACBackend +from cryptography.hazmat.backends.interfaces import HashBackend +from cryptography.hazmat.primitives import constant_time, hashes, hmac +from cryptography.hazmat.primitives.kdf import KeyDerivationFunction + + +def _int_to_u32be(n): + return struct.pack('>I', n) + + +def _common_args_checks(algorithm, length, otherinfo): + max_length = algorithm.digest_size * (2 ** 32 - 1) + if length > max_length: + raise ValueError( + "Can not derive keys larger than {} bits.".format( + max_length + )) + if otherinfo is not None: + utils._check_bytes("otherinfo", otherinfo) + + +def _concatkdf_derive(key_material, length, auxfn, otherinfo): + utils._check_byteslike("key_material", key_material) + output = [b""] + outlen = 0 + counter = 1 + + while (length > outlen): + h = auxfn() + h.update(_int_to_u32be(counter)) + h.update(key_material) + h.update(otherinfo) + output.append(h.finalize()) + outlen += len(output[-1]) + counter += 1 + + return b"".join(output)[:length] + + +@utils.register_interface(KeyDerivationFunction) +class ConcatKDFHash(object): + def __init__(self, algorithm, length, otherinfo, backend): + + _common_args_checks(algorithm, length, otherinfo) + self._algorithm = algorithm + self._length = length + self._otherinfo = otherinfo + if self._otherinfo is None: + self._otherinfo = b"" + + if not isinstance(backend, HashBackend): + raise UnsupportedAlgorithm( + "Backend object does not implement HashBackend.", + _Reasons.BACKEND_MISSING_INTERFACE + ) + self._backend = backend + self._used = False + + def _hash(self): + return hashes.Hash(self._algorithm, self._backend) + + def derive(self, key_material): + if self._used: + raise AlreadyFinalized + self._used = True + return _concatkdf_derive(key_material, self._length, + self._hash, self._otherinfo) + + def verify(self, key_material, expected_key): + if not constant_time.bytes_eq(self.derive(key_material), expected_key): + raise InvalidKey + + +@utils.register_interface(KeyDerivationFunction) +class ConcatKDFHMAC(object): + def __init__(self, algorithm, length, salt, otherinfo, backend): + + _common_args_checks(algorithm, length, otherinfo) + self._algorithm = algorithm + self._length = length + self._otherinfo = otherinfo + if self._otherinfo is None: + self._otherinfo = b"" + + if salt is None: + salt = b"\x00" * algorithm.block_size + else: + utils._check_bytes("salt", salt) + + self._salt = salt + + if not isinstance(backend, HMACBackend): + raise UnsupportedAlgorithm( + "Backend object does not implement HMACBackend.", + _Reasons.BACKEND_MISSING_INTERFACE + ) + self._backend = backend + self._used = False + + def _hmac(self): + return hmac.HMAC(self._salt, self._algorithm, self._backend) + + def derive(self, key_material): + if self._used: + raise AlreadyFinalized + self._used = True + return _concatkdf_derive(key_material, self._length, + self._hmac, self._otherinfo) + + def verify(self, key_material, expected_key): + if not constant_time.bytes_eq(self.derive(key_material), expected_key): + raise InvalidKey diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/kdf/hkdf.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/kdf/hkdf.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/kdf/hkdf.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/kdf/hkdf.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,110 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +import six + +from cryptography import utils +from cryptography.exceptions import ( + AlreadyFinalized, InvalidKey, UnsupportedAlgorithm, _Reasons +) +from cryptography.hazmat.backends.interfaces import HMACBackend +from cryptography.hazmat.primitives import constant_time, hmac +from cryptography.hazmat.primitives.kdf import KeyDerivationFunction + + +@utils.register_interface(KeyDerivationFunction) +class HKDF(object): + def __init__(self, algorithm, length, salt, info, backend): + if not isinstance(backend, HMACBackend): + raise UnsupportedAlgorithm( + "Backend object does not implement HMACBackend.", + _Reasons.BACKEND_MISSING_INTERFACE + ) + + self._algorithm = algorithm + + if salt is None: + salt = b"\x00" * self._algorithm.digest_size + else: + utils._check_bytes("salt", salt) + + self._salt = salt + + self._backend = backend + + self._hkdf_expand = HKDFExpand(self._algorithm, length, info, backend) + + def _extract(self, key_material): + h = hmac.HMAC(self._salt, self._algorithm, backend=self._backend) + h.update(key_material) + return h.finalize() + + def derive(self, key_material): + utils._check_byteslike("key_material", key_material) + return self._hkdf_expand.derive(self._extract(key_material)) + + def verify(self, key_material, expected_key): + if not constant_time.bytes_eq(self.derive(key_material), expected_key): + raise InvalidKey + + +@utils.register_interface(KeyDerivationFunction) +class HKDFExpand(object): + def __init__(self, algorithm, length, info, backend): + if not isinstance(backend, HMACBackend): + raise UnsupportedAlgorithm( + "Backend object does not implement HMACBackend.", + _Reasons.BACKEND_MISSING_INTERFACE + ) + + self._algorithm = algorithm + + self._backend = backend + + max_length = 255 * algorithm.digest_size + + if length > max_length: + raise ValueError( + "Can not derive keys larger than {} octets.".format( + max_length + )) + + self._length = length + + if info is None: + info = b"" + else: + utils._check_bytes("info", info) + + self._info = info + + self._used = False + + def _expand(self, key_material): + output = [b""] + counter = 1 + + while self._algorithm.digest_size * (len(output) - 1) < self._length: + h = hmac.HMAC(key_material, self._algorithm, backend=self._backend) + h.update(output[-1]) + h.update(self._info) + h.update(six.int2byte(counter)) + output.append(h.finalize()) + counter += 1 + + return b"".join(output)[:self._length] + + def derive(self, key_material): + utils._check_byteslike("key_material", key_material) + if self._used: + raise AlreadyFinalized + + self._used = True + return self._expand(key_material) + + def verify(self, key_material, expected_key): + if not constant_time.bytes_eq(self.derive(key_material), expected_key): + raise InvalidKey diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/kdf/__init__.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/kdf/__init__.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/kdf/__init__.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/kdf/__init__.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,26 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +import abc + +import six + + +@six.add_metaclass(abc.ABCMeta) +class KeyDerivationFunction(object): + @abc.abstractmethod + def derive(self, key_material): + """ + Deterministically generates and returns a new key based on the existing + key material. + """ + + @abc.abstractmethod + def verify(self, key_material, expected_key): + """ + Checks whether the key generated by the key material matches the + expected derived key. Raises an exception if they do not match. + """ diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/kdf/kbkdf.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/kdf/kbkdf.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/kdf/kbkdf.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/kdf/kbkdf.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,145 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +from enum import Enum + +from six.moves import range + +from cryptography import utils +from cryptography.exceptions import ( + AlreadyFinalized, InvalidKey, UnsupportedAlgorithm, _Reasons +) +from cryptography.hazmat.backends.interfaces import HMACBackend +from cryptography.hazmat.primitives import constant_time, hashes, hmac +from cryptography.hazmat.primitives.kdf import KeyDerivationFunction + + +class Mode(Enum): + CounterMode = "ctr" + + +class CounterLocation(Enum): + BeforeFixed = "before_fixed" + AfterFixed = "after_fixed" + + +@utils.register_interface(KeyDerivationFunction) +class KBKDFHMAC(object): + def __init__(self, algorithm, mode, length, rlen, llen, + location, label, context, fixed, backend): + if not isinstance(backend, HMACBackend): + raise UnsupportedAlgorithm( + "Backend object does not implement HMACBackend.", + _Reasons.BACKEND_MISSING_INTERFACE + ) + + if not isinstance(algorithm, hashes.HashAlgorithm): + raise UnsupportedAlgorithm( + "Algorithm supplied is not a supported hash algorithm.", + _Reasons.UNSUPPORTED_HASH + ) + + if not backend.hmac_supported(algorithm): + raise UnsupportedAlgorithm( + "Algorithm supplied is not a supported hmac algorithm.", + _Reasons.UNSUPPORTED_HASH + ) + + if not isinstance(mode, Mode): + raise TypeError("mode must be of type Mode") + + if not isinstance(location, CounterLocation): + raise TypeError("location must be of type CounterLocation") + + if (label or context) and fixed: + raise ValueError("When supplying fixed data, " + "label and context are ignored.") + + if rlen is None or not self._valid_byte_length(rlen): + raise ValueError("rlen must be between 1 and 4") + + if llen is None and fixed is None: + raise ValueError("Please specify an llen") + + if llen is not None and not isinstance(llen, int): + raise TypeError("llen must be an integer") + + if label is None: + label = b'' + + if context is None: + context = b'' + + utils._check_bytes("label", label) + utils._check_bytes("context", context) + self._algorithm = algorithm + self._mode = mode + self._length = length + self._rlen = rlen + self._llen = llen + self._location = location + self._label = label + self._context = context + self._backend = backend + self._used = False + self._fixed_data = fixed + + def _valid_byte_length(self, value): + if not isinstance(value, int): + raise TypeError('value must be of type int') + + value_bin = utils.int_to_bytes(1, value) + if not 1 <= len(value_bin) <= 4: + return False + return True + + def derive(self, key_material): + if self._used: + raise AlreadyFinalized + + utils._check_byteslike("key_material", key_material) + self._used = True + + # inverse floor division (equivalent to ceiling) + rounds = -(-self._length // self._algorithm.digest_size) + + output = [b''] + + # For counter mode, the number of iterations shall not be + # larger than 2^r-1, where r <= 32 is the binary length of the counter + # This ensures that the counter values used as an input to the + # PRF will not repeat during a particular call to the KDF function. + r_bin = utils.int_to_bytes(1, self._rlen) + if rounds > pow(2, len(r_bin) * 8) - 1: + raise ValueError('There are too many iterations.') + + for i in range(1, rounds + 1): + h = hmac.HMAC(key_material, self._algorithm, backend=self._backend) + + counter = utils.int_to_bytes(i, self._rlen) + if self._location == CounterLocation.BeforeFixed: + h.update(counter) + + h.update(self._generate_fixed_input()) + + if self._location == CounterLocation.AfterFixed: + h.update(counter) + + output.append(h.finalize()) + + return b''.join(output)[:self._length] + + def _generate_fixed_input(self): + if self._fixed_data and isinstance(self._fixed_data, bytes): + return self._fixed_data + + l_val = utils.int_to_bytes(self._length * 8, self._llen) + + return b"".join([self._label, b"\x00", self._context, l_val]) + + def verify(self, key_material, expected_key): + if not constant_time.bytes_eq(self.derive(key_material), expected_key): + raise InvalidKey diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/kdf/pbkdf2.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/kdf/pbkdf2.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/kdf/pbkdf2.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/kdf/pbkdf2.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,56 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +from cryptography import utils +from cryptography.exceptions import ( + AlreadyFinalized, InvalidKey, UnsupportedAlgorithm, _Reasons +) +from cryptography.hazmat.backends.interfaces import PBKDF2HMACBackend +from cryptography.hazmat.primitives import constant_time +from cryptography.hazmat.primitives.kdf import KeyDerivationFunction + + +@utils.register_interface(KeyDerivationFunction) +class PBKDF2HMAC(object): + def __init__(self, algorithm, length, salt, iterations, backend): + if not isinstance(backend, PBKDF2HMACBackend): + raise UnsupportedAlgorithm( + "Backend object does not implement PBKDF2HMACBackend.", + _Reasons.BACKEND_MISSING_INTERFACE + ) + + if not backend.pbkdf2_hmac_supported(algorithm): + raise UnsupportedAlgorithm( + "{} is not supported for PBKDF2 by this backend.".format( + algorithm.name), + _Reasons.UNSUPPORTED_HASH + ) + self._used = False + self._algorithm = algorithm + self._length = length + utils._check_bytes("salt", salt) + self._salt = salt + self._iterations = iterations + self._backend = backend + + def derive(self, key_material): + if self._used: + raise AlreadyFinalized("PBKDF2 instances can only be used once.") + self._used = True + + utils._check_byteslike("key_material", key_material) + return self._backend.derive_pbkdf2_hmac( + self._algorithm, + self._length, + self._salt, + self._iterations, + key_material + ) + + def verify(self, key_material, expected_key): + derived_key = self.derive(key_material) + if not constant_time.bytes_eq(derived_key, expected_key): + raise InvalidKey("Keys do not match.") diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/kdf/scrypt.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/kdf/scrypt.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/kdf/scrypt.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/kdf/scrypt.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,63 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +import sys + +from cryptography import utils +from cryptography.exceptions import ( + AlreadyFinalized, InvalidKey, UnsupportedAlgorithm, _Reasons +) +from cryptography.hazmat.backends.interfaces import ScryptBackend +from cryptography.hazmat.primitives import constant_time +from cryptography.hazmat.primitives.kdf import KeyDerivationFunction + + +# This is used by the scrypt tests to skip tests that require more memory +# than the MEM_LIMIT +_MEM_LIMIT = sys.maxsize // 2 + + +@utils.register_interface(KeyDerivationFunction) +class Scrypt(object): + def __init__(self, salt, length, n, r, p, backend): + if not isinstance(backend, ScryptBackend): + raise UnsupportedAlgorithm( + "Backend object does not implement ScryptBackend.", + _Reasons.BACKEND_MISSING_INTERFACE + ) + + self._length = length + utils._check_bytes("salt", salt) + if n < 2 or (n & (n - 1)) != 0: + raise ValueError("n must be greater than 1 and be a power of 2.") + + if r < 1: + raise ValueError("r must be greater than or equal to 1.") + + if p < 1: + raise ValueError("p must be greater than or equal to 1.") + + self._used = False + self._salt = salt + self._n = n + self._r = r + self._p = p + self._backend = backend + + def derive(self, key_material): + if self._used: + raise AlreadyFinalized("Scrypt instances can only be used once.") + self._used = True + + utils._check_byteslike("key_material", key_material) + return self._backend.derive_scrypt( + key_material, self._salt, self._length, self._n, self._r, self._p + ) + + def verify(self, key_material, expected_key): + derived_key = self.derive(key_material) + if not constant_time.bytes_eq(derived_key, expected_key): + raise InvalidKey("Keys do not match.") diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/kdf/x963kdf.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/kdf/x963kdf.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/kdf/x963kdf.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/kdf/x963kdf.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,68 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +import struct + +from cryptography import utils +from cryptography.exceptions import ( + AlreadyFinalized, InvalidKey, UnsupportedAlgorithm, _Reasons +) +from cryptography.hazmat.backends.interfaces import HashBackend +from cryptography.hazmat.primitives import constant_time, hashes +from cryptography.hazmat.primitives.kdf import KeyDerivationFunction + + +def _int_to_u32be(n): + return struct.pack('>I', n) + + +@utils.register_interface(KeyDerivationFunction) +class X963KDF(object): + def __init__(self, algorithm, length, sharedinfo, backend): + + max_len = algorithm.digest_size * (2 ** 32 - 1) + if length > max_len: + raise ValueError( + "Can not derive keys larger than {} bits.".format(max_len)) + if sharedinfo is not None: + utils._check_bytes("sharedinfo", sharedinfo) + + self._algorithm = algorithm + self._length = length + self._sharedinfo = sharedinfo + + if not isinstance(backend, HashBackend): + raise UnsupportedAlgorithm( + "Backend object does not implement HashBackend.", + _Reasons.BACKEND_MISSING_INTERFACE + ) + self._backend = backend + self._used = False + + def derive(self, key_material): + if self._used: + raise AlreadyFinalized + self._used = True + utils._check_byteslike("key_material", key_material) + output = [b""] + outlen = 0 + counter = 1 + + while self._length > outlen: + h = hashes.Hash(self._algorithm, self._backend) + h.update(key_material) + h.update(_int_to_u32be(counter)) + if self._sharedinfo is not None: + h.update(self._sharedinfo) + output.append(h.finalize()) + outlen += len(output[-1]) + counter += 1 + + return b"".join(output)[:self._length] + + def verify(self, key_material, expected_key): + if not constant_time.bytes_eq(self.derive(key_material), expected_key): + raise InvalidKey diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/keywrap.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/keywrap.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/keywrap.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/keywrap.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,154 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +import struct + +from cryptography.hazmat.primitives.ciphers import Cipher +from cryptography.hazmat.primitives.ciphers.algorithms import AES +from cryptography.hazmat.primitives.ciphers.modes import ECB +from cryptography.hazmat.primitives.constant_time import bytes_eq + + +def _wrap_core(wrapping_key, a, r, backend): + # RFC 3394 Key Wrap - 2.2.1 (index method) + encryptor = Cipher(AES(wrapping_key), ECB(), backend).encryptor() + n = len(r) + for j in range(6): + for i in range(n): + # every encryption operation is a discrete 16 byte chunk (because + # AES has a 128-bit block size) and since we're using ECB it is + # safe to reuse the encryptor for the entire operation + b = encryptor.update(a + r[i]) + # pack/unpack are safe as these are always 64-bit chunks + a = struct.pack( + ">Q", struct.unpack(">Q", b[:8])[0] ^ ((n * j) + i + 1) + ) + r[i] = b[-8:] + + assert encryptor.finalize() == b"" + + return a + b"".join(r) + + +def aes_key_wrap(wrapping_key, key_to_wrap, backend): + if len(wrapping_key) not in [16, 24, 32]: + raise ValueError("The wrapping key must be a valid AES key length") + + if len(key_to_wrap) < 16: + raise ValueError("The key to wrap must be at least 16 bytes") + + if len(key_to_wrap) % 8 != 0: + raise ValueError("The key to wrap must be a multiple of 8 bytes") + + a = b"\xa6\xa6\xa6\xa6\xa6\xa6\xa6\xa6" + r = [key_to_wrap[i:i + 8] for i in range(0, len(key_to_wrap), 8)] + return _wrap_core(wrapping_key, a, r, backend) + + +def _unwrap_core(wrapping_key, a, r, backend): + # Implement RFC 3394 Key Unwrap - 2.2.2 (index method) + decryptor = Cipher(AES(wrapping_key), ECB(), backend).decryptor() + n = len(r) + for j in reversed(range(6)): + for i in reversed(range(n)): + # pack/unpack are safe as these are always 64-bit chunks + atr = struct.pack( + ">Q", struct.unpack(">Q", a)[0] ^ ((n * j) + i + 1) + ) + r[i] + # every decryption operation is a discrete 16 byte chunk so + # it is safe to reuse the decryptor for the entire operation + b = decryptor.update(atr) + a = b[:8] + r[i] = b[-8:] + + assert decryptor.finalize() == b"" + return a, r + + +def aes_key_wrap_with_padding(wrapping_key, key_to_wrap, backend): + if len(wrapping_key) not in [16, 24, 32]: + raise ValueError("The wrapping key must be a valid AES key length") + + aiv = b"\xA6\x59\x59\xA6" + struct.pack(">i", len(key_to_wrap)) + # pad the key to wrap if necessary + pad = (8 - (len(key_to_wrap) % 8)) % 8 + key_to_wrap = key_to_wrap + b"\x00" * pad + if len(key_to_wrap) == 8: + # RFC 5649 - 4.1 - exactly 8 octets after padding + encryptor = Cipher(AES(wrapping_key), ECB(), backend).encryptor() + b = encryptor.update(aiv + key_to_wrap) + assert encryptor.finalize() == b"" + return b + else: + r = [key_to_wrap[i:i + 8] for i in range(0, len(key_to_wrap), 8)] + return _wrap_core(wrapping_key, aiv, r, backend) + + +def aes_key_unwrap_with_padding(wrapping_key, wrapped_key, backend): + if len(wrapped_key) < 16: + raise InvalidUnwrap("Must be at least 16 bytes") + + if len(wrapping_key) not in [16, 24, 32]: + raise ValueError("The wrapping key must be a valid AES key length") + + if len(wrapped_key) == 16: + # RFC 5649 - 4.2 - exactly two 64-bit blocks + decryptor = Cipher(AES(wrapping_key), ECB(), backend).decryptor() + b = decryptor.update(wrapped_key) + assert decryptor.finalize() == b"" + a = b[:8] + data = b[8:] + n = 1 + else: + r = [wrapped_key[i:i + 8] for i in range(0, len(wrapped_key), 8)] + encrypted_aiv = r.pop(0) + n = len(r) + a, r = _unwrap_core(wrapping_key, encrypted_aiv, r, backend) + data = b"".join(r) + + # 1) Check that MSB(32,A) = A65959A6. + # 2) Check that 8*(n-1) < LSB(32,A) <= 8*n. If so, let + # MLI = LSB(32,A). + # 3) Let b = (8*n)-MLI, and then check that the rightmost b octets of + # the output data are zero. + (mli,) = struct.unpack(">I", a[4:]) + b = (8 * n) - mli + if ( + not bytes_eq(a[:4], b"\xa6\x59\x59\xa6") or not + 8 * (n - 1) < mli <= 8 * n or ( + b != 0 and not bytes_eq(data[-b:], b"\x00" * b) + ) + ): + raise InvalidUnwrap() + + if b == 0: + return data + else: + return data[:-b] + + +def aes_key_unwrap(wrapping_key, wrapped_key, backend): + if len(wrapped_key) < 24: + raise InvalidUnwrap("Must be at least 24 bytes") + + if len(wrapped_key) % 8 != 0: + raise InvalidUnwrap("The wrapped key must be a multiple of 8 bytes") + + if len(wrapping_key) not in [16, 24, 32]: + raise ValueError("The wrapping key must be a valid AES key length") + + aiv = b"\xa6\xa6\xa6\xa6\xa6\xa6\xa6\xa6" + r = [wrapped_key[i:i + 8] for i in range(0, len(wrapped_key), 8)] + a = r.pop(0) + a, r = _unwrap_core(wrapping_key, a, r, backend) + if not bytes_eq(a, aiv): + raise InvalidUnwrap() + + return b"".join(r) + + +class InvalidUnwrap(Exception): + pass diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/padding.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/padding.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/padding.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/padding.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,200 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +import abc + +import six + +from cryptography import utils +from cryptography.exceptions import AlreadyFinalized +from cryptography.hazmat.bindings._padding import lib + + +@six.add_metaclass(abc.ABCMeta) +class PaddingContext(object): + @abc.abstractmethod + def update(self, data): + """ + Pads the provided bytes and returns any available data as bytes. + """ + + @abc.abstractmethod + def finalize(self): + """ + Finalize the padding, returns bytes. + """ + + +def _byte_padding_check(block_size): + if not (0 <= block_size <= 2040): + raise ValueError("block_size must be in range(0, 2041).") + + if block_size % 8 != 0: + raise ValueError("block_size must be a multiple of 8.") + + +def _byte_padding_update(buffer_, data, block_size): + if buffer_ is None: + raise AlreadyFinalized("Context was already finalized.") + + utils._check_bytes("data", data) + + buffer_ += data + + finished_blocks = len(buffer_) // (block_size // 8) + + result = buffer_[:finished_blocks * (block_size // 8)] + buffer_ = buffer_[finished_blocks * (block_size // 8):] + + return buffer_, result + + +def _byte_padding_pad(buffer_, block_size, paddingfn): + if buffer_ is None: + raise AlreadyFinalized("Context was already finalized.") + + pad_size = block_size // 8 - len(buffer_) + return buffer_ + paddingfn(pad_size) + + +def _byte_unpadding_update(buffer_, data, block_size): + if buffer_ is None: + raise AlreadyFinalized("Context was already finalized.") + + utils._check_bytes("data", data) + + buffer_ += data + + finished_blocks = max(len(buffer_) // (block_size // 8) - 1, 0) + + result = buffer_[:finished_blocks * (block_size // 8)] + buffer_ = buffer_[finished_blocks * (block_size // 8):] + + return buffer_, result + + +def _byte_unpadding_check(buffer_, block_size, checkfn): + if buffer_ is None: + raise AlreadyFinalized("Context was already finalized.") + + if len(buffer_) != block_size // 8: + raise ValueError("Invalid padding bytes.") + + valid = checkfn(buffer_, block_size // 8) + + if not valid: + raise ValueError("Invalid padding bytes.") + + pad_size = six.indexbytes(buffer_, -1) + return buffer_[:-pad_size] + + +class PKCS7(object): + def __init__(self, block_size): + _byte_padding_check(block_size) + self.block_size = block_size + + def padder(self): + return _PKCS7PaddingContext(self.block_size) + + def unpadder(self): + return _PKCS7UnpaddingContext(self.block_size) + + +@utils.register_interface(PaddingContext) +class _PKCS7PaddingContext(object): + def __init__(self, block_size): + self.block_size = block_size + # TODO: more copies than necessary, we should use zero-buffer (#193) + self._buffer = b"" + + def update(self, data): + self._buffer, result = _byte_padding_update( + self._buffer, data, self.block_size) + return result + + def _padding(self, size): + return six.int2byte(size) * size + + def finalize(self): + result = _byte_padding_pad( + self._buffer, self.block_size, self._padding) + self._buffer = None + return result + + +@utils.register_interface(PaddingContext) +class _PKCS7UnpaddingContext(object): + def __init__(self, block_size): + self.block_size = block_size + # TODO: more copies than necessary, we should use zero-buffer (#193) + self._buffer = b"" + + def update(self, data): + self._buffer, result = _byte_unpadding_update( + self._buffer, data, self.block_size) + return result + + def finalize(self): + result = _byte_unpadding_check( + self._buffer, self.block_size, + lib.Cryptography_check_pkcs7_padding) + self._buffer = None + return result + + +class ANSIX923(object): + def __init__(self, block_size): + _byte_padding_check(block_size) + self.block_size = block_size + + def padder(self): + return _ANSIX923PaddingContext(self.block_size) + + def unpadder(self): + return _ANSIX923UnpaddingContext(self.block_size) + + +@utils.register_interface(PaddingContext) +class _ANSIX923PaddingContext(object): + def __init__(self, block_size): + self.block_size = block_size + # TODO: more copies than necessary, we should use zero-buffer (#193) + self._buffer = b"" + + def update(self, data): + self._buffer, result = _byte_padding_update( + self._buffer, data, self.block_size) + return result + + def _padding(self, size): + return six.int2byte(0) * (size - 1) + six.int2byte(size) + + def finalize(self): + result = _byte_padding_pad( + self._buffer, self.block_size, self._padding) + self._buffer = None + return result + + +@utils.register_interface(PaddingContext) +class _ANSIX923UnpaddingContext(object): + def __init__(self, block_size): + self.block_size = block_size + # TODO: more copies than necessary, we should use zero-buffer (#193) + self._buffer = b"" + + def update(self, data): + self._buffer, result = _byte_unpadding_update( + self._buffer, data, self.block_size) + return result + + def finalize(self): + result = _byte_unpadding_check( + self._buffer, self.block_size, + lib.Cryptography_check_ansix923_padding) + self._buffer = None + return result diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/poly1305.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/poly1305.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/poly1305.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/poly1305.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,43 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + + +from cryptography import utils +from cryptography.exceptions import ( + AlreadyFinalized, UnsupportedAlgorithm, _Reasons +) + + +class Poly1305(object): + def __init__(self, key): + from cryptography.hazmat.backends.openssl.backend import backend + if not backend.poly1305_supported(): + raise UnsupportedAlgorithm( + "poly1305 is not supported by this version of OpenSSL.", + _Reasons.UNSUPPORTED_MAC + ) + self._ctx = backend.create_poly1305_ctx(key) + + def update(self, data): + if self._ctx is None: + raise AlreadyFinalized("Context was already finalized.") + utils._check_byteslike("data", data) + self._ctx.update(data) + + def finalize(self): + if self._ctx is None: + raise AlreadyFinalized("Context was already finalized.") + mac = self._ctx.finalize() + self._ctx = None + return mac + + def verify(self, tag): + utils._check_bytes("tag", tag) + if self._ctx is None: + raise AlreadyFinalized("Context was already finalized.") + + ctx, self._ctx = self._ctx, None + ctx.verify(tag) diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/serialization/base.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/serialization/base.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/serialization/base.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/serialization/base.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,82 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +import abc +from enum import Enum + +import six + +from cryptography import utils + + +def load_pem_private_key(data, password, backend): + return backend.load_pem_private_key(data, password) + + +def load_pem_public_key(data, backend): + return backend.load_pem_public_key(data) + + +def load_pem_parameters(data, backend): + return backend.load_pem_parameters(data) + + +def load_der_private_key(data, password, backend): + return backend.load_der_private_key(data, password) + + +def load_der_public_key(data, backend): + return backend.load_der_public_key(data) + + +def load_der_parameters(data, backend): + return backend.load_der_parameters(data) + + +class Encoding(Enum): + PEM = "PEM" + DER = "DER" + OpenSSH = "OpenSSH" + Raw = "Raw" + X962 = "ANSI X9.62" + + +class PrivateFormat(Enum): + PKCS8 = "PKCS8" + TraditionalOpenSSL = "TraditionalOpenSSL" + Raw = "Raw" + + +class PublicFormat(Enum): + SubjectPublicKeyInfo = "X.509 subjectPublicKeyInfo with PKCS#1" + PKCS1 = "Raw PKCS#1" + OpenSSH = "OpenSSH" + Raw = "Raw" + CompressedPoint = "X9.62 Compressed Point" + UncompressedPoint = "X9.62 Uncompressed Point" + + +class ParameterFormat(Enum): + PKCS3 = "PKCS3" + + +@six.add_metaclass(abc.ABCMeta) +class KeySerializationEncryption(object): + pass + + +@utils.register_interface(KeySerializationEncryption) +class BestAvailableEncryption(object): + def __init__(self, password): + if not isinstance(password, bytes) or len(password) == 0: + raise ValueError("Password must be 1 or more bytes.") + + self.password = password + + +@utils.register_interface(KeySerializationEncryption) +class NoEncryption(object): + pass diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/serialization/__init__.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/serialization/__init__.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/serialization/__init__.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/serialization/__init__.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,26 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +from cryptography.hazmat.primitives.serialization.base import ( + BestAvailableEncryption, Encoding, KeySerializationEncryption, + NoEncryption, ParameterFormat, PrivateFormat, PublicFormat, + load_der_parameters, load_der_private_key, load_der_public_key, + load_pem_parameters, load_pem_private_key, load_pem_public_key, +) +from cryptography.hazmat.primitives.serialization.ssh import ( + load_ssh_public_key +) + + +_PEM_DER = (Encoding.PEM, Encoding.DER) + +__all__ = [ + "load_der_parameters", "load_der_private_key", "load_der_public_key", + "load_pem_parameters", "load_pem_private_key", "load_pem_public_key", + "load_ssh_public_key", "Encoding", "PrivateFormat", "PublicFormat", + "ParameterFormat", "KeySerializationEncryption", "BestAvailableEncryption", + "NoEncryption", +] diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/serialization/pkcs12.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/serialization/pkcs12.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/serialization/pkcs12.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/serialization/pkcs12.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,9 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + + +def load_key_and_certificates(data, password, backend): + return backend.load_key_and_certificates_from_pkcs12(data, password) diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/serialization/ssh.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/serialization/ssh.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/serialization/ssh.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/serialization/ssh.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,153 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +import base64 +import struct + +import six + +from cryptography import utils +from cryptography.exceptions import UnsupportedAlgorithm +from cryptography.hazmat.primitives.asymmetric import dsa, ec, ed25519, rsa + + +def load_ssh_public_key(data, backend): + key_parts = data.split(b' ', 2) + + if len(key_parts) < 2: + raise ValueError( + 'Key is not in the proper format or contains extra data.') + + key_type = key_parts[0] + + if key_type == b'ssh-rsa': + loader = _load_ssh_rsa_public_key + elif key_type == b'ssh-dss': + loader = _load_ssh_dss_public_key + elif key_type in [ + b'ecdsa-sha2-nistp256', b'ecdsa-sha2-nistp384', b'ecdsa-sha2-nistp521', + ]: + loader = _load_ssh_ecdsa_public_key + elif key_type == b'ssh-ed25519': + loader = _load_ssh_ed25519_public_key + else: + raise UnsupportedAlgorithm('Key type is not supported.') + + key_body = key_parts[1] + + try: + decoded_data = base64.b64decode(key_body) + except TypeError: + raise ValueError('Key is not in the proper format.') + + inner_key_type, rest = _ssh_read_next_string(decoded_data) + + if inner_key_type != key_type: + raise ValueError( + 'Key header and key body contain different key type values.' + ) + + return loader(key_type, rest, backend) + + +def _load_ssh_rsa_public_key(key_type, decoded_data, backend): + e, rest = _ssh_read_next_mpint(decoded_data) + n, rest = _ssh_read_next_mpint(rest) + + if rest: + raise ValueError('Key body contains extra bytes.') + + return rsa.RSAPublicNumbers(e, n).public_key(backend) + + +def _load_ssh_dss_public_key(key_type, decoded_data, backend): + p, rest = _ssh_read_next_mpint(decoded_data) + q, rest = _ssh_read_next_mpint(rest) + g, rest = _ssh_read_next_mpint(rest) + y, rest = _ssh_read_next_mpint(rest) + + if rest: + raise ValueError('Key body contains extra bytes.') + + parameter_numbers = dsa.DSAParameterNumbers(p, q, g) + public_numbers = dsa.DSAPublicNumbers(y, parameter_numbers) + + return public_numbers.public_key(backend) + + +def _load_ssh_ecdsa_public_key(expected_key_type, decoded_data, backend): + curve_name, rest = _ssh_read_next_string(decoded_data) + data, rest = _ssh_read_next_string(rest) + + if expected_key_type != b"ecdsa-sha2-" + curve_name: + raise ValueError( + 'Key header and key body contain different key type values.' + ) + + if rest: + raise ValueError('Key body contains extra bytes.') + + curve = { + b"nistp256": ec.SECP256R1, + b"nistp384": ec.SECP384R1, + b"nistp521": ec.SECP521R1, + }[curve_name]() + + if six.indexbytes(data, 0) != 4: + raise NotImplementedError( + "Compressed elliptic curve points are not supported" + ) + + return ec.EllipticCurvePublicKey.from_encoded_point(curve, data) + + +def _load_ssh_ed25519_public_key(expected_key_type, decoded_data, backend): + data, rest = _ssh_read_next_string(decoded_data) + + if rest: + raise ValueError('Key body contains extra bytes.') + + return ed25519.Ed25519PublicKey.from_public_bytes(data) + + +def _ssh_read_next_string(data): + """ + Retrieves the next RFC 4251 string value from the data. + + While the RFC calls these strings, in Python they are bytes objects. + """ + if len(data) < 4: + raise ValueError("Key is not in the proper format") + + str_len, = struct.unpack('>I', data[:4]) + if len(data) < str_len + 4: + raise ValueError("Key is not in the proper format") + + return data[4:4 + str_len], data[4 + str_len:] + + +def _ssh_read_next_mpint(data): + """ + Reads the next mpint from the data. + + Currently, all mpints are interpreted as unsigned. + """ + mpint_data, rest = _ssh_read_next_string(data) + + return ( + utils.int_from_bytes(mpint_data, byteorder='big', signed=False), rest + ) + + +def _ssh_write_string(data): + return struct.pack(">I", len(data)) + data + + +def _ssh_write_mpint(value): + data = utils.int_to_bytes(value) + if six.indexbytes(data, 0) & 0x80: + data = b"\x00" + data + return _ssh_write_string(data) diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/twofactor/hotp.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/twofactor/hotp.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/twofactor/hotp.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/twofactor/hotp.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,68 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +import struct + +import six + +from cryptography.exceptions import ( + UnsupportedAlgorithm, _Reasons +) +from cryptography.hazmat.backends.interfaces import HMACBackend +from cryptography.hazmat.primitives import constant_time, hmac +from cryptography.hazmat.primitives.hashes import SHA1, SHA256, SHA512 +from cryptography.hazmat.primitives.twofactor import InvalidToken +from cryptography.hazmat.primitives.twofactor.utils import _generate_uri + + +class HOTP(object): + def __init__(self, key, length, algorithm, backend, + enforce_key_length=True): + if not isinstance(backend, HMACBackend): + raise UnsupportedAlgorithm( + "Backend object does not implement HMACBackend.", + _Reasons.BACKEND_MISSING_INTERFACE + ) + + if len(key) < 16 and enforce_key_length is True: + raise ValueError("Key length has to be at least 128 bits.") + + if not isinstance(length, six.integer_types): + raise TypeError("Length parameter must be an integer type.") + + if length < 6 or length > 8: + raise ValueError("Length of HOTP has to be between 6 to 8.") + + if not isinstance(algorithm, (SHA1, SHA256, SHA512)): + raise TypeError("Algorithm must be SHA1, SHA256 or SHA512.") + + self._key = key + self._length = length + self._algorithm = algorithm + self._backend = backend + + def generate(self, counter): + truncated_value = self._dynamic_truncate(counter) + hotp = truncated_value % (10 ** self._length) + return "{0:0{1}}".format(hotp, self._length).encode() + + def verify(self, hotp, counter): + if not constant_time.bytes_eq(self.generate(counter), hotp): + raise InvalidToken("Supplied HOTP value does not match.") + + def _dynamic_truncate(self, counter): + ctx = hmac.HMAC(self._key, self._algorithm, self._backend) + ctx.update(struct.pack(">Q", counter)) + hmac_value = ctx.finalize() + + offset = six.indexbytes(hmac_value, len(hmac_value) - 1) & 0b1111 + p = hmac_value[offset:offset + 4] + return struct.unpack(">I", p)[0] & 0x7fffffff + + def get_provisioning_uri(self, account_name, counter, issuer): + return _generate_uri(self, "hotp", account_name, issuer, [ + ("counter", int(counter)), + ]) diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/twofactor/__init__.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/twofactor/__init__.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/twofactor/__init__.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/twofactor/__init__.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,9 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + + +class InvalidToken(Exception): + pass diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/twofactor/totp.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/twofactor/totp.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/twofactor/totp.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/twofactor/totp.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,40 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +from cryptography.exceptions import ( + UnsupportedAlgorithm, _Reasons +) +from cryptography.hazmat.backends.interfaces import HMACBackend +from cryptography.hazmat.primitives import constant_time +from cryptography.hazmat.primitives.twofactor import InvalidToken +from cryptography.hazmat.primitives.twofactor.hotp import HOTP +from cryptography.hazmat.primitives.twofactor.utils import _generate_uri + + +class TOTP(object): + def __init__(self, key, length, algorithm, time_step, backend, + enforce_key_length=True): + if not isinstance(backend, HMACBackend): + raise UnsupportedAlgorithm( + "Backend object does not implement HMACBackend.", + _Reasons.BACKEND_MISSING_INTERFACE + ) + + self._time_step = time_step + self._hotp = HOTP(key, length, algorithm, backend, enforce_key_length) + + def generate(self, time): + counter = int(time / self._time_step) + return self._hotp.generate(counter) + + def verify(self, totp, time): + if not constant_time.bytes_eq(self.generate(time), totp): + raise InvalidToken("Supplied TOTP value does not match.") + + def get_provisioning_uri(self, account_name, issuer): + return _generate_uri(self._hotp, "totp", account_name, issuer, [ + ("period", int(self._time_step)), + ]) diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/twofactor/utils.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/twofactor/utils.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/twofactor/utils.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/hazmat/primitives/twofactor/utils.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,30 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +import base64 + +from six.moves.urllib.parse import quote, urlencode + + +def _generate_uri(hotp, type_name, account_name, issuer, extra_parameters): + parameters = [ + ("digits", hotp._length), + ("secret", base64.b32encode(hotp._key)), + ("algorithm", hotp._algorithm.name.upper()), + ] + + if issuer is not None: + parameters.append(("issuer", issuer)) + + parameters.extend(extra_parameters) + + uriparts = { + "type": type_name, + "label": ("%s:%s" % (quote(issuer), quote(account_name)) if issuer + else quote(account_name)), + "parameters": urlencode(parameters), + } + return "otpauth://{type}/{label}?{parameters}".format(**uriparts) diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/__init__.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/__init__.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/__init__.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/__init__.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,16 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +from cryptography.__about__ import ( + __author__, __copyright__, __email__, __license__, __summary__, __title__, + __uri__, __version__ +) + + +__all__ = [ + "__title__", "__summary__", "__uri__", "__version__", "__author__", + "__email__", "__license__", "__copyright__", +] diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/utils.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/utils.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/utils.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/utils.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,173 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +import abc +import binascii +import inspect +import sys +import warnings + + +# We use a UserWarning subclass, instead of DeprecationWarning, because CPython +# decided deprecation warnings should be invisble by default. +class CryptographyDeprecationWarning(UserWarning): + pass + + +# Several APIs were deprecated with no specific end-of-life date because of the +# ubiquity of their use. They should not be removed until we agree on when that +# cycle ends. +PersistentlyDeprecated2017 = CryptographyDeprecationWarning +PersistentlyDeprecated2018 = CryptographyDeprecationWarning +DeprecatedIn25 = CryptographyDeprecationWarning +DeprecatedIn27 = CryptographyDeprecationWarning + + +def _check_bytes(name, value): + if not isinstance(value, bytes): + raise TypeError("{} must be bytes".format(name)) + + +def _check_byteslike(name, value): + try: + memoryview(value) + except TypeError: + raise TypeError("{} must be bytes-like".format(name)) + + +def read_only_property(name): + return property(lambda self: getattr(self, name)) + + +def register_interface(iface): + def register_decorator(klass): + verify_interface(iface, klass) + iface.register(klass) + return klass + return register_decorator + + +def register_interface_if(predicate, iface): + def register_decorator(klass): + if predicate: + verify_interface(iface, klass) + iface.register(klass) + return klass + return register_decorator + + +if hasattr(int, "from_bytes"): + int_from_bytes = int.from_bytes +else: + def int_from_bytes(data, byteorder, signed=False): + assert byteorder == 'big' + assert not signed + + return int(binascii.hexlify(data), 16) + + +if hasattr(int, "to_bytes"): + def int_to_bytes(integer, length=None): + return integer.to_bytes( + length or (integer.bit_length() + 7) // 8 or 1, 'big' + ) +else: + def int_to_bytes(integer, length=None): + hex_string = '%x' % integer + if length is None: + n = len(hex_string) + else: + n = length * 2 + return binascii.unhexlify(hex_string.zfill(n + (n & 1))) + + +class InterfaceNotImplemented(Exception): + pass + + +if hasattr(inspect, "signature"): + signature = inspect.signature +else: + signature = inspect.getargspec + + +def verify_interface(iface, klass): + for method in iface.__abstractmethods__: + if not hasattr(klass, method): + raise InterfaceNotImplemented( + "{} is missing a {!r} method".format(klass, method) + ) + if isinstance(getattr(iface, method), abc.abstractproperty): + # Can't properly verify these yet. + continue + sig = signature(getattr(iface, method)) + actual = signature(getattr(klass, method)) + if sig != actual: + raise InterfaceNotImplemented( + "{}.{}'s signature differs from the expected. Expected: " + "{!r}. Received: {!r}".format( + klass, method, sig, actual + ) + ) + + +# No longer needed as of 2.2, but retained because we have external consumers +# who use it. +def bit_length(x): + return x.bit_length() + + +class _DeprecatedValue(object): + def __init__(self, value, message, warning_class): + self.value = value + self.message = message + self.warning_class = warning_class + + +class _ModuleWithDeprecations(object): + def __init__(self, module): + self.__dict__["_module"] = module + + def __getattr__(self, attr): + obj = getattr(self._module, attr) + if isinstance(obj, _DeprecatedValue): + warnings.warn(obj.message, obj.warning_class, stacklevel=2) + obj = obj.value + return obj + + def __setattr__(self, attr, value): + setattr(self._module, attr, value) + + def __delattr__(self, attr): + obj = getattr(self._module, attr) + if isinstance(obj, _DeprecatedValue): + warnings.warn(obj.message, obj.warning_class, stacklevel=2) + + delattr(self._module, attr) + + def __dir__(self): + return ["_module"] + dir(self._module) + + +def deprecated(value, module_name, message, warning_class): + module = sys.modules[module_name] + if not isinstance(module, _ModuleWithDeprecations): + sys.modules[module_name] = _ModuleWithDeprecations(module) + return _DeprecatedValue(value, message, warning_class) + + +def cached_property(func): + cached_name = "_cached_{}".format(func) + sentinel = object() + + def inner(instance): + cache = getattr(instance, cached_name, sentinel) + if cache is not sentinel: + return cache + result = func(instance) + setattr(instance, cached_name, result) + return result + return property(inner) diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/x509/base.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/x509/base.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/x509/base.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/x509/base.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,753 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +import abc +import datetime +import os +from enum import Enum + +import six + +from cryptography import utils +from cryptography.hazmat.primitives.asymmetric import dsa, ec, rsa +from cryptography.x509.extensions import Extension, ExtensionType +from cryptography.x509.name import Name + + +_EARLIEST_UTC_TIME = datetime.datetime(1950, 1, 1) + + +def _reject_duplicate_extension(extension, extensions): + # This is quadratic in the number of extensions + for e in extensions: + if e.oid == extension.oid: + raise ValueError('This extension has already been set.') + + +def _convert_to_naive_utc_time(time): + """Normalizes a datetime to a naive datetime in UTC. + + time -- datetime to normalize. Assumed to be in UTC if not timezone + aware. + """ + if time.tzinfo is not None: + offset = time.utcoffset() + offset = offset if offset else datetime.timedelta() + return time.replace(tzinfo=None) - offset + else: + return time + + +class Version(Enum): + v1 = 0 + v3 = 2 + + +def load_pem_x509_certificate(data, backend): + return backend.load_pem_x509_certificate(data) + + +def load_der_x509_certificate(data, backend): + return backend.load_der_x509_certificate(data) + + +def load_pem_x509_csr(data, backend): + return backend.load_pem_x509_csr(data) + + +def load_der_x509_csr(data, backend): + return backend.load_der_x509_csr(data) + + +def load_pem_x509_crl(data, backend): + return backend.load_pem_x509_crl(data) + + +def load_der_x509_crl(data, backend): + return backend.load_der_x509_crl(data) + + +class InvalidVersion(Exception): + def __init__(self, msg, parsed_version): + super(InvalidVersion, self).__init__(msg) + self.parsed_version = parsed_version + + +@six.add_metaclass(abc.ABCMeta) +class Certificate(object): + @abc.abstractmethod + def fingerprint(self, algorithm): + """ + Returns bytes using digest passed. + """ + + @abc.abstractproperty + def serial_number(self): + """ + Returns certificate serial number + """ + + @abc.abstractproperty + def version(self): + """ + Returns the certificate version + """ + + @abc.abstractmethod + def public_key(self): + """ + Returns the public key + """ + + @abc.abstractproperty + def not_valid_before(self): + """ + Not before time (represented as UTC datetime) + """ + + @abc.abstractproperty + def not_valid_after(self): + """ + Not after time (represented as UTC datetime) + """ + + @abc.abstractproperty + def issuer(self): + """ + Returns the issuer name object. + """ + + @abc.abstractproperty + def subject(self): + """ + Returns the subject name object. + """ + + @abc.abstractproperty + def signature_hash_algorithm(self): + """ + Returns a HashAlgorithm corresponding to the type of the digest signed + in the certificate. + """ + + @abc.abstractproperty + def signature_algorithm_oid(self): + """ + Returns the ObjectIdentifier of the signature algorithm. + """ + + @abc.abstractproperty + def extensions(self): + """ + Returns an Extensions object. + """ + + @abc.abstractproperty + def signature(self): + """ + Returns the signature bytes. + """ + + @abc.abstractproperty + def tbs_certificate_bytes(self): + """ + Returns the tbsCertificate payload bytes as defined in RFC 5280. + """ + + @abc.abstractmethod + def __eq__(self, other): + """ + Checks equality. + """ + + @abc.abstractmethod + def __ne__(self, other): + """ + Checks not equal. + """ + + @abc.abstractmethod + def __hash__(self): + """ + Computes a hash. + """ + + @abc.abstractmethod + def public_bytes(self, encoding): + """ + Serializes the certificate to PEM or DER format. + """ + + +@six.add_metaclass(abc.ABCMeta) +class CertificateRevocationList(object): + @abc.abstractmethod + def public_bytes(self, encoding): + """ + Serializes the CRL to PEM or DER format. + """ + + @abc.abstractmethod + def fingerprint(self, algorithm): + """ + Returns bytes using digest passed. + """ + + @abc.abstractmethod + def get_revoked_certificate_by_serial_number(self, serial_number): + """ + Returns an instance of RevokedCertificate or None if the serial_number + is not in the CRL. + """ + + @abc.abstractproperty + def signature_hash_algorithm(self): + """ + Returns a HashAlgorithm corresponding to the type of the digest signed + in the certificate. + """ + + @abc.abstractproperty + def signature_algorithm_oid(self): + """ + Returns the ObjectIdentifier of the signature algorithm. + """ + + @abc.abstractproperty + def issuer(self): + """ + Returns the X509Name with the issuer of this CRL. + """ + + @abc.abstractproperty + def next_update(self): + """ + Returns the date of next update for this CRL. + """ + + @abc.abstractproperty + def last_update(self): + """ + Returns the date of last update for this CRL. + """ + + @abc.abstractproperty + def extensions(self): + """ + Returns an Extensions object containing a list of CRL extensions. + """ + + @abc.abstractproperty + def signature(self): + """ + Returns the signature bytes. + """ + + @abc.abstractproperty + def tbs_certlist_bytes(self): + """ + Returns the tbsCertList payload bytes as defined in RFC 5280. + """ + + @abc.abstractmethod + def __eq__(self, other): + """ + Checks equality. + """ + + @abc.abstractmethod + def __ne__(self, other): + """ + Checks not equal. + """ + + @abc.abstractmethod + def __len__(self): + """ + Number of revoked certificates in the CRL. + """ + + @abc.abstractmethod + def __getitem__(self, idx): + """ + Returns a revoked certificate (or slice of revoked certificates). + """ + + @abc.abstractmethod + def __iter__(self): + """ + Iterator over the revoked certificates + """ + + @abc.abstractmethod + def is_signature_valid(self, public_key): + """ + Verifies signature of revocation list against given public key. + """ + + +@six.add_metaclass(abc.ABCMeta) +class CertificateSigningRequest(object): + @abc.abstractmethod + def __eq__(self, other): + """ + Checks equality. + """ + + @abc.abstractmethod + def __ne__(self, other): + """ + Checks not equal. + """ + + @abc.abstractmethod + def __hash__(self): + """ + Computes a hash. + """ + + @abc.abstractmethod + def public_key(self): + """ + Returns the public key + """ + + @abc.abstractproperty + def subject(self): + """ + Returns the subject name object. + """ + + @abc.abstractproperty + def signature_hash_algorithm(self): + """ + Returns a HashAlgorithm corresponding to the type of the digest signed + in the certificate. + """ + + @abc.abstractproperty + def signature_algorithm_oid(self): + """ + Returns the ObjectIdentifier of the signature algorithm. + """ + + @abc.abstractproperty + def extensions(self): + """ + Returns the extensions in the signing request. + """ + + @abc.abstractmethod + def public_bytes(self, encoding): + """ + Encodes the request to PEM or DER format. + """ + + @abc.abstractproperty + def signature(self): + """ + Returns the signature bytes. + """ + + @abc.abstractproperty + def tbs_certrequest_bytes(self): + """ + Returns the PKCS#10 CertificationRequestInfo bytes as defined in RFC + 2986. + """ + + @abc.abstractproperty + def is_signature_valid(self): + """ + Verifies signature of signing request. + """ + + +@six.add_metaclass(abc.ABCMeta) +class RevokedCertificate(object): + @abc.abstractproperty + def serial_number(self): + """ + Returns the serial number of the revoked certificate. + """ + + @abc.abstractproperty + def revocation_date(self): + """ + Returns the date of when this certificate was revoked. + """ + + @abc.abstractproperty + def extensions(self): + """ + Returns an Extensions object containing a list of Revoked extensions. + """ + + +class CertificateSigningRequestBuilder(object): + def __init__(self, subject_name=None, extensions=[]): + """ + Creates an empty X.509 certificate request (v1). + """ + self._subject_name = subject_name + self._extensions = extensions + + def subject_name(self, name): + """ + Sets the certificate requestor's distinguished name. + """ + if not isinstance(name, Name): + raise TypeError('Expecting x509.Name object.') + if self._subject_name is not None: + raise ValueError('The subject name may only be set once.') + return CertificateSigningRequestBuilder(name, self._extensions) + + def add_extension(self, extension, critical): + """ + Adds an X.509 extension to the certificate request. + """ + if not isinstance(extension, ExtensionType): + raise TypeError("extension must be an ExtensionType") + + extension = Extension(extension.oid, critical, extension) + _reject_duplicate_extension(extension, self._extensions) + + return CertificateSigningRequestBuilder( + self._subject_name, self._extensions + [extension] + ) + + def sign(self, private_key, algorithm, backend): + """ + Signs the request using the requestor's private key. + """ + if self._subject_name is None: + raise ValueError("A CertificateSigningRequest must have a subject") + return backend.create_x509_csr(self, private_key, algorithm) + + +class CertificateBuilder(object): + def __init__(self, issuer_name=None, subject_name=None, + public_key=None, serial_number=None, not_valid_before=None, + not_valid_after=None, extensions=[]): + self._version = Version.v3 + self._issuer_name = issuer_name + self._subject_name = subject_name + self._public_key = public_key + self._serial_number = serial_number + self._not_valid_before = not_valid_before + self._not_valid_after = not_valid_after + self._extensions = extensions + + def issuer_name(self, name): + """ + Sets the CA's distinguished name. + """ + if not isinstance(name, Name): + raise TypeError('Expecting x509.Name object.') + if self._issuer_name is not None: + raise ValueError('The issuer name may only be set once.') + return CertificateBuilder( + name, self._subject_name, self._public_key, + self._serial_number, self._not_valid_before, + self._not_valid_after, self._extensions + ) + + def subject_name(self, name): + """ + Sets the requestor's distinguished name. + """ + if not isinstance(name, Name): + raise TypeError('Expecting x509.Name object.') + if self._subject_name is not None: + raise ValueError('The subject name may only be set once.') + return CertificateBuilder( + self._issuer_name, name, self._public_key, + self._serial_number, self._not_valid_before, + self._not_valid_after, self._extensions + ) + + def public_key(self, key): + """ + Sets the requestor's public key (as found in the signing request). + """ + if not isinstance(key, (dsa.DSAPublicKey, rsa.RSAPublicKey, + ec.EllipticCurvePublicKey)): + raise TypeError('Expecting one of DSAPublicKey, RSAPublicKey,' + ' or EllipticCurvePublicKey.') + if self._public_key is not None: + raise ValueError('The public key may only be set once.') + return CertificateBuilder( + self._issuer_name, self._subject_name, key, + self._serial_number, self._not_valid_before, + self._not_valid_after, self._extensions + ) + + def serial_number(self, number): + """ + Sets the certificate serial number. + """ + if not isinstance(number, six.integer_types): + raise TypeError('Serial number must be of integral type.') + if self._serial_number is not None: + raise ValueError('The serial number may only be set once.') + if number <= 0: + raise ValueError('The serial number should be positive.') + + # ASN.1 integers are always signed, so most significant bit must be + # zero. + if number.bit_length() >= 160: # As defined in RFC 5280 + raise ValueError('The serial number should not be more than 159 ' + 'bits.') + return CertificateBuilder( + self._issuer_name, self._subject_name, + self._public_key, number, self._not_valid_before, + self._not_valid_after, self._extensions + ) + + def not_valid_before(self, time): + """ + Sets the certificate activation time. + """ + if not isinstance(time, datetime.datetime): + raise TypeError('Expecting datetime object.') + if self._not_valid_before is not None: + raise ValueError('The not valid before may only be set once.') + time = _convert_to_naive_utc_time(time) + if time < _EARLIEST_UTC_TIME: + raise ValueError('The not valid before date must be on or after' + ' 1950 January 1).') + if self._not_valid_after is not None and time > self._not_valid_after: + raise ValueError( + 'The not valid before date must be before the not valid after ' + 'date.' + ) + return CertificateBuilder( + self._issuer_name, self._subject_name, + self._public_key, self._serial_number, time, + self._not_valid_after, self._extensions + ) + + def not_valid_after(self, time): + """ + Sets the certificate expiration time. + """ + if not isinstance(time, datetime.datetime): + raise TypeError('Expecting datetime object.') + if self._not_valid_after is not None: + raise ValueError('The not valid after may only be set once.') + time = _convert_to_naive_utc_time(time) + if time < _EARLIEST_UTC_TIME: + raise ValueError('The not valid after date must be on or after' + ' 1950 January 1.') + if (self._not_valid_before is not None and + time < self._not_valid_before): + raise ValueError( + 'The not valid after date must be after the not valid before ' + 'date.' + ) + return CertificateBuilder( + self._issuer_name, self._subject_name, + self._public_key, self._serial_number, self._not_valid_before, + time, self._extensions + ) + + def add_extension(self, extension, critical): + """ + Adds an X.509 extension to the certificate. + """ + if not isinstance(extension, ExtensionType): + raise TypeError("extension must be an ExtensionType") + + extension = Extension(extension.oid, critical, extension) + _reject_duplicate_extension(extension, self._extensions) + + return CertificateBuilder( + self._issuer_name, self._subject_name, + self._public_key, self._serial_number, self._not_valid_before, + self._not_valid_after, self._extensions + [extension] + ) + + def sign(self, private_key, algorithm, backend): + """ + Signs the certificate using the CA's private key. + """ + if self._subject_name is None: + raise ValueError("A certificate must have a subject name") + + if self._issuer_name is None: + raise ValueError("A certificate must have an issuer name") + + if self._serial_number is None: + raise ValueError("A certificate must have a serial number") + + if self._not_valid_before is None: + raise ValueError("A certificate must have a not valid before time") + + if self._not_valid_after is None: + raise ValueError("A certificate must have a not valid after time") + + if self._public_key is None: + raise ValueError("A certificate must have a public key") + + return backend.create_x509_certificate(self, private_key, algorithm) + + +class CertificateRevocationListBuilder(object): + def __init__(self, issuer_name=None, last_update=None, next_update=None, + extensions=[], revoked_certificates=[]): + self._issuer_name = issuer_name + self._last_update = last_update + self._next_update = next_update + self._extensions = extensions + self._revoked_certificates = revoked_certificates + + def issuer_name(self, issuer_name): + if not isinstance(issuer_name, Name): + raise TypeError('Expecting x509.Name object.') + if self._issuer_name is not None: + raise ValueError('The issuer name may only be set once.') + return CertificateRevocationListBuilder( + issuer_name, self._last_update, self._next_update, + self._extensions, self._revoked_certificates + ) + + def last_update(self, last_update): + if not isinstance(last_update, datetime.datetime): + raise TypeError('Expecting datetime object.') + if self._last_update is not None: + raise ValueError('Last update may only be set once.') + last_update = _convert_to_naive_utc_time(last_update) + if last_update < _EARLIEST_UTC_TIME: + raise ValueError('The last update date must be on or after' + ' 1950 January 1.') + if self._next_update is not None and last_update > self._next_update: + raise ValueError( + 'The last update date must be before the next update date.' + ) + return CertificateRevocationListBuilder( + self._issuer_name, last_update, self._next_update, + self._extensions, self._revoked_certificates + ) + + def next_update(self, next_update): + if not isinstance(next_update, datetime.datetime): + raise TypeError('Expecting datetime object.') + if self._next_update is not None: + raise ValueError('Last update may only be set once.') + next_update = _convert_to_naive_utc_time(next_update) + if next_update < _EARLIEST_UTC_TIME: + raise ValueError('The last update date must be on or after' + ' 1950 January 1.') + if self._last_update is not None and next_update < self._last_update: + raise ValueError( + 'The next update date must be after the last update date.' + ) + return CertificateRevocationListBuilder( + self._issuer_name, self._last_update, next_update, + self._extensions, self._revoked_certificates + ) + + def add_extension(self, extension, critical): + """ + Adds an X.509 extension to the certificate revocation list. + """ + if not isinstance(extension, ExtensionType): + raise TypeError("extension must be an ExtensionType") + + extension = Extension(extension.oid, critical, extension) + _reject_duplicate_extension(extension, self._extensions) + return CertificateRevocationListBuilder( + self._issuer_name, self._last_update, self._next_update, + self._extensions + [extension], self._revoked_certificates + ) + + def add_revoked_certificate(self, revoked_certificate): + """ + Adds a revoked certificate to the CRL. + """ + if not isinstance(revoked_certificate, RevokedCertificate): + raise TypeError("Must be an instance of RevokedCertificate") + + return CertificateRevocationListBuilder( + self._issuer_name, self._last_update, + self._next_update, self._extensions, + self._revoked_certificates + [revoked_certificate] + ) + + def sign(self, private_key, algorithm, backend): + if self._issuer_name is None: + raise ValueError("A CRL must have an issuer name") + + if self._last_update is None: + raise ValueError("A CRL must have a last update time") + + if self._next_update is None: + raise ValueError("A CRL must have a next update time") + + return backend.create_x509_crl(self, private_key, algorithm) + + +class RevokedCertificateBuilder(object): + def __init__(self, serial_number=None, revocation_date=None, + extensions=[]): + self._serial_number = serial_number + self._revocation_date = revocation_date + self._extensions = extensions + + def serial_number(self, number): + if not isinstance(number, six.integer_types): + raise TypeError('Serial number must be of integral type.') + if self._serial_number is not None: + raise ValueError('The serial number may only be set once.') + if number <= 0: + raise ValueError('The serial number should be positive') + + # ASN.1 integers are always signed, so most significant bit must be + # zero. + if number.bit_length() >= 160: # As defined in RFC 5280 + raise ValueError('The serial number should not be more than 159 ' + 'bits.') + return RevokedCertificateBuilder( + number, self._revocation_date, self._extensions + ) + + def revocation_date(self, time): + if not isinstance(time, datetime.datetime): + raise TypeError('Expecting datetime object.') + if self._revocation_date is not None: + raise ValueError('The revocation date may only be set once.') + time = _convert_to_naive_utc_time(time) + if time < _EARLIEST_UTC_TIME: + raise ValueError('The revocation date must be on or after' + ' 1950 January 1.') + return RevokedCertificateBuilder( + self._serial_number, time, self._extensions + ) + + def add_extension(self, extension, critical): + if not isinstance(extension, ExtensionType): + raise TypeError("extension must be an ExtensionType") + + extension = Extension(extension.oid, critical, extension) + _reject_duplicate_extension(extension, self._extensions) + return RevokedCertificateBuilder( + self._serial_number, self._revocation_date, + self._extensions + [extension] + ) + + def build(self, backend): + if self._serial_number is None: + raise ValueError("A revoked certificate must have a serial number") + if self._revocation_date is None: + raise ValueError( + "A revoked certificate must have a revocation date" + ) + + return backend.create_x509_revoked_certificate(self) + + +def random_serial_number(): + return utils.int_from_bytes(os.urandom(20), "big") >> 1 diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/x509/certificate_transparency.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/x509/certificate_transparency.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/x509/certificate_transparency.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/x509/certificate_transparency.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,46 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +import abc +from enum import Enum + +import six + + +class LogEntryType(Enum): + X509_CERTIFICATE = 0 + PRE_CERTIFICATE = 1 + + +class Version(Enum): + v1 = 0 + + +@six.add_metaclass(abc.ABCMeta) +class SignedCertificateTimestamp(object): + @abc.abstractproperty + def version(self): + """ + Returns the SCT version. + """ + + @abc.abstractproperty + def log_id(self): + """ + Returns an identifier indicating which log this SCT is for. + """ + + @abc.abstractproperty + def timestamp(self): + """ + Returns the timestamp for this SCT. + """ + + @abc.abstractproperty + def entry_type(self): + """ + Returns whether this is an SCT for a certificate or pre-certificate. + """ diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/x509/extensions.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/x509/extensions.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/x509/extensions.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/x509/extensions.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,1654 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +import abc +import datetime +import hashlib +import ipaddress +import warnings +from enum import Enum + +from asn1crypto.keys import PublicKeyInfo + +import six + +from cryptography import utils +from cryptography.hazmat.primitives import constant_time, serialization +from cryptography.hazmat.primitives.asymmetric.ec import EllipticCurvePublicKey +from cryptography.hazmat.primitives.asymmetric.rsa import RSAPublicKey +from cryptography.x509.certificate_transparency import ( + SignedCertificateTimestamp +) +from cryptography.x509.general_name import GeneralName, IPAddress, OtherName +from cryptography.x509.name import RelativeDistinguishedName +from cryptography.x509.oid import ( + CRLEntryExtensionOID, ExtensionOID, OCSPExtensionOID, ObjectIdentifier, +) + + +def _key_identifier_from_public_key(public_key): + if isinstance(public_key, RSAPublicKey): + data = public_key.public_bytes( + serialization.Encoding.DER, + serialization.PublicFormat.PKCS1, + ) + elif isinstance(public_key, EllipticCurvePublicKey): + data = public_key.public_bytes( + serialization.Encoding.X962, + serialization.PublicFormat.UncompressedPoint + ) + else: + # This is a very slow way to do this. + serialized = public_key.public_bytes( + serialization.Encoding.DER, + serialization.PublicFormat.SubjectPublicKeyInfo + ) + + data = bytes(PublicKeyInfo.load(serialized)['public_key']) + + return hashlib.sha1(data).digest() + + +class DuplicateExtension(Exception): + def __init__(self, msg, oid): + super(DuplicateExtension, self).__init__(msg) + self.oid = oid + + +class ExtensionNotFound(Exception): + def __init__(self, msg, oid): + super(ExtensionNotFound, self).__init__(msg) + self.oid = oid + + +@six.add_metaclass(abc.ABCMeta) +class ExtensionType(object): + @abc.abstractproperty + def oid(self): + """ + Returns the oid associated with the given extension type. + """ + + +class Extensions(object): + def __init__(self, extensions): + self._extensions = extensions + + def get_extension_for_oid(self, oid): + for ext in self: + if ext.oid == oid: + return ext + + raise ExtensionNotFound("No {} extension was found".format(oid), oid) + + def get_extension_for_class(self, extclass): + if extclass is UnrecognizedExtension: + raise TypeError( + "UnrecognizedExtension can't be used with " + "get_extension_for_class because more than one instance of the" + " class may be present." + ) + + for ext in self: + if isinstance(ext.value, extclass): + return ext + + raise ExtensionNotFound( + "No {} extension was found".format(extclass), extclass.oid + ) + + def __iter__(self): + return iter(self._extensions) + + def __len__(self): + return len(self._extensions) + + def __getitem__(self, idx): + return self._extensions[idx] + + def __repr__(self): + return ( + "".format(self._extensions) + ) + + +@utils.register_interface(ExtensionType) +class CRLNumber(object): + oid = ExtensionOID.CRL_NUMBER + + def __init__(self, crl_number): + if not isinstance(crl_number, six.integer_types): + raise TypeError("crl_number must be an integer") + + self._crl_number = crl_number + + def __eq__(self, other): + if not isinstance(other, CRLNumber): + return NotImplemented + + return self.crl_number == other.crl_number + + def __ne__(self, other): + return not self == other + + def __hash__(self): + return hash(self.crl_number) + + def __repr__(self): + return "".format(self.crl_number) + + crl_number = utils.read_only_property("_crl_number") + + +@utils.register_interface(ExtensionType) +class AuthorityKeyIdentifier(object): + oid = ExtensionOID.AUTHORITY_KEY_IDENTIFIER + + def __init__(self, key_identifier, authority_cert_issuer, + authority_cert_serial_number): + if (authority_cert_issuer is None) != ( + authority_cert_serial_number is None + ): + raise ValueError( + "authority_cert_issuer and authority_cert_serial_number " + "must both be present or both None" + ) + + if authority_cert_issuer is not None: + authority_cert_issuer = list(authority_cert_issuer) + if not all( + isinstance(x, GeneralName) for x in authority_cert_issuer + ): + raise TypeError( + "authority_cert_issuer must be a list of GeneralName " + "objects" + ) + + if authority_cert_serial_number is not None and not isinstance( + authority_cert_serial_number, six.integer_types + ): + raise TypeError( + "authority_cert_serial_number must be an integer" + ) + + self._key_identifier = key_identifier + self._authority_cert_issuer = authority_cert_issuer + self._authority_cert_serial_number = authority_cert_serial_number + + @classmethod + def from_issuer_public_key(cls, public_key): + digest = _key_identifier_from_public_key(public_key) + return cls( + key_identifier=digest, + authority_cert_issuer=None, + authority_cert_serial_number=None + ) + + @classmethod + def from_issuer_subject_key_identifier(cls, ski): + if isinstance(ski, SubjectKeyIdentifier): + digest = ski.digest + else: + digest = ski.value.digest + warnings.warn( + "Extension objects are deprecated as arguments to " + "from_issuer_subject_key_identifier and support will be " + "removed soon. Please migrate to passing a " + "SubjectKeyIdentifier directly.", + utils.DeprecatedIn27, + stacklevel=2, + ) + + return cls( + key_identifier=digest, + authority_cert_issuer=None, + authority_cert_serial_number=None + ) + + def __repr__(self): + return ( + "".format(self) + ) + + def __eq__(self, other): + if not isinstance(other, AuthorityKeyIdentifier): + return NotImplemented + + return ( + self.key_identifier == other.key_identifier and + self.authority_cert_issuer == other.authority_cert_issuer and + self.authority_cert_serial_number == + other.authority_cert_serial_number + ) + + def __ne__(self, other): + return not self == other + + def __hash__(self): + if self.authority_cert_issuer is None: + aci = None + else: + aci = tuple(self.authority_cert_issuer) + return hash(( + self.key_identifier, aci, self.authority_cert_serial_number + )) + + key_identifier = utils.read_only_property("_key_identifier") + authority_cert_issuer = utils.read_only_property("_authority_cert_issuer") + authority_cert_serial_number = utils.read_only_property( + "_authority_cert_serial_number" + ) + + +@utils.register_interface(ExtensionType) +class SubjectKeyIdentifier(object): + oid = ExtensionOID.SUBJECT_KEY_IDENTIFIER + + def __init__(self, digest): + self._digest = digest + + @classmethod + def from_public_key(cls, public_key): + return cls(_key_identifier_from_public_key(public_key)) + + digest = utils.read_only_property("_digest") + + def __repr__(self): + return "".format(self.digest) + + def __eq__(self, other): + if not isinstance(other, SubjectKeyIdentifier): + return NotImplemented + + return constant_time.bytes_eq(self.digest, other.digest) + + def __ne__(self, other): + return not self == other + + def __hash__(self): + return hash(self.digest) + + +@utils.register_interface(ExtensionType) +class AuthorityInformationAccess(object): + oid = ExtensionOID.AUTHORITY_INFORMATION_ACCESS + + def __init__(self, descriptions): + descriptions = list(descriptions) + if not all(isinstance(x, AccessDescription) for x in descriptions): + raise TypeError( + "Every item in the descriptions list must be an " + "AccessDescription" + ) + + self._descriptions = descriptions + + def __iter__(self): + return iter(self._descriptions) + + def __len__(self): + return len(self._descriptions) + + def __repr__(self): + return "".format(self._descriptions) + + def __eq__(self, other): + if not isinstance(other, AuthorityInformationAccess): + return NotImplemented + + return self._descriptions == other._descriptions + + def __ne__(self, other): + return not self == other + + def __getitem__(self, idx): + return self._descriptions[idx] + + def __hash__(self): + return hash(tuple(self._descriptions)) + + +class AccessDescription(object): + def __init__(self, access_method, access_location): + if not isinstance(access_method, ObjectIdentifier): + raise TypeError("access_method must be an ObjectIdentifier") + + if not isinstance(access_location, GeneralName): + raise TypeError("access_location must be a GeneralName") + + self._access_method = access_method + self._access_location = access_location + + def __repr__(self): + return ( + "".format(self) + ) + + def __eq__(self, other): + if not isinstance(other, AccessDescription): + return NotImplemented + + return ( + self.access_method == other.access_method and + self.access_location == other.access_location + ) + + def __ne__(self, other): + return not self == other + + def __hash__(self): + return hash((self.access_method, self.access_location)) + + access_method = utils.read_only_property("_access_method") + access_location = utils.read_only_property("_access_location") + + +@utils.register_interface(ExtensionType) +class BasicConstraints(object): + oid = ExtensionOID.BASIC_CONSTRAINTS + + def __init__(self, ca, path_length): + if not isinstance(ca, bool): + raise TypeError("ca must be a boolean value") + + if path_length is not None and not ca: + raise ValueError("path_length must be None when ca is False") + + if ( + path_length is not None and + (not isinstance(path_length, six.integer_types) or path_length < 0) + ): + raise TypeError( + "path_length must be a non-negative integer or None" + ) + + self._ca = ca + self._path_length = path_length + + ca = utils.read_only_property("_ca") + path_length = utils.read_only_property("_path_length") + + def __repr__(self): + return ("").format(self) + + def __eq__(self, other): + if not isinstance(other, BasicConstraints): + return NotImplemented + + return self.ca == other.ca and self.path_length == other.path_length + + def __ne__(self, other): + return not self == other + + def __hash__(self): + return hash((self.ca, self.path_length)) + + +@utils.register_interface(ExtensionType) +class DeltaCRLIndicator(object): + oid = ExtensionOID.DELTA_CRL_INDICATOR + + def __init__(self, crl_number): + if not isinstance(crl_number, six.integer_types): + raise TypeError("crl_number must be an integer") + + self._crl_number = crl_number + + crl_number = utils.read_only_property("_crl_number") + + def __eq__(self, other): + if not isinstance(other, DeltaCRLIndicator): + return NotImplemented + + return self.crl_number == other.crl_number + + def __ne__(self, other): + return not self == other + + def __hash__(self): + return hash(self.crl_number) + + def __repr__(self): + return "".format(self) + + +@utils.register_interface(ExtensionType) +class CRLDistributionPoints(object): + oid = ExtensionOID.CRL_DISTRIBUTION_POINTS + + def __init__(self, distribution_points): + distribution_points = list(distribution_points) + if not all( + isinstance(x, DistributionPoint) for x in distribution_points + ): + raise TypeError( + "distribution_points must be a list of DistributionPoint " + "objects" + ) + + self._distribution_points = distribution_points + + def __iter__(self): + return iter(self._distribution_points) + + def __len__(self): + return len(self._distribution_points) + + def __repr__(self): + return "".format(self._distribution_points) + + def __eq__(self, other): + if not isinstance(other, CRLDistributionPoints): + return NotImplemented + + return self._distribution_points == other._distribution_points + + def __ne__(self, other): + return not self == other + + def __getitem__(self, idx): + return self._distribution_points[idx] + + def __hash__(self): + return hash(tuple(self._distribution_points)) + + +@utils.register_interface(ExtensionType) +class FreshestCRL(object): + oid = ExtensionOID.FRESHEST_CRL + + def __init__(self, distribution_points): + distribution_points = list(distribution_points) + if not all( + isinstance(x, DistributionPoint) for x in distribution_points + ): + raise TypeError( + "distribution_points must be a list of DistributionPoint " + "objects" + ) + + self._distribution_points = distribution_points + + def __iter__(self): + return iter(self._distribution_points) + + def __len__(self): + return len(self._distribution_points) + + def __repr__(self): + return "".format(self._distribution_points) + + def __eq__(self, other): + if not isinstance(other, FreshestCRL): + return NotImplemented + + return self._distribution_points == other._distribution_points + + def __ne__(self, other): + return not self == other + + def __getitem__(self, idx): + return self._distribution_points[idx] + + def __hash__(self): + return hash(tuple(self._distribution_points)) + + +class DistributionPoint(object): + def __init__(self, full_name, relative_name, reasons, crl_issuer): + if full_name and relative_name: + raise ValueError( + "You cannot provide both full_name and relative_name, at " + "least one must be None." + ) + + if full_name: + full_name = list(full_name) + if not all(isinstance(x, GeneralName) for x in full_name): + raise TypeError( + "full_name must be a list of GeneralName objects" + ) + + if relative_name: + if not isinstance(relative_name, RelativeDistinguishedName): + raise TypeError( + "relative_name must be a RelativeDistinguishedName" + ) + + if crl_issuer: + crl_issuer = list(crl_issuer) + if not all(isinstance(x, GeneralName) for x in crl_issuer): + raise TypeError( + "crl_issuer must be None or a list of general names" + ) + + if reasons and (not isinstance(reasons, frozenset) or not all( + isinstance(x, ReasonFlags) for x in reasons + )): + raise TypeError("reasons must be None or frozenset of ReasonFlags") + + if reasons and ( + ReasonFlags.unspecified in reasons or + ReasonFlags.remove_from_crl in reasons + ): + raise ValueError( + "unspecified and remove_from_crl are not valid reasons in a " + "DistributionPoint" + ) + + if reasons and not crl_issuer and not (full_name or relative_name): + raise ValueError( + "You must supply crl_issuer, full_name, or relative_name when " + "reasons is not None" + ) + + self._full_name = full_name + self._relative_name = relative_name + self._reasons = reasons + self._crl_issuer = crl_issuer + + def __repr__(self): + return ( + "" + .format(self) + ) + + def __eq__(self, other): + if not isinstance(other, DistributionPoint): + return NotImplemented + + return ( + self.full_name == other.full_name and + self.relative_name == other.relative_name and + self.reasons == other.reasons and + self.crl_issuer == other.crl_issuer + ) + + def __ne__(self, other): + return not self == other + + def __hash__(self): + if self.full_name is not None: + fn = tuple(self.full_name) + else: + fn = None + + if self.crl_issuer is not None: + crl_issuer = tuple(self.crl_issuer) + else: + crl_issuer = None + + return hash((fn, self.relative_name, self.reasons, crl_issuer)) + + full_name = utils.read_only_property("_full_name") + relative_name = utils.read_only_property("_relative_name") + reasons = utils.read_only_property("_reasons") + crl_issuer = utils.read_only_property("_crl_issuer") + + +class ReasonFlags(Enum): + unspecified = "unspecified" + key_compromise = "keyCompromise" + ca_compromise = "cACompromise" + affiliation_changed = "affiliationChanged" + superseded = "superseded" + cessation_of_operation = "cessationOfOperation" + certificate_hold = "certificateHold" + privilege_withdrawn = "privilegeWithdrawn" + aa_compromise = "aACompromise" + remove_from_crl = "removeFromCRL" + + +@utils.register_interface(ExtensionType) +class PolicyConstraints(object): + oid = ExtensionOID.POLICY_CONSTRAINTS + + def __init__(self, require_explicit_policy, inhibit_policy_mapping): + if require_explicit_policy is not None and not isinstance( + require_explicit_policy, six.integer_types + ): + raise TypeError( + "require_explicit_policy must be a non-negative integer or " + "None" + ) + + if inhibit_policy_mapping is not None and not isinstance( + inhibit_policy_mapping, six.integer_types + ): + raise TypeError( + "inhibit_policy_mapping must be a non-negative integer or None" + ) + + if inhibit_policy_mapping is None and require_explicit_policy is None: + raise ValueError( + "At least one of require_explicit_policy and " + "inhibit_policy_mapping must not be None" + ) + + self._require_explicit_policy = require_explicit_policy + self._inhibit_policy_mapping = inhibit_policy_mapping + + def __repr__(self): + return ( + u"".format(self) + ) + + def __eq__(self, other): + if not isinstance(other, PolicyConstraints): + return NotImplemented + + return ( + self.require_explicit_policy == other.require_explicit_policy and + self.inhibit_policy_mapping == other.inhibit_policy_mapping + ) + + def __ne__(self, other): + return not self == other + + def __hash__(self): + return hash( + (self.require_explicit_policy, self.inhibit_policy_mapping) + ) + + require_explicit_policy = utils.read_only_property( + "_require_explicit_policy" + ) + inhibit_policy_mapping = utils.read_only_property( + "_inhibit_policy_mapping" + ) + + +@utils.register_interface(ExtensionType) +class CertificatePolicies(object): + oid = ExtensionOID.CERTIFICATE_POLICIES + + def __init__(self, policies): + policies = list(policies) + if not all(isinstance(x, PolicyInformation) for x in policies): + raise TypeError( + "Every item in the policies list must be a " + "PolicyInformation" + ) + + self._policies = policies + + def __iter__(self): + return iter(self._policies) + + def __len__(self): + return len(self._policies) + + def __repr__(self): + return "".format(self._policies) + + def __eq__(self, other): + if not isinstance(other, CertificatePolicies): + return NotImplemented + + return self._policies == other._policies + + def __ne__(self, other): + return not self == other + + def __getitem__(self, idx): + return self._policies[idx] + + def __hash__(self): + return hash(tuple(self._policies)) + + +class PolicyInformation(object): + def __init__(self, policy_identifier, policy_qualifiers): + if not isinstance(policy_identifier, ObjectIdentifier): + raise TypeError("policy_identifier must be an ObjectIdentifier") + + self._policy_identifier = policy_identifier + + if policy_qualifiers: + policy_qualifiers = list(policy_qualifiers) + if not all( + isinstance(x, (six.text_type, UserNotice)) + for x in policy_qualifiers + ): + raise TypeError( + "policy_qualifiers must be a list of strings and/or " + "UserNotice objects or None" + ) + + self._policy_qualifiers = policy_qualifiers + + def __repr__(self): + return ( + "".format(self) + ) + + def __eq__(self, other): + if not isinstance(other, PolicyInformation): + return NotImplemented + + return ( + self.policy_identifier == other.policy_identifier and + self.policy_qualifiers == other.policy_qualifiers + ) + + def __ne__(self, other): + return not self == other + + def __hash__(self): + if self.policy_qualifiers is not None: + pq = tuple(self.policy_qualifiers) + else: + pq = None + + return hash((self.policy_identifier, pq)) + + policy_identifier = utils.read_only_property("_policy_identifier") + policy_qualifiers = utils.read_only_property("_policy_qualifiers") + + +class UserNotice(object): + def __init__(self, notice_reference, explicit_text): + if notice_reference and not isinstance( + notice_reference, NoticeReference + ): + raise TypeError( + "notice_reference must be None or a NoticeReference" + ) + + self._notice_reference = notice_reference + self._explicit_text = explicit_text + + def __repr__(self): + return ( + "".format(self) + ) + + def __eq__(self, other): + if not isinstance(other, UserNotice): + return NotImplemented + + return ( + self.notice_reference == other.notice_reference and + self.explicit_text == other.explicit_text + ) + + def __ne__(self, other): + return not self == other + + def __hash__(self): + return hash((self.notice_reference, self.explicit_text)) + + notice_reference = utils.read_only_property("_notice_reference") + explicit_text = utils.read_only_property("_explicit_text") + + +class NoticeReference(object): + def __init__(self, organization, notice_numbers): + self._organization = organization + notice_numbers = list(notice_numbers) + if not all(isinstance(x, int) for x in notice_numbers): + raise TypeError( + "notice_numbers must be a list of integers" + ) + + self._notice_numbers = notice_numbers + + def __repr__(self): + return ( + "".format(self) + ) + + def __eq__(self, other): + if not isinstance(other, NoticeReference): + return NotImplemented + + return ( + self.organization == other.organization and + self.notice_numbers == other.notice_numbers + ) + + def __ne__(self, other): + return not self == other + + def __hash__(self): + return hash((self.organization, tuple(self.notice_numbers))) + + organization = utils.read_only_property("_organization") + notice_numbers = utils.read_only_property("_notice_numbers") + + +@utils.register_interface(ExtensionType) +class ExtendedKeyUsage(object): + oid = ExtensionOID.EXTENDED_KEY_USAGE + + def __init__(self, usages): + usages = list(usages) + if not all(isinstance(x, ObjectIdentifier) for x in usages): + raise TypeError( + "Every item in the usages list must be an ObjectIdentifier" + ) + + self._usages = usages + + def __iter__(self): + return iter(self._usages) + + def __len__(self): + return len(self._usages) + + def __repr__(self): + return "".format(self._usages) + + def __eq__(self, other): + if not isinstance(other, ExtendedKeyUsage): + return NotImplemented + + return self._usages == other._usages + + def __ne__(self, other): + return not self == other + + def __hash__(self): + return hash(tuple(self._usages)) + + +@utils.register_interface(ExtensionType) +class OCSPNoCheck(object): + oid = ExtensionOID.OCSP_NO_CHECK + + def __eq__(self, other): + if not isinstance(other, OCSPNoCheck): + return NotImplemented + + return True + + def __ne__(self, other): + return not self == other + + def __hash__(self): + return hash(OCSPNoCheck) + + def __repr__(self): + return "" + + +@utils.register_interface(ExtensionType) +class PrecertPoison(object): + oid = ExtensionOID.PRECERT_POISON + + def __eq__(self, other): + if not isinstance(other, PrecertPoison): + return NotImplemented + + return True + + def __ne__(self, other): + return not self == other + + def __hash__(self): + return hash(PrecertPoison) + + def __repr__(self): + return "" + + +@utils.register_interface(ExtensionType) +class TLSFeature(object): + oid = ExtensionOID.TLS_FEATURE + + def __init__(self, features): + features = list(features) + if ( + not all(isinstance(x, TLSFeatureType) for x in features) or + len(features) == 0 + ): + raise TypeError( + "features must be a list of elements from the TLSFeatureType " + "enum" + ) + + self._features = features + + def __iter__(self): + return iter(self._features) + + def __len__(self): + return len(self._features) + + def __repr__(self): + return "".format(self) + + def __eq__(self, other): + if not isinstance(other, TLSFeature): + return NotImplemented + + return self._features == other._features + + def __getitem__(self, idx): + return self._features[idx] + + def __ne__(self, other): + return not self == other + + def __hash__(self): + return hash(tuple(self._features)) + + +class TLSFeatureType(Enum): + # status_request is defined in RFC 6066 and is used for what is commonly + # called OCSP Must-Staple when present in the TLS Feature extension in an + # X.509 certificate. + status_request = 5 + # status_request_v2 is defined in RFC 6961 and allows multiple OCSP + # responses to be provided. It is not currently in use by clients or + # servers. + status_request_v2 = 17 + + +_TLS_FEATURE_TYPE_TO_ENUM = dict((x.value, x) for x in TLSFeatureType) + + +@utils.register_interface(ExtensionType) +class InhibitAnyPolicy(object): + oid = ExtensionOID.INHIBIT_ANY_POLICY + + def __init__(self, skip_certs): + if not isinstance(skip_certs, six.integer_types): + raise TypeError("skip_certs must be an integer") + + if skip_certs < 0: + raise ValueError("skip_certs must be a non-negative integer") + + self._skip_certs = skip_certs + + def __repr__(self): + return "".format(self) + + def __eq__(self, other): + if not isinstance(other, InhibitAnyPolicy): + return NotImplemented + + return self.skip_certs == other.skip_certs + + def __ne__(self, other): + return not self == other + + def __hash__(self): + return hash(self.skip_certs) + + skip_certs = utils.read_only_property("_skip_certs") + + +@utils.register_interface(ExtensionType) +class KeyUsage(object): + oid = ExtensionOID.KEY_USAGE + + def __init__(self, digital_signature, content_commitment, key_encipherment, + data_encipherment, key_agreement, key_cert_sign, crl_sign, + encipher_only, decipher_only): + if not key_agreement and (encipher_only or decipher_only): + raise ValueError( + "encipher_only and decipher_only can only be true when " + "key_agreement is true" + ) + + self._digital_signature = digital_signature + self._content_commitment = content_commitment + self._key_encipherment = key_encipherment + self._data_encipherment = data_encipherment + self._key_agreement = key_agreement + self._key_cert_sign = key_cert_sign + self._crl_sign = crl_sign + self._encipher_only = encipher_only + self._decipher_only = decipher_only + + digital_signature = utils.read_only_property("_digital_signature") + content_commitment = utils.read_only_property("_content_commitment") + key_encipherment = utils.read_only_property("_key_encipherment") + data_encipherment = utils.read_only_property("_data_encipherment") + key_agreement = utils.read_only_property("_key_agreement") + key_cert_sign = utils.read_only_property("_key_cert_sign") + crl_sign = utils.read_only_property("_crl_sign") + + @property + def encipher_only(self): + if not self.key_agreement: + raise ValueError( + "encipher_only is undefined unless key_agreement is true" + ) + else: + return self._encipher_only + + @property + def decipher_only(self): + if not self.key_agreement: + raise ValueError( + "decipher_only is undefined unless key_agreement is true" + ) + else: + return self._decipher_only + + def __repr__(self): + try: + encipher_only = self.encipher_only + decipher_only = self.decipher_only + except ValueError: + encipher_only = None + decipher_only = None + + return ("").format( + self, encipher_only, decipher_only) + + def __eq__(self, other): + if not isinstance(other, KeyUsage): + return NotImplemented + + return ( + self.digital_signature == other.digital_signature and + self.content_commitment == other.content_commitment and + self.key_encipherment == other.key_encipherment and + self.data_encipherment == other.data_encipherment and + self.key_agreement == other.key_agreement and + self.key_cert_sign == other.key_cert_sign and + self.crl_sign == other.crl_sign and + self._encipher_only == other._encipher_only and + self._decipher_only == other._decipher_only + ) + + def __ne__(self, other): + return not self == other + + def __hash__(self): + return hash(( + self.digital_signature, self.content_commitment, + self.key_encipherment, self.data_encipherment, + self.key_agreement, self.key_cert_sign, + self.crl_sign, self._encipher_only, + self._decipher_only + )) + + +@utils.register_interface(ExtensionType) +class NameConstraints(object): + oid = ExtensionOID.NAME_CONSTRAINTS + + def __init__(self, permitted_subtrees, excluded_subtrees): + if permitted_subtrees is not None: + permitted_subtrees = list(permitted_subtrees) + if not all( + isinstance(x, GeneralName) for x in permitted_subtrees + ): + raise TypeError( + "permitted_subtrees must be a list of GeneralName objects " + "or None" + ) + + self._validate_ip_name(permitted_subtrees) + + if excluded_subtrees is not None: + excluded_subtrees = list(excluded_subtrees) + if not all( + isinstance(x, GeneralName) for x in excluded_subtrees + ): + raise TypeError( + "excluded_subtrees must be a list of GeneralName objects " + "or None" + ) + + self._validate_ip_name(excluded_subtrees) + + if permitted_subtrees is None and excluded_subtrees is None: + raise ValueError( + "At least one of permitted_subtrees and excluded_subtrees " + "must not be None" + ) + + self._permitted_subtrees = permitted_subtrees + self._excluded_subtrees = excluded_subtrees + + def __eq__(self, other): + if not isinstance(other, NameConstraints): + return NotImplemented + + return ( + self.excluded_subtrees == other.excluded_subtrees and + self.permitted_subtrees == other.permitted_subtrees + ) + + def __ne__(self, other): + return not self == other + + def _validate_ip_name(self, tree): + if any(isinstance(name, IPAddress) and not isinstance( + name.value, (ipaddress.IPv4Network, ipaddress.IPv6Network) + ) for name in tree): + raise TypeError( + "IPAddress name constraints must be an IPv4Network or" + " IPv6Network object" + ) + + def __repr__(self): + return ( + u"".format(self) + ) + + def __hash__(self): + if self.permitted_subtrees is not None: + ps = tuple(self.permitted_subtrees) + else: + ps = None + + if self.excluded_subtrees is not None: + es = tuple(self.excluded_subtrees) + else: + es = None + + return hash((ps, es)) + + permitted_subtrees = utils.read_only_property("_permitted_subtrees") + excluded_subtrees = utils.read_only_property("_excluded_subtrees") + + +class Extension(object): + def __init__(self, oid, critical, value): + if not isinstance(oid, ObjectIdentifier): + raise TypeError( + "oid argument must be an ObjectIdentifier instance." + ) + + if not isinstance(critical, bool): + raise TypeError("critical must be a boolean value") + + self._oid = oid + self._critical = critical + self._value = value + + oid = utils.read_only_property("_oid") + critical = utils.read_only_property("_critical") + value = utils.read_only_property("_value") + + def __repr__(self): + return ("").format(self) + + def __eq__(self, other): + if not isinstance(other, Extension): + return NotImplemented + + return ( + self.oid == other.oid and + self.critical == other.critical and + self.value == other.value + ) + + def __ne__(self, other): + return not self == other + + def __hash__(self): + return hash((self.oid, self.critical, self.value)) + + +class GeneralNames(object): + def __init__(self, general_names): + general_names = list(general_names) + if not all(isinstance(x, GeneralName) for x in general_names): + raise TypeError( + "Every item in the general_names list must be an " + "object conforming to the GeneralName interface" + ) + + self._general_names = general_names + + def __iter__(self): + return iter(self._general_names) + + def __len__(self): + return len(self._general_names) + + def get_values_for_type(self, type): + # Return the value of each GeneralName, except for OtherName instances + # which we return directly because it has two important properties not + # just one value. + objs = (i for i in self if isinstance(i, type)) + if type != OtherName: + objs = (i.value for i in objs) + return list(objs) + + def __repr__(self): + return "".format(self._general_names) + + def __eq__(self, other): + if not isinstance(other, GeneralNames): + return NotImplemented + + return self._general_names == other._general_names + + def __ne__(self, other): + return not self == other + + def __getitem__(self, idx): + return self._general_names[idx] + + def __hash__(self): + return hash(tuple(self._general_names)) + + +@utils.register_interface(ExtensionType) +class SubjectAlternativeName(object): + oid = ExtensionOID.SUBJECT_ALTERNATIVE_NAME + + def __init__(self, general_names): + self._general_names = GeneralNames(general_names) + + def __iter__(self): + return iter(self._general_names) + + def __len__(self): + return len(self._general_names) + + def get_values_for_type(self, type): + return self._general_names.get_values_for_type(type) + + def __repr__(self): + return "".format(self._general_names) + + def __eq__(self, other): + if not isinstance(other, SubjectAlternativeName): + return NotImplemented + + return self._general_names == other._general_names + + def __getitem__(self, idx): + return self._general_names[idx] + + def __ne__(self, other): + return not self == other + + def __hash__(self): + return hash(self._general_names) + + +@utils.register_interface(ExtensionType) +class IssuerAlternativeName(object): + oid = ExtensionOID.ISSUER_ALTERNATIVE_NAME + + def __init__(self, general_names): + self._general_names = GeneralNames(general_names) + + def __iter__(self): + return iter(self._general_names) + + def __len__(self): + return len(self._general_names) + + def get_values_for_type(self, type): + return self._general_names.get_values_for_type(type) + + def __repr__(self): + return "".format(self._general_names) + + def __eq__(self, other): + if not isinstance(other, IssuerAlternativeName): + return NotImplemented + + return self._general_names == other._general_names + + def __ne__(self, other): + return not self == other + + def __getitem__(self, idx): + return self._general_names[idx] + + def __hash__(self): + return hash(self._general_names) + + +@utils.register_interface(ExtensionType) +class CertificateIssuer(object): + oid = CRLEntryExtensionOID.CERTIFICATE_ISSUER + + def __init__(self, general_names): + self._general_names = GeneralNames(general_names) + + def __iter__(self): + return iter(self._general_names) + + def __len__(self): + return len(self._general_names) + + def get_values_for_type(self, type): + return self._general_names.get_values_for_type(type) + + def __repr__(self): + return "".format(self._general_names) + + def __eq__(self, other): + if not isinstance(other, CertificateIssuer): + return NotImplemented + + return self._general_names == other._general_names + + def __ne__(self, other): + return not self == other + + def __getitem__(self, idx): + return self._general_names[idx] + + def __hash__(self): + return hash(self._general_names) + + +@utils.register_interface(ExtensionType) +class CRLReason(object): + oid = CRLEntryExtensionOID.CRL_REASON + + def __init__(self, reason): + if not isinstance(reason, ReasonFlags): + raise TypeError("reason must be an element from ReasonFlags") + + self._reason = reason + + def __repr__(self): + return "".format(self._reason) + + def __eq__(self, other): + if not isinstance(other, CRLReason): + return NotImplemented + + return self.reason == other.reason + + def __ne__(self, other): + return not self == other + + def __hash__(self): + return hash(self.reason) + + reason = utils.read_only_property("_reason") + + +@utils.register_interface(ExtensionType) +class InvalidityDate(object): + oid = CRLEntryExtensionOID.INVALIDITY_DATE + + def __init__(self, invalidity_date): + if not isinstance(invalidity_date, datetime.datetime): + raise TypeError("invalidity_date must be a datetime.datetime") + + self._invalidity_date = invalidity_date + + def __repr__(self): + return "".format( + self._invalidity_date + ) + + def __eq__(self, other): + if not isinstance(other, InvalidityDate): + return NotImplemented + + return self.invalidity_date == other.invalidity_date + + def __ne__(self, other): + return not self == other + + def __hash__(self): + return hash(self.invalidity_date) + + invalidity_date = utils.read_only_property("_invalidity_date") + + +@utils.register_interface(ExtensionType) +class PrecertificateSignedCertificateTimestamps(object): + oid = ExtensionOID.PRECERT_SIGNED_CERTIFICATE_TIMESTAMPS + + def __init__(self, signed_certificate_timestamps): + signed_certificate_timestamps = list(signed_certificate_timestamps) + if not all( + isinstance(sct, SignedCertificateTimestamp) + for sct in signed_certificate_timestamps + ): + raise TypeError( + "Every item in the signed_certificate_timestamps list must be " + "a SignedCertificateTimestamp" + ) + self._signed_certificate_timestamps = signed_certificate_timestamps + + def __iter__(self): + return iter(self._signed_certificate_timestamps) + + def __len__(self): + return len(self._signed_certificate_timestamps) + + def __getitem__(self, idx): + return self._signed_certificate_timestamps[idx] + + def __repr__(self): + return ( + "".format( + list(self) + ) + ) + + def __hash__(self): + return hash(tuple(self._signed_certificate_timestamps)) + + def __eq__(self, other): + if not isinstance(other, PrecertificateSignedCertificateTimestamps): + return NotImplemented + + return ( + self._signed_certificate_timestamps == + other._signed_certificate_timestamps + ) + + def __ne__(self, other): + return not self == other + + +@utils.register_interface(ExtensionType) +class OCSPNonce(object): + oid = OCSPExtensionOID.NONCE + + def __init__(self, nonce): + if not isinstance(nonce, bytes): + raise TypeError("nonce must be bytes") + + self._nonce = nonce + + def __eq__(self, other): + if not isinstance(other, OCSPNonce): + return NotImplemented + + return self.nonce == other.nonce + + def __ne__(self, other): + return not self == other + + def __hash__(self): + return hash(self.nonce) + + def __repr__(self): + return "".format(self) + + nonce = utils.read_only_property("_nonce") + + +@utils.register_interface(ExtensionType) +class IssuingDistributionPoint(object): + oid = ExtensionOID.ISSUING_DISTRIBUTION_POINT + + def __init__(self, full_name, relative_name, only_contains_user_certs, + only_contains_ca_certs, only_some_reasons, indirect_crl, + only_contains_attribute_certs): + if ( + only_some_reasons and ( + not isinstance(only_some_reasons, frozenset) or not all( + isinstance(x, ReasonFlags) for x in only_some_reasons + ) + ) + ): + raise TypeError( + "only_some_reasons must be None or frozenset of ReasonFlags" + ) + + if only_some_reasons and ( + ReasonFlags.unspecified in only_some_reasons or + ReasonFlags.remove_from_crl in only_some_reasons + ): + raise ValueError( + "unspecified and remove_from_crl are not valid reasons in an " + "IssuingDistributionPoint" + ) + + if not ( + isinstance(only_contains_user_certs, bool) and + isinstance(only_contains_ca_certs, bool) and + isinstance(indirect_crl, bool) and + isinstance(only_contains_attribute_certs, bool) + ): + raise TypeError( + "only_contains_user_certs, only_contains_ca_certs, " + "indirect_crl and only_contains_attribute_certs " + "must all be boolean." + ) + + crl_constraints = [ + only_contains_user_certs, only_contains_ca_certs, + indirect_crl, only_contains_attribute_certs + ] + + if len([x for x in crl_constraints if x]) > 1: + raise ValueError( + "Only one of the following can be set to True: " + "only_contains_user_certs, only_contains_ca_certs, " + "indirect_crl, only_contains_attribute_certs" + ) + + if ( + not any([ + only_contains_user_certs, only_contains_ca_certs, + indirect_crl, only_contains_attribute_certs, full_name, + relative_name, only_some_reasons + ]) + ): + raise ValueError( + "Cannot create empty extension: " + "if only_contains_user_certs, only_contains_ca_certs, " + "indirect_crl, and only_contains_attribute_certs are all False" + ", then either full_name, relative_name, or only_some_reasons " + "must have a value." + ) + + self._only_contains_user_certs = only_contains_user_certs + self._only_contains_ca_certs = only_contains_ca_certs + self._indirect_crl = indirect_crl + self._only_contains_attribute_certs = only_contains_attribute_certs + self._only_some_reasons = only_some_reasons + self._full_name = full_name + self._relative_name = relative_name + + def __repr__(self): + return ( + "".format(self) + ) + + def __eq__(self, other): + if not isinstance(other, IssuingDistributionPoint): + return NotImplemented + + return ( + self.full_name == other.full_name and + self.relative_name == other.relative_name and + self.only_contains_user_certs == other.only_contains_user_certs and + self.only_contains_ca_certs == other.only_contains_ca_certs and + self.only_some_reasons == other.only_some_reasons and + self.indirect_crl == other.indirect_crl and + self.only_contains_attribute_certs == + other.only_contains_attribute_certs + ) + + def __ne__(self, other): + return not self == other + + def __hash__(self): + return hash(( + self.full_name, + self.relative_name, + self.only_contains_user_certs, + self.only_contains_ca_certs, + self.only_some_reasons, + self.indirect_crl, + self.only_contains_attribute_certs, + )) + + full_name = utils.read_only_property("_full_name") + relative_name = utils.read_only_property("_relative_name") + only_contains_user_certs = utils.read_only_property( + "_only_contains_user_certs" + ) + only_contains_ca_certs = utils.read_only_property( + "_only_contains_ca_certs" + ) + only_some_reasons = utils.read_only_property("_only_some_reasons") + indirect_crl = utils.read_only_property("_indirect_crl") + only_contains_attribute_certs = utils.read_only_property( + "_only_contains_attribute_certs" + ) + + +@utils.register_interface(ExtensionType) +class UnrecognizedExtension(object): + def __init__(self, oid, value): + if not isinstance(oid, ObjectIdentifier): + raise TypeError("oid must be an ObjectIdentifier") + self._oid = oid + self._value = value + + oid = utils.read_only_property("_oid") + value = utils.read_only_property("_value") + + def __repr__(self): + return ( + "".format( + self + ) + ) + + def __eq__(self, other): + if not isinstance(other, UnrecognizedExtension): + return NotImplemented + + return self.oid == other.oid and self.value == other.value + + def __ne__(self, other): + return not self == other + + def __hash__(self): + return hash((self.oid, self.value)) diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/x509/general_name.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/x509/general_name.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/x509/general_name.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/x509/general_name.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,360 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +import abc +import ipaddress +import warnings +from email.utils import parseaddr + +import six +from six.moves import urllib_parse + +from cryptography import utils +from cryptography.x509.name import Name +from cryptography.x509.oid import ObjectIdentifier + + +_GENERAL_NAMES = { + 0: "otherName", + 1: "rfc822Name", + 2: "dNSName", + 3: "x400Address", + 4: "directoryName", + 5: "ediPartyName", + 6: "uniformResourceIdentifier", + 7: "iPAddress", + 8: "registeredID", +} + + +def _lazy_import_idna(): + # Import idna lazily becase it allocates a decent amount of memory, and + # we're only using it in deprecated paths. + try: + import idna + return idna + except ImportError: + raise ImportError( + "idna is not installed, but a deprecated feature that requires it" + " was used. See: https://cryptography.io/en/latest/faq/#importe" + "rror-idna-is-not-installed" + ) + + +class UnsupportedGeneralNameType(Exception): + def __init__(self, msg, type): + super(UnsupportedGeneralNameType, self).__init__(msg) + self.type = type + + +@six.add_metaclass(abc.ABCMeta) +class GeneralName(object): + @abc.abstractproperty + def value(self): + """ + Return the value of the object + """ + + +@utils.register_interface(GeneralName) +class RFC822Name(object): + def __init__(self, value): + if isinstance(value, six.text_type): + try: + value.encode("ascii") + except UnicodeEncodeError: + value = self._idna_encode(value) + warnings.warn( + "RFC822Name values should be passed as an A-label string. " + "This means unicode characters should be encoded via " + "idna. Support for passing unicode strings (aka U-label) " + "will be removed in a future version.", + utils.PersistentlyDeprecated2017, + stacklevel=2, + ) + else: + raise TypeError("value must be string") + + name, address = parseaddr(value) + if name or not address: + # parseaddr has found a name (e.g. Name ) or the entire + # value is an empty string. + raise ValueError("Invalid rfc822name value") + + self._value = value + + value = utils.read_only_property("_value") + + @classmethod + def _init_without_validation(cls, value): + instance = cls.__new__(cls) + instance._value = value + return instance + + def _idna_encode(self, value): + idna = _lazy_import_idna() + _, address = parseaddr(value) + parts = address.split(u"@") + return parts[0] + "@" + idna.encode(parts[1]).decode("ascii") + + def __repr__(self): + return "".format(self.value) + + def __eq__(self, other): + if not isinstance(other, RFC822Name): + return NotImplemented + + return self.value == other.value + + def __ne__(self, other): + return not self == other + + def __hash__(self): + return hash(self.value) + + +def _idna_encode(value): + idna = _lazy_import_idna() + # Retain prefixes '*.' for common/alt names and '.' for name constraints + for prefix in ['*.', '.']: + if value.startswith(prefix): + value = value[len(prefix):] + return prefix + idna.encode(value).decode("ascii") + return idna.encode(value).decode("ascii") + + +@utils.register_interface(GeneralName) +class DNSName(object): + def __init__(self, value): + if isinstance(value, six.text_type): + try: + value.encode("ascii") + except UnicodeEncodeError: + value = _idna_encode(value) + warnings.warn( + "DNSName values should be passed as an A-label string. " + "This means unicode characters should be encoded via " + "idna. Support for passing unicode strings (aka U-label) " + "will be removed in a future version.", + utils.PersistentlyDeprecated2017, + stacklevel=2, + ) + else: + raise TypeError("value must be string") + + self._value = value + + value = utils.read_only_property("_value") + + @classmethod + def _init_without_validation(cls, value): + instance = cls.__new__(cls) + instance._value = value + return instance + + def __repr__(self): + return "".format(self.value) + + def __eq__(self, other): + if not isinstance(other, DNSName): + return NotImplemented + + return self.value == other.value + + def __ne__(self, other): + return not self == other + + def __hash__(self): + return hash(self.value) + + +@utils.register_interface(GeneralName) +class UniformResourceIdentifier(object): + def __init__(self, value): + if isinstance(value, six.text_type): + try: + value.encode("ascii") + except UnicodeEncodeError: + value = self._idna_encode(value) + warnings.warn( + "URI values should be passed as an A-label string. " + "This means unicode characters should be encoded via " + "idna. Support for passing unicode strings (aka U-label) " + " will be removed in a future version.", + utils.PersistentlyDeprecated2017, + stacklevel=2, + ) + else: + raise TypeError("value must be string") + + self._value = value + + value = utils.read_only_property("_value") + + @classmethod + def _init_without_validation(cls, value): + instance = cls.__new__(cls) + instance._value = value + return instance + + def _idna_encode(self, value): + idna = _lazy_import_idna() + parsed = urllib_parse.urlparse(value) + if parsed.port: + netloc = ( + idna.encode(parsed.hostname) + + ":{}".format(parsed.port).encode("ascii") + ).decode("ascii") + else: + netloc = idna.encode(parsed.hostname).decode("ascii") + + # Note that building a URL in this fashion means it should be + # semantically indistinguishable from the original but is not + # guaranteed to be exactly the same. + return urllib_parse.urlunparse(( + parsed.scheme, + netloc, + parsed.path, + parsed.params, + parsed.query, + parsed.fragment + )) + + def __repr__(self): + return "".format(self.value) + + def __eq__(self, other): + if not isinstance(other, UniformResourceIdentifier): + return NotImplemented + + return self.value == other.value + + def __ne__(self, other): + return not self == other + + def __hash__(self): + return hash(self.value) + + +@utils.register_interface(GeneralName) +class DirectoryName(object): + def __init__(self, value): + if not isinstance(value, Name): + raise TypeError("value must be a Name") + + self._value = value + + value = utils.read_only_property("_value") + + def __repr__(self): + return "".format(self.value) + + def __eq__(self, other): + if not isinstance(other, DirectoryName): + return NotImplemented + + return self.value == other.value + + def __ne__(self, other): + return not self == other + + def __hash__(self): + return hash(self.value) + + +@utils.register_interface(GeneralName) +class RegisteredID(object): + def __init__(self, value): + if not isinstance(value, ObjectIdentifier): + raise TypeError("value must be an ObjectIdentifier") + + self._value = value + + value = utils.read_only_property("_value") + + def __repr__(self): + return "".format(self.value) + + def __eq__(self, other): + if not isinstance(other, RegisteredID): + return NotImplemented + + return self.value == other.value + + def __ne__(self, other): + return not self == other + + def __hash__(self): + return hash(self.value) + + +@utils.register_interface(GeneralName) +class IPAddress(object): + def __init__(self, value): + if not isinstance( + value, + ( + ipaddress.IPv4Address, + ipaddress.IPv6Address, + ipaddress.IPv4Network, + ipaddress.IPv6Network + ) + ): + raise TypeError( + "value must be an instance of ipaddress.IPv4Address, " + "ipaddress.IPv6Address, ipaddress.IPv4Network, or " + "ipaddress.IPv6Network" + ) + + self._value = value + + value = utils.read_only_property("_value") + + def __repr__(self): + return "".format(self.value) + + def __eq__(self, other): + if not isinstance(other, IPAddress): + return NotImplemented + + return self.value == other.value + + def __ne__(self, other): + return not self == other + + def __hash__(self): + return hash(self.value) + + +@utils.register_interface(GeneralName) +class OtherName(object): + def __init__(self, type_id, value): + if not isinstance(type_id, ObjectIdentifier): + raise TypeError("type_id must be an ObjectIdentifier") + if not isinstance(value, bytes): + raise TypeError("value must be a binary string") + + self._type_id = type_id + self._value = value + + type_id = utils.read_only_property("_type_id") + value = utils.read_only_property("_value") + + def __repr__(self): + return "".format( + self.type_id, self.value) + + def __eq__(self, other): + if not isinstance(other, OtherName): + return NotImplemented + + return self.type_id == other.type_id and self.value == other.value + + def __ne__(self, other): + return not self == other + + def __hash__(self): + return hash((self.type_id, self.value)) diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/x509/__init__.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/x509/__init__.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/x509/__init__.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/x509/__init__.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,189 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +from cryptography.x509 import certificate_transparency +from cryptography.x509.base import ( + Certificate, CertificateBuilder, CertificateRevocationList, + CertificateRevocationListBuilder, + CertificateSigningRequest, CertificateSigningRequestBuilder, + InvalidVersion, RevokedCertificate, RevokedCertificateBuilder, + Version, load_der_x509_certificate, load_der_x509_crl, load_der_x509_csr, + load_pem_x509_certificate, load_pem_x509_crl, load_pem_x509_csr, + random_serial_number, +) +from cryptography.x509.extensions import ( + AccessDescription, AuthorityInformationAccess, + AuthorityKeyIdentifier, BasicConstraints, CRLDistributionPoints, + CRLNumber, CRLReason, CertificateIssuer, CertificatePolicies, + DeltaCRLIndicator, DistributionPoint, DuplicateExtension, ExtendedKeyUsage, + Extension, ExtensionNotFound, ExtensionType, Extensions, FreshestCRL, + GeneralNames, InhibitAnyPolicy, InvalidityDate, IssuerAlternativeName, + IssuingDistributionPoint, KeyUsage, NameConstraints, NoticeReference, + OCSPNoCheck, OCSPNonce, PolicyConstraints, PolicyInformation, + PrecertPoison, PrecertificateSignedCertificateTimestamps, ReasonFlags, + SubjectAlternativeName, SubjectKeyIdentifier, TLSFeature, TLSFeatureType, + UnrecognizedExtension, UserNotice +) +from cryptography.x509.general_name import ( + DNSName, DirectoryName, GeneralName, IPAddress, OtherName, RFC822Name, + RegisteredID, UniformResourceIdentifier, UnsupportedGeneralNameType, + _GENERAL_NAMES +) +from cryptography.x509.name import ( + Name, NameAttribute, RelativeDistinguishedName +) +from cryptography.x509.oid import ( + AuthorityInformationAccessOID, CRLEntryExtensionOID, + CertificatePoliciesOID, ExtendedKeyUsageOID, ExtensionOID, NameOID, + ObjectIdentifier, SignatureAlgorithmOID, _SIG_OIDS_TO_HASH +) + + +OID_AUTHORITY_INFORMATION_ACCESS = ExtensionOID.AUTHORITY_INFORMATION_ACCESS +OID_AUTHORITY_KEY_IDENTIFIER = ExtensionOID.AUTHORITY_KEY_IDENTIFIER +OID_BASIC_CONSTRAINTS = ExtensionOID.BASIC_CONSTRAINTS +OID_CERTIFICATE_POLICIES = ExtensionOID.CERTIFICATE_POLICIES +OID_CRL_DISTRIBUTION_POINTS = ExtensionOID.CRL_DISTRIBUTION_POINTS +OID_EXTENDED_KEY_USAGE = ExtensionOID.EXTENDED_KEY_USAGE +OID_FRESHEST_CRL = ExtensionOID.FRESHEST_CRL +OID_INHIBIT_ANY_POLICY = ExtensionOID.INHIBIT_ANY_POLICY +OID_ISSUER_ALTERNATIVE_NAME = ExtensionOID.ISSUER_ALTERNATIVE_NAME +OID_KEY_USAGE = ExtensionOID.KEY_USAGE +OID_NAME_CONSTRAINTS = ExtensionOID.NAME_CONSTRAINTS +OID_OCSP_NO_CHECK = ExtensionOID.OCSP_NO_CHECK +OID_POLICY_CONSTRAINTS = ExtensionOID.POLICY_CONSTRAINTS +OID_POLICY_MAPPINGS = ExtensionOID.POLICY_MAPPINGS +OID_SUBJECT_ALTERNATIVE_NAME = ExtensionOID.SUBJECT_ALTERNATIVE_NAME +OID_SUBJECT_DIRECTORY_ATTRIBUTES = ExtensionOID.SUBJECT_DIRECTORY_ATTRIBUTES +OID_SUBJECT_INFORMATION_ACCESS = ExtensionOID.SUBJECT_INFORMATION_ACCESS +OID_SUBJECT_KEY_IDENTIFIER = ExtensionOID.SUBJECT_KEY_IDENTIFIER + +OID_DSA_WITH_SHA1 = SignatureAlgorithmOID.DSA_WITH_SHA1 +OID_DSA_WITH_SHA224 = SignatureAlgorithmOID.DSA_WITH_SHA224 +OID_DSA_WITH_SHA256 = SignatureAlgorithmOID.DSA_WITH_SHA256 +OID_ECDSA_WITH_SHA1 = SignatureAlgorithmOID.ECDSA_WITH_SHA1 +OID_ECDSA_WITH_SHA224 = SignatureAlgorithmOID.ECDSA_WITH_SHA224 +OID_ECDSA_WITH_SHA256 = SignatureAlgorithmOID.ECDSA_WITH_SHA256 +OID_ECDSA_WITH_SHA384 = SignatureAlgorithmOID.ECDSA_WITH_SHA384 +OID_ECDSA_WITH_SHA512 = SignatureAlgorithmOID.ECDSA_WITH_SHA512 +OID_RSA_WITH_MD5 = SignatureAlgorithmOID.RSA_WITH_MD5 +OID_RSA_WITH_SHA1 = SignatureAlgorithmOID.RSA_WITH_SHA1 +OID_RSA_WITH_SHA224 = SignatureAlgorithmOID.RSA_WITH_SHA224 +OID_RSA_WITH_SHA256 = SignatureAlgorithmOID.RSA_WITH_SHA256 +OID_RSA_WITH_SHA384 = SignatureAlgorithmOID.RSA_WITH_SHA384 +OID_RSA_WITH_SHA512 = SignatureAlgorithmOID.RSA_WITH_SHA512 +OID_RSASSA_PSS = SignatureAlgorithmOID.RSASSA_PSS + +OID_COMMON_NAME = NameOID.COMMON_NAME +OID_COUNTRY_NAME = NameOID.COUNTRY_NAME +OID_DOMAIN_COMPONENT = NameOID.DOMAIN_COMPONENT +OID_DN_QUALIFIER = NameOID.DN_QUALIFIER +OID_EMAIL_ADDRESS = NameOID.EMAIL_ADDRESS +OID_GENERATION_QUALIFIER = NameOID.GENERATION_QUALIFIER +OID_GIVEN_NAME = NameOID.GIVEN_NAME +OID_LOCALITY_NAME = NameOID.LOCALITY_NAME +OID_ORGANIZATIONAL_UNIT_NAME = NameOID.ORGANIZATIONAL_UNIT_NAME +OID_ORGANIZATION_NAME = NameOID.ORGANIZATION_NAME +OID_PSEUDONYM = NameOID.PSEUDONYM +OID_SERIAL_NUMBER = NameOID.SERIAL_NUMBER +OID_STATE_OR_PROVINCE_NAME = NameOID.STATE_OR_PROVINCE_NAME +OID_SURNAME = NameOID.SURNAME +OID_TITLE = NameOID.TITLE + +OID_CLIENT_AUTH = ExtendedKeyUsageOID.CLIENT_AUTH +OID_CODE_SIGNING = ExtendedKeyUsageOID.CODE_SIGNING +OID_EMAIL_PROTECTION = ExtendedKeyUsageOID.EMAIL_PROTECTION +OID_OCSP_SIGNING = ExtendedKeyUsageOID.OCSP_SIGNING +OID_SERVER_AUTH = ExtendedKeyUsageOID.SERVER_AUTH +OID_TIME_STAMPING = ExtendedKeyUsageOID.TIME_STAMPING + +OID_ANY_POLICY = CertificatePoliciesOID.ANY_POLICY +OID_CPS_QUALIFIER = CertificatePoliciesOID.CPS_QUALIFIER +OID_CPS_USER_NOTICE = CertificatePoliciesOID.CPS_USER_NOTICE + +OID_CERTIFICATE_ISSUER = CRLEntryExtensionOID.CERTIFICATE_ISSUER +OID_CRL_REASON = CRLEntryExtensionOID.CRL_REASON +OID_INVALIDITY_DATE = CRLEntryExtensionOID.INVALIDITY_DATE + +OID_CA_ISSUERS = AuthorityInformationAccessOID.CA_ISSUERS +OID_OCSP = AuthorityInformationAccessOID.OCSP + +__all__ = [ + "certificate_transparency", + "load_pem_x509_certificate", + "load_der_x509_certificate", + "load_pem_x509_csr", + "load_der_x509_csr", + "load_pem_x509_crl", + "load_der_x509_crl", + "random_serial_number", + "InvalidVersion", + "DeltaCRLIndicator", + "DuplicateExtension", + "ExtensionNotFound", + "UnsupportedGeneralNameType", + "NameAttribute", + "Name", + "RelativeDistinguishedName", + "ObjectIdentifier", + "ExtensionType", + "Extensions", + "Extension", + "ExtendedKeyUsage", + "FreshestCRL", + "IssuingDistributionPoint", + "TLSFeature", + "TLSFeatureType", + "OCSPNoCheck", + "BasicConstraints", + "CRLNumber", + "KeyUsage", + "AuthorityInformationAccess", + "AccessDescription", + "CertificatePolicies", + "PolicyInformation", + "UserNotice", + "NoticeReference", + "SubjectKeyIdentifier", + "NameConstraints", + "CRLDistributionPoints", + "DistributionPoint", + "ReasonFlags", + "InhibitAnyPolicy", + "SubjectAlternativeName", + "IssuerAlternativeName", + "AuthorityKeyIdentifier", + "GeneralNames", + "GeneralName", + "RFC822Name", + "DNSName", + "UniformResourceIdentifier", + "RegisteredID", + "DirectoryName", + "IPAddress", + "OtherName", + "Certificate", + "CertificateRevocationList", + "CertificateRevocationListBuilder", + "CertificateSigningRequest", + "RevokedCertificate", + "RevokedCertificateBuilder", + "CertificateSigningRequestBuilder", + "CertificateBuilder", + "Version", + "_SIG_OIDS_TO_HASH", + "OID_CA_ISSUERS", + "OID_OCSP", + "_GENERAL_NAMES", + "CertificateIssuer", + "CRLReason", + "InvalidityDate", + "UnrecognizedExtension", + "PolicyConstraints", + "PrecertificateSignedCertificateTimestamps", + "PrecertPoison", + "OCSPNonce", +] diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/x509/name.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/x509/name.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/x509/name.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/x509/name.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,259 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +from enum import Enum + +import six + +from cryptography import utils +from cryptography.x509.oid import NameOID, ObjectIdentifier + + +class _ASN1Type(Enum): + UTF8String = 12 + NumericString = 18 + PrintableString = 19 + T61String = 20 + IA5String = 22 + UTCTime = 23 + GeneralizedTime = 24 + VisibleString = 26 + UniversalString = 28 + BMPString = 30 + + +_ASN1_TYPE_TO_ENUM = dict((i.value, i) for i in _ASN1Type) +_SENTINEL = object() +_NAMEOID_DEFAULT_TYPE = { + NameOID.COUNTRY_NAME: _ASN1Type.PrintableString, + NameOID.JURISDICTION_COUNTRY_NAME: _ASN1Type.PrintableString, + NameOID.SERIAL_NUMBER: _ASN1Type.PrintableString, + NameOID.DN_QUALIFIER: _ASN1Type.PrintableString, + NameOID.EMAIL_ADDRESS: _ASN1Type.IA5String, + NameOID.DOMAIN_COMPONENT: _ASN1Type.IA5String, +} + +#: Short attribute names from RFC 4514: +#: https://tools.ietf.org/html/rfc4514#page-7 +_NAMEOID_TO_NAME = { + NameOID.COMMON_NAME: 'CN', + NameOID.LOCALITY_NAME: 'L', + NameOID.STATE_OR_PROVINCE_NAME: 'ST', + NameOID.ORGANIZATION_NAME: 'O', + NameOID.ORGANIZATIONAL_UNIT_NAME: 'OU', + NameOID.COUNTRY_NAME: 'C', + NameOID.STREET_ADDRESS: 'STREET', + NameOID.DOMAIN_COMPONENT: 'DC', + NameOID.USER_ID: 'UID', +} + + +def _escape_dn_value(val): + """Escape special characters in RFC4514 Distinguished Name value.""" + + # See https://tools.ietf.org/html/rfc4514#section-2.4 + val = val.replace('\\', '\\\\') + val = val.replace('"', '\\"') + val = val.replace('+', '\\+') + val = val.replace(',', '\\,') + val = val.replace(';', '\\;') + val = val.replace('<', '\\<') + val = val.replace('>', '\\>') + val = val.replace('\0', '\\00') + + if val[0] in ('#', ' '): + val = '\\' + val + if val[-1] == ' ': + val = val[:-1] + '\\ ' + + return val + + +class NameAttribute(object): + def __init__(self, oid, value, _type=_SENTINEL): + if not isinstance(oid, ObjectIdentifier): + raise TypeError( + "oid argument must be an ObjectIdentifier instance." + ) + + if not isinstance(value, six.text_type): + raise TypeError( + "value argument must be a text type." + ) + + if ( + oid == NameOID.COUNTRY_NAME or + oid == NameOID.JURISDICTION_COUNTRY_NAME + ): + if len(value.encode("utf8")) != 2: + raise ValueError( + "Country name must be a 2 character country code" + ) + + if len(value) == 0: + raise ValueError("Value cannot be an empty string") + + # The appropriate ASN1 string type varies by OID and is defined across + # multiple RFCs including 2459, 3280, and 5280. In general UTF8String + # is preferred (2459), but 3280 and 5280 specify several OIDs with + # alternate types. This means when we see the sentinel value we need + # to look up whether the OID has a non-UTF8 type. If it does, set it + # to that. Otherwise, UTF8! + if _type == _SENTINEL: + _type = _NAMEOID_DEFAULT_TYPE.get(oid, _ASN1Type.UTF8String) + + if not isinstance(_type, _ASN1Type): + raise TypeError("_type must be from the _ASN1Type enum") + + self._oid = oid + self._value = value + self._type = _type + + oid = utils.read_only_property("_oid") + value = utils.read_only_property("_value") + + def rfc4514_string(self): + """ + Format as RFC4514 Distinguished Name string. + + Use short attribute name if available, otherwise fall back to OID + dotted string. + """ + key = _NAMEOID_TO_NAME.get(self.oid, self.oid.dotted_string) + return '%s=%s' % (key, _escape_dn_value(self.value)) + + def __eq__(self, other): + if not isinstance(other, NameAttribute): + return NotImplemented + + return ( + self.oid == other.oid and + self.value == other.value + ) + + def __ne__(self, other): + return not self == other + + def __hash__(self): + return hash((self.oid, self.value)) + + def __repr__(self): + return "".format(self) + + +class RelativeDistinguishedName(object): + def __init__(self, attributes): + attributes = list(attributes) + if not attributes: + raise ValueError("a relative distinguished name cannot be empty") + if not all(isinstance(x, NameAttribute) for x in attributes): + raise TypeError("attributes must be an iterable of NameAttribute") + + # Keep list and frozenset to preserve attribute order where it matters + self._attributes = attributes + self._attribute_set = frozenset(attributes) + + if len(self._attribute_set) != len(attributes): + raise ValueError("duplicate attributes are not allowed") + + def get_attributes_for_oid(self, oid): + return [i for i in self if i.oid == oid] + + def rfc4514_string(self): + """ + Format as RFC4514 Distinguished Name string. + + Within each RDN, attributes are joined by '+', although that is rarely + used in certificates. + """ + return '+'.join(attr.rfc4514_string() for attr in self._attributes) + + def __eq__(self, other): + if not isinstance(other, RelativeDistinguishedName): + return NotImplemented + + return self._attribute_set == other._attribute_set + + def __ne__(self, other): + return not self == other + + def __hash__(self): + return hash(self._attribute_set) + + def __iter__(self): + return iter(self._attributes) + + def __len__(self): + return len(self._attributes) + + def __repr__(self): + return "".format(self.rfc4514_string()) + + +class Name(object): + def __init__(self, attributes): + attributes = list(attributes) + if all(isinstance(x, NameAttribute) for x in attributes): + self._attributes = [ + RelativeDistinguishedName([x]) for x in attributes + ] + elif all(isinstance(x, RelativeDistinguishedName) for x in attributes): + self._attributes = attributes + else: + raise TypeError( + "attributes must be a list of NameAttribute" + " or a list RelativeDistinguishedName" + ) + + def rfc4514_string(self): + """ + Format as RFC4514 Distinguished Name string. + For example 'CN=foobar.com,O=Foo Corp,C=US' + + An X.509 name is a two-level structure: a list of sets of attributes. + Each list element is separated by ',' and within each list element, set + elements are separated by '+'. The latter is almost never used in + real world certificates. + """ + return ','.join(attr.rfc4514_string() for attr in self._attributes) + + def get_attributes_for_oid(self, oid): + return [i for i in self if i.oid == oid] + + @property + def rdns(self): + return self._attributes + + def public_bytes(self, backend): + return backend.x509_name_bytes(self) + + def __eq__(self, other): + if not isinstance(other, Name): + return NotImplemented + + return self._attributes == other._attributes + + def __ne__(self, other): + return not self == other + + def __hash__(self): + # TODO: this is relatively expensive, if this looks like a bottleneck + # for you, consider optimizing! + return hash(tuple(self._attributes)) + + def __iter__(self): + for rdn in self._attributes: + for ava in rdn: + yield ava + + def __len__(self): + return sum(len(rdn) for rdn in self._attributes) + + def __repr__(self): + if six.PY2: + return "".format(self.rfc4514_string().encode('utf8')) + else: + return "".format(self.rfc4514_string()) diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/x509/ocsp.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/x509/ocsp.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/x509/ocsp.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/x509/ocsp.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,422 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +import abc +import datetime +from enum import Enum + +import six + +from cryptography import x509 +from cryptography.hazmat.primitives import hashes +from cryptography.x509.base import ( + _EARLIEST_UTC_TIME, _convert_to_naive_utc_time, _reject_duplicate_extension +) + + +_OIDS_TO_HASH = { + "1.3.14.3.2.26": hashes.SHA1(), + "2.16.840.1.101.3.4.2.4": hashes.SHA224(), + "2.16.840.1.101.3.4.2.1": hashes.SHA256(), + "2.16.840.1.101.3.4.2.2": hashes.SHA384(), + "2.16.840.1.101.3.4.2.3": hashes.SHA512(), +} + + +class OCSPResponderEncoding(Enum): + HASH = "By Hash" + NAME = "By Name" + + +class OCSPResponseStatus(Enum): + SUCCESSFUL = 0 + MALFORMED_REQUEST = 1 + INTERNAL_ERROR = 2 + TRY_LATER = 3 + SIG_REQUIRED = 5 + UNAUTHORIZED = 6 + + +_RESPONSE_STATUS_TO_ENUM = dict((x.value, x) for x in OCSPResponseStatus) +_ALLOWED_HASHES = ( + hashes.SHA1, hashes.SHA224, hashes.SHA256, + hashes.SHA384, hashes.SHA512 +) + + +def _verify_algorithm(algorithm): + if not isinstance(algorithm, _ALLOWED_HASHES): + raise ValueError( + "Algorithm must be SHA1, SHA224, SHA256, SHA384, or SHA512" + ) + + +class OCSPCertStatus(Enum): + GOOD = 0 + REVOKED = 1 + UNKNOWN = 2 + + +_CERT_STATUS_TO_ENUM = dict((x.value, x) for x in OCSPCertStatus) + + +def load_der_ocsp_request(data): + from cryptography.hazmat.backends.openssl.backend import backend + return backend.load_der_ocsp_request(data) + + +def load_der_ocsp_response(data): + from cryptography.hazmat.backends.openssl.backend import backend + return backend.load_der_ocsp_response(data) + + +class OCSPRequestBuilder(object): + def __init__(self, request=None, extensions=[]): + self._request = request + self._extensions = extensions + + def add_certificate(self, cert, issuer, algorithm): + if self._request is not None: + raise ValueError("Only one certificate can be added to a request") + + _verify_algorithm(algorithm) + if ( + not isinstance(cert, x509.Certificate) or + not isinstance(issuer, x509.Certificate) + ): + raise TypeError("cert and issuer must be a Certificate") + + return OCSPRequestBuilder((cert, issuer, algorithm), self._extensions) + + def add_extension(self, extension, critical): + if not isinstance(extension, x509.ExtensionType): + raise TypeError("extension must be an ExtensionType") + + extension = x509.Extension(extension.oid, critical, extension) + _reject_duplicate_extension(extension, self._extensions) + + return OCSPRequestBuilder( + self._request, self._extensions + [extension] + ) + + def build(self): + from cryptography.hazmat.backends.openssl.backend import backend + if self._request is None: + raise ValueError("You must add a certificate before building") + + return backend.create_ocsp_request(self) + + +class _SingleResponse(object): + def __init__(self, cert, issuer, algorithm, cert_status, this_update, + next_update, revocation_time, revocation_reason): + if ( + not isinstance(cert, x509.Certificate) or + not isinstance(issuer, x509.Certificate) + ): + raise TypeError("cert and issuer must be a Certificate") + + _verify_algorithm(algorithm) + if not isinstance(this_update, datetime.datetime): + raise TypeError("this_update must be a datetime object") + if ( + next_update is not None and + not isinstance(next_update, datetime.datetime) + ): + raise TypeError("next_update must be a datetime object or None") + + self._cert = cert + self._issuer = issuer + self._algorithm = algorithm + self._this_update = this_update + self._next_update = next_update + + if not isinstance(cert_status, OCSPCertStatus): + raise TypeError( + "cert_status must be an item from the OCSPCertStatus enum" + ) + if cert_status is not OCSPCertStatus.REVOKED: + if revocation_time is not None: + raise ValueError( + "revocation_time can only be provided if the certificate " + "is revoked" + ) + if revocation_reason is not None: + raise ValueError( + "revocation_reason can only be provided if the certificate" + " is revoked" + ) + else: + if not isinstance(revocation_time, datetime.datetime): + raise TypeError("revocation_time must be a datetime object") + + revocation_time = _convert_to_naive_utc_time(revocation_time) + if revocation_time < _EARLIEST_UTC_TIME: + raise ValueError('The revocation_time must be on or after' + ' 1950 January 1.') + + if ( + revocation_reason is not None and + not isinstance(revocation_reason, x509.ReasonFlags) + ): + raise TypeError( + "revocation_reason must be an item from the ReasonFlags " + "enum or None" + ) + + self._cert_status = cert_status + self._revocation_time = revocation_time + self._revocation_reason = revocation_reason + + +class OCSPResponseBuilder(object): + def __init__(self, response=None, responder_id=None, certs=None, + extensions=[]): + self._response = response + self._responder_id = responder_id + self._certs = certs + self._extensions = extensions + + def add_response(self, cert, issuer, algorithm, cert_status, this_update, + next_update, revocation_time, revocation_reason): + if self._response is not None: + raise ValueError("Only one response per OCSPResponse.") + + singleresp = _SingleResponse( + cert, issuer, algorithm, cert_status, this_update, next_update, + revocation_time, revocation_reason + ) + return OCSPResponseBuilder( + singleresp, self._responder_id, + self._certs, self._extensions, + ) + + def responder_id(self, encoding, responder_cert): + if self._responder_id is not None: + raise ValueError("responder_id can only be set once") + if not isinstance(responder_cert, x509.Certificate): + raise TypeError("responder_cert must be a Certificate") + if not isinstance(encoding, OCSPResponderEncoding): + raise TypeError( + "encoding must be an element from OCSPResponderEncoding" + ) + + return OCSPResponseBuilder( + self._response, (responder_cert, encoding), + self._certs, self._extensions, + ) + + def certificates(self, certs): + if self._certs is not None: + raise ValueError("certificates may only be set once") + certs = list(certs) + if len(certs) == 0: + raise ValueError("certs must not be an empty list") + if not all(isinstance(x, x509.Certificate) for x in certs): + raise TypeError("certs must be a list of Certificates") + return OCSPResponseBuilder( + self._response, self._responder_id, + certs, self._extensions, + ) + + def add_extension(self, extension, critical): + if not isinstance(extension, x509.ExtensionType): + raise TypeError("extension must be an ExtensionType") + + extension = x509.Extension(extension.oid, critical, extension) + _reject_duplicate_extension(extension, self._extensions) + + return OCSPResponseBuilder( + self._response, self._responder_id, + self._certs, self._extensions + [extension], + ) + + def sign(self, private_key, algorithm): + from cryptography.hazmat.backends.openssl.backend import backend + if self._response is None: + raise ValueError("You must add a response before signing") + if self._responder_id is None: + raise ValueError("You must add a responder_id before signing") + + if not isinstance(algorithm, hashes.HashAlgorithm): + raise TypeError("Algorithm must be a registered hash algorithm.") + + return backend.create_ocsp_response( + OCSPResponseStatus.SUCCESSFUL, self, private_key, algorithm + ) + + @classmethod + def build_unsuccessful(cls, response_status): + from cryptography.hazmat.backends.openssl.backend import backend + if not isinstance(response_status, OCSPResponseStatus): + raise TypeError( + "response_status must be an item from OCSPResponseStatus" + ) + if response_status is OCSPResponseStatus.SUCCESSFUL: + raise ValueError("response_status cannot be SUCCESSFUL") + + return backend.create_ocsp_response(response_status, None, None, None) + + +@six.add_metaclass(abc.ABCMeta) +class OCSPRequest(object): + @abc.abstractproperty + def issuer_key_hash(self): + """ + The hash of the issuer public key + """ + + @abc.abstractproperty + def issuer_name_hash(self): + """ + The hash of the issuer name + """ + + @abc.abstractproperty + def hash_algorithm(self): + """ + The hash algorithm used in the issuer name and key hashes + """ + + @abc.abstractproperty + def serial_number(self): + """ + The serial number of the cert whose status is being checked + """ + @abc.abstractmethod + def public_bytes(self, encoding): + """ + Serializes the request to DER + """ + + @abc.abstractproperty + def extensions(self): + """ + The list of request extensions. Not single request extensions. + """ + + +@six.add_metaclass(abc.ABCMeta) +class OCSPResponse(object): + @abc.abstractproperty + def response_status(self): + """ + The status of the response. This is a value from the OCSPResponseStatus + enumeration + """ + + @abc.abstractproperty + def signature_algorithm_oid(self): + """ + The ObjectIdentifier of the signature algorithm + """ + + @abc.abstractproperty + def signature_hash_algorithm(self): + """ + Returns a HashAlgorithm corresponding to the type of the digest signed + """ + + @abc.abstractproperty + def signature(self): + """ + The signature bytes + """ + + @abc.abstractproperty + def tbs_response_bytes(self): + """ + The tbsResponseData bytes + """ + + @abc.abstractproperty + def certificates(self): + """ + A list of certificates used to help build a chain to verify the OCSP + response. This situation occurs when the OCSP responder uses a delegate + certificate. + """ + + @abc.abstractproperty + def responder_key_hash(self): + """ + The responder's key hash or None + """ + + @abc.abstractproperty + def responder_name(self): + """ + The responder's Name or None + """ + + @abc.abstractproperty + def produced_at(self): + """ + The time the response was produced + """ + + @abc.abstractproperty + def certificate_status(self): + """ + The status of the certificate (an element from the OCSPCertStatus enum) + """ + + @abc.abstractproperty + def revocation_time(self): + """ + The date of when the certificate was revoked or None if not + revoked. + """ + + @abc.abstractproperty + def revocation_reason(self): + """ + The reason the certificate was revoked or None if not specified or + not revoked. + """ + + @abc.abstractproperty + def this_update(self): + """ + The most recent time at which the status being indicated is known by + the responder to have been correct + """ + + @abc.abstractproperty + def next_update(self): + """ + The time when newer information will be available + """ + + @abc.abstractproperty + def issuer_key_hash(self): + """ + The hash of the issuer public key + """ + + @abc.abstractproperty + def issuer_name_hash(self): + """ + The hash of the issuer name + """ + + @abc.abstractproperty + def hash_algorithm(self): + """ + The hash algorithm used in the issuer name and key hashes + """ + + @abc.abstractproperty + def serial_number(self): + """ + The serial number of the cert whose status is being checked + """ + + @abc.abstractproperty + def extensions(self): + """ + The list of response extensions. Not single response extensions. + """ diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/x509/oid.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/x509/oid.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/cryptography/x509/oid.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/cryptography/x509/oid.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,226 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +from cryptography.hazmat._oid import ObjectIdentifier +from cryptography.hazmat.primitives import hashes + + +class ExtensionOID(object): + SUBJECT_DIRECTORY_ATTRIBUTES = ObjectIdentifier("2.5.29.9") + SUBJECT_KEY_IDENTIFIER = ObjectIdentifier("2.5.29.14") + KEY_USAGE = ObjectIdentifier("2.5.29.15") + SUBJECT_ALTERNATIVE_NAME = ObjectIdentifier("2.5.29.17") + ISSUER_ALTERNATIVE_NAME = ObjectIdentifier("2.5.29.18") + BASIC_CONSTRAINTS = ObjectIdentifier("2.5.29.19") + NAME_CONSTRAINTS = ObjectIdentifier("2.5.29.30") + CRL_DISTRIBUTION_POINTS = ObjectIdentifier("2.5.29.31") + CERTIFICATE_POLICIES = ObjectIdentifier("2.5.29.32") + POLICY_MAPPINGS = ObjectIdentifier("2.5.29.33") + AUTHORITY_KEY_IDENTIFIER = ObjectIdentifier("2.5.29.35") + POLICY_CONSTRAINTS = ObjectIdentifier("2.5.29.36") + EXTENDED_KEY_USAGE = ObjectIdentifier("2.5.29.37") + FRESHEST_CRL = ObjectIdentifier("2.5.29.46") + INHIBIT_ANY_POLICY = ObjectIdentifier("2.5.29.54") + ISSUING_DISTRIBUTION_POINT = ObjectIdentifier("2.5.29.28") + AUTHORITY_INFORMATION_ACCESS = ObjectIdentifier("1.3.6.1.5.5.7.1.1") + SUBJECT_INFORMATION_ACCESS = ObjectIdentifier("1.3.6.1.5.5.7.1.11") + OCSP_NO_CHECK = ObjectIdentifier("1.3.6.1.5.5.7.48.1.5") + TLS_FEATURE = ObjectIdentifier("1.3.6.1.5.5.7.1.24") + CRL_NUMBER = ObjectIdentifier("2.5.29.20") + DELTA_CRL_INDICATOR = ObjectIdentifier("2.5.29.27") + PRECERT_SIGNED_CERTIFICATE_TIMESTAMPS = ( + ObjectIdentifier("1.3.6.1.4.1.11129.2.4.2") + ) + PRECERT_POISON = ( + ObjectIdentifier("1.3.6.1.4.1.11129.2.4.3") + ) + + +class OCSPExtensionOID(object): + NONCE = ObjectIdentifier("1.3.6.1.5.5.7.48.1.2") + + +class CRLEntryExtensionOID(object): + CERTIFICATE_ISSUER = ObjectIdentifier("2.5.29.29") + CRL_REASON = ObjectIdentifier("2.5.29.21") + INVALIDITY_DATE = ObjectIdentifier("2.5.29.24") + + +class NameOID(object): + COMMON_NAME = ObjectIdentifier("2.5.4.3") + COUNTRY_NAME = ObjectIdentifier("2.5.4.6") + LOCALITY_NAME = ObjectIdentifier("2.5.4.7") + STATE_OR_PROVINCE_NAME = ObjectIdentifier("2.5.4.8") + STREET_ADDRESS = ObjectIdentifier("2.5.4.9") + ORGANIZATION_NAME = ObjectIdentifier("2.5.4.10") + ORGANIZATIONAL_UNIT_NAME = ObjectIdentifier("2.5.4.11") + SERIAL_NUMBER = ObjectIdentifier("2.5.4.5") + SURNAME = ObjectIdentifier("2.5.4.4") + GIVEN_NAME = ObjectIdentifier("2.5.4.42") + TITLE = ObjectIdentifier("2.5.4.12") + GENERATION_QUALIFIER = ObjectIdentifier("2.5.4.44") + X500_UNIQUE_IDENTIFIER = ObjectIdentifier("2.5.4.45") + DN_QUALIFIER = ObjectIdentifier("2.5.4.46") + PSEUDONYM = ObjectIdentifier("2.5.4.65") + USER_ID = ObjectIdentifier("0.9.2342.19200300.100.1.1") + DOMAIN_COMPONENT = ObjectIdentifier("0.9.2342.19200300.100.1.25") + EMAIL_ADDRESS = ObjectIdentifier("1.2.840.113549.1.9.1") + JURISDICTION_COUNTRY_NAME = ObjectIdentifier("1.3.6.1.4.1.311.60.2.1.3") + JURISDICTION_LOCALITY_NAME = ObjectIdentifier("1.3.6.1.4.1.311.60.2.1.1") + JURISDICTION_STATE_OR_PROVINCE_NAME = ObjectIdentifier( + "1.3.6.1.4.1.311.60.2.1.2" + ) + BUSINESS_CATEGORY = ObjectIdentifier("2.5.4.15") + POSTAL_ADDRESS = ObjectIdentifier("2.5.4.16") + POSTAL_CODE = ObjectIdentifier("2.5.4.17") + + +class SignatureAlgorithmOID(object): + RSA_WITH_MD5 = ObjectIdentifier("1.2.840.113549.1.1.4") + RSA_WITH_SHA1 = ObjectIdentifier("1.2.840.113549.1.1.5") + # This is an alternate OID for RSA with SHA1 that is occasionally seen + _RSA_WITH_SHA1 = ObjectIdentifier("1.3.14.3.2.29") + RSA_WITH_SHA224 = ObjectIdentifier("1.2.840.113549.1.1.14") + RSA_WITH_SHA256 = ObjectIdentifier("1.2.840.113549.1.1.11") + RSA_WITH_SHA384 = ObjectIdentifier("1.2.840.113549.1.1.12") + RSA_WITH_SHA512 = ObjectIdentifier("1.2.840.113549.1.1.13") + RSASSA_PSS = ObjectIdentifier("1.2.840.113549.1.1.10") + ECDSA_WITH_SHA1 = ObjectIdentifier("1.2.840.10045.4.1") + ECDSA_WITH_SHA224 = ObjectIdentifier("1.2.840.10045.4.3.1") + ECDSA_WITH_SHA256 = ObjectIdentifier("1.2.840.10045.4.3.2") + ECDSA_WITH_SHA384 = ObjectIdentifier("1.2.840.10045.4.3.3") + ECDSA_WITH_SHA512 = ObjectIdentifier("1.2.840.10045.4.3.4") + DSA_WITH_SHA1 = ObjectIdentifier("1.2.840.10040.4.3") + DSA_WITH_SHA224 = ObjectIdentifier("2.16.840.1.101.3.4.3.1") + DSA_WITH_SHA256 = ObjectIdentifier("2.16.840.1.101.3.4.3.2") + + +_SIG_OIDS_TO_HASH = { + SignatureAlgorithmOID.RSA_WITH_MD5: hashes.MD5(), + SignatureAlgorithmOID.RSA_WITH_SHA1: hashes.SHA1(), + SignatureAlgorithmOID._RSA_WITH_SHA1: hashes.SHA1(), + SignatureAlgorithmOID.RSA_WITH_SHA224: hashes.SHA224(), + SignatureAlgorithmOID.RSA_WITH_SHA256: hashes.SHA256(), + SignatureAlgorithmOID.RSA_WITH_SHA384: hashes.SHA384(), + SignatureAlgorithmOID.RSA_WITH_SHA512: hashes.SHA512(), + SignatureAlgorithmOID.ECDSA_WITH_SHA1: hashes.SHA1(), + SignatureAlgorithmOID.ECDSA_WITH_SHA224: hashes.SHA224(), + SignatureAlgorithmOID.ECDSA_WITH_SHA256: hashes.SHA256(), + SignatureAlgorithmOID.ECDSA_WITH_SHA384: hashes.SHA384(), + SignatureAlgorithmOID.ECDSA_WITH_SHA512: hashes.SHA512(), + SignatureAlgorithmOID.DSA_WITH_SHA1: hashes.SHA1(), + SignatureAlgorithmOID.DSA_WITH_SHA224: hashes.SHA224(), + SignatureAlgorithmOID.DSA_WITH_SHA256: hashes.SHA256() +} + + +class ExtendedKeyUsageOID(object): + SERVER_AUTH = ObjectIdentifier("1.3.6.1.5.5.7.3.1") + CLIENT_AUTH = ObjectIdentifier("1.3.6.1.5.5.7.3.2") + CODE_SIGNING = ObjectIdentifier("1.3.6.1.5.5.7.3.3") + EMAIL_PROTECTION = ObjectIdentifier("1.3.6.1.5.5.7.3.4") + TIME_STAMPING = ObjectIdentifier("1.3.6.1.5.5.7.3.8") + OCSP_SIGNING = ObjectIdentifier("1.3.6.1.5.5.7.3.9") + ANY_EXTENDED_KEY_USAGE = ObjectIdentifier("2.5.29.37.0") + + +class AuthorityInformationAccessOID(object): + CA_ISSUERS = ObjectIdentifier("1.3.6.1.5.5.7.48.2") + OCSP = ObjectIdentifier("1.3.6.1.5.5.7.48.1") + + +class CertificatePoliciesOID(object): + CPS_QUALIFIER = ObjectIdentifier("1.3.6.1.5.5.7.2.1") + CPS_USER_NOTICE = ObjectIdentifier("1.3.6.1.5.5.7.2.2") + ANY_POLICY = ObjectIdentifier("2.5.29.32.0") + + +_OID_NAMES = { + NameOID.COMMON_NAME: "commonName", + NameOID.COUNTRY_NAME: "countryName", + NameOID.LOCALITY_NAME: "localityName", + NameOID.STATE_OR_PROVINCE_NAME: "stateOrProvinceName", + NameOID.STREET_ADDRESS: "streetAddress", + NameOID.ORGANIZATION_NAME: "organizationName", + NameOID.ORGANIZATIONAL_UNIT_NAME: "organizationalUnitName", + NameOID.SERIAL_NUMBER: "serialNumber", + NameOID.SURNAME: "surname", + NameOID.GIVEN_NAME: "givenName", + NameOID.TITLE: "title", + NameOID.GENERATION_QUALIFIER: "generationQualifier", + NameOID.X500_UNIQUE_IDENTIFIER: "x500UniqueIdentifier", + NameOID.DN_QUALIFIER: "dnQualifier", + NameOID.PSEUDONYM: "pseudonym", + NameOID.USER_ID: "userID", + NameOID.DOMAIN_COMPONENT: "domainComponent", + NameOID.EMAIL_ADDRESS: "emailAddress", + NameOID.JURISDICTION_COUNTRY_NAME: "jurisdictionCountryName", + NameOID.JURISDICTION_LOCALITY_NAME: "jurisdictionLocalityName", + NameOID.JURISDICTION_STATE_OR_PROVINCE_NAME: ( + "jurisdictionStateOrProvinceName" + ), + NameOID.BUSINESS_CATEGORY: "businessCategory", + NameOID.POSTAL_ADDRESS: "postalAddress", + NameOID.POSTAL_CODE: "postalCode", + + SignatureAlgorithmOID.RSA_WITH_MD5: "md5WithRSAEncryption", + SignatureAlgorithmOID.RSA_WITH_SHA1: "sha1WithRSAEncryption", + SignatureAlgorithmOID.RSA_WITH_SHA224: "sha224WithRSAEncryption", + SignatureAlgorithmOID.RSA_WITH_SHA256: "sha256WithRSAEncryption", + SignatureAlgorithmOID.RSA_WITH_SHA384: "sha384WithRSAEncryption", + SignatureAlgorithmOID.RSA_WITH_SHA512: "sha512WithRSAEncryption", + SignatureAlgorithmOID.RSASSA_PSS: "RSASSA-PSS", + SignatureAlgorithmOID.ECDSA_WITH_SHA1: "ecdsa-with-SHA1", + SignatureAlgorithmOID.ECDSA_WITH_SHA224: "ecdsa-with-SHA224", + SignatureAlgorithmOID.ECDSA_WITH_SHA256: "ecdsa-with-SHA256", + SignatureAlgorithmOID.ECDSA_WITH_SHA384: "ecdsa-with-SHA384", + SignatureAlgorithmOID.ECDSA_WITH_SHA512: "ecdsa-with-SHA512", + SignatureAlgorithmOID.DSA_WITH_SHA1: "dsa-with-sha1", + SignatureAlgorithmOID.DSA_WITH_SHA224: "dsa-with-sha224", + SignatureAlgorithmOID.DSA_WITH_SHA256: "dsa-with-sha256", + ExtendedKeyUsageOID.SERVER_AUTH: "serverAuth", + ExtendedKeyUsageOID.CLIENT_AUTH: "clientAuth", + ExtendedKeyUsageOID.CODE_SIGNING: "codeSigning", + ExtendedKeyUsageOID.EMAIL_PROTECTION: "emailProtection", + ExtendedKeyUsageOID.TIME_STAMPING: "timeStamping", + ExtendedKeyUsageOID.OCSP_SIGNING: "OCSPSigning", + ExtensionOID.SUBJECT_DIRECTORY_ATTRIBUTES: "subjectDirectoryAttributes", + ExtensionOID.SUBJECT_KEY_IDENTIFIER: "subjectKeyIdentifier", + ExtensionOID.KEY_USAGE: "keyUsage", + ExtensionOID.SUBJECT_ALTERNATIVE_NAME: "subjectAltName", + ExtensionOID.ISSUER_ALTERNATIVE_NAME: "issuerAltName", + ExtensionOID.BASIC_CONSTRAINTS: "basicConstraints", + ExtensionOID.PRECERT_SIGNED_CERTIFICATE_TIMESTAMPS: ( + "signedCertificateTimestampList" + ), + ExtensionOID.PRECERT_POISON: "ctPoison", + CRLEntryExtensionOID.CRL_REASON: "cRLReason", + CRLEntryExtensionOID.INVALIDITY_DATE: "invalidityDate", + CRLEntryExtensionOID.CERTIFICATE_ISSUER: "certificateIssuer", + ExtensionOID.NAME_CONSTRAINTS: "nameConstraints", + ExtensionOID.CRL_DISTRIBUTION_POINTS: "cRLDistributionPoints", + ExtensionOID.CERTIFICATE_POLICIES: "certificatePolicies", + ExtensionOID.POLICY_MAPPINGS: "policyMappings", + ExtensionOID.AUTHORITY_KEY_IDENTIFIER: "authorityKeyIdentifier", + ExtensionOID.POLICY_CONSTRAINTS: "policyConstraints", + ExtensionOID.EXTENDED_KEY_USAGE: "extendedKeyUsage", + ExtensionOID.FRESHEST_CRL: "freshestCRL", + ExtensionOID.INHIBIT_ANY_POLICY: "inhibitAnyPolicy", + ExtensionOID.ISSUING_DISTRIBUTION_POINT: ( + "issuingDistributionPoint" + ), + ExtensionOID.AUTHORITY_INFORMATION_ACCESS: "authorityInfoAccess", + ExtensionOID.SUBJECT_INFORMATION_ACCESS: "subjectInfoAccess", + ExtensionOID.OCSP_NO_CHECK: "OCSPNoCheck", + ExtensionOID.CRL_NUMBER: "cRLNumber", + ExtensionOID.DELTA_CRL_INDICATOR: "deltaCRLIndicator", + ExtensionOID.TLS_FEATURE: "TLSFeature", + AuthorityInformationAccessOID.OCSP: "OCSP", + AuthorityInformationAccessOID.CA_ISSUERS: "caIssuers", + CertificatePoliciesOID.CPS_QUALIFIER: "id-qt-cps", + CertificatePoliciesOID.CPS_USER_NOTICE: "id-qt-unotice", + OCSPExtensionOID.NONCE: "OCSPNonce", +} diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/LICENSE pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/LICENSE --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/LICENSE 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/LICENSE 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,26 @@ + +Except when otherwise stated (look for LICENSE files in directories or +information at the beginning of each file) all software and +documentation is licensed as follows: + + The MIT License + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or + sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/openssl/src/osrandom_engine.c pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/openssl/src/osrandom_engine.c --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/openssl/src/osrandom_engine.c 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/openssl/src/osrandom_engine.c 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,655 @@ +/* osurandom engine + * + * Windows CryptGenRandom() + * macOS >= 10.12 getentropy() + * OpenBSD 5.6+ getentropy() + * other BSD getentropy() if SYS_getentropy is defined + * Linux 3.17+ getrandom() with fallback to /dev/urandom + * other /dev/urandom with cached fd + * + * The /dev/urandom, getrandom and getentropy code is derived from Python's + * Python/random.c, written by Antoine Pitrou and Victor Stinner. + * + * Copyright 2001-2016 Python Software Foundation; All Rights Reserved. + */ + +#ifdef __linux__ +#include +#endif + +#ifndef OPENSSL_NO_ENGINE +/* OpenSSL has ENGINE support so build the engine. */ +static const char *Cryptography_osrandom_engine_id = "osrandom"; + +/**************************************************************************** + * Windows + */ +#if CRYPTOGRAPHY_OSRANDOM_ENGINE == CRYPTOGRAPHY_OSRANDOM_ENGINE_CRYPTGENRANDOM +static const char *Cryptography_osrandom_engine_name = "osrandom_engine CryptGenRandom()"; +static HCRYPTPROV hCryptProv = 0; + +static int osrandom_init(ENGINE *e) { + if (hCryptProv != 0) { + return 1; + } + if (CryptAcquireContext(&hCryptProv, NULL, NULL, + PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)) { + return 1; + } else { + ERR_Cryptography_OSRandom_error( + CRYPTOGRAPHY_OSRANDOM_F_INIT, + CRYPTOGRAPHY_OSRANDOM_R_CRYPTACQUIRECONTEXT, + __FILE__, __LINE__ + ); + return 0; + } +} + +static int osrandom_rand_bytes(unsigned char *buffer, int size) { + if (hCryptProv == 0) { + return 0; + } + + if (!CryptGenRandom(hCryptProv, (DWORD)size, buffer)) { + ERR_Cryptography_OSRandom_error( + CRYPTOGRAPHY_OSRANDOM_F_RAND_BYTES, + CRYPTOGRAPHY_OSRANDOM_R_CRYPTGENRANDOM, + __FILE__, __LINE__ + ); + return 0; + } + return 1; +} + +static int osrandom_finish(ENGINE *e) { + if (CryptReleaseContext(hCryptProv, 0)) { + hCryptProv = 0; + return 1; + } else { + ERR_Cryptography_OSRandom_error( + CRYPTOGRAPHY_OSRANDOM_F_FINISH, + CRYPTOGRAPHY_OSRANDOM_R_CRYPTRELEASECONTEXT, + __FILE__, __LINE__ + ); + return 0; + } +} + +static int osrandom_rand_status(void) { + return hCryptProv != 0; +} + +static const char *osurandom_get_implementation(void) { + return "CryptGenRandom"; +} + +#endif /* CRYPTOGRAPHY_OSRANDOM_ENGINE_CRYPTGENRANDOM */ + +/**************************************************************************** + * /dev/urandom helpers for all non-BSD Unix platforms + */ +#ifdef CRYPTOGRAPHY_OSRANDOM_NEEDS_DEV_URANDOM + +static struct { + int fd; + dev_t st_dev; + ino_t st_ino; +} urandom_cache = { -1 }; + +static int open_cloexec(const char *path) { + int open_flags = O_RDONLY; +#ifdef O_CLOEXEC + open_flags |= O_CLOEXEC; +#endif + + int fd = open(path, open_flags); + if (fd == -1) { + return -1; + } + +#ifndef O_CLOEXEC + int flags = fcntl(fd, F_GETFD); + if (flags == -1) { + return -1; + } + if (fcntl(fd, F_SETFD, flags | FD_CLOEXEC) == -1) { + return -1; + } +#endif + return fd; +} + +#ifdef __linux__ +/* On Linux, we open("/dev/random") and use poll() to wait until it's readable + * before we read from /dev/urandom, this ensures that we don't read from + * /dev/urandom before the kernel CSPRNG is initialized. This isn't necessary on + * other platforms because they don't have the same _bug_ as Linux does with + * /dev/urandom and early boot. */ +static int wait_on_devrandom(void) { + struct pollfd pfd = {}; + int ret = 0; + int random_fd = open_cloexec("/dev/random"); + if (random_fd < 0) { + return -1; + } + pfd.fd = random_fd; + pfd.events = POLLIN; + pfd.revents = 0; + do { + ret = poll(&pfd, 1, -1); + } while (ret < 0 && (errno == EINTR || errno == EAGAIN)); + close(random_fd); + return ret; +} +#endif + +/* return -1 on error */ +static int dev_urandom_fd(void) { + int fd = -1; + struct stat st; + + /* Check that fd still points to the correct device */ + if (urandom_cache.fd >= 0) { + if (fstat(urandom_cache.fd, &st) + || st.st_dev != urandom_cache.st_dev + || st.st_ino != urandom_cache.st_ino) { + /* Somebody replaced our FD. Invalidate our cache but don't + * close the fd. */ + urandom_cache.fd = -1; + } + } + if (urandom_cache.fd < 0) { +#ifdef __linux__ + if (wait_on_devrandom() < 0) { + goto error; + } +#endif + + fd = open_cloexec("/dev/urandom"); + if (fd < 0) { + goto error; + } + if (fstat(fd, &st)) { + goto error; + } + /* Another thread initialized the fd */ + if (urandom_cache.fd >= 0) { + close(fd); + return urandom_cache.fd; + } + urandom_cache.st_dev = st.st_dev; + urandom_cache.st_ino = st.st_ino; + urandom_cache.fd = fd; + } + return urandom_cache.fd; + + error: + if (fd != -1) { + close(fd); + } + ERR_Cryptography_OSRandom_error( + CRYPTOGRAPHY_OSRANDOM_F_DEV_URANDOM_FD, + CRYPTOGRAPHY_OSRANDOM_R_DEV_URANDOM_OPEN_FAILED, + __FILE__, __LINE__ + ); + return -1; +} + +static int dev_urandom_read(unsigned char *buffer, int size) { + int fd; + int n; + + fd = dev_urandom_fd(); + if (fd < 0) { + return 0; + } + + while (size > 0) { + do { + n = (int)read(fd, buffer, (size_t)size); + } while (n < 0 && errno == EINTR); + + if (n <= 0) { + ERR_Cryptography_OSRandom_error( + CRYPTOGRAPHY_OSRANDOM_F_DEV_URANDOM_READ, + CRYPTOGRAPHY_OSRANDOM_R_DEV_URANDOM_READ_FAILED, + __FILE__, __LINE__ + ); + return 0; + } + buffer += n; + size -= n; + } + return 1; +} + +static void dev_urandom_close(void) { + if (urandom_cache.fd >= 0) { + int fd; + struct stat st; + + if (fstat(urandom_cache.fd, &st) + && st.st_dev == urandom_cache.st_dev + && st.st_ino == urandom_cache.st_ino) { + fd = urandom_cache.fd; + urandom_cache.fd = -1; + close(fd); + } + } +} +#endif /* CRYPTOGRAPHY_OSRANDOM_NEEDS_DEV_URANDOM */ + +/**************************************************************************** + * BSD getentropy + */ +#if CRYPTOGRAPHY_OSRANDOM_ENGINE == CRYPTOGRAPHY_OSRANDOM_ENGINE_GETENTROPY +static const char *Cryptography_osrandom_engine_name = "osrandom_engine getentropy()"; + +static int getentropy_works = CRYPTOGRAPHY_OSRANDOM_GETENTROPY_NOT_INIT; + +static int osrandom_init(ENGINE *e) { +#if !defined(__APPLE__) + getentropy_works = CRYPTOGRAPHY_OSRANDOM_GETENTROPY_WORKS; +#else + if (&getentropy != NULL) { + getentropy_works = CRYPTOGRAPHY_OSRANDOM_GETENTROPY_WORKS; + } else { + getentropy_works = CRYPTOGRAPHY_OSRANDOM_GETENTROPY_FALLBACK; + int fd = dev_urandom_fd(); + if (fd < 0) { + return 0; + } + } +#endif + return 1; +} + +static int osrandom_rand_bytes(unsigned char *buffer, int size) { + int len; + int res; + + switch(getentropy_works) { +#if defined(__APPLE__) + case CRYPTOGRAPHY_OSRANDOM_GETENTROPY_FALLBACK: + return dev_urandom_read(buffer, size); +#endif + case CRYPTOGRAPHY_OSRANDOM_GETENTROPY_WORKS: + while (size > 0) { + /* OpenBSD and macOS restrict maximum buffer size to 256. */ + len = size > 256 ? 256 : size; + res = getentropy(buffer, (size_t)len); + if (res < 0) { + ERR_Cryptography_OSRandom_error( + CRYPTOGRAPHY_OSRANDOM_F_RAND_BYTES, + CRYPTOGRAPHY_OSRANDOM_R_GETENTROPY_FAILED, + __FILE__, __LINE__ + ); + return 0; + } + buffer += len; + size -= len; + } + return 1; + } + __builtin_unreachable(); +} + +static int osrandom_finish(ENGINE *e) { + return 1; +} + +static int osrandom_rand_status(void) { + return 1; +} + +static const char *osurandom_get_implementation(void) { + switch(getentropy_works) { + case CRYPTOGRAPHY_OSRANDOM_GETENTROPY_FALLBACK: + return "/dev/urandom"; + case CRYPTOGRAPHY_OSRANDOM_GETENTROPY_WORKS: + return "getentropy"; + } + __builtin_unreachable(); +} +#endif /* CRYPTOGRAPHY_OSRANDOM_ENGINE_GETENTROPY */ + +/**************************************************************************** + * Linux getrandom engine with fallback to dev_urandom + */ + +#if CRYPTOGRAPHY_OSRANDOM_ENGINE == CRYPTOGRAPHY_OSRANDOM_ENGINE_GETRANDOM +static const char *Cryptography_osrandom_engine_name = "osrandom_engine getrandom()"; + +static int getrandom_works = CRYPTOGRAPHY_OSRANDOM_GETRANDOM_NOT_INIT; + +static int osrandom_init(ENGINE *e) { + /* We try to detect working getrandom until we succeed. */ + if (getrandom_works != CRYPTOGRAPHY_OSRANDOM_GETRANDOM_WORKS) { + long n; + char dest[1]; + /* if the kernel CSPRNG is not initialized this will block */ + n = syscall(SYS_getrandom, dest, sizeof(dest), 0); + if (n == sizeof(dest)) { + getrandom_works = CRYPTOGRAPHY_OSRANDOM_GETRANDOM_WORKS; + } else { + int e = errno; + switch(e) { + case ENOSYS: + /* Fallback: Kernel does not support the syscall. */ + getrandom_works = CRYPTOGRAPHY_OSRANDOM_GETRANDOM_FALLBACK; + break; + case EPERM: + /* Fallback: seccomp prevents syscall */ + getrandom_works = CRYPTOGRAPHY_OSRANDOM_GETRANDOM_FALLBACK; + break; + default: + /* EINTR cannot occur for buflen < 256. */ + ERR_Cryptography_OSRandom_error( + CRYPTOGRAPHY_OSRANDOM_F_INIT, + CRYPTOGRAPHY_OSRANDOM_R_GETRANDOM_INIT_FAILED_UNEXPECTED, + "errno", e + ); + getrandom_works = CRYPTOGRAPHY_OSRANDOM_GETRANDOM_INIT_FAILED; + break; + } + } + } + + /* fallback to dev urandom */ + if (getrandom_works == CRYPTOGRAPHY_OSRANDOM_GETRANDOM_FALLBACK) { + int fd = dev_urandom_fd(); + if (fd < 0) { + return 0; + } + } + return 1; +} + +static int osrandom_rand_bytes(unsigned char *buffer, int size) { + long n; + + switch(getrandom_works) { + case CRYPTOGRAPHY_OSRANDOM_GETRANDOM_INIT_FAILED: + ERR_Cryptography_OSRandom_error( + CRYPTOGRAPHY_OSRANDOM_F_RAND_BYTES, + CRYPTOGRAPHY_OSRANDOM_R_GETRANDOM_INIT_FAILED, + __FILE__, __LINE__ + ); + return 0; + case CRYPTOGRAPHY_OSRANDOM_GETRANDOM_NOT_INIT: + ERR_Cryptography_OSRandom_error( + CRYPTOGRAPHY_OSRANDOM_F_RAND_BYTES, + CRYPTOGRAPHY_OSRANDOM_R_GETRANDOM_NOT_INIT, + __FILE__, __LINE__ + ); + return 0; + case CRYPTOGRAPHY_OSRANDOM_GETRANDOM_FALLBACK: + return dev_urandom_read(buffer, size); + case CRYPTOGRAPHY_OSRANDOM_GETRANDOM_WORKS: + while (size > 0) { + do { + n = syscall(SYS_getrandom, buffer, size, 0); + } while (n < 0 && errno == EINTR); + + if (n <= 0) { + ERR_Cryptography_OSRandom_error( + CRYPTOGRAPHY_OSRANDOM_F_RAND_BYTES, + CRYPTOGRAPHY_OSRANDOM_R_GETRANDOM_FAILED, + __FILE__, __LINE__ + ); + return 0; + } + buffer += n; + size -= (int)n; + } + return 1; + } + __builtin_unreachable(); +} + +static int osrandom_finish(ENGINE *e) { + dev_urandom_close(); + return 1; +} + +static int osrandom_rand_status(void) { + switch(getrandom_works) { + case CRYPTOGRAPHY_OSRANDOM_GETRANDOM_INIT_FAILED: + return 0; + case CRYPTOGRAPHY_OSRANDOM_GETRANDOM_NOT_INIT: + return 0; + case CRYPTOGRAPHY_OSRANDOM_GETRANDOM_FALLBACK: + return urandom_cache.fd >= 0; + case CRYPTOGRAPHY_OSRANDOM_GETRANDOM_WORKS: + return 1; + } + __builtin_unreachable(); +} + +static const char *osurandom_get_implementation(void) { + switch(getrandom_works) { + case CRYPTOGRAPHY_OSRANDOM_GETRANDOM_INIT_FAILED: + return ""; + case CRYPTOGRAPHY_OSRANDOM_GETRANDOM_NOT_INIT: + return ""; + case CRYPTOGRAPHY_OSRANDOM_GETRANDOM_FALLBACK: + return "/dev/urandom"; + case CRYPTOGRAPHY_OSRANDOM_GETRANDOM_WORKS: + return "getrandom"; + } + __builtin_unreachable(); +} +#endif /* CRYPTOGRAPHY_OSRANDOM_ENGINE_GETRANDOM */ + +/**************************************************************************** + * dev_urandom engine for all remaining platforms + */ + +#if CRYPTOGRAPHY_OSRANDOM_ENGINE == CRYPTOGRAPHY_OSRANDOM_ENGINE_DEV_URANDOM +static const char *Cryptography_osrandom_engine_name = "osrandom_engine /dev/urandom"; + +static int osrandom_init(ENGINE *e) { + int fd = dev_urandom_fd(); + if (fd < 0) { + return 0; + } + return 1; +} + +static int osrandom_rand_bytes(unsigned char *buffer, int size) { + return dev_urandom_read(buffer, size); +} + +static int osrandom_finish(ENGINE *e) { + dev_urandom_close(); + return 1; +} + +static int osrandom_rand_status(void) { + return urandom_cache.fd >= 0; +} + +static const char *osurandom_get_implementation(void) { + return "/dev/urandom"; +} +#endif /* CRYPTOGRAPHY_OSRANDOM_ENGINE_DEV_URANDOM */ + +/**************************************************************************** + * ENGINE boiler plate + */ + +/* This replicates the behavior of the OpenSSL FIPS RNG, which returns a + -1 in the event that there is an error when calling RAND_pseudo_bytes. */ +static int osrandom_pseudo_rand_bytes(unsigned char *buffer, int size) { + int res = osrandom_rand_bytes(buffer, size); + if (res == 0) { + return -1; + } else { + return res; + } +} + +static RAND_METHOD osrandom_rand = { + NULL, + osrandom_rand_bytes, + NULL, + NULL, + osrandom_pseudo_rand_bytes, + osrandom_rand_status, +}; + +static const ENGINE_CMD_DEFN osrandom_cmd_defns[] = { + {CRYPTOGRAPHY_OSRANDOM_GET_IMPLEMENTATION, + "get_implementation", + "Get CPRNG implementation.", + ENGINE_CMD_FLAG_NO_INPUT}, + {0, NULL, NULL, 0} +}; + +static int osrandom_ctrl(ENGINE *e, int cmd, long i, void *p, void (*f) (void)) { + const char *name; + size_t len; + + switch (cmd) { + case CRYPTOGRAPHY_OSRANDOM_GET_IMPLEMENTATION: + /* i: buffer size, p: char* buffer */ + name = osurandom_get_implementation(); + len = strlen(name); + if ((p == NULL) && (i == 0)) { + /* return required buffer len */ + return (int)len; + } + if ((p == NULL) || i < 0 || ((size_t)i <= len)) { + /* no buffer or buffer too small */ + ENGINEerr(ENGINE_F_ENGINE_CTRL, ENGINE_R_INVALID_ARGUMENT); + return 0; + } + strncpy((char *)p, name, len); + return (int)len; + default: + ENGINEerr(ENGINE_F_ENGINE_CTRL, ENGINE_R_CTRL_COMMAND_NOT_IMPLEMENTED); + return 0; + } +} + +/* error reporting */ +#define ERR_FUNC(func) ERR_PACK(0, func, 0) +#define ERR_REASON(reason) ERR_PACK(0, 0, reason) + +static ERR_STRING_DATA CRYPTOGRAPHY_OSRANDOM_lib_name[] = { + {0, "osrandom_engine"}, + {0, NULL} +}; + +static ERR_STRING_DATA CRYPTOGRAPHY_OSRANDOM_str_funcs[] = { + {ERR_FUNC(CRYPTOGRAPHY_OSRANDOM_F_INIT), + "osrandom_init"}, + {ERR_FUNC(CRYPTOGRAPHY_OSRANDOM_F_RAND_BYTES), + "osrandom_rand_bytes"}, + {ERR_FUNC(CRYPTOGRAPHY_OSRANDOM_F_FINISH), + "osrandom_finish"}, + {ERR_FUNC(CRYPTOGRAPHY_OSRANDOM_F_DEV_URANDOM_FD), + "dev_urandom_fd"}, + {ERR_FUNC(CRYPTOGRAPHY_OSRANDOM_F_DEV_URANDOM_READ), + "dev_urandom_read"}, + {0, NULL} +}; + +static ERR_STRING_DATA CRYPTOGRAPHY_OSRANDOM_str_reasons[] = { + {ERR_REASON(CRYPTOGRAPHY_OSRANDOM_R_CRYPTACQUIRECONTEXT), + "CryptAcquireContext() failed."}, + {ERR_REASON(CRYPTOGRAPHY_OSRANDOM_R_CRYPTGENRANDOM), + "CryptGenRandom() failed."}, + {ERR_REASON(CRYPTOGRAPHY_OSRANDOM_R_CRYPTRELEASECONTEXT), + "CryptReleaseContext() failed."}, + {ERR_REASON(CRYPTOGRAPHY_OSRANDOM_R_GETENTROPY_FAILED), + "getentropy() failed"}, + {ERR_REASON(CRYPTOGRAPHY_OSRANDOM_R_DEV_URANDOM_OPEN_FAILED), + "open('/dev/urandom') failed."}, + {ERR_REASON(CRYPTOGRAPHY_OSRANDOM_R_DEV_URANDOM_READ_FAILED), + "Reading from /dev/urandom fd failed."}, + {ERR_REASON(CRYPTOGRAPHY_OSRANDOM_R_GETRANDOM_INIT_FAILED), + "getrandom() initialization failed."}, + {ERR_REASON(CRYPTOGRAPHY_OSRANDOM_R_GETRANDOM_INIT_FAILED_UNEXPECTED), + "getrandom() initialization failed with unexpected errno."}, + {ERR_REASON(CRYPTOGRAPHY_OSRANDOM_R_GETRANDOM_FAILED), + "getrandom() syscall failed."}, + {ERR_REASON(CRYPTOGRAPHY_OSRANDOM_R_GETRANDOM_NOT_INIT), + "getrandom() engine was not properly initialized."}, + {0, NULL} +}; + +static int Cryptography_OSRandom_lib_error_code = 0; + +static void ERR_load_Cryptography_OSRandom_strings(void) +{ + if (Cryptography_OSRandom_lib_error_code == 0) { + Cryptography_OSRandom_lib_error_code = ERR_get_next_error_library(); + ERR_load_strings(Cryptography_OSRandom_lib_error_code, + CRYPTOGRAPHY_OSRANDOM_lib_name); + ERR_load_strings(Cryptography_OSRandom_lib_error_code, + CRYPTOGRAPHY_OSRANDOM_str_funcs); + ERR_load_strings(Cryptography_OSRandom_lib_error_code, + CRYPTOGRAPHY_OSRANDOM_str_reasons); + } +} + +static void ERR_Cryptography_OSRandom_error(int function, int reason, + char *file, int line) +{ + ERR_PUT_error(Cryptography_OSRandom_lib_error_code, function, reason, + file, line); +} + +/* Returns 1 if successfully added, 2 if engine has previously been added, + and 0 for error. */ +int Cryptography_add_osrandom_engine(void) { + ENGINE *e; + + ERR_load_Cryptography_OSRandom_strings(); + + e = ENGINE_by_id(Cryptography_osrandom_engine_id); + if (e != NULL) { + ENGINE_free(e); + return 2; + } else { + ERR_clear_error(); + } + + e = ENGINE_new(); + if (e == NULL) { + return 0; + } + if (!ENGINE_set_id(e, Cryptography_osrandom_engine_id) || + !ENGINE_set_name(e, Cryptography_osrandom_engine_name) || + !ENGINE_set_RAND(e, &osrandom_rand) || + !ENGINE_set_init_function(e, osrandom_init) || + !ENGINE_set_finish_function(e, osrandom_finish) || + !ENGINE_set_cmd_defns(e, osrandom_cmd_defns) || + !ENGINE_set_ctrl_function(e, osrandom_ctrl)) { + ENGINE_free(e); + return 0; + } + if (!ENGINE_add(e)) { + ENGINE_free(e); + return 0; + } + if (!ENGINE_free(e)) { + return 0; + } + + return 1; +} + +#else +/* If OpenSSL has no ENGINE support then we don't want + * to compile the osrandom engine, but we do need some + * placeholders */ +static const char *Cryptography_osrandom_engine_id = "no-engine-support"; +static const char *Cryptography_osrandom_engine_name = "osrandom_engine disabled due to no engine support"; + +int Cryptography_add_osrandom_engine(void) { + return 0; +} + +#endif diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/openssl/src/osrandom_engine.h pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/openssl/src/osrandom_engine.h --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/openssl/src/osrandom_engine.h 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/openssl/src/osrandom_engine.h 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,114 @@ +#ifndef OPENSSL_NO_ENGINE +/* OpenSSL has ENGINE support so include all of this. */ +#ifdef _WIN32 + #include +#else + #include + #include + /* for defined(BSD) */ + #include + + #ifdef BSD + /* for SYS_getentropy */ + #include + #endif + + #ifdef __APPLE__ + #include + /* To support weak linking we need to declare this as a weak import even if + * it's not present in sys/random (e.g. macOS < 10.12). */ + extern int getentropy(void *buffer, size_t size) __attribute((weak_import)); + #endif + + #ifdef __linux__ + /* for SYS_getrandom */ + #include + #ifndef GRND_NONBLOCK + #define GRND_NONBLOCK 0x0001 + #endif /* GRND_NONBLOCK */ + + #ifndef SYS_getrandom + /* We only bother to define the constants for platforms where we ship + * wheels, since that's the predominant way you get a situation where + * you don't have SYS_getrandom at compile time but do have the syscall + * at runtime */ + #if defined __x86_64__ + #define SYS_getrandom 318 + #elif defined(__i386__) + #define SYS_getrandom 355 + #endif + #endif + #endif /* __linux__ */ +#endif /* _WIN32 */ + +#define CRYPTOGRAPHY_OSRANDOM_ENGINE_CRYPTGENRANDOM 1 +#define CRYPTOGRAPHY_OSRANDOM_ENGINE_GETENTROPY 2 +#define CRYPTOGRAPHY_OSRANDOM_ENGINE_GETRANDOM 3 +#define CRYPTOGRAPHY_OSRANDOM_ENGINE_DEV_URANDOM 4 + +#ifndef CRYPTOGRAPHY_OSRANDOM_ENGINE + #if defined(_WIN32) + /* Windows */ + #define CRYPTOGRAPHY_OSRANDOM_ENGINE CRYPTOGRAPHY_OSRANDOM_ENGINE_CRYPTGENRANDOM + #elif defined(BSD) && defined(SYS_getentropy) + /* OpenBSD 5.6+ & macOS with SYS_getentropy defined, although < 10.12 will fallback + * to urandom */ + #define CRYPTOGRAPHY_OSRANDOM_ENGINE CRYPTOGRAPHY_OSRANDOM_ENGINE_GETENTROPY + #elif defined(__linux__) && defined(SYS_getrandom) + /* Linux 3.17+ */ + #define CRYPTOGRAPHY_OSRANDOM_ENGINE CRYPTOGRAPHY_OSRANDOM_ENGINE_GETRANDOM + #else + /* Keep this as last entry, fall back to /dev/urandom */ + #define CRYPTOGRAPHY_OSRANDOM_ENGINE CRYPTOGRAPHY_OSRANDOM_ENGINE_DEV_URANDOM + #endif +#endif /* CRYPTOGRAPHY_OSRANDOM_ENGINE */ + +/* Fallbacks need /dev/urandom helper functions. */ +#if CRYPTOGRAPHY_OSRANDOM_ENGINE == CRYPTOGRAPHY_OSRANDOM_ENGINE_GETRANDOM || \ + CRYPTOGRAPHY_OSRANDOM_ENGINE == CRYPTOGRAPHY_OSRANDOM_ENGINE_DEV_URANDOM || \ + (CRYPTOGRAPHY_OSRANDOM_ENGINE == CRYPTOGRAPHY_OSRANDOM_ENGINE_GETENTROPY && \ + defined(__APPLE__)) + #define CRYPTOGRAPHY_OSRANDOM_NEEDS_DEV_URANDOM 1 +#endif + +enum { + CRYPTOGRAPHY_OSRANDOM_GETRANDOM_INIT_FAILED = -2, + CRYPTOGRAPHY_OSRANDOM_GETRANDOM_NOT_INIT, + CRYPTOGRAPHY_OSRANDOM_GETRANDOM_FALLBACK, + CRYPTOGRAPHY_OSRANDOM_GETRANDOM_WORKS +}; + +enum { + CRYPTOGRAPHY_OSRANDOM_GETENTROPY_NOT_INIT, + CRYPTOGRAPHY_OSRANDOM_GETENTROPY_FALLBACK, + CRYPTOGRAPHY_OSRANDOM_GETENTROPY_WORKS +}; + +/* engine ctrl */ +#define CRYPTOGRAPHY_OSRANDOM_GET_IMPLEMENTATION ENGINE_CMD_BASE + +/* error reporting */ +static void ERR_load_Cryptography_OSRandom_strings(void); +static void ERR_Cryptography_OSRandom_error(int function, int reason, + char *file, int line); + +#define CRYPTOGRAPHY_OSRANDOM_F_INIT 100 +#define CRYPTOGRAPHY_OSRANDOM_F_RAND_BYTES 101 +#define CRYPTOGRAPHY_OSRANDOM_F_FINISH 102 +#define CRYPTOGRAPHY_OSRANDOM_F_DEV_URANDOM_FD 300 +#define CRYPTOGRAPHY_OSRANDOM_F_DEV_URANDOM_READ 301 + +#define CRYPTOGRAPHY_OSRANDOM_R_CRYPTACQUIRECONTEXT 100 +#define CRYPTOGRAPHY_OSRANDOM_R_CRYPTGENRANDOM 101 +#define CRYPTOGRAPHY_OSRANDOM_R_CRYPTRELEASECONTEXT 102 + +#define CRYPTOGRAPHY_OSRANDOM_R_GETENTROPY_FAILED 200 + +#define CRYPTOGRAPHY_OSRANDOM_R_DEV_URANDOM_OPEN_FAILED 300 +#define CRYPTOGRAPHY_OSRANDOM_R_DEV_URANDOM_READ_FAILED 301 + +#define CRYPTOGRAPHY_OSRANDOM_R_GETRANDOM_INIT_FAILED 400 +#define CRYPTOGRAPHY_OSRANDOM_R_GETRANDOM_INIT_FAILED_UNEXPECTED 402 +#define CRYPTOGRAPHY_OSRANDOM_R_GETRANDOM_FAILED 403 +#define CRYPTOGRAPHY_OSRANDOM_R_GETRANDOM_NOT_INIT 404 +#endif diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/osx-roots.diff pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/osx-roots.diff --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/osx-roots.diff 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/osx-roots.diff 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,475 @@ +diff -Naur libressl-2.6.2.orig/crypto/Makefile.am libressl-2.6.2/crypto/Makefile.am +--- libressl-2.6.2.orig/crypto/Makefile.am 2017-09-02 01:49:55.000000000 +0200 ++++ libressl-2.6.2/crypto/Makefile.am 2017-10-07 14:05:16.000000000 +0200 +@@ -92,7 +92,7 @@ + -mv crypto_portable.sym.tmp crypto_portable.sym + endif + +-libcrypto_la_LDFLAGS = -version-info @LIBCRYPTO_VERSION@ -no-undefined -export-symbols crypto_portable.sym ++libcrypto_la_LDFLAGS = -version-info @LIBCRYPTO_VERSION@ -no-undefined -export-symbols crypto_portable.sym -framework Security -framework CoreFoundation + libcrypto_la_LIBADD = libcompat.la + if !HAVE_EXPLICIT_BZERO + libcrypto_la_LIBADD += libcompatnoopt.la +@@ -863,6 +863,7 @@ + libcrypto_la_SOURCES += x509/x509_txt.c + libcrypto_la_SOURCES += x509/x509_v3.c + libcrypto_la_SOURCES += x509/x509_vfy.c ++libcrypto_la_SOURCES += x509/x509_vfy_apple.c + libcrypto_la_SOURCES += x509/x509_vpm.c + libcrypto_la_SOURCES += x509/x509cset.c + libcrypto_la_SOURCES += x509/x509name.c +diff -Naur libressl-2.6.2.orig/crypto/Makefile.in libressl-2.6.2/crypto/Makefile.in +--- libressl-2.6.2.orig/crypto/Makefile.in 2017-09-26 06:07:03.000000000 +0200 ++++ libressl-2.6.2/crypto/Makefile.in 2017-10-07 14:05:24.000000000 +0200 +@@ -426,20 +426,20 @@ + x509/x509_err.c x509/x509_ext.c x509/x509_lu.c x509/x509_obj.c \ + x509/x509_r2x.c x509/x509_req.c x509/x509_set.c \ + x509/x509_trs.c x509/x509_txt.c x509/x509_v3.c x509/x509_vfy.c \ +- x509/x509_vpm.c x509/x509cset.c x509/x509name.c \ +- x509/x509rset.c x509/x509spki.c x509/x509type.c x509/x_all.c \ +- x509v3/pcy_cache.c x509v3/pcy_data.c x509v3/pcy_lib.c \ +- x509v3/pcy_map.c x509v3/pcy_node.c x509v3/pcy_tree.c \ +- x509v3/v3_akey.c x509v3/v3_akeya.c x509v3/v3_alt.c \ +- x509v3/v3_bcons.c x509v3/v3_bitst.c x509v3/v3_conf.c \ +- x509v3/v3_cpols.c x509v3/v3_crld.c x509v3/v3_enum.c \ +- x509v3/v3_extku.c x509v3/v3_genn.c x509v3/v3_ia5.c \ +- x509v3/v3_info.c x509v3/v3_int.c x509v3/v3_lib.c \ +- x509v3/v3_ncons.c x509v3/v3_ocsp.c x509v3/v3_pci.c \ +- x509v3/v3_pcia.c x509v3/v3_pcons.c x509v3/v3_pku.c \ +- x509v3/v3_pmaps.c x509v3/v3_prn.c x509v3/v3_purp.c \ +- x509v3/v3_skey.c x509v3/v3_sxnet.c x509v3/v3_utl.c \ +- x509v3/v3err.c ++ x509/x509_vfy_apple.c x509/x509_vpm.c x509/x509cset.c \ ++ x509/x509name.c x509/x509rset.c x509/x509spki.c \ ++ x509/x509type.c x509/x_all.c x509v3/pcy_cache.c \ ++ x509v3/pcy_data.c x509v3/pcy_lib.c x509v3/pcy_map.c \ ++ x509v3/pcy_node.c x509v3/pcy_tree.c x509v3/v3_akey.c \ ++ x509v3/v3_akeya.c x509v3/v3_alt.c x509v3/v3_bcons.c \ ++ x509v3/v3_bitst.c x509v3/v3_conf.c x509v3/v3_cpols.c \ ++ x509v3/v3_crld.c x509v3/v3_enum.c x509v3/v3_extku.c \ ++ x509v3/v3_genn.c x509v3/v3_ia5.c x509v3/v3_info.c \ ++ x509v3/v3_int.c x509v3/v3_lib.c x509v3/v3_ncons.c \ ++ x509v3/v3_ocsp.c x509v3/v3_pci.c x509v3/v3_pcia.c \ ++ x509v3/v3_pcons.c x509v3/v3_pku.c x509v3/v3_pmaps.c \ ++ x509v3/v3_prn.c x509v3/v3_purp.c x509v3/v3_skey.c \ ++ x509v3/v3_sxnet.c x509v3/v3_utl.c x509v3/v3err.c + am__objects_27 = aes/libcrypto_la-aes-elf-x86_64.lo \ + aes/libcrypto_la-bsaes-elf-x86_64.lo \ + aes/libcrypto_la-vpaes-elf-x86_64.lo \ +@@ -759,11 +759,12 @@ + x509/libcrypto_la-x509_r2x.lo x509/libcrypto_la-x509_req.lo \ + x509/libcrypto_la-x509_set.lo x509/libcrypto_la-x509_trs.lo \ + x509/libcrypto_la-x509_txt.lo x509/libcrypto_la-x509_v3.lo \ +- x509/libcrypto_la-x509_vfy.lo x509/libcrypto_la-x509_vpm.lo \ +- x509/libcrypto_la-x509cset.lo x509/libcrypto_la-x509name.lo \ +- x509/libcrypto_la-x509rset.lo x509/libcrypto_la-x509spki.lo \ +- x509/libcrypto_la-x509type.lo x509/libcrypto_la-x_all.lo \ +- x509v3/libcrypto_la-pcy_cache.lo \ ++ x509/libcrypto_la-x509_vfy.lo \ ++ x509/libcrypto_la-x509_vfy_apple.lo \ ++ x509/libcrypto_la-x509_vpm.lo x509/libcrypto_la-x509cset.lo \ ++ x509/libcrypto_la-x509name.lo x509/libcrypto_la-x509rset.lo \ ++ x509/libcrypto_la-x509spki.lo x509/libcrypto_la-x509type.lo \ ++ x509/libcrypto_la-x_all.lo x509v3/libcrypto_la-pcy_cache.lo \ + x509v3/libcrypto_la-pcy_data.lo x509v3/libcrypto_la-pcy_lib.lo \ + x509v3/libcrypto_la-pcy_map.lo x509v3/libcrypto_la-pcy_node.lo \ + x509v3/libcrypto_la-pcy_tree.lo x509v3/libcrypto_la-v3_akey.lo \ +@@ -1000,7 +1001,7 @@ + $(ASM_X86_64_ELF) $(ASM_X86_64_MACOSX) + BUILT_SOURCES = crypto_portable.sym + CLEANFILES = crypto_portable.sym +-libcrypto_la_LDFLAGS = -version-info @LIBCRYPTO_VERSION@ -no-undefined -export-symbols crypto_portable.sym ++libcrypto_la_LDFLAGS = -version-info @LIBCRYPTO_VERSION@ -no-undefined -export-symbols crypto_portable.sym -framework Security -framework CoreFoundation + libcrypto_la_LIBADD = libcompat.la $(am__append_1) + libcrypto_la_CPPFLAGS = $(AM_CPPFLAGS) -DLIBRESSL_INTERNAL \ + -DOPENSSL_NO_HW_PADLOCK $(am__append_2) $(am__append_3) \ +@@ -1272,20 +1273,20 @@ + x509/x509_err.c x509/x509_ext.c x509/x509_lu.c x509/x509_obj.c \ + x509/x509_r2x.c x509/x509_req.c x509/x509_set.c \ + x509/x509_trs.c x509/x509_txt.c x509/x509_v3.c x509/x509_vfy.c \ +- x509/x509_vpm.c x509/x509cset.c x509/x509name.c \ +- x509/x509rset.c x509/x509spki.c x509/x509type.c x509/x_all.c \ +- x509v3/pcy_cache.c x509v3/pcy_data.c x509v3/pcy_lib.c \ +- x509v3/pcy_map.c x509v3/pcy_node.c x509v3/pcy_tree.c \ +- x509v3/v3_akey.c x509v3/v3_akeya.c x509v3/v3_alt.c \ +- x509v3/v3_bcons.c x509v3/v3_bitst.c x509v3/v3_conf.c \ +- x509v3/v3_cpols.c x509v3/v3_crld.c x509v3/v3_enum.c \ +- x509v3/v3_extku.c x509v3/v3_genn.c x509v3/v3_ia5.c \ +- x509v3/v3_info.c x509v3/v3_int.c x509v3/v3_lib.c \ +- x509v3/v3_ncons.c x509v3/v3_ocsp.c x509v3/v3_pci.c \ +- x509v3/v3_pcia.c x509v3/v3_pcons.c x509v3/v3_pku.c \ +- x509v3/v3_pmaps.c x509v3/v3_prn.c x509v3/v3_purp.c \ +- x509v3/v3_skey.c x509v3/v3_sxnet.c x509v3/v3_utl.c \ +- x509v3/v3err.c ++ x509/x509_vfy_apple.c x509/x509_vpm.c x509/x509cset.c \ ++ x509/x509name.c x509/x509rset.c x509/x509spki.c \ ++ x509/x509type.c x509/x_all.c x509v3/pcy_cache.c \ ++ x509v3/pcy_data.c x509v3/pcy_lib.c x509v3/pcy_map.c \ ++ x509v3/pcy_node.c x509v3/pcy_tree.c x509v3/v3_akey.c \ ++ x509v3/v3_akeya.c x509v3/v3_alt.c x509v3/v3_bcons.c \ ++ x509v3/v3_bitst.c x509v3/v3_conf.c x509v3/v3_cpols.c \ ++ x509v3/v3_crld.c x509v3/v3_enum.c x509v3/v3_extku.c \ ++ x509v3/v3_genn.c x509v3/v3_ia5.c x509v3/v3_info.c \ ++ x509v3/v3_int.c x509v3/v3_lib.c x509v3/v3_ncons.c \ ++ x509v3/v3_ocsp.c x509v3/v3_pci.c x509v3/v3_pcia.c \ ++ x509v3/v3_pcons.c x509v3/v3_pku.c x509v3/v3_pmaps.c \ ++ x509v3/v3_prn.c x509v3/v3_purp.c x509v3/v3_skey.c \ ++ x509v3/v3_sxnet.c x509v3/v3_utl.c x509v3/v3err.c + + # chacha + +@@ -2808,6 +2809,8 @@ + x509/$(DEPDIR)/$(am__dirstamp) + x509/libcrypto_la-x509_vfy.lo: x509/$(am__dirstamp) \ + x509/$(DEPDIR)/$(am__dirstamp) ++x509/libcrypto_la-x509_vfy_apple.lo: x509/$(am__dirstamp) \ ++ x509/$(DEPDIR)/$(am__dirstamp) + x509/libcrypto_la-x509_vpm.lo: x509/$(am__dirstamp) \ + x509/$(DEPDIR)/$(am__dirstamp) + x509/libcrypto_la-x509cset.lo: x509/$(am__dirstamp) \ +@@ -3583,6 +3586,7 @@ + @AMDEP_TRUE@@am__include@ @am__quote@x509/$(DEPDIR)/libcrypto_la-x509_txt.Plo@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@x509/$(DEPDIR)/libcrypto_la-x509_v3.Plo@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@x509/$(DEPDIR)/libcrypto_la-x509_vfy.Plo@am__quote@ ++@AMDEP_TRUE@@am__include@ @am__quote@x509/$(DEPDIR)/libcrypto_la-x509_vfy_apple.Plo@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@x509/$(DEPDIR)/libcrypto_la-x509_vpm.Plo@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@x509/$(DEPDIR)/libcrypto_la-x509cset.Plo@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@x509/$(DEPDIR)/libcrypto_la-x509name.Plo@am__quote@ +@@ -7460,6 +7464,13 @@ + @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ + @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o x509/libcrypto_la-x509_vfy.lo `test -f 'x509/x509_vfy.c' || echo '$(srcdir)/'`x509/x509_vfy.c + ++x509/libcrypto_la-x509_vfy_apple.lo: x509/x509_vfy_apple.c ++@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT x509/libcrypto_la-x509_vfy_apple.lo -MD -MP -MF x509/$(DEPDIR)/libcrypto_la-x509_vfy_apple.Tpo -c -o x509/libcrypto_la-x509_vfy_apple.lo `test -f 'x509/x509_vfy_apple.c' || echo '$(srcdir)/'`x509/x509_vfy_apple.c ++@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) x509/$(DEPDIR)/libcrypto_la-x509_vfy_apple.Tpo x509/$(DEPDIR)/libcrypto_la-x509_vfy_apple.Plo ++@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='x509/x509_vfy_apple.c' object='x509/libcrypto_la-x509_vfy_apple.lo' libtool=yes @AMDEPBACKSLASH@ ++@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ ++@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o x509/libcrypto_la-x509_vfy_apple.lo `test -f 'x509/x509_vfy_apple.c' || echo '$(srcdir)/'`x509/x509_vfy_apple.c ++ + x509/libcrypto_la-x509_vpm.lo: x509/x509_vpm.c + @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT x509/libcrypto_la-x509_vpm.lo -MD -MP -MF x509/$(DEPDIR)/libcrypto_la-x509_vpm.Tpo -c -o x509/libcrypto_la-x509_vpm.lo `test -f 'x509/x509_vpm.c' || echo '$(srcdir)/'`x509/x509_vpm.c + @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) x509/$(DEPDIR)/libcrypto_la-x509_vpm.Tpo x509/$(DEPDIR)/libcrypto_la-x509_vpm.Plo +diff -Naur libressl-2.6.2.orig/crypto/x509/x509_vfy.c libressl-2.6.2/crypto/x509/x509_vfy.c +--- libressl-2.6.2.orig/crypto/x509/x509_vfy.c 2017-09-02 14:01:08.000000000 +0200 ++++ libressl-2.6.2/crypto/x509/x509_vfy.c 2017-10-07 14:05:16.000000000 +0200 +@@ -115,6 +115,13 @@ + + #define CRL_SCORE_TIME_DELTA 0x002 + ++/* ++ * If we are using Trust Evaluation Agent, rename the original function ++ */ ++#ifdef __APPLE__ ++#define X509_verify_cert X509_verify_cert_orig ++#endif ++ + static int null_callback(int ok, X509_STORE_CTX *e); + static int check_issued(X509_STORE_CTX *ctx, X509 *x, X509 *issuer); + static X509 *find_issuer(X509_STORE_CTX *ctx, STACK_OF(X509) *sk, X509 *x); +diff -Naur libressl-2.6.2.orig/crypto/x509/x509_vfy_apple.c libressl-2.6.2/crypto/x509/x509_vfy_apple.c +--- libressl-2.6.2.orig/crypto/x509/x509_vfy_apple.c 1970-01-01 01:00:00.000000000 +0100 ++++ libressl-2.6.2/crypto/x509/x509_vfy_apple.c 2017-10-07 14:05:16.000000000 +0200 +@@ -0,0 +1,225 @@ ++/* ++ * Copyright (c) 2009 Apple Inc. All Rights Reserved. ++ * ++ * @APPLE_LICENSE_HEADER_START@ ++ * ++ * This file contains Original Code and/or Modifications of Original Code ++ * as defined in and that are subject to the Apple Public Source License ++ * Version 2.0 (the 'License'). You may not use this file except in ++ * compliance with the License. Please obtain a copy of the License at ++ * http://www.opensource.apple.com/apsl/ and read it before using this ++ * file. ++ * ++ * The Original Code and all software distributed under the License are ++ * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER ++ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, ++ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, ++ * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. ++ * Please see the License for the specific language governing rights and ++ * limitations under the License. ++ * ++ * @APPLE_LICENSE_HEADER_END@ ++ * ++ */ ++ ++#include ++#include ++#include ++ ++#include ++ ++#include ++ ++#include ++#include ++#include ++ ++#include "cryptlib.h" ++#include "vpm_int.h" ++#include "x509_vfy_apple.h" ++ ++#define TEA_might_correct_error(err) (err == X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY || err == X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT || err == X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN) ++ ++ ++static bool add_cert_to_array(CFMutableArrayRef array, X509 *x509) ++{ ++ unsigned char *asn1_cert_data = NULL; ++ int asn1_cert_len = i2d_X509(x509, &asn1_cert_data); ++ ++ CFDataRef data = CFDataCreate(kCFAllocatorDefault, asn1_cert_data, asn1_cert_len); ++ ++ if (data == NULL) { ++ return false; ++ } ++ ++ SecCertificateRef cert = SecCertificateCreateWithData(NULL, data); ++ ++ free(asn1_cert_data); ++ ++ if (cert == NULL) { ++ CFRelease(data); ++ return false; ++ } ++ ++ CFArrayAppendValue(array, cert); ++ CFRelease(data); ++ ++ return true; ++} ++ ++static CFStringRef to_string(const char *s) { ++ if (s == NULL) ++ return NULL; ++ return CFStringCreateWithCString(kCFAllocatorDefault, s, ++ kCFStringEncodingASCII); ++} ++ ++static SecPolicyRef get_policy(X509_VERIFY_PARAM *param) { ++ switch (param->purpose) { ++ case X509_PURPOSE_SSL_CLIENT: ++ case X509_PURPOSE_SSL_SERVER: { ++ ++ if (!param->id) { ++ fprintf(stderr, "got no ID!\n"); ++ return NULL; ++ } ++ ++ CFStringRef hostname; ++ int nhosts = sk_OPENSSL_STRING_num(param->id->hosts); ++ ++ if (nhosts != 1) { ++ hostname = NULL; ++ ++ } else { ++ hostname = to_string(sk_OPENSSL_STRING_value(param->id->hosts, 0)); ++ CFShow(hostname); ++ } ++ ++ return SecPolicyCreateSSL(param->purpose == X509_PURPOSE_SSL_SERVER, ++ hostname); ++ } ++ ++ case X509_PURPOSE_NS_SSL_SERVER: ++ case X509_PURPOSE_SMIME_SIGN: ++ case X509_PURPOSE_SMIME_ENCRYPT: ++ case X509_PURPOSE_CRL_SIGN: ++ case X509_PURPOSE_ANY: ++ case X509_PURPOSE_OCSP_HELPER: ++ case X509_PURPOSE_TIMESTAMP_SIGN: ++ default: ++ fprintf(stderr, "unsupported purpose %d", param->purpose); ++ return NULL; ++ } ++} ++ ++/* ++ * Please see comment in x509_vfy_apple.h ++ */ ++int ++X509_verify_cert(X509_STORE_CTX *ctx) ++{ ++ uint64_t certLastIndex = 0; ++ uint64_t i = 0; ++ ++ /* Try OpenSSL, if we get a local certificate issue verify against trusted roots */ ++ int ret = X509_verify_cert_orig(ctx); ++ ++ /* Verify TEA is enabled and should be used. */ ++ if (0 == X509_TEA_is_enabled() || ++ ret == 1 || !TEA_might_correct_error(ctx->error)) { ++ return ret; ++ } ++ ++ /* Verify that the certificate chain exists, otherwise make it. */ ++ if (ctx->chain == NULL && (ctx->chain = sk_X509_new_null()) == NULL) { ++ fprintf(stderr, "Could not create the certificate chain"); ++ ctx->error = X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY; ++ return -1; ++ } ++ ++ /* Verify chain depth */ ++ certLastIndex = sk_X509_num(ctx->untrusted); ++ if (certLastIndex > ctx->param->depth) { ++ fprintf(stderr, "Pruning certificate chain to %" PRIu64, certLastIndex); ++ certLastIndex = ctx->param->depth; ++ } ++ ++ CFMutableArrayRef certArray = CFArrayCreateMutable(NULL, certLastIndex + 1, NULL); ++ CFRetain(certArray); ++ ++ if (!add_cert_to_array(certArray, ctx->cert)) { ++ fprintf(stderr, "Failed to add certificate to array"); ++ CFRelease(certArray); ++ ctx->error = X509_V_ERR_UNSPECIFIED; ++ return -1; ++ } ++ ++ for (i = 0; i < certLastIndex; ++i) { ++ X509 *t = sk_X509_value(ctx->untrusted, i); ++ if (!add_cert_to_array(certArray, t)) { ++ fprintf(stderr, "Failed to add chain certificate %lld to array", i); ++ CFRelease(certArray); ++ ctx->error = X509_V_ERR_UNSPECIFIED; ++ return 0; ++ } ++ } ++ ++ // We put ASN.1 encoded X509 on the CertificateChain, so we don't call TEACertificateChainSetEncodingHandler ++ SecPolicyRef policy = get_policy(ctx->param); ++ ++ if (policy == NULL) { ++ fprintf(stderr, "Failed to create policy!\n"); ++ CFRelease(certArray); ++ ctx->error = X509_V_ERR_UNSPECIFIED; ++ return -1; ++ } ++ ++ SecTrustRef trust = NULL; ++ ++ if (SecTrustCreateWithCertificates(certArray, policy, &trust) != errSecSuccess) { ++ fprintf(stderr, "Failed to create trust!\n"); ++ CFRelease(certArray); ++ ctx->error = X509_V_ERR_CERT_UNTRUSTED; ++ return -1; ++ } ++ ++ if (ctx->param->flags & X509_V_FLAG_USE_CHECK_TIME) { ++ fprintf(stderr, "Setting time not supported yet?\n"); ++ SecTrustSetVerifyDate(trust, CFDateCreate(NULL, ctx->param->check_time)); ++ } ++ ++ SecTrustResultType result = 0; ++ ++ if (SecTrustEvaluate(trust, &result) != errSecSuccess || result != kSecTrustResultUnspecified) { ++ CFRelease(certArray); ++ ctx->error = X509_V_ERR_CERT_UNTRUSTED; ++ return 0; ++ } ++ ++ CFRelease(certArray); ++ ctx->error = 0; ++ return 1; ++} ++ ++#pragma mark Trust Evaluation Agent ++ ++/* -1: not set ++ * 0: set to false ++ * 1: set to true ++ */ ++static int tea_enabled = -1; ++ ++void ++X509_TEA_set_state(int change) ++{ ++ tea_enabled = (change) ? 1 : 0; ++} ++ ++int ++X509_TEA_is_enabled() ++{ ++ if (tea_enabled < 0) ++ tea_enabled = (NULL == getenv(X509_TEA_ENV_DISABLE)); ++ ++ return tea_enabled != 0; ++} +diff -Naur libressl-2.6.2.orig/crypto/x509/x509_vfy_apple.h libressl-2.6.2/crypto/x509/x509_vfy_apple.h +--- libressl-2.6.2.orig/crypto/x509/x509_vfy_apple.h 1970-01-01 01:00:00.000000000 +0100 ++++ libressl-2.6.2/crypto/x509/x509_vfy_apple.h 2017-10-07 14:05:16.000000000 +0200 +@@ -0,0 +1,74 @@ ++/* ++ * Copyright (c) 2009 Apple Inc. All Rights Reserved. ++ * ++ * @APPLE_LICENSE_HEADER_START@ ++ * ++ * This file contains Original Code and/or Modifications of Original Code ++ * as defined in and that are subject to the Apple Public Source License ++ * Version 2.0 (the 'License'). You may not use this file except in ++ * compliance with the License. Please obtain a copy of the License at ++ * http://www.opensource.apple.com/apsl/ and read it before using this ++ * file. ++ * ++ * The Original Code and all software distributed under the License are ++ * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER ++ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, ++ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, ++ * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. ++ * Please see the License for the specific language governing rights and ++ * limitations under the License. ++ * ++ * @APPLE_LICENSE_HEADER_END@ ++ * ++ */ ++ ++#ifndef HEADER_X509_H ++#include ++#endif ++ ++#ifndef HEADER_X509_VFY_APPLE_H ++#define HEADER_X509_VFY_APPLE_H ++ ++/* Environment variable name to disable TEA. */ ++#define X509_TEA_ENV_DISABLE "OPENSSL_X509_TEA_DISABLE" ++ ++/* ++ * X509_verify_cert ++ * ++ * Originally located in x509_vfy.c. ++ * ++ * Verify certificate with OpenSSL created X509_verify_cert. If and only if ++ * OpenSSL cannot get certificate issuer locally then OS X security API will ++ * verify the certificate, using Trust Evaluation Agent. ++ * ++ * Return values: ++ * -------------- ++ * -1: Null was passed for either ctx or ctx->cert. ++ * 0: Certificate is trusted. ++ * 1: Certificate is not trusted. ++ */ ++int X509_verify_cert(X509_STORE_CTX *ctx); ++ ++/* ++ * X509_TEA_is_enabled ++ * ++ * Is the Trust Evaluation Agent (TEA) used for certificate verification when ++ * the issuer cannot be verified. ++ * ++ * Returns 0 if TEA is disabled and 1 if TEA is enabled. ++ */ ++int X509_TEA_is_enabled(); ++ ++/* ++ * X509_TEA_set_state ++ * ++ * Enables/disables certificate verification with Trust Evaluation Agent (TEA) ++ * when the issuer cannot be verified. ++ * ++ * Pass 0 to disable TEA and non-zero to enable TEA. ++ */ ++void X509_TEA_set_state(int change); ++ ++int X509_verify_cert_orig(X509_STORE_CTX *ctx); ++ ++#endif /* HEADER_X509_VFY_APPLE_H */ diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/README.md pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/README.md --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/README.md 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/README.md 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,33 @@ +# PyPy's SSL module + +All of the CFFI code is copied from cryptography. PyPy vendors it's own copy of +the cffi backend thus it renames the compiled shared object to _pypy_openssl.so +(which means that cryptography can ship their own cffi backend) + +# Modifications to cryptography 2.7 + +- `_cffi_src/openssl/asn1.py` : revert removal of `ASN1_TIME_print`, + `ASN1_ITEM`, `ASN1_ITEM_EXP`, `ASN1_VALUE`, `ASN1_item_d2i` +- `_cffi_src/openssl/bio.py` : revert removal of `BIO_s_file`, `BIO_read_filename` +- `_cffi_src/openssl/evp.py` : revert removal of `EVP_MD_size` +- `_cffi_src/openssl/nid.py` : revert removal of `NID_ad_OCSP`, + `NID_info_access`, `NID_ad_ca_issuers`, `NID_crl_distribution_points` +- `_cffi_src/openssl/pem.py` : revert removal of `PEM_read_bio_X509_AUX` +- `_cffi_src/openssl/x509.py` : revert removal of `X509_get_ext_by_NID`, + `i2d_X509` +- `_cffi_src/openssl/x509v3.py` : revert removal of `X509V3_EXT_get`, + `X509V3_EXT_METHOD` + +# Tests? + +Currently this module is tested using CPython's standard library test suite. + +# Install it into PyPy's source tree + +Copy over all the sources into the folder `lib_pypy/_cffi_ssl/*`. Updating the cffi backend can be simply done by the following command:: + + $ cp -r /src/* . + +# Crpytography version + +Copied over release version `2.7` diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/_stdssl/certificate.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/_stdssl/certificate.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/_stdssl/certificate.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/_stdssl/certificate.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,342 @@ +import warnings +import base64 +import textwrap +from _pypy_openssl import ffi +from _pypy_openssl import lib +from _cffi_ssl._stdssl.utility import _string_from_asn1, _str_with_len, _bytes_with_len +from _cffi_ssl._stdssl.error import ssl_error, pyssl_error + +X509_NAME_MAXLEN = 256 + +def _create_tuple_for_attribute(name, value): + buf = ffi.new("char[]", X509_NAME_MAXLEN) + length = lib.OBJ_obj2txt(buf, X509_NAME_MAXLEN, name, 0) + if length < 0: + raise ssl_error(None) + name = _str_with_len(buf, length) + + buf_ptr = ffi.new("unsigned char**") + length = lib.ASN1_STRING_to_UTF8(buf_ptr, value) + if length < 0: + raise ssl_error(None) + try: + value = _str_with_len(buf_ptr[0], length) + finally: + lib.OPENSSL_free(buf_ptr[0]) + return (name, value) + +def _get_aia_uri(certificate, nid): + info = lib.X509_get_ext_d2i(certificate, lib.NID_info_access, ffi.NULL, ffi.NULL) + if (info == ffi.NULL): + return None; + if lib.sk_ACCESS_DESCRIPTION_num(info) == 0: + lib.sk_ACCESS_DESCRIPTION_free(info) + return None + + lst = [] + count = lib.sk_ACCESS_DESCRIPTION_num(info) + for i in range(count): + ad = lib.sk_ACCESS_DESCRIPTION_value(info, i) + + if lib.OBJ_obj2nid(ad.method) != nid or \ + ad.location.type != lib.GEN_URI: + continue + uri = ad.location.d.uniformResourceIdentifier + ostr = _str_with_len(uri.data, uri.length) + lst.append(ostr) + lib.sk_ACCESS_DESCRIPTION_free(info) + + # convert to tuple or None + if len(lst) == 0: return None + return tuple(lst) + +def _get_peer_alt_names(certificate): + # this code follows the procedure outlined in + # OpenSSL's crypto/x509v3/v3_prn.c:X509v3_EXT_print() + # function to extract the STACK_OF(GENERAL_NAME), + # then iterates through the stack to add the + # names. + peer_alt_names = [] + + if certificate == ffi.NULL: + return None + + # get a memory buffer + biobuf = lib.BIO_new(lib.BIO_s_mem()); + + i = -1 + while True: + i = lib.X509_get_ext_by_NID(certificate, lib.NID_subject_alt_name, i) + if i < 0: + break + + + # now decode the altName + ext = lib.X509_get_ext(certificate, i); + method = lib.X509V3_EXT_get(ext) + if method is ffi.NULL: + raise ssl_error("No method for internalizing subjectAltName!") + + ext_data = lib.X509_EXTENSION_get_data(ext) + ext_data_len = ext_data.length + ext_data_value = ffi.new("unsigned char**", ffi.NULL) + ext_data_value[0] = ext_data.data + + if method.it != ffi.NULL: + names = lib.ASN1_item_d2i(ffi.NULL, ext_data_value, ext_data_len, lib.ASN1_ITEM_ptr(method.it)) + else: + names = method.d2i(ffi.NULL, ext_data_value, ext_data_len) + + names = ffi.cast("GENERAL_NAMES*", names) + count = lib.sk_GENERAL_NAME_num(names) + for j in range(count): + # get a rendering of each name in the set of names + name = lib.sk_GENERAL_NAME_value(names, j); + _type = name.type + if _type == lib.GEN_DIRNAME: + # we special-case DirName as a tuple of + # tuples of attributes + v = _create_tuple_for_X509_NAME(name.d.dirn) + peer_alt_names.append(("DirName", v)) + # GENERAL_NAME_print() doesn't handle NULL bytes in ASN1_string + # correctly, CVE-2013-4238 + elif _type == lib.GEN_EMAIL: + v = _string_from_asn1(name.d.rfc822Name) + peer_alt_names.append(("email", v)) + elif _type == lib.GEN_DNS: + v = _string_from_asn1(name.d.dNSName) + peer_alt_names.append(("DNS", v)) + elif _type == lib.GEN_URI: + v = _string_from_asn1(name.d.uniformResourceIdentifier) + peer_alt_names.append(("URI", v)) + elif _type == lib.GEN_RID: + v = "Registered ID" + buf = ffi.new("char[2048]") + + length = lib.OBJ_obj2txt(buf, 2047, name.d.rid, 0) + if length < 0: + # TODO _setSSLError(NULL, 0, __FILE__, __LINE__); + raise NotImplementedError + elif length >= 2048: + v = "" + else: + v = _str_with_len(buf, length) + peer_alt_names.append(("Registered ID", v)) + else: + # for everything else, we use the OpenSSL print form + if _type not in (lib.GEN_OTHERNAME, lib.GEN_X400, \ + lib.GEN_EDIPARTY, lib.GEN_IPADD, lib.GEN_RID): + warnings.warn("Unknown general type %d" % _type, RuntimeWarning) + continue + lib.BIO_reset(biobuf); + lib.GENERAL_NAME_print(biobuf, name); + v = _bio_get_str(biobuf) + idx = v.find(":") + if idx == -1: + raise ValueError("Invalid value %s", v) + peer_alt_names.append((v[:idx], v[idx+1:])) + + free_func_addr = ffi.addressof(lib, "GENERAL_NAME_free") + lib.sk_GENERAL_NAME_pop_free(names, free_func_addr); + lib.BIO_free(biobuf) + if peer_alt_names is not None: + return tuple(peer_alt_names) + return peer_alt_names + +def _create_tuple_for_X509_NAME(xname): + dn = [] + rdn = [] + rdn_level = -1 + entry_count = lib.X509_NAME_entry_count(xname); + for index_counter in range(entry_count): + entry = lib.X509_NAME_get_entry(xname, index_counter); + + # check to see if we've gotten to a new RDN + _set = lib.Cryptography_X509_NAME_ENTRY_set(entry) + if rdn_level >= 0: + if rdn_level != _set: + dn.append(tuple(rdn)) + rdn = [] + rdn_level = _set + + # now add this attribute to the current RDN + name = lib.X509_NAME_ENTRY_get_object(entry); + value = lib.X509_NAME_ENTRY_get_data(entry); + attr = _create_tuple_for_attribute(name, value); + if attr == ffi.NULL: + raise NotImplementedError + rdn.append(attr) + + # now, there's typically a dangling RDN + if rdn and len(rdn) > 0: + dn.append(tuple(rdn)) + + return tuple(dn) + +def _bio_get_str(biobuf): + bio_buf = ffi.new("char[]", 2048) + length = lib.BIO_gets(biobuf, bio_buf, len(bio_buf)-1) + if length < 0: + if biobuf: lib.BIO_free(biobuf) + raise ssl_error(None) + return _str_with_len(bio_buf, length) + +def _decode_certificate(certificate): + retval = {} + + peer = _create_tuple_for_X509_NAME(lib.X509_get_subject_name(certificate)); + if not peer: + return None + retval["subject"] = peer + + issuer = _create_tuple_for_X509_NAME(lib.X509_get_issuer_name(certificate)); + if not issuer: + return None + retval["issuer"] = issuer + + version = lib.X509_get_version(certificate) + 1 + if version == 0: + return None + retval["version"] = version + + try: + biobuf = lib.BIO_new(lib.BIO_s_mem()); + + lib.BIO_reset(biobuf); + serialNumber = lib.X509_get_serialNumber(certificate); + # should not exceed 20 octets, 160 bits, so buf is big enough + lib.i2a_ASN1_INTEGER(biobuf, serialNumber) + buf = ffi.new("char[]", 2048) + length = lib.BIO_gets(biobuf, buf, len(buf)-1) + if length < 0: + raise ssl_error(None) + retval["serialNumber"] = _str_with_len(buf, length) + + lib.BIO_reset(biobuf); + notBefore = lib.X509_get_notBefore(certificate); + lib.ASN1_TIME_print(biobuf, notBefore); + length = lib.BIO_gets(biobuf, buf, len(buf)-1); + if length < 0: + raise ssl_error(None) + retval["notBefore"] = _str_with_len(buf, length) + + lib.BIO_reset(biobuf); + notAfter = lib.X509_get_notAfter(certificate); + lib.ASN1_TIME_print(biobuf, notAfter); + length = lib.BIO_gets(biobuf, buf, len(buf)-1); + if length < 0: + raise ssl_error(None) + retval["notAfter"] = _str_with_len(buf, length) + + # Now look for subjectAltName + peer_alt_names = _get_peer_alt_names(certificate); + if peer_alt_names is None: + return None + if len(peer_alt_names) > 0: + retval["subjectAltName"] = peer_alt_names + + # Authority Information Access: OCSP URIs + obj = _get_aia_uri(certificate, lib.NID_ad_OCSP) + if obj: + retval["OCSP"] = obj + + obj = _get_aia_uri(certificate, lib.NID_ad_ca_issuers) + if obj: + retval["caIssuers"] = obj + + # CDP (CRL distribution points) + obj = _get_crl_dp(certificate) + if obj: + retval["crlDistributionPoints"] = obj + finally: + lib.BIO_free(biobuf) + + return retval + + +def _get_crl_dp(certificate): + if lib.OPENSSL_VERSION_NUMBER >= 0x10001000: + lib.X509_check_ca(certificate) + dps = lib.X509_get_ext_d2i(certificate, lib.NID_crl_distribution_points, ffi.NULL, ffi.NULL) + if dps is ffi.NULL: + return None + + lst = [] + count = lib.sk_DIST_POINT_num(dps) + for i in range(count): + dp = lib.sk_DIST_POINT_value(dps, i); + gns = dp.distpoint.name.fullname; + + jcount = lib.sk_GENERAL_NAME_num(gns) + for j in range(jcount): + gn = lib.sk_GENERAL_NAME_value(gns, j) + if gn.type != lib.GEN_URI: + continue + + uri = gn.d.uniformResourceIdentifier; + ouri = _str_with_len(uri.data, uri.length) + lst.append(ouri) + + if lib.OPENSSL_VERSION_NUMBER < 0x10001000: + lib.sk_DIST_POINT_free(dps); + + if len(lst) == 0: return None + return tuple(lst) + +def _test_decode_cert(path): + cert = lib.BIO_new(lib.BIO_s_file()) + if cert is ffi.NULL: + lib.BIO_free(cert) + raise ssl_error("Can't malloc memory to read file") + + epath = path.encode() + if lib.BIO_read_filename(cert, epath) <= 0: + lib.BIO_free(cert) + raise ssl_error("Can't open file") + + x = lib.PEM_read_bio_X509(cert, ffi.NULL, ffi.NULL, ffi.NULL) + if x is ffi.NULL: + ssl_error("Error decoding PEM-encoded file") + + retval = _decode_certificate(x) + lib.X509_free(x); + + if cert != ffi.NULL: + lib.BIO_free(cert) + return retval + +PEM_HEADER = "-----BEGIN CERTIFICATE-----" +PEM_FOOTER = "-----END CERTIFICATE-----" + +def PEM_cert_to_DER_cert(pem_cert_string): + """Takes a certificate in ASCII PEM format and returns the + DER-encoded version of it as a byte sequence""" + + if not pem_cert_string.startswith(PEM_HEADER): + raise ValueError("Invalid PEM encoding; must start with %s" + % PEM_HEADER) + if not pem_cert_string.strip().endswith(PEM_FOOTER): + raise ValueError("Invalid PEM encoding; must end with %s" + % PEM_FOOTER) + d = pem_cert_string.strip()[len(PEM_HEADER):-len(PEM_FOOTER)] + return base64.decodebytes(d.encode('ASCII', 'strict')) + +def DER_cert_to_PEM_cert(der_cert_bytes): + """Takes a certificate in binary DER format and returns the + PEM version of it as a string.""" + + f = str(base64.standard_b64encode(der_cert_bytes), 'ASCII', 'strict') + return (PEM_HEADER + '\n' + + textwrap.fill(f, 64) + '\n' + + PEM_FOOTER + '\n') + +def _certificate_to_der(certificate): + buf_ptr = ffi.new("unsigned char**") + buf_ptr[0] = ffi.NULL + length = lib.i2d_X509(certificate, buf_ptr) + if length < 0: + raise ssl_error(None) + try: + return _bytes_with_len(ffi.cast("char*",buf_ptr[0]), length) + finally: + lib.OPENSSL_free(buf_ptr[0]) diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/_stdssl/errorcodes.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/_stdssl/errorcodes.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/_stdssl/errorcodes.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/_stdssl/errorcodes.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,394 @@ +# File generated by tools/make_ssl_data.py +# Generated on 2016-11-10T17:38:59.402032 + +from _pypy_openssl import ffi, lib +_lib_codes = [] +_lib_codes.append(("PEM", lib.ERR_LIB_PEM)) +_lib_codes.append(("SSL", lib.ERR_LIB_SSL)) +_lib_codes.append(("X509", lib.ERR_LIB_X509)) +_error_codes = [] +_error_codes.append(("BAD_BASE64_DECODE", lib.ERR_LIB_PEM, 100)) +_error_codes.append(("BAD_DECRYPT", lib.ERR_LIB_PEM, 101)) +_error_codes.append(("BAD_END_LINE", lib.ERR_LIB_PEM, 102)) +_error_codes.append(("BAD_IV_CHARS", lib.ERR_LIB_PEM, 103)) +_error_codes.append(("BAD_MAGIC_NUMBER", lib.ERR_LIB_PEM, 116)) +_error_codes.append(("BAD_PASSWORD_READ", lib.ERR_LIB_PEM, 104)) +_error_codes.append(("BAD_VERSION_NUMBER", lib.ERR_LIB_PEM, 117)) +_error_codes.append(("BIO_WRITE_FAILURE", lib.ERR_LIB_PEM, 118)) +_error_codes.append(("CIPHER_IS_NULL", lib.ERR_LIB_PEM, 127)) +_error_codes.append(("ERROR_CONVERTING_PRIVATE_KEY", lib.ERR_LIB_PEM, 115)) +_error_codes.append(("EXPECTING_PRIVATE_KEY_BLOB", lib.ERR_LIB_PEM, 119)) +_error_codes.append(("EXPECTING_PUBLIC_KEY_BLOB", lib.ERR_LIB_PEM, 120)) +_error_codes.append(("INCONSISTENT_HEADER", lib.ERR_LIB_PEM, 121)) +_error_codes.append(("KEYBLOB_HEADER_PARSE_ERROR", lib.ERR_LIB_PEM, 122)) +_error_codes.append(("KEYBLOB_TOO_SHORT", lib.ERR_LIB_PEM, 123)) +_error_codes.append(("NOT_DEK_INFO", lib.ERR_LIB_PEM, 105)) +_error_codes.append(("NOT_ENCRYPTED", lib.ERR_LIB_PEM, 106)) +_error_codes.append(("NOT_PROC_TYPE", lib.ERR_LIB_PEM, 107)) +_error_codes.append(("NO_START_LINE", lib.ERR_LIB_PEM, 108)) +_error_codes.append(("PROBLEMS_GETTING_PASSWORD", lib.ERR_LIB_PEM, 109)) +_error_codes.append(("PUBLIC_KEY_NO_RSA", lib.ERR_LIB_PEM, 110)) +_error_codes.append(("PVK_DATA_TOO_SHORT", lib.ERR_LIB_PEM, 124)) +_error_codes.append(("PVK_TOO_SHORT", lib.ERR_LIB_PEM, 125)) +_error_codes.append(("READ_KEY", lib.ERR_LIB_PEM, 111)) +_error_codes.append(("SHORT_HEADER", lib.ERR_LIB_PEM, 112)) +_error_codes.append(("UNSUPPORTED_ENCRYPTION", lib.ERR_LIB_PEM, 114)) +_error_codes.append(("UNSUPPORTED_KEY_COMPONENTS", lib.ERR_LIB_PEM, 126)) +_error_codes.append(("APP_DATA_IN_HANDSHAKE", lib.ERR_LIB_SSL, 100)) +_error_codes.append(("ATTEMPT_TO_REUSE_SESSION_IN_DIFFERENT_CONTEXT", lib.ERR_LIB_SSL, 272)) +_error_codes.append(("BAD_ALERT_RECORD", lib.ERR_LIB_SSL, 101)) +_error_codes.append(("BAD_AUTHENTICATION_TYPE", lib.ERR_LIB_SSL, 102)) +_error_codes.append(("BAD_CHANGE_CIPHER_SPEC", lib.ERR_LIB_SSL, 103)) +_error_codes.append(("BAD_CHECKSUM", lib.ERR_LIB_SSL, 104)) +_error_codes.append(("BAD_DATA", lib.ERR_LIB_SSL, 390)) +_error_codes.append(("BAD_DATA_RETURNED_BY_CALLBACK", lib.ERR_LIB_SSL, 106)) +_error_codes.append(("BAD_DECOMPRESSION", lib.ERR_LIB_SSL, 107)) +_error_codes.append(("BAD_DH_G_LENGTH", lib.ERR_LIB_SSL, 108)) +_error_codes.append(("BAD_DH_PUB_KEY_LENGTH", lib.ERR_LIB_SSL, 109)) +_error_codes.append(("BAD_DH_P_LENGTH", lib.ERR_LIB_SSL, 110)) +_error_codes.append(("BAD_DIGEST_LENGTH", lib.ERR_LIB_SSL, 111)) +_error_codes.append(("BAD_DSA_SIGNATURE", lib.ERR_LIB_SSL, 112)) +_error_codes.append(("BAD_ECC_CERT", lib.ERR_LIB_SSL, 304)) +_error_codes.append(("BAD_ECDSA_SIGNATURE", lib.ERR_LIB_SSL, 305)) +_error_codes.append(("BAD_ECPOINT", lib.ERR_LIB_SSL, 306)) +_error_codes.append(("BAD_HANDSHAKE_LENGTH", lib.ERR_LIB_SSL, 332)) +_error_codes.append(("BAD_HELLO_REQUEST", lib.ERR_LIB_SSL, 105)) +_error_codes.append(("BAD_LENGTH", lib.ERR_LIB_SSL, 271)) +_error_codes.append(("BAD_MAC_DECODE", lib.ERR_LIB_SSL, 113)) +_error_codes.append(("BAD_MAC_LENGTH", lib.ERR_LIB_SSL, 333)) +_error_codes.append(("BAD_MESSAGE_TYPE", lib.ERR_LIB_SSL, 114)) +_error_codes.append(("BAD_PACKET_LENGTH", lib.ERR_LIB_SSL, 115)) +_error_codes.append(("BAD_PROTOCOL_VERSION_NUMBER", lib.ERR_LIB_SSL, 116)) +_error_codes.append(("BAD_PSK_IDENTITY_HINT_LENGTH", lib.ERR_LIB_SSL, 316)) +_error_codes.append(("BAD_RESPONSE_ARGUMENT", lib.ERR_LIB_SSL, 117)) +_error_codes.append(("BAD_RSA_DECRYPT", lib.ERR_LIB_SSL, 118)) +_error_codes.append(("BAD_RSA_ENCRYPT", lib.ERR_LIB_SSL, 119)) +_error_codes.append(("BAD_RSA_E_LENGTH", lib.ERR_LIB_SSL, 120)) +_error_codes.append(("BAD_RSA_MODULUS_LENGTH", lib.ERR_LIB_SSL, 121)) +_error_codes.append(("BAD_RSA_SIGNATURE", lib.ERR_LIB_SSL, 122)) +_error_codes.append(("BAD_SIGNATURE", lib.ERR_LIB_SSL, 123)) +_error_codes.append(("BAD_SRP_A_LENGTH", lib.ERR_LIB_SSL, 347)) +_error_codes.append(("BAD_SRP_B_LENGTH", lib.ERR_LIB_SSL, 348)) +_error_codes.append(("BAD_SRP_G_LENGTH", lib.ERR_LIB_SSL, 349)) +_error_codes.append(("BAD_SRP_N_LENGTH", lib.ERR_LIB_SSL, 350)) +_error_codes.append(("BAD_SRP_PARAMETERS", lib.ERR_LIB_SSL, 371)) +_error_codes.append(("BAD_SRP_S_LENGTH", lib.ERR_LIB_SSL, 351)) +_error_codes.append(("BAD_SRTP_MKI_VALUE", lib.ERR_LIB_SSL, 352)) +_error_codes.append(("BAD_SRTP_PROTECTION_PROFILE_LIST", lib.ERR_LIB_SSL, 353)) +_error_codes.append(("BAD_SSL_FILETYPE", lib.ERR_LIB_SSL, 124)) +_error_codes.append(("BAD_SSL_SESSION_ID_LENGTH", lib.ERR_LIB_SSL, 125)) +_error_codes.append(("BAD_STATE", lib.ERR_LIB_SSL, 126)) +_error_codes.append(("BAD_VALUE", lib.ERR_LIB_SSL, 384)) +_error_codes.append(("BAD_WRITE_RETRY", lib.ERR_LIB_SSL, 127)) +_error_codes.append(("BIO_NOT_SET", lib.ERR_LIB_SSL, 128)) +_error_codes.append(("BLOCK_CIPHER_PAD_IS_WRONG", lib.ERR_LIB_SSL, 129)) +_error_codes.append(("BN_LIB", lib.ERR_LIB_SSL, 130)) +_error_codes.append(("CA_DN_LENGTH_MISMATCH", lib.ERR_LIB_SSL, 131)) +_error_codes.append(("CA_DN_TOO_LONG", lib.ERR_LIB_SSL, 132)) +_error_codes.append(("CA_KEY_TOO_SMALL", lib.ERR_LIB_SSL, 397)) +_error_codes.append(("CA_MD_TOO_WEAK", lib.ERR_LIB_SSL, 398)) +_error_codes.append(("CCS_RECEIVED_EARLY", lib.ERR_LIB_SSL, 133)) +_error_codes.append(("CERTIFICATE_VERIFY_FAILED", lib.ERR_LIB_SSL, 134)) +_error_codes.append(("CERT_CB_ERROR", lib.ERR_LIB_SSL, 377)) +_error_codes.append(("CERT_LENGTH_MISMATCH", lib.ERR_LIB_SSL, 135)) +_error_codes.append(("CHALLENGE_IS_DIFFERENT", lib.ERR_LIB_SSL, 136)) +_error_codes.append(("CIPHER_CODE_WRONG_LENGTH", lib.ERR_LIB_SSL, 137)) +_error_codes.append(("CIPHER_OR_HASH_UNAVAILABLE", lib.ERR_LIB_SSL, 138)) +_error_codes.append(("CIPHER_TABLE_SRC_ERROR", lib.ERR_LIB_SSL, 139)) +_error_codes.append(("CLIENTHELLO_TLSEXT", lib.ERR_LIB_SSL, 226)) +_error_codes.append(("COMPRESSED_LENGTH_TOO_LONG", lib.ERR_LIB_SSL, 140)) +_error_codes.append(("COMPRESSION_DISABLED", lib.ERR_LIB_SSL, 343)) +_error_codes.append(("COMPRESSION_FAILURE", lib.ERR_LIB_SSL, 141)) +_error_codes.append(("COMPRESSION_ID_NOT_WITHIN_PRIVATE_RANGE", lib.ERR_LIB_SSL, 307)) +_error_codes.append(("COMPRESSION_LIBRARY_ERROR", lib.ERR_LIB_SSL, 142)) +_error_codes.append(("CONNECTION_ID_IS_DIFFERENT", lib.ERR_LIB_SSL, 143)) +_error_codes.append(("CONNECTION_TYPE_NOT_SET", lib.ERR_LIB_SSL, 144)) +_error_codes.append(("COOKIE_MISMATCH", lib.ERR_LIB_SSL, 308)) +_error_codes.append(("DATA_BETWEEN_CCS_AND_FINISHED", lib.ERR_LIB_SSL, 145)) +_error_codes.append(("DATA_LENGTH_TOO_LONG", lib.ERR_LIB_SSL, 146)) +_error_codes.append(("DECRYPTION_FAILED", lib.ERR_LIB_SSL, 147)) +_error_codes.append(("DECRYPTION_FAILED_OR_BAD_RECORD_MAC", lib.ERR_LIB_SSL, 281)) +_error_codes.append(("DH_KEY_TOO_SMALL", lib.ERR_LIB_SSL, 372)) +_error_codes.append(("DH_PUBLIC_VALUE_LENGTH_IS_WRONG", lib.ERR_LIB_SSL, 148)) +_error_codes.append(("DIGEST_CHECK_FAILED", lib.ERR_LIB_SSL, 149)) +_error_codes.append(("DTLS_MESSAGE_TOO_BIG", lib.ERR_LIB_SSL, 334)) +_error_codes.append(("DUPLICATE_COMPRESSION_ID", lib.ERR_LIB_SSL, 309)) +_error_codes.append(("ECC_CERT_NOT_FOR_KEY_AGREEMENT", lib.ERR_LIB_SSL, 317)) +_error_codes.append(("ECC_CERT_NOT_FOR_SIGNING", lib.ERR_LIB_SSL, 318)) +_error_codes.append(("ECC_CERT_SHOULD_HAVE_RSA_SIGNATURE", lib.ERR_LIB_SSL, 322)) +_error_codes.append(("ECC_CERT_SHOULD_HAVE_SHA1_SIGNATURE", lib.ERR_LIB_SSL, 323)) +_error_codes.append(("ECDH_REQUIRED_FOR_SUITEB_MODE", lib.ERR_LIB_SSL, 374)) +_error_codes.append(("ECGROUP_TOO_LARGE_FOR_CIPHER", lib.ERR_LIB_SSL, 310)) +_error_codes.append(("EE_KEY_TOO_SMALL", lib.ERR_LIB_SSL, 399)) +_error_codes.append(("EMPTY_SRTP_PROTECTION_PROFILE_LIST", lib.ERR_LIB_SSL, 354)) +_error_codes.append(("ENCRYPTED_LENGTH_TOO_LONG", lib.ERR_LIB_SSL, 150)) +_error_codes.append(("ERROR_GENERATING_TMP_RSA_KEY", lib.ERR_LIB_SSL, 282)) +_error_codes.append(("ERROR_IN_RECEIVED_CIPHER_LIST", lib.ERR_LIB_SSL, 151)) +_error_codes.append(("EXCESSIVE_MESSAGE_SIZE", lib.ERR_LIB_SSL, 152)) +_error_codes.append(("EXTRA_DATA_IN_MESSAGE", lib.ERR_LIB_SSL, 153)) +_error_codes.append(("GOT_A_FIN_BEFORE_A_CCS", lib.ERR_LIB_SSL, 154)) +_error_codes.append(("GOT_NEXT_PROTO_BEFORE_A_CCS", lib.ERR_LIB_SSL, 355)) +_error_codes.append(("GOT_NEXT_PROTO_WITHOUT_EXTENSION", lib.ERR_LIB_SSL, 356)) +_error_codes.append(("HTTPS_PROXY_REQUEST", lib.ERR_LIB_SSL, 155)) +_error_codes.append(("HTTP_REQUEST", lib.ERR_LIB_SSL, 156)) +_error_codes.append(("ILLEGAL_PADDING", lib.ERR_LIB_SSL, 283)) +_error_codes.append(("ILLEGAL_SUITEB_DIGEST", lib.ERR_LIB_SSL, 380)) +_error_codes.append(("INAPPROPRIATE_FALLBACK", lib.ERR_LIB_SSL, 373)) +_error_codes.append(("INCONSISTENT_COMPRESSION", lib.ERR_LIB_SSL, 340)) +_error_codes.append(("INVALID_CHALLENGE_LENGTH", lib.ERR_LIB_SSL, 158)) +_error_codes.append(("INVALID_COMMAND", lib.ERR_LIB_SSL, 280)) +_error_codes.append(("INVALID_COMPRESSION_ALGORITHM", lib.ERR_LIB_SSL, 341)) +_error_codes.append(("INVALID_NULL_CMD_NAME", lib.ERR_LIB_SSL, 385)) +_error_codes.append(("INVALID_PURPOSE", lib.ERR_LIB_SSL, 278)) +_error_codes.append(("INVALID_SERVERINFO_DATA", lib.ERR_LIB_SSL, 388)) +_error_codes.append(("INVALID_SRP_USERNAME", lib.ERR_LIB_SSL, 357)) +_error_codes.append(("INVALID_STATUS_RESPONSE", lib.ERR_LIB_SSL, 328)) +_error_codes.append(("INVALID_TICKET_KEYS_LENGTH", lib.ERR_LIB_SSL, 325)) +_error_codes.append(("KEY_ARG_TOO_LONG", lib.ERR_LIB_SSL, 284)) +_error_codes.append(("KRB5", lib.ERR_LIB_SSL, 285)) +_error_codes.append(("KRB5_C_CC_PRINC", lib.ERR_LIB_SSL, 286)) +_error_codes.append(("KRB5_C_GET_CRED", lib.ERR_LIB_SSL, 287)) +_error_codes.append(("KRB5_C_INIT", lib.ERR_LIB_SSL, 288)) +_error_codes.append(("KRB5_C_MK_REQ", lib.ERR_LIB_SSL, 289)) +_error_codes.append(("KRB5_S_BAD_TICKET", lib.ERR_LIB_SSL, 290)) +_error_codes.append(("KRB5_S_INIT", lib.ERR_LIB_SSL, 291)) +_error_codes.append(("KRB5_S_RD_REQ", lib.ERR_LIB_SSL, 292)) +_error_codes.append(("KRB5_S_TKT_EXPIRED", lib.ERR_LIB_SSL, 293)) +_error_codes.append(("KRB5_S_TKT_NYV", lib.ERR_LIB_SSL, 294)) +_error_codes.append(("KRB5_S_TKT_SKEW", lib.ERR_LIB_SSL, 295)) +_error_codes.append(("LENGTH_MISMATCH", lib.ERR_LIB_SSL, 159)) +_error_codes.append(("LENGTH_TOO_SHORT", lib.ERR_LIB_SSL, 160)) +_error_codes.append(("LIBRARY_BUG", lib.ERR_LIB_SSL, 274)) +_error_codes.append(("LIBRARY_HAS_NO_CIPHERS", lib.ERR_LIB_SSL, 161)) +_error_codes.append(("MESSAGE_TOO_LONG", lib.ERR_LIB_SSL, 296)) +_error_codes.append(("MISSING_DH_DSA_CERT", lib.ERR_LIB_SSL, 162)) +_error_codes.append(("MISSING_DH_KEY", lib.ERR_LIB_SSL, 163)) +_error_codes.append(("MISSING_DH_RSA_CERT", lib.ERR_LIB_SSL, 164)) +_error_codes.append(("MISSING_DSA_SIGNING_CERT", lib.ERR_LIB_SSL, 165)) +_error_codes.append(("MISSING_ECDH_CERT", lib.ERR_LIB_SSL, 382)) +_error_codes.append(("MISSING_ECDSA_SIGNING_CERT", lib.ERR_LIB_SSL, 381)) +_error_codes.append(("MISSING_EXPORT_TMP_DH_KEY", lib.ERR_LIB_SSL, 166)) +_error_codes.append(("MISSING_EXPORT_TMP_RSA_KEY", lib.ERR_LIB_SSL, 167)) +_error_codes.append(("MISSING_RSA_CERTIFICATE", lib.ERR_LIB_SSL, 168)) +_error_codes.append(("MISSING_RSA_ENCRYPTING_CERT", lib.ERR_LIB_SSL, 169)) +_error_codes.append(("MISSING_RSA_SIGNING_CERT", lib.ERR_LIB_SSL, 170)) +_error_codes.append(("MISSING_SRP_PARAM", lib.ERR_LIB_SSL, 358)) +_error_codes.append(("MISSING_TMP_DH_KEY", lib.ERR_LIB_SSL, 171)) +_error_codes.append(("MISSING_TMP_ECDH_KEY", lib.ERR_LIB_SSL, 311)) +_error_codes.append(("MISSING_TMP_RSA_KEY", lib.ERR_LIB_SSL, 172)) +_error_codes.append(("MISSING_TMP_RSA_PKEY", lib.ERR_LIB_SSL, 173)) +_error_codes.append(("MISSING_VERIFY_MESSAGE", lib.ERR_LIB_SSL, 174)) +_error_codes.append(("MULTIPLE_SGC_RESTARTS", lib.ERR_LIB_SSL, 346)) +_error_codes.append(("NON_SSLV2_INITIAL_PACKET", lib.ERR_LIB_SSL, 175)) +_error_codes.append(("NO_CERTIFICATES_RETURNED", lib.ERR_LIB_SSL, 176)) +_error_codes.append(("NO_CERTIFICATE_ASSIGNED", lib.ERR_LIB_SSL, 177)) +_error_codes.append(("NO_CERTIFICATE_RETURNED", lib.ERR_LIB_SSL, 178)) +_error_codes.append(("NO_CERTIFICATE_SET", lib.ERR_LIB_SSL, 179)) +_error_codes.append(("NO_CERTIFICATE_SPECIFIED", lib.ERR_LIB_SSL, 180)) +_error_codes.append(("NO_CIPHERS_AVAILABLE", lib.ERR_LIB_SSL, 181)) +_error_codes.append(("NO_CIPHERS_PASSED", lib.ERR_LIB_SSL, 182)) +_error_codes.append(("NO_CIPHERS_SPECIFIED", lib.ERR_LIB_SSL, 183)) +_error_codes.append(("NO_CIPHER_LIST", lib.ERR_LIB_SSL, 184)) +_error_codes.append(("NO_CIPHER_MATCH", lib.ERR_LIB_SSL, 185)) +_error_codes.append(("NO_CLIENT_CERT_METHOD", lib.ERR_LIB_SSL, 331)) +_error_codes.append(("NO_CLIENT_CERT_RECEIVED", lib.ERR_LIB_SSL, 186)) +_error_codes.append(("NO_COMPRESSION_SPECIFIED", lib.ERR_LIB_SSL, 187)) +_error_codes.append(("NO_GOST_CERTIFICATE_SENT_BY_PEER", lib.ERR_LIB_SSL, 330)) +_error_codes.append(("NO_METHOD_SPECIFIED", lib.ERR_LIB_SSL, 188)) +_error_codes.append(("NO_PEM_EXTENSIONS", lib.ERR_LIB_SSL, 389)) +_error_codes.append(("NO_PRIVATEKEY", lib.ERR_LIB_SSL, 189)) +_error_codes.append(("NO_PRIVATE_KEY_ASSIGNED", lib.ERR_LIB_SSL, 190)) +_error_codes.append(("NO_PROTOCOLS_AVAILABLE", lib.ERR_LIB_SSL, 191)) +_error_codes.append(("NO_PUBLICKEY", lib.ERR_LIB_SSL, 192)) +_error_codes.append(("NO_RENEGOTIATION", lib.ERR_LIB_SSL, 339)) +_error_codes.append(("NO_REQUIRED_DIGEST", lib.ERR_LIB_SSL, 324)) +_error_codes.append(("NO_SHARED_CIPHER", lib.ERR_LIB_SSL, 193)) +_error_codes.append(("NO_SHARED_SIGATURE_ALGORITHMS", lib.ERR_LIB_SSL, 376)) +_error_codes.append(("NO_SRTP_PROFILES", lib.ERR_LIB_SSL, 359)) +_error_codes.append(("NO_VERIFY_CALLBACK", lib.ERR_LIB_SSL, 194)) +_error_codes.append(("NULL_SSL_CTX", lib.ERR_LIB_SSL, 195)) +_error_codes.append(("NULL_SSL_METHOD_PASSED", lib.ERR_LIB_SSL, 196)) +_error_codes.append(("OLD_SESSION_CIPHER_NOT_RETURNED", lib.ERR_LIB_SSL, 197)) +_error_codes.append(("OLD_SESSION_COMPRESSION_ALGORITHM_NOT_RETURNED", lib.ERR_LIB_SSL, 344)) +_error_codes.append(("ONLY_DTLS_1_2_ALLOWED_IN_SUITEB_MODE", lib.ERR_LIB_SSL, 387)) +_error_codes.append(("ONLY_TLS_1_2_ALLOWED_IN_SUITEB_MODE", lib.ERR_LIB_SSL, 379)) +_error_codes.append(("ONLY_TLS_ALLOWED_IN_FIPS_MODE", lib.ERR_LIB_SSL, 297)) +_error_codes.append(("OPAQUE_PRF_INPUT_TOO_LONG", lib.ERR_LIB_SSL, 327)) +_error_codes.append(("PACKET_LENGTH_TOO_LONG", lib.ERR_LIB_SSL, 198)) +_error_codes.append(("PARSE_TLSEXT", lib.ERR_LIB_SSL, 227)) +_error_codes.append(("PATH_TOO_LONG", lib.ERR_LIB_SSL, 270)) +_error_codes.append(("PEER_DID_NOT_RETURN_A_CERTIFICATE", lib.ERR_LIB_SSL, 199)) +_error_codes.append(("PEER_ERROR", lib.ERR_LIB_SSL, 200)) +_error_codes.append(("PEER_ERROR_CERTIFICATE", lib.ERR_LIB_SSL, 201)) +_error_codes.append(("PEER_ERROR_NO_CERTIFICATE", lib.ERR_LIB_SSL, 202)) +_error_codes.append(("PEER_ERROR_NO_CIPHER", lib.ERR_LIB_SSL, 203)) +_error_codes.append(("PEER_ERROR_UNSUPPORTED_CERTIFICATE_TYPE", lib.ERR_LIB_SSL, 204)) +_error_codes.append(("PEM_NAME_BAD_PREFIX", lib.ERR_LIB_SSL, 391)) +_error_codes.append(("PEM_NAME_TOO_SHORT", lib.ERR_LIB_SSL, 392)) +_error_codes.append(("PRE_MAC_LENGTH_TOO_LONG", lib.ERR_LIB_SSL, 205)) +_error_codes.append(("PROBLEMS_MAPPING_CIPHER_FUNCTIONS", lib.ERR_LIB_SSL, 206)) +_error_codes.append(("PROTOCOL_IS_SHUTDOWN", lib.ERR_LIB_SSL, 207)) +_error_codes.append(("PSK_IDENTITY_NOT_FOUND", lib.ERR_LIB_SSL, 223)) +_error_codes.append(("PSK_NO_CLIENT_CB", lib.ERR_LIB_SSL, 224)) +_error_codes.append(("PSK_NO_SERVER_CB", lib.ERR_LIB_SSL, 225)) +_error_codes.append(("PUBLIC_KEY_ENCRYPT_ERROR", lib.ERR_LIB_SSL, 208)) +_error_codes.append(("PUBLIC_KEY_IS_NOT_RSA", lib.ERR_LIB_SSL, 209)) +_error_codes.append(("PUBLIC_KEY_NOT_RSA", lib.ERR_LIB_SSL, 210)) +_error_codes.append(("READ_BIO_NOT_SET", lib.ERR_LIB_SSL, 211)) +_error_codes.append(("READ_TIMEOUT_EXPIRED", lib.ERR_LIB_SSL, 312)) +_error_codes.append(("READ_WRONG_PACKET_TYPE", lib.ERR_LIB_SSL, 212)) +_error_codes.append(("RECORD_LENGTH_MISMATCH", lib.ERR_LIB_SSL, 213)) +_error_codes.append(("RECORD_TOO_LARGE", lib.ERR_LIB_SSL, 214)) +_error_codes.append(("RECORD_TOO_SMALL", lib.ERR_LIB_SSL, 298)) +_error_codes.append(("RENEGOTIATE_EXT_TOO_LONG", lib.ERR_LIB_SSL, 335)) +_error_codes.append(("RENEGOTIATION_ENCODING_ERR", lib.ERR_LIB_SSL, 336)) +_error_codes.append(("RENEGOTIATION_MISMATCH", lib.ERR_LIB_SSL, 337)) +_error_codes.append(("REQUIRED_CIPHER_MISSING", lib.ERR_LIB_SSL, 215)) +_error_codes.append(("REQUIRED_COMPRESSSION_ALGORITHM_MISSING", lib.ERR_LIB_SSL, 342)) +_error_codes.append(("REUSE_CERT_LENGTH_NOT_ZERO", lib.ERR_LIB_SSL, 216)) +_error_codes.append(("REUSE_CERT_TYPE_NOT_ZERO", lib.ERR_LIB_SSL, 217)) +_error_codes.append(("REUSE_CIPHER_LIST_NOT_ZERO", lib.ERR_LIB_SSL, 218)) +_error_codes.append(("SCSV_RECEIVED_WHEN_RENEGOTIATING", lib.ERR_LIB_SSL, 345)) +_error_codes.append(("SERVERHELLO_TLSEXT", lib.ERR_LIB_SSL, 275)) +_error_codes.append(("SESSION_ID_CONTEXT_UNINITIALIZED", lib.ERR_LIB_SSL, 277)) +_error_codes.append(("SHORT_READ", lib.ERR_LIB_SSL, 219)) +_error_codes.append(("SIGNATURE_ALGORITHMS_ERROR", lib.ERR_LIB_SSL, 360)) +_error_codes.append(("SIGNATURE_FOR_NON_SIGNING_CERTIFICATE", lib.ERR_LIB_SSL, 220)) +_error_codes.append(("SRP_A_CALC", lib.ERR_LIB_SSL, 361)) +_error_codes.append(("SRTP_COULD_NOT_ALLOCATE_PROFILES", lib.ERR_LIB_SSL, 362)) +_error_codes.append(("SRTP_PROTECTION_PROFILE_LIST_TOO_LONG", lib.ERR_LIB_SSL, 363)) +_error_codes.append(("SRTP_UNKNOWN_PROTECTION_PROFILE", lib.ERR_LIB_SSL, 364)) +_error_codes.append(("SSL23_DOING_SESSION_ID_REUSE", lib.ERR_LIB_SSL, 221)) +_error_codes.append(("SSL2_CONNECTION_ID_TOO_LONG", lib.ERR_LIB_SSL, 299)) +_error_codes.append(("SSL3_EXT_INVALID_ECPOINTFORMAT", lib.ERR_LIB_SSL, 321)) +_error_codes.append(("SSL3_EXT_INVALID_SERVERNAME", lib.ERR_LIB_SSL, 319)) +_error_codes.append(("SSL3_EXT_INVALID_SERVERNAME_TYPE", lib.ERR_LIB_SSL, 320)) +_error_codes.append(("SSL3_SESSION_ID_TOO_LONG", lib.ERR_LIB_SSL, 300)) +_error_codes.append(("SSL3_SESSION_ID_TOO_SHORT", lib.ERR_LIB_SSL, 222)) +_error_codes.append(("SSLV3_ALERT_BAD_CERTIFICATE", lib.ERR_LIB_SSL, 1042)) +_error_codes.append(("SSLV3_ALERT_BAD_RECORD_MAC", lib.ERR_LIB_SSL, 1020)) +_error_codes.append(("SSLV3_ALERT_CERTIFICATE_EXPIRED", lib.ERR_LIB_SSL, 1045)) +_error_codes.append(("SSLV3_ALERT_CERTIFICATE_REVOKED", lib.ERR_LIB_SSL, 1044)) +_error_codes.append(("SSLV3_ALERT_CERTIFICATE_UNKNOWN", lib.ERR_LIB_SSL, 1046)) +_error_codes.append(("SSLV3_ALERT_DECOMPRESSION_FAILURE", lib.ERR_LIB_SSL, 1030)) +_error_codes.append(("SSLV3_ALERT_HANDSHAKE_FAILURE", lib.ERR_LIB_SSL, 1040)) +_error_codes.append(("SSLV3_ALERT_ILLEGAL_PARAMETER", lib.ERR_LIB_SSL, 1047)) +_error_codes.append(("SSLV3_ALERT_NO_CERTIFICATE", lib.ERR_LIB_SSL, 1041)) +_error_codes.append(("SSLV3_ALERT_UNEXPECTED_MESSAGE", lib.ERR_LIB_SSL, 1010)) +_error_codes.append(("SSLV3_ALERT_UNSUPPORTED_CERTIFICATE", lib.ERR_LIB_SSL, 1043)) +_error_codes.append(("SSL_CTX_HAS_NO_DEFAULT_SSL_VERSION", lib.ERR_LIB_SSL, 228)) +_error_codes.append(("SSL_HANDSHAKE_FAILURE", lib.ERR_LIB_SSL, 229)) +_error_codes.append(("SSL_LIBRARY_HAS_NO_CIPHERS", lib.ERR_LIB_SSL, 230)) +_error_codes.append(("SSL_NEGATIVE_LENGTH", lib.ERR_LIB_SSL, 372)) +_error_codes.append(("SSL_SESSION_ID_CALLBACK_FAILED", lib.ERR_LIB_SSL, 301)) +_error_codes.append(("SSL_SESSION_ID_CONFLICT", lib.ERR_LIB_SSL, 302)) +_error_codes.append(("SSL_SESSION_ID_CONTEXT_TOO_LONG", lib.ERR_LIB_SSL, 273)) +_error_codes.append(("SSL_SESSION_ID_HAS_BAD_LENGTH", lib.ERR_LIB_SSL, 303)) +_error_codes.append(("SSL_SESSION_ID_IS_DIFFERENT", lib.ERR_LIB_SSL, 231)) +_error_codes.append(("TLSV1_ALERT_ACCESS_DENIED", lib.ERR_LIB_SSL, 1049)) +_error_codes.append(("TLSV1_ALERT_DECODE_ERROR", lib.ERR_LIB_SSL, 1050)) +_error_codes.append(("TLSV1_ALERT_DECRYPTION_FAILED", lib.ERR_LIB_SSL, 1021)) +_error_codes.append(("TLSV1_ALERT_DECRYPT_ERROR", lib.ERR_LIB_SSL, 1051)) +_error_codes.append(("TLSV1_ALERT_EXPORT_RESTRICTION", lib.ERR_LIB_SSL, 1060)) +_error_codes.append(("TLSV1_ALERT_INAPPROPRIATE_FALLBACK", lib.ERR_LIB_SSL, 1086)) +_error_codes.append(("TLSV1_ALERT_INSUFFICIENT_SECURITY", lib.ERR_LIB_SSL, 1071)) +_error_codes.append(("TLSV1_ALERT_INTERNAL_ERROR", lib.ERR_LIB_SSL, 1080)) +_error_codes.append(("TLSV1_ALERT_NO_RENEGOTIATION", lib.ERR_LIB_SSL, 1100)) +_error_codes.append(("TLSV1_ALERT_PROTOCOL_VERSION", lib.ERR_LIB_SSL, 1070)) +_error_codes.append(("TLSV1_ALERT_RECORD_OVERFLOW", lib.ERR_LIB_SSL, 1022)) +_error_codes.append(("TLSV1_ALERT_UNKNOWN_CA", lib.ERR_LIB_SSL, 1048)) +_error_codes.append(("TLSV1_ALERT_USER_CANCELLED", lib.ERR_LIB_SSL, 1090)) +_error_codes.append(("TLSV1_BAD_CERTIFICATE_HASH_VALUE", lib.ERR_LIB_SSL, 1114)) +_error_codes.append(("TLSV1_BAD_CERTIFICATE_STATUS_RESPONSE", lib.ERR_LIB_SSL, 1113)) +_error_codes.append(("TLSV1_CERTIFICATE_UNOBTAINABLE", lib.ERR_LIB_SSL, 1111)) +_error_codes.append(("TLSV1_UNRECOGNIZED_NAME", lib.ERR_LIB_SSL, 1112)) +_error_codes.append(("TLSV1_UNSUPPORTED_EXTENSION", lib.ERR_LIB_SSL, 1110)) +_error_codes.append(("TLS_CLIENT_CERT_REQ_WITH_ANON_CIPHER", lib.ERR_LIB_SSL, 232)) +_error_codes.append(("TLS_HEARTBEAT_PEER_DOESNT_ACCEPT", lib.ERR_LIB_SSL, 365)) +_error_codes.append(("TLS_HEARTBEAT_PENDING", lib.ERR_LIB_SSL, 366)) +_error_codes.append(("TLS_ILLEGAL_EXPORTER_LABEL", lib.ERR_LIB_SSL, 367)) +_error_codes.append(("TLS_INVALID_ECPOINTFORMAT_LIST", lib.ERR_LIB_SSL, 157)) +_error_codes.append(("TLS_PEER_DID_NOT_RESPOND_WITH_CERTIFICATE_LIST", lib.ERR_LIB_SSL, 233)) +_error_codes.append(("TLS_RSA_ENCRYPTED_VALUE_LENGTH_IS_WRONG", lib.ERR_LIB_SSL, 234)) +_error_codes.append(("TRIED_TO_USE_UNSUPPORTED_CIPHER", lib.ERR_LIB_SSL, 235)) +_error_codes.append(("UNABLE_TO_DECODE_DH_CERTS", lib.ERR_LIB_SSL, 236)) +_error_codes.append(("UNABLE_TO_DECODE_ECDH_CERTS", lib.ERR_LIB_SSL, 313)) +_error_codes.append(("UNABLE_TO_EXTRACT_PUBLIC_KEY", lib.ERR_LIB_SSL, 237)) +_error_codes.append(("UNABLE_TO_FIND_DH_PARAMETERS", lib.ERR_LIB_SSL, 238)) +_error_codes.append(("UNABLE_TO_FIND_ECDH_PARAMETERS", lib.ERR_LIB_SSL, 314)) +_error_codes.append(("UNABLE_TO_FIND_PUBLIC_KEY_PARAMETERS", lib.ERR_LIB_SSL, 239)) +_error_codes.append(("UNABLE_TO_FIND_SSL_METHOD", lib.ERR_LIB_SSL, 240)) +_error_codes.append(("UNABLE_TO_LOAD_SSL2_MD5_ROUTINES", lib.ERR_LIB_SSL, 241)) +_error_codes.append(("UNABLE_TO_LOAD_SSL3_MD5_ROUTINES", lib.ERR_LIB_SSL, 242)) +_error_codes.append(("UNABLE_TO_LOAD_SSL3_SHA1_ROUTINES", lib.ERR_LIB_SSL, 243)) +_error_codes.append(("UNEXPECTED_MESSAGE", lib.ERR_LIB_SSL, 244)) +_error_codes.append(("UNEXPECTED_RECORD", lib.ERR_LIB_SSL, 245)) +_error_codes.append(("UNINITIALIZED", lib.ERR_LIB_SSL, 276)) +_error_codes.append(("UNKNOWN_ALERT_TYPE", lib.ERR_LIB_SSL, 246)) +_error_codes.append(("UNKNOWN_CERTIFICATE_TYPE", lib.ERR_LIB_SSL, 247)) +_error_codes.append(("UNKNOWN_CIPHER_RETURNED", lib.ERR_LIB_SSL, 248)) +_error_codes.append(("UNKNOWN_CIPHER_TYPE", lib.ERR_LIB_SSL, 249)) +_error_codes.append(("UNKNOWN_CMD_NAME", lib.ERR_LIB_SSL, 386)) +_error_codes.append(("UNKNOWN_DIGEST", lib.ERR_LIB_SSL, 368)) +_error_codes.append(("UNKNOWN_KEY_EXCHANGE_TYPE", lib.ERR_LIB_SSL, 250)) +_error_codes.append(("UNKNOWN_PKEY_TYPE", lib.ERR_LIB_SSL, 251)) +_error_codes.append(("UNKNOWN_PROTOCOL", lib.ERR_LIB_SSL, 252)) +_error_codes.append(("UNKNOWN_REMOTE_ERROR_TYPE", lib.ERR_LIB_SSL, 253)) +_error_codes.append(("UNKNOWN_SSL_VERSION", lib.ERR_LIB_SSL, 254)) +_error_codes.append(("UNKNOWN_STATE", lib.ERR_LIB_SSL, 255)) +_error_codes.append(("UNSAFE_LEGACY_RENEGOTIATION_DISABLED", lib.ERR_LIB_SSL, 338)) +_error_codes.append(("UNSUPPORTED_CIPHER", lib.ERR_LIB_SSL, 256)) +_error_codes.append(("UNSUPPORTED_COMPRESSION_ALGORITHM", lib.ERR_LIB_SSL, 257)) +_error_codes.append(("UNSUPPORTED_DIGEST_TYPE", lib.ERR_LIB_SSL, 326)) +_error_codes.append(("UNSUPPORTED_ELLIPTIC_CURVE", lib.ERR_LIB_SSL, 315)) +_error_codes.append(("UNSUPPORTED_PROTOCOL", lib.ERR_LIB_SSL, 258)) +_error_codes.append(("UNSUPPORTED_SSL_VERSION", lib.ERR_LIB_SSL, 259)) +_error_codes.append(("UNSUPPORTED_STATUS_TYPE", lib.ERR_LIB_SSL, 329)) +_error_codes.append(("USE_SRTP_NOT_NEGOTIATED", lib.ERR_LIB_SSL, 369)) +_error_codes.append(("VERSION_TOO_LOW", lib.ERR_LIB_SSL, 396)) +_error_codes.append(("WRITE_BIO_NOT_SET", lib.ERR_LIB_SSL, 260)) +_error_codes.append(("WRONG_CERTIFICATE_TYPE", lib.ERR_LIB_SSL, 383)) +_error_codes.append(("WRONG_CIPHER_RETURNED", lib.ERR_LIB_SSL, 261)) +_error_codes.append(("WRONG_CURVE", lib.ERR_LIB_SSL, 378)) +_error_codes.append(("WRONG_MESSAGE_TYPE", lib.ERR_LIB_SSL, 262)) +_error_codes.append(("WRONG_NUMBER_OF_KEY_BITS", lib.ERR_LIB_SSL, 263)) +_error_codes.append(("WRONG_SIGNATURE_LENGTH", lib.ERR_LIB_SSL, 264)) +_error_codes.append(("WRONG_SIGNATURE_SIZE", lib.ERR_LIB_SSL, 265)) +_error_codes.append(("WRONG_SIGNATURE_TYPE", lib.ERR_LIB_SSL, 370)) +_error_codes.append(("WRONG_SSL_VERSION", lib.ERR_LIB_SSL, 266)) +_error_codes.append(("WRONG_VERSION_NUMBER", lib.ERR_LIB_SSL, 267)) +_error_codes.append(("X509_LIB", lib.ERR_LIB_SSL, 268)) +_error_codes.append(("X509_VERIFICATION_SETUP_PROBLEMS", lib.ERR_LIB_SSL, 269)) +_error_codes.append(("AKID_MISMATCH", lib.ERR_LIB_X509, 110)) +_error_codes.append(("BAD_X509_FILETYPE", lib.ERR_LIB_X509, 100)) +_error_codes.append(("BASE64_DECODE_ERROR", lib.ERR_LIB_X509, 118)) +_error_codes.append(("CANT_CHECK_DH_KEY", lib.ERR_LIB_X509, 114)) +_error_codes.append(("CERT_ALREADY_IN_HASH_TABLE", lib.ERR_LIB_X509, 101)) +_error_codes.append(("CRL_ALREADY_DELTA", lib.ERR_LIB_X509, 127)) +_error_codes.append(("CRL_VERIFY_FAILURE", lib.ERR_LIB_X509, 131)) +_error_codes.append(("ERR_ASN1_LIB", lib.ERR_LIB_X509, 102)) +_error_codes.append(("IDP_MISMATCH", lib.ERR_LIB_X509, 128)) +_error_codes.append(("INVALID_DIRECTORY", lib.ERR_LIB_X509, 113)) +_error_codes.append(("INVALID_FIELD_NAME", lib.ERR_LIB_X509, 119)) +_error_codes.append(("INVALID_TRUST", lib.ERR_LIB_X509, 123)) +_error_codes.append(("ISSUER_MISMATCH", lib.ERR_LIB_X509, 129)) +_error_codes.append(("KEY_TYPE_MISMATCH", lib.ERR_LIB_X509, 115)) +_error_codes.append(("KEY_VALUES_MISMATCH", lib.ERR_LIB_X509, 116)) +_error_codes.append(("LOADING_CERT_DIR", lib.ERR_LIB_X509, 103)) +_error_codes.append(("LOADING_DEFAULTS", lib.ERR_LIB_X509, 104)) +_error_codes.append(("METHOD_NOT_SUPPORTED", lib.ERR_LIB_X509, 124)) +_error_codes.append(("NEWER_CRL_NOT_NEWER", lib.ERR_LIB_X509, 132)) +_error_codes.append(("NO_CERT_SET_FOR_US_TO_VERIFY", lib.ERR_LIB_X509, 105)) +_error_codes.append(("NO_CRL_NUMBER", lib.ERR_LIB_X509, 130)) +_error_codes.append(("PUBLIC_KEY_DECODE_ERROR", lib.ERR_LIB_X509, 125)) +_error_codes.append(("PUBLIC_KEY_ENCODE_ERROR", lib.ERR_LIB_X509, 126)) +_error_codes.append(("SHOULD_RETRY", lib.ERR_LIB_X509, 106)) +_error_codes.append(("UNABLE_TO_FIND_PARAMETERS_IN_CHAIN", lib.ERR_LIB_X509, 107)) +_error_codes.append(("UNABLE_TO_GET_CERTS_PUBLIC_KEY", lib.ERR_LIB_X509, 108)) +_error_codes.append(("UNKNOWN_KEY_TYPE", lib.ERR_LIB_X509, 117)) +_error_codes.append(("UNKNOWN_NID", lib.ERR_LIB_X509, 109)) +_error_codes.append(("UNKNOWN_PURPOSE_ID", lib.ERR_LIB_X509, 121)) +_error_codes.append(("UNKNOWN_TRUST_ID", lib.ERR_LIB_X509, 120)) +_error_codes.append(("UNSUPPORTED_ALGORITHM", lib.ERR_LIB_X509, 111)) +_error_codes.append(("WRONG_LOOKUP_TYPE", lib.ERR_LIB_X509, 112)) +_error_codes.append(("WRONG_TYPE", lib.ERR_LIB_X509, 122)) diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/_stdssl/error.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/_stdssl/error.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/_stdssl/error.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/_stdssl/error.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,211 @@ +import sys +import os +import traceback +import socket +from _pypy_openssl import ffi +from _pypy_openssl import lib + +from _cffi_ssl._stdssl.utility import _string_from_asn1, _str_to_ffi_buffer, _str_from_buf +from _cffi_ssl._stdssl.errorcodes import _error_codes, _lib_codes + +SSL_ERROR_NONE = 0 +SSL_ERROR_SSL = 1 +SSL_ERROR_WANT_READ = 2 +SSL_ERROR_WANT_WRITE = 3 +SSL_ERROR_WANT_X509_LOOKUP = 4 +SSL_ERROR_SYSCALL = 5 +SSL_ERROR_ZERO_RETURN = 6 +SSL_ERROR_WANT_CONNECT = 7 +# start of non ssl.h errorcodes +SSL_ERROR_EOF = 8 # special case of SSL_ERROR_SYSCALL +SSL_ERROR_NO_SOCKET = 9 # socket has been GC'd +SSL_ERROR_INVALID_ERROR_CODE = 10 + +class SSLError(socket.error): + """ An error occurred in the SSL implementation. """ + def __str__(self): + if self.strerror and isinstance(self.strerror, str): + return self.strerror + return str(self.args) +# these are expected on socket in python2 as well +if sys.version_info[0] < 3: + socket.sslerror = SSLError + for v in [ 'SSL_ERROR_ZERO_RETURN', 'SSL_ERROR_WANT_READ', + 'SSL_ERROR_WANT_WRITE', 'SSL_ERROR_WANT_X509_LOOKUP', 'SSL_ERROR_SYSCALL', + 'SSL_ERROR_SSL', 'SSL_ERROR_WANT_CONNECT', 'SSL_ERROR_EOF', + 'SSL_ERROR_INVALID_ERROR_CODE' ]: + setattr(socket, v, locals()[v]) + +class SSLZeroReturnError(SSLError): + """ SSL/TLS session closed cleanly. """ + +class SSLWantReadError(SSLError): + """ Non-blocking SSL socket needs to read more data + before the requested operation can be completed. + """ + +class SSLWantWriteError(SSLError): + """Non-blocking SSL socket needs to write more data + before the requested operation can be completed. + """ + +class SSLSyscallError(SSLError): + """ System error when attempting SSL operation. """ + +class SSLEOFError(SSLError): + """ SSL/TLS connection terminated abruptly. """ + +def ssl_error(errstr, errcode=0): + if errstr is None: + errcode = lib.ERR_peek_last_error() + try: + return fill_sslerror(SSLError, errcode, errstr, errcode) + finally: + lib.ERR_clear_error() + +ERR_CODES_TO_NAMES = {} +ERR_NAMES_TO_CODES = {} +LIB_CODES_TO_NAMES = {} + +for mnemo, library, reason in _error_codes: + key = (library, reason) + assert mnemo is not None and key is not None + ERR_CODES_TO_NAMES[key] = mnemo + ERR_NAMES_TO_CODES[mnemo] = key + + +for mnemo, number in _lib_codes: + LIB_CODES_TO_NAMES[number] = mnemo + + +# the PySSL_SetError equivalent +def pyssl_error(obj, ret): + errcode = lib.ERR_peek_last_error() + + errstr = "" + errval = 0 + errtype = SSLError + e = lib.ERR_peek_last_error() + + if obj.ssl != ffi.NULL: + err = lib.SSL_get_error(obj.ssl, ret) + + if err == SSL_ERROR_ZERO_RETURN: + errtype = SSLZeroReturnError + errstr = "TLS/SSL connection has been closed" + errval = SSL_ERROR_ZERO_RETURN + elif err == SSL_ERROR_WANT_READ: + errtype = SSLWantReadError + errstr = "The operation did not complete (read)" + errval = SSL_ERROR_WANT_READ + elif err == SSL_ERROR_WANT_WRITE: + errtype = SSLWantWriteError + errstr = "The operation did not complete (write)" + errval = SSL_ERROR_WANT_WRITE + elif err == SSL_ERROR_WANT_X509_LOOKUP: + errstr = "The operation did not complete (X509 lookup)" + errval = SSL_ERROR_WANT_X509_LOOKUP + elif err == SSL_ERROR_WANT_CONNECT: + errstr = "The operation did not complete (connect)" + errval = SSL_ERROR_WANT_CONNECT + elif err == SSL_ERROR_SYSCALL: + if e == 0: + if ret == 0 or obj.socket is None: + errtype = SSLEOFError + errstr = "EOF occurred in violation of protocol" + errval = SSL_ERROR_EOF + elif ret == -1 and obj.socket is not None: + # the underlying BIO reported an I/0 error + lib.ERR_clear_error() + # s = obj.get_socket_or_None() + # XXX: Windows? + errno = ffi.errno + return SSLError(errno, os.strerror(errno)) + else: + errtype = SSLSyscallError + errstr = "Some I/O error occurred" + errval = SSL_ERROR_SYSCALL + else: + errstr = _str_from_buf(lib.ERR_lib_error_string(e)) + errval = SSL_ERROR_SYSCALL + elif err == SSL_ERROR_SSL: + errval = SSL_ERROR_SSL + if errcode != 0: + errstr = _str_from_buf(lib.ERR_lib_error_string(errcode)) + else: + errstr = "A failure in the SSL library occurred" + else: + errstr = "Invalid error code" + errval = SSL_ERROR_INVALID_ERROR_CODE + return fill_sslerror(errtype, errval, errstr, e) + + +def fill_sslerror(errtype, ssl_errno, errstr, errcode): + reason_str = None + lib_str = None + if errcode != 0: + err_lib = lib.ERR_GET_LIB(errcode) + err_reason = lib.ERR_GET_REASON(errcode) + reason_str = ERR_CODES_TO_NAMES.get((err_lib, err_reason), None) + lib_str = LIB_CODES_TO_NAMES.get(err_lib, None) + # Set last part of msg to a lower-case version of reason_str + errstr = _str_from_buf(lib.ERR_reason_error_string(errcode)) + msg = errstr + if not errstr: + msg = "unknown error" + if reason_str and lib_str: + msg = "[%s: %s] %s" % (lib_str, reason_str, errstr) + elif lib_str: + msg = "[%s] %s" % (lib_str, errstr) + + err_value = errtype(ssl_errno, msg) + err_value.reason = reason_str if reason_str else None + err_value.library = lib_str if lib_str else None + return err_value + +def pyerr_write_unraisable(exc, obj): + f = sys.stderr + + if obj: + f.write("Exception ignored in: ") + f.write(repr(obj)) + f.write("\n") + + t, v, tb = sys.exc_info() + traceback.print_tb(tb, file=f) + + assert isinstance(v, Exception) + f.write(t.__module__ + "." + t.__name__) + f.write(": ") + f.write(str(v)) + f.write("\n") + +SSL_AD_NAMES = [ + "ACCESS_DENIED", + "BAD_CERTIFICATE", + "BAD_CERTIFICATE_HASH_VALUE", + "BAD_CERTIFICATE_STATUS_RESPONSE", + "BAD_RECORD_MAC", + "CERTIFICATE_EXPIRED", + "CERTIFICATE_REVOKED", + "CERTIFICATE_UNKNOWN", + "CERTIFICATE_UNOBTAINABLE", + "CLOSE_NOTIFY", + "DECODE_ERROR", + "DECOMPRESSION_FAILURE", + "DECRYPT_ERROR", + "HANDSHAKE_FAILURE", + "ILLEGAL_PARAMETER", + "INSUFFICIENT_SECURITY", + "INTERNAL_ERROR", + "NO_RENEGOTIATION", + "PROTOCOL_VERSION", + "RECORD_OVERFLOW", + "UNEXPECTED_MESSAGE", + "UNKNOWN_CA", + "UNKNOWN_PSK_IDENTITY", + "UNRECOGNIZED_NAME", + "UNSUPPORTED_CERTIFICATE", + "UNSUPPORTED_EXTENSION", + "USER_CANCELLED", +] diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/_stdssl/__init__.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/_stdssl/__init__.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/_stdssl/__init__.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/_stdssl/__init__.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,1729 @@ +import sys +import os +import time +import thread as _thread +import weakref + +try: + from _pypy_openssl import ffi + from _pypy_openssl import lib +except ImportError as e: + import os + msg = "\n\nThe _ssl cffi module either doesn't exist or is incompatible with your machine's shared libraries.\n" + \ + "If you have a compiler installed, you can try to rebuild it by running:\n" + \ + "cd %s\n" % os.path.abspath(os.path.dirname(os.path.dirname(os.path.dirname(__file__)))) + \ + "%s _ssl_build.py\n" % sys.executable + raise ImportError(str(e) + msg) + +from _cffi_ssl._stdssl.certificate import (_test_decode_cert, + _decode_certificate, _certificate_to_der) +from _cffi_ssl._stdssl.utility import (_str_with_len, _bytes_with_len, + _str_to_ffi_buffer, _str_from_buf, _cstr_decode_fs) +from _cffi_ssl._stdssl.error import (ssl_error, pyssl_error, + SSLError, SSLZeroReturnError, SSLWantReadError, + SSLWantWriteError, SSLSyscallError, + SSLEOFError) +from _cffi_ssl._stdssl.error import (SSL_ERROR_NONE, + SSL_ERROR_SSL, SSL_ERROR_WANT_READ, SSL_ERROR_WANT_WRITE, + SSL_ERROR_WANT_X509_LOOKUP, SSL_ERROR_SYSCALL, + SSL_ERROR_ZERO_RETURN, SSL_ERROR_WANT_CONNECT, + SSL_ERROR_EOF, SSL_ERROR_NO_SOCKET, SSL_ERROR_INVALID_ERROR_CODE, + pyerr_write_unraisable) +from _cffi_ssl._stdssl import error +from select import select +import socket + +if sys.platform == 'win32': + from _cffi_ssl._stdssl.win32_extra import enum_certificates, enum_crls + HAVE_POLL = False +else: + from select import poll, POLLIN, POLLOUT + HAVE_POLL = True + +OPENSSL_VERSION = ffi.string(lib.OPENSSL_VERSION_TEXT) +OPENSSL_VERSION_NUMBER = lib.OPENSSL_VERSION_NUMBER +ver = OPENSSL_VERSION_NUMBER +ver, status = divmod(ver, 16) +ver, patch = divmod(ver, 256) +ver, fix = divmod(ver, 256) +ver, minor = divmod(ver, 256) +ver, major = divmod(ver, 256) +version_info = (major, minor, fix, patch, status) +OPENSSL_VERSION_INFO = version_info +_OPENSSL_API_VERSION = version_info +del ver, version_info, status, patch, fix, minor, major + +HAS_ECDH = True +HAS_SNI = bool(lib.Cryptography_HAS_TLSEXT_HOSTNAME) +HAS_ALPN = bool(lib.Cryptography_HAS_ALPN) +HAS_NPN = bool(lib.OPENSSL_NPN_NEGOTIATED) +HAS_TLS_UNIQUE = True + +CLIENT = 0 +SERVER = 1 + +VERIFY_DEFAULT = 0 +VERIFY_CRL_CHECK_LEAF = lib.X509_V_FLAG_CRL_CHECK +VERIFY_CRL_CHECK_CHAIN = lib.X509_V_FLAG_CRL_CHECK | lib.X509_V_FLAG_CRL_CHECK_ALL +VERIFY_X509_STRICT = lib.X509_V_FLAG_X509_STRICT +if lib.Cryptography_HAS_X509_V_FLAG_TRUSTED_FIRST: + VERIFY_X509_TRUSTED_FIRST = lib.X509_V_FLAG_TRUSTED_FIRST + +CERT_NONE = 0 +CERT_OPTIONAL = 1 +CERT_REQUIRED = 2 + +for name in dir(lib): + if name.startswith('SSL_OP'): + value = getattr(lib, name) + if value != 0: + globals()[name[4:]] = getattr(lib, name) + +OP_ALL = lib.SSL_OP_ALL & ~lib.SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS +OP_NO_SSLv2 = lib.SSL_OP_NO_SSLv2 +OP_NO_SSLv3 = lib.SSL_OP_NO_SSLv3 +OP_NO_TLSv1_3 = lib.SSL_OP_NO_TLSv1_3 +if OPENSSL_VERSION_INFO > (1, 1, 0, 0, 0): + # OP_ENABLE_MIDDLEBOX_COMPAT = lib.SSL_OP_ENABLE_MIDDLEBOX_COMPAT + # XXX should be conditionally compiled into lib + OP_ENABLE_MIDDLEBOX_COMPAT = 0x00100000 + + + +SSL_CLIENT = 0 +SSL_SERVER = 1 + +SSL_CB_MAXLEN=128 + +if lib.Cryptography_HAS_SSL2: + PROTOCOL_SSLv2 = 0 +SSLv3_method_ok = False +if lib.Cryptography_HAS_SSL3_METHOD: + # Some Ubuntu systems disable SSLv3 + ctx = lib.SSL_CTX_new(lib.SSLv3_method()) + if ctx: + PROTOCOL_SSLv3 = 1 + lib.SSL_CTX_free(ctx) + SSLv3_method_ok = True + +PROTOCOL_SSLv23 = 2 +PROTOCOL_TLS = PROTOCOL_SSLv23 +PROTOCOL_TLSv1 = 3 +if lib.Cryptography_HAS_TLSv1_2: + PROTOCOL_TLSv1 = 3 + PROTOCOL_TLSv1_1 = 4 + PROTOCOL_TLSv1_2 = 5 +# PROTOCOL_TLS_CLIENT = 0x10 +# PROTOCOL_TLS_SERVER = 0x11 +HAS_TLSv1_3 = bool(lib.Cryptography_HAS_TLSv1_3) + +_PROTOCOL_NAMES = (name for name in dir(lib) if name.startswith('PROTOCOL_')) + +#from enum import IntEnum as _IntEnum +#_IntEnum._convert('_SSLMethod', __name__, +# lambda name: name.startswith('PROTOCOL_')) + +if HAS_TLS_UNIQUE: + CHANNEL_BINDING_TYPES = ['tls-unique'] +else: + CHANNEL_BINDING_TYPES = [] + +for name in error.SSL_AD_NAMES: + lib_attr = 'SSL_AD_' + name + attr = 'ALERT_DESCRIPTION_' + name + if hasattr(lib, lib_attr): + globals()[attr] = getattr(lib, lib_attr) + +# init open ssl +lib.SSL_load_error_strings() +lib.SSL_library_init() +if (lib.Cryptography_HAS_LOCKING_CALLBACKS and + lib.CRYPTO_get_locking_callback() == ffi.NULL): + lib.Cryptography_setup_ssl_threads() +lib.OpenSSL_add_all_algorithms() + +def check_signals(): + # nothing to do, we are on python level, signals are + # checked frequently in the bytecode dispatch loop + pass + +def _socket_timeout(s): + if s is None: + return 0.0 + t = s.gettimeout() + if t is None: + return -1.0 + return t + +class PasswordInfo(object): + callable = None + password = None + operationerror = None + handle = None +PWINFO_STORAGE = {} + +def _Cryptography_pem_password_cb(buf, size, rwflag, userdata): + pw_info = ffi.from_handle(userdata) + + password = pw_info.password + + if pw_info.callable: + try: + password = pw_info.callable() + except Exception as e: + pw_info.operationerror = e + return 0 + + if not isinstance(password, (str, bytes, bytearray)): + pw_info.operationerror = TypeError("password callback must return a string") + return 0 + + password = _str_to_ffi_buffer(password) + + if (len(password) > size): + pw_info.operationerror = ValueError("password cannot be longer than %d bytes" % size) + return 0 + + ffi.memmove(buf, password, len(password)) + return len(password) + +if 0: # lib.Cryptography_STATIC_CALLBACKS: + ffi.def_extern(_Cryptography_pem_password_cb) + Cryptography_pem_password_cb = lib.Cryptography_pem_password_cb +else: + Cryptography_pem_password_cb = ffi.callback("int(char*,int,int,void*)")(_Cryptography_pem_password_cb) + +def _ssl_select(sock, writing, timeout): + if HAVE_POLL: + p = poll() + + # Nothing to do unless we're in timeout mode (not non-blocking) + if sock is None or timeout == 0: + return SOCKET_IS_NONBLOCKING + elif timeout < 0: + t = _socket_timeout(sock) + if t > 0: + return SOCKET_HAS_TIMED_OUT + else: + return SOCKET_IS_BLOCKING + + # Guard against closed socket + if sock.fileno() < 0: + return SOCKET_HAS_BEEN_CLOSED + + # Prefer poll, if available, since you can poll() any fd + # which can't be done with select(). + if HAVE_POLL: + p.register(sock.fileno(), POLLOUT if writing else POLLIN) + + rc = len(p.poll(timeout * 1000.0)) + else: + # currently disabled, see HAVE_POLL + fd = sock.fileno() + #if (!_PyIsSelectable_fd(s->sock_fd)) + # return SOCKET_TOO_LARGE_FOR_SELECT; + if writing: + rr, wr, xr = select([],[fd],[], timeout) + else: + rr, wr, xr = select([fd],[],[], timeout) + rc = len(rr) + len(wr) + if rc != 0: + return SOCKET_OPERATION_OK + return SOCKET_HAS_TIMED_OUT + +SOCKET_IS_NONBLOCKING = 0 +SOCKET_IS_BLOCKING = 1 +SOCKET_HAS_TIMED_OUT = 2 +SOCKET_HAS_BEEN_CLOSED = 3 +SOCKET_TOO_LARGE_FOR_SELECT = 4 +SOCKET_OPERATION_OK = 5 + +class _SSLSocket(object): + + @staticmethod + def _new__ssl_socket(sslctx, sock, socket_type, server_hostname, ssl_sock): + self = _SSLSocket(sslctx) + ctx = sslctx.ctx + self.owner = ssl_sock # weakref + + if server_hostname: + if isinstance(server_hostname, unicode): + server_hostname = server_hostname.encode('idna') + self.server_hostname = server_hostname + + lib.ERR_clear_error() + self.ssl = ssl = ffi.gc(lib.SSL_new(ctx), lib.SSL_free) + + self._app_data_handle = ffi.new_handle(self) + lib.SSL_set_app_data(ssl, ffi.cast("char*", self._app_data_handle)) + if sock: + lib.SSL_set_fd(ssl, sock.fileno()) + else: + # BIOs are reference counted and SSL_set_bio borrows our reference. + # To prevent a double free in memory_bio_dealloc() we need to take an + # extra reference here. + lib.BIO_up_ref(ssl_sock.bio); + lib.BIO_up_ref(ssl_sock.bio); + lib.SSL_set_bio(self.ssl, ssl_sock.bio, ssl_sock.bio) + + mode = lib.SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER + if lib.SSL_MODE_AUTO_RETRY: + mode |= lib.SSL_MODE_AUTO_RETRY + lib.SSL_set_mode(ssl, mode) + + if HAS_TLSv1_3: + if sslctx._post_handshake_auth: + if socket_type == SSL_SERVER: + # bpo-37428: OpenSSL does not ignore SSL_VERIFY_POST_HANDSHAKE. + # Set SSL_VERIFY_POST_HANDSHAKE flag only for server sockets and + # only in combination with SSL_VERIFY_PEER flag. + mode = lib.SSL_CTX_get_verify_mode(lib.SSL_get_SSL_CTX(self.ssl)) + if (mode & lib.SSL_VERIFY_PEER): + verify_cb = lib.SSL_get_verify_callback(self.ssl) + mode |= lib.SSL_VERIFY_POST_HANDSHAKE + lib.SSL_set_verify(ssl, mode, verify_cb) + else: + lib.SSL_set_post_handshake_auth(ssl, 1) + + if HAS_SNI and self.server_hostname: + name = _str_to_ffi_buffer(self.server_hostname) + lib.SSL_set_tlsext_host_name(ssl, name) + + + # If the socket is in non-blocking mode or timeout mode, set the BIO + # to non-blocking mode (blocking is the default) + # + timeout = _socket_timeout(sock) + if sock and timeout >= 0: + lib.BIO_set_nbio(lib.SSL_get_rbio(ssl), 1) + lib.BIO_set_nbio(lib.SSL_get_wbio(ssl), 1) + + if socket_type == SSL_CLIENT: + lib.SSL_set_connect_state(ssl) + else: + lib.SSL_set_accept_state(ssl) + self.socket_type = socket_type + + if sock: + self.socket = weakref.ref(sock) + + return self + + def __init__(self, sslctx): + self.ctx = sslctx + self.peer_cert = ffi.NULL + self.ssl = ffi.NULL + self.shutdown_seen_zero = 0 + self.handshake_done = 0 + self._owner = None + self.server_hostname = None + self.socket = None + + @property + def owner(self): + if self._owner is None: + return None + return self._owner() + + @owner.setter + def owner(self, value): + if value is None: + self._owner = None + else: + self._owner = weakref.ref(value) + + @property + def context(self): + return self.ctx + + @context.setter + def context(self, value): + if isinstance(value, _SSLContext): + if not HAS_SNI: + raise NotImplementedError("setting a socket's " + "context is not supported by your OpenSSL library") + self.ctx = value + lib.SSL_set_SSL_CTX(self.ssl, self.ctx.ctx); + else: + raise TypeError("The value must be a SSLContext") + + @property + def server_side(self): + return self.socket_type == SSL_SERVER + + def do_handshake(self): + sock = self.get_socket_or_connection_gone() + ssl = self.ssl + timeout = _socket_timeout(sock) + if sock: + nonblocking = timeout >= 0 + lib.BIO_set_nbio(lib.SSL_get_rbio(ssl), nonblocking) + lib.BIO_set_nbio(lib.SSL_get_wbio(ssl), nonblocking) + + # Actually negotiate SSL connection + # XXX If SSL_do_handshake() returns 0, it's also a failure. + while True: + # allow threads + ret = lib.SSL_do_handshake(ssl) + err = lib.SSL_get_error(ssl, ret) + # end allow threads + + check_signals() + + if err == SSL_ERROR_WANT_READ: + sockstate = _ssl_select(sock, 0, timeout) + elif err == SSL_ERROR_WANT_WRITE: + sockstate = _ssl_select(sock, 1, timeout) + else: + sockstate = SOCKET_OPERATION_OK + + if sockstate == SOCKET_HAS_TIMED_OUT: + raise SSLError("The handshake operation timed out") + elif sockstate == SOCKET_HAS_BEEN_CLOSED: + raise SSLError("Underlying socket has been closed.") + elif sockstate == SOCKET_TOO_LARGE_FOR_SELECT: + raise SSLError("Underlying socket too large for select().") + elif sockstate == SOCKET_IS_NONBLOCKING: + break + if not (err == SSL_ERROR_WANT_READ or err == SSL_ERROR_WANT_WRITE): + break + if ret < 1: + raise pyssl_error(self, ret) + + peer_cert = lib.SSL_get_peer_certificate(ssl) + if peer_cert != ffi.NULL: + peer_cert = ffi.gc(peer_cert, lib.X509_free) + self.peer_cert = peer_cert + + self.handshake_done = 1 + return None + + def peer_certificate(self, binary_mode): + if not self.handshake_done: + raise ValueError("handshake not done yet") + if self.peer_cert == ffi.NULL: + return None + + if binary_mode: + # return cert in DER-encoded format + return _certificate_to_der(self.peer_cert) + else: + verification = lib.SSL_CTX_get_verify_mode(lib.SSL_get_SSL_CTX(self.ssl)) + if (verification & lib.SSL_VERIFY_PEER) == 0: + return {} + else: + return _decode_certificate(self.peer_cert) + + def write(self, bytestring): + deadline = 0 + b = _str_to_ffi_buffer(bytestring) + sock = self.get_socket_or_connection_gone() + ssl = self.ssl + + if len(b) > sys.maxsize: + raise OverflowError("string longer than %d bytes" % sys.maxsize) + + timeout = _socket_timeout(sock) + if sock: + nonblocking = timeout >= 0 + lib.BIO_set_nbio(lib.SSL_get_rbio(ssl), nonblocking) + lib.BIO_set_nbio(lib.SSL_get_wbio(ssl), nonblocking) + + sockstate = _ssl_select(sock, 1, timeout) + if sockstate == SOCKET_HAS_TIMED_OUT: + raise socket.timeout("The write operation timed out") + elif sockstate == SOCKET_HAS_BEEN_CLOSED: + raise ssl_error("Underlying socket has been closed.") + elif sockstate == SOCKET_TOO_LARGE_FOR_SELECT: + raise ssl_error("Underlying socket too large for select().") + + while True: + length = lib.SSL_write(self.ssl, b, len(b)) + err = lib.SSL_get_error(self.ssl, length) + + check_signals() + + if err == SSL_ERROR_WANT_READ: + sockstate = _ssl_select(sock, 0, timeout) + elif err == SSL_ERROR_WANT_WRITE: + sockstate = _ssl_select(sock, 1, timeout) + else: + sockstate = SOCKET_OPERATION_OK + + if sockstate == SOCKET_HAS_TIMED_OUT: + raise socket.timeout("The write operation timed out") + elif sockstate == SOCKET_HAS_BEEN_CLOSED: + raise ssl_error("Underlying socket has been closed.") + elif sockstate == SOCKET_IS_NONBLOCKING: + break + if not (err == SSL_ERROR_WANT_READ or err == SSL_ERROR_WANT_WRITE): + break + + if length > 0: + return length + else: + raise pyssl_error(self, length) + + def read(self, length, buffer_into=None): + ssl = self.ssl + + if length < 0 and buffer_into is None: + raise ValueError("size should not be negative") + + sock = self.get_socket_or_connection_gone() + + if buffer_into is None: + dest = ffi.new("char[]", length) + if length == 0: + return b"" + mem = dest + else: + mem = ffi.from_buffer(buffer_into) + if length <= 0 or length > len(buffer_into): + length = len(buffer_into) + if length > sys.maxsize: + raise OverflowError("maximum length can't fit in a C 'int'") + if len(buffer_into) == 0: + return 0 + + if sock: + timeout = _socket_timeout(sock) + nonblocking = timeout >= 0 + lib.BIO_set_nbio(lib.SSL_get_rbio(ssl), nonblocking) + lib.BIO_set_nbio(lib.SSL_get_wbio(ssl), nonblocking) + + deadline = 0 + timeout = _socket_timeout(sock) + shutdown = False + while True: + count = lib.SSL_read(self.ssl, mem, length); + err = lib.SSL_get_error(self.ssl, count); + + check_signals() + + if err == SSL_ERROR_WANT_READ: + sockstate = _ssl_select(sock, 0, timeout) + elif err == SSL_ERROR_WANT_WRITE: + sockstate = _ssl_select(sock, 1, timeout) + elif err == SSL_ERROR_ZERO_RETURN and \ + lib.SSL_get_shutdown(self.ssl) == lib.SSL_RECEIVED_SHUTDOWN: + shutdown = True + break; + else: + sockstate = SOCKET_OPERATION_OK + + if sockstate == SOCKET_HAS_TIMED_OUT: + raise socket.timeout("The read operation timed out") + elif sockstate == SOCKET_IS_NONBLOCKING: + break + if not (err == SSL_ERROR_WANT_READ or err == SSL_ERROR_WANT_WRITE): + break + + if count <= 0 and not shutdown: + raise pyssl_error(self, count) + + if not buffer_into: + return _bytes_with_len(dest, count) + + return count + + if HAS_ALPN: + def selected_alpn_protocol(self): + out = ffi.new("const unsigned char **") + outlen = ffi.new("unsigned int*") + + lib.SSL_get0_alpn_selected(self.ssl, out, outlen); + if out[0] == ffi.NULL: + return None + return _str_with_len(out[0], outlen[0]); + + def shared_ciphers(self): + ciphers = lib.SSL_get_ciphers(self.ssl) + if ciphers == ffi.NULL: + return None + res = [] + count = lib.sk_SSL_CIPHER_num(ciphers) + for i in range(count): + tup = cipher_to_tuple(lib.sk_SSL_CIPHER_value(ciphers, i)) + if not tup: + return None + res.append(tup) + return res + + def cipher(self): + if self.ssl == ffi.NULL: + return None + current = lib.SSL_get_current_cipher(self.ssl) + if current == ffi.NULL: + return None + return cipher_to_tuple(current) + + def compression(self): + if not lib.Cryptography_HAS_COMPRESSION or self.ssl == ffi.NULL: + return None + + comp_method = lib.SSL_get_current_compression(self.ssl); + if comp_method == ffi.NULL: # or lib.SSL_COMP_get_type(comp_method) == lib.NID_undef: + return None + short_name = lib.SSL_COMP_get_name(comp_method) + if short_name == ffi.NULL: + return None + return _str_from_buf(short_name) + + def version(self): + if self.ssl == ffi.NULL: + return None + version = _str_from_buf(lib.SSL_get_version(self.ssl)) + if version == "unknown": + return None + return version + + def get_socket_or_None(self): + if self.socket is None: + return None + return self.socket() + + def get_socket_or_connection_gone(self): + """ There are three states: + 1) self.socket is None (In C that would mean: self->Socket == NULL) + 2) self.socket() is None (-> The socket is gone) + 3) self.socket() is not None + This method returns True if there is not weakref object allocated + """ + if self.socket is None: + return None + sock = self.socket() + if not sock: + raise ssl_error("Underlying socket connection gone", SSL_ERROR_NO_SOCKET) + return sock + + def shutdown(self): + sock = self.get_socket_or_None() + nonblocking = False + ssl = self.ssl + + if self.socket is not None: + # Guard against closed socket + sock = self.socket() + if sock is None or sock.fileno() < 0: + raise ssl_error("Underlying socket connection gone", SSL_ERROR_NO_SOCKET) + + timeout = _socket_timeout(sock) + nonblocking = timeout >= 0 + if sock and timeout >= 0: + lib.BIO_set_nbio(lib.SSL_get_rbio(ssl), nonblocking) + lib.BIO_set_nbio(lib.SSL_get_wbio(ssl), nonblocking) + else: + timeout = 0 + + zeros = 0 + + while True: + # Disable read-ahead so that unwrap can work correctly. + # Otherwise OpenSSL might read in too much data, + # eating clear text data that happens to be + # transmitted after the SSL shutdown. + # Should be safe to call repeatedly every time this + # function is used and the shutdown_seen_zero != 0 + # condition is met. + # + if self.shutdown_seen_zero: + lib.SSL_set_read_ahead(self.ssl, 0) + err = lib.SSL_shutdown(self.ssl) + + # If err == 1, a secure shutdown with SSL_shutdown() is complete + if err > 0: + break + if err == 0: + # Don't loop endlessly; instead preserve legacy + # behaviour of trying SSL_shutdown() only twice. + # This looks necessary for OpenSSL < 0.9.8m + zeros += 1 + if zeros > 1: + break + # Shutdown was sent, now try receiving + self.shutdown_seen_zero = 1 + continue + + # Possibly retry shutdown until timeout or failure + ssl_err = lib.SSL_get_error(self.ssl, err) + if ssl_err == SSL_ERROR_WANT_READ: + sockstate = _ssl_select(sock, 0, timeout) + elif ssl_err == SSL_ERROR_WANT_WRITE: + sockstate = _ssl_select(sock, 1, timeout) + else: + break + + if sockstate == SOCKET_HAS_TIMED_OUT: + if ssl_err == SSL_ERROR_WANT_READ: + raise socket.timeout("The read operation timed out") + else: + raise socket.timeout("The write operation timed out") + elif sockstate == SOCKET_TOO_LARGE_FOR_SELECT: + raise ssl_error("Underlying socket too large for select().") + elif sockstate != SOCKET_OPERATION_OK: + # Retain the SSL error code + break; + + if err < 0: + raise pyssl_error(self, err) + if sock: + return sock + else: + return None + + def verify_client_post_handshake(self): + + if not HAS_TLSv1_3: + raise NotImplementedError("Post-handshake auth is not supported by " + "your OpenSSL version.") + err = lib.SSL_verify_client_post_handshake(self.ssl); + if err == 0: + raise pyssl_error(self, err) + + def pending(self): + count = lib.SSL_pending(self.ssl) + if count < 0: + raise pyssl_error(self, count) + else: + return count + + def tls_unique_cb(self): + buf = ffi.new("char[]", SSL_CB_MAXLEN) + + if lib.SSL_session_reused(self.ssl) ^ (not self.server_side): + # if session is resumed XOR we are the client + length = lib.SSL_get_finished(self.ssl, buf, SSL_CB_MAXLEN) + else: + # if a new session XOR we are the server + length = lib.SSL_get_peer_finished(self.ssl, buf, SSL_CB_MAXLEN) + + # It cannot be negative in current OpenSSL version as of July 2011 + if length == 0: + return None + + return _bytes_with_len(buf, length) + + if HAS_NPN: + def selected_npn_protocol(self): + out = ffi.new("unsigned char**") + outlen = ffi.new("unsigned int*") + lib.SSL_get0_next_proto_negotiated(self.ssl, out, outlen) + if (out[0] == ffi.NULL): + return None + return _str_with_len(out[0], outlen[0]) + + @property + def session(self): + "Get / set SSLSession." + return SSLSession(self) + + @session.setter + def session(self, value): + if not isinstance(value, SSLSession): + raise TypeError("Value is not a SSLSession.") + if self.ctx.ctx != value._ctx.ctx: + raise ValueError("Session refers to a different SSLContext.") + if self.socket_type != SSL_CLIENT: + raise ValueError("Cannot set session for server-side SSLSocket.") + if self.handshake_done: + raise ValueError("Cannot set session after handshake.") + if not lib.SSL_set_session(self.ssl, value._session): + raise pyssl_error(self, 0) + + @property + def session_reused(self): + "Was the client session reused during handshake?" + return bool(lib.SSL_session_reused(self.ssl)) + + + +def _fs_decode(name): + return name.decode(sys.getfilesystemencoding()) +def _fs_converter(name): + """ name must not be None """ + if isinstance(name, str): + return name.encode(sys.getfilesystemencoding()) + return bytes(name) + + +def cipher_to_tuple(cipher): + ccipher_name = lib.SSL_CIPHER_get_name(cipher) + if ccipher_name == ffi.NULL: + cipher_name = None + else: + cipher_name = _str_from_buf(ccipher_name) + + ccipher_protocol = lib.SSL_CIPHER_get_version(cipher) + if ccipher_protocol == ffi.NULL: + cipher_protocol = None + else: + cipher_protocol = _str_from_buf(ccipher_protocol) + + bits = lib.SSL_CIPHER_get_bits(cipher, ffi.NULL) + return (cipher_name, cipher_protocol, bits) + +def cipher_to_dict(cipher): + ccipher_name = lib.SSL_CIPHER_get_name(cipher) + buf = ffi.new('char[512]') + alg_bits = ffi.new('int[4]') + if ccipher_name == ffi.NULL: + cipher_name = None + else: + cipher_name = _str_from_buf(ccipher_name) + + ccipher_protocol = lib.SSL_CIPHER_get_version(cipher) + if ccipher_protocol == ffi.NULL: + cipher_protocol = None + else: + cipher_protocol = _str_from_buf(ccipher_protocol) + + cipher_id = lib.SSL_CIPHER_get_id(cipher); + lib.SSL_CIPHER_description(cipher, buf, 511) + description = _str_from_buf(buf) + strength_bits = lib.SSL_CIPHER_get_bits(cipher, alg_bits) + ret = { + 'id' : cipher_id, + 'name' : cipher_name, + 'protocol' : cipher_protocol, + 'description' : description, + 'strength_bits': strength_bits, + 'alg_bits' : alg_bits[0], + } + if OPENSSL_VERSION_INFO > (1, 1, 0, 0, 0): + aead = lib.SSL_CIPHER_is_aead(cipher) + nid = lib.SSL_CIPHER_get_cipher_nid(cipher) + skcipher = lib.OBJ_nid2ln(nid) if nid != lib.NID_undef else None + nid = lib.SSL_CIPHER_get_digest_nid(cipher); + digest = lib.OBJ_nid2ln(nid) if nid != lib.NID_undef else None + nid = lib.SSL_CIPHER_get_kx_nid(cipher); + kx = lib.OBJ_nid2ln(nid) if nid != lib.NID_undef else None + nid = lib.SSL_CIPHER_get_auth_nid(cipher); + auth = lib.OBJ_nid2ln(nid) if nid != lib.NID_undef else None + ret.update({'aead' : bool(aead), + 'symmmetric' : skcipher, + 'digest' : digest, + 'kea' : kx, + 'auth' : auth, + }) + return ret + + +class SSLSession(object): + def __new__(cls, ssl): + self = object.__new__(cls) + session = lib.SSL_get1_session(ssl.ssl) + if not session: + return None + self._session = ffi.gc(session, lib.SSL_SESSION_free) + self._ctx = ssl.ctx + return self + + def __eq__(self, other): + if not isinstance(other, SSLSession): + return NotImplemented; + return self.id == other.id + + @property + def id(self): + lenp = ffi.new("unsigned int*") + id = lib.SSL_SESSION_get_id(self._session, lenp) + return ffi.unpack(id, lenp[0]) + + @property + def time(self): + return lib.SSL_SESSION_get_time(self._session) + + @property + def timeout(self): + return lib.SSL_SESSION_get_timeout(self._session) + + @property + def has_ticket(self): + return bool(lib.SSL_SESSION_has_ticket(self._session)) + + @property + def ticket_lifetime_hint(self): + return lib.SSL_SESSION_get_ticket_lifetime_hint(self._session) + + +SSL_CTX_STATS_NAMES = """ + number connect connect_good connect_renegotiate accept accept_good + accept_renegotiate hits misses timeouts cache_full""".split() +SSL_CTX_STATS = [] +for name in SSL_CTX_STATS_NAMES: + attr = 'SSL_CTX_sess_'+name + assert hasattr(lib, attr) + SSL_CTX_STATS.append((name, getattr(lib, attr))) + +class _SSLContext(object): + __slots__ = ('ctx', '_check_hostname', 'servername_callback', + 'alpn_protocols', '_alpn_protocols_handle', + 'npn_protocols', 'set_hostname', '_post_handshake_auth', + '_set_hostname_handle', '_npn_protocols_handle') + def __new__(cls, protocol): + self = object.__new__(cls) + self.ctx = ffi.NULL + if protocol == PROTOCOL_TLSv1: + method = lib.TLSv1_method() + elif lib.Cryptography_HAS_TLSv1_1 and protocol == PROTOCOL_TLSv1_1: + method = lib.TLSv1_1_method() + elif lib.Cryptography_HAS_TLSv1_2 and protocol == PROTOCOL_TLSv1_2 : + method = lib.TLSv1_2_method() + elif SSLv3_method_ok and protocol == PROTOCOL_SSLv3: + method = lib.SSLv3_method() + elif lib.Cryptography_HAS_SSL2 and protocol == PROTOCOL_SSLv2: + method = lib.SSLv2_method() + elif protocol == PROTOCOL_SSLv23: + method = lib.SSLv23_method() + # elif protocol == PROTOCOL_TLS_CLIENT: + # method = lib.SSLv23_client_method() + # elif protocol == PROTOCOL_TLS_SERVER: + # method = lib.SSLv23_server_method() + else: + raise ValueError("invalid protocol version") + + ctx = lib.SSL_CTX_new(method) + if ctx == ffi.NULL: + raise ssl_error("failed to allocate SSL context") + self.ctx = ffi.gc(lib.SSL_CTX_new(method), lib.SSL_CTX_free) + + # Don't check host name by default + self._check_hostname = False + if 0 and protocol == PROTOCOL_TLS_CLIENT: + self._check_hostname = True + self.verify_mode = CERT_REQUIRED + else: + self._check_hostname = False + self.verify_mode = CERT_NONE + + # Defaults + options = lib.SSL_OP_ALL & ~lib.SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS + if not lib.Cryptography_HAS_SSL2 or protocol != PROTOCOL_SSLv2: + options |= lib.SSL_OP_NO_SSLv2 + if not SSLv3_method_ok or protocol != PROTOCOL_SSLv3: + options |= lib.SSL_OP_NO_SSLv3 + # Minimal security flags for server and client side context. + # Client sockets ignore server-side parameters. + options |= lib.SSL_OP_NO_COMPRESSION + # options |= lib.SSL_OP_CIPHER_SERVER_PREFERENCE + options |= lib.SSL_OP_SINGLE_DH_USE + options |= lib.SSL_OP_SINGLE_ECDH_USE + lib.SSL_CTX_set_options(self.ctx, options) + lib.SSL_CTX_set_session_id_context(self.ctx, b"Python", len(b"Python")) + + # A bare minimum cipher list without completely broken cipher suites. + # It's far from perfect but gives users a better head start. + if lib.Cryptography_HAS_SSL2 and protocol == PROTOCOL_SSLv2: + # SSLv2 needs MD5 + default_ciphers = b"HIGH:!aNULL:!eNULL" + else: + default_ciphers = b"HIGH:!aNULL:!eNULL:!MD5" + if not lib.SSL_CTX_set_cipher_list(ctx, default_ciphers): + lib.ERR_clear_error() + raise SSLError("No cipher can be selected.") + + if HAS_ECDH: + # Allow automatic ECDH curve selection (on + # OpenSSL 1.0.2+), or use prime256v1 by default. + # This is Apache mod_ssl's initialization + # policy, so we should be safe. + if lib.Cryptography_HAS_SET_ECDH_AUTO: + lib.SSL_CTX_set_ecdh_auto(self.ctx, 1) + else: + key = lib.EC_KEY_new_by_curve_name(lib.NID_X9_62_prime256v1) + lib.SSL_CTX_set_tmp_ecdh(self.ctx, key) + lib.EC_KEY_free(key) + if lib.Cryptography_HAS_X509_V_FLAG_TRUSTED_FIRST: + store = lib.SSL_CTX_get_cert_store(self.ctx) + lib.X509_STORE_set_flags(store, lib.X509_V_FLAG_TRUSTED_FIRST) + if HAS_TLSv1_3: + self.post_handshake_auth = 0; + lib.SSL_CTX_set_post_handshake_auth(self.ctx, self.post_handshake_auth) + return self + + @property + def options(self): + return lib.SSL_CTX_get_options(self.ctx) + + @options.setter + def options(self, value): + new_opts = int(value) + opts = lib.SSL_CTX_get_options(self.ctx) + clear = opts & ~new_opts + set = ~opts & new_opts + if clear: + if lib.Cryptography_HAS_SSL_CTX_CLEAR_OPTIONS: + lib.SSL_CTX_clear_options(self.ctx, clear) + else: + raise ValueError("can't clear options before OpenSSL 0.9.8m") + if set: + lib.SSL_CTX_set_options(self.ctx, set) + + @property + def verify_mode(self): + mode = lib.SSL_CTX_get_verify_mode(self.ctx) + if mode == lib.SSL_VERIFY_NONE: + return CERT_NONE + elif mode == lib.SSL_VERIFY_PEER: + return CERT_OPTIONAL + elif mode == lib.SSL_VERIFY_PEER | lib.SSL_VERIFY_FAIL_IF_NO_PEER_CERT: + return CERT_REQUIRED + raise ssl_error("invalid return value from SSL_CTX_get_verify_mode") + + @verify_mode.setter + def verify_mode(self, value): + n = int(value) + if n == CERT_NONE: + mode = lib.SSL_VERIFY_NONE + elif n == CERT_OPTIONAL: + mode = lib.SSL_VERIFY_PEER + elif n == CERT_REQUIRED: + mode = lib.SSL_VERIFY_PEER | lib.SSL_VERIFY_FAIL_IF_NO_PEER_CERT + else: + raise ValueError("invalid value for verify_mode") + if mode == lib.SSL_VERIFY_NONE and self.check_hostname: + raise ValueError("Cannot set verify_mode to CERT_NONE when " \ + "check_hostname is enabled.") + # Keep current verify cb + verify_cb = lib.SSL_CTX_get_verify_callback(self.ctx) + lib.SSL_CTX_set_verify(self.ctx, mode, verify_cb) + + @property + def verify_flags(self): + store = lib.SSL_CTX_get_cert_store(self.ctx) + param = lib.X509_STORE_get0_param(store) + flags = lib.X509_VERIFY_PARAM_get_flags(param) + return int(flags) + + @verify_flags.setter + def verify_flags(self, value): + new_flags = int(value) + store = lib.SSL_CTX_get_cert_store(self.ctx); + param = lib.X509_STORE_get0_param(store) + flags = lib.X509_VERIFY_PARAM_get_flags(param); + clear = flags & ~new_flags; + set = ~flags & new_flags; + if clear: + param = lib.X509_STORE_get0_param(store) + if not lib.X509_VERIFY_PARAM_clear_flags(param, clear): + raise ssl_error(None, 0) + if set: + param = lib.X509_STORE_get0_param(store) + if not lib.X509_VERIFY_PARAM_set_flags(param, set): + raise ssl_error(None, 0) + + @property + def check_hostname(self): + return self._check_hostname + + @check_hostname.setter + def check_hostname(self, value): + check_hostname = bool(value) + if check_hostname and lib.SSL_CTX_get_verify_mode(self.ctx) == lib.SSL_VERIFY_NONE: + raise ValueError("check_hostname needs a SSL context with either " + "CERT_OPTIONAL or CERT_REQUIRED") + self._check_hostname = check_hostname + + + def set_ciphers(self, cipherlist): + cipherlistbuf = _str_to_ffi_buffer(cipherlist) + ret = lib.SSL_CTX_set_cipher_list(self.ctx, cipherlistbuf) + if ret == 0: + # Clearing the error queue is necessary on some OpenSSL + # versions, otherwise the error will be reported again + # when another SSL call is done. + lib.ERR_clear_error() + raise ssl_error("No cipher can be selected.") + + def get_ciphers(self): + ssl = lib.SSL_new(self.ctx) + try: + ciphers = lib.SSL_get_ciphers(ssl) + if ciphers == ffi.NULL: + return None + count = lib.sk_SSL_CIPHER_num(ciphers) + res = [None] * count + for i in range(count): + dct = cipher_to_dict(lib.sk_SSL_CIPHER_value(ciphers, i)) + res[i] = dct + return res + finally: + lib.SSL_free(ssl) + + def load_cert_chain(self, certfile, keyfile=None, password=None): + if keyfile is None: + keyfile = certfile + pw_info = PasswordInfo() + index = -1 + if password is not None: + + if callable(password): + pw_info.callable = password + else: + if isinstance(password, (str, bytes, bytearray)): + pw_info.password = password + else: + raise TypeError("password should be a string or callable") + + pw_info.handle = ffi.new_handle(pw_info) + index = _thread.get_ident() + PWINFO_STORAGE[index] = pw_info + lib.SSL_CTX_set_default_passwd_cb(self.ctx, Cryptography_pem_password_cb) + lib.SSL_CTX_set_default_passwd_cb_userdata(self.ctx, pw_info.handle) + + try: + ffi.errno = 0 + certfilebuf = _str_to_ffi_buffer(certfile) + ret = lib.SSL_CTX_use_certificate_chain_file(self.ctx, certfilebuf) + if ret != 1: + if pw_info.operationerror: + lib.ERR_clear_error() + raise pw_info.operationerror + _errno = ffi.errno + if _errno: + lib.ERR_clear_error() + raise IOError(_errno, "Error") + else: + raise ssl_error(None) + + ffi.errno = 0 + buf = _str_to_ffi_buffer(keyfile) + ret = lib.SSL_CTX_use_PrivateKey_file(self.ctx, buf, + lib.SSL_FILETYPE_PEM) + if ret != 1: + if pw_info.operationerror: + lib.ERR_clear_error() + raise pw_info.operationerror + _errno = ffi.errno + if _errno: + lib.ERR_clear_error() + raise IOError(_errno, None) + else: + raise ssl_error(None) + + ret = lib.SSL_CTX_check_private_key(self.ctx) + if ret != 1: + raise ssl_error(None) + finally: + if index >= 0: + del PWINFO_STORAGE[index] + lib.SSL_CTX_set_default_passwd_cb(self.ctx, ffi.NULL) + lib.SSL_CTX_set_default_passwd_cb_userdata(self.ctx, ffi.NULL) + + + def _wrap_socket(self, sock, server_side, server_hostname=None, ssl_sock=None): + if server_hostname: + server_hostname = server_hostname.encode('idna') + return _SSLSocket._new__ssl_socket(self, sock, server_side, + server_hostname, ssl_sock) + + def load_verify_locations(self, cafile=None, capath=None, cadata=None): + ffi.errno = 0 + if cadata is None: + ca_file_type = -1 + else: + if not isinstance(cadata, unicode): + ca_file_type = lib.SSL_FILETYPE_ASN1 + else: + ca_file_type = lib.SSL_FILETYPE_PEM + try: + cadata = cadata.encode('ascii') + except UnicodeEncodeError: + raise TypeError("cadata should be a ASCII string or a bytes-like object") + if cafile is None and capath is None: + if cadata is None: + raise TypeError("cafile and capath cannot be both omitted") + if not cadata: + raise ssl_error(None) + # load from cadata + if cadata is not None: + buf = _str_to_ffi_buffer(cadata) + self._add_ca_certs(buf, len(buf), ca_file_type) + + # load cafile or capath + if cafile is not None or capath is not None: + if cafile is None: + cafilebuf = ffi.NULL + else: + cafilebuf = _str_to_ffi_buffer(cafile) + if capath is None: + capathbuf = ffi.NULL + else: + capathbuf = _str_to_ffi_buffer(capath) + ret = lib.SSL_CTX_load_verify_locations(self.ctx, cafilebuf, capathbuf) + if ret != 1: + _errno = ffi.errno + if _errno: + lib.ERR_clear_error() + raise IOError(_errno, '') + else: + raise ssl_error(None) + + def _add_ca_certs(self, data, size, ca_file_type): + biobuf = lib.BIO_new_mem_buf(data, size) + if biobuf == ffi.NULL: + raise ssl_error("Can't allocate buffer") + try: + store = lib.SSL_CTX_get_cert_store(self.ctx) + loaded = 0 + while True: + if ca_file_type == lib.SSL_FILETYPE_ASN1: + cert = lib.d2i_X509_bio(biobuf, ffi.NULL) + else: + cert = lib.PEM_read_bio_X509(biobuf, ffi.NULL, ffi.NULL, ffi.NULL) + if not cert: + break + try: + r = lib.X509_STORE_add_cert(store, cert) + finally: + lib.X509_free(cert) + if not r: + err = lib.ERR_peek_last_error() + if (lib.ERR_GET_LIB(err) == lib.ERR_LIB_X509 and + lib.ERR_GET_REASON(err) == + lib.X509_R_CERT_ALREADY_IN_HASH_TABLE): + # cert already in hash table, not an error + lib.ERR_clear_error() + else: + break + loaded += 1 + + err = lib.ERR_peek_last_error() + if (ca_file_type == lib.SSL_FILETYPE_ASN1 and + loaded > 0 and + lib.ERR_GET_LIB(err) == lib.ERR_LIB_ASN1 and + lib.ERR_GET_REASON(err) == lib.ASN1_R_HEADER_TOO_LONG): + # EOF ASN1 file, not an error + lib.ERR_clear_error() + elif (ca_file_type == lib.SSL_FILETYPE_PEM and + loaded > 0 and + lib.ERR_GET_LIB(err) == lib.ERR_LIB_PEM and + lib.ERR_GET_REASON(err) == lib.PEM_R_NO_START_LINE): + # EOF PEM file, not an error + lib.ERR_clear_error() + else: + raise ssl_error(None) + finally: + lib.BIO_free(biobuf) + + def cert_store_stats(self): + store = lib.SSL_CTX_get_cert_store(self.ctx) + x509 = 0 + x509_ca = 0 + crl = 0 + objs = lib.X509_STORE_get0_objects(store) + count = lib.sk_X509_OBJECT_num(objs) + for i in range(count): + obj = lib.sk_X509_OBJECT_value(objs, i) + _type = lib.X509_OBJECT_get_type(obj) + if _type == lib.X509_LU_X509: + x509 += 1 + cert = lib.X509_OBJECT_get0_X509(obj) + if lib.X509_check_ca(cert): + x509_ca += 1 + elif _type == lib.X509_LU_CRL: + crl += 1 + else: + # Ignore X509_LU_FAIL, X509_LU_RETRY, X509_LU_PKEY. + # As far as I can tell they are internal states and never + # stored in a cert store + pass + return {'x509': x509, 'x509_ca': x509_ca, 'crl': crl} + + + def session_stats(self): + stats = {} + for name, ssl_func in SSL_CTX_STATS: + stats[name] = ssl_func(self.ctx) + return stats + + def set_default_verify_paths(self): + if (not os.environ.get('SSL_CERT_FILE') and + not os.environ.get('SSL_CERT_DIR') and + not sys.platform == 'win32'): + locations = get_default_verify_paths() + self.load_verify_locations(locations[1], locations[3]) + return + if not lib.SSL_CTX_set_default_verify_paths(self.ctx): + raise ssl_error("") + + def load_dh_params(self, filepath): + ffi.errno = 0 + if filepath is None: + raise TypeError("filepath must not be None") + buf = _fs_converter(filepath) + mode = ffi.new("char[]",b"r") + ffi.errno = 0 + bio = lib.BIO_new_file(buf, mode) + if bio == ffi.NULL: + _errno = ffi.errno + lib.ERR_clear_error() + raise IOError(_errno, '') + try: + dh = lib.PEM_read_bio_DHparams(bio, ffi.NULL, ffi.NULL, ffi.NULL) + finally: + lib.BIO_free(bio) + if dh == ffi.NULL: + _errno = ffi.errno + if _errno != 0: + lib.ERR_clear_error() + raise OSError(_errno, '') + else: + raise ssl_error(None) + try: + if lib.SSL_CTX_set_tmp_dh(self.ctx, dh) == 0: + raise ssl_error(None) + finally: + lib.DH_free(dh) + + def get_ca_certs(self, binary_form=None): + binary_mode = bool(binary_form) + _list = [] + store = lib.SSL_CTX_get_cert_store(self.ctx) + objs = lib.X509_STORE_get0_objects(store) + count = lib.sk_X509_OBJECT_num(objs) + for i in range(count): + obj = lib.sk_X509_OBJECT_value(objs, i) + _type = lib.X509_OBJECT_get_type(obj) + if _type != lib.X509_LU_X509: + # not a x509 cert + continue + # CA for any purpose + cert = lib.X509_OBJECT_get0_X509(obj) + if not lib.X509_check_ca(cert): + continue + if binary_mode: + _list.append(_certificate_to_der(cert)) + else: + _list.append(_decode_certificate(cert)) + return _list + + def set_ecdh_curve(self, name): + # needs to be zero terminated + if name is None: + raise TypeError() + buf = _fs_converter(name) + nid = lib.OBJ_sn2nid(buf) + if nid == 0: + raise ValueError("unknown elliptic curve name '%s'" % name) + key = lib.EC_KEY_new_by_curve_name(nid) + if not key: + raise ssl_error(None) + try: + lib.SSL_CTX_set_tmp_ecdh(self.ctx, key) + finally: + lib.EC_KEY_free(key) + + def set_servername_callback(self, callback): + # cryptography constraint: OPENSSL_NO_TLSEXT will never be set! + if not HAS_SNI: + raise NotImplementedError("The TLS extension servername callback, " + "SSL_CTX_set_tlsext_servername_callback, " + "is not in the current OpenSSL library.") + if callback is None: + lib.SSL_CTX_set_tlsext_servername_callback(self.ctx, ffi.NULL) + self._set_hostname_handle = None + return + if not callable(callback): + raise TypeError("not a callable object") + scb = ServernameCallback(callback, self) + self._set_hostname_handle = ffi.new_handle(scb) + lib.SSL_CTX_set_tlsext_servername_callback(self.ctx, _servername_callback) + lib.SSL_CTX_set_tlsext_servername_arg(self.ctx, self._set_hostname_handle) + + def _set_alpn_protocols(self, protos): + if HAS_ALPN: + self.alpn_protocols = protocols = ffi.from_buffer(protos) + length = len(protocols) + + if lib.SSL_CTX_set_alpn_protos(self.ctx,ffi.cast("unsigned char*", protocols), length): + return MemoryError() + self._alpn_protocols_handle = handle = ffi.new_handle(self) + lib.SSL_CTX_set_alpn_select_cb(self.ctx, select_alpn_callback, handle) + else: + raise NotImplementedError("The ALPN extension requires OpenSSL 1.0.2 or later.") + + def _set_npn_protocols(self, protos): + if HAS_NPN: + self.npn_protocols = ffi.from_buffer(protos) + handle = ffi.new_handle(self) + self._npn_protocols_handle = handle # track a reference to the handle + lib.SSL_CTX_set_next_protos_advertised_cb(self.ctx, advertise_npn_callback, handle) + lib.SSL_CTX_set_next_proto_select_cb(self.ctx, select_npn_callback, handle) + else: + raise NotImplementedError("The NPN extension requires OpenSSL 1.0.1 or later.") + + def _wrap_bio(self, incoming, outgoing, server_side, server_hostname): + # server_hostname is either None (or absent), or to be encoded + # using the idna encoding. + hostname = None + if server_hostname is not None: + hostname = server_hostname.encode("idna") + + sock = _SSLSocket._new__ssl_socket(self, None, server_side, hostname, incoming, outgoing) + return sock + + @property + def post_handshake_auth(self): + if HAS_TLSv1_3: + return bool(self._post_handshake_auth) + return None + + @post_handshake_auth.setter + def post_handshake_auth(self, arg): + if arg is None: + raise AttributeError("cannot delete attribute") + + pha = bool(arg) + self._post_handshake_auth = pha; + + # bpo-37428: newPySSLSocket() sets SSL_VERIFY_POST_HANDSHAKE flag for + # server sockets and SSL_set_post_handshake_auth() for client + + return 0; + + + +# cryptography constraint: OPENSSL_NO_TLSEXT will never be set! +if HAS_SNI: + @ffi.callback("int(SSL*,int*,void*)") + def _servername_callback(s, al, arg): + scb = ffi.from_handle(arg) + ssl_ctx = scb.ctx + servername = lib.SSL_get_servername(s, lib.TLSEXT_NAMETYPE_host_name) + set_hostname = scb.callback + #ifdef WITH_THREAD + # TODO PyGILState_STATE gstate = PyGILState_Ensure(); + #endif + + if set_hostname is None: + #/* remove race condition in this the call back while if removing the + # * callback is in progress */ + #ifdef WITH_THREAD + # TODO PyGILState_Release(gstate); + #endif + return lib.SSL_TLSEXT_ERR_OK + + ssl = ffi.from_handle(lib.SSL_get_app_data(s)) + assert isinstance(ssl, _SSLSocket) + + # The servername callback expects an argument that represents the current + # SSL connection and that has a .context attribute that can be changed to + # identify the requested hostname. Since the official API is the Python + # level API we want to pass the callback a Python level object rather than + # a _ssl.SSLSocket instance. If there's an "owner" (typically an + # SSLObject) that will be passed. Otherwise if there's a socket then that + # will be passed. If both do not exist only then the C-level object is + # passed. + ssl_socket = ssl.owner + if not ssl_socket: + ssl_socket = ssl.get_socket_or_None() + + if ssl_socket is None: + al[0] = lib.SSL_AD_INTERNAL_ERROR + return lib.SSL_TLSEXT_ERR_ALERT_FATAL + + if servername == ffi.NULL: + try: + result = set_hostname(ssl_socket, None, ssl_ctx) + except Exception as e: + pyerr_write_unraisable(e, set_hostname) + al[0] = lib.SSL_AD_HANDSHAKE_FAILURE + return lib.SSL_TLSEXT_ERR_ALERT_FATAL + else: + servername = ffi.string(servername) + + try: + servername_idna = servername.decode("idna") + except UnicodeDecodeError as e: + pyerr_write_unraisable(e, servername) + + try: + result = set_hostname(ssl_socket, servername_idna, ssl_ctx) + except Exception as e: + pyerr_write_unraisable(e, set_hostname) + al[0] = lib.SSL_AD_HANDSHAKE_FAILURE + return lib.SSL_TLSEXT_ERR_ALERT_FATAL + + if result is not None: + # this is just a poor man's emulation: + # in CPython this works a bit different, it calls all the way + # down from PyLong_AsLong to _PyLong_FromNbInt which raises + # a TypeError if there is no nb_int slot filled. + try: + if isinstance(result, int): + al[0] = result + else: + if result is not None: + if hasattr(result,'__int__'): + al[0] = result.__int__() + return lib.SSL_TLSEXT_ERR_ALERT_FATAL + # needed because sys.exec_info is used in pyerr_write_unraisable + raise TypeError("an integer is required (got type %s)" % result) + except TypeError as e: + pyerr_write_unraisable(e, result) + al[0] = lib.SSL_AD_INTERNAL_ERROR + return lib.SSL_TLSEXT_ERR_ALERT_FATAL + else: + # TODO gil state release? + return lib.SSL_TLSEXT_ERR_OK + +class ServernameCallback(object): + def __init__(self, callback, ctx): + self.callback = callback + self.ctx = ctx + +SERVERNAME_CALLBACKS = weakref.WeakValueDictionary() + +def _asn1obj2py(obj): + nid = lib.OBJ_obj2nid(obj) + if nid == lib.NID_undef: + raise ValueError("Unknown object") + sn = _str_from_buf(lib.OBJ_nid2sn(nid)) + ln = _str_from_buf(lib.OBJ_nid2ln(nid)) + buf = ffi.new("char[]", 255) + length = lib.OBJ_obj2txt(buf, len(buf), obj, 1) + if length < 0: + ssl_error(None) + if length > 0: + return (nid, sn, ln, _str_with_len(buf, length)) + else: + return (nid, sn, ln, None) + +def txt2obj(txt, name): + _bytes = _str_to_ffi_buffer(txt) + is_name = 0 if name else 1 + obj = lib.OBJ_txt2obj(_bytes, is_name) + if obj == ffi.NULL: + raise ValueError("unknown object '%s'" % txt) + result = _asn1obj2py(obj) + lib.ASN1_OBJECT_free(obj) + return result + +def nid2obj(nid): + if nid < lib.NID_undef: + raise ValueError("NID must be positive.") + obj = lib.OBJ_nid2obj(nid); + if obj == ffi.NULL: + raise ValueError("unknown NID %i" % nid) + result = _asn1obj2py(obj); + lib.ASN1_OBJECT_free(obj); + return result; + + +class MemoryBIO(object): + def __init__(self): + bio = lib.BIO_new(lib.BIO_s_mem()); + if bio == ffi.NULL: + raise ssl_error("failed to allocate BIO") + + # Since our BIO is non-blocking an empty read() does not indicate EOF, + # just that no data is currently available. The SSL routines should retry + # the read, which we can achieve by calling BIO_set_retry_read(). + lib.BIO_set_retry_read(bio); + lib.BIO_set_mem_eof_return(bio, -1); + + self.bio = ffi.gc(bio, lib.BIO_free) + self.eof_written = False + + @property + def eof(self): + """Whether the memory BIO is at EOF.""" + return lib.BIO_ctrl_pending(self.bio) == 0 and self.eof_written + + def write(self, strlike): + INT_MAX = 2**31-1 + if isinstance(strlike, memoryview): + # FIXME pypy must support get_raw_address for + # StringBuffer to remove this case! + strlike = strlike.tobytes() + buf = ffi.from_buffer(strlike) + if len(buf) > INT_MAX: + raise OverflowError("string longer than %d bytes", INT_MAX) + + if self.eof_written: + raise ssl_error("cannot write() after write_eof()") + nbytes = lib.BIO_write(self.bio, buf, len(buf)); + if nbytes < 0: + raise ssl_error(None) + return nbytes + + def write_eof(self): + self.eof_written = True + # After an EOF is written, a zero return from read() should be a real EOF + # i.e. it should not be retried. Clear the SHOULD_RETRY flag. + lib.BIO_clear_retry_flags(self.bio) + lib.BIO_set_mem_eof_return(self.bio, 0) + + def read(self, len=-1): + count = len + avail = lib.BIO_ctrl_pending(self.bio); + if count < 0 or count > avail: + count = avail; + + buf = ffi.new("char[]", count) + + nbytes = lib.BIO_read(self.bio, buf, count); + # There should never be any short reads but check anyway. + if nbytes < count: + return b"" + + return _bytes_with_len(buf, nbytes) + + @property + def pending(self): + return lib.BIO_ctrl_pending(self.bio) + + +def RAND_status(): + return lib.RAND_status() + +def _RAND_bytes(count, pseudo): + if count < 0: + raise ValueError("num must be positive") + buf = ffi.new("unsigned char[]", count) + if pseudo: + # note by reaperhulk, RAND_pseudo_bytes is deprecated in 3.6 already, + # it is totally fine to just call RAND_bytes instead + ok = lib.RAND_bytes(buf, count) + if ok == 1 or ok == 0: + _bytes = _bytes_with_len(buf, count) + return (_bytes, ok == 1) + else: + ok = lib.RAND_bytes(buf, count) + if ok == 1 or (pseudo and ok == 0): + return _bytes_with_len(buf, count) + raise ssl_error(None, errcode=lib.ERR_get_error()) + +def RAND_pseudo_bytes(count): + return _RAND_bytes(count, True) + +def RAND_bytes(count): + return _RAND_bytes(count, False) + +def RAND_add(view, entropy): + buf = _str_to_ffi_buffer(view) + lib.RAND_add(buf, len(buf), entropy) + +def get_default_verify_paths(): + ''' + Find a certificate store and associated values + + Returns something like + `('SSL_CERT_FILE', '/usr/lib/ssl/cert.pem', 'SSL_CERT_DIR', '/usr/lib/ssl/certs')` + on Ubuntu and windows10 + + `('SSL_CERT_FILE', '/usr/local/cert.pem', 'SSL_CERT_DIR', '/usr/local/certs')` + on CentOS + + `('SSL_CERT_FILE', '/Library/Frameworks/Python.framework/Versions/2.7/etc/openssl/cert.pem', + 'SSL_CERT_DIR', '/Library/Frameworks/Python.framework/Versions/2.7/etc/openssl/certs')` + on Darwin + + For portable builds (based on CentOS, but could be running on any glibc + linux) we need to check other locations. The list of places to try was taken + from golang in Dec 2018: + https://golang.org/src/crypto/x509/root_unix.go (for the directories), + https://golang.org/src/crypto/x509/root_linux.go (for the files) + ''' + certFiles = [ + "/etc/ssl/certs/ca-certificates.crt", # Debian/Ubuntu/Gentoo etc. + "/etc/pki/tls/certs/ca-bundle.crt", # Fedora/RHEL 6 + "/etc/ssl/ca-bundle.pem", # OpenSUSE + "/etc/pki/tls/cacert.pem", # OpenELEC + "/etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem", # CentOS/RHEL 7 + "/etc/ssl/cert.pem", # Alpine Linux + ] + certDirectories = [ + "/etc/ssl/certs", # SLES10/SLES11 + "/system/etc/security/cacerts", # Android + "/usr/local/share/certs", # FreeBSD + "/etc/pki/tls/certs", # Fedora/RHEL + "/etc/openssl/certs", # NetBSD + "/var/ssl/certs", # AIX + ] + + # optimization: reuse the values from a local varaible + if getattr(get_default_verify_paths, 'retval', None): + return get_default_verify_paths.retval + + # This should never fail, it should always return SSL_CERT_FILE and SSL_CERT_DIR + ofile_env = _str_from_buf(lib.X509_get_default_cert_file_env()) + odir_env = _str_from_buf(lib.X509_get_default_cert_dir_env()) + + # Platform depenedent + ofile = _str_from_buf(lib.X509_get_default_cert_file()) + odir = _str_from_buf(lib.X509_get_default_cert_dir()) + + if os.path.exists(ofile) and os.path.exists(odir): + get_default_verify_paths.retval = (ofile_env, ofile, odir_env, odir) + return get_default_verify_paths.retval + + # OpenSSL didn't supply the goods. Try some other options + for f in certFiles: + if os.path.exists(f): + ofile = f + for f in certDirectories: + if os.path.exists(f): + odir = f + get_default_verify_paths.retval = (ofile_env, ofile, odir_env, odir) + return get_default_verify_paths.retval + + +@ffi.callback("int(SSL*,unsigned char **,unsigned char *,const unsigned char *,unsigned int,void *)") +def select_alpn_callback(ssl, out, outlen, client_protocols, client_protocols_len, args): + ctx = ffi.from_handle(args) + return do_protocol_selection(1, out, outlen, + ffi.cast("unsigned char*",ctx.alpn_protocols), len(ctx.alpn_protocols), + client_protocols, client_protocols_len) + +if lib.OPENSSL_NPN_NEGOTIATED: + @ffi.callback("int(SSL*,unsigned char **,unsigned char *,const unsigned char *,unsigned int,void *)") + def select_npn_callback(ssl, out, outlen, server_protocols, server_protocols_len, args): + ctx = ffi.from_handle(args) + return do_protocol_selection(0, out, outlen, server_protocols, server_protocols_len, + ffi.cast("unsigned char*",ctx.npn_protocols), len(ctx.npn_protocols)) + + + @ffi.callback("int(SSL*,const unsigned char**, unsigned int*, void*)") + def advertise_npn_callback(ssl, data, length, args): + ctx = ffi.from_handle(args) + + if not ctx.npn_protocols: + data[0] = ffi.new("unsigned char*", b"") + length[0] = 0 + else: + data[0] = ffi.cast("unsigned char*",ctx.npn_protocols) + length[0] = len(ctx.npn_protocols) + + return lib.SSL_TLSEXT_ERR_OK + + + def do_protocol_selection(alpn, out, outlen, server_protocols, server_protocols_len, + client_protocols, client_protocols_len): + if client_protocols == ffi.NULL: + client_protocols = b"" + client_protocols_len = 0 + if server_protocols == ffi.NULL: + server_protocols = "" + server_protocols_len = 0 + + ret = lib.SSL_select_next_proto(out, outlen, + server_protocols, server_protocols_len, + client_protocols, client_protocols_len); + if alpn and ret != lib.OPENSSL_NPN_NEGOTIATED: + return lib.SSL_TLSEXT_ERR_NOACK + + return lib.SSL_TLSEXT_ERR_OK + +if lib.Cryptography_HAS_EGD: + def RAND_egd(path): + bytecount = lib.RAND_egd_bytes(ffi.from_buffer(path), len(path)) + if bytecount == -1: + raise SSLError("EGD connection failed or EGD did not return " + "enough data to seed the PRNG"); + return bytecount + +socket.RAND_add = RAND_add +socket.RAND_status = RAND_status diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/_stdssl/utility.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/_stdssl/utility.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/_stdssl/utility.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/_stdssl/utility.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,34 @@ +import sys +from _pypy_openssl import ffi +from _pypy_openssl import lib + +def _string_from_asn1(asn1): + data = lib.ASN1_STRING_data(asn1) + length = lib.ASN1_STRING_length(asn1) + return _str_with_len(ffi.cast("char*",data), length) + +def _str_with_len(char_ptr, length): + return ffi.buffer(char_ptr, length)[:] + +def _bytes_with_len(char_ptr, length): + return ffi.buffer(char_ptr, length)[:] + +def _str_to_ffi_buffer(view): + if isinstance(view, unicode): + return ffi.from_buffer(view.encode()) + elif isinstance(view, memoryview): + # NOTE pypy limitation StringBuffer does not allow + # to get a raw address to the string! + view = view.tobytes() + # dont call call ffi.from_buffer(bytes(view)), arguments + # like ints/bools should result in a TypeError + return ffi.from_buffer(view) + +def _str_from_buf(buf): + return ffi.string(buf) + +def _cstr_decode_fs(buf): + if buf == ffi.NULL: + return None + return ffi.string(buf).decode(sys.getfilesystemencoding()) + diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/_stdssl/win32_extra.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/_stdssl/win32_extra.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/_stdssl/win32_extra.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/_stdssl/win32_extra.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,101 @@ +from _pypy_openssl import lib, ffi + + +def enum_certificates(store_name): + """Retrieve certificates from Windows' cert store. + +store_name may be one of 'CA', 'ROOT' or 'MY'. The system may provide +more cert storages, too. The function returns a list of (bytes, +encoding_type, trust) tuples. The encoding_type flag can be interpreted +with X509_ASN_ENCODING or PKCS_7_ASN_ENCODING. The trust setting is either +a set of OIDs or the boolean True. + """ + hStore = lib.CertOpenStore(lib.CERT_STORE_PROV_SYSTEM_A, 0, ffi.NULL, + lib.CERT_STORE_READONLY_FLAG | lib.CERT_SYSTEM_STORE_LOCAL_MACHINE, + bytes(store_name)) + if hStore == ffi.NULL: + raise WindowsError(*ffi.getwinerror()) + + result = [] + pCertCtx = ffi.NULL + try: + while True: + pCertCtx = lib.CertEnumCertificatesInStore(hStore, pCertCtx) + if pCertCtx == ffi.NULL: + break + cert = ffi.buffer(pCertCtx.pbCertEncoded, pCertCtx.cbCertEncoded)[:] + enc = certEncodingType(pCertCtx.dwCertEncodingType) + keyusage = parseKeyUsage(pCertCtx, lib.CERT_FIND_PROP_ONLY_ENHKEY_USAGE_FLAG) + if keyusage is True: + keyusage = parseKeyUsage(pCertCtx, lib.CERT_FIND_EXT_ONLY_ENHKEY_USAGE_FLAG) + result.append((cert, enc, keyusage)) + finally: + if pCertCtx != ffi.NULL: + lib.CertFreeCertificateContext(pCertCtx) + if not lib.CertCloseStore(hStore, 0): + # This error case might shadow another exception. + raise WindowsError(*ffi.getwinerror()) + return result + + +def enum_crls(store_name): + """Retrieve CRLs from Windows' cert store. + +store_name may be one of 'CA', 'ROOT' or 'MY'. The system may provide +more cert storages, too. The function returns a list of (bytes, +encoding_type) tuples. The encoding_type flag can be interpreted with +X509_ASN_ENCODING or PKCS_7_ASN_ENCODING.""" + hStore = lib.CertOpenStore(lib.CERT_STORE_PROV_SYSTEM_A, 0, ffi.NULL, + lib.CERT_STORE_READONLY_FLAG | lib.CERT_SYSTEM_STORE_LOCAL_MACHINE, + bytes(store_name)) + if hStore == ffi.NULL: + raise WindowsError(*ffi.getwinerror()) + + result = [] + pCrlCtx = ffi.NULL + try: + while True: + pCrlCtx = lib.CertEnumCRLsInStore(hStore, pCrlCtx) + if pCrlCtx == ffi.NULL: + break + crl = ffi.buffer(pCrlCtx.pbCrlEncoded, pCrlCtx.cbCrlEncoded)[:] + enc = certEncodingType(pCrlCtx.dwCertEncodingType) + result.append((crl, enc)) + finally: + if pCrlCtx != ffi.NULL: + lib.CertFreeCRLContext(pCrlCtx) + if not lib.CertCloseStore(hStore, 0): + # This error case might shadow another exception. + raise WindowsError(*ffi.getwinerror()) + return result + + +def certEncodingType(encodingType): + if encodingType == lib.X509_ASN_ENCODING: + return "x509_asn" + if encodingType == lib.PKCS_7_ASN_ENCODING: + return "pkcs_7_asn" + return encodingType + +def parseKeyUsage(pCertCtx, flags): + pSize = ffi.new("DWORD *") + if not lib.CertGetEnhancedKeyUsage(pCertCtx, flags, ffi.NULL, pSize): + error_with_message = ffi.getwinerror() + if error_with_message[0] == lib.CRYPT_E_NOT_FOUND: + return True + raise WindowsError(*error_with_message) + + pUsageMem = ffi.new("char[]", pSize[0]) + pUsage = ffi.cast("PCERT_ENHKEY_USAGE", pUsageMem) + if not lib.CertGetEnhancedKeyUsage(pCertCtx, flags, pUsage, pSize): + error_with_message = ffi.getwinerror() + if error_with_message[0] == lib.CRYPT_E_NOT_FOUND: + return True + raise WindowsError(*error_with_message) + + retval = set() + for i in range(pUsage.cUsageIdentifier): + if pUsage.rgpszUsageIdentifier[i]: + oid = ffi.string(pUsage.rgpszUsageIdentifier[i]).decode('ascii') + retval.add(oid) + return retval diff -Nru pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/tools/make_ssl_data.py pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/tools/make_ssl_data.py --- pypy-7.1.1+dfsg/lib_pypy/_cffi_ssl/tools/make_ssl_data.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_cffi_ssl/tools/make_ssl_data.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,82 @@ +#! /usr/bin/env python3 + +""" +This script should be called *manually* when we want to upgrade SSLError +`library` and `reason` mnemnonics to a more recent OpenSSL version. + +It takes two arguments: +- the path to the OpenSSL source tree (e.g. git checkout) +- the path to the C file to be generated + (probably Modules/_ssl_data.h) +""" + +import datetime +import os +import re +import sys +import _ssl + + +def parse_error_codes(h_file, prefix, libcode): + pat = re.compile(r"#define\W+(%s([\w]+))\W+(\d+)\b" % re.escape(prefix)) + codes = [] + with open(h_file, "r", encoding="latin1") as f: + for line in f: + match = pat.search(line) + if match: + code, name, num = match.groups() + num = int(num) + # e.g. ("SSL_R_BAD_DATA", ("ERR_LIB_SSL", "BAD_DATA", 390)) + codes.append((code, (libcode, name, num))) + return codes + +if __name__ == "__main__": + openssl_inc = sys.argv[1] + outfile = sys.argv[2] + use_stdout = outfile == '-' + f = sys.stdout if use_stdout else open(outfile, "w") + error_libraries = { + # mnemonic -> (library code, error prefix, header file) + 'PEM': ('ERR_LIB_PEM', 'PEM_R_', 'include/openssl/pem.h'), + 'SSL': ('ERR_LIB_SSL', 'SSL_R_', 'include/openssl/ssl.h'), + 'X509': ('ERR_LIB_X509', 'X509_R_', 'include/openssl/x509.h'), + } + + # Read codes from libraries + new_codes = [] + for libcode, prefix, h_file in sorted(error_libraries.values()): + new_codes += parse_error_codes(os.path.join(openssl_inc, h_file), + prefix, libcode) + new_code_nums = set((libcode, num) + for (code, (libcode, name, num)) in new_codes) + + # Merge with existing codes (in case some old codes disappeared). + codes = {} + for errname, (libnum, errnum) in _ssl.err_names_to_codes.items(): + lib = error_libraries[_ssl.lib_codes_to_names[libnum]] + libcode = lib[0] # e.g. ERR_LIB_PEM + errcode = lib[1] + errname # e.g. SSL_R_BAD_SSL_SESSION_ID_LENGTH + # Only keep it if the numeric codes weren't reused + if (libcode, errnum) not in new_code_nums: + codes[errcode] = libcode, errname, errnum + codes.update(dict(new_codes)) + + def w(l): + f.write(l + "\n") + w("# File generated by tools/make_ssl_data.py") + w("# Generated on %s" % datetime.datetime.now().isoformat()) + w("") + w("from _openssl import ffi, lib ") + + w("_lib_codes = []") + for mnemo, (libcode, _, _) in sorted(error_libraries.items()): + w('_lib_codes.append(("%s", lib.%s))' % (mnemo, libcode)) + + w("_error_codes = []") + for errcode, (libcode, name, num) in sorted(codes.items()): + #w('if lib.%s:' % (errcode)) + #w(' _error_codes.append(("%s", lib.%s, lib.%s))' % (name, libcode, errcode)) + #w('else:') + w('_error_codes.append(("%s", lib.%s, %d))' % (name, libcode, num)) + if not use_stdout: + f.close() diff -Nru pypy-7.1.1+dfsg/lib_pypy/crypt/__init__.py pypy-7.3.1+dfsg/lib_pypy/crypt/__init__.py --- pypy-7.1.1+dfsg/lib_pypy/crypt/__init__.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/crypt/__init__.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,21 @@ +""" +CFFI based implementation of the crypt module +""" + +import sys +import cffi + +ffi = cffi.FFI() +ffi.cdef('char *crypt(char *word, char *salt);') + +try: + lib = ffi.dlopen('crypt') +except OSError: + raise ImportError('crypt not available') + + +def crypt(word, salt): + res = lib.crypt(word, salt) + if not res: + return None + return ffi.string(res) diff -Nru pypy-7.1.1+dfsg/lib_pypy/_ctypes/array.py pypy-7.3.1+dfsg/lib_pypy/_ctypes/array.py --- pypy-7.1.1+dfsg/lib_pypy/_ctypes/array.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_ctypes/array.py 2020-04-10 19:28:40.000000000 +0000 @@ -267,6 +267,8 @@ raise TypeError("Can't multiply a ctypes type by a non-integer") if length < 0: raise ValueError("Array length must be >= 0") + if length * base._sizeofinstances() > sys.maxsize: + raise OverflowError("array too large") key = (base, length) try: return ARRAY_CACHE[key] diff -Nru pypy-7.1.1+dfsg/lib_pypy/_curses_build.py pypy-7.3.1+dfsg/lib_pypy/_curses_build.py --- pypy-7.1.1+dfsg/lib_pypy/_curses_build.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_curses_build.py 2020-04-10 19:28:40.000000000 +0000 @@ -1,7 +1,59 @@ -from cffi import FFI +from cffi import FFI, VerificationError +import os +import sys + +version_str = ''' + static const int NCURSES_VERSION_MAJOR; + static const int NCURSES_VERSION_MINOR; +''' + +def find_library(options): + for library in options: + ffi = FFI() + ffi.cdef(version_str) + ffi.set_source("_curses_cffi_check", version_str, libraries=[library]) + try: + # Check that the link succeeds + ffi.compile(verbose=1) + except (VerificationError) as e: + e_last = e + continue + else: + return library + + # If none of the options is available, present the user a meaningful + # error message + raise e_last + +def find_curses_dir_and_name(): + for base in ('/usr', '/usr/local'): + if os.path.exists(os.path.join(base, 'include', 'ncursesw')): + return base, 'ncursesw' + if os.path.exists(os.path.join(base, 'include', 'ncurses')): + return base, 'ncurses' + if sys.platform == 'darwin': + return '', None + if os.path.exists(os.path.join(base, 'lib', 'libncursesw.so')): + return base, 'ncursesw' + if os.path.exists(os.path.join(base, 'lib', 'libncurses.so')): + return base, 'ncurses' + return '', None + +base, name = find_curses_dir_and_name() +if base: + include_dirs = [os.path.join(base, 'include', name)] + library_dirs = [os.path.join(base, 'lib')] + libs = [name, name.replace('ncurses', 'panel')] + print('using {} from {}'.format(name, base)) +else: + include_dirs = [] + library_dirs = [] + libs = [find_library(['ncursesw', 'ncurses']), + find_library(['panelw', 'panel']), + ] + print('using {} from general compiler paths'.format(libs[0])) ffi = FFI() - ffi.set_source("_curses_cffi", """ #ifdef __APPLE__ /* the following define is necessary for OS X 10.6+; without it, the @@ -10,6 +62,13 @@ #define NCURSES_OPAQUE 0 #endif + +/* ncurses 6 change behaviour and makes all pointers opaque, + lets define backward compatibility. It doesn't harm + previous versions */ + +#define NCURSES_INTERNALS 1 +#define NCURSES_REENTRANT 0 #include #include #include @@ -41,7 +100,10 @@ void _m_getsyx(int *yx) { getsyx(yx[0], yx[1]); } -""", libraries=['ncurses', 'panel']) +""", libraries=libs, + library_dirs = library_dirs, + include_dirs=include_dirs, +) ffi.cdef(""" @@ -63,6 +125,7 @@ static const int ERR, OK; static const int TRUE, FALSE; static const int KEY_MIN, KEY_MAX; +static const int KEY_CODE_YES; static const int COLOR_BLACK; static const int COLOR_RED; @@ -122,11 +185,11 @@ int setupterm(char *, int, int *); -WINDOW *stdscr; -int COLORS; -int COLOR_PAIRS; -int COLS; -int LINES; +extern WINDOW *stdscr; +extern int COLORS; +extern int COLOR_PAIRS; +extern int COLS; +extern int LINES; int baudrate(void); int beep(void); @@ -302,7 +365,7 @@ #define _m_NetBSD ... int _m_ispad(WINDOW *); -chtype acs_map[]; +extern chtype acs_map[]; // For _curses_panel: @@ -327,6 +390,14 @@ void _m_getsyx(int *yx); """) +if 'ncursesw' in libs: + ffi.cdef(""" +typedef int... wint_t; +int wget_wch(WINDOW *, wint_t *); +int mvwget_wch(WINDOW *, int, int, wint_t *); +int unget_wch(const wchar_t); +""") + if __name__ == "__main__": ffi.compile() diff -Nru pypy-7.1.1+dfsg/lib_pypy/_curses.py pypy-7.3.1+dfsg/lib_pypy/_curses.py --- pypy-7.1.1+dfsg/lib_pypy/_curses.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_curses.py 2020-04-10 19:28:40.000000000 +0000 @@ -57,7 +57,7 @@ if key_n == b"UNKNOWN KEY": continue if not isinstance(key_n, str): # python 3 - key_n = key_n.decode() + key_n = key_n.decode('utf-8') key_n = key_n.replace('(', '').replace(')', '') globals()[key_n] = key @@ -83,7 +83,9 @@ def _ensure_initialised_color(): - if not _initialised and _initialised_color: + if not _initialised: + raise error("must call initscr() first") + if not _initialised_color: raise error("must call start_color() first") @@ -420,11 +422,16 @@ val = lib.keyname(val) if val == ffi.NULL: return "" - return ffi.string(val) + key_n = ffi.string(val) + if not isinstance(key_n, str): + key_n = key_n.decode('utf-8') + return key_n @_argspec(0, 1, 2) def getstr(self, y, x, n=1023): n = min(n, 1023) + if n < 0: + raise ValueError("'n' must be nonnegative") buf = ffi.new("char[1024]") # /* This should be big enough.. I hope */ if y is None: @@ -467,6 +474,8 @@ @_argspec(0, 1, 2) def instr(self, y, x, n=1023): n = min(n, 1023) + if n < 0: + raise ValueError("'n' must be nonnegative") buf = ffi.new("char[1024]") # /* This should be big enough.. I hope */ if y is None: code = lib.winnstr(self._win, buf, n) diff -Nru pypy-7.1.1+dfsg/lib_pypy/_hashlib/__init__.py pypy-7.3.1+dfsg/lib_pypy/_hashlib/__init__.py --- pypy-7.1.1+dfsg/lib_pypy/_hashlib/__init__.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_hashlib/__init__.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,178 @@ +import sys +from threading import Lock +from _pypy_openssl import ffi, lib +from _cffi_ssl._stdssl.utility import (_str_to_ffi_buffer, _bytes_with_len, + _str_from_buf) + +try: from __pypy__ import builtinify +except ImportError: builtinify = lambda f: f + + +def new(name, string=b''): + h = Hash(name) + h.update(string) + return h + +class Hash(object): + + def __init__(self, name, copy_from=None): + self.ctx = ffi.NULL + self.name = name + digest_type = self.digest_type_by_name() + self.digest_size = lib.EVP_MD_size(digest_type) + + # Allocate a lock for each HASH object. + # An optimization would be to not release the GIL on small requests, + # and use a custom lock only when needed. + self.lock = Lock() + + ctx = lib.Cryptography_EVP_MD_CTX_new() + if ctx == ffi.NULL: + raise MemoryError + ctx = ffi.gc(ctx, lib.Cryptography_EVP_MD_CTX_free) + + try: + if copy_from is not None: + # cpython uses EVP_MD_CTX_copy(...) + if not lib.EVP_MD_CTX_copy_ex(ctx, copy_from): + raise ValueError + else: + # cpython uses EVP_DigestInit + lib.EVP_DigestInit_ex(ctx, digest_type, ffi.NULL) + self.ctx = ctx + except: + # no need to gc ctx! + raise + + def digest_type_by_name(self): + c_name = _str_to_ffi_buffer(self.name) + digest_type = lib.EVP_get_digestbyname(c_name) + if not digest_type: + raise ValueError("unknown hash function") + # TODO + return digest_type + + def __repr__(self): + return "<%s HASH object at 0x%s>" % (self.name, id(self)) + + def update(self, string): + if isinstance(string, unicode): + buf = ffi.from_buffer(string.encode('ascii')) + else: + buf = ffi.from_buffer(string) + with self.lock: + # XXX try to not release the GIL for small requests + lib.EVP_DigestUpdate(self.ctx, buf, len(buf)) + + def copy(self): + """Return a copy of the hash object.""" + with self.lock: + return Hash(self.name, copy_from=self.ctx) + + def digest(self): + """Return the digest value as a string of binary data.""" + return self._digest() + + def hexdigest(self): + """Return the digest value as a string of hexadecimal digits.""" + digest = self._digest() + hexdigits = '0123456789abcdef' + result = [] + for c in digest: + result.append(hexdigits[(ord(c) >> 4) & 0xf]) + result.append(hexdigits[ ord(c) & 0xf]) + return ''.join(result) + + @property + def block_size(self): + return lib.EVP_MD_CTX_block_size(self.ctx) + + def _digest(self): + ctx = lib.Cryptography_EVP_MD_CTX_new() + if ctx == ffi.NULL: + raise MemoryError + try: + with self.lock: + if not lib.EVP_MD_CTX_copy_ex(ctx, self.ctx): + raise ValueError + digest_size = self.digest_size + buf = ffi.new("unsigned char[]", digest_size) + lib.EVP_DigestFinal_ex(ctx, buf, ffi.NULL) + return _bytes_with_len(buf, digest_size) + finally: + lib.Cryptography_EVP_MD_CTX_free(ctx) + +algorithms = ('md5', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512') + +class NameFetcher: + def __init__(self): + self.meth_names = [] + self.error = None + + +def _fetch_names(): + name_fetcher = NameFetcher() + handle = ffi.new_handle(name_fetcher) + lib.OBJ_NAME_do_all(lib.OBJ_NAME_TYPE_MD_METH, hash_name_mapper_callback, handle) + if name_fetcher.error: + raise name_fetcher.error + meth_names = name_fetcher.meth_names + name_fetcher.meth_names = None + return frozenset(meth_names) + +@ffi.callback("void(OBJ_NAME*, void*)") +def hash_name_mapper_callback(obj_name, userdata): + if not obj_name: + return + name_fetcher = ffi.from_handle(userdata) + # Ignore aliased names, they pollute the list and OpenSSL appears + # to have a its own definition of alias as the resulting list + # still contains duplicate and alternate names for several + # algorithms. + if obj_name.alias != 0: + return + name = _str_from_buf(obj_name.name) + name_fetcher.meth_names.append(name) + +openssl_md_meth_names = _fetch_names() +del _fetch_names + +# shortcut functions +def make_new_hash(name, funcname): + def new_hash(string=b''): + return new(name, string) + new_hash.__name__ = funcname + return builtinify(new_hash) + +for _name in algorithms: + _newname = 'openssl_%s' % (_name,) + globals()[_newname] = make_new_hash(_name, _newname) + +if hasattr(lib, 'PKCS5_PBKDF2_HMAC'): + @builtinify + def pbkdf2_hmac(hash_name, password, salt, iterations, dklen=None): + if not isinstance(hash_name, str): + raise TypeError("expected 'str' for name, but got %s" % type(hash_name)) + c_name = _str_to_ffi_buffer(hash_name) + digest = lib.EVP_get_digestbyname(c_name) + if digest == ffi.NULL: + raise ValueError("unsupported hash type") + if dklen is None: + dklen = lib.EVP_MD_size(digest) + if dklen < 1: + raise ValueError("key length must be greater than 0.") + if dklen >= sys.maxsize: + raise OverflowError("key length is too great.") + if iterations < 1: + raise ValueError("iteration value must be greater than 0.") + if iterations >= sys.maxsize: + raise OverflowError("iteration value is too great.") + buf = ffi.new("unsigned char[]", dklen) + c_password = ffi.from_buffer(bytes(password)) + c_salt = ffi.from_buffer(bytes(salt)) + r = lib.PKCS5_PBKDF2_HMAC(c_password, len(c_password), + ffi.cast("unsigned char*",c_salt), len(c_salt), + iterations, digest, dklen, buf) + if r == 0: + raise ValueError + return _bytes_with_len(buf, dklen) diff -Nru pypy-7.1.1+dfsg/lib_pypy/pyrepl/completing_reader.py pypy-7.3.1+dfsg/lib_pypy/pyrepl/completing_reader.py --- pypy-7.1.1+dfsg/lib_pypy/pyrepl/completing_reader.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/pyrepl/completing_reader.py 2020-04-10 19:28:40.000000000 +0000 @@ -266,7 +266,7 @@ reader.ps1 = "c**> " reader.ps2 = "c/*> " reader.ps3 = "c|*> " - reader.ps4 = "c\*> " + reader.ps4 = r"c\*> " while reader.readline(): pass diff -Nru pypy-7.1.1+dfsg/lib_pypy/pyrepl/historical_reader.py pypy-7.3.1+dfsg/lib_pypy/pyrepl/historical_reader.py --- pypy-7.1.1+dfsg/lib_pypy/pyrepl/historical_reader.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/pyrepl/historical_reader.py 2020-04-10 19:28:40.000000000 +0000 @@ -111,7 +111,7 @@ r.isearch_term = '' r.dirty = 1 r.push_input_trans(r.isearch_trans) - + class reverse_history_isearch(commands.Command): def do(self): @@ -217,7 +217,7 @@ self.isearch_trans = input.KeymapTranslator( isearch_keymap, invalid_cls=isearch_end, character_cls=isearch_add_character) - + def select_item(self, i): self.transient_history[self.historyi] = self.get_unicode() buf = self.transient_history.get(i) @@ -302,7 +302,7 @@ reader.ps1 = "h**> " reader.ps2 = "h/*> " reader.ps3 = "h|*> " - reader.ps4 = "h\*> " + reader.ps4 = r"h\*> " while reader.readline(): pass diff -Nru pypy-7.1.1+dfsg/lib_pypy/pyrepl/keymap.py pypy-7.3.1+dfsg/lib_pypy/pyrepl/keymap.py --- pypy-7.1.1+dfsg/lib_pypy/pyrepl/keymap.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/pyrepl/keymap.py 2020-04-10 19:28:40.000000000 +0000 @@ -58,7 +58,7 @@ "'":"'", '"':'"', 'a':'\a', - 'b':'\h', + 'b':'\b', 'e':'\033', 'f':'\f', 'n':'\n', diff -Nru pypy-7.1.1+dfsg/lib_pypy/pyrepl/reader.py pypy-7.3.1+dfsg/lib_pypy/pyrepl/reader.py --- pypy-7.1.1+dfsg/lib_pypy/pyrepl/reader.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/pyrepl/reader.py 2020-04-10 19:28:40.000000000 +0000 @@ -58,7 +58,7 @@ return u[c] else: if unicodedata_.category(c).startswith('C'): - return '\u%04x'%(ord(c),) + return br'\u%04x'%(ord(c),) else: return c @@ -232,7 +232,7 @@ self.ps1 = "->> " self.ps2 = "/>> " self.ps3 = "|.. " - self.ps4 = "\__ " + self.ps4 = r"\__ " self.kill_ring = [] self.arg = None self.finished = 0 @@ -630,7 +630,7 @@ reader.ps1 = "**> " reader.ps2 = "/*> " reader.ps3 = "|*> " - reader.ps4 = "\*> " + reader.ps4 = r"\*> " while reader.readline(): pass diff -Nru pypy-7.1.1+dfsg/lib_pypy/_ssl/__init__.py pypy-7.3.1+dfsg/lib_pypy/_ssl/__init__.py --- pypy-7.1.1+dfsg/lib_pypy/_ssl/__init__.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_ssl/__init__.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,31 @@ +from _cffi_ssl._stdssl import (_PROTOCOL_NAMES, _OPENSSL_API_VERSION, + _test_decode_cert, _SSLContext) +from _cffi_ssl import _stdssl +from _cffi_ssl._stdssl import * + +OP_SINGLE_DH_USE = lib.SSL_OP_SINGLE_DH_USE +OP_SINGLE_ECDH_USE = lib.SSL_OP_SINGLE_ECDH_USE + +try: from __pypy__ import builtinify +except ImportError: builtinify = lambda f: f + +RAND_add = builtinify(RAND_add) +RAND_bytes = builtinify(RAND_bytes) +RAND_pseudo_bytes = builtinify(RAND_pseudo_bytes) +RAND_status = builtinify(RAND_status) +# RAND_egd is optional and might not be available on e.g. libressl +if hasattr(_stdssl, 'RAND_egd'): + RAND_egd = builtinify(RAND_egd) + +import sys +if sys.platform == "win32": + if 'enum_certificates' not in globals(): + def enum_certificates(*args, **kwds): + import warnings + warnings.warn("ssl.enum_certificates() is not implemented") + return [] + if 'enum_crls' not in globals(): + def enum_crls(*args, **kwds): + import warnings + warnings.warn("ssl.enum_crls() is not implemented") + return [] diff -Nru pypy-7.1.1+dfsg/lib_pypy/_ssl_build.py pypy-7.3.1+dfsg/lib_pypy/_ssl_build.py --- pypy-7.1.1+dfsg/lib_pypy/_ssl_build.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_ssl_build.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,60 @@ +import sys +from _cffi_ssl import _cffi_src +sys.modules['_cffi_src'] = _cffi_src +# +from _cffi_ssl._cffi_src.build_openssl import (build_ffi_for_binding, + _get_openssl_libraries, extra_link_args, compiler_type) + +if sys.platform == "win32": + pypy_win32_extra = ["pypy_win32_extra"] +else: + pypy_win32_extra = [] + +ffi = build_ffi_for_binding( + module_name="_pypy_openssl", + module_prefix="_cffi_src.openssl.", + modules=[ + # This goes first so we can define some cryptography-wide symbols. + "cryptography", + + "aes", + "asn1", + "bignum", + "bio", + "cmac", + "conf", + "crypto", + "ct", + "dh", + "dsa", + "ec", + "ecdh", + "ecdsa", + "engine", + "err", + "evp", + "fips", + "hmac", + "nid", + "objects", + "ocsp", + "opensslv", + "osrandom_engine", + "pem", + "pkcs12", + "rand", + "rsa", + "ssl", + "x509", + "x509name", + "x509v3", + "x509_vfy", + "pkcs7", + "callbacks", + ] + pypy_win32_extra, + libraries=_get_openssl_libraries(sys.platform), + extra_link_args=extra_link_args(compiler_type()), +) + +if __name__ == '__main__': + ffi.compile(verbose=True) diff -Nru pypy-7.1.1+dfsg/lib_pypy/_tkinter/app.py pypy-7.3.1+dfsg/lib_pypy/_tkinter/app.py --- pypy-7.1.1+dfsg/lib_pypy/_tkinter/app.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_tkinter/app.py 2020-04-10 19:28:40.000000000 +0000 @@ -32,6 +32,16 @@ def Tcl_AppInit(app): + # For portable builds, try to load a local version of the libraries + from os.path import join, dirname, exists + lib_path = join(dirname(dirname(dirname(__file__))), 'lib') + tcl_path = join(lib_path, 'tcl') + tk_path = join(lib_path, 'tk') + if exists(tcl_path): + tklib.Tcl_Eval(app.interp, 'set tcl_library "{0}"'.format(tcl_path).encode('utf-8')) + if exists(tk_path): + tklib.Tcl_Eval(app.interp, 'set tk_library "{0}"'.format(tk_path).encode('utf-8')) + if tklib.Tcl_Init(app.interp) == tklib.TCL_ERROR: app.raiseTclError() skip_tk_init = tklib.Tcl_GetVar( diff -Nru pypy-7.1.1+dfsg/lib_pypy/_tkinter/tklib_build.py pypy-7.3.1+dfsg/lib_pypy/_tkinter/tklib_build.py --- pypy-7.1.1+dfsg/lib_pypy/_tkinter/tklib_build.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/_tkinter/tklib_build.py 2020-04-10 19:28:40.000000000 +0000 @@ -36,8 +36,11 @@ for _ver in ['8.6', '8.5', '']: incdirs = [] linklibs = ['tcl' + _ver, 'tk' + _ver] - if os.path.isfile(''.join(['/usr/lib/lib', linklibs[1], '.so'])): - found = True + for lib in ['/usr/lib/lib', '/usr/lib64/lib']: + if os.path.isfile(''.join([lib, linklibs[1], '.so'])): + found = True + break + if found: break if not found: sys.stderr.write("*** TCL libraries not found! Falling back...\n") diff -Nru pypy-7.1.1+dfsg/lib_pypy/tools/build_cffi_imports.py pypy-7.3.1+dfsg/lib_pypy/tools/build_cffi_imports.py --- pypy-7.1.1+dfsg/lib_pypy/tools/build_cffi_imports.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib_pypy/tools/build_cffi_imports.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,306 @@ +from __future__ import print_function +import sys, shutil, os, tempfile, hashlib +import sysconfig +from os.path import join + +try: + import _multiprocessing +except ImportError: + # The only function we need from multiprocessing is cpu_count(), which is + # written in the pure Python part of multiprocessing. We can make it work + # in environments that don't have _multiprocessing by adding an empty + # module in place of _multiprocessing. + import types + sys.modules['_multiprocessing'] = types.ModuleType('fake _multiprocessing') +import multiprocessing + +# do not use the long-running runsubprocess._run here, since building some of +# the extensions enable importing them later +os.environ['PYPY_DONT_RUN_SUBPROCESS'] = '1' + +class MissingDependenciesError(Exception): + pass + + +cffi_build_scripts = { + "_ssl": "_ssl_build.py", + "sqlite3": "_sqlite3_build.py", + "audioop": "_audioop_build.py", + "_tkinter": "_tkinter/tklib_build.py", + "curses": "_curses_build.py" if sys.platform != "win32" else None, + "syslog": "_syslog_build.py" if sys.platform != "win32" else None, + "gdbm": "_gdbm_build.py" if sys.platform != "win32" else None, + "grp": "_pwdgrp_build.py" if sys.platform != "win32" else None, + "resource": "_resource_build.py" if sys.platform != "win32" else None, + "xx": None, # for testing: 'None' should be completely ignored + } + +# for distribution, we may want to fetch dependencies not provided by +# the OS, such as a recent openssl/libressl. +curdir = os.path.abspath(os.path.dirname(__file__)) +deps_destdir = os.path.join(curdir, 'dest') +configure_args = ['./configure', + '--prefix=/usr', + '--disable-shared', + '--enable-silent-rules', + '--disable-dependency-tracking', + ] +cffi_dependencies = { + 'lzma': ('https://tukaani.org/xz/xz-5.2.3.tar.gz', + '71928b357d0a09a12a4b4c5fafca8c31c19b0e7d3b8ebb19622e96f26dbf28cb', + [configure_args, + ['make', '-s', '-j', str(multiprocessing.cpu_count())], + ['make', 'install', 'DESTDIR={}/'.format(deps_destdir)], + ]), + '_ssl': ('https://www.openssl.org/source/openssl-1.1.1f.tar.gz', + '186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35', + [['./config', '--prefix=/usr', 'no-shared'], + ['make', '-s', '-j', str(multiprocessing.cpu_count())], + ['make', 'install', 'DESTDIR={}/'.format(deps_destdir)], + ]), + # this does not compile on the buildbot, linker is missing '_history_list' + 'broken_on_macos_gdbm': ('http://ftp.gnu.org/gnu/gdbm/gdbm-1.18.1.tar.gz', + '86e613527e5dba544e73208f42b78b7c022d4fa5a6d5498bf18c8d6f745b91dc', + [configure_args, + ['make', '-s', '-j', str(multiprocessing.cpu_count())], + ['make', 'install', 'DESTDIR={}/'.format(deps_destdir)], + ]), +} + + +def _unpack_tarfile(filename, extract_dir): + """Unpack tar/tar.gz/tar.bz2/tar.xz `filename` to `extract_dir` + """ + import tarfile # late import for breaking circular dependency + try: + tarobj = tarfile.open(filename) + except tarfile.TarError: + raise ReadError( + "%s is not a compressed or uncompressed tar file" % filename) + try: + tarobj.extractall(extract_dir) + finally: + tarobj.close() + +def _sha256(filename): + dgst = hashlib.sha256() + + with open(filename, 'rb') as fp: + dgst.update(fp.read()) + return dgst.hexdigest() + + +def _build_dependency(name, patches=[]): + import shutil + from rpython.tool.runsubprocess import run_subprocess + + try: + from urllib.request import urlretrieve + except ImportError: + from urllib import urlretrieve + + try: + url, dgst, build_cmds = cffi_dependencies[name] + except KeyError: + return 0, None, None + + archive_dir = os.path.join(tempfile.gettempdir(), 'pypy-archives') + + if not os.path.isdir(archive_dir): + os.makedirs(archive_dir) + + archive = os.path.join(archive_dir, url.rsplit('/', 1)[-1]) + + # next, fetch the archive to disk, if needed + if not os.path.exists(archive) or _sha256(archive) != dgst: + print('fetching archive', url, file=sys.stderr) + urlretrieve(url, archive) + + # make sure the hash matches + if _sha256(archive) != dgst: + return 1, '{} archive {} hash mismatch'.format(name, archive), '' + + shutil.rmtree(deps_destdir, ignore_errors=True) + os.makedirs(deps_destdir) + + # extract the into our destination directory + print('unpacking archive', archive, file=sys.stderr) + _unpack_tarfile(archive, deps_destdir) + + sources = os.path.join(deps_destdir, os.path.basename(archive)[:-7]) + + # apply any patches + if patches: + for patch in patches: + print('applying patch', patch, file=sys.stderr) + status, stdout, stderr = run_subprocess( + '/usr/bin/patch', ['-p1', '-i', patch], cwd=sources, + ) + + if status != 0: + return status, stdout, stderr + env = os.environ + if sys.platform == 'darwin': + target = sysconfig.get_config_var('MACOSX_DEPLOYMENT_TARGET') + if target: + # override the value for building support libraries + env = os.environ.copy() + env['MACOSX_DEPLOYMENT_TARGET'] = target + print('setting MACOSX_DEPLOYMENT_TARGET to "{}"'.format(target)) + + for args in build_cmds: + print('running', ' '.join(args), 'in', sources, file=sys.stderr) + status, stdout, stderr = run_subprocess(args[0], args[1:], + cwd=sources, env=env) + if status != 0: + break + return status, stdout, stderr + +def create_cffi_import_libraries(pypy_c, options, basedir, only=None, + embed_dependencies=False, rebuild=False): + from rpython.tool.runsubprocess import run_subprocess + + shutil.rmtree(str(join(basedir,'lib_pypy','__pycache__')), + ignore_errors=True) + # be sure pip, setuptools are installed in a fresh pypy + # allows proper functioning of cffi on win32 with newer vc compilers + # XXX move this to a build slave step? + env = os.environ + if sys.platform == 'win32': + env = os.environ.copy() + env['INCLUDE'] = r'..\externals\include;' + env.get('INCLUDE', '') + env['LIB'] = r'..\externals\lib;' + env.get('LIB', '') + env['PATH'] = r'..\externals\bin;' + env.get('PATH', '') + status, stdout, stderr = run_subprocess(str(pypy_c), ['-c', 'import setuptools']) + if status != 0: + status, stdout, stderr = run_subprocess(str(pypy_c), ['-m', 'ensurepip']) + failures = [] + + for key, module in cffi_build_scripts.items(): + if only and key not in only: + print("* SKIPPING", key, '(not specified in --only)') + continue + if module is None or getattr(options, 'no_' + key, False): + continue + if not rebuild: + # the key is the module name, has it already been built? + status, stdout, stderr = run_subprocess(str(pypy_c), + ['-c', 'import %s' % key], env=env) + if status == 0: + print('*', ' %s already built' % key, file=sys.stderr) + continue + + if module.endswith('.py'): + args = [module] + cwd = str(join(basedir,'lib_pypy')) + else: + args = ['-c', 'import ' + module] + cwd = None + + print('*', ' '.join(args), file=sys.stderr) + if embed_dependencies and key in cffi_dependencies: + status, stdout, stderr = _build_dependency(key) + if status != 0: + failures.append((key, module)) + print("stdout:") + print(stdout.decode('utf-8')) + print("stderr:") + print(stderr.decode('utf-8')) + continue + + env['CPPFLAGS'] = \ + '-I{}/usr/include {}'.format(deps_destdir, env.get('CPPFLAGS', '')) + env['LDFLAGS'] = \ + '-L{}/usr/lib {}'.format(deps_destdir, env.get('LDFLAGS', '')) + + try: + status, stdout, stderr = run_subprocess(str(pypy_c), args, + cwd=cwd, env=env) + if status != 0: + print("stdout:") + print(stdout, file=sys.stderr) + print("stderr:") + print(stderr, file=sys.stderr) + raise RuntimeError('building {} failed'.format(key)) + except: + import traceback;traceback.print_exc() + failures.append((key, module)) + else: + # Make sure it worked + status, stdout, stderr = run_subprocess(str(pypy_c), + ['-c', "print('testing {0}'); import {0}".format(key)], + env=env) + if status != 0: + failures.append((key, module)) + print("stdout:") + print(stdout, file=sys.stderr) + print("stderr:") + print(stderr, file=sys.stderr) + if os.path.exists(deps_destdir): + shutil.rmtree(deps_destdir, ignore_errors=True) + return failures + +if __name__ == '__main__': + import argparse + if '__pypy__' not in sys.builtin_module_names: + print('Call with a pypy interpreter', file=sys.stderr) + sys.exit(1) + + tool_dir = os.path.dirname(os.path.abspath(sys.argv[0])) + base_dir = os.path.dirname(os.path.dirname(tool_dir)) + sys.path.insert(0, base_dir) + + class Options(object): + pass + + parser = argparse.ArgumentParser(description='Build all cffi backends in lib_pypy') + parser.add_argument('--exefile', dest='exefile', default=sys.executable, + help='instead of executing sys.executable' \ + ' you can specify an alternative pypy vm here') + parser.add_argument('--rebuild', dest='rebuild', action='store_true', + help='Rebuild the module even if it already appears to have been built.') + parser.add_argument('--only', dest='only', default=None, + help='Only build the modules delimited by a colon. E.g. _ssl,sqlite') + parser.add_argument('--embed-dependencies', dest='embed_dependencies', action='store_true', + help='embed dependencies for distribution') + args = parser.parse_args() + + exename = join(os.getcwd(), args.exefile) + basedir = exename + + while not os.path.exists(join(basedir,'include')): + _basedir = os.path.dirname(basedir) + if _basedir == basedir: + raise ValueError('interpreter %s not inside pypy repo', + str(exename)) + basedir = _basedir + options = Options() + if args.only is None: + only = None + else: + only = set(args.only.split(',')) + failures = create_cffi_import_libraries(exename, options, basedir, only=only, + embed_dependencies=args.embed_dependencies, + rebuild=args.rebuild) + if len(failures) > 0: + print('*** failed to build the CFFI modules %r' % ( + [f[1] for f in failures],), file=sys.stderr) + print(''' +PyPy can still be used as long as you don't need the corresponding +modules. If you do need them, please install the missing headers and +libraries (see error messages just above) and then re-run the command: + + %s %s +''' % (sys.executable, ' '.join(sys.argv)), file=sys.stderr) + sys.exit(1) + + if len(sys.argv) > 1 and sys.argv[1] == '--test': + # monkey patch a failure, just to test + print('This line should be followed by a traceback', file=sys.stderr) + for k in cffi_build_scripts: + setattr(options, 'no_' + k, True) + must_fail = '_missing_build_script.py' + assert not os.path.exists(str(join(join(basedir,'lib_pypy'),must_fail))) + cffi_build_scripts['should_fail'] = must_fail + failures = create_cffi_import_libraries(exename, options, basedir, only=only) + assert len(failures) == 1 diff -Nru pypy-7.1.1+dfsg/lib-python/2.7/ctypes/test/test_byteswap.py pypy-7.3.1+dfsg/lib-python/2.7/ctypes/test/test_byteswap.py --- pypy-7.1.1+dfsg/lib-python/2.7/ctypes/test/test_byteswap.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/lib-python/2.7/ctypes/test/test_byteswap.py 2020-04-10 19:28:40.000000000 +0000 @@ -2,7 +2,6 @@ from binascii import hexlify from ctypes import * -from ctypes.test import xfail def bin(s): return hexlify(memoryview(s)).upper() diff -Nru pypy-7.1.1+dfsg/lib-python/2.7/ctypes/test/test_loading.py pypy-7.3.1+dfsg/lib-python/2.7/ctypes/test/test_loading.py --- pypy-7.1.1+dfsg/lib-python/2.7/ctypes/test/test_loading.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/lib-python/2.7/ctypes/test/test_loading.py 2020-04-10 19:28:40.000000000 +0000 @@ -2,7 +2,7 @@ import sys, unittest import os from ctypes.util import find_library -from ctypes.test import is_resource_enabled, xfail +from ctypes.test import is_resource_enabled libc_name = None if os.name == "nt": @@ -80,7 +80,6 @@ self.assertRaises(AttributeError, dll.__getitem__, 1234) - @xfail @unittest.skipUnless(os.name == "nt", 'Windows-specific test') def test_1703286_A(self): from _ctypes import LoadLibrary, FreeLibrary @@ -92,7 +91,6 @@ handle = LoadLibrary("advapi32") FreeLibrary(handle) - @xfail @unittest.skipUnless(os.name == "nt", 'Windows-specific test') def test_1703286_B(self): # Since on winXP 64-bit advapi32 loads like described diff -Nru pypy-7.1.1+dfsg/lib-python/2.7/ctypes/util.py pypy-7.3.1+dfsg/lib-python/2.7/ctypes/util.py --- pypy-7.1.1+dfsg/lib-python/2.7/ctypes/util.py 2019-08-08 19:42:53.000000000 +0000 +++ pypy-7.3.1+dfsg/lib-python/2.7/ctypes/util.py 2020-04-10 19:28:40.000000000 +0000 @@ -19,6 +19,8 @@ i = i + len(prefix) s, rest = sys.version[i:].split(" ", 1) majorVersion = int(s[:-2]) - 6 + if majorVersion >= 13: + majorVersion += 1 minorVersion = int(s[2:3]) / 10.0 # I don't think paths are affected by minor version in version 6 if majorVersion == 6: @@ -36,8 +38,12 @@ return None if version <= 6: clibname = 'msvcrt' - else: + elif version <= 13: clibname = 'msvcr%d' % (version * 10) + else: + # CRT is no longer directly loadable. See issue23606 for the + # discussion about alternative approaches. + return None # If python was built with in debug mode import imp @@ -60,16 +66,6 @@ return fname return None -if os.name == "ce": - # search path according to MSDN: - # - absolute path specified by filename - # - The .exe launch directory - # - the Windows directory - # - ROM dll files (where are they?) - # - OEM specified search path: HKLM\Loader\SystemPath - def find_library(name): - return name - if os.name == "posix" and sys.platform == "darwin": def find_library(name): from ctypes.macholib.dyld import dyld_find as _dyld_find diff -Nru pypy-7.1.1+dfsg/lib-python/2.7/distutils/command/install.py pypy-7.3.1+dfsg/lib-python/2.7/distutils/command/install.py --- pypy-7.1.1+dfsg/lib-python/2.7/distutils/command/install.py 2019-08-08 19:42:53.000000000 +0000 +++ pypy-7.3.1+dfsg/lib-python/2.7/distutils/command/install.py 2020-04-10 19:28:40.000000000 +0000 @@ -86,10 +86,17 @@ 'pypy': { 'purelib': '$base/site-packages', 'platlib': '$base/site-packages', - 'headers': '$base/include', + 'headers': '$base/include/$dist_name', 'scripts': '$base/bin', 'data' : '$base', }, + 'pypy_nt': { + 'purelib': '$base/site-packages', + 'platlib': '$base/site-packages', + 'headers': '$base/include/$dist_name', + 'scripts': '$base/Scripts', + 'data' : '$base', + }, } # The keys to an installation scheme; if any new types of files are to be @@ -475,8 +482,11 @@ def select_scheme (self, name): # it's the caller's problem if they supply a bad name! if (hasattr(sys, 'pypy_version_info') and - not name.endswith(('_user', '_home'))): - name = 'pypy' + not name.endswith(('_user', '_home'))): + if os.name == 'nt': + name = 'pypy_nt' + else: + name = 'pypy' scheme = INSTALL_SCHEMES[name] for key in SCHEME_KEYS: attrname = 'install_' + key @@ -491,6 +501,11 @@ if os.name == 'posix' or os.name == 'nt': val = os.path.expanduser(val) val = subst_vars(val, self.config_vars) + # install_headers can end with a '/' if $dist_name is '' + # see issue 3140, and the comment in ./utils.py that CPython + # apparently never uses $dist_name + if len(val) > 0 and val[-1] == '/': + val = val[:-1] setattr(self, attr, val) diff -Nru pypy-7.1.1+dfsg/lib-python/2.7/distutils/msvc9compiler.py pypy-7.3.1+dfsg/lib-python/2.7/distutils/msvc9compiler.py --- pypy-7.1.1+dfsg/lib-python/2.7/distutils/msvc9compiler.py 2019-08-08 19:42:53.000000000 +0000 +++ pypy-7.3.1+dfsg/lib-python/2.7/distutils/msvc9compiler.py 2020-04-10 19:28:40.000000000 +0000 @@ -182,6 +182,9 @@ i = i + len(prefix) s, rest = sys.version[i:].split(" ", 1) majorVersion = int(s[:-2]) - 6 + if majorVersion >= 13: + # v13 was skipped and should be v14 + majorVersion += 1 minorVersion = int(s[2:3]) / 10.0 # I don't think paths are affected by minor version in version 6 if majorVersion == 6: diff -Nru pypy-7.1.1+dfsg/lib-python/2.7/distutils/sysconfig_pypy.py pypy-7.3.1+dfsg/lib-python/2.7/distutils/sysconfig_pypy.py --- pypy-7.1.1+dfsg/lib-python/2.7/distutils/sysconfig_pypy.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/lib-python/2.7/distutils/sysconfig_pypy.py 2020-04-10 19:28:42.000000000 +0000 @@ -71,7 +71,7 @@ g['AR'] = "ar" g['ARFLAGS'] = "rc" g['EXE'] = "" - g['LIBDIR'] = os.path.join(sys.prefix, 'lib') + g['LIBDIR'] = os.path.join(sys.prefix, 'bin') # where is the shared library g['VERSION'] = get_python_version() if sys.platform[:6] == "darwin": @@ -86,6 +86,7 @@ arch = platform.machine() g['LDSHARED'] += ' -undefined dynamic_lookup' g['CC'] += ' -arch %s' % (arch,) + g['MACOSX_DEPLOYMENT_TARGET'] = '10.7' global _config_vars _config_vars = g diff -Nru pypy-7.1.1+dfsg/lib-python/2.7/distutils/util.py pypy-7.3.1+dfsg/lib-python/2.7/distutils/util.py --- pypy-7.1.1+dfsg/lib-python/2.7/distutils/util.py 2019-08-08 19:42:53.000000000 +0000 +++ pypy-7.3.1+dfsg/lib-python/2.7/distutils/util.py 2020-04-10 19:28:40.000000000 +0000 @@ -200,9 +200,12 @@ def _subst (match, local_vars=local_vars): var_name = match.group(1) if var_name in local_vars: - return str(local_vars[var_name]) + ret = str(local_vars[var_name]) else: - return os.environ[var_name] + ret = os.environ[var_name] + if ret == 'UNKNOWN': + return '' + return ret try: return re.sub(r'\$([a-zA-Z_][a-zA-Z_0-9]*)', _subst, s) diff -Nru pypy-7.1.1+dfsg/lib-python/2.7/ensurepip/__init__.py pypy-7.3.1+dfsg/lib-python/2.7/ensurepip/__init__.py --- pypy-7.1.1+dfsg/lib-python/2.7/ensurepip/__init__.py 2019-08-08 19:42:53.000000000 +0000 +++ pypy-7.3.1+dfsg/lib-python/2.7/ensurepip/__init__.py 2020-04-10 19:28:40.000000000 +0000 @@ -7,14 +7,15 @@ import shutil import sys import tempfile +import warnings __all__ = ["version", "bootstrap"] -_SETUPTOOLS_VERSION = "28.8.0" +_SETUPTOOLS_VERSION = "44.0.0" -_PIP_VERSION = "9.0.1" +_PIP_VERSION = "20.0.2" _PROJECTS = [ ("setuptools", _SETUPTOOLS_VERSION), @@ -27,9 +28,12 @@ if additional_paths is not None: sys.path = additional_paths + sys.path - # Install the bundled software - import pip - pip.main(args) + # Install the bundled pip, filtering the PipDeprecationWarning + import pip._internal.cli.main + from pip._internal.utils.deprecation import PipDeprecationWarning + with warnings.catch_warnings(): + warnings.filterwarnings('ignore', category=PipDeprecationWarning) + return pip._internal.cli.main.main(args) def version(): @@ -95,7 +99,8 @@ additional_paths.append(os.path.join(tmpdir, wheel_name)) # Construct the arguments to be passed to the pip command - args = ["install", "--no-index", "--find-links", tmpdir] + args = ["install", "--no-warn-script-location", "--no-index", + "--find-links", tmpdir] if root: args += ["--root", root] if upgrade: diff -Nru pypy-7.1.1+dfsg/lib-python/2.7/json/encoder.py pypy-7.3.1+dfsg/lib-python/2.7/json/encoder.py --- pypy-7.1.1+dfsg/lib-python/2.7/json/encoder.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/lib-python/2.7/json/encoder.py 2020-04-10 19:28:40.000000000 +0000 @@ -294,10 +294,6 @@ items = d.iteritems() for key, v in items: - if first: - first = False - else: - builder.append(separator) if isinstance(key, basestring): pass # JavaScript is weakly typed for these, so it makes sense to @@ -316,6 +312,10 @@ continue else: raise TypeError("key " + repr(key) + " is not a string") + if first: + first = False + else: + builder.append(separator) builder.append('"') builder.append(self.__encoder(key)) builder.append('"') diff -Nru pypy-7.1.1+dfsg/lib-python/2.7/pickle.py pypy-7.3.1+dfsg/lib-python/2.7/pickle.py --- pypy-7.1.1+dfsg/lib-python/2.7/pickle.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/lib-python/2.7/pickle.py 2020-04-10 19:28:40.000000000 +0000 @@ -1444,5 +1444,14 @@ import doctest return doctest.testmod() +# ===== PyPy modification to support pickling cpyext methods ===== +try: + import cpyext +except ImportError: + pass +else: + Pickler.dispatch[cpyext.FunctionType] = Pickler.save_global +# ================= end of PyPy modification ==================== + if __name__ == "__main__": _test() diff -Nru pypy-7.1.1+dfsg/lib-python/2.7/socket.py pypy-7.3.1+dfsg/lib-python/2.7/socket.py --- pypy-7.1.1+dfsg/lib-python/2.7/socket.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/lib-python/2.7/socket.py 2020-04-10 19:28:40.000000000 +0000 @@ -61,20 +61,22 @@ DeprecationWarning, stacklevel=2) return _realssl.sslwrap_simple(sock, keyfile, certfile) - # we need to import the same constants we used to... - from _ssl import SSLError as sslerror - from _ssl import \ - RAND_add, \ - RAND_status, \ - SSL_ERROR_ZERO_RETURN, \ - SSL_ERROR_WANT_READ, \ - SSL_ERROR_WANT_WRITE, \ - SSL_ERROR_WANT_X509_LOOKUP, \ - SSL_ERROR_SYSCALL, \ - SSL_ERROR_SSL, \ - SSL_ERROR_WANT_CONNECT, \ - SSL_ERROR_EOF, \ - SSL_ERROR_INVALID_ERROR_CODE + # we need to import the same constants we used to, + # see lib_pypy/_cffi_ssl/_stdssl/error.py and __init__.py to prevent + # circular import + # from _ssl import SSLError as sslerror + # from _ssl import \ + # RAND_add, \ + # RAND_status + # SSL_ERROR_ZERO_RETURN, \ + # SSL_ERROR_WANT_READ, \ + # SSL_ERROR_WANT_WRITE, \ + # SSL_ERROR_WANT_X509_LOOKUP, \ + # SSL_ERROR_SYSCALL, \ + # SSL_ERROR_SSL, \ + # SSL_ERROR_WANT_CONNECT, \ + # SSL_ERROR_EOF, \ + # SSL_ERROR_INVALID_ERROR_CODE try: from _ssl import RAND_egd except ImportError: diff -Nru pypy-7.1.1+dfsg/lib-python/2.7/subprocess.py pypy-7.3.1+dfsg/lib-python/2.7/subprocess.py --- pypy-7.1.1+dfsg/lib-python/2.7/subprocess.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/lib-python/2.7/subprocess.py 2020-04-10 19:28:40.000000000 +0000 @@ -337,7 +337,7 @@ # --- PyPy hack, see _pypy_install_libs_after_virtualenv() --- # match arguments passed by different versions of virtualenv - if args[1:] in ( + if isinstance(args, (list, tuple)) and args[1:] in ( ['-c', 'import sys; print(sys.prefix)'], # 1.6 10ba3f3c ['-c', "\nimport sys\nprefix = sys.prefix\n" # 1.7 0e9342ce "if sys.version_info[0] == 3:\n" @@ -1301,6 +1301,11 @@ src_library = os.path.join(src_dir, libname) if os.path.exists(src_library): caller.f_globals['copyfile'](src_library, dest_library) + src_lib = os.path.join(src_dir, '../lib') + if os.path.exists(src_lib): + # portable build + import shutil + shutil.copytree(src_lib, os.path.join(dest_dir, '../lib')) def _demo_posix(): diff -Nru pypy-7.1.1+dfsg/lib-python/2.7/sysconfig.py pypy-7.3.1+dfsg/lib-python/2.7/sysconfig.py --- pypy-7.1.1+dfsg/lib-python/2.7/sysconfig.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/lib-python/2.7/sysconfig.py 2020-04-10 19:28:40.000000000 +0000 @@ -382,6 +382,11 @@ vars['EXE'] = '.exe' vars['VERSION'] = _PY_VERSION_SHORT_NO_DOT vars['BINDIR'] = os.path.dirname(_safe_realpath(sys.executable)) + # pypy only: give us control over the ABI tag in a wheel name + if '__pypy__' in sys.builtin_module_names: + import imp + so_ext = imp.get_suffixes()[0][0] + vars['SOABI']= '-'.join(so_ext.split('.')[1].split('-')[:2]) # # public APIs @@ -483,6 +488,7 @@ _CONFIG_VARS['projectbase'] = _PROJECT_BASE _CONFIG_VARS['implementation'] = _get_implementation() _CONFIG_VARS['implementation_lower'] = _get_implementation().lower() + _CONFIG_VARS['LIBRARY'] = '' if os.name in ('nt', 'os2'): _init_non_posix(_CONFIG_VARS) diff -Nru pypy-7.1.1+dfsg/lib-python/2.7/test/capath/efa5f9c3.0 pypy-7.3.1+dfsg/lib-python/2.7/test/capath/efa5f9c3.0 --- pypy-7.1.1+dfsg/lib-python/2.7/test/capath/efa5f9c3.0 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/lib-python/2.7/test/capath/efa5f9c3.0 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,34 @@ +-----BEGIN CERTIFICATE----- +MIIF9zCCA9+gAwIBAgIUH98b4Fw/DyugC9cV7VK7ZODzHsIwDQYJKoZIhvcNAQEL +BQAwgYoxCzAJBgNVBAYTAlhZMRcwFQYDVQQIDA5DYXN0bGUgQW50aHJheDEYMBYG +A1UEBwwPQXJndW1lbnQgQ2xpbmljMSMwIQYDVQQKDBpQeXRob24gU29mdHdhcmUg +Rm91bmRhdGlvbjEjMCEGA1UEAwwac2VsZi1zaWduZWQucHl0aG9udGVzdC5uZXQw +HhcNMTkwNTA4MDEwMjQzWhcNMjcwNzI0MDEwMjQzWjCBijELMAkGA1UEBhMCWFkx +FzAVBgNVBAgMDkNhc3RsZSBBbnRocmF4MRgwFgYDVQQHDA9Bcmd1bWVudCBDbGlu +aWMxIzAhBgNVBAoMGlB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uMSMwIQYDVQQD +DBpzZWxmLXNpZ25lZC5weXRob250ZXN0Lm5ldDCCAiIwDQYJKoZIhvcNAQEBBQAD +ggIPADCCAgoCggIBAMKdJlyCThkahwoBb7pl5q64Pe9Fn5jrIvzsveHTc97TpjV2 +RLfICnXKrltPk/ohkVl6K5SUZQZwMVzFubkyxE0nZPHYHlpiKWQxbsYVkYv01rix +IFdLvaxxbGYke2jwQao31s4o61AdlsfK1SdpHQUynBBMssqI3SB4XPmcA7e+wEEx +jxjVish4ixA1vuIZOx8yibu+CFCf/geEjoBMF3QPdzULzlrCSw8k/45iZCSoNbvK +DoL4TVV07PHOxpheDh8ZQmepGvU6pVqhb9m4lgmV0OGWHgozd5Ur9CbTVDmxIEz3 +TSoRtNJK7qtyZdGNqwjksQxgZTjM/d/Lm/BJG99AiOmYOjsl9gbQMZgvQmMAtUsI +aMJnQuZ6R+KEpW/TR5qSKLWZSG45z/op+tzI2m+cE6HwTRVAWbcuJxcAA55MZjqU +OOOu3BBYMjS5nf2sQ9uoXsVBFH7i0mQqoW1SLzr9opI8KsWwFxQmO2vBxWYaN+lH +OmwBZBwyODIsmI1YGXmTp09NxRYz3Qe5GCgFzYowpMrcxUC24iduIdMwwhRM7rKg +7GtIWMSrFfuI1XCLRmSlhDbhNN6fVg2f8Bo9PdH9ihiIyxSrc+FOUasUYCCJvlSZ +8hFUlLvcmrZlWuazohm0lsXuMK1JflmQr/DA/uXxP9xzFfRy+RU3jDyxJbRHAgMB +AAGjUzBRMB0GA1UdDgQWBBSQJyxiPMRK01i+0BsV9zUwDiBaHzAfBgNVHSMEGDAW +gBSQJyxiPMRK01i+0BsV9zUwDiBaHzAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3 +DQEBCwUAA4ICAQCR+7a7N/m+WLkxPPIA/CB4MOr2Uf8ixTv435Nyv6rXOun0+lTP +ExSZ0uYQ+L0WylItI3cQHULldDueD+s8TGzxf5woaLKf6tqyr0NYhKs+UeNEzDnN +9PHQIhX0SZw3XyXGUgPNBfRCg2ZDdtMMdOU4XlQN/IN/9hbYTrueyY7eXq9hmtI9 +1srftAMqr9SR1JP7aHI6DVgrEsZVMTDnfT8WmLSGLlY1HmGfdEn1Ip5sbo9uSkiH +AEPgPfjYIvR5LqTOMn4KsrlZyBbFIDh9Sl99M1kZzgH6zUGVLCDg1y6Cms69fx/e +W1HoIeVkY4b4TY7Bk7JsqyNhIuqu7ARaxkdaZWhYaA2YyknwANdFfNpfH+elCLIk +BUt5S3f4i7DaUePTvKukCZiCq4Oyln7RcOn5If73wCeLB/ZM9Ei1HforyLWP1CN8 +XLfpHaoeoPSWIveI0XHUl65LsPN2UbMbul/F23hwl+h8+BLmyAS680Yhn4zEN6Ku +B7Po90HoFa1Du3bmx4jsN73UkT/dwMTi6K072FbipnC1904oGlWmLwvAHvrtxxmL +Pl3pvEaZIu8wa/PNF6Y7J7VIewikIJq6Ta6FrWeFfzMWOj2qA1ZZi6fUaDSNYvuV +J5quYKCc/O+I/yDDf8wyBbZ/gvUXzUHTMYGG+bFrn1p7XDbYYeEJ6R/xEg== +-----END CERTIFICATE----- diff -Nru pypy-7.1.1+dfsg/lib-python/2.7/test/selfsigned_pythontestdotnet.pem pypy-7.3.1+dfsg/lib-python/2.7/test/selfsigned_pythontestdotnet.pem --- pypy-7.1.1+dfsg/lib-python/2.7/test/selfsigned_pythontestdotnet.pem 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/lib-python/2.7/test/selfsigned_pythontestdotnet.pem 2020-04-10 19:28:40.000000000 +0000 @@ -1,16 +1,34 @@ -----BEGIN CERTIFICATE----- -MIIClTCCAf6gAwIBAgIJAKGU95wKR8pTMA0GCSqGSIb3DQEBBQUAMHAxCzAJBgNV -BAYTAlhZMRcwFQYDVQQHDA5DYXN0bGUgQW50aHJheDEjMCEGA1UECgwaUHl0aG9u -IFNvZnR3YXJlIEZvdW5kYXRpb24xIzAhBgNVBAMMGnNlbGYtc2lnbmVkLnB5dGhv -bnRlc3QubmV0MB4XDTE0MTEwMjE4MDkyOVoXDTI0MTAzMDE4MDkyOVowcDELMAkG -A1UEBhMCWFkxFzAVBgNVBAcMDkNhc3RsZSBBbnRocmF4MSMwIQYDVQQKDBpQeXRo -b24gU29mdHdhcmUgRm91bmRhdGlvbjEjMCEGA1UEAwwac2VsZi1zaWduZWQucHl0 -aG9udGVzdC5uZXQwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANDXQXW9tjyZ -Xt0Iv2tLL1+jinr4wGg36ioLDLFkMf+2Y1GL0v0BnKYG4N1OKlAU15LXGeGer8vm -Sv/yIvmdrELvhAbbo3w4a9TMYQA4XkIVLdvu3mvNOAet+8PMJxn26dbDhG809ALv -EHY57lQsBS3G59RZyBPVqAqmImWNJnVzAgMBAAGjNzA1MCUGA1UdEQQeMByCGnNl -bGYtc2lnbmVkLnB5dGhvbnRlc3QubmV0MAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcN -AQEFBQADgYEAIuzAhgMouJpNdf3URCHIineyoSt6WK/9+eyUcjlKOrDoXNZaD72h -TXMeKYoWvJyVcSLKL8ckPtDobgP2OTt0UkyAaj0n+ZHaqq1lH2yVfGUA1ILJv515 -C8BqbvVZuqm3i7ygmw3bqE/lYMgOrYtXXnqOrz6nvsE6Yc9V9rFflOM= +MIIF9zCCA9+gAwIBAgIUH98b4Fw/DyugC9cV7VK7ZODzHsIwDQYJKoZIhvcNAQEL +BQAwgYoxCzAJBgNVBAYTAlhZMRcwFQYDVQQIDA5DYXN0bGUgQW50aHJheDEYMBYG +A1UEBwwPQXJndW1lbnQgQ2xpbmljMSMwIQYDVQQKDBpQeXRob24gU29mdHdhcmUg +Rm91bmRhdGlvbjEjMCEGA1UEAwwac2VsZi1zaWduZWQucHl0aG9udGVzdC5uZXQw +HhcNMTkwNTA4MDEwMjQzWhcNMjcwNzI0MDEwMjQzWjCBijELMAkGA1UEBhMCWFkx +FzAVBgNVBAgMDkNhc3RsZSBBbnRocmF4MRgwFgYDVQQHDA9Bcmd1bWVudCBDbGlu +aWMxIzAhBgNVBAoMGlB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uMSMwIQYDVQQD +DBpzZWxmLXNpZ25lZC5weXRob250ZXN0Lm5ldDCCAiIwDQYJKoZIhvcNAQEBBQAD +ggIPADCCAgoCggIBAMKdJlyCThkahwoBb7pl5q64Pe9Fn5jrIvzsveHTc97TpjV2 +RLfICnXKrltPk/ohkVl6K5SUZQZwMVzFubkyxE0nZPHYHlpiKWQxbsYVkYv01rix +IFdLvaxxbGYke2jwQao31s4o61AdlsfK1SdpHQUynBBMssqI3SB4XPmcA7e+wEEx +jxjVish4ixA1vuIZOx8yibu+CFCf/geEjoBMF3QPdzULzlrCSw8k/45iZCSoNbvK +DoL4TVV07PHOxpheDh8ZQmepGvU6pVqhb9m4lgmV0OGWHgozd5Ur9CbTVDmxIEz3 +TSoRtNJK7qtyZdGNqwjksQxgZTjM/d/Lm/BJG99AiOmYOjsl9gbQMZgvQmMAtUsI +aMJnQuZ6R+KEpW/TR5qSKLWZSG45z/op+tzI2m+cE6HwTRVAWbcuJxcAA55MZjqU +OOOu3BBYMjS5nf2sQ9uoXsVBFH7i0mQqoW1SLzr9opI8KsWwFxQmO2vBxWYaN+lH +OmwBZBwyODIsmI1YGXmTp09NxRYz3Qe5GCgFzYowpMrcxUC24iduIdMwwhRM7rKg +7GtIWMSrFfuI1XCLRmSlhDbhNN6fVg2f8Bo9PdH9ihiIyxSrc+FOUasUYCCJvlSZ +8hFUlLvcmrZlWuazohm0lsXuMK1JflmQr/DA/uXxP9xzFfRy+RU3jDyxJbRHAgMB +AAGjUzBRMB0GA1UdDgQWBBSQJyxiPMRK01i+0BsV9zUwDiBaHzAfBgNVHSMEGDAW +gBSQJyxiPMRK01i+0BsV9zUwDiBaHzAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3 +DQEBCwUAA4ICAQCR+7a7N/m+WLkxPPIA/CB4MOr2Uf8ixTv435Nyv6rXOun0+lTP +ExSZ0uYQ+L0WylItI3cQHULldDueD+s8TGzxf5woaLKf6tqyr0NYhKs+UeNEzDnN +9PHQIhX0SZw3XyXGUgPNBfRCg2ZDdtMMdOU4XlQN/IN/9hbYTrueyY7eXq9hmtI9 +1srftAMqr9SR1JP7aHI6DVgrEsZVMTDnfT8WmLSGLlY1HmGfdEn1Ip5sbo9uSkiH +AEPgPfjYIvR5LqTOMn4KsrlZyBbFIDh9Sl99M1kZzgH6zUGVLCDg1y6Cms69fx/e +W1HoIeVkY4b4TY7Bk7JsqyNhIuqu7ARaxkdaZWhYaA2YyknwANdFfNpfH+elCLIk +BUt5S3f4i7DaUePTvKukCZiCq4Oyln7RcOn5If73wCeLB/ZM9Ei1HforyLWP1CN8 +XLfpHaoeoPSWIveI0XHUl65LsPN2UbMbul/F23hwl+h8+BLmyAS680Yhn4zEN6Ku +B7Po90HoFa1Du3bmx4jsN73UkT/dwMTi6K072FbipnC1904oGlWmLwvAHvrtxxmL +Pl3pvEaZIu8wa/PNF6Y7J7VIewikIJq6Ta6FrWeFfzMWOj2qA1ZZi6fUaDSNYvuV +J5quYKCc/O+I/yDDf8wyBbZ/gvUXzUHTMYGG+bFrn1p7XDbYYeEJ6R/xEg== -----END CERTIFICATE----- diff -Nru pypy-7.1.1+dfsg/lib-python/2.7/test/test_curses.py pypy-7.3.1+dfsg/lib-python/2.7/test/test_curses.py --- pypy-7.1.1+dfsg/lib-python/2.7/test/test_curses.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/lib-python/2.7/test/test_curses.py 2020-04-10 19:28:40.000000000 +0000 @@ -15,7 +15,8 @@ import tempfile import unittest -from test.test_support import requires, import_module, verbose, run_unittest +from test.test_support import (requires, import_module, verbose, run_unittest, + cpython_only) # Optionally test curses module. This currently requires that the # 'curses' resource be given on the regrtest command line using the -u @@ -276,6 +277,7 @@ msg='userptr should fail since not set'): p.userptr() + @cpython_only def test_userptr_memory_leak(self): w = curses.newwin(10, 10) p = curses.panel.new_panel(w) @@ -288,6 +290,7 @@ self.assertEqual(sys.getrefcount(obj), nrefs, "set_userptr leaked references") + @cpython_only def test_userptr_segfault(self): panel = curses.panel.new_panel(self.stdscr) class A: diff -Nru pypy-7.1.1+dfsg/lib-python/2.7/test/test_dictviews.py pypy-7.3.1+dfsg/lib-python/2.7/test/test_dictviews.py --- pypy-7.1.1+dfsg/lib-python/2.7/test/test_dictviews.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/lib-python/2.7/test/test_dictviews.py 2020-04-10 19:28:40.000000000 +0000 @@ -1,5 +1,6 @@ import copy import pickle +import sys import unittest import collections from test import test_support @@ -169,6 +170,20 @@ def test_recursive_repr(self): d = {} d[42] = d.viewvalues() + r = repr(d) + # Cannot perform a stronger test, as the contents of the repr + # are implementation-dependent. All we can say is that we + # want a str result, not an exception of any sort. + self.assertIsInstance(r, str) + d[42] = d.viewitems() + r = repr(d) + # Again. + self.assertIsInstance(r, str) + + def test_deeply_nested_repr(self): + d = {} + for i in range(sys.getrecursionlimit() + 200): + d = {42: d.viewvalues()} self.assertRaises(RuntimeError, repr, d) def test_abc_registry(self): diff -Nru pypy-7.1.1+dfsg/lib-python/2.7/test/test_ftplib.py pypy-7.3.1+dfsg/lib-python/2.7/test/test_ftplib.py --- pypy-7.1.1+dfsg/lib-python/2.7/test/test_ftplib.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/lib-python/2.7/test/test_ftplib.py 2020-04-10 19:28:40.000000000 +0000 @@ -234,11 +234,17 @@ def run(self): self.active = True self.__flag.set() - while self.active and asyncore.socket_map: - self.active_lock.acquire() - asyncore.loop(timeout=0.1, count=1) - self.active_lock.release() - asyncore.close_all(ignore_all=True) + try: + while self.active and asyncore.socket_map: + self.active_lock.acquire() + try: + asyncore.loop(timeout=0.1, count=1) + except: + self.active_lock.release() + raise + self.active_lock.release() + finally: + asyncore.close_all(ignore_all=True) def stop(self): assert self.active diff -Nru pypy-7.1.1+dfsg/lib-python/2.7/test/test_import.py pypy-7.3.1+dfsg/lib-python/2.7/test/test_import.py --- pypy-7.1.1+dfsg/lib-python/2.7/test/test_import.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/lib-python/2.7/test/test_import.py 2020-04-10 19:28:40.000000000 +0000 @@ -87,6 +87,8 @@ "module loaded (%s) but contents invalid" % mod) finally: if check_impl_detail(pypy=False): + # pypy refuses the import the .pyc file (below) after + # we remove the .py file unlink(source) try: @@ -98,6 +100,8 @@ unlink(pyc) unlink(pyo) unload(TESTFN) + # in pypy, remove the .py file now (instead of above) + unlink(source) sys.path.insert(0, os.curdir) try: diff -Nru pypy-7.1.1+dfsg/lib-python/2.7/test/test_ssl.py pypy-7.3.1+dfsg/lib-python/2.7/test/test_ssl.py --- pypy-7.1.1+dfsg/lib-python/2.7/test/test_ssl.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/lib-python/2.7/test/test_ssl.py 2020-04-10 19:28:40.000000000 +0000 @@ -764,12 +764,17 @@ ctx.set_ciphers("^$:,;?*'dorothyx") @skip_if_broken_ubuntu_ssl - def test_options(self): + def _test_options(self): + ''' + Disable this test, it is too flaky. Different platforms define + different defaults + ''' ctx = ssl.SSLContext(ssl.PROTOCOL_TLSv1) # OP_ALL | OP_NO_SSLv2 | OP_NO_SSLv3 is the default value default = (ssl.OP_ALL | ssl.OP_NO_SSLv2 | ssl.OP_NO_SSLv3) if not IS_LIBRESSL and ssl.OPENSSL_VERSION_INFO >= (1, 1, 0): default |= ssl.OP_NO_COMPRESSION + default |= ssl.OP_ENABLE_MIDDLEBOX_COMPAT self.assertEqual(default, ctx.options) ctx.options |= ssl.OP_NO_TLSv1 self.assertEqual(default | ssl.OP_NO_TLSv1, ctx.options) diff -Nru pypy-7.1.1+dfsg/lib-python/2.7/test/test_sys.py pypy-7.3.1+dfsg/lib-python/2.7/test/test_sys.py --- pypy-7.1.1+dfsg/lib-python/2.7/test/test_sys.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/lib-python/2.7/test/test_sys.py 2020-04-10 19:28:40.000000000 +0000 @@ -216,6 +216,11 @@ raise ValueError() except ValueError, e: pass + except MemoryError: + # Documentation for setrecursionlimit says: "The highest possible + # limit is platform-dependent. ... a too-high limit can lead to a + # crash" so we allow MemoryError here + pass finally: sys.setrecursionlimit(oldlimit) diff -Nru pypy-7.1.1+dfsg/lib-python/2.7/test/test_timeit.py pypy-7.3.1+dfsg/lib-python/2.7/test/test_timeit.py --- pypy-7.1.1+dfsg/lib-python/2.7/test/test_timeit.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/lib-python/2.7/test/test_timeit.py 2020-04-10 19:28:40.000000000 +0000 @@ -317,9 +317,9 @@ def test_main_recommends_perf(self): s = self.run_main(seconds_per_increment=2.0, switches=['-n35', '-s', 'print("CustomSetup")']) self.assertIn(dedent("""\ - WARNING: timeit is a very unreliable tool. use perf or something else for real measurements + WARNING: timeit is a very unreliable tool. use pyperf or something else for real measurements """), s) - self.assertIn("-m pip install perf", s) + self.assertIn("-m pip install pyperf", s) diff -Nru pypy-7.1.1+dfsg/lib-python/2.7/test/test_unicode.py pypy-7.3.1+dfsg/lib-python/2.7/test/test_unicode.py --- pypy-7.1.1+dfsg/lib-python/2.7/test/test_unicode.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/lib-python/2.7/test/test_unicode.py 2020-04-10 19:28:40.000000000 +0000 @@ -1652,10 +1652,10 @@ # when a string allocation fails with a MemoryError. # This used to crash the interpreter, # or leak references when the number was smaller. - charwidth = 4 if sys.maxunicode >= 0x10000 else 2 + charwidth = 2 # pypy: the char \u0123 is stored in two utf-8 bytes # Note: sys.maxsize is half of the actual max allocation because of # the signedness of Py_ssize_t. - alloc = lambda: u"a" * (sys.maxsize // charwidth * 2) + alloc = lambda: u"\u0123" * (sys.maxsize // charwidth * 2) self.assertRaises(MemoryError, alloc) self.assertRaises(MemoryError, alloc) diff -Nru pypy-7.1.1+dfsg/lib-python/2.7/timeit.py pypy-7.3.1+dfsg/lib-python/2.7/timeit.py --- pypy-7.1.1+dfsg/lib-python/2.7/timeit.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/lib-python/2.7/timeit.py 2020-04-10 19:28:40.000000000 +0000 @@ -308,10 +308,10 @@ return 0 setup = "\n".join(setup) or "pass" - print "WARNING: timeit is a very unreliable tool. use perf or something else for real measurements" + print "WARNING: timeit is a very unreliable tool. use pyperf or something else for real measurements" executable = os.path.basename(sys.executable) - print "%s -m pip install perf" % executable - print "%s -m perf timeit %s" % ( + print "%s -m pip install pyperf" % executable + print "%s -m pyperf timeit %s" % ( executable, " ".join([(arg if arg.startswith("-") else repr(arg)) for arg in origargs]), ) diff -Nru pypy-7.1.1+dfsg/lib-python/3/_osx_support.py pypy-7.3.1+dfsg/lib-python/3/_osx_support.py --- pypy-7.1.1+dfsg/lib-python/3/_osx_support.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/lib-python/3/_osx_support.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,488 +0,0 @@ -"""Shared OS X support functions.""" - -import os -import re -import sys - -__all__ = [ - 'compiler_fixup', - 'customize_config_vars', - 'customize_compiler', - 'get_platform_osx', -] - -# configuration variables that may contain universal build flags, -# like "-arch" or "-isdkroot", that may need customization for -# the user environment -_UNIVERSAL_CONFIG_VARS = ('CFLAGS', 'LDFLAGS', 'CPPFLAGS', 'BASECFLAGS', - 'BLDSHARED', 'LDSHARED', 'CC', 'CXX', - 'PY_CFLAGS', 'PY_LDFLAGS', 'PY_CPPFLAGS', - 'PY_CORE_CFLAGS') - -# configuration variables that may contain compiler calls -_COMPILER_CONFIG_VARS = ('BLDSHARED', 'LDSHARED', 'CC', 'CXX') - -# prefix added to original configuration variable names -_INITPRE = '_OSX_SUPPORT_INITIAL_' - - -def _find_executable(executable, path=None): - """Tries to find 'executable' in the directories listed in 'path'. - - A string listing directories separated by 'os.pathsep'; defaults to - os.environ['PATH']. Returns the complete filename or None if not found. - """ - if path is None: - path = os.environ['PATH'] - - paths = path.split(os.pathsep) - base, ext = os.path.splitext(executable) - - if (sys.platform == 'win32' or os.name == 'os2') and (ext != '.exe'): - executable = executable + '.exe' - - if not os.path.isfile(executable): - for p in paths: - f = os.path.join(p, executable) - if os.path.isfile(f): - # the file exists, we have a shot at spawn working - return f - return None - else: - return executable - - -def _read_output(commandstring): - """Output from succesful command execution or None""" - # Similar to os.popen(commandstring, "r").read(), - # but without actually using os.popen because that - # function is not usable during python bootstrap. - # tempfile is also not available then. - import contextlib - try: - import tempfile - fp = tempfile.NamedTemporaryFile() - except ImportError: - fp = open("/tmp/_osx_support.%s"%( - os.getpid(),), "w+b") - - with contextlib.closing(fp) as fp: - cmd = "%s 2>/dev/null >'%s'" % (commandstring, fp.name) - return fp.read().decode('utf-8').strip() if not os.system(cmd) else None - - -def _find_build_tool(toolname): - """Find a build tool on current path or using xcrun""" - return (_find_executable(toolname) - or _read_output("/usr/bin/xcrun -find %s" % (toolname,)) - or '' - ) - -_SYSTEM_VERSION = None - -def _get_system_version(): - """Return the OS X system version as a string""" - # Reading this plist is a documented way to get the system - # version (see the documentation for the Gestalt Manager) - # We avoid using platform.mac_ver to avoid possible bootstrap issues during - # the build of Python itself (distutils is used to build standard library - # extensions). - - global _SYSTEM_VERSION - - if _SYSTEM_VERSION is None: - _SYSTEM_VERSION = '' - try: - f = open('/System/Library/CoreServices/SystemVersion.plist') - except IOError: - # We're on a plain darwin box, fall back to the default - # behaviour. - pass - else: - try: - m = re.search(r'ProductUserVisibleVersion\s*' - r'(.*?)', f.read()) - finally: - f.close() - if m is not None: - _SYSTEM_VERSION = '.'.join(m.group(1).split('.')[:2]) - # else: fall back to the default behaviour - - return _SYSTEM_VERSION - -def _remove_original_values(_config_vars): - """Remove original unmodified values for testing""" - # This is needed for higher-level cross-platform tests of get_platform. - for k in list(_config_vars): - if k.startswith(_INITPRE): - del _config_vars[k] - -def _save_modified_value(_config_vars, cv, newvalue): - """Save modified and original unmodified value of configuration var""" - - oldvalue = _config_vars.get(cv, '') - if (oldvalue != newvalue) and (_INITPRE + cv not in _config_vars): - _config_vars[_INITPRE + cv] = oldvalue - _config_vars[cv] = newvalue - -def _supports_universal_builds(): - """Returns True if universal builds are supported on this system""" - # As an approximation, we assume that if we are running on 10.4 or above, - # then we are running with an Xcode environment that supports universal - # builds, in particular -isysroot and -arch arguments to the compiler. This - # is in support of allowing 10.4 universal builds to run on 10.3.x systems. - - osx_version = _get_system_version() - if osx_version: - try: - osx_version = tuple(int(i) for i in osx_version.split('.')) - except ValueError: - osx_version = '' - return bool(osx_version >= (10, 4)) if osx_version else False - - -def _find_appropriate_compiler(_config_vars): - """Find appropriate C compiler for extension module builds""" - - # Issue #13590: - # The OSX location for the compiler varies between OSX - # (or rather Xcode) releases. With older releases (up-to 10.5) - # the compiler is in /usr/bin, with newer releases the compiler - # can only be found inside Xcode.app if the "Command Line Tools" - # are not installed. - # - # Futhermore, the compiler that can be used varies between - # Xcode releases. Upto Xcode 4 it was possible to use 'gcc-4.2' - # as the compiler, after that 'clang' should be used because - # gcc-4.2 is either not present, or a copy of 'llvm-gcc' that - # miscompiles Python. - - # skip checks if the compiler was overriden with a CC env variable - if 'CC' in os.environ: - return _config_vars - - # The CC config var might contain additional arguments. - # Ignore them while searching. - cc = oldcc = _config_vars['CC'].split()[0] - if not _find_executable(cc): - # Compiler is not found on the shell search PATH. - # Now search for clang, first on PATH (if the Command LIne - # Tools have been installed in / or if the user has provided - # another location via CC). If not found, try using xcrun - # to find an uninstalled clang (within a selected Xcode). - - # NOTE: Cannot use subprocess here because of bootstrap - # issues when building Python itself (and os.popen is - # implemented on top of subprocess and is therefore not - # usable as well) - - cc = _find_build_tool('clang') - - elif os.path.basename(cc).startswith('gcc'): - # Compiler is GCC, check if it is LLVM-GCC - data = _read_output("'%s' --version" - % (cc.replace("'", "'\"'\"'"),)) - if 'llvm-gcc' in data: - # Found LLVM-GCC, fall back to clang - cc = _find_build_tool('clang') - - if not cc: - raise SystemError( - "Cannot locate working compiler") - - if cc != oldcc: - # Found a replacement compiler. - # Modify config vars using new compiler, if not already explictly - # overriden by an env variable, preserving additional arguments. - for cv in _COMPILER_CONFIG_VARS: - if cv in _config_vars and cv not in os.environ: - cv_split = _config_vars[cv].split() - cv_split[0] = cc if cv != 'CXX' else cc + '++' - _save_modified_value(_config_vars, cv, ' '.join(cv_split)) - - return _config_vars - - -def _remove_universal_flags(_config_vars): - """Remove all universal build arguments from config vars""" - - for cv in _UNIVERSAL_CONFIG_VARS: - # Do not alter a config var explicitly overriden by env var - if cv in _config_vars and cv not in os.environ: - flags = _config_vars[cv] - flags = re.sub('-arch\s+\w+\s', ' ', flags, re.ASCII) - flags = re.sub('-isysroot [^ \t]*', ' ', flags) - _save_modified_value(_config_vars, cv, flags) - - return _config_vars - - -def _remove_unsupported_archs(_config_vars): - """Remove any unsupported archs from config vars""" - # Different Xcode releases support different sets for '-arch' - # flags. In particular, Xcode 4.x no longer supports the - # PPC architectures. - # - # This code automatically removes '-arch ppc' and '-arch ppc64' - # when these are not supported. That makes it possible to - # build extensions on OSX 10.7 and later with the prebuilt - # 32-bit installer on the python.org website. - - # skip checks if the compiler was overriden with a CC env variable - if 'CC' in os.environ: - return _config_vars - - if re.search('-arch\s+ppc', _config_vars['CFLAGS']) is not None: - # NOTE: Cannot use subprocess here because of bootstrap - # issues when building Python itself - status = os.system("'%s' -arch ppc -x c /dev/null 2>/dev/null"%( - _config_vars['CC'].replace("'", "'\"'\"'"),)) - # The Apple compiler drivers return status 255 if no PPC - if (status >> 8) == 255: - # Compiler doesn't support PPC, remove the related - # '-arch' flags if not explicitly overridden by an - # environment variable - for cv in _UNIVERSAL_CONFIG_VARS: - if cv in _config_vars and cv not in os.environ: - flags = _config_vars[cv] - flags = re.sub('-arch\s+ppc\w*\s', ' ', flags) - _save_modified_value(_config_vars, cv, flags) - - return _config_vars - - -def _override_all_archs(_config_vars): - """Allow override of all archs with ARCHFLAGS env var""" - # NOTE: This name was introduced by Apple in OSX 10.5 and - # is used by several scripting languages distributed with - # that OS release. - if 'ARCHFLAGS' in os.environ: - arch = os.environ['ARCHFLAGS'] - for cv in _UNIVERSAL_CONFIG_VARS: - if cv in _config_vars and '-arch' in _config_vars[cv]: - flags = _config_vars[cv] - flags = re.sub('-arch\s+\w+\s', ' ', flags) - flags = flags + ' ' + arch - _save_modified_value(_config_vars, cv, flags) - - return _config_vars - - -def _check_for_unavailable_sdk(_config_vars): - """Remove references to any SDKs not available""" - # If we're on OSX 10.5 or later and the user tries to - # compile an extension using an SDK that is not present - # on the current machine it is better to not use an SDK - # than to fail. This is particularly important with - # the standalong Command Line Tools alternative to a - # full-blown Xcode install since the CLT packages do not - # provide SDKs. If the SDK is not present, it is assumed - # that the header files and dev libs have been installed - # to /usr and /System/Library by either a standalone CLT - # package or the CLT component within Xcode. - cflags = _config_vars.get('CFLAGS', '') - m = re.search(r'-isysroot\s+(\S+)', cflags) - if m is not None: - sdk = m.group(1) - if not os.path.exists(sdk): - for cv in _UNIVERSAL_CONFIG_VARS: - # Do not alter a config var explicitly overriden by env var - if cv in _config_vars and cv not in os.environ: - flags = _config_vars[cv] - flags = re.sub(r'-isysroot\s+\S+(?:\s|$)', ' ', flags) - _save_modified_value(_config_vars, cv, flags) - - return _config_vars - - -def compiler_fixup(compiler_so, cc_args): - """ - This function will strip '-isysroot PATH' and '-arch ARCH' from the - compile flags if the user has specified one them in extra_compile_flags. - - This is needed because '-arch ARCH' adds another architecture to the - build, without a way to remove an architecture. Furthermore GCC will - barf if multiple '-isysroot' arguments are present. - """ - stripArch = stripSysroot = False - - compiler_so = list(compiler_so) - - if not _supports_universal_builds(): - # OSX before 10.4.0, these don't support -arch and -isysroot at - # all. - stripArch = stripSysroot = True - else: - stripArch = '-arch' in cc_args - stripSysroot = '-isysroot' in cc_args - - if stripArch or 'ARCHFLAGS' in os.environ: - while True: - try: - index = compiler_so.index('-arch') - # Strip this argument and the next one: - del compiler_so[index:index+2] - except ValueError: - break - - if 'ARCHFLAGS' in os.environ and not stripArch: - # User specified different -arch flags in the environ, - # see also distutils.sysconfig - compiler_so = compiler_so + os.environ['ARCHFLAGS'].split() - - if stripSysroot: - while True: - try: - index = compiler_so.index('-isysroot') - # Strip this argument and the next one: - del compiler_so[index:index+2] - except ValueError: - break - - # Check if the SDK that is used during compilation actually exists, - # the universal build requires the usage of a universal SDK and not all - # users have that installed by default. - sysroot = None - if '-isysroot' in cc_args: - idx = cc_args.index('-isysroot') - sysroot = cc_args[idx+1] - elif '-isysroot' in compiler_so: - idx = compiler_so.index('-isysroot') - sysroot = compiler_so[idx+1] - - if sysroot and not os.path.isdir(sysroot): - from distutils import log - log.warn("Compiling with an SDK that doesn't seem to exist: %s", - sysroot) - log.warn("Please check your Xcode installation") - - return compiler_so - - -def customize_config_vars(_config_vars): - """Customize Python build configuration variables. - - Called internally from sysconfig with a mutable mapping - containing name/value pairs parsed from the configured - makefile used to build this interpreter. Returns - the mapping updated as needed to reflect the environment - in which the interpreter is running; in the case of - a Python from a binary installer, the installed - environment may be very different from the build - environment, i.e. different OS levels, different - built tools, different available CPU architectures. - - This customization is performed whenever - distutils.sysconfig.get_config_vars() is first - called. It may be used in environments where no - compilers are present, i.e. when installing pure - Python dists. Customization of compiler paths - and detection of unavailable archs is deferred - until the first extention module build is - requested (in distutils.sysconfig.customize_compiler). - - Currently called from distutils.sysconfig - """ - - if not _supports_universal_builds(): - # On Mac OS X before 10.4, check if -arch and -isysroot - # are in CFLAGS or LDFLAGS and remove them if they are. - # This is needed when building extensions on a 10.3 system - # using a universal build of python. - _remove_universal_flags(_config_vars) - - # Allow user to override all archs with ARCHFLAGS env var - _override_all_archs(_config_vars) - - # Remove references to sdks that are not found - _check_for_unavailable_sdk(_config_vars) - - return _config_vars - - -def customize_compiler(_config_vars): - """Customize compiler path and configuration variables. - - This customization is performed when the first - extension module build is requested - in distutils.sysconfig.customize_compiler). - """ - - # Find a compiler to use for extension module builds - _find_appropriate_compiler(_config_vars) - - # Remove ppc arch flags if not supported here - _remove_unsupported_archs(_config_vars) - - # Allow user to override all archs with ARCHFLAGS env var - _override_all_archs(_config_vars) - - return _config_vars - - -def get_platform_osx(_config_vars, osname, release, machine): - """Filter values for get_platform()""" - # called from get_platform() in sysconfig and distutils.util - # - # For our purposes, we'll assume that the system version from - # distutils' perspective is what MACOSX_DEPLOYMENT_TARGET is set - # to. This makes the compatibility story a bit more sane because the - # machine is going to compile and link as if it were - # MACOSX_DEPLOYMENT_TARGET. - - macver = _config_vars.get('MACOSX_DEPLOYMENT_TARGET', '') - macrelease = _get_system_version() or macver - macver = macver or macrelease - - if macver: - release = macver - osname = "macosx" - - # Use the original CFLAGS value, if available, so that we - # return the same machine type for the platform string. - # Otherwise, distutils may consider this a cross-compiling - # case and disallow installs. - cflags = _config_vars.get(_INITPRE+'CFLAGS', - _config_vars.get('CFLAGS', '')) - if ((macrelease + '.') >= '10.4.' and - '-arch' in cflags.strip()): - # The universal build will build fat binaries, but not on - # systems before 10.4 - - machine = 'fat' - - archs = re.findall('-arch\s+(\S+)', cflags) - archs = tuple(sorted(set(archs))) - - if len(archs) == 1: - machine = archs[0] - elif archs == ('i386', 'ppc'): - machine = 'fat' - elif archs == ('i386', 'x86_64'): - machine = 'intel' - elif archs == ('i386', 'ppc', 'x86_64'): - machine = 'fat3' - elif archs == ('ppc64', 'x86_64'): - machine = 'fat64' - elif archs == ('i386', 'ppc', 'ppc64', 'x86_64'): - machine = 'universal' - else: - raise ValueError( - "Don't know machine value for archs=%r" % (archs,)) - - elif machine == 'i386': - # On OSX the machine type returned by uname is always the - # 32-bit variant, even if the executable architecture is - # the 64-bit variant - if sys.maxsize >= 2**32: - machine = 'x86_64' - - elif machine in ('PowerPC', 'Power_Macintosh'): - # Pick a sane name for the PPC architecture. - # See 'i386' case - if sys.maxsize >= 2**32: - machine = 'ppc64' - else: - machine = 'ppc' - - return (osname, release, machine) diff -Nru pypy-7.1.1+dfsg/lib-python/3/test/crashers/trace_at_recursion_limit.py pypy-7.3.1+dfsg/lib-python/3/test/crashers/trace_at_recursion_limit.py --- pypy-7.1.1+dfsg/lib-python/3/test/crashers/trace_at_recursion_limit.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/lib-python/3/test/crashers/trace_at_recursion_limit.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,27 +0,0 @@ -""" -From http://bugs.python.org/issue6717 - -A misbehaving trace hook can trigger a segfault by exceeding the recursion -limit. -""" -import sys - - -def x(): - pass - -def g(*args): - if True: # change to True to crash interpreter - try: - x() - except: - pass - return g - -def f(): - print(sys.getrecursionlimit()) - f() - -sys.settrace(g) - -f() diff -Nru pypy-7.1.1+dfsg/lib-python/3/test/json_tests/test_tool.py pypy-7.3.1+dfsg/lib-python/3/test/json_tests/test_tool.py --- pypy-7.1.1+dfsg/lib-python/3/test/json_tests/test_tool.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/lib-python/3/test/json_tests/test_tool.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,69 +0,0 @@ -import os -import sys -import textwrap -import unittest -import subprocess -from test import support -from test.script_helper import assert_python_ok - -class TestTool(unittest.TestCase): - data = """ - - [["blorpie"],[ "whoops" ] , [ - ],\t"d-shtaeou",\r"d-nthiouh", - "i-vhbjkhnth", {"nifty":87}, {"morefield" :\tfalse,"field" - :"yes"} ] - """ - - expect = textwrap.dedent("""\ - [ - [ - "blorpie" - ], - [ - "whoops" - ], - [], - "d-shtaeou", - "d-nthiouh", - "i-vhbjkhnth", - { - "nifty": 87 - }, - { - "field": "yes", - "morefield": false - } - ] - """) - - def test_stdin_stdout(self): - with subprocess.Popen( - (sys.executable, '-m', 'json.tool'), - stdin=subprocess.PIPE, stdout=subprocess.PIPE) as proc: - out, err = proc.communicate(self.data.encode()) - self.assertEqual(out.splitlines(), self.expect.encode().splitlines()) - self.assertEqual(err, None) - - def _create_infile(self): - infile = support.TESTFN - with open(infile, "w") as fp: - self.addCleanup(os.remove, infile) - fp.write(self.data) - return infile - - def test_infile_stdout(self): - infile = self._create_infile() - rc, out, err = assert_python_ok('-m', 'json.tool', infile) - self.assertEqual(out.splitlines(), self.expect.encode().splitlines()) - self.assertEqual(err, b'') - - def test_infile_outfile(self): - infile = self._create_infile() - outfile = support.TESTFN + '.out' - rc, out, err = assert_python_ok('-m', 'json.tool', infile, outfile) - self.addCleanup(os.remove, outfile) - with open(outfile, "r") as fp: - self.assertEqual(fp.read(), self.expect) - self.assertEqual(out, b'') - self.assertEqual(err, b'') diff -Nru pypy-7.1.1+dfsg/lib-python/3/test/mp_fork_bomb.py pypy-7.3.1+dfsg/lib-python/3/test/mp_fork_bomb.py --- pypy-7.1.1+dfsg/lib-python/3/test/mp_fork_bomb.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/lib-python/3/test/mp_fork_bomb.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,13 +0,0 @@ -import multiprocessing, sys - -def foo(): - print("123") - -# Because "if __name__ == '__main__'" is missing this will not work -# correctly on Windows. However, we should get a RuntimeError rather -# than the Windows equivalent of a fork bomb. - -p = multiprocessing.Process(target=foo) -p.start() -p.join() -sys.exit(p.exitcode) diff -Nru pypy-7.1.1+dfsg/lib-python/3/test/sample_doctest_no_docstrings.py pypy-7.3.1+dfsg/lib-python/3/test/sample_doctest_no_docstrings.py --- pypy-7.1.1+dfsg/lib-python/3/test/sample_doctest_no_docstrings.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/lib-python/3/test/sample_doctest_no_docstrings.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,12 +0,0 @@ -# This is a sample module used for testing doctest. -# -# This module is for testing how doctest handles a module with no -# docstrings. - - -class Foo(object): - - # A class with no docstring. - - def __init__(self): - pass diff -Nru pypy-7.1.1+dfsg/lib-python/3/test/sample_doctest_no_doctests.py pypy-7.3.1+dfsg/lib-python/3/test/sample_doctest_no_doctests.py --- pypy-7.1.1+dfsg/lib-python/3/test/sample_doctest_no_doctests.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/lib-python/3/test/sample_doctest_no_doctests.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,15 +0,0 @@ -"""This is a sample module used for testing doctest. - -This module is for testing how doctest handles a module with docstrings -but no doctest examples. - -""" - - -class Foo(object): - """A docstring with no doctest examples. - - """ - - def __init__(self): - pass diff -Nru pypy-7.1.1+dfsg/lib-python/3/test/test_file_eintr.py pypy-7.3.1+dfsg/lib-python/3/test/test_file_eintr.py --- pypy-7.1.1+dfsg/lib-python/3/test/test_file_eintr.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/lib-python/3/test/test_file_eintr.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,236 +0,0 @@ -# Written to test interrupted system calls interfering with our many buffered -# IO implementations. http://bugs.python.org/issue12268 -# -# It was suggested that this code could be merged into test_io and the tests -# made to work using the same method as the existing signal tests in test_io. -# I was unable to get single process tests using alarm or setitimer that way -# to reproduce the EINTR problems. This process based test suite reproduces -# the problems prior to the issue12268 patch reliably on Linux and OSX. -# - gregory.p.smith - -import os -import select -import signal -import subprocess -import sys -from test.support import run_unittest -import time -import unittest - -# Test import all of the things we're about to try testing up front. -from _io import FileIO - - -@unittest.skipUnless(os.name == 'posix', 'tests requires a posix system.') -class TestFileIOSignalInterrupt(unittest.TestCase): - def setUp(self): - self._process = None - - def tearDown(self): - if self._process and self._process.poll() is None: - try: - self._process.kill() - except OSError: - pass - - def _generate_infile_setup_code(self): - """Returns the infile = ... line of code for the reader process. - - subclasseses should override this to test different IO objects. - """ - return ('import _io ;' - 'infile = _io.FileIO(sys.stdin.fileno(), "rb")') - - def fail_with_process_info(self, why, stdout=b'', stderr=b'', - communicate=True): - """A common way to cleanup and fail with useful debug output. - - Kills the process if it is still running, collects remaining output - and fails the test with an error message including the output. - - Args: - why: Text to go after "Error from IO process" in the message. - stdout, stderr: standard output and error from the process so - far to include in the error message. - communicate: bool, when True we call communicate() on the process - after killing it to gather additional output. - """ - if self._process.poll() is None: - time.sleep(0.1) # give it time to finish printing the error. - try: - self._process.terminate() # Ensure it dies. - except OSError: - pass - if communicate: - stdout_end, stderr_end = self._process.communicate() - stdout += stdout_end - stderr += stderr_end - self.fail('Error from IO process %s:\nSTDOUT:\n%sSTDERR:\n%s\n' % - (why, stdout.decode(), stderr.decode())) - - def _test_reading(self, data_to_write, read_and_verify_code): - """Generic buffered read method test harness to validate EINTR behavior. - - Also validates that Python signal handlers are run during the read. - - Args: - data_to_write: String to write to the child process for reading - before sending it a signal, confirming the signal was handled, - writing a final newline and closing the infile pipe. - read_and_verify_code: Single "line" of code to read from a file - object named 'infile' and validate the result. This will be - executed as part of a python subprocess fed data_to_write. - """ - infile_setup_code = self._generate_infile_setup_code() - # Total pipe IO in this function is smaller than the minimum posix OS - # pipe buffer size of 512 bytes. No writer should block. - assert len(data_to_write) < 512, 'data_to_write must fit in pipe buf.' - - # Start a subprocess to call our read method while handling a signal. - self._process = subprocess.Popen( - [sys.executable, '-u', '-c', - 'import signal, sys ;' - 'signal.signal(signal.SIGINT, ' - 'lambda s, f: sys.stderr.write("$\\n")) ;' - + infile_setup_code + ' ;' + - 'sys.stderr.write("Worm Sign!\\n") ;' - + read_and_verify_code + ' ;' + - 'infile.close()' - ], - stdin=subprocess.PIPE, stdout=subprocess.PIPE, - stderr=subprocess.PIPE) - - # Wait for the signal handler to be installed. - worm_sign = self._process.stderr.read(len(b'Worm Sign!\n')) - if worm_sign != b'Worm Sign!\n': # See also, Dune by Frank Herbert. - self.fail_with_process_info('while awaiting a sign', - stderr=worm_sign) - self._process.stdin.write(data_to_write) - - signals_sent = 0 - rlist = [] - # We don't know when the read_and_verify_code in our child is actually - # executing within the read system call we want to interrupt. This - # loop waits for a bit before sending the first signal to increase - # the likelihood of that. Implementations without correct EINTR - # and signal handling usually fail this test. - while not rlist: - rlist, _, _ = select.select([self._process.stderr], (), (), 0.05) - self._process.send_signal(signal.SIGINT) - signals_sent += 1 - if signals_sent > 200: - self._process.kill() - self.fail('reader process failed to handle our signals.') - # This assumes anything unexpected that writes to stderr will also - # write a newline. That is true of the traceback printing code. - signal_line = self._process.stderr.readline() - if signal_line != b'$\n': - self.fail_with_process_info('while awaiting signal', - stderr=signal_line) - - # We append a newline to our input so that a readline call can - # end on its own before the EOF is seen and so that we're testing - # the read call that was interrupted by a signal before the end of - # the data stream has been reached. - stdout, stderr = self._process.communicate(input=b'\n') - if self._process.returncode: - self.fail_with_process_info( - 'exited rc=%d' % self._process.returncode, - stdout, stderr, communicate=False) - # PASS! - - # String format for the read_and_verify_code used by read methods. - _READING_CODE_TEMPLATE = ( - 'got = infile.{read_method_name}() ;' - 'expected = {expected!r} ;' - 'assert got == expected, (' - '"{read_method_name} returned wrong data.\\n"' - '"got data %r\\nexpected %r" % (got, expected))' - ) - - def test_readline(self): - """readline() must handle signals and not lose data.""" - self._test_reading( - data_to_write=b'hello, world!', - read_and_verify_code=self._READING_CODE_TEMPLATE.format( - read_method_name='readline', - expected=b'hello, world!\n')) - - def test_readlines(self): - """readlines() must handle signals and not lose data.""" - self._test_reading( - data_to_write=b'hello\nworld!', - read_and_verify_code=self._READING_CODE_TEMPLATE.format( - read_method_name='readlines', - expected=[b'hello\n', b'world!\n'])) - - def test_readall(self): - """readall() must handle signals and not lose data.""" - self._test_reading( - data_to_write=b'hello\nworld!', - read_and_verify_code=self._READING_CODE_TEMPLATE.format( - read_method_name='readall', - expected=b'hello\nworld!\n')) - # read() is the same thing as readall(). - self._test_reading( - data_to_write=b'hello\nworld!', - read_and_verify_code=self._READING_CODE_TEMPLATE.format( - read_method_name='read', - expected=b'hello\nworld!\n')) - - -class TestBufferedIOSignalInterrupt(TestFileIOSignalInterrupt): - def _generate_infile_setup_code(self): - """Returns the infile = ... line of code to make a BufferedReader.""" - return ('infile = open(sys.stdin.fileno(), "rb") ;' - 'import _io ;assert isinstance(infile, _io.BufferedReader)') - - def test_readall(self): - """BufferedReader.read() must handle signals and not lose data.""" - self._test_reading( - data_to_write=b'hello\nworld!', - read_and_verify_code=self._READING_CODE_TEMPLATE.format( - read_method_name='read', - expected=b'hello\nworld!\n')) - - -class TestTextIOSignalInterrupt(TestFileIOSignalInterrupt): - def _generate_infile_setup_code(self): - """Returns the infile = ... line of code to make a TextIOWrapper.""" - return ('infile = open(sys.stdin.fileno(), "rt", newline=None) ;' - 'import _io ;assert isinstance(infile, _io.TextIOWrapper)') - - def test_readline(self): - """readline() must handle signals and not lose data.""" - self._test_reading( - data_to_write=b'hello, world!', - read_and_verify_code=self._READING_CODE_TEMPLATE.format( - read_method_name='readline', - expected='hello, world!\n')) - - def test_readlines(self): - """readlines() must handle signals and not lose data.""" - self._test_reading( - data_to_write=b'hello\r\nworld!', - read_and_verify_code=self._READING_CODE_TEMPLATE.format( - read_method_name='readlines', - expected=['hello\n', 'world!\n'])) - - def test_readall(self): - """read() must handle signals and not lose data.""" - self._test_reading( - data_to_write=b'hello\nworld!', - read_and_verify_code=self._READING_CODE_TEMPLATE.format( - read_method_name='read', - expected="hello\nworld!\n")) - - -def test_main(): - test_cases = [ - tc for tc in globals().values() - if isinstance(tc, type) and issubclass(tc, unittest.TestCase)] - run_unittest(*test_cases) - - -if __name__ == '__main__': - test_main() diff -Nru pypy-7.1.1+dfsg/lib-python/3/test/test__osx_support.py pypy-7.3.1+dfsg/lib-python/3/test/test__osx_support.py --- pypy-7.1.1+dfsg/lib-python/3/test/test__osx_support.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/lib-python/3/test/test__osx_support.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,279 +0,0 @@ -""" -Test suite for _osx_support: shared OS X support functions. -""" - -import os -import platform -import shutil -import stat -import sys -import unittest - -import test.support - -import _osx_support - -@unittest.skipUnless(sys.platform.startswith("darwin"), "requires OS X") -class Test_OSXSupport(unittest.TestCase): - - def setUp(self): - self.maxDiff = None - self.prog_name = 'bogus_program_xxxx' - self.temp_path_dir = os.path.abspath(os.getcwd()) - self.env = test.support.EnvironmentVarGuard() - self.addCleanup(self.env.__exit__) - for cv in ('CFLAGS', 'LDFLAGS', 'CPPFLAGS', - 'BASECFLAGS', 'BLDSHARED', 'LDSHARED', 'CC', - 'CXX', 'PY_CFLAGS', 'PY_LDFLAGS', 'PY_CPPFLAGS', - 'PY_CORE_CFLAGS'): - if cv in self.env: - self.env.unset(cv) - - def add_expected_saved_initial_values(self, config_vars, expected_vars): - # Ensure that the initial values for all modified config vars - # are also saved with modified keys. - expected_vars.update(('_OSX_SUPPORT_INITIAL_'+ k, - config_vars[k]) for k in config_vars - if config_vars[k] != expected_vars[k]) - - def test__find_executable(self): - if self.env['PATH']: - self.env['PATH'] = self.env['PATH'] + ':' - self.env['PATH'] = self.env['PATH'] + os.path.abspath(self.temp_path_dir) - test.support.unlink(self.prog_name) - self.assertIsNone(_osx_support._find_executable(self.prog_name)) - self.addCleanup(test.support.unlink, self.prog_name) - with open(self.prog_name, 'w') as f: - f.write("#!/bin/sh\n/bin/echo OK\n") - os.chmod(self.prog_name, stat.S_IRWXU) - self.assertEqual(self.prog_name, - _osx_support._find_executable(self.prog_name)) - - def test__read_output(self): - if self.env['PATH']: - self.env['PATH'] = self.env['PATH'] + ':' - self.env['PATH'] = self.env['PATH'] + os.path.abspath(self.temp_path_dir) - test.support.unlink(self.prog_name) - self.addCleanup(test.support.unlink, self.prog_name) - with open(self.prog_name, 'w') as f: - f.write("#!/bin/sh\n/bin/echo ExpectedOutput\n") - os.chmod(self.prog_name, stat.S_IRWXU) - self.assertEqual('ExpectedOutput', - _osx_support._read_output(self.prog_name)) - - def test__find_build_tool(self): - out = _osx_support._find_build_tool('cc') - self.assertTrue(os.path.isfile(out), - 'cc not found - check xcode-select') - - def test__get_system_version(self): - self.assertTrue(platform.mac_ver()[0].startswith( - _osx_support._get_system_version())) - - def test__remove_original_values(self): - config_vars = { - 'CC': 'gcc-test -pthreads', - } - expected_vars = { - 'CC': 'clang -pthreads', - } - cv = 'CC' - newvalue = 'clang -pthreads' - _osx_support._save_modified_value(config_vars, cv, newvalue) - self.assertNotEqual(expected_vars, config_vars) - _osx_support._remove_original_values(config_vars) - self.assertEqual(expected_vars, config_vars) - - def test__save_modified_value(self): - config_vars = { - 'CC': 'gcc-test -pthreads', - } - expected_vars = { - 'CC': 'clang -pthreads', - } - self.add_expected_saved_initial_values(config_vars, expected_vars) - cv = 'CC' - newvalue = 'clang -pthreads' - _osx_support._save_modified_value(config_vars, cv, newvalue) - self.assertEqual(expected_vars, config_vars) - - def test__save_modified_value_unchanged(self): - config_vars = { - 'CC': 'gcc-test -pthreads', - } - expected_vars = config_vars.copy() - cv = 'CC' - newvalue = 'gcc-test -pthreads' - _osx_support._save_modified_value(config_vars, cv, newvalue) - self.assertEqual(expected_vars, config_vars) - - def test__supports_universal_builds(self): - import platform - self.assertEqual(platform.mac_ver()[0].split('.') >= ['10', '4'], - _osx_support._supports_universal_builds()) - - def test__find_appropriate_compiler(self): - compilers = ( - ('gcc-test', 'i686-apple-darwin11-llvm-gcc-4.2'), - ('clang', 'clang version 3.1'), - ) - config_vars = { - 'CC': 'gcc-test -pthreads', - 'CXX': 'cc++-test', - 'CFLAGS': '-fno-strict-aliasing -g -O3 -arch ppc -arch i386 ', - 'LDFLAGS': '-arch ppc -arch i386 -g', - 'CPPFLAGS': '-I. -isysroot /Developer/SDKs/MacOSX10.4u.sdk', - 'BLDSHARED': 'gcc-test -bundle -arch ppc -arch i386 -g', - 'LDSHARED': 'gcc-test -bundle -arch ppc -arch i386 ' - '-isysroot /Developer/SDKs/MacOSX10.4u.sdk -g', - } - expected_vars = { - 'CC': 'clang -pthreads', - 'CXX': 'clang++', - 'CFLAGS': '-fno-strict-aliasing -g -O3 -arch ppc -arch i386 ', - 'LDFLAGS': '-arch ppc -arch i386 -g', - 'CPPFLAGS': '-I. -isysroot /Developer/SDKs/MacOSX10.4u.sdk', - 'BLDSHARED': 'clang -bundle -arch ppc -arch i386 -g', - 'LDSHARED': 'clang -bundle -arch ppc -arch i386 ' - '-isysroot /Developer/SDKs/MacOSX10.4u.sdk -g', - } - self.add_expected_saved_initial_values(config_vars, expected_vars) - - suffix = (':' + self.env['PATH']) if self.env['PATH'] else '' - self.env['PATH'] = os.path.abspath(self.temp_path_dir) + suffix - for c_name, c_output in compilers: - test.support.unlink(c_name) - self.addCleanup(test.support.unlink, c_name) - with open(c_name, 'w') as f: - f.write("#!/bin/sh\n/bin/echo " + c_output) - os.chmod(c_name, stat.S_IRWXU) - self.assertEqual(expected_vars, - _osx_support._find_appropriate_compiler( - config_vars)) - - def test__remove_universal_flags(self): - config_vars = { - 'CFLAGS': '-fno-strict-aliasing -g -O3 -arch ppc -arch i386 ', - 'LDFLAGS': '-arch ppc -arch i386 -g', - 'CPPFLAGS': '-I. -isysroot /Developer/SDKs/MacOSX10.4u.sdk', - 'BLDSHARED': 'gcc-4.0 -bundle -arch ppc -arch i386 -g', - 'LDSHARED': 'gcc-4.0 -bundle -arch ppc -arch i386 ' - '-isysroot /Developer/SDKs/MacOSX10.4u.sdk -g', - } - expected_vars = { - 'CFLAGS': '-fno-strict-aliasing -g -O3 ', - 'LDFLAGS': ' -g', - 'CPPFLAGS': '-I. ', - 'BLDSHARED': 'gcc-4.0 -bundle -g', - 'LDSHARED': 'gcc-4.0 -bundle -g', - } - self.add_expected_saved_initial_values(config_vars, expected_vars) - - self.assertEqual(expected_vars, - _osx_support._remove_universal_flags( - config_vars)) - - def test__remove_unsupported_archs(self): - config_vars = { - 'CC': 'clang', - 'CFLAGS': '-fno-strict-aliasing -g -O3 -arch ppc -arch i386 ', - 'LDFLAGS': '-arch ppc -arch i386 -g', - 'CPPFLAGS': '-I. -isysroot /Developer/SDKs/MacOSX10.4u.sdk', - 'BLDSHARED': 'gcc-4.0 -bundle -arch ppc -arch i386 -g', - 'LDSHARED': 'gcc-4.0 -bundle -arch ppc -arch i386 ' - '-isysroot /Developer/SDKs/MacOSX10.4u.sdk -g', - } - expected_vars = { - 'CC': 'clang', - 'CFLAGS': '-fno-strict-aliasing -g -O3 -arch i386 ', - 'LDFLAGS': ' -arch i386 -g', - 'CPPFLAGS': '-I. -isysroot /Developer/SDKs/MacOSX10.4u.sdk', - 'BLDSHARED': 'gcc-4.0 -bundle -arch i386 -g', - 'LDSHARED': 'gcc-4.0 -bundle -arch i386 ' - '-isysroot /Developer/SDKs/MacOSX10.4u.sdk -g', - } - self.add_expected_saved_initial_values(config_vars, expected_vars) - - suffix = (':' + self.env['PATH']) if self.env['PATH'] else '' - self.env['PATH'] = os.path.abspath(self.temp_path_dir) + suffix - c_name = 'clang' - test.support.unlink(c_name) - self.addCleanup(test.support.unlink, c_name) - # exit status 255 means no PPC support in this compiler chain - with open(c_name, 'w') as f: - f.write("#!/bin/sh\nexit 255") - os.chmod(c_name, stat.S_IRWXU) - self.assertEqual(expected_vars, - _osx_support._remove_unsupported_archs( - config_vars)) - - def test__override_all_archs(self): - self.env['ARCHFLAGS'] = '-arch x86_64' - config_vars = { - 'CC': 'clang', - 'CFLAGS': '-fno-strict-aliasing -g -O3 -arch ppc -arch i386 ', - 'LDFLAGS': '-arch ppc -arch i386 -g', - 'CPPFLAGS': '-I. -isysroot /Developer/SDKs/MacOSX10.4u.sdk', - 'BLDSHARED': 'gcc-4.0 -bundle -arch ppc -arch i386 -g', - 'LDSHARED': 'gcc-4.0 -bundle -arch ppc -arch i386 ' - '-isysroot /Developer/SDKs/MacOSX10.4u.sdk -g', - } - expected_vars = { - 'CC': 'clang', - 'CFLAGS': '-fno-strict-aliasing -g -O3 -arch x86_64', - 'LDFLAGS': ' -g -arch x86_64', - 'CPPFLAGS': '-I. -isysroot /Developer/SDKs/MacOSX10.4u.sdk', - 'BLDSHARED': 'gcc-4.0 -bundle -g -arch x86_64', - 'LDSHARED': 'gcc-4.0 -bundle -isysroot ' - '/Developer/SDKs/MacOSX10.4u.sdk -g -arch x86_64', - } - self.add_expected_saved_initial_values(config_vars, expected_vars) - - self.assertEqual(expected_vars, - _osx_support._override_all_archs( - config_vars)) - - def test__check_for_unavailable_sdk(self): - config_vars = { - 'CC': 'clang', - 'CFLAGS': '-fno-strict-aliasing -g -O3 -arch ppc -arch i386 ' - '-isysroot /Developer/SDKs/MacOSX10.1.sdk', - 'LDFLAGS': '-arch ppc -arch i386 -g', - 'CPPFLAGS': '-I. -isysroot /Developer/SDKs/MacOSX10.1.sdk', - 'BLDSHARED': 'gcc-4.0 -bundle -arch ppc -arch i386 -g', - 'LDSHARED': 'gcc-4.0 -bundle -arch ppc -arch i386 ' - '-isysroot /Developer/SDKs/MacOSX10.1.sdk -g', - } - expected_vars = { - 'CC': 'clang', - 'CFLAGS': '-fno-strict-aliasing -g -O3 -arch ppc -arch i386 ' - ' ', - 'LDFLAGS': '-arch ppc -arch i386 -g', - 'CPPFLAGS': '-I. ', - 'BLDSHARED': 'gcc-4.0 -bundle -arch ppc -arch i386 -g', - 'LDSHARED': 'gcc-4.0 -bundle -arch ppc -arch i386 ' - ' -g', - } - self.add_expected_saved_initial_values(config_vars, expected_vars) - - self.assertEqual(expected_vars, - _osx_support._check_for_unavailable_sdk( - config_vars)) - - def test_get_platform_osx(self): - # Note, get_platform_osx is currently tested more extensively - # indirectly by test_sysconfig and test_distutils - config_vars = { - 'CFLAGS': '-fno-strict-aliasing -g -O3 -arch ppc -arch i386 ' - '-isysroot /Developer/SDKs/MacOSX10.1.sdk', - 'MACOSX_DEPLOYMENT_TARGET': '10.6', - } - result = _osx_support.get_platform_osx(config_vars, ' ', ' ', ' ') - self.assertEqual(('macosx', '10.6', 'fat'), result) - -def test_main(): - if sys.platform == 'darwin': - test.support.run_unittest(Test_OSXSupport) - -if __name__ == "__main__": - test_main() diff -Nru pypy-7.1.1+dfsg/lib-python/3/test/test_tools.py pypy-7.3.1+dfsg/lib-python/3/test/test_tools.py --- pypy-7.1.1+dfsg/lib-python/3/test/test_tools.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/lib-python/3/test/test_tools.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,433 +0,0 @@ -"""Tests for scripts in the Tools directory. - -This file contains regression tests for some of the scripts found in the -Tools directory of a Python checkout or tarball, such as reindent.py. -""" - -import os -import sys -import imp -import unittest -import shutil -import subprocess -import sysconfig -import tempfile -import textwrap -from test import support -from test.script_helper import assert_python_ok, temp_dir - -if not sysconfig.is_python_build(): - # XXX some installers do contain the tools, should we detect that - # and run the tests in that case too? - raise unittest.SkipTest('test irrelevant for an installed Python') - -basepath = os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(__file__))), - 'Tools') -scriptsdir = os.path.join(basepath, 'scripts') - - -class ReindentTests(unittest.TestCase): - script = os.path.join(scriptsdir, 'reindent.py') - - def test_noargs(self): - assert_python_ok(self.script) - - def test_help(self): - rc, out, err = assert_python_ok(self.script, '-h') - self.assertEqual(out, b'') - self.assertGreater(err, b'') - - -class PindentTests(unittest.TestCase): - script = os.path.join(scriptsdir, 'pindent.py') - - def assertFileEqual(self, fn1, fn2): - with open(fn1) as f1, open(fn2) as f2: - self.assertEqual(f1.readlines(), f2.readlines()) - - def pindent(self, source, *args): - with subprocess.Popen( - (sys.executable, self.script) + args, - stdin=subprocess.PIPE, stdout=subprocess.PIPE, - universal_newlines=True) as proc: - out, err = proc.communicate(source) - self.assertIsNone(err) - return out - - def lstriplines(self, data): - return '\n'.join(line.lstrip() for line in data.splitlines()) + '\n' - - def test_selftest(self): - self.maxDiff = None - with temp_dir() as directory: - data_path = os.path.join(directory, '_test.py') - with open(self.script) as f: - closed = f.read() - with open(data_path, 'w') as f: - f.write(closed) - - rc, out, err = assert_python_ok(self.script, '-d', data_path) - self.assertEqual(out, b'') - self.assertEqual(err, b'') - backup = data_path + '~' - self.assertTrue(os.path.exists(backup)) - with open(backup) as f: - self.assertEqual(f.read(), closed) - with open(data_path) as f: - clean = f.read() - compile(clean, '_test.py', 'exec') - self.assertEqual(self.pindent(clean, '-c'), closed) - self.assertEqual(self.pindent(closed, '-d'), clean) - - rc, out, err = assert_python_ok(self.script, '-c', data_path) - self.assertEqual(out, b'') - self.assertEqual(err, b'') - with open(backup) as f: - self.assertEqual(f.read(), clean) - with open(data_path) as f: - self.assertEqual(f.read(), closed) - - broken = self.lstriplines(closed) - with open(data_path, 'w') as f: - f.write(broken) - rc, out, err = assert_python_ok(self.script, '-r', data_path) - self.assertEqual(out, b'') - self.assertEqual(err, b'') - with open(backup) as f: - self.assertEqual(f.read(), broken) - with open(data_path) as f: - indented = f.read() - compile(indented, '_test.py', 'exec') - self.assertEqual(self.pindent(broken, '-r'), indented) - - def pindent_test(self, clean, closed): - self.assertEqual(self.pindent(clean, '-c'), closed) - self.assertEqual(self.pindent(closed, '-d'), clean) - broken = self.lstriplines(closed) - self.assertEqual(self.pindent(broken, '-r', '-e', '-s', '4'), closed) - - def test_statements(self): - clean = textwrap.dedent("""\ - if a: - pass - - if a: - pass - else: - pass - - if a: - pass - elif: - pass - else: - pass - - while a: - break - - while a: - break - else: - pass - - for i in a: - break - - for i in a: - break - else: - pass - - try: - pass - finally: - pass - - try: - pass - except TypeError: - pass - except ValueError: - pass - else: - pass - - try: - pass - except TypeError: - pass - except ValueError: - pass - finally: - pass - - with a: - pass - - class A: - pass - - def f(): - pass - """) - - closed = textwrap.dedent("""\ - if a: - pass - # end if - - if a: - pass - else: - pass - # end if - - if a: - pass - elif: - pass - else: - pass - # end if - - while a: - break - # end while - - while a: - break - else: - pass - # end while - - for i in a: - break - # end for - - for i in a: - break - else: - pass - # end for - - try: - pass - finally: - pass - # end try - - try: - pass - except TypeError: - pass - except ValueError: - pass - else: - pass - # end try - - try: - pass - except TypeError: - pass - except ValueError: - pass - finally: - pass - # end try - - with a: - pass - # end with - - class A: - pass - # end class A - - def f(): - pass - # end def f - """) - self.pindent_test(clean, closed) - - def test_multilevel(self): - clean = textwrap.dedent("""\ - def foobar(a, b): - if a == b: - a = a+1 - elif a < b: - b = b-1 - if b > a: a = a-1 - else: - print 'oops!' - """) - closed = textwrap.dedent("""\ - def foobar(a, b): - if a == b: - a = a+1 - elif a < b: - b = b-1 - if b > a: a = a-1 - # end if - else: - print 'oops!' - # end if - # end def foobar - """) - self.pindent_test(clean, closed) - - def test_preserve_indents(self): - clean = textwrap.dedent("""\ - if a: - if b: - pass - """) - closed = textwrap.dedent("""\ - if a: - if b: - pass - # end if - # end if - """) - self.assertEqual(self.pindent(clean, '-c'), closed) - self.assertEqual(self.pindent(closed, '-d'), clean) - broken = self.lstriplines(closed) - self.assertEqual(self.pindent(broken, '-r', '-e', '-s', '9'), closed) - clean = textwrap.dedent("""\ - if a: - \tif b: - \t\tpass - """) - closed = textwrap.dedent("""\ - if a: - \tif b: - \t\tpass - \t# end if - # end if - """) - self.assertEqual(self.pindent(clean, '-c'), closed) - self.assertEqual(self.pindent(closed, '-d'), clean) - broken = self.lstriplines(closed) - self.assertEqual(self.pindent(broken, '-r'), closed) - - def test_escaped_newline(self): - clean = textwrap.dedent("""\ - class\\ - \\ - A: - def\ - \\ - f: - pass - """) - closed = textwrap.dedent("""\ - class\\ - \\ - A: - def\ - \\ - f: - pass - # end def f - # end class A - """) - self.assertEqual(self.pindent(clean, '-c'), closed) - self.assertEqual(self.pindent(closed, '-d'), clean) - - def test_empty_line(self): - clean = textwrap.dedent("""\ - if a: - - pass - """) - closed = textwrap.dedent("""\ - if a: - - pass - # end if - """) - self.pindent_test(clean, closed) - - def test_oneline(self): - clean = textwrap.dedent("""\ - if a: pass - """) - closed = textwrap.dedent("""\ - if a: pass - # end if - """) - self.pindent_test(clean, closed) - - -class TestSundryScripts(unittest.TestCase): - # At least make sure the rest don't have syntax errors. When tests are - # added for a script it should be added to the whitelist below. - - # scripts that have independent tests. - whitelist = ['reindent.py'] - # scripts that can't be imported without running - blacklist = ['make_ctype.py'] - # scripts that use windows-only modules - windows_only = ['win_add2path.py'] - # blacklisted for other reasons - other = ['analyze_dxp.py'] - - skiplist = blacklist + whitelist + windows_only + other - - def setUp(self): - cm = support.DirsOnSysPath(scriptsdir) - cm.__enter__() - self.addCleanup(cm.__exit__) - - def test_sundry(self): - for fn in os.listdir(scriptsdir): - if fn.endswith('.py') and fn not in self.skiplist: - __import__(fn[:-3]) - - @unittest.skipIf(sys.platform != "win32", "Windows-only test") - def test_sundry_windows(self): - for fn in self.windows_only: - __import__(fn[:-3]) - - @unittest.skipIf(not support.threading, "test requires _thread module") - def test_analyze_dxp_import(self): - if hasattr(sys, 'getdxp'): - import analyze_dxp - else: - with self.assertRaises(RuntimeError): - import analyze_dxp - - -class PdepsTests(unittest.TestCase): - - @classmethod - def setUpClass(self): - path = os.path.join(scriptsdir, 'pdeps.py') - self.pdeps = imp.load_source('pdeps', path) - - @classmethod - def tearDownClass(self): - if 'pdeps' in sys.modules: - del sys.modules['pdeps'] - - def test_process_errors(self): - # Issue #14492: m_import.match(line) can be None. - with tempfile.TemporaryDirectory() as tmpdir: - fn = os.path.join(tmpdir, 'foo') - with open(fn, 'w') as stream: - stream.write("#!/this/will/fail") - self.pdeps.process(fn, {}) - - def test_inverse_attribute_error(self): - # Issue #14492: this used to fail with an AttributeError. - self.pdeps.inverse({'a': []}) - - -def test_main(): - support.run_unittest(*[obj for obj in globals().values() - if isinstance(obj, type)]) - - -if __name__ == '__main__': - unittest.main() diff -Nru pypy-7.1.1+dfsg/lib-python/3/tkinter/test/test_tkinter/test_misc.py pypy-7.3.1+dfsg/lib-python/3/tkinter/test/test_tkinter/test_misc.py --- pypy-7.1.1+dfsg/lib-python/3/tkinter/test/test_tkinter/test_misc.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/lib-python/3/tkinter/test/test_tkinter/test_misc.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,45 +0,0 @@ -import unittest -import tkinter -from tkinter import ttk -from test import support - -support.requires('gui') - -class MiscTest(unittest.TestCase): - - def setUp(self): - self.root = ttk.setup_master() - - def test_tk_setPalette(self): - root = self.root - root.tk_setPalette('black') - self.assertEqual(root['background'], 'black') - root.tk_setPalette('white') - self.assertEqual(root['background'], 'white') - self.assertRaisesRegex(tkinter.TclError, - '^unknown color name "spam"$', - root.tk_setPalette, 'spam') - - root.tk_setPalette(background='black') - self.assertEqual(root['background'], 'black') - root.tk_setPalette(background='blue', highlightColor='yellow') - self.assertEqual(root['background'], 'blue') - self.assertEqual(root['highlightcolor'], 'yellow') - root.tk_setPalette(background='yellow', highlightColor='blue') - self.assertEqual(root['background'], 'yellow') - self.assertEqual(root['highlightcolor'], 'blue') - self.assertRaisesRegex(tkinter.TclError, - '^unknown color name "spam"$', - root.tk_setPalette, background='spam') - self.assertRaisesRegex(tkinter.TclError, - '^must specify a background color$', - root.tk_setPalette, spam='white') - self.assertRaisesRegex(tkinter.TclError, - '^must specify a background color$', - root.tk_setPalette, highlightColor='blue') - - -tests_gui = (MiscTest, ) - -if __name__ == "__main__": - support.run_unittest(*tests_gui) diff -Nru pypy-7.1.1+dfsg/lib-python/conftest.py pypy-7.3.1+dfsg/lib-python/conftest.py --- pypy-7.1.1+dfsg/lib-python/conftest.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/lib-python/conftest.py 2020-04-10 19:28:40.000000000 +0000 @@ -176,7 +176,7 @@ RegrTest('test_copy_reg.py', core=True), RegrTest('test_cpickle.py', core=True), RegrTest('test_cprofile.py'), - RegrTest('test_crypt.py', usemodules='crypt'), + RegrTest('test_crypt.py'), RegrTest('test_csv.py', usemodules='_csv'), RegrTest('test_ctypes.py', usemodules="_rawffi thread cpyext"), RegrTest('test_curses.py'), @@ -401,7 +401,7 @@ RegrTest('test_source_encoding.py'), RegrTest('test_spwd.py'), RegrTest('test_sqlite.py', usemodules="thread _rawffi zlib"), - RegrTest('test_ssl.py', usemodules='_ssl _socket select'), + RegrTest('test_ssl.py', usemodules='_socket select'), RegrTest('test_startfile.py'), RegrTest('test_stat.py'), RegrTest('test_str.py', core=True), diff -Nru pypy-7.1.1+dfsg/LICENSE pypy-7.3.1+dfsg/LICENSE --- pypy-7.1.1+dfsg/LICENSE 2019-08-08 19:42:53.000000000 +0000 +++ pypy-7.3.1+dfsg/LICENSE 2020-04-10 19:28:39.000000000 +0000 @@ -3,10 +3,11 @@ License ======= -Except when otherwise stated (look for LICENSE files in directories or -information at the beginning of each file) all software and documentation in -the 'rpython', 'pypy', 'ctype_configure', 'dotviewer', 'demo', 'lib_pypy', -'py', and '_pytest' directories is licensed as follows: +Except when otherwise stated (look for LICENSE files in directories +or information at the beginning of each file) all software and +documentation in the 'rpython', 'pypy', 'ctype_configure', 'dotviewer', +'demo', 'extra_tests', 'include', 'lib_pypy', 'py', and '_pytest' +directories is licensed as follows: The MIT License @@ -30,7 +31,7 @@ DEALINGS IN THE SOFTWARE. -PyPy Copyright holders 2003-2019 +PyPy Copyright holders 2003-2020 -------------------------------- Except when otherwise stated (look for LICENSE files or information at @@ -40,17 +41,17 @@ Armin Rigo Maciej Fijalkowski Carl Friedrich Bolz-Tereick + Matti Picus Antonio Cuni Amaury Forgeot d'Arc - Matti Picus - Samuele Pedroni Ronan Lamy + Samuele Pedroni Alex Gaynor Philip Jenvey Richard Plangger Brian Kearns - Michael Hudson-Doyle Manuel Jacob + Michael Hudson-Doyle David Schneider Holger Krekel Christian Tismer @@ -93,15 +94,17 @@ Jacob Hallen Jason Creighton Mark Young + Andrew Lawrence Alex Martelli Spenser Bauman Michal Bendowski Jan de Mooij + Stefan Beyer + Stefano Rivera Tyler Wade Vincent Legoll Michael Foord Stephan Diehl - Stefano Rivera Jean-Paul Calderone Stefan Schwarzer Tomek Meka @@ -110,7 +113,6 @@ Devin Jeanpierre Bob Ippolito Bruno Gola - Andrew Lawrence David Malcolm Squeaky Edd Barrett @@ -124,7 +126,7 @@ Wenzhu Man Konstantin Lopuhin John Witulski - Stefan Beyer + Yannick Jadoul Jeremy Thurgood Greg Price Ivan Sichmann Freitas @@ -134,8 +136,10 @@ Tobias Pape Andreas Stührk Jean-Philippe St. Pierre + Stian Andreassen Guido van Rossum Pavel Vinogradov + Julian Berman William Leslie Paweł Piotr Przeradowski marky1991 @@ -146,14 +150,13 @@ Taavi Burns Adrian Kuhn tav - Stian Andreassen - Georg Brandl Joannah Nanjekye + Georg Brandl + quejebo Bert Freudenberg Wanja Saatkamp Mike Blume Gerald Klix - Julian Berman Oscar Nierstrasz Rami Chowdhury Stefan H. Muller @@ -192,6 +195,7 @@ Lucian Branescu Mihaila Mariano Anaya anatoly techtonik + Lin Cheng Karl Bartel Gabriel Lavoie Jared Grubb @@ -222,6 +226,7 @@ Anders Qvist Corbin Simpson Chirag Jadwani + Mike Pavone Pauli Virtanen Jonathan David Riehl Beatrice During @@ -245,6 +250,7 @@ Valentina Mukhamedzhanova Stefano Parmesan touilleMan + Anthony Sottile Marc Abramowitz Arjun Naik Aaron Gallagher @@ -254,7 +260,6 @@ Omer Katz Jacek Generowicz Tomasz Dziopa - Lin Cheng Sylvain Thenault Jakub Stasiak Andrew Dalke @@ -270,9 +275,12 @@ Yasir Suhail Sergey Kishchenko Martin Blais + Catalin Fierut Lutz Paelike Ian Foote Philipp Rustemeuer + Bernd Schoeller + olliemath Logan Chien Catalin Gabriel Manciu Jacob Oscarson @@ -285,7 +293,6 @@ Lene Wagner Tomo Cocoa Miro Hrončok - Anthony Sottile David Lievens Neil Blakey-Milner Henrik Vendelbo @@ -294,24 +301,31 @@ Christoph Gerum Miguel de Val Borro Artur Lisiecki + joserubiovidales@gmail.com afteryu Toni Mattis + Vincent Michel Laurens Van Houtven Bobby Impollonia Roberto De Ioris + Sreepathi Pai Jeong YunWon + dakarpov@gmail.com Christopher Armstrong Aaron Tubbs Vasantha Ganesh K Jason Michalski Radu Ciorba + Ryan Hileman Markus Holtermann + Georges Racinet Andrew Thompson Yusei Tahara Ruochen Huang Fabio Niephaus Akira Li Gustavo Niemeyer + joachim-ballmann@bitbucket.org Nate Bragg Lucas Stadler roberto@goyle @@ -327,12 +341,17 @@ Kim Jin Su Amber Brown Andrew Stepanov + ashwinahuja Rafał Gałczyński Ben Darnell Juan Francisco Cantero Hurtado Godefroid Chappelle + Paul Ganssle + Michal Kuffa Stephan Busemann + Bystroushaak Dan Colish + Ram Rachum timo Volodymyr Vladymyrov Daniel Neuhäuser @@ -342,21 +361,28 @@ Chris Lambacher John Aldis coolbutuseless@gmail.com + Yasen Kiprov Mike Bayer Rodrigo Araújo Daniil Yarancev Min RK OlivierBlanvillain + bernd.schoeller@inf.ethz.ch Jonas Pfannschmidt + Alex Kashirin Zearin + Joannah Nanjekye nanjekyejoannah@gmail.com + Ihar Shabes Johan Forsberg Andrey Churin Dan Crosta reubano@gmail.com Stanisław Halik + DeVerne Jones Julien Phalip Roman Podoliaka Steve Papanik + Henri Tuhola Eli Stevens Boglarka Vezer gabrielg@ec2-54-146-239-158.compute-1.amazonaws.com @@ -369,24 +395,29 @@ Jim Hunziker shoma hosaka Buck Golemon + whitequark Iraklis D. JohnDoe yrttyr Michael Chermside Anna Ravencroft remarkablerocket + Ivan Petre Vijiac Berker Peksag Christian Muirhead soareschen Matthew Miller + Jesdi Konrad Delong Dinu Gherman + Sam Edwards pizi Tomáš Pružina James Robert Armin Ronacher Diana Popa + Mike Kaplinskiy Mads Kiilerich Brett Cannon Caleb Hattingh @@ -398,17 +429,21 @@ Markus Unterwaditzer Kristoffer Kleine Graham Markall + paugier Dan Loewenherz werat Filip Salomonsson Niclas Olofsson + Zsolt Cserna Chris Pressey Tobias Diaz Paul Graydon + mkuffa Nikolaos-Digenis Karagiannis Kurt Griffiths Ben Mather Donald Stufft + kotus9 Dan Sanders Jason Madden Yaroslav Fedevych diff -Nru pypy-7.1.1+dfsg/Makefile pypy-7.3.1+dfsg/Makefile --- pypy-7.1.1+dfsg/Makefile 2019-08-08 19:42:53.000000000 +0000 +++ pypy-7.3.1+dfsg/Makefile 2020-04-10 19:28:39.000000000 +0000 @@ -2,7 +2,6 @@ all: pypy-c cffi_imports PYPY_EXECUTABLE := $(shell which pypy) -URAM := $(shell python -c "import sys; print 4.5 if sys.maxint>1<<32 else 2.5") ifeq ($(PYPY_EXECUTABLE),) RUNINTERP = python @@ -10,6 +9,8 @@ RUNINTERP = $(PYPY_EXECUTABLE) endif +URAM := $(shell $(RUNINTERP) -c "import sys; print 4.5 if sys.maxint>1<<32 else 2.5") + .PHONY: pypy-c cffi_imports pypy-c: diff -Nru pypy-7.1.1+dfsg/pypy/config/pypyoption.py pypy-7.3.1+dfsg/pypy/config/pypyoption.py --- pypy-7.1.1+dfsg/pypy/config/pypyoption.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/config/pypyoption.py 2020-04-10 19:28:40.000000000 +0000 @@ -31,12 +31,13 @@ working_modules = default_modules.copy() working_modules.update([ "_socket", "unicodedata", "mmap", "fcntl", "_locale", "pwd", - "select", "zipimport", "_lsprof", "crypt", "signal", "_rawffi", "termios", - "zlib", "bz2", "struct", "_hashlib", "_md5", "_sha", "_minimal_curses", - "cStringIO", "thread", "itertools", "pyexpat", "_ssl", "cpyext", "array", + "select", "zipimport", "_lsprof", "signal", "_rawffi", "termios", + "zlib", "bz2", "struct", "_md5", "_sha", "_minimal_curses", + "cStringIO", "thread", "itertools", "pyexpat", "cpyext", "array", "binascii", "_multiprocessing", '_warnings', "_collections", "_multibytecodec", "micronumpy", "_continuation", "_cffi_backend", - "_csv", "_cppyy", "_pypyjson", "_jitlog" + "_csv", "_cppyy", "_pypyjson", "_jitlog", + # "_hashlib", "crypt" ]) import rpython.rlib.rvmprof.cintf @@ -64,12 +65,11 @@ working_modules.add("_winreg") # unix only modules for name in ["crypt", "fcntl", "pwd", "termios", "_minimal_curses"]: - working_modules.remove(name) + if name in working_modules: + working_modules.remove(name) if name in translation_modules: translation_modules.remove(name) - if "_cppyy" in working_modules: - working_modules.remove("_cppyy") # not tested on win32 if "faulthandler" in working_modules: working_modules.remove("faulthandler") # missing details if "_vmprof" in working_modules: @@ -109,43 +109,6 @@ module_suggests["cpyext"].append(("translation.shared", True)) -# NOTE: this dictionary is not used any more -module_import_dependencies = { - # no _rawffi if importing rpython.rlib.clibffi raises ImportError - # or CompilationError or py.test.skip.Exception - "_rawffi" : ["rpython.rlib.clibffi"], - - "zlib" : ["rpython.rlib.rzlib"], - "bz2" : ["pypy.module.bz2.interp_bz2"], - "pyexpat" : ["pypy.module.pyexpat.interp_pyexpat"], - "_ssl" : ["pypy.module._ssl.interp_ssl"], - "_hashlib" : ["pypy.module._ssl.interp_ssl"], - "_minimal_curses": ["pypy.module._minimal_curses.fficurses"], - "_continuation": ["rpython.rlib.rstacklet"], - "_vmprof" : ["pypy.module._vmprof.interp_vmprof"], - "faulthandler" : ["pypy.module._vmprof.interp_vmprof"], - } - -def get_module_validator(modname): - # NOTE: this function is not used any more - if modname in module_import_dependencies: - modlist = module_import_dependencies[modname] - def validator(config): - from rpython.rtyper.tool.rffi_platform import CompilationError - try: - for name in modlist: - __import__(name) - except (ImportError, CompilationError, py.test.skip.Exception) as e: - errcls = e.__class__.__name__ - raise Exception( - "The module %r is disabled\n" % (modname,) + - "because importing %s raised %s\n" % (name, errcls) + - str(e)) - return validator - else: - return None - - pypy_optiondescription = OptionDescription("objspace", "Object Space Options", [ OptionDescription("usemodules", "Which Modules should be used", [ BoolOption(modname, "use module %s" % (modname, ), @@ -154,7 +117,7 @@ requires=module_dependencies.get(modname, []), suggests=module_suggests.get(modname, []), negation=modname not in essential_modules, - ) #validator=get_module_validator(modname)) + ) for modname in all_modules]), BoolOption("allworkingmodules", "use as many working modules as possible", @@ -248,6 +211,10 @@ BoolOption("newshortcut", "cache and shortcut calling __new__ from builtin types", default=False), + BoolOption("reinterpretasserts", + "Perform reinterpretation when an assert fails " + "(only relevant for tests)", + default=False), ]), ]) diff -Nru pypy-7.1.1+dfsg/pypy/config/test/test_pypyoption.py pypy-7.3.1+dfsg/pypy/config/test/test_pypyoption.py --- pypy-7.1.1+dfsg/pypy/config/test/test_pypyoption.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/config/test/test_pypyoption.py 2020-04-10 19:28:40.000000000 +0000 @@ -8,14 +8,13 @@ def test_required(): conf = get_pypy_config() assert not conf.translating - assert conf.objspace.usemodules.gc def test_conflicting_gcrootfinder(): conf = get_pypy_config() conf.translation.gc = "boehm" - py.test.raises(ConfigError, "conf.translation.gcrootfinder = 'asmgcc'") - + with py.test.raises(ConfigError): + conf.translation.gcrootfinder = 'shadowstack' def test_frameworkgc(): for name in ["minimark", "semispace"]: diff -Nru pypy-7.1.1+dfsg/pypy/conftest.py pypy-7.3.1+dfsg/pypy/conftest.py --- pypy-7.1.1+dfsg/pypy/conftest.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/conftest.py 2020-04-10 19:28:40.000000000 +0000 @@ -1,6 +1,8 @@ import py, pytest, sys, textwrap from inspect import isclass +APPLEVEL_FN = 'apptest_*.py' + # pytest settings rsyncdirs = ['.', '../lib-python', '../lib_pypy', '../demo'] rsyncignore = ['_cache'] @@ -36,33 +38,47 @@ def pytest_report_header(): return "pytest-%s from %s" % (pytest.__version__, pytest.__file__) -def pytest_addhooks(pluginmanager): - from rpython.conftest import LeakFinder - pluginmanager.register(LeakFinder()) +@pytest.hookimpl(tryfirst=True) +def pytest_cmdline_preparse(config, args): + if not (set(args) & {'-D', '--direct-apptest'}): + args.append('--assert=reinterp') def pytest_configure(config): global option option = config.option + mode_A = config.getoption('runappdirect') + mode_D = config.getoption('direct_apptest') + if mode_D or not mode_A: + config.addinivalue_line('python_files', APPLEVEL_FN) + if not mode_A and not mode_D: # 'own' tests + from rpython.conftest import LeakFinder + config.pluginmanager.register(LeakFinder()) def pytest_addoption(parser): - from rpython.conftest import pytest_addoption - pytest_addoption(parser) - group = parser.getgroup("pypy options") group.addoption('-A', '--runappdirect', action="store_true", default=False, dest="runappdirect", - help="run applevel tests directly on python interpreter (not through PyPy)") + help="run legacy applevel tests directly on python interpreter (not through PyPy)") + group.addoption('-D', '--direct-apptest', action="store_true", + default=False, dest="direct_apptest", + help="run applevel_XXX.py tests directly on host interpreter") group.addoption('--direct', action="store_true", default=False, dest="rundirect", help="run pexpect tests directly") group.addoption('--raise-operr', action="store_true", default=False, dest="raise_operr", help="Show the interp-level OperationError in app-level tests") + group.addoption('--applevel-rewrite', action="store_true", + default=False, dest="applevel_rewrite", + help="Use assert rewriting in app-level test files (slow)") + +@pytest.fixture(scope='class') +def spaceconfig(request): + return getattr(request.cls, 'spaceconfig', {}) @pytest.fixture(scope='function') -def space(request): +def space(spaceconfig): from pypy.tool.pytest.objspace import gettestobjspace - spaceconfig = getattr(request.cls, 'spaceconfig', {}) return gettestobjspace(**spaceconfig) @@ -88,14 +104,21 @@ ensure_pytest_builtin_helpers() def pytest_pycollect_makemodule(path, parent): - return PyPyModule(path, parent) + if path.fnmatch(APPLEVEL_FN): + if parent.config.getoption('direct_apptest'): + return + from pypy.tool.pytest.apptest2 import AppTestModule + rewrite = parent.config.getoption('applevel_rewrite') + return AppTestModule(path, parent, rewrite_asserts=rewrite) + else: + return PyPyModule(path, parent) def is_applevel(item): - from pypy.tool.pytest.apptest import AppTestFunction - return isinstance(item, AppTestFunction) + from pypy.tool.pytest.apptest import AppTestMethod + return isinstance(item, AppTestMethod) def pytest_collection_modifyitems(config, items): - if config.option.runappdirect: + if config.getoption('runappdirect') or config.getoption('direct_apptest'): return for item in items: if isinstance(item, py.test.Function): @@ -104,17 +127,17 @@ else: item.add_marker('interplevel') -class PyPyModule(py.test.collect.Module): + +class PyPyModule(pytest.Module): """ we take care of collecting classes both at app level and at interp-level (because we need to stick a space at the class) ourselves. """ def accept_regular_test(self): if self.config.option.runappdirect: - # only collect regular tests if we are in an 'app_test' directory, - # or in test_lib_pypy + # only collect regular tests if we are in test_lib_pypy for name in self.listnames(): - if "app_test" in name or "test_lib_pypy" in name: + if "test_lib_pypy" in name: return True return False return True @@ -122,8 +145,6 @@ def funcnamefilter(self, name): if name.startswith('test_'): return self.accept_regular_test() - if name.startswith('app_test_'): - return True return False def classnamefilter(self, name): @@ -138,13 +159,6 @@ if name.startswith('AppTest'): from pypy.tool.pytest.apptest import AppClassCollector return AppClassCollector(name, parent=self) - - elif hasattr(obj, 'func_code') and self.funcnamefilter(name): - if name.startswith('app_test_'): - assert not obj.func_code.co_flags & 32, \ - "generator app level functions? you must be joking" - from pypy.tool.pytest.apptest import AppTestFunction - return AppTestFunction(name, parent=self) return super(PyPyModule, self).makeitem(name, obj) def skip_on_missing_buildoption(**ropts): @@ -163,29 +177,25 @@ py.test.skip("need translated pypy with: %s, got %s" %(ropts,options)) -class LazyObjSpaceGetter(object): - def __get__(self, obj, cls=None): - from pypy.tool.pytest.objspace import gettestobjspace - space = gettestobjspace() - if cls: - cls.space = space - return space - - @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): + config = item.config + if (item.get_marker(name='pypy_only') and + not '__pypy__' in sys.builtin_module_names): + pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: + from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. - spaceconfig = getattr(appclass.obj, 'spaceconfig', None) - if spaceconfig is not None: - from pypy.tool.pytest.objspace import gettestobjspace - appclass.obj.space = gettestobjspace(**spaceconfig) - else: - appclass.obj.space = LazyObjSpaceGetter() - appclass.obj.runappdirect = option.runappdirect - - -def pytest_ignore_collect(path): + spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) + if not (config.getoption('runappdirect') or config.getoption('direct_apptest')): + spaceconfig.setdefault('objspace.std.reinterpretasserts', True) + appclass.obj.space = gettestobjspace(**spaceconfig) + appclass.obj.runappdirect = config.option.runappdirect + +def pytest_ignore_collect(path, config): + if (config.getoption('direct_apptest') and not path.isdir() + and not path.fnmatch(APPLEVEL_FN)): + return True return path.check(link=1) diff -Nru pypy-7.1.1+dfsg/pypy/doc/architecture.rst pypy-7.3.1+dfsg/pypy/doc/architecture.rst --- pypy-7.1.1+dfsg/pypy/doc/architecture.rst 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/doc/architecture.rst 2020-04-10 19:28:40.000000000 +0000 @@ -88,7 +88,9 @@ The RPython standard library is to be found in the ``rlib`` subdirectory. -Consult `Getting Started with RPython`_ for further reading +Consult `Getting Started with RPython`_ for further reading or `RPython By +Example`_ for another take on what can be done using RPython without writing an +interpreter over it. Translation ~~~~~~~~~~~ @@ -132,4 +134,6 @@ GC written as more RPython code. The best one we have so far is in ``rpython/memory/gc/incminimark.py``. -.. _`Getting started with RPython`: http://rpython.readthedocs.org/en/latest/getting-started.html +.. _`Getting Started with RPython`: http://rpython.readthedocs.org/en/latest/getting-started.html +.. _RPython By Example: http://mesapy.org/rpython-by-example/ + diff -Nru pypy-7.1.1+dfsg/pypy/doc/build.rst pypy-7.3.1+dfsg/pypy/doc/build.rst --- pypy-7.1.1+dfsg/pypy/doc/build.rst 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/doc/build.rst 2020-04-10 19:28:40.000000000 +0000 @@ -37,7 +37,7 @@ You must issue the following command on your command line, DOS box, or terminal:: - hg clone http://bitbucket.org/pypy/pypy pypy + hg clone http://foss.heptapod.net/pypy/pypy pypy This will clone the repository and place it into a directory named ``pypy``, and will get you the PyPy source in ``pypy/pypy`` and @@ -60,17 +60,14 @@ Install build-time dependencies ------------------------------- (**Note**: for some hints on how to translate the Python interpreter under -Windows, see the `windows document`_ . For hints on how to cross-compile in -a chroot using scratchbox2, see the `arm document`_ in the -`RPython documentation`_) +Windows, see the `windows document`_ . .. _`windows document`: windows.html -.. _`arm document`: http://rpython.readthedocs.org/en/latest/arm.html .. _`RPython documentation`: http://rpython.readthedocs.org The host Python needs to have CFFI installed. If translating on PyPy, CFFI is already installed. If translating on CPython, you need to install it, e.g. -using ``pip install cffi``. +using ``python -mpip install cffi``. To build PyPy on Unix using the C translation backend, you need at least a C compiler and ``make`` installed. Further, some optional modules have additional @@ -88,9 +85,6 @@ pyexpat libexpat1 -_ssl - libssl - _vmprof libunwind (optional, loaded dynamically at runtime) @@ -104,6 +98,9 @@ sqlite3 libsqlite3 +_ssl, _hashlib + libssl + curses libncurses-dev (for PyPy2) libncursesw-dev (for PyPy3) @@ -115,11 +112,12 @@ tk-dev lzma (PyPy3 only) - liblzma + liblzma or libxz, version 5 and up -To run untranslated tests, you need the Boehm garbage collector libgc. +To run untranslated tests, you need the Boehm garbage collector libgc, version +7.4 and up -On recent Debian and Ubuntu (16.04 onwards), this is the command to install +On Debian and Ubuntu (16.04 onwards), this is the command to install all build-time dependencies:: apt-get install gcc make libffi-dev pkg-config zlib1g-dev libbz2-dev \ @@ -127,18 +125,11 @@ tk-dev libgc-dev python-cffi \ liblzma-dev libncursesw5-dev # these two only needed on PyPy3 -On older Debian and Ubuntu (12.04-14.04):: - - apt-get install gcc make libffi-dev pkg-config libz-dev libbz2-dev \ - libsqlite3-dev libncurses-dev libexpat1-dev libssl-dev libgdbm-dev \ - tk-dev libgc-dev python-cffi \ - liblzma-dev libncursesw-dev # these two only needed on PyPy3 - On Fedora:: dnf install gcc make libffi-devel pkgconfig zlib-devel bzip2-devel \ sqlite-devel ncurses-devel expat-devel openssl-devel tk-devel \ - gdbm-devel python-cffi\ + gdbm-devel python-cffi gc-devel\ xz-devel # For lzma on PyPy3. On SLES11:: @@ -235,7 +226,7 @@ command:: cd pypy/goal - PYTHONPATH=../.. ./pypy-c ../tool/build_cffi_imports.py + PYTHONPATH=../.. ./pypy-c ../../lib_pypy/tools/build_cffi_imports.py .. _`out-of-line API mode`: http://cffi.readthedocs.org/en/latest/overview.html#real-example-api-level-out-of-line diff -Nru pypy-7.1.1+dfsg/pypy/doc/coding-guide.rst pypy-7.3.1+dfsg/pypy/doc/coding-guide.rst --- pypy-7.1.1+dfsg/pypy/doc/coding-guide.rst 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/doc/coding-guide.rst 2020-04-10 19:28:40.000000000 +0000 @@ -456,13 +456,10 @@ Testing modules in ``lib_pypy/`` ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -You can go to the :source:`pypy/module/test_lib_pypy/` directory and invoke the testing tool -("py.test" or "python ../../pypy/test_all.py") to run tests against the -lib_pypy hierarchy. Note, that tests in :source:`pypy/module/test_lib_pypy/` are allowed -and encouraged to let their tests run at interpreter level although -:source:`lib_pypy/` modules eventually live at PyPy's application level. -This allows us to quickly test our python-coded reimplementations -against CPython. +You can go to the :source:`pypy/module/test_lib_pypy/` directory and invoke the +testing tool ("py.test" or "python ../../pypy/test_all.py") to run tests +against the lib_pypy hierarchy. This allows us to quickly test our +python-coded reimplementations against CPython. Testing modules in ``pypy/module`` @@ -547,7 +544,8 @@ Using the development bug/feature tracker ----------------------------------------- -We use bitbucket for :source:`issues` tracking and :source:`pull-requests`. +We use https://foss.heptapod.net/pypy/pypy for :source:`issues` tracking and +:source:`pull-requests`. .. _testing: @@ -585,25 +583,45 @@ module global level and use plain 'assert' statements thanks to the usage of the `py.test`_ tool. - -Application Level tests +Application level tests ~~~~~~~~~~~~~~~~~~~~~~~ For testing the conformance and well-behavedness of PyPy it is often sufficient to write "normal" application-level Python code that doesn't need to be aware of any particular -coding style or restrictions. If we have a choice we often -use application level tests which usually look like this:: +coding style or restrictions. If we have a choice we often +use application level tests which are in files whose name starts with the +`apptest_` prefix and look like this:: - def app_test_something(): + # spaceconfig = {"usemodules":["array"]} + def test_this(): # application level test code +These application level test functions will run on top +of PyPy, i.e. they have no access to interpreter details. + +By default, they run on top of an untranslated PyPy which runs on top of the +host interpreter. When passing the `-D` option, they run directly on top of the +host interpreter, which is usually a translated pypy executable in this case:: + + pypy3 -m pytest -D pypy/ + +Note that in interpreted mode, only a small subset of pytest's functionality is +available. To configure the object space, the host interpreter will parse the +optional spaceconfig declaration. This declaration must be in the form of a +valid json dict. + +Mixed-level tests (deprecated) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Mixed-level tests are similar to application-level tests, the difference being +that they're just snippets of app-level code embedded in an interp-level test +file, like this:: + class AppTestSomething(object): def test_this(self): # application level test code -These application level test functions will run on top -of PyPy, i.e. they have no access to interpreter details. You cannot use imported modules from global level because they are imported at interpreter-level while you test code runs at application level. If you need to use modules @@ -717,7 +735,7 @@ at the existing documentation and see how things work. Note that the web site of http://pypy.org/ is maintained separately. -For now it is in the repository https://bitbucket.org/pypy/pypy.org +It is in the repository https://foss.heptapod.net/pypy/pypy.org .. _ReST quickstart: http://docutils.sourceforge.net/docs/user/rst/quickref.html diff -Nru pypy-7.1.1+dfsg/pypy/doc/commandline_ref.rst pypy-7.3.1+dfsg/pypy/doc/commandline_ref.rst --- pypy-7.1.1+dfsg/pypy/doc/commandline_ref.rst 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/doc/commandline_ref.rst 2020-04-10 19:28:40.000000000 +0000 @@ -9,3 +9,4 @@ man/pypy.1.rst man/pypy3.1.rst + jit_help.rst diff -Nru pypy-7.1.1+dfsg/pypy/doc/config/translation.backendopt.txt pypy-7.3.1+dfsg/pypy/doc/config/translation.backendopt.txt --- pypy-7.1.1+dfsg/pypy/doc/config/translation.backendopt.txt 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/doc/config/translation.backendopt.txt 2020-04-10 19:28:40.000000000 +0000 @@ -1,5 +1,5 @@ This group contains options about various backend optimization passes. Most of them are described in the `EU report about optimization`_ -.. _`EU report about optimization`: https://bitbucket.org/pypy/extradoc/raw/tip/eu-report/D07.1_Massive_Parallelism_and_Translation_Aspects-2007-02-28.pdf +.. _`EU report about optimization`: https://foss.heptapod.net/pypy/extradoc/raw/tip/eu-report/D07.1_Massive_Parallelism_and_Translation_Aspects-2007-02-28.pdf diff -Nru pypy-7.1.1+dfsg/pypy/doc/config/translation.gcrootfinder.txt pypy-7.3.1+dfsg/pypy/doc/config/translation.gcrootfinder.txt --- pypy-7.1.1+dfsg/pypy/doc/config/translation.gcrootfinder.txt 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/doc/config/translation.gcrootfinder.txt 2020-04-10 19:28:40.000000000 +0000 @@ -1,16 +1,7 @@ Choose the method used to find the roots in the GC. This only -applies to our framework GCs. You have a choice of two -alternatives: +applies to our framework GCs. - ``--gcrootfinder=shadowstack``: use a so-called "shadow stack", which is an explicitly maintained custom stack of - root pointers. This is the most portable solution. - -- ``--gcrootfinder=asmgcc``: use assembler hackery to find the - roots directly from the normal stack. This is a bit faster, - but platform specific. It works so far with GCC or MSVC, - on i386 and x86-64. It is tested only on Linux - so other platforms (as well as MSVC) may need - various fixes before they can be used. Note asmgcc will be deprecated - at some future date, and does not work with clang. - + root pointers. This is the most portable solution, and also + the only one available now. diff -Nru pypy-7.1.1+dfsg/pypy/doc/conf.py pypy-7.3.1+dfsg/pypy/doc/conf.py --- pypy-7.1.1+dfsg/pypy/doc/conf.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/doc/conf.py 2020-04-10 19:28:42.000000000 +0000 @@ -59,7 +59,7 @@ # General information about the project. project = u'PyPy' -copyright = u'2019, The PyPy Project' +copyright = u'2020, The PyPy Project' # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the @@ -71,9 +71,9 @@ # module/cpyext/include/patchlevel.h # # The short X.Y version. -version = '7.2' +version = '7.3' # The full version, including alpha/beta/rc tags. -release = '7.2.0' +release = '7.3.1' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. @@ -232,4 +232,4 @@ u'The PyPy Project', 1) ] -extlinks = {'source': ('https://bitbucket.org/pypy/pypy/src/default/%s', '')} +extlinks = {'source': ('https://foss.heptapod.net/pypy/pypy/src/default/%s', '')} diff -Nru pypy-7.1.1+dfsg/pypy/doc/contributing.rst pypy-7.3.1+dfsg/pypy/doc/contributing.rst --- pypy-7.1.1+dfsg/pypy/doc/contributing.rst 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/doc/contributing.rst 2020-04-10 19:28:40.000000000 +0000 @@ -71,43 +71,75 @@ * Missing language features - these are listed in our `issue tracker`_ .. _nightly builds: http://buildbot.pypy.org/nightly/ -.. _issue tracker: https://bitbucket.org/pypy/pypy/issues +.. _issue tracker: https://foss.heptapod.net/pypy/pypy/issues Source Control -------------- -PyPy development is based a typical fork/pull request based workflow, centered -around Mercurial (hg), hosted on Bitbucket. If you have not used this workflow -before, a good introduction can be found here: +PyPy's main repositories are hosted here: https://foss.heptapod.net/pypy. - https://www.atlassian.com/git/tutorials/comparing-workflows/forking-workflow +`Heptapod `_ is a friendly fork of GitLab Community +Edition supporting Mercurial. https://foss.heptapod.net is a public instance +for Free and Open-Source Software (more information `here +`_). -The cycle for a new PyPy contributor goes typically like this: +Thanks to `Octobus `_ and `Clever Cloud +`_ for providing this service! -Fork & Clone ------------- +.. raw:: html + +

+ + Octobus + Clever Cloud + +

+ +If you are new with Mercurial and Heptapod, you can read this short tutorial: + +.. toctree:: + :maxdepth: 1 + + mercurial_heptapod -* Make an account on bitbucket_. -* Go to https://bitbucket.org/pypy/pypy/ and click "fork" (left - icons). You get a fork of the repository, e.g. in - `https://bitbucket.org/yourname/pypy/`. +Get Access +---------- -* Clone your new repo (i.e. the fork) to your local machine with the command - ``hg clone ssh://hg@bitbucket.org/yourname/pypy``. It is a very slow +The important take-away from that tutorial for experienced developers is that +since the free hosting on foss.heptapod.net does not allow personal forks, you +need permissions to push your changes directly to our repo. Once you sign in to +https://foss.heptapod.net using either a new login or your GitHub or Atlassian +logins, you can get developer status for pushing directly to +the project (just ask by clicking the link at foss.heptapod.net/pypy just under +the logo, and you'll get it, basically). Once you have it you can rewrite your +file ``.hg/hgrc`` to contain ``default = ssh://hg@foss.heptapod.net/pypy/pypy``. +Your changes will then be pushed directly to the official repo, but (if you +follow these rules) they are still on a branch, and we can still review the +branches you want to merge. With developer status, you can push topic +branches. If you wish to push long-lived branches, you will need to ask for +higher permissions. + + +Clone +----- + +* Clone the PyPy repo to your local machine with the command + ``hg clone https://foss.heptapod.net/pypy/pypy``. It takes a minute or two operation but only ever needs to be done once. See also http://pypy.org/download.html#building-from-source . - If you already cloned - ``https://bitbucket.org/pypy/pypy`` before, even if some time ago, + If you already cloned the repo before, even if some time ago, then you can reuse the same clone by editing the file ``.hg/hgrc`` in your clone to contain the line ``default = - ssh://hg@bitbucket.org/yourname/pypy``, and then do ``hg pull && hg + https://foss.heptapod.net/pypy/pypy``, and then do ``hg pull && hg up``. If you already have such a clone but don't want to change it, you can clone that copy with ``hg clone /path/to/other/copy``, and then edit ``.hg/hgrc`` as above and do ``hg pull && hg up``. -* Now you have a complete copy of the PyPy repo. Make a branch - with a command like ``hg branch name_of_your_branch``. +* Now you have a complete copy of the PyPy repo. Make a long-lived branch + with a command like ``hg branch name_of_your_branch``, or make a short- + lived branch for a simple fix with a command like ``hg topic issueXXXX``. Edit ---- @@ -138,43 +170,32 @@ locally present. * You should push often; there is no real reason not to. Remember that - even if they are pushed, with the setup above, the commits are (1) - only in ``bitbucket.org/yourname/pypy``, and (2) in the branch you + even if they are pushed, with the setup above, the commits are only in the + branch you named. Yes, they are publicly visible, but don't worry about someone - walking around the thousands of repos on bitbucket saying "hah, look - at the bad coding style of that guy". Try to get into the mindset + walking around the many branches of PyPy saying "hah, look + at the bad coding style of that person". Try to get into the mindset that your work is not secret and it's fine that way. We might not accept it as is for PyPy, asking you instead to improve some things, - but we are not going to judge you. + but we are not going to judge you unless you don't write tests. -Pull Request ------------- +Merge Request +------------- -* The final step is to open a pull request, so that we know that you'd +* The final step is to open a merge request, so that we know that you'd like to merge that branch back to the original ``pypy/pypy`` repo. This can also be done several times if you have interesting intermediate states, but if you get there, then we're likely to proceed to the next stage, which is... -* Get a regular account for pushing directly to - ``bitbucket.org/pypy/pypy`` (just ask and you'll get it, basically). - Once you have it you can rewrite your file ``.hg/hgrc`` to contain - ``default = ssh://hg@bitbucket.org/pypy/pypy``. Your changes will - then be pushed directly to the official repo, but (if you follow these - rules) they are still on a branch, and we can still review the - branches you want to merge. - * If you get closer to the regular day-to-day development, you'll notice that we generally push small changes as one or a few commits directly - to the branch ``default``. Also, we often collaborate even if we are - on other branches, which do not really "belong" to anyone. At this + to the branch ``default`` or ``py3.6``. Also, we often collaborate even if + we are on other branches, which do not really "belong" to anyone. At this point you'll need ``hg merge`` and learn how to resolve conflicts that sometimes occur when two people try to push different commits in parallel on the same branch. But it is likely an issue for later ``:-)`` -.. _bitbucket: https://bitbucket.org/ - - Architecture ^^^^^^^^^^^^ @@ -311,16 +332,13 @@ directory or even the top level subdirectory ``pypy``. It takes hours and uses huge amounts of RAM and is not recommended. -To run CPython regression tests you can point to the ``lib-python`` -directory:: - - py.test lib-python/2.7/test/test_datetime.py - -This will usually take a long time because this will run -the PyPy Python interpreter on top of CPython. On the plus -side, it's usually still faster than doing a full translation -and running the regression test with the translated PyPy Python -interpreter. +To run CPython regression tests, you should start with a translated PyPy and +run the tests as you would with CPython (see below). You can, however, also +attempt to run the tests before translation, but be aware that it is done with +a hack that doesn't work in all cases and it is usually extremely slow: +``py.test lib-python/2.7/test/test_datetime.py``. Usually, a better idea is to +extract a minimal failing test of at most a few lines, and put it into one of +our own tests in ``pypy/*/test/``. .. _py.test testing tool: http://pytest.org .. _py.test usage and invocations: http://pytest.org/latest/usage.html#usage @@ -329,11 +347,18 @@ Testing After Translation ^^^^^^^^^^^^^^^^^^^^^^^^^ -While the usual invocation of `pytest` translates a piece of RPython code and -runs it, we have a test extension to run tests without translation, directly -on the host python. This is very convenient for modules such as `cpyext`, to -compare and contrast test results between CPython and PyPy. Untranslated tests -are invoked by using the `-A` or `--runappdirect` option to `pytest`:: +While the usual invocation of `pytest` runs app-level tests on an untranslated +PyPy that runs on top of CPython, we have a test extension to run tests +directly on the host python. This is very convenient for modules such as +`cpyext`, to compare and contrast test results between CPython and PyPy. + +App-level tests run directly on the host interpreter when passing `-D` or +`--direct-apptest` to `pytest`:: + + pypy3 -m pytest -D pypy/interpreter/test/apptest_pyframe.py + +Mixed-level tests are invoked by using the `-A` or `--runappdirect` option to +`pytest`:: python2 pytest.py -A pypy/module/cpyext/test @@ -343,6 +368,11 @@ cpython2 pytest.py -A pypy/module/cpyext/test --python=path/to/pypy3 +To run a test from the standard CPython regression test suite, use the regular +Python way, i.e. (replace "pypy" with the exact binary name, if needed):: + + pypy -m test.test_datetime + Tooling & Utilities ^^^^^^^^^^^^^^^^^^^ @@ -457,7 +487,7 @@ The `example-interpreter`_ repository contains an example interpreter written using the RPython translation toolchain. -.. _example-interpreter: https://bitbucket.org/pypy/example-interpreter +.. _example-interpreter: https://foss.heptapod.net/pypy/example-interpreter graphviz & pygame for flow graph viewing (highly recommended) diff -Nru pypy-7.1.1+dfsg/pypy/doc/contributor.rst pypy-7.3.1+dfsg/pypy/doc/contributor.rst --- pypy-7.1.1+dfsg/pypy/doc/contributor.rst 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/doc/contributor.rst 2020-04-10 19:28:40.000000000 +0000 @@ -7,17 +7,17 @@ Armin Rigo Maciej Fijalkowski Carl Friedrich Bolz-Tereick + Matti Picus Antonio Cuni Amaury Forgeot d'Arc - Matti Picus - Samuele Pedroni Ronan Lamy + Samuele Pedroni Alex Gaynor Philip Jenvey Richard Plangger Brian Kearns - Michael Hudson-Doyle Manuel Jacob + Michael Hudson-Doyle David Schneider Holger Krekel Christian Tismer @@ -60,15 +60,17 @@ Jacob Hallen Jason Creighton Mark Young + Andrew Lawrence Alex Martelli Spenser Bauman Michal Bendowski Jan de Mooij + Stefan Beyer + Stefano Rivera Tyler Wade Vincent Legoll Michael Foord Stephan Diehl - Stefano Rivera Jean-Paul Calderone Stefan Schwarzer Tomek Meka @@ -77,7 +79,6 @@ Devin Jeanpierre Bob Ippolito Bruno Gola - Andrew Lawrence David Malcolm Squeaky Edd Barrett @@ -91,7 +92,7 @@ Wenzhu Man Konstantin Lopuhin John Witulski - Stefan Beyer + Yannick Jadoul Jeremy Thurgood Greg Price Ivan Sichmann Freitas @@ -101,8 +102,10 @@ Tobias Pape Andreas Stührk Jean-Philippe St. Pierre + Stian Andreassen Guido van Rossum Pavel Vinogradov + Julian Berman William Leslie Paweł Piotr Przeradowski marky1991 @@ -113,14 +116,13 @@ Taavi Burns Adrian Kuhn tav - Stian Andreassen - Georg Brandl Joannah Nanjekye + Georg Brandl + quejebo Bert Freudenberg Wanja Saatkamp Mike Blume Gerald Klix - Julian Berman Oscar Nierstrasz Rami Chowdhury Stefan H. Muller @@ -159,6 +161,7 @@ Lucian Branescu Mihaila Mariano Anaya anatoly techtonik + Lin Cheng Karl Bartel Gabriel Lavoie Jared Grubb @@ -189,6 +192,7 @@ Anders Qvist Corbin Simpson Chirag Jadwani + Mike Pavone Pauli Virtanen Jonathan David Riehl Beatrice During @@ -212,6 +216,7 @@ Valentina Mukhamedzhanova Stefano Parmesan touilleMan + Anthony Sottile Marc Abramowitz Arjun Naik Aaron Gallagher @@ -221,7 +226,6 @@ Omer Katz Jacek Generowicz Tomasz Dziopa - Lin Cheng Sylvain Thenault Jakub Stasiak Andrew Dalke @@ -237,9 +241,12 @@ Yasir Suhail Sergey Kishchenko Martin Blais + Catalin Fierut Lutz Paelike Ian Foote Philipp Rustemeuer + Bernd Schoeller + olliemath Logan Chien Catalin Gabriel Manciu Jacob Oscarson @@ -252,7 +259,6 @@ Lene Wagner Tomo Cocoa Miro Hrončok - Anthony Sottile David Lievens Neil Blakey-Milner Henrik Vendelbo @@ -261,24 +267,31 @@ Christoph Gerum Miguel de Val Borro Artur Lisiecki + joserubiovidales@gmail.com afteryu Toni Mattis + Vincent Michel Laurens Van Houtven Bobby Impollonia Roberto De Ioris + Sreepathi Pai Jeong YunWon + dakarpov@gmail.com Christopher Armstrong Aaron Tubbs Vasantha Ganesh K Jason Michalski Radu Ciorba + Ryan Hileman Markus Holtermann + Georges Racinet Andrew Thompson Yusei Tahara Ruochen Huang Fabio Niephaus Akira Li Gustavo Niemeyer + joachim-ballmann@bitbucket.org Nate Bragg Lucas Stadler roberto@goyle @@ -294,12 +307,17 @@ Kim Jin Su Amber Brown Andrew Stepanov + ashwinahuja Rafał Gałczyński Ben Darnell Juan Francisco Cantero Hurtado Godefroid Chappelle + Paul Ganssle + Michal Kuffa Stephan Busemann + Bystroushaak Dan Colish + Ram Rachum timo Volodymyr Vladymyrov Daniel Neuhäuser @@ -309,21 +327,28 @@ Chris Lambacher John Aldis coolbutuseless@gmail.com + Yasen Kiprov Mike Bayer Rodrigo Araújo Daniil Yarancev Min RK OlivierBlanvillain + bernd.schoeller@inf.ethz.ch Jonas Pfannschmidt + Alex Kashirin Zearin + Joannah Nanjekye nanjekyejoannah@gmail.com + Ihar Shabes Johan Forsberg Andrey Churin Dan Crosta reubano@gmail.com Stanisław Halik + DeVerne Jones Julien Phalip Roman Podoliaka Steve Papanik + Henri Tuhola Eli Stevens Boglarka Vezer gabrielg@ec2-54-146-239-158.compute-1.amazonaws.com @@ -336,24 +361,29 @@ Jim Hunziker shoma hosaka Buck Golemon + whitequark Iraklis D. JohnDoe yrttyr Michael Chermside Anna Ravencroft remarkablerocket + Ivan Petre Vijiac Berker Peksag Christian Muirhead soareschen Matthew Miller + Jesdi Konrad Delong Dinu Gherman + Sam Edwards pizi Tomáš Pružina James Robert Armin Ronacher Diana Popa + Mike Kaplinskiy Mads Kiilerich Brett Cannon Caleb Hattingh @@ -365,17 +395,21 @@ Markus Unterwaditzer Kristoffer Kleine Graham Markall + paugier Dan Loewenherz werat Filip Salomonsson Niclas Olofsson + Zsolt Cserna Chris Pressey Tobias Diaz Paul Graydon + mkuffa Nikolaos-Digenis Karagiannis Kurt Griffiths Ben Mather Donald Stufft + kotus9 Dan Sanders Jason Madden Yaroslav Fedevych diff -Nru pypy-7.1.1+dfsg/pypy/doc/cpython_differences.rst pypy-7.3.1+dfsg/pypy/doc/cpython_differences.rst --- pypy-7.1.1+dfsg/pypy/doc/cpython_differences.rst 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/doc/cpython_differences.rst 2020-04-10 19:28:40.000000000 +0000 @@ -81,14 +81,16 @@ and the callback will not be invoked. (Issue `#2030`__) .. __: https://docs.python.org/2/library/weakref.html -.. __: https://bitbucket.org/pypy/pypy/issue/2030/ +.. __: https://foss.heptapod.net/pypy/pypy/issue/2030/ --------------------------------- There are a few extra implications from the difference in the GC. Most notably, if an object has a ``__del__``, the ``__del__`` is never called more than once in PyPy; but CPython will call the same ``__del__`` several times -if the object is resurrected and dies again. The ``__del__`` methods are +if the object is resurrected and dies again (at least it is reliably so in +older CPythons; newer CPythons try to call destructors not more than once, +but there are counter-examples). The ``__del__`` methods are called in "the right" order if they are on objects pointing to each other, as in CPython, but unlike CPython, if there is a dead cycle of objects referencing each other, their ``__del__`` methods are called anyway; @@ -278,7 +280,7 @@ no good value to return from this call to ``cmp``, because ``cmp`` pretends that there is a total order on floats, but that is wrong for NaNs). -.. __: https://bitbucket.org/pypy/pypy/issue/1974/different-behaviour-for-collections-of +.. __: https://foss.heptapod.net/pypy/pypy/issue/1974/different-behaviour-for-collections-of C-API Differences ----------------- @@ -581,6 +583,6 @@ .. _`is ignored in PyPy`: http://bugs.python.org/issue14621 .. _`little point`: http://events.ccc.de/congress/2012/Fahrplan/events/5152.en.html -.. _`#2072`: https://bitbucket.org/pypy/pypy/issue/2072/ -.. _`issue #2653`: https://bitbucket.org/pypy/pypy/issues/2653/ +.. _`#2072`: https://foss.heptapod.net/pypy/pypy/issue/2072/ +.. _`issue #2653`: https://foss.heptapod.net/pypy/pypy/issues/2653/ .. _SyntaxError: https://morepypy.blogspot.co.il/2018/04/improving-syntaxerror-in-pypy.html diff -Nru pypy-7.1.1+dfsg/pypy/doc/eventhistory.rst pypy-7.3.1+dfsg/pypy/doc/eventhistory.rst --- pypy-7.1.1+dfsg/pypy/doc/eventhistory.rst 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/doc/eventhistory.rst 2020-04-10 19:28:40.000000000 +0000 @@ -17,7 +17,7 @@ Read more in the `EuroPython 2006 sprint report`_. -.. _EuroPython 2006 sprint report: https://bitbucket.org/pypy/extradoc/raw/tip/sprintinfo/post-ep2006/report.txt +.. _EuroPython 2006 sprint report: https://foss.heptapod.net/pypy/extradoc/raw/tip/sprintinfo/post-ep2006/report.txt PyPy at XP 2006 and Agile 2006 @@ -42,7 +42,7 @@ Read more about `the sprint`__ -__ https://bitbucket.org/pypy/extradoc/src/extradoc/sprintinfo/ddorf2006/ +__ https://foss.heptapod.net/pypy/extradoc/src/extradoc/sprintinfo/ddorf2006/ PyPy sprint at Akihabara (Tokyo, Japan) @@ -55,7 +55,7 @@ backends. For more details, read the last `sprint status`_ page and enjoy the pictures_. -.. _sprint status: https://bitbucket.org/pypy/extradoc/src/tip/sprintinfo/tokyo/tokyo-planning.txt +.. _sprint status: https://foss.heptapod.net/pypy/extradoc/blob/branch/default/sprintinfo/tokyo/tokyo-planning.txt .. _pictures: http://www.flickr.com/photos/19046555@N00/sets/72057594116388174/ @@ -119,7 +119,7 @@ said they were interested in the outcome and would keep an eye on its progress. Read the `talk slides`_. -.. _talk slides: https://bitbucket.org/pypy/extradoc/raw/tip/talk/solutions-linux-paris-2006.html +.. _talk slides: https://foss.heptapod.net/pypy/extradoc/raw/branch/default/talk/solutions-linux-paris-2006.html PyPy Sprint in Palma De Mallorca 23rd - 29th January 2006 @@ -133,7 +133,7 @@ Read more in `the announcement`_, there is a `sprint report`_ for the first three days and `one for the rest of the sprint`_. -.. _the announcement: https://bitbucket.org/pypy/extradoc/raw/tip/sprintinfo/mallorca/sprint-announcement.txt +.. _the announcement: https://foss.heptapod.net/pypy/extradoc/raw/branch/default/sprintinfo/mallorca/sprint-announcement.txt .. _sprint report: https://mail.python.org/pipermail/pypy-dev/2006-January/002746.html .. _one for the rest of the sprint: https://mail.python.org/pipermail/pypy-dev/2006-January/002749.html @@ -190,7 +190,7 @@ way back. *(10/18/2005)* -.. _Logilab offices in Paris: https://bitbucket.org/pypy/extradoc/raw/tip/sprintinfo/paris-2005-sprint.txt +.. _Logilab offices in Paris: https://foss.heptapod.net/pypy/extradoc/raw/branch/default/sprintinfo/paris-2005-sprint.txt .. _JIT: http://en.wikipedia.org/wiki/Just-in-time_compilation .. _continuation-passing: http://en.wikipedia.org/wiki/Continuation_passing_style .. _report about day one: https://mail.python.org/pipermail/pypy-dev/2005-October/002510.html @@ -221,8 +221,8 @@ and a `heidelberg summary report`_ detailing some of the works that led to the successful release of :doc:`pypy-0.7.0 `! -.. _heidelberg summary report: https://bitbucket.org/pypy/extradoc/raw/tip/sprintinfo/Heidelberg-report.txt -.. _PyPy sprint: https://bitbucket.org/pypy/extradoc/raw/tip/sprintinfo/Heidelberg-sprint.txt +.. _heidelberg summary report: https://foss.heptapod.net/pypy/extradoc/raw/branch/default/sprintinfo/Heidelberg-report.txt +.. _PyPy sprint: https://foss.heptapod.net/pypy/extradoc/raw/branch/default/sprintinfo/Heidelberg-sprint.txt .. _day 1 - 3: https://mail.python.org/pipermail/pypy-dev/2005-August/002287.html @@ -266,5 +266,5 @@ .. _pypy-dev: https://mail.python.org/mailman/listinfo/pypy-dev .. _EuroPython: http://europython.org -.. _sprint announcement: https://bitbucket.org/pypy/extradoc/raw/tip/sprintinfo/EP2005-announcement.html -.. _list of people coming: https://bitbucket.org/pypy/extradoc/raw/tip/sprintinfo/EP2005-people.html +.. _sprint announcement: https://foss.heptapod.net/pypy/extradoc/raw/branch/default/sprintinfo/EP2005-announcement.html +.. _list of people coming: https://foss.heptapod.net/pypy/extradoc/raw/branch/default/sprintinfo/EP2005-people.html diff -Nru pypy-7.1.1+dfsg/pypy/doc/extending.rst pypy-7.3.1+dfsg/pypy/doc/extending.rst --- pypy-7.1.1+dfsg/pypy/doc/extending.rst 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/doc/extending.rst 2020-04-10 19:28:40.000000000 +0000 @@ -25,7 +25,7 @@ API-level access to C --- so that you can sanely access C libraries without depending on details like the exact field order in the C structures or the numerical value of all the constants. It works on -both CPython (as a separate ``pip install cffi``) and on PyPy, where it +both CPython (as a separate ``python -mpip install cffi``) and on PyPy, where it is included by default. PyPy's JIT does a quite reasonable job on the Python code that call C @@ -69,7 +69,7 @@ With PyPy, it leverages the built-in ``_cppyy`` module, allowing the JIT to remove most of the cross-language overhead. -To install, run ``pip install cppyy``. +To install, run `` -mpip install cppyy``. Further details are available in the `full documentation`_. .. _`full documentation`: https://cppyy.readthedocs.org/ diff -Nru pypy-7.1.1+dfsg/pypy/doc/extradoc.rst pypy-7.3.1+dfsg/pypy/doc/extradoc.rst --- pypy-7.1.1+dfsg/pypy/doc/extradoc.rst 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/doc/extradoc.rst 2020-04-10 19:28:40.000000000 +0000 @@ -71,15 +71,15 @@ for Python`_, A. Rigo -.. _bibtex: https://bitbucket.org/pypy/extradoc/raw/tip/talk/bibtex.bib -.. _A Way Forward in Parallelising Dynamic Languages: https://bitbucket.org/pypy/extradoc/raw/extradoc/talk/icooolps2014/position-paper.pdf -.. _Runtime Feedback in a Meta-Tracing JIT for Efficient Dynamic Languages: https://bitbucket.org/pypy/extradoc/raw/extradoc/talk/icooolps2011/jit-hints.pdf -.. _Allocation Removal by Partial Evaluation in a Tracing JIT: https://bitbucket.org/pypy/extradoc/raw/extradoc/talk/pepm2011/bolz-allocation-removal.pdf +.. _bibtex: https://foss.heptapod.net/pypy/extradoc/raw/branch/default/talk/bibtex.bib +.. _A Way Forward in Parallelising Dynamic Languages: https://foss.heptapod.net/pypy/extradoc/raw/branch/default/talk/icooolps2014/position-paper.pdf +.. _Runtime Feedback in a Meta-Tracing JIT for Efficient Dynamic Languages: https://foss.heptapod.net/pypy/extradoc/raw/branch/default/talk/icooolps2011/jit-hints.pdf +.. _Allocation Removal by Partial Evaluation in a Tracing JIT: https://foss.heptapod.net/pypy/extradoc/raw/branch/default/talk/pepm2011/bolz-allocation-removal.pdf .. _Towards a Jitting VM for Prolog Execution: http://stups.hhu.de/mediawiki/images/a/a7/Pub-BoLeSch2010.pdf .. _High performance implementation of Python for CLI/.NET with JIT compiler generation for dynamic languages: http://buildbot.pypy.org/misc/antocuni-thesis.pdf -.. _How to *not* write Virtual Machines for Dynamic Languages: https://bitbucket.org/pypy/extradoc/raw/tip/talk/dyla2007/dyla.pdf -.. _`Tracing the Meta-Level: PyPy's Tracing JIT Compiler`: https://bitbucket.org/pypy/extradoc/raw/tip/talk/icooolps2009/bolz-tracing-jit.pdf -.. _`Faster than C#: Efficient Implementation of Dynamic Languages on .NET`: https://bitbucket.org/pypy/extradoc/raw/tip/talk/icooolps2009-dotnet/cli-jit.pdf +.. _How to *not* write Virtual Machines for Dynamic Languages: https://foss.heptapod.net/pypy/extradoc/raw/branch/default/talk/dyla2007/dyla.pdf +.. _`Tracing the Meta-Level: PyPy's Tracing JIT Compiler`: https://foss.heptapod.net/pypy/extradoc/raw/branch/default/talk/icooolps2009/bolz-tracing-jit.pdf +.. _`Faster than C#: Efficient Implementation of Dynamic Languages on .NET`: https://foss.heptapod.net/pypy/extradoc/raw/branch/default/talk/icooolps2009-dotnet/cli-jit.pdf .. _Automatic JIT Compiler Generation with Runtime Partial Evaluation: https://www.researchgate.net/profile/Davide_Ancona/publication/252023163_Automatic_generation_of_JIT_compilers_for_dynamic_languages_in_NET/links/53f2098e0cf2bc0c40e70023/Automatic-generation-of-JIT-compilers-for-dynamic-languages-in-NET.pdf .. _`RPython: A Step towards Reconciling Dynamically and Statically Typed OO Languages`: http://www.disi.unige.it/person/AnconaD/papers/DynamicLanguages_abstracts.html#AACM-DLS07 .. _EU Reports: index-report.html @@ -87,9 +87,9 @@ .. _`PyGirl: Generating Whole-System VMs from High-Level Prototypes using PyPy`: http://scg.unibe.ch/archive/papers/Brun09cPyGirl.pdf .. _Representation-Based Just-in-Time Specialization and the Psyco Prototype for Python: http://psyco.sourceforge.net/psyco-pepm-a.ps.gz .. _Back to the Future in One Week -- Implementing a Smalltalk VM in PyPy: http://dx.doi.org/10.1007/978-3-540-89275-5_7 -.. _Automatic generation of JIT compilers for dynamic languages in .NET: https://bitbucket.org/pypy/extradoc/raw/tip/talk/ecoop2009/main.pdf -.. _Core Object Optimization Results: https://bitbucket.org/pypy/extradoc/raw/tip/eu-report/D06.1_Core_Optimizations-2007-04-30.pdf -.. _Compiling Dynamic Language Implementations: https://bitbucket.org/pypy/extradoc/raw/tip/eu-report/D05.1_Publish_on_translating_a_very-high-level_description.pdf +.. _Automatic generation of JIT compilers for dynamic languages in .NET: https://foss.heptapod.net/pypy/extradoc/raw/branch/default/talk/ecoop2009/main.pdf +.. _Core Object Optimization Results: https://foss.heptapod.net/pypy/extradoc/raw/branch/default/eu-report/D06.1_Core_Optimizations-2007-04-30.pdf +.. _Compiling Dynamic Language Implementations: https://foss.heptapod.net/pypy/extradoc/raw/branch/default/eu-report/D05.1_Publish_on_translating_a_very-high-level_description.pdf Talks and Presentations @@ -98,7 +98,7 @@ *This part is no longer updated.* The complete list is here__ (in alphabetical order). -.. __: https://bitbucket.org/pypy/extradoc/src/extradoc/talk/ +.. __: https://foss.heptapod.net/pypy/extradoc/blob/branch/default/talk/ Talks in 2010 ~~~~~~~~~~~~~ @@ -146,7 +146,7 @@ * `PyCon 2008`_. -.. __: https://bitbucket.org/pypy/extradoc/raw/tip/talk/s3-2008/talk.pdf +.. __: https://foss.heptapod.net/pypy/extradoc/raw/branch/default/talk/s3-2008/talk.pdf Talks in 2007 @@ -181,9 +181,9 @@ * `Warsaw 2007`_. -.. __: https://bitbucket.org/pypy/extradoc/raw/tip/talk/roadshow-ibm/ -.. __: https://bitbucket.org/pypy/extradoc/raw/tip/talk/roadshow-google/Pypy_architecture.pdf -.. __: https://bitbucket.org/pypy/extradoc/raw/tip/talk/dls2007/rpython-talk.pdf +.. __: https://foss.heptapod.net/pypy/extradoc/raw/branch/default/talk/roadshow-ibm/ +.. __: https://foss.heptapod.net/pypy/extradoc/raw/branch/default/talk/roadshow-google/Pypy_architecture.pdf +.. __: https://foss.heptapod.net/pypy/extradoc/raw/branch/default/talk/dls2007/rpython-talk.pdf Talks in 2006 @@ -268,52 +268,52 @@ .. _PyCon 2010: http://morepypy.blogspot.com/2010/02/pycon-2010-report.html .. _RuPy 2009: http://morepypy.blogspot.com/2009/11/pypy-on-rupy-2009.html -.. _PyPy 3000: https://bitbucket.org/pypy/extradoc/raw/tip/talk/ep2006/pypy3000.txt -.. _What can PyPy do for you: https://bitbucket.org/pypy/extradoc/raw/tip/talk/ep2006/usecases-slides.txt -.. _PyPy introduction at EuroPython 2006: https://bitbucket.org/pypy/extradoc/raw/tip/talk/ep2006/intro.pdf -.. _PyPy - the new Python implementation on the block: https://bitbucket.org/pypy/extradoc/raw/tip/talk/22c3/hpk-tech.txt -.. _PyPy development method: https://bitbucket.org/pypy/extradoc/raw/tip/talk/pycon2006/method_talk.txt -.. _PyPy intro: https://bitbucket.org/pypy/extradoc/raw/tip/talk/accu2006/accu-2006.pdf -.. _oscon2003-paper: https://bitbucket.org/pypy/extradoc/raw/tip/talk/oscon2003-paper.txt -.. _Architecture introduction slides: https://bitbucket.org/pypy/extradoc/raw/tip/talk/amsterdam-sprint-intro.pdf -.. _EU funding for FOSS: https://bitbucket.org/pypy/extradoc/raw/tip/talk/2004-21C3-pypy-EU-hpk.pdf -.. _py lib slides: https://bitbucket.org/pypy/extradoc/raw/tip/talk/2005-pycon-py.pdf -.. _PyCon 2005: https://bitbucket.org/pypy/extradoc/raw/tip/talk/pypy-talk-pycon2005/README.txt -.. _Trouble in Paradise: https://bitbucket.org/pypy/extradoc/raw/tip/talk/agile2006/during-oss-sprints_talk.pdf -.. _Sprint Driven Development: https://bitbucket.org/pypy/extradoc/raw/tip/talk/xp2006/during-xp2006-sprints.pdf -.. _Kill -1: https://bitbucket.org/pypy/extradoc/raw/tip/talk/ep2006/kill_1_agiletalk.pdf -.. _Open Source, EU-Funding and Agile Methods: https://bitbucket.org/pypy/extradoc/raw/tip/talk/22c3/agility.pdf -.. _PyPy Status: https://bitbucket.org/pypy/extradoc/raw/tip/talk/vancouver/ -.. _Sprinting the PyPy way: https://bitbucket.org/pypy/extradoc/raw/tip/talk/ep2005/pypy_sprinttalk_ep2005bd.pdf -.. _PyPy's VM Approach: https://bitbucket.org/pypy/extradoc/raw/tip/talk/dls2006/ -.. _PyPy's approach to virtual machine construction: https://bitbucket.org/pypy/extradoc/raw/tip/talk/dls2006/pypy-vm-construction.pdf -.. _EuroPython talks 2009: https://bitbucket.org/pypy/extradoc/raw/tip/talk/ep2009/ -.. _PyCon talks 2009: https://bitbucket.org/pypy/extradoc/raw/tip/talk/pycon2009/ -.. _Wroclaw (Poland) presentation: https://bitbucket.org/pypy/extradoc/raw/tip/talk/wroclaw2009/talk.pdf +.. _PyPy 3000: https://foss.heptapod.net/pypy/extradoc/raw/branch/default/talk/ep2006/pypy3000.txt +.. _What can PyPy do for you: https://foss.heptapod.net/pypy/extradoc/raw/branch/default/talk/ep2006/usecases-slides.txt +.. _PyPy introduction at EuroPython 2006: https://foss.heptapod.net/pypy/extradoc/raw/branch/default/talk/ep2006/intro.pdf +.. _PyPy - the new Python implementation on the block: https://foss.heptapod.net/pypy/extradoc/raw/branch/default/talk/22c3/hpk-tech.txt +.. _PyPy development method: https://foss.heptapod.net/pypy/extradoc/raw/branch/default/talk/pycon2006/method_talk.txt +.. _PyPy intro: https://foss.heptapod.net/pypy/extradoc/raw/branch/default/talk/accu2006/accu-2006.pdf +.. _oscon2003-paper: https://foss.heptapod.net/pypy/extradoc/raw/branch/default/talk/oscon2003-paper.txt +.. _Architecture introduction slides: https://foss.heptapod.net/pypy/extradoc/raw/branch/default/talk/amsterdam-sprint-intro.pdf +.. _EU funding for FOSS: https://foss.heptapod.net/pypy/extradoc/raw/branch/default/talk/2004-21C3-pypy-EU-hpk.pdf +.. _py lib slides: https://foss.heptapod.net/pypy/extradoc/raw/branch/default/talk/2005-pycon-py.pdf +.. _PyCon 2005: https://foss.heptapod.net/pypy/extradoc/raw/branch/default/talk/pypy-talk-pycon2005/README.txt +.. _Trouble in Paradise: https://foss.heptapod.net/pypy/extradoc/raw/branch/default/talk/agile2006/during-oss-sprints_talk.pdf +.. _Sprint Driven Development: https://foss.heptapod.net/pypy/extradoc/raw/branch/default/talk/xp2006/during-xp2006-sprints.pdf +.. _Kill -1: https://foss.heptapod.net/pypy/extradoc/raw/branch/default/talk/ep2006/kill_1_agiletalk.pdf +.. _Open Source, EU-Funding and Agile Methods: https://foss.heptapod.net/pypy/extradoc/raw/branch/default/talk/22c3/agility.pdf +.. _PyPy Status: https://foss.heptapod.net/pypy/extradoc/raw/branch/default/talk/vancouver/ +.. _Sprinting the PyPy way: https://foss.heptapod.net/pypy/extradoc/raw/branch/default/talk/ep2005/pypy_sprinttalk_ep2005bd.pdf +.. _PyPy's VM Approach: https://foss.heptapod.net/pypy/extradoc/raw/branch/default/talk/dls2006/ +.. _PyPy's approach to virtual machine construction: https://foss.heptapod.net/pypy/extradoc/raw/branch/default/talk/dls2006/pypy-vm-construction.pdf +.. _EuroPython talks 2009: https://foss.heptapod.net/pypy/extradoc/raw/branch/default/talk/ep2009/ +.. _PyCon talks 2009: https://foss.heptapod.net/pypy/extradoc/raw/branch/default/talk/pycon2009/ +.. _Wroclaw (Poland) presentation: https://foss.heptapod.net/pypy/extradoc/raw/branch/default/talk/wroclaw2009/talk.pdf .. _PyPy talk at OpenBossa 09: http://morepypy.blogspot.com/2009/03/pypy-talk-at-openbossa-09.html -.. _at SFI 08: https://bitbucket.org/pypy/extradoc/raw/tip/talk/sfi2008/ -.. _at PyCon Poland 08: https://bitbucket.org/pypy/extradoc/raw/tip/talk/pyconpl-2008/talk.pdf -.. _The PyPy Project and You: https://bitbucket.org/pypy/extradoc/raw/tip/talk/osdc2008/osdc08.pdf -.. _EuroPython talks 2008: https://bitbucket.org/pypy/extradoc/raw/tip/talk/ep2008/ +.. _at SFI 08: https://foss.heptapod.net/pypy/extradoc/raw/branch/default/talk/sfi2008/ +.. _at PyCon Poland 08: https://foss.heptapod.net/pypy/extradoc/raw/branch/default/talk/pyconpl-2008/talk.pdf +.. _The PyPy Project and You: https://foss.heptapod.net/pypy/extradoc/raw/branch/default/talk/osdc2008/osdc08.pdf +.. _EuroPython talks 2008: https://foss.heptapod.net/pypy/extradoc/raw/branch/default/talk/ep2008/ .. _Maemo summit: http://morepypy.blogspot.com/2008/09/pypypython-at-maemo-summit.html -.. _PyCon UK 2008 - JIT: https://bitbucket.org/pypy/extradoc/raw/tip/talk/pycon-uk-2008/jit/pypy-vm.pdf -.. _PyCon UK 2008 - Status: https://bitbucket.org/pypy/extradoc/raw/tip/talk/pycon-uk-2008/status/status.pdf -.. _PyCon Italy 2008: https://bitbucket.org/pypy/extradoc/raw/tip/talk/pycon-italy-2008/pypy-vm.pdf -.. _RuPy 2008: https://bitbucket.org/pypy/extradoc/raw/tip/talk/rupy2008/ -.. _RuPy 2007: https://bitbucket.org/pypy/extradoc/raw/tip/talk/rupy2007/ -.. _PyCon 2008: https://bitbucket.org/pypy/extradoc/raw/tip/talk/pycon2008/ -.. _ESUG 2007: https://bitbucket.org/pypy/extradoc/raw/tip/talk/esug2007/ -.. _Bern (Switzerland) 2007: https://bitbucket.org/pypy/extradoc/raw/tip/talk/bern2007/ -.. _PyCon UK 2007: https://bitbucket.org/pypy/extradoc/raw/tip/talk/pyconuk07/ -.. _Dresden: https://bitbucket.org/pypy/extradoc/raw/tip/talk/dresden/ -.. _EuroPython 2007: https://bitbucket.org/pypy/extradoc/raw/tip/talk/ep2007/ -.. _Bad Honnef 2007: https://bitbucket.org/pypy/extradoc/raw/tip/talk/badhonnef2007/talk.pdf -.. _Dzug talk: https://bitbucket.org/pypy/extradoc/raw/tip/talk/dzug2007/dzug2007.txt -.. _PyCon 2007: https://bitbucket.org/pypy/extradoc/raw/tip/talk/pycon2007/ -.. _PyCon - Uno 2007: https://bitbucket.org/pypy/extradoc/raw/tip/talk/pycon-uno2007/pycon07.pdf -.. _Warsaw 2007: https://bitbucket.org/pypy/extradoc/raw/tip/talk/warsaw2007/ -.. _Warsaw 2006: https://bitbucket.org/pypy/extradoc/raw/tip/talk/warsaw2006/ -.. _Tokyo 2006: https://bitbucket.org/pypy/extradoc/raw/tip/talk/tokyo/ +.. _PyCon UK 2008 - JIT: https://foss.heptapod.net/pypy/extradoc/raw/branch/default/talk/pycon-uk-2008/jit/pypy-vm.pdf +.. _PyCon UK 2008 - Status: https://foss.heptapod.net/pypy/extradoc/raw/branch/default/talk/pycon-uk-2008/status/status.pdf +.. _PyCon Italy 2008: https://foss.heptapod.net/pypy/extradoc/raw/branch/default/talk/pycon-italy-2008/pypy-vm.pdf +.. _RuPy 2008: https://foss.heptapod.net/pypy/extradoc/raw/branch/default/talk/rupy2008/ +.. _RuPy 2007: https://foss.heptapod.net/pypy/extradoc/raw/branch/default/talk/rupy2007/ +.. _PyCon 2008: https://foss.heptapod.net/pypy/extradoc/raw/branch/default/talk/pycon2008/ +.. _ESUG 2007: https://foss.heptapod.net/pypy/extradoc/raw/branch/default/talk/esug2007/ +.. _Bern (Switzerland) 2007: https://foss.heptapod.net/pypy/extradoc/raw/branch/default/talk/bern2007/ +.. _PyCon UK 2007: https://foss.heptapod.net/pypy/extradoc/raw/branch/default/talk/pyconuk07/ +.. _Dresden: https://foss.heptapod.net/pypy/extradoc/raw/branch/default/talk/dresden/ +.. _EuroPython 2007: https://foss.heptapod.net/pypy/extradoc/raw/branch/default/talk/ep2007/ +.. _Bad Honnef 2007: https://foss.heptapod.net/pypy/extradoc/raw/branch/default/talk/badhonnef2007/talk.pdf +.. _Dzug talk: https://foss.heptapod.net/pypy/extradoc/raw/branch/default/talk/dzug2007/dzug2007.txt +.. _PyCon 2007: https://foss.heptapod.net/pypy/extradoc/raw/branch/default/talk/pycon2007/ +.. _PyCon - Uno 2007: https://foss.heptapod.net/pypy/extradoc/raw/branch/default/talk/pycon-uno2007/pycon07.pdf +.. _Warsaw 2007: https://foss.heptapod.net/pypy/extradoc/raw/branch/default/talk/warsaw2007/ +.. _Warsaw 2006: https://foss.heptapod.net/pypy/extradoc/raw/branch/default/talk/warsaw2006/ +.. _Tokyo 2006: https://foss.heptapod.net/pypy/extradoc/raw/branch/default/talk/tokyo/ Related projects diff -Nru pypy-7.1.1+dfsg/pypy/doc/faq.rst pypy-7.3.1+dfsg/pypy/doc/faq.rst --- pypy-7.1.1+dfsg/pypy/doc/faq.rst 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/doc/faq.rst 2020-04-10 19:28:40.000000000 +0000 @@ -52,10 +52,14 @@ and read on. It is quite common nowadays that xyz is available on PyPI_ and -installable with ``pip install xyz``. The simplest solution is to `use -virtualenv (as documented here)`_. Then enter (activate) the virtualenv -and type: ``pip install xyz``. If you don't know or don't want virtualenv, -you can also install ``pip`` globally by saying ``pypy -m ensurepip``. +installable with `` -mpip install xyz``. The simplest solution is to +`use virtualenv (as documented here)`_. Then enter (activate) the virtualenv +and type: ``pypy -mpip install xyz``. If you don't know or don't want +virtualenv, you can also use ``pip`` locally after ``pypy -m ensurepip``. +The `ensurepip module`_ is built-in to the PyPy downloads we provide. +Best practices with ``pip`` is to always call it as `` -mpip ...``, +but if you wish to be able to call ``pip`` directly from the command line, you +must call ``pypy -mensurepip --default-pip``. If you get errors from the C compiler, the module is a CPython C Extension module using unsupported features. `See below.`_ @@ -69,6 +73,7 @@ .. _PyPI: https://pypi.org .. _`use virtualenv (as documented here)`: install.html#installing-using-virtualenv +.. _`ensurepip module`: https://docs.python.org/3.6/library/ensurepip.html Module xyz does not work in the sandboxed PyPy? @@ -200,10 +205,6 @@ based on the micronumpy module written in RPython, instead of of ``numpy.core.multiarray`` which is written in C. -Moreover, it is also possible to install the upstream version of ``numpy``: -its core is written in C and it runs on PyPy under the cpyext compatibility -layer. This is what you get if you do ``pypy -m pip install numpy``. - Should I install numpy or numpypy? ----------------------------------- @@ -406,7 +407,7 @@ How should I report a bug? -------------------------- -Our bug tracker is here: https://bitbucket.org/pypy/pypy/issues/ +Our bug tracker is here: https://foss.heptapod.net/pypy/pypy/issues/ Missing features or incompatibilities with CPython are considered bugs, and they are welcome. (See also our list of `known @@ -425,7 +426,7 @@ `This is a clear and useful bug report.`__ (Admittedly, sometimes the problem is really hard to reproduce, but please try to.) -.. __: https://bitbucket.org/pypy/pypy/issues/2363/segfault-in-gc-pinned-object-in +.. __: https://foss.heptapod.net/pypy/pypy/issues/2363/segfault-in-gc-pinned-object-in In more details: @@ -465,14 +466,36 @@ the GC and possibly the JIT. -Why doesn't PyPy move to GitHub, Gitlab, ...? ----------------------------------------------- +.. _git: +.. _github: + +Why doesn't PyPy use Git and move to GitHub? +--------------------------------------------- -We've been quite happy with bitbucket.org. Moving version control systems and -hosting is a lot of hard work: On the one hand, PyPy's mercurial history is -long and gnarly. On the other hand, all our infrastructure (buildbots, -benchmarking, etc) would have to be adapted. So unless somebody steps up and -volunteers to do all that work, it will likely not happen. +We discussed it during the switch away from bitbucket. We concluded that (1) +the Git workflow is not as well suited as the Mercurial workflow for our style, +and (2) moving to github "just because everybody else does" is a argument on +thin grounds. + +For (1), there are a few issues, but maybe the most important one is that the +PyPy repository has got thousands of *named* branches. Git has no equivalent +concept. Git has *branches,* of course, which in Mercurial are called +bookmarks. We're not talking about bookmarks. + +The difference between git branches and named branches is not that important in +a repo with 10 branches (no matter how big). But in the case of PyPy, we have +at the moment 1840 branches. Most are closed by now, of course. But we would +really like to retain (both now and in the future) the ability to look at a +commit from the past, and know in which branch it was made. Please make sure +you understand the difference between the Git and the Mercurial branches to +realize that this is not always possible with Git--- we looked hard, and there +is no built-in way to get this workflow. + +Still not convinced? Consider this git repo with three commits: commit #2 with +parent #1 and head of git branch "A"; commit #3 with also parent #1 but head of +git branch "B". When commit #1 was made, was it in the branch "A" or "B"? +(It could also be yet another branch whose head was also moved forward, or even +completely deleted.) What is needed for Windows 64 support of PyPy? diff -Nru pypy-7.1.1+dfsg/pypy/doc/how-to-release.rst pypy-7.3.1+dfsg/pypy/doc/how-to-release.rst --- pypy-7.1.1+dfsg/pypy/doc/how-to-release.rst 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/doc/how-to-release.rst 2020-04-10 19:28:40.000000000 +0000 @@ -8,6 +8,12 @@ a branch named like release-pypy3.5-v2.x or release-pypy3.5-v4.x, and each release is tagged, for instance release-pypy3.5-v4.0.1. +The release version number should be bumped. A micro release increment means +there were no changes that justify rebuilding c-extension wheels, since +the wheels are marked with only major.minor version numbers. It is ofen not +clear what constitues a "major" release verses a "minor" release, the release +manager can make that call. + After release, inevitably there are bug fixes. It is the responsibility of the commiter who fixes a bug to make sure this fix is on the release branch, so that we can then create a tagged bug-fix release, which will hopefully @@ -78,6 +84,8 @@ * Maybe bump the SOABI number in module/imp/importing. This has many implications, so make sure the PyPy community agrees to the change. + Wheels will use the major.minor release numbers in the name, so bump + them if there is an incompatible change to cpyext. * Update and write documentation diff -Nru pypy-7.1.1+dfsg/pypy/doc/index-of-release-notes.rst pypy-7.3.1+dfsg/pypy/doc/index-of-release-notes.rst --- pypy-7.1.1+dfsg/pypy/doc/index-of-release-notes.rst 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/doc/index-of-release-notes.rst 2020-04-10 19:28:40.000000000 +0000 @@ -6,6 +6,10 @@ .. toctree:: + release-v7.3.1.rst + release-v7.3.0.rst + release-v7.2.0.rst + release-v7.1.1.rst release-v7.1.0.rst release-v7.0.0.rst release-v6.0.0.rst diff -Nru pypy-7.1.1+dfsg/pypy/doc/index-of-whatsnew.rst pypy-7.3.1+dfsg/pypy/doc/index-of-whatsnew.rst --- pypy-7.1.1+dfsg/pypy/doc/index-of-whatsnew.rst 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/doc/index-of-whatsnew.rst 2020-04-10 19:28:40.000000000 +0000 @@ -7,6 +7,10 @@ .. toctree:: whatsnew-head.rst + whatsnew-pypy2-7.3.1.rst + whatsnew-pypy2-7.3.0.rst + whatsnew-pypy2-7.2.0.rst + whatsnew-pypy2-7.1.0.rst whatsnew-pypy2-7.0.0.rst whatsnew-pypy2-6.0.0.rst whatsnew-pypy2-5.10.0.rst @@ -36,13 +40,24 @@ whatsnew-1.9.rst +CPython 3.6 compatible versions +------------------------------- + +.. toctree:: + whatsnew-pypy3-head.rst + whatsnew-pypy3-7.3.1.rst + whatsnew-pypy3-7.3.0.rst + whatsnew-pypy3-7.2.0.rst + whatsnew-pypy3-7.1.0.rst + CPython 3.5 compatible versions ------------------------------- .. toctree:: - whatsnew-pypy3-head.rst whatsnew-pypy3-7.0.0.rst + whatsnew-pypy3-6.0.0.rst + whatsnew-pypy3-5.10.0.rst whatsnew-pypy3-5.9.0.rst whatsnew-pypy3-5.8.0.rst whatsnew-pypy3-5.7.0.rst @@ -55,10 +70,4 @@ whatsnew-pypy3-5.5.0.rst whatsnew-pypy3-5.1.1-alpha1.rst -CPython 3.2 compatible versions -------------------------------- - -.. toctree:: - whatsnew-pypy3-2.4.0.rst - whatsnew-pypy3-2.3.1.rst diff -Nru pypy-7.1.1+dfsg/pypy/doc/index.rst pypy-7.3.1+dfsg/pypy/doc/index.rst --- pypy-7.1.1+dfsg/pypy/doc/index.rst 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/doc/index.rst 2020-04-10 19:28:40.000000000 +0000 @@ -106,7 +106,7 @@ .. _here: https://quodlibet.duckdns.org/irc/pypy/latest.log.html#irc-end .. _Development mailing list: http://mail.python.org/mailman/listinfo/pypy-dev .. _Commit mailing list: http://mail.python.org/mailman/listinfo/pypy-commit -.. _Development bug/feature tracker: https://bitbucket.org/pypy/pypy/issues +.. _Development bug/feature tracker: https://foss.heptapod.net/pypy/pypy/issues Indices and tables diff -Nru pypy-7.1.1+dfsg/pypy/doc/install.rst pypy-7.3.1+dfsg/pypy/doc/install.rst --- pypy-7.1.1+dfsg/pypy/doc/install.rst 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/doc/install.rst 2020-04-10 19:28:40.000000000 +0000 @@ -63,11 +63,14 @@ .. code-block:: console $ ./pypy-xxx/bin/pypy -m ensurepip - $ ./pypy-xxx/bin/pip install -U pip wheel # to upgrade to the latest versions - $ ./pypy-xxx/bin/pip install pygments # for example + $ ./pypy-xxx/bin/pypy -mpip install -U pip wheel # to upgrade to the latest versions + $ ./pypy-xxx/bin/pypy -mpip install pygments # for example -Third party libraries will be installed in ``pypy-xxx/site-packages``, and -the scripts in ``pypy-xxx/bin``. +If you wish to be able to use ``pip`` directly from the command line, you must +use the ``--default-pip`` argument when calling ``ensurepip``. +Third party libraries will be installed in ``pypy-xxx/site-packages``. As with +CPython, scripts on linux and macOS will be in ``pypy-xxx/bin``, and on windows +they will be in ``pypy-xxx/Scripts`` Installing using virtualenv @@ -94,10 +97,10 @@ You should still upgrade pip and wheel to the latest versions via:: - $ my-pypy-env/bin/pip install -U pip wheel + $ my-pypy-env/bin/pypy -mpip install -U pip wheel .. _pip: http://pypi.python.org/pypi/pip -.. _ensurepip: https://docs.python.org/2.7/library/ensurepip.html +.. _ensurepip: https://docs.python.org/3/library/ensurepip.html Building PyPy yourself ~~~~~~~~~~~~~~~~~~~~~~ diff -Nru pypy-7.1.1+dfsg/pypy/doc/jit_help.rst pypy-7.3.1+dfsg/pypy/doc/jit_help.rst --- pypy-7.1.1+dfsg/pypy/doc/jit_help.rst 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/doc/jit_help.rst 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,78 @@ +======== +JIT help +======== + +.. note this is from ``pypy --jit help`` + +Advanced JIT options +==================== + +`` --jit`` [*options*] where *options* is a comma-separated list of +``OPTION=VALUE``: + + decay=N + amount to regularly decay counters by (0=none, 1000=max) (default 40) + + disable_unrolling=N + after how many operations we should not unroll (default 200) + + enable_opts=N + INTERNAL USE ONLY (MAY NOT WORK OR LEAD TO CRASHES): optimizations to + enable, or all = + intbounds:rewrite:virtualize:string:pure:earlyforce:heap:unroll (default + all) + + function_threshold=N + number of times a function must run for it to become traced from start + (default 1619) + + inlining=N + inline python functions or not (1/0) (default 1) + + loop_longevity=N + a parameter controlling how long loops will be kept before being freed, + an estimate (default 1000) + + max_retrace_guards=N + number of extra guards a retrace can cause (default 15) + + max_unroll_loops=N + number of extra unrollings a loop can cause (default 0) + + max_unroll_recursion=N + how many levels deep to unroll a recursive function (default 7) + + retrace_limit=N + how many times we can try retracing before giving up (default 0) + + threshold=N + number of times a loop has to run for it to become hot (default 1039) + + trace_eagerness=N + number of times a guard has to fail before we start compiling a bridge + (default 200) + + trace_limit=N + number of recorded operations before we abort tracing with ABORT_TOO_LONG + (default 6000) + + vec=N + turn on the vectorization optimization (vecopt). Supports x86 (SSE 4.1), + powerpc (SVX), s390x SIMD (default 0) + + vec_all=N + try to vectorize trace loops that occur outside of the numpypy library + (default 0) + + vec_cost=N + threshold for which traces to bail. Unpacking increases the counter, + vector operation decrease the cost (default 0) + + off + turn off the JIT + help + print this page + +The :ref:`pypyjit` module can be used to control the JIT from inside +pypy + diff -Nru pypy-7.1.1+dfsg/pypy/doc/man/pypy.1.rst pypy-7.3.1+dfsg/pypy/doc/man/pypy.1.rst --- pypy-7.1.1+dfsg/pypy/doc/man/pypy.1.rst 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/doc/man/pypy.1.rst 2020-04-10 19:28:40.000000000 +0000 @@ -129,7 +129,7 @@ .. include:: ../gc_info.rst - :start-line: 7 + :start-line: 305 SEE ALSO ======== diff -Nru pypy-7.1.1+dfsg/pypy/doc/mercurial_heptapod.rst pypy-7.3.1+dfsg/pypy/doc/mercurial_heptapod.rst --- pypy-7.1.1+dfsg/pypy/doc/mercurial_heptapod.rst 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/doc/mercurial_heptapod.rst 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,357 @@ +Mercurial and Heptapod short tutorial +===================================== + +.. comment + Taken from https://foss.heptapod.net/fluiddyn/fluiddyn/blob/branch/default/doc/mercurial_heptapod.rst + and modified + + +`Mercurial `_ is a free, distributed source +control management tool. We use it for PyPy, not only because it is written in +Python, but because its branch model fits our development process better than +Git's branch model. + +Mercurial couples very well with the programs `TortoiseHG +`__ and `Meld `__ (if +you can, just install them, especially Meld). + +There are a lot of tutorials and documentations about Mercurial (for example +`the official Mercurial tutorial +`_). This page is meant to show you +what you need to get going with PyPy development. + +`Heptapod `_ is a friendly fork of GitLab Community +Edition supporting Mercurial. + +Installation +------------ + +With TortoiseHG (simple for Windows) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Download the installer from https://tortoisehg.bitbucket.io/. +(but note you might need the evolve extension) + +With conda (cross-platform, recommended for Linux and macOS) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +On Windows, macOS and Linux, one can use ``conda`` (installed with `miniconda +`__) to install Mercurial with +few extensions (`hg-evolve `_ and `hg-git +`_). On Windows, these commands have to be run in the +Anaconda Prompt. First, we need to install `conda-app +`_ in the base conda environment:: + + conda activate base + python -mpip install conda-app + +Then, with the conda-forge channel added (``conda config --add channels +conda-forge``), one just needs to run:: + + conda-app install mercurial + +**Open a new terminal** and the Mercurial command ``hg`` should be available. + +.. note :: + + If you don't use TortoiseHG, you should really install the visual diff and + merge tool `Meld `__! + +Set-up Mercurial +---------------- + +You need to create a file ``~/.hgrc``. For a good starting point, you can use +the command:: + + hg config --edit + +An example of configuration file:: + + [ui] + username=myusername + editor=emacs -nw + tweakdefaults = True + + [extensions] + hgext.extdiff = + # only to use Mercurial with GitHub and Gitlab + hggit = + # more advanced extensions (really useful for PyPy dev) + churn = + shelve = + rebase = + absorb = + evolve = + topic = + + [extdiff] + cmd.meld = + +The line starting with hggit is optional and enables the extension `hg-git +`_. This extension is useful to work on projects +using Git, for example hosted on Github and Gitlab. + +The extensions churn, shelve, rebase, absorb, evolve and topic are very useful +for more advanced users. Note that `evolve +`_ and `topic`_ +comes from the package `hg-evolve `_. + +.. note :: + + For occasional contribution to PyPy, the evolve and topic extensions have to + be installed and activated since we use topic_ branches for short-term + development + +Get help +-------- + +To get help on Mercurial, one can start with:: + + hg help + +or for a specific command (here ``clone``):: + + hg help clone + +Simple workflow +--------------- + +To make a copy of an existing repository:: + + hg clone https://foss.heptapod.net/pypy/pypy + +To get a summary of the working directory state:: + + hg summary + +or just ``hg sum``. + +Before you begin work, open a new topic branch:: + + hg topic my_branch + +To show changed files in the working directory:: + + hg status + +or just ``hg st``. + +If you add new files or if you deleted files:: + + hg add name_of_the_file + + hg remove name_of_the_file + +Each time you do some consistent changes:: + + hg commit -m "A message explaining the commit" + +After a commit command ``hg st`` to check that you did +what you wanted to do. If you are unhappy with the commit, you can amend it +with another commit with:: + + hg commit --amend + +To push the state of your working repository to your repository on the web:: + + hg push + +The inverse command (pull all commits from the remote repository) is:: + + hg pull + +Get the last version of a code +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +First pull all the changesets from the remote repository:: + + hg pull + +Then update the code to the tip:: + + hg update + +or just ``hg up``. You can also directly do:: + + hg pull -u + +Read the history +^^^^^^^^^^^^^^^^ + +You can get a list of the changesets with:: + + hg log --graph + +or just ``hg log -G``. With the ``--graph`` or ``-G`` option, the revisions are +shown as an ASCII art. + +Update the code to an old revision +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Use ``hg up 220`` to update to the revision 220. We can use a tag, bookmark, +topic name or branch name instead of a number. To get a clean copy, add the +option ``-C`` (beware). + + +Create a repository from a directory +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Create a new repository in the given directory by doing:: + + hg init + +Merge-Request based workflow with hg-evolve +------------------------------------------- + +We now use a Merge-Request (MR) based workflow + +.. note :: + + GitLab's "merge requests" are equivalent to GitHub's "pull requests". + +.. note :: + + In contrast to the standard workflow in Github, Gitlab and Bitbucket, you + don't need to fork the repository to create Merge Requests. + +Instead, you need to become a "developer" of the project. The developers have +the permission to push changesets (i.e. "commits") in a topic in the main +repository (for example https://foss.heptapod.net/pypy/pypy). To +acquire the "developer" role, please send a message in an issue_ or if needed, +create a dedicated issue. + +.. _issue: https://foss.heptapod.net/pypy/pypy/issues + +`Topics `_ are used in Mercurial for "lightweight branches" (like Git branches). +The principle is that you first create a topic (with ``hg topic``). Once a +topic is activated, the changesets created belong to this topic. The new +changesets gathered in a topic can be pushed in the main repository. Even after +having been pushed to the main repository, they stay in the ``draft`` phase +(which means they can be modified, as opposed to ``public`` changesets. Run +``hg help phases`` for more info). + +To list the topics:: + + hg topic + +To activate a topic already created:: + + hg up the_name_of_the_topic + +To deactivate the topic and come back to the tip of the default branch:: + + hg up default + +To get the list of the changesets in the active topic (very useful):: + + hg stack + +Developers have to create Merge Requests (MR) to get things merged in the +targeted branch (at the time of writing: ``default`` for Python2.7 or RPython +changes, ``py3.6`` for Python 3.6, ``py3.7`` for Python 3.7). Let's present +an example. A developer can do (here, we use ssh but you can also use https):: + + hg clone ssh://hg@foss.heptapod.net/pypy/pypy + hg up default + hg topic fix_something + hg commit -m "Fix a bug related to ..." + hg push + +Mercurial is going to print an URL to create the associated MR. Once created, +the MR should then be reviewed by a contributor with the "maintainer" or higher +role. Only maintainers have the permissions to merge a MR, i.e. to publish +changesets. The maintainer can tell you how to modify your MR and can also +directly modify the changesets of the MR. + +We strongly advice to install and activate the `evolve +`_, rebase and `absorb +`_ +extensions locally (see the example of ``.hgrc`` above). This gives a very nice +user experience for the MRs, with the ability to modify a MR with ``hg absorb`` +and safe history editing. + +.. tip :: + + ``hg absorb`` is very useful during code review. Let say that a developer + submitted a MR containing few commits. As explained in `this blog post + `_, + ``hg absorb`` is a mechanism to automatically and intelligently incorporate + uncommitted changes into prior commits. Edit the files to take into account + the remarks of the code review and just run:: + + hg absorb + hg push + + and the MR is updated! + +.. tip :: + + If you are asked to "rebase" your MR, it should work with the following commands:: + + hg pull + hg up name_of_my_topic + hg rebase + hg push + +Working with hggit and Github +----------------------------- + +To clone a **git** repository using **hg**:: + + hg clone git+ssh://git@github.com/numpy/numpy + +or just:: + + hg clone https://github.com/numpy/numpy + +Git *branches* are represented as Mercurial *bookmarks* so such commands can be +useful:: + + hg log --graph + + hg up master + + hg help bookmarks + + # list the bookmarks + hg bookmarks + + # put the bookmark master where you are + hg book master + + # deactivate the active bookmark (-i like --inactive) + hg book -i + +.. note :: + + ``bookmarks``, ``bookmark`` and ``book`` correspond to the same + mercurial command. + +.. warning :: + + If a bookmark is active, ``hg pull -u`` or ``hg up`` will move the bookmark + to the tip of the active branch. You may not want that so it is important to + always deactivate an unused bookmark with ``hg book -i`` or with ``hg up + master``. + +Do not forget to place the bookmark ``master`` as wanted. + +Delete a bookmark in a remote repository (close a remote Git branch) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +With Mercurial, `we can +do `_:: + + hg bookmark --delete + hg push --bookmark + +Unfortunately, it does not work for a remote Git repository (with hg-git). We +have to use a Git client, clone the repository with Git and do `something like +`_:: + + # this deletes the branch locally + git branch --delete + # this deletes the branch in the remote repository + git push origin --delete + +.. _topic: https://www.mercurial-scm.org/doc/evolution/tutorials/topic-tutorial.html diff -Nru pypy-7.1.1+dfsg/pypy/doc/__pypy__-module.rst pypy-7.3.1+dfsg/pypy/doc/__pypy__-module.rst --- pypy-7.1.1+dfsg/pypy/doc/__pypy__-module.rst 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/doc/__pypy__-module.rst 2020-04-10 19:28:40.000000000 +0000 @@ -22,16 +22,17 @@ It works like a simplified array of characters (actually, depending on the configuration the ``array`` module internally uses this). - - ``attach_gdb()``: start a GDB at the interpreter-level (or a PDB before translation). + - ``attach_gdb()``: start a GDB at the interpreter-level (or a PDB before + translation). - - ``newmemoryview(buffer, itemsize, format, shape=None, strides=None)``: - create a `memoryview` instance with the data from ``buffer`` and the - specified itemsize, format, and optional shape and strides. - - - ``bufferable``: a base class that provides a ``__buffer__(self, flags)`` - method for subclasses to override. This method should return a memoryview - instance of the class instance. It is called by the C-API's ``tp_as_buffer. - bf_getbuffer``. + - ``newmemoryview(buffer, itemsize, format, shape=None, strides=None)``: + create a `memoryview` instance with the data from ``buffer`` and the + specified itemsize, format, and optional shape and strides. + + - ``bufferable``: a base class that provides a ``__buffer__(self, flags)`` + method for subclasses to override. This method should return a memoryview + instance of the class instance. It is called by the C-API's ``tp_as_buffer. + bf_getbuffer``. - ``builtinify(func)``: To implement at app-level modules that are, in CPython, implemented in C: this decorator protects a function from being ever bound @@ -47,7 +48,7 @@ - ``lookup_special(obj, meth)``: Lookup up a special method on an object. - ``do_what_I_mean`` - - ``resizelist_hint(...)``: Reallocate the underlying storage of the argument + - ``resizelist_hint(sizehint)`` Reallocate the underlying storage of the argument list to sizehint - ``newlist_hint(...)``: Create a new empty list that has an underlying @@ -116,6 +117,11 @@ - ``stack_almost_full``: Return True if the stack is more than 15/16th full. - ``pyos_inputhook``: Call PyOS_InputHook() from the CPython C API + - ``get_console_cp()``: (Windows-only) Return the console and console output + code pages. Equivalent to calling ``GetConsoleCP`` and + ``GetConsoleOuputCP``. + - ``utf8content(u)``: Given a unicode string u, return it's internal byte + representation. Useful for debugging only. - ``os.real_getenv(...)`` gets OS environment variables skipping python code - ``_pypydatetime`` provides base classes with correct C API interactions for the pure-python ``datetime`` stdlib module diff -Nru pypy-7.1.1+dfsg/pypy/doc/release-v7.1.1.rst pypy-7.3.1+dfsg/pypy/doc/release-v7.1.1.rst --- pypy-7.1.1+dfsg/pypy/doc/release-v7.1.1.rst 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/doc/release-v7.1.1.rst 2020-04-10 19:28:40.000000000 +0000 @@ -68,10 +68,14 @@ Changelog ========= -Changes shared across versions -* improve performance of ``u''.append`` +Changes shared across versions: + +* Improve performance of ``u''.append`` + * Prevent a crash in ``zlib`` when flushing a closed stream -* Fix a few corener cases when encountering unicode values above 0x110000 + +* Fix a few corner cases when encountering unicode values above 0x110000 + * Teach the JIT how to handle very large constant lists, sets, or dicts * Fix building on ARM32 (issue 2984_) * Fix a bug in register assignment in ARM32 @@ -81,9 +85,9 @@ * Fix memoryviews of ctype structures with padding, (cpython issue 32780_) * CFFI updated to as-yet-unreleased 1.12.3 -Python 3.6 only +Python 3.6 only: -* On win32, override some ``errno.E*`` values that were added to MSVC in v2010 +* Override some ``errno.E*`` values that were added to MSVC in v2010 so that ``errno.E* == errno.WSAE*`` as in CPython * Do the same optimization that CPython does for ``(1, 2, 3, *a)`` (but at the AST level) @@ -91,8 +95,11 @@ * Raise a ``TypeError`` when using buffers and unicode such as ``''.strip(buffer)`` and ``'a' < buffer`` * Support ``_overlapped`` and asyncio on win32 +* Fix an issue where ``''.join(list_of_strings)`` would rarely confuse utf8 and + bytes (issue 2997_) .. _2984: https://bitbucket.org/pypy/pypy/issues/2984 .. _2991: https://bitbucket.org/pypy/pypy/issues/2991 .. _2988: https://bitbucket.org/pypy/pypy/issues/2988 +.. _2997: https://bitbucket.org/pypy/pypy/issues/2997 .. _32780: https://bugs.python.org/issue32780 diff -Nru pypy-7.1.1+dfsg/pypy/doc/release-v7.2.0.rst pypy-7.3.1+dfsg/pypy/doc/release-v7.2.0.rst --- pypy-7.1.1+dfsg/pypy/doc/release-v7.2.0.rst 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/doc/release-v7.2.0.rst 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,347 @@ +==================================== +PyPy v7.2.0: release of 2.7, and 3.6 +==================================== + +The PyPy team is proud to release the version 7.2.0 of PyPy, which includes +two different interpreters: + + - PyPy2.7, which is an interpreter supporting the syntax and the features of + Python 2.7 including the stdlib for CPython 2.7.13 + + - PyPy3.6: which is an interpreter supporting the syntax and the features of + Python 3.6, including the stdlib for CPython 3.6.9. + +The interpreters are based on much the same codebase, thus the double +release. + +With the support of Arm Holdings Ltd. and `Crossbar.io`_, this release supports +the 64-bit ``aarch64`` ARM architecture. More about the work and the +performance data around this welcome development can be found in the `blog +post`_. + +This release removes the "beta" tag from PyPy3.6. While there may still be some +small corner-case incompatibilities (around the exact error messages in +exceptions and the handling of faulty codec errorhandlers) we are happy with +the quality of the 3.6 series and are looking forward to working on a Python +3.7 interpreter. + +We updated our benchmark runner at https://speed.pypy.org to a more modern +machine and updated the baseline python to CPython 2.7.11. Thanks to `Baroque +Software`_ for maintaining the benchmark runner. + +The CFFI-based ``_ssl`` module was backported to PyPy2.7 and updated to use +cryptography_ version 2.7. Additionally the ``_hashlib``, and ``crypt`` (or +``_crypt`` on Python3) modules were converted to CFFI. This has two +consequences. End users and packagers can more easily update these libraries +for their platform by executing ``(cd lib_pypy; ../bin/pypy _*_build.py)``. +More significantly, since PyPy itself links to fewer system shared objects +(DLLs), on platforms with a single runtime namespace like linux different CFFI +and c-extension modules can load different versions of the same shared object +into PyPy without collision (`issue 2617`_). + +Until downstream providers begin to distribute c-extension builds with PyPy, we +have made packages for some common packages `available as wheels`_. + +The `CFFI`_ backend has been updated to version 1.13.0. We recommend using CFFI +rather than c-extensions to interact with C, and `cppyy`_ for interacting with +C++ code. + +Thanks to Anvil_, we revived the `PyPy Sandbox`_, which allows total control +over a python interpreter's interactions with the external world. + +We implemented a new JSON decoder that is much faster, uses less memory, and +uses a JIT-friendly specialized dictionary. + +As always, this release is 100% compatible with the previous one and fixed +several issues and bugs raised by the growing community of PyPy users. +We strongly recommend updating. Many of the fixes are the direct result of +end-user bug reports, so please continue reporting issues as they crop up. + +You can download the v7.2 releases here: + + http://pypy.org/download.html + +We would like to thank our donors for the continued support of the PyPy +project. If PyPy is not quite good enough for your needs, we are available for +direct consulting work. + +We would also like to thank our contributors and encourage new people to join +the project. PyPy has many layers and we need help with all of them: `PyPy`_ +and `RPython`_ documentation improvements, tweaking popular modules to run +on pypy, or general `help`_ with making RPython's JIT even better. Since the +previous release, we have accepted contributions from 27 new contributors, +thanks for pitching in. + +.. _`PyPy`: index.html +.. _`RPython`: https://rpython.readthedocs.org +.. _`help`: project-ideas.html +.. _`CFFI`: http://cffi.readthedocs.io +.. _`cppyy`: https://cppyy.readthedocs.io +.. _`available as wheels`: https://github.com/antocuni/pypy-wheels +.. _`Baroque Software`: https://baroquesoftware.com +.. _Anvil: https://anvil.works +.. _`PyPy Sandbox`: https://morepypy.blogspot.com/2019/08 +.. _`Crossbar.io`: https://crossbario.com +.. _`blog post`: https://morepypy.blogspot.com/2019/07/pypy-jit-for-aarch64.html +.. _cryptography: https://cryptography.io/en/latest + +What is PyPy? +============= + +PyPy is a very compliant Python interpreter, almost a drop-in replacement for +CPython 2.7, 3.6. It's fast (`PyPy and CPython 2.7.x`_ performance +comparison) due to its integrated tracing JIT compiler. + +We also welcome developers of other `dynamic languages`_ to see what RPython +can do for them. + +This PyPy release supports: + + * **x86** machines on most common operating systems + (Linux 32/64 bits, Mac OS X 64 bits, Windows 32 bits, OpenBSD, FreeBSD) + + * big- and little-endian variants of **PPC64** running Linux, + + * **s390x** running Linux + + * 64-bit **ARM** machines running Linux. + +Unfortunately at the moment of writing our ARM buildbots are out of service, +so for now we are **not** releasing any binary for the ARM architecture (32 +bit), although PyPy does support ARM 32 bit processors. + +.. _`PyPy and CPython 2.7.x`: http://speed.pypy.org +.. _`dynamic languages`: http://rpython.readthedocs.io/en/latest/examples.html + + +Changelog +========= + +Changes released in v7.1.1 +-------------------------- + +* Improve performance of ``u''.append`` +* Prevent a crash in ``zlib`` when flushing a closed stream +* Fix a few corner cases when encountering unicode values above 0x110000 +* Teach the JIT how to handle very large constant lists, sets, or dicts +* Fix building on ARM32 (`issue 2984`_) +* Fix a bug in register assignment in ARM32 +* Package windows DLLs needed by cffi modules next to the cffi c-extensions + (`issue 2988`_) +* Cleanup and refactor JIT code to remove ``rpython.jit.metainterp.typesystem`` +* Fix memoryviews of ctype structures with padding, (CPython issue 32780_) + +Changes to Python 3.6 released in v7.1.1 +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +* On win32, override some ``errno.E*`` values that were added to MSVC in v2010 + so that ``errno.E* == errno.WSAE*`` as in CPython +* Do the same optimization that CPython does for ``(1, 2, 3, *a)`` (but at the + AST level) +* Raise a ``TypeError`` when using buffers and unicode such as ``''.strip(buffer)`` + and ``'a' < buffer`` +* Support ``_overlapped`` and asyncio on win32 +* Fix an issue where ``''.join(list_of_strings)`` would rarely confuse utf8 and + bytes (`issue 2997`_) +* Fix ``io.IncrementalNewlineDecoder`` interaction with ``\r`` (`issue 3012`_) + +Changes shared across versions +------------------------------ + +* Update ``cffi`` to 1.13.0 +* Add support for ARM aarch64 +* Many internal changes to the utf-8 processing code, since now unicode strings + are stored internally as utf-8. A few corner cases were fixed, and performance + bottlenecks were improved. Specifically, issues were fixed with ``maketrans``, + ``strip``, comparison with ``bytearray``, use in ``array.array``, ``join``, + ``translate``, forrmatting, ``__int__``, ``str()``, ``startswith``, + ``endswith``, +* Reduce the probability of a deadlock when acquiring a semaphore by + moving global state changes closer to the actual aquire (`issue 2953`_) +* Cleanup and refactor parts of the JIT code +* Cleanup ``optimizeopt`` +* Support the ``z15`` variant of the ``s390x`` CPU. +* Fixes to ``_ctypes`` handling of memoryviews +* Fix a shadowstack overflow when using ``sys.setrecursionlimit`` (`issue 2722`) +* Fix a bug that prevent memory-tracking in vmprof working on PyPy +* Improve the speed and memory use of the ``_pypyjson`` JSON decoder. The + resulting dictionaries that come out of the JSON decoder have faster lookups too +* ``struct.unpack`` of a sliced ``bytearray`` exposed a subtle bug where the + JIT's ``gc_load`` family of calls must force some lazy code (`issue 3014`_) +* Remove ``copystrcontent`` and ``copyunicodecontent`` in the backends. + Instead, replace it in ``rewrite.py`` with a direct call to ``memcpy()`` and + a new basic operation, ``load_effective_address``, which the backend can + even decide not to implement. +* Allow 2d indexing in ``memoryview.__setitem__`` (`issue 3028`_) +* Speed up 'bytearray += bytes' and other similar combinations +* Compute the greatest common divisor of two RPython ``rbigint`` instances + using `Lehmer's algorithm`_ and use it in the ``math`` module +* Add ``RFile.closed`` to mirror standard `file` behaviour +* Add a ``-D`` pytest option to run tests directly on the host python without + any knowlege of PyPy internals. This allows using ``pypy3 pytest.py ...`` + for a subset of tests (called **app-level testing**) +* Accept arguments to ``subprocess.Popen`` that are not directly subscriptable + (like iterators) (`issue 3050`_) +* Catch more low-level ``SocketError`` exceptions and turn them into app-level + exceptions (`issue 3049`_) +* Fix formatting of a ``memoryview``: ``b"<%s>" % memoryview(b"X")`` +* Correctly wrap the I/O errors we can get when importing modules +* Fix bad output from JSON with ``'skipkeys=True'`` (`issue 3052`_) +* Fix compatibility with latest virtualenv HEAD +* Avoid ``RuntimeError`` in ``repr()`` of recursive ``dictviews`` (CPython + issue 18533_) +* Fix for printing after ``gc.get_objects()`` (`issue 2979`) +* Optimize many fast-paths through utf-8 code when we know it is ascii or no + surroagates are present +* Check for a rare case of someone shrinking a buffer from another thread + while using it in a ``read()`` variant. One of the issues discovered when + reviewing the code for the sandbox. +* Prevent segfault when slicing ``array.array`` with a large step size +* Support building ``ncurses`` on Suse Linux +* Update statically-linked ``_ssl`` OpenSSL to 1.1.0c on ``darwin`` +* Optimize ``W_TextIOWrapper._readline`` and ``ByteBuffer.getslice`` +* Fix possible race condition in threading ``Lock.release()`` (`issue 3072`_) +* Make ``CDLL(None)`` on win32 raise ``TypeError`` +* Change ``sys.getfilesystemcodeerors()`` to ``'strict'`` on win32 +* Update vendored version of ``pycparser`` to version 2.19 +* Implement a much faster JSON decoder (3x speedup for large json files, 2x less memory) + +C-API (cpyext) and c-extensions +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +* Add ``DateTime_FromTimestamp`` and ``Date_FromTimestamp`` to the + ``PyDateTime_CAPI`` struct + +* Add constants and macros needed to build opencv2_ with PyPy2.7 +* Add more constants to `sysconfig``. Set ``MACOSX_DEPLOYMENT_TARGET`` for + darwin (`issue 2994`_) +* fix ``CBuffer.buffer_attach`` +* Add ``_PyDict_GetItemWithError`` (``PyDict_GetItemWithError`` on Python3) + +Python 3.6 only +--------------- + +* Accept ``a, b = (*x, 2)`` (`issue 2995`_) +* Class methods with the signature ``def meth(*args, **kwargs)`` were not adding + an implied ``self`` argument (`issue 2996`_) +* Fix handling of ``__fpath__`` (`issue 2985`_) +* Disable ``assert`` when run with ``-O`` (`issue 3000`_) +* ``codecs.encode``, ``codecs.decode`` can behave differently than + ``ustr.encode``, ``bytes.decode`` (`issue 3001`_) +* Putting ``pdb.set_trace`` call in a threaded program did not work (`issue + 3003`_) +* Fix parsing for converting strings with underscore into ints +* Add ``memoryview.obj`` which stores a reference, (`issue 3016`_) +* Fix datetime.fromtimestamp for win32 (CPython issue 29097_) +* Improve multiprocessing support on win32 +* Support negative offsets in ``lnotab`` (`issue 2943`_) +* Fix leak of file descriptor with `_io.FileIO('dir/')` +* Fix ``float.__round__(None)`` (`issue 3033`_) +* Fix for when we should use the Universal Newline mode on Windows for + stdin/stdout/stderr (`issue 3007`_) +* Fix ImportError invalid arguments error wording +* Ignore GeneratorExit when throwing into the aclose coroutine of an + asynchronous generator (CPython issue 35409_) +* Improve the pure-python ``faulthander`` module +* Properly raise an exception when a ``BlockingIOError`` exception escapes + from ``W_BufferedReader.readline_w()`` (`issue 3042`_) +* Fix a code path only used in ``zipimport`` (`issue 3034`_) +* Update the stdlib to 3.6.9, fix many failing tests +* Fix handling of ``__debug__``, ``-O``, and ``sys.flags.optimizeOptimize`` + (CPython issue 27169_) +* Fix raising ``SystemExit`` in ``atexit`` +* Fix case where ``int()`` would go into infinite recursion +* Don't ignore fold parameter in ``(date,)time.replace()`` +* Fix logic bug for ``memoryview.cast`` (when ``view.format`` is not ``'B'``) +* Implement retry-on-EINTR in fcntl module (CPython issue 35189_) +* Fix handling of 1st argument to ``hashlib.blake2{b,s}()`` (CPython issue + 33729_) +* Prevent overflow in ``_hashlib`` ``digest()`` (CPython issue 34922_) +* ``IOBase.readlines()`` relies on the iterator protocol instead of calling + ``readline()`` directly +* Don't inherit ``IS_ABSTRACT`` flag in classes +* Reset raw_pos after unwinding the raw stream (CPython issue 32228_) +* Add existing options ``-b`` and ``-d`` to ``pypy3 --help`` text +* Clean up ``_codecs`` error handling code +* Add support for using stdlib as a zipfile +* Check return type of ``__prepare__()`` (CPython issue 31588_) +* Fix logic in ``_curses.get_wch`` (`issue 3064`_) +* Match CPython exit code when failing to flush stdout/stderr at exit +* Improve SyntaxError message output +* Add ``range.__bool__`` +* Add cursor validity check to ``_sqlite.Cursor.close`` +* Improve message when mistakenly using ``print something`` in Python3 +* Handle generator exit in ``athrow()`` (CPython issue 33786_) +* Support unmarshalling ``TYPE_INT64`` and turn ``OverflowErrors`` from + ``marshal.loads`` into ``ValueErrors`` +* Update ``_posixsubprocess.c`` to match CPython (CPython issue 32270_) +* Remove unused ``_posixsubprocess.cloexec_pipe()`` +* Add missing constants to ``stat`` and ``kill _stat`` (`issue 3073`_) +* Fix argument handling in ``select.poll().poll()`` +* Raise ``SyntaxError`` instead of ``DeprecationWarning`` when treating invalid + escapes in bytes as errors (CPython issue 28691_) +* Handle locale in `time.strftime()`. (`issue 3079`_) +* Fix an issue when calling ``PyFrame.fset_f_lineno`` (`issue 3066`_) + +Python 3.6 c-API +~~~~~~~~~~~~~~~~ + +* Add ``PyStructSequence_InitType2``, ``Py_RETURN_NOTIMPLEMENTED``, + ``PyGILState_Check``, ``PyUnicode_AsUCS4``, ``PyUnicode_AsUCS4Copy``, + ``PyErr_SetFromWindowsErr``, +* Sync the various ``Py**Flag`` constants with CPython +* Allow ``PyTypeObject`` with ``tp_doc==""`` (`issue 3055`_) +* Update ``pymacro.h`` to match CPython 3.6.9 +* Support more datetime C functions and definitions + +.. _`Lehmer's algorithm`: https://en.wikipedia.org/wiki/Lehmer's_GCD_algorithm +.. _29097: https://bugs.python.org/issue29097 +.. _32780: https://bugs.python.org/issue32780 +.. _35409 : https://bugs.python.org/issue35409 +.. _27169 : https://bugs.python.org/issue27169 +.. _18533 : https://bugs.python.org/issue18533 +.. _35189 : https://bugs.python.org/issue35189 +.. _33279 : https://bugs.python.org/issue33279 +.. _34922 : https://bugs.python.org/issue34922 +.. _32228 : https://bugs.python.org/issue32228 +.. _31588 : https://bugs.python.org/issue31588 +.. _33786 : https://bugs.python.org/issue33786 +.. _32270 : https://bugs.python.org/issue32270 +.. _28691 : https://bugs.python.org/issue28691 +.. _33729 : https://bugs.python.org/issue33729 + +.. _opencv2: https://github.com/skvark/opencv-python/ +.. _`issue 2617`: https://bitbucket.com/pypy/pypy/issues/2617 +.. _`issue 2722`: https://bitbucket.com/pypy/pypy/issues/2722 +.. _`issue 2953`: https://bitbucket.com/pypy/pypy/issues/2953 +.. _`issue 2943`: https://bitbucket.com/pypy/pypy/issues/2943 +.. _`issue 2980`: https://bitbucket.com/pypy/pypy/issues/2980 +.. _`issue 2984`: https://bitbucket.com/pypy/pypy/issues/2984 +.. _`issue 2994`: https://bitbucket.com/pypy/pypy/issues/2994 +.. _`issue 2995`: https://bitbucket.com/pypy/pypy/issues/2995 +.. _`issue 2996`: https://bitbucket.com/pypy/pypy/issues/2995 +.. _`issue 2997`: https://bitbucket.com/pypy/pypy/issues/2995 +.. _`issue 2988`: https://bitbucket.com/pypy/pypy/issues/2988 +.. _`issue 2985`: https://bitbucket.com/pypy/pypy/issues/2985 +.. _`issue 2986`: https://bitbucket.com/pypy/pypy/issues/2986 +.. _`issue 3000`: https://bitbucket.com/pypy/pypy/issues/3000 +.. _`issue 3001`: https://bitbucket.com/pypy/pypy/issues/3001 +.. _`issue 3003`: https://bitbucket.com/pypy/pypy/issues/3003 +.. _`issue 3007`: https://bitbucket.com/pypy/pypy/issues/3007 +.. _`issue 3012`: https://bitbucket.com/pypy/pypy/issues/3012 +.. _`issue 3014`: https://bitbucket.com/pypy/pypy/issues/3014 +.. _`issue 3016`: https://bitbucket.com/pypy/pypy/issues/3016 +.. _`issue 3028`: https://bitbucket.com/pypy/pypy/issues/3028 +.. _`issue 3033`: https://bitbucket.com/pypy/pypy/issues/3033 +.. _`issue 3034`: https://bitbucket.com/pypy/pypy/issues/3034 +.. _`issue 3042`: https://bitbucket.com/pypy/pypy/issues/3042 +.. _`issue 3049`: https://bitbucket.com/pypy/pypy/issues/3049 +.. _`issue 3050`: https://bitbucket.com/pypy/pypy/issues/3050 +.. _`issue 3052`: https://bitbucket.com/pypy/pypy/issues/3052 +.. _`issue 3055`: https://bitbucket.com/pypy/pypy/issues/3055 +.. _`issue 2979`: https://bitbucket.com/pypy/pypy/issues/2979 +.. _`issue 3064`: https://bitbucket.com/pypy/pypy/issues/3064 +.. _`issue 3072`: https://bitbucket.com/pypy/pypy/issues/3072 +.. _`issue 3073`: https://bitbucket.com/pypy/pypy/issues/3073 +.. _`issue 3079`: https://bitbucket.com/pypy/pypy/issues/3079 +.. _`issue 3066`: https://bitbucket.com/pypy/pypy/issues/3066 diff -Nru pypy-7.1.1+dfsg/pypy/doc/release-v7.3.0.rst pypy-7.3.1+dfsg/pypy/doc/release-v7.3.0.rst --- pypy-7.1.1+dfsg/pypy/doc/release-v7.3.0.rst 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/doc/release-v7.3.0.rst 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,250 @@ +==================================== +PyPy v7.3.0: release of 2.7, and 3.6 +==================================== + +The PyPy team is proud to release the version 7.3.0 of PyPy, which includes +two different interpreters: + + - PyPy2.7, which is an interpreter supporting the syntax and the features of + Python 2.7 including the stdlib for CPython 2.7.13 + + - PyPy3.6: which is an interpreter supporting the syntax and the features of + Python 3.6, including the stdlib for CPython 3.6.9. + +The interpreters are based on much the same codebase, thus the double +release. + +We have worked with the python packaging group to support tooling around +building third party packages for python, so this release changes the ABI tag +for PyPy. + +Based on the great work done in `portable-pypy`_, the linux x86 downloads we +provide are now built on top of the `manylinux2010`_ CentOS6 docker image. +The tarballs include the needed shared objects to run on any platform that +supports manylinux2010 wheels, which should include all supported versions of +debian- and RedHat-based distributions (including Ubuntu, CentOS, and Fedora). + +The `CFFI`_ backend has been updated to version 1.13.1. We recommend using CFFI +rather than c-extensions to interact with C. + +The built-in ``_cppyy`` module was upgraded to 1.10.6, which +provides, among others, better template resolution, stricter ``enum`` handling, +anonymous struct/unions, cmake fragments for distribution, optimizations for +PODs, and faster wrapper calls. We reccomend using cppyy_ for performant +wrapping of C++ code for Python. + +The vendored pyrepl package for interaction inside the REPL was updated. + +Support for codepage encoding and decoding was added for Windows. + +As always, this release fixed several issues and bugs raised by the growing +community of PyPy users. We strongly recommend updating. Many of the fixes are +the direct result of end-user bug reports, so please continue reporting issues +as they crop up. + +You can download the v7.3 releases here: + + http://pypy.org/download.html + +We would like to thank our donors for the continued support of the PyPy +project. If PyPy is not quite good enough for your needs, we are available for +direct consulting work. + +We would also like to thank our contributors and encourage new people to join +the project. PyPy has many layers and we need help with all of them: `PyPy`_ +and `RPython`_ documentation improvements, tweaking popular modules to run +on pypy, or general `help`_ with making RPython's JIT even better. Since the +previous release, we have accepted contributions from 3 new contributors, +thanks for pitching in. + +If you are a python library maintainer and use c-extensions, please consider +making a cffi / cppyy version of your library that would be performant on PyPy. +If you are stuck with using the C-API, you can use `docker images`_ with PyPy +built in or the `multibuild system`_ to build wheels. + +.. _`PyPy`: index.html +.. _`RPython`: https://rpython.readthedocs.org +.. _`help`: project-ideas.html +.. _`CFFI`: http://cffi.readthedocs.io +.. _`cppyy`: https://cppyy.readthedocs.io +.. _`available as wheels`: https://github.com/antocuni/pypy-wheels +.. _`portable-pypy`: https://github.com/squeaky-pl/portable-pypy +.. _`docker images`: https://github.com/pypy/manylinux +.. _`multibuild system`: https://github.com/matthew-brett/multibuild + +What is PyPy? +============= + +PyPy is a very compliant Python interpreter, almost a drop-in replacement for +CPython 2.7, 3.6. It's fast (`PyPy and CPython 2.7.x`_ performance +comparison) due to its integrated tracing JIT compiler. + +We also welcome developers of other `dynamic languages`_ to see what RPython +can do for them. + +This PyPy release supports: + + * **x86** machines on most common operating systems + (Linux 32/64 bits, Mac OS X 64 bits, Windows 32 bits, OpenBSD, FreeBSD) + + * big- and little-endian variants of **PPC64** running Linux, + + * **s390x** running Linux + + * 64-bit **ARM** machines running Linux. + +Unfortunately at the moment of writing our ARM buildbots are out of service, +so for now we are **not** releasing any binary for the ARM architecture (32 +bit), although PyPy does support ARM 32 bit processors. + +.. _`PyPy and CPython 2.7.x`: http://speed.pypy.org +.. _`dynamic languages`: http://rpython.readthedocs.io/en/latest/examples.html + + +Changelog +========= + +Changes shared across versions +------------------------------ + +* Fix segfault when calling descr-methods with no arguments +* Change the SOABI and subsequently change the reported ABI tag. +* Update the builtin ``_cppyy`` backend to 1.10.6 +* Performance improvements in string/unicode handling +* Fix compilation error when building `revdb`_ (`issue 3084`_, actually + released in PyPy 7.2 but not mentioned in the release notes) +* Add JIT options to documentation and an option for JIT help via ``pypy --jit + help`` +* Fix regex escapes in pyrepl (`issue 3097`_) +* Allow reloading of subclasses of module (`issue 3099`_) +* Work around a gcc bug, which was reported to them and fixed (`issue 3086`_) +* Fix (again) faulty logic when decoding invalid UTF-8 (`issue 2389`_) +* Fix up LICENSE file +* Turn all ``http`` links in the documentation to ``https`` +* Update the bndled pip and setuptools (used in ``pypy -mensurepip`` to version + that support manylinux2010 wheels +* Link the ``DEFAULT_SOABI`` to the ``PYPY_VERSION`` +* Workaround for programs calling ``sys.setrecursionlimit(huge_value)`` (`issue + 3094`_) +* Set minimal ``MACOSX_DEPLOYMENT_TARGET`` to 10.7 on macOS; cpython uses 10.5 +* Fix a JIT bug causing rare register corruption on aarch64 +* Add discovery of ``ncursesw`` when building ``_minimal_curses`` and improve + handling of old curses versions (`issue 2970`_) +* Improve the error message for ``class X(random_object)`` (`issue 3109`_) +* Deal with json dicts containing repeated keys in the new map based parser + (`issue 3108`_) +* Port parts of the `portable pypy`_ repackaging scripts to add an option for + ``RPATH`` manipulation on linux +* Check for overflow in ctypes array creation +* Better support and report MSVC versions used to compile on windows +* Allow any kind of buffer in socket.setsockopt(), like CPython (`issue 3114`_) +* Fix importing a module with unicode in ``sys.path`` (`issue 3112`_) +* Support OpenSSL 1.1 and TLSv1_3 +* Remove the (deprecated since 5.7) asmgcc rootfinder from the GC +* Overflow in RPython when converting ``2<<32`` into a ``Signed`` on 32-bit + platforms rather than automatically using a ``SignedLongLong``, require an + explicit ``r_int64()`` call instead +* Fix multithread contention when creating an object in cffi (PyPy only) +* Copy lib/* shared objects in portable builds when creating virtual + environments with virtualenv and venv +* Potential fix in rare-case JIT optimizer (`issue 3128`_) + +C-API (cpyext) and c-extensions +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +* Add ``_PySet_Next``, ``_PySet_NextEntry`` +* Correctly swallow exceptions happening inside ``PyDict_GetItem()`` (`issue + 3098`_) +* Respect tp_dict on PyType_Ready +* Allow calling ``PyType_Ready`` on a subclass with a partially built + ``tp_base`` (issue 3117`_) +* Rename ``tuple_new`` to ``_PyPy_tuple_new`` to follow the naming convention of + exported symbols in ``libpypy-c.so`` +* Actually restore the traceback in ``PyErr_Restore`` (`issue 3120`_) + +Python 3.6 only +--------------- + +* Don't grow the ``lzma.decompress()`` buffer past ``max_length`` (`issue 3088`_) +* Backport fix from CPython for failure of ``lzma`` to decompress a file + (`issue 3090`_) +* Fix ``asyncgen_hooks`` and refactor ``coroutine execution`` +* Fix range checking in GB18030 decoder (CPython issue `29990`_) +* Fix handling escape characters in HZ codec (CPython issue `30003`_) +* Reject null characters in a few more functions (CPython issue `13617`_) +* Fix build on macOS without ``clock_gettime`` (before 10.12 and xcode 8, + released 2016) +* Backport 3.7.5 changes to ``timedelta.__eq__`` and ``time.__eq__`` (CPython + issue `37579`_) +* Backport more fixes to comparisons in ``datetime.py`` (CPython issue `37985`_) +* Use the python tag in ``pyc`` file names, not the abi tag +* Handle string formatting with a single ``[`` in the format string (`issue + 3100`_) +* Backport some of the patches in `macports pypy`_ +* Add missing ``HAVE_FACCESSAT`` to ``posix._have_functions`` +* Update pyrepl from upstream package (`issue 2971`_) +* Fix ``PyFrame._guess_function_name_parens()`` +* Fix range of allowed years in ``time.mktime`` to match CPython `13312`_ +* Generators need to store the old current ``exc_info`` in a place that is + visible, because in one corner case a call to ``sys.exc_info()`` might need + it. (`issue 3096`_) +* Remove incorrect clobbering of the ``locals`` after running ``exec()`` +* Adds encoding, decoding codepages on win32 +* Remove socket error attributes from ``_ssl`` (`issue 3119`_) +* Add missing ``os.getgrouplist`` (part of `issue 2375`_) +* Back-port the tentative fix from cpython: "Import deadlock detection causes + deadlock" (part of `issue 3111`_) +* Fix handling of ``sys.exc_info()`` in generators +* Return ``W_IntObject`` when converting from ``float`` to ``int`` when + possible, which speeds up many code paths. + +Python 3.6 C-API +~~~~~~~~~~~~~~~~ + +* Add ``PyObject_GenericGetDict``, ``PyObject_GenericSetDict``, ``_Py_strhex``, + ``_Py_strhex_bytes``, ``PyUnicodeNew``, ``_PyFinalizing``, + ``PySlice_Unpack``, ``PySlice_AdjustIndices``, ``PyOS_FSPath``, + ``PyModule_AddFunctions`` +* Implement ``pystrhex.h`` (`issue 2687`_) +* Make ``PyUnicodeObject`` slightly more compact +* Fix memory leak when releasing a ``PyUnicodeObject`` + +.. _`revdb`: fix broken link +.. _`portable pypy`: fix broken link +.. _`manylinux2010`: fix broken link +.. _`macports pypy`: https://github.com/macports/macports-ports/blob/master/lang/pypy/files/darwin.py.diff + +.. _`issue 2375`: https://bitbucket.com/pypy/pypy/issues/2375 +.. _`issue 2389`: https://bitbucket.com/pypy/pypy/issues/2389 +.. _`issue 2687`: https://bitbucket.com/pypy/pypy/issues/2687 +.. _`issue 2970`: https://bitbucket.com/pypy/pypy/issues/2970 +.. _`issue 2971`: https://bitbucket.com/pypy/pypy/issues/2971 +.. _`issue 3084`: https://bitbucket.com/pypy/pypy/issues/3084 +.. _`issue 3086`: https://bitbucket.com/pypy/pypy/issues/3086 +.. _`issue 3088`: https://bitbucket.com/pypy/pypy/issues/3088 +.. _`issue 3090`: https://bitbucket.com/pypy/pypy/issues/3090 +.. _`issue 3094`: https://bitbucket.com/pypy/pypy/issues/3094 +.. _`issue 3096`: https://bitbucket.com/pypy/pypy/issues/3096 +.. _`issue 3097`: https://bitbucket.com/pypy/pypy/issues/3097 +.. _`issue 3098`: https://bitbucket.com/pypy/pypy/issues/3098 +.. _`issue 3099`: https://bitbucket.com/pypy/pypy/issues/3099 +.. _`issue 3100`: https://bitbucket.com/pypy/pypy/issues/3100 +.. _`issue 3108`: https://bitbucket.com/pypy/pypy/issues/3108 +.. _`issue 3109`: https://bitbucket.com/pypy/pypy/issues/3109 +.. _`issue 3111`: https://bitbucket.com/pypy/pypy/issues/3111 +.. _`issue 3112`: https://bitbucket.com/pypy/pypy/issues/3112 +.. _`issue 3114`: https://bitbucket.com/pypy/pypy/issues/3114 +.. _`issue 3117`: https://bitbucket.com/pypy/pypy/issues/3117 +.. _`issue 3119`: https://bitbucket.com/pypy/pypy/issues/3119 +.. _`issue 3120`: https://bitbucket.com/pypy/pypy/issues/3120 +.. _`issue 3128`: https://bitbucket.com/pypy/pypy/issues/3120 + +.. _13312: https://bugs.python.org/issue13312 +.. _13617: https://bugs.python.org/issue13617 +.. _29990: https://bugs.python.org/issue29990 +.. _30003: https://bugs.python.org/issue30003 +.. _37579: https://bugs.python.org/issue37579 +.. _37985: https://bugs.python.org/issue37985 +.. _37985: https://bugs.python.org/issue37985 + + diff -Nru pypy-7.1.1+dfsg/pypy/doc/release-v7.3.1.rst pypy-7.3.1+dfsg/pypy/doc/release-v7.3.1.rst --- pypy-7.1.1+dfsg/pypy/doc/release-v7.3.1.rst 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/doc/release-v7.3.1.rst 2020-04-10 19:28:42.000000000 +0000 @@ -0,0 +1,234 @@ +=================================== +PyPy v7.3.1: release of 2.7 and 3.6 +=================================== + +The PyPy team is proud to release the version 7.3.1 of PyPy, which includes +two different interpreters: + + - PyPy2.7, which is an interpreter supporting the syntax and the features of + Python 2.7 including the stdlib for CPython 2.7.13 + + - PyPy3.6: which is an interpreter supporting the syntax and the features of + Python 3.6, including the stdlib for CPython 3.6.9. + +The interpreters are based on much the same codebase, thus the multiple +release. This is a micro release, no APIs have changed since the 7.3.0 release +in December, but read on to find out what is new. + +Conda Forge now `supports PyPy`_ as a python interpreter. The support right now +is being built out. After this release, many more c-extension-based +packages can be successfully built and uploaded. This is the result of a lot of +hard work and good will on the part of the Conda Forge team. A big shout out +to them for taking this on. + +We have worked with the python packaging group to support tooling around +building third party packages for python, so this release updates the pip and +setuptools installed when executing ``pypy -mensurepip`` to ``pip>=20``. This +completes the work done to update the PEP 425 `python tag`_ from ``pp373`` to +mean "PyPy 7.3 running python3" to ``pp36`` meaning "PyPy running python +3.6" (the format is recommended in the PEP). The tag itself was +changed in 7.3.0, but older pip versions build their own tag without querying +pypy. This means that wheels built for the previous tag format will not be +discovered by pip from this version, so library authors should update their +PyPY-specific wheels on PyPI. + +Development of PyPy is transitioning to https://foss.heptapod.net/pypy/pypy. +This move was covered more extensively in the `blog post`_ from last month. + +The `CFFI`_ backend has been updated to version 14.0. We recommend using CFFI +rather than c-extensions to interact with C, and using cppyy_ for performant +wrapping of C++ code for Python. The ``cppyy`` backend has been enabled +experimentally for win32, try it out and let use know how it works. + +Enabling ``cppyy`` requires a more modern C compiler, so win32 is now built +with MSVC160 (Visual Studio 2019). This is true for PyPy 3.6 as well as for 2.7. + +We have improved warmup time by up to 20%, performance of ``io.StringIO`` to +match if not be faster than CPython, and improved JIT code generation for +generators (and generator expressions in particular) when passing them to +functions like ``sum``, ``map``, and ``map`` that consume them. + +As always, this release fixed several issues and bugs raised by the growing +community of PyPy users. We strongly recommend updating. Many of the fixes are +the direct result of end-user bug reports, so please continue reporting issues +as they crop up. + +You can find links to download the v7.3.1 releases here: + + http://pypy.org/download.html + +We would like to thank our donors for the continued support of the PyPy +project. If PyPy is not quite good enough for your needs, we are available for +direct consulting work. + +We would also like to thank our contributors and encourage new people to join +the project. PyPy has many layers and we need help with all of them: `PyPy`_ +and `RPython`_ documentation improvements, tweaking popular modules to run +on pypy, or general `help`_ with making RPython's JIT even better. Since the +previous release, we have accepted contributions from 3 new contributors, +thanks for pitching in. + +If you are a python library maintainer and use c-extensions, please consider +making a cffi / cppyy version of your library that would be performant on PyPy. +In any case both `cibuildwheel`_ and the `multibuild system`_ support +building wheels for PyPy wheels. + +.. _`PyPy`: index.html +.. _`RPython`: https://rpython.readthedocs.org +.. _`help`: project-ideas.html +.. _`CFFI`: http://cffi.readthedocs.io +.. _`cppyy`: https://cppyy.readthedocs.io +.. _`available as wheels`: https://github.com/antocuni/pypy-wheels +.. _`portable-pypy`: https://github.com/squeaky-pl/portable-pypy +.. _`docker images`: https://github.com/pypy/manylinux +.. _`multibuild system`: https://github.com/matthew-brett/multibuild +.. _`cibuildwheel`: https://github.com/joerick/cibuildwheel +.. _`manylinux2010`: https://github.com/pypa/manylinux +.. _`blog post`: https://morepypy.blogspot.com/2020/02/pypy-and-cffi-have-moved-to-heptapod.html +.. _ `python tag`: https://www.python.org/dev/peps/pep-0425/#python-tag +.. _`supports PyPy`: https://conda-forge.org/blog//2020/03/10/pypy + + +What is PyPy? +============= + +PyPy is a very compliant Python interpreter, almost a drop-in replacement for +CPython 2.7, 3.6, and soon 3.7. It's fast (`PyPy and CPython 2.7.x`_ performance +comparison) due to its integrated tracing JIT compiler. + +We also welcome developers of other `dynamic languages`_ to see what RPython +can do for them. + +This PyPy release supports: + + * **x86** machines on most common operating systems + (Linux 32/64 bits, Mac OS X 64 bits, Windows 32 bits, OpenBSD, FreeBSD) + + * big- and little-endian variants of **PPC64** running Linux, + + * **s390x** running Linux + + * 64-bit **ARM** machines running Linux. + +Unfortunately at the moment of writing our ARM32 buildbots are out of service, +so for now we are **not** releasing any binaries for that architecture, +although PyPy does support ARM 32 bit processors. + +.. _`PyPy and CPython 2.7.x`: http://speed.pypy.org +.. _`dynamic languages`: http://rpython.readthedocs.io/en/latest/examples.html + + +Changelog +========= + +Changes shared across versions +------------------------------ +- We now package and ship the script to rebuild all the stdlib helper modules + that on CPython are written as c-extensions and in PyPy use CFFI. These are + located in ``lib_pypy``, and the build script in ``lib_pypy/tools``. +- Implement CPython 16055_: Fixes incorrect error text for + ``int('1', base=1000)``. +- Handle NaN correctly in ``array.array``. +- Fix `issue 3137`_: rsplit of unicode strings that end with a non-ascii char + was broken +- Fix `issue 3140`_: add ``$dist_name`` to ``include`` path when using + ``setup.py install`` +- Fix `issue 3146`_: using a jsonDict as an instance `__dict__` would segfault +- Fix `issue 3144`_: using `wch` in the curses CFFI module +- Fix `issue 3149`_ which is related to the still-open CPython issue 12029_ + around Exceptions, metaclasses, ``__instancecheck__`` and ``__subclasscheck__`` +- Fix a corner case in ``multibytecodec``: for stateful codecs, when encoding + fails and we use replacement, the replacement string must be written in the + output preserving the state. +- Correct mistake in position when handling errors in unicode formatting +- Add ``__rsub__``, ``__rand__`` and ``__ror__``, ``__rxor__`` operations to + set and frozenset objects +- Fix bug in locale-specific string formatting: the thousands separator was + always ``'.'`` +- Fix `issue 3065`_ (again!): segfault in ``mmap`` +- ``rstruct.runpack`` should align for next read +- Fix `issue 3155`_: virtualenv on win32 installs into Scripts, not bin +- Add Python3.6 ``socket`` constants, they will be exposed in pypy2.7 as well +- Use better green keys for non-standard jitdrivers to make sure that e.g. + generators are specialized based on their code object +- Improve warmup speed of PyPy by around ~5-20% + + - a few minor tweaks in the interpreter + - since tracing guards is super costly, work harder at not emitting + too many guard_not_invalidated while tracing + - optimize quasi_immut during tracing + - optimize loopinvariant calls during tracing + - a small optimization around non-standard virtualizables during tracing +- Fix off-by-one error and rework system calls to ``_get_tzname`` on win32 +- Fix `issue 3134`_: non-ascii filenames on win32 +- Fix app-level bufferable classes, related to getting the CFFI backend to + pyzmq working +- Improve performance of ``io.StringIO()``. It should now be faster than + CPython in common use cases +- Fix bug in ``PyCode.__eq__``: the compiler contains careful logic to make + sure that it doesn't unify things like ``0.0`` and ``-0.0`` (they are equal, + but the sign still shouldn't be dropped) +- Speed up integer parsing with some fast paths for common cases +- Add ``__pypy__.utf8content`` to return the raw content of a Unicode object + (for debugging) +- Update ``pip`` and ``setuptools`` in ``ensurepip`` to 20.0.2 and 44.0.0 + respectively +- Fix potential segfault in the zipimporter +- Fixes in the JIT backend for PowerPC + +C-API (cpyext) and c-extensions +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +- Fix more of `issue 3141`_ : use ``Py_TYPE(op)`` instead of ``(ob)->ob_type`` + in our header files +- Partially resync ``pyport.h`` with CPython and add many missing constants +- Check for ``ferror`` when reading from a file in ``PyRun_File`` + +Python 3.6 only +--------------- +- Fix for CPython 30891_: deadlock import detection causes deadlocks +- Don't swallow the UnicodeDecodeError in one corner case (fixes issue 3132) +- Follow CPython's behaviour more closely in sqlite3 +- Fix `issue 3136`: On windows, ``os.putenv()`` cannot have a key with ``'='`` + in it. +- More closely follow CPython's line number output in disassembly of constants +- Don't give a new error message if metaclass is actually type +- Improve ``fcntl``'s handling of errors in functions that do not retry +- Re-implement ``BUILD_LIST_FROM_ARG`` as a fast path +- Fix `issue 3159`_: ``venv`` should copy directories, not just files +- Add missing ``MACOSX_DEPLOYMENT_TARGET`` to ``config_vars`` for Darwin +- Fix for path-as- ``memoryview`` on win32 +- Fix `issue 3166`_: Obscure ordering-of-which-error-to-report-first +- Improve the performance of ``str.join``. This helps both lists (in some + situations) and iterators, but the latter is helped more. Some speedups of + >50% when using some other iterator +- Remove ``__PYVENV_LAUNCHER__`` from ``os.environ`` during startup on Darwin + +Python 3.6 C-API +~~~~~~~~~~~~~~~~ + +- Fix `issue 3160`_: include ``structseq.h`` in ``Python.h`` (needed for + ``PyStructSequence_InitType2`` in NumPy) +- Fix `issue 3165`_: surrogates in ``PyUnicode_FromKindAndData`` +- Add ``PyDescr_TYPE``, ``PyDescr_NAME``. + +.. _`issue 3065`: https://foss.heptapod.net/pypy/pypy/issues/3065 +.. _`issue 3132`: https://foss.heptapod.net/pypy/pypy/issues/3132 +.. _`issue 3134`: https://foss.heptapod.net/pypy/pypy/issues/3134 +.. _`issue 3136`: https://foss.heptapod.net/pypy/pypy/issues/3136 +.. _`issue 3137`: https://foss.heptapod.net/pypy/pypy/issues/3137 +.. _`issue 3140`: https://foss.heptapod.net/pypy/pypy/issues/3140 +.. _`issue 3141`: https://foss.heptapod.net/pypy/pypy/issues/3141 +.. _`issue 3144`: https://foss.heptapod.net/pypy/pypy/issues/3144 +.. _`issue 3146`: https://foss.heptapod.net/pypy/pypy/issues/3146 +.. _`issue 3149`: https://foss.heptapod.net/pypy/pypy/issues/3149 +.. _`issue 3155`: https://foss.heptapod.net/pypy/pypy/issues/3155 +.. _`issue 3159`: https://foss.heptapod.net/pypy/pypy/issues/3159 +.. _`issue 3160`: https://foss.heptapod.net/pypy/pypy/issues/3160 +.. _`issue 3165`: https://foss.heptapod.net/pypy/pypy/issues/3165 +.. _`issue 3166`: https://foss.heptapod.net/pypy/pypy/issues/3166 + +.. _12029: https://bugs.python.org/issue12029 +.. _16055: https://bugs.python.org/issue16055 +.. _30891: https://bugs.python.org/issue30891 + +.. _`python tag`: https://www.python.org/dev/peps/pep-0425/#python-tag diff -Nru pypy-7.1.1+dfsg/pypy/doc/sandbox.rst pypy-7.3.1+dfsg/pypy/doc/sandbox.rst --- pypy-7.1.1+dfsg/pypy/doc/sandbox.rst 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/doc/sandbox.rst 2020-04-10 19:28:40.000000000 +0000 @@ -3,10 +3,11 @@ PyPy's sandboxing features ========================== -.. warning:: This is not actively maintained. You will likely have to fix - some issues yourself, or otherwise play around on your own. We provide - this documentation for historical reasions, it will not translate or - run on the latest PyPy code base. +.. warning:: This describes the old, unmaintained version. A new version + is in progress and should be merged back to trunk at some point soon. + Please see its description here: + https://mail.python.org/pipermail/pypy-dev/2019-August/015797.html + Introduction ------------ diff -Nru pypy-7.1.1+dfsg/pypy/doc/tool/makecontributor.py pypy-7.3.1+dfsg/pypy/doc/tool/makecontributor.py --- pypy-7.1.1+dfsg/pypy/doc/tool/makecontributor.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/doc/tool/makecontributor.py 2020-04-10 19:28:40.000000000 +0000 @@ -6,7 +6,7 @@ from collections import defaultdict import operator import re -import mercurial.localrepo +import mercurial.hg import mercurial.ui ROOT = py.path.local(__file__).join('..', '..', '..', '..') @@ -132,7 +132,7 @@ def main(show_numbers): ui = mercurial.ui.ui() - repo = mercurial.localrepo.localrepository(ui, str(ROOT)) + repo = mercurial.hg.repository(ui, str(ROOT)) authors_count = defaultdict(int) for i in repo: ctx = repo[i] diff -Nru pypy-7.1.1+dfsg/pypy/doc/whatsnew-head.rst pypy-7.3.1+dfsg/pypy/doc/whatsnew-head.rst --- pypy-7.1.1+dfsg/pypy/doc/whatsnew-head.rst 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/doc/whatsnew-head.rst 2020-04-10 19:28:42.000000000 +0000 @@ -1,14 +1,7 @@ -========================== -What's new in PyPy2.7 7.1+ -========================== +============================ +What's new in PyPy2.7 7.3.1+ +============================ -.. this is a revision shortly after release-pypy-7.1.0 -.. startrev: d3aefbf6dae7 +.. this is a revision shortly after release-pypy-7.3.1 +.. startrev: 1cae9900d598 -.. branch: Twirrim/minor-typo-fix-1553456951526 - -Fix typo - -.. branch: jit-cleanup - -Remove rpython.jit.metainterp.typesystem and clean up related code in rpython/jit/ diff -Nru pypy-7.1.1+dfsg/pypy/doc/whatsnew-pypy2-5.7.0.rst pypy-7.3.1+dfsg/pypy/doc/whatsnew-pypy2-5.7.0.rst --- pypy-7.1.1+dfsg/pypy/doc/whatsnew-pypy2-5.7.0.rst 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/doc/whatsnew-pypy2-5.7.0.rst 2020-04-10 19:28:40.000000000 +0000 @@ -14,6 +14,7 @@ changed in exactly the same way because of this fix. + .. branch: rpython-error-to-systemerror Any uncaught RPython exception (from a PyPy bug) is turned into an diff -Nru pypy-7.1.1+dfsg/pypy/doc/whatsnew-pypy2-7.2.0.rst pypy-7.3.1+dfsg/pypy/doc/whatsnew-pypy2-7.2.0.rst --- pypy-7.1.1+dfsg/pypy/doc/whatsnew-pypy2-7.2.0.rst 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/doc/whatsnew-pypy2-7.2.0.rst 2020-04-10 19:28:42.000000000 +0000 @@ -0,0 +1,82 @@ +=========================== +What's new in PyPy2.7 7.2.0 +=========================== + +.. this is a revision shortly after release-pypy-7.1.0 +.. startrev: d3aefbf6dae7 + +.. branch: Twirrim/minor-typo-fix-1553456951526 + +Fix typo + +.. branch: jit-cleanup + +Remove rpython.jit.metainterp.typesystem and clean up related code in rpython/jit/ + +.. branch: datetime_api_27 + +Add ``DateTime_FromTimestamp`` and ``Date_FromTimestamp`` + +.. branch: semlock-deadlock + +Test and reduce the probability of a deadlock when acquiring a semaphore by +moving global state changes closer to the actual aquire. + +.. branch: shadowstack-issue2722 + +Make the shadowstack size more dynamic + +.. branch: cffi-libs + +Move _ssl and _hashlib from rpython to a cffi-based module, like on python3. +Reduces the number of problematic linked-in libraries (libssl, libcrypto) + +.. branch: fix-vmprof-memory-tracking + +Fix a bug that prevent memory-tracking in vmprof working on PyPy. + +.. branch: optimizeopt-cleanup + +Cleanup optimizeopt + +.. branch: copystrcontents-in-rewrite + +Remove ``copystrcontent`` and ``copyunicodecontent`` in the backends. +Instead, replace it in ``rewrite.py`` with a direct call to ``memcpy()`` and +new basic operation, ``load_effective_address``, which the backend can +even decide not to implement. + +.. branch: arm64 + +Add a JIT backend for ARM64 (aarch64) + +.. branch: fix-test-vmprof-closed-file + + +.. branch: fix_darwin_list_dir_test + +.. branch: apptest-file + +New mechanism for app-level testing using -D to test all apptest_*.py files + +.. branch: feature_closed_prop_to_rfile + +Add RFile.closed + +.. branch: cryptograhpt-2.7 + +Update vendored cryptography used for _ssl to 2.7 + +.. branch: compile_ncurses_tcl_tk_suse_latest + +Check for headers and runtime libraries in more locations to support other linuxes + +.. branch: openssl-for-macos + +Update _ssl on macos to statically link to openssl-1.1.1c + +.. branch: json-decoder-maps + +Much faster and more memory-efficient JSON decoding. The resulting +dictionaries that come out of the JSON decoder have faster lookups too. + diff -Nru pypy-7.1.1+dfsg/pypy/doc/whatsnew-pypy2-7.3.0.rst pypy-7.3.1+dfsg/pypy/doc/whatsnew-pypy2-7.3.0.rst --- pypy-7.1.1+dfsg/pypy/doc/whatsnew-pypy2-7.3.0.rst 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/doc/whatsnew-pypy2-7.3.0.rst 2020-04-10 19:28:42.000000000 +0000 @@ -0,0 +1,41 @@ +=========================== +What's new in PyPy2.7 7.3.0 +=========================== + +.. this is a revision shortly after release-pypy-7.2.0 +.. startrev: a511d86377d6 + +.. branch: fix-descrmismatch-crash + +Fix segfault when calling descr-methods with no arguments + +.. branch: https-readme + +Convert http -> https in README.rst + +.. branch: license-update + +Update list directories in LICENSE + +.. branch: allow-forcing-no-embed + +When packaging, allow suppressing embedded dependencies via +PYPY_NO_EMBED_DEPENDENCIES + +.. branch: int-test-is-zero + +.. branch: cppyy-dev + +Upgraded the built-in ``_cppyy`` module to ``cppyy-backend 1.10.6``, which +provides, among others, better template resolution, stricter ``enum`` handling, +anonymous struct/unions, cmake fragments for distribution, optimizations for +PODs, and faster wrapper calls. + +.. branch: backport-decode_timeval_ns-py3.7 + +Backport ``rtime.decode_timeval_ns`` from py3.7 to rpython + +.. branch: kill-asmgcc + +Completely remove the deprecated translation option ``--gcrootfinder=asmgcc`` +because it no longer works with a recent enough ``gcc``. diff -Nru pypy-7.1.1+dfsg/pypy/doc/whatsnew-pypy2-7.3.1.rst pypy-7.3.1+dfsg/pypy/doc/whatsnew-pypy2-7.3.1.rst --- pypy-7.1.1+dfsg/pypy/doc/whatsnew-pypy2-7.3.1.rst 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/doc/whatsnew-pypy2-7.3.1.rst 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,49 @@ +============================ +What's new in PyPy2.7 7.3.0+ +============================ + +.. this is a revision shortly after release-pypy-7.3.0 +.. startrev: 994c42529580 + +.. branch: cpyext-speedup-tests + +Make cpyext test faster, especially on py3.6 + +.. branch: array-and-nan + +Handle ``NAN`` more correctly in ``array.array`` for ``__eq__`` and ``count`` + +.. branch: bpo-16055 + +Fixes incorrect error text for ``int('1', base=1000)`` + +.. branch: heptapod + +adapt contributing documentation to heptapod + +.. branch: pypy-jitdriver-greenkeys + +Improve code generation for generators (and generator expressions in +particular) when passing them to builtin functions that consume iterators, such +as ``sum``, ``map``, ``max``, etc. + +.. branch: warmup-improvements-various + +Improves warmup time by up to 20%. + +.. branch: StringIO-perf + +Improve performance of io.StringIO(). It should now be faster than CPython in +common use cases. + +.. branch: rgil-track-thread +.. branch: hpy-rpython-backports + +.. branch: nested-scopes-jit + +Improve the code generation for inner functions that use outer variables that +are constant. + +.. branch win32-cppyy + +Enable _cppyy for win32, prefer newer msvc compilers diff -Nru pypy-7.1.1+dfsg/pypy/doc/whatsnew-pypy3-2.3.1.rst pypy-7.3.1+dfsg/pypy/doc/whatsnew-pypy3-2.3.1.rst --- pypy-7.1.1+dfsg/pypy/doc/whatsnew-pypy3-2.3.1.rst 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/doc/whatsnew-pypy3-2.3.1.rst 1970-01-01 00:00:00.000000000 +0000 @@ -1,6 +0,0 @@ -========================= -What's new in PyPy3 2.3.1 -========================= - -.. this is a revision shortly after pypy3-release-2.3.x -.. startrev: 0137d8e6657d diff -Nru pypy-7.1.1+dfsg/pypy/doc/whatsnew-pypy3-2.4.0.rst pypy-7.3.1+dfsg/pypy/doc/whatsnew-pypy3-2.4.0.rst --- pypy-7.1.1+dfsg/pypy/doc/whatsnew-pypy3-2.4.0.rst 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/doc/whatsnew-pypy3-2.4.0.rst 1970-01-01 00:00:00.000000000 +0000 @@ -1,6 +0,0 @@ -========================= -What's new in PyPy3 2.4.0 -========================= - -.. this is a revision shortly after pypy3-release-2.4.x -.. startrev: 12b940544622 diff -Nru pypy-7.1.1+dfsg/pypy/doc/whatsnew-pypy3-5.10.0.rst pypy-7.3.1+dfsg/pypy/doc/whatsnew-pypy3-5.10.0.rst --- pypy-7.1.1+dfsg/pypy/doc/whatsnew-pypy3-5.10.0.rst 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/doc/whatsnew-pypy3-5.10.0.rst 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,7 @@ +======================== +What's new in PyPy3 7.0+ +======================== + +.. this is the revision after release-pypy3.5-v7.0 +.. startrev: 9d2fa7c63b7c + diff -Nru pypy-7.1.1+dfsg/pypy/doc/whatsnew-pypy3-6.0.0.rst pypy-7.3.1+dfsg/pypy/doc/whatsnew-pypy3-6.0.0.rst --- pypy-7.1.1+dfsg/pypy/doc/whatsnew-pypy3-6.0.0.rst 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/doc/whatsnew-pypy3-6.0.0.rst 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,7 @@ +======================== +What's new in PyPy3 7.0+ +======================== + +.. this is the revision after release-pypy3.5-v7.0 +.. startrev: 9d2fa7c63b7c + diff -Nru pypy-7.1.1+dfsg/pypy/doc/whatsnew-pypy3-7.1.0.rst pypy-7.3.1+dfsg/pypy/doc/whatsnew-pypy3-7.1.0.rst --- pypy-7.1.1+dfsg/pypy/doc/whatsnew-pypy3-7.1.0.rst 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/doc/whatsnew-pypy3-7.1.0.rst 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,11 @@ +======================== +What's new in PyPy3 7.0+ +======================== + +.. this is the revision after release-pypy3.6-v7.0 +.. startrev: 33fe3b2cf186 + +.. branch: py3.5 + +Merge in py.35 and use this branch as the primary pypy3 one + diff -Nru pypy-7.1.1+dfsg/pypy/doc/whatsnew-pypy3-7.2.0.rst pypy-7.3.1+dfsg/pypy/doc/whatsnew-pypy3-7.2.0.rst --- pypy-7.1.1+dfsg/pypy/doc/whatsnew-pypy3-7.2.0.rst 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/doc/whatsnew-pypy3-7.2.0.rst 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,58 @@ +========================= +What's new in PyPy3 7.2.0 +========================= + +.. this is the revision after release-pypy3.6-v7.1.1 +.. startrev: db5a1e7fbbd0 + +.. branch: fix-literal-prev_digit-underscore + +Fix parsing for converting strings with underscore into ints + +.. branch: winmultiprocessing + +Improve multiprocessing support on win32 + +.. branch: setitem2d + +Allow 2d indexing in ``memoryview.__setitem__`` (issue bb-3028) + +.. branch: py3.6-socket-fix +.. branch: fix-importerror +.. branch: dj_s390 +.. branch: bpo-35409 +.. branch: remove_array_with_char_test +.. branch: fix_test_unicode_outofrange +.. branch: Ram-Rachum/faulthandleris_enabled-should-return-fal-1563636614875 +.. branch: Anthony-Sottile/fix-leak-of-file-descriptor-with-_iofile-1559687440863 + +.. branch: py3tests + +Add handling of application-level test files and -D flag to test runner + +.. branch: vendor/stdlib-3.6 +.. branch: stdlib-3.6.9 + +Update standard library to version 3.6.9 + +.. branch: __debug__-optimize + +Fix handling of __debug__, sys.flags.optimize, and '-O' command-line flag to +match CPython 3.6. + +.. branch: more-cpyext + +Add ``PyErr_SetFromWindowsErr`` and ``pytime.h``, ``pytime.c``. Fix order of +fields in ``Py_buffer``. + +.. branch: Ryan-Hileman/add-support-for-zipfile-stdlib-1562420744699 + +Add support for the entire stdlib being inside a zipfile + + +.. branch: json-decoder-maps-py3.6 + +Much faster and more memory-efficient JSON decoding. The resulting +dictionaries that come out of the JSON decoder have faster lookups too. + + diff -Nru pypy-7.1.1+dfsg/pypy/doc/whatsnew-pypy3-7.3.0.rst pypy-7.3.1+dfsg/pypy/doc/whatsnew-pypy3-7.3.0.rst --- pypy-7.1.1+dfsg/pypy/doc/whatsnew-pypy3-7.3.0.rst 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/doc/whatsnew-pypy3-7.3.0.rst 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,24 @@ +========================= +What's new in PyPy3 7.3.0 +========================= + +.. this is the revision after release-pypy3.6-v7.2 +.. startrev: 6d2f8470165b + + +.. branch: py3.6-asyncgen + +Fix asyncgen_hooks and refactor coroutine execution + +.. branch: py3.6-exc-info + +Follow CPython's use of exc_info more closely (issue 3096) + +.. branch: code_page-utf8 + +Add encoding, decoding of codepages on windows + +.. branch: py3.6-exc-info-2 + +Fix handling of sys.exc_info() in generators + diff -Nru pypy-7.1.1+dfsg/pypy/doc/whatsnew-pypy3-7.3.1.rst pypy-7.3.1+dfsg/pypy/doc/whatsnew-pypy3-7.3.1.rst --- pypy-7.1.1+dfsg/pypy/doc/whatsnew-pypy3-7.3.1.rst 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/doc/whatsnew-pypy3-7.3.1.rst 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,25 @@ +========================== +What's new in PyPy3 7.3.0+ +========================== + +.. this is the revision after release-pypy3.6-v7.3.0 +.. startrev: a56889d5df88 + +.. branch: cpyext-speedup-tests-py36 + +Make cpyext test faster, especially on py3.6 + +.. branch: py3.6-sqlite + +Follow CPython's behaviour more closely in sqlite3 + +.. branch: py3-StringIO-perf + +Improve performance of io.StringIO(). It should now be faster than CPython in +common use cases. + +.. branch: ignore-pyenv-launcher + +virtualenv on macOS defines an environment variable ``__PYVENV_LAUNCHER__`` to +let the invoked python know it is inside a venv. This is not needed on PyPy so +it is deleted when importing ``site`` and reset afterwards. diff -Nru pypy-7.1.1+dfsg/pypy/doc/whatsnew-pypy3-head.rst pypy-7.3.1+dfsg/pypy/doc/whatsnew-pypy3-head.rst --- pypy-7.1.1+dfsg/pypy/doc/whatsnew-pypy3-head.rst 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/doc/whatsnew-pypy3-head.rst 2020-04-10 19:28:42.000000000 +0000 @@ -1,7 +1,7 @@ -======================== -What's new in PyPy3 7.0+ -======================== - -.. this is the revision after release-pypy3.5-v7.0 -.. startrev: 9d2fa7c63b7c - +========================== +What's new in PyPy3 7.3.1+ +========================== + +.. this is the revision after release-pypy3.6-v7.3.1 +.. startrev: e81cea3ac65e + diff -Nru pypy-7.1.1+dfsg/pypy/doc/windows.rst pypy-7.3.1+dfsg/pypy/doc/windows.rst --- pypy-7.1.1+dfsg/pypy/doc/windows.rst 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/doc/windows.rst 2020-04-10 19:28:40.000000000 +0000 @@ -20,49 +20,38 @@ .. _our downloads: http://pypy.org/download.html -Installing Visual Compiler v9 (for Python 2.7) ----------------------------------------------- -This compiler, while the standard one for Python 2.7, is deprecated. Microsoft has -made it available as the `Microsoft Visual C++ Compiler for Python 2.7`_ (the link -was checked in May 2018). Note that the compiler suite may be installed in -``C:\Users\\AppData\Local\Programs\Common\Microsoft\Visual C++ for Python`` -or in -``C:\Program Files (x86)\Common Files\Microsoft\Visual C++ for Python``. -A current version of ``setuptools`` will be able to find it there. -Also, you must download and install the ``.Net Framework 3.5``, -otherwise ``mt.exe`` will silently fail. Installation will begin automatically -by running the mt.exe command by hand from a DOS window (that is how the author -discovered the problem). - -.. _Microsoft Visual C++ Compiler for Python 2.7: https://www.microsoft.com/EN-US/DOWNLOAD/DETAILS.ASPX?ID=44266 - -Installing "Build Tools for Visual Studio 2015" (for Python 3) --------------------------------------------------------------- - -As documented in the CPython Wiki_, CPython recommends Visual C++ version -14.0 for python version 3.5. A compact version of the compiler suite can be -obtained from Microsoft_ downloads, search the page for "Microsoft Build Tools 2015". - -You will need to reboot the computer for the installation to successfully install and -run the `mt.exe` mainfest compiler. The installation will set the -`VS140COMNTOOLS` environment variable, this is key to distutils/setuptools -finding the compiler +What Compiler to use and How to find it? +---------------------------------------- +The first stumbling block when building something for Python on windows is +how to discover the path to the compiler, headers, and libraries. One can +install many versions of the MSVC compiler tools, from stand-alone build +tools to full blown Visual Studio IDE installations. Each of these use cases +put the compiler at different locations, and the layout changes from time to +time. + +The ``distutils`` package, located in the stdlib, is the natural place to put +this discovery code, but it is frozen by the python version. The pip- +installable ``setuptools`` can move faster to adapt to new tools. So the first +thing that will happen after building PyPy is it will install pip and download +``setuptools``, then it will build the cffi modules used in stdlib. +PyPy has a chicken and egg problem: in order to compile something we need +``setuptools``, but in order to get ``setuptools`` we need pip which requires +``_ssl``, and ``_ssl`` must be compiled. So PyPy vendors in a copy of +``msvc.py`` in ``rpython/tools/setuptools_msvc.py``. -.. _Wiki: https://wiki.python.org/moin/WindowsCompilers -.. _Microsoft: https://www.visualstudio.com/vs/older-downloads/ +PyPy will prefer to compile with the latest MSVC compiler it can find, which is +a departure from CPython's desire to compile with Visual Studio 9. Translating PyPy with Visual Studio ----------------------------------- -We routinely test translation of PyPy 2.7 using v9 and PyPy 3 with vc14. +We routinely test translation of PyPy using Visual Studio 2019, MSVC160. Other configurations may work as well. The translation scripts will set up the appropriate environment variables for the compiler, so you do not need to run vcvars before translation. -They will attempt to locate the same compiler version that -was used to build the Python interpreter doing the -translation. Failing that, they will pick the most recent Visual Studio +They will pick the most recent Visual Studio compiler they can find. In addition, the target architecture (32 bits, 64 bits) is automatically selected. A 32 bit build can only be built using a 32 bit Python and vice versa. By default the interpreter is built using @@ -91,39 +80,11 @@ set PYPY_GC_MAX_DELTA=200MB pypy --jit loop_longevity=300 ../../rpython/bin/rpython -Ojit targetpypystandalone set PYPY_GC_MAX_DELTA= - PYTHONPATH=../.. ./pypy-c ../tool/build_cffi_imports.py + # This is done as part of translation + PYTHONPATH=../.. ./pypy-c ../../lib_pypy/tools/build_cffi_imports.py .. _build instructions: http://pypy.org/download.html#building-from-source -Setting Up Visual Studio 9.0 for building SSL in Python3 --------------------------------------------------------- - -**Note: this is old information, left for historical reference. We recommend -using Visual Studio 2015, which now seems to properly set this all up.** - -On Python3, the ``ssl`` module is based on ``cffi``, and requires a build step after -translation. However ``distutils`` does not support the Micorosft-provided Visual C -compiler, and ``cffi`` depends on ``distutils`` to find the compiler. The -traditional solution to this problem is to install the ``setuptools`` module -via running ``-m ensurepip`` which installs ``pip`` and ``setuptools``. However -``pip`` requires ``ssl``. So we have a chicken-and-egg problem: ``ssl`` depends on -``cffi`` which depends on ``setuptools``, which depends on ``ensurepip``, which -depends on ``ssl``. - -In order to solve this, the buildbot sets an environment varaible that helps -``distutils`` find the compiler without ``setuptools``:: - - set VS90COMNTOOLS=C:\Program Files (x86)\Common Files\Microsoft\Visual C++ for Python\9.0\VC\bin - -or whatever is appropriate for your machine. Note that this is not enough, you -must also copy the ``vcvarsall.bat`` file fron the ``...\9.0`` directory to the -``...\9.0\VC`` directory, and edit it, changing the lines that set -``VCINSTALLDIR`` and ``WindowsSdkDir``:: - - set VCINSTALLDIR=%~dp0\ - set WindowsSdkDir=%~dp0\..\WinSDK\ - - Preparing Windows for the large build ------------------------------------- @@ -142,7 +103,8 @@ editbin /largeaddressaware translator.exe where ``translator.exe`` is the pypy.exe or cpython.exe you will use to -translate with. +translate with. This is done by default during PyPy translation, so it should +Just Work. Installing external packages @@ -155,7 +117,7 @@ the `get_externals.py` utility to checkout the proper branch for your platform and PyPy version. -.. _subrepository: https://bitbucket.org/pypy/external +.. _subrepository: https://bitbucket.org/pypy/externals Using the mingw compiler ------------------------ diff -Nru pypy-7.1.1+dfsg/pypy/goal/getnightly.py pypy-7.3.1+dfsg/pypy/goal/getnightly.py --- pypy-7.1.1+dfsg/pypy/goal/getnightly.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/goal/getnightly.py 2020-04-10 19:28:40.000000000 +0000 @@ -1,8 +1,9 @@ #!/usr/bin/env python - +from __future__ import print_function import sys import os -import py +import subprocess +import tempfile TAR_OPTIONS = '-x -v --strip-components=2' TAR = 'tar {options} -f {tarfile} {files}' @@ -23,14 +24,13 @@ cmd = 'curl -O "%s"' binfiles = "'*/bin/pypy'" else: - print 'Cannot determine the platform, please update this script' + print('Cannot determine the platform, please update this script') sys.exit(1) -if sys.maxint == 2**63 - 1: +if sys.maxsize == 2**63 - 1: arch += '64' -hg = py.path.local.sysfind('hg') -branch = hg.sysexec('branch').strip() +branch = subprocess.check_output(['hg', 'branch']).strip().decode('utf-8') if branch == 'default': branch = 'trunk' @@ -41,19 +41,29 @@ filename = 'pypy-c-%s-latest-%s.tar.bz2' % (kind, arch) url = 'http://buildbot.pypy.org/nightly/%s/%s' % (branch, filename) -tmp = py.path.local.mkdtemp() -pypy_latest = tmp.join(filename) -mydir = tmp.chdir() -print 'Downloading pypy to', tmp +tmp = tempfile.mkdtemp() +pypy_latest = os.path.join(tmp, filename) +olddir = os.getcwd() +mydir = os.chdir(tmp) +print('Downloading pypy to', tmp) if os.system(cmd % url) != 0: sys.exit(1) -print 'Extracting pypy binary' -mydir.chdir() +mydir = os.path.dirname(__file__) +print('Extracting pypy binary') +os.chdir(mydir) untar(pypy_latest, binfiles) -include_dir = py.path.local('../../include') -if include_dir.check(dir=True): - include_dir.chdir() +include_dir = os.path.join(mydir, '..', '..', 'include') +lib_dir = os.path.join(mydir, '..', 'lib') +if os.path.isdir(include_dir): + os.chdir(include_dir) untar(pypy_latest, '*/include/*') else: - print 'WARNING: could not find the include/ dir' + print('WARNING: could not find the include/ dir') +os.chdir(olddir) +if not os.path.exists(lib_dir): + os.mkdir(lib_dir) +os.chdir(lib_dir) +untar(pypy_latest, '*/lib/*') +os.chdir(olddir) + diff -Nru pypy-7.1.1+dfsg/pypy/goal/targetpypystandalone.py pypy-7.3.1+dfsg/pypy/goal/targetpypystandalone.py --- pypy-7.1.1+dfsg/pypy/goal/targetpypystandalone.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/goal/targetpypystandalone.py 2020-04-10 19:28:40.000000000 +0000 @@ -328,10 +328,10 @@ translate.log_config(config.objspace, "PyPy config object") # obscure hack to stuff the translation options into the translated PyPy - import pypy.module.sys + from pypy.module.sys.moduledef import Module as SysModule options = make_dict(config) - wrapstr = 'space.wrap(%r)' % (options) # import time - pypy.module.sys.Module.interpleveldefs['pypy_translation_info'] = wrapstr + wrapstr = 'space.wrap(%r)' % (options) # import time + SysModule.interpleveldefs['pypy_translation_info'] = wrapstr if config.objspace.usemodules._cffi_backend: self.hack_for_cffi_modules(driver) @@ -349,9 +349,14 @@ @taskdef([compile_goal], "Create cffi bindings for modules") def task_build_cffi_imports(self): ''' Use cffi to compile cffi interfaces to modules''' - filename = os.path.join(pypydir, 'tool', 'build_cffi_imports.py') + filename = os.path.join(pypydir, '..', 'lib_pypy', 'tools', + 'build_cffi_imports.py') + if sys.platform == 'darwin': + argv = [filename, '--embed-dependencies'] + else: + argv = [filename,] status, out, err = run_subprocess(str(driver.compute_exe_name()), - [filename]) + argv) sys.stdout.write(out) sys.stderr.write(err) # otherwise, ignore errors diff -Nru pypy-7.1.1+dfsg/pypy/interpreter/app_main.py pypy-7.3.1+dfsg/pypy/interpreter/app_main.py --- pypy-7.1.1+dfsg/pypy/interpreter/app_main.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/interpreter/app_main.py 2020-04-10 19:28:40.000000000 +0000 @@ -226,6 +226,8 @@ print ' turn off the JIT' print ' help' print ' print this page' + print + print 'The "pypyjit" module can be used to control the JIT from inside python' def print_version(*args): print >> sys.stderr, "Python", sys.version diff -Nru pypy-7.1.1+dfsg/pypy/interpreter/astcompiler/assemble.py pypy-7.3.1+dfsg/pypy/interpreter/astcompiler/assemble.py --- pypy-7.1.1+dfsg/pypy/interpreter/astcompiler/assemble.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/interpreter/astcompiler/assemble.py 2020-04-10 19:28:40.000000000 +0000 @@ -177,6 +177,7 @@ string_sort(scope.free_vars) # return free vars in alphabetical order self.free_vars = _list_to_dict(scope.free_vars, len(self.cell_vars)) self.w_consts = space.newdict() + self.consts_w = [] self.argcount = 0 self.lineno_set = False self.lineno = 0 @@ -243,62 +244,27 @@ container[name] = index return index - def add_const(self, obj): + def add_const(self, w_obj): """Add a W_Root to the constant array and return its location.""" space = self.space - # To avoid confusing equal but separate types, we hash store the type - # of the constant in the dictionary. Moreover, we have to keep the - # difference between -0.0 and 0.0 floats, and this recursively in - # tuples. - w_key = self._make_key(obj) + if isinstance(w_obj, PyCode): + # unlike CPython, never share code objects, it's pointless + w_key = space.id(w_obj) + else: + w_key = PyCode.const_comparison_key(self.space, w_obj) w_len = space.finditem(self.w_consts, w_key) - if w_len is None: - w_len = space.len(self.w_consts) - space.setitem(self.w_consts, w_key, w_len) - if space.int_w(w_len) == 0: + if w_len is not None: + length = space.int_w(w_len) + else: + length = len(self.consts_w) + w_obj = misc.intern_if_common_string(space, w_obj) + self.consts_w.append(w_obj) + space.setitem(self.w_consts, w_key, space.newint(length)) + if length == 0: self.scope.doc_removable = False - return space.int_w(w_len) + return length - def _make_key(self, obj): - # see the tests 'test_zeros_not_mixed*' in ../test/test_compiler.py - space = self.space - w_type = space.type(obj) - if space.is_w(w_type, space.w_float): - val = space.float_w(obj) - if val == 0.0 and math.copysign(1., val) < 0: - w_key = space.newtuple([obj, space.w_float, space.w_None]) - else: - w_key = space.newtuple([obj, space.w_float]) - elif space.is_w(w_type, space.w_complex): - w_real = space.getattr(obj, space.newtext("real")) - w_imag = space.getattr(obj, space.newtext("imag")) - real = space.float_w(w_real) - imag = space.float_w(w_imag) - real_negzero = (real == 0.0 and - math.copysign(1., real) < 0) - imag_negzero = (imag == 0.0 and - math.copysign(1., imag) < 0) - if real_negzero and imag_negzero: - tup = [obj, space.w_complex, space.w_None, space.w_None, - space.w_None] - elif imag_negzero: - tup = [obj, space.w_complex, space.w_None, space.w_None] - elif real_negzero: - tup = [obj, space.w_complex, space.w_None] - else: - tup = [obj, space.w_complex] - w_key = space.newtuple(tup) - elif space.is_w(w_type, space.w_tuple): - result_w = [obj, w_type] - for w_item in space.fixedview(obj): - result_w.append(self._make_key(w_item)) - w_key = space.newtuple(result_w[:]) - elif isinstance(obj, PyCode): - w_key = space.newtuple([obj, w_type, space.id(obj)]) - else: - w_key = space.newtuple([obj, w_type]) - return w_key def load_const(self, obj): index = self.add_const(obj) @@ -365,26 +331,6 @@ else: last_extended_arg_count = extended_arg_count - def _build_consts_array(self): - """Turn the applevel constants dictionary into a list.""" - w_consts = self.w_consts - space = self.space - consts_w = [space.w_None] * space.len_w(w_consts) - w_iter = space.iter(w_consts) - first = space.newint(0) - while True: - try: - w_key = space.next(w_iter) - except OperationError as e: - if not e.match(space, space.w_StopIteration): - raise - break - w_index = space.getitem(w_consts, w_key) - w_constant = space.getitem(w_key, first) - w_constant = misc.intern_if_common_string(space, w_constant) - consts_w[space.int_w(w_index)] = w_constant - return consts_w - def _get_code_flags(self): """Get an extra flags that should be attached to the code object.""" raise NotImplementedError @@ -509,7 +455,7 @@ self._resolve_block_targets(blocks) lnotab = self._build_lnotab(blocks) stack_depth = self._stacksize(blocks) - consts_w = self._build_consts_array() + consts_w = self.consts_w[:] names = _list_from_dict(self.names) var_names = _list_from_dict(self.var_names) cell_names = _list_from_dict(self.cell_vars) diff -Nru pypy-7.1.1+dfsg/pypy/interpreter/astcompiler/astbuilder.py pypy-7.3.1+dfsg/pypy/interpreter/astcompiler/astbuilder.py --- pypy-7.1.1+dfsg/pypy/interpreter/astcompiler/astbuilder.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/interpreter/astcompiler/astbuilder.py 2020-04-10 19:28:40.000000000 +0000 @@ -106,7 +106,8 @@ def error(self, msg, n): """Raise a SyntaxError with the lineno and column set to n's.""" raise SyntaxError(msg, n.get_lineno(), n.get_column(), - filename=self.compile_info.filename) + filename=self.compile_info.filename, + text=n.get_line()) def error_ast(self, msg, ast_node): raise SyntaxError(msg, ast_node.lineno, ast_node.col_offset, diff -Nru pypy-7.1.1+dfsg/pypy/interpreter/astcompiler/test/apptest_misc.py pypy-7.3.1+dfsg/pypy/interpreter/astcompiler/test/apptest_misc.py --- pypy-7.1.1+dfsg/pypy/interpreter/astcompiler/test/apptest_misc.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/interpreter/astcompiler/test/apptest_misc.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,18 @@ +def test_warning_to_error_translation(): + import warnings + statement = """\ +def wrong1(): + a = 1 + b = 2 + global a + global b +""" + with warnings.catch_warnings(): + warnings.filterwarnings("error", module="") + try: + compile(statement, '', 'exec') + except SyntaxError as err: + assert err.lineno is not None + assert err.filename is not None + assert err.offset is not None + assert err.message is not None diff -Nru pypy-7.1.1+dfsg/pypy/interpreter/astcompiler/test/test_astbuilder.py pypy-7.3.1+dfsg/pypy/interpreter/astcompiler/test/test_astbuilder.py --- pypy-7.1.1+dfsg/pypy/interpreter/astcompiler/test/test_astbuilder.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/interpreter/astcompiler/test/test_astbuilder.py 2020-04-10 19:28:40.000000000 +0000 @@ -2,7 +2,7 @@ import random import string import sys -import py +import pytest from pypy.interpreter.baseobjspace import W_Root from pypy.interpreter.pyparser import pyparse from pypy.interpreter.pyparser.error import SyntaxError @@ -166,7 +166,9 @@ assert a1.asname is None assert a2.name == "y" assert a2.asname == "w" - exc = py.test.raises(SyntaxError, self.get_ast, "import x a b").value + with pytest.raises(SyntaxError) as excinfo: + self.get_ast("import x a b") + assert excinfo.value.text == "import x a b\n" def test_from_import(self): im = self.get_first_stmt("from x import y") @@ -211,12 +213,18 @@ assert a1.asname == "b" assert a2.name == "w" assert a2.asname is None + input = "from x import y a b" - exc = py.test.raises(SyntaxError, self.get_ast, input).value + with pytest.raises(SyntaxError) as excinfo: + self.get_ast(input) + assert excinfo.value.text == input + "\n" + input = "from x import a, b," - exc = py.test.raises(SyntaxError, self.get_ast, input).value - assert exc.msg == "trailing comma is only allowed with surronding " \ + with pytest.raises(SyntaxError) as excinfo: + self.get_ast(input) + assert excinfo.value.msg == "trailing comma is only allowed with surronding " \ "parenthesis" + assert excinfo.value.text == input + "\n" def test_global(self): glob = self.get_first_stmt("global x") @@ -444,7 +452,8 @@ assert wi.optional_vars.ctx == ast.Store assert wi.optional_vars.elts[0].ctx == ast.Store input = "with x hi y: pass" - exc = py.test.raises(SyntaxError, self.get_ast, input).value + with pytest.raises(SyntaxError) as excinfo: + self.get_ast(input) wi = self.get_first_stmt("with x as y, b: pass") assert isinstance(wi, ast.With) assert isinstance(wi.context_expr, ast.Name) @@ -568,11 +577,13 @@ assert args.vararg == "e" assert args.kwarg == "f" input = "def f(a=b, c): pass" - exc = py.test.raises(SyntaxError, self.get_ast, input).value - assert exc.msg == "non-default argument follows default argument" + with pytest.raises(SyntaxError) as excinfo: + self.get_ast(input) + assert excinfo.value.msg == "non-default argument follows default argument" input = "def f((x)=23): pass" - exc = py.test.raises(SyntaxError, self.get_ast, input).value - assert exc.msg == "parenthesized arg with default" + with pytest.raises(SyntaxError) as excinfo: + self.get_ast(input) + assert excinfo.value.msg == "parenthesized arg with default" def test_decorators(self): to_examine = (("def f(): pass", ast.FunctionDef), @@ -761,8 +772,9 @@ for ctx_type, template in test_contexts: for expr, type_str in invalid_stores: input = template % (expr,) - exc = py.test.raises(SyntaxError, self.get_ast, input).value - assert exc.msg == "can't %s %s" % (ctx_type, type_str) + with pytest.raises(SyntaxError) as excinfo: + self.get_ast(input) + assert excinfo.value.msg == "can't %s %s" % (ctx_type, type_str) def test_assignment_to_forbidden_names(self): invalid = ( @@ -785,8 +797,9 @@ for name in ("None", "__debug__"): for template in invalid: input = template % (name,) - exc = py.test.raises(SyntaxError, self.get_ast, input).value - assert exc.msg == "cannot assign to %s" % (name,) + with pytest.raises(SyntaxError) as excinfo: + self.get_ast(input) + assert excinfo.value.msg == "cannot assign to %s" % (name,) # This is ok. self.get_ast("from None import x") self.get_ast("from x import None as y") @@ -811,8 +824,9 @@ assert len(lam.args.defaults) == 1 assert isinstance(lam.args.defaults[0], ast.Name) input = "f(lambda x: x[0] = y)" - exc = py.test.raises(SyntaxError, self.get_ast, input).value - assert exc.msg == "lambda cannot contain assignment" + with pytest.raises(SyntaxError) as excinfo: + self.get_ast(input) + assert excinfo.value.msg == "lambda cannot contain assignment" def test_ifexp(self): ifexp = self.get_first_expr("x if y else g") @@ -980,18 +994,18 @@ assert len(call.args) == 1 assert isinstance(call.args[0], ast.GeneratorExp) input = "f(x for x in y, 1)" - exc = py.test.raises(SyntaxError, self.get_ast, input).value + exc = pytest.raises(SyntaxError, self.get_ast, input).value assert exc.msg == "Generator expression must be parenthesized if not " \ "sole argument" many_args = ", ".join("x%i" % i for i in range(256)) input = "f(%s)" % (many_args,) - exc = py.test.raises(SyntaxError, self.get_ast, input).value + exc = pytest.raises(SyntaxError, self.get_ast, input).value assert exc.msg == "more than 255 arguments" - exc = py.test.raises(SyntaxError, self.get_ast, "f((a+b)=c)").value + exc = pytest.raises(SyntaxError, self.get_ast, "f((a+b)=c)").value assert exc.msg == "keyword can't be an expression" - exc = py.test.raises(SyntaxError, self.get_ast, "f(a=c, a=d)").value + exc = pytest.raises(SyntaxError, self.get_ast, "f(a=c, a=d)").value assert exc.msg == "keyword argument repeated" - exc = py.test.raises(SyntaxError, self.get_ast, "f(x, *a, b)").value + exc = pytest.raises(SyntaxError, self.get_ast, "f(x, *a, b)").value assert exc.msg == "only named arguments may follow *expression" def test_attribute(self): @@ -1150,9 +1164,9 @@ for num in ("0b00101", "0B00101", "0b101", "0B101"): assert space.eq_w(get_num(num), space.wrap(5)) - py.test.raises(SyntaxError, self.get_ast, "0x") - py.test.raises(SyntaxError, self.get_ast, "0b") - py.test.raises(SyntaxError, self.get_ast, "0o") + pytest.raises(SyntaxError, self.get_ast, "0x") + pytest.raises(SyntaxError, self.get_ast, "0b") + pytest.raises(SyntaxError, self.get_ast, "0o") def check_comprehension(self, brackets, ast_type): def brack(s): @@ -1243,17 +1257,17 @@ def test_decode_error_in_string_literal(self): input = "u'\\x'" - exc = py.test.raises(SyntaxError, self.get_ast, input).value + exc = pytest.raises(SyntaxError, self.get_ast, input).value assert exc.msg == ("(unicode error) 'unicodeescape' codec can't decode" " bytes in position 0-1: truncated \\xXX escape") input = "u'\\x1'" - exc = py.test.raises(SyntaxError, self.get_ast, input).value + exc = pytest.raises(SyntaxError, self.get_ast, input).value assert exc.msg == ("(unicode error) 'unicodeescape' codec can't decode" " bytes in position 0-2: truncated \\xXX escape") def test_decode_error_in_string_literal_correct_line(self): input = "u'a' u'b'\\\n u'c' u'\\x'" - exc = py.test.raises(SyntaxError, self.get_ast, input).value + exc = pytest.raises(SyntaxError, self.get_ast, input).value assert exc.msg == ("(unicode error) 'unicodeescape' codec can't decode" " bytes in position 0-1: truncated \\xXX escape") assert exc.lineno == 2 diff -Nru pypy-7.1.1+dfsg/pypy/interpreter/astcompiler/test/test_misc.py pypy-7.3.1+dfsg/pypy/interpreter/astcompiler/test/test_misc.py --- pypy-7.1.1+dfsg/pypy/interpreter/astcompiler/test/test_misc.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/interpreter/astcompiler/test/test_misc.py 2020-04-10 19:28:40.000000000 +0000 @@ -12,23 +12,3 @@ assert mangle("__foo", "__Bar") == "_Bar__foo" assert mangle("__foo", "___") == "__foo" assert mangle("___foo", "__Bar") == "_Bar___foo" - -def app_test_warning_to_error_translation(): - import warnings - - with warnings.catch_warnings(): - warnings.filterwarnings("error", module="") - statement = """\ -def wrong1(): - a = 1 - b = 2 - global a - global b -""" - try: - compile(statement, '', 'exec') - except SyntaxError as err: - assert err.lineno is not None - assert err.filename is not None - assert err.offset is not None - assert err.message is not None diff -Nru pypy-7.1.1+dfsg/pypy/interpreter/baseobjspace.py pypy-7.3.1+dfsg/pypy/interpreter/baseobjspace.py --- pypy-7.1.1+dfsg/pypy/interpreter/baseobjspace.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/interpreter/baseobjspace.py 2020-04-10 19:28:40.000000000 +0000 @@ -22,9 +22,13 @@ __all__ = ['ObjSpace', 'OperationError', 'W_Root'] +def get_printable_location(greenkey): + return "unpackiterable [%s]" % (greenkey.iterator_greenkey_printable(), ) + unpackiterable_driver = jit.JitDriver(name='unpackiterable', - greens=['tp'], - reds=['items', 'w_iterator']) + greens=['greenkey'], + reds='auto', + get_printable_location=get_printable_location) class W_Root(object): @@ -369,23 +373,15 @@ return lst[:] return None + def iterator_greenkey(self, space): + """ Return something that can be used as a green key in jit drivers + that iterate over self. by default, it's just the type of self, but + custom iterators should override it. """ + return space.type(self) -class InterpIterable(object): - def __init__(self, space, w_iterable): - self.w_iter = space.iter(w_iterable) - self.space = space + def iterator_greenkey_printable(self): + return "?" - def __iter__(self): - return self - - def next(self): - space = self.space - try: - return space.next(self.w_iter) - except OperationError as e: - if not e.match(space, space.w_StopIteration): - raise - raise StopIteration class InternalSpaceCache(Cache): """A generic cache for an object space. Arbitrary information can @@ -419,6 +415,8 @@ @specialize.memo() def wrappable_class_name(Class): + if 'exact_class_applevel_name' in Class.__dict__: + return Class.exact_class_applevel_name try: return Class.typedef.name except AttributeError: @@ -520,13 +518,14 @@ return self.__class__.__name__ @not_rpython - def setbuiltinmodule(self, importname): + def setbuiltinmodule(self, pkgname): """load a lazy pypy/module and put it into sys.modules""" - if '.' in importname: - fullname = importname - importname = fullname.rsplit('.', 1)[1] + if '.' in pkgname: + fullname = "%s.moduledef" % (pkgname,) + importname = pkgname.rsplit('.', 1)[1] else: - fullname = "pypy.module.%s" % importname + fullname = "pypy.module.%s.moduledef" % pkgname + importname = pkgname Module = __import__(fullname, None, None, ["Module"]).Module @@ -623,22 +622,22 @@ def make_builtins(self): "only for initializing the space." - from pypy.module.exceptions import Module + from pypy.module.exceptions.moduledef import Module w_name = self.newtext('exceptions') self.exceptions_module = Module(self, w_name) self.exceptions_module.install() - from pypy.module.sys import Module - w_name = self.newtext('sys') - self.sys = Module(self, w_name) - self.sys.install() - - from pypy.module.imp import Module + from pypy.module.imp.moduledef import Module w_name = self.newtext('imp') mod = Module(self, w_name) mod.install() - from pypy.module.__builtin__ import Module + from pypy.module.sys.moduledef import Module + w_name = self.newtext('sys') + self.sys = Module(self, w_name) + self.sys.install() + + from pypy.module.__builtin__.moduledef import Module w_name = self.newtext('__builtin__') self.builtin = Module(self, w_name) w_builtin = self.wrap(self.builtin) @@ -966,9 +965,6 @@ expected_length) return lst_w[:] # make the resulting list resizable - def iteriterable(self, w_iterable): - return InterpIterable(self, w_iterable) - def _unpackiterable_unknown_length(self, w_iterator, w_iterable): """Unpack an iterable of unknown length into an interp-level list. @@ -979,11 +975,9 @@ except MemoryError: items = [] # it might have lied - tp = self.type(w_iterator) + greenkey = self.iterator_greenkey(w_iterator) while True: - unpackiterable_driver.jit_merge_point(tp=tp, - w_iterator=w_iterator, - items=items) + unpackiterable_driver.jit_merge_point(greenkey=greenkey) try: w_item = self.next(w_iterator) except OperationError as e: @@ -1106,9 +1100,10 @@ """ return None - def listview_utf8(self, w_list): - """ Return a list of unwrapped unicode out of a list of unicode. If the - argument is not a list or does not contain only unicode, return None. + def listview_ascii(self, w_list): + """ Return a list of unwrapped **ASCII** strings out of a list of + unicode. If the argument is not a list, does not contain only unicode, + or contains a unicode with non-ascii characters, return None. May return None anyway. """ return None @@ -2037,6 +2032,12 @@ finally: self.sys.track_resources = flag + def iterator_greenkey(self, w_iterable): + """ Return something that can be used as a green key in jit drivers + that iterate over self. by default, it's just the type of self, but + custom iterators should override it. """ + return w_iterable.iterator_greenkey(self) + class AppExecCache(SpaceCache): @not_rpython diff -Nru pypy-7.1.1+dfsg/pypy/interpreter/error.py pypy-7.3.1+dfsg/pypy/interpreter/error.py --- pypy-7.1.1+dfsg/pypy/interpreter/error.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/interpreter/error.py 2020-04-10 19:28:40.000000000 +0000 @@ -310,6 +310,9 @@ return space.w_None return tb + def got_any_traceback(self): + return self._application_traceback is not None + def set_traceback(self, traceback): """Set the current traceback.""" self._application_traceback = traceback @@ -468,8 +471,7 @@ return OperationError(exc, w_error) @specialize.arg(3) -def wrap_oserror2(space, e, w_filename=None, exception_name='w_OSError', - w_exception_class=None): +def wrap_oserror2(space, e, w_filename=None, w_exception_class=None): assert isinstance(e, OSError) if _WINDOWS and isinstance(e, WindowsError): @@ -485,7 +487,7 @@ except ValueError: msg = 'error %d' % errno if w_exception_class is None: - exc = getattr(space, exception_name) + exc = space.w_OSError else: exc = w_exception_class if w_filename is not None: @@ -497,15 +499,12 @@ return OperationError(exc, w_error) @specialize.arg(3) -def wrap_oserror(space, e, filename=None, exception_name='w_OSError', - w_exception_class=None): +def wrap_oserror(space, e, filename=None, w_exception_class=None): if filename is not None: return wrap_oserror2(space, e, space.newtext(filename), - exception_name=exception_name, w_exception_class=w_exception_class) else: return wrap_oserror2(space, e, None, - exception_name=exception_name, w_exception_class=w_exception_class) def exception_from_errno(space, w_type, errno): diff -Nru pypy-7.1.1+dfsg/pypy/interpreter/gateway.py pypy-7.3.1+dfsg/pypy/interpreter/gateway.py --- pypy-7.1.1+dfsg/pypy/interpreter/gateway.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/interpreter/gateway.py 2020-04-10 19:28:40.000000000 +0000 @@ -709,6 +709,7 @@ self.func__args__ = func elif unwrap_spec == [self_type, ObjSpace, Arguments]: self.__class__ = BuiltinCodePassThroughArguments1 + self.descr_reqcls = self_type miniglobals = {'func': func, 'self_type': self_type} d = {} source = """if 1: @@ -754,10 +755,7 @@ except DescrMismatch: if w_obj is not None: args = args.prepend(w_obj) - return scope_w[0].descr_call_mismatch(space, - self.descrmismatch_op, - self.descr_reqcls, - args) + return self._type_unwrap_mismatch(space, args) except Exception as e: self.handle_exception(space, e) w_result = None @@ -765,6 +763,15 @@ w_result = space.w_None return w_result + def _type_unwrap_mismatch(self, space, args): + w_obj = args.firstarg() + if w_obj is None: + raise oefmt(space.w_SystemError, "unexpected DescrMismatch error") + return w_obj.descr_call_mismatch(space, + self.descrmismatch_op, + self.descr_reqcls, + args) + def handle_exception(self, space, e): try: if not we_are_translated(): @@ -787,10 +794,7 @@ try: w_result = self.func__args__(space, args) except DescrMismatch: - return args.firstarg().descr_call_mismatch(space, - self.descrmismatch_op, - self.descr_reqcls, - args) + return self._type_unwrap_mismatch(space, args) except Exception as e: self.handle_exception(space, e) w_result = None @@ -808,10 +812,7 @@ try: w_result = self.func__args__(space, w_obj, args) except DescrMismatch: - return args.firstarg().descr_call_mismatch(space, - self.descrmismatch_op, - self.descr_reqcls, - args.prepend(w_obj)) + return self._type_unwrap_mismatch(space, args.prepend(w_obj)) except Exception as e: self.handle_exception(space, e) w_result = None @@ -851,9 +852,7 @@ try: w_result = self.fastfunc_1(space, w1) except DescrMismatch: - return w1.descr_call_mismatch(space, - self.descrmismatch_op, - self.descr_reqcls, + return self._type_unwrap_mismatch(space, Arguments(space, [w1])) except Exception as e: self.handle_exception(space, e) @@ -877,9 +876,7 @@ try: w_result = self.fastfunc_2(space, w1, w2) except DescrMismatch: - return w1.descr_call_mismatch(space, - self.descrmismatch_op, - self.descr_reqcls, + return self._type_unwrap_mismatch(space, Arguments(space, [w1, w2])) except Exception as e: self.handle_exception(space, e) @@ -904,9 +901,7 @@ try: w_result = self.fastfunc_3(space, w1, w2, w3) except DescrMismatch: - return w1.descr_call_mismatch(space, - self.descrmismatch_op, - self.descr_reqcls, + return self._type_unwrap_mismatch(space, Arguments(space, [w1, w2, w3])) except Exception as e: self.handle_exception(space, e) @@ -932,9 +927,7 @@ try: w_result = self.fastfunc_4(space, w1, w2, w3, w4) except DescrMismatch: - return w1.descr_call_mismatch(space, - self.descrmismatch_op, - self.descr_reqcls, + return self._type_unwrap_mismatch(space, Arguments(space, [w1, w2, w3, w4])) except Exception as e: diff -Nru pypy-7.1.1+dfsg/pypy/interpreter/generator.py pypy-7.3.1+dfsg/pypy/interpreter/generator.py --- pypy-7.1.1+dfsg/pypy/interpreter/generator.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/interpreter/generator.py 2020-04-10 19:28:40.000000000 +0000 @@ -231,6 +231,9 @@ self.frame = None rgc.may_ignore_finalizer(self) + def iterator_greenkey(self, space): + return self.pycode + def get_printable_location_genentry(bytecode): return '%s ' % (bytecode.get_repr(),) diff -Nru pypy-7.1.1+dfsg/pypy/interpreter/main.py pypy-7.3.1+dfsg/pypy/interpreter/main.py --- pypy-7.1.1+dfsg/pypy/interpreter/main.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/interpreter/main.py 2020-04-10 19:28:40.000000000 +0000 @@ -32,7 +32,7 @@ try: if space is None: - from pypy.objspace.std import StdObjSpace + from pypy.objspace.std.objspace import StdObjSpace space = StdObjSpace() pycode = compilecode(space, source, filename or '', cmd) @@ -79,7 +79,7 @@ implementation. """ if space is None: - from pypy.objspace.std import StdObjSpace + from pypy.objspace.std.objspace import StdObjSpace space = StdObjSpace() argv = [module_name] if args is not None: diff -Nru pypy-7.1.1+dfsg/pypy/interpreter/mixedmodule.py pypy-7.3.1+dfsg/pypy/interpreter/mixedmodule.py --- pypy-7.1.1+dfsg/pypy/interpreter/mixedmodule.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/interpreter/mixedmodule.py 2020-04-10 19:28:40.000000000 +0000 @@ -28,17 +28,21 @@ @not_rpython def install(self): - """install this module, and it's submodules into + """Install this module, and its submodules into space.builtin_modules""" Module.install(self) if hasattr(self, "submodules"): space = self.space - name = space.unwrap(self.w_name) + pkgname = space.text_w(self.w_name) for sub_name, module_cls in self.submodules.iteritems(): if module_cls.submodule_name is None: module_cls.submodule_name = sub_name - module_name = space.newtext("%s.%s" % (name, sub_name)) - m = module_cls(space, module_name) + else: + assert module_cls.submodule_name == sub_name + name = "%s.%s" % (pkgname, sub_name) + module_cls.applevel_name = name + w_name = space.newtext(name) + m = module_cls(space, w_name) m.install() self.submodules_w.append(m) @@ -70,8 +74,7 @@ if cls.applevel_name is not None: return cls.applevel_name else: - pkgroot = cls.__module__ - return pkgroot.split('.')[-1] + return cls.__module__.split('.')[-2] def get(self, name): space = self.space @@ -140,10 +143,8 @@ # build a constant dictionary out of # applevel/interplevel definitions cls.loaders = loaders = {} - pkgroot = cls.__module__ + pkgroot = cls.__module__.rsplit('.', 1)[0] appname = cls.get_applevel_name() - if cls.submodule_name is not None: - appname += '.%s' % (cls.submodule_name,) for name, spec in cls.interpleveldefs.items(): loaders[name] = getinterpevalloader(pkgroot, spec) for name, spec in cls.appleveldefs.items(): @@ -154,7 +155,7 @@ def extra_interpdef(self, name, spec): cls = self.__class__ - pkgroot = cls.__module__ + pkgroot = cls.__module__.rsplit('.', 1)[0] loader = getinterpevalloader(pkgroot, spec) space = self.space w_obj = loader(space) diff -Nru pypy-7.1.1+dfsg/pypy/interpreter/nestedscope.py pypy-7.3.1+dfsg/pypy/interpreter/nestedscope.py --- pypy-7.1.1+dfsg/pypy/interpreter/nestedscope.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/interpreter/nestedscope.py 2020-04-10 19:28:40.000000000 +0000 @@ -1,4 +1,5 @@ from rpython.tool.uid import uid +from rpython.rlib import jit from pypy.interpreter.baseobjspace import W_Root from pypy.interpreter.error import oefmt @@ -8,24 +9,39 @@ class Cell(W_Root): "A simple container for a wrapped value." - def __init__(self, w_value=None): - self.w_value = w_value - - def clone(self): - return self.__class__(self.w_value) + _immutable_fields_ = ['family'] - def empty(self): - return self.w_value is None + def __init__(self, w_value, family): + self.w_value = w_value + self.family = family def get(self): + if jit.isconstant(self): + # ever_mutated is False if we never see a transition from not-None to + # not-None. That means _elidable_get might return an out-of-date + # None, and by now the cell was to, with a not-None. So if we see a + # None, we don't return that and instead read self.w_value in the + # code below. + if not self.family.ever_mutated: + w_res = self._elidable_get() + if w_res is not None: + return w_res if self.w_value is None: raise ValueError("get() from an empty cell") return self.w_value + @jit.elidable + def _elidable_get(self): + return self.w_value + def set(self, w_value): + if not self.family.ever_mutated and self.w_value is not None: + self.family.ever_mutated = True self.w_value = w_value def delete(self): + if not self.family.ever_mutated: + self.family.ever_mutated = True if self.w_value is None: raise ValueError("delete() on an empty cell") self.w_value = None @@ -79,3 +95,10 @@ return self.get() except ValueError: raise oefmt(space.w_ValueError, "Cell is empty") + +class CellFamily(object): + _immutable_fields_ = ['ever_mutated?'] + + def __init__(self, name): + self.name = name + self.ever_mutated = False diff -Nru pypy-7.1.1+dfsg/pypy/interpreter/pycode.py pypy-7.3.1+dfsg/pypy/interpreter/pycode.py --- pypy-7.1.1+dfsg/pypy/interpreter/pycode.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/interpreter/pycode.py 2020-04-10 19:28:40.000000000 +0000 @@ -15,7 +15,7 @@ CO_GENERATOR, CO_KILL_DOCSTRING, CO_YIELD_INSIDE_TRY) from pypy.tool.stdlib_opcode import opcodedesc, HAVE_ARGUMENT from rpython.rlib.rarithmetic import intmask, r_longlong -from rpython.rlib.objectmodel import compute_hash +from rpython.rlib.objectmodel import compute_hash, we_are_translated from rpython.rlib import jit from rpython.rlib.debug import debug_start, debug_stop, debug_print @@ -61,7 +61,9 @@ "co_firstlineno", "co_flags", "co_freevars[*]", "co_lnotab", "co_names_w[*]", "co_nlocals", "co_stacksize", "co_varnames[*]", - "_args_as_cellvars[*]", "w_globals?"] + "_args_as_cellvars[*]", + "w_globals?", + "cell_families[*]"] def __init__(self, space, argcount, nlocals, stacksize, flags, code, consts, names, varnames, filename, @@ -115,6 +117,7 @@ def _initialize(self): from pypy.objspace.std.mapdict import init_mapdict_cache + from pypy.interpreter.nestedscope import CellFamily if self.co_cellvars: argcount = self.co_argcount assert argcount >= 0 # annotator hint @@ -122,31 +125,14 @@ argcount += 1 if self.co_flags & CO_VARKEYWORDS: argcount += 1 - # Cell vars could shadow already-set arguments. - # The compiler used to be clever about the order of - # the variables in both co_varnames and co_cellvars, but - # it no longer is for the sake of simplicity. Moreover - # code objects loaded from CPython don't necessarily follow - # an order, which could lead to strange bugs if .pyc files - # produced by CPython are loaded by PyPy. Note that CPython - # contains the following bad-looking nested loops at *every* - # function call! - - # Precompute what arguments need to be copied into cellvars - args_as_cellvars = [] argvars = self.co_varnames cellvars = self.co_cellvars - for i in range(len(cellvars)): - cellname = cellvars[i] - for j in range(argcount): - if cellname == argvars[j]: - # argument j has the same name as the cell var i - while len(args_as_cellvars) <= i: - args_as_cellvars.append(-1) # pad - args_as_cellvars[i] = j - self._args_as_cellvars = args_as_cellvars[:] + args_as_cellvars = _compute_args_as_cellvars(argvars, cellvars, argcount) + self._args_as_cellvars = args_as_cellvars + self.cell_families = [CellFamily(name) for name in cellvars] else: self._args_as_cellvars = [] + self.cell_families = [] self._compute_flatcall() @@ -340,7 +326,7 @@ return space.w_False for i in range(len(self.co_consts_w)): - if not space.eq_w(self.co_consts_w[i], w_other.co_consts_w[i]): + if not _code_const_eq(space, self.co_consts_w[i], w_other.co_consts_w[i]): return space.w_False return space.w_True @@ -360,9 +346,14 @@ for w_name in self.co_names_w: w_result = space.xor(w_result, space.hash(w_name)) for w_const in self.co_consts_w: - w_result = space.xor(w_result, space.hash(w_const)) + w_key = self.const_comparison_key(space, w_const) + w_result = space.xor(w_result, space.hash(w_key)) return w_result + @staticmethod + def const_comparison_key(space, w_obj): + return _convert_const(space, w_obj) + @unwrap_spec(argcount=int, nlocals=int, stacksize=int, flags=int, codestring='bytes', filename='text', name='text', firstlineno=int, @@ -425,8 +416,70 @@ return "" % ( self.co_name, self.co_filename, self.co_firstlineno) + def iterator_greenkey_printable(self): + return self.get_repr() + def __repr__(self): return self.get_repr() def repr(self, space): return space.newtext(self.get_repr()) + +def _compute_args_as_cellvars(varnames, cellvars, argcount): + # Cell vars could shadow already-set arguments. + # The compiler used to be clever about the order of + # the variables in both co_varnames and co_cellvars, but + # it no longer is for the sake of simplicity. Moreover + # code objects loaded from CPython don't necessarily follow + # an order, which could lead to strange bugs if .pyc files + # produced by CPython are loaded by PyPy. Note that CPython + # contains the following bad-looking nested loops at *every* + # function call! + + # Precompute what arguments need to be copied into cellvars + args_as_cellvars = [] + for i in range(len(cellvars)): + cellname = cellvars[i] + for j in range(argcount): + if cellname == varnames[j]: + # argument j has the same name as the cell var i + while len(args_as_cellvars) < i: + args_as_cellvars.append(-1) # pad + args_as_cellvars.append(j) + last_arg_cellarg = i + return args_as_cellvars[:] + + +def _code_const_eq(space, w_a, w_b): + # this is a mess! CPython has complicated logic for this. essentially this + # is supposed to be a "strong" equal, that takes types and signs of numbers + # into account, quite similar to how PyPy's 'is' behaves, but recursively + # in tuples and frozensets as well. Since PyPy already implements these + # rules correctly for ints, floats, bools, complex in 'is' and 'id', just + # use those. + return space.eq_w(_convert_const(space, w_a), _convert_const(space, w_b)) + +def _convert_const(space, w_a): + # use id to convert constants. for tuples and frozensets use tuples and + # frozensets of converted contents. + w_type = space.type(w_a) + if space.is_w(w_type, space.w_unicode): + # unicodes are supposed to compare by value, but not equal to bytes + return space.newtuple([w_type, w_a]) + if space.is_w(w_type, space.w_bytes): + # and vice versa + return space.newtuple([w_type, w_a]) + if type(w_a) is PyCode: + return w_a + # for tuples and frozensets convert recursively + if space.is_w(w_type, space.w_tuple): + elements_w = [_convert_const(space, w_x) + for w_x in space.unpackiterable(w_a)] + return space.newtuple(elements_w) + if space.is_w(w_type, space.w_frozenset): + elements_w = [_convert_const(space, w_x) + for w_x in space.unpackiterable(w_a)] + return space.newfrozenset(elements_w) + # use id for the rest + return space.id(w_a) + diff -Nru pypy-7.1.1+dfsg/pypy/interpreter/pycompiler.py pypy-7.3.1+dfsg/pypy/interpreter/pycompiler.py --- pypy-7.1.1+dfsg/pypy/interpreter/pycompiler.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/interpreter/pycompiler.py 2020-04-10 19:28:40.000000000 +0000 @@ -125,13 +125,13 @@ info = pyparse.CompileInfo(filename, mode, flags, future_pos) return self._compile_ast(node, info) - def _compile_ast(self, node, info): + def _compile_ast(self, node, info, source=None): space = self.space try: mod = optimize.optimize_ast(space, node, info) code = codegen.compile_ast(space, mod, info) except parseerror.SyntaxError as e: - raise OperationError(space.w_SyntaxError, e.wrap_info(space)) + raise OperationError(space.w_SyntaxError, e.find_sourceline_and_wrap_info(space, source)) return code def compile_to_ast(self, source, filename, mode, flags): @@ -144,13 +144,13 @@ parse_tree = self.parser.parse_source(source, info) mod = astbuilder.ast_from_node(space, parse_tree, info) except parseerror.IndentationError as e: - raise OperationError(space.w_IndentationError, e.wrap_info(space)) + raise OperationError(space.w_IndentationError, e.find_sourceline_and_wrap_info(space)) except parseerror.SyntaxError as e: - raise OperationError(space.w_SyntaxError, e.wrap_info(space)) + raise OperationError(space.w_SyntaxError, e.find_sourceline_and_wrap_info(space, source)) return mod def compile(self, source, filename, mode, flags, hidden_applevel=False): info = pyparse.CompileInfo(filename, mode, flags, hidden_applevel=hidden_applevel) mod = self._compile_to_ast(source, info) - return self._compile_ast(mod, info) + return self._compile_ast(mod, info, source) diff -Nru pypy-7.1.1+dfsg/pypy/interpreter/pyframe.py pypy-7.3.1+dfsg/pypy/interpreter/pyframe.py --- pypy-7.1.1+dfsg/pypy/interpreter/pyframe.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/interpreter/pyframe.py 2020-04-10 19:28:40.000000000 +0000 @@ -236,7 +236,8 @@ "an unexpected number of free variables") index = code.co_nlocals for i in range(ncellvars): - self.locals_cells_stack_w[index] = Cell() + self.locals_cells_stack_w[index] = Cell( + None, self.pycode.cell_families[i]) index += 1 for i in range(nfreevars): self.locals_cells_stack_w[index] = outer_func.closure[i] @@ -310,9 +311,12 @@ assert self.locals_cells_stack_w[depth] is None self.valuestackdepth = depth + 1 + def assert_stack_index(self, index): + if we_are_translated(): + return + assert self._check_stack_index(index) + def _check_stack_index(self, index): - # will be completely removed by the optimizer if only used in an assert - # and if asserts are disabled code = self.pycode ncellvars = len(code.co_cellvars) nfreevars = len(code.co_freevars) @@ -324,7 +328,7 @@ def popvalue_maybe_none(self): depth = self.valuestackdepth - 1 - assert self._check_stack_index(depth) + self.assert_stack_index(depth) assert depth >= 0 w_object = self.locals_cells_stack_w[depth] self.locals_cells_stack_w[depth] = None @@ -353,7 +357,7 @@ def peekvalues(self, n): values_w = [None] * n base = self.valuestackdepth - n - assert self._check_stack_index(base) + self.assert_stack_index(base) assert base >= 0 while True: n -= 1 @@ -366,7 +370,7 @@ def dropvalues(self, n): n = hint(n, promote=True) finaldepth = self.valuestackdepth - n - assert self._check_stack_index(finaldepth) + self.assert_stack_index(finaldepth) assert finaldepth >= 0 while True: n -= 1 @@ -402,14 +406,14 @@ def peekvalue_maybe_none(self, index_from_top=0): index_from_top = hint(index_from_top, promote=True) index = self.valuestackdepth + ~index_from_top - assert self._check_stack_index(index) + self.assert_stack_index(index) assert index >= 0 return self.locals_cells_stack_w[index] def settopvalue(self, w_object, index_from_top=0): index_from_top = hint(index_from_top, promote=True) index = self.valuestackdepth + ~index_from_top - assert self._check_stack_index(index) + self.assert_stack_index(index) assert index >= 0 self.locals_cells_stack_w[index] = ll_assert_not_none(w_object) diff -Nru pypy-7.1.1+dfsg/pypy/interpreter/pyopcode.py pypy-7.3.1+dfsg/pypy/interpreter/pyopcode.py --- pypy-7.1.1+dfsg/pypy/interpreter/pyopcode.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/interpreter/pyopcode.py 2020-04-10 19:28:40.000000000 +0000 @@ -147,10 +147,12 @@ while True: self.last_instr = intmask(next_instr) if jit.we_are_jitted(): - ec.bytecode_only_trace(self) + if self.debugdata: + ec.bytecode_only_trace(self) + next_instr = r_uint(self.last_instr) else: ec.bytecode_trace(self) - next_instr = r_uint(self.last_instr) + next_instr = r_uint(self.last_instr) opcode = ord(co_code[next_instr]) next_instr += 1 @@ -176,10 +178,13 @@ oparg = (oparg * 65536) | (hi * 256) | lo if opcode == opcodedesc.RETURN_VALUE.index: + if not self.blockstack_non_empty(): + self.frame_finished_execution = True # for generators + raise Return w_returnvalue = self.popvalue() block = self.unrollstack(SReturnValue.kind) if block is None: - self.pushvalue(w_returnvalue) # XXX ping pong + self.pushvalue(w_returnvalue) raise Return else: unroller = SReturnValue(w_returnvalue) @@ -832,8 +837,20 @@ w_metaclass = find_metaclass(self.space, w_bases, w_methodsdict, self.get_w_globals(), self.get_builtin()) - w_newclass = self.space.call_function(w_metaclass, w_name, - w_bases, w_methodsdict) + try: + w_newclass = self.space.call_function(w_metaclass, w_name, + w_bases, w_methodsdict) + except OperationError as e: + # give a more comprehensible error message for TypeErrors + if e.got_any_traceback(): + raise + if not e.match(self.space, self.space.w_TypeError): + raise + raise oefmt(self.space.w_TypeError, + "metaclass found to be '%N', but calling %R " + "with args (%R, %R, dict) raised %R", + w_metaclass, w_metaclass, w_name, w_bases, + e.get_w_value(self.space)) self.pushvalue(w_newclass) def STORE_NAME(self, varindex, next_instr): diff -Nru pypy-7.1.1+dfsg/pypy/interpreter/pyparser/error.py pypy-7.3.1+dfsg/pypy/interpreter/pyparser/error.py --- pypy-7.1.1+dfsg/pypy/interpreter/pyparser/error.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/interpreter/pyparser/error.py 2020-04-10 19:28:40.000000000 +0000 @@ -12,9 +12,18 @@ self.filename = filename self.lastlineno = lastlineno - def wrap_info(self, space): + def find_sourceline_and_wrap_info(self, space, source=None): + """ search for the line of input that caused the error and then return + a wrapped tuple that can be used to construct a wrapped SyntaxError. + Optionally pass source, to get better error messages for the case where + this instance was constructed without a source line (.text + attribute)""" + text = self.text + if text is None and source is not None and self.lineno: + lines = source.splitlines(True) + text = lines[self.lineno - 1] w_filename = space.newtext_or_none(self.filename) - w_text = space.newtext_or_none(self.text) + w_text = space.newtext_or_none(text) return space.newtuple([space.newtext(self.msg), space.newtuple([w_filename, space.newint(self.lineno), diff -Nru pypy-7.1.1+dfsg/pypy/interpreter/pyparser/parser.py pypy-7.3.1+dfsg/pypy/interpreter/pyparser/parser.py --- pypy-7.1.1+dfsg/pypy/interpreter/pyparser/parser.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/interpreter/pyparser/parser.py 2020-04-10 19:28:40.000000000 +0000 @@ -136,19 +136,24 @@ def get_column(self): raise NotImplementedError("abstract base class") + def get_line(self): + raise NotImplementedError("abstract base class") + class Terminal(Node): - __slots__ = ("value", "lineno", "column") - def __init__(self, type, value, lineno, column): + __slots__ = ("value", "lineno", "column", "line") + def __init__(self, type, value, lineno, column, line=None): Node.__init__(self, type) self.value = value self.lineno = lineno self.column = column + self.line = line @staticmethod def fromtoken(token): return Terminal( - token.token_type, token.value, token.lineno, token.column) + token.token_type, token.value, token.lineno, token.column, + token.line) def __repr__(self): return "Terminal(type=%s, value=%r)" % (self.type, self.value) @@ -168,6 +173,8 @@ def get_column(self): return self.column + def get_line(self): + return self.line class AbstractNonterminal(Node): __slots__ = () @@ -178,6 +185,9 @@ def get_column(self): return self.get_child(0).get_column() + def get_line(self): + return self.get_child(0).get_line() + def __eq__(self, other): # For tests. # grumble, annoying diff -Nru pypy-7.1.1+dfsg/pypy/interpreter/pyparser/pyparse.py pypy-7.3.1+dfsg/pypy/interpreter/pyparser/pyparse.py --- pypy-7.1.1+dfsg/pypy/interpreter/pyparser/pyparse.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/interpreter/pyparser/pyparse.py 2020-04-10 19:28:40.000000000 +0000 @@ -105,7 +105,7 @@ enc = 'utf-8' # If an encoding is explicitly given check that it is utf-8. decl_enc = _check_for_encoding(textsrc) - if decl_enc and decl_enc != "utf-8": + if decl_enc and _normalize_encoding(decl_enc) != "utf-8": raise error.SyntaxError("UTF-8 BOM with %s coding cookie" % decl_enc, filename=compile_info.filename) elif compile_info.flags & consts.PyCF_SOURCE_IS_UTF8: diff -Nru pypy-7.1.1+dfsg/pypy/interpreter/pyparser/test/test_parser.py pypy-7.3.1+dfsg/pypy/interpreter/pyparser/test/test_parser.py --- pypy-7.1.1+dfsg/pypy/interpreter/pyparser/test/test_parser.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/interpreter/pyparser/test/test_parser.py 2020-04-10 19:28:40.000000000 +0000 @@ -330,3 +330,13 @@ info = py.test.raises(parser.ParseError, p.parse, "if 42 42") info.value.expected_str == '+' + + def test_line_attached_to_terminal(self): + p, gram = self.parser_for( + "foo: 'if' NUMBER '+' NUMBER" + ) + input = "if 53 + 65" + tree = p.parse(input) + assert tree.get_child(0).line == input + "\n" + assert tree.get_line() == input + "\n" + diff -Nru pypy-7.1.1+dfsg/pypy/interpreter/pyparser/test/test_pyparse.py pypy-7.3.1+dfsg/pypy/interpreter/pyparser/test/test_pyparse.py --- pypy-7.1.1+dfsg/pypy/interpreter/pyparser/test/test_pyparse.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/interpreter/pyparser/test/test_pyparse.py 2020-04-10 19:28:40.000000000 +0000 @@ -56,6 +56,8 @@ input = "\xEF\xBB\xBF# coding: latin-1\nx" exc = py.test.raises(SyntaxError, self.parse, input).value assert exc.msg == "UTF-8 BOM with latin-1 coding cookie" + input = "\xEF\xBB\xBF# coding: UtF-8-yadda-YADDA\nx" + self.parse(input) # this does not raise input = "# coding: not-here" exc = py.test.raises(SyntaxError, self.parse, input).value assert exc.msg == "Unknown encoding: not-here" diff -Nru pypy-7.1.1+dfsg/pypy/interpreter/pyparser/test/unittest_samples.py pypy-7.3.1+dfsg/pypy/interpreter/pyparser/test/unittest_samples.py --- pypy-7.1.1+dfsg/pypy/interpreter/pyparser/test/unittest_samples.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/interpreter/pyparser/test/unittest_samples.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,95 +0,0 @@ -"""test module for CPython / PyPy nested tuples comparison""" - -import os, os.path as osp -import sys -from pypy.interpreter.pyparser.pythonutil import python_parse, pypy_parse -from pprint import pprint -from pypy.interpreter.pyparser import grammar -grammar.DEBUG = False -from symbol import sym_name - - -def name(elt): - return "%s[%s]"% (sym_name.get(elt,elt),elt) - -def read_samples_dir(): - return [osp.join('samples', fname) for fname in os.listdir('samples') if fname.endswith('.py')] - -def print_sym_tuple(nested, level=0, limit=15, names=False, trace=()): - buf = [] - if level <= limit: - buf.append("%s(" % (" "*level)) - else: - buf.append("(") - for index, elt in enumerate(nested): - # Test if debugging and if on last element of error path - if trace and not trace[1:] and index == trace[0]: - buf.append('\n----> ') - if type(elt) is int: - if names: - buf.append(name(elt)) - else: - buf.append(str(elt)) - buf.append(', ') - elif type(elt) is str: - buf.append(repr(elt)) - else: - if level < limit: - buf.append('\n') - buf.extend(print_sym_tuple(elt, level+1, limit, - names, trace[1:])) - buf.append(')') - return buf - -def assert_tuples_equal(tup1, tup2, curpos = ()): - for index, (elt1, elt2) in enumerate(zip(tup1, tup2)): - if elt1 != elt2: - if type(elt1) is tuple and type(elt2) is tuple: - assert_tuples_equal(elt1, elt2, curpos + (index,)) - raise AssertionError('Found difference at %s : %s != %s' % - (curpos, name(elt1), name(elt2) ), curpos) - -from time import time, clock -def test_samples( samples ): - time_reports = {} - for sample in samples: - print "testing", sample - tstart1, cstart1 = time(), clock() - pypy_tuples = pypy_parse(sample) - tstart2, cstart2 = time(), clock() - python_tuples = python_parse(sample) - time_reports[sample] = (time() - tstart2, tstart2-tstart1, clock() - cstart2, cstart2-cstart1 ) - #print "-"*10, "PyPy parse results", "-"*10 - #print ''.join(print_sym_tuple(pypy_tuples, names=True)) - #print "-"*10, "CPython parse results", "-"*10 - #print ''.join(print_sym_tuple(python_tuples, names=True)) - print - try: - assert_tuples_equal(pypy_tuples, python_tuples) - except AssertionError as e: - error_path = e.args[-1] - print "ERROR PATH =", error_path - print "="*80 - print file(sample).read() - print "="*80 - print "-"*10, "PyPy parse results", "-"*10 - print ''.join(print_sym_tuple(pypy_tuples, names=True, trace=error_path)) - print "-"*10, "CPython parse results", "-"*10 - print ''.join(print_sym_tuple(python_tuples, names=True, trace=error_path)) - print "Failed on (%s)" % sample - # raise - pprint(time_reports) - -if __name__=="__main__": - import getopt - opts, args = getopt.getopt( sys.argv[1:], "d:", [] ) - for opt, val in opts: - if opt == "-d": - pass -# set_debug(int(val)) - if args: - samples = args - else: - samples = read_samples_dir() - - test_samples( samples ) diff -Nru pypy-7.1.1+dfsg/pypy/interpreter/test/apptest_exec.py pypy-7.3.1+dfsg/pypy/interpreter/test/apptest_exec.py --- pypy-7.1.1+dfsg/pypy/interpreter/test/apptest_exec.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/interpreter/test/apptest_exec.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,245 @@ +"""Test the exec statement functionality. + +New for PyPy - Could be incorporated into CPython regression tests. +""" +import pytest + +def test_string(): + g = {} + l = {} + exec "a = 3" in g, l + assert l['a'] == 3 + +def test_localfill(): + g = {} + exec "a = 3" in g + assert g['a'] == 3 + +def test_builtinsupply(): + g = {} + exec "pass" in g + assert g.has_key('__builtins__') + +def test_invalidglobal(): + with pytest.raises(TypeError): + exec 'pass' in 1 + +def test_invalidlocal(): + with pytest.raises(TypeError): + exec 'pass' in {}, 2 + +def test_codeobject(): + co = compile("a = 3", '', 'exec') + g = {} + l = {} + exec co in g, l + assert l['a'] == 3 + +def test_implicit(): + a = 4 + exec "a = 3" + assert a == 3 + +def test_tuplelocals(): + g = {} + l = {} + exec ("a = 3", g, l) + assert l['a'] == 3 + +def test_tupleglobals(): + g = {} + exec ("a = 3", g) + assert g['a'] == 3 + +def test_exceptionfallthrough(): + with pytest.raises(TypeError): + exec 'raise TypeError' in {} + +def test_global_stmt(): + g = {} + l = {} + co = compile("global a; a=5", '', 'exec') + #import dis + #dis.dis(co) + exec co in g, l + assert l == {} + assert g['a'] == 5 + +def test_specialcase_free_load(): + exec """if 1: + def f(): + exec 'a=3' + return a + x = f()\n""" + assert x == 3 + +def test_specialcase_free_load2(): + exec """if 1: + def f(a): + exec 'a=3' + return a + x = f(4)\n""" + assert x == 3 + +def test_specialcase_globals_and_exec(): + d = {} + exec """if 1: + b = 2 + c = 3 + d = 4 + def f(a): + global b + exec 'd=42 ; b=7' + return a,b,c,d + #import dis + #dis.dis(f) + res = f(3)\n""" in d + r = d['res'] + assert r == (3,2,3,42) + +def test_nested_names_are_not_confused(): + def get_nested_class(): + method_and_var = "var" + class Test(object): + def method_and_var(self): + return "method" + def test(self): + return method_and_var + def actual_global(self): + return str("global") + def str(self): + return str(self) + return Test() + t = get_nested_class() + assert t.actual_global() == "global" + assert t.test() == 'var' + assert t.method_and_var() == 'method' + +def test_import_star_shadows_global(): + d = {'platform' : 3} + exec """if 1: + def f(): + from sys import * + return platform + res = f()\n""" in d + import sys + assert d['res'] == sys.platform + +def test_import_global_takes_precendence(): + d = {'platform' : 3} + exec """if 1: + def f(): + global platform + from sys import * + return platform + res = f()\n""" in d + import sys + assert d['platform'] == 3 + +def test_exec_load_name(): + d = {'x': 2} + exec """if 1: + def f(): + save = x + exec "x=3" + return x,save + \n""" in d + res = d['f']() + assert res == (3, 2) + +def test_space_bug(): + d = {} + exec "x=5 " in d + assert d['x'] == 5 + +def test_synerr(): + with pytest.raises(SyntaxError): + exec "1 2" + +def test_mapping_as_locals(): + import sys + if not hasattr(sys, 'pypy_objspaceclass'): + skip("need PyPy for non-dictionaries in exec statements") + class M(object): + def __getitem__(self, key): + return key + def __setitem__(self, key, value): + self.result[key] = value + def setdefault(self, key, value): + assert key == '__builtins__' + m = M() + m.result = {} + exec "x=m" in {}, m + assert m.result == {'x': 'm'} + exec "y=n" in m # NOTE: this doesn't work in CPython + assert m.result == {'x': 'm', 'y': 'n'} + +def test_filename(): + with pytest.raises(SyntaxError) as excinfo: + exec "'unmatched_quote" + assert excinfo.value.filename == '' + with pytest.raises(SyntaxError) as excinfo: + eval("'unmatched_quote") + assert excinfo.value.filename == '' + +def test_exec_and_name_lookups(): + ns = {} + exec """def f(): + exec 'x=1' in locals() + return x""" in ns + + f = ns['f'] + assert f() == 1 + +def test_exec_unicode(): + # 's' is a string + s = "x = u'\xd0\xb9\xd1\x86\xd1\x83\xd0\xba\xd0\xb5\xd0\xbd'" + # 'u' is a unicode + u = s.decode('utf-8') + exec u + assert len(x) == 6 + assert ord(x[0]) == 0x0439 + assert ord(x[1]) == 0x0446 + assert ord(x[2]) == 0x0443 + assert ord(x[3]) == 0x043a + assert ord(x[4]) == 0x0435 + assert ord(x[5]) == 0x043d + +def test_eval_unicode(): + u = "u'%s'" % unichr(0x1234) + v = eval(u) + assert v == unichr(0x1234) + +def test_compile_unicode(): + s = "x = u'\xd0\xb9\xd1\x86\xd1\x83\xd0\xba\xd0\xb5\xd0\xbd'" + u = s.decode('utf-8') + c = compile(u, '', 'exec') + exec c + assert len(x) == 6 + assert ord(x[0]) == 0x0439 + +def test_nested_qualified_exec(): + import sys + if sys.version_info < (2, 7, 9): + skip() + code = [""" +def g(): + def f(): + if True: + exec "" in {}, {} + """, """ +def g(): + def f(): + if True: + exec("", {}, {}) + """] + for c in code: + compile(c, "", "exec") + +def test_exec_tuple(): + # note: this is VERY different than testing exec("a = 42", d), because + # this specific case is handled specially by the AST compiler + d = {} + x = ("a = 42", d) + exec x + assert d['a'] == 42 diff -Nru pypy-7.1.1+dfsg/pypy/interpreter/test/apptest_function.py pypy-7.3.1+dfsg/pypy/interpreter/test/apptest_function.py --- pypy-7.1.1+dfsg/pypy/interpreter/test/apptest_function.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/interpreter/test/apptest_function.py 2020-04-10 19:28:42.000000000 +0000 @@ -0,0 +1,616 @@ +import pytest +from pytest import raises, skip + +def test_attributes(): + globals()['__name__'] = 'mymodulename' + def f(): pass + assert hasattr(f, 'func_code') + assert f.func_defaults == None + f.func_defaults = None + assert f.func_defaults == None + assert f.func_dict == {} + assert type(f.func_globals) == dict + assert f.func_globals is f.__globals__ + assert f.func_closure is None + assert f.func_doc == None + assert f.func_name == 'f' + assert f.__module__ == 'mymodulename' + +def test_code_is_ok(): + def f(): pass + assert not hasattr(f.func_code, '__dict__') + +def test_underunder_attributes(): + def f(): pass + assert f.__name__ == 'f' + assert f.__doc__ == None + assert f.__name__ == f.func_name + assert f.__doc__ == f.func_doc + assert f.__dict__ is f.func_dict + assert f.__code__ is f.func_code + assert f.__defaults__ is f.func_defaults + assert hasattr(f, '__class__') + +def test_classmethod(): + def f(): + pass + assert classmethod(f).__func__ is f + assert staticmethod(f).__func__ is f + +def test_write_doc(): + def f(): "hello" + assert f.__doc__ == 'hello' + f.__doc__ = 'good bye' + assert f.__doc__ == 'good bye' + del f.__doc__ + assert f.__doc__ == None + +def test_write_func_doc(): + def f(): "hello" + assert f.func_doc == 'hello' + f.func_doc = 'good bye' + assert f.func_doc == 'good bye' + del f.func_doc + assert f.func_doc == None + +def test_write_module(): + def f(): "hello" + f.__module__ = 'ab.c' + assert f.__module__ == 'ab.c' + del f.__module__ + assert f.__module__ is None + +def test_new(): + def f(): return 42 + FuncType = type(f) + f2 = FuncType(f.func_code, f.func_globals, 'f2', None, None) + assert f2() == 42 + + def g(x): + def f(): + return x + return f + f = g(42) + with raises(TypeError): + FuncType(f.func_code, f.func_globals, 'f2', None, None) + +def test_write_code(): + def f(): + return 42 + def g(): + return 41 + assert f() == 42 + assert g() == 41 + with raises(TypeError): + f.func_code = 1 + f.func_code = g.func_code + assert f() == 41 + def h(): + return f() # a closure + with raises(ValueError): + f.func_code = h.func_code + +def test_write_code_builtin_forbidden(): + def f(*args): + return 42 + with raises(TypeError): + dir.func_code = f.func_code + with raises(TypeError): + list.append.im_func.func_code = f.func_code + +def test_set_name(): + def f(): pass + f.__name__ = 'g' + assert f.func_name == 'g' + with raises(TypeError): + f.__name__ = u'g' + + +def test_simple_call(): + def func(arg1, arg2): + return arg1, arg2 + res = func(23,42) + assert res[0] == 23 + assert res[1] == 42 + +def test_simple_call_default(): + def func(arg1, arg2=11, arg3=111): + return arg1, arg2, arg3 + res = func(1) + assert res[0] == 1 + assert res[1] == 11 + assert res[2] == 111 + res = func(1, 22) + assert res[0] == 1 + assert res[1] == 22 + assert res[2] == 111 + res = func(1, 22, 333) + assert res[0] == 1 + assert res[1] == 22 + assert res[2] == 333 + + with raises(TypeError): + func() + with raises(TypeError): + func(1, 2, 3, 4) + +def test_simple_varargs(): + def func(arg1, *args): + return arg1, args + res = func(23,42) + assert res[0] == 23 + assert res[1] == (42,) + + res = func(23, *(42,)) + assert res[0] == 23 + assert res[1] == (42,) + +def test_simple_kwargs(): + def func(arg1, **kwargs): + return arg1, kwargs + res = func(23, value=42) + assert res[0] == 23 + assert res[1] == {'value': 42} + + res = func(23, **{'value': 42}) + assert res[0] == 23 + assert res[1] == {'value': 42} + +def test_kwargs_sets_wrong_positional_raises(): + def func(arg1): + pass + with raises(TypeError): + func(arg2=23) + +def test_kwargs_sets_positional(): + def func(arg1): + return arg1 + res = func(arg1=42) + assert res == 42 + +def test_kwargs_sets_positional_mixed(): + def func(arg1, **kw): + return arg1, kw + res = func(arg1=42, something=23) + assert res[0] == 42 + assert res[1] == {'something': 23} + +def test_kwargs_sets_positional_twice(): + def func(arg1, **kw): + return arg1, kw + with raises(TypeError): + func(42, {'arg1': 23}) + +def test_kwargs_nondict_mapping(): + class Mapping: + def keys(self): + return ('a', 'b') + def __getitem__(self, key): + return key + def func(arg1, **kw): + return arg1, kw + res = func(23, **Mapping()) + assert res[0] == 23 + assert res[1] == {'a': 'a', 'b': 'b'} + with raises(TypeError) as excinfo: + func(42, **[]) + assert excinfo.value.message == ( + 'argument after ** must be a mapping, not list') + +def test_default_arg(): + def func(arg1,arg2=42): + return arg1, arg2 + res = func(arg1=23) + assert res[0] == 23 + assert res[1] == 42 + +def test_defaults_keyword_overrides(): + def func(arg1=42, arg2=23): + return arg1, arg2 + res = func(arg1=23) + assert res[0] == 23 + assert res[1] == 23 + +def test_defaults_keyword_override_but_leaves_empty_positional(): + def func(arg1,arg2=42): + return arg1, arg2 + with raises(TypeError): + func(arg2=23) + +def test_kwargs_disallows_same_name_twice(): + def func(arg1, **kw): + return arg1, kw + with raises(TypeError): + func(42, **{'arg1': 23}) + +def test_kwargs_bound_blind(): + class A(object): + def func(self, **kw): + return self, kw + func = A().func + with raises(TypeError): + func(self=23) + with raises(TypeError): + func(**{'self': 23}) + +def test_kwargs_confusing_name(): + def func(self): # 'self' conflicts with the interp-level + return self*7 # argument to call_function() + res = func(self=6) + assert res == 42 + +def test_get(): + def func(self): return self + obj = object() + meth = func.__get__(obj, object) + assert meth() == obj + +@pytest.mark.skipif(True, reason="XXX issue #2083") +def test_none_get_interaction(): + assert type(None).__repr__(None) == 'None' + +def test_none_get_interaction_2(): + f = None.__repr__ + assert f() == 'None' + +def test_no_get_builtin(): + assert not hasattr(dir, '__get__') + class A(object): + ord = ord + a = A() + assert a.ord('a') == 97 + +def test_builtin_as_special_method_is_not_bound(): + class A(object): + __getattr__ = len + a = A() + assert a.a == 1 + assert a.ab == 2 + assert a.abcdefghij == 10 + +def test_call_builtin(): + s = 'hello' + with raises(TypeError): + len() + assert len(s) == 5 + with raises(TypeError): + len(s, s) + with raises(TypeError): + len(s, s, s) + assert len(*[s]) == 5 + assert len(s, *[]) == 5 + with raises(TypeError): + len(some_unknown_keyword=s) + with raises(TypeError): + len(s, some_unknown_keyword=s) + with raises(TypeError): + len(s, s, some_unknown_keyword=s) + +def test_call_error_message(): + try: + len() + except TypeError as e: + assert "len() takes exactly 1 argument (0 given)" in e.message + else: + assert 0, "did not raise" + + try: + len(1, 2) + except TypeError as e: + assert "len() takes exactly 1 argument (2 given)" in e.message + else: + assert 0, "did not raise" + +def test_unicode_docstring(): + def f(): + u"hi" + assert f.__doc__ == u"hi" + assert type(f.__doc__) is unicode + +def test_issue1293(): + def f1(): "doc f1" + def f2(): "doc f2" + f1.func_code = f2.func_code + assert f1.__doc__ == "doc f1" + +def test_subclassing(): + # cannot subclass 'function' or 'builtin_function' + def f(): + pass + with raises(TypeError): + type('Foo', (type(f),), {}) + with raises(TypeError): + type('Foo', (type(len),), {}) + +def test_lambda_docstring(): + # Like CPython, (lambda:"foo") has a docstring of "foo". + # But let's not test that. Just test that (lambda:42) does not + # have 42 as docstring. + f = lambda: 42 + assert f.func_doc is None + +def test_setstate_called_with_wrong_args(): + f = lambda: 42 + # not sure what it should raise, since CPython doesn't have setstate + # on function types + with raises(ValueError): + type(f).__setstate__(f, (1, 2, 3)) + +def test_simple_call(): + class A(object): + def func(self, arg2): + return self, arg2 + a = A() + res = a.func(42) + assert res[0] is a + assert res[1] == 42 + +def test_simple_varargs(): + class A(object): + def func(self, *args): + return self, args + a = A() + res = a.func(42) + assert res[0] is a + assert res[1] == (42,) + + res = a.func(*(42,)) + assert res[0] is a + assert res[1] == (42,) + +def test_obscure_varargs(): + class A(object): + def func(*args): + return args + a = A() + res = a.func(42) + assert res[0] is a + assert res[1] == 42 + + res = a.func(*(42,)) + assert res[0] is a + assert res[1] == 42 + +def test_simple_kwargs(): + class A(object): + def func(self, **kwargs): + return self, kwargs + a = A() + + res = a.func(value=42) + assert res[0] is a + assert res[1] == {'value': 42} + + res = a.func(**{'value': 42}) + assert res[0] is a + assert res[1] == {'value': 42} + +def test_get(): + def func(self): return self + class Object(object): pass + obj = Object() + # Create bound method from function + obj.meth = func.__get__(obj, Object) + assert obj.meth() == obj + # Create bound method from method + meth2 = obj.meth.__get__(obj, Object) + assert meth2() == obj + +def test_get_get(): + # sanxiyn's test from email + def m(self): return self + class C(object): pass + class D(C): pass + C.m = m + D.m = C.m + c = C() + assert c.m() == c + d = D() + assert d.m() == d + +def test_method_eq(): + class C(object): + def m(): pass + c = C() + assert C.m == C.m + assert c.m == c.m + assert not (C.m == c.m) + assert not (c.m == C.m) + c2 = C() + assert (c.m == c2.m) is False + assert (c.m != c2.m) is True + assert (c.m != c.m) is False + +def test_method_hash(): + class C(object): + def m(): pass + class D(C): + pass + c = C() + assert hash(C.m) == hash(D.m) + assert hash(c.m) == hash(c.m) + +def test_method_repr(): + class A(object): + def f(self): + pass + assert repr(A.f) == "" + assert repr(A().f).startswith(">") + class B: + def f(self): + pass + assert repr(B.f) == "" + assert repr(B().f).startswith(">") + + assert repr(type(A.f)) == repr(type(A().f)) == "" + + +def test_method_call(): + class C(object): + def __init__(self, **kw): + pass + c = C(type='test') + +def test_method_w_callable(): + class A(object): + def __call__(self, x): + return x + import new + im = new.instancemethod(A(), 3) + assert im() == 3 + +def test_method_w_callable_call_function(): + class A(object): + def __call__(self, x, y): + return x+y + import new + im = new.instancemethod(A(), 3) + assert map(im, [4]) == [7] + +def test_unbound_typecheck(): + class A(object): + def foo(self, *args): + return args + class B(A): + pass + class C(A): + pass + + assert A.foo(A(), 42) == (42,) + assert A.foo(B(), 42) == (42,) + with raises(TypeError): + A.foo(5) + with raises(TypeError): + B.foo(C()) + with raises(TypeError): + class Fun: + __metaclass__ = A.foo + class Fun: + __metaclass__ = A().foo + assert Fun[:2] == ('Fun', ()) + +def test_unbound_abstract_typecheck(): + import new + def f(*args): + return args + m = new.instancemethod(f, None, "foobar") + with raises(TypeError): + m() + with raises(TypeError): + m(None) + with raises(TypeError): + m("egg") + + m = new.instancemethod(f, None, (str, int)) # really obscure... + assert m(4) == (4,) + assert m("uh") == ("uh",) + with raises(TypeError): + m([]) + + class MyBaseInst(object): + pass + class MyInst(MyBaseInst): + def __init__(self, myclass): + self.myclass = myclass + def __class__(self): + if self.myclass is None: + raise AttributeError + return self.myclass + __class__ = property(__class__) + class MyClass(object): + pass + BBase = MyClass() + BSub1 = MyClass() + BSub2 = MyClass() + BBase.__bases__ = () + BSub1.__bases__ = (BBase,) + BSub2.__bases__ = (BBase,) + x = MyInst(BSub1) + m = new.instancemethod(f, None, BSub1) + assert m(x) == (x,) + with raises(TypeError): + m(MyInst(BBase)) + with raises(TypeError): + m(MyInst(BSub2)) + with raises(TypeError): + m(MyInst(None)) + with raises(TypeError): + m(MyInst(42)) + +def test_invalid_creation(): + import new + def f(): + pass + with raises(TypeError): + new.instancemethod(f, None) + +def test_empty_arg_kwarg_call(): + def f(): + pass + + with raises(TypeError): + f(*0) + with raises(TypeError): + f(**0) + +def test_method_equal(): + class A(object): + def m(self): + pass + + class X(object): + def __eq__(self, other): + return True + + assert A().m == X() + assert X() == A().m + +def test_method_equals_with_identity(): + from types import MethodType + class CallableBadEq(object): + def __call__(self): + pass + def __eq__(self, other): + raise ZeroDivisionError + func = CallableBadEq() + meth = MethodType(func, object) + assert meth == meth + assert meth == MethodType(func, object) + +def test_method_identity(): + import sys + class A(object): + def m(self): + pass + def n(self): + pass + + class B(A): + pass + + class X(object): + def __eq__(self, other): + return True + + a = A() + a2 = A() + x = a.m; y = a.m + assert x is not y + assert id(x) != id(y) + assert x == y + assert x is not a.n + assert id(x) != id(a.n) + assert x is not a2.m + assert id(x) != id(a2.m) + + if '__pypy__' in sys.builtin_module_names: + assert A.m is A.m + assert id(A.m) == id(A.m) + assert A.m == A.m + x = A.m + assert x is not A.n + assert id(x) != id(A.n) + assert x is not B.m + assert id(x) != id(B.m) diff -Nru pypy-7.1.1+dfsg/pypy/interpreter/test/apptest_generator.py pypy-7.3.1+dfsg/pypy/interpreter/test/apptest_generator.py --- pypy-7.1.1+dfsg/pypy/interpreter/test/apptest_generator.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/interpreter/test/apptest_generator.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,311 @@ +from pytest import raises, skip + +def test_generator(): + def f(): + yield 1 + assert f().next() == 1 + +def test_generator2(): + def f(): + yield 1 + g = f() + assert g.next() == 1 + with raises(StopIteration): + g.next() + +def test_attributes(): + def f(): + yield 1 + assert g.gi_running + g = f() + assert g.gi_code is f.__code__ + assert g.__name__ == 'f' + assert g.gi_frame is not None + assert not g.gi_running + g.next() + assert not g.gi_running + with raises(StopIteration): + g.next() + assert not g.gi_running + assert g.gi_frame is None + assert g.gi_code is f.__code__ + assert g.__name__ == 'f' + +def test_generator3(): + def f(): + yield 1 + g = f() + assert list(g) == [1] + +def test_generator4(): + def f(): + yield 1 + g = f() + assert [x for x in g] == [1] + +def test_generator5(): + def f(): + v = (yield) + yield v + g = f() + g.next() + assert g.send(42) == 42 + +def test_throw1(): + def f(): + yield 2 + g = f() + # two arguments version + with raises(NameError): + g.throw(NameError, "Error") + +def test_throw2(): + def f(): + yield 2 + g = f() + # single argument version + with raises(NameError): + g.throw(NameError("Error")) + +def test_throw3(): + def f(): + try: + yield 1 + yield 2 + except NameError: + yield 3 + g = f() + assert g.next() == 1 + assert g.throw(NameError("Error")) == 3 + with raises(StopIteration): + g.next() + +def test_throw4(): + def f(): + try: + yield 1 + v = (yield 2) + except NameError: + yield 3 + g = f() + assert g.next() == 1 + assert g.next() == 2 + assert g.throw(NameError("Error")) == 3 + with raises(StopIteration): + g.next() + +def test_throw5(): + def f(): + try: + yield 1 + except Exception: + x = 3 + try: + yield x + except Exception: + pass + g = f() + g.next() + # String exceptions are not allowed anymore + with raises(TypeError): + g.throw("Error") + assert g.throw(Exception) == 3 + with raises(StopIteration): + g.throw(Exception) + +def test_throw6(): + def f(): + yield 2 + g = f() + with raises(NameError): + g.throw(NameError, "Error", None) + + +def test_throw_fail(): + def f(): + yield 1 + g = f() + with raises(TypeError): + g.throw(NameError("Error"), "error") + +def test_throw_fail2(): + def f(): + yield 1 + g = f() + with raises(TypeError): + g.throw(list()) + +def test_throw_fail3(): + def f(): + yield 1 + g = f() + with raises(TypeError): + g.throw(NameError("Error"), None, "not tb object") + +def test_throw_finishes_generator(): + def f(): + yield 1 + g = f() + assert g.gi_frame is not None + with raises(ValueError): + g.throw(ValueError) + assert g.gi_frame is None + +def test_throw_bug(): + def f(): + try: + x.throw(IndexError) # => "generator already executing" + except ValueError: + yield 1 + x = f() + res = list(x) + assert res == [1] + +def test_throw_on_finished_generator(): + def f(): + yield 1 + g = f() + res = g.next() + assert res == 1 + with raises(StopIteration): + g.next() + with raises(NameError): + g.throw(NameError) + +def test_close(): + def f(): + yield 1 + g = f() + assert g.close() is None + +def test_close2(): + def f(): + try: + yield 1 + except GeneratorExit: + raise StopIteration + g = f() + g.next() + assert g.close() is None + +def test_close3(): + def f(): + try: + yield 1 + except GeneratorExit: + raise NameError + g = f() + g.next() + with raises(NameError): + g.close() + +def test_close_fail(): + def f(): + try: + yield 1 + except GeneratorExit: + yield 2 + g = f() + g.next() + with raises(RuntimeError): + g.close() + +def test_close_on_collect(): + import gc + def f(): + try: + yield + finally: + f.x = 42 + g = f() + g.next() + del g + gc.collect() + assert f.x == 42 + +def test_generator_raises_typeerror(): + def f(): + yield 1 + g = f() + with raises(TypeError): + g.send() # one argument required + with raises(TypeError): + g.send(1) # not started, must send None + +def test_generator_explicit_stopiteration(): + def f(): + yield 1 + raise StopIteration + g = f() + assert [x for x in g] == [1] + +def test_generator_propagate_stopiteration(): + def f(): + it = iter([1]) + while 1: + yield it.next() + g = f() + assert [x for x in g] == [1] + +def test_generator_restart(): + def g(): + i = me.next() + yield i + me = g() + with raises(ValueError): + me.next() + +def test_generator_expression(): + exec "res = sum(i*i for i in range(5))" + assert res == 30 + +def test_generator_expression_2(): + def f(): + total = sum(i for i in [x for x in z]) + return total, x + z = [1, 2, 7] + assert f() == (10, 7) + +def test_repr(): + def myFunc(): + yield 1 + g = myFunc() + r = repr(g) + assert r.startswith(" 5 + try: + next(gen) + except TypeError: + pass + +def test_multiple_invalid_sends(): + def mygen(): + yield 42 + g = mygen() + with raises(TypeError): + g.send(2) + with raises(TypeError): + g.send(2) diff -Nru pypy-7.1.1+dfsg/pypy/interpreter/test/apptest_nestedscope.py pypy-7.3.1+dfsg/pypy/interpreter/test/apptest_nestedscope.py --- pypy-7.1.1+dfsg/pypy/interpreter/test/apptest_nestedscope.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/interpreter/test/apptest_nestedscope.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,135 @@ +from pytest import raises + +def test_nested_scope(): + x = 42 + def f(): return x + assert f() == 42 + +def test_nested_scope2(): + x = 42 + y = 3 + def f(): return x + assert f() == 42 + +def test_nested_scope3(): + x = 42 + def f(): + def g(): + return x + return g + assert f()() == 42 + +def test_nested_scope4(): + def f(): + x = 3 + def g(): + return x + a = g() + x = 4 + b = g() + return (a, b) + assert f() == (3, 4) + +def test_nested_scope_locals(): + def f(): + x = 3 + def g(): + i = x + return locals() + return g() + d = f() + assert d == {'i':3, 'x':3} + +def test_deeply_nested_scope_locals(): + def f(): + x = 3 + def g(): + def h(): + i = x + return locals() + return locals(), h() + return g() + outer_locals, inner_locals = f() + assert inner_locals == {'i':3, 'x':3} + keys = outer_locals.keys() + keys.sort() + assert keys == ['h', 'x'] + +def test_lambda_in_genexpr(): + assert eval('map(apply, (lambda: t for t in range(10)))') == range(10) + +def test_cell_repr(): + import re + from repr import repr as r # Don't shadow builtin repr + + def get_cell(): + x = 42 + def inner(): + return x + return inner + x = get_cell().__closure__[0] + assert re.match(r'', repr(x)) + assert re.match(r'', r(x)) + + def get_cell(): + if False: + x = 42 + def inner(): + return x + return inner + x = get_cell().__closure__[0] + assert re.match(r'', repr(x)) + +def test_cell_contents(): + def f(x): + def f(y): + return x + y + return f + + g = f(10) + assert g.func_closure[0].cell_contents == 10 + +def test_empty_cell_contents(): + + def f(): + def f(y): + return x + y + return f + x = 1 + + g = f() + with raises(ValueError): + g.func_closure[0].cell_contents + +def test_compare_cells(): + def f(n): + if n: + x = 42 + def f(y): + return x + y + return f + + g0 = f(0).func_closure[0] + g1 = f(1).func_closure[0] + assert cmp(g0, g1) == -1 + +def test_leaking_class_locals(): + def f(x): + class X: + x = 12 + def f(self): + return x + locals() + return X + assert f(1).x == 12 + +def test_nested_scope_locals_mutating_cellvars(): + def f(): + x = 12 + def m(): + locals() + x + locals() + return x + return m + assert f()() == 12 diff -Nru pypy-7.1.1+dfsg/pypy/interpreter/test/apptest_pyframe.py pypy-7.3.1+dfsg/pypy/interpreter/test/apptest_pyframe.py --- pypy-7.1.1+dfsg/pypy/interpreter/test/apptest_pyframe.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/interpreter/test/apptest_pyframe.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,576 @@ +import pytest + +@pytest.fixture +def tempfile(tmpdir): + return str(tmpdir / 'tempfile1') + +def test_f_locals(): + import sys + f = sys._getframe() + assert f.f_locals is locals() + +def test_f_globals(): + import sys + f = sys._getframe() + assert f.f_globals is globals() + with pytest.raises(TypeError): + f.f_globals = globals() + +def test_f_builtins(): + import sys, __builtin__ + f = sys._getframe() + assert f.f_builtins is __builtin__.__dict__ + +def test_f_code(): + def g(): + import sys + f = sys._getframe() + return f.f_code + assert g() is g.func_code + +def test_f_trace_del(): + import sys + f = sys._getframe() + del f.f_trace + assert f.f_trace is None + +def test_f_lineno(): + def g(): + import sys + f = sys._getframe() + x = f.f_lineno + y = f.f_lineno + z = f.f_lineno + return [x, y, z] + origin = g.func_code.co_firstlineno + assert g() == [origin+3, origin+4, origin+5] + +def test_f_lineno_set(tempfile): + def tracer(f, *args): + def y(f, *args): + return y + def x(f, *args): + f.f_lineno += 1 + return y # "return None" should have the same effect, but see + # test_local_trace_function_returning_None_ignored + return x + + open # force fetching of this name now + + def function(): + xyz + with open(tempfile, 'w') as f: + pass + return 3 + + import sys + sys.settrace(tracer) + function() + sys.settrace(None) + # assert did not crash + +def test_f_lineno_set_firstline(): + seen = [] + def tracer(f, event, *args): + seen.append((event, f.f_lineno)) + if len(seen) == 5: + f.f_lineno = 1 # bug shown only when setting lineno to 1 + return tracer + + def g(): + import sys + sys.settrace(tracer) + exec "x=1\ny=x+1\nz=y+1\nt=z+1\ns=t+1\n" in {} + sys.settrace(None) + + g() + assert seen == [('call', 1), + ('line', 1), + ('line', 2), + ('line', 3), + ('line', 4), + ('line', 2), + ('line', 3), + ('line', 4), + ('line', 5), + ('return', 5)] + +def test_f_back(): + import sys + def f(): + assert sys._getframe().f_code.co_name == g() + def g(): + return sys._getframe().f_back.f_code.co_name + f() + +def test_f_back_virtualref(): + import sys + def f(): + return g() + def g(): + return sys._getframe() + frame = f() + assert frame.f_back.f_code.co_name == 'f' + +def test_f_exc_xxx(): + import sys + + class OuterException(Exception): + pass + class InnerException(Exception): + pass + + def g(exc_info): + f = sys._getframe() + assert f.f_exc_type is None + assert f.f_exc_value is None + assert f.f_exc_traceback is None + try: + raise InnerException + except: + assert f.f_exc_type is exc_info[0] + assert f.f_exc_value is exc_info[1] + assert f.f_exc_traceback is exc_info[2] + try: + raise OuterException + except: + g(sys.exc_info()) + +def test_virtualref_through_traceback(): + import sys + def g(): + try: + raise ValueError + except: + _, _, tb = sys.exc_info() + return tb + def f(): + return g() + # + tb = f() + assert tb.tb_frame.f_code.co_name == 'g' + assert tb.tb_frame.f_back.f_code.co_name == 'f' + +def test_trace_basic(): + import sys + l = [] + class Tracer: + def __init__(self, i): + self.i = i + def trace(self, frame, event, arg): + l.append((self.i, frame.f_code.co_name, event, arg)) + if frame.f_code.co_name == 'g2': + return None # don't trace g2 + return Tracer(self.i+1).trace + def g3(n): + n -= 5 + return n + def g2(n): + n += g3(2) + n += g3(7) + return n + def g(n): + n += g2(3) + return n + def f(n): + n = g(n) + return n * 7 + sys.settrace(Tracer(0).trace) + x = f(4) + sys.settrace(None) + assert x == 42 + print l + assert l == [(0, 'f', 'call', None), + (1, 'f', 'line', None), + (0, 'g', 'call', None), + (1, 'g', 'line', None), + (0, 'g2', 'call', None), + (0, 'g3', 'call', None), + (1, 'g3', 'line', None), + (2, 'g3', 'line', None), + (3, 'g3', 'return', -3), + (0, 'g3', 'call', None), + (1, 'g3', 'line', None), + (2, 'g3', 'line', None), + (3, 'g3', 'return', 2), + (2, 'g', 'line', None), + (3, 'g', 'return', 6), + (2, 'f', 'line', None), + (3, 'f', 'return', 42)] + +def test_trace_exc(): + import sys + l = [] + def ltrace(a,b,c): + if b == 'exception': + l.append(c) + return ltrace + def trace(a,b,c): return ltrace + def f(): + try: + raise Exception + except: + pass + sys.settrace(trace) + f() + sys.settrace(None) + assert len(l) == 1 + assert isinstance(l[0][1], Exception) + +def test_trace_ignore_hidden(): + import sys + import _testing + + l = [] + def trace(a,b,c): + l.append((a,b,c)) + + def f(): + h = _testing.Hidden() + r = h.meth() + return r + + sys.settrace(trace) + res = f() + sys.settrace(None) + assert len(l) == 1 + assert l[0][1] == 'call' + assert res == 'hidden' # sanity + +def test_trace_hidden_prints(tempfile): + import sys + + l = [] + def trace(a,b,c): + l.append((a,b,c)) + return trace + + outputf = open(tempfile, 'w') + def f(): + print >> outputf, 1 + print >> outputf, 2 + print >> outputf, 3 + return "that's the return value" + + sys.settrace(trace) + f() + sys.settrace(None) + outputf.close() + # should get 1 "call", 3 "line" and 1 "return" events, and no call + # or return for the internal app-level implementation of 'print' + assert len(l) == 6 + assert [what for (frame, what, arg) in l] == [ + 'call', 'line', 'line', 'line', 'line', 'return'] + assert l[-1][2] == "that's the return value" + +def test_trace_return_exc(): + import sys + l = [] + def trace(a,b,c): + if b in ('exception', 'return'): + l.append((b, c)) + return trace + + def g(): + raise Exception + def f(): + try: + g() + except: + pass + sys.settrace(trace) + f() + sys.settrace(None) + assert len(l) == 4 + assert l[0][0] == 'exception' + assert isinstance(l[0][1][1], Exception) + assert l[1] == ('return', None) + assert l[2][0] == 'exception' + assert isinstance(l[2][1][1], Exception) + assert l[3] == ('return', None) + +def test_trace_raises_on_return(): + import sys + def trace(frame, event, arg): + if event == 'return': + raise ValueError + else: + return trace + + def f(): return 1 + + for i in xrange(sys.getrecursionlimit() + 1): + sys.settrace(trace) + try: + f() + except ValueError: + pass + +def test_trace_try_finally(): + import sys + l = [] + def trace(frame, event, arg): + if event == 'exception': + l.append(arg) + return trace + + def g(): + try: + raise Exception + finally: + pass + + def f(): + try: + g() + except: + pass + + sys.settrace(trace) + f() + sys.settrace(None) + assert len(l) == 2 + assert issubclass(l[0][0], Exception) + assert issubclass(l[1][0], Exception) + +def test_trace_raise_three_arg(): + import sys + l = [] + def trace(frame, event, arg): + if event == 'exception': + l.append(arg) + return trace + + def g(): + try: + raise Exception + except Exception as e: + import sys + raise Exception, e, sys.exc_info()[2] + + def f(): + try: + g() + except: + pass + + sys.settrace(trace) + f() + sys.settrace(None) + assert len(l) == 2 + assert issubclass(l[0][0], Exception) + assert issubclass(l[1][0], Exception) + +def test_trace_generator_finalisation(): + import sys + l = [] + got_exc = [] + def trace(frame, event, arg): + l.append((frame.f_lineno, event)) + if event == 'exception': + got_exc.append(arg) + return trace + + d = {} + exec """if 1: + def g(): + try: + yield True + finally: + pass + + def f(): + try: + gen = g() + gen.next() + gen.close() + except: + pass + """ in d + f = d['f'] + + sys.settrace(trace) + f() + sys.settrace(None) + assert len(got_exc) == 1 + assert issubclass(got_exc[0][0], GeneratorExit) + assert l == [(8, 'call'), + (9, 'line'), + (10, 'line'), + (11, 'line'), + (2, 'call'), + (3, 'line'), + (4, 'line'), + (4, 'return'), + (12, 'line'), + (4, 'call'), + (4, 'exception'), + (6, 'line'), + (6, 'return'), + (12, 'return')] + +def test_dont_trace_on_reraise(): + import sys + l = [] + def ltrace(a,b,c): + if b == 'exception': + l.append(c) + return ltrace + def trace(a,b,c): return ltrace + def f(): + try: + 1/0 + except: + try: + raise + except: + pass + sys.settrace(trace) + f() + sys.settrace(None) + assert len(l) == 1 + assert issubclass(l[0][0], Exception) + +def test_dont_trace_on_raise_with_tb(): + import sys + l = [] + def ltrace(a,b,c): + if b == 'exception': + l.append(c) + return ltrace + def trace(a,b,c): return ltrace + def f(): + try: + raise Exception + except: + return sys.exc_info() + def g(): + exc, val, tb = f() + try: + raise exc, val, tb + except: + pass + sys.settrace(trace) + g() + sys.settrace(None) + assert len(l) == 1 + assert isinstance(l[0][1], Exception) + +def test_trace_changes_locals(): + import sys + def trace(frame, what, arg): + frame.f_locals['x'] = 42 + return trace + def f(x): + return x + sys.settrace(trace) + res = f(1) + sys.settrace(None) + assert res == 42 + +def test_set_unset_f_trace(): + import sys + seen = [] + def trace1(frame, what, arg): + seen.append((1, frame, frame.f_lineno, what, arg)) + return trace1 + def trace2(frame, what, arg): + seen.append((2, frame, frame.f_lineno, what, arg)) + return trace2 + def set_the_trace(f): + f.f_trace = trace1 + sys.settrace(trace2) + len(seen) # take one line: should not be traced + f = sys._getframe() + set_the_trace(f) + len(seen) # take one line: should not be traced + len(seen) # take one line: should not be traced + sys.settrace(None) # and this line should be the last line traced + len(seen) # take one line + del f.f_trace + len(seen) # take one line + firstline = set_the_trace.func_code.co_firstlineno + assert seen == [(1, f, firstline + 6, 'line', None), + (1, f, firstline + 7, 'line', None), + (1, f, firstline + 8, 'line', None)] + +def test_locals2fast_freevar_bug(): + import sys + def f(n): + class A(object): + def g(self): + return n + n = 42 + return A() + res = f(10).g() + assert res == 10 + # + def trace(*args): + return trace + sys.settrace(trace) + res = f(10).g() + sys.settrace(None) + assert res == 10 + +def test_throw_trace_bug(): + import sys + def f(): + yield 5 + gen = f() + assert next(gen) == 5 + seen = [] + def trace_func(frame, event, *args): + seen.append(event) + return trace_func + sys.settrace(trace_func) + try: + gen.throw(ValueError) + except ValueError: + pass + sys.settrace(None) + assert seen == ['call', 'exception', 'return'] + +def test_generator_trace_stopiteration(): + import sys + def f(): + yield 5 + gen = f() + assert next(gen) == 5 + seen = [] + def trace_func(frame, event, *args): + print('TRACE:', frame, event, args) + seen.append(event) + return trace_func + def g(): + for x in gen: + never_entered + sys.settrace(trace_func) + g() + sys.settrace(None) + print 'seen:', seen + # on Python 3 we get an extra 'exception' when 'for' catches + # StopIteration + assert seen == ['call', 'line', 'call', 'return', 'return'] + +def test_local_trace_function_returning_None_ignored(): + # behave the same as CPython does, and in contradiction with + # the documentation. + def tracer(f, event, arg): + assert event == 'call' + return local_tracer + + seen = [] + def local_tracer(f, event, arg): + seen.append(event) + return None # but 'local_tracer' will be called again + + def function(): + a = 1 + a = 2 + a = 3 + + import sys + sys.settrace(tracer) + function() + sys.settrace(None) + assert seen == ["line", "line", "line", "return"] diff -Nru pypy-7.1.1+dfsg/pypy/interpreter/test/demomixedmod/__init__.py pypy-7.3.1+dfsg/pypy/interpreter/test/demomixedmod/__init__.py --- pypy-7.1.1+dfsg/pypy/interpreter/test/demomixedmod/__init__.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/interpreter/test/demomixedmod/__init__.py 2020-04-10 19:28:40.000000000 +0000 @@ -1,15 +0,0 @@ -from pypy.interpreter.mixedmodule import MixedModule - -class Module(MixedModule): - interpleveldefs = { - '__name__' : '(space.wrap("mixedmodule"))', - '__doc__' : '(space.wrap("mixedmodule doc"))', - 'somefunc' : 'file1.somefunc', - 'value' : '(space.w_None)', - 'path' : 'file1.initpath(space)', - 'cpypath' : 'space.wrap(sys.path)' - } - - appleveldefs = { - 'someappfunc' : 'file2_app.someappfunc', - } diff -Nru pypy-7.1.1+dfsg/pypy/interpreter/test/demomixedmod/moduledef.py pypy-7.3.1+dfsg/pypy/interpreter/test/demomixedmod/moduledef.py --- pypy-7.1.1+dfsg/pypy/interpreter/test/demomixedmod/moduledef.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/interpreter/test/demomixedmod/moduledef.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,15 @@ +from pypy.interpreter.mixedmodule import MixedModule + +class Module(MixedModule): + interpleveldefs = { + '__name__' : '(space.wrap("mixedmodule"))', + '__doc__' : '(space.wrap("mixedmodule doc"))', + 'somefunc' : 'file1.somefunc', + 'value' : '(space.w_None)', + 'path' : 'file1.initpath(space)', + 'cpypath' : 'space.wrap(sys.path)' + } + + appleveldefs = { + 'someappfunc' : 'file2_app.someappfunc', + } diff -Nru pypy-7.1.1+dfsg/pypy/interpreter/test/fixtures.py pypy-7.3.1+dfsg/pypy/interpreter/test/fixtures.py --- pypy-7.1.1+dfsg/pypy/interpreter/test/fixtures.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/interpreter/test/fixtures.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,5 @@ +from _pytest.tmpdir import TempdirFactory + +def tempfile(space, config): + tmpdir = TempdirFactory(config).getbasetemp() + return space.newtext(str(tmpdir / 'tempfile1')) diff -Nru pypy-7.1.1+dfsg/pypy/interpreter/test/test_appinterp.py pypy-7.3.1+dfsg/pypy/interpreter/test/test_appinterp.py --- pypy-7.1.1+dfsg/pypy/interpreter/test/test_appinterp.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/interpreter/test/test_appinterp.py 2020-04-10 19:28:40.000000000 +0000 @@ -3,32 +3,32 @@ from pypy.interpreter.gateway import appdef, ApplevelClass, applevel_temp from pypy.interpreter.error import OperationError -def test_execwith_novars(space): - val = space.appexec([], """ - (): - return 42 - """) +def test_execwith_novars(space): + val = space.appexec([], """ + (): + return 42 + """) assert space.eq_w(val, space.wrap(42)) -def test_execwith_withvars(space): +def test_execwith_withvars(space): val = space.appexec([space.wrap(7)], """ - (x): - y = 6 * x - return y - """) + (x): + y = 6 * x + return y + """) assert space.eq_w(val, space.wrap(42)) -def test_execwith_compile_error(space): +def test_execwith_compile_error(space): excinfo = py.test.raises(OperationError, space.appexec, [], """ - (): - y y + (): + y y """) # NOTE: the following test only works because excinfo.value is not # normalized so far - assert str(excinfo.value.get_w_value(space)).find('y y') != -1 + assert str(excinfo.value.get_w_value(space)).find('y y') != -1 def test_simple_applevel(space): - app = appdef("""app(x,y): + app = appdef("""app(x,y): return x + y """) assert app.func_name == 'app' @@ -36,15 +36,15 @@ assert space.eq_w(w_result, space.wrap(42)) def test_applevel_with_one_default(space): - app = appdef("""app(x,y=1): + app = appdef("""app(x,y=1): return x + y """) assert app.func_name == 'app' - w_result = app(space, space.wrap(41)) + w_result = app(space, space.wrap(41)) assert space.eq_w(w_result, space.wrap(42)) def test_applevel_with_two_defaults(space): - app = appdef("""app(x=1,y=2): + app = appdef("""app(x=1,y=2): return x + y """) w_result = app(space, space.wrap(41), space.wrap(1)) @@ -58,19 +58,19 @@ def test_applevel_noargs(space): - app = appdef("""app(): - return 42 + app = appdef("""app(): + return 42 """) assert app.func_name == 'app' - w_result = app(space) + w_result = app(space) assert space.eq_w(w_result, space.wrap(42)) -def somefunc(arg2=42): - return arg2 +def somefunc(arg2=42): + return arg2 -def test_app2interp_somefunc(space): - app = appdef(somefunc) - w_result = app(space) +def test_app2interp_somefunc(space): + app = appdef(somefunc) + w_result = app(space) assert space.eq_w(w_result, space.wrap(42)) def test_applevel_functions(space, applevel_temp = applevel_temp): @@ -87,48 +87,45 @@ def test_applevel_class(space, applevel_temp = applevel_temp): app = applevel_temp(''' class C(object): - clsattr = 42 - def __init__(self, x=13): - self.attr = x + clsattr = 42 + def __init__(self, x=13): + self.attr = x ''') C = app.interphook('C') - c = C(space, space.wrap(17)) + c = C(space, space.wrap(17)) w_attr = space.getattr(c, space.wrap('clsattr')) assert space.eq_w(w_attr, space.wrap(42)) w_clsattr = space.getattr(c, space.wrap('attr')) assert space.eq_w(w_clsattr, space.wrap(17)) -def app_test_something_at_app_level(): - x = 2 - assert x/2 == 1 - -class AppTestMethods: - def test_some_app_test_method(self): +class AppTestMethods: + def test_some_app_test_method(self): assert 2 == 2 -class TestMixedModule: - def test_accesses(self): +class TestMixedModule: + def test_accesses(self): space = self.space - import demomixedmod - w_module = demomixedmod.Module(space, space.wrap('mixedmodule')) + from .demomixedmod.moduledef import Module + w_module = Module(space, space.wrap('mixedmodule')) space.appexec([w_module], """ - (module): - assert module.value is None + (module): + assert module.value is None assert module.__doc__ == 'mixedmodule doc' - assert module.somefunc is module.somefunc - result = module.somefunc() - assert result == True - - assert module.someappfunc is module.someappfunc - appresult = module.someappfunc(41) - assert appresult == 42 + assert module.somefunc is module.somefunc + result = module.somefunc() + assert result == True + + assert module.someappfunc is module.someappfunc + appresult = module.someappfunc(41) + assert appresult == 42 assert module.__dict__ is module.__dict__ - for name in ('somefunc', 'someappfunc', '__doc__', '__name__'): + for name in ('somefunc', 'someappfunc', '__doc__', '__name__'): assert name in module.__dict__ """) assert space.is_true(w_module.call('somefunc')) + assert Module.get_applevel_name() == 'demomixedmod' def test_whacking_at_loaders(self): """Some MixedModules change 'self.loaders' in __init__(), but doing @@ -157,25 +154,3 @@ w_str = space1.getattr(w_mymod1, space1.wrap("hi")) assert space1.str_w(w_str) == "hello" -class TestMixedModuleUnfreeze: - spaceconfig = dict(usemodules=('_ssl', '_socket')) - - def test_random_stuff_can_unfreeze(self): - # When a module contains an "import" statement in applevel code, the - # imported module is initialized, possibly after it has been already - # frozen. - - # This is important when the module startup() function does something - # at runtime, like setting os.environ (posix module) or initializing - # the winsock library (_socket module) - w_socket = self.space.builtin_modules['_socket'] - w_ssl = self.space.builtin_modules['_ssl'] - - # Uncomment this line for a workaround - # space.getattr(w_ssl, space.wrap('SSLError')) - - w_socket._cleanup_() - assert w_socket.startup_called == False - w_ssl._cleanup_() # w_ssl.appleveldefs['SSLError'] imports _socket - assert w_socket.startup_called == False - diff -Nru pypy-7.1.1+dfsg/pypy/interpreter/test/test_app_main.py pypy-7.3.1+dfsg/pypy/interpreter/test/test_app_main.py --- pypy-7.1.1+dfsg/pypy/interpreter/test/test_app_main.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/interpreter/test/test_app_main.py 2020-04-10 19:28:40.000000000 +0000 @@ -961,7 +961,8 @@ } try: sys.stdout = f = cStringIO.StringIO() - py.test.raises(SystemExit, app_main.print_info) + with py.test.raises(SystemExit): + app_main.print_info() finally: sys.stdout = prev_so if prev_ti == 'missing': diff -Nru pypy-7.1.1+dfsg/pypy/interpreter/test/test_argument.py pypy-7.3.1+dfsg/pypy/interpreter/test/test_argument.py --- pypy-7.1.1+dfsg/pypy/interpreter/test/test_argument.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/interpreter/test/test_argument.py 2020-04-10 19:28:40.000000000 +0000 @@ -1,5 +1,6 @@ # -*- coding: utf-8 -*- import py +import pytest from pypy.interpreter.argument import (Arguments, ArgErr, ArgErrUnknownKwds, ArgErrMultipleValues, ArgErrCount, ArgErrCountMethod) from pypy.interpreter.signature import Signature @@ -741,7 +742,7 @@ exc = raises(TypeError, (lambda a, b, **kw: 0), a=1) assert exc.value.message == "() takes exactly 2 non-keyword arguments (0 given)" - @py.test.mark.skipif("config.option.runappdirect") + @pytest.mark.pypy_only def test_error_message_method(self): class A(object): def f0(): @@ -758,14 +759,14 @@ # does not contain the warning about missing self assert exc.value.message == "f0() takes no arguments (1 given)" - @py.test.mark.skipif("config.option.runappdirect") def test_error_message_module_function(self): import operator # use repeat because it's defined at applevel exc = raises(TypeError, lambda : operator.repeat(1, 2, 3)) - # does not contain the warning about missing self - assert exc.value.message == "repeat() takes exactly 2 arguments (3 given)" + # does not contain the warning + # 'Did you forget 'self' in the function definition?' + assert 'self' not in str(exc.value) - @py.test.mark.skipif("config.option.runappdirect") + @pytest.mark.pypy_only def test_error_message_bound_method(self): class A(object): def f0(): diff -Nru pypy-7.1.1+dfsg/pypy/interpreter/test/test_cellfamily.py pypy-7.3.1+dfsg/pypy/interpreter/test/test_cellfamily.py --- pypy-7.1.1+dfsg/pypy/interpreter/test/test_cellfamily.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/interpreter/test/test_cellfamily.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,100 @@ +""" some unit-level tests for the nested scope CellFamily optimization. """ + +from pypy.interpreter.nestedscope import Cell, CellFamily +from pypy.interpreter.pycode import _compute_args_as_cellvars + +class TestCellFamily: + def setup_class(cls): + cls.compiler = cls.space.createcompiler() + + def test_mutation(self): + f = CellFamily("x") + c = Cell("value", f) + assert c.family is f + assert not c.family.ever_mutated + + c.set("othervalue") + assert c.family.ever_mutated + + def test_mutation_after_empty_creation(self): + f = CellFamily("x") + c = Cell(None, f) + assert not c.family.ever_mutated + + c.set("value") + assert not c.family.ever_mutated + + c.set("surprise") + assert c.family.ever_mutated + + def test_mutation(self): + f = CellFamily("x") + c = Cell("value", f) + assert c.family is f + assert not c.family.ever_mutated + + c.delete() + assert c.family.ever_mutated + + def test_cellfamily_on_code(self): + code = self.compiler.compile('lambda x: x + 5', '', 'eval', 0) + lambdacode = code.co_consts_w[0] + assert lambdacode.cell_families == [] # doesn't create any cells + code = self.compiler.compile('lambda x, a: (lambda y: x + y + a)', '', 'eval', 0) + lambdacode = code.co_consts_w[0] + assert len(lambdacode.cell_families) == 2 # creates cells + + def test_nonarg_cell_indexes(self): + args_as_cellvars = _compute_args_as_cellvars(["a", "b"], ["x", "b", "y"], 2) + assert args_as_cellvars == [-1, 1] + + args_as_cellvars = _compute_args_as_cellvars(["a", "b"], ["a", "y", "z"], 2) + assert args_as_cellvars == [0] + + def test_passing_args_doesnt_mutate_cells(self): + space = self.space + code = self.compiler.compile('lambda x: (lambda y: x + y)', '', 'eval', 0) + w_outer = code.exec_code(space, space.newdict(), space.newdict()) + w_i = space.newint(5) + w_inner = space.call_function(w_outer, w_i) + cell = w_inner.closure[0] + assert cell.w_value is w_i + assert not cell.family.ever_mutated + + def test_integration(self): + # it still works for x + space = self.space + code = self.compiler.compile("""def f(x): + def g(y): + return x + a * y + a = x * 2 + return g + """, '', 'exec', 0) + w_d = space.newdict() + code.exec_code(space, w_d, w_d) + w_outer = space.finditem_str(w_d, "f") + w_i = space.newint(5) + w_inner = space.call_function(w_outer, w_i) + # both x and a are never mutated (only initialized) + for cell in w_inner.closure: + assert not cell.family.ever_mutated + + def test_cells_dont_interfere(self): + # it still works for x + space = self.space + code = self.compiler.compile("""def f(x): + def g(y): + return x + a * y + a = x * 2 + a = x * 4 # really mutate it + return g + """, '', 'exec', 0) + w_d = space.newdict() + code.exec_code(space, w_d, w_d) + w_outer = space.finditem_str(w_d, "f") + w_i = space.newint(5) + w_inner = space.call_function(w_outer, w_i) + for cell in w_inner.closure: + if cell.w_value is w_i: + break + assert not cell.family.ever_mutated diff -Nru pypy-7.1.1+dfsg/pypy/interpreter/test/test_class.py pypy-7.3.1+dfsg/pypy/interpreter/test/test_class.py --- pypy-7.1.1+dfsg/pypy/interpreter/test/test_class.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/interpreter/test/test_class.py 2020-04-10 19:28:40.000000000 +0000 @@ -131,3 +131,19 @@ c = C() assert c.one == "two" raises(AttributeError, getattr, c, "two") + + def test_nonsensical_base_error_message(self): + with raises(TypeError) as exc: + class Foo('base'): + pass + assert str(exc.value).startswith( + "metaclass found to be 'str', but calling " + "with args ('Foo', ('base',), dict) raised ") + # + def foo_func(): pass + with raises(TypeError) as exc: + class Foo(foo_func): + pass + assert str(exc.value).startswith( + "metaclass found to be 'function', but calling " + "with args ('Foo', (", "exec") + consts = code.co_consts + x, y, z = consts + assert isinstance(x, type(code)) and isinstance(y, type(code)) + assert x is not y + assert x != y + + @py.test.mark.skipif('config.option.runappdirect') + def test_dont_share_lambdas(self): + # the two lambdas's codes aren't shared (CPython does that but it's + # completely pointless: it only applies to identical lambdas that are + # defined on the same line) + code = compile("x = lambda: 0; y = lambda: 0", "", "exec") + consts = code.co_consts + x, y, z = consts + assert isinstance(x, type(code)) and isinstance(y, type(code)) + assert x is not y + assert x == y + def test_dict_and_set_literal_order(self): x = 1 l1 = list({1:'a', 3:'b', 2:'c', 4:'d'}) @@ -1111,3 +1132,9 @@ skip() code = 'u"""\\\n# -*- coding: utf-8 -*-\n\xc2\xa4"""\n' assert eval(code) == u'# -*- coding: utf-8 -*-\n\xc2\xa4' + + def test_asterror_has_line_without_file(self): + code = u"print(1)\na/2 = 5\n" + with raises(SyntaxError) as excinfo: + compile(code, 'not a file!', 'exec') + assert excinfo.value.text == "a/2 = 5\n" diff -Nru pypy-7.1.1+dfsg/pypy/interpreter/test/test_error.py pypy-7.3.1+dfsg/pypy/interpreter/test/test_error.py --- pypy-7.1.1+dfsg/pypy/interpreter/test/test_error.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/interpreter/test/test_error.py 2020-04-10 19:28:40.000000000 +0000 @@ -112,8 +112,8 @@ [os.strerror(errno.EBADF)], None) # e = wrap_oserror(space, OSError(errno.EBADF, "foobar"), - filename = "test.py", - exception_name = "w_EnvironmentError") + filename="test.py", + w_exception_class=space.w_EnvironmentError) assert isinstance(e, OperationError) assert e.w_type == [EnvironmentError] assert e.get_w_value(space) == ([EnvironmentError], [errno.EBADF], @@ -121,8 +121,8 @@ ["test.py"]) # e = wrap_oserror(space, OSError(errno.EBADF, "foobar"), - filename = "test.py", - w_exception_class = [SystemError]) + filename="test.py", + w_exception_class=[SystemError]) assert isinstance(e, OperationError) assert e.w_type == [SystemError] assert e.get_w_value(space) == ([SystemError], [errno.EBADF], diff -Nru pypy-7.1.1+dfsg/pypy/interpreter/test/test_exec.py pypy-7.3.1+dfsg/pypy/interpreter/test/test_exec.py --- pypy-7.1.1+dfsg/pypy/interpreter/test/test_exec.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/interpreter/test/test_exec.py 2020-04-10 19:28:40.000000000 +0000 @@ -16,257 +16,3 @@ assert 'abc' in g assert 'cba' in g ''') - - -class AppTestExecStmt: - def test_string(self): - g = {} - l = {} - exec "a = 3" in g, l - assert l['a'] == 3 - - def test_localfill(self): - g = {} - exec "a = 3" in g - assert g['a'] == 3 - - def test_builtinsupply(self): - g = {} - exec "pass" in g - assert g.has_key('__builtins__') - - def test_invalidglobal(self): - def f(): - exec 'pass' in 1 - raises(TypeError,f) - - def test_invalidlocal(self): - def f(): - exec 'pass' in {}, 2 - raises(TypeError,f) - - def test_codeobject(self): - co = compile("a = 3", '', 'exec') - g = {} - l = {} - exec co in g, l - assert l['a'] == 3 - - def test_implicit(self): - a = 4 - exec "a = 3" - assert a == 3 - - def test_tuplelocals(self): - g = {} - l = {} - exec ("a = 3", g, l) - assert l['a'] == 3 - - def test_tupleglobals(self): - g = {} - exec ("a = 3", g) - assert g['a'] == 3 - - def test_exceptionfallthrough(self): - def f(): - exec 'raise TypeError' in {} - raises(TypeError,f) - - def test_global_stmt(self): - g = {} - l = {} - co = compile("global a; a=5", '', 'exec') - #import dis - #dis.dis(co) - exec co in g, l - assert l == {} - assert g['a'] == 5 - - def test_specialcase_free_load(self): - exec """if 1: - def f(): - exec 'a=3' - return a - x = f()\n""" - assert x == 3 - - def test_specialcase_free_load2(self): - exec """if 1: - def f(a): - exec 'a=3' - return a - x = f(4)\n""" - assert x == 3 - - def test_specialcase_globals_and_exec(self): - d = {} - exec """if 1: - b = 2 - c = 3 - d = 4 - def f(a): - global b - exec 'd=42 ; b=7' - return a,b,c,d - #import dis - #dis.dis(f) - res = f(3)\n""" in d - r = d['res'] - assert r == (3,2,3,42) - - def test_nested_names_are_not_confused(self): - def get_nested_class(): - method_and_var = "var" - class Test(object): - def method_and_var(self): - return "method" - def test(self): - return method_and_var - def actual_global(self): - return str("global") - def str(self): - return str(self) - return Test() - t = get_nested_class() - assert t.actual_global() == "global" - assert t.test() == 'var' - assert t.method_and_var() == 'method' - - def test_import_star_shadows_global(self): - d = {'platform' : 3} - exec """if 1: - def f(): - from sys import * - return platform - res = f()\n""" in d - import sys - assert d['res'] == sys.platform - - def test_import_global_takes_precendence(self): - d = {'platform' : 3} - exec """if 1: - def f(): - global platform - from sys import * - return platform - res = f()\n""" in d - import sys - assert d['platform'] == 3 - - def test_exec_load_name(self): - d = {'x': 2} - exec """if 1: - def f(): - save = x - exec "x=3" - return x,save - \n""" in d - res = d['f']() - assert res == (3, 2) - - def test_space_bug(self): - d = {} - exec "x=5 " in d - assert d['x'] == 5 - - def test_synerr(self): - def x(): - exec "1 2" - raises(SyntaxError, x) - - def test_mapping_as_locals(self): - import sys - if sys.version_info < (2,5) or not hasattr(sys, 'pypy_objspaceclass'): - skip("need CPython 2.5 or PyPy for non-dictionaries in exec statements") - class M(object): - def __getitem__(self, key): - return key - def __setitem__(self, key, value): - self.result[key] = value - def setdefault(self, key, value): - assert key == '__builtins__' - m = M() - m.result = {} - exec "x=m" in {}, m - assert m.result == {'x': 'm'} - exec "y=n" in m # NOTE: this doesn't work in CPython 2.4 - assert m.result == {'x': 'm', 'y': 'n'} - - def test_filename(self): - try: - exec "'unmatched_quote" - except SyntaxError as msg: - assert msg.filename == '' - try: - eval("'unmatched_quote") - except SyntaxError as msg: - assert msg.filename == '' - - def test_exec_and_name_lookups(self): - ns = {} - exec """def f(): - exec 'x=1' in locals() - return x""" in ns - - f = ns['f'] - - try: - res = f() - except NameError as e: # keep py.test from exploding confused - raise e - - assert res == 1 - - def test_exec_unicode(self): - # 's' is a string - s = "x = u'\xd0\xb9\xd1\x86\xd1\x83\xd0\xba\xd0\xb5\xd0\xbd'" - # 'u' is a unicode - u = s.decode('utf-8') - exec u - assert len(x) == 6 - assert ord(x[0]) == 0x0439 - assert ord(x[1]) == 0x0446 - assert ord(x[2]) == 0x0443 - assert ord(x[3]) == 0x043a - assert ord(x[4]) == 0x0435 - assert ord(x[5]) == 0x043d - - def test_eval_unicode(self): - u = "u'%s'" % unichr(0x1234) - v = eval(u) - assert v == unichr(0x1234) - - def test_compile_unicode(self): - s = "x = u'\xd0\xb9\xd1\x86\xd1\x83\xd0\xba\xd0\xb5\xd0\xbd'" - u = s.decode('utf-8') - c = compile(u, '', 'exec') - exec c - assert len(x) == 6 - assert ord(x[0]) == 0x0439 - - def test_nested_qualified_exec(self): - import sys - if sys.version_info < (2, 7, 9): - skip() - code = [""" -def g(): - def f(): - if True: - exec "" in {}, {} - """, """ -def g(): - def f(): - if True: - exec("", {}, {}) - """] - for c in code: - compile(c, "", "exec") - - def test_exec_tuple(self): - # note: this is VERY different than testing exec("a = 42", d), because - # this specific case is handled specially by the AST compiler - d = {} - x = ("a = 42", d) - exec x - assert d['a'] == 42 diff -Nru pypy-7.1.1+dfsg/pypy/interpreter/test/test_extmodules.py pypy-7.3.1+dfsg/pypy/interpreter/test/test_extmodules.py --- pypy-7.1.1+dfsg/pypy/interpreter/test/test_extmodules.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/interpreter/test/test_extmodules.py 2020-04-10 19:28:40.000000000 +0000 @@ -2,10 +2,10 @@ import pytest from pypy.config.pypyoption import get_pypy_config -from pypy.objspace.std import StdObjSpace +from pypy.objspace.std.objspace import StdObjSpace from rpython.tool.udir import udir -mod_init = """ +mod_def = """ from pypy.interpreter.mixedmodule import MixedModule import time @@ -45,8 +45,9 @@ pkg.join("__init__.py").write("# package") mod = pkg.join("extmod") mod.ensure(dir=True) - mod.join("__init__.py").write(mod_init) + mod.join("__init__.py").write("#") mod.join("interp_time.py").write(mod_interp) + mod.join("moduledef.py").write(mod_def) class AppTestExtModules(object): def setup_class(cls): diff -Nru pypy-7.1.1+dfsg/pypy/interpreter/test/test_function.py pypy-7.3.1+dfsg/pypy/interpreter/test/test_function.py --- pypy-7.1.1+dfsg/pypy/interpreter/test/test_function.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/interpreter/test/test_function.py 2020-04-10 19:28:40.000000000 +0000 @@ -1,620 +1,10 @@ -import pytest, sys +import pytest from pypy.interpreter import eval from pypy.interpreter.function import Function, Method, descr_function_get from pypy.interpreter.pycode import PyCode from pypy.interpreter.argument import Arguments -class AppTestFunctionIntrospection: - def test_attributes(self): - globals()['__name__'] = 'mymodulename' - def f(): pass - assert hasattr(f, 'func_code') - assert f.func_defaults == None - f.func_defaults = None - assert f.func_defaults == None - assert f.func_dict == {} - assert type(f.func_globals) == dict - assert f.func_globals is f.__globals__ - assert f.func_closure is None - assert f.func_doc == None - assert f.func_name == 'f' - assert f.__module__ == 'mymodulename' - - def test_code_is_ok(self): - def f(): pass - assert not hasattr(f.func_code, '__dict__') - - def test_underunder_attributes(self): - def f(): pass - assert f.__name__ == 'f' - assert f.__doc__ == None - assert f.__name__ == f.func_name - assert f.__doc__ == f.func_doc - assert f.__dict__ is f.func_dict - assert f.__code__ is f.func_code - assert f.__defaults__ is f.func_defaults - assert hasattr(f, '__class__') - - def test_classmethod(self): - def f(): - pass - assert classmethod(f).__func__ is f - assert staticmethod(f).__func__ is f - - def test_write_doc(self): - def f(): "hello" - assert f.__doc__ == 'hello' - f.__doc__ = 'good bye' - assert f.__doc__ == 'good bye' - del f.__doc__ - assert f.__doc__ == None - - def test_write_func_doc(self): - def f(): "hello" - assert f.func_doc == 'hello' - f.func_doc = 'good bye' - assert f.func_doc == 'good bye' - del f.func_doc - assert f.func_doc == None - - def test_write_module(self): - def f(): "hello" - f.__module__ = 'ab.c' - assert f.__module__ == 'ab.c' - del f.__module__ - assert f.__module__ is None - - def test_new(self): - def f(): return 42 - FuncType = type(f) - f2 = FuncType(f.func_code, f.func_globals, 'f2', None, None) - assert f2() == 42 - - def g(x): - def f(): - return x - return f - f = g(42) - raises(TypeError, FuncType, f.func_code, f.func_globals, 'f2', None, None) - - def test_write_code(self): - def f(): - return 42 - def g(): - return 41 - assert f() == 42 - assert g() == 41 - raises(TypeError, "f.func_code = 1") - f.func_code = g.func_code - assert f() == 41 - def h(): - return f() # a closure - raises(ValueError, "f.func_code = h.func_code") - - def test_write_code_builtin_forbidden(self): - def f(*args): - return 42 - raises(TypeError, "dir.func_code = f.func_code") - raises(TypeError, "list.append.im_func.func_code = f.func_code") - - def test_set_module_to_name_eagerly(self): - skip("fails on PyPy but works on CPython. Unsure we want to care") - exec '''if 1: - __name__ = "foo" - def f(): pass - __name__ = "bar" - assert f.__module__ == "foo"''' in {} - - def test_set_name(self): - def f(): pass - f.__name__ = 'g' - assert f.func_name == 'g' - raises(TypeError, "f.__name__ = u'g'") - - -class AppTestFunction: - def test_simple_call(self): - def func(arg1, arg2): - return arg1, arg2 - res = func(23,42) - assert res[0] == 23 - assert res[1] == 42 - - def test_simple_call_default(self): - def func(arg1, arg2=11, arg3=111): - return arg1, arg2, arg3 - res = func(1) - assert res[0] == 1 - assert res[1] == 11 - assert res[2] == 111 - res = func(1, 22) - assert res[0] == 1 - assert res[1] == 22 - assert res[2] == 111 - res = func(1, 22, 333) - assert res[0] == 1 - assert res[1] == 22 - assert res[2] == 333 - - raises(TypeError, func) - raises(TypeError, func, 1, 2, 3, 4) - - def test_simple_varargs(self): - def func(arg1, *args): - return arg1, args - res = func(23,42) - assert res[0] == 23 - assert res[1] == (42,) - - res = func(23, *(42,)) - assert res[0] == 23 - assert res[1] == (42,) - - def test_simple_kwargs(self): - def func(arg1, **kwargs): - return arg1, kwargs - res = func(23, value=42) - assert res[0] == 23 - assert res[1] == {'value': 42} - - res = func(23, **{'value': 42}) - assert res[0] == 23 - assert res[1] == {'value': 42} - - def test_kwargs_sets_wrong_positional_raises(self): - def func(arg1): - pass - raises(TypeError, func, arg2=23) - - def test_kwargs_sets_positional(self): - def func(arg1): - return arg1 - res = func(arg1=42) - assert res == 42 - - def test_kwargs_sets_positional_mixed(self): - def func(arg1, **kw): - return arg1, kw - res = func(arg1=42, something=23) - assert res[0] == 42 - assert res[1] == {'something': 23} - - def test_kwargs_sets_positional_twice(self): - def func(arg1, **kw): - return arg1, kw - raises( - TypeError, func, 42, {'arg1': 23}) - - @pytest.mark.skipif("config.option.runappdirect") - def test_kwargs_nondict_mapping(self): - class Mapping: - def keys(self): - return ('a', 'b') - def __getitem__(self, key): - return key - def func(arg1, **kw): - return arg1, kw - res = func(23, **Mapping()) - assert res[0] == 23 - assert res[1] == {'a': 'a', 'b': 'b'} - error = raises(TypeError, lambda: func(42, **[])) - assert error.value.message == ('argument after ** must be a mapping, ' - 'not list') - - def test_default_arg(self): - def func(arg1,arg2=42): - return arg1, arg2 - res = func(arg1=23) - assert res[0] == 23 - assert res[1] == 42 - - def test_defaults_keyword_overrides(self): - def func(arg1=42, arg2=23): - return arg1, arg2 - res = func(arg1=23) - assert res[0] == 23 - assert res[1] == 23 - - def test_defaults_keyword_override_but_leaves_empty_positional(self): - def func(arg1,arg2=42): - return arg1, arg2 - raises(TypeError, func, arg2=23) - - def test_kwargs_disallows_same_name_twice(self): - def func(arg1, **kw): - return arg1, kw - raises(TypeError, func, 42, **{'arg1': 23}) - - def test_kwargs_bound_blind(self): - class A(object): - def func(self, **kw): - return self, kw - func = A().func - - # don't want the extra argument passing of raises - try: - func(self=23) - assert False - except TypeError: - pass - - try: - func(**{'self': 23}) - assert False - except TypeError: - pass - - def test_kwargs_confusing_name(self): - def func(self): # 'self' conflicts with the interp-level - return self*7 # argument to call_function() - res = func(self=6) - assert res == 42 - - def test_get(self): - def func(self): return self - obj = object() - meth = func.__get__(obj, object) - assert meth() == obj - - def test_none_get_interaction(self): - skip("XXX issue #2083") - assert type(None).__repr__(None) == 'None' - - def test_none_get_interaction_2(self): - f = None.__repr__ - assert f() == 'None' - - def test_no_get_builtin(self): - assert not hasattr(dir, '__get__') - class A(object): - ord = ord - a = A() - assert a.ord('a') == 97 - - def test_builtin_as_special_method_is_not_bound(self): - class A(object): - __getattr__ = len - a = A() - assert a.a == 1 - assert a.ab == 2 - assert a.abcdefghij == 10 - - def test_call_builtin(self): - s = 'hello' - raises(TypeError, len) - assert len(s) == 5 - raises(TypeError, len, s, s) - raises(TypeError, len, s, s, s) - assert len(*[s]) == 5 - assert len(s, *[]) == 5 - raises(TypeError, len, some_unknown_keyword=s) - raises(TypeError, len, s, some_unknown_keyword=s) - raises(TypeError, len, s, s, some_unknown_keyword=s) - - @pytest.mark.skipif("config.option.runappdirect") - def test_call_error_message(self): - try: - len() - except TypeError as e: - assert "len() takes exactly 1 argument (0 given)" in e.message - else: - assert 0, "did not raise" - - try: - len(1, 2) - except TypeError as e: - assert "len() takes exactly 1 argument (2 given)" in e.message - else: - assert 0, "did not raise" - - def test_unicode_docstring(self): - def f(): - u"hi" - assert f.__doc__ == u"hi" - assert type(f.__doc__) is unicode - - def test_issue1293(self): - def f1(): "doc f1" - def f2(): "doc f2" - f1.func_code = f2.func_code - assert f1.__doc__ == "doc f1" - - def test_subclassing(self): - # cannot subclass 'function' or 'builtin_function' - def f(): - pass - raises(TypeError, type, 'Foo', (type(f),), {}) - raises(TypeError, type, 'Foo', (type(len),), {}) - - def test_lambda_docstring(self): - # Like CPython, (lambda:"foo") has a docstring of "foo". - # But let's not test that. Just test that (lambda:42) does not - # have 42 as docstring. - f = lambda: 42 - assert f.func_doc is None - - @pytest.mark.skipif("config.option.runappdirect") - def test_setstate_called_with_wrong_args(self): - f = lambda: 42 - # not sure what it should raise, since CPython doesn't have setstate - # on function types - raises(ValueError, type(f).__setstate__, f, (1, 2, 3)) - -class AppTestMethod: - def setup_class(cls): - cls.w_runappdirect_on_cpython = cls.space.wrap( - cls.runappdirect and - '__pypy__' not in sys.builtin_module_names) - - def test_simple_call(self): - class A(object): - def func(self, arg2): - return self, arg2 - a = A() - res = a.func(42) - assert res[0] is a - assert res[1] == 42 - - def test_simple_varargs(self): - class A(object): - def func(self, *args): - return self, args - a = A() - res = a.func(42) - assert res[0] is a - assert res[1] == (42,) - - res = a.func(*(42,)) - assert res[0] is a - assert res[1] == (42,) - - def test_obscure_varargs(self): - class A(object): - def func(*args): - return args - a = A() - res = a.func(42) - assert res[0] is a - assert res[1] == 42 - - res = a.func(*(42,)) - assert res[0] is a - assert res[1] == 42 - - def test_simple_kwargs(self): - class A(object): - def func(self, **kwargs): - return self, kwargs - a = A() - - res = a.func(value=42) - assert res[0] is a - assert res[1] == {'value': 42} - - res = a.func(**{'value': 42}) - assert res[0] is a - assert res[1] == {'value': 42} - - def test_get(self): - def func(self): return self - class Object(object): pass - obj = Object() - # Create bound method from function - obj.meth = func.__get__(obj, Object) - assert obj.meth() == obj - # Create bound method from method - meth2 = obj.meth.__get__(obj, Object) - assert meth2() == obj - - def test_get_get(self): - # sanxiyn's test from email - def m(self): return self - class C(object): pass - class D(C): pass - C.m = m - D.m = C.m - c = C() - assert c.m() == c - d = D() - assert d.m() == d - - def test_method_eq(self): - class C(object): - def m(): pass - c = C() - assert C.m == C.m - assert c.m == c.m - assert not (C.m == c.m) - assert not (c.m == C.m) - c2 = C() - assert (c.m == c2.m) is False - assert (c.m != c2.m) is True - assert (c.m != c.m) is False - - def test_method_hash(self): - class C(object): - def m(): pass - class D(C): - pass - c = C() - assert hash(C.m) == hash(D.m) - assert hash(c.m) == hash(c.m) - - def test_method_repr(self): - class A(object): - def f(self): - pass - assert repr(A.f) == "" - assert repr(A().f).startswith(">") - class B: - def f(self): - pass - assert repr(B.f) == "" - assert repr(B().f).startswith(">") - - assert repr(type(A.f)) == repr(type(A().f)) == "" - - - def test_method_call(self): - class C(object): - def __init__(self, **kw): - pass - c = C(type='test') - - def test_method_w_callable(self): - class A(object): - def __call__(self, x): - return x - import new - im = new.instancemethod(A(), 3) - assert im() == 3 - - def test_method_w_callable_call_function(self): - class A(object): - def __call__(self, x, y): - return x+y - import new - im = new.instancemethod(A(), 3) - assert map(im, [4]) == [7] - - def test_unbound_typecheck(self): - class A(object): - def foo(self, *args): - return args - class B(A): - pass - class C(A): - pass - - assert A.foo(A(), 42) == (42,) - assert A.foo(B(), 42) == (42,) - raises(TypeError, A.foo, 5) - raises(TypeError, B.foo, C()) - try: - class Fun: - __metaclass__ = A.foo - assert 0 # should have raised - except TypeError: - pass - class Fun: - __metaclass__ = A().foo - assert Fun[:2] == ('Fun', ()) - - def test_unbound_abstract_typecheck(self): - import new - def f(*args): - return args - m = new.instancemethod(f, None, "foobar") - raises(TypeError, m) - raises(TypeError, m, None) - raises(TypeError, m, "egg") - - m = new.instancemethod(f, None, (str, int)) # really obscure... - assert m(4) == (4,) - assert m("uh") == ("uh",) - raises(TypeError, m, []) - - class MyBaseInst(object): - pass - class MyInst(MyBaseInst): - def __init__(self, myclass): - self.myclass = myclass - def __class__(self): - if self.myclass is None: - raise AttributeError - return self.myclass - __class__ = property(__class__) - class MyClass(object): - pass - BBase = MyClass() - BSub1 = MyClass() - BSub2 = MyClass() - BBase.__bases__ = () - BSub1.__bases__ = (BBase,) - BSub2.__bases__ = (BBase,) - x = MyInst(BSub1) - m = new.instancemethod(f, None, BSub1) - assert m(x) == (x,) - raises(TypeError, m, MyInst(BBase)) - raises(TypeError, m, MyInst(BSub2)) - raises(TypeError, m, MyInst(None)) - raises(TypeError, m, MyInst(42)) - - def test_invalid_creation(self): - import new - def f(): pass - raises(TypeError, new.instancemethod, f, None) - - def test_empty_arg_kwarg_call(self): - def f(): - pass - - raises(TypeError, lambda: f(*0)) - raises(TypeError, lambda: f(**0)) - - def test_method_equal(self): - class A(object): - def m(self): - pass - - class X(object): - def __eq__(self, other): - return True - - assert A().m == X() - assert X() == A().m - - def test_method_equals_with_identity(self): - from types import MethodType - class CallableBadEq(object): - def __call__(self): - pass - def __eq__(self, other): - raise ZeroDivisionError - func = CallableBadEq() - meth = MethodType(func, object) - assert meth == meth - assert meth == MethodType(func, object) - - def test_method_identity(self): - class A(object): - def m(self): - pass - def n(self): - pass - - class B(A): - pass - - class X(object): - def __eq__(self, other): - return True - - a = A() - a2 = A() - x = a.m; y = a.m - assert x is not y - assert id(x) != id(y) - assert x == y - assert x is not a.n - assert id(x) != id(a.n) - assert x is not a2.m - assert id(x) != id(a2.m) - - if not self.runappdirect_on_cpython: - assert A.m is A.m - assert id(A.m) == id(A.m) - assert A.m == A.m - x = A.m - assert x is not A.n - assert id(x) != id(A.n) - assert x is not B.m - assert id(x) != id(B.m) - - class TestMethod: def setup_method(self, method): def c(self, bar): diff -Nru pypy-7.1.1+dfsg/pypy/interpreter/test/test_gateway.py pypy-7.3.1+dfsg/pypy/interpreter/test/test_gateway.py --- pypy-7.1.1+dfsg/pypy/interpreter/test/test_gateway.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/interpreter/test/test_gateway.py 2020-04-10 19:28:40.000000000 +0000 @@ -966,6 +966,29 @@ # white-box check for opt assert called[0] is args + def test_base_regular_descr_mismatch(self): + space = self.space + + def f(): + raise gateway.DescrMismatch + + w_f = space.wrap(gateway.interp2app_temp(f, + unwrap_spec=[])) + args = argument.Arguments(space, []) + space.raises_w(space.w_SystemError, space.call_args, w_f, args) + + def test_pass_trough_arguments0_descr_mismatch(self): + space = self.space + + def f(space, __args__): + raise gateway.DescrMismatch + + w_f = space.wrap(gateway.interp2app_temp(f, + unwrap_spec=[gateway.ObjSpace, + gateway.Arguments])) + args = argument.Arguments(space, []) + space.raises_w(space.w_SystemError, space.call_args, w_f, args) + class AppTestKeywordsToBuiltinSanity(object): def test_type(self): @@ -1005,3 +1028,19 @@ d.update(**{clash: 33}) dict.update(d, **{clash: 33}) + + + +class AppTestFastPathCrash(object): + def test_fast_path_crash(self): + # issue bb-3091 crash in BuiltinCodePassThroughArguments0.funcrun + import sys + if '__pypy__' in sys.modules: + msg_fmt = "%s instance as first argument (got %s" + else: + msg_fmt = "'%s' object but received a '%s'" + for obj in (dict, set): + with raises(TypeError) as excinfo: + obj.__init__(0) + msg = msg_fmt % (obj.__name__, 'int') + assert msg in str(excinfo.value) diff -Nru pypy-7.1.1+dfsg/pypy/interpreter/test/test_generator.py pypy-7.3.1+dfsg/pypy/interpreter/test/test_generator.py --- pypy-7.1.1+dfsg/pypy/interpreter/test/test_generator.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/interpreter/test/test_generator.py 2020-04-10 19:28:40.000000000 +0000 @@ -1,310 +1,3 @@ -class AppTestGenerator: - - def test_generator(self): - def f(): - yield 1 - assert f().next() == 1 - - def test_generator2(self): - def f(): - yield 1 - g = f() - assert g.next() == 1 - raises(StopIteration, g.next) - - def test_attributes(self): - def f(): - yield 1 - assert g.gi_running - g = f() - assert g.gi_code is f.__code__ - assert g.__name__ == 'f' - assert g.gi_frame is not None - assert not g.gi_running - g.next() - assert not g.gi_running - raises(StopIteration, g.next) - assert not g.gi_running - assert g.gi_frame is None - assert g.gi_code is f.__code__ - assert g.__name__ == 'f' - - def test_generator3(self): - def f(): - yield 1 - g = f() - assert list(g) == [1] - - def test_generator4(self): - def f(): - yield 1 - g = f() - assert [x for x in g] == [1] - - def test_generator5(self): - d = {} - exec """if 1: - def f(): - v = (yield ) - yield v - g = f() - g.next() - """ in d - g = d['g'] - assert g.send(42) == 42 - - def test_throw1(self): - def f(): - yield 2 - g = f() - # two arguments version - raises(NameError, g.throw, NameError, "Error") - - def test_throw2(self): - def f(): - yield 2 - g = f() - # single argument version - raises(NameError, g.throw, NameError("Error")) - - def test_throw3(self): - def f(): - try: - yield 1 - yield 2 - except: - yield 3 - g = f() - assert g.next() == 1 - assert g.throw(NameError("Error")) == 3 - raises(StopIteration, g.next) - - def test_throw4(self): - d = {} - exec """if 1: - def f(): - try: - yield 1 - v = (yield 2) - except: - yield 3 - g = f() - """ in d - g = d['g'] - assert g.next() == 1 - assert g.next() == 2 - assert g.throw(NameError("Error")) == 3 - raises(StopIteration, g.next) - - def test_throw5(self): - def f(): - try: - yield 1 - except: - x = 3 - try: - yield x - except: - pass - g = f() - g.next() - # String exceptions are not allowed anymore - raises(TypeError, g.throw, "Error") - assert g.throw(Exception) == 3 - raises(StopIteration, g.throw, Exception) - - def test_throw6(self): - def f(): - yield 2 - g = f() - raises(NameError, g.throw, NameError, "Error", None) - - - def test_throw_fail(self): - def f(): - yield 1 - g = f() - raises(TypeError, g.throw, NameError("Error"), "error") - - def test_throw_fail2(self): - def f(): - yield 1 - g = f() - raises(TypeError, g.throw, list()) - - def test_throw_fail3(self): - def f(): - yield 1 - g = f() - raises(TypeError, g.throw, NameError("Error"), None, "not tb object") - - def test_throw_finishes_generator(self): - def f(): - yield 1 - g = f() - assert g.gi_frame is not None - raises(ValueError, g.throw, ValueError) - assert g.gi_frame is None - - def test_throw_bug(self): - def f(): - try: - x.throw(IndexError) # => "generator already executing" - except ValueError: - yield 1 - x = f() - res = list(x) - assert res == [1] - - def test_throw_on_finished_generator(self): - def f(): - yield 1 - g = f() - res = g.next() - assert res == 1 - raises(StopIteration, g.next) - raises(NameError, g.throw, NameError) - - def test_close(self): - def f(): - yield 1 - g = f() - assert g.close() is None - - def test_close2(self): - def f(): - try: - yield 1 - except GeneratorExit: - raise StopIteration - g = f() - g.next() - assert g.close() is None - - def test_close3(self): - def f(): - try: - yield 1 - except GeneratorExit: - raise NameError - g = f() - g.next() - raises(NameError, g.close) - - def test_close_fail(self): - def f(): - try: - yield 1 - except GeneratorExit: - yield 2 - g = f() - g.next() - raises(RuntimeError, g.close) - - def test_close_on_collect(self): - ## we need to exec it, else it won't run on python2.4 - d = {} - exec """ - def f(): - try: - yield - finally: - f.x = 42 - """.strip() in d - - g = d['f']() - g.next() - del g - import gc - gc.collect() - assert d['f'].x == 42 - - def test_generator_raises_typeerror(self): - def f(): - yield 1 - g = f() - raises(TypeError, g.send) # one argument required - raises(TypeError, g.send, 1) # not started, must send None - - def test_generator_explicit_stopiteration(self): - def f(): - yield 1 - raise StopIteration - g = f() - assert [x for x in g] == [1] - - def test_generator_propagate_stopiteration(self): - def f(): - it = iter([1]) - while 1: yield it.next() - g = f() - assert [x for x in g] == [1] - - def test_generator_restart(self): - def g(): - i = me.next() - yield i - me = g() - raises(ValueError, me.next) - - def test_generator_expression(self): - exec "res = sum(i*i for i in range(5))" - assert res == 30 - - def test_generator_expression_2(self): - d = {} - exec """ -def f(): - total = sum(i for i in [x for x in z]) - return total, x -z = [1, 2, 7] -res = f() -""" in d - assert d['res'] == (10, 7) - - def test_repr(self): - def myFunc(): - yield 1 - g = myFunc() - r = repr(g) - assert r.startswith(" 5 - try: - next(gen) - except TypeError: - pass - - def test_multiple_invalid_sends(self): - def mygen(): - yield 42 - g = mygen() - raises(TypeError, g.send, 2) - raises(TypeError, g.send, 2) - - def test_should_not_inline(space): from pypy.interpreter.generator import should_not_inline w_co = space.appexec([], '''(): diff -Nru pypy-7.1.1+dfsg/pypy/interpreter/test/test_mixedmodule.py pypy-7.3.1+dfsg/pypy/interpreter/test/test_mixedmodule.py --- pypy-7.1.1+dfsg/pypy/interpreter/test/test_mixedmodule.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/interpreter/test/test_mixedmodule.py 2020-04-10 19:28:40.000000000 +0000 @@ -29,7 +29,10 @@ m.install() assert self.space.builtin_modules["test_module"] is m - assert isinstance(self.space.builtin_modules["test_module.sub"], SubModule) + submod = self.space.builtin_modules["test_module.sub"] + assert isinstance(submod, SubModule) + assert submod.get_applevel_name() == "test_module.sub" + class AppTestMixedModule(object): pytestmark = py.test.mark.skipif("config.option.runappdirect") diff -Nru pypy-7.1.1+dfsg/pypy/interpreter/test/test_nestedscope.py pypy-7.3.1+dfsg/pypy/interpreter/test/test_nestedscope.py --- pypy-7.1.1+dfsg/pypy/interpreter/test/test_nestedscope.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/interpreter/test/test_nestedscope.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,136 +0,0 @@ - - -class AppTestNestedScope: - - def test_nested_scope(self): - x = 42 - def f(): return x - assert f() == 42 - - def test_nested_scope2(self): - x = 42 - y = 3 - def f(): return x - assert f() == 42 - - def test_nested_scope3(self): - x = 42 - def f(): - def g(): - return x - return g - assert f()() == 42 - - def test_nested_scope4(self): - def f(): - x = 3 - def g(): - return x - a = g() - x = 4 - b = g() - return (a, b) - assert f() == (3, 4) - - def test_nested_scope_locals(self): - def f(): - x = 3 - def g(): - i = x - return locals() - return g() - d = f() - assert d == {'i':3, 'x':3} - - def test_deeply_nested_scope_locals(self): - def f(): - x = 3 - def g(): - def h(): - i = x - return locals() - return locals(), h() - return g() - outer_locals, inner_locals = f() - assert inner_locals == {'i':3, 'x':3} - keys = outer_locals.keys() - keys.sort() - assert keys == ['h', 'x'] - - def test_lambda_in_genexpr(self): - assert eval('map(apply, (lambda: t for t in range(10)))') == range(10) - - def test_cell_repr(self): - import re - from repr import repr as r # Don't shadow builtin repr - - def get_cell(): - x = 42 - def inner(): - return x - return inner - x = get_cell().__closure__[0] - assert re.match(r'', repr(x)) - assert re.match(r'', r(x)) - - def get_cell(): - if False: - x = 42 - def inner(): - return x - return inner - x = get_cell().__closure__[0] - assert re.match(r'', repr(x)) - - def test_cell_contents(self): - def f(x): - def f(y): - return x + y - return f - - g = f(10) - assert g.func_closure[0].cell_contents == 10 - - def test_empty_cell_contents(self): - - def f(): - def f(y): - return x + y - return f - x = 1 - - g = f() - raises(ValueError, "g.func_closure[0].cell_contents") - - def test_compare_cells(self): - def f(n): - if n: - x = 42 - def f(y): - return x + y - return f - - g0 = f(0).func_closure[0] - g1 = f(1).func_closure[0] - assert cmp(g0, g1) == -1 - - def test_leaking_class_locals(self): - def f(x): - class X: - x = 12 - def f(self): - return x - locals() - return X - assert f(1).x == 12 - - def test_nested_scope_locals_mutating_cellvars(self): - def f(): - x = 12 - def m(): - locals() - x - locals() - return x - return m - assert f()() == 12 diff -Nru pypy-7.1.1+dfsg/pypy/interpreter/test/test_pycode.py pypy-7.3.1+dfsg/pypy/interpreter/test/test_pycode.py --- pypy-7.1.1+dfsg/pypy/interpreter/test/test_pycode.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/interpreter/test/test_pycode.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,54 @@ +from pypy.interpreter.pycode import _code_const_eq + +def test_strong_const_equal(space): + # test that the stronger equal that code objects are supposed to use for + # consts works + s = 'Python' + values = [ + space.newint(1), + space.newfloat(0.0), + space.newfloat(-0.0), + space.newfloat(1.0), + space.newfloat(-1.0), + space.w_True, + space.w_False, + space.w_None, + space.w_Ellipsis, + space.newcomplex(0.0, 0.0), + space.newcomplex(0.0, -0.0), + space.newcomplex(-0.0, 0.0), + space.newcomplex(-0.0, -0.0), + space.newcomplex(1.0, 1.0), + space.newcomplex(1.0, -1.0), + space.newcomplex(-1.0, 1.0), + space.newcomplex(-1.0, -1.0), + space.newfrozenset(), + space.newtuple([]), + space.newutf8(s, len(s)), + space.newbytes(s), + ] + for w_a in values: + assert _code_const_eq(space, w_a, w_a) + assert _code_const_eq(space, space.newtuple([w_a]), + space.newtuple([w_a])) + assert _code_const_eq(space, space.newfrozenset([w_a]), + space.newfrozenset([w_a])) + for w_a in values: + for w_b in values: + if w_a is w_b: + continue + assert not _code_const_eq(space, w_a, w_b) + assert _code_const_eq(space, space.newtuple([w_a, w_b]), + space.newtuple([w_a, w_b])) + assert not _code_const_eq(space, space.newtuple([w_a]), + space.newtuple([w_b])) + assert not _code_const_eq(space, space.newtuple([w_a, w_b]), + space.newtuple([w_b, w_a])) + assert not _code_const_eq(space, space.newfrozenset([w_a]), + space.newfrozenset([w_b])) + s1 = 'Python' + str(1) + str(1) + s2 = 'Python' + str(11) + assert _code_const_eq(space, space.newutf8(s1, len(s1)), + space.newutf8(s2, len(s2))) + assert _code_const_eq(space, space.newbytes(s1), + space.newbytes(s2)) diff -Nru pypy-7.1.1+dfsg/pypy/interpreter/test/test_pyframe.py pypy-7.3.1+dfsg/pypy/interpreter/test/test_pyframe.py --- pypy-7.1.1+dfsg/pypy/interpreter/test/test_pyframe.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/interpreter/test/test_pyframe.py 2020-04-10 19:28:40.000000000 +0000 @@ -1,4 +1,3 @@ -from rpython.tool import udir from pypy.conftest import option from pypy.interpreter.gateway import interp2app @@ -9,8 +8,6 @@ def setup_class(cls): space = cls.space - cls.w_udir = cls.space.wrap(str(udir.udir)) - cls.w_tempfile1 = cls.space.wrap(str(udir.udir.join('tempfile1'))) if not option.runappdirect: w_call_further = cls.space.appexec([], """(): def call_further(f): @@ -25,113 +22,6 @@ # test for the presence of the attributes, not functionality - def test_f_locals(self): - import sys - f = sys._getframe() - assert f.f_locals is locals() - - def test_f_globals(self): - import sys - f = sys._getframe() - assert f.f_globals is globals() - raises(TypeError, "f.f_globals = globals()") - - def test_f_builtins(self): - import sys, __builtin__ - f = sys._getframe() - assert f.f_builtins is __builtin__.__dict__ - - def test_f_code(self): - def g(): - import sys - f = sys._getframe() - return f.f_code - assert g() is g.func_code - - def test_f_trace_del(self): - import sys - f = sys._getframe() - del f.f_trace - assert f.f_trace is None - - def test_f_lineno(self): - def g(): - import sys - f = sys._getframe() - x = f.f_lineno - y = f.f_lineno - z = f.f_lineno - return [x, y, z] - origin = g.func_code.co_firstlineno - assert g() == [origin+3, origin+4, origin+5] - - def test_f_lineno_set(self): - def tracer(f, *args): - def y(f, *args): - return y - def x(f, *args): - f.f_lineno += 1 - return y # "return None" should have the same effect, but see - # test_local_trace_function_returning_None_ignored - return x - - open # force fetching of this name now - - def function(): - xyz - with open(self.tempfile1, 'w') as f: - pass - return 3 - - import sys - sys.settrace(tracer) - function() - sys.settrace(None) - # assert did not crash - - def test_f_lineno_set_firstline(self): - seen = [] - def tracer(f, event, *args): - seen.append((event, f.f_lineno)) - if len(seen) == 5: - f.f_lineno = 1 # bug shown only when setting lineno to 1 - return tracer - - def g(): - import sys - sys.settrace(tracer) - exec "x=1\ny=x+1\nz=y+1\nt=z+1\ns=t+1\n" in {} - sys.settrace(None) - - g() - assert seen == [('call', 1), - ('line', 1), - ('line', 2), - ('line', 3), - ('line', 4), - ('line', 2), - ('line', 3), - ('line', 4), - ('line', 5), - ('return', 5)] - - def test_f_back(self): - import sys - def f(): - assert sys._getframe().f_code.co_name == g() - def g(): - return sys._getframe().f_back.f_code.co_name - f() - - def test_f_back_virtualref(self): - import sys - def f(): - return g() - def g(): - return sys._getframe() - frame = f() - assert frame.f_back.f_code.co_name == 'f' - def test_f_back_hidden(self): if not hasattr(self, 'call_further'): skip("not for runappdirect testing") @@ -148,362 +38,6 @@ assert f1bis is f1 assert f0.f_back is f1 - def test_f_exc_xxx(self): - import sys - - class OuterException(Exception): - pass - class InnerException(Exception): - pass - - def g(exc_info): - f = sys._getframe() - assert f.f_exc_type is None - assert f.f_exc_value is None - assert f.f_exc_traceback is None - try: - raise InnerException - except: - assert f.f_exc_type is exc_info[0] - assert f.f_exc_value is exc_info[1] - assert f.f_exc_traceback is exc_info[2] - try: - raise OuterException - except: - g(sys.exc_info()) - - def test_virtualref_through_traceback(self): - import sys - def g(): - try: - raise ValueError - except: - _, _, tb = sys.exc_info() - return tb - def f(): - return g() - # - tb = f() - assert tb.tb_frame.f_code.co_name == 'g' - assert tb.tb_frame.f_back.f_code.co_name == 'f' - - def test_trace_basic(self): - import sys - l = [] - class Tracer: - def __init__(self, i): - self.i = i - def trace(self, frame, event, arg): - l.append((self.i, frame.f_code.co_name, event, arg)) - if frame.f_code.co_name == 'g2': - return None # don't trace g2 - return Tracer(self.i+1).trace - def g3(n): - n -= 5 - return n - def g2(n): - n += g3(2) - n += g3(7) - return n - def g(n): - n += g2(3) - return n - def f(n): - n = g(n) - return n * 7 - sys.settrace(Tracer(0).trace) - x = f(4) - sys.settrace(None) - assert x == 42 - print l - assert l == [(0, 'f', 'call', None), - (1, 'f', 'line', None), - (0, 'g', 'call', None), - (1, 'g', 'line', None), - (0, 'g2', 'call', None), - (0, 'g3', 'call', None), - (1, 'g3', 'line', None), - (2, 'g3', 'line', None), - (3, 'g3', 'return', -3), - (0, 'g3', 'call', None), - (1, 'g3', 'line', None), - (2, 'g3', 'line', None), - (3, 'g3', 'return', 2), - (2, 'g', 'line', None), - (3, 'g', 'return', 6), - (2, 'f', 'line', None), - (3, 'f', 'return', 42)] - - def test_trace_exc(self): - import sys - l = [] - def ltrace(a,b,c): - if b == 'exception': - l.append(c) - return ltrace - def trace(a,b,c): return ltrace - def f(): - try: - raise Exception - except: - pass - sys.settrace(trace) - f() - sys.settrace(None) - assert len(l) == 1 - assert isinstance(l[0][1], Exception) - - def test_trace_ignore_hidden(self): - import sys - import _testing - - l = [] - def trace(a,b,c): - l.append((a,b,c)) - - def f(): - h = _testing.Hidden() - r = h.meth() - return r - - sys.settrace(trace) - res = f() - sys.settrace(None) - assert len(l) == 1 - assert l[0][1] == 'call' - assert res == 'hidden' # sanity - - def test_trace_hidden_prints(self): - import sys - - l = [] - def trace(a,b,c): - l.append((a,b,c)) - return trace - - outputf = open(self.tempfile1, 'w') - def f(): - print >> outputf, 1 - print >> outputf, 2 - print >> outputf, 3 - return "that's the return value" - - sys.settrace(trace) - f() - sys.settrace(None) - outputf.close() - # should get 1 "call", 3 "line" and 1 "return" events, and no call - # or return for the internal app-level implementation of 'print' - assert len(l) == 6 - assert [what for (frame, what, arg) in l] == [ - 'call', 'line', 'line', 'line', 'line', 'return'] - assert l[-1][2] == "that's the return value" - - def test_trace_return_exc(self): - import sys - l = [] - def trace(a,b,c): - if b in ('exception', 'return'): - l.append((b, c)) - return trace - - def g(): - raise Exception - def f(): - try: - g() - except: - pass - sys.settrace(trace) - f() - sys.settrace(None) - assert len(l) == 4 - assert l[0][0] == 'exception' - assert isinstance(l[0][1][1], Exception) - assert l[1] == ('return', None) - assert l[2][0] == 'exception' - assert isinstance(l[2][1][1], Exception) - assert l[3] == ('return', None) - - def test_trace_raises_on_return(self): - import sys - def trace(frame, event, arg): - if event == 'return': - raise ValueError - else: - return trace - - def f(): return 1 - - for i in xrange(sys.getrecursionlimit() + 1): - sys.settrace(trace) - try: - f() - except ValueError: - pass - - def test_trace_try_finally(self): - import sys - l = [] - def trace(frame, event, arg): - if event == 'exception': - l.append(arg) - return trace - - def g(): - try: - raise Exception - finally: - pass - - def f(): - try: - g() - except: - pass - - sys.settrace(trace) - f() - sys.settrace(None) - assert len(l) == 2 - assert issubclass(l[0][0], Exception) - assert issubclass(l[1][0], Exception) - - def test_trace_raise_three_arg(self): - import sys - l = [] - def trace(frame, event, arg): - if event == 'exception': - l.append(arg) - return trace - - def g(): - try: - raise Exception - except Exception as e: - import sys - raise Exception, e, sys.exc_info()[2] - - def f(): - try: - g() - except: - pass - - sys.settrace(trace) - f() - sys.settrace(None) - assert len(l) == 2 - assert issubclass(l[0][0], Exception) - assert issubclass(l[1][0], Exception) - - def test_trace_generator_finalisation(self): - import sys - l = [] - got_exc = [] - def trace(frame, event, arg): - l.append((frame.f_lineno, event)) - if event == 'exception': - got_exc.append(arg) - return trace - - d = {} - exec """if 1: - def g(): - try: - yield True - finally: - pass - - def f(): - try: - gen = g() - gen.next() - gen.close() - except: - pass - """ in d - f = d['f'] - - sys.settrace(trace) - f() - sys.settrace(None) - assert len(got_exc) == 1 - assert issubclass(got_exc[0][0], GeneratorExit) - assert l == [(8, 'call'), - (9, 'line'), - (10, 'line'), - (11, 'line'), - (2, 'call'), - (3, 'line'), - (4, 'line'), - (4, 'return'), - (12, 'line'), - (4, 'call'), - (4, 'exception'), - (6, 'line'), - (6, 'return'), - (12, 'return')] - - def test_dont_trace_on_reraise(self): - import sys - l = [] - def ltrace(a,b,c): - if b == 'exception': - l.append(c) - return ltrace - def trace(a,b,c): return ltrace - def f(): - try: - 1/0 - except: - try: - raise - except: - pass - sys.settrace(trace) - f() - sys.settrace(None) - assert len(l) == 1 - assert issubclass(l[0][0], Exception) - - def test_dont_trace_on_raise_with_tb(self): - import sys - l = [] - def ltrace(a,b,c): - if b == 'exception': - l.append(c) - return ltrace - def trace(a,b,c): return ltrace - def f(): - try: - raise Exception - except: - return sys.exc_info() - def g(): - exc, val, tb = f() - try: - raise exc, val, tb - except: - pass - sys.settrace(trace) - g() - sys.settrace(None) - assert len(l) == 1 - assert isinstance(l[0][1], Exception) - - def test_trace_changes_locals(self): - import sys - def trace(frame, what, arg): - frame.f_locals['x'] = 42 - return trace - def f(x): - return x - sys.settrace(trace) - res = f(1) - sys.settrace(None) - assert res == 42 - def test_fast2locals_called_lazily(self): import sys class FrameHolder: @@ -522,110 +56,3 @@ assert res == 2 if hasattr(self, "check_no_w_locals"): # not appdirect assert self.check_no_w_locals(fh.frame) - - def test_set_unset_f_trace(self): - import sys - seen = [] - def trace1(frame, what, arg): - seen.append((1, frame, frame.f_lineno, what, arg)) - return trace1 - def trace2(frame, what, arg): - seen.append((2, frame, frame.f_lineno, what, arg)) - return trace2 - def set_the_trace(f): - f.f_trace = trace1 - sys.settrace(trace2) - len(seen) # take one line: should not be traced - f = sys._getframe() - set_the_trace(f) - len(seen) # take one line: should not be traced - len(seen) # take one line: should not be traced - sys.settrace(None) # and this line should be the last line traced - len(seen) # take one line - del f.f_trace - len(seen) # take one line - firstline = set_the_trace.func_code.co_firstlineno - assert seen == [(1, f, firstline + 6, 'line', None), - (1, f, firstline + 7, 'line', None), - (1, f, firstline + 8, 'line', None)] - - def test_locals2fast_freevar_bug(self): - import sys - def f(n): - class A(object): - def g(self): - return n - n = 42 - return A() - res = f(10).g() - assert res == 10 - # - def trace(*args): - return trace - sys.settrace(trace) - res = f(10).g() - sys.settrace(None) - assert res == 10 - - def test_throw_trace_bug(self): - import sys - def f(): - yield 5 - gen = f() - assert next(gen) == 5 - seen = [] - def trace_func(frame, event, *args): - seen.append(event) - return trace_func - sys.settrace(trace_func) - try: - gen.throw(ValueError) - except ValueError: - pass - sys.settrace(None) - assert seen == ['call', 'exception', 'return'] - - def test_generator_trace_stopiteration(self): - import sys - def f(): - yield 5 - gen = f() - assert next(gen) == 5 - seen = [] - def trace_func(frame, event, *args): - print('TRACE:', frame, event, args) - seen.append(event) - return trace_func - def g(): - for x in gen: - never_entered - sys.settrace(trace_func) - g() - sys.settrace(None) - print 'seen:', seen - # on Python 3 we get an extra 'exception' when 'for' catches - # StopIteration - assert seen == ['call', 'line', 'call', 'return', 'return'] - - def test_local_trace_function_returning_None_ignored(self): - # behave the same as CPython does, and in contradiction with - # the documentation. - def tracer(f, event, arg): - assert event == 'call' - return local_tracer - - seen = [] - def local_tracer(f, event, arg): - seen.append(event) - return None # but 'local_tracer' will be called again - - def function(): - a = 1 - a = 2 - a = 3 - - import sys - sys.settrace(tracer) - function() - sys.settrace(None) - assert seen == ["line", "line", "line", "return"] diff -Nru pypy-7.1.1+dfsg/pypy/interpreter/test/test_raise.py pypy-7.3.1+dfsg/pypy/interpreter/test/test_raise.py --- pypy-7.1.1+dfsg/pypy/interpreter/test/test_raise.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/interpreter/test/test_raise.py 2020-04-10 19:28:40.000000000 +0000 @@ -2,9 +2,8 @@ class AppTestRaise: def test_arg_as_string(self): - def f(): + with raises(TypeError): raise "test" - raises(TypeError, f) def test_control_flow(self): try: @@ -49,9 +48,8 @@ assert isinstance(e, IndexError) def test_raise_cls(self): - def f(): + with raises(IndexError): raise IndexError - raises(IndexError, f) def test_raise_cls_catch(self): def f(r): @@ -59,7 +57,8 @@ raise r except LookupError: return 1 - raises(Exception, f, Exception) + with raises(Exception): + f(Exception) assert f(IndexError) == 1 def test_raise_wrong(self): @@ -87,7 +86,7 @@ def test_reraise(self): # some collection of funny code import sys - raises(ValueError, """ + with raises(ValueError): import sys try: raise ValueError @@ -97,8 +96,7 @@ finally: assert sys.exc_info()[0] is ValueError raise - """) - raises(ValueError, """ + with raises(ValueError): def foo(): import sys assert sys.exc_info()[0] is ValueError @@ -110,8 +108,7 @@ raise IndexError finally: foo() - """) - raises(IndexError, """ + with raises(IndexError): def spam(): import sys try: @@ -126,7 +123,6 @@ raise IndexError finally: spam() - """) try: raise ValueError @@ -137,7 +133,7 @@ ok = sys.exc_info()[0] is KeyError assert ok - raises(IndexError, """ + with raises(IndexError): import sys try: raise ValueError @@ -151,28 +147,22 @@ finally: assert sys.exc_info()[0] is KeyError assert sys.exc_info()[2] is not some_traceback - """) def test_tuple_type(self): - def f(): + with raises(StopIteration): raise ((StopIteration, 123), 456, 789) - raises(StopIteration, f) def test_userclass(self): # new-style classes can't be raised unless they inherit from # BaseException - class A(object): def __init__(self, x=None): self.x = x - - def f(): - raise A - raises(TypeError, f) - def f(): + with raises(TypeError): + raise A + with raises(TypeError): raise A(42) - raises(TypeError, f) def test_it(self): class C: @@ -231,7 +221,7 @@ def test_catch_tuple(self): class A: pass - + try: raise ValueError except (ValueError, A): @@ -279,7 +269,9 @@ class MyException(Exception): def __new__(cls, *args): return object() - raises(TypeError, "raise MyException") + + with raises(TypeError): + raise MyException def test_with_exit_True(self): class X: diff -Nru pypy-7.1.1+dfsg/pypy/interpreter/test/test_syntax.py pypy-7.3.1+dfsg/pypy/interpreter/test/test_syntax.py --- pypy-7.1.1+dfsg/pypy/interpreter/test/test_syntax.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/interpreter/test/test_syntax.py 2020-04-10 19:28:40.000000000 +0000 @@ -404,9 +404,6 @@ class AppTestWith: def test_with_simple(self): - - s = """ -if 1: class Context: def __init__(self): self.calls = list() @@ -420,74 +417,28 @@ acontext = Context() with acontext: pass - """ - exec s - assert acontext.calls == '__enter__ __exit__'.split() def test_compound_with(self): - s = """class Context: - def __init__(self, var): - self.record = [] - self.var = var - def __enter__(self): - self.record.append(("__enter__", self.var)) - return self.var - def __exit__(self, tp, value, tb): - self.record.append(("__exit__", self.var)) -c1 = Context("blah") -c2 = Context("bling") -with c1 as v1, c2 as v2: - pass - """ - ns = {} - exec s in ns - assert ns["v1"] == "blah" - assert ns["v2"] == "bling" - assert ns["c1"].record == [("__enter__", "blah"), ("__exit__", "blah")] - assert ns["c2"].record == [("__enter__", "bling"), - ("__exit__", "bling")] - - - def test_start_with_blank_line(self): - s = """ -if 1: class Context: - def __init__(self): - self.calls = list() - + def __init__(self, var): + self.record = [] + self.var = var def __enter__(self): - self.calls.append('__enter__') - - def __exit__(self, exc_type, exc_value, exc_tb): - self.calls.append('__exit__') - - acontext = Context() - with acontext: + self.record.append(("__enter__", self.var)) + return self.var + def __exit__(self, tp, value, tb): + self.record.append(("__exit__", self.var)) + c1 = Context("blah") + c2 = Context("bling") + with c1 as v1, c2 as v2: pass -""" - exec s - assert acontext.calls == '__enter__ __exit__'.split() - - def test_raw_doc_string(self): - s = """r'doc' -class Context(object): - def __enter__(self): - global enter - enter = True - def __exit__(self, *exc): - global exit - exit = True -with Context() as w: - pass""" - exec s - assert enter - assert exit + assert v1 == "blah" + assert v2 == "bling" + assert c1.record == [("__enter__", "blah"), ("__exit__", "blah")] + assert c2.record == [("__enter__", "bling"), ("__exit__", "bling")] def test_with_as_var(self): - - s = """ -if 1: class Context: def __init__(self): self.calls = list() @@ -504,16 +455,10 @@ with acontextfact as avar: avar.append('__body__') pass - """ - exec s - assert acontextfact.exit_params == (None, None, None) assert acontextfact.calls == '__enter__ __body__ __exit__'.split() def test_with_raise_exception(self): - - s = """ -if 1: class Context: def __init__(self): self.calls = list() @@ -537,18 +482,12 @@ pass else: raise AssertionError('With did not raise RuntimeError') - """ - exec s - assert acontextfact.calls == '__enter__ __body__ __exit__'.split() assert acontextfact.exit_params[0:2] == (RuntimeError, error) import types assert isinstance(acontextfact.exit_params[2], types.TracebackType) def test_with_swallow_exception(self): - - s = """ -if 1: class Context: def __init__(self): self.calls = list() @@ -568,9 +507,6 @@ avar.append('__body__') raise error avar.append('__after_raise__') - """ - exec s - assert acontextfact.calls == '__enter__ __body__ __exit__'.split() assert acontextfact.exit_params[0:2] == (RuntimeError, error) import types @@ -595,9 +531,6 @@ assert c.calls == ['exit'] def test_with_break(self): - - s = """ -if 1: class Context: def __init__(self): self.calls = list() @@ -619,16 +552,10 @@ avar.append('__after_break__') else: raise AssertionError('Break failed with With, reached else clause') - """ - exec s - assert acontextfact.calls == '__enter__ __body__ __exit__'.split() assert acontextfact.exit_params == (None, None, None) def test_with_continue(self): - - s = """ -if 1: class Context: def __init__(self): self.calls = list() @@ -650,15 +577,10 @@ avar.append('__after_continue__') else: avar.append('__continue__') - """ - exec s - assert acontextfact.calls == '__enter__ __body__ __exit__ __continue__'.split() assert acontextfact.exit_params == (None, None, None) def test_with_return(self): - s = """ -if 1: class Context: def __init__(self): self.calls = list() @@ -679,27 +601,16 @@ return '__return__' avar.append('__after_return__') acontextfact.calls.append(g(acontextfact)) - """ - exec s - assert acontextfact.calls == '__enter__ __body__ __exit__ __return__'.split() assert acontextfact.exit_params == (None, None, None) def test_with_as_keyword(self): - try: + with raises(SyntaxError): exec "with = 9" - except SyntaxError: - pass - else: - assert False, 'Assignment to with did not raise SyntaxError' def test_with_as_keyword_compound(self): - try: + with raises(SyntaxError): exec "from __future__ import generators, with_statement\nwith = 9" - except SyntaxError: - pass - else: - assert False, 'Assignment to with did not raise SyntaxError' def test_missing_as_SyntaxError(self): snippets = [ @@ -710,21 +621,9 @@ pass """] for snippet in snippets: - try: + with raises(SyntaxError): exec snippet - except SyntaxError: - pass - else: - assert False, "%s: did not raise SyntaxError" % snippet - - def test_with_propagate_compileflag(self): - s = """ -if 1: - compile('''with x: - pass''', '', 'exec') - """ - exec s class AppTestSyntaxError: @@ -760,7 +659,7 @@ exec program except SyntaxError as e: assert e.lineno == 1 - assert e.text is None + assert e.text == program else: raise Exception("no SyntaxError??") @@ -769,25 +668,5 @@ # -*- coding: uft-8 -*- pass """ - raises(SyntaxError, "exec program") - - -if __name__ == '__main__': - # only to check on top of CPython (you need 2.4) - from py.test import raises - for s in VALID: - try: - compile(s, '?', 'exec') - except Exception as e: - print '-'*20, 'FAILED TO COMPILE:', '-'*20 - print s - print '%s: %s' % (e.__class__, e) - print '-'*60 - for s in INVALID: - try: - raises(SyntaxError, compile, s, '?', 'exec') - except Exception as e: - print '-'*20, 'UNEXPECTEDLY COMPILED:', '-'*20 - print s - print '%s: %s' % (e.__class__, e) - print '-'*60 + with raises(SyntaxError): + exec program diff -Nru pypy-7.1.1+dfsg/pypy/interpreter/unicodehelper.py pypy-7.3.1+dfsg/pypy/interpreter/unicodehelper.py --- pypy-7.1.1+dfsg/pypy/interpreter/unicodehelper.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/interpreter/unicodehelper.py 2020-04-10 19:28:40.000000000 +0000 @@ -6,7 +6,8 @@ from rpython.rlib import rutf8 from rpython.rlib.rarithmetic import r_uint, intmask from rpython.rtyper.lltypesystem import rffi -from pypy.module.unicodedata import unicodedb +from pypy.module.unicodedata.interp_ucd import unicodedb +from rpython.rlib import runicode @specialize.memo() def decode_error_handler(space): @@ -31,7 +32,7 @@ # Fast version of the "strict" errors handler. def raise_unicode_exception_encode(errors, encoding, msg, utf8, startingpos, endingpos): - u_len = rutf8.get_utf8_length(utf8) + u_len = rutf8.codepoints_in_utf8(utf8) raise OperationError(space.w_UnicodeEncodeError, space.newtuple([space.newtext(encoding), space.newutf8(utf8, u_len), @@ -60,12 +61,6 @@ return encode_object(space, w_data, encoding, errors) -def _has_surrogate(u): - for c in u: - if 0xD800 <= ord(c) <= 0xDFFF: - return True - return False - # These functions take and return unwrapped rpython strings def decode_unicode_escape(space, string): from pypy.module._codecs import interp_codecs @@ -228,14 +223,12 @@ if sys.platform == 'win32': def utf8_encode_mbcs(s, errors, errorhandler): - from rpython.rlib import runicode s = s.decode('utf-8') slen = len(s) res = runicode.unicode_encode_mbcs(s, slen, errors, errorhandler) return res - + def str_decode_mbcs(s, errors, final, errorhandler): - from rpython.rlib import runicode slen = len(s) res, size = runicode.str_decode_mbcs(s, slen, final=final, errors=errors, errorhandler=errorhandler) @@ -246,134 +239,156 @@ valid so we're trying to either raise or pack stuff with error handler. The key difference is that this is call_may_force """ - slen = len(s) - res = StringBuilder(slen) + + # Adapted from str_decode_utf_8_impl but with a StringBuilder, not a + # UnicodeBuilder + size = len(s) + result = StringBuilder(size) pos = 0 - end = len(s) - suppressing = False # we are in a chain of "bad" unicode, only emit one fix - while pos < end: + while pos < size: ordch1 = ord(s[pos]) # fast path for ASCII - if ordch1 <= 0x7F: + if ordch1 < 0x80: + result.append(chr(ordch1)) pos += 1 - res.append(chr(ordch1)) - suppressing = False - continue - - if ordch1 <= 0xC1: - r, pos = errorhandler(errors, "utf8", "invalid start byte", - s, pos, pos + 1) - if not suppressing: - res.append(r) continue - pos += 1 - - if ordch1 <= 0xDF: - if pos >= end: - if not final: - pos -= 1 - break - r, pos = errorhandler(errors, "utf8", "unexpected end of data", - s, pos - 1, pos) - if not suppressing: - res.append(r) + n = ord(runicode._utf8_code_length[ordch1 - 0x80]) + if pos + n > size: + if not final: + break + # argh, this obscure block of code is mostly a copy of + # what follows :-( + charsleft = size - pos - 1 # either 0, 1, 2 + # note: when we get the 'unexpected end of data' we need + # to care about the pos returned; it can be lower than size, + # in case we need to continue running this loop + if not charsleft: + # there's only the start byte and nothing else + r, pos = errorhandler(errors, 'utf8', + 'unexpected end of data', + s, pos, pos+1) + result.append(r) continue - ordch2 = ord(s[pos]) + ordch2 = ord(s[pos+1]) + if n == 3: + # 3-bytes seq with only a continuation byte + if rutf8._invalid_byte_2_of_3(ordch1, ordch2, True): + # second byte invalid, take the first and continue + r, pos = errorhandler(errors, 'utf8', + 'invalid continuation byte', + s, pos, pos+1) + result.append(r) + continue + else: + # second byte valid, but third byte missing + r, pos = errorhandler(errors, 'utf8', + 'unexpected end of data', + s, pos, pos+2) + result.append(r) + continue + elif n == 4: + # 4-bytes seq with 1 or 2 continuation bytes + if rutf8._invalid_byte_2_of_4(ordch1, ordch2): + # second byte invalid, take the first and continue + r, pos = errorhandler(errors, 'utf8', + 'invalid continuation byte', + s, pos, pos+1) + result.append(r) + continue + elif charsleft == 2 and rutf8._invalid_byte_3_of_4(ord(s[pos+2])): + # third byte invalid, take the first two and continue + r, pos = errorhandler(errors, 'utf8', + 'invalid continuation byte', + s, pos, pos+2) + result.append(r) + continue + else: + # there's only 1 or 2 valid cb, but the others are missing + r, pos = errorhandler(errors, 'utf8', + 'unexpected end of data', + s, pos, pos+charsleft+1) + result.append(r) + continue + raise AssertionError("unreachable") + + if n == 0: + r, pos = errorhandler(errors, 'utf8', + 'invalid start byte', + s, pos, pos+1) + result.append(r) + elif n == 1: + assert 0, "ascii should have gone through the fast path" + + elif n == 2: + ordch2 = ord(s[pos+1]) if rutf8._invalid_byte_2_of_2(ordch2): - r, pos = errorhandler(errors, "utf8", "invalid continuation byte", - s, pos - 1, pos) - if not suppressing: - res.append(r) + r, pos = errorhandler(errors, 'utf8', + 'invalid continuation byte', + s, pos, pos+1) + result.append(r) continue # 110yyyyy 10zzzzzz -> 00000000 00000yyy yyzzzzzz - pos += 1 - res.append(chr(ordch1)) - res.append(chr(ordch2)) - continue + result.append(chr(ordch1)) + result.append(chr(ordch2)) + pos += 2 - if ordch1 <= 0xEF: - if (pos + 2) > end: - if not final: - pos -= 1 - break - r, pos = errorhandler(errors, "utf8", "unexpected end of data", - s, pos - 1, pos) - res.append(r) - suppressing = True - continue - ordch2 = ord(s[pos]) - ordch3 = ord(s[pos + 1]) + elif n == 3: + ordch2 = ord(s[pos + 1]) + ordch3 = ord(s[pos + 2]) if rutf8._invalid_byte_2_of_3(ordch1, ordch2, True): - r, pos = errorhandler(errors, "utf8", "invalid continuation byte", - s, pos - 1, pos) - if not suppressing: - res.append(r) + r, pos = errorhandler(errors, 'utf8', + 'invalid continuation byte', + s, pos, pos + 1) + result.append(r) continue elif rutf8._invalid_byte_3_of_3(ordch3): - r, pos = errorhandler(errors, "utf8", "invalid continuation byte", - s, pos - 1, pos + 1) - if not suppressing: - res.append(r) + r, pos = errorhandler(errors, 'utf8', + "invalid continuation byte", + s, pos, pos + 2) + result.append(r) continue - pos += 2 # 1110xxxx 10yyyyyy 10zzzzzz -> 00000000 xxxxyyyy yyzzzzzz - res.append(chr(ordch1)) - res.append(chr(ordch2)) - res.append(chr(ordch3)) - suppressing = False - continue + result.append(chr(ordch1)) + result.append(chr(ordch2)) + result.append(chr(ordch3)) + pos += 3 - if ordch1 <= 0xF4: - if (pos + 3) > end: - if not final: - pos -= 1 - break - r, pos = errorhandler(errors, "utf8", "unexpected end of data", - s, pos - 1, pos) - res.append(r) - suppressing = True - continue - ordch2 = ord(s[pos]) - ordch3 = ord(s[pos + 1]) - ordch4 = ord(s[pos + 2]) + elif n == 4: + ordch2 = ord(s[pos + 1]) + ordch3 = ord(s[pos + 2]) + ordch4 = ord(s[pos + 3]) if rutf8._invalid_byte_2_of_4(ordch1, ordch2): - r, pos = errorhandler(errors, "utf8", "invalid continuation byte", - s, pos - 1, pos) - if not suppressing: - res.append(r) + r, pos = errorhandler(errors, 'utf8', + 'invalid continuation byte', + s, pos, pos + 1) + result.append(r) continue elif rutf8._invalid_byte_3_of_4(ordch3): - r, pos = errorhandler(errors, "utf8", "invalid continuation byte", - s, pos - 1, pos + 1) - res.append(r) + r, pos = errorhandler(errors, 'utf8', + 'invalid continuation byte', + s, pos, pos + 2) + result.append(r) continue elif rutf8._invalid_byte_4_of_4(ordch4): - r, pos = errorhandler(errors, "utf8", "invalid continuation byte", - s, pos - 1, pos + 2) - if not suppressing: - res.append(r) + r, pos = errorhandler(errors, 'utf8', + 'invalid continuation byte', + s, pos, pos + 3) + result.append(r) continue - pos += 3 # 11110www 10xxxxxx 10yyyyyy 10zzzzzz -> 000wwwxx xxxxyyyy yyzzzzzz - res.append(chr(ordch1)) - res.append(chr(ordch2)) - res.append(chr(ordch3)) - res.append(chr(ordch4)) - suppressing = False - continue - - r, pos = errorhandler(errors, "utf8", "invalid start byte", - s, pos - 1, pos) - if not suppressing: - res.append(r) + result.append(chr(ordch1)) + result.append(chr(ordch2)) + result.append(chr(ordch3)) + result.append(chr(ordch4)) + pos += 4 - r = res.build() + r = result.build() return r, pos, rutf8.check_utf8(r, True) hexdigits = "0123456789ABCDEFabcdef" @@ -1169,9 +1184,9 @@ size = len(s) if BYTEORDER == 'little': - iorder = [0, 1, 2, 3] + iorder0, iorder1, iorder2, iorder3 = 0, 1, 2, 3 else: - iorder = [3, 2, 1, 0] + iorder0, iorder1, iorder2, iorder3 = 3, 2, 1, 0 # Check for BOM marks (U+FEFF) in the input and adjust current # byte order setting accordingly. In native mode, the leading BOM @@ -1181,8 +1196,8 @@ if byteorder == 'native': if size >= 4: bom = intmask( - (ord(s[iorder[3]]) << 24) | (ord(s[iorder[2]]) << 16) | - (ord(s[iorder[1]]) << 8) | ord(s[iorder[0]])) + (ord(s[iorder3]) << 24) | (ord(s[iorder2]) << 16) | + (ord(s[iorder1]) << 8) | ord(s[iorder0])) if BYTEORDER == 'little': if bom == BOM32_DIRECT: pos += 4 @@ -1205,10 +1220,10 @@ return '', 0, 0, bo if bo == -1: # force little endian - iorder = [0, 1, 2, 3] + iorder0, iorder1, iorder2, iorder3 = 0, 1, 2, 3 elif bo == 1: # force big endian - iorder = [3, 2, 1, 0] + iorder0, iorder1, iorder2, iorder3 = 3, 2, 1, 0 result = StringBuilder(size // 4) @@ -1224,8 +1239,8 @@ if len(s) - pos < 4: break continue - ch = ((ord(s[pos + iorder[3]]) << 24) | (ord(s[pos + iorder[2]]) << 16) | - (ord(s[pos + iorder[1]]) << 8) | ord(s[pos + iorder[0]])) + ch = ((ord(s[pos + iorder3]) << 24) | (ord(s[pos + iorder2]) << 16) | + (ord(s[pos + iorder1]) << 8) | ord(s[pos + iorder0])) if not allow_surrogates and 0xD800 <= ch <= 0xDFFF: r, pos = errorhandler(errors, public_encoding_name, "code point in surrogate code point " @@ -1233,7 +1248,7 @@ s, pos, pos + 4) result.append(r) continue - elif ch >= 0x110000: + elif r_uint(ch) >= 0x110000: r, pos = errorhandler(errors, public_encoding_name, "codepoint not in range(0x110000)", s, pos, len(s)) diff -Nru pypy-7.1.1+dfsg/pypy/module/array/__init__.py pypy-7.3.1+dfsg/pypy/module/array/__init__.py --- pypy-7.1.1+dfsg/pypy/module/array/__init__.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/array/__init__.py 2020-04-10 19:28:40.000000000 +0000 @@ -1,10 +0,0 @@ -from pypy.interpreter.mixedmodule import MixedModule - -class Module(MixedModule): - interpleveldefs = { - 'array': 'interp_array.W_ArrayBase', - 'ArrayType': 'interp_array.W_ArrayBase', - } - - appleveldefs = { - } diff -Nru pypy-7.1.1+dfsg/pypy/module/array/interp_array.py pypy-7.3.1+dfsg/pypy/module/array/interp_array.py --- pypy-7.1.1+dfsg/pypy/module/array/interp_array.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/array/interp_array.py 2020-04-10 19:28:40.000000000 +0000 @@ -72,12 +72,13 @@ if comp_op == NE and arr1.len != arr2.len: return space.w_True lgt = min(arr1.len, arr2.len) - for i in range(lgt): + i = 0 + while i < lgt: arr_eq_driver.jit_merge_point(comp_func=comp_op) - w_elem1 = arr1.w_getitem(space, i) - w_elem2 = arr2.w_getitem(space, i) + w_elem1 = arr1.w_getitem(space, i, integer_instead_of_char=True) + w_elem2 = arr2.w_getitem(space, i, integer_instead_of_char=True) if comp_op == EQ: - res = space.eq_w(w_elem1, w_elem2) + res = space.is_true(space.eq(w_elem1, w_elem2)) if not res: return space.w_False elif comp_op == NE: @@ -91,7 +92,7 @@ res = space.is_true(space.gt(w_elem1, w_elem2)) if res: return space.w_True - elif not space.eq_w(w_elem1, w_elem2): + elif not space.is_true(space.eq(w_elem1, w_elem2)): return space.w_False else: if comp_op == LE: @@ -100,8 +101,9 @@ res = space.is_true(space.ge(w_elem1, w_elem2)) if not res: return space.w_False - elif not space.eq_w(w_elem1, w_elem2): + elif not space.is_true(space.eq(w_elem1, w_elem2)): return space.w_True + i += 1 # we have some leftovers if comp_op == EQ: return space.w_True @@ -128,16 +130,18 @@ tp_item = space.type(w_val) arrclass = arr.__class__ cnt = 0 - for i in range(arr.len): + i = 0 + while i < arr.len: index_count_jd.jit_merge_point( tp_item=tp_item, count=count, arrclass=arrclass) w_item = arr.w_getitem(space, i) - if space.eq_w(w_item, w_val): + if space.is_true(space.eq(w_item, w_val)): if count: cnt += 1 else: return i + i += 1 if count: return cnt return -1 @@ -864,7 +868,7 @@ data[index] = char w_array._charbuf_stop() - def getslice(self, start, stop, step, size): + def getslice(self, start, step, size): if size == 0: return '' if step == 1: @@ -873,7 +877,7 @@ return rffi.charpsize2str(rffi.ptradd(data, start), size) finally: self.w_array._charbuf_stop() - return RawBuffer.getslice(self, start, stop, step, size) + return RawBuffer.getslice(self, start, step, size) def get_raw_address(self): return self.w_array._charbuf_start() @@ -1036,10 +1040,11 @@ else: self.fromsequence(w_iterable) - def w_getitem(self, space, idx): + def w_getitem(self, space, idx, integer_instead_of_char=False): item = self.get_buffer()[idx] keepalive_until_here(self) - if mytype.typecode in 'bBhHil': + if mytype.typecode in 'bBhHil' or ( + integer_instead_of_char and mytype.typecode in 'cu'): item = rffi.cast(lltype.Signed, item) return space.newint(item) if mytype.typecode in 'IL': @@ -1058,7 +1063,7 @@ # some invalid utf8-encoded string which makes things # potentially explode left and right. try: - item = rutf8.unichr_as_utf8(code) + item = rutf8.unichr_as_utf8(code, allow_surrogates=True) except rutf8.OutOfRange: raise oefmt(space.w_ValueError, "cannot operate on this array('u') because it contains" @@ -1121,12 +1126,12 @@ w_a = mytype.w_class(self.space) w_a.setlen(size, overallocate=False) assert step != 0 - j = 0 buf = w_a.get_buffer() srcbuf = self.get_buffer() - for i in range(start, stop, step): + i = start + for j in range(size): buf[j] = srcbuf[i] - j += 1 + i += step keepalive_until_here(self) keepalive_until_here(w_a) return w_a @@ -1158,12 +1163,12 @@ self.setlen(0) self.fromsequence(w_lst) else: - j = 0 buf = self.get_buffer() srcbuf = w_item.get_buffer() - for i in range(start, stop, step): + i = start + for j in range(size): buf[i] = srcbuf[j] - j += 1 + i += step keepalive_until_here(w_item) keepalive_until_here(self) diff -Nru pypy-7.1.1+dfsg/pypy/module/array/moduledef.py pypy-7.3.1+dfsg/pypy/module/array/moduledef.py --- pypy-7.1.1+dfsg/pypy/module/array/moduledef.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/array/moduledef.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,10 @@ +from pypy.interpreter.mixedmodule import MixedModule + +class Module(MixedModule): + interpleveldefs = { + 'array': 'interp_array.W_ArrayBase', + 'ArrayType': 'interp_array.W_ArrayBase', + } + + appleveldefs = { + } diff -Nru pypy-7.1.1+dfsg/pypy/module/array/test/test_array.py pypy-7.3.1+dfsg/pypy/module/array/test/test_array.py --- pypy-7.1.1+dfsg/pypy/module/array/test/test_array.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/array/test/test_array.py 2020-04-10 19:28:40.000000000 +0000 @@ -134,6 +134,18 @@ assert a[2] == 2.5 assert len(a) == len(values) + def test_nan(self): + for tc in 'fd': + a = self.array(tc, [float('nan')]) + b = self.array(tc, [float('nan')]) + assert not a == b + assert a != b + assert not a > b + assert not a >= b + assert not a < b + assert not a <= b + assert a.count(float('nan')) == 0 + def test_itemsize(self): for t in 'cbB': assert(self.array(t).itemsize >= 1) @@ -372,6 +384,17 @@ except ValueError: assert not ok + def test_getslice_large_step(self): + import sys + a = self.array('b', [1, 2, 3]) + assert list(a[1::sys.maxsize]) == [2] + + def test_setslice_large_step(self): + import sys + a = self.array('b', [1, 2, 3]) + a[1::sys.maxsize] = self.array('b', [42]) + assert a.tolist() == [1, 42, 3] + def test_toxxx(self): a = self.array('i', [1, 2, 3]) l = a.tolist() @@ -846,23 +869,40 @@ assert repr(mya('i', [1, 2, 3])) == "array('i', [1, 2, 3])" assert repr(mya('i', (1, 2, 3))) == "array('i', [1, 2, 3])" + def test_array_of_chars_equality(self): + input_bytes = '\x01\x63a\x00!' + a = self.array('c', input_bytes) + b = self.array('c', input_bytes) + b.byteswap() + assert a == b + def test_unicode_outofrange(self): input_unicode = u'\x01\u263a\x00\ufeff' a = self.array('u', input_unicode) b = self.array('u', input_unicode) b.byteswap() assert b[2] == u'\u0000' - raises(ValueError, "b[1]") # doesn't work - e = raises(ValueError, "a != b") # doesn't work - assert str(e.value) == ( - "cannot operate on this array('u') because it contains" - " character U+1000000 not in range [U+0000; U+10ffff]" - " at index 0") - assert str(a) == "array('u', %r)" % (input_unicode,) - assert str(b) == ("array('u', )") + raises(ValueError, b.tounicode) # doesn't work + elif b.itemsize == 2: + assert b[0] == u'\u0100' + byteswaped_unicode = u'\u0100\u3a26\x00\ufffe' + assert str(b) == "array('u', %r)" % (byteswaped_unicode,) + assert b.tounicode() == byteswaped_unicode + assert str(a) == "array('u', %r)" % (input_unicode,) assert a.tounicode() == input_unicode - raises(ValueError, b.tounicode) # doesn't work + + def test_unicode_surrogate(self): + a = self.array('u', u'\ud800') + assert a[0] == u'\ud800' def test_weakref(self): import weakref diff -Nru pypy-7.1.1+dfsg/pypy/module/_ast/__init__.py pypy-7.3.1+dfsg/pypy/module/_ast/__init__.py --- pypy-7.1.1+dfsg/pypy/module/_ast/__init__.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_ast/__init__.py 2020-04-10 19:28:40.000000000 +0000 @@ -1,21 +0,0 @@ -from pypy.interpreter.mixedmodule import MixedModule -from pypy.interpreter.astcompiler import ast, consts - - -class Module(MixedModule): - - interpleveldefs = { - "PyCF_ONLY_AST" : "space.wrap(%s)" % consts.PyCF_ONLY_AST, - "PyCF_ACCEPT_NULL_BYTES": - "space.wrap(%s)" % consts.PyCF_ACCEPT_NULL_BYTES, - "__version__" : "space.wrap('82160')", # from CPython's svn. - } - appleveldefs = {} - - -def _setup(): - defs = Module.interpleveldefs - defs['AST'] = "pypy.interpreter.astcompiler.ast.get(space).w_AST" - for (name, base, fields, attributes) in ast.State.AST_TYPES: - defs[name] = "pypy.interpreter.astcompiler.ast.get(space).w_" + name -_setup() diff -Nru pypy-7.1.1+dfsg/pypy/module/_ast/moduledef.py pypy-7.3.1+dfsg/pypy/module/_ast/moduledef.py --- pypy-7.1.1+dfsg/pypy/module/_ast/moduledef.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_ast/moduledef.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,21 @@ +from pypy.interpreter.mixedmodule import MixedModule +from pypy.interpreter.astcompiler import ast, consts + + +class Module(MixedModule): + + interpleveldefs = { + "PyCF_ONLY_AST" : "space.wrap(%s)" % consts.PyCF_ONLY_AST, + "PyCF_ACCEPT_NULL_BYTES": + "space.wrap(%s)" % consts.PyCF_ACCEPT_NULL_BYTES, + "__version__" : "space.wrap('82160')", # from CPython's svn. + } + appleveldefs = {} + + +def _setup(): + defs = Module.interpleveldefs + defs['AST'] = "pypy.interpreter.astcompiler.ast.get(space).w_AST" + for (name, base, fields, attributes) in ast.State.AST_TYPES: + defs[name] = "pypy.interpreter.astcompiler.ast.get(space).w_" + name +_setup() diff -Nru pypy-7.1.1+dfsg/pypy/module/binascii/__init__.py pypy-7.3.1+dfsg/pypy/module/binascii/__init__.py --- pypy-7.1.1+dfsg/pypy/module/binascii/__init__.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/binascii/__init__.py 2020-04-10 19:28:40.000000000 +0000 @@ -1,36 +0,0 @@ - -""" -Mixed-module definition for the binascii module. -Note that there is also a pure Python implementation in lib_pypy/binascii.py; -the pypy/module/binascii/ version takes precedence if it is enabled. -""" - -from pypy.interpreter.mixedmodule import MixedModule - - -class Module(MixedModule): - """binascii - Conversion between binary data and ASCII""" - - appleveldefs = { - } - - interpleveldefs = { - 'a2b_uu': 'interp_uu.a2b_uu', - 'b2a_uu': 'interp_uu.b2a_uu', - 'a2b_base64': 'interp_base64.a2b_base64', - 'b2a_base64': 'interp_base64.b2a_base64', - 'a2b_qp': 'interp_qp.a2b_qp', - 'b2a_qp': 'interp_qp.b2a_qp', - 'a2b_hqx': 'interp_hqx.a2b_hqx', - 'b2a_hqx': 'interp_hqx.b2a_hqx', - 'rledecode_hqx': 'interp_hqx.rledecode_hqx', - 'rlecode_hqx': 'interp_hqx.rlecode_hqx', - 'crc_hqx': 'interp_hqx.crc_hqx', - 'crc32': 'interp_crc32.crc32', - 'b2a_hex': 'interp_hexlify.hexlify', - 'hexlify': 'interp_hexlify.hexlify', - 'a2b_hex': 'interp_hexlify.unhexlify', - 'unhexlify': 'interp_hexlify.unhexlify', - 'Error' : 'space.fromcache(interp_binascii.Cache).w_error', - 'Incomplete': 'space.fromcache(interp_binascii.Cache).w_incomplete', - } diff -Nru pypy-7.1.1+dfsg/pypy/module/binascii/moduledef.py pypy-7.3.1+dfsg/pypy/module/binascii/moduledef.py --- pypy-7.1.1+dfsg/pypy/module/binascii/moduledef.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/binascii/moduledef.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,36 @@ + +""" +Mixed-module definition for the binascii module. +Note that there is also a pure Python implementation in lib_pypy/binascii.py; +the pypy/module/binascii/ version takes precedence if it is enabled. +""" + +from pypy.interpreter.mixedmodule import MixedModule + + +class Module(MixedModule): + """binascii - Conversion between binary data and ASCII""" + + appleveldefs = { + } + + interpleveldefs = { + 'a2b_uu': 'interp_uu.a2b_uu', + 'b2a_uu': 'interp_uu.b2a_uu', + 'a2b_base64': 'interp_base64.a2b_base64', + 'b2a_base64': 'interp_base64.b2a_base64', + 'a2b_qp': 'interp_qp.a2b_qp', + 'b2a_qp': 'interp_qp.b2a_qp', + 'a2b_hqx': 'interp_hqx.a2b_hqx', + 'b2a_hqx': 'interp_hqx.b2a_hqx', + 'rledecode_hqx': 'interp_hqx.rledecode_hqx', + 'rlecode_hqx': 'interp_hqx.rlecode_hqx', + 'crc_hqx': 'interp_hqx.crc_hqx', + 'crc32': 'interp_crc32.crc32', + 'b2a_hex': 'interp_hexlify.hexlify', + 'hexlify': 'interp_hexlify.hexlify', + 'a2b_hex': 'interp_hexlify.unhexlify', + 'unhexlify': 'interp_hexlify.unhexlify', + 'Error' : 'space.fromcache(interp_binascii.Cache).w_error', + 'Incomplete': 'space.fromcache(interp_binascii.Cache).w_incomplete', + } diff -Nru pypy-7.1.1+dfsg/pypy/module/__builtin__/abstractinst.py pypy-7.3.1+dfsg/pypy/module/__builtin__/abstractinst.py --- pypy-7.1.1+dfsg/pypy/module/__builtin__/abstractinst.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/__builtin__/abstractinst.py 2020-04-10 19:28:40.000000000 +0000 @@ -219,13 +219,25 @@ return BaseObjSpace.exception_getclass(space, w_obj) def exception_issubclass_w(space, w_cls1, w_cls2): - if isinstance(w_cls1, W_ClassObject): - if isinstance(w_cls2, W_ClassObject): - return w_cls1.is_subclass_of(w_cls2) + if (space.type(w_cls1) is space.w_type and + space.type(w_cls2) is space.w_type): + return BaseObjSpace.exception_issubclass_w(space, w_cls1, w_cls2) + # + if (not exception_is_valid_class_w(space, w_cls2) or + not exception_is_valid_class_w(space, w_cls1)): return False - if isinstance(w_cls2, W_ClassObject): + # + # The rest is the rare slow case. Use the general logic of issubclass() + # (issue #3149). CPython 3.x doesn't do that (but there is a + # many-years issue report: https://bugs.python.org/issue12029), and + # there are probably tests, so we won't call abstract_issubclass_w() + # either in PyPy3. + try: + return abstract_issubclass_w(space, w_cls1, w_cls2, True) + except OperationError as e: + if e.async(space): + raise return False - return BaseObjSpace.exception_issubclass_w(space, w_cls1, w_cls2) # ____________________________________________________________ # App-level interface diff -Nru pypy-7.1.1+dfsg/pypy/module/__builtin__/functional.py pypy-7.3.1+dfsg/pypy/module/__builtin__/functional.py --- pypy-7.1.1+dfsg/pypy/module/__builtin__/functional.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/__builtin__/functional.py 2020-04-10 19:28:40.000000000 +0000 @@ -131,10 +131,21 @@ v = v.add(step) return space.newlist(res_w) +def get_printable_location(has_key, has_item, greenkey): + return "min [has_key=%s, has_item=%s, %s]" % ( + has_key, has_item, greenkey.iterator_greenkey_printable()) + min_jitdriver = jit.JitDriver(name='min', - greens=['has_key', 'has_item', 'w_type'], reds='auto') + greens=['has_key', 'has_item', 'greenkey'], reds='auto', + get_printable_location=get_printable_location) + +def get_printable_location(has_key, has_item, greenkey): + return "min [has_key=%s, has_item=%s, %s]" % ( + has_key, has_item, greenkey.iterator_greenkey_printable()) + max_jitdriver = jit.JitDriver(name='max', - greens=['has_key', 'has_item', 'w_type'], reds='auto') + greens=['has_key', 'has_item', 'greenkey'], reds='auto', + get_printable_location=get_printable_location) @specialize.arg(3) def min_max_sequence(space, w_sequence, w_key, implementation_of): @@ -145,14 +156,14 @@ compare = space.lt jitdriver = min_jitdriver w_iter = space.iter(w_sequence) - w_type = space.type(w_iter) + greenkey = space.iterator_greenkey(w_iter) has_key = w_key is not None has_item = False w_max_item = None w_max_val = None while True: jitdriver.jit_merge_point(has_key=has_key, has_item=has_item, - w_type=w_type) + greenkey=greenkey) try: w_item = space.next(w_iter) except OperationError as e: diff -Nru pypy-7.1.1+dfsg/pypy/module/__builtin__/__init__.py pypy-7.3.1+dfsg/pypy/module/__builtin__/__init__.py --- pypy-7.1.1+dfsg/pypy/module/__builtin__/__init__.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/__builtin__/__init__.py 2020-04-10 19:28:40.000000000 +0000 @@ -1,132 +0,0 @@ -from pypy.interpreter.error import OperationError -from pypy.interpreter import module -from pypy.interpreter.mixedmodule import MixedModule -import pypy.module.imp.importing - -# put builtins here that should be optimized somehow - -class Module(MixedModule): - """Built-in functions, exceptions, and other objects.""" - - appleveldefs = { - 'execfile' : 'app_io.execfile', - 'raw_input' : 'app_io.raw_input', - 'input' : 'app_io.input', - 'print' : 'app_io.print_', - - 'apply' : 'app_functional.apply', - 'sorted' : 'app_functional.sorted', - 'any' : 'app_functional.any', - 'all' : 'app_functional.all', - 'sum' : 'app_functional.sum', - 'map' : 'app_functional.map', - 'reduce' : 'app_functional.reduce', - 'filter' : 'app_functional.filter', - 'zip' : 'app_functional.zip', - 'vars' : 'app_inspect.vars', - 'dir' : 'app_inspect.dir', - - 'bin' : 'app_operation.bin', - - } - - interpleveldefs = { - # constants - '__debug__' : '(space.w_True)', - 'None' : '(space.w_None)', - 'False' : '(space.w_False)', - 'True' : '(space.w_True)', - 'bytes' : '(space.w_bytes)', - - 'file' : 'state.get(space).w_file', - 'open' : 'state.get(space).w_file', - - # default __metaclass__: old-style class - '__metaclass__' : 'interp_classobj.W_ClassObject', - - # interp-level function definitions - 'abs' : 'operation.abs', - 'chr' : 'operation.chr', - 'unichr' : 'operation.unichr', - 'len' : 'operation.len', - 'ord' : 'operation.ord', - 'pow' : 'operation.pow', - 'repr' : 'operation.repr', - 'hash' : 'operation.hash', - 'oct' : 'operation.oct', - 'hex' : 'operation.hex', - 'round' : 'operation.round', - 'cmp' : 'operation.cmp', - 'coerce' : 'operation.coerce', - 'divmod' : 'operation.divmod', - 'format' : 'operation.format', - '_issubtype' : 'operation._issubtype', - 'issubclass' : 'abstractinst.app_issubclass', - 'isinstance' : 'abstractinst.app_isinstance', - 'getattr' : 'operation.getattr', - 'setattr' : 'operation.setattr', - 'delattr' : 'operation.delattr', - 'hasattr' : 'operation.hasattr', - 'iter' : 'operation.iter', - 'next' : 'operation.next', - 'id' : 'operation.id', - 'intern' : 'operation.intern', - 'callable' : 'operation.callable', - - 'compile' : 'compiling.compile', - 'eval' : 'compiling.eval', - - '__import__' : 'pypy.module.imp.importing.importhook', - 'reload' : 'pypy.module.imp.importing.reload', - - 'range' : 'functional.range_int', - 'xrange' : 'functional.W_XRange', - 'enumerate' : 'functional.W_Enumerate', - 'min' : 'functional.min', - 'max' : 'functional.max', - 'reversed' : 'functional.reversed', - 'super' : 'descriptor.W_Super', - 'staticmethod' : 'pypy.interpreter.function.StaticMethod', - 'classmethod' : 'pypy.interpreter.function.ClassMethod', - 'property' : 'descriptor.W_Property', - - 'globals' : 'interp_inspect.globals', - 'locals' : 'interp_inspect.locals', - - } - - def pick_builtin(self, w_globals): - "Look up the builtin module to use from the __builtins__ global" - # pick the __builtins__ roughly in the same way CPython does it - # this is obscure and slow - space = self.space - try: - w_builtin = space.getitem(w_globals, space.newtext('__builtins__')) - except OperationError as e: - if not e.match(space, space.w_KeyError): - raise - else: - if w_builtin is space.builtin: # common case - return space.builtin - if space.isinstance_w(w_builtin, space.w_dict): - return module.Module(space, None, w_builtin) - if isinstance(w_builtin, module.Module): - return w_builtin - # no builtin! make a default one. Give them None, at least. - builtin = module.Module(space, None) - space.setitem(builtin.w_dict, space.newtext('None'), space.w_None) - return builtin - - def setup_after_space_initialization(self): - """NOT_RPYTHON""" - space = self.space - # install the more general version of isinstance() & co. in the space - from pypy.module.__builtin__ import abstractinst as ab - space.abstract_isinstance_w = ab.abstract_isinstance_w.__get__(space) - space.abstract_issubclass_w = ab.abstract_issubclass_w.__get__(space) - space.abstract_isclass_w = ab.abstract_isclass_w.__get__(space) - space.abstract_getclass = ab.abstract_getclass.__get__(space) - space.exception_is_valid_class_w = ab.exception_is_valid_class_w.__get__(space) - space.exception_is_valid_obj_as_class_w = ab.exception_is_valid_obj_as_class_w.__get__(space) - space.exception_getclass = ab.exception_getclass.__get__(space) - space.exception_issubclass_w = ab.exception_issubclass_w.__get__(space) diff -Nru pypy-7.1.1+dfsg/pypy/module/__builtin__/moduledef.py pypy-7.3.1+dfsg/pypy/module/__builtin__/moduledef.py --- pypy-7.1.1+dfsg/pypy/module/__builtin__/moduledef.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/__builtin__/moduledef.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,132 @@ +from pypy.interpreter.error import OperationError +from pypy.interpreter import module +from pypy.interpreter.mixedmodule import MixedModule +import pypy.module.imp.importing + +# put builtins here that should be optimized somehow + +class Module(MixedModule): + """Built-in functions, exceptions, and other objects.""" + + appleveldefs = { + 'execfile' : 'app_io.execfile', + 'raw_input' : 'app_io.raw_input', + 'input' : 'app_io.input', + 'print' : 'app_io.print_', + + 'apply' : 'app_functional.apply', + 'sorted' : 'app_functional.sorted', + 'any' : 'app_functional.any', + 'all' : 'app_functional.all', + 'sum' : 'app_functional.sum', + 'map' : 'app_functional.map', + 'reduce' : 'app_functional.reduce', + 'filter' : 'app_functional.filter', + 'zip' : 'app_functional.zip', + 'vars' : 'app_inspect.vars', + 'dir' : 'app_inspect.dir', + + 'bin' : 'app_operation.bin', + + } + + interpleveldefs = { + # constants + '__debug__' : '(space.w_True)', + 'None' : '(space.w_None)', + 'False' : '(space.w_False)', + 'True' : '(space.w_True)', + 'bytes' : '(space.w_bytes)', + + 'file' : 'state.get(space).w_file', + 'open' : 'state.get(space).w_file', + + # default __metaclass__: old-style class + '__metaclass__' : 'interp_classobj.W_ClassObject', + + # interp-level function definitions + 'abs' : 'operation.abs', + 'chr' : 'operation.chr', + 'unichr' : 'operation.unichr', + 'len' : 'operation.len', + 'ord' : 'operation.ord', + 'pow' : 'operation.pow', + 'repr' : 'operation.repr', + 'hash' : 'operation.hash', + 'oct' : 'operation.oct', + 'hex' : 'operation.hex', + 'round' : 'operation.round', + 'cmp' : 'operation.cmp', + 'coerce' : 'operation.coerce', + 'divmod' : 'operation.divmod', + 'format' : 'operation.format', + '_issubtype' : 'operation._issubtype', + 'issubclass' : 'abstractinst.app_issubclass', + 'isinstance' : 'abstractinst.app_isinstance', + 'getattr' : 'operation.getattr', + 'setattr' : 'operation.setattr', + 'delattr' : 'operation.delattr', + 'hasattr' : 'operation.hasattr', + 'iter' : 'operation.iter', + 'next' : 'operation.next', + 'id' : 'operation.id', + 'intern' : 'operation.intern', + 'callable' : 'operation.callable', + + 'compile' : 'compiling.compile', + 'eval' : 'compiling.eval', + + '__import__' : 'pypy.module.imp.importing.importhook', + 'reload' : 'pypy.module.imp.importing.reload', + + 'range' : 'functional.range_int', + 'xrange' : 'functional.W_XRange', + 'enumerate' : 'functional.W_Enumerate', + 'min' : 'functional.min', + 'max' : 'functional.max', + 'reversed' : 'functional.reversed', + 'super' : 'descriptor.W_Super', + 'staticmethod' : 'pypy.interpreter.function.StaticMethod', + 'classmethod' : 'pypy.interpreter.function.ClassMethod', + 'property' : 'descriptor.W_Property', + + 'globals' : 'interp_inspect.globals', + 'locals' : 'interp_inspect.locals', + + } + + def pick_builtin(self, w_globals): + "Look up the builtin module to use from the __builtins__ global" + # pick the __builtins__ roughly in the same way CPython does it + # this is obscure and slow + space = self.space + try: + w_builtin = space.getitem(w_globals, space.newtext('__builtins__')) + except OperationError as e: + if not e.match(space, space.w_KeyError): + raise + else: + if w_builtin is space.builtin: # common case + return space.builtin + if space.isinstance_w(w_builtin, space.w_dict): + return module.Module(space, None, w_builtin) + if isinstance(w_builtin, module.Module): + return w_builtin + # no builtin! make a default one. Give them None, at least. + builtin = module.Module(space, None) + space.setitem(builtin.w_dict, space.newtext('None'), space.w_None) + return builtin + + def setup_after_space_initialization(self): + """NOT_RPYTHON""" + space = self.space + # install the more general version of isinstance() & co. in the space + from pypy.module.__builtin__ import abstractinst as ab + space.abstract_isinstance_w = ab.abstract_isinstance_w.__get__(space) + space.abstract_issubclass_w = ab.abstract_issubclass_w.__get__(space) + space.abstract_isclass_w = ab.abstract_isclass_w.__get__(space) + space.abstract_getclass = ab.abstract_getclass.__get__(space) + space.exception_is_valid_class_w = ab.exception_is_valid_class_w.__get__(space) + space.exception_is_valid_obj_as_class_w = ab.exception_is_valid_obj_as_class_w.__get__(space) + space.exception_getclass = ab.exception_getclass.__get__(space) + space.exception_issubclass_w = ab.exception_issubclass_w.__get__(space) diff -Nru pypy-7.1.1+dfsg/pypy/module/__builtin__/test/apptest_compile.py pypy-7.3.1+dfsg/pypy/module/__builtin__/test/apptest_compile.py --- pypy-7.1.1+dfsg/pypy/module/__builtin__/test/apptest_compile.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/__builtin__/test/apptest_compile.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,82 @@ +from pytest import raises +import sys + +def test_simple(): + co = compile('1+2', '?', 'eval') + assert eval(co) == 3 + co = compile(buffer('1+2'), '?', 'eval') + assert eval(co) == 3 + exc = raises(TypeError, compile, chr(0), '?', 'eval') + assert str(exc.value) == "compile() expected string without null bytes" + exc = raises(TypeError, compile, unichr(0), '?', 'eval') + assert str(exc.value) == "compile() expected string without null bytes" + + if '__pypy__' in sys.modules: + co = compile(memoryview('1+2'), '?', 'eval') + assert eval(co) == 3 + compile("from __future__ import with_statement", "", "exec") + raises(SyntaxError, compile, '-', '?', 'eval') + raises(ValueError, compile, '"\\xt"', '?', 'eval') + raises(ValueError, compile, '1+2', '?', 'maybenot') + raises(ValueError, compile, "\n", "", "exec", 0xff) + raises(TypeError, compile, '1+2', 12, 34) + +def test_error_message(): + import re + compile('# -*- coding: iso-8859-15 -*-\n', 'dummy', 'exec') + compile(b'\xef\xbb\xbf\n', 'dummy', 'exec') + compile(b'\xef\xbb\xbf# -*- coding: utf-8 -*-\n', 'dummy', 'exec') + exc = raises(SyntaxError, compile, + b'# -*- coding: fake -*-\n', 'dummy', 'exec') + assert 'fake' in str(exc.value) + exc = raises(SyntaxError, compile, + b'\xef\xbb\xbf# -*- coding: iso-8859-15 -*-\n', 'dummy', 'exec') + assert 'iso-8859-15' in str(exc.value) + assert 'BOM' in str(exc.value) + exc = raises(SyntaxError, compile, + b'\xef\xbb\xbf# -*- coding: fake -*-\n', 'dummy', 'exec') + assert 'fake' in str(exc.value) + assert 'BOM' in str(exc.value) + +def test_unicode(): + try: + compile(u'-', '?', 'eval') + except SyntaxError as e: + assert e.lineno == 1 + +def test_unicode_encoding(): + code = u"# -*- coding: utf-8 -*-\npass\n" + raises(SyntaxError, compile, code, "tmp", "exec") + +def test_recompile_ast(): + import _ast + # raise exception when node type doesn't match with compile mode + co1 = compile('print 1', '', 'exec', _ast.PyCF_ONLY_AST) + raises(TypeError, compile, co1, '', 'eval') + co2 = compile('1+1', '', 'eval', _ast.PyCF_ONLY_AST) + tree = compile(co2, '', 'eval') + assert compile(co2, '', 'eval', _ast.PyCF_ONLY_AST) is co2 + +def test_leading_newlines(): + src = """ +def fn(): pass +""" + co = compile(src, 'mymod', 'exec') + firstlineno = co.co_firstlineno + assert firstlineno == 2 + +def test_null_bytes(): + raises(TypeError, compile, '\x00', 'mymod', 'exec', 0) + src = "#abc\x00def\n" + raises(TypeError, compile, src, 'mymod', 'exec') + raises(TypeError, compile, src, 'mymod', 'exec', 0) + +def test_null_bytes_flag(): + try: + from _ast import PyCF_ACCEPT_NULL_BYTES + except ImportError: + skip('PyPy only (requires _ast.PyCF_ACCEPT_NULL_BYTES)') + raises(SyntaxError, compile, '\x00', 'mymod', 'exec', + PyCF_ACCEPT_NULL_BYTES) + src = "#abc\x00def\n" + compile(src, 'mymod', 'exec', PyCF_ACCEPT_NULL_BYTES) # works diff -Nru pypy-7.1.1+dfsg/pypy/module/__builtin__/test/test_abstractinst.py pypy-7.3.1+dfsg/pypy/module/__builtin__/test/test_abstractinst.py --- pypy-7.1.1+dfsg/pypy/module/__builtin__/test/test_abstractinst.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/__builtin__/test/test_abstractinst.py 2020-04-10 19:28:40.000000000 +0000 @@ -239,3 +239,55 @@ return False assert issubclass(42, M()) is False + + def test_exception_match_calls_subclasscheck(self): + class Special(Exception): + class __metaclass__(type): + def __subclasscheck__(cls1, cls2): + return True + try: + raise ValueError + except Special: + pass + + def test_exception_raising_calls_subclasscheck(self): + class Special(Exception): + class __metaclass__(type): + def __subclasscheck__(cls1, cls2): + return True + try: + raise Special, ValueError() + except ValueError: + pass + + def test_exception_bad_subclasscheck(self): + import sys + class Meta(type): + def __subclasscheck__(cls, subclass): + raise ValueError() + + class MyException(Exception): + __metaclass__ = Meta + pass + + try: + raise KeyError() + except MyException, e: + assert False, "exception should not be a MyException" + except KeyError: + pass + except: + assert False, "Should have raised KeyError" + else: + assert False, "Should have raised KeyError" + + def g(): + try: + return g() + except RuntimeError: + return sys.exc_info() + e, v, tb = g() + assert e is RuntimeError, str(e) + assert "maximum recursion depth exceeded" in str(v) + + diff -Nru pypy-7.1.1+dfsg/pypy/module/__builtin__/test/test_compile.py pypy-7.3.1+dfsg/pypy/module/__builtin__/test/test_compile.py --- pypy-7.1.1+dfsg/pypy/module/__builtin__/test/test_compile.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/__builtin__/test/test_compile.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,81 +0,0 @@ -class AppTestCompile: - def test_simple(self): - import sys - co = compile('1+2', '?', 'eval') - assert eval(co) == 3 - co = compile(buffer('1+2'), '?', 'eval') - assert eval(co) == 3 - exc = raises(TypeError, compile, chr(0), '?', 'eval') - assert str(exc.value) == "compile() expected string without null bytes" - exc = raises(TypeError, compile, unichr(0), '?', 'eval') - assert str(exc.value) == "compile() expected string without null bytes" - - if '__pypy__' in sys.modules: - co = compile(memoryview('1+2'), '?', 'eval') - assert eval(co) == 3 - compile("from __future__ import with_statement", "", "exec") - raises(SyntaxError, compile, '-', '?', 'eval') - raises(ValueError, compile, '"\\xt"', '?', 'eval') - raises(ValueError, compile, '1+2', '?', 'maybenot') - raises(ValueError, compile, "\n", "", "exec", 0xff) - raises(TypeError, compile, '1+2', 12, 34) - - def test_error_message(self): - import re - compile('# -*- coding: iso-8859-15 -*-\n', 'dummy', 'exec') - compile(b'\xef\xbb\xbf\n', 'dummy', 'exec') - compile(b'\xef\xbb\xbf# -*- coding: utf-8 -*-\n', 'dummy', 'exec') - exc = raises(SyntaxError, compile, - b'# -*- coding: fake -*-\n', 'dummy', 'exec') - assert 'fake' in str(exc.value) - exc = raises(SyntaxError, compile, - b'\xef\xbb\xbf# -*- coding: iso-8859-15 -*-\n', 'dummy', 'exec') - assert 'iso-8859-15' in str(exc.value) - assert 'BOM' in str(exc.value) - exc = raises(SyntaxError, compile, - b'\xef\xbb\xbf# -*- coding: fake -*-\n', 'dummy', 'exec') - assert 'fake' in str(exc.value) - assert 'BOM' in str(exc.value) - - def test_unicode(self): - try: - compile(u'-', '?', 'eval') - except SyntaxError as e: - assert e.lineno == 1 - - def test_unicode_encoding(self): - code = u"# -*- coding: utf-8 -*-\npass\n" - raises(SyntaxError, compile, code, "tmp", "exec") - - def test_recompile_ast(self): - import _ast - # raise exception when node type doesn't match with compile mode - co1 = compile('print 1', '', 'exec', _ast.PyCF_ONLY_AST) - raises(TypeError, compile, co1, '', 'eval') - co2 = compile('1+1', '', 'eval', _ast.PyCF_ONLY_AST) - tree = compile(co2, '', 'eval') - assert compile(co2, '', 'eval', _ast.PyCF_ONLY_AST) is co2 - - def test_leading_newlines(self): - src = """ -def fn(): pass -""" - co = compile(src, 'mymod', 'exec') - firstlineno = co.co_firstlineno - assert firstlineno == 2 - - def test_null_bytes(self): - raises(TypeError, compile, '\x00', 'mymod', 'exec', 0) - src = "#abc\x00def\n" - raises(TypeError, compile, src, 'mymod', 'exec') - raises(TypeError, compile, src, 'mymod', 'exec', 0) - - def test_null_bytes_flag(self): - try: - from _ast import PyCF_ACCEPT_NULL_BYTES - except ImportError: - skip('PyPy only (requires _ast.PyCF_ACCEPT_NULL_BYTES)') - raises(SyntaxError, compile, '\x00', 'mymod', 'exec', - PyCF_ACCEPT_NULL_BYTES) - src = "#abc\x00def\n" - compile(src, 'mymod', 'exec', PyCF_ACCEPT_NULL_BYTES) # works diff -Nru pypy-7.1.1+dfsg/pypy/module/bz2/__init__.py pypy-7.3.1+dfsg/pypy/module/bz2/__init__.py --- pypy-7.1.1+dfsg/pypy/module/bz2/__init__.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/bz2/__init__.py 2020-04-10 19:28:40.000000000 +0000 @@ -1,19 +0,0 @@ -# REVIEWME -from pypy.interpreter.mixedmodule import MixedModule - -class Module(MixedModule): - """The python bz2 module provides a comprehensive interface for -the bz2 compression library. It implements a complete file -interface, one shot (de)compression functions, and types for -sequential (de)compression.""" - - interpleveldefs = { - 'BZ2Compressor': 'interp_bz2.W_BZ2Compressor', - 'BZ2Decompressor': 'interp_bz2.W_BZ2Decompressor', - 'compress': 'interp_bz2.compress', - 'decompress': 'interp_bz2.decompress', - 'BZ2File': 'interp_bz2.W_BZ2File', - } - - appleveldefs = { - } diff -Nru pypy-7.1.1+dfsg/pypy/module/bz2/moduledef.py pypy-7.3.1+dfsg/pypy/module/bz2/moduledef.py --- pypy-7.1.1+dfsg/pypy/module/bz2/moduledef.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/bz2/moduledef.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,19 @@ +# REVIEWME +from pypy.interpreter.mixedmodule import MixedModule + +class Module(MixedModule): + """The python bz2 module provides a comprehensive interface for +the bz2 compression library. It implements a complete file +interface, one shot (de)compression functions, and types for +sequential (de)compression.""" + + interpleveldefs = { + 'BZ2Compressor': 'interp_bz2.W_BZ2Compressor', + 'BZ2Decompressor': 'interp_bz2.W_BZ2Decompressor', + 'compress': 'interp_bz2.compress', + 'decompress': 'interp_bz2.decompress', + 'BZ2File': 'interp_bz2.W_BZ2File', + } + + appleveldefs = { + } diff -Nru pypy-7.1.1+dfsg/pypy/module/_cffi_backend/call_python.py pypy-7.3.1+dfsg/pypy/module/_cffi_backend/call_python.py --- pypy-7.1.1+dfsg/pypy/module/_cffi_backend/call_python.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_cffi_backend/call_python.py 2020-04-10 19:28:40.000000000 +0000 @@ -42,9 +42,8 @@ from pypy.module._cffi_backend.ccallback import reveal_callback from rpython.rlib import rgil - rgil.acquire() - rffi.stackcounter.stacks_counter += 1 - llop.gc_stack_bottom(lltype.Void) # marker for trackgcroot.py + rgil.acquire_maybe_in_new_thread() + llop.gc_stack_bottom(lltype.Void) # marker to enter RPython from C cerrno._errno_after(rffi.RFFI_ERR_ALL | rffi.RFFI_ALT_ERRNO) @@ -69,7 +68,6 @@ cerrno._errno_before(rffi.RFFI_ERR_ALL | rffi.RFFI_ALT_ERRNO) - rffi.stackcounter.stacks_counter -= 1 rgil.release() diff -Nru pypy-7.1.1+dfsg/pypy/module/_cffi_backend/cbuffer.py pypy-7.3.1+dfsg/pypy/module/_cffi_backend/cbuffer.py --- pypy-7.1.1+dfsg/pypy/module/_cffi_backend/cbuffer.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_cffi_backend/cbuffer.py 2020-04-10 19:28:40.000000000 +0000 @@ -32,10 +32,10 @@ def get_raw_address(self): return self.raw_cdata - def getslice(self, start, stop, step, size): + def getslice(self, start, step, size): if step == 1: return rffi.charpsize2str(rffi.ptradd(self.raw_cdata, start), size) - return RawBuffer.getslice(self, start, stop, step, size) + return RawBuffer.getslice(self, start, step, size) def setslice(self, start, string): raw_cdata = rffi.ptradd(self.raw_cdata, start) diff -Nru pypy-7.1.1+dfsg/pypy/module/_cffi_backend/cdataobj.py pypy-7.3.1+dfsg/pypy/module/_cffi_backend/cdataobj.py --- pypy-7.1.1+dfsg/pypy/module/_cffi_backend/cdataobj.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_cffi_backend/cdataobj.py 2020-04-10 19:28:40.000000000 +0000 @@ -677,11 +677,14 @@ return self.length def _repr_extra(self): - if self.w_keepalive is not None: - name = self.space.type(self.w_keepalive).name + from pypy.module._cffi_backend import ctypearray + if self.w_keepalive is None: + return "buffer RELEASED" + obj_tp_name = self.space.type(self.w_keepalive).name + if isinstance(self.ctype, ctypearray.W_CTypeArray): + return "buffer len %d from '%s' object" % (self.length, obj_tp_name) else: - name = "(released)" - return "buffer len %d from '%s' object" % (self.length, name) + return "buffer from '%s' object" % (obj_tp_name,) def enter_exit(self, exit_now): # for now, limited effect on PyPy diff -Nru pypy-7.1.1+dfsg/pypy/module/_cffi_backend/cdlopen.py pypy-7.3.1+dfsg/pypy/module/_cffi_backend/cdlopen.py --- pypy-7.1.1+dfsg/pypy/module/_cffi_backend/cdlopen.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_cffi_backend/cdlopen.py 2020-04-10 19:28:40.000000000 +0000 @@ -15,10 +15,11 @@ def __init__(self, ffi, w_filename, flags): space = ffi.space - fname, handle = misc.dlopen_w(space, w_filename, flags) + fname, handle, autoclose = misc.dlopen_w(space, w_filename, flags) W_LibObject.__init__(self, ffi, fname) self.libhandle = handle - self.register_finalizer(space) + if autoclose: + self.register_finalizer(space) def _finalize_(self): h = self.libhandle diff -Nru pypy-7.1.1+dfsg/pypy/module/_cffi_backend/ctypefunc.py pypy-7.3.1+dfsg/pypy/module/_cffi_backend/ctypefunc.py --- pypy-7.1.1+dfsg/pypy/module/_cffi_backend/ctypefunc.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_cffi_backend/ctypefunc.py 2020-04-10 19:28:40.000000000 +0000 @@ -10,9 +10,11 @@ from rpython.rlib.objectmodel import we_are_translated, instantiate from rpython.rlib.objectmodel import keepalive_until_here from rpython.rtyper.lltypesystem import lltype, llmemory, rffi +from rpython.rtyper.annlowlevel import llstr from pypy.interpreter.error import OperationError, oefmt -from pypy.module import _cffi_backend +from pypy.module._cffi_backend.moduledef import ( + FFI_DEFAULT_ABI, has_stdcall, FFI_STDCALL) from pypy.module._cffi_backend import ctypearray, cdataobj, cerrno from pypy.module._cffi_backend.ctypeobj import W_CType from pypy.module._cffi_backend.ctypeptr import W_CTypePtrBase, W_CTypePointer @@ -31,7 +33,7 @@ cif_descr = lltype.nullptr(CIF_DESCRIPTION) def __init__(self, space, fargs, fresult, ellipsis, - abi=_cffi_backend.FFI_DEFAULT_ABI): + abi=FFI_DEFAULT_ABI): assert isinstance(ellipsis, bool) extra, xpos = self._compute_extra_text(fargs, fresult, ellipsis, abi) size = rffi.sizeof(rffi.VOIDP) @@ -98,10 +100,9 @@ lltype.free(self.cif_descr, flavor='raw') def _compute_extra_text(self, fargs, fresult, ellipsis, abi): - from pypy.module._cffi_backend import newtype argnames = ['(*)('] xpos = 2 - if _cffi_backend.has_stdcall and abi == _cffi_backend.FFI_STDCALL: + if has_stdcall and abi == FFI_STDCALL: argnames[0] = '(__stdcall *)(' xpos += len('__stdcall ') for i, farg in enumerate(fargs): @@ -127,6 +128,10 @@ return W_CTypePtrBase._fget(self, attrchar) def call(self, funcaddr, args_w): + if not funcaddr: + raise oefmt(self.space.w_RuntimeError, + "cannot call null function pointer from cdata '%s'", + self.name) if self.cif_descr: # regular case: this function does not take '...' arguments self = jit.promote(self) @@ -163,9 +168,9 @@ cif_descr = self.cif_descr # 'self' should have been promoted here size = cif_descr.exchange_size mustfree_max_plus_1 = 0 + keepalives = [llstr(None)] * len(args_w) # llstrings buffer = lltype.malloc(rffi.CCHARP.TO, size, flavor='raw') try: - keepalives = [None] * len(args_w) # None or strings for i in range(len(args_w)): data = rffi.ptradd(buffer, cif_descr.exchange_args[i]) w_obj = args_w[i] @@ -191,9 +196,10 @@ if flag == 1: lltype.free(raw_cdata, flavor='raw') elif flag >= 4: - value = keepalives[i] - assert value is not None - rffi.free_nonmovingbuffer(value, raw_cdata, chr(flag)) + llobj = keepalives[i] + assert llobj # not NULL + rffi.free_nonmovingbuffer_ll(raw_cdata, + llobj, chr(flag)) lltype.free(buffer, flavor='raw') keepalive_until_here(args_w) return w_res diff -Nru pypy-7.1.1+dfsg/pypy/module/_cffi_backend/ctypeptr.py pypy-7.3.1+dfsg/pypy/module/_cffi_backend/ctypeptr.py --- pypy-7.1.1+dfsg/pypy/module/_cffi_backend/ctypeptr.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_cffi_backend/ctypeptr.py 2020-04-10 19:28:40.000000000 +0000 @@ -303,16 +303,8 @@ else: return lltype.nullptr(rffi.CCHARP.TO) - def _prepare_pointer_call_argument(self, w_init, cdata, keepalives, i): + def _prepare_pointer_call_argument(self, w_init, cdata): space = self.space - if self.accept_str and space.isinstance_w(w_init, space.w_bytes): - # special case to optimize strings passed to a "char *" argument - value = space.bytes_w(w_init) - if isinstance(self.ctitem, ctypeprim.W_CTypePrimitiveBool): - self._must_be_string_of_zero_or_one(value) - keepalives[i] = value - return misc.write_string_as_charp(cdata, value) - # if (space.isinstance_w(w_init, space.w_list) or space.isinstance_w(w_init, space.w_tuple)): length = space.int_w(space.len(w_init)) @@ -358,14 +350,27 @@ return 1 def convert_argument_from_object(self, cdata, w_ob, keepalives, i): + # writes the pointer to cdata[0], writes the must-free flag in + # the byte just before cdata[0], and returns True if something + # must be done later to free. from pypy.module._cffi_backend.ctypefunc import set_mustfree_flag - result = (not isinstance(w_ob, cdataobj.W_CData) and - self._prepare_pointer_call_argument(w_ob, cdata, - keepalives, i)) + if isinstance(w_ob, cdataobj.W_CData): + result = 0 + else: + space = self.space + if self.accept_str and space.isinstance_w(w_ob, space.w_bytes): + # special case to optimize strings passed to a "char *" argument + value = space.bytes_w(w_ob) + if isinstance(self.ctitem, ctypeprim.W_CTypePrimitiveBool): + self._must_be_string_of_zero_or_one(value) + keepalives[i] = misc.write_string_as_charp(cdata, value) + return True + result = self._prepare_pointer_call_argument(w_ob, cdata) + if result == 0: self.convert_from_object(cdata, w_ob) set_mustfree_flag(cdata, result) - return result + return result == 1 # 0 or 2 => False, nothing to do later def getcfield(self, attr): from pypy.module._cffi_backend.ctypestruct import W_CTypeStructOrUnion diff -Nru pypy-7.1.1+dfsg/pypy/module/_cffi_backend/ffi_obj.py pypy-7.3.1+dfsg/pypy/module/_cffi_backend/ffi_obj.py --- pypy-7.1.1+dfsg/pypy/module/_cffi_backend/ffi_obj.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_cffi_backend/ffi_obj.py 2020-04-10 19:28:40.000000000 +0000 @@ -6,7 +6,7 @@ from rpython.rlib import jit, rgc from rpython.rtyper.lltypesystem import lltype, rffi -from pypy.module._cffi_backend import get_dict_rtld_constants +from pypy.module._cffi_backend.moduledef import get_dict_rtld_constants from pypy.module._cffi_backend import parse_c_type, realize_c_type from pypy.module._cffi_backend import newtype, cerrno, ccallback, ctypearray from pypy.module._cffi_backend import ctypestruct, ctypeptr, handle diff -Nru pypy-7.1.1+dfsg/pypy/module/_cffi_backend/func.py pypy-7.3.1+dfsg/pypy/module/_cffi_backend/func.py --- pypy-7.1.1+dfsg/pypy/module/_cffi_backend/func.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_cffi_backend/func.py 2020-04-10 19:28:40.000000000 +0000 @@ -112,9 +112,10 @@ @unwrap_spec(w_ctype=ctypeobj.W_CType, require_writable=int) def from_buffer(space, w_ctype, w_x, require_writable=0): - from pypy.module._cffi_backend import ctypearray - if not isinstance(w_ctype, ctypearray.W_CTypeArray): - raise oefmt(space.w_TypeError, "expected an array ctype, got '%s'", + from pypy.module._cffi_backend import ctypeptr, ctypearray + if not isinstance(w_ctype, ctypeptr.W_CTypePtrOrArray): + raise oefmt(space.w_TypeError, + "expected a poiunter or array ctype, got '%s'", w_ctype.name) if space.isinstance_w(w_x, space.w_unicode): raise oefmt(space.w_TypeError, @@ -135,33 +136,36 @@ "raw address on PyPy", w_x) # buffersize = buf.getlength() - arraylength = w_ctype.length - if arraylength >= 0: - # it's an array with a fixed length; make sure that the - # buffer contains enough bytes. - if buffersize < w_ctype.size: - raise oefmt(space.w_ValueError, - "buffer is too small (%d bytes) for '%s' (%d bytes)", - buffersize, w_ctype.name, w_ctype.size) + if not isinstance(w_ctype, ctypearray.W_CTypeArray): + arraylength = buffersize # number of bytes, not used so far else: - # it's an open 'array[]' - itemsize = w_ctype.ctitem.size - if itemsize == 1: - # fast path, performance only - arraylength = buffersize - elif itemsize > 0: - # give it as many items as fit the buffer. Ignore a - # partial last element. - arraylength = buffersize / itemsize + arraylength = w_ctype.length + if arraylength >= 0: + # it's an array with a fixed length; make sure that the + # buffer contains enough bytes. + if buffersize < w_ctype.size: + raise oefmt(space.w_ValueError, + "buffer is too small (%d bytes) for '%s' (%d bytes)", + buffersize, w_ctype.name, w_ctype.size) else: - # it's an array 'empty[]'. Unsupported obscure case: - # the problem is that setting the length of the result - # to anything large (like SSIZE_T_MAX) is dangerous, - # because if someone tries to loop over it, it will - # turn effectively into an infinite loop. - raise oefmt(space.w_ZeroDivisionError, - "from_buffer('%s', ..): the actual length of the array " - "cannot be computed", w_ctype.name) + # it's an open 'array[]' + itemsize = w_ctype.ctitem.size + if itemsize == 1: + # fast path, performance only + arraylength = buffersize + elif itemsize > 0: + # give it as many items as fit the buffer. Ignore a + # partial last element. + arraylength = buffersize / itemsize + else: + # it's an array 'empty[]'. Unsupported obscure case: + # the problem is that setting the length of the result + # to anything large (like SSIZE_T_MAX) is dangerous, + # because if someone tries to loop over it, it will + # turn effectively into an infinite loop. + raise oefmt(space.w_ZeroDivisionError, + "from_buffer('%s', ..): the actual length of the array " + "cannot be computed", w_ctype.name) # return cdataobj.W_CDataFromBuffer(space, _cdata, arraylength, w_ctype, buf, w_x) @@ -247,7 +251,7 @@ if n == src_buf.getlength(): src_string = src_buf.as_str() else: - src_string = src_buf.getslice(0, n, 1, n) + src_string = src_buf.getslice(0, 1, n) dest_buf = None dest_data = lltype.nullptr(rffi.CCHARP.TO) diff -Nru pypy-7.1.1+dfsg/pypy/module/_cffi_backend/__init__.py pypy-7.3.1+dfsg/pypy/module/_cffi_backend/__init__.py --- pypy-7.1.1+dfsg/pypy/module/_cffi_backend/__init__.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_cffi_backend/__init__.py 2020-04-10 19:28:40.000000000 +0000 @@ -1,93 +1 @@ -import sys -from pypy.interpreter.mixedmodule import MixedModule -from rpython.rlib import rdynload, clibffi -from rpython.rtyper.lltypesystem import rffi - -VERSION = "1.12.3" - -FFI_DEFAULT_ABI = clibffi.FFI_DEFAULT_ABI -try: - FFI_STDCALL = clibffi.FFI_STDCALL - has_stdcall = True -except AttributeError: - has_stdcall = False - - -class Module(MixedModule): - - appleveldefs = { - } - interpleveldefs = { - '__version__': 'space.wrap("%s")' % VERSION, - - 'load_library': 'libraryobj.load_library', - - 'new_primitive_type': 'newtype.new_primitive_type', - 'new_pointer_type': 'newtype.new_pointer_type', - 'new_array_type': 'newtype.new_array_type', - 'new_struct_type': 'newtype.new_struct_type', - 'new_union_type': 'newtype.new_union_type', - 'complete_struct_or_union': 'newtype.complete_struct_or_union', - 'new_void_type': 'newtype.new_void_type', - 'new_enum_type': 'newtype.new_enum_type', - 'new_function_type': 'newtype.new_function_type', - - 'newp': 'func.newp', - 'cast': 'func.cast', - 'callback': 'func.callback', - 'alignof': 'func.alignof', - 'sizeof': 'func.sizeof', - 'typeof': 'func.typeof', - 'typeoffsetof': 'func.typeoffsetof', - 'rawaddressof': 'func.rawaddressof', - 'getcname': 'func.getcname', - 'newp_handle': 'handle.newp_handle', - 'from_handle': 'handle.from_handle', - '_get_types': 'func._get_types', - '_get_common_types': 'func._get_common_types', - 'from_buffer': 'func.from_buffer', - 'gcp': 'func.gcp', - - 'string': 'func.string', - 'unpack': 'func.unpack', - 'buffer': 'cbuffer.MiniBuffer', - 'memmove': 'func.memmove', - 'release': 'func.release', - - 'get_errno': 'cerrno.get_errno', - 'set_errno': 'cerrno.set_errno', - - 'FFI_DEFAULT_ABI': 'space.wrap(%d)' % FFI_DEFAULT_ABI, - 'FFI_CDECL': 'space.wrap(%d)' % FFI_DEFAULT_ABI, # win32 name - - # CFFI 1.0 - 'FFI': 'ffi_obj.W_FFIObject', - } - if sys.platform == 'win32': - interpleveldefs['getwinerror'] = 'cerrno.getwinerror' - - if has_stdcall: - interpleveldefs['FFI_STDCALL'] = 'space.wrap(%d)' % FFI_STDCALL - - def __init__(self, space, *args): - MixedModule.__init__(self, space, *args) - # - if not space.config.objspace.disable_entrypoints: - # import 'embedding', which has the side-effect of registering - # the 'pypy_init_embedded_cffi_module' entry point - from pypy.module._cffi_backend import embedding - embedding.glob.space = space - - -def get_dict_rtld_constants(): - found = {} - for name in ["RTLD_LAZY", "RTLD_NOW", "RTLD_GLOBAL", "RTLD_LOCAL", - "RTLD_NODELETE", "RTLD_NOLOAD", "RTLD_DEEPBIND"]: - if getattr(rdynload.cConfig, name) is not None: - found[name] = getattr(rdynload.cConfig, name) - for name in ["RTLD_LAZY", "RTLD_NOW", "RTLD_GLOBAL", "RTLD_LOCAL"]: - found.setdefault(name, 0) - return found - -for _name, _value in get_dict_rtld_constants().items(): - Module.interpleveldefs[_name] = 'space.wrap(%d)' % _value +VERSION = "1.14.0" diff -Nru pypy-7.1.1+dfsg/pypy/module/_cffi_backend/libraryobj.py pypy-7.3.1+dfsg/pypy/module/_cffi_backend/libraryobj.py --- pypy-7.1.1+dfsg/pypy/module/_cffi_backend/libraryobj.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_cffi_backend/libraryobj.py 2020-04-10 19:28:40.000000000 +0000 @@ -18,8 +18,10 @@ def __init__(self, space, w_filename, flags): self.space = space - self.name, self.handle = misc.dlopen_w(space, w_filename, flags) - self.register_finalizer(space) + self.name, self.handle, autoclose = ( + misc.dlopen_w(space, w_filename, flags)) + if autoclose: + self.register_finalizer(space) def _finalize_(self): h = self.handle diff -Nru pypy-7.1.1+dfsg/pypy/module/_cffi_backend/misc.py pypy-7.3.1+dfsg/pypy/module/_cffi_backend/misc.py --- pypy-7.1.1+dfsg/pypy/module/_cffi_backend/misc.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_cffi_backend/misc.py 2020-04-10 19:28:40.000000000 +0000 @@ -8,7 +8,7 @@ from rpython.rlib.objectmodel import specialize, we_are_translated from rpython.rlib.rarithmetic import r_uint, r_ulonglong from rpython.rlib.unroll import unrolling_iterable -from rpython.rlib.rdynload import dlopen, DLOpenError +from rpython.rlib.rdynload import dlopen, DLOpenError, DLLHANDLE from rpython.rtyper.lltypesystem import lltype, llmemory, rffi from rpython.translator.tool.cbuild import ExternalCompilationInfo @@ -111,11 +111,13 @@ def write_raw_longdouble_data(target, source): rffi.cast(rffi.LONGDOUBLEP, target)[0] = source -@jit.dont_look_inside # lets get_nonmovingbuffer_final_null be inlined +@jit.dont_look_inside # lets get_nonmovingbuffer_ll_final_null be inlined def write_string_as_charp(target, string): - buf, buf_flag = rffi.get_nonmovingbuffer_final_null(string) + from pypy.module._cffi_backend.ctypefunc import set_mustfree_flag + buf, llobj, buf_flag = rffi.get_nonmovingbuffer_ll_final_null(string) + set_mustfree_flag(target, ord(buf_flag)) # 4, 5 or 6 rffi.cast(rffi.CCHARPP, target)[0] = buf - return ord(buf_flag) # 4, 5 or 6 + return llobj # ____________________________________________________________ @@ -396,7 +398,26 @@ # ____________________________________________________________ def dlopen_w(space, w_filename, flags): - if WIN32 and space.isinstance_w(w_filename, space.w_unicode): + from pypy.module._cffi_backend.cdataobj import W_CData + from pypy.module._cffi_backend import ctypeptr + + autoclose = True + if isinstance(w_filename, W_CData): + # 'flags' ignored in this case + w_ctype = w_filename.ctype + if (not isinstance(w_ctype, ctypeptr.W_CTypePointer) or + not w_ctype.is_void_ptr): + raise oefmt(space.w_TypeError, + "dlopen() takes a file name or 'void *' handle, not '%s'", + w_ctype.name) + handle = w_filename.unsafe_escaping_ptr() + if not handle: + raise oefmt(space.w_RuntimeError, "cannot call dlopen(NULL)") + fname = w_ctype.extra_repr(handle) + handle = rffi.cast(DLLHANDLE, handle) + autoclose = False + # + elif WIN32 and space.isinstance_w(w_filename, space.w_unicode): fname = space.text_w(space.repr(w_filename)) utf8_name = space.utf8_w(w_filename) uni_len = space.len_w(w_filename) @@ -417,4 +438,4 @@ handle = dlopen(ll_libname, flags) except DLOpenError as e: raise wrap_dlopenerror(space, e, fname) - return fname, handle + return fname, handle, autoclose diff -Nru pypy-7.1.1+dfsg/pypy/module/_cffi_backend/moduledef.py pypy-7.3.1+dfsg/pypy/module/_cffi_backend/moduledef.py --- pypy-7.1.1+dfsg/pypy/module/_cffi_backend/moduledef.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_cffi_backend/moduledef.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,94 @@ +import sys +from pypy.interpreter.mixedmodule import MixedModule +from rpython.rlib import rdynload, clibffi +from rpython.rtyper.lltypesystem import rffi + +from . import VERSION + +FFI_DEFAULT_ABI = clibffi.FFI_DEFAULT_ABI +try: + FFI_STDCALL = clibffi.FFI_STDCALL + has_stdcall = True +except AttributeError: + has_stdcall = False + FFI_STDCALL = None + + +class Module(MixedModule): + + appleveldefs = { + } + interpleveldefs = { + '__version__': 'space.wrap("%s")' % VERSION, + + 'load_library': 'libraryobj.load_library', + + 'new_primitive_type': 'newtype.new_primitive_type', + 'new_pointer_type': 'newtype.new_pointer_type', + 'new_array_type': 'newtype.new_array_type', + 'new_struct_type': 'newtype.new_struct_type', + 'new_union_type': 'newtype.new_union_type', + 'complete_struct_or_union': 'newtype.complete_struct_or_union', + 'new_void_type': 'newtype.new_void_type', + 'new_enum_type': 'newtype.new_enum_type', + 'new_function_type': 'newtype.new_function_type', + + 'newp': 'func.newp', + 'cast': 'func.cast', + 'callback': 'func.callback', + 'alignof': 'func.alignof', + 'sizeof': 'func.sizeof', + 'typeof': 'func.typeof', + 'typeoffsetof': 'func.typeoffsetof', + 'rawaddressof': 'func.rawaddressof', + 'getcname': 'func.getcname', + 'newp_handle': 'handle.newp_handle', + 'from_handle': 'handle.from_handle', + '_get_types': 'func._get_types', + '_get_common_types': 'func._get_common_types', + 'from_buffer': 'func.from_buffer', + 'gcp': 'func.gcp', + + 'string': 'func.string', + 'unpack': 'func.unpack', + 'buffer': 'cbuffer.MiniBuffer', + 'memmove': 'func.memmove', + 'release': 'func.release', + + 'get_errno': 'cerrno.get_errno', + 'set_errno': 'cerrno.set_errno', + + 'FFI_DEFAULT_ABI': 'space.wrap(%d)' % FFI_DEFAULT_ABI, + 'FFI_CDECL': 'space.wrap(%d)' % FFI_DEFAULT_ABI, # win32 name + + # CFFI 1.0 + 'FFI': 'ffi_obj.W_FFIObject', + } + if sys.platform == 'win32': + interpleveldefs['getwinerror'] = 'cerrno.getwinerror' + + if has_stdcall: + interpleveldefs['FFI_STDCALL'] = 'space.wrap(%d)' % FFI_STDCALL + + def __init__(self, space, *args): + MixedModule.__init__(self, space, *args) + # + if not space.config.objspace.disable_entrypoints: + # import 'embedding', which has the side-effect of registering + # the 'pypy_init_embedded_cffi_module' entry point + from pypy.module._cffi_backend import embedding + embedding.glob.space = space + + +def get_dict_rtld_constants(): + found = {} + for name in ["RTLD_LAZY", "RTLD_NOW", "RTLD_GLOBAL", "RTLD_LOCAL", + "RTLD_NODELETE", "RTLD_NOLOAD", "RTLD_DEEPBIND"]: + if getattr(rdynload.cConfig, name) is not None: + found[name] = getattr(rdynload.cConfig, name) + for name in ["RTLD_LAZY", "RTLD_NOW", "RTLD_GLOBAL", "RTLD_LOCAL"]: + found.setdefault(name, 0) + return found + +for _name, _value in get_dict_rtld_constants().items(): + Module.interpleveldefs[_name] = 'space.wrap(%d)' % _value diff -Nru pypy-7.1.1+dfsg/pypy/module/_cffi_backend/newtype.py pypy-7.3.1+dfsg/pypy/module/_cffi_backend/newtype.py --- pypy-7.1.1+dfsg/pypy/module/_cffi_backend/newtype.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_cffi_backend/newtype.py 2020-04-10 19:28:40.000000000 +0000 @@ -8,7 +8,7 @@ from rpython.rtyper.lltypesystem import lltype, rffi from rpython.rtyper.tool import rffi_platform -from pypy.module import _cffi_backend +from pypy.module._cffi_backend.moduledef import FFI_DEFAULT_ABI from pypy.module._cffi_backend import (ctypeobj, ctypeprim, ctypeptr, ctypearray, ctypestruct, ctypevoid, ctypeenum) @@ -267,7 +267,8 @@ if sys.platform == 'win32': DEFAULT_SFLAGS_PLATFORM = SF_MSVC_BITFIELDS else: - if rffi_platform.getdefined('__arm__', ''): + if (rffi_platform.getdefined('__arm__', '') or + rffi_platform.getdefined('__aarch64__', '')): DEFAULT_SFLAGS_PLATFORM = SF_GCC_ARM_BITFIELDS else: DEFAULT_SFLAGS_PLATFORM = SF_GCC_X86_BITFIELDS @@ -307,12 +308,16 @@ w_FFIError = get_ffi_error(w_ctype.space) raise oefmt(w_FFIError, '%s: %s%s%s (cdef says %d, but C compiler says %d).' - ' fix it or use "...;" in the cdef for %s to ' - 'make it flexible', + ' fix it or use "...;" as the last field in the ' + 'cdef for %s to make it flexible', w_ctype.name, msg1, msg2, msg3, cdef_value, compiler_value, w_ctype.name) w_ctype._custom_field_pos = True +def roundup_bytes(bytes, bit): + assert bit == (bit & 7) + return bytes + (bit > 0) + @unwrap_spec(w_ctype=ctypeobj.W_CType, totalsize=int, totalalignment=int, sflags=int, pack=int) def complete_struct_or_union(space, w_ctype, w_fields, w_ignored=None, @@ -334,8 +339,9 @@ is_union = isinstance(w_ctype, ctypestruct.W_CTypeUnion) alignment = 1 - boffset = 0 # this number is in *bits*, not bytes! - boffsetmax = 0 # the maximum value of boffset, in bits too + byteoffset = 0 # the real value is 'byteoffset+bitoffset*8', which + bitoffset = 0 # counts the offset in bits + byteoffsetmax = 0 # the maximum value of byteoffset-rounded-up-to-byte prev_bitfield_size = 0 prev_bitfield_free = 0 fields_w = space.listview(w_fields) @@ -380,7 +386,7 @@ with_var_array = True # if is_union: - boffset = 0 # reset each field at offset 0 + byteoffset = bitoffset = 0 # reset each field at offset 0 # # update the total alignment requirement, but skip it if the # field is an anonymous bitfield or if SF_PACKED @@ -410,19 +416,24 @@ else: bs_flag = ctypestruct.W_CField.BS_REGULAR - # align this field to its own 'falign' by inserting padding - boffsetorg = (boffset + falignorg*8-1) & ~(falignorg*8-1) - boffset = (boffset + falign*8-1) & ~(falign*8-1) - if boffsetorg != boffset: + # align this field to its own 'falign' by inserting padding. + # first, pad to the next byte, + # then pad to 'falign' or 'falignorg' bytes + byteoffset = roundup_bytes(byteoffset, bitoffset) + bitoffset = 0 + byteoffsetorg = (byteoffset + falignorg-1) & ~(falignorg-1) + byteoffset = (byteoffset + falign-1) & ~(falign-1) + + if byteoffsetorg != byteoffset: with_packed_change = True if foffset >= 0: # a forced field position: ignore the offset just computed, # except to know if we must set 'custom_field_pos' - detect_custom_layout(w_ctype, sflags, boffset // 8, foffset, + detect_custom_layout(w_ctype, sflags, byteoffset, foffset, "wrong offset for field '", fname, "'") - boffset = foffset * 8 + byteoffset = foffset if (fname == '' and isinstance(ftype, ctypestruct.W_CTypeStructOrUnion)): @@ -432,7 +443,7 @@ for name, srcfld in ftype._fields_dict.items(): srcfield2names[srcfld] = name for srcfld in ftype._fields_list: - fld = srcfld.make_shifted(boffset // 8, fflags) + fld = srcfld.make_shifted(byteoffset, fflags) fields_list.append(fld) try: fields_dict[srcfield2names[srcfld]] = fld @@ -442,13 +453,13 @@ w_ctype._custom_field_pos = True else: # a regular field - fld = ctypestruct.W_CField(ftype, boffset // 8, bs_flag, -1, + fld = ctypestruct.W_CField(ftype, byteoffset, bs_flag, -1, fflags) fields_list.append(fld) fields_dict[fname] = fld if ftype.size >= 0: - boffset += ftype.size * 8 + byteoffset += ftype.size prev_bitfield_size = 0 else: @@ -474,7 +485,7 @@ # compute the starting position of the theoretical field # that covers a complete 'ftype', inside of which we will # locate the real bitfield - field_offset_bytes = boffset // 8 + field_offset_bytes = byteoffset field_offset_bytes &= ~(falign - 1) if fbitsize == 0: @@ -484,11 +495,13 @@ w_ctype.name, fname) if (sflags & SF_MSVC_BITFIELDS) == 0: # GCC's notion of "ftype :0;" - # pad boffset to a value aligned for "ftype" - if boffset > field_offset_bytes * 8: + # pad byteoffset to a value aligned for "ftype" + if (roundup_bytes(byteoffset, bitoffset) > + field_offset_bytes): field_offset_bytes += falign - assert boffset < field_offset_bytes * 8 - boffset = field_offset_bytes * 8 + assert byteoffset < field_offset_bytes + byteoffset = field_offset_bytes + bitoffset = 0 else: # MSVC's notion of "ftype :0; # Mostly ignored. It seems they only serve as @@ -503,7 +516,8 @@ # Can the field start at the offset given by 'boffset'? It # can if it would entirely fit into an aligned ftype field. - bits_already_occupied = boffset - (field_offset_bytes * 8) + bits_already_occupied = ( + (byteoffset-field_offset_bytes) * 8 + bitoffset) if bits_already_occupied + fbitsize > 8 * ftype.size: # it would not fit, we need to start at the next @@ -516,13 +530,16 @@ "the previous field", w_ctype.name, fname) field_offset_bytes += falign - assert boffset < field_offset_bytes * 8 - boffset = field_offset_bytes * 8 + assert byteoffset < field_offset_bytes + byteoffset = field_offset_bytes + bitoffset = 0 bitshift = 0 else: bitshift = bits_already_occupied assert bitshift >= 0 - boffset += fbitsize + bitoffset += fbitsize + byteoffset += (bitoffset >> 3) + bitoffset &= 7 else: # MSVC's algorithm @@ -537,31 +554,34 @@ bitshift = 8 * prev_bitfield_size - prev_bitfield_free else: # no: start a new full field - boffset = (boffset + falign*8-1) & ~(falign*8-1) - boffset += ftype.size * 8 + byteoffset = roundup_bytes(byteoffset, bitoffset) + bitoffset = 0 + # align + byteoffset = (byteoffset + falign-1) & ~(falign-1) + byteoffset += ftype.size bitshift = 0 prev_bitfield_size = ftype.size prev_bitfield_free = 8 * prev_bitfield_size # prev_bitfield_free -= fbitsize - field_offset_bytes = boffset / 8 - ftype.size + field_offset_bytes = byteoffset - ftype.size if sflags & SF_GCC_BIG_ENDIAN: bitshift = 8 * ftype.size - fbitsize- bitshift - fld = ctypestruct.W_CField(ftype, field_offset_bytes, - bitshift, fbitsize, fflags) - fields_list.append(fld) - fields_dict[fname] = fld + if fname != '': + fld = ctypestruct.W_CField(ftype, field_offset_bytes, + bitshift, fbitsize, fflags) + fields_list.append(fld) + fields_dict[fname] = fld - if boffset > boffsetmax: - boffsetmax = boffset + if roundup_bytes(byteoffset, bitoffset) > byteoffsetmax: + byteoffsetmax = roundup_bytes(byteoffset, bitoffset) # Like C, if the size of this structure would be zero, we compute it # as 1 instead. But for ctypes support, we allow the manually- # specified totalsize to be zero in this case. - boffsetmax = (boffsetmax + 7) // 8 # bits -> bytes - alignedsize = (boffsetmax + alignment - 1) & ~(alignment - 1) + alignedsize = (byteoffsetmax + alignment - 1) & ~(alignment - 1) alignedsize = alignedsize or 1 if totalsize < 0: @@ -569,10 +589,10 @@ else: detect_custom_layout(w_ctype, sflags, alignedsize, totalsize, "wrong total size") - if totalsize < boffsetmax: + if totalsize < byteoffsetmax: raise oefmt(space.w_TypeError, "%s cannot be of size %d: there are fields at least up to %d", - w_ctype.name, totalsize, boffsetmax) + w_ctype.name, totalsize, byteoffsetmax) if totalalignment < 0: totalalignment = alignment else: @@ -655,7 +675,7 @@ @unwrap_spec(w_fresult=ctypeobj.W_CType, ellipsis=int, abi=int) def new_function_type(space, w_fargs, w_fresult, ellipsis=0, - abi=_cffi_backend.FFI_DEFAULT_ABI): + abi=FFI_DEFAULT_ABI): fargs = [] for w_farg in space.fixedview(w_fargs): if not isinstance(w_farg, ctypeobj.W_CType): diff -Nru pypy-7.1.1+dfsg/pypy/module/_cffi_backend/realize_c_type.py pypy-7.3.1+dfsg/pypy/module/_cffi_backend/realize_c_type.py --- pypy-7.1.1+dfsg/pypy/module/_cffi_backend/realize_c_type.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_cffi_backend/realize_c_type.py 2020-04-10 19:28:40.000000000 +0000 @@ -5,7 +5,8 @@ from rpython.rtyper.lltypesystem import lltype, rffi from pypy.interpreter.error import oefmt from pypy.interpreter.baseobjspace import W_Root -from pypy.module import _cffi_backend +from pypy.module._cffi_backend.moduledef import ( + FFI_DEFAULT_ABI, has_stdcall, FFI_STDCALL) from pypy.module._cffi_backend.ctypeobj import W_CType from pypy.module._cffi_backend import cffi_opcode, newtype, ctypestruct from pypy.module._cffi_backend import ctypeprim @@ -82,12 +83,42 @@ self.space = space self.all_primitives = [None] * cffi_opcode._NUM_PRIM self.file_struct = None + self.lock = None + self.lock_owner = 0 + self.rec_level = 0 def get_file_struct(self): if self.file_struct is None: self.file_struct = ctypestruct.W_CTypeStruct(self.space, "FILE") return self.file_struct + def __enter__(self): + # This is a simple recursive lock implementation + if self.space.config.objspace.usemodules.thread: + from rpython.rlib import rthread + # + tid = rthread.get_ident() + if tid != self.lock_owner: + if self.lock is None: + self.lock = self.space.allocate_lock() + self.lock.acquire(True) + assert self.lock_owner == 0 + assert self.rec_level == 0 + self.lock_owner = tid + self.rec_level += 1 + + def __exit__(self, *args): + assert self.rec_level > 0 + self.rec_level -= 1 + if self.space.config.objspace.usemodules.thread: + from rpython.rlib import rthread + # + tid = rthread.get_ident() + assert tid == self.lock_owner + if self.rec_level == 0: + self.lock_owner = 0 + self.lock.release() + def get_primitive_type(ffi, num): space = ffi.space @@ -182,12 +213,12 @@ ellipsis = (getarg(opcodes[base_index + num_args]) & 0x01) != 0 abi = (getarg(opcodes[base_index + num_args]) & 0xFE) if abi == 0: - abi = _cffi_backend.FFI_DEFAULT_ABI + abi = FFI_DEFAULT_ABI elif abi == 2: - if _cffi_backend.has_stdcall: - abi = _cffi_backend.FFI_STDCALL + if has_stdcall: + abi = FFI_STDCALL else: - abi = _cffi_backend.FFI_DEFAULT_ABI + abi = FFI_DEFAULT_ABI else: raise oefmt(ffi.w_FFIError, "abi number %d not supported", abi) # @@ -405,6 +436,30 @@ if from_ffi and ffi.cached_types[index] is not None: return ffi.cached_types[index] + realize_cache = ffi.space.fromcache(RealizeCache) + with realize_cache: + # + # check again cached_types, which might have been filled while + # we were waiting for the recursive lock + if from_ffi and ffi.cached_types[index] is not None: + return ffi.cached_types[index] + + if realize_cache.rec_level > 1000: + raise oefmt(ffi.space.w_RuntimeError, + "type-building recursion too deep or infinite. " + "This is known to occur e.g. in ``struct s { void(*callable)" + "(struct s); }''. Please report if you get this error and " + "really need support for your case.") + x = realize_c_type_or_func_now(ffi, op, opcodes, index) + + if from_ffi: + old = ffi.cached_types[index] + assert old is None or old is x + ffi.cached_types[index] = x + + return x + +def realize_c_type_or_func_now(ffi, op, opcodes, index): case = getop(op) if case == cffi_opcode.OP_PRIMITIVE: @@ -449,10 +504,6 @@ else: raise oefmt(ffi.space.w_NotImplementedError, "op=%d", case) - if from_ffi: - assert ffi.cached_types[index] is None or ffi.cached_types[index] is x - ffi.cached_types[index] = x - return x diff -Nru pypy-7.1.1+dfsg/pypy/module/_cffi_backend/test/_backend_test_c.py pypy-7.3.1+dfsg/pypy/module/_cffi_backend/test/_backend_test_c.py --- pypy-7.1.1+dfsg/pypy/module/_cffi_backend/test/_backend_test_c.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_cffi_backend/test/_backend_test_c.py 2020-04-10 19:28:40.000000000 +0000 @@ -1,7 +1,7 @@ # ____________________________________________________________ import sys -assert __version__ == "1.12.3", ("This test_c.py file is for testing a version" +assert __version__ == "1.14.0", ("This test_c.py file is for testing a version" " of cffi that differs from the one that we" " get from 'import _cffi_backend'") if sys.version_info < (3,): @@ -3830,7 +3830,9 @@ BIntP = new_pointer_type(BInt) BIntA = new_array_type(BIntP, None) lst = [-12345678, 87654321, 489148] - bytestring = buffer(newp(BIntA, lst))[:] + b'XYZ' + bytestring = bytearray(buffer(newp(BIntA, lst))[:] + b'XYZ') + lst2 = lst + [42, -999999999] + bytestring2 = bytearray(buffer(newp(BIntA, lst2))[:] + b'XYZ') # p1 = from_buffer(BIntA, bytestring) # int[] assert typeof(p1) is BIntA @@ -3844,7 +3846,19 @@ p1[-1] # py.test.raises(TypeError, from_buffer, BInt, bytestring) - py.test.raises(TypeError, from_buffer, BIntP, bytestring) + # + p2 = from_buffer(BIntP, bytestring) # int * + assert p2 == p1 or 'PY_DOT_PY' in globals() + # note: on py.py ^^^, bytearray buffers are not emulated well enough + assert typeof(p2) is BIntP + assert p2[0] == lst[0] + assert p2[1] == lst[1] + assert p2[2] == lst[2] + # hopefully does not crash, but doesn't raise an exception: + p2[3] + p2[-1] + # not enough data even for one, but this is not enforced: + from_buffer(BIntP, b"") # BIntA2 = new_array_type(BIntP, 2) p2 = from_buffer(BIntA2, bytestring) # int[2] @@ -3856,7 +3870,7 @@ p2[2] with pytest.raises(IndexError): p2[-1] - assert p2 == p1 + assert p2 == p1 or 'PY_DOT_PY' in globals() # BIntA4 = new_array_type(BIntP, 4) # int[4]: too big py.test.raises(ValueError, from_buffer, BIntA4, bytestring) @@ -3866,13 +3880,37 @@ ('a2', BInt, -1)]) BStructP = new_pointer_type(BStruct) BStructA = new_array_type(BStructP, None) - p1 = from_buffer(BStructA, bytestring) # struct[] - assert len(p1) == 1 + p1 = from_buffer(BStructA, bytestring2) # struct[] + assert len(p1) == 2 assert typeof(p1) is BStructA - assert p1[0].a1 == lst[0] - assert p1[0].a2 == lst[1] + assert p1[0].a1 == lst2[0] + assert p1[0].a2 == lst2[1] + assert p1[1].a1 == lst2[2] + assert p1[1].a2 == lst2[3] with pytest.raises(IndexError): - p1[1] + p1[2] + with pytest.raises(IndexError): + p1[-1] + assert repr(p1) == "" + # + p2 = from_buffer(BStructP, bytestring2) # 'struct *' + assert p2 == p1 or 'PY_DOT_PY' in globals() + assert typeof(p2) is BStructP + assert p2.a1 == lst2[0] + assert p2.a2 == lst2[1] + assert p2[0].a1 == lst2[0] + assert p2[0].a2 == lst2[1] + assert p2[1].a1 == lst2[2] + assert p2[1].a2 == lst2[3] + # does not crash: + p2[2] + p2[-1] + # not enough data even for one, but this is not enforced: + from_buffer(BStructP, b"") + from_buffer(BStructP, b"1234567") + # + release(p1) + assert repr(p1) == "" # BEmptyStruct = new_struct_type("empty") complete_struct_or_union(BEmptyStruct, [], Ellipsis, 0) @@ -3886,7 +3924,37 @@ p1 = from_buffer(BEmptyStructA5, bytestring) # struct empty[5] assert typeof(p1) is BEmptyStructA5 assert len(p1) == 5 - assert cast(BIntP, p1) == from_buffer(BIntA, bytestring) + assert (cast(BIntP, p1) == from_buffer(BIntA, bytestring) + or 'PY_DOT_PY' in globals()) + # + BVarStruct = new_struct_type("varfoo") + BVarStructP = new_pointer_type(BVarStruct) + complete_struct_or_union(BVarStruct, [('a1', BInt, -1), + ('va', BIntA, -1)]) + with pytest.raises(TypeError): + from_buffer(BVarStruct, bytestring) + pv = from_buffer(BVarStructP, bytestring) # varfoo * + assert pv.a1 == lst[0] + assert pv.va[0] == lst[1] + assert pv.va[1] == lst[2] + assert sizeof(pv[0]) == 1 * size_of_int() + with pytest.raises(TypeError): + len(pv.va) + # hopefully does not crash, but doesn't raise an exception: + pv.va[2] + pv.va[-1] + # not enough data even for one, but this is not enforced: + from_buffer(BVarStructP, b"") + assert repr(pv) == "" + assert repr(pv[0]).startswith("" + assert repr(pv[0]).startswith("" release(p) assert p[2] == b"z" # true so far, but might change to raise RuntimeError + assert repr(p) == "" release(p) # no effect def test_explicit_release_from_buffer_contextmgr(): @@ -4325,6 +4395,7 @@ with p: assert p[2] == b"z" assert p[2] == b"z" # true so far, but might change to raise RuntimeError + assert repr(p) == "" release(p) # no effect def test_explicit_release_bytearray_on_cpython(): @@ -4354,3 +4425,18 @@ float(cast(BBool, 42)) with pytest.raises(TypeError): complex(cast(BBool, 42)) + +def test_cannot_call_null_function_pointer(): + BInt = new_primitive_type("int") + BFunc = new_function_type((BInt, BInt), BInt, False) + f = cast(BFunc, 0) + with pytest.raises(RuntimeError): + f(40, 2) + +def test_huge_structure(): + BChar = new_primitive_type("char") + BArray = new_array_type(new_pointer_type(BChar), sys.maxsize) + assert sizeof(BArray) == sys.maxsize + BStruct = new_struct_type("struct foo") + complete_struct_or_union(BStruct, [('a1', BArray, -1)]) + assert sizeof(BStruct) == sys.maxsize diff -Nru pypy-7.1.1+dfsg/pypy/module/_cffi_backend/test/test_c.py pypy-7.3.1+dfsg/pypy/module/_cffi_backend/test/test_c.py --- pypy-7.1.1+dfsg/pypy/module/_cffi_backend/test/test_c.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_cffi_backend/test/test_c.py 2020-04-10 19:28:40.000000000 +0000 @@ -16,17 +16,17 @@ 5. make the test pass in pypy ('py.test test_c.py') """ import py, sys, ctypes -if sys.version_info < (2, 6): - py.test.skip("requires the b'' literal syntax") from rpython.tool.udir import udir from pypy.interpreter import gateway -from pypy.module._cffi_backend import Module +from pypy.module._cffi_backend.moduledef import Module from pypy.module._cffi_backend.newtype import _clean_cache, UniqueCache from rpython.translator import cdir from rpython.translator.platform import host from rpython.translator.tool.cbuild import ExternalCompilationInfo +from .. import VERSION as TEST_VERSION + class AppTestC(object): """Populated below, hack hack hack.""" @@ -34,6 +34,15 @@ spaceconfig = dict(usemodules=('_cffi_backend', 'cStringIO', 'array')) def setup_class(cls): + if cls.runappdirect: + _cffi_backend = py.test.importorskip('_cffi_backend') + if _cffi_backend.__version__ != TEST_VERSION: + py.test.skip( + "These tests are for cffi version %s, this Python " + "has version %s installed" % + (TEST_VERSION, _cffi_backend.__version__)) + + testfuncs_w = [] keepalive_funcs = [] UniqueCache.for_testing = True diff -Nru pypy-7.1.1+dfsg/pypy/module/_cffi_backend/test/test_recompiler.py pypy-7.3.1+dfsg/pypy/module/_cffi_backend/test/test_recompiler.py --- pypy-7.1.1+dfsg/pypy/module/_cffi_backend/test/test_recompiler.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_cffi_backend/test/test_recompiler.py 2020-04-10 19:28:40.000000000 +0000 @@ -343,9 +343,9 @@ 'test_verify_exact_field_offset', """struct foo_s { short a; int b; };""") e = raises(ffi.error, ffi.new, "struct foo_s *", []) # lazily - assert str(e.value) == ("struct foo_s: wrong offset for field 'b' (cdef " - 'says 0, but C compiler says 4). fix it or use "...;" ' - "in the cdef for struct foo_s to make it flexible") + assert str(e.value).startswith( + "struct foo_s: wrong offset for field 'b' (cdef " + 'says 0, but C compiler says 4). fix it or use "...;" ') def test_type_caching(self): ffi1, lib1 = self.prepare( @@ -2140,3 +2140,19 @@ assert seen == [2 * 4, p] ffi.release(p) # no effect assert seen == [2 * 4, p] + + def test_struct_with_func_with_struct_arg(self): + ffi, lib = self.prepare("""struct BinaryTree { + int (* CompareKey)(struct BinaryTree tree); + };""", + "test_struct_with_func_with_struct_arg", """ + struct BinaryTree { + int (* CompareKey)(struct BinaryTree tree); + }; + """) + e = raises(RuntimeError, ffi.new, "struct BinaryTree *") + # we should check e.value, but untranslated it crashes with a + # regular recursion error. There is a chance it occurs translated + # too, but likely the check in the code ">= 1000" usually triggers + # before that, and raise a RuntimeError too, but with the more + # explicit message. diff -Nru pypy-7.1.1+dfsg/pypy/module/_cffi_backend/test/test_re_python.py pypy-7.3.1+dfsg/pypy/module/_cffi_backend/test/test_re_python.py --- pypy-7.1.1+dfsg/pypy/module/_cffi_backend/test/test_re_python.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_cffi_backend/test/test_re_python.py 2020-04-10 19:28:40.000000000 +0000 @@ -74,6 +74,10 @@ struct foo_s; typedef struct bar_s { int x; signed char a[]; } bar_t; enum foo_e { AA, BB, CC }; + typedef struct selfref { struct selfref *next; } *selfref_ptr_t; + + void *dlopen(const char *filename, int flags); + int dlclose(void *handle); """) ffi.set_source('re_python_pysrc', None) ffi.emit_python_code(str(tmpdir.join('re_python_pysrc.py'))) @@ -95,6 +99,11 @@ return fix_path """) + cls.w_dl_libpath = space.w_None + if sys.platform != 'win32': + import ctypes.util + cls.w_dl_libpath = space.wrap(ctypes.util.find_library('dl')) + def teardown_method(self, meth): self.space.appexec([], """(): import sys @@ -237,3 +246,28 @@ "foobar", _version=0x2594) assert str(e.value).startswith( "cffi out-of-line Python module 'foobar' has unknown version") + + def test_selfref(self): + # based on cffi issue #429 + self.fix_path() + from re_python_pysrc import ffi + ffi.new("selfref_ptr_t") + + def test_dlopen_handle(self): + import _cffi_backend, sys + self.fix_path() + from re_python_pysrc import ffi + if self.dl_libpath is None: + py.test.skip("uses 'dl' explicitly") + lib1 = ffi.dlopen(self.dl_libpath) + handle = lib1.dlopen(self.extmod.encode(sys.getfilesystemencoding()), + _cffi_backend.RTLD_LAZY) + assert ffi.typeof(handle) == ffi.typeof("void *") + assert handle + + lib = ffi.dlopen(handle) + assert lib.add42(-10) == 32 + assert type(lib.add42) is _cffi_backend.FFI.CData + + err = lib1.dlclose(handle) + assert err == 0 diff -Nru pypy-7.1.1+dfsg/pypy/module/cmath/__init__.py pypy-7.3.1+dfsg/pypy/module/cmath/__init__.py --- pypy-7.1.1+dfsg/pypy/module/cmath/__init__.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/cmath/__init__.py 2020-04-10 19:28:40.000000000 +0000 @@ -1,44 +0,0 @@ - -# Package initialisation -from pypy.interpreter.mixedmodule import MixedModule - -names_and_docstrings = { - 'sqrt': "Return the square root of x.", - 'acos': "Return the arc cosine of x.", - 'acosh': "Return the hyperbolic arc cosine of x.", - 'asin': "Return the arc sine of x.", - 'asinh': "Return the hyperbolic arc sine of x.", - 'atan': "Return the arc tangent of x.", - 'atanh': "Return the hyperbolic arc tangent of x.", - 'log': ("log(x[, base]) -> the logarithm of x to the given base.\n" - "If the base not specified, returns the natural logarithm " - "(base e) of x."), - 'log10': "Return the base-10 logarithm of x.", - 'exp': "Return the exponential value e**x.", - 'cosh': "Return the hyperbolic cosine of x.", - 'sinh': "Return the hyperbolic sine of x.", - 'tanh': "Return the hyperbolic tangent of x.", - 'cos': "Return the cosine of x.", - 'sin': "Return the sine of x.", - 'tan': "Return the tangent of x.", - 'rect': "Convert from polar coordinates to rectangular coordinates.", - 'polar': ("polar(z) -> r: float, phi: float\n" - "Convert a complex from rectangular coordinates " - "to polar coordinates. r is\n" - "the distance from 0 and phi the phase angle."), - 'phase': "Return argument, also known as the phase angle, of a complex.", - 'isinf': "Checks if the real or imaginary part of z is infinite.", - 'isnan': "Checks if the real or imaginary part of z is not a number (NaN)", - } - - -class Module(MixedModule): - appleveldefs = { - } - - interpleveldefs = { - 'pi': 'space.newfloat(interp_cmath.pi)', - 'e': 'space.newfloat(interp_cmath.e)', - } - interpleveldefs.update(dict([(name, 'interp_cmath.wrapped_' + name) - for name in names_and_docstrings])) diff -Nru pypy-7.1.1+dfsg/pypy/module/cmath/interp_cmath.py pypy-7.3.1+dfsg/pypy/module/cmath/interp_cmath.py --- pypy-7.1.1+dfsg/pypy/module/cmath/interp_cmath.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/cmath/interp_cmath.py 2020-04-10 19:28:40.000000000 +0000 @@ -2,13 +2,12 @@ from rpython.rlib.objectmodel import specialize from rpython.tool.sourcetools import func_with_new_name from pypy.interpreter.error import oefmt -from pypy.module.cmath import names_and_docstrings +from pypy.module.cmath.moduledef import names_and_docstrings from rpython.rlib import rcomplex pi = math.pi e = math.e - @specialize.arg(0) def call_c_func(c_func, space, x, y): try: diff -Nru pypy-7.1.1+dfsg/pypy/module/cmath/moduledef.py pypy-7.3.1+dfsg/pypy/module/cmath/moduledef.py --- pypy-7.1.1+dfsg/pypy/module/cmath/moduledef.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/cmath/moduledef.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,44 @@ + +# Package initialisation +from pypy.interpreter.mixedmodule import MixedModule + +names_and_docstrings = { + 'sqrt': "Return the square root of x.", + 'acos': "Return the arc cosine of x.", + 'acosh': "Return the hyperbolic arc cosine of x.", + 'asin': "Return the arc sine of x.", + 'asinh': "Return the hyperbolic arc sine of x.", + 'atan': "Return the arc tangent of x.", + 'atanh': "Return the hyperbolic arc tangent of x.", + 'log': ("log(x[, base]) -> the logarithm of x to the given base.\n" + "If the base not specified, returns the natural logarithm " + "(base e) of x."), + 'log10': "Return the base-10 logarithm of x.", + 'exp': "Return the exponential value e**x.", + 'cosh': "Return the hyperbolic cosine of x.", + 'sinh': "Return the hyperbolic sine of x.", + 'tanh': "Return the hyperbolic tangent of x.", + 'cos': "Return the cosine of x.", + 'sin': "Return the sine of x.", + 'tan': "Return the tangent of x.", + 'rect': "Convert from polar coordinates to rectangular coordinates.", + 'polar': ("polar(z) -> r: float, phi: float\n" + "Convert a complex from rectangular coordinates " + "to polar coordinates. r is\n" + "the distance from 0 and phi the phase angle."), + 'phase': "Return argument, also known as the phase angle, of a complex.", + 'isinf': "Checks if the real or imaginary part of z is infinite.", + 'isnan': "Checks if the real or imaginary part of z is not a number (NaN)", + } + + +class Module(MixedModule): + appleveldefs = { + } + + interpleveldefs = { + 'pi': 'space.newfloat(interp_cmath.pi)', + 'e': 'space.newfloat(interp_cmath.e)', + } + interpleveldefs.update(dict([(name, 'interp_cmath.wrapped_' + name) + for name in names_and_docstrings])) diff -Nru pypy-7.1.1+dfsg/pypy/module/_codecs/__init__.py pypy-7.3.1+dfsg/pypy/module/_codecs/__init__.py --- pypy-7.1.1+dfsg/pypy/module/_codecs/__init__.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_codecs/__init__.py 2020-04-10 19:28:40.000000000 +0000 @@ -1,99 +0,0 @@ -from pypy.interpreter.mixedmodule import MixedModule -from rpython.rlib.objectmodel import not_rpython -from pypy.module._codecs import interp_codecs - -class Module(MixedModule): - """ - _codecs -- Provides access to the codec registry and the builtin - codecs. - - This module should never be imported directly. The standard library - module "codecs" wraps this builtin module for use within Python. - - The codec registry is accessible via: - - register(search_function) -> None - - lookup(encoding) -> (encoder, decoder, stream_reader, stream_writer) - - The builtin Unicode codecs use the following interface: - - _encode(Unicode_object[,errors='strict']) -> - (string object, bytes consumed) - - _decode(char_buffer_obj[,errors='strict']) -> - (Unicode object, bytes consumed) - - _encode() interfaces also accept non-Unicode object as - input. The objects are then converted to Unicode using - PyUnicode_FromObject() prior to applying the conversion. - - These s are available: utf_8, unicode_escape, - raw_unicode_escape, unicode_internal, latin_1, ascii (7-bit), - mbcs (on win32). - - -Written by Marc-Andre Lemburg (mal@lemburg.com). - -Copyright (c) Corporation for National Research Initiatives. -""" - - appleveldefs = {} - - interpleveldefs = { - 'encode': 'interp_codecs.encode', - 'decode': 'interp_codecs.decode', - 'lookup': 'interp_codecs.lookup_codec', - 'lookup_error': 'interp_codecs.lookup_error', - 'register': 'interp_codecs.register_codec', - 'register_error': 'interp_codecs.register_error', - 'charmap_build' : 'interp_codecs.charmap_build', - - # encoders and decoders - 'ascii_decode' : 'interp_codecs.ascii_decode', - 'ascii_encode' : 'interp_codecs.ascii_encode', - 'latin_1_decode' : 'interp_codecs.latin_1_decode', - 'latin_1_encode' : 'interp_codecs.latin_1_encode', - 'utf_7_decode' : 'interp_codecs.utf_7_decode', - 'utf_7_encode' : 'interp_codecs.utf_7_encode', - 'utf_8_decode' : 'interp_codecs.utf_8_decode', - 'utf_8_encode' : 'interp_codecs.utf_8_encode', - 'utf_16_be_decode' : 'interp_codecs.utf_16_be_decode', - 'utf_16_be_encode' : 'interp_codecs.utf_16_be_encode', - 'utf_16_decode' : 'interp_codecs.utf_16_decode', - 'utf_16_encode' : 'interp_codecs.utf_16_encode', - 'utf_16_le_decode' : 'interp_codecs.utf_16_le_decode', - 'utf_16_le_encode' : 'interp_codecs.utf_16_le_encode', - 'utf_16_ex_decode' : 'interp_codecs.utf_16_ex_decode', - 'utf_32_decode' : 'interp_codecs.utf_32_decode', - 'utf_32_encode' : 'interp_codecs.utf_32_encode', - 'utf_32_be_decode' : 'interp_codecs.utf_32_be_decode', - 'utf_32_be_encode' : 'interp_codecs.utf_32_be_encode', - 'utf_32_le_decode' : 'interp_codecs.utf_32_le_decode', - 'utf_32_le_encode' : 'interp_codecs.utf_32_le_encode', - 'utf_32_ex_decode' : 'interp_codecs.utf_32_ex_decode', - 'charbuffer_encode': 'interp_codecs.charbuffer_encode', - 'readbuffer_encode': 'interp_codecs.readbuffer_encode', - 'charmap_decode' : 'interp_codecs.charmap_decode', - 'charmap_encode' : 'interp_codecs.charmap_encode', - 'escape_encode' : 'interp_codecs.escape_encode', - 'escape_decode' : 'interp_codecs.escape_decode', - 'unicode_escape_decode' : 'interp_codecs.unicode_escape_decode', - 'unicode_escape_encode' : 'interp_codecs.unicode_escape_encode', - 'raw_unicode_escape_decode' : 'interp_codecs.raw_unicode_escape_decode', - 'raw_unicode_escape_encode' : 'interp_codecs.raw_unicode_escape_encode', - 'unicode_internal_decode' : 'interp_codecs.unicode_internal_decode', - 'unicode_internal_encode' : 'interp_codecs.unicode_internal_encode', - } - - @not_rpython - def __init__(self, space, *args): - # mbcs codec is Windows specific, and based on rffi. - from rpython.rlib import runicode - if (hasattr(runicode, 'str_decode_mbcs')): - self.interpleveldefs['mbcs_encode'] = 'interp_codecs.mbcs_encode' - self.interpleveldefs['mbcs_decode'] = 'interp_codecs.mbcs_decode' - - MixedModule.__init__(self, space, *args) - - interp_codecs.register_builtin_error_handlers(space) diff -Nru pypy-7.1.1+dfsg/pypy/module/_codecs/interp_codecs.py pypy-7.3.1+dfsg/pypy/module/_codecs/interp_codecs.py --- pypy-7.1.1+dfsg/pypy/module/_codecs/interp_codecs.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_codecs/interp_codecs.py 2020-04-10 19:28:40.000000000 +0000 @@ -460,6 +460,8 @@ @unwrap_spec(errors='text_or_none') def utf_8_encode(space, w_obj, errors="strict"): utf8, lgt = space.utf8_len_w(w_obj) + if lgt == len(utf8): # ascii + return space.newtuple([space.newbytes(utf8), space.newint(lgt)]) if rutf8.has_surrogates(utf8): utf8 = rutf8.reencode_utf8_with_surrogates(utf8) return space.newtuple([space.newbytes(utf8), space.newint(lgt)]) @@ -570,7 +572,7 @@ if not 0 <= x <= 0x10FFFF: raise oefmt(space.w_TypeError, "character mapping must be in range(0x110000)") - return rutf8.unichr_as_utf8(x) + return rutf8.unichr_as_utf8(x, allow_surrogates=True) elif space.is_w(w_ch, space.w_None): # Charmap may return None return errorchar diff -Nru pypy-7.1.1+dfsg/pypy/module/_codecs/moduledef.py pypy-7.3.1+dfsg/pypy/module/_codecs/moduledef.py --- pypy-7.1.1+dfsg/pypy/module/_codecs/moduledef.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_codecs/moduledef.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,99 @@ +from pypy.interpreter.mixedmodule import MixedModule +from rpython.rlib.objectmodel import not_rpython +from pypy.module._codecs import interp_codecs + +class Module(MixedModule): + """ + _codecs -- Provides access to the codec registry and the builtin + codecs. + + This module should never be imported directly. The standard library + module "codecs" wraps this builtin module for use within Python. + + The codec registry is accessible via: + + register(search_function) -> None + + lookup(encoding) -> (encoder, decoder, stream_reader, stream_writer) + + The builtin Unicode codecs use the following interface: + + _encode(Unicode_object[,errors='strict']) -> + (string object, bytes consumed) + + _decode(char_buffer_obj[,errors='strict']) -> + (Unicode object, bytes consumed) + + _encode() interfaces also accept non-Unicode object as + input. The objects are then converted to Unicode using + PyUnicode_FromObject() prior to applying the conversion. + + These s are available: utf_8, unicode_escape, + raw_unicode_escape, unicode_internal, latin_1, ascii (7-bit), + mbcs (on win32). + + +Written by Marc-Andre Lemburg (mal@lemburg.com). + +Copyright (c) Corporation for National Research Initiatives. +""" + + appleveldefs = {} + + interpleveldefs = { + 'encode': 'interp_codecs.encode', + 'decode': 'interp_codecs.decode', + 'lookup': 'interp_codecs.lookup_codec', + 'lookup_error': 'interp_codecs.lookup_error', + 'register': 'interp_codecs.register_codec', + 'register_error': 'interp_codecs.register_error', + 'charmap_build' : 'interp_codecs.charmap_build', + + # encoders and decoders + 'ascii_decode' : 'interp_codecs.ascii_decode', + 'ascii_encode' : 'interp_codecs.ascii_encode', + 'latin_1_decode' : 'interp_codecs.latin_1_decode', + 'latin_1_encode' : 'interp_codecs.latin_1_encode', + 'utf_7_decode' : 'interp_codecs.utf_7_decode', + 'utf_7_encode' : 'interp_codecs.utf_7_encode', + 'utf_8_decode' : 'interp_codecs.utf_8_decode', + 'utf_8_encode' : 'interp_codecs.utf_8_encode', + 'utf_16_be_decode' : 'interp_codecs.utf_16_be_decode', + 'utf_16_be_encode' : 'interp_codecs.utf_16_be_encode', + 'utf_16_decode' : 'interp_codecs.utf_16_decode', + 'utf_16_encode' : 'interp_codecs.utf_16_encode', + 'utf_16_le_decode' : 'interp_codecs.utf_16_le_decode', + 'utf_16_le_encode' : 'interp_codecs.utf_16_le_encode', + 'utf_16_ex_decode' : 'interp_codecs.utf_16_ex_decode', + 'utf_32_decode' : 'interp_codecs.utf_32_decode', + 'utf_32_encode' : 'interp_codecs.utf_32_encode', + 'utf_32_be_decode' : 'interp_codecs.utf_32_be_decode', + 'utf_32_be_encode' : 'interp_codecs.utf_32_be_encode', + 'utf_32_le_decode' : 'interp_codecs.utf_32_le_decode', + 'utf_32_le_encode' : 'interp_codecs.utf_32_le_encode', + 'utf_32_ex_decode' : 'interp_codecs.utf_32_ex_decode', + 'charbuffer_encode': 'interp_codecs.charbuffer_encode', + 'readbuffer_encode': 'interp_codecs.readbuffer_encode', + 'charmap_decode' : 'interp_codecs.charmap_decode', + 'charmap_encode' : 'interp_codecs.charmap_encode', + 'escape_encode' : 'interp_codecs.escape_encode', + 'escape_decode' : 'interp_codecs.escape_decode', + 'unicode_escape_decode' : 'interp_codecs.unicode_escape_decode', + 'unicode_escape_encode' : 'interp_codecs.unicode_escape_encode', + 'raw_unicode_escape_decode' : 'interp_codecs.raw_unicode_escape_decode', + 'raw_unicode_escape_encode' : 'interp_codecs.raw_unicode_escape_encode', + 'unicode_internal_decode' : 'interp_codecs.unicode_internal_decode', + 'unicode_internal_encode' : 'interp_codecs.unicode_internal_encode', + } + + @not_rpython + def __init__(self, space, *args): + # mbcs codec is Windows specific, and based on rffi. + from rpython.rlib import runicode + if (hasattr(runicode, 'str_decode_mbcs')): + self.interpleveldefs['mbcs_encode'] = 'interp_codecs.mbcs_encode' + self.interpleveldefs['mbcs_decode'] = 'interp_codecs.mbcs_decode' + + MixedModule.__init__(self, space, *args) + + interp_codecs.register_builtin_error_handlers(space) diff -Nru pypy-7.1.1+dfsg/pypy/module/_codecs/test/test_codecs.py pypy-7.3.1+dfsg/pypy/module/_codecs/test/test_codecs.py --- pypy-7.1.1+dfsg/pypy/module/_codecs/test/test_codecs.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_codecs/test/test_codecs.py 2020-04-10 19:28:40.000000000 +0000 @@ -119,6 +119,7 @@ assert (charmap_decode("\x00\x01\x02", "strict", {0: u'\U0010FFFF', 1: u'b', 2: u'c'}) == (u"\U0010FFFFbc", 3)) + assert charmap_decode('\xff', "strict", {0xff: 0xd800}) == (u'\ud800', 1) def test_escape_decode(self): from _codecs import unicode_escape_decode as decode @@ -937,3 +938,17 @@ errors = [] assert sin.encode("iso-8859-15", "test.record") == "\xac\xa4" assert errors == [u'\u1234\u1234', u'\u8000'] + + def test_last_byte_handler(self): + # issue bb-2389 + import _codecs + _codecs.register_error('custom_replace', lambda exc: (u'\ufffd', exc.start+1)) + for s, res in ((b"WORD\xe3\xab", + (u'WORD\ufffd\ufffd', u'WORD\ufffd')), + (b"\xef\xbb\xbfWORD\xe3\xabWORD2", + (u'\ufeffWORD\ufffd\ufffdWORD2', + u'\ufeffWORD\ufffdWORD2'))): + r = s.decode('utf8', 'replace') + assert r == res[1] + r = s.decode('utf8', 'custom_replace') + assert r == res[0] diff -Nru pypy-7.1.1+dfsg/pypy/module/_collections/__init__.py pypy-7.3.1+dfsg/pypy/module/_collections/__init__.py --- pypy-7.1.1+dfsg/pypy/module/_collections/__init__.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_collections/__init__.py 2020-04-10 19:28:40.000000000 +0000 @@ -1,25 +0,0 @@ -from pypy.interpreter.mixedmodule import MixedModule - -class Module(MixedModule): - """High performance data structures. -- deque: ordered collection accessible from endpoints only -- defaultdict: dict subclass with a default value factory -""" - - appleveldefs = { - 'defaultdict': 'app_defaultdict.defaultdict', - } - - interpleveldefs = { - 'deque' : 'interp_deque.W_Deque', - '__missing__': 'interp_defaultdict.missing', - } - - def setup_after_space_initialization(self): - """NOT_RPYTHON""" - # must remove the interp-level name '__missing__' after it has - # been used... otherwise, some code is not happy about seeing - # this code object twice - space = self.space - space.getattr(self, space.newtext('defaultdict')) # force importing - space.delattr(self, space.newtext('__missing__')) diff -Nru pypy-7.1.1+dfsg/pypy/module/_collections/moduledef.py pypy-7.3.1+dfsg/pypy/module/_collections/moduledef.py --- pypy-7.1.1+dfsg/pypy/module/_collections/moduledef.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_collections/moduledef.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,25 @@ +from pypy.interpreter.mixedmodule import MixedModule + +class Module(MixedModule): + """High performance data structures. +- deque: ordered collection accessible from endpoints only +- defaultdict: dict subclass with a default value factory +""" + + appleveldefs = { + 'defaultdict': 'app_defaultdict.defaultdict', + } + + interpleveldefs = { + 'deque' : 'interp_deque.W_Deque', + '__missing__': 'interp_defaultdict.missing', + } + + def setup_after_space_initialization(self): + """NOT_RPYTHON""" + # must remove the interp-level name '__missing__' after it has + # been used... otherwise, some code is not happy about seeing + # this code object twice + space = self.space + space.getattr(self, space.newtext('defaultdict')) # force importing + space.delattr(self, space.newtext('__missing__')) diff -Nru pypy-7.1.1+dfsg/pypy/module/_continuation/__init__.py pypy-7.3.1+dfsg/pypy/module/_continuation/__init__.py --- pypy-7.1.1+dfsg/pypy/module/_continuation/__init__.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_continuation/__init__.py 2020-04-10 19:28:40.000000000 +0000 @@ -1,41 +0,0 @@ -from pypy.interpreter.mixedmodule import MixedModule - - -class Module(MixedModule): - """This module exposes 'one-shot continuation containers'. - -A 'continulet' object from this module is a container that stores a -one-shot continuation. It is similar in purpose to the 'f_back' -attribute of frames, which points to where execution should continue -after this frame finishes. The difference is that it will be changed -(often repeatedly) before the frame actually returns. - -To make a continulet object, call 'continulet' with a callable and -optional extra arguments. Later, the first time you switch() to the -continulet, the callable is invoked with the same continulet object as -the extra first argument. - -At this point, the one-shot continuation stored in the continulet points -to the caller of switch(). When switch() is called again, this one-shot -continuation is exchanged with the current one; it means that the caller -of switch() is suspended, its continuation stored in the container, and -the old continuation from the continulet object is resumed. - -Continulets are internally implemented using stacklets. Stacklets -are a bit more primitive (they are really one-shot continuations), but -that idea only works in C, not in Python, notably because of exceptions. - -The most primitive API is actually 'permute()', which just permutes the -one-shot continuation stored in two (or more) continulets. -""" - - appleveldefs = { - 'error': 'app_continuation.error', - 'generator': 'app_continuation.generator', - } - - interpleveldefs = { - 'continulet': 'interp_continuation.W_Continulet', - 'permute': 'interp_continuation.permute', - '_p': 'interp_continuation.unpickle', # pickle support - } diff -Nru pypy-7.1.1+dfsg/pypy/module/_continuation/moduledef.py pypy-7.3.1+dfsg/pypy/module/_continuation/moduledef.py --- pypy-7.1.1+dfsg/pypy/module/_continuation/moduledef.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_continuation/moduledef.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,41 @@ +from pypy.interpreter.mixedmodule import MixedModule + + +class Module(MixedModule): + """This module exposes 'one-shot continuation containers'. + +A 'continulet' object from this module is a container that stores a +one-shot continuation. It is similar in purpose to the 'f_back' +attribute of frames, which points to where execution should continue +after this frame finishes. The difference is that it will be changed +(often repeatedly) before the frame actually returns. + +To make a continulet object, call 'continulet' with a callable and +optional extra arguments. Later, the first time you switch() to the +continulet, the callable is invoked with the same continulet object as +the extra first argument. + +At this point, the one-shot continuation stored in the continulet points +to the caller of switch(). When switch() is called again, this one-shot +continuation is exchanged with the current one; it means that the caller +of switch() is suspended, its continuation stored in the container, and +the old continuation from the continulet object is resumed. + +Continulets are internally implemented using stacklets. Stacklets +are a bit more primitive (they are really one-shot continuations), but +that idea only works in C, not in Python, notably because of exceptions. + +The most primitive API is actually 'permute()', which just permutes the +one-shot continuation stored in two (or more) continulets. +""" + + appleveldefs = { + 'error': 'app_continuation.error', + 'generator': 'app_continuation.generator', + } + + interpleveldefs = { + 'continulet': 'interp_continuation.W_Continulet', + 'permute': 'interp_continuation.permute', + '_p': 'interp_continuation.unpickle', # pickle support + } diff -Nru pypy-7.1.1+dfsg/pypy/module/_continuation/test/conftest.py pypy-7.3.1+dfsg/pypy/module/_continuation/test/conftest.py --- pypy-7.1.1+dfsg/pypy/module/_continuation/test/conftest.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_continuation/test/conftest.py 2020-04-10 19:28:40.000000000 +0000 @@ -1,7 +1,7 @@ -import pytest import sys def pytest_configure(config): - if sys.platform.startswith('linux'): + if (not config.getoption('runappdirect') and + sys.platform.startswith('linux')): from rpython.rlib.rvmprof.cintf import configure_libbacktrace_linux configure_libbacktrace_linux() diff -Nru pypy-7.1.1+dfsg/pypy/module/_cppyy/capi/loadable_capi.py pypy-7.3.1+dfsg/pypy/module/_cppyy/capi/loadable_capi.py --- pypy-7.1.1+dfsg/pypy/module/_cppyy/capi/loadable_capi.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_cppyy/capi/loadable_capi.py 2020-04-10 19:28:40.000000000 +0000 @@ -1,4 +1,4 @@ -import os +import os, sys from rpython.rtyper.lltypesystem import rffi, lltype from rpython.rlib.rarithmetic import intmask @@ -20,17 +20,24 @@ from pypy.module._cppyy.capi.capi_types import C_SCOPE, C_TYPE, C_OBJECT,\ C_METHOD, C_INDEX, C_INDEX_ARRAY, WLAVC_INDEX, C_FUNC_PTR - -backend_library = 'libcppyy_backend.so' +backend_ext = '.so' +if sys.platform == 'win32': + backend_ext = '.dll' + dldflags = 0 +else: + dldflags = rdynload.RTLD_LOCAL | rdynload.RTLD_LAZY + +backend_library = 'libcppyy_backend' # this is not technically correct, but will do for now -std_string_name = 'std::basic_string' +std_string_name = 'std::string' class _Arg: # poor man's union _immutable_ = True - def __init__(self, tc, h = 0, l = -1, d = -1., s = '', p = rffi.cast(rffi.VOIDP, 0)): + def __init__(self, tc, h = 0, u = 0, l = -1, d = -1., s = '', p = rffi.cast(rffi.VOIDP, 0)): self.tc = tc self._handle = h + self._index = u self._long = l self._double = d self._string = s @@ -41,6 +48,11 @@ def __init__(self, val): _Arg.__init__(self, 'h', h = val) +class _ArgU(_Arg): # separate class for rtyper + _immutable_ = True + def __init__(self, val): + _Arg.__init__(self, 'u', u = val) + class _ArgL(_Arg): _immutable_ = True def __init__(self, val): @@ -95,7 +107,10 @@ misc.write_raw_signed_data(data, rffi.cast(rffi.LONG, obj._long), argtype.size) elif obj.tc == 'h': assert isinstance(argtype, ctypeprim.W_CTypePrimitiveUnsigned) - misc.write_raw_unsigned_data(data, rffi.cast(rffi.ULONG, obj._handle), argtype.size) + misc.write_raw_unsigned_data(data, rffi.cast(rffi.UINTPTR_T, obj._handle), argtype.size) + elif obj.tc == 'u': + assert isinstance(argtype, ctypeprim.W_CTypePrimitiveUnsigned) + misc.write_raw_unsigned_data(data, rffi.cast(rffi.SIZE_T, obj._index), argtype.size) elif obj.tc == 'p': assert obj._voidp != rffi.cast(rffi.VOIDP, 0) data = rffi.cast(rffi.VOIDPP, data) @@ -142,13 +157,17 @@ # TODO: the following need to match up with the globally defined C_XYZ low-level # types (see capi/__init__.py), but by using strings here, that isn't guaranteed - c_opaque_ptr = state.c_ulong # not ptrdiff_t (which is signed) + c_opaque_ptr = state.c_uintptr_t # not size_t (which is signed) + c_size_t = state.c_size_t + c_ptrdiff_t = state.c_ptrdiff_t + c_intptr_t = state.c_intptr_t + c_uintptr_t = state.c_uintptr_t c_scope = c_opaque_ptr c_type = c_scope - c_object = c_opaque_ptr # not voidp (to stick with one handle type) - c_method = c_opaque_ptr - c_index = state.c_long + c_object = c_opaque_ptr # not voidp (to stick with one handle type) + c_method = c_uintptr_t # not intptr_t (which is signed) + c_index = c_size_t c_index_array = state.c_voidp c_void = state.c_void @@ -166,10 +185,10 @@ c_ccharp = state.c_ccharp c_voidp = state.c_voidp - c_size_t = nt.new_primitive_type(space, 'size_t') - c_ptrdiff_t = nt.new_primitive_type(space, 'ptrdiff_t') - self.capi_call_ifaces = { + # direct interpreter access + 'compile' : ([c_ccharp], c_int), + # name to opaque C++ scope representation 'resolve_name' : ([c_ccharp], c_ccharp), 'resolve_enum' : ([c_ccharp], c_ccharp), @@ -221,12 +240,17 @@ 'get_all_cpp_names' : ([c_scope, c_voidp], c_voidp), # const char** + # namespace reflection information + 'get_using_namespaces' : ([c_scope], c_index), + # type/class reflection information 'final_name' : ([c_type], c_ccharp), 'scoped_final_name' : ([c_type], c_ccharp), + 'has_virtual_destructor' : ([c_type], c_int), 'has_complex_hierarchy' : ([c_type], c_int), 'num_bases' : ([c_type], c_int), 'base_name' : ([c_type, c_int], c_ccharp), + 'is_smartptr' : ([c_type], c_int), 'is_subtype' : ([c_type, c_type], c_int), 'smartptr_info' : ([c_ccharp, c_voidp, c_voidp], c_int), 'add_smartptr_type' : ([c_ccharp], c_void), @@ -245,9 +269,11 @@ 'method_result_type' : ([c_method], c_ccharp), 'method_num_args' : ([c_method], c_int), 'method_req_args' : ([c_method], c_int), + 'method_arg_name' : ([c_method, c_int], c_ccharp), 'method_arg_type' : ([c_method, c_int], c_ccharp), 'method_arg_default' : ([c_method, c_int], c_ccharp), 'method_signature' : ([c_method, c_int], c_ccharp), + 'method_signature_max' : ([c_method, c_int, c_int], c_ccharp), 'method_prototype' : ([c_scope, c_method, c_int], c_ccharp), 'is_const_method' : ([c_method], c_int), @@ -269,7 +295,7 @@ 'num_datamembers' : ([c_scope], c_int), 'datamember_name' : ([c_scope, c_int], c_ccharp), 'datamember_type' : ([c_scope, c_int], c_ccharp), - 'datamember_offset' : ([c_scope, c_int], c_ptrdiff_t), + 'datamember_offset' : ([c_scope, c_int], c_intptr_t), 'datamember_index' : ([c_scope, c_ccharp], c_int), # data member properties @@ -305,13 +331,20 @@ state = space.fromcache(State) if state.backend is None: from pypy.module._cffi_backend.libraryobj import W_Library - dldflags = rdynload.RTLD_LOCAL | rdynload.RTLD_LAZY if os.environ.get('CPPYY_BACKEND_LIBRARY'): libname = os.environ['CPPYY_BACKEND_LIBRARY'] state.backend = W_Library(space, space.newtext(libname), dldflags) else: # try usual lookups - state.backend = W_Library(space, space.newtext(backend_library), dldflags) + try: + if backend_library[-len(backend_ext):] == backend_ext: + fullname = backend_library + else: + fullname = backend_library+backend_ext + state.backend = W_Library(space, space.newtext(fullname), dldflags) + except Exception as e: + # TODO: where to find the value '.pypy-41'? Note that this only matters for testing. + state.backend = W_Library(space, space.newtext(backend_library+'.pypy-41'+backend_ext), dldflags) if state.backend: # fix constants @@ -354,7 +387,10 @@ return rffi.cast(rffi.SIZE_T, space.uint_w(w_cdata)) def _cdata_to_ptrdiff_t(space, w_cdata): - return rffi.cast(rffi.LONG, space.int_w(w_cdata)) + return rffi.cast(rffi.PTRDIFF_T, space.int_w(w_cdata)) + +def _cdata_to_intptr_t(space, w_cdata): + return rffi.cast(rffi.INTPTR_T, space.int_w(w_cdata)) def _cdata_to_ptr(space, w_cdata): # TODO: this is both a hack and dreadfully slow w_cdata = space.interp_w(cdataobj.W_CData, w_cdata, can_be_None=False) @@ -365,6 +401,10 @@ ptr = _cdata_to_ptr(space, w_cdata) # see above ... something better? return rffi.cast(rffi.CCHARP, ptr) +# direct interpreter access +def c_compile(space, code): + return space.int_w(call_capi(space, 'compile', [_ArgS(code)])) + # name to opaque C++ scope representation ------------------------------------ def c_resolve_name(space, name): return charp2str_free(space, call_capi(space, 'resolve_name', [_ArgS(name)])) @@ -488,11 +528,17 @@ c_free(space, rffi.cast(rffi.VOIDP, rawnames)) # id. return allnames +# namespace reflection information +def c_get_using_namespaces(space, cppscope): + return space.uint_w(call_capi(space, 'get_using_namespaces', [_ArgH(cppscope)])) + # type/class reflection information ------------------------------------------ def c_final_name(space, cpptype): return charp2str_free(space, call_capi(space, 'final_name', [_ArgH(cpptype)])) def c_scoped_final_name(space, cpptype): return charp2str_free(space, call_capi(space, 'scoped_final_name', [_ArgH(cpptype)])) +def c_has_virtual_destructor(space, handle): + return space.bool_w(call_capi(space, 'has_virtual_destructor', [_ArgH(handle)])) def c_has_complex_hierarchy(space, handle): return space.bool_w(call_capi(space, 'has_complex_hierarchy', [_ArgH(handle)])) def c_num_bases(space, cppclass): @@ -500,6 +546,8 @@ def c_base_name(space, cppclass, base_index): args = [_ArgH(cppclass.handle), _ArgL(base_index)] return charp2str_free(space, call_capi(space, 'base_name', args)) +def c_is_smartptr(space, handle): + return space.bool_w(call_capi(space, 'is_smartptr', [_ArgH(handle)])) def c_is_subtype(space, derived, base): jit.promote(base) if derived == base: @@ -552,7 +600,7 @@ return py_indices def c_get_method(space, cppscope, index): - args = [_ArgH(cppscope.handle), _ArgL(index)] + args = [_ArgH(cppscope.handle), _ArgU(index)] return rffi.cast(C_METHOD, space.uint_w(call_capi(space, 'get_method', args))) def c_method_name(space, cppmeth): @@ -567,6 +615,9 @@ return space.int_w(call_capi(space, 'method_num_args', [_ArgH(cppmeth)])) def c_method_req_args(space, cppmeth): return space.int_w(call_capi(space, 'method_req_args', [_ArgH(cppmeth)])) +def c_method_arg_name(space, cppmeth, arg_index): + args = [_ArgH(cppmeth), _ArgL(arg_index)] + return charp2str_free(space, call_capi(space, 'method_arg_name', args)) def c_method_arg_type(space, cppmeth, arg_index): args = [_ArgH(cppmeth), _ArgL(arg_index)] return charp2str_free(space, call_capi(space, 'method_arg_type', args)) @@ -576,6 +627,9 @@ def c_method_signature(space, cppmeth, show_formalargs=True): args = [_ArgH(cppmeth), _ArgL(show_formalargs)] return charp2str_free(space, call_capi(space, 'method_signature', args)) +def c_method_signature_max(space, cppmeth, show_formalargs, maxargs): + args = [_ArgH(cppmeth), _ArgL(show_formalargs), _ArgL(maxargs)] + return charp2str_free(space, call_capi(space, 'method_signature_max', args)) def c_method_prototype(space, cppscope, cppmeth, show_formalargs=True): args = [_ArgH(cppscope.handle), _ArgH(cppmeth), _ArgL(show_formalargs)] return charp2str_free(space, call_capi(space, 'method_prototype', args)) @@ -583,24 +637,24 @@ return space.bool_w(call_capi(space, 'is_const_method', [_ArgH(cppmeth)])) def c_get_num_templated_methods(space, cppscope): - return space.int_w(call_capi(space, 'method_is_template', [_ArgH(cppscope.handle)])) + return space.int_w(call_capi(space, 'get_num_templated_methods', [_ArgH(cppscope.handle)])) def c_get_templated_method_name(space, cppscope, index): - args = [_ArgH(cppscope.handle), _ArgL(index)] - return charp2str_free(space, call_capi(space, 'method_is_template', args)) + args = [_ArgH(cppscope.handle), _ArgU(index)] + return charp2str_free(space, call_capi(space, 'get_templated_method_name', args)) def c_exists_method_template(space, cppscope, name): args = [_ArgH(cppscope.handle), _ArgS(name)] return space.bool_w(call_capi(space, 'exists_method_template', args)) def c_method_is_template(space, cppscope, index): - args = [_ArgH(cppscope.handle), _ArgL(index)] + args = [_ArgH(cppscope.handle), _ArgU(index)] return space.bool_w(call_capi(space, 'method_is_template', args)) def c_get_method_template(space, cppscope, name, proto): args = [_ArgH(cppscope.handle), _ArgS(name), _ArgS(proto)] - return rffi.cast(C_METHOD, space.uint_w(call_capi(space, 'get_method_template', args))) + return rffi.cast(C_METHOD, space.int_w(call_capi(space, 'get_method_template', args))) def c_get_global_operator(space, nss, lc, rc, op): if nss is not None: args = [_ArgH(nss.handle), _ArgH(lc.handle), _ArgH(rc.handle), _ArgS(op)] - return rffi.cast(WLAVC_INDEX, space.int_w(call_capi(space, 'get_global_operator', args))) + return rffi.cast(WLAVC_INDEX, space.uint_w(call_capi(space, 'get_global_operator', args))) return rffi.cast(WLAVC_INDEX, -1) # method properties ---------------------------------------------------------- @@ -624,7 +678,7 @@ return charp2str_free(space, call_capi(space, 'datamember_type', args)) def c_datamember_offset(space, cppscope, datamember_index): args = [_ArgH(cppscope.handle), _ArgL(datamember_index)] - return _cdata_to_ptrdiff_t(space, call_capi(space, 'datamember_offset', args)) + return _cdata_to_intptr_t(space, call_capi(space, 'datamember_offset', args)) def c_datamember_index(space, cppscope, name): args = [_ArgH(cppscope.handle), _ArgS(name)] diff -Nru pypy-7.1.1+dfsg/pypy/module/_cppyy/converter.py pypy-7.3.1+dfsg/pypy/module/_cppyy/converter.py --- pypy-7.1.1+dfsg/pypy/module/_cppyy/converter.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_cppyy/converter.py 2020-04-10 19:28:40.000000000 +0000 @@ -993,7 +993,7 @@ _converters["void*&"] = VoidPtrRefConverter # special cases (note: 'string' aliases added below) -_converters["std::basic_string"] = StdStringConverter +_converters["std::string"] = StdStringConverter _converters["const std::basic_string&"] = StdStringConverter # TODO: shouldn't copy _converters["std::basic_string&"] = StdStringRefConverter _converters["std::basic_string&&"] = StdStringMoveConverter @@ -1126,7 +1126,8 @@ ("char", "signed char"), # TODO: check ("const char*", "char*"), - ("std::basic_string", "string"), + ("std::string", "string"), + ("std::string", "std::basic_string"), ("const std::basic_string&", "const string&"), ("std::basic_string&", "string&"), ("std::basic_string&&", "string&&"), diff -Nru pypy-7.1.1+dfsg/pypy/module/_cppyy/executor.py pypy-7.3.1+dfsg/pypy/module/_cppyy/executor.py --- pypy-7.1.1+dfsg/pypy/module/_cppyy/executor.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_cppyy/executor.py 2020-04-10 19:28:40.000000000 +0000 @@ -384,7 +384,7 @@ # special cases (note: 'string' aliases added below) _executors["constructor"] = ConstructorExecutor -_executors["std::basic_string"] = StdStringExecutor +_executors["std::string"] = StdStringExecutor _executors["const std::basic_string&"] = StdStringRefExecutor _executors["std::basic_string&"] = StdStringRefExecutor @@ -453,7 +453,8 @@ aliases = ( ("const char*", "char*"), - ("std::basic_string", "string"), + ("std::string", "string"), + ("std::string", "std::basic_string"), ("const std::basic_string&", "const string&"), ("std::basic_string&", "string&"), diff -Nru pypy-7.1.1+dfsg/pypy/module/_cppyy/ffitypes.py pypy-7.3.1+dfsg/pypy/module/_cppyy/ffitypes.py --- pypy-7.1.1+dfsg/pypy/module/_cppyy/ffitypes.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_cppyy/ffitypes.py 2020-04-10 19:28:40.000000000 +0000 @@ -38,6 +38,8 @@ # special types self.c_size_t = nt.new_primitive_type(space, 'size_t') self.c_ptrdiff_t = nt.new_primitive_type(space, 'ptrdiff_t') + self.c_intptr_t = nt.new_primitive_type(space, 'intptr_t') + self.c_uintptr_t = nt.new_primitive_type(space, 'uintptr_t') class BoolTypeMixin(object): _mixin_ = True diff -Nru pypy-7.1.1+dfsg/pypy/module/_cppyy/include/capi.h pypy-7.3.1+dfsg/pypy/module/_cppyy/include/capi.h --- pypy-7.1.1+dfsg/pypy/module/_cppyy/include/capi.h 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_cppyy/include/capi.h 2020-04-10 19:28:40.000000000 +0000 @@ -2,22 +2,26 @@ #define CPPYY_CAPI #include +#include #include "src/precommondefs.h" #ifdef __cplusplus extern "C" { #endif // ifdef __cplusplus - typedef ptrdiff_t cppyy_scope_t; + typedef size_t cppyy_scope_t; typedef cppyy_scope_t cppyy_type_t; typedef void* cppyy_object_t; - typedef ptrdiff_t cppyy_method_t; + typedef intptr_t cppyy_method_t; - typedef long cppyy_index_t; + typedef size_t cppyy_index_t; typedef void* cppyy_funcaddr_t; typedef unsigned long cppyy_exctype_t; + /* direct interpreter access ---------------------------------------------- */ + int cppyy_compile(const char* code); + /* name to opaque C++ scope representation -------------------------------- */ RPY_EXTERN char* cppyy_resolve_name(const char* cppitem_name); @@ -103,12 +107,17 @@ RPY_EXTERN const char** cppyy_get_all_cpp_names(cppyy_scope_t scope, size_t* count); + /* namespace reflection information --------------------------------------- */ + cppyy_index_t* cppyy_get_using_namespaces(cppyy_scope_t scope); + /* class reflection information ------------------------------------------- */ RPY_EXTERN char* cppyy_final_name(cppyy_type_t type); RPY_EXTERN char* cppyy_scoped_final_name(cppyy_type_t type); RPY_EXTERN + int cppyy_has_virtual_destructor(cppyy_type_t type); + RPY_EXTERN int cppyy_has_complex_hierarchy(cppyy_type_t type); RPY_EXTERN int cppyy_num_bases(cppyy_type_t type); @@ -117,6 +126,8 @@ RPY_EXTERN int cppyy_is_subtype(cppyy_type_t derived, cppyy_type_t base); RPY_EXTERN + int cppyy_is_smartptr(cppyy_type_t type); + RPY_EXTERN int cppyy_smartptr_info(const char* name, cppyy_type_t* raw, cppyy_method_t* deref); RPY_EXTERN void cppyy_add_smartptr_type(const char* type_name); @@ -147,20 +158,24 @@ RPY_EXTERN int cppyy_method_req_args(cppyy_method_t); RPY_EXTERN + char* cppyy_method_arg_name(cppyy_method_t,int arg_index); + RPY_EXTERN char* cppyy_method_arg_type(cppyy_method_t, int arg_index); RPY_EXTERN char* cppyy_method_arg_default(cppyy_method_t, int arg_index); RPY_EXTERN char* cppyy_method_signature(cppyy_method_t, int show_formalargs); RPY_EXTERN + char* cppyy_method_signature_max(cppyy_method_t, int show_formalargs, int maxargs); + RPY_EXTERN char* cppyy_method_prototype(cppyy_scope_t scope, cppyy_method_t, int show_formalargs); RPY_EXTERN int cppyy_is_const_method(cppyy_method_t); RPY_EXTERN - int get_num_templated_methods(cppyy_scope_t scope); + int cppyy_get_num_templated_methods(cppyy_scope_t scope); RPY_EXTERN - char* get_templated_method_name(cppyy_scope_t scope, cppyy_index_t imeth); + char* cppyy_get_templated_method_name(cppyy_scope_t scope, cppyy_index_t imeth); RPY_EXTERN int cppyy_exists_method_template(cppyy_scope_t scope, const char* name); RPY_EXTERN @@ -190,7 +205,7 @@ RPY_EXTERN char* cppyy_datamember_type(cppyy_scope_t scope, int datamember_index); RPY_EXTERN - ptrdiff_t cppyy_datamember_offset(cppyy_scope_t scope, int datamember_index); + intptr_t cppyy_datamember_offset(cppyy_scope_t scope, int datamember_index); RPY_EXTERN int cppyy_datamember_index(cppyy_scope_t scope, const char* name); diff -Nru pypy-7.1.1+dfsg/pypy/module/_cppyy/__init__.py pypy-7.3.1+dfsg/pypy/module/_cppyy/__init__.py --- pypy-7.1.1+dfsg/pypy/module/_cppyy/__init__.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_cppyy/__init__.py 2020-04-10 19:28:40.000000000 +0000 @@ -1,39 +0,0 @@ -from pypy.interpreter.mixedmodule import MixedModule - -class Module(MixedModule): - "This module bridges the cppyy frontend with its backend, through PyPy.\n\ - See http://cppyy.readthedocs.io/en/latest for full details." - - interpleveldefs = { - '_resolve_name' : 'interp_cppyy.resolve_name', - '_scope_byname' : 'interp_cppyy.scope_byname', - '_is_static_data' : 'interp_cppyy.is_static_data', - '_is_template' : 'interp_cppyy.is_template', - '_std_string_name' : 'interp_cppyy.std_string_name', - '_set_class_generator' : 'interp_cppyy.set_class_generator', - '_set_function_generator': 'interp_cppyy.set_function_generator', - '_register_class' : 'interp_cppyy.register_class', - '_get_nullptr' : 'interp_cppyy.get_nullptr', - 'CPPInstance' : 'interp_cppyy.W_CPPInstance', - 'addressof' : 'interp_cppyy.addressof', - '_bind_object' : 'interp_cppyy._bind_object', - 'bind_object' : 'interp_cppyy.bind_object', - 'move' : 'interp_cppyy.move', - '_pin_type' : 'interp_cppyy._pin_type', - } - - appleveldefs = { - '_post_import_startup' : 'pythonify._post_import_startup', - 'Template' : 'pythonify.CPPTemplate', - 'add_pythonization' : 'pythonify.add_pythonization', - 'remove_pythonization' : 'pythonify.remove_pythonization', - } - - def __init__(self, space, *args): - "NOT_RPYTHON" - MixedModule.__init__(self, space, *args) - - # pythonization functions may be written in RPython, but the interp2app - # code generation is not, so give it a chance to run now - from pypy.module._cppyy import capi - capi.register_pythonizations(space) diff -Nru pypy-7.1.1+dfsg/pypy/module/_cppyy/interp_cppyy.py pypy-7.3.1+dfsg/pypy/module/_cppyy/interp_cppyy.py --- pypy-7.1.1+dfsg/pypy/module/_cppyy/interp_cppyy.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_cppyy/interp_cppyy.py 2020-04-10 19:28:40.000000000 +0000 @@ -981,8 +981,8 @@ ) class W_CPPTemplateStaticOverload(W_CPPStaticOverload, TemplateOverloadMixin): - """App-level dispatcher to allow both lookup/instantiation of templated methods and - dispatch among overloads between templated and non-templated method.""" + """Dispatcher to allow both lookup/instantiation of templated methods and + select among templated and non-templated method overloads.""" _attrs_ = ['name', 'tmpl_args', 'overloads', 'master', 'w_this'] _immutable_fields_ = ['name', 'tmpl_args'] @@ -996,7 +996,8 @@ self.w_this = space.w_None def clone(self, tmpl_args): - other = W_CPPTemplateStaticOverload(self.space, self.name, tmpl_args, self.scope, self.functions, self.flags) + other = W_CPPTemplateStaticOverload(self.space, self.name, + tmpl_args, self.scope, self.functions, self.flags) other.overloads = self.overloads other.master = self.master other.w_this = self.w_this @@ -1007,7 +1008,8 @@ if isinstance(w_cppinstance, W_CPPInstance): cppinstance = self.space.interp_w(W_CPPInstance, w_cppinstance) if cppinstance.clsdecl.handle != self.scope.handle: - cppol = W_CPPTemplateStaticOverload(self.space, self.name, self.tmpl_args, self.scope, self.functions, self.flags) + cppol = W_CPPTemplateStaticOverload(self.space, self.name, + self.tmpl_args, self.scope, self.functions, self.flags) cppol.w_this = w_cppinstance cppol.master = self.master return cppol # bound @@ -1256,10 +1258,10 @@ return self.handle != other.handle -# For now, keep namespaces and classes separate as namespaces are extensible +# Namespaces and classes are separate as namespaces are (more) extensible # with info from multiple dictionaries and do not need to bother with meta -# classes for inheritance. Both are python classes, though, and refactoring -# may be in order at some point. +# classes for inheritance. Both are python classes, though, and further +# refactoring may be in order at some point. class W_CPPNamespaceDecl(W_CPPScopeDecl): _attrs_ = ['space', 'handle', 'name', 'overloads', 'datamembers'] _immutable_fields_ = ['handle', 'name'] @@ -1355,6 +1357,8 @@ def _build_overloads(self): assert len(self.overloads) == 0 methods_tmp = {}; ftype_tmp = {} + + # add all ordinary methods (incl. pre-instantiated templates) for idx in range(capi.c_num_methods(self.space, self)): cppmeth = capi.c_get_method(self.space, self, idx) if capi.c_is_constructor(self.space, cppmeth): @@ -1372,6 +1376,7 @@ ftype_tmp[pyname] |= self._make_cppfunction(pyname, cppmeth, methods) if capi.c_method_is_template(self.space, self, idx): ftype_tmp[pyname] |= FUNCTION_IS_TEMPLATE + # the following covers the case where the only kind of operator[](idx) # returns are the ones that produce non-const references; these can be # used for __getitem__ just as much as for __setitem__, though @@ -1407,6 +1412,11 @@ overload = W_CPPOverload(self.space, self, methods[:]) self.overloads[pyname] = overload + # add placeholders for all non-instantiated templated methods + for idx in range(capi.c_get_num_templated_methods(self.space, self)): + cppname = capi.c_get_templated_method_name(self.space, self, idx) + self.overloads[cppname] = W_CPPTemplateOverload(self.space, cppname, None, self, []) + def _make_cppfunction(self, pyname, cppmeth, funcs): num_args = capi.c_method_num_args(self.space, cppmeth) args_required = capi.c_method_req_args(self.space, cppmeth) diff -Nru pypy-7.1.1+dfsg/pypy/module/_cppyy/moduledef.py pypy-7.3.1+dfsg/pypy/module/_cppyy/moduledef.py --- pypy-7.1.1+dfsg/pypy/module/_cppyy/moduledef.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_cppyy/moduledef.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,39 @@ +from pypy.interpreter.mixedmodule import MixedModule + +class Module(MixedModule): + "This module bridges the cppyy frontend with its backend, through PyPy.\n\ + See http://cppyy.readthedocs.io/en/latest for full details." + + interpleveldefs = { + '_resolve_name' : 'interp_cppyy.resolve_name', + '_scope_byname' : 'interp_cppyy.scope_byname', + '_is_static_data' : 'interp_cppyy.is_static_data', + '_is_template' : 'interp_cppyy.is_template', + '_std_string_name' : 'interp_cppyy.std_string_name', + '_set_class_generator' : 'interp_cppyy.set_class_generator', + '_set_function_generator': 'interp_cppyy.set_function_generator', + '_register_class' : 'interp_cppyy.register_class', + '_get_nullptr' : 'interp_cppyy.get_nullptr', + 'CPPInstance' : 'interp_cppyy.W_CPPInstance', + 'addressof' : 'interp_cppyy.addressof', + '_bind_object' : 'interp_cppyy._bind_object', + 'bind_object' : 'interp_cppyy.bind_object', + 'move' : 'interp_cppyy.move', + '_pin_type' : 'interp_cppyy._pin_type', + } + + appleveldefs = { + '_post_import_startup' : 'pythonify._post_import_startup', + 'Template' : 'pythonify.CPPTemplate', + 'add_pythonization' : 'pythonify.add_pythonization', + 'remove_pythonization' : 'pythonify.remove_pythonization', + } + + def __init__(self, space, *args): + "NOT_RPYTHON" + MixedModule.__init__(self, space, *args) + + # pythonization functions may be written in RPython, but the interp2app + # code generation is not, so give it a chance to run now + from pypy.module._cppyy import capi + capi.register_pythonizations(space) diff -Nru pypy-7.1.1+dfsg/pypy/module/_cppyy/pythonify.py pypy-7.3.1+dfsg/pypy/module/_cppyy/pythonify.py --- pypy-7.1.1+dfsg/pypy/module/_cppyy/pythonify.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_cppyy/pythonify.py 2020-04-10 19:28:40.000000000 +0000 @@ -439,14 +439,17 @@ # also the fallback on the indexed __getitem__, but that is slower) add_checked_item = False if name.find('std::vector', 0, 11) != 0: - if ('begin' in pyclass.__dict__ and 'end' in pyclass.__dict__): + if 'begin' in pyclass.__dict__ and 'end' in pyclass.__dict__: if _cppyy._scope_byname(name+'::iterator') or \ _cppyy._scope_byname(name+'::const_iterator'): def __iter__(self): i = self.begin() - while i != self.end(): + end = self.size() + count = 0 + while count != end: yield i.__deref__() i.__preinc__() + count += 1 i.__destruct__() raise StopIteration pyclass.__iter__ = __iter__ diff -Nru pypy-7.1.1+dfsg/pypy/module/_cppyy/src/dummy_backend.cxx pypy-7.3.1+dfsg/pypy/module/_cppyy/src/dummy_backend.cxx --- pypy-7.1.1+dfsg/pypy/module/_cppyy/src/dummy_backend.cxx 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_cppyy/src/dummy_backend.cxx 2020-04-10 19:28:40.000000000 +0000 @@ -13,6 +13,19 @@ #pragma GCC diagnostic ignored "-Winvalid-offsetof" +#if defined(_MSC_VER) + #define INLINE __inline +#elif defined(__GNUC__) + #if defined(__STRICT_ANSI__) + #define INLINE __inline__ + #else + #define INLINE inline + #endif +#else + #define INLINE +#endif + + // union for argument passing struct CPPYY_G__value { union { @@ -160,7 +173,7 @@ struct Cppyy_InitPseudoReflectionInfo { Cppyy_InitPseudoReflectionInfo() { // class example01 -- - static long s_scope_id = 0; + static cppyy_scope_t s_scope_id = 0; { // namespace '' s_handles[""] = (cppyy_scope_t)++s_scope_id; @@ -413,7 +426,7 @@ /* local helpers ---------------------------------------------------------- */ -static inline char* cppstring_to_cstring(const std::string& name) { +static INLINE char* cppstring_to_cstring(const std::string& name) { char* name_char = (char*)malloc(name.size() + 1); strcpy(name_char, name.c_str()); return name_char; @@ -450,14 +463,14 @@ Cppyy_PseudoMethodInfo* idx = (Cppyy_PseudoMethodInfo*)method; if (idx == s_methods["static_example01::staticSetPayload_payload*_double"]) { assert(!self && nargs == 2); - dummy::example01::staticSetPayload((dummy::payload*)(*(long*)&((CPPYY_G__value*)args)[0]), + dummy::example01::staticSetPayload((dummy::payload*)(*(intptr_t*)&((CPPYY_G__value*)args)[0]), ((CPPYY_G__value*)args)[1].obj.d); } else if (idx == s_methods["static_example01::setCount_int"]) { assert(!self && nargs == 1); dummy::example01::setCount(((CPPYY_G__value*)args)[0].obj.in); } else if (idx == s_methods["example01::setPayload_payload*"]) { assert(self && nargs == 1); - ((dummy::example01*)self)->setPayload((dummy::payload*)(*(long*)&((CPPYY_G__value*)args)[0])); + ((dummy::example01*)self)->setPayload((dummy::payload*)(*(intptr_t*)&((CPPYY_G__value*)args)[0])); } else if (idx == s_methods["CppyyTestData::destroy_arrays"]) { assert(self && nargs == 0); ((dummy::CppyyTestData*)self)->destroy_arrays(); @@ -591,11 +604,11 @@ result = dummy::example01::staticAddOneToInt(((CPPYY_G__value*)args)[0].obj.in); } else if (idx == s_methods["static_example01::staticAddOneToInt_int_int"]) { assert(!self && nargs == 2); - result = dummy::example01::staticAddOneToInt( + result = dummy::example01::staticAddOneToInt( ((CPPYY_G__value*)args)[0].obj.in, ((CPPYY_G__value*)args)[1].obj.in); } else if (idx == s_methods["static_example01::staticAtoi_cchar*"]) { assert(!self && nargs == 1); - result = dummy::example01::staticAtoi((const char*)(*(long*)&((CPPYY_G__value*)args)[0])); + result = dummy::example01::staticAtoi((const char*)(*(intptr_t*)&((CPPYY_G__value*)args)[0])); } else if (idx == s_methods["static_example01::getCount"]) { assert(!self && nargs == 0); result = dummy::example01::getCount(); @@ -605,7 +618,7 @@ } else if (idx == s_methods["example01::addDataToAtoi_cchar*"]) { assert(self && nargs == 1); result = ((dummy::example01*)self)->addDataToAtoi( - (const char*)(*(long*)&((CPPYY_G__value*)args)[0])); + (const char*)(*(intptr_t*)&((CPPYY_G__value*)args)[0])); } else if (idx == s_methods["CppyyTestData::get_int"]) { assert(self && nargs == 0); result = ((dummy::CppyyTestData*)self)->get_int(); @@ -621,20 +634,20 @@ if (idx == s_methods["static_example01::staticStrcpy_cchar*"]) { assert(!self && nargs == 1); result = (long)dummy::example01::staticStrcpy( - (const char*)(*(long*)&((CPPYY_G__value*)args)[0])); + (const char*)(*(intptr_t*)&((CPPYY_G__value*)args)[0])); } else if (idx == s_methods["static_example01::staticCyclePayload_payload*_double"]) { assert(!self && nargs == 2); result = (long)dummy::example01::staticCyclePayload( - (dummy::payload*)(*(long*)&((CPPYY_G__value*)args)[0]), + (dummy::payload*)(*(intptr_t*)&((CPPYY_G__value*)args)[0]), ((CPPYY_G__value*)args)[1].obj.d); } else if (idx == s_methods["example01::addToStringValue_cchar*"]) { assert(self && nargs == 1); result = (long)((dummy::example01*)self)->addToStringValue( - (const char*)(*(long*)&((CPPYY_G__value*)args)[0])); + (const char*)(*(intptr_t*)&((CPPYY_G__value*)args)[0])); } else if (idx == s_methods["example01::cyclePayload_payload*"]) { assert(self && nargs == 1); result = (long)((dummy::example01*)self)->cyclePayload( - (dummy::payload*)(*(long*)&((CPPYY_G__value*)args)[0])); + (dummy::payload*)(*(intptr_t*)&((CPPYY_G__value*)args)[0])); } else if (idx == s_methods["CppyyTestData::get_uint"]) { assert(self && nargs == 0); result = (long)((dummy::CppyyTestData*)self)->get_uint(); @@ -731,7 +744,7 @@ } else if (idx == s_methods["CppyyTestData::pass_void_array_l"]) { assert(self && nargs == 1); result = (long)((dummy::CppyyTestData*)self)->pass_void_array_l( - (*(long**)&((CPPYY_G__value*)args)[0])); + (*(intptr_t**)&((CPPYY_G__value*)args)[0])); } else if (idx == s_methods["CppyyTestData::pass_array_ulong"]) { assert(self && nargs == 1); result = (long)((dummy::CppyyTestData*)self)->pass_array( @@ -739,7 +752,7 @@ } else if (idx == s_methods["CppyyTestData::pass_void_array_L"]) { assert(self && nargs == 1); result = (long)((dummy::CppyyTestData*)self)->pass_void_array_L( - (*(unsigned long**)&((CPPYY_G__value*)args)[0])); + (*(uintptr_t**)&((CPPYY_G__value*)args)[0])); } else if (idx == s_methods["CppyyTestData::pass_array_float"]) { assert(self && nargs == 1); result = (long)((dummy::CppyyTestData*)self)->pass_array( @@ -868,7 +881,7 @@ Cppyy_PseudoMethodInfo* idx = (Cppyy_PseudoMethodInfo*)method; if (idx == s_methods["static_example01::staticStrcpy_cchar*"]) { assert(!self && nargs == 1); - result = dummy::example01::staticStrcpy((const char*)(*(long*)&((CPPYY_G__value*)args)[0])); + result = dummy::example01::staticStrcpy((const char*)(*(intptr_t*)&((CPPYY_G__value*)args)[0])); } else { assert(!"method unknown in cppyy_call_s"); } @@ -903,7 +916,8 @@ /* handling of function argument buffer ----------------------------------- */ void* cppyy_allocate_function_args(int nargs) { - CPPYY_G__value* args = (CPPYY_G__value*)malloc(nargs*sizeof(CPPYY_G__value)); + /* nargs parameters + one unsigned long for exception status output */ + CPPYY_G__value* args = (CPPYY_G__value*)malloc(nargs*sizeof(CPPYY_G__value)+sizeof(unsigned long)); for (int i = 0; i < nargs; ++i) args[i].type = 'l'; return (void*)args; @@ -1023,6 +1037,10 @@ return cppstring_to_cstring(""); } +int cppyy_get_num_templated_methods(cppyy_scope_t scope) { + return 0; +} + int cppyy_exists_method_template(cppyy_scope_t scope, const char* name) { return 0; } diff -Nru pypy-7.1.1+dfsg/pypy/module/_cppyy/test/conftest.py pypy-7.3.1+dfsg/pypy/module/_cppyy/test/conftest.py --- pypy-7.1.1+dfsg/pypy/module/_cppyy/test/conftest.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_cppyy/test/conftest.py 2020-04-10 19:28:40.000000000 +0000 @@ -5,7 +5,7 @@ @py.test.mark.tryfirst def pytest_runtest_setup(item): - if py.path.local.sysfind('genreflex') is None: + if not disabled and py.path.local.sysfind('genreflex') is None: import pypy.module._cppyy.capi.loadable_capi as lcapi if 'dummy' in lcapi.backend_library: # run only tests that are covered by the dummy backend and tests @@ -33,23 +33,24 @@ def pytest_ignore_collect(path, config): path = str(path) - if py.path.local.sysfind('genreflex') is None and config.option.runappdirect: - return commonprefix([path, THIS_DIR]) == THIS_DIR if disabled: - return commonprefix([path, THIS_DIR]) == THIS_DIR + if commonprefix([path, THIS_DIR]) == THIS_DIR: # workaround for bug in pytest<3.0.5 + return True disabled = None def pytest_configure(config): + global disabled + if config.getoption('runappdirect') or config.getoption('direct_apptest'): + if py.path.local.sysfind('genreflex') is None: + disabled = True # can't run dummy tests in -A + return if py.path.local.sysfind('genreflex') is None: import pypy.module._cppyy.capi.loadable_capi as lcapi try: import ctypes ctypes.CDLL(lcapi.backend_library) except Exception as e: - if config.option.runappdirect: - return # "can't run dummy tests in -A" - # build dummy backend (which has reflex info and calls hard-wired) import os from rpython.translator.tool.cbuild import ExternalCompilationInfo @@ -62,12 +63,16 @@ srcpath = pkgpath.join('src') incpath = pkgpath.join('include') tstpath = pkgpath.join('test') + compile_extra = ['-DRPY_EXTERN=RPY_EXPORTED', '-DCPPYY_DUMMY_BACKEND'] + if platform.name == 'msvc': + compile_extra += ['-std:c++14'] + else: + compile_extra += ['-fno-strict-aliasing', '-std=c++14'] eci = ExternalCompilationInfo( separate_module_files=[srcpath.join('dummy_backend.cxx')], include_dirs=[incpath, tstpath, cdir], - compile_extra=['-DRPY_EXTERN=RPY_EXPORTED', '-DCPPYY_DUMMY_BACKEND', - '-fno-strict-aliasing', '-std=c++14'], + compile_extra=compile_extra, use_cpp_linker=True, ) @@ -78,7 +83,6 @@ standalone=False) except CompilationError as e: if '-std=c++14' in str(e): - global disabled disabled = str(e) return raise diff -Nru pypy-7.1.1+dfsg/pypy/module/_cppyy/test/Makefile pypy-7.3.1+dfsg/pypy/module/_cppyy/test/Makefile --- pypy-7.1.1+dfsg/pypy/module/_cppyy/test/Makefile 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_cppyy/test/Makefile 2020-04-10 19:28:40.000000000 +0000 @@ -15,7 +15,7 @@ HASGENREFLEX:=$(shell command -v genreflex 2> /dev/null) -cppflags=-std=c++14 -O3 -fPIC -rdynamic +cppflags=$(shell cling-config --cppflags) -O3 -fPIC -rdynamic ifdef HASGENREFLEX genreflex_flags:=$(shell genreflex --cppflags) cppflags+=$(genreflex_flags) diff -Nru pypy-7.1.1+dfsg/pypy/module/_cppyy/test/support.py pypy-7.3.1+dfsg/pypy/module/_cppyy/test/support.py --- pypy-7.1.1+dfsg/pypy/module/_cppyy/test/support.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_cppyy/test/support.py 2020-04-10 19:28:40.000000000 +0000 @@ -5,12 +5,6 @@ def setup_make(targetname): if sys.platform == 'win32': - py.test.skip("win32 not supported so far") - import pypy.module._cppyy.capi.loadable_capi as lcapi - popen = subprocess.Popen(["make", targetname], cwd=str(currpath), - stdout=subprocess.PIPE, stderr=subprocess.STDOUT) - stdout, _ = popen.communicate() - if popen.returncode: - if '-std=c++11' in stdout: - py.test.skip("gcc does not seem to support -std=c++11") - raise OSError("'make' failed:\n%s" % (stdout,)) + py.test.skip('Cannot run this Makefile on windows') + from rpython.translator.platform import platform as compiler + compiler.execute_makefile(currpath, [targetname]) diff -Nru pypy-7.1.1+dfsg/pypy/module/_cppyy/test/templates.cxx pypy-7.3.1+dfsg/pypy/module/_cppyy/test/templates.cxx --- pypy-7.1.1+dfsg/pypy/module/_cppyy/test/templates.cxx 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_cppyy/test/templates.cxx 2020-04-10 19:28:40.000000000 +0000 @@ -10,3 +10,28 @@ long MyTemplatedMethodClass::get_float_size() { return (long)sizeof(float); } long MyTemplatedMethodClass::get_double_size() { return (long)sizeof(double); } long MyTemplatedMethodClass::get_self_size() { return (long)sizeof(MyTemplatedMethodClass); } + + +// variadic templates +#ifdef WIN32 +__declspec(dllexport) +#endif +std::string some_variadic::gTypeName = ""; + + +// template with empty body +namespace T_WithEmptyBody { + +#ifdef WIN32 +__declspec(dllexport) +#endif +std::string side_effect = "not set"; + +template +void some_empty() { + side_effect = "side effect"; +} + +template void some_empty(); + +} // namespace T_WithRValue diff -Nru pypy-7.1.1+dfsg/pypy/module/_cppyy/test/templates.h pypy-7.3.1+dfsg/pypy/module/_cppyy/test/templates.h --- pypy-7.1.1+dfsg/pypy/module/_cppyy/test/templates.h 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_cppyy/test/templates.h 2020-04-10 19:28:40.000000000 +0000 @@ -1,12 +1,47 @@ +#ifndef CPPYY_TEST_TEMPLATES_H +#define CPPYY_TEST_TEMPLATES_H + +#include #include #include #include +#if defined(_MSC_VER) + #define INLINE __inline +#elif defined(__GNUC__) + #if defined(__STRICT_ANSI__) + #define INLINE __inline__ + #else + #define INLINE inline + #endif +#else + #define INLINE +#endif + + + +#ifndef __MSC_VER +#include +INLINE std::string demangle_it(const char* name, const char* errmsg) { + int status; + std::string res = abi::__cxa_demangle(name, 0, 0, &status); + if (status != 0) throw std::runtime_error(errmsg); + return res; +} +#else +INLINE std::string demangle_it(const char* name, const char*) { + return name; // typeinfo's name() is already demangled +} +#endif + //=========================================================================== class MyTemplatedMethodClass { // template methods public: - long get_size(); // to get around bug in genreflex + template long get_size(A&); + template long get_size(const A&); + + long get_size(); template long get_size(); long get_char_size(); @@ -21,8 +56,18 @@ double m_data[3]; }; +template +long MyTemplatedMethodClass::get_size(A&) { + return sizeof(A); +} + +template +long MyTemplatedMethodClass::get_size(const A&) { + return sizeof(A)+1; +} + template -inline long MyTemplatedMethodClass::get_size() { +INLINE long MyTemplatedMethodClass::get_size() { return sizeof(B); } @@ -35,7 +80,7 @@ // "lying" specialization template<> -inline long MyTemplatedMethodClass::get_size() { +INLINE long MyTemplatedMethodClass::get_size() { return 42; } @@ -63,7 +108,7 @@ }; template -SomeResult global_get_some_result(const std::vector& carrier) { +SomeResult global_get_some_result(const I& carrier) { SomeResult r{}; r.m_retval = O(carrier[0]); return r; @@ -72,10 +117,10 @@ //=========================================================================== // variadic functions -inline bool isSomeInt(int) { return true; } -inline bool isSomeInt(double) { return false; } +INLINE bool isSomeInt(int) { return true; } +INLINE bool isSomeInt(double) { return false; } template -inline bool isSomeInt(Args...) { return false; } +INLINE bool isSomeInt(Args...) { return false; } namespace AttrTesting { @@ -119,7 +164,7 @@ return T; } -inline std::string tuplify(std::ostringstream& out) { +INLINE std::string tuplify(std::ostringstream& out) { out << "NULL)"; return out.str(); } @@ -156,3 +201,295 @@ T m_value; }; */ + + +//=========================================================================== +// templated callable +class TemplatedCallable { +public: + template + O operator() (const I& in) const { return O(in); } +}; + + +//=========================================================================== +// templated typedefs +namespace TemplatedTypedefs { + +template +struct BaseWithEnumAndTypedefs { + enum { vsize = _vsize }; + typedef TYPE_IN in_type; + typedef TYPE_OUT out_type; +}; + +template +struct DerivedWithUsing : public BaseWithEnumAndTypedefs +{ + typedef BaseWithEnumAndTypedefs base_type; + using base_type::vsize; + using typename base_type::in_type; + typedef typename base_type::in_type in_type_tt; + using typename base_type::out_type; +}; + +struct SomeDummy {}; + +} // namespace TemplatedTypedefs + + +//=========================================================================== +// hiding templated methods +namespace TemplateHiding { + +struct Base { + template + int callme(T t = T(1)) { return 2*t; } +}; + +struct Derived : public Base { + int callme(int t = 2) { return t; } +}; + +} // namespace TemplateHiding + + +//=========================================================================== +// 'using' of templates +template using DA_vector = std::vector; + +#if __cplusplus > 201402L +namespace using_problem { + +template +struct vector { + vector() : m_val(SZ) {} + T m_val; +}; + +template +struct matryoshka { + typedef T type; +}; + +template +struct matryoshka { + typedef vector::type, SZ> type; +}; + +template +using make_vector = typename matryoshka::type; + typedef make_vector iiv_t; +}; +#endif + +namespace using_problem { + +template +class Base { +public: + template + R get1(T t) { return t + R{5}; } + T get2() { return T{5}; } + template + R get3(T t) { return t + R{5}; } + T get3() { return T{5}; } +}; + +template +class Derived : public Base { +public: + typedef Base _Mybase; + using _Mybase::get1; + using _Mybase::get2; + using _Mybase::get3; +}; + +} // namespace using_problem + + +//=========================================================================== +// template with r-value +namespace T_WithRValue { + +template +bool is_valid(T&& new_value) { + return new_value != T{}; +} + +} // namespace T_WithRValue + + +//=========================================================================== +// variadic templates +namespace some_variadic { + +#ifdef WIN32 +extern __declspec(dllimport) std::string gTypeName; +#else +extern std::string gTypeName; +#endif + +template +class A { +public: + A() { + gTypeName = demangle_it(typeid(A).name(), "A::A"); + } + A(const A&) = default; + A(A&&) = default; + A& operator=(const A&) = default; + A& operator=(A&&) = default; + + template + void a(FArgs&&... args) { + gTypeName = demangle_it(typeid(&A::a).name(), "A::a-2"); + } + + template + T a_T(FArgs&&... args) { + gTypeName = demangle_it(typeid(&A::a_T).name(), "A::a_T-2"); + return T{}; + } + + template + static void sa(FArgs&&... args) { + gTypeName = demangle_it(typeid(A).name(), "A::sa-1"); + gTypeName += "::"; + gTypeName += demangle_it(typeid(A::sa).name(), "A::sa-2"); + } + + template + static T sa_T(FArgs&&... args) { + gTypeName = demangle_it(typeid(A).name(), "A::sa_T-1"); + gTypeName += "::"; + gTypeName += demangle_it(typeid(A::sa_T).name(), "A::sa_T-2"); + return T{}; + } +}; + +class B { +public: + B() { + gTypeName = demangle_it(typeid(B).name(), "B::B"); + } + B(const B&) = default; + B(B&&) = default; + B& operator=(const B&) = default; + B& operator=(B&&) = default; + + template + void b(FArgs&&... args) { + gTypeName = demangle_it(typeid(&B::b).name(), "B::b-2"); + } + + template + T b_T(FArgs&&... args) { + gTypeName = demangle_it(typeid(&B::b_T).name(), "B::b_T-2"); + return T{}; + } + + template + static void sb(FArgs&&... args) { + gTypeName = demangle_it(typeid(B).name(), "B::sb-1"); + gTypeName += "::"; + gTypeName += demangle_it(typeid(B::sb).name(), "B::sb-2"); + } + + template + static T sb_T(FArgs&&... args) { + gTypeName = demangle_it(typeid(B).name(), "B::sb_T-1"); + gTypeName += "::"; + gTypeName += demangle_it(typeid(B::sb_T).name(), "B::sb_T-2"); + return T{}; + } +}; + +template +void fn(Args&&... args) { + gTypeName = demangle_it(typeid(fn).name(), "fn"); +} + +template +T fn_T(Args&&... args) { + gTypeName = demangle_it(typeid(fn).name(), "fn_T"); + return T{}; +} + +} // namespace some_variadic + + +//=========================================================================== +// template with empty body +namespace T_WithEmptyBody { + +#ifdef WIN32 +extern __declspec(dllimport) std::string side_effect; +#else +extern std::string side_effect; +#endif + +template +void some_empty(); + +} // namespace T_WithEmptyBody + + +//=========================================================================== +// template with catch-all (void*, void**)overloads +namespace T_WithGreedyOverloads { + +class SomeClass { + double fD; +}; + +class WithGreedy1 { +public: + template + int get_size(T*) { return (int)sizeof(T); } + int get_size(void*, bool force=false) { return -1; } +}; + +class WithGreedy2 { +public: + template + int get_size(T*) { return (int)sizeof(T); } + int get_size(void**, bool force=false) { return -1; } +}; + +class DoesNotExist; + +class WithGreedy3 { +public: + template + int get_size(T*) { return (int)sizeof(T); } + int get_size(DoesNotExist*, bool force=false) { return -1; } +}; + +} // namespace T_WithGreedyOverloads + + +//=========================================================================== +// template with overloaded non-templated and templated setitem +namespace TemplateWithSetItem { + +template +class MyVec { +private: + std::vector fData; + +public: + using size_type = typename std::vector::size_type; + + MyVec(size_type count) : fData(count) {} + + T & operator[](size_type index) { return fData[index]; } + + // The definition of this templated operator causes the issue + template + MyVec operator[](const MyVec &conds) const { return MyVec(2); } +}; + +} // namespace TemplateWithSetItem + +#endif // !CPPYY_TEST_TEMPLATES_H diff -Nru pypy-7.1.1+dfsg/pypy/module/_cppyy/test/templates.xml pypy-7.3.1+dfsg/pypy/module/_cppyy/test/templates.xml --- pypy-7.1.1+dfsg/pypy/module/_cppyy/test/templates.xml 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_cppyy/test/templates.xml 2020-04-10 19:28:40.000000000 +0000 @@ -16,4 +16,21 @@ + + + + + + + + + + + + + + + + + diff -Nru pypy-7.1.1+dfsg/pypy/module/_cppyy/test/test_fragile.py pypy-7.3.1+dfsg/pypy/module/_cppyy/test/test_fragile.py --- pypy-7.1.1+dfsg/pypy/module/_cppyy/test/test_fragile.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_cppyy/test/test_fragile.py 2020-04-10 19:28:40.000000000 +0000 @@ -35,7 +35,7 @@ assert fragile.B == fragile.B assert fragile.B().check() == ord('B') - raises(AttributeError, getattr, fragile.B().gime_no_such(), "__cppdecl__") + assert not fragile.B().gime_no_such() assert fragile.C == fragile.C assert fragile.C().check() == ord('C') diff -Nru pypy-7.1.1+dfsg/pypy/module/_cppyy/test/test_regression.py pypy-7.3.1+dfsg/pypy/module/_cppyy/test/test_regression.py --- pypy-7.1.1+dfsg/pypy/module/_cppyy/test/test_regression.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_cppyy/test/test_regression.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,50 @@ +import py, os, sys +from .support import setup_make + +from pypy.module._cppyy import interp_cppyy, executor + + +class AppTestREGRESSION: + spaceconfig = dict(usemodules=['_cppyy', '_rawffi', 'itertools']) + + def setup_class(cls): + cls.w_example01 = cls.space.appexec([], """(): + import ctypes, _cppyy + _cppyy._post_import_startup()""") + + def test01_dir(self): + """These dir() methods used to crash.""" + + import _cppyy as cppyy + + cppyy.gbl.gInterpreter.Declare("namespace cppyy_regression_test { void iii() {}; }") + + assert not 'iii' in cppyy.gbl.cppyy_regression_test.__dict__ + assert not '__abstractmethods__' in dir(cppyy.gbl.cppyy_regression_test) + assert '__class__' in dir(cppyy.gbl.cppyy_regression_test) + assert 'iii' in dir(cppyy.gbl.cppyy_regression_test) + + assert not 'iii' in cppyy.gbl.cppyy_regression_test.__dict__ + assert cppyy.gbl.cppyy_regression_test.iii + assert 'iii' in cppyy.gbl.cppyy_regression_test.__dict__ + + def test02_default_template_arguments(self): + """Calling a templated method on a templated class with all defaults used to crash.""" + + import _cppyy as cppyy + + cppyy.gbl.gInterpreter.Declare(""" + template + class AllDefault { + public: + AllDefault(int val) : m_t(val) {} + template + int do_stuff() { return m_t+aap+noot; } + + public: + T m_t; + };""") + + a = cppyy.gbl.AllDefault[int](24) + a.m_t = 21; + assert a.do_stuff() == 24 diff -Nru pypy-7.1.1+dfsg/pypy/module/_cppyy/test/test_templates.py pypy-7.3.1+dfsg/pypy/module/_cppyy/test/test_templates.py --- pypy-7.1.1+dfsg/pypy/module/_cppyy/test/test_templates.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_cppyy/test/test_templates.py 2020-04-10 19:28:40.000000000 +0000 @@ -25,20 +25,35 @@ m = _cppyy.gbl.MyTemplatedMethodClass() + # implicit (called before other tests to check caching) + assert m.get_size(1) == m.get_int_size()+1 + assert 'get_size' in dir(_cppyy.gbl.MyTemplatedMethodClass) + # pre-instantiated assert m.get_size['char']() == m.get_char_size() assert m.get_size[int]() == m.get_int_size() # specialized - assert m.get_size[long]() == m.get_long_size() + if sys.hexversion >= 0x3000000: + targ = 'long' + else: + targ = long + assert m.get_size[targ]() == m.get_long_size() + + import ctypes + assert m.get_size(ctypes.c_double(3.14)) == m.get_size['double']() + assert m.get_size(ctypes.c_double(3.14).value) == m.get_size['double']()+1 # auto-instantiation assert m.get_size[float]() == m.get_float_size() assert m.get_size['double']() == m.get_double_size() assert m.get_size['MyTemplatedMethodClass']() == m.get_self_size() + assert 'get_size' in dir(_cppyy.gbl.MyTemplatedMethodClass) # auto through typedef assert m.get_size['MyTMCTypedef_t']() == m.get_self_size() + assert 'get_size' in dir(_cppyy.gbl.MyTemplatedMethodClass) + assert m.get_size['MyTemplatedMethodClass']() == m.get_self_size() def test02_non_type_template_args(self): """Use of non-types as template arguments""" @@ -90,15 +105,13 @@ assert type(ggsr(vector['int']([5])).m_retval) == float assert ggsr(vector['int']([5])).m_retval == 5. # float in, int out - # TODO: this now matches the earlier overload - #ggsr = cppyy.gbl.global_get_some_result['std::vector, int'] - #assert type(ggsr(vector['float']([0.3])).m_retval) == int - #assert ggsr(vector['float']([0.3])).m_retval == 0 + ggsr = cppyy.gbl.global_get_some_result['std::vector, int'] + assert type(ggsr(vector['float']([0.3])).m_retval) == int + assert ggsr(vector['float']([0.3])).m_retval == 0 # int in, int out - # TODO: same as above, matches earlier overload - #ggsr = cppyy.gbl.global_get_some_result['std::vector, int'] - #assert type(ggsr(vector['int']([5])).m_retval) == int - #assert ggsr(vector['int']([5])).m_retval == 5 + ggsr = cppyy.gbl.global_get_some_result['std::vector, int'] + assert type(ggsr(vector['int']([5])).m_retval) == int + assert ggsr(vector['int']([5])).m_retval == 5 def test04_variadic_function(self): """Call a variadic function""" diff -Nru pypy-7.1.1+dfsg/pypy/module/_cppyy/test/test_zjit.py pypy-7.3.1+dfsg/pypy/module/_cppyy/test/test_zjit.py --- pypy-7.1.1+dfsg/pypy/module/_cppyy/test/test_zjit.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_cppyy/test/test_zjit.py 2020-04-10 19:28:40.000000000 +0000 @@ -230,6 +230,9 @@ assert isinstance(w_obj, FakeString) return w_obj.val + def fsencode_w(self, w_obj): + return self.bytes_w(w_obj) + def text_w(self, w_obj): assert isinstance(w_obj, FakeString) return w_obj.val diff -Nru pypy-7.1.1+dfsg/pypy/module/cpyext/api.py pypy-7.3.1+dfsg/pypy/module/cpyext/api.py --- pypy-7.1.1+dfsg/pypy/module/cpyext/api.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/cpyext/api.py 2020-04-10 19:28:40.000000000 +0000 @@ -12,7 +12,7 @@ from rpython.rlib.objectmodel import we_are_translated, keepalive_until_here from rpython.rlib.objectmodel import dont_inline from rpython.rlib.rfile import (FILEP, c_fread, c_fclose, c_fwrite, - c_fdopen, c_fileno, + c_fdopen, c_fileno, c_ferror, c_fopen)# for tests from rpython.translator import cdir from rpython.translator.tool.cbuild import ExternalCompilationInfo @@ -34,7 +34,6 @@ from rpython.rlib.rposix import FdValidator from rpython.rlib.unroll import unrolling_iterable from rpython.rlib.objectmodel import specialize -from pypy.module import exceptions from pypy.module.exceptions import interp_exceptions from rpython.tool.sourcetools import func_with_new_name from rpython.rtyper.lltypesystem.lloperation import llop @@ -119,6 +118,11 @@ with FdValidator(c_fileno(fp)): return _feof(fp) +_ferror = rffi.llexternal('ferror', [FILEP], rffi.INT) +def ferror(fp): + with FdValidator(c_fileno(fp)): + return _ferror(fp) + pypy_decl = 'pypy_decl.h' udir.join(pypy_decl).write("/* Will be filled later */\n") udir.join('pypy_structmember_decl.h').write("/* Will be filled later */\n") @@ -209,19 +213,7 @@ # Handling of the GIL # ------------------- # -# We add a global variable 'cpyext_glob_tid' that contains a thread -# id. Invariant: this variable always contain 0 when the PyPy GIL is -# released. It should also contain 0 when regular RPython code -# executes. In non-cpyext-related code, it will thus always be 0. -# When cpyext-related C code runs, it contains the thread id (usually) -# or the value -1 (only for state.C.PyXxx() functions which are short- -# running and should not themselves release the GIL). -# -# **make_generic_cpy_call():** RPython to C, with the GIL held. Before -# the call, must assert that the global variable is 0 and set the -# current thread identifier into the global variable. After the call, -# assert that the global variable still contains the current thread id, -# and reset it to 0. +# **make_generic_cpy_call():** RPython to C, with the GIL held. # # **make_wrapper():** C to RPython; by default assume that the GIL is # held, but accepts gil="acquire", "release", "around", @@ -229,41 +221,30 @@ # # When a wrapper() is called: # -# * "acquire": assert that the GIL is not currently held, i.e. the -# global variable does not contain the current thread id (otherwise, -# deadlock!). Acquire the PyPy GIL. After we acquired it, assert -# that the global variable is 0 (it must be 0 according to the -# invariant that it was 0 immediately before we acquired the GIL, -# because the GIL was released at that point). +# * "acquire": assert that the GIL is not currently held (otherwise, +# deadlock!). Acquire the PyPy GIL. # -# * gil=None: we hold the GIL already. Assert that the current thread -# identifier is in the global variable, and replace it with 0. +# * gil=None: we should hold the GIL already. But check anyway, just +# in case. Do the acquire/release if it was not acquired before +# (workaround "_auto" case). # -# * "pygilstate_ensure": if the global variable contains the current -# thread id, replace it with 0 and set the extra arg to 0. Otherwise, +# * "pygilstate_ensure": if the GIL is already acquired, +# do nothing and set the extra arg to 0. Otherwise, # do the "acquire" and set the extra arg to 1. Then we'll call # pystate.py:PyGILState_Ensure() with this extra arg, which will do # the rest of the logic. # -# When a wrapper() returns, first assert that the global variable is -# still 0, and then: +# When a wrapper() returns: # -# * "release": release the PyPy GIL. The global variable was 0 up to -# and including at the point where we released the GIL, but afterwards -# it is possible that the GIL is acquired by a different thread very -# quickly. +# * "release": release the PyPy GIL. # -# * gil=None: we keep holding the GIL. Set the current thread -# identifier into the global variable. +# * gil=None: we keep holding the GIL in the normal case; we release it +# in the workaround "_auto" case. # # * "pygilstate_release": if the argument is PyGILState_UNLOCKED, -# release the PyPy GIL; otherwise, set the current thread identifier -# into the global variable. The rest of the logic of +# release the PyPy GIL; otherwise, no-op. The rest of the logic of # PyGILState_Release() should be done before, in pystate.py. -cpyext_glob_tid_ptr = lltype.malloc(rffi.CArray(lltype.Signed), 1, - flavor='raw', immortal=True, zero=True) - cpyext_namespace = NameManager('cpyext_') @@ -680,7 +661,8 @@ # PyExc_NameError, PyExc_MemoryError, PyExc_RuntimeError, # PyExc_UnicodeEncodeError, PyExc_UnicodeDecodeError, ... global all_exceptions - all_exceptions = list(exceptions.Module.interpleveldefs) + from pypy.module.exceptions.moduledef import Module as ExcModule + all_exceptions = list(ExcModule.interpleveldefs) for exc_name in all_exceptions: register_global('PyExc_' + exc_name, 'PyTypeObject*', @@ -944,10 +926,9 @@ pypy_debug_catch_fatal_exception() assert False -def _restore_gil_state(pygilstate_release, gilstate, gil_release, _gil_auto, tid): +def _restore_gil_state(pygilstate_release, gilstate, gil_release, _gil_auto): from rpython.rlib import rgil # see "Handling of the GIL" above - assert cpyext_glob_tid_ptr[0] == 0 if pygilstate_release: from pypy.module.cpyext import pystate unlock = (gilstate == pystate.PyGILState_UNLOCKED) @@ -955,8 +936,6 @@ unlock = gil_release or _gil_auto if unlock: rgil.release() - else: - cpyext_glob_tid_ptr[0] = tid def make_wrapper_second_level(space, argtypesw, restype, @@ -991,37 +970,34 @@ # inserted exactly here by the varargs specializer # see "Handling of the GIL" above (careful, we don't have the GIL here) - tid = rthread.get_or_make_ident() _gil_auto = False - if gil_auto_workaround and cpyext_glob_tid_ptr[0] != tid: - # replace '-1' with the real tid, now that we have the tid - if cpyext_glob_tid_ptr[0] == -1: - cpyext_glob_tid_ptr[0] = tid - else: - _gil_auto = True + if gil_auto_workaround and not rgil.am_I_holding_the_GIL(): + _gil_auto = True if _gil_auto or gil_acquire: - if cpyext_glob_tid_ptr[0] == tid: + if gil_acquire and rgil.am_I_holding_the_GIL(): deadlock_error(pname) rgil.acquire() - assert cpyext_glob_tid_ptr[0] == 0 + if gil_auto_workaround: + # while we're in workaround-land, detect when a regular PyXxx() + # function is invoked at .so load-time, e.g. by a C++ global + # variable with an initializer, and in this case make sure we + # initialize things. + space.fromcache(State).make_sure_cpyext_is_imported() elif pygilstate_ensure: - if cpyext_glob_tid_ptr[0] == tid: - cpyext_glob_tid_ptr[0] = 0 + if rgil.am_I_holding_the_GIL(): args += (pystate.PyGILState_LOCKED,) else: rgil.acquire() args += (pystate.PyGILState_UNLOCKED,) else: - if cpyext_glob_tid_ptr[0] != tid: + if not rgil.am_I_holding_the_GIL(): no_gil_error(pname) - cpyext_glob_tid_ptr[0] = 0 if pygilstate_release: gilstate = rffi.cast(lltype.Signed, args[-1]) else: gilstate = pystate.PyGILState_IGNORE - rffi.stackcounter.stacks_counter += 1 - llop.gc_stack_bottom(lltype.Void) # marker for trackgcroot.py + llop.gc_stack_bottom(lltype.Void) # marker to enter RPython from C retval = fatal_value boxed_args = () tb = None @@ -1093,14 +1069,13 @@ except Exception as e: unexpected_exception(pname, e, tb) - _restore_gil_state(pygilstate_release, gilstate, gil_release, _gil_auto, tid) + _restore_gil_state(pygilstate_release, gilstate, gil_release, _gil_auto) state.check_and_raise_exception(always=True) return fatal_value assert lltype.typeOf(retval) == restype - rffi.stackcounter.stacks_counter -= 1 - _restore_gil_state(pygilstate_release, gilstate, gil_release, _gil_auto, tid) + _restore_gil_state(pygilstate_release, gilstate, gil_release, _gil_auto) return retval wrapper_second_level._dont_inline_ = True @@ -1189,7 +1164,7 @@ '_PyPy_get_PyOS_InputHook', [], FUNCPTR, compilation_info=eci, _nowrapper=True) state.C.tuple_new = rffi.llexternal( - 'tuple_new', [PyTypeObjectPtr, PyObject, PyObject], PyObject, + '_PyPy_tuple_new', [PyTypeObjectPtr, PyObject, PyObject], PyObject, compilation_info=eci, _nowrapper=True) def init_function(func): @@ -1719,8 +1694,8 @@ def load_cpyext_module(space, name, path, dll, initptr): from rpython.rlib import rdynload - space.getbuiltinmodule("cpyext") # mandatory to init cpyext state = space.fromcache(State) + state.make_sure_cpyext_is_imported() w_mod = state.find_extension(name, path) if w_mod is not None: rdynload.dlclose(dll) @@ -1794,18 +1769,11 @@ boxed_args += (arg,) to_decref += (_pyobj,) - # see "Handling of the GIL" above - tid = rthread.get_ident() - assert cpyext_glob_tid_ptr[0] == 0 - cpyext_glob_tid_ptr[0] = tid - preexist_error = PyErr_Occurred(space) try: # Call the function result = call_external_function(func, *boxed_args) finally: - assert cpyext_glob_tid_ptr[0] == tid - cpyext_glob_tid_ptr[0] = 0 for i, ARG in unrolling_arg_types: # note that this loop is nicely unrolled statically by RPython _pyobj = to_decref[i] diff -Nru pypy-7.1.1+dfsg/pypy/module/cpyext/bufferobject.py pypy-7.3.1+dfsg/pypy/module/cpyext/bufferobject.py --- pypy-7.1.1+dfsg/pypy/module/cpyext/bufferobject.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/cpyext/bufferobject.py 2020-04-10 19:28:40.000000000 +0000 @@ -5,6 +5,7 @@ cpython_api, Py_ssize_t, cpython_struct, bootstrap_function, slot_function, PyObjectFields, PyObject) from pypy.module.cpyext.pyobject import make_typedescr, decref, make_ref +from pypy.module.cpyext.buffer import CBuffer from pypy.module.array.interp_array import ArrayBuffer from pypy.objspace.std.bufferobject import W_Buffer @@ -33,7 +34,7 @@ def buffer_attach(space, py_obj, w_obj, w_userdata=None): """ - Fills a newly allocated PyBufferObject with the given (str) buffer object. + Fills a newly allocated PyBufferObject with the given buffer object. """ py_buf = rffi.cast(PyBufferObject, py_obj) py_buf.c_b_offset = 0 @@ -60,7 +61,17 @@ py_buf.c_b_base = make_ref(space, w_base) py_buf.c_b_ptr = rffi.cast(rffi.VOIDP, buf.w_array._charbuf_start()) py_buf.c_b_size = buf.getlength() + elif isinstance(buf, CBuffer): + py_buf.c_b_base = make_ref(space, buf.view.w_obj) + py_buf.c_b_ptr = rffi.cast(rffi.VOIDP, buf.view.ptr) + py_buf.c_b_size = buf.getlength() else: + # Raising in attach will segfault. + # It would be nice if we could handle the error more gracefully + # with something like this + # py_buf.c_b_base = lltype.nullptr(PyObject.TO) + # py_buf.c_b_ptr = rffi.cast(rffi.VOIDP, 0) + # py_buf.c_b_size = buf.getlength() raise oefmt(space.w_NotImplementedError, "buffer flavor not supported") diff -Nru pypy-7.1.1+dfsg/pypy/module/cpyext/buffer.py pypy-7.3.1+dfsg/pypy/module/cpyext/buffer.py --- pypy-7.1.1+dfsg/pypy/module/cpyext/buffer.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/cpyext/buffer.py 2020-04-10 19:28:41.000000000 +0000 @@ -22,9 +22,8 @@ def getitem(self, index): return self.view.ptr[index] - def getslice(self, start, stop, step, size): + def getslice(self, start, step, size): assert step == 1 - assert stop - start == size ptr = rffi.ptradd(cts.cast('char *', self.view.ptr), start) return rffi.charpsize2str(ptr, size) diff -Nru pypy-7.1.1+dfsg/pypy/module/cpyext/cdatetime.py pypy-7.3.1+dfsg/pypy/module/cpyext/cdatetime.py --- pypy-7.1.1+dfsg/pypy/module/cpyext/cdatetime.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/cpyext/cdatetime.py 2020-04-10 19:28:41.000000000 +0000 @@ -67,6 +67,14 @@ _PyDelta_FromDelta.api_func.functype, _PyDelta_FromDelta.api_func.get_wrapper(space)) + datetimeAPI.c_DateTime_FromTimestamp = llhelper( + _PyDateTime_FromTimestamp.api_func.functype, + _PyDateTime_FromTimestamp.api_func.get_wrapper(space)) + + datetimeAPI.c_Date_FromTimestamp = llhelper( + _PyDate_FromTimestamp.api_func.functype, + _PyDate_FromTimestamp.api_func.get_wrapper(space)) + state.datetimeAPI.append(datetimeAPI) return state.datetimeAPI[0] @@ -243,8 +251,16 @@ """ w_datetime = PyImport_Import(space, space.newtext("datetime")) w_type = space.getattr(w_datetime, space.newtext("datetime")) + return _PyDateTime_FromTimestamp(space, w_type, w_args, None) + +@cpython_api([PyObject, PyObject, PyObject], PyObject) +def _PyDateTime_FromTimestamp(space, w_type, w_args, w_kwds): + """Implementation of datetime.fromtimestamp that matches the signature for + PyDateTimeCAPI.DateTime_FromTimestamp + """ w_method = space.getattr(w_type, space.newtext("fromtimestamp")) - return space.call(w_method, w_args) + + return space.call(w_method, w_args, w_kwds=w_kwds) @cpython_api([PyObject], PyObject) def PyDate_FromTimestamp(space, w_args): @@ -253,6 +269,12 @@ """ w_datetime = PyImport_Import(space, space.newtext("datetime")) w_type = space.getattr(w_datetime, space.newtext("date")) + return _PyDate_FromTimestamp(space, w_type, w_args) + +@cpython_api([PyObject, PyObject], PyObject) +def _PyDate_FromTimestamp(space, w_type, w_args): + """Implementation of date.fromtimestamp that matches the signature for + PyDateTimeCAPI.Date_FromTimestamp""" w_method = space.getattr(w_type, space.newtext("fromtimestamp")) return space.call(w_method, w_args) diff -Nru pypy-7.1.1+dfsg/pypy/module/cpyext/codecs.py pypy-7.3.1+dfsg/pypy/module/cpyext/codecs.py --- pypy-7.1.1+dfsg/pypy/module/cpyext/codecs.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/cpyext/codecs.py 2020-04-10 19:28:40.000000000 +0000 @@ -20,3 +20,12 @@ else: return space.call_method(w_codec, "incrementaldecoder") +@cpython_api([CONST_STRING], PyObject) +def PyCodec_Encoder(space, encoding): + w_codec = interp_codecs.lookup_codec(space, rffi.charp2str(encoding)) + return space.getitem(w_codec, space.newint(0)) + +@cpython_api([CONST_STRING], PyObject) +def PyCodec_Decoder(space, encoding): + w_codec = interp_codecs.lookup_codec(space, rffi.charp2str(encoding)) + return space.getitem(w_codec, space.newint(1)) diff -Nru pypy-7.1.1+dfsg/pypy/module/cpyext/cparser.py pypy-7.3.1+dfsg/pypy/module/cpyext/cparser.py --- pypy-7.1.1+dfsg/pypy/module/cpyext/cparser.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/cpyext/cparser.py 2020-04-10 19:28:40.000000000 +0000 @@ -705,6 +705,7 @@ self.struct_typedefs = {} self._handled = set() self._frozen = False + self._cdecl_type_cache = {} # {cdecl: TYPE} cache if includes is not None: for header in includes: self.include(header) @@ -840,6 +841,14 @@ raise NotImplementedError def gettype(self, cdecl): + try: + return self._cdecl_type_cache[cdecl] + except KeyError: + result = self._real_gettype(cdecl) + self._cdecl_type_cache[cdecl] = result + return result + + def _real_gettype(self, cdecl): obj = self.ctx.parse_type(cdecl) result = self.convert_type(obj) if isinstance(result, DelayedStruct): diff -Nru pypy-7.1.1+dfsg/pypy/module/cpyext/dictobject.py pypy-7.3.1+dfsg/pypy/module/cpyext/dictobject.py --- pypy-7.1.1+dfsg/pypy/module/cpyext/dictobject.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/cpyext/dictobject.py 2020-04-10 19:28:40.000000000 +0000 @@ -78,6 +78,16 @@ # *values* as full objects, which stay alive as long as the dict is # alive and not modified. So we can return a borrowed ref. # XXX this is wrong with IntMutableCell. Hope it works... + try: + return w_dict.getitem(w_key) + except OperationError: + return None + +@cpython_api([PyObject, PyObject], PyObject, result_borrowed=True) +def _PyDict_GetItemWithError(space, w_dict, w_key): + # Like PyDict_GetItem(), but doesn't swallow the error + if not isinstance(w_dict, W_DictMultiObject): + PyErr_BadInternalCall(space) return w_dict.getitem(w_key) @cpython_api([PyObject, PyObject, PyObject], rffi.INT_real, error=-1) @@ -174,7 +184,14 @@ """ override = rffi.cast(lltype.Signed, override) w_keys = space.call_method(w_b, "keys") - for w_key in space.iteriterable(w_keys): + w_iter = space.iter(w_keys) + while 1: + try: + w_key = space.next(w_iter) + except OperationError as e: + if not e.match(space, space.w_StopIteration): + raise + break if not _has_val(space, w_a, w_key) or override != 0: space.setitem(w_a, w_key, space.getitem(w_b, w_key)) return 0 @@ -257,14 +274,15 @@ if pos == 0: # Store the current keys in the PyDictObject. from pypy.objspace.std.listobject import W_ListObject - decref(space, py_dict.c__tmpkeys) w_keys = space.call_method(space.w_dict, "keys", w_dict) # w_keys must use the object strategy in order to keep the keys alive if not isinstance(w_keys, W_ListObject): return 0 # XXX should not call keys() above w_keys.switch_to_object_strategy() + oldkeys = py_dict.c__tmpkeys py_dict.c__tmpkeys = create_ref(space, w_keys) incref(space, py_dict.c__tmpkeys) + decref(space, oldkeys) else: if not py_dict.c__tmpkeys: # pos should have been 0, cannot fail so return 0 diff -Nru pypy-7.1.1+dfsg/pypy/module/cpyext/eval.py pypy-7.3.1+dfsg/pypy/module/cpyext/eval.py --- pypy-7.1.1+dfsg/pypy/module/cpyext/eval.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/cpyext/eval.py 2020-04-10 19:28:40.000000000 +0000 @@ -5,7 +5,7 @@ from rpython.rlib.rarithmetic import widen from pypy.module.cpyext.api import ( cpython_api, CANNOT_FAIL, CONST_STRING, FILEP, fread, feof, Py_ssize_tP, - cpython_struct) + cpython_struct, ferror) from pypy.module.cpyext.pyobject import PyObject from pypy.module.cpyext.pyerrors import PyErr_SetFromErrno from pypy.module.cpyext.funcobject import PyCodeObject @@ -171,6 +171,9 @@ count = rffi.cast(lltype.Signed, count) source += rffi.charpsize2str(buf.raw, count) if count < BUF_SIZE: + if ferror(fp): + PyErr_SetFromErrno(space, space.w_IOError) + return if feof(fp): break PyErr_SetFromErrno(space, space.w_IOError) diff -Nru pypy-7.1.1+dfsg/pypy/module/cpyext/include/dictobject.h pypy-7.3.1+dfsg/pypy/module/cpyext/include/dictobject.h --- pypy-7.1.1+dfsg/pypy/module/cpyext/include/dictobject.h 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/cpyext/include/dictobject.h 2020-04-10 19:28:40.000000000 +0000 @@ -13,8 +13,8 @@ } PyDictObject; #define PyDict_Check(op) \ - PyType_FastSubclass((op)->ob_type, Py_TPFLAGS_DICT_SUBCLASS) -#define PyDict_CheckExact(op) ((op)->ob_type == &PyDict_Type) + PyType_FastSubclass(Py_TYPE(op), Py_TPFLAGS_DICT_SUBCLASS) +#define PyDict_CheckExact(op) (Py_TYPE(op) == &PyDict_Type) #ifdef __cplusplus } diff -Nru pypy-7.1.1+dfsg/pypy/module/cpyext/include/floatobject.h pypy-7.3.1+dfsg/pypy/module/cpyext/include/floatobject.h --- pypy-7.1.1+dfsg/pypy/module/cpyext/include/floatobject.h 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/cpyext/include/floatobject.h 2020-04-10 19:28:40.000000000 +0000 @@ -33,8 +33,8 @@ } while(0) #define PyFloat_Check(op) \ - _PyPy_Type_FastSubclass((op)->ob_type, Py_TPPYPYFLAGS_FLOAT_SUBCLASS) -#define PyFloat_CheckExact(op) ((op)->ob_type == &PyFloat_Type) + _PyPy_Type_FastSubclass(Py_TYPE(op), Py_TPPYPYFLAGS_FLOAT_SUBCLASS) +#define PyFloat_CheckExact(op) (Py_TYPE(op) == &PyFloat_Type) #ifdef __cplusplus diff -Nru pypy-7.1.1+dfsg/pypy/module/cpyext/include/listobject.h pypy-7.3.1+dfsg/pypy/module/cpyext/include/listobject.h --- pypy-7.1.1+dfsg/pypy/module/cpyext/include/listobject.h 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/cpyext/include/listobject.h 2020-04-10 19:28:40.000000000 +0000 @@ -1,4 +1,4 @@ /* empty */ #define PyList_Check(op) \ - PyType_FastSubclass((op)->ob_type, Py_TPFLAGS_LIST_SUBCLASS) -#define PyList_CheckExact(op) ((op)->ob_type == &PyList_Type) + PyType_FastSubclass(Py_TYPE(op), Py_TPFLAGS_LIST_SUBCLASS) +#define PyList_CheckExact(op) (Py_TYPE(op) == &PyList_Type) diff -Nru pypy-7.1.1+dfsg/pypy/module/cpyext/include/longobject.h pypy-7.3.1+dfsg/pypy/module/cpyext/include/longobject.h --- pypy-7.1.1+dfsg/pypy/module/cpyext/include/longobject.h 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/cpyext/include/longobject.h 2020-04-10 19:28:40.000000000 +0000 @@ -15,8 +15,8 @@ #define PyOS_strtoul strtoul #define PyOS_strtol strtoul #define PyLong_Check(op) \ - PyType_FastSubclass((op)->ob_type, Py_TPFLAGS_LONG_SUBCLASS) -#define PyLong_CheckExact(op) ((op)->ob_type == &PyLong_Type) + PyType_FastSubclass(Py_TYPE(op), Py_TPFLAGS_LONG_SUBCLASS) +#define PyLong_CheckExact(op) (Py_TYPE(op) == &PyLong_Type) #define _PyLong_AsByteArray(v, bytes, n, little_endian, is_signed) \ _PyLong_AsByteArrayO((PyObject *)(v), bytes, n, little_endian, is_signed) diff -Nru pypy-7.1.1+dfsg/pypy/module/cpyext/include/object.h pypy-7.3.1+dfsg/pypy/module/cpyext/include/object.h --- pypy-7.1.1+dfsg/pypy/module/cpyext/include/object.h 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/cpyext/include/object.h 2020-04-10 19:28:40.000000000 +0000 @@ -391,6 +391,16 @@ PyAPI_FUNC(PyVarObject *) PyObject_InitVar(PyVarObject *, PyTypeObject *, Py_ssize_t); +/* + * On CPython with Py_REF_DEBUG these use _PyRefTotal, _Py_NegativeRefcount, + * _Py_GetRefTotal, ... + * So far we ignore Py_REF_DEBUG + */ + +#define _Py_INC_REFTOTAL +#define _Py_DEC_REFTOTAL +#define _Py_REF_DEBUG_COMMA +#define _Py_CHECK_REFCNT(OP) /* a semicolon */; /* PyPy internal ----------------------------------- */ PyAPI_FUNC(int) PyPyType_Register(PyTypeObject *); diff -Nru pypy-7.1.1+dfsg/pypy/module/cpyext/include/patchlevel.h pypy-7.3.1+dfsg/pypy/module/cpyext/include/patchlevel.h --- pypy-7.1.1+dfsg/pypy/module/cpyext/include/patchlevel.h 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/cpyext/include/patchlevel.h 2020-04-10 19:28:42.000000000 +0000 @@ -32,8 +32,8 @@ * module/sys/version.py * doc/conf.py */ -#define PYPY_VERSION "7.1.1" -#define PYPY_VERSION_NUM 0x07010100 +#define PYPY_VERSION "7.3.1" +#define PYPY_VERSION_NUM 0x07030100 /* Defined to mean a PyPy where cpyext holds more regular references to PyObjects, e.g. staying alive as long as the internal PyPy object stays alive. */ diff -Nru pypy-7.1.1+dfsg/pypy/module/cpyext/include/pyport.h pypy-7.3.1+dfsg/pypy/module/cpyext/include/pyport.h --- pypy-7.1.1+dfsg/pypy/module/cpyext/include/pyport.h 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/cpyext/include/pyport.h 2020-04-10 19:28:40.000000000 +0000 @@ -28,20 +28,56 @@ #endif #endif /* HAVE_LONG_LONG */ -/* Largest possible value of size_t. - SIZE_MAX is part of C99, so it might be defined on some - platforms. If it is not defined, (size_t)-1 is a portable - definition for C89, due to the way signed->unsigned - conversion is defined. */ -#ifdef SIZE_MAX -#define PY_SIZE_MAX SIZE_MAX -#else -#define PY_SIZE_MAX ((size_t)-1) +/* a build with 30-bit digits for Python long integers needs an exact-width + * 32-bit unsigned integer type to store those digits. (We could just use + * type 'unsigned long', but that would be wasteful on a system where longs + * are 64-bits.) On Unix systems, the autoconf macro AC_TYPE_UINT32_T defines + * uint32_t to be such a type unless stdint.h or inttypes.h defines uint32_t. + * However, it doesn't set HAVE_UINT32_T, so we do that here. + */ +#ifdef uint32_t +#define HAVE_UINT32_T 1 #endif -/* CPython needs this for the c-extension datetime, which is pure python on PyPy - downstream packages assume it is here (Pandas for instance) */ -#include +#ifdef HAVE_UINT32_T +#ifndef PY_UINT32_T +#define PY_UINT32_T uint32_t +#endif +#endif + +/* Macros for a 64-bit unsigned integer type; used for type 'twodigits' in the + * long integer implementation, when 30-bit digits are enabled. + */ +#ifdef uint64_t +#define HAVE_UINT64_T 1 +#endif + +#ifdef HAVE_UINT64_T +#ifndef PY_UINT64_T +#define PY_UINT64_T uint64_t +#endif +#endif + +/* Signed variants of the above */ +#ifdef int32_t +#define HAVE_INT32_T 1 +#endif + +#ifdef HAVE_INT32_T +#ifndef PY_INT32_T +#define PY_INT32_T int32_t +#endif +#endif + +#ifdef int64_t +#define HAVE_INT64_T 1 +#endif + +#ifdef HAVE_INT64_T +#ifndef PY_INT64_T +#define PY_INT64_T int64_t +#endif +#endif /* uintptr_t is the C9X name for an unsigned integral type such that a * legitimate void* can be cast to uintptr_t and then back to void* again @@ -49,25 +85,39 @@ * integral type. */ #ifdef HAVE_UINTPTR_T -typedef uintptr_t Py_uintptr_t; -typedef intptr_t Py_intptr_t; +typedef uintptr_t Py_uintptr_t; +typedef intptr_t Py_intptr_t; #elif SIZEOF_VOID_P <= SIZEOF_INT typedef unsigned int Py_uintptr_t; -typedef int Py_intptr_t; +typedef int Py_intptr_t; #elif SIZEOF_VOID_P <= SIZEOF_LONG typedef unsigned long Py_uintptr_t; -typedef long Py_intptr_t; +typedef long Py_intptr_t; #elif defined(HAVE_LONG_LONG) && (SIZEOF_VOID_P <= SIZEOF_LONG_LONG) typedef unsigned PY_LONG_LONG Py_uintptr_t; -typedef PY_LONG_LONG Py_intptr_t; +typedef PY_LONG_LONG Py_intptr_t; #else # error "Python needs a typedef for Py_uintptr_t in pyport.h." #endif /* HAVE_UINTPTR_T */ +/* Largest possible value of size_t. + SIZE_MAX is part of C99, so it might be defined on some + platforms. If it is not defined, (size_t)-1 is a portable + definition for C89, due to the way signed->unsigned + conversion is defined. */ +#ifdef SIZE_MAX +#define PY_SIZE_MAX SIZE_MAX +#else +#define PY_SIZE_MAX ((size_t)-1) +#endif + +/* CPython needs this for the c-extension datetime, which is pure python on PyPy + downstream packages assume it is here (Pandas for instance) */ +#include /******************************* * stat() and fstat() fiddling * @@ -130,6 +180,13 @@ #define Py_ALIGNED(x) #endif +/* Eliminate end-of-loop code not reached warnings from SunPro C + * when using do{...}while(0) macros + */ +#ifdef __SUNPRO_C +#pragma error_messages (off,E_END_OF_LOOP_CODE_NOT_REACHED) +#endif + /* * Older Microsoft compilers don't support the C99 long long literal suffixes, * so these will be defined in PC/pyconfig.h for those compilers. diff -Nru pypy-7.1.1+dfsg/pypy/module/cpyext/include/Python.h pypy-7.3.1+dfsg/pypy/module/cpyext/include/Python.h --- pypy-7.1.1+dfsg/pypy/module/cpyext/include/Python.h 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/cpyext/include/Python.h 2020-04-10 19:28:40.000000000 +0000 @@ -107,6 +107,7 @@ #include "descrobject.h" #include "tupleobject.h" #include "dictobject.h" +#include "setobject.h" #include "intobject.h" #include "listobject.h" #include "longobject.h" diff -Nru pypy-7.1.1+dfsg/pypy/module/cpyext/include/setobject.h pypy-7.3.1+dfsg/pypy/module/cpyext/include/setobject.h --- pypy-7.1.1+dfsg/pypy/module/cpyext/include/setobject.h 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/cpyext/include/setobject.h 2020-04-10 19:28:41.000000000 +0000 @@ -0,0 +1,19 @@ + +/* set object interface */ + +#ifndef Py_SETOBJECT_H +#define Py_SETOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct { + PyObject_HEAD + PyObject *_tmplist; /* a private place to put values during _PySet_Next */ +} PySetObject; + +#ifdef __cplusplus +} +#endif +#endif /* !Py_SETOBJECT_H */ + diff -Nru pypy-7.1.1+dfsg/pypy/module/cpyext/include/sliceobject.h pypy-7.3.1+dfsg/pypy/module/cpyext/include/sliceobject.h --- pypy-7.1.1+dfsg/pypy/module/cpyext/include/sliceobject.h 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/cpyext/include/sliceobject.h 2020-04-10 19:28:40.000000000 +0000 @@ -17,7 +17,7 @@ PyObject *step; } PySliceObject; -#define PySlice_Check(op) ((op)->ob_type == &PySlice_Type) +#define PySlice_Check(op) (Py_TYPE(op) == &PySlice_Type) #ifdef __cplusplus } diff -Nru pypy-7.1.1+dfsg/pypy/module/cpyext/include/tupleobject.h pypy-7.3.1+dfsg/pypy/module/cpyext/include/tupleobject.h --- pypy-7.1.1+dfsg/pypy/module/cpyext/include/tupleobject.h 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/cpyext/include/tupleobject.h 2020-04-10 19:28:40.000000000 +0000 @@ -18,7 +18,7 @@ PyAPI_FUNC(PyObject *) PyTuple_New(Py_ssize_t size); PyAPI_FUNC(void) _PyPy_tuple_dealloc(PyObject *); -PyAPI_FUNC(PyObject *) tuple_new(PyTypeObject *type, PyObject *args, PyObject *kwds); +PyAPI_FUNC(PyObject *) _PyPy_tuple_new(PyTypeObject *type, PyObject *args, PyObject *kwds); /* defined in varargswrapper.c */ PyAPI_FUNC(PyObject *) PyTuple_Pack(Py_ssize_t, ...); @@ -32,8 +32,8 @@ #define PyTuple_SET_ITEM(op, i, v) (((PyTupleObject *)(op))->ob_item[i] = v) #define PyTuple_Check(op) \ - PyType_FastSubclass((op)->ob_type, Py_TPFLAGS_TUPLE_SUBCLASS) -#define PyTuple_CheckExact(op) ((op)->ob_type == &PyTuple_Type) + PyType_FastSubclass(Py_TYPE(op), Py_TPFLAGS_TUPLE_SUBCLASS) +#define PyTuple_CheckExact(op) (Py_TYPE(op) == &PyTuple_Type) #ifdef __cplusplus } diff -Nru pypy-7.1.1+dfsg/pypy/module/cpyext/include/unicodeobject.h pypy-7.3.1+dfsg/pypy/module/cpyext/include/unicodeobject.h --- pypy-7.1.1+dfsg/pypy/module/cpyext/include/unicodeobject.h 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/cpyext/include/unicodeobject.h 2020-04-10 19:28:41.000000000 +0000 @@ -11,8 +11,8 @@ PyAPI_FUNC(PyObject *) PyUnicode_FromFormat(const char *format, ...); #define PyUnicode_Check(op) \ - PyType_FastSubclass((op)->ob_type, Py_TPFLAGS_UNICODE_SUBCLASS) -#define PyUnicode_CheckExact(op) ((op)->ob_type == &PyUnicode_Type) + PyType_FastSubclass(Py_TYPE(op), Py_TPFLAGS_UNICODE_SUBCLASS) +#define PyUnicode_CheckExact(op) (Py_TYPE(op) == &PyUnicode_Type) #ifdef __cplusplus } diff -Nru pypy-7.1.1+dfsg/pypy/module/cpyext/__init__.py pypy-7.3.1+dfsg/pypy/module/cpyext/__init__.py --- pypy-7.1.1+dfsg/pypy/module/cpyext/__init__.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/cpyext/__init__.py 2020-04-10 19:28:40.000000000 +0000 @@ -1,83 +0,0 @@ -from pypy.interpreter.mixedmodule import MixedModule -from pypy.module.cpyext.state import State -from pypy.module.cpyext import api - -class Module(MixedModule): - interpleveldefs = { - 'load_module': 'api.load_extension_module', - 'is_cpyext_function': 'interp_cpyext.is_cpyext_function', - } - - appleveldefs = { - } - - atexit_funcs = [] - - def startup(self, space): - space.fromcache(State).startup(space) - method = pypy.module.cpyext.typeobject.get_new_method_def(space) - # the w_self argument here is a dummy, the only thing done with w_obj - # is call type() on it - w_obj = pypy.module.cpyext.methodobject.W_PyCFunctionObject(space, - method, space.w_None) - space.appexec([w_obj], """(meth): - from pickle import Pickler - Pickler.dispatch[type(meth)] = Pickler.save_global - """) - - def register_atexit(self, function): - if len(self.atexit_funcs) >= 32: - raise ValueError("cannot register more than 32 atexit functions") - self.atexit_funcs.append(function) - - def shutdown(self, space): - for func in self.atexit_funcs: - func() - - -# import these modules to register api functions by side-effect -import pypy.module.cpyext.pyobject -import pypy.module.cpyext.boolobject -import pypy.module.cpyext.floatobject -import pypy.module.cpyext.modsupport -import pypy.module.cpyext.pythonrun -import pypy.module.cpyext.pyerrors -import pypy.module.cpyext.typeobject -import pypy.module.cpyext.object -import pypy.module.cpyext.bytesobject -import pypy.module.cpyext.bytearrayobject -import pypy.module.cpyext.tupleobject -import pypy.module.cpyext.setobject -import pypy.module.cpyext.dictobject -import pypy.module.cpyext.intobject -import pypy.module.cpyext.longobject -import pypy.module.cpyext.listobject -import pypy.module.cpyext.sequence -import pypy.module.cpyext.buffer -import pypy.module.cpyext.bufferobject -import pypy.module.cpyext.eval -import pypy.module.cpyext.import_ -import pypy.module.cpyext.mapping -import pypy.module.cpyext.iterator -import pypy.module.cpyext.unicodeobject -import pypy.module.cpyext.sysmodule -import pypy.module.cpyext.number -import pypy.module.cpyext.sliceobject -import pypy.module.cpyext.stubsactive -import pypy.module.cpyext.pystate -import pypy.module.cpyext.cdatetime -import pypy.module.cpyext.complexobject -import pypy.module.cpyext.weakrefobject -import pypy.module.cpyext.funcobject -import pypy.module.cpyext.frameobject -import pypy.module.cpyext.classobject -import pypy.module.cpyext.memoryobject -import pypy.module.cpyext.codecs -import pypy.module.cpyext.pyfile -import pypy.module.cpyext.pystrtod -import pypy.module.cpyext.pytraceback -import pypy.module.cpyext.methodobject -import pypy.module.cpyext.marshal - -# now that all rffi_platform.Struct types are registered, configure them -api.configure_types() diff -Nru pypy-7.1.1+dfsg/pypy/module/cpyext/moduledef.py pypy-7.3.1+dfsg/pypy/module/cpyext/moduledef.py --- pypy-7.1.1+dfsg/pypy/module/cpyext/moduledef.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/cpyext/moduledef.py 2020-04-10 19:28:41.000000000 +0000 @@ -0,0 +1,75 @@ +from pypy.interpreter.mixedmodule import MixedModule +from pypy.module.cpyext.state import State +from pypy.module.cpyext import api + +class Module(MixedModule): + interpleveldefs = { + 'load_module': 'api.load_extension_module', + 'is_cpyext_function': 'interp_cpyext.is_cpyext_function', + 'FunctionType': 'methodobject.W_PyCFunctionObject', + } + + appleveldefs = { + } + + atexit_funcs = [] + + def startup(self, space): + space.fromcache(State).startup(space) + + def register_atexit(self, function): + if len(self.atexit_funcs) >= 32: + raise ValueError("cannot register more than 32 atexit functions") + self.atexit_funcs.append(function) + + def shutdown(self, space): + for func in self.atexit_funcs: + func() + + +# import these modules to register api functions by side-effect +import pypy.module.cpyext.pyobject +import pypy.module.cpyext.boolobject +import pypy.module.cpyext.floatobject +import pypy.module.cpyext.modsupport +import pypy.module.cpyext.pythonrun +import pypy.module.cpyext.pyerrors +import pypy.module.cpyext.typeobject +import pypy.module.cpyext.object +import pypy.module.cpyext.bytesobject +import pypy.module.cpyext.bytearrayobject +import pypy.module.cpyext.tupleobject +import pypy.module.cpyext.setobject +import pypy.module.cpyext.dictobject +import pypy.module.cpyext.intobject +import pypy.module.cpyext.longobject +import pypy.module.cpyext.listobject +import pypy.module.cpyext.sequence +import pypy.module.cpyext.buffer +import pypy.module.cpyext.bufferobject +import pypy.module.cpyext.eval +import pypy.module.cpyext.import_ +import pypy.module.cpyext.mapping +import pypy.module.cpyext.iterator +import pypy.module.cpyext.unicodeobject +import pypy.module.cpyext.sysmodule +import pypy.module.cpyext.number +import pypy.module.cpyext.sliceobject +import pypy.module.cpyext.stubsactive +import pypy.module.cpyext.pystate +import pypy.module.cpyext.cdatetime +import pypy.module.cpyext.complexobject +import pypy.module.cpyext.weakrefobject +import pypy.module.cpyext.funcobject +import pypy.module.cpyext.frameobject +import pypy.module.cpyext.classobject +import pypy.module.cpyext.memoryobject +import pypy.module.cpyext.codecs +import pypy.module.cpyext.pyfile +import pypy.module.cpyext.pystrtod +import pypy.module.cpyext.pytraceback +import pypy.module.cpyext.methodobject +import pypy.module.cpyext.marshal + +# now that all rffi_platform.Struct types are registered, configure them +api.configure_types() diff -Nru pypy-7.1.1+dfsg/pypy/module/cpyext/object.py pypy-7.3.1+dfsg/pypy/module/cpyext/object.py --- pypy-7.1.1+dfsg/pypy/module/cpyext/object.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/cpyext/object.py 2020-04-10 19:28:40.000000000 +0000 @@ -7,7 +7,6 @@ from pypy.module.cpyext.pyobject import ( PyObject, PyObjectP, from_ref, incref, decref, get_typedescr, hack_for_result_often_existing_obj) -from pypy.module.cpyext.typeobject import PyTypeObjectPtr from pypy.module.cpyext.pyerrors import PyErr_NoMemory, PyErr_BadInternalCall from pypy.objspace.std.typeobject import W_TypeObject from pypy.interpreter.error import OperationError, oefmt @@ -360,11 +359,11 @@ """ Compute and return the hash value of an object o. On failure, return -1. This is the equivalent of the Python expression hash(o).""" - return space.int_w(space.hash(w_obj)) + return space.hash_w(w_obj) @cpython_api([rffi.DOUBLE], rffi.LONG, error=-1) def _Py_HashDouble(space, v): - return space.int_w(space.hash(space.newfloat(v))) + return space.hash_w(space.newfloat(v)) @cpython_api([PyObject], lltype.Signed, error=-1) def PyObject_HashNotImplemented(space, o): diff -Nru pypy-7.1.1+dfsg/pypy/module/cpyext/parse/cpyext_datetime.h pypy-7.3.1+dfsg/pypy/module/cpyext/parse/cpyext_datetime.h --- pypy-7.1.1+dfsg/pypy/module/cpyext/parse/cpyext_datetime.h 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/cpyext/parse/cpyext_datetime.h 2020-04-10 19:28:41.000000000 +0000 @@ -13,6 +13,10 @@ PyObject*, PyTypeObject*); PyObject *(*Time_FromTime)(int, int, int, int, PyObject*, PyTypeObject*); PyObject *(*Delta_FromDelta)(int, int, int, int, PyTypeObject*); + + /* constructors for the DB API */ + PyObject *(*DateTime_FromTimestamp)(PyObject*, PyObject*, PyObject*); + PyObject *(*Date_FromTimestamp)(PyObject*, PyObject*); } PyDateTime_CAPI; typedef struct diff -Nru pypy-7.1.1+dfsg/pypy/module/cpyext/parse/cpyext_object.h pypy-7.3.1+dfsg/pypy/module/cpyext/parse/cpyext_object.h --- pypy-7.1.1+dfsg/pypy/module/cpyext/parse/cpyext_object.h 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/cpyext/parse/cpyext_object.h 2020-04-10 19:28:40.000000000 +0000 @@ -1,6 +1,6 @@ #pragma once -typedef long Py_ssize_t; +typedef long Py_ssize_t; /* CPython defines it in pyport.h */ #define PyObject_HEAD \ Py_ssize_t ob_refcnt; \ diff -Nru pypy-7.1.1+dfsg/pypy/module/cpyext/pyerrors.py pypy-7.3.1+dfsg/pypy/module/cpyext/pyerrors.py --- pypy-7.1.1+dfsg/pypy/module/cpyext/pyerrors.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/cpyext/pyerrors.py 2020-04-10 19:28:40.000000000 +0000 @@ -84,11 +84,11 @@ w_type = get_w_obj_and_decref(space, py_type) w_value = get_w_obj_and_decref(space, py_value) w_traceback = get_w_obj_and_decref(space, py_traceback) - # XXX do something with w_traceback + if w_type is None: state.clear_exception() return - state.set_exception(OperationError(w_type, w_value)) + state.set_exception(OperationError(w_type, w_value, w_traceback)) @cpython_api([PyObjectP, PyObjectP, PyObjectP], lltype.Void) def PyErr_NormalizeException(space, exc_p, val_p, tb_p): diff -Nru pypy-7.1.1+dfsg/pypy/module/cpyext/pythonrun.py pypy-7.3.1+dfsg/pypy/module/cpyext/pythonrun.py --- pypy-7.1.1+dfsg/pypy/module/cpyext/pythonrun.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/cpyext/pythonrun.py 2020-04-10 19:28:41.000000000 +0000 @@ -38,9 +38,9 @@ called at most once. Since Python's internal finalization will have completed before the cleanup function, no Python APIs should be called by func.""" - from pypy.module import cpyext + from pypy.module.cpyext.moduledef import Module w_module = space.getbuiltinmodule('cpyext') - module = space.interp_w(cpyext.Module, w_module) + module = space.interp_w(Module, w_module) try: module.register_atexit(func_ptr) except ValueError: diff -Nru pypy-7.1.1+dfsg/pypy/module/cpyext/setobject.py pypy-7.3.1+dfsg/pypy/module/cpyext/setobject.py --- pypy-7.1.1+dfsg/pypy/module/cpyext/setobject.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/cpyext/setobject.py 2020-04-10 19:28:40.000000000 +0000 @@ -1,12 +1,45 @@ from pypy.interpreter.error import OperationError, oefmt from rpython.rtyper.lltypesystem import rffi, lltype -from pypy.module.cpyext.api import (cpython_api, Py_ssize_t, CANNOT_FAIL, - build_type_checkers) +from pypy.module.cpyext.api import ( + cpython_api, Py_ssize_t, Py_ssize_tP, CANNOT_FAIL, build_type_checkers, + PyObjectFields, cpython_struct, bootstrap_function, slot_function) from pypy.module.cpyext.pyobject import (PyObject, PyObjectP, - make_ref, from_ref) + make_ref, from_ref, as_pyobj, create_ref, make_typedescr, incref, decref) +from pypy.module.cpyext.object import _dealloc from pypy.module.cpyext.pyerrors import PyErr_BadInternalCall from pypy.objspace.std.setobject import W_SetObject, W_FrozensetObject, newset +PySetObjectStruct = lltype.ForwardReference() +PySetObject = lltype.Ptr(PySetObjectStruct) +PySetObjectFields = PyObjectFields + \ + (("_tmplist", PyObject),) +cpython_struct("PySetObject", PySetObjectFields, PySetObjectStruct) + +@bootstrap_function +def init_setobject(space): + "Type description of PySetObject" + make_typedescr(space.w_set.layout.typedef, + basestruct=PySetObject.TO, + attach=set_attach, + dealloc=set_dealloc) + make_typedescr(space.w_frozenset.layout.typedef, # same as 'set' + basestruct=PySetObject.TO, + attach=set_attach, + dealloc=set_dealloc) + +def set_attach(space, py_obj, w_obj, w_userdata=None): + """ + Fills a newly allocated PySetObject with the given set object. + """ + py_set = rffi.cast(PySetObject, py_obj) + py_set.c__tmplist = lltype.nullptr(PyObject.TO) + +@slot_function([PyObject], lltype.Void) +def set_dealloc(space, py_obj): + py_set = rffi.cast(PySetObject, py_obj) + decref(space, py_set.c__tmplist) + py_set.c__tmplist = lltype.nullptr(PyObject.TO) + _dealloc(space, py_obj) PySet_Check, PySet_CheckExact = build_type_checkers("Set") PyFrozenSet_Check, PyFrozenSet_CheckExact = build_type_checkers("FrozenSet") @@ -23,7 +56,7 @@ """Return true if obj is a set object or a frozenset object but not an instance of a subtype.""" w_obj_type = space.type(w_obj) - return (space.is_w(w_obj_type, space.gettypefor(W_SetObject)) or + return (space.is_w(w_obj_type, space.gettypefor(W_SetObject)) or space.is_w(w_obj_type, space.gettypefor(W_FrozensetObject))) @cpython_api([PyObject], PyObject) @@ -126,4 +159,43 @@ else: return space.call_function(space.w_frozenset, w_iterable) +@cpython_api([PyObject, Py_ssize_tP, PyObjectP, Py_ssize_tP], rffi.INT_real, error=-1) +def _PySet_NextEntry(space, w_set, ppos, pkey, phash): + if w_set is None or not PyAnySet_Check(space, w_set): + PyErr_BadInternalCall(space) + return -1 + if not pkey: + PyErr_BadInternalCall(space) + return -1 + pos = ppos[0] + py_obj = as_pyobj(space, w_set) + py_set = rffi.cast(PySetObject, py_obj) + if pos == 0: + # Store the current item list in the PySetObject. + # w_keys must use the object strategy in order to keep the keys alive + w_keys = space.newlist(space.listview(w_set)) + w_keys.switch_to_object_strategy() + oldlist = py_set.c__tmplist + py_set.c__tmplist = create_ref(space, w_keys) + incref(space, py_set.c__tmplist) + decref(space, oldlist) + else: + if not py_set.c__tmplist: + # pos should have been 0, cannot fail so return 0 + return 0; + w_keys = from_ref(space, py_set.c__tmplist) + ppos[0] += 1 + if pos >= space.len_w(w_keys): + decref(space, py_set.c__tmplist) + py_set.c__tmplist = lltype.nullptr(PyObject.TO) + return 0 + w_key = space.listview(w_keys)[pos] + pkey[0] = as_pyobj(space, w_key) + if phash: + phash[0] = space.hash_w(w_key) + return 1 +@cpython_api([PyObject, Py_ssize_tP, PyObjectP], rffi.INT_real, error=-1) +def _PySet_Next(space, w_set, ppos, pkey): + null = lltype.nullptr(Py_ssize_tP.TO) + return _PySet_NextEntry(space, w_set, ppos, pkey, null) diff -Nru pypy-7.1.1+dfsg/pypy/module/cpyext/sliceobject.py pypy-7.3.1+dfsg/pypy/module/cpyext/sliceobject.py --- pypy-7.1.1+dfsg/pypy/module/cpyext/sliceobject.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/cpyext/sliceobject.py 2020-04-10 19:28:41.000000000 +0000 @@ -75,7 +75,7 @@ Returns 0 on success and -1 on error with exception set.""" if not isinstance(w_slice, W_SliceObject): - PyErr_BadInternalCall(space) + raise PyErr_BadInternalCall(space) start_p[0], stop_p[0], step_p[0], slicelength_p[0] = \ w_slice.indices4(space, length) return 0 @@ -96,7 +96,7 @@ incorporate the source of PySlice_GetIndicesEx(), suitably renamed, in the source of your extension.""" if not isinstance(w_slice, W_SliceObject): - PyErr_BadInternalCall(space) + raise PyErr_BadInternalCall(space) start_p[0], stop_p[0], step_p[0] = \ w_slice.indices3(space, length) return 0 diff -Nru pypy-7.1.1+dfsg/pypy/module/cpyext/slotdefs.py pypy-7.3.1+dfsg/pypy/module/cpyext/slotdefs.py --- pypy-7.1.1+dfsg/pypy/module/cpyext/slotdefs.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/cpyext/slotdefs.py 2020-04-10 19:28:40.000000000 +0000 @@ -861,8 +861,7 @@ return 0 return buff_w -missing_wrappers = ['wrap_indexargfunc', 'wrap_delslice', 'wrap_coercefunc'] -for name in missing_wrappers: +def _make_missing_wrapper(name): assert name not in globals() class missing_wrapper(W_PyCWrapperObject): def call(self, space, w_self, __args__): @@ -871,6 +870,10 @@ missing_wrapper.__name__ = name globals()[name] = missing_wrapper +missing_wrappers = ['wrap_indexargfunc', 'wrap_delslice', 'wrap_coercefunc'] +for name in missing_wrappers: + _make_missing_wrapper(name) + def make_missing_slot(space, typedef, name, attr): return None diff -Nru pypy-7.1.1+dfsg/pypy/module/cpyext/src/tupleobject.c pypy-7.3.1+dfsg/pypy/module/cpyext/src/tupleobject.c --- pypy-7.1.1+dfsg/pypy/module/cpyext/src/tupleobject.c 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/cpyext/src/tupleobject.c 2020-04-10 19:28:41.000000000 +0000 @@ -94,7 +94,7 @@ tuple_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds); PyObject * -tuple_new(PyTypeObject *type, PyObject *args, PyObject *kwds) +_PyPy_tuple_new(PyTypeObject *type, PyObject *args, PyObject *kwds) { PyObject *arg = NULL; static char *kwlist[] = {"sequence", 0}; @@ -117,7 +117,7 @@ Py_ssize_t i, n; assert(PyType_IsSubtype(type, &PyTuple_Type)); - tmp = tuple_new(&PyTuple_Type, args, kwds); + tmp = _PyPy_tuple_new(&PyTuple_Type, args, kwds); if (tmp == NULL) return NULL; assert(PyTuple_Check(tmp)); diff -Nru pypy-7.1.1+dfsg/pypy/module/cpyext/state.py pypy-7.3.1+dfsg/pypy/module/cpyext/state.py --- pypy-7.1.1+dfsg/pypy/module/cpyext/state.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/cpyext/state.py 2020-04-10 19:28:41.000000000 +0000 @@ -5,7 +5,7 @@ from pypy.interpreter.executioncontext import ExecutionContext from rpython.rtyper.annlowlevel import llhelper from rpython.rlib.rdynload import DLLHANDLE -from rpython.rlib import rawrefcount +from rpython.rlib import rawrefcount, rgil import sys @@ -45,6 +45,13 @@ # XXX will leak if _PyDateTime_Import already called self.datetimeAPI = [] + self.cpyext_is_imported = False + + def make_sure_cpyext_is_imported(self): + if not self.cpyext_is_imported: + self.space.getbuiltinmodule("cpyext") # mandatory to init cpyext + self.cpyext_is_imported = True + def set_exception(self, operror): self.clear_exception() ec = self.space.getexecutioncontext() @@ -188,15 +195,7 @@ @specialize.arg(1) def ccall(self, name, *args): - from pypy.module.cpyext.api import cpyext_glob_tid_ptr - # This is similar to doing a direct call to state.C.PyXxx(), but - # must be used for any function that might potentially call back - # RPython code---most of them can, e.g. PyErr_NoMemory(). - assert cpyext_glob_tid_ptr[0] == 0 - cpyext_glob_tid_ptr[0] = -1 - result = getattr(self.C, name)(*args) - cpyext_glob_tid_ptr[0] = 0 - return result + return getattr(self.C, name)(*args) class CNamespace: diff -Nru pypy-7.1.1+dfsg/pypy/module/cpyext/test/array.c pypy-7.3.1+dfsg/pypy/module/cpyext/test/array.c --- pypy-7.1.1+dfsg/pypy/module/cpyext/test/array.c 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/cpyext/test/array.c 2020-04-10 19:28:40.000000000 +0000 @@ -2573,6 +2573,11 @@ Py_RETURN_NONE; } +static PyObject * +passthrough(PyObject *self, PyObject* args) { + Py_INCREF(args); + return args; +} /*********************** Install Module **************************/ static PyMethodDef a_methods[] = { @@ -2584,6 +2589,7 @@ {"same_dealloc", (PyCFunction)same_dealloc, METH_VARARGS, NULL}, {"getitem", (PyCFunction)getitem, METH_VARARGS, NULL}, {"subclass_with_attribute", (PyCFunction)subclass_with_attribute, METH_VARARGS, NULL}, + {"passthrough", (PyCFunction)passthrough, METH_O, NULL}, {NULL, NULL, 0, NULL} /* Sentinel */ }; diff -Nru pypy-7.1.1+dfsg/pypy/module/cpyext/test/conftest.py pypy-7.3.1+dfsg/pypy/module/cpyext/test/conftest.py --- pypy-7.1.1+dfsg/pypy/module/cpyext/test/conftest.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/cpyext/test/conftest.py 2020-04-10 19:28:41.000000000 +0000 @@ -2,7 +2,7 @@ import pytest def pytest_configure(config): - if config.option.runappdirect: + if config.getoption('runappdirect') or config.getoption('direct_apptest'): import sys import py from pypy import pypydir @@ -16,12 +16,12 @@ space = gettestobjspace(usemodules=['time']) space.getbuiltinmodule("time") -def pytest_ignore_collect(path, config): # ensure additional functions are registered import pypy.module.cpyext.test.test_cpyext - return False -def pytest_funcarg__api(request): + +@pytest.fixture +def api(request): return request.cls.api if os.name == 'nt': diff -Nru pypy-7.1.1+dfsg/pypy/module/cpyext/test/test_abstract.py pypy-7.3.1+dfsg/pypy/module/cpyext/test/test_abstract.py --- pypy-7.1.1+dfsg/pypy/module/cpyext/test/test_abstract.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/cpyext/test/test_abstract.py 2020-04-10 19:28:40.000000000 +0000 @@ -127,4 +127,29 @@ assert raises(TypeError, buffer_support.writebuffer_as_string, buf) assert s == buffer_support.charbuffer_as_string(buf) + def test_user_bufferable(self): + try: + import __pypy__ + except ImportError: + skip('PyPy only test') + class MyBuf(__pypy__.bufferable.bufferable): + def __init__(self, mview): + if not isinstance(mview, memoryview): + raise ValueError('mview must be a memoryview') + self.mview = mview + + def __buffer__(self, flags): + if flags & 1 and self.buffer.readonly: + raise TypeError('cannot return a writable buffer') + return __pypy__.newmemoryview(self.mview, self.mview.itemsize, + self.mview.format, self.mview.shape) + + s = b'abc' + m = memoryview(s) + buf = MyBuf(m) + buffer_support = self.get_buffer_support() + assert buffer_support.check_readbuffer(buf) + assert s == buffer_support.readbuffer_as_string(buf) + assert raises(TypeError, buffer_support.writebuffer_as_string, buf) + assert s == buffer_support.charbuffer_as_string(buf) diff -Nru pypy-7.1.1+dfsg/pypy/module/cpyext/test/test_api.py pypy-7.3.1+dfsg/pypy/module/cpyext/test/test_api.py --- pypy-7.1.1+dfsg/pypy/module/cpyext/test/test_api.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/cpyext/test/test_api.py 2020-04-10 19:28:41.000000000 +0000 @@ -23,6 +23,7 @@ def setup_class(cls): space = cls.space cls.preload_builtins(space) + cls.w_runappdirect = space.wrap(cls.runappdirect) class CAPI: def __repr__(self): diff -Nru pypy-7.1.1+dfsg/pypy/module/cpyext/test/test_arraymodule.py pypy-7.3.1+dfsg/pypy/module/cpyext/test/test_arraymodule.py --- pypy-7.1.1+dfsg/pypy/module/cpyext/test/test_arraymodule.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/cpyext/test/test_arraymodule.py 2020-04-10 19:28:40.000000000 +0000 @@ -79,6 +79,9 @@ assert str(buffer('a') + arr) == "a" + expected # python2 special cases empty-buffer + obj assert str(buffer('') + arr) == "array('i', [1, 2, 3, 4])" + # make sure buffer_attach is called + buf2 = module.passthrough(buf) + assert str(buf2) == str(buf) def test_releasebuffer(self): module = self.import_module(name='array') diff -Nru pypy-7.1.1+dfsg/pypy/module/cpyext/test/test_codecs.py pypy-7.3.1+dfsg/pypy/module/cpyext/test/test_codecs.py --- pypy-7.1.1+dfsg/pypy/module/cpyext/test/test_codecs.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/cpyext/test/test_codecs.py 2020-04-10 19:28:41.000000000 +0000 @@ -2,7 +2,8 @@ from pypy.module.cpyext.test.test_api import BaseApiTest from rpython.rtyper.lltypesystem import rffi from pypy.module.cpyext.codecs import ( - PyCodec_IncrementalEncoder, PyCodec_IncrementalDecoder) + PyCodec_IncrementalEncoder, PyCodec_IncrementalDecoder, + PyCodec_Encoder, PyCodec_Decoder) class TestCodecs(BaseApiTest): def test_incremental(self, space): @@ -13,3 +14,13 @@ w_decoded = space.call_method(w_decoder, 'decode', w_encoded) assert space.utf8_w(w_decoded) == u'späm'.encode('utf8') rffi.free_charp(utf8) + + def test_encoder_decoder(self, space): + utf8 = rffi.str2charp('utf-8') + w_encoder = PyCodec_Encoder(space, utf8) + w_decoder = PyCodec_Decoder(space, utf8) + rffi.free_charp(utf8) + space.appexec([w_encoder, w_decoder], """(encoder, decoder): + assert encoder(u"\u1234") == ('\xe1\x88\xb4', 1) + assert decoder("\xe1\x88\xb4") == (u'\u1234', 3) + """) diff -Nru pypy-7.1.1+dfsg/pypy/module/cpyext/test/test_cpyext.py pypy-7.3.1+dfsg/pypy/module/cpyext/test/test_cpyext.py --- pypy-7.1.1+dfsg/pypy/module/cpyext/test/test_cpyext.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/cpyext/test/test_cpyext.py 2020-04-10 19:28:41.000000000 +0000 @@ -14,6 +14,8 @@ from rpython.rlib import rawrefcount from rpython.tool.udir import udir +import pypy.module.cpyext.moduledef # Make sure all the functions are registered + only_pypy ="config.option.runappdirect and '__pypy__' not in sys.builtin_module_names" @api.cpython_api([], api.PyObject) @@ -80,23 +82,6 @@ def freeze_refcnts(self): rawrefcount._dont_free_any_more() -def preload(space, name): - from pypy.module.cpyext.pyobject import make_ref - if '.' not in name: - w_obj = space.builtin.getdictvalue(space, name) - else: - module, localname = name.rsplit('.', 1) - code = "(): import {module}; return {module}.{localname}" - code = code.format(**locals()) - w_obj = space.appexec([], code) - make_ref(space, w_obj) - -def preload_expr(space, expr): - from pypy.module.cpyext.pyobject import make_ref - code = "(): return {}".format(expr) - w_obj = space.appexec([], code) - make_ref(space, w_obj) - def is_interned_string(space, w_obj): try: s = space.str_w(w_obj) @@ -146,13 +131,37 @@ Eagerly create pyobjs for various builtins so they don't look like leaks. """ - for name in [ - 'buffer', 'mmap.mmap', - 'types.FunctionType', 'types.CodeType', - 'types.TracebackType', 'types.FrameType']: - preload(space, name) - for expr in ['type(str.join)']: - preload_expr(space, expr) + from pypy.module.cpyext.pyobject import make_ref + w_to_preload = space.appexec([], """(): + import sys + import mmap + # + # copied&pasted to avoid importing the whole types.py, which is + # expensive on py3k + # + def _f(): pass + FunctionType = type(_f) + CodeType = type(_f.__code__) + try: + raise TypeError + except TypeError: + tb = sys.exc_info()[2] + TracebackType = type(tb) + FrameType = type(tb.tb_frame) + del tb + # + return [ + buffer, + mmap.mmap, + FunctionType, + CodeType, + TracebackType, + FrameType, + type(str.join), + ] + """) + for w_obj in space.unpackiterable(w_to_preload): + make_ref(space, w_obj) def cleanup(self): self.space.getexecutioncontext().cleanup_cpyext_state() diff -Nru pypy-7.1.1+dfsg/pypy/module/cpyext/test/test_datetime.py pypy-7.3.1+dfsg/pypy/module/cpyext/test/test_datetime.py --- pypy-7.1.1+dfsg/pypy/module/cpyext/test/test_datetime.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/cpyext/test/test_datetime.py 2020-04-10 19:28:41.000000000 +0000 @@ -146,6 +146,41 @@ 2000, 6, 6, 6, 6, 6, 6, Py_None, PyDateTimeAPI->DateTimeType); """), + ("new_datetime_fromtimestamp", "METH_NOARGS", + """ PyDateTime_IMPORT; + PyObject *ts = PyFloat_FromDouble(200000.0); + Py_INCREF(Py_None); + PyObject *tsargs = PyTuple_Pack(2, ts, Py_None); + PyObject *rv = PyDateTimeAPI->DateTime_FromTimestamp( + (PyObject *)PyDateTimeAPI->DateTimeType, tsargs, NULL); + Py_DECREF(tsargs); + return rv; + """), + ("new_dt_fromts_tzinfo", "METH_O", + """ PyDateTime_IMPORT; + PyObject *ts = PyFloat_FromDouble(200000.0); + PyObject *tsargs = PyTuple_Pack(1, ts); + PyObject *tskwargs = PyDict_New(); + + Py_INCREF(args); + PyDict_SetItemString(tskwargs, "tz", args); + PyObject *rv = PyDateTimeAPI->DateTime_FromTimestamp( + (PyObject *)PyDateTimeAPI->DateTimeType, tsargs, tskwargs); + Py_DECREF(tsargs); + Py_DECREF(tskwargs); + return rv; + """), + ("new_date_fromtimestamp", "METH_NOARGS", + """ PyDateTime_IMPORT; + PyObject *ts = PyFloat_FromDouble(1430366400.0); + Py_INCREF(Py_None); + PyObject *tsargs = PyTuple_Pack(1, ts); + PyObject *rv = PyDateTimeAPI->Date_FromTimestamp( + (PyObject *)PyDateTimeAPI->DateType, tsargs); + Py_DECREF(tsargs); + return rv; + """), + ], prologue='#include "datetime.h"\n') import datetime assert module.new_date() == datetime.date(2000, 6, 6) @@ -153,6 +188,28 @@ assert module.new_datetime() == datetime.datetime( 2000, 6, 6, 6, 6, 6, 6) + class UTC(datetime.tzinfo): + def utcoffset(self, dt): + return datetime.timedelta(hours=0) + + def dst(self, dt): + return datetime.timedelta(0) + + def tzname(self, dt): + return "UTC" + + utc = UTC() + + # .fromtimestamp tests + assert (module.new_datetime_fromtimestamp() == + datetime.datetime.fromtimestamp(200000.0)) + + assert (module.new_dt_fromts_tzinfo(utc) == + datetime.datetime.fromtimestamp(200000.0, tz=utc)) + + assert (module.new_date_fromtimestamp() == + datetime.date.fromtimestamp(1430366400.0)) + def test_macros(self): module = self.import_extension('foo', [ ("test_date_macros", "METH_NOARGS", @@ -305,16 +362,18 @@ """), ], prologue='#include "datetime.h"\n') from datetime import tzinfo, datetime, timedelta, time + # copied from datetime documentation class GMT1(tzinfo): def __del__(self): - print 'deleting GMT1' + print('deleting GMT1') def utcoffset(self, dt): return timedelta(hours=1) + self.dst(dt) def dst(self, dt): return timedelta(0) def tzname(self,dt): return "GMT +1" + gmt1 = GMT1() dt1 = module.time_with_tzinfo(gmt1) assert dt1 == time(6, 6, 6, 6, gmt1) diff -Nru pypy-7.1.1+dfsg/pypy/module/cpyext/test/test_dictobject.py pypy-7.3.1+dfsg/pypy/module/cpyext/test/test_dictobject.py --- pypy-7.1.1+dfsg/pypy/module/cpyext/test/test_dictobject.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/cpyext/test/test_dictobject.py 2020-04-10 19:28:40.000000000 +0000 @@ -173,6 +173,26 @@ ]) assert module.dict_proxy({'a': 1, 'b': 2}) == 2 + def test_getitemwitherror(self): + module = self.import_extension('foo', [ + ("dict_getitem", "METH_VARARGS", + """ + PyObject *d, *key, *result; + if (!PyArg_ParseTuple(args, "OO", &d, &key)) { + return NULL; + } + result = _PyDict_GetItemWithError(d, key); + if (result == NULL && !PyErr_Occurred()) + Py_RETURN_NONE; + Py_XINCREF(result); + return result; + """)]) + d = {'foo': 'bar'} + assert module.dict_getitem(d, 'foo') == 'bar' + assert module.dict_getitem(d, 'missing') is None + with raises(TypeError): + module.dict_getitem(d, []) + def test_update(self): module = self.import_extension('foo', [ ("update", "METH_VARARGS", @@ -374,3 +394,20 @@ d[1] = 2 assert d[1] == 42 assert module.dict_getitem(d, 1) == 2 + + def test_getitem_error(self): + module = self.import_extension('foo', [ + ("dict_getitem", "METH_VARARGS", + """ + PyObject *d, *key, *result; + if (!PyArg_ParseTuple(args, "OO", &d, &key)) { + return NULL; + } + result = PyDict_GetItem(d, key); + if (!result) Py_RETURN_NONE; + Py_XINCREF(result); + return result; + """), + ]) + assert module.dict_getitem(42, 43) is None + assert module.dict_getitem({}, []) is None diff -Nru pypy-7.1.1+dfsg/pypy/module/cpyext/test/test_eval.py pypy-7.3.1+dfsg/pypy/module/cpyext/test/test_eval.py --- pypy-7.1.1+dfsg/pypy/module/cpyext/test/test_eval.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/cpyext/test/test_eval.py 2020-04-10 19:28:41.000000000 +0000 @@ -146,11 +146,13 @@ c_fclose(fp) # try again, but with a closed file - fp = c_fopen(str(filepath), "rb") - os.close(c_fileno(fp)) - with raises_w(space, IOError): - PyRun_File(space, fp, filename, Py_file_input, w_globals, w_locals) + if self.runappdirect: + # according to man 2 fclose, any access of fp is undefined + # behaviour. This crashes on some linux systems untranslated + fp = c_fopen(str(filepath), "rb") c_fclose(fp) + with raises_w(space, IOError): + PyRun_File(space, fp, filename, Py_file_input, w_globals, w_locals) rffi.free_charp(filename) def test_getbuiltins(self, space): diff -Nru pypy-7.1.1+dfsg/pypy/module/cpyext/test/test_pyerrors.py pypy-7.3.1+dfsg/pypy/module/cpyext/test/test_pyerrors.py --- pypy-7.1.1+dfsg/pypy/module/cpyext/test/test_pyerrors.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/cpyext/test/test_pyerrors.py 2020-04-10 19:28:40.000000000 +0000 @@ -3,6 +3,7 @@ import StringIO from pypy.module.cpyext.state import State +from pypy.module.cpyext.pyobject import make_ref from pypy.module.cpyext.test.test_api import BaseApiTest from pypy.module.cpyext.test.test_cpyext import AppTestCpythonExtensionBase from rpython.rtyper.lltypesystem import rffi @@ -108,6 +109,30 @@ assert recieved == ['ok'] assert api.PyOS_InterruptOccurred() + def test_restore_traceback(self, space, api): + string = rffi.str2charp("spam and eggs") + api.PyErr_SetString(space.w_ValueError, string) + + state = space.fromcache(State) + operror = state.clear_exception() + + # Fake a traceback. + operror.set_traceback(space.w_True) # this doesn't really need to be a real traceback for this test. + + w_type = operror.w_type + w_value = operror.get_w_value(space) + w_tb = operror.get_w_traceback(space) + + assert not space.eq_w(w_tb, space.w_None) + + api.PyErr_Restore(make_ref(space, w_type), make_ref(space, w_value), make_ref(space, w_tb)) + + operror = state.clear_exception() + w_tb_restored = operror.get_w_traceback(space) + + assert space.eq_w(w_tb_restored, w_tb) + rffi.free_charp(string) + class AppTestFetch(AppTestCpythonExtensionBase): def test_occurred(self): @@ -233,8 +258,10 @@ prologue="#include ") exc_info = raises(OSError, module.set_from_errno) assert exc_info.value.filename == "/path/to/file" - assert exc_info.value.errno == errno.EBADF - assert exc_info.value.strerror == os.strerror(errno.EBADF) + if self.runappdirect: + # untranslated the errno can get reset by the calls to ll2ctypes + assert exc_info.value.errno == errno.EBADF + assert exc_info.value.strerror == os.strerror(errno.EBADF) def test_SetFromErrnoWithFilename_NULL(self): import errno, os @@ -250,8 +277,10 @@ prologue="#include ") exc_info = raises(OSError, module.set_from_errno) assert exc_info.value.filename is None - assert exc_info.value.errno == errno.EBADF - assert exc_info.value.strerror == os.strerror(errno.EBADF) + if self.runappdirect: + # untranslated the errno can get reset by the calls to ll2ctypes + assert exc_info.value.errno == errno.EBADF + assert exc_info.value.strerror == os.strerror(errno.EBADF) def test_SetFromErrnoWithFilenameObject__PyString(self): import errno, os @@ -269,8 +298,10 @@ prologue="#include ") exc_info = raises(OSError, module.set_from_errno) assert exc_info.value.filename == "/path/to/file" - assert exc_info.value.errno == errno.EBADF - assert exc_info.value.strerror == os.strerror(errno.EBADF) + if self.runappdirect: + # untranslated the errno can get reset by the calls to ll2ctypes + assert exc_info.value.errno == errno.EBADF + assert exc_info.value.strerror == os.strerror(errno.EBADF) def test_SetFromErrnoWithFilenameObject__PyInt(self): import errno, os @@ -288,8 +319,10 @@ prologue="#include ") exc_info = raises(OSError, module.set_from_errno) assert exc_info.value.filename == 3 - assert exc_info.value.errno == errno.EBADF - assert exc_info.value.strerror == os.strerror(errno.EBADF) + if self.runappdirect: + # untranslated the errno can get reset by the calls to ll2ctypes + assert exc_info.value.errno == errno.EBADF + assert exc_info.value.strerror == os.strerror(errno.EBADF) def test_SetFromErrnoWithFilenameObject__PyList(self): import errno, os @@ -307,8 +340,10 @@ prologue="#include ") exc_info = raises(OSError, module.set_from_errno) assert exc_info.value.filename == [1, 2, "three"] - assert exc_info.value.errno == errno.EBADF - assert exc_info.value.strerror == os.strerror(errno.EBADF) + if self.runappdirect: + # untranslated the errno can get reset by the calls to ll2ctypes + assert exc_info.value.errno == errno.EBADF + assert exc_info.value.strerror == os.strerror(errno.EBADF) def test_SetFromErrnoWithFilenameObject__PyTuple(self): import errno, os @@ -326,8 +361,10 @@ prologue="#include ") exc_info = raises(OSError, module.set_from_errno) assert exc_info.value.filename == (1, 2, "three") - assert exc_info.value.errno == errno.EBADF - assert exc_info.value.strerror == os.strerror(errno.EBADF) + if self.runappdirect: + # untranslated the errno can get reset by the calls to ll2ctypes + assert exc_info.value.errno == errno.EBADF + assert exc_info.value.strerror == os.strerror(errno.EBADF) def test_SetFromErrnoWithFilenameObject__Py_None(self): import errno, os @@ -345,8 +382,10 @@ prologue="#include ") exc_info = raises(OSError, module.set_from_errno) assert exc_info.value.filename is None - assert exc_info.value.errno == errno.EBADF - assert exc_info.value.strerror == os.strerror(errno.EBADF) + if self.runappdirect: + # untranslated the errno can get reset by the calls to ll2ctypes + assert exc_info.value.errno == errno.EBADF + assert exc_info.value.strerror == os.strerror(errno.EBADF) def test_PyErr_Display(self): from sys import version_info @@ -459,8 +498,10 @@ /* Proceed in thread 1 first */ save = PyEval_SaveThread(); + if (save == NULL) abort(); while (id == 0 && flag == 0); gilsave = PyGILState_Ensure(); + if (gilsave != PyGILState_UNLOCKED) abort(); PyErr_Format(PyExc_ValueError, "%d", id); diff -Nru pypy-7.1.1+dfsg/pypy/module/cpyext/test/test_setobject.py pypy-7.3.1+dfsg/pypy/module/cpyext/test/test_setobject.py --- pypy-7.1.1+dfsg/pypy/module/cpyext/test/test_setobject.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/cpyext/test/test_setobject.py 2020-04-10 19:28:41.000000000 +0000 @@ -1,8 +1,11 @@ +from rpython.rtyper.lltypesystem import lltype from pypy.module.cpyext.test.test_api import BaseApiTest, raises_w from pypy.module.cpyext.test.test_cpyext import AppTestCpythonExtensionBase from pypy.module.cpyext.setobject import ( PySet_Check, PyFrozenSet_Check, PyFrozenSet_CheckExact, PySet_Add, PySet_Size, PySet_GET_SIZE) +from pypy.module.cpyext.api import Py_ssize_tP, PyObjectP +from pypy.module.cpyext.pyobject import from_ref class TestTupleObject(BaseApiTest): @@ -62,6 +65,42 @@ """) assert api.PyAnySet_Check(w_instance) + def test_pyset_next(self, space, api): + w_set = space.call_function(space.w_set, space.newtext("ab")) + with lltype.scoped_alloc(Py_ssize_tP.TO, 1) as pos_p: + with lltype.scoped_alloc(PyObjectP.TO, 1) as result_p: + pos_p[0] = 0 + res = api._PySet_Next(w_set, pos_p, result_p) + assert res == 1 + letter1 = space.text_w(from_ref(space, result_p[0])) + res = api._PySet_Next(w_set, pos_p, result_p) + assert res == 1 + letter2 = space.text_w(from_ref(space, result_p[0])) + res = api._PySet_Next(w_set, pos_p, result_p) + assert res == 0 + assert set([letter1, letter2]) == set("ab") + + def test_pyset_nextentry(self, space, api): + w_set = space.call_function(space.w_set, space.newtext("ab")) + with lltype.scoped_alloc(Py_ssize_tP.TO, 1) as pos_p: + with lltype.scoped_alloc(PyObjectP.TO, 1) as result_p: + with lltype.scoped_alloc(Py_ssize_tP.TO, 1) as hash_p: + pos_p[0] = 0 + res = api._PySet_NextEntry(w_set, pos_p, result_p, hash_p) + assert res == 1 + w_obj = from_ref(space, result_p[0]) + letter1 = space.text_w(w_obj) + assert hash_p[0] == space.hash_w(w_obj) + res = api._PySet_NextEntry(w_set, pos_p, result_p, hash_p) + assert res == 1 + w_obj = from_ref(space, result_p[0]) + letter2 = space.text_w(w_obj) + assert hash_p[0] == space.hash_w(w_obj) + res = api._PySet_NextEntry(w_set, pos_p, result_p, hash_p) + assert res == 0 + assert set([letter1, letter2]) == set("ab") + + class AppTestSetObject(AppTestCpythonExtensionBase): def test_set_macro_cast(self): module = self.import_extension('foo', [ diff -Nru pypy-7.1.1+dfsg/pypy/module/cpyext/test/test_typeobject.py pypy-7.3.1+dfsg/pypy/module/cpyext/test/test_typeobject.py --- pypy-7.1.1+dfsg/pypy/module/cpyext/test/test_typeobject.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/cpyext/test/test_typeobject.py 2020-04-10 19:28:41.000000000 +0000 @@ -452,6 +452,30 @@ assert module.hack_tp_dict(obj, "b") == 2 + def test_tp_dict_ready(self): + module = self.import_extension('foo', [ + ("new_obj", "METH_NOARGS", + ''' + PyObject *obj; + obj = PyObject_New(PyObject, &Foo_Type); + return obj; + ''' + )], prologue=''' + static PyTypeObject Foo_Type = { + PyVarObject_HEAD_INIT(NULL, 0) + "foo.foo", + }; + ''', more_init = ''' + Foo_Type.tp_flags = Py_TPFLAGS_DEFAULT; + Foo_Type.tp_dict = PyDict_New(); + PyDict_SetItemString(Foo_Type.tp_dict, "inserted", Py_True); + if (PyType_Ready(&Foo_Type) < 0) INITERROR; + ''') + + obj = module.new_obj() + assert type(obj).inserted is True + + def test_tp_descr_get(self): module = self.import_extension('foo', [ ("tp_descr_get", "METH_O", @@ -1296,7 +1320,8 @@ except TypeError as e: import sys if '__pypy__' in sys.builtin_module_names: - assert str(e) == 'instance layout conflicts in multiple inheritance' + print(str(e)) + assert 'instance layout conflicts in multiple inheritance' in str(e) else: assert str(e) == ('Error when calling the metaclass bases\n' diff -Nru pypy-7.1.1+dfsg/pypy/module/cpyext/test/test_unicodeobject.py pypy-7.3.1+dfsg/pypy/module/cpyext/test/test_unicodeobject.py --- pypy-7.1.1+dfsg/pypy/module/cpyext/test/test_unicodeobject.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/cpyext/test/test_unicodeobject.py 2020-04-10 19:28:41.000000000 +0000 @@ -156,6 +156,32 @@ s = module.asutf32(u) assert s == u.encode('utf-32') + def test_lower_cython(self): + # mimic exactly what cython does, without the extra checks + import time + module = self.import_extension('foo', [ + ("lower", "METH_O", + """ + PyObject *p, *res, *tup; + p = PyObject_GetAttrString(args, "lower"); + if (p == NULL) { + return NULL; + } + tup = PyTuple_New(0); + Py_INCREF(tup); + res = PyObject_Call(p, tup, NULL); + Py_DECREF(tup); + return res; + """)]) + assert module.lower('ABC') == 'abc' + try: + time.tzset() + except AttributeError: + # only on posix + pass + tz1 = time.tzname[1] + assert module.lower(tz1) == tz1.lower() + class TestUnicode(BaseApiTest): def test_unicodeobject(self, space): diff -Nru pypy-7.1.1+dfsg/pypy/module/cpyext/typeobject.py pypy-7.3.1+dfsg/pypy/module/cpyext/typeobject.py --- pypy-7.1.1+dfsg/pypy/module/cpyext/typeobject.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/cpyext/typeobject.py 2020-04-10 19:28:40.000000000 +0000 @@ -260,6 +260,7 @@ dict_w[name] = w_descr i += 1 +WARN_MISSING_SLOTS = False missing_slots={} def warn_missing_slot(space, method_name, slot_name, w_type): if not we_are_translated(): @@ -286,7 +287,8 @@ if not slot_func_helper: if not slot_apifunc: - warn_missing_slot(space, method_name, slot_name, w_type) + if WARN_MISSING_SLOTS: + warn_missing_slot(space, method_name, slot_name, w_type) continue slot_func_helper = slot_apifunc.get_llhelper(space) fill_slot(space, pto, w_type, slot_names, slot_func_helper) @@ -538,6 +540,13 @@ convert_getset_defs(space, dict_w, pto.c_tp_getset, self) convert_member_defs(space, dict_w, pto.c_tp_members, self) + w_dict = from_ref(space, pto.c_tp_dict) + if w_dict is not None: + dictkeys_w = space.listview(w_dict) + for w_key in dictkeys_w: + key = space.text_w(w_key) + dict_w[key] = space.getitem(w_dict, w_key) + name = rffi.charp2str(cts.cast('char*', pto.c_tp_name)) flag_heaptype = pto.c_tp_flags & Py_TPFLAGS_HEAPTYPE if flag_heaptype: @@ -586,8 +595,9 @@ raise oefmt(space.w_SystemError, "accessing non-existent segment") buf = space.readbuf_w(w_buf) - if isinstance(buf, StringBuffer): - return str_getreadbuffer(space, w_buf, segment, ref) + # if isinstance(buf, StringBuffer): + # # Link the data pointer of buf to ref[0] + # return _str_getreadbuffer(space, w_buf, segment, ref) address = buf.get_raw_address() ref[0] = address return len(buf) @@ -607,6 +617,9 @@ @slot_function([PyObject, Py_ssize_t, rffi.VOIDPP], lltype.Signed, error=-1) def str_getreadbuffer(space, w_str, segment, ref): + return _str_getreadbuffer(space, w_str, segment, ref) + +def _str_getreadbuffer(space, w_str, segment, ref): from pypy.module.cpyext.bytesobject import PyString_AsString if segment != 0: raise oefmt(space.w_SystemError, @@ -632,7 +645,7 @@ @slot_function([PyObject, Py_ssize_t, rffi.CCHARPP], lltype.Signed, error=-1) def str_getcharbuffer(space, w_buf, segment, ref): - return str_getreadbuffer(space, w_buf, segment, rffi.cast(rffi.VOIDPP, ref)) + return _str_getreadbuffer(space, w_buf, segment, rffi.cast(rffi.VOIDPP, ref)) @slot_function([PyObject, Py_ssize_t, rffi.VOIDPP], lltype.Signed, error=-1) def buf_getreadbuffer(space, pyref, segment, ref): @@ -905,8 +918,10 @@ # While this is a hack, cpython does it as well. w_metatype = space.w_type - w_obj = space.allocate_instance(W_PyCTypeObject, w_metatype) - track_reference(space, py_obj, w_obj) + w_obj = rawrefcount.to_obj(W_PyCTypeObject, py_obj) + if w_obj is None: + w_obj = space.allocate_instance(W_PyCTypeObject, w_metatype) + track_reference(space, py_obj, w_obj) # __init__ wraps all slotdefs functions from py_type via add_operators w_obj.__init__(space, py_type) w_obj.ready() @@ -933,7 +948,7 @@ Sets up tp_bases, necessary before creating the interpreter type. """ base = pto.c_tp_base - base_pyo = rffi.cast(PyObject, pto.c_tp_base) + base_pyo = rffi.cast(PyObject, base) if base and not base.c_tp_flags & Py_TPFLAGS_READY: type_realize(space, base_pyo) if base and not pto.c_ob_type: # will be filled later diff -Nru pypy-7.1.1+dfsg/pypy/module/cpyext/unicodeobject.py pypy-7.3.1+dfsg/pypy/module/cpyext/unicodeobject.py --- pypy-7.1.1+dfsg/pypy/module/cpyext/unicodeobject.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/cpyext/unicodeobject.py 2020-04-10 19:28:41.000000000 +0000 @@ -6,7 +6,7 @@ from pypy.interpreter.unicodehelper import ( wcharpsize2utf8, str_decode_utf_16_helper, str_decode_utf_32_helper, unicode_encode_decimal) -from pypy.module.unicodedata import unicodedb +from pypy.module.unicodedata.interp_ucd import unicodedb from pypy.module.cpyext.api import ( CANNOT_FAIL, Py_ssize_t, build_type_checkers_flags, cpython_api, bootstrap_function, CONST_STRING, INTP_real, diff -Nru pypy-7.1.1+dfsg/pypy/module/cpyext/userslot.py pypy-7.3.1+dfsg/pypy/module/cpyext/userslot.py --- pypy-7.1.1+dfsg/pypy/module/cpyext/userslot.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/cpyext/userslot.py 2020-04-10 19:28:41.000000000 +0000 @@ -22,7 +22,7 @@ @slot_function([PyObject], lltype.Signed, error=-1) def slot_tp_hash(space, w_obj): - return space.int_w(space.hash(w_obj)) + return space.hash_w(w_obj) @slot_function([PyObject, Py_ssize_t], PyObject) def slot_sq_item(space, w_obj, index): diff -Nru pypy-7.1.1+dfsg/pypy/module/crypt/__init__.py pypy-7.3.1+dfsg/pypy/module/crypt/__init__.py --- pypy-7.1.1+dfsg/pypy/module/crypt/__init__.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/crypt/__init__.py 2020-04-10 19:28:41.000000000 +0000 @@ -1,11 +0,0 @@ -from pypy.interpreter.mixedmodule import MixedModule - -class Module(MixedModule): - """A demo built-in module based on rffi.""" - - interpleveldefs = { - 'crypt' : 'interp_crypt.crypt', - } - - appleveldefs = { - } diff -Nru pypy-7.1.1+dfsg/pypy/module/crypt/moduledef.py pypy-7.3.1+dfsg/pypy/module/crypt/moduledef.py --- pypy-7.1.1+dfsg/pypy/module/crypt/moduledef.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/crypt/moduledef.py 2020-04-10 19:28:41.000000000 +0000 @@ -0,0 +1,11 @@ +from pypy.interpreter.mixedmodule import MixedModule + +class Module(MixedModule): + """A demo built-in module based on rffi.""" + + interpleveldefs = { + 'crypt' : 'interp_crypt.crypt', + } + + appleveldefs = { + } diff -Nru pypy-7.1.1+dfsg/pypy/module/cStringIO/__init__.py pypy-7.3.1+dfsg/pypy/module/cStringIO/__init__.py --- pypy-7.1.1+dfsg/pypy/module/cStringIO/__init__.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/cStringIO/__init__.py 2020-04-10 19:28:40.000000000 +0000 @@ -1,13 +0,0 @@ - -# Package initialisation -from pypy.interpreter.mixedmodule import MixedModule - -class Module(MixedModule): - appleveldefs = { - } - - interpleveldefs = { - 'StringIO': 'interp_stringio.StringIO', - 'InputType': 'interp_stringio.W_InputType', - 'OutputType': 'interp_stringio.W_OutputType', - } diff -Nru pypy-7.1.1+dfsg/pypy/module/cStringIO/interp_stringio.py pypy-7.3.1+dfsg/pypy/module/cStringIO/interp_stringio.py --- pypy-7.1.1+dfsg/pypy/module/cStringIO/interp_stringio.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/cStringIO/interp_stringio.py 2020-04-10 19:28:40.000000000 +0000 @@ -7,6 +7,8 @@ class W_InputOutputType(W_Root): + exact_class_applevel_name = "StringI-or-StringO" + softspace = 0 # part of the file object API def descr___iter__(self): diff -Nru pypy-7.1.1+dfsg/pypy/module/cStringIO/moduledef.py pypy-7.3.1+dfsg/pypy/module/cStringIO/moduledef.py --- pypy-7.1.1+dfsg/pypy/module/cStringIO/moduledef.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/cStringIO/moduledef.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,13 @@ + +# Package initialisation +from pypy.interpreter.mixedmodule import MixedModule + +class Module(MixedModule): + appleveldefs = { + } + + interpleveldefs = { + 'StringIO': 'interp_stringio.StringIO', + 'InputType': 'interp_stringio.W_InputType', + 'OutputType': 'interp_stringio.W_OutputType', + } diff -Nru pypy-7.1.1+dfsg/pypy/module/cStringIO/test/test_interp_stringio.py pypy-7.3.1+dfsg/pypy/module/cStringIO/test/test_interp_stringio.py --- pypy-7.1.1+dfsg/pypy/module/cStringIO/test/test_interp_stringio.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/cStringIO/test/test_interp_stringio.py 2020-04-10 19:28:40.000000000 +0000 @@ -204,3 +204,12 @@ import cStringIO assert type(cStringIO.StringIO()) is cStringIO.OutputType assert type(cStringIO.StringIO('')) is cStringIO.InputType + + def test_error_message_wrong_self(self): + import cStringIO + unboundmeth = cStringIO.InputType.close + e = raises(TypeError, unboundmeth, 42) + assert "StringI" in str(e.value) + if hasattr(unboundmeth, 'im_func'): + e = raises(TypeError, unboundmeth.im_func, 42) + assert "'StringI-or-StringO'" in str(e.value) diff -Nru pypy-7.1.1+dfsg/pypy/module/_csv/__init__.py pypy-7.3.1+dfsg/pypy/module/_csv/__init__.py --- pypy-7.1.1+dfsg/pypy/module/_csv/__init__.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_csv/__init__.py 2020-04-10 19:28:40.000000000 +0000 @@ -1,87 +0,0 @@ -from pypy.interpreter.mixedmodule import MixedModule - - -class Module(MixedModule): - """CSV parsing and writing. - -This module provides classes that assist in the reading and writing -of Comma Separated Value (CSV) files, and implements the interface -described by PEP 305. Although many CSV files are simple to parse, -the format is not formally defined by a stable specification and -is subtle enough that parsing lines of a CSV file with something -like line.split(\",\") is bound to fail. The module supports three -basic APIs: reading, writing, and registration of dialects. - - -DIALECT REGISTRATION: - -Readers and writers support a dialect argument, which is a convenient -handle on a group of settings. When the dialect argument is a string, -it identifies one of the dialects previously registered with the module. -If it is a class or instance, the attributes of the argument are used as -the settings for the reader or writer: - - class excel: - delimiter = ',' - quotechar = '\"' - escapechar = None - doublequote = True - skipinitialspace = False - lineterminator = '\\r\\n' - quoting = QUOTE_MINIMAL - -SETTINGS: - - * quotechar - specifies a one-character string to use as the - quoting character. It defaults to '\"'. - * delimiter - specifies a one-character string to use as the - field separator. It defaults to ','. - * skipinitialspace - specifies how to interpret whitespace which - immediately follows a delimiter. It defaults to False, which - means that whitespace immediately following a delimiter is part - of the following field. - * lineterminator - specifies the character sequence which should - terminate rows. - * quoting - controls when quotes should be generated by the writer. - It can take on any of the following module constants: - - csv.QUOTE_MINIMAL means only when required, for example, when a - field contains either the quotechar or the delimiter - csv.QUOTE_ALL means that quotes are always placed around fields. - csv.QUOTE_NONNUMERIC means that quotes are always placed around - fields which do not parse as integers or floating point - numbers. - csv.QUOTE_NONE means that quotes are never placed around fields. - * escapechar - specifies a one-character string used to escape - the delimiter when quoting is set to QUOTE_NONE. - * doublequote - controls the handling of quotes inside fields. When - True, two consecutive quotes are interpreted as one during read, - and when writing, each quote character embedded in the data is - written as two quotes. -""" - - appleveldefs = { - 'register_dialect': 'app_csv.register_dialect', - 'unregister_dialect': 'app_csv.unregister_dialect', - 'get_dialect': 'app_csv.get_dialect', - 'list_dialects': 'app_csv.list_dialects', - '_dialects': 'app_csv._dialects', - - 'Error': 'app_csv.Error', - } - - interpleveldefs = { - '__version__': 'space.wrap("1.0")', - - 'QUOTE_MINIMAL': 'space.wrap(interp_csv.QUOTE_MINIMAL)', - 'QUOTE_ALL': 'space.wrap(interp_csv.QUOTE_ALL)', - 'QUOTE_NONNUMERIC': 'space.wrap(interp_csv.QUOTE_NONNUMERIC)', - 'QUOTE_NONE': 'space.wrap(interp_csv.QUOTE_NONE)', - - 'Dialect': 'interp_csv.W_Dialect', - - 'reader': 'interp_reader.csv_reader', - 'field_size_limit': 'interp_reader.csv_field_size_limit', - - 'writer': 'interp_writer.csv_writer', - } diff -Nru pypy-7.1.1+dfsg/pypy/module/_csv/moduledef.py pypy-7.3.1+dfsg/pypy/module/_csv/moduledef.py --- pypy-7.1.1+dfsg/pypy/module/_csv/moduledef.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_csv/moduledef.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,87 @@ +from pypy.interpreter.mixedmodule import MixedModule + + +class Module(MixedModule): + """CSV parsing and writing. + +This module provides classes that assist in the reading and writing +of Comma Separated Value (CSV) files, and implements the interface +described by PEP 305. Although many CSV files are simple to parse, +the format is not formally defined by a stable specification and +is subtle enough that parsing lines of a CSV file with something +like line.split(\",\") is bound to fail. The module supports three +basic APIs: reading, writing, and registration of dialects. + + +DIALECT REGISTRATION: + +Readers and writers support a dialect argument, which is a convenient +handle on a group of settings. When the dialect argument is a string, +it identifies one of the dialects previously registered with the module. +If it is a class or instance, the attributes of the argument are used as +the settings for the reader or writer: + + class excel: + delimiter = ',' + quotechar = '\"' + escapechar = None + doublequote = True + skipinitialspace = False + lineterminator = '\\r\\n' + quoting = QUOTE_MINIMAL + +SETTINGS: + + * quotechar - specifies a one-character string to use as the + quoting character. It defaults to '\"'. + * delimiter - specifies a one-character string to use as the + field separator. It defaults to ','. + * skipinitialspace - specifies how to interpret whitespace which + immediately follows a delimiter. It defaults to False, which + means that whitespace immediately following a delimiter is part + of the following field. + * lineterminator - specifies the character sequence which should + terminate rows. + * quoting - controls when quotes should be generated by the writer. + It can take on any of the following module constants: + + csv.QUOTE_MINIMAL means only when required, for example, when a + field contains either the quotechar or the delimiter + csv.QUOTE_ALL means that quotes are always placed around fields. + csv.QUOTE_NONNUMERIC means that quotes are always placed around + fields which do not parse as integers or floating point + numbers. + csv.QUOTE_NONE means that quotes are never placed around fields. + * escapechar - specifies a one-character string used to escape + the delimiter when quoting is set to QUOTE_NONE. + * doublequote - controls the handling of quotes inside fields. When + True, two consecutive quotes are interpreted as one during read, + and when writing, each quote character embedded in the data is + written as two quotes. +""" + + appleveldefs = { + 'register_dialect': 'app_csv.register_dialect', + 'unregister_dialect': 'app_csv.unregister_dialect', + 'get_dialect': 'app_csv.get_dialect', + 'list_dialects': 'app_csv.list_dialects', + '_dialects': 'app_csv._dialects', + + 'Error': 'app_csv.Error', + } + + interpleveldefs = { + '__version__': 'space.wrap("1.0")', + + 'QUOTE_MINIMAL': 'space.wrap(interp_csv.QUOTE_MINIMAL)', + 'QUOTE_ALL': 'space.wrap(interp_csv.QUOTE_ALL)', + 'QUOTE_NONNUMERIC': 'space.wrap(interp_csv.QUOTE_NONNUMERIC)', + 'QUOTE_NONE': 'space.wrap(interp_csv.QUOTE_NONE)', + + 'Dialect': 'interp_csv.W_Dialect', + + 'reader': 'interp_reader.csv_reader', + 'field_size_limit': 'interp_reader.csv_field_size_limit', + + 'writer': 'interp_writer.csv_writer', + } diff -Nru pypy-7.1.1+dfsg/pypy/module/_demo/app_demo.py pypy-7.3.1+dfsg/pypy/module/_demo/app_demo.py --- pypy-7.1.1+dfsg/pypy/module/_demo/app_demo.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_demo/app_demo.py 2020-04-10 19:28:40.000000000 +0000 @@ -1,3 +1,12 @@ +import sys +if sys.platform == 'win32': + import nt as posix +else: + import posix + +# for the test_random_stuff_can_unfreeze test +posix.environ['PYPY_DEMO_MODULE_ERROR'] = '1' + class DemoError(Exception): pass diff -Nru pypy-7.1.1+dfsg/pypy/module/_demo/__init__.py pypy-7.3.1+dfsg/pypy/module/_demo/__init__.py --- pypy-7.1.1+dfsg/pypy/module/_demo/__init__.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_demo/__init__.py 2020-04-10 19:28:40.000000000 +0000 @@ -1,24 +0,0 @@ -from pypy.interpreter.mixedmodule import MixedModule - -class Module(MixedModule): - """A demo built-in module based on ctypes.""" - - interpleveldefs = { - 'measuretime' : 'demo.measuretime', - 'sieve' : 'demo.sieve', - 'MyType' : 'demo.W_MyType', - } - - appleveldefs = { - 'DemoError' : 'app_demo.DemoError', - } - - # Used in tests - demo_events = [] - def setup_after_space_initialization(self): - Module.demo_events.append('setup') - def startup(self, space): - Module.demo_events.append('startup') - def shutdown(self, space): - Module.demo_events.append('shutdown') - diff -Nru pypy-7.1.1+dfsg/pypy/module/_demo/moduledef.py pypy-7.3.1+dfsg/pypy/module/_demo/moduledef.py --- pypy-7.1.1+dfsg/pypy/module/_demo/moduledef.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_demo/moduledef.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,24 @@ +from pypy.interpreter.mixedmodule import MixedModule + +class Module(MixedModule): + """A demo built-in module based on ctypes.""" + + interpleveldefs = { + 'measuretime' : 'demo.measuretime', + 'sieve' : 'demo.sieve', + 'MyType' : 'demo.W_MyType', + } + + appleveldefs = { + 'DemoError' : 'app_demo.DemoError', + } + + # Used in tests + demo_events = [] + def setup_after_space_initialization(self): + Module.demo_events.append('setup') + def startup(self, space): + Module.demo_events.append('startup') + def shutdown(self, space): + Module.demo_events.append('shutdown') + diff -Nru pypy-7.1.1+dfsg/pypy/module/_demo/test/test_import.py pypy-7.3.1+dfsg/pypy/module/_demo/test/test_import.py --- pypy-7.1.1+dfsg/pypy/module/_demo/test/test_import.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_demo/test/test_import.py 2020-04-10 19:28:40.000000000 +0000 @@ -1,30 +1,54 @@ -from pypy.module import _demo +import sys +from pypy.module._demo.moduledef import Module from pypy.tool.option import make_config, make_objspace class TestImport: def setup_method(self, func): - _demo.Module.demo_events = [] + Module.demo_events = [] def test_startup(self): config = make_config(None, usemodules=('_demo',)) space = make_objspace(config) w_modules = space.sys.get('modules') - assert _demo.Module.demo_events == ['setup'] + assert Module.demo_events == ['setup'] assert not space.contains_w(w_modules, space.wrap('_demo')) # first import w_import = space.builtin.get('__import__') w_demo = space.call(w_import, space.newlist([space.wrap('_demo')])) - assert _demo.Module.demo_events == ['setup', 'startup'] + assert Module.demo_events == ['setup', 'startup'] # reload the module, this should not call startup again space.delitem(w_modules, space.wrap('_demo')) w_demo = space.call(w_import, space.newlist([space.wrap('_demo')])) - assert _demo.Module.demo_events == ['setup', 'startup'] + assert Module.demo_events == ['setup', 'startup'] assert space.getattr(w_demo, space.wrap('measuretime')) + + +posixname = 'posix' if sys.platform != 'win32' else 'nt' + +class TestMixedModuleUnfreeze: + spaceconfig = dict(usemodules=('_demo', posixname)) + + def test_random_stuff_can_unfreeze(self): + # When a module contains an "import" statement in applevel code, the + # imported module is initialized, possibly after it has been already + # frozen. + + # This is important when the module startup() function does something + # at runtime, like setting os.environ (posix module) or initializing + # the winsock library (_socket module) + w_posix = self.space.builtin_modules[posixname] + w_demo = self.space.builtin_modules['_demo'] + + w_posix._cleanup_() + assert w_posix.startup_called == False + w_demo._cleanup_() # w_demo.appleveldefs['DemoError'] imports posix + assert w_posix.startup_called == False + diff -Nru pypy-7.1.1+dfsg/pypy/module/errno/__init__.py pypy-7.3.1+dfsg/pypy/module/errno/__init__.py --- pypy-7.1.1+dfsg/pypy/module/errno/__init__.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/errno/__init__.py 2020-04-10 19:28:41.000000000 +0000 @@ -1,26 +0,0 @@ -# Package initialisation -from pypy.interpreter.mixedmodule import MixedModule -import errno - -class Module(MixedModule): - """This module makes available standard errno system symbols. - - The value of each symbol is the corresponding integer value, - e.g., on most systems, errno.ENOENT equals the integer 2. - - The dictionary errno.errorcode maps numeric codes to symbol names, - e.g., errno.errorcode[2] could be the string 'ENOENT'. - - Symbols that are not relevant to the underlying system are not defined. - - To map error codes to error messages, use the function os.strerror(), - e.g. os.strerror(2) could return 'No such file or directory'.""" - - appleveldefs = {} - interpleveldefs = {"errorcode": "interp_errno.get_errorcode(space)"} - -for name in dir(errno): - if name.startswith('__') or name in Module.interpleveldefs: - continue - Module.interpleveldefs[name] = ("space.newint(%s)" % - (getattr(errno, name), )) diff -Nru pypy-7.1.1+dfsg/pypy/module/errno/moduledef.py pypy-7.3.1+dfsg/pypy/module/errno/moduledef.py --- pypy-7.1.1+dfsg/pypy/module/errno/moduledef.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/errno/moduledef.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,26 @@ +# Package initialisation +from pypy.interpreter.mixedmodule import MixedModule +import errno + +class Module(MixedModule): + """This module makes available standard errno system symbols. + + The value of each symbol is the corresponding integer value, + e.g., on most systems, errno.ENOENT equals the integer 2. + + The dictionary errno.errorcode maps numeric codes to symbol names, + e.g., errno.errorcode[2] could be the string 'ENOENT'. + + Symbols that are not relevant to the underlying system are not defined. + + To map error codes to error messages, use the function os.strerror(), + e.g. os.strerror(2) could return 'No such file or directory'.""" + + appleveldefs = {} + interpleveldefs = {"errorcode": "interp_errno.get_errorcode(space)"} + +for name in dir(errno): + if name.startswith('__') or name in Module.interpleveldefs: + continue + Module.interpleveldefs[name] = ("space.newint(%s)" % + (getattr(errno, name), )) diff -Nru pypy-7.1.1+dfsg/pypy/module/exceptions/__init__.py pypy-7.3.1+dfsg/pypy/module/exceptions/__init__.py --- pypy-7.1.1+dfsg/pypy/module/exceptions/__init__.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/exceptions/__init__.py 2020-04-10 19:28:41.000000000 +0000 @@ -1,67 +0,0 @@ -import sys -from pypy.interpreter.mixedmodule import MixedModule - -class Module(MixedModule): - appleveldefs = {} - - interpleveldefs = { - 'ArithmeticError' : 'interp_exceptions.W_ArithmeticError', - 'AssertionError' : 'interp_exceptions.W_AssertionError', - 'AttributeError' : 'interp_exceptions.W_AttributeError', - 'BaseException' : 'interp_exceptions.W_BaseException', - 'BufferError' : 'interp_exceptions.W_BufferError', - 'BytesWarning' : 'interp_exceptions.W_BytesWarning', - 'DeprecationWarning' : 'interp_exceptions.W_DeprecationWarning', - 'EOFError' : 'interp_exceptions.W_EOFError', - 'EnvironmentError' : 'interp_exceptions.W_EnvironmentError', - 'Exception' : 'interp_exceptions.W_Exception', - 'FloatingPointError' : 'interp_exceptions.W_FloatingPointError', - 'FutureWarning' : 'interp_exceptions.W_FutureWarning', - 'GeneratorExit' : 'interp_exceptions.W_GeneratorExit', - 'IOError' : 'interp_exceptions.W_IOError', - 'ImportError' : 'interp_exceptions.W_ImportError', - 'ImportWarning' : 'interp_exceptions.W_ImportWarning', - 'IndentationError' : 'interp_exceptions.W_IndentationError', - 'IndexError' : 'interp_exceptions.W_IndexError', - 'KeyError' : 'interp_exceptions.W_KeyError', - 'KeyboardInterrupt' : 'interp_exceptions.W_KeyboardInterrupt', - 'LookupError' : 'interp_exceptions.W_LookupError', - 'MemoryError' : 'interp_exceptions.W_MemoryError', - 'NameError' : 'interp_exceptions.W_NameError', - 'NotImplementedError' : 'interp_exceptions.W_NotImplementedError', - 'OSError' : 'interp_exceptions.W_OSError', - 'OverflowError' : 'interp_exceptions.W_OverflowError', - 'PendingDeprecationWarning' : 'interp_exceptions.W_PendingDeprecationWarning', - 'ReferenceError' : 'interp_exceptions.W_ReferenceError', - 'RuntimeError' : 'interp_exceptions.W_RuntimeError', - 'RuntimeWarning' : 'interp_exceptions.W_RuntimeWarning', - 'StandardError' : 'interp_exceptions.W_StandardError', - 'StopIteration' : 'interp_exceptions.W_StopIteration', - 'SyntaxError' : 'interp_exceptions.W_SyntaxError', - 'SyntaxWarning' : 'interp_exceptions.W_SyntaxWarning', - 'SystemExit' : 'interp_exceptions.W_SystemExit', - 'SystemError' : 'interp_exceptions.W_SystemError', - 'TabError' : 'interp_exceptions.W_TabError', - 'TypeError' : 'interp_exceptions.W_TypeError', - 'UnboundLocalError' : 'interp_exceptions.W_UnboundLocalError', - 'UnicodeDecodeError' : 'interp_exceptions.W_UnicodeDecodeError', - 'UnicodeEncodeError' : 'interp_exceptions.W_UnicodeEncodeError', - 'UnicodeError' : 'interp_exceptions.W_UnicodeError', - 'UnicodeTranslateError' : 'interp_exceptions.W_UnicodeTranslateError', - 'UnicodeWarning' : 'interp_exceptions.W_UnicodeWarning', - 'UserWarning' : 'interp_exceptions.W_UserWarning', - 'ValueError' : 'interp_exceptions.W_ValueError', - 'Warning' : 'interp_exceptions.W_Warning', - 'ZeroDivisionError' : 'interp_exceptions.W_ZeroDivisionError', - } - - if sys.platform.startswith("win"): - interpleveldefs['WindowsError'] = 'interp_exceptions.W_WindowsError' - - def setup_after_space_initialization(self): - from pypy.objspace.std.transparent import register_proxyable - from pypy.module.exceptions import interp_exceptions - - for name, exc in interp_exceptions.__dict__.items(): - if isinstance(exc, type) and issubclass(exc, interp_exceptions.W_BaseException): - register_proxyable(self.space, exc) diff -Nru pypy-7.1.1+dfsg/pypy/module/exceptions/moduledef.py pypy-7.3.1+dfsg/pypy/module/exceptions/moduledef.py --- pypy-7.1.1+dfsg/pypy/module/exceptions/moduledef.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/exceptions/moduledef.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,67 @@ +import sys +from pypy.interpreter.mixedmodule import MixedModule + +class Module(MixedModule): + appleveldefs = {} + + interpleveldefs = { + 'ArithmeticError' : 'interp_exceptions.W_ArithmeticError', + 'AssertionError' : 'interp_exceptions.W_AssertionError', + 'AttributeError' : 'interp_exceptions.W_AttributeError', + 'BaseException' : 'interp_exceptions.W_BaseException', + 'BufferError' : 'interp_exceptions.W_BufferError', + 'BytesWarning' : 'interp_exceptions.W_BytesWarning', + 'DeprecationWarning' : 'interp_exceptions.W_DeprecationWarning', + 'EOFError' : 'interp_exceptions.W_EOFError', + 'EnvironmentError' : 'interp_exceptions.W_EnvironmentError', + 'Exception' : 'interp_exceptions.W_Exception', + 'FloatingPointError' : 'interp_exceptions.W_FloatingPointError', + 'FutureWarning' : 'interp_exceptions.W_FutureWarning', + 'GeneratorExit' : 'interp_exceptions.W_GeneratorExit', + 'IOError' : 'interp_exceptions.W_IOError', + 'ImportError' : 'interp_exceptions.W_ImportError', + 'ImportWarning' : 'interp_exceptions.W_ImportWarning', + 'IndentationError' : 'interp_exceptions.W_IndentationError', + 'IndexError' : 'interp_exceptions.W_IndexError', + 'KeyError' : 'interp_exceptions.W_KeyError', + 'KeyboardInterrupt' : 'interp_exceptions.W_KeyboardInterrupt', + 'LookupError' : 'interp_exceptions.W_LookupError', + 'MemoryError' : 'interp_exceptions.W_MemoryError', + 'NameError' : 'interp_exceptions.W_NameError', + 'NotImplementedError' : 'interp_exceptions.W_NotImplementedError', + 'OSError' : 'interp_exceptions.W_OSError', + 'OverflowError' : 'interp_exceptions.W_OverflowError', + 'PendingDeprecationWarning' : 'interp_exceptions.W_PendingDeprecationWarning', + 'ReferenceError' : 'interp_exceptions.W_ReferenceError', + 'RuntimeError' : 'interp_exceptions.W_RuntimeError', + 'RuntimeWarning' : 'interp_exceptions.W_RuntimeWarning', + 'StandardError' : 'interp_exceptions.W_StandardError', + 'StopIteration' : 'interp_exceptions.W_StopIteration', + 'SyntaxError' : 'interp_exceptions.W_SyntaxError', + 'SyntaxWarning' : 'interp_exceptions.W_SyntaxWarning', + 'SystemExit' : 'interp_exceptions.W_SystemExit', + 'SystemError' : 'interp_exceptions.W_SystemError', + 'TabError' : 'interp_exceptions.W_TabError', + 'TypeError' : 'interp_exceptions.W_TypeError', + 'UnboundLocalError' : 'interp_exceptions.W_UnboundLocalError', + 'UnicodeDecodeError' : 'interp_exceptions.W_UnicodeDecodeError', + 'UnicodeEncodeError' : 'interp_exceptions.W_UnicodeEncodeError', + 'UnicodeError' : 'interp_exceptions.W_UnicodeError', + 'UnicodeTranslateError' : 'interp_exceptions.W_UnicodeTranslateError', + 'UnicodeWarning' : 'interp_exceptions.W_UnicodeWarning', + 'UserWarning' : 'interp_exceptions.W_UserWarning', + 'ValueError' : 'interp_exceptions.W_ValueError', + 'Warning' : 'interp_exceptions.W_Warning', + 'ZeroDivisionError' : 'interp_exceptions.W_ZeroDivisionError', + } + + if sys.platform.startswith("win"): + interpleveldefs['WindowsError'] = 'interp_exceptions.W_WindowsError' + + def setup_after_space_initialization(self): + from pypy.objspace.std.transparent import register_proxyable + from pypy.module.exceptions import interp_exceptions + + for name, exc in interp_exceptions.__dict__.items(): + if isinstance(exc, type) and issubclass(exc, interp_exceptions.W_BaseException): + register_proxyable(self.space, exc) diff -Nru pypy-7.1.1+dfsg/pypy/module/faulthandler/__init__.py pypy-7.3.1+dfsg/pypy/module/faulthandler/__init__.py --- pypy-7.1.1+dfsg/pypy/module/faulthandler/__init__.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/faulthandler/__init__.py 2020-04-10 19:28:41.000000000 +0000 @@ -1,38 +0,0 @@ -import sys -from pypy.interpreter.mixedmodule import MixedModule - - -class Module(MixedModule): - appleveldefs = { - } - - interpleveldefs = { - 'enable': 'handler.enable', - 'disable': 'handler.disable', - 'is_enabled': 'handler.is_enabled', -# 'register': 'interp_faulthandler.register', -# - 'dump_traceback': 'handler.dump_traceback', -# - '_read_null': 'handler.read_null', - '_sigsegv': 'handler.sigsegv', - '_sigfpe': 'handler.sigfpe', - '_sigabrt': 'handler.sigabrt', - '_stack_overflow': 'handler.stack_overflow', - } - - def setup_after_space_initialization(self): - """NOT_RPYTHON""" - if self.space.config.translation.thread: - self.extra_interpdef('dump_traceback_later', - 'handler.dump_traceback_later') - self.extra_interpdef('cancel_dump_traceback_later', - 'handler.cancel_dump_traceback_later') - if sys.platform != 'win32': - self.extra_interpdef('register', 'handler.register') - self.extra_interpdef('unregister', 'handler.unregister') - - def shutdown(self, space): - from pypy.module.faulthandler import handler - handler.finish(space) - MixedModule.shutdown(self, space) diff -Nru pypy-7.1.1+dfsg/pypy/module/faulthandler/moduledef.py pypy-7.3.1+dfsg/pypy/module/faulthandler/moduledef.py --- pypy-7.1.1+dfsg/pypy/module/faulthandler/moduledef.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/faulthandler/moduledef.py 2020-04-10 19:28:41.000000000 +0000 @@ -0,0 +1,38 @@ +import sys +from pypy.interpreter.mixedmodule import MixedModule + + +class Module(MixedModule): + appleveldefs = { + } + + interpleveldefs = { + 'enable': 'handler.enable', + 'disable': 'handler.disable', + 'is_enabled': 'handler.is_enabled', +# 'register': 'interp_faulthandler.register', +# + 'dump_traceback': 'handler.dump_traceback', +# + '_read_null': 'handler.read_null', + '_sigsegv': 'handler.sigsegv', + '_sigfpe': 'handler.sigfpe', + '_sigabrt': 'handler.sigabrt', + '_stack_overflow': 'handler.stack_overflow', + } + + def setup_after_space_initialization(self): + """NOT_RPYTHON""" + if self.space.config.translation.thread: + self.extra_interpdef('dump_traceback_later', + 'handler.dump_traceback_later') + self.extra_interpdef('cancel_dump_traceback_later', + 'handler.cancel_dump_traceback_later') + if sys.platform != 'win32': + self.extra_interpdef('register', 'handler.register') + self.extra_interpdef('unregister', 'handler.unregister') + + def shutdown(self, space): + from pypy.module.faulthandler import handler + handler.finish(space) + MixedModule.shutdown(self, space) diff -Nru pypy-7.1.1+dfsg/pypy/module/fcntl/__init__.py pypy-7.3.1+dfsg/pypy/module/fcntl/__init__.py --- pypy-7.1.1+dfsg/pypy/module/fcntl/__init__.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/fcntl/__init__.py 2020-04-10 19:28:40.000000000 +0000 @@ -1,22 +0,0 @@ -from pypy.interpreter.mixedmodule import MixedModule -from rpython.rlib.rarithmetic import intmask - -class Module(MixedModule): - interpleveldefs = { - 'fcntl': 'interp_fcntl.fcntl', - 'flock': 'interp_fcntl.flock', - 'lockf': 'interp_fcntl.lockf', - 'ioctl': 'interp_fcntl.ioctl' - } - - appleveldefs = { - '__doc__': 'app_fcntl.__doc__' - } - - def buildloaders(cls): - from pypy.module.fcntl import interp_fcntl - for constant, value in interp_fcntl.constants.iteritems(): - value = intmask(value) - Module.interpleveldefs[constant] = "space.wrap(%r)" % value - super(Module, cls).buildloaders() - buildloaders = classmethod(buildloaders) diff -Nru pypy-7.1.1+dfsg/pypy/module/fcntl/interp_fcntl.py pypy-7.3.1+dfsg/pypy/module/fcntl/interp_fcntl.py --- pypy-7.1.1+dfsg/pypy/module/fcntl/interp_fcntl.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/fcntl/interp_fcntl.py 2020-04-10 19:28:41.000000000 +0000 @@ -80,7 +80,7 @@ def _get_error(space, funcname): errno = rposix.get_saved_errno() return wrap_oserror(space, OSError(errno, funcname), - exception_name = 'w_IOError') + w_exception_class=space.w_IOError) @unwrap_spec(op=int, w_arg=WrappedDefault(0)) def fcntl(space, w_fd, op, w_arg): diff -Nru pypy-7.1.1+dfsg/pypy/module/fcntl/moduledef.py pypy-7.3.1+dfsg/pypy/module/fcntl/moduledef.py --- pypy-7.1.1+dfsg/pypy/module/fcntl/moduledef.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/fcntl/moduledef.py 2020-04-10 19:28:41.000000000 +0000 @@ -0,0 +1,22 @@ +from pypy.interpreter.mixedmodule import MixedModule +from rpython.rlib.rarithmetic import intmask + +class Module(MixedModule): + interpleveldefs = { + 'fcntl': 'interp_fcntl.fcntl', + 'flock': 'interp_fcntl.flock', + 'lockf': 'interp_fcntl.lockf', + 'ioctl': 'interp_fcntl.ioctl' + } + + appleveldefs = { + '__doc__': 'app_fcntl.__doc__' + } + + def buildloaders(cls): + from pypy.module.fcntl import interp_fcntl + for constant, value in interp_fcntl.constants.iteritems(): + value = intmask(value) + Module.interpleveldefs[constant] = "space.wrap(%r)" % value + super(Module, cls).buildloaders() + buildloaders = classmethod(buildloaders) diff -Nru pypy-7.1.1+dfsg/pypy/module/_file/__init__.py pypy-7.3.1+dfsg/pypy/module/_file/__init__.py --- pypy-7.1.1+dfsg/pypy/module/_file/__init__.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_file/__init__.py 2020-04-10 19:28:40.000000000 +0000 @@ -1,33 +0,0 @@ -# Package initialisation -from pypy.interpreter.mixedmodule import MixedModule - - -class Module(MixedModule): - appleveldefs = { - } - - interpleveldefs = { - "file": "interp_file.W_File", - "set_file_encoding": "interp_file.set_file_encoding", - } - - def shutdown(self, space): - # at shutdown, flush all open streams. Ignore I/O errors. - from pypy.module._file.interp_file import getopenstreams, StreamErrors - openstreams = getopenstreams(space) - while openstreams: - for stream in openstreams.keys(): - try: - del openstreams[stream] - except KeyError: - pass # key was removed in the meantime - else: - try: - stream.flush() - except StreamErrors: - pass - - def setup_after_space_initialization(self): - from pypy.module._file.interp_file import W_File - from pypy.objspace.std.transparent import register_proxyable - register_proxyable(self.space, W_File) diff -Nru pypy-7.1.1+dfsg/pypy/module/_file/moduledef.py pypy-7.3.1+dfsg/pypy/module/_file/moduledef.py --- pypy-7.1.1+dfsg/pypy/module/_file/moduledef.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_file/moduledef.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,33 @@ +# Package initialisation +from pypy.interpreter.mixedmodule import MixedModule + + +class Module(MixedModule): + appleveldefs = { + } + + interpleveldefs = { + "file": "interp_file.W_File", + "set_file_encoding": "interp_file.set_file_encoding", + } + + def shutdown(self, space): + # at shutdown, flush all open streams. Ignore I/O errors. + from pypy.module._file.interp_file import getopenstreams, StreamErrors + openstreams = getopenstreams(space) + while openstreams: + for stream in openstreams.keys(): + try: + del openstreams[stream] + except KeyError: + pass # key was removed in the meantime + else: + try: + stream.flush() + except StreamErrors: + pass + + def setup_after_space_initialization(self): + from pypy.module._file.interp_file import W_File + from pypy.objspace.std.transparent import register_proxyable + register_proxyable(self.space, W_File) diff -Nru pypy-7.1.1+dfsg/pypy/module/_file/readinto.py pypy-7.3.1+dfsg/pypy/module/_file/readinto.py --- pypy-7.1.1+dfsg/pypy/module/_file/readinto.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_file/readinto.py 2020-04-10 19:28:40.000000000 +0000 @@ -4,6 +4,14 @@ from rpython.rlib.rposix import c_read from rpython.rtyper.lltypesystem import lltype, rffi from pypy.module._file.interp_file import is_wouldblock_error, signal_checker +from pypy.interpreter.error import oefmt + + +def output_slice(space, rwbuffer, target_pos, data): + if target_pos + len(data) > rwbuffer.getlength(): + raise oefmt(space.w_RuntimeError, + "target buffer has shrunk during operation") + rwbuffer.setslice(target_pos, data) def direct_readinto(self, w_rwbuffer): @@ -27,14 +35,14 @@ MAX_PART = 1024 * 1024 # 1 MB while size > MAX_PART: data = self.direct_read(MAX_PART) - rwbuffer.setslice(target_pos, data) + output_slice(self.space, rwbuffer, target_pos, data) target_pos += len(data) size -= len(data) if len(data) != MAX_PART: break else: data = self.direct_read(size) - rwbuffer.setslice(target_pos, data) + output_slice(self.space, rwbuffer, target_pos, data) target_pos += len(data) else: @@ -46,7 +54,7 @@ initial_size = min(size, stream.count_buffered_bytes()) if initial_size > 0: data = stream.read(initial_size) - rwbuffer.setslice(target_pos, data) + output_slice(self.space, rwbuffer, target_pos, data) target_pos += len(data) size -= len(data) diff -Nru pypy-7.1.1+dfsg/pypy/module/gc/__init__.py pypy-7.3.1+dfsg/pypy/module/gc/__init__.py --- pypy-7.1.1+dfsg/pypy/module/gc/__init__.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/gc/__init__.py 2020-04-10 19:28:41.000000000 +0000 @@ -1,41 +0,0 @@ -from pypy.interpreter.mixedmodule import MixedModule - - -class Module(MixedModule): - interpleveldefs = { - 'collect': 'interp_gc.collect', - 'enable': 'interp_gc.enable', - 'disable': 'interp_gc.disable', - 'isenabled': 'interp_gc.isenabled', - 'enable_finalizers': 'interp_gc.enable_finalizers', - 'disable_finalizers': 'interp_gc.disable_finalizers', - 'garbage': 'space.newlist([])', - #'dump_heap_stats': 'interp_gc.dump_heap_stats', - } - appleveldefs = {} - - def __init__(self, space, w_name): - if (not space.config.translating or - space.config.translation.gctransformer == "framework"): - self.appleveldefs.update({ - 'dump_rpy_heap': 'app_referents.dump_rpy_heap', - 'get_stats': 'app_referents.get_stats', - }) - self.interpleveldefs.update({ - 'collect_step': 'interp_gc.collect_step', - 'get_rpy_roots': 'referents.get_rpy_roots', - 'get_rpy_referents': 'referents.get_rpy_referents', - 'get_rpy_memory_usage': 'referents.get_rpy_memory_usage', - 'get_rpy_type_index': 'referents.get_rpy_type_index', - 'get_objects': 'referents.get_objects', - 'get_referents': 'referents.get_referents', - 'get_referrers': 'referents.get_referrers', - '_get_stats': 'referents.get_stats', - '_dump_rpy_heap': 'referents._dump_rpy_heap', - 'get_typeids_z': 'referents.get_typeids_z', - 'get_typeids_list': 'referents.get_typeids_list', - 'GcRef': 'referents.W_GcRef', - 'hooks': 'space.fromcache(hook.W_AppLevelHooks)', - 'GcCollectStepStats': 'hook.W_GcCollectStepStats', - }) - MixedModule.__init__(self, space, w_name) diff -Nru pypy-7.1.1+dfsg/pypy/module/gc/moduledef.py pypy-7.3.1+dfsg/pypy/module/gc/moduledef.py --- pypy-7.1.1+dfsg/pypy/module/gc/moduledef.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/gc/moduledef.py 2020-04-10 19:28:41.000000000 +0000 @@ -0,0 +1,41 @@ +from pypy.interpreter.mixedmodule import MixedModule + + +class Module(MixedModule): + interpleveldefs = { + 'collect': 'interp_gc.collect', + 'enable': 'interp_gc.enable', + 'disable': 'interp_gc.disable', + 'isenabled': 'interp_gc.isenabled', + 'enable_finalizers': 'interp_gc.enable_finalizers', + 'disable_finalizers': 'interp_gc.disable_finalizers', + 'garbage': 'space.newlist([])', + #'dump_heap_stats': 'interp_gc.dump_heap_stats', + } + appleveldefs = {} + + def __init__(self, space, w_name): + if (not space.config.translating or + space.config.translation.gctransformer == "framework"): + self.appleveldefs.update({ + 'dump_rpy_heap': 'app_referents.dump_rpy_heap', + 'get_stats': 'app_referents.get_stats', + }) + self.interpleveldefs.update({ + 'collect_step': 'interp_gc.collect_step', + 'get_rpy_roots': 'referents.get_rpy_roots', + 'get_rpy_referents': 'referents.get_rpy_referents', + 'get_rpy_memory_usage': 'referents.get_rpy_memory_usage', + 'get_rpy_type_index': 'referents.get_rpy_type_index', + 'get_objects': 'referents.get_objects', + 'get_referents': 'referents.get_referents', + 'get_referrers': 'referents.get_referrers', + '_get_stats': 'referents.get_stats', + '_dump_rpy_heap': 'referents._dump_rpy_heap', + 'get_typeids_z': 'referents.get_typeids_z', + 'get_typeids_list': 'referents.get_typeids_list', + 'GcRef': 'referents.W_GcRef', + 'hooks': 'space.fromcache(hook.W_AppLevelHooks)', + 'GcCollectStepStats': 'hook.W_GcCollectStepStats', + }) + MixedModule.__init__(self, space, w_name) diff -Nru pypy-7.1.1+dfsg/pypy/module/gc/referents.py pypy-7.3.1+dfsg/pypy/module/gc/referents.py --- pypy-7.1.1+dfsg/pypy/module/gc/referents.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/gc/referents.py 2020-04-10 19:28:41.000000000 +0000 @@ -14,6 +14,8 @@ def try_cast_gcref_to_w_root(gcref): + if rgc.get_gcflag_dummy(gcref): + return None w_obj = rgc.try_cast_gcref_to_instance(W_Root, gcref) # Ignore the instances of W_Root that are not really valid as Python # objects. There is e.g. WeakrefLifeline in module/_weakref that diff -Nru pypy-7.1.1+dfsg/pypy/module/_hashlib/__init__.py pypy-7.3.1+dfsg/pypy/module/_hashlib/__init__.py --- pypy-7.1.1+dfsg/pypy/module/_hashlib/__init__.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_hashlib/__init__.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,22 +0,0 @@ -from pypy.interpreter.mixedmodule import MixedModule -from pypy.module._hashlib.interp_hashlib import ( - algorithms, fetch_names, HAS_FAST_PKCS5_PBKDF2_HMAC) - - -class Module(MixedModule): - interpleveldefs = { - 'new' : 'interp_hashlib.new', - } - - appleveldefs = { - } - - for name in algorithms: - interpleveldefs['openssl_' + name] = 'interp_hashlib.new_' + name - - if HAS_FAST_PKCS5_PBKDF2_HMAC: - interpleveldefs['pbkdf2_hmac'] = 'interp_hashlib.pbkdf2_hmac' - - def startup(self, space): - w_meth_names = fetch_names(space) - space.setattr(self, space.newtext('openssl_md_meth_names'), w_meth_names) diff -Nru pypy-7.1.1+dfsg/pypy/module/_hashlib/interp_hashlib.py pypy-7.3.1+dfsg/pypy/module/_hashlib/interp_hashlib.py --- pypy-7.1.1+dfsg/pypy/module/_hashlib/interp_hashlib.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_hashlib/interp_hashlib.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,204 +0,0 @@ -from __future__ import with_statement - -from rpython.rlib import rgc, ropenssl -from rpython.rlib.objectmodel import we_are_translated -from rpython.rlib.rstring import StringBuilder -from rpython.rtyper.lltypesystem import lltype, rffi -from rpython.tool.sourcetools import func_renamer - -from pypy.interpreter.baseobjspace import W_Root -from pypy.interpreter.error import OperationError, oefmt -from pypy.interpreter.gateway import unwrap_spec, interp2app, WrappedDefault -from pypy.interpreter.typedef import TypeDef, GetSetProperty -from pypy.module.thread.os_lock import Lock - - -algorithms = ('md5', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512') - -def hash_name_mapper_callback(obj_name, userdata): - if not obj_name: - return - # Ignore aliased names, they pollute the list and OpenSSL appears - # to have a its own definition of alias as the resulting list - # still contains duplicate and alternate names for several - # algorithms. - if rffi.cast(lltype.Signed, obj_name[0].c_alias): - return - name = rffi.charp2str(obj_name[0].c_name) - global_name_fetcher.meth_names.append(name) - -class NameFetcher: - def setup(self): - self.meth_names = [] - def _cleanup_(self): - self.__dict__.clear() -global_name_fetcher = NameFetcher() - -def fetch_names(space): - global_name_fetcher.setup() - ropenssl.init_digests() - ropenssl.OBJ_NAME_do_all(ropenssl.OBJ_NAME_TYPE_MD_METH, - hash_name_mapper_callback, None) - meth_names = global_name_fetcher.meth_names - global_name_fetcher.meth_names = None - return space.call_function(space.w_frozenset, space.newlist( - [space.newtext(name) for name in meth_names])) - -class W_Hash(W_Root): - NULL_CTX = lltype.nullptr(ropenssl.EVP_MD_CTX.TO) - ctx = NULL_CTX - - def __init__(self, space, name, copy_from=NULL_CTX): - self.name = name - digest_type = self.digest_type_by_name(space) - self.digest_size = ropenssl.EVP_MD_size(digest_type) - - # Allocate a lock for each HASH object. - # An optimization would be to not release the GIL on small requests, - # and use a custom lock only when needed. - self.lock = Lock(space) - - ctx = ropenssl.EVP_MD_CTX_new() - if ctx is None: - raise MemoryError - rgc.add_memory_pressure(ropenssl.HASH_MALLOC_SIZE + self.digest_size, - self) - try: - if copy_from: - if not ropenssl.EVP_MD_CTX_copy(ctx, copy_from): - raise ValueError - else: - ropenssl.EVP_DigestInit(ctx, digest_type) - self.ctx = ctx - except: - ropenssl.EVP_MD_CTX_free(ctx) - raise - self.register_finalizer(space) - - def _finalize_(self): - ctx = self.ctx - if ctx: - self.ctx = lltype.nullptr(ropenssl.EVP_MD_CTX.TO) - ropenssl.EVP_MD_CTX_free(ctx) - - def digest_type_by_name(self, space): - digest_type = ropenssl.EVP_get_digestbyname(self.name) - if not digest_type: - raise oefmt(space.w_ValueError, "unknown hash function") - return digest_type - - def descr_repr(self, space): - addrstring = self.getaddrstring(space) - return space.newtext("<%s HASH object at 0x%s>" % ( - self.name, addrstring)) - - @unwrap_spec(string='bufferstr') - def update(self, space, string): - with rffi.scoped_nonmovingbuffer(string) as buf: - with self.lock: - # XXX try to not release the GIL for small requests - ropenssl.EVP_DigestUpdate(self.ctx, buf, len(string)) - - def copy(self, space): - "Return a copy of the hash object." - with self.lock: - return W_Hash(space, self.name, copy_from=self.ctx) - - def digest(self, space): - "Return the digest value as a string of binary data." - digest = self._digest(space) - return space.newbytes(digest) - - def hexdigest(self, space): - "Return the digest value as a string of hexadecimal digits." - digest = self._digest(space) - hexdigits = '0123456789abcdef' - result = StringBuilder(self.digest_size * 2) - for c in digest: - result.append(hexdigits[(ord(c) >> 4) & 0xf]) - result.append(hexdigits[ ord(c) & 0xf]) - return space.newtext(result.build()) - - def get_digest_size(self, space): - return space.newint(self.digest_size) - - def get_block_size(self, space): - digest_type = self.digest_type_by_name(space) - block_size = ropenssl.EVP_MD_block_size(digest_type) - return space.newint(block_size) - - def get_name(self, space): - return space.newtext(self.name) - - def _digest(self, space): - ctx = ropenssl.EVP_MD_CTX_new() - if ctx is None: - raise MemoryError - try: - with self.lock: - if not ropenssl.EVP_MD_CTX_copy(ctx, self.ctx): - raise ValueError - digest_size = self.digest_size - with rffi.scoped_alloc_buffer(digest_size) as buf: - ropenssl.EVP_DigestFinal(ctx, buf.raw, None) - return buf.str(digest_size) - finally: - ropenssl.EVP_MD_CTX_free(ctx) - - -W_Hash.typedef = TypeDef( - 'HASH', - __repr__=interp2app(W_Hash.descr_repr), - update=interp2app(W_Hash.update), - copy=interp2app(W_Hash.copy), - digest=interp2app(W_Hash.digest), - hexdigest=interp2app(W_Hash.hexdigest), - # - digest_size=GetSetProperty(W_Hash.get_digest_size), - digestsize=GetSetProperty(W_Hash.get_digest_size), - block_size=GetSetProperty(W_Hash.get_block_size), - name=GetSetProperty(W_Hash.get_name), -) -W_Hash.typedef.acceptable_as_base_class = False - -@unwrap_spec(name='text', string='bufferstr') -def new(space, name, string=''): - w_hash = W_Hash(space, name) - w_hash.update(space, string) - return w_hash - -# shortcut functions -def make_new_hash(name, funcname): - @func_renamer(funcname) - @unwrap_spec(string='bufferstr') - def new_hash(space, string=''): - return new(space, name, string) - return new_hash - -for _name in algorithms: - _newname = 'new_%s' % (_name,) - globals()[_newname] = make_new_hash(_name, _newname) - - -HAS_FAST_PKCS5_PBKDF2_HMAC = ropenssl.PKCS5_PBKDF2_HMAC is not None -if HAS_FAST_PKCS5_PBKDF2_HMAC: - @unwrap_spec(name='text', password='bytes', salt='bytes', rounds=int, - w_dklen=WrappedDefault(None)) - def pbkdf2_hmac(space, name, password, salt, rounds, w_dklen): - digest = ropenssl.EVP_get_digestbyname(name) - if not digest: - raise oefmt(space.w_ValueError, "unknown hash function") - if space.is_w(w_dklen, space.w_None): - dklen = ropenssl.EVP_MD_size(digest) - else: - dklen = space.int_w(w_dklen) - if dklen < 1: - raise oefmt(space.w_ValueError, - "key length must be greater than 0.") - with rffi.scoped_alloc_buffer(dklen) as buf: - r = ropenssl.PKCS5_PBKDF2_HMAC( - password, len(password), salt, len(salt), rounds, digest, - dklen, buf.raw) - if not r: - raise ValueError - return space.newbytes(buf.str(dklen)) diff -Nru pypy-7.1.1+dfsg/pypy/module/_hashlib/test/test_hashlib.py pypy-7.3.1+dfsg/pypy/module/_hashlib/test/test_hashlib.py --- pypy-7.1.1+dfsg/pypy/module/_hashlib/test/test_hashlib.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_hashlib/test/test_hashlib.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,123 +0,0 @@ -class AppTestHashlib: - spaceconfig = { - "usemodules": ['_hashlib', 'array', 'struct', 'binascii'], - } - - def test_method_names(self): - import _hashlib - assert isinstance(_hashlib.openssl_md_meth_names, frozenset) - assert "md5" in _hashlib.openssl_md_meth_names - - def test_simple(self): - import _hashlib - assert _hashlib.new('md5').__class__.__name__ == 'HASH' - assert len(_hashlib.new('md5').hexdigest()) == 32 - - def test_attributes(self): - import hashlib - for name, (expected_size, expected_block_size) in { - 'md5': (16, 64), - 'sha1': (20, 64), - 'sha224': (28, 64), - 'sha256': (32, 64), - 'sha384': (48, 128), - 'sha512': (64, 128), - }.items(): - h = hashlib.new(name) - assert h.name == name - assert h.digest_size == expected_size - assert h.digestsize == expected_size - assert h.block_size == expected_block_size - # - h.update('abc') - h2 = h.copy() - h.update('def') - digest = h.digest() - hexdigest = h.hexdigest() - h2.update('d') - h2.update('ef') - assert digest == h2.digest() - assert hexdigest == h2.hexdigest() - assert len(digest) == h.digest_size - assert len(hexdigest) == h.digest_size * 2 - c_digest = digest - c_hexdigest = hexdigest - - # also test the pure Python implementation - py_new = getattr(hashlib, '__get_builtin_constructor') - h = py_new(name)('') - assert h.digest_size == expected_size - assert h.digestsize == expected_size - assert h.block_size == expected_block_size - # - h.update('abc') - h2 = h.copy() - h.update('def') - digest = h.digest() - hexdigest = h.hexdigest() - h2.update('d') - h2.update('ef') - assert digest == h2.digest() - assert hexdigest == h2.hexdigest() - - # compare both implementations - assert c_digest == digest - assert c_hexdigest == hexdigest - - def test_shortcut(self): - import hashlib - assert repr(hashlib.md5()).startswith("= 1.1") - out = pbkdf2_hmac('sha1', 'password', 'salt', 1) - assert out == '0c60c80f961f0e71f3a9b524af6012062fe037a6'.decode('hex') - out = pbkdf2_hmac('sha1', 'password', 'salt', 2, None) - assert out == 'ea6c014dc72d6f8ccd1ed92ace1d41f0d8de8957'.decode('hex') diff -Nru pypy-7.1.1+dfsg/pypy/module/_hashlib/test/test_ztranslation.py pypy-7.3.1+dfsg/pypy/module/_hashlib/test/test_ztranslation.py --- pypy-7.1.1+dfsg/pypy/module/_hashlib/test/test_ztranslation.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_hashlib/test/test_ztranslation.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,4 +0,0 @@ -from pypy.objspace.fake.checkmodule import checkmodule - -def test_checkmodule(): - checkmodule('_hashlib') diff -Nru pypy-7.1.1+dfsg/pypy/module/imp/importing.py pypy-7.3.1+dfsg/pypy/module/imp/importing.py --- pypy-7.1.1+dfsg/pypy/module/imp/importing.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/imp/importing.py 2020-04-10 19:28:41.000000000 +0000 @@ -7,10 +7,11 @@ from pypy.interpreter.module import Module from pypy.interpreter.gateway import interp2app, unwrap_spec from pypy.interpreter.typedef import TypeDef, generic_new_descr -from pypy.interpreter.error import OperationError, oefmt +from pypy.interpreter.error import OperationError, oefmt, wrap_oserror from pypy.interpreter.baseobjspace import W_Root, CannotHaveLock from pypy.interpreter.eval import Code from pypy.interpreter.pycode import PyCode +from pypy.interpreter.streamutil import wrap_streamerror from rpython.rlib import streamio, jit from rpython.rlib.streamio import StreamErrors from rpython.rlib.objectmodel import we_are_translated, specialize @@ -31,14 +32,10 @@ SO = '.pyd' if _WIN32 else '.so' -# this used to change for every minor version, but no longer does: there -# is little point any more, as the so's tend to be cross-version- -# compatible, more so than between various versions of CPython. Be -# careful if we need to update it again: it is now used for both cpyext -# and cffi so's. If we do have to update it, we'd likely need a way to +# Be careful update when changing this: it is now used for both cpyext +# and cffi so's. If we do have to update it, we'd likely need a way to # split the two usages again. -#DEFAULT_SOABI = 'pypy-%d%d' % PYPY_VERSION[:2] -DEFAULT_SOABI = 'pypy-41' +DEFAULT_SOABI = 'pypy-%d%d' % PYPY_VERSION[:2] @specialize.memo() def get_so_extension(space): @@ -451,14 +448,19 @@ return w_loader def _getimporter(space, w_pathitem): - # the function 'imp._getimporter' is a pypy-only extension + # 'imp._getimporter' is somewhat like CPython's get_path_importer w_path_importer_cache = space.sys.get("path_importer_cache") w_importer = space.finditem(w_path_importer_cache, w_pathitem) if w_importer is None: space.setitem(w_path_importer_cache, w_pathitem, space.w_None) for w_hook in space.unpackiterable(space.sys.get("path_hooks")): + w_pathbytes = w_pathitem + if space.isinstance_w(w_pathitem, space.w_unicode): + from pypy.module.sys.interp_encoding import getfilesystemencoding + w_pathbytes = space.call_method(space.w_unicode, 'encode', + w_pathitem, getfilesystemencoding(space)) try: - w_importer = space.call_function(w_hook, w_pathitem) + w_importer = space.call_function(w_hook, w_pathbytes) except OperationError as e: if not e.match(space, space.w_ImportError): raise @@ -659,13 +661,14 @@ if find_info.modtype == PY_SOURCE: return load_source_module( space, w_modulename, w_mod, - find_info.filename, find_info.stream.readall(), + find_info.filename, _wrap_readall(space, find_info.stream), find_info.stream.try_to_find_file_descriptor()) elif find_info.modtype == PY_COMPILED: - magic = _r_long(find_info.stream) - timestamp = _r_long(find_info.stream) + magic = _wrap_r_long(space, find_info.stream) + timestamp = _wrap_r_long(space, find_info.stream) return load_compiled_module(space, w_modulename, w_mod, find_info.filename, - magic, timestamp, find_info.stream.readall()) + magic, timestamp, + _wrap_readall(space, find_info.stream)) elif find_info.modtype == PKG_DIRECTORY: w_path = space.newlist([space.newtext(find_info.filename)]) space.setattr(w_mod, space.newtext('__path__'), w_path) @@ -677,10 +680,7 @@ w_mod = load_module(space, w_modulename, find_info, reuse=True) finally: - try: - find_info.stream.close() - except StreamErrors: - pass + _close_ignore(find_info.stream) return w_mod elif find_info.modtype == C_EXTENSION and has_so_extension(space): return load_c_extension(space, find_info.filename, @@ -712,10 +712,7 @@ if find_info: stream = find_info.stream if stream: - try: - stream.close() - except StreamErrors: - pass + _close_ignore(stream) if tentative: return None @@ -727,7 +724,7 @@ def reload(space, w_module): """Reload the module. The module must have been successfully imported before.""" - if not space.is_w(space.type(w_module), space.type(space.sys)): + if not space.isinstance_w(w_module, space.type(space.sys)): raise oefmt(space.w_TypeError, "reload() argument must be module") w_modulename = space.getattr(w_module, space.newtext("__name__")) @@ -770,7 +767,7 @@ return load_module(space, w_modulename, find_info, reuse=True) finally: if find_info.stream: - find_info.stream.close() + _wrap_close(space, find_info.stream) except: # load_module probably removed name from modules because of # the error. Put back the original module object. @@ -927,7 +924,10 @@ log_pyverbose(space, 1, "import %s # from %s\n" % (space.text_w(w_modulename), pathname)) - src_stat = os.fstat(fd) + try: + src_stat = os.fstat(fd) + except OSError as e: + raise wrap_oserror(space, e, pathname) # better report this error cpathname = pathname + 'c' mtime = int(src_stat[stat.ST_MTIME]) mode = src_stat[stat.ST_MODE] @@ -936,12 +936,10 @@ if stream: # existing and up-to-date .pyc file try: - code_w = read_compiled_module(space, cpathname, stream.readall()) + code_w = read_compiled_module(space, cpathname, + _wrap_readall(space, stream)) finally: - try: - stream.close() - except StreamErrors: - pass + _close_ignore(stream) space.setattr(w_mod, space.newtext('__file__'), space.newtext(cpathname)) else: code_w = parse_source_module(space, pathname, source) @@ -1007,6 +1005,35 @@ d = x & 0xff stream.write(chr(a) + chr(b) + chr(c) + chr(d)) +def _wrap_r_long(space, stream): + """like _r_long(), but raising app-level exceptions""" + try: + return _r_long(stream) + except StreamErrors as e: + raise wrap_streamerror(space, e) + +def _wrap_readall(space, stream): + """stream.readall(), but raising app-level exceptions""" + try: + return stream.readall() + except StreamErrors as e: + raise wrap_streamerror(space, e) + +def _wrap_close(space, stream): + """stream.close(), but raising app-level exceptions""" + try: + stream.close() + except StreamErrors as e: + raise wrap_streamerror(space, e) + +def _close_ignore(stream): + """stream.close(), but ignoring any stream exception""" + try: + stream.close() + except StreamErrors as e: + pass + + def check_compiled_module(space, pycfilename, expected_mtime): """ Check if a pyc file's magic number and mtime match. @@ -1025,10 +1052,7 @@ return stream except StreamErrors: if stream: - try: - stream.close() - except StreamErrors: - pass + _close_ignore(stream) return None # XXX! must not eat all exceptions, e.g. # Out of file descriptors. diff -Nru pypy-7.1.1+dfsg/pypy/module/imp/__init__.py pypy-7.3.1+dfsg/pypy/module/imp/__init__.py --- pypy-7.1.1+dfsg/pypy/module/imp/__init__.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/imp/__init__.py 2020-04-10 19:28:41.000000000 +0000 @@ -1,52 +0,0 @@ -from pypy.interpreter.mixedmodule import MixedModule - -class Module(MixedModule): - """ - This module provides the components needed to build your own - __import__ function. - """ - interpleveldefs = { - 'SEARCH_ERROR': 'space.wrap(importing.SEARCH_ERROR)', - 'PY_SOURCE': 'space.wrap(importing.PY_SOURCE)', - 'PY_COMPILED': 'space.wrap(importing.PY_COMPILED)', - 'C_EXTENSION': 'space.wrap(importing.C_EXTENSION)', - 'PKG_DIRECTORY': 'space.wrap(importing.PKG_DIRECTORY)', - 'C_BUILTIN': 'space.wrap(importing.C_BUILTIN)', - 'PY_FROZEN': 'space.wrap(importing.PY_FROZEN)', - 'IMP_HOOK': 'space.wrap(importing.IMP_HOOK)', - 'get_suffixes': 'interp_imp.get_suffixes', - - 'get_magic': 'interp_imp.get_magic', - 'find_module': 'interp_imp.find_module', - 'load_module': 'interp_imp.load_module', - 'load_source': 'interp_imp.load_source', - 'load_compiled': 'interp_imp.load_compiled', - 'load_dynamic': 'interp_imp.load_dynamic', - '_run_compiled_module': 'interp_imp._run_compiled_module', # pypy - '_getimporter': 'importing._getimporter', # pypy - #'run_module': 'interp_imp.run_module', - 'new_module': 'interp_imp.new_module', - 'init_builtin': 'interp_imp.init_builtin', - 'init_frozen': 'interp_imp.init_frozen', - 'is_builtin': 'interp_imp.is_builtin', - 'is_frozen': 'interp_imp.is_frozen', - 'reload': 'importing.reload', - 'NullImporter': 'importing.W_NullImporter', - - 'lock_held': 'interp_imp.lock_held', - 'acquire_lock': 'interp_imp.acquire_lock', - 'release_lock': 'interp_imp.release_lock', - } - - appleveldefs = { - } - - def __init__(self, space, *args): - "NOT_RPYTHON" - MixedModule.__init__(self, space, *args) - from pypy.module.posix.interp_posix import add_fork_hook - from pypy.module.imp import interp_imp - add_fork_hook('before', interp_imp.acquire_lock) - add_fork_hook('parent', interp_imp.release_lock) - add_fork_hook('child', interp_imp.reinit_lock) - diff -Nru pypy-7.1.1+dfsg/pypy/module/imp/interp_imp.py pypy-7.3.1+dfsg/pypy/module/imp/interp_imp.py --- pypy-7.1.1+dfsg/pypy/module/imp/interp_imp.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/imp/interp_imp.py 2020-04-10 19:28:41.000000000 +0000 @@ -104,9 +104,10 @@ w_mod = importing.load_source_module( space, w_modulename, w_mod, - filename, stream.readall(), stream.try_to_find_file_descriptor()) + filename, importing._wrap_readall(space, stream), + stream.try_to_find_file_descriptor()) if space.is_none(w_file): - stream.close() + importing._wrap_close(space, stream) return w_mod @unwrap_spec(filename='fsencode', check_afterwards=int) @@ -115,14 +116,15 @@ # the function 'imp._run_compiled_module' is a pypy-only extension stream = get_file(space, w_file, filename, 'rb') - magic = importing._r_long(stream) - timestamp = importing._r_long(stream) + magic = importing._wrap_r_long(space, stream) + timestamp = importing._wrap_r_long(space, stream) w_mod = importing.load_compiled_module( space, w_modulename, w_module, filename, magic, timestamp, - stream.readall(), check_afterwards=check_afterwards) + importing._wrap_readall(space, stream), + check_afterwards=check_afterwards) if space.is_none(w_file): - stream.close() + importing._wrap_close(space, stream) return w_mod @unwrap_spec(filename='fsencode') diff -Nru pypy-7.1.1+dfsg/pypy/module/imp/moduledef.py pypy-7.3.1+dfsg/pypy/module/imp/moduledef.py --- pypy-7.1.1+dfsg/pypy/module/imp/moduledef.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/imp/moduledef.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,52 @@ +from pypy.interpreter.mixedmodule import MixedModule + +class Module(MixedModule): + """ + This module provides the components needed to build your own + __import__ function. + """ + interpleveldefs = { + 'SEARCH_ERROR': 'space.wrap(importing.SEARCH_ERROR)', + 'PY_SOURCE': 'space.wrap(importing.PY_SOURCE)', + 'PY_COMPILED': 'space.wrap(importing.PY_COMPILED)', + 'C_EXTENSION': 'space.wrap(importing.C_EXTENSION)', + 'PKG_DIRECTORY': 'space.wrap(importing.PKG_DIRECTORY)', + 'C_BUILTIN': 'space.wrap(importing.C_BUILTIN)', + 'PY_FROZEN': 'space.wrap(importing.PY_FROZEN)', + 'IMP_HOOK': 'space.wrap(importing.IMP_HOOK)', + 'get_suffixes': 'interp_imp.get_suffixes', + + 'get_magic': 'interp_imp.get_magic', + 'find_module': 'interp_imp.find_module', + 'load_module': 'interp_imp.load_module', + 'load_source': 'interp_imp.load_source', + 'load_compiled': 'interp_imp.load_compiled', + 'load_dynamic': 'interp_imp.load_dynamic', + '_run_compiled_module': 'interp_imp._run_compiled_module', # pypy + '_getimporter': 'importing._getimporter', # pypy + #'run_module': 'interp_imp.run_module', + 'new_module': 'interp_imp.new_module', + 'init_builtin': 'interp_imp.init_builtin', + 'init_frozen': 'interp_imp.init_frozen', + 'is_builtin': 'interp_imp.is_builtin', + 'is_frozen': 'interp_imp.is_frozen', + 'reload': 'importing.reload', + 'NullImporter': 'importing.W_NullImporter', + + 'lock_held': 'interp_imp.lock_held', + 'acquire_lock': 'interp_imp.acquire_lock', + 'release_lock': 'interp_imp.release_lock', + } + + appleveldefs = { + } + + def __init__(self, space, *args): + "NOT_RPYTHON" + MixedModule.__init__(self, space, *args) + from pypy.module.posix.interp_posix import add_fork_hook + from pypy.module.imp import interp_imp + add_fork_hook('before', interp_imp.acquire_lock) + add_fork_hook('parent', interp_imp.release_lock) + add_fork_hook('child', interp_imp.reinit_lock) + diff -Nru pypy-7.1.1+dfsg/pypy/module/imp/test/test_app.py pypy-7.3.1+dfsg/pypy/module/imp/test/test_app.py --- pypy-7.1.1+dfsg/pypy/module/imp/test/test_app.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/imp/test/test_app.py 2020-04-10 19:28:41.000000000 +0000 @@ -4,7 +4,8 @@ class AppTestImpModule: spaceconfig = { - 'usemodules': ['binascii', 'imp', 'itertools', 'time', 'struct'], + 'usemodules': ['binascii', 'imp', 'itertools', 'time', 'struct', + 'zipimport'], } def setup_class(cls): @@ -246,3 +247,14 @@ assert marshal.loads == 42 marshal.loads = old + + def test_unicode_in_sys_path(self): + # issue 3112: when _getimporter calls + # for x in sys.path: for h in sys.path_hooks: h(x) + # make sure x is properly encoded + import sys + import zipimport # installs a sys.path_hook + if sys.getfilesystemencoding().lower() == 'utf-8': + sys.path.insert(0, u'\xef') + with raises(ImportError): + import impossible_module diff -Nru pypy-7.1.1+dfsg/pypy/module/imp/test/test_import.py pypy-7.3.1+dfsg/pypy/module/imp/test/test_import.py --- pypy-7.1.1+dfsg/pypy/module/imp/test/test_import.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/imp/test/test_import.py 2020-04-10 19:28:40.000000000 +0000 @@ -656,6 +656,20 @@ def test_reload_infinite(self): import infinite_reload + def test_reload_module_subclass(self): + import types + + #MyModType = types.ModuleType + class MyModType(types.ModuleType): + pass + + m = MyModType("abc") + with raises(ImportError): + # Fails because the module is not in sys.modules, but *not* because + # it's a subtype of ModuleType. + reload(m) + + def test_explicitly_missing(self): import sys sys.modules['foobarbazmod'] = None diff -Nru pypy-7.1.1+dfsg/pypy/module/_io/__init__.py pypy-7.3.1+dfsg/pypy/module/_io/__init__.py --- pypy-7.1.1+dfsg/pypy/module/_io/__init__.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_io/__init__.py 2020-04-10 19:28:40.000000000 +0000 @@ -1,34 +0,0 @@ -from pypy.interpreter.mixedmodule import MixedModule - -class Module(MixedModule): - - appleveldefs = { - } - - interpleveldefs = { - 'DEFAULT_BUFFER_SIZE': 'space.wrap(interp_iobase.DEFAULT_BUFFER_SIZE)', - 'BlockingIOError': 'interp_io.W_BlockingIOError', - 'UnsupportedOperation': - 'space.fromcache(interp_io.Cache).w_unsupportedoperation', - '_IOBase': 'interp_iobase.W_IOBase', - '_RawIOBase': 'interp_iobase.W_RawIOBase', - '_BufferedIOBase': 'interp_bufferedio.W_BufferedIOBase', - '_TextIOBase': 'interp_textio.W_TextIOBase', - - 'FileIO': 'interp_fileio.W_FileIO', - 'BytesIO': 'interp_bytesio.W_BytesIO', - 'StringIO': 'interp_stringio.W_StringIO', - 'BufferedReader': 'interp_bufferedio.W_BufferedReader', - 'BufferedWriter': 'interp_bufferedio.W_BufferedWriter', - 'BufferedRWPair': 'interp_bufferedio.W_BufferedRWPair', - 'BufferedRandom': 'interp_bufferedio.W_BufferedRandom', - 'TextIOWrapper': 'interp_textio.W_TextIOWrapper', - - 'open': 'interp_io.open', - 'IncrementalNewlineDecoder': 'interp_textio.W_IncrementalNewlineDecoder', - } - - def shutdown(self, space): - # at shutdown, flush all open streams. Ignore I/O errors. - from pypy.module._io.interp_iobase import get_autoflusher - get_autoflusher(space).flush_all(space) diff -Nru pypy-7.1.1+dfsg/pypy/module/_io/interp_bufferedio.py pypy-7.3.1+dfsg/pypy/module/_io/interp_bufferedio.py --- pypy-7.1.1+dfsg/pypy/module/_io/interp_bufferedio.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_io/interp_bufferedio.py 2020-04-10 19:28:40.000000000 +0000 @@ -9,7 +9,7 @@ from pypy.interpreter.gateway import interp2app, unwrap_spec, WrappedDefault from pypy.interpreter.buffer import SimpleView -from rpython.rlib.buffer import ByteBuffer, SubBuffer +from rpython.rlib.buffer import ByteBuffer, RawByteBuffer, SubBuffer from rpython.rlib.rstring import StringBuilder from rpython.rlib.rarithmetic import r_longlong, intmask from rpython.rlib import rposix @@ -101,7 +101,7 @@ raise oefmt(space.w_TypeError, "%s() should return bytes", methodname) data = space.bytes_w(w_data) - rwbuffer.setslice(0, data) + self.output_slice(space, rwbuffer, 0, data) return space.newint(len(data)) W_BufferedIOBase.typedef = TypeDef( @@ -152,7 +152,14 @@ raise oefmt(space.w_ValueError, "buffer size must be strictly positive") - self.buffer = ByteBuffer(self.buffer_size) + if space.config.translation.split_gc_address_space: + # When using split GC address space, it is not possible to get the + # raw address of a GC buffer. Therefore we use a buffer backed by + # raw memory. + self.buffer = RawByteBuffer(self.buffer_size) + else: + # TODO: test whether using the raw buffer is faster + self.buffer = ByteBuffer(self.buffer_size) self.lock = TryLock(space) @@ -555,7 +562,7 @@ remaining = n written = 0 if current_size: - result_buffer.setslice( + self.output_slice(space, result_buffer, written, self.buffer[self.pos:self.pos + current_size]) remaining -= current_size written += current_size @@ -600,7 +607,7 @@ if remaining > 0: if size > remaining: size = remaining - result_buffer.setslice( + self.output_slice(space, result_buffer, written, self.buffer[self.pos:self.pos + size]) self.pos += size written += size @@ -668,8 +675,7 @@ pos = 0 found = False while pos < have: - # 'buffer.data[]' instead of 'buffer[]' because RPython... - c = self.buffer.data[pos] + c = self.buffer.getitem(pos) pos += 1 if c == '\n': self.pos = pos @@ -731,8 +737,7 @@ self._reader_reset_buf() # Make some place by shifting the buffer for i in range(self.write_pos, self.write_end): - # XXX: messing with buffer internals - self.buffer.data[i - self.write_pos] = self.buffer.data[i] + self.buffer.setitem(i - self.write_pos, self.buffer.getitem(i)) self.write_end -= self.write_pos self.raw_pos -= self.write_pos newpos = self.pos - self.write_pos diff -Nru pypy-7.1.1+dfsg/pypy/module/_io/interp_bytesio.py pypy-7.3.1+dfsg/pypy/module/_io/interp_bytesio.py --- pypy-7.1.1+dfsg/pypy/module/_io/interp_bytesio.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_io/interp_bytesio.py 2020-04-10 19:28:40.000000000 +0000 @@ -48,7 +48,7 @@ size = rwbuffer.getlength() output = self.read(size) - rwbuffer.setslice(0, output) + self.output_slice(space, rwbuffer, 0, output) return space.newint(len(output)) def write_w(self, space, w_data): diff -Nru pypy-7.1.1+dfsg/pypy/module/_io/interp_fileio.py pypy-7.3.1+dfsg/pypy/module/_io/interp_fileio.py --- pypy-7.1.1+dfsg/pypy/module/_io/interp_fileio.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_io/interp_fileio.py 2020-04-10 19:28:40.000000000 +0000 @@ -173,7 +173,7 @@ space, w_name, flags, 0666) except OSError as e: raise wrap_oserror2(space, e, w_name, - exception_name='w_IOError') + w_exception_class=space.w_IOError) finally: fd_is_own = True @@ -186,7 +186,7 @@ try: os.lseek(self.fd, 0, os.SEEK_END) except OSError as e: - raise wrap_oserror(space, e, exception_name='w_IOError') + raise wrap_oserror(space, e, w_exception_class=space.w_IOError) except: if not fd_is_own: self.fd = -1 @@ -235,8 +235,7 @@ try: os.close(fd) except OSError as e: - raise wrap_oserror(space, e, - exception_name='w_IOError') + raise wrap_oserror(space, e, w_exception_class=space.w_IOError) def close_w(self, space): try: @@ -264,7 +263,7 @@ return if stat.S_ISDIR(st.st_mode): raise wrap_oserror2(space, OSError(errno.EISDIR, "fstat"), - w_filename, exception_name='w_IOError') + w_filename, w_exception_class=space.w_IOError) @unwrap_spec(pos=r_longlong, whence=int) def seek_w(self, space, pos, whence=0): @@ -273,7 +272,7 @@ pos = os.lseek(self.fd, pos, whence) except OSError as e: raise wrap_oserror(space, e, - exception_name='w_IOError') + w_exception_class=space.w_IOError) return space.newint(pos) def tell_w(self, space): @@ -282,7 +281,7 @@ pos = os.lseek(self.fd, 0, 1) except OSError as e: raise wrap_oserror(space, e, - exception_name='w_IOError') + w_exception_class=space.w_IOError) return space.newint(pos) def readable_w(self, space): @@ -315,7 +314,7 @@ try: res = os.isatty(self.fd) except OSError as e: - raise wrap_oserror(space, e, exception_name='w_IOError') + raise wrap_oserror(space, e, w_exception_class=space.w_IOError) return space.newbool(res) def repr_w(self, space): @@ -345,7 +344,7 @@ if e.errno == errno.EAGAIN: return space.w_None raise wrap_oserror(space, e, - exception_name='w_IOError') + w_exception_class=space.w_IOError) return space.newint(n) @@ -363,7 +362,7 @@ if e.errno == errno.EAGAIN: return space.w_None raise wrap_oserror(space, e, - exception_name='w_IOError') + w_exception_class=space.w_IOError) return space.newbytes(s) @@ -388,8 +387,8 @@ if e.errno == errno.EAGAIN: return space.w_None raise wrap_oserror(space, e, - exception_name='w_IOError') - rwbuffer.setslice(0, buf) + w_exception_class=space.w_IOError) + self.output_slice(space, rwbuffer, 0, buf) return space.newint(len(buf)) else: # optimized case: reading more than 64 bytes into a rwbuffer @@ -404,7 +403,7 @@ if err == errno.EAGAIN: return space.w_None e = OSError(err, "read failed") - raise wrap_oserror(space, e, exception_name='w_IOError') + raise wrap_oserror(space, e, w_exception_class=space.w_IOError) def readall_w(self, space): self._check_closed(space) @@ -427,7 +426,7 @@ if e.errno == errno.EAGAIN: return space.w_None raise wrap_oserror(space, e, - exception_name='w_IOError') + w_exception_class=space.w_IOError) if not chunk: break @@ -452,7 +451,7 @@ try: self._truncate(space.r_longlong_w(w_size)) except OSError as e: - raise wrap_oserror(space, e, exception_name='w_IOError') + raise wrap_oserror(space, e, w_exception_class=space.w_IOError) return w_size diff -Nru pypy-7.1.1+dfsg/pypy/module/_io/interp_iobase.py pypy-7.3.1+dfsg/pypy/module/_io/interp_iobase.py --- pypy-7.1.1+dfsg/pypy/module/_io/interp_iobase.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_io/interp_iobase.py 2020-04-10 19:28:40.000000000 +0000 @@ -55,7 +55,7 @@ # `__IOBase_closed` and call flush() by itself, but it is redundant # with whatever behaviour a non-trivial derived class will implement. self.space = space - self.w_dict = space.newdict() + self.w_dict = space.newdict(instance=True) self.__IOBase_closed = False if add_to_autoflusher: get_autoflusher(space).add(self) @@ -275,6 +275,14 @@ else: break + @staticmethod + def output_slice(space, rwbuffer, target_pos, data): + if target_pos + len(data) > rwbuffer.getlength(): + raise oefmt(space.w_RuntimeError, + "target buffer has shrunk during operation") + rwbuffer.setslice(target_pos, data) + + W_IOBase.typedef = TypeDef( '_io._IOBase', __new__ = generic_new_descr(W_IOBase), diff -Nru pypy-7.1.1+dfsg/pypy/module/_io/interp_stringio.py pypy-7.3.1+dfsg/pypy/module/_io/interp_stringio.py --- pypy-7.1.1+dfsg/pypy/module/_io/interp_stringio.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_io/interp_stringio.py 2020-04-10 19:28:40.000000000 +0000 @@ -1,81 +1,78 @@ -from rpython.rlib.rutf8 import get_utf8_length, next_codepoint_pos +from rpython.rlib.rutf8 import ( + codepoints_in_utf8, codepoint_at_pos, Utf8StringIterator, + Utf8StringBuilder) +from rpython.rlib.signature import signature, finishsigs +from rpython.rlib import types from pypy.interpreter.error import OperationError, oefmt from pypy.interpreter.typedef import ( TypeDef, generic_new_descr, GetSetProperty) from pypy.interpreter.gateway import interp2app, unwrap_spec, WrappedDefault from pypy.module._io.interp_textio import ( - W_TextIOBase, W_IncrementalNewlineDecoder) + W_TextIOBase, W_IncrementalNewlineDecoder) from pypy.module._io.interp_iobase import convert_size +from pypy.objspace.std.unicodeobject import W_UnicodeObject + + +def _find_end(start, size, total): + available = total - start + if size >= 0 and size <= available: + end = start + size + else: + end = total + assert 0 <= start and 0 <= end + return end class UnicodeIO(object): - def __init__(self, data=None, pos=0): + def __init__(self, data=None): if data is None: data = '' self.data = [] - self.pos = 0 - # break the data into unicode codepoints - _pos = 0 - while _pos < pos: - _pos = next_codepoint_pos(data, _pos) - if _pos >= len(data): - break - self.write(data[_pos:]) - self.pos = pos + self.write(data, 0) def resize(self, newlength): if len(self.data) > newlength: self.data = self.data[:newlength] if len(self.data) < newlength: - self.data.extend(['\0'] * (newlength - len(self.data))) + self.data.extend([u'\0'] * (newlength - len(self.data))) - def read(self, size): - start = self.pos - available = len(self.data) - start - if available <= 0: - return '' - if size >= 0 and size <= available: - end = start + size - else: - end = len(self.data) - assert 0 <= start <= end - self.pos = end - return ''.join(self.data[start:end]) - - def _convert_limit(self, limit): - if limit < 0 or limit > len(self.data) - self.pos: - limit = len(self.data) - self.pos - assert limit >= 0 + def read(self, start, size): + end = _find_end(start, size, len(self.data)) + return u''.join(self.data[start:end]) + + def _convert_limit(self, limit, start): + if limit < 0 or limit > len(self.data) - start: + limit = len(self.data) - start + if limit < 0: # happens when self.pos > len(self.data) + limit = 0 return limit - def readline_universal(self, limit): + def readline_universal(self, start, limit): # Universal newline search. Find any of \r, \r\n, \n - limit = self._convert_limit(limit) - start = self.pos + limit = self._convert_limit(limit, start) end = start + limit pos = start while pos < end: ch = self.data[pos] pos += 1 - if ch == '\n': + if ch == u'\n': break - if ch == '\r': + if ch == u'\r': if pos >= end: break - if self.data[pos] == '\n': + if self.data[pos] == u'\n': pos += 1 break else: break - self.pos = pos - result = ''.join(self.data[start:pos]) + result = u''.join(self.data[start:pos]) return result - def readline(self, marker, limit): - start = self.pos - limit = self._convert_limit(limit) + def readline(self, marker, start, limit): + limit = self._convert_limit(limit, start) end = start + limit found = False + marker = marker.decode('utf-8') for pos in range(start, end - len(marker) + 1): ch = self.data[pos] if ch == marker[0]: @@ -88,41 +85,47 @@ break if not found: pos = end - self.pos = pos - result = ''.join(self.data[start:pos]) + result = u''.join(self.data[start:pos]) return result - def write(self, string): - length = get_utf8_length(string) - if self.pos + length > len(self.data): - self.resize(self.pos + length) - pos = 0 - for i in range(length): - nextpos = next_codepoint_pos(string, pos) - self.data[self.pos + i] = string[pos:nextpos] - pos = nextpos - self.pos += length - - def seek(self, pos): - self.pos = pos + def write(self, string, start): + ustr = string.decode('utf-8') + newlen = start + len(ustr) + if newlen > len(self.data): + self.resize(newlen) + for i in range(len(ustr)): + self.data[start + i] = ustr[i] + return len(ustr) def truncate(self, size): if size < len(self.data): self.resize(size) def getvalue(self): - return ''.join(self.data) + return u''.join(self.data).encode('utf-8') +READING, ACCUMULATING, RWBUFFER, CLOSED = range(4) +@finishsigs class W_StringIO(W_TextIOBase): def __init__(self, space): W_TextIOBase.__init__(self, space) - self.buf = UnicodeIO() + self.buf = None + self.w_value = W_UnicodeObject.EMPTY + self.builder = None + self.pos = 0 + self.state = READING - @unwrap_spec(w_newline=WrappedDefault("\n")) - def descr_init(self, space, w_initvalue=None, w_newline=None): - # In case __init__ is called multiple times - self.buf = UnicodeIO() + def get_length(self): + """Return the total size (in codepoints) of the object""" + if self.state == READING: + return self.w_value._len() + elif self.state == ACCUMULATING: + return self.builder.getlength() + else: + return len(self.buf.data) + + def _init_newline(self, space, w_newline): self.w_decoder = None self.readnl = None self.writenl = None @@ -154,19 +157,30 @@ space.newint(int(self.readtranslate)) ) + + @unwrap_spec(w_newline = WrappedDefault(u"\n")) + def descr_init(self, space, w_initvalue=None, w_newline=None): + # In case __init__ is called multiple times + self.buf = None + self.pos = 0 + self._init_newline(space, w_newline) + if not space.is_none(w_initvalue): - self.write_w(space, w_initvalue) - self.buf.pos = 0 + self.w_value = self._decode_string(space, w_initvalue) + else: + self.w_value = W_UnicodeObject.EMPTY + self.state = READING def descr_getstate(self, space): w_initialval = self.getvalue_w(space) w_dict = space.call_method(self.w_dict, "copy") - if self.readnl is None: + readnl = self.readnl + if readnl is None: w_readnl = space.w_None else: - w_readnl = space.str(space.newutf8(self.readnl, get_utf8_length(self.readnl))) # YYY + w_readnl = space.str(space.newutf8(readnl, codepoints_in_utf8(readnl))) # YYY return space.newtuple([ - w_initialval, w_readnl, space.newint(self.buf.pos), w_dict + w_initialval, w_readnl, space.newint(self.pos), w_dict ]) def descr_setstate(self, space, w_state): @@ -181,23 +195,17 @@ "%T.__setstate__ argument should be a 4-tuple, got %T", self, w_state) w_initval, w_readnl, w_pos, w_dict = space.unpackiterable(w_state, 4) - if not space.isinstance_w(w_initval, space.w_unicode): - raise oefmt(space.w_TypeError, - "unicode argument expected, got '%T'", w_initval) - # Initialize state - self.descr_init(space, None, w_readnl) - - # Restore the buffer state. We're not doing it via __init__ - # because the string value in the state tuple has already been - # translated once by __init__. So we do not take any chance and replace - # object's buffer completely - initval = space.utf8_w(w_initval) + self.w_value = space.interp_w(W_UnicodeObject, w_initval) + self.buf = None + self.builder = None + self.state = READING + self._init_newline(space, w_readnl) + pos = space.getindex_w(w_pos, space.w_TypeError) if pos < 0: raise oefmt(space.w_ValueError, "position value cannot be negative") - self.buf = UnicodeIO(initval) - self.buf.seek(pos) + self.pos = pos if not space.is_w(w_dict, space.w_None): if not space.isinstance_w(w_dict, space.w_dict): raise oefmt( @@ -208,56 +216,169 @@ space.call_method(self.w_dict, "update", w_dict) def _check_closed(self, space, message=None): - if self.buf is None: + if self.state == CLOSED: if message is None: message = "I/O operation on closed file" raise OperationError(space.w_ValueError, space.newtext(message)) - def write_w(self, space, w_obj): + @signature( + types.self(), types.any(), types.any(), + returns=types.instance(W_UnicodeObject)) + def _decode_string(self, space, w_obj): if not space.isinstance_w(w_obj, space.w_unicode): raise oefmt(space.w_TypeError, "unicode argument expected, got '%T'", w_obj) self._check_closed(space) - orig_size = space.len_w(w_obj) if self.w_decoder is not None: w_decoded = space.call_method( self.w_decoder, "decode", w_obj, space.w_True) else: w_decoded = w_obj - if self.writenl: + writenl = self.writenl + if writenl is not None: w_decoded = space.call_method( w_decoded, "replace", - space.newtext("\n"), space.newutf8(self.writenl, - get_utf8_length(self.writenl))) - string = space.utf8_w(w_decoded) - if string: - self.buf.write(string) + space.newtext("\n"), + space.newutf8(writenl, codepoints_in_utf8(writenl)), + ) + w_decoded = space.interp_w(W_UnicodeObject, w_decoded) + return w_decoded + def write_w(self, space, w_obj): + w_decoded = self._decode_string(space, w_obj) + string = space.utf8_w(w_decoded) + orig_size = space.len_w(w_obj) + if not string: + return space.newint(orig_size) + if self.state == READING: + if self.pos == self.get_length(): + # switch to ACCUMULATING + self.builder = Utf8StringBuilder() + self.builder.append_utf8(self.w_value._utf8, self.w_value._len()) + self.w_value = None + self.state = ACCUMULATING + else: + # switch to RWBUFFER + self.buf = UnicodeIO(space.utf8_w(self.w_value)) + self.w_value = None + self.state = RWBUFFER + elif self.state == ACCUMULATING and self.pos != self.get_length(): + s = self.builder.build() + self.buf = UnicodeIO(s) + self.builder = None + self.state = RWBUFFER + + if self.state == ACCUMULATING: + written = w_decoded._len() + self.builder.append_utf8(string, written) + else: + assert self.state == RWBUFFER + written = self.buf.write(string, self.pos) + self.pos += written return space.newint(orig_size) + def _realize(self, space): + """Switch from ACCUMULATING to READING""" + s = self.builder.build() + length = self.builder.getlength() + self.w_value = space.newutf8(s, length) + self.builder = None + self.state = READING + def read_w(self, space, w_size=None): self._check_closed(space) size = convert_size(space, w_size) - v = self.buf.read(size) - lgt = get_utf8_length(v) - return space.newutf8(v, lgt) + if self.pos >= self.get_length(): + return W_UnicodeObject.EMPTY + if self.state == ACCUMULATING: + self._realize(space) + if self.state == READING: + length = self.w_value._len() + end = _find_end(self.pos, size, length) + if self.pos > end: + return space.newutf8('', 0) + w_res = self.w_value._unicode_sliced(space, self.pos, end) + self.pos = end + return w_res + assert self.state == RWBUFFER + result_u = self.buf.read(self.pos, size) + self.pos += len(result_u) + return space.newutf8(result_u.encode('utf-8'), len(result_u)) def readline_w(self, space, w_limit=None): self._check_closed(space) limit = convert_size(space, w_limit) + if self.pos >= self.get_length(): + return W_UnicodeObject.EMPTY + if self.state == ACCUMULATING: + self._realize(space) + if self.state == READING: + length = self.w_value._len() + end = _find_end(self.pos, limit, length) + if self.readuniversal: + start = self.pos + start_offset = self.w_value._index_to_byte(start) + it = Utf8StringIterator(self.w_value._utf8) + it._pos = start_offset + for ch in it: + if self.pos >= end: + break + if ch == ord(u'\n'): + self.pos += 1 + break + elif ch == ord(u'\r'): + self.pos += 1 + if self.pos >= end: + break + if it.next() == ord(u'\n'): + self.pos += 1 + break + else: + # `it` has gone one char too far, but we don't care + break + self.pos += 1 + w_res = self.w_value._unicode_sliced(space, start, self.pos) + return w_res + else: + if self.readtranslate: + # Newlines are already translated, only search for \n + newline = '\n' + else: + newline = self.readnl + + start = self.pos + start_offset = self.w_value._index_to_byte(start) + it = Utf8StringIterator(self.w_value._utf8) + it._pos = start_offset + for ch in it: + if self.pos >= end: + break + self.pos += 1 + if ch == ord(newline[0]): + if len(newline) == 1 or self.pos >= end: + break + else: + ch = codepoint_at_pos(self.w_value._utf8, it.get_pos()) + if ch == ord(newline[1]): + self.pos += 1 + break + else: + continue + w_res = self.w_value._unicode_sliced(space, start, self.pos) + return w_res + if self.readuniversal: - result = self.buf.readline_universal(limit) + result_u = self.buf.readline_universal(self.pos, limit) else: if self.readtranslate: # Newlines are already translated, only search for \n newline = '\n' else: newline = self.readnl - result = self.buf.readline(newline, limit) - resultlen = get_utf8_length(result) - return space.newutf8(result, resultlen) - + result_u = self.buf.readline(newline, self.pos, limit) + self.pos += len(result_u) + return space.newutf8(result_u.encode('utf-8'), len(result_u)) @unwrap_spec(pos=int, mode=int) def seek_w(self, space, pos, mode=0): @@ -267,34 +388,44 @@ raise oefmt(space.w_ValueError, "Invalid whence (%d, should be 0, 1 or 2)", mode) elif mode == 0 and pos < 0: - raise oefmt(space.w_ValueError, "negative seek position: %d", pos) + raise oefmt(space.w_ValueError, "Negative seek position %d", pos) elif mode != 0 and pos != 0: raise oefmt(space.w_IOError, "Can't do nonzero cur-relative seeks") # XXX: this makes almost no sense, but its how CPython does it. if mode == 1: - pos = self.buf.pos + pos = self.pos elif mode == 2: - pos = len(self.buf.data) + pos = self.get_length() assert pos >= 0 - self.buf.seek(pos) + self.pos = pos return space.newint(pos) def truncate_w(self, space, w_size=None): self._check_closed(space) if space.is_none(w_size): - size = self.buf.pos + size = self.pos else: size = space.int_w(w_size) if size < 0: raise oefmt(space.w_ValueError, "Negative size value %d", size) - self.buf.truncate(size) + if self.state == ACCUMULATING: + self._realize(space) + if self.state == READING: + if size < self.w_value._len(): + self.w_value = self.w_value._unicode_sliced(space, 0, size) + else: + self.buf.truncate(size) return space.newint(size) def getvalue_w(self, space): self._check_closed(space) + if self.state == ACCUMULATING: + self._realize(space) + if self.state == READING: + return self.w_value v = self.buf.getvalue() - lgt = get_utf8_length(v) + lgt = codepoints_in_utf8(v) return space.newutf8(v, lgt) def readable_w(self, space): @@ -311,9 +442,10 @@ def close_w(self, space): self.buf = None + self.state = CLOSED def closed_get_w(self, space): - return space.newbool(self.buf is None) + return space.newbool(self.state == CLOSED) def line_buffering_get_w(self, space): return space.w_False diff -Nru pypy-7.1.1+dfsg/pypy/module/_io/interp_textio.py pypy-7.3.1+dfsg/pypy/module/_io/interp_textio.py --- pypy-7.1.1+dfsg/pypy/module/_io/interp_textio.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_io/interp_textio.py 2020-04-10 19:28:40.000000000 +0000 @@ -12,7 +12,7 @@ from rpython.rlib.rbigint import rbigint from rpython.rlib.rstring import StringBuilder from rpython.rlib.rutf8 import (check_utf8, next_codepoint_pos, - codepoints_in_utf8, get_utf8_length, + codepoints_in_utf8, codepoints_in_utf8, Utf8StringBuilder) @@ -105,16 +105,10 @@ # desired, all in one pass. seennl = self.seennl - # If, up to now, newlines are consistently \n, do a quick check - # for the \r - only_lf = False - if seennl == SEEN_LF or seennl == 0: - only_lf = (output.find('\r') < 0) - - if only_lf: - # If not already seen, quick scan for a possible "\n" character. + if output.find('\r') < 0: + # If no \r, quick scan for a possible "\n" character. # (there's nothing else to be done, even when in translation mode) - if seennl == 0 and output.find('\n') >= 0: + if output.find('\n') >= 0: seennl |= SEEN_LF # Finished: we have scanned for newlines, and none of them # need translating. @@ -299,13 +293,18 @@ class DecodeBuffer(object): - def __init__(self, text=None): + def __init__(self, text=None, ulen=-1): + # self.text is a valid utf-8 string + if text is not None: + assert ulen >= 0 self.text = text self.pos = 0 self.upos = 0 + self.ulen = ulen def set(self, space, w_decoded): check_decoded(space, w_decoded) + self.ulen = space.len_w(w_decoded) self.text = space.utf8_w(w_decoded) self.pos = 0 self.upos = 0 @@ -314,12 +313,14 @@ self.text = None self.pos = 0 self.upos = 0 + self.ulen = -1 def get_chars(self, size): + """ returns a tuple (utf8, lgt) """ if self.text is None or size == 0: - return "" + return "", 0 - lgt = codepoints_in_utf8(self.text) + lgt = self.ulen available = lgt - self.upos if size < 0 or size > available: size = available @@ -327,9 +328,8 @@ if self.pos > 0 or size < available: start = self.pos - ret = [] pos = start - for i in range(size): + for i in range(size): pos = next_codepoint_pos(self.text, pos) self.upos += 1 assert start >= 0 @@ -340,8 +340,9 @@ chars = self.text self.pos = len(self.text) self.upos = lgt + size = lgt - return chars + return chars, size def has_data(self): return (self.text is not None and not self.exhausted()) @@ -378,22 +379,22 @@ limit = sys.maxint scanned = 0 while scanned < limit: - try: - ch = self.next_char() - scanned += 1 - except StopIteration: + if self.exhausted(): return False + ch = self.text[self.pos] + self._advance_codepoint() + scanned += 1 if ch == '\n': return True if ch == '\r': if scanned >= limit: return False - try: - ch = self.peek_char() - except StopIteration: + if self.exhausted(): + # don't split potential \r\n return False + ch = self.text[self.pos] if ch == '\n': - self.next_char() + self._advance_codepoint() return True else: return True @@ -404,39 +405,66 @@ limit = sys.maxint scanned = 0 while scanned < limit: - try: - ch = self.next_char() - except StopIteration: + if self.exhausted(): return False + ch = self.text[self.pos] + self._advance_codepoint() scanned += 1 if ch == '\r': if scanned >= limit: return False - try: - if self.peek_char() == '\n': - self.next_char() - return True - except StopIteration: - # This is the tricky case: we found a \r right at the end + if self.exhausted(): + # This is the tricky case: we found a \r right at the end, + # un-consume it self.pos -= 1 self.upos -= 1 return False + if self.text[self.pos] == '\n': + self._advance_codepoint() + return True return False def find_char(self, marker, limit): + # only works for ascii markers! + assert 0 <= ord(marker) < 128 + # ascii fast path + if self.ulen == len(self.text): + end = len(self.text) + if limit >= 0: + end = min(end, self.pos + limit) + pos = self.pos + assert pos >= 0 + assert end >= 0 + pos = self.text.find(marker, pos, end) + if pos >= 0: + self.pos = self.upos = pos + 1 + return True + else: + self.pos = self.upos = end + return False + if limit < 0: limit = sys.maxint + # XXX it might be better to search for the marker quickly, then compute + # the new upos afterwards. scanned = 0 while scanned < limit: - try: - ch = self.next_char() - except StopIteration: + # don't use next_char here, since that computes a slice etc + if self.exhausted(): return False - if ch == marker: + # this is never true if self.text[pos] is part of a larger char + found = self.text[self.pos] == marker + self._advance_codepoint() + if found: return True scanned += 1 return False + def _advance_codepoint(self): + # must only be called after checking self.exhausted()! + self.pos = next_codepoint_pos(self.text, self.pos) + self.upos += 1 + def check_decoded(space, w_decoded): if not space.isinstance_w(w_decoded, space.w_unicode): @@ -704,8 +732,7 @@ w_bytes = space.call_method(self.w_buffer, "read") w_decoded = space.call_method(self.w_decoder, "decode", w_bytes, space.w_True) check_decoded(space, w_decoded) - chars = self.decoded.get_chars(-1) - lgt = get_utf8_length(chars) + chars, lgt = self.decoded.get_chars(-1) w_result = space.newutf8(chars, lgt) w_final = space.add(w_result, w_decoded) self.snapshot = None @@ -718,9 +745,9 @@ while remaining > 0: if not self._ensure_data(space): break - data = self.decoded.get_chars(remaining) - builder.append(data) - remaining -= len(data) + data, size = self.decoded.get_chars(remaining) + builder.append_utf8(data, size) + remaining -= size return space.newutf8(builder.build(), builder.getlength()) @@ -745,29 +772,37 @@ self._writeflush(space) limit = convert_size(space, w_limit) + text, lgt = self._readline(space, limit) + return space.newutf8(text, lgt) + + def _readline(self, space, limit): + # This is a separate function so that readline_w() can be jitted. remnant = None - builder = StringBuilder() - # XXX maybe use Utf8StringBuilder instead? + remnant_ulen = -1 + builder = Utf8StringBuilder() while True: # First, get some data if necessary has_data = self._ensure_data(space) if not has_data: # end of file if remnant: - builder.append(remnant) + builder.append_utf8(remnant, remnant_ulen) break if remnant: assert not self.readtranslate and self.readnl == '\r\n' assert self.decoded.pos == 0 if remnant == '\r' and self.decoded.text[0] == '\n': - builder.append('\r\n') + builder.append_utf8('\r\n', 2) self.decoded.pos = 1 + self.decoded.upos = 1 remnant = None + remnant_ulen = -1 break else: - builder.append(remnant) + builder.append_utf8(remnant, remnant_ulen) remnant = None + remnant_ulen = -1 continue if limit >= 0: @@ -776,12 +811,13 @@ else: remaining = -1 start = self.decoded.pos + ustart = self.decoded.upos assert start >= 0 found = self._scan_line_ending(remaining) end_scan = self.decoded.pos + uend_scan = self.decoded.upos if end_scan > start: - s = self.decoded.text[start:end_scan] - builder.append(s) + builder.append_utf8_slice(self.decoded.text, start, end_scan, uend_scan - ustart) if found or (limit >= 0 and builder.getlength() >= limit): break @@ -789,13 +825,13 @@ # There may be some remaining chars we'll have to prepend to the # next chunk of data if not self.decoded.exhausted(): - remnant = self.decoded.get_chars(-1) + remnant, remnant_ulen = self.decoded.get_chars(-1) # We have consumed the buffer self.decoded.reset() result = builder.build() - lgt = get_utf8_length(result) - return space.newutf8(result, lgt) + lgt = builder.getlength() + return (result, lgt) # _____________________________________________________________ # write methods @@ -819,7 +855,7 @@ haslf = True if haslf and self.writetranslate and self.writenl: w_text = space.call_method(w_text, "replace", space.newutf8('\n', 1), - space.newutf8(self.writenl, get_utf8_length(self.writenl))) + space.newutf8(self.writenl, codepoints_in_utf8(self.writenl))) text = space.utf8_w(w_text) needflush = False @@ -854,9 +890,13 @@ return space.newint(textlen) def _writeflush(self, space): + # jit inlinable fast path if not self.pending_bytes: return + self._really_flush(space) + + def _really_flush(self, space): pending_bytes = ''.join(self.pending_bytes) self.pending_bytes = None self.pending_bytes_count = 0 diff -Nru pypy-7.1.1+dfsg/pypy/module/_io/moduledef.py pypy-7.3.1+dfsg/pypy/module/_io/moduledef.py --- pypy-7.1.1+dfsg/pypy/module/_io/moduledef.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_io/moduledef.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,34 @@ +from pypy.interpreter.mixedmodule import MixedModule + +class Module(MixedModule): + + appleveldefs = { + } + + interpleveldefs = { + 'DEFAULT_BUFFER_SIZE': 'space.wrap(interp_iobase.DEFAULT_BUFFER_SIZE)', + 'BlockingIOError': 'interp_io.W_BlockingIOError', + 'UnsupportedOperation': + 'space.fromcache(interp_io.Cache).w_unsupportedoperation', + '_IOBase': 'interp_iobase.W_IOBase', + '_RawIOBase': 'interp_iobase.W_RawIOBase', + '_BufferedIOBase': 'interp_bufferedio.W_BufferedIOBase', + '_TextIOBase': 'interp_textio.W_TextIOBase', + + 'FileIO': 'interp_fileio.W_FileIO', + 'BytesIO': 'interp_bytesio.W_BytesIO', + 'StringIO': 'interp_stringio.W_StringIO', + 'BufferedReader': 'interp_bufferedio.W_BufferedReader', + 'BufferedWriter': 'interp_bufferedio.W_BufferedWriter', + 'BufferedRWPair': 'interp_bufferedio.W_BufferedRWPair', + 'BufferedRandom': 'interp_bufferedio.W_BufferedRandom', + 'TextIOWrapper': 'interp_textio.W_TextIOWrapper', + + 'open': 'interp_io.open', + 'IncrementalNewlineDecoder': 'interp_textio.W_IncrementalNewlineDecoder', + } + + def shutdown(self, space): + # at shutdown, flush all open streams. Ignore I/O errors. + from pypy.module._io.interp_iobase import get_autoflusher + get_autoflusher(space).flush_all(space) diff -Nru pypy-7.1.1+dfsg/pypy/module/_io/test/apptest_bytesio.py pypy-7.3.1+dfsg/pypy/module/_io/test/apptest_bytesio.py --- pypy-7.1.1+dfsg/pypy/module/_io/test/apptest_bytesio.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_io/test/apptest_bytesio.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,117 @@ +import _io + +def test_init(): + raises(TypeError, _io.BytesIO, u"12345") + buf = "1234567890" + b = _io.BytesIO(buf) + assert b.getvalue() == buf + b = _io.BytesIO(None) + assert b.getvalue() == "" + b.__init__(buf * 2) + assert b.getvalue() == buf * 2 + b.__init__(buf) + assert b.getvalue() == buf + +def test_init_kwargs(): + + buf = "1234567890" + b = _io.BytesIO(initial_bytes=buf) + assert b.read() == buf + raises(TypeError, _io.BytesIO, buf, foo=None) + +def test_capabilities(): + f = _io.BytesIO() + assert f.readable() + assert f.writable() + assert f.seekable() + f.close() + raises(ValueError, f.readable) + raises(ValueError, f.writable) + raises(ValueError, f.seekable) + +def test_write(): + f = _io.BytesIO() + assert f.write("") == 0 + assert f.write("hello") == 5 + exc = raises(TypeError, f.write, u"lo") + assert str(exc.value) == "'unicode' does not have the buffer interface" + import gc; gc.collect() + assert f.getvalue() == "hello" + f.close() + +def test_read(): + f = _io.BytesIO("hello") + assert f.read() == "hello" + import gc; gc.collect() + assert f.read(8192) == "" + f.close() + +def test_seek(): + f = _io.BytesIO("hello") + assert f.tell() == 0 + assert f.seek(-1, 2) == 4 + assert f.tell() == 4 + assert f.seek(0) == 0 + +def test_truncate(): + f = _io.BytesIO() + f.write("hello") + assert f.truncate(0) == 0 + assert f.tell() == 5 + f.seek(0) + f.write("hello") + f.seek(3) + assert f.truncate() == 3 + assert f.getvalue() == "hel" + assert f.truncate(2) == 2 + assert f.tell() == 3 + +def test_setstate(): + # state is (content, position, __dict__) + f = _io.BytesIO("hello") + content, pos, __dict__ = f.__getstate__() + assert (content, pos) == ("hello", 0) + assert __dict__ is None or __dict__ == {} + f.__setstate__(("world", 3, {"a": 1})) + assert f.getvalue() == "world" + assert f.read() == "ld" + assert f.a == 1 + assert f.__getstate__() == ("world", 5, {"a": 1}) + raises(TypeError, f.__setstate__, ("", 0)) + f.close() + raises(ValueError, f.__getstate__) + raises(ValueError, f.__setstate__, ("world", 3, {"a": 1})) + +def test_readinto(): + + b = _io.BytesIO("hello") + a1 = bytearray('t') + a2 = bytearray('testing') + assert b.readinto(a1) == 1 + assert b.readinto(a2) == 4 + exc = raises(TypeError, b.readinto, u"hello") + assert str(exc.value) == "cannot use unicode as modifiable buffer" + exc = raises(TypeError, b.readinto, buffer(b"hello")) + assert str(exc.value) == "must be read-write buffer, not buffer" + exc = raises(TypeError, b.readinto, buffer(bytearray("hello"))) + assert str(exc.value) == "must be read-write buffer, not buffer" + exc = raises(TypeError, b.readinto, memoryview(b"hello")) + assert str(exc.value) == "must be read-write buffer, not memoryview" + b.close() + assert a1 == "h" + assert a2 == "elloing" + raises(ValueError, b.readinto, bytearray("hello")) + +def test_readline(): + f = _io.BytesIO(b'abc\ndef\nxyzzy\nfoo\x00bar\nanother line') + assert f.readline() == b'abc\n' + assert f.readline(10) == b'def\n' + assert f.readline(2) == b'xy' + assert f.readline(4) == b'zzy\n' + assert f.readline() == b'foo\x00bar\n' + assert f.readline(None) == b'another line' + raises(TypeError, f.readline, 5.3) + +def test_overread(): + f = _io.BytesIO(b'abc') + assert f.readline(10) == b'abc' diff -Nru pypy-7.1.1+dfsg/pypy/module/_io/test/apptest_io.py pypy-7.3.1+dfsg/pypy/module/_io/test/apptest_io.py --- pypy-7.1.1+dfsg/pypy/module/_io/test/apptest_io.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_io/test/apptest_io.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,401 @@ +# spaceconfig = {"usemodules" : ["_locale", "array", "struct"]} + +import _io +import array +import pytest + +@pytest.fixture +def tempfile(tmpdir): + tempfile = (tmpdir / 'tempfile').ensure() + return str(tempfile) + +def test_iobase(): + import io + io.IOBase() + + class MyFile(io.BufferedIOBase): + def __init__(self, filename): + pass + MyFile("file") + +def test_openclose(): + import io + with io.BufferedIOBase() as f: + assert not f.closed + f._checkClosed() + assert f.closed + raises(ValueError, f._checkClosed) + +def test_iter(): + import io + class MyFile(io.IOBase): + def __init__(self): + self.lineno = 0 + def readline(self): + self.lineno += 1 + if self.lineno == 1: + return "line1" + elif self.lineno == 2: + return "line2" + return "" + + assert list(MyFile()) == ["line1", "line2"] + +def test_exception(): + e = _io.UnsupportedOperation("seek") + +def test_default_implementations(): + file = _io._IOBase() + raises(_io.UnsupportedOperation, file.seek, 0, 1) + raises(_io.UnsupportedOperation, file.fileno) + raises(_io.UnsupportedOperation, file.truncate) + +def test_blockingerror(): + try: + raise _io.BlockingIOError(42, "test blocking", 123) + except IOError as e: + assert isinstance(e, _io.BlockingIOError) + assert e.errno == 42 + assert e.strerror == "test blocking" + assert e.characters_written == 123 + +def test_dict(): + f = _io.BytesIO() + f.x = 42 + assert f.x == 42 + # + def write(data): + try: + data = data.tobytes().upper() + except AttributeError: + data = data.upper() + return _io.BytesIO.write(f, data) + f.write = write + bufio = _io.BufferedWriter(f) + bufio.write("abc") + bufio.flush() + assert f.getvalue() == "ABC" + +def test_destructor(): + import io + io.IOBase() + + record = [] + class MyIO(io.IOBase): + def __del__(self): + record.append(1) + def close(self): + record.append(2) + super(MyIO, self).close() + def flush(self): + record.append(3) + super(MyIO, self).flush() + MyIO() + import gc; gc.collect() + assert record == [1, 2, 3] + +def test_tell(): + import io + class MyIO(io.IOBase): + def seek(self, pos, whence=0): + return 42 + assert MyIO().tell() == 42 + +def test_weakref(): + import weakref + f = _io.BytesIO() + ref = weakref.ref(f) + assert ref() is f + +def test_rawio_read(): + class MockRawIO(_io._RawIOBase): + stack = ['abc', 'de', ''] + def readinto(self, buf): + data = self.stack.pop(0) + buf[:len(data)] = data + return len(data) + assert MockRawIO().read() == 'abcde' + +def test_rawio_read_pieces(): + class MockRawIO(_io._RawIOBase): + stack = ['abc', 'de', None, 'fg', ''] + def readinto(self, buf): + data = self.stack.pop(0) + if data is None: + return None + if len(data) <= len(buf): + buf[:len(data)] = data + return len(data) + else: + buf[:] = data[:len(buf)] + self.stack.insert(0, data[len(buf):]) + return len(buf) + r = MockRawIO() + assert r.read(2) == 'ab' + assert r.read(2) == 'c' + assert r.read(2) == 'de' + assert r.read(2) is None + assert r.read(2) == 'fg' + assert r.read(2) == '' + +def test_rawio_readall_none(): + class MockRawIO(_io._RawIOBase): + read_stack = [None, None, "a"] + def readinto(self, buf): + v = self.read_stack.pop() + if v is None: + return v + buf[:len(v)] = v + return len(v) + + r = MockRawIO() + s = r.readall() + assert s =="a" + s = r.readall() + assert s is None + +def test_open(tempfile): + import io + f = io.open(tempfile, "rb") + assert f.name.endswith('tempfile') + assert f.mode == 'rb' + f.close() + + with io.open(tempfile, "rt") as f: + assert f.mode == "rt" + +def test_open_writable(tempfile): + import io + f = io.open(tempfile, "w+b") + f.close() + +def test_valid_mode(tempfile): + import io + + raises(ValueError, io.open, tempfile, "ww") + raises(ValueError, io.open, tempfile, "rwa") + raises(ValueError, io.open, tempfile, "b", newline="\n") + +def test_array_write(tempfile): + a = array.array(b'i', range(10)) + n = len(a.tostring()) + with _io.open(tempfile, "wb", 0) as f: + res = f.write(a) + assert res == n + + with _io.open(tempfile, "wb") as f: + res = f.write(a) + assert res == n + +def test_attributes(tempfile): + with _io.open(tempfile, "wb", buffering=0) as f: + assert f.mode == "wb" + + with _io.open(tempfile, "U") as f: + assert f.name == tempfile + assert f.buffer.name == tempfile + assert f.buffer.raw.name == tempfile + assert f.mode == "U" + assert f.buffer.mode == "rb" + assert f.buffer.raw.mode == "rb" + + with _io.open(tempfile, "w+") as f: + assert f.mode == "w+" + assert f.buffer.mode == "rb+" + assert f.buffer.raw.mode == "rb+" + + with _io.open(f.fileno(), "wb", closefd=False) as g: + assert g.mode == "wb" + assert g.raw.mode == "wb" + assert g.name == f.fileno() + assert g.raw.name == f.fileno() + +def test_seek_and_tell(tempfile): + with _io.open(tempfile, "wb") as f: + f.write("abcd") + + with _io.open(tempfile) as f: + decoded = f.read() + + # seek positions + for i in xrange(len(decoded) + 1): + # read lenghts + for j in [1, 5, len(decoded) - i]: + with _io.open(tempfile) as f: + res = f.read(i) + assert res == decoded[:i] + cookie = f.tell() + res = f.read(j) + assert res == decoded[i:i + j] + f.seek(cookie) + res = f.read() + assert res == decoded[i:] + +def test_telling(tempfile): + with _io.open(tempfile, "w+", encoding="utf8") as f: + p0 = f.tell() + f.write(u"\xff\n") + p1 = f.tell() + f.write(u"\xff\n") + p2 = f.tell() + f.seek(0) + + assert f.tell() == p0 + res = f.readline() + assert res == u"\xff\n" + assert f.tell() == p1 + res = f.readline() + assert res == u"\xff\n" + assert f.tell() == p2 + f.seek(0) + + for line in f: + assert line == u"\xff\n" + raises(IOError, f.tell) + assert f.tell() == p2 + +def test_chunk_size(tempfile): + with _io.open(tempfile) as f: + assert f._CHUNK_SIZE >= 1 + f._CHUNK_SIZE = 4096 + assert f._CHUNK_SIZE == 4096 + raises(ValueError, setattr, f, "_CHUNK_SIZE", 0) + +def test_truncate(tempfile): + with _io.open(tempfile, "w+") as f: + f.write(u"abc") + + with _io.open(tempfile, "w+") as f: + f.truncate() + + with _io.open(tempfile, "r+") as f: + res = f.read() + assert res == "" + +def test_errors_property(tempfile): + with _io.open(tempfile, "w") as f: + assert f.errors == "strict" + with _io.open(tempfile, "w", errors="replace") as f: + assert f.errors == "replace" + +def test_append_bom(tempfile): + # The BOM is not written again when appending to a non-empty file + for charset in ["utf-8-sig", "utf-16", "utf-32"]: + with _io.open(tempfile, "w", encoding=charset) as f: + f.write(u"aaa") + pos = f.tell() + with _io.open(tempfile, "rb") as f: + res = f.read() + assert res == "aaa".encode(charset) + with _io.open(tempfile, "a", encoding=charset) as f: + f.write(u"xxx") + with _io.open(tempfile, "rb") as f: + res = f.read() + assert res == "aaaxxx".encode(charset) + +def test_newlines_attr(tempfile): + with _io.open(tempfile, "r") as f: + assert f.newlines is None + + with _io.open(tempfile, "wb") as f: + f.write("hello\nworld\n") + + with _io.open(tempfile, "r") as f: + res = f.readline() + assert res == "hello\n" + res = f.readline() + assert res == "world\n" + assert f.newlines == "\n" + assert type(f.newlines) is unicode + +def test_mod(): + typemods = dict((t, t.__module__) for t in vars(_io).values() + if isinstance(t, type)) + for t, mod in typemods.items(): + if t is _io.BlockingIOError: + assert mod == '__builtin__' + elif t is _io.UnsupportedOperation: + assert mod == 'io' + else: + assert mod == '_io' + +def test_issue1902(tempfile): + with _io.open(tempfile, 'w+b', 4096) as f: + f.write(b'\xff' * 13569) + f.flush() + f.seek(0, 0) + f.read(1) + f.seek(-1, 1) + f.write(b'') + +def test_issue1902_2(tempfile): + with _io.open(tempfile, 'w+b', 4096) as f: + f.write(b'\xff' * 13569) + f.flush() + f.seek(0, 0) + + f.read(1) + f.seek(-1, 1) + f.write(b'\xff') + f.seek(1, 0) + f.read(4123) + f.seek(-4123, 1) + +def test_issue1902_3(tempfile): + buffer_size = 4096 + with _io.open(tempfile, 'w+b', buffer_size) as f: + f.write(b'\xff' * buffer_size * 3) + f.flush() + f.seek(0, 0) + + f.read(1) + f.seek(-1, 1) + f.write(b'\xff') + f.seek(1, 0) + f.read(buffer_size * 2) + assert f.tell() == 1 + buffer_size * 2 + +def test_io_after_close(tempfile): + for kwargs in [ + {"mode": "w"}, + {"mode": "wb"}, + {"mode": "w", "buffering": 1}, + {"mode": "w", "buffering": 2}, + {"mode": "wb", "buffering": 0}, + {"mode": "r"}, + {"mode": "rb"}, + {"mode": "r", "buffering": 1}, + {"mode": "r", "buffering": 2}, + {"mode": "rb", "buffering": 0}, + {"mode": "w+"}, + {"mode": "w+b"}, + {"mode": "w+", "buffering": 1}, + {"mode": "w+", "buffering": 2}, + {"mode": "w+b", "buffering": 0}, + ]: + print kwargs + if "b" not in kwargs["mode"]: + kwargs["encoding"] = "ascii" + f = _io.open(tempfile, **kwargs) + f.close() + raises(ValueError, f.flush) + raises(ValueError, f.fileno) + raises(ValueError, f.isatty) + raises(ValueError, f.__iter__) + if hasattr(f, "peek"): + raises(ValueError, f.peek, 1) + raises(ValueError, f.read) + if hasattr(f, "read1"): + raises(ValueError, f.read1, 1024) + if hasattr(f, "readall"): + raises(ValueError, f.readall) + if hasattr(f, "readinto"): + raises(ValueError, f.readinto, bytearray(1024)) + raises(ValueError, f.readline) + raises(ValueError, f.readlines) + raises(ValueError, f.seek, 0) + raises(ValueError, f.tell) + raises(ValueError, f.truncate) + raises(ValueError, f.write, b"" if "b" in kwargs['mode'] else u"") + raises(ValueError, f.writelines, []) + raises(ValueError, next, f) diff -Nru pypy-7.1.1+dfsg/pypy/module/_io/test/apptest_stringio.py pypy-7.3.1+dfsg/pypy/module/_io/test/apptest_stringio.py --- pypy-7.1.1+dfsg/pypy/module/_io/test/apptest_stringio.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_io/test/apptest_stringio.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,319 @@ +from pytest import raises +from _io import StringIO + +def test_stringio(): + sio = StringIO() + sio.write(u'Hello ') + sio.write(u'world') + assert sio.getvalue() == u'Hello world' + + assert StringIO(u"hello").read() == u'hello' + +def test_capabilities(): + sio = StringIO() + assert sio.readable() + assert sio.writable() + assert sio.seekable() + assert not sio.isatty() + assert not sio.closed + assert not sio.line_buffering + sio.close() + raises(ValueError, sio.readable) + raises(ValueError, sio.writable) + raises(ValueError, sio.seekable) + raises(ValueError, sio.isatty) + assert sio.closed + assert sio.errors is None + +def test_closed(): + sio = StringIO() + sio.close() + raises(ValueError, sio.read, 1) + raises(ValueError, sio.write, u"text") + +def test_read(): + buf = u"1234567890" + sio = StringIO(buf) + + assert sio.read(0) == '' + assert buf[:1] == sio.read(1) + assert buf[1:5] == sio.read(4) + assert buf[5:] == sio.read(900) + assert u"" == sio.read() + +def test_read_binary(): + # data is from a test_imghdr test for a GIF file + buf_in = (u'\x47\x49\x46\x38\x39\x61\x10\x00\x10\x00\xf6\x64\x00\xeb' + u'\xbb\x18\xeb\xbe\x21\xf3\xc1\x1a\xfa\xc7\x19\xfd\xcb\x1b' + u'\xff\xcc\x1c\xeb') + assert len(buf_in) == 32 + sio = StringIO(buf_in) + buf_out = sio.read(32) + assert buf_in == buf_out + +def test_readline(): + sio = StringIO(u'123\n456') + assert sio.readline(0) == '' + assert sio.readline(2) == '12' + assert sio.readline(None) == '3\n' + assert sio.readline() == '456' + +def test_seek(): + + s = u"1234567890" + sio = StringIO(s) + + sio.read(5) + sio.seek(0) + r = sio.read() + assert r == s + + sio.seek(3) + r = sio.read() + assert r == s[3:] + raises(TypeError, sio.seek, 0.0) + + exc_info = raises(ValueError, sio.seek, -3) + assert exc_info.value.args[0] == "Negative seek position -3" + + raises(ValueError, sio.seek, 3, -1) + raises(ValueError, sio.seek, 3, -3) + + sio.close() + raises(ValueError, sio.seek, 0) + +def test_overseek(): + + s = u"1234567890" + sio = StringIO(s) + + res = sio.seek(11) + assert res == 11 + res = sio.read() + assert res == u"" + assert sio.tell() == 11 + assert sio.getvalue() == s + sio.write(u"") + assert sio.getvalue() == s + sio.write(s) + assert sio.getvalue() == s + u"\0" + s + +def test_tell(): + + s = u"1234567890" + sio = StringIO(s) + + assert sio.tell() == 0 + sio.seek(5) + assert sio.tell() == 5 + sio.seek(10000) + assert sio.tell() == 10000 + + sio.close() + raises(ValueError, sio.tell) + +def test_truncate(): + + s = u"1234567890" + sio = StringIO(s) + + raises(ValueError, sio.truncate, -1) + sio.seek(6) + res = sio.truncate() + assert res == 6 + assert sio.getvalue() == s[:6] + res = sio.truncate(4) + assert res == 4 + assert sio.getvalue() == s[:4] + # truncate() accepts long objects + res = sio.truncate(4L) + assert res == 4 + assert sio.getvalue() == s[:4] + assert sio.tell() == 6 + sio.seek(0, 2) + sio.write(s) + assert sio.getvalue() == s[:4] + s + pos = sio.tell() + res = sio.truncate(None) + assert res == pos + assert sio.tell() == pos + raises(TypeError, sio.truncate, '0') + sio.close() + raises(ValueError, sio.truncate, 0) + +def test_write_error(): + + exc_info = raises(TypeError, StringIO, 3) + assert "int" in exc_info.value.args[0] + + sio = StringIO(u"") + exc_info = raises(TypeError, sio.write, 3) + assert "int" in exc_info.value.args[0] + +def test_newline_none(): + + sio = StringIO(u"a\nb\r\nc\rd", newline=None) + res = list(sio) + assert res == [u"a\n", u"b\n", u"c\n", u"d"] + sio.seek(0) + res = sio.read(1) + assert res == u"a" + res = sio.read(2) + assert res == u"\nb" + res = sio.read(2) + assert res == u"\nc" + res = sio.read(1) + assert res == u"\n" + + sio = StringIO(newline=None) + res = sio.write(u"a\n") + assert res == 2 + res = sio.write(u"b\r\n") + assert res == 3 + res = sio.write(u"c\rd") + assert res == 3 + sio.seek(0) + res = sio.read() + assert res == u"a\nb\nc\nd" + sio = StringIO(u"a\r\nb", newline=None) + res = sio.read(3) + assert res == u"a\nb" + +def test_newline_empty(): + + sio = StringIO(u"a\nb\r\nc\rd", newline="") + res = list(sio) + assert res == [u"a\n", u"b\r\n", u"c\r", u"d"] + sio.seek(0) + res = sio.read(4) + assert res == u"a\nb\r" + res = sio.read(2) + assert res == u"\nc" + res = sio.read(1) + assert res == u"\r" + + sio = StringIO(newline="") + res = sio.write(u"a\n") + assert res == 2 + res = sio.write(u"b\r") + assert res == 2 + res = sio.write(u"\nc") + assert res == 2 + res = sio.write(u"\rd") + assert res == 2 + sio.seek(0) + res = list(sio) + assert res == [u"a\n", u"b\r\n", u"c\r", u"d"] + +def test_newline_lf(): + + sio = StringIO(u"a\nb\r\nc\rd") + res = list(sio) + assert res == [u"a\n", u"b\r\n", u"c\rd"] + +def test_newline_cr(): + + sio = StringIO(u"a\nb\r\nc\rd", newline="\r") + res = sio.read() + assert res == u"a\rb\r\rc\rd" + sio.seek(0) + res = list(sio) + assert res == [u"a\r", u"b\r", u"\r", u"c\r", u"d"] + +def test_newline_crlf(): + + sio = StringIO(u"a\nb\r\nc\rd", newline="\r\n") + res = sio.read() + assert res == u"a\r\nb\r\r\nc\rd" + sio.seek(0) + res = list(sio) + assert res == [u"a\r\n", u"b\r\r\n", u"c\rd"] + +def test_newline_property(): + + sio = StringIO(newline=None) + assert sio.newlines is None + sio.write(u"a\n") + assert sio.newlines == "\n" + sio.write(u"b\r\n") + assert sio.newlines == ("\n", "\r\n") + sio.write(u"c\rd") + assert sio.newlines == ("\r", "\n", "\r\n") + +def test_iterator(): + + s = u"1234567890\n" + sio = StringIO(s * 10) + + assert iter(sio) is sio + assert hasattr(sio, "__iter__") + assert hasattr(sio, "next") + + i = 0 + for line in sio: + assert line == s + i += 1 + assert i == 10 + sio.seek(0) + i = 0 + for line in sio: + assert line == s + i += 1 + assert i == 10 + sio.seek(len(s) * 10 +1) + assert list(sio) == [] + sio = StringIO(s * 2) + sio.close() + raises(ValueError, next, sio) + +def test_getstate(): + + sio = StringIO() + state = sio.__getstate__() + assert len(state) == 4 + assert isinstance(state[0], unicode) + assert isinstance(state[1], str) + assert isinstance(state[2], int) + assert state[3] is None or isinstance(state[3], dict) + sio.close() + raises(ValueError, sio.__getstate__) + +def test_setstate(): + + sio = StringIO() + sio.__setstate__((u"no error", u"\n", 0, None)) + sio.__setstate__((u"no error", u"", 0, {"spam": 3})) + raises(ValueError, sio.__setstate__, (u"", u"f", 0, None)) + raises(ValueError, sio.__setstate__, (u"", u"", -1, None)) + raises(TypeError, sio.__setstate__, (b"", u"", 0, None)) + raises(TypeError, sio.__setstate__, (u"", u"", 0.0, None)) + raises(TypeError, sio.__setstate__, (u"", u"", 0, 0)) + raises(TypeError, sio.__setstate__, (u"len-test", 0)) + raises(TypeError, sio.__setstate__) + raises(TypeError, sio.__setstate__, 0) + sio.close() + raises(ValueError, sio.__setstate__, (u"closed", u"", 0, None)) + +def test_roundtrip_translation(): + sio1 = StringIO(u'a\nb', newline='\r\n') + pos = sio1.seek(1) + assert sio1.getvalue() == u'a\r\nb' + state = sio1.__getstate__() + sio2 = StringIO() + sio2.__setstate__(state) + assert sio2.getvalue() == u'a\r\nb' + assert sio2.tell() == pos + +def test_roundtrip_state(): + s = u'12345678' + sio1 = StringIO(s) + sio1.foo = 42 + sio1.seek(2) + assert sio1.getvalue() == s + state = sio1.__getstate__() + sio2 = StringIO() + sio2.__setstate__(state) + assert sio2.getvalue() == s + assert sio2.foo == 42 + assert sio2.tell() == 2 + diff -Nru pypy-7.1.1+dfsg/pypy/module/_io/test/apptest_textio.py pypy-7.3.1+dfsg/pypy/module/_io/test/apptest_textio.py --- pypy-7.1.1+dfsg/pypy/module/_io/test/apptest_textio.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_io/test/apptest_textio.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,371 @@ +#encoding: utf-8 +# spaceconfig = {"usemodules": ["_locale"]} +import _io + +def test_constructor(): + r = _io.BytesIO(b"\xc3\xa9\n\n") + b = _io.BufferedReader(r, 1000) + t = _io.TextIOWrapper(b) + t.__init__(b, encoding="latin1", newline="\r\n") + assert t.encoding == "latin1" + assert t.line_buffering == False + t.__init__(b, encoding="utf8", line_buffering=True) + assert t.encoding == "utf8" + assert t.line_buffering == True + assert t.readline() == u"\xe9\n" + raises(TypeError, t.__init__, b, newline=42) + raises(ValueError, t.__init__, b, newline='xyzzy') + t = _io.TextIOWrapper(b) + assert t.encoding + +def test_properties(): + r = _io.BytesIO(b"\xc3\xa9\n\n") + b = _io.BufferedReader(r, 1000) + t = _io.TextIOWrapper(b) + assert t.readable() + assert t.seekable() + # + class CustomFile(object): + def isatty(self): return 'YES' + readable = writable = seekable = lambda self: False + t = _io.TextIOWrapper(CustomFile()) + assert t.isatty() == 'YES' + +def test_default_implementations(): + file = _io._TextIOBase() + raises(_io.UnsupportedOperation, file.read) + raises(_io.UnsupportedOperation, file.seek, 0) + raises(_io.UnsupportedOperation, file.readline) + raises(_io.UnsupportedOperation, file.detach) + +def test_unreadable(): + class UnReadable(_io.BytesIO): + def readable(self): + return False + txt = _io.TextIOWrapper(UnReadable()) + raises(IOError, txt.read) + +def test_detach(): + b = _io.BytesIO() + f = _io.TextIOWrapper(b) + assert f.detach() is b + raises(ValueError, f.fileno) + raises(ValueError, f.close) + raises(ValueError, f.detach) + raises(ValueError, f.flush) + + # Operations independent of the detached stream should still work + repr(f) + assert isinstance(f.encoding, str) + assert f.errors == "strict" + assert not f.line_buffering + + assert not b.closed + b.close() + +def test_newlinetranslate(): + r = _io.BytesIO(b"abc\r\ndef\rg") + b = _io.BufferedReader(r, 1000) + t = _io.TextIOWrapper(b) + assert t.read() == u"abc\ndef\ng" + +def test_one_by_one(): + r = _io.BytesIO(b"abc\r\ndef\rg") + t = _io.TextIOWrapper(r) + reads = [] + while True: + c = t.read(1) + assert len(c) <= 1 + if not c: + break + reads.append(c) + assert u''.join(reads) == u"abc\ndef\ng" + +def test_read_some_then_all(): + r = _io.BytesIO("abc\ndef\n") + t = _io.TextIOWrapper(r) + reads = t.read(4) + reads += t.read() + assert reads == u"abc\ndef\n" + +def test_read_some_then_readline(): + r = _io.BytesIO("abc\ndef\n") + t = _io.TextIOWrapper(r) + reads = t.read(4) + reads += t.readline() + assert reads == u"abc\ndef\n" + +def test_read_bug_unicode(): + inp = b"\xc3\xa4bc\ndef\n" + r = _io.BytesIO(inp) + t = _io.TextIOWrapper(r, encoding="utf-8") + reads = t.read(4) + assert reads == inp[:5].decode("utf-8") + reads += t.readline() + assert reads == inp.decode("utf-8") + +def test_encoded_writes(): + data = u"1234567890" + tests = ("utf-16", + "utf-16-le", + "utf-16-be", + "utf-32", + "utf-32-le", + "utf-32-be") + for encoding in tests: + buf = _io.BytesIO() + f = _io.TextIOWrapper(buf, encoding=encoding) + # Check if the BOM is written only once (see issue1753). + f.write(data) + f.write(data) + f.seek(0) + assert f.read() == data * 2 + f.seek(0) + assert f.read() == data * 2 + assert buf.getvalue() == (data * 2).encode(encoding) + +def test_writelines_error(): + txt = _io.TextIOWrapper(_io.BytesIO()) + raises(TypeError, txt.writelines, [1, 2, 3]) + raises(TypeError, txt.writelines, None) + raises(TypeError, txt.writelines, b'abc') + +def test_tell(): + r = _io.BytesIO("abc\ndef\n") + t = _io.TextIOWrapper(r) + assert t.tell() == 0 + t.read(4) + assert t.tell() == 4 + +def test_destructor(): + l = [] + class MyBytesIO(_io.BytesIO): + def close(self): + l.append(self.getvalue()) + _io.BytesIO.close(self) + b = MyBytesIO() + t = _io.TextIOWrapper(b, encoding="ascii") + t.write(u"abc") + del t + import gc; gc.collect() + assert l == ["abc"] + +def test_newlines(): + input_lines = [ "unix\n", "windows\r\n", "os9\r", "last\n", "nonl" ] + + tests = [ + [ None, [ 'unix\n', 'windows\n', 'os9\n', 'last\n', 'nonl' ] ], + [ '', input_lines ], + [ '\n', [ "unix\n", "windows\r\n", "os9\rlast\n", "nonl" ] ], + [ '\r\n', [ "unix\nwindows\r\n", "os9\rlast\nnonl" ] ], + [ '\r', [ "unix\nwindows\r", "\nos9\r", "last\nnonl" ] ], + ] + + # Try a range of buffer sizes to test the case where \r is the last + # character in TextIOWrapper._pending_line. + encoding = "ascii" + # XXX: str.encode() should return bytes + data = bytes(''.join(input_lines).encode(encoding)) + for do_reads in (False, True): + for bufsize in range(1, 10): + for newline, exp_lines in tests: + bufio = _io.BufferedReader(_io.BytesIO(data), bufsize) + textio = _io.TextIOWrapper(bufio, newline=newline, + encoding=encoding) + if do_reads: + got_lines = [] + while True: + c2 = textio.read(2) + if c2 == '': + break + len(c2) == 2 + got_lines.append(c2 + textio.readline()) + else: + got_lines = list(textio) + + for got_line, exp_line in zip(got_lines, exp_lines): + assert got_line == exp_line + assert len(got_lines) == len(exp_lines) + +def test_readline(): + s = "AAA\r\nBBB\rCCC\r\nDDD\nEEE\r\n" + r = "AAA\nBBB\nCCC\nDDD\nEEE\n".decode("ascii") + txt = _io.TextIOWrapper(_io.BytesIO(s), encoding="ascii") + txt._CHUNK_SIZE = 4 + + reads = txt.read(4) + reads += txt.read(4) + reads += txt.readline() + reads += txt.readline() + reads += txt.readline() + assert reads == r + +def test_name(): + t = _io.TextIOWrapper(_io.BytesIO("")) + # CPython raises an AttributeError, we raise a TypeError. + raises((AttributeError, TypeError), setattr, t, "name", "anything") + +def test_repr(): + t = _io.TextIOWrapper(_io.BytesIO(""), encoding="utf-8") + assert repr(t) == "<_io.TextIOWrapper encoding='utf-8'>" + t = _io.TextIOWrapper(_io.BytesIO(""), encoding="ascii") + assert repr(t) == "<_io.TextIOWrapper encoding='ascii'>" + t = _io.TextIOWrapper(_io.BytesIO(""), encoding=u"utf-8") + assert repr(t) == "<_io.TextIOWrapper encoding='utf-8'>" + b = _io.BytesIO("") + t = _io.TextIOWrapper(b, encoding="utf-8") + b.name = "dummy" + assert repr(t) == "<_io.TextIOWrapper name='dummy' encoding='utf-8'>" + +def test_flush_error_on_close(): + txt = _io.TextIOWrapper(_io.BytesIO(b""), encoding="ascii") + def bad_flush(): + raise IOError() + txt.flush = bad_flush + raises(IOError, txt.close) # exception not swallowed + assert txt.closed + +def test_illegal_decoder(): + t = _io.TextIOWrapper(_io.BytesIO(b'aaaaaa'), newline='\n', + encoding='quopri_codec') + raises(TypeError, t.read, 1) + t = _io.TextIOWrapper(_io.BytesIO(b'aaaaaa'), newline='\n', + encoding='quopri_codec') + raises(TypeError, t.readline) + t = _io.TextIOWrapper(_io.BytesIO(b'aaaaaa'), newline='\n', + encoding='quopri_codec') + raises(TypeError, t.read) + +def test_read_nonbytes(): + class NonbytesStream(_io.StringIO): + read1 = _io.StringIO.read + t = _io.TextIOWrapper(NonbytesStream(u'a')) + raises(TypeError, t.read, 1) + t = _io.TextIOWrapper(NonbytesStream(u'a')) + raises(TypeError, t.readline) + t = _io.TextIOWrapper(NonbytesStream(u'a')) + t.read() == u'a' + +def test_uninitialized(): + t = _io.TextIOWrapper.__new__(_io.TextIOWrapper) + del t + t = _io.TextIOWrapper.__new__(_io.TextIOWrapper) + raises(Exception, repr, t) + raises(ValueError, t.read, 0) + t.__init__(_io.BytesIO()) + assert t.read(0) == u'' + +def test_newline_decoder(): + def check_newline_decoding_utf8(decoder): + # UTF-8 specific tests for a newline decoder + def _check_decode(b, s, **kwargs): + # We exercise getstate() / setstate() as well as decode() + state = decoder.getstate() + assert decoder.decode(b, **kwargs) == s + decoder.setstate(state) + assert decoder.decode(b, **kwargs) == s + + _check_decode(b'\xe8\xa2\x88', u"\u8888") + + _check_decode(b'\xe8', "") + _check_decode(b'\xa2', "") + _check_decode(b'\x88', u"\u8888") + + _check_decode(b'\xe8', "") + _check_decode(b'\xa2', "") + _check_decode(b'\x88', u"\u8888") + + _check_decode(b'\xe8', "") + raises(UnicodeDecodeError, decoder.decode, b'', final=True) + + decoder.reset() + _check_decode(b'\n', "\n") + _check_decode(b'\r', "") + _check_decode(b'', "\n", final=True) + _check_decode(b'\r', "\n", final=True) + + _check_decode(b'\r', "") + _check_decode(b'a', "\na") + + _check_decode(b'\r\r\n', "\n\n") + _check_decode(b'\r', "") + _check_decode(b'\r', "\n") + _check_decode(b'\na', "\na") + + _check_decode(b'\xe8\xa2\x88\r\n', u"\u8888\n") + _check_decode(b'\xe8\xa2\x88', u"\u8888") + _check_decode(b'\n', "\n") + _check_decode(b'\xe8\xa2\x88\r', u"\u8888") + _check_decode(b'\n', "\n") + + def check_newline_decoding(decoder, encoding): + result = [] + if encoding is not None: + encoder = codecs.getincrementalencoder(encoding)() + def _decode_bytewise(s): + # Decode one byte at a time + for b in encoder.encode(s): + result.append(decoder.decode(b)) + else: + encoder = None + def _decode_bytewise(s): + # Decode one char at a time + for c in s: + result.append(decoder.decode(c)) + assert decoder.newlines == None + _decode_bytewise(u"abc\n\r") + assert decoder.newlines == '\n' + _decode_bytewise(u"\nabc") + assert decoder.newlines == ('\n', '\r\n') + _decode_bytewise(u"abc\r") + assert decoder.newlines == ('\n', '\r\n') + _decode_bytewise(u"abc") + assert decoder.newlines == ('\r', '\n', '\r\n') + _decode_bytewise(u"abc\r") + assert "".join(result) == "abc\n\nabcabc\nabcabc" + decoder.reset() + input = u"abc" + if encoder is not None: + encoder.reset() + input = encoder.encode(input) + assert decoder.decode(input) == "abc" + assert decoder.newlines is None + + encodings = ( + # None meaning the IncrementalNewlineDecoder takes unicode input + # rather than bytes input + None, 'utf-8', 'latin-1', + 'utf-16', 'utf-16-le', 'utf-16-be', + 'utf-32', 'utf-32-le', 'utf-32-be', + ) + import codecs + for enc in encodings: + decoder = enc and codecs.getincrementaldecoder(enc)() + decoder = _io.IncrementalNewlineDecoder(decoder, translate=True) + check_newline_decoding(decoder, enc) + decoder = codecs.getincrementaldecoder("utf-8")() + decoder = _io.IncrementalNewlineDecoder(decoder, translate=True) + check_newline_decoding_utf8(decoder) + +def test_newline_bytes(): + # Issue 5433: Excessive optimization in IncrementalNewlineDecoder + def _check(dec): + assert dec.newlines is None + assert dec.decode(u"\u0D00") == u"\u0D00" + assert dec.newlines is None + assert dec.decode(u"\u0A00") == u"\u0A00" + assert dec.newlines is None + dec = _io.IncrementalNewlineDecoder(None, translate=False) + _check(dec) + dec = _io.IncrementalNewlineDecoder(None, translate=True) + _check(dec) + +def test_newlines2(): + import codecs + inner_decoder = codecs.getincrementaldecoder("utf-8")() + decoder = _io.IncrementalNewlineDecoder(inner_decoder, translate=True) + msg = b"abc\r\n\n\r\r\n\n" + decoded = '' + for ch in msg: + decoded += decoder.decode(ch) + assert set(decoder.newlines) == {"\r", "\n", "\r\n"} diff -Nru pypy-7.1.1+dfsg/pypy/module/_io/test/fixtures.py pypy-7.3.1+dfsg/pypy/module/_io/test/fixtures.py --- pypy-7.1.1+dfsg/pypy/module/_io/test/fixtures.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_io/test/fixtures.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,6 @@ +from _pytest.tmpdir import TempdirFactory + +def tempfile(space, config): + tmpdir = TempdirFactory(config).getbasetemp() + tempfile = (tmpdir / 'tempfile').ensure() + return space.newtext(str(tempfile)) diff -Nru pypy-7.1.1+dfsg/pypy/module/_io/test/test_bufferedio.py pypy-7.3.1+dfsg/pypy/module/_io/test/test_bufferedio.py --- pypy-7.1.1+dfsg/pypy/module/_io/test/test_bufferedio.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_io/test/test_bufferedio.py 2020-04-10 19:28:40.000000000 +0000 @@ -1,4 +1,6 @@ from __future__ import with_statement +from rpython import rlib +from pypy.interpreter.error import oefmt from pypy.interpreter.gateway import interp2app from rpython.tool.udir import udir from pypy.module._io import interp_bufferedio @@ -149,11 +151,11 @@ exc = raises(TypeError, f.readinto, u"hello") assert str(exc.value) == "cannot use unicode as modifiable buffer" exc = raises(TypeError, f.readinto, buffer(b"hello")) - assert str(exc.value) == "must be read-write buffer, not buffer" + assert "must be read-write buffer, not buffer" in str(exc.value) exc = raises(TypeError, f.readinto, buffer(bytearray("hello"))) - assert str(exc.value) == "must be read-write buffer, not buffer" + assert "must be read-write buffer, not buffer" in str(exc.value) exc = raises(TypeError, f.readinto, memoryview(b"hello")) - assert str(exc.value) == "must be read-write buffer, not memoryview" + assert "must be read-write buffer, not memoryview" in str(exc.value) f.close() def test_readinto_big(self): @@ -270,6 +272,32 @@ assert f.readinto(a) == 10 assert a == 'abcdefghij' +@py.test.yield_fixture +def forbid_nonmoving_raw_ptr_for_resizable_list(space): + orig_nonmoving_raw_ptr_for_resizable_list = rlib.buffer.nonmoving_raw_ptr_for_resizable_list + def fail(l): + raise oefmt(space.w_ValueError, "rgc.nonmoving_raw_ptr_for_resizable_list() not supported under RevDB") + rlib.buffer.nonmoving_raw_ptr_for_resizable_list = fail + yield + rlib.buffer.nonmoving_raw_ptr_for_resizable_list = orig_nonmoving_raw_ptr_for_resizable_list + +@py.test.mark.usefixtures('forbid_nonmoving_raw_ptr_for_resizable_list') +class AppTestForbidRawPtrForResizableList(object): + spaceconfig = dict(usemodules=['_io']) + + @py.test.mark.skipif("py.test.config.option.runappdirect") + def test_monkeypatch_works(self): + import _io, os + raw = _io.FileIO(os.devnull) + f = _io.BufferedReader(raw) + with raises(ValueError) as e: + f.read(1024) + assert e.value.args[0] == "rgc.nonmoving_raw_ptr_for_resizable_list() not supported under RevDB" + +@py.test.mark.usefixtures('forbid_nonmoving_raw_ptr_for_resizable_list') +class AppTestBufferedReaderOnRevDB(AppTestBufferedReader): + spaceconfig = {'usemodules': ['_io'], 'translation.reverse_debugger': True} + class AppTestBufferedWriter: spaceconfig = dict(usemodules=['_io', 'thread']) @@ -446,8 +474,11 @@ available = self.buffersize - len(self.buffer) if available <= 0: return None - self.buffer += data[:available] - return min(len(data), available) + add_data = data[:available] + if isinstance(add_data, memoryview): + add_data = add_data.tobytes() + self.buffer += add_data + return len(add_data) def read(self, size=-1): if not self.buffer: return None diff -Nru pypy-7.1.1+dfsg/pypy/module/_io/test/test_bytesio.py pypy-7.3.1+dfsg/pypy/module/_io/test/test_bytesio.py --- pypy-7.1.1+dfsg/pypy/module/_io/test/test_bytesio.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_io/test/test_bytesio.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,129 +0,0 @@ -class AppTestBytesIO: - spaceconfig = dict(usemodules=['_io']) - - def test_init(self): - import _io - raises(TypeError, _io.BytesIO, u"12345") - buf = "1234567890" - b = _io.BytesIO(buf) - assert b.getvalue() == buf - b = _io.BytesIO(None) - assert b.getvalue() == "" - b.__init__(buf * 2) - assert b.getvalue() == buf * 2 - b.__init__(buf) - assert b.getvalue() == buf - - def test_init_kwargs(self): - import _io - - buf = "1234567890" - b = _io.BytesIO(initial_bytes=buf) - assert b.read() == buf - raises(TypeError, _io.BytesIO, buf, foo=None) - - def test_capabilities(self): - import _io - f = _io.BytesIO() - assert f.readable() - assert f.writable() - assert f.seekable() - f.close() - raises(ValueError, f.readable) - raises(ValueError, f.writable) - raises(ValueError, f.seekable) - - def test_write(self): - import _io - f = _io.BytesIO() - assert f.write("") == 0 - assert f.write("hello") == 5 - exc = raises(TypeError, f.write, u"lo") - assert str(exc.value) == "'unicode' does not have the buffer interface" - import gc; gc.collect() - assert f.getvalue() == "hello" - f.close() - - def test_read(self): - import _io - f = _io.BytesIO("hello") - assert f.read() == "hello" - import gc; gc.collect() - assert f.read(8192) == "" - f.close() - - def test_seek(self): - import _io - f = _io.BytesIO("hello") - assert f.tell() == 0 - assert f.seek(-1, 2) == 4 - assert f.tell() == 4 - assert f.seek(0) == 0 - - def test_truncate(self): - import _io - f = _io.BytesIO() - f.write("hello") - assert f.truncate(0) == 0 - assert f.tell() == 5 - f.seek(0) - f.write("hello") - f.seek(3) - assert f.truncate() == 3 - assert f.getvalue() == "hel" - assert f.truncate(2) == 2 - assert f.tell() == 3 - - def test_setstate(self): - # state is (content, position, __dict__) - import _io - f = _io.BytesIO("hello") - content, pos, __dict__ = f.__getstate__() - assert (content, pos) == ("hello", 0) - assert __dict__ is None or __dict__ == {} - f.__setstate__(("world", 3, {"a": 1})) - assert f.getvalue() == "world" - assert f.read() == "ld" - assert f.a == 1 - assert f.__getstate__() == ("world", 5, {"a": 1}) - raises(TypeError, f.__setstate__, ("", 0)) - f.close() - raises(ValueError, f.__getstate__) - raises(ValueError, f.__setstate__, ("world", 3, {"a": 1})) - - def test_readinto(self): - import _io - - b = _io.BytesIO("hello") - a1 = bytearray('t') - a2 = bytearray('testing') - assert b.readinto(a1) == 1 - assert b.readinto(a2) == 4 - exc = raises(TypeError, b.readinto, u"hello") - assert str(exc.value) == "cannot use unicode as modifiable buffer" - exc = raises(TypeError, b.readinto, buffer(b"hello")) - assert str(exc.value) == "must be read-write buffer, not buffer" - exc = raises(TypeError, b.readinto, buffer(bytearray("hello"))) - assert str(exc.value) == "must be read-write buffer, not buffer" - exc = raises(TypeError, b.readinto, memoryview(b"hello")) - assert str(exc.value) == "must be read-write buffer, not memoryview" - b.close() - assert a1 == "h" - assert a2 == "elloing" - raises(ValueError, b.readinto, bytearray("hello")) - - def test_readline(self): - import _io - f = _io.BytesIO(b'abc\ndef\nxyzzy\nfoo\x00bar\nanother line') - assert f.readline() == b'abc\n' - assert f.readline(10) == b'def\n' - assert f.readline(2) == b'xy' - assert f.readline(4) == b'zzy\n' - assert f.readline() == b'foo\x00bar\n' - assert f.readline(None) == b'another line' - raises(TypeError, f.readline, 5.3) - - def test_overread(self): - import _io - f = _io.BytesIO(b'abc') - assert f.readline(10) == b'abc' diff -Nru pypy-7.1.1+dfsg/pypy/module/_io/test/test_interp_textio.py pypy-7.3.1+dfsg/pypy/module/_io/test/test_interp_textio.py --- pypy-7.1.1+dfsg/pypy/module/_io/test/test_interp_textio.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_io/test/test_interp_textio.py 2020-04-10 19:28:40.000000000 +0000 @@ -35,6 +35,7 @@ @given(data=st_readline(), mode=st.sampled_from(['\r', '\n', '\r\n', ''])) @settings(deadline=None, database=None) +@example(data=(u'\n\r\n', [0, -1, 2, -1, 0, -1]), mode='\r') def test_readline(space, data, mode): txt, limits = data w_stream = W_BytesIO(space) @@ -58,27 +59,31 @@ @given(st.text()) def test_read_buffer(text): - buf = DecodeBuffer(text.encode('utf-8')) - assert buf.get_chars(-1) == text.encode('utf-8') + buf = DecodeBuffer(text.encode('utf8'), len(text)) + chars, size = buf.get_chars(-1) + assert chars.decode('utf8') == text + assert len(text) == size assert buf.exhausted() @given(st.text(), st.lists(st.integers(min_value=0))) @example(u'\x80', [1]) def test_readn_buffer(text, sizes): - buf = DecodeBuffer(text.encode('utf-8')) + buf = DecodeBuffer(text.encode('utf8'), len(text)) strings = [] for n in sizes: - s = buf.get_chars(n) + chars, size = buf.get_chars(n) + s = chars.decode('utf8') + assert size == len(s) if not buf.exhausted(): - assert len(s.decode('utf-8')) == n + assert len(s) == n else: - assert len(s.decode('utf-8')) <= n + assert len(s) <= n strings.append(s) - assert ''.join(strings) == text[:sum(sizes)].encode('utf-8') + assert ''.join(strings) == text[:sum(sizes)] @given(st.text()) def test_next_char(text): - buf = DecodeBuffer(text.encode('utf-8')) + buf = DecodeBuffer(text.encode('utf8'), len(text)) for i in range(len(text)): ch = buf.next_char() assert ch == text[i].encode('utf-8') diff -Nru pypy-7.1.1+dfsg/pypy/module/_io/test/test_io.py pypy-7.3.1+dfsg/pypy/module/_io/test/test_io.py --- pypy-7.1.1+dfsg/pypy/module/_io/test/test_io.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_io/test/test_io.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,446 +0,0 @@ -from __future__ import with_statement - -from rpython.tool.udir import udir - - -class AppTestIoModule: - spaceconfig = dict(usemodules=['_io']) - - def test_import(self): - import io - - def test_iobase(self): - import io - io.IOBase() - - class MyFile(io.BufferedIOBase): - def __init__(self, filename): - pass - MyFile("file") - - def test_openclose(self): - import io - with io.BufferedIOBase() as f: - assert not f.closed - f._checkClosed() - assert f.closed - raises(ValueError, f._checkClosed) - - def test_iter(self): - import io - class MyFile(io.IOBase): - def __init__(self): - self.lineno = 0 - def readline(self): - self.lineno += 1 - if self.lineno == 1: - return "line1" - elif self.lineno == 2: - return "line2" - return "" - - assert list(MyFile()) == ["line1", "line2"] - - def test_exception(self): - import _io - e = _io.UnsupportedOperation("seek") - - def test_default_implementations(self): - import _io - file = _io._IOBase() - raises(_io.UnsupportedOperation, file.seek, 0, 1) - raises(_io.UnsupportedOperation, file.fileno) - raises(_io.UnsupportedOperation, file.truncate) - - def test_blockingerror(self): - import _io - try: - raise _io.BlockingIOError(42, "test blocking", 123) - except IOError as e: - assert isinstance(e, _io.BlockingIOError) - assert e.errno == 42 - assert e.strerror == "test blocking" - assert e.characters_written == 123 - - def test_dict(self): - import _io - f = _io.BytesIO() - f.x = 42 - assert f.x == 42 - # - def write(data): - try: - data = data.tobytes().upper() - except AttributeError: - data = data.upper() - return _io.BytesIO.write(f, data) - f.write = write - bufio = _io.BufferedWriter(f) - bufio.write("abc") - bufio.flush() - assert f.getvalue() == "ABC" - - def test_destructor(self): - import io - io.IOBase() - - record = [] - class MyIO(io.IOBase): - def __del__(self): - record.append(1) - def close(self): - record.append(2) - super(MyIO, self).close() - def flush(self): - record.append(3) - super(MyIO, self).flush() - MyIO() - import gc; gc.collect() - assert record == [1, 2, 3] - - def test_tell(self): - import io - class MyIO(io.IOBase): - def seek(self, pos, whence=0): - return 42 - assert MyIO().tell() == 42 - - def test_weakref(self): - import _io - import weakref - f = _io.BytesIO() - ref = weakref.ref(f) - assert ref() is f - - def test_rawio_read(self): - import _io - class MockRawIO(_io._RawIOBase): - stack = ['abc', 'de', ''] - def readinto(self, buf): - data = self.stack.pop(0) - buf[:len(data)] = data - return len(data) - assert MockRawIO().read() == 'abcde' - - def test_rawio_read_pieces(self): - import _io - class MockRawIO(_io._RawIOBase): - stack = ['abc', 'de', None, 'fg', ''] - def readinto(self, buf): - data = self.stack.pop(0) - if data is None: - return None - if len(data) <= len(buf): - buf[:len(data)] = data - return len(data) - else: - buf[:] = data[:len(buf)] - self.stack.insert(0, data[len(buf):]) - return len(buf) - r = MockRawIO() - assert r.read(2) == 'ab' - assert r.read(2) == 'c' - assert r.read(2) == 'de' - assert r.read(2) is None - assert r.read(2) == 'fg' - assert r.read(2) == '' - - def test_rawio_readall_none(self): - import _io - class MockRawIO(_io._RawIOBase): - read_stack = [None, None, "a"] - def readinto(self, buf): - v = self.read_stack.pop() - if v is None: - return v - buf[:len(v)] = v - return len(v) - - r = MockRawIO() - s = r.readall() - assert s =="a" - s = r.readall() - assert s is None - -class AppTestOpen: - spaceconfig = dict(usemodules=['_io', '_locale', 'array', 'struct']) - - def setup_class(cls): - tmpfile = udir.join('tmpfile').ensure() - cls.w_tmpfile = cls.space.wrap(str(tmpfile)) - - def test_open(self): - import io - f = io.open(self.tmpfile, "rb") - assert f.name.endswith('tmpfile') - assert f.mode == 'rb' - f.close() - - with io.open(self.tmpfile, "rt") as f: - assert f.mode == "rt" - - def test_open_writable(self): - import io - f = io.open(self.tmpfile, "w+b") - f.close() - - def test_valid_mode(self): - import io - - raises(ValueError, io.open, self.tmpfile, "ww") - raises(ValueError, io.open, self.tmpfile, "rwa") - raises(ValueError, io.open, self.tmpfile, "b", newline="\n") - - def test_array_write(self): - import _io, array - a = array.array(b'i', range(10)) - n = len(a.tostring()) - with _io.open(self.tmpfile, "wb", 0) as f: - res = f.write(a) - assert res == n - - with _io.open(self.tmpfile, "wb") as f: - res = f.write(a) - assert res == n - - def test_attributes(self): - import _io - - with _io.open(self.tmpfile, "wb", buffering=0) as f: - assert f.mode == "wb" - - with _io.open(self.tmpfile, "U") as f: - assert f.name == self.tmpfile - assert f.buffer.name == self.tmpfile - assert f.buffer.raw.name == self.tmpfile - assert f.mode == "U" - assert f.buffer.mode == "rb" - assert f.buffer.raw.mode == "rb" - - with _io.open(self.tmpfile, "w+") as f: - assert f.mode == "w+" - assert f.buffer.mode == "rb+" - assert f.buffer.raw.mode == "rb+" - - with _io.open(f.fileno(), "wb", closefd=False) as g: - assert g.mode == "wb" - assert g.raw.mode == "wb" - assert g.name == f.fileno() - assert g.raw.name == f.fileno() - - def test_seek_and_tell(self): - import _io - - with _io.open(self.tmpfile, "wb") as f: - f.write("abcd") - - with _io.open(self.tmpfile) as f: - decoded = f.read() - - # seek positions - for i in xrange(len(decoded) + 1): - # read lenghts - for j in [1, 5, len(decoded) - i]: - with _io.open(self.tmpfile) as f: - res = f.read(i) - assert res == decoded[:i] - cookie = f.tell() - res = f.read(j) - assert res == decoded[i:i + j] - f.seek(cookie) - res = f.read() - assert res == decoded[i:] - - def test_telling(self): - import _io - - with _io.open(self.tmpfile, "w+", encoding="utf8") as f: - p0 = f.tell() - f.write(u"\xff\n") - p1 = f.tell() - f.write(u"\xff\n") - p2 = f.tell() - f.seek(0) - - assert f.tell() == p0 - res = f.readline() - assert res == u"\xff\n" - assert f.tell() == p1 - res = f.readline() - assert res == u"\xff\n" - assert f.tell() == p2 - f.seek(0) - - for line in f: - assert line == u"\xff\n" - raises(IOError, f.tell) - assert f.tell() == p2 - - def test_chunk_size(self): - import _io - - with _io.open(self.tmpfile) as f: - assert f._CHUNK_SIZE >= 1 - f._CHUNK_SIZE = 4096 - assert f._CHUNK_SIZE == 4096 - raises(ValueError, setattr, f, "_CHUNK_SIZE", 0) - - def test_truncate(self): - import _io - - with _io.open(self.tmpfile, "w+") as f: - f.write(u"abc") - - with _io.open(self.tmpfile, "w+") as f: - f.truncate() - - with _io.open(self.tmpfile, "r+") as f: - res = f.read() - assert res == "" - - def test_errors_property(self): - import _io - - with _io.open(self.tmpfile, "w") as f: - assert f.errors == "strict" - with _io.open(self.tmpfile, "w", errors="replace") as f: - assert f.errors == "replace" - - def test_append_bom(self): - import _io - - # The BOM is not written again when appending to a non-empty file - for charset in ["utf-8-sig", "utf-16", "utf-32"]: - with _io.open(self.tmpfile, "w", encoding=charset) as f: - f.write(u"aaa") - pos = f.tell() - with _io.open(self.tmpfile, "rb") as f: - res = f.read() - assert res == "aaa".encode(charset) - with _io.open(self.tmpfile, "a", encoding=charset) as f: - f.write(u"xxx") - with _io.open(self.tmpfile, "rb") as f: - res = f.read() - assert res == "aaaxxx".encode(charset) - - def test_newlines_attr(self): - import _io - - with _io.open(self.tmpfile, "r") as f: - assert f.newlines is None - - with _io.open(self.tmpfile, "wb") as f: - f.write("hello\nworld\n") - - with _io.open(self.tmpfile, "r") as f: - res = f.readline() - assert res == "hello\n" - res = f.readline() - assert res == "world\n" - assert f.newlines == "\n" - assert type(f.newlines) is unicode - - def test_mod(self): - import _io - typemods = dict((t, t.__module__) for t in vars(_io).values() - if isinstance(t, type)) - for t, mod in typemods.items(): - if t is _io.BlockingIOError: - assert mod == '__builtin__' - elif t is _io.UnsupportedOperation: - assert mod == 'io' - else: - assert mod == '_io' - - def test_issue1902(self): - import _io - with _io.open(self.tmpfile, 'w+b', 4096) as f: - f.write(b'\xff' * 13569) - f.flush() - f.seek(0, 0) - f.read(1) - f.seek(-1, 1) - f.write(b'') - - def test_issue1902_2(self): - import _io - with _io.open(self.tmpfile, 'w+b', 4096) as f: - f.write(b'\xff' * 13569) - f.flush() - f.seek(0, 0) - - f.read(1) - f.seek(-1, 1) - f.write(b'\xff') - f.seek(1, 0) - f.read(4123) - f.seek(-4123, 1) - - def test_issue1902_3(self): - import _io - buffer_size = 4096 - with _io.open(self.tmpfile, 'w+b', buffer_size) as f: - f.write(b'\xff' * buffer_size * 3) - f.flush() - f.seek(0, 0) - - f.read(1) - f.seek(-1, 1) - f.write(b'\xff') - f.seek(1, 0) - f.read(buffer_size * 2) - assert f.tell() == 1 + buffer_size * 2 - - -class AppTestIoAferClose: - spaceconfig = dict(usemodules=['_io']) - - def setup_class(cls): - tmpfile = udir.join('tmpfile').ensure() - cls.w_tmpfile = cls.space.wrap(str(tmpfile)) - - def test_io_after_close(self): - import _io - for kwargs in [ - {"mode": "w"}, - {"mode": "wb"}, - {"mode": "w", "buffering": 1}, - {"mode": "w", "buffering": 2}, - {"mode": "wb", "buffering": 0}, - {"mode": "r"}, - {"mode": "rb"}, - {"mode": "r", "buffering": 1}, - {"mode": "r", "buffering": 2}, - {"mode": "rb", "buffering": 0}, - {"mode": "w+"}, - {"mode": "w+b"}, - {"mode": "w+", "buffering": 1}, - {"mode": "w+", "buffering": 2}, - {"mode": "w+b", "buffering": 0}, - ]: - print kwargs - if "b" not in kwargs["mode"]: - kwargs["encoding"] = "ascii" - f = _io.open(self.tmpfile, **kwargs) - f.close() - raises(ValueError, f.flush) - raises(ValueError, f.fileno) - raises(ValueError, f.isatty) - raises(ValueError, f.__iter__) - if hasattr(f, "peek"): - raises(ValueError, f.peek, 1) - raises(ValueError, f.read) - if hasattr(f, "read1"): - raises(ValueError, f.read1, 1024) - if hasattr(f, "readall"): - raises(ValueError, f.readall) - if hasattr(f, "readinto"): - raises(ValueError, f.readinto, bytearray(1024)) - raises(ValueError, f.readline) - raises(ValueError, f.readlines) - raises(ValueError, f.seek, 0) - raises(ValueError, f.tell) - raises(ValueError, f.truncate) - raises(ValueError, f.write, b"" if "b" in kwargs['mode'] else u"") - raises(ValueError, f.writelines, []) - raises(ValueError, next, f) diff -Nru pypy-7.1.1+dfsg/pypy/module/_io/test/test_stringio.py pypy-7.3.1+dfsg/pypy/module/_io/test/test_stringio.py --- pypy-7.1.1+dfsg/pypy/module/_io/test/test_stringio.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_io/test/test_stringio.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,323 +0,0 @@ -class AppTestStringIO: - def test_stringio(self): - import io - sio = io.StringIO() - sio.write(u'Hello ') - sio.write(u'world') - assert sio.getvalue() == u'Hello world' - - assert io.StringIO(u"hello").read() == u'hello' - - def test_capabilities(self): - import io - sio = io.StringIO() - assert sio.readable() - assert sio.writable() - assert sio.seekable() - assert not sio.isatty() - assert not sio.closed - assert not sio.line_buffering - sio.close() - raises(ValueError, sio.readable) - raises(ValueError, sio.writable) - raises(ValueError, sio.seekable) - raises(ValueError, sio.isatty) - assert sio.closed - assert sio.errors is None - - def test_closed(self): - import io - sio = io.StringIO() - sio.close() - raises(ValueError, sio.read, 1) - raises(ValueError, sio.write, u"text") - - def test_read(self): - import io - buf = u"1234567890" - sio = io.StringIO(buf) - - assert buf[:1] == sio.read(1) - assert buf[1:5] == sio.read(4) - assert buf[5:] == sio.read(900) - assert u"" == sio.read() - - def test_read_binary(self): - # data is from a test_imghdr test for a GIF file - import io - buf_in = (u'\x47\x49\x46\x38\x39\x61\x10\x00\x10\x00\xf6\x64\x00\xeb' - u'\xbb\x18\xeb\xbe\x21\xf3\xc1\x1a\xfa\xc7\x19\xfd\xcb\x1b' - u'\xff\xcc\x1c\xeb') - assert len(buf_in) == 32 - sio = io.StringIO(buf_in) - buf_out = sio.read(32) - assert buf_in == buf_out - - def test_readline(self): - import io - sio = io.StringIO(u'123\n456') - assert sio.readline(2) == '12' - assert sio.readline(None) == '3\n' - assert sio.readline() == '456' - - def test_seek(self): - import io - - s = u"1234567890" - sio = io.StringIO(s) - - sio.read(5) - sio.seek(0) - r = sio.read() - assert r == s - - sio.seek(3) - r = sio.read() - assert r == s[3:] - raises(TypeError, sio.seek, 0.0) - - exc_info = raises(ValueError, sio.seek, -3) - assert exc_info.value.args[0] == "negative seek position: -3" - - raises(ValueError, sio.seek, 3, -1) - raises(ValueError, sio.seek, 3, -3) - - sio.close() - raises(ValueError, sio.seek, 0) - - def test_overseek(self): - import io - - s = u"1234567890" - sio = io.StringIO(s) - - res = sio.seek(11) - assert res == 11 - res = sio.read() - assert res == u"" - assert sio.tell() == 11 - assert sio.getvalue() == s - sio.write(u"") - assert sio.getvalue() == s - sio.write(s) - assert sio.getvalue() == s + u"\0" + s - - def test_tell(self): - import io - - s = u"1234567890" - sio = io.StringIO(s) - - assert sio.tell() == 0 - sio.seek(5) - assert sio.tell() == 5 - sio.seek(10000) - assert sio.tell() == 10000 - - sio.close() - raises(ValueError, sio.tell) - - def test_truncate(self): - import io - - s = u"1234567890" - sio = io.StringIO(s) - - raises(ValueError, sio.truncate, -1) - sio.seek(6) - res = sio.truncate() - assert res == 6 - assert sio.getvalue() == s[:6] - res = sio.truncate(4) - assert res == 4 - assert sio.getvalue() == s[:4] - # truncate() accepts long objects - res = sio.truncate(4L) - assert res == 4 - assert sio.getvalue() == s[:4] - assert sio.tell() == 6 - sio.seek(0, 2) - sio.write(s) - assert sio.getvalue() == s[:4] + s - pos = sio.tell() - res = sio.truncate(None) - assert res == pos - assert sio.tell() == pos - raises(TypeError, sio.truncate, '0') - sio.close() - raises(ValueError, sio.truncate, 0) - - def test_write_error(self): - import io - - exc_info = raises(TypeError, io.StringIO, 3) - assert "int" in exc_info.value.args[0] - - sio = io.StringIO(u"") - exc_info = raises(TypeError, sio.write, 3) - assert "int" in exc_info.value.args[0] - - def test_newline_none(self): - import io - - sio = io.StringIO(u"a\nb\r\nc\rd", newline=None) - res = list(sio) - assert res == [u"a\n", u"b\n", u"c\n", u"d"] - sio.seek(0) - res = sio.read(1) - assert res == u"a" - res = sio.read(2) - assert res == u"\nb" - res = sio.read(2) - assert res == u"\nc" - res = sio.read(1) - assert res == u"\n" - - sio = io.StringIO(newline=None) - res = sio.write(u"a\n") - assert res == 2 - res = sio.write(u"b\r\n") - assert res == 3 - res = sio.write(u"c\rd") - assert res == 3 - sio.seek(0) - res = sio.read() - assert res == u"a\nb\nc\nd" - sio = io.StringIO(u"a\r\nb", newline=None) - res = sio.read(3) - assert res == u"a\nb" - - def test_newline_empty(self): - import io - - sio = io.StringIO(u"a\nb\r\nc\rd", newline="") - res = list(sio) - assert res == [u"a\n", u"b\r\n", u"c\r", u"d"] - sio.seek(0) - res = sio.read(4) - assert res == u"a\nb\r" - res = sio.read(2) - assert res == u"\nc" - res = sio.read(1) - assert res == u"\r" - - sio = io.StringIO(newline="") - res = sio.write(u"a\n") - assert res == 2 - res = sio.write(u"b\r") - assert res == 2 - res = sio.write(u"\nc") - assert res == 2 - res = sio.write(u"\rd") - assert res == 2 - sio.seek(0) - res = list(sio) - assert res == [u"a\n", u"b\r\n", u"c\r", u"d"] - - def test_newline_lf(self): - import io - - sio = io.StringIO(u"a\nb\r\nc\rd") - res = list(sio) - assert res == [u"a\n", u"b\r\n", u"c\rd"] - - def test_newline_cr(self): - import io - - sio = io.StringIO(u"a\nb\r\nc\rd", newline="\r") - res = sio.read() - assert res == u"a\rb\r\rc\rd" - sio.seek(0) - res = list(sio) - assert res == [u"a\r", u"b\r", u"\r", u"c\r", u"d"] - - def test_newline_crlf(self): - import io - - sio = io.StringIO(u"a\nb\r\nc\rd", newline="\r\n") - res = sio.read() - assert res == u"a\r\nb\r\r\nc\rd" - sio.seek(0) - res = list(sio) - assert res == [u"a\r\n", u"b\r\r\n", u"c\rd"] - - def test_newline_property(self): - import io - - sio = io.StringIO(newline=None) - assert sio.newlines is None - sio.write(u"a\n") - assert sio.newlines == "\n" - sio.write(u"b\r\n") - assert sio.newlines == ("\n", "\r\n") - sio.write(u"c\rd") - assert sio.newlines == ("\r", "\n", "\r\n") - - def test_iterator(self): - import io - - s = u"1234567890\n" - sio = io.StringIO(s * 10) - - assert iter(sio) is sio - assert hasattr(sio, "__iter__") - assert hasattr(sio, "next") - - i = 0 - for line in sio: - assert line == s - i += 1 - assert i == 10 - sio.seek(0) - i = 0 - for line in sio: - assert line == s - i += 1 - assert i == 10 - sio = io.StringIO(s * 2) - sio.close() - raises(ValueError, next, sio) - - def test_getstate(self): - import io - - sio = io.StringIO() - state = sio.__getstate__() - assert len(state) == 4 - assert isinstance(state[0], unicode) - assert isinstance(state[1], str) - assert isinstance(state[2], int) - assert isinstance(state[3], dict) - sio.close() - raises(ValueError, sio.__getstate__) - - def test_setstate(self): - import io - - sio = io.StringIO() - sio.__setstate__((u"no error", u"\n", 0, None)) - sio.__setstate__((u"no error", u"", 0, {"spam": 3})) - raises(ValueError, sio.__setstate__, (u"", u"f", 0, None)) - raises(ValueError, sio.__setstate__, (u"", u"", -1, None)) - raises(TypeError, sio.__setstate__, ("", u"", 0, None)) - raises(TypeError, sio.__setstate__, (u"", u"", 0.0, None)) - raises(TypeError, sio.__setstate__, (u"", u"", 0, 0)) - raises(TypeError, sio.__setstate__, (u"len-test", 0)) - raises(TypeError, sio.__setstate__) - raises(TypeError, sio.__setstate__, 0) - sio.close() - raises(ValueError, sio.__setstate__, (u"closed", u"", 0, None)) - - def test_roundtrip_state(self): - import io - s = u'12345678' - sio1 = io.StringIO(s) - sio1.foo = 42 - sio1.seek(2) - assert sio1.getvalue() == s - state = sio1.__getstate__() - sio2 = io.StringIO() - sio2.__setstate__(state) - assert sio2.getvalue() == s - assert sio2.foo == 42 - assert sio2.tell() == 2 diff -Nru pypy-7.1.1+dfsg/pypy/module/_io/test/test_textio.py pypy-7.3.1+dfsg/pypy/module/_io/test/test_textio.py --- pypy-7.1.1+dfsg/pypy/module/_io/test/test_textio.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_io/test/test_textio.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,379 +0,0 @@ -class AppTestTextIO: - spaceconfig = dict(usemodules=['_io', '_locale']) - - def test_constructor(self): - import _io - r = _io.BytesIO(b"\xc3\xa9\n\n") - b = _io.BufferedReader(r, 1000) - t = _io.TextIOWrapper(b) - t.__init__(b, encoding="latin1", newline="\r\n") - assert t.encoding == "latin1" - assert t.line_buffering == False - t.__init__(b, encoding="utf8", line_buffering=True) - assert t.encoding == "utf8" - assert t.line_buffering == True - assert t.readline() == u"\xe9\n" - raises(TypeError, t.__init__, b, newline=42) - raises(ValueError, t.__init__, b, newline='xyzzy') - t = _io.TextIOWrapper(b) - assert t.encoding - - def test_properties(self): - import _io - r = _io.BytesIO(b"\xc3\xa9\n\n") - b = _io.BufferedReader(r, 1000) - t = _io.TextIOWrapper(b) - assert t.readable() - assert t.seekable() - # - class CustomFile(object): - def isatty(self): return 'YES' - readable = writable = seekable = lambda self: False - t = _io.TextIOWrapper(CustomFile()) - assert t.isatty() == 'YES' - - def test_default_implementations(self): - import _io - file = _io._TextIOBase() - raises(_io.UnsupportedOperation, file.read) - raises(_io.UnsupportedOperation, file.seek, 0) - raises(_io.UnsupportedOperation, file.readline) - raises(_io.UnsupportedOperation, file.detach) - - def test_unreadable(self): - import _io - class UnReadable(_io.BytesIO): - def readable(self): - return False - txt = _io.TextIOWrapper(UnReadable()) - raises(IOError, txt.read) - - def test_detach(self): - import _io - b = _io.BytesIO() - f = _io.TextIOWrapper(b) - assert f.detach() is b - raises(ValueError, f.fileno) - raises(ValueError, f.close) - raises(ValueError, f.detach) - raises(ValueError, f.flush) - - # Operations independent of the detached stream should still work - repr(f) - assert isinstance(f.encoding, str) - assert f.errors == "strict" - assert not f.line_buffering - - assert not b.closed - b.close() - - def test_newlinetranslate(self): - import _io - r = _io.BytesIO(b"abc\r\ndef\rg") - b = _io.BufferedReader(r, 1000) - t = _io.TextIOWrapper(b) - assert t.read() == u"abc\ndef\ng" - - def test_one_by_one(self): - import _io - r = _io.BytesIO(b"abc\r\ndef\rg") - t = _io.TextIOWrapper(r) - reads = [] - while True: - c = t.read(1) - assert len(c) <= 1 - if not c: - break - reads.append(c) - assert u''.join(reads) == u"abc\ndef\ng" - - def test_read_some_then_all(self): - import _io - r = _io.BytesIO("abc\ndef\n") - t = _io.TextIOWrapper(r) - reads = t.read(4) - reads += t.read() - assert reads == u"abc\ndef\n" - - def test_read_some_then_readline(self): - import _io - r = _io.BytesIO("abc\ndef\n") - t = _io.TextIOWrapper(r) - reads = t.read(4) - reads += t.readline() - assert reads == u"abc\ndef\n" - - def test_encoded_writes(self): - import _io - data = u"1234567890" - tests = ("utf-16", - "utf-16-le", - "utf-16-be", - "utf-32", - "utf-32-le", - "utf-32-be") - for encoding in tests: - buf = _io.BytesIO() - f = _io.TextIOWrapper(buf, encoding=encoding) - # Check if the BOM is written only once (see issue1753). - f.write(data) - f.write(data) - f.seek(0) - assert f.read() == data * 2 - f.seek(0) - assert f.read() == data * 2 - assert buf.getvalue() == (data * 2).encode(encoding) - - def test_writelines_error(self): - import _io - txt = _io.TextIOWrapper(_io.BytesIO()) - raises(TypeError, txt.writelines, [1, 2, 3]) - raises(TypeError, txt.writelines, None) - raises(TypeError, txt.writelines, b'abc') - - def test_tell(self): - import _io - r = _io.BytesIO("abc\ndef\n") - t = _io.TextIOWrapper(r) - assert t.tell() == 0 - t.read(4) - assert t.tell() == 4 - - def test_destructor(self): - import _io - l = [] - class MyBytesIO(_io.BytesIO): - def close(self): - l.append(self.getvalue()) - _io.BytesIO.close(self) - b = MyBytesIO() - t = _io.TextIOWrapper(b, encoding="ascii") - t.write(u"abc") - del t - import gc; gc.collect() - assert l == ["abc"] - - def test_newlines(self): - import _io - input_lines = [ "unix\n", "windows\r\n", "os9\r", "last\n", "nonl" ] - - tests = [ - [ None, [ 'unix\n', 'windows\n', 'os9\n', 'last\n', 'nonl' ] ], - [ '', input_lines ], - [ '\n', [ "unix\n", "windows\r\n", "os9\rlast\n", "nonl" ] ], - [ '\r\n', [ "unix\nwindows\r\n", "os9\rlast\nnonl" ] ], - [ '\r', [ "unix\nwindows\r", "\nos9\r", "last\nnonl" ] ], - ] - - # Try a range of buffer sizes to test the case where \r is the last - # character in TextIOWrapper._pending_line. - encoding = "ascii" - # XXX: str.encode() should return bytes - data = bytes(''.join(input_lines).encode(encoding)) - for do_reads in (False, True): - for bufsize in range(1, 10): - for newline, exp_lines in tests: - bufio = _io.BufferedReader(_io.BytesIO(data), bufsize) - textio = _io.TextIOWrapper(bufio, newline=newline, - encoding=encoding) - if do_reads: - got_lines = [] - while True: - c2 = textio.read(2) - if c2 == '': - break - len(c2) == 2 - got_lines.append(c2 + textio.readline()) - else: - got_lines = list(textio) - - for got_line, exp_line in zip(got_lines, exp_lines): - assert got_line == exp_line - assert len(got_lines) == len(exp_lines) - - def test_readline(self): - import _io - - s = "AAA\r\nBBB\rCCC\r\nDDD\nEEE\r\n" - r = "AAA\nBBB\nCCC\nDDD\nEEE\n".decode("ascii") - txt = _io.TextIOWrapper(_io.BytesIO(s), encoding="ascii") - txt._CHUNK_SIZE = 4 - - reads = txt.read(4) - reads += txt.read(4) - reads += txt.readline() - reads += txt.readline() - reads += txt.readline() - assert reads == r - - def test_name(self): - import _io - - t = _io.TextIOWrapper(_io.BytesIO("")) - # CPython raises an AttributeError, we raise a TypeError. - raises((AttributeError, TypeError), setattr, t, "name", "anything") - - def test_repr(self): - import _io - - t = _io.TextIOWrapper(_io.BytesIO(""), encoding="utf-8") - assert repr(t) == "<_io.TextIOWrapper encoding='utf-8'>" - t = _io.TextIOWrapper(_io.BytesIO(""), encoding="ascii") - assert repr(t) == "<_io.TextIOWrapper encoding='ascii'>" - t = _io.TextIOWrapper(_io.BytesIO(""), encoding=u"utf-8") - assert repr(t) == "<_io.TextIOWrapper encoding='utf-8'>" - b = _io.BytesIO("") - t = _io.TextIOWrapper(b, encoding="utf-8") - b.name = "dummy" - assert repr(t) == "<_io.TextIOWrapper name='dummy' encoding='utf-8'>" - - def test_flush_error_on_close(self): - import _io - txt = _io.TextIOWrapper(_io.BytesIO(b""), encoding="ascii") - def bad_flush(): - raise IOError() - txt.flush = bad_flush - raises(IOError, txt.close) # exception not swallowed - assert txt.closed - - def test_illegal_decoder(self): - import _io - t = _io.TextIOWrapper(_io.BytesIO(b'aaaaaa'), newline='\n', - encoding='quopri_codec') - raises(TypeError, t.read, 1) - t = _io.TextIOWrapper(_io.BytesIO(b'aaaaaa'), newline='\n', - encoding='quopri_codec') - raises(TypeError, t.readline) - t = _io.TextIOWrapper(_io.BytesIO(b'aaaaaa'), newline='\n', - encoding='quopri_codec') - raises(TypeError, t.read) - - def test_read_nonbytes(self): - import _io - class NonbytesStream(_io.StringIO): - read1 = _io.StringIO.read - t = _io.TextIOWrapper(NonbytesStream(u'a')) - raises(TypeError, t.read, 1) - t = _io.TextIOWrapper(NonbytesStream(u'a')) - raises(TypeError, t.readline) - t = _io.TextIOWrapper(NonbytesStream(u'a')) - t.read() == u'a' - - def test_uninitialized(self): - import _io - t = _io.TextIOWrapper.__new__(_io.TextIOWrapper) - del t - t = _io.TextIOWrapper.__new__(_io.TextIOWrapper) - raises(Exception, repr, t) - raises(ValueError, t.read, 0) - t.__init__(_io.BytesIO()) - assert t.read(0) == u'' - - -class AppTestIncrementalNewlineDecoder: - def test_newline_decoder(self): - import _io - def check_newline_decoding_utf8(decoder): - # UTF-8 specific tests for a newline decoder - def _check_decode(b, s, **kwargs): - # We exercise getstate() / setstate() as well as decode() - state = decoder.getstate() - assert decoder.decode(b, **kwargs) == s - decoder.setstate(state) - assert decoder.decode(b, **kwargs) == s - - _check_decode(b'\xe8\xa2\x88', u"\u8888") - - _check_decode(b'\xe8', "") - _check_decode(b'\xa2', "") - _check_decode(b'\x88', u"\u8888") - - _check_decode(b'\xe8', "") - _check_decode(b'\xa2', "") - _check_decode(b'\x88', u"\u8888") - - _check_decode(b'\xe8', "") - raises(UnicodeDecodeError, decoder.decode, b'', final=True) - - decoder.reset() - _check_decode(b'\n', "\n") - _check_decode(b'\r', "") - _check_decode(b'', "\n", final=True) - _check_decode(b'\r', "\n", final=True) - - _check_decode(b'\r', "") - _check_decode(b'a', "\na") - - _check_decode(b'\r\r\n', "\n\n") - _check_decode(b'\r', "") - _check_decode(b'\r', "\n") - _check_decode(b'\na', "\na") - - _check_decode(b'\xe8\xa2\x88\r\n', u"\u8888\n") - _check_decode(b'\xe8\xa2\x88', u"\u8888") - _check_decode(b'\n', "\n") - _check_decode(b'\xe8\xa2\x88\r', u"\u8888") - _check_decode(b'\n', "\n") - - def check_newline_decoding(decoder, encoding): - result = [] - if encoding is not None: - encoder = codecs.getincrementalencoder(encoding)() - def _decode_bytewise(s): - # Decode one byte at a time - for b in encoder.encode(s): - result.append(decoder.decode(b)) - else: - encoder = None - def _decode_bytewise(s): - # Decode one char at a time - for c in s: - result.append(decoder.decode(c)) - assert decoder.newlines == None - _decode_bytewise(u"abc\n\r") - assert decoder.newlines == '\n' - _decode_bytewise(u"\nabc") - assert decoder.newlines == ('\n', '\r\n') - _decode_bytewise(u"abc\r") - assert decoder.newlines == ('\n', '\r\n') - _decode_bytewise(u"abc") - assert decoder.newlines == ('\r', '\n', '\r\n') - _decode_bytewise(u"abc\r") - assert "".join(result) == "abc\n\nabcabc\nabcabc" - decoder.reset() - input = u"abc" - if encoder is not None: - encoder.reset() - input = encoder.encode(input) - assert decoder.decode(input) == "abc" - assert decoder.newlines is None - - encodings = ( - # None meaning the IncrementalNewlineDecoder takes unicode input - # rather than bytes input - None, 'utf-8', 'latin-1', - 'utf-16', 'utf-16-le', 'utf-16-be', - 'utf-32', 'utf-32-le', 'utf-32-be', - ) - import codecs - for enc in encodings: - decoder = enc and codecs.getincrementaldecoder(enc)() - decoder = _io.IncrementalNewlineDecoder(decoder, translate=True) - check_newline_decoding(decoder, enc) - decoder = codecs.getincrementaldecoder("utf-8")() - decoder = _io.IncrementalNewlineDecoder(decoder, translate=True) - check_newline_decoding_utf8(decoder) - - def test_newline_bytes(self): - import _io - # Issue 5433: Excessive optimization in IncrementalNewlineDecoder - def _check(dec): - assert dec.newlines is None - assert dec.decode(u"\u0D00") == u"\u0D00" - assert dec.newlines is None - assert dec.decode(u"\u0A00") == u"\u0A00" - assert dec.newlines is None - dec = _io.IncrementalNewlineDecoder(None, translate=False) - _check(dec) - dec = _io.IncrementalNewlineDecoder(None, translate=True) - _check(dec) diff -Nru pypy-7.1.1+dfsg/pypy/module/itertools/__init__.py pypy-7.3.1+dfsg/pypy/module/itertools/__init__.py --- pypy-7.1.1+dfsg/pypy/module/itertools/__init__.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/itertools/__init__.py 2020-04-10 19:28:41.000000000 +0000 @@ -1,58 +0,0 @@ - -from pypy.interpreter.mixedmodule import MixedModule - -class Module(MixedModule): - """Functional tools for creating and using iterators. - - Infinite iterators: - count([n]) --> n, n+1, n+2, ... - cycle(p) --> p0, p1, ... plast, p0, p1, ... - repeat(elem [,n]) --> elem, elem, elem, ... endlessly or up to n times - - Iterators terminating on the shortest input sequence: - ifilter(pred, seq) --> elements of seq where pred(elem) is True - ifilterfalse(pred, seq) --> elements of seq where pred(elem) is False - islice(seq, [start,] stop [, step]) --> elements from - seq[start:stop:step] - imap(fun, p, q, ...) --> fun(p0, q0), fun(p1, q1), ... - starmap(fun, seq) --> fun(*seq[0]), fun(*seq[1]), ... - tee(it, n=2) --> (it1, it2 , ... itn) splits one iterator into n - chain(p, q, ...) --> p0, p1, ... plast, q0, q1, ... - takewhile(pred, seq) --> seq[0], seq[1], until pred fails - dropwhile(pred, seq) --> seq[n], seq[n+1], starting when pred fails - groupby(iterable[, keyfunc]) --> sub-iterators grouped by value of keyfunc(v) - izip(p, q, ...) --> (p[0], q[0]), (p[1], q[1]), ... - izip_longest(p, q, ...) --> (p[0], q[0]), (p[1], q[1]), ... - - Combinatoric generators: - product(p, q, ... [repeat=1]) --> cartesian product - permutations(p[, r]) - combinations(p, r) - combinations_with_replacement(p, r) - """ - - interpleveldefs = { - 'chain' : 'interp_itertools.W_Chain', - 'combinations' : 'interp_itertools.W_Combinations', - 'combinations_with_replacement' : 'interp_itertools.W_CombinationsWithReplacement', - 'compress' : 'interp_itertools.W_Compress', - 'count' : 'interp_itertools.W_Count', - 'cycle' : 'interp_itertools.W_Cycle', - 'dropwhile' : 'interp_itertools.W_DropWhile', - 'groupby' : 'interp_itertools.W_GroupBy', - 'ifilter' : 'interp_itertools.W_IFilter', - 'ifilterfalse' : 'interp_itertools.W_IFilterFalse', - 'imap' : 'interp_itertools.W_IMap', - 'islice' : 'interp_itertools.W_ISlice', - 'izip' : 'interp_itertools.W_IZip', - 'izip_longest' : 'interp_itertools.W_IZipLongest', - 'permutations' : 'interp_itertools.W_Permutations', - 'product' : 'interp_itertools.W_Product', - 'repeat' : 'interp_itertools.W_Repeat', - 'starmap' : 'interp_itertools.W_StarMap', - 'takewhile' : 'interp_itertools.W_TakeWhile', - 'tee' : 'interp_itertools.tee', - } - - appleveldefs = { - } diff -Nru pypy-7.1.1+dfsg/pypy/module/itertools/interp_itertools.py pypy-7.3.1+dfsg/pypy/module/itertools/interp_itertools.py --- pypy-7.1.1+dfsg/pypy/module/itertools/interp_itertools.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/itertools/interp_itertools.py 2020-04-10 19:28:41.000000000 +0000 @@ -322,10 +322,12 @@ """) +def get_printable_location(greenkey): + return "islice_ignore_items [%s]" % (greenkey.iterator_greenkey_printable(), ) islice_ignore_items_driver = jit.JitDriver(name='islice_ignore_items', - greens=['tp'], - reds=['num', 'w_islice', - 'w_iterator']) + greens=['greenkey'], + reds='auto', + get_printable_location=get_printable_location) class W_ISlice(W_Root): def __init__(self, space, w_iterable, w_startstop, args_w): @@ -418,12 +420,9 @@ if w_iterator is None: raise OperationError(self.space.w_StopIteration, self.space.w_None) - tp = self.space.type(w_iterator) + greenkey = self.space.iterator_greenkey(w_iterator) while True: - islice_ignore_items_driver.jit_merge_point(tp=tp, - num=num, - w_islice=self, - w_iterator=w_iterator) + islice_ignore_items_driver.jit_merge_point(greenkey=greenkey) try: self.space.next(w_iterator) except OperationError as e: diff -Nru pypy-7.1.1+dfsg/pypy/module/itertools/moduledef.py pypy-7.3.1+dfsg/pypy/module/itertools/moduledef.py --- pypy-7.1.1+dfsg/pypy/module/itertools/moduledef.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/itertools/moduledef.py 2020-04-10 19:28:41.000000000 +0000 @@ -0,0 +1,58 @@ + +from pypy.interpreter.mixedmodule import MixedModule + +class Module(MixedModule): + """Functional tools for creating and using iterators. + + Infinite iterators: + count([n]) --> n, n+1, n+2, ... + cycle(p) --> p0, p1, ... plast, p0, p1, ... + repeat(elem [,n]) --> elem, elem, elem, ... endlessly or up to n times + + Iterators terminating on the shortest input sequence: + ifilter(pred, seq) --> elements of seq where pred(elem) is True + ifilterfalse(pred, seq) --> elements of seq where pred(elem) is False + islice(seq, [start,] stop [, step]) --> elements from + seq[start:stop:step] + imap(fun, p, q, ...) --> fun(p0, q0), fun(p1, q1), ... + starmap(fun, seq) --> fun(*seq[0]), fun(*seq[1]), ... + tee(it, n=2) --> (it1, it2 , ... itn) splits one iterator into n + chain(p, q, ...) --> p0, p1, ... plast, q0, q1, ... + takewhile(pred, seq) --> seq[0], seq[1], until pred fails + dropwhile(pred, seq) --> seq[n], seq[n+1], starting when pred fails + groupby(iterable[, keyfunc]) --> sub-iterators grouped by value of keyfunc(v) + izip(p, q, ...) --> (p[0], q[0]), (p[1], q[1]), ... + izip_longest(p, q, ...) --> (p[0], q[0]), (p[1], q[1]), ... + + Combinatoric generators: + product(p, q, ... [repeat=1]) --> cartesian product + permutations(p[, r]) + combinations(p, r) + combinations_with_replacement(p, r) + """ + + interpleveldefs = { + 'chain' : 'interp_itertools.W_Chain', + 'combinations' : 'interp_itertools.W_Combinations', + 'combinations_with_replacement' : 'interp_itertools.W_CombinationsWithReplacement', + 'compress' : 'interp_itertools.W_Compress', + 'count' : 'interp_itertools.W_Count', + 'cycle' : 'interp_itertools.W_Cycle', + 'dropwhile' : 'interp_itertools.W_DropWhile', + 'groupby' : 'interp_itertools.W_GroupBy', + 'ifilter' : 'interp_itertools.W_IFilter', + 'ifilterfalse' : 'interp_itertools.W_IFilterFalse', + 'imap' : 'interp_itertools.W_IMap', + 'islice' : 'interp_itertools.W_ISlice', + 'izip' : 'interp_itertools.W_IZip', + 'izip_longest' : 'interp_itertools.W_IZipLongest', + 'permutations' : 'interp_itertools.W_Permutations', + 'product' : 'interp_itertools.W_Product', + 'repeat' : 'interp_itertools.W_Repeat', + 'starmap' : 'interp_itertools.W_StarMap', + 'takewhile' : 'interp_itertools.W_TakeWhile', + 'tee' : 'interp_itertools.tee', + } + + appleveldefs = { + } diff -Nru pypy-7.1.1+dfsg/pypy/module/itertools/test/test_itertools.py pypy-7.3.1+dfsg/pypy/module/itertools/test/test_itertools.py --- pypy-7.1.1+dfsg/pypy/module/itertools/test/test_itertools.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/itertools/test/test_itertools.py 2020-04-10 19:28:41.000000000 +0000 @@ -645,6 +645,16 @@ assert a == [] assert b == [(True, 9)] + def test_groupby_crash(self): + # see http://bugs.python.org/issue30347 + from itertools import groupby + def f(n): + if n == 5: + list(b) + return n != 6 + for (k, b) in groupby(range(10), f): + list(b) # shouldn't crash + def test_iterables(self): import itertools diff -Nru pypy-7.1.1+dfsg/pypy/module/_jitlog/__init__.py pypy-7.3.1+dfsg/pypy/module/_jitlog/__init__.py --- pypy-7.1.1+dfsg/pypy/module/_jitlog/__init__.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_jitlog/__init__.py 2020-04-10 19:28:40.000000000 +0000 @@ -1,13 +0,0 @@ -from pypy.interpreter.mixedmodule import MixedModule -from rpython.rlib.rvmprof import VMProfPlatformUnsupported - -class Module(MixedModule): - """ JitLog the new logging facility """ - appleveldefs = { - } - - interpleveldefs = { - 'enable': 'interp_jitlog.enable', - 'disable': 'interp_jitlog.disable', - 'JitlogError': 'space.fromcache(interp_jitlog.Cache).w_JitlogError', - } diff -Nru pypy-7.1.1+dfsg/pypy/module/_jitlog/moduledef.py pypy-7.3.1+dfsg/pypy/module/_jitlog/moduledef.py --- pypy-7.1.1+dfsg/pypy/module/_jitlog/moduledef.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_jitlog/moduledef.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,13 @@ +from pypy.interpreter.mixedmodule import MixedModule +from rpython.rlib.rvmprof import VMProfPlatformUnsupported + +class Module(MixedModule): + """ JitLog the new logging facility """ + appleveldefs = { + } + + interpleveldefs = { + 'enable': 'interp_jitlog.enable', + 'disable': 'interp_jitlog.disable', + 'JitlogError': 'space.fromcache(interp_jitlog.Cache).w_JitlogError', + } diff -Nru pypy-7.1.1+dfsg/pypy/module/_jitlog/test/test__jitlog.py pypy-7.3.1+dfsg/pypy/module/_jitlog/test/test__jitlog.py --- pypy-7.1.1+dfsg/pypy/module/_jitlog/test/test__jitlog.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_jitlog/test/test__jitlog.py 2020-04-10 19:28:40.000000000 +0000 @@ -1,10 +1,14 @@ import sys import platform +import pytest from rpython.tool.udir import udir from pypy.tool.pytest.objspace import gettestobjspace from rpython.rlib.rjitlog import rjitlog as jl from rpython.jit.metainterp.resoperation import opname +win32_untranslated ="not config.option.runappdirect and sys.platform == 'win32'" +win32_reason = "fileno may come from different runtimes depending on current compiler" + class AppTestJitLog(object): spaceconfig = {'usemodules': ['_jitlog', 'struct']} @@ -19,6 +23,7 @@ for key, value in opname.items(): space.setitem(cls.w_resops, space.wrap(key), space.wrap(value)) + @pytest.mark.skipif(win32_untranslated, reason=win32_reason) def test_enable(self): import _jitlog, struct tmpfile = open(self.tmpfilename, 'wb') diff -Nru pypy-7.1.1+dfsg/pypy/module/_locale/__init__.py pypy-7.3.1+dfsg/pypy/module/_locale/__init__.py --- pypy-7.1.1+dfsg/pypy/module/_locale/__init__.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_locale/__init__.py 2020-04-10 19:28:40.000000000 +0000 @@ -1,45 +0,0 @@ -from pypy.interpreter.mixedmodule import MixedModule -from rpython.rlib import rlocale -import sys - -class Module(MixedModule): - """Support for POSIX locales.""" - - interpleveldefs = { - 'setlocale': 'interp_locale.setlocale', - 'localeconv': 'interp_locale.localeconv', - 'strcoll': 'interp_locale.strcoll', - 'strxfrm': 'interp_locale.strxfrm', - 'Error': 'interp_locale.W_Error', - } - - if sys.platform == 'win32': - interpleveldefs.update({ - '_getdefaultlocale': 'interp_locale.getdefaultlocale', - }) - - if rlocale.HAVE_LANGINFO: - interpleveldefs.update({ - 'nl_langinfo': 'interp_locale.nl_langinfo', - }) - if rlocale.HAVE_LIBINTL: - interpleveldefs.update({ - 'gettext': 'interp_locale.gettext', - 'dgettext': 'interp_locale.dgettext', - 'dcgettext': 'interp_locale.dcgettext', - 'textdomain': 'interp_locale.textdomain', - 'bindtextdomain': 'interp_locale.bindtextdomain', - }) - if rlocale.HAVE_BIND_TEXTDOMAIN_CODESET: - interpleveldefs.update({ - 'bind_textdomain_codeset':'interp_locale.bind_textdomain_codeset', - }) - - appleveldefs = { - } - - def buildloaders(cls): - for constant, value in rlocale.constants.iteritems(): - Module.interpleveldefs[constant] = "space.wrap(%r)" % value - super(Module, cls).buildloaders() - buildloaders = classmethod(buildloaders) diff -Nru pypy-7.1.1+dfsg/pypy/module/_locale/moduledef.py pypy-7.3.1+dfsg/pypy/module/_locale/moduledef.py --- pypy-7.1.1+dfsg/pypy/module/_locale/moduledef.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_locale/moduledef.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,45 @@ +from pypy.interpreter.mixedmodule import MixedModule +from rpython.rlib import rlocale +import sys + +class Module(MixedModule): + """Support for POSIX locales.""" + + interpleveldefs = { + 'setlocale': 'interp_locale.setlocale', + 'localeconv': 'interp_locale.localeconv', + 'strcoll': 'interp_locale.strcoll', + 'strxfrm': 'interp_locale.strxfrm', + 'Error': 'interp_locale.W_Error', + } + + if sys.platform == 'win32': + interpleveldefs.update({ + '_getdefaultlocale': 'interp_locale.getdefaultlocale', + }) + + if rlocale.HAVE_LANGINFO: + interpleveldefs.update({ + 'nl_langinfo': 'interp_locale.nl_langinfo', + }) + if rlocale.HAVE_LIBINTL: + interpleveldefs.update({ + 'gettext': 'interp_locale.gettext', + 'dgettext': 'interp_locale.dgettext', + 'dcgettext': 'interp_locale.dcgettext', + 'textdomain': 'interp_locale.textdomain', + 'bindtextdomain': 'interp_locale.bindtextdomain', + }) + if rlocale.HAVE_BIND_TEXTDOMAIN_CODESET: + interpleveldefs.update({ + 'bind_textdomain_codeset':'interp_locale.bind_textdomain_codeset', + }) + + appleveldefs = { + } + + def buildloaders(cls): + for constant, value in rlocale.constants.iteritems(): + Module.interpleveldefs[constant] = "space.wrap(%r)" % value + super(Module, cls).buildloaders() + buildloaders = classmethod(buildloaders) diff -Nru pypy-7.1.1+dfsg/pypy/module/_lsprof/__init__.py pypy-7.3.1+dfsg/pypy/module/_lsprof/__init__.py --- pypy-7.1.1+dfsg/pypy/module/_lsprof/__init__.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_lsprof/__init__.py 2020-04-10 19:28:40.000000000 +0000 @@ -1,10 +0,0 @@ - -""" _lsprof module -""" - -from pypy.interpreter.mixedmodule import MixedModule - -class Module(MixedModule): - interpleveldefs = {'Profiler':'interp_lsprof.W_Profiler'} - - appleveldefs = {} diff -Nru pypy-7.1.1+dfsg/pypy/module/_lsprof/moduledef.py pypy-7.3.1+dfsg/pypy/module/_lsprof/moduledef.py --- pypy-7.1.1+dfsg/pypy/module/_lsprof/moduledef.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_lsprof/moduledef.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,10 @@ + +""" _lsprof module +""" + +from pypy.interpreter.mixedmodule import MixedModule + +class Module(MixedModule): + interpleveldefs = {'Profiler':'interp_lsprof.W_Profiler'} + + appleveldefs = {} diff -Nru pypy-7.1.1+dfsg/pypy/module/_lsprof/test/test_cprofile.py pypy-7.3.1+dfsg/pypy/module/_lsprof/test/test_cprofile.py --- pypy-7.1.1+dfsg/pypy/module/_lsprof/test/test_cprofile.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_lsprof/test/test_cprofile.py 2020-04-10 19:28:40.000000000 +0000 @@ -4,7 +4,6 @@ } def setup_class(cls): - cls.w_expected_output = cls.space.wrap(expected_output) cls.w_file = cls.space.wrap(__file__) def test_repr(self): @@ -167,153 +166,3 @@ prof.disable() stats = prof.getstats() assert len(stats) == 2 - - def test_use_cprofile(self): - import sys, os - # XXX this is evil trickery to walk around the fact that we don't - # have __file__ at app-level here - sys.path.insert(0, os.path.dirname(self.file)) - try: - import re - from cProfile import Profile - from profilee import testfunc, timer - - methodnames = ['print_stats', 'print_callers', 'print_callees'] - - def do_profiling(cls): - results = [] - prof = cls(timer, 0.001) - start_timer = timer() - prof.runctx("testfunc()", {'testfunc':testfunc}, locals()) - results.append(timer() - start_timer) - for methodname in methodnames: - import pstats - from StringIO import StringIO - s = StringIO() - stats = pstats.Stats(prof, stream=s) - stats.strip_dirs().sort_stats("stdname") - getattr(stats, methodname)() - results.append(s.getvalue()) - return results, prof - - res, prof = do_profiling(Profile) - assert res[0] == 1000 - for i, method in enumerate(methodnames): - got = res[i + 1] - expected = self.expected_output[method] - patterns = expected.splitlines() - lines = set(got.splitlines()) - lines.remove('') # ignore blank lines - for pattern in patterns: - if not pattern: - continue # ignore blank lines - pattern = pattern.replace('(', '\\(') - pattern = pattern.replace(')', '\\)') - pattern = pattern.replace('?', '\\?') - pattern = pattern.replace(r'\\?', '?') - pattern = pattern.replace(r'\\(', '(') - pattern = pattern.replace(r'\\)', ')') - repattern = re.compile('^' + pattern + '$') - for line in lines: - if repattern.match(line): - lines.remove(line) - break - else: - print('NOT FOUND: %s' % pattern.rstrip('\n')) - print('--- GOT ---') - print(got) - print('') - print('--- EXPECTED ---') - print(expected) - assert False - assert not lines - finally: - sys.path.pop(0) - - -expected_output = {} -expected_output['print_stats'] = """\ - 126 function calls (106 primitive calls) in 1.000 seconds - - Ordered by: standard name - - ncalls tottime percall cumtime percall filename:lineno(function) - 1 0.000 0.000 1.000 1.000 :1() - 28 0.028 0.001 0.028 0.001 profilee.py:110(__getattr__) - 1 0.270 0.270 1.000 1.000 profilee.py:25(testfunc) - 23/3 0.150 0.007 0.170 0.057 profilee.py:35(factorial) - 20 0.020 0.001 0.020 0.001 profilee.py:48(mul) - 2 0.040 0.020 0.600 0.300 profilee.py:55(helper) - 4 0.116 0.029 0.120 0.030 profilee.py:73(helper1) - 2 0.000 0.000 0.140 0.070 profilee.py:84(helper2_indirect) - 8 0.312 0.039 0.400 0.050 profilee.py:88(helper2) - 8 0.064 0.008 0.080 0.010 profilee.py:98(subhelper) - 4 0.000 0.000 0.000 0.000 {method 'append' of 'list' objects} - 1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects} - 12 0.000 0.000 0.012 0.001 {hasattr} - 8 0.000 0.000 0.000 0.000 {range} - 4 0.000 0.000 0.000 0.000 {sys.exc_info} - - -""" - -expected_output['print_callers'] = """\ - Ordered by: standard name - -Function * was called by... - * ncalls tottime cumtime -:1() * <- -profilee.py:110(__getattr__) * <- 16 0.016 0.016 profilee.py:98(subhelper) - * 12 0.012 0.012 {hasattr.*} -profilee.py:25(testfunc) * <- 1 0.270 1.000 :1() -profilee.py:35(factorial) * <- 1 0.014 0.130 profilee.py:25(testfunc) - * 20/3 0.130 0.147 profilee.py:35(factorial) - * 2 0.006 0.040 profilee.py:84(helper2_indirect) -profilee.py:48(mul) * <- 20 0.020 0.020 profilee.py:35(factorial) -profilee.py:55(helper) * <- 2 0.040 0.600 profilee.py:25(testfunc) -profilee.py:73(helper1) * <- 4 0.116 0.120 profilee.py:55(helper) -profilee.py:84(helper2_indirect) *<- 2 0.000 0.140 profilee.py:55(helper) -profilee.py:88(helper2) * <- 6 0.234 0.300 profilee.py:55(helper) - * 2 0.078 0.100 profilee.py:84(helper2_indirect) -profilee.py:98(subhelper) * <- 8 0.064 0.080 profilee.py:88(helper2) -{.*append.*} * <- 4 0.000 0.000 profilee.py:73(helper1) -{.*disable.*} * <- -{hasattr.*} * <- 4 0.000 0.004 profilee.py:73(helper1) - * 8 0.000 0.008 profilee.py:88(helper2) -{range.*} * <- 8 0.000 0.000 profilee.py:98(subhelper) -{sys.exc_info.*} * <- 4 0.000 0.000 profilee.py:73(helper1) - - -""" -expected_output['print_callees'] = """\ - Ordered by: standard name - -Function * called... - * ncalls tottime cumtime -:1() * -> 1 0.270 1.000 profilee.py:25(testfunc) -profilee.py:110(__getattr__) * -> -profilee.py:25(testfunc) * -> 1 0.014 0.130 profilee.py:35(factorial) - * 2 0.040 0.600 profilee.py:55(helper) -profilee.py:35(factorial) * -> 20/3 0.130 0.147 profilee.py:35(factorial) - * 20 0.020 0.020 profilee.py:48(mul) -profilee.py:48(mul) * -> -profilee.py:55(helper) * -> 4 0.116 0.120 profilee.py:73(helper1) - * 2 0.000 0.140 profilee.py:84(helper2_indirect) - * 6 0.234 0.300 profilee.py:88(helper2) -\\(profilee.py:73(helper1)\\)\\? * .. 4 0.000 0.000 {.*append.*} -\\(profilee.py:73(helper1)\\)\\? * .. 4 0.000 0.004 {.*hasattr.*} - * 4 0.000 0.000 {sys.exc_info.*} -profilee.py:84(helper2_indirect) * -> 2 0.006 0.040 profilee.py:35(factorial) - * 2 0.078 0.100 profilee.py:88(helper2) -profilee.py:88(helper2) * -> 8 0.064 0.080 profilee.py:98(subhelper) - * 8 0.000 0.008 {hasattr.*} -profilee.py:98(subhelper) * -> 16 0.016 0.016 profilee.py:110(__getattr__) - * 8 0.000 0.000 {range.*} -{.*append.*} * -> -{.*disable.*} * -> -{hasattr.*} * -> 12 0.012 0.012 profilee.py:110(__getattr__) -{range.*} * -> -{sys.exc_info.*} * -> - - -""" diff -Nru pypy-7.1.1+dfsg/pypy/module/marshal/__init__.py pypy-7.3.1+dfsg/pypy/module/marshal/__init__.py --- pypy-7.1.1+dfsg/pypy/module/marshal/__init__.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/marshal/__init__.py 2020-04-10 19:28:41.000000000 +0000 @@ -1,18 +0,0 @@ -# Package initialisation -from pypy.interpreter.mixedmodule import MixedModule - -class Module(MixedModule): - """ - This module implements marshal at interpreter level. - """ - - appleveldefs = { - } - - interpleveldefs = { - 'dump' : 'interp_marshal.dump', - 'dumps' : 'interp_marshal.dumps', - 'load' : 'interp_marshal.load', - 'loads' : 'interp_marshal.loads', - 'version' : 'space.newint(interp_marshal.Py_MARSHAL_VERSION)', - } diff -Nru pypy-7.1.1+dfsg/pypy/module/marshal/moduledef.py pypy-7.3.1+dfsg/pypy/module/marshal/moduledef.py --- pypy-7.1.1+dfsg/pypy/module/marshal/moduledef.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/marshal/moduledef.py 2020-04-10 19:28:41.000000000 +0000 @@ -0,0 +1,18 @@ +# Package initialisation +from pypy.interpreter.mixedmodule import MixedModule + +class Module(MixedModule): + """ + This module implements marshal at interpreter level. + """ + + appleveldefs = { + } + + interpleveldefs = { + 'dump' : 'interp_marshal.dump', + 'dumps' : 'interp_marshal.dumps', + 'load' : 'interp_marshal.load', + 'loads' : 'interp_marshal.loads', + 'version' : 'space.newint(interp_marshal.Py_MARSHAL_VERSION)', + } diff -Nru pypy-7.1.1+dfsg/pypy/module/math/__init__.py pypy-7.3.1+dfsg/pypy/module/math/__init__.py --- pypy-7.1.1+dfsg/pypy/module/math/__init__.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/math/__init__.py 2020-04-10 19:28:41.000000000 +0000 @@ -1,54 +0,0 @@ - -# Package initialisation -from pypy.interpreter.mixedmodule import MixedModule - -class Module(MixedModule): - appleveldefs = { - 'factorial' : 'app_math.factorial' - } - - interpleveldefs = { - 'e' : 'interp_math.get(space).w_e', - 'pi' : 'interp_math.get(space).w_pi', - 'pow' : 'interp_math.pow', - 'cosh' : 'interp_math.cosh', - 'copysign' : 'interp_math.copysign', - 'ldexp' : 'interp_math.ldexp', - 'hypot' : 'interp_math.hypot', - 'tan' : 'interp_math.tan', - 'asin' : 'interp_math.asin', - 'fabs' : 'interp_math.fabs', - 'floor' : 'interp_math.floor', - 'sqrt' : 'interp_math.sqrt', - 'frexp' : 'interp_math.frexp', - 'degrees' : 'interp_math.degrees', - 'log' : 'interp_math.log', - 'log10' : 'interp_math.log10', - 'fmod' : 'interp_math.fmod', - 'atan' : 'interp_math.atan', - 'ceil' : 'interp_math.ceil', - 'sinh' : 'interp_math.sinh', - 'cos' : 'interp_math.cos', - 'tanh' : 'interp_math.tanh', - 'radians' : 'interp_math.radians', - 'sin' : 'interp_math.sin', - 'atan2' : 'interp_math.atan2', - 'modf' : 'interp_math.modf', - 'exp' : 'interp_math.exp', - 'expm1' : 'interp_math.expm1', - 'acos' : 'interp_math.acos', - 'isinf' : 'interp_math.isinf', - 'isnan' : 'interp_math.isnan', - 'trunc' : 'interp_math.trunc', - 'fsum' : 'interp_math.fsum', - 'asinh' : 'interp_math.asinh', - 'acosh' : 'interp_math.acosh', - 'atanh' : 'interp_math.atanh', - 'log1p' : 'interp_math.log1p', - 'expm1' : 'interp_math.expm1', - 'erf' : 'interp_math.erf', - 'erfc' : 'interp_math.erfc', - 'gamma' : 'interp_math.gamma', - 'lgamma' : 'interp_math.lgamma', -} - diff -Nru pypy-7.1.1+dfsg/pypy/module/math/moduledef.py pypy-7.3.1+dfsg/pypy/module/math/moduledef.py --- pypy-7.1.1+dfsg/pypy/module/math/moduledef.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/math/moduledef.py 2020-04-10 19:28:41.000000000 +0000 @@ -0,0 +1,54 @@ + +# Package initialisation +from pypy.interpreter.mixedmodule import MixedModule + +class Module(MixedModule): + appleveldefs = { + 'factorial' : 'app_math.factorial' + } + + interpleveldefs = { + 'e' : 'interp_math.get(space).w_e', + 'pi' : 'interp_math.get(space).w_pi', + 'pow' : 'interp_math.pow', + 'cosh' : 'interp_math.cosh', + 'copysign' : 'interp_math.copysign', + 'ldexp' : 'interp_math.ldexp', + 'hypot' : 'interp_math.hypot', + 'tan' : 'interp_math.tan', + 'asin' : 'interp_math.asin', + 'fabs' : 'interp_math.fabs', + 'floor' : 'interp_math.floor', + 'sqrt' : 'interp_math.sqrt', + 'frexp' : 'interp_math.frexp', + 'degrees' : 'interp_math.degrees', + 'log' : 'interp_math.log', + 'log10' : 'interp_math.log10', + 'fmod' : 'interp_math.fmod', + 'atan' : 'interp_math.atan', + 'ceil' : 'interp_math.ceil', + 'sinh' : 'interp_math.sinh', + 'cos' : 'interp_math.cos', + 'tanh' : 'interp_math.tanh', + 'radians' : 'interp_math.radians', + 'sin' : 'interp_math.sin', + 'atan2' : 'interp_math.atan2', + 'modf' : 'interp_math.modf', + 'exp' : 'interp_math.exp', + 'expm1' : 'interp_math.expm1', + 'acos' : 'interp_math.acos', + 'isinf' : 'interp_math.isinf', + 'isnan' : 'interp_math.isnan', + 'trunc' : 'interp_math.trunc', + 'fsum' : 'interp_math.fsum', + 'asinh' : 'interp_math.asinh', + 'acosh' : 'interp_math.acosh', + 'atanh' : 'interp_math.atanh', + 'log1p' : 'interp_math.log1p', + 'expm1' : 'interp_math.expm1', + 'erf' : 'interp_math.erf', + 'erfc' : 'interp_math.erfc', + 'gamma' : 'interp_math.gamma', + 'lgamma' : 'interp_math.lgamma', +} + diff -Nru pypy-7.1.1+dfsg/pypy/module/_md5/__init__.py pypy-7.3.1+dfsg/pypy/module/_md5/__init__.py --- pypy-7.1.1+dfsg/pypy/module/_md5/__init__.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_md5/__init__.py 2020-04-10 19:28:40.000000000 +0000 @@ -1,28 +0,0 @@ - -""" -Mixed-module definition for the md5 module. -Note that there is also a pure Python implementation in pypy/lib/md5.py; -the present mixed-module version of md5 takes precedence if it is enabled. -""" - -from pypy.interpreter.mixedmodule import MixedModule - - -class Module(MixedModule): - """\ -This module implements the interface to RSA's MD5 message digest -algorithm (see also Internet RFC 1321). Its use is quite -straightforward: use new() to create an md5 object. You can now feed -this object with arbitrary strings using the update() method, and at any -point you can ask it for the digest (a strong kind of 128-bit checksum, -a.k.a. ``fingerprint'') of the concatenation of the strings fed to it so -far using the digest() method.""" - - interpleveldefs = { - 'new': 'interp_md5.W_MD5', - 'MD5Type': 'interp_md5.W_MD5', - 'digest_size': 'space.newint(16)', - } - - appleveldefs = { - } diff -Nru pypy-7.1.1+dfsg/pypy/module/_md5/moduledef.py pypy-7.3.1+dfsg/pypy/module/_md5/moduledef.py --- pypy-7.1.1+dfsg/pypy/module/_md5/moduledef.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_md5/moduledef.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,28 @@ + +""" +Mixed-module definition for the md5 module. +Note that there is also a pure Python implementation in pypy/lib/md5.py; +the present mixed-module version of md5 takes precedence if it is enabled. +""" + +from pypy.interpreter.mixedmodule import MixedModule + + +class Module(MixedModule): + """\ +This module implements the interface to RSA's MD5 message digest +algorithm (see also Internet RFC 1321). Its use is quite +straightforward: use new() to create an md5 object. You can now feed +this object with arbitrary strings using the update() method, and at any +point you can ask it for the digest (a strong kind of 128-bit checksum, +a.k.a. ``fingerprint'') of the concatenation of the strings fed to it so +far using the digest() method.""" + + interpleveldefs = { + 'new': 'interp_md5.W_MD5', + 'MD5Type': 'interp_md5.W_MD5', + 'digest_size': 'space.newint(16)', + } + + appleveldefs = { + } diff -Nru pypy-7.1.1+dfsg/pypy/module/_md5/test/test_md5.py pypy-7.3.1+dfsg/pypy/module/_md5/test/test_md5.py --- pypy-7.1.1+dfsg/pypy/module/_md5/test/test_md5.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_md5/test/test_md5.py 2020-04-10 19:28:40.000000000 +0000 @@ -24,7 +24,8 @@ assert self.md5.md5().digest_size == 16 if sys.version_info >= (2, 5): assert self.md5.blocksize == 1 - assert self.md5.md5().digestsize == 16 + # implementation detail, not part of the API + # assert self.md5.md5().digestsize == 16 def test_MD5Type(self): """ diff -Nru pypy-7.1.1+dfsg/pypy/module/micronumpy/boxes.py pypy-7.3.1+dfsg/pypy/module/micronumpy/boxes.py --- pypy-7.1.1+dfsg/pypy/module/micronumpy/boxes.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/micronumpy/boxes.py 2020-04-10 19:28:41.000000000 +0000 @@ -11,7 +11,7 @@ from rpython.rlib.rstring import StringBuilder from rpython.rlib.objectmodel import specialize from rpython.rlib import jit -from rpython.rlib.rutf8 import get_utf8_length +from rpython.rlib.rutf8 import codepoints_in_utf8 from rpython.rtyper.lltypesystem import lltype, rffi from rpython.tool.sourcetools import func_with_new_name from pypy.module.micronumpy import constants as NPY @@ -638,7 +638,7 @@ return self elif dtype.is_object(): return W_ObjectBox(space.newutf8(self._value, - get_utf8_length(self._value))) + codepoints_in_utf8(self._value))) else: raise oefmt(space.w_NotImplementedError, "Conversion from unicode not implemented yet") diff -Nru pypy-7.1.1+dfsg/pypy/module/micronumpy/compile.py pypy-7.3.1+dfsg/pypy/module/micronumpy/compile.py --- pypy-7.1.1+dfsg/pypy/module/micronumpy/compile.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/micronumpy/compile.py 2020-04-10 19:28:41.000000000 +0000 @@ -85,6 +85,7 @@ w_object = W_TypeObject("object") w_buffer = W_TypeObject("buffer") w_type = W_TypeObject("type") + w_frozenset = W_TypeObject("frozenset") def __init__(self, config=None): """NOT_RPYTHON""" diff -Nru pypy-7.1.1+dfsg/pypy/module/micronumpy/__init__.py pypy-7.3.1+dfsg/pypy/module/micronumpy/__init__.py --- pypy-7.1.1+dfsg/pypy/module/micronumpy/__init__.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/micronumpy/__init__.py 2020-04-10 19:28:41.000000000 +0000 @@ -1,149 +0,0 @@ -from pypy.interpreter.mixedmodule import MixedModule - - -class MultiArrayModule(MixedModule): - appleveldefs = { - 'arange': 'app_numpy.arange', - 'add_docstring': 'app_numpy.add_docstring'} - interpleveldefs = { - 'ndarray': 'ndarray.W_NDimArray', - 'dtype': 'descriptor.W_Dtype', - 'flatiter': 'flatiter.W_FlatIterator', - 'flagsobj': 'flagsobj.W_FlagsObject', - - '_reconstruct' : 'ndarray._reconstruct', - 'scalar' : 'ctors.build_scalar', - 'array': 'ctors.array', - 'zeros': 'ctors.zeros', - 'empty': 'ctors.empty', - 'empty_like': 'ctors.empty_like', - 'fromstring': 'ctors.fromstring', - 'frombuffer': 'ctors.frombuffer', - - 'concatenate': 'arrayops.concatenate', - 'count_nonzero': 'arrayops.count_nonzero', - 'dot': 'arrayops.dot', - 'where': 'arrayops.where', - 'result_type': 'casting.result_type', - 'can_cast': 'casting.can_cast', - 'min_scalar_type': 'casting.min_scalar_type', - 'promote_types': 'casting.w_promote_types', - - 'set_string_function': 'appbridge.set_string_function', - 'typeinfo': 'descriptor.get_dtype_cache(space).w_typeinfo', - 'nditer': 'nditer.W_NDIter', - 'broadcast': 'broadcast.W_Broadcast', - - 'set_docstring': 'support.descr_set_docstring', - 'VisibleDeprecationWarning': 'support.W_VisibleDeprecationWarning', - } - for c in ['MAXDIMS', 'CLIP', 'WRAP', 'RAISE']: - interpleveldefs[c] = 'space.wrap(constants.%s)' % c - - def startup(self, space): - from pypy.module.micronumpy.concrete import _setup - _setup() - - -class UMathModule(MixedModule): - appleveldefs = {} - interpleveldefs = { - 'FLOATING_POINT_SUPPORT': 'space.newint(1)', - 'frompyfunc': 'ufuncs.frompyfunc', - } - # ufuncs - for exposed, impl in [ - ("absolute", "absolute"), - ("add", "add"), - ("arccos", "arccos"), - ("arcsin", "arcsin"), - ("arctan", "arctan"), - ("arctan2", "arctan2"), - ("arccosh", "arccosh"), - ("arcsinh", "arcsinh"), - ("arctanh", "arctanh"), - ("conj", "conjugate"), - ("conjugate", "conjugate"), - ("copysign", "copysign"), - ("cos", "cos"), - ("cosh", "cosh"), - ("divide", "divide"), - ("true_divide", "true_divide"), - ("equal", "equal"), - ("exp", "exp"), - ("exp2", "exp2"), - ("expm1", "expm1"), - ("fabs", "fabs"), - ("fmax", "fmax"), - ("fmin", "fmin"), - ("fmod", "fmod"), - ("floor", "floor"), - ("ceil", "ceil"), - ("trunc", "trunc"), - ("greater", "greater"), - ("greater_equal", "greater_equal"), - ("less", "less"), - ("less_equal", "less_equal"), - ("maximum", "maximum"), - ("minimum", "minimum"), - ("mod", "mod"), - ("multiply", "multiply"), - ("negative", "negative"), - ("not_equal", "not_equal"), - ("radians", "radians"), - ("degrees", "degrees"), - ("deg2rad", "radians"), - ("rad2deg", "degrees"), - ("reciprocal", "reciprocal"), - ("rint", "rint"), - ("sign", "sign"), - ("signbit", "signbit"), - ("sin", "sin"), - ("sinh", "sinh"), - ("subtract", "subtract"), - ('sqrt', 'sqrt'), - ('square', 'square'), - ("tan", "tan"), - ("tanh", "tanh"), - ('bitwise_and', 'bitwise_and'), - ('bitwise_or', 'bitwise_or'), - ('bitwise_xor', 'bitwise_xor'), - ('bitwise_not', 'invert'), - ('left_shift', 'left_shift'), - ('right_shift', 'right_shift'), - ('invert', 'invert'), - ('isnan', 'isnan'), - ('isinf', 'isinf'), - ('isfinite', 'isfinite'), - ('logical_and', 'logical_and'), - ('logical_xor', 'logical_xor'), - ('logical_not', 'logical_not'), - ('logical_or', 'logical_or'), - ('log', 'log'), - ('log2', 'log2'), - ('log10', 'log10'), - ('log1p', 'log1p'), - ('power', 'power'), - ('floor_divide', 'floor_divide'), - ('logaddexp', 'logaddexp'), - ('logaddexp2', 'logaddexp2'), - ('real', 'real'), - ('imag', 'imag'), - ]: - interpleveldefs[exposed] = "ufuncs.get(space).%s" % impl - - -class Module(MixedModule): - applevel_name = '_numpypy' - appleveldefs = {} - interpleveldefs = {} - submodules = { - 'multiarray': MultiArrayModule, - 'umath': UMathModule, - } - - def setup_after_space_initialization(self): - from pypy.module.micronumpy.support import W_VisibleDeprecationWarning - for name, w_type in {'VisibleDeprecationWarning': W_VisibleDeprecationWarning}.items(): - setattr(self.space, 'w_' + name, self.space.gettypefor(w_type)) - diff -Nru pypy-7.1.1+dfsg/pypy/module/micronumpy/moduledef.py pypy-7.3.1+dfsg/pypy/module/micronumpy/moduledef.py --- pypy-7.1.1+dfsg/pypy/module/micronumpy/moduledef.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/micronumpy/moduledef.py 2020-04-10 19:28:41.000000000 +0000 @@ -0,0 +1,149 @@ +from pypy.interpreter.mixedmodule import MixedModule + + +class MultiArrayModule(MixedModule): + appleveldefs = { + 'arange': 'app_numpy.arange', + 'add_docstring': 'app_numpy.add_docstring'} + interpleveldefs = { + 'ndarray': 'ndarray.W_NDimArray', + 'dtype': 'descriptor.W_Dtype', + 'flatiter': 'flatiter.W_FlatIterator', + 'flagsobj': 'flagsobj.W_FlagsObject', + + '_reconstruct' : 'ndarray._reconstruct', + 'scalar' : 'ctors.build_scalar', + 'array': 'ctors.array', + 'zeros': 'ctors.zeros', + 'empty': 'ctors.empty', + 'empty_like': 'ctors.empty_like', + 'fromstring': 'ctors.fromstring', + 'frombuffer': 'ctors.frombuffer', + + 'concatenate': 'arrayops.concatenate', + 'count_nonzero': 'arrayops.count_nonzero', + 'dot': 'arrayops.dot', + 'where': 'arrayops.where', + 'result_type': 'casting.result_type', + 'can_cast': 'casting.can_cast', + 'min_scalar_type': 'casting.min_scalar_type', + 'promote_types': 'casting.w_promote_types', + + 'set_string_function': 'appbridge.set_string_function', + 'typeinfo': 'descriptor.get_dtype_cache(space).w_typeinfo', + 'nditer': 'nditer.W_NDIter', + 'broadcast': 'broadcast.W_Broadcast', + + 'set_docstring': 'support.descr_set_docstring', + 'VisibleDeprecationWarning': 'support.W_VisibleDeprecationWarning', + } + for c in ['MAXDIMS', 'CLIP', 'WRAP', 'RAISE']: + interpleveldefs[c] = 'space.wrap(constants.%s)' % c + + def startup(self, space): + from pypy.module.micronumpy.concrete import _setup + _setup() + + +class UMathModule(MixedModule): + appleveldefs = {} + interpleveldefs = { + 'FLOATING_POINT_SUPPORT': 'space.newint(1)', + 'frompyfunc': 'ufuncs.frompyfunc', + } + # ufuncs + for exposed, impl in [ + ("absolute", "absolute"), + ("add", "add"), + ("arccos", "arccos"), + ("arcsin", "arcsin"), + ("arctan", "arctan"), + ("arctan2", "arctan2"), + ("arccosh", "arccosh"), + ("arcsinh", "arcsinh"), + ("arctanh", "arctanh"), + ("conj", "conjugate"), + ("conjugate", "conjugate"), + ("copysign", "copysign"), + ("cos", "cos"), + ("cosh", "cosh"), + ("divide", "divide"), + ("true_divide", "true_divide"), + ("equal", "equal"), + ("exp", "exp"), + ("exp2", "exp2"), + ("expm1", "expm1"), + ("fabs", "fabs"), + ("fmax", "fmax"), + ("fmin", "fmin"), + ("fmod", "fmod"), + ("floor", "floor"), + ("ceil", "ceil"), + ("trunc", "trunc"), + ("greater", "greater"), + ("greater_equal", "greater_equal"), + ("less", "less"), + ("less_equal", "less_equal"), + ("maximum", "maximum"), + ("minimum", "minimum"), + ("mod", "mod"), + ("multiply", "multiply"), + ("negative", "negative"), + ("not_equal", "not_equal"), + ("radians", "radians"), + ("degrees", "degrees"), + ("deg2rad", "radians"), + ("rad2deg", "degrees"), + ("reciprocal", "reciprocal"), + ("rint", "rint"), + ("sign", "sign"), + ("signbit", "signbit"), + ("sin", "sin"), + ("sinh", "sinh"), + ("subtract", "subtract"), + ('sqrt', 'sqrt'), + ('square', 'square'), + ("tan", "tan"), + ("tanh", "tanh"), + ('bitwise_and', 'bitwise_and'), + ('bitwise_or', 'bitwise_or'), + ('bitwise_xor', 'bitwise_xor'), + ('bitwise_not', 'invert'), + ('left_shift', 'left_shift'), + ('right_shift', 'right_shift'), + ('invert', 'invert'), + ('isnan', 'isnan'), + ('isinf', 'isinf'), + ('isfinite', 'isfinite'), + ('logical_and', 'logical_and'), + ('logical_xor', 'logical_xor'), + ('logical_not', 'logical_not'), + ('logical_or', 'logical_or'), + ('log', 'log'), + ('log2', 'log2'), + ('log10', 'log10'), + ('log1p', 'log1p'), + ('power', 'power'), + ('floor_divide', 'floor_divide'), + ('logaddexp', 'logaddexp'), + ('logaddexp2', 'logaddexp2'), + ('real', 'real'), + ('imag', 'imag'), + ]: + interpleveldefs[exposed] = "ufuncs.get(space).%s" % impl + + +class Module(MixedModule): + applevel_name = '_numpypy' + appleveldefs = {} + interpleveldefs = {} + submodules = { + 'multiarray': MultiArrayModule, + 'umath': UMathModule, + } + + def setup_after_space_initialization(self): + from pypy.module.micronumpy.support import W_VisibleDeprecationWarning + for name, w_type in {'VisibleDeprecationWarning': W_VisibleDeprecationWarning}.items(): + setattr(self.space, 'w_' + name, self.space.gettypefor(w_type)) + diff -Nru pypy-7.1.1+dfsg/pypy/module/micronumpy/test/test_support_app.py pypy-7.3.1+dfsg/pypy/module/micronumpy/test/test_support_app.py --- pypy-7.1.1+dfsg/pypy/module/micronumpy/test/test_support_app.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/micronumpy/test/test_support_app.py 2020-04-10 19:28:41.000000000 +0000 @@ -34,10 +34,10 @@ import numpy as np doc = int.bit_length.__doc__ try: - np.set_docstring(int.bit_length, 'foo') - assert int.bit_length.__doc__ == 'foo' + np.set_docstring(np.ndarray.shape, 'foo') + assert np.ndarray.shape.__doc__ == 'foo' finally: - np.set_docstring(int.bit_length, doc) + np.set_docstring(np.ndarray.shape, doc) def test_property_docstring(self): import numpy as np diff -Nru pypy-7.1.1+dfsg/pypy/module/micronumpy/types.py pypy-7.3.1+dfsg/pypy/module/micronumpy/types.py --- pypy-7.1.1+dfsg/pypy/module/micronumpy/types.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/micronumpy/types.py 2020-04-10 19:28:41.000000000 +0000 @@ -1,7 +1,7 @@ import functools import math from rpython.rlib.unroll import unrolling_iterable -from rpython.rlib.rutf8 import Utf8StringIterator, get_utf8_length, Utf8StringBuilder +from rpython.rlib.rutf8 import Utf8StringIterator, codepoints_in_utf8, Utf8StringBuilder from pypy.interpreter.error import OperationError, oefmt from pypy.objspace.std.floatobject import float2string from pypy.objspace.std.complexobject import str_format @@ -2330,7 +2330,7 @@ def to_builtin_type(self, space, box): assert isinstance(box, boxes.W_UnicodeBox) - return space.newutf8(box._value, get_utf8_length(box._value)) + return space.newutf8(box._value, codepoints_in_utf8(box._value)) def eq(self, v1, v2): assert isinstance(v1, boxes.W_UnicodeBox) diff -Nru pypy-7.1.1+dfsg/pypy/module/_minimal_curses/fficurses.py pypy-7.3.1+dfsg/pypy/module/_minimal_curses/fficurses.py --- pypy-7.1.1+dfsg/pypy/module/_minimal_curses/fficurses.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_minimal_curses/fficurses.py 2020-04-10 19:28:40.000000000 +0000 @@ -5,34 +5,42 @@ from rpython.rtyper.tool import rffi_platform from rpython.translator.tool.cbuild import ExternalCompilationInfo -# We cannot trust ncurses5-config, it's broken in various ways in -# various versions. For example it might not list -ltinfo even though -# it's needed, or --cflags might be completely empty. On Ubuntu 10.04 -# it gives -I/usr/include/ncurses, which doesn't exist at all. Crap. - def try_cflags(): yield ExternalCompilationInfo(includes=['curses.h', 'term.h']) yield ExternalCompilationInfo(includes=['curses.h', 'term.h'], include_dirs=['/usr/include/ncurses']) + yield ExternalCompilationInfo(includes=['curses.h', 'term.h'], + include_dirs=['/usr/include/ncursesw']) yield ExternalCompilationInfo(includes=['ncurses/curses.h', 'ncurses/term.h']) def try_ldflags(): - yield ExternalCompilationInfo(libraries=['curses']) yield ExternalCompilationInfo(libraries=['curses', 'tinfo']) + yield ExternalCompilationInfo(libraries=['curses']) + yield ExternalCompilationInfo(libraries=['ncurses', 'tinfo']) yield ExternalCompilationInfo(libraries=['ncurses']) yield ExternalCompilationInfo(libraries=['ncurses'], library_dirs=['/usr/lib64']) + yield ExternalCompilationInfo(libraries=['ncursesw'], + library_dirs=['/usr/lib64']) def try_tools(): try: - yield ExternalCompilationInfo.from_pkg_config("ncurses") + yield ExternalCompilationInfo.from_config_tool("ncursesw6-config") except Exception: pass try: yield ExternalCompilationInfo.from_config_tool("ncurses5-config") except Exception: pass + try: + yield ExternalCompilationInfo.from_pkg_config("ncursesw") + except Exception: + pass + try: + yield ExternalCompilationInfo.from_pkg_config("ncursesw") + except Exception: + pass def try_eci(): for eci in try_tools(): diff -Nru pypy-7.1.1+dfsg/pypy/module/_minimal_curses/__init__.py pypy-7.3.1+dfsg/pypy/module/_minimal_curses/__init__.py --- pypy-7.1.1+dfsg/pypy/module/_minimal_curses/__init__.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_minimal_curses/__init__.py 2020-04-10 19:28:40.000000000 +0000 @@ -1,34 +0,0 @@ -try: - import _curses -except Exception: # probably ImportError or cffi's VerificationError - try: - # when running on top of pypy before it had _curses, settle for minimal - # we prefer _curses so any constants added make it into _minimal_curses - import _minimal_curses as _curses - except ImportError: - import py - py.test.skip("no _curses or _minimal_curses module") # no _curses at all - -from pypy.interpreter.mixedmodule import MixedModule - - -class Module(MixedModule): - """ Low-level interface for curses module, - not meant to be used directly - """ - - appleveldefs = { - 'error' : 'app_curses.error', - } - - interpleveldefs = { - 'setupterm' : 'interp_curses.setupterm', - 'tigetstr' : 'interp_curses.tigetstr', - 'tparm' : 'interp_curses.tparm', - } - -for i in dir(_curses): - i = str(i) # workaround for pypy 2.0-beta2 - val = getattr(_curses, i) - if i.isupper() and type(val) is int: - Module.interpleveldefs[i] = "space.wrap(%s)" % val diff -Nru pypy-7.1.1+dfsg/pypy/module/_minimal_curses/moduledef.py pypy-7.3.1+dfsg/pypy/module/_minimal_curses/moduledef.py --- pypy-7.1.1+dfsg/pypy/module/_minimal_curses/moduledef.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_minimal_curses/moduledef.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,34 @@ +try: + import _curses +except Exception: # probably ImportError or cffi's VerificationError + try: + # when running on top of pypy before it had _curses, settle for minimal + # we prefer _curses so any constants added make it into _minimal_curses + import _minimal_curses as _curses + except ImportError: + import py + py.test.skip("no _curses or _minimal_curses module") # no _curses at all + +from pypy.interpreter.mixedmodule import MixedModule + + +class Module(MixedModule): + """ Low-level interface for curses module, + not meant to be used directly + """ + + appleveldefs = { + 'error' : 'app_curses.error', + } + + interpleveldefs = { + 'setupterm' : 'interp_curses.setupterm', + 'tigetstr' : 'interp_curses.tigetstr', + 'tparm' : 'interp_curses.tparm', + } + +for i in dir(_curses): + i = str(i) # workaround for pypy 2.0-beta2 + val = getattr(_curses, i) + if i.isupper() and type(val) is int: + Module.interpleveldefs[i] = "space.wrap(%s)" % val diff -Nru pypy-7.1.1+dfsg/pypy/module/mmap/__init__.py pypy-7.3.1+dfsg/pypy/module/mmap/__init__.py --- pypy-7.1.1+dfsg/pypy/module/mmap/__init__.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/mmap/__init__.py 2020-04-10 19:28:41.000000000 +0000 @@ -1,23 +0,0 @@ -from pypy.interpreter.mixedmodule import MixedModule - -class Module(MixedModule): - interpleveldefs = { - 'PAGESIZE': 'space.wrap(interp_mmap.PAGESIZE)', - 'ALLOCATIONGRANULARITY': 'space.wrap(interp_mmap.ALLOCATIONGRANULARITY)', - 'ACCESS_READ' : 'space.wrap(interp_mmap.ACCESS_READ)', - 'ACCESS_WRITE': 'space.wrap(interp_mmap.ACCESS_WRITE)', - 'ACCESS_COPY' : 'space.wrap(interp_mmap.ACCESS_COPY)', - 'mmap': 'interp_mmap.W_MMap', - 'error': 'space.fromcache(interp_mmap.Cache).w_error', - } - - appleveldefs = { - } - - def buildloaders(cls): - from rpython.rlib import rmmap - for constant, value in rmmap.constants.iteritems(): - if isinstance(value, (int, long)): - Module.interpleveldefs[constant] = "space.wrap(%r)" % value - super(Module, cls).buildloaders() - buildloaders = classmethod(buildloaders) diff -Nru pypy-7.1.1+dfsg/pypy/module/mmap/interp_mmap.py pypy-7.3.1+dfsg/pypy/module/mmap/interp_mmap.py --- pypy-7.1.1+dfsg/pypy/module/mmap/interp_mmap.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/mmap/interp_mmap.py 2020-04-10 19:28:41.000000000 +0000 @@ -177,8 +177,10 @@ return space.newbytes(self.mmap.getslice(start, length)) else: b = StringBuilder(length) - for i in range(start, stop, step): - b.append(self.mmap.getitem(i)) + index = start + for i in range(length): + b.append(self.mmap.getitem(index)) + index += step return space.newbytes(b.build()) def descr_setitem(self, w_index, w_value): @@ -345,12 +347,12 @@ self.check_valid() return self.mmap.data[index] - def getslice(self, start, stop, step, size): + def getslice(self, start, step, size): self.check_valid() if step == 1: return self.mmap.getslice(start, size) else: - return RawBuffer.getslice(self, start, stop, step, size) + return RawBuffer.getslice(self, start, step, size) def setitem(self, index, char): self.check_valid_writeable() diff -Nru pypy-7.1.1+dfsg/pypy/module/mmap/moduledef.py pypy-7.3.1+dfsg/pypy/module/mmap/moduledef.py --- pypy-7.1.1+dfsg/pypy/module/mmap/moduledef.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/mmap/moduledef.py 2020-04-10 19:28:41.000000000 +0000 @@ -0,0 +1,23 @@ +from pypy.interpreter.mixedmodule import MixedModule + +class Module(MixedModule): + interpleveldefs = { + 'PAGESIZE': 'space.wrap(interp_mmap.PAGESIZE)', + 'ALLOCATIONGRANULARITY': 'space.wrap(interp_mmap.ALLOCATIONGRANULARITY)', + 'ACCESS_READ' : 'space.wrap(interp_mmap.ACCESS_READ)', + 'ACCESS_WRITE': 'space.wrap(interp_mmap.ACCESS_WRITE)', + 'ACCESS_COPY' : 'space.wrap(interp_mmap.ACCESS_COPY)', + 'mmap': 'interp_mmap.W_MMap', + 'error': 'space.fromcache(interp_mmap.Cache).w_error', + } + + appleveldefs = { + } + + def buildloaders(cls): + from rpython.rlib import rmmap + for constant, value in rmmap.constants.iteritems(): + if isinstance(value, (int, long)): + Module.interpleveldefs[constant] = "space.wrap(%r)" % value + super(Module, cls).buildloaders() + buildloaders = classmethod(buildloaders) diff -Nru pypy-7.1.1+dfsg/pypy/module/mmap/test/test_mmap.py pypy-7.3.1+dfsg/pypy/module/mmap/test/test_mmap.py --- pypy-7.1.1+dfsg/pypy/module/mmap/test/test_mmap.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/mmap/test/test_mmap.py 2020-04-10 19:28:41.000000000 +0000 @@ -433,6 +433,15 @@ m.close() f.close() + def test_get_crash(self): + import sys + from mmap import mmap + s = b'hallo!!!' + m = mmap(-1, len(s)) + m[:] = s + assert m[1:None:sys.maxsize] == b'a' + m.close() + def test_set_item(self): import mmap diff -Nru pypy-7.1.1+dfsg/pypy/module/_multibytecodec/c_codecs.py pypy-7.3.1+dfsg/pypy/module/_multibytecodec/c_codecs.py --- pypy-7.1.1+dfsg/pypy/module/_multibytecodec/c_codecs.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_multibytecodec/c_codecs.py 2020-04-10 19:28:40.000000000 +0000 @@ -157,7 +157,7 @@ replace, end = errorcb(errors, namecb, reason, stringdata, start, end) # 'replace' is RPython unicode here - lgt = rutf8.get_utf8_length(replace) + lgt = rutf8.codepoints_in_utf8(replace) inbuf = rffi.utf82wcharp(replace, lgt) try: r = pypy_cjk_dec_replace_on_error(decodebuf, inbuf, lgt, end) @@ -194,17 +194,23 @@ rffi.SSIZE_T) pypy_cjk_enc_getcodec = llexternal('pypy_cjk_enc_getcodec', [ENCODEBUF_P], MULTIBYTECODEC_P) +pypy_cjk_enc_copystate = llexternal('pypy_cjk_enc_copystate', + [ENCODEBUF_P, ENCODEBUF_P], lltype.Void) MBENC_FLUSH = 1 MBENC_RESET = 2 def encode(codec, unicodedata, length, errors="strict", errorcb=None, - namecb=None): + namecb=None, copystate=lltype.nullptr(ENCODEBUF_P.TO)): encodebuf = pypy_cjk_enc_new(codec) if not encodebuf: raise MemoryError + if copystate: + pypy_cjk_enc_copystate(encodebuf, copystate) try: return encodeex(encodebuf, unicodedata, length, errors, errorcb, namecb) finally: + if copystate: + pypy_cjk_enc_copystate(copystate, encodebuf) pypy_cjk_enc_free(encodebuf) def encodeex(encodebuf, utf8data, length, errors="strict", errorcb=None, @@ -258,18 +264,18 @@ elif errors == "ignore": replace = "" elif errors == "replace": - codec = pypy_cjk_enc_getcodec(encodebuf) - try: - replace = encode(codec, "?", 1) - except EncodeDecodeError: - replace = "?" + replace = "?" # utf-8 unicode else: assert errorcb - rets, end = errorcb(errors, namecb, reason, + replace, end = errorcb(errors, namecb, reason, unicodedata, start, end) + if len(replace) > 0: codec = pypy_cjk_enc_getcodec(encodebuf) - lgt = rutf8.get_utf8_length(rets) - replace = encode(codec, rets, lgt, "strict", errorcb, namecb) + lgt = rutf8.codepoints_in_utf8(replace) + replace = encode(codec, replace, lgt, copystate=encodebuf) + #else: + # replace is an empty utf-8 unicode, which we directly consider to + # encode as an empty byte string. with rffi.scoped_nonmovingbuffer(replace) as inbuf: r = pypy_cjk_enc_replace_on_error(encodebuf, inbuf, len(replace), end) if r == MBERR_NOMEMORY: diff -Nru pypy-7.1.1+dfsg/pypy/module/_multibytecodec/__init__.py pypy-7.3.1+dfsg/pypy/module/_multibytecodec/__init__.py --- pypy-7.1.1+dfsg/pypy/module/_multibytecodec/__init__.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_multibytecodec/__init__.py 2020-04-10 19:28:40.000000000 +0000 @@ -1,22 +0,0 @@ -from pypy.interpreter.mixedmodule import MixedModule - - -class Module(MixedModule): - - interpleveldefs = { - # for compatibility this name is obscured, and should be called - # via the _codecs_*.py modules written in lib_pypy. - '__getcodec': 'interp_multibytecodec.getcodec', - - 'MultibyteIncrementalDecoder': - 'interp_incremental.MultibyteIncrementalDecoder', - 'MultibyteIncrementalEncoder': - 'interp_incremental.MultibyteIncrementalEncoder', - } - - appleveldefs = { - 'MultibyteStreamReader': - 'app_multibytecodec.MultibyteStreamReader', - 'MultibyteStreamWriter': - 'app_multibytecodec.MultibyteStreamWriter', - } diff -Nru pypy-7.1.1+dfsg/pypy/module/_multibytecodec/interp_incremental.py pypy-7.3.1+dfsg/pypy/module/_multibytecodec/interp_incremental.py --- pypy-7.1.1+dfsg/pypy/module/_multibytecodec/interp_incremental.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_multibytecodec/interp_incremental.py 2020-04-10 19:28:40.000000000 +0000 @@ -66,7 +66,7 @@ pos = c_codecs.pypy_cjk_dec_inbuf_consumed(self.decodebuf) assert 0 <= pos <= len(object) self.pending = object[pos:] - lgt = rutf8.get_utf8_length(output) + lgt = rutf8.codepoints_in_utf8(output) return space.newutf8(output, lgt) diff -Nru pypy-7.1.1+dfsg/pypy/module/_multibytecodec/interp_multibytecodec.py pypy-7.3.1+dfsg/pypy/module/_multibytecodec/interp_multibytecodec.py --- pypy-7.1.1+dfsg/pypy/module/_multibytecodec/interp_multibytecodec.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_multibytecodec/interp_multibytecodec.py 2020-04-10 19:28:40.000000000 +0000 @@ -27,7 +27,7 @@ raise wrap_unicodedecodeerror(space, e, input, self.name) except RuntimeError: raise wrap_runtimeerror(space) - lgt = rutf8.get_utf8_length(utf8_output) + lgt = rutf8.codepoints_in_utf8(utf8_output) return space.newtuple([space.newutf8(utf8_output, lgt), space.newint(len(input))]) diff -Nru pypy-7.1.1+dfsg/pypy/module/_multibytecodec/moduledef.py pypy-7.3.1+dfsg/pypy/module/_multibytecodec/moduledef.py --- pypy-7.1.1+dfsg/pypy/module/_multibytecodec/moduledef.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_multibytecodec/moduledef.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,22 @@ +from pypy.interpreter.mixedmodule import MixedModule + + +class Module(MixedModule): + + interpleveldefs = { + # for compatibility this name is obscured, and should be called + # via the _codecs_*.py modules written in lib_pypy. + '__getcodec': 'interp_multibytecodec.getcodec', + + 'MultibyteIncrementalDecoder': + 'interp_incremental.MultibyteIncrementalDecoder', + 'MultibyteIncrementalEncoder': + 'interp_incremental.MultibyteIncrementalEncoder', + } + + appleveldefs = { + 'MultibyteStreamReader': + 'app_multibytecodec.MultibyteStreamReader', + 'MultibyteStreamWriter': + 'app_multibytecodec.MultibyteStreamWriter', + } diff -Nru pypy-7.1.1+dfsg/pypy/module/_multibytecodec/src/cjkcodecs/multibytecodec.c pypy-7.3.1+dfsg/pypy/module/_multibytecodec/src/cjkcodecs/multibytecodec.c --- pypy-7.1.1+dfsg/pypy/module/_multibytecodec/src/cjkcodecs/multibytecodec.c 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_multibytecodec/src/cjkcodecs/multibytecodec.c 2020-04-10 19:28:40.000000000 +0000 @@ -135,6 +135,11 @@ return d; } +void pypy_cjk_enc_copystate(struct pypy_cjk_enc_s *dst, struct pypy_cjk_enc_s *src) +{ + dst->state = src->state; +} + Py_ssize_t pypy_cjk_enc_init(struct pypy_cjk_enc_s *d, Py_UNICODE *inbuf, Py_ssize_t inlen) { diff -Nru pypy-7.1.1+dfsg/pypy/module/_multibytecodec/src/cjkcodecs/multibytecodec.h pypy-7.3.1+dfsg/pypy/module/_multibytecodec/src/cjkcodecs/multibytecodec.h --- pypy-7.1.1+dfsg/pypy/module/_multibytecodec/src/cjkcodecs/multibytecodec.h 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_multibytecodec/src/cjkcodecs/multibytecodec.h 2020-04-10 19:28:40.000000000 +0000 @@ -146,6 +146,8 @@ char *, pypymbc_ssize_t, pypymbc_ssize_t); RPY_EXTERN const MultibyteCodec *pypy_cjk_enc_getcodec(struct pypy_cjk_enc_s *); +RPY_EXTERN +void pypy_cjk_enc_copystate(struct pypy_cjk_enc_s *dst, struct pypy_cjk_enc_s *src); /* list of codecs defined in the .c files */ diff -Nru pypy-7.1.1+dfsg/pypy/module/_multibytecodec/test/test_app_codecs.py pypy-7.3.1+dfsg/pypy/module/_multibytecodec/test/test_app_codecs.py --- pypy-7.1.1+dfsg/pypy/module/_multibytecodec/test/test_app_codecs.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_multibytecodec/test/test_app_codecs.py 2020-04-10 19:28:40.000000000 +0000 @@ -110,3 +110,33 @@ lambda e: ('\xc3', e.end)) raises(TypeError, u"\uDDA1".encode, "gbk", "test.test_encode_custom_error_handler_type") + + def test_encode_replacement_with_state(self): + import codecs + s = u'\u4ee4\u477c\u4ee4'.encode("iso-2022-jp", errors="replace") + assert s == '\x1b$BNa\x1b(B?\x1b$BNa\x1b(B' + + def test_streaming_codec(self): + test_0 = u'\uc5fc\u76d0\u5869\u9e7d\u477c\u4e3d/\u3012' + test_1 = u'\u4ee4\u477c\u3080\u304b\u3057\u3080\u304b\u3057\u3042\u308b\u3068\u3053\u308d\u306b' + test_2 = u' foo = "Quoted string ****\u4ee4\u477c" ' + + ereplace = {'errors': 'replace'} + exml = {'errors': 'xmlcharrefreplace'} + for codec in ("iso-2022-jp", "iso-2022-jp-ext", "iso-2022-jp-1", + "iso-2022-jp-2", "iso-2022-jp-3", "iso-2022-jp-2004", + "iso-2022-kr", + ): + + out_1 = test_1.encode(codec, **ereplace).decode(codec, **ereplace) + assert out_1.endswith(u'\u3080\u304b\u3057\u3080\u304b\u3057\u3042\u308b\u3068\u3053\u308d\u306b') + + out_0a = test_0.encode(codec, **ereplace).decode(codec, **ereplace) + for n, char in enumerate(out_0a): + assert char in (test_0[n], "?") + + out_0b = test_0.encode(codec, **exml).decode(codec, **ereplace) + assert "䝼" in out_0b + + out_2 = test_2.encode(codec, **ereplace).decode(codec, **ereplace) + assert out_2.count('"') == 2 diff -Nru pypy-7.1.1+dfsg/pypy/module/_multibytecodec/test/test_translation.py pypy-7.3.1+dfsg/pypy/module/_multibytecodec/test/test_translation.py --- pypy-7.1.1+dfsg/pypy/module/_multibytecodec/test/test_translation.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_multibytecodec/test/test_translation.py 2020-04-10 19:28:40.000000000 +0000 @@ -14,7 +14,7 @@ codecname, string = argv[1], argv[2] c = c_codecs.getcodec(codecname) u = c_codecs.decode(c, string) - lgt = rutf8.get_utf8_length(u) + lgt = rutf8.codepoints_in_utf8(u) r = c_codecs.encode(c, u, lgt) print r return 0 diff -Nru pypy-7.1.1+dfsg/pypy/module/_multiprocessing/__init__.py pypy-7.3.1+dfsg/pypy/module/_multiprocessing/__init__.py --- pypy-7.1.1+dfsg/pypy/module/_multiprocessing/__init__.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_multiprocessing/__init__.py 2020-04-10 19:28:40.000000000 +0000 @@ -1,25 +0,0 @@ -import sys - -from pypy.interpreter.mixedmodule import MixedModule - -class Module(MixedModule): - - interpleveldefs = { - 'Connection' : 'interp_connection.W_FileConnection', - 'SemLock' : 'interp_semaphore.W_SemLock', - - 'address_of_buffer' : 'interp_memory.address_of_buffer', - } - - appleveldefs = { - } - - if sys.platform == 'win32': - interpleveldefs['PipeConnection'] = \ - 'interp_connection.W_PipeConnection' - interpleveldefs['win32'] = 'interp_win32.win32_namespace(space)' - - def init(self, space): - MixedModule.init(self, space) - from pypy.module._multiprocessing.interp_connection import State - space.fromcache(State).init(space) diff -Nru pypy-7.1.1+dfsg/pypy/module/_multiprocessing/interp_semaphore.py pypy-7.3.1+dfsg/pypy/module/_multiprocessing/interp_semaphore.py --- pypy-7.1.1+dfsg/pypy/module/_multiprocessing/interp_semaphore.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_multiprocessing/interp_semaphore.py 2020-04-10 19:28:40.000000000 +0000 @@ -33,7 +33,7 @@ _ReleaseSemaphore = rwin32.winexternal( 'ReleaseSemaphore', [rwin32.HANDLE, rffi.LONG, rffi.LONGP], rwin32.BOOL, - save_err=rffi.RFFI_SAVE_LASTERROR) + save_err=rffi.RFFI_SAVE_LASTERROR, releasegil=False) else: from rpython.rlib import rposix @@ -46,7 +46,8 @@ eci = ExternalCompilationInfo( includes = ['sys/time.h', 'limits.h', - 'semaphore.h'], + 'semaphore.h', + ], libraries = libraries, ) @@ -97,7 +98,7 @@ save_err=rffi.RFFI_SAVE_ERRNO) _sem_trywait = external('sem_trywait', [SEM_T], rffi.INT, save_err=rffi.RFFI_SAVE_ERRNO) - _sem_post = external('sem_post', [SEM_T], rffi.INT, + _sem_post = external('sem_post', [SEM_T], rffi.INT, releasegil=False, save_err=rffi.RFFI_SAVE_ERRNO) _sem_getvalue = external('sem_getvalue', [SEM_T, rffi.INTP], rffi.INT, save_err=rffi.RFFI_SAVE_ERRNO) @@ -259,6 +260,8 @@ res = rwin32.WaitForSingleObject(self.handle, 0) if res != rwin32.WAIT_TIMEOUT: + self.last_tid = rthread.get_ident() + self.count += 1 return True msecs = full_msecs @@ -291,6 +294,8 @@ # handle result if res != rwin32.WAIT_TIMEOUT: + self.last_tid = rthread.get_ident() + self.count += 1 return True return False @@ -370,7 +375,8 @@ return False raise _check_signals(space) - + self.last_tid = rthread.get_ident() + self.count += 1 return True finally: if deadline: @@ -439,6 +445,7 @@ self.count = 0 self.maxvalue = maxvalue self.register_finalizer(space) + self.last_tid = -1 def kind_get(self, space): return space.newint(self.kind) @@ -476,15 +483,15 @@ if self.kind == RECURSIVE_MUTEX and self._ismine(): self.count += 1 return space.w_True - try: + # sets self.last_tid and increments self.count + # those steps need to be as close as possible to + # acquiring the semlock for self._ismine() to support + # multiple threads got = semlock_acquire(self, space, block, w_timeout) except OSError as e: raise wrap_oserror(space, e) - if got: - self.last_tid = rthread.get_ident() - self.count += 1 return space.w_True else: return space.w_False @@ -500,11 +507,13 @@ return try: + # Note: a succesful semlock_release() must not release the GIL, + # otherwise there is a race condition on self.count semlock_release(self, space) + self.count -= 1 except OSError as e: raise wrap_oserror(space, e) - self.count -= 1 def after_fork(self): self.count = 0 diff -Nru pypy-7.1.1+dfsg/pypy/module/_multiprocessing/moduledef.py pypy-7.3.1+dfsg/pypy/module/_multiprocessing/moduledef.py --- pypy-7.1.1+dfsg/pypy/module/_multiprocessing/moduledef.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_multiprocessing/moduledef.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,25 @@ +import sys + +from pypy.interpreter.mixedmodule import MixedModule + +class Module(MixedModule): + + interpleveldefs = { + 'Connection' : 'interp_connection.W_FileConnection', + 'SemLock' : 'interp_semaphore.W_SemLock', + + 'address_of_buffer' : 'interp_memory.address_of_buffer', + } + + appleveldefs = { + } + + if sys.platform == 'win32': + interpleveldefs['PipeConnection'] = \ + 'interp_connection.W_PipeConnection' + interpleveldefs['win32'] = 'interp_win32.win32_namespace(space)' + + def init(self, space): + MixedModule.init(self, space) + from pypy.module._multiprocessing.interp_connection import State + space.fromcache(State).init(space) diff -Nru pypy-7.1.1+dfsg/pypy/module/_multiprocessing/test/test_connection.py pypy-7.3.1+dfsg/pypy/module/_multiprocessing/test/test_connection.py --- pypy-7.1.1+dfsg/pypy/module/_multiprocessing/test/test_connection.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_multiprocessing/test/test_connection.py 2020-04-10 19:28:40.000000000 +0000 @@ -38,6 +38,9 @@ assert isinstance(e, multiprocessing.ProcessError) assert e.args == ("data",) + if sys.platform == "win32": + test_exception.dont_track_allocations = True + class BaseConnectionTest(object): def test_connection(self): import sys @@ -54,6 +57,9 @@ obj2 = rhandle.recv() assert obj == obj2 + if sys.platform == "win32": + test_connection.dont_track_allocations = True + def test_poll(self): import sys # if not translated, for win32 diff -Nru pypy-7.1.1+dfsg/pypy/module/_multiprocessing/test/test_interp_semaphore.py pypy-7.3.1+dfsg/pypy/module/_multiprocessing/test/test_interp_semaphore.py --- pypy-7.1.1+dfsg/pypy/module/_multiprocessing/test/test_interp_semaphore.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_multiprocessing/test/test_interp_semaphore.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,52 @@ +import pytest +import time +from rpython.rlib.rgil import yield_thread +from pypy.tool.pytest.objspace import gettestobjspace +from pypy.interpreter.gateway import interp2app +from pypy.module.thread.os_lock import allocate_lock +from pypy.module.thread.os_thread import start_new_thread +from pypy.module._multiprocessing.interp_semaphore import ( + create_semaphore, delete_semaphore, W_SemLock) + + +@pytest.mark.parametrize('spaceconfig', [ + {'usemodules': ['_multiprocessing', 'thread']}]) +def test_semlock_release(space): + sem_name = '/test8' + _handle = create_semaphore(space, sem_name, 1, 1) + try: + w_lock = W_SemLock(space, _handle, 0, 1) + created = [] + successful = [] + N_THREADS = 16 + + def run(space): + w_sentinel = allocate_lock(space) + yield_thread() + w_sentinel.descr_lock_acquire(space) # releases GIL + yield_thread() + created.append(w_sentinel) + w_got = w_lock.acquire(space, w_timeout=space.newfloat(5.)) # releases GIL + if space.is_true(w_got): + yield_thread() + w_lock.release(space) + successful.append(w_sentinel) + w_sentinel.descr_lock_release(space) + w_run = space.wrap(interp2app(run)) + + w_lock.acquire(space) + for _ in range(N_THREADS): + start_new_thread(space, w_run, space.newtuple([])) # releases GIL + deadline = time.time() + 5. + while len(created) < N_THREADS: + assert time.time() < deadline + yield_thread() + w_lock.release(space) + + for w_sentinel in created: + # Join thread + w_sentinel.descr_lock_acquire(space) # releases GIL + w_sentinel.descr_lock_release(space) + assert len(successful) == N_THREADS + finally: + delete_semaphore(_handle) diff -Nru pypy-7.1.1+dfsg/pypy/module/_multiprocessing/test/test_memory.py pypy-7.3.1+dfsg/pypy/module/_multiprocessing/test/test_memory.py --- pypy-7.1.1+dfsg/pypy/module/_multiprocessing/test/test_memory.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_multiprocessing/test/test_memory.py 2020-04-10 19:28:40.000000000 +0000 @@ -15,6 +15,9 @@ raises(TypeError, _multiprocessing.address_of_buffer, None) raises(TypeError, _multiprocessing.address_of_buffer, "a") + if sys.platform == "win32": + test_address_of.dont_track_allocations = True + def test_mmap_address(self): import mmap import _multiprocessing diff -Nru pypy-7.1.1+dfsg/pypy/module/_multiprocessing/test/test_semaphore.py pypy-7.3.1+dfsg/pypy/module/_multiprocessing/test/test_semaphore.py --- pypy-7.1.1+dfsg/pypy/module/_multiprocessing/test/test_semaphore.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_multiprocessing/test/test_semaphore.py 2020-04-10 19:28:40.000000000 +0000 @@ -17,6 +17,7 @@ def setup_class(cls): cls.w_SEMAPHORE = cls.space.wrap(SEMAPHORE) cls.w_RECURSIVE = cls.space.wrap(RECURSIVE_MUTEX) + cls.w_runappdirect = cls.space.wrap(cls.runappdirect) def test_semaphore(self): from _multiprocessing import SemLock @@ -108,3 +109,25 @@ with sem: assert sem._count() == 1 assert sem._count() == 0 + + def test_in_threads(self): + from _multiprocessing import SemLock + from threading import Thread + from time import sleep + l = SemLock(0, 1, 1) + if self.runappdirect: + def f(id): + for i in range(10000): + pass + else: + def f(id): + for i in range(1000): + # reduce the probability of thread switching + # at exactly the wrong time in semlock_acquire + for j in range(10): + pass + threads = [Thread(None, f, args=(i,)) for i in range(2)] + [t.start() for t in threads] + # if the RLock calls to sem_wait and sem_post do not match, + # one of the threads will block and the call to join will fail + [t.join() for t in threads] diff -Nru pypy-7.1.1+dfsg/pypy/module/_multiprocessing/test/test_win32.py pypy-7.3.1+dfsg/pypy/module/_multiprocessing/test/test_win32.py --- pypy-7.1.1+dfsg/pypy/module/_multiprocessing/test/test_win32.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_multiprocessing/test/test_win32.py 2020-04-10 19:28:40.000000000 +0000 @@ -9,10 +9,6 @@ if sys.platform != "win32": py.test.skip("win32 only") - def test_CloseHandle(self): - from _multiprocessing import win32 - raises(WindowsError, win32.CloseHandle, -1) - def test_CreateFile(self): from _multiprocessing import win32 err = raises(WindowsError, win32.CreateFile, diff -Nru pypy-7.1.1+dfsg/pypy/module/operator/__init__.py pypy-7.3.1+dfsg/pypy/module/operator/__init__.py --- pypy-7.1.1+dfsg/pypy/module/operator/__init__.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/operator/__init__.py 2020-04-10 19:28:41.000000000 +0000 @@ -1,99 +0,0 @@ -from pypy.interpreter.mixedmodule import MixedModule - -class Module(MixedModule): - """Operator Builtin Module. """ - - # HACK! override loaders to be able to access different operations - # under same name. I.e., operator.eq == operator.__eq__ - - def __init__(self, space, w_name): - def create_lambda(name, alsoname): - return lambda space : self.getdictvalue(space, alsoname) - - MixedModule.__init__(self, space, w_name) - for name, alsoname in self.mapping.iteritems(): - self.loaders[name] = create_lambda(name, alsoname) - - appleveldefs = {} - - app_names = ['__delslice__', '__getslice__', '__repeat__', '__setslice__', - 'countOf', 'delslice', 'getslice', 'indexOf', - 'isNumberType', - 'repeat', 'setslice', - 'attrgetter', 'itemgetter', 'methodcaller', - ] - - for name in app_names: - appleveldefs[name] = 'app_operator.%s' % name - - interp_names = ['index', 'abs', 'add', 'and_', - 'concat', 'contains', 'delitem', 'div', 'eq', 'floordiv', - 'ge', 'getitem', 'gt', 'inv', - 'invert', 'is_', 'is_not', 'isCallable', - 'le', 'lshift', 'lt', 'mod', 'mul', - 'ne', 'neg', 'not_', 'or_', - 'pos', 'pow', 'rshift', 'setitem', 'sequenceIncludes', - 'sub', 'truediv', 'truth', 'xor', - 'iadd', 'iand', 'iconcat', 'idiv', 'ifloordiv', - 'ilshift', 'imod', 'imul', 'ior', 'ipow', 'irepeat', - 'irshift', 'isub', 'itruediv', 'ixor', '_length_hint', - 'isSequenceType', 'isMappingType'] - - interpleveldefs = { - '_compare_digest': 'tscmp.compare_digest', - } - - for name in interp_names: - interpleveldefs[name] = 'interp_operator.%s' % name - - mapping = { - '__abs__' : 'abs', - '__add__' : 'add', - '__and__' : 'and_', - '__concat__' : 'concat', - '__contains__' : 'contains', - 'sequenceIncludes' : 'contains', - '__index__' : 'index', - '__delitem__' : 'delitem', - '__div__' : 'div', - '__eq__' : 'eq', - '__floordiv__' : 'floordiv', - '__ge__' : 'ge', - '__getitem__' : 'getitem', - '__gt__' : 'gt', - '__inv__' : 'inv', - '__invert__' : 'invert', - '__le__' : 'le', - '__lshift__' : 'lshift', - '__lt__' : 'lt', - '__mod__' : 'mod', - '__mul__' : 'mul', - '__ne__' : 'ne', - '__neg__' : 'neg', - '__not__' : 'not_', - '__or__' : 'or_', - '__pos__' : 'pos', - '__pow__' : 'pow', - '__rshift__' : 'rshift', - '__setitem__' : 'setitem', - '__sub__' : 'sub', - '__truediv__' : 'truediv', - '__xor__' : 'xor', - # in-place - '__iadd__' : 'iadd', - '__iand__' : 'iand', - '__iconcat__' : 'iconcat', - '__idiv__' : 'idiv', - '__ifloordiv__' : 'ifloordiv', - '__ilshift__' : 'ilshift', - '__imod__' : 'imod', - '__imul__' : 'imul', - '__ior__' : 'ior', - '__ipow__' : 'ipow', - '__irepeat__' : 'irepeat', - '__irshift__' : 'irshift', - '__isub__' : 'isub', - '__itruediv__' : 'itruediv', - '__ixor__' : 'ixor', - } - diff -Nru pypy-7.1.1+dfsg/pypy/module/operator/moduledef.py pypy-7.3.1+dfsg/pypy/module/operator/moduledef.py --- pypy-7.1.1+dfsg/pypy/module/operator/moduledef.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/operator/moduledef.py 2020-04-10 19:28:41.000000000 +0000 @@ -0,0 +1,99 @@ +from pypy.interpreter.mixedmodule import MixedModule + +class Module(MixedModule): + """Operator Builtin Module. """ + + # HACK! override loaders to be able to access different operations + # under same name. I.e., operator.eq == operator.__eq__ + + def __init__(self, space, w_name): + def create_lambda(name, alsoname): + return lambda space : self.getdictvalue(space, alsoname) + + MixedModule.__init__(self, space, w_name) + for name, alsoname in self.mapping.iteritems(): + self.loaders[name] = create_lambda(name, alsoname) + + appleveldefs = {} + + app_names = ['__delslice__', '__getslice__', '__repeat__', '__setslice__', + 'countOf', 'delslice', 'getslice', 'indexOf', + 'isNumberType', + 'repeat', 'setslice', + 'attrgetter', 'itemgetter', 'methodcaller', + ] + + for name in app_names: + appleveldefs[name] = 'app_operator.%s' % name + + interp_names = ['index', 'abs', 'add', 'and_', + 'concat', 'contains', 'delitem', 'div', 'eq', 'floordiv', + 'ge', 'getitem', 'gt', 'inv', + 'invert', 'is_', 'is_not', 'isCallable', + 'le', 'lshift', 'lt', 'mod', 'mul', + 'ne', 'neg', 'not_', 'or_', + 'pos', 'pow', 'rshift', 'setitem', 'sequenceIncludes', + 'sub', 'truediv', 'truth', 'xor', + 'iadd', 'iand', 'iconcat', 'idiv', 'ifloordiv', + 'ilshift', 'imod', 'imul', 'ior', 'ipow', 'irepeat', + 'irshift', 'isub', 'itruediv', 'ixor', '_length_hint', + 'isSequenceType', 'isMappingType'] + + interpleveldefs = { + '_compare_digest': 'tscmp.compare_digest', + } + + for name in interp_names: + interpleveldefs[name] = 'interp_operator.%s' % name + + mapping = { + '__abs__' : 'abs', + '__add__' : 'add', + '__and__' : 'and_', + '__concat__' : 'concat', + '__contains__' : 'contains', + 'sequenceIncludes' : 'contains', + '__index__' : 'index', + '__delitem__' : 'delitem', + '__div__' : 'div', + '__eq__' : 'eq', + '__floordiv__' : 'floordiv', + '__ge__' : 'ge', + '__getitem__' : 'getitem', + '__gt__' : 'gt', + '__inv__' : 'inv', + '__invert__' : 'invert', + '__le__' : 'le', + '__lshift__' : 'lshift', + '__lt__' : 'lt', + '__mod__' : 'mod', + '__mul__' : 'mul', + '__ne__' : 'ne', + '__neg__' : 'neg', + '__not__' : 'not_', + '__or__' : 'or_', + '__pos__' : 'pos', + '__pow__' : 'pow', + '__rshift__' : 'rshift', + '__setitem__' : 'setitem', + '__sub__' : 'sub', + '__truediv__' : 'truediv', + '__xor__' : 'xor', + # in-place + '__iadd__' : 'iadd', + '__iand__' : 'iand', + '__iconcat__' : 'iconcat', + '__idiv__' : 'idiv', + '__ifloordiv__' : 'ifloordiv', + '__ilshift__' : 'ilshift', + '__imod__' : 'imod', + '__imul__' : 'imul', + '__ior__' : 'ior', + '__ipow__' : 'ipow', + '__irepeat__' : 'irepeat', + '__irshift__' : 'irshift', + '__isub__' : 'isub', + '__itruediv__' : 'itruediv', + '__ixor__' : 'ixor', + } + diff -Nru pypy-7.1.1+dfsg/pypy/module/parser/__init__.py pypy-7.3.1+dfsg/pypy/module/parser/__init__.py --- pypy-7.1.1+dfsg/pypy/module/parser/__init__.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/parser/__init__.py 2020-04-10 19:28:41.000000000 +0000 @@ -1,30 +0,0 @@ -from pypy.interpreter.mixedmodule import MixedModule - - -class Module(MixedModule): - """The builtin parser module.""" - - applevel_name = 'parser' - - appleveldefs = { - } - - interpleveldefs = { - '__name__' : '(space.newtext("parser"))', - '__doc__' : '(space.newtext("parser module"))', - 'suite' : 'pyparser.suite', - 'expr' : 'pyparser.expr', - 'issuite' : 'pyparser.issuite', - 'isexpr' : 'pyparser.isexpr', - 'STType' : 'pyparser.W_STType', - 'ast2tuple' : 'pyparser.st2tuple', - 'st2tuple' : 'pyparser.st2tuple', - 'ast2list' : 'pyparser.st2list', - 'ast2tuple' : 'pyparser.st2tuple', - 'ASTType' : 'pyparser.W_STType', - 'compilest' : 'pyparser.compilest', - 'compileast' : 'pyparser.compilest', - 'tuple2st' : 'pyparser.tuple2st', - 'sequence2st' : 'pyparser.tuple2st', - 'ParserError' : 'pyparser.get_error(space)', - } diff -Nru pypy-7.1.1+dfsg/pypy/module/parser/moduledef.py pypy-7.3.1+dfsg/pypy/module/parser/moduledef.py --- pypy-7.1.1+dfsg/pypy/module/parser/moduledef.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/parser/moduledef.py 2020-04-10 19:28:41.000000000 +0000 @@ -0,0 +1,30 @@ +from pypy.interpreter.mixedmodule import MixedModule + + +class Module(MixedModule): + """The builtin parser module.""" + + applevel_name = 'parser' + + appleveldefs = { + } + + interpleveldefs = { + '__name__' : '(space.newtext("parser"))', + '__doc__' : '(space.newtext("parser module"))', + 'suite' : 'pyparser.suite', + 'expr' : 'pyparser.expr', + 'issuite' : 'pyparser.issuite', + 'isexpr' : 'pyparser.isexpr', + 'STType' : 'pyparser.W_STType', + 'ast2tuple' : 'pyparser.st2tuple', + 'st2tuple' : 'pyparser.st2tuple', + 'ast2list' : 'pyparser.st2list', + 'ast2tuple' : 'pyparser.st2tuple', + 'ASTType' : 'pyparser.W_STType', + 'compilest' : 'pyparser.compilest', + 'compileast' : 'pyparser.compilest', + 'tuple2st' : 'pyparser.tuple2st', + 'sequence2st' : 'pyparser.tuple2st', + 'ParserError' : 'pyparser.get_error(space)', + } diff -Nru pypy-7.1.1+dfsg/pypy/module/parser/pyparser.py pypy-7.3.1+dfsg/pypy/module/parser/pyparser.py --- pypy-7.1.1+dfsg/pypy/module/parser/pyparser.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/parser/pyparser.py 2020-04-10 19:28:41.000000000 +0000 @@ -64,10 +64,10 @@ result = compile_ast(space, ast, info) except error.IndentationError as e: raise OperationError(space.w_IndentationError, - e.wrap_info(space)) + e.find_sourceline_and_wrap_info(space)) except error.SyntaxError as e: raise OperationError(space.w_SyntaxError, - e.wrap_info(space)) + e.find_sourceline_and_wrap_info(space)) return result W_STType.typedef = TypeDef("parser.st", @@ -86,10 +86,10 @@ tree = parser.parse_source(source, info) except error.IndentationError as e: raise OperationError(space.w_IndentationError, - e.wrap_info(space)) + e.find_sourceline_and_wrap_info(space, source)) except error.SyntaxError as e: raise OperationError(space.w_SyntaxError, - e.wrap_info(space)) + e.find_sourceline_and_wrap_info(space, source)) return W_STType(tree, mode) diff -Nru pypy-7.1.1+dfsg/pypy/module/_pickle_support/__init__.py pypy-7.3.1+dfsg/pypy/module/_pickle_support/__init__.py --- pypy-7.1.1+dfsg/pypy/module/_pickle_support/__init__.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_pickle_support/__init__.py 2020-04-10 19:28:40.000000000 +0000 @@ -1,27 +0,0 @@ -from pypy.interpreter.mixedmodule import MixedModule - -class Module(MixedModule): - """Built-in functions, exceptions, and other objects.""" - - appleveldefs = { - } - - interpleveldefs = { - 'cell_new' : 'maker.cell_new', - 'code_new' : 'maker.code_new', - 'func_new' : 'maker.func_new', - 'module_new' : 'maker.module_new', - 'method_new' : 'maker.method_new', - 'builtin_method_new' : 'maker.builtin_method_new', - 'dictiter_surrogate_new' : 'maker.dictiter_surrogate_new', - 'seqiter_new' : 'maker.seqiter_new', - 'reverseseqiter_new' : 'maker.reverseseqiter_new', - 'frame_new' : 'maker.frame_new', - 'traceback_new' : 'maker.traceback_new', - 'generator_new' : 'maker.generator_new', - 'xrangeiter_new': 'maker.xrangeiter_new', - 'builtin_code': 'maker.builtin_code', - 'builtin_function' : 'maker.builtin_function', - 'enumerate_new': 'maker.enumerate_new', - 'reversed_new': 'maker.reversed_new' - } diff -Nru pypy-7.1.1+dfsg/pypy/module/_pickle_support/moduledef.py pypy-7.3.1+dfsg/pypy/module/_pickle_support/moduledef.py --- pypy-7.1.1+dfsg/pypy/module/_pickle_support/moduledef.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_pickle_support/moduledef.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,27 @@ +from pypy.interpreter.mixedmodule import MixedModule + +class Module(MixedModule): + """Built-in functions, exceptions, and other objects.""" + + appleveldefs = { + } + + interpleveldefs = { + 'cell_new' : 'maker.cell_new', + 'code_new' : 'maker.code_new', + 'func_new' : 'maker.func_new', + 'module_new' : 'maker.module_new', + 'method_new' : 'maker.method_new', + 'builtin_method_new' : 'maker.builtin_method_new', + 'dictiter_surrogate_new' : 'maker.dictiter_surrogate_new', + 'seqiter_new' : 'maker.seqiter_new', + 'reverseseqiter_new' : 'maker.reverseseqiter_new', + 'frame_new' : 'maker.frame_new', + 'traceback_new' : 'maker.traceback_new', + 'generator_new' : 'maker.generator_new', + 'xrangeiter_new': 'maker.xrangeiter_new', + 'builtin_code': 'maker.builtin_code', + 'builtin_function' : 'maker.builtin_function', + 'enumerate_new': 'maker.enumerate_new', + 'reversed_new': 'maker.reversed_new' + } diff -Nru pypy-7.1.1+dfsg/pypy/module/posix/app_posix.py pypy-7.3.1+dfsg/pypy/module/posix/app_posix.py --- pypy-7.1.1+dfsg/pypy/module/posix/app_posix.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/posix/app_posix.py 2020-04-10 19:28:41.000000000 +0000 @@ -83,26 +83,18 @@ # __builtins__.file with a custom function. _fdopen = file.fdopen -if osname == 'posix': - # POSIX: we want to check the file descriptor when fdopen() is called, - # not later when we read or write data. So we call fstat(), letting - # it raise if fd is invalid. - def fdopen(fd, mode='r', buffering=-1): - """fdopen(fd [, mode='r' [, buffering]]) -> file_object +# We want to check the file descriptor when fdopen() is called, +# not later when we read or write data. So we call fstat(), letting +# it raise if fd is invalid. +def fdopen(fd, mode='r', buffering=-1): + """fdopen(fd [, mode='r' [, buffering]]) -> file_object - Return an open file object connected to a file descriptor.""" - try: - posix.fstat(fd) - except OSError as e: - raise OSError(e.errno, e.message) - return _fdopen(fd, mode, buffering) - -else: - def fdopen(fd, mode='r', buffering=-1): - """fdopen(fd [, mode='r' [, buffering]]) -> file_object - - Return an open file object connected to a file descriptor.""" - return _fdopen(fd, mode, buffering) + Return an open file object connected to a file descriptor.""" + try: + posix.fstat(fd) + except OSError as e: + raise OSError(e.errno, e.message) + return _fdopen(fd, mode, buffering) def tmpfile(): """Create a temporary file. diff -Nru pypy-7.1.1+dfsg/pypy/module/posix/__init__.py pypy-7.3.1+dfsg/pypy/module/posix/__init__.py --- pypy-7.1.1+dfsg/pypy/module/posix/__init__.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/posix/__init__.py 2020-04-10 19:28:41.000000000 +0000 @@ -1,186 +0,0 @@ -from pypy.interpreter.mixedmodule import MixedModule -from rpython.rlib import rposix - -import os -exec 'import %s as posix' % os.name - -class Module(MixedModule): - """This module provides access to operating system functionality that is -standardized by the C Standard and the POSIX standard (a thinly -disguised Unix interface). Refer to the library manual and -corresponding Unix manual entries for more information on calls.""" - - applevel_name = os.name - - appleveldefs = { - 'error': 'app_posix.error', - 'stat_result': 'app_posix.stat_result', - 'statvfs_result': 'app_posix.statvfs_result', - 'fdopen': 'app_posix.fdopen', - 'tmpfile': 'app_posix.tmpfile', - 'popen': 'app_posix.popen', - 'tmpnam': 'app_posix.tmpnam', - 'tempnam': 'app_posix.tempnam', - } - if os.name == 'nt': - appleveldefs.update({ - 'popen2': 'app_posix.popen2', - 'popen3': 'app_posix.popen3', - 'popen4': 'app_posix.popen4', - 'startfile': 'app_startfile.startfile', - }) - - if hasattr(os, 'wait'): - appleveldefs['wait'] = 'app_posix.wait' - if hasattr(os, 'wait3'): - appleveldefs['wait3'] = 'app_posix.wait3' - if hasattr(os, 'wait4'): - appleveldefs['wait4'] = 'app_posix.wait4' - - interpleveldefs = { - 'open': 'interp_posix.open', - 'lseek': 'interp_posix.lseek', - 'write': 'interp_posix.write', - 'isatty': 'interp_posix.isatty', - 'read': 'interp_posix.read', - 'close': 'interp_posix.close', - 'closerange': 'interp_posix.closerange', - - 'fstat': 'interp_posix.fstat', - 'stat': 'interp_posix.stat', - 'lstat': 'interp_posix.lstat', - 'stat_float_times': 'interp_posix.stat_float_times', - - 'dup': 'interp_posix.dup', - 'dup2': 'interp_posix.dup2', - 'access': 'interp_posix.access', - 'times': 'interp_posix.times', - 'system': 'interp_posix.system', - 'unlink': 'interp_posix.unlink', - 'remove': 'interp_posix.remove', - 'getcwd': 'interp_posix.getcwd', - 'getcwdu': 'interp_posix.getcwdu', - 'chdir': 'interp_posix.chdir', - 'mkdir': 'interp_posix.mkdir', - 'rmdir': 'interp_posix.rmdir', - 'environ': 'interp_posix.get(space).w_environ', - 'listdir': 'interp_posix.listdir', - 'strerror': 'interp_posix.strerror', - 'pipe': 'interp_posix.pipe', - 'chmod': 'interp_posix.chmod', - 'rename': 'interp_posix.rename', - 'umask': 'interp_posix.umask', - '_exit': 'interp_posix._exit', - 'utime': 'interp_posix.utime', - '_statfields': 'interp_posix.getstatfields(space)', - 'kill': 'interp_posix.kill', - 'abort': 'interp_posix.abort', - 'urandom': 'interp_posix.urandom', - } - - if hasattr(os, 'chown'): - interpleveldefs['chown'] = 'interp_posix.chown' - if hasattr(os, 'lchown'): - interpleveldefs['lchown'] = 'interp_posix.lchown' - if hasattr(os, 'fchown'): - interpleveldefs['fchown'] = 'interp_posix.fchown' - if hasattr(os, 'fchmod'): - interpleveldefs['fchmod'] = 'interp_posix.fchmod' - if hasattr(os, 'ftruncate'): - interpleveldefs['ftruncate'] = 'interp_posix.ftruncate' - if hasattr(os, 'fsync'): - interpleveldefs['fsync'] = 'interp_posix.fsync' - if hasattr(os, 'fdatasync'): - interpleveldefs['fdatasync'] = 'interp_posix.fdatasync' - if hasattr(os, 'fchdir'): - interpleveldefs['fchdir'] = 'interp_posix.fchdir' - if hasattr(os, 'putenv'): - interpleveldefs['putenv'] = 'interp_posix.putenv' - if hasattr(posix, 'unsetenv'): # note: emulated in os - interpleveldefs['unsetenv'] = 'interp_posix.unsetenv' - if hasattr(os, 'killpg'): - interpleveldefs['killpg'] = 'interp_posix.killpg' - if hasattr(os, 'getpid'): - interpleveldefs['getpid'] = 'interp_posix.getpid' - if hasattr(os, 'link'): - interpleveldefs['link'] = 'interp_posix.link' - if hasattr(os, 'symlink'): - interpleveldefs['symlink'] = 'interp_posix.symlink' - if hasattr(os, 'readlink'): - interpleveldefs['readlink'] = 'interp_posix.readlink' - if hasattr(os, 'fork'): - interpleveldefs['fork'] = 'interp_posix.fork' - if hasattr(os, 'openpty'): - interpleveldefs['openpty'] = 'interp_posix.openpty' - if hasattr(os, 'forkpty'): - interpleveldefs['forkpty'] = 'interp_posix.forkpty' - if hasattr(os, 'waitpid'): - interpleveldefs['waitpid'] = 'interp_posix.waitpid' - if hasattr(os, 'execv'): - interpleveldefs['execv'] = 'interp_posix.execv' - if hasattr(os, 'execve'): - interpleveldefs['execve'] = 'interp_posix.execve' - if hasattr(posix, 'spawnv'): - interpleveldefs['spawnv'] = 'interp_posix.spawnv' - if hasattr(posix, 'spawnve'): - interpleveldefs['spawnve'] = 'interp_posix.spawnve' - if hasattr(os, 'uname'): - interpleveldefs['uname'] = 'interp_posix.uname' - if hasattr(os, 'sysconf'): - interpleveldefs['sysconf'] = 'interp_posix.sysconf' - interpleveldefs['sysconf_names'] = 'space.wrap(os.sysconf_names)' - if hasattr(os, 'fpathconf'): - interpleveldefs['fpathconf'] = 'interp_posix.fpathconf' - interpleveldefs['pathconf_names'] = 'space.wrap(os.pathconf_names)' - if hasattr(os, 'pathconf'): - interpleveldefs['pathconf'] = 'interp_posix.pathconf' - if hasattr(os, 'confstr'): - interpleveldefs['confstr'] = 'interp_posix.confstr' - interpleveldefs['confstr_names'] = 'space.wrap(os.confstr_names)' - if hasattr(os, 'ttyname'): - interpleveldefs['ttyname'] = 'interp_posix.ttyname' - if hasattr(os, 'getloadavg'): - interpleveldefs['getloadavg'] = 'interp_posix.getloadavg' - if hasattr(os, 'makedev'): - interpleveldefs['makedev'] = 'interp_posix.makedev' - if hasattr(os, 'major'): - interpleveldefs['major'] = 'interp_posix.major' - if hasattr(os, 'minor'): - interpleveldefs['minor'] = 'interp_posix.minor' - if hasattr(os, 'mkfifo'): - interpleveldefs['mkfifo'] = 'interp_posix.mkfifo' - if hasattr(os, 'mknod'): - interpleveldefs['mknod'] = 'interp_posix.mknod' - if hasattr(os, 'nice'): - interpleveldefs['nice'] = 'interp_posix.nice' - if hasattr(os, 'getlogin'): - interpleveldefs['getlogin'] = 'interp_posix.getlogin' - if hasattr(os, 'ctermid'): - interpleveldefs['ctermid'] = 'interp_posix.ctermid' - - for name in ['setsid', 'getuid', 'geteuid', 'getgid', 'getegid', 'setuid', - 'seteuid', 'setgid', 'setegid', 'getgroups', 'getpgrp', - 'setpgrp', 'getppid', 'getpgid', 'setpgid', 'setreuid', - 'setregid', 'getsid', 'setsid', 'fstatvfs', 'statvfs', - 'setgroups', 'initgroups', 'tcgetpgrp', 'tcsetpgrp', - 'getresuid', 'getresgid', 'setresuid', 'setresgid']: - if hasattr(os, name): - interpleveldefs[name] = 'interp_posix.%s' % (name,) - # not visible via os, inconsistency in nt: - if hasattr(posix, '_getfullpathname'): - interpleveldefs['_getfullpathname'] = 'interp_posix._getfullpathname' - if hasattr(os, 'chroot'): - interpleveldefs['chroot'] = 'interp_posix.chroot' - - for name in rposix.WAIT_MACROS: - if hasattr(os, name): - interpleveldefs[name] = 'interp_posix.' + name - - def startup(self, space): - from pypy.module.posix import interp_posix - interp_posix.get(space).startup(space) - -for constant in dir(os): - value = getattr(os, constant) - if constant.isupper() and type(value) is int: - Module.interpleveldefs[constant] = "space.wrap(%s)" % value diff -Nru pypy-7.1.1+dfsg/pypy/module/posix/interp_posix.py pypy-7.3.1+dfsg/pypy/module/posix/interp_posix.py --- pypy-7.1.1+dfsg/pypy/module/posix/interp_posix.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/posix/interp_posix.py 2020-04-10 19:28:41.000000000 +0000 @@ -1351,7 +1351,12 @@ _sigcheck.space = space return space.newbytes(rurandom.urandom(context, n, _signal_checker)) except OSError as e: - raise wrap_oserror(space, e) + # CPython raises NotImplementedError if /dev/urandom cannot be found. + # To maximize compatibility, we should also raise NotImplementedError + # and not OSError (although CPython also raises OSError in case it + # could open /dev/urandom but there are further problems). + raise wrap_oserror(space, e, + w_exception_class=space.w_NotImplementedError) def ctermid(space): """ctermid() -> string diff -Nru pypy-7.1.1+dfsg/pypy/module/posix/moduledef.py pypy-7.3.1+dfsg/pypy/module/posix/moduledef.py --- pypy-7.1.1+dfsg/pypy/module/posix/moduledef.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/posix/moduledef.py 2020-04-10 19:28:41.000000000 +0000 @@ -0,0 +1,186 @@ +from pypy.interpreter.mixedmodule import MixedModule +from rpython.rlib import rposix + +import os +exec 'import %s as posix' % os.name + +class Module(MixedModule): + """This module provides access to operating system functionality that is +standardized by the C Standard and the POSIX standard (a thinly +disguised Unix interface). Refer to the library manual and +corresponding Unix manual entries for more information on calls.""" + + applevel_name = os.name + + appleveldefs = { + 'error': 'app_posix.error', + 'stat_result': 'app_posix.stat_result', + 'statvfs_result': 'app_posix.statvfs_result', + 'fdopen': 'app_posix.fdopen', + 'tmpfile': 'app_posix.tmpfile', + 'popen': 'app_posix.popen', + 'tmpnam': 'app_posix.tmpnam', + 'tempnam': 'app_posix.tempnam', + } + if os.name == 'nt': + appleveldefs.update({ + 'popen2': 'app_posix.popen2', + 'popen3': 'app_posix.popen3', + 'popen4': 'app_posix.popen4', + 'startfile': 'app_startfile.startfile', + }) + + if hasattr(os, 'wait'): + appleveldefs['wait'] = 'app_posix.wait' + if hasattr(os, 'wait3'): + appleveldefs['wait3'] = 'app_posix.wait3' + if hasattr(os, 'wait4'): + appleveldefs['wait4'] = 'app_posix.wait4' + + interpleveldefs = { + 'open': 'interp_posix.open', + 'lseek': 'interp_posix.lseek', + 'write': 'interp_posix.write', + 'isatty': 'interp_posix.isatty', + 'read': 'interp_posix.read', + 'close': 'interp_posix.close', + 'closerange': 'interp_posix.closerange', + + 'fstat': 'interp_posix.fstat', + 'stat': 'interp_posix.stat', + 'lstat': 'interp_posix.lstat', + 'stat_float_times': 'interp_posix.stat_float_times', + + 'dup': 'interp_posix.dup', + 'dup2': 'interp_posix.dup2', + 'access': 'interp_posix.access', + 'times': 'interp_posix.times', + 'system': 'interp_posix.system', + 'unlink': 'interp_posix.unlink', + 'remove': 'interp_posix.remove', + 'getcwd': 'interp_posix.getcwd', + 'getcwdu': 'interp_posix.getcwdu', + 'chdir': 'interp_posix.chdir', + 'mkdir': 'interp_posix.mkdir', + 'rmdir': 'interp_posix.rmdir', + 'environ': 'interp_posix.get(space).w_environ', + 'listdir': 'interp_posix.listdir', + 'strerror': 'interp_posix.strerror', + 'pipe': 'interp_posix.pipe', + 'chmod': 'interp_posix.chmod', + 'rename': 'interp_posix.rename', + 'umask': 'interp_posix.umask', + '_exit': 'interp_posix._exit', + 'utime': 'interp_posix.utime', + '_statfields': 'interp_posix.getstatfields(space)', + 'kill': 'interp_posix.kill', + 'abort': 'interp_posix.abort', + 'urandom': 'interp_posix.urandom', + } + + if hasattr(os, 'chown'): + interpleveldefs['chown'] = 'interp_posix.chown' + if hasattr(os, 'lchown'): + interpleveldefs['lchown'] = 'interp_posix.lchown' + if hasattr(os, 'fchown'): + interpleveldefs['fchown'] = 'interp_posix.fchown' + if hasattr(os, 'fchmod'): + interpleveldefs['fchmod'] = 'interp_posix.fchmod' + if hasattr(os, 'ftruncate'): + interpleveldefs['ftruncate'] = 'interp_posix.ftruncate' + if hasattr(os, 'fsync'): + interpleveldefs['fsync'] = 'interp_posix.fsync' + if hasattr(os, 'fdatasync'): + interpleveldefs['fdatasync'] = 'interp_posix.fdatasync' + if hasattr(os, 'fchdir'): + interpleveldefs['fchdir'] = 'interp_posix.fchdir' + if hasattr(os, 'putenv'): + interpleveldefs['putenv'] = 'interp_posix.putenv' + if hasattr(posix, 'unsetenv'): # note: emulated in os + interpleveldefs['unsetenv'] = 'interp_posix.unsetenv' + if hasattr(os, 'killpg'): + interpleveldefs['killpg'] = 'interp_posix.killpg' + if hasattr(os, 'getpid'): + interpleveldefs['getpid'] = 'interp_posix.getpid' + if hasattr(os, 'link'): + interpleveldefs['link'] = 'interp_posix.link' + if hasattr(os, 'symlink'): + interpleveldefs['symlink'] = 'interp_posix.symlink' + if hasattr(os, 'readlink'): + interpleveldefs['readlink'] = 'interp_posix.readlink' + if hasattr(os, 'fork'): + interpleveldefs['fork'] = 'interp_posix.fork' + if hasattr(os, 'openpty'): + interpleveldefs['openpty'] = 'interp_posix.openpty' + if hasattr(os, 'forkpty'): + interpleveldefs['forkpty'] = 'interp_posix.forkpty' + if hasattr(os, 'waitpid'): + interpleveldefs['waitpid'] = 'interp_posix.waitpid' + if hasattr(os, 'execv'): + interpleveldefs['execv'] = 'interp_posix.execv' + if hasattr(os, 'execve'): + interpleveldefs['execve'] = 'interp_posix.execve' + if hasattr(posix, 'spawnv'): + interpleveldefs['spawnv'] = 'interp_posix.spawnv' + if hasattr(posix, 'spawnve'): + interpleveldefs['spawnve'] = 'interp_posix.spawnve' + if hasattr(os, 'uname'): + interpleveldefs['uname'] = 'interp_posix.uname' + if hasattr(os, 'sysconf'): + interpleveldefs['sysconf'] = 'interp_posix.sysconf' + interpleveldefs['sysconf_names'] = 'space.wrap(os.sysconf_names)' + if hasattr(os, 'fpathconf'): + interpleveldefs['fpathconf'] = 'interp_posix.fpathconf' + interpleveldefs['pathconf_names'] = 'space.wrap(os.pathconf_names)' + if hasattr(os, 'pathconf'): + interpleveldefs['pathconf'] = 'interp_posix.pathconf' + if hasattr(os, 'confstr'): + interpleveldefs['confstr'] = 'interp_posix.confstr' + interpleveldefs['confstr_names'] = 'space.wrap(os.confstr_names)' + if hasattr(os, 'ttyname'): + interpleveldefs['ttyname'] = 'interp_posix.ttyname' + if hasattr(os, 'getloadavg'): + interpleveldefs['getloadavg'] = 'interp_posix.getloadavg' + if hasattr(os, 'makedev'): + interpleveldefs['makedev'] = 'interp_posix.makedev' + if hasattr(os, 'major'): + interpleveldefs['major'] = 'interp_posix.major' + if hasattr(os, 'minor'): + interpleveldefs['minor'] = 'interp_posix.minor' + if hasattr(os, 'mkfifo'): + interpleveldefs['mkfifo'] = 'interp_posix.mkfifo' + if hasattr(os, 'mknod'): + interpleveldefs['mknod'] = 'interp_posix.mknod' + if hasattr(os, 'nice'): + interpleveldefs['nice'] = 'interp_posix.nice' + if hasattr(os, 'getlogin'): + interpleveldefs['getlogin'] = 'interp_posix.getlogin' + if hasattr(os, 'ctermid'): + interpleveldefs['ctermid'] = 'interp_posix.ctermid' + + for name in ['setsid', 'getuid', 'geteuid', 'getgid', 'getegid', 'setuid', + 'seteuid', 'setgid', 'setegid', 'getgroups', 'getpgrp', + 'setpgrp', 'getppid', 'getpgid', 'setpgid', 'setreuid', + 'setregid', 'getsid', 'setsid', 'fstatvfs', 'statvfs', + 'setgroups', 'initgroups', 'tcgetpgrp', 'tcsetpgrp', + 'getresuid', 'getresgid', 'setresuid', 'setresgid']: + if hasattr(os, name): + interpleveldefs[name] = 'interp_posix.%s' % (name,) + # not visible via os, inconsistency in nt: + if hasattr(posix, '_getfullpathname'): + interpleveldefs['_getfullpathname'] = 'interp_posix._getfullpathname' + if hasattr(os, 'chroot'): + interpleveldefs['chroot'] = 'interp_posix.chroot' + + for name in rposix.WAIT_MACROS: + if hasattr(os, name): + interpleveldefs[name] = 'interp_posix.' + name + + def startup(self, space): + from pypy.module.posix import interp_posix + interp_posix.get(space).startup(space) + +for constant in dir(os): + value = getattr(os, constant) + if constant.isupper() and type(value) is int: + Module.interpleveldefs[constant] = "space.wrap(%s)" % value diff -Nru pypy-7.1.1+dfsg/pypy/module/posix/test/test_posix2.py pypy-7.3.1+dfsg/pypy/module/posix/test/test_posix2.py --- pypy-7.1.1+dfsg/pypy/module/posix/test/test_posix2.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/posix/test/test_posix2.py 2020-04-10 19:28:41.000000000 +0000 @@ -1,19 +1,16 @@ - # -*- coding: utf-8 -*- -from __future__ import with_statement -from pypy.objspace.std import StdObjSpace -from rpython.tool.udir import udir -from pypy.tool.pytest.objspace import gettestobjspace -from pypy import pypydir -from rpython.translator.c.test.test_extfunc import need_sparse_files -from rpython.rlib import rposix import os import py import sys import signal -USEMODULES = ['binascii', 'posix', 'struct', 'time'] +from rpython.tool.udir import udir +from pypy.tool.pytest.objspace import gettestobjspace +from rpython.translator.c.test.test_extfunc import need_sparse_files +from rpython.rlib import rposix + +USEMODULES = ['binascii', 'posix', 'signal', 'struct', 'time'] if os.name != 'nt': USEMODULES += ['fcntl'] else: @@ -25,6 +22,9 @@ mod.path = udir.join('posixtestfile.txt') mod.path.write("this is a test") mod.path2 = udir.join('test_posix2-') + mod.path3 = udir.join('unlinktestfile.txt') + mod.path3.write("delete me!") + pdir = udir.ensure('posixtestdir', dir=True) pdir = udir.ensure('posixtestdir', dir=True) pdir.join('file1').write("test1") os.chmod(str(pdir.join('file1')), 0600) @@ -51,7 +51,6 @@ # space.call_method(space.getbuiltinmodule('sys'), 'getfilesystemencoding') - GET_POSIX = "(): import %s as m ; return m" % os.name @@ -64,7 +63,9 @@ cls.w_posix = space.appexec([], GET_POSIX) cls.w_path = space.wrap(str(path)) cls.w_path2 = space.wrap(str(path2)) + cls.w_path3 = space.wrap(str(path3)) cls.w_pdir = space.wrap(str(pdir)) + cls.w_plat = space.wrap(sys.platform) try: cls.w_unicode_dir = space.wrap( str(unicode_dir).decode(sys.getfilesystemencoding())) @@ -94,6 +95,7 @@ cls.w_confstr_result = space.wrap(os.confstr(confstr_name)) cls.w_SIGABRT = space.wrap(signal.SIGABRT) cls.w_python = space.wrap(sys.executable) + cls.w_platform = space.wrap(sys.platform) if hasattr(os, 'major'): cls.w_expected_major_12345 = space.wrap(os.major(12345)) cls.w_expected_minor_12345 = space.wrap(os.minor(12345)) @@ -119,10 +121,10 @@ fd2 = posix.dup(fd) assert not posix.isatty(fd2) s = posix.read(fd, 1) - assert s == 't' + assert s == b't' posix.lseek(fd, 5, 0) s = posix.read(fd, 1) - assert s == 'i' + assert s == b'i' st = posix.fstat(fd) posix.close(fd2) posix.close(fd) @@ -176,6 +178,7 @@ finally: posix.stat_float_times(current) + def test_stat_result(self): st = self.posix.stat_result((0, 0, 0, 0, 0, 0, 0, 41, 42.1, 43)) assert st.st_atime == 41 @@ -187,6 +190,8 @@ import stat st = self.posix.stat(".") assert stat.S_ISDIR(st.st_mode) + st = self.posix.stat(b".") + assert stat.S_ISDIR(st.st_mode) st = self.posix.lstat(".") assert stat.S_ISDIR(st.st_mode) @@ -268,6 +273,7 @@ assert 0 def test_functions_raise_error(self): + import sys def ex(func, *args): try: func(*args) @@ -282,13 +288,15 @@ ex(self.posix.lseek, UNUSEDFD, 123, 0) #apparently not posix-required: ex(self.posix.isatty, UNUSEDFD) ex(self.posix.read, UNUSEDFD, 123) - ex(self.posix.write, UNUSEDFD, "x") + ex(self.posix.write, UNUSEDFD, b"x") ex(self.posix.close, UNUSEDFD) #UMPF cpython raises IOError ex(self.posix.ftruncate, UNUSEDFD, 123) - ex(self.posix.fstat, UNUSEDFD) - ex(self.posix.stat, "qweqwehello") - # how can getcwd() raise? - ex(self.posix.dup, UNUSEDFD) + if sys.platform == 'win32' and self.runappdirect: + # XXX kills the host interpreter untranslated + ex(self.posix.fstat, UNUSEDFD) + ex(self.posix.stat, "qweqwehello") + # how can getcwd() raise? + ex(self.posix.dup, UNUSEDFD) def test_fdopen(self): import errno @@ -372,17 +380,29 @@ result = posix.listdir(unicode_dir) typed_result = [(type(x), x) for x in result] assert (unicode, u'somefile') in typed_result + file_system_encoding = sys.getfilesystemencoding() try: - u = "caf\xe9".decode(sys.getfilesystemencoding()) + u = "caf\xe9".decode(file_system_encoding) except UnicodeDecodeError: # Could not decode, listdir returned the byte string if sys.platform != 'darwin': assert (str, "caf\xe9") in typed_result else: - # darwin 'normalized' it - assert (unicode, 'caf%E9') in typed_result + # if the test is being run in an utf-8 encoded macOS + # the posix.listdir function is returning the name of + # the file properly. + # This test should be run in multiple macOS platforms to + # be sure that is working as expected. + if file_system_encoding == 'UTF-8': + assert (unicode, 'cafxe9') in typed_result + else: + # darwin 'normalized' it + assert (unicode, 'caf%E9') in typed_result else: assert (unicode, u) in typed_result + assert posix.access(b'caf\xe9', posix.R_OK) is False + assert posix.access('caf\udcc0', posix.R_OK) is False + assert posix.access(b'caf\xc3', posix.R_OK) is False def test_access(self): pdir = self.pdir + '/file1' @@ -394,6 +414,13 @@ if sys.platform != "win32": assert posix.access(pdir, posix.X_OK) is False + def test_unlink(self): + os = self.posix + path = self.path3 + with open(path, 'wb'): + pass + os.unlink(path) + def test_times(self): """ posix.times() should return a five-tuple giving float-representations @@ -406,7 +433,6 @@ for value in result: assert isinstance(value, float) - def test_strerror(self): assert isinstance(self.posix.strerror(0), str) assert isinstance(self.posix.strerror(1), str) @@ -430,9 +456,9 @@ master_fd, slave_fd = os.openpty() assert isinstance(master_fd, int) assert isinstance(slave_fd, int) - os.write(slave_fd, 'x\n') + os.write(slave_fd, b'x\n') data = os.read(master_fd, 100) - assert data.startswith('x') + assert data.startswith(b'x') os.close(master_fd) os.close(slave_fd) @@ -447,11 +473,11 @@ assert isinstance(master_fd, int) if childpid == 0: data = os.read(0, 100) - if data.startswith('abc'): + if data.startswith(b'abc'): os._exit(42) else: os._exit(43) - os.write(master_fd, 'abc\n') + os.write(master_fd, b'abc\n') _, status = os.waitpid(childpid, 0) assert status >> 8 == 42 @@ -500,7 +526,8 @@ os.execv(u"/bin/sh", ["sh", "-c", u"echo caf\xe9 \u1234 > onefile"]) os.waitpid(pid, 0) - assert open("onefile").read() == output + with open("onefile") as fid: + assert fid.read() == output os.unlink("onefile") def test_execve(self): @@ -529,7 +556,8 @@ u"echo caf\xe9 \u1234 > onefile"], {'ddd': 'xxx'}) os.waitpid(pid, 0) - assert open("onefile").read() == output + with open("onefile") as fid: + assert fid.read() == output os.unlink("onefile") pass # <- please, inspect.getsource(), don't crash @@ -568,11 +596,11 @@ assert res == '1\n' def test_popen_child_fds(self): - import os - with open(os.path.join(self.pdir, 'file1'), 'r') as fd: + os = self.posix + with open('/'.join([self.pdir, 'file1']), 'r') as fd: with self.posix.popen('%s -c "import os; print os.read(%d, 10)" 2>&1' % (self.python, fd.fileno())) as stream: res = stream.read() - if os.name == 'nt': + if self.plat == 'win32': assert '\nOSError: [Errno 9]' in res else: assert res == 'test1\n' @@ -587,11 +615,10 @@ def test__getfullpathname(self): # nt specific posix = self.posix - import os - sysdrv = os.getenv("SystemDrive", "C:") + sysdrv = posix.environ.get("SystemDrive", "C:") # just see if it does anything path = sysdrv + 'hubber' - assert os.sep in posix._getfullpathname(path) + assert '\\' in posix._getfullpathname(path) def test_utime(self): os = self.posix @@ -599,7 +626,7 @@ # XXX utimes & float support path = join(self.pdir, "test_utime.txt") fh = open(path, "w") - fh.write("x") + fh.write(b"x") fh.close() from time import time, sleep t0 = time() @@ -611,8 +638,11 @@ def test_utime_raises(self): os = self.posix + import errno raises(TypeError, "os.utime('xxx', 3)") - raises(OSError, "os.utime('somefilewhichihopewouldneverappearhere', None)") + exc = raises(OSError, + "os.utime('somefilewhichihopewouldneverappearhere', None)") + assert exc.value.errno == errno.ENOENT for name in rposix.WAIT_MACROS: if hasattr(os, name): @@ -850,23 +880,20 @@ def test_fchdir(self): os = self.posix localdir = os.getcwd() - try: - os.mkdir(self.path2 + 'dir') - fd = os.open(self.path2 + 'dir', os.O_RDONLY) + os.mkdir(self.path2 + 'fchdir') + for func in [os.fchdir, os.chdir]: + fd = os.open(self.path2 + 'fchdir', os.O_RDONLY) try: os.fchdir(fd) mypath = os.getcwd() finally: - os.close(fd) - assert mypath.endswith('test_posix2-dir') - raises(OSError, os.fchdir, fd) - raises(ValueError, os.fchdir, -1) - finally: - os.chdir(localdir) + os.chdir(localdir) + raises(ValueError, os.fchdir, -1) def test_largefile(self): os = self.posix - fd = os.open(self.path2 + 'test_largefile', os.O_RDWR | os.O_CREAT, 0666) + fd = os.open(self.path2 + 'test_largefile', + os.O_RDWR | os.O_CREAT, 0666) os.ftruncate(fd, 10000000000L) res = os.lseek(fd, 9900000000L, 0) assert res == 9900000000L @@ -888,22 +915,23 @@ count = os.write(fd, s) assert count > 0 s = s[count:] - writeall('hello, ') + writeall(b'hello, ') writeall(buffer('world!\n')) res = os.lseek(fd, 0, 0) assert res == 0 - data = '' + data = b'' while True: s = os.read(fd, 100) if not s: break data += s - assert data == 'hello, world!\n' + assert data == b'hello, world!\n' os.close(fd) def test_write_unicode(self): os = self.posix - fd = os.open(self.path2 + 'test_write_unicode', os.O_RDWR | os.O_CREAT, 0666) + fd = os.open(self.path2 + 'test_write_unicode', + os.O_RDWR | os.O_CREAT, 0666) os.write(fd, u'X') raises(UnicodeEncodeError, os.write, fd, u'\xe9') os.lseek(fd, 0, 0) @@ -937,8 +965,10 @@ os.closerange(start, stop) for fd in fds: os.close(fd) # should not have been closed - for fd in range(start, stop): - raises(OSError, os.fstat, fd) # should have been closed + if self.platform == 'win32' and self.runappdirect: + # XXX kills the host interpreter untranslated + for fd in range(start, stop): + raises(OSError, os.fstat, fd) # should have been closed if hasattr(os, 'chown'): def test_chown(self): @@ -1135,7 +1165,7 @@ assert w[-1].lineno == f_tmpnam_warning.func_code.co_firstlineno def test_has_kill(self): - import os + os = self.posix assert hasattr(os, 'kill') def test_pipe_flush(self): @@ -1188,45 +1218,54 @@ @py.test.mark.skipif("sys.platform != 'win32'") def test_rename(self): os = self.posix - with open(self.path, "w") as f: + fname = self.path2 + 'rename.txt' + with open(fname, "w") as f: f.write("this is a rename test") str_name = str(self.pdir) + '/test_rename.txt' - os.rename(self.path, str_name) + os.rename(fname, str_name) with open(str_name) as f: assert f.read() == 'this is a rename test' - os.rename(str_name, self.path) + os.rename(str_name, fname) unicode_name = str(self.udir) + u'/test\u03be.txt' - os.rename(self.path, unicode_name) + os.rename(fname, unicode_name) with open(unicode_name) as f: assert f.read() == 'this is a rename test' - os.rename(unicode_name, self.path) - with open(self.path) as f: - assert f.read() == 'this is a rename test' - os.unlink(self.path) - + os.rename(unicode_name, fname) + class AppTestEnvironment(object): def setup_class(cls): cls.w_path = space.wrap(str(path)) + cls.w_posix = space.appexec([], GET_POSIX) - if sys.platform != 'win32': - def test_environ(self): - import posix - assert posix.environ['PATH'] - del posix.environ['PATH'] - def fn(): posix.environ['PATH'] - raises(KeyError, fn) - else: - def test_environ(self): - import nt - assert 'ADLDJSSLDFKJSD' not in nt.environ - def fn(): nt.environ['ADLDJSSLDFKJSD'] - raises(KeyError, fn) + def test_environ(self): + import sys, os + environ = os.environ + if not environ: + skip('environ not filled in for untranslated tests') + for k, v in environ.items(): + assert type(k) is str + assert type(v) is str + name = next(iter(environ)) + assert environ[name] is not None + del environ[name] + raises(KeyError, lambda: environ[name]) + + @py.test.mark.dont_track_allocations('putenv intentionally keeps strings alive') + def test_environ_nonascii(self): + import sys, os + name, value = 'PYPY_TEST_日本', 'foobar日本' + os.environ[name] = value + assert os.environ[name] == value + assert os.getenv(name) == value + del os.environ[name] + assert os.environ.get(name) is None + assert os.getenv(name) is None if hasattr(__import__(os.name), "unsetenv"): def test_unsetenv_nonexisting(self): - import os + os = self.posix os.unsetenv("XYZABC") #does not raise try: os.environ["ABCABC"] @@ -1307,9 +1346,10 @@ content = self.posix.read(fd, 50) finally: self.posix.close(fd) - assert content == "test" + assert content == b"test" +from pypy import pypydir class TestPexpect(object): # XXX replace with AppExpectTest class as soon as possible def setup_class(cls): diff -Nru pypy-7.1.1+dfsg/pypy/module/pwd/__init__.py pypy-7.3.1+dfsg/pypy/module/pwd/__init__.py --- pypy-7.1.1+dfsg/pypy/module/pwd/__init__.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/pwd/__init__.py 2020-04-10 19:28:41.000000000 +0000 @@ -1,25 +0,0 @@ -from pypy.interpreter.mixedmodule import MixedModule - -class Module(MixedModule): - """ - This module provides access to the Unix password database. - It is available on all Unix versions. - - Password database entries are reported as 7-tuples containing the following - items from the password database (see `'), in order: - pw_name, pw_passwd, pw_uid, pw_gid, pw_gecos, pw_dir, pw_shell. - The uid and gid items are integers, all others are strings. An - exception is raised if the entry asked for cannot be found. - """ - - interpleveldefs = { - 'getpwuid': 'interp_pwd.getpwuid', - 'getpwnam': 'interp_pwd.getpwnam', - 'getpwall': 'interp_pwd.getpwall', - } - - appleveldefs = { - 'struct_passwd': 'app_pwd.struct_passwd', - 'struct_pwent': 'app_pwd.struct_passwd', - } - diff -Nru pypy-7.1.1+dfsg/pypy/module/pwd/moduledef.py pypy-7.3.1+dfsg/pypy/module/pwd/moduledef.py --- pypy-7.1.1+dfsg/pypy/module/pwd/moduledef.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/pwd/moduledef.py 2020-04-10 19:28:41.000000000 +0000 @@ -0,0 +1,25 @@ +from pypy.interpreter.mixedmodule import MixedModule + +class Module(MixedModule): + """ + This module provides access to the Unix password database. + It is available on all Unix versions. + + Password database entries are reported as 7-tuples containing the following + items from the password database (see `'), in order: + pw_name, pw_passwd, pw_uid, pw_gid, pw_gecos, pw_dir, pw_shell. + The uid and gid items are integers, all others are strings. An + exception is raised if the entry asked for cannot be found. + """ + + interpleveldefs = { + 'getpwuid': 'interp_pwd.getpwuid', + 'getpwnam': 'interp_pwd.getpwnam', + 'getpwall': 'interp_pwd.getpwall', + } + + appleveldefs = { + 'struct_passwd': 'app_pwd.struct_passwd', + 'struct_pwent': 'app_pwd.struct_passwd', + } + diff -Nru pypy-7.1.1+dfsg/pypy/module/pyexpat/__init__.py pypy-7.3.1+dfsg/pypy/module/pyexpat/__init__.py --- pypy-7.1.1+dfsg/pypy/module/pyexpat/__init__.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/pyexpat/__init__.py 2020-04-10 19:28:41.000000000 +0000 @@ -1,67 +0,0 @@ -from pypy.interpreter.mixedmodule import MixedModule - -class ErrorsModule(MixedModule): - "Definition of pyexpat.errors module." - appleveldefs = {} - interpleveldefs = {} - - def setup_after_space_initialization(self): - from pypy.module.pyexpat import interp_pyexpat - for name in interp_pyexpat.xml_error_list: - self.space.setattr(self, self.space.newtext(name), - interp_pyexpat.ErrorString(self.space, - getattr(interp_pyexpat, name))) - -class ModelModule(MixedModule): - "Definition of pyexpat.model module." - appleveldefs = {} - interpleveldefs = {} - - def setup_after_space_initialization(self): - from pypy.module.pyexpat import interp_pyexpat - space = self.space - for name in interp_pyexpat.xml_model_list: - value = getattr(interp_pyexpat, name) - space.setattr(self, space.newtext(name), space.wrap(value)) - -class Module(MixedModule): - "Python wrapper for Expat parser." - - appleveldefs = { - } - - interpleveldefs = { - 'ParserCreate': 'interp_pyexpat.ParserCreate', - 'XMLParserType': 'interp_pyexpat.W_XMLParserType', - 'ErrorString': 'interp_pyexpat.ErrorString', - - 'ExpatError': 'space.fromcache(interp_pyexpat.Cache).w_error', - 'error': 'space.fromcache(interp_pyexpat.Cache).w_error', - - '__version__': 'space.newtext("85819")', - } - - submodules = { - 'errors': ErrorsModule, - 'model': ModelModule, - } - - for name in ['XML_PARAM_ENTITY_PARSING_NEVER', - 'XML_PARAM_ENTITY_PARSING_UNLESS_STANDALONE', - 'XML_PARAM_ENTITY_PARSING_ALWAYS']: - interpleveldefs[name] = 'space.wrap(interp_pyexpat.%s)' % (name,) - - def __init__(self, space, w_name): - "NOT_RPYTHON" - from pypy.module.pyexpat import interp_pyexpat - super(Module, self).__init__(space, w_name) - ver = space.unwrap(interp_pyexpat.get_expat_version(space)) - assert len(ver) >= 5, ( - "Cannot compile with the wide (UTF-16) version of Expat") - - def startup(self, space): - from pypy.module.pyexpat import interp_pyexpat - w_ver = interp_pyexpat.get_expat_version(space) - space.setattr(self, space.newtext("EXPAT_VERSION"), w_ver) - w_ver = interp_pyexpat.get_expat_version_info(space) - space.setattr(self, space.newtext("version_info"), w_ver) diff -Nru pypy-7.1.1+dfsg/pypy/module/pyexpat/moduledef.py pypy-7.3.1+dfsg/pypy/module/pyexpat/moduledef.py --- pypy-7.1.1+dfsg/pypy/module/pyexpat/moduledef.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/pyexpat/moduledef.py 2020-04-10 19:28:41.000000000 +0000 @@ -0,0 +1,67 @@ +from pypy.interpreter.mixedmodule import MixedModule + +class ErrorsModule(MixedModule): + "Definition of pyexpat.errors module." + appleveldefs = {} + interpleveldefs = {} + + def setup_after_space_initialization(self): + from pypy.module.pyexpat import interp_pyexpat + for name in interp_pyexpat.xml_error_list: + self.space.setattr(self, self.space.newtext(name), + interp_pyexpat.ErrorString(self.space, + getattr(interp_pyexpat, name))) + +class ModelModule(MixedModule): + "Definition of pyexpat.model module." + appleveldefs = {} + interpleveldefs = {} + + def setup_after_space_initialization(self): + from pypy.module.pyexpat import interp_pyexpat + space = self.space + for name in interp_pyexpat.xml_model_list: + value = getattr(interp_pyexpat, name) + space.setattr(self, space.newtext(name), space.wrap(value)) + +class Module(MixedModule): + "Python wrapper for Expat parser." + + appleveldefs = { + } + + interpleveldefs = { + 'ParserCreate': 'interp_pyexpat.ParserCreate', + 'XMLParserType': 'interp_pyexpat.W_XMLParserType', + 'ErrorString': 'interp_pyexpat.ErrorString', + + 'ExpatError': 'space.fromcache(interp_pyexpat.Cache).w_error', + 'error': 'space.fromcache(interp_pyexpat.Cache).w_error', + + '__version__': 'space.newtext("85819")', + } + + submodules = { + 'errors': ErrorsModule, + 'model': ModelModule, + } + + for name in ['XML_PARAM_ENTITY_PARSING_NEVER', + 'XML_PARAM_ENTITY_PARSING_UNLESS_STANDALONE', + 'XML_PARAM_ENTITY_PARSING_ALWAYS']: + interpleveldefs[name] = 'space.wrap(interp_pyexpat.%s)' % (name,) + + def __init__(self, space, w_name): + "NOT_RPYTHON" + from pypy.module.pyexpat import interp_pyexpat + super(Module, self).__init__(space, w_name) + ver = space.unwrap(interp_pyexpat.get_expat_version(space)) + assert len(ver) >= 5, ( + "Cannot compile with the wide (UTF-16) version of Expat") + + def startup(self, space): + from pypy.module.pyexpat import interp_pyexpat + w_ver = interp_pyexpat.get_expat_version(space) + space.setattr(self, space.newtext("EXPAT_VERSION"), w_ver) + w_ver = interp_pyexpat.get_expat_version_info(space) + space.setattr(self, space.newtext("version_info"), w_ver) diff -Nru pypy-7.1.1+dfsg/pypy/module/__pypy__/app_signal.py pypy-7.3.1+dfsg/pypy/module/__pypy__/app_signal.py --- pypy-7.1.1+dfsg/pypy/module/__pypy__/app_signal.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/__pypy__/app_signal.py 2020-04-10 19:28:40.000000000 +0000 @@ -1,4 +1,4 @@ -import thread +from .thread import _signals_enter, _signals_exit # ^^ relative import of __pypy__.thread. Note that some tests depend on # this (test_enable_signals in test_signal.py) to work properly, # otherwise they get caught in some deadlock waiting for the import @@ -13,7 +13,7 @@ that is within a "with signals_enabled:". This other thread should be ready to handle unexpected exceptions that the signal handler might raise --- notably KeyboardInterrupt.''' - __enter__ = thread._signals_enter - __exit__ = thread._signals_exit + __enter__ = _signals_enter + __exit__ = _signals_exit signals_enabled = SignalsEnabled() diff -Nru pypy-7.1.1+dfsg/pypy/module/__pypy__/__init__.py pypy-7.3.1+dfsg/pypy/module/__pypy__/__init__.py --- pypy-7.1.1+dfsg/pypy/module/__pypy__/__init__.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/__pypy__/__init__.py 2020-04-10 19:28:40.000000000 +0000 @@ -1,163 +0,0 @@ -import sys - -from pypy.interpreter.mixedmodule import MixedModule -from pypy.module.imp.importing import get_pyc_magic -from rpython.rlib import rtime - - -class BuildersModule(MixedModule): - """ Module containing string and unicode builders """ - - appleveldefs = {} - - interpleveldefs = { - "StringBuilder": "interp_builders.W_StringBuilder", - "UnicodeBuilder": "interp_builders.W_UnicodeBuilder", - } - -class TimeModule(MixedModule): - appleveldefs = {} - interpleveldefs = {} - if rtime.HAS_CLOCK_GETTIME: - interpleveldefs["clock_gettime"] = "interp_time.clock_gettime" - interpleveldefs["clock_getres"] = "interp_time.clock_getres" - for name in rtime.ALL_DEFINED_CLOCKS: - interpleveldefs[name] = "space.wrap(%d)" % getattr(rtime, name) - - -class ThreadModule(MixedModule): - appleveldefs = { - 'signals_enabled': 'app_signal.signals_enabled', - } - interpleveldefs = { - '_signals_enter': 'interp_signal.signals_enter', - '_signals_exit': 'interp_signal.signals_exit', - } - - -class IntOpModule(MixedModule): - """ Module for integer operations that have two-complement overflow - behaviour instead of overflowing to longs """ - appleveldefs = {} - interpleveldefs = { - 'int_add': 'interp_intop.int_add', - 'int_sub': 'interp_intop.int_sub', - 'int_mul': 'interp_intop.int_mul', - 'int_floordiv': 'interp_intop.int_floordiv', - 'int_mod': 'interp_intop.int_mod', - 'int_lshift': 'interp_intop.int_lshift', - 'int_rshift': 'interp_intop.int_rshift', - 'uint_rshift': 'interp_intop.uint_rshift', - 'int_mulmod': 'interp_intop.int_mulmod', - } - - -class OsModule(MixedModule): - appleveldefs = {} - interpleveldefs = { - 'real_getenv': 'interp_os.real_getenv' - } - - -class PyPyDateTime(MixedModule): - appleveldefs = {} - interpleveldefs = { - 'dateinterop' : 'interp_pypydatetime.W_DateTime_Date', - 'timeinterop' : 'interp_pypydatetime.W_DateTime_Time', - 'deltainterop' : 'interp_pypydatetime.W_DateTime_Delta', - } - -class PyPyBufferable(MixedModule): - appleveldefs = {} - interpleveldefs = { - 'bufferable': 'interp_buffer.W_Bufferable', - } - - -class Module(MixedModule): - """ PyPy specific "magic" functions. A lot of them are experimental and - subject to change, many are internal. """ - appleveldefs = { - } - - interpleveldefs = { - 'attach_gdb' : 'interp_magic.attach_gdb', - 'internal_repr' : 'interp_magic.internal_repr', - 'bytebuffer' : 'bytebuffer.bytebuffer', - 'identity_dict' : 'interp_identitydict.W_IdentityDict', - 'debug_start' : 'interp_debug.debug_start', - 'debug_print' : 'interp_debug.debug_print', - 'debug_stop' : 'interp_debug.debug_stop', - 'debug_print_once' : 'interp_debug.debug_print_once', - 'debug_flush' : 'interp_debug.debug_flush', - 'debug_read_timestamp' : 'interp_debug.debug_read_timestamp', - 'debug_get_timestamp_unit' : 'interp_debug.debug_get_timestamp_unit', - 'builtinify' : 'interp_magic.builtinify', - 'hidden_applevel' : 'interp_magic.hidden_applevel', - 'get_hidden_tb' : 'interp_magic.get_hidden_tb', - 'lookup_special' : 'interp_magic.lookup_special', - 'do_what_I_mean' : 'interp_magic.do_what_I_mean', - 'resizelist_hint' : 'interp_magic.resizelist_hint', - 'newlist_hint' : 'interp_magic.newlist_hint', - 'add_memory_pressure' : 'interp_magic.add_memory_pressure', - 'newdict' : 'interp_dict.newdict', - 'reversed_dict' : 'interp_dict.reversed_dict', - 'dict_popitem_first' : 'interp_dict.dict_popitem_first', - 'delitem_if_value_is' : 'interp_dict.delitem_if_value_is', - 'move_to_end' : 'interp_dict.move_to_end', - 'strategy' : 'interp_magic.strategy', # dict,set,list - 'specialized_zip_2_lists' : 'interp_magic.specialized_zip_2_lists', - 'set_debug' : 'interp_magic.set_debug', - 'locals_to_fast' : 'interp_magic.locals_to_fast', - 'set_code_callback' : 'interp_magic.set_code_callback', - 'save_module_content_for_future_reload': - 'interp_magic.save_module_content_for_future_reload', - 'decode_long' : 'interp_magic.decode_long', - '_promote' : 'interp_magic._promote', - 'side_effects_ok' : 'interp_magic.side_effects_ok', - 'stack_almost_full' : 'interp_magic.stack_almost_full', - 'pyos_inputhook' : 'interp_magic.pyos_inputhook', - 'newmemoryview' : 'interp_buffer.newmemoryview', - } - if sys.platform == 'win32': - interpleveldefs['get_console_cp'] = 'interp_magic.get_console_cp' - - submodules = { - "builders": BuildersModule, - "time": TimeModule, - "thread": ThreadModule, - "intop": IntOpModule, - "os": OsModule, - '_pypydatetime': PyPyDateTime, - 'bufferable': PyPyBufferable, - } - - def setup_after_space_initialization(self): - """NOT_RPYTHON""" - if self.space.config.objspace.std.withmethodcachecounter: - self.extra_interpdef('method_cache_counter', - 'interp_magic.method_cache_counter') - self.extra_interpdef('reset_method_cache_counter', - 'interp_magic.reset_method_cache_counter') - self.extra_interpdef('mapdict_cache_counter', - 'interp_magic.mapdict_cache_counter') - PYC_MAGIC = get_pyc_magic(self.space) - self.extra_interpdef('PYC_MAGIC', 'space.wrap(%d)' % PYC_MAGIC) - try: - from rpython.jit.backend import detect_cpu - model = detect_cpu.autodetect() - self.extra_interpdef('cpumodel', 'space.wrap(%r)' % model) - except Exception: - if self.space.config.translation.jit: - raise - else: - pass # ok fine to ignore in this case - - if self.space.config.translation.jit: - features = detect_cpu.getcpufeatures(model) - self.extra_interpdef('jit_backend_features', - 'space.wrap(%r)' % features) - if self.space.config.translation.reverse_debugger: - self.extra_interpdef('revdb_stop', 'interp_magic.revdb_stop') - else: - self.extra_interpdef('revdb_stop', 'space.w_None') diff -Nru pypy-7.1.1+dfsg/pypy/module/__pypy__/interp_buffer.py pypy-7.3.1+dfsg/pypy/module/__pypy__/interp_buffer.py --- pypy-7.1.1+dfsg/pypy/module/__pypy__/interp_buffer.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/__pypy__/interp_buffer.py 2020-04-10 19:28:40.000000000 +0000 @@ -1,6 +1,6 @@ -# -# An app-level interface to tp_as_buffer->bf_getbuffer. -# +""" +Allow use of the buffer interface from python +""" from pypy.interpreter.error import oefmt from pypy.interpreter.gateway import unwrap_spec, interp2app diff -Nru pypy-7.1.1+dfsg/pypy/module/__pypy__/interp_magic.py pypy-7.3.1+dfsg/pypy/module/__pypy__/interp_magic.py --- pypy-7.1.1+dfsg/pypy/module/__pypy__/interp_magic.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/__pypy__/interp_magic.py 2020-04-10 19:28:40.000000000 +0000 @@ -108,6 +108,10 @@ return space.newtext(name) def get_console_cp(space): + """get_console_cp() + + Return the console and console output code page (windows only) + """ from rpython.rlib import rwin32 # Windows only return space.newtuple([ space.newtext('cp%d' % rwin32.GetConsoleCP()), @@ -221,3 +225,12 @@ return # cpyext not imported yet, ignore from pypy.module.cpyext.api import invoke_pyos_inputhook invoke_pyos_inputhook(space) + +def utf8content(space, w_u): + """ Given a unicode string u, return it's internal byte representation. + Useful for debugging only. """ + from pypy.objspace.std.unicodeobject import W_UnicodeObject + if type(w_u) is not W_UnicodeObject: + raise oefmt(space.w_TypeError, "expected unicode string, got %T", w_u) + return space.newbytes(w_u._utf8) + diff -Nru pypy-7.1.1+dfsg/pypy/module/__pypy__/moduledef.py pypy-7.3.1+dfsg/pypy/module/__pypy__/moduledef.py --- pypy-7.1.1+dfsg/pypy/module/__pypy__/moduledef.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/__pypy__/moduledef.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,164 @@ +import sys + +from pypy.interpreter.mixedmodule import MixedModule +from pypy.module.imp.importing import get_pyc_magic +from rpython.rlib import rtime + + +class BuildersModule(MixedModule): + """ Module containing string and unicode builders """ + + appleveldefs = {} + + interpleveldefs = { + "StringBuilder": "interp_builders.W_StringBuilder", + "UnicodeBuilder": "interp_builders.W_UnicodeBuilder", + } + +class TimeModule(MixedModule): + appleveldefs = {} + interpleveldefs = {} + if rtime.HAS_CLOCK_GETTIME: + interpleveldefs["clock_gettime"] = "interp_time.clock_gettime" + interpleveldefs["clock_getres"] = "interp_time.clock_getres" + for name in rtime.ALL_DEFINED_CLOCKS: + interpleveldefs[name] = "space.wrap(%d)" % getattr(rtime, name) + + +class ThreadModule(MixedModule): + appleveldefs = { + 'signals_enabled': 'app_signal.signals_enabled', + } + interpleveldefs = { + '_signals_enter': 'interp_signal.signals_enter', + '_signals_exit': 'interp_signal.signals_exit', + } + + +class IntOpModule(MixedModule): + """ Module for integer operations that have two-complement overflow + behaviour instead of overflowing to longs """ + appleveldefs = {} + interpleveldefs = { + 'int_add': 'interp_intop.int_add', + 'int_sub': 'interp_intop.int_sub', + 'int_mul': 'interp_intop.int_mul', + 'int_floordiv': 'interp_intop.int_floordiv', + 'int_mod': 'interp_intop.int_mod', + 'int_lshift': 'interp_intop.int_lshift', + 'int_rshift': 'interp_intop.int_rshift', + 'uint_rshift': 'interp_intop.uint_rshift', + 'int_mulmod': 'interp_intop.int_mulmod', + } + + +class OsModule(MixedModule): + appleveldefs = {} + interpleveldefs = { + 'real_getenv': 'interp_os.real_getenv' + } + + +class PyPyDateTime(MixedModule): + appleveldefs = {} + interpleveldefs = { + 'dateinterop' : 'interp_pypydatetime.W_DateTime_Date', + 'timeinterop' : 'interp_pypydatetime.W_DateTime_Time', + 'deltainterop' : 'interp_pypydatetime.W_DateTime_Delta', + } + +class PyPyBufferable(MixedModule): + appleveldefs = {} + interpleveldefs = { + 'bufferable': 'interp_buffer.W_Bufferable', + } + + +class Module(MixedModule): + """ PyPy specific "magic" functions. A lot of them are experimental and + subject to change, many are internal. """ + appleveldefs = { + } + + interpleveldefs = { + 'attach_gdb' : 'interp_magic.attach_gdb', + 'internal_repr' : 'interp_magic.internal_repr', + 'bytebuffer' : 'bytebuffer.bytebuffer', + 'identity_dict' : 'interp_identitydict.W_IdentityDict', + 'debug_start' : 'interp_debug.debug_start', + 'debug_print' : 'interp_debug.debug_print', + 'debug_stop' : 'interp_debug.debug_stop', + 'debug_print_once' : 'interp_debug.debug_print_once', + 'debug_flush' : 'interp_debug.debug_flush', + 'debug_read_timestamp' : 'interp_debug.debug_read_timestamp', + 'debug_get_timestamp_unit' : 'interp_debug.debug_get_timestamp_unit', + 'builtinify' : 'interp_magic.builtinify', + 'hidden_applevel' : 'interp_magic.hidden_applevel', + 'get_hidden_tb' : 'interp_magic.get_hidden_tb', + 'lookup_special' : 'interp_magic.lookup_special', + 'do_what_I_mean' : 'interp_magic.do_what_I_mean', + 'resizelist_hint' : 'interp_magic.resizelist_hint', + 'newlist_hint' : 'interp_magic.newlist_hint', + 'add_memory_pressure' : 'interp_magic.add_memory_pressure', + 'newdict' : 'interp_dict.newdict', + 'reversed_dict' : 'interp_dict.reversed_dict', + 'dict_popitem_first' : 'interp_dict.dict_popitem_first', + 'delitem_if_value_is' : 'interp_dict.delitem_if_value_is', + 'move_to_end' : 'interp_dict.move_to_end', + 'strategy' : 'interp_magic.strategy', # dict,set,list + 'specialized_zip_2_lists' : 'interp_magic.specialized_zip_2_lists', + 'set_debug' : 'interp_magic.set_debug', + 'locals_to_fast' : 'interp_magic.locals_to_fast', + 'set_code_callback' : 'interp_magic.set_code_callback', + 'save_module_content_for_future_reload': + 'interp_magic.save_module_content_for_future_reload', + 'decode_long' : 'interp_magic.decode_long', + '_promote' : 'interp_magic._promote', + 'side_effects_ok' : 'interp_magic.side_effects_ok', + 'stack_almost_full' : 'interp_magic.stack_almost_full', + 'pyos_inputhook' : 'interp_magic.pyos_inputhook', + 'newmemoryview' : 'interp_buffer.newmemoryview', + 'utf8content' : 'interp_magic.utf8content', + } + if sys.platform == 'win32': + interpleveldefs['get_console_cp'] = 'interp_magic.get_console_cp' + + submodules = { + "builders": BuildersModule, + "time": TimeModule, + "thread": ThreadModule, + "intop": IntOpModule, + "os": OsModule, + '_pypydatetime': PyPyDateTime, + 'bufferable': PyPyBufferable, + } + + def setup_after_space_initialization(self): + """NOT_RPYTHON""" + if self.space.config.objspace.std.withmethodcachecounter: + self.extra_interpdef('method_cache_counter', + 'interp_magic.method_cache_counter') + self.extra_interpdef('reset_method_cache_counter', + 'interp_magic.reset_method_cache_counter') + self.extra_interpdef('mapdict_cache_counter', + 'interp_magic.mapdict_cache_counter') + PYC_MAGIC = get_pyc_magic(self.space) + self.extra_interpdef('PYC_MAGIC', 'space.wrap(%d)' % PYC_MAGIC) + try: + from rpython.jit.backend import detect_cpu + model = detect_cpu.autodetect() + self.extra_interpdef('cpumodel', 'space.wrap(%r)' % model) + except Exception: + if self.space.config.translation.jit: + raise + else: + pass # ok fine to ignore in this case + + if self.space.config.translation.jit: + features = detect_cpu.getcpufeatures(model) + self.extra_interpdef('jit_backend_features', + 'space.wrap(%r)' % features) + if self.space.config.translation.reverse_debugger: + self.extra_interpdef('revdb_stop', 'interp_magic.revdb_stop') + else: + self.extra_interpdef('revdb_stop', 'space.w_None') diff -Nru pypy-7.1.1+dfsg/pypy/module/__pypy__/test/test_bytebuffer.py pypy-7.3.1+dfsg/pypy/module/__pypy__/test/test_bytebuffer.py --- pypy-7.1.1+dfsg/pypy/module/__pypy__/test/test_bytebuffer.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/__pypy__/test/test_bytebuffer.py 2020-04-10 19:28:40.000000000 +0000 @@ -28,3 +28,8 @@ r = str(buffer(u'#')) b[6:6+len(r)] = u'#' assert str(b[:6+len(r)]) == "\x00xy\x00z\x00" + r + + def test_buffer_getslice_empty(self): + from __pypy__ import bytebuffer + b = bytebuffer(10) + assert b[1:0] == '' diff -Nru pypy-7.1.1+dfsg/pypy/module/__pypy__/test/test_debug.py pypy-7.3.1+dfsg/pypy/module/__pypy__/test/test_debug.py --- pypy-7.1.1+dfsg/pypy/module/__pypy__/test/test_debug.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/__pypy__/test/test_debug.py 2020-04-10 19:28:40.000000000 +0000 @@ -66,8 +66,8 @@ assert debug_start('foo') is None assert debug_stop('foo') is None ts1 = debug_start('foo', timestamp=True) - t = time.time() - while time.time() - t < 0.02: + t = time.clock() + while time.clock() - t < 0.02: pass ts2 = debug_stop('foo', timestamp=True) assert ts2 > ts1 diff -Nru pypy-7.1.1+dfsg/pypy/module/__pypy__/test/test_magic.py pypy-7.3.1+dfsg/pypy/module/__pypy__/test/test_magic.py --- pypy-7.1.1+dfsg/pypy/module/__pypy__/test/test_magic.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/__pypy__/test/test_magic.py 2020-04-10 19:28:40.000000000 +0000 @@ -1,3 +1,4 @@ +# encoding: utf-8 class AppTestMagic: spaceconfig = dict(usemodules=['__pypy__']) @@ -60,3 +61,8 @@ pass a = A() assert _promote(a) is a + + def test_utf8_content(self): + from __pypy__ import utf8content + assert utf8content(u"a") == b"a" + assert utf8content(u"\xe4") == b'\xc3\xa4' diff -Nru pypy-7.1.1+dfsg/pypy/module/__pypy__/test/test_special.py pypy-7.3.1+dfsg/pypy/module/__pypy__/test/test_special.py --- pypy-7.1.1+dfsg/pypy/module/__pypy__/test/test_special.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/__pypy__/test/test_special.py 2020-04-10 19:28:40.000000000 +0000 @@ -101,7 +101,7 @@ l = ["a", "b", "c"] assert strategy(l) == "BytesListStrategy" l = [u"a", u"b", u"c"] - assert strategy(l) == "UnicodeListStrategy" + assert strategy(l) == "AsciiListStrategy" l = [1.1, 2.2, 3.3] assert strategy(l) == "FloatListStrategy" l = range(3) diff -Nru pypy-7.1.1+dfsg/pypy/module/pypyjit/__init__.py pypy-7.3.1+dfsg/pypy/module/pypyjit/__init__.py --- pypy-7.1.1+dfsg/pypy/module/pypyjit/__init__.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/pypyjit/__init__.py 2020-04-10 19:28:41.000000000 +0000 @@ -1,43 +0,0 @@ -from pypy.interpreter.mixedmodule import MixedModule - -class Module(MixedModule): - appleveldefs = { - } - - interpleveldefs = { - 'set_param': 'interp_jit.set_param', - 'residual_call': 'interp_jit.residual_call', - 'not_from_assembler': 'interp_jit.W_NotFromAssembler', - 'get_jitcell_at_key': 'interp_jit.get_jitcell_at_key', - 'dont_trace_here': 'interp_jit.dont_trace_here', - 'trace_next_iteration': 'interp_jit.trace_next_iteration', - 'trace_next_iteration_hash': 'interp_jit.trace_next_iteration_hash', - 'set_compile_hook': 'interp_resop.set_compile_hook', - 'set_abort_hook': 'interp_resop.set_abort_hook', - 'set_trace_too_long_hook': 'interp_resop.set_trace_too_long_hook', - 'get_stats_snapshot': 'interp_resop.get_stats_snapshot', - 'get_stats_asmmemmgr': 'interp_resop.get_stats_asmmemmgr', - # those things are disabled because they have bugs, but if - # they're found to be useful, fix test_ztranslation_jit_stats - # in the backend first. get_stats_snapshot still produces - # correct loop_runs if PYPYLOG is correct - #'enable_debug': 'interp_resop.enable_debug', - #'disable_debug': 'interp_resop.disable_debug', - 'ResOperation': 'interp_resop.WrappedOp', - 'GuardOp': 'interp_resop.GuardOp', - 'DebugMergePoint': 'interp_resop.DebugMergePoint', - 'JitLoopInfo': 'interp_resop.W_JitLoopInfo', - 'PARAMETER_DOCS': 'space.wrap(rpython.rlib.jit.PARAMETER_DOCS)', - } - - def setup_after_space_initialization(self): - # force the __extend__ hacks to occur early - from pypy.module.pypyjit.interp_jit import pypyjitdriver - from pypy.module.pypyjit.hooks import pypy_hooks - # add the 'defaults' attribute - from rpython.rlib.jit import PARAMETERS - space = self.space - pypyjitdriver.space = space - w_obj = space.wrap(PARAMETERS) - space.setattr(self, space.newtext('defaults'), w_obj) - pypy_hooks.space = space diff -Nru pypy-7.1.1+dfsg/pypy/module/pypyjit/moduledef.py pypy-7.3.1+dfsg/pypy/module/pypyjit/moduledef.py --- pypy-7.1.1+dfsg/pypy/module/pypyjit/moduledef.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/pypyjit/moduledef.py 2020-04-10 19:28:41.000000000 +0000 @@ -0,0 +1,43 @@ +from pypy.interpreter.mixedmodule import MixedModule + +class Module(MixedModule): + appleveldefs = { + } + + interpleveldefs = { + 'set_param': 'interp_jit.set_param', + 'residual_call': 'interp_jit.residual_call', + 'not_from_assembler': 'interp_jit.W_NotFromAssembler', + 'get_jitcell_at_key': 'interp_jit.get_jitcell_at_key', + 'dont_trace_here': 'interp_jit.dont_trace_here', + 'trace_next_iteration': 'interp_jit.trace_next_iteration', + 'trace_next_iteration_hash': 'interp_jit.trace_next_iteration_hash', + 'set_compile_hook': 'interp_resop.set_compile_hook', + 'set_abort_hook': 'interp_resop.set_abort_hook', + 'set_trace_too_long_hook': 'interp_resop.set_trace_too_long_hook', + 'get_stats_snapshot': 'interp_resop.get_stats_snapshot', + 'get_stats_asmmemmgr': 'interp_resop.get_stats_asmmemmgr', + # those things are disabled because they have bugs, but if + # they're found to be useful, fix test_ztranslation_jit_stats + # in the backend first. get_stats_snapshot still produces + # correct loop_runs if PYPYLOG is correct + #'enable_debug': 'interp_resop.enable_debug', + #'disable_debug': 'interp_resop.disable_debug', + 'ResOperation': 'interp_resop.WrappedOp', + 'GuardOp': 'interp_resop.GuardOp', + 'DebugMergePoint': 'interp_resop.DebugMergePoint', + 'JitLoopInfo': 'interp_resop.W_JitLoopInfo', + 'PARAMETER_DOCS': 'space.wrap(rpython.rlib.jit.PARAMETER_DOCS)', + } + + def setup_after_space_initialization(self): + # force the __extend__ hacks to occur early + from pypy.module.pypyjit.interp_jit import pypyjitdriver + from pypy.module.pypyjit.hooks import pypy_hooks + # add the 'defaults' attribute + from rpython.rlib.jit import PARAMETERS + space = self.space + pypyjitdriver.space = space + w_obj = space.wrap(PARAMETERS) + space.setattr(self, space.newtext('defaults'), w_obj) + pypy_hooks.space = space diff -Nru pypy-7.1.1+dfsg/pypy/module/pypyjit/test/conftest.py pypy-7.3.1+dfsg/pypy/module/pypyjit/test/conftest.py --- pypy-7.1.1+dfsg/pypy/module/pypyjit/test/conftest.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/pypyjit/test/conftest.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,7 +0,0 @@ -def pytest_addoption(parser): - group = parser.getgroup("pypyjit options") - group.addoption("--pypy", action="store", default=None, dest="pypy_c", - help="DEPRECATED: use this in test_pypy_c instead") -# XXX kill the corresponding section in the buildbot run, -# which (as far as I can tell) ignores that option entirely and does -# the same as the regular py.test. diff -Nru pypy-7.1.1+dfsg/pypy/module/pypyjit/test_pypy_c/test_call.py pypy-7.3.1+dfsg/pypy/module/pypyjit/test_pypy_c/test_call.py --- pypy-7.1.1+dfsg/pypy/module/pypyjit/test_pypy_c/test_call.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/pypyjit/test_pypy_c/test_call.py 2020-04-10 19:28:41.000000000 +0000 @@ -448,11 +448,7 @@ i34 = getfield_gc_i(p29, descr=) i35 = int_is_zero(i34) guard_true(i35, descr=...) - p37 = getfield_gc_r(ConstPtr(ptr36), descr=) - guard_nonnull_class(p37, ConstClass(W_IntObject), descr=...) - i39 = getfield_gc_i(p37, descr=) - i40 = int_add_ovf(i22, i39) - guard_no_overflow(descr=...) + i40 = int_add(i22, 5) --TICK-- """) diff -Nru pypy-7.1.1+dfsg/pypy/module/pypyjit/test_pypy_c/test_ffi.py pypy-7.3.1+dfsg/pypy/module/pypyjit/test_pypy_c/test_ffi.py --- pypy-7.1.1+dfsg/pypy/module/pypyjit/test_pypy_c/test_ffi.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/pypyjit/test_pypy_c/test_ffi.py 2020-04-10 19:28:41.000000000 +0000 @@ -427,7 +427,7 @@ i158 = getfield_raw_i(..., descr=...) setfield_gc(p48, p49, descr=...) setfield_gc(p134, ConstPtr(null), descr=...) - i160 = int_lt(i158, 0) - guard_false(i160, descr=...) + i159 = int_lt(i158, 0) + guard_false(i159, descr=...) jump(..., descr=...) """) diff -Nru pypy-7.1.1+dfsg/pypy/module/pypyjit/test_pypy_c/test_generators.py pypy-7.3.1+dfsg/pypy/module/pypyjit/test_pypy_c/test_generators.py --- pypy-7.1.1+dfsg/pypy/module/pypyjit/test_pypy_c/test_generators.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/pypyjit/test_pypy_c/test_generators.py 2020-04-10 19:28:41.000000000 +0000 @@ -21,6 +21,10 @@ assert loop.match_by_id("generator", """ cond_call(..., descr=...) i16 = force_token() + setfield_gc(p14, 1, descr=) + setfield_gc(p22, p35, descr=) + guard_not_invalidated(descr=...) + p45 = new_with_vtable(descr=<.*>) ifoo = arraylen_gc(p8, descr=) setfield_gc(p45, i29, descr=) @@ -50,6 +54,9 @@ assert loop.match_by_id("generator", """ cond_call(..., descr=...) i16 = force_token() + setfield_gc(p14, 1, descr=) + setfield_gc(p22, p35, descr=) + guard_not_invalidated(descr=...) p45 = new_with_vtable(descr=<.*>) i47 = arraylen_gc(p8, descr=) # Should be removed by backend setfield_gc(p45, i29, descr=) @@ -61,3 +68,13 @@ i2 = int_sub_ovf(i1, 42) guard_no_overflow(descr=...) """) + + def test_nonstd_jitdriver_distinguishes_generators(self): + def main(): + # test the "contains" jitdriver, but the others are the same + res = (9999 in (i for i in range(20000))) + res += (9999 in (i for i in range(20000))) + return res + log = self.run(main, []) + assert len(log.loops) == 2 # as opposed to one loop, one bridge + diff -Nru pypy-7.1.1+dfsg/pypy/module/pypyjit/test_pypy_c/test_getframe.py pypy-7.3.1+dfsg/pypy/module/pypyjit/test_pypy_c/test_getframe.py --- pypy-7.1.1+dfsg/pypy/module/pypyjit/test_pypy_c/test_getframe.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/pypyjit/test_pypy_c/test_getframe.py 2020-04-10 19:28:41.000000000 +0000 @@ -23,3 +23,45 @@ --TICK-- jump(..., descr=...) """) + + def test_current_frames(self): + def main(): + import sys + import time + import thread + + lst = [0.0] * 1000 + lst[-33] = 3.0 + done = [] + + def h1(x): + time.sleep(lst[x]) + + def g1(x): + h1(x) + + def f1(): + for j in range(1000): + g1(j) + done.append('done') + + for k in range(3): + thread.start_new_thread(f1, ()) + + time.sleep(1) + d = sys._current_frames() + + time.sleep(3) + # the captured frames should be finished by now + + done.append(str(len(d))) + for key, value in d.items(): + while value is not None: + name = value.f_code.co_name + if len(name) == 2 and name[1] == '1': + done.append(name) + value = value.f_back + return repr('-'.join(done)) + + log = self.run(main, []) + assert log.result == 'done-done-done-4-h1-g1-f1-h1-g1-f1-h1-g1-f1' diff -Nru pypy-7.1.1+dfsg/pypy/module/pypyjit/test_pypy_c/test_micronumpy.py pypy-7.3.1+dfsg/pypy/module/pypyjit/test_pypy_c/test_micronumpy.py --- pypy-7.1.1+dfsg/pypy/module/pypyjit/test_pypy_c/test_micronumpy.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/pypyjit/test_pypy_c/test_micronumpy.py 2020-04-10 19:28:41.000000000 +0000 @@ -4,8 +4,11 @@ from pypy.module.pypyjit.test_pypy_c.test_00_model import BaseTestPyPyC from rpython.rlib.rawstorage import misaligned_is_fine +IS_X86 = platform.machine().startswith('x86') or platform.machine() == 'i686' +IS_S390X = platform.machine() == "s390x" + def no_vector_backend(): - if platform.machine().startswith('x86'): + if IS_X86: from rpython.jit.backend.x86.detect_feature import detect_sse4_2 if sys.maxsize < 2**31: return True @@ -18,6 +21,20 @@ return not detect_simd_z() return True +def align_check(input): + if IS_X86 or IS_S390X: + return "" + if sys.maxsize > 2**32: + mask = 7 + else: + mask = 3 + return """ + i10096 = int_and(%s, %d) + i10097 = int_is_zero(i10096) + guard_true(i10097, descr=...) + """ % (input, mask) + + class TestMicroNumPy(BaseTestPyPyC): arith_comb = [('+','float','float', 4*3427, 3427, 1.0,3.0), @@ -137,17 +154,18 @@ guard_class(p1, #, descr=...) p4 = getfield_gc_r(p1, descr=) i5 = getfield_gc_i(p0, descr=) + guard_not_invalidated(descr=...) p6 = getfield_gc_r(p4, descr=) p7 = getfield_gc_r(p6, descr=) guard_class(p7, ConstClass(Float64), descr=...) i9 = getfield_gc_i(p4, descr=) i10 = getfield_gc_i(p6, descr=) i12 = int_eq(i10, 61) - i14 = int_eq(i10, %d) + i14 = int_eq(i10, %(bit)d) i15 = int_or(i12, i14) + %(align_check)s f16 = raw_load_f(i9, i5, descr=) guard_true(i15, descr=...) - guard_not_invalidated(descr=...) i18 = float_ne(f16, 0.000000) guard_true(i18, descr=...) guard_nonnull_class(p2, ConstClass(W_BoolBox), descr=...) @@ -176,7 +194,7 @@ setfield_gc(p34, i30, descr=) }}} jump(..., descr=...) - """ % (bit,)) + """ % {'align_check': align_check('i5'), 'bit': bit}) def test_reduce_logical_and(self): def main(): @@ -189,8 +207,9 @@ assert len(log.loops) == 1 loop = log._filter(log.loops[0]) loop.match(""" - f31 = raw_load_f(i9, i29, descr=) + %(align_check)s guard_not_invalidated(descr=...) + f31 = raw_load_f(i9, i29, descr=) i32 = float_ne(f31, 0.000000) guard_true(i32, descr=...) i36 = int_add(i24, 1) @@ -198,7 +217,7 @@ i38 = int_ge(i36, i30) guard_false(i38, descr=...) jump(..., descr=...) - """) + """ % {'align_check': align_check('i29')}) # vector version #assert loop.match(""" # guard_not_invalidated(descr=...) @@ -237,6 +256,7 @@ assert loop.match(""" i76 = int_lt(i71, 300) guard_true(i76, descr=...) + guard_not_invalidated(descr=...) i77 = int_ge(i71, i59) guard_false(i77, descr=...) i78 = int_mul(i71, i61) @@ -276,13 +296,13 @@ assert loop.match(""" i81 = int_lt(i76, 300) guard_true(i81, descr=...) + guard_not_invalidated(descr=...) i82 = int_ge(i76, i62) guard_false(i82, descr=...) i83 = int_mul(i76, i64) i84 = int_add(i58, i83) """ + alignment_check + """ f85 = raw_load_f(i70, i84, descr=) - guard_not_invalidated(descr=...) f86 = float_add(f74, f85) i87 = int_add(i76, 1) --TICK-- @@ -305,11 +325,12 @@ assert log.result == 42.0 loop, = log.loops_by_filename(self.filepath) assert loop.match(""" + guard_not_invalidated(descr=...) i86 = int_lt(i79, i45) guard_true(i86, descr=...) - guard_not_invalidated(descr=...) i88 = int_ge(i87, i59) guard_false(i88, descr=...) + %(align_check)s f90 = raw_load_f(i67, i89, descr=) i91 = int_add(i87, 1) i93 = int_add(i89, 8) @@ -320,7 +341,7 @@ i96 = int_lt(i95, 0) guard_false(i96, descr=...) jump(..., descr=...) - """) + """ % {"align_check": align_check('i89')}) def test_array_flatiter_getitem_single(self): def main(): @@ -329,27 +350,20 @@ ai = arr.flat i = 0 while i < arr.size: - a = ai[i] + a = ai[i] # ID: getitem i += 1 return a log = self.run(main, []) assert log.result == 42.0 loop, = log.loops_by_filename(self.filepath) - assert loop.match(""" - i125 = int_lt(i117, i44) - guard_true(i125, descr=...) + assert loop.match_by_id("getitem", """ i126 = int_lt(i117, i50) guard_true(i126, descr=...) i128 = int_mul(i117, i59) i129 = int_add(i55, i128) + %(align_check)s f149 = raw_load_f(i100, i129, descr=) - i151 = int_add(i117, 1) - setfield_gc(p156, i55, descr=) - setarrayitem_gc(p150, 1, 0, descr=) - setarrayitem_gc(p150, 0, 0, descr=) - --TICK-- - jump(..., descr=...) - """) + """ % {'align_check': align_check('i129')}) def test_array_flatiter_setitem_single(self): def main(): @@ -365,13 +379,14 @@ assert log.result == 42.0 loop, = log.loops_by_filename(self.filepath) assert loop.match(""" + guard_not_invalidated(descr=...) i128 = int_lt(i120, i42) guard_true(i128, descr=...) i129 = int_lt(i120, i48) guard_true(i129, descr=...) i131 = int_mul(i120, i57) i132 = int_add(i53, i131) - guard_not_invalidated(descr=...) + %(align_check)s raw_store(i103, i132, 42.000000, descr=) i153 = int_add(i120, 1) i154 = getfield_raw_i(#, descr=) @@ -381,7 +396,7 @@ i157 = int_lt(i154, 0) guard_false(i157, descr=...) jump(..., descr=...) - """) + """ % {'align_check': align_check('i132')}) def test_mixed_div(self): N = 1500 @@ -401,12 +416,13 @@ guard_false(i92, descr=...) i93 = int_add(i91, 1) setfield_gc(p23, i93, descr=) + guard_not_invalidated(descr=...) i94 = int_ge(i91, i56) guard_false(i94, descr=...) i96 = int_mul(i91, i58) i97 = int_add(i51, i96) + %(align_check)s f98 = raw_load_f(i63, i97, descr=) - guard_not_invalidated(descr=...) f100 = float_mul(f98, 0.500000) i101 = int_add(i79, 1) i102 = arraylen_gc(p85, descr=) @@ -422,4 +438,4 @@ i107 = int_lt(i106, 0) guard_false(i107, descr=...) jump(..., descr=...) - """) + """ % {'align_check': align_check('i97')}) diff -Nru pypy-7.1.1+dfsg/pypy/module/pypyjit/test_pypy_c/test_string.py pypy-7.3.1+dfsg/pypy/module/pypyjit/test_pypy_c/test_string.py --- pypy-7.1.1+dfsg/pypy/module/pypyjit/test_pypy_c/test_string.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/pypyjit/test_pypy_c/test_string.py 2020-04-10 19:28:41.000000000 +0000 @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- import sys from pypy.module.pypyjit.test_pypy_c.test_00_model import BaseTestPyPyC @@ -31,9 +32,6 @@ i89 = strgetitem(p55, i83) i24 = int_ge(i83, i12) guard_false(i24, descr=...) - i87 = strgetitem(p13, i83) - i91 = int_le(i87, 127) - guard_true(i91, descr=...) i93 = int_add(i83, 1) i94 = int_gt(i93, i56) guard_false(i94, descr=...) @@ -43,9 +41,9 @@ guard_no_exception(descr=...) i100 = int_lt(i98, 0) guard_true(i100, descr=...) - i102 = call_i(ConstClass(_ll_4_str_eq_slice_char__rpy_stringPtr_Signed_Signed_Char), p55, i83, 1, i89, descr=) + i102 = call_i(ConstClass(_ll_4_str_eq_slice_char__rpy_stringPtr_Signed_Signed_Char), p13, i83, 1, i89, descr=) guard_true(i102, descr=...) - i104 = int_add(i74, 1) + i104 = int_add(i6, 1) --TICK-- jump(..., descr=...) """ % (-sys.maxint-1,)) @@ -224,3 +222,74 @@ --TICK-- jump(..., descr=...) """) + + def test_unicode_indexing_makes_no_bridges(self): + log = self.run(""" + b = b"b'aaaaa\xc3\xa4\xf0\x9f\x91\xa9\xe2\x80\x8d\xf0\x9f\x91\xa9\xe2\x80\x8d\xf0\x9f\x91\xa7\xe2\x80\x8d\xf0\x9f\x91\xa6'" + u = b.decode("utf-8") * 1000 + def main(): + for j in range(10): + for i in range(len(u)): + u[i] # ID: index0 + """, []) + ops = log.loops[0].ops_by_id("index0") + for op in ops: + assert op.bridge is None + + def test_unicode_indexing_small_constant_indices(self): + log = self.run(""" + l = [u"abä", u"cdä", u"äü", u"éé", u"–—¿"] * 1000 + def main(n): + global s + for u in l: + s = u[0] + u[1] + u[-1] # ID: index + len(u) + return len(s) + """, [1000]) + loop, = log.loops_by_filename(self.filepath) + assert loop.match_by_id('index', ''' + i77 = getfield_gc_i(p73, descr=) + p78 = getfield_gc_r(p73, descr=) + i79 = strlen(p78) + i80 = int_eq(i77, i79) + guard_false(i80, descr=...) # check not ascii + i82 = int_ge(0, i77) + guard_false(i82, descr=...) + i85 = call_i(ConstClass(next_codepoint_pos_dont_look_inside), p78, 0, descr=...) + i86 = int_gt(i85, i79) + guard_false(i86, descr=...) + i88 = int_ge(1, i77) + guard_false(i88, descr=...) + i90 = call_i(ConstClass(next_codepoint_pos_dont_look_inside), p78, i85, descr=...) + i91 = int_gt(i90, i79) + guard_false(i91, descr=...) + i92 = int_sub(i90, i85) + i94 = int_add(-1, i77) + i96 = call_i(ConstClass(prev_codepoint_pos_dont_look_inside), p78, i79, descr=...) + i97 = int_sub(i79, i96) + guard_not_invalidated(descr=...) + ''') + + def test_unicode_slicing_small_constant_indices(self): + log = self.run(""" + def main(n): + b = b'ab\xc3\xa4\xf0\x9f\x91\xa9\xe2\x80\x8d\xf0\x9f\x91\xa9\xe2\x80\x8d\xf0\x9f\x91\xa7\xe2\x80\x8d\xf0\x9f\x91\xa6' + u = b.decode("utf-8") * 1000 + global s + count = 0 + while u: + u = u[1:] # ID: index + count += 1 + return count + """, [1000]) + loop, = log.loops_by_filename(self.filepath) + assert loop.match_by_id('index', ''' + i51 = int_eq(1, i38) + guard_false(i51, descr=...) + i52 = strlen(p47) + i53 = int_eq(i38, i52) + guard_false(i53, descr=...) + i56 = call_i(ConstClass(next_codepoint_pos_dont_look_inside), p47, 0, descr=...) + i57 = int_sub(i52, i56) + i59 = int_sub(i38, 1) + ''') diff -Nru pypy-7.1.1+dfsg/pypy/module/_pypyjson/__init__.py pypy-7.3.1+dfsg/pypy/module/_pypyjson/__init__.py --- pypy-7.1.1+dfsg/pypy/module/_pypyjson/__init__.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_pypyjson/__init__.py 2020-04-10 19:28:40.000000000 +0000 @@ -1,12 +0,0 @@ -from pypy.interpreter.mixedmodule import MixedModule - -class Module(MixedModule): - """fast json implementation""" - - appleveldefs = {} - - interpleveldefs = { - 'loads' : 'interp_decoder.loads', - 'raw_encode_basestring_ascii': - 'interp_encoder.raw_encode_basestring_ascii', - } diff -Nru pypy-7.1.1+dfsg/pypy/module/_pypyjson/interp_decoder.py pypy-7.3.1+dfsg/pypy/module/_pypyjson/interp_decoder.py --- pypy-7.1.1+dfsg/pypy/module/_pypyjson/interp_decoder.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_pypyjson/interp_decoder.py 2020-04-10 19:28:40.000000000 +0000 @@ -1,11 +1,13 @@ import sys from rpython.rlib.rstring import StringBuilder -from rpython.rlib.objectmodel import specialize, always_inline, r_dict -from rpython.rlib import rfloat, rutf8 +from rpython.rlib.objectmodel import specialize, always_inline +from rpython.rlib import rfloat, runicode, jit, objectmodel, rutf8 from rpython.rtyper.lltypesystem import lltype, rffi from rpython.rlib.rarithmetic import r_uint from pypy.interpreter.error import oefmt from pypy.interpreter import unicodehelper +from pypy.interpreter.baseobjspace import W_Root +from pypy.module._pypyjson import simd OVF_DIGITS = len(str(sys.maxint)) @@ -15,45 +17,110 @@ # precomputing negative powers of 10 is MUCH faster than using e.g. math.pow # at runtime NEG_POW_10 = [10.0**-i for i in range(16)] +del i + def neg_pow_10(x, exp): if exp >= len(NEG_POW_10): return 0.0 return x * NEG_POW_10[exp] -def slice_eq(a, b): - (ll_chars1, start1, length1, _) = a - (ll_chars2, start2, length2, _) = b - if length1 != length2: - return False - j = start2 - for i in range(start1, start1 + length1): - if ll_chars1[i] != ll_chars2[j]: - return False - j += 1 - return True -def slice_hash(a): - (ll_chars, start, length, h) = a - return h - -TYPE_UNKNOWN = 0 -TYPE_STRING = 1 -class JSONDecoder(object): +class IntCache(object): + """ A cache for wrapped ints between START and END """ + + # I also tried various combinations of having an LRU cache for ints as + # well, didn't really help. + + # XXX one thing to do would be to use withintprebuilt in general again, + # hidden behind a 'we_are_jitted' + + START = -10 + END = 256 + + def __init__(self, space): + self.space = space + self.cache = [self.space.newint(i) + for i in range(self.START, self.END)] + + def newint(self, intval): + if self.START <= intval < self.END: + return self.cache[intval - self.START] + return self.space.newint(intval) + + +class JSONDecoder(W_Root): + + LRU_SIZE = 16 + LRU_MASK = LRU_SIZE - 1 + + DEFAULT_SIZE_SCRATCH = 20 + + # string caching is only used if the total size of the message is larger + # than a megabyte. Below that, there can't be that many repeated big + # strings anyway (some experiments showed this to be a reasonable cutoff + # size) + MIN_SIZE_FOR_STRING_CACHE = 1024 * 1024 + + # evaluate the string cache for 200 strings, before looking at the hit rate + # and deciding whether to keep doing it + STRING_CACHE_EVALUATION_SIZE = 200 + + # keep using the string cache if at least 25% of all decoded strings are a + # hit in the cache + STRING_CACHE_USEFULNESS_FACTOR = 4 + + # don't make arbitrarily huge maps + MAX_MAP_SIZE = 100 + + def __init__(self, space, s): self.space = space + self.w_empty_string = space.newutf8("", 0) + self.s = s + # we put our string in a raw buffer so: # 1) we automatically get the '\0' sentinel at the end of the string, # which means that we never have to check for the "end of string" # 2) we can pass the buffer directly to strtod - self.ll_chars = rffi.str2charp(s) + self.ll_chars, self.llobj, self.flag = rffi.get_nonmovingbuffer_ll_final_null(self.s) self.end_ptr = lltype.malloc(rffi.CCHARPP.TO, 1, flavor='raw') self.pos = 0 - self.cache = r_dict(slice_eq, slice_hash, simple_hash_eq=True) + self.intcache = space.fromcache(IntCache) + + # two caches, one for keys, one for general strings. they both have the + # form {hash-as-int: StringCacheEntry} and they don't deal with + # collisions at all. For every hash there is simply one string stored + # and we ignore collisions. + self.cache_keys = {} + self.cache_values = {} + + # we don't cache *all* non-key strings, that would be too expensive. + # instead, keep a cache of the last 16 strings hashes around and add a + # string to the cache only if its hash is seen a second time + self.lru_cache = [0] * self.LRU_SIZE + self.lru_index = 0 + + self.startmap = self.space.fromcache(Terminator) + + # keep a list of objects that are created with maps that aren't clearly + # useful. If they turn out to be useful in the end we are good, + # otherwise convert them to dicts (see .close()) + self.unclear_objects = [] + + # this is a freelist of lists that store the decoded value of an + # object, before they get copied into the eventual dict + self.scratch = [[None] * self.DEFAULT_SIZE_SCRATCH] + def close(self): - rffi.free_charp(self.ll_chars) + rffi.free_nonmovingbuffer_ll(self.ll_chars, self.llobj, self.flag) lltype.free(self.end_ptr, flavor='raw') + # clean up objects that are instances of now blocked maps + for w_obj in self.unclear_objects: + jsonmap = self._get_jsonmap_from_dict(w_obj) + if jsonmap.is_state_blocked(): + self._devolve_jsonmap_dict(w_obj) def getslice(self, start, end): assert start >= 0 @@ -61,23 +128,22 @@ return self.s[start:end] def skip_whitespace(self, i): + ll_chars = self.ll_chars while True: - ch = self.ll_chars[i] + ch = ll_chars[i] if is_whitespace(ch): - i+=1 + i += 1 else: break return i - @specialize.arg(1) - def _raise(self, msg, *args): - raise oefmt(self.space.w_ValueError, msg, *args) - - def decode_any(self, i): + def decode_any(self, i, contextmap=None): + """ Decode an object at position i. Optionally pass a contextmap, if + the value is decoded as the value of a dict. """ i = self.skip_whitespace(i) ch = self.ll_chars[i] if ch == '"': - return self.decode_string(i+1) + return self.decode_string(i+1, contextmap) elif ch == '[': return self.decode_array(i+1) elif ch == '{': @@ -102,6 +168,11 @@ self._raise("No JSON object could be decoded: unexpected '%s' at char %d", ch, i) + + @specialize.arg(1) + def _raise(self, msg, *args): + raise oefmt(self.space.w_ValueError, msg, *args) + def decode_null(self, i): if (self.ll_chars[i] == 'u' and self.ll_chars[i+1] == 'l' and @@ -162,7 +233,7 @@ return self.decode_int_slow(start) self.pos = i - return self.space.newint(intval) + return self.intcache.newint(intval) def decode_float(self, i): from rpython.rlib import rdtoa @@ -214,7 +285,22 @@ ovf_maybe = (count >= OVF_DIGITS) return i, ovf_maybe, sign * intval + def _raise_control_char_in_string(self, ch, startindex, currindex): + if ch == '\0': + self._raise("Unterminated string starting at char %d", + startindex - 1) + else: + self._raise("Invalid control character at char %d", currindex-1) + + def _raise_object_error(self, ch, start, i): + if ch == '\0': + self._raise("Unterminated object starting at char %d", start) + else: + self._raise("Unexpected '%s' when decoding object (char %d)", + ch, i) + def decode_array(self, i): + """ Decode a list. i must be after the opening '[' """ w_list = self.space.newlist([]) start = i i = self.skip_whitespace(start) @@ -248,62 +334,123 @@ self.pos = i+1 return self.space.newdict() - d = self._create_empty_dict() + if self.scratch: + values_w = self.scratch.pop() + else: + values_w = [None] * self.DEFAULT_SIZE_SCRATCH + nextindex = 0 + currmap = self.startmap while True: # parse a key: value - w_name = self.decode_key(i) + newmap = self.decode_key_map(i, currmap) + if newmap is None: + # We've seen a repeated value, switch to dict-based storage. + dict_w = self._switch_to_dict(currmap, values_w, nextindex) + # We re-parse the last key, to get the correct overwriting + # effect. Pointless to care for performance here. + return self.decode_object_dict(i, start, dict_w) + currmap = newmap i = self.skip_whitespace(self.pos) ch = self.ll_chars[i] if ch != ':': self._raise("No ':' found at char %d", i) i += 1 - i = self.skip_whitespace(i) - # - w_value = self.decode_any(i) - d[w_name] = w_value + + w_value = self.decode_any(i, currmap) + + if nextindex == len(values_w): # full + values_w = values_w + [None] * len(values_w) # double + values_w[nextindex] = w_value + nextindex += 1 i = self.skip_whitespace(self.pos) ch = self.ll_chars[i] i += 1 if ch == '}': self.pos = i - return self._create_dict(d) + self.scratch.append(values_w) # can reuse next time + if currmap.is_state_blocked(): + dict_w = self._switch_to_dict(currmap, values_w, nextindex) + return self._create_dict(dict_w) + values_w = values_w[:nextindex] + w_res = self._create_dict_map(values_w, currmap) + if not currmap.is_state_useful(): + self.unclear_objects.append(w_res) + return w_res elif ch == ',': - pass - elif ch == '\0': - self._raise("Unterminated object starting at char %d", start) + i = self.skip_whitespace(i) + if currmap.is_state_blocked() or nextindex > self.MAX_MAP_SIZE: + self.scratch.append(values_w) # can reuse next time + dict_w = self._switch_to_dict(currmap, values_w, nextindex) + return self.decode_object_dict(i, start, dict_w) else: - self._raise("Unexpected '%s' when decoding object (char %d)", - ch, i-1) + self._raise_object_error(ch, start, i - 1) - def decode_string(self, i): - start = i - bits = 0 + def _create_dict_map(self, values_w, jsonmap): + from pypy.objspace.std.jsondict import from_values_and_jsonmap + return from_values_and_jsonmap(self.space, values_w, jsonmap) + + def _devolve_jsonmap_dict(self, w_dict): + from pypy.objspace.std.jsondict import devolve_jsonmap_dict + devolve_jsonmap_dict(w_dict) + + def _get_jsonmap_from_dict(self, w_dict): + from pypy.objspace.std.jsondict import get_jsonmap_from_dict + return get_jsonmap_from_dict(w_dict) + + def _switch_to_dict(self, currmap, values_w, nextindex): + dict_w = self._create_empty_dict() + currmap.fill_dict(dict_w, values_w) + assert len(dict_w) == nextindex + return dict_w + + def decode_object_dict(self, i, start, dict_w): while True: - # this loop is a fast path for strings which do not contain escape - # characters + # parse a key: value + w_key = self.decode_key_string(i) + i = self.skip_whitespace(self.pos) ch = self.ll_chars[i] + if ch != ':': + self._raise("No ':' found at char %d", i) i += 1 - bits |= ord(ch) - if ch == '"': + + w_value = self.decode_any(i) + dict_w[w_key] = w_value + i = self.skip_whitespace(self.pos) + ch = self.ll_chars[i] + i += 1 + if ch == '}': self.pos = i - return self._create_string(start, i - 1, bits) - elif ch == '\\' or ch < '\x20': - self.pos = i-1 - return self.decode_string_escaped(start) - - def _create_string(self, start, end, bits): - if bits & 0x80: - # the 8th bit is set, it's an utf8 string - content_utf8 = self.getslice(start, end) + return self._create_dict(dict_w) + elif ch == ',': + i = self.skip_whitespace(i) + else: + self._raise_object_error(ch, start, i - 1) + + def decode_string_uncached(self, i): + start = i + ll_chars = self.ll_chars + nonascii, i = simd.find_end_of_string_no_hash(ll_chars, i, len(self.s)) + ch = ll_chars[i] + if ch == '\\': + self.pos = i + return self.decode_string_escaped(start, nonascii) + if ch < '\x20': + self._raise_control_char_in_string(ch, start, i) + else: + assert ch == '"' + + self.pos = i + 1 + return self._create_string_wrapped(start, i, nonascii) + + def _create_string_wrapped(self, start, end, nonascii): + content = self.getslice(start, end) + if nonascii: + # contains non-ascii chars, we need to check that it's valid utf-8 lgt = unicodehelper.check_utf8_or_raise(self.space, - content_utf8) - return self.space.newutf8(content_utf8, lgt) + content) else: - # ascii only, fast path (ascii is a strict subset of - # latin1, and we already checked that all the chars are < - # 128) - return self.space.newutf8(self.getslice(start, end), - end - start) + lgt = end - start + return self.space.newutf8(content, lgt) def _create_dict(self, d): from pypy.objspace.std.dictmultiobject import from_unicode_key_dict @@ -313,8 +460,7 @@ from pypy.objspace.std.dictmultiobject import create_empty_unicode_key_dict return create_empty_unicode_key_dict(self.space) - - def decode_string_escaped(self, start): + def decode_string_escaped(self, start, nonascii): i = self.pos builder = StringBuilder((i - start) * 2) # just an estimate assert start >= 0 @@ -325,25 +471,21 @@ i += 1 if ch == '"': content_utf8 = builder.build() - lgt = unicodehelper.check_utf8_or_raise(self.space, + length = unicodehelper.check_utf8_or_raise(self.space, content_utf8) self.pos = i - return self.space.newutf8(content_utf8, lgt) + return self.space.newutf8(content_utf8, length) elif ch == '\\': - i = self.decode_escape_sequence(i, builder) + i = self.decode_escape_sequence_to_utf8(i, builder) elif ch < '\x20': - if ch == '\0': - self._raise("Unterminated string starting at char %d", - start - 1) - else: - self._raise("Invalid control character at char %d", i-1) + self._raise_control_char_in_string(ch, start, i) else: builder.append(ch) - def decode_escape_sequence(self, i, builder): + def decode_escape_sequence_to_utf8(self, i, stringbuilder): ch = self.ll_chars[i] i += 1 - put = builder.append + put = stringbuilder.append if ch == '\\': put('\\') elif ch == '"': put('"' ) elif ch == '/': put('/' ) @@ -353,22 +495,41 @@ elif ch == 'r': put('\r') elif ch == 't': put('\t') elif ch == 'u': - return self.decode_escape_sequence_unicode(i, builder) + # may be a surrogate pair + return self.decode_escape_sequence_unicode(i, stringbuilder) else: self._raise("Invalid \\escape: %s (char %d)", ch, i-1) return i + def _get_int_val_from_hex4(self, i): + ll_chars = self.ll_chars + res = 0 + for i in range(i, i + 4): + ch = ord(ll_chars[i]) + if ord('a') <= ch <= ord('f'): + digit = ch - ord('a') + 10 + elif ord('A') <= ch <= ord('F'): + digit = ch - ord('A') + 10 + elif ord('0') <= ch <= ord('9'): + digit = ch - ord('0') + else: + raise ValueError + res = (res << 4) + digit + return res + def decode_escape_sequence_unicode(self, i, builder): # at this point we are just after the 'u' of the \u1234 sequence. start = i i += 4 - hexdigits = self.getslice(start, i) try: - val = int(hexdigits, 16) - if sys.maxunicode > 65535 and 0xd800 <= val <= 0xdfff: - # surrogate pair - if self.ll_chars[i] == '\\' and self.ll_chars[i+1] == 'u': - val = self.decode_surrogate_pair(i, val) + val = self._get_int_val_from_hex4(start) + if (0xd800 <= val <= 0xdbff and + self.ll_chars[i] == '\\' and self.ll_chars[i+1] == 'u'): + lowsurr = self._get_int_val_from_hex4(i + 2) + if 0xdc00 <= lowsurr <= 0xdfff: + # decode surrogate pair + val = 0x10000 + (((val - 0xd800) << 10) | + (lowsurr - 0xdc00)) i += 6 except ValueError: self._raise("Invalid \uXXXX escape (char %d)", i-1) @@ -379,57 +540,640 @@ builder.append(utf8_ch) return i - def decode_surrogate_pair(self, i, highsurr): - """ uppon enter the following must hold: - chars[i] == "\\" and chars[i+1] == "u" - """ - i += 2 - hexdigits = self.getslice(i, i+4) - lowsurr = int(hexdigits, 16) # the possible ValueError is caugth by the caller - return 0x10000 + (((highsurr - 0xd800) << 10) | (lowsurr - 0xdc00)) - - def decode_key(self, i): - """ returns a wrapped unicode """ - from rpython.rlib.rarithmetic import intmask - i = self.skip_whitespace(i) + def decode_string(self, i, contextmap=None): + """ Decode a string at position i (which is right after the opening "). + Optionally pass a contextmap, if the value is decoded as the value of a + dict.""" + + ll_chars = self.ll_chars + start = i + ch = ll_chars[i] + if ch == '"': + self.pos = i + 1 + return self.w_empty_string # surprisingly common + + cache = True + if contextmap is not None: + # keep some statistics about the usefulness of the string cache on + # the contextmap + # the intuition about the contextmap is as follows: + # often there are string values stored in dictionaries that can + # never be usefully cached, like unique ids of objects. Then the + # strings *in those fields* of all objects should never be cached. + # However, the content of other fields can still be useful to + # cache. + contextmap.decoded_strings += 1 + if not contextmap.should_cache_strings(): + cache = False + if len(self.s) < self.MIN_SIZE_FOR_STRING_CACHE: + cache = False + + if not cache: + return self.decode_string_uncached(i) + + strhash, nonascii, i = simd.find_end_of_string(ll_chars, i, len(self.s)) + ch = ll_chars[i] + if ch == '\\': + self.pos = i + return self.decode_string_escaped(start, nonascii) + if ch < '\x20': + self._raise_control_char_in_string(ch, start, i) + else: + assert ch == '"' + + self.pos = i + 1 + + length = i - start + strhash ^= length + + # check cache first: + try: + entry = self.cache_values[strhash] + except KeyError: + w_res = self._create_string_wrapped(start, i, nonascii) + # only add *some* strings to the cache, because keeping them all is + # way too expensive. first we check if the contextmap has caching + # disabled completely. if not, we check whether we have recently + # seen the same hash already, if yes, we cache the string. + if ((contextmap is not None and + contextmap.decoded_strings < self.STRING_CACHE_EVALUATION_SIZE) or + strhash in self.lru_cache): + entry = StringCacheEntry( + self.getslice(start, start + length), w_res) + self.cache_values[strhash] = entry + else: + self.lru_cache[self.lru_index] = strhash + self.lru_index = (self.lru_index + 1) & self.LRU_MASK + return w_res + if not entry.compare(ll_chars, start, length): + # collision! hopefully rare + return self._create_string_wrapped(start, i, nonascii) + if contextmap is not None: + contextmap.cache_hits += 1 + return entry.w_uni + + def decode_key_map(self, i, currmap): + """ Given the current map currmap of an object, decode the next key at + position i. This returns the new map of the object. """ + newmap = self._decode_key_map(i, currmap) + if newmap is None: + return None + currmap.observe_transition(newmap, self.startmap) + return newmap + + def _decode_key_map(self, i, currmap): ll_chars = self.ll_chars + # first try to see whether we happen to find currmap.nextmap_first + nextmap = currmap.fast_path_key_parse(self, i) + if nextmap is not None: + return nextmap + + start = i ch = ll_chars[i] if ch != '"': self._raise("Key name must be string at char %d", i) i += 1 + w_key = self._decode_key_string(i) + return currmap.get_next(w_key, self.s, start, self.pos, self.startmap) + def _decode_key_string(self, i): + """ decode key at position i as a string. Key strings are always + cached, since they repeat a lot. """ + ll_chars = self.ll_chars start = i - bits = 0 - strhash = ord(ll_chars[i]) << 7 - while True: - ch = ll_chars[i] - i += 1 - if ch == '"': - break - elif ch == '\\' or ch < '\x20': - self.pos = i-1 - return self.decode_string_escaped(start) - strhash = intmask((1000003 * strhash) ^ ord(ll_chars[i])) - bits |= ord(ch) - length = i - start - 1 - if length == 0: - strhash = -1 - else: - strhash ^= length - strhash = intmask(strhash) - self.pos = i + + strhash, nonascii, i = simd.find_end_of_string(ll_chars, i, len(self.s)) + + ch = ll_chars[i] + if ch == '\\': + self.pos = i + w_key = self.decode_string_escaped(start, nonascii) + return w_key + if ch < '\x20': + self._raise_control_char_in_string(ch, start, i) + length = i - start + strhash ^= length + self.pos = i + 1 # check cache first: - key = (ll_chars, start, length, strhash) try: - return self.cache[key] + entry = self.cache_keys[strhash] except KeyError: - pass - res = self._create_string(start, i - 1, bits) - self.cache[key] = res - return res + w_res = self._create_string_wrapped(start, i, nonascii) + entry = StringCacheEntry( + self.getslice(start, start + length), w_res) + self.cache_keys[strhash] = entry + return w_res + if not entry.compare(ll_chars, start, length): + # collision! hopefully rare + w_res = self._create_string_wrapped(start, i, nonascii) + else: + w_res = entry.w_uni + return w_res + + def decode_key_string(self, i): + ll_chars = self.ll_chars + ch = ll_chars[i] + if ch != '"': + self._raise("Key name must be string at char %d", i) + i += 1 + return self._decode_key_string(i) + + +class StringCacheEntry(object): + """ A cache entry, bundling the encoded version of a string as it appears + in the input string, and its wrapped decoded variant. """ + def __init__(self, repr, w_uni): + # repr is the escaped string + self.repr = repr + # uni is the wrapped decoded string + self.w_uni = w_uni + + def compare(self, ll_chars, start, length): + """ Check whether self.repr occurs at ll_chars[start:start+length] """ + if length != len(self.repr): + return False + index = start + for c in self.repr: + if not ll_chars[index] == c: + return False + index += 1 + return True + + +class MapBase(object): + """ A map implementation to speed up parsing of json dicts, and to + represent the resulting dicts more compactly and make access faster. """ + + # the basic problem we are trying to solve is the following: dicts in + # json can either be used as objects, or as dictionaries with arbitrary + # string keys. We want to use maps for the former, but not for the + # latter. But we don't know in advance which kind of dict is which. + + # Therefore we create "preliminary" maps where we aren't quite sure yet + # whether they are really useful maps or not. If we see them used often + # enough, we promote them to "useful" maps, which we will actually + # instantiate objects with. + + # If we determine that a map is not used often enough, we can turn it + # into a "blocked" map, which is a point in the map tree where we will + # switch to regular dicts, when we reach that part of the tree. + + # One added complication: We want to keep the number of preliminary maps + # bounded to prevent generating tons of useless maps. but also not too + # small, to support having a json file that contains many uniform objects + # with tons of keys. That's where the idea of "fringe" maps comes into + # play. They are maps that sit between known useful nodes and preliminary + # nodes in the map transition tree. We bound only the number of fringe + # nodes we are considering (to MAX_FRINGE), but not the number of + # preliminary maps. When we have too many fringe maps, we remove the least + # commonly instantiated fringe map and mark it as blocked. + + # allowed graph edges or nodes in nextmap_all: + # USEFUL ------- + # / \ \ + # v v v + # FRINGE USEFUL BLOCKED + # | + # v + # PRELIMINARY + # | + # v + # PRELIMINARY + + # state transitions: + # PRELIMINARY + # / | \ + # | v v + # | FRINGE -> USEFUL + # | | + # \ | + # v v + # BLOCKED + + # the nextmap_first edge can only be these graph edges: + # USEFUL + # | + # v + # USEFUL + # + # FRINGE + # | + # v + # PRELIMINARY + # | + # v + # PRELIMINARY + + USEFUL = 'u' + PRELIMINARY = 'p' + FRINGE = 'f' # buffer between PRELIMINARY and USEFUL + BLOCKED = 'b' + + # tunable parameters + MAX_FRINGE = 40 + USEFUL_THRESHOLD = 5 + + def __init__(self, space): + self.space = space + + # a single transition is stored in .nextmap_first + self.nextmap_first = None + # nextmap_all is only initialized after seeing the *second* transition + # but then it also contains .nextmap_first + self.nextmap_all = None # later dict {key: nextmap} + + # keep some statistics about every map: how often it was instantiated + # and how many non-blocked leaves the map transition tree has, starting + # from self + self.instantiation_count = 0 + self.number_of_leaves = 1 + + def _check_invariants(self): + if self.nextmap_all: + for next in self.nextmap_all.itervalues(): + next._check_invariants() + elif self.nextmap_first: + self.nextmap_first._check_invariants() + + def get_next(self, w_key, string, start, stop, terminator): + """ Returns the next map, given a wrapped key w_key, the json input + string with positions start and stop, as well as a terminator. + Returns None if the key already appears somewhere in the map chain. + """ + from pypy.objspace.std.dictmultiobject import unicode_hash, unicode_eq + if isinstance(self, JSONMap): + assert not self.state == MapBase.BLOCKED + nextmap_first = self.nextmap_first + if (nextmap_first is not None and + nextmap_first.w_key.eq_w(w_key)): + return nextmap_first + + assert stop >= 0 + assert start >= 0 + + if nextmap_first is None: + # first transition ever seen, don't initialize nextmap_all + next = self._make_next_map(w_key, string[start:stop]) + if next is None: + return None + self.nextmap_first = next + else: + if self.nextmap_all is None: + # 2nd transition ever seen + self.nextmap_all = objectmodel.r_dict(unicode_eq, unicode_hash, + force_non_null=True, simple_hash_eq=True) + self.nextmap_all[nextmap_first.w_key] = nextmap_first + else: + next = self.nextmap_all.get(w_key, None) + if next is not None: + return next + # if we are at this point we didn't find the transition yet, so + # create a new one + next = self._make_next_map(w_key, string[start:stop]) + if next is None: + return None + self.nextmap_all[w_key] = next + + # one new leaf has been created + self.change_number_of_leaves(1) + + terminator.register_potential_fringe(next) + return next + + def change_number_of_leaves(self, difference): + """ add difference to .number_of_leaves of self and its parents """ + if not difference: + return + parent = self + while isinstance(parent, JSONMap): + parent.number_of_leaves += difference + parent = parent.prev + parent.number_of_leaves += difference # terminator + + def fast_path_key_parse(self, decoder, position): + """ Fast path when parsing the next key: We speculate that we will + always see a commonly seen next key, and use strcmp (implemented in + key_repr_cmp) to check whether that is the case. """ + nextmap_first = self.nextmap_first + if nextmap_first: + ll_chars = decoder.ll_chars + assert isinstance(nextmap_first, JSONMap) + if nextmap_first.key_repr_cmp(ll_chars, position): + decoder.pos = position + len(nextmap_first.key_repr) + return nextmap_first + return None + + def observe_transition(self, newmap, terminator): + """ observe a transition from self to newmap. + This does a few things, including updating the self size estimate with + the knowledge that one object transitioned from self to newmap. + also it potentially decides that self should move to state USEFUL.""" + newmap.instantiation_count += 1 + if isinstance(self, JSONMap) and self.state == MapBase.FRINGE: + if self.is_useful(): + self.mark_useful(terminator) + + def _make_next_map(self, w_key, key_repr): + # Check whether w_key is already part of the self.prev chain + # to prevent strangeness in the json dict implementation. + # This is slow, but it should be rare to call this function. + check = self + while isinstance(check, JSONMap): + if check.w_key._utf8 == w_key._utf8: + return None + check = check.prev + return JSONMap(self.space, self, w_key, key_repr) + + def fill_dict(self, dict_w, values_w): + """ recursively fill the dictionary dict_w in the correct order, + reading from values_w.""" + raise NotImplementedError("abstract base") + + def _all_dot(self, output): + identity = objectmodel.compute_unique_id(self) + output.append('%s [shape=box%s];' % (identity, self._get_dot_text())) + if self.nextmap_all: + for w_key, value in self.nextmap_all.items(): + assert isinstance(value, JSONMap) + if value is self.nextmap_first: + color = ", color=blue" + else: + color = "" + output.append('%s -> %s [label="%s"%s];' % ( + identity, objectmodel.compute_unique_id(value), value.w_key._utf8, color)) + value._all_dot(output) + elif self.nextmap_first is not None: + value = self.nextmap_first + output.append('%s -> %s [label="%s", color=blue];' % ( + identity, objectmodel.compute_unique_id(value), value.w_key._utf8)) + value._all_dot(output) + + + def _get_dot_text(self): + return ", label=base" + + def view(self): + from dotviewer import graphclient + import pytest + r = ["digraph G {"] + self._all_dot(r) + r.append("}") + p = pytest.ensuretemp("jsonmap").join("temp.dot") + p.write("\n".join(r)) + graphclient.display_dot_file(str(p)) + + +class Terminator(MapBase): + """ The root node of the map transition tree. """ + def __init__(self, space): + MapBase.__init__(self, space) + # a set of all map nodes that are currently in the FRINGE state + self.current_fringe = {} + + def register_potential_fringe(self, prelim): + """ add prelim to the fringe, if its prev is either a Terminator or + useful. """ + prev = prelim.prev + if (isinstance(prev, Terminator) or + isinstance(prev, JSONMap) and prev.state == MapBase.USEFUL): + assert prelim.state == MapBase.PRELIMINARY + prelim.state = MapBase.FRINGE + + if len(self.current_fringe) > MapBase.MAX_FRINGE: + self.cleanup_fringe() + self.current_fringe[prelim] = None + + def remove_from_fringe(self, former_fringe): + """ Remove former_fringe from self.current_fringe. """ + assert former_fringe.state in (MapBase.USEFUL, MapBase.BLOCKED) + del self.current_fringe[former_fringe] + + def cleanup_fringe(self): + """ remove the least-instantiated fringe map and block it.""" + min_fringe = None + min_avg = 1e200 + for f in self.current_fringe: + assert f.state == MapBase.FRINGE + avg = f.average_instantiation() + if avg < min_avg: + min_avg = avg + min_fringe = f + assert min_fringe + min_fringe.mark_blocked(self) + + def fill_dict(self, dict_w, values_w): + """ recursively fill the dictionary dict_w in the correct order, + reading from values_w.""" + return 0 + + def _check_invariants(self): + for fringe in self.current_fringe: + assert fringe.state == MapBase.FRINGE + +class JSONMap(MapBase): + """ A map implementation to speed up parsing """ + + def __init__(self, space, prev, w_key, key_repr): + MapBase.__init__(self, space) + + self.prev = prev + self.w_key = w_key + self.key_repr = key_repr + + self.state = MapBase.PRELIMINARY + + # key decoding stats + self.decoded_strings = 0 + self.cache_hits = 0 + + # for jsondict support + self.key_to_index = None + self.keys_in_order = None + self.strategy_instance = None + + def __repr__(self): + return "" % ( + self.key_repr, self.instantiation_count, self.number_of_leaves, self.prev) + + def _get_terminator(self): # only for _check_invariants + while isinstance(self, JSONMap): + self = self.prev + assert isinstance(self, Terminator) + return self + + def _check_invariants(self): + assert self.state in ( + MapBase.USEFUL, + MapBase.PRELIMINARY, + MapBase.FRINGE, + MapBase.BLOCKED, + ) + + prev = self.prev + if isinstance(prev, JSONMap): + prevstate = prev.state + else: + prevstate = MapBase.USEFUL + + if prevstate == MapBase.USEFUL: + assert self.state != MapBase.PRELIMINARY + elif prevstate == MapBase.PRELIMINARY: + assert self.state == MapBase.PRELIMINARY + elif prevstate == MapBase.FRINGE: + assert self.state == MapBase.PRELIMINARY + else: + # if prevstate is BLOCKED, we shouldn't have recursed here! + assert False, "should be unreachable" + + if self.state == MapBase.BLOCKED: + assert self.nextmap_first is None + assert self.nextmap_all is None + elif self.state == MapBase.FRINGE: + assert self in self._get_terminator().current_fringe + + MapBase._check_invariants(self) + + def mark_useful(self, terminator): + """ mark self as useful, and also the most commonly instantiated + children, recursively """ + was_fringe = self.state == MapBase.FRINGE + assert self.state in (MapBase.FRINGE, MapBase.PRELIMINARY) + self.state = MapBase.USEFUL + if was_fringe: + terminator.remove_from_fringe(self) + # find the most commonly instantiated child, store it into + # nextmap_first and mark it useful, recursively + maxchild = self.nextmap_first + if self.nextmap_all is not None: + for child in self.nextmap_all.itervalues(): + if child.instantiation_count > maxchild.instantiation_count: + maxchild = child + if maxchild is not None: + maxchild.mark_useful(terminator) + if self.nextmap_all: + for child in self.nextmap_all.itervalues(): + if child is not maxchild: + terminator.register_potential_fringe(child) + self.nextmap_first = maxchild + + def mark_blocked(self, terminator): + """ mark self and recursively all its children as blocked.""" + was_fringe = self.state == MapBase.FRINGE + self.state = MapBase.BLOCKED + if was_fringe: + terminator.remove_from_fringe(self) + if self.nextmap_all: + for next in self.nextmap_all.itervalues(): + next.mark_blocked(terminator) + elif self.nextmap_first: + self.nextmap_first.mark_blocked(terminator) + self.nextmap_first = None + self.nextmap_all = None + self.change_number_of_leaves(-self.number_of_leaves + 1) + + def is_state_blocked(self): + return self.state == MapBase.BLOCKED + + def is_state_useful(self): + return self.state == MapBase.USEFUL + + def average_instantiation(self): + """ the number of instantiations, divided by the number of leaves. We + want to favor nodes that have either a high instantiation count, or few + leaves below it. """ + return self.instantiation_count / float(self.number_of_leaves) + + def is_useful(self): + return self.average_instantiation() > self.USEFUL_THRESHOLD + + def should_cache_strings(self): + """ return whether strings parsed in the context of this map should be + cached. """ + # we should cache if either we've seen few strings so far (less than + # STRING_CACHE_EVALUATION_SIZE), or if we've seen many, and the cache + # hit rate has been high enough + return not (self.decoded_strings > JSONDecoder.STRING_CACHE_EVALUATION_SIZE and + self.cache_hits * JSONDecoder.STRING_CACHE_USEFULNESS_FACTOR < self.decoded_strings) + + def key_repr_cmp(self, ll_chars, i): + # XXX should we use "real" memcmp (here in particular, and in other + # places in RPython in general)? + for j, c in enumerate(self.key_repr): + if ll_chars[i] != c: + return False + i += 1 + return True + + def fill_dict(self, dict_w, values_w): + index = self.prev.fill_dict(dict_w, values_w) + dict_w[self.w_key] = values_w[index] + return index + 1 + + # _____________________________________________________ + # methods for JsonDictStrategy + + @jit.elidable + def get_index(self, w_key): + from pypy.objspace.std.unicodeobject import W_UnicodeObject + assert isinstance(w_key, W_UnicodeObject) + return self.get_key_to_index().get(w_key, -1) + + def get_key_to_index(self): + from pypy.objspace.std.dictmultiobject import unicode_hash, unicode_eq + key_to_index = self.key_to_index + if key_to_index is None: + key_to_index = self.key_to_index = objectmodel.r_dict(unicode_eq, unicode_hash, + force_non_null=True, simple_hash_eq=True) + # compute depth + curr = self + depth = 0 + while True: + depth += 1 + curr = curr.prev + if not isinstance(curr, JSONMap): + break + + curr = self + while depth: + depth -= 1 + key_to_index[curr.w_key] = depth + curr = curr.prev + if not isinstance(curr, JSONMap): + break + return key_to_index + + def get_keys_in_order(self): + keys_in_order = self.keys_in_order + if keys_in_order is None: + key_to_index = self.get_key_to_index() + keys_in_order = self.keys_in_order = [None] * len(key_to_index) + for w_key, index in key_to_index.iteritems(): + keys_in_order[index] = w_key + return keys_in_order + + # _____________________________________________________ + + def _get_dot_text(self): + if self.nextmap_all is None: + l = int(self.nextmap_first is not None) + else: + l = len(self.nextmap_all) + extra = "" + if self.decoded_strings: + extra = "\\n%s/%s (%s%%)" % (self.cache_hits, self.decoded_strings, self.cache_hits/float(self.decoded_strings)) + res = ', label="#%s\\nchildren: %s%s"' % (self.instantiation_count, l, extra) + if self.state == MapBase.BLOCKED: + res += ", fillcolor=lightsalmon" + if self.state == MapBase.FRINGE: + res += ", fillcolor=lightgray" + if self.state == MapBase.PRELIMINARY: + res += ", fillcolor=lightslategray" + return res + +@jit.dont_look_inside def loads(space, w_s): if space.isinstance_w(w_s, space.w_unicode): raise oefmt(space.w_TypeError, @@ -447,3 +1191,4 @@ return w_res finally: decoder.close() + diff -Nru pypy-7.1.1+dfsg/pypy/module/_pypyjson/moduledef.py pypy-7.3.1+dfsg/pypy/module/_pypyjson/moduledef.py --- pypy-7.1.1+dfsg/pypy/module/_pypyjson/moduledef.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_pypyjson/moduledef.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,12 @@ +from pypy.interpreter.mixedmodule import MixedModule + +class Module(MixedModule): + """fast json implementation""" + + appleveldefs = {} + + interpleveldefs = { + 'loads' : 'interp_decoder.loads', + 'raw_encode_basestring_ascii': + 'interp_encoder.raw_encode_basestring_ascii', + } diff -Nru pypy-7.1.1+dfsg/pypy/module/_pypyjson/simd.py pypy-7.3.1+dfsg/pypy/module/_pypyjson/simd.py --- pypy-7.1.1+dfsg/pypy/module/_pypyjson/simd.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_pypyjson/simd.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,228 @@ +from rpython.rtyper.lltypesystem import lltype, rffi +from rpython.rlib import objectmodel, unroll +from rpython.rlib.rarithmetic import r_uint, intmask, LONG_BIT +from rpython.jit.backend.detect_cpu import autodetect, ProcessorAutodetectError + +# accelerators for string operations using simd on regular word sizes (*not* +# SSE instructions). this style is sometimes called SWAR (SIMD Within A +# Register) or "broadword techniques" + +# XXX remove wordsize and endianness restrictions properly, so far only x86-64 +# is tested + +USE_SIMD = False +if LONG_BIT == 64: + WORD_SIZE = 8 + EVERY_BYTE_ONE = 0x0101010101010101 + EVERY_BYTE_HIGHEST_BIT = 0x8080808080808080 + try: + if autodetect() == "x86-64": + USE_SIMD = True + except ProcessorAutodetectError: + pass +else: + WORD_SIZE = 4 + EVERY_BYTE_ONE = 0x01010101 + EVERY_BYTE_HIGHEST_BIT = 0x80808080 + + +# helpers + +unrolling_wordsize = unroll.unrolling_iterable(range(WORD_SIZE)) + +def char_repeated_word_width(ch): + return r_uint(EVERY_BYTE_ONE) * ord(ch) + +def any_char_zero(word): + return (word - r_uint(EVERY_BYTE_ONE)) & ~word & r_uint(EVERY_BYTE_HIGHEST_BIT) + +def any_char_in_words_zero(*words): + return _any_char_in_any_word_zero_accum(0, *words) + +def _any_char_in_any_word_zero_accum(accum, word, *words): + accum |= (word - r_uint(EVERY_BYTE_ONE)) & ~word + if not words: + return accum & r_uint(EVERY_BYTE_HIGHEST_BIT) + return _any_char_in_any_word_zero_accum(accum, *words) + +def print_chars(word): + # for debugging + out = '' + for i in range(WORD_SIZE): + out += chr(word & 0xff) + word >>= 8 + return out + +def index_nonzero(word): + # XXX can be done very cheap in theory + assert word + for i in unrolling_wordsize: + if word & 0xff: + return i + word >>= 8 + assert 0 + +def index_zero(word): + # XXX can be done very cheap in theory + assert any_char_zero(word) + for i in unrolling_wordsize: + if not word & 0xff: + return i + word >>= 8 + assert 0 # XXX ??? + +def set_high_bytes_to_zero(word, keep_bytes): + mask = ((~r_uint(0)) << (8 * keep_bytes)) + return word & ~mask + + + +@objectmodel.always_inline +def position_string_ender(word): + maskquote = char_repeated_word_width('"') + maskbackslash = char_repeated_word_width('\\') + maskx20 = char_repeated_word_width(chr(0xff - 0x1f)) + # x1 and x2 check for equality, if a byte is 0 the corresponding + # char is equal to " or \ + x1 = maskquote ^ word + x2 = maskbackslash ^ word + # x3 checks for char < 0x20, the byte is 0 in that case + x3 = maskx20 & word + return any_char_in_words_zero(x1, x2, x3) + +@objectmodel.always_inline +def find_end_of_string_simd_unaligned(ll_chars, startpos, length): + ch = ll_chars[startpos] + strhash = (ord(ch) << 7) ^ 0x345678 + + wordarray = rffi.cast(rffi.ULONGP, rffi.ptradd(ll_chars, startpos)) + num_safe_reads = (length - startpos) // WORD_SIZE + + bits = 0 + for i in range(num_safe_reads): + word = wordarray[i] + cond = position_string_ender(word) + if cond: + break + bits |= word + strhash = intmask((1000003 * strhash) ^ intmask(word)) + else: + # didn't find end of string yet, look at remaining chars + word = 0 + shift = 0 + i = startpos + num_safe_reads * WORD_SIZE + while True: # this loop should run at most WORD_SIZE times, + # if we assume that ll_chars[length] == '\x00' + ch = ll_chars[i] + if ch == '"' or ch == '\\' or ch < '\x20': + break + i += 1 + bits |= ord(ch) + word |= ord(ch) << shift + shift += 8 + if shift: + strhash = intmask((1000003 * strhash) ^ intmask(word)) + + nonascii = bool(bits & char_repeated_word_width(chr(0x80))) + return strhash, nonascii, i + + # compute endposition + nonzero = index_nonzero(cond) + endposition = startpos + i * WORD_SIZE + nonzero + if nonzero: + word = set_high_bytes_to_zero(word, nonzero) + bits |= word + strhash = intmask((1000003 * strhash) ^ intmask(word)) + + nonascii = bool(bits & char_repeated_word_width(chr(0x80))) + + return strhash, nonascii, endposition + +@objectmodel.always_inline +def find_end_of_string_simd_unaligned_no_hash(ll_chars, startpos, length): + ch = ll_chars[startpos] + + wordarray = rffi.cast(rffi.ULONGP, rffi.ptradd(ll_chars, startpos)) + num_safe_reads = (length - startpos) // WORD_SIZE + + bits = 0 + for i in range(num_safe_reads): + word = wordarray[i] + cond = position_string_ender(word) + if cond: + break + bits |= word + else: + # didn't find end of string yet, look at remaining chars + i = startpos + num_safe_reads * WORD_SIZE + while True: # this loop should run at most WORD_SIZE times, + # if we assume that ll_chars[length] == '\x00' + ch = ll_chars[i] + if ch == '"' or ch == '\\' or ch < '\x20': + break + i += 1 + bits |= ord(ch) + + nonascii = bool(bits & char_repeated_word_width(chr(0x80))) + return nonascii, i + + # compute endposition + nonzero = index_nonzero(cond) + endposition = startpos + i * WORD_SIZE + nonzero + if nonzero: + word = set_high_bytes_to_zero(word, nonzero) + bits |= word + + nonascii = bool(bits & char_repeated_word_width(chr(0x80))) + + return nonascii, endposition + + +@objectmodel.always_inline +def find_end_of_string_slow(ll_chars, i, length): + ch = ll_chars[i] + strhash = (ord(ch) << 7) ^ 0x345678 + word = 0 + shift = 0 + + bits = 0 + + while True: + # this loop is a fast path for strings which do not contain escape + # characters + ch = ll_chars[i] + if ch == '"' or ch == '\\' or ch < '\x20': + break + i += 1 + bits |= ord(ch) + + word |= ord(ch) << shift + shift += 8 + if shift == WORD_SIZE * 8: + strhash = intmask((1000003 * strhash) ^ word) + shift = 0 + word = 0 + + if shift: + strhash = intmask((1000003 * strhash) ^ word) + return strhash, bool(bits & 0x80), i + +@objectmodel.always_inline +def find_end_of_string_slow_no_hash(ll_chars, i, length): + bits = 0 + while True: + # this loop is a fast path for strings which do not contain escape + # characters + ch = ll_chars[i] + if ch == '"' or ch == '\\' or ch < '\x20': + break + i += 1 + bits |= ord(ch) + return bool(bits & 0x80), i + +if USE_SIMD: + find_end_of_string = find_end_of_string_simd_unaligned + find_end_of_string_no_hash = find_end_of_string_simd_unaligned_no_hash +else: + find_end_of_string = find_end_of_string_slow + find_end_of_string_no_hash = find_end_of_string_slow_no_hash diff -Nru pypy-7.1.1+dfsg/pypy/module/_pypyjson/test/test__pypyjson.py pypy-7.3.1+dfsg/pypy/module/_pypyjson/test/test__pypyjson.py --- pypy-7.1.1+dfsg/pypy/module/_pypyjson/test/test__pypyjson.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_pypyjson/test/test__pypyjson.py 2020-04-10 19:28:40.000000000 +0000 @@ -1,31 +1,277 @@ # -*- encoding: utf-8 -*- -from pypy.module._pypyjson.interp_decoder import JSONDecoder +import pytest +from pypy.module._pypyjson.interp_decoder import JSONDecoder, Terminator, MapBase +from rpython.rtyper.lltypesystem import lltype, rffi + + +class TestJson(object): + def test_skip_whitespace(self): + s = ' hello ' + dec = JSONDecoder(self.space, s) + assert dec.pos == 0 + assert dec.skip_whitespace(0) == 3 + assert dec.skip_whitespace(3) == 3 + assert dec.skip_whitespace(8) == len(s) + dec.close() + + def test_json_map(self): + m = Terminator(self.space) + w_a = self.space.newutf8("a", 1) + w_b = self.space.newutf8("b", 1) + w_c = self.space.newutf8("c", 1) + m1 = m.get_next(w_a, '"a"', 0, 3, m) + assert m1.w_key == w_a + assert m1.nextmap_first is None + assert m1.key_repr == '"a"' + assert m1.key_repr_cmp('"a": 123', 0) + assert not m1.key_repr_cmp('b": 123', 0) + assert m.nextmap_first.w_key == w_a + + m2 = m.get_next(w_a, '"a"', 0, 3, m) + assert m2 is m1 + + m3 = m.get_next(w_b, '"b"', 0, 3, m) + assert m3.w_key == w_b + assert m3.nextmap_first is None + assert m3.key_repr == '"b"' + assert m.nextmap_first is m1 + + m4 = m3.get_next(w_c, '"c"', 0, 3, m) + assert m4.w_key == w_c + assert m4.nextmap_first is None + assert m4.key_repr == '"c"' + assert m3.nextmap_first is m4 + + def test_json_map_get_index(self): + m = Terminator(self.space) + w_a = self.space.newutf8("a", 1) + w_b = self.space.newutf8("b", 1) + w_c = self.space.newutf8("c", 1) + m1 = m.get_next(w_a, 'a"', 0, 2, m) + assert m1.get_index(w_a) == 0 + assert m1.get_index(w_b) == -1 + + m2 = m.get_next(w_b, 'b"', 0, 2, m) + assert m2.get_index(w_b) == 0 + assert m2.get_index(w_a) == -1 + + m3 = m2.get_next(w_c, 'c"', 0, 2, m) + assert m3.get_index(w_b) == 0 + assert m3.get_index(w_c) == 1 + assert m3.get_index(w_a) == -1 + + def test_jsonmap_fill_dict(self): + from collections import OrderedDict + m = Terminator(self.space) + space = self.space + w_a = space.newutf8("a", 1) + w_b = space.newutf8("b", 1) + w_c = space.newutf8("c", 1) + m1 = m.get_next(w_a, 'a"', 0, 2, m) + m2 = m1.get_next(w_b, 'b"', 0, 2, m) + m3 = m2.get_next(w_c, 'c"', 0, 2, m) + d = OrderedDict() + m3.fill_dict(d, [space.w_None, space.w_None, space.w_None]) + assert list(d) == [w_a, w_b, w_c] + + def test_repeated_key_get_next(self): + m = Terminator(self.space) + w_a = self.space.newutf8("a", 1) + w_b = self.space.newutf8("b", 1) + w_c = self.space.newutf8("c", 1) + m1 = m.get_next(w_a, '"a"', 0, 3, m) + m1 = m1.get_next(w_b, '"b"', 0, 3, m) + m1 = m1.get_next(w_c, '"c"', 0, 3, m) + m2 = m1.get_next(w_a, '"a"', 0, 3, m) + assert m2 is None + + + def test_decode_key_map(self): + m = Terminator(self.space) + m_diff = Terminator(self.space) + for s1 in ["abc", "1001" * 10, u"ä".encode("utf-8")]: + s = ' "%s" "%s" "%s"' % (s1, s1, s1) + dec = JSONDecoder(self.space, s) + assert dec.pos == 0 + m1 = dec.decode_key_map(dec.skip_whitespace(0), m) + assert m1.w_key._utf8 == s1 + assert m1.key_repr == '"%s"' % s1 + + # check caching on w_key level + m2 = dec.decode_key_map(dec.skip_whitespace(dec.pos), m_diff) + assert m1.w_key is m2.w_key + + # check caching on map level + m3 = dec.decode_key_map(dec.skip_whitespace(dec.pos), m_diff) + assert m3 is m2 + dec.close() + + def test_decode_string_caching(self): + for s1 in ["abc", u"ä".encode("utf-8")]: + s = '"%s" "%s" "%s"' % (s1, s1, s1) + dec = JSONDecoder(self.space, s) + dec.MIN_SIZE_FOR_STRING_CACHE = 0 + assert dec.pos == 0 + w_x = dec.decode_string(1) + w_y = dec.decode_string(dec.skip_whitespace(dec.pos) + 1) + assert w_x is not w_y + # check caching + w_z = dec.decode_string(dec.skip_whitespace(dec.pos) + 1) + assert w_z is w_y + dec.close() + + def _make_some_maps(self): + # base -> m1 -> m2 -> m3 + # \-> m4 + w_a = self.space.newutf8("a", 1) + w_b = self.space.newutf8("b", 1) + w_c = self.space.newutf8("c", 1) + w_d = self.space.newutf8("d", 1) + base = Terminator(self.space) + base.instantiation_count = 6 + m1 = base.get_next(w_a, 'a"', 0, 2, base) + m2 = m1.get_next(w_b, 'b"', 0, 2, base) + m3 = m2.get_next(w_c, 'c"', 0, 2, base) + m4 = m2.get_next(w_d, 'd"', 0, 2, base) + return base, m1, m2, m3, m4 + + # unit tests for map state transistions + def test_fringe_to_useful(self): + base, m1, m2, m3, m4 = self._make_some_maps() + base.instantiation_count = 6 + assert m1.state == MapBase.FRINGE + m1.instantiation_count = 6 + + assert m2.state == MapBase.PRELIMINARY + m2.instantiation_count = 6 + + assert m3.state == MapBase.PRELIMINARY + m3.instantiation_count = 2 + assert m2.nextmap_first is m3 + + assert m4.state == MapBase.PRELIMINARY + m4.instantiation_count = 4 + + m1.mark_useful(base) + assert m1.state == MapBase.USEFUL + assert m2.state == MapBase.USEFUL + assert m3.state == MapBase.FRINGE + assert m4.state == MapBase.USEFUL + assert m2.nextmap_first is m4 + + assert m1.number_of_leaves == 2 + base._check_invariants() + + def test_number_of_leaves(self): + w_x = self.space.newutf8("x", 1) + base, m1, m2, m3, m4 = self._make_some_maps() + assert base.number_of_leaves == 2 + assert m1.number_of_leaves == 2 + assert m2.number_of_leaves == 2 + assert m3.number_of_leaves == 1 + assert m4.number_of_leaves == 1 + m5 = m2.get_next(w_x, 'x"', 0, 2, base) + assert base.number_of_leaves == 3 + assert m1.number_of_leaves == 3 + assert m2.number_of_leaves == 3 + assert m5.number_of_leaves == 1 + + def test_number_of_leaves_after_mark_blocked(self): + w_x = self.space.newutf8("x", 1) + base, m1, m2, m3, m4 = self._make_some_maps() + m5 = m2.get_next(w_x, 'x"', 0, 2, base) + assert base.number_of_leaves == 3 + m2.mark_blocked(base) + assert base.number_of_leaves == 1 + + def test_mark_useful_cleans_fringe(self): + base, m1, m2, m3, m4 = self._make_some_maps() + base.instantiation_count = 6 + assert m1.state == MapBase.FRINGE + m1.instantiation_count = 6 + m2.instantiation_count = 6 + m3.instantiation_count = 2 + m4.instantiation_count = 4 + assert base.current_fringe == {m1: None} + + m1.mark_useful(base) + assert base.current_fringe == {m3: None} + + def test_cleanup_fringe(self): + w_a = self.space.newutf8("a", 1) + w_b = self.space.newutf8("b", 1) + w_c = self.space.newutf8("c", 1) + w_d = self.space.newutf8("d", 1) + base = Terminator(self.space) + base.instantiation_count = 6 + m1 = base.get_next(w_a, 'a"', 0, 2, base) + m2 = base.get_next(w_b, 'b"', 0, 2, base) + m3 = base.get_next(w_c, 'c"', 0, 2, base) + m4 = base.get_next(w_d, 'd"', 0, 2, base) + m5 = m4.get_next(w_a, 'a"', 0, 2, base) + base.instantiation_count = 7 + m1.instantiation_count = 2 + m2.instantiation_count = 2 + m3.instantiation_count = 2 + m4.instantiation_count = 1 + m5.instantiation_count = 1 + assert base.current_fringe == dict.fromkeys([m1, m2, m3, m4]) + + base.cleanup_fringe() + assert base.current_fringe == dict.fromkeys([m1, m2, m3]) + assert m4.state == MapBase.BLOCKED + assert m4.nextmap_first is None + assert m4.nextmap_all is None + assert m5.state == MapBase.BLOCKED + assert m5.nextmap_first is None + assert m5.nextmap_all is None + + def test_deal_with_blocked(self): + w_a = self.space.newutf8("a", 1) + w_b = self.space.newutf8("b", 1) + w_c = self.space.newutf8("c", 1) + space = self.space + s = '{"a": 1, "b": 2, "c": 3}' + dec = JSONDecoder(space, s) + dec.startmap = base = Terminator(space) + m1 = base.get_next(w_a, 'a"', 0, 2, base) + m2 = m1.get_next(w_b, 'b"', 0, 2, base) + m2.mark_blocked(base) + w_res = dec.decode_object(1) + assert space.int_w(space.len(w_res)) == 3 + assert space.int_w(space.getitem(w_res, w_a)) == 1 + assert space.int_w(space.getitem(w_res, w_b)) == 2 + assert space.int_w(space.getitem(w_res, w_c)) == 3 + dec.close() + + def test_deal_with_blocked_number_of_leaves(self): + w_a = self.space.newutf8("a", 1) + w_b = self.space.newutf8("b", 1) + w_x = self.space.newutf8("x", 1) + w_u = self.space.newutf8("u", 1) + space = self.space + base = Terminator(space) + m1 = base.get_next(w_a, 'a"', 0, 2, base) + m2 = m1.get_next(w_b, 'b"', 0, 2, base) + m2.get_next(w_x, 'x"', 0, 2, base) + m2.get_next(w_u, 'u"', 0, 2, base) + assert base.number_of_leaves == 2 + m2.mark_blocked(base) + assert base.number_of_leaves == 1 + + def test_instatiation_count(self): + m = Terminator(self.space) + dec = JSONDecoder(self.space, '"abc" "def"') + m1 = dec.decode_key_map(dec.skip_whitespace(0), m) + m2 = dec.decode_key_map(dec.skip_whitespace(6), m1) + m1 = dec.decode_key_map(dec.skip_whitespace(0), m) + m2 = dec.decode_key_map(dec.skip_whitespace(6), m1) + m1 = dec.decode_key_map(dec.skip_whitespace(0), m) + + assert m1.instantiation_count == 3 + assert m2.instantiation_count == 2 + dec.close() -def test_skip_whitespace(): - s = ' hello ' - dec = JSONDecoder('fake space', s) - assert dec.pos == 0 - assert dec.skip_whitespace(0) == 3 - assert dec.skip_whitespace(3) == 3 - assert dec.skip_whitespace(8) == len(s) - dec.close() - -class FakeSpace(object): - def newutf8(self, s, l): - return s - -def test_decode_key(): - s1 = "123" * 100 - s = ' "%s" "%s" ' % (s1, s1) - dec = JSONDecoder(FakeSpace(), s) - assert dec.pos == 0 - x = dec.decode_key(0) - assert x == s1 - # check caching - y = dec.decode_key(dec.pos) - assert y == s1 - assert y is x - dec.close() class AppTest(object): spaceconfig = {"objspace.usemodules._pypyjson": True} @@ -55,7 +301,7 @@ raises(ValueError, _pypyjson.loads, 'fa') raises(ValueError, _pypyjson.loads, 'f') raises(ValueError, _pypyjson.loads, 'falXX') - + def test_decode_string(self): import _pypyjson @@ -85,7 +331,7 @@ import _pypyjson assert _pypyjson.loads(r'"\\"') == u'\\' assert _pypyjson.loads(r'"\""') == u'"' - assert _pypyjson.loads(r'"\/"') == u'/' + assert _pypyjson.loads(r'"\/"') == u'/' assert _pypyjson.loads(r'"\b"') == u'\b' assert _pypyjson.loads(r'"\f"') == u'\f' assert _pypyjson.loads(r'"\n"') == u'\n' @@ -101,12 +347,19 @@ import _pypyjson s = r'"hello\nworld' # missing the trailing " raises(ValueError, "_pypyjson.loads(s)") - + def test_escape_sequence_unicode(self): import _pypyjson s = r'"\u1234"' assert _pypyjson.loads(s) == u'\u1234' + def test_escape_sequence_mixed_with_utf8(self): + import _pypyjson + utf8 = u'ä"'.encode("utf-8") + assert _pypyjson.loads(r'"abc\\' + utf8) == u'abc\\ä' + assert _pypyjson.loads(r'"abc\"' + utf8) == u'abc"ä' + assert _pypyjson.loads(r'"def\u1234' + utf8) == u'def\u1234ä' + def test_invalid_utf_8(self): import _pypyjson s = '"\xe0"' # this is an invalid UTF8 sequence inside a string @@ -176,13 +429,18 @@ s = '{"hello": "world", "aaa": "bbb"}' assert _pypyjson.loads(s) == {'hello': 'world', 'aaa': 'bbb'} + assert _pypyjson.loads(s) == {'hello': 'world', + 'aaa': 'bbb'} raises(ValueError, _pypyjson.loads, '{"key"') raises(ValueError, _pypyjson.loads, '{"key": 42') + assert _pypyjson.loads('{"neighborhood": ""}') == { + "neighborhood": ""} + def test_decode_object_nonstring_key(self): import _pypyjson raises(ValueError, "_pypyjson.loads('{42: 43}')") - + def test_decode_array(self): import _pypyjson assert _pypyjson.loads('[]') == [] @@ -199,7 +457,18 @@ res = _pypyjson.loads('"z\\ud834\\udd20x"') assert res == expected - def test_surrogate_pair(self): + def test_unicode_not_a_surrogate_pair(self): + import _pypyjson + res = _pypyjson.loads('"z\\ud800\\ud800x"') + assert list(res) == [u'z', u'\ud800', u'\ud800', u'x'] + res = _pypyjson.loads('"z\\udbff\\uffffx"') + assert list(res) == [u'z', u'\udbff', u'\uffff', u'x'] + res = _pypyjson.loads('"z\\ud800\\ud834\\udd20x"') + assert res == u'z\ud800\U0001d120x' + res = _pypyjson.loads('"z\\udc00\\udc00x"') + assert list(res) == [u'z', u'\udc00', u'\udc00', u'x'] + + def test_lone_surrogate(self): import _pypyjson json = '{"a":"\\uD83D"}' res = _pypyjson.loads(json) @@ -211,6 +480,14 @@ res = _pypyjson.loads(json) assert res == [{u'a': 1}, {u'a': 2}] + def test_huge_map(self): + import _pypyjson + import __pypy__ + s = '{' + ",".join('"%s": %s' % (i, i) for i in range(200)) + '}' + res = _pypyjson.loads(s) + assert len(res) == 200 + assert __pypy__.strategy(res) == "UnicodeDictStrategy" + def test_tab_in_string_should_fail(self): import _pypyjson # http://json.org/JSON_checker/test/fail25.json @@ -252,3 +529,12 @@ for inputtext, errmsg in test_cases: exc = raises(ValueError, _pypyjson.loads, inputtext) assert str(exc.value) == errmsg + + def test_repeated_key(self): + import _pypyjson + a = '{"abc": "4", "k": 1, "k": 2}' + d = _pypyjson.loads(a) + assert d == {u"abc": u"4", u"k": 2} + a = '{"abc": "4", "k": 1, "k": 1.5, "c": null, "k": 2}' + d = _pypyjson.loads(a) + assert d == {u"abc": u"4", u"c": None, u"k": 2} diff -Nru pypy-7.1.1+dfsg/pypy/module/_pypyjson/test/test_simd.py pypy-7.3.1+dfsg/pypy/module/_pypyjson/test/test_simd.py --- pypy-7.1.1+dfsg/pypy/module/_pypyjson/test/test_simd.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_pypyjson/test/test_simd.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,110 @@ +import sys +import pytest +from rpython.rtyper.lltypesystem import lltype, rffi +from rpython.rlib.rarithmetic import r_uint, intmask + +from pypy.module._pypyjson.simd import USE_SIMD +from pypy.module._pypyjson.simd import find_end_of_string_slow +from pypy.module._pypyjson.simd import find_end_of_string_slow_no_hash +from pypy.module._pypyjson.simd import print_chars +from pypy.module._pypyjson.simd import find_end_of_string_simd_unaligned, WORD_SIZE +from pypy.module._pypyjson.simd import find_end_of_string_simd_unaligned_no_hash + +try: + from hypothesis import example, given, strategies +except ImportError: + pytest.skip("missing hypothesis!") + +if not USE_SIMD: + pytest.skip("only implemented for 64 bit for now") + +def fill_to_word_size(res, ch=" "): + if len(res) % WORD_SIZE != 0: + res += ch * (WORD_SIZE - (len(res) % WORD_SIZE)) + return res + +def string_to_word(s): + assert len(s) == WORD_SIZE + ll_chars, llobj, flag = rffi.get_nonmovingbuffer_ll_final_null(s) + try: + wordarray = rffi.cast(rffi.ULONGP, ll_chars) + return wordarray[0] + finally: + rffi.free_nonmovingbuffer_ll(ll_chars, llobj, flag) + +def ll(callable, string, *args): + ll_chars, llobj, flag = rffi.get_nonmovingbuffer_ll_final_null(string) + try: + return callable(ll_chars, *args) + finally: + rffi.free_nonmovingbuffer_ll(ll_chars, llobj, flag) + +word = strategies.builds( + r_uint, strategies.integers(min_value=-sys.maxint-1, max_value=sys.maxint)) + +def build_string(prefix, content, end, suffix): + res = prefix + '"' + "".join([chr(x) for x in content]) + end + suffix + return fill_to_word_size(res), len(prefix) + 1 + +string_in_context_strategy = strategies.builds( + build_string, prefix=strategies.binary(), + content=strategies.lists(strategies.integers(1, 255), min_size=1), + end=strategies.sampled_from('"\\\x00\x01'), + suffix=strategies.binary()) + +def compare(string, res1, res2): + hash1, nonascii1, endindex1 = res1 + hash2, nonascii2, endindex2 = res2 + assert endindex1 == endindex2 + if string[endindex1 - 1] == '"': + assert hash1 == hash2 + assert nonascii1 == nonascii2 + + +@example(('" \x80" ', 1)) +@example(('"\x01" ', 1)) +@example(('"aaaaaaaa"\x00\x00\x00\x00\x00\x00\x00 ', 1)) +@example(('"aaaaaaaa" ', 1)) +@example(('"12"', 1)) +@example(('"1234567abcdefghAB"', 1)) +@example(('"1234567abcdefgh"', 1)) +@example((' "123456ABCDEF" \x00', 2)) +@example((' "123456aaaaaaaaABCDEF"\x00', 2)) +@given(string_in_context_strategy) +def test_find_end_of_string(a): + (string, startindex) = a + res = ll(find_end_of_string_slow, string, startindex, len(string)) + hash, nonascii1, endposition1 = res + res2 = ll(find_end_of_string_slow_no_hash, string, startindex, len(string)) + assert res2 == (nonascii1, endposition1) + ch = string[endposition1] + assert ch == '"' or ch == '\\' or ch < '\x20' + for ch in string[startindex:endposition1]: + assert not (ch == '"' or ch == '\\' or ch < '\x20') + compare(string, res, ll(find_end_of_string_simd_unaligned, string, startindex, len(string))) + + nonascii2, endposition2 = ll(find_end_of_string_simd_unaligned_no_hash, string, startindex, len(string)) + assert nonascii1 == nonascii2 + assert endposition1 == endposition2 + +@given(string_in_context_strategy, strategies.binary(min_size=1)) +def test_find_end_of_string_position_invariance(a, prefix): + fn = find_end_of_string_simd_unaligned + (string, startindex) = a + h1, nonascii1, i1 = ll(fn, string, startindex, len(string)) + string2 = prefix + string + h2, nonascii2, i2 = ll(fn, string2, startindex + len(prefix), len(string) + len(prefix)) + assert h1 == h2 + assert nonascii1 == nonascii2 + assert i1 + len(prefix) == i2 + +@given(string_in_context_strategy, strategies.binary(min_size=1)) +def test_find_end_of_string_position_invariance_no_hash(a, prefix): + fn = find_end_of_string_simd_unaligned_no_hash + (string, startindex) = a + nonascii1, i1 = ll(fn, string, startindex, len(string)) + string2 = prefix + string + nonascii2, i2 = ll(fn, string2, startindex + len(prefix), len(string) + len(prefix)) + assert nonascii1 == nonascii2 + assert i1 + len(prefix) == i2 + diff -Nru pypy-7.1.1+dfsg/pypy/module/_random/__init__.py pypy-7.3.1+dfsg/pypy/module/_random/__init__.py --- pypy-7.1.1+dfsg/pypy/module/_random/__init__.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_random/__init__.py 2020-04-10 19:28:40.000000000 +0000 @@ -1,8 +0,0 @@ -from pypy.interpreter.mixedmodule import MixedModule - -class Module(MixedModule): - appleveldefs = {} - - interpleveldefs = { - 'Random' : 'interp_random.W_Random', - } diff -Nru pypy-7.1.1+dfsg/pypy/module/_random/moduledef.py pypy-7.3.1+dfsg/pypy/module/_random/moduledef.py --- pypy-7.1.1+dfsg/pypy/module/_random/moduledef.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_random/moduledef.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,8 @@ +from pypy.interpreter.mixedmodule import MixedModule + +class Module(MixedModule): + appleveldefs = {} + + interpleveldefs = { + 'Random' : 'interp_random.W_Random', + } diff -Nru pypy-7.1.1+dfsg/pypy/module/_rawffi/alt/__init__.py pypy-7.3.1+dfsg/pypy/module/_rawffi/alt/__init__.py --- pypy-7.1.1+dfsg/pypy/module/_rawffi/alt/__init__.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_rawffi/alt/__init__.py 2020-04-10 19:28:40.000000000 +0000 @@ -1,18 +0,0 @@ -from pypy.interpreter.mixedmodule import MixedModule -import os - -class Module(MixedModule): - - interpleveldefs = { - 'types': 'interp_ffitype.W_types', - 'CDLL': 'interp_funcptr.W_CDLL', - 'FuncPtr': 'interp_funcptr.W_FuncPtr', - 'get_libc':'interp_funcptr.get_libc', - '_StructDescr': 'interp_struct.W__StructDescr', - 'Field': 'interp_struct.W_Field', - } - if os.name == 'nt': - interpleveldefs['WinDLL'] = 'interp_funcptr.W_WinDLL' - appleveldefs = { - 'Structure': 'app_struct.Structure', - } diff -Nru pypy-7.1.1+dfsg/pypy/module/_rawffi/alt/moduledef.py pypy-7.3.1+dfsg/pypy/module/_rawffi/alt/moduledef.py --- pypy-7.1.1+dfsg/pypy/module/_rawffi/alt/moduledef.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_rawffi/alt/moduledef.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,18 @@ +from pypy.interpreter.mixedmodule import MixedModule +import os + +class Module(MixedModule): + + interpleveldefs = { + 'types': 'interp_ffitype.W_types', + 'CDLL': 'interp_funcptr.W_CDLL', + 'FuncPtr': 'interp_funcptr.W_FuncPtr', + 'get_libc':'interp_funcptr.get_libc', + '_StructDescr': 'interp_struct.W__StructDescr', + 'Field': 'interp_struct.W_Field', + } + if os.name == 'nt': + interpleveldefs['WinDLL'] = 'interp_funcptr.W_WinDLL' + appleveldefs = { + 'Structure': 'app_struct.Structure', + } diff -Nru pypy-7.1.1+dfsg/pypy/module/_rawffi/__init__.py pypy-7.3.1+dfsg/pypy/module/_rawffi/__init__.py --- pypy-7.1.1+dfsg/pypy/module/_rawffi/__init__.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_rawffi/__init__.py 2020-04-10 19:28:40.000000000 +0000 @@ -1,58 +0,0 @@ -""" Low-level interface to clibffi -""" - -from pypy.interpreter.mixedmodule import MixedModule -from pypy.module._rawffi import alt - -class Module(MixedModule): - interpleveldefs = { - 'CDLL' : 'interp_rawffi.W_CDLL', - 'FuncPtr' : 'interp_rawffi.W_FuncPtr', - 'Structure' : 'structure.W_Structure', - 'StructureInstance' : 'structure.W_StructureInstance', - 'StructureInstanceAutoFree' : 'structure.W_StructureInstanceAutoFree', - 'Array' : 'array.W_Array', - 'ArrayInstance' : 'array.W_ArrayInstance', - 'ArrayInstanceAutoFree' : 'array.W_ArrayInstanceAutoFree', - 'sizeof' : 'interp_rawffi.sizeof', - 'alignment' : 'interp_rawffi.alignment', - 'charp2string' : 'interp_rawffi.charp2string', - 'wcharp2unicode' : 'interp_rawffi.wcharp2unicode', - 'charp2rawstring' : 'interp_rawffi.charp2rawstring', - 'wcharp2rawunicode' : 'interp_rawffi.wcharp2rawunicode', - 'rawstring2charp' : 'interp_rawffi.rawstring2charp', - 'CallbackPtr' : 'callback.W_CallbackPtr', - '_num_of_allocated_objects' : 'tracker.num_of_allocated_objects', - 'get_libc' : 'interp_rawffi.get_libc', - 'get_errno' : 'interp_rawffi.get_errno', - 'set_errno' : 'interp_rawffi.set_errno', - 'get_last_error' : 'interp_rawffi.get_last_error', - 'set_last_error' : 'interp_rawffi.set_last_error', - 'SegfaultException' : 'space.new_exception_class("_rawffi.SegfaultException")', - 'exit' : 'interp_exit.exit', - } - - appleveldefs = { - } - - submodules = { - 'alt': alt.Module, - } - - def buildloaders(cls): - from pypy.module._rawffi import interp_rawffi - - if hasattr(interp_rawffi, 'FormatError'): - Module.interpleveldefs['FormatError'] = 'interp_rawffi.FormatError' - if hasattr(interp_rawffi, 'check_HRESULT'): - Module.interpleveldefs['check_HRESULT'] = 'interp_rawffi.check_HRESULT' - - from rpython.rlib import clibffi - for name in ['FUNCFLAG_STDCALL', 'FUNCFLAG_CDECL', 'FUNCFLAG_PYTHONAPI', - 'FUNCFLAG_USE_ERRNO', 'FUNCFLAG_USE_LASTERROR', - ]: - if hasattr(clibffi, name): - Module.interpleveldefs[name] = "space.wrap(%r)" % getattr(clibffi, name) - - super(Module, cls).buildloaders() - buildloaders = classmethod(buildloaders) diff -Nru pypy-7.1.1+dfsg/pypy/module/_rawffi/interp_rawffi.py pypy-7.3.1+dfsg/pypy/module/_rawffi/interp_rawffi.py --- pypy-7.1.1+dfsg/pypy/module/_rawffi/interp_rawffi.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_rawffi/interp_rawffi.py 2020-04-10 19:28:40.000000000 +0000 @@ -239,7 +239,11 @@ except OSError as e: raise wrap_oserror(space, e) -@unwrap_spec(name='fsencode_or_none') +if _MS_WINDOWS: + name_spec = 'fsencode' +else: + name_spec = 'fsencode_or_none' +@unwrap_spec(name=name_spec) def descr_new_cdll(space, w_type, name): cdll = open_cdll(space, name) return W_CDLL(space, name, cdll) @@ -450,8 +454,13 @@ elif c == 'c': return space.newbytes(func(add_arg, argdesc, ll_type)) elif c == 'u': - return space.newutf8(rutf8.unichr_as_utf8( - ord(func(add_arg, argdesc, ll_type))), 1) + code = ord(func(add_arg, argdesc, ll_type)) + try: + return space.newutf8(rutf8.unichr_as_utf8( + r_uint(code), allow_surrogates=True), 1) + except rutf8.OutOfRange: + raise oefmt(space.w_ValueError, + "unicode character %d out of range", code) elif c == 'f' or c == 'd' or c == 'g': return space.newfloat(float(func(add_arg, argdesc, ll_type))) else: diff -Nru pypy-7.1.1+dfsg/pypy/module/_rawffi/moduledef.py pypy-7.3.1+dfsg/pypy/module/_rawffi/moduledef.py --- pypy-7.1.1+dfsg/pypy/module/_rawffi/moduledef.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_rawffi/moduledef.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,58 @@ +""" Low-level interface to clibffi +""" + +from pypy.interpreter.mixedmodule import MixedModule +from pypy.module._rawffi.alt.moduledef import Module as AltModule + +class Module(MixedModule): + interpleveldefs = { + 'CDLL' : 'interp_rawffi.W_CDLL', + 'FuncPtr' : 'interp_rawffi.W_FuncPtr', + 'Structure' : 'structure.W_Structure', + 'StructureInstance' : 'structure.W_StructureInstance', + 'StructureInstanceAutoFree' : 'structure.W_StructureInstanceAutoFree', + 'Array' : 'array.W_Array', + 'ArrayInstance' : 'array.W_ArrayInstance', + 'ArrayInstanceAutoFree' : 'array.W_ArrayInstanceAutoFree', + 'sizeof' : 'interp_rawffi.sizeof', + 'alignment' : 'interp_rawffi.alignment', + 'charp2string' : 'interp_rawffi.charp2string', + 'wcharp2unicode' : 'interp_rawffi.wcharp2unicode', + 'charp2rawstring' : 'interp_rawffi.charp2rawstring', + 'wcharp2rawunicode' : 'interp_rawffi.wcharp2rawunicode', + 'rawstring2charp' : 'interp_rawffi.rawstring2charp', + 'CallbackPtr' : 'callback.W_CallbackPtr', + '_num_of_allocated_objects' : 'tracker.num_of_allocated_objects', + 'get_libc' : 'interp_rawffi.get_libc', + 'get_errno' : 'interp_rawffi.get_errno', + 'set_errno' : 'interp_rawffi.set_errno', + 'get_last_error' : 'interp_rawffi.get_last_error', + 'set_last_error' : 'interp_rawffi.set_last_error', + 'SegfaultException' : 'space.new_exception_class("_rawffi.SegfaultException")', + 'exit' : 'interp_exit.exit', + } + + appleveldefs = { + } + + submodules = { + 'alt': AltModule, + } + + def buildloaders(cls): + from pypy.module._rawffi import interp_rawffi + + if hasattr(interp_rawffi, 'FormatError'): + Module.interpleveldefs['FormatError'] = 'interp_rawffi.FormatError' + if hasattr(interp_rawffi, 'check_HRESULT'): + Module.interpleveldefs['check_HRESULT'] = 'interp_rawffi.check_HRESULT' + + from rpython.rlib import clibffi + for name in ['FUNCFLAG_STDCALL', 'FUNCFLAG_CDECL', 'FUNCFLAG_PYTHONAPI', + 'FUNCFLAG_USE_ERRNO', 'FUNCFLAG_USE_LASTERROR', + ]: + if hasattr(clibffi, name): + Module.interpleveldefs[name] = "space.wrap(%r)" % getattr(clibffi, name) + + super(Module, cls).buildloaders() + buildloaders = classmethod(buildloaders) diff -Nru pypy-7.1.1+dfsg/pypy/module/_rawffi/test/test__rawffi.py pypy-7.3.1+dfsg/pypy/module/_rawffi/test/test__rawffi.py --- pypy-7.1.1+dfsg/pypy/module/_rawffi/test/test__rawffi.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_rawffi/test/test__rawffi.py 2020-04-10 19:28:40.000000000 +0000 @@ -262,14 +262,17 @@ raise AssertionError("did not fail??") def test_libload_None(self): - if self.iswin32: - skip("unix specific") import _rawffi # this should return *all* loaded libs, dlopen(NULL) - dll = _rawffi.CDLL(None) - func = dll.ptr('rand', [], 'i') - res = func() - assert res[0] != 0 + try: + dll = _rawffi.CDLL(None) + except TypeError: + if not self.iswin32: + raise + else: + func = dll.ptr('rand', [], 'i') + res = func() + assert res[0] != 0 def test_libc_load(self): import _rawffi @@ -347,6 +350,21 @@ arg2.free() a.free() + def test_unicode_array(self): + import _rawffi + A = _rawffi.Array('u') + a = A(6, u'\u1234') + assert a[0] == u'\u1234' + a[0] = u'\U00012345' + assert a[0] == u'\U00012345' + a[0] = u'\ud800' + assert a[0] == u'\ud800' + B = _rawffi.Array('i') + b = B.fromaddress(a.itemaddress(0), 1) + b[0] = 0xffffffff + raises(ValueError, "a[0]") + a.free() + def test_returning_unicode(self): import _rawffi A = _rawffi.Array('u') diff -Nru pypy-7.1.1+dfsg/pypy/module/select/__init__.py pypy-7.3.1+dfsg/pypy/module/select/__init__.py --- pypy-7.1.1+dfsg/pypy/module/select/__init__.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/select/__init__.py 2020-04-10 19:28:41.000000000 +0000 @@ -1,45 +0,0 @@ -# Package initialisation -from pypy.interpreter.mixedmodule import MixedModule - -import sys -import os -from rpython.rlib import _rsocket_rffi as _c - - -class Module(MixedModule): - appleveldefs = { - } - - interpleveldefs = { - 'select': 'interp_select.select', - 'error' : 'space.fromcache(interp_select.Cache).w_error', - } - - if os.name =='posix': - interpleveldefs['poll'] = 'interp_select.poll' - - if sys.platform.startswith('linux'): - interpleveldefs['epoll'] = 'interp_epoll.W_Epoll' - from pypy.module.select.interp_epoll import public_symbols - for symbol, value in public_symbols.iteritems(): - if value is not None: - interpleveldefs[symbol] = "space.wrap(%r)" % value - - if 'bsd' in sys.platform or sys.platform.startswith('darwin'): - interpleveldefs["kqueue"] = "interp_kqueue.W_Kqueue" - interpleveldefs["kevent"] = "interp_kqueue.W_Kevent" - from pypy.module.select.interp_kqueue import symbol_map - for symbol in symbol_map: - interpleveldefs[symbol] = "space.wrap(interp_kqueue.%s)" % symbol - - if _c.PIPE_BUF is not None: - interpleveldefs['PIPE_BUF'] = 'space.wrap(%r)' % _c.PIPE_BUF - - - def buildloaders(cls): - from rpython.rlib import rpoll - for name in rpoll.eventnames: - value = getattr(rpoll, name) - Module.interpleveldefs[name] = "space.wrap(%r)" % value - super(Module, cls).buildloaders() - buildloaders = classmethod(buildloaders) diff -Nru pypy-7.1.1+dfsg/pypy/module/select/interp_select.py pypy-7.3.1+dfsg/pypy/module/select/interp_select.py --- pypy-7.1.1+dfsg/pypy/module/select/interp_select.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/select/interp_select.py 2020-04-10 19:28:41.000000000 +0000 @@ -40,7 +40,7 @@ fd = space.c_filedescriptor_w(w_fd) if fd not in self.fddict: raise wrap_oserror(space, OSError(errno.ENOENT, "poll.modify"), - exception_name='w_IOError') + w_exception_class=space.w_IOError) self.fddict[fd] = events def unregister(self, space, w_fd): diff -Nru pypy-7.1.1+dfsg/pypy/module/select/moduledef.py pypy-7.3.1+dfsg/pypy/module/select/moduledef.py --- pypy-7.1.1+dfsg/pypy/module/select/moduledef.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/select/moduledef.py 2020-04-10 19:28:41.000000000 +0000 @@ -0,0 +1,45 @@ +# Package initialisation +from pypy.interpreter.mixedmodule import MixedModule + +import sys +import os +from rpython.rlib import _rsocket_rffi as _c + + +class Module(MixedModule): + appleveldefs = { + } + + interpleveldefs = { + 'select': 'interp_select.select', + 'error' : 'space.fromcache(interp_select.Cache).w_error', + } + + if os.name =='posix': + interpleveldefs['poll'] = 'interp_select.poll' + + if sys.platform.startswith('linux'): + interpleveldefs['epoll'] = 'interp_epoll.W_Epoll' + from pypy.module.select.interp_epoll import public_symbols + for symbol, value in public_symbols.iteritems(): + if value is not None: + interpleveldefs[symbol] = "space.wrap(%r)" % value + + if 'bsd' in sys.platform or sys.platform.startswith('darwin'): + interpleveldefs["kqueue"] = "interp_kqueue.W_Kqueue" + interpleveldefs["kevent"] = "interp_kqueue.W_Kevent" + from pypy.module.select.interp_kqueue import symbol_map + for symbol in symbol_map: + interpleveldefs[symbol] = "space.wrap(interp_kqueue.%s)" % symbol + + if _c.PIPE_BUF is not None: + interpleveldefs['PIPE_BUF'] = 'space.wrap(%r)' % _c.PIPE_BUF + + + def buildloaders(cls): + from rpython.rlib import rpoll + for name in rpoll.eventnames: + value = getattr(rpoll, name) + Module.interpleveldefs[name] = "space.wrap(%r)" % value + super(Module, cls).buildloaders() + buildloaders = classmethod(buildloaders) diff -Nru pypy-7.1.1+dfsg/pypy/module/select/test/test_select.py pypy-7.3.1+dfsg/pypy/module/select/test/test_select.py --- pypy-7.1.1+dfsg/pypy/module/select/test/test_select.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/select/test/test_select.py 2020-04-10 19:28:41.000000000 +0000 @@ -338,10 +338,10 @@ py.test.skip("build bot for s390x cannot open sockets") def w_make_server(self): - import socket + import _socket if hasattr(self, 'sock'): return self.sock - self.sock = socket.socket() + self.sock = _socket.socket() try_ports = [1023] + list(range(20000, 30000, 437)) for port in try_ports: print('binding to port %d:' % (port,)) @@ -349,25 +349,25 @@ try: self.sock.bind(self.sockaddress) break - except socket.error as e: # should get a "Permission denied" + except _socket.error as e: # should get a "Permission denied" print(e) else: raise(e) def w_getpair(self): """Helper method which returns a pair of connected sockets.""" - import socket + import _socket import thread self.make_server() self.sock.listen(1) - s2 = socket.socket() + s2 = _socket.socket() thread.start_new_thread(s2.connect, (self.sockaddress,)) s1, addr2 = self.sock.accept() # speed up the tests that want to fill the buffers - s1.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 4096) - s2.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, 4096) + s1.setsockopt(_socket.SOL_SOCKET, _socket.SO_RCVBUF, 4096) + s2.setsockopt(_socket.SOL_SOCKET, _socket.SO_SNDBUF, 4096) return s1, s2 diff -Nru pypy-7.1.1+dfsg/pypy/module/_sha/__init__.py pypy-7.3.1+dfsg/pypy/module/_sha/__init__.py --- pypy-7.1.1+dfsg/pypy/module/_sha/__init__.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_sha/__init__.py 2020-04-10 19:28:40.000000000 +0000 @@ -1,30 +0,0 @@ - -""" -Mixed-module definition for the sha module. -Note that there is also a pure Python implementation in pypy/lib/sha.py; -the present mixed-module version of sha takes precedence if it is enabled. -""" - -from pypy.interpreter.mixedmodule import MixedModule - - -class Module(MixedModule): - """\ -This module implements the interface to NIST's secure hash algorithm, -known as SHA-1. SHA-1 is an improved version of the original SHA hash -algorithm. It is used in the same way as the md5 module: use new() to -create an sha object, then feed this object with arbitrary strings using -the update() method, and at any point you can ask it for the digest of -the concatenation of the strings fed to it so far. SHA-1 digests are 160 -bits instead of MD5's 128 bits.""" - - interpleveldefs = { - 'new': 'interp_sha.W_SHA', - 'SHAType': 'interp_sha.W_SHA', - 'blocksize': 'space.newint(1)', - 'digest_size': 'space.newint(20)', - 'digestsize': 'space.newint(20)', - } - - appleveldefs = { - } diff -Nru pypy-7.1.1+dfsg/pypy/module/_sha/moduledef.py pypy-7.3.1+dfsg/pypy/module/_sha/moduledef.py --- pypy-7.1.1+dfsg/pypy/module/_sha/moduledef.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_sha/moduledef.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,30 @@ + +""" +Mixed-module definition for the sha module. +Note that there is also a pure Python implementation in pypy/lib/sha.py; +the present mixed-module version of sha takes precedence if it is enabled. +""" + +from pypy.interpreter.mixedmodule import MixedModule + + +class Module(MixedModule): + """\ +This module implements the interface to NIST's secure hash algorithm, +known as SHA-1. SHA-1 is an improved version of the original SHA hash +algorithm. It is used in the same way as the md5 module: use new() to +create an sha object, then feed this object with arbitrary strings using +the update() method, and at any point you can ask it for the digest of +the concatenation of the strings fed to it so far. SHA-1 digests are 160 +bits instead of MD5's 128 bits.""" + + interpleveldefs = { + 'new': 'interp_sha.W_SHA', + 'SHAType': 'interp_sha.W_SHA', + 'blocksize': 'space.newint(1)', + 'digest_size': 'space.newint(20)', + 'digestsize': 'space.newint(20)', + } + + appleveldefs = { + } diff -Nru pypy-7.1.1+dfsg/pypy/module/_sha/test/test_sha.py pypy-7.3.1+dfsg/pypy/module/_sha/test/test_sha.py --- pypy-7.1.1+dfsg/pypy/module/_sha/test/test_sha.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_sha/test/test_sha.py 2020-04-10 19:28:40.000000000 +0000 @@ -23,7 +23,8 @@ assert self.sha.digestsize == 20 d = self.sha.sha() assert d.digest_size == 20 - assert d.digestsize == 20 + # implementation detail, not part of the API + # assert d.digestsize == 20 def test_SHAType(self): """ diff -Nru pypy-7.1.1+dfsg/pypy/module/signal/__init__.py pypy-7.3.1+dfsg/pypy/module/signal/__init__.py --- pypy-7.1.1+dfsg/pypy/module/signal/__init__.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/signal/__init__.py 2020-04-10 19:28:41.000000000 +0000 @@ -1,57 +0,0 @@ -from pypy.interpreter.mixedmodule import MixedModule - -import os - -class Module(MixedModule): - interpleveldefs = { - 'signal': 'interp_signal.signal', - 'getsignal': 'interp_signal.getsignal', - 'set_wakeup_fd': 'interp_signal.set_wakeup_fd', - 'NSIG': 'space.wrap(interp_signal.NSIG)', - 'SIG_DFL': 'space.wrap(interp_signal.SIG_DFL)', - 'SIG_IGN': 'space.wrap(interp_signal.SIG_IGN)', - 'default_int_handler': 'interp_signal.default_int_handler', - 'ItimerError': 'interp_signal.get_itimer_error(space)', - } - - if os.name == 'posix': - interpleveldefs['alarm'] = 'interp_signal.alarm' - interpleveldefs['pause'] = 'interp_signal.pause' - interpleveldefs['siginterrupt'] = 'interp_signal.siginterrupt' - - if os.name == 'posix': - interpleveldefs['setitimer'] = 'interp_signal.setitimer' - interpleveldefs['getitimer'] = 'interp_signal.getitimer' - for name in ['ITIMER_REAL', 'ITIMER_VIRTUAL', 'ITIMER_PROF']: - interpleveldefs[name] = 'space.wrap(interp_signal.%s)' % (name,) - - appleveldefs = { - } - - def buildloaders(cls): - from rpython.rlib import rsignal - - for name in rsignal.signal_names: - signum = getattr(rsignal, name) - if signum is not None: - Module.interpleveldefs[name] = 'space.wrap(%d)' % (signum,) - super(Module, cls).buildloaders() - buildloaders = classmethod(buildloaders) - - def __init__(self, space, *args): - "NOT_RPYTHON" - from pypy.module.signal import interp_signal - MixedModule.__init__(self, space, *args) - # add the signal-checking callback as an action on the space - space.check_signal_action = interp_signal.CheckSignalAction(space) - space.actionflag.register_periodic_action(space.check_signal_action, - use_bytecode_counter=False) - if space.reverse_debugging: - from pypy.interpreter.reverse_debugging import RDBSignalActionFlag - space.actionflag.__class__ = RDBSignalActionFlag - else: - space.actionflag.__class__ = interp_signal.SignalActionFlag - # xxx yes I know the previous line is a hack - - def startup(self, space): - space.check_signal_action.startup(space) diff -Nru pypy-7.1.1+dfsg/pypy/module/signal/moduledef.py pypy-7.3.1+dfsg/pypy/module/signal/moduledef.py --- pypy-7.1.1+dfsg/pypy/module/signal/moduledef.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/signal/moduledef.py 2020-04-10 19:28:41.000000000 +0000 @@ -0,0 +1,57 @@ +from pypy.interpreter.mixedmodule import MixedModule + +import os + +class Module(MixedModule): + interpleveldefs = { + 'signal': 'interp_signal.signal', + 'getsignal': 'interp_signal.getsignal', + 'set_wakeup_fd': 'interp_signal.set_wakeup_fd', + 'NSIG': 'space.wrap(interp_signal.NSIG)', + 'SIG_DFL': 'space.wrap(interp_signal.SIG_DFL)', + 'SIG_IGN': 'space.wrap(interp_signal.SIG_IGN)', + 'default_int_handler': 'interp_signal.default_int_handler', + 'ItimerError': 'interp_signal.get_itimer_error(space)', + } + + if os.name == 'posix': + interpleveldefs['alarm'] = 'interp_signal.alarm' + interpleveldefs['pause'] = 'interp_signal.pause' + interpleveldefs['siginterrupt'] = 'interp_signal.siginterrupt' + + if os.name == 'posix': + interpleveldefs['setitimer'] = 'interp_signal.setitimer' + interpleveldefs['getitimer'] = 'interp_signal.getitimer' + for name in ['ITIMER_REAL', 'ITIMER_VIRTUAL', 'ITIMER_PROF']: + interpleveldefs[name] = 'space.wrap(interp_signal.%s)' % (name,) + + appleveldefs = { + } + + def buildloaders(cls): + from rpython.rlib import rsignal + + for name in rsignal.signal_names: + signum = getattr(rsignal, name) + if signum is not None: + Module.interpleveldefs[name] = 'space.wrap(%d)' % (signum,) + super(Module, cls).buildloaders() + buildloaders = classmethod(buildloaders) + + def __init__(self, space, *args): + "NOT_RPYTHON" + from pypy.module.signal import interp_signal + MixedModule.__init__(self, space, *args) + # add the signal-checking callback as an action on the space + space.check_signal_action = interp_signal.CheckSignalAction(space) + space.actionflag.register_periodic_action(space.check_signal_action, + use_bytecode_counter=False) + if space.reverse_debugging: + from pypy.interpreter.reverse_debugging import RDBSignalActionFlag + space.actionflag.__class__ = RDBSignalActionFlag + else: + space.actionflag.__class__ = interp_signal.SignalActionFlag + # xxx yes I know the previous line is a hack + + def startup(self, space): + space.check_signal_action.startup(space) diff -Nru pypy-7.1.1+dfsg/pypy/module/_socket/__init__.py pypy-7.3.1+dfsg/pypy/module/_socket/__init__.py --- pypy-7.1.1+dfsg/pypy/module/_socket/__init__.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_socket/__init__.py 2020-04-10 19:28:40.000000000 +0000 @@ -1,47 +0,0 @@ -from pypy.interpreter.mixedmodule import MixedModule - -class Module(MixedModule): - - appleveldefs = { - } - - interpleveldefs = { - 'SocketType': 'interp_socket.W_Socket', - 'socket' : 'interp_socket.W_Socket', - 'error' : 'interp_socket.get_error(space, "error")', - 'herror' : 'interp_socket.get_error(space, "herror")', - 'gaierror' : 'interp_socket.get_error(space, "gaierror")', - 'timeout' : 'interp_socket.get_error(space, "timeout")', - } - - def startup(self, space): - from rpython.rlib.rsocket import rsocket_startup - rsocket_startup() - - def shutdown(self, space): - from pypy.module._socket.interp_socket import close_all_sockets - close_all_sockets(space) - - def buildloaders(cls): - from rpython.rlib import rsocket - for name in """ - gethostbyname gethostbyname_ex gethostbyaddr gethostname - getservbyname getservbyport getprotobyname - fromfd socketpair - ntohs ntohl htons htonl inet_aton inet_ntoa inet_pton inet_ntop - getaddrinfo getnameinfo - getdefaulttimeout setdefaulttimeout - """.split(): - - if name in ('inet_pton', 'inet_ntop', 'fromfd', 'socketpair') \ - and not hasattr(rsocket, name): - continue - - Module.interpleveldefs[name] = 'interp_func.%s' % (name, ) - - for constant, value in rsocket.constants.iteritems(): - Module.interpleveldefs[constant] = "space.wrap(%r)" % value - super(Module, cls).buildloaders() - buildloaders = classmethod(buildloaders) - -#Module.interpleveldefs['has_ipv6'] = "space.wrap(%s)" % _socket.has_ipv6 diff -Nru pypy-7.1.1+dfsg/pypy/module/_socket/interp_socket.py pypy-7.3.1+dfsg/pypy/module/_socket/interp_socket.py --- pypy-7.1.1+dfsg/pypy/module/_socket/interp_socket.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_socket/interp_socket.py 2020-04-10 19:28:40.000000000 +0000 @@ -312,7 +312,10 @@ raise converted_error(space, e) if buflen < 0 or buflen > 1024: raise explicit_socket_error(space, "getsockopt buflen out of range") - return space.newbytes(self.sock.getsockopt(level, optname, buflen)) + try: + return space.newbytes(self.sock.getsockopt(level, optname, buflen)) + except SocketError as e: + raise converted_error(space, e) def gettimeout_w(self, space): """gettimeout() -> timeout @@ -438,7 +441,10 @@ setblocking(True) is equivalent to settimeout(None); setblocking(False) is equivalent to settimeout(0.0). """ - self.sock.setblocking(flag) + try: + self.sock.setblocking(flag) + except SocketError as e: + pass # CPython 2 only: never raise anything here @unwrap_spec(level=int, optname=int) def setsockopt_w(self, space, level, optname, w_optval): @@ -452,7 +458,7 @@ except OperationError as e: if e.async(space): raise - optval = space.bytes_w(w_optval) + optval = space.bufferstr_w(w_optval) try: self.sock.setsockopt(level, optname, optval) except SocketError as e: @@ -477,7 +483,10 @@ timeout = space.float_w(w_timeout) if timeout < 0.0: raise oefmt(space.w_ValueError, "Timeout value out of range") - self.sock.settimeout(timeout) + try: + self.sock.settimeout(timeout) + except SocketError as e: + pass # CPython 2 only: never raise anything here @unwrap_spec(nbytes=int, flags=int) def recv_into_w(self, space, w_buffer, nbytes=0, flags=0): diff -Nru pypy-7.1.1+dfsg/pypy/module/_socket/moduledef.py pypy-7.3.1+dfsg/pypy/module/_socket/moduledef.py --- pypy-7.1.1+dfsg/pypy/module/_socket/moduledef.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_socket/moduledef.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,49 @@ +from pypy.interpreter.mixedmodule import MixedModule + +class Module(MixedModule): + + appleveldefs = { + } + + interpleveldefs = { + 'SocketType': 'interp_socket.W_Socket', + 'socket' : 'interp_socket.W_Socket', + 'error' : 'interp_socket.get_error(space, "error")', + 'herror' : 'interp_socket.get_error(space, "herror")', + 'gaierror' : 'interp_socket.get_error(space, "gaierror")', + 'timeout' : 'interp_socket.get_error(space, "timeout")', + } + + def startup(self, space): + from rpython.rlib.rsocket import rsocket_startup + rsocket_startup() + + def shutdown(self, space): + from pypy.module._socket.interp_socket import close_all_sockets + close_all_sockets(space) + + def buildloaders(cls): + from rpython.rlib import rsocket + for name in """ + gethostbyname gethostbyname_ex gethostbyaddr gethostname + getservbyname getservbyport getprotobyname + fromfd socketpair + ntohs ntohl htons htonl inet_aton inet_ntoa inet_pton inet_ntop + getaddrinfo getnameinfo + getdefaulttimeout setdefaulttimeout + """.split(): + + if name in ('inet_pton', 'inet_ntop', 'fromfd', 'socketpair') \ + and not hasattr(rsocket, name): + continue + + Module.interpleveldefs[name] = 'interp_func.%s' % (name, ) + + for constant, value in rsocket.constants.iteritems(): + if constant in ("SOCK_NONBLOCK", "SOCK_CLOEXEC"): + continue + Module.interpleveldefs[constant] = "space.wrap(%r)" % value + super(Module, cls).buildloaders() + buildloaders = classmethod(buildloaders) + +#Module.interpleveldefs['has_ipv6'] = "space.wrap(%s)" % _socket.has_ipv6 diff -Nru pypy-7.1.1+dfsg/pypy/module/_socket/test/test_sock_app.py pypy-7.3.1+dfsg/pypy/module/_socket/test/test_sock_app.py --- pypy-7.1.1+dfsg/pypy/module/_socket/test/test_sock_app.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_socket/test/test_sock_app.py 2020-04-10 19:28:40.000000000 +0000 @@ -1,37 +1,37 @@ -import sys, os +import os +import socket import pytest -from pypy.tool.pytest.objspace import gettestobjspace from pypy.interpreter.gateway import interp2app from pypy.module._file.test.test_file import regex_search from rpython.tool.udir import udir from rpython.rlib import rsocket from rpython.rtyper.lltypesystem import lltype, rffi -def setup_module(mod): - mod.space = gettestobjspace(usemodules=['_socket', 'array', 'struct']) - global socket - import socket - mod.w_socket = space.appexec([], "(): import _socket as m; return m") - mod.path = udir.join('fd') - mod.path.write('fo') +@pytest.fixture +def spaceconfig(): + return {'usemodules': ['_socket', 'array', 'struct']} + +@pytest.fixture +def w_socket(space): + return space.appexec([], "(): import _socket as m; return m") -def test_gethostname(): +def test_gethostname(space, w_socket): host = space.appexec([w_socket], "(_socket): return _socket.gethostname()") assert space.unwrap(host) == socket.gethostname() -def test_gethostbyname(): +def test_gethostbyname(space, w_socket): for host in ["localhost", "127.0.0.1"]: ip = space.appexec([w_socket, space.wrap(host)], "(_socket, host): return _socket.gethostbyname(host)") assert space.unwrap(ip) == socket.gethostbyname(host) -def test_gethostbyname_ex(): +def test_gethostbyname_ex(space, w_socket): for host in ["localhost", "127.0.0.1"]: ip = space.appexec([w_socket, space.wrap(host)], "(_socket, host): return _socket.gethostbyname_ex(host)") assert space.unwrap(ip) == socket.gethostbyname_ex(host) -def test_gethostbyaddr(): +def test_gethostbyaddr(space, w_socket): try: socket.gethostbyaddr("::1") except socket.herror: @@ -49,22 +49,18 @@ "(_socket, host): return _socket.gethostbyaddr(host)") assert space.unwrap(ip) == socket.gethostbyaddr(host) -def test_getservbyname(): +def test_getservbyname(space, w_socket): name = "smtp" # 2 args version port = space.appexec([w_socket, space.wrap(name)], "(_socket, name): return _socket.getservbyname(name, 'tcp')") assert space.unwrap(port) == 25 # 1 arg version - if sys.version_info < (2, 4): - pytest.skip("getservbyname second argument is not optional before python 2.4") port = space.appexec([w_socket, space.wrap(name)], "(_socket, name): return _socket.getservbyname(name)") assert space.unwrap(port) == 25 -def test_getservbyport(): - if sys.version_info < (2, 4): - pytest.skip("getservbyport does not exist before python 2.4") +def test_getservbyport(space, w_socket): port = 25 # 2 args version name = space.appexec([w_socket, space.wrap(port)], @@ -83,16 +79,16 @@ "(_socket, port): return _socket.getservbyport(port)") assert space.unwrap(name) == "smtp" -def test_getprotobyname(): +def test_getprotobyname(space, w_socket): name = "tcp" w_n = space.appexec([w_socket, space.wrap(name)], "(_socket, name): return _socket.getprotobyname(name)") assert space.unwrap(w_n) == socket.IPPROTO_TCP -def test_fromfd(): - # XXX review - if not hasattr(socket, 'fromfd'): - pytest.skip("No socket.fromfd on this platform") +@pytest.mark.skipif("not hasattr(socket, 'fromfd')") +def test_fromfd(space, w_socket, tmpdir): + path = tmpdir / 'fd' + path.write('fo') orig_fd = path.open() fd = space.appexec([w_socket, space.wrap(orig_fd.fileno()), space.wrap(socket.AF_INET), space.wrap(socket.SOCK_STREAM), @@ -108,12 +104,12 @@ assert space.unwrap(space.call_method(fd, 'fileno')) -def test_ntohs(): +def test_ntohs(space, w_socket): w_n = space.appexec([w_socket, space.wrap(125)], "(_socket, x): return _socket.ntohs(x)") assert space.unwrap(w_n) == socket.ntohs(125) -def test_ntohl(): +def test_ntohl(space, w_socket): w_n = space.appexec([w_socket, space.wrap(125)], "(_socket, x): return _socket.ntohl(x)") assert space.unwrap(w_n) == socket.ntohl(125) @@ -121,15 +117,15 @@ "(_socket, x): return _socket.ntohl(x)") assert space.unwrap(w_n) in (0x89abcdef, 0xefcdab89) space.raises_w(space.w_OverflowError, space.appexec, - [w_socket, space.wrap(1<<32)], + [w_socket, space.wrap(1 << 32)], "(_socket, x): return _socket.ntohl(x)") -def test_htons(): +def test_htons(space, w_socket): w_n = space.appexec([w_socket, space.wrap(125)], "(_socket, x): return _socket.htons(x)") assert space.unwrap(w_n) == socket.htons(125) -def test_htonl(): +def test_htonl(space, w_socket): w_n = space.appexec([w_socket, space.wrap(125)], "(_socket, x): return _socket.htonl(x)") assert space.unwrap(w_n) == socket.htonl(125) @@ -137,10 +133,10 @@ "(_socket, x): return _socket.htonl(x)") assert space.unwrap(w_n) in (0x89abcdef, 0xefcdab89) space.raises_w(space.w_OverflowError, space.appexec, - [w_socket, space.wrap(1<<32)], + [w_socket, space.wrap(1 << 32)], "(_socket, x): return _socket.htonl(x)") -def test_aton_ntoa(): +def test_aton_ntoa(space, w_socket): ip = '123.45.67.89' packed = socket.inet_aton(ip) w_p = space.appexec([w_socket, space.wrap(ip)], @@ -150,23 +146,22 @@ "(_socket, p): return _socket.inet_ntoa(p)") assert space.unwrap(w_ip) == ip -def test_pton_ntop_ipv4(): - if not hasattr(socket, 'inet_pton'): - pytest.skip('No socket.inet_pton on this platform') +@pytest.mark.skipif("not hasattr(socket, 'inet_pton')") +def test_pton_ntop_ipv4(space, w_socket): tests = [ ("123.45.67.89", "\x7b\x2d\x43\x59"), ("0.0.0.0", "\x00" * 4), ("255.255.255.255", "\xff" * 4), ] for ip, packed in tests: - w_p = space.appexec([w_socket, space.wrap(ip)], - "(_socket, ip): return _socket.inet_pton(_socket.AF_INET, ip)") + w_p = space.appexec([w_socket, space.wrap(ip)], """(_socket, ip): + return _socket.inet_pton(_socket.AF_INET, ip)""") assert space.unwrap(w_p) == packed - w_ip = space.appexec([w_socket, w_p], - "(_socket, p): return _socket.inet_ntop(_socket.AF_INET, p)") + w_ip = space.appexec([w_socket, w_p], """(_socket, p): + return _socket.inet_ntop(_socket.AF_INET, p)""") assert space.unwrap(w_ip) == ip -def test_ntop_ipv6(): +def test_ntop_ipv6(space, w_socket): if not hasattr(socket, 'inet_pton'): pytest.skip('No socket.inet_pton on this platform') if not socket.has_ipv6: @@ -174,7 +169,7 @@ tests = [ ("\x00" * 16, "::"), ("\x01" * 16, ":".join(["101"] * 8)), - ("\x00\x00\x10\x10" * 4, None), #"::1010:" + ":".join(["0:1010"] * 3)), + ("\x00\x00\x10\x10" * 4, None), # "::1010:" + ":".join(["0:1010"] * 3)), ("\x00" * 12 + "\x01\x02\x03\x04", "::1.2.3.4"), ("\x00" * 10 + "\xff\xff\x01\x02\x03\x04", "::ffff:1.2.3.4"), ] @@ -187,7 +182,7 @@ "(_socket, ip): return _socket.inet_pton(_socket.AF_INET6, ip)") assert space.unwrap(w_packed) == packed -def test_pton_ipv6(): +def test_pton_ipv6(space, w_socket): if not hasattr(socket, 'inet_pton'): pytest.skip('No socket.inet_pton on this platform') if not socket.has_ipv6: @@ -209,12 +204,7 @@ "(_socket, ip): return _socket.inet_pton(_socket.AF_INET6, ip)") assert space.unwrap(w_packed) == packed -def test_has_ipv6(): - pytest.skip("has_ipv6 is always True on PyPy for now") - res = space.appexec([w_socket], "(_socket): return _socket.has_ipv6") - assert space.unwrap(res) == socket.has_ipv6 - -def test_getaddrinfo(): +def test_getaddrinfo(space, w_socket): host = "localhost" port = 25 info = socket.getaddrinfo(host, port) @@ -224,12 +214,12 @@ w_l = space.appexec([w_socket, space.wrap(host), space.wrap(port)], "(_socket, host, port): return _socket.getaddrinfo(host, long(port))") assert space.unwrap(w_l) == info - pytest.skip("Unicode conversion is too slow") - w_l = space.appexec([w_socket, space.wrap(unicode(host)), space.wrap(port)], - "(_socket, host, port): return _socket.getaddrinfo(host, port)") - assert space.unwrap(w_l) == info + # Unicode conversion is too slow + # w_l = space.appexec([w_socket, space.wrap(unicode(host)), space.wrap(port)], + # "(_socket, host, port): return _socket.getaddrinfo(host, port)") + # assert space.unwrap(w_l) == info -def test_unknown_addr_as_object(): +def test_unknown_addr_as_object(space, ): from pypy.module._socket.interp_socket import addr_as_object c_addr = lltype.malloc(rsocket._c.sockaddr, flavor='raw', track_allocation=False) c_addr.c_sa_data[0] = 'c' @@ -242,7 +232,7 @@ assert space.int_w(space.getitem(w_obj, space.wrap(0))) == 15 assert space.str_w(space.getitem(w_obj, space.wrap(1))) == 'c' -def test_addr_raw_packet(): +def test_addr_raw_packet(space, ): from pypy.module._socket.interp_socket import addr_as_object if not hasattr(rsocket._c, 'sockaddr_ll'): pytest.skip("posix specific test") @@ -276,9 +266,9 @@ space.wrap(13), space.wrap(False), space.wrap("abc"), - ]))) + ]))) -def test_getnameinfo(): +def test_getnameinfo(space, w_socket): host = "127.0.0.1" port = 25 info = socket.getnameinfo((host, port), 0) @@ -286,7 +276,7 @@ "(_socket, host, port): return _socket.getnameinfo((host, port), 0)") assert space.unwrap(w_l) == info -def test_timeout(): +def test_timeout(space, w_socket): space.appexec([w_socket, space.wrap(25.4)], "(_socket, timeout): _socket.setdefaulttimeout(timeout)") w_t = space.appexec([w_socket], @@ -304,10 +294,10 @@ class AppTestSocket: - spaceconfig = dict(usemodules=['_socket', '_weakref', 'struct']) + spaceconfig = dict(usemodules=['_socket', 'struct']) def setup_class(cls): - cls.space = space + space = cls.space cls.w_udir = space.wrap(str(udir)) cls.w_regex_search = space.wrap(interp2app(regex_search)) @@ -418,9 +408,7 @@ def test_track_resources(self): import os, gc, sys, cStringIO import _socket - if '__pypy__' not in sys.builtin_module_names: - skip("pypy specific test") - # + def fn(flag1, flag2, do_close=False): sys.pypy_set_track_resources(flag1) mysock = _socket.socket(_socket.AF_INET, _socket.SOCK_STREAM, 0) @@ -470,7 +458,7 @@ s.close() def test_socket_connect(self): - import _socket, os + import _socket s = _socket.socket(_socket.AF_INET, _socket.SOCK_STREAM, 0) # it would be nice to have a test which works even if there is no # network connection. However, this one is "good enough" for now. Skip @@ -518,7 +506,6 @@ assert "flowinfo must be 0-1048575." in str(exc.value) def test_NtoH(self): - import sys import _socket as socket # This checks that htons etc. are their own inverse, # when looking at the lower 16 or 32 bits. It also @@ -581,6 +568,13 @@ intsize) (reuse,) = struct.unpack('i', reusestr) assert reuse != 0 + # try to call setsockopt() with a buffer argument + reusestr = struct.pack('i', 0) + s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, buffer(reusestr)) + reusestr = s.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, + intsize) + (reuse,) = struct.unpack('i', reusestr) + assert reuse == 0 def test_getsetsockopt_zero(self): # related to issue #2561: when specifying the buffer size param: @@ -639,7 +633,7 @@ def test_buffer_or_unicode(self): # Test that send/sendall/sendto accept a buffer or a unicode as arg - import _socket, os + import _socket s = _socket.socket(_socket.AF_INET, _socket.SOCK_STREAM, 0) # XXX temporarily we use python.org to test, will have more robust tests # in the absence of a network connection later when more parts of the @@ -660,7 +654,7 @@ raises(UnicodeEncodeError, s.send, u'\xe9') s.close() s = _socket.socket(_socket.AF_INET, _socket.SOCK_DGRAM, 0) - s.sendto(buffer(''), ('localhost', 9)) # Send to discard port. + s.sendto(buffer(''), ('localhost', 9)) # Send to discard port. s.close() def test_unix_socket_connect(self): @@ -700,18 +694,15 @@ self.foo = _socket.socket() +@pytest.mark.skipif(not hasattr(os, 'getpid'), + reason="AF_NETLINK needs os.getpid()") class AppTestNetlink: - def setup_class(cls): - if not hasattr(os, 'getpid'): - pytest.skip("AF_NETLINK needs os.getpid()") - w_ok = space.appexec([], "(): import _socket; " + - "return hasattr(_socket, 'AF_NETLINK')") - if not space.is_true(w_ok): - pytest.skip("no AF_NETLINK on this platform") - cls.space = space + spaceconfig = {'usemodules': ['_socket', 'select']} def test_connect_to_kernel_netlink_routing_socket(self): import _socket, os + if not hasattr(_socket, 'AF_NETLINK'): + skip("no AF_NETLINK on this platform") s = _socket.socket(_socket.AF_NETLINK, _socket.SOCK_DGRAM, _socket.NETLINK_ROUTE) assert s.getsockname() == (0, 0) s.bind((0, 0)) @@ -720,20 +711,17 @@ assert b == 0 +@pytest.mark.skipif(not hasattr(os, 'getuid') or os.getuid() != 0, + reason="AF_PACKET needs to be root for testing") class AppTestPacket: - def setup_class(cls): - if not hasattr(os, 'getuid') or os.getuid() != 0: - pytest.skip("AF_PACKET needs to be root for testing") - w_ok = space.appexec([], "(): import _socket; " + - "return hasattr(_socket, 'AF_PACKET')") - if not space.is_true(w_ok): - pytest.skip("no AF_PACKET on this platform") - cls.space = space + spaceconfig = {'usemodules': ['_socket', 'select']} def test_convert_between_tuple_and_sockaddr_ll(self): import _socket + if not hasattr(_socket, 'AF_PACKET'): + skip("no AF_PACKET on this platform") s = _socket.socket(_socket.AF_PACKET, _socket.SOCK_RAW) - assert s.getsockname() == ('', 0, 0, 0, '') + assert s.getsockname() == ('', 0, 0, 0, b'') s.bind(('lo', 123)) a, b, c, d, e = s.getsockname() assert (a, b, c) == ('lo', 123, 0) @@ -748,8 +736,9 @@ def setup_method(self, method): w_HOST = self.space.wrap(self.HOST) - self.w_serv =self.space.appexec([w_socket, w_HOST], - '''(_socket, HOST): + self.w_serv = self.space.appexec([w_HOST], + '''(HOST): + import _socket serv = _socket.socket(_socket.AF_INET, _socket.SOCK_STREAM) serv.bind((HOST, 0)) serv.listen(1) @@ -872,6 +861,19 @@ cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM) assert cli.family == socket.AF_INET + def test_missing_error_catching(self): + from _socket import socket, error + s = socket() + s.close() + s.settimeout(1) # EBADF, but ignored on Python 2 + s.setblocking(True) # EBADF, but ignored on Python 2 + raises(error, s.getsockopt, 42, 84, 8) # EBADF + + def test_no_socket_cloexec_non_block(self): + import _socket + assert not hasattr(_socket, "SOCK_CLOEXEC") # not in py 2 + assert not hasattr(_socket, "SOCK_NONBLOCK") # 3.7 only + class AppTestErrno: spaceconfig = {'usemodules': ['_socket']} diff -Nru pypy-7.1.1+dfsg/pypy/module/_sre/__init__.py pypy-7.3.1+dfsg/pypy/module/_sre/__init__.py --- pypy-7.1.1+dfsg/pypy/module/_sre/__init__.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_sre/__init__.py 2020-04-10 19:28:40.000000000 +0000 @@ -1,15 +0,0 @@ -from pypy.interpreter.mixedmodule import MixedModule - -class Module(MixedModule): - - appleveldefs = { - } - - interpleveldefs = { - 'CODESIZE': 'space.newint(interp_sre.CODESIZE)', - 'MAGIC': 'space.newint(20031017)', - 'MAXREPEAT': 'space.newint(interp_sre.MAXREPEAT)', - 'compile': 'interp_sre.W_SRE_Pattern', - 'getlower': 'interp_sre.w_getlower', - 'getcodesize': 'interp_sre.w_getcodesize', - } diff -Nru pypy-7.1.1+dfsg/pypy/module/_sre/interp_sre.py pypy-7.3.1+dfsg/pypy/module/_sre/interp_sre.py --- pypy-7.1.1+dfsg/pypy/module/_sre/interp_sre.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_sre/interp_sre.py 2020-04-10 19:28:42.000000000 +0000 @@ -37,15 +37,14 @@ # 'start' and 'end' are byte positions if ctx.ZERO <= start <= end: if isinstance(ctx, rsre_core.BufMatchContext): - return space.newbytes(ctx._buffer.getslice(start, end, 1, - end-start)) + return space.newbytes(ctx._buffer.getslice(start, 1, end-start)) if isinstance(ctx, rsre_core.StrMatchContext): start = ctx._real_pos(start) end = ctx._real_pos(end) return space.newbytes(ctx._string[start:end]) elif isinstance(ctx, rsre_utf8.Utf8MatchContext): s = ctx._utf8[start:end] - lgt = rutf8.get_utf8_length(s) + lgt = rutf8.codepoints_in_utf8(s) return space.newutf8(s, lgt) else: # unreachable @@ -383,7 +382,7 @@ elif use_builder == 'U': assert isinstance(ctx, rsre_utf8.Utf8MatchContext) return space.newutf8(result_bytes, - rutf8.get_utf8_length(result_bytes)), n + rutf8.codepoints_in_utf8(result_bytes)), n else: raise AssertionError(use_builder) else: @@ -411,7 +410,7 @@ assert strbuilder is not None if isinstance(ctx, rsre_core.BufMatchContext): assert use_builder == 'S' - return strbuilder.append(ctx._buffer.getslice(start, end, 1, end-start)) + return strbuilder.append(ctx._buffer.getslice(start, 1, end-start)) if isinstance(ctx, rsre_core.StrMatchContext): assert use_builder == 'S' start = ctx._real_pos(start) @@ -566,7 +565,8 @@ if isinstance(ctx, rsre_utf8.Utf8MatchContext): index_storage = ctx.w_unicode_obj._get_index_storage() return rutf8.codepoint_index_at_byte_position( - ctx.w_unicode_obj._utf8, index_storage, bytepos) + ctx.w_unicode_obj._utf8, index_storage, bytepos, + ctx.w_unicode_obj._len()) else: return bytepos @@ -651,7 +651,7 @@ elif isinstance(ctx, rsre_core.StrMatchContext): return space.newbytes(ctx._string) elif isinstance(ctx, rsre_utf8.Utf8MatchContext): - lgt = rutf8.get_utf8_length(ctx._utf8) + lgt = rutf8.codepoints_in_utf8(ctx._utf8) return space.newutf8(ctx._utf8, lgt) else: raise SystemError diff -Nru pypy-7.1.1+dfsg/pypy/module/_sre/moduledef.py pypy-7.3.1+dfsg/pypy/module/_sre/moduledef.py --- pypy-7.1.1+dfsg/pypy/module/_sre/moduledef.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_sre/moduledef.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,15 @@ +from pypy.interpreter.mixedmodule import MixedModule + +class Module(MixedModule): + + appleveldefs = { + } + + interpleveldefs = { + 'CODESIZE': 'space.newint(interp_sre.CODESIZE)', + 'MAGIC': 'space.newint(20031017)', + 'MAXREPEAT': 'space.newint(interp_sre.MAXREPEAT)', + 'compile': 'interp_sre.W_SRE_Pattern', + 'getlower': 'interp_sre.w_getlower', + 'getcodesize': 'interp_sre.w_getcodesize', + } diff -Nru pypy-7.1.1+dfsg/pypy/module/_sre/test/test_sre_buf.py pypy-7.3.1+dfsg/pypy/module/_sre/test/test_sre_buf.py --- pypy-7.1.1+dfsg/pypy/module/_sre/test/test_sre_buf.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_sre/test/test_sre_buf.py 2020-04-10 19:28:42.000000000 +0000 @@ -0,0 +1,25 @@ +from pypy.module._sre.test import test_app_sre +from pypy.module._sre import interp_sre +from rpython.rlib.rsre import rsre_core +from rpython.rlib.buffer import StringBuffer + + +def _test_sre_ctx_buf_(self, str, start, end): + # Test BufMatchContext. + buf = StringBuffer(str) + return rsre_core.BufMatchContext(buf, start, end, self.flags) + +def setup_module(mod): + mod._org_maker = ( + interp_sre.W_SRE_Pattern._make_str_match_context, + ) + interp_sre.W_SRE_Pattern._make_str_match_context = _test_sre_ctx_buf_ + +def teardown_module(mod): + ( + interp_sre.W_SRE_Pattern._make_str_match_context, + ) = mod._org_maker + + +class AppTestSreMatchBuf(test_app_sre.AppTestSreMatch): + pass diff -Nru pypy-7.1.1+dfsg/pypy/module/_ssl/__init__.py pypy-7.3.1+dfsg/pypy/module/_ssl/__init__.py --- pypy-7.1.1+dfsg/pypy/module/_ssl/__init__.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_ssl/__init__.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,64 +0,0 @@ -import sys -from rpython.rlib.rarithmetic import intmask -from pypy.interpreter.mixedmodule import MixedModule -from pypy.module._ssl import ssl_data - -class Module(MixedModule): - """Implementation module for SSL socket operations. - See the socket module for documentation.""" - - interpleveldefs = { - '_test_decode_cert': 'interp_ssl._test_decode_cert', - 'txt2obj': 'interp_ssl.txt2obj', - 'nid2obj': 'interp_ssl.nid2obj', - 'get_default_verify_paths': 'interp_ssl.get_default_verify_paths', - - 'SSLError': "interp_ssl.get_exception_class(space, 'w_sslerror')", - 'SSLZeroReturnError': "interp_ssl.get_exception_class(space, 'w_sslzeroreturnerror')", - 'SSLWantReadError': "interp_ssl.get_exception_class(space, 'w_sslwantreaderror')", - 'SSLWantWriteError': "interp_ssl.get_exception_class(space, 'w_sslwantwriteerror')", - 'SSLSyscallError': "interp_ssl.get_exception_class(space, 'w_sslsyscallerror')", - 'SSLEOFError': "interp_ssl.get_exception_class(space, 'w_ssleoferror')", - - '_SSLSocket': 'interp_ssl._SSLSocket', - '_SSLContext': 'interp_ssl._SSLContext', - } - - if sys.platform == 'win32': - interpleveldefs['enum_certificates'] = 'interp_win32.enum_certificates_w' - interpleveldefs['enum_crls'] = 'interp_win32.enum_crls_w' - - appleveldefs = { - } - - @classmethod - def buildloaders(cls): - # init the SSL module - from pypy.module._ssl.interp_ssl import constants, HAVE_OPENSSL_RAND - - for constant, value in constants.iteritems(): - if constant.startswith('OP_'): - value = intmask(value) # Convert to C long and wrap around. - Module.interpleveldefs[constant] = "space.wrap(%r)" % (value,) - - if HAVE_OPENSSL_RAND: - Module.interpleveldefs['RAND_add'] = "interp_ssl.RAND_add" - Module.interpleveldefs['RAND_status'] = "interp_ssl.RAND_status" - Module.interpleveldefs['RAND_egd'] = "interp_ssl.RAND_egd" - - for name, value in ssl_data.ALERT_DESCRIPTION_CODES.items(): - Module.interpleveldefs[name] = "space.wrap(%r)" % value - - super(Module, cls).buildloaders() - - def setup_after_space_initialization(self): - """NOT_RPYTHON""" - from pypy.module._ssl.interp_ssl import PWINFO_STORAGE - PWINFO_STORAGE.clear() - - def startup(self, space): - from rpython.rlib.ropenssl import init_ssl - init_ssl() - if space.config.objspace.usemodules.thread: - from pypy.module._ssl.thread_lock import setup_ssl_threads - setup_ssl_threads() diff -Nru pypy-7.1.1+dfsg/pypy/module/_ssl/interp_ssl.py pypy-7.3.1+dfsg/pypy/module/_ssl/interp_ssl.py --- pypy-7.1.1+dfsg/pypy/module/_ssl/interp_ssl.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_ssl/interp_ssl.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,1833 +0,0 @@ -from rpython.rlib import rpoll, rsocket, rthread, rweakref, rgc -from rpython.rlib.rarithmetic import intmask, widen, r_uint -from rpython.rlib.ropenssl import * -from pypy.module._socket import interp_socket -from rpython.rlib._rsocket_rffi import MAX_FD_SIZE -from rpython.rlib.rposix import get_saved_errno -from rpython.rlib.rweakref import RWeakValueDictionary -from rpython.rlib.objectmodel import specialize, compute_unique_id -from rpython.rtyper.lltypesystem import lltype, rffi - -from pypy.interpreter.baseobjspace import W_Root -from pypy.interpreter.error import OperationError, oefmt, wrap_oserror -from pypy.interpreter.gateway import interp2app, unwrap_spec -from pypy.interpreter.typedef import TypeDef, GetSetProperty -from pypy.module._ssl.ssl_data import ( - LIBRARY_CODES_TO_NAMES, ERROR_CODES_TO_NAMES) - - -# user defined constants -X509_NAME_MAXLEN = 256 -# these mirror ssl.h -PY_SSL_ERROR_NONE, PY_SSL_ERROR_SSL = 0, 1 -PY_SSL_ERROR_WANT_READ, PY_SSL_ERROR_WANT_WRITE = 2, 3 -PY_SSL_ERROR_WANT_X509_LOOKUP = 4 -PY_SSL_ERROR_SYSCALL = 5 # look at error stack/return value/errno -PY_SSL_ERROR_ZERO_RETURN, PY_SSL_ERROR_WANT_CONNECT = 6, 7 -# start of non ssl.h errorcodes -PY_SSL_ERROR_EOF = 8 # special case of SSL_ERROR_SYSCALL -PY_SSL_ERROR_INVALID_ERROR_CODE = 9 - -PY_SSL_CERT_NONE, PY_SSL_CERT_OPTIONAL, PY_SSL_CERT_REQUIRED = 0, 1, 2 - -PY_SSL_CLIENT, PY_SSL_SERVER = 0, 1 - -(PY_SSL_VERSION_SSL2, PY_SSL_VERSION_SSL3, - PY_SSL_VERSION_TLS, PY_SSL_VERSION_TLS1, PY_SSL_VERSION_TLS1_1, - PY_SSL_VERSION_TLS1_2) = range(6) - - -SOCKET_IS_NONBLOCKING, SOCKET_IS_BLOCKING = 0, 1 -SOCKET_HAS_TIMED_OUT, SOCKET_HAS_BEEN_CLOSED = 2, 3 -SOCKET_TOO_LARGE_FOR_SELECT, SOCKET_OPERATION_OK = 4, 5 - -HAVE_RPOLL = 'poll' in dir(rpoll) - -constants = {} -constants["SSL_ERROR_ZERO_RETURN"] = PY_SSL_ERROR_ZERO_RETURN -constants["SSL_ERROR_WANT_READ"] = PY_SSL_ERROR_WANT_READ -constants["SSL_ERROR_WANT_WRITE"] = PY_SSL_ERROR_WANT_WRITE -constants["SSL_ERROR_WANT_X509_LOOKUP"] = PY_SSL_ERROR_WANT_X509_LOOKUP -constants["SSL_ERROR_SYSCALL"] = PY_SSL_ERROR_SYSCALL -constants["SSL_ERROR_SSL"] = PY_SSL_ERROR_SSL -constants["SSL_ERROR_WANT_CONNECT"] = PY_SSL_ERROR_WANT_CONNECT -constants["SSL_ERROR_EOF"] = PY_SSL_ERROR_EOF -constants["SSL_ERROR_INVALID_ERROR_CODE"] = PY_SSL_ERROR_INVALID_ERROR_CODE - -constants["CERT_NONE"] = PY_SSL_CERT_NONE -constants["CERT_OPTIONAL"] = PY_SSL_CERT_OPTIONAL -constants["CERT_REQUIRED"] = PY_SSL_CERT_REQUIRED - -constants["VERIFY_DEFAULT"] = 0 -constants["VERIFY_CRL_CHECK_LEAF"] = X509_V_FLAG_CRL_CHECK -constants["VERIFY_CRL_CHECK_CHAIN"] = X509_V_FLAG_CRL_CHECK|X509_V_FLAG_CRL_CHECK_ALL -constants["VERIFY_X509_STRICT"] = X509_V_FLAG_X509_STRICT - -constants["HAS_SNI"] = HAS_SNI -constants["HAS_TLS_UNIQUE"] = HAVE_OPENSSL_FINISHED -constants["HAS_ECDH"] = not OPENSSL_NO_ECDH -constants["HAS_NPN"] = HAS_NPN -constants["HAS_ALPN"] = HAS_ALPN - -constants["PROTOCOL_TLS"] = PY_SSL_VERSION_TLS -constants["PROTOCOL_SSLv23"] = PY_SSL_VERSION_TLS # Legacy name -if not OPENSSL_NO_SSL2: - constants["PROTOCOL_SSLv2"] = PY_SSL_VERSION_SSL2 -if not OPENSSL_NO_SSL3: - constants["PROTOCOL_SSLv3"] = PY_SSL_VERSION_SSL3 -constants["PROTOCOL_TLSv1"] = PY_SSL_VERSION_TLS1 -if HAVE_TLSv1_2: - constants["PROTOCOL_TLSv1_1"] = PY_SSL_VERSION_TLS1_1 - constants["OP_NO_TLSv1_1"] = SSL_OP_NO_TLSv1_1 - constants["PROTOCOL_TLSv1_2"] = PY_SSL_VERSION_TLS1_2 - constants["OP_NO_TLSv1_2"] = SSL_OP_NO_TLSv1_2 - -constants["OP_ALL"] = SSL_OP_ALL &~SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS -constants["OP_NO_SSLv2"] = SSL_OP_NO_SSLv2 -constants["OP_NO_SSLv3"] = SSL_OP_NO_SSLv3 -constants["OP_NO_TLSv1"] = SSL_OP_NO_TLSv1 -constants["OP_CIPHER_SERVER_PREFERENCE"] = SSL_OP_CIPHER_SERVER_PREFERENCE -constants["OP_SINGLE_DH_USE"] = SSL_OP_SINGLE_DH_USE -constants["OP_SINGLE_ECDH_USE"] = SSL_OP_SINGLE_ECDH_USE -if SSL_OP_NO_COMPRESSION is not None: - constants["OP_NO_COMPRESSION"] = SSL_OP_NO_COMPRESSION - -constants["OPENSSL_VERSION_NUMBER"] = OPENSSL_VERSION_NUMBER -ver = OPENSSL_VERSION_NUMBER -ver, status = divmod(ver, 16) -ver, patch = divmod(ver, 256) -ver, fix = divmod(ver, 256) -ver, minor = divmod(ver, 256) -ver, major = divmod(ver, 256) -version_info = (major, minor, fix, patch, status) -constants["OPENSSL_VERSION_INFO"] = version_info -constants["_OPENSSL_API_VERSION"] = version_info -constants["OPENSSL_VERSION"] = SSLEAY_VERSION - - -def ssl_error(space, msg, errno=0, w_errtype=None, errcode=0): - reason_str = None - lib_str = None - if errcode: - err_lib = libssl_ERR_GET_LIB(errcode) - err_reason = libssl_ERR_GET_REASON(errcode) - reason_str = ERROR_CODES_TO_NAMES.get((err_lib, err_reason), None) - lib_str = LIBRARY_CODES_TO_NAMES.get(err_lib, None) - raw_msg = libssl_ERR_reason_error_string(errcode) - msg = None - if raw_msg: - msg = rffi.charp2str(raw_msg) - if not msg: - msg = "unknown error" - if reason_str and lib_str: - msg = "[%s: %s] %s" % (lib_str, reason_str, msg) - elif lib_str: - msg = "[%s] %s" % (lib_str, msg) - - w_exception_class = w_errtype or get_exception_class(space, 'w_sslerror') - if errno or errcode: - w_exception = space.call_function(w_exception_class, - space.newint(errno), space.newtext(msg)) - else: - w_exception = space.call_function(w_exception_class, space.newtext(msg)) - space.setattr(w_exception, space.newtext("reason"), - space.newtext_or_none(reason_str)) - space.setattr(w_exception, space.newtext("library"), - space.newtext_or_none(lib_str)) - return OperationError(w_exception_class, w_exception) - -class SSLNpnProtocols(object): - - def __init__(self, ctx, protos): - self.protos = protos - self.buf, self.bufflag = rffi.get_nonmovingbuffer(protos) - NPN_STORAGE.set(rffi.cast(lltype.Unsigned, self.buf), self) - - # set both server and client callbacks, because the context - # can be used to create both types of sockets - libssl_SSL_CTX_set_next_protos_advertised_cb( - ctx, self.advertiseNPN_cb, self.buf) - libssl_SSL_CTX_set_next_proto_select_cb( - ctx, self.selectNPN_cb, self.buf) - - def __del__(self): - rffi.free_nonmovingbuffer( - self.protos, self.buf, self.bufflag) - - @staticmethod - def advertiseNPN_cb(s, data_ptr, len_ptr, args): - npn = NPN_STORAGE.get(rffi.cast(lltype.Unsigned, args)) - if npn and npn.protos: - data_ptr[0] = npn.buf - len_ptr[0] = rffi.cast(rffi.UINT, len(npn.protos)) - else: - data_ptr[0] = lltype.nullptr(rffi.CCHARP.TO) - len_ptr[0] = rffi.cast(rffi.UINT, 0) - - return rffi.cast(rffi.INT, SSL_TLSEXT_ERR_OK) - - @staticmethod - def selectNPN_cb(s, out_ptr, outlen_ptr, server, server_len, args): - npn = NPN_STORAGE.get(rffi.cast(lltype.Unsigned, args)) - if npn and npn.protos: - client = npn.buf - client_len = len(npn.protos) - else: - client = lltype.nullptr(rffi.CCHARP.TO) - client_len = 0 - - libssl_SSL_select_next_proto(out_ptr, outlen_ptr, - server, server_len, - client, client_len) - return rffi.cast(rffi.INT, SSL_TLSEXT_ERR_OK) - - -class SSLAlpnProtocols(object): - - def __init__(self, ctx, protos): - self.protos = protos - self.buf, self.bufflag = rffi.get_nonmovingbuffer(protos) - ALPN_STORAGE.set(rffi.cast(lltype.Unsigned, self.buf), self) - - with rffi.scoped_str2charp(protos) as protos_buf: - if libssl_SSL_CTX_set_alpn_protos( - ctx, rffi.cast(rffi.UCHARP, protos_buf), len(protos)): - raise MemoryError - libssl_SSL_CTX_set_alpn_select_cb( - ctx, self.selectALPN_cb, self.buf) - - def __del__(self): - rffi.free_nonmovingbuffer( - self.protos, self.buf, self.bufflag) - - @staticmethod - def selectALPN_cb(s, out_ptr, outlen_ptr, client, client_len, args): - alpn = ALPN_STORAGE.get(rffi.cast(lltype.Unsigned, args)) - if alpn and alpn.protos: - server = alpn.buf - server_len = len(alpn.protos) - else: - server = lltype.nullptr(rffi.CCHARP.TO) - server_len = 0 - - ret = libssl_SSL_select_next_proto(out_ptr, outlen_ptr, - server, server_len, - client, client_len) - if ret != OPENSSL_NPN_NEGOTIATED: - return rffi.cast(rffi.INT, SSL_TLSEXT_ERR_NOACK) - return rffi.cast(rffi.INT, SSL_TLSEXT_ERR_OK) - - -NPN_STORAGE = RWeakValueDictionary(r_uint, SSLNpnProtocols) -ALPN_STORAGE = RWeakValueDictionary(r_uint, SSLAlpnProtocols) - -SOCKET_STORAGE = RWeakValueDictionary(int, W_Root) - - -if HAVE_OPENSSL_RAND: - # helper routines for seeding the SSL PRNG - @unwrap_spec(string='bytes', entropy=float) - def RAND_add(space, string, entropy): - """RAND_add(string, entropy) - - - Mix string into the OpenSSL PRNG state. entropy (a float) is a lower - bound on the entropy contained in string.""" - with rffi.scoped_nonmovingbuffer(string) as buf: - libssl_RAND_add(buf, len(string), entropy) - - def RAND_status(space): - """RAND_status() -> 0 or 1 - - Returns 1 if the OpenSSL PRNG has been seeded with enough data - and 0 if not. It is necessary to seed the PRNG with RAND_add() - on some platforms before using the ssl() function.""" - - res = libssl_RAND_status() - return space.newint(res) - - if HAVE_OPENSSL_RAND_EGD: - @unwrap_spec(path='text') - def RAND_egd(space, path): - """RAND_egd(path) -> bytes - - Queries the entropy gather daemon (EGD) on socket path. Returns number - of bytes read. Raises socket.sslerror if connection to EGD fails or - if it does provide enough data to seed PRNG.""" - with rffi.scoped_str2charp(path) as socket_path: - bytes = libssl_RAND_egd(socket_path) - if bytes == -1: - raise ssl_error(space, - "EGD connection failed or EGD did not return " - "enough data to seed the PRNG") - return space.newint(bytes) - else: - # Dummy func for platforms missing RAND_egd(). Most likely LibreSSL. - @unwrap_spec(path='text') - def RAND_egd(space, path): - raise ssl_error(space, "RAND_egd unavailable") - - -class _SSLSocket(W_Root): - @staticmethod - def descr_new(space, w_ctx, w_sock, socket_type, - w_hostname=None, w_ssl_sock=None): - self = _SSLSocket() - - self.space = space - self.w_ctx = w_ctx - self.peer_cert = lltype.nullptr(X509.TO) - self.shutdown_seen_zero = False - self.handshake_done = False - - sock_fd = space.int_w(space.call_method(w_sock, "fileno")) - self.ssl = libssl_SSL_new(w_ctx.ctx) # new ssl struct - - rgc.add_memory_pressure(6 * 1024) - self.register_finalizer(space) - - index = compute_unique_id(self) - libssl_SSL_set_app_data(self.ssl, rffi.cast(rffi.VOIDP, index)) - SOCKET_STORAGE.set(index, self) - - libssl_SSL_set_fd(self.ssl, sock_fd) # set the socket for SSL - # The ACCEPT_MOVING_WRITE_BUFFER flag is necessary because the address - # of a str object may be changed by the garbage collector. - libssl_SSL_set_mode( - self.ssl, SSL_MODE_AUTO_RETRY | SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER) - - if not space.is_none(w_hostname): - if space.isinstance_w(w_hostname, space.w_unicode): - w_hostname = space.call_method(w_hostname, "encode", - space.newtext("idna")) - libssl_SSL_set_tlsext_host_name( - self.ssl, space.bytes_w(w_hostname)) - - # If the socket is in non-blocking mode or timeout mode, set the BIO - # to non-blocking mode (blocking is the default) - w_timeout = space.call_method(w_sock, "gettimeout") - has_timeout = not space.is_none(w_timeout) - if has_timeout: - # Set both the read and write BIO's to non-blocking mode - libssl_BIO_set_nbio(libssl_SSL_get_rbio(self.ssl), 1) - libssl_BIO_set_nbio(libssl_SSL_get_wbio(self.ssl), 1) - - if socket_type == PY_SSL_CLIENT: - libssl_SSL_set_connect_state(self.ssl) - else: - libssl_SSL_set_accept_state(self.ssl) - - self.socket_type = socket_type - self.w_socket = w_sock - if w_ssl_sock: - self.ssl_sock_weakref_w = rweakref.ref(w_ssl_sock) - else: - self.ssl_sock_weakref_w = None - return self - - def _finalize_(self): - peer_cert = self.peer_cert - if peer_cert: - self.peer_cert = lltype.nullptr(X509.TO) - libssl_X509_free(peer_cert) - ssl = self.ssl - if ssl: - self.ssl = lltype.nullptr(SSL.TO) - libssl_SSL_free(ssl) - - @unwrap_spec(data='bufferstr') - def write(self, space, data): - """write(s) -> len - - Writes the string s into the SSL object. Returns the number - of bytes written.""" - self._refresh_nonblocking(space) - - sockstate = checkwait(space, self.w_socket, True) - if sockstate == SOCKET_HAS_TIMED_OUT: - raise ssl_error(space, "The write operation timed out") - elif sockstate == SOCKET_HAS_BEEN_CLOSED: - raise ssl_error(space, "Underlying socket has been closed.") - elif sockstate == SOCKET_TOO_LARGE_FOR_SELECT: - raise ssl_error(space, "Underlying socket too large for select().") - - num_bytes = 0 - while True: - err = 0 - - num_bytes = libssl_SSL_write(self.ssl, data, len(data)) - err = libssl_SSL_get_error(self.ssl, num_bytes) - - if err == SSL_ERROR_WANT_READ: - sockstate = checkwait(space, self.w_socket, False) - elif err == SSL_ERROR_WANT_WRITE: - sockstate = checkwait(space, self.w_socket, True) - else: - sockstate = SOCKET_OPERATION_OK - - if sockstate == SOCKET_HAS_TIMED_OUT: - raise ssl_error(space, "The write operation timed out") - elif sockstate == SOCKET_HAS_BEEN_CLOSED: - raise ssl_error(space, "Underlying socket has been closed.") - elif sockstate == SOCKET_IS_NONBLOCKING: - break - - if err == SSL_ERROR_WANT_READ or err == SSL_ERROR_WANT_WRITE: - continue - else: - break - - if num_bytes > 0: - return space.newint(num_bytes) - else: - raise _ssl_seterror(space, self, num_bytes) - - def pending(self, space): - """pending() -> count - - Returns the number of already decrypted bytes available for read, - pending on the connection.""" - count = libssl_SSL_pending(self.ssl) - if count < 0: - raise _ssl_seterror(space, self, count) - return space.newint(count) - - @unwrap_spec(num_bytes=int) - def read(self, space, num_bytes, w_buffer=None): - """read([len]) -> string - - Read up to len bytes from the SSL socket.""" - count = libssl_SSL_pending(self.ssl) - if not count: - sockstate = checkwait(space, self.w_socket, False) - if sockstate == SOCKET_HAS_TIMED_OUT: - raise ssl_error(space, "The read operation timed out") - elif sockstate == SOCKET_TOO_LARGE_FOR_SELECT: - raise ssl_error(space, - "Underlying socket too large for select().") - elif sockstate == SOCKET_HAS_BEEN_CLOSED: - if libssl_SSL_get_shutdown(self.ssl) == SSL_RECEIVED_SHUTDOWN: - return space.newbytes('') - raise ssl_error(space, - "Socket closed without SSL shutdown handshake") - - if w_buffer: - rwbuffer = space.getarg_w('w*', w_buffer) - buflen = rwbuffer.getlength() - if not 0 < num_bytes <= buflen: - num_bytes = buflen - else: - if num_bytes < 0: - raise oefmt(space.w_ValueError, "size should not be negative") - rwbuffer = None - - if num_bytes <= 0: - if rwbuffer: - return space.newint(0) - else: - return space.newbytes("") - - with rffi.scoped_alloc_buffer(num_bytes) as buf: - while True: - err = 0 - - count = libssl_SSL_read(self.ssl, buf.raw, num_bytes) - err = libssl_SSL_get_error(self.ssl, count) - - if err == SSL_ERROR_WANT_READ: - sockstate = checkwait(space, self.w_socket, False) - elif err == SSL_ERROR_WANT_WRITE: - sockstate = checkwait(space, self.w_socket, True) - elif (err == SSL_ERROR_ZERO_RETURN and - libssl_SSL_get_shutdown(self.ssl) == SSL_RECEIVED_SHUTDOWN): - if rwbuffer: - return space.newint(0) - else: - return space.newbytes("") - else: - sockstate = SOCKET_OPERATION_OK - - if sockstate == SOCKET_HAS_TIMED_OUT: - raise ssl_error(space, "The read operation timed out") - elif sockstate == SOCKET_IS_NONBLOCKING: - break - - if err == SSL_ERROR_WANT_READ or err == SSL_ERROR_WANT_WRITE: - continue - else: - break - - if count <= 0: - raise _ssl_seterror(space, self, count) - - result = buf.str(count) - - if rwbuffer: - rwbuffer.setslice(0, result) - return space.newint(count) - else: - return space.newbytes(result) - - def _refresh_nonblocking(self, space): - # just in case the blocking state of the socket has been changed - w_timeout = space.call_method(self.w_socket, "gettimeout") - nonblocking = not space.is_w(w_timeout, space.w_None) - libssl_BIO_set_nbio(libssl_SSL_get_rbio(self.ssl), nonblocking) - libssl_BIO_set_nbio(libssl_SSL_get_wbio(self.ssl), nonblocking) - - def do_handshake(self, space): - self._refresh_nonblocking(space) - - # Actually negotiate SSL connection - # XXX If SSL_do_handshake() returns 0, it's also a failure. - while True: - ret = libssl_SSL_do_handshake(self.ssl) - err = libssl_SSL_get_error(self.ssl, ret) - # XXX PyErr_CheckSignals() - if err == SSL_ERROR_WANT_READ: - sockstate = checkwait(space, self.w_socket, False) - elif err == SSL_ERROR_WANT_WRITE: - sockstate = checkwait(space, self.w_socket, True) - else: - sockstate = SOCKET_OPERATION_OK - if sockstate == SOCKET_HAS_TIMED_OUT: - raise ssl_error(space, "The handshake operation timed out") - elif sockstate == SOCKET_HAS_BEEN_CLOSED: - raise ssl_error(space, "Underlying socket has been closed.") - elif sockstate == SOCKET_TOO_LARGE_FOR_SELECT: - raise ssl_error(space, - "Underlying socket too large for select().") - elif sockstate == SOCKET_IS_NONBLOCKING: - break - - if err == SSL_ERROR_WANT_READ or err == SSL_ERROR_WANT_WRITE: - continue - else: - break - - if ret <= 0: - raise _ssl_seterror(space, self, ret) - - if self.peer_cert: - libssl_X509_free(self.peer_cert) - self.peer_cert = libssl_SSL_get_peer_certificate(self.ssl) - self.handshake_done = True - - def shutdown(self, space): - # Guard against closed socket - w_fileno = space.call_method(self.w_socket, "fileno") - if space.int_w(w_fileno) < 0: - raise ssl_error(space, "Underlying socket has been closed") - - self._refresh_nonblocking(space) - - zeros = 0 - while True: - # Disable read-ahead so that unwrap can work correctly. - # Otherwise OpenSSL might read in too much data, - # eating clear text data that happens to be - # transmitted after the SSL shutdown. - # Should be safe to call repeatedly everytime this - # function is used and the shutdown_seen_zero != 0 - # condition is met. - if self.shutdown_seen_zero: - libssl_SSL_set_read_ahead(self.ssl, 0) - ret = libssl_SSL_shutdown(self.ssl) - - # if err == 1, a secure shutdown with SSL_shutdown() is complete - if ret > 0: - break - if ret == 0: - # Don't loop endlessly; instead preserve legacy - # behaviour of trying SSL_shutdown() only twice. - # This looks necessary for OpenSSL < 0.9.8m - zeros += 1 - if zeros > 1: - break - # Shutdown was sent, now try receiving - self.shutdown_seen_zero = True - continue - - # Possibly retry shutdown until timeout or failure - ssl_err = libssl_SSL_get_error(self.ssl, ret) - if ssl_err == SSL_ERROR_WANT_READ: - sockstate = checkwait(space, self.w_socket, False) - elif ssl_err == SSL_ERROR_WANT_WRITE: - sockstate = checkwait(space, self.w_socket, True) - else: - break - - if sockstate == SOCKET_HAS_TIMED_OUT: - if ssl_err == SSL_ERROR_WANT_READ: - raise ssl_error(space, "The read operation timed out") - else: - raise ssl_error(space, "The write operation timed out") - elif sockstate == SOCKET_TOO_LARGE_FOR_SELECT: - raise ssl_error(space, - "Underlying socket too large for select().") - elif sockstate != SOCKET_OPERATION_OK: - # Retain the SSL error code - break - - if ret < 0: - raise _ssl_seterror(space, self, ret) - - return self.w_socket - - def cipher(self, space): - if not self.ssl: - return space.w_None - current = libssl_SSL_get_current_cipher(self.ssl) - if not current: - return space.w_None - - name = libssl_SSL_CIPHER_get_name(current) - w_name = space.newtext(rffi.charp2str(name)) if name else space.w_None - - proto = libssl_SSL_CIPHER_get_version(current) - w_proto = space.newtext(rffi.charp2str(proto)) if proto else space.w_None - - bits = libssl_SSL_CIPHER_get_bits(current, - lltype.nullptr(rffi.INTP.TO)) - w_bits = space.newint(bits) - return space.newtuple([w_name, w_proto, w_bits]) - - @unwrap_spec(der=bool) - def peer_certificate(self, space, der=False): - """peer_certificate([der=False]) -> certificate - - Returns the certificate for the peer. If no certificate was - provided, returns None. If a certificate was provided, but not - validated, returns an empty dictionary. Otherwise returns a - dict containing information about the peer certificate. - - If the optional argument is True, returns a DER-encoded copy of - the peer certificate, or None if no certificate was provided. - This will return the certificate even if it wasn't validated. - """ - if not self.handshake_done: - raise oefmt(space.w_ValueError, "handshake not done yet") - if not self.peer_cert: - return space.w_None - - if der: - # return cert in DER-encoded format - return _certificate_to_der(space, self.peer_cert) - else: - verification = libssl_SSL_CTX_get_verify_mode( - libssl_SSL_get_SSL_CTX(self.ssl)) - if not verification & SSL_VERIFY_PEER: - return space.newdict() - else: - return _decode_certificate(space, self.peer_cert) - - def selected_npn_protocol(self, space): - if not HAS_NPN: - raise oefmt(space.w_NotImplementedError, - "The NPN extension requires OpenSSL 1.0.1 or later.") - with lltype.scoped_alloc(rffi.CCHARPP.TO, 1) as out_ptr: - with lltype.scoped_alloc(rffi.UINTP.TO, 1) as len_ptr: - libssl_SSL_get0_next_proto_negotiated(self.ssl, - out_ptr, len_ptr) - if out_ptr[0]: - return space.newtext( - rffi.charpsize2str(out_ptr[0], intmask(len_ptr[0]))) - - def selected_alpn_protocol(self, space): - if not HAS_ALPN: - raise oefmt(space.w_NotImplementedError, - "The ALPN extension requires OpenSSL 1.0.2 or later.") - with lltype.scoped_alloc(rffi.CCHARPP.TO, 1) as out_ptr: - with lltype.scoped_alloc(rffi.UINTP.TO, 1) as len_ptr: - libssl_SSL_get0_alpn_selected(self.ssl, - out_ptr, len_ptr) - if out_ptr[0]: - return space.newtext( - rffi.charpsize2str(out_ptr[0], intmask(len_ptr[0]))) - - def compression_w(self, space): - if not self.ssl: - return space.w_None - comp_method = libssl_SSL_get_current_compression(self.ssl) - if not comp_method: - return space.w_None - method_type = intmask(libssl_COMP_get_type(comp_method)) - if method_type == NID_undef: - return space.w_None - short_name = libssl_COMP_get_name(comp_method) - if not short_name: - return space.w_None - return space.newtext(rffi.charp2str(short_name)) - - def version_w(self, space): - if not self.ssl: - return space.w_None - version = libssl_SSL_get_version(self.ssl) - if not version: - return space.w_None - return space.newtext(rffi.charp2str(version)) - - def tls_unique_cb_w(self, space): - """Returns the 'tls-unique' channel binding data, as defined by RFC 5929. - If the TLS handshake is not yet complete, None is returned""" - - # In case of 'tls-unique' it will be 12 bytes for TLS, 36 - # bytes for older SSL, but let's be safe - CB_MAXLEN = 128 - - with lltype.scoped_alloc(rffi.CCHARP.TO, CB_MAXLEN) as buf: - if (libssl_SSL_session_reused(self.ssl) ^ - (self.socket_type == PY_SSL_CLIENT)): - # if session is resumed XOR we are the client - length = libssl_SSL_get_finished(self.ssl, buf, CB_MAXLEN) - else: - # if a new session XOR we are the server - length = libssl_SSL_get_peer_finished(self.ssl, buf, CB_MAXLEN) - - if length > 0: - return space.newbytes(rffi.charpsize2str(buf, intmask(length))) - - def descr_get_context(self, space): - return self.w_ctx - - def descr_set_context(self, space, w_ctx): - ctx = space.interp_w(_SSLContext, w_ctx) - if not HAS_SNI: - raise oefmt(space.w_NotImplementedError, - "setting a socket's context " - "is not supported by your OpenSSL library") - self.w_ctx = w_ctx - libssl_SSL_set_SSL_CTX(self.ssl, ctx.ctx) - - -_SSLSocket.typedef = TypeDef( - "_ssl._SSLSocket", - - do_handshake=interp2app(_SSLSocket.do_handshake), - write=interp2app(_SSLSocket.write), - read=interp2app(_SSLSocket.read), - pending=interp2app(_SSLSocket.pending), - peer_certificate=interp2app(_SSLSocket.peer_certificate), - cipher=interp2app(_SSLSocket.cipher), - shutdown=interp2app(_SSLSocket.shutdown), - selected_npn_protocol = interp2app(_SSLSocket.selected_npn_protocol), - selected_alpn_protocol = interp2app(_SSLSocket.selected_alpn_protocol), - compression = interp2app(_SSLSocket.compression_w), - version = interp2app(_SSLSocket.version_w), - tls_unique_cb = interp2app(_SSLSocket.tls_unique_cb_w), - context=GetSetProperty(_SSLSocket.descr_get_context, - _SSLSocket.descr_set_context), -) - -def _certificate_to_der(space, certificate): - with lltype.scoped_alloc(rffi.CCHARPP.TO, 1) as buf_ptr: - buf_ptr[0] = lltype.nullptr(rffi.CCHARP.TO) - length = libssl_i2d_X509(certificate, buf_ptr) - if length < 0: - raise _ssl_seterror(space, None, 0) - try: - return space.newbytes(rffi.charpsize2str(buf_ptr[0], length)) - finally: - libssl_OPENSSL_free(buf_ptr[0]) - -def _decode_certificate(space, certificate): - w_retval = space.newdict() - - w_peer = _create_tuple_for_X509_NAME( - space, libssl_X509_get_subject_name(certificate)) - space.setitem(w_retval, space.newtext("subject"), w_peer) - - w_issuer = _create_tuple_for_X509_NAME( - space, libssl_X509_get_issuer_name(certificate)) - space.setitem(w_retval, space.newtext("issuer"), w_issuer) - - space.setitem(w_retval, space.newtext("version"), - space.newint(libssl_X509_get_version(certificate) + 1)) - - biobuf = libssl_BIO_new(libssl_BIO_s_mem()) - try: - - libssl_BIO_reset(biobuf) - serialNumber = libssl_X509_get_serialNumber(certificate) - libssl_i2a_ASN1_INTEGER(biobuf, serialNumber) - # should not exceed 20 octets, 160 bits, so buf is big enough - with lltype.scoped_alloc(rffi.CCHARP.TO, 100) as buf: - length = libssl_BIO_gets(biobuf, buf, 99) - if length < 0: - raise _ssl_seterror(space, None, length) - - w_serial = space.newtext(rffi.charpsize2str(buf, length)) - space.setitem(w_retval, space.newtext("serialNumber"), w_serial) - - libssl_BIO_reset(biobuf) - notBefore = libssl_X509_get_notBefore(certificate) - libssl_ASN1_TIME_print(biobuf, notBefore) - with lltype.scoped_alloc(rffi.CCHARP.TO, 100) as buf: - length = libssl_BIO_gets(biobuf, buf, 99) - if length < 0: - raise _ssl_seterror(space, None, length) - w_date = space.newtext(rffi.charpsize2str(buf, length)) - space.setitem(w_retval, space.newtext("notBefore"), w_date) - - libssl_BIO_reset(biobuf) - notAfter = libssl_X509_get_notAfter(certificate) - libssl_ASN1_TIME_print(biobuf, notAfter) - with lltype.scoped_alloc(rffi.CCHARP.TO, 100) as buf: - length = libssl_BIO_gets(biobuf, buf, 99) - if length < 0: - raise _ssl_seterror(space, None, length) - w_date = space.newtext(rffi.charpsize2str(buf, length)) - space.setitem(w_retval, space.newtext("notAfter"), w_date) - finally: - libssl_BIO_free(biobuf) - - # Now look for subjectAltName - w_alt_names = _get_peer_alt_names(space, certificate) - if w_alt_names is not space.w_None: - space.setitem(w_retval, space.newtext("subjectAltName"), w_alt_names) - - # Authority Information Access: OCSP URIs - w_ocsp = _get_aia_uri(space, certificate, NID_ad_OCSP) - if not space.is_none(w_ocsp): - space.setitem(w_retval, space.newtext("OCSP"), w_ocsp) - w_issuers = _get_aia_uri(space, certificate, NID_ad_ca_issuers) - if not space.is_none(w_issuers): - space.setitem(w_retval, space.newtext("caIssuers"), w_issuers) - - # CDP (CRL distribution points) - w_cdp = _get_crl_dp(space, certificate) - if not space.is_none(w_cdp): - space.setitem(w_retval, space.newtext("crlDistributionPoints"), w_cdp) - - return w_retval - - -def _create_tuple_for_X509_NAME(space, xname): - entry_count = libssl_X509_NAME_entry_count(xname) - dn_w = [] - rdn_w = [] - rdn_level = -1 - for index in range(entry_count): - entry = libssl_X509_NAME_get_entry(xname, index) - # check to see if we've gotten to a new RDN - entry_level = intmask(libssl_X509_NAME_ENTRY_set(entry)) - if rdn_level >= 0: - if rdn_level != entry_level: - # yes, new RDN - # add old RDN to DN - dn_w.append(space.newtuple(list(rdn_w))) - rdn_w = [] - rdn_level = entry_level - - # Now add this attribute to the current RDN - name = libssl_X509_NAME_ENTRY_get_object(entry) - value = libssl_X509_NAME_ENTRY_get_data(entry) - attr = _create_tuple_for_attribute(space, name, value) - rdn_w.append(attr) - - # Now, there is typically a dangling RDN - if rdn_w: - dn_w.append(space.newtuple(list(rdn_w))) - return space.newtuple(list(dn_w)) - - -def _get_peer_alt_names(space, certificate): - # this code follows the procedure outlined in - # OpenSSL's crypto/x509v3/v3_prn.c:X509v3_EXT_print() - # function to extract the STACK_OF(GENERAL_NAME), - # then iterates through the stack to add the - # names. - - if not certificate: - return space.w_None - - # get a memory buffer - biobuf = libssl_BIO_new(libssl_BIO_s_mem()) - - try: - alt_names_w = [] - i = -1 - while True: - i = libssl_X509_get_ext_by_NID( - certificate, NID_subject_alt_name, i) - if i < 0: - break - - # now decode the altName - ext = libssl_X509_get_ext(certificate, i) - method = libssl_X509V3_EXT_get(ext) - if not method: - raise ssl_error(space, - "No method for internalizing subjectAltName!'") - - with lltype.scoped_alloc(rffi.CCHARPP.TO, 1) as p_ptr: - ext_value = libssl_X509_EXTENSION_get_data(ext) - p_ptr[0] = ext_value.c_data - length = intmask(ext_value.c_length) - null = lltype.nullptr(rffi.VOIDP.TO) - if method[0].c_it: - names = rffi.cast(GENERAL_NAMES, libssl_ASN1_item_d2i( - null, p_ptr, length, - libssl_ASN1_ITEM_ptr(method[0].c_it))) - else: - names = rffi.cast(GENERAL_NAMES, method[0].c_d2i( - null, p_ptr, length)) - - try: - for j in range(libssl_sk_GENERAL_NAME_num(names)): - # Get a rendering of each name in the set of names - - name = libssl_sk_GENERAL_NAME_value(names, j) - gntype = intmask(name.c_type) - if gntype == GEN_DIRNAME: - # we special-case DirName as a tuple of tuples of - # attributes - dirname = libssl_pypy_GENERAL_NAME_dirn(name) - w_t = space.newtuple([ - space.newtext("DirName"), - _create_tuple_for_X509_NAME(space, dirname) - ]) - elif gntype in (GEN_EMAIL, GEN_DNS, GEN_URI): - # GENERAL_NAME_print() doesn't handle NULL bytes in - # ASN1_string correctly, CVE-2013-4238 - if gntype == GEN_EMAIL: - v = space.newtext("email") - elif gntype == GEN_DNS: - v = space.newtext("DNS") - elif gntype == GEN_URI: - v = space.newtext("URI") - else: - assert False - as_ = libssl_pypy_GENERAL_NAME_dirn(name) - as_ = rffi.cast(ASN1_STRING, as_) - buf = libssl_ASN1_STRING_data(as_) - length = libssl_ASN1_STRING_length(as_) - w_t = space.newtuple([ - v, space.newtext(rffi.charpsize2str(buf, length))]) - elif gntype == GEN_RID: - with lltype.scoped_alloc(rffi.CCHARP.TO, 2048) as buf: - d_rid = libssl_pypy_GENERAL_NAME_rid(name) - length = libssl_i2t_ASN1_OBJECT(buf, 2047, d_rid) - if length < 0: - raise _ssl_seterror(space, None, 0) - elif length >= 2048: - v = "" - else: - v = rffi.charpsize2str(buf, length) - w_t = space.newtuple([ - space.newtext("Registered ID"), - space.call_function(space.w_unicode, - space.newtext(v))]) - else: - # for everything else, we use the OpenSSL print form - if gntype not in (GEN_OTHERNAME, GEN_X400, GEN_EDIPARTY, - GEN_IPADD): - space.warn(space.newtext("Unknown general name type"), - space.w_RuntimeWarning) - libssl_BIO_reset(biobuf) - libssl_GENERAL_NAME_print(biobuf, name) - with lltype.scoped_alloc(rffi.CCHARP.TO, 2048) as buf: - length = libssl_BIO_gets(biobuf, buf, 2047) - if length < 0: - raise _ssl_seterror(space, None, 0) - - v = rffi.charpsize2str(buf, length) - if ':' not in v: - raise oefmt(space.w_ValueError, - "Invalid value %s", v) - v1, v2 = v.split(':', 1) - w_t = space.newtuple([space.newtext(v1), - space.newtext(v2)]) - - alt_names_w.append(w_t) - finally: - libssl_pypy_GENERAL_NAME_pop_free(names) - finally: - libssl_BIO_free(biobuf) - - if alt_names_w: - return space.newtuple(list(alt_names_w)) - else: - return space.w_None - - -def _create_tuple_for_attribute(space, name, value): - with lltype.scoped_alloc(rffi.CCHARP.TO, X509_NAME_MAXLEN) as buf: - length = libssl_OBJ_obj2txt(buf, X509_NAME_MAXLEN, name, 0) - if length < 0: - raise _ssl_seterror(space, None, 0) - w_name = space.newtext(rffi.charpsize2str(buf, length)) - - with lltype.scoped_alloc(rffi.CCHARPP.TO, 1) as buf_ptr: - length = libssl_ASN1_STRING_to_UTF8(buf_ptr, value) - if length < 0: - raise _ssl_seterror(space, None, 0) - try: - w_value = space.newbytes(rffi.charpsize2str(buf_ptr[0], length)) - w_value = space.call_method(w_value, "decode", space.newtext("utf-8")) - finally: - libssl_OPENSSL_free(buf_ptr[0]) - - return space.newtuple([w_name, w_value]) - - -def _get_aia_uri(space, certificate, nid): - info = rffi.cast(AUTHORITY_INFO_ACCESS, libssl_X509_get_ext_d2i( - certificate, NID_info_access, None, None)) - try: - if not info or libssl_sk_ACCESS_DESCRIPTION_num(info) == 0: - return - - result_w = [] - for i in range(libssl_sk_ACCESS_DESCRIPTION_num(info)): - ad = libssl_sk_ACCESS_DESCRIPTION_value(info, i) - if libssl_OBJ_obj2nid(ad[0].c_method) != nid: - continue - - name = ad[0].c_location - gntype = intmask(name.c_type) - if gntype != GEN_URI: - continue - uri = libssl_pypy_GENERAL_NAME_uri(name) - length = intmask(uri.c_length) - s_uri = rffi.charpsize2str(uri.c_data, length) - result_w.append(space.newtext(s_uri)) - return space.newtuple(result_w[:]) - finally: - libssl_AUTHORITY_INFO_ACCESS_free(info) - -def _get_crl_dp(space, certificate): - dps = rffi.cast(stack_st_DIST_POINT, libssl_X509_get_ext_d2i( - certificate, NID_crl_distribution_points, None, None)) - if not dps: - return None - - try: - cdp_w = [] - for i in range(libssl_sk_DIST_POINT_num(dps)): - dp = libssl_sk_DIST_POINT_value(dps, i) - gns = libssl_pypy_DIST_POINT_fullname(dp) - - for j in range(libssl_sk_GENERAL_NAME_num(gns)): - name = libssl_sk_GENERAL_NAME_value(gns, j) - gntype = intmask(name.c_type) - if gntype != GEN_URI: - continue - uri = libssl_pypy_GENERAL_NAME_uri(name) - length = intmask(uri.c_length) - s_uri = rffi.charpsize2str(uri.c_data, length) - cdp_w.append(space.newtext(s_uri)) - finally: - libssl_CRL_DIST_POINTS_free(dps) - return space.newtuple(cdp_w[:]) - -def checkwait(space, w_sock, writing): - """If the socket has a timeout, do a select()/poll() on the socket. - The argument writing indicates the direction. - Returns one of the possibilities in the timeout_state enum (above).""" - - w_timeout = space.call_method(w_sock, "gettimeout") - if space.is_w(w_timeout, space.w_None): - return SOCKET_IS_BLOCKING - elif space.float_w(w_timeout) == 0.0: - return SOCKET_IS_NONBLOCKING - sock_timeout = space.float_w(w_timeout) - - sock_fd = space.int_w(space.call_method(w_sock, "fileno")) - - # guard against closed socket - if sock_fd < 0: - return SOCKET_HAS_BEEN_CLOSED - - # see if the socket is ready - - # Prefer poll, if available, since you can poll() any fd - # which can't be done with select(). - if HAVE_RPOLL: - if writing: - fddict = {sock_fd: rpoll.POLLOUT} - else: - fddict = {sock_fd: rpoll.POLLIN} - - # socket's timeout is in seconds, poll's timeout in ms - timeout = int(sock_timeout * 1000 + 0.5) - try: - ready = rpoll.poll(fddict, timeout) - except rpoll.PollError as e: - message = e.get_msg() - raise ssl_error(space, message, e.errno) - else: - if MAX_FD_SIZE is not None and sock_fd >= MAX_FD_SIZE: - return SOCKET_TOO_LARGE_FOR_SELECT - - try: - if writing: - r, w, e = rpoll.select([], [sock_fd], [], sock_timeout) - ready = w - else: - r, w, e = rpoll.select([sock_fd], [], [], sock_timeout) - ready = r - except rpoll.SelectError as e: - message = e.get_msg() - raise ssl_error(space, message, e.errno) - if ready: - return SOCKET_OPERATION_OK - else: - return SOCKET_HAS_TIMED_OUT - - -def _ssl_seterror(space, ss, ret): - assert ret <= 0 - - errcode = libssl_ERR_peek_last_error() - - if ss is None: - return ssl_error(space, None, errcode=errcode) - elif ss.ssl: - err = libssl_SSL_get_error(ss.ssl, ret) - else: - err = SSL_ERROR_SSL - w_errtype = None - errstr = "" - errval = 0 - - if err == SSL_ERROR_ZERO_RETURN: - w_errtype = get_exception_class(space, 'w_sslzeroreturnerror') - errstr = "TLS/SSL connection has been closed" - errval = PY_SSL_ERROR_ZERO_RETURN - elif err == SSL_ERROR_WANT_READ: - w_errtype = get_exception_class(space, 'w_sslwantreaderror') - errstr = "The operation did not complete (read)" - errval = PY_SSL_ERROR_WANT_READ - elif err == SSL_ERROR_WANT_WRITE: - w_errtype = get_exception_class(space, 'w_sslwantwriteerror') - errstr = "The operation did not complete (write)" - errval = PY_SSL_ERROR_WANT_WRITE - elif err == SSL_ERROR_WANT_X509_LOOKUP: - errstr = "The operation did not complete (X509 lookup)" - errval = PY_SSL_ERROR_WANT_X509_LOOKUP - elif err == SSL_ERROR_WANT_CONNECT: - errstr = "The operation did not complete (connect)" - errval = PY_SSL_ERROR_WANT_CONNECT - elif err == SSL_ERROR_SYSCALL: - e = libssl_ERR_get_error() - if e == 0: - if ret == 0 or space.is_w(ss.w_socket, space.w_None): - errstr = "EOF occurred in violation of protocol" - errval = PY_SSL_ERROR_EOF - elif ret == -1: - # the underlying BIO reported an I/0 error - error = rsocket.last_error() - return interp_socket.converted_error(space, error) - else: - w_errtype = get_exception_class(space, 'w_sslsyscallerror') - errstr = "Some I/O error occurred" - errval = PY_SSL_ERROR_SYSCALL - else: - errstr = rffi.charp2str(libssl_ERR_error_string(e, None)) - errval = PY_SSL_ERROR_SYSCALL - elif err == SSL_ERROR_SSL: - errval = PY_SSL_ERROR_SSL - if errcode != 0: - errstr = rffi.charp2str(libssl_ERR_error_string(errcode, None)) - else: - errstr = "A failure in the SSL library occurred" - else: - errstr = "Invalid error code" - errval = PY_SSL_ERROR_INVALID_ERROR_CODE - - return ssl_error(space, errstr, errval, w_errtype=w_errtype, - errcode=errcode) - -def SSLError_descr_str(space, w_exc): - w_strerror = space.getattr(w_exc, space.newtext("strerror")) - if not space.is_none(w_strerror): - return w_strerror - return space.str(space.getattr(w_exc, space.newtext("args"))) - - -class Cache: - def __init__(self, space): - w_socketerror = interp_socket.get_error(space, "error") - self.w_sslerror = space.new_exception_class( - "_ssl.SSLError", w_socketerror) - space.setattr(self.w_sslerror, space.newtext('__str__'), - interp2app(SSLError_descr_str).spacebind(space)) - self.w_sslzeroreturnerror = space.new_exception_class( - "_ssl.SSLZeroReturnError", self.w_sslerror) - self.w_sslwantreaderror = space.new_exception_class( - "_ssl.SSLWantReadError", self.w_sslerror) - self.w_sslwantwriteerror = space.new_exception_class( - "_ssl.SSLWantWriteError", self.w_sslerror) - self.w_sslsyscallerror = space.new_exception_class( - "_ssl.SSLSyscallError", self.w_sslerror) - self.w_ssleoferror = space.new_exception_class( - "_ssl.SSLEOFError", self.w_sslerror) - - -@specialize.memo() -def get_exception_class(space, name): - return getattr(space.fromcache(Cache), name) - - -@unwrap_spec(filename='text') -def _test_decode_cert(space, filename): - cert = libssl_BIO_new(libssl_BIO_s_file()) - if not cert: - raise ssl_error(space, "Can't malloc memory to read file") - - try: - if libssl_BIO_read_filename(cert, filename) <= 0: - raise ssl_error(space, "Can't open file") - - x = libssl_PEM_read_bio_X509_AUX(cert, None, None, None) - if not x: - raise ssl_error(space, "Error decoding PEM-encoded file") - - try: - return _decode_certificate(space, x) - finally: - libssl_X509_free(x) - finally: - libssl_BIO_free(cert) - - -# Data structure for the password callbacks -class PasswordInfo(object): - w_callable = None - password = None - operationerror = None -PWINFO_STORAGE = {} - -def _password_callback(buf, size, rwflag, userdata): - index = rffi.cast(lltype.Signed, userdata) - pw_info = PWINFO_STORAGE.get(index, None) - if not pw_info: - return rffi.cast(rffi.INT, -1) - space = pw_info.space - password = "" - if pw_info.w_callable: - try: - w_result = space.call_function(pw_info.w_callable) - try: - password = pw_info.space.bufferstr_w(w_result) - except OperationError as e: - if not e.match(space, space.w_TypeError): - raise - raise oefmt(space.w_TypeError, - "password callback must return a string") - except OperationError as e: - pw_info.operationerror = e - return rffi.cast(rffi.INT, -1) - else: - password = pw_info.password - size = widen(size) - if len(password) > size: - pw_info.operationerror = oefmt( - space.w_ValueError, - "password cannot be longer than %d bytes", size) - return rffi.cast(rffi.INT, -1) - for i, c in enumerate(password): - buf[i] = c - return rffi.cast(rffi.INT, len(password)) - -class ServernameCallback(object): - w_ctx = None - space = None -SERVERNAME_CALLBACKS = RWeakValueDictionary(int, ServernameCallback) - -def _servername_callback(ssl, ad, arg): - struct = SERVERNAME_CALLBACKS.get(rffi.cast(lltype.Signed, arg)) - w_ctx = struct.w_ctx - space = struct.space - # annotation: ensures that we ignore the case 'space is None' - # (it would propagate to a few methods like errorstr()) - assert w_ctx is not None and space is not None - w_callback = struct.w_set_hostname - if not w_ctx.servername_callback: - # Possible race condition. - return rffi.cast(rffi.INT, SSL_TLSEXT_ERR_OK) - # The high-level ssl.SSLSocket object - index = rffi.cast(lltype.Signed, libssl_SSL_get_app_data(ssl)) - w_ssl = SOCKET_STORAGE.get(index) - assert isinstance(w_ssl, _SSLSocket) - if w_ssl.ssl_sock_weakref_w is not None: - w_ssl_socket = w_ssl.ssl_sock_weakref_w() - else: - w_ssl_socket = space.w_None - if space.is_none(w_ssl_socket): - ad[0] = rffi.cast(rffi.INT, SSL_AD_INTERNAL_ERROR) - return rffi.cast(rffi.INT, SSL_TLSEXT_ERR_ALERT_FATAL) - - servername = libssl_SSL_get_servername(ssl, TLSEXT_NAMETYPE_host_name) - try: - if not servername: - w_result = space.call_function(w_callback, - w_ssl_socket, space.w_None, w_ctx) - - else: - w_servername = space.newbytes(rffi.charp2str(servername)) - try: - w_servername_idna = space.call_method( - w_servername, 'decode', space.newtext('idna')) - except OperationError as e: - e.write_unraisable(space, "undecodable server name") - ad[0] = rffi.cast(rffi.INT, SSL_AD_INTERNAL_ERROR) - return rffi.cast(rffi.INT, SSL_TLSEXT_ERR_ALERT_FATAL) - - w_result = space.call_function(w_callback, - w_ssl_socket, - w_servername_idna, w_ctx) - except OperationError as e: - e.write_unraisable(space, "in servername callback") - ad[0] = rffi.cast(rffi.INT, SSL_AD_HANDSHAKE_FAILURE) - return rffi.cast(rffi.INT, SSL_TLSEXT_ERR_ALERT_FATAL) - - if space.is_none(w_result): - return rffi.cast(rffi.INT, SSL_TLSEXT_ERR_OK) - else: - try: - ad[0] = rffi.cast(rffi.INT, space.int_w(w_result)) - except OperationError as e: - e.write_unraisable(space, "servername callback result") - ad[0] = rffi.cast(rffi.INT, SSL_AD_INTERNAL_ERROR) - return rffi.cast(rffi.INT, SSL_TLSEXT_ERR_ALERT_FATAL) - - -class _SSLContext(W_Root): - @staticmethod - @unwrap_spec(protocol=int) - def descr_new(space, w_subtype, protocol): - if protocol == PY_SSL_VERSION_TLS: - method = libssl_TLS_method() - elif protocol == PY_SSL_VERSION_TLS1: - method = libssl_TLSv1_method() - elif protocol == PY_SSL_VERSION_SSL3 and not OPENSSL_NO_SSL3: - method = libssl_SSLv3_method() - elif protocol == PY_SSL_VERSION_SSL2 and not OPENSSL_NO_SSL2: - method = libssl_SSLv2_method() - elif protocol == PY_SSL_VERSION_TLS1_1 and HAVE_TLSv1_2: - method = libssl_TLSv1_1_method() - elif protocol == PY_SSL_VERSION_TLS1_2 and HAVE_TLSv1_2: - method = libssl_TLSv1_2_method() - else: - raise oefmt(space.w_ValueError, "invalid protocol version") - ctx = libssl_SSL_CTX_new(method) - if not ctx: - raise ssl_error(space, "failed to allocate SSL context") - - self = space.allocate_instance(_SSLContext, w_subtype) - assert isinstance(self, _SSLContext) - rgc.add_memory_pressure(10 * 1024 * 1024, self) - self.ctx = ctx - self.check_hostname = False - self.register_finalizer(space) - options = SSL_OP_ALL & ~SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS - if protocol != PY_SSL_VERSION_SSL2: - options |= SSL_OP_NO_SSLv2 - if protocol != PY_SSL_VERSION_SSL3: - options |= SSL_OP_NO_SSLv3 - libssl_SSL_CTX_set_options(ctx, options) - - if not OPENSSL_NO_ECDH: - # Allow automatic ECDH curve selection (on - # OpenSSL 1.0.2+), or use prime256v1 by default. - # This is Apache mod_ssl's initialization - # policy, so we should be safe. - # OpenSSL 1.1 has it enabled by default. - if libssl_SSL_CTX_set_ecdh_auto: - libssl_SSL_CTX_set_ecdh_auto(self.ctx, 1) - else: - key = libssl_EC_KEY_new_by_curve_name(NID_X9_62_prime256v1) - if not key: - raise _ssl_seterror(space, None, 0) - try: - libssl_SSL_CTX_set_tmp_ecdh(self.ctx, key) - finally: - libssl_EC_KEY_free(key) - - return self - - def _finalize_(self): - ctx = self.ctx - if ctx: - self.ctx = lltype.nullptr(SSL_CTX.TO) - libssl_SSL_CTX_free(ctx) - - @unwrap_spec(server_side=int) - def descr_wrap_socket(self, space, w_sock, server_side, w_server_hostname=None, w_ssl_sock=None): - return _SSLSocket.descr_new(space, self, w_sock, server_side, w_server_hostname, w_ssl_sock) - - @unwrap_spec(cipherlist='text') - def descr_set_ciphers(self, space, cipherlist): - ret = libssl_SSL_CTX_set_cipher_list(self.ctx, cipherlist) - if ret == 0: - libssl_ERR_clear_error() - raise ssl_error(space, "No cipher can be selected.") - - def session_stats_w(self, space): - w_stats = space.newdict() - for name, ssl_func in SSL_CTX_STATS: - w_value = space.newint(ssl_func(self.ctx)) - space.setitem_str(w_stats, name, w_value) - return w_stats - - def descr_set_default_verify_paths(self, space): - if not libssl_SSL_CTX_set_default_verify_paths(self.ctx): - raise ssl_error(space, "") - - def descr_get_options(self, space): - return space.newlong(libssl_SSL_CTX_get_options(self.ctx)) - - def descr_set_options(self, space, w_new_opts): - new_opts = space.int_w(w_new_opts) - opts = libssl_SSL_CTX_get_options(self.ctx) - clear = opts & ~new_opts - set = ~opts & new_opts - if clear: - if HAVE_SSL_CTX_CLEAR_OPTIONS: - libssl_SSL_CTX_clear_options(self.ctx, clear) - else: - raise oefmt(space.w_ValueError, - "can't clear options before OpenSSL 0.9.8m") - if set: - libssl_SSL_CTX_set_options(self.ctx, set) - - def descr_get_verify_mode(self, space): - mode = libssl_SSL_CTX_get_verify_mode(self.ctx) - if mode == SSL_VERIFY_NONE: - return space.newlong(PY_SSL_CERT_NONE) - elif mode == SSL_VERIFY_PEER: - return space.newlong(PY_SSL_CERT_OPTIONAL) - elif mode == SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT: - return space.newlong(PY_SSL_CERT_REQUIRED) - raise ssl_error(space, "invalid return value from SSL_CTX_get_verify_mode") - - def descr_set_verify_mode(self, space, w_mode): - n = space.int_w(w_mode) - if n == PY_SSL_CERT_NONE: - mode = SSL_VERIFY_NONE - elif n == PY_SSL_CERT_OPTIONAL: - mode = SSL_VERIFY_PEER - elif n == PY_SSL_CERT_REQUIRED: - mode = SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT - else: - raise oefmt(space.w_ValueError, - "invalid value for verify_mode") - if mode == SSL_VERIFY_NONE and self.check_hostname: - raise oefmt(space.w_ValueError, - "Cannot set verify_mode to CERT_NONE when " - "check_hostname is enabled.") - libssl_SSL_CTX_set_verify(self.ctx, mode, None) - - def descr_get_verify_flags(self, space): - store = libssl_SSL_CTX_get_cert_store(self.ctx) - param = libssl_X509_STORE_get0_param(store) - flags = libssl_X509_VERIFY_PARAM_get_flags(param) - return space.newint(flags) - - def descr_set_verify_flags(self, space, w_obj): - new_flags = space.int_w(w_obj) - store = libssl_SSL_CTX_get_cert_store(self.ctx) - param = libssl_X509_STORE_get0_param(store) - flags = libssl_X509_VERIFY_PARAM_get_flags(param) - flags_clear = flags & ~new_flags - flags_set = ~flags & new_flags - if flags_clear and not libssl_X509_VERIFY_PARAM_clear_flags( - param, flags_clear): - raise _ssl_seterror(space, None, 0) - if flags_set and not libssl_X509_VERIFY_PARAM_set_flags( - param, flags_set): - raise _ssl_seterror(space, None, 0) - - def descr_get_check_hostname(self, space): - return space.newbool(self.check_hostname) - - def descr_set_check_hostname(self, space, w_obj): - check_hostname = space.is_true(w_obj) - if check_hostname and libssl_SSL_CTX_get_verify_mode(self.ctx) == SSL_VERIFY_NONE: - raise oefmt(space.w_ValueError, - "check_hostname needs a SSL context with either " - "CERT_OPTIONAL or CERT_REQUIRED") - self.check_hostname = check_hostname - - def load_cert_chain_w(self, space, w_certfile, w_keyfile=None, - w_password=None): - if space.is_none(w_certfile): - certfile = None - else: - certfile = space.text_w(w_certfile) - if space.is_none(w_keyfile): - keyfile = certfile - else: - keyfile = space.text_w(w_keyfile) - pw_info = PasswordInfo() - pw_info.space = space - index = -1 - if not space.is_none(w_password): - index = rthread.get_ident() - PWINFO_STORAGE[index] = pw_info - - if space.is_true(space.callable(w_password)): - pw_info.w_callable = w_password - else: - try: - pw_info.password = space.bufferstr_w(w_password) - except OperationError as e: - if not e.match(space, space.w_TypeError): - raise - raise oefmt(space.w_TypeError, - "password should be a string or callable") - - libssl_SSL_CTX_set_default_passwd_cb( - self.ctx, _password_callback) - libssl_SSL_CTX_set_default_passwd_cb_userdata( - self.ctx, rffi.cast(rffi.VOIDP, index)) - - try: - ret = libssl_SSL_CTX_use_certificate_chain_file(self.ctx, certfile) - if ret != 1: - if pw_info.operationerror: - libssl_ERR_clear_error() - raise pw_info.operationerror - errno = get_saved_errno() - if errno: - libssl_ERR_clear_error() - raise wrap_oserror(space, OSError(errno, ''), - exception_name = 'w_IOError') - else: - raise _ssl_seterror(space, None, -1) - - ret = libssl_SSL_CTX_use_PrivateKey_file(self.ctx, keyfile, - SSL_FILETYPE_PEM) - if ret != 1: - if pw_info.operationerror: - libssl_ERR_clear_error() - raise pw_info.operationerror - errno = get_saved_errno() - if errno: - libssl_ERR_clear_error() - raise wrap_oserror(space, OSError(errno, ''), - exception_name = 'w_IOError') - else: - raise _ssl_seterror(space, None, -1) - - ret = libssl_SSL_CTX_check_private_key(self.ctx) - if ret != 1: - raise _ssl_seterror(space, None, -1) - finally: - if index >= 0: - del PWINFO_STORAGE[index] - libssl_SSL_CTX_set_default_passwd_cb( - self.ctx, lltype.nullptr(pem_password_cb.TO)) - libssl_SSL_CTX_set_default_passwd_cb_userdata( - self.ctx, None) - - @unwrap_spec(filepath='text') - def load_dh_params_w(self, space, filepath): - bio = libssl_BIO_new_file(filepath, "r") - if not bio: - errno = get_saved_errno() - libssl_ERR_clear_error() - raise wrap_oserror(space, OSError(errno, ''), - exception_name = 'w_IOError') - try: - dh = libssl_PEM_read_bio_DHparams(bio, None, None, None) - finally: - libssl_BIO_free(bio) - if not dh: - errno = get_saved_errno() - if errno != 0: - libssl_ERR_clear_error() - raise wrap_oserror(space, OSError(errno, '')) - else: - raise _ssl_seterror(space, None, 0) - try: - if libssl_SSL_CTX_set_tmp_dh(self.ctx, dh) == 0: - raise _ssl_seterror(space, None, 0) - finally: - libssl_DH_free(dh) - - def load_verify_locations_w(self, space, w_cafile=None, w_capath=None, - w_cadata=None): - if space.is_none(w_cafile): - cafile = None - else: - cafile = space.text_w(w_cafile) - if space.is_none(w_capath): - capath = None - else: - capath = space.text_w(w_capath) - if space.is_none(w_cadata): - cadata = None - ca_file_type = -1 - else: - if not space.isinstance_w(w_cadata, space.w_unicode): - ca_file_type = SSL_FILETYPE_ASN1 - cadata = space.bufferstr_w(w_cadata) - else: - ca_file_type = SSL_FILETYPE_PEM - w_uni = space.convert_arg_to_w_unicode(w_cadata) - if not w_uni.is_ascii(): - raise oefmt(space.w_TypeError, - "cadata should be a ASCII string or a " - "bytes-like object") - cadata = space.utf8_w(w_uni) - - if cafile is None and capath is None and cadata is None: - raise oefmt(space.w_TypeError, - "cafile and capath cannot be both omitted") - # load from cadata - if cadata is not None: - with rffi.scoped_nonmovingbuffer(cadata) as buf: - self._add_ca_certs(space, buf, len(cadata), ca_file_type) - - # load cafile or capath - if cafile is not None or capath is not None: - ret = libssl_SSL_CTX_load_verify_locations( - self.ctx, cafile, capath) - if ret != 1: - errno = get_saved_errno() - if errno: - libssl_ERR_clear_error() - raise wrap_oserror(space, OSError(errno, ''), - exception_name = 'w_IOError') - else: - raise _ssl_seterror(space, None, -1) - - def _add_ca_certs(self, space, data, size, ca_file_type): - biobuf = libssl_BIO_new_mem_buf(data, size) - if not biobuf: - raise ssl_error(space, "Can't allocate buffer") - try: - store = libssl_SSL_CTX_get_cert_store(self.ctx) - loaded = 0 - while True: - if ca_file_type == SSL_FILETYPE_ASN1: - cert = libssl_d2i_X509_bio( - biobuf, None) - else: - cert = libssl_PEM_read_bio_X509( - biobuf, None, None, None) - if not cert: - break - try: - r = libssl_X509_STORE_add_cert(store, cert) - finally: - libssl_X509_free(cert) - if not r: - err = libssl_ERR_peek_last_error() - if (libssl_ERR_GET_LIB(err) == ERR_LIB_X509 and - libssl_ERR_GET_REASON(err) == - X509_R_CERT_ALREADY_IN_HASH_TABLE): - # cert already in hash table, not an error - libssl_ERR_clear_error() - else: - break - loaded += 1 - - err = libssl_ERR_peek_last_error() - if (ca_file_type == SSL_FILETYPE_ASN1 and - loaded > 0 and - libssl_ERR_GET_LIB(err) == ERR_LIB_ASN1 and - libssl_ERR_GET_REASON(err) == ASN1_R_HEADER_TOO_LONG): - # EOF ASN1 file, not an error - libssl_ERR_clear_error() - elif (ca_file_type == SSL_FILETYPE_PEM and - loaded > 0 and - libssl_ERR_GET_LIB(err) == ERR_LIB_PEM and - libssl_ERR_GET_REASON(err) == PEM_R_NO_START_LINE): - # EOF PEM file, not an error - libssl_ERR_clear_error() - else: - raise _ssl_seterror(space, None, 0) - finally: - libssl_BIO_free(biobuf) - - def cert_store_stats_w(self, space): - store = libssl_SSL_CTX_get_cert_store(self.ctx) - x509 = 0 - x509_ca = 0 - crl = 0 - objs = libssl_X509_STORE_get0_objects(store) - for i in range(libssl_sk_X509_OBJECT_num(objs)): - obj = libssl_sk_X509_OBJECT_value(objs, i) - obj_type = intmask(libssl_X509_OBJECT_get_type(obj)) - if obj_type == X509_LU_X509: - x509 += 1 - if libssl_X509_check_ca( - libssl_X509_OBJECT_get0_X509(obj)): - x509_ca += 1 - elif obj_type == X509_LU_CRL: - crl += 1 - else: - # Ignore X509_LU_FAIL, X509_LU_RETRY, X509_LU_PKEY. - # As far as I can tell they are internal states and never - # stored in a cert store - pass - w_result = space.newdict() - space.setitem(w_result, - space.newtext('x509'), space.newint(x509)) - space.setitem(w_result, - space.newtext('x509_ca'), space.newint(x509_ca)) - space.setitem(w_result, - space.newtext('crl'), space.newint(crl)) - return w_result - - @unwrap_spec(protos='bufferstr') - def set_npn_protocols_w(self, space, protos): - if not HAS_NPN: - raise oefmt(space.w_NotImplementedError, - "The NPN extension requires OpenSSL 1.0.1 or later.") - - self.npn_protocols = SSLNpnProtocols(self.ctx, protos) - - @unwrap_spec(protos='bufferstr') - def set_alpn_protocols_w(self, space, protos): - if not HAS_ALPN: - raise oefmt(space.w_NotImplementedError, - "The ALPN extension requires OpenSSL 1.0.2 or later.") - - self.alpn_protocols = SSLAlpnProtocols(self.ctx, protos) - - def get_ca_certs_w(self, space, w_binary_form=None): - if w_binary_form and space.is_true(w_binary_form): - binary_mode = True - else: - binary_mode = False - rlist = [] - store = libssl_SSL_CTX_get_cert_store(self.ctx) - objs = libssl_X509_STORE_get0_objects(store) - for i in range(libssl_sk_X509_OBJECT_num(objs)): - obj = libssl_sk_X509_OBJECT_value(objs, i) - if intmask(libssl_X509_OBJECT_get_type(obj)) != X509_LU_X509: - # not a x509 cert - continue - # CA for any purpose - cert = libssl_X509_OBJECT_get0_X509(obj) - if not libssl_X509_check_ca(cert): - continue - if binary_mode: - rlist.append(_certificate_to_der(space, cert)) - else: - rlist.append(_decode_certificate(space, cert)) - return space.newlist(rlist) - - @unwrap_spec(name='text') - def set_ecdh_curve_w(self, space, name): - nid = libssl_OBJ_sn2nid(name) - if nid == 0: - raise oefmt(space.w_ValueError, - "unknown elliptic curve name '%s'", name) - key = libssl_EC_KEY_new_by_curve_name(nid) - if not key: - raise _ssl_seterror(space, None, 0) - try: - libssl_SSL_CTX_set_tmp_ecdh(self.ctx, key) - finally: - libssl_EC_KEY_free(key) - - def set_servername_callback_w(self, space, w_callback): - if space.is_none(w_callback): - libssl_SSL_CTX_set_tlsext_servername_callback( - self.ctx, lltype.nullptr(servername_cb.TO)) - self.servername_callback = None - return - if not space.is_true(space.callable(w_callback)): - raise oefmt(space.w_TypeError, "not a callable object") - callback_struct = ServernameCallback() - callback_struct.space = space - callback_struct.w_ctx = self - callback_struct.w_set_hostname = w_callback - self.servername_callback = callback_struct - index = compute_unique_id(self) - SERVERNAME_CALLBACKS.set(index, callback_struct) - libssl_SSL_CTX_set_tlsext_servername_callback( - self.ctx, _servername_callback) - libssl_SSL_CTX_set_tlsext_servername_arg(self.ctx, - rffi.cast(rffi.VOIDP, index)) - -_SSLContext.typedef = TypeDef( - "_ssl._SSLContext", - __new__=interp2app(_SSLContext.descr_new), - _wrap_socket=interp2app(_SSLContext.descr_wrap_socket), - set_ciphers=interp2app(_SSLContext.descr_set_ciphers), - cert_store_stats=interp2app(_SSLContext.cert_store_stats_w), - load_cert_chain=interp2app(_SSLContext.load_cert_chain_w), - load_dh_params=interp2app(_SSLContext.load_dh_params_w), - load_verify_locations=interp2app(_SSLContext.load_verify_locations_w), - session_stats = interp2app(_SSLContext.session_stats_w), - set_default_verify_paths=interp2app(_SSLContext.descr_set_default_verify_paths), - _set_npn_protocols=interp2app(_SSLContext.set_npn_protocols_w), - _set_alpn_protocols=interp2app(_SSLContext.set_alpn_protocols_w), - get_ca_certs=interp2app(_SSLContext.get_ca_certs_w), - set_ecdh_curve=interp2app(_SSLContext.set_ecdh_curve_w), - set_servername_callback=interp2app(_SSLContext.set_servername_callback_w), - - options=GetSetProperty(_SSLContext.descr_get_options, - _SSLContext.descr_set_options), - verify_mode=GetSetProperty(_SSLContext.descr_get_verify_mode, - _SSLContext.descr_set_verify_mode), - verify_flags=GetSetProperty(_SSLContext.descr_get_verify_flags, - _SSLContext.descr_set_verify_flags), - check_hostname=GetSetProperty(_SSLContext.descr_get_check_hostname, - _SSLContext.descr_set_check_hostname), -) - - -def _asn1obj2py(space, obj): - nid = libssl_OBJ_obj2nid(obj) - if nid == NID_undef: - raise oefmt(space.w_ValueError, "Unknown object") - with rffi.scoped_alloc_buffer(100) as buf: - buflen = libssl_OBJ_obj2txt(buf.raw, 100, obj, 1) - if buflen < 0: - raise _ssl_seterror(space, None, 0) - if buflen: - w_buf = space.newtext(buf.str(buflen)) - else: - w_buf = space.w_None - w_sn = space.newtext(rffi.charp2str(libssl_OBJ_nid2sn(nid))) - w_ln = space.newtext(rffi.charp2str(libssl_OBJ_nid2ln(nid))) - return space.newtuple([space.newint(nid), w_sn, w_ln, w_buf]) - - -@unwrap_spec(txt='bytes', name=bool) -def txt2obj(space, txt, name=False): - obj = libssl_OBJ_txt2obj(txt, not name) - if not obj: - raise oefmt(space.w_ValueError, "unknown object '%s'", txt) - try: - w_result = _asn1obj2py(space, obj) - finally: - libssl_ASN1_OBJECT_free(obj) - return w_result - - -@unwrap_spec(nid=int) -def nid2obj(space, nid): - if nid < NID_undef: - raise oefmt(space.w_ValueError, "NID must be positive") - obj = libssl_OBJ_nid2obj(nid) - if not obj: - raise oefmt(space.w_ValueError, "unknown NID %d", nid) - try: - w_result = _asn1obj2py(space, obj) - finally: - libssl_ASN1_OBJECT_free(obj) - return w_result - - -def w_convert_path(space, path): - if not path: - return space.w_None - else: - return space.newbytes(rffi.charp2str(path)) - -def get_default_verify_paths(space): - return space.newtuple([ - w_convert_path(space, libssl_X509_get_default_cert_file_env()), - w_convert_path(space, libssl_X509_get_default_cert_file()), - w_convert_path(space, libssl_X509_get_default_cert_dir_env()), - w_convert_path(space, libssl_X509_get_default_cert_dir()), - ]) diff -Nru pypy-7.1.1+dfsg/pypy/module/_ssl/interp_win32.py pypy-7.3.1+dfsg/pypy/module/_ssl/interp_win32.py --- pypy-7.1.1+dfsg/pypy/module/_ssl/interp_win32.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_ssl/interp_win32.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,180 +0,0 @@ -from rpython.rlib import rwin32 -from rpython.rtyper.lltypesystem import rffi, lltype -from rpython.rtyper.tool import rffi_platform -from rpython.translator.tool.cbuild import ExternalCompilationInfo -from pypy.interpreter.gateway import unwrap_spec -from pypy.interpreter.error import wrap_windowserror -from rpython.rlib.rarithmetic import intmask -eci = ExternalCompilationInfo( - includes = ['windows.h', 'wincrypt.h'], - libraries = ['crypt32'], -) - -class CConfig: - _compilation_info_ = eci - - X509_ASN_ENCODING = rffi_platform.ConstantInteger('X509_ASN_ENCODING') - PKCS_7_ASN_ENCODING = rffi_platform.ConstantInteger('PKCS_7_ASN_ENCODING') - CERT_FIND_PROP_ONLY_ENHKEY_USAGE_FLAG = rffi_platform.ConstantInteger('CERT_FIND_PROP_ONLY_ENHKEY_USAGE_FLAG') - CERT_FIND_EXT_ONLY_ENHKEY_USAGE_FLAG = rffi_platform.ConstantInteger('CERT_FIND_EXT_ONLY_ENHKEY_USAGE_FLAG') - CRYPT_E_NOT_FOUND = rffi_platform.ConstantInteger('CRYPT_E_NOT_FOUND') - - CERT_ENHKEY_USAGE = rffi_platform.Struct( - 'CERT_ENHKEY_USAGE', [('cUsageIdentifier', rwin32.DWORD), - ('rgpszUsageIdentifier', rffi.CCHARPP)]) - CERT_CONTEXT = rffi_platform.Struct( - 'CERT_CONTEXT', [('pbCertEncoded', rffi.CCHARP), - ('cbCertEncoded', rwin32.DWORD), - ('dwCertEncodingType', rwin32.DWORD)]) - CRL_CONTEXT = rffi_platform.Struct( - 'CRL_CONTEXT', [('pbCrlEncoded', rffi.CCHARP), - ('cbCrlEncoded', rwin32.DWORD), - ('dwCertEncodingType', rwin32.DWORD)]) - -for k, v in rffi_platform.configure(CConfig).items(): - globals()[k] = v - -PCERT_ENHKEY_USAGE = lltype.Ptr(CERT_ENHKEY_USAGE) -PCCERT_CONTEXT = lltype.Ptr(CERT_CONTEXT) -PCCRL_CONTEXT = lltype.Ptr(CRL_CONTEXT) - -def external(name, argtypes, restype, **kw): - kw['compilation_info'] = eci - kw['calling_conv'] = 'win' - kw['save_err'] = rffi.RFFI_SAVE_LASTERROR - return rffi.llexternal( - name, argtypes, restype, **kw) - -CertOpenSystemStore = external( - 'CertOpenSystemStoreA', [rffi.VOIDP, rffi.CCHARP], rwin32.HANDLE) -CertCloseStore = external( - 'CertCloseStore', [rwin32.HANDLE, rwin32.DWORD], rwin32.BOOL) -CertGetEnhancedKeyUsage = external( - 'CertGetEnhancedKeyUsage', - [PCCERT_CONTEXT, rwin32.DWORD, PCERT_ENHKEY_USAGE, rwin32.LPDWORD], - rwin32.BOOL) -CertEnumCertificatesInStore = external( - 'CertEnumCertificatesInStore', - [rwin32.HANDLE, PCCERT_CONTEXT], PCCERT_CONTEXT) -CertFreeCertificateContext = external( - 'CertFreeCertificateContext', [PCCERT_CONTEXT], rwin32.BOOL) -CertEnumCRLsInStore = external( - 'CertEnumCRLsInStore', - [rwin32.HANDLE, PCCRL_CONTEXT], PCCRL_CONTEXT) -CertFreeCRLContext = external( - 'CertFreeCRLContext', [PCCRL_CONTEXT], rwin32.BOOL) - -def w_certEncodingType(space, encodingType): - if encodingType == X509_ASN_ENCODING: - return space.newtext("x509_asn") - elif encodingType == PKCS_7_ASN_ENCODING: - return space.newtext("pkcs_7_asn") - else: - return space.newint(encodingType) - -def w_parseKeyUsage(space, pCertCtx, flags): - with lltype.scoped_alloc(rwin32.LPDWORD.TO, 1) as size_ptr: - if not CertGetEnhancedKeyUsage(pCertCtx, flags, - lltype.nullptr(CERT_ENHKEY_USAGE), size_ptr): - last_error = rwin32.lastSavedWindowsError() - if last_error.winerror == CRYPT_E_NOT_FOUND: - return space.w_True - raise wrap_windowserror(space, last_error) - - size = intmask(size_ptr[0]) - with lltype.scoped_alloc(rffi.CCHARP.TO, size) as buf: - usage = rffi.cast(PCERT_ENHKEY_USAGE, buf) - # Now get the actual enhanced usage property - if not CertGetEnhancedKeyUsage(pCertCtx, flags, usage, size_ptr): - last_error= rwin32.lastSavedWindowsError() - if last_error.winerror == CRYPT_E_NOT_FOUND: - return space.w_True - raise wrap_windowserror(space, last_error) - - result_w = [None] * usage.c_cUsageIdentifier - for i in range(usage.c_cUsageIdentifier): - if not usage.c_rgpszUsageIdentifier[i]: - continue - result_w[i] = space.newtext(rffi.charp2str( - usage.c_rgpszUsageIdentifier[i])) - return space.newset(result_w) - -@unwrap_spec(store_name='text') -def enum_certificates_w(space, store_name): - """enum_certificates(store_name) -> [] - - Retrieve certificates from Windows' cert store. store_name may be one of - 'CA', 'ROOT' or 'MY'. The system may provide more cert storages, too. - The function returns a list of (bytes, encoding_type, trust) tuples. The - encoding_type flag can be interpreted with X509_ASN_ENCODING or - PKCS_7_ASN_ENCODING. The trust setting is either a set of OIDs or the - boolean True.""" - - result_w = [] - pCertCtx = lltype.nullptr(CERT_CONTEXT) - hStore = CertOpenSystemStore(None, store_name) - if not hStore: - raise wrap_windowserror(space, rwin32.lastSavedWindowsError()) - try: - while True: - pCertCtx = CertEnumCertificatesInStore(hStore, pCertCtx) - if not pCertCtx: - break - w_cert = space.newbytes( - rffi.charpsize2str(pCertCtx.c_pbCertEncoded, - intmask(pCertCtx.c_cbCertEncoded))) - w_enc = w_certEncodingType(space, pCertCtx.c_dwCertEncodingType) - w_keyusage = w_parseKeyUsage( - space, pCertCtx, CERT_FIND_PROP_ONLY_ENHKEY_USAGE_FLAG) - if space.is_w(w_keyusage, space.w_True): - w_keyusage = w_parseKeyUsage( - space, pCertCtx, CERT_FIND_EXT_ONLY_ENHKEY_USAGE_FLAG) - result_w.append(space.newtuple([w_cert, w_enc, w_keyusage])) - except: - raise - finally: - if pCertCtx: - # loop ended with an error, need to clean up context manually - CertFreeCertificateContext(pCertCtx) - if not CertCloseStore(hStore, 0): - # This error case might shadow another exception. - raise wrap_windowserror(space, rwin32.lastSavedWindowsError()) - - return space.newlist(result_w) - -@unwrap_spec(store_name='text') -def enum_crls_w(space, store_name): - """enum_crls(store_name) -> [] - - Retrieve CRLs from Windows' cert store. store_name may be one of - 'CA', 'ROOT' or 'MY'. The system may provide more cert storages, too. - The function returns a list of (bytes, encoding_type) tuples. The - encoding_type flag can be interpreted with X509_ASN_ENCODING or - PKCS_7_ASN_ENCODING.""" - result_w = [] - - pCrlCtx = lltype.nullptr(CRL_CONTEXT) - hStore = CertOpenSystemStore(None, store_name) - if not hStore: - raise wrap_windowserror(space, rwin32.lastSavedWindowsError()) - try: - while True: - pCrlCtx = CertEnumCRLsInStore(hStore, pCrlCtx) - if not pCrlCtx: - break - w_crl = space.newbytes( - rffi.charpsize2str(pCrlCtx.c_pbCrlEncoded, - intmask(pCrlCtx.c_cbCrlEncoded))) - w_enc = w_certEncodingType(space, pCrlCtx.c_dwCertEncodingType) - result_w.append(space.newtuple([w_crl, w_enc])) - except: - raise - finally: - if pCrlCtx: - # loop ended with an error, need to clean up context manually - CertFreeCRLContext(pCrlCtx) - if not CertCloseStore(hStore, 0): - # This error case might shadow another exception. - raise wrap_windowserror(space, rwin32.lastSavedWindowsError()) - - return space.newlist(result_w) diff -Nru pypy-7.1.1+dfsg/pypy/module/_ssl/ssl_data.py pypy-7.3.1+dfsg/pypy/module/_ssl/ssl_data.py --- pypy-7.1.1+dfsg/pypy/module/_ssl/ssl_data.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_ssl/ssl_data.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,379 +0,0 @@ -# This file is transformed from CPython: Modules/_ssl_data.h -# Itself generated by Tools/ssl/make_ssl_data.py -# Generated on 2012-05-16T23:56:40.981382 - -from rpython.rlib import ropenssl -from rpython.rtyper.tool import rffi_platform - -class CConfig: - _compilation_info_ = ropenssl.eci - -library_codes = "PEM SSL X509".split() -for code in library_codes: - setattr(CConfig, code, rffi_platform.ConstantInteger( - 'ERR_LIB_' + code)) - -error_codes = [ - ('PEM', 'BAD_BASE64_DECODE'), - ('PEM', 'BAD_DECRYPT'), - ('PEM', 'BAD_END_LINE'), - ('PEM', 'BAD_IV_CHARS'), - ('PEM', 'BAD_MAGIC_NUMBER'), - ('PEM', 'BAD_PASSWORD_READ'), - ('PEM', 'BAD_VERSION_NUMBER'), - ('PEM', 'BIO_WRITE_FAILURE'), - ('PEM', 'CIPHER_IS_NULL'), - ('PEM', 'ERROR_CONVERTING_PRIVATE_KEY'), - ('PEM', 'EXPECTING_PRIVATE_KEY_BLOB'), - ('PEM', 'EXPECTING_PUBLIC_KEY_BLOB'), - ('PEM', 'INCONSISTENT_HEADER'), - ('PEM', 'KEYBLOB_HEADER_PARSE_ERROR'), - ('PEM', 'KEYBLOB_TOO_SHORT'), - ('PEM', 'NOT_DEK_INFO'), - ('PEM', 'NOT_ENCRYPTED'), - ('PEM', 'NOT_PROC_TYPE'), - ('PEM', 'NO_START_LINE'), - ('PEM', 'PROBLEMS_GETTING_PASSWORD'), - ('PEM', 'PUBLIC_KEY_NO_RSA'), - ('PEM', 'PVK_DATA_TOO_SHORT'), - ('PEM', 'PVK_TOO_SHORT'), - ('PEM', 'READ_KEY'), - ('PEM', 'SHORT_HEADER'), - ('PEM', 'UNSUPPORTED_CIPHER'), - ('PEM', 'UNSUPPORTED_ENCRYPTION'), - ('PEM', 'UNSUPPORTED_KEY_COMPONENTS'), - ('SSL', 'APP_DATA_IN_HANDSHAKE'), - ('SSL', 'ATTEMPT_TO_REUSE_SESSION_IN_DIFFERENT_CONTEXT'), - ('SSL', 'BAD_ALERT_RECORD'), - ('SSL', 'BAD_AUTHENTICATION_TYPE'), - ('SSL', 'BAD_CHANGE_CIPHER_SPEC'), - ('SSL', 'BAD_CHECKSUM'), - ('SSL', 'BAD_DATA_RETURNED_BY_CALLBACK'), - ('SSL', 'BAD_DECOMPRESSION'), - ('SSL', 'BAD_DH_G_LENGTH'), - ('SSL', 'BAD_DH_PUB_KEY_LENGTH'), - ('SSL', 'BAD_DH_P_LENGTH'), - ('SSL', 'BAD_DIGEST_LENGTH'), - ('SSL', 'BAD_DSA_SIGNATURE'), - ('SSL', 'BAD_ECC_CERT'), - ('SSL', 'BAD_ECDSA_SIGNATURE'), - ('SSL', 'BAD_ECPOINT'), - ('SSL', 'BAD_HANDSHAKE_LENGTH'), - ('SSL', 'BAD_HELLO_REQUEST'), - ('SSL', 'BAD_LENGTH'), - ('SSL', 'BAD_MAC_DECODE'), - ('SSL', 'BAD_MAC_LENGTH'), - ('SSL', 'BAD_MESSAGE_TYPE'), - ('SSL', 'BAD_PACKET_LENGTH'), - ('SSL', 'BAD_PROTOCOL_VERSION_NUMBER'), - ('SSL', 'BAD_PSK_IDENTITY_HINT_LENGTH'), - ('SSL', 'BAD_RESPONSE_ARGUMENT'), - ('SSL', 'BAD_RSA_DECRYPT'), - ('SSL', 'BAD_RSA_ENCRYPT'), - ('SSL', 'BAD_RSA_E_LENGTH'), - ('SSL', 'BAD_RSA_MODULUS_LENGTH'), - ('SSL', 'BAD_RSA_SIGNATURE'), - ('SSL', 'BAD_SIGNATURE'), - ('SSL', 'BAD_SSL_FILETYPE'), - ('SSL', 'BAD_SSL_SESSION_ID_LENGTH'), - ('SSL', 'BAD_STATE'), - ('SSL', 'BAD_WRITE_RETRY'), - ('SSL', 'BIO_NOT_SET'), - ('SSL', 'BLOCK_CIPHER_PAD_IS_WRONG'), - ('SSL', 'BN_LIB'), - ('SSL', 'CA_DN_LENGTH_MISMATCH'), - ('SSL', 'CA_DN_TOO_LONG'), - ('SSL', 'CCS_RECEIVED_EARLY'), - ('SSL', 'CERTIFICATE_VERIFY_FAILED'), - ('SSL', 'CERT_LENGTH_MISMATCH'), - ('SSL', 'CHALLENGE_IS_DIFFERENT'), - ('SSL', 'CIPHER_CODE_WRONG_LENGTH'), - ('SSL', 'CIPHER_OR_HASH_UNAVAILABLE'), - ('SSL', 'CIPHER_TABLE_SRC_ERROR'), - ('SSL', 'CLIENTHELLO_TLSEXT'), - ('SSL', 'COMPRESSED_LENGTH_TOO_LONG'), - ('SSL', 'COMPRESSION_DISABLED'), - ('SSL', 'COMPRESSION_FAILURE'), - ('SSL', 'COMPRESSION_ID_NOT_WITHIN_PRIVATE_RANGE'), - ('SSL', 'COMPRESSION_LIBRARY_ERROR'), - ('SSL', 'CONNECTION_ID_IS_DIFFERENT'), - ('SSL', 'CONNECTION_TYPE_NOT_SET'), - ('SSL', 'COOKIE_MISMATCH'), - ('SSL', 'DATA_BETWEEN_CCS_AND_FINISHED'), - ('SSL', 'DATA_LENGTH_TOO_LONG'), - ('SSL', 'DECRYPTION_FAILED'), - ('SSL', 'DECRYPTION_FAILED_OR_BAD_RECORD_MAC'), - ('SSL', 'DH_PUBLIC_VALUE_LENGTH_IS_WRONG'), - ('SSL', 'DIGEST_CHECK_FAILED'), - ('SSL', 'DTLS_MESSAGE_TOO_BIG'), - ('SSL', 'DUPLICATE_COMPRESSION_ID'), - ('SSL', 'ECC_CERT_NOT_FOR_KEY_AGREEMENT'), - ('SSL', 'ECC_CERT_NOT_FOR_SIGNING'), - ('SSL', 'ECC_CERT_SHOULD_HAVE_RSA_SIGNATURE'), - ('SSL', 'ECC_CERT_SHOULD_HAVE_SHA1_SIGNATURE'), - ('SSL', 'ECGROUP_TOO_LARGE_FOR_CIPHER'), - ('SSL', 'ENCRYPTED_LENGTH_TOO_LONG'), - ('SSL', 'ERROR_GENERATING_TMP_RSA_KEY'), - ('SSL', 'ERROR_IN_RECEIVED_CIPHER_LIST'), - ('SSL', 'EXCESSIVE_MESSAGE_SIZE'), - ('SSL', 'EXTRA_DATA_IN_MESSAGE'), - ('SSL', 'GOT_A_FIN_BEFORE_A_CCS'), - ('SSL', 'HTTPS_PROXY_REQUEST'), - ('SSL', 'HTTP_REQUEST'), - ('SSL', 'ILLEGAL_PADDING'), - ('SSL', 'INCONSISTENT_COMPRESSION'), - ('SSL', 'INVALID_CHALLENGE_LENGTH'), - ('SSL', 'INVALID_COMMAND'), - ('SSL', 'INVALID_COMPRESSION_ALGORITHM'), - ('SSL', 'INVALID_PURPOSE'), - ('SSL', 'INVALID_STATUS_RESPONSE'), - ('SSL', 'INVALID_TICKET_KEYS_LENGTH'), - ('SSL', 'INVALID_TRUST'), - ('SSL', 'KEY_ARG_TOO_LONG'), - ('SSL', 'KRB5'), - ('SSL', 'KRB5_C_CC_PRINC'), - ('SSL', 'KRB5_C_GET_CRED'), - ('SSL', 'KRB5_C_INIT'), - ('SSL', 'KRB5_C_MK_REQ'), - ('SSL', 'KRB5_S_BAD_TICKET'), - ('SSL', 'KRB5_S_INIT'), - ('SSL', 'KRB5_S_RD_REQ'), - ('SSL', 'KRB5_S_TKT_EXPIRED'), - ('SSL', 'KRB5_S_TKT_NYV'), - ('SSL', 'KRB5_S_TKT_SKEW'), - ('SSL', 'LENGTH_MISMATCH'), - ('SSL', 'LENGTH_TOO_SHORT'), - ('SSL', 'LIBRARY_BUG'), - ('SSL', 'LIBRARY_HAS_NO_CIPHERS'), - ('SSL', 'MESSAGE_TOO_LONG'), - ('SSL', 'MISSING_DH_DSA_CERT'), - ('SSL', 'MISSING_DH_KEY'), - ('SSL', 'MISSING_DH_RSA_CERT'), - ('SSL', 'MISSING_DSA_SIGNING_CERT'), - ('SSL', 'MISSING_EXPORT_TMP_DH_KEY'), - ('SSL', 'MISSING_EXPORT_TMP_RSA_KEY'), - ('SSL', 'MISSING_RSA_CERTIFICATE'), - ('SSL', 'MISSING_RSA_ENCRYPTING_CERT'), - ('SSL', 'MISSING_RSA_SIGNING_CERT'), - ('SSL', 'MISSING_TMP_DH_KEY'), - ('SSL', 'MISSING_TMP_ECDH_KEY'), - ('SSL', 'MISSING_TMP_RSA_KEY'), - ('SSL', 'MISSING_TMP_RSA_PKEY'), - ('SSL', 'MISSING_VERIFY_MESSAGE'), - ('SSL', 'NON_SSLV2_INITIAL_PACKET'), - ('SSL', 'NO_CERTIFICATES_RETURNED'), - ('SSL', 'NO_CERTIFICATE_ASSIGNED'), - ('SSL', 'NO_CERTIFICATE_RETURNED'), - ('SSL', 'NO_CERTIFICATE_SET'), - ('SSL', 'NO_CERTIFICATE_SPECIFIED'), - ('SSL', 'NO_CIPHERS_AVAILABLE'), - ('SSL', 'NO_CIPHERS_PASSED'), - ('SSL', 'NO_CIPHERS_SPECIFIED'), - ('SSL', 'NO_CIPHER_LIST'), - ('SSL', 'NO_CIPHER_MATCH'), - ('SSL', 'NO_CLIENT_CERT_METHOD'), - ('SSL', 'NO_CLIENT_CERT_RECEIVED'), - ('SSL', 'NO_COMPRESSION_SPECIFIED'), - ('SSL', 'NO_GOST_CERTIFICATE_SENT_BY_PEER'), - ('SSL', 'NO_METHOD_SPECIFIED'), - ('SSL', 'NO_PRIVATEKEY'), - ('SSL', 'NO_PRIVATE_KEY_ASSIGNED'), - ('SSL', 'NO_PROTOCOLS_AVAILABLE'), - ('SSL', 'NO_PUBLICKEY'), - ('SSL', 'NO_RENEGOTIATION'), - ('SSL', 'NO_REQUIRED_DIGEST'), - ('SSL', 'NO_SHARED_CIPHER'), - ('SSL', 'NO_VERIFY_CALLBACK'), - ('SSL', 'NULL_SSL_CTX'), - ('SSL', 'NULL_SSL_METHOD_PASSED'), - ('SSL', 'OLD_SESSION_CIPHER_NOT_RETURNED'), - ('SSL', 'OLD_SESSION_COMPRESSION_ALGORITHM_NOT_RETURNED'), - ('SSL', 'ONLY_TLS_ALLOWED_IN_FIPS_MODE'), - ('SSL', 'OPAQUE_PRF_INPUT_TOO_LONG'), - ('SSL', 'PACKET_LENGTH_TOO_LONG'), - ('SSL', 'PARSE_TLSEXT'), - ('SSL', 'PATH_TOO_LONG'), - ('SSL', 'PEER_DID_NOT_RETURN_A_CERTIFICATE'), - ('SSL', 'PEER_ERROR'), - ('SSL', 'PEER_ERROR_CERTIFICATE'), - ('SSL', 'PEER_ERROR_NO_CERTIFICATE'), - ('SSL', 'PEER_ERROR_NO_CIPHER'), - ('SSL', 'PEER_ERROR_UNSUPPORTED_CERTIFICATE_TYPE'), - ('SSL', 'PRE_MAC_LENGTH_TOO_LONG'), - ('SSL', 'PROBLEMS_MAPPING_CIPHER_FUNCTIONS'), - ('SSL', 'PROTOCOL_IS_SHUTDOWN'), - ('SSL', 'PSK_IDENTITY_NOT_FOUND'), - ('SSL', 'PSK_NO_CLIENT_CB'), - ('SSL', 'PSK_NO_SERVER_CB'), - ('SSL', 'PUBLIC_KEY_ENCRYPT_ERROR'), - ('SSL', 'PUBLIC_KEY_IS_NOT_RSA'), - ('SSL', 'PUBLIC_KEY_NOT_RSA'), - ('SSL', 'READ_BIO_NOT_SET'), - ('SSL', 'READ_TIMEOUT_EXPIRED'), - ('SSL', 'READ_WRONG_PACKET_TYPE'), - ('SSL', 'RECORD_LENGTH_MISMATCH'), - ('SSL', 'RECORD_TOO_LARGE'), - ('SSL', 'RECORD_TOO_SMALL'), - ('SSL', 'RENEGOTIATE_EXT_TOO_LONG'), - ('SSL', 'RENEGOTIATION_ENCODING_ERR'), - ('SSL', 'RENEGOTIATION_MISMATCH'), - ('SSL', 'REQUIRED_CIPHER_MISSING'), - ('SSL', 'REQUIRED_COMPRESSSION_ALGORITHM_MISSING'), - ('SSL', 'REUSE_CERT_LENGTH_NOT_ZERO'), - ('SSL', 'REUSE_CERT_TYPE_NOT_ZERO'), - ('SSL', 'REUSE_CIPHER_LIST_NOT_ZERO'), - ('SSL', 'SCSV_RECEIVED_WHEN_RENEGOTIATING'), - ('SSL', 'SERVERHELLO_TLSEXT'), - ('SSL', 'SESSION_ID_CONTEXT_UNINITIALIZED'), - ('SSL', 'SHORT_READ'), - ('SSL', 'SIGNATURE_FOR_NON_SIGNING_CERTIFICATE'), - ('SSL', 'SSL23_DOING_SESSION_ID_REUSE'), - ('SSL', 'SSL2_CONNECTION_ID_TOO_LONG'), - ('SSL', 'SSL3_EXT_INVALID_ECPOINTFORMAT'), - ('SSL', 'SSL3_EXT_INVALID_SERVERNAME'), - ('SSL', 'SSL3_EXT_INVALID_SERVERNAME_TYPE'), - ('SSL', 'SSL3_SESSION_ID_TOO_LONG'), - ('SSL', 'SSL3_SESSION_ID_TOO_SHORT'), - ('SSL', 'SSLV3_ALERT_BAD_CERTIFICATE'), - ('SSL', 'SSLV3_ALERT_BAD_RECORD_MAC'), - ('SSL', 'SSLV3_ALERT_CERTIFICATE_EXPIRED'), - ('SSL', 'SSLV3_ALERT_CERTIFICATE_REVOKED'), - ('SSL', 'SSLV3_ALERT_CERTIFICATE_UNKNOWN'), - ('SSL', 'SSLV3_ALERT_DECOMPRESSION_FAILURE'), - ('SSL', 'SSLV3_ALERT_HANDSHAKE_FAILURE'), - ('SSL', 'SSLV3_ALERT_ILLEGAL_PARAMETER'), - ('SSL', 'SSLV3_ALERT_NO_CERTIFICATE'), - ('SSL', 'SSLV3_ALERT_UNEXPECTED_MESSAGE'), - ('SSL', 'SSLV3_ALERT_UNSUPPORTED_CERTIFICATE'), - ('SSL', 'SSL_CTX_HAS_NO_DEFAULT_SSL_VERSION'), - ('SSL', 'SSL_HANDSHAKE_FAILURE'), - ('SSL', 'SSL_LIBRARY_HAS_NO_CIPHERS'), - ('SSL', 'SSL_SESSION_ID_CALLBACK_FAILED'), - ('SSL', 'SSL_SESSION_ID_CONFLICT'), - ('SSL', 'SSL_SESSION_ID_CONTEXT_TOO_LONG'), - ('SSL', 'SSL_SESSION_ID_HAS_BAD_LENGTH'), - ('SSL', 'SSL_SESSION_ID_IS_DIFFERENT'), - ('SSL', 'TLSV1_ALERT_ACCESS_DENIED'), - ('SSL', 'TLSV1_ALERT_DECODE_ERROR'), - ('SSL', 'TLSV1_ALERT_DECRYPTION_FAILED'), - ('SSL', 'TLSV1_ALERT_DECRYPT_ERROR'), - ('SSL', 'TLSV1_ALERT_EXPORT_RESTRICTION'), - ('SSL', 'TLSV1_ALERT_INSUFFICIENT_SECURITY'), - ('SSL', 'TLSV1_ALERT_INTERNAL_ERROR'), - ('SSL', 'TLSV1_ALERT_NO_RENEGOTIATION'), - ('SSL', 'TLSV1_ALERT_PROTOCOL_VERSION'), - ('SSL', 'TLSV1_ALERT_RECORD_OVERFLOW'), - ('SSL', 'TLSV1_ALERT_UNKNOWN_CA'), - ('SSL', 'TLSV1_ALERT_USER_CANCELLED'), - ('SSL', 'TLSV1_BAD_CERTIFICATE_HASH_VALUE'), - ('SSL', 'TLSV1_BAD_CERTIFICATE_STATUS_RESPONSE'), - ('SSL', 'TLSV1_CERTIFICATE_UNOBTAINABLE'), - ('SSL', 'TLSV1_UNRECOGNIZED_NAME'), - ('SSL', 'TLSV1_UNSUPPORTED_EXTENSION'), - ('SSL', 'TLS_CLIENT_CERT_REQ_WITH_ANON_CIPHER'), - ('SSL', 'TLS_INVALID_ECPOINTFORMAT_LIST'), - ('SSL', 'TLS_PEER_DID_NOT_RESPOND_WITH_CERTIFICATE_LIST'), - ('SSL', 'TLS_RSA_ENCRYPTED_VALUE_LENGTH_IS_WRONG'), - ('SSL', 'TRIED_TO_USE_UNSUPPORTED_CIPHER'), - ('SSL', 'UNABLE_TO_DECODE_DH_CERTS'), - ('SSL', 'UNABLE_TO_DECODE_ECDH_CERTS'), - ('SSL', 'UNABLE_TO_EXTRACT_PUBLIC_KEY'), - ('SSL', 'UNABLE_TO_FIND_DH_PARAMETERS'), - ('SSL', 'UNABLE_TO_FIND_ECDH_PARAMETERS'), - ('SSL', 'UNABLE_TO_FIND_PUBLIC_KEY_PARAMETERS'), - ('SSL', 'UNABLE_TO_FIND_SSL_METHOD'), - ('SSL', 'UNABLE_TO_LOAD_SSL2_MD5_ROUTINES'), - ('SSL', 'UNABLE_TO_LOAD_SSL3_MD5_ROUTINES'), - ('SSL', 'UNABLE_TO_LOAD_SSL3_SHA1_ROUTINES'), - ('SSL', 'UNEXPECTED_MESSAGE'), - ('SSL', 'UNEXPECTED_RECORD'), - ('SSL', 'UNINITIALIZED'), - ('SSL', 'UNKNOWN_ALERT_TYPE'), - ('SSL', 'UNKNOWN_CERTIFICATE_TYPE'), - ('SSL', 'UNKNOWN_CIPHER_RETURNED'), - ('SSL', 'UNKNOWN_CIPHER_TYPE'), - ('SSL', 'UNKNOWN_KEY_EXCHANGE_TYPE'), - ('SSL', 'UNKNOWN_PKEY_TYPE'), - ('SSL', 'UNKNOWN_PROTOCOL'), - ('SSL', 'UNKNOWN_REMOTE_ERROR_TYPE'), - ('SSL', 'UNKNOWN_SSL_VERSION'), - ('SSL', 'UNKNOWN_STATE'), - ('SSL', 'UNSAFE_LEGACY_RENEGOTIATION_DISABLED'), - ('SSL', 'UNSUPPORTED_CIPHER'), - ('SSL', 'UNSUPPORTED_COMPRESSION_ALGORITHM'), - ('SSL', 'UNSUPPORTED_DIGEST_TYPE'), - ('SSL', 'UNSUPPORTED_ELLIPTIC_CURVE'), - ('SSL', 'UNSUPPORTED_PROTOCOL'), - ('SSL', 'UNSUPPORTED_SSL_VERSION'), - ('SSL', 'UNSUPPORTED_STATUS_TYPE'), - ('SSL', 'WRITE_BIO_NOT_SET'), - ('SSL', 'WRONG_CIPHER_RETURNED'), - ('SSL', 'WRONG_MESSAGE_TYPE'), - ('SSL', 'WRONG_NUMBER_OF_KEY_BITS'), - ('SSL', 'WRONG_SIGNATURE_LENGTH'), - ('SSL', 'WRONG_SIGNATURE_SIZE'), - ('SSL', 'WRONG_SSL_VERSION'), - ('SSL', 'WRONG_VERSION_NUMBER'), - ('SSL', 'X509_LIB'), - ('SSL', 'X509_VERIFICATION_SETUP_PROBLEMS'), - ('X509', 'BAD_X509_FILETYPE'), - ('X509', 'BASE64_DECODE_ERROR'), - ('X509', 'CANT_CHECK_DH_KEY'), - ('X509', 'CERT_ALREADY_IN_HASH_TABLE'), - ('X509', 'ERR_ASN1_LIB'), - ('X509', 'INVALID_DIRECTORY'), - ('X509', 'INVALID_FIELD_NAME'), - ('X509', 'INVALID_TRUST'), - ('X509', 'KEY_TYPE_MISMATCH'), - ('X509', 'KEY_VALUES_MISMATCH'), - ('X509', 'LOADING_CERT_DIR'), - ('X509', 'LOADING_DEFAULTS'), - ('X509', 'METHOD_NOT_SUPPORTED'), - ('X509', 'NO_CERT_SET_FOR_US_TO_VERIFY'), - ('X509', 'PUBLIC_KEY_DECODE_ERROR'), - ('X509', 'PUBLIC_KEY_ENCODE_ERROR'), - ('X509', 'SHOULD_RETRY'), - ('X509', 'UNABLE_TO_FIND_PARAMETERS_IN_CHAIN'), - ('X509', 'UNABLE_TO_GET_CERTS_PUBLIC_KEY'), - ('X509', 'UNKNOWN_KEY_TYPE'), - ('X509', 'UNKNOWN_NID'), - ('X509', 'UNKNOWN_PURPOSE_ID'), - ('X509', 'UNKNOWN_TRUST_ID'), - ('X509', 'UNSUPPORTED_ALGORITHM'), - ('X509', 'WRONG_LOOKUP_TYPE'), - ('X509', 'WRONG_TYPE'), -] -for lib, code in error_codes: - setattr(CConfig, code, rffi_platform.DefinedConstantInteger( - '%s_R_%s' % (lib, code))) - -# Constants for ALERT_DESCRIPTION_ error codes -AD_NAMES = """ - CLOSE_NOTIFY UNEXPECTED_MESSAGE BAD_RECORD_MAC RECORD_OVERFLOW - DECOMPRESSION_FAILURE HANDSHAKE_FAILURE BAD_CERTIFICATE - UNSUPPORTED_CERTIFICATE CERTIFICATE_REVOKED CERTIFICATE_EXPIRED - CERTIFICATE_UNKNOWN ILLEGAL_PARAMETER UNKNOWN_CA ACCESS_DENIED - DECODE_ERROR DECRYPT_ERROR PROTOCOL_VERSION INSUFFICIENT_SECURITY - INTERNAL_ERROR USER_CANCELLED NO_RENEGOTIATION UNSUPPORTED_EXTENSION - CERTIFICATE_UNOBTAINABLE UNRECOGNIZED_NAME BAD_CERTIFICATE_STATUS_RESPONSE - BAD_CERTIFICATE_HASH_VALUE UNKNOWN_PSK_IDENTITY - """.split() -for name in AD_NAMES: - setattr(CConfig, name, rffi_platform.DefinedConstantInteger( - 'SSL_AD_%s' % name)) - -cconfig = rffi_platform.configure(CConfig) - -LIBRARY_CODES_TO_NAMES = {} -for code in library_codes: - LIBRARY_CODES_TO_NAMES[cconfig[code]] = code -ERROR_CODES_TO_NAMES = {} -for lib, code in error_codes: - if cconfig[code] is not None: - ERROR_CODES_TO_NAMES[cconfig[lib], cconfig[code]] = code - -ALERT_DESCRIPTION_CODES = {} -for name in AD_NAMES: - value = cconfig[name] - if value is not None: - ALERT_DESCRIPTION_CODES['ALERT_DESCRIPTION_%s' % name] = value diff -Nru pypy-7.1.1+dfsg/pypy/module/_ssl/test/allsans.pem pypy-7.3.1+dfsg/pypy/module/_ssl/test/allsans.pem --- pypy-7.1.1+dfsg/pypy/module/_ssl/test/allsans.pem 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_ssl/test/allsans.pem 1970-01-01 00:00:00.000000000 +0000 @@ -1,37 +0,0 @@ ------BEGIN PRIVATE KEY----- -MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAOoy7/QOtTjQ0niE -6uDcTwtkC0R2Tvy1AjVnXohCntZfdzbTGDoYTgXSOLsP8A697jUiJ8VCePGH50xG -Z4DKnAF3a9O3a9nr2pLXb0iY3XOMv+YEBii7CfI+3oxFYgCl0sMgHzDD2ZTVYAsm -DWgLUVsE2gHEccRwrM2tPf2EgR+FAgMBAAECgYEA3qyfyYVSeTrTYxO93x6ZaVMu -A2IZp9zSxMQL9bKiI2GRj+cV2ebSCGbg2btFnD6qBor7FWsmYz+8g6FNN/9sY4az -61rMqMtQvLBe+7L8w70FeTze4qQ4Y1oQri0qD6tBWhDVlpnbI5Py9bkZKD67yVUk -elcEA/5x4PrYXkuqsAECQQD80NjT0mDvaY0JOOaQFSEpMv6QiUA8GGX8Xli7IoKb -tAolPG8rQBa+qSpcWfDMTrWw/aWHuMEEQoP/bVDH9W4FAkEA7SYQbBAKnojZ5A3G -kOHdV7aeivRQxQk/JN8Fb8oKB9Csvpv/BsuGxPKXHdhFa6CBTTsNRtHQw/szPo4l -xMIjgQJAPoMxqibR+0EBM6+TKzteSL6oPXsCnBl4Vk/J5vPgkbmR7KUl4+7j8N8J -b2554TrxKEN/w7CGYZRE6UrRd7ATNQJAWD7Yz41sli+wfPdPU2xo1BHljyl4wMk/ -EPZYbI/PCbdyAH/F935WyQTIjNeEhZc1Zkq6FwdOWw8ns3hrv3rKgQJAHXv1BqUa -czGPIFxX2TNoqtcl6/En4vrxVB1wzsfzkkDAg98kBl7qsF+S3qujSzKikjeaVbI2 -/CyWR2P3yLtOmA== ------END PRIVATE KEY----- ------BEGIN CERTIFICATE----- -MIIDcjCCAtugAwIBAgIJAN5dc9TOWjB7MA0GCSqGSIb3DQEBCwUAMF0xCzAJBgNV -BAYTAlhZMRcwFQYDVQQHDA5DYXN0bGUgQW50aHJheDEjMCEGA1UECgwaUHl0aG9u -IFNvZnR3YXJlIEZvdW5kYXRpb24xEDAOBgNVBAMMB2FsbHNhbnMwHhcNMTYwODA1 -MTAyMTExWhcNMjYwODAzMTAyMTExWjBdMQswCQYDVQQGEwJYWTEXMBUGA1UEBwwO -Q2FzdGxlIEFudGhyYXgxIzAhBgNVBAoMGlB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0 -aW9uMRAwDgYDVQQDDAdhbGxzYW5zMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKB -gQDqMu/0DrU40NJ4hOrg3E8LZAtEdk78tQI1Z16IQp7WX3c20xg6GE4F0ji7D/AO -ve41IifFQnjxh+dMRmeAypwBd2vTt2vZ69qS129ImN1zjL/mBAYouwnyPt6MRWIA -pdLDIB8ww9mU1WALJg1oC1FbBNoBxHHEcKzNrT39hIEfhQIDAQABo4IBODCCATQw -ggEwBgNVHREEggEnMIIBI4IHYWxsc2Fuc6AeBgMqAwSgFwwVc29tZSBvdGhlciBp -ZGVudGlmaWVyoDUGBisGAQUCAqArMCmgEBsOS0VSQkVST1MuUkVBTE2hFTAToAMC -AQGhDDAKGwh1c2VybmFtZYEQdXNlckBleGFtcGxlLm9yZ4IPd3d3LmV4YW1wbGUu -b3JnpGcwZTELMAkGA1UEBhMCWFkxFzAVBgNVBAcMDkNhc3RsZSBBbnRocmF4MSMw -IQYDVQQKDBpQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbjEYMBYGA1UEAwwPZGly -bmFtZSBleGFtcGxlhhdodHRwczovL3d3dy5weXRob24ub3JnL4cEfwAAAYcQAAAA -AAAAAAAAAAAAAAAAAYgEKgMEBTANBgkqhkiG9w0BAQsFAAOBgQAy16h+F+nOmeiT -VWR0fc8F/j6FcadbLseAUaogcC15OGxCl4UYpLV88HBkABOoGCpP155qwWTwOrdG -iYPGJSusf1OnJEbvzFejZf6u078bPd9/ZL4VWLjv+FPGkjd+N+/OaqMvgj8Lu99f -3Y/C4S7YbHxxwff6C6l2Xli+q6gnuQ== ------END CERTIFICATE----- diff -Nru pypy-7.1.1+dfsg/pypy/module/_ssl/test/dh512.pem pypy-7.3.1+dfsg/pypy/module/_ssl/test/dh512.pem --- pypy-7.1.1+dfsg/pypy/module/_ssl/test/dh512.pem 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_ssl/test/dh512.pem 1970-01-01 00:00:00.000000000 +0000 @@ -1,9 +0,0 @@ ------BEGIN DH PARAMETERS----- -MEYCQQD1Kv884bEpQBgRjXyEpwpy1obEAxnIByl6ypUM2Zafq9AKUJsCRtMIPWak -XUGfnHy9iUsiGSa6q6Jew1XpKgVfAgEC ------END DH PARAMETERS----- - -These are the 512 bit DH parameters from "Assigned Number for SKIP Protocols" -(http://www.skip-vpn.org/spec/numbers.html). -See there for how they were generated. -Note that g is not a generator, but this is not a problem since p is a safe prime. diff -Nru pypy-7.1.1+dfsg/pypy/module/_ssl/test/nullbytecert.pem pypy-7.3.1+dfsg/pypy/module/_ssl/test/nullbytecert.pem --- pypy-7.1.1+dfsg/pypy/module/_ssl/test/nullbytecert.pem 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_ssl/test/nullbytecert.pem 1970-01-01 00:00:00.000000000 +0000 @@ -1,90 +0,0 @@ -Certificate: - Data: - Version: 3 (0x2) - Serial Number: 0 (0x0) - Signature Algorithm: sha1WithRSAEncryption - Issuer: C=US, ST=Oregon, L=Beaverton, O=Python Software Foundation, OU=Python Core Development, CN=null.python.org\x00example.org/emailAddress=python-dev@python.org - Validity - Not Before: Aug 7 13:11:52 2013 GMT - Not After : Aug 7 13:12:52 2013 GMT - Subject: C=US, ST=Oregon, L=Beaverton, O=Python Software Foundation, OU=Python Core Development, CN=null.python.org\x00example.org/emailAddress=python-dev@python.org - Subject Public Key Info: - Public Key Algorithm: rsaEncryption - Public-Key: (2048 bit) - Modulus: - 00:b5:ea:ed:c9:fb:46:7d:6f:3b:76:80:dd:3a:f3: - 03:94:0b:a7:a6:db:ec:1d:df:ff:23:74:08:9d:97: - 16:3f:a3:a4:7b:3e:1b:0e:96:59:25:03:a7:26:e2: - 88:a9:cf:79:cd:f7:04:56:b0:ab:79:32:6e:59:c1: - 32:30:54:eb:58:a8:cb:91:f0:42:a5:64:27:cb:d4: - 56:31:88:52:ad:cf:bd:7f:f0:06:64:1f:cc:27:b8: - a3:8b:8c:f3:d8:29:1f:25:0b:f5:46:06:1b:ca:02: - 45:ad:7b:76:0a:9c:bf:bb:b9:ae:0d:16:ab:60:75: - ae:06:3e:9c:7c:31:dc:92:2f:29:1a:e0:4b:0c:91: - 90:6c:e9:37:c5:90:d7:2a:d7:97:15:a3:80:8f:5d: - 7b:49:8f:54:30:d4:97:2c:1c:5b:37:b5:ab:69:30: - 68:43:d3:33:78:4b:02:60:f5:3c:44:80:a1:8f:e7: - f0:0f:d1:5e:87:9e:46:cf:62:fc:f9:bf:0c:65:12: - f1:93:c8:35:79:3f:c8:ec:ec:47:f5:ef:be:44:d5: - ae:82:1e:2d:9a:9f:98:5a:67:65:e1:74:70:7c:cb: - d3:c2:ce:0e:45:49:27:dc:e3:2d:d4:fb:48:0e:2f: - 9e:77:b8:14:46:c0:c4:36:ca:02:ae:6a:91:8c:da: - 2f:85 - Exponent: 65537 (0x10001) - X509v3 extensions: - X509v3 Basic Constraints: critical - CA:FALSE - X509v3 Subject Key Identifier: - 88:5A:55:C0:52:FF:61:CD:52:A3:35:0F:EA:5A:9C:24:38:22:F7:5C - X509v3 Key Usage: - Digital Signature, Non Repudiation, Key Encipherment - X509v3 Subject Alternative Name: - ************************************************************* - WARNING: The values for DNS, email and URI are WRONG. OpenSSL - doesn't print the text after a NULL byte. - ************************************************************* - DNS:altnull.python.org, email:null@python.org, URI:http://null.python.org, IP Address:192.0.2.1, IP Address:2001:DB8:0:0:0:0:0:1 - Signature Algorithm: sha1WithRSAEncryption - ac:4f:45:ef:7d:49:a8:21:70:8e:88:59:3e:d4:36:42:70:f5: - a3:bd:8b:d7:a8:d0:58:f6:31:4a:b1:a4:a6:dd:6f:d9:e8:44: - 3c:b6:0a:71:d6:7f:b1:08:61:9d:60:ce:75:cf:77:0c:d2:37: - 86:02:8d:5e:5d:f9:0f:71:b4:16:a8:c1:3d:23:1c:f1:11:b3: - 56:6e:ca:d0:8d:34:94:e6:87:2a:99:f2:ae:ae:cc:c2:e8:86: - de:08:a8:7f:c5:05:fa:6f:81:a7:82:e6:d0:53:9d:34:f4:ac: - 3e:40:fe:89:57:7a:29:a4:91:7e:0b:c6:51:31:e5:10:2f:a4: - 60:76:cd:95:51:1a:be:8b:a1:b0:fd:ad:52:bd:d7:1b:87:60: - d2:31:c7:17:c4:18:4f:2d:08:25:a3:a7:4f:b7:92:ca:e2:f5: - 25:f1:54:75:81:9d:b3:3d:61:a2:f7:da:ed:e1:c6:6f:2c:60: - 1f:d8:6f:c5:92:05:ab:c9:09:62:49:a9:14:ad:55:11:cc:d6: - 4a:19:94:99:97:37:1d:81:5f:8b:cf:a3:a8:96:44:51:08:3d: - 0b:05:65:12:eb:b6:70:80:88:48:72:4f:c6:c2:da:cf:cd:8e: - 5b:ba:97:2f:60:b4:96:56:49:5e:3a:43:76:63:04:be:2a:f6: - c1:ca:a9:94 ------BEGIN CERTIFICATE----- -MIIE2DCCA8CgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBxTELMAkGA1UEBhMCVVMx -DzANBgNVBAgMBk9yZWdvbjESMBAGA1UEBwwJQmVhdmVydG9uMSMwIQYDVQQKDBpQ -eXRob24gU29mdHdhcmUgRm91bmRhdGlvbjEgMB4GA1UECwwXUHl0aG9uIENvcmUg -RGV2ZWxvcG1lbnQxJDAiBgNVBAMMG251bGwucHl0aG9uLm9yZwBleGFtcGxlLm9y -ZzEkMCIGCSqGSIb3DQEJARYVcHl0aG9uLWRldkBweXRob24ub3JnMB4XDTEzMDgw -NzEzMTE1MloXDTEzMDgwNzEzMTI1MlowgcUxCzAJBgNVBAYTAlVTMQ8wDQYDVQQI -DAZPcmVnb24xEjAQBgNVBAcMCUJlYXZlcnRvbjEjMCEGA1UECgwaUHl0aG9uIFNv -ZnR3YXJlIEZvdW5kYXRpb24xIDAeBgNVBAsMF1B5dGhvbiBDb3JlIERldmVsb3Bt -ZW50MSQwIgYDVQQDDBtudWxsLnB5dGhvbi5vcmcAZXhhbXBsZS5vcmcxJDAiBgkq -hkiG9w0BCQEWFXB5dGhvbi1kZXZAcHl0aG9uLm9yZzCCASIwDQYJKoZIhvcNAQEB -BQADggEPADCCAQoCggEBALXq7cn7Rn1vO3aA3TrzA5QLp6bb7B3f/yN0CJ2XFj+j -pHs+Gw6WWSUDpybiiKnPec33BFawq3kyblnBMjBU61ioy5HwQqVkJ8vUVjGIUq3P -vX/wBmQfzCe4o4uM89gpHyUL9UYGG8oCRa17dgqcv7u5rg0Wq2B1rgY+nHwx3JIv -KRrgSwyRkGzpN8WQ1yrXlxWjgI9de0mPVDDUlywcWze1q2kwaEPTM3hLAmD1PESA -oY/n8A/RXoeeRs9i/Pm/DGUS8ZPINXk/yOzsR/XvvkTVroIeLZqfmFpnZeF0cHzL -08LODkVJJ9zjLdT7SA4vnne4FEbAxDbKAq5qkYzaL4UCAwEAAaOB0DCBzTAMBgNV -HRMBAf8EAjAAMB0GA1UdDgQWBBSIWlXAUv9hzVKjNQ/qWpwkOCL3XDALBgNVHQ8E -BAMCBeAwgZAGA1UdEQSBiDCBhYIeYWx0bnVsbC5weXRob24ub3JnAGV4YW1wbGUu -Y29tgSBudWxsQHB5dGhvbi5vcmcAdXNlckBleGFtcGxlLm9yZ4YpaHR0cDovL251 -bGwucHl0aG9uLm9yZwBodHRwOi8vZXhhbXBsZS5vcmeHBMAAAgGHECABDbgAAAAA -AAAAAAAAAAEwDQYJKoZIhvcNAQEFBQADggEBAKxPRe99SaghcI6IWT7UNkJw9aO9 -i9eo0Fj2MUqxpKbdb9noRDy2CnHWf7EIYZ1gznXPdwzSN4YCjV5d+Q9xtBaowT0j -HPERs1ZuytCNNJTmhyqZ8q6uzMLoht4IqH/FBfpvgaeC5tBTnTT0rD5A/olXeimk -kX4LxlEx5RAvpGB2zZVRGr6LobD9rVK91xuHYNIxxxfEGE8tCCWjp0+3ksri9SXx -VHWBnbM9YaL32u3hxm8sYB/Yb8WSBavJCWJJqRStVRHM1koZlJmXNx2BX4vPo6iW -RFEIPQsFZRLrtnCAiEhyT8bC2s/Njlu6ly9gtJZWSV46Q3ZjBL4q9sHKqZQ= ------END CERTIFICATE----- diff -Nru pypy-7.1.1+dfsg/pypy/module/_ssl/test/test_ssl.py pypy-7.3.1+dfsg/pypy/module/_ssl/test/test_ssl.py --- pypy-7.1.1+dfsg/pypy/module/_ssl/test/test_ssl.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_ssl/test/test_ssl.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,681 +0,0 @@ -from rpython.tool.udir import udir -import os - - -class AppTestSSL: - spaceconfig = dict(usemodules=('_ssl', '_socket', 'thread')) - - def setup_class(cls): - cls.w_nullbytecert = cls.space.wrap(os.path.join( - os.path.dirname(__file__), 'nullbytecert.pem')) - cls.w_allsans = cls.space.wrap(os.path.join( - os.path.dirname(__file__), 'allsans.pem')) - - def test_init_module(self): - import _ssl - assert _ssl._SSLSocket.__module__ == '_ssl' - assert _ssl._SSLContext.__module__ == '_ssl' - - def test_sslerror(self): - import _ssl, _socket - assert issubclass(_ssl.SSLError, Exception) - assert issubclass(_ssl.SSLError, IOError) - assert issubclass(_ssl.SSLError, _socket.error) - - def test_constants(self): - import _ssl - - assert isinstance(_ssl.SSL_ERROR_ZERO_RETURN, int) - assert isinstance(_ssl.SSL_ERROR_WANT_READ, int) - assert isinstance(_ssl.SSL_ERROR_WANT_WRITE, int) - assert isinstance(_ssl.SSL_ERROR_WANT_X509_LOOKUP, int) - assert isinstance(_ssl.SSL_ERROR_SYSCALL, int) - assert isinstance(_ssl.SSL_ERROR_SSL, int) - assert isinstance(_ssl.SSL_ERROR_WANT_CONNECT, int) - assert isinstance(_ssl.SSL_ERROR_EOF, int) - assert isinstance(_ssl.SSL_ERROR_INVALID_ERROR_CODE, int) - - assert isinstance(_ssl.OPENSSL_VERSION_INFO, tuple) - assert len(_ssl.OPENSSL_VERSION_INFO) == 5 - assert isinstance(_ssl.OPENSSL_VERSION, str) - lower_version = _ssl.OPENSSL_VERSION.lower() - assert 'openssl' in lower_version or "libressl" in lower_version - - assert isinstance(_ssl.ALERT_DESCRIPTION_ACCESS_DENIED, int) - - def test_RAND_add(self): - import _ssl - if not hasattr(_ssl, "RAND_add"): - skip("RAND_add is not available on this machine") - raises(TypeError, _ssl.RAND_add, 4, 4) - raises(TypeError, _ssl.RAND_add, "xyz", "zyx") - _ssl.RAND_add("xyz", 1.2345) - - def test_RAND_status(self): - import _ssl - if not hasattr(_ssl, "RAND_status"): - skip("RAND_status is not available on this machine") - _ssl.RAND_status() - - def test_RAND_egd(self): - import _ssl, os, stat - if not hasattr(_ssl, "RAND_egd"): - skip("RAND_egd is not available on this machine") - raises(TypeError, _ssl.RAND_egd, 4) - - # you need to install http://egd.sourceforge.net/ to test this - # execute "egd.pl entropy" in the current dir - if (not os.access("entropy", 0) or - not stat.S_ISSOCK(os.stat("entropy").st_mode)): - skip("This test needs a running entropy gathering daemon") - _ssl.RAND_egd("entropy") - - def test_sslwrap(self): - import _ssl, _socket, sys, gc - if sys.platform == 'darwin' or 'freebsd' in sys.platform or \ - 'openbsd' in sys.platform: - skip("hangs indefinitely on OSX & BSD (also on CPython)") - s = _socket.socket() - if sys.version_info < (2, 7, 9): - ss = _ssl.sslwrap(s, 0) - else: - ctx = _ssl._SSLContext(_ssl.PROTOCOL_TLS) - ss = ctx._wrap_socket(s, 0) - assert ss.context is ctx - exc = raises(_socket.error, ss.do_handshake) - if sys.platform == 'win32': - assert exc.value.errno == 10057 # WSAENOTCONN - else: - assert exc.value.errno == 32 # Broken pipe - del exc, ss, s - gc.collect() # force the destructor() to be called now - - def test_async_closed(self): - import _ssl, _socket, sys, gc - s = _socket.socket() - s.settimeout(3) - if sys.version_info < (2, 7, 9): - ss = _ssl.sslwrap(s, 0) - else: - ss = _ssl._SSLContext(_ssl.PROTOCOL_TLS)._wrap_socket(s, 0) - s.close() - exc = raises(_ssl.SSLError, ss.write, "data") - assert exc.value.message == 'Underlying socket has been closed.' - del exc, ss, s - gc.collect() # force the destructor() to be called now - - def test_test_decode_nullbytecert(self): - import _ssl - p = _ssl._test_decode_cert(self.nullbytecert) - subject = ((('countryName', 'US'),), - (('stateOrProvinceName', 'Oregon'),), - (('localityName', 'Beaverton'),), - (('organizationName', 'Python Software Foundation'),), - (('organizationalUnitName', 'Python Core Development'),), - (('commonName', 'null.python.org\x00example.org'),), - (('emailAddress', 'python-dev@python.org'),)) - assert p['subject'] == subject - assert p['issuer'] == subject - assert p['subjectAltName'] == \ - (('DNS', 'altnull.python.org\x00example.com'), - ('email', 'null@python.org\x00user@example.org'), - ('URI', 'http://null.python.org\x00http://example.org'), - ('IP Address', '192.0.2.1'), - ('IP Address', '2001:DB8:0:0:0:0:0:1\n')) - - def test_decode_all_sans(self): - import _ssl - _ssl._test_decode_cert(self.allsans) - - def test_context(self): - import _ssl - s = _ssl._SSLContext(_ssl.PROTOCOL_TLS) - raises(ValueError, _ssl._SSLContext, -1) - - assert type(s.options) is long - assert s.options & _ssl.OP_NO_SSLv3 - s.options &= ~_ssl.OP_NO_SSLv3 - assert not s.options & _ssl.OP_NO_SSLv3 - raises(TypeError, "s.options = 2.5") - - assert not s.check_hostname - exc = raises(ValueError, "s.check_hostname = True") - assert str(exc.value) == "check_hostname needs a SSL context with " \ - "either CERT_OPTIONAL or CERT_REQUIRED" - - assert s.verify_mode == _ssl.CERT_NONE - s.verify_mode = _ssl.CERT_REQUIRED - assert s.verify_mode == _ssl.CERT_REQUIRED - exc = raises(ValueError, "s.verify_mode = 1234") - assert str(exc.value) == "invalid value for verify_mode" - - assert type(s.verify_flags) is long - assert s.verify_flags == _ssl.VERIFY_DEFAULT - s.verify_flags = _ssl.VERIFY_CRL_CHECK_LEAF - assert s.verify_flags == _ssl.VERIFY_CRL_CHECK_LEAF - s.verify_flags = _ssl.VERIFY_DEFAULT - assert s.verify_flags == _ssl.VERIFY_DEFAULT - - s.check_hostname = True - assert s.check_hostname - - exc = raises(ValueError, "s.verify_mode = _ssl.CERT_NONE") - assert str(exc.value) == "Cannot set verify_mode to CERT_NONE " \ - "when check_hostname is enabled." - - def test_set_default_verify_paths(self): - import _ssl - s = _ssl._SSLContext(_ssl.PROTOCOL_TLS) - s.set_default_verify_paths() - - -class AppTestConnectedSSL: - spaceconfig = { - "usemodules": ['_ssl', '_socket', 'struct', 'binascii'], - } - - def setup_method(self, method): - # https://gmail.com/ - ADDR = "gmail.com", 443 - - self.w_s = self.space.appexec([self.space.wrap(ADDR)], """(ADDR): - import socket - s = socket.socket() - try: - s.connect(ADDR) - except: - skip("no network available or issues with connection") - return s - """) - - def teardown_method(self, method): - # pytest may keep some objects alive. - # So do some clean-up now without waiting for them to die - from ..interp_ssl import SOCKET_STORAGE - SOCKET_STORAGE._dict.clear() - - def test_warmup_connection(self): - # not sure it is gmail.com's fault, but on some machines the - # very first connection attempt fails. So we make one here and - # ignore the result. The first real test is test_connect(). - import socket, ssl - try: - ss = socket.ssl(self.s) - self.s.close() - except ssl.SSLError: - pass - - def test_connect(self): - import socket, gc - ss = socket.ssl(self.s) - self.s.close() - del ss; gc.collect() - - def test_write(self): - import socket, gc - ss = socket.ssl(self.s) - raises(TypeError, ss.write, 123) - num_bytes = ss.write("hello\n") - assert isinstance(num_bytes, int) - assert num_bytes >= 0 - self.s.close() - del ss; gc.collect() - - def test_read(self): - import socket, gc - ss = socket.ssl(self.s) - raises(TypeError, ss.read) - raises(TypeError, ss.read, "foo") - ss.write("hello\n") - data = ss.read(10) - assert isinstance(data, str) - assert ss.read(0) == '' - self.s.close() - del ss; gc.collect() - - def test_read_upto(self): - import socket, gc - ss = socket.ssl(self.s) - raises(TypeError, ss.read, "foo") - ss.write("hello\n") - data = ss.read(10) - assert isinstance(data, str) - assert len(data) == 10 - assert ss.pending() > 50 # many more bytes to read - self.s.close() - del ss; gc.collect() - - def test_read_buffer(self): - import socket, gc - ss = socket.ssl(self.s) - raises(TypeError, ss.read, "foo") - ss.write("hello\n") - buf = bytearray(10) - read = ss.read(-1, buf) - assert read == 10 - assert ss.pending() > 50 # many more bytes to read - self.s.close() - del ss; gc.collect() - - def test_shutdown(self): - import socket, ssl, sys, gc - ss = socket.ssl(self.s) - ss.write("hello\n") - try: - result = ss.shutdown() - except socket.error as e: - # xxx obscure case; throwing errno 0 is pretty odd... - if e.errno == 0: - skip("Shutdown raised errno 0. CPython does this too") - raise - assert result is self.s._sock - raises(ssl.SSLError, ss.write, "hello\n") - del ss; gc.collect() - - def test_npn_protocol(self): - import socket, _ssl, gc - if not _ssl.HAS_NPN: - skip("NPN requires OpenSSL 1.0.1 or greater") - - ctx = _ssl._SSLContext(_ssl.PROTOCOL_TLS) - ctx._set_npn_protocols(b'\x08http/1.1\x06spdy/2') - ss = ctx._wrap_socket(self.s._sock, True, - server_hostname="svn.python.org") - self.s.close() - del ss; gc.collect() - - def test_peer_certificate(self): - import _ssl, gc - ctx = _ssl._SSLContext(_ssl.PROTOCOL_TLS) - ss = ctx._wrap_socket(self.s._sock, False) - ss.do_handshake() - assert isinstance(ss.peer_certificate(der=True), bytes) - assert isinstance(ss.peer_certificate(), dict) - self.s.close() - del ss; gc.collect() - - def test_peer_certificate_verify(self): - import _ssl, ssl, gc - paths = ssl.get_default_verify_paths() - if not paths.capath and not paths.cafile: - skip("ssl.get_default_verify_paths() failed to return any path") - - ctx = _ssl._SSLContext(_ssl.PROTOCOL_TLS) - ctx.verify_mode = _ssl.CERT_REQUIRED - ctx.load_verify_locations(capath=paths.capath, cafile=paths.cafile) - - ss = ctx._wrap_socket(self.s._sock, False) - try: - ss.do_handshake() - except _ssl.SSLError as e: - if e.reason == 'CERTIFICATE_VERIFY_FAILED': - skip("Certificate verification failed. " - "Most likely we just don't have any CA certificates.") - assert ss.peer_certificate() - self.s.close() - del ss; gc.collect() - - def test_tls_unique_cb(self): - import ssl, sys, gc - ss = ssl.wrap_socket(self.s) - ss.do_handshake() - assert isinstance(ss.get_channel_binding(), bytes) - self.s.close() - del ss; gc.collect() - - def test_compression(self): - import ssl, sys, gc - ss = ssl.wrap_socket(self.s) - ss.do_handshake() - assert ss.compression() in [None, 'ZLIB', 'RLE'] - self.s.close() - del ss; gc.collect() - - -class AppTestConnectedSSL_Timeout(AppTestConnectedSSL): - # Same tests, with a socket timeout - # to exercise the poll() calls - spaceconfig = { - "usemodules": ['_ssl', '_socket', 'struct', 'binascii'], - } - - def setup_class(cls): - cls.space.appexec([], """(): - import socket; socket.setdefaulttimeout(1) - """) - - def teardown_class(cls): - cls.space.appexec([], """(): - import socket; socket.setdefaulttimeout(1) - """) - - -class AppTestContext: - spaceconfig = dict(usemodules=('_ssl',)) - - def setup_class(cls): - tmpfile = udir / "tmpfile.pem" - tmpfile.write(SSL_CERTIFICATE + SSL_PRIVATE_KEY) - cls.w_keycert = cls.space.wrap(str(tmpfile)) - tmpfile = udir / "key.pem" - tmpfile.write(SSL_PRIVATE_KEY) - cls.w_key = cls.space.wrap(str(tmpfile)) - tmpfile = udir / "cert.pem" - tmpfile.write(SSL_CERTIFICATE) - cls.w_cert = cls.space.wrap(str(tmpfile)) - tmpfile = udir / "badcert.pem" - tmpfile.write(SSL_BADCERT) - cls.w_badcert = cls.space.wrap(str(tmpfile)) - tmpfile = udir / "emptycert.pem" - tmpfile.write(SSL_EMPTYCERT) - cls.w_emptycert = cls.space.wrap(str(tmpfile)) - tmpfile = udir / "cert.passwd.pem" - tmpfile.write(SSL_CERTIFICATE_PROTECTED) - cls.w_cert_protected = cls.space.wrap(str(tmpfile)) - tmpfile = udir / "python.org.pem" - tmpfile.write(SVN_PYTHON_ORG_ROOT_CERT) - cls.w_python_org_cert = cls.space.wrap(str(tmpfile)) - cls.w_dh512 = cls.space.wrap(os.path.join( - os.path.dirname(__file__), 'dh512.pem')) - - def test_load_cert_chain(self): - import _ssl, errno - ctx = _ssl._SSLContext(_ssl.PROTOCOL_TLS) - ctx.load_cert_chain(self.keycert) - ctx.load_cert_chain(self.cert, self.key) - exc = raises(IOError, ctx.load_cert_chain, "inexistent.pem") - assert exc.value.errno == errno.ENOENT - exc = raises(_ssl.SSLError, ctx.load_cert_chain, self.badcert) - raises(_ssl.SSLError, ctx.load_cert_chain, self.emptycert) - # Password protected key and cert - raises(_ssl.SSLError, ctx.load_cert_chain, self.cert_protected, - password="badpass") - ctx.load_cert_chain(self.cert_protected, password="somepass") - ctx.load_cert_chain(self.cert_protected, password=lambda: "somepass") - raises(_ssl.SSLError, ctx.load_cert_chain, self.cert_protected, - password=lambda: "badpass") - raises(TypeError, ctx.load_cert_chain, self.cert_protected, - password=lambda: 3) - - def test_load_verify_locations(self): - import _ssl - ctx = _ssl._SSLContext(_ssl.PROTOCOL_TLS) - ctx.load_verify_locations(self.keycert) - ctx.load_verify_locations(cafile=self.keycert, capath=None) - - ctx = _ssl._SSLContext(_ssl.PROTOCOL_TLS) - with open(self.keycert) as f: - cacert_pem = f.read().decode('ascii') - ctx.load_verify_locations(cadata=cacert_pem) - assert ctx.cert_store_stats()["x509_ca"] == 0 - - def test_get_ca_certs(self): - import _ssl - ctx = _ssl._SSLContext(_ssl.PROTOCOL_TLS) - ctx.load_verify_locations(self.keycert) - assert ctx.get_ca_certs() == [] - ctx.load_verify_locations(self.python_org_cert) - certs = ctx.get_ca_certs() - assert len(certs) == 1 - print(certs) - assert len(certs[0]['issuer']) == 4 - assert certs[0]['version'] == 3 - assert certs[0]['crlDistributionPoints'] == ( - 'https://www.cacert.org/revoke.crl',) - - def test_cert_store_stats(self): - import _ssl - ctx = _ssl._SSLContext(_ssl.PROTOCOL_TLS) - assert ctx.cert_store_stats() == {'x509_ca': 0, 'crl': 0, 'x509': 0} - ctx.load_cert_chain(self.keycert) - assert ctx.cert_store_stats() == {'x509_ca': 0, 'crl': 0, 'x509': 0} - ctx.load_verify_locations(self.keycert) - assert ctx.cert_store_stats() == {'x509_ca': 0, 'crl': 0, 'x509': 1} - - def test_load_dh_params(self): - import _ssl, errno - ctx = _ssl._SSLContext(_ssl.PROTOCOL_TLS) - ctx.load_dh_params(self.dh512) - raises(TypeError, ctx.load_dh_params) - raises(TypeError, ctx.load_dh_params, None) - raises(_ssl.SSLError, ctx.load_dh_params, self.keycert) - exc = raises(IOError, ctx.load_dh_params, "inexistent.pem") - assert exc.value.errno == errno.ENOENT - - def test_set_ecdh_curve(self): - import _ssl - ctx = _ssl._SSLContext(_ssl.PROTOCOL_TLS) - ctx.set_ecdh_curve("prime256v1") - raises(ValueError, ctx.set_ecdh_curve, "foo") - - def test_get_default_verify_paths(self): - import _ssl - paths = _ssl.get_default_verify_paths() - assert paths[0] == 'SSL_CERT_FILE' - assert paths[2] == 'SSL_CERT_DIR' - assert paths[1].endswith('cert.pem') - assert paths[3].endswith('certs') - - def test_txt2obj(self): - import _ssl - assert _ssl.txt2obj('serverAuth', name=True) == ( - 129, 'serverAuth', 'TLS Web Server Authentication', - '1.3.6.1.5.5.7.3.1') - raises(ValueError, _ssl.txt2obj, 'serverAuth', name=False) - assert _ssl.txt2obj('1.3.6.1.5.5.7.3.1', name=True) == ( - 129, 'serverAuth', 'TLS Web Server Authentication', - '1.3.6.1.5.5.7.3.1') - - -class AppTestSSLError: - spaceconfig = dict(usemodules=('_ssl', '_socket', 'thread')) - - def setup_class(cls): - tmpfile = udir / "tmpfile.pem" - tmpfile.write(SSL_CERTIFICATE + SSL_PRIVATE_KEY) - cls.w_keycert = cls.space.wrap(str(tmpfile)) - - def test_str(self): - # The str() of a SSLError doesn't include the errno - import _ssl - e = _ssl.SSLError(1, "foo") - assert str(e) == "foo" - assert e.errno == 1 - # Same for a subclass - e = _ssl.SSLZeroReturnError(1, "foo") - assert str(e) == "foo" - assert e.errno == 1 - - def test_lib_reason(self): - # Test the library and reason attributes - import _ssl - ctx = _ssl._SSLContext(_ssl.PROTOCOL_TLS) - exc = raises(_ssl.SSLError, ctx.load_dh_params, self.keycert) - assert exc.value.library == 'PEM' - assert exc.value.reason == 'NO_START_LINE' - s = str(exc.value) - assert s.startswith("[PEM: NO_START_LINE] no start line") - - def test_subclass(self): - # Check that the appropriate SSLError subclass is raised - # (this only tests one of them) - import _ssl, _socket - ctx = _ssl._SSLContext(_ssl.PROTOCOL_TLS) - s = _socket.socket() - try: - s.bind(("127.0.0.1", 0)) - s.listen(5) - c = _socket.socket() - c.connect(s.getsockname()) - c.setblocking(False) - - c = ctx._wrap_socket(c, False) - try: - exc = raises(_ssl.SSLWantReadError, c.do_handshake) - msg= str(exc.value) - assert msg.startswith("The operation did not complete (read)") - # For compatibility - assert exc.value.errno == _ssl.SSL_ERROR_WANT_READ - finally: - try: - c.shutdown() - except _ssl.SSLError: - # If the expected exception was raised, the SSLContext - # can't be shut down yet - pass - finally: - s.close() - -SSL_CERTIFICATE = """ ------BEGIN CERTIFICATE----- -MIICVDCCAb2gAwIBAgIJANfHOBkZr8JOMA0GCSqGSIb3DQEBBQUAMF8xCzAJBgNV -BAYTAlhZMRcwFQYDVQQHEw5DYXN0bGUgQW50aHJheDEjMCEGA1UEChMaUHl0aG9u -IFNvZnR3YXJlIEZvdW5kYXRpb24xEjAQBgNVBAMTCWxvY2FsaG9zdDAeFw0xMDEw -MDgyMzAxNTZaFw0yMDEwMDUyMzAxNTZaMF8xCzAJBgNVBAYTAlhZMRcwFQYDVQQH -Ew5DYXN0bGUgQW50aHJheDEjMCEGA1UEChMaUHl0aG9uIFNvZnR3YXJlIEZvdW5k -YXRpb24xEjAQBgNVBAMTCWxvY2FsaG9zdDCBnzANBgkqhkiG9w0BAQEFAAOBjQAw -gYkCgYEA21vT5isq7F68amYuuNpSFlKDPrMUCa4YWYqZRt2OZ+/3NKaZ2xAiSwr7 -6MrQF70t5nLbSPpqE5+5VrS58SY+g/sXLiFd6AplH1wJZwh78DofbFYXUggktFMt -pTyiX8jtP66bkcPkDADA089RI1TQR6Ca+n7HFa7c1fabVV6i3zkCAwEAAaMYMBYw -FAYDVR0RBA0wC4IJbG9jYWxob3N0MA0GCSqGSIb3DQEBBQUAA4GBAHPctQBEQ4wd -BJ6+JcpIraopLn8BGhbjNWj40mmRqWB/NAWF6M5ne7KpGAu7tLeG4hb1zLaldK8G -lxy2GPSRF6LFS48dpEj2HbMv2nvv6xxalDMJ9+DicWgAKTQ6bcX2j3GUkCR0g/T1 -CRlNBAAlvhKzO7Clpf9l0YKBEfraJByX ------END CERTIFICATE----- -""" - -SSL_PRIVATE_KEY = """ ------BEGIN PRIVATE KEY----- -MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBANtb0+YrKuxevGpm -LrjaUhZSgz6zFAmuGFmKmUbdjmfv9zSmmdsQIksK++jK0Be9LeZy20j6ahOfuVa0 -ufEmPoP7Fy4hXegKZR9cCWcIe/A6H2xWF1IIJLRTLaU8ol/I7T+um5HD5AwAwNPP -USNU0Eegmvp+xxWu3NX2m1Veot85AgMBAAECgYA3ZdZ673X0oexFlq7AAmrutkHt -CL7LvwrpOiaBjhyTxTeSNWzvtQBkIU8DOI0bIazA4UreAFffwtvEuPmonDb3F+Iq -SMAu42XcGyVZEl+gHlTPU9XRX7nTOXVt+MlRRRxL6t9GkGfUAXI3XxJDXW3c0vBK -UL9xqD8cORXOfE06rQJBAP8mEX1ERkR64Ptsoe4281vjTlNfIbs7NMPkUnrn9N/Y -BLhjNIfQ3HFZG8BTMLfX7kCS9D593DW5tV4Z9BP/c6cCQQDcFzCcVArNh2JSywOQ -ZfTfRbJg/Z5Lt9Fkngv1meeGNPgIMLN8Sg679pAOOWmzdMO3V706rNPzSVMME7E5 -oPIfAkEA8pDddarP5tCvTTgUpmTFbakm0KoTZm2+FzHcnA4jRh+XNTjTOv98Y6Ik -eO5d1ZnKXseWvkZncQgxfdnMqqpj5wJAcNq/RVne1DbYlwWchT2Si65MYmmJ8t+F -0mcsULqjOnEMwf5e+ptq5LzwbyrHZYq5FNk7ocufPv/ZQrcSSC+cFwJBAKvOJByS -x56qyGeZLOQlWS2JS3KJo59XuLFGqcbgN9Om9xFa41Yb4N9NvplFivsvZdw3m1Q/ -SPIXQuT8RMPDVNQ= ------END PRIVATE KEY----- -""" -SSL_BADCERT = """ ------BEGIN RSA PRIVATE KEY----- -MIICXwIBAAKBgQC8ddrhm+LutBvjYcQlnH21PPIseJ1JVG2HMmN2CmZk2YukO+9L -opdJhTvbGfEj0DQs1IE8M+kTUyOmuKfVrFMKwtVeCJphrAnhoz7TYOuLBSqt7lVH -fhi/VwovESJlaBOp+WMnfhcduPEYHYx/6cnVapIkZnLt30zu2um+DzA9jQIDAQAB -AoGBAK0FZpaKj6WnJZN0RqhhK+ggtBWwBnc0U/ozgKz2j1s3fsShYeiGtW6CK5nU -D1dZ5wzhbGThI7LiOXDvRucc9n7vUgi0alqPQ/PFodPxAN/eEYkmXQ7W2k7zwsDA -IUK0KUhktQbLu8qF/m8qM86ba9y9/9YkXuQbZ3COl5ahTZrhAkEA301P08RKv3KM -oXnGU2UHTuJ1MAD2hOrPxjD4/wxA/39EWG9bZczbJyggB4RHu0I3NOSFjAm3HQm0 -ANOu5QK9owJBANgOeLfNNcF4pp+UikRFqxk5hULqRAWzVxVrWe85FlPm0VVmHbb/ -loif7mqjU8o1jTd/LM7RD9f2usZyE2psaw8CQQCNLhkpX3KO5kKJmS9N7JMZSc4j -oog58yeYO8BBqKKzpug0LXuQultYv2K4veaIO04iL9VLe5z9S/Q1jaCHBBuXAkEA -z8gjGoi1AOp6PBBLZNsncCvcV/0aC+1se4HxTNo2+duKSDnbq+ljqOM+E7odU+Nq -ewvIWOG//e8fssd0mq3HywJBAJ8l/c8GVmrpFTx8r/nZ2Pyyjt3dH1widooDXYSV -q6Gbf41Llo5sYAtmxdndTLASuHKecacTgZVhy0FryZpLKrU= ------END RSA PRIVATE KEY----- ------BEGIN CERTIFICATE----- -Just bad cert data ------END CERTIFICATE----- ------BEGIN RSA PRIVATE KEY----- -MIICXwIBAAKBgQC8ddrhm+LutBvjYcQlnH21PPIseJ1JVG2HMmN2CmZk2YukO+9L -opdJhTvbGfEj0DQs1IE8M+kTUyOmuKfVrFMKwtVeCJphrAnhoz7TYOuLBSqt7lVH -fhi/VwovESJlaBOp+WMnfhcduPEYHYx/6cnVapIkZnLt30zu2um+DzA9jQIDAQAB -AoGBAK0FZpaKj6WnJZN0RqhhK+ggtBWwBnc0U/ozgKz2j1s3fsShYeiGtW6CK5nU -D1dZ5wzhbGThI7LiOXDvRucc9n7vUgi0alqPQ/PFodPxAN/eEYkmXQ7W2k7zwsDA -IUK0KUhktQbLu8qF/m8qM86ba9y9/9YkXuQbZ3COl5ahTZrhAkEA301P08RKv3KM -oXnGU2UHTuJ1MAD2hOrPxjD4/wxA/39EWG9bZczbJyggB4RHu0I3NOSFjAm3HQm0 -ANOu5QK9owJBANgOeLfNNcF4pp+UikRFqxk5hULqRAWzVxVrWe85FlPm0VVmHbb/ -loif7mqjU8o1jTd/LM7RD9f2usZyE2psaw8CQQCNLhkpX3KO5kKJmS9N7JMZSc4j -oog58yeYO8BBqKKzpug0LXuQultYv2K4veaIO04iL9VLe5z9S/Q1jaCHBBuXAkEA -z8gjGoi1AOp6PBBLZNsncCvcV/0aC+1se4HxTNo2+duKSDnbq+ljqOM+E7odU+Nq -ewvIWOG//e8fssd0mq3HywJBAJ8l/c8GVmrpFTx8r/nZ2Pyyjt3dH1widooDXYSV -q6Gbf41Llo5sYAtmxdndTLASuHKecacTgZVhy0FryZpLKrU= ------END RSA PRIVATE KEY----- ------BEGIN CERTIFICATE----- -Just bad cert data ------END CERTIFICATE----- -""" -SSL_EMPTYCERT = "" -SSL_CERTIFICATE_PROTECTED = """ ------BEGIN RSA PRIVATE KEY----- -Proc-Type: 4,ENCRYPTED -DEK-Info: DES-EDE3-CBC,1A8D9D2A02EC698A - -kJYbfZ8L0sfe9Oty3gw0aloNnY5E8fegRfQLZlNoxTl6jNt0nIwI8kDJ36CZgR9c -u3FDJm/KqrfUoz8vW+qEnWhSG7QPX2wWGPHd4K94Yz/FgrRzZ0DoK7XxXq9gOtVA -AVGQhnz32p+6WhfGsCr9ArXEwRZrTk/FvzEPaU5fHcoSkrNVAGX8IpSVkSDwEDQr -Gv17+cfk99UV1OCza6yKHoFkTtrC+PZU71LomBabivS2Oc4B9hYuSR2hF01wTHP+ -YlWNagZOOVtNz4oKK9x9eNQpmfQXQvPPTfusexKIbKfZrMvJoxcm1gfcZ0H/wK6P -6wmXSG35qMOOztCZNtperjs1wzEBXznyK8QmLcAJBjkfarABJX9vBEzZV0OUKhy+ -noORFwHTllphbmydLhu6ehLUZMHPhzAS5UN7srtpSN81eerDMy0RMUAwA7/PofX1 -94Me85Q8jP0PC9ETdsJcPqLzAPETEYu0ELewKRcrdyWi+tlLFrpE5KT/s5ecbl9l -7B61U4Kfd1PIXc/siINhU3A3bYK+845YyUArUOnKf1kEox7p1RpD7yFqVT04lRTo -cibNKATBusXSuBrp2G6GNuhWEOSafWCKJQAzgCYIp6ZTV2khhMUGppc/2H3CF6cO -zX0KtlPVZC7hLkB6HT8SxYUwF1zqWY7+/XPPdc37MeEZ87Q3UuZwqORLY+Z0hpgt -L5JXBCoklZhCAaN2GqwFLXtGiRSRFGY7xXIhbDTlE65Wv1WGGgDLMKGE1gOz3yAo -2jjG1+yAHJUdE69XTFHSqSkvaloA1W03LdMXZ9VuQJ/ySXCie6ABAQ== ------END RSA PRIVATE KEY----- ------BEGIN CERTIFICATE----- -MIICVDCCAb2gAwIBAgIJANfHOBkZr8JOMA0GCSqGSIb3DQEBBQUAMF8xCzAJBgNV -BAYTAlhZMRcwFQYDVQQHEw5DYXN0bGUgQW50aHJheDEjMCEGA1UEChMaUHl0aG9u -IFNvZnR3YXJlIEZvdW5kYXRpb24xEjAQBgNVBAMTCWxvY2FsaG9zdDAeFw0xMDEw -MDgyMzAxNTZaFw0yMDEwMDUyMzAxNTZaMF8xCzAJBgNVBAYTAlhZMRcwFQYDVQQH -Ew5DYXN0bGUgQW50aHJheDEjMCEGA1UEChMaUHl0aG9uIFNvZnR3YXJlIEZvdW5k -YXRpb24xEjAQBgNVBAMTCWxvY2FsaG9zdDCBnzANBgkqhkiG9w0BAQEFAAOBjQAw -gYkCgYEA21vT5isq7F68amYuuNpSFlKDPrMUCa4YWYqZRt2OZ+/3NKaZ2xAiSwr7 -6MrQF70t5nLbSPpqE5+5VrS58SY+g/sXLiFd6AplH1wJZwh78DofbFYXUggktFMt -pTyiX8jtP66bkcPkDADA089RI1TQR6Ca+n7HFa7c1fabVV6i3zkCAwEAAaMYMBYw -FAYDVR0RBA0wC4IJbG9jYWxob3N0MA0GCSqGSIb3DQEBBQUAA4GBAHPctQBEQ4wd -BJ6+JcpIraopLn8BGhbjNWj40mmRqWB/NAWF6M5ne7KpGAu7tLeG4hb1zLaldK8G -lxy2GPSRF6LFS48dpEj2HbMv2nvv6xxalDMJ9+DicWgAKTQ6bcX2j3GUkCR0g/T1 -CRlNBAAlvhKzO7Clpf9l0YKBEfraJByX ------END CERTIFICATE----- -""" -SVN_PYTHON_ORG_ROOT_CERT = """ ------BEGIN CERTIFICATE----- -MIIHPTCCBSWgAwIBAgIBADANBgkqhkiG9w0BAQQFADB5MRAwDgYDVQQKEwdSb290 -IENBMR4wHAYDVQQLExVodHRwOi8vd3d3LmNhY2VydC5vcmcxIjAgBgNVBAMTGUNB -IENlcnQgU2lnbmluZyBBdXRob3JpdHkxITAfBgkqhkiG9w0BCQEWEnN1cHBvcnRA -Y2FjZXJ0Lm9yZzAeFw0wMzAzMzAxMjI5NDlaFw0zMzAzMjkxMjI5NDlaMHkxEDAO -BgNVBAoTB1Jvb3QgQ0ExHjAcBgNVBAsTFWh0dHA6Ly93d3cuY2FjZXJ0Lm9yZzEi -MCAGA1UEAxMZQ0EgQ2VydCBTaWduaW5nIEF1dGhvcml0eTEhMB8GCSqGSIb3DQEJ -ARYSc3VwcG9ydEBjYWNlcnQub3JnMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC -CgKCAgEAziLA4kZ97DYoB1CW8qAzQIxL8TtmPzHlawI229Z89vGIj053NgVBlfkJ -8BLPRoZzYLdufujAWGSuzbCtRRcMY/pnCujW0r8+55jE8Ez64AO7NV1sId6eINm6 -zWYyN3L69wj1x81YyY7nDl7qPv4coRQKFWyGhFtkZip6qUtTefWIonvuLwphK42y -fk1WpRPs6tqSnqxEQR5YYGUFZvjARL3LlPdCfgv3ZWiYUQXw8wWRBB0bF4LsyFe7 -w2t6iPGwcswlWyCR7BYCEo8y6RcYSNDHBS4CMEK4JZwFaz+qOqfrU0j36NK2B5jc -G8Y0f3/JHIJ6BVgrCFvzOKKrF11myZjXnhCLotLddJr3cQxyYN/Nb5gznZY0dj4k -epKwDpUeb+agRThHqtdB7Uq3EvbXG4OKDy7YCbZZ16oE/9KTfWgu3YtLq1i6L43q -laegw1SJpfvbi1EinbLDvhG+LJGGi5Z4rSDTii8aP8bQUWWHIbEZAWV/RRyH9XzQ -QUxPKZgh/TMfdQwEUfoZd9vUFBzugcMd9Zi3aQaRIt0AUMyBMawSB3s42mhb5ivU -fslfrejrckzzAeVLIL+aplfKkQABi6F1ITe1Yw1nPkZPcCBnzsXWWdsC4PDSy826 -YreQQejdIOQpvGQpQsgi3Hia/0PsmBsJUUtaWsJx8cTLc6nloQsCAwEAAaOCAc4w -ggHKMB0GA1UdDgQWBBQWtTIb1Mfz4OaO873SsDrusjkY0TCBowYDVR0jBIGbMIGY -gBQWtTIb1Mfz4OaO873SsDrusjkY0aF9pHsweTEQMA4GA1UEChMHUm9vdCBDQTEe -MBwGA1UECxMVaHR0cDovL3d3dy5jYWNlcnQub3JnMSIwIAYDVQQDExlDQSBDZXJ0 -IFNpZ25pbmcgQXV0aG9yaXR5MSEwHwYJKoZIhvcNAQkBFhJzdXBwb3J0QGNhY2Vy -dC5vcmeCAQAwDwYDVR0TAQH/BAUwAwEB/zAyBgNVHR8EKzApMCegJaAjhiFodHRw -czovL3d3dy5jYWNlcnQub3JnL3Jldm9rZS5jcmwwMAYJYIZIAYb4QgEEBCMWIWh0 -dHBzOi8vd3d3LmNhY2VydC5vcmcvcmV2b2tlLmNybDA0BglghkgBhvhCAQgEJxYl -aHR0cDovL3d3dy5jYWNlcnQub3JnL2luZGV4LnBocD9pZD0xMDBWBglghkgBhvhC -AQ0ESRZHVG8gZ2V0IHlvdXIgb3duIGNlcnRpZmljYXRlIGZvciBGUkVFIGhlYWQg -b3ZlciB0byBodHRwOi8vd3d3LmNhY2VydC5vcmcwDQYJKoZIhvcNAQEEBQADggIB -ACjH7pyCArpcgBLKNQodgW+JapnM8mgPf6fhjViVPr3yBsOQWqy1YPaZQwGjiHCc -nWKdpIevZ1gNMDY75q1I08t0AoZxPuIrA2jxNGJARjtT6ij0rPtmlVOKTV39O9lg -18p5aTuxZZKmxoGCXJzN600BiqXfEVWqFcofN8CCmHBh22p8lqOOLlQ+TyGpkO/c -gr/c6EWtTZBzCDyUZbAEmXZ/4rzCahWqlwQ3JNgelE5tDlG+1sSPypZt90Pf6DBl -Jzt7u0NDY8RD97LsaMzhGY4i+5jhe1o+ATc7iwiwovOVThrLm82asduycPAtStvY -sONvRUgzEv/+PDIqVPfE94rwiCPCR/5kenHA0R6mY7AHfqQv0wGP3J8rtsYIqQ+T -SCX8Ev2fQtzzxD72V7DX3WnRBnc0CkvSyqD/HMaMyRa+xMwyN2hzXwj7UfdJUzYF -CpUCTPJ5GhD22Dp1nPMd8aINcGeGG7MW9S/lpOt5hvk9C8JzC6WZrG/8Z7jlLwum -GCSNe9FINSkYQKyTYOGWhlC0elnYjyELn8+CkcY7v2vcB5G5l1YjqrZslMZIBjzk -zk6q5PYvCdxTby78dOs6Y5nCpqyJvKeyRKANihDjbPIky/qbn3BHLt4Ui9SyIAmW -omTxJBzcoTWcFbLUvFUufQb1nA5V9FrWk9p2rSVzTMVD ------END CERTIFICATE----- -""" diff -Nru pypy-7.1.1+dfsg/pypy/module/_ssl/test/test_win32.py pypy-7.3.1+dfsg/pypy/module/_ssl/test/test_win32.py --- pypy-7.1.1+dfsg/pypy/module/_ssl/test/test_win32.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_ssl/test/test_win32.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,53 +0,0 @@ -import sys - -if sys.platform != 'win32': - from py.test import skip - skip("ssl.enum_certificates is only available on Windows") - -class AppTestWin32: - spaceconfig = dict(usemodules=('_ssl',)) - - def setup_class(cls): - if sys.platform != 'win32': - py.test.skip("pexpect not found") - - def test_enum_certificates(self): - import _ssl - assert _ssl.enum_certificates("CA") - assert _ssl.enum_certificates("ROOT") - - raises(TypeError, _ssl.enum_certificates) - raises(WindowsError, _ssl.enum_certificates, "") - - trust_oids = set() - for storename in ("CA", "ROOT"): - store = _ssl.enum_certificates(storename) - assert isinstance(store, list) - for element in store: - assert isinstance(element, tuple) - assert len(element) == 3 - cert, enc, trust = element - assert isinstance(cert, bytes) - assert enc in {"x509_asn", "pkcs_7_asn"} - assert isinstance(trust, (set, bool)) - if isinstance(trust, set): - trust_oids.update(trust) - - serverAuth = "1.3.6.1.5.5.7.3.1" - assert serverAuth in trust_oids - - def test_enum_crls(self): - import _ssl - assert _ssl.enum_crls("CA") - raises(TypeError, _ssl.enum_crls) - raises(WindowsError, _ssl.enum_crls, "") - - crls = _ssl.enum_crls("CA") - assert isinstance(crls, list) - for element in crls: - assert isinstance(element, tuple) - assert len(element) == 2 - assert isinstance(element[0], bytes) - assert element[1] in {"x509_asn", "pkcs_7_asn"} - - diff -Nru pypy-7.1.1+dfsg/pypy/module/_ssl/test/test_ztranslation.py pypy-7.3.1+dfsg/pypy/module/_ssl/test/test_ztranslation.py --- pypy-7.1.1+dfsg/pypy/module/_ssl/test/test_ztranslation.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_ssl/test/test_ztranslation.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,4 +0,0 @@ -from pypy.objspace.fake.checkmodule import checkmodule - -def test__ssl_translates(): - checkmodule('_ssl') diff -Nru pypy-7.1.1+dfsg/pypy/module/_ssl/thread_lock.py pypy-7.3.1+dfsg/pypy/module/_ssl/thread_lock.py --- pypy-7.1.1+dfsg/pypy/module/_ssl/thread_lock.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_ssl/thread_lock.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,86 +0,0 @@ -from rpython.rlib import rthread -from rpython.rlib.ropenssl import libraries -from rpython.rtyper.lltypesystem import lltype, rffi -from rpython.translator.tool.cbuild import ExternalCompilationInfo - -# CRYPTO_set_locking_callback: -# -# this function is needed to perform locking on shared data -# structures. (Note that OpenSSL uses a number of global data -# structures that will be implicitly shared whenever multiple threads -# use OpenSSL.) Multi-threaded applications will crash at random if -# it is not set. -# -# locking_function() must be able to handle up to CRYPTO_num_locks() -# different mutex locks. It sets the n-th lock if mode & CRYPTO_LOCK, and -# releases it otherwise. -# -# filename and line are the file number of the function setting the -# lock. They can be useful for debugging. - - -# This logic is moved to C code so that the callbacks can be invoked -# without caring about the GIL. - -separate_module_source = """ -#include -#ifndef _WIN32 -# include -#endif - -static unsigned int _ssl_locks_count = 0; -static struct RPyOpaque_ThreadLock *_ssl_locks; - -static unsigned long _ssl_thread_id_function(void) { -#ifdef _WIN32 - return (unsigned long)GetCurrentThreadId(); -#else - return (unsigned long)pthread_self(); -#endif -} - -static void _ssl_thread_locking_function(int mode, int n, const char *file, - int line) { - if ((_ssl_locks == NULL) || - (n < 0) || ((unsigned)n >= _ssl_locks_count)) - return; - - if (mode & CRYPTO_LOCK) { - RPyThreadAcquireLock(_ssl_locks + n, 1); - } else { - RPyThreadReleaseLock(_ssl_locks + n); - } -} - -int _PyPy_SSL_SetupThreads(void) -{ - unsigned int i; - _ssl_locks_count = CRYPTO_num_locks(); - _ssl_locks = calloc(_ssl_locks_count, sizeof(struct RPyOpaque_ThreadLock)); - if (_ssl_locks == NULL) - return 0; - for (i=0; i<_ssl_locks_count; i++) { - if (RPyThreadLockInit(_ssl_locks + i) == 0) - return 0; - } - CRYPTO_set_locking_callback(_ssl_thread_locking_function); - CRYPTO_set_id_callback(_ssl_thread_id_function); - return 1; -} -""" - -eci = rthread.eci.merge(ExternalCompilationInfo( - separate_module_sources=[separate_module_source], - post_include_bits=[ - "RPY_EXTERN int _PyPy_SSL_SetupThreads(void);"], - libraries = libraries, -)) - -_PyPy_SSL_SetupThreads = rffi.llexternal('_PyPy_SSL_SetupThreads', - [], rffi.INT, - compilation_info=eci) - -def setup_ssl_threads(): - result = _PyPy_SSL_SetupThreads() - if rffi.cast(lltype.Signed, result) == 0: - raise MemoryError diff -Nru pypy-7.1.1+dfsg/pypy/module/struct/formatiterator.py pypy-7.3.1+dfsg/pypy/module/struct/formatiterator.py --- pypy-7.1.1+dfsg/pypy/module/struct/formatiterator.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/struct/formatiterator.py 2020-04-10 19:28:41.000000000 +0000 @@ -156,9 +156,8 @@ def read(self, count): curpos = self.pos - end = curpos + count self.advance(count) # raise if we are out of bound - return self.buf.getslice(curpos, end, 1, count) + return self.buf.getslice(curpos, 1, count) @specialize.argtype(1) def appendobj(self, value): diff -Nru pypy-7.1.1+dfsg/pypy/module/struct/__init__.py pypy-7.3.1+dfsg/pypy/module/struct/__init__.py --- pypy-7.1.1+dfsg/pypy/module/struct/__init__.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/struct/__init__.py 2020-04-10 19:28:41.000000000 +0000 @@ -1,64 +0,0 @@ - -""" -Mixed-module definition for the struct module. -Note that there is also a pure Python implementation in pypy/lib/struct.py; -the present mixed-module version of struct takes precedence if it is enabled. -""" - -from pypy.interpreter.mixedmodule import MixedModule - - -class Module(MixedModule): - """\ -Functions to convert between Python values and C structs. -Python strings are used to hold the data representing the C struct -and also as format strings to describe the layout of data in the C struct. - -The optional first format char indicates byte order, size and alignment: - @: native order, size & alignment (default) - =: native order, std. size & alignment - <: little-endian, std. size & alignment - >: big-endian, std. size & alignment - !: same as > - -The remaining chars indicate types of args and must match exactly; -these can be preceded by a decimal repeat count: - x: pad byte (no data); - c:char; - b:signed byte; - B:unsigned byte; - h:short; - H:unsigned short; - i:int; - I:unsigned int; - l:long; - L:unsigned long; - q:long long; - Q:unsigned long long - f:float; - d:double. -Special cases (preceding decimal count indicates length): - s:string (array of char); p: pascal string (with count byte). -Special case (only available in native format): - P:an integer type that is wide enough to hold a pointer. -Whitespace between formats is ignored. - -The variable struct.error is an exception raised on errors.""" - - applevel_name = "_struct" - - interpleveldefs = { - 'error': 'interp_struct.get_error(space)', - - 'calcsize': 'interp_struct.calcsize', - 'pack': 'interp_struct.pack', - 'pack_into': 'interp_struct.pack_into', - 'unpack': 'interp_struct.unpack', - 'unpack_from': 'interp_struct.unpack_from', - - 'Struct': 'interp_struct.W_Struct', - '_clearcache': 'interp_struct.clearcache', - } - - appleveldefs = { - } diff -Nru pypy-7.1.1+dfsg/pypy/module/struct/moduledef.py pypy-7.3.1+dfsg/pypy/module/struct/moduledef.py --- pypy-7.1.1+dfsg/pypy/module/struct/moduledef.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/struct/moduledef.py 2020-04-10 19:28:41.000000000 +0000 @@ -0,0 +1,64 @@ + +""" +Mixed-module definition for the struct module. +Note that there is also a pure Python implementation in pypy/lib/struct.py; +the present mixed-module version of struct takes precedence if it is enabled. +""" + +from pypy.interpreter.mixedmodule import MixedModule + + +class Module(MixedModule): + """\ +Functions to convert between Python values and C structs. +Python strings are used to hold the data representing the C struct +and also as format strings to describe the layout of data in the C struct. + +The optional first format char indicates byte order, size and alignment: + @: native order, size & alignment (default) + =: native order, std. size & alignment + <: little-endian, std. size & alignment + >: big-endian, std. size & alignment + !: same as > + +The remaining chars indicate types of args and must match exactly; +these can be preceded by a decimal repeat count: + x: pad byte (no data); + c:char; + b:signed byte; + B:unsigned byte; + h:short; + H:unsigned short; + i:int; + I:unsigned int; + l:long; + L:unsigned long; + q:long long; + Q:unsigned long long + f:float; + d:double. +Special cases (preceding decimal count indicates length): + s:string (array of char); p: pascal string (with count byte). +Special case (only available in native format): + P:an integer type that is wide enough to hold a pointer. +Whitespace between formats is ignored. + +The variable struct.error is an exception raised on errors.""" + + applevel_name = "_struct" + + interpleveldefs = { + 'error': 'interp_struct.get_error(space)', + + 'calcsize': 'interp_struct.calcsize', + 'pack': 'interp_struct.pack', + 'pack_into': 'interp_struct.pack_into', + 'unpack': 'interp_struct.unpack', + 'unpack_from': 'interp_struct.unpack_from', + + 'Struct': 'interp_struct.W_Struct', + '_clearcache': 'interp_struct.clearcache', + } + + appleveldefs = { + } diff -Nru pypy-7.1.1+dfsg/pypy/module/symbol/__init__.py pypy-7.3.1+dfsg/pypy/module/symbol/__init__.py --- pypy-7.1.1+dfsg/pypy/module/symbol/__init__.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/symbol/__init__.py 2020-04-10 19:28:41.000000000 +0000 @@ -1,24 +0,0 @@ -"""Dynamic replacement for the stdlib 'symbol' module. - -This module exports the symbol values computed by the grammar parser -at run-time. -""" - -from pypy.interpreter.mixedmodule import MixedModule -from pypy.interpreter.pyparser import pygram - - -class Module(MixedModule): - """Non-terminal symbols of Python grammar.""" - appleveldefs = {} - interpleveldefs = {} # see below - - -def _init_symbols(): - sym_name = {} - for name, val in pygram.python_grammar.symbol_ids.iteritems(): - Module.interpleveldefs[name] = 'space.wrap(%d)' % val - sym_name[val] = name - Module.interpleveldefs['sym_name'] = 'space.wrap(%r)' % (sym_name,) - -_init_symbols() diff -Nru pypy-7.1.1+dfsg/pypy/module/symbol/moduledef.py pypy-7.3.1+dfsg/pypy/module/symbol/moduledef.py --- pypy-7.1.1+dfsg/pypy/module/symbol/moduledef.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/symbol/moduledef.py 2020-04-10 19:28:41.000000000 +0000 @@ -0,0 +1,24 @@ +"""Dynamic replacement for the stdlib 'symbol' module. + +This module exports the symbol values computed by the grammar parser +at run-time. +""" + +from pypy.interpreter.mixedmodule import MixedModule +from pypy.interpreter.pyparser import pygram + + +class Module(MixedModule): + """Non-terminal symbols of Python grammar.""" + appleveldefs = {} + interpleveldefs = {} # see below + + +def _init_symbols(): + sym_name = {} + for name, val in pygram.python_grammar.symbol_ids.iteritems(): + Module.interpleveldefs[name] = 'space.wrap(%d)' % val + sym_name[val] = name + Module.interpleveldefs['sym_name'] = 'space.wrap(%r)' % (sym_name,) + +_init_symbols() diff -Nru pypy-7.1.1+dfsg/pypy/module/sys/currentframes.py pypy-7.3.1+dfsg/pypy/module/sys/currentframes.py --- pypy-7.1.1+dfsg/pypy/module/sys/currentframes.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/sys/currentframes.py 2020-04-10 19:28:41.000000000 +0000 @@ -1,76 +1,27 @@ """ Implementation of the 'sys._current_frames()' routine. """ -from pypy.interpreter import gateway -app = gateway.applevel(''' -"NOT_RPYTHON" -import __builtin__ - -class fake_code(object): - co_name = "?" - co_filename = "?" - co_firstlineno = 0 - -class fake_frame(object): - f_back = None - f_builtins = __builtin__.__dict__ - f_code = fake_code() - f_exc_traceback = None - f_exc_type = None - f_exc_value = None - f_globals = {} - f_lasti = -1 - f_lineno = 0 - f_locals = {} - f_restricted = False - f_trace = None - - def __init__(self, f): - if f is not None: - for name in ["f_builtins", "f_code", "f_globals", "f_lasti", - "f_lineno"]: - setattr(self, name, getattr(f, name)) -''') def _current_frames(space): """_current_frames() -> dictionary Return a dictionary mapping each current thread T's thread id to T's - current stack "frame". Functions in the traceback module can build the + current stack frame. Functions in the traceback module can build the call stack given such a frame. - Note that in PyPy this returns fake frame objects, to avoid a runtime - penalty everywhere with the JIT. (So far these fake frames can be - completely uninformative depending on the JIT state; we could return - more with more efforts.) + Note that in PyPy with the JIT, calling this function causes a runtime + penalty in all threads, depending on the internal JIT state. In each + thread, the penalty should only be noticeable if this call was done + while in the middle of a long-running function. This function should be used for specialized purposes only.""" w_result = space.newdict() - w_fake_frame = app.wget(space, "fake_frame") ecs = space.threadlocals.getallvalues() for thread_ident, ec in ecs.items(): - vref = ec.topframeref - frames = [] - while not vref.virtual: - f = vref() - if f is None: - break - frames.append(f) - vref = f.f_backref - else: - frames.append(None) - - w_topframe = space.w_None - w_prevframe = None - for f in frames: - w_nextframe = space.call_function(w_fake_frame, space.wrap_none(f)) - if w_prevframe is None: - w_topframe = w_nextframe - else: - space.setattr(w_prevframe, space.newtext('f_back'), w_nextframe) - w_prevframe = w_nextframe - + w_topframe = ec.gettopframe_nohidden() + if w_topframe is None: + continue space.setitem(w_result, space.newint(thread_ident), w_topframe) diff -Nru pypy-7.1.1+dfsg/pypy/module/sys/__init__.py pypy-7.3.1+dfsg/pypy/module/sys/__init__.py --- pypy-7.1.1+dfsg/pypy/module/sys/__init__.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/sys/__init__.py 2020-04-10 19:28:41.000000000 +0000 @@ -1,184 +0,0 @@ -from pypy.interpreter.mixedmodule import MixedModule -from pypy.interpreter.error import OperationError -from rpython.rlib.objectmodel import we_are_translated -from rpython.rlib import rdynload -import sys - -_WIN = sys.platform == 'win32' - -class Module(MixedModule): - """Sys Builtin Module. """ - _immutable_fields_ = ["defaultencoding?", "debug?"] - - def __init__(self, space, w_name): - """NOT_RPYTHON""" # because parent __init__ isn't - if space.config.translating: - del self.__class__.interpleveldefs['pypy_getudir'] - super(Module, self).__init__(space, w_name) - self.recursionlimit = 1000 - self.w_default_encoder = None - self.defaultencoding = "ascii" - self.filesystemencoding = None - self.debug = True - self.track_resources = False - self.dlopenflags = rdynload._dlopen_default_mode() - - interpleveldefs = { - '__name__' : '(space.newtext("sys"))', - '__doc__' : '(space.newtext("PyPy sys module"))', - - 'platform' : 'space.newtext(sys.platform)', - 'maxint' : 'space.newint(sys.maxint)', - 'maxsize' : 'space.newint(sys.maxint)', - 'byteorder' : 'space.newtext(sys.byteorder)', - 'maxunicode' : 'space.newint(vm.MAXUNICODE)', - 'stdin' : 'state.getio(space).w_stdin', - '__stdin__' : 'state.getio(space).w_stdin', - 'stdout' : 'state.getio(space).w_stdout', - '__stdout__' : 'state.getio(space).w_stdout', - 'stderr' : 'state.getio(space).w_stderr', - '__stderr__' : 'state.getio(space).w_stderr', - 'pypy_objspaceclass' : 'space.newtext(repr(space))', - 'prefix' : 'state.get(space).w_initial_prefix', - 'exec_prefix' : 'state.get(space).w_initial_prefix', - 'path' : 'state.get(space).w_path', - 'modules' : 'state.get(space).w_modules', - 'argv' : 'state.get(space).w_argv', - 'py3kwarning' : 'space.w_False', - 'warnoptions' : 'state.get(space).w_warnoptions', - 'builtin_module_names' : 'space.w_None', - 'pypy_getudir' : 'state.pypy_getudir', # not translated - 'pypy_find_stdlib' : 'initpath.pypy_find_stdlib', - 'pypy_find_executable' : 'initpath.pypy_find_executable', - 'pypy_resolvedirof' : 'initpath.pypy_resolvedirof', - - '_getframe' : 'vm._getframe', - '_current_frames' : 'currentframes._current_frames', - 'setrecursionlimit' : 'vm.setrecursionlimit', - 'getrecursionlimit' : 'vm.getrecursionlimit', - 'pypy_set_track_resources' : 'vm.set_track_resources', - 'pypy_get_track_resources' : 'vm.get_track_resources', - 'setcheckinterval' : 'vm.setcheckinterval', - 'getcheckinterval' : 'vm.getcheckinterval', - 'exc_info' : 'vm.exc_info', - 'exc_clear' : 'vm.exc_clear', - 'settrace' : 'vm.settrace', - 'gettrace' : 'vm.gettrace', - 'setprofile' : 'vm.setprofile', - 'getprofile' : 'vm.getprofile', - 'call_tracing' : 'vm.call_tracing', - 'getsizeof' : 'vm.getsizeof', - - 'api_version' : 'version.get_api_version(space)', - 'version_info' : 'version.get_version_info(space)', - #'version' : set in startup() - 'pypy_version_info' : 'version.get_pypy_version_info(space)', - 'subversion' : 'version.get_subversion_info(space)', - '_mercurial' : 'version.get_repo_info(space)', - 'hexversion' : 'version.get_hexversion(space)', - - 'displayhook' : 'hook.displayhook', - '__displayhook__' : 'hook.__displayhook__', - 'meta_path' : 'space.newlist([])', - 'path_hooks' : 'space.newlist([])', - 'path_importer_cache' : 'space.newdict()', - 'dont_write_bytecode' : 'space.newbool(space.config.translation.sandbox)', - - 'getdefaultencoding' : 'interp_encoding.getdefaultencoding', - 'setdefaultencoding' : 'interp_encoding.setdefaultencoding', - 'getfilesystemencoding' : 'interp_encoding.getfilesystemencoding', - - 'float_info' : 'system.get_float_info(space)', - 'long_info' : 'system.get_long_info(space)', - 'float_repr_style' : 'system.get_float_repr_style(space)', - } - - if sys.platform == 'win32': - interpleveldefs['winver'] = 'version.get_winver(space)' - interpleveldefs['getwindowsversion'] = 'vm.getwindowsversion' - else: - interpleveldefs['getdlopenflags'] = 'system.getdlopenflags' - interpleveldefs['setdlopenflags'] = 'system.setdlopenflags' - - appleveldefs = { - 'excepthook' : 'app.excepthook', - '__excepthook__' : 'app.excepthook', - 'exit' : 'app.exit', - 'exitfunc' : 'app.exitfunc', - 'callstats' : 'app.callstats', - 'copyright' : 'app.copyright_str', - 'flags' : 'app.null_sysflags', - } - - def startup(self, space): - if space.config.translating and not we_are_translated(): - # don't get the filesystemencoding at translation time - assert self.filesystemencoding is None - - else: - from pypy.module.sys import version - space.setitem(self.w_dict, space.newtext("version"), - version.get_version(space)) - if _WIN: - from pypy.module.sys import vm - w_handle = vm.get_dllhandle(space) - space.setitem(self.w_dict, space.newtext("dllhandle"), w_handle) - - def getmodule(self, name): - space = self.space - w_modules = self.get('modules') - try: - return space.getitem(w_modules, space.newtext(name)) - except OperationError as e: - if not e.match(space, space.w_KeyError): - raise - return None - - def setmodule(self, w_module): - space = self.space - w_name = self.space.getattr(w_module, space.newtext('__name__')) - w_modules = self.get('modules') - self.space.setitem(w_modules, w_name, w_module) - - def getdictvalue(self, space, attr): - """ specialize access to dynamic exc_* attributes. """ - value = MixedModule.getdictvalue(self, space, attr) - if value is not None: - return value - if attr == 'exc_type': - operror = space.getexecutioncontext().sys_exc_info() - if operror is None: - return space.w_None - else: - return operror.w_type - elif attr == 'exc_value': - operror = space.getexecutioncontext().sys_exc_info() - if operror is None: - return space.w_None - else: - return operror.get_w_value(space) - elif attr == 'exc_traceback': - operror = space.getexecutioncontext().sys_exc_info() - if operror is None: - return space.w_None - else: - return operror.get_w_traceback(space) - return None - - def get_w_default_encoder(self): - if self.w_default_encoder is not None: - # XXX is this level of caching ok? CPython has some shortcuts - # for common encodings, but as far as I can see it has no general - # cache. - return self.w_default_encoder - else: - from pypy.module.sys.interp_encoding import get_w_default_encoder - return get_w_default_encoder(self.space) - - def get_flag(self, name): - space = self.space - return space.int_w(space.getattr(self.get('flags'), space.newtext(name))) - - def get_state(self, space): - from pypy.module.sys import state - return state.get(space) diff -Nru pypy-7.1.1+dfsg/pypy/module/sys/moduledef.py pypy-7.3.1+dfsg/pypy/module/sys/moduledef.py --- pypy-7.1.1+dfsg/pypy/module/sys/moduledef.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/sys/moduledef.py 2020-04-10 19:28:41.000000000 +0000 @@ -0,0 +1,184 @@ +from pypy.interpreter.mixedmodule import MixedModule +from pypy.interpreter.error import OperationError +from rpython.rlib.objectmodel import we_are_translated +from rpython.rlib import rdynload +import sys + +_WIN = sys.platform == 'win32' + +class Module(MixedModule): + """Sys Builtin Module. """ + _immutable_fields_ = ["defaultencoding?", "debug?"] + + def __init__(self, space, w_name): + """NOT_RPYTHON""" # because parent __init__ isn't + if space.config.translating: + del self.__class__.interpleveldefs['pypy_getudir'] + super(Module, self).__init__(space, w_name) + self.recursionlimit = 1000 + self.w_default_encoder = None + self.defaultencoding = "ascii" + self.filesystemencoding = None + self.debug = True + self.track_resources = False + self.dlopenflags = rdynload._dlopen_default_mode() + + interpleveldefs = { + '__name__' : '(space.newtext("sys"))', + '__doc__' : '(space.newtext("PyPy sys module"))', + + 'platform' : 'space.newtext(sys.platform)', + 'maxint' : 'space.newint(sys.maxint)', + 'maxsize' : 'space.newint(sys.maxint)', + 'byteorder' : 'space.newtext(sys.byteorder)', + 'maxunicode' : 'space.newint(vm.MAXUNICODE)', + 'stdin' : 'state.getio(space).w_stdin', + '__stdin__' : 'state.getio(space).w_stdin', + 'stdout' : 'state.getio(space).w_stdout', + '__stdout__' : 'state.getio(space).w_stdout', + 'stderr' : 'state.getio(space).w_stderr', + '__stderr__' : 'state.getio(space).w_stderr', + 'pypy_objspaceclass' : 'space.newtext(repr(space))', + 'prefix' : 'state.get(space).w_initial_prefix', + 'exec_prefix' : 'state.get(space).w_initial_prefix', + 'path' : 'state.get(space).w_path', + 'modules' : 'state.get(space).w_modules', + 'argv' : 'state.get(space).w_argv', + 'py3kwarning' : 'space.w_False', + 'warnoptions' : 'state.get(space).w_warnoptions', + 'builtin_module_names' : 'space.w_None', + 'pypy_getudir' : 'state.pypy_getudir', # not translated + 'pypy_find_stdlib' : 'initpath.pypy_find_stdlib', + 'pypy_find_executable' : 'initpath.pypy_find_executable', + 'pypy_resolvedirof' : 'initpath.pypy_resolvedirof', + + '_getframe' : 'vm._getframe', + '_current_frames' : 'currentframes._current_frames', + 'setrecursionlimit' : 'vm.setrecursionlimit', + 'getrecursionlimit' : 'vm.getrecursionlimit', + 'pypy_set_track_resources' : 'vm.set_track_resources', + 'pypy_get_track_resources' : 'vm.get_track_resources', + 'setcheckinterval' : 'vm.setcheckinterval', + 'getcheckinterval' : 'vm.getcheckinterval', + 'exc_info' : 'vm.exc_info', + 'exc_clear' : 'vm.exc_clear', + 'settrace' : 'vm.settrace', + 'gettrace' : 'vm.gettrace', + 'setprofile' : 'vm.setprofile', + 'getprofile' : 'vm.getprofile', + 'call_tracing' : 'vm.call_tracing', + 'getsizeof' : 'vm.getsizeof', + + 'api_version' : 'version.get_api_version(space)', + 'version_info' : 'version.get_version_info(space)', + #'version' : set in startup() + 'pypy_version_info' : 'version.get_pypy_version_info(space)', + 'subversion' : 'version.get_subversion_info(space)', + '_mercurial' : 'version.get_repo_info(space)', + 'hexversion' : 'version.get_hexversion(space)', + + 'displayhook' : 'hook.displayhook', + '__displayhook__' : 'hook.__displayhook__', + 'meta_path' : 'space.newlist([])', + 'path_hooks' : 'space.newlist([])', + 'path_importer_cache' : 'space.newdict()', + 'dont_write_bytecode' : 'space.newbool(space.config.translation.sandbox)', + + 'getdefaultencoding' : 'interp_encoding.getdefaultencoding', + 'setdefaultencoding' : 'interp_encoding.setdefaultencoding', + 'getfilesystemencoding' : 'interp_encoding.getfilesystemencoding', + + 'float_info' : 'system.get_float_info(space)', + 'long_info' : 'system.get_long_info(space)', + 'float_repr_style' : 'system.get_float_repr_style(space)', + } + + if sys.platform == 'win32': + interpleveldefs['winver'] = 'version.get_winver(space)' + interpleveldefs['getwindowsversion'] = 'vm.getwindowsversion' + else: + interpleveldefs['getdlopenflags'] = 'system.getdlopenflags' + interpleveldefs['setdlopenflags'] = 'system.setdlopenflags' + + appleveldefs = { + 'excepthook' : 'app.excepthook', + '__excepthook__' : 'app.excepthook', + 'exit' : 'app.exit', + 'exitfunc' : 'app.exitfunc', + 'callstats' : 'app.callstats', + 'copyright' : 'app.copyright_str', + 'flags' : 'app.null_sysflags', + } + + def startup(self, space): + if space.config.translating and not we_are_translated(): + # don't get the filesystemencoding at translation time + assert self.filesystemencoding is None + + else: + from pypy.module.sys import version + space.setitem(self.w_dict, space.newtext("version"), + version.get_version(space)) + if _WIN: + from pypy.module.sys import vm + w_handle = vm.get_dllhandle(space) + space.setitem(self.w_dict, space.newtext("dllhandle"), w_handle) + + def getmodule(self, name): + space = self.space + w_modules = self.get('modules') + try: + return space.getitem(w_modules, space.newtext(name)) + except OperationError as e: + if not e.match(space, space.w_KeyError): + raise + return None + + def setmodule(self, w_module): + space = self.space + w_name = self.space.getattr(w_module, space.newtext('__name__')) + w_modules = self.get('modules') + self.space.setitem(w_modules, w_name, w_module) + + def getdictvalue(self, space, attr): + """ specialize access to dynamic exc_* attributes. """ + value = MixedModule.getdictvalue(self, space, attr) + if value is not None: + return value + if attr == 'exc_type': + operror = space.getexecutioncontext().sys_exc_info() + if operror is None: + return space.w_None + else: + return operror.w_type + elif attr == 'exc_value': + operror = space.getexecutioncontext().sys_exc_info() + if operror is None: + return space.w_None + else: + return operror.get_w_value(space) + elif attr == 'exc_traceback': + operror = space.getexecutioncontext().sys_exc_info() + if operror is None: + return space.w_None + else: + return operror.get_w_traceback(space) + return None + + def get_w_default_encoder(self): + if self.w_default_encoder is not None: + # XXX is this level of caching ok? CPython has some shortcuts + # for common encodings, but as far as I can see it has no general + # cache. + return self.w_default_encoder + else: + from pypy.module.sys.interp_encoding import get_w_default_encoder + return get_w_default_encoder(self.space) + + def get_flag(self, name): + space = self.space + return space.int_w(space.getattr(self.get('flags'), space.newtext(name))) + + def get_state(self, space): + from pypy.module.sys import state + return state.get(space) diff -Nru pypy-7.1.1+dfsg/pypy/module/sys/version.py pypy-7.3.1+dfsg/pypy/module/sys/version.py --- pypy-7.1.1+dfsg/pypy/module/sys/version.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/sys/version.py 2020-04-10 19:28:42.000000000 +0000 @@ -13,7 +13,7 @@ # make sure to keep PYPY_VERSION in sync with: # module/cpyext/include/patchlevel.h # doc/conf.py -PYPY_VERSION = (7, 1, 1, "final", 0) +PYPY_VERSION = (7, 3, 1, "final", 0) import pypy diff -Nru pypy-7.1.1+dfsg/pypy/module/sys/vm.py pypy-7.3.1+dfsg/pypy/module/sys/vm.py --- pypy-7.1.1+dfsg/pypy/module/sys/vm.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/sys/vm.py 2020-04-10 19:28:41.000000000 +0000 @@ -49,12 +49,25 @@ reserves 768KB of stack space, which should suffice (on Linux, depending on the compiler settings) for ~1400 calls. Setting the value to N reserves N/1000 times 768KB of stack space. + +Note that there are other factors that also limit the stack size. +The operating system typically sets a maximum which can be changed +manually (e.g. with "ulimit" on Linux) for the main thread. For other +threads you can configure the limit by calling "threading.stack_size()". """ from rpython.rlib.rstack import _stack_set_length_fraction + from rpython.rlib.rgc import increase_root_stack_depth if new_limit <= 0: raise oefmt(space.w_ValueError, "recursion limit must be positive") + # Some programs use very large values to mean "don't check, I want to + # use as much as possible and then segfault". Add a silent upper bound + # of 10**6 here, because huge values cause huge shadowstacks to be + # allocated (or MemoryErrors). + if new_limit > 1000000: + new_limit = 1000000 space.sys.recursionlimit = new_limit _stack_set_length_fraction(new_limit * 0.001) + increase_root_stack_depth(int(new_limit * 0.001 * 163840)) def getrecursionlimit(space): """Return the last value set by setrecursionlimit(). diff -Nru pypy-7.1.1+dfsg/pypy/module/termios/__init__.py pypy-7.3.1+dfsg/pypy/module/termios/__init__.py --- pypy-7.1.1+dfsg/pypy/module/termios/__init__.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/termios/__init__.py 2020-04-10 19:28:41.000000000 +0000 @@ -1,30 +0,0 @@ -from pypy.interpreter.mixedmodule import MixedModule - -from rpython.rlib import rtermios - -class Module(MixedModule): - "This module provides an interface to the Posix calls for tty I/O control.\n\ - For a complete description of these calls, see the Posix or Unix manual\n\ - pages. It is only available for those Unix versions that support Posix\n\ - termios style tty I/O control.\n\ - \n\ - All functions in this module take a file descriptor fd as their first\n\ - argument. This can be an integer file descriptor, such as returned by\n\ - sys.stdin.fileno(), or a file object, such as sys.stdin itself." - - appleveldefs = { - } - - interpleveldefs = { - 'tcdrain' : 'interp_termios.tcdrain', - 'tcflow' : 'interp_termios.tcflow', - 'tcflush' : 'interp_termios.tcflush', - 'tcgetattr' : 'interp_termios.tcgetattr', - 'tcsendbreak' : 'interp_termios.tcsendbreak', - 'tcsetattr' : 'interp_termios.tcsetattr', - 'error' : 'space.fromcache(interp_termios.Cache).w_error', - } - - for name in rtermios.all_constants: - value = getattr(rtermios, name) - interpleveldefs[name] = "space.wrap(%s)" % value diff -Nru pypy-7.1.1+dfsg/pypy/module/termios/moduledef.py pypy-7.3.1+dfsg/pypy/module/termios/moduledef.py --- pypy-7.1.1+dfsg/pypy/module/termios/moduledef.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/termios/moduledef.py 2020-04-10 19:28:41.000000000 +0000 @@ -0,0 +1,30 @@ +from pypy.interpreter.mixedmodule import MixedModule + +from rpython.rlib import rtermios + +class Module(MixedModule): + "This module provides an interface to the Posix calls for tty I/O control.\n\ + For a complete description of these calls, see the Posix or Unix manual\n\ + pages. It is only available for those Unix versions that support Posix\n\ + termios style tty I/O control.\n\ + \n\ + All functions in this module take a file descriptor fd as their first\n\ + argument. This can be an integer file descriptor, such as returned by\n\ + sys.stdin.fileno(), or a file object, such as sys.stdin itself." + + appleveldefs = { + } + + interpleveldefs = { + 'tcdrain' : 'interp_termios.tcdrain', + 'tcflow' : 'interp_termios.tcflow', + 'tcflush' : 'interp_termios.tcflush', + 'tcgetattr' : 'interp_termios.tcgetattr', + 'tcsendbreak' : 'interp_termios.tcsendbreak', + 'tcsetattr' : 'interp_termios.tcsetattr', + 'error' : 'space.fromcache(interp_termios.Cache).w_error', + } + + for name in rtermios.all_constants: + value = getattr(rtermios, name) + interpleveldefs[name] = "space.wrap(%s)" % value diff -Nru pypy-7.1.1+dfsg/pypy/module/_testing/__init__.py pypy-7.3.1+dfsg/pypy/module/_testing/__init__.py --- pypy-7.1.1+dfsg/pypy/module/_testing/__init__.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_testing/__init__.py 2020-04-10 19:28:40.000000000 +0000 @@ -1,17 +0,0 @@ - -""" -Mixed-module definition for pypy own testing purposes -""" - -from pypy.interpreter.mixedmodule import MixedModule - - -class Module(MixedModule): - """PyPy own testing""" - - interpleveldefs = { - } - - appleveldefs = { - 'Hidden': 'app_notrpython.Hidden', - } diff -Nru pypy-7.1.1+dfsg/pypy/module/_testing/moduledef.py pypy-7.3.1+dfsg/pypy/module/_testing/moduledef.py --- pypy-7.1.1+dfsg/pypy/module/_testing/moduledef.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_testing/moduledef.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,17 @@ + +""" +Mixed-module definition for pypy own testing purposes +""" + +from pypy.interpreter.mixedmodule import MixedModule + + +class Module(MixedModule): + """PyPy own testing""" + + interpleveldefs = { + } + + appleveldefs = { + 'Hidden': 'app_notrpython.Hidden', + } diff -Nru pypy-7.1.1+dfsg/pypy/module/thread/__init__.py pypy-7.3.1+dfsg/pypy/module/thread/__init__.py --- pypy-7.1.1+dfsg/pypy/module/thread/__init__.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/thread/__init__.py 2020-04-10 19:28:41.000000000 +0000 @@ -1,38 +0,0 @@ - -# Package initialisation -from pypy.interpreter.mixedmodule import MixedModule - -class Module(MixedModule): - appleveldefs = { - } - - interpleveldefs = { - 'start_new_thread': 'os_thread.start_new_thread', - 'start_new': 'os_thread.start_new_thread', # obsolete syn. - 'get_ident': 'os_thread.get_ident', - 'exit': 'os_thread.exit', - 'exit_thread': 'os_thread.exit', # obsolete synonym - 'interrupt_main': 'os_thread.interrupt_main', - 'stack_size': 'os_thread.stack_size', - '_count': 'os_thread._count', - 'allocate_lock': 'os_lock.allocate_lock', - 'allocate': 'os_lock.allocate_lock', # obsolete synonym - 'LockType': 'os_lock.Lock', - 'RLock': 'os_lock.W_RLock', # pypy only, issue #2905 - '_local': 'os_local.Local', - 'error': 'space.fromcache(error.Cache).w_error', - } - - def __init__(self, space, *args): - "NOT_RPYTHON: patches space.threadlocals to use real threadlocals" - from pypy.module.thread import gil - MixedModule.__init__(self, space, *args) - prev_ec = space.threadlocals.get_ec() - space.threadlocals = gil.GILThreadLocals(space) - space.threadlocals.initialize(space) - if prev_ec is not None: - space.threadlocals._set_ec(prev_ec) - - from pypy.module.posix.interp_posix import add_fork_hook - from pypy.module.thread.os_thread import reinit_threads - add_fork_hook('child', reinit_threads) diff -Nru pypy-7.1.1+dfsg/pypy/module/thread/moduledef.py pypy-7.3.1+dfsg/pypy/module/thread/moduledef.py --- pypy-7.1.1+dfsg/pypy/module/thread/moduledef.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/thread/moduledef.py 2020-04-10 19:28:41.000000000 +0000 @@ -0,0 +1,38 @@ + +# Package initialisation +from pypy.interpreter.mixedmodule import MixedModule + +class Module(MixedModule): + appleveldefs = { + } + + interpleveldefs = { + 'start_new_thread': 'os_thread.start_new_thread', + 'start_new': 'os_thread.start_new_thread', # obsolete syn. + 'get_ident': 'os_thread.get_ident', + 'exit': 'os_thread.exit', + 'exit_thread': 'os_thread.exit', # obsolete synonym + 'interrupt_main': 'os_thread.interrupt_main', + 'stack_size': 'os_thread.stack_size', + '_count': 'os_thread._count', + 'allocate_lock': 'os_lock.allocate_lock', + 'allocate': 'os_lock.allocate_lock', # obsolete synonym + 'LockType': 'os_lock.Lock', + 'RLock': 'os_lock.W_RLock', # pypy only, issue #2905 + '_local': 'os_local.Local', + 'error': 'space.fromcache(error.Cache).w_error', + } + + def __init__(self, space, *args): + "NOT_RPYTHON: patches space.threadlocals to use real threadlocals" + from pypy.module.thread import gil + MixedModule.__init__(self, space, *args) + prev_ec = space.threadlocals.get_ec() + space.threadlocals = gil.GILThreadLocals(space) + space.threadlocals.initialize(space) + if prev_ec is not None: + space.threadlocals._set_ec(prev_ec) + + from pypy.module.posix.interp_posix import add_fork_hook + from pypy.module.thread.os_thread import reinit_threads + add_fork_hook('child', reinit_threads) diff -Nru pypy-7.1.1+dfsg/pypy/module/thread/os_thread.py pypy-7.3.1+dfsg/pypy/module/thread/os_thread.py --- pypy-7.1.1+dfsg/pypy/module/thread/os_thread.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/thread/os_thread.py 2020-04-10 19:28:41.000000000 +0000 @@ -30,7 +30,7 @@ # called from the rffi-generated wrapper). The gc_thread_run() # operation will automatically notice that the current thread id was # not seen before, and (in shadowstack) it will allocate and use a -# fresh new stack. Again, this has no effect in asmgcc. +# fresh new stack. # # * Only then does bootstrap() really run. The first thing it does # is grab the start-up information (app-level callable and args) @@ -43,7 +43,7 @@ # thread. # # * Just before a thread finishes, gc_thread_die() is called to free -# its shadow stack. This has no effect in asmgcc. +# its shadow stack. class Bootstrapper(object): diff -Nru pypy-7.1.1+dfsg/pypy/module/thread/test/test_local.py pypy-7.3.1+dfsg/pypy/module/thread/test/test_local.py --- pypy-7.1.1+dfsg/pypy/module/thread/test/test_local.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/thread/test/test_local.py 2020-04-10 19:28:41.000000000 +0000 @@ -5,6 +5,7 @@ def test_local_1(self): import thread + import gc from thread import _local as tlsobject freed = [] class X: @@ -34,8 +35,9 @@ thread.start_new_thread(f, (i,)) self.waitfor(lambda: len(ok) == 20, delay=3) assert ok == 20*[True] # see stdout/stderr for failures in the threads + gc.collect(); gc.collect(); gc.collect() - self.waitfor(lambda: len(freed) >= 40) + self.waitfor(lambda: len(freed) >= 40, delay=20) assert len(freed) == 40 # in theory, all X objects should have been freed by now. Note that # Python's own thread._local objects suffer from the very same "bug" that diff -Nru pypy-7.1.1+dfsg/pypy/module/thread/test/test_thread.py pypy-7.3.1+dfsg/pypy/module/thread/test/test_thread.py --- pypy-7.1.1+dfsg/pypy/module/thread/test/test_thread.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/thread/test/test_thread.py 2020-04-10 19:28:41.000000000 +0000 @@ -1,38 +1,9 @@ import thread, time from pypy.module.thread.test.support import GenericTestThread +import pytest class AppTestThread(GenericTestThread): - def setup_class(cls): - GenericTestThread.setup_class.im_func(cls) - # if we cannot start more than, say, 1000 threads on this OS, then - # we can check that we get the proper error at app-level - space = cls.space - lock = thread.allocate_lock() - lock.acquire() - def f(): - lock.acquire() - lock.release() - start = thread._count() - try: - try: - for i in range(1000): - thread.start_new_thread(f, ()) - finally: - lock.release() - except (thread.error, MemoryError): - cls.w_can_start_many_threads = space.wrap(False) - else: - cls.w_can_start_many_threads = space.wrap(True) - # wait a bit to allow all threads to finish now - remaining = thread._count() - retries = 0 - while remaining > start: - retries += 1 - if retries == 200: - raise Exception("the test's threads don't stop!") - time.sleep(0.2) - remaining = thread._count() def test_start_new_thread(self): import thread @@ -189,35 +160,6 @@ assert done # see stderr for failures in threads assert sorted(lst) == range(120) - def test_many_threads(self): - import thread, time - if self.can_start_many_threads: - skip("this OS supports too many threads to check (> 1000)") - lock = thread.allocate_lock() - lock.acquire() - count = [0] - def f(): - count[0] += 1 - lock.acquire() - lock.release() - count[0] -= 1 - try: - try: - for i in range(1000): - thread.start_new_thread(f, ()) - finally: - lock.release() - # wait a bit to allow most threads to finish now - while count[0] > 10: - print count[0] # <- releases the GIL - print "ok." - except (thread.error, MemoryError): - pass - else: - raise Exception("could unexpectedly start 1000 threads") - # safety: check that we can start a new thread here - thread.start_new_thread(lambda: None, ()) - def test_stack_size(self): import thread thread.stack_size(0) @@ -256,3 +198,74 @@ waiting = [] thread.start_new_thread(f, ()) raises(KeyboardInterrupt, busy_wait) + +@pytest.mark.skip("too slow") +class _AppTestThread(GenericTestThread): + ''' + This test is very slow, do not run it by default. + ''' + def setup_class(cls): + GenericTestThread.setup_class.im_func(cls) + # if we cannot start more than, say, 1000 threads on this OS, then + # we can check that we get the proper error at app-level + space = cls.space + lock = thread.allocate_lock() + lock.acquire() + def f(): + lock.acquire() + lock.release() + start = thread._count() + try: + try: + for i in range(1000): + thread.start_new_thread(f, ()) + finally: + lock.release() + except (thread.error, MemoryError): + cls.w_can_start_many_threads = space.wrap(False) + else: + cls.w_can_start_many_threads = space.wrap(True) + # wait a bit to allow all threads to finish now + remaining = thread._count() + retries = 0 + while remaining > start: + retries += 1 + if retries == 200: + raise Exception("the test's threads don't stop!") + time.sleep(0.2) + remaining = thread._count() + + def test_many_threads(self): + import time, sys + if sys.version_info[0] < 3: + import thread as _thread + else: + import _thread + if self.can_start_many_threads or sys.platform == 'win32': + skip("this OS supports too many threads to check (> 1000)") + lock = _thread.allocate_lock() + lock.acquire() + count = [0] + def f(): + count[0] += 1 + lock.acquire() + lock.release() + count[0] -= 1 + try: + try: + for i in range(1000): + _thread.start_new_thread(f, ()) + finally: + lock.release() + # wait a bit to allow most threads to finish now + while count[0] > 10: + print(count[0]) # <- releases the GIL + print("ok.") + except (_thread.error, MemoryError): + pass + else: + raise Exception("could unexpectedly start 1000 threads") + # safety: check that we can start a new thread here + _thread.start_new_thread(lambda: None, ()) + + diff -Nru pypy-7.1.1+dfsg/pypy/module/time/__init__.py pypy-7.3.1+dfsg/pypy/module/time/__init__.py --- pypy-7.1.1+dfsg/pypy/module/time/__init__.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/time/__init__.py 2020-04-10 19:28:41.000000000 +0000 @@ -1,42 +0,0 @@ - -from pypy.interpreter.mixedmodule import MixedModule -import os - -_WIN = os.name == "nt" - -class Module(MixedModule): - applevel_name = 'time' - - interpleveldefs = { - 'time': 'interp_time.time', - 'clock': 'interp_time.clock', - 'ctime': 'interp_time.ctime', - 'asctime': 'interp_time.asctime', - 'gmtime': 'interp_time.gmtime', - 'localtime': 'interp_time.localtime', - 'mktime': 'interp_time.mktime', - 'strftime': 'interp_time.strftime', - 'sleep' : 'interp_time.sleep', - } - - if os.name == "posix": - interpleveldefs['tzset'] = 'interp_time.tzset' - - appleveldefs = { - 'struct_time': 'app_time.struct_time', - '__doc__': 'app_time.__doc__', - 'strptime': 'app_time.strptime', - } - - def startup(self, space): - if _WIN: - from pypy.module.time.interp_time import State - space.fromcache(State).startup(space) - - # this machinery is needed to expose constants - # that have to be initialized one time only - from pypy.module.time import interp_time - - interp_time._init_timezone(space) - interp_time._init_accept2dyear(space) - diff -Nru pypy-7.1.1+dfsg/pypy/module/time/interp_time.py pypy-7.3.1+dfsg/pypy/module/time/interp_time.py --- pypy-7.1.1+dfsg/pypy/module/time/interp_time.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/time/interp_time.py 2020-04-10 19:28:41.000000000 +0000 @@ -236,11 +236,11 @@ timezone = c_get_timezone() altzone = timezone - 3600 daylight = c_get_daylight() - with rffi.scoped_alloc_buffer(100) as buf: - s = c_get_tzname(100, 0, buf.raw) - tzname[0] = buf.str(s) - s = c_get_tzname(100, 1, buf.raw) - tzname[1] = buf.str(s) + for i in [0, 1]: + blen = c_get_tzname(0, i, None) + with rffi.scoped_alloc_buffer(blen) as buf: + s = c_get_tzname(blen, i, buf.raw) + tzname[i] = buf.str(s - 1) if _POSIX: if _CYGWIN: diff -Nru pypy-7.1.1+dfsg/pypy/module/time/moduledef.py pypy-7.3.1+dfsg/pypy/module/time/moduledef.py --- pypy-7.1.1+dfsg/pypy/module/time/moduledef.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/time/moduledef.py 2020-04-10 19:28:41.000000000 +0000 @@ -0,0 +1,42 @@ + +from pypy.interpreter.mixedmodule import MixedModule +import os + +_WIN = os.name == "nt" + +class Module(MixedModule): + applevel_name = 'time' + + interpleveldefs = { + 'time': 'interp_time.time', + 'clock': 'interp_time.clock', + 'ctime': 'interp_time.ctime', + 'asctime': 'interp_time.asctime', + 'gmtime': 'interp_time.gmtime', + 'localtime': 'interp_time.localtime', + 'mktime': 'interp_time.mktime', + 'strftime': 'interp_time.strftime', + 'sleep' : 'interp_time.sleep', + } + + if os.name == "posix": + interpleveldefs['tzset'] = 'interp_time.tzset' + + appleveldefs = { + 'struct_time': 'app_time.struct_time', + '__doc__': 'app_time.__doc__', + 'strptime': 'app_time.strptime', + } + + def startup(self, space): + if _WIN: + from pypy.module.time.interp_time import State + space.fromcache(State).startup(space) + + # this machinery is needed to expose constants + # that have to be initialized one time only + from pypy.module.time import interp_time + + interp_time._init_timezone(space) + interp_time._init_accept2dyear(space) + diff -Nru pypy-7.1.1+dfsg/pypy/module/token/__init__.py pypy-7.3.1+dfsg/pypy/module/token/__init__.py --- pypy-7.1.1+dfsg/pypy/module/token/__init__.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/token/__init__.py 2020-04-10 19:28:41.000000000 +0000 @@ -1,38 +0,0 @@ -from pypy.interpreter.mixedmodule import MixedModule -from pypy.interpreter.gateway import unwrap_spec -from pypy.interpreter.pyparser import pytoken, pygram - - -class Module(MixedModule): - - appleveldefs = {} - interpleveldefs = { - "NT_OFFSET" : "space.newint(256)", - "ISTERMINAL" : "__init__.isterminal", - "ISNONTERMINAL" : "__init__.isnonterminal", - "ISEOF" : "__init__.iseof" - } - - -def _init_tokens(): - tok_name = {} - for tok, id in pytoken.python_tokens.iteritems(): - Module.interpleveldefs[tok] = "space.wrap(%d)" % (id,) - tok_name[id] = tok - Module.interpleveldefs["tok_name"] = "space.wrap(%r)" % (tok_name,) - Module.interpleveldefs["N_TOKENS"] = "space.wrap(%d)" % len(tok_name) - -_init_tokens() - - -@unwrap_spec(tok=int) -def isterminal(space, tok): - return space.newbool(tok < 256) - -@unwrap_spec(tok=int) -def isnonterminal(space, tok): - return space.newbool(tok >= 256) - -@unwrap_spec(tok=int) -def iseof(space, tok): - return space.newbool(tok == pygram.tokens.ENDMARKER) diff -Nru pypy-7.1.1+dfsg/pypy/module/token/moduledef.py pypy-7.3.1+dfsg/pypy/module/token/moduledef.py --- pypy-7.1.1+dfsg/pypy/module/token/moduledef.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/token/moduledef.py 2020-04-10 19:28:41.000000000 +0000 @@ -0,0 +1,38 @@ +from pypy.interpreter.mixedmodule import MixedModule +from pypy.interpreter.gateway import unwrap_spec +from pypy.interpreter.pyparser import pytoken, pygram + + +class Module(MixedModule): + + appleveldefs = {} + interpleveldefs = { + "NT_OFFSET" : "space.newint(256)", + "ISTERMINAL" : "moduledef.isterminal", + "ISNONTERMINAL" : "moduledef.isnonterminal", + "ISEOF" : "moduledef.iseof" + } + + +def _init_tokens(): + tok_name = {} + for tok, id in pytoken.python_tokens.iteritems(): + Module.interpleveldefs[tok] = "space.wrap(%d)" % (id,) + tok_name[id] = tok + Module.interpleveldefs["tok_name"] = "space.wrap(%r)" % (tok_name,) + Module.interpleveldefs["N_TOKENS"] = "space.wrap(%d)" % len(tok_name) + +_init_tokens() + + +@unwrap_spec(tok=int) +def isterminal(space, tok): + return space.newbool(tok < 256) + +@unwrap_spec(tok=int) +def isnonterminal(space, tok): + return space.newbool(tok >= 256) + +@unwrap_spec(tok=int) +def iseof(space, tok): + return space.newbool(tok == pygram.tokens.ENDMARKER) diff -Nru pypy-7.1.1+dfsg/pypy/module/unicodedata/__init__.py pypy-7.3.1+dfsg/pypy/module/unicodedata/__init__.py --- pypy-7.1.1+dfsg/pypy/module/unicodedata/__init__.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/unicodedata/__init__.py 2020-04-10 19:28:41.000000000 +0000 @@ -1,25 +0,0 @@ -from pypy.interpreter.mixedmodule import MixedModule - -# This is the default unicodedb used in various places: -# - the unicode type -# - the regular expression engine -from rpython.rlib.unicodedata import unicodedb_5_2_0 as unicodedb - -# to get information about individual unicode chars look at: -# http://www.fileformat.info/info/unicode/char/search.htm - -class Module(MixedModule): - appleveldefs = { - } - interpleveldefs = { - 'unidata_version' : 'space.wrap(interp_ucd.ucd.version)', - 'ucd_3_2_0' : 'space.wrap(interp_ucd.ucd_3_2_0)', - 'ucd_5_2_0' : 'space.wrap(interp_ucd.ucd_5_2_0)', - 'ucd' : 'space.wrap(interp_ucd.ucd)', - '__doc__' : "space.wrap('unicode character database')", - } - for name in '''lookup name decimal digit numeric category bidirectional - east_asian_width combining mirrored decomposition - normalize _get_code'''.split(): - interpleveldefs[name] = '''space.getattr(space.wrap(interp_ucd.ucd), - space.wrap("%s"))''' % name diff -Nru pypy-7.1.1+dfsg/pypy/module/unicodedata/interp_ucd.py pypy-7.3.1+dfsg/pypy/module/unicodedata/interp_ucd.py --- pypy-7.1.1+dfsg/pypy/module/unicodedata/interp_ucd.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/unicodedata/interp_ucd.py 2020-04-10 19:28:41.000000000 +0000 @@ -42,6 +42,7 @@ class UCD(W_Root): def __init__(self, unicodedb): + self._unicodedb = unicodedb self._lookup = unicodedb.lookup self._name = unicodedb.name self._decimal = unicodedb.decimal @@ -302,3 +303,8 @@ ucd_3_2_0 = UCD(unicodedb_3_2_0) ucd_5_2_0 = UCD(unicodedb_5_2_0) ucd = ucd_5_2_0 + +# This is the default unicodedb used in various places: +# - the unicode type +# - the regular expression engine +unicodedb = ucd._unicodedb diff -Nru pypy-7.1.1+dfsg/pypy/module/unicodedata/moduledef.py pypy-7.3.1+dfsg/pypy/module/unicodedata/moduledef.py --- pypy-7.1.1+dfsg/pypy/module/unicodedata/moduledef.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/unicodedata/moduledef.py 2020-04-10 19:28:41.000000000 +0000 @@ -0,0 +1,25 @@ +from pypy.interpreter.mixedmodule import MixedModule + +# This is the default unicodedb used in various places: +# - the unicode type +# - the regular expression engine +from rpython.rlib.unicodedata import unicodedb_5_2_0 as unicodedb + +# to get information about individual unicode chars look at: +# http://www.fileformat.info/info/unicode/char/search.htm + +class Module(MixedModule): + appleveldefs = { + } + interpleveldefs = { + 'unidata_version' : 'space.wrap(interp_ucd.ucd.version)', + 'ucd_3_2_0' : 'space.wrap(interp_ucd.ucd_3_2_0)', + 'ucd_5_2_0' : 'space.wrap(interp_ucd.ucd_5_2_0)', + 'ucd' : 'space.wrap(interp_ucd.ucd)', + '__doc__' : "space.wrap('unicode character database')", + } + for name in '''lookup name decimal digit numeric category bidirectional + east_asian_width combining mirrored decomposition + normalize _get_code'''.split(): + interpleveldefs[name] = '''space.getattr(space.wrap(interp_ucd.ucd), + space.wrap("%s"))''' % name diff -Nru pypy-7.1.1+dfsg/pypy/module/unicodedata/test/test_hyp.py pypy-7.3.1+dfsg/pypy/module/unicodedata/test/test_hyp.py --- pypy-7.1.1+dfsg/pypy/module/unicodedata/test/test_hyp.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/unicodedata/test/test_hyp.py 2020-04-10 19:28:41.000000000 +0000 @@ -6,12 +6,12 @@ pytest.skip("hypothesis required") from pypy.module.unicodedata.interp_ucd import ucd -from rpython.rlib.rutf8 import get_utf8_length +from rpython.rlib.rutf8 import codepoints_in_utf8 def make_normalization(space, NF_code): def normalize(s): u = s.encode('utf8') - w_s = space.newutf8(u, get_utf8_length(u)) + w_s = space.newutf8(u, codepoints_in_utf8(u)) w_res = ucd.normalize(space, NF_code, w_s) return space.utf8_w(w_res).decode('utf8') return normalize diff -Nru pypy-7.1.1+dfsg/pypy/module/_vmprof/conftest.py pypy-7.3.1+dfsg/pypy/module/_vmprof/conftest.py --- pypy-7.1.1+dfsg/pypy/module/_vmprof/conftest.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_vmprof/conftest.py 2020-04-10 19:28:40.000000000 +0000 @@ -1,8 +1,13 @@ -import py, platform, sys +import pytest +import platform +import sys +from os.path import commonprefix, dirname -def pytest_collect_directory(path, parent): - if platform.machine() == 's390x': - py.test.skip("_vmprof tests skipped") - if sys.platform == 'win32': - py.test.skip("_vmprof tests skipped") -pytest_collect_file = pytest_collect_directory +THIS_DIR = dirname(__file__) + +@pytest.hookimpl(tryfirst=True) +def pytest_ignore_collect(path, config): + path = str(path) + if sys.platform == 'win32' or platform.machine() == 's390x': + if commonprefix([path, THIS_DIR]) == THIS_DIR: # workaround for bug in pytest<3.0.5 + return True diff -Nru pypy-7.1.1+dfsg/pypy/module/_vmprof/__init__.py pypy-7.3.1+dfsg/pypy/module/_vmprof/__init__.py --- pypy-7.1.1+dfsg/pypy/module/_vmprof/__init__.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_vmprof/__init__.py 2020-04-10 19:28:40.000000000 +0000 @@ -1,39 +0,0 @@ -from pypy.interpreter.mixedmodule import MixedModule -from rpython.rlib.rvmprof import VMProfPlatformUnsupported -from rpython.translator.platform import CompilationError - - -class Module(MixedModule): - """ - VMProf for PyPy: a statistical profiler - """ - appleveldefs = { - } - - interpleveldefs = { - 'enable': 'interp_vmprof.enable', - 'disable': 'interp_vmprof.disable', - 'is_enabled': 'interp_vmprof.is_enabled', - 'get_profile_path': 'interp_vmprof.get_profile_path', - 'stop_sampling': 'interp_vmprof.stop_sampling', - 'start_sampling': 'interp_vmprof.start_sampling', - - 'VMProfError': 'space.fromcache(interp_vmprof.Cache).w_VMProfError', - } - - -# Force the __extend__ hacks and method replacements to occur -# early. Without this, for example, 'PyCode._init_ready' was -# already found by the annotator to be the original empty -# method, and the annotator doesn't notice that interp_vmprof.py -# (loaded later) replaces this method. -try: - import pypy.module._vmprof.interp_vmprof -except VMProfPlatformUnsupported as e: - pass -except CompilationError as e: - import sys - if sys.platform == 'win32': - pass - else: - raise diff -Nru pypy-7.1.1+dfsg/pypy/module/_vmprof/interp_vmprof.py pypy-7.3.1+dfsg/pypy/module/_vmprof/interp_vmprof.py --- pypy-7.1.1+dfsg/pypy/module/_vmprof/interp_vmprof.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_vmprof/interp_vmprof.py 2020-04-10 19:28:40.000000000 +0000 @@ -60,11 +60,6 @@ 'interval' is a float representing the sampling interval, in seconds. Must be smaller than 1.0 """ - w_modules = space.sys.get('modules') - #if space.contains_w(w_modules, space.newtext('_continuation')): - # space.warn(space.newtext("Using _continuation/greenlet/stacklet together " - # "with vmprof will crash"), - # space.w_RuntimeWarning) try: rvmprof.enable(fileno, period, memory, native, real_time) except rvmprof.VMProfError as e: diff -Nru pypy-7.1.1+dfsg/pypy/module/_vmprof/moduledef.py pypy-7.3.1+dfsg/pypy/module/_vmprof/moduledef.py --- pypy-7.1.1+dfsg/pypy/module/_vmprof/moduledef.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_vmprof/moduledef.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,39 @@ +from pypy.interpreter.mixedmodule import MixedModule +from rpython.rlib.rvmprof import VMProfPlatformUnsupported +from rpython.translator.platform import CompilationError + + +class Module(MixedModule): + """ + VMProf for PyPy: a statistical profiler + """ + appleveldefs = { + } + + interpleveldefs = { + 'enable': 'interp_vmprof.enable', + 'disable': 'interp_vmprof.disable', + 'is_enabled': 'interp_vmprof.is_enabled', + 'get_profile_path': 'interp_vmprof.get_profile_path', + 'stop_sampling': 'interp_vmprof.stop_sampling', + 'start_sampling': 'interp_vmprof.start_sampling', + + 'VMProfError': 'space.fromcache(interp_vmprof.Cache).w_VMProfError', + } + + +# Force the __extend__ hacks and method replacements to occur +# early. Without this, for example, 'PyCode._init_ready' was +# already found by the annotator to be the original empty +# method, and the annotator doesn't notice that interp_vmprof.py +# (loaded later) replaces this method. +try: + import pypy.module._vmprof.interp_vmprof +except VMProfPlatformUnsupported as e: + pass +except CompilationError as e: + import sys + if sys.platform == 'win32': + pass + else: + raise diff -Nru pypy-7.1.1+dfsg/pypy/module/_vmprof/test/test__vmprof.py pypy-7.3.1+dfsg/pypy/module/_vmprof/test/test__vmprof.py --- pypy-7.1.1+dfsg/pypy/module/_vmprof/test/test__vmprof.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_vmprof/test/test__vmprof.py 2020-04-10 19:28:40.000000000 +0000 @@ -111,14 +111,17 @@ @py.test.mark.xfail(sys.platform.startswith('freebsd'), reason = "not implemented") def test_get_profile_path(self): import _vmprof - tmpfile = open(self.tmpfilename, 'wb') - assert _vmprof.get_profile_path() is None - _vmprof.enable(tmpfile.fileno(), 0.01, 0, 0, 0, 0) - path = _vmprof.get_profile_path() + with open(self.tmpfilename, "wb") as tmpfile: + assert _vmprof.get_profile_path() is None + _vmprof.enable(tmpfile.fileno(), 0.01, 0, 0, 0, 0) + path = _vmprof.get_profile_path() + _vmprof.disable() + if path != tmpfile.name: with open(path, "rb") as fd1: - assert fd1.read() == tmpfile.read() - _vmprof.disable() + with open(self.tmpfilename, "rb") as fd2: + assert fd1.read() == fd2.read() + assert _vmprof.get_profile_path() is None def test_stop_sampling(self): diff -Nru pypy-7.1.1+dfsg/pypy/module/_warnings/__init__.py pypy-7.3.1+dfsg/pypy/module/_warnings/__init__.py --- pypy-7.1.1+dfsg/pypy/module/_warnings/__init__.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_warnings/__init__.py 2020-04-10 19:28:40.000000000 +0000 @@ -1,21 +0,0 @@ -from pypy.interpreter.mixedmodule import MixedModule - -class Module(MixedModule): - """provides basic warning filtering support. - It is a helper module to speed up interpreter start-up.""" - - interpleveldefs = { - 'warn' : 'interp_warnings.warn', - 'warn_explicit': 'interp_warnings.warn_explicit', - } - - appleveldefs = { - } - - def setup_after_space_initialization(self): - from pypy.module._warnings.interp_warnings import State - state = self.space.fromcache(State) - self.setdictvalue(self.space, "filters", state.w_filters) - self.setdictvalue(self.space, "once_registry", state.w_once_registry) - self.setdictvalue(self.space, "default_action", state.w_default_action) - diff -Nru pypy-7.1.1+dfsg/pypy/module/_warnings/interp_warnings.py pypy-7.3.1+dfsg/pypy/module/_warnings/interp_warnings.py --- pypy-7.1.1+dfsg/pypy/module/_warnings/interp_warnings.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_warnings/interp_warnings.py 2020-04-10 19:28:40.000000000 +0000 @@ -354,7 +354,7 @@ return None # Split the source into lines. - w_source_list = space.call_method(w_source, "splitlines") + w_source_list = space.call_method(space.w_text, "splitlines", w_source) # Get the source line. w_source_line = space.getitem(w_source_list, space.newint(lineno - 1)) diff -Nru pypy-7.1.1+dfsg/pypy/module/_warnings/moduledef.py pypy-7.3.1+dfsg/pypy/module/_warnings/moduledef.py --- pypy-7.1.1+dfsg/pypy/module/_warnings/moduledef.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_warnings/moduledef.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,21 @@ +from pypy.interpreter.mixedmodule import MixedModule + +class Module(MixedModule): + """provides basic warning filtering support. + It is a helper module to speed up interpreter start-up.""" + + interpleveldefs = { + 'warn' : 'interp_warnings.warn', + 'warn_explicit': 'interp_warnings.warn_explicit', + } + + appleveldefs = { + } + + def setup_after_space_initialization(self): + from pypy.module._warnings.interp_warnings import State + state = self.space.fromcache(State) + self.setdictvalue(self.space, "filters", state.w_filters) + self.setdictvalue(self.space, "once_registry", state.w_once_registry) + self.setdictvalue(self.space, "default_action", state.w_default_action) + diff -Nru pypy-7.1.1+dfsg/pypy/module/_warnings/test/test_warnings.py pypy-7.3.1+dfsg/pypy/module/_warnings/test/test_warnings.py --- pypy-7.1.1+dfsg/pypy/module/_warnings/test/test_warnings.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_warnings/test/test_warnings.py 2020-04-10 19:28:40.000000000 +0000 @@ -89,3 +89,20 @@ u':831: UserWarning: \u1234\u5678\n') finally: sys.stderr = old + + def test_issue31285(self): + import _warnings + def get_bad_loader(splitlines_ret_val): + class BadLoader: + def get_source(self, fullname): + class BadSource(str): + def splitlines(self): + return splitlines_ret_val + return BadSource('spam') + return BadLoader() + # does not raise: + _warnings.warn_explicit( + 'eggs', UserWarning, 'bar', 1, + module_globals={'__loader__': get_bad_loader(42), + '__name__': 'foobar'}) + diff -Nru pypy-7.1.1+dfsg/pypy/module/_weakref/__init__.py pypy-7.3.1+dfsg/pypy/module/_weakref/__init__.py --- pypy-7.1.1+dfsg/pypy/module/_weakref/__init__.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_weakref/__init__.py 2020-04-10 19:28:40.000000000 +0000 @@ -1,14 +0,0 @@ -from pypy.interpreter.mixedmodule import MixedModule - -class Module(MixedModule): - appleveldefs = { - } - interpleveldefs = { - 'ref': 'interp__weakref.W_Weakref', - 'getweakrefcount': 'interp__weakref.getweakrefcount', - 'getweakrefs': 'interp__weakref.getweakrefs', - 'ReferenceType': 'interp__weakref.W_Weakref', - 'ProxyType': 'interp__weakref.W_Proxy', - 'CallableProxyType': 'interp__weakref.W_CallableProxy', - 'proxy': 'interp__weakref.proxy' - } diff -Nru pypy-7.1.1+dfsg/pypy/module/_weakref/interp__weakref.py pypy-7.3.1+dfsg/pypy/module/_weakref/interp__weakref.py --- pypy-7.1.1+dfsg/pypy/module/_weakref/interp__weakref.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_weakref/interp__weakref.py 2020-04-10 19:28:40.000000000 +0000 @@ -156,6 +156,8 @@ class W_WeakrefBase(W_Root): + exact_class_applevel_name = 'weakref-or-proxy' + def __init__(self, space, w_obj, w_callable): assert w_callable is not space.w_None # should be really None self.space = space diff -Nru pypy-7.1.1+dfsg/pypy/module/_weakref/moduledef.py pypy-7.3.1+dfsg/pypy/module/_weakref/moduledef.py --- pypy-7.1.1+dfsg/pypy/module/_weakref/moduledef.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_weakref/moduledef.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,14 @@ +from pypy.interpreter.mixedmodule import MixedModule + +class Module(MixedModule): + appleveldefs = { + } + interpleveldefs = { + 'ref': 'interp__weakref.W_Weakref', + 'getweakrefcount': 'interp__weakref.getweakrefcount', + 'getweakrefs': 'interp__weakref.getweakrefs', + 'ReferenceType': 'interp__weakref.W_Weakref', + 'ProxyType': 'interp__weakref.W_Proxy', + 'CallableProxyType': 'interp__weakref.W_CallableProxy', + 'proxy': 'interp__weakref.proxy' + } diff -Nru pypy-7.1.1+dfsg/pypy/module/_weakref/test/test_weakref.py pypy-7.3.1+dfsg/pypy/module/_weakref/test/test_weakref.py --- pypy-7.1.1+dfsg/pypy/module/_weakref/test/test_weakref.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_weakref/test/test_weakref.py 2020-04-10 19:28:40.000000000 +0000 @@ -543,3 +543,12 @@ p1[42] = p2 assert a1.setkey == 42 assert a1.setvalue is p2 + + def test_error_message_wrong_self(self): + import _weakref + unboundmeth = _weakref.ref.__repr__ + e = raises(TypeError, unboundmeth, 42) + assert "weakref" in str(e.value) + if hasattr(unboundmeth, 'im_func'): + e = raises(TypeError, unboundmeth.im_func, 42) + assert "'weakref-or-proxy'" in str(e.value) diff -Nru pypy-7.1.1+dfsg/pypy/module/_winreg/__init__.py pypy-7.3.1+dfsg/pypy/module/_winreg/__init__.py --- pypy-7.1.1+dfsg/pypy/module/_winreg/__init__.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_winreg/__init__.py 2020-04-10 19:28:40.000000000 +0000 @@ -1,74 +0,0 @@ -from pypy.interpreter.mixedmodule import MixedModule -from rpython.rlib.rwinreg import constants - -class Module(MixedModule): - """This module provides access to the Windows registry API. - -Functions: - -CloseKey() - Closes a registry key. -ConnectRegistry() - Establishes a connection to a predefined registry handle - on another computer. -CreateKey() - Creates the specified key, or opens it if it already exists. -DeleteKey() - Deletes the specified key. -DeleteValue() - Removes a named value from the specified registry key. -EnumKey() - Enumerates subkeys of the specified open registry key. -EnumValue() - Enumerates values of the specified open registry key. -ExpandEnvironmentStrings() - Expand the env strings in a REG_EXPAND_SZ string. -FlushKey() - Writes all the attributes of the specified key to the registry. -LoadKey() - Creates a subkey under HKEY_USER or HKEY_LOCAL_MACHINE and stores - registration information from a specified file into that subkey. -OpenKey() - Alias for -OpenKeyEx() - Opens the specified key. -QueryValue() - Retrieves the value associated with the unnamed value for a - specified key in the registry. -QueryValueEx() - Retrieves the type and data for a specified value name - associated with an open registry key. -QueryInfoKey() - Returns information about the specified key. -SaveKey() - Saves the specified key, and all its subkeys a file. -SetValue() - Associates a value with a specified key. -SetValueEx() - Stores data in the value field of an open registry key. - -Special objects: - -HKEYType -- type object for HKEY objects -error -- exception raised for Win32 errors - -Integer constants: -Many constants are defined - see the documentation for each function -to see what constants are used, and where.""" - - appleveldefs = { - } - interpleveldefs = { - 'error' : 'space.w_WindowsError', - 'HKEYType' : 'interp_winreg.W_HKEY', - 'SetValue' : 'interp_winreg.SetValue', - 'SetValueEx' : 'interp_winreg.SetValueEx', - 'QueryValue' : 'interp_winreg.QueryValue', - 'QueryValueEx' : 'interp_winreg.QueryValueEx', - 'CreateKey' : 'interp_winreg.CreateKey', - 'CreateKeyEx' : 'interp_winreg.CreateKeyEx', - 'DeleteKey' : 'interp_winreg.DeleteKey', - 'DeleteValue' : 'interp_winreg.DeleteValue', - 'OpenKey' : 'interp_winreg.OpenKey', - 'OpenKeyEx' : 'interp_winreg.OpenKey', - 'EnumValue' : 'interp_winreg.EnumValue', - 'EnumKey' : 'interp_winreg.EnumKey', - 'FlushKey' : 'interp_winreg.FlushKey', - 'CloseKey' : 'interp_winreg.CloseKey', - 'QueryInfoKey' : 'interp_winreg.QueryInfoKey', - 'LoadKey' : 'interp_winreg.LoadKey', - 'SaveKey' : 'interp_winreg.SaveKey', - 'ConnectRegistry': 'interp_winreg.ConnectRegistry', - - 'ExpandEnvironmentStrings': 'interp_winreg.ExpandEnvironmentStrings', - - 'DisableReflectionKey': 'interp_winreg.DisableReflectionKey', - 'EnableReflectionKey': 'interp_winreg.EnableReflectionKey', - 'QueryReflectionKey': 'interp_winreg.QueryReflectionKey', - 'DeleteKeyEx': 'interp_winreg.DeleteKeyEx', - } - - for name, value in constants.iteritems(): - interpleveldefs[name] = "space.wrap(%s)" % (value,) diff -Nru pypy-7.1.1+dfsg/pypy/module/_winreg/moduledef.py pypy-7.3.1+dfsg/pypy/module/_winreg/moduledef.py --- pypy-7.1.1+dfsg/pypy/module/_winreg/moduledef.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/_winreg/moduledef.py 2020-04-10 19:28:40.000000000 +0000 @@ -0,0 +1,74 @@ +from pypy.interpreter.mixedmodule import MixedModule +from rpython.rlib.rwinreg import constants + +class Module(MixedModule): + """This module provides access to the Windows registry API. + +Functions: + +CloseKey() - Closes a registry key. +ConnectRegistry() - Establishes a connection to a predefined registry handle + on another computer. +CreateKey() - Creates the specified key, or opens it if it already exists. +DeleteKey() - Deletes the specified key. +DeleteValue() - Removes a named value from the specified registry key. +EnumKey() - Enumerates subkeys of the specified open registry key. +EnumValue() - Enumerates values of the specified open registry key. +ExpandEnvironmentStrings() - Expand the env strings in a REG_EXPAND_SZ string. +FlushKey() - Writes all the attributes of the specified key to the registry. +LoadKey() - Creates a subkey under HKEY_USER or HKEY_LOCAL_MACHINE and stores + registration information from a specified file into that subkey. +OpenKey() - Alias for +OpenKeyEx() - Opens the specified key. +QueryValue() - Retrieves the value associated with the unnamed value for a + specified key in the registry. +QueryValueEx() - Retrieves the type and data for a specified value name + associated with an open registry key. +QueryInfoKey() - Returns information about the specified key. +SaveKey() - Saves the specified key, and all its subkeys a file. +SetValue() - Associates a value with a specified key. +SetValueEx() - Stores data in the value field of an open registry key. + +Special objects: + +HKEYType -- type object for HKEY objects +error -- exception raised for Win32 errors + +Integer constants: +Many constants are defined - see the documentation for each function +to see what constants are used, and where.""" + + appleveldefs = { + } + interpleveldefs = { + 'error' : 'space.w_WindowsError', + 'HKEYType' : 'interp_winreg.W_HKEY', + 'SetValue' : 'interp_winreg.SetValue', + 'SetValueEx' : 'interp_winreg.SetValueEx', + 'QueryValue' : 'interp_winreg.QueryValue', + 'QueryValueEx' : 'interp_winreg.QueryValueEx', + 'CreateKey' : 'interp_winreg.CreateKey', + 'CreateKeyEx' : 'interp_winreg.CreateKeyEx', + 'DeleteKey' : 'interp_winreg.DeleteKey', + 'DeleteValue' : 'interp_winreg.DeleteValue', + 'OpenKey' : 'interp_winreg.OpenKey', + 'OpenKeyEx' : 'interp_winreg.OpenKey', + 'EnumValue' : 'interp_winreg.EnumValue', + 'EnumKey' : 'interp_winreg.EnumKey', + 'FlushKey' : 'interp_winreg.FlushKey', + 'CloseKey' : 'interp_winreg.CloseKey', + 'QueryInfoKey' : 'interp_winreg.QueryInfoKey', + 'LoadKey' : 'interp_winreg.LoadKey', + 'SaveKey' : 'interp_winreg.SaveKey', + 'ConnectRegistry': 'interp_winreg.ConnectRegistry', + + 'ExpandEnvironmentStrings': 'interp_winreg.ExpandEnvironmentStrings', + + 'DisableReflectionKey': 'interp_winreg.DisableReflectionKey', + 'EnableReflectionKey': 'interp_winreg.EnableReflectionKey', + 'QueryReflectionKey': 'interp_winreg.QueryReflectionKey', + 'DeleteKeyEx': 'interp_winreg.DeleteKeyEx', + } + + for name, value in constants.iteritems(): + interpleveldefs[name] = "space.wrap(%s)" % (value,) diff -Nru pypy-7.1.1+dfsg/pypy/module/zipimport/__init__.py pypy-7.3.1+dfsg/pypy/module/zipimport/__init__.py --- pypy-7.1.1+dfsg/pypy/module/zipimport/__init__.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/zipimport/__init__.py 2020-04-10 19:28:41.000000000 +0000 @@ -1,25 +0,0 @@ - -""" Zipimport module -""" - -from pypy.interpreter.mixedmodule import MixedModule - -class Module(MixedModule): - - interpleveldefs = { - 'zipimporter':'interp_zipimport.W_ZipImporter', - '_zip_directory_cache' : 'space.wrap(interp_zipimport.zip_cache)', - 'ZipImportError': 'interp_zipimport.get_error(space)', - } - - appleveldefs = { - } - - def setup_after_space_initialization(self): - """NOT_RPYTHON""" - space = self.space - # install zipimport hook - w_path_hooks = space.sys.get('path_hooks') - from pypy.module.zipimport.interp_zipimport import W_ZipImporter - w_zipimporter = space.gettypefor(W_ZipImporter) - space.call_method(w_path_hooks, 'append', w_zipimporter) diff -Nru pypy-7.1.1+dfsg/pypy/module/zipimport/interp_zipimport.py pypy-7.3.1+dfsg/pypy/module/zipimport/interp_zipimport.py --- pypy-7.1.1+dfsg/pypy/module/zipimport/interp_zipimport.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/zipimport/interp_zipimport.py 2020-04-10 19:28:41.000000000 +0000 @@ -192,6 +192,8 @@ return True def import_pyc_file(self, space, modname, filename, buf, pkgpath): + if len(buf) < 8: + raise oefmt(get_error(space), "bad pyc data") magic = importing._get_long(buf[:4]) timestamp = importing._get_long(buf[4:8]) if not self.can_use_pyc(space, filename, magic, timestamp): @@ -302,6 +304,8 @@ w_source = self.get_data(space, filename + ext) source = space.bytes_w(w_source) if compiled: + if len(source) < 8: + raise oefmt(get_error(space), "bad pyc data") magic = importing._get_long(source[:4]) timestamp = importing._get_long(source[4:8]) if not self.can_use_pyc(space, filename + ext, diff -Nru pypy-7.1.1+dfsg/pypy/module/zipimport/moduledef.py pypy-7.3.1+dfsg/pypy/module/zipimport/moduledef.py --- pypy-7.1.1+dfsg/pypy/module/zipimport/moduledef.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/zipimport/moduledef.py 2020-04-10 19:28:41.000000000 +0000 @@ -0,0 +1,25 @@ + +""" Zipimport module +""" + +from pypy.interpreter.mixedmodule import MixedModule + +class Module(MixedModule): + + interpleveldefs = { + 'zipimporter':'interp_zipimport.W_ZipImporter', + '_zip_directory_cache' : 'space.wrap(interp_zipimport.zip_cache)', + 'ZipImportError': 'interp_zipimport.get_error(space)', + } + + appleveldefs = { + } + + def setup_after_space_initialization(self): + """NOT_RPYTHON""" + space = self.space + # install zipimport hook + w_path_hooks = space.sys.get('path_hooks') + from pypy.module.zipimport.interp_zipimport import W_ZipImporter + w_zipimporter = space.gettypefor(W_ZipImporter) + space.call_method(w_path_hooks, 'append', w_zipimporter) diff -Nru pypy-7.1.1+dfsg/pypy/module/zipimport/test/test_zipimport.py pypy-7.3.1+dfsg/pypy/module/zipimport/test/test_zipimport.py --- pypy-7.1.1+dfsg/pypy/module/zipimport/test/test_zipimport.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/zipimport/test/test_zipimport.py 2020-04-10 19:28:41.000000000 +0000 @@ -199,6 +199,15 @@ "__import__('xxbad_pyc', globals(), locals(), [])") assert 'xxbad_pyc' not in sys.modules + def test_short_pyc(self): + import zipimport + import sys + test_pyc = b"abc" + self.writefile("xxbad_pyc.pyc", test_pyc) + raises(zipimport.ZipImportError, + "__import__('xxbad_pyc', globals(), locals(), [])") + assert 'xxbad_pyc' not in sys.modules + def test_force_py(self): import sys m0 = ord(self.test_pyc[0]) diff -Nru pypy-7.1.1+dfsg/pypy/module/zlib/__init__.py pypy-7.3.1+dfsg/pypy/module/zlib/__init__.py --- pypy-7.1.1+dfsg/pypy/module/zlib/__init__.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/zlib/__init__.py 2020-04-10 19:28:41.000000000 +0000 @@ -1,48 +0,0 @@ - -""" -Mixed-module definition for the zlib module. -""" - -from pypy.interpreter.mixedmodule import MixedModule -from rpython.rlib import rzlib - - -class Module(MixedModule): - """\ -The functions in this module allow compression and decompression using the -zlib library, which is based on GNU zip. - -adler32(string[, start]) -- Compute an Adler-32 checksum. -compress(string[, level]) -- Compress string, with compression level in 1-9. -compressobj([level]) -- Return a compressor object. -crc32(string[, start]) -- Compute a CRC-32 checksum. -decompress(string,[wbits],[bufsize]) -- Decompresses a compressed string. -decompressobj([wbits]) -- Return a decompressor object. - -'wbits' is window buffer size. -Compressor objects support compress() and flush() methods; decompressor -objects support decompress() and flush().""" - - interpleveldefs = { - 'crc32': 'interp_zlib.crc32', - 'adler32': 'interp_zlib.adler32', - 'compressobj': 'interp_zlib.Compress', - 'decompressobj': 'interp_zlib.Decompress', - 'compress': 'interp_zlib.compress', - 'decompress': 'interp_zlib.decompress', - '__version__': 'space.newtext("1.0")', - 'error': 'space.fromcache(interp_zlib.Cache).w_error', - } - - appleveldefs = { - } - - -for _name in """ - MAX_WBITS DEFLATED DEF_MEM_LEVEL - Z_BEST_SPEED Z_BEST_COMPRESSION Z_DEFAULT_COMPRESSION - Z_FILTERED Z_HUFFMAN_ONLY Z_DEFAULT_STRATEGY - Z_FINISH Z_NO_FLUSH Z_SYNC_FLUSH Z_FULL_FLUSH - ZLIB_VERSION - """.split(): - Module.interpleveldefs[_name] = 'space.wrap(%r)' % (getattr(rzlib, _name),) diff -Nru pypy-7.1.1+dfsg/pypy/module/zlib/interp_zlib.py pypy-7.3.1+dfsg/pypy/module/zlib/interp_zlib.py --- pypy-7.1.1+dfsg/pypy/module/zlib/interp_zlib.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/zlib/interp_zlib.py 2020-04-10 19:28:41.000000000 +0000 @@ -352,8 +352,7 @@ raise oefmt(space.w_ValueError, "length must be greater than zero") if not self.stream: - raise zlib_error(space, - "compressor object already flushed") + return space.newbytes('') data = self.unconsumed_tail try: self.lock() diff -Nru pypy-7.1.1+dfsg/pypy/module/zlib/moduledef.py pypy-7.3.1+dfsg/pypy/module/zlib/moduledef.py --- pypy-7.1.1+dfsg/pypy/module/zlib/moduledef.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/zlib/moduledef.py 2020-04-10 19:28:41.000000000 +0000 @@ -0,0 +1,48 @@ + +""" +Mixed-module definition for the zlib module. +""" + +from pypy.interpreter.mixedmodule import MixedModule +from rpython.rlib import rzlib + + +class Module(MixedModule): + """\ +The functions in this module allow compression and decompression using the +zlib library, which is based on GNU zip. + +adler32(string[, start]) -- Compute an Adler-32 checksum. +compress(string[, level]) -- Compress string, with compression level in 1-9. +compressobj([level]) -- Return a compressor object. +crc32(string[, start]) -- Compute a CRC-32 checksum. +decompress(string,[wbits],[bufsize]) -- Decompresses a compressed string. +decompressobj([wbits]) -- Return a decompressor object. + +'wbits' is window buffer size. +Compressor objects support compress() and flush() methods; decompressor +objects support decompress() and flush().""" + + interpleveldefs = { + 'crc32': 'interp_zlib.crc32', + 'adler32': 'interp_zlib.adler32', + 'compressobj': 'interp_zlib.Compress', + 'decompressobj': 'interp_zlib.Decompress', + 'compress': 'interp_zlib.compress', + 'decompress': 'interp_zlib.decompress', + '__version__': 'space.newtext("1.0")', + 'error': 'space.fromcache(interp_zlib.Cache).w_error', + } + + appleveldefs = { + } + + +for _name in """ + MAX_WBITS DEFLATED DEF_MEM_LEVEL + Z_BEST_SPEED Z_BEST_COMPRESSION Z_DEFAULT_COMPRESSION + Z_FILTERED Z_HUFFMAN_ONLY Z_DEFAULT_STRATEGY + Z_FINISH Z_NO_FLUSH Z_SYNC_FLUSH Z_FULL_FLUSH + ZLIB_VERSION + """.split(): + Module.interpleveldefs[_name] = 'space.wrap(%r)' % (getattr(rzlib, _name),) diff -Nru pypy-7.1.1+dfsg/pypy/module/zlib/test/test_zlib.py pypy-7.3.1+dfsg/pypy/module/zlib/test/test_zlib.py --- pypy-7.1.1+dfsg/pypy/module/zlib/test/test_zlib.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/module/zlib/test/test_zlib.py 2020-04-10 19:28:41.000000000 +0000 @@ -345,7 +345,7 @@ assert (d1 + from_copy) == (d1 + from_compressor) - @py.test.mark.skipif(rzlib.ZLIB_VERSION == '1.2.8', reason='does not error check') + @py.test.mark.skipif(rzlib.ZLIB_VERSION in ('1.2.8', '1.2.3'), reason='does not error check') def test_cannot_copy_compressor_with_stream_in_inconsistent_state(self): if self.runappdirect: skip("can't run with -A") compressor = self.zlib.compressobj() @@ -363,4 +363,5 @@ dco = zlib.decompressobj() dco.decompress(x) dco.flush() - raises(self.zlib.error, dco.flush) + # multiple flush calls should not raise + dco.flush() diff -Nru pypy-7.1.1+dfsg/pypy/objspace/descroperation.py pypy-7.3.1+dfsg/pypy/objspace/descroperation.py --- pypy-7.1.1+dfsg/pypy/objspace/descroperation.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/objspace/descroperation.py 2020-04-10 19:28:41.000000000 +0000 @@ -124,8 +124,14 @@ def descr__init__(space, w_obj, __args__): pass +def get_printable_location(itergreenkey, w_itemtype): + return "DescrOperation.contains [%s, %s]" % ( + itergreenkey.iterator_greenkey_printable(), + w_itemtype.getname(w_itemtype.space)) + contains_jitdriver = jit.JitDriver(name='contains', - greens=['w_type'], reds='auto') + greens=['itergreenkey', 'w_itemtype'], reds='auto', + get_printable_location=get_printable_location) class DescrOperation(object): # This is meant to be a *mixin*. @@ -350,6 +356,9 @@ raise oefmt(space.w_TypeError, "%T.__format__ must return string or unicode, not %T", w_obj, w_res) + if (space.isinstance_w(w_format_spec, space.w_unicode) and + not space.isinstance_w(w_res, space.w_unicode)): + w_res = space.unicode_from_object(w_res) return w_res def pow(space, w_obj1, w_obj2, w_obj3): @@ -403,9 +412,10 @@ def _contains(space, w_container, w_item): w_iter = space.iter(w_container) - w_type = space.type(w_iter) + itergreenkey = space.iterator_greenkey(w_iter) + w_itemtype = space.type(w_item) while 1: - contains_jitdriver.jit_merge_point(w_type=w_type) + contains_jitdriver.jit_merge_point(itergreenkey=itergreenkey, w_itemtype=w_itemtype) try: w_next = space.next(w_iter) except OperationError as e: diff -Nru pypy-7.1.1+dfsg/pypy/objspace/fake/checkmodule.py pypy-7.3.1+dfsg/pypy/objspace/fake/checkmodule.py --- pypy-7.1.1+dfsg/pypy/objspace/fake/checkmodule.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/objspace/fake/checkmodule.py 2020-04-10 19:28:41.000000000 +0000 @@ -11,7 +11,8 @@ seeobj_w = [] modules = [] for modname in modnames: - mod = __import__('pypy.module.%s' % modname, None, None, ['__doc__']) + mod = __import__( + 'pypy.module.%s.moduledef' % modname, None, None, ['__doc__']) # force computation and record what we wrap module = mod.Module(space, W_Root()) module.setup_after_space_initialization() diff -Nru pypy-7.1.1+dfsg/pypy/objspace/fake/objspace.py pypy-7.3.1+dfsg/pypy/objspace/fake/objspace.py --- pypy-7.1.1+dfsg/pypy/objspace/fake/objspace.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/objspace/fake/objspace.py 2020-04-10 19:28:41.000000000 +0000 @@ -149,6 +149,9 @@ is_root(w_obj) return NonConstant(False) + def utf8_len_w(self, space): + return NonConstant((NonConstant("utf8len_foobar"), NonConstant(14))) + @not_rpython def unwrap(self, w_obj): raise NotImplementedError @@ -167,6 +170,7 @@ for w_x in list_w: is_root(w_x) return w_some_obj() + newfrozenset = newset def newlist(self, list_w): for w_x in list_w: diff -Nru pypy-7.1.1+dfsg/pypy/objspace/fake/test/test_objspace.py pypy-7.3.1+dfsg/pypy/objspace/fake/test/test_objspace.py --- pypy-7.1.1+dfsg/pypy/objspace/fake/test/test_objspace.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/objspace/fake/test/test_objspace.py 2020-04-10 19:28:41.000000000 +0000 @@ -1,4 +1,5 @@ -import py +import pytest +from rpython.rlib.nonconst import NonConstant from pypy.objspace.fake.objspace import FakeObjSpace, W_Root from pypy.interpreter.argument import Arguments from pypy.interpreter.typedef import TypeDef @@ -63,8 +64,8 @@ def test_is_true(self): space = self.space space.translates(lambda: space.is_true(W_Root())) - py.test.raises(AssertionError, - space.translates, lambda: space.is_true(42)) + with pytest.raises(AssertionError): + space.translates(lambda: space.is_true(42)) def test_unpackiterable(self): space = self.space @@ -79,3 +80,23 @@ space = self.space space.translates(lambda: (space.get(W_Root(), W_Root()), space.get(W_Root(), W_Root(), W_Root()))) + + def test_bug_utf8_len_w(self): + space = self.space + + class A(object): + pass + + def f(): + s = NonConstant('a') + w_s = space.newutf8(s, 1) + t, l = space.utf8_len_w(w_s) + a = A() + if l == 1: + a.x = 1 + else: + raise Exception + return a.x + space.translates(f) + + diff -Nru pypy-7.1.1+dfsg/pypy/objspace/std/bufferobject.py pypy-7.3.1+dfsg/pypy/objspace/std/bufferobject.py --- pypy-7.1.1+dfsg/pypy/objspace/std/bufferobject.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/objspace/std/bufferobject.py 2020-04-10 19:28:41.000000000 +0000 @@ -62,7 +62,7 @@ self.buf.getlength()) if step == 0: # index only return space.newbytes(self.buf.getitem(start)) - res = self.buf.getslice(start, stop, step, size) + res = self.buf.getslice(start, step, size) return space.newbytes(res) def descr_setitem(self, space, w_index, w_obj): diff -Nru pypy-7.1.1+dfsg/pypy/objspace/std/bytearrayobject.py pypy-7.3.1+dfsg/pypy/objspace/std/bytearrayobject.py --- pypy-7.1.1+dfsg/pypy/objspace/std/bytearrayobject.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/objspace/std/bytearrayobject.py 2020-04-10 19:28:41.000000000 +0000 @@ -109,6 +109,8 @@ @staticmethod def _op_val(space, w_other, strict=None): # bytearray does not enforce the strict restriction (on strip at least) + if isinstance(w_other, W_BytesObject): + return w_other.str_w(space) return space.buffer_w(w_other, space.BUF_SIMPLE).as_str() def _chr(self, char): @@ -333,7 +335,7 @@ other_len = len(other) cmp = _memcmp(value, other, min(len(value), len(other))) elif isinstance(w_other, W_BytesObject): - other = self._op_val(space, w_other) + other = w_other.str_w(space) other_len = len(other) cmp = _memcmp(value, other, min(len(value), len(other))) else: @@ -380,18 +382,9 @@ self._data += w_other.getdata() return self - if isinstance(w_other, W_BytesObject): - self._inplace_add(self._op_val(space, w_other)) - else: - self._inplace_add(_get_buffer(space, w_other)) + self._data += self._op_val(space, w_other) return self - @specialize.argtype(1) - def _inplace_add(self, other): - resizelist_hint(self._data, len(self._data) + len(other)) - for i in range(len(other)): - self._data.append(other[i]) - def descr_inplace_mul(self, space, w_times): try: times = space.getindex_w(w_times, space.w_OverflowError) @@ -452,8 +445,10 @@ def descr_extend(self, space, w_other): if isinstance(w_other, W_BytearrayObject): self._data += w_other.getdata() + elif isinstance(w_other, W_BytesObject): # performance only + self._data += w_other.str_w(space) else: - self._inplace_add(makebytearraydata_w(space, w_other)) + self._data += makebytearraydata_w(space, w_other) def descr_insert(self, space, w_idx, w_other): where = space.int_w(w_idx) @@ -492,20 +487,13 @@ if isinstance(w_other, W_BytearrayObject): return self._new(self.getdata() + w_other.getdata()) - if isinstance(w_other, W_BytesObject): - return self._add(self._op_val(space, w_other)) - try: - buffer = _get_buffer(space, w_other) + byte_string = self._op_val(space, w_other) except OperationError as e: if e.match(space, space.w_TypeError): return space.w_NotImplemented raise - return self._add(buffer) - - @specialize.argtype(1) - def _add(self, other): - return self._new(self.getdata() + [other[i] for i in range(len(other))]) + return self._new(self.getdata() + list(byte_string)) def descr_reverse(self, space): self.getdata().reverse() @@ -573,14 +561,14 @@ return list(buf.as_str()) return _from_byte_sequence(space, w_source) -def _get_printable_location(w_type): - return ('bytearray_from_byte_sequence [w_type=%s]' % - w_type.getname(w_type.space)) +def _get_printable_location(greenkey): + return ('bytearray_from_byte_sequence [%s]' % + greenkey.iterator_greenkey_printable()) _byteseq_jitdriver = jit.JitDriver( name='bytearray_from_byte_sequence', - greens=['w_type'], - reds=['w_iter', 'data'], + greens=['greenkey'], + reds='auto', get_printable_location=_get_printable_location) def _from_byte_sequence(space, w_source): @@ -598,11 +586,9 @@ return data def _from_byte_sequence_loop(space, w_iter, data): - w_type = space.type(w_iter) + greenkey = space.iterator_greenkey(w_iter) while True: - _byteseq_jitdriver.jit_merge_point(w_type=w_type, - w_iter=w_iter, - data=data) + _byteseq_jitdriver.jit_merge_point(greenkey=greenkey) try: w_item = space.next(w_iter) except OperationError as e: @@ -1302,19 +1288,19 @@ ba = self.ba ba._data[ba._offset + index] = char - def getslice(self, start, stop, step, size): + def getslice(self, start, step, size): if size == 0: return "" if step == 1: - assert 0 <= start <= stop + assert start >= 0 + assert size >= 0 ba = self.ba start += ba._offset - stop += ba._offset data = ba._data - if start != 0 or stop != len(data): - data = data[start:stop] + if start != 0 or size != len(data): + data = data[start:start+size] return "".join(data) - return GCBuffer.getslice(self, start, stop, step, size) + return GCBuffer.getslice(self, start, step, size) def setslice(self, start, string): # No bounds checks. diff -Nru pypy-7.1.1+dfsg/pypy/objspace/std/bytesobject.py pypy-7.3.1+dfsg/pypy/objspace/std/bytesobject.py --- pypy-7.1.1+dfsg/pypy/objspace/std/bytesobject.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/objspace/std/bytesobject.py 2020-04-10 19:28:41.000000000 +0000 @@ -24,6 +24,7 @@ class W_AbstractBytesObject(W_Root): __slots__ = () + exact_class_applevel_name = 'str' def is_w(self, space, w_other): if not isinstance(w_other, W_AbstractBytesObject): @@ -36,8 +37,10 @@ s2 = space.bytes_w(w_other) if len(s2) > 1: return s1 is s2 + if len(s2) == 0: + return len(s1) == 0 else: # strings of len <= 1 are unique-ified - return s1 == s2 + return len(s1) == 1 and s1[0] == s2[0] def immutable_unique_id(self, space): if self.user_overridden_class: diff -Nru pypy-7.1.1+dfsg/pypy/objspace/std/dictmultiobject.py pypy-7.3.1+dfsg/pypy/objspace/std/dictmultiobject.py --- pypy-7.1.1+dfsg/pypy/objspace/std/dictmultiobject.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/objspace/std/dictmultiobject.py 2020-04-10 19:28:41.000000000 +0000 @@ -78,8 +78,9 @@ W_ModuleDictObject.__init__(w_obj, space, strategy, storage) return w_obj elif instance: - from pypy.objspace.std.mapdict import MapDictStrategy - strategy = space.fromcache(MapDictStrategy) + from pypy.objspace.std.mapdict import make_instance_dict + assert w_type is None + return make_instance_dict(space) elif strdict or module: assert w_type is None strategy = space.fromcache(BytesDictStrategy) @@ -410,7 +411,7 @@ popitem delitem clear \ length w_keys values items \ iterkeys itervalues iteritems \ - listview_bytes listview_utf8 listview_int \ + listview_bytes listview_ascii listview_int \ view_as_kwargs".split() def make_method(method): @@ -445,9 +446,23 @@ del currently_in_repr[d] except: pass + + def viewrepr(currently_in_repr, view): + if view in currently_in_repr: + return '...' + currently_in_repr[view] = 1 + try: + return (type(view).__name__ + "([" + + ", ".join([repr(x) for x in view]) + '])') + finally: + try: + del currently_in_repr[view] + except: + pass ''', filename=__file__) dictrepr = app.interphook("dictrepr") +viewrepr = app.interphook("viewrepr") W_DictMultiObject.typedef = TypeDef("dict", @@ -509,6 +524,10 @@ def get_empty_storage(self): raise NotImplementedError + def setitem_str(self, w_dict, key, w_value): + w_dict.setitem(self.space.newtext(key), w_value) + + @jit.look_inside_iff(lambda self, w_dict: w_dict_unrolling_heuristic(w_dict)) def w_keys(self, w_dict): @@ -562,7 +581,7 @@ def listview_bytes(self, w_dict): return None - def listview_utf8(self, w_dict): + def listview_ascii(self, w_dict): return None def listview_int(self, w_dict): @@ -1251,7 +1270,8 @@ ## assert key is not None ## return self.unerase(w_dict.dstorage).get(key, None) - ## def listview_utf8(self, w_dict): + ## def listview_ascii(self, w_dict): + ## XXX reimplement. Also warning: must return a list of _ascii_ ## return self.unerase(w_dict.dstorage).keys() ## def w_keys(self, w_dict): @@ -1514,16 +1534,20 @@ self.w_dict = w_dict def descr_repr(self, space): - w_seq = space.call_function(space.w_list, self) - w_repr = space.repr(w_seq) - return space.newtext("%s(%s)" % (space.type(self).getname(space), - space.text_w(w_repr))) + return viewrepr(space, space.get_objects_in_repr(), self) def descr_len(self, space): return space.len(self.w_dict) def _all_contained_in(space, w_dictview, w_other): - for w_item in space.iteriterable(w_dictview): + w_iter = space.iter(w_dictview) + while 1: + try: + w_item = space.next(w_iter) + except OperationError as e: + if not e.match(space, space.w_StopIteration): + raise + break if not space.contains_w(w_other, w_item): return space.w_False return space.w_True diff -Nru pypy-7.1.1+dfsg/pypy/objspace/std/formatting.py pypy-7.3.1+dfsg/pypy/objspace/std/formatting.py --- pypy-7.1.1+dfsg/pypy/objspace/std/formatting.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/objspace/std/formatting.py 2020-04-10 19:28:41.000000000 +0000 @@ -308,8 +308,17 @@ c = self.peekchr() self.forward() if c == '%': - self.std_wp('%', False) + self.result.append('%') continue + + # first check whether it's a invalid char, *then* call + # nextinputvalue, otherwise the error generated by + # nextinputvalue can cover that of unknown_fmtchar + for c1 in FORMATTER_CHARS: + if c == c1: + break + else: + self.unknown_fmtchar() if w_value is None: w_value = self.nextinputvalue() @@ -322,8 +331,6 @@ do_fmt = getattr(self, 'fmt_' + c1) do_fmt(w_value) break - else: - self.unknown_fmtchar() self.checkconsumed() return result.build() @@ -332,13 +339,16 @@ space = self.space if do_unicode: cp = rutf8.codepoint_at_pos(self.fmt, self.fmtpos - 1) - w_s = space.newutf8(rutf8.unichr_as_utf8(r_uint(cp)), 1) + pos = rutf8.codepoints_in_utf8(self.fmt, 0, self.fmtpos - 1) + w_s = space.newutf8(rutf8.unichr_as_utf8(r_uint(cp), + allow_surrogates=True), 1) else: cp = ord(self.fmt[self.fmtpos - 1]) + pos = self.fmtpos - 1 w_s = space.newbytes(chr(cp)) raise oefmt(space.w_ValueError, "unsupported format character %R (%s) at index %d", - w_s, hex(cp), self.fmtpos - 1) + w_s, hex(cp), pos) @specialize.arg(2) def std_wp(self, r, is_string=False): @@ -472,7 +482,8 @@ n = space.int_w(w_value) if do_unicode: try: - c = rutf8.unichr_as_utf8(r_uint(n)) + c = rutf8.unichr_as_utf8(r_uint(n), + allow_surrogates=True) except rutf8.OutOfRange: raise oefmt(space.w_OverflowError, "unicode character code out of range") diff -Nru pypy-7.1.1+dfsg/pypy/objspace/std/__init__.py pypy-7.3.1+dfsg/pypy/objspace/std/__init__.py --- pypy-7.1.1+dfsg/pypy/objspace/std/__init__.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/objspace/std/__init__.py 2020-04-10 19:28:41.000000000 +0000 @@ -1,2 +1 @@ -from pypy.objspace.std.objspace import StdObjSpace -Space = StdObjSpace + diff -Nru pypy-7.1.1+dfsg/pypy/objspace/std/iterobject.py pypy-7.3.1+dfsg/pypy/objspace/std/iterobject.py --- pypy-7.1.1+dfsg/pypy/objspace/std/iterobject.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/objspace/std/iterobject.py 2020-04-10 19:28:41.000000000 +0000 @@ -103,7 +103,6 @@ def descr_next(self, space): from pypy.objspace.std.unicodeobject import W_UnicodeObject - from rpython.rlib import rutf8 w_seq = self.w_seq if w_seq is None: raise OperationError(space.w_StopIteration, space.w_None) @@ -113,7 +112,7 @@ self.w_seq = None raise OperationError(space.w_StopIteration, space.w_None) start = self.byteindex - end = rutf8.next_codepoint_pos(w_seq._utf8, start) + end = w_seq.next_codepoint_pos_dont_look_inside(start) w_res = W_UnicodeObject(w_seq._utf8[start:end], 1) self.byteindex = end self.index += 1 diff -Nru pypy-7.1.1+dfsg/pypy/objspace/std/jsondict.py pypy-7.3.1+dfsg/pypy/objspace/std/jsondict.py --- pypy-7.1.1+dfsg/pypy/objspace/std/jsondict.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/objspace/std/jsondict.py 2020-04-10 19:28:41.000000000 +0000 @@ -0,0 +1,171 @@ +"""dict implementation specialized for object loaded by the _pypyjson module. + +Somewhat similar to MapDictStrategy, also uses a map. +""" + +from rpython.rlib import jit, rerased, objectmodel, debug + +from pypy.objspace.std.dictmultiobject import ( + UnicodeDictStrategy, DictStrategy, + create_iterator_classes, W_DictObject) + + +def from_values_and_jsonmap(space, values_w, jsonmap): + if not objectmodel.we_are_translated(): + assert len(values_w) == len(jsonmap.get_keys_in_order()) + assert len(values_w) != 0 + debug.make_sure_not_resized(values_w) + strategy = jsonmap.strategy_instance + if strategy is None: + jsonmap.strategy_instance = strategy = JsonDictStrategy(space, jsonmap) + storage = strategy.erase(values_w) + return W_DictObject(space, strategy, storage) + +def devolve_jsonmap_dict(w_dict): + assert isinstance(w_dict, W_DictObject) + strategy = w_dict.get_strategy() + assert isinstance(strategy, JsonDictStrategy) + strategy.switch_to_unicode_strategy(w_dict) + +def get_jsonmap_from_dict(w_dict): + assert isinstance(w_dict, W_DictObject) + strategy = w_dict.get_strategy() + assert isinstance(strategy, JsonDictStrategy) + return strategy.jsonmap + +class JsonDictStrategy(DictStrategy): + erase, unerase = rerased.new_erasing_pair("jsondict") + erase = staticmethod(erase) + unerase = staticmethod(unerase) + + _immutable_fields_ = ['jsonmap'] + + def __init__(self, space, jsonmap): + DictStrategy.__init__(self, space) + self.jsonmap = jsonmap + + def wrap(self, w_key): + return w_key + + def wrapkey(space, key): + return key + + def get_empty_storage(self): + raise NotImplementedError("should not be reachable") + + def is_correct_type(self, w_obj): + space = self.space + return space.is_w(space.type(w_obj), space.w_unicode) + + def _never_equal_to(self, w_lookup_type): + return False + + def length(self, w_dict): + return len(self.unerase(w_dict.dstorage)) + + def getitem(self, w_dict, w_key): + if self.is_correct_type(w_key): + return self.getitem_unicode(w_dict, w_key) + else: + self.switch_to_unicode_strategy(w_dict) + return w_dict.getitem(w_key) + + def getitem_unicode(self, w_dict, w_key): + storage_w = self.unerase(w_dict.dstorage) + if jit.isconstant(w_key): + jit.promote(self) + index = self.jsonmap.get_index(w_key) + if index == -1: + return None + return storage_w[index] + + def setitem(self, w_dict, w_key, w_value): + if self.is_correct_type(w_key): + storage_w = self.unerase(w_dict.dstorage) + index = self.jsonmap.get_index(w_key) + if index != -1: + storage_w[index] = w_value + return + self.switch_to_unicode_strategy(w_dict) + w_dict.setitem(w_key, w_value) + + # for setitem_str use the default implementation + # because the jsonmap needs a wrapped key anyway + + + def setdefault(self, w_dict, w_key, w_default): + if self.is_correct_type(w_key): + w_result = self.getitem_unicode(w_dict, w_key) + if w_result is not None: + return w_result + self.switch_to_unicode_strategy(w_dict) + return w_dict.setdefault(w_key, w_default) + + def delitem(self, w_dict, w_key): + self.switch_to_unicode_strategy(w_dict) + return w_dict.delitem(w_key) + + def popitem(self, w_dict): + self.switch_to_unicode_strategy(w_dict) + return w_dict.popitem() + + def switch_to_unicode_strategy(self, w_dict): + strategy = self.space.fromcache(UnicodeDictStrategy) + values_w = self.unerase(w_dict.dstorage) + storage = strategy.get_empty_storage() + d_new = strategy.unerase(storage) + keys_in_order = self.jsonmap.get_keys_in_order() + assert len(keys_in_order) == len(values_w) + for index, w_key in enumerate(keys_in_order): + assert w_key is not None + assert type(w_key) is self.space.UnicodeObjectCls + d_new[w_key] = values_w[index] + w_dict.set_strategy(strategy) + w_dict.dstorage = storage + + def w_keys(self, w_dict): + return self.space.newlist(self.jsonmap.get_keys_in_order()) + + def values(self, w_dict): + return self.unerase(w_dict.dstorage)[:] # to make resizable + + def items(self, w_dict): + space = self.space + storage_w = self.unerase(w_dict.dstorage) + res = [None] * len(storage_w) + for index, w_key in enumerate(self.jsonmap.get_keys_in_order()): + res[index] = space.newtuple([w_key, storage_w[index]]) + return res + + def getiterkeys(self, w_dict): + return iter(self.jsonmap.get_keys_in_order()) + + def getitervalues(self, w_dict): + storage_w = self.unerase(w_dict.dstorage) + return iter(storage_w) + + def getiteritems_with_hash(self, w_dict): + storage_w = self.unerase(w_dict.dstorage) + return ZipItemsWithHash(self.jsonmap.get_keys_in_order(), storage_w) + + +class ZipItemsWithHash(object): + def __init__(self, list1, list2): + assert len(list1) == len(list2) + self.list1 = list1 + self.list2 = list2 + self.i = 0 + + def __iter__(self): + return self + + def next(self): + i = self.i + if i >= len(self.list1): + raise StopIteration + self.i = i + 1 + w_key = self.list1[i] + return (w_key, self.list2[i], w_key.hash_w()) + + +create_iterator_classes(JsonDictStrategy) diff -Nru pypy-7.1.1+dfsg/pypy/objspace/std/listobject.py pypy-7.3.1+dfsg/pypy/objspace/std/listobject.py --- pypy-7.1.1+dfsg/pypy/objspace/std/listobject.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/objspace/std/listobject.py 2020-04-10 19:28:41.000000000 +0000 @@ -98,13 +98,13 @@ return space.fromcache(BytesListStrategy) elif type(w_firstobj) is W_UnicodeObject and w_firstobj.is_ascii(): - # check for all-unicodes + # check for all-unicodes containing only ascii for i in range(1, len(list_w)): item = list_w[i] if type(item) is not W_UnicodeObject or not item.is_ascii(): break else: - return space.fromcache(UnicodeListStrategy) + return space.fromcache(AsciiListStrategy) elif type(w_firstobj) is W_FloatObject: # check for all-floats @@ -131,26 +131,26 @@ return space.fromcache(ObjectListStrategy) -def _get_printable_location(w_type): - return ('list__do_extend_from_iterable [w_type=%s]' % - w_type.getname(w_type.space)) +def _get_printable_location(strategy_type, greenkey): + return 'list__do_extend_from_iterable [%s, %s]' % ( + strategy_type, + greenkey.iterator_greenkey_printable()) _do_extend_jitdriver = jit.JitDriver( name='list__do_extend_from_iterable', - greens=['w_type'], - reds=['i', 'w_iterator', 'w_list'], + greens=['strategy_type', 'greenkey'], + reds='auto', get_printable_location=_get_printable_location) def _do_extend_from_iterable(space, w_list, w_iterable): w_iterator = space.iter(w_iterable) - w_type = space.type(w_iterator) + greenkey = space.iterator_greenkey(w_iterator) i = 0 while True: - _do_extend_jitdriver.jit_merge_point(w_type=w_type, - i=i, - w_iterator=w_iterator, - w_list=w_list) + _do_extend_jitdriver.jit_merge_point( + greenkey=greenkey, + strategy_type=type(w_list.strategy)) try: w_list.append(space.next(w_iterator)) except OperationError as e: @@ -198,8 +198,8 @@ return W_ListObject.from_storage_and_strategy(space, storage, strategy) @staticmethod - def newlist_utf8(space, list_u): - strategy = space.fromcache(UnicodeListStrategy) + def newlist_ascii(space, list_u): + strategy = space.fromcache(AsciiListStrategy) storage = strategy.erase(list_u) return W_ListObject.from_storage_and_strategy(space, storage, strategy) @@ -337,10 +337,10 @@ not use the list strategy, return None.""" return self.strategy.getitems_bytes(self) - def getitems_utf8(self): + def getitems_ascii(self): """Return the items in the list as unwrapped unicodes. If the list does not use the list strategy, return None.""" - return self.strategy.getitems_utf8(self) + return self.strategy.getitems_ascii(self) def getitems_int(self): """Return the items in the list as unwrapped ints. If the list does not @@ -749,7 +749,9 @@ if mucked: raise oefmt(space.w_ValueError, "list modified during sort") -find_jmp = jit.JitDriver(greens = ['tp'], reds = 'auto', name = 'list.find') +def get_printable_location(strategy_type, tp): + return "list.find [%s, %s]" % (strategy_type, tp.getname(tp.space), ) +find_jmp = jit.JitDriver(greens=['strategy_type', 'tp'], reds='auto', name='list.find', get_printable_location=get_printable_location) class ListStrategy(object): @@ -777,7 +779,7 @@ # needs to be safe against eq_w mutating stuff tp = space.type(w_item) while i < stop and i < w_list.length(): - find_jmp.jit_merge_point(tp=tp) + find_jmp.jit_merge_point(tp=tp, strategy_type=type(self)) if space.eq_w(w_item, w_list.getitem(i)): return i i += 1 @@ -801,7 +803,7 @@ def getitems_bytes(self, w_list): return None - def getitems_utf8(self, w_list): + def getitems_ascii(self, w_list): return None def getitems_int(self, w_list): @@ -948,7 +950,7 @@ elif type(w_item) is W_BytesObject: strategy = self.space.fromcache(BytesListStrategy) elif type(w_item) is W_UnicodeObject and w_item.is_ascii(): - strategy = self.space.fromcache(UnicodeListStrategy) + strategy = self.space.fromcache(AsciiListStrategy) elif type(w_item) is W_FloatObject: strategy = self.space.fromcache(FloatListStrategy) else: @@ -1026,9 +1028,9 @@ w_list.lstorage = strategy.erase(byteslist[:]) return - unilist = space.listview_utf8(w_iterable) + unilist = space.listview_ascii(w_iterable) if unilist is not None: - w_list.strategy = strategy = space.fromcache(UnicodeListStrategy) + w_list.strategy = strategy = space.fromcache(AsciiListStrategy) # need to copy because intlist can share with w_iterable w_list.lstorage = strategy.erase(unilist[:]) return @@ -1990,7 +1992,7 @@ return self.unerase(w_list.lstorage) -class UnicodeListStrategy(ListStrategy): +class AsciiListStrategy(ListStrategy): import_from_mixin(AbstractUnwrappedStrategy) _none_value = "" @@ -2010,7 +2012,7 @@ return type(w_obj) is W_UnicodeObject and w_obj.is_ascii() def list_is_correct_type(self, w_list): - return w_list.strategy is self.space.fromcache(UnicodeListStrategy) + return w_list.strategy is self.space.fromcache(AsciiListStrategy) def sort(self, w_list, reverse): l = self.unerase(w_list.lstorage) @@ -2019,7 +2021,7 @@ if reverse: l.reverse() - def getitems_utf8(self, w_list): + def getitems_ascii(self, w_list): return self.unerase(w_list.lstorage) # _______________________________________________________ diff -Nru pypy-7.1.1+dfsg/pypy/objspace/std/mapdict.py pypy-7.3.1+dfsg/pypy/objspace/std/mapdict.py --- pypy-7.1.1+dfsg/pypy/objspace/std/mapdict.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/objspace/std/mapdict.py 2020-04-10 19:28:41.000000000 +0000 @@ -692,10 +692,12 @@ return unerase_item(erased) def _mapdict_write_storage(self, storageindex, value): - for i in rangenmin1: - if storageindex == i: - setattr(self, "_value%s" % i, value) - return + assert storageindex >= 0 + if storageindex < nmin1: + for i in rangenmin1: + if storageindex == i: + setattr(self, "_value%s" % i, value) + return if self._has_storage_list(): self._mapdict_get_storage_list()[storageindex - nmin1] = value return @@ -753,6 +755,7 @@ self.space = space def get_empty_storage(self): + # mainly used for tests w_result = Object() terminator = self.space.fromcache(get_terminator_for_dicts) w_result._mapdict_init_empty(terminator) @@ -865,6 +868,11 @@ def iteritems(self, w_dict): return MapDictIteratorItems(self.space, self, w_dict) +def make_instance_dict(space): + w_fake_object = Object() + terminator = space.fromcache(get_terminator_for_dicts) + w_fake_object._mapdict_init_empty(terminator) + return w_fake_object.getdict(space) def materialize_r_dict(space, obj, dict_w): map = obj._get_mapdict_map() diff -Nru pypy-7.1.1+dfsg/pypy/objspace/std/newformat.py pypy-7.3.1+dfsg/pypy/objspace/std/newformat.py --- pypy-7.1.1+dfsg/pypy/objspace/std/newformat.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/objspace/std/newformat.py 2020-04-10 19:28:41.000000000 +0000 @@ -349,9 +349,11 @@ if recursive: spec = self._build_string(spec_start, end, level) w_rendered = self.space.format(w_obj, self.wrap(spec)) - unwrapper = "utf8_w" if self.is_unicode else "bytes_w" - to_interp = getattr(self.space, unwrapper) - return to_interp(w_rendered) + if self.is_unicode: + w_rendered = self.space.unicode_from_object(w_rendered) + return self.space.utf8_w(w_rendered) + else: + return self.space.bytes_w(w_rendered) def formatter_parser(self): self.parser_list_w = [] @@ -770,7 +772,7 @@ digits = self._upcase_string(digits) out.append(digits) if spec.n_decimal: - out.append(self._lit(".")[0]) + out.append(self._lit(self._loc_dec)[0]) if spec.n_remainder: out.append(num[to_remainder:]) if spec.n_rpadding: @@ -779,6 +781,7 @@ return out.build() def _format_int_or_long(self, w_num, kind): + # note: 'self.is_unicode' cannot be True any more here space = self.space if self._precision != -1: raise oefmt(space.w_ValueError, @@ -903,6 +906,7 @@ return "".join(buf[i:]) def format_int_or_long(self, w_num, kind): + # note: 'self.is_unicode' cannot be True any more here space = self.space if self._parse_spec("d", ">"): if self.is_unicode: @@ -992,6 +996,7 @@ fill, to_remainder, False)) def format_float(self, w_float): + # note: 'self.is_unicode' cannot be True any more here space = self.space if self._parse_spec("\0", ">"): if self.is_unicode: @@ -1155,6 +1160,7 @@ def format_complex(self, w_complex): """return the string representation of a complex number""" + # note: 'self.is_unicode' cannot be True any more here space = self.space #parse format specification, set associated variables if self._parse_spec("\0", ">"): @@ -1178,9 +1184,5 @@ @specialize.arg(2) def run_formatter(space, w_format_spec, meth, *args): - if space.isinstance_w(w_format_spec, space.w_unicode): - formatter = unicode_formatter(space, space.utf8_w(w_format_spec)) - return getattr(formatter, meth)(*args) - else: - formatter = str_formatter(space, space.bytes_w(w_format_spec)) - return getattr(formatter, meth)(*args) + formatter = str_formatter(space, space.bytes_w(w_format_spec)) + return getattr(formatter, meth)(*args) diff -Nru pypy-7.1.1+dfsg/pypy/objspace/std/objspace.py pypy-7.3.1+dfsg/pypy/objspace/std/objspace.py --- pypy-7.1.1+dfsg/pypy/objspace/std/objspace.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/objspace/std/objspace.py 2020-04-10 19:28:41.000000000 +0000 @@ -311,7 +311,7 @@ def newlist_utf8(self, list_u, is_ascii): if is_ascii: - return W_ListObject.newlist_utf8(self, list_u) + return W_ListObject.newlist_ascii(self, list_u) return ObjSpace.newlist_utf8(self, list_u, False) def newlist_int(self, list_i): @@ -502,20 +502,20 @@ return w_obj.getitems_bytes() return None - def listview_utf8(self, w_obj): + def listview_ascii(self, w_obj): # note: uses exact type checking for objects with strategies, # and isinstance() for others. See test_listobject.test_uses_custom... if type(w_obj) is W_ListObject: - return w_obj.getitems_utf8() + return w_obj.getitems_ascii() if type(w_obj) is W_DictObject: - return w_obj.listview_utf8() + return w_obj.listview_ascii() if type(w_obj) is W_SetObject or type(w_obj) is W_FrozensetObject: - return w_obj.listview_utf8() + return w_obj.listview_ascii() if (isinstance(w_obj, W_UnicodeObject) and self._uni_uses_no_iter(w_obj) and w_obj.is_ascii()): - return w_obj.listview_utf8() + return w_obj.listview_ascii() if isinstance(w_obj, W_ListObject) and self._uses_list_iter(w_obj): - return w_obj.getitems_utf8() + return w_obj.getitems_ascii() return None def listview_int(self, w_obj): diff -Nru pypy-7.1.1+dfsg/pypy/objspace/std/setobject.py pypy-7.3.1+dfsg/pypy/objspace/std/setobject.py --- pypy-7.1.1+dfsg/pypy/objspace/std/setobject.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/objspace/std/setobject.py 2020-04-10 19:28:41.000000000 +0000 @@ -20,6 +20,7 @@ class W_BaseSetObject(W_Root): typedef = None + exact_class_applevel_name = 'set-or-frozenset' def __init__(self, space, w_iterable=None): """Initialize the set by taking ownership of 'setdata'.""" @@ -86,9 +87,9 @@ """ If this is a string set return its contents as a list of uwnrapped strings. Otherwise return None. """ return self.strategy.listview_bytes(self) - def listview_utf8(self): + def listview_ascii(self): """ If this is a unicode set return its contents as a list of uwnrapped unicodes. Otherwise return None. """ - return self.strategy.listview_utf8(self) + return self.strategy.listview_ascii(self) def listview_int(self): """ If this is an int set return its contents as a list of uwnrapped ints. Otherwise return None. """ @@ -253,10 +254,16 @@ return space.w_NotImplemented return self.difference(w_other) + def descr_rsub(self, space, w_other): + if not isinstance(w_other, W_BaseSetObject): + return space.w_NotImplemented + return w_other.difference(self) + def descr_and(self, space, w_other): if not isinstance(w_other, W_BaseSetObject): return space.w_NotImplemented return self.intersect(w_other) + descr_rand = descr_and # symmetric def descr_or(self, space, w_other): if not isinstance(w_other, W_BaseSetObject): @@ -264,11 +271,13 @@ w_copy = self.copy_real() w_copy.update(w_other) return w_copy + descr_ror = descr_or # symmetric def descr_xor(self, space, w_other): if not isinstance(w_other, W_BaseSetObject): return space.w_NotImplemented return self.symmetric_difference(w_other) + descr_rxor = descr_xor # symmetric def descr_inplace_sub(self, space, w_other): if not isinstance(w_other, W_BaseSetObject): @@ -496,6 +505,12 @@ class W_SetObject(W_BaseSetObject): + + #overridden here so the error is reported correctly + def __init__(self, space, w_iterable=None): + """Initialize the set by taking ownership of 'setdata'.""" + W_BaseSetObject.__init__(self, space, w_iterable) + def _newobj(self, space, w_iterable): """Make a new set by taking ownership of 'w_iterable'.""" if type(self) is W_SetObject: @@ -516,7 +531,7 @@ Build an unordered collection.""", __new__ = gateway.interp2app(W_SetObject.descr_new), - __init__ = gateway.interp2app(W_BaseSetObject.descr_init), + __init__ = gateway.interp2app(W_SetObject.descr_init), __repr__ = gateway.interp2app(W_BaseSetObject.descr_repr), __hash__ = None, __cmp__ = gateway.interp2app(W_BaseSetObject.descr_cmp), @@ -534,9 +549,13 @@ __iter__ = gateway.interp2app(W_BaseSetObject.descr_iter), __contains__ = gateway.interp2app(W_BaseSetObject.descr_contains), __sub__ = gateway.interp2app(W_BaseSetObject.descr_sub), + __rsub__ = gateway.interp2app(W_BaseSetObject.descr_rsub), __and__ = gateway.interp2app(W_BaseSetObject.descr_and), + __rand__ = gateway.interp2app(W_BaseSetObject.descr_rand), __or__ = gateway.interp2app(W_BaseSetObject.descr_or), + __ror__ = gateway.interp2app(W_BaseSetObject.descr_ror), __xor__ = gateway.interp2app(W_BaseSetObject.descr_xor), + __rxor__ = gateway.interp2app(W_BaseSetObject.descr_rxor), # mutating operators __isub__ = gateway.interp2app(W_BaseSetObject.descr_inplace_sub), @@ -656,9 +675,13 @@ __iter__ = gateway.interp2app(W_BaseSetObject.descr_iter), __contains__ = gateway.interp2app(W_BaseSetObject.descr_contains), __sub__ = gateway.interp2app(W_BaseSetObject.descr_sub), + __rsub__ = gateway.interp2app(W_BaseSetObject.descr_rsub), __and__ = gateway.interp2app(W_BaseSetObject.descr_and), + __rand__ = gateway.interp2app(W_BaseSetObject.descr_rand), __or__ = gateway.interp2app(W_BaseSetObject.descr_or), + __ror__ = gateway.interp2app(W_BaseSetObject.descr_ror), __xor__ = gateway.interp2app(W_BaseSetObject.descr_xor), + __rxor__ = gateway.interp2app(W_BaseSetObject.descr_rxor), # non-mutating methods __reduce__ = gateway.interp2app(W_BaseSetObject.descr_reduce), @@ -690,7 +713,7 @@ def listview_bytes(self, w_set): return None - def listview_utf8(self, w_set): + def listview_ascii(self, w_set): return None def listview_int(self, w_set): @@ -796,7 +819,7 @@ elif type(w_key) is W_BytesObject: strategy = self.space.fromcache(BytesSetStrategy) elif type(w_key) is W_UnicodeObject and w_key.is_ascii(): - strategy = self.space.fromcache(UnicodeSetStrategy) + strategy = self.space.fromcache(AsciiSetStrategy) elif self.space.type(w_key).compares_by_identity(): strategy = self.space.fromcache(IdentitySetStrategy) else: @@ -1258,7 +1281,7 @@ return BytesIteratorImplementation(self.space, self, w_set) -class UnicodeSetStrategy(AbstractUnwrappedSetStrategy, SetStrategy): +class AsciiSetStrategy(AbstractUnwrappedSetStrategy, SetStrategy): erase, unerase = rerased.new_erasing_pair("unicode") erase = staticmethod(erase) unerase = staticmethod(unerase) @@ -1272,7 +1295,7 @@ def get_empty_dict(self): return {} - def listview_utf8(self, w_set): + def listview_ascii(self, w_set): return self.unerase(w_set.sstorage).keys() def is_correct_type(self, w_key): @@ -1320,7 +1343,7 @@ def may_contain_equal_elements(self, strategy): if strategy is self.space.fromcache(BytesSetStrategy): return False - elif strategy is self.space.fromcache(UnicodeSetStrategy): + elif strategy is self.space.fromcache(AsciiSetStrategy): return False elif strategy is self.space.fromcache(EmptySetStrategy): return False @@ -1411,7 +1434,7 @@ return False if strategy is self.space.fromcache(BytesSetStrategy): return False - if strategy is self.space.fromcache(UnicodeSetStrategy): + if strategy is self.space.fromcache(AsciiSetStrategy): return False return True @@ -1591,9 +1614,9 @@ w_set.sstorage = strategy.get_storage_from_unwrapped_list(byteslist) return - unicodelist = space.listview_utf8(w_iterable) + unicodelist = space.listview_ascii(w_iterable) if unicodelist is not None: - strategy = space.fromcache(UnicodeSetStrategy) + strategy = space.fromcache(AsciiSetStrategy) w_set.strategy = strategy w_set.sstorage = strategy.get_storage_from_unwrapped_list(unicodelist) return @@ -1640,7 +1663,7 @@ if type(w_item) is not W_UnicodeObject or not w_item.is_ascii(): break else: - w_set.strategy = space.fromcache(UnicodeSetStrategy) + w_set.strategy = space.fromcache(AsciiSetStrategy) w_set.sstorage = w_set.strategy.get_storage_from_list(iterable_w) return @@ -1657,15 +1680,19 @@ w_set.sstorage = w_set.strategy.get_storage_from_list(iterable_w) +def get_printable_location(tp, strategy): + return "create_set: %s %s" % (tp.iterator_greenkey_printable(), strategy) + create_set_driver = jit.JitDriver(name='create_set', greens=['tp', 'strategy'], - reds='auto') + reds='auto', + get_printable_location=get_printable_location) def _create_from_iterable(space, w_set, w_iterable): w_set.strategy = strategy = space.fromcache(EmptySetStrategy) w_set.sstorage = strategy.get_empty_storage() - tp = space.type(w_iterable) + tp = space.iterator_greenkey(w_iterable) w_iter = space.iter(w_iterable) while True: diff -Nru pypy-7.1.1+dfsg/pypy/objspace/std/test/apptest_boolobject.py pypy-7.3.1+dfsg/pypy/objspace/std/test/apptest_boolobject.py --- pypy-7.1.1+dfsg/pypy/objspace/std/test/apptest_boolobject.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/objspace/std/test/apptest_boolobject.py 2020-04-10 19:28:41.000000000 +0000 @@ -0,0 +1,53 @@ +from pytest import raises + +def test_bool_callable(): + assert True == bool(1) + assert False == bool(0) + assert False == bool() + +def test_bool_string(): + assert "True" == str(True) + assert "False" == str(False) + assert "True" == repr(True) + assert "False" == repr(False) + +def test_bool_int(): + assert int(True) is 1 + assert int(False) is 0 + assert True.__int__() is 1 + +def test_bool_long(): + assert long(True) == 1L + assert long(False) == 0L + assert True.__long__() == 1L + +def test_bool_ops(): + assert True + True == 2 + assert False | False is False + assert True | False is True + assert True & True is True + assert True ^ True is False + assert False ^ False is False + assert True ^ False is True + assert True & 1 == 1 + assert False & 0 == 0 & 0 + +def test_bool_int_ops(): + assert True == 1 + assert 1 == True + assert False == 0 + assert 0 == False + + assert True is not 1 + assert 1 is not True + assert False is not 0 + assert 0 is not False + +def test_new(): + assert bool.__new__(bool, "hi") is True + assert bool.__new__(bool, "") is False + raises(TypeError, bool.__new__, int) + raises(TypeError, bool.__new__, 42) + +def test_cant_subclass_bool(): + raises(TypeError, "class b(bool): pass") diff -Nru pypy-7.1.1+dfsg/pypy/objspace/std/test/apptest_bufferobject.py pypy-7.3.1+dfsg/pypy/objspace/std/test/apptest_bufferobject.py --- pypy-7.1.1+dfsg/pypy/objspace/std/test/apptest_bufferobject.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/objspace/std/test/apptest_bufferobject.py 2020-04-10 19:28:41.000000000 +0000 @@ -0,0 +1,207 @@ +# spaceconfig = {"usemodules" : ["array"]} +import sys +import array + +def test_init(): + class A(object): + def __buffer__(self, flags): + return buffer('123') + if '__pypy__' not in sys.builtin_module_names: + raises(TypeError, buffer, A()) + else: + assert buffer(A()) == buffer('123') + +def test_unicode_buffer(): + b = buffer(u"ab") + if sys.maxunicode == 65535: # UCS2 build + assert len(b) == 4 + if sys.byteorder == "big": + assert b[0:4] == "\x00a\x00b" + else: + assert b[0:4] == "a\x00b\x00" + else: # UCS4 build + assert len(b) == 8 + if sys.byteorder == "big": + assert b[0:8] == "\x00\x00\x00a\x00\x00\x00b" + else: + assert b[0:8] == "a\x00\x00\x00b\x00\x00\x00" + +def test_array_buffer(): + arr = array.array("B", [1, 2, 3]) + b = buffer(arr) + assert len(b) == 3 + assert b[0:3] == "\x01\x02\x03" + assert buffer('') + arr is arr + +def test_nonzero(): + assert buffer('\x00') + assert not buffer('') + assert buffer(array.array("B", [0])) + assert not buffer(array.array("B", [])) + +def test_str(): + assert str(buffer('hello')) == 'hello' + +def test_repr(): + # from 2.5.2 lib tests + assert repr(buffer('hello')).startswith(' buffer('ab')) + assert buffer('ab') >= buffer('ab') + assert buffer('ab') != buffer('abc') + assert buffer('ab') < buffer('abc') + assert buffer('ab') <= buffer('ab') + assert buffer('ab') > buffer('aa') + assert buffer('ab') >= buffer('ab') + +def test_hash(): + assert hash(buffer('hello')) == hash('hello') + +def test_mul(): + assert buffer('ab') * 5 == 'ababababab' + assert buffer('ab') * (-2) == '' + assert 5 * buffer('ab') == 'ababababab' + assert (-2) * buffer('ab') == '' + +def test_offset_size(): + b = buffer('hello world', 6) + assert len(b) == 5 + assert b[0] == 'w' + assert b[:] == 'world' + raises(IndexError, 'b[5]') + b = buffer(b, 2) + assert len(b) == 3 + assert b[0] == 'r' + assert b[:] == 'rld' + raises(IndexError, 'b[3]') + b = buffer('hello world', 1, 8) + assert len(b) == 8 + assert b[0] == 'e' + assert b[:] == 'ello wor' + raises(IndexError, 'b[8]') + b = buffer(b, 2, 3) + assert len(b) == 3 + assert b[2] == ' ' + assert b[:] == 'lo ' + raises(IndexError, 'b[3]') + b = buffer('hello world', 55) + assert len(b) == 0 + assert b[:] == '' + b = buffer('hello world', 6, 999) + assert len(b) == 5 + assert b[:] == 'world' + + raises(ValueError, buffer, "abc", -1) + raises(ValueError, buffer, "abc", 0, -2) + +def test_rw_offset_size(): + a = array.array("c", 'hello world') + b = buffer(a, 6) + assert len(b) == 5 + assert b[0] == 'w' + assert b[:] == 'world' + raises(IndexError, 'b[5]') + exc = raises(TypeError, "b[0] = 'W'") + assert str(exc.value) == "buffer is read-only" + exc = raises(TypeError, "b[:] = '12345'") + assert str(exc.value) == "buffer is read-only" + exc = raises(TypeError, 'b[5] = "."') + assert str(exc.value) == "buffer is read-only" + exc = raises(TypeError, "b[4:2] = ''") + assert str(exc.value) == "buffer is read-only" + assert str(b) == 'world' + assert a.tostring() == 'hello world' + + b = buffer(b, 2) + assert len(b) == 3 + assert b[0] == 'r' + assert b[:] == 'rld' + raises(IndexError, 'b[3]') + exc = raises(TypeError, "b[1] = 'X'") + assert str(exc.value) == "buffer is read-only" + exc = raises(TypeError, 'b[3] = "."') + assert str(exc.value) == "buffer is read-only" + assert a.tostring() == 'hello world' + + a = array.array("c", 'hello world') + b = buffer(a, 1, 8) + assert len(b) == 8 + assert b[0] == 'e' + assert b[:] == 'ello wor' + raises(IndexError, 'b[8]') + exc = raises(TypeError, "b[0] = 'E'") + assert str(exc.value) == "buffer is read-only" + assert str(b) == 'ello wor' + assert a.tostring() == 'hello world' + exc = raises(TypeError, "b[:] = '12345678'") + assert str(exc.value) == "buffer is read-only" + assert a.tostring() == 'hello world' + exc = raises(TypeError, 'b[8] = "."') + assert str(exc.value) == "buffer is read-only" + + b = buffer(b, 2, 3) + assert len(b) == 3 + assert b[2] == ' ' + assert b[:] == 'lo ' + raises(IndexError, 'b[3]') + exc = raises(TypeError, "b[1] = 'X'") + assert str(exc.value) == "buffer is read-only" + assert a.tostring() == 'hello world' + exc = raises(TypeError, 'b[3] = "."') + assert str(exc.value) == "buffer is read-only" + + b = buffer(a, 55) + assert len(b) == 0 + assert b[:] == '' + b = buffer(a, 6, 999) + assert len(b) == 5 + assert b[:] == 'world' + + raises(ValueError, buffer, a, -1) + raises(ValueError, buffer, a, 0, -2) + +def test_slice(): + # Test extended slicing by comparing with list slicing. + s = "".join(chr(c) for c in list(range(255, -1, -1))) + b = buffer(s) + indices = (0, None, 1, 3, 19, 300, -1, -2, -31, -300) + for start in indices: + for stop in indices: + # Skip step 0 (invalid) + for step in indices[1:]: + assert b[start:stop:step] == s[start:stop:step] + assert b[start:stop] == s[start:stop] + +def test_getitem_only_ints(): + class MyInt(object): + def __init__(self, x): + self.x = x + + def __int__(self): + return self.x + + buf = buffer('hello world') + raises(TypeError, "buf[MyInt(0)]") + raises(TypeError, "buf[MyInt(0):MyInt(5)]") + +def test_pypy_raw_address_base(): + if '__pypy__' not in sys.builtin_module_names: + skip('PyPy only') + a = buffer("foobar")._pypy_raw_address() + assert a != 0 + b = buffer(u"foobar")._pypy_raw_address() + assert b != 0 + c = buffer(bytearray("foobar"))._pypy_raw_address() + assert c != 0 diff -Nru pypy-7.1.1+dfsg/pypy/objspace/std/test/apptest_callmethod.py pypy-7.3.1+dfsg/pypy/objspace/std/test/apptest_callmethod.py --- pypy-7.1.1+dfsg/pypy/objspace/std/test/apptest_callmethod.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/objspace/std/test/apptest_callmethod.py 2020-04-10 19:28:41.000000000 +0000 @@ -0,0 +1,107 @@ +# The exec hacking is needed to have the code snippets compiled +# by our own compiler, not CPython's + +def test_call_method(): + exec """if 1: + class C(object): + def m(*args, **kwds): + return args, kwds + sm = staticmethod(m) + cm = classmethod(m) + + c = C() + assert c.m() == ((c,), {}) + assert c.sm() == ((), {}) + assert c.cm() == ((C,), {}) + assert c.m(5) == ((c, 5), {}) + assert c.sm(6) == ((6,), {}) + assert c.cm(7) == ((C, 7), {}) + assert c.m(5, x=3) == ((c, 5), {'x': 3}) + assert c.m(*range(5)) == ((c, 0, 1, 2, 3, 4), {}) + assert c.m(**{'u': 4}) == ((c,), {'u': 4}) + """ + +def test_call_attribute(): + exec """if 1: + class C(object): + def m(*args, **kwds): + return args, kwds + def myfunc(*args): + return args + + c = C() + c.m = c.m2 = myfunc + assert c.m() == () + assert c.m(5, 2) == (5, 2) + assert c.m2(4) == (4,) + assert c.m2("h", "e", "l", "l", "o") == tuple("hello") + """ + +def test_call_module(): + exec """if 1: + import sys + try: + sys.exit(5) + except SystemExit, e: + assert e.args == (5,) + else: + raise Exception, "did not raise?" + """ + +def test_custom_getattr(): + exec """if 1: + class C(object): + def __getattr__(self, name): + if name == 'bla': + return myfunc + raise AttributeError + def myfunc(*args): + return args + + c = C() + assert c.bla(1, 2, 3) == (1, 2, 3) + """ in {} + +def test_custom_getattribute(): + exec """if 1: + class C(object): + def __getattribute__(self, name): + if name == 'bla': + return myfunc + raise AttributeError + def bla(self): + Boom + def myfunc(*args): + return args + + c = C() + assert c.bla(1, 2, 3) == (1, 2, 3) + """ in {} + +def test_builtin(): + exec """if 1: + class C(object): + foobar = len + c = C() + assert c.foobar("hello") == 5 + """ + +def test_attributeerror(): + exec """if 1: + assert 5 .__add__(6) == 11 + try: + 6 .foobar(7) + except AttributeError: + pass + else: + raise Exception("did not raise?") + """ + +def test_kwargs(): + exec """if 1: + class C(object): + def f(self, a): + return a + 2 + + assert C().f(a=3) == 5 + """ diff -Nru pypy-7.1.1+dfsg/pypy/objspace/std/test/apptest_complexobject.py pypy-7.3.1+dfsg/pypy/objspace/std/test/apptest_complexobject.py --- pypy-7.1.1+dfsg/pypy/objspace/std/test/apptest_complexobject.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/objspace/std/test/apptest_complexobject.py 2020-04-10 19:28:41.000000000 +0000 @@ -0,0 +1,553 @@ +# spaceconfig = {"usemodules" : ["binascii", "time", "struct"]} +from random import random +import cmath + +def close_abs(x, y, eps=1e-9): + """Return true iff floats x and y "are close\"""" + # put the one with larger magnitude second + if abs(x) > abs(y): + x, y = y, x + if y == 0: + return abs(x) < eps + if x == 0: + return abs(y) < eps + # check that relative difference < eps + return abs((x - y) / y) < eps + +def almost_equal(a, b, eps=1e-9): + if isinstance(a, complex): + if isinstance(b, complex): + return a.real - b.real < eps and a.imag - b.imag < eps + else: + return a.real - b < eps and a.imag < eps + else: + if isinstance(b, complex): + return a - b.real < eps and b.imag < eps + else: + return a - b < eps + +def close(x, y): + """Return true iff complexes x and y "are close\"""" + return close_abs(x.real, y.real) and close_abs(x.imag, y.imag) + +def check_div(x, y): + """Compute complex z=x*y, and check that z/x==y and z/y==x.""" + z = x * y + if x != 0: + q = z / x + assert close(q, y) + q = z.__div__(x) + assert close(q, y) + q = z.__truediv__(x) + assert close(q, y) + if y != 0: + q = z / y + assert close(q, x) + q = z.__div__(y) + assert close(q, x) + q = z.__truediv__(y) + assert close(q, x) + +def test_div(): + # XXX this test passed but took waaaaay to long + # look at dist/lib-python/modified-2.5.2/test/test_complex.py + #simple_real = [float(i) for i in xrange(-5, 6)] + simple_real = [-2.0, 0.0, 1.0] + simple_complex = [complex(x, y) for x in simple_real for y in simple_real] + for x in simple_complex: + for y in simple_complex: + check_div(x, y) + + # A naive complex division algorithm (such as in 2.0) is very prone to + # nonsense errors for these (overflows and underflows). + check_div(complex(1e200, 1e200), 1+0j) + check_div(complex(1e-200, 1e-200), 1+0j) + + # Just for fun. + for i in xrange(100): + check_div(complex(random(), random()), + complex(random(), random())) + + raises(ZeroDivisionError, complex.__div__, 1+1j, 0+0j) + # FIXME: The following currently crashes on Alpha + raises(OverflowError, pow, 1e200+1j, 1e200+1j) + +def test_truediv(): + assert almost_equal(complex.__truediv__(2+0j, 1+1j), 1-1j) + raises(ZeroDivisionError, complex.__truediv__, 1+1j, 0+0j) + +def test_floordiv(): + assert almost_equal(complex.__floordiv__(3+0j, 1.5+0j), 2) + raises(ZeroDivisionError, complex.__floordiv__, 3+0j, 0+0j) + +def test_coerce(): + raises(OverflowError, complex.__coerce__, 1+1j, 1L<<10000) + +def test_convert(): + exc = raises(TypeError, complex.__int__, 3j) + assert str(exc.value) == "can't convert complex to int" + exc = raises(TypeError, complex.__float__, 3j) + assert str(exc.value) == "can't convert complex to float" + +def test_richcompare(): + assert complex.__lt__(1+1j, None) is NotImplemented + assert complex.__eq__(1+1j, 2+2j) is False + assert complex.__eq__(1+1j, 1+1j) is True + assert complex.__ne__(1+1j, 1+1j) is False + assert complex.__ne__(1+1j, 2+2j) is True + raises(TypeError, complex.__lt__, 1+1j, 2+2j) + raises(TypeError, complex.__le__, 1+1j, 2+2j) + raises(TypeError, complex.__gt__, 1+1j, 2+2j) + raises(TypeError, complex.__ge__, 1+1j, 2+2j) + large = 1 << 10000 + assert not (5+0j) == large + assert not large == (5+0j) + assert (5+0j) != large + assert large != (5+0j) + +def test_richcompare_numbers(): + for n in 8, 8L, 0.01: + assert complex.__eq__(n+0j, n) + assert not complex.__ne__(n+0j, n) + assert not complex.__eq__(complex(n, n), n) + assert complex.__ne__(complex(n, n), n) + raises(TypeError, complex.__lt__, n+0j, n) + +def test_richcompare_boundaries(): + z = 9007199254740992+0j + i = 9007199254740993 + assert not complex.__eq__(z, i) + assert not complex.__eq__(z, long(i)) + assert complex.__ne__(z, i) + assert complex.__ne__(z, long(i)) + +def test_mod(): + raises(ZeroDivisionError, (1+1j).__mod__, 0+0j) + + a = 3.33+4.43j + raises(ZeroDivisionError, "a % 0") + +def test_divmod(): + raises(ZeroDivisionError, divmod, 1+1j, 0+0j) + +def test_pow(): + assert almost_equal(pow(1+1j, 0+0j), 1.0) + assert almost_equal(pow(0+0j, 2+0j), 0.0) + raises(ZeroDivisionError, pow, 0+0j, 1j) + assert almost_equal(pow(1j, -1), 1/1j) + assert almost_equal(pow(1j, 200), 1) + raises(ValueError, pow, 1+1j, 1+1j, 1+1j) + + a = 3.33+4.43j + assert a ** 0j == 1 + assert a ** 0.+0.j == 1 + + assert 3j ** 0j == 1 + assert 3j ** 0 == 1 + + raises(ZeroDivisionError, "0j ** a") + raises(ZeroDivisionError, "0j ** (3-2j)") + + # The following is used to exercise certain code paths + assert a ** 105 == a ** 105 + assert a ** -105 == a ** -105 + assert a ** -30 == a ** -30 + assert a ** 2 == a * a + + assert 0.0j ** 0 == 1 + + b = 5.1+2.3j + raises(ValueError, pow, a, b, 0) + + b = complex(float('inf'), 0.0) ** complex(10., 3.) + assert repr(b) == "(nan+nanj)" + +def test_boolcontext(): + for i in xrange(100): + assert complex(random() + 1e-6, random() + 1e-6) + assert not complex(0.0, 0.0) + +def test_conjugate(): + assert close(complex(5.3, 9.8).conjugate(), 5.3-9.8j) + +def test_constructor(): + class OS: + def __init__(self, value): + self.value = value + def __complex__(self): + return self.value + class NS(object): + def __init__(self, value): + self.value = value + def __complex__(self): + return self.value + assert complex(OS(1+10j)) == 1+10j + assert complex(NS(1+10j)) == 1+10j + assert complex(OS(1+10j), 5) == 1+15j + assert complex(NS(1+10j), 5) == 1+15j + assert complex(OS(1+10j), 5j) == -4+10j + assert complex(NS(1+10j), 5j) == -4+10j + + raises(TypeError, complex, OS(None)) + raises(TypeError, complex, NS(None)) + + # -- The following cases are not supported by CPython, but they + # -- are supported by PyPy, which is most probably ok + #raises((TypeError, AttributeError), complex, OS(1+10j), OS(1+10j)) + #raises((TypeError, AttributeError), complex, NS(1+10j), OS(1+10j)) + #raises((TypeError, AttributeError), complex, OS(1+10j), NS(1+10j)) + #raises((TypeError, AttributeError), complex, NS(1+10j), NS(1+10j)) + + class F(object): + def __float__(self): + return 2.0 + assert complex(OS(1+10j), F()) == 1+12j + assert complex(NS(1+10j), F()) == 1+12j + + assert almost_equal(complex("1+10j"), 1+10j) + assert almost_equal(complex(10), 10+0j) + assert almost_equal(complex(10.0), 10+0j) + assert almost_equal(complex(10L), 10+0j) + assert almost_equal(complex(10+0j), 10+0j) + assert almost_equal(complex(1,10), 1+10j) + assert almost_equal(complex(1,10L), 1+10j) + assert almost_equal(complex(1,10.0), 1+10j) + assert almost_equal(complex(1L,10), 1+10j) + assert almost_equal(complex(1L,10L), 1+10j) + assert almost_equal(complex(1L,10.0), 1+10j) + assert almost_equal(complex(1.0,10), 1+10j) + assert almost_equal(complex(1.0,10L), 1+10j) + assert almost_equal(complex(1.0,10.0), 1+10j) + assert almost_equal(complex(3.14+0j), 3.14+0j) + assert almost_equal(complex(3.14), 3.14+0j) + assert almost_equal(complex(314), 314.0+0j) + assert almost_equal(complex(314L), 314.0+0j) + assert almost_equal(complex(3.14+0j, 0j), 3.14+0j) + assert almost_equal(complex(3.14, 0.0), 3.14+0j) + assert almost_equal(complex(314, 0), 314.0+0j) + assert almost_equal(complex(314L, 0L), 314.0+0j) + assert almost_equal(complex(0j, 3.14j), -3.14+0j) + assert almost_equal(complex(0.0, 3.14j), -3.14+0j) + assert almost_equal(complex(0j, 3.14), 3.14j) + assert almost_equal(complex(0.0, 3.14), 3.14j) + assert almost_equal(complex("1"), 1+0j) + assert almost_equal(complex("1j"), 1j) + assert almost_equal(complex(), 0) + assert almost_equal(complex("-1"), -1) + assert almost_equal(complex("+1"), +1) + assert almost_equal(complex(" ( +3.14-6J ) "), 3.14-6j) + exc = raises(ValueError, complex, " ( +3.14- 6J ) ") + assert str(exc.value) == "complex() arg is a malformed string" + + class complex2(complex): + pass + assert almost_equal(complex(complex2(1+1j)), 1+1j) + assert almost_equal(complex(real=17, imag=23), 17+23j) + assert almost_equal(complex(real=17+23j), 17+23j) + assert almost_equal(complex(real=17+23j, imag=23), 17+46j) + assert almost_equal(complex(real=1+2j, imag=3+4j), -3+5j) + + c = 3.14 + 1j + assert complex(c) is c + del c + + raises(TypeError, complex, "1", "1") + raises(TypeError, complex, 1, "1") + + assert complex(" 3.14+J ") == 3.14+1j + #h.assertEqual(complex(unicode(" 3.14+J ")), 3.14+1j) + + # SF bug 543840: complex(string) accepts strings with \0 + # Fixed in 2.3. + raises(ValueError, complex, '1+1j\0j') + + raises(TypeError, int, 5+3j) + raises(TypeError, long, 5+3j) + raises(TypeError, float, 5+3j) + raises(ValueError, complex, "") + raises(TypeError, complex, None) + raises(ValueError, complex, "\0") + raises(TypeError, complex, "1", "2") + raises(TypeError, complex, "1", 42) + raises(TypeError, complex, 1, "2") + raises(ValueError, complex, "1+") + raises(ValueError, complex, "1+1j+1j") + raises(ValueError, complex, "--") +# if x_test_support.have_unicode: +# raises(ValueError, complex, unicode("1"*500)) +# raises(ValueError, complex, unicode("x")) +# + class EvilExc(Exception): + pass + + class evilcomplex: + def __complex__(self): + raise EvilExc + + raises(EvilExc, complex, evilcomplex()) + + class float2: + def __init__(self, value): + self.value = value + def __float__(self): + return self.value + + assert almost_equal(complex(float2(42.)), 42) + assert almost_equal(complex(real=float2(17.), imag=float2(23.)), 17+23j) + raises(TypeError, complex, float2(None)) + + +def test_constructor_bad_error_message(): + err = raises(TypeError, complex, {}).value + assert "float" not in str(err) + assert str(err) == "complex() first argument must be a string or a number, not 'dict'" + err = raises(TypeError, complex, 1, {}).value + assert "float" not in str(err) + assert str(err) == "complex() second argument must be a number, not 'dict'" + +def test_error_messages(): + err = raises(ZeroDivisionError, "1+1j / 0").value + assert str(err) == "complex division by zero" + err = raises(ZeroDivisionError, "1+1j // 0").value + assert str(err) == "complex division by zero" + +def test___complex___returning_non_complex(): + + class Obj(object): + def __init__(self, value): + self.value = value + def __complex__(self): + return self.value + + # "bug-to-bug" compatibility to CPython: complex() is more relaxed in + # what __complex__ can return. cmath functions really wants a complex + # number to be returned by __complex__. + assert complex(Obj(2.0)) == 2+0j + assert complex(Obj(2)) == 2+0j + assert complex(Obj(2L)) == 2+0j + # + assert cmath.polar(1) == (1.0, 0.0) + raises(TypeError, "cmath.polar(Obj(1))") + +def test_hash(): + for x in xrange(-30, 30): + assert hash(x) == hash(complex(x, 0)) + x /= 3.0 # now check against floating point + assert hash(x) == hash(complex(x, 0.)) + +def test_abs(): + nums = [complex(x/3., y/7.) for x in xrange(-9,9) for y in xrange(-9,9)] + for num in nums: + assert almost_equal((num.real**2 + num.imag**2) ** 0.5, abs(num)) + +def test_complex_subclass_ctr(): + import sys + class j(complex): + pass + assert j(100 + 0j) == 100 + 0j + assert isinstance(j(100), j) + assert j(100L + 0j) == 100 + 0j + assert j("100+0j") == 100 + 0j + exc = raises(ValueError, j, "100 + 0j") + assert str(exc.value) == "complex() arg is a malformed string" + x = j(1+0j) + x.foo = 42 + assert x.foo == 42 + assert type(complex(x)) == complex + +def test_infinity(): + inf = 1e200*1e200 + assert complex("1"*500) == complex(inf) + assert complex("-inf") == complex(-inf) + +def test_repr(): + assert repr(1+6j) == '(1+6j)' + assert repr(1-6j) == '(1-6j)' + + assert repr(-(1+0j)) == '(-1-0j)' + assert repr(complex( 0.0, 0.0)) == '0j' + assert repr(complex( 0.0, -0.0)) == '-0j' + assert repr(complex(-0.0, 0.0)) == '(-0+0j)' + assert repr(complex(-0.0, -0.0)) == '(-0-0j)' + assert repr(complex(1e45)) == "(" + repr(1e45) + "+0j)" + assert repr(complex(1e200*1e200)) == '(inf+0j)' + assert repr(complex(1,-float("nan"))) == '(1+nanj)' + +def test_neg(): + assert -(1+6j) == -1-6j + +def test_file(): + import os + import tempfile + + a = 3.33+4.43j + b = 5.1+2.3j + + fo = None + try: + pth = tempfile.mktemp() + fo = open(pth,"wb") + print >>fo, a, b + fo.close() + fo = open(pth, "rb") + res = fo.read() + assert res == "%s %s\n" % (a, b) + finally: + if (fo is not None) and (not fo.closed): + fo.close() + try: + os.remove(pth) + except (OSError, IOError): + pass + +def test_convert(): + raises(TypeError, int, 1+1j) + raises(TypeError, float, 1+1j) + + class complex0(complex): + """Test usage of __complex__() when inheriting from 'complex'""" + def __complex__(self): + return 42j + assert complex(complex0(1j)) == 42j + + class complex1(complex): + """Test usage of __complex__() with a __new__() method""" + def __new__(self, value=0j): + return complex.__new__(self, 2*value) + def __complex__(self): + return self + assert complex(complex1(1j)) == 2j + + class complex2(complex): + """Make sure that __complex__() calls fail if anything other than a + complex is returned""" + def __complex__(self): + return None + raises(TypeError, complex, complex2(1j)) + +def test_getnewargs(): + assert (1+2j).__getnewargs__() == (1.0, 2.0) + +def test_method_not_found_on_newstyle_instance(): + class A(object): + pass + a = A() + a.__complex__ = lambda: 5j # ignored + raises(TypeError, complex, a) + A.__complex__ = lambda self: 42j + assert complex(a) == 42j + +def test_format(): + # empty format string is same as str() + assert format(1+3j, '') == str(1+3j) + assert format(1.5+3.5j, '') == str(1.5+3.5j) + assert format(3j, '') == str(3j) + assert format(3.2j, '') == str(3.2j) + assert format(3+0j, '') == str(3+0j) + assert format(3.2+0j, '') == str(3.2+0j) + + # empty presentation type should still be analogous to str, + # even when format string is nonempty (issue #5920). + + assert format(3.2, '-') == str(3.2) + assert format(3.2+0j, '-') == str(3.2+0j) + assert format(3.2+0j, '<') == str(3.2+0j) + z = 10/7. - 100j/7. + assert format(z, '') == str(z) + assert format(z, '-') == str(z) + assert format(z, '<') == str(z) + assert format(z, '10') == str(z) + z = complex(0.0, 3.0) + assert format(z, '') == str(z) + assert format(z, '-') == str(z) + assert format(z, '<') == str(z) + assert format(z, '2') == str(z) + z = complex(-0.0, 2.0) + assert format(z, '') == str(z) + assert format(z, '-') == str(z) + assert format(z, '<') == str(z) + assert format(z, '3') == str(z) + + assert format(1+3j, 'g') == '1+3j' + assert format(3j, 'g') == '0+3j' + assert format(1.5+3.5j, 'g') == '1.5+3.5j' + + assert format(1.5+3.5j, '+g') == '+1.5+3.5j' + assert format(1.5-3.5j, '+g') == '+1.5-3.5j' + assert format(1.5-3.5j, '-g') == '1.5-3.5j' + assert format(1.5+3.5j, ' g') == ' 1.5+3.5j' + assert format(1.5-3.5j, ' g') == ' 1.5-3.5j' + assert format(-1.5+3.5j, ' g') == '-1.5+3.5j' + assert format(-1.5-3.5j, ' g') == '-1.5-3.5j' + + assert format(-1.5-3.5e-20j, 'g') == '-1.5-3.5e-20j' + assert format(-1.5-3.5j, 'f') == '-1.500000-3.500000j' + assert format(-1.5-3.5j, 'F') == '-1.500000-3.500000j' + assert format(-1.5-3.5j, 'e') == '-1.500000e+00-3.500000e+00j' + assert format(-1.5-3.5j, '.2e') == '-1.50e+00-3.50e+00j' + assert format(-1.5-3.5j, '.2E') == '-1.50E+00-3.50E+00j' + assert format(-1.5e10-3.5e5j, '.2G') == '-1.5E+10-3.5E+05j' + + assert format(1.5+3j, '<20g') == '1.5+3j ' + assert format(1.5+3j, '*<20g') == '1.5+3j**************' + assert format(1.5+3j, '>20g') == ' 1.5+3j' + assert format(1.5+3j, '^20g') == ' 1.5+3j ' + assert format(1.5+3j, '<20') == '(1.5+3j) ' + assert format(1.5+3j, '>20') == ' (1.5+3j)' + assert format(1.5+3j, '^20') == ' (1.5+3j) ' + assert format(1.123-3.123j, '^20.2') == ' (1.1-3.1j) ' + + assert format(1.5+3j, '20.2f') == ' 1.50+3.00j' + assert format(1.5+3j, '>20.2f') == ' 1.50+3.00j' + assert format(1.5+3j, '<20.2f') == '1.50+3.00j ' + assert format(1.5e20+3j, '<20.2f') == '150000000000000000000.00+3.00j' + assert format(1.5e20+3j, '>40.2f') == ' 150000000000000000000.00+3.00j' + assert format(1.5e20+3j, '^40,.2f') == ' 150,000,000,000,000,000,000.00+3.00j ' + assert format(1.5e21+3j, '^40,.2f') == ' 1,500,000,000,000,000,000,000.00+3.00j ' + assert format(1.5e21+3000j, ',.2f') == '1,500,000,000,000,000,000,000.00+3,000.00j' + + # alternate is invalid + raises(ValueError, (1.5+0.5j).__format__, '#f') + + # zero padding is invalid + raises(ValueError, (1.5+0.5j).__format__, '010f') + + # '=' alignment is invalid + raises(ValueError, (1.5+3j).__format__, '=20') + + # integer presentation types are an error + for t in 'bcdoxX%': + raises(ValueError, (1.5+0.5j).__format__, t) + + # make sure everything works in ''.format() + assert '*{0:.3f}*'.format(3.14159+2.71828j) == '*3.142+2.718j*' + assert u'*{0:.3f}*'.format(3.14159+2.71828j) == u'*3.142+2.718j*' + assert u'{:-}'.format(1.5+3.5j) == u'(1.5+3.5j)' + + INF = float("inf") + NAN = float("nan") + # issue 3382: 'f' and 'F' with inf's and nan's + assert '{0:f}'.format(INF+0j) == 'inf+0.000000j' + assert '{0:F}'.format(INF+0j) == 'INF+0.000000j' + assert '{0:f}'.format(-INF+0j) == '-inf+0.000000j' + assert '{0:F}'.format(-INF+0j) == '-INF+0.000000j' + assert '{0:f}'.format(complex(INF, INF)) == 'inf+infj' + assert '{0:F}'.format(complex(INF, INF)) == 'INF+INFj' + assert '{0:f}'.format(complex(INF, -INF)) == 'inf-infj' + assert '{0:F}'.format(complex(INF, -INF)) == 'INF-INFj' + assert '{0:f}'.format(complex(-INF, INF)) == '-inf+infj' + assert '{0:F}'.format(complex(-INF, INF)) == '-INF+INFj' + assert '{0:f}'.format(complex(-INF, -INF)) == '-inf-infj' + assert '{0:F}'.format(complex(-INF, -INF)) == '-INF-INFj' + + assert '{0:f}'.format(complex(NAN, 0)) == 'nan+0.000000j' + assert '{0:F}'.format(complex(NAN, 0)) == 'NAN+0.000000j' + assert '{0:f}'.format(complex(NAN, NAN)) == 'nan+nanj' + assert '{0:F}'.format(complex(NAN, NAN)) == 'NAN+NANj' + +def test_complex_two_arguments(): + raises(TypeError, complex, 5, None) + +def test_hash_minus_one(): + assert hash(-1.0 + 0j) == -2 + assert (-1.0 + 0j).__hash__() == -2 diff -Nru pypy-7.1.1+dfsg/pypy/objspace/std/test/apptest_instmethobject.py pypy-7.3.1+dfsg/pypy/objspace/std/test/apptest_instmethobject.py --- pypy-7.1.1+dfsg/pypy/objspace/std/test/apptest_instmethobject.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/objspace/std/test/apptest_instmethobject.py 2020-04-10 19:28:41.000000000 +0000 @@ -0,0 +1,38 @@ + +# NB. instmethobject.py has been removed, +# but the following tests still make sense + +def test_callBound(): + boundMethod = [1,2,3].__len__ + assert boundMethod() == 3 + raises(TypeError, boundMethod, 333) + +def test_callUnbound(): + unboundMethod = list.__len__ + assert unboundMethod([1,2,3]) == 3 + raises(TypeError, unboundMethod) + raises(TypeError, unboundMethod, 333) + raises(TypeError, unboundMethod, [1,2,3], 333) + +def test_err_format(): + class C(object): + def m(self): pass + try: + C.m(1) + except TypeError as e: + assert str(e) == 'unbound method m() must be called with C instance as first argument (got int instance instead)' + +def test_getBound(): + def f(l,x): return l[x+1] + bound = f.__get__('abcdef') + assert bound(1) == 'c' + raises(TypeError, bound) + raises(TypeError, bound, 2, 3) + +def test_getUnbound(): + def f(l,x): return l[x+1] + unbound = f.__get__(None, str) + assert unbound('abcdef', 2) == 'd' + raises(TypeError, unbound) + raises(TypeError, unbound, 4) + raises(TypeError, unbound, 4, 5) diff -Nru pypy-7.1.1+dfsg/pypy/objspace/std/test/apptest_iterobject.py pypy-7.3.1+dfsg/pypy/objspace/std/test/apptest_iterobject.py --- pypy-7.1.1+dfsg/pypy/objspace/std/test/apptest_iterobject.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/objspace/std/test/apptest_iterobject.py 2020-04-10 19:28:41.000000000 +0000 @@ -0,0 +1,117 @@ +from _collections import deque +import gc + +def test_no_len_on_list_iter(): + iterable = [1,2,3,4] + raises(TypeError, len, iter(iterable)) + +def test_no_len_on_tuple_iter(): + iterable = (1,2,3,4) + raises(TypeError, len, iter(iterable)) + +def test_no_len_on_deque_iter(): + iterable = deque([1,2,3,4]) + raises(TypeError, len, iter(iterable)) + +def test_no_len_on_reversed(): + it = reversed("foobar") + raises(TypeError, len, it) + +def test_no_len_on_reversed_seqiter(): + # this one fails on CPython. See http://bugs.python.org/issue3689 + it = reversed([5,6,7]) + raises(TypeError, len, it) + +def test_no_len_on_UserList_iter_reversed(): + import sys, _abcoll + sys.modules['collections'] = _abcoll + from UserList import UserList + iterable = UserList([1,2,3,4]) + raises(TypeError, len, iter(iterable)) + raises(TypeError, len, reversed(iterable)) + del sys.modules['collections'] + +def test_reversed_frees_empty(): + for typ in list, unicode: + free = [False] + class U(typ): + def __del__(self): + free[0] = True + r = reversed(U()) + raises(StopIteration, next, r) + gc.collect(); gc.collect(); gc.collect() + assert free[0] + +def test_reversed_mutation(): + n = 10 + d = range(n) + it = reversed(d) + next(it) + next(it) + assert it.__length_hint__() == n-2 + d.append(n) + assert it.__length_hint__() == n-2 + d[1:] = [] + assert it.__length_hint__() == 0 + assert list(it) == [] + d.extend(xrange(20)) + assert it.__length_hint__() == 0 + +def test_no_len_on_set_iter(): + iterable = set([1,2,3,4]) + raises(TypeError, len, iter(iterable)) + +def test_no_len_on_xrange(): + iterable = xrange(10) + raises(TypeError, len, iter(iterable)) + +def test_contains(): + logger = [] + + class Foo(object): + + def __init__(self, value, name=None): + self.value = value + self.name = name or value + + def __repr__(self): + return '' % self.name + + def __eq__(self, other): + logger.append((self, other)) + return self.value == other.value + + foo1, foo2, foo3 = Foo(1), Foo(2), Foo(3) + foo42 = Foo(42) + foo_list = [foo1, foo2, foo3] + foo42 in (x for x in foo_list) + logger_copy = logger[:] # prevent re-evaluation during pytest error print + assert logger_copy == [(foo42, foo1), (foo42, foo2), (foo42, foo3)] + + del logger[:] + foo2_bis = Foo(2, '2 bis') + foo2_bis in (x for x in foo_list) + logger_copy = logger[:] # prevent re-evaluation during pytest error print + assert logger_copy == [(foo2_bis, foo1), (foo2_bis, foo2)] + +#from AppTestW_IterObjectApp +def test_user_iter(): + class C(object): + def next(self): + raise StopIteration + def __iter__(self): + return self + assert list(C()) == [] + +def test_iter_getitem(): + class C(object): + def __getitem__(self, i): + return range(2)[i] + assert list(C()) == range(2) + +def test_iter_fail_noseq(): + class C(object): + pass + raises(TypeError, + iter, + C()) diff -Nru pypy-7.1.1+dfsg/pypy/objspace/std/test/apptest_operation.py pypy-7.3.1+dfsg/pypy/objspace/std/test/apptest_operation.py --- pypy-7.1.1+dfsg/pypy/objspace/std/test/apptest_operation.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/objspace/std/test/apptest_operation.py 2020-04-10 19:28:41.000000000 +0000 @@ -0,0 +1,126 @@ +from pytest import raises + +def teq(a, b): + assert a == b + assert type(a) is type(b) + +def test_int_vs_long(): + # binary operators + teq( 5 - 2 , 3 ) + teq( 5 - 2L , 3L ) + teq( 5L - 2 , 3L ) + teq( 5L - 2L , 3L ) + + teq( 5 .__sub__(2 ), 3 ) + teq( 5 .__sub__(2L), NotImplemented ) + teq( 5L .__sub__(2 ), 3L ) + teq( 5L .__sub__(2L), 3L ) + + teq( 5 .__rsub__(2 ), -3 ) + teq( 5 .__rsub__(2L), NotImplemented ) + teq( 5L .__rsub__(2 ), -3L ) + teq( 5L .__rsub__(2L), -3L ) + + teq( 5 ** 2 , 25 ) + teq( 5 ** 2L , 25L ) + teq( 5L ** 2 , 25L ) + teq( 5L ** 2L , 25L ) + + # ternary operator + teq( pow( 5 , 3 , 100 ), 25 ) + teq( pow( 5 , 3 , 100L), 25L) + teq( pow( 5 , 3L, 100 ), 25L) + teq( pow( 5 , 3L, 100L), 25L) + teq( pow( 5L, 3 , 100 ), 25L) + teq( pow( 5L, 3 , 100L), 25L) + teq( pow( 5L, 3L, 100 ), 25L) + teq( pow( 5L, 3L, 100L), 25L) + + # two tests give a different result on PyPy and CPython. + # however, there is no sane way that PyPy can match CPython here, + # short of reintroducing three-way coercion... + teq( 5 .__pow__(3 , 100 ), 25 ) + #teq( 5 .__pow__(3 , 100L), 25L or NotImplemented? ) + teq( 5 .__pow__(3L, 100 ), NotImplemented ) + teq( 5 .__pow__(3L, 100L), NotImplemented ) + teq( 5L .__pow__(3 , 100 ), 25L) + teq( 5L .__pow__(3 , 100L), 25L) + teq( 5L .__pow__(3L, 100 ), 25L) + teq( 5L .__pow__(3L, 100L), 25L) + + teq( 5 .__rpow__(3 , 100 ), 43 ) + #teq( 5 .__rpow__(3 , 100L), 43L or NotImplemented? ) + teq( 5 .__rpow__(3L, 100 ), NotImplemented ) + teq( 5 .__rpow__(3L, 100L), NotImplemented ) + teq( 5L .__rpow__(3 , 100 ), 43L) + teq( 5L .__rpow__(3 , 100L), 43L) + teq( 5L .__rpow__(3L, 100 ), 43L) + teq( 5L .__rpow__(3L, 100L), 43L) + + +def test_int_vs_float(): + # binary operators + teq( 5 - 2 , 3 ) + teq( 5 - 2.0 , 3.0 ) + teq( 5.0 - 2 , 3.0 ) + teq( 5.0 - 2.0 , 3.0 ) + + teq( 5 .__sub__(2 ), 3 ) + teq( 5 .__sub__(2.0), NotImplemented ) + teq( 5.0 .__sub__(2 ), 3.0 ) + teq( 5.0 .__sub__(2.0), 3.0 ) + + teq( 5 .__rsub__(2 ), -3 ) + teq( 5 .__rsub__(2.0), NotImplemented ) + teq( 5.0 .__rsub__(2 ), -3.0 ) + teq( 5.0 .__rsub__(2.0), -3.0 ) + + teq( 5 ** 2 , 25 ) + teq( 5 ** 2.0 , 25.0 ) + teq( 5.0 ** 2 , 25.0 ) + teq( 5.0 ** 2.0 , 25.0 ) + + # pow() fails with a float argument anywhere + raises(TypeError, pow, 5 , 3 , 100.0) + raises(TypeError, pow, 5 , 3.0, 100 ) + raises(TypeError, pow, 5 , 3.0, 100.0) + raises(TypeError, pow, 5.0, 3 , 100 ) + raises(TypeError, pow, 5.0, 3 , 100.0) + raises(TypeError, pow, 5.0, 3.0, 100 ) + raises(TypeError, pow, 5.0, 3.0, 100.0) + + teq( 5 .__pow__(3.0, 100 ), NotImplemented ) + teq( 5 .__pow__(3.0, 100.0), NotImplemented ) + + teq( 5 .__rpow__(3.0, 100 ), NotImplemented ) + teq( 5 .__rpow__(3.0, 100.0), NotImplemented ) + + +def test_long_vs_float(): + # binary operators + teq( 5L - 2.0 , 3.0 ) + teq( 5.0 - 2L , 3.0 ) + + teq( 5L .__sub__(2.0), NotImplemented ) + teq( 5.0 .__sub__(2L ), 3.0 ) + + teq( 5L .__rsub__(2.0), NotImplemented ) + teq( 5.0 .__rsub__(2L ), -3.0 ) + + teq( 5L ** 2.0 , 25.0 ) + teq( 5.0 ** 2L , 25.0 ) + + # pow() fails with a float argument anywhere + raises(TypeError, pow, 5L , 3L , 100.0) + raises(TypeError, pow, 5L , 3.0, 100 ) + raises(TypeError, pow, 5L , 3.0, 100.0) + raises(TypeError, pow, 5.0, 3L , 100 ) + raises(TypeError, pow, 5.0, 3L , 100.0) + raises(TypeError, pow, 5.0, 3.0, 100 ) + raises(TypeError, pow, 5.0, 3.0, 100.0) + + teq( 5L .__pow__(3.0, 100L ), NotImplemented ) + teq( 5L .__pow__(3.0, 100.0), NotImplemented ) + + teq( 5L .__rpow__(3.0, 100L ), NotImplemented ) + teq( 5L .__rpow__(3.0, 100.0), NotImplemented ) diff -Nru pypy-7.1.1+dfsg/pypy/objspace/std/test/apptest_stringformat.py pypy-7.3.1+dfsg/pypy/objspace/std/test/apptest_stringformat.py --- pypy-7.1.1+dfsg/pypy/objspace/std/test/apptest_stringformat.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/objspace/std/test/apptest_stringformat.py 2020-04-10 19:28:41.000000000 +0000 @@ -0,0 +1,413 @@ +# coding: utf-8 +import sys + +def test_format_item_dict(): + d = {'i': 23} + assert 'a23b' == 'a%(i)sb' % d + assert '23b' == '%(i)sb' % d + assert 'a23' == 'a%(i)s' % d + assert '23' == '%(i)s' % d + +def test_format_two_items(): + d = {'i': 23, 'j': 42} + assert 'a23b42c' == 'a%(i)sb%(j)sc' % d + assert 'a23b23c' == 'a%(i)sb%(i)sc' % d + +def test_format_percent_dict(): + d = {} + assert 'a%b' == 'a%%b' % d + +def test_format_empty_key(): + d = {'':42} + assert '42' == '%()s' % d + +def test_format_wrong_char_dict(): + d = {'i': 23} + raises(ValueError, 'a%(i)Zb'.__mod__, d) + +def test_format_missing(): + d = {'i': 23} + raises(KeyError, 'a%(x)sb'.__mod__, d) + +def test_format_error(): + d = {} + assert '' % d == '' + n = 5 + raises(TypeError, "'' % n") + + class MyMapping(object): + def __getitem__(self, key): + py.test.fail('should not be here') + assert '' % MyMapping() == '' + + class MyMapping2(object): + def __getitem__(self, key): + return key + assert '%(key)s'%MyMapping2() == 'key' + assert u'%(key)s'%MyMapping2() == u'key' + + +def test_format_item_string(): + n = 23 + assert 'a23b' == 'a%sb' % n + assert '23b' == '%sb' % n + assert 'a23' == 'a%s' % n + assert '23' == '%s' % n + +def test_format_percent_tuple(): + t = () + assert 'a%b' == 'a%%b' % t + assert '%b' == '%%b' % t + assert 'a%' == 'a%%' % t + assert '%' == '%%' % t + +def test_format_too_much(): + raises(TypeError, '%s%s'.__mod__, ()) + raises(TypeError, '%s%s'.__mod__, (23,)) + +def test_format_not_enough(): + raises(TypeError, '%s%s'.__mod__, (23,)*3) + raises(TypeError, '%s%s'.__mod__, (23,)*4) + +def test_format_string(): + s = '23' + assert '23' == '%s' % s + assert "'23'" == '%r' % s + raises(TypeError, '%d'.__mod__, s) + +def test_format_float(): + f = 23.456 + assert '23' == '%d' % f + assert '17' == '%x' % f + assert '23.456' == '%s' % f + # for 'r' use a float that has an exact decimal rep: + g = 23.125 + assert '23.125' == '%r' % g + h = 0.0276 + assert '0.028' == '%.3f' % h # should work on most platforms... + big = 1E200 + assert ' inf' == '%6g' % (big * big) + + assert '0.' == '%#.0f' % 0.0 + +def test_format_int(): + n = 23 + z = 0 + assert '23' == '%d' % n + assert '17' == '%x' % n + assert '0x17' == '%#x' % n + assert '0x0' == '%#x' % z + assert '23' == '%s' % n + assert '23' == '%r' % n + assert ('%d' % (-sys.maxint-1,) == '-' + str(sys.maxint+1) + == '-%d' % (sys.maxint+1,)) + n = 28 + m = 8 + assert '1C' == '%X' % n + assert '0X1C' == '%#X' % n + assert '10' == '%o' % m + assert '010' == '%#o' % m + assert '-010' == '%#o' % -m + assert '0' == '%o' % z + assert '0' == '%#o' % z + + n = 23 + f = 5 + assert '-0x017' == '%#06x' % -n + assert '' == '%.0o' % z + assert '0' == '%#.0o' % z + assert '5' == '%.0o' % f + assert '05' == '%#.0o' % f + assert '000' == '%.3o' % z + assert '000' == '%#.3o' % z + assert '005' == '%.3o' % f + assert '005' == '%#.3o' % f + assert '27' == '%.2o' % n + assert '027' == '%#.2o' % n + +def test_format_long(): + l = 4800000000L + assert '%d' % l == '4800000000' + + class SubLong(long): + pass + sl = SubLong(l) + assert '%d' % sl == '4800000000' + +def test_format_subclass_with_str(): + class SubInt2(int): + def __str__(self): + assert False, "not called" + def __hex__(self): + assert False, "not called" + def __oct__(self): + assert False, "not called" + def __int__(self): + assert False, "not called" + def __long__(self): + assert False, "not called" + sl = SubInt2(123) + assert '%i' % sl == '123' + assert '%u' % sl == '123' + assert '%d' % sl == '123' + assert '%x' % sl == '7b' + assert '%X' % sl == '7B' + assert '%o' % sl == '173' + + skip("the rest of this test is serious nonsense imho, changed " + "only on 2.7.13, and is different on 3.x anyway. We could " + "reproduce it by writing lengthy logic, then get again the " + "reasonable performance by special-casing the exact type " + "'long'. And all for 2.7.13 only. Let's give up.") + + class SubLong2(long): + def __str__(self): + return extra_stuff + 'Xx' + def __hex__(self): + return extra_stuff + '0xYy' + extra_tail + def __oct__(self): + return extra_stuff + '0Zz' + extra_tail + def __int__(self): + assert False, "not called" + def __long__(self): + assert False, "not called" + sl = SubLong2(123) + for extra_stuff in ['', '-']: + for extra_tail in ['', 'l', 'L']: + m = extra_stuff + x = '%i' % sl + assert x == m+'Xx' + assert '%u' % sl == m+'Xx' + assert '%d' % sl == m+'Xx' + assert '%x' % sl == m+('Yyl' if extra_tail == 'l' else 'Yy') + assert '%X' % sl == m+('YYL' if extra_tail == 'l' else 'YY') + assert '%o' % sl == m+('Zzl' if extra_tail == 'l' else 'Zz') + extra_stuff = '??' + raises(ValueError, "'%x' % sl") + raises(ValueError, "'%X' % sl") + raises(ValueError, "'%o' % sl") + +def test_format_list(): + l = [1,2] + assert '<[1, 2]>' == '<%s>' % l + assert '<[1, 2]-[3, 4]>' == '<%s-%s>' % (l, [3,4]) + +def test_format_tuple(): + t = (1,2) + assert '<(1, 2)>' == '<%s>' % (t,) + assert '<(1, 2)-(3, 4)>' == '<%s-%s>' % (t, (3,4)) + +def test_format_dict(): + # I'll just note that the first of these two completely + # contradicts what CPython's documentation says: + + # When the right argument is a dictionary (or other + # mapping type), then the formats in the string + # \emph{must} include a parenthesised mapping key into + # that dictionary inserted immediately after the + # \character{\%} character. + + # It is what CPython *does*, however. All software sucks. + + d = {1:2} + assert '<{1: 2}>' == '<%s>' % d + assert '<{1: 2}-{3: 4}>' == '<%s-%s>' % (d, {3:4}) + +def test_format_wrong_char(): + raises(ValueError, 'a%Zb'.__mod__, ((23,),)) + raises(ValueError, u'a%\ud800b'.__mod__, ((23,),)) + +def test_incomplete_format(): + raises(ValueError, '%'.__mod__, ((23,),)) + raises((ValueError, TypeError), '%('.__mod__, ({},)) + +def test_format_char(): + A = 65 + e = 'e' + assert '%c' % A == 'A' + assert '%c' % e == 'e' + raises(OverflowError, '%c'.__mod__, (256,)) + raises(OverflowError, '%c'.__mod__, (-1,)) + raises(OverflowError, u'%c'.__mod__, (sys.maxunicode+1,)) + raises(TypeError, '%c'.__mod__, ("bla",)) + raises(TypeError, '%c'.__mod__, ("",)) + raises(TypeError, '%c'.__mod__, (['c'],)) + surrogate = 0xd800 + assert u'%c' % surrogate == u'\ud800' + +def test_broken_unicode(): + raises(UnicodeDecodeError, 'Názov: %s'.__mod__, u'Jerry') + +def test___int__(): + class MyInt(object): + def __init__(self, x): + self.x = x + def __int__(self): + return self.x + x = MyInt(65) + assert '%c' % x == 'A' + +def test_format_retry_with_long_if_int_fails(): + class IntFails(object): + def __int__(self): + raise Exception + def __long__(self): + return 0L + + x = "%x" % IntFails() + assert x == '0' + +def test_formatting_huge_precision(): + prec = 2**31 + format_string = "%.{}f".format(prec) + exc = raises(ValueError, "format_string % 2.34") + assert str(exc.value) == 'prec too big' + raises(OverflowError, lambda: u'%.*f' % (prec, 1. / 7)) + +def test_formatting_huge_width(): + format_string = "%{}f".format(sys.maxsize + 1) + exc = raises(ValueError, "format_string % 2.34") + assert str(exc.value) == 'width too big' + +def test_wrong_formatchar_error_not_masked_by_not_enough_args(): + with raises(ValueError): + "%?" % () # not TypeError (which would be due to lack of arguments) + with raises(ValueError): + "%?" % {} # not TypeError + +def test_width(): + a = 'a' + assert "%3s" % a == ' a' + assert "%-3s"% a == 'a ' + +def test_prec_cornercase(): + z = 0 + assert "%.0x" % z == '' + assert "%.x" % z == '' + assert "%.0d" % z == '' + assert "%.i" % z == '' + assert "%.0o" % z == '' + assert "%.o" % z == '' + +def test_prec_string(): + a = 'a' + abcde = 'abcde' + assert "%.3s"% a == 'a' + assert "%.3s"% abcde == 'abc' + +def test_prec_width_string(): + a = 'a' + abcde = 'abcde' + assert "%5.3s" % a == ' a' + assert "%5.3s" % abcde == ' abc' + assert "%-5.3s"% a == 'a ' + assert "%-5.3s"% abcde == 'abc ' + +def test_zero_pad(): + one = 1 + ttf = 2.25 + assert "%02d" % one == "01" + assert "%05d" % one == "00001" + assert "%-05d" % one == "1 " + assert "%04f" % ttf == "2.250000" + assert "%05g" % ttf == "02.25" + assert "%-05g" % ttf =="2.25 " + assert "%05s" % ttf == " 2.25" + +def test_star_width(): + f = 5 + assert "%*s" %( f, 'abc') == ' abc' + assert "%*s" %(-f, 'abc') == 'abc ' + assert "%-*s"%( f, 'abc') == 'abc ' + assert "%-*s"%(-f, 'abc') == 'abc ' + +def test_star_prec(): + t = 3 + assert "%.*s"%( t, 'abc') == 'abc' + assert "%.*s"%( t, 'abcde') == 'abc' + assert "%.*s"%(-t, 'abc') == '' + +def test_star_width_prec(): + f = 5 + assert "%*.*s"%( f, 3, 'abc') == ' abc' + assert "%*.*s"%( f, 3, 'abcde') == ' abc' + assert "%*.*s"%(-f, 3, 'abcde') == 'abc ' + +def test_long_format(): + def f(fmt, x): + return fmt % x + assert '%.70f' % 2.0 == '2.' + '0' * 70 + assert '%.110g' % 2.0 == '2' + +def test_subnormal(): + inf = 1e300 * 1e300 + assert "%f" % (inf,) == 'inf' + assert "%E" % (inf,) == 'INF' + assert "%f" % (-inf,) == '-inf' + assert "%F" % (-inf,) == '-INF' + nan = inf / inf + assert "%f" % (nan,) == 'nan' + assert "%f" % (-nan,) == 'nan' + assert "%E" % (nan,) == 'NAN' + assert "%F" % (nan,) == 'NAN' + assert "%G" % (nan,) == 'NAN' + +def test_unicode_convert(): + u = u"x" + assert isinstance("%s" % u, unicode) + +def test_unicode_nonascii(): + """ + Interpolating a unicode string with non-ascii characters in it into + a string format should decode the format string as ascii and return + unicode. + """ + u = u'\x80' + result = "%s" % u + assert isinstance(result, unicode) + assert result == u + +def test_unicode_d(): + t = 3 + assert u"%.1d" % t == '3' + +def test_unicode_overflow(): + skip("nicely passes on top of CPython but requires > 2GB of RAM") + raises((OverflowError, MemoryError), 'u"%.*d" % (sys.maxint, 1)') + +def test_unicode_format_a(): + ten = 10L + assert u'%x' % ten == 'a' + +def test_long_no_overflow(): + big = 0x1234567890987654321 + assert "%x" % big == "1234567890987654321" + +def test_missing_cases(): + big = -123456789012345678901234567890 + assert '%032d' % big == '-0123456789012345678901234567890' + +def test_invalid_char(): + f = 4 + raises(ValueError, 'u"%\u1234" % (f,)') + +def test_formatting_huge_precision_u(): + prec = 2**31 + format_string = u"%.{}f".format(prec) + exc = raises(ValueError, "format_string % 2.34") + assert str(exc.value) == 'prec too big' + raises(OverflowError, lambda: u'%.*f' % (prec, 1. / 7)) + +def test_formatting_huge_width_u(): + format_string = u"%{}f".format(sys.maxsize + 1) + exc = raises(ValueError, "format_string % 2.34") + assert str(exc.value) == 'width too big' + +def test_unicode_error_position(): + with raises(ValueError) as info: + u"\xe4\xe4\xe4%?" % {} + assert str(info.value) == "unsupported format character u'?' (0x3f) at index 4" + with raises(ValueError) as info: + u"\xe4\xe4\xe4%\xe4" % {} + assert str(info.value) == "unsupported format character u'\\xe4' (0xe4) at index 4" + diff -Nru pypy-7.1.1+dfsg/pypy/objspace/std/test/apptest_userobject.py pypy-7.3.1+dfsg/pypy/objspace/std/test/apptest_userobject.py --- pypy-7.1.1+dfsg/pypy/objspace/std/test/apptest_userobject.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/objspace/std/test/apptest_userobject.py 2020-04-10 19:28:41.000000000 +0000 @@ -0,0 +1,223 @@ +def test_emptyclass(): + class empty(object): pass + inst = empty() + assert isinstance(inst, empty) + inst.attr = 23 + assert inst.attr == 23 + +def test_method(): + class A(object): + def f(self, v): + return v*42 + a = A() + assert a.f('?') == '??????????????????????????????????????????' + +def test_unboundmethod(): + class A(object): + def f(self, v): + return v*17 + a = A() + assert A.f(a, '!') == '!!!!!!!!!!!!!!!!!' + +def test_subclassing(): + for base in tuple, list, dict, str, int, float: + class subclass(base): pass + stuff = subclass() + assert isinstance(stuff, base) + assert subclass.__base__ is base + +def test_subclasstuple(): + class subclass(tuple): pass + stuff = subclass() + assert isinstance(stuff, tuple) + stuff.attr = 23 + assert stuff.attr ==23 + assert len(stuff) ==0 + result = stuff + (1,2,3) + assert len(result) ==3 + +def test_subsubclass(): + class base(object): + baseattr = 12 + class derived(base): + derivedattr = 34 + inst = derived() + assert isinstance(inst, base) + assert inst.baseattr ==12 + assert inst.derivedattr ==34 + +def test_descr_get(): + class C(object): + class desc(object): + def __get__(self, ob, cls=None): + return 42 + prop = desc() + assert C().prop == 42 + +def test_descr_set(): + class C(object): + class desc(object): + def __set__(self, ob, val): + ob.wibble = val + prop = desc() + c = C() + c.prop = 32 + assert c.wibble == 32 + +def test_descr_delete(): + class C(object): + class desc(object): + def __set__(self, ob, val): + oogabooga + def __delete__(self, ob): + ob.wibble = 22 + prop = desc() + c = C() + del c.prop + assert c.wibble == 22 + +def test_class_setattr(): + class C(object): + pass + C.a = 1 + assert hasattr(C, 'a') + assert C.a == 1 + +def test_add(): + class C(object): + def __add__(self, other): + return self, other + c1 = C() + assert c1+3 == (c1, 3) + +def test_call(): + class C(object): + def __call__(self, *args): + return args + c1 = C() + assert c1() == () + assert c1(5) == (5,) + assert c1("hello", "world") == ("hello", "world") + +def test_getattribute(): + class C(object): + def __getattribute__(self, name): + return '->' + name + c1 = C() + assert c1.a == '->a' + c1.a = 5 + assert c1.a == '->a' + +def test_getattr(): + class C(object): + def __getattr__(self, name): + return '->' + name + c1 = C() + assert c1.a == '->a' + c1.a = 5 + assert c1.a == 5 + +def test_dict(): + class A(object): + pass + class B(A): + pass + assert not '__dict__' in object.__dict__ + assert '__dict__' in A.__dict__ + assert not '__dict__' in B.__dict__ + a = A() + a.x = 5 + assert a.__dict__ == {'x': 5} + a.__dict__ = {'y': 6} + assert a.y == 6 + assert not hasattr(a, 'x') + +def test_del(): + import gc + lst = [] + class A(object): + def __del__(self): + lst.append(42) + A() + gc.collect() + assert lst == [42] + +def test_del_exception(): + import sys, StringIO, gc + class A(object): + def __del__(self): + yaddadlaouti + prev = sys.stderr + try: + sys.stderr = StringIO.StringIO() + A() + gc.collect() + res = sys.stderr.getvalue() + A() + gc.collect() + res2 = sys.stderr.getvalue() + finally: + sys.stderr = prev + assert res.startswith('Exception') + assert 'NameError' in res + assert 'yaddadlaouti' in res + assert 'ignored' in res + assert res.count('\n') == 1 # a single line + assert res2.count('\n') == 2 # two lines + line2 = res2.split('\n')[1] + assert line2.startswith('Exception') + assert 'NameError' in line2 + assert 'yaddadlaouti' in line2 + assert 'ignored' in line2 + +def test_instance_overrides_meth(): + class C(object): + def m(self): + return "class" + assert C().m() == 'class' + c = C() + c.m = lambda: "instance" + res = c.m() + assert res == "instance" + +def test_override_builtin_methods(): + class myint(int): + def __add__(self, other): + return 'add' + def __rsub__(self, other): + return 'rsub' + assert myint(3) + 5 == 'add' + assert 5 + myint(3) == 8 + assert myint(3) - 5 == -2 + assert 5 - myint(3) == 'rsub' + +def test_repr(): + class Foo(object): + pass + Foo.__module__ = 'a.b.c' + s = repr(Foo()) + assert s.startswith(' buffer('ab')) - assert buffer('ab') >= buffer('ab') - assert buffer('ab') != buffer('abc') - assert buffer('ab') < buffer('abc') - assert buffer('ab') <= buffer('ab') - assert buffer('ab') > buffer('aa') - assert buffer('ab') >= buffer('ab') - - def test_hash(self): - assert hash(buffer('hello')) == hash('hello') - - def test_mul(self): - assert buffer('ab') * 5 == 'ababababab' - assert buffer('ab') * (-2) == '' - assert 5 * buffer('ab') == 'ababababab' - assert (-2) * buffer('ab') == '' - - def test_offset_size(self): - b = buffer('hello world', 6) - assert len(b) == 5 - assert b[0] == 'w' - assert b[:] == 'world' - raises(IndexError, 'b[5]') - b = buffer(b, 2) - assert len(b) == 3 - assert b[0] == 'r' - assert b[:] == 'rld' - raises(IndexError, 'b[3]') - b = buffer('hello world', 1, 8) - assert len(b) == 8 - assert b[0] == 'e' - assert b[:] == 'ello wor' - raises(IndexError, 'b[8]') - b = buffer(b, 2, 3) - assert len(b) == 3 - assert b[2] == ' ' - assert b[:] == 'lo ' - raises(IndexError, 'b[3]') - b = buffer('hello world', 55) - assert len(b) == 0 - assert b[:] == '' - b = buffer('hello world', 6, 999) - assert len(b) == 5 - assert b[:] == 'world' - - raises(ValueError, buffer, "abc", -1) - raises(ValueError, buffer, "abc", 0, -2) - - def test_rw_offset_size(self): - import array - - a = array.array("c", 'hello world') - b = buffer(a, 6) - assert len(b) == 5 - assert b[0] == 'w' - assert b[:] == 'world' - raises(IndexError, 'b[5]') - exc = raises(TypeError, "b[0] = 'W'") - assert str(exc.value) == "buffer is read-only" - exc = raises(TypeError, "b[:] = '12345'") - assert str(exc.value) == "buffer is read-only" - exc = raises(TypeError, 'b[5] = "."') - assert str(exc.value) == "buffer is read-only" - exc = raises(TypeError, "b[4:2] = ''") - assert str(exc.value) == "buffer is read-only" - assert str(b) == 'world' - assert a.tostring() == 'hello world' - - b = buffer(b, 2) - assert len(b) == 3 - assert b[0] == 'r' - assert b[:] == 'rld' - raises(IndexError, 'b[3]') - exc = raises(TypeError, "b[1] = 'X'") - assert str(exc.value) == "buffer is read-only" - exc = raises(TypeError, 'b[3] = "."') - assert str(exc.value) == "buffer is read-only" - assert a.tostring() == 'hello world' - - a = array.array("c", 'hello world') - b = buffer(a, 1, 8) - assert len(b) == 8 - assert b[0] == 'e' - assert b[:] == 'ello wor' - raises(IndexError, 'b[8]') - exc = raises(TypeError, "b[0] = 'E'") - assert str(exc.value) == "buffer is read-only" - assert str(b) == 'ello wor' - assert a.tostring() == 'hello world' - exc = raises(TypeError, "b[:] = '12345678'") - assert str(exc.value) == "buffer is read-only" - assert a.tostring() == 'hello world' - exc = raises(TypeError, 'b[8] = "."') - assert str(exc.value) == "buffer is read-only" - - b = buffer(b, 2, 3) - assert len(b) == 3 - assert b[2] == ' ' - assert b[:] == 'lo ' - raises(IndexError, 'b[3]') - exc = raises(TypeError, "b[1] = 'X'") - assert str(exc.value) == "buffer is read-only" - assert a.tostring() == 'hello world' - exc = raises(TypeError, 'b[3] = "."') - assert str(exc.value) == "buffer is read-only" - - b = buffer(a, 55) - assert len(b) == 0 - assert b[:] == '' - b = buffer(a, 6, 999) - assert len(b) == 5 - assert b[:] == 'world' - - raises(ValueError, buffer, a, -1) - raises(ValueError, buffer, a, 0, -2) - - def test_slice(self): - # Test extended slicing by comparing with list slicing. - s = "".join(chr(c) for c in list(range(255, -1, -1))) - b = buffer(s) - indices = (0, None, 1, 3, 19, 300, -1, -2, -31, -300) - for start in indices: - for stop in indices: - # Skip step 0 (invalid) - for step in indices[1:]: - assert b[start:stop:step] == s[start:stop:step] - - def test_getitem_only_ints(self): - class MyInt(object): - def __init__(self, x): - self.x = x - - def __int__(self): - return self.x - - buf = buffer('hello world') - raises(TypeError, "buf[MyInt(0)]") - raises(TypeError, "buf[MyInt(0):MyInt(5)]") - - def test_pypy_raw_address_base(self): - import sys - if '__pypy__' not in sys.builtin_module_names: - skip('PyPy only') - a = buffer("foobar")._pypy_raw_address() - assert a != 0 - b = buffer(u"foobar")._pypy_raw_address() - assert b != 0 - c = buffer(bytearray("foobar"))._pypy_raw_address() - assert c != 0 diff -Nru pypy-7.1.1+dfsg/pypy/objspace/std/test/test_bytearrayobject.py pypy-7.3.1+dfsg/pypy/objspace/std/test/test_bytearrayobject.py --- pypy-7.1.1+dfsg/pypy/objspace/std/test/test_bytearrayobject.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/objspace/std/test/test_bytearrayobject.py 2020-04-10 19:28:41.000000000 +0000 @@ -380,11 +380,19 @@ assert b == bytearray('obe') def test_iadd(self): - b = bytearray('abc') + b = b0 = bytearray('abc') b += 'def' assert b == 'abcdef' - assert isinstance(b, bytearray) + assert b is b0 raises(TypeError, b.__iadd__, u"") + # + b += bytearray('XX') + assert b == 'abcdefXX' + assert b is b0 + # + b += memoryview('ABC') + assert b == 'abcdefXXABC' + assert b is b0 def test_add(self): b1 = bytearray("abc") @@ -448,6 +456,10 @@ raises(TypeError, b.extend, [object()]) raises(TypeError, b.extend, u"unicode") + b = bytearray('abc') + b.extend(memoryview('def')) + assert b == bytearray('abcdef') + def test_extend_calls_len_or_lengthhint(self): class BadLen(object): def __iter__(self): return iter(range(10)) diff -Nru pypy-7.1.1+dfsg/pypy/objspace/std/test/test_bytesobject.py pypy-7.3.1+dfsg/pypy/objspace/std/test/test_bytesobject.py --- pypy-7.1.1+dfsg/pypy/objspace/std/test/test_bytesobject.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/objspace/std/test/test_bytesobject.py 2020-04-10 19:28:41.000000000 +0000 @@ -933,3 +933,16 @@ def test_add(self): assert 'abc' + 'abc' == 'abcabc' assert isinstance('abc' + u'\u03a3', unicode) + + def test_error_message_wrong_self(self): + e = raises(TypeError, bytes.upper, 42) + assert "str" in str(e.value) + if hasattr(bytes.upper, 'im_func'): + e = raises(TypeError, bytes.upper.im_func, 42) + assert "'str'" in str(e.value) + + def test_is_bug(self): + assert 'a' is 'a' + assert 'a' is not '' + assert '' is not 'a' + assert '' is '' diff -Nru pypy-7.1.1+dfsg/pypy/objspace/std/test/test_callmethod.py pypy-7.3.1+dfsg/pypy/objspace/std/test/test_callmethod.py --- pypy-7.1.1+dfsg/pypy/objspace/std/test/test_callmethod.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/objspace/std/test/test_callmethod.py 2020-04-10 19:28:41.000000000 +0000 @@ -1,113 +1,3 @@ -class AppTestCallMethod: - # The exec hacking is needed to have the code snippets compiled - # by our own compiler, not CPython's - - def test_call_method(self): - exec """if 1: - class C(object): - def m(*args, **kwds): - return args, kwds - sm = staticmethod(m) - cm = classmethod(m) - - c = C() - assert c.m() == ((c,), {}) - assert c.sm() == ((), {}) - assert c.cm() == ((C,), {}) - assert c.m(5) == ((c, 5), {}) - assert c.sm(6) == ((6,), {}) - assert c.cm(7) == ((C, 7), {}) - assert c.m(5, x=3) == ((c, 5), {'x': 3}) - assert c.m(*range(5)) == ((c, 0, 1, 2, 3, 4), {}) - assert c.m(**{'u': 4}) == ((c,), {'u': 4}) - """ - - def test_call_attribute(self): - exec """if 1: - class C(object): - def m(*args, **kwds): - return args, kwds - def myfunc(*args): - return args - - c = C() - c.m = c.m2 = myfunc - assert c.m() == () - assert c.m(5, 2) == (5, 2) - assert c.m2(4) == (4,) - assert c.m2("h", "e", "l", "l", "o") == tuple("hello") - """ - - def test_call_module(self): - exec """if 1: - import sys - try: - sys.exit(5) - except SystemExit, e: - assert e.args == (5,) - else: - raise Exception, "did not raise?" - """ - - def test_custom_getattr(self): - exec """if 1: - class C(object): - def __getattr__(self, name): - if name == 'bla': - return myfunc - raise AttributeError - def myfunc(*args): - return args - - c = C() - assert c.bla(1, 2, 3) == (1, 2, 3) - """ in {} - - def test_custom_getattribute(self): - exec """if 1: - class C(object): - def __getattribute__(self, name): - if name == 'bla': - return myfunc - raise AttributeError - def bla(self): - Boom - def myfunc(*args): - return args - - c = C() - assert c.bla(1, 2, 3) == (1, 2, 3) - """ in {} - - def test_builtin(self): - exec """if 1: - class C(object): - foobar = len - c = C() - assert c.foobar("hello") == 5 - """ - - def test_attributeerror(self): - exec """if 1: - assert 5 .__add__(6) == 11 - try: - 6 .foobar(7) - except AttributeError: - pass - else: - raise Exception("did not raise?") - """ - - def test_kwargs(self): - exec """if 1: - class C(object): - def f(self, a): - return a + 2 - - assert C().f(a=3) == 5 - """ - - class TestCallMethod: def test_space_call_method(self): space = self.space diff -Nru pypy-7.1.1+dfsg/pypy/objspace/std/test/test_complexobject.py pypy-7.3.1+dfsg/pypy/objspace/std/test/test_complexobject.py --- pypy-7.1.1+dfsg/pypy/objspace/std/test/test_complexobject.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/objspace/std/test/test_complexobject.py 2020-04-10 19:28:41.000000000 +0000 @@ -74,559 +74,3 @@ r = c.descr_pow(self.space, p, self.space.wrap(None)) assert r.realval == -1.0 assert r.imagval == 0.0 - - -class AppTestAppComplexTest: - spaceconfig = {'usemodules': ['binascii', 'time', 'struct']} - - def w_check_div(self, x, y): - """Compute complex z=x*y, and check that z/x==y and z/y==x.""" - z = x * y - if x != 0: - q = z / x - assert self.close(q, y) - q = z.__div__(x) - assert self.close(q, y) - q = z.__truediv__(x) - assert self.close(q, y) - if y != 0: - q = z / y - assert self.close(q, x) - q = z.__div__(y) - assert self.close(q, x) - q = z.__truediv__(y) - assert self.close(q, x) - - def w_close(self, x, y): - """Return true iff complexes x and y "are close\"""" - return self.close_abs(x.real, y.real) and self.close_abs(x.imag, y.imag) - - def w_close_abs(self, x, y, eps=1e-9): - """Return true iff floats x and y "are close\"""" - # put the one with larger magnitude second - if abs(x) > abs(y): - x, y = y, x - if y == 0: - return abs(x) < eps - if x == 0: - return abs(y) < eps - # check that relative difference < eps - return abs((x - y) / y) < eps - - def w_almost_equal(self, a, b, eps=1e-9): - if isinstance(a, complex): - if isinstance(b, complex): - return a.real - b.real < eps and a.imag - b.imag < eps - else: - return a.real - b < eps and a.imag < eps - else: - if isinstance(b, complex): - return a - b.real < eps and b.imag < eps - else: - return a - b < eps - - def test_div(self): - from random import random - # XXX this test passed but took waaaaay to long - # look at dist/lib-python/modified-2.5.2/test/test_complex.py - #simple_real = [float(i) for i in xrange(-5, 6)] - simple_real = [-2.0, 0.0, 1.0] - simple_complex = [complex(x, y) for x in simple_real for y in simple_real] - for x in simple_complex: - for y in simple_complex: - self.check_div(x, y) - - # A naive complex division algorithm (such as in 2.0) is very prone to - # nonsense errors for these (overflows and underflows). - self.check_div(complex(1e200, 1e200), 1+0j) - self.check_div(complex(1e-200, 1e-200), 1+0j) - - # Just for fun. - for i in xrange(100): - self.check_div(complex(random(), random()), - complex(random(), random())) - - raises(ZeroDivisionError, complex.__div__, 1+1j, 0+0j) - # FIXME: The following currently crashes on Alpha - raises(OverflowError, pow, 1e200+1j, 1e200+1j) - - def test_truediv(self): - assert self.almost_equal(complex.__truediv__(2+0j, 1+1j), 1-1j) - raises(ZeroDivisionError, complex.__truediv__, 1+1j, 0+0j) - - def test_floordiv(self): - assert self.almost_equal(complex.__floordiv__(3+0j, 1.5+0j), 2) - raises(ZeroDivisionError, complex.__floordiv__, 3+0j, 0+0j) - - def test_coerce(self): - raises(OverflowError, complex.__coerce__, 1+1j, 1L<<10000) - - def test_convert(self): - exc = raises(TypeError, complex.__int__, 3j) - assert str(exc.value) == "can't convert complex to int" - exc = raises(TypeError, complex.__float__, 3j) - assert str(exc.value) == "can't convert complex to float" - - def test_richcompare(self): - assert complex.__lt__(1+1j, None) is NotImplemented - assert complex.__eq__(1+1j, 2+2j) is False - assert complex.__eq__(1+1j, 1+1j) is True - assert complex.__ne__(1+1j, 1+1j) is False - assert complex.__ne__(1+1j, 2+2j) is True - raises(TypeError, complex.__lt__, 1+1j, 2+2j) - raises(TypeError, complex.__le__, 1+1j, 2+2j) - raises(TypeError, complex.__gt__, 1+1j, 2+2j) - raises(TypeError, complex.__ge__, 1+1j, 2+2j) - large = 1 << 10000 - assert not (5+0j) == large - assert not large == (5+0j) - assert (5+0j) != large - assert large != (5+0j) - - def test_richcompare_numbers(self): - for n in 8, 8L, 0.01: - assert complex.__eq__(n+0j, n) - assert not complex.__ne__(n+0j, n) - assert not complex.__eq__(complex(n, n), n) - assert complex.__ne__(complex(n, n), n) - raises(TypeError, complex.__lt__, n+0j, n) - - def test_richcompare_boundaries(self): - z = 9007199254740992+0j - i = 9007199254740993 - assert not complex.__eq__(z, i) - assert not complex.__eq__(z, long(i)) - assert complex.__ne__(z, i) - assert complex.__ne__(z, long(i)) - - def test_mod(self): - raises(ZeroDivisionError, (1+1j).__mod__, 0+0j) - - a = 3.33+4.43j - raises(ZeroDivisionError, "a % 0") - - def test_divmod(self): - raises(ZeroDivisionError, divmod, 1+1j, 0+0j) - - def test_pow(self): - assert self.almost_equal(pow(1+1j, 0+0j), 1.0) - assert self.almost_equal(pow(0+0j, 2+0j), 0.0) - raises(ZeroDivisionError, pow, 0+0j, 1j) - assert self.almost_equal(pow(1j, -1), 1/1j) - assert self.almost_equal(pow(1j, 200), 1) - raises(ValueError, pow, 1+1j, 1+1j, 1+1j) - - a = 3.33+4.43j - assert a ** 0j == 1 - assert a ** 0.+0.j == 1 - - assert 3j ** 0j == 1 - assert 3j ** 0 == 1 - - raises(ZeroDivisionError, "0j ** a") - raises(ZeroDivisionError, "0j ** (3-2j)") - - # The following is used to exercise certain code paths - assert a ** 105 == a ** 105 - assert a ** -105 == a ** -105 - assert a ** -30 == a ** -30 - assert a ** 2 == a * a - - assert 0.0j ** 0 == 1 - - b = 5.1+2.3j - raises(ValueError, pow, a, b, 0) - - b = complex(float('inf'), 0.0) ** complex(10., 3.) - assert repr(b) == "(nan+nanj)" - - def test_boolcontext(self): - from random import random - for i in xrange(100): - assert complex(random() + 1e-6, random() + 1e-6) - assert not complex(0.0, 0.0) - - def test_conjugate(self): - assert self.close(complex(5.3, 9.8).conjugate(), 5.3-9.8j) - - def test_constructor(self): - class OS: - def __init__(self, value): - self.value = value - def __complex__(self): - return self.value - class NS(object): - def __init__(self, value): - self.value = value - def __complex__(self): - return self.value - assert complex(OS(1+10j)) == 1+10j - assert complex(NS(1+10j)) == 1+10j - assert complex(OS(1+10j), 5) == 1+15j - assert complex(NS(1+10j), 5) == 1+15j - assert complex(OS(1+10j), 5j) == -4+10j - assert complex(NS(1+10j), 5j) == -4+10j - - raises(TypeError, complex, OS(None)) - raises(TypeError, complex, NS(None)) - - # -- The following cases are not supported by CPython, but they - # -- are supported by PyPy, which is most probably ok - #raises((TypeError, AttributeError), complex, OS(1+10j), OS(1+10j)) - #raises((TypeError, AttributeError), complex, NS(1+10j), OS(1+10j)) - #raises((TypeError, AttributeError), complex, OS(1+10j), NS(1+10j)) - #raises((TypeError, AttributeError), complex, NS(1+10j), NS(1+10j)) - - class F(object): - def __float__(self): - return 2.0 - assert complex(OS(1+10j), F()) == 1+12j - assert complex(NS(1+10j), F()) == 1+12j - - assert self.almost_equal(complex("1+10j"), 1+10j) - assert self.almost_equal(complex(10), 10+0j) - assert self.almost_equal(complex(10.0), 10+0j) - assert self.almost_equal(complex(10L), 10+0j) - assert self.almost_equal(complex(10+0j), 10+0j) - assert self.almost_equal(complex(1,10), 1+10j) - assert self.almost_equal(complex(1,10L), 1+10j) - assert self.almost_equal(complex(1,10.0), 1+10j) - assert self.almost_equal(complex(1L,10), 1+10j) - assert self.almost_equal(complex(1L,10L), 1+10j) - assert self.almost_equal(complex(1L,10.0), 1+10j) - assert self.almost_equal(complex(1.0,10), 1+10j) - assert self.almost_equal(complex(1.0,10L), 1+10j) - assert self.almost_equal(complex(1.0,10.0), 1+10j) - assert self.almost_equal(complex(3.14+0j), 3.14+0j) - assert self.almost_equal(complex(3.14), 3.14+0j) - assert self.almost_equal(complex(314), 314.0+0j) - assert self.almost_equal(complex(314L), 314.0+0j) - assert self.almost_equal(complex(3.14+0j, 0j), 3.14+0j) - assert self.almost_equal(complex(3.14, 0.0), 3.14+0j) - assert self.almost_equal(complex(314, 0), 314.0+0j) - assert self.almost_equal(complex(314L, 0L), 314.0+0j) - assert self.almost_equal(complex(0j, 3.14j), -3.14+0j) - assert self.almost_equal(complex(0.0, 3.14j), -3.14+0j) - assert self.almost_equal(complex(0j, 3.14), 3.14j) - assert self.almost_equal(complex(0.0, 3.14), 3.14j) - assert self.almost_equal(complex("1"), 1+0j) - assert self.almost_equal(complex("1j"), 1j) - assert self.almost_equal(complex(), 0) - assert self.almost_equal(complex("-1"), -1) - assert self.almost_equal(complex("+1"), +1) - assert self.almost_equal(complex(" ( +3.14-6J ) "), 3.14-6j) - exc = raises(ValueError, complex, " ( +3.14- 6J ) ") - assert str(exc.value) == "complex() arg is a malformed string" - - class complex2(complex): - pass - assert self.almost_equal(complex(complex2(1+1j)), 1+1j) - assert self.almost_equal(complex(real=17, imag=23), 17+23j) - assert self.almost_equal(complex(real=17+23j), 17+23j) - assert self.almost_equal(complex(real=17+23j, imag=23), 17+46j) - assert self.almost_equal(complex(real=1+2j, imag=3+4j), -3+5j) - - c = 3.14 + 1j - assert complex(c) is c - del c - - raises(TypeError, complex, "1", "1") - raises(TypeError, complex, 1, "1") - - assert complex(" 3.14+J ") == 3.14+1j - #h.assertEqual(complex(unicode(" 3.14+J ")), 3.14+1j) - - # SF bug 543840: complex(string) accepts strings with \0 - # Fixed in 2.3. - raises(ValueError, complex, '1+1j\0j') - - raises(TypeError, int, 5+3j) - raises(TypeError, long, 5+3j) - raises(TypeError, float, 5+3j) - raises(ValueError, complex, "") - raises(TypeError, complex, None) - raises(ValueError, complex, "\0") - raises(TypeError, complex, "1", "2") - raises(TypeError, complex, "1", 42) - raises(TypeError, complex, 1, "2") - raises(ValueError, complex, "1+") - raises(ValueError, complex, "1+1j+1j") - raises(ValueError, complex, "--") -# if x_test_support.have_unicode: -# raises(ValueError, complex, unicode("1"*500)) -# raises(ValueError, complex, unicode("x")) -# - class EvilExc(Exception): - pass - - class evilcomplex: - def __complex__(self): - raise EvilExc - - raises(EvilExc, complex, evilcomplex()) - - class float2: - def __init__(self, value): - self.value = value - def __float__(self): - return self.value - - assert self.almost_equal(complex(float2(42.)), 42) - assert self.almost_equal(complex(real=float2(17.), imag=float2(23.)), 17+23j) - raises(TypeError, complex, float2(None)) - - - def test_constructor_bad_error_message(self): - err = raises(TypeError, complex, {}).value - assert "float" not in str(err) - assert str(err) == "complex() first argument must be a string or a number, not 'dict'" - err = raises(TypeError, complex, 1, {}).value - assert "float" not in str(err) - assert str(err) == "complex() second argument must be a number, not 'dict'" - - def test_error_messages(self): - err = raises(ZeroDivisionError, "1+1j / 0").value - assert str(err) == "complex division by zero" - err = raises(ZeroDivisionError, "1+1j // 0").value - assert str(err) == "complex division by zero" - - def test___complex___returning_non_complex(self): - import cmath - class Obj(object): - def __init__(self, value): - self.value = value - def __complex__(self): - return self.value - - # "bug-to-bug" compatibility to CPython: complex() is more relaxed in - # what __complex__ can return. cmath functions really wants a complex - # number to be returned by __complex__. - assert complex(Obj(2.0)) == 2+0j - assert complex(Obj(2)) == 2+0j - assert complex(Obj(2L)) == 2+0j - # - assert cmath.polar(1) == (1.0, 0.0) - raises(TypeError, "cmath.polar(Obj(1))") - - def test_hash(self): - for x in xrange(-30, 30): - assert hash(x) == hash(complex(x, 0)) - x /= 3.0 # now check against floating point - assert hash(x) == hash(complex(x, 0.)) - - def test_abs(self): - nums = [complex(x/3., y/7.) for x in xrange(-9,9) for y in xrange(-9,9)] - for num in nums: - assert self.almost_equal((num.real**2 + num.imag**2) ** 0.5, abs(num)) - - def test_complex_subclass_ctr(self): - import sys - class j(complex): - pass - assert j(100 + 0j) == 100 + 0j - assert isinstance(j(100), j) - assert j(100L + 0j) == 100 + 0j - assert j("100+0j") == 100 + 0j - exc = raises(ValueError, j, "100 + 0j") - assert str(exc.value) == "complex() arg is a malformed string" - x = j(1+0j) - x.foo = 42 - assert x.foo == 42 - assert type(complex(x)) == complex - - def test_infinity(self): - inf = 1e200*1e200 - assert complex("1"*500) == complex(inf) - assert complex("-inf") == complex(-inf) - - def test_repr(self): - assert repr(1+6j) == '(1+6j)' - assert repr(1-6j) == '(1-6j)' - - assert repr(-(1+0j)) == '(-1-0j)' - assert repr(complex( 0.0, 0.0)) == '0j' - assert repr(complex( 0.0, -0.0)) == '-0j' - assert repr(complex(-0.0, 0.0)) == '(-0+0j)' - assert repr(complex(-0.0, -0.0)) == '(-0-0j)' - assert repr(complex(1e45)) == "(" + repr(1e45) + "+0j)" - assert repr(complex(1e200*1e200)) == '(inf+0j)' - assert repr(complex(1,-float("nan"))) == '(1+nanj)' - - def test_neg(self): - assert -(1+6j) == -1-6j - - def test_file(self): - import os - import tempfile - - a = 3.33+4.43j - b = 5.1+2.3j - - fo = None - try: - pth = tempfile.mktemp() - fo = open(pth,"wb") - print >>fo, a, b - fo.close() - fo = open(pth, "rb") - res = fo.read() - assert res == "%s %s\n" % (a, b) - finally: - if (fo is not None) and (not fo.closed): - fo.close() - try: - os.remove(pth) - except (OSError, IOError): - pass - - def test_convert(self): - raises(TypeError, int, 1+1j) - raises(TypeError, float, 1+1j) - - class complex0(complex): - """Test usage of __complex__() when inheriting from 'complex'""" - def __complex__(self): - return 42j - assert complex(complex0(1j)) == 42j - - class complex1(complex): - """Test usage of __complex__() with a __new__() method""" - def __new__(self, value=0j): - return complex.__new__(self, 2*value) - def __complex__(self): - return self - assert complex(complex1(1j)) == 2j - - class complex2(complex): - """Make sure that __complex__() calls fail if anything other than a - complex is returned""" - def __complex__(self): - return None - raises(TypeError, complex, complex2(1j)) - - def test_getnewargs(self): - assert (1+2j).__getnewargs__() == (1.0, 2.0) - - def test_method_not_found_on_newstyle_instance(self): - class A(object): - pass - a = A() - a.__complex__ = lambda: 5j # ignored - raises(TypeError, complex, a) - A.__complex__ = lambda self: 42j - assert complex(a) == 42j - - def test_format(self): - # empty format string is same as str() - assert format(1+3j, '') == str(1+3j) - assert format(1.5+3.5j, '') == str(1.5+3.5j) - assert format(3j, '') == str(3j) - assert format(3.2j, '') == str(3.2j) - assert format(3+0j, '') == str(3+0j) - assert format(3.2+0j, '') == str(3.2+0j) - - # empty presentation type should still be analogous to str, - # even when format string is nonempty (issue #5920). - - assert format(3.2, '-') == str(3.2) - assert format(3.2+0j, '-') == str(3.2+0j) - assert format(3.2+0j, '<') == str(3.2+0j) - z = 10/7. - 100j/7. - assert format(z, '') == str(z) - assert format(z, '-') == str(z) - assert format(z, '<') == str(z) - assert format(z, '10') == str(z) - z = complex(0.0, 3.0) - assert format(z, '') == str(z) - assert format(z, '-') == str(z) - assert format(z, '<') == str(z) - assert format(z, '2') == str(z) - z = complex(-0.0, 2.0) - assert format(z, '') == str(z) - assert format(z, '-') == str(z) - assert format(z, '<') == str(z) - assert format(z, '3') == str(z) - - assert format(1+3j, 'g') == '1+3j' - assert format(3j, 'g') == '0+3j' - assert format(1.5+3.5j, 'g') == '1.5+3.5j' - - assert format(1.5+3.5j, '+g') == '+1.5+3.5j' - assert format(1.5-3.5j, '+g') == '+1.5-3.5j' - assert format(1.5-3.5j, '-g') == '1.5-3.5j' - assert format(1.5+3.5j, ' g') == ' 1.5+3.5j' - assert format(1.5-3.5j, ' g') == ' 1.5-3.5j' - assert format(-1.5+3.5j, ' g') == '-1.5+3.5j' - assert format(-1.5-3.5j, ' g') == '-1.5-3.5j' - - assert format(-1.5-3.5e-20j, 'g') == '-1.5-3.5e-20j' - assert format(-1.5-3.5j, 'f') == '-1.500000-3.500000j' - assert format(-1.5-3.5j, 'F') == '-1.500000-3.500000j' - assert format(-1.5-3.5j, 'e') == '-1.500000e+00-3.500000e+00j' - assert format(-1.5-3.5j, '.2e') == '-1.50e+00-3.50e+00j' - assert format(-1.5-3.5j, '.2E') == '-1.50E+00-3.50E+00j' - assert format(-1.5e10-3.5e5j, '.2G') == '-1.5E+10-3.5E+05j' - - assert format(1.5+3j, '<20g') == '1.5+3j ' - assert format(1.5+3j, '*<20g') == '1.5+3j**************' - assert format(1.5+3j, '>20g') == ' 1.5+3j' - assert format(1.5+3j, '^20g') == ' 1.5+3j ' - assert format(1.5+3j, '<20') == '(1.5+3j) ' - assert format(1.5+3j, '>20') == ' (1.5+3j)' - assert format(1.5+3j, '^20') == ' (1.5+3j) ' - assert format(1.123-3.123j, '^20.2') == ' (1.1-3.1j) ' - - assert format(1.5+3j, '20.2f') == ' 1.50+3.00j' - assert format(1.5+3j, '>20.2f') == ' 1.50+3.00j' - assert format(1.5+3j, '<20.2f') == '1.50+3.00j ' - assert format(1.5e20+3j, '<20.2f') == '150000000000000000000.00+3.00j' - assert format(1.5e20+3j, '>40.2f') == ' 150000000000000000000.00+3.00j' - assert format(1.5e20+3j, '^40,.2f') == ' 150,000,000,000,000,000,000.00+3.00j ' - assert format(1.5e21+3j, '^40,.2f') == ' 1,500,000,000,000,000,000,000.00+3.00j ' - assert format(1.5e21+3000j, ',.2f') == '1,500,000,000,000,000,000,000.00+3,000.00j' - - # alternate is invalid - raises(ValueError, (1.5+0.5j).__format__, '#f') - - # zero padding is invalid - raises(ValueError, (1.5+0.5j).__format__, '010f') - - # '=' alignment is invalid - raises(ValueError, (1.5+3j).__format__, '=20') - - # integer presentation types are an error - for t in 'bcdoxX%': - raises(ValueError, (1.5+0.5j).__format__, t) - - # make sure everything works in ''.format() - assert '*{0:.3f}*'.format(3.14159+2.71828j) == '*3.142+2.718j*' - assert u'*{0:.3f}*'.format(3.14159+2.71828j) == u'*3.142+2.718j*' - assert u'{:-}'.format(1.5+3.5j) == u'(1.5+3.5j)' - - INF = float("inf") - NAN = float("nan") - # issue 3382: 'f' and 'F' with inf's and nan's - assert '{0:f}'.format(INF+0j) == 'inf+0.000000j' - assert '{0:F}'.format(INF+0j) == 'INF+0.000000j' - assert '{0:f}'.format(-INF+0j) == '-inf+0.000000j' - assert '{0:F}'.format(-INF+0j) == '-INF+0.000000j' - assert '{0:f}'.format(complex(INF, INF)) == 'inf+infj' - assert '{0:F}'.format(complex(INF, INF)) == 'INF+INFj' - assert '{0:f}'.format(complex(INF, -INF)) == 'inf-infj' - assert '{0:F}'.format(complex(INF, -INF)) == 'INF-INFj' - assert '{0:f}'.format(complex(-INF, INF)) == '-inf+infj' - assert '{0:F}'.format(complex(-INF, INF)) == '-INF+INFj' - assert '{0:f}'.format(complex(-INF, -INF)) == '-inf-infj' - assert '{0:F}'.format(complex(-INF, -INF)) == '-INF-INFj' - - assert '{0:f}'.format(complex(NAN, 0)) == 'nan+0.000000j' - assert '{0:F}'.format(complex(NAN, 0)) == 'NAN+0.000000j' - assert '{0:f}'.format(complex(NAN, NAN)) == 'nan+nanj' - assert '{0:F}'.format(complex(NAN, NAN)) == 'NAN+NANj' - - def test_complex_two_arguments(self): - raises(TypeError, complex, 5, None) - - def test_hash_minus_one(self): - assert hash(-1.0 + 0j) == -2 - assert (-1.0 + 0j).__hash__() == -2 diff -Nru pypy-7.1.1+dfsg/pypy/objspace/std/test/test_dictmultiobject.py pypy-7.3.1+dfsg/pypy/objspace/std/test/test_dictmultiobject.py --- pypy-7.1.1+dfsg/pypy/objspace/std/test/test_dictmultiobject.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/objspace/std/test/test_dictmultiobject.py 2020-04-10 19:28:41.000000000 +0000 @@ -147,7 +147,7 @@ w = self.space.wrap w_d = self.space.newdict() w_d.initialize_content([(w(u"a"), w(1)), (w(u"b"), w(2))]) - assert self.space.listview_utf8(w_d) == ["a", "b"] + assert self.space.listview_ascii(w_d) == ["a", "b"] def test_listview_int_dict(self): w = self.space.wrap @@ -917,6 +917,12 @@ assert (r == "dict_values(['ABC', 10])" or r == "dict_values([10, 'ABC'])") + def test_recursive_repr(self): + d = {1: 2} + d[2] = d.viewvalues() + print repr(d) + assert repr(d) == '{1: 2, 2: dict_values([2, ...])}' + def test_keys_set_operations(self): d1 = {'a': 1, 'b': 2} d2 = {'b': 3, 'c': 2} diff -Nru pypy-7.1.1+dfsg/pypy/objspace/std/test/test_instmethobject.py pypy-7.3.1+dfsg/pypy/objspace/std/test/test_instmethobject.py --- pypy-7.1.1+dfsg/pypy/objspace/std/test/test_instmethobject.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/objspace/std/test/test_instmethobject.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,38 +0,0 @@ - -# NB. instmethobject.py has been removed, -# but the following tests still make sense - - -class AppTestInstMethObjectApp: - def test_callBound(self): - boundMethod = [1,2,3].__len__ - assert boundMethod() == 3 - raises(TypeError, boundMethod, 333) - def test_callUnbound(self): - unboundMethod = list.__len__ - assert unboundMethod([1,2,3]) == 3 - raises(TypeError, unboundMethod) - raises(TypeError, unboundMethod, 333) - raises(TypeError, unboundMethod, [1,2,3], 333) - - def test_err_format(self): - class C(object): - def m(self): pass - try: - C.m(1) - except TypeError as e: - assert str(e) == 'unbound method m() must be called with C instance as first argument (got int instance instead)' - - def test_getBound(self): - def f(l,x): return l[x+1] - bound = f.__get__('abcdef') - assert bound(1) == 'c' - raises(TypeError, bound) - raises(TypeError, bound, 2, 3) - def test_getUnbound(self): - def f(l,x): return l[x+1] - unbound = f.__get__(None, str) - assert unbound('abcdef', 2) == 'd' - raises(TypeError, unbound) - raises(TypeError, unbound, 4) - raises(TypeError, unbound, 4, 5) diff -Nru pypy-7.1.1+dfsg/pypy/objspace/std/test/test_intobject.py pypy-7.3.1+dfsg/pypy/objspace/std/test/test_intobject.py --- pypy-7.1.1+dfsg/pypy/objspace/std/test/test_intobject.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/objspace/std/test/test_intobject.py 2020-04-10 19:28:41.000000000 +0000 @@ -684,6 +684,15 @@ x = int(-sys.maxint) assert x.__rsub__(2) == (2 + sys.maxint) + def test_error_message_wrong_self(self): + unboundmeth = int.__str__ + e = raises(TypeError, unboundmeth, "!") + assert "int" in str(e.value) + if hasattr(unboundmeth, 'im_func'): + e = raises(TypeError, unboundmeth.im_func, "!") + assert "'int'" in str(e.value) + + class AppTestIntShortcut(AppTestInt): spaceconfig = {"objspace.std.intshortcut": True} diff -Nru pypy-7.1.1+dfsg/pypy/objspace/std/test/test_iterobject.py pypy-7.3.1+dfsg/pypy/objspace/std/test/test_iterobject.py --- pypy-7.1.1+dfsg/pypy/objspace/std/test/test_iterobject.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/objspace/std/test/test_iterobject.py 2020-04-10 19:28:41.000000000 +0000 @@ -36,120 +36,3 @@ w_iter = self.space.iter(w_list) self.body0(w_iter) -class AppTestW_IterObjectApp: - def test_user_iter(self): - class C(object): - def next(self): - raise StopIteration - def __iter__(self): - return self - assert list(C()) == [] - - def test_iter_getitem(self): - class C(object): - def __getitem__(self, i): - return range(2)[i] - assert list(C()) == range(2) - - def test_iter_fail_noseq(self): - class C(object): - pass - raises(TypeError, - iter, - C()) - -class AppTest_IterObject(object): - def test_no_len_on_list_iter(self): - iterable = [1,2,3,4] - raises(TypeError, len, iter(iterable)) - - def test_no_len_on_tuple_iter(self): - iterable = (1,2,3,4) - raises(TypeError, len, iter(iterable)) - - def test_no_len_on_deque_iter(self): - from _collections import deque - iterable = deque([1,2,3,4]) - raises(TypeError, len, iter(iterable)) - - def test_no_len_on_reversed(self): - it = reversed("foobar") - raises(TypeError, len, it) - - def test_no_len_on_reversed_seqiter(self): - # this one fails on CPython. See http://bugs.python.org/issue3689 - it = reversed([5,6,7]) - raises(TypeError, len, it) - - def test_no_len_on_UserList_iter_reversed(self): - import sys, _abcoll - sys.modules['collections'] = _abcoll - from UserList import UserList - iterable = UserList([1,2,3,4]) - raises(TypeError, len, iter(iterable)) - raises(TypeError, len, reversed(iterable)) - del sys.modules['collections'] - - def test_reversed_frees_empty(self): - import gc - for typ in list, unicode: - free = [False] - class U(typ): - def __del__(self): - free[0] = True - r = reversed(U()) - raises(StopIteration, next, r) - gc.collect(); gc.collect(); gc.collect() - assert free[0] - - def test_reversed_mutation(self): - n = 10 - d = range(n) - it = reversed(d) - next(it) - next(it) - assert it.__length_hint__() == n-2 - d.append(n) - assert it.__length_hint__() == n-2 - d[1:] = [] - assert it.__length_hint__() == 0 - assert list(it) == [] - d.extend(xrange(20)) - assert it.__length_hint__() == 0 - - def test_no_len_on_set_iter(self): - iterable = set([1,2,3,4]) - raises(TypeError, len, iter(iterable)) - - def test_no_len_on_xrange(self): - iterable = xrange(10) - raises(TypeError, len, iter(iterable)) - - def test_contains(self): - logger = [] - - class Foo(object): - - def __init__(self, value, name=None): - self.value = value - self.name = name or value - - def __repr__(self): - return '' % self.name - - def __eq__(self, other): - logger.append((self, other)) - return self.value == other.value - - foo1, foo2, foo3 = Foo(1), Foo(2), Foo(3) - foo42 = Foo(42) - foo_list = [foo1, foo2, foo3] - foo42 in (x for x in foo_list) - logger_copy = logger[:] # prevent re-evaluation during pytest error print - assert logger_copy == [(foo42, foo1), (foo42, foo2), (foo42, foo3)] - - del logger[:] - foo2_bis = Foo(2, '2 bis') - foo2_bis in (x for x in foo_list) - logger_copy = logger[:] # prevent re-evaluation during pytest error print - assert logger_copy == [(foo2_bis, foo1), (foo2_bis, foo2)] diff -Nru pypy-7.1.1+dfsg/pypy/objspace/std/test/test_jsondict.py pypy-7.3.1+dfsg/pypy/objspace/std/test/test_jsondict.py --- pypy-7.1.1+dfsg/pypy/objspace/std/test/test_jsondict.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/objspace/std/test/test_jsondict.py 2020-04-10 19:28:41.000000000 +0000 @@ -0,0 +1,126 @@ + +class AppTest(object): + spaceconfig = {"objspace.usemodules._pypyjson": True} + + def test_check_strategy(self): + import __pypy__ + import _pypyjson + + d = _pypyjson.loads('{"a": 1}') + assert __pypy__.strategy(d) == "JsonDictStrategy" + d = _pypyjson.loads('{}') + assert __pypy__.strategy(d) == "EmptyDictStrategy" + + def test_simple(self): + import __pypy__ + import _pypyjson + + d = _pypyjson.loads('{"a": 1, "b": "x"}') + assert len(d) == 2 + assert d[u"a"] == 1 + assert d[u"b"] == u"x" + assert u"c" not in d + + d[u"a"] = 5 + assert d[u"a"] == 5 + assert __pypy__.strategy(d) == "JsonDictStrategy" + + # devolve it + assert not 1 in d + assert __pypy__.strategy(d) == "UnicodeDictStrategy" + assert len(d) == 2 + assert d[u"a"] == 5 + assert d[u"b"] == u"x" + assert u"c" not in d + + def test_setdefault(self): + import __pypy__ + import _pypyjson + + d = _pypyjson.loads('{"a": 1, "b": "x"}') + assert d.setdefault(u"a", "blub") == 1 + d.setdefault(u"x", 23) + assert __pypy__.strategy(d) == "UnicodeDictStrategy" + assert len(d) == 3 + assert d == {u"a": 1, u"b": "x", u"x": 23} + + def test_delitem(self): + import __pypy__ + import _pypyjson + + d = _pypyjson.loads('{"a": 1, "b": "x"}') + del d[u"a"] + assert __pypy__.strategy(d) == "UnicodeDictStrategy" + assert len(d) == 1 + assert d == {u"b": "x"} + + def test_popitem(self): + import __pypy__ + import _pypyjson + + d = _pypyjson.loads('{"a": 1, "b": "x"}') + k, v = d.popitem() + assert __pypy__.strategy(d) == "UnicodeDictStrategy" + if k == u"a": + assert v == 1 + assert len(d) == 1 + assert d == {u"b": "x"} + else: + assert v == u"x" + assert len(d) == 1 + assert d == {u"a": 1} + + def test_keys_value_items(self): + import _pypyjson + + d = _pypyjson.loads('{"a": 1, "b": "x"}') + assert d.keys() == [u"a", u"b"] + assert d.values() == [1, u"x"] + assert d.items() == [(u"a", 1), (u"b", u"x")] + + def test_iter_keys_value_items(self): + import _pypyjson + + d = _pypyjson.loads('{"a": 1, "b": "x"}') + assert list(d.iterkeys()) == [u"a", u"b"] + assert list(d.itervalues()) == [1, u"x"] + assert list(d.iteritems()) == [(u"a", 1), (u"b", u"x")] + + def test_dict_order_retained_when_switching_strategies(self): + import _pypyjson + import __pypy__ + d = _pypyjson.loads('{"a": 1, "b": "x"}') + assert list(d) == [u"a", u"b"] + # devolve + assert not 1 in d + assert __pypy__.strategy(d) == "UnicodeDictStrategy" + assert list(d) == [u"a", u"b"] + + def test_bug(self): + import _pypyjson + a = """ + { + "top": { + "k": "8", + "k": "8", + "boom": 1 + } + } + """ + d = _pypyjson.loads(a) + str(d) + repr(d) + + def test_objdict_bug(self): + import _pypyjson + a = """{"foo": "bar"}""" + d = _pypyjson.loads(a) + d['foo'] = 'x' + + class Obj(object): + pass + + x = Obj() + x.__dict__ = d + + x.foo = 'baz' # used to segfault on pypy3 diff -Nru pypy-7.1.1+dfsg/pypy/objspace/std/test/test_listobject.py pypy-7.3.1+dfsg/pypy/objspace/std/test/test_listobject.py --- pypy-7.1.1+dfsg/pypy/objspace/std/test/test_listobject.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/objspace/std/test/test_listobject.py 2020-04-10 19:28:41.000000000 +0000 @@ -1395,6 +1395,10 @@ l3 = [s] assert l1[0].encode("ascii", "replace") == "???" + def test_unicode_bug_in_listview_utf8(self): + l1 = list(u'\u1234\u2345') + assert l1 == [u'\u1234', u'\u2345'] + def test_list_from_set(self): l = ['a'] l.__init__(set('b')) diff -Nru pypy-7.1.1+dfsg/pypy/objspace/std/test/test_liststrategies.py pypy-7.3.1+dfsg/pypy/objspace/std/test/test_liststrategies.py --- pypy-7.1.1+dfsg/pypy/objspace/std/test/test_liststrategies.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/objspace/std/test/test_liststrategies.py 2020-04-10 19:28:41.000000000 +0000 @@ -3,7 +3,7 @@ from pypy.objspace.std.listobject import ( W_ListObject, EmptyListStrategy, ObjectListStrategy, IntegerListStrategy, FloatListStrategy, BytesListStrategy, RangeListStrategy, - SimpleRangeListStrategy, make_range_list, UnicodeListStrategy, + SimpleRangeListStrategy, make_range_list, AsciiListStrategy, IntOrFloatListStrategy) from pypy.objspace.std import listobject from pypy.objspace.std.test.test_listobject import TestW_ListObject @@ -21,7 +21,7 @@ assert isinstance(W_ListObject(space, [wb('a'), wb('b')]).strategy, BytesListStrategy) assert isinstance(W_ListObject(space, [w(u'a'), w(u'b')]).strategy, - UnicodeListStrategy) + AsciiListStrategy) assert isinstance(W_ListObject(space, [w(u'a'), wb('b')]).strategy, ObjectListStrategy) # mixed unicode and bytes @@ -47,7 +47,7 @@ l = W_ListObject(space, []) assert isinstance(l.strategy, EmptyListStrategy) l.append(w(u'a')) - assert isinstance(l.strategy, UnicodeListStrategy) + assert isinstance(l.strategy, AsciiListStrategy) l = W_ListObject(space, []) assert isinstance(l.strategy, EmptyListStrategy) @@ -76,9 +76,9 @@ def test_unicode_to_any(self): space = self.space l = W_ListObject(space, [space.wrap(u'a'), space.wrap(u'b'), space.wrap(u'c')]) - assert isinstance(l.strategy, UnicodeListStrategy) + assert isinstance(l.strategy, AsciiListStrategy) l.append(space.wrap(u'd')) - assert isinstance(l.strategy, UnicodeListStrategy) + assert isinstance(l.strategy, AsciiListStrategy) l.append(space.wrap(3)) assert isinstance(l.strategy, ObjectListStrategy) @@ -117,7 +117,7 @@ # UnicodeStrategy to ObjectStrategy l = W_ListObject(space, [w(u'a'),w(u'b'),w(u'c')]) - assert isinstance(l.strategy, UnicodeListStrategy) + assert isinstance(l.strategy, AsciiListStrategy) l.setitem(0, w(2)) assert isinstance(l.strategy, ObjectListStrategy) @@ -145,7 +145,7 @@ # UnicodeStrategy l = W_ListObject(space, [w(u'a'),w(u'b'),w(u'c')]) - assert isinstance(l.strategy, UnicodeListStrategy) + assert isinstance(l.strategy, AsciiListStrategy) l.insert(3, w(2)) assert isinstance(l.strategy, ObjectListStrategy) @@ -225,7 +225,7 @@ # UnicodeStrategy to ObjectStrategy l = W_ListObject(space, [w(u'a'), w(u'b'), w(u'c')]) - assert isinstance(l.strategy, UnicodeListStrategy) + assert isinstance(l.strategy, AsciiListStrategy) l.setslice(0, 1, 2, W_ListObject(space, [w(1), w(2), w(3)])) assert isinstance(l.strategy, ObjectListStrategy) @@ -275,7 +275,7 @@ l = W_ListObject(space, wrapitems([u"a",u"b",u"c",u"d",u"e"])) other = W_ListObject(space, wrapitems([u"a", u"b", u"c"])) keep_other_strategy(l, 0, 2, other.length(), other) - assert l.strategy is space.fromcache(UnicodeListStrategy) + assert l.strategy is space.fromcache(AsciiListStrategy) l = W_ListObject(space, wrapitems([1.1, 2.2, 3.3, 4.4, 5.5])) other = W_ListObject(space, []) @@ -345,7 +345,7 @@ empty = W_ListObject(space, []) assert isinstance(empty.strategy, EmptyListStrategy) empty.extend(W_ListObject(space, [w(u"a"), w(u"b"), w(u"c")])) - assert isinstance(empty.strategy, UnicodeListStrategy) + assert isinstance(empty.strategy, AsciiListStrategy) empty = W_ListObject(space, []) assert isinstance(empty.strategy, EmptyListStrategy) @@ -601,7 +601,7 @@ l1 = W_ListObject(self.space, [self.space.newbytes("eins"), self.space.newbytes("zwei")]) assert isinstance(l1.strategy, BytesListStrategy) l2 = W_ListObject(self.space, [self.space.newutf8("eins", 4), self.space.newutf8("zwei", 4)]) - assert isinstance(l2.strategy, UnicodeListStrategy) + assert isinstance(l2.strategy, AsciiListStrategy) l3 = W_ListObject(self.space, [self.space.newbytes("eins"), self.space.newutf8("zwei", 4)]) assert isinstance(l3.strategy, ObjectListStrategy) @@ -611,11 +611,11 @@ w_l = self.space.newlist([self.space.newbytes('a'), self.space.newbytes('b')]) assert space.listview_bytes(w_l) == ["a", "b"] - def test_listview_unicode(self): + def test_listview_ascii(self): space = self.space - assert space.listview_utf8(space.wrap(1)) == None + assert space.listview_ascii(space.wrap(1)) == None w_l = self.space.newlist([self.space.wrap(u'a'), self.space.wrap(u'b')]) - assert space.listview_utf8(w_l) == ["a", "b"] + assert space.listview_ascii(w_l) == ["a", "b"] def test_string_join_uses_listview_bytes(self): space = self.space @@ -664,7 +664,7 @@ assert space.listview_bytes(w_l3) == ["a", "b", "c"] assert space.listview_bytes(w_l4) == ["a", "b", "c"] - def test_unicode_uses_newlist_unicode(self): + def test_unicode_uses_newlist_ascii(self): space = self.space w_u = space.wrap(u"a b c") space.newlist = None @@ -675,10 +675,10 @@ w_l4 = space.call_method(w_u, "rsplit", space.wrap(" ")) finally: del space.newlist - assert space.listview_utf8(w_l) == [u"a", u"b", u"c"] - assert space.listview_utf8(w_l2) == [u"a", u"b", u"c"] - assert space.listview_utf8(w_l3) == [u"a", u"b", u"c"] - assert space.listview_utf8(w_l4) == [u"a", u"b", u"c"] + assert space.listview_ascii(w_l) == [u"a", u"b", u"c"] + assert space.listview_ascii(w_l2) == [u"a", u"b", u"c"] + assert space.listview_ascii(w_l3) == [u"a", u"b", u"c"] + assert space.listview_ascii(w_l4) == [u"a", u"b", u"c"] def test_pop_without_argument_is_fast(self): space = self.space @@ -719,10 +719,10 @@ w_l = W_ListObject(space, [space.newbytes("a"), space.newbytes("b")]) assert self.space.listview_bytes(w_l) == ["a", "b"] - def test_listview_unicode_list(self): + def test_listview_ascii_list(self): space = self.space w_l = W_ListObject(space, [space.wrap(u"a"), space.wrap(u"b")]) - assert self.space.listview_utf8(w_l) == [u"a", u"b"] + assert self.space.listview_ascii(w_l) == [u"a", u"b"] def test_listview_int_list(self): space = self.space diff -Nru pypy-7.1.1+dfsg/pypy/objspace/std/test/test_longobject.py pypy-7.3.1+dfsg/pypy/objspace/std/test/test_longobject.py --- pypy-7.1.1+dfsg/pypy/objspace/std/test/test_longobject.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/objspace/std/test/test_longobject.py 2020-04-10 19:28:41.000000000 +0000 @@ -450,3 +450,10 @@ expected = (2 << (size * 4)) // 3 assert long(n, 16) == expected + def test_error_message_wrong_self(self): + unboundmeth = long.__str__ + e = raises(TypeError, unboundmeth, 42) + assert "long" in str(e.value) + if hasattr(unboundmeth, 'im_func'): + e = raises(TypeError, unboundmeth.im_func, 42) + assert "'long'" in str(e.value) diff -Nru pypy-7.1.1+dfsg/pypy/objspace/std/test/test_mapdict.py pypy-7.3.1+dfsg/pypy/objspace/std/test/test_mapdict.py --- pypy-7.1.1+dfsg/pypy/objspace/std/test/test_mapdict.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/objspace/std/test/test_mapdict.py 2020-04-10 19:28:41.000000000 +0000 @@ -897,6 +897,17 @@ d = x.__dict__ assert list(__pypy__.reversed_dict(d)) == d.keys()[::-1] + def test_bug_materialize_huge_dict(self): + import __pypy__ + d = __pypy__.newdict("instance") + for i in range(100): + d[str(i)] = i + assert len(d) == 100 + + for key in d: + assert d[key] == int(key) + + class AppTestWithMapDictAndCounters(object): spaceconfig = {"objspace.std.withmethodcachecounter": True} diff -Nru pypy-7.1.1+dfsg/pypy/objspace/std/test/test_methodcache.py pypy-7.3.1+dfsg/pypy/objspace/std/test/test_methodcache.py --- pypy-7.1.1+dfsg/pypy/objspace/std/test/test_methodcache.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/objspace/std/test/test_methodcache.py 2020-04-10 19:28:41.000000000 +0000 @@ -72,46 +72,6 @@ assert cache_counter[1] >= 2 # should be (18, 2) assert sum(cache_counter) == 20 - def test_change_methods(self): - @self.retry - def run(): - import __pypy__ - class A(object): - def f(self): - return 42 - l = [A()] * 10 - __pypy__.reset_method_cache_counter() - for i, a in enumerate(l): - assert a.f() == 42 + i - A.f = eval("lambda self: %s" % (42 + i + 1, )) - cache_counter = __pypy__.method_cache_counter("f") - # - # a bit of explanation about what's going on. (1) is the line "a.f()" - # and (2) is "A.f = ...". - # - # at line (1) we do the lookup on type(a).f - # - # at line (2) we do a setattr on A. However, descr_setattr does also a - # lookup of type(A).f i.e. type.f, to check if by chance 'f' is a data - # descriptor. - # - # At the first iteration: - # (1) is a miss because it's the first lookup of A.f. The result is cached - # - # (2) is a miss because it is the first lookup of type.f. The - # (non-existant) result is cached. The version of A changes, and 'f' - # is changed to be a cell object, so that subsequest assignments won't - # change the version of A - # - # At the second iteration: - # (1) is a miss because the version of A changed just before - # (2) is a hit, because type.f is cached. The version of A no longer changes - # - # At the third and subsequent iterations: - # (1) is a hit, because the version of A did not change - # (2) is a hit, see above - assert cache_counter == (17, 3) - def test_subclasses(self): @self.retry def run(): diff -Nru pypy-7.1.1+dfsg/pypy/objspace/std/test/test_newformat.py pypy-7.3.1+dfsg/pypy/objspace/std/test/test_newformat.py --- pypy-7.1.1+dfsg/pypy/objspace/std/test/test_newformat.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/objspace/std/test/test_newformat.py 2020-04-10 19:28:41.000000000 +0000 @@ -199,6 +199,13 @@ assert self.s('{0:\x00<12}').format(3+2.0j) == '(3+2j)' + '\x00' * 6 assert self.s('{0:\x01<12}').format(3+2.0j) == '(3+2j)' + '\x01' * 6 + def test_issue3100(self): + class Foo: + def __format__(self, f): + return '<<%r>>' % (f,) + fmtstr = self.s("{:[XYZ}") + assert fmtstr.format(Foo()) == "<<%r>>" % (self.s("[XYZ"),) + class AppTestUnicodeFormat(BaseStringFormatTests): def setup_class(cls): @@ -258,6 +265,7 @@ def test_simple(self): assert format(self.i(2)) == "2" assert isinstance(format(self.i(2), u""), unicode) + assert isinstance(self.i(2).__format__(u""), str) def test_invalid(self): raises(ValueError, format, self.i(8), "s") @@ -381,6 +389,24 @@ finally: locale.setlocale(locale.LC_NUMERIC, 'C') + def test_locale_german(self): + import locale + for name in ['de_DE', 'de_DE.utf8']: + try: + locale.setlocale(locale.LC_NUMERIC, name) + break + except locale.Error: + pass + else: + skip("no german locale") + x = 1234.567890 + try: + assert locale.format('%g', x, grouping=True) == '1.234,57' + assert format(x, 'n') == '1.234,57' + assert format(12345678901234, 'n') == '12.345.678.901.234' + finally: + locale.setlocale(locale.LC_NUMERIC, 'C') + def test_dont_switch_to_g(self): skip("must fix when float formatting is figured out") assert len(format(1.1234e90, "f")) == 98 @@ -471,3 +497,15 @@ assert isinstance(first, unicode) for x, y in l: assert isinstance(y, unicode) + + def test_format_char(self): + import sys + assert '{0:c}'.format(42) == '*' + raises(OverflowError, '{0:c}'.format, 1234) + # the rest looks unexpected, but that's also what CPython does + raises(UnicodeDecodeError, u'{0:c}'.format, 255) + raises(OverflowError, u'{0:c}'.format, 1234) + raises(OverflowError, u'{0:c}'.format, -1) + + def test_format_unicode_nonutf8_bytestring(self): + raises(UnicodeDecodeError, u'{0}'.format, '\xff') diff -Nru pypy-7.1.1+dfsg/pypy/objspace/std/test/test_operation.py pypy-7.3.1+dfsg/pypy/objspace/std/test/test_operation.py --- pypy-7.1.1+dfsg/pypy/objspace/std/test/test_operation.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/objspace/std/test/test_operation.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,134 +0,0 @@ - - -def app_test_int_vs_long(): - def teq(a, b): - assert a == b - assert type(a) is type(b) - - # binary operators - teq( 5 - 2 , 3 ) - teq( 5 - 2L , 3L ) - teq( 5L - 2 , 3L ) - teq( 5L - 2L , 3L ) - - teq( 5 .__sub__(2 ), 3 ) - teq( 5 .__sub__(2L), NotImplemented ) - teq( 5L .__sub__(2 ), 3L ) - teq( 5L .__sub__(2L), 3L ) - - teq( 5 .__rsub__(2 ), -3 ) - teq( 5 .__rsub__(2L), NotImplemented ) - teq( 5L .__rsub__(2 ), -3L ) - teq( 5L .__rsub__(2L), -3L ) - - teq( 5 ** 2 , 25 ) - teq( 5 ** 2L , 25L ) - teq( 5L ** 2 , 25L ) - teq( 5L ** 2L , 25L ) - - # ternary operator - teq( pow( 5 , 3 , 100 ), 25 ) - teq( pow( 5 , 3 , 100L), 25L) - teq( pow( 5 , 3L, 100 ), 25L) - teq( pow( 5 , 3L, 100L), 25L) - teq( pow( 5L, 3 , 100 ), 25L) - teq( pow( 5L, 3 , 100L), 25L) - teq( pow( 5L, 3L, 100 ), 25L) - teq( pow( 5L, 3L, 100L), 25L) - - # two tests give a different result on PyPy and CPython. - # however, there is no sane way that PyPy can match CPython here, - # short of reintroducing three-way coercion... - teq( 5 .__pow__(3 , 100 ), 25 ) - #teq( 5 .__pow__(3 , 100L), 25L or NotImplemented? ) - teq( 5 .__pow__(3L, 100 ), NotImplemented ) - teq( 5 .__pow__(3L, 100L), NotImplemented ) - teq( 5L .__pow__(3 , 100 ), 25L) - teq( 5L .__pow__(3 , 100L), 25L) - teq( 5L .__pow__(3L, 100 ), 25L) - teq( 5L .__pow__(3L, 100L), 25L) - - teq( 5 .__rpow__(3 , 100 ), 43 ) - #teq( 5 .__rpow__(3 , 100L), 43L or NotImplemented? ) - teq( 5 .__rpow__(3L, 100 ), NotImplemented ) - teq( 5 .__rpow__(3L, 100L), NotImplemented ) - teq( 5L .__rpow__(3 , 100 ), 43L) - teq( 5L .__rpow__(3 , 100L), 43L) - teq( 5L .__rpow__(3L, 100 ), 43L) - teq( 5L .__rpow__(3L, 100L), 43L) - - -def app_test_int_vs_float(): - def teq(a, b): - assert a == b - assert type(a) is type(b) - - # binary operators - teq( 5 - 2 , 3 ) - teq( 5 - 2.0 , 3.0 ) - teq( 5.0 - 2 , 3.0 ) - teq( 5.0 - 2.0 , 3.0 ) - - teq( 5 .__sub__(2 ), 3 ) - teq( 5 .__sub__(2.0), NotImplemented ) - teq( 5.0 .__sub__(2 ), 3.0 ) - teq( 5.0 .__sub__(2.0), 3.0 ) - - teq( 5 .__rsub__(2 ), -3 ) - teq( 5 .__rsub__(2.0), NotImplemented ) - teq( 5.0 .__rsub__(2 ), -3.0 ) - teq( 5.0 .__rsub__(2.0), -3.0 ) - - teq( 5 ** 2 , 25 ) - teq( 5 ** 2.0 , 25.0 ) - teq( 5.0 ** 2 , 25.0 ) - teq( 5.0 ** 2.0 , 25.0 ) - - # pow() fails with a float argument anywhere - raises(TypeError, pow, 5 , 3 , 100.0) - raises(TypeError, pow, 5 , 3.0, 100 ) - raises(TypeError, pow, 5 , 3.0, 100.0) - raises(TypeError, pow, 5.0, 3 , 100 ) - raises(TypeError, pow, 5.0, 3 , 100.0) - raises(TypeError, pow, 5.0, 3.0, 100 ) - raises(TypeError, pow, 5.0, 3.0, 100.0) - - teq( 5 .__pow__(3.0, 100 ), NotImplemented ) - teq( 5 .__pow__(3.0, 100.0), NotImplemented ) - - teq( 5 .__rpow__(3.0, 100 ), NotImplemented ) - teq( 5 .__rpow__(3.0, 100.0), NotImplemented ) - - -def app_test_long_vs_float(): - def teq(a, b): - assert a == b - assert type(a) is type(b) - - # binary operators - teq( 5L - 2.0 , 3.0 ) - teq( 5.0 - 2L , 3.0 ) - - teq( 5L .__sub__(2.0), NotImplemented ) - teq( 5.0 .__sub__(2L ), 3.0 ) - - teq( 5L .__rsub__(2.0), NotImplemented ) - teq( 5.0 .__rsub__(2L ), -3.0 ) - - teq( 5L ** 2.0 , 25.0 ) - teq( 5.0 ** 2L , 25.0 ) - - # pow() fails with a float argument anywhere - raises(TypeError, pow, 5L , 3L , 100.0) - raises(TypeError, pow, 5L , 3.0, 100 ) - raises(TypeError, pow, 5L , 3.0, 100.0) - raises(TypeError, pow, 5.0, 3L , 100 ) - raises(TypeError, pow, 5.0, 3L , 100.0) - raises(TypeError, pow, 5.0, 3.0, 100 ) - raises(TypeError, pow, 5.0, 3.0, 100.0) - - teq( 5L .__pow__(3.0, 100L ), NotImplemented ) - teq( 5L .__pow__(3.0, 100.0), NotImplemented ) - - teq( 5L .__rpow__(3.0, 100L ), NotImplemented ) - teq( 5L .__rpow__(3.0, 100.0), NotImplemented ) diff -Nru pypy-7.1.1+dfsg/pypy/objspace/std/test/test_setobject.py pypy-7.3.1+dfsg/pypy/objspace/std/test/test_setobject.py --- pypy-7.1.1+dfsg/pypy/objspace/std/test/test_setobject.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/objspace/std/test/test_setobject.py 2020-04-10 19:28:41.000000000 +0000 @@ -80,7 +80,7 @@ def test_create_set_from_list(self): from pypy.interpreter.baseobjspace import W_Root - from pypy.objspace.std.setobject import BytesSetStrategy, ObjectSetStrategy, UnicodeSetStrategy + from pypy.objspace.std.setobject import BytesSetStrategy, ObjectSetStrategy from pypy.objspace.std.floatobject import W_FloatObject w = self.space.wrap @@ -105,8 +105,6 @@ w_list = self.space.iter(W_ListObject(self.space, [w(u"1"), w(u"2"), w(u"3")])) w_set = W_SetObject(self.space) _initialize_set(self.space, w_set, w_list) - #assert w_set.strategy is self.space.fromcache(UnicodeSetStrategy) - #assert w_set.strategy.unerase(w_set.sstorage) == {u"1":None, u"2":None, u"3":None} w_list = W_ListObject(self.space, [w("1"), w(2), w("3")]) w_set = W_SetObject(self.space) @@ -610,6 +608,40 @@ assert type(t) is subset assert not hasattr(t, 'x') + def test_reverse_ops(self): + assert set.__rxor__ + assert frozenset.__rxor__ + assert set.__ror__ + assert frozenset.__ror__ + assert set.__rand__ + assert frozenset.__rand__ + assert set.__rsub__ + assert frozenset.__rsub__ + + # actual behaviour test + for base in [set, frozenset]: + class S(base): + def __xor__(self, other): + if type(other) is not S: + return NotImplemented + return 1 + __or__ = __and__ = __sub__ = __xor__ + assert S([1, 2, 3]) ^ S([2, 3, 4]) == 1 + assert S([1, 2, 3]) ^ {2, 3, 4} == {1, 4} + assert {1, 2, 3} ^ S([2, 3, 4]) == {1, 4} + + assert S([1, 2, 3]) & S([2, 3, 4]) == 1 + assert S([1, 2, 3]) & {2, 3, 4} == {2, 3} + assert {1, 2, 3} & S([2, 3, 4]) == {2, 3} + + assert S([1, 2, 3]) | S([2, 3, 4]) == 1 + assert S([1, 2, 3]) | {2, 3, 4} == {1, 2, 3, 4} + assert {1, 2, 3} | S([2, 3, 4]) == {1, 2, 3, 4} + + assert S([1, 2, 3]) - S([2, 3, 4]) == 1 + assert S([1, 2, 3]) - {2, 3, 4} == {1} + assert {1, 2, 3} - S([2, 3, 4]) == {1} + def test_isdisjoint(self): assert set([1,2,3]).isdisjoint(set([4,5,6])) assert set([1,2,3]).isdisjoint(frozenset([4,5,6])) @@ -1037,3 +1069,15 @@ raise ValueError yield 1 raises(ValueError, set, f()) + + def test_frozenset_init_does_nothing(self): + f = frozenset([1, 2, 3]) + f.__init__(4, 5, 6) + assert f == frozenset([1, 2, 3]) + + def test_error_message_wrong_self(self): + e = raises(TypeError, frozenset.copy, 42) + assert "frozenset" in str(e.value) + if hasattr(frozenset.copy, 'im_func'): + e = raises(TypeError, frozenset.copy.im_func, 42) + assert "'set-or-frozenset'" in str(e.value) diff -Nru pypy-7.1.1+dfsg/pypy/objspace/std/test/test_setstrategies.py pypy-7.3.1+dfsg/pypy/objspace/std/test/test_setstrategies.py --- pypy-7.1.1+dfsg/pypy/objspace/std/test/test_setstrategies.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/objspace/std/test/test_setstrategies.py 2020-04-10 19:28:41.000000000 +0000 @@ -2,7 +2,7 @@ from pypy.objspace.std.setobject import ( BytesIteratorImplementation, BytesSetStrategy, EmptySetStrategy, IntegerIteratorImplementation, IntegerSetStrategy, ObjectSetStrategy, - UnicodeIteratorImplementation, UnicodeSetStrategy) + UnicodeIteratorImplementation, AsciiSetStrategy) from pypy.objspace.std.listobject import W_ListObject class TestW_SetStrategies: @@ -26,8 +26,8 @@ s = W_SetObject(self.space, self.wrapped(["a", "b"])) assert s.strategy is self.space.fromcache(BytesSetStrategy) - #s = W_SetObject(self.space, self.wrapped([u"a", u"b"])) - #assert s.strategy is self.space.fromcache(UnicodeSetStrategy) + s = W_SetObject(self.space, self.wrapped([u"a", u"b"])) + assert s.strategy is self.space.fromcache(AsciiSetStrategy) def test_switch_to_object(self): s = W_SetObject(self.space, self.wrapped([1,2,3,4,5])) @@ -42,7 +42,7 @@ def test_switch_to_unicode(self): s = W_SetObject(self.space, self.wrapped([])) s.add(self.space.wrap(u"six")) - assert s.strategy is self.space.fromcache(UnicodeSetStrategy) + assert s.strategy is self.space.fromcache(AsciiSetStrategy) def test_symmetric_difference(self): s1 = W_SetObject(self.space, self.wrapped([1,2,3,4,5])) diff -Nru pypy-7.1.1+dfsg/pypy/objspace/std/test/test_stringformat.py pypy-7.3.1+dfsg/pypy/objspace/std/test/test_stringformat.py --- pypy-7.1.1+dfsg/pypy/objspace/std/test/test_stringformat.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/objspace/std/test/test_stringformat.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,405 +0,0 @@ -# coding: utf-8 - - -class AppTestStringObjectWithDict: - def test_format_item(self): - d = {'i': 23} - assert 'a23b' == 'a%(i)sb' % d - assert '23b' == '%(i)sb' % d - assert 'a23' == 'a%(i)s' % d - assert '23' == '%(i)s' % d - - def test_format_two_items(self): - d = {'i': 23, 'j': 42} - assert 'a23b42c' == 'a%(i)sb%(j)sc' % d - assert 'a23b23c' == 'a%(i)sb%(i)sc' % d - - def test_format_percent(self): - d = {} - assert 'a%b' == 'a%%b' % d - - def test_format_empty_key(self): - d = {'':42} - assert '42' == '%()s' % d - - def test_format_wrong_char(self): - d = {'i': 23} - raises(ValueError, 'a%(i)Zb'.__mod__, d) - - def test_format_missing(self): - d = {'i': 23} - raises(KeyError, 'a%(x)sb'.__mod__, d) - - def test_format_error(self): - d = {} - assert '' % d == '' - n = 5 - raises(TypeError, "'' % n") - - class MyMapping(object): - def __getitem__(self, key): - py.test.fail('should not be here') - assert '' % MyMapping() == '' - - class MyMapping2(object): - def __getitem__(self, key): - return key - assert '%(key)s'%MyMapping2() == 'key' - assert u'%(key)s'%MyMapping2() == u'key' - - -class AppTestStringObject: - def test_format_item(self): - n = 23 - assert 'a23b' == 'a%sb' % n - assert '23b' == '%sb' % n - assert 'a23' == 'a%s' % n - assert '23' == '%s' % n - - def test_format_percent(self): - t = () - assert 'a%b' == 'a%%b' % t - assert '%b' == '%%b' % t - assert 'a%' == 'a%%' % t - assert '%' == '%%' % t - - def test_format_too_much(self): - raises(TypeError, '%s%s'.__mod__, ()) - raises(TypeError, '%s%s'.__mod__, (23,)) - - def test_format_not_enough(self): - raises(TypeError, '%s%s'.__mod__, (23,)*3) - raises(TypeError, '%s%s'.__mod__, (23,)*4) - - def test_format_string(self): - s = '23' - assert '23' == '%s' % s - assert "'23'" == '%r' % s - raises(TypeError, '%d'.__mod__, s) - - def test_format_float(self): - f = 23.456 - assert '23' == '%d' % f - assert '17' == '%x' % f - assert '23.456' == '%s' % f - # for 'r' use a float that has an exact decimal rep: - g = 23.125 - assert '23.125' == '%r' % g - h = 0.0276 - assert '0.028' == '%.3f' % h # should work on most platforms... - big = 1E200 - assert ' inf' == '%6g' % (big * big) - - assert '0.' == '%#.0f' % 0.0 - - def test_format_int(self): - import sys - n = 23 - z = 0 - assert '23' == '%d' % n - assert '17' == '%x' % n - assert '0x17' == '%#x' % n - assert '0x0' == '%#x' % z - assert '23' == '%s' % n - assert '23' == '%r' % n - assert ('%d' % (-sys.maxint-1,) == '-' + str(sys.maxint+1) - == '-%d' % (sys.maxint+1,)) - n = 28 - m = 8 - assert '1C' == '%X' % n - assert '0X1C' == '%#X' % n - assert '10' == '%o' % m - assert '010' == '%#o' % m - assert '-010' == '%#o' % -m - assert '0' == '%o' % z - assert '0' == '%#o' % z - - n = 23 - f = 5 - assert '-0x017' == '%#06x' % -n - assert '' == '%.0o' % z - assert '0' == '%#.0o' % z - assert '5' == '%.0o' % f - assert '05' == '%#.0o' % f - assert '000' == '%.3o' % z - assert '000' == '%#.3o' % z - assert '005' == '%.3o' % f - assert '005' == '%#.3o' % f - assert '27' == '%.2o' % n - assert '027' == '%#.2o' % n - - def test_format_long(self): - l = 4800000000L - assert '%d' % l == '4800000000' - - class SubLong(long): - pass - sl = SubLong(l) - assert '%d' % sl == '4800000000' - - def test_format_subclass_with_str(self): - class SubInt2(int): - def __str__(self): - assert False, "not called" - def __hex__(self): - assert False, "not called" - def __oct__(self): - assert False, "not called" - def __int__(self): - assert False, "not called" - def __long__(self): - assert False, "not called" - sl = SubInt2(123) - assert '%i' % sl == '123' - assert '%u' % sl == '123' - assert '%d' % sl == '123' - assert '%x' % sl == '7b' - assert '%X' % sl == '7B' - assert '%o' % sl == '173' - - skip("the rest of this test is serious nonsense imho, changed " - "only on 2.7.13, and is different on 3.x anyway. We could " - "reproduce it by writing lengthy logic, then get again the " - "reasonable performance by special-casing the exact type " - "'long'. And all for 2.7.13 only. Let's give up.") - - class SubLong2(long): - def __str__(self): - return extra_stuff + 'Xx' - def __hex__(self): - return extra_stuff + '0xYy' + extra_tail - def __oct__(self): - return extra_stuff + '0Zz' + extra_tail - def __int__(self): - assert False, "not called" - def __long__(self): - assert False, "not called" - sl = SubLong2(123) - for extra_stuff in ['', '-']: - for extra_tail in ['', 'l', 'L']: - m = extra_stuff - x = '%i' % sl - assert x == m+'Xx' - assert '%u' % sl == m+'Xx' - assert '%d' % sl == m+'Xx' - assert '%x' % sl == m+('Yyl' if extra_tail == 'l' else 'Yy') - assert '%X' % sl == m+('YYL' if extra_tail == 'l' else 'YY') - assert '%o' % sl == m+('Zzl' if extra_tail == 'l' else 'Zz') - extra_stuff = '??' - raises(ValueError, "'%x' % sl") - raises(ValueError, "'%X' % sl") - raises(ValueError, "'%o' % sl") - - def test_format_list(self): - l = [1,2] - assert '<[1, 2]>' == '<%s>' % l - assert '<[1, 2]-[3, 4]>' == '<%s-%s>' % (l, [3,4]) - - def test_format_tuple(self): - t = (1,2) - assert '<(1, 2)>' == '<%s>' % (t,) - assert '<(1, 2)-(3, 4)>' == '<%s-%s>' % (t, (3,4)) - - def test_format_dict(self): - # I'll just note that the first of these two completely - # contradicts what CPython's documentation says: - - # When the right argument is a dictionary (or other - # mapping type), then the formats in the string - # \emph{must} include a parenthesised mapping key into - # that dictionary inserted immediately after the - # \character{\%} character. - - # It is what CPython *does*, however. All software sucks. - - d = {1:2} - assert '<{1: 2}>' == '<%s>' % d - assert '<{1: 2}-{3: 4}>' == '<%s-%s>' % (d, {3:4}) - - def test_format_wrong_char(self): - raises(ValueError, 'a%Zb'.__mod__, ((23,),)) - - def test_incomplete_format(self): - raises(ValueError, '%'.__mod__, ((23,),)) - raises((ValueError, TypeError), '%('.__mod__, ({},)) - - def test_format_char(self): - import sys - A = 65 - e = 'e' - assert '%c' % A == 'A' - assert '%c' % e == 'e' - raises(OverflowError, '%c'.__mod__, (256,)) - raises(OverflowError, '%c'.__mod__, (-1,)) - raises(OverflowError, u'%c'.__mod__, (sys.maxunicode+1,)) - raises(TypeError, '%c'.__mod__, ("bla",)) - raises(TypeError, '%c'.__mod__, ("",)) - raises(TypeError, '%c'.__mod__, (['c'],)) - - def test_broken_unicode(self): - raises(UnicodeDecodeError, 'Názov: %s'.__mod__, u'Jerry') - - def test___int__(self): - class MyInt(object): - def __init__(self, x): - self.x = x - def __int__(self): - return self.x - x = MyInt(65) - assert '%c' % x == 'A' - - def test_format_retry_with_long_if_int_fails(self): - class IntFails(object): - def __int__(self): - raise Exception - def __long__(self): - return 0L - - x = "%x" % IntFails() - assert x == '0' - - def test_formatting_huge_precision(self): - prec = 2**31 - format_string = "%.{}f".format(prec) - exc = raises(ValueError, "format_string % 2.34") - assert str(exc.value) == 'prec too big' - raises(OverflowError, lambda: u'%.*f' % (prec, 1. / 7)) - - def test_formatting_huge_width(self): - import sys - format_string = "%{}f".format(sys.maxsize + 1) - exc = raises(ValueError, "format_string % 2.34") - assert str(exc.value) == 'width too big' - -class AppTestWidthPrec: - def test_width(self): - a = 'a' - assert "%3s" % a == ' a' - assert "%-3s"% a == 'a ' - - def test_prec_cornercase(self): - z = 0 - assert "%.0x" % z == '' - assert "%.x" % z == '' - assert "%.0d" % z == '' - assert "%.i" % z == '' - assert "%.0o" % z == '' - assert "%.o" % z == '' - - def test_prec_string(self): - a = 'a' - abcde = 'abcde' - assert "%.3s"% a == 'a' - assert "%.3s"% abcde == 'abc' - - def test_prec_width_string(self): - a = 'a' - abcde = 'abcde' - assert "%5.3s" % a == ' a' - assert "%5.3s" % abcde == ' abc' - assert "%-5.3s"% a == 'a ' - assert "%-5.3s"% abcde == 'abc ' - - def test_zero_pad(self): - one = 1 - ttf = 2.25 - assert "%02d" % one == "01" - assert "%05d" % one == "00001" - assert "%-05d" % one == "1 " - assert "%04f" % ttf == "2.250000" - assert "%05g" % ttf == "02.25" - assert "%-05g" % ttf =="2.25 " - assert "%05s" % ttf == " 2.25" - - def test_star_width(self): - f = 5 - assert "%*s" %( f, 'abc') == ' abc' - assert "%*s" %(-f, 'abc') == 'abc ' - assert "%-*s"%( f, 'abc') == 'abc ' - assert "%-*s"%(-f, 'abc') == 'abc ' - - def test_star_prec(self): - t = 3 - assert "%.*s"%( t, 'abc') == 'abc' - assert "%.*s"%( t, 'abcde') == 'abc' - assert "%.*s"%(-t, 'abc') == '' - - def test_star_width_prec(self): - f = 5 - assert "%*.*s"%( f, 3, 'abc') == ' abc' - assert "%*.*s"%( f, 3, 'abcde') == ' abc' - assert "%*.*s"%(-f, 3, 'abcde') == 'abc ' - - def test_long_format(self): - def f(fmt, x): - return fmt % x - assert '%.70f' % 2.0 == '2.' + '0' * 70 - assert '%.110g' % 2.0 == '2' - - def test_subnormal(self): - inf = 1e300 * 1e300 - assert "%f" % (inf,) == 'inf' - assert "%E" % (inf,) == 'INF' - assert "%f" % (-inf,) == '-inf' - assert "%F" % (-inf,) == '-INF' - nan = inf / inf - assert "%f" % (nan,) == 'nan' - assert "%f" % (-nan,) == 'nan' - assert "%E" % (nan,) == 'NAN' - assert "%F" % (nan,) == 'NAN' - assert "%G" % (nan,) == 'NAN' - - -class AppTestUnicodeObject: - def test_unicode_convert(self): - u = u"x" - assert isinstance("%s" % u, unicode) - - def test_unicode_nonascii(self): - """ - Interpolating a unicode string with non-ascii characters in it into - a string format should decode the format string as ascii and return - unicode. - """ - u = u'\x80' - result = "%s" % u - assert isinstance(result, unicode) - assert result == u - - def test_unicode_d(self): - t = 3 - assert u"%.1d" % t == '3' - - def test_unicode_overflow(self): - skip("nicely passes on top of CPython but requires > 2GB of RAM") - import sys - raises((OverflowError, MemoryError), 'u"%.*d" % (sys.maxint, 1)') - - def test_unicode_format_a(self): - ten = 10L - assert u'%x' % ten == 'a' - - def test_long_no_overflow(self): - big = 0x1234567890987654321 - assert "%x" % big == "1234567890987654321" - - def test_missing_cases(self): - big = -123456789012345678901234567890 - assert '%032d' % big == '-0123456789012345678901234567890' - - def test_invalid_char(self): - f = 4 - raises(ValueError, 'u"%\u1234" % (f,)') - - def test_formatting_huge_precision(self): - prec = 2**31 - format_string = u"%.{}f".format(prec) - exc = raises(ValueError, "format_string % 2.34") - assert str(exc.value) == 'prec too big' - raises(OverflowError, lambda: u'%.*f' % (prec, 1. / 7)) - - def test_formatting_huge_width(self): - import sys - format_string = u"%{}f".format(sys.maxsize + 1) - exc = raises(ValueError, "format_string % 2.34") - assert str(exc.value) == 'width too big' diff -Nru pypy-7.1.1+dfsg/pypy/objspace/std/test/test_tupleobject.py pypy-7.3.1+dfsg/pypy/objspace/std/test/test_tupleobject.py --- pypy-7.1.1+dfsg/pypy/objspace/std/test/test_tupleobject.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/objspace/std/test/test_tupleobject.py 2020-04-10 19:28:41.000000000 +0000 @@ -454,3 +454,11 @@ (4.1, 2.3), (3.6, 4.8)] assert specialized_zip_2_lists(["foo", "bar"], [6, 2]) == [ ("foo", 6), ("bar", 2)] + + def test_error_message_wrong_self(self): + unboundmeth = tuple.__hash__ + e = raises(TypeError, unboundmeth, 42) + assert "tuple" in str(e.value) + if hasattr(unboundmeth, 'im_func'): + e = raises(TypeError, unboundmeth.im_func, 42) + assert "'tuple'" in str(e.value) diff -Nru pypy-7.1.1+dfsg/pypy/objspace/std/test/test_unicodeobject.py pypy-7.3.1+dfsg/pypy/objspace/std/test/test_unicodeobject.py --- pypy-7.1.1+dfsg/pypy/objspace/std/test/test_unicodeobject.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/objspace/std/test/test_unicodeobject.py 2020-04-10 19:28:41.000000000 +0000 @@ -30,9 +30,9 @@ space.warn = prev_warn assert len(warnings) == 2 - def test_listview_unicode(self): + def test_listview_ascii(self): w_str = self.space.newutf8('abcd', 4) - assert self.space.listview_utf8(w_str) == list("abcd") + assert self.space.listview_ascii(w_str) == list("abcd") def test_new_shortcut(self): space = self.space @@ -187,6 +187,26 @@ space.newint(start + len1)) assert w_res is space.newbool(expected) + def test_getitem_constant_index_jit(self): + # test it directly, to prevent only seeing bugs in jitted code + space = self.space + u = u"äöabc" + w_u = self.space.wrap(u) + for i in range(-len(u), len(u)): + assert w_u._getitem_result_constant_index_jit(space, i)._utf8 == u[i].encode("utf-8") + with py.test.raises(OperationError): + w_u._getitem_result_constant_index_jit(space, len(u)) + with py.test.raises(OperationError): + w_u._getitem_result_constant_index_jit(space, -len(u) - 1) + + def test_getslice_constant_index_jit(self): + space = self.space + u = u"äöabcéééß" + w_u = self.space.wrap(u) + for start in range(0, 4): + for end in range(start, len(u)): + assert w_u._unicode_sliced_constant_index_jit(space, start, end)._utf8 == u[start: end].encode("utf-8") + class AppTestUnicodeStringStdOnly: def test_compares(self): @@ -339,6 +359,9 @@ assert u''.rsplit('aaa') == [u''] assert u'a\nb\u1680c'.rsplit() == [u'a', u'b', u'c'] + def test_rsplit_bug(self): + assert u'Vestur- og Mið'.rsplit() == [u'Vestur-', u'og', u'Mið'] + def test_split_rsplit_str_unicode(self): x = 'abc'.split(u'b') assert x == [u'a', u'c'] @@ -711,6 +734,7 @@ raises(TypeError, u'hello'.translate) raises(TypeError, u'abababc'.translate, {ord('a'):''}) + raises(TypeError, u'x'.translate, {ord('x'):0x110000}) def test_unicode_from_encoded_object(self): assert unicode('x', 'utf-8') == u'x' @@ -1146,8 +1170,8 @@ def test_format_repeat(self): assert format(u"abc", u"z<5") == u"abczz" assert format(u"abc", u"\u2007<5") == u"abc\u2007\u2007" - #CPython2 raises UnicodeEncodeError - assert format(123, u"\u2007<5") == u"123\u2007\u2007" + # raises UnicodeEncodeError, like CPython does + raises(UnicodeEncodeError, format, 123, u"\u2007<5") def test_formatting_char(self): for num in range(0x80,0x100): @@ -1278,4 +1302,4 @@ assert str(e.value) == 'decoding Unicode is not supported' def test_newlist_utf8_non_ascii(self): - 'ä'.split("\n")[0] # does not crash \ No newline at end of file + 'ä'.split("\n")[0] # does not crash diff -Nru pypy-7.1.1+dfsg/pypy/objspace/std/test/test_userobject.py pypy-7.3.1+dfsg/pypy/objspace/std/test/test_userobject.py --- pypy-7.1.1+dfsg/pypy/objspace/std/test/test_userobject.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/objspace/std/test/test_userobject.py 2020-04-10 19:28:41.000000000 +0000 @@ -1,6 +1,4 @@ -import py from pypy.interpreter import gateway -from pypy.objspace.test import test_descriptor class AppTestUserObject: @@ -13,230 +11,6 @@ return space.wrap(random.randrange(0, 5)) cls.w_rand = cls.space.wrap(gateway.interp2app(rand)) - def test_emptyclass(self): - class empty(object): pass - inst = empty() - assert isinstance(inst, empty) - inst.attr = 23 - assert inst.attr == 23 - - def test_method(self): - class A(object): - def f(self, v): - return v*42 - a = A() - assert a.f('?') == '??????????????????????????????????????????' - - def test_unboundmethod(self): - class A(object): - def f(self, v): - return v*17 - a = A() - assert A.f(a, '!') == '!!!!!!!!!!!!!!!!!' - - def test_subclassing(self): - for base in tuple, list, dict, str, int, float: - class subclass(base): pass - stuff = subclass() - assert isinstance(stuff, base) - assert subclass.__base__ is base - - def test_subclasstuple(self): - class subclass(tuple): pass - stuff = subclass() - assert isinstance(stuff, tuple) - stuff.attr = 23 - assert stuff.attr ==23 - assert len(stuff) ==0 - result = stuff + (1,2,3) - assert len(result) ==3 - - def test_subsubclass(self): - class base(object): - baseattr = 12 - class derived(base): - derivedattr = 34 - inst = derived() - assert isinstance(inst, base) - assert inst.baseattr ==12 - assert inst.derivedattr ==34 - - def test_descr_get(self): - class C(object): - class desc(object): - def __get__(self, ob, cls=None): - return 42 - prop = desc() - assert C().prop == 42 - - def test_descr_set(self): - class C(object): - class desc(object): - def __set__(self, ob, val): - ob.wibble = val - prop = desc() - c = C() - c.prop = 32 - assert c.wibble == 32 - - def test_descr_delete(self): - class C(object): - class desc(object): - def __set__(self, ob, val): - oogabooga - def __delete__(self, ob): - ob.wibble = 22 - prop = desc() - c = C() - del c.prop - assert c.wibble == 22 - - def test_class_setattr(self): - class C(object): - pass - C.a = 1 - assert hasattr(C, 'a') - assert C.a == 1 - - def test_add(self): - class C(object): - def __add__(self, other): - return self, other - c1 = C() - assert c1+3 == (c1, 3) - - def test_call(self): - class C(object): - def __call__(self, *args): - return args - c1 = C() - assert c1() == () - assert c1(5) == (5,) - assert c1("hello", "world") == ("hello", "world") - - def test_getattribute(self): - class C(object): - def __getattribute__(self, name): - return '->' + name - c1 = C() - assert c1.a == '->a' - c1.a = 5 - assert c1.a == '->a' - - def test_getattr(self): - class C(object): - def __getattr__(self, name): - return '->' + name - c1 = C() - assert c1.a == '->a' - c1.a = 5 - assert c1.a == 5 - - def test_dict(self): - class A(object): - pass - class B(A): - pass - assert not '__dict__' in object.__dict__ - assert '__dict__' in A.__dict__ - assert not '__dict__' in B.__dict__ - a = A() - a.x = 5 - assert a.__dict__ == {'x': 5} - a.__dict__ = {'y': 6} - assert a.y == 6 - assert not hasattr(a, 'x') - - def test_del(self): - import gc - lst = [] - class A(object): - def __del__(self): - lst.append(42) - A() - gc.collect() - assert lst == [42] - - def test_del_exception(self): - import sys, StringIO, gc - class A(object): - def __del__(self): - yaddadlaouti - prev = sys.stderr - try: - sys.stderr = StringIO.StringIO() - A() - gc.collect() - res = sys.stderr.getvalue() - A() - gc.collect() - res2 = sys.stderr.getvalue() - finally: - sys.stderr = prev - assert res.startswith('Exception') - assert 'NameError' in res - assert 'yaddadlaouti' in res - assert 'ignored' in res - assert res.count('\n') == 1 # a single line - assert res2.count('\n') == 2 # two lines - line2 = res2.split('\n')[1] - assert line2.startswith('Exception') - assert 'NameError' in line2 - assert 'yaddadlaouti' in line2 - assert 'ignored' in line2 - - def test_instance_overrides_meth(self): - class C(object): - def m(self): - return "class" - assert C().m() == 'class' - c = C() - c.m = lambda: "instance" - res = c.m() - assert res == "instance" - - def test_override_builtin_methods(self): - class myint(int): - def __add__(self, other): - return 'add' - def __rsub__(self, other): - return 'rsub' - assert myint(3) + 5 == 'add' - assert 5 + myint(3) == 8 - assert myint(3) - 5 == -2 - assert 5 - myint(3) == 'rsub' - - def test_repr(self): - class Foo(object): - pass - Foo.__module__ = 'a.b.c' - s = repr(Foo()) - assert s.startswith('" % (kind, self.name)) + def iterator_greenkey_printable(self): + return self.name + def descr_getattribute(self, space, w_name): name = space.text_w(w_name) w_descr = space.lookup(self, name) diff -Nru pypy-7.1.1+dfsg/pypy/objspace/std/unicodeobject.py pypy-7.3.1+dfsg/pypy/objspace/std/unicodeobject.py --- pypy-7.1.1+dfsg/pypy/objspace/std/unicodeobject.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/objspace/std/unicodeobject.py 2020-04-10 19:28:41.000000000 +0000 @@ -1,5 +1,7 @@ """The builtin unicode implementation""" +import sys + from rpython.rlib.objectmodel import ( compute_hash, compute_unique_id, import_from_mixin, always_inline, enforceargs, newlist_hint, specialize, we_are_translated) @@ -16,7 +18,7 @@ from pypy.interpreter.error import OperationError, oefmt from pypy.interpreter.gateway import WrappedDefault, interp2app, unwrap_spec from pypy.interpreter.typedef import TypeDef -from pypy.module.unicodedata import unicodedb +from pypy.module.unicodedata.interp_ucd import unicodedb from pypy.objspace.std import newformat from pypy.objspace.std.basestringtype import basestring_typedef from pypy.objspace.std.formatting import mod_format @@ -29,6 +31,20 @@ 'encode_object', 'decode_object', 'unicode_from_object', 'unicode_from_string', 'unicode_to_decimal_w'] +MAX_UNROLL_NEXT_CODEPOINT_POS = 4 + +@jit.elidable +def next_codepoint_pos_dont_look_inside(utf8, p): + return rutf8.next_codepoint_pos(utf8, p) + +@jit.elidable +def prev_codepoint_pos_dont_look_inside(utf8, p): + return rutf8.prev_codepoint_pos(utf8, p) + +@jit.elidable +def codepoint_at_pos_dont_look_inside(utf8, p): + return rutf8.codepoint_at_pos(utf8, p) + class W_UnicodeObject(W_Root): import_from_mixin(StringMethods) @@ -41,13 +57,12 @@ self._utf8 = utf8str self._length = length self._index_storage = rutf8.null_storage() - if not we_are_translated(): + if not we_are_translated() and not sys.platform == 'win32': # utf8str must always be a valid utf8 string, except maybe with # explicit surrogate characters---which .decode('utf-8') doesn't # special-case in Python 2, which is exactly what we want here assert length == len(utf8str.decode('utf-8')) - @staticmethod def from_utf8builder(builder): return W_UnicodeObject( @@ -114,16 +129,17 @@ # Returns ascii-encoded str return space.text_w(encode_object(space, self, 'ascii', 'strict')) - def listview_utf8(self): - assert self.is_ascii() - return _create_list_from_unicode(self._utf8) + def listview_ascii(self): + if self.is_ascii(): + return _create_list_from_unicode(self._utf8) + return None def ord(self, space): if self._len() != 1: raise oefmt(space.w_TypeError, "ord() expected a character, but string of length %d " "found", self._len()) - return space.newint(rutf8.codepoint_at_pos(self._utf8, 0)) + return space.newint(self.codepoint_at_pos_dont_look_inside(0)) def _empty(self): return W_UnicodeObject.EMPTY @@ -382,7 +398,7 @@ "or unicode") try: builder.append_code(codepoint) - except ValueError: + except rutf8.OutOfRange: raise oefmt(space.w_TypeError, "character mapping must be in range(0x110000)") return self.from_utf8builder(builder) @@ -421,7 +437,7 @@ if self._length == 0: return space.w_False if self._length == 1: - return space.newbool(func(rutf8.codepoint_at_pos(self._utf8, 0))) + return space.newbool(func(self.codepoint_at_pos_dont_look_inside(0))) else: return self._is_generic_loop(space, self._utf8, func_name) @@ -465,7 +481,7 @@ _StringMethods_descr_join = descr_join def descr_join(self, space, w_list): - l = space.listview_utf8(w_list) + l = space.listview_ascii(w_list) if l is not None and self.is_ascii(): if len(l) == 1: return space.newutf8(l[0], len(l[0])) @@ -697,6 +713,9 @@ if sl == 0: return self._empty() elif step == 1: + if jit.we_are_jitted() and \ + self._unroll_slice_heuristic(start, stop, w_index.w_stop): + return self._unicode_sliced_constant_index_jit(space, start, stop) assert start >= 0 and stop >= 0 return self._unicode_sliced(space, start, stop) else: @@ -712,7 +731,7 @@ i = 0 while True: next_pos = rutf8.next_codepoint_pos(self._utf8, byte_pos) - builder.append(self._utf8[byte_pos:next_pos]) + builder.append_slice(self._utf8, byte_pos, next_pos) if i == sl - 1: break i += 1 @@ -725,6 +744,9 @@ if start == stop: return self._empty() else: + if (jit.we_are_jitted() and + self._unroll_slice_heuristic(start, stop, w_stop)): + return self._unicode_sliced_constant_index_jit(space, start, stop) return self._unicode_sliced(space, start, stop) def _unicode_sliced(self, space, start, stop): @@ -736,6 +758,31 @@ byte_stop = self._index_to_byte(stop) return W_UnicodeObject(self._utf8[byte_start:byte_stop], stop - start) + @jit.unroll_safe + def _unicode_sliced_constant_index_jit(self, space, start, stop): + assert start >= 0 + assert stop >= 0 + byte_start = 0 + for i in range(start): + byte_start = next_codepoint_pos_dont_look_inside(self._utf8, byte_start) + byte_stop = len(self._utf8) + for i in range(self._len() - stop): + byte_stop = prev_codepoint_pos_dont_look_inside(self._utf8, byte_stop) + return W_UnicodeObject(self._utf8[byte_start:byte_stop], stop - start) + + def _unroll_slice_heuristic(self, start, stop, w_stop): + from pypy.objspace.std.intobject import W_IntObject + # the reason we use the *wrapped* stop is that for + # w_stop == wrapped -1, or w_None the stop that is computed will *not* + # be constant, because the length is often not constant. + return (not self.is_ascii() and + jit.isconstant(start) and + (jit.isconstant(w_stop) or + (isinstance(w_stop, W_IntObject) and + jit.isconstant(w_stop.intval))) and + start <= MAX_UNROLL_NEXT_CODEPOINT_POS and + self._len() - stop <= MAX_UNROLL_NEXT_CODEPOINT_POS) + def descr_capitalize(self, space): value = self._utf8 if len(value) == 0: @@ -862,22 +909,48 @@ return storage def _getitem_result(self, space, index): + if (jit.we_are_jitted() and + not self.is_ascii() and + jit.isconstant(index) and + -MAX_UNROLL_NEXT_CODEPOINT_POS <= index <= MAX_UNROLL_NEXT_CODEPOINT_POS): + return self._getitem_result_constant_index_jit(space, index) if index < 0: index += self._length if index < 0 or index >= self._length: raise oefmt(space.w_IndexError, "string index out of range") start = self._index_to_byte(index) - end = rutf8.next_codepoint_pos(self._utf8, start) + # we must not inline next_codepoint_pos, otherwise we produce a guard! + end = self.next_codepoint_pos_dont_look_inside(start) + return W_UnicodeObject(self._utf8[start:end], 1) + + @jit.unroll_safe + def _getitem_result_constant_index_jit(self, space, index): + # for small known indices, call next/prev_codepoint_pos a few times + # instead of possibly creating an index structure + if index < 0: + posindex = index + self._length + if posindex < 0: + raise oefmt(space.w_IndexError, "string index out of range") + end = len(self._utf8) + start = self.prev_codepoint_pos_dont_look_inside(end) + for i in range(-index-1): + end = start + start = self.prev_codepoint_pos_dont_look_inside(start) + else: + if index >= self._length: + raise oefmt(space.w_IndexError, "string index out of range") + start = 0 + end = self.next_codepoint_pos_dont_look_inside(start) + for i in range(index): + start = end + end = self.next_codepoint_pos_dont_look_inside(end) + assert start >= 0 + assert end >= 0 return W_UnicodeObject(self._utf8[start:end], 1) def is_ascii(self): return self._length == len(self._utf8) - def _has_surrogates(self): - if self.is_ascii(): - return False - return rutf8.has_surrogates(self._utf8) - def _index_to_byte(self, index): if self.is_ascii(): assert index >= 0 @@ -885,6 +958,35 @@ return rutf8.codepoint_position_at_index( self._utf8, self._get_index_storage(), index) + def _codepoints_in_utf8(self, start, end): + if self.is_ascii(): + return end - start + return rutf8.codepoints_in_utf8(self._utf8, start, end) + + def _byte_to_index(self, bytepos): + """ this returns index such that self._index_to_byte(index) == bytepos + NB: this is slow! roughly logarithmic with a big constant + """ + if self.is_ascii(): + return bytepos + return rutf8.codepoint_index_at_byte_position( + self._utf8, self._get_index_storage(), bytepos, self._len()) + + def next_codepoint_pos_dont_look_inside(self, pos): + if self.is_ascii(): + return pos + 1 + return next_codepoint_pos_dont_look_inside(self._utf8, pos) + + def prev_codepoint_pos_dont_look_inside(self, pos): + if self.is_ascii(): + return pos - 1 + return prev_codepoint_pos_dont_look_inside(self._utf8, pos) + + def codepoint_at_pos_dont_look_inside(self, pos): + if self.is_ascii(): + return ord(self._utf8[pos]) + return codepoint_at_pos_dont_look_inside(self._utf8, pos) + @always_inline def _unwrap_and_search(self, space, w_sub, w_start, w_end, forward=True): w_sub = self.convert_arg_to_w_unicode(space, w_sub) @@ -906,16 +1008,14 @@ res_index = self._utf8.find(w_sub._utf8, start_index, end_index) if res_index < 0: return None - skip = rutf8.codepoints_in_utf8(self._utf8, start_index, res_index) - res = start + skip + res = self._byte_to_index(res_index) assert res >= 0 return space.newint(res) else: res_index = self._utf8.rfind(w_sub._utf8, start_index, end_index) if res_index < 0: return None - skip = rutf8.codepoints_in_utf8(self._utf8, res_index, end_index) - res = end - skip + res = self._byte_to_index(res_index) assert res >= 0 return space.newint(res) @@ -995,9 +1095,11 @@ lgt -= 1 if right: - while rpos > lpos and rutf8.isspace(value, - rutf8.prev_codepoint_pos(value, rpos)): - rpos = rutf8.prev_codepoint_pos(value, rpos) + while rpos > lpos: + prev = rutf8.prev_codepoint_pos(value, rpos) + if not rutf8.isspace(value, prev): + break + rpos = prev lgt -= 1 assert rpos >= lpos # annotator hint, don't remove @@ -1018,9 +1120,11 @@ lgt -= 1 if right: - while rpos > lpos and rutf8.utf8_in_chars(value, - rutf8.prev_codepoint_pos(value, rpos), chars): - rpos = rutf8.prev_codepoint_pos(value, rpos) + while rpos > lpos: + prev = rutf8.prev_codepoint_pos(value, rpos) + if not rutf8.utf8_in_chars(value, prev, chars): + break + rpos = prev lgt -= 1 assert rpos >= lpos # annotator hint, don't remove @@ -1095,11 +1199,11 @@ if rutf8.has_surrogates(utf8): utf8 = rutf8.reencode_utf8_with_surrogates(utf8) return space.newbytes(utf8) - return encode(space, w_obj, encoding, errors) + return encode(space, w_obj, encoding, errors) def decode_object(space, w_obj, encoding, errors): - from pypy.module._codecs.interp_codecs import lookup_codec, decode + from pypy.module._codecs.interp_codecs import lookup_codec, decode if errors is None or errors == 'strict': # fast paths if encoding is None: @@ -1109,7 +1213,7 @@ unicodehelper.check_ascii_or_raise(space, s) return space.newutf8(s, len(s)) if encoding == 'utf-8' or encoding == 'utf8': - if (space.isinstance_w(w_obj, space.w_unicode) or + if (space.isinstance_w(w_obj, space.w_unicode) or space.isinstance_w(w_obj, space.w_bytes)): s = space.utf8_w(w_obj) else: @@ -1704,13 +1808,11 @@ ) W_UnicodeObject.typedef.flag_sequence_bug_compat = True - def _create_list_from_unicode(value): # need this helper function to allow the jit to look inside and inline - # listview_unicode + # listview_ascii return [s for s in value] - W_UnicodeObject.EMPTY = W_UnicodeObject('', 0) @@ -1718,34 +1820,28 @@ def unicode_to_decimal_w(space, w_unistr): if not isinstance(w_unistr, W_UnicodeObject): raise oefmt(space.w_TypeError, "expected unicode, got '%T'", w_unistr) - unistr = w_unistr._utf8 - result = ['\0'] * w_unistr._length - digits = ['0', '1', '2', '3', '4', - '5', '6', '7', '8', '9'] - res_pos = 0 - iter = rutf8.Utf8StringIterator(unistr) - for uchr in iter: + utf8 = w_unistr._utf8 + result = StringBuilder(w_unistr._len()) + it = rutf8.Utf8StringIterator(utf8) + for uchr in it: if W_UnicodeObject._isspace(uchr): - result[res_pos] = ' ' - res_pos += 1 + result.append(' ') continue - try: - result[res_pos] = digits[unicodedb.decimal(uchr)] - except KeyError: - if 0 < uchr < 256: - result[res_pos] = chr(uchr) - else: + if not (0 < uchr < 256): + try: + uchr = ord('0') + unicodedb.decimal(uchr) + except KeyError: w_encoding = space.newtext('decimal') - pos = iter.get_pos() + pos = it.get_pos() w_start = space.newint(pos) - w_end = space.newint(pos+1) + w_end = space.newint(pos + 1) w_reason = space.newtext('invalid decimal Unicode string') raise OperationError(space.w_UnicodeEncodeError, - space.newtuple([w_encoding, w_unistr, - w_start, w_end, - w_reason])) - res_pos += 1 - return ''.join(result) + space.newtuple([w_encoding, w_unistr, + w_start, w_end, + w_reason])) + result.append(chr(uchr)) + return result.build() _repr_function = rutf8.make_utf8_escape_function( diff -Nru pypy-7.1.1+dfsg/pypy/objspace/test/apptest_binop_overriding.py pypy-7.3.1+dfsg/pypy/objspace/test/apptest_binop_overriding.py --- pypy-7.1.1+dfsg/pypy/objspace/test/apptest_binop_overriding.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/objspace/test/apptest_binop_overriding.py 2020-04-10 19:28:41.000000000 +0000 @@ -0,0 +1,16 @@ +def test_overriding_base_binop_explict(): + class MulBase(object): + def __init__(self, value): + self.value = value + def __mul__(self, other): + return self.value * other.value + def __rmul__(self, other): + return other.value * self.value + class DoublerBase(MulBase): + def __mul__(self, other): + return 2 * (self.value * other.value) + class AnotherDoubler(DoublerBase): + pass + res = DoublerBase(2) * AnotherDoubler(3) + assert res == 12 + diff -Nru pypy-7.1.1+dfsg/pypy/objspace/test/apptest_descriptor.py pypy-7.3.1+dfsg/pypy/objspace/test/apptest_descriptor.py --- pypy-7.1.1+dfsg/pypy/objspace/test/apptest_descriptor.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/objspace/test/apptest_descriptor.py 2020-04-10 19:28:41.000000000 +0000 @@ -0,0 +1,170 @@ +def test_non_data_descr(): + class X(object): + def f(self): + return 42 + x = X() + assert x.f() == 42 + x.f = 43 + assert x.f == 43 + del x.f + assert x.f() == 42 + +def test_set_without_get(): + class Descr(object): + + def __init__(self, name): + self.name = name + + def __set__(self, obj, value): + obj.__dict__[self.name] = value + descr = Descr("a") + + class X(object): + a = descr + + x = X() + assert x.a is descr + x.a = 42 + assert x.a == 42 + +def test_failing_get(): + # when __get__() raises AttributeError, + # __getattr__ is called... + class X(object): + def get_v(self): + raise AttributeError + v = property(get_v) + + def __getattr__(self, name): + if name == 'v': + return 42 + x = X() + assert x.v == 42 + + # ... but the __dict__ is not searched + class Y(object): + def get_w(self): + raise AttributeError + def set_w(self, value): + raise AttributeError + w = property(get_w, set_w) + y = Y() + y.__dict__['w'] = 42 + raises(AttributeError, getattr, y, 'w') + +def test_member(): + class X(object): + def __init__(self): + self._v = 0 + def get_v(self): + return self._v + def set_v(self, v): + self._v = v + v = property(get_v, set_v) + x = X() + assert x.v == 0 + assert X.v.__get__(x) == 0 + x.v = 1 + assert x.v == 1 + X.v.__set__(x, 0) + assert x.v == 0 + raises(AttributeError, delattr, x, 'v') + raises(AttributeError, X.v.__delete__, x) + +def test_special_methods_returning_strings(): + class A(object): + seen = [] + def __str__(self): + self.seen.append(1) + def __repr__(self): + self.seen.append(2) + def __oct__(self): + self.seen.append(3) + def __hex__(self): + self.seen.append(4) + + inst = A() + raises(TypeError, str, inst) + raises(TypeError, repr, inst) + raises(TypeError, oct, inst) + raises(TypeError, hex, inst) + assert A.seen == [1,2,3,4] + +def test_hash(): + class A(object): + pass + hash(A()) + + # as in CPython, for new-style classes we don't check if + # __eq__ is overridden without __hash__ being overridden, + # and so hash(B()) always just works (but gives a slightly + # useless result). + class B(object): + def __eq__(self, other): pass + hash(B()) + + # same as above for __cmp__ + class C(object): + def __cmp__(self, other): pass + hash(C()) + + class E(object): + def __hash__(self): + return "something" + raises(TypeError, hash, E()) + class F: # can return long + def __hash__(self): + return long(2**33) + assert hash(F()) == hash(2**33) # 2.5 behavior + + class G: + def __hash__(self): + return 1 + assert isinstance(hash(G()), int) + + # __hash__ can return a subclass of long, but the fact that it's + # a subclass is ignored + class mylong(long): + def __hash__(self): + return 0 + class H(object): + def __hash__(self): + return mylong(42) + assert hash(H()) == hash(42L) + + # don't return a subclass of int, either + class myint(int): + pass + class I(object): + def __hash__(self): + return myint(15) + assert hash(I()) == 15 + assert type(hash(I())) is int + + # check hashing of -1 to -2 + class myint(int): + pass + class mylong(long): + pass + class myfloat(float): + pass + class myHashClass(object): + def __hash__(self): + return -1 + class myHashClass2(object): + def __hash__(self): + return -1L + class myHashClass3(object): + def __hash__(self): + return -10**100 + + assert hash(-1) == -2 + assert hash(-1L) == -2 + assert hash(-1.0) == -2 + assert hash(-1 + 0j) == -2 + assert hash(myint(-1)) == -2 + assert hash(mylong(-1)) == -2 + assert hash(myfloat(-1.0)) == -2 + assert hash(myHashClass()) == -2 + assert hash(myHashClass2()) == -2 + assert hash(myHashClass3()) == hash(-10**100) diff -Nru pypy-7.1.1+dfsg/pypy/objspace/test/apptest_descroperation.py pypy-7.3.1+dfsg/pypy/objspace/test/apptest_descroperation.py --- pypy-7.1.1+dfsg/pypy/objspace/test/apptest_descroperation.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/objspace/test/apptest_descroperation.py 2020-04-10 19:28:41.000000000 +0000 @@ -0,0 +1,786 @@ +def test_special_methods(): + class OldStyle: + pass + for base in (object, OldStyle,): + class A(base): + def __lt__(self, other): + return "lt" + def __imul__(self, other): + return "imul" + def __sub__(self, other): + return "sub" + def __rsub__(self, other): + return "rsub" + def __pow__(self, other): + return "pow" + def __rpow__(self, other): + return "rpow" + def __neg__(self): + return "neg" + a = A() + assert (a < 5) == "lt" + assert (object() > a) == "lt" + a1 = a + a1 *= 4 + assert a1 == "imul" + assert a - 2 == "sub" + assert a - object() == "sub" + assert 2 - a == "rsub" + assert object() - a == "rsub" + assert a ** 2 == "pow" + assert a ** object() == "pow" + assert 2 ** a == "rpow" + assert object() ** a == "rpow" + assert -a == "neg" + + class B(A): + def __lt__(self, other): + return "B's lt" + def __imul__(self, other): + return "B's imul" + def __sub__(self, other): + return "B's sub" + def __rsub__(self, other): + return "B's rsub" + def __pow__(self, other): + return "B's pow" + def __rpow__(self, other): + return "B's rpow" + def __neg__(self): + return "B's neg" + + b = B() + assert (a < b) == "lt" + assert (b > a) == "lt" + b1 = b + b1 *= a + assert b1 == "B's imul" + a1 = a + a1 *= b + assert a1 == "imul" + + if base is object: + assert a - b == "B's rsub" + else: + assert a - b == "sub" + assert b - a == "B's sub" + assert b - b == "B's sub" + if base is object: + assert a ** b == "B's rpow" + else: + assert a ** b == "pow" + assert b ** a == "B's pow" + assert b ** b == "B's pow" + assert -b == "B's neg" + + class C(B): + pass + c = C() + assert c - 1 == "B's sub" + assert 1 - c == "B's rsub" + assert c - b == "B's sub" + assert b - c == "B's sub" + + assert c ** 1 == "B's pow" + assert 1 ** c == "B's rpow" + assert c ** b == "B's pow" + assert b ** c == "B's pow" + +def test_getslice(): + class Sq(object): + def __getslice__(self, start, stop): + return (start, stop) + def __getitem__(self, key): + return "booh" + def __len__(self): + return 100 + + sq = Sq() + + assert sq[1:3] == (1,3) + slice_min, slice_max = sq[:] + assert slice_min == 0 + assert slice_max >= 2**31-1 + assert sq[1:] == (1, slice_max) + assert sq[:3] == (0, 3) + assert sq[:] == (0, slice_max) + # negative indices + assert sq[-1:3] == (99, 3) + assert sq[1:-3] == (1, 97) + assert sq[-1:-3] == (99, 97) + # extended slice syntax always uses __getitem__() + assert sq[::] == "booh" + +def test_setslice(): + class Sq(object): + def __setslice__(self, start, stop, sequence): + ops.append((start, stop, sequence)) + def __setitem__(self, key, value): + raise AssertionError(key) + def __len__(self): + return 100 + + sq = Sq() + ops = [] + sq[-5:3] = 'hello' + sq[12:] = 'world' + sq[:-1] = 'spam' + sq[:] = 'egg' + slice_max = ops[-1][1] + assert slice_max >= 2**31-1 + + assert ops == [ + (95, 3, 'hello'), + (12, slice_max, 'world'), + (0, 99, 'spam'), + (0, slice_max, 'egg'), + ] + +def test_delslice(): + class Sq(object): + def __delslice__(self, start, stop): + ops.append((start, stop)) + def __delitem__(self, key): + raise AssertionError(key) + def __len__(self): + return 100 + + sq = Sq() + ops = [] + del sq[5:-3] + del sq[-12:] + del sq[:1] + del sq[:] + slice_max = ops[-1][1] + assert slice_max >= 2**31-1 + + assert ops == [ + (5, 97), + (88, slice_max), + (0, 1), + (0, slice_max), + ] + +def test_getslice_nolength(): + class Sq(object): + def __getslice__(self, start, stop): + return (start, stop) + def __getitem__(self, key): + return "booh" + + sq = Sq() + + assert sq[1:3] == (1,3) + slice_min, slice_max = sq[:] + assert slice_min == 0 + assert slice_max >= 2**31-1 + assert sq[1:] == (1, slice_max) + assert sq[:3] == (0, 3) + assert sq[:] == (0, slice_max) + # negative indices, but no __len__ + assert sq[-1:3] == (-1, 3) + assert sq[1:-3] == (1, -3) + assert sq[-1:-3] == (-1, -3) + # extended slice syntax always uses __getitem__() + assert sq[::] == "booh" + +def test_ipow(): + x = 2 + x **= 5 + assert x == 32 + +def test_typechecks(): + class myint(int): + pass + class X(object): + def __nonzero__(self): + return myint(1) + raises(TypeError, "not X()") + +def test_string_subclass(): + class S(str): + def __hash__(self): + return 123 + s = S("abc") + setattr(s, s, s) + assert len(s.__dict__) == 1 + # this behavior changed in 2.4 + #assert type(s.__dict__.keys()[0]) is str # don't store S keys + #assert s.abc is s + assert getattr(s,s) is s + +def test_notimplemented(): + #import types + import operator + + def specialmethod(self, other): + return NotImplemented + + def check(expr, x, y, operator=operator): + raises(TypeError, expr) + + for metaclass in [type]: # [type, types.ClassType]: + for name, expr, iexpr in [ + ('__add__', 'x + y', 'x += y'), + ('__sub__', 'x - y', 'x -= y'), + ('__mul__', 'x * y', 'x *= y'), + ('__truediv__', 'operator.truediv(x, y)', None), + ('__floordiv__', 'operator.floordiv(x, y)', None), + ('__div__', 'x / y', 'x /= y'), + ('__mod__', 'x % y', 'x %= y'), + ('__divmod__', 'divmod(x, y)', None), + ('__pow__', 'x ** y', 'x **= y'), + ('__lshift__', 'x << y', 'x <<= y'), + ('__rshift__', 'x >> y', 'x >>= y'), + ('__and__', 'x & y', 'x &= y'), + ('__or__', 'x | y', 'x |= y'), + ('__xor__', 'x ^ y', 'x ^= y'), + ('__coerce__', 'coerce(x, y)', None)]: + if name == '__coerce__': + rname = name + else: + rname = '__r' + name[2:] + A = metaclass('A', (), {name: specialmethod}) + B = metaclass('B', (), {rname: specialmethod}) + a = A() + b = B() + check(expr, a, a) + check(expr, a, b) + check(expr, b, a) + check(expr, b, b) + check(expr, a, 5) + check(expr, 5, b) + if iexpr: + check(iexpr, a, a) + check(iexpr, a, b) + check(iexpr, b, a) + check(iexpr, b, b) + check(iexpr, a, 5) + iname = '__i' + name[2:] + C = metaclass('C', (), {iname: specialmethod}) + c = C() + check(iexpr, c, a) + check(iexpr, c, b) + check(iexpr, c, 5) + +def test_string_results(): + class A(object): + def __str__(self): + return answer * 2 + def __repr__(self): + return answer * 3 + def __hex__(self): + return answer * 4 + def __oct__(self): + return answer * 5 + + for operate, n in [(str, 2), (repr, 3), (hex, 4), (oct, 5)]: + answer = "hello" + assert operate(A()) == "hello" * n + if operate not in (hex, oct): + answer = u"world" + assert operate(A()) == "world" * n + assert type(operate(A())) is str + answer = 42 + excinfo = raises(TypeError, operate, A()) + assert "returned non-string (type 'int')" in str(excinfo.value) + +def test_missing_getattribute(): + class X(object): + pass + + class Y(X): + class __metaclass__(type): + def mro(cls): + return [cls, X] + + x = X() + x.__class__ = Y + raises(AttributeError, getattr, x, 'a') + +def test_silly_but_consistent_order(): + # incomparable objects sort by type name :-/ + class A(object): + pass + class zz(object): + pass + assert A() < zz() + assert zz() > A() + # if in doubt, CPython sorts numbers before non-numbers + assert 0 < () + assert 0L < () + assert 0.0 < () + assert 0j < () + assert 0 < [] + assert 0L < [] + assert 0.0 < [] + assert 0j < [] + assert 0 < A() + assert 0L < A() + assert 0.0 < A() + assert 0j < A() + assert 0 < zz() + assert 0L < zz() + assert 0.0 < zz() + assert 0j < zz() + # what if the type name is the same... whatever, but + # be consistent + a1 = A() + a2 = A() + class A(object): pass + a3 = A() + a4 = A() + assert (a1 < a3) == (a1 < a4) == (a2 < a3) == (a2 < a4) + +def test_setattrweakref(): + skip("fails, works in cpython") + # The issue is that in CPython, none of the built-in types have + # a __weakref__ descriptor, even if their instances are weakrefable. + # Should we emulate this? + class P(object): + pass + + setattr(P, "__weakref__", 0) + +def test_subclass_addition(): + # the __radd__ is never called (compare with the next test) + l = [] + class A(object): + def __add__(self, other): + l.append(self.__class__) + l.append(other.__class__) + return 123 + def __radd__(self, other): + # should never be called! + return 456 + class B(A): + pass + res1 = A() + B() + res2 = B() + A() + assert res1 == res2 == 123 + assert l == [A, B, B, A] + +def test_subclass_comparison(): + # the __eq__ *is* called with reversed arguments + l = [] + class A(object): + def __eq__(self, other): + l.append(self.__class__) + l.append(other.__class__) + return False + + def __lt__(self, other): + l.append(self.__class__) + l.append(other.__class__) + return False + + class B(A): + pass + + A() == B() + A() < B() + B() < A() + assert l == [B, A, A, B, B, A] + +def test_subclass_comparison_more(): + # similarly, __gt__(b,a) is called instead of __lt__(a,b) + l = [] + class A(object): + def __lt__(self, other): + l.append(self.__class__) + l.append(other.__class__) + return '<' + def __gt__(self, other): + l.append(self.__class__) + l.append(other.__class__) + return '>' + class B(A): + pass + res1 = A() < B() + res2 = B() < A() + assert res1 == '>' and res2 == '<' + assert l == [B, A, B, A] + +def test_rich_comparison(): + # Old-style + class A: + def __init__(self, a): + self.a = a + def __eq__(self, other): + return self.a == other.a + class B: + def __init__(self, a): + self.a = a + # New-style + class C(object): + def __init__(self, a): + self.a = a + def __eq__(self, other): + return self.a == other.a + class D(object): + def __init__(self, a): + self.a = a + + assert A(1) == B(1) + assert B(1) == A(1) + assert A(1) == C(1) + assert C(1) == A(1) + assert A(1) == D(1) + assert D(1) == A(1) + assert C(1) == D(1) + assert D(1) == C(1) + assert not(A(1) == B(2)) + assert not(B(1) == A(2)) + assert not(A(1) == C(2)) + assert not(C(1) == A(2)) + assert not(A(1) == D(2)) + assert not(D(1) == A(2)) + assert not(C(1) == D(2)) + assert not(D(1) == C(2)) + +def test_partial_ordering(): + class A(object): + def __lt__(self, other): + return self + a1 = A() + a2 = A() + assert (a1 < a2) is a1 + assert (a1 > a2) is a2 + +def test_eq_order(): + class A(object): + def __eq__(self, other): return self.__class__.__name__+':A.eq' + def __ne__(self, other): return self.__class__.__name__+':A.ne' + def __lt__(self, other): return self.__class__.__name__+':A.lt' + def __le__(self, other): return self.__class__.__name__+':A.le' + def __gt__(self, other): return self.__class__.__name__+':A.gt' + def __ge__(self, other): return self.__class__.__name__+':A.ge' + class B(object): + def __eq__(self, other): return self.__class__.__name__+':B.eq' + def __ne__(self, other): return self.__class__.__name__+':B.ne' + def __lt__(self, other): return self.__class__.__name__+':B.lt' + def __le__(self, other): return self.__class__.__name__+':B.le' + def __gt__(self, other): return self.__class__.__name__+':B.gt' + def __ge__(self, other): return self.__class__.__name__+':B.ge' + # + assert (A() == B()) == 'A:A.eq' + assert (A() != B()) == 'A:A.ne' + assert (A() < B()) == 'A:A.lt' + assert (A() <= B()) == 'A:A.le' + assert (A() > B()) == 'A:A.gt' + assert (A() >= B()) == 'A:A.ge' + # + assert (B() == A()) == 'B:B.eq' + assert (B() != A()) == 'B:B.ne' + assert (B() < A()) == 'B:B.lt' + assert (B() <= A()) == 'B:B.le' + assert (B() > A()) == 'B:B.gt' + assert (B() >= A()) == 'B:B.ge' + # + class C(A): + def __eq__(self, other): return self.__class__.__name__+':C.eq' + def __ne__(self, other): return self.__class__.__name__+':C.ne' + def __lt__(self, other): return self.__class__.__name__+':C.lt' + def __le__(self, other): return self.__class__.__name__+':C.le' + def __gt__(self, other): return self.__class__.__name__+':C.gt' + def __ge__(self, other): return self.__class__.__name__+':C.ge' + # + assert (A() == C()) == 'C:C.eq' + assert (A() != C()) == 'C:C.ne' + assert (A() < C()) == 'C:C.gt' + assert (A() <= C()) == 'C:C.ge' + assert (A() > C()) == 'C:C.lt' + assert (A() >= C()) == 'C:C.le' + # + assert (C() == A()) == 'C:C.eq' + assert (C() != A()) == 'C:C.ne' + assert (C() < A()) == 'C:C.lt' + assert (C() <= A()) == 'C:C.le' + assert (C() > A()) == 'C:C.gt' + assert (C() >= A()) == 'C:C.ge' + # + class D(A): + pass + # + assert (A() == D()) == 'D:A.eq' + assert (A() != D()) == 'D:A.ne' + assert (A() < D()) == 'D:A.gt' + assert (A() <= D()) == 'D:A.ge' + assert (A() > D()) == 'D:A.lt' + assert (A() >= D()) == 'D:A.le' + # + assert (D() == A()) == 'D:A.eq' + assert (D() != A()) == 'D:A.ne' + assert (D() < A()) == 'D:A.lt' + assert (D() <= A()) == 'D:A.le' + assert (D() > A()) == 'D:A.gt' + assert (D() >= A()) == 'D:A.ge' + +def test_addition(): + # Old-style + class A: + def __init__(self, a): + self.a = a + def __add__(self, other): + return self.a + other.a + __radd__ = __add__ + class B: + def __init__(self, a): + self.a = a + # New-style + class C(object): + def __init__(self, a): + self.a = a + def __add__(self, other): + return self.a + other.a + __radd__ = __add__ + class D(object): + def __init__(self, a): + self.a = a + + assert A(1) + B(2) == 3 + assert B(1) + A(2) == 3 + assert A(1) + C(2) == 3 + assert C(1) + A(2) == 3 + assert A(1) + D(2) == 3 + assert D(1) + A(2) == 3 + assert C(1) + D(2) == 3 + assert D(1) + C(2) == 3 + +def test_mod_failure(): + try: + [] % 3 + except TypeError as e: + assert '%' in str(e) + else: + assert False, "did not raise" + +def test_invalid_iterator(): + class x(object): + def __iter__(self): + return self + raises(TypeError, iter, x()) + +def test_attribute_error(): + class classmethodonly(classmethod): + def __get__(self, instance, type): + if instance is not None: + raise AttributeError("Must be called on a class, not an instance.") + return super(classmethodonly, self).__get__(instance, type) + + class A(object): + @classmethodonly + def a(cls): + return 3 + + raises(AttributeError, lambda: A().a) + +def test_delete_descriptor(): + class Prop(object): + def __get__(self, obj, cls): + return 42 + def __delete__(self, obj): + obj.deleted = True + class C(object): + x = Prop() + obj = C() + del obj.x + assert obj.deleted + +def test_non_callable(): + meth = classmethod(1).__get__(1) + raises(TypeError, meth) + +def test_isinstance_and_issubclass(): + class Meta(type): + def __instancecheck__(cls, instance): + if cls is A: + return True + return False + def __subclasscheck__(cls, sub): + if cls is B: + return True + return False + class A: + __metaclass__ = Meta + class B(A): + pass + a = A() + b = B() + assert isinstance(a, A) # "shortcut" does not go through metaclass + assert not isinstance(a, B) + assert isinstance(b, A) + assert isinstance(b, B) # "shortcut" does not go through metaclass + assert isinstance(4, A) + assert not issubclass(A, A) + assert not issubclass(B, A) + assert issubclass(A, B) + assert issubclass(B, B) + assert issubclass(23, B) + +def test_issubclass_and_method(): + class Meta(type): + def __subclasscheck__(cls, sub): + if sub is Dict: + return True + class A: + __metaclass__ = Meta + def method(self): + return 42 + class Dict: + method = A.method + assert Dict().method() == 42 + +def test_truth_of_long(): + class X(object): + def __len__(self): return 1L + __nonzero__ = __len__ + raises(TypeError, bool, X()) # must return bool or int, not long + del X.__nonzero__ + assert X() + +def test_len_overflow(): + import sys + class X(object): + def __len__(self): + return sys.maxsize + 1 + raises(OverflowError, len, X()) + raises(OverflowError, bool, X()) + +def test_len_underflow(): + import sys + class X(object): + def __len__(self): + return -1 + raises(ValueError, len, X()) + raises(ValueError, bool, X()) + class Y(object): + def __len__(self): + return -1L + raises(ValueError, len, Y()) + raises(ValueError, bool, Y()) + +def test_len_custom__int__(): + class X(object): + def __init__(self, x): + self.x = x + def __len__(self): + return self.x + def __int__(self): + return self.x + + l = len(X(3.0)) + assert l == 3 and type(l) is int + assert X(3.0) + assert not X(0.0) + l = len(X(X(2))) + assert l == 2 and type(l) is int + assert X(X(2)) + assert not X(X(0)) + +def test_bool___contains__(): + class X(object): + def __contains__(self, item): + if item == 'foo': + return 42 + else: + return 'hello world' + x = X() + res = 'foo' in x + assert res is True + res = 'bar' in x + assert res is True + # + class MyError(Exception): + pass + class CannotConvertToBool(object): + def __nonzero__(self): + raise MyError + class X(object): + def __contains__(self, item): + return CannotConvertToBool() + x = X() + raises(MyError, "'foo' in x") + +def test___cmp___fake_int(): + class MyInt(object): + def __init__(self, x): + self.x = x + def __int__(self): + return self.x + class X(object): + def __cmp__(self, other): + return MyInt(0) + + assert X() == 'hello' + +def test_sequence_rmul_overrides(): + class oops(object): + def __rmul__(self, other): + return 42 + def __index__(self): + return 3 + assert '2' * oops() == 42 + assert [2] * oops() == 42 + assert (2,) * oops() == 42 + assert u'2' * oops() == 42 + assert bytearray('2') * oops() == 42 + assert 1000 * oops() == 42 + assert '2'.__mul__(oops()) == '222' + x = '2' + x *= oops() + assert x == 42 + x = [2] + x *= oops() + assert x == 42 + +def test_sequence_rmul_overrides_oldstyle(): + class oops: + def __rmul__(self, other): + return 42 + def __index__(self): + return 3 + assert '2' * oops() == 42 + assert [2] * oops() == 42 + assert (2,) * oops() == 42 + assert u'2' * oops() == 42 + assert bytearray('2') * oops() == 42 + assert 1000 * oops() == 42 + assert '2'.__mul__(oops()) == '222' + +def test_sequence_radd_overrides(): + class A1(list): + pass + class A2(list): + def __radd__(self, other): + return 42 + assert [2] + A1([3]) == [2, 3] + assert type([2] + A1([3])) is list + assert [2] + A2([3]) == 42 + x = "2" + x += A2([3]) + assert x == 42 + x = [2] + x += A2([3]) + assert x == 42 + +def test_data_descriptor_without_delete(): + class D(object): + def __set__(self, x, y): + pass + class A(object): + d = D() + raises(AttributeError, "del A().d") + +def test_data_descriptor_without_set(): + class D(object): + def __delete__(self, x): + pass + class A(object): + d = D() + raises(AttributeError, "A().d = 5") + +def test_not_subscriptable_error_gives_keys(): + d = {'key1': {'key2': {'key3': None}}} + excinfo = raises(TypeError, "d['key1']['key2']['key3']['key4']['key5']") + assert "key4" in str(excinfo.value) diff -Nru pypy-7.1.1+dfsg/pypy/objspace/test/test_binop_overriding.py pypy-7.3.1+dfsg/pypy/objspace/test/test_binop_overriding.py --- pypy-7.1.1+dfsg/pypy/objspace/test/test_binop_overriding.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/objspace/test/test_binop_overriding.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,171 +0,0 @@ -# test about the binop operation rule, see issue 412 -from pypy.conftest import option - -class AppTestBinopCombinations: - - def setup_class(cls): - w_helpers = cls.space.appexec([], """(): - class Base(object): - def __init__(self, name): - self.name = name - - def lookup_where(obj, name): - mro = type(obj).__mro__ - for t in mro: - if name in t.__dict__: - return t.__dict__[name], t - return None, None - - def refop(x, y, opname, ropname): - # this has been validated by running the tests on top of cpython - # so for the space of possibilities that the tests touch it is known - # to behave like cpython as long as the latter doesn't change its own - # algorithm - t1 = type(x) - t2 = type(y) - op, where1 = lookup_where(x, opname) - rop, where2 = lookup_where(y, ropname) - if op is None and rop is not None: - return rop(y, x) - if rop and where1 is not where2: - if (issubclass(t2, t1) and not issubclass(where1, where2) - and not issubclass(t1, where2) - ): - return rop(y, x) - if op is None: - return "TypeError" - return op(x,y) - - def do_test(X, Y, name, impl): - x = X('x') - y = Y('y') - opname = '__%s__' % name - ropname = '__r%s__' % name - - count = [0] - fail = [] - - def check(z1, z2): - ref = refop(z1, z2, opname, ropname) - try: - v = impl(z1, z2) - except TypeError: - v = "TypeError" - if v != ref: - fail.append(count[0]) - - def override_in_hier(n=6): - if n == 0: - count[0] += 1 - check(x, y) - check(y, x) - return - - f = lambda self, other: (n, self.name, other.name) - if n%2 == 0: - name = opname - else: - name = ropname - - for C in Y.__mro__: - if name in C.__dict__: - continue - if C is not object: - setattr(C, name, f) - override_in_hier(n-1) - if C is not object: - delattr(C, name) - - override_in_hier() - #print count[0] - return fail - - return Base, do_test -""") - cls.w_helpers = w_helpers - cls.w_appdirect = cls.space.wrap(option.runappdirect) - - def test_overriding_base_binop_explict(self): - class MulBase(object): - def __init__(self, value): - self.value = value - def __mul__(self, other): - return self.value * other.value - def __rmul__(self, other): - return other.value * self.value - class DoublerBase(MulBase): - def __mul__(self, other): - return 2 * (self.value * other.value) - class AnotherDoubler(DoublerBase): - pass - res = DoublerBase(2) * AnotherDoubler(3) - assert res == 12 - - def test_binop_combinations_mul(self): - if not self.appdirect: - skip("slow test, should be run as appdirect test") - Base, do_test = self.helpers - - class X(Base): - pass - class Y(X): - pass - - fail = do_test(X, Y, 'mul', lambda x,y: x*y) - #print len(fail) - assert not fail - - def test_binop_combinations_sub(self): - Base, do_test = self.helpers - class X(Base): - pass - class Y(X): - pass - - fail = do_test(X, Y, 'sub', lambda x,y: x-y) - #print len(fail) - assert not fail - - def test_binop_combinations_pow(self): - if not self.appdirect: - skip("slow test, should be run as appdirect test") - Base, do_test = self.helpers - - class X(Base): - pass - class Y(X): - pass - - fail = do_test(X, Y, 'pow', lambda x,y: x**y) - #print len(fail) - assert not fail - - def test_binop_combinations_more_exhaustive(self): - if not self.appdirect: - skip("very slow test, should be run as appdirect test") - Base, do_test = self.helpers - - class X(Base): - pass - - class B1(object): - pass - - class B2(object): - pass - - class X1(B1, X, B2): - pass - - class C1(object): - pass - - class C2(object): - pass - - class Y(C1, X1, C2): - pass - - fail = do_test(X, Y, 'sub', lambda x,y: x-y) - #print len(fail) - assert not fail diff -Nru pypy-7.1.1+dfsg/pypy/objspace/test/test_descriptor.py pypy-7.3.1+dfsg/pypy/objspace/test/test_descriptor.py --- pypy-7.1.1+dfsg/pypy/objspace/test/test_descriptor.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/objspace/test/test_descriptor.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,171 +0,0 @@ -class AppTest_Descriptor: - def test_non_data_descr(self): - class X(object): - def f(self): - return 42 - x = X() - assert x.f() == 42 - x.f = 43 - assert x.f == 43 - del x.f - assert x.f() == 42 - - def test_set_without_get(self): - class Descr(object): - - def __init__(self, name): - self.name = name - - def __set__(self, obj, value): - obj.__dict__[self.name] = value - descr = Descr("a") - - class X(object): - a = descr - - x = X() - assert x.a is descr - x.a = 42 - assert x.a == 42 - - def test_failing_get(self): - # when __get__() raises AttributeError, - # __getattr__ is called... - class X(object): - def get_v(self): - raise AttributeError - v = property(get_v) - - def __getattr__(self, name): - if name == 'v': - return 42 - x = X() - assert x.v == 42 - - # ... but the __dict__ is not searched - class Y(object): - def get_w(self): - raise AttributeError - def set_w(self, value): - raise AttributeError - w = property(get_w, set_w) - y = Y() - y.__dict__['w'] = 42 - raises(AttributeError, getattr, y, 'w') - - def test_member(self): - class X(object): - def __init__(self): - self._v = 0 - def get_v(self): - return self._v - def set_v(self, v): - self._v = v - v = property(get_v, set_v) - x = X() - assert x.v == 0 - assert X.v.__get__(x) == 0 - x.v = 1 - assert x.v == 1 - X.v.__set__(x, 0) - assert x.v == 0 - raises(AttributeError, delattr, x, 'v') - raises(AttributeError, X.v.__delete__, x) - - def test_special_methods_returning_strings(self): - class A(object): - seen = [] - def __str__(self): - self.seen.append(1) - def __repr__(self): - self.seen.append(2) - def __oct__(self): - self.seen.append(3) - def __hex__(self): - self.seen.append(4) - - inst = A() - raises(TypeError, str, inst) - raises(TypeError, repr, inst) - raises(TypeError, oct, inst) - raises(TypeError, hex, inst) - assert A.seen == [1,2,3,4] - - def test_hash(self): - class A(object): - pass - hash(A()) - - # as in CPython, for new-style classes we don't check if - # __eq__ is overridden without __hash__ being overridden, - # and so hash(B()) always just works (but gives a slightly - # useless result). - class B(object): - def __eq__(self, other): pass - hash(B()) - - # same as above for __cmp__ - class C(object): - def __cmp__(self, other): pass - hash(C()) - - class E(object): - def __hash__(self): - return "something" - raises(TypeError, hash, E()) - class F: # can return long - def __hash__(self): - return long(2**33) - assert hash(F()) == hash(2**33) # 2.5 behavior - - class G: - def __hash__(self): - return 1 - assert isinstance(hash(G()), int) - - # __hash__ can return a subclass of long, but the fact that it's - # a subclass is ignored - class mylong(long): - def __hash__(self): - return 0 - class H(object): - def __hash__(self): - return mylong(42) - assert hash(H()) == hash(42L) - - # don't return a subclass of int, either - class myint(int): - pass - class I(object): - def __hash__(self): - return myint(15) - assert hash(I()) == 15 - assert type(hash(I())) is int - - # check hashing of -1 to -2 - class myint(int): - pass - class mylong(long): - pass - class myfloat(float): - pass - class myHashClass(object): - def __hash__(self): - return -1 - class myHashClass2(object): - def __hash__(self): - return -1L - class myHashClass3(object): - def __hash__(self): - return -10**100 - - assert hash(-1) == -2 - assert hash(-1L) == -2 - assert hash(-1.0) == -2 - assert hash(-1 + 0j) == -2 - assert hash(myint(-1)) == -2 - assert hash(mylong(-1)) == -2 - assert hash(myfloat(-1.0)) == -2 - assert hash(myHashClass()) == -2 - assert hash(myHashClass2()) == -2 - assert hash(myHashClass3()) == hash(-10**100) diff -Nru pypy-7.1.1+dfsg/pypy/objspace/test/test_descroperation.py pypy-7.3.1+dfsg/pypy/objspace/test/test_descroperation.py --- pypy-7.1.1+dfsg/pypy/objspace/test/test_descroperation.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/objspace/test/test_descroperation.py 2020-04-10 19:28:41.000000000 +0000 @@ -1,5 +1,3 @@ - - class Test_DescrOperation: def test_nonzero(self): @@ -28,792 +26,3 @@ assert space.issubtype_w(w_sub, w_base) w_inst = space.call_function(w_sub) assert space.isinstance_w(w_inst, w_base) - - -class AppTest_Descroperation: - def test_special_methods(self): - class OldStyle: - pass - for base in (object, OldStyle,): - class A(base): - def __lt__(self, other): - return "lt" - def __imul__(self, other): - return "imul" - def __sub__(self, other): - return "sub" - def __rsub__(self, other): - return "rsub" - def __pow__(self, other): - return "pow" - def __rpow__(self, other): - return "rpow" - def __neg__(self): - return "neg" - a = A() - assert (a < 5) == "lt" - assert (object() > a) == "lt" - a1 = a - a1 *= 4 - assert a1 == "imul" - assert a - 2 == "sub" - assert a - object() == "sub" - assert 2 - a == "rsub" - assert object() - a == "rsub" - assert a ** 2 == "pow" - assert a ** object() == "pow" - assert 2 ** a == "rpow" - assert object() ** a == "rpow" - assert -a == "neg" - - class B(A): - def __lt__(self, other): - return "B's lt" - def __imul__(self, other): - return "B's imul" - def __sub__(self, other): - return "B's sub" - def __rsub__(self, other): - return "B's rsub" - def __pow__(self, other): - return "B's pow" - def __rpow__(self, other): - return "B's rpow" - def __neg__(self): - return "B's neg" - - b = B() - assert (a < b) == "lt" - assert (b > a) == "lt" - b1 = b - b1 *= a - assert b1 == "B's imul" - a1 = a - a1 *= b - assert a1 == "imul" - - if base is object: - assert a - b == "B's rsub" - else: - assert a - b == "sub" - assert b - a == "B's sub" - assert b - b == "B's sub" - if base is object: - assert a ** b == "B's rpow" - else: - assert a ** b == "pow" - assert b ** a == "B's pow" - assert b ** b == "B's pow" - assert -b == "B's neg" - - class C(B): - pass - c = C() - assert c - 1 == "B's sub" - assert 1 - c == "B's rsub" - assert c - b == "B's sub" - assert b - c == "B's sub" - - assert c ** 1 == "B's pow" - assert 1 ** c == "B's rpow" - assert c ** b == "B's pow" - assert b ** c == "B's pow" - - def test_getslice(self): - class Sq(object): - def __getslice__(self, start, stop): - return (start, stop) - def __getitem__(self, key): - return "booh" - def __len__(self): - return 100 - - sq = Sq() - - assert sq[1:3] == (1,3) - slice_min, slice_max = sq[:] - assert slice_min == 0 - assert slice_max >= 2**31-1 - assert sq[1:] == (1, slice_max) - assert sq[:3] == (0, 3) - assert sq[:] == (0, slice_max) - # negative indices - assert sq[-1:3] == (99, 3) - assert sq[1:-3] == (1, 97) - assert sq[-1:-3] == (99, 97) - # extended slice syntax always uses __getitem__() - assert sq[::] == "booh" - - def test_setslice(self): - class Sq(object): - def __setslice__(self, start, stop, sequence): - ops.append((start, stop, sequence)) - def __setitem__(self, key, value): - raise AssertionError(key) - def __len__(self): - return 100 - - sq = Sq() - ops = [] - sq[-5:3] = 'hello' - sq[12:] = 'world' - sq[:-1] = 'spam' - sq[:] = 'egg' - slice_max = ops[-1][1] - assert slice_max >= 2**31-1 - - assert ops == [ - (95, 3, 'hello'), - (12, slice_max, 'world'), - (0, 99, 'spam'), - (0, slice_max, 'egg'), - ] - - def test_delslice(self): - class Sq(object): - def __delslice__(self, start, stop): - ops.append((start, stop)) - def __delitem__(self, key): - raise AssertionError(key) - def __len__(self): - return 100 - - sq = Sq() - ops = [] - del sq[5:-3] - del sq[-12:] - del sq[:1] - del sq[:] - slice_max = ops[-1][1] - assert slice_max >= 2**31-1 - - assert ops == [ - (5, 97), - (88, slice_max), - (0, 1), - (0, slice_max), - ] - - def test_getslice_nolength(self): - class Sq(object): - def __getslice__(self, start, stop): - return (start, stop) - def __getitem__(self, key): - return "booh" - - sq = Sq() - - assert sq[1:3] == (1,3) - slice_min, slice_max = sq[:] - assert slice_min == 0 - assert slice_max >= 2**31-1 - assert sq[1:] == (1, slice_max) - assert sq[:3] == (0, 3) - assert sq[:] == (0, slice_max) - # negative indices, but no __len__ - assert sq[-1:3] == (-1, 3) - assert sq[1:-3] == (1, -3) - assert sq[-1:-3] == (-1, -3) - # extended slice syntax always uses __getitem__() - assert sq[::] == "booh" - - def test_ipow(self): - x = 2 - x **= 5 - assert x == 32 - - def test_typechecks(self): - class myint(int): - pass - class X(object): - def __nonzero__(self): - return myint(1) - raises(TypeError, "not X()") - - def test_string_subclass(self): - class S(str): - def __hash__(self): - return 123 - s = S("abc") - setattr(s, s, s) - assert len(s.__dict__) == 1 - # this behavior changed in 2.4 - #assert type(s.__dict__.keys()[0]) is str # don't store S keys - #assert s.abc is s - assert getattr(s,s) is s - - def test_notimplemented(self): - #import types - import operator - - def specialmethod(self, other): - return NotImplemented - - def check(expr, x, y, operator=operator): - raises(TypeError, expr) - - for metaclass in [type]: # [type, types.ClassType]: - for name, expr, iexpr in [ - ('__add__', 'x + y', 'x += y'), - ('__sub__', 'x - y', 'x -= y'), - ('__mul__', 'x * y', 'x *= y'), - ('__truediv__', 'operator.truediv(x, y)', None), - ('__floordiv__', 'operator.floordiv(x, y)', None), - ('__div__', 'x / y', 'x /= y'), - ('__mod__', 'x % y', 'x %= y'), - ('__divmod__', 'divmod(x, y)', None), - ('__pow__', 'x ** y', 'x **= y'), - ('__lshift__', 'x << y', 'x <<= y'), - ('__rshift__', 'x >> y', 'x >>= y'), - ('__and__', 'x & y', 'x &= y'), - ('__or__', 'x | y', 'x |= y'), - ('__xor__', 'x ^ y', 'x ^= y'), - ('__coerce__', 'coerce(x, y)', None)]: - if name == '__coerce__': - rname = name - else: - rname = '__r' + name[2:] - A = metaclass('A', (), {name: specialmethod}) - B = metaclass('B', (), {rname: specialmethod}) - a = A() - b = B() - check(expr, a, a) - check(expr, a, b) - check(expr, b, a) - check(expr, b, b) - check(expr, a, 5) - check(expr, 5, b) - if iexpr: - check(iexpr, a, a) - check(iexpr, a, b) - check(iexpr, b, a) - check(iexpr, b, b) - check(iexpr, a, 5) - iname = '__i' + name[2:] - C = metaclass('C', (), {iname: specialmethod}) - c = C() - check(iexpr, c, a) - check(iexpr, c, b) - check(iexpr, c, 5) - - def test_string_results(self): - class A(object): - def __str__(self): - return answer * 2 - def __repr__(self): - return answer * 3 - def __hex__(self): - return answer * 4 - def __oct__(self): - return answer * 5 - - for operate, n in [(str, 2), (repr, 3), (hex, 4), (oct, 5)]: - answer = "hello" - assert operate(A()) == "hello" * n - if operate not in (hex, oct): - answer = u"world" - assert operate(A()) == "world" * n - assert type(operate(A())) is str - answer = 42 - excinfo = raises(TypeError, operate, A()) - assert "returned non-string (type 'int')" in str(excinfo.value) - - def test_missing_getattribute(self): - class X(object): - pass - - class Y(X): - class __metaclass__(type): - def mro(cls): - return [cls, X] - - x = X() - x.__class__ = Y - raises(AttributeError, getattr, x, 'a') - - def test_silly_but_consistent_order(self): - # incomparable objects sort by type name :-/ - class A(object): - pass - class zz(object): - pass - assert A() < zz() - assert zz() > A() - # if in doubt, CPython sorts numbers before non-numbers - assert 0 < () - assert 0L < () - assert 0.0 < () - assert 0j < () - assert 0 < [] - assert 0L < [] - assert 0.0 < [] - assert 0j < [] - assert 0 < A() - assert 0L < A() - assert 0.0 < A() - assert 0j < A() - assert 0 < zz() - assert 0L < zz() - assert 0.0 < zz() - assert 0j < zz() - # what if the type name is the same... whatever, but - # be consistent - a1 = A() - a2 = A() - class A(object): pass - a3 = A() - a4 = A() - assert (a1 < a3) == (a1 < a4) == (a2 < a3) == (a2 < a4) - - def test_setattrweakref(self): - skip("fails, works in cpython") - # The issue is that in CPython, none of the built-in types have - # a __weakref__ descriptor, even if their instances are weakrefable. - # Should we emulate this? - class P(object): - pass - - setattr(P, "__weakref__", 0) - - def test_subclass_addition(self): - # the __radd__ is never called (compare with the next test) - l = [] - class A(object): - def __add__(self, other): - l.append(self.__class__) - l.append(other.__class__) - return 123 - def __radd__(self, other): - # should never be called! - return 456 - class B(A): - pass - res1 = A() + B() - res2 = B() + A() - assert res1 == res2 == 123 - assert l == [A, B, B, A] - - def test_subclass_comparison(self): - # the __eq__ *is* called with reversed arguments - l = [] - class A(object): - def __eq__(self, other): - l.append(self.__class__) - l.append(other.__class__) - return False - - def __lt__(self, other): - l.append(self.__class__) - l.append(other.__class__) - return False - - class B(A): - pass - - A() == B() - A() < B() - B() < A() - assert l == [B, A, A, B, B, A] - - def test_subclass_comparison_more(self): - # similarly, __gt__(b,a) is called instead of __lt__(a,b) - l = [] - class A(object): - def __lt__(self, other): - l.append(self.__class__) - l.append(other.__class__) - return '<' - def __gt__(self, other): - l.append(self.__class__) - l.append(other.__class__) - return '>' - class B(A): - pass - res1 = A() < B() - res2 = B() < A() - assert res1 == '>' and res2 == '<' - assert l == [B, A, B, A] - - def test_rich_comparison(self): - # Old-style - class A: - def __init__(self, a): - self.a = a - def __eq__(self, other): - return self.a == other.a - class B: - def __init__(self, a): - self.a = a - # New-style - class C(object): - def __init__(self, a): - self.a = a - def __eq__(self, other): - return self.a == other.a - class D(object): - def __init__(self, a): - self.a = a - - assert A(1) == B(1) - assert B(1) == A(1) - assert A(1) == C(1) - assert C(1) == A(1) - assert A(1) == D(1) - assert D(1) == A(1) - assert C(1) == D(1) - assert D(1) == C(1) - assert not(A(1) == B(2)) - assert not(B(1) == A(2)) - assert not(A(1) == C(2)) - assert not(C(1) == A(2)) - assert not(A(1) == D(2)) - assert not(D(1) == A(2)) - assert not(C(1) == D(2)) - assert not(D(1) == C(2)) - - def test_partial_ordering(self): - class A(object): - def __lt__(self, other): - return self - a1 = A() - a2 = A() - assert (a1 < a2) is a1 - assert (a1 > a2) is a2 - - def test_eq_order(self): - class A(object): - def __eq__(self, other): return self.__class__.__name__+':A.eq' - def __ne__(self, other): return self.__class__.__name__+':A.ne' - def __lt__(self, other): return self.__class__.__name__+':A.lt' - def __le__(self, other): return self.__class__.__name__+':A.le' - def __gt__(self, other): return self.__class__.__name__+':A.gt' - def __ge__(self, other): return self.__class__.__name__+':A.ge' - class B(object): - def __eq__(self, other): return self.__class__.__name__+':B.eq' - def __ne__(self, other): return self.__class__.__name__+':B.ne' - def __lt__(self, other): return self.__class__.__name__+':B.lt' - def __le__(self, other): return self.__class__.__name__+':B.le' - def __gt__(self, other): return self.__class__.__name__+':B.gt' - def __ge__(self, other): return self.__class__.__name__+':B.ge' - # - assert (A() == B()) == 'A:A.eq' - assert (A() != B()) == 'A:A.ne' - assert (A() < B()) == 'A:A.lt' - assert (A() <= B()) == 'A:A.le' - assert (A() > B()) == 'A:A.gt' - assert (A() >= B()) == 'A:A.ge' - # - assert (B() == A()) == 'B:B.eq' - assert (B() != A()) == 'B:B.ne' - assert (B() < A()) == 'B:B.lt' - assert (B() <= A()) == 'B:B.le' - assert (B() > A()) == 'B:B.gt' - assert (B() >= A()) == 'B:B.ge' - # - class C(A): - def __eq__(self, other): return self.__class__.__name__+':C.eq' - def __ne__(self, other): return self.__class__.__name__+':C.ne' - def __lt__(self, other): return self.__class__.__name__+':C.lt' - def __le__(self, other): return self.__class__.__name__+':C.le' - def __gt__(self, other): return self.__class__.__name__+':C.gt' - def __ge__(self, other): return self.__class__.__name__+':C.ge' - # - assert (A() == C()) == 'C:C.eq' - assert (A() != C()) == 'C:C.ne' - assert (A() < C()) == 'C:C.gt' - assert (A() <= C()) == 'C:C.ge' - assert (A() > C()) == 'C:C.lt' - assert (A() >= C()) == 'C:C.le' - # - assert (C() == A()) == 'C:C.eq' - assert (C() != A()) == 'C:C.ne' - assert (C() < A()) == 'C:C.lt' - assert (C() <= A()) == 'C:C.le' - assert (C() > A()) == 'C:C.gt' - assert (C() >= A()) == 'C:C.ge' - # - class D(A): - pass - # - assert (A() == D()) == 'D:A.eq' - assert (A() != D()) == 'D:A.ne' - assert (A() < D()) == 'D:A.gt' - assert (A() <= D()) == 'D:A.ge' - assert (A() > D()) == 'D:A.lt' - assert (A() >= D()) == 'D:A.le' - # - assert (D() == A()) == 'D:A.eq' - assert (D() != A()) == 'D:A.ne' - assert (D() < A()) == 'D:A.lt' - assert (D() <= A()) == 'D:A.le' - assert (D() > A()) == 'D:A.gt' - assert (D() >= A()) == 'D:A.ge' - - def test_addition(self): - # Old-style - class A: - def __init__(self, a): - self.a = a - def __add__(self, other): - return self.a + other.a - __radd__ = __add__ - class B: - def __init__(self, a): - self.a = a - # New-style - class C(object): - def __init__(self, a): - self.a = a - def __add__(self, other): - return self.a + other.a - __radd__ = __add__ - class D(object): - def __init__(self, a): - self.a = a - - assert A(1) + B(2) == 3 - assert B(1) + A(2) == 3 - assert A(1) + C(2) == 3 - assert C(1) + A(2) == 3 - assert A(1) + D(2) == 3 - assert D(1) + A(2) == 3 - assert C(1) + D(2) == 3 - assert D(1) + C(2) == 3 - - def test_mod_failure(self): - try: - [] % 3 - except TypeError as e: - assert '%' in str(e) - else: - assert False, "did not raise" - - def test_invalid_iterator(self): - class x(object): - def __iter__(self): - return self - raises(TypeError, iter, x()) - - def test_attribute_error(self): - class classmethodonly(classmethod): - def __get__(self, instance, type): - if instance is not None: - raise AttributeError("Must be called on a class, not an instance.") - return super(classmethodonly, self).__get__(instance, type) - - class A(object): - @classmethodonly - def a(cls): - return 3 - - raises(AttributeError, lambda: A().a) - - def test_delete_descriptor(self): - class Prop(object): - def __get__(self, obj, cls): - return 42 - def __delete__(self, obj): - obj.deleted = True - class C(object): - x = Prop() - obj = C() - del obj.x - assert obj.deleted - - def test_non_callable(self): - meth = classmethod(1).__get__(1) - raises(TypeError, meth) - - def test_isinstance_and_issubclass(self): - class Meta(type): - def __instancecheck__(cls, instance): - if cls is A: - return True - return False - def __subclasscheck__(cls, sub): - if cls is B: - return True - return False - class A: - __metaclass__ = Meta - class B(A): - pass - a = A() - b = B() - assert isinstance(a, A) # "shortcut" does not go through metaclass - assert not isinstance(a, B) - assert isinstance(b, A) - assert isinstance(b, B) # "shortcut" does not go through metaclass - assert isinstance(4, A) - assert not issubclass(A, A) - assert not issubclass(B, A) - assert issubclass(A, B) - assert issubclass(B, B) - assert issubclass(23, B) - - def test_issubclass_and_method(self): - class Meta(type): - def __subclasscheck__(cls, sub): - if sub is Dict: - return True - class A: - __metaclass__ = Meta - def method(self): - return 42 - class Dict: - method = A.method - assert Dict().method() == 42 - - def test_truth_of_long(self): - class X(object): - def __len__(self): return 1L - __nonzero__ = __len__ - raises(TypeError, bool, X()) # must return bool or int, not long - del X.__nonzero__ - assert X() - - def test_len_overflow(self): - import sys - class X(object): - def __len__(self): - return sys.maxsize + 1 - raises(OverflowError, len, X()) - raises(OverflowError, bool, X()) - - def test_len_underflow(self): - import sys - class X(object): - def __len__(self): - return -1 - raises(ValueError, len, X()) - raises(ValueError, bool, X()) - class Y(object): - def __len__(self): - return -1L - raises(ValueError, len, Y()) - raises(ValueError, bool, Y()) - - def test_len_custom__int__(self): - class X(object): - def __init__(self, x): - self.x = x - def __len__(self): - return self.x - def __int__(self): - return self.x - - l = len(X(3.0)) - assert l == 3 and type(l) is int - assert X(3.0) - assert not X(0.0) - l = len(X(X(2))) - assert l == 2 and type(l) is int - assert X(X(2)) - assert not X(X(0)) - - def test_bool___contains__(self): - class X(object): - def __contains__(self, item): - if item == 'foo': - return 42 - else: - return 'hello world' - x = X() - res = 'foo' in x - assert res is True - res = 'bar' in x - assert res is True - # - class MyError(Exception): - pass - class CannotConvertToBool(object): - def __nonzero__(self): - raise MyError - class X(object): - def __contains__(self, item): - return CannotConvertToBool() - x = X() - raises(MyError, "'foo' in x") - - def test___cmp___fake_int(self): - class MyInt(object): - def __init__(self, x): - self.x = x - def __int__(self): - return self.x - class X(object): - def __cmp__(self, other): - return MyInt(0) - - assert X() == 'hello' - - def test_sequence_rmul_overrides(self): - class oops(object): - def __rmul__(self, other): - return 42 - def __index__(self): - return 3 - assert '2' * oops() == 42 - assert [2] * oops() == 42 - assert (2,) * oops() == 42 - assert u'2' * oops() == 42 - assert bytearray('2') * oops() == 42 - assert 1000 * oops() == 42 - assert '2'.__mul__(oops()) == '222' - x = '2' - x *= oops() - assert x == 42 - x = [2] - x *= oops() - assert x == 42 - - def test_sequence_rmul_overrides_oldstyle(self): - class oops: - def __rmul__(self, other): - return 42 - def __index__(self): - return 3 - assert '2' * oops() == 42 - assert [2] * oops() == 42 - assert (2,) * oops() == 42 - assert u'2' * oops() == 42 - assert bytearray('2') * oops() == 42 - assert 1000 * oops() == 42 - assert '2'.__mul__(oops()) == '222' - - def test_sequence_radd_overrides(self): - class A1(list): - pass - class A2(list): - def __radd__(self, other): - return 42 - assert [2] + A1([3]) == [2, 3] - assert type([2] + A1([3])) is list - assert [2] + A2([3]) == 42 - x = "2" - x += A2([3]) - assert x == 42 - x = [2] - x += A2([3]) - assert x == 42 - - def test_data_descriptor_without_delete(self): - class D(object): - def __set__(self, x, y): - pass - class A(object): - d = D() - raises(AttributeError, "del A().d") - - def test_data_descriptor_without_set(self): - class D(object): - def __delete__(self, x): - pass - class A(object): - d = D() - raises(AttributeError, "A().d = 5") - - def test_not_subscriptable_error_gives_keys(self): - d = {'key1': {'key2': {'key3': None}}} - excinfo = raises(TypeError, "d['key1']['key2']['key3']['key4']['key5']") - assert "key4" in str(excinfo.value) diff -Nru pypy-7.1.1+dfsg/pypy/test_all.py pypy-7.3.1+dfsg/pypy/test_all.py --- pypy-7.1.1+dfsg/pypy/test_all.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/test_all.py 2020-04-10 19:28:41.000000000 +0000 @@ -17,14 +17,16 @@ For more information, use test_all.py -h. """ import sys, os +import shutil if __name__ == '__main__': if len(sys.argv) == 1 and os.path.dirname(sys.argv[0]) in '.': print >> sys.stderr, __doc__ sys.exit(2) - #Add toplevel repository dir to sys.path - sys.path.insert(0,os.path.dirname(os.path.dirname(os.path.realpath(__file__)))) + toplevel = os.path.dirname(os.path.dirname(os.path.realpath(__file__))) + # Add toplevel repository dir to sys.path + sys.path.insert(0, toplevel) import pytest if sys.platform == 'win32': #Try to avoid opening a dialog box if one of the tests causes a system error diff -Nru pypy-7.1.1+dfsg/pypy/testrunner_cfg.py pypy-7.3.1+dfsg/pypy/testrunner_cfg.py --- pypy-7.1.1+dfsg/pypy/testrunner_cfg.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/testrunner_cfg.py 2020-04-10 19:28:41.000000000 +0000 @@ -6,6 +6,7 @@ 'memory/test', 'jit/metainterp', 'jit/backend/arm', 'jit/backend/x86', 'jit/backend/zarch', 'module/cpyext/test', + 'jit/backend/aarch64', ] def collect_one_testdir(testdirs, reldir, tests): diff -Nru pypy-7.1.1+dfsg/pypy/tool/bench/unicode-bench.py pypy-7.3.1+dfsg/pypy/tool/bench/unicode-bench.py --- pypy-7.1.1+dfsg/pypy/tool/bench/unicode-bench.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/tool/bench/unicode-bench.py 2020-04-10 19:28:41.000000000 +0000 @@ -0,0 +1,77 @@ + +import time + +LGT = 100 + +unicodes = [unicode("u" * LGT + str(i)) for i in range(100)] +non_ascii_unicodes = [u"u" * LGT + unicode(i) + u"å" for i in range(100)] + +long_string = u" " * 1000000 +unicodes = [long_string] * 100 + +RANGE = 250000000 // LGT + +def upper(main_l): + l = [None] * 1000 + for i in xrange(RANGE): + l[i % 1000] = main_l[i % 100].upper() + +def lower(main_l): + l = [None] + for i in xrange(RANGE): + l[0] = main_l[i % 100].lower() + +def islower(main_l): + l = [None] + for i in xrange(RANGE * 3): + l[0] = main_l[i % 100].islower() + +def title(main_l): + l = [None] + for i in xrange(RANGE): + l[0] = main_l[i % 100].title() + +def add(main_l): + l = [None] + for i in xrange(RANGE): + l[0] = main_l[i % 100] + u"foo" + +def find(main_l): + l = [None] + for i in xrange(RANGE): + l[0] = main_l[i % 100].find(u"foo") + +def split(main_l): + l = [None] + for i in xrange(RANGE): + l[0] = main_l[i % 100].split() + +def splitlines(main_l): + l = [None] + for i in xrange(RANGE): + l[0] = main_l[i % 100].splitlines() + +def iter(main_l): + l = [None] + for i in xrange(RANGE // 10000): + for elem in main_l[i % 100]: + l[0] = elem + +def indexing(main_l): + l = [None] + for i in xrange(RANGE * 10): + l[0] = main_l[i % 100][13] + +def isspace(main_l): + l = [None] + for i in xrange(RANGE // 10000): + l[0] = main_l[i % 100].isspace() + +for func in [isspace]:#, lower, isupper, islower]: + t0 = time.time() + func(unicodes) + t1 = time.time() + print "ascii %s %.2f" % (func.__name__, t1 - t0) + #func(non_ascii_unicodes) + #t2 = time.time() + #print "non-ascii %s %.2f" % (func.__name__, t2 - t1) diff -Nru pypy-7.1.1+dfsg/pypy/tool/build_cffi_imports.py pypy-7.3.1+dfsg/pypy/tool/build_cffi_imports.py --- pypy-7.1.1+dfsg/pypy/tool/build_cffi_imports.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/tool/build_cffi_imports.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,103 +0,0 @@ -from __future__ import print_function -import sys, shutil, os - -class MissingDependenciesError(Exception): - pass - - -cffi_build_scripts = { - "sqlite3": "_sqlite3_build.py", - "audioop": "_audioop_build.py", - "tk": "_tkinter/tklib_build.py", - "curses": "_curses_build.py" if sys.platform != "win32" else None, - "syslog": "_syslog_build.py" if sys.platform != "win32" else None, - "gdbm": "_gdbm_build.py" if sys.platform != "win32" else None, - "pwdgrp": "_pwdgrp_build.py" if sys.platform != "win32" else None, - "resource": "_resource_build.py" if sys.platform != "win32" else None, - "xx": None, # for testing: 'None' should be completely ignored - } - -def create_cffi_import_libraries(pypy_c, options, basedir): - from rpython.tool.runsubprocess import run_subprocess - - shutil.rmtree(str(basedir.join('lib_pypy', '__pycache__')), - ignore_errors=True) - # be sure pip, setuptools are installed in a fresh pypy - # allows proper functioning of cffi on win32 with newer vc compilers - # XXX move this to a build slave step? - status, stdout, stderr = run_subprocess(str(pypy_c), ['-c', 'import setuptools']) - if status != 0: - status, stdout, stderr = run_subprocess(str(pypy_c), ['-m', 'ensurepip']) - failures = [] - env = os.environ.copy() - if sys.platform == 'win32': - env['INCLUDE'] = r'..\externals\include;' + env.get('INCLUDE', '') - env['LIB'] = r'..\externals\lib;' + env.get('LIB', '') - env['PATH'] = r'..\externals\bin;' + env.get('PATH', '') - for key, module in sorted(cffi_build_scripts.items()): - if module is None or getattr(options, 'no_' + key, False): - continue - if module.endswith('.py'): - args = [module] - cwd = str(basedir.join('lib_pypy')) - else: - args = ['-c', 'import ' + module] - cwd = None - print('*', ' '.join(args), file=sys.stderr) - try: - status, stdout, stderr = run_subprocess(str(pypy_c), args, - cwd=cwd, env=env) - if status != 0: - print(stdout, stderr, file=sys.stderr) - failures.append((key, module)) - except: - import traceback;traceback.print_exc() - failures.append((key, module)) - return failures - -if __name__ == '__main__': - if '__pypy__' not in sys.builtin_module_names: - print('Call with a pypy interpreter', file=sys.stderr) - sys.exit(1) - - tool_dir = os.path.dirname(os.path.abspath(sys.argv[0])) - base_dir = os.path.dirname(os.path.dirname(tool_dir)) - sys.path.insert(0, base_dir) - - import py - - class Options(object): - pass - - exename = py.path.local(sys.executable) - basedir = exename - while not basedir.join('include').exists(): - _basedir = basedir.dirpath() - if _basedir == basedir: - raise ValueError('interpreter %s not inside pypy repo', - str(exename)) - basedir = _basedir - options = Options() - failures = create_cffi_import_libraries(exename, options, basedir) - if len(failures) > 0: - print('*** failed to build the CFFI modules %r' % ( - [f[1] for f in failures],), file=sys.stderr) - print(''' -PyPy can still be used as long as you don't need the corresponding -modules. If you do need them, please install the missing headers and -libraries (see error messages just above) and then re-run the command: - - %s %s -''' % (sys.executable, ' '.join(sys.argv)), file=sys.stderr) - sys.exit(1) - - if len(sys.argv) > 1 and sys.argv[1] == '--test': - # monkey patch a failure, just to test - print('This line should be followed by a traceback', file=sys.stderr) - for k in cffi_build_scripts: - setattr(options, 'no_' + k, True) - must_fail = '_missing_build_script.py' - assert not os.path.exists(str(basedir.join('lib_pypy').join(must_fail))) - cffi_build_scripts['should_fail'] = must_fail - failures = create_cffi_import_libraries(exename, options, basedir) - assert len(failures) == 1 diff -Nru pypy-7.1.1+dfsg/pypy/tool/import_cffi.py pypy-7.3.1+dfsg/pypy/tool/import_cffi.py --- pypy-7.1.1+dfsg/pypy/tool/import_cffi.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/tool/import_cffi.py 2020-04-10 19:28:41.000000000 +0000 @@ -20,6 +20,10 @@ else: raise AssertionError(ext) +def fixeol(s): + s = s.replace('\r\n', '\n') + return s + def main(cffi_dir): cffi_dir = py.path.local(cffi_dir) rootdir = py.path.local(__file__).join('..', '..', '..') @@ -29,13 +33,13 @@ test_dest.ensure(dir=1) for p in (list(cffi_dir.join('cffi').visit(fil='*.py')) + list(cffi_dir.join('cffi').visit(fil='*.h'))): - cffi_dest.join('..', p.relto(cffi_dir)).write(p.read()) + cffi_dest.join('..', p.relto(cffi_dir)).write_binary(fixeol(p.read())) for p in (list(cffi_dir.join('testing').visit(fil='*.py')) + list(cffi_dir.join('testing').visit(fil='*.h')) + list(cffi_dir.join('testing').visit(fil='*.c'))): path = test_dest.join(p.relto(cffi_dir.join('testing'))) path.join('..').ensure(dir=1) - path.write(''.join(mangle(p.readlines(), p.ext))) + path.write_binary(fixeol(''.join(mangle(p.readlines(), p.ext)))) if __name__ == '__main__': if len(sys.argv) != 2: diff -Nru pypy-7.1.1+dfsg/pypy/tool/option.py pypy-7.3.1+dfsg/pypy/tool/option.py --- pypy-7.1.1+dfsg/pypy/tool/option.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/tool/option.py 2020-04-10 19:28:41.000000000 +0000 @@ -29,7 +29,5 @@ return config def make_objspace(config): - mod = __import__('pypy.objspace.std', - None, None, ['Space']) - Space = mod.Space - return Space(config) + from pypy.objspace.std.objspace import StdObjSpace + return StdObjSpace(config) diff -Nru pypy-7.1.1+dfsg/pypy/tool/pypyjit_child.py pypy-7.3.1+dfsg/pypy/tool/pypyjit_child.py --- pypy-7.1.1+dfsg/pypy/tool/pypyjit_child.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/tool/pypyjit_child.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,25 +0,0 @@ -from pypy.conftest import option -from rpython.rtyper.lltypesystem import lltype -from rpython.jit.metainterp import warmspot -from pypy.module.pypyjit.policy import PyPyJitPolicy - - -def run_child(glob, loc): - import sys, pdb - interp = loc['interp'] - graph = loc['graph'] - interp.malloc_check = False - - from rpython.jit.backend.llgraph.runner import LLGraphCPU - #LLtypeCPU.supports_floats = False # for now - apply_jit(interp, graph, LLGraphCPU) - - -def apply_jit(interp, graph, CPUClass): - print 'warmspot.jittify_and_run() started...' - policy = PyPyJitPolicy() - option.view = True - warmspot.jittify_and_run(interp, graph, [], policy=policy, - listops=True, CPUClass=CPUClass, - backendopt=True, inline=True) - diff -Nru pypy-7.1.1+dfsg/pypy/tool/pypyjit_demo.py pypy-7.3.1+dfsg/pypy/tool/pypyjit_demo.py --- pypy-7.1.1+dfsg/pypy/tool/pypyjit_demo.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/tool/pypyjit_demo.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,31 +0,0 @@ - -import time -l = [] - -for i in range(100): - print i - t0 = time.time() - exec """ -def k(a, b, c): - pass - -def g(a, b, c): - k(a, b + 1, c + 2) - k(a, b + 1, c + 2) - k(a, b + 1, c + 2) - k(a, b + 1, c + 2) - k(a, b + 1, c + 2) - -def f(i): - g(i, i + 1, i + 2) - g(i, i + 1, i + 2) - g(i, i + 1, i + 2) - g(i, i + 1, i + 2) - g(i, i + 1, i + 2) - g(i, i + 1, i + 2) -for i in range(1000): - f(i) -""" - l.append(time.time() - t0) - -print l diff -Nru pypy-7.1.1+dfsg/pypy/tool/pypyjit.py pypy-7.3.1+dfsg/pypy/tool/pypyjit.py --- pypy-7.1.1+dfsg/pypy/tool/pypyjit.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/tool/pypyjit.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,118 +0,0 @@ -""" -A file that invokes translation of PyPy with the JIT enabled. - -Run it with py.test -s --pdb pypyjit.py - -""" - -import py, os - -try: - py.test.config.option.runappdirect -except AttributeError: - import sys - print >> sys.stderr, __doc__ - sys.exit(2) - -import sys -sys.setrecursionlimit(100000000) - -from pypy.objspace.std import Space -from rpython.config.translationoption import set_opt_level -from pypy.config.pypyoption import get_pypy_config, set_pypy_opt_level -from rpython.rtyper.annlowlevel import llhelper, llstr, hlstr -from rpython.rtyper.lltypesystem.rstr import STR -from rpython.rtyper.lltypesystem import lltype -from pypy.interpreter.pycode import PyCode -from rpython.translator.goal import unixcheckpoint -import pypy.module.pypyjit.interp_jit - -config = get_pypy_config(translating=True) -config.translation.backendopt.inline_threshold = 0.1 -config.translation.gc = 'boehm' -config.translating = True -config.translation.rweakref = False -set_opt_level(config, level='jit') -config.objspace.allworkingmodules = False -config.objspace.usemodules.pypyjit = True -config.objspace.usemodules.array = False -config.objspace.usemodules._weakref = False -config.objspace.usemodules.struct = True -config.objspace.usemodules.time = True -config.objspace.usemodules._sre = False -config.objspace.usemodules._lsprof = False -# -config.objspace.usemodules._rawffi = False -config.objspace.usemodules.micronumpy = False -# -set_pypy_opt_level(config, level='jit') - -print config - -import sys, pdb - -space = Space(config) -w_dict = space.newdict(module=True) - - -def readfile(filename): - fd = os.open(filename, os.O_RDONLY, 0) - blocks = [] - while True: - data = os.read(fd, 4096) - if not data: - break - blocks.append(data) - os.close(fd) - return ''.join(blocks) - -def read_code(): - from pypy.module.marshal.interp_marshal import dumps - - filename = 'pypyjit_demo.py' - source = readfile(filename) - ec = space.getexecutioncontext() - code = ec.compiler.compile(source, filename, 'exec', 0) - return llstr(space.str_w(dumps(space, code, space.wrap(2)))) - -FPTR = lltype.Ptr(lltype.FuncType([], lltype.Ptr(STR))) -read_code_ptr = llhelper(FPTR, read_code) - -def entry_point(): - space.startup() - from pypy.module.marshal.interp_marshal import loads - code = loads(space, space.wrap(hlstr(read_code_ptr()))) - assert isinstance(code, PyCode) - code.exec_code(space, w_dict, w_dict) - -def test_run_translation(): - from pypy.tool.ann_override import PyPyAnnotatorPolicy - from rpython.rtyper.test.test_llinterp import get_interpreter - - # first annotate and rtype - try: - interp, graph = get_interpreter(entry_point, [], backendopt=False, - config=config, - policy=PyPyAnnotatorPolicy(space)) - except Exception as e: - print '%s: %s' % (e.__class__, e) - pdb.post_mortem(sys.exc_info()[2]) - raise - - # parent process loop: spawn a child, wait for the child to finish, - # print a message, and restart - unixcheckpoint.restartable_point(auto='run') - - from rpython.jit.codewriter.codewriter import CodeWriter - CodeWriter.debug = True - from pypy.tool.pypyjit_child import run_child - run_child(globals(), locals()) - - -if __name__ == '__main__': - import sys - if len(sys.argv) > 1: - # debugging: run the code directly - entry_point() - else: - test_run_translation() diff -Nru pypy-7.1.1+dfsg/pypy/tool/pytest/app_rewrite.py pypy-7.3.1+dfsg/pypy/tool/pytest/app_rewrite.py --- pypy-7.1.1+dfsg/pypy/tool/pytest/app_rewrite.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/tool/pytest/app_rewrite.py 2020-04-10 19:28:41.000000000 +0000 @@ -0,0 +1,39 @@ +import re + +ASCII_IS_DEFAULT_ENCODING = False + +cookie_re = re.compile(r"^[ \t\f]*#.*coding[:=][ \t]*[-\w.]+") +BOM_UTF8 = '\xef\xbb\xbf' + +def _prepare_source(fn): + """Read the source code for re-writing.""" + try: + stat = fn.stat() + source = fn.read("rb") + except EnvironmentError: + return None, None + if ASCII_IS_DEFAULT_ENCODING: + # ASCII is the default encoding in Python 2. Without a coding + # declaration, Python 2 will complain about any bytes in the file + # outside the ASCII range. Sadly, this behavior does not extend to + # compile() or ast.parse(), which prefer to interpret the bytes as + # latin-1. (At least they properly handle explicit coding cookies.) To + # preserve this error behavior, we could force ast.parse() to use ASCII + # as the encoding by inserting a coding cookie. Unfortunately, that + # messes up line numbers. Thus, we have to check ourselves if anything + # is outside the ASCII range in the case no encoding is explicitly + # declared. For more context, see issue #269. Yay for Python 3 which + # gets this right. + end1 = source.find("\n") + end2 = source.find("\n", end1 + 1) + if (not source.startswith(BOM_UTF8) and + cookie_re.match(source[0:end1]) is None and + cookie_re.match(source[end1 + 1:end2]) is None): + try: + source.decode("ascii") + except UnicodeDecodeError: + # Let it fail in real import. + return None, None + # On Python versions which are not 2.7 and less than or equal to 3.1, the + # parser expects *nix newlines. + return stat, source diff -Nru pypy-7.1.1+dfsg/pypy/tool/pytest/appsupport.py pypy-7.3.1+dfsg/pypy/tool/pytest/appsupport.py --- pypy-7.1.1+dfsg/pypy/tool/pytest/appsupport.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/tool/pytest/appsupport.py 2020-04-10 19:28:41.000000000 +0000 @@ -198,7 +198,7 @@ w_BuiltinAssertionError = space.getitem(space.builtin.w_dict, space.wrap('AssertionError')) w_metaclass = space.type(w_BuiltinAssertionError) - w_init = space.wrap(gateway.interp2app_temp(my_init)) + w_init = space.wrap(gateway.interp2app(my_init)) w_dict = space.newdict() space.setitem(w_dict, space.wrap('__init__'), w_init) return space.call_function(w_metaclass, @@ -299,14 +299,14 @@ raise raise oefmt(space.w_AssertionError, "DID NOT RAISE") -app_raises = gateway.interp2app_temp(pypyraises) +app_raises = gateway.interp2app(pypyraises) def pypyskip(space, w_message): """skip a test at app-level. """ msg = space.unwrap(w_message) py.test.skip(msg) -app_skip = gateway.interp2app_temp(pypyskip) +app_skip = gateway.interp2app(pypyskip) def raises_w(space, w_ExpectedException, *args, **kwds): try: diff -Nru pypy-7.1.1+dfsg/pypy/tool/pytest/apptest2.py pypy-7.3.1+dfsg/pypy/tool/pytest/apptest2.py --- pypy-7.1.1+dfsg/pypy/tool/pytest/apptest2.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/tool/pytest/apptest2.py 2020-04-10 19:28:41.000000000 +0000 @@ -0,0 +1,147 @@ +import sys +import os +import re +import json + +import pytest +from pypy import pypydir +import pypy.interpreter.function +from pypy.tool.pytest import app_rewrite +from pypy.interpreter.error import OperationError +from pypy.interpreter.module import Module +from pypy.tool.pytest import objspace +from pypy.tool.pytest import appsupport + + +class AppTestModule(pytest.Module): + def __init__(self, path, parent, rewrite_asserts=False): + super(AppTestModule, self).__init__(path, parent) + self.rewrite_asserts = rewrite_asserts + + def collect(self): + _, source = app_rewrite._prepare_source(self.fspath) + spaceconfig = extract_spaceconfig_from_source(source) + space = objspace.gettestobjspace(**spaceconfig) + w_rootdir = space.newtext( + os.path.join(pypydir, 'tool', 'pytest', 'ast-rewriter')) + w_source = space.newtext(source) + fname = str(self.fspath) + w_name = space.newtext(str(self.fspath.purebasename)) + w_fname = space.newtext(fname) + if self.rewrite_asserts: + w_mod = space.appexec([w_rootdir, w_source, w_fname, w_name], + """(rootdir, source, fname, name): + import sys + sys.path.insert(0, rootdir) + from ast_rewrite import rewrite_asserts, create_module + + co = rewrite_asserts(source, fname) + mod = create_module(name, co) + return mod + """) + else: + w_mod = create_module(space, w_name, fname, source) + mod_dict = w_mod.getdict(space).unwrap(space) + items = [] + for name, w_obj in mod_dict.items(): + if not name.startswith('test_'): + continue + if not isinstance(w_obj, pypy.interpreter.function.Function): + continue + items.append(AppTestFunction(name, self, w_obj)) + items.sort(key=lambda item: item.reportinfo()[:2]) + return items + + def setup(self): + pass + +def create_module(space, w_name, filename, source): + w_mod = Module(space, w_name, add_package=False) + w_dict = w_mod.getdict(space) + space.setitem(w_dict, space.newtext('__file__'), space.newtext(filename)) + space.exec_(source, w_dict, w_dict, filename=filename) + return w_mod + +def extract_spaceconfig_from_source(source): + ''' + spaceconfig is defined in a comment where it can be any valid json dictionary object + ''' + for line in source.split('\n'): + match = re.search('#\s*spaceconfig\s*=\s*(\{.+\})\s*', line) + if match: + return json.loads(match.group(1)) + return {} + +class AppError(Exception): + + def __init__(self, excinfo): + self.excinfo = excinfo + + +class AppTestFunction(pytest.Item): + + def __init__(self, name, parent, w_obj): + super(AppTestFunction, self).__init__(name, parent) + self.w_obj = w_obj + + def runtest(self): + target = self.w_obj + space = target.space + self.check_run(space, target) + self.execute_appex(space, target) + + def repr_failure(self, excinfo): + if excinfo.errisinstance(AppError): + excinfo = excinfo.value.excinfo + return super(AppTestFunction, self).repr_failure(excinfo) + + def check_run(self, space, w_func): + space.appexec([w_func], """(func): + if hasattr(func, 'skipif'): + marker = func.skipif + arg = marker.args[0] + if isinstance(arg, str): + raise ValueError("str argument to skipif isn't supported") + else: + if arg: + import pytest + reason = marker.kwargs.get('reason', "Skipping.") + pytest.skip(reason) + """) + + def execute_appex(self, space, w_func): + space.getexecutioncontext().set_sys_exc_info(None) + sig = w_func.code._signature + if sig.varargname or sig.kwargname: + raise ValueError( + 'Test functions may not use *args or **kwargs') + args_w = self.get_fixtures(space, sig.argnames) + try: + space.call_function(w_func, *args_w) + except OperationError as e: + if self.config.option.raise_operr: + raise + tb = sys.exc_info()[2] + if e.match(space, space.w_KeyboardInterrupt): + raise KeyboardInterrupt, KeyboardInterrupt(), tb + appexcinfo = appsupport.AppExceptionInfo(space, e) + if appexcinfo.traceback: + raise AppError, AppError(appexcinfo), tb + raise + + def reportinfo(self): + """Must return a triple (fspath, lineno, test_name)""" + lineno = self.w_obj.code.co_firstlineno + return self.parent.fspath, lineno, self.w_obj.name + + def get_fixtures(self, space, fixtures): + if not fixtures: + return [] + import imp + fixtures_mod = imp.load_source( + 'fixtures', str(self.parent.fspath.new(basename='fixtures.py'))) + result = [] + for name in fixtures: + arg = getattr(fixtures_mod, name)(space, self.parent.config) + result.append(arg) + return result diff -Nru pypy-7.1.1+dfsg/pypy/tool/pytest/apptest.py pypy-7.3.1+dfsg/pypy/tool/pytest/apptest.py --- pypy-7.1.1+dfsg/pypy/tool/pytest/apptest.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/tool/pytest/apptest.py 2020-04-10 19:28:41.000000000 +0000 @@ -1,7 +1,7 @@ # Collects and executes application-level tests. # -# Classes which names start with "AppTest", or function which names -# start with "app_test*" are not executed by the host Python, but +# Classes which names start with "AppTest" +# are not executed by the host Python, but # by an interpreted pypy object space. # # ...unless the -A option ('runappdirect') is passed. @@ -21,7 +21,7 @@ self.excinfo = excinfo -class AppTestFunction(py.test.collect.Function): +class AppTestMethod(py.test.collect.Function): def _prunetraceback(self, traceback): return traceback @@ -40,20 +40,10 @@ raise AppError, AppError(appexcinfo), tb raise - def runtest(self): - target = self.obj - if self.config.option.runappdirect: - return target() - space = gettestobjspace() - filename = self._getdynfilename(target) - func = app2interp_temp(target, filename=filename) - print "executing", func - self.execute_appex(space, func, space) - def repr_failure(self, excinfo): if excinfo.errisinstance(AppError): excinfo = excinfo.value.excinfo - return super(AppTestFunction, self).repr_failure(excinfo) + return super(AppTestMethod, self).repr_failure(excinfo) def _getdynfilename(self, func): code = getattr(func, 'im_func', func).func_code @@ -66,8 +56,6 @@ if hasattr(self, 'space'): self.space.getexecutioncontext()._run_finalizers_now() - -class AppTestMethod(AppTestFunction): def setup(self): super(AppTestMethod, self).setup() instance = self.parent.obj diff -Nru pypy-7.1.1+dfsg/pypy/tool/pytest/ast-rewriter/ast_rewrite.py pypy-7.3.1+dfsg/pypy/tool/pytest/ast-rewriter/ast_rewrite.py --- pypy-7.1.1+dfsg/pypy/tool/pytest/ast-rewriter/ast_rewrite.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/tool/pytest/ast-rewriter/ast_rewrite.py 2020-04-10 19:28:41.000000000 +0000 @@ -0,0 +1,657 @@ +"""Rewrite assertion AST to produce nice error messages""" +from __future__ import absolute_import, division, print_function +import ast +import itertools +import marshal +import sys + +from ast_util import callbinrepr, format_explanation as _format_explanation + + +# pytest caches rewritten pycs in __pycache__. +if hasattr(sys, "pypy_version_info"): + impl = "pypy" +elif sys.platform == "java": + impl = "jython" +else: + impl = "cpython" +ver = sys.version_info +PYTEST_TAG = "%s-%s%s-PYTEST" % (impl, ver[0], ver[1]) +del ver, impl + +PYC_EXT = ".py" + (__debug__ and "c" or "o") +PYC_TAIL = "." + PYTEST_TAG + PYC_EXT + + +if sys.version_info >= (3, 5): + ast_Call = ast.Call +else: + def ast_Call(a, b, c): + return ast.Call(a, b, c, None, None) + + +def _write_pyc(state, co, source_stat, pyc): + # Technically, we don't have to have the same pyc format as + # (C)Python, since these "pycs" should never be seen by builtin + # import. However, there's little reason deviate, and I hope + # sometime to be able to use imp.load_compiled to load them. (See + # the comment in load_module above.) + import struct + try: + fp = open(pyc, "wb") + except IOError: + err = sys.exc_info()[1].errno + state.trace("error writing pyc file at %s: errno=%s" % (pyc, err)) + # we ignore any failure to write the cache file + # there are many reasons, permission-denied, __pycache__ being a + # file etc. + return False + try: + fp.write(imp.get_magic()) + mtime = int(source_stat.mtime) + size = source_stat.size & 0xFFFFFFFF + fp.write(struct.pack(">", + ast.Add: "+", + ast.Sub: "-", + ast.Mult: "*", + ast.Div: "/", + ast.FloorDiv: "//", + ast.Mod: "%%", # escaped for string formatting + ast.Eq: "==", + ast.NotEq: "!=", + ast.Lt: "<", + ast.LtE: "<=", + ast.Gt: ">", + ast.GtE: ">=", + ast.Pow: "**", + ast.Is: "is", + ast.IsNot: "is not", + ast.In: "in", + ast.NotIn: "not in" +} +# Python 3.5+ compatibility +try: + binop_map[ast.MatMult] = "@" +except AttributeError: + pass + +# Python 3.4+ compatibility +if hasattr(ast, "NameConstant"): + _NameConstant = ast.NameConstant +else: + def _NameConstant(c): + return ast.Name(str(c), ast.Load()) + + +def set_location(node, lineno, col_offset): + """Set node location information recursively.""" + def _fix(node, lineno, col_offset): + if "lineno" in node._attributes: + node.lineno = lineno + if "col_offset" in node._attributes: + node.col_offset = col_offset + for child in ast.iter_child_nodes(node): + _fix(child, lineno, col_offset) + _fix(node, lineno, col_offset) + return node + + +class AssertionRewriter(ast.NodeVisitor): + """Assertion rewriting implementation. + + The main entrypoint is to call .run() with an ast.Module instance, + this will then find all the assert statements and rewrite them to + provide intermediate values and a detailed assertion error. See + http://pybites.blogspot.be/2011/07/behind-scenes-of-pytests-new-assertion.html + for an overview of how this works. + + The entry point here is .run() which will iterate over all the + statements in an ast.Module and for each ast.Assert statement it + finds call .visit() with it. Then .visit_Assert() takes over and + is responsible for creating new ast statements to replace the + original assert statement: it rewrites the test of an assertion + to provide intermediate values and replace it with an if statement + which raises an assertion error with a detailed explanation in + case the expression is false. + + For this .visit_Assert() uses the visitor pattern to visit all the + AST nodes of the ast.Assert.test field, each visit call returning + an AST node and the corresponding explanation string. During this + state is kept in several instance attributes: + + :statements: All the AST statements which will replace the assert + statement. + + :variables: This is populated by .variable() with each variable + used by the statements so that they can all be set to None at + the end of the statements. + + :variable_counter: Counter to create new unique variables needed + by statements. Variables are created using .variable() and + have the form of "@py_assert0". + + :on_failure: The AST statements which will be executed if the + assertion test fails. This is the code which will construct + the failure message and raises the AssertionError. + + :explanation_specifiers: A dict filled by .explanation_param() + with %-formatting placeholders and their corresponding + expressions to use in the building of an assertion message. + This is used by .pop_format_context() to build a message. + + :stack: A stack of the explanation_specifiers dicts maintained by + .push_format_context() and .pop_format_context() which allows + to build another %-formatted string while already building one. + + This state is reset on every new assert statement visited and used + by the other visitors. + + """ + + def __init__(self, module_path): + super(AssertionRewriter, self).__init__() + self.module_path = module_path + + def run(self, mod): + """Find all assert statements in *mod* and rewrite them.""" + if not mod.body: + # Nothing to do. + return + # Insert some special imports at the top of the module but after any + # docstrings and __future__ imports. + if sys.version_info[0] >= 3: + builtin_name = 'builtins' + else: + builtin_name = '__builtin__' + aliases = [ast.alias(builtin_name, "@py_builtins"), + ast.alias("ast_rewrite", "@pytest_ar")] + doc = getattr(mod, "docstring", None) + expect_docstring = doc is None + if doc is not None and self.is_rewrite_disabled(doc): + return + pos = 0 + lineno = 1 + for item in mod.body: + if (expect_docstring and isinstance(item, ast.Expr) and + isinstance(item.value, ast.Str)): + doc = item.value.s + if self.is_rewrite_disabled(doc): + return + expect_docstring = False + elif (not isinstance(item, ast.ImportFrom) or item.level > 0 or + item.module != "__future__"): + lineno = item.lineno + break + pos += 1 + else: + lineno = item.lineno + imports = [ast.Import([alias], lineno=lineno, col_offset=0) + for alias in aliases] + mod.body[pos:pos] = imports + # Collect asserts. + nodes = [mod] + while nodes: + node = nodes.pop() + for name, field in ast.iter_fields(node): + if isinstance(field, list): + new = [] + for i, child in enumerate(field): + if isinstance(child, ast.Assert): + # Transform assert. + new.extend(self.visit(child)) + else: + new.append(child) + if isinstance(child, ast.AST): + nodes.append(child) + setattr(node, name, new) + elif (isinstance(field, ast.AST) and + # Don't recurse into expressions as they can't contain + # asserts. + not isinstance(field, ast.expr)): + nodes.append(field) + + @staticmethod + def is_rewrite_disabled(docstring): + return "PYTEST_DONT_REWRITE" in docstring + + def variable(self): + """Get a new variable.""" + # Use a character invalid in python identifiers to avoid clashing. + name = "@py_assert" + str(next(self.variable_counter)) + self.variables.append(name) + return name + + def assign(self, expr): + """Give *expr* a name.""" + name = self.variable() + self.statements.append(ast.Assign([ast.Name(name, ast.Store())], expr)) + return ast.Name(name, ast.Load()) + + def display(self, expr): + """Call py.io.saferepr on the expression.""" + return self.helper("saferepr", expr) + + def helper(self, name, *args): + """Call a helper in this module.""" + py_name = ast.Name("@pytest_ar", ast.Load()) + attr = ast.Attribute(py_name, "_" + name, ast.Load()) + return ast_Call(attr, list(args), []) + + def builtin(self, name): + """Return the builtin called *name*.""" + builtin_name = ast.Name("@py_builtins", ast.Load()) + return ast.Attribute(builtin_name, name, ast.Load()) + + def explanation_param(self, expr): + """Return a new named %-formatting placeholder for expr. + + This creates a %-formatting placeholder for expr in the + current formatting context, e.g. ``%(py0)s``. The placeholder + and expr are placed in the current format context so that it + can be used on the next call to .pop_format_context(). + + """ + specifier = "py" + str(next(self.variable_counter)) + self.explanation_specifiers[specifier] = expr + return "%(" + specifier + ")s" + + def push_format_context(self): + """Create a new formatting context. + + The format context is used for when an explanation wants to + have a variable value formatted in the assertion message. In + this case the value required can be added using + .explanation_param(). Finally .pop_format_context() is used + to format a string of %-formatted values as added by + .explanation_param(). + + """ + self.explanation_specifiers = {} + self.stack.append(self.explanation_specifiers) + + def pop_format_context(self, expl_expr): + """Format the %-formatted string with current format context. + + The expl_expr should be an ast.Str instance constructed from + the %-placeholders created by .explanation_param(). This will + add the required code to format said string to .on_failure and + return the ast.Name instance of the formatted string. + + """ + current = self.stack.pop() + if self.stack: + self.explanation_specifiers = self.stack[-1] + keys = [ast.Str(key) for key in current.keys()] + format_dict = ast.Dict(keys, list(current.values())) + form = ast.BinOp(expl_expr, ast.Mod(), format_dict) + name = "@py_format" + str(next(self.variable_counter)) + self.on_failure.append(ast.Assign([ast.Name(name, ast.Store())], form)) + return ast.Name(name, ast.Load()) + + def generic_visit(self, node): + """Handle expressions we don't have custom code for.""" + assert isinstance(node, ast.expr) + res = self.assign(node) + return res, self.explanation_param(self.display(res)) + + def visit_Assert(self, assert_): + """Return the AST statements to replace the ast.Assert instance. + + This rewrites the test of an assertion to provide + intermediate values and replace it with an if statement which + raises an assertion error with a detailed explanation in case + the expression is false. + + """ + self.statements = [] + self.variables = [] + self.variable_counter = itertools.count() + self.stack = [] + self.on_failure = [] + self.push_format_context() + # Rewrite assert into a bunch of statements. + top_condition, explanation = self.visit(assert_.test) + # Create failure message. + body = self.on_failure + negation = ast.UnaryOp(ast.Not(), top_condition) + self.statements.append(ast.If(negation, body, [])) + if assert_.msg: + assertmsg = self.helper('format_assertmsg', assert_.msg) + explanation = "\n>assert " + explanation + else: + assertmsg = ast.Str("") + explanation = "assert " + explanation + template = ast.BinOp(assertmsg, ast.Add(), ast.Str(explanation)) + msg = self.pop_format_context(template) + fmt = self.helper("format_explanation", msg) + err_name = ast.Name("AssertionError", ast.Load()) + exc = ast_Call(err_name, [fmt], []) + if sys.version_info[0] >= 3: + raise_ = ast.Raise(exc, None) + else: + raise_ = ast.Raise(exc, None, None) + body.append(raise_) + # Clear temporary variables by setting them to None. + if self.variables: + variables = [ast.Name(name, ast.Store()) + for name in self.variables] + clear = ast.Assign(variables, _NameConstant(None)) + self.statements.append(clear) + # Fix line numbers. + for stmt in self.statements: + set_location(stmt, assert_.lineno, assert_.col_offset) + return self.statements + + def visit_Name(self, name): + # Display the repr of the name if it's a local variable or + # _should_repr_global_name() thinks it's acceptable. + locs = ast_Call(self.builtin("locals"), [], []) + inlocs = ast.Compare(ast.Str(name.id), [ast.In()], [locs]) + dorepr = self.helper("should_repr_global_name", name) + test = ast.BoolOp(ast.Or(), [inlocs, dorepr]) + expr = ast.IfExp(test, self.display(name), ast.Str(name.id)) + return name, self.explanation_param(expr) + + def visit_BoolOp(self, boolop): + res_var = self.variable() + expl_list = self.assign(ast.List([], ast.Load())) + app = ast.Attribute(expl_list, "append", ast.Load()) + is_or = int(isinstance(boolop.op, ast.Or)) + body = save = self.statements + fail_save = self.on_failure + levels = len(boolop.values) - 1 + self.push_format_context() + # Process each operand, short-circuting if needed. + for i, v in enumerate(boolop.values): + if i: + fail_inner = [] + # cond is set in a prior loop iteration below + self.on_failure.append(ast.If(cond, fail_inner, [])) # noqa + self.on_failure = fail_inner + self.push_format_context() + res, expl = self.visit(v) + body.append(ast.Assign([ast.Name(res_var, ast.Store())], res)) + expl_format = self.pop_format_context(ast.Str(expl)) + call = ast_Call(app, [expl_format], []) + self.on_failure.append(ast.Expr(call)) + if i < levels: + cond = res + if is_or: + cond = ast.UnaryOp(ast.Not(), cond) + inner = [] + self.statements.append(ast.If(cond, inner, [])) + self.statements = body = inner + self.statements = save + self.on_failure = fail_save + expl_template = self.helper("format_boolop", expl_list, ast.Num(is_or)) + expl = self.pop_format_context(expl_template) + return ast.Name(res_var, ast.Load()), self.explanation_param(expl) + + def visit_UnaryOp(self, unary): + pattern = unary_map[unary.op.__class__] + operand_res, operand_expl = self.visit(unary.operand) + res = self.assign(ast.UnaryOp(unary.op, operand_res)) + return res, pattern % (operand_expl,) + + def visit_BinOp(self, binop): + symbol = binop_map[binop.op.__class__] + left_expr, left_expl = self.visit(binop.left) + right_expr, right_expl = self.visit(binop.right) + explanation = "(%s %s %s)" % (left_expl, symbol, right_expl) + res = self.assign(ast.BinOp(left_expr, binop.op, right_expr)) + return res, explanation + + def visit_Call_35(self, call): + """ + visit `ast.Call` nodes on Python3.5 and after + """ + new_func, func_expl = self.visit(call.func) + arg_expls = [] + new_args = [] + new_kwargs = [] + for arg in call.args: + res, expl = self.visit(arg) + arg_expls.append(expl) + new_args.append(res) + for keyword in call.keywords: + res, expl = self.visit(keyword.value) + new_kwargs.append(ast.keyword(keyword.arg, res)) + if keyword.arg: + arg_expls.append(keyword.arg + "=" + expl) + else: # **args have `arg` keywords with an .arg of None + arg_expls.append("**" + expl) + + expl = "%s(%s)" % (func_expl, ', '.join(arg_expls)) + new_call = ast.Call(new_func, new_args, new_kwargs) + res = self.assign(new_call) + res_expl = self.explanation_param(self.display(res)) + outer_expl = "%s\n{%s = %s\n}" % (res_expl, res_expl, expl) + return res, outer_expl + + def visit_Starred(self, starred): + # From Python 3.5, a Starred node can appear in a function call + res, expl = self.visit(starred.value) + return starred, '*' + expl + + def visit_Call_legacy(self, call): + """ + visit `ast.Call nodes on 3.4 and below` + """ + new_func, func_expl = self.visit(call.func) + arg_expls = [] + new_args = [] + new_kwargs = [] + new_star = new_kwarg = None + for arg in call.args: + res, expl = self.visit(arg) + new_args.append(res) + arg_expls.append(expl) + for keyword in call.keywords: + res, expl = self.visit(keyword.value) + new_kwargs.append(ast.keyword(keyword.arg, res)) + arg_expls.append(keyword.arg + "=" + expl) + if call.starargs: + new_star, expl = self.visit(call.starargs) + arg_expls.append("*" + expl) + if call.kwargs: + new_kwarg, expl = self.visit(call.kwargs) + arg_expls.append("**" + expl) + expl = "%s(%s)" % (func_expl, ', '.join(arg_expls)) + new_call = ast.Call(new_func, new_args, new_kwargs, + new_star, new_kwarg) + res = self.assign(new_call) + res_expl = self.explanation_param(self.display(res)) + outer_expl = "%s\n{%s = %s\n}" % (res_expl, res_expl, expl) + return res, outer_expl + + # ast.Call signature changed on 3.5, + # conditionally change which methods is named + # visit_Call depending on Python version + if sys.version_info >= (3, 5): + visit_Call = visit_Call_35 + else: + visit_Call = visit_Call_legacy + + def visit_Attribute(self, attr): + if not isinstance(attr.ctx, ast.Load): + return self.generic_visit(attr) + value, value_expl = self.visit(attr.value) + res = self.assign(ast.Attribute(value, attr.attr, ast.Load())) + res_expl = self.explanation_param(self.display(res)) + pat = "%s\n{%s = %s.%s\n}" + expl = pat % (res_expl, res_expl, value_expl, attr.attr) + return res, expl + + def visit_Compare(self, comp): + self.push_format_context() + left_res, left_expl = self.visit(comp.left) + if isinstance(comp.left, (ast.Compare, ast.BoolOp)): + left_expl = "({0})".format(left_expl) + res_variables = [self.variable() for i in range(len(comp.ops))] + load_names = [ast.Name(v, ast.Load()) for v in res_variables] + store_names = [ast.Name(v, ast.Store()) for v in res_variables] + it = zip(range(len(comp.ops)), comp.ops, comp.comparators) + expls = [] + syms = [] + results = [left_res] + for i, op, next_operand in it: + next_res, next_expl = self.visit(next_operand) + if isinstance(next_operand, (ast.Compare, ast.BoolOp)): + next_expl = "({0})".format(next_expl) + results.append(next_res) + sym = binop_map[op.__class__] + syms.append(ast.Str(sym)) + expl = "%s %s %s" % (left_expl, sym, next_expl) + expls.append(ast.Str(expl)) + res_expr = ast.Compare(left_res, [op], [next_res]) + self.statements.append(ast.Assign([store_names[i]], res_expr)) + left_res, left_expl = next_res, next_expl + # Use pytest.assertion.util._reprcompare if that's available. + expl_call = self.helper("call_reprcompare", + ast.Tuple(syms, ast.Load()), + ast.Tuple(load_names, ast.Load()), + ast.Tuple(expls, ast.Load()), + ast.Tuple(results, ast.Load())) + if len(comp.ops) > 1: + res = ast.BoolOp(ast.And(), load_names) + else: + res = load_names[0] + return res, self.explanation_param(self.pop_format_context(expl_call)) diff -Nru pypy-7.1.1+dfsg/pypy/tool/pytest/ast-rewriter/ast_util.py pypy-7.3.1+dfsg/pypy/tool/pytest/ast-rewriter/ast_util.py --- pypy-7.1.1+dfsg/pypy/tool/pytest/ast-rewriter/ast_util.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/tool/pytest/ast-rewriter/ast_util.py 2020-04-10 19:28:41.000000000 +0000 @@ -0,0 +1,306 @@ +"""Utilities for assertion debugging""" +from __future__ import absolute_import, division, print_function + +u = str + +# The _reprcompare attribute on the util module is used by the new assertion +# interpretation code and assertion rewriter to detect this plugin was +# loaded and in turn call the hooks defined here as part of the +# DebugInterpreter. +_reprcompare = None + + +# the re-encoding is needed for python2 repr +# with non-ascii characters (see issue 877 and 1379) +def ecu(s): + try: + return u(s, 'utf-8', 'replace') + except TypeError: + return s + + +def format_explanation(explanation): + """This formats an explanation + + Normally all embedded newlines are escaped, however there are + three exceptions: \n{, \n} and \n~. The first two are intended + cover nested explanations, see function and attribute explanations + for examples (.visit_Call(), visit_Attribute()). The last one is + for when one explanation needs to span multiple lines, e.g. when + displaying diffs. + """ + explanation = ecu(explanation) + lines = _split_explanation(explanation) + result = _format_lines(lines) + return '\n'.join(result) + + +def _split_explanation(explanation): + """Return a list of individual lines in the explanation + + This will return a list of lines split on '\n{', '\n}' and '\n~'. + Any other newlines will be escaped and appear in the line as the + literal '\n' characters. + """ + raw_lines = (explanation or '').split('\n') + lines = [raw_lines[0]] + for values in raw_lines[1:]: + if values and values[0] in ['{', '}', '~', '>']: + lines.append(values) + else: + lines[-1] += '\\n' + values + return lines + + +def _format_lines(lines): + """Format the individual lines + + This will replace the '{', '}' and '~' characters of our mini + formatting language with the proper 'where ...', 'and ...' and ' + + ...' text, taking care of indentation along the way. + + Return a list of formatted lines. + """ + result = lines[:1] + stack = [0] + stackcnt = [0] + for line in lines[1:]: + if line.startswith('{'): + if stackcnt[-1]: + s = 'and ' + else: + s = 'where ' + stack.append(len(result)) + stackcnt[-1] += 1 + stackcnt.append(0) + result.append(' +' + ' ' * (len(stack) - 1) + s + line[1:]) + elif line.startswith('}'): + stack.pop() + stackcnt.pop() + result[stack[-1]] += line[1:] + else: + assert line[0] in ['~', '>'] + stack[-1] += 1 + indent = len(stack) if line.startswith('~') else len(stack) - 1 + result.append(' ' * indent + line[1:]) + assert len(stack) == 1 + return result + + +# Provide basestring in python3 +try: + basestring = basestring +except NameError: + basestring = str + + +def saferepr(obj, maxsize=None): + s = repr(obj) + if maxsize is not None: + s = s[:maxsize] + return s + +def callbinrepr(op, left, right): + new_expl = assertrepr_compare(op, left, right) + new_expl = [line.replace("\n", "\\n") for line in new_expl] + res = "\n~".join(new_expl) + res = res.replace("%", "%%") + return res + + +def assertrepr_compare(op, left, right, verbose=False): + """Return specialised explanations for some operators/operands""" + width = 80 - 15 - len(op) - 2 # 15 chars indentation, 1 space around op + left_repr = saferepr(left, maxsize=int(width // 2)) + right_repr = saferepr(right, maxsize=width - len(left_repr)) + + summary = u('%s %s %s') % (left_repr, op, right_repr) + + def issequence(x): + return hasattr(x, '__iter__') and not isinstance(x, basestring) + + def istext(x): + return isinstance(x, basestring) + + def isdict(x): + return isinstance(x, dict) + + def isset(x): + return isinstance(x, (set, frozenset)) + + def isiterable(obj): + try: + iter(obj) + return not istext(obj) + except TypeError: + return False + + explanation = None + try: + if op == '==': + if istext(left) and istext(right): + explanation = _diff_text(left, right, verbose) + else: + if issequence(left) and issequence(right): + explanation = _compare_eq_sequence(left, right, verbose) + elif isset(left) and isset(right): + explanation = _compare_eq_set(left, right, verbose) + elif isdict(left) and isdict(right): + explanation = _compare_eq_dict(left, right, verbose) + if isiterable(left) and isiterable(right): + expl = _compare_eq_iterable(left, right, verbose) + if explanation is not None: + explanation.extend(expl) + else: + explanation = expl + elif op == 'not in': + if istext(left) and istext(right): + explanation = _notin_text(left, right, verbose) + except Exception as err: + explanation = [ + '(pytest assertion: representation of details failed. ' + 'Probably an object has a faulty __repr__.)', str(err)] + + if not explanation: + return None + + return [summary] + explanation + + +def _diff_text(left, right, verbose=False): + """Return the explanation for the diff between text or bytes + + Unless --verbose is used this will skip leading and trailing + characters which are identical to keep the diff minimal. + + If the input are bytes they will be safely converted to text. + """ + from difflib import ndiff + explanation = [] + if not verbose: + i = 0 # just in case left or right has zero length + for i in range(min(len(left), len(right))): + if left[i] != right[i]: + break + if i > 42: + i -= 10 # Provide some context + explanation = ['Skipping %s identical leading ' + 'characters in diff, use -v to show' % i] + left = left[i:] + right = right[i:] + if len(left) == len(right): + for i in range(len(left)): + if left[-i] != right[-i]: + break + if i > 42: + i -= 10 # Provide some context + explanation += ['Skipping %s identical trailing ' + 'characters in diff, use -v to show' % i] + left = left[:-i] + right = right[:-i] + keepends = True + explanation += [line.strip('\n') + for line in ndiff(left.splitlines(keepends), + right.splitlines(keepends))] + return explanation + + +def _compare_eq_iterable(left, right, verbose=False): + if not verbose: + return ['Use -v to get the full diff'] + # dynamic import to speedup pytest + import difflib, pprint + try: + left_formatting = pprint.pformat(left).splitlines() + right_formatting = pprint.pformat(right).splitlines() + explanation = ['Full diff:'] + except Exception: + # hack: PrettyPrinter.pformat() in python 2 fails when formatting items that can't be sorted(), ie, calling + # sorted() on a list would raise. See issue #718. + # As a workaround, the full diff is generated by using the repr() string of each item of each container. + left_formatting = sorted(repr(x) for x in left) + right_formatting = sorted(repr(x) for x in right) + explanation = ['Full diff (fallback to calling repr on each item):'] + explanation.extend(line.strip() for line in difflib.ndiff(left_formatting, right_formatting)) + return explanation + + +def _compare_eq_sequence(left, right, verbose=False): + explanation = [] + for i in range(min(len(left), len(right))): + if left[i] != right[i]: + explanation += [u('At index %s diff: %r != %r') + % (i, left[i], right[i])] + break + if len(left) > len(right): + explanation += [u('Left contains more items, first extra item: %s') + % saferepr(left[len(right)],)] + elif len(left) < len(right): + explanation += [ + u('Right contains more items, first extra item: %s') % + saferepr(right[len(left)],)] + return explanation + + +def _compare_eq_set(left, right, verbose=False): + explanation = [] + diff_left = left - right + diff_right = right - left + if diff_left: + explanation.append(u('Extra items in the left set:')) + for item in diff_left: + explanation.append(saferepr(item)) + if diff_right: + explanation.append(u('Extra items in the right set:')) + for item in diff_right: + explanation.append(saferepr(item)) + return explanation + + +def _compare_eq_dict(left, right, verbose=False): + import pprint + explanation = [] + common = set(left).intersection(set(right)) + same = dict((k, left[k]) for k in common if left[k] == right[k]) + if same and verbose < 2: + explanation += [u('Omitting %s identical items, use -vv to show') % + len(same)] + elif same: + explanation += [u('Common items:')] + explanation += pprint.pformat(same).splitlines() + diff = set(k for k in common if left[k] != right[k]) + if diff: + explanation += [u('Differing items:')] + for k in diff: + explanation += [saferepr({k: left[k]}) + ' != ' + + saferepr({k: right[k]})] + extra_left = set(left) - set(right) + if extra_left: + explanation.append(u('Left contains more items:')) + explanation.extend(pprint.pformat( + dict((k, left[k]) for k in extra_left)).splitlines()) + extra_right = set(right) - set(left) + if extra_right: + explanation.append(u('Right contains more items:')) + explanation.extend(pprint.pformat( + dict((k, right[k]) for k in extra_right)).splitlines()) + return explanation + + +def _notin_text(term, text, verbose=False): + index = text.find(term) + head = text[:index] + tail = text[index + len(term):] + correct_text = head + tail + diff = _diff_text(correct_text, text, verbose) + newdiff = [u('%s is contained here:') % saferepr(term, maxsize=42)] + for line in diff: + if line.startswith(u('Skipping')): + continue + if line.startswith(u('- ')): + continue + if line.startswith(u('+ ')): + newdiff.append(u(' ') + line[2:]) + else: + newdiff.append(line) + return newdiff diff -Nru pypy-7.1.1+dfsg/pypy/tool/pytest/fake_pytest/app_pytest.py pypy-7.3.1+dfsg/pypy/tool/pytest/fake_pytest/app_pytest.py --- pypy-7.1.1+dfsg/pypy/tool/pytest/fake_pytest/app_pytest.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/tool/pytest/fake_pytest/app_pytest.py 2020-04-10 19:28:41.000000000 +0000 @@ -0,0 +1,123 @@ +import pytest + + +def importorskip(name): + try: + return __import__(name) + except ImportError: + pytest.skip('Module %s not available' % name) + + +class MarkGenerator: + """ Factory for :class:`MarkDecorator` objects - exposed as + a ``pytest.mark`` singleton instance. Example:: + + import pytest + @pytest.mark.slowtest + def test_function(): + pass + + will set a 'slowtest' :class:`MarkInfo` object + on the ``test_function`` object. """ + + def __getattr__(self, name): + if name[0] == "_": + raise AttributeError("Marker name must NOT start with underscore") + return MarkDecorator(name) + +mark = MarkGenerator() + +def istestfunc(func): + return hasattr(func, "__call__") and \ + getattr(func, "__name__", "") != "" + +class MarkDecorator: + """ A decorator for test functions and test classes. When applied + it will create :class:`MarkInfo` objects which may be + :ref:`retrieved by hooks as item keywords `. + MarkDecorator instances are often created like this:: + + mark1 = pytest.mark.NAME # simple MarkDecorator + mark2 = pytest.mark.NAME(name1=value) # parametrized MarkDecorator + + and can then be applied as decorators to test functions:: + + @mark2 + def test_function(): + pass + + When a MarkDecorator instance is called it does the following: + 1. If called with a single class as its only positional argument and no + additional keyword arguments, it attaches itself to the class so it + gets applied automatically to all test cases found in that class. + 2. If called with a single function as its only positional argument and + no additional keyword arguments, it attaches a MarkInfo object to the + function, containing all the arguments already stored internally in + the MarkDecorator. + 3. When called in any other case, it performs a 'fake construction' call, + i.e. it returns a new MarkDecorator instance with the original + MarkDecorator's content updated with the arguments passed to this + call. + + Note: The rules above prevent MarkDecorator objects from storing only a + single function or class reference as their positional argument with no + additional keyword or positional arguments. + + """ + def __init__(self, name, args=None, kwargs=None): + self.name = name + self.args = args or () + self.kwargs = kwargs or {} + + def __repr__(self): + d = self.__dict__.copy() + name = d.pop('name') + return "" % (name, d) + + def __call__(self, *args, **kwargs): + """ if passed a single callable argument: decorate it with mark info. + otherwise add *args/**kwargs in-place to mark information. """ + if args and not kwargs: + func = args[0] + if len(args) == 1 and istestfunc(func): + holder = getattr(func, self.name, None) + if holder is None: + holder = MarkInfo( + self.name, self.args, self.kwargs + ) + setattr(func, self.name, holder) + else: + holder.add(self.args, self.kwargs) + return func + kw = self.kwargs.copy() + kw.update(kwargs) + args = self.args + args + return self.__class__(self.name, args=args, kwargs=kw) + + +class MarkInfo: + """ Marking object created by :class:`MarkDecorator` instances. """ + def __init__(self, name, args, kwargs): + #: name of attribute + self.name = name + #: positional argument list, empty if none specified + self.args = args + #: keyword argument dictionary, empty if nothing specified + self.kwargs = kwargs.copy() + self._arglist = [(args, kwargs.copy())] + + def __repr__(self): + return "" % ( + self.name, self.args, self.kwargs + ) + + def add(self, args, kwargs): + """ add a MarkInfo with the given args and kwargs. """ + self._arglist.append((args, kwargs)) + self.args += args + self.kwargs.update(kwargs) + + def __iter__(self): + """ yield MarkInfo objects each relating to a marking-call. """ + for args, kwargs in self._arglist: + yield MarkInfo(self.name, args, kwargs) diff -Nru pypy-7.1.1+dfsg/pypy/tool/pytest/fake_pytest/interp_pytest.py pypy-7.3.1+dfsg/pypy/tool/pytest/fake_pytest/interp_pytest.py --- pypy-7.1.1+dfsg/pypy/tool/pytest/fake_pytest/interp_pytest.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/tool/pytest/fake_pytest/interp_pytest.py 2020-04-10 19:28:41.000000000 +0000 @@ -0,0 +1,4 @@ +from pypy.tool.pytest.appsupport import pypyraises, pypyskip + +def fake_fixture(space, w_arg): + return w_arg diff -Nru pypy-7.1.1+dfsg/pypy/tool/pytest/fake_pytest/moduledef.py pypy-7.3.1+dfsg/pypy/tool/pytest/fake_pytest/moduledef.py --- pypy-7.1.1+dfsg/pypy/tool/pytest/fake_pytest/moduledef.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/tool/pytest/fake_pytest/moduledef.py 2020-04-10 19:28:41.000000000 +0000 @@ -0,0 +1,13 @@ +from pypy.interpreter.mixedmodule import MixedModule + +class Module(MixedModule): + applevel_name = 'pytest' + interpleveldefs = { + 'raises': 'interp_pytest.pypyraises', + 'skip': 'interp_pytest.pypyskip', + 'fixture': 'interp_pytest.fake_fixture', + } + appleveldefs = { + 'importorskip': 'app_pytest.importorskip', + 'mark': 'app_pytest.mark', + } diff -Nru pypy-7.1.1+dfsg/pypy/tool/pytest/objspace.py pypy-7.3.1+dfsg/pypy/tool/pytest/objspace.py --- pypy-7.1.1+dfsg/pypy/tool/pytest/objspace.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/tool/pytest/objspace.py 2020-04-10 19:28:41.000000000 +0000 @@ -7,10 +7,10 @@ _SPACECACHE={} def gettestobjspace(**kwds): - """ helper for instantiating and caching space's for testing. + """ helper for instantiating and caching spaces for testing. """ try: - config = make_config(option,**kwds) + config = make_config(option, **kwds) except ConflictConfigError as e: # this exception is typically only raised if a module is not available. # in this case the test should be skipped @@ -30,10 +30,12 @@ config = make_config(option) if config.objspace.usemodules.thread: config.translation.thread = True + config.objspace.extmodules = 'pypy.tool.pytest.fake_pytest' space = make_objspace(config) space.startup() # Initialize all builtin modules - space.setitem(space.builtin.w_dict, space.wrap('AssertionError'), - appsupport.build_pytest_assertion(space)) + if config.objspace.std.reinterpretasserts: + space.setitem(space.builtin.w_dict, space.wrap('AssertionError'), + appsupport.build_pytest_assertion(space)) space.setitem(space.builtin.w_dict, space.wrap('raises'), space.wrap(appsupport.app_raises)) space.setitem(space.builtin.w_dict, space.wrap('skip'), diff -Nru pypy-7.1.1+dfsg/pypy/tool/pytest/pypy_test_failure_demo.py pypy-7.3.1+dfsg/pypy/tool/pytest/pypy_test_failure_demo.py --- pypy-7.1.1+dfsg/pypy/tool/pytest/pypy_test_failure_demo.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/tool/pytest/pypy_test_failure_demo.py 2020-04-10 19:28:41.000000000 +0000 @@ -1,39 +1,14 @@ -class AppTestTest: +class AppTestTest: def test_app_method(self): - assert 42 == 41 + assert 42 == 41 -def app_test_app_func(): - assert 41 == 42 - -def test_interp_func(space): - assert space.is_true(space.w_None) +def test_interp_func(space): + assert space.is_true(space.w_None) def test_interp_reinterpret(space): a = 1 assert a == 2 -class TestInterpTest: - def test_interp_method(self): - assert self.space.is_true(self.space.w_False) - -def app_test_raises_in_statement(): - raises(ValueError, """ - y = x # name error - """) - -def app_test_raises_something(): - int("hallo") - -def app_test_raises_wrong1(): - raises(SyntaxError, 'int("hello")') - -def app_test_raises_wrong2(): - raises(SyntaxError, int, "hello") - -def app_test_raises_doesnt(): - raises(ValueError, int, 3) - -def app_test_skip(): - skip("skipped test") - - +class TestInterpTest: + def test_interp_method(self): + assert self.space.is_true(self.space.w_False) diff -Nru pypy-7.1.1+dfsg/pypy/tool/pytest/test/conftest1_innertest.py pypy-7.3.1+dfsg/pypy/tool/pytest/test/conftest1_innertest.py --- pypy-7.1.1+dfsg/pypy/tool/pytest/test/conftest1_innertest.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/tool/pytest/test/conftest1_innertest.py 2020-04-10 19:28:41.000000000 +0000 @@ -1,15 +1,12 @@ -def test_something(space): - assert space.w_None is space.w_None +def test_something(space): + assert space.w_None is space.w_None -def app_test_something(): - assert 42 == 42 +class AppTestSomething: + def test_method_app(self): + assert 23 == 23 -class AppTestSomething: - def test_method_app(self): - assert 23 == 23 - class TestSomething: - def test_method(self): - assert self.space - + def test_method(self): + assert self.space + diff -Nru pypy-7.1.1+dfsg/pypy/tool/pytest/test/test_appsupport.py pypy-7.3.1+dfsg/pypy/tool/pytest/test/test_appsupport.py --- pypy-7.1.1+dfsg/pypy/tool/pytest/test/test_appsupport.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/tool/pytest/test/test_appsupport.py 2020-04-10 19:28:41.000000000 +0000 @@ -23,10 +23,16 @@ def test_method(self): pass """) + testdir.makepyfile(apptest_collection=""" + def test_app(): + pass + """) setpypyconftest(testdir) result = testdir.runpytest("--collectonly") assert result.ret == 0 result.stdout.fnmatch_lines([ + "*AppTestModule*apptest_collection*", + "*AppTestFunction*test_app*", "*Function*test_func*", "*Class*TestClassInt*", "*Function*test_method*", @@ -34,47 +40,42 @@ "*AppTestMethod*", ]) -class TestSpaceConfig: - def test_applevel_skipped_on_cpython_and_spaceconfig(self, testdir): - setpypyconftest(testdir) - testdir.makepyfile(""" - class AppTestClass: - spaceconfig = {"objspace.usemodules._random": True} - def setup_class(cls): - assert 0 - def test_applevel(self): - pass - """) - result = testdir.runpytest("-A") - assert result.ret == 0 - if hasattr(sys, 'pypy_translation_info') and \ - sys.pypy_translation_info.get('objspace.usemodules._random'): - result.stdout.fnmatch_lines(["*1 error*"]) - else: - # setup_class didn't get called, otherwise it would error - result.stdout.fnmatch_lines(["*1 skipped*"]) - - def test_interp_spaceconfig(self, testdir): - setpypyconftest(testdir) - p = testdir.makepyfile(""" - class TestClass: - spaceconfig = {"objspace.usemodules._random": False} - def setup_class(cls): - assert not cls.space.config.objspace.usemodules._random - def test_interp(self, space): - assert self.space is space - def test_interp2(self, space): - assert self.space is space - """) - result = testdir.runpytest(p) - assert result.ret == 0 - result.stdout.fnmatch_lines(["*2 passed*"]) +def test_interp_spaceconfig(testdir): + setpypyconftest(testdir) + p = testdir.makepyfile(""" + class TestClass: + spaceconfig = {"objspace.usemodules._random": False} + def setup_class(cls): + assert not cls.space.config.objspace.usemodules._random + def test_interp(self, space): + assert self.space is space + def test_interp2(self, space): + assert self.space is space + """) + result = testdir.runpytest(p) + assert result.ret == 0 + result.stdout.fnmatch_lines(["*2 passed*"]) + +def test_spaceconfig_param(testdir): + setpypyconftest(testdir) + p = testdir.makepyfile(""" + import pytest + + @pytest.mark.parametrize('spaceconfig', + [{"objspace.usemodules._random": False}]) + def test_interp(space): + assert not space.config.objspace.usemodules._random + + def test_interp2(space): + assert space.config.objspace.usemodules._random + """) + result = testdir.runpytest(p) + assert result.ret == 0 + result.stdout.fnmatch_lines(["*2 passed*"]) def test_applevel_raises_simple_display(testdir): setpypyconftest(testdir) p = testdir.makepyfile(""" - def app_test_raises(): - raises(ValueError, x) class AppTestRaises: def test_func(self): raises (ValueError, x) @@ -83,7 +84,6 @@ result = testdir.runpytest(p, "-s") assert result.ret == 1 result.stdout.fnmatch_lines([ - "*E*application-level*NameError*x*not defined", "*test_func(self)*", ">*raises*ValueError*", "*E*application-level*NameError*x*not defined", @@ -95,43 +95,71 @@ "*E*application-level*NameError*x*not defined", ]) -def test_applevel_raises_display(testdir): +def test_apptest_raise(testdir): setpypyconftest(testdir) - p = testdir.makepyfile(""" - def app_test_raises(): - raises(ValueError, "x") - pass + p = testdir.makepyfile(apptest_raise=""" + def test_raise(): + raise KeyError(42) """) - result = testdir.runpytest(p, "-s") + result = testdir.runpytest(p) assert result.ret == 1 result.stdout.fnmatch_lines([ - "*E*application-level*NameError*x*not defined", + "*E*application-level*KeyError*42*", ]) - result = testdir.runpytest(p) # this time we may run the pyc file + +def test_apptest_fail_plain(testdir): + setpypyconftest(testdir) + p = testdir.makepyfile(apptest_fail=""" + def test_fail(): + x = 'foo' + assert x == 'bar' + """) + result = testdir.runpytest(p) assert result.ret == 1 result.stdout.fnmatch_lines([ - "*E*application-level*NameError*x*not defined", + "*E*(application-level) AssertionError", ]) -def test_applevel_raise_keyerror(testdir): +def test_apptest_fail_rewrite(testdir): setpypyconftest(testdir) - p = testdir.makepyfile(""" - def app_test_raises(): - raise KeyError(42) - pass + p = testdir.makepyfile(apptest_fail_rewrite=""" + def test_fail(): + x = 'foo' + assert x == 'bar' """) - result = testdir.runpytest(p, "-s") + result = testdir.runpytest(p, "--applevel-rewrite") assert result.ret == 1 result.stdout.fnmatch_lines([ - "*E*application-level*KeyError*42*", + "*E*application-level*AssertionError: assert 'foo' == 'bar'", + "*E*- foo*", + "*E*+ bar*", ]) -def app_test_raises(): - info = raises(TypeError, id) - assert info.type is TypeError - assert isinstance(info.value, TypeError) - - x = 43 - info = raises(ZeroDivisionError, "x/0") - assert info.type is ZeroDivisionError - assert isinstance(info.value, ZeroDivisionError) +def test_apptest_spaceconfig(testdir): + setpypyconftest(testdir) + p = testdir.makepyfile(apptest_raise=""" + # spaceconfig = {"usemodules":["array"]} + import array + def test_array(): + a = array.array('i', [1,2,3]) + assert len(a) == 3 + assert a[2] == 3 + """) + result = testdir.runpytest(p) + assert result.ret == 0 + +def test_apptest_skipif(testdir): + setpypyconftest(testdir) + p = testdir.makepyfile(apptest_raise=""" + import pytest + + @pytest.mark.skipif(True, reason="Bad test") + def test_bad(): + assert False + + def test_success(): + assert True + """) + result = testdir.runpytest(p) + assert result.ret == 0 + result.assert_outcomes(passed=1, skipped=1) diff -Nru pypy-7.1.1+dfsg/pypy/tool/pytest/test/test_conftest1.py pypy-7.3.1+dfsg/pypy/tool/pytest/test/test_conftest1.py --- pypy-7.1.1+dfsg/pypy/tool/pytest/test/test_conftest1.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/tool/pytest/test/test_conftest1.py 2020-04-10 19:28:41.000000000 +0000 @@ -16,7 +16,6 @@ def test_selection_by_keyword_app(self, testdir): sorter = testdir.inline_run("-m", "applevel", innertest) passed, skipped, failed = sorter.listoutcomes() - assert len(passed) == 2 + assert len(passed) == 1 assert not skipped and not failed - assert "app_test_something" in passed[0].nodeid - assert "test_method_app" in passed[1].nodeid + assert "test_method_app" in passed[0].nodeid diff -Nru pypy-7.1.1+dfsg/pypy/tool/pytest/test/test_pytestsupport.py pypy-7.3.1+dfsg/pypy/tool/pytest/test/test_pytestsupport.py --- pypy-7.1.1+dfsg/pypy/tool/pytest/test/test_pytestsupport.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/tool/pytest/test/test_pytestsupport.py 2020-04-10 19:28:41.000000000 +0000 @@ -43,27 +43,6 @@ else: assert False, "got no exception!" -def app_test_exception(): - try: - raise AssertionError("42") - except AssertionError: - pass - else: - raise AssertionError("app level AssertionError mixup!") - -def app_test_exception_with_message(): - try: - assert 0, "Failed" - except AssertionError as e: - assert e.msg == "Failed" - -def app_test_comparison(): - try: - assert 3 > 4 - except AssertionError as e: - assert "3 > 4" in e.msg - - def test_appexecinfo(space): try: space.appexec([], "(): raise ValueError") diff -Nru pypy-7.1.1+dfsg/pypy/tool/release/force-builds.py pypy-7.3.1+dfsg/pypy/tool/release/force-builds.py --- pypy-7.1.1+dfsg/pypy/tool/release/force-builds.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/tool/release/force-builds.py 2020-04-10 19:28:41.000000000 +0000 @@ -8,31 +8,42 @@ modified by PyPy team """ +from __future__ import absolute_import, division, print_function -import os, sys, urllib, subprocess +import os, sys, subprocess +try: + from urllib2 import quote +except ImportError: + from urllib.request import quote from twisted.internet import reactor, defer from twisted.python import log from twisted.web import client from twisted.web.error import PageRedirect -BUILDERS = [ +OWN_BUILDERS = [ 'own-linux-x86-32', 'own-linux-x86-64', # 'own-linux-armhf', 'own-win-x86-32', 'own-linux-s390x', # 'own-macosx-x86-32', + 'own-linux-aarch64', +] +JIT_BUILDERS = [ 'pypy-c-jit-linux-x86-32', 'pypy-c-jit-linux-x86-64', # 'pypy-c-jit-freebsd-9-x86-64', 'pypy-c-jit-macosx-x86-64', 'pypy-c-jit-win-x86-32', 'pypy-c-jit-linux-s390x', - 'build-pypy-c-jit-linux-armhf-raspbian', - 'build-pypy-c-jit-linux-armel', +# 'build-pypy-c-jit-linux-armhf-raspbian', +# 'build-pypy-c-jit-linux-armel', + 'pypy-c-jit-linux-aarch64', +] +RPYTHON_BUILDERS = [ 'rpython-linux-x86-32', - 'rpython-linux-x86-64' + 'rpython-linux-x86-64', 'rpython-win-x86-32' ] @@ -43,7 +54,7 @@ import pwd return pwd.getpwuid(os.getuid())[0] -def main(branch, server, user): +def main(branch, server, user, minimal=False): #XXX: handle release tags #XXX: handle validity checks lock = defer.DeferredLock() @@ -53,25 +64,29 @@ return None log.err(err, "Build force failure") - for builder in BUILDERS: - print 'Forcing', builder, '...' + if minimal: + builders = JIT_BUILDERS + else: + builders = RPYTHON_BUILDERS + OWN_BUILDERS + JIT_BUILDERS + + for builder in builders: + print('Forcing', builder, '...') url = "http://" + server + "/builders/" + builder + "/force" args = [ ('username', user), ('revision', ''), - ('forcescheduler', 'Force Scheduler'), - ('submit', 'Force Build'), + ('forcescheduler', 'Force Build'), ('branch', branch), - ('comments', "Forced by command line script")] - url = url + '?' + '&'.join([k + '=' + urllib.quote(v) for (k, v) in args]) + ('reason', "Forced by command line script")] + url = url + '?' + '&'.join([k + '=' + quote(v) for (k, v) in args]) requests.append( - lock.run(client.getPage, url, followRedirect=False).addErrback(ebList)) + lock.run(client.getPage, url.encode('utf-8'), followRedirect=False).addErrback(ebList)) d = defer.gatherResults(requests) d.addErrback(log.err) d.addCallback(lambda ign: reactor.stop()) reactor.run() - print 'See http://buildbot.pypy.org/summary after a while' + print('See http://buildbot.pypy.org/summary after a while') if __name__ == '__main__': log.startLogging(sys.stdout) @@ -80,12 +95,17 @@ parser.add_option("-b", "--branch", help="branch to build", default='') parser.add_option("-s", "--server", help="buildbot server", default="buildbot.pypy.org") parser.add_option("-u", "--user", help="user name to report", default=get_user()) + parser.add_option("-m", "--minimal", action="store_true", default=False, + help="minimal: trigger pypy-c-jit only") (options, args) = parser.parse_args() if not options.branch: parser.error("branch option required") try: subprocess.check_call(['hg','id','-r', options.branch]) except subprocess.CalledProcessError: - print 'branch', options.branch, 'could not be found in local repository' + print('branch', options.branch, 'could not be found in local repository') + sys.exit(-1) + if options.branch.startswith('release') and not '-v' in options.branch: + print('release branches must be of the form "release.*-v.*') sys.exit(-1) - main(options.branch, options.server, user=options.user) + main(options.branch, options.server, user=options.user, minimal=options.minimal) diff -Nru pypy-7.1.1+dfsg/pypy/tool/release/make_portable.py pypy-7.3.1+dfsg/pypy/tool/release/make_portable.py --- pypy-7.1.1+dfsg/pypy/tool/release/make_portable.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/tool/release/make_portable.py 2020-04-10 19:28:41.000000000 +0000 @@ -0,0 +1,114 @@ +#!/usr/bin/env python + +bundle = ['sqlite3', 'ssl', 'crypto', 'ffi', 'expat', 'tcl8', 'tk8', 'gdbm', + 'lzma', 'tinfo', 'tinfow', 'ncursesw', 'panelw', 'ncurses', 'panel', 'panelw'] + +import os +from os.path import dirname, relpath, join, exists, basename, realpath +from shutil import copy2, copytree +import sys +from glob import glob +from subprocess import check_output, check_call + + +def get_deps(binary): + deps = {} + output = check_output(['ldd', binary]) + for line in output.splitlines(): + if '=>' not in line: + continue + line = line.strip() + needed, path = line.split(' => ') + if path == 'not found': + print('Broken dependency in ' + binary) + path = path.split(' ')[0] + path = realpath(path) + if not path: + continue + + if needed[3:].split('.', 1)[0] not in bundle: + continue + + deps[needed] = path + deps.update(get_deps(path)) + + return deps + + +def gather_deps(binaries): + deps = {} + for binary in binaries: + deps.update(get_deps(binary)) + + return deps + + +def copy_deps(deps): + copied = {} + + for needed, path in deps.items(): + bname = basename(path) + + copy2(path, 'lib/' + bname) + copied[path] = 'lib/' + bname + + if not exists('lib/' + needed): + os.symlink(bname, 'lib/' + needed) + + return copied + + +def rpath_binaries(binaries): + rpaths = {} + + for binary in binaries: + check_call(['chmod', 'a+w', binary]) + rpath = join('$ORIGIN', relpath('lib', dirname(binary))) + check_call(['patchelf', '--set-rpath', rpath, binary]) + + rpaths[binary] = rpath + + return rpaths + + +def make_portable(): + binaries = glob('bin/libpypy*.so') + if not binaries: + raise ValueError('Could not find bin/libpypy*.so in "%s"' % os.getcwd()) + binaries.extend(glob('lib_pypy/*_cffi.pypy*.so')) + binaries.extend(glob('lib_pypy/_pypy_openssl*.so')) + binaries.extend(glob('lib_pypy/_tkinter/*_cffi.pypy*.so')) + + deps = gather_deps(binaries) + + copied = copy_deps(deps) + + for path, item in copied.items(): + print('Copied {0} to {1}'.format(path, item)) + + copytree('/usr/share/tcl8.5', 'lib/tcl') + copytree('/usr/share/tk8.5', 'lib/tk') + + binaries.extend(copied.values()) + + rpaths = rpath_binaries(binaries) + for binary, rpath in rpaths.items(): + print('Set RPATH of {0} to {1}'.format(binary, rpath)) + + return deps + + +if __name__ == '__main__': + try: + os.chdir(sys.argv[1]) + except: + print('Call as %s >sys.stderr, """!!!!!!!!!!\nBuilding {0} bindings failed. + print("""!!!!!!!!!!\nBuilding {0} bindings failed. You can either install development headers package, add the --without-{0} option to skip packaging this - binary CFFI extension, or say --without-cffi.""".format(key) + binary CFFI extension, or say --without-cffi.""".format(key), + file=sys.stderr) if len(failures) > 0: return 1, None - if sys.platform == 'win32' and not rename_pypy_c.lower().endswith('.exe'): + if ARCH == 'win32' and not rename_pypy_c.lower().endswith('.exe'): rename_pypy_c += '.exe' binaries = [(pypy_c, rename_pypy_c, None)] - if (sys.platform != 'win32' and # handled below + if (ARCH != 'win32' and # handled below not _fake and os.path.getsize(str(pypy_c)) < 500000): - # This pypy-c is very small, so it means it relies on libpypy_c.so. + # This 'pypy_c' is very small, so it means it relies on a so/dll # If it would be bigger, it wouldn't. That's a hack. - libpypy_name = ('libpypy-c.so' if not sys.platform.startswith('darwin') - else 'libpypy-c.dylib') + if ARCH.startswith('darwin'): + ext = 'dylib' + else: + ext = 'so' + libpypy_name = 'lib' + POSIX_EXE + '-c.' + ext libpypy_c = pypy_c.new(basename=libpypy_name) if not libpypy_c.check(): raise PyPyCNotFound('Expected pypy to be mostly in %r, but did ' @@ -117,7 +140,7 @@ shutil.copytree(str(includedir), str(pypydir.join('include'))) pypydir.ensure('include', dir=True) - if sys.platform == 'win32': + if ARCH == 'win32': os.environ['PATH'] = str(basedir.join('externals').join('bin')) + ';' + \ os.environ.get('PATH', '') src, tgt, _ = binaries[0] @@ -125,10 +148,11 @@ if pypyw.exists(): tgt = py.path.local(tgt) binaries.append((pypyw, tgt.new(purebasename=tgt.purebasename + 'w').basename, None)) - print "Picking %s" % str(pypyw) - # Can't rename a DLL: it is always called 'libpypy-c.dll' - win_extras = [('libpypy-c.dll', None), ('sqlite3.dll', lib_pypy)] - if not options.no_tk: + print("Picking %s" % str(pypyw)) + # Can't rename a DLL + win_extras = [('lib' + POSIX_EXE + '-c.dll', None), + ('sqlite3.dll', lib_pypy)] + if not options.no__tkinter: tkinter_dir = lib_pypy.join('_tkinter') win_extras += [('tcl85.dll', tkinter_dir), ('tk85.dll', tkinter_dir)] @@ -137,25 +161,25 @@ if not p.check(): p = py.path.local.sysfind(extra) if not p: - print "%s not found, expect trouble if this is a shared build" % (extra,) + print("%s not found, expect trouble if this " + "is a shared build" % (extra,)) continue - print "Picking %s" % p + print("Picking %s" % p) binaries.append((p, p.basename, target_dir)) libsdir = basedir.join('libs') if libsdir.exists(): - print 'Picking %s (and contents)' % libsdir + print('Picking %s (and contents)' % libsdir) shutil.copytree(str(libsdir), str(pypydir.join('libs'))) else: - print '"libs" dir with import library not found.' - print 'You have to create %r' % (str(libsdir),) - print 'and copy libpypy-c.lib in there, renamed to python27.lib' + if not _fake: + raise RuntimeError('"libs" dir with import library not found.') # XXX users will complain that they cannot compile capi (cpyext) # modules for windows, also embedding pypy (i.e. in cffi) # will fail. # Has the lib moved, was translation not 'shared', or are # there no exported functions in the dll so no import # library was created? - if not options.no_tk: + if not options.no__tkinter: try: p = pypy_c.dirpath().join('tcl85.dll') if not p.check(): @@ -165,24 +189,26 @@ tktcldir = p.dirpath().join('..').join('lib') shutil.copytree(str(tktcldir), str(pypydir.join('tcl'))) except WindowsError: - print >>sys.stderr, r"""Packaging Tk runtime failed. -tk85.dll and tcl85.dll found in %s, expecting to find runtime in %s -directory next to the dlls, as per build instructions.""" %(p, tktcldir) + print("Packaging Tk runtime failed. tk85.dll and tcl85.dll " + "found in %s, expecting to find runtime in %s directory " + "next to the dlls, as per build " + "instructions." %(p, tktcldir), file=sys.stderr) import traceback;traceback.print_exc() raise MissingDependenciesError('Tk runtime') - print '* Binaries:', [source.relto(str(basedir)) - for source, target, target_dir in binaries] + print('* Binaries:', [source.relto(str(basedir)) + for source, target, target_dir in binaries]) # Careful: to copy lib_pypy, copying just the hg-tracked files - # would not be enough: there are also ctypes_config_cache/_*_cache.py. - # XXX ^^^ this is no longer true! + # would not be enough: there are also build artifacts like cffi-generated + # dynamic libs shutil.copytree(str(basedir.join('lib-python').join(STDLIB_VER)), str(pypydir.join('lib-python').join(STDLIB_VER)), ignore=ignore_patterns('.svn', 'py', '*.pyc', '*~')) shutil.copytree(str(basedir.join('lib_pypy')), str(lib_pypy), ignore=ignore_patterns('.svn', 'py', '*.pyc', '*~', - '*_cffi.c', '*.o')) + '*_cffi.c', '*.o', '*.pyd-*', '*.obj', + '*.lib', '*.exp', '*.manifest')) for file in ['README.rst',]: shutil.copy(str(basedir.join(file)), str(pypydir)) for file in ['_testcapimodule.c', '_ctypes_test.c']: @@ -198,7 +224,7 @@ spdir = pypydir.ensure('site-packages', dir=True) shutil.copy(str(basedir.join('site-packages', 'README')), str(spdir)) # - if sys.platform == 'win32': + if ARCH == 'win32': bindir = pypydir else: bindir = pypydir.join('bin') @@ -213,6 +239,14 @@ else: open(str(archive), 'wb').close() os.chmod(str(archive), 0755) + #if not _fake and not ARCH == 'win32': + # # create the pypy3 symlink + # old_dir = os.getcwd() + # os.chdir(str(bindir)) + # try: + # os.symlink(POSIX_EXE, 'pypy3') + # finally: + # os.chdir(old_dir) fix_permissions(pypydir) old_dir = os.getcwd() @@ -225,7 +259,15 @@ else: archive = bindir.join(target) smartstrip(archive, keep_debug=options.keep_debug) - # + + # make the package portable by adding rpath=$ORIGIN/..lib, + # bundling dependencies + if options.make_portable: + os.chdir(str(name)) + if not os.path.exists('lib'): + os.mkdir('lib') + make_portable() + os.chdir(str(builddir)) if USE_ZIPFILE_MODULE: import zipfile archive = str(builddir.join(name + '.zip')) @@ -238,11 +280,12 @@ zf.close() else: archive = str(builddir.join(name + '.tar.bz2')) - if sys.platform == 'darwin': - print >>sys.stderr, """Warning: tar on current platform does not suport overriding the uid and gid -for its contents. The tarball will contain your uid and gid. If you are -building the actual release for the PyPy website, you may want to be -using another platform...""" + if ARCH == 'darwin': + print("Warning: tar on current platform does not suport " + "overriding the uid and gid for its contents. The tarball " + "will contain your uid and gid. If you are building the " + "actual release for the PyPy website, you may want to be " + "using another platform...", file=sys.stderr) e = os.system('tar --numeric-owner -cvjf ' + archive + " " + name) elif sys.platform.startswith('freebsd'): e = os.system('tar --uname=root --gname=wheel -cvjf ' + archive + " " + name) @@ -255,22 +298,27 @@ finally: os.chdir(old_dir) if options.targetdir: - print "Copying %s to %s" % (archive, options.targetdir) + print("Copying %s to %s" % (archive, options.targetdir)) shutil.copy(archive, options.targetdir) else: - print "Ready in %s" % (builddir,) + print("Ready in %s" % (builddir,)) return retval, builddir # for tests def package(*args, **kwds): - try: - import argparse - except ImportError: - import imp - argparse = imp.load_source('argparse', 'lib-python/2.7/argparse.py') - if sys.platform == 'win32': - pypy_exe = 'pypy.exe' + import argparse + + class NegateAction(argparse.Action): + def __init__(self, option_strings, dest, nargs=0, **kwargs): + super(NegateAction, self).__init__(option_strings, dest, nargs, + **kwargs) + + def __call__(self, parser, ns, values, option): + setattr(ns, self.dest, option[2:4] != 'no') + + if ARCH == 'win32': + pypy_exe = POSIX_EXE + '.exe' else: - pypy_exe = 'pypy' + pypy_exe = POSIX_EXE parser = argparse.ArgumentParser() args = list(args) if args: @@ -288,7 +336,7 @@ parser.add_argument('--no-keep-debug', dest='keep_debug', action='store_false', help='do not keep debug symbols') parser.add_argument('--rename_pypy_c', dest='pypy_c', type=str, default=pypy_exe, - help='target executable name, defaults to "pypy"') + help='target executable name, defaults to "%s"' % pypy_exe) parser.add_argument('--archive-name', dest='name', type=str, default='', help='pypy-VER-PLATFORM') parser.add_argument('--builddir', type=str, default='', @@ -296,13 +344,30 @@ parser.add_argument('--targetdir', type=str, default='', help='destination dir for archive') parser.add_argument('--override_pypy_c', type=str, default='', - help='use as pypy exe instead of pypy/goal/pypy-c') + help='use as pypy3 exe instead of pypy/goal/pypy3-c') + parser.add_argument('--embedded-dependencies', '--no-embedded-dependencies', + dest='embed_dependencies', + action=NegateAction, + default=(ARCH in ('darwin', 'aarch64')), + help='whether to embed dependencies in CFFI modules ' + '(default on OS X)') + parser.add_argument('--make-portable', + dest='make_portable', + action='store_true', + help='make the package portable by shipping ' + 'dependent shared objects and mangling RPATH') options = parser.parse_args(args) if os.environ.has_key("PYPY_PACKAGE_NOKEEPDEBUG"): options.keep_debug = False if os.environ.has_key("PYPY_PACKAGE_WITHOUTTK"): - options.no_tk = True + options.no__tkinter = True + if os.environ.has_key("PYPY_EMBED_DEPENDENCIES"): + options.embed_dependencies = True + elif os.environ.has_key("PYPY_NO_EMBED_DEPENDENCIES"): + options.embed_dependencies = False + if os.environ.has_key("PYPY_MAKE_PORTABLE"): + options.make_portable = True if not options.builddir: # The import actually creates the udir directory from rpython.tool.udir import udir @@ -317,7 +382,7 @@ if __name__ == '__main__': import sys - if sys.platform == 'win32': + if ARCH == 'win32': # Try to avoid opeing a dialog box if one of the # subprocesses causes a system error import ctypes diff -Nru pypy-7.1.1+dfsg/pypy/tool/release/repackage.sh pypy-7.3.1+dfsg/pypy/tool/release/repackage.sh --- pypy-7.1.1+dfsg/pypy/tool/release/repackage.sh 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/tool/release/repackage.sh 2020-04-10 19:28:42.000000000 +0000 @@ -1,108 +1,137 @@ # Edit these appropriately before running this script pmaj=2 # python main version: 2 or 3 pmin=7 # python minor version -exe=pypy3 # pypy3 or pypy maj=7 -min=1 -rev=0 +min=3 +rev=1 +rc=rc1 # set to blank for actual release + +function maybe_exit { + if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then + # script is being run, not "sourced" (as in "source repackage.sh") + # so exit + exit 1 + fi +} +case $pmaj in + "2") exe=pypy;; + "3") exe=pypy3;; + *) echo invalid pmaj=$pmaj; maybe_exit +esac branchname=release-pypy$pmaj.$pmin-v$maj.x # ==OR== release-v$maj.x # ==OR== release-v$maj.$min.x -tagname=release-candidate-pypy$pmaj.$pmin-v$maj.$min.$rev # ==OR== release-$maj.$min # tagname=release-pypy$pmaj.$pmin-v$maj.$min.$rev # ==OR== release-$maj.$min +tagname=release-pypy$pmaj.$pmin-v$maj.$min.${rev}$rc # ==OR== release-$maj.$min echo checking hg log -r $branchname -hg log -r $branchname || exit 1 +hg log -r $branchname || maybe_exit echo checking hg log -r $tagname -hg log -r $tagname || exit 1 +hg log -r $tagname || maybe_exit hgrev=`hg id -r $tagname -i` -rel=pypy$pmaj.$pmin-v$maj.$min.$rev -# The script should be run in an empty in the pypy tree, i.e. pypy/tmp -if [ "`ls . | wc -l`" != "0" ] -then - echo this script must be run in an empty directory - exit -1 -fi +rel=pypy$pmaj.$pmin-v$maj.$min.${rev}$rc + +if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then + # script is being run, not "sourced" (as in "source repackage.sh") -# Download latest builds from the buildmaster, rename the top -# level directory, and repackage ready to be uploaded to bitbucket -actual_ver=xxxxxxxxxxxxxxx -for plat in linux linux64 osx64 s390x # linux-armhf-raspbian linux-armel - do - echo downloading package for $plat - if wget -q --show-progress http://buildbot.pypy.org/nightly/$branchname/pypy-c-jit-latest-$plat.tar.bz2 + # The script should be run in an empty in the pypy tree, i.e. pypy/tmp + if [ "`ls . | wc -l`" != "0" ] then - echo $plat downloaded - else - echo $plat no download available - continue + echo this script must be run in an empty directory + exit 1 fi - hgcheck=`tar -tf pypy-c-jit-latest-$plat.tar.bz2 |head -n1 | cut -d- -f5` - if [ "$hgcheck" != "$hgrev" ] +fi + +function repackage_builds { + # Download latest builds from the buildmaster, rename the top + # level directory, and repackage ready to be uploaded + actual_ver=xxxxxxxxxxxxxxx + for plat in linux linux64 osx64 aarch64 # s390x linux-armhf-raspbian linux-armel + do + echo downloading package for $plat + if wget -q --show-progress http://buildbot.pypy.org/nightly/$branchname/pypy-c-jit-latest-$plat.tar.bz2 + then + echo $plat downloaded + else + echo $plat no download available + continue + fi + hgcheck=`tar -tf pypy-c-jit-latest-$plat.tar.bz2 |head -n1 | cut -d- -f5` + if [ "$hgcheck" != "$hgrev" ] + then + echo xxxxxxxxxxxxxxxxxxxxxx + echo $plat hg tag mismatch, expected $hgrev, got $hgcheck + echo xxxxxxxxxxxxxxxxxxxxxx + rm pypy-c-jit-latest-$plat.tar.bz2 + continue + fi + tar -xf pypy-c-jit-latest-$plat.tar.bz2 + rm pypy-c-jit-latest-$plat.tar.bz2 + plat_final=$plat + if [ $plat = linux ]; then + plat_final=linux32 + fi + mv pypy-c-jit-*-$plat $rel-$plat_final + # TODO: automate the platform choice or move it to the head of the file + if [ $plat_final == linux64 ] + then + actual_ver=`$rel-$plat_final/bin/$exe -c "import sys; print('.'.join([str(x) for x in sys.pypy_version_info[:2]]))"` + fi + echo packaging $plat_final + tar --owner=root --group=root --numeric-owner -cjf $rel-$plat_final.tar.bz2 $rel-$plat_final + rm -rf $rel-$plat_final + done + if [ "$actual_ver" != "$maj.$min" ] then echo xxxxxxxxxxxxxxxxxxxxxx - echo $plat hg tag mismatch, expected $hgrev, got $hgcheck + echo version mismatch, expected $maj.$min, got $actual_ver echo xxxxxxxxxxxxxxxxxxxxxx - rm pypy-c-jit-latest-$plat.tar.bz2 + exit -1 + rm -rf $rel-$plat_final continue fi - tar -xf pypy-c-jit-latest-$plat.tar.bz2 - rm pypy-c-jit-latest-$plat.tar.bz2 - plat_final=$plat - if [ $plat = linux ]; then - plat_final=linux32 + plat=win32 + if wget http://buildbot.pypy.org/nightly/$branchname/pypy-c-jit-latest-$plat.zip + then + unzip -q pypy-c-jit-latest-$plat.zip + rm pypy-c-jit-latest-$plat.zip + mv pypy-c-jit-*-$plat $rel-$plat + zip -rq $rel-$plat.zip $rel-$plat + rm -rf $rel-$plat + else + echo no download for $plat fi - mv pypy-c-jit-*-$plat $rel-$plat_final - # TODO: automate the platform choice or move it to the head of the file - if [ $plat_final == linux64 ] +} +function repackage_source { + # Download source and repackage + # Requires a valid $tagname, note the untarred directory is pypy-pypy- + # so make sure there is not another one + if wget https://foss.heptapod.net/pypy/pypy/repository/$tagname/archive.tar.gz then - actual_ver=`$rel-$plat_final/bin/$exe -c "import sys; print('.'.join([str(x) for x in sys.pypy_version_info[:2]]))"` + tar -xf archive.tar.gz + rm archive.tar.gz + mv pypy-release-* $rel-src + tar --owner=root --group=root --numeric-owner -cjf $rel-src.tar.bz2 $rel-src + zip -rq $rel-src.zip $rel-src + rm -rf $rel-src + else + echo source tarfile for $tagname not found on bitbucket, did you push the tag commit? fi - echo packaging $plat_final - tar --owner=root --group=root --numeric-owner -cjf $rel-$plat_final.tar.bz2 $rel-$plat_final - rm -rf $rel-$plat_final - done -if [ "$actual_ver" != "$maj.$min" ] -then - echo xxxxxxxxxxxxxxxxxxxxxx - echo version mismatch, expected $maj.$min, got $actual_ver - echo xxxxxxxxxxxxxxxxxxxxxx - exit -1 - rm -rf $rel-$plat_final - continue -fi -plat=win32 -if wget http://buildbot.pypy.org/nightly/$branchname/pypy-c-jit-latest-$plat.zip -then - unzip -q pypy-c-jit-latest-$plat.zip - rm pypy-c-jit-latest-$plat.zip - mv pypy-c-jit-*-$plat $rel-$plat - zip -rq $rel-$plat.zip $rel-$plat - rm -rf $rel-$plat -else - echo no download for $plat -fi +} -# Download source and repackage -# Requires a valid $tagname, note the untarred directory is pypy-pypy- -# so make sure there is not another one -if wget https://bitbucket.org/pypy/pypy/get/$tagname.tar.bz2 -then - tar -xf $tagname.tar.bz2 - rm $tagname.tar.bz2 - mv pypy-pypy-* $rel-src - tar --owner=root --group=root --numeric-owner -cjf $rel-src.tar.bz2 $rel-src - zip -rq $rel-src.zip $rel-src - rm -rf $rel-src -else - echo source tarfile for $tagname not found on bitbucket, did you push the tag commit? +function print_sha256 { + # Print out the md5, sha1, sha256 + #md5sum *.bz2 *.zip + #sha1sum *.bz2 *.zip + sha256sum *.bz2 *.zip +} + +if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then + # script is being run, not "sourced" (as in "source repackage.sh") + # so run the functions + repackage_builds + repackage_source + print_sha256 fi -# Print out the md5, sha1, sha256 -#md5sum *.bz2 *.zip -#sha1sum *.bz2 *.zip -sha256sum *.bz2 *.zip - # Now upload all the bz2 and zip - - diff -Nru pypy-7.1.1+dfsg/pypy/tool/release/test/test_package.py pypy-7.3.1+dfsg/pypy/tool/release/test/test_package.py --- pypy-7.1.1+dfsg/pypy/tool/release/test/test_package.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/tool/release/test/test_package.py 2020-04-10 19:28:41.000000000 +0000 @@ -1,4 +1,4 @@ - +import os import py from pypy import pypydir from pypy.tool.release import package @@ -15,8 +15,8 @@ cls.exe_name_in_archive = 'pypy-c.exe' else: basename = 'pypy-c' - cls.rename_pypy_c = 'pypy' - cls.exe_name_in_archive = 'bin/pypy' + cls.rename_pypy_c = package.POSIX_EXE + cls.exe_name_in_archive = os.path.join('bin', package.POSIX_EXE) cls.pypy_c = py.path.local(pypydir).join('goal', basename) def test_dir_structure(self, test='test'): diff -Nru pypy-7.1.1+dfsg/pypy/tool/unicodefuzzer.py pypy-7.3.1+dfsg/pypy/tool/unicodefuzzer.py --- pypy-7.1.1+dfsg/pypy/tool/unicodefuzzer.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pypy/tool/unicodefuzzer.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,63 +0,0 @@ -import random, sys -random.seed(42) - -def make_random_encoded_string(length=10, variance=1): - s = [] - s.append(random.choice(["\xff\xfe", "\xfe\xff", ""])) # BOM - for i in range(length + random.randrange(-variance, variance)): - s.append(chr(random.randrange(256))) - return "".join(s) - -def make_random_unicode(length=10, variance=1): - s = [] - for i in range(length + random.randrange(-variance, variance)): - s.append(unichr(random.randrange(sys.maxunicode))) - return "".join(s) - -def check_encode(encoding, s): - try: - s.encode(encoding) - except UnicodeError: - pass - s.encode(encoding, "ignore") - s.encode(encoding, "replace") - -def check_decode(encoding, s): - try: - s.decode(encoding) - except UnicodeError: - pass - s.decode(encoding, "ignore") - s.decode(encoding, "replace") - -def check_with_length(length): - try: - s = make_random_encoded_string(length, 10) - for encoding in all_encodings: - check_decode(encoding, s) - except Exception as e: - print "decoding:", encoding, repr(s) - try: - s = make_random_unicode(length, 10) - for encoding in all_encodings: - check_encode(encoding, s) - except Exception as e: - print "encoding:", encoding, repr(s) - - -def main(): - for length in range(0, 1000, 10): - print length - for i in range(100): - check_with_length(length) - length = 1000 - for length in range(1000, 1000000, 1000): - print length - for i in range(100): - check_with_length(length) - -all_encodings = "utf-8 latin1 ascii utf-16 utf-16-be utf-16-le utf-7".split() - -if __name__ == '__main__': - main() - diff -Nru pypy-7.1.1+dfsg/pytest.ini pypy-7.3.1+dfsg/pytest.ini --- pypy-7.1.1+dfsg/pytest.ini 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/pytest.ini 2020-04-10 19:28:41.000000000 +0000 @@ -1,2 +1,2 @@ [pytest] -addopts = --assert=reinterp -rf +addopts = -rf diff -Nru pypy-7.1.1+dfsg/pytest.py pypy-7.3.1+dfsg/pytest.py --- pypy-7.1.1+dfsg/pytest.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/pytest.py 2020-04-10 19:28:41.000000000 +0000 @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python2 # PYTHON_ARGCOMPLETE_OK """ pytest: unit and functional testing with Python. diff -Nru pypy-7.1.1+dfsg/README.rst pypy-7.3.1+dfsg/README.rst --- pypy-7.1.1+dfsg/README.rst 2019-08-08 19:42:53.000000000 +0000 +++ pypy-7.3.1+dfsg/README.rst 2020-04-10 19:28:39.000000000 +0000 @@ -9,15 +9,15 @@ The home page for the interpreter is: - http://pypy.org/ + https://pypy.org/ If you want to help developing PyPy, this documentation might help you: - http://doc.pypy.org/ + https://doc.pypy.org/ More documentation about the RPython framework can be found here: - http://rpython.readthedocs.io/ + https://rpython.readthedocs.io/ The source for the documentation is in the pypy/doc directory. @@ -25,7 +25,7 @@ Using PyPy instead of CPython ----------------------------- -Please read the information at http://pypy.org/ to find the correct way to +Please read the information at https://pypy.org/ to find the correct way to download and use PyPy as an alternative to CPython. @@ -36,7 +36,7 @@ interpreter. It is time-consuming and requires significant computing resources. More information can be found here: - http://doc.pypy.org/en/latest/build.html + https://doc.pypy.org/en/latest/build.html Enjoy and send us feedback! diff -Nru pypy-7.1.1+dfsg/requirements.txt pypy-7.3.1+dfsg/requirements.txt --- pypy-7.1.1+dfsg/requirements.txt 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/requirements.txt 2020-04-10 19:28:41.000000000 +0000 @@ -1,8 +1,10 @@ +--only-binary vmprof + cffi>=1.4.0 # parse log files in rvmprof tests vmprof>=0.4.10; 'x86' in platform.machine #skip arm, s390x # hypothesis is used for test generation on untranslated tests -hypothesis +hypothesis<4.40 enum34>=1.1.2 diff -Nru pypy-7.1.1+dfsg/rpython/annotator/test/test_annrpython.py pypy-7.3.1+dfsg/rpython/annotator/test/test_annrpython.py --- pypy-7.1.1+dfsg/rpython/annotator/test/test_annrpython.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/annotator/test/test_annrpython.py 2020-04-10 19:28:41.000000000 +0000 @@ -4665,6 +4665,17 @@ a = self.RPythonAnnotator() assert a.build_types(h, [int]).const == 456 + def test_list_plus_equal_string(self): + def f(n): + lst = [chr(n), chr(n + 1)] + if n < 100: + lst.append(chr(n + 2)) + lst += str(n) + return lst + a = self.RPythonAnnotator() + s = a.build_types(f, [int]) + assert isinstance(listitem(s), annmodel.SomeChar) + def g(n): return [0, 1, 2, n] diff -Nru pypy-7.1.1+dfsg/rpython/config/test/test_translationoption.py pypy-7.3.1+dfsg/rpython/config/test/test_translationoption.py --- pypy-7.1.1+dfsg/rpython/config/test/test_translationoption.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/config/test/test_translationoption.py 2020-04-10 19:28:41.000000000 +0000 @@ -13,13 +13,6 @@ config.translation.gcrootfinder = "shadowstack" py.test.raises(ConflictConfigError, set_opt_level, config, '0') -if compiler.name == 'msvc' or sys.platform == 'darwin': - def test_no_asmgcrot_on_msvc(): - config = get_combined_translation_config() - config.translation.gcrootfinder = "asmgcc" - py.test.raises(ConfigError, set_opt_level, config, 'jit') - - def test_get_translation_config(): from rpython.translator.interactive import Translation from rpython.config import config diff -Nru pypy-7.1.1+dfsg/rpython/config/translationoption.py pypy-7.3.1+dfsg/rpython/config/translationoption.py --- pypy-7.1.1+dfsg/rpython/config/translationoption.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/config/translationoption.py 2020-04-10 19:28:41.000000000 +0000 @@ -1,5 +1,6 @@ import sys import os +import platform as _stdlib_platform from rpython.config.config import OptionDescription, BoolOption, IntOption, ArbitraryOption, FloatOption from rpython.config.config import ChoiceOption, StrOption, Config, ConflictConfigError from rpython.config.config import ConfigError @@ -17,10 +18,6 @@ DEFL_GC = "incminimark" # XXX DEFL_ROOTFINDER_WITHJIT = "shadowstack" -## if sys.platform.startswith("linux"): -## _mach = os.popen('uname -m', 'r').read().strip() -## if _mach.startswith('x86') or _mach in ['i386', 'i486', 'i586', 'i686']: -## DEFL_ROOTFINDER_WITHJIT = "asmgcc" # only for Linux on x86 / x86-64 IS_64_BITS = sys.maxint > 2147483647 @@ -30,7 +27,9 @@ False) # Windows doesn't work. Please # add other platforms here if it works on them. - +MACHINE = _stdlib_platform.machine() +if MACHINE == 'aarch64': + SUPPORT__THREAD = False # (*) NOTE: __thread on OS/X does not work together with # pthread_key_create(): when the destructor is called, the __thread is # already freed! @@ -97,13 +96,11 @@ default=IS_64_BITS, cmdline="--gcremovetypeptr"), ChoiceOption("gcrootfinder", "Strategy for finding GC Roots (framework GCs only)", - ["n/a", "shadowstack", "asmgcc"], + ["n/a", "shadowstack"], "shadowstack", cmdline="--gcrootfinder", requires={ "shadowstack": [("translation.gctransformer", "framework")], - "asmgcc": [("translation.gctransformer", "framework"), - ("translation.backend", "c")], }), # other noticeable options @@ -399,10 +396,6 @@ # if we have specified strange inconsistent settings. config.translation.gc = config.translation.gc - # disallow asmgcc on OS/X and on Win32 - if config.translation.gcrootfinder == "asmgcc": - if sys.platform == "darwin" or sys.platform =="win32": - raise ConfigError("'asmgcc' not supported on this platform") # ---------------------------------------------------------------- diff -Nru pypy-7.1.1+dfsg/rpython/conftest.py pypy-7.3.1+dfsg/rpython/conftest.py --- pypy-7.1.1+dfsg/rpython/conftest.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/conftest.py 2020-04-10 19:28:41.000000000 +0000 @@ -72,6 +72,8 @@ return if not getattr(item.obj, 'dont_track_allocations', False): leakfinder.start_tracking_allocations() + from rpython.rlib import rgil + rgil._reset_emulated_gil_holder() @pytest.hookimpl(trylast=True) def pytest_runtest_call(self, item): diff -Nru pypy-7.1.1+dfsg/rpython/doc/getting-started.rst pypy-7.3.1+dfsg/rpython/doc/getting-started.rst --- pypy-7.1.1+dfsg/rpython/doc/getting-started.rst 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/doc/getting-started.rst 2020-04-10 19:28:41.000000000 +0000 @@ -49,12 +49,15 @@ * `How to write interpreters in RPython`_ and `part 2`_ by Andrew Brown. +* `RPython By Example`_ + .. _Fast Enough VMs in Fast Enough Time: http://tratt.net/laurie/tech_articles/articles/fast_enough_vms_in_fast_enough_time .. _How to write interpreters in RPython: http://morepypy.blogspot.com/2011/04/tutorial-writing-interpreter-with-pypy.html .. _part 2: http://morepypy.blogspot.com/2011/04/tutorial-part-2-adding-jit.html +.. _RPython By Example: http://mesapy.org/rpython-by-example/ .. _try-out-the-translator: diff -Nru pypy-7.1.1+dfsg/rpython/doc/glossary.rst pypy-7.3.1+dfsg/rpython/doc/glossary.rst --- pypy-7.1.1+dfsg/rpython/doc/glossary.rst 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/doc/glossary.rst 2020-04-10 19:28:41.000000000 +0000 @@ -51,10 +51,10 @@ some operation in terms of the target :term:`type system`. ootypesystem - An :ref:`object oriented type model ` + An object oriented type model containing classes and instances. A :term:`backend` that uses this type system - is also called a high-level backend. The JVM and CLI backends - all use this typesystem. + is also called a high-level backend. The JVM and CLI backends (now removed) + used this typesystem. prebuilt constant In :term:`RPython` module globals are considered constants. Moreover, diff -Nru pypy-7.1.1+dfsg/rpython/doc/jit/optimizer.rst pypy-7.3.1+dfsg/rpython/doc/jit/optimizer.rst --- pypy-7.1.1+dfsg/rpython/doc/jit/optimizer.rst 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/doc/jit/optimizer.rst 2020-04-10 19:28:41.000000000 +0000 @@ -13,7 +13,7 @@ Before some optimizations are explained in more detail, it is essential to understand how traces look like. -The optimizer comes with a test suit. It contains many trace +The optimizer comes with a test suite. It contains many trace examples and you might want to take a look at it (in `rpython/jit/metainterp/optimizeopt/test/*.py`). The allowed operations can be found in `rpython/jit/metainterp/resoperation.py`. @@ -21,7 +21,7 @@ [p0,i0,i1] label(p0, i0, i1) - i2 = getarray_item_raw(p0, i0, descr=) + i2 = getarrayitem_raw(p0, i0, descr=) i3 = int_add(i1,i2) i4 = int_add(i0,1) i5 = int_le(i4, 100) # lower-or-equal @@ -32,7 +32,7 @@ to compare the Python code that constructed the trace:: from array import array - a = array('i',range(101)) + a = array('i', range(101)) sum = 0; i = 0 while i <= 100: # can be seen as label sum += a[i] @@ -131,20 +131,16 @@ Whenever such an operation is encountered (e.g. ``y = x & 0``), no operation is emitted. Instead the variable y is made equal to 0 -(= ``make_equal_to(op.result, 0)``). The variables found in a trace are -instances of Box classes that can be found in -`rpython/jit/metainterp/history.py`. `OptValue` wraps those variables again -and maps the boxes to the optimization values in the optimizer. When a -value is made equal, the two variable's boxes are made to point to the same -`OptValue` instance. +(= ``make_constant_int(op, 0)``). The variables found in a trace are instances +of classes that can be found in `rpython/jit/metainterp/history.py`. When a +value is made equal to another, its box is made to point to the other one. -**NOTE: this OptValue organization is currently being refactored in a branch.** Pure optimization ----------------- -Is interwoven into the basic optimizer. It saves operations, results, -arguments to be known to have pure semantics. +The 'pure' optimizations interwoven into the basic optimizer. It saves +operations, results, arguments to be known to have pure semantics. "Pure" here means the same as the ``jit.elidable`` decorator: free of "observable" side effects and referentially transparent diff -Nru pypy-7.1.1+dfsg/rpython/doc/translation.rst pypy-7.3.1+dfsg/rpython/doc/translation.rst --- pypy-7.1.1+dfsg/rpython/doc/translation.rst 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/doc/translation.rst 2020-04-10 19:28:41.000000000 +0000 @@ -583,9 +583,6 @@ rate; this means that the memory management implementation is critical to the performance of the PyPy interpreter. -You can choose which garbage collection strategy to use with -:config:`translation.gc`. - .. _genc: diff -Nru pypy-7.1.1+dfsg/rpython/flowspace/flowcontext.py pypy-7.3.1+dfsg/rpython/flowspace/flowcontext.py --- pypy-7.1.1+dfsg/rpython/flowspace/flowcontext.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/flowspace/flowcontext.py 2020-04-10 19:28:41.000000000 +0000 @@ -566,11 +566,12 @@ if not isinstance(w_check_class, Constant): raise FlowingError("Non-constant except guard.") check_class = w_check_class.value - if check_class in (NotImplementedError, AssertionError): - raise FlowingError( - "Catching %s is not valid in RPython" % check_class.__name__) if not isinstance(check_class, tuple): # the simple case + if issubclass(check_class, (NotImplementedError, AssertionError)): + raise FlowingError( + "Catching NotImplementedError, AssertionError, or a " + "subclass is not valid in RPython (%r)" % (check_class,)) return self.guessbool(op.issubtype(w_exc_type, w_check_class).eval(self)) # special case for StackOverflow (see rlib/rstackovf.py) if check_class == rstackovf.StackOverflow: diff -Nru pypy-7.1.1+dfsg/rpython/flowspace/test/test_objspace.py pypy-7.3.1+dfsg/rpython/flowspace/test/test_objspace.py --- pypy-7.1.1+dfsg/rpython/flowspace/test/test_objspace.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/flowspace/test/test_objspace.py 2020-04-10 19:28:41.000000000 +0000 @@ -1135,6 +1135,23 @@ pass py.test.raises(FlowingError, "self.codetest(f)") + def test_cannot_catch_special_exceptions_2(self): + class MyNIE(NotImplementedError): + pass + def f(): + try: + f() + except MyNIE: + pass + py.test.raises(FlowingError, "self.codetest(f)") + # + def f(): + try: + f() + except (ValueError, MyNIE): + pass + py.test.raises(FlowingError, "self.codetest(f)") + def test_locals_dict(self): def f(): x = 5 diff -Nru pypy-7.1.1+dfsg/rpython/jit/backend/aarch64/arch.py pypy-7.3.1+dfsg/rpython/jit/backend/aarch64/arch.py --- pypy-7.1.1+dfsg/rpython/jit/backend/aarch64/arch.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/backend/aarch64/arch.py 2020-04-10 19:28:41.000000000 +0000 @@ -0,0 +1,14 @@ + +WORD = 8 + +# The stack contains the force_index and the, callee saved registers and +# ABI required information +# All the rest of the data is in a GC-managed variable-size "frame". +# This jitframe object's address is always stored in the register FP +# A jitframe is a jit.backend.llsupport.llmodel.jitframe.JITFRAME +# Stack frame fixed area +# Currently only the force_index +NUM_MANAGED_REGS = 16 +NUM_VFP_REGS = 8 +JITFRAME_FIXED_SIZE = NUM_MANAGED_REGS + NUM_VFP_REGS +# 16 GPR + 8 VFP Regs, for now diff -Nru pypy-7.1.1+dfsg/rpython/jit/backend/aarch64/assembler.py pypy-7.3.1+dfsg/rpython/jit/backend/aarch64/assembler.py --- pypy-7.1.1+dfsg/rpython/jit/backend/aarch64/assembler.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/backend/aarch64/assembler.py 2020-04-10 19:28:41.000000000 +0000 @@ -0,0 +1,1483 @@ + +from rpython.jit.backend.aarch64.arch import WORD, JITFRAME_FIXED_SIZE +from rpython.jit.backend.aarch64.codebuilder import InstrBuilder, OverwritingBuilder +from rpython.jit.backend.aarch64.locations import imm, StackLocation, get_fp_offset +#from rpython.jit.backend.arm.helper.regalloc import VMEM_imm_size +from rpython.jit.backend.aarch64.opassembler import ResOpAssembler +from rpython.jit.backend.aarch64.regalloc import (Regalloc, check_imm_arg, + operations as regalloc_operations, guard_operations, comp_operations, + CoreRegisterManager, VFPRegisterManager) +from rpython.jit.backend.aarch64 import registers as r +from rpython.jit.backend.arm import conditions as c +from rpython.jit.backend.llsupport import jitframe, rewrite +from rpython.jit.backend.llsupport.assembler import BaseAssembler +from rpython.jit.backend.llsupport.regalloc import get_scale, valid_addressing_size +from rpython.jit.backend.llsupport.asmmemmgr import MachineDataBlockWrapper +from rpython.jit.backend.model import CompiledLoopToken +from rpython.jit.codewriter.effectinfo import EffectInfo +from rpython.jit.metainterp.history import AbstractFailDescr, FLOAT, INT, VOID +from rpython.jit.metainterp.resoperation import rop +from rpython.rlib.debug import debug_print, debug_start, debug_stop +from rpython.rlib.jit import AsmInfo +from rpython.rlib.objectmodel import we_are_translated, specialize, compute_unique_id +from rpython.rlib.rarithmetic import r_uint +from rpython.rtyper.annlowlevel import llhelper, cast_instance_to_gcref +from rpython.rtyper.lltypesystem import lltype, rffi +from rpython.rtyper.lltypesystem.lloperation import llop +from rpython.rlib.rjitlog import rjitlog as jl + +class AssemblerARM64(ResOpAssembler): + def __init__(self, cpu, translate_support_code=False): + ResOpAssembler.__init__(self, cpu, translate_support_code) + self.failure_recovery_code = [0, 0, 0, 0] + self.wb_slowpath = [0, 0, 0, 0, 0] + self.stack_check_slowpath = 0 + + def assemble_loop(self, jd_id, unique_id, logger, loopname, inputargs, + operations, looptoken, log): + clt = CompiledLoopToken(self.cpu, looptoken.number) + clt._debug_nbargs = len(inputargs) + looptoken.compiled_loop_token = clt + + if not we_are_translated(): + # Arguments should be unique + assert len(set(inputargs)) == len(inputargs) + + self.setup(looptoken) + + frame_info = self.datablockwrapper.malloc_aligned( + jitframe.JITFRAMEINFO_SIZE, alignment=WORD) + clt.frame_info = rffi.cast(jitframe.JITFRAMEINFOPTR, frame_info) + clt.frame_info.clear() # for now + + if log: + operations = self._inject_debugging_code(looptoken, operations, + 'e', looptoken.number) + + regalloc = Regalloc(assembler=self) + allgcrefs = [] + operations = regalloc.prepare_loop(inputargs, operations, looptoken, + allgcrefs) + self.reserve_gcref_table(allgcrefs) + functionpos = self.mc.get_relative_pos() + + self._call_header_with_stack_check() + self._check_frame_depth_debug(self.mc) + + loop_head = self.mc.get_relative_pos() + looptoken._ll_loop_code = loop_head + # + frame_depth_no_fixed_size = self._assemble(regalloc, inputargs, operations) + self.update_frame_depth(frame_depth_no_fixed_size + JITFRAME_FIXED_SIZE) + # + size_excluding_failure_stuff = self.mc.get_relative_pos() + + self.write_pending_failure_recoveries() + + full_size = self.mc.get_relative_pos() + rawstart = self.materialize_loop(looptoken) + looptoken._ll_function_addr = rawstart + functionpos + + self.patch_gcref_table(looptoken, rawstart) + self.process_pending_guards(rawstart) + self.fixup_target_tokens(rawstart) + + if log and not we_are_translated(): + self.mc._dump_trace(rawstart, + 'loop.asm') + + ops_offset = self.mc.ops_offset + + if logger: + log = logger.log_trace(jl.MARK_TRACE_ASM, None, self.mc) + log.write(inputargs, operations, ops_offset=ops_offset) + + # legacy + if logger.logger_ops: + logger.logger_ops.log_loop(inputargs, operations, 0, + "rewritten", name=loopname, + ops_offset=ops_offset) + + self.teardown() + + debug_start("jit-backend-addr") + debug_print("Loop %d (%s) has address 0x%x to 0x%x (bootstrap 0x%x)" % ( + looptoken.number, loopname, + r_uint(rawstart + loop_head), + r_uint(rawstart + size_excluding_failure_stuff), + r_uint(rawstart + functionpos))) + debug_print(" gc table: 0x%x" % r_uint(rawstart)) + debug_print(" function: 0x%x" % r_uint(rawstart + functionpos)) + debug_print(" resops: 0x%x" % r_uint(rawstart + loop_head)) + debug_print(" failures: 0x%x" % r_uint(rawstart + + size_excluding_failure_stuff)) + debug_print(" end: 0x%x" % r_uint(rawstart + full_size)) + debug_stop("jit-backend-addr") + + return AsmInfo(ops_offset, rawstart + loop_head, + size_excluding_failure_stuff - loop_head) + + def assemble_bridge(self, logger, faildescr, inputargs, operations, + original_loop_token, log): + if not we_are_translated(): + # Arguments should be unique + assert len(set(inputargs)) == len(inputargs) + + self.setup(original_loop_token) + #self.codemap.inherit_code_from_position(faildescr.adr_jump_offset) + descr_number = compute_unique_id(faildescr) + if log: + operations = self._inject_debugging_code(faildescr, operations, + 'b', descr_number) + + assert isinstance(faildescr, AbstractFailDescr) + + arglocs = self.rebuild_faillocs_from_descr(faildescr, inputargs) + + regalloc = Regalloc(assembler=self) + allgcrefs = [] + operations = regalloc.prepare_bridge(inputargs, arglocs, + operations, + allgcrefs, + self.current_clt.frame_info) + self.reserve_gcref_table(allgcrefs) + startpos = self.mc.get_relative_pos() + + self._check_frame_depth(self.mc, regalloc.get_gcmap()) + + bridgestartpos = self.mc.get_relative_pos() + frame_depth_no_fixed_size = self._assemble(regalloc, inputargs, operations) + + codeendpos = self.mc.get_relative_pos() + + self.write_pending_failure_recoveries() + + fullsize = self.mc.get_relative_pos() + rawstart = self.materialize_loop(original_loop_token) + + self.patch_gcref_table(original_loop_token, rawstart) + self.process_pending_guards(rawstart) + + debug_start("jit-backend-addr") + debug_print("bridge out of Guard 0x%x has address 0x%x to 0x%x" % + (r_uint(descr_number), r_uint(rawstart + startpos), + r_uint(rawstart + codeendpos))) + debug_print(" gc table: 0x%x" % r_uint(rawstart)) + debug_print(" jump target: 0x%x" % r_uint(rawstart + startpos)) + debug_print(" resops: 0x%x" % r_uint(rawstart + bridgestartpos)) + debug_print(" failures: 0x%x" % r_uint(rawstart + codeendpos)) + debug_print(" end: 0x%x" % r_uint(rawstart + fullsize)) + debug_stop("jit-backend-addr") + + # patch the jump from original guard + self.patch_trace(faildescr, original_loop_token, + rawstart + startpos, regalloc) + + self.patch_stack_checks(frame_depth_no_fixed_size + JITFRAME_FIXED_SIZE, + rawstart) + if not we_are_translated(): + if log: + self.mc._dump_trace(rawstart, 'bridge.asm') + + ops_offset = self.mc.ops_offset + frame_depth = max(self.current_clt.frame_info.jfi_frame_depth, + frame_depth_no_fixed_size + JITFRAME_FIXED_SIZE) + self.fixup_target_tokens(rawstart) + self.update_frame_depth(frame_depth) + + if logger: + log = logger.log_trace(jl.MARK_TRACE_ASM, None, self.mc) + log.write(inputargs, operations, ops_offset) + # log that the already written bridge is stitched to a descr! + logger.log_patch_guard(descr_number, rawstart) + + # legacy + if logger.logger_ops: + logger.logger_ops.log_bridge(inputargs, operations, "rewritten", + faildescr, ops_offset=ops_offset) + + self.teardown() + + return AsmInfo(ops_offset, startpos + rawstart, codeendpos - startpos) + + def setup(self, looptoken): + BaseAssembler.setup(self, looptoken) + assert self.memcpy_addr != 0, 'setup_once() not called?' + if we_are_translated(): + self.debug = False + self.current_clt = looptoken.compiled_loop_token + self.mc = InstrBuilder() + self.pending_guards = [] + #assert self.datablockwrapper is None --- but obscure case + # possible, e.g. getting MemoryError and continuing + allblocks = self.get_asmmemmgr_blocks(looptoken) + self.datablockwrapper = MachineDataBlockWrapper(self.cpu.asmmemmgr, + allblocks) + self.mc.datablockwrapper = self.datablockwrapper + self.target_tokens_currently_compiling = {} + self.frame_depth_to_patch = [] + + def teardown(self): + self.current_clt = None + self._regalloc = None + self.mc = None + self.pending_guards = None + + def _push_all_regs_to_jitframe(self, mc, ignored_regs, withfloats, + callee_only=False): + # Push general purpose registers + base_ofs = self.cpu.get_baseofs_of_frame_field() + if callee_only: + regs = CoreRegisterManager.save_around_call_regs + else: + regs = CoreRegisterManager.all_regs + # XXX add special case if ignored_regs are a block at the start of regs + if not ignored_regs: # we want to push a contiguous block of regs + assert base_ofs < 0x100 + for i, reg in enumerate(regs): + mc.STR_ri(reg.value, r.fp.value, base_ofs + i * WORD) + else: + for reg in ignored_regs: + assert not reg.is_vfp_reg() # sanity check + # we can have holes in the list of regs + for i, gpr in enumerate(regs): + if gpr in ignored_regs: + continue + self.store_reg(mc, gpr, r.fp, base_ofs + i * WORD) + + if withfloats: + # Push VFP regs + regs = VFPRegisterManager.all_regs + ofs = len(CoreRegisterManager.all_regs) * WORD + for reg in regs: + mc.STR_di(reg.value, r.fp.value, ofs + base_ofs + reg.value * WORD) + + def _pop_all_regs_from_jitframe(self, mc, ignored_regs, withfloats, + callee_only=False): + # Pop general purpose registers + base_ofs = self.cpu.get_baseofs_of_frame_field() + if callee_only: + regs = CoreRegisterManager.save_around_call_regs + else: + regs = CoreRegisterManager.all_regs + # XXX add special case if ignored_regs are a block at the start of regs + if not ignored_regs: # we want to pop a contiguous block of regs + assert base_ofs < 0x100 + for i, reg in enumerate(regs): + mc.LDR_ri(reg.value, r.fp.value, base_ofs + i * WORD) + else: + for reg in ignored_regs: + assert not reg.is_vfp_reg() # sanity check + # we can have holes in the list of regs + for i, gpr in enumerate(regs): + if gpr in ignored_regs: + continue + ofs = i * WORD + base_ofs + self.load_reg(mc, gpr, r.fp, ofs) + if withfloats: + # Pop VFP regs + regs = VFPRegisterManager.all_regs + ofs = len(CoreRegisterManager.all_regs) * WORD + for reg in regs: + mc.LDR_di(reg.value, r.fp.value, ofs + base_ofs + reg.value * WORD) + + def _build_failure_recovery(self, exc, withfloats=False): + mc = InstrBuilder() + self._push_all_regs_to_jitframe(mc, [], withfloats) + + if exc: + # We might have an exception pending. Load it into r4 + # (this is a register saved across calls) + mc.gen_load_int(r.x5.value, self.cpu.pos_exc_value()) + mc.LDR_ri(r.x4.value, r.x5.value, 0) + # clear the exc flags + mc.gen_load_int(r.x6.value, 0) + mc.STR_ri(r.x6.value, r.x5.value, 0) # pos_exc_value is still in r5 + mc.gen_load_int(r.x5.value, self.cpu.pos_exception()) + mc.STR_ri(r.x6.value, r.x5.value, 0) + # save r4 into 'jf_guard_exc' + offset = self.cpu.get_ofs_of_frame_field('jf_guard_exc') + assert check_imm_arg(abs(offset)) + mc.STR_ri(r.x4.value, r.fp.value, offset) + # now we return from the complete frame, which starts from + # _call_header_with_stack_check(). The LEA in _call_footer below + # throws away most of the frame, including all the PUSHes that we + # did just above. + + # set return value + mc.MOV_rr(r.x0.value, r.fp.value) + + self.gen_func_epilog(mc) + rawstart = mc.materialize(self.cpu, []) + self.failure_recovery_code[exc + 2 * withfloats] = rawstart + + def propagate_memoryerror_if_reg_is_null(self, reg_loc): + # see ../x86/assembler.py:genop_discard_check_memory_error() + self.mc.CMP_ri(reg_loc.value, 0) + self.mc.B_ofs_cond(6 * 4, c.NE) + self.mc.B(self.propagate_exception_path) + + def _build_wb_slowpath(self, withcards, withfloats=False, for_frame=False): + descr = self.cpu.gc_ll_descr.write_barrier_descr + if descr is None: + return + if not withcards: + func = descr.get_write_barrier_fn(self.cpu) + else: + if descr.jit_wb_cards_set == 0: + return + func = descr.get_write_barrier_from_array_fn(self.cpu) + if func == 0: + return + # + # This builds a helper function called from the slow path of + # write barriers. It must save all registers, and optionally + # all vfp registers. It takes a single argument which is in x0. + # It must keep stack alignment accordingly. + mc = InstrBuilder() + # + mc.SUB_ri(r.sp.value, r.sp.value, 2 * WORD) + mc.STR_ri(r.lr.value, r.sp.value, 0) + if not for_frame: + self._push_all_regs_to_jitframe(mc, [], withfloats, callee_only=True) + else: + # NOTE: don't save registers on the jitframe here! It might + # override already-saved values that will be restored + # later... + # + # we're possibly called from the slowpath of malloc + # save the caller saved registers + # assuming we do not collect here + exc0, exc1 = r.x19, r.x20 + mc.SUB_ri(r.sp.value, r.sp.value, (len(r.caller_resp) + 2 + len(r.caller_vfp_resp)) * WORD) + cur_stack = 0 + for i in range(0, len(r.caller_resp), 2): + mc.STP_rri(r.caller_resp[i].value, r.caller_resp[i + 1].value, r.sp.value, i * WORD) + cur_stack = len(r.caller_resp) + mc.STP_rri(exc0.value, exc1.value, r.sp.value, cur_stack * WORD) + cur_stack += 2 + for i in range(len(r.caller_vfp_resp)): + mc.STR_di(r.caller_vfp_resp[i].value, r.sp.value, cur_stack * WORD) + cur_stack += 1 + + self._store_and_reset_exception(mc, exc0, exc1) + mc.BL(func) + # + if not for_frame: + self._pop_all_regs_from_jitframe(mc, [], withfloats, callee_only=True) + else: + exc0, exc1 = r.x19, r.x20 + self._restore_exception(mc, exc0, exc1) + + cur_stack = 0 + for i in range(0, len(r.caller_resp), 2): + mc.LDP_rri(r.caller_resp[i].value, r.caller_resp[i + 1].value, r.sp.value, i * WORD) + cur_stack = len(r.caller_resp) + mc.LDP_rri(exc0.value, exc1.value, r.sp.value, cur_stack * WORD) + cur_stack += 2 + for i in range(len(r.caller_vfp_resp)): + mc.LDR_di(r.caller_vfp_resp[i].value, r.sp.value, cur_stack * WORD) + cur_stack += 1 + + assert exc0 is not None + assert exc1 is not None + + mc.ADD_ri(r.sp.value, r.sp.value, (len(r.caller_resp) + 2 + len(r.caller_vfp_resp)) * WORD) + + # + if withcards: + # A final TEST8 before the RET, for the caller. Careful to + # not follow this instruction with another one that changes + # the status of the CPU flags! + mc.LDRB_ri(r.ip0.value, r.x0.value, descr.jit_wb_if_flag_byteofs) + mc.MOVZ_r_u16(r.ip1.value, 0x80, 0) + mc.TST_rr_shift(r.ip0.value, r.ip1.value, 0) + # + mc.LDR_ri(r.ip1.value, r.sp.value, 0) + mc.ADD_ri(r.sp.value, r.sp.value, 2 * WORD) + mc.RET_r(r.ip1.value) + # + rawstart = mc.materialize(self.cpu, []) + if for_frame: + self.wb_slowpath[4] = rawstart + else: + self.wb_slowpath[withcards + 2 * withfloats] = rawstart + + def build_frame_realloc_slowpath(self): + # this code should do the following steps + # a) store all registers in the jitframe + # b) fish for the arguments passed by the caller + # c) store the gcmap in the jitframe + # d) call realloc_frame + # e) set the fp to point to the new jitframe + # f) store the address of the new jitframe in the shadowstack + # c) set the gcmap field to 0 in the new jitframe + # g) restore registers and return + mc = InstrBuilder() + self._push_all_regs_to_jitframe(mc, [], self.cpu.supports_floats) + # this is the gcmap stored by push_gcmap(mov=True) in _check_stack_frame + # and the expected_size pushed in _check_stack_frame + # pop the values passed on the stack, gcmap -> r0, expected_size -> r1 + mc.LDP_rri(r.x0.value, r.x1.value, r.sp.value, 0) + + mc.STR_ri(r.lr.value, r.sp.value, 0) + + # store the current gcmap(r0) in the jitframe + gcmap_ofs = self.cpu.get_ofs_of_frame_field('jf_gcmap') + mc.STR_ri(r.x0.value, r.fp.value, gcmap_ofs) + + # set first arg, which is the old jitframe address + mc.MOV_rr(r.x0.value, r.fp.value) + + # store a possibly present exception + self._store_and_reset_exception(mc, None, r.x19, on_frame=True) + + # call realloc_frame, it takes two arguments + # arg0: the old jitframe + # arg1: the new size + # + mc.BL(self.cpu.realloc_frame) + + # set fp to the new jitframe returned from the previous call + mc.MOV_rr(r.fp.value, r.x0.value) + + # restore a possibly present exception + self._restore_exception(mc, None, r.x19) + + gcrootmap = self.cpu.gc_ll_descr.gcrootmap + if gcrootmap and gcrootmap.is_shadow_stack: + self._load_shadowstack_top(mc, r.x19, gcrootmap) + # store the new jitframe addr in the shadowstack + mc.SUB_ri(r.x19.value, r.x19.value, WORD) + mc.STR_ri(r.x0.value, r.x19.value, 0) + + # reset the jf_gcmap field in the jitframe + mc.gen_load_int(r.ip0.value, 0) + mc.STR_ri(r.ip0.value, r.fp.value, gcmap_ofs) + + # restore registers + self._pop_all_regs_from_jitframe(mc, [], self.cpu.supports_floats) + + # return + mc.LDR_ri(r.lr.value, r.sp.value, 0) + mc.ADD_ri(r.sp.value, r.sp.value, 2*WORD) + mc.RET_r(r.lr.value) + self._frame_realloc_slowpath = mc.materialize(self.cpu, []) + + def _load_shadowstack_top(self, mc, reg, gcrootmap): + rst = gcrootmap.get_root_stack_top_addr() + mc.gen_load_int(reg.value, rst) + self.load_reg(mc, reg, reg) + return rst + + def _store_and_reset_exception(self, mc, excvalloc=None, exctploc=None, + on_frame=False): + """ Resest the exception. If excvalloc is None, then store it on the + frame in jf_guard_exc + """ + assert excvalloc is not r.ip0 + assert exctploc is not r.ip0 + tmpreg = r.ip1 + mc.gen_load_int(r.ip0.value, self.cpu.pos_exc_value()) + if excvalloc is not None: # store + assert excvalloc.is_core_reg() + self.load_reg(mc, excvalloc, r.ip0) + if on_frame: + # store exc_value in JITFRAME + ofs = self.cpu.get_ofs_of_frame_field('jf_guard_exc') + assert check_imm_arg(ofs) + # + self.load_reg(mc, r.ip0, r.ip0, helper=tmpreg) + # + self.store_reg(mc, r.ip0, r.fp, ofs, helper=tmpreg) + if exctploc is not None: + # store pos_exception in exctploc + assert exctploc.is_core_reg() + mc.gen_load_int(r.ip0.value, self.cpu.pos_exception()) + self.load_reg(mc, exctploc, r.ip0, helper=tmpreg) + + if on_frame or exctploc is not None: + mc.gen_load_int(r.ip0.value, self.cpu.pos_exc_value()) + + # reset exception + mc.gen_load_int(tmpreg.value, 0) + + self.store_reg(mc, tmpreg, r.ip0, 0) + + mc.gen_load_int(r.ip0.value, self.cpu.pos_exception()) + self.store_reg(mc, tmpreg, r.ip0, 0) + + def _restore_exception(self, mc, excvalloc, exctploc): + assert excvalloc is not r.ip0 + assert exctploc is not r.ip0 + mc.gen_load_int(r.ip0.value, self.cpu.pos_exc_value()) + if excvalloc is not None: + assert excvalloc.is_core_reg() + self.store_reg(mc, excvalloc, r.ip0) + else: + assert exctploc is not r.fp + # load exc_value from JITFRAME and put it in pos_exc_value + ofs = self.cpu.get_ofs_of_frame_field('jf_guard_exc') + self.load_reg(mc, r.ip1, r.fp, ofs) + self.store_reg(mc, r.ip1, r.ip0) + # reset exc_value in the JITFRAME + mc.gen_load_int(r.ip1.value, 0) + self.store_reg(mc, r.ip1, r.fp, ofs) + + # restore pos_exception from exctploc register + mc.gen_load_int(r.ip0.value, self.cpu.pos_exception()) + self.store_reg(mc, exctploc, r.ip0) + + def _build_propagate_exception_path(self): + mc = InstrBuilder() + self._store_and_reset_exception(mc, r.x0) + ofs = self.cpu.get_ofs_of_frame_field('jf_guard_exc') + # make sure ofs fits into a register + assert check_imm_arg(ofs) + self.store_reg(mc, r.x0, r.fp, ofs) + propagate_exception_descr = rffi.cast(lltype.Signed, + cast_instance_to_gcref(self.cpu.propagate_exception_descr)) + # put propagate_exception_descr into frame + ofs = self.cpu.get_ofs_of_frame_field('jf_descr') + # make sure ofs fits into a register + assert check_imm_arg(ofs) + mc.gen_load_int(r.x0.value, propagate_exception_descr) + self.store_reg(mc, r.x0, r.fp, ofs) + mc.MOV_rr(r.x0.value, r.fp.value) + self.gen_func_epilog(mc) + rawstart = mc.materialize(self.cpu, []) + self.propagate_exception_path = rawstart + + def _build_cond_call_slowpath(self, supports_floats, callee_only): + """ This builds a general call slowpath, for whatever call happens to + come. + + The address of function to call comes in ip1. the result is also stored + in ip1 or ivfp + """ + mc = InstrBuilder() + # + self._push_all_regs_to_jitframe(mc, [], self.cpu.supports_floats, callee_only) + ## args are in their respective positions + mc.SUB_ri(r.sp.value, r.sp.value, 2 * WORD) + mc.STR_ri(r.ip0.value, r.sp.value, WORD) + mc.STR_ri(r.lr.value, r.sp.value, 0) + mc.BLR_r(r.ip1.value) + # callee saved + self._reload_frame_if_necessary(mc) # <- this will not touch x0 + mc.MOV_rr(r.ip1.value, r.x0.value) + self._pop_all_regs_from_jitframe(mc, [], supports_floats, + callee_only) # <- this does not touch ip1 + # return + mc.LDR_ri(r.ip0.value, r.sp.value, 0) + mc.ADD_ri(r.sp.value, r.sp.value, 2 * WORD) + mc.RET_r(r.ip0.value) + return mc.materialize(self.cpu, []) + + def _build_malloc_slowpath(self, kind): + """ While arriving on slowpath, we have a gcpattern on stack 0. + The arguments are passed in r0 and r10, as follows: + + kind == 'fixed': nursery_head in r0 and the size in r1 - r0. + + kind == 'str/unicode': length of the string to allocate in r0. + + kind == 'var': length to allocate in r1, tid in r0, + and itemsize on the stack. + + This function must preserve all registers apart from r0 and r1. + """ + assert kind in ['fixed', 'str', 'unicode', 'var'] + mc = InstrBuilder() + # + self._push_all_regs_to_jitframe(mc, [r.x0, r.x1], True) + # + if kind == 'fixed': + addr = self.cpu.gc_ll_descr.get_malloc_slowpath_addr() + elif kind == 'str': + addr = self.cpu.gc_ll_descr.get_malloc_fn_addr('malloc_str') + elif kind == 'unicode': + addr = self.cpu.gc_ll_descr.get_malloc_fn_addr('malloc_unicode') + else: + addr = self.cpu.gc_ll_descr.get_malloc_slowpath_array_addr() + if kind == 'fixed': + # At this point we know that the values we need to compute the size + # are stored in x0 and x1. + mc.SUB_rr(r.x0.value, r.x1.value, r.x0.value) # compute the size we want + + if hasattr(self.cpu.gc_ll_descr, 'passes_frame'): + mc.MOV_rr(r.x1.value, r.fp.value) + elif kind == 'str' or kind == 'unicode': + mc.MOV_rr(r.x0.value, r.x1.value) + else: # var + # tid is in x0 + # length is in x1 + # gcmap in ip1 + # itemsize in ip2 + mc.MOV_rr(r.x2.value, r.x1.value) + mc.MOV_rr(r.x1.value, r.x0.value) + mc.MOV_rr(r.x0.value, r.ip2.value) # load itemsize, ip2 now free + # store the gc pattern + ofs = self.cpu.get_ofs_of_frame_field('jf_gcmap') + mc.STR_ri(r.ip1.value, r.fp.value, ofs) + # + mc.SUB_ri(r.sp.value, r.sp.value, 2 * WORD) + mc.STR_ri(r.lr.value, r.sp.value, 0) + # + mc.BL(addr) + # + # If the slowpath malloc failed, we raise a MemoryError that + # always interrupts the current loop, as a "good enough" + # approximation. + mc.CMP_ri(r.x0.value, 0) + mc.B_ofs_cond(4 * 6, c.NE) + mc.B(self.propagate_exception_path) + # jump here + self._reload_frame_if_necessary(mc) + self._pop_all_regs_from_jitframe(mc, [r.x0, r.x1], self.cpu.supports_floats) + # + nursery_free_adr = self.cpu.gc_ll_descr.get_nursery_free_addr() + mc.gen_load_int(r.x1.value, nursery_free_adr) + mc.LDR_ri(r.x1.value, r.x1.value, 0) + # clear the gc pattern + mc.gen_load_int(r.ip0.value, 0) + self.store_reg(mc, r.ip0, r.fp, ofs) + # return + mc.LDR_ri(r.lr.value, r.sp.value, 0) + mc.ADD_ri(r.sp.value, r.sp.value, 2 * WORD) + mc.RET_r(r.lr.value) + + # + rawstart = mc.materialize(self.cpu, []) + return rawstart + + def malloc_cond(self, nursery_free_adr, nursery_top_adr, size, gcmap): + assert size & (WORD-1) == 0 + + self.mc.gen_load_int(r.x0.value, nursery_free_adr) + self.mc.LDR_ri(r.x0.value, r.x0.value, 0) + + if check_imm_arg(size): + self.mc.ADD_ri(r.x1.value, r.x0.value, size) + else: + self.mc.gen_load_int(r.x1.value, size) + self.mc.ADD_rr(r.x1.value, r.x0.value, r.x1.value) + + self.mc.gen_load_int(r.ip0.value, nursery_top_adr) + self.mc.LDR_ri(r.ip0.value, r.ip0.value, 0) + + self.mc.CMP_rr(r.x1.value, r.ip0.value) + + # We load into r0 the address stored at nursery_free_adr We calculate + # the new value for nursery_free_adr and store in r1 The we load the + # address stored in nursery_top_adr into IP If the value in r1 is + # (unsigned) bigger than the one in ip we conditionally call + # malloc_slowpath in case we called malloc_slowpath, which returns the + # new value of nursery_free_adr in r1 and the adr of the new object in + # r0. + + self.mc.B_ofs_cond(10 * 4, c.LS) # 4 for gcmap load, 5 for BL, 1 for B_ofs_cond + self.mc.gen_load_int_full(r.ip1.value, rffi.cast(lltype.Signed, gcmap)) + + self.mc.BL(self.malloc_slowpath) + + self.mc.gen_load_int(r.ip0.value, nursery_free_adr) + self.mc.STR_ri(r.x1.value, r.ip0.value, 0) + + def malloc_cond_varsize_frame(self, nursery_free_adr, nursery_top_adr, + sizeloc, gcmap): + if sizeloc is r.x0: + self.mc.MOV_rr(r.x1.value, r.x0.value) + sizeloc = r.x1 + self.mc.gen_load_int(r.x0.value, nursery_free_adr) + self.mc.LDR_ri(r.x0.value, r.x0.value, 0) + # + self.mc.ADD_rr(r.x1.value, r.x0.value, sizeloc.value) + # + self.mc.gen_load_int(r.ip0.value, nursery_top_adr) + self.mc.LDR_ri(r.ip0.value, r.ip0.value, 0) + + self.mc.CMP_rr(r.x1.value, r.ip0.value) + # + self.mc.B_ofs_cond(40, c.LS) # see calculations in malloc_cond + self.mc.gen_load_int_full(r.ip1.value, rffi.cast(lltype.Signed, gcmap)) + + self.mc.BL(self.malloc_slowpath) + + self.mc.gen_load_int(r.ip0.value, nursery_free_adr) + self.mc.STR_ri(r.x1.value, r.ip0.value, 0) + + def malloc_cond_varsize(self, kind, nursery_free_adr, nursery_top_adr, + lengthloc, itemsize, maxlength, gcmap, + arraydescr): + from rpython.jit.backend.llsupport.descr import ArrayDescr + assert isinstance(arraydescr, ArrayDescr) + + # lengthloc is the length of the array, which we must not modify! + assert lengthloc is not r.x0 and lengthloc is not r.x1 + if lengthloc.is_core_reg(): + varsizeloc = lengthloc + else: + assert lengthloc.is_stack() + self.regalloc_mov(lengthloc, r.x1) + varsizeloc = r.x1 + # + if check_imm_arg(maxlength): + self.mc.CMP_ri(varsizeloc.value, maxlength) + else: + self.mc.gen_load_int(r.ip0.value, maxlength) + self.mc.CMP_rr(varsizeloc.value, r.ip0.value) + jmp_adr0 = self.mc.currpos() # jump to (large) + self.mc.BRK() + # + self.mc.gen_load_int(r.x0.value, nursery_free_adr) + self.mc.LDR_ri(r.x0.value, r.x0.value, 0) + + + if valid_addressing_size(itemsize): + shiftsize = get_scale(itemsize) + else: + shiftsize = self._mul_const_scaled(self.mc, r.lr, varsizeloc, + itemsize) + varsizeloc = r.lr + # now varsizeloc is a register != x0. The size of + # the variable part of the array is (varsizeloc << shiftsize) + assert arraydescr.basesize >= self.gc_minimal_size_in_nursery + constsize = arraydescr.basesize + self.gc_size_of_header + force_realignment = (itemsize % WORD) != 0 + if force_realignment: + constsize += WORD - 1 + self.mc.gen_load_int(r.ip0.value, constsize) + # constsize + (varsizeloc << shiftsize) + self.mc.ADD_rr_shifted(r.x1.value, r.ip0.value, varsizeloc.value, + shiftsize) + self.mc.ADD_rr(r.x1.value, r.x1.value, r.x0.value) + if force_realignment: + # -WORD = 0xfffffffffffffff8 + self.mc.gen_load_int(r.ip0.value, -WORD) + self.mc.AND_rr(r.x1.value, r.x1.value, r.ip0.value) + # now x1 contains the total size in bytes, rounded up to a multiple + # of WORD, plus nursery_free_adr + # + self.mc.gen_load_int(r.ip0.value, nursery_top_adr) + self.mc.LDR_ri(r.ip0.value, r.ip0.value, 0) + + self.mc.CMP_rr(r.x1.value, r.ip0.value) + jmp_adr1 = self.mc.currpos() # jump to (after-call) + self.mc.BRK() + # + # (large) + currpos = self.mc.currpos() + pmc = OverwritingBuilder(self.mc, jmp_adr0, WORD) + pmc.B_ofs_cond(currpos - jmp_adr0, c.GT) + # + # save the gcmap + self.mc.gen_load_int_full(r.ip1.value, rffi.cast(lltype.Signed, gcmap)) + # + + if kind == rewrite.FLAG_ARRAY: + self.mc.gen_load_int(r.x0.value, arraydescr.tid) + self.regalloc_mov(lengthloc, r.x1) + self.mc.gen_load_int(r.ip2.value, itemsize) + addr = self.malloc_slowpath_varsize + else: + if kind == rewrite.FLAG_STR: + addr = self.malloc_slowpath_str + else: + assert kind == rewrite.FLAG_UNICODE + addr = self.malloc_slowpath_unicode + self.regalloc_mov(lengthloc, r.x1) + self.mc.BL(addr) + # + jmp_location = self.mc.currpos() # jump to (done) + self.mc.BRK() + # (after-call) + currpos = self.mc.currpos() + pmc = OverwritingBuilder(self.mc, jmp_adr1, WORD) + pmc.B_ofs_cond(currpos - jmp_adr1, c.LS) + # + # write down the tid, but not if it's the result of the CALL + self.mc.gen_load_int(r.ip0.value, arraydescr.tid) + self.mc.STR_ri(r.ip0.value, r.x0.value, 0) + + # while we're at it, this line is not needed if we've done the CALL + self.mc.gen_load_int(r.ip0.value, nursery_free_adr) + self.mc.STR_ri(r.x1.value, r.ip0.value, 0) + # (done) + # skip instructions after call + currpos = self.mc.currpos() + pmc = OverwritingBuilder(self.mc, jmp_location, WORD) + pmc.B_ofs(currpos - jmp_location) + + def _mul_const_scaled(self, mc, targetreg, sourcereg, itemsize): + """Produce one operation to do roughly + targetreg = sourcereg * itemsize + except that the targetreg may still need shifting by 0,1,2,3. + """ + if (itemsize & 7) == 0: + shiftsize = 3 + elif (itemsize & 3) == 0: + shiftsize = 2 + elif (itemsize & 1) == 0: + shiftsize = 1 + else: + shiftsize = 0 + itemsize >>= shiftsize + # + if valid_addressing_size(itemsize - 1): + self.mc.ADD_rr_shifted(targetreg.value, sourcereg.value, sourcereg.value, + get_scale(itemsize - 1)) + elif valid_addressing_size(itemsize): + self.mc.LSL_ri(targetreg.value, sourcereg.value, + get_scale(itemsize)) + else: + mc.gen_load_int(targetreg.value, itemsize) + mc.MUL_rr(targetreg.value, sourcereg.value, targetreg.value) + # + return shiftsize + + + def _build_stack_check_slowpath(self): + _, _, slowpathaddr = self.cpu.insert_stack_check() + if slowpathaddr == 0 or not self.cpu.propagate_exception_descr: + return # no stack check (for tests, or non-translated) + # + # make a "function" that is called immediately at the start of + # an assembler function. In particular, the stack looks like: + # + # | retaddr of caller | <-- aligned to a multiple of 16 + # | saved argument regs | + # | my own retaddr | <-- sp + # +-----------------------+ + # + mc = InstrBuilder() + # save argument registers and return address + mc.SUB_ri(r.sp.value, r.sp.value, (len(r.argument_regs) + 2) * WORD) + mc.STR_ri(r.lr.value, r.sp.value, 0) + for i in range(0, len(r.argument_regs), 2): + mc.STP_rri(r.argument_regs[i].value, r.argument_regs[i + 1].value, + r.sp.value, (i + 2) * WORD) + # stack is aligned here + # Pass current stack pointer as argument to the call + mc.SUB_ri(r.x0.value, r.sp.value, 0) + # + mc.BL(slowpathaddr) + + # check for an exception + mc.gen_load_int(r.x0.value, self.cpu.pos_exception()) + mc.LDR_ri(r.x0.value, r.x0.value, 0) + mc.TST_rr_shift(r.x0.value, r.x0.value, 0) + # + # restore registers and return + # We check for c.EQ here, meaning all bits zero in this case + + jmp = mc.currpos() + mc.BRK() + + for i in range(0, len(r.argument_regs), 2): + mc.LDP_rri(r.argument_regs[i].value, r.argument_regs[i + 1].value, + r.sp.value, (i + 2) * WORD) + mc.LDR_ri(r.ip0.value, r.sp.value, 0) + mc.ADD_ri(r.sp.value, r.sp.value, (len(r.argument_regs) + 2) * WORD) + mc.RET_r(r.ip0.value) + + # jump here + + pmc = OverwritingBuilder(mc, jmp, WORD) + pmc.B_ofs_cond(mc.currpos() - jmp, c.NE) + + mc.ADD_ri(r.sp.value, r.sp.value, (len(r.argument_regs) + 2) * WORD) + mc.B(self.propagate_exception_path) + # + + rawstart = mc.materialize(self.cpu, []) + self.stack_check_slowpath = rawstart + + def _check_frame_depth_debug(self, mc): + pass + + def _check_frame_depth(self, mc, gcmap, expected_size=-1): + """ check if the frame is of enough depth to follow this bridge. + Otherwise reallocate the frame in a helper. + There are other potential solutions + to that, but this one does not sound too bad. + """ + descrs = self.cpu.gc_ll_descr.getframedescrs(self.cpu) + ofs = self.cpu.unpack_fielddescr(descrs.arraydescr.lendescr) + mc.LDR_ri(r.ip0.value, r.fp.value, ofs) + stack_check_cmp_ofs = mc.currpos() + if expected_size == -1: + for _ in range(mc.get_max_size_of_gen_load_int()): + mc.NOP() + else: + mc.gen_load_int(r.ip1.value, expected_size) + mc.CMP_rr(r.ip0.value, r.ip1.value) + + jg_location = mc.currpos() + mc.BRK() + + # the size value is still stored in ip1 + mc.SUB_ri(r.sp.value, r.sp.value, 2*WORD) + mc.STR_ri(r.ip1.value, r.sp.value, WORD) + + mc.gen_load_int(r.ip0.value, rffi.cast(lltype.Signed, gcmap)) + mc.STR_ri(r.ip0.value, r.sp.value, 0) + + mc.BL(self._frame_realloc_slowpath) + + # patch jg_location above + currpos = mc.currpos() + pmc = OverwritingBuilder(mc, jg_location, WORD) + pmc.B_ofs_cond(currpos - jg_location, c.GE) + + self.frame_depth_to_patch.append(stack_check_cmp_ofs) + + def update_frame_depth(self, frame_depth): + baseofs = self.cpu.get_baseofs_of_frame_field() + self.current_clt.frame_info.update_frame_depth(baseofs, frame_depth) + + def _reload_frame_if_necessary(self, mc): + gcrootmap = self.cpu.gc_ll_descr.gcrootmap + if gcrootmap and gcrootmap.is_shadow_stack: + rst = gcrootmap.get_root_stack_top_addr() + mc.gen_load_int(r.ip0.value, rst) + self.load_reg(mc, r.ip0, r.ip0) + mc.SUB_ri(r.ip0.value, r.ip0.value, WORD) + mc.LDR_ri(r.fp.value, r.ip0.value, 0) + wbdescr = self.cpu.gc_ll_descr.write_barrier_descr + if gcrootmap and wbdescr: + # frame never uses card marking, so we enforce this is not + # an array + self._write_barrier_fastpath(mc, wbdescr, [r.fp], array=False, + is_frame=True) + + def generate_quick_failure(self, guardtok): + startpos = self.mc.currpos() + faildescrindex, target = self.store_info_on_descr(startpos, guardtok) + self.load_from_gc_table(r.ip0.value, faildescrindex) + ofs = self.cpu.get_ofs_of_frame_field('jf_descr') + self.store_reg(self.mc, r.ip0, r.fp, ofs) + self.push_gcmap(self.mc, gcmap=guardtok.gcmap) + assert target + self.mc.BL(target) + return startpos + + def push_gcmap(self, mc, gcmap, store=True): + assert store + ofs = self.cpu.get_ofs_of_frame_field('jf_gcmap') + ptr = rffi.cast(lltype.Signed, gcmap) + mc.gen_load_int(r.ip0.value, ptr) + self.store_reg(mc, r.ip0, r.fp, ofs) + + def pop_gcmap(self, mc): + ofs = self.cpu.get_ofs_of_frame_field('jf_gcmap') + mc.gen_load_int(r.ip0.value, 0) + self.store_reg(mc, r.ip0, r.fp, ofs) + + def write_pending_failure_recoveries(self): + for tok in self.pending_guards: + #generate the exit stub and the encoded representation + tok.pos_recovery_stub = self.generate_quick_failure(tok) + + def reserve_gcref_table(self, allgcrefs): + gcref_table_size = len(allgcrefs) * WORD + # align to a multiple of 16 and reserve space at the beginning + # of the machine code for the gc table. This lets us write + # machine code with relative addressing (LDR literal). + gcref_table_size = (gcref_table_size + 15) & ~15 + mc = self.mc + assert mc.get_relative_pos() == 0 + for i in range(gcref_table_size): + mc.writechar('\x00') + self.setup_gcrefs_list(allgcrefs) + + def patch_gcref_table(self, looptoken, rawstart): + # the gc table is at the start of the machine code + self.gc_table_addr = rawstart + tracer = self.cpu.gc_ll_descr.make_gcref_tracer(rawstart, + self._allgcrefs) + gcreftracers = self.get_asmmemmgr_gcreftracers(looptoken) + gcreftracers.append(tracer) # keepalive + self.teardown_gcrefs_list() + + def patch_stack_checks(self, framedepth, rawstart): + for ofs in self.frame_depth_to_patch: + mc = InstrBuilder() + mc.gen_load_int(r.ip1.value, framedepth) + mc.copy_to_raw_memory(ofs + rawstart) + + def load_from_gc_table(self, regnum, index): + address_in_buffer = index * WORD # at the start of the buffer + p_location = self.mc.get_relative_pos(break_basic_block=False) + offset = address_in_buffer - p_location + self.mc.LDR_r_literal(regnum, offset) + + def materialize_loop(self, looptoken): + self.datablockwrapper.done() # finish using cpu.asmmemmgr + self.datablockwrapper = None + allblocks = self.get_asmmemmgr_blocks(looptoken) + size = self.mc.get_relative_pos() + res = self.mc.materialize(self.cpu, allblocks, + self.cpu.gc_ll_descr.gcrootmap) + #self.cpu.codemap.register_codemap( + # self.codemap.get_final_bytecode(res, size)) + return res + + def patch_trace(self, faildescr, looptoken, bridge_addr, regalloc): + b = InstrBuilder() + patch_addr = faildescr.adr_jump_offset + assert patch_addr != 0 + b.BL(bridge_addr) + b.copy_to_raw_memory(patch_addr) + faildescr.adr_jump_offset = 0 + + def process_pending_guards(self, block_start): + clt = self.current_clt + for tok in self.pending_guards: + descr = tok.faildescr + assert isinstance(descr, AbstractFailDescr) + failure_recovery_pos = block_start + tok.pos_recovery_stub + descr.adr_jump_offset = failure_recovery_pos + relative_offset = tok.pos_recovery_stub - tok.offset + guard_pos = block_start + tok.offset + if not tok.guard_not_invalidated(): + # patch the guard jump to the stub + # overwrite the generate BRK with a B_offs to the pos of the + # stub + mc = InstrBuilder() + mc.B_ofs_cond(relative_offset, c.get_opposite_of(tok.fcond)) + mc.copy_to_raw_memory(guard_pos) + if tok.extra_offset != -1: + mc = InstrBuilder() + relative_offset = tok.pos_recovery_stub - tok.extra_offset + guard_pos = block_start + tok.extra_offset + mc.B_ofs_cond(relative_offset, c.get_opposite_of(tok.extra_cond)) + mc.copy_to_raw_memory(guard_pos) + else: + clt.invalidate_positions.append((guard_pos, relative_offset)) + + def fixup_target_tokens(self, rawstart): + for targettoken in self.target_tokens_currently_compiling: + targettoken._ll_loop_code += rawstart + self.target_tokens_currently_compiling = None + + def _call_header_with_stack_check(self): + self._call_header() + if self.stack_check_slowpath == 0: + pass # no stack check (e.g. not translated) + else: + endaddr, lengthaddr, _ = self.cpu.insert_stack_check() + # load stack end + self.mc.gen_load_int(r.lr.value, endaddr) # load lr, [end] + self.mc.LDR_ri(r.lr.value, r.lr.value, 0) # LDR lr, lr + # load stack length + self.mc.gen_load_int(r.ip1.value, lengthaddr) # load ip1, lengh + self.mc.LDR_ri(r.ip1.value, r.ip1.value, 0) # ldr ip1, *lengh + # calculate ofs + self.mc.SUB_ri(r.ip0.value, r.sp.value, 0) # ip0 = sp + # otherwise we can't use sp + self.mc.SUB_rr(r.lr.value, r.lr.value, r.ip0.value) # lr = lr - ip0 + # if ofs + self.mc.CMP_rr(r.lr.value, r.ip1.value) # CMP ip0, ip1 + pos = self.mc.currpos() + self.mc.BRK() + self.mc.BL(self.stack_check_slowpath) # call if ip0 > ip1 + pmc = OverwritingBuilder(self.mc, pos, WORD) + pmc.B_ofs_cond(self.mc.currpos() - pos, c.LS) + + def _call_header(self): + stack_size = (len(r.callee_saved_registers) + 4) * WORD + self.mc.STP_rr_preindex(r.lr.value, r.fp.value, r.sp.value, -stack_size) + for i in range(0, len(r.callee_saved_registers), 2): + self.mc.STP_rri(r.callee_saved_registers[i].value, + r.callee_saved_registers[i + 1].value, + r.sp.value, + (i + 4) * WORD) + + self.saved_threadlocal_addr = 3 * WORD # at offset 3 from location 'sp' + self.mc.STR_ri(r.x1.value, r.sp.value, 3 * WORD) + + # set fp to point to the JITFRAME, passed in argument 'x0' + self.mc.MOV_rr(r.fp.value, r.x0.value) + # + gcrootmap = self.cpu.gc_ll_descr.gcrootmap + if gcrootmap and gcrootmap.is_shadow_stack: + self.gen_shadowstack_header(gcrootmap) + + def _assemble(self, regalloc, inputargs, operations): + #self.guard_success_cc = c.cond_none + regalloc.compute_hint_frame_locations(operations) + self._walk_operations(inputargs, operations, regalloc) + #assert self.guard_success_cc == c.cond_none + frame_depth = regalloc.get_final_frame_depth() + jump_target_descr = regalloc.jump_target_descr + if jump_target_descr is not None: + tgt_depth = jump_target_descr._arm_clt.frame_info.jfi_frame_depth + target_frame_depth = tgt_depth - JITFRAME_FIXED_SIZE + frame_depth = max(frame_depth, target_frame_depth) + return frame_depth + + def _walk_operations(self, inputargs, operations, regalloc): + self._regalloc = regalloc + regalloc.operations = operations + while regalloc.position() < len(operations) - 1: + regalloc.next_instruction() + i = regalloc.position() + op = operations[i] + self.mc.mark_op(op) + opnum = op.getopnum() + if rop.has_no_side_effect(opnum) and op not in regalloc.longevity: + regalloc.possibly_free_vars_for_op(op) + elif not we_are_translated() and op.getopnum() == rop.FORCE_SPILL: + regalloc.force_spill_var(op.getarg(0)) + elif ((rop.returns_bool_result(opnum) or op.is_ovf()) and + i < len(operations) - 1 and + regalloc.next_op_can_accept_cc(operations, i) or + operations[i].is_ovf()): + if operations[i].is_ovf(): + assert operations[i + 1].getopnum() in [rop.GUARD_OVERFLOW, + rop.GUARD_NO_OVERFLOW] + guard_op = operations[i + 1] + guard_num = guard_op.getopnum() + arglocs, fcond = guard_operations[guard_num](regalloc, guard_op, op) + if arglocs is not None: + asm_guard_operations[guard_num](self, op, guard_op, fcond, arglocs) + regalloc.next_instruction() # advance one more + if guard_op.is_guard(): # can be also cond_call + regalloc.possibly_free_vars(guard_op.getfailargs()) + regalloc.possibly_free_vars_for_op(guard_op) + elif (rop.is_call_may_force(op.getopnum()) or + rop.is_call_release_gil(op.getopnum()) or + rop.is_call_assembler(op.getopnum())): + guard_op = operations[i + 1] # has to exist + guard_num = guard_op.getopnum() + assert guard_num in (rop.GUARD_NOT_FORCED, rop.GUARD_NOT_FORCED_2) + arglocs, fcond = guard_operations[guard_num](regalloc, guard_op, op) + if arglocs is not None: + asm_guard_operations[guard_num](self, op, guard_op, fcond, arglocs) + # fcond is abused here to pass the number of args + regalloc.next_instruction() # advance one more + regalloc.possibly_free_vars(guard_op.getfailargs()) + regalloc.possibly_free_vars_for_op(guard_op) + else: + arglocs = regalloc_operations[opnum](regalloc, op) + if arglocs is not None: + asm_operations[opnum](self, op, arglocs) + if rop.is_guard(opnum): + regalloc.possibly_free_vars(op.getfailargs()) + if op.type != 'v': + regalloc.possibly_free_var(op) + regalloc.possibly_free_vars_for_op(op) + regalloc.free_temp_vars() + regalloc._check_invariants() + if not we_are_translated(): + self.mc.BRK() + self.mc.mark_op(None) # end of the loop + regalloc.operations = None + + def dispatch_comparison(self, op): + opnum = op.getopnum() + arglocs = comp_operations[opnum](self._regalloc, op, True) + assert arglocs is not None + return asm_comp_operations[opnum](self, op, arglocs) + + # regalloc support + def load(self, loc, value): + """load an immediate value into a register""" + assert (loc.is_core_reg() and value.is_imm() + or loc.is_vfp_reg() and value.is_imm_float()) + if value.is_imm(): + self.mc.gen_load_int(loc.value, value.getint()) + elif value.is_imm_float(): + self.mc.gen_load_int(r.ip0.value, value.getint()) + self.mc.LDR_di(loc.value, r.ip0.value, 0) + + def _mov_stack_to_loc(self, prev_loc, loc): + offset = prev_loc.value + if loc.is_core_reg(): + assert prev_loc.type != FLOAT, 'trying to load from an \ + incompatible location into a core register' + # unspill a core register + assert 0 <= offset <= (1<<15) - 1 + self.mc.LDR_ri(loc.value, r.fp.value, offset) + return + if loc.is_vfp_reg(): + assert prev_loc.type == FLOAT, 'trying to load from an \ + incompatible location into a float register' + assert 0 <= offset <= (1 << 15) - 1 + self.mc.LDR_di(loc.value, r.fp.value, offset) + return + assert False + # elif loc.is_vfp_reg(): + # assert prev_loc.type == FLOAT, 'trying to load from an \ + # incompatible location into a float register' + # # load spilled value into vfp reg + # is_imm = check_imm_arg(offset) + # helper, save = self.get_tmp_reg() + # save_helper = not is_imm and save + # elif loc.is_raw_sp(): + # assert (loc.type == prev_loc.type == FLOAT + # or (loc.type != FLOAT and prev_loc.type != FLOAT)) + # tmp = loc + # if loc.is_float(): + # loc = r.vfp_ip + # else: + # loc, save_helper = self.get_tmp_reg() + # assert not save_helper + # helper, save_helper = self.get_tmp_reg([loc]) + # assert not save_helper + # else: + # assert 0, 'unsupported case' + + # if save_helper: + # self.mc.PUSH([helper.value], cond=cond) + # self.load_reg(self.mc, loc, r.fp, offset, cond=cond, helper=helper) + # if save_helper: + # self.mc.POP([helper.value], cond=cond) + + def _mov_reg_to_loc(self, prev_loc, loc): + if loc.is_core_reg(): + self.mc.MOV_rr(loc.value, prev_loc.value) + elif loc.is_stack(): + self.mc.STR_ri(prev_loc.value, r.fp.value, loc.value) + else: + assert False + + def _mov_imm_to_loc(self, prev_loc, loc): + if loc.is_core_reg(): + self.mc.gen_load_int(loc.value, prev_loc.value) + elif loc.is_stack(): + self.mc.gen_load_int(r.ip0.value, prev_loc.value) + self.mc.STR_ri(r.ip0.value, r.fp.value, loc.value) + else: + assert False + + def new_stack_loc(self, i, tp): + base_ofs = self.cpu.get_baseofs_of_frame_field() + return StackLocation(i, get_fp_offset(base_ofs, i), tp) + + def mov_loc_to_raw_stack(self, loc, pos): + if loc.is_core_reg(): + self.mc.STR_ri(loc.value, r.sp.value, pos) + elif loc.is_stack(): + self.mc.LDR_ri(r.ip0.value, r.fp.value, loc.value) + self.mc.STR_ri(r.ip0.value, r.sp.value, pos) + elif loc.is_vfp_reg(): + self.mc.STR_di(loc.value, r.sp.value, pos) + elif loc.is_imm(): + self.mc.gen_load_int(r.ip0.value, loc.value) + self.mc.STR_ri(r.ip0.value, r.sp.value, pos) + else: + assert False, "wrong loc" + + def mov_raw_stack_to_loc(self, pos, loc): + if loc.is_core_reg(): + self.mc.LDR_ri(loc.value, r.sp.value, pos) + elif loc.is_stack(): + self.mc.LDR_ri(r.ip0.value, r.sp.value, pos) + self.mc.STR_ri(r.ip0.value, r.fp.value, loc.value) + elif loc.is_vfp_reg(): + self.mc.LDR_di(loc.value, r.sp.value, pos) + else: + assert False, "wrong loc" + + def _mov_imm_float_to_loc(self, prev_loc, loc): + if loc.is_vfp_reg(): + self.load(loc, prev_loc) + elif loc.is_stack(): + self.load(r.vfp_ip, prev_loc) + self._mov_vfp_reg_to_loc(r.vfp_ip, loc) + else: + assert False, "wrong loc" + + def _mov_vfp_reg_to_loc(self, prev_loc, loc): + if loc.is_stack(): + self.mc.STR_di(prev_loc.value, r.fp.value, loc.value) + elif loc.is_vfp_reg(): + self.mc.FMOV_dd(loc.value, prev_loc.value) + else: + assert False, "wrong loc" + + def push_locations(self, locs): + if not locs: + return + depth = len(locs) * WORD + depth += depth & WORD # align + self.mc.SUB_ri(r.sp.value, r.sp.value, depth) + for i, loc in enumerate(locs): + self.mov_loc_to_raw_stack(loc, i * WORD) + + def pop_locations(self, locs): + if not locs: + return + depth = len(locs) * WORD + depth += depth & WORD # align + for i, loc in enumerate(locs): + self.mov_raw_stack_to_loc(i * WORD, loc) + self.mc.ADD_ri(r.sp.value, r.sp.value, depth) + + def regalloc_mov(self, prev_loc, loc): + """Moves a value from a previous location to some other location""" + if prev_loc.is_imm(): + return self._mov_imm_to_loc(prev_loc, loc) + elif prev_loc.is_core_reg(): + self._mov_reg_to_loc(prev_loc, loc) + elif prev_loc.is_stack(): + self._mov_stack_to_loc(prev_loc, loc) + elif prev_loc.is_imm_float(): + self._mov_imm_float_to_loc(prev_loc, loc) + elif prev_loc.is_vfp_reg(): + self._mov_vfp_reg_to_loc(prev_loc, loc) + else: + assert 0, 'unsupported case' + mov_loc_loc = regalloc_mov + + def gen_func_epilog(self, mc=None): + gcrootmap = self.cpu.gc_ll_descr.gcrootmap + if mc is None: + mc = self.mc + if gcrootmap and gcrootmap.is_shadow_stack: + self.gen_footer_shadowstack(gcrootmap, mc) + + # pop all callee saved registers + + stack_size = (len(r.callee_saved_registers) + 4) * WORD + + for i in range(0, len(r.callee_saved_registers), 2): + mc.LDP_rri(r.callee_saved_registers[i].value, + r.callee_saved_registers[i + 1].value, + r.sp.value, + (i + 4) * WORD) + mc.LDP_rr_postindex(r.lr.value, r.fp.value, r.sp.value, stack_size) + + + mc.RET_r(r.lr.value) + + def gen_shadowstack_header(self, gcrootmap): + # we push two words, like the x86 backend does: + # the '1' is to benefit from the shadowstack 'is_minor' optimization + rst = gcrootmap.get_root_stack_top_addr() + self.mc.gen_load_int(r.ip1.value, rst) + # x8 = *ip1 + self.load_reg(self.mc, r.x8, r.ip1) + # x8[0] = 1 + self.mc.gen_load_int(r.ip0.value, 1) + self.store_reg(self.mc, r.ip0, r.x8) + # x8[1] = r.fp + self.store_reg(self.mc, r.fp, r.x8, WORD) + # *ip1 = x8 + 2 * WORD + self.mc.ADD_ri(r.x8.value, r.x8.value, 2 * WORD) + self.store_reg(self.mc, r.x8, r.ip1) + + def gen_footer_shadowstack(self, gcrootmap, mc): + rst = gcrootmap.get_root_stack_top_addr() + mc.gen_load_int(r.ip0.value, rst) + self.load_reg(mc, r.ip1, r.ip0) + mc.SUB_ri(r.ip1.value, r.ip1.value, 2 * WORD) # two words, see above + self.store_reg(mc, r.ip1, r.ip0) + + def store_reg(self, mc, source, base, ofs=0, helper=None): + if source.is_vfp_reg(): + return self._store_vfp_reg(mc, source, base, ofs) + else: + return self._store_core_reg(mc, source, base, ofs) + + def _store_vfp_reg(self, mc, source, base, ofs): + assert ofs <= (1 << 15) - 1 + mc.STR_di(source.value, base.value, ofs) + + def _store_core_reg(self, mc, source, base, ofs): + # XXX fix: + assert ofs & 0x7 == 0 + assert 0 <= ofs < 32768 + mc.STR_ri(source.value, base.value, ofs) + #if check_imm_arg(ofs): + # mc.STR_ri(source.value, base.value, imm=ofs) + #else: + # mc.gen_load_int(r.ip1, ofs) + # mc.STR_rr(source.value, base.value, r.ip1) + + def load_reg(self, mc, target, base, ofs=0, helper=r.ip0): + assert target.is_core_reg() + if check_imm_arg(abs(ofs)): + mc.LDR_ri(target.value, base.value, ofs) + else: + mc.gen_load_int(helper.value, ofs) + mc.LDR_rr(target.value, base.value, helper.value) + + def check_frame_before_jump(self, target_token): + if target_token in self.target_tokens_currently_compiling: + return + if target_token._arm_clt is self.current_clt: + return + # We can have a frame coming from god knows where that's + # passed to a jump to another loop. Make sure it has the + # correct depth + expected_size = target_token._arm_clt.frame_info.jfi_frame_depth + self._check_frame_depth(self.mc, self._regalloc.get_gcmap(), + expected_size=expected_size) + + # ../x86/assembler.py:668 + def redirect_call_assembler(self, oldlooptoken, newlooptoken): + # some minimal sanity checking + old_nbargs = oldlooptoken.compiled_loop_token._debug_nbargs + new_nbargs = newlooptoken.compiled_loop_token._debug_nbargs + assert old_nbargs == new_nbargs + # we overwrite the instructions at the old _ll_function_addr + # to start with a JMP to the new _ll_function_addr. + # Ideally we should rather patch all existing CALLs, but well. + oldadr = oldlooptoken._ll_function_addr + target = newlooptoken._ll_function_addr + # copy frame-info data + baseofs = self.cpu.get_baseofs_of_frame_field() + newlooptoken.compiled_loop_token.update_frame_info( + oldlooptoken.compiled_loop_token, baseofs) + mc = InstrBuilder() + mc.B(target) + mc.copy_to_raw_memory(oldadr) + # + jl.redirect_assembler(oldlooptoken, newlooptoken, newlooptoken.number) + + + +def not_implemented(msg): + msg = '[ARM64/asm] %s\n' % msg + if we_are_translated(): + llop.debug_print(lltype.Void, msg) + raise NotImplementedError(msg) + + +def notimplemented_op(self, op, arglocs): + print "[ARM64/asm] %s not implemented" % op.getopname() + raise NotImplementedError(op) + +def notimplemented_comp_op(self, op, arglocs): + print "[ARM64/asm] %s not implemented" % op.getopname() + raise NotImplementedError(op) + +def notimplemented_guard_op(self, op, guard_op, fcond, arglocs): + print "[ARM64/asm] %s not implemented" % op.getopname() + raise NotImplementedError(op) + +asm_operations = [notimplemented_op] * (rop._LAST + 1) +asm_guard_operations = [notimplemented_guard_op] * (rop._LAST + 1) +asm_comp_operations = [notimplemented_comp_op] * (rop._LAST + 1) +asm_extra_operations = {} + +for name, value in ResOpAssembler.__dict__.iteritems(): + if name.startswith('emit_opx_'): + opname = name[len('emit_opx_'):] + num = getattr(EffectInfo, 'OS_' + opname.upper()) + asm_extra_operations[num] = value + elif name.startswith('emit_op_'): + opname = name[len('emit_op_'):] + num = getattr(rop, opname.upper()) + asm_operations[num] = value + elif name.startswith('emit_guard_op_'): + opname = name[len('emit_guard_op_'):] + num = getattr(rop, opname.upper()) + asm_guard_operations[num] = value + elif name.startswith('emit_comp_op_'): + opname = name[len('emit_comp_op_'):] + num = getattr(rop, opname.upper()) + asm_comp_operations[num] = value diff -Nru pypy-7.1.1+dfsg/rpython/jit/backend/aarch64/callbuilder.py pypy-7.3.1+dfsg/rpython/jit/backend/aarch64/callbuilder.py --- pypy-7.1.1+dfsg/rpython/jit/backend/aarch64/callbuilder.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/backend/aarch64/callbuilder.py 2020-04-10 19:28:41.000000000 +0000 @@ -0,0 +1,297 @@ + +from rpython.jit.backend.llsupport.callbuilder import AbstractCallBuilder +from rpython.jit.backend.aarch64.arch import WORD +from rpython.jit.metainterp.history import INT, FLOAT, REF +from rpython.jit.backend.aarch64 import registers as r +from rpython.jit.backend.arm import conditions as c +from rpython.jit.backend.aarch64.jump import remap_frame_layout # we use arm algo +from rpython.jit.backend.llsupport import llerrno +from rpython.jit.backend.aarch64.codebuilder import OverwritingBuilder + +from rpython.rlib.objectmodel import we_are_translated +from rpython.rtyper.lltypesystem import rffi + +class Aarch64CallBuilder(AbstractCallBuilder): + def __init__(self, assembler, fnloc, arglocs, + resloc=r.x0, restype=INT, ressize=WORD, ressigned=True): + AbstractCallBuilder.__init__(self, assembler, fnloc, arglocs, + resloc, restype, ressize) + self.current_sp = 0 + + def prepare_arguments(self): + arglocs = self.arglocs + non_float_locs = [] + non_float_regs = [] + float_locs = [] + float_regs = [] + stack_locs = [] + free_regs = [r.x7, r.x6, r.x5, r.x4, r.x3, r.x2, r.x1, r.x0] + free_float_regs = [r.d7, r.d6, r.d5, r.d4, r.d3, r.d2, r.d1, r.d0] + for arg in arglocs: + if arg.type == FLOAT: + if free_float_regs: + float_locs.append(arg) + float_regs.append(free_float_regs.pop()) + else: + stack_locs.append(arg) + else: + if free_regs: + non_float_locs.append(arg) + non_float_regs.append(free_regs.pop()) + else: + stack_locs.append(arg) + + if stack_locs: + adj = len(stack_locs) + (len(stack_locs) & 1) + self.mc.SUB_ri(r.sp.value, r.sp.value, adj * WORD) + self.current_sp = adj * WORD + c = 0 + for loc in stack_locs: + self.asm.mov_loc_to_raw_stack(loc, c) + c += WORD + + move_back = False + if not self.fnloc.is_imm(): + if self.fnloc.is_core_reg(): + self.mc.MOV_rr(r.ip1.value, self.fnloc.value) + else: + assert self.fnloc.is_stack() + self.mc.LDR_ri(r.ip1.value, r.fp.value, self.fnloc.value) + self.fnloc = r.x8 + move_back = True + + remap_frame_layout(self.asm, non_float_locs, non_float_regs, r.ip0) + if float_locs: + remap_frame_layout(self.asm, float_locs, float_regs, r.d8) + + if move_back: + self.mc.MOV_rr(r.x8.value, r.ip1.value) + + def push_gcmap(self): + noregs = self.asm.cpu.gc_ll_descr.is_shadow_stack() + gcmap = self.asm._regalloc.get_gcmap([r.x0], noregs=noregs) + self.asm.push_gcmap(self.mc, gcmap) + + def pop_gcmap(self): + self.asm._reload_frame_if_necessary(self.mc) + self.asm.pop_gcmap(self.mc) + + def emit_raw_call(self): + #the actual call + if self.fnloc.is_imm(): + self.mc.BL(self.fnloc.value) + return + if self.fnloc.is_stack(): + assert False, "we should never be here" + else: + assert self.fnloc.is_core_reg() + assert self.fnloc is r.x8 + self.mc.BLR_r(self.fnloc.value) + + def restore_stack_pointer(self): + assert self.current_sp & 1 == 0 # always adjusted to 16 bytes + if self.current_sp == 0: + return + self.mc.ADD_ri(r.sp.value, r.sp.value, self.current_sp) + self.current_sp = 0 + + def load_result(self): + resloc = self.resloc + if self.restype == 'S': + assert False, "not supported yet" + XXX + self.mc.VMOV_sc(resloc.value, r.s0.value) + elif self.restype == 'L': + assert False, "not possible on 64bit backend" + YYY + assert resloc.is_vfp_reg() + self.mc.FMDRR(resloc.value, r.r0.value, r.r1.value) + # ensure the result is wellformed and stored in the correct location + if resloc is not None and resloc.is_core_reg(): + self._ensure_result_bit_extension(resloc, + self.ressize, self.ressign) + + def _ensure_result_bit_extension(self, resloc, size, signed): + if size == WORD: + return + if size == 4: + if not signed: # unsigned int + self.mc.LSL_ri(resloc.value, resloc.value, 32) + self.mc.LSR_ri(resloc.value, resloc.value, 32) + else: # signed int + self.mc.LSL_ri(resloc.value, resloc.value, 32) + self.mc.ASR_ri(resloc.value, resloc.value, 32) + elif size == 2: + if not signed: + self.mc.LSL_ri(resloc.value, resloc.value, 48) + self.mc.LSR_ri(resloc.value, resloc.value, 48) + else: + self.mc.LSL_ri(resloc.value, resloc.value, 48) + self.mc.ASR_ri(resloc.value, resloc.value, 48) + elif size == 1: + if not signed: # unsigned char + self.mc.AND_ri(resloc.value, resloc.value, 0xFF) + else: + self.mc.LSL_ri(resloc.value, resloc.value, 56) + self.mc.ASR_ri(resloc.value, resloc.value, 56) + + def call_releasegil_addr_and_move_real_arguments(self, fastgil): + assert self.is_call_release_gil + assert not self.asm._is_asmgcc() + RTHREADID = r.x19 # our thread ident + RSHADOWOLD = r.x20 # old value of the shadowstack pointer, + # which we save here for later comparison + + gcrootmap = self.asm.cpu.gc_ll_descr.gcrootmap + if gcrootmap: + rst = gcrootmap.get_root_stack_top_addr() + self.mc.gen_load_int(r.ip1.value, rst) + self.mc.LDR_ri(RSHADOWOLD.value, r.ip1.value, 0) + + # change 'rpy_fastgil' to 0 (it should be non-zero right now) + # and save the old value of 'rpy_fastgil' into RTHREADID + self.mc.gen_load_int(r.ip1.value, fastgil) + self.mc.LDR_ri(RTHREADID.value, r.ip1.value, 0) + self.mc.STLR(r.xzr.value, r.ip1.value) + + if not we_are_translated(): # for testing: we should not access + self.mc.ADD_ri(r.fp.value, r.fp.value, 1) # fp any more + + def write_real_errno(self, save_err): + if save_err & rffi.RFFI_READSAVED_ERRNO: + # Just before a call, read '*_errno' and write it into the + # real 'errno'. The x0-x7 registers contain arguments to the + # future call; + # the x8-x10 registers contain various stuff. XXX what? + # We still have x11 and up. + if save_err & rffi.RFFI_ALT_ERRNO: + rpy_errno = llerrno.get_alt_errno_offset(self.asm.cpu) + else: + rpy_errno = llerrno.get_rpy_errno_offset(self.asm.cpu) + p_errno = llerrno.get_p_errno_offset(self.asm.cpu) + self.mc.LDR_ri(r.x11.value, r.sp.value, + self.asm.saved_threadlocal_addr + self.current_sp) + self.mc.LDR_ri(r.ip0.value, r.x11.value, p_errno) + self.mc.LDR_ri(r.x11.value, r.x11.value, rpy_errno) + self.mc.STR_ri(r.x11.value, r.ip0.value, 0) + elif save_err & rffi.RFFI_ZERO_ERRNO_BEFORE: + # Same, but write zero. + p_errno = llerrno.get_p_errno_offset(self.asm.cpu) + self.mc.LDR_ri(r.x11.value, r.sp.value, + self.asm.saved_threadlocal_addr + self.current_sp) + self.mc.LDR_ri(r.ip0.value, r.x11.value, p_errno) + self.mc.MOVZ_r_u16(r.x11.value, 0, 0) + self.mc.STR_ri(r.x11.value, r.ip0.value, 0) + + def read_real_errno(self, save_err): + if save_err & rffi.RFFI_SAVE_ERRNO: + # Just after a call, read the real 'errno' and save a copy of + # it inside our thread-local '*_errno'. Registers x11 and up + # are unused here, and registers x2-x3 never contain anything + # after the call. + if save_err & rffi.RFFI_ALT_ERRNO: + rpy_errno = llerrno.get_alt_errno_offset(self.asm.cpu) + else: + rpy_errno = llerrno.get_rpy_errno_offset(self.asm.cpu) + p_errno = llerrno.get_p_errno_offset(self.asm.cpu) + self.mc.LDR_ri(r.x3.value, r.sp.value, + self.asm.saved_threadlocal_addr) + self.mc.LDR_ri(r.ip0.value, r.x3.value, p_errno) + self.mc.LDR_ri(r.ip0.value, r.ip0.value, 0) + self.mc.STR_ri(r.ip0.value, r.x3.value, rpy_errno) + + def move_real_result_and_call_reacqgil_addr(self, fastgil): + # try to reacquire the lock. The following two values are saved + # across the call and are still alive now: + RTHREADID = r.x19 # our thread ident + RSHADOWOLD = r.x20 # old value of the shadowstack pointer + + RPYFASTGIL = r.ip2 # &rpy_fastgil, loaded now: + self.mc.gen_load_int(RPYFASTGIL.value, fastgil) + + # this comes from gcc compiling this code: + # __sync_bool_compare_and_swap(&rpy_fastgil, old=0, new=RTHREADID); + self.mc.LDXR(r.x1.value, RPYFASTGIL.value) + self.mc.CBNZ(r.x1.value, +12) + self.mc.STLXR(r.x3.value, RTHREADID.value, RPYFASTGIL.value) + self.mc.CBNZ_w(r.x3.value, -12) + self.mc.DMB_ISH() + # now x1 is the old value of the lock, and if x1 == 0 then the lock + # now contains RTHREADID + + b1_location = self.mc.currpos() + self.mc.BRK() # boehm: patched with a CBZ (jump if x1 == 0) + # shadowstack: patched with CBNZ instead + + gcrootmap = self.asm.cpu.gc_ll_descr.gcrootmap + if gcrootmap: + # When doing a call_release_gil with shadowstack, there + # is the risk that the 'rpy_fastgil' was free but the + # current shadowstack can be the one of a different + # thread. So here we check if the shadowstack pointer + # is still the same as before we released the GIL (saved + # in 'x20'), and if not, we fall back to 'reacqgil_addr'. + rst = gcrootmap.get_root_stack_top_addr() + self.mc.gen_load_int(r.ip1.value, rst) + self.mc.LDR_ri(r.ip0.value, r.ip1.value, 0) # new shadowstack + self.mc.CMP_rr(r.ip0.value, RSHADOWOLD.value) + b3_location = self.mc.currpos() + self.mc.BRK() # B.eq forward + + # revert the rpy_fastgil acquired above, so that the + # general 'reacqgil_addr' below can acquire it again... + self.mc.STR_ri(r.xzr.value, RPYFASTGIL.value, 0) + + # patch the b1_location above, with "CBNZ here" + pmc = OverwritingBuilder(self.mc, b1_location, WORD) + pmc.CBNZ(r.x1.value, self.mc.currpos() - b1_location) + + open_location = b3_location + else: + open_location = b1_location + + # Yes, we need to call the reacqgil() function. + # save the result we just got + RSAVEDRES = RTHREADID # can reuse this reg here to save things + reg = self.resloc + if reg is not None: + if reg.is_core_reg(): + self.mc.MOV_rr(RSAVEDRES.value, reg.value) + elif reg.is_vfp_reg(): + self.mc.SUB_ri(r.sp.value, r.sp.value, 2 * WORD) + self.mc.STR_di(reg.value, r.sp.value, 0) + + # call the function + self.mc.BL(self.asm.reacqgil_addr) + + # restore the saved register + if reg is not None: + if reg.is_core_reg(): + self.mc.MOV_rr(reg.value, RSAVEDRES.value) + elif reg.is_vfp_reg(): + self.mc.LDR_di(reg.value, r.sp.value, 0) + self.mc.ADD_ri(r.sp.value, r.sp.value, 2 * WORD) + + # now patch the still-open jump above: + # boehm: patch b1_location with a CBZ(x1) + # shadowstack: patch b3_location with BEQ + pmc = OverwritingBuilder(self.mc, open_location, WORD) + offset = self.mc.currpos() - open_location + if gcrootmap: + pmc.B_ofs_cond(offset, c.EQ) + else: + pmc.CBZ(r.x1.value, offset) + + if not we_are_translated(): # for testing: now we can accesss + self.mc.SUB_ri(r.fp.value, r.fp.value, 1) # fp again + + def get_result_locs(self): + if self.resloc is None: + return [], [] + if self.resloc.is_vfp_reg(): + if self.restype == 'L': # long long + return [r.r0], [] + else: + return [], [r.d0] + assert self.resloc.is_core_reg() + return [r.r0], [] diff -Nru pypy-7.1.1+dfsg/rpython/jit/backend/aarch64/codebuilder.py pypy-7.3.1+dfsg/rpython/jit/backend/aarch64/codebuilder.py --- pypy-7.1.1+dfsg/rpython/jit/backend/aarch64/codebuilder.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/backend/aarch64/codebuilder.py 2020-04-10 19:28:41.000000000 +0000 @@ -0,0 +1,589 @@ + +from rpython.rlib.objectmodel import we_are_translated +from rpython.jit.backend.llsupport.asmmemmgr import BlockBuilderMixin +from rpython.jit.backend.aarch64.locations import RegisterLocation +from rpython.jit.backend.aarch64 import registers as r +from rpython.rlib.rarithmetic import intmask +from rpython.rtyper.lltypesystem import lltype, rffi, llmemory +from rpython.tool.udir import udir + +clear_cache = rffi.llexternal( + "__clear_cache", + [llmemory.Address, llmemory.Address], + lltype.Void, + _nowrapper=True, + sandboxsafe=True) + + +class AbstractAarch64Builder(object): + def write32(self, word): + self.writechar(chr(word & 0xFF)) + self.writechar(chr((word >> 8) & 0xFF)) + self.writechar(chr((word >> 16) & 0xFF)) + self.writechar(chr((word >> 24) & 0xFF)) + + def RET_r(self, arg): + self.write32((0b1101011001011111 << 16) | (arg << 5)) + + def STR_ri(self, rt, rn, offset): + base = 0b1111100100 + assert offset & 0x7 == 0 + assert 0 <= offset < 32768 + self.write32((base << 22) | ((offset >> 3) << 10) | + (rn << 5) | rt) + + def STR_di(self, rt, rn, offset): + base = 0b1111110100 + assert offset & 0x7 == 0 + assert 0 <= offset < 32768 + self.write32((base << 22) | ((offset >> 3) << 10) | (rn << 5) | rt) + + def STR_dd(self, rt, rn, rm): + base = 0b11111100001 + self.write32((base << 21) | (rm << 16) | (0b011010 << 10) | (rn << 5) | rt) + + def STP_rr_preindex(self, reg1, reg2, rn, offset): + base = 0b1010100110 + assert -512 <= offset < 512 + assert offset & 0x7 == 0 + self.write32((base << 22) | ((0x7F & (offset >> 3)) << 15) | + (reg2 << 10) | (rn << 5) | reg1) + + def STP_rri(self, reg1, reg2, rn, offset): + base = 0b1010100100 + assert -512 <= offset < 512 + assert offset & 0x7 == 0 + self.write32((base << 22) | ((0x7F & (offset >> 3)) << 15) | + (reg2 << 10) | (rn << 5) | reg1) + + def STR_size_rr(self, scale, rt, rn, rm): + base = 0b111000001 + assert 0 <= scale <= 3 + self.write32((scale << 30) | (base << 21) | (rm << 16) | (0b11 << 13) | + (0b010 << 10) | (rn << 5) | rt) + + def STR_size_ri(self, scale, rt, rn, imm): + assert 0 <= imm < 4096 + assert 0 <= scale <= 3 + base = 0b11100100 + self.write32((scale << 30) | (base << 22) | (imm >> scale << 10) | (rn << 5) | rt) + + def STRB_ri(self, rt, rn, imm): + self.STR_size_ri(0, rt, rn, imm) + + def STRH_ri(self, rt, rn, imm): + self.STR_size_ri(1, rt, rn, imm) + + def STRW_ri(self, rt, rn, imm): + self.STR_size_ri(2, rt, rn, imm) + + def MOV_rr(self, rd, rn): + self.ORR_rr(rd, r.xzr.value, rn) + + def UMOV_rd(self, rd, rn): + base = 0b0100111000001000001111 + self.write32((base << 10) | (rn << 5) | rd) + + def INS_dr(self, rd, rn): + base = 0b0100111000001000000111 + self.write32((base << 10) | (rn << 5) | rd) + + def ORR_rr(self, rd, rn, rm): + base = 0b10101010000 + self.write32((base << 21) | (rm << 16) | + (rn << 5) | rd) + + def MOVK_r_u16(self, rd, immed, shift): + base = 0b111100101 + assert 0 <= immed < 1 << 16 + assert shift in (0, 16, 32, 48) + self.write32((base << 23) | (shift >> 4 << 21) | (immed << 5) | rd) + + def MOVZ_r_u16(self, rd, immed, shift): + base = 0b110100101 + assert 0 <= immed < 1 << 16 + assert shift in (0, 16, 32, 48) + self.write32((base << 23) | (shift >> 4 << 21) | (immed << 5) | rd) + + def MOVN_r_u16(self, rd, immed): + base = 0b10010010100 + assert 0 <= immed < 1 << 16 + self.write32((base << 21) | (immed << 5) | rd) + + def ADD_ri(self, rd, rn, constant, s=0): + base = 0b1001000100 | (s << 7) + assert 0 <= constant < 4096 + self.write32((base << 22) | (constant << 10) | + (rn << 5) | rd) + + def SUB_ri(self, rd, rn, constant, s=0): + base = 0b1101000100 | (s << 7) + assert 0 <= constant < 4096 + self.write32((base << 22) | (constant << 10) | (rn << 5) | rd) + + def LDP_rri(self, reg1, reg2, rn, offset): + base = 0b1010100101 + assert -512 <= offset < 512 + assert offset & 0x7 == 0 + assert reg1 != reg2 + self.write32((base << 22) | ((0x7F & (offset >> 3)) << 15) | + (reg2 << 10) | (rn << 5) | reg1) + + def LDP_rr_postindex(self, reg1, reg2, rn, offset): + base = 0b1010100011 + assert -512 <= offset < 512 + assert offset & 0x7 == 0 + assert reg1 != reg2 + assert rn != reg1 + assert rn != reg2 + self.write32((base << 22) | ((0x7F & (offset >> 3)) << 15) | + (reg2 << 10) | (rn << 5) | reg1) + + def LDR_ri(self, rt, rn, immed): + base = 0b1111100101 + assert 0 <= immed < 1<<16 + assert immed & 0x7 == 0 + self.write32((base << 22) | (immed >> 3 << 10) | (rn << 5) | rt) + + def LDR_uint32_ri(self, rt, rn, immed): + base = 0b1011100101 + assert 0 <= immed < 1<<15 + assert immed & 0x3 == 0 + self.write32((base << 22) | (immed >> 2 << 10) | (rn << 5) | rt) + + def LDR_di(self, rt, rn, offset): + assert offset & 0x7 == 0 + assert 0 <= offset < 32768 + base = 0b1111110101 + self.write32((base << 22) | (offset >> 3 << 10) | (rn << 5) | rt) + + def LDR_dr(self, rt, rn, rm): + base = 0b11111100011 + self.write32((base << 21) | (rm << 16) | (0b011010 << 10) | (rn << 5) | rt) + + def LDRB_ri(self, rt, rn, immed): + base = 0b0011100101 + assert 0 <= immed < 1<<12 + self.write32((base << 22) | (immed << 10) | (rn << 5) | rt) + + def LDRSH_ri(self, rt, rn, immed): + base = 0b0111100110 + assert 0 <= immed <= 1<<13 + assert immed & 0b1 == 0 + self.write32((base << 22) | (immed >> 1 << 10) | (rn << 5) | rt) + + def LDR_rr(self, rt, rn, rm): + base = 0b11111000011 + self.write32((base << 21) | (rm << 16) | (0b011010 << 10) | (rn << 5) | rt) + + def LDR_uint32_rr(self, rt, rn, rm): + base = 0b10111000011 + self.write32((base << 21) | (rm << 16) | (0b011010 << 10) | (rn << 5) | rt) + + def LDRH_rr(self, rt, rn, rm): + base = 0b01111000011 + self.write32((base << 21) | (rm << 16) | (0b011010 << 10) | (rn << 5) | rt) + + def LDRH_ri(self, rt, rn, immed): + assert immed & 0b1 == 0 + assert 0 <= immed < (1 << 13) + base = 0b0111100101 + self.write32((base << 22) | (immed >> 1 << 10) | (rn << 5) | rt) + + def LDRB_rr(self, rt, rn, rm): + base = 0b00111000011 + self.write32((base << 21) | (rm << 16) | (0b011010 << 10) | (rn << 5) | rt) + + def LDRSW_rr(self, rt, rn, rm): + base = 0b10111000101 + self.write32((base << 21) | (rm << 16) | (0b011010 << 10) | (rn << 5) | rt) + + def LDRSW_ri(self, rt, rn, immed): + assert immed & 0x3 == 0 + assert 0 <= immed < (1<<14) + base = 0b1011100110 + self.write32((base << 22) | (immed >> 2 << 10) | (rn << 5) | rt) + + def LDRSH_rr(self, rt, rn, rm): + base = 0b01111000101 + self.write32((base << 21) | (rm << 16) | (0b011010 << 10) | (rn << 5) | rt) + + def LDRSB_rr(self, rt, rn, rm): + base = 0b00111000101 + self.write32((base << 21) | (rm << 16) | (0b011010 << 10) | (rn << 5) | rt) + + def LDRSB_ri(self, rt, rn, immed): + base = 0b0011100110 + assert 0 <= immed < 1 << 12 + self.write32((base << 22) | (immed << 10) | (rn << 5) | rt) + + def LDR_r_literal(self, rt, offset): + base = 0b01011000 + assert -(1 << 20) <= offset < (1<< 20) + assert offset & 0x3 == 0 + self.write32((base << 24) | ((0x7ffff & (offset >> 2)) << 5) | rt) + + def ADD_rr(self, rd, rn, rm, s=0): + base = 0b10001011000 | (s << 8) + self.write32((base << 21) | (rm << 16) | (rn << 5) | (rd)) + + def ADD_rr_shifted(self, rd, rn, rm, imm): + # shifttype is LSL + base = 0b10001011000 + assert 0 <= imm < 64 + self.write32((base << 21) | (rm << 16) | (imm << 10) | (rn << 5) | (rd)) + + def FMOV_dd(self, rd, rn): + base = 0b0001111001100000010000 + self.write32((base << 10) | (rn << 5) | rd) + + def FMOV_dr(self, rd, rn): + base = 0b1001111001100111000000 + self.write32((base << 10) | (rn << 5) | rd) + + def FADD_dd(self, rd, rn, rm): + base = 0b00011110011 + self.write32((base << 21) | (rm << 16) | (0b001010 << 10) | (rn << 5) | rd) + + def FSUB_dd(self, rd, rn, rm): + base = 0b00011110011 + self.write32((base << 21) | (rm << 16) | (0b001110 << 10) | (rn << 5) | rd) + + def FMUL_dd(self, rd, rn, rm): + base = 0b00011110011 + self.write32((base << 21) | (rm << 16) | (0b000010 << 10) | (rn << 5) | rd) + + def FDIV_dd(self, rd, rn, rm): + base = 0b00011110011 + self.write32((base << 21) | (rm << 16) | (0b000110 << 10) | (rn << 5) | rd) + + def FCMP_dd(self, rn, rm): + base = 0b00011110011 + self.write32((base << 21) | (rm << 16) | (0b001000 << 10) | (rn << 5)) + + def FNEG_d(self, rd, rn): + base = 0b0001111001100001010000 + self.write32((base << 10) | (rn << 5) | rd) + + def FABS_d(self, rd, rn): + base = 0b0001111001100000110000 + self.write32((base << 10) | (rn << 5) | rd) + + def FCVTZS_d(self, rd, rn): + base = 0b1001111001111000 + self.write32((base << 16) | (rn << 5) | rd) + + def SCVTF_r(self, rd, rn): + base = 0b1001111001100010 + self.write32((base << 16) | (rn << 5) | rd) + + def SXTB_rr(self, rd, rn): + base = 0b1001001101000000000111 + self.write32((base << 10) | (rn << 5) | rd) + + def SXTH_rr(self, rd, rn): + base = 0b1001001101000000001111 + self.write32((base << 10) | (rn << 5) | rd) + + def SXTW_rr(self, rd, rn): + base = 0b1001001101000000011111 + self.write32((base << 10) | (rn << 5) | rd) + + def FSQRT_dd(self, rd, rn): + base = 0b0001111001100001110000 + self.write32((base << 10) | (rn << 5) | rd) + + def SUB_rr(self, rd, rn, rm, s=0): + base = 0b11001011001 | (s << 8) + self.write32((base << 21) | (rm << 16) | (0b11 << 13) | (rn << 5) | (rd)) + + def SUB_rr_shifted(self, rd, rn, rm, shift=0): + base = 0b11001011000 + assert shift == 0 + self.write32((base << 21) | (rm << 16) | (rn << 5) | rd) + + def MUL_rr(self, rd, rn, rm): + base = 0b10011011000 + self.write32((base << 21) | (rm << 16) | (0b11111 << 10) | (rn << 5) | rd) + + def UMULH_rr(self, rd, rn, rm): + base = 0b10011011110 + self.write32((base << 21) | (rm << 16) | (0b11111 << 10) | (rn << 5) | rd) + + def AND_rr(self, rd, rn, rm): + base = 0b10001010000 + self.write32((base << 21) | (rm << 16) | (rn << 5) | rd) + + def AND_rr_shift(self, rd, rn, rm, shift, shifttype=0): + base = 0b10001010 + assert 0 <= shift < 64 + self.write32((base << 24) | (shifttype << 22) | (rm << 16) | (shift << 10) | (rn << 5) | rd) + + def AND_ri(self, rd, rn, immed): + assert immed == 0xFF # just one value for now, don't feel like + # understanding IMMR/IMMS quite yet + base = 0b1001001001 + immr = 0b000000 + imms = 0b000111 + self.write32((base << 22) | (immr << 16) | (imms << 10) | (rn << 5) | rd) + + def LSL_rr(self, rd, rn, rm): + base = 0b10011010110 + self.write32((base << 21) | (rm << 16) | (0b001000 << 10) | (rn << 5) | rd) + + def LSL_ri(self, rd, rn, shift): + assert 0 <= shift <= 63 + immr = 64 - shift + imms = immr - 1 + base = 0b1101001101 + self.write32((base << 22) | (immr << 16) | (imms << 10) | (rn << 5) | rd) + + def ASR_rr(self, rd, rn, rm): + base = 0b10011010110 + self.write32((base << 21) | (rm << 16) | (0b001010 << 10) | (rn << 5) | rd) + + def ASR_ri(self, rd, rn, shift): + assert 0 <= shift <= 63 + imms = 0b111111 + immr = shift + base = 0b1001001101 + self.write32((base << 22) | (immr << 16) | (imms << 10) | (rn << 5) | rd) + + def LSR_ri(self, rd, rn, shift): + assert 0 <= shift <= 63 + imms = 0b111111 + immr = shift + base = 0b1101001101 + self.write32((base << 22) | (immr << 16) | (imms << 10) | (rn << 5) | rd) + + def LSR_rr(self, rd, rn, rm): + base = 0b10011010110 + self.write32((base << 21) | (rm << 16) | (0b001001 << 10) | (rn << 5) | rd) + + def EOR_rr(self, rd, rn, rm): + base = 0b11001010000 + self.write32((base << 21) | (rm << 16) | (rn << 5) | rd) + + def MVN_rr(self, rd, rm): # defaults to xzr + base = 0b10101010001 + self.write32((base << 21) | (rm << 16) | (0b11111 << 5)| rd) + + def MVN_rr_shifted(self, rd, rm, shift=0, shifttype=0): # defaults to LSL + base = 0b10101010 + assert 0 <= shift < 64 + self.write32((base << 24) | (shifttype << 22) | (1 << 21) | + (rm << 16) | (shift << 10) | (0b11111 << 5) | rd) + + def SMULL_rr(self, rd, rn, rm): + base = 0b10011011001 + self.write32((base << 21) | (rm << 16) | (0b11111 << 10) | (rn << 5) | rd) + + def SMULH_rr(self, rd, rn, rm): + base = 0b10011011010 + self.write32((base << 21) | (rm << 16) | (0b11111 << 10) | (rn << 5) | rd) + + def CMP_rr(self, rn, rm): + base = 0b11101011000 + self.write32((base << 21) | (rm << 16) | (rn << 5) | 0b11111) + + def CMP_rr_shifted(self, rn, rm, imm): + base = 0b11101011100 + assert 0 <= imm <= 63 + self.write32((base << 21) | (rm << 16) | (imm << 10) | (rn << 5) | 0b11111) + + def CMP_ri(self, rn, imm): + base = 0b1111000100 + assert 0 <= imm <= 4095 + self.write32((base << 22) | (imm << 10) | (rn << 5) | 0b11111) + + def CMP_wi(self, rn, imm): + base = 0b0111000100 + assert 0 <= imm <= 4095 + self.write32((base << 22) | (imm << 10) | (rn << 5) | 0b11111) + + def CSET_r_flag(self, rd, cond): + base = 0b10011010100 + self.write32((base << 21) | (0b11111 << 16) | (cond << 12) | (1 << 10) | + (0b11111 << 5) | rd) + + def TST_rr_shift(self, rn, rm, shift): + assert 0 <= shift <= 64 + base = 0b11101010000 + self.write32((base << 21) | (rm << 16) | (shift << 10) | (rn << 5) | 0b11111) + + def STLR(self, rt, rn): + base = 0b11001000100 + self.write32((base << 21) | (0b11111 << 16) | (0b111111 << 10) | (rn << 5) | rt) + + def LDXR(self, rt, rn): + base = 0b1100100001011111011111 + self.write32((base << 10) | (rn << 5) | rt) + + def STXR(self, rs, rt, rn): + base = 0b11001000000 + self.write32((base << 21) | (rs << 16) | (0b011111 << 10) | (rn << 5) | rt) + + #def LDAXR(self, rt, rn): + # don't use any more + # base = 0b1100100001011111111111 + # self.write32((base << 10) | (rn << 5) | rt) + + def STLXR(self, rs, rt, rn): + base = 0b11001000000 + self.write32((base << 21) | (rs << 16) | (0b111111 << 10) | (rn << 5) | rt) + + def NOP(self): + self.write32(0b11010101000000110010000000011111) + + def B_ofs(self, ofs): + base = 0b000101 + assert ofs & 0x3 == 0 + assert -(1 << (26 + 2)) <= ofs < 1<<(26 + 2) + if ofs < 0: + ofs = (1 << 26) - (-ofs >> 2) + else: + ofs = ofs >> 2 + self.write32((base << 26) | ofs) + + def B_ofs_cond(self, ofs, cond): + base = 0b01010100 + assert ofs & 0x3 == 0 + assert -1 << 21 <= ofs < 1 << 21 + imm = ofs >> 2 + assert imm > 0 # we seem not to need the - jump + self.write32((base << 24) | (imm << 5) | cond) + + def CBNZ(self, rt, ofs): + base = 0b10110101 + assert -1 << 21 <= ofs < 1 << 21 + imm = ofs >> 2 + imm &= (1 << 19) - 1 + self.write32((base << 24) | (imm << 5) | rt) + + def CBNZ_w(self, rt, ofs): + # checks the 'w' part of the register (32 bits) + base = 0b00110101 + assert -1 << 21 <= ofs < 1 << 21 + imm = ofs >> 2 + imm &= (1 << 19) - 1 + self.write32((base << 24) | (imm << 5) | rt) + + def CBZ(self, rt, ofs): + base = 0b10110100 + assert -1 << 21 <= ofs < 1 << 21 + imm = ofs >> 2 + imm &= (1 << 19) - 1 + self.write32((base << 24) | (imm << 5) | rt) + + def B(self, target): + target = rffi.cast(lltype.Signed, target) + self.gen_load_int_full(r.ip0.value, target) + self.BR_r(r.ip0.value) + + def BL(self, target): + # XXX use the IMM version if close enough + target = rffi.cast(lltype.Signed, target) + self.gen_load_int_full(r.ip0.value, target) + self.BLR_r(r.ip0.value) + + def BLR_r(self, reg): + base = 0b1101011000111111000000 + self.write32((base << 10) | (reg << 5)) + + def BR_r(self, reg): + base = 0b1101011000011111000000 + self.write32((base << 10) | (reg << 5)) + + def BRK(self): + self.write32(0b11010100001 << 21) + + def DMB_ISH(self): + self.write32(0xd5033bbf) # from gcc + + def gen_load_int_full(self, r, value): + self.MOVZ_r_u16(r, value & 0xFFFF, 0) + self.MOVK_r_u16(r, (value >> 16) & 0xFFFF, 16) + self.MOVK_r_u16(r, (value >> 32) & 0xFFFF, 32) + self.MOVK_r_u16(r, (value >> 48) & 0xFFFF, 48) + + def gen_load_int(self, r, value): + """r is the register number, value is the value to be loaded to the + register""" + # XXX optimize! + if value < 0: + if value < -65536: + self.gen_load_int_full(r, value) + else: + self.MOVN_r_u16(r, ~value) + return + self.MOVZ_r_u16(r, value & 0xFFFF, 0) + value = value >> 16 + shift = 16 + while value: + self.MOVK_r_u16(r, value & 0xFFFF, shift) + shift += 16 + value >>= 16 + + def get_max_size_of_gen_load_int(self): + return 4 + + # ------------------------------------------- + + +class OverwritingBuilder(AbstractAarch64Builder): + def __init__(self, cb, start, size): + AbstractAarch64Builder.__init__(self) + self.cb = cb + self.index = start + self.start = start + self.end = start + size + + def currpos(self): + return self.index + + def writechar(self, char): + assert self.index <= self.end + self.cb.overwrite(self.index, char) + self.index += 1 + + +class InstrBuilder(BlockBuilderMixin, AbstractAarch64Builder): + + def __init__(self, arch_version=7): + AbstractAarch64Builder.__init__(self) + self.init_block_builder() + # + # ResOperation --> offset in the assembly. + # ops_offset[None] represents the beginning of the code after the last op + # (i.e., the tail of the loop) + self.ops_offset = {} + + def mark_op(self, op): + pos = self.get_relative_pos() + self.ops_offset[op] = pos + + def _dump_trace(self, addr, name, formatter=-1): + if not we_are_translated(): + if formatter != -1: + name = name % formatter + dir = udir.ensure('asm', dir=True) + f = dir.join(name).open('wb') + data = rffi.cast(rffi.CCHARP, addr) + for i in range(self.currpos()): + f.write(data[i]) + f.close() + + def clear_cache(self, addr): + if we_are_translated(): + startaddr = rffi.cast(llmemory.Address, addr) + endaddr = rffi.cast(llmemory.Address, + addr + self.get_relative_pos()) + clear_cache(startaddr, endaddr) + + def copy_to_raw_memory(self, addr): + self._copy_to_raw_memory(addr) + self.clear_cache(addr) + self._dump(addr, "jit-backend-dump", 'arm') + + def currpos(self): + return self.get_relative_pos() diff -Nru pypy-7.1.1+dfsg/rpython/jit/backend/aarch64/jump.py pypy-7.3.1+dfsg/rpython/jit/backend/aarch64/jump.py --- pypy-7.1.1+dfsg/rpython/jit/backend/aarch64/jump.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/backend/aarch64/jump.py 2020-04-10 19:28:41.000000000 +0000 @@ -0,0 +1,113 @@ + +from rpython.jit.backend.aarch64 import registers as r + +def remap_frame_layout(assembler, src_locations, dst_locations, tmpreg): + pending_dests = len(dst_locations) + srccount = {} # maps dst_locations to how many times the same + # location appears in src_locations + for dst in dst_locations: + key = dst.as_key() + assert key not in srccount, "duplicate value in dst_locations!" + srccount[key] = 0 + for i in range(len(dst_locations)): + src = src_locations[i] + if src.is_imm(): + continue + key = src.as_key() + if key in srccount: + if key == dst_locations[i].as_key(): + # ignore a move "x = x" + # setting any "large enough" negative value is ok, but + # be careful of overflows, don't use -sys.maxint + srccount[key] = -len(dst_locations) - 1 + pending_dests -= 1 + else: + srccount[key] += 1 + + while pending_dests > 0: + progress = False + for i in range(len(dst_locations)): + dst = dst_locations[i] + key = dst.as_key() + if srccount[key] == 0: + srccount[key] = -1 # means "it's done" + pending_dests -= 1 + src = src_locations[i] + if not src.is_imm(): + key = src.as_key() + if key in srccount: + srccount[key] -= 1 + _move(assembler, src, dst, tmpreg) + progress = True + if not progress: + # we are left with only pure disjoint cycles + sources = {} # maps dst_locations to src_locations + for i in range(len(dst_locations)): + src = src_locations[i] + dst = dst_locations[i] + sources[dst.as_key()] = src + # + for i in range(len(dst_locations)): + dst = dst_locations[i] + originalkey = dst.as_key() + if srccount[originalkey] >= 0: + assembler.push_locations([dst]) + while True: + key = dst.as_key() + assert srccount[key] == 1 + # ^^^ because we are in a simple cycle + srccount[key] = -1 + pending_dests -= 1 + src = sources[key] + if src.as_key() == originalkey: + break + _move(assembler, src, dst, tmpreg) + dst = src + assembler.pop_locations([dst]) + assert pending_dests == 0 + + +def _move(assembler, src, dst, tmpreg): + if dst.is_stack() and src.is_stack(): + assembler.regalloc_mov(src, tmpreg) + src = tmpreg + assembler.regalloc_mov(src, dst) + + +def remap_frame_layout_mixed(assembler, + src_locations1, dst_locations1, tmpreg1, + src_locations2, dst_locations2, tmpreg2): + # find and push the xmm stack locations from src_locations2 that + # are going to be overwritten by dst_locations1 + extrapushes = [] + extrapops = [] + dst_keys = {} + for loc in dst_locations1: + dst_keys[loc.as_key()] = None + src_locations2red = [] + dst_locations2red = [] + for i in range(len(src_locations2)): + loc = src_locations2[i] + dstloc = dst_locations2[i] + if loc.is_stack(): + key = loc.as_key() + if key in dst_keys: + extrapushes.append(loc) + extrapops.append(dstloc) + continue + src_locations2red.append(loc) + dst_locations2red.append(dstloc) + src_locations2 = src_locations2red + dst_locations2 = dst_locations2red + + assembler.push_locations(extrapushes) + + # + # remap the integer and pointer registers and stack locations + remap_frame_layout(assembler, src_locations1, dst_locations1, tmpreg1) + # + # remap the vfp registers and stack locations + remap_frame_layout(assembler, src_locations2, dst_locations2, tmpreg2) + # + # finally, pop the extra xmm stack locations + assembler.pop_locations(extrapops) diff -Nru pypy-7.1.1+dfsg/rpython/jit/backend/aarch64/locations.py pypy-7.3.1+dfsg/rpython/jit/backend/aarch64/locations.py --- pypy-7.1.1+dfsg/rpython/jit/backend/aarch64/locations.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/backend/aarch64/locations.py 2020-04-10 19:28:41.000000000 +0000 @@ -0,0 +1,158 @@ + +from rpython.rlib.rarithmetic import r_int32 +from rpython.jit.backend.aarch64.arch import WORD, JITFRAME_FIXED_SIZE +from rpython.jit.metainterp.history import INT, FLOAT + +class AssemblerLocation(object): + _immutable_ = True + type = INT + + def is_imm(self): + return False + + def is_stack(self): + return False + + def is_raw_sp(self): + return False + + def is_core_reg(self): + return False + + def is_vfp_reg(self): + return False + + def is_imm_float(self): + return False + + def is_float(self): + return False + + def as_key(self): + raise NotImplementedError + + def get_position(self): + raise NotImplementedError # only for stack + +class RegisterLocation(AssemblerLocation): + _immutable_ = True + + def __init__(self, value): + self.value = value + + def __repr__(self): + return 'x%d' % self.value + + def is_core_reg(self): + return True + + def as_key(self): # 0 <= as_key <= 30, 31 being zero register + return self.value + +class VFPRegisterLocation(RegisterLocation): + _immutable_ = True + type = FLOAT + + def __repr__(self): + return 'vfp(d%d)' % self.value + + def is_core_reg(self): + return False + + def is_vfp_reg(self): + return True + + def as_key(self): # 40 <= as_key <= 71 + return self.value + 40 + + def is_float(self): + return True + +class ImmLocation(AssemblerLocation): + _immutable_ = True + + def __init__(self, value): + assert not isinstance(value, r_int32) + self.value = value + + def getint(self): + return self.value + + def __repr__(self): + return "imm(%d)" % (self.value) + + def is_imm(self): + return True + +class StackLocation(AssemblerLocation): + _immutable_ = True + + def __init__(self, position, fp_offset, type=INT): + self.position = position + self.value = fp_offset + self.type = type + + def __repr__(self): + return 'FP(%s)+%d' % (self.type, self.position,) + + def location_code(self): + return 'b' + + def get_position(self): + return self.position + + def assembler(self): + return repr(self) + + def is_stack(self): + return True + + def as_key(self): # an aligned word + 10000 + return self.position + 10000 + + def is_float(self): + return self.type == FLOAT + + +class ConstFloatLoc(AssemblerLocation): + """This class represents an imm float value which is stored in memory at + the address stored in the field value""" + _immutable_ = True + type = FLOAT + + def __init__(self, value): + self.value = value + + def getint(self): + return self.value + + def __repr__(self): + return "imm_float(stored at %d)" % (self.value) + + def is_imm_float(self): + return True + + def as_key(self): # a real address + 1 + return self.value | 1 + + def is_float(self): + return True + + +class ZeroRegister(AssemblerLocation): + _immutable_ = True + + def __init__(self): + self.value = 31 + + def __repr__(self): + return "xzr" + + def as_key(self): + raise ValueError("should never make it to jump") + +def imm(i): + return ImmLocation(i) + +def get_fp_offset(base_ofs, position): + return base_ofs + WORD * (position + JITFRAME_FIXED_SIZE) diff -Nru pypy-7.1.1+dfsg/rpython/jit/backend/aarch64/opassembler.py pypy-7.3.1+dfsg/rpython/jit/backend/aarch64/opassembler.py --- pypy-7.1.1+dfsg/rpython/jit/backend/aarch64/opassembler.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/backend/aarch64/opassembler.py 2020-04-10 19:28:41.000000000 +0000 @@ -0,0 +1,1218 @@ + +from rpython.rlib.objectmodel import we_are_translated +from rpython.rlib.rarithmetic import r_uint +from rpython.rtyper.lltypesystem import rffi, lltype +from rpython.rtyper import rclass +from rpython.jit.metainterp.history import (AbstractFailDescr, ConstInt, + INT, FLOAT, REF, VOID) +from rpython.jit.backend.aarch64 import registers as r +from rpython.jit.backend.aarch64.codebuilder import OverwritingBuilder +from rpython.jit.backend.aarch64.callbuilder import Aarch64CallBuilder +from rpython.jit.backend.arm import conditions as c, shift +from rpython.jit.backend.aarch64.regalloc import check_imm_arg +from rpython.jit.backend.aarch64.arch import JITFRAME_FIXED_SIZE, WORD +from rpython.jit.backend.aarch64 import locations +from rpython.jit.backend.llsupport.assembler import GuardToken, BaseAssembler +from rpython.jit.backend.llsupport.gcmap import allocate_gcmap +from rpython.jit.backend.llsupport.regalloc import get_scale +from rpython.jit.metainterp.history import TargetToken +from rpython.jit.metainterp.resoperation import rop + +def gen_comp_op(name, flag): + def emit_op(self, op, arglocs): + l0, l1, res = arglocs + + self.emit_int_comp_op(op, l0, l1) + self.mc.CSET_r_flag(res.value, c.get_opposite_of(flag)) + emit_op.__name__ = name + return emit_op + +def gen_float_comp_op(name, flag): + def emit_op(self, op, arglocs): + l0, l1, res = arglocs + self.emit_float_comp_op(op, l0, l1) + self.mc.CSET_r_flag(res.value, c.get_opposite_of(flag)) + emit_op.__name__ = name + return emit_op + +def gen_float_comp_op_cc(name, flag): + def emit_op(self, op, arglocs): + l0, l1 = arglocs + self.emit_float_comp_op(op, l0, l1) + return flag + emit_op.__name__ = name + return emit_op + +class ResOpAssembler(BaseAssembler): + def imm(self, v): + return locations.imm(v) + + def int_sub_impl(self, op, arglocs, flags=0): + l0, l1, res = arglocs + if flags: + s = 1 + else: + s = 0 + if l1.is_imm(): + value = l1.getint() + assert value >= 0 + self.mc.SUB_ri(res.value, l0.value, value, s) + else: + self.mc.SUB_rr(res.value, l0.value, l1.value, s) + + def emit_op_int_sub(self, op, arglocs): + self.int_sub_impl(op, arglocs) + + def int_add_impl(self, op, arglocs, ovfcheck=False): + l0, l1, res = arglocs + assert not l0.is_imm() + if ovfcheck: + s = 1 + else: + s = 0 + if l1.is_imm(): + self.mc.ADD_ri(res.value, l0.value, l1.value, s) + else: + self.mc.ADD_rr(res.value, l0.value, l1.value, s) + + def emit_op_int_add(self, op, arglocs): + self.int_add_impl(op, arglocs) + emit_op_nursery_ptr_increment = emit_op_int_add + + def emit_comp_op_int_add_ovf(self, op, arglocs): + self.int_add_impl(op, arglocs, True) + return 0 + + def emit_comp_op_int_sub_ovf(self, op, arglocs): + self.int_sub_impl(op, arglocs, True) + return 0 + + def emit_op_int_mul(self, op, arglocs): + reg1, reg2, res = arglocs + self.mc.MUL_rr(res.value, reg1.value, reg2.value) + + def emit_comp_op_int_mul_ovf(self, op, arglocs): + reg1, reg2, res = arglocs + self.mc.SMULH_rr(r.ip0.value, reg1.value, reg2.value) + self.mc.MUL_rr(res.value, reg1.value, reg2.value) + self.mc.CMP_rr_shifted(r.ip0.value, res.value, 63) + return 0 + + def emit_op_int_and(self, op, arglocs): + l0, l1, res = arglocs + self.mc.AND_rr(res.value, l0.value, l1.value) + + def emit_op_int_or(self, op, arglocs): + l0, l1, res = arglocs + self.mc.ORR_rr(res.value, l0.value, l1.value) + + def emit_op_int_xor(self, op, arglocs): + l0, l1, res = arglocs + self.mc.EOR_rr(res.value, l0.value, l1.value) + + def emit_op_int_lshift(self, op, arglocs): + l0, l1, res = arglocs + self.mc.LSL_rr(res.value, l0.value, l1.value) + + def emit_op_int_rshift(self, op, arglocs): + l0, l1, res = arglocs + self.mc.ASR_rr(res.value, l0.value, l1.value) + + def emit_op_uint_rshift(self, op, arglocs): + l0, l1, res = arglocs + self.mc.LSR_rr(res.value, l0.value, l1.value) + + def emit_op_uint_mul_high(self, op, arglocs): + l0, l1, res = arglocs + self.mc.UMULH_rr(res.value, l0.value, l1.value) + + def emit_int_comp_op(self, op, l0, l1): + if l1.is_imm(): + self.mc.CMP_ri(l0.value, l1.getint()) + else: + self.mc.CMP_rr(l0.value, l1.value) + + def emit_float_comp_op(self, op, l0, l1): + self.mc.FCMP_dd(l0.value, l1.value) + + emit_comp_op_float_lt = gen_float_comp_op_cc('float_lt', c.VFP_LT) + emit_comp_op_float_le = gen_float_comp_op_cc('float_le', c.VFP_LE) + emit_comp_op_float_eq = gen_float_comp_op_cc('float_eq', c.EQ) + emit_comp_op_float_ne = gen_float_comp_op_cc('float_ne', c.NE) + emit_comp_op_float_gt = gen_float_comp_op_cc('float_gt', c.GT) + emit_comp_op_float_ge = gen_float_comp_op_cc('float_ge', c.GE) + + def emit_comp_op_int_lt(self, op, arglocs): + self.emit_int_comp_op(op, arglocs[0], arglocs[1]) + return c.LT + + def emit_comp_op_int_le(self, op, arglocs): + self.emit_int_comp_op(op, arglocs[0], arglocs[1]) + return c.LE + + def emit_comp_op_int_gt(self, op, arglocs): + self.emit_int_comp_op(op, arglocs[0], arglocs[1]) + return c.GT + + def emit_comp_op_int_ge(self, op, arglocs): + self.emit_int_comp_op(op, arglocs[0], arglocs[1]) + return c.GE + + def emit_comp_op_int_eq(self, op, arglocs): + self.emit_int_comp_op(op, arglocs[0], arglocs[1]) + return c.EQ + + emit_comp_op_ptr_eq = emit_comp_op_instance_ptr_eq = emit_comp_op_int_eq + + def emit_comp_op_int_ne(self, op, arglocs): + self.emit_int_comp_op(op, arglocs[0], arglocs[1]) + return c.NE + + emit_comp_op_ptr_ne = emit_comp_op_instance_ptr_ne = emit_comp_op_int_ne + + def emit_comp_op_uint_lt(self, op, arglocs): + self.emit_int_comp_op(op, arglocs[0], arglocs[1]) + return c.LO + + def emit_comp_op_uint_le(self, op, arglocs): + self.emit_int_comp_op(op, arglocs[0], arglocs[1]) + return c.LS + + def emit_comp_op_uint_gt(self, op, arglocs): + self.emit_int_comp_op(op, arglocs[0], arglocs[1]) + return c.HI + + def emit_comp_op_uint_ge(self, op, arglocs): + self.emit_int_comp_op(op, arglocs[0], arglocs[1]) + return c.HS + + emit_op_int_lt = gen_comp_op('emit_op_int_lt', c.LT) + emit_op_int_le = gen_comp_op('emit_op_int_le', c.LE) + emit_op_int_gt = gen_comp_op('emit_op_int_gt', c.GT) + emit_op_int_ge = gen_comp_op('emit_op_int_ge', c.GE) + emit_op_int_eq = gen_comp_op('emit_op_int_eq', c.EQ) + emit_op_int_ne = gen_comp_op('emit_op_int_ne', c.NE) + + emit_op_uint_lt = gen_comp_op('emit_op_uint_lt', c.LO) + emit_op_uint_gt = gen_comp_op('emit_op_uint_gt', c.HI) + emit_op_uint_le = gen_comp_op('emit_op_uint_le', c.LS) + emit_op_uint_ge = gen_comp_op('emit_op_uint_ge', c.HS) + + emit_op_ptr_eq = emit_op_instance_ptr_eq = emit_op_int_eq + emit_op_ptr_ne = emit_op_instance_ptr_ne = emit_op_int_ne + + def emit_op_int_is_true(self, op, arglocs): + reg, res = arglocs + + self.mc.CMP_ri(reg.value, 0) + self.mc.CSET_r_flag(res.value, c.EQ) + + def emit_comp_op_int_is_true(self, op, arglocs): + self.mc.CMP_ri(arglocs[0].value, 0) + return c.NE + + def emit_op_int_is_zero(self, op, arglocs): + reg, res = arglocs + + self.mc.CMP_ri(reg.value, 0) + self.mc.CSET_r_flag(res.value, c.NE) + + def emit_comp_op_int_is_zero(self, op, arglocs): + self.mc.CMP_ri(arglocs[0].value, 0) + return c.EQ + + def emit_op_int_neg(self, op, arglocs): + reg, res = arglocs + self.mc.SUB_rr_shifted(res.value, r.xzr.value, reg.value) + + def emit_op_int_invert(self, op, arglocs): + reg, res = arglocs + self.mc.MVN_rr(res.value, reg.value) + + def emit_op_int_force_ge_zero(self, op, arglocs): + arg, res = arglocs + self.mc.MOVZ_r_u16(res.value, 0, 0) + self.mc.CMP_ri(arg.value, 0) + self.mc.B_ofs_cond(8, c.LT) # jump over the next instruction + self.mc.MOV_rr(res.value, arg.value) + # jump here + + def emit_op_int_signext(self, op, arglocs): + arg, numbytes, res = arglocs + assert numbytes.is_imm() + if numbytes.value == 1: + self.mc.SXTB_rr(res.value, arg.value) + elif numbytes.value == 2: + self.mc.SXTH_rr(res.value, arg.value) + elif numbytes.value == 4: + self.mc.SXTW_rr(res.value, arg.value) + else: + raise AssertionError("bad number of bytes") + + def emit_op_increment_debug_counter(self, op, arglocs): + base_loc, value_loc = arglocs + self.mc.LDR_ri(value_loc.value, base_loc.value, 0) + self.mc.ADD_ri(value_loc.value, value_loc.value, 1) + self.mc.STR_ri(value_loc.value, base_loc.value, 0) + + def emit_op_check_memory_error(self, op, arglocs): + self.propagate_memoryerror_if_reg_is_null(arglocs[0]) + + def _genop_same_as(self, op, arglocs): + argloc, resloc = arglocs + if argloc is not resloc: + self.mov_loc_loc(argloc, resloc) + + emit_op_same_as_i = _genop_same_as + emit_op_same_as_r = _genop_same_as + emit_op_same_as_f = _genop_same_as + emit_op_cast_ptr_to_int = _genop_same_as + emit_op_cast_int_to_ptr = _genop_same_as + + def emit_op_float_add(self, op, arglocs): + arg1, arg2, res = arglocs + self.mc.FADD_dd(res.value, arg1.value, arg2.value) + + def emit_op_float_sub(self, op, arglocs): + arg1, arg2, res = arglocs + self.mc.FSUB_dd(res.value, arg1.value, arg2.value) + + def emit_op_float_mul(self, op, arglocs): + arg1, arg2, res = arglocs + self.mc.FMUL_dd(res.value, arg1.value, arg2.value) + + def emit_op_float_truediv(self, op, arglocs): + arg1, arg2, res = arglocs + self.mc.FDIV_dd(res.value, arg1.value, arg2.value) + + def emit_op_convert_float_bytes_to_longlong(self, op, arglocs): + arg, res = arglocs + self.mc.UMOV_rd(res.value, arg.value) + + def emit_op_convert_longlong_bytes_to_float(self, op, arglocs): + arg, res = arglocs + self.mc.INS_dr(res.value, arg.value) + + def math_sqrt(self, op, arglocs): + arg, res = arglocs + self.mc.FSQRT_dd(res.value, arg.value) + + def threadlocalref_get(self, op, arglocs): + res_loc, = arglocs + ofs_loc = self.imm(op.getarg(1).getint()) + calldescr = op.getdescr() + ofs = self.saved_threadlocal_addr + self.load_reg(self.mc, res_loc, r.sp, ofs) + scale = get_scale(calldescr.get_result_size()) + signed = (calldescr.is_result_signed() != 0) + self._load_from_mem(res_loc, res_loc, ofs_loc, scale, signed) + + emit_op_float_lt = gen_float_comp_op('float_lt', c.VFP_LT) + emit_op_float_le = gen_float_comp_op('float_le', c.VFP_LE) + emit_op_float_eq = gen_float_comp_op('float_eq', c.EQ) + emit_op_float_ne = gen_float_comp_op('float_ne', c.NE) + emit_op_float_gt = gen_float_comp_op('float_gt', c.GT) + emit_op_float_ge = gen_float_comp_op('float_ge', c.GE) + + def emit_op_float_neg(self, op, arglocs): + arg, res = arglocs + self.mc.FNEG_d(res.value, arg.value) + + def emit_op_float_abs(self, op, arglocs): + arg, res = arglocs + self.mc.FABS_d(res.value, arg.value) + + def emit_op_cast_float_to_int(self, op, arglocs): + arg, res = arglocs + self.mc.FCVTZS_d(res.value, arg.value) + + def emit_op_cast_int_to_float(self, op, arglocs): + arg, res = arglocs + self.mc.SCVTF_r(res.value, arg.value) + + def emit_op_load_from_gc_table(self, op, arglocs): + res_loc, = arglocs + index = op.getarg(0).getint() + self.load_from_gc_table(res_loc.value, index) + + def emit_op_load_effective_address(self, op, arglocs): + self._gen_address(arglocs[4], arglocs[0], arglocs[1], arglocs[3].value, + arglocs[2].value) + + # result = base_loc + (scaled_loc << scale) + static_offset + def _gen_address(self, result, base_loc, scaled_loc, scale=0, static_offset=0): + assert scaled_loc.is_core_reg() + assert base_loc.is_core_reg() + if scale > 0: + self.mc.LSL_ri(r.ip0.value, scaled_loc.value, scale) + scaled_loc = r.ip0 + else: + scaled_loc = scaled_loc + self.mc.ADD_rr(result.value, base_loc.value, scaled_loc.value) + self.mc.ADD_ri(result.value, result.value, static_offset) + + def emit_op_debug_merge_point(self, op, arglocs): + pass + + emit_op_jit_debug = emit_op_debug_merge_point + emit_op_keepalive = emit_op_debug_merge_point + emit_op_enter_portal_frame = emit_op_debug_merge_point + emit_op_leave_portal_frame = emit_op_debug_merge_point + + + # -------------------------------- fields ------------------------------- + + def emit_op_gc_store(self, op, arglocs): + value_loc, base_loc, ofs_loc, size_loc = arglocs + scale = get_scale(size_loc.value) + self._write_to_mem(value_loc, base_loc, ofs_loc, scale) + + def _emit_op_gc_load(self, op, arglocs): + base_loc, ofs_loc, res_loc, nsize_loc = arglocs + nsize = nsize_loc.value + signed = (nsize < 0) + scale = get_scale(abs(nsize)) + self._load_from_mem(res_loc, base_loc, ofs_loc, scale, signed) + + emit_op_gc_load_i = _emit_op_gc_load + emit_op_gc_load_r = _emit_op_gc_load + emit_op_gc_load_f = _emit_op_gc_load + + def emit_op_gc_store_indexed(self, op, arglocs): + value_loc, base_loc, index_loc, size_loc, ofs_loc = arglocs + assert index_loc.is_core_reg() + # add the base offset + if ofs_loc.value > 0: + self.mc.ADD_ri(r.ip0.value, index_loc.value, ofs_loc.value) + index_loc = r.ip0 + scale = get_scale(size_loc.value) + self._write_to_mem(value_loc, base_loc, index_loc, scale) + + def _emit_op_gc_load_indexed(self, op, arglocs): + res_loc, base_loc, index_loc, nsize_loc, ofs_loc = arglocs + assert index_loc.is_core_reg() + nsize = nsize_loc.value + signed = (nsize < 0) + # add the base offset + if ofs_loc.value > 0: + self.mc.ADD_ri(r.ip0.value, index_loc.value, ofs_loc.value) + index_loc = r.ip0 + # + scale = get_scale(abs(nsize)) + self._load_from_mem(res_loc, base_loc, index_loc, scale, signed) + + emit_op_gc_load_indexed_i = _emit_op_gc_load_indexed + emit_op_gc_load_indexed_r = _emit_op_gc_load_indexed + emit_op_gc_load_indexed_f = _emit_op_gc_load_indexed + + def _write_to_mem(self, value_loc, base_loc, ofs_loc, scale): + # Write a value of size '1 << scale' at the address + # 'base_ofs + ofs_loc'. Note that 'scale' is not used to scale + # the offset! + assert base_loc.is_core_reg() + if scale == 3: + # WORD size + if value_loc.is_float(): + if ofs_loc.is_imm(): + self.mc.STR_di(value_loc.value, base_loc.value, + ofs_loc.value) + else: + self.mc.STR_dd(value_loc.value, base_loc.value, + ofs_loc.value) + return + if ofs_loc.is_imm(): + self.mc.STR_ri(value_loc.value, base_loc.value, + ofs_loc.value) + else: + self.mc.STR_size_rr(3, value_loc.value, base_loc.value, + ofs_loc.value) + else: + if ofs_loc.is_imm(): + self.mc.STR_size_ri(scale, value_loc.value, base_loc.value, + ofs_loc.value) + else: + self.mc.STR_size_rr(scale, value_loc.value, base_loc.value, + ofs_loc.value) + + def _load_from_mem(self, res_loc, base_loc, ofs_loc, scale, + signed=False): + # Load a value of '1 << scale' bytes, from the memory location + # 'base_loc + ofs_loc'. Note that 'scale' is not used to scale + # the offset! + # + if scale == 3: + # WORD + if res_loc.is_float(): + if ofs_loc.is_imm(): + self.mc.LDR_di(res_loc.value, base_loc.value, ofs_loc.value) + else: + self.mc.LDR_dr(res_loc.value, base_loc.value, ofs_loc.value) + return + if ofs_loc.is_imm(): + self.mc.LDR_ri(res_loc.value, base_loc.value, ofs_loc.value) + else: + self.mc.LDR_rr(res_loc.value, base_loc.value, ofs_loc.value) + return + if scale == 2: + # 32bit int + if not signed: + if ofs_loc.is_imm(): + self.mc.LDR_uint32_ri(res_loc.value, base_loc.value, + ofs_loc.value) + else: + self.mc.LDR_uint32_rr(res_loc.value, base_loc.value, + ofs_loc.value) + else: + if ofs_loc.is_imm(): + self.mc.LDRSW_ri(res_loc.value, base_loc.value, + ofs_loc.value) + else: + self.mc.LDRSW_rr(res_loc.value, base_loc.value, + ofs_loc.value) + return + if scale == 1: + # short + if not signed: + if ofs_loc.is_imm(): + self.mc.LDRH_ri(res_loc.value, base_loc.value, ofs_loc.value) + else: + self.mc.LDRH_rr(res_loc.value, base_loc.value, ofs_loc.value) + else: + if ofs_loc.is_imm(): + self.mc.LDRSH_ri(res_loc.value, base_loc.value, ofs_loc.value) + else: + self.mc.LDRSH_rr(res_loc.value, base_loc.value, ofs_loc.value) + return + assert scale == 0 + if not signed: + if ofs_loc.is_imm(): + self.mc.LDRB_ri(res_loc.value, base_loc.value, ofs_loc.value) + else: + self.mc.LDRB_rr(res_loc.value, base_loc.value, ofs_loc.value) + else: + if ofs_loc.is_imm(): + self.mc.LDRSB_ri(res_loc.value, base_loc.value, ofs_loc.value) + else: + self.mc.LDRSB_rr(res_loc.value, base_loc.value, ofs_loc.value) + + # -------------------------------- guard -------------------------------- + + def build_guard_token(self, op, frame_depth, arglocs, offset, fcond, + extra_offset=-1, extra_cond=-1): + descr = op.getdescr() + assert isinstance(descr, AbstractFailDescr) + + gcmap = allocate_gcmap(self, frame_depth, JITFRAME_FIXED_SIZE) + faildescrindex = self.get_gcref_from_faildescr(descr) + token = GuardToken(self.cpu, gcmap, descr, + failargs=op.getfailargs(), + fail_locs=arglocs, + guard_opnum=op.getopnum(), + frame_depth=frame_depth, + faildescrindex=faildescrindex) + token.fcond = fcond + token.extra_offset = extra_offset + token.extra_cond = extra_cond + return token + + def _emit_guard(self, op, fcond, arglocs, is_guard_not_invalidated=False, + extra_offset=-1, extra_cond=-1): + pos = self.mc.currpos() + token = self.build_guard_token(op, arglocs[0].value, arglocs[1:], pos, + fcond, extra_offset, extra_cond) + token.offset = pos + self.pending_guards.append(token) + assert token.guard_not_invalidated() == is_guard_not_invalidated + # For all guards that are not GUARD_NOT_INVALIDATED we emit a + # breakpoint to ensure the location is patched correctly. In the case + # of GUARD_NOT_INVALIDATED we use just a NOP, because it is only + # eventually patched at a later point. + if is_guard_not_invalidated: + self.mc.NOP() + else: + self.mc.BRK() + + def emit_guard_op_guard_true(self, op, guard_op, fcond, arglocs): + self._emit_guard(guard_op, fcond, arglocs) + emit_guard_op_guard_no_overflow = emit_guard_op_guard_true + + def emit_guard_op_guard_false(self, op, guard_op, fcond, arglocs): + self._emit_guard(guard_op, c.get_opposite_of(fcond), arglocs) + emit_guard_op_guard_overflow = emit_guard_op_guard_false + + def emit_op_guard_not_invalidated(self, op, arglocs): + self._emit_guard(op, 0, arglocs, True) + + def load_condition_into_cc(self, loc): + if not loc.is_core_reg(): + if loc.is_stack(): + self.regalloc_mov(loc, r.ip0) + else: + assert loc.is_imm() + self.mc.gen_load_int(r.ip0.value, loc.value) + loc = r.ip0 + self.mc.CMP_ri(loc.value, 0) + + def emit_op_guard_false(self, op, arglocs): + self.load_condition_into_cc(arglocs[0]) + self._emit_guard(op, c.EQ, arglocs[1:]) + emit_op_guard_isnull = emit_op_guard_false + + def emit_op_guard_true(self, op, arglocs): + self.load_condition_into_cc(arglocs[0]) + self._emit_guard(op, c.NE, arglocs[1:]) + emit_op_guard_nonnull = emit_op_guard_true + + def emit_op_guard_value(self, op, arglocs): + v0 = arglocs[0] + v1 = arglocs[1] + if v0.is_core_reg(): + if v1.is_core_reg(): + loc = v1 + elif v1.is_imm(): + self.mc.gen_load_int(r.ip0.value, v1.value) + loc = r.ip0 + else: + assert v1.is_stack() + self.mc.LDR_ri(r.ip0.value, r.fp.value, v1.value) + loc = r.ip0 + self.mc.CMP_rr(v0.value, loc.value) + else: + assert v0.is_vfp_reg() + if v1.is_vfp_reg(): + loc = v1 + else: + assert v1.is_stack() + loc = r.vfp_ip + self.mc.LDR_di(r.vfp_ip.value, r.fp.value, v1.value) + self.mc.FCMP_dd(v0.value, loc.value) + self._emit_guard(op, c.EQ, arglocs[2:]) + + def emit_op_guard_class(self, op, arglocs): + offset = self.cpu.vtable_offset + if offset is not None: + self.mc.LDR_ri(r.ip0.value, arglocs[0].value, offset) + self.mc.gen_load_int(r.ip1.value, arglocs[1].value) + self.mc.CMP_rr(r.ip0.value, r.ip1.value) + else: + expected_typeid = (self.cpu.gc_ll_descr + .get_typeid_from_classptr_if_gcremovetypeptr(arglocs[1].value)) + self._cmp_guard_gc_type(arglocs[0], expected_typeid) + self._emit_guard(op, c.EQ, arglocs[2:]) + + def _cmp_guard_gc_type(self, loc_ptr, expected_typeid): + # Note that the typeid half-word is at offset 0 on a little-endian + # machine; it would be at offset 2 or 4 on a big-endian machine. + assert self.cpu.supports_guard_gc_type + self.mc.LDR_uint32_ri(r.ip0.value, loc_ptr.value, 0) + self.mc.gen_load_int(r.ip1.value, expected_typeid) + self.mc.CMP_rr(r.ip0.value, r.ip1.value) + + def emit_op_guard_nonnull_class(self, op, arglocs): + offset = self.cpu.vtable_offset + if offset is not None: + # this is inefficient, but does not matter since translation + # is always with gcremovetypeptr + self.mc.MOVZ_r_u16(r.ip0.value, 1, 0) + self.mc.MOVZ_r_u16(r.ip1.value, 0, 0) + self.mc.CMP_ri(arglocs[0].value, 0) + self.mc.B_ofs_cond(4 * (4 + 2), c.EQ) + self.mc.LDR_ri(r.ip0.value, arglocs[0].value, offset) + self.mc.gen_load_int_full(r.ip1.value, arglocs[1].value) + self.mc.CMP_rr(r.ip0.value, r.ip1.value) + self._emit_guard(op, c.EQ, arglocs[2:]) + else: + self.mc.CMP_ri(arglocs[0].value, 0) + extra_offset = self.mc.currpos() + self.mc.BRK() + expected_typeid = (self.cpu.gc_ll_descr + .get_typeid_from_classptr_if_gcremovetypeptr(arglocs[1].value)) + self._cmp_guard_gc_type(arglocs[0], expected_typeid) + self._emit_guard(op, c.EQ, arglocs[2:], False, extra_offset, c.NE) + + def emit_op_guard_gc_type(self, op, arglocs): + self._cmp_guard_gc_type(arglocs[0], arglocs[1].value) + self._emit_guard(op, c.EQ, arglocs[2:]) + + def emit_op_guard_is_object(self, op, arglocs): + assert self.cpu.supports_guard_gc_type + loc_object = arglocs[0] + # idea: read the typeid, fetch one byte of the field 'infobits' from + # the big typeinfo table, and check the flag 'T_IS_RPYTHON_INSTANCE'. + self.mc.LDR_uint32_ri(r.ip0.value, loc_object.value, 0) + # + + base_type_info, shift_by, sizeof_ti = ( + self.cpu.gc_ll_descr.get_translated_info_for_typeinfo()) + infobits_offset, IS_OBJECT_FLAG = ( + self.cpu.gc_ll_descr.get_translated_info_for_guard_is_object()) + + self.mc.gen_load_int(r.ip1.value, base_type_info + infobits_offset) + if shift_by > 0: + self.mc.LSL_ri(r.ip0.value, r.ip0.value, shift_by) + self.mc.LDRB_rr(r.ip0.value, r.ip0.value, r.ip1.value) + self.mc.MOVZ_r_u16(r.ip1.value, IS_OBJECT_FLAG & 0xff, 0) + self.mc.TST_rr_shift(r.ip0.value, r.ip1.value, 0) + self._emit_guard(op, c.NE, arglocs[1:]) + + def emit_op_guard_subclass(self, op, arglocs): + assert self.cpu.supports_guard_gc_type + loc_object = arglocs[0] + loc_check_against_class = arglocs[1] + offset = self.cpu.vtable_offset + offset2 = self.cpu.subclassrange_min_offset + if offset is not None: + # read this field to get the vtable pointer + self.mc.LDR_ri(r.ip0.value, loc_object.value, offset) + # read the vtable's subclassrange_min field + self.mc.LDR_ri(r.ip0.value, r.ip0.value, offset2) + else: + # read the typeid + self.mc.LDR_uint32_ri(r.ip0.value, loc_object.value, 0) + # read the vtable's subclassrange_min field, as a single + # step with the correct offset + base_type_info, shift_by, sizeof_ti = ( + self.cpu.gc_ll_descr.get_translated_info_for_typeinfo()) + + self.mc.gen_load_int(r.ip1.value, + base_type_info + sizeof_ti + offset2) + if shift_by > 0: + self.mc.LSL_ri(r.ip0.value, r.ip0.value, shift_by) + self.mc.LDR_rr(r.ip0.value, r.ip0.value, r.ip1.value) + + # get the two bounds to check against + vtable_ptr = loc_check_against_class.getint() + vtable_ptr = rffi.cast(rclass.CLASSTYPE, vtable_ptr) + check_min = vtable_ptr.subclassrange_min + check_max = vtable_ptr.subclassrange_max + assert check_max > check_min + check_diff = check_max - check_min - 1 + # check by doing the unsigned comparison (tmp - min) < (max - min) + self.mc.gen_load_int(r.ip1.value, check_min) + self.mc.SUB_rr(r.ip0.value, r.ip0.value, r.ip1.value) + if check_diff <= 0xff: + self.mc.CMP_ri(r.ip0.value, check_diff) + else: + self.mc.gen_load_int(r.ip1.value, check_diff) + self.mc.CMP_rr(r.ip0.value, r.ip1.value) + # the guard passes if we get a result of "below or equal" + self._emit_guard(op, c.LS, arglocs[2:]) + + def emit_op_guard_exception(self, op, arglocs): + loc, resloc, pos_exc_value, pos_exception = arglocs[:4] + failargs = arglocs[4:] + self.mc.gen_load_int(r.ip1.value, pos_exception.value) + self.mc.LDR_ri(r.ip0.value, r.ip1.value, 0) + + self.mc.CMP_rr(r.ip0.value, loc.value) + self._emit_guard(op, c.EQ, failargs) + self._store_and_reset_exception(self.mc, resloc) + + def emit_op_guard_no_exception(self, op, arglocs): + loc = arglocs[0] + failargs = arglocs[1:] + self.mc.LDR_ri(loc.value, loc.value, 0) + self.mc.CMP_ri(loc.value, 0) + self._emit_guard(op, c.EQ, failargs) + # If the previous operation was a COND_CALL, overwrite its conditional + # jump to jump over this GUARD_NO_EXCEPTION as well, if we can + #if self._find_nearby_operation(-1).getopnum() == rop.COND_CALL: + # XXX + # jmp_adr, prev_cond = self.previous_cond_call_jcond + # pmc = OverwritingBuilder(self.mc, jmp_adr, WORD) + # pmc.B_offs(self.mc.currpos(), prev_cond) + + def emit_op_save_exc_class(self, op, arglocs): + resloc = arglocs[0] + self.mc.gen_load_int(r.ip0.value, self.cpu.pos_exception()) + self.load_reg(self.mc, resloc, r.ip0) + + def emit_op_save_exception(self, op, arglocs): + resloc = arglocs[0] + self._store_and_reset_exception(self.mc, resloc) + + def emit_op_restore_exception(self, op, arglocs): + self._restore_exception(self.mc, arglocs[1], arglocs[0]) + + def emit_op_cond_call_gc_wb(self, op, arglocs): + self._write_barrier_fastpath(self.mc, op.getdescr(), arglocs) + + def emit_op_cond_call_gc_wb_array(self, op, arglocs): + self._write_barrier_fastpath(self.mc, op.getdescr(), arglocs, + array=True) + + #from ../x86/regalloc.py:1388 + def emit_op_zero_array(self, op, arglocs): + from rpython.jit.backend.llsupport.descr import unpack_arraydescr + assert len(arglocs) == 0 + size_box = op.getarg(2) + if isinstance(size_box, ConstInt) and size_box.getint() == 0: + return + itemsize, baseofs, _ = unpack_arraydescr(op.getdescr()) + args = op.getarglist() + # + # ZERO_ARRAY(base_loc, start, size, 1, 1) + # 'start' and 'size' are both expressed in bytes, + # and the two scaling arguments should always be ConstInt(1) on ARM. + assert args[3].getint() == 1 + assert args[4].getint() == 1 + # + base_loc = self._regalloc.rm.make_sure_var_in_reg(args[0], args) + startbyte_box = args[1] + if isinstance(startbyte_box, ConstInt): + startbyte_loc = None + startbyte = startbyte_box.getint() + assert startbyte >= 0 + else: + startbyte_loc = self._regalloc.rm.make_sure_var_in_reg(startbyte_box, + args) + startbyte = -1 + + # base_loc and startbyte_loc are in two regs here (or startbyte_loc + # is an immediate). Compute the dstaddr_loc, which is the raw + # address that we will pass as first argument to memset(). + # It can be in the same register as either one, but not in + # args[2], because we're still needing the latter. + dstaddr_loc = r.ip1 + if startbyte >= 0: # a constant + ofs = baseofs + startbyte + reg = base_loc.value + else: + self.mc.ADD_rr(dstaddr_loc.value, + base_loc.value, startbyte_loc.value) + ofs = baseofs + reg = dstaddr_loc.value + if check_imm_arg(ofs): + self.mc.ADD_ri(dstaddr_loc.value, reg, ofs) + else: + self.mc.gen_load_int(r.ip0.value, ofs) + self.mc.ADD_rr(dstaddr_loc.value, reg, r.ip0.value) + + # We use STRB, STRH, STRW or STR based on whether we know the array + # item size is a multiple of 1, 2 or 4. + if itemsize & 1: itemsize = 1 + elif itemsize & 2: itemsize = 2 + elif itemsize & 4: itemsize = 4 + else: itemsize = 8 + limit = itemsize + next_group = -1 + if itemsize < 8 and startbyte >= 0: + # we optimize STRB/STRH into STR, but this needs care: + # it only works if startindex_loc is a constant, otherwise + # we'd be doing unaligned accesses. + next_group = (-startbyte) & 7 + limit = 8 + + if (isinstance(size_box, ConstInt) and + size_box.getint() <= 14 * limit): # same limit as GCC + # Inline a series of STR operations, starting at 'dstaddr_loc'. + # + self.mc.gen_load_int(r.ip0.value, 0) + i = dst_i = 0 + total_size = size_box.getint() + while i < total_size: + sz = itemsize + if i == next_group: + next_group += 8 + if next_group <= total_size: + sz = 8 + if dst_i % 8: # unaligned? + self.mc.ADD_ri(dstaddr_loc.value, dstaddr_loc.value, dst_i) + dst_i = 0 + if sz == 8: + self.mc.STR_ri(r.ip0.value, dstaddr_loc.value, dst_i) + elif sz == 4: + self.mc.STRW_ri(r.ip0.value, dstaddr_loc.value, dst_i) + elif sz == 2: + self.mc.STRH_ri(r.ip0.value, dstaddr_loc.value, dst_i) + else: + self.mc.STRB_ri(r.ip0.value, dstaddr_loc.value, dst_i) + i += sz + dst_i += sz + + else: + if isinstance(size_box, ConstInt): + size_loc = self.imm(size_box.getint()) + else: + # load size_loc in a register different than dstaddr_loc + size_loc = self._regalloc.rm.make_sure_var_in_reg(size_box, + []) + # + # call memset() + self._regalloc.before_call() + self.simple_call_no_collect(self.imm(self.memset_addr), + [dstaddr_loc, self.imm(0), size_loc]) + self._regalloc.rm.possibly_free_var(size_box) + + def _emit_op_cond_call(self, op, arglocs, fcond): + if len(arglocs) == 2: + res_loc = arglocs[1] # cond_call_value + else: + res_loc = None # cond_call + # see x86.regalloc for why we skip res_loc in the gcmap + + if arglocs[0] is not None: # otherwise result already in CC + self.mc.CMP_ri(arglocs[0].value, 0) + + gcmap = self._regalloc.get_gcmap([res_loc]) + + jmp_adr = self.mc.currpos() + self.mc.BRK() # patched later: the conditional jump + # + self.push_gcmap(self.mc, gcmap) + self.mc.gen_load_int(r.ip1.value, rffi.cast(lltype.Signed, + op.getarg(1).getint())) + # + callee_only = False + floats = False + if self._regalloc is not None: + for reg in self._regalloc.rm.reg_bindings.values(): + if reg not in self._regalloc.rm.save_around_call_regs: + break + else: + callee_only = True + if self._regalloc.vfprm.reg_bindings: + floats = True + cond_call_adr = self.cond_call_slowpath[floats * 2 + callee_only] + assert cond_call_adr + + self.mc.BL(cond_call_adr) + # if this is a COND_CALL_VALUE, we need to move the result in place + # from its current location + if res_loc is not None: + self.mc.MOV_rr(res_loc.value, r.ip1.value) + # + self.pop_gcmap(self.mc) + pmc = OverwritingBuilder(self.mc, jmp_adr, WORD) + pmc.B_ofs_cond(self.mc.currpos() - jmp_adr, fcond) + # might be overridden again to skip over the following + # guard_no_exception too + self.previous_cond_call_jcond = jmp_adr, fcond + + def emit_op_cond_call(self, op, arglocs): + self._emit_op_cond_call(op, arglocs, c.EQ) + + def emit_op_cond_call_value_i(self, op, arglocs): + self._emit_op_cond_call(op, arglocs, c.NE) + emit_op_cond_call_value_r = emit_op_cond_call_value_i + + def emit_guard_op_cond_call(self, prevop, op, fcond, arglocs): + self._emit_op_cond_call(op, arglocs, c.get_opposite_of(fcond)) + + def _write_barrier_fastpath(self, mc, descr, arglocs, array=False, is_frame=False): + # Write code equivalent to write_barrier() in the GC: it checks + # a flag in the object at arglocs[0], and if set, it calls a + # helper piece of assembler. The latter saves registers as needed + # and call the function remember_young_pointer() from the GC. + if we_are_translated(): + cls = self.cpu.gc_ll_descr.has_write_barrier_class() + assert cls is not None and isinstance(descr, cls) + # + card_marking = False + mask = descr.jit_wb_if_flag_singlebyte + if array and descr.jit_wb_cards_set != 0: + # assumptions the rest of the function depends on: + assert (descr.jit_wb_cards_set_byteofs == + descr.jit_wb_if_flag_byteofs) + assert descr.jit_wb_cards_set_singlebyte == -0x80 + card_marking = True + mask = descr.jit_wb_if_flag_singlebyte | -0x80 + # + loc_base = arglocs[0] + if is_frame: + assert loc_base is r.fp + mc.LDRB_ri(r.ip0.value, loc_base.value, descr.jit_wb_if_flag_byteofs) + mask &= 0xFF + mc.MOVZ_r_u16(r.ip1.value, mask, 0) + mc.TST_rr_shift(r.ip0.value, r.ip1.value, 0) + jz_location = mc.currpos() + mc.BRK() + + # for cond_call_gc_wb_array, also add another fast path: + # if GCFLAG_CARDS_SET, then we can just set one bit and be done + if card_marking: + mc.MOVZ_r_u16(r.ip1.value, 0x80, 0) + # GCFLAG_CARDS_SET is in this byte at 0x80 + mc.TST_rr_shift(r.ip0.value, r.ip1.value, 0) + + js_location = mc.currpos() + mc.BRK() + else: + js_location = 0 + + # Write only a CALL to the helper prepared in advance, passing it as + # argument the address of the structure we are writing into + # (the first argument to COND_CALL_GC_WB). + helper_num = card_marking + if is_frame: + helper_num = 4 + elif self._regalloc is not None and self._regalloc.vfprm.reg_bindings: + helper_num += 2 + if self.wb_slowpath[helper_num] == 0: # tests only + assert not we_are_translated() + self.cpu.gc_ll_descr.write_barrier_descr = descr + self._build_wb_slowpath(card_marking, + bool(self._regalloc.vfprm.reg_bindings)) + assert self.wb_slowpath[helper_num] != 0 + # + if loc_base is not r.x0: + # push two registers to keep stack aligned + mc.SUB_ri(r.sp.value, r.sp.value, 2 * WORD) + mc.STR_ri(r.x0.value, r.sp.value, WORD) + mc.STR_ri(loc_base.value, r.sp.value, 0) + mc.MOV_rr(r.x0.value, loc_base.value) + if is_frame: + assert loc_base is r.fp + mc.BL(self.wb_slowpath[helper_num]) + if loc_base is not r.x0: + mc.LDR_ri(r.x0.value, r.sp.value, WORD) + mc.LDR_ri(loc_base.value, r.sp.value, 0) + mc.ADD_ri(r.sp.value, r.sp.value, 2 * WORD) + + if card_marking: + # The helper ends again with a check of the flag in the object. So + # here, we can simply write again a conditional jump, which will be + # taken if GCFLAG_CARDS_SET is still not set. + jns_location = mc.currpos() + mc.BRK() + # + # patch the JS above + offset = mc.currpos() - js_location + pmc = OverwritingBuilder(mc, js_location, WORD) + pmc.B_ofs_cond(offset, c.NE) # We want to jump if the z flag isn't set + # + # case GCFLAG_CARDS_SET: emit a few instructions to do + # directly the card flag setting + loc_index = arglocs[1] + assert loc_index.is_core_reg() + tmp1 = r.ip1 + #tmp2 = arglocs[-1] -- the last item is a preallocated tmp on arm, + # but not here on aarch64 + # lr = byteofs + s = 3 + descr.jit_wb_card_page_shift + mc.MVN_rr_shifted(r.lr.value, loc_index.value, s, shifttype=shift.LSR) + + # tmp1 = byte_index + mc.MOVZ_r_u16(r.ip0.value, 7, 0) + mc.AND_rr_shift(tmp1.value, r.ip0.value, loc_index.value, + descr.jit_wb_card_page_shift, shifttype=shift.LSR) + + # set the bit + mc.MOVZ_r_u16(r.ip0.value, 1, 0) + mc.LSL_rr(tmp1.value, r.ip0.value, tmp1.value) + mc.LDRB_rr(r.ip0.value, loc_base.value, r.lr.value) + mc.ORR_rr(r.ip0.value, r.ip0.value, tmp1.value) + mc.STR_size_rr(0, r.ip0.value, loc_base.value, r.lr.value) + # done + # + # patch the JNS above + offset = mc.currpos() - jns_location + pmc = OverwritingBuilder(mc, jns_location, WORD) + pmc.B_ofs_cond(offset, c.EQ) # We want to jump if the z flag is set + + offset = mc.currpos() - jz_location + pmc = OverwritingBuilder(mc, jz_location, WORD) + pmc.B_ofs_cond(offset, c.EQ) + + # ----------------------------- call ------------------------------ + + def _genop_call(self, op, arglocs): + return self._emit_call(op, arglocs) + emit_op_call_i = _genop_call + emit_op_call_r = _genop_call + emit_op_call_f = _genop_call + emit_op_call_n = _genop_call + + def _emit_call(self, op, arglocs): + is_call_release_gil = rop.is_call_release_gil(op.getopnum()) + # args = [resloc, size, sign, args...] + from rpython.jit.backend.llsupport.descr import CallDescr + + func_index = 3 + is_call_release_gil + cb = Aarch64CallBuilder(self, arglocs[func_index], + arglocs[func_index+1:], arglocs[0]) + + descr = op.getdescr() + assert isinstance(descr, CallDescr) + cb.callconv = descr.get_call_conv() + cb.argtypes = descr.get_arg_types() + cb.restype = descr.get_result_type() + sizeloc = arglocs[1] + assert sizeloc.is_imm() + cb.ressize = sizeloc.value + signloc = arglocs[2] + assert signloc.is_imm() + cb.ressign = signloc.value + + if is_call_release_gil: + saveerrloc = arglocs[3] + assert saveerrloc.is_imm() + cb.emit_call_release_gil(saveerrloc.value) + else: + effectinfo = descr.get_extra_info() + if effectinfo is None or effectinfo.check_can_collect(): + cb.emit() + else: + cb.emit_no_collect() + + def simple_call(self, fnloc, arglocs, result_loc=r.x0): + if result_loc is None: + result_type = VOID + result_size = 0 + elif result_loc.is_vfp_reg(): + result_type = FLOAT + result_size = WORD + else: + result_type = INT + result_size = WORD + cb = Aarch64CallBuilder(self, fnloc, arglocs, + result_loc, result_type, + result_size) + cb.emit() + + def simple_call_no_collect(self, fnloc, arglocs): + cb = Aarch64CallBuilder(self, fnloc, arglocs) + cb.emit_no_collect() + + def emit_guard_op_guard_not_forced(self, op, guard_op, fcond, arglocs): + # arglocs is call locs + guard_locs, split them + if rop.is_call_assembler(op.getopnum()): + if fcond == 4: + [argloc, vloc, result_loc, tmploc] = arglocs[:4] + else: + [argloc, result_loc, tmploc] = arglocs[:3] + vloc = locations.imm(0) + guard_locs = arglocs[fcond:] + self._store_force_index(guard_op) + self.call_assembler(op, argloc, vloc, result_loc, tmploc) + else: + assert fcond == op.numargs() + 3 + call_args = arglocs[:fcond] + guard_locs = arglocs[fcond:] + self._store_force_index(guard_op) + self._emit_call(op, call_args) + # process the guard_not_forced + ofs = self.cpu.get_ofs_of_frame_field('jf_descr') + self.mc.LDR_ri(r.ip0.value, r.fp.value, ofs) + self.mc.CMP_ri(r.ip0.value, 0) + self._emit_guard(guard_op, c.EQ, guard_locs) + + def _call_assembler_emit_call(self, addr, argloc, resloc): + ofs = self.saved_threadlocal_addr + # we are moving the threadlocal directly to x1, to avoid strange + # dances + self.mc.LDR_ri(r.x1.value, r.sp.value, ofs) + self.simple_call(addr, [argloc], result_loc=resloc) + + def _call_assembler_emit_helper_call(self, addr, arglocs, resloc): + self.simple_call(addr, arglocs, result_loc=resloc) + + def _call_assembler_check_descr(self, value, tmploc): + ofs = self.cpu.get_ofs_of_frame_field('jf_descr') + self.mc.LDR_ri(r.ip0.value, tmploc.value, ofs) + if check_imm_arg(value): + self.mc.CMP_ri(r.ip0.value, value) + else: + self.mc.gen_load_int(r.ip1.value, value) + self.mc.CMP_rr(r.ip0.value, r.ip1.value) + pos = self.mc.currpos() + self.mc.BRK() + return pos + + def _call_assembler_patch_je(self, result_loc, jmp_location): + pos = self.mc.currpos() + self.mc.BRK() + # + pmc = OverwritingBuilder(self.mc, jmp_location, WORD) + pmc.B_ofs_cond(self.mc.currpos() - jmp_location, c.EQ) + return pos + + def _call_assembler_load_result(self, op, result_loc): + if op.type != 'v': + # load the return value from (tmploc, 0) + kind = op.type + descr = self.cpu.getarraydescr_for_frame(kind) + if kind == FLOAT: + ofs = self.cpu.unpack_arraydescr(descr) + assert check_imm_arg(ofs) + assert result_loc.is_vfp_reg() + # we always have a register here, since we have to sync them + # before call_assembler + self.mc.LDR_di(result_loc.value, r.x0.value, ofs) + else: + assert result_loc is r.x0 + ofs = self.cpu.unpack_arraydescr(descr) + assert check_imm_arg(ofs) + self.mc.LDR_ri(result_loc.value, r.x0.value, ofs) + + def _call_assembler_patch_jmp(self, jmp_location): + # merge point + currpos = self.mc.currpos() + pmc = OverwritingBuilder(self.mc, jmp_location, WORD) + pmc.B_ofs(currpos - jmp_location) + + def _store_force_index(self, guard_op): + faildescr = guard_op.getdescr() + faildescrindex = self.get_gcref_from_faildescr(faildescr) + ofs = self.cpu.get_ofs_of_frame_field('jf_force_descr') + self.load_from_gc_table(r.ip0.value, faildescrindex) + self.store_reg(self.mc, r.ip0, r.fp, ofs) + + def emit_op_guard_not_forced_2(self, op, arglocs): + self.store_force_descr(op, arglocs[1:], arglocs[0].value) + + def store_force_descr(self, op, fail_locs, frame_depth): + pos = self.mc.currpos() + guard_token = self.build_guard_token(op, frame_depth, fail_locs, pos, c.AL) + self._finish_gcmap = guard_token.gcmap + self._store_force_index(op) + self.store_info_on_descr(pos, guard_token) + + def emit_op_force_token(self, op, arglocs): + self.mc.MOV_rr(arglocs[0].value, r.fp.value) + + def emit_op_label(self, op, arglocs): + pass + + def emit_op_jump(self, op, arglocs): + target_token = op.getdescr() + assert isinstance(target_token, TargetToken) + target = target_token._ll_loop_code + if target_token in self.target_tokens_currently_compiling: + self.mc.B_ofs(target - self.mc.currpos()) + else: + self.mc.B(target) + + def emit_op_finish(self, op, arglocs): + base_ofs = self.cpu.get_baseofs_of_frame_field() + if len(arglocs) > 0: + [return_val] = arglocs + self.store_reg(self.mc, return_val, r.fp, base_ofs) + ofs = self.cpu.get_ofs_of_frame_field('jf_descr') + + faildescrindex = self.get_gcref_from_faildescr(op.getdescr()) + self.load_from_gc_table(r.ip0.value, faildescrindex) + # XXX self.mov(fail_descr_loc, RawStackLoc(ofs)) + self.store_reg(self.mc, r.ip0, r.fp, ofs) + if op.numargs() > 0 and op.getarg(0).type == REF: + if self._finish_gcmap: + # we're returning with a guard_not_forced_2, and + # additionally we need to say that r0 contains + # a reference too: + self._finish_gcmap[0] |= r_uint(1) + gcmap = self._finish_gcmap + else: + gcmap = self.gcmap_for_finish + self.push_gcmap(self.mc, gcmap) + elif self._finish_gcmap: + # we're returning with a guard_not_forced_2 + gcmap = self._finish_gcmap + self.push_gcmap(self.mc, gcmap) + else: + # note that the 0 here is redundant, but I would rather + # keep that one and kill all the others + ofs = self.cpu.get_ofs_of_frame_field('jf_gcmap') + self.store_reg(self.mc, r.xzr, r.fp, ofs) + self.mc.MOV_rr(r.x0.value, r.fp.value) + # exit function + self.gen_func_epilog() diff -Nru pypy-7.1.1+dfsg/rpython/jit/backend/aarch64/regalloc.py pypy-7.3.1+dfsg/rpython/jit/backend/aarch64/regalloc.py --- pypy-7.1.1+dfsg/rpython/jit/backend/aarch64/regalloc.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/backend/aarch64/regalloc.py 2020-04-10 19:28:41.000000000 +0000 @@ -0,0 +1,1145 @@ + +from rpython.jit.backend.aarch64 import registers as r +from rpython.jit.backend.aarch64 import locations +from rpython.jit.backend.arm import conditions as c +from rpython.jit.backend.aarch64.arch import WORD, JITFRAME_FIXED_SIZE + +from rpython.jit.metainterp.history import (Const, ConstInt, ConstFloat, + ConstPtr, + INT, REF, FLOAT) +from rpython.jit.metainterp.history import TargetToken +from rpython.jit.metainterp.resoperation import rop +from rpython.jit.backend.llsupport.regalloc import FrameManager, \ + RegisterManager, TempVar, compute_vars_longevity, BaseRegalloc, \ + get_scale +from rpython.rtyper.lltypesystem import lltype, rffi, rstr, llmemory +from rpython.jit.backend.aarch64 import registers as r +from rpython.jit.backend.aarch64.jump import remap_frame_layout_mixed +from rpython.jit.backend.aarch64.locations import imm +from rpython.jit.backend.llsupport.gcmap import allocate_gcmap +from rpython.jit.backend.llsupport.descr import CallDescr +from rpython.jit.codewriter.effectinfo import EffectInfo +from rpython.jit.codewriter import longlong + +from rpython.rlib.rarithmetic import r_uint + + +class TempInt(TempVar): + type = INT + + def __repr__(self): + return "" % (id(self),) + + +class TempPtr(TempVar): + type = REF + + def __repr__(self): + return "" % (id(self),) + + +class TempFloat(TempVar): + type = FLOAT + + def __repr__(self): + return "" % (id(self),) + + +class ARMFrameManager(FrameManager): + + def __init__(self, base_ofs): + FrameManager.__init__(self) + self.base_ofs = base_ofs + + def frame_pos(self, i, box_type): + return locations.StackLocation(i, locations.get_fp_offset(self.base_ofs, i), box_type) + + @staticmethod + def frame_size(type): + return 1 + + @staticmethod + def get_loc_index(loc): + assert loc.is_stack() + return loc.position + +class ARMRegisterManager(RegisterManager): + def return_constant(self, v, forbidden_vars=[], selected_reg=None): + self._check_type(v) + if isinstance(v, Const): + if isinstance(v, ConstPtr): + tp = REF + elif isinstance(v, ConstFloat): + tp = FLOAT + else: + tp = INT + loc = self.get_scratch_reg(tp, + self.temp_boxes + forbidden_vars, + selected_reg=selected_reg) + immvalue = self.convert_to_imm(v) + self.assembler.load(loc, immvalue) + return loc + else: + return RegisterManager.return_constant(self, v, + forbidden_vars, selected_reg) + + + + +class VFPRegisterManager(ARMRegisterManager): + all_regs = r.all_vfp_regs + box_types = [FLOAT] + save_around_call_regs = r.all_vfp_regs + + def convert_to_imm(self, c): + adr = self.assembler.datablockwrapper.malloc_aligned(8, 8) + x = c.getfloatstorage() + rffi.cast(rffi.CArrayPtr(longlong.FLOATSTORAGE), adr)[0] = x + return locations.ConstFloatLoc(adr) + + def call_result_location(self, v): + return r.d0 + + def __init__(self, longevity, frame_manager=None, assembler=None): + RegisterManager.__init__(self, longevity, frame_manager, assembler) + + def get_scratch_reg(self, type=FLOAT, forbidden_vars=[], selected_reg=None): + assert type == FLOAT # for now + box = TempFloat() + self.temp_boxes.append(box) + reg = self.force_allocate_reg(box, forbidden_vars=forbidden_vars, + selected_reg=selected_reg) + return reg + + +class CoreRegisterManager(ARMRegisterManager): + all_regs = r.all_regs + box_types = None # or a list of acceptable types + no_lower_byte_regs = all_regs + save_around_call_regs = r.caller_resp + frame_reg = r.fp + + def __init__(self, longevity, frame_manager=None, assembler=None): + RegisterManager.__init__(self, longevity, frame_manager, assembler) + + def call_result_location(self, v): + return r.x0 + + def convert_to_imm(self, c): + if isinstance(c, ConstInt): + val = rffi.cast(lltype.Signed, c.value) + return locations.ImmLocation(val) + else: + assert isinstance(c, ConstPtr) + return locations.ImmLocation(rffi.cast(lltype.Signed, c.value)) + assert 0 + + def get_scratch_reg(self, type=INT, forbidden_vars=[], selected_reg=None): + assert type == INT or type == REF + box = None + if type == INT: + box = TempInt() + else: + box = TempPtr() + self.temp_boxes.append(box) + reg = self.force_allocate_reg(box, forbidden_vars=forbidden_vars, + selected_reg=selected_reg) + return reg + + def get_free_reg(self): + free_regs = self.free_regs + for i in range(len(free_regs) - 1, -1, -1): + if free_regs[i] in self.save_around_call_regs: + continue + return free_regs[i] + +DEFAULT_IMM_SIZE = 4096 + +def check_imm_arg(arg, size=DEFAULT_IMM_SIZE, allow_zero=True): + i = arg + if allow_zero: + lower_bound = i >= 0 + else: + lower_bound = i > 0 + return i < size and lower_bound + +def check_imm_box(arg, size=DEFAULT_IMM_SIZE, allow_zero=True): + if isinstance(arg, ConstInt): + return check_imm_arg(arg.getint(), size, allow_zero) + return False + + +class Regalloc(BaseRegalloc): + + def __init__(self, assembler): + self.cpu = assembler.cpu + self.assembler = assembler + self.frame_manager = None + self.jump_target_descr = None + self.final_jump_op = None + + def _prepare(self, inputargs, operations, allgcrefs): + cpu = self.cpu + self.fm = ARMFrameManager(cpu.get_baseofs_of_frame_field()) + self.frame_manager = self.fm + operations = cpu.gc_ll_descr.rewrite_assembler(cpu, operations, + allgcrefs) + # compute longevity of variables + longevity = compute_vars_longevity(inputargs, operations) + self.longevity = longevity + fm = self.frame_manager + asm = self.assembler + self.vfprm = VFPRegisterManager(longevity, fm, asm) + self.rm = CoreRegisterManager(longevity, fm, asm) + return operations + + def prepare_loop(self, inputargs, operations, looptoken, allgcrefs): + operations = self._prepare(inputargs, operations, allgcrefs) + self._set_initial_bindings(inputargs, looptoken) + self.possibly_free_vars(list(inputargs)) + return operations + + def loc(self, var): + if var.type == FLOAT: + return self.vfprm.loc(var) + else: + return self.rm.loc(var) + + def possibly_free_var(self, var): + if var.type == FLOAT: + self.vfprm.possibly_free_var(var) + else: + self.rm.possibly_free_var(var) + + def force_spill_var(self, var): + if var.type == FLOAT: + self.vfprm.force_spill_var(var) + else: + self.rm.force_spill_var(var) + + def possibly_free_vars_for_op(self, op): + for i in range(op.numargs()): + var = op.getarg(i) + if var is not None: # xxx kludgy + self.possibly_free_var(var) + if op.is_guard(): + self.possibly_free_vars(op.getfailargs()) + + def possibly_free_vars(self, vars): + for var in vars: + if var is not None: # xxx kludgy + self.possibly_free_var(var) + + def get_scratch_reg(self, type, forbidden_vars=[], selected_reg=None): + if type == FLOAT: + return self.vfprm.get_scratch_reg(type, forbidden_vars, + selected_reg) + else: + return self.rm.get_scratch_reg(type, forbidden_vars, selected_reg) + + def get_free_reg(self): + return self.rm.get_free_reg() + + def free_temp_vars(self): + self.rm.free_temp_vars() + self.vfprm.free_temp_vars() + + def make_sure_var_in_reg(self, var, forbidden_vars=[], + selected_reg=None, need_lower_byte=False): + if var.type == FLOAT: + return self.vfprm.make_sure_var_in_reg(var, forbidden_vars, + selected_reg, need_lower_byte) + else: + return self.rm.make_sure_var_in_reg(var, forbidden_vars, + selected_reg, need_lower_byte) + + def convert_to_imm(self, value): + if isinstance(value, ConstInt): + return self.rm.convert_to_imm(value) + else: + assert isinstance(value, ConstFloat) + return self.vfprm.convert_to_imm(value) + + def compute_hint_frame_locations(self, operations): + # optimization only: fill in the 'hint_frame_locations' dictionary + # of rm and xrm based on the JUMP at the end of the loop, by looking + # at where we would like the boxes to be after the jump. + op = operations[-1] + if op.getopnum() != rop.JUMP: + return + self.final_jump_op = op + descr = op.getdescr() + assert isinstance(descr, TargetToken) + if descr._ll_loop_code != 0: + # if the target LABEL was already compiled, i.e. if it belongs + # to some already-compiled piece of code + self._compute_hint_frame_locations_from_descr(descr) + #else: + # The loop ends in a JUMP going back to a LABEL in the same loop. + # We cannot fill 'hint_frame_locations' immediately, but we can + # wait until the corresponding prepare_op_label() to know where the + # we would like the boxes to be after the jump. + + def _compute_hint_frame_locations_from_descr(self, descr): + arglocs = descr._arm_arglocs + jump_op = self.final_jump_op + assert len(arglocs) == jump_op.numargs() + for i in range(jump_op.numargs()): + box = jump_op.getarg(i) + if not isinstance(box, Const): + loc = arglocs[i] + if loc is not None and loc.is_stack(): + self.frame_manager.hint_frame_pos[box] = ( + self.fm.get_loc_index(loc)) + + def position(self): + return self.rm.position + + def next_instruction(self): + self.rm.next_instruction() + self.vfprm.next_instruction() + + def prepare_op_increment_debug_counter(self, op): + boxes = op.getarglist() + a0, = boxes + base_loc = self.make_sure_var_in_reg(a0, boxes) + value_loc = self.get_scratch_reg(INT, boxes) + self.free_temp_vars() + return [base_loc, value_loc] + + def void(self, op): + return [] + + prepare_op_jit_debug = void + prepare_op_enter_portal_frame = void + prepare_op_leave_portal_frame = void + prepare_op_zero_array = void # dealth with in opassembler.py + prepare_op_keepalive = void + + def prepare_int_ri(self, op, res_in_cc): + boxes = op.getarglist() + a0, a1 = boxes + imm_a0 = check_imm_box(a0) + imm_a1 = check_imm_box(a1) + if not imm_a0 and imm_a1: + l0 = self.make_sure_var_in_reg(a0, boxes) + l1 = self.convert_to_imm(a1) + elif imm_a0 and not imm_a1: + l1 = self.convert_to_imm(a0) + l0 = self.make_sure_var_in_reg(a1, boxes) + else: + l0 = self.make_sure_var_in_reg(a0, boxes) + l1 = self.make_sure_var_in_reg(a1, boxes) + self.possibly_free_vars_for_op(op) + res = self.force_allocate_reg(op) + # note that we always allocate res, even if res_in_cc is True, + # that only means overflow is in CC + return [l0, l1, res] + + def prepare_op_int_add(self, op): + return self.prepare_int_ri(op, False) + + def prepare_op_int_sub(self, op): + boxes = op.getarglist() + a0, a1 = boxes + imm_a1 = check_imm_box(a1) + if imm_a1: + l0 = self.make_sure_var_in_reg(a0, boxes) + l1 = self.convert_to_imm(a1) + else: + l0 = self.make_sure_var_in_reg(a0, boxes) + l1 = self.make_sure_var_in_reg(a1, boxes) + self.possibly_free_vars_for_op(op) + res = self.force_allocate_reg(op) + return [l0, l1, res] + + def prepare_comp_op_int_sub_ovf(self, op, res_in_cc): + # ignore res_in_cc + return self.prepare_op_int_sub(op) + + def prepare_op_int_mul(self, op): + boxes = op.getarglist() + a0, a1 = boxes + + reg1 = self.make_sure_var_in_reg(a0, forbidden_vars=boxes) + reg2 = self.make_sure_var_in_reg(a1, forbidden_vars=boxes) + + self.possibly_free_vars(boxes) + self.possibly_free_vars_for_op(op) + res = self.force_allocate_reg(op) + self.possibly_free_var(op) + return [reg1, reg2, res] + + def prepare_comp_op_int_mul_ovf(self, op, res_in_cc): + return self.prepare_op_int_mul(op) + + def prepare_op_int_force_ge_zero(self, op): + argloc = self.make_sure_var_in_reg(op.getarg(0)) + resloc = self.force_allocate_reg(op, [op.getarg(0)]) + return [argloc, resloc] + + def prepare_op_int_signext(self, op): + argloc = self.make_sure_var_in_reg(op.getarg(0)) + numbytes = op.getarg(1).getint() + resloc = self.force_allocate_reg(op) + return [argloc, imm(numbytes), resloc] + + # some of those have forms of imm that they accept, but they're rather + # obscure. Can be future optimization + prepare_op_int_and = prepare_op_int_mul + prepare_op_int_or = prepare_op_int_mul + prepare_op_int_xor = prepare_op_int_mul + prepare_op_int_lshift = prepare_op_int_mul + prepare_op_int_rshift = prepare_op_int_mul + prepare_op_uint_rshift = prepare_op_int_mul + prepare_op_uint_mul_high = prepare_op_int_mul + + def prepare_int_cmp(self, op, res_in_cc): + boxes = op.getarglist() + arg0, arg1 = boxes + imm_a1 = check_imm_box(arg1) + + l0 = self.make_sure_var_in_reg(arg0, forbidden_vars=boxes) + if imm_a1: + l1 = self.convert_to_imm(arg1) + else: + l1 = self.make_sure_var_in_reg(arg1, forbidden_vars=boxes) + + self.possibly_free_vars_for_op(op) + self.free_temp_vars() + if not res_in_cc: + res = self.force_allocate_reg(op) + return [l0, l1, res] + return [l0, l1] + + prepare_comp_op_int_lt = prepare_int_cmp + prepare_comp_op_int_le = prepare_int_cmp + prepare_comp_op_int_ge = prepare_int_cmp + prepare_comp_op_int_gt = prepare_int_cmp + prepare_comp_op_int_ne = prepare_int_cmp + prepare_comp_op_int_eq = prepare_int_cmp + prepare_comp_op_ptr_eq = prepare_comp_op_instance_ptr_eq = prepare_int_cmp + prepare_comp_op_ptr_ne = prepare_comp_op_instance_ptr_ne = prepare_int_cmp + prepare_comp_op_uint_lt = prepare_int_cmp + prepare_comp_op_uint_le = prepare_int_cmp + prepare_comp_op_uint_ge = prepare_int_cmp + prepare_comp_op_uint_gt = prepare_int_cmp + + def prepare_float_op(self, op, res_in_cc): + assert res_in_cc + loc1 = self.make_sure_var_in_reg(op.getarg(0)) + loc2 = self.make_sure_var_in_reg(op.getarg(1)) + return [loc1, loc2] + + prepare_comp_op_float_lt = prepare_float_op + prepare_comp_op_float_le = prepare_float_op + prepare_comp_op_float_gt = prepare_float_op + prepare_comp_op_float_ge = prepare_float_op + prepare_comp_op_float_eq = prepare_float_op + prepare_comp_op_float_ne = prepare_float_op + + def prepare_op_int_le(self, op): + return self.prepare_int_cmp(op, False) + + prepare_op_int_lt = prepare_op_int_le + prepare_op_int_gt = prepare_op_int_le + prepare_op_int_ge = prepare_op_int_le + prepare_op_int_eq = prepare_op_int_le + prepare_op_int_ne = prepare_op_int_le + prepare_op_uint_lt = prepare_op_int_le + prepare_op_uint_le = prepare_op_int_le + prepare_op_uint_gt = prepare_op_int_le + prepare_op_uint_ge = prepare_op_int_le + + def prepare_unary(self, op): + a0 = op.getarg(0) + assert not isinstance(a0, Const) + reg = self.make_sure_var_in_reg(a0) + self.possibly_free_vars_for_op(op) + res = self.force_allocate_reg(op) + return [reg, res] + + prepare_op_int_is_true = prepare_unary + prepare_op_int_is_zero = prepare_unary + prepare_op_int_neg = prepare_unary + prepare_op_int_invert = prepare_unary + + def prepare_comp_unary(self, op, res_in_cc): + a0 = op.getarg(0) + assert not isinstance(a0, Const) + reg = self.make_sure_var_in_reg(a0) + return [reg] + + prepare_comp_op_int_is_true = prepare_comp_unary + prepare_comp_op_int_is_zero = prepare_comp_unary + + # --------------------------------- floats -------------------------- + + def prepare_two_regs_op(self, op): + loc1 = self.make_sure_var_in_reg(op.getarg(0)) + loc2 = self.make_sure_var_in_reg(op.getarg(1), op.getarglist()) + self.possibly_free_vars_for_op(op) + self.free_temp_vars() + res = self.force_allocate_reg(op) + return [loc1, loc2, res] + + prepare_op_float_add = prepare_two_regs_op + prepare_op_float_sub = prepare_two_regs_op + prepare_op_float_mul = prepare_two_regs_op + prepare_op_float_truediv = prepare_two_regs_op + + prepare_op_float_lt = prepare_two_regs_op + prepare_op_float_le = prepare_two_regs_op + prepare_op_float_eq = prepare_two_regs_op + prepare_op_float_ne = prepare_two_regs_op + prepare_op_float_gt = prepare_two_regs_op + prepare_op_float_ge = prepare_two_regs_op + + prepare_op_float_neg = prepare_unary + prepare_op_float_abs = prepare_unary + prepare_op_cast_float_to_int = prepare_unary + prepare_op_cast_int_to_float = prepare_unary + + def _prepare_op_math_sqrt(self, op): + loc1 = self.make_sure_var_in_reg(op.getarg(1)) + self.possibly_free_vars_for_op(op) + res = self.force_allocate_reg(op) + return [loc1, res] + + def _prepare_threadlocalref_get(self, op): + res_loc = self.force_allocate_reg(op) + return [res_loc] + + prepare_op_convert_float_bytes_to_longlong = prepare_unary + prepare_op_convert_longlong_bytes_to_float = prepare_unary + + # --------------------------------- fields -------------------------- + + def prepare_op_gc_store(self, op): + boxes = op.getarglist() + base_loc = self.make_sure_var_in_reg(boxes[0], boxes) + ofs = boxes[1].getint() + value_loc = self.make_sure_var_in_reg(boxes[2], boxes) + size = boxes[3].getint() + if check_imm_arg(ofs): + ofs_loc = imm(ofs) + else: + ofs_loc = r.ip1 + self.assembler.load(ofs_loc, imm(ofs)) + return [value_loc, base_loc, ofs_loc, imm(size)] + + def _prepare_op_gc_load(self, op): + a0 = op.getarg(0) + ofs = op.getarg(1).getint() + nsize = op.getarg(2).getint() # negative for "signed" + base_loc = self.make_sure_var_in_reg(a0) + immofs = imm(ofs) + if check_imm_arg(ofs): + ofs_loc = immofs + else: + ofs_loc = r.ip1 + self.assembler.load(ofs_loc, immofs) + self.possibly_free_vars_for_op(op) + res_loc = self.force_allocate_reg(op) + return [base_loc, ofs_loc, res_loc, imm(nsize)] + + prepare_op_gc_load_i = _prepare_op_gc_load + prepare_op_gc_load_r = _prepare_op_gc_load + prepare_op_gc_load_f = _prepare_op_gc_load + + def prepare_op_gc_store_indexed(self, op): + boxes = op.getarglist() + base_loc = self.make_sure_var_in_reg(boxes[0], boxes) + value_loc = self.make_sure_var_in_reg(boxes[2], boxes) + index_loc = self.make_sure_var_in_reg(boxes[1], boxes) + assert boxes[3].getint() == 1 # scale + ofs = boxes[4].getint() + size = boxes[5].getint() + assert check_imm_arg(ofs) + return [value_loc, base_loc, index_loc, imm(size), imm(ofs)] + + def _prepare_op_gc_load_indexed(self, op): + boxes = op.getarglist() + base_loc = self.make_sure_var_in_reg(boxes[0], boxes) + index_loc = self.make_sure_var_in_reg(boxes[1], boxes) + assert boxes[2].getint() == 1 # scale + ofs = boxes[3].getint() + nsize = boxes[4].getint() + assert check_imm_arg(ofs) + self.possibly_free_vars_for_op(op) + self.free_temp_vars() + res_loc = self.force_allocate_reg(op) + return [res_loc, base_loc, index_loc, imm(nsize), imm(ofs)] + + prepare_op_gc_load_indexed_i = _prepare_op_gc_load_indexed + prepare_op_gc_load_indexed_r = _prepare_op_gc_load_indexed + prepare_op_gc_load_indexed_f = _prepare_op_gc_load_indexed + + # --------------------------------- call ---------------------------- + + def _prepare_op_call(self, op): + calldescr = op.getdescr() + assert calldescr is not None + effectinfo = calldescr.get_extra_info() + if effectinfo is not None: + oopspecindex = effectinfo.oopspecindex + if oopspecindex == EffectInfo.OS_MATH_SQRT: + args = self._prepare_op_math_sqrt(op) + self.assembler.math_sqrt(op, args) + return + elif oopspecindex == EffectInfo.OS_THREADLOCALREF_GET: + args = self._prepare_threadlocalref_get(op) + self.assembler.threadlocalref_get(op, args) + return + #elif oopspecindex == EffectInfo.OS_MATH_READ_TIMESTAMP: + # ... + return self._prepare_call(op) + + prepare_op_call_i = _prepare_op_call + prepare_op_call_r = _prepare_op_call + prepare_op_call_f = _prepare_op_call + prepare_op_call_n = _prepare_op_call + + def _prepare_call(self, op, save_all_regs=False, first_arg_index=1): + args = [None] * (op.numargs() + 3) + calldescr = op.getdescr() + assert isinstance(calldescr, CallDescr) + assert len(calldescr.arg_classes) == op.numargs() - first_arg_index + + for i in range(op.numargs()): + args[i + 3] = self.loc(op.getarg(i)) + + size = calldescr.get_result_size() + sign = calldescr.is_result_signed() + if sign: + sign_loc = imm(1) + else: + sign_loc = imm(0) + args[1] = imm(size) + args[2] = sign_loc + + effectinfo = calldescr.get_extra_info() + if save_all_regs: + gc_level = 2 + elif effectinfo is None or effectinfo.check_can_collect(): + gc_level = 1 + else: + gc_level = 0 + + args[0] = self._call(op, args, gc_level) + return args + + def _call(self, op, arglocs, gc_level): + # spill variables that need to be saved around calls: + # gc_level == 0: callee cannot invoke the GC + # gc_level == 1: can invoke GC, save all regs that contain pointers + # gc_level == 2: can force, save all regs + save_all_regs = gc_level == 2 + self.vfprm.before_call(save_all_regs=save_all_regs) + if gc_level == 1 and self.cpu.gc_ll_descr.gcrootmap: + save_all_regs = 2 + self.rm.before_call(save_all_regs=save_all_regs) + resloc = self.after_call(op) + return resloc + + def before_call(self, save_all_regs=False): + self.rm.before_call(save_all_regs=save_all_regs) + self.vfprm.before_call(save_all_regs=save_all_regs) + + def after_call(self, v): + if v.type == 'v': + return + if v.type == FLOAT: + return self.vfprm.after_call(v) + else: + return self.rm.after_call(v) + + def prepare_guard_op_guard_not_forced(self, op, prev_op): + if rop.is_call_release_gil(prev_op.getopnum()): + arglocs = self._prepare_call(prev_op, save_all_regs=True, + first_arg_index=2) + elif rop.is_call_assembler(prev_op.getopnum()): + locs = self.locs_for_call_assembler(prev_op) + tmploc = self.get_scratch_reg(INT, selected_reg=r.x0) + resloc = self._call(prev_op, locs + [tmploc], gc_level=2) + arglocs = locs + [resloc, tmploc] + else: + assert rop.is_call_may_force(prev_op.getopnum()) + arglocs = self._prepare_call(prev_op, save_all_regs=True) + guard_locs = self._guard_impl(op) + return arglocs + guard_locs, len(arglocs) + + def prepare_op_guard_not_forced_2(self, op): + self.rm.before_call(op.getfailargs(), save_all_regs=True) + self.vfprm.before_call(op.getfailargs(), save_all_regs=True) + fail_locs = self._guard_impl(op) + return fail_locs + + def prepare_op_label(self, op): + descr = op.getdescr() + assert isinstance(descr, TargetToken) + inputargs = op.getarglist() + arglocs = [None] * len(inputargs) + # + # we use force_spill() on the boxes that are not going to be really + # used any more in the loop, but that are kept alive anyway + # by being in a next LABEL's or a JUMP's argument or fail_args + # of some guard + position = self.rm.position + for arg in inputargs: + assert not isinstance(arg, Const) + if self.longevity[arg].is_last_real_use_before(position): + self.force_spill_var(arg) + + # + for i in range(len(inputargs)): + arg = inputargs[i] + assert not isinstance(arg, Const) + loc = self.loc(arg) + arglocs[i] = loc + if loc.is_core_reg() or loc.is_vfp_reg(): + self.frame_manager.mark_as_free(arg) + # + descr._arm_arglocs = arglocs + descr._ll_loop_code = self.assembler.mc.currpos() + descr._arm_clt = self.assembler.current_clt + self.assembler.target_tokens_currently_compiling[descr] = None + self.possibly_free_vars_for_op(op) + # + # if the LABEL's descr is precisely the target of the JUMP at the + # end of the same loop, i.e. if what we are compiling is a single + # loop that ends up jumping to this LABEL, then we can now provide + # the hints about the expected position of the spilled variables. + jump_op = self.final_jump_op + if jump_op is not None and jump_op.getdescr() is descr: + self._compute_hint_frame_locations_from_descr(descr) + return [] + + def _prepare_op_cond_call(self, op, res_in_cc): + assert 2 <= op.numargs() <= 4 + 2 + v = op.getarg(1) + assert isinstance(v, Const) + args_so_far = [] + for i in range(2, op.numargs()): + reg = r.argument_regs[i - 2] + arg = op.getarg(i) + self.make_sure_var_in_reg(arg, args_so_far, selected_reg=reg) + args_so_far.append(arg) + if res_in_cc: + argloc = None + else: + argloc = self.make_sure_var_in_reg(op.getarg(0), args_so_far) + + if op.type == 'v': + # a plain COND_CALL. Calls the function when args[0] is + # true. Often used just after a comparison operation. + return [argloc] + else: + # COND_CALL_VALUE_I/R. Calls the function when args[0] + # is equal to 0 or NULL. Returns the result from the + # function call if done, or args[0] if it was not 0/NULL. + # Implemented by forcing the result to live in the same + # register as args[0], and overwriting it if we really do + # the call. + + # Load the register for the result. Possibly reuse 'args[0]'. + # But the old value of args[0], if it survives, is first + # spilled away. We can't overwrite any of op.args[2:] here. + args = op.getarglist() + resloc = self.rm.force_result_in_reg(op, args[0], + forbidden_vars=args[2:]) + return [argloc, resloc] + + def prepare_op_cond_call(self, op): + return self._prepare_op_cond_call(op, False) + + def prepare_op_cond_call_value_i(self, op): + return self._prepare_op_cond_call(op, False) + prepare_op_cond_call_value_r = prepare_op_cond_call_value_i + + def prepare_guard_op_cond_call(self, op, prevop): + fcond = self.assembler.dispatch_comparison(prevop) + locs = self._prepare_op_cond_call(op, True) + return locs, fcond + + def prepare_op_force_token(self, op): + # XXX regular reg + res_loc = self.force_allocate_reg(op) + return [res_loc] + + def prepare_op_finish(self, op): + # the frame is in fp, but we have to point where in the frame is + # the potential argument to FINISH + if op.numargs() == 1: + loc = self.make_sure_var_in_reg(op.getarg(0)) + locs = [loc] + else: + locs = [] + return locs + + def guard_impl(self, op, prevop): + fcond = self.assembler.dispatch_comparison(prevop) + # result is in CC + return self._guard_impl(op), fcond + + def _guard_impl(self, op): + arglocs = [None] * (len(op.getfailargs()) + 1) + arglocs[0] = imm(self.frame_manager.get_frame_depth()) + failargs = op.getfailargs() + for i in range(len(failargs)): + if failargs[i]: + arglocs[i + 1] = self.loc(failargs[i]) + return arglocs + + prepare_guard_op_guard_true = guard_impl + prepare_guard_op_guard_false = guard_impl + + def prepare_guard_op_guard_overflow(self, guard_op, prev_op): + self.assembler.dispatch_comparison(prev_op) + # result in CC + if prev_op.opnum == rop.INT_MUL_OVF: + return self._guard_impl(guard_op), c.EQ + return self._guard_impl(guard_op), c.VC + prepare_guard_op_guard_no_overflow = prepare_guard_op_guard_overflow + + def guard_no_cc_impl(self, op): + # rare case of guard with no CC + arglocs = self._guard_impl(op) + return [self.loc(op.getarg(0))] + arglocs + + prepare_op_guard_true = guard_no_cc_impl + prepare_op_guard_false = guard_no_cc_impl + prepare_op_guard_nonnull = guard_no_cc_impl + prepare_op_guard_isnull = guard_no_cc_impl + + def prepare_op_guard_value(self, op): + arg = self.make_sure_var_in_reg(op.getarg(0)) + op.getdescr().make_a_counter_per_value(op, + self.cpu.all_reg_indexes[arg.value]) + l1 = self.loc(op.getarg(1)) + imm_a1 = check_imm_box(op.getarg(1)) + if not imm_a1: + l1 = self.make_sure_var_in_reg(op.getarg(1), [op.getarg(0)]) + arglocs = self._guard_impl(op) + return [arg, l1] + arglocs + + def prepare_op_guard_class(self, op): + assert not isinstance(op.getarg(0), Const) + x = self.make_sure_var_in_reg(op.getarg(0)) + y_val = rffi.cast(lltype.Signed, op.getarg(1).getint()) + arglocs = self._guard_impl(op) + return [x, imm(y_val)] + arglocs + + prepare_op_guard_nonnull_class = prepare_op_guard_class + prepare_op_guard_gc_type = prepare_op_guard_class + prepare_op_guard_subclass = prepare_op_guard_class + + def prepare_op_guard_is_object(self, op): + loc_object = self.make_sure_var_in_reg(op.getarg(0)) + return [loc_object] + self._guard_impl(op) + + def prepare_op_guard_not_invalidated(self, op): + return self._guard_impl(op) + + def prepare_op_guard_exception(self, op): + boxes = op.getarglist() + arg0 = ConstInt(rffi.cast(lltype.Signed, op.getarg(0).getint())) + loc = self.make_sure_var_in_reg(arg0) + if op in self.longevity: + resloc = self.force_allocate_reg(op, boxes) + self.possibly_free_var(op) + else: + resloc = None + pos_exc_value = imm(self.cpu.pos_exc_value()) + pos_exception = imm(self.cpu.pos_exception()) + arglocs = [loc, resloc, pos_exc_value, pos_exception] + self._guard_impl(op) + return arglocs + + def prepare_op_guard_no_exception(self, op): + loc = self.make_sure_var_in_reg(ConstInt(self.cpu.pos_exception())) + return [loc] + self._guard_impl(op) + + def prepare_op_save_exception(self, op): + resloc = self.force_allocate_reg(op) + return [resloc] + prepare_op_save_exc_class = prepare_op_save_exception + + def prepare_op_restore_exception(self, op): + boxes = op.getarglist() + loc0 = self.make_sure_var_in_reg(op.getarg(0), boxes) # exc class + loc1 = self.make_sure_var_in_reg(op.getarg(1), boxes) # exc instance + return [loc0, loc1] + + prepare_op_ptr_eq = prepare_op_instance_ptr_eq = prepare_op_int_eq + prepare_op_ptr_ne = prepare_op_instance_ptr_ne = prepare_op_int_ne + + prepare_op_nursery_ptr_increment = prepare_op_int_add + prepare_comp_op_int_add_ovf = prepare_int_ri + + def _prepare_op_same_as(self, op): + arg = op.getarg(0) + imm_arg = check_imm_box(arg) + if imm_arg: + argloc = self.convert_to_imm(arg) + else: + argloc = self.make_sure_var_in_reg(arg) + self.possibly_free_vars_for_op(op) + self.free_temp_vars() + resloc = self.force_allocate_reg(op) + return [argloc, resloc] + + prepare_op_cast_ptr_to_int = _prepare_op_same_as + prepare_op_cast_int_to_ptr = _prepare_op_same_as + prepare_op_same_as_i = _prepare_op_same_as + prepare_op_same_as_r = _prepare_op_same_as + prepare_op_same_as_f = _prepare_op_same_as + + def prepare_op_load_from_gc_table(self, op): + resloc = self.force_allocate_reg(op) + return [resloc] + + def prepare_op_load_effective_address(self, op): + args = op.getarglist() + arg0 = self.make_sure_var_in_reg(args[0], args) + arg1 = self.make_sure_var_in_reg(args[1], args) + res = self.force_allocate_reg(op) + return [arg0, arg1, imm(args[2].getint()), imm(args[3].getint()), res] + + def prepare_op_check_memory_error(self, op): + argloc = self.make_sure_var_in_reg(op.getarg(0)) + return [argloc] + + def prepare_op_jump(self, op): + assert self.jump_target_descr is None + descr = op.getdescr() + assert isinstance(descr, TargetToken) + self.jump_target_descr = descr + arglocs = descr._arm_arglocs + + # get temporary locs + tmploc = r.ip0 + vfptmploc = r.vfp_ip + + # Part about non-floats + src_locations1 = [] + dst_locations1 = [] + # Part about floats + src_locations2 = [] + dst_locations2 = [] + + # Build the four lists + for i in range(op.numargs()): + box = op.getarg(i) + src_loc = self.loc(box) + dst_loc = arglocs[i] + if box.type != FLOAT: + src_locations1.append(src_loc) + dst_locations1.append(dst_loc) + else: + src_locations2.append(src_loc) + dst_locations2.append(dst_loc) + self.assembler.check_frame_before_jump(self.jump_target_descr) + remap_frame_layout_mixed(self.assembler, + src_locations1, dst_locations1, tmploc, + src_locations2, dst_locations2, vfptmploc) + return [] + + def prepare_op_cond_call_gc_wb(self, op): + # we force all arguments in a reg because it will be needed anyway by + # the following gc_store. It avoids loading it twice from the memory. + N = op.numargs() + args = op.getarglist() + arglocs = [self.make_sure_var_in_reg(op.getarg(i), args) + for i in range(N)] + return arglocs + + prepare_op_cond_call_gc_wb_array = prepare_op_cond_call_gc_wb + + def prepare_op_call_malloc_nursery(self, op): + size_box = op.getarg(0) + assert isinstance(size_box, ConstInt) + # hint: try to move unrelated registers away from x0 and x1 now + self.rm.spill_or_move_registers_before_call([r.x0, r.x1]) + + self.rm.force_allocate_reg(op, selected_reg=r.x0) + t = TempInt() + self.rm.force_allocate_reg(t, selected_reg=r.x1) + + sizeloc = size_box.getint() + gc_ll_descr = self.cpu.gc_ll_descr + gcmap = self.get_gcmap([r.x0, r.x1]) + self.possibly_free_var(t) + self.assembler.malloc_cond( + gc_ll_descr.get_nursery_free_addr(), + gc_ll_descr.get_nursery_top_addr(), + sizeloc, + gcmap + ) + + def prepare_op_call_malloc_nursery_varsize_frame(self, op): + size_box = op.getarg(0) + assert not isinstance(size_box, ConstInt) # we cannot have a const here! + # sizeloc must be in a register, but we can free it now + # (we take care explicitly of conflicts with r0 or r1) + sizeloc = self.rm.make_sure_var_in_reg(size_box) + self.rm.spill_or_move_registers_before_call([r.x0, r.x1]) # sizeloc safe + self.rm.possibly_free_var(size_box) + # + self.rm.force_allocate_reg(op, selected_reg=r.x0) + # + t = TempInt() + self.rm.force_allocate_reg(t, selected_reg=r.x1) + # + gcmap = self.get_gcmap([r.x0, r.x1]) + self.possibly_free_var(t) + # + gc_ll_descr = self.cpu.gc_ll_descr + self.assembler.malloc_cond_varsize_frame( + gc_ll_descr.get_nursery_free_addr(), + gc_ll_descr.get_nursery_top_addr(), + sizeloc, + gcmap + ) + + def prepare_op_call_malloc_nursery_varsize(self, op): + gc_ll_descr = self.cpu.gc_ll_descr + if not hasattr(gc_ll_descr, 'max_size_of_young_obj'): + raise Exception("unreachable code") + # for boehm, this function should never be called + arraydescr = op.getdescr() + length_box = op.getarg(2) + assert not isinstance(length_box, Const) # we cannot have a const here! + # can only use spill_or_move_registers_before_call() as a hint if + # we are sure that length_box stays alive and won't be freed now + # (it should always be the case, see below, but better safe than sorry) + if self.rm.stays_alive(length_box): + self.rm.spill_or_move_registers_before_call([r.x0, r.x1]) + # the result will be in r0 + self.rm.force_allocate_reg(op, selected_reg=r.x0) + # we need r1 as a temporary + tmp_box = TempVar() + self.rm.force_allocate_reg(tmp_box, selected_reg=r.x1) + gcmap = self.get_gcmap([r.x0, r.x1]) # allocate the gcmap *before* + self.rm.possibly_free_var(tmp_box) + # length_box always survives: it's typically also present in the + # next operation that will copy it inside the new array. It's + # fine to load it from the stack too, as long as it's != x0, x1. + lengthloc = self.rm.loc(length_box) + self.rm.possibly_free_var(length_box) + # + itemsize = op.getarg(1).getint() + maxlength = (gc_ll_descr.max_size_of_young_obj - WORD * 2) / itemsize + self.assembler.malloc_cond_varsize( + op.getarg(0).getint(), + gc_ll_descr.get_nursery_free_addr(), + gc_ll_descr.get_nursery_top_addr(), + lengthloc, itemsize, maxlength, gcmap, arraydescr) + + def force_allocate_reg(self, var, forbidden_vars=[], selected_reg=None): + if var.type == FLOAT: + return self.vfprm.force_allocate_reg(var, forbidden_vars, + selected_reg) + else: + return self.rm.force_allocate_reg(var, forbidden_vars, + selected_reg) + + def _check_invariants(self): + self.rm._check_invariants() + self.vfprm._check_invariants() + + def prepare_bridge(self, inputargs, arglocs, operations, allgcrefs, + frame_info): + operations = self._prepare(inputargs, operations, allgcrefs) + self._update_bindings(arglocs, inputargs) + return operations + + def _update_bindings(self, locs, inputargs): + used = {} + i = 0 + for loc in locs: + if loc is None: + loc = r.fp + arg = inputargs[i] + i += 1 + if loc.is_core_reg(): + self.rm.reg_bindings[arg] = loc + used[loc] = None + elif loc.is_vfp_reg(): + self.vfprm.reg_bindings[arg] = loc + used[loc] = None + else: + assert loc.is_stack() + self.frame_manager.bind(arg, loc) + + # XXX combine with x86 code and move to llsupport + self.rm.free_regs = [] + for reg in self.rm.all_regs: + if reg not in used: + self.rm.free_regs.append(reg) + self.vfprm.free_regs = [] + for reg in self.vfprm.all_regs: + if reg not in used: + self.vfprm.free_regs.append(reg) + # note: we need to make a copy of inputargs because possibly_free_vars + # is also used on op args, which is a non-resizable list + self.possibly_free_vars(list(inputargs)) + self.fm.finish_binding() + self._check_invariants() + + def get_gcmap(self, forbidden_regs=[], noregs=False): + frame_depth = self.fm.get_frame_depth() + gcmap = allocate_gcmap(self.assembler, + frame_depth, JITFRAME_FIXED_SIZE) + for box, loc in self.rm.reg_bindings.iteritems(): + if loc in forbidden_regs: + continue + if box.type == REF and self.rm.is_still_alive(box): + assert not noregs + assert loc.is_core_reg() + val = self.cpu.all_reg_indexes[loc.value] + gcmap[val // WORD // 8] |= r_uint(1) << (val % (WORD * 8)) + for box, loc in self.fm.bindings.iteritems(): + if box.type == REF and self.rm.is_still_alive(box): + assert loc.is_stack() + val = loc.position + JITFRAME_FIXED_SIZE + gcmap[val // WORD // 8] |= r_uint(1) << (val % (WORD * 8)) + return gcmap + + def get_final_frame_depth(self): + return self.frame_manager.get_frame_depth() + + +def notimplemented(self, op): + print "[ARM64/regalloc] %s not implemented" % op.getopname() + raise NotImplementedError(op) + +def notimplemented_guard_op(self, op, prevop): + print "[ARM64/regalloc] %s not implemented" % op.getopname() + raise NotImplementedError(op) + +def notimplemented_comp_op(self, op, res_in_cc): + print "[ARM64/regalloc] %s not implemented" % op.getopname() + raise NotImplementedError(op) + +operations = [notimplemented] * (rop._LAST + 1) +guard_operations = [notimplemented_guard_op] * (rop._LAST + 1) +comp_operations = [notimplemented_comp_op] * (rop._LAST + 1) + + +for key, value in rop.__dict__.items(): + key = key.lower() + if key.startswith('_'): + continue + methname = 'prepare_op_%s' % key + if hasattr(Regalloc, methname): + func = getattr(Regalloc, methname).im_func + operations[value] = func + methname = 'prepare_guard_op_%s' % key + if hasattr(Regalloc, methname): + func = getattr(Regalloc, methname).im_func + guard_operations[value] = func + methname = 'prepare_comp_op_%s' % key + if hasattr(Regalloc, methname): + func = getattr(Regalloc, methname).im_func + comp_operations[value] = func + diff -Nru pypy-7.1.1+dfsg/rpython/jit/backend/aarch64/registers.py pypy-7.3.1+dfsg/rpython/jit/backend/aarch64/registers.py --- pypy-7.1.1+dfsg/rpython/jit/backend/aarch64/registers.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/backend/aarch64/registers.py 2020-04-10 19:28:41.000000000 +0000 @@ -0,0 +1,36 @@ + +from rpython.jit.backend.aarch64.locations import (RegisterLocation, + ZeroRegister, VFPRegisterLocation) + + +registers = [RegisterLocation(i) for i in range(31)] +sp = xzr = ZeroRegister() +[x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, + x11, x12, x13, x14, x15, x16, x17, x18, x19, x20, + x21, x22, x23, x24, x25, x26, x27, x28, x29, x30] = registers + +vfpregisters = [VFPRegisterLocation(i) for i in range(32)] +all_vfp_regs = vfpregisters[:8] +all_regs = registers[:14]+ [x19, x20] #, x21, x22] + +lr = x30 +fp = x29 + +# scratch registers that we use internally, but don't save them +# nor we use them for regalloc +ip1 = x17 +ip0 = x16 +ip2 = x15 +ip3 = x14 # not used so far, but 'caller_resp' needs to be even-length anyway + +callee_saved_registers = [x19, x20] # , x21, x22] +vfp_argument_regs = caller_vfp_resp = all_vfp_regs[:8] +[d0, d1, d2, d3, d4, d5, d6, d7, d8, d9, d10, d11, d12, d13, d14, + d15, d16, d17, d18, d19, d20, d21, d22, d23, d24, d25, d26, d27, + d28, d29, d30, d31] = vfpregisters + +vfp_ip = d15 + +argument_regs = [x0, x1, x2, x3, x4, x5, x6, x7] +callee_resp = [x19, x20] # ,x21, x22] +caller_resp = argument_regs + [x8, x9, x10, x11, x12, x13] diff -Nru pypy-7.1.1+dfsg/rpython/jit/backend/aarch64/runner.py pypy-7.3.1+dfsg/rpython/jit/backend/aarch64/runner.py --- pypy-7.1.1+dfsg/rpython/jit/backend/aarch64/runner.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/backend/aarch64/runner.py 2020-04-10 19:28:41.000000000 +0000 @@ -0,0 +1,75 @@ + +from rpython.rtyper.lltypesystem import llmemory, lltype +from rpython.jit.backend.aarch64.assembler import AssemblerARM64 +from rpython.jit.backend.aarch64 import registers as r +from rpython.jit.backend.aarch64.regalloc import VFPRegisterManager +from rpython.jit.backend.llsupport.llmodel import AbstractLLCPU +from rpython.jit.backend.aarch64.codebuilder import InstrBuilder + +class CPU_ARM64(AbstractLLCPU): + """ARM 64""" + backend_name = "aarch64" + frame_reg = r.fp + all_reg_indexes = range(14) + [-1, -1, -1, -1, -1, 14, 15] + gen_regs = r.all_regs + float_regs = VFPRegisterManager.all_regs + supports_floats = True + + from rpython.jit.backend.aarch64.arch import JITFRAME_FIXED_SIZE + + IS_64_BIT = True + + def __init__(self, rtyper, stats, opts=None, translate_support_code=False, + gcdescr=None): + AbstractLLCPU.__init__(self, rtyper, stats, opts, + translate_support_code, gcdescr) + + def setup(self): + self.assembler = AssemblerARM64(self, self.translate_support_code) + + def setup_once(self): + self.assembler.setup_once() + + def compile_bridge(self, faildescr, inputargs, operations, + original_loop_token, log=True, logger=None): + clt = original_loop_token.compiled_loop_token + clt.compiling_a_bridge() + return self.assembler.assemble_bridge(logger, faildescr, inputargs, + operations, + original_loop_token, log=log) + + def redirect_call_assembler(self, oldlooptoken, newlooptoken): + self.assembler.redirect_call_assembler(oldlooptoken, newlooptoken) + + def invalidate_loop(self, looptoken): + """Activate all GUARD_NOT_INVALIDATED in the loop and its attached + bridges. Before this call, all GUARD_NOT_INVALIDATED do nothing; + after this call, they all fail. Note that afterwards, if one such + guard fails often enough, it has a bridge attached to it; it is + possible then to re-call invalidate_loop() on the same looptoken, + which must invalidate all newer GUARD_NOT_INVALIDATED, but not the + old one that already has a bridge attached to it.""" + for jmp, tgt in looptoken.compiled_loop_token.invalidate_positions: + mc = InstrBuilder() + mc.B_ofs(tgt) + mc.copy_to_raw_memory(jmp) + # positions invalidated + looptoken.compiled_loop_token.invalidate_positions = [] + + def cast_ptr_to_int(x): + adr = llmemory.cast_ptr_to_adr(x) + return CPU_ARM64.cast_adr_to_int(adr) + cast_ptr_to_int._annspecialcase_ = 'specialize:arglltype(0)' + cast_ptr_to_int = staticmethod(cast_ptr_to_int) + + def build_regalloc(self): + ''' for tests''' + from rpython.jit.backend.aarch64.regalloc import Regalloc + assert self.assembler is not None + return Regalloc(self.assembler) + + +for _i, _r in enumerate(r.all_regs): + assert CPU_ARM64.all_reg_indexes[_r.value] == _i +from rpython.jit.backend.aarch64 import arch +assert arch.NUM_MANAGED_REGS == len(r.all_regs) diff -Nru pypy-7.1.1+dfsg/rpython/jit/backend/aarch64/test/conftest.py pypy-7.3.1+dfsg/rpython/jit/backend/aarch64/test/conftest.py --- pypy-7.1.1+dfsg/rpython/jit/backend/aarch64/test/conftest.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/backend/aarch64/test/conftest.py 2020-04-10 19:28:41.000000000 +0000 @@ -0,0 +1,13 @@ +""" +This disables the backend tests on non ARMv7 platforms. +Note that you need "--slow" to run translation tests. +""" +import py, os +from rpython.jit.backend import detect_cpu + +cpu = detect_cpu.autodetect() + +def pytest_collect_directory(path, parent): + if not cpu.startswith('aarch64'): + py.test.skip("AARCH64 tests skipped: cpu is %r" % (cpu,)) +pytest_collect_file = pytest_collect_directory diff -Nru pypy-7.1.1+dfsg/rpython/jit/backend/aarch64/test/gen.py pypy-7.3.1+dfsg/rpython/jit/backend/aarch64/test/gen.py --- pypy-7.1.1+dfsg/rpython/jit/backend/aarch64/test/gen.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/backend/aarch64/test/gen.py 2020-04-10 19:28:41.000000000 +0000 @@ -0,0 +1,51 @@ +import os +from rpython.tool.udir import udir +import tempfile + +class ASMInstruction(object): + + asm_opts = '-march=armv8-a' + body = """.section .text +_start: .global _start + .global main + b main +main: + .ascii "START " + %s + .ascii "END " +""" + begin_tag = 'START ' + end_tag = 'END ' + base_name = 'test_%d.asm' + index = 0 + + def __init__(self, instr): + self.instr = instr + self.file = udir.join(self.base_name % self.index) + while self.file.check(): + self.index += 1 + self.file = udir.join(self.base_name % self.index) + + def encode(self): + f = open("%s/a.out" % (udir),'rb') + data = f.read() + f.close() + i = data.find(self.begin_tag) + assert i>=0 + j = data.find(self.end_tag, i) + assert j>=0 + as_code = data[i+len(self.begin_tag):j] + return as_code + + def assemble(self, *args): + res = self.body % (self.instr) + self.file.write(res) + os.system("as --fatal-warnings %s %s -o %s/a.out" % (self.asm_opts, self.file, udir)) + + #def __del__(self): + # self.file.close() + +def assemble(instr): + a = ASMInstruction(instr) + a.assemble(instr) + return a.encode() diff -Nru pypy-7.1.1+dfsg/rpython/jit/backend/aarch64/test/test_basic.py pypy-7.3.1+dfsg/rpython/jit/backend/aarch64/test/test_basic.py --- pypy-7.1.1+dfsg/rpython/jit/backend/aarch64/test/test_basic.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/backend/aarch64/test/test_basic.py 2020-04-10 19:28:41.000000000 +0000 @@ -0,0 +1,42 @@ +import py +from rpython.jit.metainterp.test import test_ajit +from rpython.rlib.jit import JitDriver +from rpython.jit.metainterp.test.support import LLJitMixin +from rpython.jit.backend.detect_cpu import getcpuclass + +class JitAarch64Mixin(LLJitMixin): + CPUClass = getcpuclass() + # we have to disable unroll + enable_opts = "intbounds:rewrite:virtualize:string:earlyforce:pure:heap" + basic = False + + def check_jumps(self, maxcount): + pass + +class TestBasic(JitAarch64Mixin, test_ajit.BaseLLtypeTests): + # for the individual tests see + # ====> ../../../metainterp/test/test_ajit.py + def test_bug(self): + jitdriver = JitDriver(greens = [], reds = ['n']) + class X(object): + pass + def f(n): + while n > -100: + jitdriver.can_enter_jit(n=n) + jitdriver.jit_merge_point(n=n) + x = X() + x.arg = 5 + if n <= 0: break + n -= x.arg + x.arg = 6 # prevents 'x.arg' from being annotated as constant + return n + res = self.meta_interp(f, [31], enable_opts='') + assert res == -4 + + def test_r_dict(self): + # a Struct that belongs to the hash table is not seen as being + # included in the larger Array + py.test.skip("issue with ll2ctypes") + + def test_free_object(self): + py.test.skip("issue of freeing, probably with ll2ctypes") diff -Nru pypy-7.1.1+dfsg/rpython/jit/backend/aarch64/test/test_calling_convention.py pypy-7.3.1+dfsg/rpython/jit/backend/aarch64/test/test_calling_convention.py --- pypy-7.1.1+dfsg/rpython/jit/backend/aarch64/test/test_calling_convention.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/backend/aarch64/test/test_calling_convention.py 2020-04-10 19:28:41.000000000 +0000 @@ -0,0 +1,28 @@ +import py + +from rpython.rtyper.annlowlevel import llhelper +from rpython.jit.metainterp.history import JitCellToken +from rpython.jit.backend.test.calling_convention_test import CallingConvTests, parse +from rpython.rtyper.lltypesystem import lltype +from rpython.jit.codewriter.effectinfo import EffectInfo + +from rpython.jit.backend.aarch64.codebuilder import InstrBuilder +from rpython.jit.backend.aarch64 import registers as r +from rpython.jit.backend.aarch64.test.test_runner import boxfloat, constfloat +from rpython.jit.metainterp.resoperation import rop, InputArgInt, InputArgFloat +from rpython.jit.metainterp.history import JitCellToken + +boxint = InputArgInt +boxfloat = InputArgFloat.fromfloat + +class TestARMCallingConvention(CallingConvTests): + # ../../test/calling_convention_test.py + + def make_function_returning_stack_pointer(self): + mc = InstrBuilder() + mc.MOV_rr(r.x0.value, r.sp.value) + mc.RET_r(r.lr.value) + return mc.materialize(self.cpu, []) + + def get_alignment_requirements(self): + return 16 diff -Nru pypy-7.1.1+dfsg/rpython/jit/backend/aarch64/test/test_call.py pypy-7.3.1+dfsg/rpython/jit/backend/aarch64/test/test_call.py --- pypy-7.1.1+dfsg/rpython/jit/backend/aarch64/test/test_call.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/backend/aarch64/test/test_call.py 2020-04-10 19:28:41.000000000 +0000 @@ -0,0 +1,7 @@ +from rpython.jit.backend.aarch64.test.test_basic import JitAarch64Mixin +from rpython.jit.metainterp.test import test_call + +class TestCall(JitAarch64Mixin, test_call.CallTest): + # for the individual tests see + # ====> ../../../metainterp/test/test_call.py + pass diff -Nru pypy-7.1.1+dfsg/rpython/jit/backend/aarch64/test/test_del.py pypy-7.3.1+dfsg/rpython/jit/backend/aarch64/test/test_del.py --- pypy-7.1.1+dfsg/rpython/jit/backend/aarch64/test/test_del.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/backend/aarch64/test/test_del.py 2020-04-10 19:28:41.000000000 +0000 @@ -0,0 +1,8 @@ + +from rpython.jit.backend.aarch64.test.test_basic import JitAarch64Mixin +from rpython.jit.metainterp.test.test_del import DelTests + +class TestDel(JitAarch64Mixin, DelTests): + # for the individual tests see + # ====> ../../../metainterp/test/test_del.py + pass diff -Nru pypy-7.1.1+dfsg/rpython/jit/backend/aarch64/test/test_dict.py pypy-7.3.1+dfsg/rpython/jit/backend/aarch64/test/test_dict.py --- pypy-7.1.1+dfsg/rpython/jit/backend/aarch64/test/test_dict.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/backend/aarch64/test/test_dict.py 2020-04-10 19:28:41.000000000 +0000 @@ -0,0 +1,9 @@ + +from rpython.jit.backend.aarch64.test.test_basic import JitAarch64Mixin +from rpython.jit.metainterp.test.test_dict import DictTests + + +class TestDict(JitAarch64Mixin, DictTests): + # for the individual tests see + # ====> ../../../metainterp/test/test_dict.py + pass diff -Nru pypy-7.1.1+dfsg/rpython/jit/backend/aarch64/test/test_exception.py pypy-7.3.1+dfsg/rpython/jit/backend/aarch64/test/test_exception.py --- pypy-7.1.1+dfsg/rpython/jit/backend/aarch64/test/test_exception.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/backend/aarch64/test/test_exception.py 2020-04-10 19:28:41.000000000 +0000 @@ -0,0 +1,11 @@ + +import py +from rpython.jit.backend.aarch64.test.test_basic import JitAarch64Mixin +from rpython.jit.metainterp.test.test_exception import ExceptionTests + +class TestExceptions(JitAarch64Mixin, ExceptionTests): + # for the individual tests see + # ====> ../../../metainterp/test/test_exception.py + + def test_bridge_from_interpreter_exc(self): + py.test.skip("Widening to trash") diff -Nru pypy-7.1.1+dfsg/rpython/jit/backend/aarch64/test/test_fficall.py pypy-7.3.1+dfsg/rpython/jit/backend/aarch64/test/test_fficall.py --- pypy-7.1.1+dfsg/rpython/jit/backend/aarch64/test/test_fficall.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/backend/aarch64/test/test_fficall.py 2020-04-10 19:28:41.000000000 +0000 @@ -0,0 +1,23 @@ +import py +from rpython.jit.metainterp.test import test_fficall +from rpython.jit.backend.aarch64.test.test_basic import JitAarch64Mixin + +class TestFfiCall(JitAarch64Mixin, test_fficall.FfiCallTests): + # for the individual tests see + # ====> ../../../metainterp/test/test_fficall.py + + def _add_libffi_types_to_ll2types_maybe(self): + # this is needed by test_guard_not_forced_fails, because it produces a + # loop which reads the value of types.* in a variable, then a guard + # fail and we switch to blackhole: the problem is that at this point + # the blackhole interp has a real integer, but it needs to convert it + # back to a lltype pointer (which is handled by ll2ctypes, deeply in + # the logic). The workaround is to teach ll2ctypes in advance which + # are the addresses of the various types.* structures. + # Try to comment this code out and run the test to see how it fails :) + from rpython.rtyper.lltypesystem import rffi, lltype, ll2ctypes + from rpython.rlib.jit_libffi import types + for key, value in types.__dict__.iteritems(): + if isinstance(value, lltype._ptr): + addr = rffi.cast(lltype.Signed, value) + ll2ctypes._int2obj[addr] = value diff -Nru pypy-7.1.1+dfsg/rpython/jit/backend/aarch64/test/test_float.py pypy-7.3.1+dfsg/rpython/jit/backend/aarch64/test/test_float.py --- pypy-7.1.1+dfsg/rpython/jit/backend/aarch64/test/test_float.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/backend/aarch64/test/test_float.py 2020-04-10 19:28:41.000000000 +0000 @@ -0,0 +1,9 @@ + +import py +from rpython.jit.backend.aarch64.test.test_basic import JitAarch64Mixin +from rpython.jit.metainterp.test.test_float import FloatTests + +class TestFloat(JitAarch64Mixin, FloatTests): + # for the individual tests see + # ====> ../../../metainterp/test/test_float.py + pass diff -Nru pypy-7.1.1+dfsg/rpython/jit/backend/aarch64/test/test_instr_builder.py pypy-7.3.1+dfsg/rpython/jit/backend/aarch64/test/test_instr_builder.py --- pypy-7.1.1+dfsg/rpython/jit/backend/aarch64/test/test_instr_builder.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/backend/aarch64/test/test_instr_builder.py 2020-04-10 19:28:41.000000000 +0000 @@ -0,0 +1,189 @@ +from hypothesis import given, settings, strategies as st, assume +from rpython.jit.backend.aarch64 import registers as r +from rpython.jit.backend.aarch64 import codebuilder +from rpython.jit.backend.aarch64.test.gen import assemble + +class CodeBuilder(codebuilder.InstrBuilder): + def __init__(self, arch_version=7): + self.arch_version = arch_version + self.buffer = [] + + def writechar(self, char): + self.buffer.append(char) + + def currpos(self): + return 0 + + def hexdump(self): + return ''.join(self.buffer) + + +class TestInstrBuilder(object): + + @settings(max_examples=20) + @given(r1=st.sampled_from(r.registers)) + def test_RET_r(self, r1): + cb = CodeBuilder() + cb.RET_r(r1.value) + res = cb.hexdump() + exp = assemble('RET %r' % r1) + assert res == exp + + @settings(max_examples=20) + @given(r1=st.sampled_from(r.registers), + r2=st.sampled_from(r.registers), + offset=st.integers(min_value=-64, max_value=63)) + def test_STP_rr(self, r1, r2, offset): + cb = CodeBuilder() + cb.STP_rr_preindex(r1.value, r2.value, r.sp.value, offset * 8) + assert cb.hexdump() == assemble("STP %r, %r, [sp, %d]!" % (r1, r2, offset * 8)) + cb = CodeBuilder() + cb.STP_rri(r1.value, r2.value, r.sp.value, offset * 8) + assert cb.hexdump() == assemble("STP %r, %r, [sp, %d]" % (r1, r2, offset * 8)) + + @settings(max_examples=20) + @given(r1=st.sampled_from(r.registers), + r2=st.sampled_from(r.registers)) + def test_MOV_rr(self, r1, r2): + cb = CodeBuilder() + cb.MOV_rr(r1.value, r2.value) + assert cb.hexdump() == assemble("MOV %r, %r" % (r1, r2)) + + @settings(max_examples=20) + @given(r1=st.sampled_from(r.registers), + immed=st.integers(min_value=0, max_value=(1<<16) - 1), + shift=st.integers(min_value=0, max_value=3)) + def test_MOVK(self, r1, immed, shift): + cb = CodeBuilder() + cb.MOVK_r_u16(r1.value, immed, shift * 16) + assert cb.hexdump() == assemble("MOVK %r, %d, lsl %d" % (r1, immed, shift * 16)) + + @settings(max_examples=20) + @given(r1=st.sampled_from(r.registers), + immed=st.integers(min_value=0, max_value=(1<<16) - 1), + shift=st.integers(min_value=0, max_value=3)) + def test_MOVZ(self, r1, immed, shift): + cb = CodeBuilder() + cb.MOVZ_r_u16(r1.value, immed, shift * 16) + assert cb.hexdump() == assemble("MOVZ %r, %d, lsl %d" % (r1, immed, shift * 16)) + + @settings(max_examples=20) + @given(r1=st.sampled_from(r.registers), + immed=st.integers(min_value=0, max_value=(1<<16) - 1)) + def test_MOVN(self, r1, immed): + cb = CodeBuilder() + cb.MOVN_r_u16(r1.value, immed) + assert cb.hexdump() == assemble("MOV %r, %d" % (r1, ~immed)) + + @settings(max_examples=20) + @given(rt=st.sampled_from(r.registers), + rn=st.sampled_from(r.registers), + offset=st.integers(min_value=0, max_value=(1<<12)-1)) + def test_STR_ri(self, rt, rn, offset): + cb = CodeBuilder() + cb.STR_ri(rt.value, rn.value, offset * 8) + assert cb.hexdump() == assemble("STR %r, [%r, %d]" % (rt, rn, offset * 8)) + + @settings(max_examples=20) + @given(reg1=st.sampled_from(r.registers), + reg2=st.sampled_from(r.registers), + rn=st.sampled_from(r.registers), + offset=st.integers(min_value=-64, max_value=63)) + def test_LDP_rr(self, reg1, reg2, rn, offset): + assume(reg1.value != reg2.value) + cb = CodeBuilder() + cb.LDP_rri(reg1.value, reg2.value, rn.value, offset * 8) + assert cb.hexdump() == assemble("LDP %r, %r, [%r, %d]" % (reg1, reg2, rn, offset * 8)) + # + assume(rn.value != reg1.value) + assume(rn.value != reg2.value) + cb = CodeBuilder() + cb.LDP_rr_postindex(reg1.value, reg2.value, rn.value, offset * 8) + assert cb.hexdump() == assemble("LDP %r, %r, [%r], %d" % (reg1, reg2, rn, offset * 8)) + + @settings(max_examples=20) + @given(rt=st.sampled_from(r.registers), + rn=st.sampled_from(r.registers), + offset=st.integers(min_value=0, max_value=(1<<12)-1)) + def test_LDR_ri(self, rt, rn, offset): + cb = CodeBuilder() + cb.LDR_ri(rt.value, rn.value, offset * 8) + assert cb.hexdump() == assemble("LDR %r, [%r, %d]" % (rt, rn, offset * 8)) + + @settings(max_examples=20) + @given(rt=st.sampled_from(r.registers), + offset=st.integers(min_value=-(1<<18), max_value=(1<<18)-1)) + def test_LDR_r_literal(self, rt, offset): + cb = CodeBuilder() + cb.LDR_r_literal(rt.value, offset * 4) + assert cb.hexdump() == assemble("LDR %r, %d" % (rt, offset * 4)) + + @settings(max_examples=20) + @given(rd=st.sampled_from(r.registers), + rn=st.sampled_from(r.registers), + rm=st.sampled_from(r.registers)) + def test_ADD_rr(self, rd, rn, rm): + cb = CodeBuilder() + cb.ADD_rr(rd.value, rn.value, rm.value) + assert cb.hexdump() == assemble("ADD %r, %r, %r" % (rd, rn, rm)) + + @settings(max_examples=20) + @given(rd=st.sampled_from(r.registers), + rn=st.sampled_from(r.registers), + imm=st.integers(min_value=0, max_value=(1<<12)-1)) + def test_ADD_ri(self, rd, rn, imm): + cb = CodeBuilder() + cb.ADD_ri(rd.value, rn.value, imm) + assert cb.hexdump() == assemble("ADD %r, %r, %d" % (rd, rn, imm)) + + @settings(max_examples=20) + @given(rd=st.sampled_from(r.registers), + rn=st.sampled_from(r.registers), + ofs=st.integers(min_value=0, max_value=4095)) + def test_SUB_ri(self, rd, rn, ofs): + cb = CodeBuilder() + cb.SUB_ri(rd.value, rn.value, ofs) + assert cb.hexdump() == assemble("SUB %r, %r, %d" % (rd, rn, ofs)) + + @settings(max_examples=20) + @given(rn=st.sampled_from(r.registers), + rm=st.sampled_from(r.registers)) + def test_CMP_rr(self, rn, rm): + cb = CodeBuilder() + cb.CMP_rr(rn.value, rm.value) + assert cb.hexdump() == assemble("CMP %r, %r" % (rn, rm)) + + def test_BRK(self): + cb = CodeBuilder() + cb.BRK() + assert cb.hexdump() == assemble("BRK 0") + + def test_STLR(self): + cb = CodeBuilder() + cb.STLR(r.x11.value, r.x22.value) + assert cb.hexdump() == assemble("STLR x11, [x22]") + + def test_LDXR(self): + cb = CodeBuilder() + cb.LDXR(r.x11.value, r.x22.value) + assert cb.hexdump() == assemble("LDXR x11, [x22]") + + def test_STXR(self): + cb = CodeBuilder() + cb.STXR(r.x6.value, r.x11.value, r.x22.value) + assert cb.hexdump() == assemble("STXR w6, x11, [x22]") + + def test_CBNZ(self): + cb = CodeBuilder() + cb.CBNZ(r.x6.value, -8) + assert cb.hexdump() == assemble("CBNZ x6, -8") + + def test_CBNZ_w(self): + cb = CodeBuilder() + cb.CBNZ_w(r.x6.value, -8) + assert cb.hexdump() == assemble("CBNZ w6, -8") + + def test_CBZ(self): + cb = CodeBuilder() + cb.CBZ(r.x25.value, -888) + assert cb.hexdump() == assemble("CBZ x25, -888") diff -Nru pypy-7.1.1+dfsg/rpython/jit/backend/aarch64/test/test_jitlog.py pypy-7.3.1+dfsg/rpython/jit/backend/aarch64/test/test_jitlog.py --- pypy-7.1.1+dfsg/rpython/jit/backend/aarch64/test/test_jitlog.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/backend/aarch64/test/test_jitlog.py 2020-04-10 19:28:41.000000000 +0000 @@ -0,0 +1,8 @@ + +from rpython.jit.backend.aarch64.test.test_basic import JitAarch64Mixin +from rpython.jit.backend.test.jitlog_test import LoggerTest + +class TestJitlog(JitAarch64Mixin, LoggerTest): + # for the individual tests see + # ====> ../../../test/jitlog_test.py + pass diff -Nru pypy-7.1.1+dfsg/rpython/jit/backend/aarch64/test/test_list.py pypy-7.3.1+dfsg/rpython/jit/backend/aarch64/test/test_list.py --- pypy-7.1.1+dfsg/rpython/jit/backend/aarch64/test/test_list.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/backend/aarch64/test/test_list.py 2020-04-10 19:28:41.000000000 +0000 @@ -0,0 +1,8 @@ + +from rpython.jit.metainterp.test.test_list import ListTests +from rpython.jit.backend.aarch64.test.test_basic import JitAarch64Mixin + +class TestList(JitAarch64Mixin, ListTests): + # for individual tests see + # ====> ../../../metainterp/test/test_list.py + pass diff -Nru pypy-7.1.1+dfsg/rpython/jit/backend/aarch64/test/test_llop.py pypy-7.3.1+dfsg/rpython/jit/backend/aarch64/test/test_llop.py --- pypy-7.1.1+dfsg/rpython/jit/backend/aarch64/test/test_llop.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/backend/aarch64/test/test_llop.py 2020-04-10 19:28:41.000000000 +0000 @@ -0,0 +1,14 @@ +from rpython.jit.backend.aarch64.test.test_basic import JitAarch64Mixin +from rpython.jit.metainterp.test.test_llop import TestLLOp as _TestLLOp + + +class TestLLOp(JitAarch64Mixin, _TestLLOp): + # for the individual tests see + # ====> ../../../metainterp/test/test_llop.py + + # do NOT test the blackhole implementation of gc_store_indexed. It cannot + # work inside tests because llmodel.py:bh_gc_store_indexed_* receive a + # symbolic as the offset. It is not a problem because it is tested anyway + # by the same test in test_metainterp.py + TEST_BLACKHOLE = False + diff -Nru pypy-7.1.1+dfsg/rpython/jit/backend/aarch64/test/test_loop_unroll.py pypy-7.3.1+dfsg/rpython/jit/backend/aarch64/test/test_loop_unroll.py --- pypy-7.1.1+dfsg/rpython/jit/backend/aarch64/test/test_loop_unroll.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/backend/aarch64/test/test_loop_unroll.py 2020-04-10 19:28:41.000000000 +0000 @@ -0,0 +1,8 @@ +import py +from rpython.jit.backend.x86.test.test_basic import Jit386Mixin +from rpython.jit.metainterp.test import test_loop_unroll + +class TestLoopSpec(Jit386Mixin, test_loop_unroll.LoopUnrollTest): + # for the individual tests see + # ====> ../../../metainterp/test/test_loop.py + pass diff -Nru pypy-7.1.1+dfsg/rpython/jit/backend/aarch64/test/test_quasiimmut.py pypy-7.3.1+dfsg/rpython/jit/backend/aarch64/test/test_quasiimmut.py --- pypy-7.1.1+dfsg/rpython/jit/backend/aarch64/test/test_quasiimmut.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/backend/aarch64/test/test_quasiimmut.py 2020-04-10 19:28:41.000000000 +0000 @@ -0,0 +1,9 @@ + +import py +from rpython.jit.backend.aarch64.test.test_basic import JitAarch64Mixin +from rpython.jit.metainterp.test import test_quasiimmut + +class TestLoopSpec(JitAarch64Mixin, test_quasiimmut.QuasiImmutTests): + # for the individual tests see + # ====> ../../../metainterp/test/test_loop.py + pass diff -Nru pypy-7.1.1+dfsg/rpython/jit/backend/aarch64/test/test_rawmem.py pypy-7.3.1+dfsg/rpython/jit/backend/aarch64/test/test_rawmem.py --- pypy-7.1.1+dfsg/rpython/jit/backend/aarch64/test/test_rawmem.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/backend/aarch64/test/test_rawmem.py 2020-04-10 19:28:41.000000000 +0000 @@ -0,0 +1,9 @@ + +from rpython.jit.backend.aarch64.test.test_basic import JitAarch64Mixin +from rpython.jit.metainterp.test.test_rawmem import RawMemTests + + +class TestRawMem(JitAarch64Mixin, RawMemTests): + # for the individual tests see + # ====> ../../../metainterp/test/test_rawmem.py + pass diff -Nru pypy-7.1.1+dfsg/rpython/jit/backend/aarch64/test/test_recursive.py pypy-7.3.1+dfsg/rpython/jit/backend/aarch64/test/test_recursive.py --- pypy-7.1.1+dfsg/rpython/jit/backend/aarch64/test/test_recursive.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/backend/aarch64/test/test_recursive.py 2020-04-10 19:28:41.000000000 +0000 @@ -0,0 +1,28 @@ + +import py +from rpython.jit.metainterp.test.test_recursive import RecursiveTests +from rpython.jit.backend.aarch64.test.test_basic import JitAarch64Mixin +from rpython.jit.backend.llsupport.codemap import unpack_traceback + +class TestRecursive(JitAarch64Mixin, RecursiveTests): + # for the individual tests see + # ====> ../../../metainterp/test/test_recursive.py + def check_get_unique_id(self, codemaps): + py.test.skip("later") + assert len(codemaps) == 3 + # we want to create a map of differences, so unpacking the tracebacks + # byte by byte + codemaps.sort(lambda a, b: cmp(a[1], b[1])) + # biggest is the big loop, smallest is the bridge + def get_ranges(c): + ranges = [] + prev_traceback = None + for b in range(c[0], c[0] + c[1]): + tb = unpack_traceback(b) + if tb != prev_traceback: + ranges.append(tb) + prev_traceback = tb + return ranges + assert get_ranges(codemaps[2]) == [[4], [4, 2], [4]] + assert get_ranges(codemaps[1]) == [[2]] + assert get_ranges(codemaps[0]) == [[2], []] diff -Nru pypy-7.1.1+dfsg/rpython/jit/backend/aarch64/test/test_runner.py pypy-7.3.1+dfsg/rpython/jit/backend/aarch64/test/test_runner.py --- pypy-7.1.1+dfsg/rpython/jit/backend/aarch64/test/test_runner.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/backend/aarch64/test/test_runner.py 2020-04-10 19:28:41.000000000 +0000 @@ -0,0 +1,37 @@ +import py +from rpython.jit.backend.detect_cpu import getcpuclass +from rpython.jit.backend.test.runner_test import LLtypeBackendTest,\ + boxfloat, constfloat +from rpython.jit.metainterp.history import BasicFailDescr, BasicFinalDescr +from rpython.jit.metainterp.resoperation import (ResOperation, rop, + InputArgInt) +from rpython.jit.tool.oparser import parse +from rpython.rtyper.lltypesystem import lltype, llmemory +from rpython.rtyper import rclass +from rpython.rtyper.annlowlevel import llhelper +from rpython.jit.codewriter.effectinfo import EffectInfo +from rpython.jit.metainterp.history import JitCellToken, TargetToken +from rpython.jit.codewriter import longlong + + +CPU = getcpuclass() + +class FakeStats(object): + pass + + +class TestARM64(LLtypeBackendTest): + + # for the individual tests see + # ====> ../../test/runner_test.py + + add_loop_instructions = 'ldr; add; cmp; b.eq; b; brk;' + bridge_loop_instructions = ('ldr; mov; nop; nop; nop; ' + 'cmp; b.ge; sub; str; mov; (movk; )*' + 'str; mov; (movk; )*blr; ' + 'mov; (movk; )*br; brk;') + + def get_cpu(self): + cpu = CPU(rtyper=None, stats=FakeStats()) + cpu.setup_once() + return cpu diff -Nru pypy-7.1.1+dfsg/rpython/jit/backend/aarch64/test/test_send.py pypy-7.3.1+dfsg/rpython/jit/backend/aarch64/test/test_send.py --- pypy-7.1.1+dfsg/rpython/jit/backend/aarch64/test/test_send.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/backend/aarch64/test/test_send.py 2020-04-10 19:28:41.000000000 +0000 @@ -0,0 +1,19 @@ + +import py +from rpython.jit.metainterp.test.test_send import SendTests +from rpython.jit.backend.aarch64.test.test_basic import JitAarch64Mixin +from rpython.rlib import jit + +class TestSend(JitAarch64Mixin, SendTests): + # for the individual tests see + # ====> ../../../metainterp/test/test_send.py + def test_call_with_additional_args(self): + @jit.dont_look_inside + def externfn(a, b, c, d): + return a + b*10 + c*100 + d*1000 + def f(a, b, c, d): + return externfn(a, b, c, d) + res = self.interp_operations(f, [1, 2, 3, 4]) + assert res == 4321 + + diff -Nru pypy-7.1.1+dfsg/rpython/jit/backend/aarch64/test/test_slist.py pypy-7.3.1+dfsg/rpython/jit/backend/aarch64/test/test_slist.py --- pypy-7.1.1+dfsg/rpython/jit/backend/aarch64/test/test_slist.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/backend/aarch64/test/test_slist.py 2020-04-10 19:28:41.000000000 +0000 @@ -0,0 +1,9 @@ +import py +from rpython.jit.metainterp.test import test_slist +from rpython.jit.backend.aarch64.test.test_basic import JitAarch64Mixin + +class TestSList(JitAarch64Mixin, test_slist.ListTests): + # for the individual tests see + # ====> ../../../metainterp/test/test_slist.py + def test_list_of_voids(self): + py.test.skip("list of voids unsupported by ll2ctypes") diff -Nru pypy-7.1.1+dfsg/rpython/jit/backend/aarch64/test/test_string.py pypy-7.3.1+dfsg/rpython/jit/backend/aarch64/test/test_string.py --- pypy-7.1.1+dfsg/rpython/jit/backend/aarch64/test/test_string.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/backend/aarch64/test/test_string.py 2020-04-10 19:28:41.000000000 +0000 @@ -0,0 +1,13 @@ +import py +from rpython.jit.metainterp.test import test_string +from rpython.jit.backend.aarch64.test.test_basic import JitAarch64Mixin + +class TestString(JitAarch64Mixin, test_string.TestLLtype): + # for the individual tests see + # ====> ../../../metainterp/test/test_string.py + pass + +class TestUnicode(JitAarch64Mixin, test_string.TestLLtypeUnicode): + # for the individual tests see + # ====> ../../../metainterp/test/test_string.py + pass diff -Nru pypy-7.1.1+dfsg/rpython/jit/backend/aarch64/test/test_tlc.py pypy-7.3.1+dfsg/rpython/jit/backend/aarch64/test/test_tlc.py --- pypy-7.1.1+dfsg/rpython/jit/backend/aarch64/test/test_tlc.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/backend/aarch64/test/test_tlc.py 2020-04-10 19:28:41.000000000 +0000 @@ -0,0 +1,27 @@ + +import py +from rpython.jit.backend.aarch64.test.test_basic import JitAarch64Mixin +from rpython.jit.metainterp.test.test_tlc import TLCTests +from rpython.jit.tl import tlc + +class TestTL(JitAarch64Mixin, TLCTests): + # for the individual tests see + # ====> ../../test/test_tlc.py + + def test_accumulator(self): + py.test.skip("investigate, maybe") + path = py.path.local(tlc.__file__).dirpath('accumulator.tlc.src') + code = path.read() + res = self.exec_code(code, 20) + assert res == sum(range(20)) + res = self.exec_code(code, -10) + assert res == 10 + + def test_fib(self): + py.test.skip("investigate, maybe") + path = py.path.local(tlc.__file__).dirpath('fibo.tlc.src') + code = path.read() + res = self.exec_code(code, 7) + assert res == 13 + res = self.exec_code(code, 20) + assert res == 6765 diff -Nru pypy-7.1.1+dfsg/rpython/jit/backend/aarch64/test/test_tl.py pypy-7.3.1+dfsg/rpython/jit/backend/aarch64/test/test_tl.py --- pypy-7.1.1+dfsg/rpython/jit/backend/aarch64/test/test_tl.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/backend/aarch64/test/test_tl.py 2020-04-10 19:28:41.000000000 +0000 @@ -0,0 +1,10 @@ + +import py +from rpython.jit.metainterp.test.test_tl import ToyLanguageTests +from rpython.jit.backend.aarch64.test.test_basic import JitAarch64Mixin + +class TestTL(JitAarch64Mixin, ToyLanguageTests): + # for the individual tests see + # ====> ../../../metainterp/test/test_tl.py + pass + diff -Nru pypy-7.1.1+dfsg/rpython/jit/backend/aarch64/test/test_virtualizable.py pypy-7.3.1+dfsg/rpython/jit/backend/aarch64/test/test_virtualizable.py --- pypy-7.1.1+dfsg/rpython/jit/backend/aarch64/test/test_virtualizable.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/backend/aarch64/test/test_virtualizable.py 2020-04-10 19:28:41.000000000 +0000 @@ -0,0 +1,8 @@ + +import py +from rpython.jit.metainterp.test.test_virtualizable import ImplicitVirtualizableTests +from rpython.jit.backend.aarch64.test.test_basic import JitAarch64Mixin + +class TestVirtualizable(JitAarch64Mixin, ImplicitVirtualizableTests): + def test_blackhole_should_not_reenter(self): + py.test.skip("Assertion error & llinterp mess") diff -Nru pypy-7.1.1+dfsg/rpython/jit/backend/aarch64/test/test_virtual.py pypy-7.3.1+dfsg/rpython/jit/backend/aarch64/test/test_virtual.py --- pypy-7.1.1+dfsg/rpython/jit/backend/aarch64/test/test_virtual.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/backend/aarch64/test/test_virtual.py 2020-04-10 19:28:41.000000000 +0000 @@ -0,0 +1,20 @@ +from rpython.jit.metainterp.test.test_virtual import VirtualTests, VirtualMiscTests +from rpython.jit.backend.aarch64.test.test_basic import JitAarch64Mixin + +class MyClass: + pass + +class TestsVirtual(JitAarch64Mixin, VirtualTests): + # for the individual tests see + # ====> ../../../metainterp/test/test_virtual.py + _new_op = 'new_with_vtable' + _field_prefix = 'inst_' + + @staticmethod + def _new(): + return MyClass() + +class TestsVirtualMisc(JitAarch64Mixin, VirtualMiscTests): + # for the individual tests see + # ====> ../../../metainterp/test/test_virtual.py + pass diff -Nru pypy-7.1.1+dfsg/rpython/jit/backend/aarch64/test/test_virtualref.py pypy-7.3.1+dfsg/rpython/jit/backend/aarch64/test/test_virtualref.py --- pypy-7.1.1+dfsg/rpython/jit/backend/aarch64/test/test_virtualref.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/backend/aarch64/test/test_virtualref.py 2020-04-10 19:28:41.000000000 +0000 @@ -0,0 +1,8 @@ + +from rpython.jit.metainterp.test.test_virtualref import VRefTests +from rpython.jit.backend.aarch64.test.test_basic import JitAarch64Mixin + +class TestVRef(JitAarch64Mixin, VRefTests): + # for the individual tests see + # ====> ../../../metainterp/test/test_virtualref.py + pass diff -Nru pypy-7.1.1+dfsg/rpython/jit/backend/aarch64/test/test_zrpy_gc_boehm.py pypy-7.3.1+dfsg/rpython/jit/backend/aarch64/test/test_zrpy_gc_boehm.py --- pypy-7.1.1+dfsg/rpython/jit/backend/aarch64/test/test_zrpy_gc_boehm.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/backend/aarch64/test/test_zrpy_gc_boehm.py 2020-04-10 19:28:41.000000000 +0000 @@ -0,0 +1 @@ +from rpython.jit.backend.llsupport.test.zrpy_gc_boehm_test import compile_boehm_test as test_compile_boehm diff -Nru pypy-7.1.1+dfsg/rpython/jit/backend/aarch64/test/test_zrpy_gc.py pypy-7.3.1+dfsg/rpython/jit/backend/aarch64/test/test_zrpy_gc.py --- pypy-7.1.1+dfsg/rpython/jit/backend/aarch64/test/test_zrpy_gc.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/backend/aarch64/test/test_zrpy_gc.py 2020-04-10 19:28:41.000000000 +0000 @@ -0,0 +1,6 @@ +from rpython.jit.backend.llsupport.test.zrpy_gc_test import CompileFrameworkTests + + +class TestShadowStack(CompileFrameworkTests): + gcrootfinder = "shadowstack" + gc = "incminimark" diff -Nru pypy-7.1.1+dfsg/rpython/jit/backend/aarch64/test/test_zrpy_releasegil.py pypy-7.3.1+dfsg/rpython/jit/backend/aarch64/test/test_zrpy_releasegil.py --- pypy-7.1.1+dfsg/rpython/jit/backend/aarch64/test/test_zrpy_releasegil.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/backend/aarch64/test/test_zrpy_releasegil.py 2020-04-10 19:28:41.000000000 +0000 @@ -0,0 +1,5 @@ +from rpython.jit.backend.llsupport.test.zrpy_releasegil_test import ReleaseGILTests + + +class TestShadowStack(ReleaseGILTests): + gcrootfinder = "shadowstack" diff -Nru pypy-7.1.1+dfsg/rpython/jit/backend/aarch64/test/test_ztranslation_basic.py pypy-7.3.1+dfsg/rpython/jit/backend/aarch64/test/test_ztranslation_basic.py --- pypy-7.1.1+dfsg/rpython/jit/backend/aarch64/test/test_ztranslation_basic.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/backend/aarch64/test/test_ztranslation_basic.py 2020-04-10 19:28:41.000000000 +0000 @@ -0,0 +1,5 @@ +from rpython.jit.backend.llsupport.test.ztranslation_test import TranslationTest + + +class TestTranslationAarch64(TranslationTest): + pass diff -Nru pypy-7.1.1+dfsg/rpython/jit/backend/aarch64/test/test_ztranslation_call_assembler.py pypy-7.3.1+dfsg/rpython/jit/backend/aarch64/test/test_ztranslation_call_assembler.py --- pypy-7.1.1+dfsg/rpython/jit/backend/aarch64/test/test_ztranslation_call_assembler.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/backend/aarch64/test/test_ztranslation_call_assembler.py 2020-04-10 19:28:41.000000000 +0000 @@ -0,0 +1,15 @@ +from rpython.jit.backend.llsupport.test.ztranslation_test import TranslationTestCallAssembler +import sys + + +# On Windows, this test crashes obscurely, but only if compiled with +# Boehm, not if run with no GC at all. So for now we'll assume it is +# really a Boehm bug, or maybe a Boehm-on-Windows-specific issue, and +# skip. +if sys.platform == 'win32': + import py + py.test.skip("crashes on Windows (Boehm issue?)") + + +class TestTranslationCallAssemblerAarch64(TranslationTestCallAssembler): + pass diff -Nru pypy-7.1.1+dfsg/rpython/jit/backend/aarch64/test/test_ztranslation_jit_stats.py pypy-7.3.1+dfsg/rpython/jit/backend/aarch64/test/test_ztranslation_jit_stats.py --- pypy-7.1.1+dfsg/rpython/jit/backend/aarch64/test/test_ztranslation_jit_stats.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/backend/aarch64/test/test_ztranslation_jit_stats.py 2020-04-10 19:28:41.000000000 +0000 @@ -0,0 +1,5 @@ +from rpython.jit.backend.llsupport.test.ztranslation_test import TranslationTestJITStats + + +class TestTranslationJITStatsAarch64(TranslationTestJITStats): + pass \ No newline at end of file diff -Nru pypy-7.1.1+dfsg/rpython/jit/backend/aarch64/TODO pypy-7.3.1+dfsg/rpython/jit/backend/aarch64/TODO --- pypy-7.1.1+dfsg/rpython/jit/backend/aarch64/TODO 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/backend/aarch64/TODO 2020-04-10 19:28:41.000000000 +0000 @@ -0,0 +1,35 @@ +* cond_call and following guard_exception + + +* We can try to make generate_quick_failure() emit two instructions less: + the two store_reg() [one in generate_quick_failure and the other in + push_gcmap]. Instead we'd load the values in ip2 and ip3, and the + store_regs would occur inside self.failure_recovery_code + (which 'target' points to). + + +* use STP instead of STR in all long sequences of STR. Same with LDR + +* use "STR xzr, [..]" instead of "gen_load_int(ip, 0); STR ip, [..]". + Search around for gen_load_int(...0): it occurs at least in pop_gcmap() + _build_failure_recovery(), build_frame_realloc_slowpath(), etc. + + +* malloc_cond() and malloc_cond_varsize_frame() hard-code forward jump + distances by guessing the number of instructions that follows. Bad + idea because some of these instructions could easily be optimized in + the future to be a bit shorter. Rewrite this two places to use the + proper way instead of a magic "40" (or at least assert that it was + really 40). + + +* use "CBNZ register, offset" (compare-and-branch-if-not-zero) + instead of a CMP+BNE pair. Same with CBZ instead of CMP+BEQ + + +* when we need to save things on the stack, we typically push two words + and pop them later. It would be cheaper if we reserved two locations + in the stack from _call_header, then we could just write there. + *OR* + maybe it's enough if we use the form "str x0, [sp, !#offset]" which + combines in a single instruction the "str" with the change of sp diff -Nru pypy-7.1.1+dfsg/rpython/jit/backend/arm/callbuilder.py pypy-7.3.1+dfsg/rpython/jit/backend/arm/callbuilder.py --- pypy-7.1.1+dfsg/rpython/jit/backend/arm/callbuilder.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/backend/arm/callbuilder.py 2020-04-10 19:28:41.000000000 +0000 @@ -97,6 +97,7 @@ if self.asm.cpu.cpuinfo.arch_version >= 7: self.mc.DMB() self.mc.gen_load_int(r.r6.value, fastgil) + self.mc.LDR_ri(r.r8.value, r.r6.value) # => our thread ident self.mc.MOV_ri(r.ip.value, 0) self.mc.STR_ri(r.ip.value, r.r6.value) @@ -109,10 +110,10 @@ # r5 == &root_stack_top # r6 == fastgil # r7 == previous value of root_stack_top + # r8 == our thread ident self.mc.LDREX(r.r3.value, r.r6.value) # load the lock value - self.mc.MOV_ri(r.ip.value, 1) self.mc.CMP_ri(r.r3.value, 0) # is the lock free? - self.mc.STREX(r.r3.value, r.ip.value, r.r6.value, c=c.EQ) + self.mc.STREX(r.r3.value, r.r8.value, r.r6.value, c=c.EQ) # try to claim the lock self.mc.CMP_ri(r.r3.value, 0, cond=c.EQ) # did this succeed? if self.asm.cpu.cpuinfo.arch_version >= 7: @@ -178,8 +179,8 @@ if save_err & rffi.RFFI_READSAVED_ERRNO: # Just before a call, read '*_errno' and write it into the # real 'errno'. The r0-r3 registers contain arguments to the - # future call; the r5-r7 registers contain various stuff. - # We still have r8-r12. + # future call; the r5-r8 registers contain various stuff. + # We still have r9-r12. if save_err & rffi.RFFI_ALT_ERRNO: rpy_errno = llerrno.get_alt_errno_offset(self.asm.cpu) else: @@ -202,7 +203,7 @@ def read_real_errno(self, save_err): if save_err & rffi.RFFI_SAVE_ERRNO: # Just after a call, read the real 'errno' and save a copy of - # it inside our thread-local '*_errno'. Registers r8-r12 + # it inside our thread-local '*_errno'. Registers r9-r12 # are unused here, and registers r2-r3 never contain anything # after the call. if save_err & rffi.RFFI_ALT_ERRNO: diff -Nru pypy-7.1.1+dfsg/rpython/jit/backend/arm/opassembler.py pypy-7.3.1+dfsg/rpython/jit/backend/arm/opassembler.py --- pypy-7.1.1+dfsg/rpython/jit/backend/arm/opassembler.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/backend/arm/opassembler.py 2020-04-10 19:28:41.000000000 +0000 @@ -834,73 +834,12 @@ else: assert 0 - #from ../x86/regalloc.py:928 ff. - def emit_op_copystrcontent(self, op, arglocs, regalloc, fcond): - assert len(arglocs) == 0 - self._emit_copystrcontent(op, regalloc, fcond, is_unicode=False) + def emit_op_load_effective_address(self, op, arglocs, regalloc, fcond): + static_ofs = op.getarg(2).getint() + scale = op.getarg(3).getint() + self._gen_address(arglocs[2], arglocs[0], arglocs[1], scale, static_ofs) return fcond - def emit_op_copyunicodecontent(self, op, arglocs, regalloc, fcond): - assert len(arglocs) == 0 - self._emit_copystrcontent(op, regalloc, fcond, is_unicode=True) - return fcond - - def _emit_copystrcontent(self, op, regalloc, fcond, is_unicode): - # compute the source address - args = op.getarglist() - base_loc = regalloc.rm.make_sure_var_in_reg(args[0], args) - ofs_loc = regalloc.rm.make_sure_var_in_reg(args[2], args) - assert args[0] is not args[1] # forbidden case of aliasing - srcaddr_box = TempVar() - forbidden_vars = [args[1], args[3], args[4], srcaddr_box] - srcaddr_loc = regalloc.rm.force_allocate_reg(srcaddr_box, forbidden_vars) - self._gen_address_inside_string(base_loc, ofs_loc, srcaddr_loc, - is_unicode=is_unicode) - # compute the destination address - base_loc = regalloc.rm.make_sure_var_in_reg(args[1], forbidden_vars) - ofs_loc = regalloc.rm.make_sure_var_in_reg(args[3], forbidden_vars) - forbidden_vars = [args[4], srcaddr_box] - dstaddr_box = TempVar() - dstaddr_loc = regalloc.rm.force_allocate_reg(dstaddr_box, forbidden_vars) - self._gen_address_inside_string(base_loc, ofs_loc, dstaddr_loc, - is_unicode=is_unicode) - # compute the length in bytes - length_box = args[4] - length_loc = regalloc.loc(length_box) - if is_unicode: - forbidden_vars = [srcaddr_box, dstaddr_box] - bytes_box = TempVar() - bytes_loc = regalloc.rm.force_allocate_reg(bytes_box, forbidden_vars) - scale = self._get_unicode_item_scale() - if not length_loc.is_core_reg(): - self.regalloc_mov(length_loc, bytes_loc) - length_loc = bytes_loc - assert length_loc.is_core_reg() - self.mc.MOV_ri(r.ip.value, 1 << scale) - self.mc.MUL(bytes_loc.value, r.ip.value, length_loc.value) - length_box = bytes_box - length_loc = bytes_loc - # call memcpy() - regalloc.before_call() - self.simple_call_no_collect(imm(self.memcpy_addr), - [dstaddr_loc, srcaddr_loc, length_loc]) - regalloc.rm.possibly_free_var(length_box) - regalloc.rm.possibly_free_var(dstaddr_box) - regalloc.rm.possibly_free_var(srcaddr_box) - - def _gen_address_inside_string(self, baseloc, ofsloc, resloc, is_unicode): - if is_unicode: - ofs_items, _, _ = symbolic.get_array_token(rstr.UNICODE, - self.cpu.translate_support_code) - scale = self._get_unicode_item_scale() - else: - ofs_items, itemsize, _ = symbolic.get_array_token(rstr.STR, - self.cpu.translate_support_code) - assert itemsize == 1 - ofs_items -= 1 # for the extra null character - scale = 0 - self._gen_address(resloc, baseloc, ofsloc, scale, ofs_items) - # result = base_loc + (scaled_loc << scale) + static_offset def _gen_address(self, result, base_loc, scaled_loc, scale=0, static_offset=0): assert scaled_loc.is_core_reg() @@ -915,16 +854,6 @@ self.mc.ADD_rr(result.value, base_loc.value, scaled_loc.value) self.mc.ADD_ri(result.value, result.value, static_offset) - def _get_unicode_item_scale(self): - _, itemsize, _ = symbolic.get_array_token(rstr.UNICODE, - self.cpu.translate_support_code) - if itemsize == 4: - return 2 - elif itemsize == 2: - return 1 - else: - raise AssertionError("bad unicode item size") - def store_force_descr(self, op, fail_locs, frame_depth): pos = self.mc.currpos() guard_token = self.build_guard_token(op, frame_depth, fail_locs, pos, c.AL) diff -Nru pypy-7.1.1+dfsg/rpython/jit/backend/arm/regalloc.py pypy-7.3.1+dfsg/rpython/jit/backend/arm/regalloc.py --- pypy-7.1.1+dfsg/rpython/jit/backend/arm/regalloc.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/backend/arm/regalloc.py 2020-04-10 19:28:41.000000000 +0000 @@ -373,6 +373,10 @@ if box.type == REF and self.rm.is_still_alive(box): assert not noregs assert loc.is_core_reg() + #val = self.cpu.all_reg_indexes[loc.value] + # ^^^ That is the correct way to write it down, but as a + # special case in the arm backend only, this is equivalent + # to just the line below: val = loc.value gcmap[val // WORD // 8] |= r_uint(1) << (val % (WORD * 8)) for box, loc in self.fm.bindings.iteritems(): @@ -873,8 +877,6 @@ prepare_op_gc_load_indexed_r = _prepare_op_gc_load_indexed prepare_op_gc_load_indexed_f = _prepare_op_gc_load_indexed - prepare_op_copystrcontent = void - prepare_op_copyunicodecontent = void prepare_op_zero_array = void def _prepare_op_same_as(self, op, fcond): @@ -899,6 +901,13 @@ resloc = self.force_allocate_reg(op) return [resloc] + def prepare_op_load_effective_address(self, op, fcond): + args = op.getarglist() + arg0 = self.make_sure_var_in_reg(args[0], args) + arg1 = self.make_sure_var_in_reg(args[1], args) + res = self.force_allocate_reg(op) + return [arg0, arg1, res] + def prepare_op_call_malloc_nursery(self, op, fcond): size_box = op.getarg(0) assert isinstance(size_box, ConstInt) diff -Nru pypy-7.1.1+dfsg/rpython/jit/backend/arm/runner.py pypy-7.3.1+dfsg/rpython/jit/backend/arm/runner.py --- pypy-7.1.1+dfsg/rpython/jit/backend/arm/runner.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/backend/arm/runner.py 2020-04-10 19:28:41.000000000 +0000 @@ -23,6 +23,7 @@ supports_floats = True supports_longlong = True supports_singlefloats = True + supports_load_effective_address = True from rpython.jit.backend.arm.arch import JITFRAME_FIXED_SIZE all_reg_indexes = range(len(all_regs)) diff -Nru pypy-7.1.1+dfsg/rpython/jit/backend/arm/test/gen.py pypy-7.3.1+dfsg/rpython/jit/backend/arm/test/gen.py --- pypy-7.1.1+dfsg/rpython/jit/backend/arm/test/gen.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/backend/arm/test/gen.py 2020-04-10 19:28:41.000000000 +0000 @@ -2,6 +2,7 @@ from rpython.tool.udir import udir import tempfile from rpython.jit.backend.arm.test.support import AS + class ASMInstruction(object): asm_opts = '-mfpu=neon -mcpu=cortex-a8 -march=armv7-a' diff -Nru pypy-7.1.1+dfsg/rpython/jit/backend/detect_cpu.py pypy-7.3.1+dfsg/rpython/jit/backend/detect_cpu.py --- pypy-7.1.1+dfsg/rpython/jit/backend/detect_cpu.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/backend/detect_cpu.py 2020-04-10 19:28:41.000000000 +0000 @@ -14,6 +14,7 @@ MODEL_X86_NO_SSE2 = 'x86-without-sse2' MODEL_X86_64 = 'x86-64' MODEL_ARM = 'arm' +MODEL_ARM64 = 'aarch64' MODEL_PPC_64 = 'ppc-64' MODEL_S390_64 = 's390x' # don't use '_' in the model strings; they are replaced by '-' @@ -25,6 +26,7 @@ mapping = { MODEL_X86_64: ['__amd64__', '__amd64', '__x86_64__', '__x86_64', '_M_X64', '_M_AMD64'], MODEL_ARM: ['__arm__', '__thumb__','_M_ARM_EP'], + MODEL_ARM64: ['__aarch64__'], MODEL_X86: ['i386', '__i386', '__i386__', '__i686__','_M_IX86'], MODEL_PPC_64: ['__powerpc64__'], MODEL_S390_64:['__s390x__'], @@ -68,6 +70,7 @@ 'amd64': MODEL_X86, # freebsd 'AMD64': MODEL_X86, # win64 'armv8l': MODEL_ARM, # 32-bit ARMv8 + 'aarch64': MODEL_ARM64, 'armv7l': MODEL_ARM, 'armv6l': MODEL_ARM, 'arm': MODEL_ARM, # freebsd @@ -119,6 +122,8 @@ return "rpython.jit.backend.x86.runner", "CPU_X86_64" elif backend_name == MODEL_ARM: return "rpython.jit.backend.arm.runner", "CPU_ARM" + elif backend_name == MODEL_ARM64: + return "rpython.jit.backend.aarch64.runner", "CPU_ARM64" elif backend_name == MODEL_PPC_64: return "rpython.jit.backend.ppc.runner", "PPC_CPU" elif backend_name == MODEL_S390_64: @@ -141,6 +146,7 @@ MODEL_X86_NO_SSE2: ['longlong'], MODEL_X86_64: ['floats', 'singlefloats'], MODEL_ARM: ['floats', 'singlefloats', 'longlong'], + MODEL_ARM64: ['floats'], MODEL_PPC_64: ['floats'], MODEL_S390_64: ['floats'], }[backend_name] diff -Nru pypy-7.1.1+dfsg/rpython/jit/backend/llsupport/assembler.py pypy-7.3.1+dfsg/rpython/jit/backend/llsupport/assembler.py --- pypy-7.1.1+dfsg/rpython/jit/backend/llsupport/assembler.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/backend/llsupport/assembler.py 2020-04-10 19:28:41.000000000 +0000 @@ -438,51 +438,8 @@ @staticmethod @rgc.no_collect - def _reacquire_gil_asmgcc(css, old_rpy_fastgil): - # Before doing an external call, 'rpy_fastgil' is initialized to - # be equal to css. This function is called if we find out after - # the call that it is no longer equal to css. See description - # in translator/c/src/thread_pthread.c. - - # XXX some duplicated logic here, but note that rgil.acquire() - # does more than just RPyGilAcquire() - if old_rpy_fastgil == 0: - # this case occurs if some other thread stole the GIL but - # released it again. What occurred here is that we changed - # 'rpy_fastgil' from 0 to 1, thus successfully reaquiring the - # GIL. - pass - - elif old_rpy_fastgil == 1: - # 'rpy_fastgil' was (and still is) locked by someone else. - # We need to wait for the regular mutex. - from rpython.rlib import rgil - rgil.acquire() - else: - # stole the GIL from a different thread that is also - # currently in an external call from the jit. Attach - # the 'old_rpy_fastgil' into the chained list. - from rpython.memory.gctransform import asmgcroot - oth = rffi.cast(asmgcroot.ASM_FRAMEDATA_HEAD_PTR, old_rpy_fastgil) - next = asmgcroot.gcrootanchor.next - oth.next = next - oth.prev = asmgcroot.gcrootanchor - asmgcroot.gcrootanchor.next = oth - next.prev = oth - - # similar to trackgcroot.py:pypy_asm_stackwalk, second part: - # detach the 'css' from the chained list - from rpython.memory.gctransform import asmgcroot - old = rffi.cast(asmgcroot.ASM_FRAMEDATA_HEAD_PTR, css) - prev = old.prev - next = old.next - prev.next = next - next.prev = prev - - @staticmethod - @rgc.no_collect def _reacquire_gil_shadowstack(): - # Simplified version of _reacquire_gil_asmgcc(): in shadowstack mode, + # This used to be more complex for asmgcc. In shadowstack mode, # 'rpy_fastgil' contains only zero or non-zero, and this is only # called when the old value stored in 'rpy_fastgil' was non-zero # (i.e. still locked, must wait with the regular mutex) @@ -499,13 +456,10 @@ self._reacquire_gil_shadowstack) self.reacqgil_addr = self.cpu.cast_ptr_to_int(reacqgil_func) else: - reacqgil_func = llhelper(self._REACQGIL2_FUNC, - self._reacquire_gil_asmgcc) - self.reacqgil_addr = self.cpu.cast_ptr_to_int(reacqgil_func) + raise AssertionError("!is_shadow_stack") def _is_asmgcc(self): - gcrootmap = self.cpu.gc_ll_descr.gcrootmap - return bool(gcrootmap) and not gcrootmap.is_shadow_stack + return False # legacy def debug_bridge(descr_number, rawstart, codeendpos): diff -Nru pypy-7.1.1+dfsg/rpython/jit/backend/llsupport/gc.py pypy-7.3.1+dfsg/rpython/jit/backend/llsupport/gc.py --- pypy-7.1.1+dfsg/rpython/jit/backend/llsupport/gc.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/backend/llsupport/gc.py 2020-04-10 19:28:41.000000000 +0000 @@ -14,13 +14,13 @@ from rpython.jit.metainterp.support import ptr2int from rpython.jit.backend.llsupport import symbolic, jitframe from rpython.jit.backend.llsupport.symbolic import WORD +from rpython.jit.backend.llsupport.memcpy import memcpy_fn from rpython.jit.backend.llsupport.descr import SizeDescr, ArrayDescr, FieldDescr from rpython.jit.backend.llsupport.descr import GcCache, get_field_descr from rpython.jit.backend.llsupport.descr import get_array_descr from rpython.jit.backend.llsupport.descr import get_call_descr from rpython.jit.backend.llsupport.descr import unpack_arraydescr from rpython.jit.backend.llsupport.rewrite import GcRewriterAssembler -from rpython.memory.gctransform import asmgcroot from rpython.jit.codewriter.effectinfo import EffectInfo # ____________________________________________________________ @@ -36,6 +36,11 @@ self.fielddescr_vtable = get_field_descr(self, rclass.OBJECT, 'typeptr') self._generated_functions = [] + self.memcpy_fn = memcpy_fn + self.memcpy_descr = get_call_descr(self, + [lltype.Signed, lltype.Signed, lltype.Signed], lltype.Void, + EffectInfo([], [], [], [], [], [], EffectInfo.EF_CANNOT_RAISE, + can_collect=False)) def _setup_str(self): self.str_descr = get_array_descr(self, rstr.STR) @@ -111,7 +116,7 @@ descrs = JitFrameDescrs() descrs.arraydescr = cpu.arraydescrof(jitframe.JITFRAME) for name in ['jf_descr', 'jf_guard_exc', 'jf_force_descr', - 'jf_frame_info', 'jf_gcmap', 'jf_extra_stack_depth', + 'jf_frame_info', 'jf_gcmap', 'jf_savedata', 'jf_forward']: setattr(descrs, name, cpu.fielddescrof(jitframe.JITFRAME, name)) descrs.jfi_frame_size = cpu.fielddescrof(jitframe.JITFRAMEINFO, @@ -238,15 +243,6 @@ # ____________________________________________________________ # All code below is for the hybrid or minimark GC -class GcRootMap_asmgcc(object): - is_shadow_stack = False - - def __init__(self, gcdescr): - pass - - def register_asm_addr(self, start, mark): - pass - class GcRootMap_shadowstack(object): is_shadow_stack = True diff -Nru pypy-7.1.1+dfsg/rpython/jit/backend/llsupport/jitframe.py pypy-7.3.1+dfsg/rpython/jit/backend/llsupport/jitframe.py --- pypy-7.1.1+dfsg/rpython/jit/backend/llsupport/jitframe.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/backend/llsupport/jitframe.py 2020-04-10 19:28:41.000000000 +0000 @@ -49,7 +49,6 @@ rgc.register_custom_trace_hook(JITFRAME, lambda_jitframe_trace) frame = lltype.malloc(JITFRAME, frame_info.jfi_frame_depth) frame.jf_frame_info = frame_info - frame.jf_extra_stack_depth = 0 return frame def jitframe_resolve(frame): @@ -71,8 +70,6 @@ ('jf_force_descr', llmemory.GCREF), # a map of GC pointers ('jf_gcmap', lltype.Ptr(GCMAP)), - # how much we decrease stack pointer. Used around calls and malloc slowpath - ('jf_extra_stack_depth', lltype.Signed), # For the front-end: a GCREF for the savedata ('jf_savedata', llmemory.GCREF), # For GUARD_(NO)_EXCEPTION and GUARD_NOT_FORCED: the exception we @@ -103,7 +100,6 @@ LENGTHOFS = llmemory.arraylengthoffset(JITFRAME.jf_frame) SIGN_SIZE = llmemory.sizeof(lltype.Signed) UNSIGN_SIZE = llmemory.sizeof(lltype.Unsigned) -STACK_DEPTH_OFS = getofs('jf_extra_stack_depth') def jitframe_trace(gc, obj_addr, callback, arg): gc._trace_callback(callback, arg, obj_addr + getofs('jf_descr')) diff -Nru pypy-7.1.1+dfsg/rpython/jit/backend/llsupport/llerrno.py pypy-7.3.1+dfsg/rpython/jit/backend/llsupport/llerrno.py --- pypy-7.1.1+dfsg/rpython/jit/backend/llsupport/llerrno.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/backend/llsupport/llerrno.py 2020-04-10 19:28:41.000000000 +0000 @@ -3,6 +3,8 @@ from rpython.translator.tool.cbuild import ExternalCompilationInfo from rpython.jit.backend.llsupport.symbolic import WORD +# NOTE: for tests, cpu._debug_tls_errno_container[1] is reserved for +# thread_ident (see lltls.py) if sys.byteorder == 'little' or sys.maxint <= 2**32: long2int = int2long = lambda x: x @@ -10,13 +12,12 @@ def long2int(x): return x >> 32 def int2long(x): return x << 32 - def get_debug_saved_errno(cpu): - return long2int(cpu._debug_errno_container[3]) + return long2int(cpu._debug_tls_errno_container[3]) def set_debug_saved_errno(cpu, nerrno): assert nerrno >= 0 - cpu._debug_errno_container[3] = int2long(nerrno) + cpu._debug_tls_errno_container[3] = int2long(nerrno) def get_rpy_errno_offset(cpu): if cpu.translate_support_code: @@ -27,11 +28,11 @@ def get_debug_saved_alterrno(cpu): - return long2int(cpu._debug_errno_container[4]) + return long2int(cpu._debug_tls_errno_container[4]) def set_debug_saved_alterrno(cpu, nerrno): assert nerrno >= 0 - cpu._debug_errno_container[4] = int2long(nerrno) + cpu._debug_tls_errno_container[4] = int2long(nerrno) def get_alt_errno_offset(cpu): if cpu.translate_support_code: @@ -42,18 +43,18 @@ def get_debug_saved_lasterror(cpu): - return cpu._debug_errno_container[5] + return cpu._debug_tls_errno_container[5] def set_debug_saved_lasterror(cpu, nerrno): assert nerrno >= 0 - cpu._debug_errno_container[5] = nerrno + cpu._debug_tls_errno_container[5] = nerrno def get_debug_saved_altlasterror(cpu): - return cpu._debug_errno_container[6] + return cpu._debug_tls_errno_container[6] def set_debug_saved_altlasterror(cpu, nerrno): assert nerrno >= 0 - cpu._debug_errno_container[6] = nerrno + cpu._debug_tls_errno_container[6] = nerrno def get_rpy_lasterror_offset(cpu): if cpu.translate_support_code: @@ -88,9 +89,9 @@ return rthread.tlfield_p_errno.getoffset() else: # fetch the real address of errno (in this thread), and store it - # at offset 2 in the _debug_errno_container - if cpu._debug_errno_container[2] == 0: + # at offset 2 in the _debug_tls_errno_container + if cpu._debug_tls_errno_container[2] == 0: addr_errno = _fetch_addr_errno() assert addr_errno != 0 - cpu._debug_errno_container[2] = addr_errno + cpu._debug_tls_errno_container[2] = addr_errno return 2 * WORD diff -Nru pypy-7.1.1+dfsg/rpython/jit/backend/llsupport/llmodel.py pypy-7.3.1+dfsg/rpython/jit/backend/llsupport/llmodel.py --- pypy-7.1.1+dfsg/rpython/jit/backend/llsupport/llmodel.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/backend/llsupport/llmodel.py 2020-04-10 19:28:41.000000000 +0000 @@ -86,9 +86,10 @@ self.floatarraydescr = ArrayDescr(ad.basesize, ad.itemsize, ad.lendescr, FLAG_FLOAT) self.setup() - self._debug_errno_container = lltype.malloc( + self._debug_tls_errno_container = lltype.malloc( rffi.CArray(lltype.Signed), 7, flavor='raw', zero=True, track_allocation=False) + self._debug_tls_errno_container[1] = 1234 # dummy thread ident def getarraydescr_for_frame(self, type): if type == history.FLOAT: @@ -310,7 +311,7 @@ llmemory.Address) else: ll_threadlocal_addr = rffi.cast(llmemory.Address, - self._debug_errno_container) + self._debug_tls_errno_container) llop.gc_writebarrier(lltype.Void, ll_frame) ll_frame = func(ll_frame, ll_threadlocal_addr) finally: diff -Nru pypy-7.1.1+dfsg/rpython/jit/backend/llsupport/lltls.py pypy-7.3.1+dfsg/rpython/jit/backend/llsupport/lltls.py --- pypy-7.1.1+dfsg/rpython/jit/backend/llsupport/lltls.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/backend/llsupport/lltls.py 2020-04-10 19:28:41.000000000 +0000 @@ -0,0 +1,9 @@ +from rpython.rlib import rthread +from rpython.jit.backend.llsupport.symbolic import WORD + + +def get_thread_ident_offset(cpu): + if cpu.translate_support_code: + return rthread.tlfield_thread_ident.getoffset() + else: + return 1 * WORD diff -Nru pypy-7.1.1+dfsg/rpython/jit/backend/llsupport/rewrite.py pypy-7.3.1+dfsg/rpython/jit/backend/llsupport/rewrite.py --- pypy-7.1.1+dfsg/rpython/jit/backend/llsupport/rewrite.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/backend/llsupport/rewrite.py 2020-04-10 19:28:41.000000000 +0000 @@ -34,6 +34,10 @@ - Add COND_CALLs to the write barrier before SETFIELD_GC and SETARRAYITEM_GC operations. + - Rewrites copystrcontent to a call to memcopy + + - XXX does more than that, please write it down + '_write_barrier_applied' contains a dictionary of variable -> None. If a variable is in the dictionary, next setfields can be called without a write barrier. The idea is that an object that was freshly allocated @@ -295,6 +299,29 @@ self.cpu.translate_support_code) self.emit_gc_store_or_indexed(op, op.getarg(0), op.getarg(1), op.getarg(2), itemsize, itemsize, basesize) + elif opnum in (rop.GC_LOAD_INDEXED_I, + rop.GC_LOAD_INDEXED_F, + rop.GC_LOAD_INDEXED_R): + scale_box = op.getarg(2) + offset_box = op.getarg(3) + size_box = op.getarg(4) + assert isinstance(scale_box, ConstInt) + assert isinstance(offset_box, ConstInt) + assert isinstance(size_box, ConstInt) + self.emit_gc_load_or_indexed(op, op.getarg(0), op.getarg(1), + abs(size_box.value), scale_box.value, offset_box.value, + size_box.value < 0) + elif opnum == rop.GC_STORE_INDEXED: + scale_box = op.getarg(3) + offset_box = op.getarg(4) + size_box = op.getarg(5) + assert isinstance(scale_box, ConstInt) + assert isinstance(offset_box, ConstInt) + assert isinstance(size_box, ConstInt) + # here, size_box.value should be > 0, but be safe and use abs() + self.emit_gc_store_or_indexed(op, op.getarg(0), op.getarg(1), + op.getarg(2), + abs(size_box.value), scale_box.value, offset_box.value) return False @@ -335,6 +362,10 @@ self.emitting_an_operation_that_can_collect() elif op.getopnum() == rop.LABEL: self.emit_label() + # ---- change COPY{STR|UNICODE}CONTENT into a call ------ + if op.opnum == rop.COPYSTRCONTENT or op.opnum == rop.COPYUNICODECONTENT: + self.rewrite_copy_str_content(op) + continue # ---------- write barriers ---------- if self.gc_ll_descr.write_barrier_descr is not None: if op.getopnum() == rop.SETFIELD_GC: @@ -576,8 +607,6 @@ length = self.emit_getfield(ConstInt(frame_info), descr=descrs.jfi_frame_depth, raw=True) - self.emit_setfield(frame, self.c_zero, - descr=descrs.jf_extra_stack_depth) self.emit_setfield(frame, self.c_null, descr=descrs.jf_savedata) self.emit_setfield(frame, self.c_null, @@ -953,6 +982,61 @@ self.gcrefs_output_list.append(gcref) return index + def rewrite_copy_str_content(self, op): + funcaddr = llmemory.cast_ptr_to_adr(self.gc_ll_descr.memcpy_fn) + memcpy_fn = self.cpu.cast_adr_to_int(funcaddr) + memcpy_descr = self.gc_ll_descr.memcpy_descr + if op.getopnum() == rop.COPYSTRCONTENT: + basesize = self.gc_ll_descr.str_descr.basesize + # because we have one extra item after alloc, the actual address + # of string start is 1 lower, from extra_item_after_malloc + basesize -= 1 + assert self.gc_ll_descr.str_descr.itemsize == 1 + itemscale = 0 + else: + basesize = self.gc_ll_descr.unicode_descr.basesize + itemsize = self.gc_ll_descr.unicode_descr.itemsize + if itemsize == 2: + itemscale = 1 + elif itemsize == 4: + itemscale = 2 + else: + assert False, "unknown size of unicode" + i1 = self.emit_load_effective_address(op.getarg(0), op.getarg(2), + basesize, itemscale) + i2 = self.emit_load_effective_address(op.getarg(1), op.getarg(3), + basesize, itemscale) + if op.getopnum() == rop.COPYSTRCONTENT: + arg = op.getarg(4) + else: + # do some basic constant folding + if isinstance(op.getarg(4), ConstInt): + arg = ConstInt(op.getarg(4).getint() << itemscale) + else: + arg = ResOperation(rop.INT_LSHIFT, + [op.getarg(4), ConstInt(itemscale)]) + self.emit_op(arg) + self.emit_op(ResOperation(rop.CALL_N, + [ConstInt(memcpy_fn), i2, i1, arg], descr=memcpy_descr)) + + def emit_load_effective_address(self, v_gcptr, v_index, base, itemscale): + if self.cpu.supports_load_effective_address: + i1 = ResOperation(rop.LOAD_EFFECTIVE_ADDRESS, + [v_gcptr, v_index, ConstInt(base), + ConstInt(itemscale)]) + self.emit_op(i1) + return i1 + else: + if itemscale > 0: + v_index = ResOperation(rop.INT_LSHIFT, + [v_index, ConstInt(itemscale)]) + self.emit_op(v_index) + i1b = ResOperation(rop.INT_ADD, [v_gcptr, v_index]) + self.emit_op(i1b) + i1 = ResOperation(rop.INT_ADD, [i1b, ConstInt(base)]) + self.emit_op(i1) + return i1 + def remove_constptr(self, c): """Remove all ConstPtrs, and replace them with load_from_gc_table. """ diff -Nru pypy-7.1.1+dfsg/rpython/jit/backend/llsupport/test/test_gc_integration.py pypy-7.3.1+dfsg/rpython/jit/backend/llsupport/test/test_gc_integration.py --- pypy-7.1.1+dfsg/rpython/jit/backend/llsupport/test/test_gc_integration.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/backend/llsupport/test/test_gc_integration.py 2020-04-10 19:28:41.000000000 +0000 @@ -93,6 +93,8 @@ assert nos == [0, 1, 33] elif self.cpu.backend_name.startswith('zarch'): assert nos == [0, 1, 29] + elif self.cpu.backend_name.startswith('aarch64'): + assert nos == [0, 1, 27] else: raise Exception("write the data here") assert frame.jf_frame[nos[0]] @@ -505,7 +507,6 @@ ('jf_frame_info', lltype.Ptr(jitframe.JITFRAMEINFO)), ('jf_descr', llmemory.GCREF), ('jf_force_descr', llmemory.GCREF), - ('jf_extra_stack_depth', lltype.Signed), ('jf_guard_exc', llmemory.GCREF), ('jf_gcmap', lltype.Ptr(jitframe.GCMAP)), ('jf_gc_trace_state', lltype.Signed), @@ -592,7 +593,7 @@ descrs = JitFrameDescrs() descrs.arraydescr = cpu.arraydescrof(JITFRAME) for name in ['jf_descr', 'jf_guard_exc', 'jf_force_descr', - 'jf_frame_info', 'jf_gcmap', 'jf_extra_stack_depth']: + 'jf_frame_info', 'jf_gcmap']: setattr(descrs, name, cpu.fielddescrof(JITFRAME, name)) descrs.jfi_frame_depth = cpu.fielddescrof(jitframe.JITFRAMEINFO, 'jfi_frame_depth') @@ -672,6 +673,8 @@ elif self.cpu.backend_name.startswith('zarch'): # 10 gpr, 14 fpr -> 25 is the first slot assert gcmap == [26, 27, 28] + elif self.cpu.backend_name.startswith('aarch64'): + assert gcmap == [24, 25, 26] elif self.cpu.IS_64_BIT: assert gcmap == [28, 29, 30] elif self.cpu.backend_name.startswith('arm'): diff -Nru pypy-7.1.1+dfsg/rpython/jit/backend/llsupport/test/test_gc.py pypy-7.3.1+dfsg/rpython/jit/backend/llsupport/test/test_gc.py --- pypy-7.1.1+dfsg/rpython/jit/backend/llsupport/test/test_gc.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/backend/llsupport/test/test_gc.py 2020-04-10 19:28:41.000000000 +0000 @@ -110,7 +110,7 @@ class config_(object): class translation(object): gc = self.gc - gcrootfinder = 'asmgcc' + gcrootfinder = 'shadowstack' gctransformer = 'framework' gcremovetypeptr = False class FakeTranslator(object): diff -Nru pypy-7.1.1+dfsg/rpython/jit/backend/llsupport/test/test_rewrite.py pypy-7.3.1+dfsg/rpython/jit/backend/llsupport/test/test_rewrite.py --- pypy-7.1.1+dfsg/rpython/jit/backend/llsupport/test/test_rewrite.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/backend/llsupport/test/test_rewrite.py 2020-04-10 19:28:41.000000000 +0000 @@ -142,11 +142,16 @@ raw_sfdescr = get_array_descr(self.gc_ll_descr, RAW_SF) # strdescr = self.gc_ll_descr.str_descr + str_basesize = self.gc_ll_descr.str_descr.basesize - 1 unicodedescr = self.gc_ll_descr.unicode_descr strlendescr = strdescr.lendescr unicodelendescr = unicodedescr.lendescr strhashdescr = self.gc_ll_descr.str_hash_descr unicodehashdescr = self.gc_ll_descr.unicode_hash_descr + uni_basesize = unicodedescr.basesize + uni_itemscale = {2: 1, 4: 2}[unicodedescr.itemsize] + memcpy_fn = self.gc_ll_descr.memcpy_fn + memcpy_descr = self.gc_ll_descr.memcpy_descr casmdescr = JitCellToken() clt = FakeLoopToken() @@ -165,10 +170,10 @@ jf_descr = framedescrs.jf_descr jf_guard_exc = framedescrs.jf_guard_exc jf_forward = framedescrs.jf_forward - jf_extra_stack_depth = framedescrs.jf_extra_stack_depth signedframedescr = self.cpu.signedframedescr floatframedescr = self.cpu.floatframedescr casmdescr.compiled_loop_token = clt + # guarddescr = AbstractFailDescr() # @@ -200,6 +205,7 @@ load_constant_offset = True load_supported_factors = (1,2,4,8) + supports_load_effective_address = True translate_support_code = None @@ -237,6 +243,9 @@ self._cache[key] = r return r + def cast_adr_to_int(self, adr): + return llmemory.AddressAsInt(adr) + class TestBoehm(RewriteTests): def setup_method(self, meth): class FakeCPU(BaseFakeCPU): @@ -376,7 +385,7 @@ class config_(object): class translation(object): gc = 'minimark' - gcrootfinder = 'asmgcc' + gcrootfinder = 'shadowstack' gctransformer = 'framework' gcremovetypeptr = False gcdescr = get_description(config_) @@ -1092,7 +1101,6 @@ p1 = call_malloc_nursery_varsize_frame(i1) gc_store(p1, 0, 0, %(tiddescr.field_size)s) i2 = gc_load_i(ConstClass(frame_info), %(jfi_frame_depth.offset)s, %(jfi_frame_depth.field_size)s) - %(setfield('p1', 0, jf_extra_stack_depth))s %(setfield('p1', 'NULL', jf_savedata))s %(setfield('p1', 'NULL', jf_force_descr))s %(setfield('p1', 'NULL', jf_descr))s @@ -1292,6 +1300,18 @@ '%(ity2descr.arraydescr.basesize' ' + itydescr.fielddescr.offset)d,' '%(ity2descr.fielddescr.field_size)d)'], + [True, (2,), 'i3 = gc_load_indexed_i(i1, i2, 2, 40, 1)' '->' + 'i3 = gc_load_indexed_i(i1, i2, 2, 40, 1)'], + [True, (2,), 'i3 = gc_load_indexed_i(i1, 6, 8, 40, 4)' '->' + 'i3 = gc_load_i(i1, 88, 4)'], + [True, (2,), 'i3 = gc_load_indexed_i(i1, i2, 2, 40, -1)' '->' + 'i3 = gc_load_indexed_i(i1, i2, 2, 40, -1)'], + [True, (2,), 'i3 = gc_load_indexed_i(i1, 6, 8, 40, -4)' '->' + 'i3 = gc_load_i(i1, 88, -4)'], + [True, (2,), 'i3 = gc_store_indexed(i1, i2, 999, 2, 40, 1)' '->' + 'i3 = gc_store_indexed(i1, i2, 999, 2, 40, 1)'], + [True, (2,), 'i3 = gc_store_indexed(i1, 6, 999, 8, 40, 2)' '->' + 'i3 = gc_store(i1, 88, 999, 2)'], ]) def test_gc_load_store_transform(self, support_offset, factors, fromto): self.cpu.load_constant_offset = support_offset @@ -1436,3 +1456,57 @@ jump() """) assert len(self.gcrefs) == 2 + + def test_rewrite_copystrcontents(self): + self.check_rewrite(""" + [p0, p1, i0, i1, i_len] + copystrcontent(p0, p1, i0, i1, i_len) + """, """ + [p0, p1, i0, i1, i_len] + i2 = load_effective_address(p0, i0, %(str_basesize)s, 0) + i3 = load_effective_address(p1, i1, %(str_basesize)s, 0) + call_n(ConstClass(memcpy_fn), i3, i2, i_len, descr=memcpy_descr) + """) + + def test_rewrite_copystrcontents_without_load_effective_address(self): + self.cpu.supports_load_effective_address = False + self.check_rewrite(""" + [p0, p1, i0, i1, i_len] + copystrcontent(p0, p1, i0, i1, i_len) + """, """ + [p0, p1, i0, i1, i_len] + i2b = int_add(p0, i0) + i2 = int_add(i2b, %(str_basesize)s) + i3b = int_add(p1, i1) + i3 = int_add(i3b, %(str_basesize)s) + call_n(ConstClass(memcpy_fn), i3, i2, i_len, descr=memcpy_descr) + """) + + def test_rewrite_copyunicodecontents(self): + self.check_rewrite(""" + [p0, p1, i0, i1, i_len] + copyunicodecontent(p0, p1, i0, i1, i_len) + """, """ + [p0, p1, i0, i1, i_len] + i2 = load_effective_address(p0, i0, %(uni_basesize)s, %(uni_itemscale)d) + i3 = load_effective_address(p1, i1, %(uni_basesize)s, %(uni_itemscale)d) + i4 = int_lshift(i_len, %(uni_itemscale)d) + call_n(ConstClass(memcpy_fn), i3, i2, i4, descr=memcpy_descr) + """) + + def test_rewrite_copyunicodecontents_without_load_effective_address(self): + self.cpu.supports_load_effective_address = False + self.check_rewrite(""" + [p0, p1, i0, i1, i_len] + copyunicodecontent(p0, p1, i0, i1, i_len) + """, """ + [p0, p1, i0, i1, i_len] + i0s = int_lshift(i0, %(uni_itemscale)d) + i2b = int_add(p0, i0s) + i2 = int_add(i2b, %(uni_basesize)s) + i1s = int_lshift(i1, %(uni_itemscale)d) + i3b = int_add(p1, i1s) + i3 = int_add(i3b, %(uni_basesize)s) + i4 = int_lshift(i_len, %(uni_itemscale)d) + call_n(ConstClass(memcpy_fn), i3, i2, i4, descr=memcpy_descr) + """) diff -Nru pypy-7.1.1+dfsg/rpython/jit/backend/llsupport/test/test_zrpy_gc_direct.py pypy-7.3.1+dfsg/rpython/jit/backend/llsupport/test/test_zrpy_gc_direct.py --- pypy-7.1.1+dfsg/rpython/jit/backend/llsupport/test/test_zrpy_gc_direct.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/backend/llsupport/test/test_zrpy_gc_direct.py 2020-04-10 19:28:41.000000000 +0000 @@ -66,6 +66,14 @@ 'faildescr': faildescr, 'vtable_B': vtable_B}) + loop1a = parse(""" + [p0] + guard_nonnull_class(p0, ConstInt(vtable_B), descr=faildescr) [] + finish(descr=finaldescr) + """, namespace={'finaldescr': finaldescr, + 'faildescr': faildescr, + 'vtable_B': vtable_B}) + loop2 = parse(""" [p0] guard_gc_type(p0, ConstInt(typeid_B), descr=faildescr) [] @@ -92,10 +100,12 @@ def g(): cpu.setup_once() token1 = JitCellToken() + token1a = JitCellToken() token2 = JitCellToken() token3 = JitCellToken() token4 = JitCellToken() cpu.compile_loop(loop1.inputargs, loop1.operations, token1) + cpu.compile_loop(loop1a.inputargs, loop1a.operations, token1a) cpu.compile_loop(loop2.inputargs, loop2.operations, token2) cpu.compile_loop(loop3.inputargs, loop3.operations, token3) cpu.compile_loop(loop4.inputargs, loop4.operations, token4) @@ -105,6 +115,11 @@ (token1, rffi.cast(llmemory.GCREF, B())), (token1, rffi.cast(llmemory.GCREF, C())), + (token1a, rffi.cast(llmemory.GCREF, A())), + (token1a, lltype.nullptr(llmemory.GCREF.TO)), + (token1a, rffi.cast(llmemory.GCREF, B())), + (token1a, rffi.cast(llmemory.GCREF, C())), + (token2, rffi.cast(llmemory.GCREF, A())), (token2, rffi.cast(llmemory.GCREF, B())), (token2, rffi.cast(llmemory.GCREF, C())), @@ -175,6 +190,11 @@ 'match\n' 'fail\n' + 'fail\n' + 'fail\n' + 'match\n' + 'fail\n' + 'fail\n' '0\n' 'match\n' '1\n' 'fail\n' '0\n' diff -Nru pypy-7.1.1+dfsg/rpython/jit/backend/llsupport/test/zrpy_gc_test.py pypy-7.3.1+dfsg/rpython/jit/backend/llsupport/test/zrpy_gc_test.py --- pypy-7.1.1+dfsg/rpython/jit/backend/llsupport/test/zrpy_gc_test.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/backend/llsupport/test/zrpy_gc_test.py 2020-04-10 19:28:41.000000000 +0000 @@ -176,9 +176,6 @@ cls.cbuilder = compile(get_entry(allfuncs), cls.gc, gcrootfinder=cls.gcrootfinder, jit=True, thread=True) - except ConfigError as e: - assert str(e).startswith('invalid value asmgcc') - py.test.skip('asmgcc not supported') finally: GcLLDescr_framework.DEBUG = OLD_DEBUG diff -Nru pypy-7.1.1+dfsg/rpython/jit/backend/llsupport/test/zrpy_releasegil_test.py pypy-7.3.1+dfsg/rpython/jit/backend/llsupport/test/zrpy_releasegil_test.py --- pypy-7.1.1+dfsg/rpython/jit/backend/llsupport/test/zrpy_releasegil_test.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/backend/llsupport/test/zrpy_releasegil_test.py 2020-04-10 19:28:41.000000000 +0000 @@ -3,6 +3,8 @@ from rpython.jit.metainterp.optimizeopt import ALL_OPTS_NAMES from rpython.translator.tool.cbuild import ExternalCompilationInfo from rpython.rlib import rposix +from rpython.rlib import rgil +from rpython.rlib.debug import debug_print from rpython.rtyper.annlowlevel import llhelper @@ -22,9 +24,21 @@ return (n, None, None, None, None, None, None, None, None, None, None, None) # + + @dont_look_inside + def check_gil(name): + # we may not have the GIL here, don't use "print" + debug_print(name) + if not rgil.am_I_holding_the_GIL(): + debug_print('assert failed at point', name) + debug_print('rgil.gil_get_holder() ==', rgil.gil_get_holder()) + assert False + def f(n, x, *args): a = rffi.str2charp(str(n)) + check_gil('before c_strchr') c_strchr(a, ord('0')) + check_gil('after c_strchr') lltype.free(a, flavor='raw') n -= 1 return (n, x) + args @@ -74,7 +88,7 @@ # def before(n, x): glob.lst = [] - + return (n, None, None, None, None, None, None, None, None, None, None, None) # diff -Nru pypy-7.1.1+dfsg/rpython/jit/backend/llsupport/test/ztranslation_test.py pypy-7.3.1+dfsg/rpython/jit/backend/llsupport/test/ztranslation_test.py --- pypy-7.1.1+dfsg/rpython/jit/backend/llsupport/test/ztranslation_test.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/backend/llsupport/test/ztranslation_test.py 2020-04-10 19:28:41.000000000 +0000 @@ -331,9 +331,6 @@ try: res = self.meta_interp(main, [400]) assert res == main(400) - except ConfigError as e: - assert str(e).startswith('invalid value asmgcc') - py.test.skip('asmgcc not supported') finally: del os.environ['PYPYLOG'] diff -Nru pypy-7.1.1+dfsg/rpython/jit/backend/model.py pypy-7.3.1+dfsg/rpython/jit/backend/model.py --- pypy-7.1.1+dfsg/rpython/jit/backend/model.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/backend/model.py 2020-04-10 19:28:41.000000000 +0000 @@ -19,6 +19,7 @@ # Boxes and Consts are BoxFloats and ConstFloats. supports_singlefloats = False supports_guard_gc_type = False + supports_load_effective_address = False propagate_exception_descr = None diff -Nru pypy-7.1.1+dfsg/rpython/jit/backend/ppc/callbuilder.py pypy-7.3.1+dfsg/rpython/jit/backend/ppc/callbuilder.py --- pypy-7.1.1+dfsg/rpython/jit/backend/ppc/callbuilder.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/backend/ppc/callbuilder.py 2020-04-10 19:28:41.000000000 +0000 @@ -22,10 +22,13 @@ RSHADOWPTR = r.RCS1 RFASTGILPTR = r.RCS2 RSHADOWOLD = r.RCS3 + RTHREADID = r.RCS4 # loaded from the old value of rpy_fastgil + + ressign = True def __init__(self, assembler, fnloc, arglocs, resloc): AbstractCallBuilder.__init__(self, assembler, fnloc, arglocs, - resloc, restype=INT, ressize=None) + resloc, restype=INT, ressize=WORD) def prepare_arguments(self): assert IS_PPC_64 @@ -140,13 +143,32 @@ assert (self.resloc is None or self.resloc is r.r3 or self.resloc is r.f1) - + ressize = self.ressize + if ressize == 1: + assert self.resloc is r.r3 + if self.ressign: + self.mc.extsb(r.r3.value, r.r3.value) + else: + self.mc.rldicl(r.r3.value, r.r3.value, 0, 56) + elif ressize == 2: + assert self.resloc is r.r3 + if self.ressign: + self.mc.extsh(r.r3.value, r.r3.value) + else: + self.mc.rldicl(r.r3.value, r.r3.value, 0, 48) + elif ressize == 4: + assert self.resloc is r.r3 + if self.ressign: + self.mc.extsw(r.r3.value, r.r3.value) + else: + self.mc.rldicl(r.r3.value, r.r3.value, 0, 32) def call_releasegil_addr_and_move_real_arguments(self, fastgil): assert self.is_call_release_gil RSHADOWPTR = self.RSHADOWPTR RFASTGILPTR = self.RFASTGILPTR RSHADOWOLD = self.RSHADOWOLD + RTHREADID = self.RTHREADID # # Save this thread's shadowstack pointer into r29, for later comparison gcrootmap = self.asm.cpu.gc_ll_descr.gcrootmap @@ -158,6 +180,7 @@ # # change 'rpy_fastgil' to 0 (it should be non-zero right now) self.mc.load_imm(RFASTGILPTR, fastgil) + self.mc.ld(RTHREADID.value, RFASTGILPTR.value, 0) self.mc.li(r.r0.value, 0) self.mc.lwsync() self.mc.std(r.r0.value, RFASTGILPTR.value, 0) @@ -174,16 +197,19 @@ RSHADOWPTR = self.RSHADOWPTR # r30: &root_stack_top RFASTGILPTR = self.RFASTGILPTR # r29: &fastgil RSHADOWOLD = self.RSHADOWOLD # r28: previous val of root_stack_top + RTHREADID = self.RTHREADID # r27: my thread id - # Equivalent of 'r10 = __sync_lock_test_and_set(&rpy_fastgil, 1);' - self.mc.li(r.r9.value, 1) + # Equivalent of + # r10 = __sync_val_compare_and_swap(&rpy_fastgil, 0, thread_id); + self.mc.sync() retry_label = self.mc.currpos() self.mc.ldarx(r.r10.value, 0, RFASTGILPTR.value) # load the lock value - self.mc.stdcxx(r.r9.value, 0, RFASTGILPTR.value) # try to claim lock + self.mc.cmpdi(0, r.r10.value, 0) + self.mc.bc(6, 2, +12) + self.mc.stdcxx(RTHREADID.value, 0, RFASTGILPTR.value) #try to claim lock self.mc.bc(6, 2, retry_label - self.mc.currpos()) # retry if failed self.mc.isync() - self.mc.cmpdi(0, r.r10.value, 0) b1_location = self.mc.currpos() self.mc.trap() # boehm: patched with a BEQ: jump if r10 is zero # shadowstack: patched with BNE instead @@ -196,7 +222,7 @@ # is still the same as before we released the GIL (saved # in RSHADOWOLD), and if not, we fall back to 'reacqgil_addr'. self.mc.load(r.r9.value, RSHADOWPTR.value, 0) - self.mc.cmpdi(0, r.r9.value, RSHADOWOLD.value) + self.mc.cmpd(0, r.r9.value, RSHADOWOLD.value) bne_location = b1_location b1_location = self.mc.currpos() self.mc.trap() diff -Nru pypy-7.1.1+dfsg/rpython/jit/backend/ppc/opassembler.py pypy-7.3.1+dfsg/rpython/jit/backend/ppc/opassembler.py --- pypy-7.1.1+dfsg/rpython/jit/backend/ppc/opassembler.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/backend/ppc/opassembler.py 2020-04-10 19:28:41.000000000 +0000 @@ -599,6 +599,8 @@ assert isinstance(descr, CallDescr) cb.argtypes = descr.get_arg_types() cb.restype = descr.get_result_type() + cb.ressize = descr.get_result_size() + cb.ressign = descr.is_result_signed() if is_call_release_gil: saveerrloc = arglocs[1] @@ -755,6 +757,7 @@ # mc.addi() would not be valid with operand r0. assert ofs_loc.is_imm() # must be an immediate... assert _check_imm_arg(ofs_loc.getint()) # ...that fits 16 bits + assert index_loc.is_core_reg() assert index_loc is not r.SCRATCH2 # (simplified version of _apply_scale()) if ofs_loc.value > 0: @@ -966,72 +969,6 @@ pmc.overwrite() -class StrOpAssembler(object): - - _mixin_ = True - - def emit_copystrcontent(self, op, arglocs, regalloc): - self._emit_copycontent(arglocs, is_unicode=False) - - def emit_copyunicodecontent(self, op, arglocs, regalloc): - self._emit_copycontent(arglocs, is_unicode=True) - - def _emit_load_for_copycontent(self, dst, src_ptr, src_ofs, scale): - if src_ofs.is_imm(): - value = src_ofs.value << scale - if value < 32768: - self.mc.addi(dst.value, src_ptr.value, value) - else: - self.mc.load_imm(dst, value) - self.mc.add(dst.value, src_ptr.value, dst.value) - elif scale == 0: - self.mc.add(dst.value, src_ptr.value, src_ofs.value) - else: - self.mc.sldi(dst.value, src_ofs.value, scale) - self.mc.add(dst.value, src_ptr.value, dst.value) - - def _emit_copycontent(self, arglocs, is_unicode): - [src_ptr_loc, dst_ptr_loc, - src_ofs_loc, dst_ofs_loc, length_loc] = arglocs - - if is_unicode: - basesize, itemsize, _ = symbolic.get_array_token(rstr.UNICODE, - self.cpu.translate_support_code) - if itemsize == 2: scale = 1 - elif itemsize == 4: scale = 2 - else: raise AssertionError - else: - basesize, itemsize, _ = symbolic.get_array_token(rstr.STR, - self.cpu.translate_support_code) - assert itemsize == 1 - basesize -= 1 # for the extra null character - scale = 0 - - self._emit_load_for_copycontent(r.r0, src_ptr_loc, src_ofs_loc, scale) - self._emit_load_for_copycontent(r.r2, dst_ptr_loc, dst_ofs_loc, scale) - - if length_loc.is_imm(): - length = length_loc.getint() - self.mc.load_imm(r.r5, length << scale) - else: - if scale > 0: - self.mc.sldi(r.r5.value, length_loc.value, scale) - elif length_loc is not r.r5: - self.mc.mr(r.r5.value, length_loc.value) - - self.mc.mr(r.r4.value, r.r0.value) - self.mc.addi(r.r4.value, r.r4.value, basesize) - self.mc.addi(r.r3.value, r.r2.value, basesize) - - self.mc.load_imm(self.mc.RAW_CALL_REG, self.memcpy_addr) - self.mc.raw_call() - - -class UnicodeOpAssembler(object): - _mixin_ = True - # empty! - - class AllocOpAssembler(object): _mixin_ = True @@ -1336,8 +1273,7 @@ class OpAssembler(IntOpAssembler, GuardOpAssembler, MiscOpAssembler, FieldOpAssembler, - StrOpAssembler, CallOpAssembler, - UnicodeOpAssembler, ForceOpAssembler, + CallOpAssembler, ForceOpAssembler, AllocOpAssembler, FloatOpAssembler, VectorAssembler): _mixin_ = True diff -Nru pypy-7.1.1+dfsg/rpython/jit/backend/ppc/regalloc.py pypy-7.3.1+dfsg/rpython/jit/backend/ppc/regalloc.py --- pypy-7.1.1+dfsg/rpython/jit/backend/ppc/regalloc.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/backend/ppc/regalloc.py 2020-04-10 19:28:41.000000000 +0000 @@ -767,7 +767,7 @@ def prepare_gc_store_indexed(self, op): base_loc = self.ensure_reg(op.getarg(0)) - index_loc = self.ensure_reg_or_any_imm(op.getarg(1)) + index_loc = self.ensure_reg(op.getarg(1)) value_loc = self.ensure_reg(op.getarg(2)) assert op.getarg(3).getint() == 1 # scale ofs_loc = self.ensure_reg_or_16bit_imm(op.getarg(4)) @@ -777,7 +777,7 @@ def _prepare_gc_load_indexed(self, op): base_loc = self.ensure_reg(op.getarg(0)) - index_loc = self.ensure_reg_or_any_imm(op.getarg(1)) + index_loc = self.ensure_reg(op.getarg(1)) assert op.getarg(2).getint() == 1 # scale ofs_loc = self.ensure_reg_or_16bit_imm(op.getarg(3)) assert ofs_loc.is_imm() # the arg(3) should always be a small constant @@ -802,18 +802,6 @@ temp_loc = r.SCRATCH2 return [base_loc, temp_loc] - def prepare_copystrcontent(self, op): - src_ptr_loc = self.ensure_reg(op.getarg(0)) - dst_ptr_loc = self.ensure_reg(op.getarg(1)) - src_ofs_loc = self.ensure_reg_or_any_imm(op.getarg(2)) - dst_ofs_loc = self.ensure_reg_or_any_imm(op.getarg(3)) - length_loc = self.ensure_reg_or_any_imm(op.getarg(4)) - self._spill_before_call(gc_level=0) - return [src_ptr_loc, dst_ptr_loc, - src_ofs_loc, dst_ofs_loc, length_loc] - - prepare_copyunicodecontent = prepare_copystrcontent - prepare_same_as_i = helper.prepare_unary_op prepare_same_as_r = helper.prepare_unary_op prepare_same_as_f = helper.prepare_unary_op diff -Nru pypy-7.1.1+dfsg/rpython/jit/backend/ppc/register.py pypy-7.3.1+dfsg/rpython/jit/backend/ppc/register.py --- pypy-7.1.1+dfsg/rpython/jit/backend/ppc/register.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/backend/ppc/register.py 2020-04-10 19:28:41.000000000 +0000 @@ -49,12 +49,15 @@ RCS1 = r30 # a random managed non-volatile register RCS2 = r29 # a random managed non-volatile register RCS3 = r28 # a random managed non-volatile register +RCS4 = r27 # a random managed non-volatile register RSZ = r25 # size argument to malloc_slowpath MANAGED_REGS = [r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, r25, r26, r27, r28, r29, r30] # registers r14 to r24 are not touched, we have enough # registers already + # XXX but there are still in NONVOLATILES and saved/restored + # by _save_nonvolatiles(), is that necessary?? MANAGED_FP_REGS = VOLATILES_FLOAT #+ NONVOLATILES_FLOAT @@ -64,6 +67,7 @@ assert RCS1 in MANAGED_REGS and RCS1 in NONVOLATILES assert RCS2 in MANAGED_REGS and RCS2 in NONVOLATILES assert RCS3 in MANAGED_REGS and RCS3 in NONVOLATILES +assert RCS4 in MANAGED_REGS and RCS4 in NONVOLATILES assert RSZ in MANAGED_REGS diff -Nru pypy-7.1.1+dfsg/rpython/jit/backend/test/jitlog_test.py pypy-7.3.1+dfsg/rpython/jit/backend/test/jitlog_test.py --- pypy-7.1.1+dfsg/rpython/jit/backend/test/jitlog_test.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/backend/test/jitlog_test.py 2020-04-10 19:28:41.000000000 +0000 @@ -3,15 +3,24 @@ from rpython.rlib.jit import JitDriver from rpython.jit.metainterp.test.support import LLJitMixin from rpython.rlib.rjitlog import rjitlog +from rpython.rlib.rfile import create_file +from rpython.rlib.rposix import FdValidator class LoggerTest(LLJitMixin): def test_explicit_enable(self, tmpdir): file = tmpdir.join('jitlog') - fileno = os.open(file.strpath, os.O_WRONLY | os.O_CREAT) - enable_jitlog = lambda: rjitlog.enable_jitlog(fileno) - f = self.run_sample_loop(enable_jitlog) - self.meta_interp(f, [10, 0]) + # use rfile instead of file.open since the host python and compiled + # code may use different runtime libraries (win32 visual2008 vs. + # visual2019 for instance + rfile = create_file(file.strpath, 'wb') + fileno = rfile.fileno() + with FdValidator(fileno): + enable_jitlog = lambda: rjitlog.enable_jitlog(fileno) + f = self.run_sample_loop(enable_jitlog) + self.meta_interp(f, [10, 0]) + # meta_interp calls jitlog.finish which closes the file descriptor + # rfile.close() assert os.path.exists(file.strpath) with file.open('rb') as f: diff -Nru pypy-7.1.1+dfsg/rpython/jit/backend/test/runner_test.py pypy-7.3.1+dfsg/rpython/jit/backend/test/runner_test.py --- pypy-7.1.1+dfsg/rpython/jit/backend/test/runner_test.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/backend/test/runner_test.py 2020-04-10 19:28:41.000000000 +0000 @@ -187,6 +187,9 @@ """, namespace={'targettoken': targettoken, 'fdescr': BasicFailDescr(2)}) self.cpu.compile_loop(loop.inputargs, loop.operations, looptoken) + deadframe = self.cpu.execute_token(looptoken, 10) + fail = self.cpu.get_latest_descr(deadframe) + assert fail.identifier == 2 deadframe = self.cpu.execute_token(looptoken, 2) fail = self.cpu.get_latest_descr(deadframe) assert fail.identifier == 2 @@ -339,6 +342,9 @@ self.cpu.compile_bridge(faildescr1, [i0], bridge, looptoken) + deadframe = self.cpu.execute_token(looptoken, 0) + fail = self.cpu.get_latest_descr(deadframe) + assert fail.identifier == 2 deadframe = self.cpu.execute_token(looptoken, 1) fail = self.cpu.get_latest_descr(deadframe) assert fail.identifier == 3 @@ -538,8 +544,10 @@ return chr(ord(c) + ord(c1)) functions = [ - (func_int, lltype.Signed, types.sint, 655360, 655360), - (func_int, lltype.Signed, types.sint, 655360, -293999429), + (func_int, lltype.Signed, types.slong, 655360, 655360), + (func_int, lltype.Signed, types.slong, 655360, -293999429), + (func_int, rffi.INT, types.sint, 655360, 655360), + (func_int, rffi.INT, types.sint, 655360, -293999429), (func_int, rffi.SHORT, types.sint16, 1213, 1213), (func_int, rffi.SHORT, types.sint16, 1213, -12020), (func_char, lltype.Char, types.uchar, 12, 12), @@ -703,6 +711,7 @@ shortdescr = self.cpu.fielddescrof(self.S, 'short') self.execute_operation(rop.SETFIELD_GC, [t_box, InputArgInt(250)], 'void', descr=fielddescr2) + self.execute_operation(rop.SETFIELD_GC, [t_box, InputArgInt(133)], 'void', descr=fielddescr1) self.execute_operation(rop.SETFIELD_GC, [t_box, InputArgInt(1331)], @@ -1006,15 +1015,17 @@ vsdescr = self.cpu.interiorfielddescrof(A, 'vs') kdescr = self.cpu.interiorfielddescrof(A, 'k') pdescr = self.cpu.interiorfielddescrof(A, 'p') - self.execute_operation(rop.SETINTERIORFIELD_GC, [a_box, InputArgInt(3), - boxfloat(1.5)], - 'void', descr=kdescr) - f = self.cpu.bh_getinteriorfield_gc_f(a_box.getref_base(), 3, kdescr) - assert longlong.getrealfloat(f) == 1.5 - self.cpu.bh_setinteriorfield_gc_f(a_box.getref_base(), 3, longlong.getfloatstorage(2.5), kdescr) - r = self.execute_operation(rop.GETINTERIORFIELD_GC_F, [a_box, InputArgInt(3)], - 'float', descr=kdescr) - assert longlong.getrealfloat(r) == 2.5 + if self.cpu.supports_floats: + + self.execute_operation(rop.SETINTERIORFIELD_GC, [a_box, InputArgInt(3), + boxfloat(1.5)], + 'void', descr=kdescr) + f = self.cpu.bh_getinteriorfield_gc_f(a_box.getref_base(), 3, kdescr) + assert longlong.getrealfloat(f) == 1.5 + self.cpu.bh_setinteriorfield_gc_f(a_box.getref_base(), 3, longlong.getfloatstorage(2.5), kdescr) + r = self.execute_operation(rop.GETINTERIORFIELD_GC_F, [a_box, InputArgInt(3)], + 'float', descr=kdescr) + assert longlong.getrealfloat(r) == 2.5 # NUMBER_FIELDS = [('vs', lltype.Signed), ('vu', lltype.Unsigned), @@ -2495,6 +2506,7 @@ def test_force_operations_returning_void(self): values = [] def maybe_force(token, flag): + print "CALLED WITH " + str(flag) if flag: deadframe = self.cpu.force(token) values.append(self.cpu.get_latest_descr(deadframe)) @@ -2975,11 +2987,19 @@ getter_name, primitive.cdecl(primitive.PrimitiveType[ARG], '*p'), var_name)) + c_source.append('#include ') c_source.append('') c_source.append('static void real%s(%s)' % ( fn_name, ', '.join(fn_args))) c_source.append('{') for i in range(len(ARGTYPES)): + if ARGTYPES[i] is lltype.Float: + c_source.append(' fprintf(stderr, "x%d = %%f\\n", x%d);' % (i, i)) + elif ARGTYPES[i] is lltype.Signed: + c_source.append(' fprintf(stderr, "x%d = %%ld\\n", x%d);' % (i, i)) + elif ARGTYPES[i] is rffi.UINT: + c_source.append(' fprintf(stderr, "x%d = %%u\\n", x%d);' % (i, i)) + for i in range(len(ARGTYPES)): c_source.append(' argcopy_%s_x%d = x%d;' % (fn_name, i, i)) c_source.append('}') c_source.append('RPY_EXPORTED void *%s(void)' % fn_name) @@ -3308,6 +3328,7 @@ eci = ExternalCompilationInfo( separate_module_sources=[r''' #include + #include static long f1(long a, long b, long c, long d, long e, long f, long g) { long r = GetLastError(); @@ -3710,7 +3731,8 @@ def test_assembler_call(self): called = [] def assembler_helper(deadframe, virtualizable): - assert self.cpu.get_int_value(deadframe, 0) == 97 + print "CALLED ASSEMBLER HELPER" + called.append(self.cpu.get_int_value(deadframe, 0)) called.append(self.cpu.get_latest_descr(deadframe)) return 4 + 9 @@ -3764,7 +3786,7 @@ args = [i+1 for i in range(10)] deadframe = self.cpu.execute_token(othertoken, *args) assert self.cpu.get_int_value(deadframe, 0) == 13 - assert called == [finish_descr] + assert called == [97, finish_descr] # test the fast path, which should not call assembler_helper() del called[:] @@ -4704,6 +4726,7 @@ def test_raw_load_int(self): from rpython.rlib import rawstorage + from rpython.rlib.rarithmetic import r_longlong for T in [rffi.UCHAR, rffi.SIGNEDCHAR, rffi.USHORT, rffi.SHORT, rffi.UINT, rffi.INT, @@ -4717,7 +4740,7 @@ p = rawstorage.alloc_raw_storage(31) for i in range(31): p[i] = '\xDD' - value = rffi.cast(T, -0x4243444546474849) + value = rffi.cast(T, r_longlong(-0x4243444546474849)) rawstorage.raw_storage_setitem(p, 16, value) got = self.cpu.bh_raw_load_i(rffi.cast(lltype.Signed, p), 16, arraydescr) @@ -4959,7 +4982,7 @@ EffectInfo.MOST_GENERAL) def func2(a, b, c, d, e, f, g, h, i, j, k, l): - pass + print "CALLED" FUNC2 = self.FuncType([lltype.Signed] * 12, lltype.Void) FPTR2 = self.Ptr(FUNC2) diff -Nru pypy-7.1.1+dfsg/rpython/jit/backend/tool/viewcode.py pypy-7.3.1+dfsg/rpython/jit/backend/tool/viewcode.py --- pypy-7.1.1+dfsg/rpython/jit/backend/tool/viewcode.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/backend/tool/viewcode.py 2020-04-10 19:28:41.000000000 +0000 @@ -48,6 +48,7 @@ 'i386': 'i386', 'arm': 'arm', 'arm_32': 'arm', + 'aarch64': 'aarch64', 'ppc' : 'powerpc:common64', 'ppc-64' : 'powerpc:common64', 's390x': 's390:64-bit', diff -Nru pypy-7.1.1+dfsg/rpython/jit/backend/x86/arch.py pypy-7.3.1+dfsg/rpython/jit/backend/x86/arch.py --- pypy-7.1.1+dfsg/rpython/jit/backend/x86/arch.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/backend/x86/arch.py 2020-04-10 19:28:41.000000000 +0000 @@ -35,9 +35,7 @@ PASS_ON_MY_FRAME = 15 JITFRAME_FIXED_SIZE = 6 + 8 * 2 # 6 GPR + 8 XMM * 2 WORDS/float # 'threadlocal_addr' is passed as 2nd argument on the stack, - # and it can be left here for when it is needed. As an additional hack, - # with asmgcc, it is made odd-valued to mean "already seen this frame - # during the previous minor collection". + # and it can be left here for when it is needed. THREADLOCAL_OFS = (FRAME_FIXED_SIZE + 2) * WORD else: # rbp + rbx + r12 + r13 + r14 + r15 + threadlocal + 12 extra words = 19 @@ -45,12 +43,10 @@ PASS_ON_MY_FRAME = 12 JITFRAME_FIXED_SIZE = 28 # 13 GPR + 15 XMM # 'threadlocal_addr' is passed as 2nd argument in %esi, - # and is moved into this frame location. As an additional hack, - # with asmgcc, it is made odd-valued to mean "already seen this frame - # during the previous minor collection". + # and is moved into this frame location. THREADLOCAL_OFS = (FRAME_FIXED_SIZE - 1) * WORD -assert PASS_ON_MY_FRAME >= 12 # asmgcc needs at least JIT_USE_WORDS + 3 +assert PASS_ON_MY_FRAME >= 12 # return address, followed by FRAME_FIXED_SIZE words DEFAULT_FRAME_BYTES = (1 + FRAME_FIXED_SIZE) * WORD diff -Nru pypy-7.1.1+dfsg/rpython/jit/backend/x86/assembler.py pypy-7.3.1+dfsg/rpython/jit/backend/x86/assembler.py --- pypy-7.1.1+dfsg/rpython/jit/backend/x86/assembler.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/backend/x86/assembler.py 2020-04-10 19:28:41.000000000 +0000 @@ -137,11 +137,6 @@ self.expand_byte_mask_addr = float_constants + 64 self.element_ones = [float_constants + 80 + 16*i for i in range(4)] - def set_extra_stack_depth(self, mc, value): - if self._is_asmgcc(): - extra_ofs = self.cpu.get_ofs_of_frame_field('jf_extra_stack_depth') - mc.MOV_bi(extra_ofs, value) - def build_frame_realloc_slowpath(self): mc = codebuf.MachineCodeBlockWrapper() self._push_all_regs_to_frame(mc, [], self.cpu.supports_floats) @@ -161,14 +156,20 @@ mc.MOV_sr(0, ebp.value) # align - self.set_extra_stack_depth(mc, align * WORD) + # + # * Note: these commented-out pieces of code about 'extra_stack_depth' + # * are not necessary any more, but they are kept around in case we + # * need in the future again to track the exact stack depth. + # + #self.set_extra_stack_depth(mc, align * WORD) + self._store_and_reset_exception(mc, None, ebx, ecx) mc.CALL(imm(self.cpu.realloc_frame)) mc.MOV_rr(ebp.value, eax.value) self._restore_exception(mc, None, ebx, ecx) mc.ADD_ri(esp.value, (align - 1) * WORD) - self.set_extra_stack_depth(mc, 0) + #self.set_extra_stack_depth(mc, 0) gcrootmap = self.cpu.gc_ll_descr.gcrootmap if gcrootmap and gcrootmap.is_shadow_stack: @@ -196,12 +197,12 @@ # the caller already did push_gcmap(store=True) if IS_X86_64: mc.SUB(esp, imm(WORD)) # alignment - self.set_extra_stack_depth(mc, 2 * WORD) + #self.set_extra_stack_depth(mc, 2 * WORD) # the arguments are already in the correct registers else: # we want space for 4 arguments + call + alignment mc.SUB(esp, imm(WORD * 7)) - self.set_extra_stack_depth(mc, 8 * WORD) + #self.set_extra_stack_depth(mc, 8 * WORD) # store the arguments at the correct place in the stack for i in range(4): mc.MOV_sr(i * WORD, cond_call_register_arguments[i].value) @@ -211,7 +212,7 @@ mc.ADD(esp, imm(WORD)) else: mc.ADD(esp, imm(WORD * 7)) - self.set_extra_stack_depth(mc, 0) + #self.set_extra_stack_depth(mc, 0) self.pop_gcmap(mc) # cancel the push_gcmap(store=True) in the caller self._pop_all_regs_from_frame(mc, [eax], supports_floats, callee_only) mc.RET() @@ -275,11 +276,11 @@ # (already in edx) # length mc.MOV_rr(esi.value, ecx.value) # tid mc.MOV_rs(edi.value, WORD * 3) # load the itemsize - self.set_extra_stack_depth(mc, 16) + #self.set_extra_stack_depth(mc, 16) mc.CALL(imm(follow_jump(addr))) self._reload_frame_if_necessary(mc) mc.ADD_ri(esp.value, 16 - WORD) - self.set_extra_stack_depth(mc, 0) + #self.set_extra_stack_depth(mc, 0) # mc.TEST_rr(eax.value, eax.value) # common case: not taken @@ -1018,8 +1019,6 @@ from rpython.rlib.rvmprof.rvmprof import cintf # edx = address of pypy_threadlocal_s self.mc.MOV_rs(edx.value, THREADLOCAL_OFS) - if self._is_asmgcc(): - self.mc.AND_ri(edx.value, ~1) # eax = (our local vmprof_tl_stack).next self.mc.MOV_rs(eax.value, (FRAME_FIXED_SIZE - 4 + 0) * WORD) # save in vmprof_tl_stack the value eax @@ -2236,25 +2235,6 @@ def _call_assembler_emit_call(self, addr, argloc, _): threadlocal_loc = RawEspLoc(THREADLOCAL_OFS, INT) - if self._is_asmgcc(): - # We need to remove the bit "already seen during the - # previous minor collection" instead of passing this - # value directly. - if IS_X86_64: - tmploc = esi # already the correct place - if argloc is tmploc: - # this case is theoretical only so far: in practice, - # argloc is always eax, never esi - self.mc.MOV_rr(edi.value, esi.value) - argloc = edi - else: - tmploc = eax - if tmploc is argloc: - tmploc = edx - self.mc.MOV(tmploc, threadlocal_loc) - self.mc.AND_ri(tmploc.value, ~1) - threadlocal_loc = tmploc - # self.simple_call(addr, [argloc, threadlocal_loc]) def _call_assembler_emit_helper_call(self, addr, arglocs, result_loc): @@ -2672,8 +2652,6 @@ assert self.cpu.translate_support_code assert isinstance(resloc, RegLoc) self.mc.MOV_rs(resloc.value, THREADLOCAL_OFS) - if self._is_asmgcc(): - self.mc.AND_ri(resloc.value, ~1) self.load_from_mem(resloc, addr_add_const(resloc, offset), imm(size), imm(sign)) diff -Nru pypy-7.1.1+dfsg/rpython/jit/backend/x86/callbuilder.py pypy-7.3.1+dfsg/rpython/jit/backend/x86/callbuilder.py --- pypy-7.1.1+dfsg/rpython/jit/backend/x86/callbuilder.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/backend/x86/callbuilder.py 2020-04-10 19:28:41.000000000 +0000 @@ -13,7 +13,7 @@ from rpython.jit.backend.x86.jump import remap_frame_layout from rpython.jit.backend.x86 import codebuf from rpython.jit.backend.llsupport.callbuilder import AbstractCallBuilder -from rpython.jit.backend.llsupport import llerrno +from rpython.jit.backend.llsupport import llerrno, lltls from rpython.rtyper.lltypesystem import llmemory, rffi @@ -61,13 +61,6 @@ self.arglocs = arglocs + [fnloc] self.start_frame_size = self.mc._frame_size - def select_call_release_gil_mode(self): - AbstractCallBuilder.select_call_release_gil_mode(self) - if self.asm._is_asmgcc(): - from rpython.memory.gctransform import asmgcroot - self.stack_max = PASS_ON_MY_FRAME - asmgcroot.JIT_USE_WORDS - assert self.stack_max >= 3 - def subtract_esp_aligned(self, count): if count > 0: align = align_stack_words(count) @@ -103,9 +96,14 @@ # value eax, if necessary assert not self.is_call_release_gil current_esp = self.get_current_esp() - self.change_extra_stack_depth = (current_esp != 0) - if self.change_extra_stack_depth: - self.asm.set_extra_stack_depth(self.mc, -current_esp) + # + # * Note: these commented-out pieces of code about 'extra_stack_depth' + # * are not necessary any more, but they are kept around in case we + # * need in the future again to track the exact stack depth. + # + #self.change_extra_stack_depth = (current_esp != 0) + #if self.change_extra_stack_depth: + # self.asm.set_extra_stack_depth(self.mc, -current_esp) noregs = self.asm.cpu.gc_ll_descr.is_shadow_stack() gcmap = self.asm._regalloc.get_gcmap([eax], noregs=noregs) self.asm.push_gcmap(self.mc, gcmap, store=True) @@ -119,13 +117,14 @@ # top at this point, so reuse it instead of loading it again ssreg = ebx self.asm._reload_frame_if_necessary(self.mc, shadowstack_reg=ssreg) - if self.change_extra_stack_depth: - self.asm.set_extra_stack_depth(self.mc, 0) + #if self.change_extra_stack_depth: + # self.asm.set_extra_stack_depth(self.mc, 0) self.asm.pop_gcmap(self.mc) def call_releasegil_addr_and_move_real_arguments(self, fastgil): from rpython.jit.backend.x86.assembler import heap assert self.is_call_release_gil + assert not self.asm._is_asmgcc() # # Save this thread's shadowstack pointer into 'ebx', # for later comparison @@ -135,38 +134,12 @@ rst = gcrootmap.get_root_stack_top_addr() self.mc.MOV(ebx, heap(rst)) # - if not self.asm._is_asmgcc(): - # shadowstack: change 'rpy_fastgil' to 0 (it should be - # non-zero right now). - self.change_extra_stack_depth = False - # ^^ note that set_extra_stack_depth() in this case is a no-op - css_value = imm(0) - else: - from rpython.memory.gctransform import asmgcroot - # build a 'css' structure on the stack: 2 words for the linkage, - # and 5/7 words as described for asmgcroot.ASM_FRAMEDATA, for a - # total size of JIT_USE_WORDS. This structure is found at - # [ESP+css]. - css = -self.get_current_esp() + ( - WORD * (PASS_ON_MY_FRAME - asmgcroot.JIT_USE_WORDS)) - assert css >= 2 * WORD - # Save ebp - index_of_ebp = css + WORD * (2+asmgcroot.INDEX_OF_EBP) - self.mc.MOV_sr(index_of_ebp, ebp.value) # MOV [css.ebp], EBP - # Save the "return address": we pretend that it's css - self.mc.LEA_rs(eax.value, css) # LEA eax, [css] - frame_ptr = css + WORD * (2+asmgcroot.FRAME_PTR) - self.mc.MOV_sr(frame_ptr, eax.value) # MOV [css.frame], eax - # Set up jf_extra_stack_depth to pretend that the return address - # was at css, and so our stack frame is supposedly shorter by - # (PASS_ON_MY_FRAME-JIT_USE_WORDS+1) words - delta = PASS_ON_MY_FRAME - asmgcroot.JIT_USE_WORDS + 1 - self.change_extra_stack_depth = True - self.asm.set_extra_stack_depth(self.mc, -delta * WORD) - css_value = eax + # shadowstack: change 'rpy_fastgil' to 0 (it should be + # non-zero right now). + #self.change_extra_stack_depth = False # # <--here--> would come a memory fence, if the CPU needed one. - self.mc.MOV(heap(fastgil), css_value) + self.mc.MOV(heap(fastgil), imm(0)) # if not we_are_translated(): # for testing: we should not access self.mc.ADD(ebp, imm(1)) # ebp any more @@ -184,8 +157,6 @@ self.tlofs_reg = r12 self.mc.MOV_rs(self.tlofs_reg.value, THREADLOCAL_OFS - self.get_current_esp()) - if self.asm._is_asmgcc(): - self.mc.AND_ri(self.tlofs_reg.value, ~1) return self.tlofs_reg def save_stack_position(self): @@ -302,14 +273,14 @@ # This slow-path has two entry points, with two # conditional jumps. We can jump to the regular start # of this slow-path with the 2nd conditional jump. Or, - # we can jump past the "MOV(heap(fastgil), ecx)" + # we can jump past the "MOV(heap(fastgil), 0)" # instruction from the 1st conditional jump. # This instruction reverts the rpy_fastgil acquired # previously, so that the general 'reacqgil_addr' # function can acquire it again. It must only be done # if we actually succeeded in acquiring rpy_fastgil. from rpython.jit.backend.x86.assembler import heap - mc.MOV(heap(self.fastgil), ecx) + mc.MOV(heap(self.fastgil), imm(0)) offset = mc.get_relative_pos() - self.early_jump_addr mc.overwrite32(self.early_jump_addr-4, offset) # scratch register forgotten here, by get_relative_pos() @@ -318,13 +289,6 @@ cb = self.callbuilder if not cb.result_value_saved_early: cb.save_result_value(save_edx=False) - if assembler._is_asmgcc(): - if IS_X86_32: - css_value = edx - old_value = ecx - mc.MOV_sr(4, old_value.value) - mc.MOV_sr(0, css_value.value) - # on X86_64, they are already in the right registers mc.CALL(imm(follow_jump(assembler.reacqgil_addr))) if not cb.result_value_saved_early: cb.restore_result_value(save_edx=False) @@ -333,43 +297,37 @@ from rpython.jit.backend.x86 import rx86 # # check if we need to call the reacqgil() function or not - # (to acquiring the GIL, remove the asmgcc head from - # the chained list, etc.) + # (to acquiring the GIL) mc = self.mc restore_edx = False - if not self.asm._is_asmgcc(): - css = 0 - css_value = imm(0) - old_value = ecx - else: - from rpython.memory.gctransform import asmgcroot - css = WORD * (PASS_ON_MY_FRAME - asmgcroot.JIT_USE_WORDS) - if IS_X86_32: - assert css >= 16 - if self.restype == 'L': # long long result: eax/edx - if not self.result_value_saved_early: - mc.MOV_sr(12, edx.value) - restore_edx = True - css_value = edx # note: duplicated in ReacqGilSlowPath - old_value = ecx # - elif IS_X86_64: - css_value = edi - old_value = esi - mc.LEA_rs(css_value.value, css) - # - # Use XCHG as an atomic test-and-set-lock. It also implicitly - # does a memory barrier. - mc.MOV(old_value, imm(1)) + # + # Make sure we can use 'eax' in the sequel for CMPXCHG + # On 32-bit, we also need to check if restype is 'L' for long long, + # in which case we need to save eax and edx because they are both + # used for the return value. + if self.restype in (INT, 'L') and not self.result_value_saved_early: + self.save_result_value(save_edx = self.restype == 'L') + self.result_value_saved_early = True + # + # Use LOCK CMPXCHG as a compare-and-swap with memory barrier. + tlsreg = self.get_tlofs_reg() + thread_ident_ofs = lltls.get_thread_ident_offset(self.asm.cpu) + # + mc.MOV_rm(ecx.value, (tlsreg.value, thread_ident_ofs)) + mc.XOR_rr(eax.value, eax.value) + if rx86.fits_in_32bits(fastgil): - mc.XCHG_rj(old_value.value, fastgil) + mc.LOCK() + mc.CMPXCHG_jr(fastgil, ecx.value) else: mc.MOV_ri(X86_64_SCRATCH_REG.value, fastgil) - mc.XCHG_rm(old_value.value, (X86_64_SCRATCH_REG.value, 0)) - mc.CMP(old_value, css_value) + mc.LOCK() + mc.CMPXCHG_mr((X86_64_SCRATCH_REG.value, 0), ecx.value) # gcrootmap = self.asm.cpu.gc_ll_descr.gcrootmap - if bool(gcrootmap) and gcrootmap.is_shadow_stack: + if bool(gcrootmap): from rpython.jit.backend.x86.assembler import heap + assert gcrootmap.is_shadow_stack # # When doing a call_release_gil with shadowstack, there # is the risk that the 'rpy_fastgil' was free but the @@ -377,14 +335,12 @@ # thread. So here we check if the shadowstack pointer # is still the same as before we released the GIL (saved # in 'ebx'), and if not, we fall back to 'reacqgil_addr'. - mc.J_il(rx86.Conditions['NE'], 0xfffff) # patched later + mc.J_il(rx86.Conditions['NZ'], 0xfffff) # patched later early_jump_addr = mc.get_relative_pos(break_basic_block=False) # ^^^ this jump will go to almost the same place as the - # ReacqGilSlowPath() computes, but one instruction farther, - # i.e. just after the "MOV(heap(fastgil), ecx)". + # ReacqGilSlowPath() computes, but one instruction further, + # i.e. just after the "MOV(heap(fastgil), 0)". - # here, ecx (=old_value) is zero (so rpy_fastgil was in 'released' - # state before the XCHG, but the XCHG acquired it by writing 1) rst = gcrootmap.get_root_stack_top_addr() mc = self.mc mc.CMP(ebx, heap(rst)) @@ -392,7 +348,7 @@ sp.early_jump_addr = early_jump_addr sp.fastgil = fastgil else: - sp = self.ReacqGilSlowPath(mc, rx86.Conditions['NE']) + sp = self.ReacqGilSlowPath(mc, rx86.Conditions['NZ']) sp.callbuilder = self sp.set_continue_addr(mc) self.asm.pending_slowpaths.append(sp) @@ -406,14 +362,8 @@ if not we_are_translated(): # for testing: now we can accesss mc.SUB(ebp, imm(1)) # ebp again # - # Now that we required the GIL, we can reload a possibly modified ebp - if self.asm._is_asmgcc(): - # special-case: reload ebp from the css - from rpython.memory.gctransform import asmgcroot - index_of_ebp = css + WORD * (2+asmgcroot.INDEX_OF_EBP) - mc.MOV_rs(ebp.value, index_of_ebp) # MOV EBP, [css.ebp] - #else: - # for shadowstack, done for us by _reload_frame_if_necessary() + # Now that we required the GIL, we will reload a possibly modified ebp: + # this done for us by _reload_frame_if_necessary() def save_result_value(self, save_edx): """Overridden in CallBuilder32 and CallBuilder64""" diff -Nru pypy-7.1.1+dfsg/rpython/jit/backend/x86/regalloc.py pypy-7.3.1+dfsg/rpython/jit/backend/x86/regalloc.py --- pypy-7.1.1+dfsg/rpython/jit/backend/x86/regalloc.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/backend/x86/regalloc.py 2020-04-10 19:28:41.000000000 +0000 @@ -829,10 +829,7 @@ self.xrm.before_call(save_all_regs=save_all_regs) if gc_level == SAVE_GCREF_REGS: gcrootmap = self.assembler.cpu.gc_ll_descr.gcrootmap - # we save all the GCREF registers for shadowstack and asmgcc for now - # --- for asmgcc too: we can't say "register x is a gc ref" - # without distinguishing call sites, which we don't do any - # more for now. + # we save all the GCREF registers for shadowstack if gcrootmap: # and gcrootmap.is_shadow_stack: save_all_regs = SAVE_GCREF_REGS self.rm.before_call(save_all_regs=save_all_regs) @@ -940,15 +937,6 @@ consider_cond_call_gc_wb_array = consider_cond_call_gc_wb def consider_cond_call(self, op): - # A 32-bit-only, asmgcc-only issue: 'cond_call_register_arguments' - # contains edi and esi, which are also in asmgcroot.py:ASM_FRAMEDATA. - # We must make sure that edi and esi do not contain GC pointers. - if IS_X86_32 and self.assembler._is_asmgcc(): - for box, loc in self.rm.reg_bindings.items(): - if (loc == edi or loc == esi) and box.type == REF: - self.rm.force_spill_var(box) - assert box not in self.rm.reg_bindings - # args = op.getarglist() assert 2 <= len(args) <= 4 + 2 # maximum 4 arguments v_func = args[1] @@ -1222,78 +1210,16 @@ resloc = self.force_allocate_reg(op, [op.getarg(0)]) self.perform(op, [argloc], resloc) - def consider_copystrcontent(self, op): - self._consider_copystrcontent(op, is_unicode=False) - - def consider_copyunicodecontent(self, op): - self._consider_copystrcontent(op, is_unicode=True) - - def _consider_copystrcontent(self, op, is_unicode): - # compute the source address - args = op.getarglist() - base_loc = self.rm.make_sure_var_in_reg(args[0], args) - ofs_loc = self.rm.make_sure_var_in_reg(args[2], args) - assert args[0] is not args[1] # forbidden case of aliasing - srcaddr_box = TempVar() - forbidden_vars = [args[1], args[3], args[4], srcaddr_box] - srcaddr_loc = self.rm.force_allocate_reg(srcaddr_box, forbidden_vars) - self._gen_address_inside_string(base_loc, ofs_loc, srcaddr_loc, - is_unicode=is_unicode) - # compute the destination address - base_loc = self.rm.make_sure_var_in_reg(args[1], forbidden_vars) - ofs_loc = self.rm.make_sure_var_in_reg(args[3], forbidden_vars) - forbidden_vars = [args[4], srcaddr_box] - dstaddr_box = TempVar() - dstaddr_loc = self.rm.force_allocate_reg(dstaddr_box, forbidden_vars) - self._gen_address_inside_string(base_loc, ofs_loc, dstaddr_loc, - is_unicode=is_unicode) - # compute the length in bytes - length_box = args[4] - length_loc = self.loc(length_box) - if is_unicode: - forbidden_vars = [srcaddr_box, dstaddr_box] - bytes_box = TempVar() - bytes_loc = self.rm.force_allocate_reg(bytes_box, forbidden_vars) - scale = self._get_unicode_item_scale() - if not (isinstance(length_loc, ImmedLoc) or - isinstance(length_loc, RegLoc)): - self.assembler.mov(length_loc, bytes_loc) - length_loc = bytes_loc - self.assembler.load_effective_addr(length_loc, 0, scale, bytes_loc) - length_box = bytes_box - length_loc = bytes_loc - # call memcpy() - self.rm.before_call() - self.xrm.before_call() - self.assembler.simple_call_no_collect(imm(self.assembler.memcpy_addr), - [dstaddr_loc, srcaddr_loc, length_loc]) - self.rm.possibly_free_var(length_box) - self.rm.possibly_free_var(dstaddr_box) - self.rm.possibly_free_var(srcaddr_box) - - def _gen_address_inside_string(self, baseloc, ofsloc, resloc, is_unicode): - if is_unicode: - ofs_items, _, _ = symbolic.get_array_token(rstr.UNICODE, - self.translate_support_code) - scale = self._get_unicode_item_scale() - else: - ofs_items, itemsize, _ = symbolic.get_array_token(rstr.STR, - self.translate_support_code) - assert itemsize == 1 - ofs_items -= 1 # for the extra null character - scale = 0 - self.assembler.load_effective_addr(ofsloc, ofs_items, scale, - resloc, baseloc) - - def _get_unicode_item_scale(self): - _, itemsize, _ = symbolic.get_array_token(rstr.UNICODE, - self.translate_support_code) - if itemsize == 4: - return 2 - elif itemsize == 2: - return 1 - else: - raise AssertionError("bad unicode item size") + def consider_load_effective_address(self, op): + p0 = op.getarg(0) + i0 = op.getarg(1) + ploc = self.make_sure_var_in_reg(p0, [i0]) + iloc = self.make_sure_var_in_reg(i0, [p0]) + res = self.rm.force_allocate_reg(op, [p0, i0]) + assert isinstance(op.getarg(2), ConstInt) + assert isinstance(op.getarg(3), ConstInt) + self.assembler.load_effective_addr(iloc, op.getarg(2).getint(), + op.getarg(3).getint(), res, ploc) def _consider_math_read_timestamp(self, op): # hint: try to move unrelated registers away from eax and edx now diff -Nru pypy-7.1.1+dfsg/rpython/jit/backend/x86/runner.py pypy-7.3.1+dfsg/rpython/jit/backend/x86/runner.py --- pypy-7.1.1+dfsg/rpython/jit/backend/x86/runner.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/backend/x86/runner.py 2020-04-10 19:28:41.000000000 +0000 @@ -16,6 +16,7 @@ debug = True supports_floats = True supports_singlefloats = True + supports_load_effective_address = True dont_keepalive_stuff = False # for tests with_threads = False diff -Nru pypy-7.1.1+dfsg/rpython/jit/backend/x86/rx86.py pypy-7.3.1+dfsg/rpython/jit/backend/x86/rx86.py --- pypy-7.1.1+dfsg/rpython/jit/backend/x86/rx86.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/backend/x86/rx86.py 2020-04-10 19:28:41.000000000 +0000 @@ -699,6 +699,9 @@ TEST_ai = insn(rex_w, '\xF7', orbyte(0<<3), mem_reg_plus_scaled_reg_plus_const(1), immediate(2)) TEST_mi = insn(rex_w, '\xF7', orbyte(0<<3), mem_reg_plus_const(1), immediate(2)) TEST_ji = insn(rex_w, '\xF7', orbyte(0<<3), abs_(1), immediate(2)) + TEST_ri = insn(rex_w, '\xF7', orbyte(0<<3), register(1), '\xC0', immediate(2)) + TEST_bi = insn(rex_w, '\xF7', orbyte(0<<3), stack_bp(1), immediate(2)) + TEST_br = insn(rex_w, '\x85', register(2,8), stack_bp(1)) BTS_mr = insn(rex_w, '\x0F\xAB', register(2,8), mem_reg_plus_const(1)) BTS_jr = insn(rex_w, '\x0F\xAB', register(2,8), abs_(1)) @@ -719,6 +722,10 @@ # a breakpoint INT3 = insn('\xCC') + LOCK = insn('\xF0') + CMPXCHG_jr = insn(rex_w, '\x0F\xB1', register(2,8), abs_(1)) + CMPXCHG_mr = insn(rex_w, '\x0F\xB1', register(2,8), mem_reg_plus_const(1)) + # ------------------------------ SSE2 ------------------------------ # Conversion diff -Nru pypy-7.1.1+dfsg/rpython/jit/backend/x86/test/test_runner.py pypy-7.3.1+dfsg/rpython/jit/backend/x86/test/test_runner.py --- pypy-7.1.1+dfsg/rpython/jit/backend/x86/test/test_runner.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/backend/x86/test/test_runner.py 2020-04-10 19:28:41.000000000 +0000 @@ -285,12 +285,15 @@ cases = [8, 16, 24] if WORD == 8: cases.append(32) + bigvalue = 0xAAAAAAAAAAAA + else: + bigvalue = 0xAAAAAAA for i in cases: - box = InputArgInt(0xAAAAAAAAAAAA) + box = InputArgInt(bigvalue) res = self.execute_operation(rop.INT_AND, [box, ConstInt(2 ** i - 1)], 'int') - assert res == 0xAAAAAAAAAAAA & (2 ** i - 1) + assert res == bigvalue & (2 ** i - 1) def test_nullity_with_guard(self): allops = [rop.INT_IS_TRUE] diff -Nru pypy-7.1.1+dfsg/rpython/jit/backend/x86/test/test_rx86_32_auto_encoding.py pypy-7.3.1+dfsg/rpython/jit/backend/x86/test/test_rx86_32_auto_encoding.py --- pypy-7.1.1+dfsg/rpython/jit/backend/x86/test/test_rx86_32_auto_encoding.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/backend/x86/test/test_rx86_32_auto_encoding.py 2020-04-10 19:28:41.000000000 +0000 @@ -311,6 +311,8 @@ return [] # MOV AL, [immediate]: there is a special encoding if methname == 'MOV8_jr' and args[1] == rx86.R.al: return [] # MOV [immediate], AL: there is a special encoding + if methname == 'TEST_ri' and args[0] == rx86.R.eax: + return [] # TEST EAX, constant: there is a special encoding return [args] diff -Nru pypy-7.1.1+dfsg/rpython/jit/backend/x86/test/test_rx86_64_auto_encoding.py pypy-7.3.1+dfsg/rpython/jit/backend/x86/test/test_rx86_64_auto_encoding.py --- pypy-7.1.1+dfsg/rpython/jit/backend/x86/test/test_rx86_64_auto_encoding.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/backend/x86/test/test_rx86_64_auto_encoding.py 2020-04-10 19:28:41.000000000 +0000 @@ -1,7 +1,11 @@ +import sys, py import random from rpython.jit.backend.x86 import rx86 from rpython.jit.backend.x86.test import test_rx86_32_auto_encoding +if sys.maxint <= 2**32: + py.test.skip("skipping this test on x86-32") + class TestRx86_64(test_rx86_32_auto_encoding.TestRx86_32): WORD = 8 diff -Nru pypy-7.1.1+dfsg/rpython/jit/backend/x86/test/test_rx86.py pypy-7.3.1+dfsg/rpython/jit/backend/x86/test/test_rx86.py --- pypy-7.1.1+dfsg/rpython/jit/backend/x86/test/test_rx86.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/backend/x86/test/test_rx86.py 2020-04-10 19:28:41.000000000 +0000 @@ -1,4 +1,5 @@ import py, struct +from rpython.rlib.rarithmetic import r_longlong from rpython.jit.backend.x86.rx86 import * globals().update(R.__dict__) @@ -210,8 +211,8 @@ s.MOV_ri(ebx, -0x80000003) s.MOV_ri(r13, -0x80000002) s.MOV_ri(ecx, 42) - s.MOV_ri(r12, 0x80000042) - s.MOV_ri(r12, 0x100000007) + s.MOV_ri(r12, r_longlong(0x80000042)) + s.MOV_ri(r12, r_longlong(0x100000007)) assert s.getvalue() == ('\x48\xC7\xC1\xFE\xFF\xFF\xFF' + '\x49\xC7\xC7\xFD\xFF\xFF\xFF' + '\x48\xBB\xFD\xFF\xFF\x7F\xFF\xFF\xFF\xFF' + diff -Nru pypy-7.1.1+dfsg/rpython/jit/backend/x86/test/test_zrpy_gcasmgcc.py pypy-7.3.1+dfsg/rpython/jit/backend/x86/test/test_zrpy_gcasmgcc.py --- pypy-7.1.1+dfsg/rpython/jit/backend/x86/test/test_zrpy_gcasmgcc.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/backend/x86/test/test_zrpy_gcasmgcc.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,9 +0,0 @@ -import py -from rpython.jit.backend.llsupport.test.zrpy_gc_test import CompileFrameworkTests -from rpython.translator.platform import platform as compiler - -if compiler.name == 'msvc': - py.test.skip('asmgcc buggy on msvc') - -class TestAsmGcc(CompileFrameworkTests): - gcrootfinder = "asmgcc" diff -Nru pypy-7.1.1+dfsg/rpython/jit/backend/x86/test/test_zrpy_releasegil.py pypy-7.3.1+dfsg/rpython/jit/backend/x86/test/test_zrpy_releasegil.py --- pypy-7.1.1+dfsg/rpython/jit/backend/x86/test/test_zrpy_releasegil.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/backend/x86/test/test_zrpy_releasegil.py 2020-04-10 19:28:41.000000000 +0000 @@ -1,11 +1,5 @@ from rpython.jit.backend.llsupport.test.zrpy_releasegil_test import ReleaseGILTests -from rpython.translator.platform import platform as compiler class TestShadowStack(ReleaseGILTests): gcrootfinder = "shadowstack" - - -if compiler.name != 'msvc': - class TestAsmGcc(ReleaseGILTests): - gcrootfinder = "asmgcc" diff -Nru pypy-7.1.1+dfsg/rpython/jit/backend/x86/test/test_ztranslation_external_exception.py pypy-7.3.1+dfsg/rpython/jit/backend/x86/test/test_ztranslation_external_exception.py --- pypy-7.1.1+dfsg/rpython/jit/backend/x86/test/test_ztranslation_external_exception.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/backend/x86/test/test_ztranslation_external_exception.py 2020-04-10 19:28:41.000000000 +0000 @@ -1,19 +1,12 @@ from rpython.jit.backend.llsupport.test.ztranslation_test import TranslationRemoveTypePtrTest from rpython.translator.translator import TranslationContext from rpython.config.translationoption import DEFL_GC -from rpython.translator.platform import platform as compiler -if compiler.name == 'msvc': - _MSVC = True -else: - _MSVC = False class TestTranslationRemoveTypePtrX86(TranslationRemoveTypePtrTest): def _get_TranslationContext(self): t = TranslationContext() t.config.translation.gc = DEFL_GC # 'hybrid' or 'minimark' - if not _MSVC: - t.config.translation.gcrootfinder = 'asmgcc' t.config.translation.list_comprehension_operations = True t.config.translation.gcremovetypeptr = True return t diff -Nru pypy-7.1.1+dfsg/rpython/jit/backend/zarch/callbuilder.py pypy-7.3.1+dfsg/rpython/jit/backend/zarch/callbuilder.py --- pypy-7.1.1+dfsg/rpython/jit/backend/zarch/callbuilder.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/backend/zarch/callbuilder.py 2020-04-10 19:28:41.000000000 +0000 @@ -7,10 +7,11 @@ from rpython.jit.metainterp.history import INT, FLOAT from rpython.jit.backend.llsupport.callbuilder import AbstractCallBuilder from rpython.jit.backend.llsupport.jump import remap_frame_layout -from rpython.rlib.objectmodel import we_are_translated +from rpython.rlib.objectmodel import we_are_translated, not_rpython from rpython.jit.backend.llsupport import llerrno from rpython.rtyper.lltypesystem import rffi from rpython.jit.backend.llsupport.descr import CallDescr +from rpython.jit.backend.llsupport import llerrno, lltls CALL_RELEASE_GIL_STACK_OFF = 6*WORD @@ -21,6 +22,7 @@ RSHADOWOLD = r.r8 RSHADOWPTR = r.r9 RFASTGILPTR = r.r10 + RTHREADID = r.r11 def __init__(self, assembler, fnloc, arglocs, resloc, calldescr): type = INT @@ -188,6 +190,7 @@ RSHADOWOLD = self.RSHADOWOLD RSHADOWPTR = self.RSHADOWPTR RFASTGILPTR = self.RFASTGILPTR + RTHREADID = self.RTHREADID # pos = STD_FRAME_SIZE_IN_BYTES - CALL_RELEASE_GIL_STACK_OFF self.mc.STMG(r.r8, r.r13, l.addr(pos, r.SP)) @@ -202,6 +205,7 @@ # # change 'rpy_fastgil' to 0 (it should be non-zero right now) self.mc.load_imm(RFASTGILPTR, fastgil) + self.mc.LG(RTHREADID, l.addr(0, RFASTGILPTR)) self.mc.XGR(r.SCRATCH, r.SCRATCH) # zarch is sequentially consistent self.mc.STG(r.SCRATCH, l.addr(0, RFASTGILPTR)) @@ -215,22 +219,29 @@ RSHADOWOLD = self.RSHADOWOLD # r8: previous val of root_stack_top RSHADOWPTR = self.RSHADOWPTR # r9: &root_stack_top RFASTGILPTR = self.RFASTGILPTR # r10: &fastgil + RTHREADID = self.RTHREADID # r11: holding my thread id - # Equivalent of 'r13 = __sync_lock_test_and_set(&rpy_fastgil, 1);' - self.mc.LGHI(r.SCRATCH, l.imm(1)) - self.mc.LG(r.r13, l.addr(0, RFASTGILPTR)) + # Equivalent of 'r13 = __sync_val_compre_and_swap(&rpy_fastgil, 0, thread_id);' retry_label = self.mc.currpos() - self.mc.LGR(r.r14, r.r13) - self.mc.CSG(r.r13, r.SCRATCH, l.addr(0, RFASTGILPTR)) # try to claim lock - self.mc.BRC(c.LT, l.imm(retry_label - self.mc.currpos())) # retry if failed - + self.mc.LG(r.r13, l.addr(0, RFASTGILPTR)) + # compare if &rpy_fastgil == 0 + self.mc.CGFI(r.r13, l.imm0) + branch_forward = self.mc.currpos() + self.mc.BRC(c.NE, l.imm(0)) # overwrite later + # if so try to compare and swap. + # r13 == &r10, then store the contets of r.SCRATCH to &r10 + self.mc.CSG(r.r13, RTHREADID, l.addr(0, RFASTGILPTR)) # try to claim lock + self.mc.BRC(c.NE, l.imm(retry_label - self.mc.currpos())) # retry if failed # CSG performs a serialization # zarch is sequential consistent! - self.mc.CGHI(r.r14, l.imm0) + # overwrite the branch + pmc = OverwritingBuilder(self.mc, branch_forward, 1) + pmc.BRC(c.NE, l.imm(self.mc.currpos() - branch_forward)) + + self.mc.CGHI(r.r13, l.imm0) b1_location = self.mc.currpos() - # boehm: patched with a BEQ: jump if r13 is zero - # shadowstack: patched with BNE instead + # save some space, this is patched later self.mc.reserve_cond_jump() gcrootmap = self.asm.cpu.gc_ll_descr.gcrootmap @@ -249,8 +260,8 @@ # revert the rpy_fastgil acquired above, so that the # general 'reacqgil_addr' below can acquire it again... - # (here, r14 is conveniently zero) - self.mc.STG(r.r14, l.addr(0, RFASTGILPTR)) + self.mc.XGR(r.r13, r.r13) + self.mc.STG(r.r13, l.addr(0, RFASTGILPTR)) pmc = OverwritingBuilder(self.mc, bne_location, 1) pmc.BRCL(c.NE, l.imm(self.mc.currpos() - bne_location)) @@ -260,7 +271,6 @@ # save the result we just got RSAVEDRES = RFASTGILPTR # can reuse this reg here reg = self.resloc - PARAM_SAVE_AREA_OFFSET = 0 if reg is not None: # save 1 word below the stack pointer if reg.is_core_reg(): diff -Nru pypy-7.1.1+dfsg/rpython/jit/backend/zarch/opassembler.py pypy-7.3.1+dfsg/rpython/jit/backend/zarch/opassembler.py --- pypy-7.1.1+dfsg/rpython/jit/backend/zarch/opassembler.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/backend/zarch/opassembler.py 2020-04-10 19:28:41.000000000 +0000 @@ -963,75 +963,15 @@ def _mem_offset_supported(self, value): return -2**19 <= value < 2**19 - def emit_copystrcontent(self, op, arglocs, regalloc): - self._emit_copycontent(arglocs, is_unicode=False) - - def emit_copyunicodecontent(self, op, arglocs, regalloc): - self._emit_copycontent(arglocs, is_unicode=True) - - def _emit_load_for_copycontent(self, dst, src_ptr, src_ofs, scale): - if src_ofs.is_imm(): - value = src_ofs.value << scale - if check_imm_value(value): - self.mc.AGHIK(dst, src_ptr, l.imm(value)) - else: - # it is fine to use r1 here, because it will - # only hold a value before invoking the memory copy - self.mc.load_imm(r.SCRATCH, value) - self.mc.AGRK(dst, src_ptr, r.SCRATCH) - elif scale == 0: - self.mc.AGRK(dst, src_ptr, src_ofs) - else: - self.mc.SLLG(r.SCRATCH, src_ofs, l.addr(scale)) - self.mc.AGRK(dst, src_ptr, r.SCRATCH) - - def _emit_copycontent(self, arglocs, is_unicode): - [src_ptr_loc, dst_ptr_loc, - src_ofs_loc, dst_ofs_loc, length_loc] = arglocs - - if is_unicode: - basesize, itemsize, _ = symbolic.get_array_token(rstr.UNICODE, - self.cpu.translate_support_code) - if itemsize == 2: scale = 1 - elif itemsize == 4: scale = 2 - else: raise AssertionError - else: - basesize, itemsize, _ = symbolic.get_array_token(rstr.STR, - self.cpu.translate_support_code) - assert itemsize == 1 - basesize -= 1 # for the extra null character - scale = 0 - - # src and src_len are tmp registers - src = src_ptr_loc - src_len = r.odd_reg(src) - dst = r.r0 - dst_len = r.r1 - self._emit_load_for_copycontent(src, src_ptr_loc, src_ofs_loc, scale) - self._emit_load_for_copycontent(dst, dst_ptr_loc, dst_ofs_loc, scale) - - if length_loc.is_imm(): - length = length_loc.getint() - self.mc.load_imm(dst_len, length << scale) - else: - if scale > 0: - self.mc.SLLG(dst_len, length_loc, l.addr(scale)) - else: - self.mc.LGR(dst_len, length_loc) - # ensure that src_len is as long as dst_len, otherwise - # padding bytes are written to dst - self.mc.LGR(src_len, dst_len) - - self.mc.AGHI(src, l.imm(basesize)) - self.mc.AGHI(dst, l.imm(basesize)) - - # s390x has memset directly as a hardware instruction!! - # 0xB8 means we might reference dst later - self.mc.MVCLE(dst, src, l.addr(0xB8)) - # NOTE this instruction can (determined by the cpu), just - # quit the movement any time, thus it is looped until all bytes - # are copied! - self.mc.BRC(c.OF, l.imm(-self.mc.MVCLE_byte_count)) + # ...copystrcontent logic was removed, but note that + # if we want to reintroduce support for that: + # s390x has memset directly as a hardware instruction!! + # 0xB8 means we might reference dst later + #self.mc.MVCLE(dst, src, l.addr(0xB8)) + # NOTE this instruction can (determined by the cpu), just + # quit the movement any time, thus it is looped until all bytes + # are copied! + #self.mc.BRC(c.OF, l.imm(-self.mc.MVCLE_byte_count)) def emit_zero_array(self, op, arglocs, regalloc): base_loc, startindex_loc, length_loc, \ diff -Nru pypy-7.1.1+dfsg/rpython/jit/backend/zarch/regalloc.py pypy-7.3.1+dfsg/rpython/jit/backend/zarch/regalloc.py --- pypy-7.1.1+dfsg/rpython/jit/backend/zarch/regalloc.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/backend/zarch/regalloc.py 2020-04-10 19:28:41.000000000 +0000 @@ -1269,29 +1269,6 @@ loc1 = self.ensure_reg(op.getarg(1)) return [loc0, loc1] - def prepare_copystrcontent(self, op): - """ this function needs five registers. - src & src_len: are allocated using ensure_even_odd_pair. - note that these are tmp registers, thus the actual variable - value is not modified. - src_len: when entering the assembler, src_ofs_loc's value is contained - in src_len register. - """ - src_ptr_loc, _ = \ - self.rm.ensure_even_odd_pair(op.getarg(0), - None, bind_first=True, - must_exist=False, load_loc_odd=False) - src_ofs_loc = self.ensure_reg_or_any_imm(op.getarg(2)) - dst_ptr_loc = self.ensure_reg(op.getarg(1)) - dst_ofs_loc = self.ensure_reg_or_any_imm(op.getarg(3)) - length_loc = self.ensure_reg_or_any_imm(op.getarg(4)) - # no need to spill, we do not call memcpy, but we use s390x's - # hardware instruction to copy memory - return [src_ptr_loc, dst_ptr_loc, - src_ofs_loc, dst_ofs_loc, length_loc] - - prepare_copyunicodecontent = prepare_copystrcontent - def prepare_label(self, op): descr = op.getdescr() assert isinstance(descr, TargetToken) diff -Nru pypy-7.1.1+dfsg/rpython/jit/backend/zarch/test/test_regalloc.py pypy-7.3.1+dfsg/rpython/jit/backend/zarch/test/test_regalloc.py --- pypy-7.1.1+dfsg/rpython/jit/backend/zarch/test/test_regalloc.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/backend/zarch/test/test_regalloc.py 2020-04-10 19:28:41.000000000 +0000 @@ -13,6 +13,9 @@ class FakeAssembler(object): def __init__(self): self.move_count = 0 + self.num_spills = 0 + self.num_spills_to_existing = 0 + def regalloc_mov(self, f, t): self.move_count += 1 diff -Nru pypy-7.1.1+dfsg/rpython/jit/metainterp/blackhole.py pypy-7.3.1+dfsg/rpython/jit/metainterp/blackhole.py --- pypy-7.1.1+dfsg/rpython/jit/metainterp/blackhole.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/metainterp/blackhole.py 2020-04-10 19:28:41.000000000 +0000 @@ -53,12 +53,10 @@ self.setup_descrs(asm.descrs) self.metainterp_sd = metainterp_sd self.num_interpreters = 0 - self.blackholeinterps = [] + self.blackholeinterps = None def _cleanup_(self): - # XXX don't assign a different list to blackholeinterp here, - # it confuses the annotator a lot - del self.blackholeinterps[:] + self.blackholeinterps = None def setup_insns(self, insns): assert len(insns) <= 256, "too many instructions!" @@ -239,15 +237,18 @@ return handler def acquire_interp(self): - if len(self.blackholeinterps) > 0: - return self.blackholeinterps.pop() + res = self.blackholeinterps + if res is not None: + self.blackholeinterps = res.back + return res else: self.num_interpreters += 1 return BlackholeInterpreter(self, self.num_interpreters) def release_interp(self, interp): interp.cleanup_registers() - self.blackholeinterps.append(interp) + interp.back = self.blackholeinterps + self.blackholeinterps = interp def check_shift_count(b): if not we_are_translated(): @@ -297,6 +298,7 @@ self.tmpreg_r = default_r self.tmpreg_f = default_f self.jitcode = None + self.back = None # chain unused interpreters together via this check_annotation(self.registers_i, check_list_of_plain_integers) def __repr__(self): diff -Nru pypy-7.1.1+dfsg/rpython/jit/metainterp/compile.py pypy-7.3.1+dfsg/rpython/jit/metainterp/compile.py --- pypy-7.1.1+dfsg/rpython/jit/metainterp/compile.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/metainterp/compile.py 2020-04-10 19:28:41.000000000 +0000 @@ -3,23 +3,22 @@ from rpython.rtyper.annlowlevel import ( cast_instance_to_gcref, cast_gcref_to_instance) from rpython.rlib.objectmodel import we_are_translated -from rpython.rlib.debug import debug_start, debug_stop, debug_print, have_debug_prints +from rpython.rlib.debug import ( + debug_start, debug_stop, debug_print, have_debug_prints) from rpython.rlib.rarithmetic import r_uint, intmask from rpython.rlib import rstack from rpython.rlib.jit import JitDebugInfo, Counters, dont_look_inside from rpython.rlib.rjitlog import rjitlog as jl -from rpython.rlib.objectmodel import compute_unique_id -from rpython.conftest import option -from rpython.jit.metainterp.resoperation import ResOperation, rop,\ - get_deep_immutable_oplist, OpHelpers, InputArgInt, InputArgRef,\ - InputArgFloat -from rpython.jit.metainterp.history import (TreeLoop, Const, JitCellToken, +from rpython.jit.metainterp.resoperation import ( + ResOperation, rop, get_deep_immutable_oplist, OpHelpers, InputArgInt, + InputArgRef, InputArgFloat) +from rpython.jit.metainterp.history import (TreeLoop, JitCellToken, TargetToken, AbstractFailDescr, ConstInt) from rpython.jit.metainterp import history, jitexc from rpython.jit.metainterp.optimize import InvalidLoop -from rpython.jit.metainterp.resume import (PENDINGFIELDSP, - ResumeDataDirectReader, AccumInfo) +from rpython.jit.metainterp.resume import ( + PENDINGFIELDSP, ResumeDataDirectReader) from rpython.jit.metainterp.resumecode import NUMBERING from rpython.jit.metainterp.support import adr2int from rpython.jit.codewriter import longlong @@ -30,6 +29,9 @@ raise SwitchToBlackhole(Counters.ABORT_BRIDGE) class CompileData(object): + """ An object that accumulates all of the necessary info for + the optimization phase, but does not actually have any other state + """ memo = None log_noopt = True @@ -37,10 +39,28 @@ for arg in self.trace.inputargs: arg.set_forwarded(None) -class LoopCompileData(CompileData): - """ An object that accumulates all of the necessary info for - the optimization phase, but does not actually have any other state + def optimize_trace(self, metainterp_sd, jitdriver_sd, memo): + """Optimize loop.operations to remove internal overheadish operations. + """ + from rpython.jit.metainterp.optimizeopt import build_opt_chain + # mark that a new trace has been started + log = metainterp_sd.jitlog.log_trace(jl.MARK_TRACE, metainterp_sd, None) + log.write_trace(self.trace) + if self.log_noopt: + metainterp_sd.logger_noopt.log_loop_from_trace(self.trace, memo=memo) + + self.box_names_memo = memo + optimizations = build_opt_chain(self.enable_opts) + debug_start("jit-optimize") + try: + return self.optimize(metainterp_sd, jitdriver_sd, optimizations) + finally: + self.forget_optimization_info() + debug_stop("jit-optimize") + +class PreambleCompileData(CompileData): + """ This is the case of label() ops label() """ def __init__(self, trace, runtime_boxes, call_pure_results=None, @@ -51,19 +71,12 @@ assert runtime_boxes is not None self.runtime_boxes = runtime_boxes - def optimize(self, metainterp_sd, jitdriver_sd, optimizations, unroll): - from rpython.jit.metainterp.optimizeopt.unroll import (UnrollOptimizer, - Optimizer) - - if unroll: - opt = UnrollOptimizer(metainterp_sd, jitdriver_sd, optimizations) - return opt.optimize_preamble(self.trace, - self.runtime_boxes, - self.call_pure_results, - self.box_names_memo) - else: - opt = Optimizer(metainterp_sd, jitdriver_sd, optimizations) - return opt.propagate_all_forward(self.trace, self.call_pure_results) + def optimize(self, metainterp_sd, jitdriver_sd, optimizations): + from rpython.jit.metainterp.optimizeopt.unroll import UnrollOptimizer + opt = UnrollOptimizer(metainterp_sd, jitdriver_sd, optimizations) + return opt.optimize_preamble( + self.trace, self.runtime_boxes, self.call_pure_results, + self.box_names_memo) class SimpleCompileData(CompileData): """ This represents label() ops jump with no extra info associated with @@ -76,26 +89,19 @@ self.call_pure_results = call_pure_results self.enable_opts = enable_opts - def optimize(self, metainterp_sd, jitdriver_sd, optimizations, unroll): + def optimize(self, metainterp_sd, jitdriver_sd, optimizations): from rpython.jit.metainterp.optimizeopt.optimizer import Optimizer - from rpython.jit.metainterp.optimizeopt.bridgeopt import deserialize_optimizer_knowledge - - #assert not unroll opt = Optimizer(metainterp_sd, jitdriver_sd, optimizations) - traceiter = self.trace.get_iter() - if self.resumestorage: - frontend_inputargs = self.trace.inputargs - deserialize_optimizer_knowledge(opt, self.resumestorage, - frontend_inputargs, - traceiter.inputargs) - return opt.propagate_all_forward(traceiter, self.call_pure_results) + return opt.optimize_loop( + self.trace, self.resumestorage, self.call_pure_results) class BridgeCompileData(CompileData): """ This represents ops() with a jump at the end that goes to some loop, we need to deal with virtual state and inlining of short preamble """ - def __init__(self, trace, runtime_boxes, resumestorage=None, call_pure_results=None, - enable_opts=None, inline_short_preamble=False): + def __init__(self, trace, runtime_boxes, resumestorage=None, + call_pure_results=None, enable_opts=None, + inline_short_preamble=False): self.trace = trace self.runtime_boxes = runtime_boxes self.call_pure_results = call_pure_results @@ -103,7 +109,7 @@ self.inline_short_preamble = inline_short_preamble self.resumestorage = resumestorage - def optimize(self, metainterp_sd, jitdriver_sd, optimizations, unroll): + def optimize(self, metainterp_sd, jitdriver_sd, optimizations): from rpython.jit.metainterp.optimizeopt.unroll import UnrollOptimizer opt = UnrollOptimizer(metainterp_sd, jitdriver_sd, optimizations) @@ -115,29 +121,26 @@ class UnrolledLoopData(CompileData): """ This represents label() ops jump with extra info that's from the - run of LoopCompileData. Jump goes to the same label + run of PreambleCompileData. Jump goes to the same label """ log_noopt = False def __init__(self, trace, celltoken, state, - call_pure_results=None, enable_opts=None, - inline_short_preamble=True): + call_pure_results=None, enable_opts=None): self.trace = trace self.celltoken = celltoken self.enable_opts = enable_opts self.state = state self.call_pure_results = call_pure_results - self.inline_short_preamble = inline_short_preamble - def optimize(self, metainterp_sd, jitdriver_sd, optimizations, unroll): + def optimize(self, metainterp_sd, jitdriver_sd, optimizations): from rpython.jit.metainterp.optimizeopt.unroll import UnrollOptimizer - - assert unroll # we should not be here if it's disabled opt = UnrollOptimizer(metainterp_sd, jitdriver_sd, optimizations) - return opt.optimize_peeled_loop(self.trace, self.celltoken, self.state, - self.call_pure_results, self.inline_short_preamble) + return opt.optimize_peeled_loop( + self.trace, self.celltoken, self.state, self.call_pure_results) def show_procedures(metainterp_sd, procedure=None, error=None): + from rpython.conftest import option # debugging if option and (option.view or option.viewloops): if error: @@ -173,19 +176,14 @@ original_jitcell_token = loop.original_jitcell_token assert original_jitcell_token is not None if metainterp_sd.warmrunnerdesc is not None: # for tests - assert original_jitcell_token.generation > 0 # has been registered with memmgr + assert original_jitcell_token.generation > 0 # has been registered with memmgr wref = weakref.ref(original_jitcell_token) clt = original_jitcell_token.compiled_loop_token clt.loop_token_wref = wref for op in loop.operations: descr = op.getdescr() - # not sure what descr.index is about if isinstance(descr, ResumeDescr): descr.rd_loop_token = clt # stick it there - #n = descr.index - #if n >= 0: # we also record the resumedescr number - # original_jitcell_token.compiled_loop_token.record_faildescr_index(n) - # pass if isinstance(descr, JitCellToken): # for a CALL_ASSEMBLER: record it as a potential jump. if descr is not original_jitcell_token: @@ -215,11 +213,8 @@ # ____________________________________________________________ - def compile_simple_loop(metainterp, greenkey, trace, runtime_args, enable_opts, cut_at): - from rpython.jit.metainterp.optimizeopt import optimize_trace - jitdriver_sd = metainterp.jitdriver_sd metainterp_sd = metainterp.staticdata jitcell_token = make_jitcell_token(jitdriver_sd) @@ -227,8 +222,8 @@ data = SimpleCompileData(trace, call_pure_results=call_pure_results, enable_opts=enable_opts) try: - loop_info, ops = optimize_trace(metainterp_sd, jitdriver_sd, - data, metainterp.box_names_memo) + loop_info, ops = data.optimize_trace( + metainterp_sd, jitdriver_sd, metainterp.box_names_memo) except InvalidLoop: metainterp_sd.jitlog.trace_aborted() trace.cut_at(cut_at) @@ -253,12 +248,10 @@ return target_token def compile_loop(metainterp, greenkey, start, inputargs, jumpargs, - full_preamble_needed=True, try_disabling_unroll=False): + use_unroll=True): """Try to compile a new procedure by closing the current history back to the first operation. """ - from rpython.jit.metainterp.optimizeopt import optimize_trace - metainterp_sd = metainterp.staticdata jitdriver_sd = metainterp.jitdriver_sd history = metainterp.history @@ -269,28 +262,21 @@ faildescr=None, entry_bridge=False) # enable_opts = jitdriver_sd.warmstate.enable_opts - if try_disabling_unroll: - if 'unroll' not in enable_opts: - return None - enable_opts = enable_opts.copy() - del enable_opts['unroll'] - jitcell_token = make_jitcell_token(jitdriver_sd) cut_at = history.get_trace_position() history.record(rop.JUMP, jumpargs, None, descr=jitcell_token) if start != (0, 0, 0): trace = trace.cut_trace_from(start, inputargs) - if 'unroll' not in enable_opts or not metainterp.cpu.supports_guard_gc_type: + if not use_unroll: return compile_simple_loop(metainterp, greenkey, trace, jumpargs, enable_opts, cut_at) call_pure_results = metainterp.call_pure_results - preamble_data = LoopCompileData(trace, jumpargs, + preamble_data = PreambleCompileData(trace, jumpargs, call_pure_results=call_pure_results, enable_opts=enable_opts) try: - start_state, preamble_ops = optimize_trace(metainterp_sd, jitdriver_sd, - preamble_data, - metainterp.box_names_memo) + start_state, preamble_ops = preamble_data.optimize_trace( + metainterp_sd, jitdriver_sd, metainterp.box_names_memo) except InvalidLoop: metainterp_sd.jitlog.trace_aborted() history.cut(cut_at) @@ -305,9 +291,8 @@ call_pure_results=call_pure_results, enable_opts=enable_opts) try: - loop_info, loop_ops = optimize_trace(metainterp_sd, jitdriver_sd, - loop_data, - metainterp.box_names_memo) + loop_info, loop_ops = loop_data.optimize_trace( + metainterp_sd, jitdriver_sd, metainterp.box_names_memo) except InvalidLoop: metainterp_sd.jitlog.trace_aborted() history.cut(cut_at) @@ -354,8 +339,6 @@ """Try to compile a new procedure by closing the current history back to the first operation. """ - from rpython.jit.metainterp.optimizeopt import optimize_trace - trace = metainterp.history.trace.cut_trace_from(start, inputargs) metainterp_sd = metainterp.staticdata jitdriver_sd = metainterp.jitdriver_sd @@ -375,29 +358,14 @@ call_pure_results=call_pure_results, enable_opts=enable_opts) try: - loop_info, loop_ops = optimize_trace(metainterp_sd, jitdriver_sd, - loop_data, - metainterp.box_names_memo) + loop_info, loop_ops = loop_data.optimize_trace( + metainterp_sd, jitdriver_sd, metainterp.box_names_memo) except InvalidLoop: - # Fall back on jumping directly to preamble + metainterp_sd.jitlog.trace_aborted() history.cut(cut) - history.record(rop.JUMP, jumpargs[:], None, descr=loop_jitcell_token) - loop_data = UnrolledLoopData(trace, loop_jitcell_token, start_state, - call_pure_results=call_pure_results, - enable_opts=enable_opts, - inline_short_preamble=False) - try: - loop_info, loop_ops = optimize_trace(metainterp_sd, jitdriver_sd, - loop_data, - metainterp.box_names_memo) - except InvalidLoop: - metainterp_sd.jitlog.trace_aborted() - history.cut(cut) - return None + return None label_op = loop_info.label_op - if label_op is None: - assert False, "unreachable code" # hint for some strange tests label_token = label_op.getdescr() assert isinstance(label_token, TargetToken) if label_token.short_preamble: @@ -405,9 +373,8 @@ label_token.short_preamble, metainterp.box_names_memo) loop = partial_trace loop.original_jitcell_token = loop_jitcell_token - loop.operations = (loop.operations + loop_info.extra_same_as + - [loop_info.label_op] - + loop_ops) + loop.operations = ( + loop.operations + loop_info.extra_same_as + [label_op] + loop_ops) quasi_immutable_deps = {} if loop_info.quasi_immutable_deps: @@ -419,8 +386,6 @@ target_token = loop.operations[-1].getdescr() resumekey.compile_and_attach(metainterp, loop, inputargs) - - record_loop_or_bridge(metainterp_sd, loop) return target_token def get_box_replacement(op, allow_none=False): @@ -828,6 +793,7 @@ self, inputargs, new_loop.operations, new_loop.original_jitcell_token, metainterp.box_names_memo) + record_loop_or_bridge(metainterp.staticdata, new_loop) def make_a_counter_per_value(self, guard_value_op, index): assert guard_value_op.getopnum() == rop.GUARD_VALUE @@ -1038,18 +1004,16 @@ jitdriver_sd.warmstate.attach_procedure_to_interp( self.original_greenkey, jitcell_token) metainterp_sd.stats.add_jitcell_token(jitcell_token) + record_loop_or_bridge(metainterp_sd, new_loop) def get_resumestorage(self): return None -def compile_trace(metainterp, resumekey, runtime_boxes): +def compile_trace(metainterp, resumekey, runtime_boxes, ends_with_jump=False): """Try to compile a new bridge leading from the beginning of the history to some existing place. """ - - from rpython.jit.metainterp.optimizeopt import optimize_trace - # The history contains new operations to attach as the code for the # failure of 'resumekey.guard_op'. # @@ -1058,11 +1022,6 @@ metainterp_sd = metainterp.staticdata jitdriver_sd = metainterp.jitdriver_sd - # - jd_name = jitdriver_sd.jitdriver.name - metainterp_sd.jitlog.start_new_trace(metainterp_sd, - faildescr=resumekey, entry_bridge=False, jd_name=jd_name) - # if isinstance(resumekey, ResumeAtPositionDescr): inline_short_preamble = False else: @@ -1071,11 +1030,15 @@ trace = metainterp.history.trace jitdriver_sd = metainterp.jitdriver_sd enable_opts = jitdriver_sd.warmstate.enable_opts - call_pure_results = metainterp.call_pure_results resumestorage = resumekey.get_resumestorage() - if metainterp.history.ends_with_jump: + trace.tracing_done() + metainterp_sd.jitlog.start_new_trace(metainterp_sd, + faildescr=resumekey, entry_bridge=False, + jd_name=jitdriver_sd.jitdriver.name) + + if ends_with_jump: data = BridgeCompileData(trace, runtime_boxes, resumestorage, call_pure_results=call_pure_results, enable_opts=enable_opts, @@ -1085,12 +1048,10 @@ call_pure_results=call_pure_results, enable_opts=enable_opts) try: - info, newops = optimize_trace(metainterp_sd, jitdriver_sd, - data, metainterp.box_names_memo) + info, newops = data.optimize_trace( + metainterp_sd, jitdriver_sd, metainterp.box_names_memo) except InvalidLoop: metainterp_sd.jitlog.trace_aborted() - #pdb.post_mortem(sys.exc_info()[2]) - debug_print("compile_new_bridge: got an InvalidLoop") # XXX I am fairly convinced that optimize_bridge cannot actually raise # InvalidLoop debug_print('InvalidLoop in compile_new_bridge') @@ -1104,7 +1065,6 @@ new_trace.inputargs = info.inputargs target_token = new_trace.operations[-1].getdescr() resumekey.compile_and_attach(metainterp, new_trace, inputargs) - record_loop_or_bridge(metainterp_sd, new_trace) return target_token new_trace.inputargs = info.renamed_inputargs metainterp.retrace_needed(new_trace, info) diff -Nru pypy-7.1.1+dfsg/rpython/jit/metainterp/executor.py pypy-7.3.1+dfsg/rpython/jit/metainterp/executor.py --- pypy-7.1.1+dfsg/rpython/jit/metainterp/executor.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/metainterp/executor.py 2020-04-10 19:28:41.000000000 +0000 @@ -441,6 +441,7 @@ rop.GC_STORE, rop.GC_STORE_INDEXED, rop.LOAD_FROM_GC_TABLE, + rop.LOAD_EFFECTIVE_ADDRESS, ): # list of opcodes never executed by pyjitpl continue if rop._VEC_PURE_FIRST <= value <= rop._VEC_PURE_LAST: diff -Nru pypy-7.1.1+dfsg/rpython/jit/metainterp/heapcache.py pypy-7.3.1+dfsg/rpython/jit/metainterp/heapcache.py --- pypy-7.1.1+dfsg/rpython/jit/metainterp/heapcache.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/metainterp/heapcache.py 2020-04-10 19:28:41.000000000 +0000 @@ -1,5 +1,6 @@ from rpython.jit.metainterp.history import Const, ConstInt from rpython.jit.metainterp.history import FrontendOp, RefFrontendOp +from rpython.jit.metainterp.history import new_ref_dict from rpython.jit.metainterp.resoperation import rop, OpHelpers from rpython.jit.metainterp.executor import constant_from_op from rpython.rlib.rarithmetic import r_uint32, r_uint @@ -61,12 +62,17 @@ # on writes to the field. self.quasiimmut_seen = None + # set of refs for *constants* that we've seen a quasi-immut field on. + self.quasiimmut_seen_refs = None + def _clear_cache_on_write(self, seen_allocation_of_target): if not seen_allocation_of_target: self.cache_seen_allocation.clear() self.cache_anything.clear() if self.quasiimmut_seen is not None: self.quasiimmut_seen.clear() + if self.quasiimmut_seen_refs is not None: + self.quasiimmut_seen_refs.clear() def _seen_alloc(self, ref_box): if not isinstance(ref_box, RefFrontendOp): @@ -100,6 +106,8 @@ self._invalidate_unescaped(self.cache_seen_allocation) if self.quasiimmut_seen is not None: self.quasiimmut_seen.clear() + if self.quasiimmut_seen_refs is not None: + self.quasiimmut_seen_refs.clear() def _invalidate_unescaped(self, d): for ref_box in d.keys(): @@ -162,6 +170,12 @@ # heap array cache # maps descrs to {index: CacheEntry} dicts self.heap_array_cache = {} + self.need_guard_not_invalidated = True + + # result of one loop invariant call + self.loop_invariant_result = None + self.loop_invariant_descr = None + self.loop_invariant_arg0int = -1 def reset_keep_likely_virtuals(self): # Update only 'head_version', but 'likely_virtual_version' remains @@ -272,6 +286,7 @@ rop._NOSIDEEFFECT_FIRST <= opnum <= rop._NOSIDEEFFECT_LAST or rop._GUARD_FIRST <= opnum <= rop._GUARD_LAST): return + self.need_guard_not_invalidated = True # can do better, but good start if (OpHelpers.is_plain_call(opnum) or OpHelpers.is_call_loopinvariant(opnum) or OpHelpers.is_cond_call_value(opnum) or @@ -387,7 +402,7 @@ self._set_flag(box, HF_KNOWN_NULLITY) def is_nonstandard_virtualizable(self, box): - return self._check_flag(box, HF_NONSTD_VABLE) + return self._check_flag(box, HF_NONSTD_VABLE) or self._check_flag(box, HF_SEEN_ALLOCATION) def nonstandard_virtualizables_now_known(self, box): self._set_flag(box, HF_NONSTD_VABLE) @@ -500,15 +515,37 @@ def is_quasi_immut_known(self, fielddescr, box): cache = self.heap_cache.get(fielddescr, None) - if cache is not None and cache.quasiimmut_seen is not None: - return box in cache.quasiimmut_seen + if cache is not None: + if isinstance(box, Const): + if cache.quasiimmut_seen_refs is not None: + return box.getref_base() in cache.quasiimmut_seen_refs + else: + if cache.quasiimmut_seen is not None: + return box in cache.quasiimmut_seen return False def quasi_immut_now_known(self, fielddescr, box): cache = self.heap_cache.get(fielddescr, None) if cache is None: cache = self.heap_cache[fielddescr] = CacheEntry(self) - if cache.quasiimmut_seen is not None: - cache.quasiimmut_seen[box] = None + if isinstance(box, Const): + if cache.quasiimmut_seen_refs is None: + cache.quasiimmut_seen_refs = new_ref_dict() + cache.quasiimmut_seen_refs[box.getref_base()] = None else: - cache.quasiimmut_seen = {box: None} + if cache.quasiimmut_seen is not None: + cache.quasiimmut_seen[box] = None + else: + cache.quasiimmut_seen = {box: None} + + def call_loopinvariant_known_result(self, allboxes, descr): + if self.loop_invariant_descr is not descr: + return None + if self.loop_invariant_arg0int != allboxes[0].getint(): + return None + return self.loop_invariant_result + + def call_loopinvariant_now_known(self, allboxes, descr, res): + self.loop_invariant_descr = descr + self.loop_invariant_arg0int = allboxes[0].getint() + self.loop_invariant_result = res diff -Nru pypy-7.1.1+dfsg/rpython/jit/metainterp/history.py pypy-7.3.1+dfsg/rpython/jit/metainterp/history.py --- pypy-7.1.1+dfsg/rpython/jit/metainterp/history.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/metainterp/history.py 2020-04-10 19:28:41.000000000 +0000 @@ -689,7 +689,6 @@ class History(object): - ends_with_jump = False trace = None def __init__(self): diff -Nru pypy-7.1.1+dfsg/rpython/jit/metainterp/jitprof.py pypy-7.3.1+dfsg/rpython/jit/metainterp/jitprof.py --- pypy-7.1.1+dfsg/rpython/jit/metainterp/jitprof.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/metainterp/jitprof.py 2020-04-10 19:28:41.000000000 +0000 @@ -138,6 +138,7 @@ line = "TOTAL: \t\t%f" % (self.tk - self.starttime, ) debug_print(line) self._print_intline("ops", cnt[Counters.OPS]) + self._print_intline("heapcached ops", cnt[Counters.HEAPCACHED_OPS]) self._print_intline("recorded ops", cnt[Counters.RECORDED_OPS]) self._print_intline(" calls", calls) self._print_intline("guards", cnt[Counters.GUARDS]) diff -Nru pypy-7.1.1+dfsg/rpython/jit/metainterp/opencoder.py pypy-7.3.1+dfsg/rpython/jit/metainterp/opencoder.py --- pypy-7.1.1+dfsg/rpython/jit/metainterp/opencoder.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/metainterp/opencoder.py 2020-04-10 19:28:41.000000000 +0000 @@ -7,12 +7,13 @@ """ from rpython.jit.metainterp.history import ( - ConstInt, Const, ConstFloat, ConstPtr, new_ref_dict) + ConstInt, Const, ConstFloat, ConstPtr, new_ref_dict, SwitchToBlackhole) from rpython.jit.metainterp.resoperation import AbstractResOp, AbstractInputArg,\ ResOperation, oparity, rop, opwithdescr, GuardResOp, IntOp, FloatOp, RefOp,\ opclasses from rpython.rlib.rarithmetic import intmask, r_uint from rpython.rlib.objectmodel import we_are_translated, specialize +from rpython.rlib.jit import Counters from rpython.rtyper.lltypesystem import rffi, lltype, llmemory TAGINT, TAGCONSTPTR, TAGCONSTOTHER, TAGBOX = range(4) @@ -301,7 +302,8 @@ def tracing_done(self): from rpython.rlib.debug import debug_start, debug_stop, debug_print - assert not self.tag_overflow + if self.tag_overflow: + raise SwitchToBlackhole(Counters.ABORT_TOO_LONG) self._bigints_dict = {} self._refs_dict = new_ref_dict() diff -Nru pypy-7.1.1+dfsg/rpython/jit/metainterp/optimizeopt/bridgeopt.py pypy-7.3.1+dfsg/rpython/jit/metainterp/optimizeopt/bridgeopt.py --- pypy-7.1.1+dfsg/rpython/jit/metainterp/optimizeopt/bridgeopt.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/metainterp/optimizeopt/bridgeopt.py 2020-04-10 19:28:41.000000000 +0000 @@ -3,6 +3,7 @@ from rpython.jit.metainterp import resumecode from rpython.jit.metainterp.history import Const, ConstInt, CONST_NULL +from .info import getptrinfo # adds the following sections at the end of the resume code: @@ -75,7 +76,7 @@ for box in liveboxes: if box is None or box.type != "r": continue - info = optimizer.getptrinfo(box) + info = getptrinfo(box) known_class = info is not None and info.get_known_class(optimizer.cpu) is not None bitfield <<= 1 bitfield |= known_class diff -Nru pypy-7.1.1+dfsg/rpython/jit/metainterp/optimizeopt/heap.py pypy-7.3.1+dfsg/rpython/jit/metainterp/optimizeopt/heap.py --- pypy-7.1.1+dfsg/rpython/jit/metainterp/optimizeopt/heap.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/metainterp/optimizeopt/heap.py 2020-04-10 19:28:41.000000000 +0000 @@ -1,26 +1,19 @@ -import os from collections import OrderedDict from rpython.jit.codewriter.effectinfo import EffectInfo from rpython.jit.metainterp.optimizeopt.util import args_dict -from rpython.jit.metainterp.history import Const, ConstInt, new_ref_dict -from rpython.jit.metainterp.jitexc import JitException +from rpython.jit.metainterp.history import new_ref_dict from rpython.jit.metainterp.optimizeopt.optimizer import Optimization, REMOVED -from rpython.jit.metainterp.optimizeopt.util import make_dispatcher_method +from rpython.jit.metainterp.optimizeopt.util import ( + make_dispatcher_method, get_box_replacement) from rpython.jit.metainterp.optimizeopt.intutils import IntBound from rpython.jit.metainterp.optimizeopt.shortpreamble import PreambleOp from rpython.jit.metainterp.optimize import InvalidLoop -from rpython.jit.metainterp.resoperation import rop, ResOperation, OpHelpers,\ - GuardResOp +from rpython.jit.metainterp.resoperation import rop from rpython.rlib.objectmodel import we_are_translated from rpython.jit.metainterp.optimizeopt import info - -class BogusImmutableField(JitException): - pass - - class AbstractCachedEntry(object): """ abstract base class abstracting over the difference between caching struct fields and array items. """ @@ -56,40 +49,32 @@ descr, index=-1): assert self._lazy_set is None for i, info in enumerate(self.cached_infos): - structbox = optimizer.get_box_replacement(self.cached_structs[i]) + structbox = get_box_replacement(self.cached_structs[i]) info.produce_short_preamble_ops(structbox, descr, index, optimizer, shortboxes) - def possible_aliasing(self, optheap, opinfo): + def possible_aliasing(self, opinfo): # If lazy_set is set and contains a setfield on a different # structvalue, then we are annoyed, because it may point to either # the same or a different structure at runtime. # XXX constants? return (self._lazy_set is not None - and (not optheap.getptrinfo( - self._lazy_set.getarg(0)).same_info(opinfo))) + and not info.getptrinfo(self._lazy_set.getarg(0)).same_info(opinfo)) def do_setfield(self, optheap, op): # Update the state with the SETFIELD_GC/SETARRAYITEM_GC operation 'op'. structinfo = optheap.ensure_ptr_info_arg0(op) - arg1 = optheap.get_box_replacement(self._get_rhs_from_set_op(op)) - if self.possible_aliasing(optheap, structinfo): + arg1 = get_box_replacement(self._get_rhs_from_set_op(op)) + if self.possible_aliasing(structinfo): self.force_lazy_set(optheap, op.getdescr()) - assert not self.possible_aliasing(optheap, structinfo) + assert not self.possible_aliasing(structinfo) cached_field = self._getfield(structinfo, op.getdescr(), optheap, False) if cached_field is not None: - cached_field = optheap.get_box_replacement(cached_field) - - # Hack to ensure constants are imported from the preamble - # XXX no longer necessary? - #if cached_fieldvalue and fieldvalue.is_constant(): - # optheap.optimizer.ensure_imported(cached_fieldvalue) - # cached_fieldvalue = self._cached_fields.get(structvalue, None) + cached_field = cached_field.get_box_replacement() if not cached_field or not cached_field.same_box(arg1): # common case: store the 'op' as lazy_set self._lazy_set = op - else: # this is the case where the pending setfield ends up # storing precisely the value that is already there, @@ -104,11 +89,11 @@ def getfield_from_cache(self, optheap, opinfo, descr): # Returns the up-to-date field's value, or None if not cached. - if self.possible_aliasing(optheap, opinfo): + if self.possible_aliasing(opinfo): self.force_lazy_set(optheap, descr) if self._lazy_set is not None: op = self._lazy_set - return optheap.get_box_replacement(self._get_rhs_from_set_op(op)) + return get_box_replacement(self._get_rhs_from_set_op(op)) else: res = self._getfield(opinfo, descr, optheap) if res is not None: @@ -140,7 +125,6 @@ elif not can_cache: self.invalidate(descr) - # abstract methods def _get_rhs_from_set_op(self, op): @@ -167,8 +151,8 @@ return op.getarg(1) def put_field_back_to_info(self, op, opinfo, optheap): - arg = optheap.get_box_replacement(op.getarg(1)) - struct = optheap.get_box_replacement(op.getarg(0)) + arg = get_box_replacement(op.getarg(1)) + struct = get_box_replacement(op.getarg(0)) opinfo.setfield(op.getdescr(), struct, arg, optheap=optheap, cf=self) def _getfield(self, opinfo, descr, optheap, true_force=True): @@ -216,8 +200,8 @@ return res def put_field_back_to_info(self, op, opinfo, optheap): - arg = optheap.get_box_replacement(op.getarg(2)) - struct = optheap.get_box_replacement(op.getarg(0)) + arg = get_box_replacement(op.getarg(2)) + struct = get_box_replacement(op.getarg(0)) opinfo.setitem(op.getdescr(), self.index, struct, arg, optheap=optheap, cf=self) def invalidate(self, descr): @@ -245,7 +229,6 @@ # cache of corresponding {array descrs: dict 'entries' field descr} self.corresponding_array_descrs = {} # - self._remove_guard_not_invalidated = False self._seen_guard_not_invalidated = False def setup(self): @@ -412,8 +395,8 @@ d = self.cached_dict_reads[descr1] = args_dict() self.corresponding_array_descrs[descrs[1]] = descr1 # - key = [self.optimizer.get_box_replacement(op.getarg(1)), # dict - self.optimizer.get_box_replacement(op.getarg(2))] # key + key = [get_box_replacement(op.getarg(1)), # dict + get_box_replacement(op.getarg(2))] # key # other args can be ignored here (hash, store_flag) try: res_v = d[key] @@ -525,7 +508,7 @@ # guards' resume data is that of a virtual object that is stored # into a field of a non-virtual object. Here, 'op' in either # SETFIELD_GC or SETARRAYITEM_GC. - opinfo = self.getptrinfo(op.getarg(0)) + opinfo = info.getptrinfo(op.getarg(0)) assert not opinfo.is_virtual() # it must be a non-virtual if self.optimizer.is_virtual(op.getarg(2)): pendingfields.append(op) @@ -564,13 +547,6 @@ def optimize_SETFIELD_GC(self, op): self.setfield(op) - #opnum = OpHelpers.getfield_pure_for_descr(op.getdescr()) - #if self.has_pure_result(opnum, [op.getarg(0)], - # op.getdescr()): - # os.write(2, '[bogus _immutable_field_ declaration: %s]\n' % - # (op.getdescr().repr_of_descr())) - # raise BogusImmutableField - # def setfield(self, op): cf = self.field_cache(op.getdescr()) @@ -606,8 +582,8 @@ index = indexb.getint() cf = self.arrayitem_cache(op.getdescr(), index) arrayinfo.setitem(op.getdescr(), indexb.getint(), - self.get_box_replacement(op.getarg(0)), - self.get_box_replacement(op), optheap=self, + get_box_replacement(op.getarg(0)), + get_box_replacement(op), optheap=self, cf=cf) optimize_GETARRAYITEM_GC_R = optimize_GETARRAYITEM_GC_I optimize_GETARRAYITEM_GC_F = optimize_GETARRAYITEM_GC_I @@ -639,13 +615,6 @@ optimize_GETARRAYITEM_GC_PURE_F = optimize_GETARRAYITEM_GC_PURE_I def optimize_SETARRAYITEM_GC(self, op): - #opnum = OpHelpers.getarrayitem_pure_for_descr(op.getdescr()) - #if self.has_pure_result(opnum, [op.getarg(0), op.getarg(1)], - # op.getdescr()): - # os.write(2, '[bogus immutable array declaration: %s]\n' % - # (op.getdescr().repr_of_descr())) - # raise BogusImmutableField - # indexb = self.getintbound(op.getarg(1)) if indexb.is_constant(): arrayinfo = self.ensure_ptr_info_arg0(op) @@ -659,6 +628,20 @@ # and then emit the operation return self.emit(op) + def optimize_GC_LOAD_I(self, op): + # seeing a 'gc_load*' forces all the lazy sets that are still + # pending, as an approximation. We could try to be really clever + # and only force some of them, but we don't have any descr here. + self.force_all_lazy_sets() + self.make_nonnull(op.getarg(0)) + return self.emit(op) + optimize_GC_LOAD_R = optimize_GC_LOAD_I + optimize_GC_LOAD_F = optimize_GC_LOAD_I + + optimize_GC_LOAD_INDEXED_I = optimize_GC_LOAD_I + optimize_GC_LOAD_INDEXED_R = optimize_GC_LOAD_I + optimize_GC_LOAD_INDEXED_F = optimize_GC_LOAD_I + def optimize_QUASIIMMUT_FIELD(self, op): # Pattern: QUASIIMMUT_FIELD(s, descr=QuasiImmutDescr) # x = GETFIELD_GC(s, descr='inst_x') # pure @@ -671,7 +654,6 @@ # registered. structvalue = self.ensure_ptr_info_arg0(op) if not structvalue.is_constant(): - self._remove_guard_not_invalidated = True return # not a constant at all; ignore QUASIIMMUT_FIELD # from rpython.jit.metainterp.quasiimmut import QuasiImmutDescr @@ -680,18 +662,25 @@ # check that the value is still correct; it could have changed # already between the tracing and now. In this case, we mark the loop # as invalid - if not qmutdescr.is_still_valid_for( - self.get_box_replacement(op.getarg(0))): + if not qmutdescr.is_still_valid_for(get_box_replacement(op.getarg(0))): raise InvalidLoop('quasi immutable field changed during tracing') # record as an out-of-line guard if self.optimizer.quasi_immutable_deps is None: self.optimizer.quasi_immutable_deps = {} self.optimizer.quasi_immutable_deps[qmutdescr.qmut] = None - self._remove_guard_not_invalidated = False def optimize_GUARD_NOT_INVALIDATED(self, op): - if self._remove_guard_not_invalidated: - return + # logic: we need one guard_not_invalidated after every call that can + # invalidate something. This is independent to whether the + # quasiimmut_field op is removed or not! The tracer will only trace one + # guard_not_invalidated after each call, so even if the first + # quasiimmut_field is removed, the second one might not be and could + # rely on the presence of an earlier guard_not_invalidated. This might + # under rare circumstances leave a extra guard_not_invalidated in the + # trace! But guard_not_invalidated is cheap, it emits no instructions + # and its only cost is the size of the resume data. Therfore that is + # still a better tradeoff than capturing resume data for every + # quasiimmut_field in the front end *all the time* if self._seen_guard_not_invalidated: return self._seen_guard_not_invalidated = True @@ -701,10 +690,10 @@ result_getfield = [] for descr, cf in self.cached_fields.iteritems(): if cf._lazy_set: - continue # XXX safe default for now + continue # XXX safe default for now parent_descr = descr.get_parent_descr() if not parent_descr.is_object(): - continue # XXX could be extended to non-instance objects + continue # XXX could be extended to non-instance objects for i, box1 in enumerate(cf.cached_structs): if not box1.is_constant() and box1 not in available_boxes: continue @@ -721,7 +710,7 @@ for descr, indexdict in self.cached_arrayitems.iteritems(): for index, cf in indexdict.iteritems(): if cf._lazy_set: - continue # XXX safe default for now + continue # XXX safe default for now for i, box1 in enumerate(cf.cached_structs): if not box1.is_constant() and box1 not in available_boxes: continue diff -Nru pypy-7.1.1+dfsg/rpython/jit/metainterp/optimizeopt/info.py pypy-7.3.1+dfsg/rpython/jit/metainterp/optimizeopt/info.py --- pypy-7.1.1+dfsg/rpython/jit/metainterp/optimizeopt/info.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/metainterp/optimizeopt/info.py 2020-04-10 19:28:41.000000000 +0000 @@ -1,13 +1,14 @@ -from rpython.rlib.objectmodel import specialize, we_are_translated, compute_hash -from rpython.jit.metainterp.resoperation import AbstractValue, ResOperation,\ - rop, OpHelpers -from rpython.jit.metainterp.history import ConstInt, Const -from rpython.rtyper.lltypesystem import lltype, llmemory -from rpython.jit.metainterp.optimizeopt.rawbuffer import RawBuffer, InvalidRawOperation +from rpython.rlib.objectmodel import specialize, compute_hash +from rpython.jit.metainterp.resoperation import ( + AbstractValue, ResOperation, rop, OpHelpers) +from rpython.jit.metainterp.history import ConstInt, ConstPtr, Const +from rpython.rtyper.lltypesystem import lltype +from rpython.jit.metainterp.optimizeopt.rawbuffer import ( + RawBuffer, InvalidRawOperation) from rpython.jit.metainterp.executor import execute from rpython.jit.metainterp.optimize import InvalidLoop - +from .util import get_box_replacement INFO_NULL = 0 INFO_NONNULL = 1 @@ -51,7 +52,7 @@ def force_at_the_end_of_preamble(self, op, optforce, rec): if not self.is_virtual(): - return optforce.get_box_replacement(op) + return get_box_replacement(op) return self._force_at_the_end_of_preamble(op, optforce, rec) def get_known_class(self, cpu): @@ -84,7 +85,7 @@ @specialize.arg(2) def get_constant_string_spec(self, string_optimizer, mode): - return None # can't be constant + return None # can't be constant class NonNullPtrInfo(PtrInfo): _attrs_ = ('last_guard_pos',) @@ -109,7 +110,7 @@ def mark_last_guard(self, optimizer): if (optimizer.getlastop() is None or - not optimizer.getlastop().is_guard()): + not optimizer.getlastop().is_guard()): # there can be a really emitted operation that's not a guard # e.g. a setfield, ignore those return @@ -140,12 +141,12 @@ constptr = optforce.optimizer.constant_fold(op) op.set_forwarded(constptr) self._is_virtual = False - self._force_elements_immutable(self.descr, constptr, optforce) + self._force_elements_immutable(self.descr, constptr, optforce.optimizer) return constptr # op.set_forwarded(None) optforce.emit_extra(op) - newop = optforce.getlastop() + newop = optforce.optimizer.getlastop() if newop is not op: op.set_forwarded(newop) newop.set_forwarded(self) @@ -161,14 +162,14 @@ def is_virtual(self): return self._is_virtual - def _visitor_walk_recursive(self, op, visitor, optimizer): + def _visitor_walk_recursive(self, op, visitor): raise NotImplementedError("abstract") - def visitor_walk_recursive(self, instbox, visitor, optimizer): + def visitor_walk_recursive(self, instbox, visitor): instbox = instbox.get_box_replacement() if visitor.already_seen_virtual(instbox): return - return self._visitor_walk_recursive(instbox, visitor, optimizer) + return self._visitor_walk_recursive(instbox, visitor) class AbstractStructPtrInfo(AbstractVirtualPtrInfo): @@ -181,7 +182,7 @@ self.descr = descr self._fields = [None] * len(descr.get_all_fielddescrs()) if index >= len(self._fields): - self.descr = descr # a more precise descr + self.descr = descr # a more precise descr # we found out a subclass with more fields extra_len = len(descr.get_all_fielddescrs()) - len(self._fields) self._fields = self._fields + [None] * extra_len @@ -218,7 +219,7 @@ for i, fielddescr in enumerate(descr.get_all_fielddescrs()): fld = self._fields[i] if fld is not None: - subbox = optforce.force_box(fld) + subbox = optforce.optimizer.force_box(fld) setfieldop = ResOperation(rop.SETFIELD_GC, [op, subbox], descr=fielddescr) self._fields[i] = None @@ -226,31 +227,30 @@ def _force_at_the_end_of_preamble(self, op, optforce, rec): if self._fields is None: - return optforce.get_box_replacement(op) + return get_box_replacement(op) if self in rec: - return optforce.get_box_replacement(op) + return get_box_replacement(op) rec[self] = None for i, fldbox in enumerate(self._fields): if fldbox is not None: - info = optforce.getptrinfo(fldbox) + info = getptrinfo(fldbox) if info is not None: fldbox = info.force_at_the_end_of_preamble(fldbox, optforce, rec) self._fields[i] = fldbox return op - def _visitor_walk_recursive(self, instbox, visitor, optimizer): + def _visitor_walk_recursive(self, instbox, visitor): lst = self.descr.get_all_fielddescrs() assert self.is_virtual() - visitor.register_virtual_fields(instbox, - [optimizer.get_box_replacement(box) - for box in self._fields]) + visitor.register_virtual_fields( + instbox, [get_box_replacement(box) for box in self._fields]) for i in range(len(lst)): op = self._fields[i] if op: - fieldinfo = optimizer.getptrinfo(op) + fieldinfo = getptrinfo(op) if fieldinfo and fieldinfo.is_virtual(): - fieldinfo.visitor_walk_recursive(op, visitor, optimizer) + fieldinfo.visitor_walk_recursive(op, visitor) def produce_short_preamble_ops(self, structbox, fielddescr, index, optimizer, shortboxes): @@ -259,7 +259,7 @@ if fielddescr.get_index() >= len(self._fields): # we don't know about this item return - op = optimizer.get_box_replacement(self._fields[fielddescr.get_index()]) + op = get_box_replacement(self._fields[fielddescr.get_index()]) if op is None: # XXX same bug as in serialize_opt: # op should never be None, because that's an invariant violation in @@ -290,7 +290,7 @@ if op.is_constant(): pass # it is a constant value: ok else: - fieldinfo = optimizer.getptrinfo(op) + fieldinfo = getptrinfo(op) if fieldinfo and fieldinfo.is_virtual(): # recursive check if memo is None: @@ -302,12 +302,12 @@ return False # not a constant at all return True - def _force_elements_immutable(self, descr, constptr, optforce): + def _force_elements_immutable(self, descr, constptr, optimizer): for i, fielddescr in enumerate(descr.get_all_fielddescrs()): fld = self._fields[i] - subbox = optforce.force_box(fld) + subbox = optimizer.force_box(fld) assert isinstance(subbox, Const) - execute(optforce.optimizer.cpu, None, rop.SETFIELD_GC, + execute(optimizer.cpu, None, rop.SETFIELD_GC, fielddescr, constptr, subbox) class InstancePtrInfo(AbstractStructPtrInfo): @@ -435,8 +435,8 @@ [op, ConstInt(offset), itembox], descr=descr) optforce.emit_extra(setfield_op) - def _visitor_walk_recursive(self, op, visitor, optimizer): - itemboxes = [optimizer.get_box_replacement(box) + def _visitor_walk_recursive(self, op, visitor): + itemboxes = [get_box_replacement(box) for box in self._get_buffer().values] visitor.register_virtual_fields(op, itemboxes) # there can be no virtuals stored in raw buffer @@ -465,21 +465,21 @@ return self.parent is not None def getitem_raw(self, offset, itemsize, descr): - return self.parent.getitem_raw(self.offset+offset, itemsize, descr) + return self.parent.getitem_raw(self.offset + offset, itemsize, descr) def setitem_raw(self, offset, itemsize, descr, itemop): - self.parent.setitem_raw(self.offset+offset, itemsize, descr, itemop) + self.parent.setitem_raw(self.offset + offset, itemsize, descr, itemop) def _force_elements(self, op, optforce, descr): if self.parent.is_virtual(): self.parent._force_elements(op, optforce, descr) self.parent = None - def _visitor_walk_recursive(self, op, visitor, optimizer): - source_op = optimizer.get_box_replacement(op.getarg(0)) + def _visitor_walk_recursive(self, op, visitor): + source_op = get_box_replacement(op.getarg(0)) visitor.register_virtual_fields(op, [source_op]) if self.parent.is_virtual(): - self.parent.visitor_walk_recursive(source_op, visitor, optimizer) + self.parent.visitor_walk_recursive(source_op, visitor) @specialize.argtype(1) def visitor_dispatch_virtual_type(self, visitor): @@ -534,7 +534,7 @@ def _force_elements(self, op, optforce, descr): # XXX descr = op.getdescr() - const = optforce.new_const_item(self.descr) + const = optforce.optimizer.new_const_item(self.descr) for i in range(self.length): item = self._items[i] if item is None: @@ -543,7 +543,7 @@ # clear the item so we don't know what's there self._items[i] = None continue - subbox = optforce.force_box(item) + subbox = optforce.optimizer.force_box(item) setop = ResOperation(rop.SETARRAYITEM_GC, [op, ConstInt(i), subbox], descr=descr) @@ -570,17 +570,15 @@ def getlength(self): return self.length - def _visitor_walk_recursive(self, instbox, visitor, optimizer): - itemops = [optimizer.get_box_replacement(item) - for item in self._items] + def _visitor_walk_recursive(self, instbox, visitor): + itemops = [get_box_replacement(item) for item in self._items] visitor.register_virtual_fields(instbox, itemops) for i in range(self.getlength()): itemop = self._items[i] - if (itemop is not None and - not isinstance(itemop, Const)): - ptrinfo = optimizer.getptrinfo(itemop) + if (itemop is not None and not isinstance(itemop, Const)): + ptrinfo = getptrinfo(itemop) if ptrinfo and ptrinfo.is_virtual(): - ptrinfo.visitor_walk_recursive(itemop, visitor, optimizer) + ptrinfo.visitor_walk_recursive(itemop, visitor) @specialize.argtype(1) def visitor_dispatch_virtual_type(self, visitor): @@ -596,7 +594,7 @@ item = self._items[index] if item is not None: # see comment in AbstractStructPtrInfo.produce_short_preamble_ops - op = optimizer.get_box_replacement(item) + op = get_box_replacement(item) opnum = OpHelpers.getarrayitem_for_descr(descr) getarrayitem_op = ResOperation(opnum, [structbox, ConstInt(index)], descr=descr) @@ -604,13 +602,13 @@ def _force_at_the_end_of_preamble(self, op, optforce, rec): if self._items is None: - return optforce.get_box_replacement(op) + return get_box_replacement(op) if self in rec: - return optforce.get_box_replacement(op) + return get_box_replacement(op) rec[self] = None for i, fldbox in enumerate(self._items): if fldbox is not None: - info = optforce.getptrinfo(fldbox) + info = getptrinfo(fldbox) if info is not None: fldbox = info.force_at_the_end_of_preamble(fldbox, optforce, rec) @@ -640,7 +638,7 @@ def _compute_index(self, index, fielddescr): all_fdescrs = fielddescr.get_arraydescr().get_all_fielddescrs() if all_fdescrs is None: - return 0 # annotation hack + return 0 # annotation hack one_size = len(all_fdescrs) return index * one_size + fielddescr.get_field_descr().get_index() @@ -659,7 +657,7 @@ for fielddescr in fielddescrs: fld = self._items[i] if fld is not None: - subbox = optforce.force_box(fld) + subbox = optforce.optimizer.force_box(fld) setfieldop = ResOperation(rop.SETINTERIORFIELD_GC, [op, ConstInt(index), subbox], descr=fielddescr) @@ -668,21 +666,18 @@ # if it does, we would need a fix here i += 1 - def _visitor_walk_recursive(self, instbox, visitor, optimizer): - itemops = [optimizer.get_box_replacement(item) - for item in self._items] + def _visitor_walk_recursive(self, instbox, visitor): + itemops = [get_box_replacement(item) for item in self._items] visitor.register_virtual_fields(instbox, itemops) fielddescrs = self.descr.get_all_fielddescrs() i = 0 for index in range(self.getlength()): for fielddescr in fielddescrs: itemop = self._items[i] - if (itemop is not None and - not isinstance(itemop, Const)): - ptrinfo = optimizer.getptrinfo(itemop) + if (itemop is not None and not isinstance(itemop, Const)): + ptrinfo = getptrinfo(itemop) if ptrinfo and ptrinfo.is_virtual(): - ptrinfo.visitor_walk_recursive(itemop, visitor, - optimizer) + ptrinfo.visitor_walk_recursive(itemop, visitor) i += 1 @specialize.argtype(1) @@ -705,7 +700,8 @@ def _get_info(self, descr, optheap): ref = self._const.getref_base() - if not ref: raise InvalidLoop # null protection + if not ref: + raise InvalidLoop # null protection info = optheap.const_infos.get(ref, None) if info is None: info = StructPtrInfo(descr) @@ -714,7 +710,8 @@ def _get_array_info(self, descr, optheap): ref = self._const.getref_base() - if not ref: raise InvalidLoop # null protection + if not ref: + raise InvalidLoop # null protection info = optheap.const_infos.get(ref, None) if info is None: info = ArrayPtrInfo(descr) @@ -780,8 +777,8 @@ return self._unpack_str(mode) def getlenbound(self, mode): - from rpython.jit.metainterp.optimizeopt.intutils import ConstIntBound,\ - IntLowerBound + from rpython.jit.metainterp.optimizeopt.intutils import ( + ConstIntBound, IntLowerBound) length = self.getstrlen1(mode) if length < 0: @@ -848,3 +845,36 @@ def make_guards(self, op, short, optimizer): short.append(ResOperation(rop.GUARD_VALUE, [op, self._const])) + + +def getrawptrinfo(op): + from rpython.jit.metainterp.optimizeopt.intutils import IntBound + assert op.type == 'i' + op = op.get_box_replacement() + assert op.type == 'i' + if isinstance(op, ConstInt): + return ConstPtrInfo(op) + fw = op.get_forwarded() + if isinstance(fw, IntBound): + return None + if fw is not None: + assert isinstance(fw, AbstractRawPtrInfo) + return fw + return None + +def getptrinfo(op): + if op.type == 'i': + return getrawptrinfo(op) + elif op.type == 'f': + return None + assert op.type == 'r' + op = get_box_replacement(op) + assert op.type == 'r' + if isinstance(op, ConstPtr): + return ConstPtrInfo(op) + fw = op.get_forwarded() + if fw is not None: + assert isinstance(fw, PtrInfo) + return fw + return None + diff -Nru pypy-7.1.1+dfsg/rpython/jit/metainterp/optimizeopt/__init__.py pypy-7.3.1+dfsg/rpython/jit/metainterp/optimizeopt/__init__.py --- pypy-7.1.1+dfsg/rpython/jit/metainterp/optimizeopt/__init__.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/metainterp/optimizeopt/__init__.py 2020-04-10 19:28:41.000000000 +0000 @@ -1,4 +1,3 @@ -from rpython.jit.metainterp.optimizeopt.optimizer import Optimizer from rpython.jit.metainterp.optimizeopt.rewrite import OptRewrite from rpython.jit.metainterp.optimizeopt.intbounds import OptIntBounds from rpython.jit.metainterp.optimizeopt.virtualize import OptVirtualize @@ -7,10 +6,8 @@ from rpython.jit.metainterp.optimizeopt.simplify import OptSimplify from rpython.jit.metainterp.optimizeopt.pure import OptPure from rpython.jit.metainterp.optimizeopt.earlyforce import OptEarlyForce -from rpython.rlib.rjitlog import rjitlog as jl from rpython.rlib.jit import PARAMETERS, ENABLE_ALL_OPTS from rpython.rlib.unroll import unrolling_iterable -from rpython.rlib.debug import debug_start, debug_stop, debug_print ALL_OPTS = [('intbounds', OptIntBounds), @@ -31,45 +28,17 @@ assert ENABLE_ALL_OPTS == ALL_OPTS_NAMES, ( 'please fix rlib/jit.py to say ENABLE_ALL_OPTS = %r' % (ALL_OPTS_NAMES,)) -def build_opt_chain(metainterp_sd, enable_opts): +def build_opt_chain(enable_opts): optimizations = [] - unroll = 'unroll' in enable_opts # 'enable_opts' is normally a dict - if (metainterp_sd.cpu is not None and - not metainterp_sd.cpu.supports_guard_gc_type): - unroll = False for name, opt in unroll_all_opts: if name in enable_opts: if opt is not None: o = opt() optimizations.append(o) - - if ('rewrite' not in enable_opts or 'virtualize' not in enable_opts - or 'heap' not in enable_opts or 'pure' not in enable_opts): - optimizations.append(OptSimplify(unroll)) - - return optimizations, unroll - -def optimize_trace(metainterp_sd, jitdriver_sd, compile_data, memo=None): - """Optimize loop.operations to remove internal overheadish operations. - """ - debug_start("jit-optimize") - try: - # mark that a new trace has been started - log = metainterp_sd.jitlog.log_trace(jl.MARK_TRACE, metainterp_sd, None) - log.write_trace(compile_data.trace) - if compile_data.log_noopt: - metainterp_sd.logger_noopt.log_loop_from_trace(compile_data.trace, memo=memo) - if memo is None: - memo = {} - compile_data.box_names_memo = memo - optimizations, unroll = build_opt_chain(metainterp_sd, - compile_data.enable_opts) - return compile_data.optimize(metainterp_sd, jitdriver_sd, - optimizations, unroll) - finally: - compile_data.forget_optimization_info() - debug_stop("jit-optimize") + if ('rewrite' not in enable_opts or 'virtualize' not in enable_opts or + 'heap' not in enable_opts or 'pure' not in enable_opts): + optimizations.append(OptSimplify()) + return optimizations if __name__ == '__main__': print ALL_OPTS_NAMES - diff -Nru pypy-7.1.1+dfsg/rpython/jit/metainterp/optimizeopt/intbounds.py pypy-7.3.1+dfsg/rpython/jit/metainterp/optimizeopt/intbounds.py --- pypy-7.1.1+dfsg/rpython/jit/metainterp/optimizeopt/intbounds.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/metainterp/optimizeopt/intbounds.py 2020-04-10 19:28:41.000000000 +0000 @@ -5,7 +5,9 @@ IntLowerBound, IntUpperBound, ConstIntBound) from rpython.jit.metainterp.optimizeopt.optimizer import (Optimization, CONST_1, CONST_0) -from rpython.jit.metainterp.optimizeopt.util import make_dispatcher_method +from rpython.jit.metainterp.optimizeopt.util import ( + make_dispatcher_method, get_box_replacement) +from .info import getptrinfo from rpython.jit.metainterp.resoperation import rop from rpython.jit.metainterp.optimizeopt import vstring from rpython.jit.codewriter.effectinfo import EffectInfo @@ -64,8 +66,8 @@ postprocess_GUARD_VALUE = _postprocess_guard_true_false_value def optimize_INT_OR_or_XOR(self, op): - v1 = self.get_box_replacement(op.getarg(0)) - v2 = self.get_box_replacement(op.getarg(1)) + v1 = get_box_replacement(op.getarg(0)) + v2 = get_box_replacement(op.getarg(1)) if v1 is v2: if op.getopnum() == rop.INT_OR: self.make_equal_to(op, v1) @@ -75,9 +77,9 @@ return self.emit(op) def postprocess_INT_OR_or_XOR(self, op): - v1 = self.get_box_replacement(op.getarg(0)) + v1 = get_box_replacement(op.getarg(0)) b1 = self.getintbound(v1) - v2 = self.get_box_replacement(op.getarg(1)) + v2 = get_box_replacement(op.getarg(1)) b2 = self.getintbound(v2) b = b1.or_bound(b2) self.getintbound(op).intersect(b) @@ -108,8 +110,8 @@ self.getintbound(op).intersect(b) def optimize_INT_ADD(self, op): - arg1 = self.get_box_replacement(op.getarg(0)) - arg2 = self.get_box_replacement(op.getarg(1)) + arg1 = get_box_replacement(op.getarg(0)) + arg2 = get_box_replacement(op.getarg(1)) if self.is_raw_ptr(arg1) or self.is_raw_ptr(arg2): return self.emit(op) v1 = self.getintbound(arg1) @@ -130,8 +132,8 @@ arg1 = self.optimizer.as_operation(arg1) if arg1 is not None: if arg1.getopnum() == rop.INT_ADD: - prod_arg1 = self.get_box_replacement(arg1.getarg(0)) - prod_arg2 = self.get_box_replacement(arg1.getarg(1)) + prod_arg1 = get_box_replacement(arg1.getarg(0)) + prod_arg2 = get_box_replacement(arg1.getarg(1)) prod_v1 = self.getintbound(prod_arg1) prod_v2 = self.getintbound(prod_arg2) @@ -196,9 +198,9 @@ return self.emit(op) def postprocess_INT_LSHIFT(self, op): - arg0 = self.get_box_replacement(op.getarg(0)) + arg0 = get_box_replacement(op.getarg(0)) b1 = self.getintbound(arg0) - arg1 = self.get_box_replacement(op.getarg(1)) + arg1 = get_box_replacement(op.getarg(1)) b2 = self.getintbound(arg1) r = self.getintbound(op) b = b1.lshift_bound(b2) @@ -290,8 +292,8 @@ r.intersect(resbound) def optimize_INT_SUB_OVF(self, op): - arg0 = self.get_box_replacement(op.getarg(0)) - arg1 = self.get_box_replacement(op.getarg(1)) + arg0 = get_box_replacement(op.getarg(0)) + arg1 = get_box_replacement(op.getarg(1)) b0 = self.getintbound(arg0) b1 = self.getintbound(arg1) if arg0.same_box(arg1): @@ -304,8 +306,8 @@ return self.emit(op) def postprocess_INT_SUB_OVF(self, op): - arg0 = self.get_box_replacement(op.getarg(0)) - arg1 = self.get_box_replacement(op.getarg(1)) + arg0 = get_box_replacement(op.getarg(0)) + arg1 = get_box_replacement(op.getarg(1)) b0 = self.getintbound(arg0) b1 = self.getintbound(arg1) resbound = b0.sub_bound(b1) @@ -329,8 +331,8 @@ r.intersect(resbound) def optimize_INT_LT(self, op): - arg1 = self.get_box_replacement(op.getarg(0)) - arg2 = self.get_box_replacement(op.getarg(1)) + arg1 = get_box_replacement(op.getarg(0)) + arg2 = get_box_replacement(op.getarg(1)) b1 = self.getintbound(arg1) b2 = self.getintbound(arg2) if b1.known_lt(b2): @@ -341,8 +343,8 @@ return self.emit(op) def optimize_INT_GT(self, op): - arg1 = self.get_box_replacement(op.getarg(0)) - arg2 = self.get_box_replacement(op.getarg(1)) + arg1 = get_box_replacement(op.getarg(0)) + arg2 = get_box_replacement(op.getarg(1)) b1 = self.getintbound(arg1) b2 = self.getintbound(arg2) if b1.known_gt(b2): @@ -353,8 +355,8 @@ return self.emit(op) def optimize_INT_LE(self, op): - arg1 = self.get_box_replacement(op.getarg(0)) - arg2 = self.get_box_replacement(op.getarg(1)) + arg1 = get_box_replacement(op.getarg(0)) + arg2 = get_box_replacement(op.getarg(1)) b1 = self.getintbound(arg1) b2 = self.getintbound(arg2) if b1.known_le(b2) or arg1 is arg2: @@ -365,8 +367,8 @@ return self.emit(op) def optimize_INT_GE(self, op): - arg1 = self.get_box_replacement(op.getarg(0)) - arg2 = self.get_box_replacement(op.getarg(1)) + arg1 = get_box_replacement(op.getarg(0)) + arg2 = get_box_replacement(op.getarg(1)) b1 = self.getintbound(arg1) b2 = self.getintbound(arg2) if b1.known_ge(b2) or arg1 is arg2: @@ -377,9 +379,9 @@ return self.emit(op) def optimize_INT_EQ(self, op): - arg0 = self.get_box_replacement(op.getarg(0)) + arg0 = get_box_replacement(op.getarg(0)) b1 = self.getintbound(arg0) - arg1 = self.get_box_replacement(op.getarg(1)) + arg1 = get_box_replacement(op.getarg(1)) b2 = self.getintbound(arg1) if b1.known_gt(b2): self.make_constant_int(op, 0) @@ -391,9 +393,9 @@ return self.emit(op) def optimize_INT_NE(self, op): - arg0 = self.get_box_replacement(op.getarg(0)) + arg0 = get_box_replacement(op.getarg(0)) b1 = self.getintbound(arg0) - arg1 = self.get_box_replacement(op.getarg(1)) + arg1 = get_box_replacement(op.getarg(1)) b2 = self.getintbound(arg1) if b1.known_gt(b2): self.make_constant_int(op, 1) @@ -442,7 +444,7 @@ def postprocess_STRLEN(self, op): self.make_nonnull_str(op.getarg(0), vstring.mode_string) - array = self.getptrinfo(op.getarg(0)) + array = getptrinfo(op.getarg(0)) self.optimizer.setintbound(op, array.getlenbound(vstring.mode_string)) def optimize_UNICODELEN(self, op): @@ -450,7 +452,7 @@ def postprocess_UNICODELEN(self, op): self.make_nonnull_str(op.getarg(0), vstring.mode_unicode) - array = self.getptrinfo(op.getarg(0)) + array = getptrinfo(op.getarg(0)) self.optimizer.setintbound(op, array.getlenbound(vstring.mode_unicode)) def optimize_STRGETITEM(self, op): @@ -458,7 +460,7 @@ def postprocess_STRGETITEM(self, op): v1 = self.getintbound(op) - v2 = self.getptrinfo(op.getarg(0)) + v2 = getptrinfo(op.getarg(0)) intbound = self.getintbound(op.getarg(1)) if (intbound.has_lower and v2 is not None and v2.getlenbound(vstring.mode_string) is not None): @@ -523,7 +525,7 @@ def postprocess_UNICODEGETITEM(self, op): b1 = self.getintbound(op) b1.make_ge(IntLowerBound(0)) - v2 = self.getptrinfo(op.getarg(0)) + v2 = getptrinfo(op.getarg(0)) intbound = self.getintbound(op.getarg(1)) if (intbound.has_lower and v2 is not None and v2.getlenbound(vstring.mode_unicode) is not None): diff -Nru pypy-7.1.1+dfsg/rpython/jit/metainterp/optimizeopt/optimizer.py pypy-7.3.1+dfsg/rpython/jit/metainterp/optimizeopt/optimizer.py --- pypy-7.1.1+dfsg/rpython/jit/metainterp/optimizeopt/optimizer.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/metainterp/optimizeopt/optimizer.py 2020-04-10 19:28:41.000000000 +0000 @@ -1,16 +1,19 @@ from rpython.jit.metainterp import jitprof, resume, compile from rpython.jit.metainterp.executor import execute_nonspec_const from rpython.jit.metainterp.history import ( - Const, ConstInt, ConstPtr, CONST_NULL, new_ref_dict) -from rpython.jit.metainterp.optimizeopt.intutils import IntBound,\ - ConstIntBound, MININT, MAXINT, IntUnbounded -from rpython.jit.metainterp.optimizeopt.util import make_dispatcher_method -from rpython.jit.metainterp.resoperation import rop, AbstractResOp, GuardResOp,\ - OpHelpers + Const, ConstInt, CONST_NULL, new_ref_dict) +from rpython.jit.metainterp.optimizeopt.intutils import ( + IntBound, ConstIntBound, MININT, MAXINT, IntUnbounded) +from rpython.jit.metainterp.optimizeopt.util import ( + make_dispatcher_method, get_box_replacement) +from rpython.jit.metainterp.optimizeopt.bridgeopt import ( + deserialize_optimizer_knowledge) +from rpython.jit.metainterp.resoperation import ( + rop, AbstractResOp, GuardResOp, OpHelpers) +from .info import getrawptrinfo, getptrinfo from rpython.jit.metainterp.optimizeopt import info from rpython.jit.metainterp.optimize import InvalidLoop from rpython.rlib.objectmodel import specialize, we_are_translated -from rpython.rlib.debug import debug_print from rpython.rtyper import rclass from rpython.rtyper.lltypesystem import llmemory from rpython.jit.metainterp.optimize import SpeculativeError @@ -57,9 +60,6 @@ def __init__(self): pass # make rpython happy - def send_extra_operation(self, op, opt=None): - self.optimizer.send_extra_operation(op, opt) - def propagate_forward(self, op): raise NotImplementedError @@ -79,11 +79,11 @@ def emit_extra(self, op, emit=True): if emit: self.emit(op) - self.send_extra_operation(op, self.next_optimization) + self.optimizer.send_extra_operation(op, self.next_optimization) def getintbound(self, op): assert op.type == 'i' - op = self.get_box_replacement(op) + op = get_box_replacement(op) if isinstance(op, ConstInt): return ConstIntBound(op.getint()) fw = op.get_forwarded() @@ -99,7 +99,7 @@ def setintbound(self, op, bound): assert op.type == 'i' - op = self.get_box_replacement(op) + op = get_box_replacement(op) if op.is_constant(): return cur = op.get_forwarded() @@ -111,7 +111,7 @@ def getnullness(self, op): if op.type == 'r' or self.is_raw_ptr(op): - ptrinfo = self.getptrinfo(op) + ptrinfo = getptrinfo(op) if ptrinfo is None: return info.INFO_UNKNOWN return ptrinfo.getnullness() @@ -120,7 +120,7 @@ assert False def make_constant_class(self, op, class_const, update_last_guard=True): - op = self.get_box_replacement(op) + op = op.get_box_replacement() opinfo = op.get_forwarded() if isinstance(opinfo, info.InstancePtrInfo): opinfo._known_class = class_const @@ -136,55 +136,12 @@ opinfo.mark_last_guard(self.optimizer) return opinfo - def getptrinfo(self, op, is_object=False): - if op.type == 'i': - return self.getrawptrinfo(op) - elif op.type == 'f': - return None - assert op.type == 'r' - op = self.get_box_replacement(op) - assert op.type == 'r' - if isinstance(op, ConstPtr): - return info.ConstPtrInfo(op) - fw = op.get_forwarded() - if fw is not None: - assert isinstance(fw, info.PtrInfo) - return fw - return None - def is_raw_ptr(self, op): - fw = self.get_box_replacement(op).get_forwarded() + fw = get_box_replacement(op).get_forwarded() if isinstance(fw, info.AbstractRawPtrInfo): return True return False - def getrawptrinfo(self, op, create=False, is_object=False): - assert op.type == 'i' - op = self.get_box_replacement(op) - assert op.type == 'i' - if isinstance(op, ConstInt): - return info.ConstPtrInfo(op) - fw = op.get_forwarded() - if isinstance(fw, IntBound) and not create: - return None - if fw is not None: - if isinstance(fw, info.AbstractRawPtrInfo): - return fw - fw = info.RawStructPtrInfo() - op.set_forwarded(fw) - assert isinstance(fw, info.AbstractRawPtrInfo) - return fw - return None - - def get_box_replacement(self, op): - return self.optimizer.get_box_replacement(op) - - def getlastop(self): - return self.optimizer.getlastop() - - def force_box(self, op, optforce=None): - return self.optimizer.force_box(op, optforce) - def replace_op_with(self, op, newopnum, args=None, descr=None): return self.optimizer.replace_op_with(op, newopnum, args, descr) @@ -209,18 +166,6 @@ def get_constant_box(self, box): return self.optimizer.get_constant_box(box) - def new_box(self, fieldofs): - return self.optimizer.new_box(fieldofs) - - def new_const(self, fieldofs): - return self.optimizer.new_const(fieldofs) - - def new_box_item(self, arraydescr): - return self.optimizer.new_box_item(arraydescr) - - def new_const_item(self, arraydescr): - return self.optimizer.new_const_item(arraydescr) - def pure(self, opnum, result): if self.optimizer.optpure: self.optimizer.optpure.pure(opnum, result) @@ -229,11 +174,6 @@ if self.optimizer.optpure: self.optimizer.optpure.pure_from_args(opnum, args, op, descr) - def has_pure_result(self, opnum, args, descr): - if self.optimizer.optpure: - return self.optimizer.optpure.has_pure_result(opnum, args, descr) - return False - def get_pure_result(self, key): if self.optimizer.optpure: return self.optimizer.optpure.get_pure_result(key) @@ -308,6 +248,14 @@ self.optimizations = optimizations + def optimize_loop(self, trace, resumestorage, call_pure_results): + traceiter = trace.get_iter() + if resumestorage: + frontend_inputargs = trace.inputargs + deserialize_optimizer_knowledge( + self, resumestorage, frontend_inputargs, traceiter.inputargs) + return self.propagate_all_forward(traceiter, call_pure_results) + def force_op_from_preamble(self, op): return op @@ -322,14 +270,14 @@ def force_box_for_end_of_preamble(self, box): if box.type == 'r': - info = self.getptrinfo(box) + info = getptrinfo(box) if info is not None and info.is_virtual(): rec = {} return info.force_at_the_end_of_preamble(box, self.optearlyforce, rec) return box if box.type == 'i': - info = self.getrawptrinfo(box) + info = getrawptrinfo(box) if info is not None: return info.force_at_the_end_of_preamble(box, self.optearlyforce, None) @@ -345,14 +293,14 @@ def getinfo(self, op): if op.type == 'r': - return self.getptrinfo(op) + return getptrinfo(op) elif op.type == 'i': if self.is_raw_ptr(op): - return self.getptrinfo(op) + return getptrinfo(op) return self.getintbound(op) elif op.type == 'f': - if self.get_box_replacement(op).is_constant(): - return info.FloatConstInfo(self.get_box_replacement(op)) + if get_box_replacement(op).is_constant(): + return info.FloatConstInfo(get_box_replacement(op)) def get_box_replacement(self, op): if op is None: @@ -360,8 +308,9 @@ return op.get_box_replacement() def force_box(self, op, optforce=None): - op = self.get_box_replacement(op) + op = get_box_replacement(op) if optforce is None: + #import pdb; pdb.set_trace() optforce = self info = op.get_forwarded() if self.optunroll and self.optunroll.potential_extra_ops: @@ -387,7 +336,7 @@ return None def get_constant_box(self, box): - box = self.get_box_replacement(box) + box = get_box_replacement(box) if isinstance(box, Const): return box if (box.type == 'i' and box.get_forwarded() and @@ -396,16 +345,8 @@ return None #self.ensure_imported(value) - def get_newoperations(self): - self.flush() - return self._newoperations - - def clear_newoperations(self): - self._newoperations = [] - self._emittedoperations = {} - def make_equal_to(self, op, newop): - op = self.get_box_replacement(op) + op = get_box_replacement(op) if op is newop: return opinfo = op.get_forwarded() @@ -420,7 +361,7 @@ def replace_op_with(self, op, newopnum, args=None, descr=None): newop = op.copy_and_change(newopnum, args, descr) if newop.type != 'v': - op = self.get_box_replacement(op) + op = get_box_replacement(op) opinfo = op.get_forwarded() if opinfo is not None: newop.set_forwarded(opinfo) @@ -429,7 +370,7 @@ def make_constant(self, box, constbox): assert isinstance(constbox, Const) - box = self.get_box_replacement(box) + box = get_box_replacement(box) # safety-check: if the constant is outside the bounds for the # box, then it is an invalid loop if (box.get_forwarded() is not None and @@ -442,7 +383,7 @@ return if box.type == 'r' and box.get_forwarded() is not None: opinfo = box.get_forwarded() - opinfo.copy_fields_to_const(self.getptrinfo(constbox), self.optheap) + opinfo.copy_fields_to_const(getptrinfo(constbox), self.optheap) box.set_forwarded(constbox) def make_constant_int(self, box, intvalue): @@ -662,32 +603,6 @@ self._last_guard_op = None return op - def potentially_change_ovf_op_to_no_ovf(self, op): - # if last emitted operations was int_xxx_ovf and we are not emitting - # a guard_no_overflow change to int_add - if op.getopnum() != rop.GUARD_NO_OVERFLOW: - return - if not self._newoperations: - # got optimized otherwise - return - op = self._newoperations[-1] - if not op.is_ovf(): - return - newop = self.replace_op_with_no_ovf(op) - self._newoperations[-1] = newop - self._emittedoperations[newop] = None - - def replace_op_with_no_ovf(self, op): - if op.getopnum() == rop.INT_MUL_OVF: - return self.replace_op_with(op, rop.INT_MUL) - elif op.getopnum() == rop.INT_ADD_OVF: - return self.replace_op_with(op, rop.INT_ADD) - elif op.getopnum() == rop.INT_SUB_OVF: - return self.replace_op_with(op, rop.INT_SUB) - else: - assert False - - def _copy_resume_data_from(self, guard_op, last_guard_op): last_descr = last_guard_op.getdescr() descr = compile.invent_fail_descr_for_op(guard_op.getopnum(), self, last_descr) @@ -768,7 +683,14 @@ elif constvalue == 1: opnum = rop.GUARD_TRUE else: - raise AssertionError("uh?") + # Issue #3128: there might be rare cases where strange + # code is produced. That issue hits the assert from + # OptUnroll.inline_short_preamble's send_extra_operation(). + # Better just disable this optimization than crash with + # an AssertionError here. Note also that such code might + # trigger an InvalidLoop to be raised later---so we must + # not crash here. + return op newop = self.replace_op_with(op, opnum, [op.getarg(0)], descr) return newop return op @@ -851,13 +773,8 @@ <= expected_class.subclassrange_max) def is_virtual(self, op): - if op.type == 'r': - opinfo = self.getptrinfo(op) - return opinfo is not None and opinfo.is_virtual() - if op.type == 'i': - opinfo = self.getrawptrinfo(op) - return opinfo is not None and opinfo.is_virtual() - return False + opinfo = getptrinfo(op) + return opinfo is not None and opinfo.is_virtual() # These are typically removed already by OptRewrite, but it can be # dissabled and unrolling emits some SAME_AS ops to setup the @@ -869,4 +786,3 @@ dispatch_opt = make_dispatcher_method(Optimizer, 'optimize_', default=Optimizer.optimize_default) - diff -Nru pypy-7.1.1+dfsg/rpython/jit/metainterp/optimizeopt/pure.py pypy-7.3.1+dfsg/rpython/jit/metainterp/optimizeopt/pure.py --- pypy-7.1.1+dfsg/rpython/jit/metainterp/optimizeopt/pure.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/metainterp/optimizeopt/pure.py 2020-04-10 19:28:41.000000000 +0000 @@ -2,7 +2,8 @@ Optimization, OptimizationResult, REMOVED) from rpython.jit.metainterp.resoperation import rop, OpHelpers, AbstractResOp,\ ResOperation -from rpython.jit.metainterp.optimizeopt.util import make_dispatcher_method +from rpython.jit.metainterp.optimizeopt.util import ( + make_dispatcher_method, get_box_replacement) from rpython.jit.metainterp.optimizeopt.shortpreamble import PreambleOp from rpython.jit.metainterp.optimize import SpeculativeError @@ -57,9 +58,9 @@ op = self.lst[i] if op is None: break - if box0.same_box(opt.get_box_replacement(op.getarg(0))) and op.getdescr() is descr: + if box0.same_box(get_box_replacement(op.getarg(0))) and op.getdescr() is descr: op = self.force_preamble_op(opt, op, i) - return opt.get_box_replacement(op) + return get_box_replacement(op) return None def lookup2(self, opt, box0, box1, descr): @@ -67,23 +68,23 @@ op = self.lst[i] if op is None: break - if (box0.same_box(opt.get_box_replacement(op.getarg(0))) and - box1.same_box(opt.get_box_replacement(op.getarg(1))) and + if (box0.same_box(get_box_replacement(op.getarg(0))) and + box1.same_box(get_box_replacement(op.getarg(1))) and op.getdescr() is descr): op = self.force_preamble_op(opt, op, i) - return opt.get_box_replacement(op) + return get_box_replacement(op) return None def lookup(self, optimizer, op): numargs = op.numargs() if numargs == 1: return self.lookup1(optimizer, - optimizer.get_box_replacement(op.getarg(0)), + get_box_replacement(op.getarg(0)), op.getdescr()) elif numargs == 2: return self.lookup2(optimizer, - optimizer.get_box_replacement(op.getarg(0)), - optimizer.get_box_replacement(op.getarg(1)), + get_box_replacement(op.getarg(0)), + get_box_replacement(op.getarg(1)), op.getdescr()) else: assert False @@ -205,7 +206,7 @@ old_start_index = OpHelpers.is_cond_call_value(old_op.opnum) for i in range(old_start_index, old_op.numargs()): box = old_op.getarg(i) - if not self.get_box_replacement(op.getarg(j)).same_box(box): + if not get_box_replacement(op.getarg(j)).same_box(box): break j += 1 else: @@ -239,15 +240,11 @@ def pure_from_args(self, opnum, args, op, descr=None): newop = ResOperation(opnum, - [self.get_box_replacement(arg) for arg in args], + [get_box_replacement(arg) for arg in args], descr=descr) newop.set_forwarded(op) self.pure(opnum, newop) - def has_pure_result(self, opnum, args, descr): - return False - # XXX - def get_pure_result(self, op): recentops = self.getrecentops(op.getopnum()) return recentops.lookup(self.optimizer, op) diff -Nru pypy-7.1.1+dfsg/rpython/jit/metainterp/optimizeopt/rewrite.py pypy-7.3.1+dfsg/rpython/jit/metainterp/optimizeopt/rewrite.py --- pypy-7.1.1+dfsg/rpython/jit/metainterp/optimizeopt/rewrite.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/metainterp/optimizeopt/rewrite.py 2020-04-10 19:28:41.000000000 +0000 @@ -7,13 +7,13 @@ from rpython.jit.metainterp.optimizeopt.intutils import IntBound from rpython.jit.metainterp.optimizeopt.optimizer import ( Optimization, OptimizationResult, REMOVED, CONST_0, CONST_1) -from rpython.jit.metainterp.optimizeopt.info import INFO_NONNULL, INFO_NULL -from rpython.jit.metainterp.optimizeopt.util import _findall, make_dispatcher_method -from rpython.jit.metainterp.resoperation import rop, ResOperation, opclasses,\ - OpHelpers +from rpython.jit.metainterp.optimizeopt.info import ( + INFO_NONNULL, INFO_NULL, getptrinfo) +from rpython.jit.metainterp.optimizeopt.util import ( + _findall, make_dispatcher_method, get_box_replacement) +from rpython.jit.metainterp.resoperation import ( + rop, ResOperation, opclasses, OpHelpers) from rpython.rlib.rarithmetic import highest_bit -from rpython.rtyper.lltypesystem import llmemory -from rpython.rtyper import rclass import math @@ -68,7 +68,6 @@ return True return False - def find_rewritable_bool(self, op): oldopnum = op.boolinverse arg0 = op.getarg(0) @@ -78,7 +77,7 @@ if self.try_boolinvers(op, top): return True - oldopnum = op.boolreflex # FIXME: add INT_ADD, INT_MUL + oldopnum = op.boolreflex # FIXME: add INT_ADD, INT_MUL if oldopnum != -1: top = ResOperation(oldopnum, [arg1, arg0]) oldop = self.get_pure_result(top) @@ -128,8 +127,8 @@ return self.emit(op) def optimize_INT_SUB(self, op): - arg1 = self.get_box_replacement(op.getarg(0)) - arg2 = self.get_box_replacement(op.getarg(1)) + arg1 = get_box_replacement(op.getarg(0)) + arg2 = get_box_replacement(op.getarg(1)) b1 = self.getintbound(arg1) b2 = self.getintbound(arg2) if b2.equal(0): @@ -162,9 +161,9 @@ def optimize_INT_ADD(self, op): if self.is_raw_ptr(op.getarg(0)) or self.is_raw_ptr(op.getarg(1)): return self.emit(op) - arg1 = self.get_box_replacement(op.getarg(0)) + arg1 = get_box_replacement(op.getarg(0)) b1 = self.getintbound(arg1) - arg2 = self.get_box_replacement(op.getarg(1)) + arg2 = get_box_replacement(op.getarg(1)) b2 = self.getintbound(arg2) # If one side of the op is 0 the result is the other side. @@ -204,9 +203,9 @@ self.optimizer.pure_from_args(rop.INT_ADD, [inv_arg0, op], arg1) def optimize_INT_MUL(self, op): - arg1 = self.get_box_replacement(op.getarg(0)) + arg1 = get_box_replacement(op.getarg(0)) b1 = self.getintbound(arg1) - arg2 = self.get_box_replacement(op.getarg(1)) + arg2 = get_box_replacement(op.getarg(1)) b2 = self.getintbound(arg2) # If one side of the op is 1 the result is the other side. @@ -276,8 +275,8 @@ # Constant fold f0 * 1.0 and turn f0 * -1.0 into a FLOAT_NEG, these # work in all cases, including NaN and inf for lhs, rhs in [(arg1, arg2), (arg2, arg1)]: - v1 = self.get_box_replacement(lhs) - v2 = self.get_box_replacement(rhs) + v1 = get_box_replacement(lhs) + v2 = get_box_replacement(rhs) if v1.is_constant(): if v1.getfloat() == 1.0: @@ -295,7 +294,7 @@ def optimize_FLOAT_TRUEDIV(self, op): arg1 = op.getarg(0) arg2 = op.getarg(1) - v2 = self.get_box_replacement(arg2) + v2 = get_box_replacement(arg2) # replace "x / const" by "x * (1/const)" if possible newop = op @@ -331,7 +330,7 @@ 'was proven to always fail' % r) return elif box.type == 'r': - box = self.get_box_replacement(box) + box = get_box_replacement(box) if box.is_constant(): if not box.same_constant(constbox): r = self.optimizer.metainterp_sd.logger_ops.repr_of_resop( @@ -343,7 +342,7 @@ return self.emit(op) def optimize_GUARD_ISNULL(self, op): - info = self.getptrinfo(op.getarg(0)) + info = getptrinfo(op.getarg(0)) if info is not None: if info.is_null(): return @@ -357,11 +356,11 @@ self.make_constant(op.getarg(0), CONST_NULL) def optimize_GUARD_IS_OBJECT(self, op): - info = self.getptrinfo(op.getarg(0)) + info = getptrinfo(op.getarg(0)) if info and info.is_constant(): if info.is_null(): raise InvalidLoop("A GUARD_IS_OBJECT(NULL) found") - c = self.get_box_replacement(op.getarg(0)) + c = get_box_replacement(op.getarg(0)) if self.optimizer.cpu.check_is_object(c.getref_base()): return raise InvalidLoop("A GUARD_IS_OBJECT(not-an-object) found") @@ -373,9 +372,9 @@ return self.emit(op) def optimize_GUARD_GC_TYPE(self, op): - info = self.getptrinfo(op.getarg(0)) + info = getptrinfo(op.getarg(0)) if info and info.is_constant(): - c = self.get_box_replacement(op.getarg(0)) + c = get_box_replacement(op.getarg(0)) tid = self.optimizer.cpu.get_actual_typeid(c.getref_base()) if tid != op.getarg(1).getint(): raise InvalidLoop("wrong GC type ID found on a constant") @@ -387,12 +386,12 @@ return self.emit(op) def optimize_GUARD_SUBCLASS(self, op): - info = self.getptrinfo(op.getarg(0)) + info = getptrinfo(op.getarg(0)) optimizer = self.optimizer # must raise 'InvalidLoop' in all cases where 'info' shows the # class cannot possibly match (see test_issue2926) if info and info.is_constant(): - c = self.get_box_replacement(op.getarg(0)) + c = get_box_replacement(op.getarg(0)) vtable = optimizer.cpu.cls_of_box(c).getint() if optimizer._check_subclass(vtable, op.getarg(1).getint()): return @@ -426,7 +425,7 @@ return self.emit(op) def optimize_GUARD_NONNULL(self, op): - opinfo = self.getptrinfo(op.getarg(0)) + opinfo = getptrinfo(op.getarg(0)) if opinfo is not None: if opinfo.is_nonnull(): return @@ -438,12 +437,12 @@ def postprocess_GUARD_NONNULL(self, op): self.make_nonnull(op.getarg(0)) - self.getptrinfo(op.getarg(0)).mark_last_guard(self.optimizer) + getptrinfo(op.getarg(0)).mark_last_guard(self.optimizer) def optimize_GUARD_VALUE(self, op): arg0 = op.getarg(0) if arg0.type == 'r': - info = self.getptrinfo(arg0) + info = getptrinfo(arg0) if info: if info.is_virtual(): raise InvalidLoop("promote of a virtual") @@ -452,7 +451,7 @@ op = self.replace_old_guard_with_guard_value(op, info, old_guard_op) elif arg0.type == 'f': - arg0 = self.get_box_replacement(arg0) + arg0 = get_box_replacement(arg0) if arg0.is_constant(): return constbox = op.getarg(1) @@ -460,7 +459,7 @@ return self.optimize_guard(op, constbox) def postprocess_GUARD_VALUE(self, op): - box = self.get_box_replacement(op.getarg(0)) + box = get_box_replacement(op.getarg(0)) self.make_constant(box, op.getarg(1)) def replace_old_guard_with_guard_value(self, op, info, old_guard_op): @@ -491,8 +490,8 @@ 'always fail' % r) descr = compile.ResumeGuardDescr() op = old_guard_op.copy_and_change(rop.GUARD_VALUE, - args = [old_guard_op.getarg(0), op.getarg(1)], - descr = descr) + args=[old_guard_op.getarg(0), op.getarg(1)], + descr=descr) # Note: we give explicitly a new descr for 'op'; this is why the # old descr must not be ResumeAtPositionDescr (checked above). # Better-safe-than-sorry but it should never occur: we should @@ -507,7 +506,7 @@ return self.optimize_guard(op, CONST_1) def postprocess_GUARD_TRUE(self, op): - box = self.get_box_replacement(op.getarg(0)) + box = get_box_replacement(op.getarg(0)) box1 = self.optimizer.as_operation(box) if box1 is not None and box1.getopnum() == rop.INT_IS_TRUE: # we can't use the (current) range analysis for this because @@ -519,7 +518,7 @@ return self.optimize_guard(op, CONST_0) def postprocess_GUARD_FALSE(self, op): - box = self.get_box_replacement(op.getarg(0)) + box = get_box_replacement(op.getarg(0)) box1 = self.optimizer.as_operation(box) if box1 is not None and box1.getopnum() == rop.INT_IS_ZERO: # we can't use the (current) range analysis for this because @@ -531,7 +530,7 @@ self.make_nonnull(op.getarg(0)) def optimize_RECORD_EXACT_CLASS(self, op): - opinfo = self.getptrinfo(op.getarg(0)) + opinfo = getptrinfo(op.getarg(0)) expectedclassbox = op.getarg(1) assert isinstance(expectedclassbox, Const) if opinfo is not None: @@ -562,8 +561,8 @@ # it was a guard_nonnull, which we replace with a # guard_nonnull_class. descr = compile.ResumeGuardDescr() - op = old_guard_op.copy_and_change (rop.GUARD_NONNULL_CLASS, - args = [old_guard_op.getarg(0), op.getarg(1)], + op = old_guard_op.copy_and_change(rop.GUARD_NONNULL_CLASS, + args=[old_guard_op.getarg(0), op.getarg(1)], descr=descr) # Note: we give explicitly a new descr for 'op'; this is why the # old descr must not be ResumeAtPositionDescr (checked above). @@ -576,14 +575,14 @@ def postprocess_GUARD_CLASS(self, op): expectedclassbox = op.getarg(1) - info = self.getptrinfo(op.getarg(0)) + info = getptrinfo(op.getarg(0)) old_guard_op = info.get_last_guard(self.optimizer) update_last_guard = not old_guard_op or isinstance( old_guard_op.getdescr(), compile.ResumeAtPositionDescr) self.make_constant_class(op.getarg(0), expectedclassbox, update_last_guard) def optimize_GUARD_NONNULL_CLASS(self, op): - info = self.getptrinfo(op.getarg(0)) + info = getptrinfo(op.getarg(0)) if info and info.is_null(): r = self.optimizer.metainterp_sd.logger_ops.repr_of_resop(op) raise InvalidLoop('A GUARD_NONNULL_CLASS (%s) was proven to ' @@ -660,10 +659,10 @@ return self._optimize_nullness(op, op.getarg(0), False) def _optimize_oois_ooisnot(self, op, expect_isnot, instance): - arg0 = self.get_box_replacement(op.getarg(0)) - arg1 = self.get_box_replacement(op.getarg(1)) - info0 = self.getptrinfo(arg0) - info1 = self.getptrinfo(arg1) + arg0 = get_box_replacement(op.getarg(0)) + arg1 = get_box_replacement(op.getarg(1)) + info0 = getptrinfo(arg0) + info1 = getptrinfo(arg1) if info0 and info0.is_virtual(): if info1 and info1.is_virtual(): intres = (info0 is info1) ^ expect_isnot @@ -723,8 +722,8 @@ if length and length.getint() == 0: return None # 0-length arraycopy - source_info = self.getptrinfo(op.getarg(1)) - dest_info = self.getptrinfo(op.getarg(2)) + source_info = getptrinfo(op.getarg(1)) + dest_info = getptrinfo(op.getarg(2)) source_start_box = self.get_constant_box(op.getarg(3)) dest_start_box = self.get_constant_box(op.getarg(4)) extrainfo = op.getdescr().get_extra_info() @@ -755,7 +754,7 @@ continue if dest_info and dest_info.is_virtual(): dest_info.setitem(arraydescr, index + dest_start, - self.get_box_replacement(op.getarg(2)), + get_box_replacement(op.getarg(2)), val) else: newop = ResOperation(rop.SETARRAYITEM_GC, @@ -898,7 +897,7 @@ def serialize_optrewrite(self, available_boxes): res = [] for i, box in self.loop_invariant_results.iteritems(): - box = self.get_box_replacement(box) + box = get_box_replacement(box) if box in available_boxes: res.append((i, box)) return res diff -Nru pypy-7.1.1+dfsg/rpython/jit/metainterp/optimizeopt/simplify.py pypy-7.3.1+dfsg/rpython/jit/metainterp/optimizeopt/simplify.py --- pypy-7.1.1+dfsg/rpython/jit/metainterp/optimizeopt/simplify.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/metainterp/optimizeopt/simplify.py 2020-04-10 19:28:41.000000000 +0000 @@ -1,13 +1,8 @@ from rpython.jit.metainterp.optimizeopt.optimizer import Optimization from rpython.jit.metainterp.optimizeopt.util import make_dispatcher_method -from rpython.jit.metainterp.resoperation import ResOperation, rop, OpHelpers -from rpython.jit.metainterp.history import TargetToken, JitCellToken +from rpython.jit.metainterp.resoperation import rop, OpHelpers class OptSimplify(Optimization): - def __init__(self, unroll): - self.last_label_descr = None - self.unroll = unroll - def emit(self, op): if op.is_guard(): if self.optimizer.pendingfields is None: @@ -48,30 +43,6 @@ def optimize_RECORD_EXACT_CLASS(self, op): pass - # def optimize_LABEL(self, op): - # if not self.unroll: - # descr = op.getdescr() - # if isinstance(descr, JitCellToken): - # return self.optimize_JUMP(op.copy_and_change(rop.JUMP)) - # self.last_label_descr = op.getdescr() - # return self.emit(op) - - # def optimize_JUMP(self, op): - # if not self.unroll: - # op = op.copy_and_change(op.getopnum()) - # descr = op.getdescr() - # assert isinstance(descr, JitCellToken) - # if not descr.target_tokens: - # assert self.last_label_descr is not None - # target_token = self.last_label_descr - # assert isinstance(target_token, TargetToken) - # assert target_token.targeting_jitcell_token is descr - # op.setdescr(self.last_label_descr) - # else: - # assert len(descr.target_tokens) == 1 - # op.setdescr(descr.target_tokens[0]) - # return self.emit(op) - def optimize_GUARD_FUTURE_CONDITION(self, op): self.optimizer.notice_guard_future_condition(op) diff -Nru pypy-7.1.1+dfsg/rpython/jit/metainterp/optimizeopt/test/test_costmodel.py pypy-7.3.1+dfsg/rpython/jit/metainterp/optimizeopt/test/test_costmodel.py --- pypy-7.1.1+dfsg/rpython/jit/metainterp/optimizeopt/test/test_costmodel.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/metainterp/optimizeopt/test/test_costmodel.py 2020-04-10 19:28:41.000000000 +0000 @@ -1,18 +1,13 @@ import py -from rpython.jit.metainterp.history import TargetToken, JitCellToken, TreeLoop from rpython.jit.metainterp.optimizeopt.util import equaloplists -from rpython.jit.metainterp.optimizeopt.vector import (Pack, GenericCostModel, - NotAProfitableLoop, VectorizingOptimizer, CostModel) +from rpython.jit.metainterp.optimizeopt.vector import ( + GenericCostModel, NotAProfitableLoop, VectorizingOptimizer, CostModel) from rpython.jit.metainterp.optimizeopt.schedule import VecScheduleState -from rpython.jit.metainterp.optimizeopt.dependency import Node, DependencyGraph -from rpython.jit.metainterp.optimizeopt.test.test_util import LLtypeMixin +from rpython.jit.metainterp.optimizeopt.dependency import DependencyGraph from rpython.jit.metainterp.optimizeopt.test.test_schedule import SchedulerBaseTest -from rpython.jit.metainterp.optimizeopt.test.test_vecopt import (FakeMetaInterpStaticData, - FakeJitDriverStaticData) -from rpython.jit.metainterp.resoperation import rop, ResOperation, AbstractValue -from rpython.jit.tool.oparser import parse as opparse -from rpython.jit.tool.oparser_model import get_model +from rpython.jit.metainterp.optimizeopt.test.test_vecopt import ( + FakeJitDriverStaticData) class FakeMemoryRef(object): def __init__(self, array, iv): @@ -83,16 +78,14 @@ def profitable(self): return self.proxy.savings >= 0 -class CostModelBaseTest(SchedulerBaseTest): - +class TestCostModel(SchedulerBaseTest): def savings(self, loop): - metainterp_sd = FakeMetaInterpStaticData(self.cpu) jitdriver_sd = FakeJitDriverStaticData() - opt = VectorizingOptimizer(metainterp_sd, jitdriver_sd, 0) + opt = VectorizingOptimizer(self.metainterp_sd, jitdriver_sd, 0) opt.orig_label_args = loop.label.getarglist()[:] graph = opt.dependency_graph = DependencyGraph(loop) self.show_dot_graph(graph, 'costmodel') - for k,m in graph.memory_refs.items(): + for k, m in graph.memory_refs.items(): graph.memory_refs[k] = FakeMemoryRef(m.array, m.index_var) opt.find_adjacent_memory_refs(graph) opt.extend_packset() @@ -267,7 +260,3 @@ """) number = self.savings(trace) assert number >= 1 - - -class Test(CostModelBaseTest, LLtypeMixin): - pass diff -Nru pypy-7.1.1+dfsg/rpython/jit/metainterp/optimizeopt/test/test_dependency.py pypy-7.3.1+dfsg/rpython/jit/metainterp/optimizeopt/test/test_dependency.py --- pypy-7.1.1+dfsg/rpython/jit/metainterp/optimizeopt/test/test_dependency.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/metainterp/optimizeopt/test/test_dependency.py 2020-04-10 19:28:41.000000000 +0000 @@ -7,8 +7,7 @@ IndexVar, MemoryRef, Node) from rpython.jit.metainterp.optimizeopt.vector import VectorLoop from rpython.jit.metainterp.optimizeopt.test.test_util import ( - LLtypeMixin, BaseTest, FakeMetaInterpStaticData, convert_old_style_to_targets, - FakeJitDriverStaticData) + BaseTest, convert_old_style_to_targets, FakeJitDriverStaticData) from rpython.jit.metainterp.resoperation import rop, ResOperation from rpython.jit.backend.llgraph.runner import ArrayDescr from rpython.jit.tool.oparser import OpParser @@ -109,7 +108,7 @@ loop = VectorLoop(label, loop.operations[0:-1], jump) loop.jump.setdescr(token) class Optimizer(object): - metainterp_sd = FakeMetaInterpStaticData(self.cpu) + metainterp_sd = self.metainterp_sd jitdriver_sd = FakeJitDriverStaticData() opt = Optimizer() opt.jitdriver_sd.vec = True @@ -243,7 +242,7 @@ assert not m1.is_adjacent_to(m2) assert not m2.is_adjacent_to(m1) -class BaseTestDependencyGraph(DependencyBaseTest): +class TestDependencyGraph(DependencyBaseTest): def test_index_var_basic(self): b = FakeBox() @@ -697,7 +696,3 @@ def __repr__(self): return "n%d" % self.opidx - - -class TestLLtype(BaseTestDependencyGraph, LLtypeMixin): - pass diff -Nru pypy-7.1.1+dfsg/rpython/jit/metainterp/optimizeopt/test/test_guard.py pypy-7.3.1+dfsg/rpython/jit/metainterp/optimizeopt/test/test_guard.py --- pypy-7.1.1+dfsg/rpython/jit/metainterp/optimizeopt/test/test_guard.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/metainterp/optimizeopt/test/test_guard.py 2020-04-10 19:28:41.000000000 +0000 @@ -1,22 +1,13 @@ -import py - from rpython.jit.metainterp import compile -from rpython.jit.metainterp.history import (TargetToken, JitCellToken, - TreeLoop, Const) -from rpython.jit.metainterp.optimizeopt.util import equaloplists -from rpython.jit.metainterp.optimizeopt.vector import (Pack, - NotAProfitableLoop, VectorizingOptimizer) -from rpython.jit.metainterp.optimizeopt.dependency import (Node, - DependencyGraph, IndexVar) +from rpython.jit.metainterp.history import Const +from rpython.jit.metainterp.optimizeopt.dependency import ( + DependencyGraph, IndexVar) from rpython.jit.metainterp.optimizeopt.guard import (GuardStrengthenOpt, Guard) -from rpython.jit.metainterp.optimizeopt.test.test_util import LLtypeMixin from rpython.jit.metainterp.optimizeopt.test.test_schedule import SchedulerBaseTest -from rpython.jit.metainterp.optimizeopt.test.test_vecopt import (FakeMetaInterpStaticData, - FakeJitDriverStaticData, FakeLoopInfo) +from rpython.jit.metainterp.optimizeopt.test.test_vecopt import FakeLoopInfo from rpython.jit.metainterp.resoperation import (rop, ResOperation, InputArgInt) -from rpython.jit.tool.oparser_model import get_model class FakeMemoryRef(object): def __init__(self, array, iv): @@ -54,6 +45,7 @@ class FakeResOp(object): def __init__(self, opnum): self.opnum = opnum + def getopnum(self): return self.opnum @@ -79,7 +71,7 @@ guard_false = guard(rop.GUARD_FALSE) del guard -class GuardBaseTest(SchedulerBaseTest): +class TestGuard(SchedulerBaseTest): def optguards(self, loop, user_code=False): info = FakeLoopInfo(loop) info.snapshot(loop) @@ -330,6 +322,3 @@ guard_true(i40) [] ... """) - -class Test(GuardBaseTest, LLtypeMixin): - pass diff -Nru pypy-7.1.1+dfsg/rpython/jit/metainterp/optimizeopt/test/test_multilabel.py pypy-7.3.1+dfsg/rpython/jit/metainterp/optimizeopt/test/test_multilabel.py --- pypy-7.1.1+dfsg/rpython/jit/metainterp/optimizeopt/test/test_multilabel.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/metainterp/optimizeopt/test/test_multilabel.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,552 +0,0 @@ -from __future__ import with_statement -from rpython.jit.metainterp.optimizeopt.test.test_util import ( - LLtypeMixin, BaseTest, Storage, - FakeMetaInterpStaticData) -from rpython.jit.metainterp.history import TreeLoop, JitCellToken, TargetToken -from rpython.jit.metainterp.resoperation import rop, opname, ResOperation -from rpython.jit.metainterp.optimize import InvalidLoop -from py.test import raises -from rpython.jit.metainterp.optimizeopt.optimizer import Optimization -from rpython.jit.metainterp.optimizeopt.util import make_dispatcher_method -from rpython.jit.metainterp.optimizeopt.heap import OptHeap -from rpython.jit.metainterp.optimizeopt.rewrite import OptRewrite - - -class BaseTestMultiLabel(BaseTest): - enable_opts = "intbounds:rewrite:virtualize:string:earlyforce:pure:heap:unroll" - - def optimize_loop(self, ops, expected, expected_shorts=None): - loop = self.parse(ops) - if expected != "crash!": - expected = self.parse(expected) - - part = TreeLoop('part') - part.inputargs = loop.inputargs - token = loop.original_jitcell_token - - optimized = TreeLoop('optimized') - optimized.inputargs = loop.inputargs - optimized.operations = [] - - labels = [i for i, op in enumerate(loop.operations) \ - if op.getopnum()==rop.LABEL] - prv = 0 - last_label = [] - state = None - for nxt in labels + [len(loop.operations)]: - assert prv != nxt - operations = last_label + loop.operations[prv:nxt] - if nxt < len(loop.operations): - label = loop.operations[nxt] - assert label.getopnum() == rop.LABEL - if label.getdescr() is None: - label.setdescr(token) - operations.append(label) - part.operations = operations - - self.add_guard_future_condition(part) - state = self._do_optimize_loop(part, None, state, - export_state=True) - if part.operations[-1].getopnum() == rop.LABEL: - last_label = [part.operations.pop()] - else: - last_label = [] - - optimized.operations.extend(part.operations) - prv = nxt + 1 - - # - print - print "Optimized:" - if optimized.operations: - print '\n'.join([str(o) for o in optimized.operations]) - else: - print 'Failed!' - print - - shorts = [op.getdescr().short_preamble - for op in optimized.operations - if op.getopnum() == rop.LABEL] - - if expected_shorts: - for short in shorts: - print - print "Short preamble:" - print '\n'.join([str(o) for o in short]) - - - assert expected != "crash!", "should have raised an exception" - self.assert_equal(optimized, expected) - - if expected_shorts: - assert len(shorts) == len(expected_shorts) - for short, expected_short in zip(shorts, expected_shorts): - expected_short = self.parse(expected_short) - short_preamble = TreeLoop('short preamble') - assert short[0].getopnum() == rop.LABEL - short_preamble.inputargs = short[0].getarglist() - short_preamble.operations = short - self.assert_equal(short_preamble, expected_short, - text_right='expected short preamble') - - - return optimized - -class OptimizeoptTestMultiLabel(BaseTestMultiLabel): - - def test_simple(self): - ops = """ - [i1] - i2 = int_add(i1, 1) - escape(i2) - label(i1) - i3 = int_add(i1, 1) - escape(i3) - jump(i1) - """ - expected = """ - [i1] - i2 = int_add(i1, 1) - escape(i2) - label(i1, i2) - escape(i2) - jump(i1, i2) - """ - self.optimize_loop(ops, expected) - - def test_forced_virtual(self): - ops = """ - [p1] - p3 = new_with_vtable(ConstClass(node_vtable)) - label(p3) - escape(p3) - jump(p3) - """ - with raises(InvalidLoop): - self.optimize_loop(ops, ops) - - def test_virtuals_with_nonmatching_fields(self): - ops = """ - [p1] - p3 = new_with_vtable(ConstClass(node_vtable)) - setfield_gc(p3, 1, descr=valuedescr) - label(p3) - p4 = new_with_vtable(ConstClass(node_vtable)) - setfield_gc(p4, 1, descr=nextdescr) - jump(p4) - """ - with raises(InvalidLoop): - self.optimize_loop(ops, ops) - - def test_virtual_arrays_with_nonmatching_lens(self): - ops = """ - [p1] - p2 = new_array(3, descr=arraydescr) - label(p2) - p4 = new_array(2, descr=arraydescr) - jump(p4) - """ - with raises(InvalidLoop): - self.optimize_loop(ops, ops) - - def test_nonmatching_arraystruct_1(self): - ops = """ - [p1, f0] - p2 = new_array_clear(3, descr=complexarraydescr) - setinteriorfield_gc(p2, 2, f0, descr=complexrealdescr) - label(p2, f0) - p4 = new_array_clear(3, descr=complexarraydescr) - setinteriorfield_gc(p4, 2, f0, descr=compleximagdescr) - jump(p4, f0) - """ - with raises(InvalidLoop): - self.optimize_loop(ops, ops) - - def test_nonmatching_arraystruct_2(self): - ops = """ - [p1, f0] - p2 = new_array_clear(3, descr=complexarraydescr) - setinteriorfield_gc(p2, 2, f0, descr=complexrealdescr) - label(p2, f0) - p4 = new_array_clear(2, descr=complexarraydescr) - setinteriorfield_gc(p4, 0, f0, descr=complexrealdescr) - jump(p4, f0) - """ - with raises(InvalidLoop): - self.optimize_loop(ops, ops) - - def test_not_virtual(self): - ops = """ - [p1] - p3 = new_with_vtable(ConstClass(node_vtable)) - label(p3) - p4 = escape() - jump(p4) - """ - with raises(InvalidLoop): - self.optimize_loop(ops, ops) - - def test_not_virtual_array(self): - ops = """ - [p1] - p3 = new_array(3, descr=arraydescr) - label(p3) - p4 = escape() - jump(p4) - """ - with raises(InvalidLoop): - self.optimize_loop(ops, ops) - - def test_not_virtual_arraystruct(self): - ops = """ - [p1] - p3 = new_array_clear(3, descr=complexarraydescr) - label(p3) - p4 = escape() - jump(p4) - """ - with raises(InvalidLoop): - self.optimize_loop(ops, ops) - - def test_virtual_turns_constant(self): - ops = """ - [p1] - p3 = new_with_vtable(ConstClass(node_vtable)) - label(p3) - guard_value(p3, ConstPtr(myptr)) [] - jump(p3) - """ - with raises(InvalidLoop): - self.optimize_loop(ops, ops) - - def test_virtuals_turns_not_equal(self): - ops = """ - [p1, p2] - p3 = new_with_vtable(ConstClass(node_vtable)) - label(p3, p3) - p4 = new_with_vtable(ConstClass(node_vtable)) - jump(p3, p4) - """ - with raises(InvalidLoop): - self.optimize_loop(ops, ops) - - def test_two_intermediate_labels_basic_1(self): - ops = """ - [p1, i1] - i2 = getfield_gc(p1, descr=valuedescr) - label(p1, i1) - i3 = getfield_gc(p1, descr=valuedescr) - i4 = int_add(i1, i3) - label(p1, i4) - i5 = int_add(i4, 1) - jump(p1, i5) - """ - expected = """ - [p1, i1] - i2 = getfield_gc(p1, descr=valuedescr) - label(p1, i1, i2) - i4 = int_add(i1, i2) - label(p1, i4) - i5 = int_add(i4, 1) - jump(p1, i5) - """ - short1 = """ - [p1, i1] - label(p1, i1) - i2 = getfield_gc(p1, descr=valuedescr) - jump(p1, i1, i2) - """ - short2 = """ - [p1, i1] - label(p1, i1) - jump(p1, i1) - """ - self.optimize_loop(ops, expected, expected_shorts=[short1, short2]) - - def test_two_intermediate_labels_basic_2(self): - ops = """ - [p1, i1] - i2 = int_add(i1, 1) - label(p1, i1) - i3 = getfield_gc(p1, descr=valuedescr) - i4 = int_add(i1, i3) - label(p1, i4) - i5 = getfield_gc(p1, descr=valuedescr) - i6 = int_add(i4, i5) - jump(p1, i6) - """ - expected = """ - [p1, i1] - i2 = int_add(i1, 1) - label(p1, i1) - i3 = getfield_gc(p1, descr=valuedescr) - i4 = int_add(i1, i3) - label(p1, i4, i3) - i6 = int_add(i4, i3) - jump(p1, i6, i3) - """ - short1 = """ - [p1, i1] - label(p1, i1) - jump(p1, i1) - """ - short2 = """ - [p1, i1] - label(p1, i1) - i2 = getfield_gc(p1, descr=valuedescr) - jump(p1, i1, i2) - """ - self.optimize_loop(ops, expected, expected_shorts=[short1, short2]) - - def test_two_intermediate_labels_both(self): - ops = """ - [p1, i1] - i2 = getfield_gc(p1, descr=valuedescr) - label(p1, i1) - i3 = getfield_gc(p1, descr=valuedescr) - i4 = int_add(i1, i3) - label(p1, i4) - i5 = getfield_gc(p1, descr=valuedescr) - i6 = int_mul(i4, i5) - jump(p1, i6) - """ - expected = """ - [p1, i1] - i2 = getfield_gc(p1, descr=valuedescr) - label(p1, i1, i2) - i4 = int_add(i1, i2) - label(p1, i4, i2) - i6 = int_mul(i4, i2) - jump(p1, i6, i2) - """ - short = """ - [p1, i1] - label(p1, i1) - i2 = getfield_gc(p1, descr=valuedescr) - jump(p1, i1, i2) - """ - self.optimize_loop(ops, expected, expected_shorts=[short, short]) - - def test_import_across_multiple_labels_basic(self): - # Not supported, juts make sure we get a functional trace - ops = """ - [p1, i1] - i2 = getfield_gc(p1, descr=valuedescr) - label(p1, i1) - i3 = int_add(i1, 1) - label(p1, i1) - i4 = getfield_gc(p1, descr=valuedescr) - i5 = int_add(i4, 1) - jump(p1, i5) - """ - self.optimize_loop(ops, ops) - - def test_import_across_multiple_labels_with_duplication(self): - # Not supported, juts make sure we get a functional trace - ops = """ - [p1, i1] - i2 = getfield_gc(p1, descr=valuedescr) - label(p1, i2) - i3 = int_add(i2, 1) - label(p1, i2) - i4 = getfield_gc(p1, descr=valuedescr) - i5 = int_add(i4, 1) - jump(p1, i5) - """ - exported = """ - [p1, i1] - i2 = getfield_gc(p1, descr=valuedescr) - i6 = same_as(i2) - label(p1, i2) - i3 = int_add(i2, 1) - label(p1, i2) - i4 = getfield_gc(p1, descr=valuedescr) - i5 = int_add(i4, 1) - jump(p1, i5) - """ - self.optimize_loop(ops, exported) - - def test_import_virtual_across_multiple_labels(self): - ops = """ - [p0, i1] - i1a = int_add(i1, 1) - pv = new_with_vtable(ConstClass(node_vtable)) - setfield_gc(pv, i1a, descr=valuedescr) - label(pv, i1) - i2 = int_mul(i1, 3) - label(pv, i2) - i3 = getfield_gc(pv, descr=valuedescr) - i4 = int_add(i3, i2) - jump(pv, i4) - """ - expected = """ - [p0, i1] - i1a = int_add(i1, 1) - i5 = same_as(i1a) - label(i1a, i1) - i2 = int_mul(i1, 3) - label(i1a, i2) - i4 = int_add(i1a, i2) - jump(i1a, i4) - """ - self.optimize_loop(ops, expected) - - def test_virtual_as_field_of_forced_box(self): - ops = """ - [p0] - pv1 = new_with_vtable(ConstClass(node_vtable)) - label(pv1, p0) - pv2 = new_with_vtable(ConstClass(node_vtable)) - setfield_gc(pv2, pv1, descr=valuedescr) - jump(pv1, pv2) - """ - with raises(InvalidLoop): - self.optimize_loop(ops, ops) - - def test_issue1045(self): - ops = """ - [i55] - i73 = int_mod(i55, 2) - i75 = int_rshift(i73, 63) - i76 = int_and(2, i75) - i77 = int_add(i73, i76) - i81 = int_eq(i77, 1) - i0 = int_ge(i55, 1) - guard_true(i0) [] - label(i55) - i3 = int_mod(i55, 2) - i5 = int_rshift(i3, 63) - i6 = int_and(2, i5) - i7 = int_add(i3, i6) - i8 = int_eq(i7, 1) - escape(i8) - jump(i55) - """ - expected = """ - [i55] - i73 = int_mod(i55, 2) - i75 = int_rshift(i73, 63) - i76 = int_and(2, i75) - i77 = int_add(i73, i76) - i81 = int_eq(i77, 1) - i0 = int_ge(i55, 1) - guard_true(i0) [] - label(i55, i81) - escape(i81) - jump(i55, i81) - """ - self.optimize_loop(ops, expected) - - def test_boxed_opaque_unknown_class(self): - ops = """ - [p1] - p2 = getfield_gc(p1, descr=nextdescr) - mark_opaque_ptr(p2) - i3 = getfield_gc(p2, descr=otherdescr) - label(p1) - i4 = getfield_gc(p1, descr=otherdescr) - label(p1) - p5 = getfield_gc(p1, descr=nextdescr) - mark_opaque_ptr(p5) - i6 = getfield_gc(p5, descr=otherdescr) - i7 = call(i6, descr=nonwritedescr) - """ - expected = """ - [p1] - p2 = getfield_gc(p1, descr=nextdescr) - i3 = getfield_gc(p2, descr=otherdescr) - label(p1) - i4 = getfield_gc(p1, descr=otherdescr) - label(p1) - p5 = getfield_gc(p1, descr=nextdescr) - i6 = getfield_gc(p5, descr=otherdescr) - i7 = call(i6, descr=nonwritedescr) - """ - self.optimize_loop(ops, expected) - - def test_opaque_pointer_fails_to_close_loop(self): - ops = """ - [p1, p11] - p2 = getfield_gc(p1, descr=nextdescr) - guard_class(p2, ConstClass(node_vtable)) [] - mark_opaque_ptr(p2) - i3 = getfield_gc(p2, descr=otherdescr) - label(p1, p11) - p12 = getfield_gc(p1, descr=nextdescr) - i13 = getfield_gc(p2, descr=otherdescr) - i14 = call(i13, descr=nonwritedescr) - jump(p11, p1) - """ - with raises(InvalidLoop): - self.optimize_loop(ops, ops) - - - - -class OptRenameStrlen(Optimization): - def propagate_forward(self, op): - dispatch_opt(self, op) - - def optimize_STRLEN(self, op): - newop = op.clone() - newop.result = op.result.clonebox() - self.emit_operation(newop) - self.make_equal_to(op.result, self.getvalue(newop.result)) - -dispatch_opt = make_dispatcher_method(OptRenameStrlen, 'optimize_', - default=OptRenameStrlen.emit_operation) - -class BaseTestOptimizerRenamingBoxes(BaseTestMultiLabel): - - def _do_optimize_loop(self, loop, call_pure_results, state, - export_state=False): - from rpython.jit.metainterp.optimizeopt.unroll import optimize_unroll - from rpython.jit.metainterp.optimizeopt.util import args_dict - from rpython.jit.metainterp.optimizeopt.pure import OptPure - - self.loop = loop - loop.call_pure_results = args_dict() - metainterp_sd = FakeMetaInterpStaticData(self.cpu) - return optimize_unroll(metainterp_sd, loop, [OptRewrite(), OptRenameStrlen(), OptHeap(), OptPure()], True, state, export_state) - - def test_optimizer_renaming_boxes1(self): - ops = """ - [p1] - i1 = strlen(p1) - label(p1) - i2 = strlen(p1) - i3 = int_add(i2, 7) - jump(p1) - """ - expected = """ - [p1] - i1 = strlen(p1) - label(p1, i1) - i11 = same_as(i1) - i2 = int_add(i11, 7) - jump(p1, i11) - """ - self.optimize_loop(ops, expected) - - def test_optimizer_renaming_boxes_not_imported(self): - ops = """ - [p1] - i1 = strlen(p1) - label(p1) - jump(p1) - """ - expected = """ - [p1] - i1 = strlen(p1) - label(p1, i1) - i11 = same_as(i1) - jump(p1, i11) - """ - self.optimize_loop(ops, expected) - - -class XxxTestLLtype(OptimizeoptTestMultiLabel, LLtypeMixin): - pass - -class XxxTestOptimizerRenamingBoxesLLtype(BaseTestOptimizerRenamingBoxes, LLtypeMixin): - pass diff -Nru pypy-7.1.1+dfsg/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py pypy-7.3.1+dfsg/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py --- pypy-7.1.1+dfsg/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py 2020-04-10 19:28:41.000000000 +0000 @@ -1,18 +1,20 @@ -import py, sys -from rpython.rlib.objectmodel import instantiate +import py +import sys +import re from rpython.rlib.rarithmetic import intmask -from rpython.jit.metainterp.optimizeopt.test.test_util import ( - LLtypeMixin, BaseTest, FakeMetaInterpStaticData, convert_old_style_to_targets) -from rpython.jit.metainterp.history import TargetToken, JitCellToken -import rpython.jit.metainterp.optimizeopt.optimizer as optimizeopt -import rpython.jit.metainterp.optimizeopt.virtualize as virtualize -from rpython.jit.metainterp.optimize import InvalidLoop -from rpython.jit.metainterp.history import ConstInt, get_const_ptr_for_string -from rpython.jit.metainterp import executor, compile, resume -from rpython.jit.metainterp.resoperation import rop, ResOperation, InputArgInt,\ - OpHelpers, InputArgRef -from rpython.jit.metainterp.resumecode import unpack_numbering from rpython.rlib.rarithmetic import LONG_BIT +from rpython.rtyper import rclass +from rpython.rtyper.lltypesystem import lltype +from rpython.jit.metainterp.optimizeopt.test.test_util import ( + BaseTest, convert_old_style_to_targets) +from rpython.jit.metainterp.history import ( + JitCellToken, ConstInt, get_const_ptr_for_string) +from rpython.jit.metainterp import executor, compile +from rpython.jit.metainterp.resoperation import ( + rop, ResOperation, InputArgInt, OpHelpers, InputArgRef) +from rpython.jit.metainterp.optimizeopt.intdiv import magic_numbers +from rpython.jit.metainterp.test.test_resume import ( + ResumeDataFakeReader, MyMetaInterp) from rpython.jit.tool.oparser import parse, convert_loop_to_trace # ____________________________________________________________ @@ -30,19 +32,19 @@ exp = parse(optops, namespace=self.namespace.copy()) expected = convert_old_style_to_targets(exp, jump=True) call_pure_results = self._convert_call_pure_results(call_pure_results) - trace = convert_loop_to_trace(loop, FakeMetaInterpStaticData(self.cpu)) + trace = convert_loop_to_trace(loop, self.metainterp_sd) compile_data = compile.SimpleCompileData( - trace, call_pure_results=call_pure_results) - info, ops = self._do_optimize_loop(compile_data) + trace, call_pure_results=call_pure_results, + enable_opts=self.enable_opts) + info, ops = compile_data.optimize_trace(self.metainterp_sd, None, {}) label_op = ResOperation(rop.LABEL, info.inputargs) loop.inputargs = info.inputargs loop.operations = [label_op] + ops - #print '\n'.join([str(o) for o in loop.operations]) self.loop = loop self.assert_equal(loop, expected) -class BaseTestOptimizeBasic(BaseTestBasic): +class TestOptimizeBasic(BaseTestBasic): def test_very_simple(self): ops = """ @@ -2109,9 +2111,11 @@ self.optimize_loop(ops, expected) # ---------- + def get_class_of_box(self, box): + base = box.getref_base() + return lltype.cast_opaque_ptr(rclass.OBJECTPTR, base).typeptr def _verify_fail_args(self, boxes, oparse, text): - import re r = re.compile(r"\bwhere\s+(\w+)\s+is a\s+(\w+)") parts = list(r.finditer(text)) ends = [match.start() for match in parts] + [len(text)] @@ -2208,8 +2212,6 @@ index += 1 def check_expanded_fail_descr(self, expectedtext, guard_opnum, values=None): - from rpython.jit.metainterp.test.test_resume import ResumeDataFakeReader - from rpython.jit.metainterp.test.test_resume import MyMetaInterp guard_op, = [op for op in self.loop.operations if op.is_guard()] fail_args = guard_op.getfailargs() if values is not None: @@ -3435,7 +3437,6 @@ def test_int_add_sub_constants_inverse(self): py.test.skip("reenable") - import sys ops = """ [i0, i10, i11, i12, i13] i2 = int_add(1, i0) @@ -4763,7 +4764,6 @@ self.optimize_loop(ops, expected) def test_intmod_bounds(self): - from rpython.jit.metainterp.optimizeopt.intdiv import magic_numbers ops = """ [i0, i1] i2 = call_pure_i(321, i0, 12, descr=int_py_mod_descr) @@ -5790,7 +5790,3 @@ i57 = int_or(i51, i52) """ self.optimize_loop(ops, expected) - - -class TestLLtype(BaseTestOptimizeBasic, LLtypeMixin): - pass diff -Nru pypy-7.1.1+dfsg/rpython/jit/metainterp/optimizeopt/test/test_optimizebridge.py pypy-7.3.1+dfsg/rpython/jit/metainterp/optimizeopt/test/test_optimizebridge.py --- pypy-7.1.1+dfsg/rpython/jit/metainterp/optimizeopt/test/test_optimizebridge.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/metainterp/optimizeopt/test/test_optimizebridge.py 2020-04-10 19:28:41.000000000 +0000 @@ -1,12 +1,11 @@ - -from rpython.jit.metainterp.optimizeopt.test.test_util import BaseTest,\ - LLtypeMixin, convert_old_style_to_targets, FakeMetaInterpStaticData +from rpython.jit.metainterp.optimizeopt.test.test_util import ( + BaseTest, convert_old_style_to_targets) from rpython.jit.metainterp import compile from rpython.jit.tool import oparser from rpython.jit.metainterp.resoperation import ResOperation, rop -from rpython.jit.metainterp.history import TargetToken, IntFrontendOp, RefFrontendOp +from rpython.jit.metainterp.history import TargetToken -class TestOptimizeBridge(BaseTest, LLtypeMixin): +class TestOptimizeBridge(BaseTest): enable_opts = "intbounds:rewrite:virtualize:string:earlyforce:pure:heap:unroll" def optimize(self, ops, bridge_ops, expected, expected_loop=None, @@ -28,12 +27,13 @@ bridge = self.parse(bridge_ops) bridge.operations[-1].setdescr(jitcell_token) self.add_guard_future_condition(bridge) - trace = oparser.convert_loop_to_trace(bridge, FakeMetaInterpStaticData(self.cpu)) - data = compile.BridgeCompileData(trace, self.convert_values(bridge.operations[-1].getarglist(), bridge_values), - None, - enable_opts=self.enable_opts, - inline_short_preamble=inline_short_preamble) - bridge_info, ops = self._do_optimize_loop(data) + trace = oparser.convert_loop_to_trace(bridge, self.metainterp_sd) + data = compile.BridgeCompileData( + trace, + self.convert_values(bridge.operations[-1].getarglist(), bridge_values), + None, enable_opts=self.enable_opts, + inline_short_preamble=inline_short_preamble) + bridge_info, ops = data.optimize_trace(self.metainterp_sd, None, {}) loop.check_consistency(check_descr=False) info.preamble.check_consistency(check_descr=False) bridge.operations = ([ResOperation(rop.LABEL, bridge_info.inputargs)] + @@ -55,7 +55,7 @@ assert len(jump_args) == len(label_args) for a, b in zip(jump_args, label_args): assert a.type == b.type - + def test_simple(self): loop = """ [i0] diff -Nru pypy-7.1.1+dfsg/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py pypy-7.3.1+dfsg/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py --- pypy-7.1.1+dfsg/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py 2020-04-10 19:28:41.000000000 +0000 @@ -1,18 +1,14 @@ -import py, sys -from rpython.rlib.objectmodel import instantiate +import py +import sys from rpython.rlib.rarithmetic import intmask from rpython.rtyper.lltypesystem import lltype -from rpython.jit.metainterp import compile, resume -from rpython.jit.metainterp.history import AbstractDescr, ConstInt, TreeLoop -from rpython.jit.metainterp.history import ConstPtr +from rpython.jit.metainterp.history import ConstInt, TreeLoop, ConstPtr from rpython.jit.metainterp.optimize import InvalidLoop from rpython.jit.metainterp.optimizeopt import build_opt_chain from rpython.jit.metainterp.optimizeopt.test.test_util import ( - LLtypeMixin, BaseTest, convert_old_style_to_targets) -from rpython.jit.metainterp.optimizeopt.test.test_optimizebasic import \ - FakeMetaInterpStaticData -from rpython.jit.metainterp.resoperation import rop, opname, oparity,\ - InputArgInt + BaseTest, convert_old_style_to_targets) +from rpython.jit.metainterp.resoperation import ( + rop, opname, oparity, InputArgInt) def test_build_opt_chain(): @@ -20,24 +16,16 @@ names = [opt.__class__.__name__ for opt in chain] assert names == expected_names # - metainterp_sd = FakeMetaInterpStaticData(None) - chain, _ = build_opt_chain(metainterp_sd, "") + chain = build_opt_chain("") check(chain, ["OptSimplify"]) # - chain, _ = build_opt_chain(metainterp_sd, "") - check(chain, ["OptSimplify"]) - # - chain, _ = build_opt_chain(metainterp_sd, "") - check(chain, ["OptSimplify"]) - # - chain, _ = build_opt_chain(metainterp_sd, "heap:intbounds") + chain = build_opt_chain("heap:intbounds") check(chain, ["OptIntBounds", "OptHeap", "OptSimplify"]) # - chain, unroll = build_opt_chain(metainterp_sd, "unroll") + chain = build_opt_chain("unroll") check(chain, ["OptSimplify"]) - assert unroll # - chain, _ = build_opt_chain(metainterp_sd, "aaa:bbb") + chain = build_opt_chain("aaa:bbb") check(chain, ["OptSimplify"]) @@ -103,7 +91,7 @@ return py.test.raises(e, fn, *args).value -class OptimizeOptTest(BaseTestWithUnroll): +class TestOptimizeOpt(BaseTestWithUnroll): def test_simple(self): ops = """ [] @@ -710,6 +698,15 @@ """ self.optimize_loop(ops, expected, preamble) + def test_guard_value_on_boolean_but_not_zero_or_one(self): + ops = """ + [i] + i1 = int_lt(i, 3) + guard_value(i1, -1) [i] + jump(i) + """ + py.test.raises(InvalidLoop, self.optimize_loop, ops, ops, ops) + def test_int_is_true_of_bool(self): ops = """ [i0, i1] @@ -5027,18 +5024,6 @@ """ self.optimize_loop(ops, expected) - def test_complains_getfieldpure_setfield(self): - from rpython.jit.metainterp.optimizeopt.heap import BogusImmutableField - py.test.skip("disabled for now") - ops = """ - [p3] - p1 = escape_r() - p2 = getfield_gc_r(p1, descr=nextdescr) - setfield_gc(p1, p3, descr=nextdescr) - jump(p3) - """ - self.raises(BogusImmutableField, self.optimize_loop, ops, "crash!") - def test_dont_complains_different_field(self): ops = """ [p3] @@ -7232,6 +7217,7 @@ """ expected = """ [p0, p1, i0] + guard_not_invalidated() [] i1 = getfield_gc_i(p0, descr=quasifielddescr) escape_n(i1) jump(p1, p0, i1) @@ -7255,6 +7241,29 @@ """ self.optimize_loop(ops, expected, expected) + def test_always_leave_one_guard_not_invalidated(self): + ops = """ + [p0, p1, i0] + quasiimmut_field(p0, descr=quasiimmutdescr) + guard_not_invalidated() [] # needs to stay + i1 = getfield_gc_i(p0, descr=quasifielddescr) + quasiimmut_field(ConstPtr(quasiptr), descr=quasiimmutdescr) + guard_not_invalidated() [] + i2 = getfield_gc_i(ConstPtr(quasiptr), descr=quasifielddescr) + escape_n(i1) + escape_n(i2) + jump(p1, p0, i1) + """ + expected = """ + [p0, p1, i0] + guard_not_invalidated() [] + i1 = getfield_gc_i(p0, descr=quasifielddescr) + escape_n(i1) + escape_n(-4247) + jump(p1, p0, i1) + """ + self.optimize_loop(ops, expected) + def test_remove_extra_guards_not_invalidated(self): ops = """ [i0] @@ -7333,7 +7342,9 @@ """ expected = """ [i0a, i0b] + guard_not_invalidated() [] call_may_force_n(i0b, descr=mayforcevirtdescr) + guard_not_invalidated() [] i3 = escape_i(421) i4 = escape_i(421) jump(i3, i4) @@ -8809,7 +8820,7 @@ i2 = int_add(i1, 1) i3 = int_le(i2, 13) guard_true(i3) [p1] - jump(p0, i2) + jump(p0, i2) """ expected = """ [p0, i1, p1] @@ -8824,7 +8835,7 @@ i2 = int_add(i1, 1) i3 = int_le(i2, 13) guard_true(i3) [p1] - jump(p0, i2, p1) + jump(p0, i2, p1) """ self.optimize_loop(ops, expected, preamble) @@ -8846,7 +8857,7 @@ escape_n(i4) setfield_gc(p0, i1, descr=valuedescr) ii = same_as_i(i1) - jump(p0, i0, i3, i1, ii) + jump(p0, i0, i3, i1, ii) """ expected = """ [p0, i0, i2, i4, i5] @@ -8887,7 +8898,7 @@ jump(i19) """ self.optimize_loop(ops, expected, expected_short=expected_short) - + def test_cached_arrayitem_write_descr(self): ops = """ @@ -9520,5 +9531,41 @@ """ self.optimize_loop(ops, expected) -class TestLLtype(OptimizeOptTest, LLtypeMixin): - pass + def test_issue3014(self): + # 'gc_load_indexed' must force 'setarrayitem_gc' + ops = """ + [i183] + p0 = new_array(5, descr=arraydescr) + setarrayitem_gc(p0, 0, i183, descr=arraydescr) + i235 = gc_load_indexed_i(p0, 0, 1, 16, 2) + escape_i(i235) + jump(i183) + """ + self.optimize_loop(ops, ops) + + def test_issue3014_2(self): + # same rules for gc_store_indexed versus getarrayitem_gc, + # and 'gc_store_indexed' invalidates the value for 'getarrayitem_gc' + # (in this direction it seems to work already) + ops = """ + [p0, i183] + i234 = getarrayitem_gc_i(p0, 0, descr=arraydescr) + gc_store_indexed(p0, 0, i183, 1, 16, 2) + i235 = getarrayitem_gc_i(p0, 0, descr=arraydescr) + escape_i(i234) + escape_i(i235) + jump(p0, i183) + """ + self.optimize_loop(ops, ops) + + def test_issue3014_3(self): + # 'gc_load' must force 'setfield_gc' + ops = """ + [i183] + p0 = new(descr=ssize) + setfield_gc(p0, i183, descr=adescr) + i235 = gc_load_i(p0, 8, 2) + escape_i(i235) + jump(i183) + """ + self.optimize_loop(ops, ops) diff -Nru pypy-7.1.1+dfsg/rpython/jit/metainterp/optimizeopt/test/test_schedule.py pypy-7.3.1+dfsg/rpython/jit/metainterp/optimizeopt/test/test_schedule.py --- pypy-7.1.1+dfsg/rpython/jit/metainterp/optimizeopt/test/test_schedule.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/metainterp/optimizeopt/test/test_schedule.py 2020-04-10 19:28:41.000000000 +0000 @@ -3,24 +3,21 @@ import pytest import platform -from rpython.jit.metainterp.history import TargetToken, JitCellToken, TreeLoop -from rpython.jit.metainterp.optimizeopt.util import equaloplists from rpython.jit.metainterp.optimizeopt.renamer import Renamer -from rpython.jit.metainterp.optimizeopt.vector import (VecScheduleState, - Pack, Pair, NotAProfitableLoop, VectorizingOptimizer, GenericCostModel, - PackSet, SchedulerState) +from rpython.jit.metainterp.optimizeopt.vector import ( + VecScheduleState, Pack, Pair, VectorizingOptimizer, GenericCostModel, + PackSet, SchedulerState) from rpython.jit.backend.llsupport.vector_ext import VectorExt -from rpython.jit.metainterp.optimizeopt.dependency import Node, DependencyGraph +from rpython.jit.metainterp.optimizeopt.dependency import DependencyGraph from rpython.jit.metainterp.optimizeopt.schedule import Scheduler -from rpython.jit.metainterp.optimizeopt.test.test_util import LLtypeMixin -from rpython.jit.metainterp.optimizeopt.test.test_dependency import (DependencyBaseTest) -from rpython.jit.metainterp.optimizeopt.test.test_vecopt import (FakeMetaInterpStaticData, - FakeJitDriverStaticData, FakePackSet) -from rpython.jit.metainterp.resoperation import rop, ResOperation, VectorizationInfo -from rpython.jit.tool.oparser import parse as opparse -from rpython.jit.tool.oparser_model import get_model +from rpython.jit.metainterp.optimizeopt.test.test_dependency import ( + DependencyBaseTest) +from rpython.jit.metainterp.optimizeopt.test.test_vecopt import ( + FakeJitDriverStaticData, FakePackSet) +from rpython.jit.metainterp.resoperation import ( + rop, ResOperation, VectorizationInfo) -if sys.maxint == 2**31-1: +if sys.maxint == 2 ** 31 - 1: pytest.skip("32bit platforms are not supported") class FakeVecScheduleState(VecScheduleState): @@ -63,9 +60,8 @@ for name, overwrite in (overwrite_funcs or {}).items(): setattr(state, name, overwrite) renamer = Renamer() - metainterp_sd = FakeMetaInterpStaticData(self.cpu) jitdriver_sd = FakeJitDriverStaticData() - opt = VectorizingOptimizer(metainterp_sd, jitdriver_sd, 0) + opt = VectorizingOptimizer(self.metainterp_sd, jitdriver_sd, 0) opt.packset = packset opt.combine_packset() opt.schedule(state) @@ -76,7 +72,7 @@ loop.operations = loop.prefix + loop.operations return loop -class Test(SchedulerBaseTest, LLtypeMixin): +class TestScheduler(SchedulerBaseTest): def test_next_must_not_loop_forever(self): scheduler = Scheduler() @@ -318,11 +314,11 @@ pack3 = self.pack(loop1, 8, 12) loop2 = self.schedule(loop1, [pack1,pack2,pack3]) loop3 = self.parse_trace(""" - v44[2xf64] = vec_load_f(p0, i1, 1, 0, descr=double) - v45[2xf64] = vec_load_f(p0, i3, 1, 0, descr=double) - v46[2xi32] = vec_cast_float_to_singlefloat(v44[2xf64]) - v47[2xi32] = vec_cast_float_to_singlefloat(v45[2xf64]) - v41[4xi32] = vec_pack_i(v46[2xi32], v47[2xi32], 2, 2) + v44[2xf64] = vec_load_f(p0, i1, 1, 0, descr=double) + v45[2xf64] = vec_load_f(p0, i3, 1, 0, descr=double) + v46[2xi32] = vec_cast_float_to_singlefloat(v44[2xf64]) + v47[2xi32] = vec_cast_float_to_singlefloat(v45[2xf64]) + v41[4xi32] = vec_pack_i(v46[2xi32], v47[2xi32], 2, 2) vec_store(p1, i1, v41[4xi32], 1, 0, descr=float) """, False) self.assert_equal(loop2, loop3) diff -Nru pypy-7.1.1+dfsg/rpython/jit/metainterp/optimizeopt/test/test_unroll.py pypy-7.3.1+dfsg/rpython/jit/metainterp/optimizeopt/test/test_unroll.py --- pypy-7.1.1+dfsg/rpython/jit/metainterp/optimizeopt/test/test_unroll.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/metainterp/optimizeopt/test/test_unroll.py 2020-04-10 19:28:41.000000000 +0000 @@ -1,23 +1,19 @@ - -""" More direct tests for unrolling +""" +More direct tests for unrolling """ -import py - -from rpython.jit.metainterp.optimizeopt.test.test_util import BaseTest,\ - LLtypeMixin, FakeMetaInterpStaticData +from rpython.jit.metainterp.optimizeopt.test.test_util import BaseTest from rpython.jit.metainterp.optimizeopt.util import equaloplists -from rpython.jit.metainterp.history import (TreeLoop, ConstInt, - JitCellToken, TargetToken) -from rpython.jit.metainterp.resoperation import rop, ResOperation,\ - InputArgRef, InputArgInt -from rpython.jit.metainterp.support import adr2int -from rpython.jit.metainterp.optimizeopt.shortpreamble import \ - ShortPreambleBuilder, PreambleOp, ShortInputArg -from rpython.jit.metainterp.compile import LoopCompileData -from rpython.jit.metainterp.optimizeopt.virtualstate import \ - NotVirtualStateInfo, LEVEL_CONSTANT, LEVEL_UNKNOWN, LEVEL_KNOWNCLASS,\ - VirtualStateInfo +from rpython.jit.metainterp.history import TreeLoop +from rpython.jit.metainterp.resoperation import ( + rop, ResOperation, InputArgRef, InputArgInt) +from rpython.jit.metainterp.support import ptr2int +from rpython.jit.metainterp.optimizeopt.shortpreamble import ( + ShortPreambleBuilder, PreambleOp, ShortInputArg) +from rpython.jit.metainterp.compile import PreambleCompileData +from rpython.jit.metainterp.optimizeopt.virtualstate import ( + NotVirtualStateInfo, LEVEL_CONSTANT, LEVEL_UNKNOWN, LEVEL_KNOWNCLASS, + VirtualStateInfo) from rpython.jit.metainterp.optimizeopt import info, optimizer from rpython.jit.tool import oparser @@ -28,35 +24,28 @@ class cpu: remove_gctypeptr = True - def getptrinfo(self, box): - return box.get_forwarded() - def setinfo_from_preamble(self, *args): pass def get_box_replacement(self, box): return box -class BaseTestUnroll(BaseTest, LLtypeMixin): +class BaseTestUnroll(BaseTest): enable_opts = "intbounds:rewrite:virtualize:string:earlyforce:pure:heap:unroll" def optimize(self, ops): loop = self.parse(ops) self.add_guard_future_condition(loop) - operations = loop.operations + operations = loop.operations jumpop = operations[-1] assert jumpop.getopnum() == rop.JUMP inputargs = loop.inputargs - - jump_args = jumpop.getarglist()[:] - operations = operations[:-1] - preamble = TreeLoop('preamble') - - token = JitCellToken() - trace = oparser.convert_loop_to_trace(loop, FakeMetaInterpStaticData(self.cpu)) - compile_data = LoopCompileData(trace, inputargs) - start_state, newops = self._do_optimize_loop(compile_data) + trace = oparser.convert_loop_to_trace(loop, self.metainterp_sd) + compile_data = PreambleCompileData( + trace, inputargs, enable_opts=self.enable_opts) + start_state, newops = compile_data.optimize_trace( + self.metainterp_sd, None, {}) preamble.operations = newops preamble.inputargs = start_state.renamed_inputargs return start_state, loop, preamble @@ -133,7 +122,7 @@ """ es, loop, preamble = self.optimize(loop) p0 = preamble.inputargs[0] - expected_class = adr2int(self.node_vtable_adr) + expected_class = ptr2int(self.node_vtable) assert expected_class == es.exported_infos[p0]._known_class.getint() vs = es.virtual_state assert vs.state[0].level == LEVEL_KNOWNCLASS diff -Nru pypy-7.1.1+dfsg/rpython/jit/metainterp/optimizeopt/test/test_util.py pypy-7.3.1+dfsg/rpython/jit/metainterp/optimizeopt/test/test_util.py --- pypy-7.1.1+dfsg/rpython/jit/metainterp/optimizeopt/test/test_util.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/metainterp/optimizeopt/test/test_util.py 2020-04-10 19:28:41.000000000 +0000 @@ -1,27 +1,30 @@ -import py, random, string +import pytest +import random +import string -from rpython.rlib.debug import debug_print from rpython.rtyper.lltypesystem import lltype, llmemory, rffi from rpython.rtyper import rclass from rpython.rtyper.rclass import ( OBJECT, OBJECT_VTABLE, FieldListAccessor, IR_QUASIIMMUTABLE) +from rpython.rlib.rjitlog import rjitlog as jl from rpython.jit.backend.llgraph import runner -from rpython.jit.metainterp.history import (TreeLoop, AbstractDescr, - JitCellToken, TargetToken) -from rpython.jit.metainterp.optimizeopt.util import sort_descrs, equaloplists +from rpython.jit.metainterp.history import ( + TreeLoop, AbstractDescr, JitCellToken) +from rpython.jit.metainterp.history import IntFrontendOp, RefFrontendOp from rpython.jit.codewriter.effectinfo import EffectInfo, compute_bitstrings -from rpython.jit.metainterp.logger import LogOperations -from rpython.jit.tool.oparser import OpParser, pure_parse, convert_loop_to_trace +from rpython.jit.tool.oparser import ( + OpParser, pure_parse, convert_loop_to_trace) from rpython.jit.metainterp.quasiimmut import QuasiImmutDescr -from rpython.jit.metainterp import compile, resume, history +from rpython.jit.metainterp import compile from rpython.jit.metainterp.jitprof import EmptyProfiler from rpython.jit.metainterp.counter import DeterministicJitCounter from rpython.config.translationoption import get_combined_translation_config -from rpython.jit.metainterp.resoperation import (rop, ResOperation, - InputArgRef, AbstractValue, OpHelpers) -from rpython.jit.metainterp.optimizeopt.util import args_dict -from rpython.rlib.rjitlog import rjitlog as jl +from rpython.jit.metainterp.resoperation import ( + rop, ResOperation, InputArgRef, AbstractValue) +from rpython.jit.metainterp.virtualref import VirtualRefInfo +from rpython.jit.metainterp.optimizeopt.util import ( + sort_descrs, equaloplists, args_dict) def test_sort_descrs(): @@ -59,9 +62,10 @@ assert equaloplists(loop1.operations, loop2.operations, remap=make_remap(loop1.inputargs, loop2.inputargs)) - py.test.raises(AssertionError, - "equaloplists(loop1.operations, loop3.operations," - "remap=make_remap(loop1.inputargs, loop3.inputargs))") + with pytest.raises(AssertionError): + equaloplists( + loop1.operations, loop3.operations, + remap=make_remap(loop1.inputargs, loop3.inputargs)) def test_equaloplists_fail_args(): ops = """ @@ -75,36 +79,31 @@ loop1 = pure_parse(ops, namespace=namespace) loop2 = pure_parse(ops.replace("[i2, i1]", "[i1, i2]"), namespace=namespace) - py.test.raises(AssertionError, - "equaloplists(loop1.operations, loop2.operations," - "remap=make_remap(loop1.inputargs, loop2.inputargs))") + with pytest.raises(AssertionError): + equaloplists( + loop1.operations, loop2.operations, + remap=make_remap(loop1.inputargs, loop2.inputargs)) assert equaloplists(loop1.operations, loop2.operations, remap=make_remap(loop1.inputargs, loop2.inputargs), strict_fail_args=False) loop3 = pure_parse(ops.replace("[i2, i1]", "[i2, i0]"), namespace=namespace) - py.test.raises(AssertionError, - "equaloplists(loop1.operations, loop3.operations," - " remap=make_remap(loop1.inputargs, loop3.inputargs))") + with pytest.raises(AssertionError): + equaloplists( + loop1.operations, loop3.operations, + remap=make_remap(loop1.inputargs, loop3.inputargs)) # ____________________________________________________________ class LLtypeMixin(object): - def get_class_of_box(self, box): - base = box.getref_base() - return lltype.cast_opaque_ptr(rclass.OBJECTPTR, base).typeptr - node_vtable = lltype.malloc(OBJECT_VTABLE, immortal=True) node_vtable.name = rclass.alloc_array_name('node') - node_vtable_adr = llmemory.cast_ptr_to_adr(node_vtable) node_vtable2 = lltype.malloc(OBJECT_VTABLE, immortal=True) node_vtable2.name = rclass.alloc_array_name('node2') - node_vtable_adr2 = llmemory.cast_ptr_to_adr(node_vtable2) node_vtable3 = lltype.malloc(OBJECT_VTABLE, immortal=True) node_vtable3.name = rclass.alloc_array_name('node3') node_vtable3.subclassrange_min = 3 node_vtable3.subclassrange_max = 3 - node_vtable_adr3 = llmemory.cast_ptr_to_adr(node_vtable3) cpu = runner.LLGraphCPU(None) NODE = lltype.GcForwardReference() @@ -144,7 +143,8 @@ node2addr = lltype.cast_opaque_ptr(llmemory.GCREF, node2) myptr = lltype.cast_opaque_ptr(llmemory.GCREF, node) mynodeb = lltype.malloc(NODE) - myarray = lltype.cast_opaque_ptr(llmemory.GCREF, lltype.malloc(lltype.GcArray(lltype.Signed), 13, zero=True)) + myarray = lltype.cast_opaque_ptr(llmemory.GCREF, + lltype.malloc(lltype.GcArray(lltype.Signed), 13, zero=True)) mynodeb.parent.typeptr = node_vtable myptrb = lltype.cast_opaque_ptr(llmemory.GCREF, mynodeb) myptr2 = lltype.malloc(NODE2) @@ -161,9 +161,6 @@ mynode4.parent.typeptr = node_vtable3 myptr4 = lltype.cast_opaque_ptr(llmemory.GCREF, mynode4) # a NODE3 - - nullptr = lltype.nullptr(llmemory.GCREF.TO) - #nodebox2 = InputArgRef(lltype.cast_opaque_ptr(llmemory.GCREF, node2)) nodesize = cpu.sizeof(NODE, node_vtable) node_tid = nodesize.get_type_id() nodesize2 = cpu.sizeof(NODE2, node_vtable2) @@ -264,7 +261,7 @@ inst_step = cpu.fielddescrof(W_ROOT, 'inst_step') inst_w_list = cpu.fielddescrof(W_ROOT, 'inst_w_list') w_root_vtable = lltype.malloc(OBJECT_VTABLE, immortal=True) - + tsize = cpu.sizeof(T, None) cdescr = cpu.fielddescrof(T, 'c') ddescr = cpu.fielddescrof(T, 'd') @@ -274,7 +271,6 @@ ('parent', OBJECT), ('one', lltype.Ptr(lltype.GcArray(lltype.Ptr(NODE))))) u_vtable = lltype.malloc(OBJECT_VTABLE, immortal=True) - u_vtable_adr = llmemory.cast_ptr_to_adr(u_vtable) SIMPLE = lltype.GcStruct('simple', ('parent', OBJECT), ('value', lltype.Signed)) @@ -406,7 +402,6 @@ pass asmdescr = LoopToken() # it can be whatever, it's not a descr though - from rpython.jit.metainterp.virtualref import VirtualRefInfo class FakeWarmRunnerDesc: pass @@ -421,7 +416,6 @@ clear_vable = cpu.calldescrof(FUNC, FUNC.ARGS, FUNC.RESULT, ei) jit_virtual_ref_vtable = vrefinfo.jit_virtual_ref_vtable - jvr_vtable_adr = llmemory.cast_ptr_to_adr(jit_virtual_ref_vtable) vref_descr = cpu.sizeof(vrefinfo.JIT_VIRTUAL_REF, jit_virtual_ref_vtable) FUNC = lltype.FuncType([lltype.Signed, lltype.Signed], lltype.Signed) @@ -460,12 +454,6 @@ oopspecindex) calldescr_udiv = LLtypeMixin.int_udiv_descr - #calldescr_umod = LLtypeMixin.int_umod_descr - -LLtypeMixin.callinfocollection = FakeCallInfoCollection() - - -# ____________________________________________________________ class Fake(object): @@ -492,6 +480,7 @@ self.globaldata = Fake() self.config = get_combined_translation_config(translating=True) self.jitlog = jl.JitLogger() + self.callinfocollection = FakeCallInfoCollection() class logger_noopt: @classmethod @@ -524,24 +513,14 @@ self.short_preamble = short_preamble self.virtual_state = virtual_state -class Storage(compile.ResumeGuardDescr): - "for tests." - def __init__(self, metainterp_sd=None, original_greenkey=None): - self.metainterp_sd = metainterp_sd - self.original_greenkey = original_greenkey - def store_final_boxes(self, op, boxes, metainterp_sd): - op.setfailargs(boxes) - def __eq__(self, other): - return True # screw this - #return type(self) is type(other) # xxx obscure - -def _sortboxes(boxes): - _kind2count = {history.INT: 1, history.REF: 2, history.FLOAT: 3} - return sorted(boxes, key=lambda box: _kind2count[box.type]) - -final_descr = history.BasicFinalDescr() -class BaseTest(object): +class BaseTest(LLtypeMixin): + @pytest.fixture(autouse=True) + def cls_attributes(self): + metainterp_sd = FakeMetaInterpStaticData(self.cpu) + metainterp_sd.virtualref_info = self.vrefinfo + compute_bitstrings(self.cpu.fetch_all_descrs()) + self.metainterp_sd = metainterp_sd def parse(self, s, boxkinds=None, want_fail_descr=True, postprocess=None): AbstractValue._repr_memo.counter = 0 @@ -557,7 +536,6 @@ @staticmethod def assert_equal(optimized, expected, text_right=None): - from rpython.jit.metainterp.optimizeopt.util import equaloplists assert len(optimized.inputargs) == len(expected.inputargs) remap = {} for box1, box2 in zip(optimized.inputargs, expected.inputargs): @@ -566,22 +544,7 @@ assert equaloplists(optimized.operations, expected.operations, False, remap, text_right) - def _do_optimize_loop(self, compile_data): - from rpython.jit.metainterp.optimizeopt import optimize_trace - metainterp_sd = FakeMetaInterpStaticData(self.cpu) - if hasattr(self, 'vrefinfo'): - metainterp_sd.virtualref_info = self.vrefinfo - if hasattr(self, 'callinfocollection'): - metainterp_sd.callinfocollection = self.callinfocollection - compute_bitstrings(self.cpu.fetch_all_descrs()) - # - compile_data.enable_opts = self.enable_opts - state = optimize_trace(metainterp_sd, None, compile_data) - return state - def _convert_call_pure_results(self, d): - from rpython.jit.metainterp.optimizeopt.util import args_dict - if d is None: return call_pure_results = args_dict() @@ -590,7 +553,6 @@ return call_pure_results def convert_values(self, inpargs, values): - from rpython.jit.metainterp.history import IntFrontendOp, RefFrontendOp if values: r = [] for arg, v in zip(inpargs, values): @@ -615,18 +577,17 @@ celltoken = JitCellToken() runtime_boxes = self.pack_into_boxes(jump_op, jump_values) jump_op.setdescr(celltoken) - #start_label = ResOperation(rop.LABEL, loop.inputargs, - # descr=jump_op.getdescr()) - #end_label = jump_op.copy_and_change(opnum=rop.LABEL) call_pure_results = self._convert_call_pure_results(call_pure_results) - t = convert_loop_to_trace(loop, FakeMetaInterpStaticData(self.cpu)) - preamble_data = compile.LoopCompileData(t, runtime_boxes, - call_pure_results) - start_state, preamble_ops = self._do_optimize_loop(preamble_data) + t = convert_loop_to_trace(loop, self.metainterp_sd) + preamble_data = compile.PreambleCompileData( + t, runtime_boxes, call_pure_results, enable_opts=self.enable_opts) + start_state, preamble_ops = preamble_data.optimize_trace( + self.metainterp_sd, None, {}) preamble_data.forget_optimization_info() - loop_data = compile.UnrolledLoopData(preamble_data.trace, - celltoken, start_state, call_pure_results) - loop_info, ops = self._do_optimize_loop(loop_data) + loop_data = compile.UnrolledLoopData( + preamble_data.trace, celltoken, start_state, call_pure_results, + enable_opts=self.enable_opts) + loop_info, ops = loop_data.optimize_trace(self.metainterp_sd, None, {}) preamble = TreeLoop('preamble') preamble.inputargs = start_state.renamed_inputargs start_label = ResOperation(rop.LABEL, start_state.renamed_inputargs) diff -Nru pypy-7.1.1+dfsg/rpython/jit/metainterp/optimizeopt/test/test_vecopt.py pypy-7.3.1+dfsg/rpython/jit/metainterp/optimizeopt/test/test_vecopt.py --- pypy-7.1.1+dfsg/rpython/jit/metainterp/optimizeopt/test/test_vecopt.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/metainterp/optimizeopt/test/test_vecopt.py 2020-04-10 19:28:41.000000000 +0000 @@ -2,30 +2,18 @@ import sys import pytest -from rpython.rlib.objectmodel import instantiate -from rpython.jit.metainterp.optimizeopt.test.test_util import (LLtypeMixin, - FakeMetaInterpStaticData, convert_old_style_to_targets, - FakeWarmState) from rpython.jit.metainterp.optimizeopt.test.test_dependency import DependencyBaseTest -from rpython.jit.metainterp.history import TargetToken, JitCellToken, TreeLoop -from rpython.jit.metainterp.optimizeopt import optimize_trace -import rpython.jit.metainterp.optimizeopt.optimizer as optimizeopt -import rpython.jit.metainterp.optimizeopt.virtualize as virtualize -from rpython.jit.metainterp.optimizeopt.dependency import DependencyGraph from rpython.jit.metainterp.optimizeopt.vector import (VectorizingOptimizer, - MemoryRef, isomorphic, Pair, NotAVectorizeableLoop, VectorLoop, + MemoryRef, isomorphic, Pair, NotAVectorizeableLoop, NotAProfitableLoop, GuardStrengthenOpt, CostModel, GenericCostModel, PackSet, optimize_vector) from rpython.jit.metainterp.optimizeopt.schedule import (Scheduler, SchedulerState, VecScheduleState, Pack) from rpython.jit.metainterp.optimizeopt.optimizer import BasicLoopInfo -from rpython.jit.metainterp.optimize import InvalidLoop -from rpython.jit.metainterp import compile from rpython.jit.metainterp.resoperation import rop, ResOperation from rpython.jit.metainterp.optimizeopt.version import LoopVersionInfo from rpython.jit.backend.llsupport.descr import ArrayDescr from rpython.jit.metainterp.optimizeopt.dependency import Node, DependencyGraph -from rpython.jit.tool.oparser import OpParser, convert_loop_to_trace from rpython.jit.backend.detect_cpu import getcpuclass CPU = getcpuclass() @@ -82,7 +70,6 @@ vec_cost = 0 - class VecTestHelper(DependencyBaseTest): enable_opts = "intbounds:rewrite:virtualize:string:earlyforce:pure:heap" @@ -91,12 +78,12 @@ def assert_vectorize(self, loop, expected_loop, call_pure_results=None): jump = ResOperation(rop.JUMP, loop.jump.getarglist(), loop.jump.getdescr()) - metainterp_sd = FakeMetaInterpStaticData(self.cpu) warmstate = FakeWarmState() loop.operations += [loop.jump] loop_info = BasicLoopInfo(loop.jump.getarglist(), None, jump) - loop_info.label_op = ResOperation(rop.LABEL, loop.jump.getarglist(), loop.jump.getdescr()) - optimize_vector(None, metainterp_sd, self.jitdriver_sd, warmstate, + loop_info.label_op = ResOperation( + rop.LABEL, loop.jump.getarglist(), loop.jump.getdescr()) + optimize_vector(None, self.metainterp_sd, self.jitdriver_sd, warmstate, loop_info, loop.operations) loop.operations = loop.operations[:-1] #loop.label = state[0].label_op @@ -104,9 +91,8 @@ self.assert_equal(loop, expected_loop) def vectoroptimizer(self, loop): - metainterp_sd = FakeMetaInterpStaticData(self.cpu) jitdriver_sd = FakeJitDriverStaticData() - opt = VectorizingOptimizer(metainterp_sd, jitdriver_sd, 0) + opt = VectorizingOptimizer(self.metainterp_sd, jitdriver_sd, 0) opt.orig_label_args = loop.label.getarglist()[:] return opt @@ -117,7 +103,7 @@ opt.schedule(state) return graph.loop - def vectoroptimizer_unrolled(self, loop, unroll_factor = -1): + def vectoroptimizer_unrolled(self, loop, unroll_factor=-1): opt = self.vectoroptimizer(loop) opt.linear_find_smallest_type(loop) loop.setup_vectorization() @@ -147,25 +133,25 @@ graph.getmemref = gmr return opt, graph - def init_packset(self, loop, unroll_factor = -1): + def init_packset(self, loop, unroll_factor=-1): opt, graph = self.vectoroptimizer_unrolled(loop, unroll_factor) opt.find_adjacent_memory_refs(graph) return opt, graph - def extend_packset(self, loop, unroll_factor = -1): + def extend_packset(self, loop, unroll_factor=-1): opt, graph = self.vectoroptimizer_unrolled(loop, unroll_factor) opt.find_adjacent_memory_refs(graph) opt.extend_packset() return opt, graph - def combine_packset(self, loop, unroll_factor = -1): + def combine_packset(self, loop, unroll_factor=-1): opt, graph = self.vectoroptimizer_unrolled(loop, unroll_factor) opt.find_adjacent_memory_refs(graph) opt.extend_packset() opt.combine_packset() return opt, graph - def schedule(self, loop, unroll_factor = -1, with_guard_opt=False): + def schedule(self, loop, unroll_factor=-1, with_guard_opt=False): info = FakeLoopInfo(loop) info.snapshot(loop) opt, graph = self.vectoroptimizer_unrolled(loop, unroll_factor) @@ -186,7 +172,7 @@ state.post_schedule() return opt - def vectorize(self, loop, unroll_factor = -1): + def vectorize(self, loop, unroll_factor=-1): info = FakeLoopInfo(loop) info.snapshot(loop) opt, graph = self.vectoroptimizer_unrolled(loop, unroll_factor) @@ -216,19 +202,19 @@ loop.operations += oplist return opt - def assert_unroll_loop_equals(self, loop, expected_loop, \ - unroll_factor = -1): + def assert_unroll_loop_equals( + self, loop, expected_loop, unroll_factor=-1): self.vectoroptimizer_unrolled(loop, unroll_factor) self.assert_equal(loop, expected_loop) def assert_pack(self, pack, indices): assert len(pack.operations) == len(indices) - for op,i in zip(pack.operations, indices): + for op, i in zip(pack.operations, indices): assert op.opidx == i def assert_has_pack_with(self, packset, opindices): for pack in packset.packs: - for op,i in zip(pack.operations, opindices): + for op, i in zip(pack.operations, opindices): if op.opidx != i: break else: @@ -251,8 +237,9 @@ for pack in packset.packs: if pack.leftmost(node=True).opidx == x and \ pack.rightmost(node=True).opidx == y: - pytest.fail("must not find packset with indices {x},{y}" \ - .format(x=x,y=y)) + pytest.fail( + "must not find packset with indices {x},{y}".format( + x=x, y=y)) def assert_packset_contains_pair(self, packset, x, y): for pack in packset.packs: @@ -261,8 +248,9 @@ pack.rightmost(node=True).opidx == y: break else: - pytest.fail("can't find a pack set for indices {x},{y}" \ - .format(x=x,y=y)) + pytest.fail( + "can't find a pack set for indices {x},{y}".format(x=x, y=y)) + def assert_has_memory_ref_at(self, graph, idx): idx -= 1 # label is not in the nodes node = graph.nodes[idx] @@ -278,18 +266,19 @@ self.signed = signed def arg(type='f', size=8, signed=False, datatype='f'): - return FakeInput(type, datatype, size, signed) -class BaseTestVectorize(VecTestHelper): + return FakeInput(type, datatype, size, signed) + +class TestVectorize(VecTestHelper): def test_opcount_filling_store(self): - descr = ArrayDescr(0,8, None, 'F', concrete_type='f') + descr = ArrayDescr(0, 8, None, 'F', concrete_type='f') pack = Pack([Node(ResOperation(rop.RAW_STORE, [0,0,arg('f',4)], descr), 0), Node(ResOperation(rop.RAW_STORE, [0,0,arg('f',4)], descr), 0), ]) assert pack.opcount_filling_vector_register(16, self.cpu.vector_ext) == 2 def test_opcount_filling_guard(self): - descr = ArrayDescr(0,4, None, 'S') + descr = ArrayDescr(0, 4, None, 'S') vec = ResOperation(rop.VEC_LOAD_I, ['a','i', 8, 0], descr=descr) vec.count = 4 pack = Pack([Node(ResOperation(rop.GUARD_TRUE, [vec]), 0), @@ -368,11 +357,8 @@ [] jump() """ - try: - self.schedule(self.parse_loop(ops),1) - py.test.fail("empty loop with no memory references is not vectorizable") - except NotAVectorizeableLoop: - pass + with pytest.raises(NotAVectorizeableLoop): + self.schedule(self.parse_loop(ops), 1) def test_unroll_empty_stays_empty_parameter(self): """ same as test_unroll_empty_stays_empty but with a parameter """ @@ -412,7 +398,7 @@ self.assert_equal(loop, self.parse_loop(opt)) def test_vect_unroll_char(self): - """ a 16 byte vector register can hold 16 bytes thus + """ a 16 byte vector register can hold 16 bytes thus it is unrolled 16 times. (it is the smallest type in the trace) """ ops = """ [p0,i0] @@ -427,7 +413,7 @@ self.assert_unroll_loop_equals(self.parse_loop(ops), self.parse_loop(opt_ops)) def test_unroll_vector_addition(self): - """ a more complex trace doing vector addition (smallest type is float + """ a more complex trace doing vector addition (smallest type is float 8 byte) """ ops = """ [p0,p1,p2,i0] @@ -891,7 +877,7 @@ self.assert_packset_empty(vopt.packset, len(loop.operations), [(6,12), (5,11), (4,10)]) - @pytest.mark.parametrize("descr,packs,packidx", + @pytest.mark.parametrize("descr,packs,packidx", [('char', 0, []), ('float', 2, [(0,(1,3)),(1,(5,7))]), ('', 2, [(0,(1,3)),(1,(5,7))]), @@ -935,12 +921,8 @@ [] jump() """ - try: - self.combine_packset(self.parse_loop(ops),15) - pytest.fail("combine should raise an exception if no pack " - "statements are present") - except NotAVectorizeableLoop: - pass + with pytest.raises(NotAVectorizeableLoop): + self.combine_packset(self.parse_loop(ops), 15) ops = """ [p0,i0] @@ -948,12 +930,8 @@ jump(p0,i0) """ loop = self.parse_loop(ops) - try: - self.combine_packset(loop,15) - pytest.fail("combine should raise an exception if no pack " - "statements are present") - except NotAVectorizeableLoop: - pass + with pytest.raises(NotAVectorizeableLoop): + self.combine_packset(loop, 15) @pytest.mark.parametrize("op,descr,stride", [('int_add','char',1), @@ -1053,17 +1031,17 @@ """ opt=""" [i0, i1, i2, i3, i4] - i11 = int_add(i0, 1) - i12 = int_lt(i11, i1) + i11 = int_add(i0, 1) + i12 = int_lt(i11, i1) guard_true(i12) [i0,i1,i2,i3,i4] - i13 = int_add(i0, 2) - i18 = int_lt(i13, i1) + i13 = int_add(i0, 2) + i18 = int_lt(i13, i1) guard_true(i18) [i11,i1,i2,i3,i4] - i6 = int_mul(i0, 8) - v19[2xi64] = vec_load_i(i2, i6, 1, 0, descr=arraydescr) - v20[2xi64] = vec_load_i(i3, i6, 1, 0, descr=arraydescr) - v21[2xi64] = vec_int_add(v19, v20) - vec_store(i4, i6, v21, 1, 0, descr=arraydescr) + i6 = int_mul(i0, 8) + v19[2xi64] = vec_load_i(i2, i6, 1, 0, descr=arraydescr) + v20[2xi64] = vec_load_i(i3, i6, 1, 0, descr=arraydescr) + v21[2xi64] = vec_int_add(v19, v20) + vec_store(i4, i6, v21, 1, 0, descr=arraydescr) jump(i13, i1, i2, i3, i4) """ loop = self.parse_loop(ops) @@ -1102,11 +1080,8 @@ guard_true(i5) [p0, i0] jump(p0,i1) """ - try: + with pytest.raises(NotAVectorizeableLoop): self.vectorize(self.parse_loop(ops)) - py.test.fail("loop is not vectorizable") - except NotAVectorizeableLoop: - pass def test_constant_expansion(self): ops = """ @@ -1192,32 +1167,32 @@ def test_element_f45_in_guard_failargs(self): trace = self.parse_loop(""" [p36, i28, p9, i37, p14, f34, p12, p38, f35, p39, i40, i41, p42, i43, i44, i21, i4, i0, i18] - f45 = raw_load_f(i21, i44, descr=floatarraydescr) + f45 = raw_load_f(i21, i44, descr=floatarraydescr) guard_not_invalidated() [p38, p12, p9, p14, f45, p39, i37, i44, f35, i40, p42, i43, None, i28, p36, i41] - i46 = int_add(i44, 8) - f47 = raw_load_f(i4, i41, descr=floatarraydescr) - i48 = int_add(i41, 8) + i46 = int_add(i44, 8) + f47 = raw_load_f(i4, i41, descr=floatarraydescr) + i48 = int_add(i41, 8) f49 = float_add(f45, f47) raw_store(i0, i37, f49, descr=floatarraydescr) i50 = int_add(i28, 1) i51 = int_add(i37, 8) - i52 = int_ge(i50, i18) + i52 = int_ge(i50, i18) guard_false(i52) [p38, p12, p9, p14, i48, i46, f47, i51, i50, f45, p39, None, None, None, i40, p42, i43, None, None, p36, None] jump(p36, i50, p9, i51, p14, f45, p12, p38, f47, p39, i40, i48, p42, i43, i46, i21, i4, i0, i18) """) trace_opt = self.parse_loop(""" [p36, i28, p9, i37, p14, f34, p12, p38, f35, p39, i40, i41, p42, i43, i44, i21, i4, i0, i18] guard_not_invalidated() [p36, i28, p9, i37, p14, f34, p12, p38, f35, p39, i40, i41, p42, i43, i44, i21, i4, i0, i18] - i54 = int_add(i28, 2) + i54 = int_add(i28, 2) i638 = int_ge(i54, i18) guard_false(i638) [p36, i28, p9, i37, p14, f34, p12, p38, f35, p39, i40, i41, p42, i43, i44, i21, i4, i0, i18] - v61[2xf64] = vec_load_f(i21, i44, 1, 0, descr=floatarraydescr) - v62[2xf64] = vec_load_f(i4, i41, 1, 0, descr=floatarraydescr) - v63[2xf64] = vec_float_add(v61, v62) - vec_store(i0, i37, v63, 1, 0, descr=floatarraydescr) + v61[2xf64] = vec_load_f(i21, i44, 1, 0, descr=floatarraydescr) + v62[2xf64] = vec_load_f(i4, i41, 1, 0, descr=floatarraydescr) + v63[2xf64] = vec_float_add(v61, v62) + vec_store(i0, i37, v63, 1, 0, descr=floatarraydescr) i637 = int_add(i37, 16) i629 = int_add(i41, 16) - i55 = int_add(i44, 16) + i55 = int_add(i44, 16) f100 = vec_unpack_f(v61, 1, 1) f101 = vec_unpack_f(v62, 1, 1) jump(p36, i637, p9, i629, p14, f100, p12, p38, f101, p39, i40, i54, p42, i43, i55, i21, i4, i0, i18) @@ -1265,8 +1240,8 @@ f3 = float_add(f1, f2) i12 = cast_float_to_singlefloat(f3) raw_store(p2, i4, i12, descr=float32arraydescr) - i5 = int_add(i4, 4) - i186 = int_lt(i5, 100) + i5 = int_add(i4, 4) + i186 = int_lt(i5, 100) guard_true(i186) [] jump(p0,p1,p2,i1,i5) """) @@ -1307,11 +1282,8 @@ guard_false(i13, descr=) [p3, i10, i8, i12, None, p1, None, None] jump(i8, p1, i10, p3, i12, i5, i6) """) - try: + with pytest.raises(NotAVectorizeableLoop): vopt = self.vectorize(trace) - py.test.fail() - except NotAVectorizeableLoop: - pass def test_pass(self): trace = self.parse_loop(""" @@ -1396,7 +1368,3 @@ for op in trace.operations: assert op not in dups dups.add(op) - - -class TestLLtype(BaseTestVectorize, LLtypeMixin): - pass diff -Nru pypy-7.1.1+dfsg/rpython/jit/metainterp/optimizeopt/test/test_virtualstate.py pypy-7.3.1+dfsg/rpython/jit/metainterp/optimizeopt/test/test_virtualstate.py --- pypy-7.1.1+dfsg/rpython/jit/metainterp/optimizeopt/test/test_virtualstate.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/metainterp/optimizeopt/test/test_virtualstate.py 2020-04-10 19:28:41.000000000 +0000 @@ -1,25 +1,23 @@ from __future__ import with_statement import py -from rpython.jit.metainterp.optimizeopt.virtualstate import VirtualStateInfo,\ - VStructStateInfo, LEVEL_CONSTANT,\ - VArrayStateInfo, not_virtual, VirtualState,\ - GenerateGuardState, VirtualStatesCantMatch, VArrayStructStateInfo,\ - VirtualStateConstructor +from rpython.jit.metainterp.optimizeopt.virtualstate import ( + VirtualStateInfo, VStructStateInfo, LEVEL_CONSTANT, VArrayStateInfo, + not_virtual, VirtualState, GenerateGuardState, VirtualStatesCantMatch, + VArrayStructStateInfo, VirtualStateConstructor) from rpython.jit.metainterp.history import ConstInt, ConstPtr, TargetToken -from rpython.jit.metainterp.resoperation import InputArgInt, InputArgRef,\ - InputArgFloat +from rpython.jit.metainterp.resoperation import ( + InputArgInt, InputArgRef, InputArgFloat) from rpython.jit.backend.llgraph.runner import ArrayDescr from rpython.rtyper.lltypesystem import lltype, llmemory from rpython.rtyper import rclass -from rpython.jit.metainterp.optimizeopt.test.test_util import LLtypeMixin, BaseTest, \ - equaloplists -from rpython.jit.metainterp.optimizeopt.intutils import IntBound,\ - ConstIntBound, IntLowerBound, IntUpperBound, IntUnbounded -from rpython.jit.metainterp.history import TreeLoop, JitCellToken -from rpython.jit.metainterp.optimizeopt.test.test_optimizeopt import FakeMetaInterpStaticData +from rpython.jit.metainterp.optimizeopt.test.test_util import ( + LLtypeMixin, BaseTest, equaloplists) +from rpython.jit.metainterp.optimizeopt.intutils import ( + IntBound, ConstIntBound, IntLowerBound, IntUnbounded) +from rpython.jit.metainterp.history import JitCellToken from rpython.jit.metainterp.optimizeopt.optimizer import Optimizer from rpython.jit.metainterp.resoperation import ResOperation, rop -from rpython.jit.metainterp import resume, compile +from rpython.jit.metainterp import compile from rpython.jit.metainterp.optimizeopt import info from rpython.jit.tool import oparser @@ -99,14 +97,14 @@ optimizer = FakeOptimizer(self.cpu) classbox1 = self.cpu.cls_of_box(InputArgRef(self.nodeaddr)) innervalue1 = info.InstancePtrInfo( - known_class=classbox1, is_virtual=True, - descr=self.valuedescr.get_parent_descr()) + known_class=classbox1, is_virtual=True, + descr=self.valuedescr.get_parent_descr()) for field in self.valuedescr.get_parent_descr().get_all_fielddescrs(): innervalue1.setfield(field, None, ConstInt(42)) classbox2 = self.cpu.cls_of_box(InputArgRef(self.myptr3)) innervalue2 = info.InstancePtrInfo( - known_class=classbox2, is_virtual=True, - descr=self.valuedescr3.get_parent_descr()) + known_class=classbox2, is_virtual=True, + descr=self.valuedescr3.get_parent_descr()) for field in self.valuedescr3.get_parent_descr().get_all_fielddescrs(): innervalue2.setfield(field, None, ConstInt(42)) @@ -853,7 +851,6 @@ enable_opts = "intbounds:rewrite:virtualize:string:pure:earlyforce:heap:unroll" def _do_optimize_bridge(self, bridge, call_pure_results, values): - from rpython.jit.metainterp.optimizeopt import optimize_trace from rpython.jit.metainterp.optimizeopt.util import args_dict self.bridge = bridge @@ -861,20 +858,14 @@ if call_pure_results is not None: for k, v in call_pure_results.items(): bridge.call_pure_results[list(k)] = v - metainterp_sd = FakeMetaInterpStaticData(self.cpu) - if hasattr(self, 'vrefinfo'): - metainterp_sd.virtualref_info = self.vrefinfo - if hasattr(self, 'callinfocollection'): - metainterp_sd.callinfocollection = self.callinfocollection - # - trace = oparser.convert_loop_to_trace(bridge, metainterp_sd) + trace = oparser.convert_loop_to_trace(bridge, self.metainterp_sd) runtime_boxes = self.convert_values(bridge.operations[-1].getarglist(), values) data = compile.BridgeCompileData(trace, runtime_boxes, enable_opts=self.enable_opts, inline_short_preamble=True) - info, newops = optimize_trace(metainterp_sd, None, data) + info, newops = data.optimize_trace(self.metainterp_sd, None, {}) if info.final(): bridge.operations = newops bridge.inputargs = info.inputargs diff -Nru pypy-7.1.1+dfsg/rpython/jit/metainterp/optimizeopt/test/test_zdisable_opts.py pypy-7.3.1+dfsg/rpython/jit/metainterp/optimizeopt/test/test_zdisable_opts.py --- pypy-7.1.1+dfsg/rpython/jit/metainterp/optimizeopt/test/test_zdisable_opts.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/metainterp/optimizeopt/test/test_zdisable_opts.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,50 +0,0 @@ - -import py -from rpython.jit.metainterp.optimizeopt.test.test_optimizeopt import OptimizeOptTest -from rpython.jit.metainterp.optimizeopt.test.test_util import LLtypeMixin -from rpython.jit.metainterp.resoperation import rop - -def setup_module(mod): - py.test.skip("purpose unclear") - -allopts = OptimizeOptTest.enable_opts.split(':') -for optnum in range(len(allopts)): - myopts = allopts[:] - del myopts[optnum] - - class TestLLtype(OptimizeOptTest, LLtypeMixin): - enable_opts = ':'.join(myopts) - - def optimize_loop(self, ops, expected, expected_preamble=None, - call_pure_results=None, expected_short=None): - loop = self.parse(ops, postprocess=self.postprocess) - if expected != "crash!": - expected = self.parse(expected) - if expected_preamble: - expected_preamble = self.parse(expected_preamble) - if expected_short: - expected_short = self.parse(expected_short) - - preamble = self.unroll_and_optimize(loop, call_pure_results) - - for op in preamble.operations + loop.operations: - assert op.getopnum() not in (rop.CALL_PURE, - rop.CALL_LOOPINVARIANT, - rop.VIRTUAL_REF_FINISH, - rop.VIRTUAL_REF, - rop.QUASIIMMUT_FIELD, - rop.MARK_OPAQUE_PTR, - rop.RECORD_EXACT_CLASS) - - def raises(self, e, fn, *args): - try: - fn(*args) - except Exception as e: - return e - - opt = allopts[optnum] - exec "TestNo%sLLtype = TestLLtype" % (opt[0].upper() + opt[1:]) - -del TestLLtype # No need to run the last set twice -del TestNoUnrollLLtype # This case is take care of by test_optimizebasic - diff -Nru pypy-7.1.1+dfsg/rpython/jit/metainterp/optimizeopt/unroll.py pypy-7.3.1+dfsg/rpython/jit/metainterp/optimizeopt/unroll.py --- pypy-7.1.1+dfsg/rpython/jit/metainterp/optimizeopt/unroll.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/metainterp/optimizeopt/unroll.py 2020-04-10 19:28:41.000000000 +0000 @@ -10,12 +10,18 @@ from rpython.jit.metainterp.optimizeopt.vstring import StrPtrInfo from rpython.jit.metainterp.optimizeopt.virtualstate import ( VirtualStateConstructor, VirtualStatesCantMatch) +from .util import get_box_replacement from rpython.jit.metainterp.resoperation import rop, ResOperation, GuardResOp from rpython.jit.metainterp import compile from rpython.rlib.debug import debug_print, debug_start, debug_stop,\ have_debug_prints -class UnrollableOptimizer(Optimizer): +class UnrollOptimizer(Optimizer): + def __init__(self, metainterp_sd, jitdriver_sd, optimizations): + Optimizer.__init__(self, metainterp_sd, jitdriver_sd, optimizations) + self.optunroll = OptUnroll() + self.optunroll.optimizer = self + def force_op_from_preamble(self, preamble_op): if isinstance(preamble_op, PreambleOp): if self.optunroll.short_preamble_producer is None: @@ -26,7 +32,7 @@ preamble_op.preamble_op, self) if not preamble_op.op.is_constant(): if preamble_op.invented_name: - op = self.get_box_replacement(op) + op = get_box_replacement(op) self.optunroll.potential_extra_ops[op] = preamble_op return preamble_op.op return preamble_op @@ -44,7 +50,7 @@ # know anything about def setinfo_from_preamble(self, op, preamble_info, exported_infos): - op = self.get_box_replacement(op) + op = get_box_replacement(op) if op.get_forwarded() is not None: return if op.is_constant(): @@ -97,174 +103,121 @@ elif isinstance(preamble_info, info.FloatConstInfo): op.set_forwarded(preamble_info._const) - -class UnrollOptimizer(Optimization): - """Unroll the loop into two iterations. The first one will - become the preamble or entry bridge (don't think there is a - distinction anymore)""" - - short_preamble_producer = None - - def __init__(self, metainterp_sd, jitdriver_sd, optimizations): - self.optimizer = UnrollableOptimizer(metainterp_sd, jitdriver_sd, - optimizations) - self.optimizer.optunroll = self - - def get_virtual_state(self, args): - modifier = VirtualStateConstructor(self.optimizer) - return modifier.get_virtual_state(args) - - def _check_no_forwarding(self, lsts, check_newops=True): - for lst in lsts: - for op in lst: - assert op.get_forwarded() is None - if check_newops: - assert not self.optimizer._newoperations - - def optimize_preamble(self, trace, runtime_boxes, call_pure_results, memo): - info, newops = self.optimizer.propagate_all_forward( + info, newops = self.propagate_all_forward( trace.get_iter(), call_pure_results, flush=False) - exported_state = self.export_state(info.jump_op.getarglist(), + exported_state = self.optunroll.export_state(info.jump_op.getarglist(), info.inputargs, runtime_boxes, memo) exported_state.quasi_immutable_deps = info.quasi_immutable_deps # we need to absolutely make sure that we've cleaned up all # the optimization info - self.optimizer._clean_optimization_info(self.optimizer._newoperations) - return exported_state, self.optimizer._newoperations + self._clean_optimization_info(self._newoperations) + return exported_state, self._newoperations - def optimize_peeled_loop(self, trace, celltoken, state, - call_pure_results, inline_short_preamble=True): + def optimize_peeled_loop(self, trace, celltoken, state, call_pure_results): trace = trace.get_iter() try: - label_args = self.import_state(trace.inputargs, state) + label_args = self.optunroll.import_state(trace.inputargs, state) except VirtualStatesCantMatch: raise InvalidLoop("Cannot import state, virtual states don't match") - self.potential_extra_ops = {} + self.optunroll.potential_extra_ops = {} try: - info, _ = self.optimizer.propagate_all_forward( + info, _ = self.propagate_all_forward( trace, call_pure_results, flush=False) except SpeculativeError: raise InvalidLoop("Speculative heap access would be ill-typed") end_jump = info.jump_op - label_op = ResOperation(rop.LABEL, label_args, - descr=celltoken) + label_op = ResOperation(rop.LABEL, label_args, descr=celltoken) for a in end_jump.getarglist(): - self.optimizer.force_box_for_end_of_preamble( - self.optimizer.get_box_replacement(a)) - current_vs = self.get_virtual_state(end_jump.getarglist()) + self.force_box_for_end_of_preamble(get_box_replacement(a)) + current_vs = self.optunroll.get_virtual_state(end_jump.getarglist()) # pick the vs we want to jump to assert isinstance(celltoken, JitCellToken) - target_virtual_state = self.pick_virtual_state(current_vs, - state.virtual_state, - celltoken.target_tokens) + target_virtual_state = self.optunroll.pick_virtual_state( + current_vs, state.virtual_state, celltoken.target_tokens) # force the boxes for virtual state to match try: args = target_virtual_state.make_inputargs( - [self.get_box_replacement(x) for x in end_jump.getarglist()], - self.optimizer, force_boxes=True) + [get_box_replacement(x) for x in end_jump.getarglist()], + self, force_boxes=True) for arg in args: if arg is not None: - self.optimizer.force_box(arg) + self.force_box(arg) except VirtualStatesCantMatch: raise InvalidLoop("Virtual states did not match " "after picking the virtual state, when forcing" " boxes") - extra_same_as = self.short_preamble_producer.extra_same_as[:] - target_token = self.finalize_short_preamble(label_op, + extra_same_as = self.optunroll.short_preamble_producer.extra_same_as[:] + target_token = self.optunroll.finalize_short_preamble(label_op, state.virtual_state) label_op.setdescr(target_token) - if not inline_short_preamble: - self.jump_to_preamble(celltoken, end_jump, info) - return (UnrollInfo(target_token, label_op, extra_same_as, - self.optimizer.quasi_immutable_deps), - self.optimizer._newoperations) - try: - new_virtual_state = self.jump_to_existing_trace( - end_jump, label_op, state.runtime_boxes, force_boxes=False) + new_virtual_state = self.optunroll.jump_to_existing_trace( + end_jump, label_op, state.runtime_boxes, force_boxes=False) except InvalidLoop: # inlining short preamble failed, jump to preamble - self.jump_to_preamble(celltoken, end_jump, info) + self.jump_to_preamble(celltoken, end_jump) return (UnrollInfo(target_token, label_op, extra_same_as, - self.optimizer.quasi_immutable_deps), - self.optimizer._newoperations) + self.quasi_immutable_deps), + self._newoperations) if new_virtual_state is not None: # Attempt to force virtual boxes in order to avoid jumping # to the preamble. try: - new_virtual_state = self.jump_to_existing_trace( - end_jump, label_op, state.runtime_boxes, force_boxes=True) + new_virtual_state = self.optunroll.jump_to_existing_trace( + end_jump, label_op, state.runtime_boxes, force_boxes=True) except InvalidLoop: pass if new_virtual_state is not None: - self.jump_to_preamble(celltoken, end_jump, info) + self.jump_to_preamble(celltoken, end_jump) return (UnrollInfo(target_token, label_op, extra_same_as, - self.optimizer.quasi_immutable_deps), - self.optimizer._newoperations) + self.quasi_immutable_deps), + self._newoperations) - self.disable_retracing_if_max_retrace_guards( - self.optimizer._newoperations, target_token) + self.optunroll.disable_retracing_if_max_retrace_guards( + self._newoperations, target_token) return (UnrollInfo(target_token, label_op, extra_same_as, - self.optimizer.quasi_immutable_deps), - self.optimizer._newoperations) - - def disable_retracing_if_max_retrace_guards(self, ops, target_token): - maxguards = self.optimizer.metainterp_sd.warmrunnerdesc.memory_manager.max_retrace_guards - count = 0 - for op in ops: - if op.is_guard(): - count += 1 - if count > maxguards: - assert isinstance(target_token, TargetToken) - target_token.targeting_jitcell_token.retraced_count = sys.maxint - - def pick_virtual_state(self, my_vs, label_vs, target_tokens): - if target_tokens is None: - return label_vs # for tests - for token in target_tokens: - if token.virtual_state is None: - continue - if token.virtual_state.generalization_of(my_vs, self.optimizer): - return token.virtual_state - return label_vs + self.quasi_immutable_deps), + self._newoperations) def optimize_bridge(self, trace, runtime_boxes, call_pure_results, inline_short_preamble, box_names_memo, resumestorage): from rpython.jit.metainterp.optimizeopt.bridgeopt import deserialize_optimizer_knowledge frontend_inputargs = trace.inputargs trace = trace.get_iter() - self._check_no_forwarding([trace.inputargs]) + self.optunroll._check_no_forwarding([trace.inputargs]) if resumestorage: - deserialize_optimizer_knowledge(self.optimizer, + deserialize_optimizer_knowledge(self, resumestorage, frontend_inputargs, trace.inputargs) - info, ops = self.optimizer.propagate_all_forward(trace, + info, ops = self.propagate_all_forward(trace, call_pure_results, False) jump_op = info.jump_op cell_token = jump_op.getdescr() assert isinstance(cell_token, JitCellToken) if not inline_short_preamble or len(cell_token.target_tokens) == 1: - return self.jump_to_preamble(cell_token, jump_op, info) + self.jump_to_preamble(cell_token, jump_op) + return info, self._newoperations[:] # force all the information that does not go to the short # preamble at all - self.optimizer.flush() + self.flush() for a in jump_op.getarglist(): - self.optimizer.force_box_for_end_of_preamble(a) + self.force_box_for_end_of_preamble(a) try: - vs = self.jump_to_existing_trace(jump_op, None, runtime_boxes, + vs = self.optunroll.jump_to_existing_trace(jump_op, None, runtime_boxes, force_boxes=False) except InvalidLoop: - return self.jump_to_preamble(cell_token, jump_op, info) + self.jump_to_preamble(cell_token, jump_op) + return info, self._newoperations[:] if vs is None: - return info, self.optimizer._newoperations[:] - warmrunnerdescr = self.optimizer.metainterp_sd.warmrunnerdesc + return info, self._newoperations[:] + warmrunnerdescr = self.metainterp_sd.warmrunnerdesc limit = warmrunnerdescr.memory_manager.retrace_limit if cell_token.retraced_count < limit: cell_token.retraced_count += 1 @@ -272,20 +225,67 @@ else: # Try forcing boxes to avoid jumping to the preamble try: - vs = self.jump_to_existing_trace(jump_op, None, runtime_boxes, + vs = self.optunroll.jump_to_existing_trace(jump_op, None, runtime_boxes, force_boxes=True) except InvalidLoop: pass if vs is None: - return info, self.optimizer._newoperations[:] + return info, self._newoperations[:] debug_print("Retrace count reached, jumping to preamble") - return self.jump_to_preamble(cell_token, jump_op, info) - exported_state = self.export_state(info.jump_op.getarglist(), + self.jump_to_preamble(cell_token, jump_op) + return info, self._newoperations[:] + exported_state = self.optunroll.export_state(info.jump_op.getarglist(), info.inputargs, runtime_boxes, box_names_memo) - exported_state.quasi_immutable_deps = self.optimizer.quasi_immutable_deps - self.optimizer._clean_optimization_info(self.optimizer._newoperations) - return exported_state, self.optimizer._newoperations + exported_state.quasi_immutable_deps = self.quasi_immutable_deps + self._clean_optimization_info(self._newoperations) + return exported_state, self._newoperations + + def jump_to_preamble(self, cell_token, jump_op): + assert cell_token.target_tokens[0].virtual_state is None + jump_op = jump_op.copy_and_change( + rop.JUMP, descr=cell_token.target_tokens[0]) + self.send_extra_operation(jump_op) + + +class OptUnroll(Optimization): + """Unroll the loop into two iterations. The first one will + become the preamble or entry bridge (don't think there is a + distinction anymore)""" + + short_preamble_producer = None + + def get_virtual_state(self, args): + modifier = VirtualStateConstructor(self.optimizer) + return modifier.get_virtual_state(args) + + def _check_no_forwarding(self, lsts, check_newops=True): + for lst in lsts: + for op in lst: + assert op.get_forwarded() is None + if check_newops: + assert not self.optimizer._newoperations + + + def disable_retracing_if_max_retrace_guards(self, ops, target_token): + maxguards = self.optimizer.metainterp_sd.warmrunnerdesc.memory_manager.max_retrace_guards + count = 0 + for op in ops: + if op.is_guard(): + count += 1 + if count > maxguards: + assert isinstance(target_token, TargetToken) + target_token.targeting_jitcell_token.retraced_count = sys.maxint + + def pick_virtual_state(self, my_vs, label_vs, target_tokens): + if target_tokens is None: + return label_vs # for tests + for token in target_tokens: + if token.virtual_state is None: + continue + if token.virtual_state.generalization_of(my_vs, self.optimizer): + return token.virtual_state + return label_vs def finalize_short_preamble(self, label_op, virtual_state): sb = self.short_preamble_producer @@ -306,19 +306,12 @@ label_op.initarglist(label_op.getarglist() + sb.used_boxes) return target_token - def jump_to_preamble(self, cell_token, jump_op, info): - assert cell_token.target_tokens[0].virtual_state is None - jump_op = jump_op.copy_and_change(rop.JUMP, - descr=cell_token.target_tokens[0]) - self.optimizer.send_extra_operation(jump_op) - return info, self.optimizer._newoperations[:] - def jump_to_existing_trace(self, jump_op, label_op, runtime_boxes, force_boxes=False): jitcelltoken = jump_op.getdescr() assert isinstance(jitcelltoken, JitCellToken) virtual_state = self.get_virtual_state(jump_op.getarglist()) - args = [self.get_box_replacement(op) for op in jump_op.getarglist()] + args = [get_box_replacement(op) for op in jump_op.getarglist()] for target_token in jitcelltoken.target_tokens: target_virtual_state = target_token.virtual_state if target_virtual_state is None: @@ -332,7 +325,7 @@ if isinstance(guard, GuardResOp): guard.rd_resume_position = patchguardop.rd_resume_position guard.setdescr(compile.ResumeAtPositionDescr()) - self.send_extra_operation(guard) + self.optimizer.send_extra_operation(guard) except VirtualStatesCantMatch: continue @@ -348,20 +341,14 @@ continue short_preamble = target_token.short_preamble - try: - extra = self.inline_short_preamble(args + virtuals, args, - short_preamble, self.optimizer.patchguardop, - target_token, label_op) - except KeyError: - # SHOULD NOT OCCUR BUT DOES: WHY?? issue #2185 - self.optimizer.metainterp_sd.logger_ops.log_short_preamble([], - short_preamble, {}) - raise - - self.send_extra_operation(jump_op.copy_and_change(rop.JUMP, + extra = self.inline_short_preamble(args + virtuals, args, + short_preamble, self.optimizer.patchguardop, + target_token, label_op) + self.optimizer.send_extra_operation(jump_op.copy_and_change(rop.JUMP, args=args + extra, descr=target_token)) return None # explicit because the return can be non-None + return virtual_state def _map_args(self, mapping, arglist): @@ -418,13 +405,13 @@ # force all of them except the virtuals for arg in (args_no_virtuals + self._map_args(mapping, short_jump_args)): - self.optimizer.force_box(self.get_box_replacement(arg)) + self.optimizer.force_box(get_box_replacement(arg)) self.optimizer.flush() # done unless "short" has grown again if i == len(short) - 1: break - return [self.get_box_replacement(box) + return [get_box_replacement(box) for box in self._map_args(mapping, short_jump_args)] def _expand_info(self, arg, infos): @@ -453,7 +440,7 @@ for a in original_label_args] self.optimizer.flush() virtual_state = self.get_virtual_state(end_args) - end_args = [self.get_box_replacement(arg) for arg in end_args] + end_args = [get_box_replacement(arg) for arg in end_args] infos = {} for arg in end_args: self._expand_info(arg, infos) @@ -477,8 +464,7 @@ def import_state(self, targetargs, exported_state): # the mapping between input args (from old label) and what we need # to actually emit. Update the info - assert (len(exported_state.next_iteration_args) == - len(targetargs)) + assert len(exported_state.next_iteration_args) == len(targetargs) for i, target in enumerate(exported_state.next_iteration_args): source = targetargs[i] assert source is not target diff -Nru pypy-7.1.1+dfsg/rpython/jit/metainterp/optimizeopt/util.py pypy-7.3.1+dfsg/rpython/jit/metainterp/optimizeopt/util.py --- pypy-7.1.1+dfsg/rpython/jit/metainterp/optimizeopt/util.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/metainterp/optimizeopt/util.py 2020-04-10 19:28:41.000000000 +0000 @@ -72,6 +72,10 @@ # unused, should I leave it or kill it? quicksort(lst, 0, len(lst)-1) +def get_box_replacement(op): + if op is None: + return op + return op.get_box_replacement() # ____________________________________________________________ diff -Nru pypy-7.1.1+dfsg/rpython/jit/metainterp/optimizeopt/virtualize.py pypy-7.3.1+dfsg/rpython/jit/metainterp/optimizeopt/virtualize.py --- pypy-7.1.1+dfsg/rpython/jit/metainterp/optimizeopt/virtualize.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/metainterp/optimizeopt/virtualize.py 2020-04-10 19:28:41.000000000 +0000 @@ -3,9 +3,10 @@ from rpython.jit.metainterp.history import CONST_NULL from rpython.jit.metainterp.optimizeopt import info, optimizer from rpython.jit.metainterp.optimizeopt.optimizer import REMOVED -from rpython.jit.metainterp.optimizeopt.util import make_dispatcher_method - +from rpython.jit.metainterp.optimizeopt.util import ( + make_dispatcher_method, get_box_replacement) from rpython.jit.metainterp.optimizeopt.rawbuffer import InvalidRawOperation +from .info import getrawptrinfo, getptrinfo from rpython.jit.metainterp.resoperation import rop, ResOperation @@ -27,7 +28,7 @@ assert clear opinfo = info.ArrayStructInfo(arraydescr, size, is_virtual=True) else: - const = self.new_const_item(arraydescr) + const = self.optimizer.new_const_item(arraydescr) opinfo = info.ArrayPtrInfo(arraydescr, const, size, clear, is_virtual=True) # Replace 'source_op' with a version in which the length is @@ -100,7 +101,7 @@ effectinfo = op.getdescr().get_extra_info() oopspecindex = effectinfo.oopspecindex if oopspecindex == EffectInfo.OS_JIT_FORCE_VIRTUALIZABLE: - opinfo = self.getptrinfo(op.getarg(2)) + opinfo = getptrinfo(op.getarg(2)) if opinfo and opinfo.is_virtual(): return return self.emit(op) @@ -160,17 +161,17 @@ # was already forced). def _optimize_JIT_FORCE_VIRTUAL(self, op): - vref = self.getptrinfo(op.getarg(1)) + vref = getptrinfo(op.getarg(1)) vrefinfo = self.optimizer.metainterp_sd.virtualref_info if vref and vref.is_virtual(): tokenop = vref.getfield(vrefinfo.descr_virtual_token, None) if tokenop is None: return False - tokeninfo = self.getptrinfo(tokenop) + tokeninfo = getptrinfo(tokenop) if (tokeninfo is not None and tokeninfo.is_constant() and not tokeninfo.is_nonnull()): forcedop = vref.getfield(vrefinfo.descr_forced, None) - forcedinfo = self.getptrinfo(forcedop) + forcedinfo = getptrinfo(forcedop) if forcedinfo is not None and not forcedinfo.is_null(): self.make_equal_to(op, forcedop) self.last_emitted_operation = REMOVED @@ -178,7 +179,7 @@ return False def optimize_GETFIELD_GC_I(self, op): - opinfo = self.getptrinfo(op.getarg(0)) + opinfo = getptrinfo(op.getarg(0)) if opinfo and opinfo.is_virtual(): fieldop = opinfo.getfield(op.getdescr()) if fieldop is None: @@ -192,10 +193,10 @@ def optimize_SETFIELD_GC(self, op): struct = op.getarg(0) - opinfo = self.getptrinfo(struct) + opinfo = getptrinfo(struct) if opinfo is not None and opinfo.is_virtual(): opinfo.setfield(op.getdescr(), struct, - self.get_box_replacement(op.getarg(1))) + get_box_replacement(op.getarg(1))) else: self.make_nonnull(struct) return self.emit(op) @@ -229,7 +230,7 @@ return self.do_RAW_FREE(op) elif effectinfo.oopspecindex == EffectInfo.OS_JIT_FORCE_VIRTUALIZABLE: # we might end up having CALL here instead of COND_CALL - info = self.getptrinfo(op.getarg(1)) + info = getptrinfo(op.getarg(1)) if info and info.is_virtual(): return else: @@ -245,13 +246,13 @@ self.last_emitted_operation = REMOVED def do_RAW_FREE(self, op): - opinfo = self.getrawptrinfo(op.getarg(1)) + opinfo = getrawptrinfo(op.getarg(1)) if opinfo and opinfo.is_virtual(): return return self.emit(op) def optimize_INT_ADD(self, op): - opinfo = self.getrawptrinfo(op.getarg(0), create=False) + opinfo = getrawptrinfo(op.getarg(0)) offsetbox = self.get_constant_box(op.getarg(1)) if opinfo and opinfo.is_virtual() and offsetbox is not None: offset = offsetbox.getint() @@ -264,7 +265,7 @@ return self.emit(op) def optimize_ARRAYLEN_GC(self, op): - opinfo = self.getptrinfo(op.getarg(0)) + opinfo = getptrinfo(op.getarg(0)) if opinfo and opinfo.is_virtual(): self.make_constant_int(op, opinfo.getlength()) else: @@ -272,7 +273,7 @@ return self.emit(op) def optimize_GETARRAYITEM_GC_I(self, op): - opinfo = self.getptrinfo(op.getarg(0)) + opinfo = getptrinfo(op.getarg(0)) if opinfo and opinfo.is_virtual(): indexbox = self.get_constant_box(op.getarg(1)) if indexbox is not None: @@ -294,13 +295,13 @@ optimize_GETARRAYITEM_GC_PURE_F = optimize_GETARRAYITEM_GC_I def optimize_SETARRAYITEM_GC(self, op): - opinfo = self.getptrinfo(op.getarg(0)) + opinfo = getptrinfo(op.getarg(0)) if opinfo and opinfo.is_virtual(): indexbox = self.get_constant_box(op.getarg(1)) if indexbox is not None: opinfo.setitem(op.getdescr(), indexbox.getint(), - self.get_box_replacement(op.getarg(0)), - self.get_box_replacement(op.getarg(2))) + get_box_replacement(op.getarg(0)), + get_box_replacement(op.getarg(2))) return self.make_nonnull(op.getarg(0)) return self.emit(op) @@ -314,7 +315,7 @@ return offset, itemsize, descr def optimize_GETARRAYITEM_RAW_I(self, op): - opinfo = self.getrawptrinfo(op.getarg(0)) + opinfo = getrawptrinfo(op.getarg(0)) if opinfo and opinfo.is_virtual(): indexbox = self.get_constant_box(op.getarg(1)) if indexbox is not None: @@ -332,12 +333,12 @@ optimize_GETARRAYITEM_RAW_F = optimize_GETARRAYITEM_RAW_I def optimize_SETARRAYITEM_RAW(self, op): - opinfo = self.getrawptrinfo(op.getarg(0)) + opinfo = getrawptrinfo(op.getarg(0)) if opinfo and opinfo.is_virtual(): indexbox = self.get_constant_box(op.getarg(1)) if indexbox is not None: offset, itemsize, descr = self._unpack_arrayitem_raw_op(op, indexbox) - itemop = self.get_box_replacement(op.getarg(2)) + itemop = get_box_replacement(op.getarg(2)) try: opinfo.setitem_raw(offset, itemsize, descr, itemop) return @@ -354,7 +355,7 @@ return offset, itemsize, descr def optimize_RAW_LOAD_I(self, op): - opinfo = self.getrawptrinfo(op.getarg(0)) + opinfo = getrawptrinfo(op.getarg(0)) if opinfo and opinfo.is_virtual(): offsetbox = self.get_constant_box(op.getarg(1)) if offsetbox is not None: @@ -370,7 +371,7 @@ optimize_RAW_LOAD_F = optimize_RAW_LOAD_I def optimize_RAW_STORE(self, op): - opinfo = self.getrawptrinfo(op.getarg(0)) + opinfo = getrawptrinfo(op.getarg(0)) if opinfo and opinfo.is_virtual(): offsetbox = self.get_constant_box(op.getarg(1)) if offsetbox is not None: @@ -383,7 +384,7 @@ return self.emit(op) def optimize_GETINTERIORFIELD_GC_I(self, op): - opinfo = self.getptrinfo(op.getarg(0)) + opinfo = getptrinfo(op.getarg(0)) if opinfo and opinfo.is_virtual(): indexbox = self.get_constant_box(op.getarg(1)) if indexbox is not None: @@ -392,7 +393,7 @@ if fld is None: raise Exception("I think this is illegal") xxx - fieldvalue = self.new_const(descr) + fieldvalue = self.optimizer.new_const(descr) self.make_equal_to(op, fld) return self.make_nonnull(op.getarg(0)) @@ -401,13 +402,13 @@ optimize_GETINTERIORFIELD_GC_F = optimize_GETINTERIORFIELD_GC_I def optimize_SETINTERIORFIELD_GC(self, op): - opinfo = self.getptrinfo(op.getarg(0)) + opinfo = getptrinfo(op.getarg(0)) if opinfo and opinfo.is_virtual(): indexbox = self.get_constant_box(op.getarg(1)) if indexbox is not None: opinfo.setinteriorfield_virtual(indexbox.getint(), op.getdescr(), - self.get_box_replacement(op.getarg(2))) + get_box_replacement(op.getarg(2))) return self.make_nonnull(op.getarg(0)) return self.emit(op) diff -Nru pypy-7.1.1+dfsg/rpython/jit/metainterp/optimizeopt/virtualstate.py pypy-7.3.1+dfsg/rpython/jit/metainterp/optimizeopt/virtualstate.py --- pypy-7.1.1+dfsg/rpython/jit/metainterp/optimizeopt/virtualstate.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/metainterp/optimizeopt/virtualstate.py 2020-04-10 19:28:41.000000000 +0000 @@ -6,6 +6,8 @@ MININT, MAXINT, IntBound, IntLowerBound from rpython.jit.metainterp.resoperation import rop, ResOperation, \ InputArgInt, InputArgRef, InputArgFloat +from .info import getptrinfo +from .util import get_box_replacement from rpython.rlib.debug import debug_print LEVEL_UNKNOWN = '\x00' @@ -144,7 +146,7 @@ assert len(self.fielddescrs) == len(self.fieldstate) assert len(other.fielddescrs) == len(other.fieldstate) if runtime_box is not None: - opinfo = state.optimizer.getptrinfo(box) + opinfo = getptrinfo(box) assert opinfo.is_virtual() assert isinstance(opinfo, AbstractStructPtrInfo) else: @@ -178,8 +180,8 @@ raise NotImplementedError def enum_forced_boxes(self, boxes, box, optimizer, force_boxes=False): - box = optimizer.get_box_replacement(box) - info = optimizer.getptrinfo(box) + box = get_box_replacement(box) + info = getptrinfo(box) if info is None or not info.is_virtual(): raise VirtualStatesCantMatch() else: @@ -247,7 +249,7 @@ fieldbox_runtime = None for i in range(len(self.fieldstate)): if runtime_box is not None: - opinfo = state.optimizer.getptrinfo(box) + opinfo = getptrinfo(box) assert isinstance(opinfo, ArrayPtrInfo) fieldbox = opinfo._items[i] fieldbox_runtime = state.get_runtime_item(runtime_box, @@ -259,8 +261,8 @@ fieldbox, fieldbox_runtime, state) def enum_forced_boxes(self, boxes, box, optimizer, force_boxes=False): - box = optimizer.get_box_replacement(box) - info = optimizer.getptrinfo(box) + box = get_box_replacement(box) + info = getptrinfo(box) if info is None or not info.is_virtual(): raise VirtualStatesCantMatch() if len(self.fieldstate) > info.getlength(): @@ -304,7 +306,7 @@ fieldbox = None fieldbox_runtime = None if box is not None: - opinfo = state.optimizer.getptrinfo(box) + opinfo = getptrinfo(box) assert isinstance(opinfo, ArrayPtrInfo) else: opinfo = None @@ -329,7 +331,7 @@ s.enum(virtual_state) def enum_forced_boxes(self, boxes, box, optimizer, force_boxes=False): - opinfo = optimizer.getptrinfo(box) + opinfo = getptrinfo(box) if not isinstance(opinfo, ArrayStructInfo): raise VirtualStatesCantMatch if not opinfo.is_virtual(): @@ -411,15 +413,15 @@ if self.level == LEVEL_CONSTANT: return assert 0 <= self.position_in_notvirtuals - if optimizer is not None: - box = optimizer.get_box_replacement(box) - if box.type == 'r': - info = optimizer.getptrinfo(box) - if info and info.is_virtual(): - if force_boxes: - info.force_box(box, optimizer) - else: - raise VirtualStatesCantMatch + assert optimizer is not None + box = get_box_replacement(box) + if box.type == 'r': + info = getptrinfo(box) + if info and info.is_virtual(): + if force_boxes: + info.force_box(box, optimizer) + else: + raise VirtualStatesCantMatch boxes[self.position_in_notvirtuals] = box def _enum(self, virtual_state): @@ -701,24 +703,24 @@ def already_seen_virtual(self, keybox): return keybox in self.fieldboxes - def create_state_or_none(self, box, opt): + def create_state_or_none(self, box): if box is None: return None - return self.create_state(box, opt) + return self.create_state(box) - def create_state(self, box, opt): - box = opt.get_box_replacement(box) + def create_state(self, box): + box = get_box_replacement(box) try: return self.info[box] except KeyError: pass if box.type == 'r': - info = opt.getptrinfo(box) + info = getptrinfo(box) if info is not None and info.is_virtual(): result = info.visitor_dispatch_virtual_type(self) self.info[box] = result - info.visitor_walk_recursive(box, self, opt) - result.fieldstate = [self.create_state_or_none(b, opt) + info.visitor_walk_recursive(box, self) + result.fieldstate = [self.create_state_or_none(b) for b in self.fieldboxes[box]] else: result = self.visit_not_virtual(box) @@ -731,14 +733,10 @@ return result def get_virtual_state(self, jump_args): - if self.optimizer.optearlyforce: - opt = self.optimizer.optearlyforce - else: - opt = self.optimizer state = [] self.info = {} for box in jump_args: - state.append(self.create_state(box, opt)) + state.append(self.create_state(box)) return VirtualState(state) def visit_not_virtual(self, box): diff -Nru pypy-7.1.1+dfsg/rpython/jit/metainterp/optimizeopt/vstring.py pypy-7.3.1+dfsg/rpython/jit/metainterp/optimizeopt/vstring.py --- pypy-7.1.1+dfsg/rpython/jit/metainterp/optimizeopt/vstring.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/metainterp/optimizeopt/vstring.py 2020-04-10 19:28:41.000000000 +0000 @@ -4,9 +4,10 @@ DONT_CHANGE, CONST_NULL) from rpython.jit.metainterp.optimizeopt.optimizer import ( CONST_0, CONST_1, REMOVED, Optimization) -from rpython.jit.metainterp.optimizeopt.util import make_dispatcher_method +from rpython.jit.metainterp.optimizeopt.util import ( + make_dispatcher_method, get_box_replacement) from rpython.jit.metainterp.resoperation import rop, ResOperation -from rpython.jit.metainterp.optimizeopt import info +from .info import AbstractVirtualPtrInfo, getptrinfo from rpython.rlib.objectmodel import specialize, we_are_translated from rpython.rlib.unroll import unrolling_iterable from rpython.rtyper import annlowlevel @@ -46,7 +47,7 @@ # ____________________________________________________________ -class StrPtrInfo(info.AbstractVirtualPtrInfo): +class StrPtrInfo(AbstractVirtualPtrInfo): #_attrs_ = ('length', 'lenbound', 'lgtop', 'mode', '_cached_vinfo', '_is_virtual') lenbound = None @@ -69,7 +70,7 @@ return self.lenbound @specialize.arg(2) - def get_constant_string_spec(self, string_optimizer, mode): + def get_constant_string_spec(self, optstring, mode): return None # can't be constant def force_box(self, op, optforce): @@ -79,13 +80,13 @@ s = self.get_constant_string_spec(optforce, mode_string) if s is not None: c_s = get_const_ptr_for_string(s) - optforce.get_box_replacement(op).set_forwarded(c_s) + get_box_replacement(op).set_forwarded(c_s) return c_s else: s = self.get_constant_string_spec(optforce, mode_unicode) if s is not None: c_s = get_const_ptr_for_unicode(s) - optforce.get_box_replacement(op).set_forwarded(c_s) + get_box_replacement(op).set_forwarded(c_s) return c_s self._is_virtual = False lengthbox = self.getstrlen(op, optforce.optimizer.optstring, self.mode) @@ -93,20 +94,20 @@ if not we_are_translated(): newop.name = 'FORCE' optforce.emit_extra(newop) - newop = optforce.getlastop() + newop = optforce.optimizer.getlastop() newop.set_forwarded(self) - op = optforce.get_box_replacement(op) + op = get_box_replacement(op) op.set_forwarded(newop) optstring = optforce.optimizer.optstring self.initialize_forced_string(op, optstring, op, CONST_0, self.mode) return newop - def initialize_forced_string(self, op, string_optimizer, targetbox, + def initialize_forced_string(self, op, optstring, targetbox, offsetbox, mode): - return self.string_copy_parts(op, string_optimizer, targetbox, + return self.string_copy_parts(op, optstring, targetbox, offsetbox, mode) - def getstrlen(self, op, string_optimizer, mode): + def getstrlen(self, op, optstring, mode): assert op is not None if self.lgtop is not None: return self.lgtop @@ -114,11 +115,11 @@ lengthop = ResOperation(mode.STRLEN, [op]) lengthop.set_forwarded(self.getlenbound(mode)) self.lgtop = lengthop - string_optimizer.emit_extra(lengthop) + optstring.emit_extra(lengthop) return lengthop def make_guards(self, op, short, optimizer): - info.AbstractVirtualPtrInfo.make_guards(self, op, short, optimizer) + AbstractVirtualPtrInfo.make_guards(self, op, short, optimizer) if (self.lenbound and self.lenbound.has_lower and self.lenbound.lower >= 1): if self.mode is mode_string: @@ -129,14 +130,14 @@ short.append(lenop) self.lenbound.make_guards(lenop, short, optimizer) - def string_copy_parts(self, op, string_optimizer, targetbox, offsetbox, + def string_copy_parts(self, op, optstring, targetbox, offsetbox, mode): # Copies the pointer-to-string 'self' into the target string # given by 'targetbox', at the specified offset. Returns the offset # at the end of the copy. - lengthbox = self.getstrlen(op, string_optimizer, mode) - srcbox = self.force_box(op, string_optimizer) - return copy_str_content(string_optimizer, srcbox, targetbox, + lengthbox = self.getstrlen(op, optstring, mode) + srcbox = self.force_box(op, optstring) + return copy_str_content(optstring, srcbox, targetbox, CONST_0, offsetbox, lengthbox, mode) class VStringPlainInfo(StrPtrInfo): @@ -168,7 +169,7 @@ def is_virtual(self): return self._is_virtual - def getstrlen(self, op, string_optimizer, mode): + def getstrlen(self, op, optstring, mode): assert op is not None if self.lgtop is None: self.lgtop = ConstInt(len(self._chars)) @@ -182,16 +183,16 @@ return mode.emptystr.join([mode.chr(c.getint()) for c in self._chars]) - def string_copy_parts(self, op, string_optimizer, targetbox, offsetbox, + def string_copy_parts(self, op, optstring, targetbox, offsetbox, mode): if not self.is_virtual(): - return StrPtrInfo.string_copy_parts(self, op, string_optimizer, + return StrPtrInfo.string_copy_parts(self, op, optstring, targetbox, offsetbox, mode) else: - return self.initialize_forced_string(op, string_optimizer, + return self.initialize_forced_string(op, optstring, targetbox, offsetbox, mode) - def initialize_forced_string(self, op, string_optimizer, targetbox, + def initialize_forced_string(self, op, optstring, targetbox, offsetbox, mode): for i in range(len(self._chars)): assert not isinstance(targetbox, Const) # ConstPtr never makes sense @@ -200,11 +201,11 @@ op = ResOperation(mode.STRSETITEM, [targetbox, offsetbox, charbox]) - string_optimizer.emit_extra(op) - offsetbox = _int_add(string_optimizer, offsetbox, CONST_1) + optstring.emit_extra(op) + offsetbox = _int_add(optstring, offsetbox, CONST_1) return offsetbox - def _visitor_walk_recursive(self, instbox, visitor, optimizer): + def _visitor_walk_recursive(self, instbox, visitor): visitor.register_virtual_fields(instbox, self._chars) @specialize.argtype(1) @@ -227,18 +228,18 @@ def is_virtual(self): return self._is_virtual - def string_copy_parts(self, op, string_optimizer, targetbox, offsetbox, + def string_copy_parts(self, op, optstring, targetbox, offsetbox, mode): - return copy_str_content(string_optimizer, self.s, targetbox, + return copy_str_content(optstring, self.s, targetbox, self.start, offsetbox, self.lgtop, mode) @specialize.arg(2) - def get_constant_string_spec(self, string_optimizer, mode): - vstart = string_optimizer.getintbound(self.start) - vlength = string_optimizer.getintbound(self.lgtop) + def get_constant_string_spec(self, optstring, mode): + vstart = optstring.getintbound(self.start) + vlength = optstring.getintbound(self.lgtop) if vstart.is_constant() and vlength.is_constant(): - vstr = string_optimizer.getptrinfo(self.s) - s1 = vstr.get_constant_string_spec(string_optimizer, mode) + vstr = getptrinfo(self.s) + s1 = vstr.get_constant_string_spec(optstring, mode) if s1 is None: return None start = vstart.getint() @@ -248,16 +249,16 @@ return s1[start: start + length] return None - def getstrlen(self, op, string_optimizer, mode): + def getstrlen(self, op, optstring, mode): assert op is not None return self.lgtop - def _visitor_walk_recursive(self, instbox, visitor, optimizer): + def _visitor_walk_recursive(self, instbox, visitor): boxes = [self.s, self.start, self.lgtop] visitor.register_virtual_fields(instbox, boxes) - opinfo = optimizer.getptrinfo(self.s) + opinfo = getptrinfo(self.s) if opinfo and opinfo.is_virtual(): - opinfo.visitor_walk_recursive(self.s, visitor, optimizer) + opinfo.visitor_walk_recursive(self.s, visitor) @specialize.argtype(1) def visitor_dispatch_virtual_type(self, visitor): @@ -278,68 +279,68 @@ def is_virtual(self): return self._is_virtual - def getstrlen(self, op, string_optimizer, mode): + def getstrlen(self, op, optstring, mode): assert op is not None if self.lgtop is not None: return self.lgtop - lefti = string_optimizer.getptrinfo(self.vleft) - len1box = lefti.getstrlen(self.vleft, string_optimizer, mode) + lefti = getptrinfo(self.vleft) + len1box = lefti.getstrlen(self.vleft, optstring, mode) if len1box is None: return None - righti = string_optimizer.getptrinfo(self.vright) - len2box = righti.getstrlen(self.vright, string_optimizer, mode) + righti = getptrinfo(self.vright) + len2box = righti.getstrlen(self.vright, optstring, mode) if len2box is None: return None - self.lgtop = _int_add(string_optimizer, len1box, len2box) - # ^^^ may still be None, if string_optimizer is None + self.lgtop = _int_add(optstring, len1box, len2box) + # ^^^ may still be None, if optstring is None return self.lgtop @specialize.arg(2) - def get_constant_string_spec(self, string_optimizer, mode): - ileft = string_optimizer.getptrinfo(self.vleft) - s1 = ileft.get_constant_string_spec(string_optimizer, mode) + def get_constant_string_spec(self, optstring, mode): + ileft = getptrinfo(self.vleft) + s1 = ileft.get_constant_string_spec(optstring, mode) if s1 is None: return None - iright = string_optimizer.getptrinfo(self.vright) - s2 = iright.get_constant_string_spec(string_optimizer, mode) + iright = getptrinfo(self.vright) + s2 = iright.get_constant_string_spec(optstring, mode) if s2 is None: return None return s1 + s2 - def string_copy_parts(self, op, string_optimizer, targetbox, offsetbox, + def string_copy_parts(self, op, optstring, targetbox, offsetbox, mode): - lefti = string_optimizer.getptrinfo(self.vleft) - offsetbox = lefti.string_copy_parts(self.vleft, string_optimizer, + lefti = getptrinfo(self.vleft) + offsetbox = lefti.string_copy_parts(self.vleft, optstring, targetbox, offsetbox, mode) - righti = string_optimizer.getptrinfo(self.vright) - offsetbox = righti.string_copy_parts(self.vright, string_optimizer, + righti = getptrinfo(self.vright) + offsetbox = righti.string_copy_parts(self.vright, optstring, targetbox, offsetbox, mode) return offsetbox - def _visitor_walk_recursive(self, instbox, visitor, optimizer): + def _visitor_walk_recursive(self, instbox, visitor): # we don't store the lengthvalue in guards, because the # guard-failed code starts with a regular STR_CONCAT again leftbox = self.vleft rightbox = self.vright visitor.register_virtual_fields(instbox, [leftbox, rightbox]) - leftinfo = optimizer.getptrinfo(leftbox) - rightinfo = optimizer.getptrinfo(rightbox) + leftinfo = getptrinfo(leftbox) + rightinfo = getptrinfo(rightbox) if leftinfo and leftinfo.is_virtual(): - leftinfo.visitor_walk_recursive(leftbox, visitor, optimizer) + leftinfo.visitor_walk_recursive(leftbox, visitor) if rightinfo and rightinfo.is_virtual(): - rightinfo.visitor_walk_recursive(rightbox, visitor, optimizer) + rightinfo.visitor_walk_recursive(rightbox, visitor) @specialize.argtype(1) def visitor_dispatch_virtual_type(self, visitor): return visitor.visit_vstrconcat(self.mode is mode_unicode) -def copy_str_content(string_optimizer, srcbox, targetbox, +def copy_str_content(optstring, srcbox, targetbox, srcoffsetbox, offsetbox, lengthbox, mode, need_next_offset=True): - srcbox = string_optimizer.get_box_replacement(srcbox) - srcoffset = string_optimizer.getintbound(srcoffsetbox) - lgt = string_optimizer.getintbound(lengthbox) + srcbox = get_box_replacement(srcbox) + srcoffset = optstring.getintbound(srcoffsetbox) + lgt = optstring.getintbound(lengthbox) if isinstance(srcbox, ConstPtr) and srcoffset.is_constant(): M = 5 else: @@ -348,27 +349,27 @@ # up to M characters are done "inline", i.e. with STRGETITEM/STRSETITEM # instead of just a COPYSTRCONTENT. for i in range(lgt.getint()): - charbox = string_optimizer.strgetitem(None, srcbox, srcoffsetbox, + charbox = optstring.strgetitem(None, srcbox, srcoffsetbox, mode) - srcoffsetbox = _int_add(string_optimizer, srcoffsetbox, CONST_1) + srcoffsetbox = _int_add(optstring, srcoffsetbox, CONST_1) assert not isinstance(targetbox, Const) # ConstPtr never makes sense - string_optimizer.emit_extra(ResOperation(mode.STRSETITEM, + optstring.emit_extra(ResOperation(mode.STRSETITEM, [targetbox, offsetbox, charbox])) - offsetbox = _int_add(string_optimizer, offsetbox, CONST_1) + offsetbox = _int_add(optstring, offsetbox, CONST_1) else: if need_next_offset: - nextoffsetbox = _int_add(string_optimizer, offsetbox, lengthbox) + nextoffsetbox = _int_add(optstring, offsetbox, lengthbox) else: nextoffsetbox = None assert not isinstance(targetbox, Const) # ConstPtr never makes sense op = ResOperation(mode.COPYSTRCONTENT, [srcbox, targetbox, srcoffsetbox, offsetbox, lengthbox]) - string_optimizer.emit_extra(op) + optstring.emit_extra(op) offsetbox = nextoffsetbox return offsetbox -def _int_add(string_optimizer, box1, box2): +def _int_add(optstring, box1, box2): if isinstance(box1, ConstInt): if box1.value == 0: return box2 @@ -377,20 +378,20 @@ elif isinstance(box2, ConstInt) and box2.value == 0: return box1 op = ResOperation(rop.INT_ADD, [box1, box2]) - string_optimizer.send_extra_operation(op) + optstring.optimizer.send_extra_operation(op) return op -def _int_sub(string_optimizer, box1, box2): +def _int_sub(optstring, box1, box2): if isinstance(box2, ConstInt): if box2.value == 0: return box1 if isinstance(box1, ConstInt): return ConstInt(box1.value - box2.value) op = ResOperation(rop.INT_SUB, [box1, box2]) - string_optimizer.send_extra_operation(op) + optstring.optimizer.send_extra_operation(op) return op -def _strgetitem(string_optimizer, strbox, indexbox, mode, resbox=None): +def _strgetitem(optstring, strbox, indexbox, mode, resbox=None): if isinstance(strbox, ConstPtr) and isinstance(indexbox, ConstInt): if mode is mode_string: s = strbox.getref(lltype.Ptr(rstr.STR)) @@ -399,14 +400,14 @@ s = strbox.getref(lltype.Ptr(rstr.UNICODE)) resnewbox = ConstInt(ord(s.chars[indexbox.getint()])) if resbox is not None: - string_optimizer.make_equal_to(resbox, resnewbox) + optstring.make_equal_to(resbox, resnewbox) return resnewbox if resbox is None: resbox = ResOperation(mode.STRGETITEM, [strbox, indexbox]) else: - resbox = string_optimizer.replace_op_with(resbox, mode.STRGETITEM, + resbox = optstring.replace_op_with(resbox, mode.STRGETITEM, [strbox, indexbox]) - string_optimizer.emit_extra(resbox) + optstring.emit_extra(resbox) return resbox @@ -462,7 +463,7 @@ self.pure_from_args(mode_unicode.STRLEN, [op], op.getarg(0)) def optimize_STRSETITEM(self, op): - opinfo = self.getptrinfo(op.getarg(0)) + opinfo = getptrinfo(op.getarg(0)) if opinfo: assert not opinfo.is_constant() # strsetitem(ConstPtr) never makes sense @@ -470,7 +471,7 @@ indexbox = self.get_constant_box(op.getarg(1)) if indexbox is not None: opinfo.strsetitem(indexbox.getint(), - self.get_box_replacement(op.getarg(2))) + get_box_replacement(op.getarg(2))) return self.make_nonnull(op.getarg(0)) return self.emit(op) @@ -488,12 +489,12 @@ def strgetitem(self, op, s, index, mode): self.make_nonnull_str(s, mode) - sinfo = self.getptrinfo(s) + sinfo = getptrinfo(s) # if isinstance(sinfo, VStringSliceInfo) and sinfo.is_virtual(): # slice index = _int_add(self.optimizer, sinfo.start, index) s = sinfo.s - sinfo = self.getptrinfo(sinfo.s) + sinfo = getptrinfo(sinfo.s) # if isinstance(sinfo, VStringPlainInfo): # even if no longer virtual @@ -507,7 +508,7 @@ # vindex = self.getintbound(index) if isinstance(sinfo, VStringConcatInfo) and vindex.is_constant(): - leftinfo = self.getptrinfo(sinfo.vleft) + leftinfo = getptrinfo(sinfo.vleft) len1box = leftinfo.getstrlen(sinfo.vleft, self, mode) if isinstance(len1box, ConstInt): raw_index = vindex.getint() @@ -527,8 +528,8 @@ return self._optimize_STRLEN(op, mode_unicode) def _optimize_STRLEN(self, op, mode): - arg1 = self.get_box_replacement(op.getarg(0)) - opinfo = self.getptrinfo(arg1) + arg1 = get_box_replacement(op.getarg(0)) + opinfo = getptrinfo(arg1) if opinfo: lgtop = opinfo.getstrlen(arg1, self, mode) if lgtop is not None: @@ -543,7 +544,7 @@ return self._optimize_STRHASH(op, mode_unicode) def _optimize_STRHASH(self, op, mode): - opinfo = self.getptrinfo(op.getarg(0)) + opinfo = getptrinfo(op.getarg(0)) if opinfo: lgtop = opinfo.getstrhash(op, mode) if lgtop is not None: @@ -564,8 +565,8 @@ assert op.getarg(2).type == INT assert op.getarg(3).type == INT assert op.getarg(4).type == INT - src = self.getptrinfo(op.getarg(0)) - dst = self.getptrinfo(op.getarg(1)) + src = getptrinfo(op.getarg(0)) + dst = getptrinfo(op.getarg(1)) srcstart = self.getintbound(op.getarg(2)) dststart = self.getintbound(op.getarg(3)) length = self.getintbound(op.getarg(4)) @@ -640,7 +641,7 @@ # More generally, supporting non-constant but virtual cases is # not obvious, because of the exception UnicodeDecodeError that # can be raised by ll_str2unicode() - varg = self.getptrinfo(op.getarg(1)) + varg = getptrinfo(op.getarg(1)) s = None if varg: s = varg.get_constant_string_spec(self, mode_string) @@ -658,14 +659,14 @@ self.make_nonnull_str(op.getarg(1), mode) self.make_nonnull_str(op.getarg(2), mode) self.make_vstring_concat(op, mode, - self.get_box_replacement(op.getarg(1)), - self.get_box_replacement(op.getarg(2))) + get_box_replacement(op.getarg(1)), + get_box_replacement(op.getarg(2))) self.last_emitted_operation = REMOVED return True, None def opt_call_stroruni_STR_SLICE(self, op, mode): self.make_nonnull_str(op.getarg(1), mode) - vstr = self.getptrinfo(op.getarg(1)) + vstr = getptrinfo(op.getarg(1)) vstart = self.getintbound(op.getarg(2)) vstop = self.getintbound(op.getarg(3)) # @@ -694,10 +695,10 @@ @specialize.arg(2) def opt_call_stroruni_STR_EQUAL(self, op, mode): - arg1 = self.get_box_replacement(op.getarg(1)) - arg2 = self.get_box_replacement(op.getarg(2)) - i1 = self.getptrinfo(arg1) - i2 = self.getptrinfo(arg2) + arg1 = get_box_replacement(op.getarg(1)) + arg2 = get_box_replacement(op.getarg(2)) + i1 = getptrinfo(arg1) + i2 = getptrinfo(arg2) # if i1: l1box = i1.getstrlen(arg1, self, mode) @@ -737,8 +738,8 @@ return False, None def handle_str_equal_level1(self, arg1, arg2, resultop, mode): - i1 = self.getptrinfo(arg1) - i2 = self.getptrinfo(arg2) + i1 = getptrinfo(arg1) + i2 = getptrinfo(arg2) l2box = None l1box = None if i2: @@ -747,7 +748,7 @@ if l2box.value == 0: if i1 and i1.is_nonnull(): self.make_nonnull_str(arg1, mode) - i1 = self.getptrinfo(arg1) + i1 = getptrinfo(arg1) lengthbox = i1.getstrlen(arg1, self, mode) else: lengthbox = None @@ -791,8 +792,8 @@ return False, None def handle_str_equal_level2(self, arg1, arg2, resultbox, mode): - i1 = self.getptrinfo(arg1) - i2 = self.getptrinfo(arg2) + i1 = getptrinfo(arg1) + i2 = getptrinfo(arg2) l2box = None if i2: l2box = i2.getstrlen(arg1, self, mode) @@ -818,10 +819,10 @@ return False, None def opt_call_stroruni_STR_CMP(self, op, mode): - arg1 = self.get_box_replacement(op.getarg(1)) - arg2 = self.get_box_replacement(op.getarg(2)) - i1 = self.getptrinfo(arg1) - i2 = self.getptrinfo(arg2) + arg1 = get_box_replacement(op.getarg(1)) + arg2 = get_box_replacement(op.getarg(2)) + i1 = getptrinfo(arg1) + i2 = getptrinfo(arg2) if not i1 or not i2: return False, None l1box = i1.getstrlen(arg1, self, mode) @@ -841,7 +842,7 @@ return False, None def opt_call_SHRINK_ARRAY(self, op): - i1 = self.getptrinfo(op.getarg(1)) + i1 = getptrinfo(op.getarg(1)) i2 = self.getintbound(op.getarg(2)) # If the index is constant, if the argument is virtual (we only support # VStringPlainValue for now) we can optimize away the call. diff -Nru pypy-7.1.1+dfsg/rpython/jit/metainterp/pyjitpl.py pypy-7.3.1+dfsg/rpython/jit/metainterp/pyjitpl.py --- pypy-7.1.1+dfsg/rpython/jit/metainterp/pyjitpl.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/metainterp/pyjitpl.py 2020-04-10 19:28:41.000000000 +0000 @@ -26,7 +26,6 @@ from rpython.rlib.objectmodel import compute_unique_id - # ____________________________________________________________ def arguments(*args): @@ -282,6 +281,7 @@ @arguments("box") def opimpl_assert_not_none(self, box): if self.metainterp.heapcache.is_nullity_known(box): + self.metainterp.staticdata.profiler.count_ops(rop.ASSERT_NOT_NONE, Counters.HEAPCACHED_OPS) return self.execute(rop.ASSERT_NOT_NONE, box) self.metainterp.heapcache.nullity_now_known(box) @@ -290,6 +290,7 @@ def opimpl_record_exact_class(self, box, clsbox): from rpython.rtyper.lltypesystem import llmemory if self.metainterp.heapcache.is_class_known(box): + self.metainterp.staticdata.profiler.count_ops(rop.RECORD_EXACT_CLASS, Counters.HEAPCACHED_OPS) return if isinstance(clsbox, Const): self.execute(rop.RECORD_EXACT_CLASS, box, clsbox) @@ -396,6 +397,7 @@ heapcache = self.metainterp.heapcache value = box.nonnull() if heapcache.is_nullity_known(box): + self.metainterp.staticdata.profiler.count_ops(rop.GUARD_NONNULL, Counters.HEAPCACHED_OPS) return value if value: if not self.metainterp.heapcache.is_class_known(box): @@ -479,6 +481,7 @@ if tobox: # sanity check: see whether the current array value # corresponds to what the cache thinks the value is + self.metainterp.staticdata.profiler.count_ops(rop.GETARRAYITEM_GC_I, Counters.HEAPCACHED_OPS) resvalue = executor.execute(self.metainterp.cpu, self.metainterp, op, arraydescr, arraybox, indexbox) if op == 'i': @@ -580,6 +583,8 @@ lengthbox = self.execute_with_descr( rop.ARRAYLEN_GC, arraydescr, arraybox) self.metainterp.heapcache.arraylen_now_known(arraybox, lengthbox) + else: + self.metainterp.staticdata.profiler.count_ops(rop.ARRAYLEN_GC, Counters.HEAPCACHED_OPS) return lengthbox @arguments("box", "box", "descr", "orgpc") @@ -735,6 +740,7 @@ # see ConstFloat.same_constant assert ConstFloat(resvalue).same_constant( upd.currfieldbox.constbox()) + self.metainterp.staticdata.profiler.count_ops(rop.GETFIELD_GC_I, Counters.HEAPCACHED_OPS) return upd.currfieldbox resbox = self.execute_with_descr(opnum, fielddescr, box) upd.getfield_now_known(resbox) @@ -765,6 +771,7 @@ def _opimpl_setfield_gc_any(self, box, valuebox, fielddescr): upd = self.metainterp.heapcache.get_field_updater(box, fielddescr) if upd.currfieldbox is valuebox: + self.metainterp.staticdata.profiler.count_ops(rop.SETFIELD_GC, Counters.HEAPCACHED_OPS) return self.metainterp.execute_and_record(rop.SETFIELD_GC, fielddescr, box, valuebox) upd.setfield(valuebox) @@ -866,14 +873,19 @@ from rpython.jit.metainterp.quasiimmut import QuasiImmutDescr cpu = self.metainterp.cpu if self.metainterp.heapcache.is_quasi_immut_known(fielddescr, box): + self.metainterp.staticdata.profiler.count_ops(rop.QUASIIMMUT_FIELD, Counters.HEAPCACHED_OPS) return descr = QuasiImmutDescr(cpu, box.getref_base(), fielddescr, mutatefielddescr) self.metainterp.heapcache.quasi_immut_now_known(fielddescr, box) self.metainterp.history.record(rop.QUASIIMMUT_FIELD, [box], None, descr=descr) - self.metainterp.generate_guard(rop.GUARD_NOT_INVALIDATED, - resumepc=orgpc) + if self.metainterp.heapcache.need_guard_not_invalidated: + self.metainterp.generate_guard(rop.GUARD_NOT_INVALIDATED, + resumepc=orgpc) + self.metainterp.heapcache.need_guard_not_invalidated = False + + @arguments("box", "descr", "orgpc") def opimpl_jit_force_quasi_immutable(self, box, mutatefielddescr, orgpc): @@ -906,6 +918,7 @@ # returns True if 'box' is actually not the "standard" virtualizable # that is stored in metainterp.virtualizable_boxes[-1] if self.metainterp.heapcache.is_nonstandard_virtualizable(box): + self.metainterp.staticdata.profiler.count_ops(rop.PTR_EQ, Counters.HEAPCACHED_OPS) return True if box is self.metainterp.forced_virtualizable: self.metainterp.forced_virtualizable = None @@ -1283,8 +1296,11 @@ if self.metainterp.seen_loop_header_for_jdindex < 0: if not any_operation: return - if self.metainterp.portal_call_depth or not self.metainterp.get_procedure_token(greenboxes, True): - if not jitdriver_sd.no_loop_header: + if not jitdriver_sd.no_loop_header: + if self.metainterp.portal_call_depth: + return + ptoken = self.metainterp.get_procedure_token(greenboxes) + if not has_compiled_targets(ptoken): return # automatically add a loop_header if there is none self.metainterp.seen_loop_header_for_jdindex = jdindex @@ -1741,24 +1757,29 @@ effect = effectinfo.extraeffect tp = descr.get_normalized_result_type() if effect == effectinfo.EF_LOOPINVARIANT: + res = self.metainterp.heapcache.call_loopinvariant_known_result(allboxes, descr) + if res is not None: + return res if tp == 'i': - return self.execute_varargs(rop.CALL_LOOPINVARIANT_I, + res = self.execute_varargs(rop.CALL_LOOPINVARIANT_I, allboxes, descr, False, False) elif tp == 'r': - return self.execute_varargs(rop.CALL_LOOPINVARIANT_R, + res = self.execute_varargs(rop.CALL_LOOPINVARIANT_R, allboxes, descr, False, False) elif tp == 'f': - return self.execute_varargs(rop.CALL_LOOPINVARIANT_F, + res = self.execute_varargs(rop.CALL_LOOPINVARIANT_F, allboxes, descr, False, False) elif tp == 'v': - return self.execute_varargs(rop.CALL_LOOPINVARIANT_N, + res = self.execute_varargs(rop.CALL_LOOPINVARIANT_N, allboxes, descr, False, False) else: assert False + self.metainterp.heapcache.call_loopinvariant_now_known(allboxes, descr, res) + return res exc = effectinfo.check_can_raise() pure = effectinfo.check_is_elidable() if tp == 'i': @@ -1813,6 +1834,7 @@ if standard_box is vref_box: return vref_box if self.metainterp.heapcache.is_nonstandard_virtualizable(vref_box): + self.metainterp.staticdata.profiler.count_ops(rop.PTR_EQ, Counters.HEAPCACHED_OPS) return None eqbox = self.metainterp.execute_and_record(rop.PTR_EQ, None, vref_box, standard_box) eqbox = self.implement_guard_value(eqbox, pc) @@ -2527,6 +2549,14 @@ else: duplicates[box] = None + def cancelled_too_many_times(self): + if self.staticdata.warmrunnerdesc: + memmgr = self.staticdata.warmrunnerdesc.memory_manager + if memmgr: + if self.cancel_count > memmgr.max_unroll_loops: + return True + return False + def reached_loop_header(self, greenboxes, redboxes): self.heapcache.reset() #reset_virtuals=False) #self.heapcache.reset_keep_likely_virtuals() @@ -2555,9 +2585,12 @@ # that failed; # - if self.resumekey is a ResumeFromInterpDescr, it starts directly # from the interpreter. + num_green_args = self.jitdriver_sd.num_green_args if not self.partial_trace: # FIXME: Support a retrace to be a bridge as well as a loop - self.compile_trace(live_arg_boxes) + ptoken = self.get_procedure_token(greenboxes) + if has_compiled_targets(ptoken): + self.compile_trace(live_arg_boxes, ptoken) # raises in case it works -- which is the common case, hopefully, # at least for bridges starting from a guard. @@ -2566,35 +2599,47 @@ # green keys, representing the beginning of the same loop as the one # we end now. - num_green_args = self.jitdriver_sd.num_green_args + can_use_unroll = (self.staticdata.cpu.supports_guard_gc_type and + 'unroll' in self.jitdriver_sd.warmstate.enable_opts) for j in range(len(self.current_merge_points)-1, -1, -1): original_boxes, start = self.current_merge_points[j] assert len(original_boxes) == len(live_arg_boxes) - for i in range(num_green_args): - box1 = original_boxes[i] - box2 = live_arg_boxes[i] - assert isinstance(box1, Const) - if not box1.same_constant(box2): - break - else: - if self.partial_trace: - if start != self.retracing_from: - raise SwitchToBlackhole(Counters.ABORT_BAD_LOOP) # For now - # Found! Compile it as a loop. - # raises in case it works -- which is the common case - self.compile_loop(original_boxes, live_arg_boxes, start, - exported_state=self.exported_state) - self.exported_state = None + if not same_greenkey(original_boxes, live_arg_boxes, num_green_args): + continue + if self.partial_trace: + if start != self.retracing_from: + raise SwitchToBlackhole(Counters.ABORT_BAD_LOOP) # For now + # Found! Compile it as a loop. + # raises in case it works -- which is the common case + self.history.trace.tracing_done() + if self.partial_trace: + target_token = self.compile_retrace( + original_boxes, live_arg_boxes, start) + self.raise_if_successful(live_arg_boxes, target_token) # creation of the loop was cancelled! self.cancel_count += 1 - if self.staticdata.warmrunnerdesc: - memmgr = self.staticdata.warmrunnerdesc.memory_manager - if memmgr: - if self.cancel_count > memmgr.max_unroll_loops: - self.compile_loop_or_abort(original_boxes, - live_arg_boxes, - start) - self.staticdata.log('cancelled, tracing more...') + if self.cancelled_too_many_times(): + self.staticdata.log('cancelled too many times!') + raise SwitchToBlackhole(Counters.ABORT_BAD_LOOP) + else: + target_token = self.compile_loop( + original_boxes, live_arg_boxes, start, + use_unroll=can_use_unroll) + self.raise_if_successful(live_arg_boxes, target_token) + # creation of the loop was cancelled! + self.cancel_count += 1 + if self.cancelled_too_many_times(): + if can_use_unroll: + # try one last time without unrolling + target_token = self.compile_loop( + original_boxes, live_arg_boxes, start, + use_unroll=False) + self.raise_if_successful(live_arg_boxes, target_token) + # + self.staticdata.log('cancelled too many times!') + raise SwitchToBlackhole(Counters.ABORT_BAD_LOOP) + self.exported_state = None + self.staticdata.log('cancelled, tracing more...') # Otherwise, no loop found so far, so continue tracing. start = self.history.get_trace_position() @@ -2657,6 +2702,12 @@ raise jitexc.DoneWithThisFrameFloat(res) raise AssertionError(kind) + def raise_if_successful(self, live_arg_boxes, target_token): + if target_token is not None: # raise if it *worked* correctly + assert isinstance(target_token, TargetToken) + jitcell_token = target_token.targeting_jitcell_token + self.raise_continue_running_normally(live_arg_boxes, jitcell_token) + def prepare_resume_from_failure(self, deadframe, inputargs, resumedescr): exception = self.cpu.grab_exc_value(deadframe) if (isinstance(resumedescr, compile.ResumeGuardExcDescr) or @@ -2699,94 +2750,54 @@ self.history.set_inputargs(inputargs, self.staticdata) assert not exception - def get_procedure_token(self, greenkey, with_compiled_targets=False): + def get_procedure_token(self, greenkey): JitCell = self.jitdriver_sd.warmstate.JitCell cell = JitCell.get_jit_cell_at_key(greenkey) if cell is None: return None - token = cell.get_procedure_token() - if with_compiled_targets: - if not token: - return None - if not token.target_tokens: - return None - return token + return cell.get_procedure_token() - def compile_loop(self, original_boxes, live_arg_boxes, start, - try_disabling_unroll=False, exported_state=None): + def compile_loop(self, original_boxes, live_arg_boxes, start, use_unroll): num_green_args = self.jitdriver_sd.num_green_args greenkey = original_boxes[:num_green_args] - if self.history.trace_tag_overflow(): - raise SwitchToBlackhole(Counters.ABORT_TOO_LONG) - self.history.trace.tracing_done() - if not self.partial_trace: - ptoken = self.get_procedure_token(greenkey) - if ptoken is not None and ptoken.target_tokens is not None: - # XXX this path not tested, but shown to occur on pypy-c :-( - self.staticdata.log('cancelled: we already have a token now') - raise SwitchToBlackhole(Counters.ABORT_BAD_LOOP) - if self.partial_trace: - target_token = compile.compile_retrace(self, greenkey, start, - original_boxes[num_green_args:], - live_arg_boxes[num_green_args:], - self.partial_trace, - self.resumekey, - exported_state) - else: - target_token = compile.compile_loop(self, greenkey, start, - original_boxes[num_green_args:], - live_arg_boxes[num_green_args:], - try_disabling_unroll=try_disabling_unroll) - if target_token is not None: - assert isinstance(target_token, TargetToken) - self.jitdriver_sd.warmstate.attach_procedure_to_interp(greenkey, target_token.targeting_jitcell_token) - self.staticdata.stats.add_jitcell_token(target_token.targeting_jitcell_token) - - if target_token is not None: # raise if it *worked* correctly + ptoken = self.get_procedure_token(greenkey) + if has_compiled_targets(ptoken): + # XXX this path not tested, but shown to occur on pypy-c :-( + self.staticdata.log('cancelled: we already have a token now') + raise SwitchToBlackhole(Counters.ABORT_BAD_LOOP) + target_token = compile.compile_loop( + self, greenkey, start, original_boxes[num_green_args:], + live_arg_boxes[num_green_args:], use_unroll=use_unroll) + if target_token is not None: assert isinstance(target_token, TargetToken) - jitcell_token = target_token.targeting_jitcell_token - self.raise_continue_running_normally(live_arg_boxes, jitcell_token) - - def compile_loop_or_abort(self, original_boxes, live_arg_boxes, - start): - """Called after we aborted more than 'max_unroll_loops' times. - As a last attempt, try to compile the loop with unrolling disabled. - """ - if not self.partial_trace: - self.compile_loop(original_boxes, live_arg_boxes, start, - try_disabling_unroll=True) - # - self.staticdata.log('cancelled too many times!') - raise SwitchToBlackhole(Counters.ABORT_BAD_LOOP) + self.jitdriver_sd.warmstate.attach_procedure_to_interp( + greenkey, target_token.targeting_jitcell_token) + self.staticdata.stats.add_jitcell_token( + target_token.targeting_jitcell_token) + return target_token - def compile_trace(self, live_arg_boxes): + def compile_retrace(self, original_boxes, live_arg_boxes, start): num_green_args = self.jitdriver_sd.num_green_args - greenkey = live_arg_boxes[:num_green_args] - target_jitcell_token = self.get_procedure_token(greenkey, True) - if not target_jitcell_token: - return + greenkey = original_boxes[:num_green_args] + return compile.compile_retrace( + self, greenkey, start, original_boxes[num_green_args:], + live_arg_boxes[num_green_args:], self.partial_trace, + self.resumekey, self.exported_state) + def compile_trace(self, live_arg_boxes, ptoken): + num_green_args = self.jitdriver_sd.num_green_args cut_at = self.history.get_trace_position() self.potential_retrace_position = cut_at self.history.record(rop.JUMP, live_arg_boxes[num_green_args:], None, - descr=target_jitcell_token) - self.history.ends_with_jump = True - if self.history.trace_tag_overflow(): - raise SwitchToBlackhole(Counters.ABORT_TOO_LONG) - self.history.trace.tracing_done() + descr=ptoken) try: target_token = compile.compile_trace(self, self.resumekey, - live_arg_boxes[num_green_args:]) + live_arg_boxes[num_green_args:], ends_with_jump=True) finally: - self.history.cut(cut_at) # pop the jump - self.history.ends_with_jump = False - if target_token is not None: # raise if it *worked* correctly - assert isinstance(target_token, TargetToken) - jitcell_token = target_token.targeting_jitcell_token - self.raise_continue_running_normally(live_arg_boxes, jitcell_token) + self.history.cut(cut_at) # pop the jump + self.raise_if_successful(live_arg_boxes, target_token) def compile_done_with_this_frame(self, exitbox): - # temporarily put a JUMP to a pseudo-loop self.store_token_in_vable() sd = self.staticdata result_type = self.jitdriver_sd.result_type @@ -2805,11 +2816,7 @@ token = sd.done_with_this_frame_descr_float else: assert False - # FIXME: can we call compile_trace? self.history.record(rop.FINISH, exits, None, descr=token) - if self.history.trace_tag_overflow(): - raise SwitchToBlackhole(Counters.ABORT_TOO_LONG) - self.history.trace.tracing_done() target_token = compile.compile_trace(self, self.resumekey, exits) if target_token is not token: compile.giveup() @@ -2835,9 +2842,6 @@ sd = self.staticdata token = sd.exit_frame_with_exception_descr_ref self.history.record(rop.FINISH, [valuebox], None, descr=token) - if self.history.trace_tag_overflow(): - raise SwitchToBlackhole(Counters.ABORT_TOO_LONG) - self.history.trace.tracing_done() target_token = compile.compile_trace(self, self.resumekey, [valuebox]) if target_token is not token: compile.giveup() @@ -3442,3 +3446,16 @@ frame._put_back_list_of_boxes(newvalue, 0, position) frame._put_back_list_of_boxes(newvalue, length1, position2) frame._put_back_list_of_boxes(newvalue, length1 + length2, position3) + +def same_greenkey(original_boxes, live_arg_boxes, num_green_args): + for i in range(num_green_args): + box1 = original_boxes[i] + box2 = live_arg_boxes[i] + assert isinstance(box1, Const) + if not box1.same_constant(box2): + return False + else: + return True + +def has_compiled_targets(token): + return bool(token) and bool(token.target_tokens) diff -Nru pypy-7.1.1+dfsg/rpython/jit/metainterp/quasiimmut.py pypy-7.3.1+dfsg/rpython/jit/metainterp/quasiimmut.py --- pypy-7.1.1+dfsg/rpython/jit/metainterp/quasiimmut.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/metainterp/quasiimmut.py 2020-04-10 19:28:41.000000000 +0000 @@ -5,6 +5,7 @@ from rpython.jit.metainterp.history import ( AbstractDescr, ConstPtr, ConstInt, ConstFloat) from rpython.rlib.objectmodel import we_are_translated +from rpython.rlib.debug import ll_assert, debug_print, debug_start, debug_stop def get_mutate_field_name(fieldname): @@ -26,12 +27,14 @@ return qmut def make_invalidation_function(STRUCT, mutatefieldname): - # + # fake a repr + descr_repr = "FieldDescr(%s, '%s')" % (STRUCT.TO, mutatefieldname) + def _invalidate_now(p): qmut_ptr = getattr(p, mutatefieldname) setattr(p, mutatefieldname, lltype.nullptr(rclass.OBJECT)) qmut = cast_base_ptr_to_instance(QuasiImmut, qmut_ptr) - qmut.invalidate() + qmut.invalidate(descr_repr) _invalidate_now._dont_inline_ = True # def invalidation(p): @@ -45,7 +48,7 @@ if qmut_ref: cpu.bh_setfield_gc_r(p, ConstPtr.value, mutatefielddescr) qmut = cast_gcref_to_instance(QuasiImmut, qmut_ref) - qmut.invalidate() + qmut.invalidate(mutatefielddescr.repr_of_descr()) class QuasiImmut(object): @@ -78,7 +81,8 @@ # already invalidated; see below self.compress_limit = (len(self.looptokens_wrefs) + 15) * 2 - def invalidate(self): + def invalidate(self, descr_repr=None): + debug_start("jit-invalidate-quasi-immutable") # When this is called, all the loops that we record become # invalid: all GUARD_NOT_INVALIDATED in these loops (and # in attached bridges) must now fail. @@ -87,9 +91,11 @@ return wrefs = self.looptokens_wrefs self.looptokens_wrefs = [] + invalidated = 0 for wref in wrefs: looptoken = wref() if looptoken is not None: + invalidated += 1 looptoken.invalidated = True self.cpu.invalidate_loop(looptoken) # NB. we must call cpu.invalidate_loop() even if @@ -100,6 +106,8 @@ if not we_are_translated(): self.cpu.stats.invalidated_token_numbers.add( looptoken.number) + debug_print("fieldname", descr_repr or "", "invalidated", invalidated) + debug_stop("jit-invalidate-quasi-immutable") class QuasiImmutDescr(AbstractDescr): diff -Nru pypy-7.1.1+dfsg/rpython/jit/metainterp/resoperation.py pypy-7.3.1+dfsg/rpython/jit/metainterp/resoperation.py --- pypy-7.1.1+dfsg/rpython/jit/metainterp/resoperation.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/metainterp/resoperation.py 2020-04-10 19:28:41.000000000 +0000 @@ -1055,6 +1055,9 @@ 'UNICODEGETITEM/2/i', # 'LOAD_FROM_GC_TABLE/1/r', # only emitted by rewrite.py + 'LOAD_EFFECTIVE_ADDRESS/4/i', # only emitted by rewrite.py, only if + # cpu.supports_load_effective_address. [v_gcptr,v_index,c_baseofs,c_shift] + # res = arg0 + (arg1 << arg3) + arg2 # '_ALWAYS_PURE_LAST', # ----- end of always_pure operations ----- @@ -1153,8 +1156,7 @@ 'CALL_ASSEMBLER/*d/rfin', # call already compiled assembler 'CALL_MAY_FORCE/*d/rfin', 'CALL_LOOPINVARIANT/*d/rfin', - 'CALL_RELEASE_GIL/*d/fin', - # release the GIL and "close the stack" for asmgcc + 'CALL_RELEASE_GIL/*d/fin', # release the GIL around the call 'CALL_PURE/*d/rfin', # removed before it's passed to the backend 'CHECK_MEMORY_ERROR/1/n', # after a CALL: NULL => propagate MemoryError 'CALL_MALLOC_NURSERY/1/r', # nursery malloc, const number of bytes, zeroed diff -Nru pypy-7.1.1+dfsg/rpython/jit/metainterp/resume.py pypy-7.3.1+dfsg/rpython/jit/metainterp/resume.py --- pypy-7.1.1+dfsg/rpython/jit/metainterp/resume.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/metainterp/resume.py 2020-04-10 19:28:41.000000000 +0000 @@ -221,15 +221,17 @@ # env numbering - def _number_boxes(self, iter, arr, optimizer, numb_state): + def _number_boxes(self, iter, arr, numb_state): """ Number boxes from one snapshot """ + from rpython.jit.metainterp.optimizeopt.info import ( + getrawptrinfo, getptrinfo) num_boxes = numb_state.num_boxes num_virtuals = numb_state.num_virtuals liveboxes = numb_state.liveboxes for item in arr: box = iter.get(rffi.cast(lltype.Signed, item)) - box = optimizer.get_box_replacement(box) + box = box.get_box_replacement() if isinstance(box, Const): tagged = self.getconst(box) @@ -238,10 +240,10 @@ else: is_virtual = False if box.type == 'r': - info = optimizer.getptrinfo(box) + info = getptrinfo(box) is_virtual = (info is not None and info.is_virtual()) if box.type == 'i': - info = optimizer.getrawptrinfo(box, create=False) + info = getrawptrinfo(box) is_virtual = (info is not None and info.is_virtual()) if is_virtual: tagged = tag(num_virtuals, TAGVIRTUAL) @@ -254,7 +256,7 @@ numb_state.num_boxes = num_boxes numb_state.num_virtuals = num_virtuals - def number(self, optimizer, position, trace): + def number(self, position, trace): snapshot_iter = trace.get_snapshot_iter(position) numb_state = NumberingState(snapshot_iter.size) numb_state.append_int(0) # patch later: size of resume section @@ -263,21 +265,20 @@ arr = snapshot_iter.vable_array numb_state.append_int(len(arr)) - self._number_boxes(snapshot_iter, arr, optimizer, numb_state) + self._number_boxes(snapshot_iter, arr, numb_state) arr = snapshot_iter.vref_array n = len(arr) assert not (n & 1) numb_state.append_int(n >> 1) - self._number_boxes(snapshot_iter, arr, optimizer, numb_state) + self._number_boxes(snapshot_iter, arr, numb_state) for snapshot in snapshot_iter.framestack: jitcode_index, pc = snapshot_iter.unpack_jitcode_pc(snapshot) numb_state.append_int(jitcode_index) numb_state.append_int(pc) - self._number_boxes( - snapshot_iter, snapshot.box_array, optimizer, numb_state) + self._number_boxes(snapshot_iter, snapshot.box_array, numb_state) numb_state.patch_current_size(0) return numb_state @@ -389,7 +390,7 @@ fieldboxes = [] for box in _fieldboxes: if box is not None: - box = self.optimizer.get_box_replacement(box) + box = box.get_box_replacement() fieldboxes.append(box) self.vfieldboxes[virtualbox] = fieldboxes self._register_boxes(fieldboxes) @@ -414,7 +415,8 @@ return tagbits == TAGVIRTUAL def finish(self, pending_setfields=[]): - optimizer = self.optimizer + from rpython.jit.metainterp.optimizeopt.info import ( + getrawptrinfo, getptrinfo) # compute the numbering storage = self.storage # make sure that nobody attached resume data to this guard yet @@ -422,8 +424,7 @@ resume_position = self.guard_op.rd_resume_position assert resume_position >= 0 # count stack depth - numb_state = self.memo.number(optimizer, - resume_position, optimizer.trace) + numb_state = self.memo.number(resume_position, self.trace) self.liveboxes_from_env = liveboxes_from_env = numb_state.liveboxes num_virtuals = numb_state.num_virtuals self.liveboxes = {} @@ -439,29 +440,31 @@ else: assert tagbits == TAGVIRTUAL if box.type == 'r': - info = optimizer.getptrinfo(box) + info = getptrinfo(box) else: assert box.type == 'i' - info = optimizer.getrawptrinfo(box) + info = getrawptrinfo(box) assert info.is_virtual() - info.visitor_walk_recursive(box, self, optimizer) + info.visitor_walk_recursive(box, self) for setfield_op in pending_setfields: box = setfield_op.getarg(0) - box = optimizer.get_box_replacement(box) + if box is not None: + box = box.get_box_replacement() if setfield_op.getopnum() == rop.SETFIELD_GC: fieldbox = setfield_op.getarg(1) else: fieldbox = setfield_op.getarg(2) - fieldbox = optimizer.get_box_replacement(fieldbox) + if fieldbox is not None: + fieldbox = fieldbox.get_box_replacement() self.register_box(box) self.register_box(fieldbox) - info = optimizer.getptrinfo(fieldbox) + info = getptrinfo(fieldbox) assert info is not None and info.is_virtual() - info.visitor_walk_recursive(fieldbox, self, optimizer) + info.visitor_walk_recursive(fieldbox, self) - self._number_virtuals(liveboxes, optimizer, num_virtuals) - self._add_pending_fields(optimizer, pending_setfields) + self._number_virtuals(liveboxes, num_virtuals) + self._add_pending_fields(pending_setfields) numb_state.patch(1, len(liveboxes)) @@ -470,8 +473,9 @@ storage.rd_consts = self.memo.consts return liveboxes[:] - def _number_virtuals(self, liveboxes, optimizer, num_env_virtuals): - from rpython.jit.metainterp.optimizeopt.info import AbstractVirtualPtrInfo + def _number_virtuals(self, liveboxes, num_env_virtuals): + from rpython.jit.metainterp.optimizeopt.info import ( + AbstractVirtualPtrInfo, getptrinfo) # !! 'liveboxes' is a list that is extend()ed in-place !! memo = self.memo @@ -512,11 +516,10 @@ memo.nvholes += length - len(vfieldboxes) for virtualbox, fieldboxes in vfieldboxes.iteritems(): num, _ = untag(self.liveboxes[virtualbox]) - info = optimizer.getptrinfo(virtualbox) + info = getptrinfo(virtualbox) assert info.is_virtual() assert isinstance(info, AbstractVirtualPtrInfo) - fieldnums = [self._gettagged(box) - for box in fieldboxes] + fieldnums = [self._gettagged(box) for box in fieldboxes] vinfo = self.make_virtual_info(info, fieldnums) # if a new vinfo instance is made, we get the fieldnums list we # pass in as an attribute. hackish. @@ -536,19 +539,21 @@ return True return False - def _add_pending_fields(self, optimizer, pending_setfields): + def _add_pending_fields(self, pending_setfields): + from rpython.jit.metainterp.optimizeopt.util import ( + get_box_replacement) rd_pendingfields = lltype.nullptr(PENDINGFIELDSP.TO) if pending_setfields: n = len(pending_setfields) rd_pendingfields = lltype.malloc(PENDINGFIELDSP.TO, n) for i in range(n): op = pending_setfields[i] - box = optimizer.get_box_replacement(op.getarg(0)) + box = get_box_replacement(op.getarg(0)) descr = op.getdescr() opnum = op.getopnum() if opnum == rop.SETARRAYITEM_GC: fieldbox = op.getarg(2) - boxindex = optimizer.get_box_replacement(op.getarg(1)) + boxindex = op.getarg(1).get_box_replacement() itemindex = boxindex.getint() # sanity: it's impossible to run code with SETARRAYITEM_GC # with negative index, so this guard cannot ever fail; @@ -560,8 +565,7 @@ itemindex = -1 else: raise AssertionError - fieldbox = optimizer.get_box_replacement(fieldbox) - #descr, box, fieldbox, itemindex = pending_setfields[i] + fieldbox = get_box_replacement(fieldbox) lldescr = annlowlevel.cast_instance_to_base_ptr(descr) num = self._gettagged(box) fieldnum = self._gettagged(fieldbox) diff -Nru pypy-7.1.1+dfsg/rpython/jit/metainterp/test/test_ajit.py pypy-7.3.1+dfsg/rpython/jit/metainterp/test/test_ajit.py --- pypy-7.1.1+dfsg/rpython/jit/metainterp/test/test_ajit.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/metainterp/test/test_ajit.py 2020-04-10 19:28:41.000000000 +0000 @@ -9,6 +9,7 @@ from rpython.jit.metainterp import history from rpython.jit.metainterp.test.support import LLJitMixin, noConst from rpython.jit.metainterp.warmspot import get_stats +from rpython.jit.metainterp.pyjitpl import MetaInterp from rpython.rlib import rerased from rpython.rlib.jit import (JitDriver, we_are_jitted, hint, dont_look_inside, loop_invariant, elidable, promote, jit_debug, assert_green, @@ -133,7 +134,7 @@ u = U(x, len(x)) st = u._get_index_storage() return rutf8.codepoint_index_at_byte_position( - u.u, st, 1) + u.u, st, 1, len(x)) self.interp_operations(m, [123232]) @@ -2883,10 +2884,11 @@ i += 1 return i # - def my_optimize_trace(*args, **kwds): - raise InvalidLoop - old_optimize_trace = optimizeopt.optimize_trace - optimizeopt.optimize_trace = my_optimize_trace + def my_compile_loop( + self, original_boxes, live_arg_boxes, start, use_unroll): + return None + old_compile_loop = MetaInterp.compile_loop + MetaInterp.compile_loop = my_compile_loop try: res = self.meta_interp(f, [23, 4]) assert res == 23 @@ -2898,11 +2900,11 @@ self.check_trace_count(0) self.check_aborted_count(2) finally: - optimizeopt.optimize_trace = old_optimize_trace + MetaInterp.compile_loop = old_compile_loop def test_max_unroll_loops_retry_without_unroll(self): - from rpython.jit.metainterp.optimize import InvalidLoop - from rpython.jit.metainterp import optimizeopt + if not self.basic: + py.test.skip("unrolling") myjitdriver = JitDriver(greens = [], reds = ['n', 'i']) # def f(n, limit): @@ -2916,20 +2918,19 @@ return i # seen = [] - def my_optimize_trace(metainterp_sd, jitdriver_sd, data, memo=None): - seen.append('unroll' in data.enable_opts) - raise InvalidLoop - old_optimize_trace = optimizeopt.optimize_trace - optimizeopt.optimize_trace = my_optimize_trace + def my_compile_loop( + self, original_boxes, live_arg_boxes, start, use_unroll): + seen.append(use_unroll) + return None + old_compile_loop = MetaInterp.compile_loop + MetaInterp.compile_loop = my_compile_loop try: - if not self.basic: - py.test.skip("unrolling") res = self.meta_interp(f, [23, 4]) assert res == 23 assert False in seen assert True in seen finally: - optimizeopt.optimize_trace = old_optimize_trace + MetaInterp.compile_loop = old_compile_loop def test_retrace_limit_with_extra_guards(self): myjitdriver = JitDriver(greens = [], reds = ['n', 'i', 'sa', 'a', @@ -3989,55 +3990,6 @@ # here it works again self.check_operations_history(guard_class=0, record_exact_class=1) - def test_record_exact_class_nonconst(self): - class Base(object): - def f(self): - raise NotImplementedError - def g(self): - raise NotImplementedError - class A(Base): - def f(self): - return self.a - def g(self): - return self.a + 1 - class B(Base): - def f(self): - return self.b - def g(self): - return self.b + 1 - class C(B): - def f(self): - self.c += 1 - return self.c - def g(self): - return self.c + 1 - @dont_look_inside - def make(x): - if x > 0: - a = A() - a.a = x + 1 - elif x < 0: - a = B() - a.b = -x - else: - a = C() - a.c = 10 - return a, type(a) - def f(x): - a, cls = make(x) - record_exact_class(a, cls) - if x > 0: - z = a.f() - elif x < 0: - z = a.f() - else: - z = a.f() - return z + a.g() - res1 = f(6) - res2 = self.interp_operations(f, [6]) - assert res1 == res2 - self.check_operations_history(guard_class=1, record_exact_class=0) - def test_generator(self): def g(n): yield n+1 @@ -4071,64 +4023,6 @@ class TestLLtype(BaseLLtypeTests, LLJitMixin): - def test_tagged(self): - py.test.skip("tagged unsupported") - from rpython.rlib.objectmodel import UnboxedValue - class Base(object): - __slots__ = () - - class Int(UnboxedValue, Base): - __slots__ = ["a"] - - def is_pos(self): - return self.a > 0 - - def dec(self): - try: - return Int(self.a - 1) - except OverflowError: - raise - - class Float(Base): - def __init__(self, a): - self.a = a - - def is_pos(self): - return self.a > 0 - - def dec(self): - return Float(self.a - 1) - - driver = JitDriver(greens=['pc', 's'], reds=['o']) - - def main(fl, n, s): - if s: - s = "--j" - else: - s = "---j" - if fl: - o = Float(float(n)) - else: - o = Int(n) - pc = 0 - while True: - driver.jit_merge_point(s=s, pc=pc, o=o) - c = s[pc] - if c == "j": - driver.can_enter_jit(s=s, pc=pc, o=o) - if o.is_pos(): - pc = 0 - continue - else: - break - elif c == "-": - o = o.dec() - pc += 1 - return pc - topt = {'taggedpointers': True} - res = self.meta_interp(main, [False, 100, True], - translationoptions=topt) - def test_rerased(self): eraseX, uneraseX = rerased.new_erasing_pair("X") # @@ -4889,3 +4783,52 @@ res = self.meta_interp(f, [0]) assert res == f(0) + + def test_record_exact_class_nonconst(self): + class Base(object): + def f(self): + raise NotImplementedError + def g(self): + raise NotImplementedError + class A(Base): + def f(self): + return self.a + def g(self): + return self.a + 1 + class B(Base): + def f(self): + return self.b + def g(self): + return self.b + 1 + class C(B): + def f(self): + self.c += 1 + return self.c + def g(self): + return self.c + 1 + @dont_look_inside + def make(x): + if x > 0: + a = A() + a.a = x + 1 + elif x < 0: + a = B() + a.b = -x + else: + a = C() + a.c = 10 + return a, type(a) + def f(x): + a, cls = make(x) + record_exact_class(a, cls) + if x > 0: + z = a.f() + elif x < 0: + z = a.f() + else: + z = a.f() + return z + a.g() + res1 = f(6) + res2 = self.interp_operations(f, [6]) + assert res1 == res2 + self.check_operations_history(guard_class=1, record_exact_class=0) diff -Nru pypy-7.1.1+dfsg/rpython/jit/metainterp/test/test_bridgeopt.py pypy-7.3.1+dfsg/rpython/jit/metainterp/test/test_bridgeopt.py --- pypy-7.1.1+dfsg/rpython/jit/metainterp/test/test_bridgeopt.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/metainterp/test/test_bridgeopt.py 2020-04-10 19:28:41.000000000 +0000 @@ -28,14 +28,10 @@ optheap = None optrewrite = None - def __init__(self, dct={}, cpu=None): - self.dct = dct + def __init__(self, cpu=None): self.constant_classes = {} self.cpu = cpu - def getptrinfo(self, arg): - return self.dct.get(arg, None) - def make_constant_class(self, arg, cls): self.constant_classes[arg] = cls @@ -47,13 +43,12 @@ self.rd_numb = numb def test_known_classes(): + cls = FakeClass() box1 = InputArgRef() + box1.set_forwarded(InstancePtrInfo(known_class=cls)) box2 = InputArgRef() box3 = InputArgRef() - - cls = FakeClass() - dct = {box1: InstancePtrInfo(known_class=cls)} - optimizer = FakeOptimizer(dct) + optimizer = FakeOptimizer() numb_state = NumberingState(4) numb_state.append_int(1) # size of resume block @@ -87,10 +82,10 @@ @given(boxes_known_classes) def test_random_class_knowledge(boxes_known_classes): cls = FakeClass() - dct1 = {box: InstancePtrInfo(known_class=cls) - for box, known_class in boxes_known_classes - if known_class} - optimizer = FakeOptimizer(dct1) + for box, known_class in boxes_known_classes: + if known_class: + box.set_forwarded(InstancePtrInfo(known_class=cls)) + optimizer = FakeOptimizer() refboxes = [box for (box, _) in boxes_known_classes if isinstance(box, InputArgRef)] diff -Nru pypy-7.1.1+dfsg/rpython/jit/metainterp/test/test_compile.py pypy-7.3.1+dfsg/rpython/jit/metainterp/test/test_compile.py --- pypy-7.1.1+dfsg/rpython/jit/metainterp/test/test_compile.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/metainterp/test/test_compile.py 2020-04-10 19:28:41.000000000 +0000 @@ -102,10 +102,10 @@ metainterp.history.trace = t # greenkey = 'faked' - target_token = compile_loop(metainterp, greenkey, (0, 0, 0), - t.inputargs, - [t._mapping[x] for x in loop.operations[-1].getarglist()], - None) + target_token = compile_loop( + metainterp, greenkey, (0, 0, 0), t.inputargs, + [t._mapping[x] for x in loop.operations[-1].getarglist()], + use_unroll=False) jitcell_token = target_token.targeting_jitcell_token assert jitcell_token == target_token.original_jitcell_token assert jitcell_token.target_tokens == [target_token] diff -Nru pypy-7.1.1+dfsg/rpython/jit/metainterp/test/test_float.py pypy-7.3.1+dfsg/rpython/jit/metainterp/test/test_float.py --- pypy-7.1.1+dfsg/rpython/jit/metainterp/test/test_float.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/metainterp/test/test_float.py 2020-04-10 19:28:41.000000000 +0000 @@ -43,7 +43,7 @@ a = float(r_singlefloat(a)) a *= 4.25 return float(r_singlefloat(a)) - res = self.interp_operations(f, [-2.0]) + res = self.interp_operations(f, [-2.0], supports_singlefloats=True) assert res == -8.5 def test_cast_float_to_int(self): diff -Nru pypy-7.1.1+dfsg/rpython/jit/metainterp/test/test_heapcache.py pypy-7.3.1+dfsg/rpython/jit/metainterp/test/test_heapcache.py --- pypy-7.1.1+dfsg/rpython/jit/metainterp/test/test_heapcache.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/metainterp/test/test_heapcache.py 2020-04-10 19:28:41.000000000 +0000 @@ -3,6 +3,7 @@ from rpython.jit.metainterp.resoperation import rop, InputArgInt from rpython.jit.metainterp.history import ConstInt, ConstPtr, BasicFailDescr from rpython.jit.metainterp.history import IntFrontendOp, RefFrontendOp +from rpython.rtyper.lltypesystem import llmemory, rffi descr1 = object() descr2 = object() @@ -111,6 +112,16 @@ assert not h.is_nonstandard_virtualizable(box1) assert not h.is_nonstandard_virtualizable(box2) + def test_nonstandard_virtualizable_allocation(self): + h = HeapCache() + box1 = RefFrontendOp(1) + h.new(box1) + # we've seen the allocation, so it's not the virtualizable + assert h.is_nonstandard_virtualizable(box1) + + h.reset() + assert not h.is_nonstandard_virtualizable(box1) + def test_heapcache_fields(self): h = HeapCache() box1 = RefFrontendOp(1) @@ -848,6 +859,42 @@ assert not h.is_quasi_immut_known(descr1, box1) assert not h.is_quasi_immut_known(descr1, box2) + # a call invalidates everything + h.invalidate_caches( + rop.CALL_N, FakeCallDescr(FakeEffectinfo.EF_CAN_RAISE), []) + assert not h.is_quasi_immut_known(descr2, box3) + assert not h.is_quasi_immut_known(descr2, box4) + + + def test_quasiimmut_seen_consts(self): + h = HeapCache() + box1 = ConstPtr(rffi.cast(llmemory.GCREF, 1)) + box2 = ConstPtr(rffi.cast(llmemory.GCREF, 1)) + box3 = ConstPtr(rffi.cast(llmemory.GCREF, 1)) + box4 = ConstPtr(rffi.cast(llmemory.GCREF, 1)) + assert not h.is_quasi_immut_known(descr1, box1) + assert not h.is_quasi_immut_known(descr1, box2) + assert not h.is_quasi_immut_known(descr2, box3) + assert not h.is_quasi_immut_known(descr2, box4) + h.quasi_immut_now_known(descr1, box1) + assert h.is_quasi_immut_known(descr1, box1) + assert h.is_quasi_immut_known(descr1, box2) + assert not h.is_quasi_immut_known(descr2, box3) + assert not h.is_quasi_immut_known(descr2, box4) + h.quasi_immut_now_known(descr2, box3) + assert h.is_quasi_immut_known(descr1, box1) + assert h.is_quasi_immut_known(descr1, box2) + assert h.is_quasi_immut_known(descr2, box3) + assert h.is_quasi_immut_known(descr2, box4) + + # invalidate the descr1 cache + + vbox1 = RefFrontendOp(1) + vbox2 = RefFrontendOp(2) + h.setfield(vbox1, vbox2, descr1) + assert not h.is_quasi_immut_known(descr1, box1) + assert not h.is_quasi_immut_known(descr1, box2) + # a call invalidates everything h.invalidate_caches( rop.CALL_N, FakeCallDescr(FakeEffectinfo.EF_CAN_RAISE), []) diff -Nru pypy-7.1.1+dfsg/rpython/jit/metainterp/test/test_jitprof.py pypy-7.3.1+dfsg/rpython/jit/metainterp/test/test_jitprof.py --- pypy-7.1.1+dfsg/rpython/jit/metainterp/test/test_jitprof.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/metainterp/test/test_jitprof.py 2020-04-10 19:28:41.000000000 +0000 @@ -97,3 +97,32 @@ assert res == f(6, 7, 2) profiler = pyjitpl._warmrunnerdesc.metainterp_sd.profiler assert profiler.calls == 1 + + def test_heapcache_stats(self): + class A: + pass + class B(A): + pass + @dont_look_inside + def extern(n): + if n == -7: + return None + elif n: + return A() + else: + return B() + myjitdriver = JitDriver(greens = [], reds='auto') + def f(x, y): + res = 0 + while y > 0: + myjitdriver.jit_merge_point() + obj = extern(y) + res += x + isinstance(obj, B) + isinstance(obj, B) + isinstance(obj, B) + isinstance(obj, B) + res += x + y -= 1 + return res * 2 + res = self.meta_interp(f, [6, 7]) + assert res == f(6, 7) + profiler = pyjitpl._warmrunnerdesc.metainterp_sd.profiler + assert profiler.counters[Counters.HEAPCACHED_OPS] == 3 + diff -Nru pypy-7.1.1+dfsg/rpython/jit/metainterp/test/test_quasiimmut.py pypy-7.3.1+dfsg/rpython/jit/metainterp/test/test_quasiimmut.py --- pypy-7.1.1+dfsg/rpython/jit/metainterp/test/test_quasiimmut.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/metainterp/test/test_quasiimmut.py 2020-04-10 19:28:41.000000000 +0000 @@ -121,7 +121,7 @@ assert f(100, 7) == 721 res = self.meta_interp(f, [100, 7]) assert res == 721 - self.check_resops(guard_not_invalidated=0, getfield_gc_r=1, getfield_gc_i=2) + self.check_resops(guard_not_invalidated=2, getfield_gc_r=1, getfield_gc_i=2) # from rpython.jit.metainterp.warmspot import get_stats loops = get_stats().loops @@ -575,5 +575,29 @@ res = self.meta_interp(main, [10]) assert res == main(10) + def test_dont_emit_too_many_guard_not_invalidated(self): + myjitdriver = JitDriver(greens=['foo'], reds=['x', 'total']) + class Foo: + _immutable_fields_ = ['a?', 'b?', 'c?'] + def __init__(self, a): + self.a = a + self.b = a - 1 + self.c = a - 3 + def f(a, x): + foo = Foo(a) + total = 0 + while x > 0: + myjitdriver.jit_merge_point(foo=foo, x=x, total=total) + # read a few quasi-immutable fields out of a Constant + total += foo.a + foo.b + foo.c + x -= 1 + return total + # + res = self.meta_interp(f, [100, 7], enable_opts="") + assert res == f(100, 7) + # there should be no getfields, even though optimizations are turned off + self.check_resops(guard_not_invalidated=1) + + class TestLLtypeGreenFieldsTests(QuasiImmutTests, LLJitMixin): pass diff -Nru pypy-7.1.1+dfsg/rpython/jit/metainterp/test/test_resume.py pypy-7.3.1+dfsg/rpython/jit/metainterp/test/test_resume.py --- pypy-7.1.1+dfsg/rpython/jit/metainterp/test/test_resume.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/metainterp/test/test_resume.py 2020-04-10 19:28:41.000000000 +0000 @@ -1,4 +1,3 @@ -from __future__ import with_statement import py import sys from rpython.rtyper.lltypesystem import lltype, llmemory, rffi @@ -8,7 +7,7 @@ TAGBOX, TAGVIRTUAL, tagged_list_eq, AbstractVirtualInfo, TAGCONST, NULLREF, ResumeDataDirectReader, TAGINT, REF, VirtualInfo, VStructInfo, VArrayInfoNotClear, VStrPlainInfo, VStrConcatInfo, VStrSliceInfo, - VUniPlainInfo, VUniConcatInfo, VUniSliceInfo, capture_resumedata, + VUniPlainInfo, VUniConcatInfo, VUniSliceInfo, ResumeDataLoopMemo, UNASSIGNEDVIRTUAL, INT, annlowlevel, PENDINGFIELDSP, TAG_CONST_OFFSET) from rpython.jit.metainterp.resumecode import ( @@ -19,7 +18,7 @@ from rpython.jit.metainterp.history import ( ConstInt, Const, AbstractDescr, ConstPtr, ConstFloat, IntFrontendOp, RefFrontendOp, CONST_NULL) -from rpython.jit.metainterp.support import adr2int +from rpython.jit.metainterp.support import ptr2int from rpython.jit.metainterp.optimizeopt.test.test_util import LLtypeMixin from rpython.jit.metainterp import executor from rpython.jit.codewriter import longlong @@ -51,21 +50,13 @@ op = op.get_forwarded() return op - def getrawptrinfo(self, op, create=True): - op = self.get_box_replacement(op) - return op.get_forwarded() - - def getptrinfo(self, op, create=True): - op = self.get_box_replacement(op) - return op.get_forwarded() - # ____________________________________________________________ def dump_storage(storage, liveboxes): "For profiling only." debug_start("jit-resume") - return # XXX refactor if needed + return # XXX refactor if needed if have_debug_prints(): debug_print('Log storage', compute_unique_id(storage)) frameinfo = storage.rd_frame_info_list @@ -524,8 +515,10 @@ def __eq__(self, other): return self.__dict__ == other.__dict__ + def __ne__(self, other): return self.__dict__ != other.__dict__ + def __repr__(self): return "" % (self.jitcode, self.pc, self._env) @@ -541,231 +534,6 @@ class options: failargs_limit = 100 -def test_rebuild_from_resumedata(): - py.test.skip("XXX rewrite") - b1, b2, b3 = [BoxInt(), InputArgRef(), BoxInt()] - c1, c2, c3 = [ConstInt(1), ConstInt(2), ConstInt(3)] - storage = Storage() - fs = [FakeFrame("code0", 0, b1, c1, b2), - FakeFrame("code1", 3, b3, c2, b1), - FakeFrame("code2", 9, c3, b2)] - capture_resumedata(fs, None, [], storage) - memo = ResumeDataLoopMemo(FakeMetaInterpStaticData()) - modifier = ResumeDataVirtualAdder(FakeOptimizer(), storage, storage, memo) - liveboxes = modifier.finish() - metainterp = MyMetaInterp() - - b1t, b2t, b3t = [BoxInt(), InputArgRef(), BoxInt()] - newboxes = _resume_remap(liveboxes, [b1, b2, b3], b1t, b2t, b3t) - - result = rebuild_from_resumedata(metainterp, storage, False) - assert result == (None, []) - fs2 = [FakeFrame("code0", 0, b1t, c1, b2t), - FakeFrame("code1", 3, b3t, c2, b1t), - FakeFrame("code2", 9, c3, b2t)] - assert metainterp.framestack == fs2 - -def test_rebuild_from_resumedata_with_virtualizable(): - py.test.skip("XXX rewrite") - b1, b2, b3, b4 = [BoxInt(), InputArgRef(), BoxInt(), InputArgRef()] - c1, c2, c3 = [ConstInt(1), ConstInt(2), ConstInt(3)] - storage = Storage() - fs = [FakeFrame("code0", 0, b1, c1, b2), - FakeFrame("code1", 3, b3, c2, b1), - FakeFrame("code2", 9, c3, b2)] - capture_resumedata(fs, [b4], [], storage) - memo = ResumeDataLoopMemo(FakeMetaInterpStaticData()) - modifier = ResumeDataVirtualAdder(FakeOptimizer({}), storage, memo) - liveboxes = modifier.finish() - metainterp = MyMetaInterp() - - b1t, b2t, b3t, b4t = [BoxInt(), InputArgRef(), BoxInt(), InputArgRef()] - newboxes = _resume_remap(liveboxes, [b1, b2, b3, b4], b1t, b2t, b3t, b4t) - - result = rebuild_from_resumedata(metainterp, newboxes, storage, - True) - assert result == ([b4t], []) - fs2 = [FakeFrame("code0", 0, b1t, c1, b2t), - FakeFrame("code1", 3, b3t, c2, b1t), - FakeFrame("code2", 9, c3, b2t)] - assert metainterp.framestack == fs2 - -def test_rebuild_from_resumedata_two_guards(): - py.test.skip("XXX rewrite") - b1, b2, b3, b4 = [BoxInt(), InputArgRef(), BoxInt(), BoxInt()] - c1, c2, c3 = [ConstInt(1), ConstInt(2), ConstInt(3)] - storage = Storage() - fs = [FakeFrame("code0", 0, b1, c1, b2), - FakeFrame("code1", 3, b3, c2, b1), - FakeFrame("code2", 9, c3, b2)] - capture_resumedata(fs, None, [], storage) - storage2 = Storage() - fs = fs[:-1] + [FakeFrame("code2", 10, c3, b2, b4)] - capture_resumedata(fs, None, [], storage2) - - memo = ResumeDataLoopMemo(FakeMetaInterpStaticData()) - modifier = ResumeDataVirtualAdder(FakeOptimizer({}), storage, memo) - liveboxes = modifier.finish() - - modifier = ResumeDataVirtualAdder(FakeOptimizer({}), storage2, memo) - liveboxes2 = modifier.finish() - - metainterp = MyMetaInterp() - - b1t, b2t, b3t, b4t = [BoxInt(), InputArgRef(), BoxInt(), BoxInt()] - newboxes = _resume_remap(liveboxes, [b1, b2, b3], b1t, b2t, b3t) - - result = rebuild_from_resumedata(metainterp, newboxes, storage, - False) - assert result == (None, []) - fs2 = [FakeFrame("code0", 0, b1t, c1, b2t), - FakeFrame("code1", 3, b3t, c2, b1t), - FakeFrame("code2", 9, c3, b2t)] - assert metainterp.framestack == fs2 - - newboxes = _resume_remap(liveboxes2, [b1, b2, b3, b4], b1t, b2t, b3t, b4t) - - metainterp.framestack = [] - result = rebuild_from_resumedata(metainterp, newboxes, storage2, - False) - assert result == (None, []) - fs2 = fs2[:-1] + [FakeFrame("code2", 10, c3, b2t, b4t)] - assert metainterp.framestack == fs2 - - -class FakeOptimizer_VirtualValue(object): - class optimizer: - class cpu: - pass -fakeoptimizer = FakeOptimizer_VirtualValue() - -def ConstAddr(addr): # compatibility - return ConstInt(adr2int(addr)) - -def virtual_value(keybox, value, next): - vv = VirtualValue( - fakeoptimizer, ConstAddr(LLtypeMixin.node_vtable_adr), keybox) - if not isinstance(next, OptValue): - next = OptValue(next) - vv.setfield(LLtypeMixin.valuedescr, OptValue(value)) - vv.setfield(LLtypeMixin.nextdescr, next) - return vv - -def test_rebuild_from_resumedata_two_guards_w_virtuals(): - py.test.skip("XXX rewrite") - - b1, b2, b3, b4, b5 = [BoxInt(), InputArgRef(), BoxInt(), BoxInt(), BoxInt()] - c1, c2, c3, c4 = [ConstInt(1), ConstInt(2), ConstInt(3), - LLtypeMixin.nodebox.constbox()] - storage = Storage() - fs = [FakeFrame("code0", 0, b1, c1, b2), - FakeFrame("code1", 3, b3, c2, b1), - FakeFrame("code2", 9, c3, b2)] - capture_resumedata(fs, None, [], storage) - storage2 = Storage() - fs = fs[:-1] + [FakeFrame("code2", 10, c3, b2, b4)] - capture_resumedata(fs, None, [], storage2) - - memo = ResumeDataLoopMemo(FakeMetaInterpStaticData()) - values = {b2: virtual_value(b2, b5, c4)} - modifier = ResumeDataVirtualAdder(FakeOptimizer(values), storage, memo) - liveboxes = modifier.finish() - assert len(storage.rd_virtuals) == 1 - assert storage.rd_virtuals[0].fieldnums == [tag(-1, TAGBOX), - tag(0, TAGCONST)] - - b6 = InputArgRef() - v6 = virtual_value(b6, c2, None) - v6.setfield(LLtypeMixin.nextdescr, v6) - values = {b2: virtual_value(b2, b4, v6), b6: v6} - memo.clear_box_virtual_numbers() - modifier = ResumeDataVirtualAdder(FakeOptimizer(values), storage2, memo) - liveboxes2 = modifier.finish() - assert len(storage2.rd_virtuals) == 2 - assert storage2.rd_virtuals[0].fieldnums == [tag(len(liveboxes2)-1, TAGBOX), - tag(-1, TAGVIRTUAL)] - assert storage2.rd_virtuals[1].fieldnums == [tag(2, TAGINT), - tag(-1, TAGVIRTUAL)] - - # now on to resuming - metainterp = MyMetaInterp() - - b1t, b3t, b4t, b5t = [BoxInt(), BoxInt(), BoxInt(), BoxInt()] - newboxes = _resume_remap(liveboxes, [b1, b3, b5], b1t, b3t, b5t) - - result = rebuild_from_resumedata(metainterp, newboxes, storage, - False) - - b2t = metainterp.resboxes[0] - fs2 = [FakeFrame("code0", 0, b1t, c1, b2t), - FakeFrame("code1", 3, b3t, c2, b1t), - FakeFrame("code2", 9, c3, b2t)] - assert metainterp.framestack == fs2 - - newboxes = _resume_remap(liveboxes2, [b1, b3, b4], b1t, b3t, b4t) - - metainterp = MyMetaInterp() - result = rebuild_from_resumedata(metainterp, newboxes, storage2, - False) - b2t = metainterp.resboxes[0] - assert len(metainterp.resboxes) == 2 - fs2 = [FakeFrame("code0", 0, b1t, c1, b2t), - FakeFrame("code1", 3, b3t, c2, b1t), - FakeFrame("code2", 10, c3, b2t, b4t)] - assert metainterp.framestack == fs2 - -def test_rebuild_from_resumedata_two_guards_w_shared_virtuals(): - py.test.skip("XXX rewrite") - b1, b2, b3, b4, b5, b6 = [InputArgRef(), InputArgRef(), BoxInt(), InputArgRef(), BoxInt(), BoxInt()] - c1, c2, c3, c4 = [ConstInt(1), ConstInt(2), ConstInt(3), - LLtypeMixin.nodebox.constbox()] - storage = Storage() - fs = [FakeFrame("code0", 0, c1, b2, b3)] - capture_resumedata(fs, None, [], storage) - - memo = ResumeDataLoopMemo(FakeMetaInterpStaticData()) - values = {b2: virtual_value(b2, b5, c4)} - modifier = ResumeDataVirtualAdder(FakeOptimizer(values), storage, memo) - liveboxes = modifier.finish() - assert len(storage.rd_virtuals) == 1 - assert storage.rd_virtuals[0].fieldnums == [tag(-1, TAGBOX), - tag(0, TAGCONST)] - - storage2 = Storage() - fs = [FakeFrame("code0", 0, b1, b4, b2)] - capture_resumedata(fs, None, [], storage2) - values[b4] = virtual_value(b4, b6, c4) - modifier = ResumeDataVirtualAdder(FakeOptimizer(values), storage2, memo) - liveboxes = modifier.finish() - assert len(storage2.rd_virtuals) == 2 - assert storage2.rd_virtuals[1].fieldnums == storage.rd_virtuals[0].fieldnums - assert storage2.rd_virtuals[1] is storage.rd_virtuals[0] - - -def test_resumedata_top_recursive_virtuals(): - py.test.skip("XXX rewrite") - b1, b2, b3 = [InputArgRef(), InputArgRef(), BoxInt()] - storage = Storage() - fs = [FakeFrame("code0", 0, b1, b2)] - capture_resumedata(fs, None, [], storage) - - memo = ResumeDataLoopMemo(FakeMetaInterpStaticData()) - v1 = virtual_value(b1, b3, None) - v2 = virtual_value(b2, b3, v1) - v1.setfield(LLtypeMixin.nextdescr, v2) - values = {b1: v1, b2: v2} - modifier = ResumeDataVirtualAdder(FakeOptimizer(values), storage, memo) - liveboxes = modifier.finish() - assert liveboxes == [b3] - assert len(storage.rd_virtuals) == 2 - assert storage.rd_virtuals[0].fieldnums == [tag(-1, TAGBOX), - tag(1, TAGVIRTUAL)] - assert storage.rd_virtuals[1].fieldnums == [tag(-1, TAGBOX), - tag(0, TAGVIRTUAL)] - - -# ____________________________________________________________ - def test_ResumeDataLoopMemo_ints(): memo = ResumeDataLoopMemo(FakeMetaInterpStaticData()) @@ -848,7 +616,7 @@ iter = t.get_iter() b1, b2, b3, b4, b5 = iter.inputargs - numb_state = memo.number(FakeOptimizer(), 0, iter) + numb_state = memo.number(0, iter) numb = numb_state.create_numbering() assert numb_state.num_virtuals == 0 @@ -864,7 +632,7 @@ False, [], []) snap2.prev = snap - numb_state2 = memo.number(FakeOptimizer(), 1, iter) + numb_state2 = memo.number(1, iter) numb2 = numb_state2.create_numbering() assert numb_state2.num_virtuals == 0 @@ -879,16 +647,16 @@ False, [], env3) snap3.prev = snap - class FakeVirtualInfo(info.AbstractInfo): + class FakeVirtualInfo(info.AbstractVirtualPtrInfo): def __init__(self, virt): - self.virt = virt + self._is_virtual = virt def is_virtual(self): - return self.virt + return self._is_virtual # renamed b3.set_forwarded(c4) - numb_state3 = memo.number(FakeOptimizer(), 2, iter) + numb_state3 = memo.number(2, iter) numb3 = numb_state3.create_numbering() assert numb_state3.num_virtuals == 0 @@ -904,7 +672,7 @@ snap4.prev = snap b4.set_forwarded(FakeVirtualInfo(True)) - numb_state4 = memo.number(FakeOptimizer(), 3, iter) + numb_state4 = memo.number(3, iter) numb4 = numb_state4.create_numbering() assert numb_state4.num_virtuals == 1 @@ -923,7 +691,7 @@ b4.set_forwarded(FakeVirtualInfo(True)) b5.set_forwarded(FakeVirtualInfo(True)) - numb_state5 = memo.number(FakeOptimizer(), 4, iter) + numb_state5 = memo.number(4, iter) numb5 = numb_state5.create_numbering() assert numb_state5.num_virtuals == 2 @@ -935,8 +703,9 @@ 2, 1, tag(3, TAGINT), tag(0, TAGVIRTUAL), tag(0, TAGBOX), tag(3, TAGINT) ] + [0, 0] -@given(strategies.lists(strategies.builds(IntFrontendOp, strategies.just(0)) | intconsts, - min_size=1)) +@given(strategies.lists( + strategies.builds(IntFrontendOp, strategies.just(0)) | intconsts, + min_size=1)) def test_ResumeDataLoopMemo_random(lst): inpargs = [box for box in lst if not isinstance(box, Const)] metainterp_sd = FakeMetaInterpStaticData() @@ -945,7 +714,7 @@ i = t.get_iter() t.create_top_snapshot(FakeJitCode("", 0), 0, Frame(lst), False, [], []) memo = ResumeDataLoopMemo(metainterp_sd) - numb_state = memo.number(FakeOptimizer(), 0, i) + numb_state = memo.number(0, i) numb = numb_state.create_numbering() l = unpack_numbering(numb) assert l[0] == len(l) @@ -1202,7 +971,7 @@ def test_virtual_adder_make_virtual(): - b2s, b3s, b4s, b5s = [IntFrontendOp(0), IntFrontendOp(0), RefFrontendOp(0), + b2s, b3s, b4s, b5s = [RefFrontendOp(0), IntFrontendOp(0), RefFrontendOp(0), RefFrontendOp(0)] c1s = ConstInt(111) storage = Storage() @@ -1213,13 +982,13 @@ modifier.vfieldboxes = {} vdescr = LLtypeMixin.nodesize2 - ca = ConstAddr(LLtypeMixin.node_vtable_adr2) + ca = ConstInt(ptr2int(LLtypeMixin.node_vtable2)) v4 = info.InstancePtrInfo(vdescr, ca, True) b4s.set_forwarded(v4) v4.setfield(LLtypeMixin.nextdescr, ca, b2s) v4.setfield(LLtypeMixin.valuedescr, ca, b3s) v4.setfield(LLtypeMixin.otherdescr, ca, b5s) - ca = ConstAddr(LLtypeMixin.node_vtable_adr) + ca = ConstInt(ptr2int(LLtypeMixin.node_vtable)) v2 = info.InstancePtrInfo(LLtypeMixin.nodesize, ca, True) v2.setfield(LLtypeMixin.nextdescr, b4s, ca) v2.setfield(LLtypeMixin.valuedescr, c1s, ca) @@ -1229,7 +998,7 @@ modifier.register_virtual_fields(b4s, [b3s, None, None, None, b2s, b5s]) liveboxes = [] - modifier._number_virtuals(liveboxes, FakeOptimizer(), 0) + modifier._number_virtuals(liveboxes, 0) storage.rd_consts = memo.consts[:] storage.rd_numb = Numbering([0]) # resume @@ -1284,7 +1053,7 @@ del Const.__eq__ def test_virtual_adder_make_varray(): - b2s, b4s = [IntFrontendOp(0), IntFrontendOp(0)] + b2s, b4s = [RefFrontendOp(0), IntFrontendOp(0)] b4s.setint(4) c1s = ConstInt(111) storage = Storage() @@ -1299,7 +1068,7 @@ v2._items = [b4s, c1s] modifier.register_virtual_fields(b2s, [b4s, c1s]) liveboxes = [] - modifier._number_virtuals(liveboxes, FakeOptimizer(), 0) + modifier._number_virtuals(liveboxes, 0) dump_storage(storage, liveboxes) storage.rd_consts = memo.consts[:] storage.rd_numb = Numbering([0]) @@ -1352,7 +1121,7 @@ v2.setfield(LLtypeMixin.bdescr, b2s, b4s) modifier.register_virtual_fields(b2s, [c1s, c1s, b4s]) liveboxes = [] - modifier._number_virtuals(liveboxes, FakeOptimizer(), 0) + modifier._number_virtuals(liveboxes, 0) dump_storage(storage, liveboxes) storage.rd_consts = memo.consts[:] storage.rd_numb = Numbering([0]) @@ -1396,9 +1165,9 @@ modifier.register_box(b4s) liveboxes = [] - modifier._number_virtuals(liveboxes, FakeOptimizer(), 0) + modifier._number_virtuals(liveboxes, 0) assert liveboxes == [b2s, b4s] or liveboxes == [b4s, b2s] - modifier._add_pending_fields(FakeOptimizer(), [ + modifier._add_pending_fields([ ResOperation(rop.SETFIELD_GC, [b2s, b4s], descr=LLtypeMixin.nextdescr)]) storage.rd_consts = memo.consts[:] storage.rd_numb = Numbering([0]) @@ -1427,7 +1196,7 @@ pass storage = Storage() modifier = ResumeDataVirtualAdder(None, storage, storage, None, None) - modifier._add_pending_fields(None, []) + modifier._add_pending_fields([]) assert not storage.rd_pendingfields # class FieldDescr(AbstractDescr): @@ -1440,9 +1209,8 @@ b = IntFrontendOp(0) modifier.liveboxes_from_env = {a: rffi.cast(rffi.SHORT, 1042), b: rffi.cast(rffi.SHORT, 1061)} - modifier._add_pending_fields(FakeOptimizer(), [ - ResOperation(rop.SETFIELD_GC, [a, b], - descr=field_a)]) + modifier._add_pending_fields( + [ResOperation(rop.SETFIELD_GC, [a, b], descr=field_a)]) pf = storage.rd_pendingfields assert len(pf) == 1 assert (annlowlevel.cast_base_ptr_to_instance(FieldDescr, pf[0].lldescr) @@ -1462,7 +1230,7 @@ a61: rffi.cast(rffi.SHORT, 1061), a62: rffi.cast(rffi.SHORT, 1062), a63: rffi.cast(rffi.SHORT, 1063)} - modifier._add_pending_fields(FakeOptimizer(), [ + modifier._add_pending_fields([ ResOperation(rop.SETARRAYITEM_GC, [a42, ConstInt(0), a61], descr=array_a), ResOperation(rop.SETARRAYITEM_GC, [a42, ConstInt(2147483647), a62], @@ -1481,11 +1249,10 @@ assert rffi.cast(lltype.Signed, pf[1].itemindex) == 2147483647 # if sys.maxint >= 2147483648: - py.test.raises(TagOverflow, modifier._add_pending_fields, - FakeOptimizer(), - [ResOperation(rop.SETARRAYITEM_GC, - [a42, ConstInt(2147483648), a63], - descr=array_a)]) + with py.test.raises(TagOverflow): + modifier._add_pending_fields( + [ResOperation(rop.SETARRAYITEM_GC, + [a42, ConstInt(2147483648), a63], descr=array_a)]) def test_resume_reader_fields_and_arrayitems(): class ResumeReader(AbstractResumeDataReader): @@ -1556,4 +1323,3 @@ assert not modifier._invalidation_needed(10, 2) assert not modifier._invalidation_needed(10, 3) assert modifier._invalidation_needed(10, 4) - diff -Nru pypy-7.1.1+dfsg/rpython/jit/metainterp/test/test_threadlocal.py pypy-7.3.1+dfsg/rpython/jit/metainterp/test/test_threadlocal.py --- pypy-7.1.1+dfsg/rpython/jit/metainterp/test/test_threadlocal.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/metainterp/test/test_threadlocal.py 2020-04-10 19:28:41.000000000 +0000 @@ -27,6 +27,16 @@ res = self.interp_operations(f, []) assert res == 0x92 + def test_threadlocalref_get_loopinvariant(self): + tlfield = rthread.ThreadLocalField(lltype.Signed, 'foobar_test_', True) + + def f(): + tlfield.setraw(0x544c) + return tlfield.getraw() + tlfield.getraw() + + res = self.interp_operations(f, []) + assert res == 0x544c * 2 + self.check_operations_history(call_loopinvariant_i=1) class TestLLtype(ThreadLocalTest, LLJitMixin): pass diff -Nru pypy-7.1.1+dfsg/rpython/jit/metainterp/test/test_tracingopts.py pypy-7.3.1+dfsg/rpython/jit/metainterp/test/test_tracingopts.py --- pypy-7.1.1+dfsg/rpython/jit/metainterp/test/test_tracingopts.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/metainterp/test/test_tracingopts.py 2020-04-10 19:28:41.000000000 +0000 @@ -431,6 +431,43 @@ self.check_history(getarrayitem_gc_i=0, getfield_gc_i=0, getfield_gc_r=0) + + def test_nonstandard_virtualizable(self): + myjitdriver = jit.JitDriver(greens = [], reds = ['n', 'x', 'i', 'frame'], + virtualizables = ['frame']) + + class Frame(object): + _virtualizable_ = ['s'] + + def __init__(self, s): + self.s = s + self.next = None + + def f(n, a, i): + frame = Frame(5) + x = 0 + while n > 0: + myjitdriver.can_enter_jit(frame=frame, n=n, x=x, i=i) + myjitdriver.jit_merge_point(frame=frame, n=n, x=x, i=i) + n -= 1 + s = frame.s + assert s >= 0 + frame.s += 1 + # make a new frame + f = Frame(7) + frame.next = f + x += f.s + frame.s -= 1 + frame.next = None + return x + + res = self.meta_interp(f, [10, 1, 1], listops=True) + assert res == f(10, 1, 1) + # we now that f is not the standard virtualizable, since we've seen its + # allocation + self.check_history(ptr_eq=0) + + def test_heap_caching_array_pure(self): class A(object): pass @@ -476,7 +513,6 @@ res = self.interp_operations(fn, [-7]) assert res == -7 + 7 self.check_operations_history(getfield_gc_i=0) - return def test_heap_caching_multiple_objects(self): class Gbl(object): @@ -537,6 +573,31 @@ assert res == 10 self.check_operations_history(quasiimmut_field=1) + def test_heap_caching_quasi_immutable_2(self): + class A: + _immutable_fields_ = ['x?'] + a1 = A() + a1.x = 5 + a2 = A() + a2.x = 7 + + @jit.elidable + def get(n): + if n > 0: + return a1 + return a2 + + def g(a): + return a.x + + def fn(n): + jit.promote(n) + return get(n).x + get(n).x + res = self.interp_operations(fn, [7]) + assert res == 10 + self.check_operations_history(quasiimmut_field=1) + + def test_heap_caching_multiple_tuples(self): class Gbl(object): @@ -770,3 +831,31 @@ assert res == 2 * 14 self.check_operations_history(getfield_gc_i=1) + def test_loop_invariant1(self): + class A(object): + pass + a = A() + a.current_a = A() + a.current_a.x = 1 + @jit.loop_invariant + def f(): + return a.current_a + + @jit.loop_invariant + def f1(): + return a.current_a + + def g(x): + res = 0 + res += f().x + res += f().x + res += f().x + res += f1().x # not reused! + res += f1().x + if x > 1000: + a.current_a = A() + a.current_a.x = 2 + return res + res = self.interp_operations(g, [21]) + assert res == g(21) + self.check_operations_history(call_loopinvariant_r=2) diff -Nru pypy-7.1.1+dfsg/rpython/jit/metainterp/test/test_virtualizable.py pypy-7.3.1+dfsg/rpython/jit/metainterp/test/test_virtualizable.py --- pypy-7.1.1+dfsg/rpython/jit/metainterp/test/test_virtualizable.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/metainterp/test/test_virtualizable.py 2020-04-10 19:28:41.000000000 +0000 @@ -1226,7 +1226,7 @@ res = self.meta_interp(f, [10]) assert res == 55 self.check_resops(new_with_vtable=0, ptr_eq=1) - self.check_history(ptr_eq=2) + self.check_history(ptr_eq=1) def test_virtual_child_frame_with_arrays(self): myjitdriver = JitDriver(greens = [], reds = ['frame'], diff -Nru pypy-7.1.1+dfsg/rpython/jit/metainterp/warmspot.py pypy-7.3.1+dfsg/rpython/jit/metainterp/warmspot.py --- pypy-7.1.1+dfsg/rpython/jit/metainterp/warmspot.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/metainterp/warmspot.py 2020-04-10 19:28:41.000000000 +0000 @@ -425,9 +425,9 @@ graph = copygraph(graph) [jmpp] = find_jit_merge_points([graph]) graph.startblock = support.split_before_jit_merge_point(*jmpp) - # XXX this is incredibly obscure, but this is sometiems necessary + # XXX this is incredibly obscure, but this is sometimes necessary # so we don't explode in checkgraph. for reasons unknown this - # is not contanied within simplify_graph + # is not contained within simplify_graph removenoops.remove_same_as(graph) # a crash in the following checkgraph() means that you forgot # to list some variable in greens=[] or reds=[] in JitDriver, diff -Nru pypy-7.1.1+dfsg/rpython/jit/tool/jitoutput.py pypy-7.3.1+dfsg/rpython/jit/tool/jitoutput.py --- pypy-7.1.1+dfsg/rpython/jit/tool/jitoutput.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/tool/jitoutput.py 2020-04-10 19:28:41.000000000 +0000 @@ -12,6 +12,7 @@ (('backend_no', 'backend_time'), '^Backend:\s+([\d.]+)\s+([\d.]+)$'), (None, '^TOTAL.*$'), (('ops.total',), '^ops:\s+(\d+)$'), + (('heapcached_ops', ), '^heapcached ops:\s+(\d+)$'), (('recorded_ops.total',), '^recorded ops:\s+(\d+)$'), (('recorded_ops.calls',), '^\s+calls:\s+(\d+)$'), (('guards',), '^guards:\s+(\d+)$'), diff -Nru pypy-7.1.1+dfsg/rpython/jit/tool/test/test_jitoutput.py pypy-7.3.1+dfsg/rpython/jit/tool/test/test_jitoutput.py --- pypy-7.1.1+dfsg/rpython/jit/tool/test/test_jitoutput.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/jit/tool/test/test_jitoutput.py 2020-04-10 19:28:41.000000000 +0000 @@ -47,6 +47,7 @@ Backend: 1 0.000525 TOTAL: 0.025532 ops: 2 +heapcached ops: 111 recorded ops: 6 calls: 3 guards: 1 @@ -77,6 +78,7 @@ assert info.backend_no == 1 assert info.backend_time == 0.000525 assert info.ops.total == 2 + assert info.heapcached_ops == 111 assert info.recorded_ops.total == 6 assert info.recorded_ops.calls == 3 assert info.guards == 1 diff -Nru pypy-7.1.1+dfsg/rpython/memory/gc/base.py pypy-7.3.1+dfsg/rpython/memory/gc/base.py --- pypy-7.1.1+dfsg/rpython/memory/gc/base.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/memory/gc/base.py 2020-04-10 19:28:41.000000000 +0000 @@ -23,6 +23,7 @@ can_usually_pin_objects = False object_minimal_size = 0 gcflag_extra = 0 # or a dedicated GC flag that the GC initializes to 0 + gcflag_dummy = 0 # dedicated GC flag set only on rmodel.ll_dummy_value _totalroots_rpy = 0 # for inspector.py def __init__(self, config, chunk_size=DEFAULT_CHUNK_SIZE, diff -Nru pypy-7.1.1+dfsg/rpython/memory/gc/env.py pypy-7.3.1+dfsg/rpython/memory/gc/env.py --- pypy-7.1.1+dfsg/rpython/memory/gc/env.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/memory/gc/env.py 2020-04-10 19:28:41.000000000 +0000 @@ -137,8 +137,8 @@ return get_L2cache_linux2_cpuinfo() if arch in ('alpha', 'ppc'): return get_L2cache_linux2_cpuinfo(label='L2 cache') - if arch in ('s390x'): - return get_L2cache_linux2_cpuinfo_s390x() + #if arch == 's390x': untested + # return get_L2cache_linux2_cpuinfo_s390x() if arch == 'ia64': return get_L2cache_linux2_ia64() if arch in ('parisc', 'parisc64'): diff -Nru pypy-7.1.1+dfsg/rpython/memory/gc/incminimark.py pypy-7.3.1+dfsg/rpython/memory/gc/incminimark.py --- pypy-7.1.1+dfsg/rpython/memory/gc/incminimark.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/memory/gc/incminimark.py 2020-04-10 19:28:41.000000000 +0000 @@ -162,7 +162,11 @@ # It does not need an additional copy in trace out GCFLAG_SHADOW_INITIALIZED = first_gcflag << 11 -_GCFLAG_FIRST_UNUSED = first_gcflag << 12 # the first unused bit +# another flag set only on specific objects: the ll_dummy_value from +# rpython.rtyper.rmodel +GCFLAG_DUMMY = first_gcflag << 12 + +_GCFLAG_FIRST_UNUSED = first_gcflag << 13 # the first unused bit # States for the incremental GC @@ -203,6 +207,7 @@ can_usually_pin_objects = True malloc_zero_filled = False gcflag_extra = GCFLAG_EXTRA + gcflag_dummy = GCFLAG_DUMMY # All objects start with a HDR, i.e. with a field 'tid' which contains # a word. This word is divided in two halves: the lower half contains diff -Nru pypy-7.1.1+dfsg/rpython/memory/gc/minimark.py pypy-7.3.1+dfsg/rpython/memory/gc/minimark.py --- pypy-7.1.1+dfsg/rpython/memory/gc/minimark.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/memory/gc/minimark.py 2020-04-10 19:28:41.000000000 +0000 @@ -122,7 +122,11 @@ # note that GCFLAG_CARDS_SET is the most significant bit of a byte: # this is required for the JIT (x86) -_GCFLAG_FIRST_UNUSED = first_gcflag << 8 # the first unused bit +# another flag set only on specific objects: the ll_dummy_value from +# rpython.rtyper.rmodel +GCFLAG_DUMMY = first_gcflag << 8 + +_GCFLAG_FIRST_UNUSED = first_gcflag << 9 # the first unused bit FORWARDSTUB = lltype.GcStruct('forwarding_stub', @@ -140,6 +144,7 @@ prebuilt_gc_objects_are_static_roots = False malloc_zero_filled = True # xxx experiment with False gcflag_extra = GCFLAG_EXTRA + gcflag_dummy = GCFLAG_DUMMY # All objects start with a HDR, i.e. with a field 'tid' which contains # a word. This word is divided in two halves: the lower half contains diff -Nru pypy-7.1.1+dfsg/rpython/memory/gctransform/asmgcroot.py pypy-7.3.1+dfsg/rpython/memory/gctransform/asmgcroot.py --- pypy-7.1.1+dfsg/rpython/memory/gctransform/asmgcroot.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/memory/gctransform/asmgcroot.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,870 +0,0 @@ -from rpython.flowspace.model import (Constant, Variable, Block, Link, - copygraph, SpaceOperation, checkgraph) -from rpython.rlib.debug import ll_assert -from rpython.rlib.nonconst import NonConstant -from rpython.rlib import rgil -from rpython.rtyper.annlowlevel import llhelper -from rpython.rtyper.lltypesystem import lltype, llmemory, rffi -from rpython.rtyper.lltypesystem.lloperation import llop -from rpython.memory.gctransform.framework import ( - BaseFrameworkGCTransformer, BaseRootWalker) -from rpython.rtyper.llannotation import SomeAddress -from rpython.rtyper.rbuiltin import gen_cast -from rpython.translator.unsimplify import varoftype -from rpython.translator.tool.cbuild import ExternalCompilationInfo -import sys - - -# -# This transformer avoids the use of a shadow stack in a completely -# platform-specific way, by directing genc to insert asm() special -# instructions in the C source, which are recognized by GCC. -# The .s file produced by GCC is then parsed by trackgcroot.py. -# - -IS_64_BITS = sys.maxint > 2147483647 - -class AsmGcRootFrameworkGCTransformer(BaseFrameworkGCTransformer): - _asmgcc_save_restore_arguments = None - - def push_roots(self, hop, keep_current_args=False): - livevars = self.get_livevars_for_roots(hop, keep_current_args) - self.num_pushs += len(livevars) - return livevars - - def pop_roots(self, hop, livevars): - if not livevars: - return - # mark the values as gc roots - for var in livevars: - v_adr = gen_cast(hop.llops, llmemory.Address, var) - v_newaddr = hop.genop("direct_call", [c_asm_gcroot, v_adr], - resulttype=llmemory.Address) - hop.genop("gc_reload_possibly_moved", [v_newaddr, var]) - - def build_root_walker(self): - return AsmStackRootWalker(self) - - def mark_call_cannotcollect(self, hop, name): - hop.genop("direct_call", [c_asm_nocollect, name]) - - def gct_direct_call(self, hop): - # just a sanity check: if we find a fnptr with the hint on the - # _callable, then we'd also find the hint by looking only at the - # graph. We'll actually change this graph only later, in - # start_transforming_graph(). - fnptr = hop.spaceop.args[0].value - try: - close_stack = fnptr._obj._callable._gctransformer_hint_close_stack_ - except AttributeError: - pass - else: - assert fnptr._obj.graph.func is fnptr._obj._callable - BaseFrameworkGCTransformer.gct_direct_call(self, hop) - - def start_transforming_graph(self, graph): - try: - close_stack = graph.func._gctransformer_hint_close_stack_ - except AttributeError: - close_stack = False - if close_stack: - self._transform_hint_close_stack(graph) - - def _transform_hint_close_stack(self, graph): - # We cannot easily pass variable amount of arguments of the call - # across the call to the pypy_asm_stackwalk helper. So we store - # them away and restore them. More precisely, we need to - # replace 'graph' with code that saves the arguments, and make - # a new graph that starts with restoring the arguments. - if self._asmgcc_save_restore_arguments is None: - self._asmgcc_save_restore_arguments = {} - sradict = self._asmgcc_save_restore_arguments - sra = [] # list of pointers to raw-malloced containers for args - seen = {} - ARGS = [v.concretetype for v in graph.getargs()] - for TYPE in ARGS: - if isinstance(TYPE, lltype.Ptr): - TYPE = llmemory.Address - num = seen.get(TYPE, 0) - seen[TYPE] = num + 1 - key = (TYPE, num) - if key not in sradict: - CONTAINER = lltype.FixedSizeArray(TYPE, 1) - p = lltype.malloc(CONTAINER, flavor='raw', zero=True, - immortal=True) - sradict[key] = Constant(p, lltype.Ptr(CONTAINER)) - sra.append(sradict[key]) - # - # make a copy of the graph that will reload the values - graph2 = copygraph(graph) - del graph2.func # otherwise, start_transforming_graph() will - # again transform graph2, and we get an - # infinite loop - # - # edit the original graph to only store the value of the arguments - block = Block(graph.startblock.inputargs) - c_item0 = Constant('item0', lltype.Void) - assert len(block.inputargs) == len(sra) - for v_arg, c_p in zip(block.inputargs, sra): - if isinstance(v_arg.concretetype, lltype.Ptr): - v_adr = varoftype(llmemory.Address) - block.operations.append( - SpaceOperation("cast_ptr_to_adr", [v_arg], v_adr)) - v_arg = v_adr - v_void = varoftype(lltype.Void) - block.operations.append( - SpaceOperation("bare_setfield", [c_p, c_item0, v_arg], v_void)) - # - # call asm_stackwalk(graph2) - RESULT = graph.getreturnvar().concretetype - FUNC2 = lltype.FuncType([], RESULT) - fnptr2 = lltype.functionptr(FUNC2, - graph.name + '_reload', - graph=graph2) - c_fnptr2 = Constant(fnptr2, lltype.Ptr(FUNC2)) - HELPERFUNC = lltype.FuncType([lltype.Ptr(FUNC2), - ASM_FRAMEDATA_HEAD_PTR], RESULT) - v_asm_stackwalk = varoftype(lltype.Ptr(HELPERFUNC), "asm_stackwalk") - block.operations.append( - SpaceOperation("cast_pointer", [c_asm_stackwalk], v_asm_stackwalk)) - v_result = varoftype(RESULT) - block.operations.append( - SpaceOperation("indirect_call", [v_asm_stackwalk, c_fnptr2, - c_gcrootanchor, - Constant(None, lltype.Void)], - v_result)) - block.closeblock(Link([v_result], graph.returnblock)) - graph.startblock = block - # - # edit the copy of the graph to reload the values - block2 = graph2.startblock - block1 = Block([]) - reloadedvars = [] - for v, c_p in zip(block2.inputargs, sra): - v = v.copy() - if isinstance(v.concretetype, lltype.Ptr): - w = varoftype(llmemory.Address) - else: - w = v - block1.operations.append(SpaceOperation('getfield', - [c_p, c_item0], w)) - if w is not v: - block1.operations.append(SpaceOperation('cast_adr_to_ptr', - [w], v)) - reloadedvars.append(v) - block1.closeblock(Link(reloadedvars, block2)) - graph2.startblock = block1 - # - checkgraph(graph) - checkgraph(graph2) - - -class AsmStackRootWalker(BaseRootWalker): - - def __init__(self, gctransformer): - BaseRootWalker.__init__(self, gctransformer) - - def _asm_callback(): - self.walk_stack_from() - self._asm_callback = _asm_callback - self._shape_decompressor = ShapeDecompressor() - self._with_jit = hasattr(gctransformer.translator, '_jit2gc') - if self._with_jit: - jit2gc = gctransformer.translator._jit2gc - self.frame_tid = jit2gc['frame_tid'] - self.gctransformer = gctransformer - # - # unless overridden in need_thread_support(): - self.belongs_to_current_thread = lambda framedata: True - - def need_stacklet_support(self, gctransformer, getfn): - from rpython.annotator import model as annmodel - from rpython.rlib import _stacklet_asmgcc - # stacklet support: BIG HACK for rlib.rstacklet - _stacklet_asmgcc._asmstackrootwalker = self # as a global! argh - _stacklet_asmgcc.complete_destrptr(gctransformer) - # - def gc_detach_callback_pieces(): - anchor = llmemory.cast_ptr_to_adr(gcrootanchor) - result = llmemory.NULL - framedata = anchor.address[1] - while framedata != anchor: - next = framedata.address[1] - if self.belongs_to_current_thread(framedata): - # detach it - prev = framedata.address[0] - prev.address[1] = next - next.address[0] = prev - # update the global stack counter - rffi.stackcounter.stacks_counter -= 1 - # reattach framedata into the singly-linked list 'result' - framedata.address[0] = rffi.cast(llmemory.Address, -1) - framedata.address[1] = result - result = framedata - framedata = next - return result - # - def gc_reattach_callback_pieces(pieces): - anchor = llmemory.cast_ptr_to_adr(gcrootanchor) - while pieces != llmemory.NULL: - framedata = pieces - pieces = pieces.address[1] - # attach 'framedata' into the normal doubly-linked list - following = anchor.address[1] - following.address[0] = framedata - framedata.address[1] = following - anchor.address[1] = framedata - framedata.address[0] = anchor - # update the global stack counter - rffi.stackcounter.stacks_counter += 1 - # - s_addr = SomeAddress() - s_None = annmodel.s_None - self.gc_detach_callback_pieces_ptr = getfn(gc_detach_callback_pieces, - [], s_addr) - self.gc_reattach_callback_pieces_ptr=getfn(gc_reattach_callback_pieces, - [s_addr], s_None) - - def need_thread_support(self, gctransformer, getfn): - # Threads supported "out of the box" by the rest of the code. - # The whole code in this function is only there to support - # fork()ing in a multithreaded process :-( - # For this, we need to handle gc_thread_start and gc_thread_die - # to record the mapping {thread_id: stack_start}, and - # gc_thread_before_fork and gc_thread_after_fork to get rid of - # all ASM_FRAMEDATA structures that do no belong to the current - # thread after a fork(). - from rpython.rlib import rthread - from rpython.memory.support import AddressDict - from rpython.memory.support import copy_without_null_values - from rpython.annotator import model as annmodel - gcdata = self.gcdata - - def get_aid(): - """Return the thread identifier, cast to an (opaque) address.""" - return llmemory.cast_int_to_adr(rthread.get_ident()) - - def thread_start(): - value = llmemory.cast_int_to_adr(llop.stack_current(lltype.Signed)) - gcdata.aid2stack.setitem(get_aid(), value) - thread_start._always_inline_ = True - - def thread_setup(): - gcdata.aid2stack = AddressDict() - gcdata.dead_threads_count = 0 - # to also register the main thread's stack - thread_start() - thread_setup._always_inline_ = True - - def thread_die(): - gcdata.aid2stack.setitem(get_aid(), llmemory.NULL) - # from time to time, rehash the dictionary to remove - # old NULL entries - gcdata.dead_threads_count += 1 - if (gcdata.dead_threads_count & 511) == 0: - copy = copy_without_null_values(gcdata.aid2stack) - gcdata.aid2stack.delete() - gcdata.aid2stack = copy - - def belongs_to_current_thread(framedata): - # xxx obscure: the answer is Yes if, as a pointer, framedata - # lies between the start of the current stack and the top of it. - stack_start = gcdata.aid2stack.get(get_aid(), llmemory.NULL) - ll_assert(stack_start != llmemory.NULL, - "current thread not found in gcdata.aid2stack!") - stack_stop = llmemory.cast_int_to_adr( - llop.stack_current(lltype.Signed)) - return (stack_start <= framedata <= stack_stop or - stack_start >= framedata >= stack_stop) - self.belongs_to_current_thread = belongs_to_current_thread - - def thread_before_fork(): - # before fork(): collect all ASM_FRAMEDATA structures that do - # not belong to the current thread, and move them out of the - # way, i.e. out of the main circular doubly linked list. - detached_pieces = llmemory.NULL - anchor = llmemory.cast_ptr_to_adr(gcrootanchor) - initialframedata = anchor.address[1] - while initialframedata != anchor: # while we have not looped back - if not belongs_to_current_thread(initialframedata): - # Unlink it - prev = initialframedata.address[0] - next = initialframedata.address[1] - prev.address[1] = next - next.address[0] = prev - # Link it to the singly linked list 'detached_pieces' - initialframedata.address[0] = detached_pieces - detached_pieces = initialframedata - rffi.stackcounter.stacks_counter -= 1 - # Then proceed to the next piece of stack - initialframedata = initialframedata.address[1] - return detached_pieces - - def thread_after_fork(result_of_fork, detached_pieces): - if result_of_fork == 0: - # We are in the child process. Assumes that only the - # current thread survived. All the detached_pieces - # are pointers in other stacks, so have likely been - # freed already by the multithreaded library. - # Nothing more for us to do. - pass - else: - # We are still in the parent process. The fork() may - # have succeeded or not, but that's irrelevant here. - # We need to reattach the detached_pieces now, to the - # circular doubly linked list at 'gcrootanchor'. The - # order is not important. - anchor = llmemory.cast_ptr_to_adr(gcrootanchor) - while detached_pieces != llmemory.NULL: - reattach = detached_pieces - detached_pieces = detached_pieces.address[0] - a_next = anchor.address[1] - reattach.address[0] = anchor - reattach.address[1] = a_next - anchor.address[1] = reattach - a_next.address[0] = reattach - rffi.stackcounter.stacks_counter += 1 - - self.thread_setup = thread_setup - self.thread_start_ptr = getfn(thread_start, [], annmodel.s_None, - inline=True) - self.thread_die_ptr = getfn(thread_die, [], annmodel.s_None) - self.thread_before_fork_ptr = getfn(thread_before_fork, [], - SomeAddress()) - self.thread_after_fork_ptr = getfn(thread_after_fork, - [annmodel.SomeInteger(), - SomeAddress()], - annmodel.s_None) - # - # check that the order of the need_*() is correct for us: if we - # need both threads and stacklets, need_thread_support() must be - # called first, to initialize self.belongs_to_current_thread. - assert not hasattr(self, 'gc_detach_callback_pieces_ptr') - - def postprocess_graph(self, gct, graph, any_inlining): - pass - - def walk_stack_roots(self, collect_stack_root, is_minor=False): - gcdata = self.gcdata - gcdata._gc_collect_stack_root = collect_stack_root - gcdata._gc_collect_is_minor = is_minor - pypy_asm_stackwalk(llhelper(ASM_CALLBACK_PTR, self._asm_callback), - gcrootanchor) - - def walk_stack_from(self): - curframe = lltype.malloc(WALKFRAME, flavor='raw') - otherframe = lltype.malloc(WALKFRAME, flavor='raw') - - # Walk over all the pieces of stack. They are in a circular linked - # list of structures of 7 words, the 2 first words being prev/next. - # The anchor of this linked list is: - anchor = llmemory.cast_ptr_to_adr(gcrootanchor) - initialframedata = anchor.address[1] - stackscount = 0 - while initialframedata != anchor: # while we have not looped back - self.walk_frames(curframe, otherframe, initialframedata) - # Then proceed to the next piece of stack - initialframedata = initialframedata.address[1] - stackscount += 1 - # - # for the JIT: rpy_fastgil may contain an extra framedata - rpy_fastgil = rgil.gil_fetch_fastgil().signed[0] - if rpy_fastgil != 1: - ll_assert(rpy_fastgil != 0, "walk_stack_from doesn't have the GIL") - initialframedata = rffi.cast(llmemory.Address, rpy_fastgil) - # - # very rare issue: initialframedata.address[0] is uninitialized - # in this case, but "retaddr = callee.frame_address.address[0]" - # reads it. If it happens to be exactly a valid return address - # inside the C code, then bad things occur. - initialframedata.address[0] = llmemory.NULL - # - self.walk_frames(curframe, otherframe, initialframedata) - stackscount += 1 - # - expected = rffi.stackcounter.stacks_counter - if NonConstant(0): - rffi.stackcounter.stacks_counter += 42 # hack to force it - ll_assert(not (stackscount < expected), "non-closed stacks around") - ll_assert(not (stackscount > expected), "stacks counter corruption?") - lltype.free(otherframe, flavor='raw') - lltype.free(curframe, flavor='raw') - - def walk_frames(self, curframe, otherframe, initialframedata): - self.fill_initial_frame(curframe, initialframedata) - # Loop over all the frames in the stack - while self.walk_to_parent_frame(curframe, otherframe): - swap = curframe - curframe = otherframe # caller becomes callee - otherframe = swap - - def fill_initial_frame(self, curframe, initialframedata): - # Read the information provided by initialframedata - initialframedata += 2*sizeofaddr #skip the prev/next words at the start - reg = 0 - while reg < CALLEE_SAVED_REGS: - # NB. 'initialframedata' stores the actual values of the - # registers %ebx etc., and if these values are modified - # they are reloaded by pypy_asm_stackwalk(). By contrast, - # 'regs_stored_at' merely points to the actual values - # from the 'initialframedata'. - curframe.regs_stored_at[reg] = initialframedata + reg*sizeofaddr - reg += 1 - curframe.frame_address = initialframedata.address[CALLEE_SAVED_REGS] - - def walk_to_parent_frame(self, callee, caller): - """Starting from 'callee', walk the next older frame on the stack - and fill 'caller' accordingly. Also invokes the collect_stack_root() - callback from the GC code for each GC root found in 'caller'. - """ - # - # The gcmap table is a list of entries, two machine words each: - # void *SafePointAddress; - # int Shape; - # - # A "safe point" is the return address of a call. - # The "shape" of a safe point is a list of integers - # that represent "locations". A "location" can be - # either in the stack or in a register. See - # getlocation() for the decoding of this integer. - # The locations stored in a "shape" are as follows: - # - # * The "location" of the return address. This is just - # after the end of the frame of 'callee'; it is the - # first word of the frame of 'caller' (see picture - # below). - # - # * Four "locations" that specify where the function saves - # each of the four callee-saved registers (%ebx, %esi, - # %edi, %ebp). - # - # * The number of live GC roots around the call. - # - # * For each GC root, an integer that specify where the - # GC pointer is stored. This is a "location" too. - # - # XXX the details are completely specific to X86!!! - # a picture of the stack may help: - # ^ ^ ^ - # | ... | to older frames - # +--------------+ - # | ret addr | <------ caller_frame (addr of retaddr) - # | ... | - # | caller frame | - # | ... | - # +--------------+ - # | ret addr | <------ callee_frame (addr of retaddr) - # | ... | - # | callee frame | - # | ... | lower addresses - # +--------------+ v v v - # - - retaddr = callee.frame_address.address[0] - # - # try to locate the caller function based on retaddr. - # set up self._shape_decompressor. - # - ebp_in_caller = callee.regs_stored_at[INDEX_OF_EBP].address[0] - self.locate_caller_based_on_retaddr(retaddr, ebp_in_caller) - # - # found! Enumerate the GC roots in the caller frame - # - collect_stack_root = self.gcdata._gc_collect_stack_root - gc = self.gc - while True: - location = self._shape_decompressor.next() - if location == 0: - break - addr = self.getlocation(callee, ebp_in_caller, location) - if gc.points_to_valid_gc_object(addr): - collect_stack_root(gc, addr) - # - # small hack: the JIT reserves THREADLOCAL_OFS's last bit for - # us. We use it to store an "already traced past this frame" - # flag. - if self._with_jit and self.gcdata._gc_collect_is_minor: - if self.mark_jit_frame_can_stop(callee): - return False - # - # track where the caller_frame saved the registers from its own - # caller - # - reg = CALLEE_SAVED_REGS - 1 - while reg >= 0: - location = self._shape_decompressor.next() - addr = self.getlocation(callee, ebp_in_caller, location) - caller.regs_stored_at[reg] = addr - reg -= 1 - - location = self._shape_decompressor.next() - caller.frame_address = self.getlocation(callee, ebp_in_caller, - location) - # we get a NULL marker to mean "I'm the frame - # of the entry point, stop walking" - return caller.frame_address != llmemory.NULL - - def locate_caller_based_on_retaddr(self, retaddr, ebp_in_caller): - gcmapstart = llop.gc_asmgcroot_static(llmemory.Address, 0) - gcmapend = llop.gc_asmgcroot_static(llmemory.Address, 1) - item = search_in_gcmap(gcmapstart, gcmapend, retaddr) - if item: - self._shape_decompressor.setpos(item.signed[1]) - return - - if not self._shape_decompressor.sorted: - # the item may have been not found because the main array was - # not sorted. Sort it and try again. - win32_follow_gcmap_jmp(gcmapstart, gcmapend) - sort_gcmap(gcmapstart, gcmapend) - self._shape_decompressor.sorted = True - item = search_in_gcmap(gcmapstart, gcmapend, retaddr) - if item: - self._shape_decompressor.setpos(item.signed[1]) - return - - if self._with_jit: - # item not found. We assume that it's a JIT-generated - # location -- but we check for consistency that ebp points - # to a JITFRAME object. - from rpython.jit.backend.llsupport.jitframe import STACK_DEPTH_OFS - - tid = self.gc.get_possibly_forwarded_type_id(ebp_in_caller) - if (rffi.cast(lltype.Signed, tid) == - rffi.cast(lltype.Signed, self.frame_tid)): - # fish the depth - extra_stack_depth = (ebp_in_caller + STACK_DEPTH_OFS).signed[0] - ll_assert((extra_stack_depth & (rffi.sizeof(lltype.Signed) - 1)) - == 0, "asmgcc: misaligned extra_stack_depth") - extra_stack_depth //= rffi.sizeof(lltype.Signed) - self._shape_decompressor.setjitframe(extra_stack_depth) - return - llop.debug_fatalerror(lltype.Void, "cannot find gc roots!") - - def getlocation(self, callee, ebp_in_caller, location): - """Get the location in the 'caller' frame of a variable, based - on the integer 'location' that describes it. All locations are - computed based on information saved by the 'callee'. - """ - ll_assert(location >= 0, "negative location") - kind = location & LOC_MASK - offset = location & ~ LOC_MASK - if IS_64_BITS: - offset <<= 1 - if kind == LOC_REG: # register - if location == LOC_NOWHERE: - return llmemory.NULL - reg = (location >> 2) - 1 - ll_assert(reg < CALLEE_SAVED_REGS, "bad register location") - return callee.regs_stored_at[reg] - elif kind == LOC_ESP_PLUS: # in the caller stack frame at N(%esp) - esp_in_caller = callee.frame_address + sizeofaddr - return esp_in_caller + offset - elif kind == LOC_EBP_PLUS: # in the caller stack frame at N(%ebp) - return ebp_in_caller + offset - else: # kind == LOC_EBP_MINUS: at -N(%ebp) - return ebp_in_caller - offset - - def mark_jit_frame_can_stop(self, callee): - location = self._shape_decompressor.get_threadlocal_loc() - if location == LOC_NOWHERE: - return False - addr = self.getlocation(callee, llmemory.NULL, location) - # - x = addr.signed[0] - if x & 1: - return True # this JIT stack frame is already marked! - else: - addr.signed[0] = x | 1 # otherwise, mark it but don't stop - return False - - -LOC_REG = 0 -LOC_ESP_PLUS = 1 -LOC_EBP_PLUS = 2 -LOC_EBP_MINUS = 3 -LOC_MASK = 0x03 -LOC_NOWHERE = LOC_REG | 0 - -# ____________________________________________________________ - -sizeofaddr = llmemory.sizeof(llmemory.Address) -arrayitemsize = 2 * sizeofaddr - - -def binary_search(start, end, addr1): - """Search for an element in a sorted array. - - The interval from the start address (included) to the end address - (excluded) is assumed to be a sorted arrays of pairs (addr1, addr2). - This searches for the item with a given addr1 and returns its - address. If not found exactly, it tries to return the address - of the item left of addr1 (i.e. such that result.address[0] < addr1). - """ - count = (end - start) // arrayitemsize - while count > 1: - middleindex = count // 2 - middle = start + middleindex * arrayitemsize - if addr1 < middle.address[0]: - count = middleindex - else: - start = middle - count -= middleindex - return start - -def search_in_gcmap(gcmapstart, gcmapend, retaddr): - item = binary_search(gcmapstart, gcmapend, retaddr) - if item.address[0] == retaddr: - return item # found - # 'retaddr' not exactly found. Check that 'item' is the start of a - # compressed range that includes 'retaddr'. - if retaddr > item.address[0] and item.signed[1] < 0: - return item # ok - else: - return llmemory.NULL # failed - -def search_in_gcmap2(gcmapstart, gcmapend, retaddr): - # same as 'search_in_gcmap', but without range checking support - # (item.signed[1] is an address in this case, not a signed at all!) - item = binary_search(gcmapstart, gcmapend, retaddr) - if item.address[0] == retaddr: - return item.address[1] # found - else: - return llmemory.NULL # failed - -def sort_gcmap(gcmapstart, gcmapend): - count = (gcmapend - gcmapstart) // arrayitemsize - qsort(gcmapstart, - rffi.cast(rffi.SIZE_T, count), - rffi.cast(rffi.SIZE_T, arrayitemsize), - c_compare_gcmap_entries) - -def replace_dead_entries_with_nulls(start, end): - # replace the dead entries (null value) with a null key. - count = (end - start) // arrayitemsize - 1 - while count >= 0: - item = start + count * arrayitemsize - if item.address[1] == llmemory.NULL: - item.address[0] = llmemory.NULL - count -= 1 - -if sys.platform == 'win32': - def win32_follow_gcmap_jmp(start, end): - # The initial gcmap table contains addresses to a JMP - # instruction that jumps indirectly to the real code. - # Replace them with the target addresses. - assert rffi.SIGNEDP is rffi.LONGP, "win64 support missing" - while start < end: - code = rffi.cast(rffi.CCHARP, start.address[0])[0] - if code == '\xe9': # jmp - rel32 = rffi.cast(rffi.SIGNEDP, start.address[0]+1)[0] - target = start.address[0] + (rel32 + 5) - start.address[0] = target - start += arrayitemsize -else: - def win32_follow_gcmap_jmp(start, end): - pass - -# ____________________________________________________________ - -class ShapeDecompressor: - _alloc_flavor_ = "raw" - - sorted = False - - def setpos(self, pos): - if pos < 0: - pos = ~ pos # can ignore this "range" marker here - gccallshapes = llop.gc_asmgcroot_static(llmemory.Address, 2) - self.addr = gccallshapes + pos - self.jit_index = -1 - - def setjitframe(self, extra_stack_depth): - self.jit_index = 0 - self.extra_stack_depth = extra_stack_depth - - def next(self): - index = self.jit_index - if index < 0: - # case "outside the jit" - addr = self.addr - value = 0 - while True: - b = ord(addr.char[0]) - addr += 1 - value += b - if b < 0x80: - break - value = (value - 0x80) << 7 - self.addr = addr - return value - else: - # case "in the jit" - from rpython.jit.backend.x86.arch import FRAME_FIXED_SIZE - from rpython.jit.backend.x86.arch import PASS_ON_MY_FRAME - self.jit_index = index + 1 - if index == 0: - # the jitframe is an object in EBP - return LOC_REG | ((INDEX_OF_EBP + 1) << 2) - if index == 1: - return 0 - # the remaining returned values should be: - # saved %rbp - # saved %r15 or on 32bit: - # saved %r14 saved %ebp - # saved %r13 saved %edi - # saved %r12 saved %esi - # saved %rbx saved %ebx - # return addr return addr - stack_depth = PASS_ON_MY_FRAME + self.extra_stack_depth - if IS_64_BITS: - if index == 2: # rbp - return LOC_ESP_PLUS | (stack_depth << 2) - if index == 3: # r15 - return LOC_ESP_PLUS | ((stack_depth + 5) << 2) - if index == 4: # r14 - return LOC_ESP_PLUS | ((stack_depth + 4) << 2) - if index == 5: # r13 - return LOC_ESP_PLUS | ((stack_depth + 3) << 2) - if index == 6: # r12 - return LOC_ESP_PLUS | ((stack_depth + 2) << 2) - if index == 7: # rbx - return LOC_ESP_PLUS | ((stack_depth + 1) << 2) - if index == 8: # return addr - return (LOC_ESP_PLUS | - ((FRAME_FIXED_SIZE + self.extra_stack_depth) << 2)) - else: - if index == 2: # ebp - return LOC_ESP_PLUS | (stack_depth << 2) - if index == 3: # edi - return LOC_ESP_PLUS | ((stack_depth + 3) << 2) - if index == 4: # esi - return LOC_ESP_PLUS | ((stack_depth + 2) << 2) - if index == 5: # ebx - return LOC_ESP_PLUS | ((stack_depth + 1) << 2) - if index == 6: # return addr - return (LOC_ESP_PLUS | - ((FRAME_FIXED_SIZE + self.extra_stack_depth) << 2)) - llop.debug_fatalerror(lltype.Void, "asmgcroot: invalid index") - return 0 # annotator fix - - def get_threadlocal_loc(self): - index = self.jit_index - if index < 0: - return LOC_NOWHERE # case "outside the jit" - else: - # case "in the jit" - from rpython.jit.backend.x86.arch import THREADLOCAL_OFS, WORD - return (LOC_ESP_PLUS | - ((THREADLOCAL_OFS // WORD + self.extra_stack_depth) << 2)) - - -# ____________________________________________________________ - -# -# The special pypy_asm_stackwalk(), implemented directly in -# assembler, fills information about the current stack top in an -# ASM_FRAMEDATA array and invokes an RPython callback with it. -# An ASM_FRAMEDATA is an array of 5 values that describe everything -# we need to know about a stack frame: -# -# - the value that %ebx had when the current function started -# - the value that %esi had when the current function started -# - the value that %edi had when the current function started -# - the value that %ebp had when the current function started -# - frame address (actually the addr of the retaddr of the current function; -# that's the last word of the frame in memory) -# -# On 64 bits, it is an array of 7 values instead of 5: -# -# - %rbx, %r12, %r13, %r14, %r15, %rbp; and the frame address -# - -if IS_64_BITS: - CALLEE_SAVED_REGS = 6 - INDEX_OF_EBP = 5 - FRAME_PTR = CALLEE_SAVED_REGS -else: - CALLEE_SAVED_REGS = 4 # there are 4 callee-saved registers - INDEX_OF_EBP = 3 - FRAME_PTR = CALLEE_SAVED_REGS # the frame is at index 4 in the array - -JIT_USE_WORDS = 2 + FRAME_PTR + 1 - -ASM_CALLBACK_PTR = lltype.Ptr(lltype.FuncType([], lltype.Void)) - -# used internally by walk_stack_from() -WALKFRAME = lltype.Struct('WALKFRAME', - ('regs_stored_at', # address of where the registers have been saved - lltype.FixedSizeArray(llmemory.Address, CALLEE_SAVED_REGS)), - ('frame_address', - llmemory.Address), - ) - -# We have a circular doubly-linked list of all the ASM_FRAMEDATAs currently -# alive. The list's starting point is given by 'gcrootanchor', which is not -# a full ASM_FRAMEDATA but only contains the prev/next pointers: -ASM_FRAMEDATA_HEAD_PTR = lltype.Ptr(lltype.ForwardReference()) -ASM_FRAMEDATA_HEAD_PTR.TO.become(lltype.Struct('ASM_FRAMEDATA_HEAD', - ('prev', ASM_FRAMEDATA_HEAD_PTR), - ('next', ASM_FRAMEDATA_HEAD_PTR) - )) -gcrootanchor = lltype.malloc(ASM_FRAMEDATA_HEAD_PTR.TO, immortal=True) -gcrootanchor.prev = gcrootanchor -gcrootanchor.next = gcrootanchor -c_gcrootanchor = Constant(gcrootanchor, ASM_FRAMEDATA_HEAD_PTR) - -eci = ExternalCompilationInfo(compile_extra=['-DPYPY_USE_ASMGCC'], - post_include_bits=[""" -static int pypy_compare_gcmap_entries(const void *addr1, const void *addr2) -{ - char *key1 = * (char * const *) addr1; - char *key2 = * (char * const *) addr2; - if (key1 < key2) - return -1; - else if (key1 == key2) - return 0; - else - return 1; -} -"""]) - -pypy_asm_stackwalk = rffi.llexternal('pypy_asm_stackwalk', - [ASM_CALLBACK_PTR, - ASM_FRAMEDATA_HEAD_PTR], - lltype.Signed, - sandboxsafe=True, - _nowrapper=True, - random_effects_on_gcobjs=True, - compilation_info=eci) -c_asm_stackwalk = Constant(pypy_asm_stackwalk, - lltype.typeOf(pypy_asm_stackwalk)) - -pypy_asm_gcroot = rffi.llexternal('pypy_asm_gcroot', - [llmemory.Address], - llmemory.Address, - sandboxsafe=True, - _nowrapper=True) -c_asm_gcroot = Constant(pypy_asm_gcroot, lltype.typeOf(pypy_asm_gcroot)) - -pypy_asm_nocollect = rffi.llexternal('pypy_asm_gc_nocollect', - [rffi.CCHARP], lltype.Void, - sandboxsafe=True, - _nowrapper=True) -c_asm_nocollect = Constant(pypy_asm_nocollect, lltype.typeOf(pypy_asm_nocollect)) - -QSORT_CALLBACK_PTR = lltype.Ptr(lltype.FuncType([llmemory.Address, - llmemory.Address], rffi.INT)) -c_compare_gcmap_entries = rffi.llexternal('pypy_compare_gcmap_entries', - [llmemory.Address, llmemory.Address], - rffi.INT, compilation_info=eci, - _nowrapper=True, sandboxsafe=True) -qsort = rffi.llexternal('qsort', - [llmemory.Address, - rffi.SIZE_T, - rffi.SIZE_T, - QSORT_CALLBACK_PTR], - lltype.Void, - sandboxsafe=True, - random_effects_on_gcobjs=False, # but has a callback - _nowrapper=True) diff -Nru pypy-7.1.1+dfsg/rpython/memory/gctransform/framework.py pypy-7.3.1+dfsg/rpython/memory/gctransform/framework.py --- pypy-7.1.1+dfsg/rpython/memory/gctransform/framework.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/memory/gctransform/framework.py 2020-04-10 19:28:41.000000000 +0000 @@ -572,6 +572,8 @@ self.move_out_of_nursery_ptr = getfn(GCClass.move_out_of_nursery, [s_gc, SomeAddress()], SomeAddress()) + if hasattr(self.root_walker, 'build_increase_root_stack_depth_ptr'): + self.root_walker.build_increase_root_stack_depth_ptr(getfn) def create_custom_trace_funcs(self, gc, rtyper): @@ -1001,21 +1003,6 @@ # for stacklet hop.genop("direct_call", [self.root_walker.gc_modified_shadowstack_ptr]) - def gct_gc_detach_callback_pieces(self, hop): - op = hop.spaceop - assert len(op.args) == 0 - hop.genop("direct_call", - [self.root_walker.gc_detach_callback_pieces_ptr], - resultvar=op.result) - - def gct_gc_reattach_callback_pieces(self, hop): - op = hop.spaceop - assert len(op.args) == 1 - hop.genop("direct_call", - [self.root_walker.gc_reattach_callback_pieces_ptr, - op.args[0]], - resultvar=op.result) - def gct_do_malloc_fixedsize(self, hop): # used by the JIT (see rpython.jit.backend.llsupport.gc) op = hop.spaceop @@ -1242,8 +1229,10 @@ def gct_gc_thread_start(self, hop): assert self.translator.config.translation.thread + # There is no 'thread_start_ptr' any more for now, so the following + # line is always false. if hasattr(self.root_walker, 'thread_start_ptr'): - # only with asmgcc. Note that this is actually called after + # Note that this is actually called after # the first gc_thread_run() in the new thread. hop.genop("direct_call", [self.root_walker.thread_start_ptr]) @@ -1652,6 +1641,12 @@ else: hop.rename("same_as") + def gct_gc_increase_root_stack_depth(self, hop): + if not hasattr(self.root_walker, 'gc_increase_root_stack_depth_ptr'): + return + hop.genop("direct_call", + [self.root_walker.gc_increase_root_stack_depth_ptr, + hop.spaceop.args[0]]) class TransformerLayoutBuilder(gctypelayout.TypeLayoutBuilder): @@ -1667,6 +1662,15 @@ self.translator = translator super(TransformerLayoutBuilder, self).__init__(GCClass, lltype2vtable) + def is_dummy_struct(self, obj): + # overrides the base method + TYPE = lltype.typeOf(obj) + try: + dummy = self.translator.rtyper.cache_dummy_values[TYPE] + except KeyError: + return False + return dummy._obj == obj + def has_destructor(self, TYPE): rtti = get_rtti(TYPE) return rtti is not None and getattr(rtti._obj, 'destructor_funcptr', diff -Nru pypy-7.1.1+dfsg/rpython/memory/gctransform/shadowstack.py pypy-7.3.1+dfsg/rpython/memory/gctransform/shadowstack.py --- pypy-7.1.1+dfsg/rpython/memory/gctransform/shadowstack.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/memory/gctransform/shadowstack.py 2020-04-10 19:28:41.000000000 +0000 @@ -140,6 +140,7 @@ # this is a dict {tid: SHADOWSTACKREF}, where the tid for the # current thread may be missing so far gcdata.thread_stacks = None + shadow_stack_pool.has_threads = True # Return the thread identifier, as an integer. get_tid = rthread.get_ident @@ -252,6 +253,15 @@ self.gc_modified_shadowstack_ptr = getfn(gc_modified_shadowstack, [], annmodel.s_None) + def build_increase_root_stack_depth_ptr(self, getfn): + shadow_stack_pool = self.shadow_stack_pool + def gc_increase_root_stack_depth(new_size): + shadow_stack_pool.increase_root_stack_depth(new_size) + + self.gc_increase_root_stack_depth_ptr = getfn( + gc_increase_root_stack_depth, [annmodel.SomeInteger()], + annmodel.s_None) + def postprocess_graph(self, gct, graph, any_inlining): from rpython.memory.gctransform import shadowcolor if any_inlining: @@ -269,6 +279,7 @@ """ _alloc_flavor_ = "raw" root_stack_depth = 163840 + has_threads = False def __init__(self, gcdata): self.unused_full_stack = llmemory.NULL @@ -337,6 +348,44 @@ if self.unused_full_stack == llmemory.NULL: raise MemoryError + def increase_root_stack_depth(self, new_depth): + if new_depth <= self.root_stack_depth: + return # can't easily decrease the size + if self.unused_full_stack: + llmemory.raw_free(self.unused_full_stack) + self.unused_full_stack = llmemory.NULL + used = self.gcdata.root_stack_top - self.gcdata.root_stack_base + addr = self._resize(self.gcdata.root_stack_base, used, new_depth) + self.gcdata.root_stack_base = addr + self.gcdata.root_stack_top = addr + used + # no gc operations above: we just switched shadowstacks + if self.has_threads: + self._resize_thread_shadowstacks(new_depth) + self.root_stack_depth = new_depth + + def _resize_thread_shadowstacks(self, new_depth): + if self.gcdata.thread_stacks is not None: + for ssref in self.gcdata.thread_stacks.values(): + if ssref.base: + used = ssref.top - ssref.base + addr = self._resize(ssref.base, used, new_depth) + ssref.base = addr + ssref.top = addr + used + _resize_thread_shadowstacks._dont_inline_ = True + + def _resize(self, base, used, new_depth): + new_size = sizeofaddr * new_depth + ll_assert(used <= new_size, "shadowstack resize: overflow detected") + addr = llmemory.raw_malloc(new_size) + if addr == llmemory.NULL: + raise MemoryError + # note that we don't know the total memory size of 'base', but we + # know the size of the part that is used right now, and we only need + # to copy that + llmemory.raw_memmove(base, addr, used) + llmemory.raw_free(base) + return addr + def get_shadowstackref(root_walker, gctransformer): if hasattr(gctransformer, '_SHADOWSTACKREF'): diff -Nru pypy-7.1.1+dfsg/rpython/memory/gctransform/transform.py pypy-7.3.1+dfsg/rpython/memory/gctransform/transform.py --- pypy-7.1.1+dfsg/rpython/memory/gctransform/transform.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/memory/gctransform/transform.py 2020-04-10 19:28:41.000000000 +0000 @@ -17,6 +17,7 @@ from rpython.rlib.rarithmetic import ovfcheck from rpython.rtyper.lltypesystem.lloperation import llop from rpython.translator.simplify import cleanup_graph +from rpython.memory.gctransform.log import log class GcHighLevelOp(object): @@ -138,9 +139,15 @@ return any_inlining def inline_helpers_and_postprocess(self, graphs): + next_dot = 0 for graph in graphs: any_inlining = self.inline and self.inline_helpers_into(graph) self.postprocess_graph(graph, any_inlining) + # + next_dot -= 1 + if next_dot <= 0: + log.dot() + next_dot = 50 def postprocess_graph(self, graph, any_inlining): pass @@ -210,9 +217,6 @@ self.var_last_needed_in = None self.curr_block = None - def start_transforming_graph(self, graph): - pass # for asmgcc.py - def transform_graph(self, graph): if graph in self.minimal_transform: if self.minimalgctransformer: @@ -222,7 +226,6 @@ if graph in self.seen_graphs: return self.seen_graphs.add(graph) - self.start_transforming_graph(graph) self.links_to_split = {} # link -> vars to pop_alive across the link diff -Nru pypy-7.1.1+dfsg/rpython/memory/gctypelayout.py pypy-7.3.1+dfsg/rpython/memory/gctypelayout.py --- pypy-7.1.1+dfsg/rpython/memory/gctypelayout.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/memory/gctypelayout.py 2020-04-10 19:28:41.000000000 +0000 @@ -466,7 +466,10 @@ typeid = self.get_type_id(TYPE) hdr = gc.gcheaderbuilder.new_header(value) adr = llmemory.cast_ptr_to_adr(hdr) - gc.init_gc_object_immortal(adr, typeid) + if gc.gcflag_dummy and self.is_dummy_struct(value): + gc.init_gc_object_immortal(adr, typeid, flags=gc.gcflag_dummy) + else: + gc.init_gc_object_immortal(adr, typeid) self.all_prebuilt_gc.append(value) # The following collects the addresses of all the fields that have @@ -484,6 +487,10 @@ for a in gc_pointers_inside(value, adr, mutable_only=True): appendto.append(a) + def is_dummy_struct(self, obj): + return False # overridden in TransformerLayoutBuilder + + # ____________________________________________________________ # # Helpers to discover GC pointers inside structures diff -Nru pypy-7.1.1+dfsg/rpython/memory/gcwrapper.py pypy-7.3.1+dfsg/rpython/memory/gcwrapper.py --- pypy-7.1.1+dfsg/rpython/memory/gcwrapper.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/memory/gcwrapper.py 2020-04-10 19:28:41.000000000 +0000 @@ -188,6 +188,9 @@ hdr.tid &= ~self.gc.gcflag_extra else: hdr.tid |= self.gc.gcflag_extra + elif subopnum == 4: # get_gcflag_dummy + # returns always False if gc.gcflag_dummy == 0 + return (hdr.tid & self.gc.gcflag_dummy) != 0 return (hdr.tid & self.gc.gcflag_extra) != 0 def thread_run(self): diff -Nru pypy-7.1.1+dfsg/rpython/rlib/buffer.py pypy-7.3.1+dfsg/rpython/rlib/buffer.py --- pypy-7.1.1+dfsg/rpython/rlib/buffer.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/rlib/buffer.py 2020-04-10 19:28:41.000000000 +0000 @@ -1,7 +1,7 @@ """ Buffer protocol support. """ -from rpython.rtyper.lltypesystem import lltype, llmemory +from rpython.rtyper.lltypesystem import lltype, llmemory, rffi from rpython.rtyper.lltypesystem.lloperation import llop from rpython.rtyper.lltypesystem.rstr import STR from rpython.rtyper.lltypesystem.rlist import LIST_OF @@ -65,7 +65,7 @@ def as_str(self): "Returns an interp-level string with the whole content of the buffer." # May be overridden. - return self.getslice(0, self.getlength(), 1, self.getlength()) + return self.getslice(0, 1, self.getlength()) def getitem(self, index): "Returns the index'th character in the buffer." @@ -74,13 +74,17 @@ def __getitem__(self, i): return self.getitem(i) - def getslice(self, start, stop, step, size): + def getslice(self, start, step, size): # May be overridden. No bounds checks. - return ''.join([self.getitem(i) for i in range(start, stop, step)]) + lst = ['\x00'] * size + for i in range(size): + lst[i] = self.getitem(start) + start += step + return ''.join(lst) @signature(types.any(), types.int(), types.int(), returns=types.str()) def __getslice__(self, start, stop): - return self.getslice(start, stop, 1, stop - start) + return self.getslice(start, 1, min(stop, self.getlength()) - start) def setitem(self, index, char): "Write a character into the buffer." @@ -123,7 +127,7 @@ class RawBuffer(Buffer): """ - A buffer which is baked by a raw, non-movable memory area. It implementes + A buffer which is backed by a raw, non-movable memory area. It implementes typed_read and typed_write in terms of get_raw_address(), llop.raw_load, llop.raw_store. @@ -155,9 +159,39 @@ return llop.raw_store(lltype.Void, ptr, byte_offset, value) +class RawByteBuffer(RawBuffer): + _immutable_ = True + + def __init__(self, length): + self._length = length + self._buf = lltype.malloc(rffi.CCHARP.TO, length, flavor='raw', zero=True) + self.readonly = False + + def getlength(self): + return self._length + + def getitem(self, index): + return self._buf[index] + + def getslice(self, start, step, size): + if step == 1: + return rffi.charpsize2str(rffi.ptradd(self._buf, start), size) + return Buffer.getslice(self, start, step, size) + + def setitem(self, index, char): + self._buf[index] = char + + def get_raw_address(self): + return self._buf + + def __del__(self): + lltype.free(self._buf, flavor='raw') + self._buf = lltype.nullptr(rffi.CCHARP.TO) + + class GCBuffer(Buffer): """ - Base class for a buffer which is baked by a GC-managed memory area. You + Base class for a buffer which is backed by a GC-managed memory area. You MUST also decorate the class with @GCBuffer.decorate: it implements typed_read and typed_write in terms of llop.gc_load_indexed and llop.gc_store_indexed. @@ -250,6 +284,15 @@ def setitem(self, index, char): self.data[index] = char + def getslice(self, start, step, size): + if step == 1: + assert start >= 0 + assert size >= 0 + if start == 0 and size == len(self.data): + return "".join(self.data) + return "".join(self.data[start:start+size]) + return Buffer.getslice(self, start, step, size) + def get_raw_address(self): return nonmoving_raw_ptr_for_resizable_list(self.data) @@ -280,15 +323,16 @@ def getitem(self, index): return self.value[index] - def getslice(self, start, stop, step, size): + def getslice(self, start, step, size): if size == 0: return "" if step == 1: - assert 0 <= start <= stop - if start == 0 and stop == len(self.value): + assert start >= 0 + assert size >= 0 + if start == 0 and size == len(self.value): return self.value - return self.value[start:stop] - return Buffer.getslice(self, start, stop, step, size) + return self.value[start:start+size] + return Buffer.getslice(self, start, step, size) def get_raw_address(self): from rpython.rtyper.lltypesystem import rffi @@ -341,12 +385,11 @@ def getitem(self, index): return self.buffer.getitem(self.offset + index) - def getslice(self, start, stop, step, size): - if start == stop: + def getslice(self, start, step, size): + if size == 0: return '' # otherwise, adding self.offset might make them # out of bounds - return self.buffer.getslice(self.offset + start, self.offset + stop, - step, size) + return self.buffer.getslice(self.offset + start, step, size) def setitem(self, index, char): self.buffer.setitem(self.offset + index, char) diff -Nru pypy-7.1.1+dfsg/rpython/rlib/compilerinfo.py pypy-7.3.1+dfsg/rpython/rlib/compilerinfo.py --- pypy-7.1.1+dfsg/rpython/rlib/compilerinfo.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/rlib/compilerinfo.py 2020-04-10 19:28:41.000000000 +0000 @@ -18,8 +18,8 @@ if platform.name == 'msvc': - # XXX hard-code the MSC version, I don't feel like computing it dynamically - _C_COMPILER_INFO = '"MSC v.%d 32 bit"' % (platform.version * 10 + 600) + # XXX hard-code the bit name + _C_COMPILER_INFO = '"MSC v." Py_STR(_MSC_VER) " 32 bit"' else: _C_COMPILER_INFO = '("GCC " __VERSION__)' diff -Nru pypy-7.1.1+dfsg/rpython/rlib/entrypoint.py pypy-7.3.1+dfsg/rpython/rlib/entrypoint.py --- pypy-7.1.1+dfsg/rpython/rlib/entrypoint.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/rlib/entrypoint.py 2020-04-10 19:28:41.000000000 +0000 @@ -60,10 +60,9 @@ def wrapper(%(args)s): # acquire the GIL - rgil.acquire() + rgil.acquire_maybe_in_new_thread() # - rffi.stackcounter.stacks_counter += 1 - llop.gc_stack_bottom(lltype.Void) # marker for trackgcroot.py + llop.gc_stack_bottom(lltype.Void) # marker to enter RPython from C # this should not raise try: res = func(%(args)s) @@ -77,7 +76,6 @@ pypy_debug_catch_fatal_exception() llop.debug_fatalerror(lltype.Void, "error in c callback") assert 0 # dead code - rffi.stackcounter.stacks_counter -= 1 # release the GIL rgil.release() # diff -Nru pypy-7.1.1+dfsg/rpython/rlib/jit_hooks.py pypy-7.3.1+dfsg/rpython/rlib/jit_hooks.py --- pypy-7.1.1+dfsg/rpython/rlib/jit_hooks.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/rlib/jit_hooks.py 2020-04-10 19:28:41.000000000 +0000 @@ -1,12 +1,10 @@ from rpython.annotator import model as annmodel from rpython.rtyper.llannotation import SomePtr, lltype_to_annotation -from rpython.rlib.objectmodel import specialize -from rpython.rtyper.annlowlevel import (cast_instance_to_base_ptr, - cast_base_ptr_to_instance, llstr) +from rpython.rtyper.annlowlevel import ( + cast_instance_to_gcref, cast_gcref_to_instance, llstr) from rpython.rtyper.extregistry import ExtRegistryEntry from rpython.rtyper.lltypesystem import llmemory, lltype from rpython.flowspace.model import Constant -from rpython.rtyper import rclass def register_helper(s_result): @@ -16,7 +14,7 @@ def compute_result_annotation(self, *args): if (isinstance(s_result, annmodel.SomeObject) or - s_result is None): + s_result is None): return s_result return lltype_to_annotation(s_result) @@ -35,20 +33,13 @@ def _cast_to_box(llref): from rpython.jit.metainterp.history import AbstractValue - - ptr = lltype.cast_opaque_ptr(rclass.OBJECTPTR, llref) - return cast_base_ptr_to_instance(AbstractValue, ptr) + return cast_gcref_to_instance(AbstractValue, llref) def _cast_to_resop(llref): from rpython.jit.metainterp.resoperation import AbstractResOp + return cast_gcref_to_instance(AbstractResOp, llref) - ptr = lltype.cast_opaque_ptr(rclass.OBJECTPTR, llref) - return cast_base_ptr_to_instance(AbstractResOp, ptr) - -@specialize.argtype(0) -def _cast_to_gcref(obj): - return lltype.cast_opaque_ptr(llmemory.GCREF, - cast_instance_to_base_ptr(obj)) +_cast_to_gcref = cast_instance_to_gcref def emptyval(): return lltype.nullptr(llmemory.GCREF.TO) diff -Nru pypy-7.1.1+dfsg/rpython/rlib/jit.py pypy-7.3.1+dfsg/rpython/rlib/jit.py --- pypy-7.1.1+dfsg/rpython/rlib/jit.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/rlib/jit.py 2020-04-10 19:28:41.000000000 +0000 @@ -1315,6 +1315,7 @@ TRACING BACKEND OPS + HEAPCACHED_OPS RECORDED_OPS GUARDS OPT_OPS diff -Nru pypy-7.1.1+dfsg/rpython/rlib/objectmodel.py pypy-7.3.1+dfsg/rpython/rlib/objectmodel.py --- pypy-7.1.1+dfsg/rpython/rlib/objectmodel.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/rlib/objectmodel.py 2020-04-10 19:28:41.000000000 +0000 @@ -226,6 +226,13 @@ func._not_rpython_ = True return func +def llhelper_can_raise(func): + """ + Instruct ll2ctypes that this llhelper can raise RPython exceptions, which + should be propagated. + """ + func._llhelper_can_raise_ = True + return func # ____________________________________________________________ @@ -700,13 +707,6 @@ def hlinvoke(repr, llcallable, *args): raise TypeError("hlinvoke is meant to be rtyped and not called direclty") -def is_in_callback(): - """Returns True if we're currently in a callback *or* if there are - multiple threads around. - """ - from rpython.rtyper.lltypesystem import rffi - return rffi.stackcounter.stacks_counter > 1 - class UnboxedValue(object): """A mixin class to use for classes that have exactly one field which diff -Nru pypy-7.1.1+dfsg/rpython/rlib/rarithmetic.py pypy-7.3.1+dfsg/rpython/rlib/rarithmetic.py --- pypy-7.1.1+dfsg/rpython/rlib/rarithmetic.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/rlib/rarithmetic.py 2020-04-10 19:28:41.000000000 +0000 @@ -871,6 +871,8 @@ # String parsing support # --------------------------- +OVF_DIGITS = len(str(sys.maxint)) + def string_to_int(s, base=10, allow_underscores=False, no_implicit_octal=False): """Utility to converts a string to an integer. If base is 0, the proper base is guessed based on the leading @@ -878,9 +880,32 @@ Raises ParseStringOverflowError in case the result does not fit. """ from rpython.rlib.rstring import ( - NumberStringParser, ParseStringOverflowError, strip_spaces) - s = literal = strip_spaces(s) - p = NumberStringParser(s, literal, base, 'int', + NumberStringParser, ParseStringOverflowError) + + if base == 10 and 0 < len(s) < OVF_DIGITS: + # fast path for simple cases, just supporting (+/-)[0-9]* with not too + # many digits + start = 0 + sign = 1 + if s[0] == "-": + start = 1 + sign = -1 + elif s[0] == "+": + start = 1 + if start != len(s): + result = 0 + for i in range(start, len(s)): + char = s[i] + value = ord(char) - ord('0') + if 0 <= value <= 9: + result = result * 10 + value + else: + # non digit char, let the NumberStringParser do the work + break + else: + return result * sign + + p = NumberStringParser(s, s, base, 'int', allow_underscores=allow_underscores, no_implicit_octal=no_implicit_octal) base = p.base @@ -898,4 +923,4 @@ result = ovfcheck(result + digit) except OverflowError: raise ParseStringOverflowError(p) -string_to_int._elidable_function_ = True +string_to_int._elidable_function_ = True # can't use decorator due to circular imports diff -Nru pypy-7.1.1+dfsg/rpython/rlib/rawstorage.py pypy-7.3.1+dfsg/rpython/rlib/rawstorage.py --- pypy-7.1.1+dfsg/rpython/rlib/rawstorage.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/rlib/rawstorage.py 2020-04-10 19:28:41.000000000 +0000 @@ -55,7 +55,7 @@ misaligned_is_fine = False -class AlignmentError(NotImplementedError): +class AlignmentError(Exception): "Means that raw_storage_{get,set}item was used on unaligned memory" # Tweak? It seems a reasonable value for any system out there: requiring diff -Nru pypy-7.1.1+dfsg/rpython/rlib/rbigint.py pypy-7.3.1+dfsg/rpython/rlib/rbigint.py --- pypy-7.1.1+dfsg/rpython/rlib/rbigint.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/rlib/rbigint.py 2020-04-10 19:28:41.000000000 +0000 @@ -298,12 +298,14 @@ and returns an rbigint.""" from rpython.rlib.rstring import NumberStringParser, \ strip_spaces - s = literal = strip_spaces(s) + s = literal = strip_spaces(s) # XXX could get rid of this slice + end = len(s) if (s.endswith('l') or s.endswith('L')) and base < 22: # in base 22 and above, 'L' is a valid digit! try: long('L',22) - s = s[:-1] + end -= 1 parser = NumberStringParser(s, literal, base, 'long', - allow_underscores=allow_underscores) + allow_underscores=allow_underscores, + end=end) return rbigint._from_numberstring_parser(parser) @staticmethod @@ -1172,7 +1174,7 @@ def lshift(self, int_other): if int_other < 0: raise ValueError("negative shift count") - elif int_other == 0: + elif int_other == 0 or self.sign == 0: return self # wordshift, remshift = divmod(int_other, SHIFT) @@ -1181,8 +1183,6 @@ if not remshift: # So we can avoid problems with eq, AND avoid the need for normalize. - if self.sign == 0: - return self return rbigint([NULLDIGIT] * wordshift + self._digits, self.sign, self.numdigits() + wordshift) oldsize = self.numdigits() @@ -1423,6 +1423,12 @@ bits = ovfcheck((i-1) * SHIFT) + msd_bits return bits + def gcd(self, other): + """ Compute the (always positive) greatest common divisor of self and + other """ + return gcd_lehmer(self.abs(), other.abs()) + + def __repr__(self): return "" % (self._digits, self.sign, self.numdigits(), len(self._digits), @@ -2960,3 +2966,91 @@ z.setdigit(pdigit, accum) z._normalize() return z + + +def gcd_binary(a, b): + """ Compute the greatest common divisor of non-negative integers a and b + using the binary GCD algorithm. Raises ValueError on negative input. """ + if a < 0 or b < 0: + raise ValueError + + if a == 0: + return b + + if b == 0: + return a + + shift = 0 + while (a | b) & 1 == 0: + a >>= 1 + b >>= 1 + shift += 1 + + while a & 1 == 0: + a >>= 1 + + while b & 1 == 0: + b >>= 1 + + while a != b: + a, b = abs(a - b), min(a, b) + while a & 1 == 0: + a >>= 1 + + return a << shift + +def lehmer_xgcd(a, b): + s_old, s_new = 1, 0 + t_old, t_new = 0, 1 + while b >> (SHIFT >> 1): + q, r = a // b, a % b + + a, b = b, r + s_old, s_new = s_new, s_old - q * s_new + t_old, t_new = t_new, t_old - q * t_new + + return s_old, t_old, s_new, t_new + +def gcd_lehmer(a, b): + if a.lt(b): + a, b = b, a + + while b.size > 1: + a_ms = a.digit(abs(a.size-1)) + + x = 0 + while a_ms & (0xFF << SHIFT-8) == 0: + a_ms <<= 8 + x += 8 + + while a_ms & (1 << SHIFT-1) == 0: + a_ms <<= 1 + x += 1 + + a_ms |= a.digit(abs(a.size-2)) >> SHIFT-x + + if a.size == b.size: + b_ms = (b.digit(abs(b.size-1)) << x) | (b.digit(abs(b.size-2)) >> SHIFT-x) + elif a.size == b.size+1: + b_ms = b.digit(abs(b.size-1)) >> SHIFT-x + else: + b_ms = 0 + + if b_ms >> (SHIFT+1 >> 1) == 0: + a, b = b, a.mod(b) + continue + + s_old, t_old, s_new, t_new = lehmer_xgcd(a_ms, b_ms) + + n_a = a.int_mul(s_new).add(b.int_mul(t_new)).abs() + b = a.int_mul(s_old).add(b.int_mul(t_old)).abs() + a = n_a + + if a.lt(b): + a, b = b, a + + if not b.tobool(): + return a + + a = a.mod(b) + return rbigint.fromint(gcd_binary(b.toint(), a.toint())) diff -Nru pypy-7.1.1+dfsg/rpython/rlib/rdtoa.py pypy-7.3.1+dfsg/rpython/rlib/rdtoa.py --- pypy-7.1.1+dfsg/rpython/rlib/rdtoa.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/rlib/rdtoa.py 2020-04-10 19:28:41.000000000 +0000 @@ -60,14 +60,14 @@ try: # note: don't use the class scoped_view_charp here, it # break some tests because this function is used by the GC - ll_input, flag = rffi.get_nonmovingbuffer_final_null(input) + ll_input, llobj, flag = rffi.get_nonmovingbuffer_ll_final_null(input) try: result = dg_strtod(ll_input, end_ptr) endpos = (rffi.cast(lltype.Signed, end_ptr[0]) - rffi.cast(lltype.Signed, ll_input)) finally: - rffi.free_nonmovingbuffer(input, ll_input, flag) + rffi.free_nonmovingbuffer_ll(ll_input, llobj, flag) finally: lltype.free(end_ptr, flavor='raw') diff -Nru pypy-7.1.1+dfsg/rpython/rlib/rfile.py pypy-7.3.1+dfsg/rpython/rlib/rfile.py --- pypy-7.1.1+dfsg/rpython/rlib/rfile.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/rlib/rfile.py 2020-04-10 19:28:41.000000000 +0000 @@ -312,6 +312,10 @@ if not self._ll_file: raise ValueError("I/O operation on closed file") + @property + def closed(self): + return not self._ll_file + def _fread(self, buf, n, stream): if not self._univ_newline: return c_fread(buf, 1, n, stream) diff -Nru pypy-7.1.1+dfsg/rpython/rlib/rgc.py pypy-7.3.1+dfsg/rpython/rlib/rgc.py --- pypy-7.1.1+dfsg/rpython/rlib/rgc.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/rlib/rgc.py 2020-04-10 19:28:41.000000000 +0000 @@ -690,6 +690,13 @@ hop.exception_cannot_occur() return hop.genop('gc_move_out_of_nursery', hop.args_v, resulttype=hop.r_result) +@jit.dont_look_inside +def increase_root_stack_depth(new_depth): + """Shadowstack: make sure the size of the shadowstack is at least + 'new_depth' pointers.""" + from rpython.rtyper.lltypesystem.lloperation import llop + llop.gc_increase_root_stack_depth(lltype.Void, new_depth) + # ____________________________________________________________ @@ -828,6 +835,11 @@ _gcflag_extras.add(gcref) toggle_gcflag_extra._subopnum = 3 +@not_rpython +def get_gcflag_dummy(gcref): + return False +get_gcflag_dummy._subopnum = 4 + def assert_no_more_gcflags(): if not we_are_translated(): assert not _gcflag_extras @@ -1072,7 +1084,8 @@ return hop.genop('gc_typeids_list', [], resulttype = hop.r_result) class Entry(ExtRegistryEntry): - _about_ = (has_gcflag_extra, get_gcflag_extra, toggle_gcflag_extra) + _about_ = (has_gcflag_extra, get_gcflag_extra, toggle_gcflag_extra, + get_gcflag_dummy) def compute_result_annotation(self, s_arg=None): from rpython.annotator.model import s_Bool return s_Bool diff -Nru pypy-7.1.1+dfsg/rpython/rlib/rgil.py pypy-7.3.1+dfsg/rpython/rlib/rgil.py --- pypy-7.1.1+dfsg/rpython/rlib/rgil.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/rlib/rgil.py 2020-04-10 19:28:41.000000000 +0000 @@ -3,7 +3,7 @@ from rpython.translator.tool.cbuild import ExternalCompilationInfo from rpython.rtyper.lltypesystem import lltype, llmemory, rffi from rpython.rtyper.extregistry import ExtRegistryEntry -from rpython.rlib.objectmodel import not_rpython +from rpython.rlib.objectmodel import not_rpython, we_are_translated # these functions manipulate directly the GIL, whose definition does not # escape the C code itself @@ -38,6 +38,10 @@ _nowrapper=True, sandboxsafe=True, compilation_info=eci) +_gil_get_holder = llexternal('RPyGilGetHolder', [], lltype.Signed, + _nowrapper=True, sandboxsafe=True, + compilation_info=eci) + # ____________________________________________________________ @@ -104,23 +108,86 @@ hop.exception_cannot_occur() + +class EmulatedGilHolder: + def __init__(self): + try: + import thread + except ImportError: + import dummy_thread as thread + self._tid = self._get_ident() + self._lock = thread.allocate_lock() + self._lock.acquire() + + def _get_ident(self): + from rpython.rlib import rthread + tid = rthread.get_ident() + assert tid != 0 + return tid + + def release(self): + assert self._tid == self._get_ident() + self._tid = 0 + self._lock.release() + + def acquire(self): + assert self._tid != self._get_ident() + self._lock.acquire() + assert self._tid == 0 + self._tid = self._get_ident() + + def get_holder(self): + return self._tid + + +_emulated_gil_holder = None + +def _reset_emulated_gil_holder(): + # called from rpython/conftest.py + if _emulated_gil_holder is not None and _emulated_gil_holder._tid == 0: + _emulated_gil_holder.acquire() + + def allocate(): - _gil_allocate() + global _emulated_gil_holder + if we_are_translated(): + _gil_allocate() + elif _emulated_gil_holder is None: + _emulated_gil_holder = EmulatedGilHolder() def release(): # this function must not raise, in such a way that the exception # transformer knows that it cannot raise! - _gil_release() + if we_are_translated(): + _gil_release() + else: + allocate() + _emulated_gil_holder.release() release._gctransformer_hint_cannot_collect_ = True release._dont_reach_me_in_del_ = True def acquire(): + if we_are_translated(): + from rpython.rlib import rthread + _gil_acquire() + rthread.gc_thread_run() + else: + allocate() + _emulated_gil_holder.acquire() + _after_thread_switch() +acquire._gctransformer_hint_cannot_collect_ = True +acquire._dont_reach_me_in_del_ = True + +def acquire_maybe_in_new_thread(): + if not we_are_translated(): + return acquire() from rpython.rlib import rthread + rthread.get_or_make_ident() #make sure that the threadlocals are initialized _gil_acquire() rthread.gc_thread_run() _after_thread_switch() -acquire._gctransformer_hint_cannot_collect_ = True -acquire._dont_reach_me_in_del_ = True +acquire_maybe_in_new_thread._gctransformer_hint_cannot_collect_ = True +acquire_maybe_in_new_thread._dont_reach_me_in_del_ = True # The _gctransformer_hint_cannot_collect_ hack is needed for # translations in which the *_external_call() functions are not inlined. @@ -133,10 +200,14 @@ # explicitly release the gil, in a way that tries to give more # priority to other threads (as opposed to continuing to run in # the same thread). - if _gil_yield_thread(): - from rpython.rlib import rthread - rthread.gc_thread_run() - _after_thread_switch() + if we_are_translated(): + if _gil_yield_thread(): + from rpython.rlib import rthread + rthread.gc_thread_run() + _after_thread_switch() + else: + release() + acquire() yield_thread._gctransformer_hint_close_stack_ = True yield_thread._dont_reach_me_in_del_ = True yield_thread._dont_inline_ = True @@ -144,3 +215,15 @@ # yield_thread() needs a different hint: _gctransformer_hint_close_stack_. # The *_external_call() functions are themselves called only from the rffi # module from a helper function that also has this hint. + +def gil_get_holder(): + if we_are_translated(): + return _gil_get_holder() + else: + allocate() + return _emulated_gil_holder.get_holder() + +def am_I_holding_the_GIL(): + from rpython.rlib import rthread + my_tid = rthread.get_or_make_ident() + return gil_get_holder() == my_tid diff -Nru pypy-7.1.1+dfsg/rpython/rlib/rjitlog/test/test_jitlog.py pypy-7.3.1+dfsg/rpython/rlib/rjitlog/test/test_jitlog.py --- pypy-7.1.1+dfsg/rpython/rlib/rjitlog/test/test_jitlog.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/rlib/rjitlog/test/test_jitlog.py 2020-04-10 19:28:41.000000000 +0000 @@ -5,6 +5,8 @@ from rpython.rlib.rjitlog import rjitlog as jl from rpython.jit.metainterp.history import AbstractDescr from rpython.rlib.objectmodel import compute_unique_id +from rpython.rlib.rfile import create_file +from rpython.rlib.rposix import FdValidator class FakeCallAssemblerLoopToken(AbstractDescr): def __init__(self, target): @@ -51,14 +53,18 @@ logger = jl.JitLogger() file = tmpdir.join('binary_file') file.ensure() - fd = file.open('wb') - jl.jitlog_init(fd.fileno()) - logger.start_new_trace(metainterp_sd, jd_name='jdname') - log_trace = logger.log_trace(jl.MARK_TRACE, None, None) - op = ResOperation(rop.DEBUG_MERGE_POINT, [ConstInt(0), ConstInt(0), ConstInt(0)]) - log_trace.write([], [op]) - #the next line will close 'fd', instead of logger.finish() - fd.close() + # use rfile instead of file.open since the host python and compiled + # code may use different runtime libraries (win32 visual2008 vs. + # visual2019 for instance + rfile = create_file(str(file), 'wb') + with FdValidator(rfile.fileno()): + jl.jitlog_init(rfile.fileno()) + logger.start_new_trace(metainterp_sd, jd_name='jdname') + log_trace = logger.log_trace(jl.MARK_TRACE, None, None) + op = ResOperation(rop.DEBUG_MERGE_POINT, [ConstInt(0), ConstInt(0), ConstInt(0)]) + log_trace.write([], [op]) + #the next line will close the 'fd', instead of logger.finish() + rfile.close() binary = file.read() is_32bit = chr(sys.maxint == 2**31-1) assert binary == (jl.MARK_START_TRACE) + jl.encode_le_addr(1) + \ @@ -121,15 +127,19 @@ logger = jl.JitLogger() file = tmpdir.join('binary_file') file.ensure() - fd = file.open('wb') - jl.jitlog_init(fd.fileno()) - logger.start_new_trace(metainterp_sd, jd_name='jdname') - log_trace = logger.log_trace(jl.MARK_TRACE, None, None) - op = ResOperation(rop.CALL_ASSEMBLER_I, [], descr=looptoken) - log_trace.write([], [op]) - jl.redirect_assembler(looptoken, newlooptoken, 0x1234) - #the next line will close 'fd', instead of logger.finish() - fd.close() + # use rfile instead of file.open since the host python and compiled + # code may use different runtime libraries (win32 visual2008 vs. + # visual2019 for instance + rfile = create_file(str(file), 'wb') + with FdValidator(rfile.fileno()): + jl.jitlog_init(rfile.fileno()) + logger.start_new_trace(metainterp_sd, jd_name='jdname') + log_trace = logger.log_trace(jl.MARK_TRACE, None, None) + op = ResOperation(rop.CALL_ASSEMBLER_I, [], descr=looptoken) + log_trace.write([], [op]) + jl.redirect_assembler(looptoken, newlooptoken, 0x1234) + #the next line will close the 'fd', instead of logger.finish() + rfile.close() binary = file.read() opnum = jl.encode_le_16bit(rop.CALL_ASSEMBLER_I) id_looptoken = compute_unique_id(looptoken) diff -Nru pypy-7.1.1+dfsg/rpython/rlib/rposix.py pypy-7.3.1+dfsg/rpython/rlib/rposix.py --- pypy-7.1.1+dfsg/rpython/rlib/rposix.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/rlib/rposix.py 2020-04-10 19:28:41.000000000 +0000 @@ -109,9 +109,6 @@ wchar_t const* file, unsigned int line, uintptr_t pReserved) { - wprintf(L"Invalid parameter detected in function %s." - L" File: %s Line: %d\\n", function, file, line); - wprintf(L"Expression: %s\\n", expression); } RPY_EXTERN void* enter_suppress_iph(void) @@ -803,7 +800,7 @@ DIRENT = rffi_platform.Struct('struct dirent', [('d_name', lltype.FixedSizeArray(rffi.CHAR, 1)), ('d_ino', lltype.Signed)] - + [('d_type', rffi.INT)] if HAVE_D_TYPE else []) + + ([('d_type', rffi.INT)] if HAVE_D_TYPE else [])) if HAVE_D_TYPE: DT_UNKNOWN = rffi_platform.ConstantInteger('DT_UNKNOWN') DT_REG = rffi_platform.ConstantInteger('DT_REG') @@ -1265,16 +1262,16 @@ @replace_os_function('rename') @specialize.argtype(0, 1) def rename(path1, path2): - if not _WIN32: - handle_posix_error('rename', - c_rename(_as_bytes0(path1), _as_bytes0(path2))) - else: + if _WIN32: traits = _preferred_traits2(path1, path2) win32traits = make_win32_traits(traits) path1 = traits.as_str0(path1) path2 = traits.as_str0(path2) if not win32traits.MoveFileEx(path1, path2, 0): raise rwin32.lastSavedWindowsError() + else: + handle_posix_error('rename', + c_rename(_as_bytes0(path1), _as_bytes0(path2))) @specialize.argtype(0, 1) def replace(path1, path2): @@ -1934,8 +1931,7 @@ rffi.INT, save_err=rffi.RFFI_FULL_ERRNO_ZERO) c_sched_get_priority_min = external('sched_get_priority_min', [rffi.INT], rffi.INT, save_err=rffi.RFFI_SAVE_ERRNO) - if not _WIN32: - c_sched_yield = external('sched_yield', [], rffi.INT) + c_sched_yield = external('sched_yield', [], rffi.INT) @enforceargs(int) def sched_get_priority_max(policy): @@ -1948,6 +1944,36 @@ def sched_yield(): return handle_posix_error('sched_yield', c_sched_yield()) + c_getgroupslist = external('getgrouplist', [rffi.CCHARP, GID_T, + GID_GROUPS_T, rffi.INTP], rffi.INT, + save_err=rffi.RFFI_SAVE_ERRNO) + + def getgrouplist(user, group): + groups_p = lltype.malloc(GID_GROUPS_T.TO, 64, flavor='raw') + ngroups_p = lltype.malloc(rffi.INTP.TO, 1, flavor='raw') + ngroups_p[0] = rffi.cast(rffi.INT, 64) + try: + n = handle_posix_error('getgrouplist', c_getgroupslist(user, group, + groups_p, ngroups_p)) + if n == -1: + if widen(ngroups_p[0]) > 64: + # reallocate. Should never happen + lltype.free(groups_p, flavor='raw') + groups_p = lltype.nullptr(GID_GROUPS_T.TO) + groups_p = lltype.malloc(GID_GROUPS_T.TO, widen(ngroups_p[0]), + flavor='raw') + + n = handle_posix_error('getgrouplist', c_getgroupslist(user, + group, groups_p, ngroups_p)) + ngroups = widen(ngroups_p[0]) + groups = [0] * ngroups + for i in range(ngroups): + groups[i] = groups_p[i] + return groups + finally: + lltype.free(ngroups_p, flavor='raw') + if groups_p: + lltype.free(groups_p, flavor='raw') #___________________________________________________________________ c_chroot = external('chroot', [rffi.CCHARP], rffi.INT, @@ -2545,7 +2571,7 @@ post_include_bits=['RPY_EXTERN int rpy_cpu_count(void);'] # cpu count for linux, windows and mac (+ bsds) # note that the code is copied from cpython and split up here -if sys.platform.startswith('linux'): +if sys.platform.startswith(('linux', 'gnu')): cpucount_eci = ExternalCompilationInfo(includes=["unistd.h"], separate_module_sources=[""" RPY_EXTERN int rpy_cpu_count(void) { diff -Nru pypy-7.1.1+dfsg/rpython/rlib/rsiphash.py pypy-7.3.1+dfsg/rpython/rlib/rsiphash.py --- pypy-7.1.1+dfsg/rpython/rlib/rsiphash.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/rlib/rsiphash.py 2020-04-10 19:28:41.000000000 +0000 @@ -123,8 +123,11 @@ def compute_result_annotation(self): translator = self.bookkeeper.annotator.translator - if translator.config.translation.reverse_debugger: - return # ignore and use the regular hash, with reverse-debugger + # you should not call enable_siphash24() when translating with the + # reverse-debugger, or with sandbox. + assert not translator.config.translation.reverse_debugger + assert not translator.config.translation.sandbox + # if hasattr(translator, 'll_hash_string'): assert translator.ll_hash_string == ll_hash_string_siphash24 else: @@ -167,10 +170,12 @@ # unicode strings where CPython uses 2 bytes per character. addr = rstr._get_raw_buf_unicode(rstr.UNICODE, ll_s, 0) SZ = rffi.sizeof(rstr.UNICODE.chars.OF) - for i in range(length): + i = 0 + while i < length: if ord(ll_s.chars[i]) > 0xFF: length *= SZ break + i += 1 else: x = _siphash24(addr, length, SZ) keepalive_until_here(ll_s) @@ -232,19 +237,29 @@ """Takes an address pointer and a size. Returns the hash as a r_uint64, which can then be casted to the expected type.""" - if BIG_ENDIAN: - index = SZ - 1 - else: - index = 0 if size < seed.bound_prebuilt_size: if size <= 0: return seed.hash_empty else: + if BIG_ENDIAN: + index = SZ - 1 + else: + index = 0 t = rarithmetic.intmask(llop.raw_load(rffi.UCHAR, addr_in, index)) return seed.hash_single[t] k0 = seed.k0l k1 = seed.k1l + return _siphash24_with_key(addr_in, size, k0, k1, SZ) + + +@rgc.no_collect +@specialize.arg(4) +def _siphash24_with_key(addr_in, size, k0, k1, SZ=1): + if BIG_ENDIAN: + index = SZ - 1 + else: + index = 0 b = r_uint64(size) << 56 v0 = k0 ^ magic0 v1 = k1 ^ magic1 @@ -331,6 +346,12 @@ with rffi.scoped_nonmovingbuffer(s) as p: return _siphash24(llmemory.cast_ptr_to_adr(p), len(s)) +@jit.dont_look_inside +def siphash24_with_key(s, k0, k1=0): + """'s' is a normal string. k0 and k1 are the seed keys + """ + with rffi.scoped_nonmovingbuffer(s) as p: + return _siphash24_with_key(llmemory.cast_ptr_to_adr(p), len(s), k0, k1) # Prebuilt hashes are precomputed here def _update_prebuilt_hashes(): diff -Nru pypy-7.1.1+dfsg/rpython/rlib/rsocket.py pypy-7.3.1+dfsg/rpython/rlib/rsocket.py --- pypy-7.1.1+dfsg/rpython/rlib/rsocket.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/rlib/rsocket.py 2020-04-10 19:28:41.000000000 +0000 @@ -1,4 +1,3 @@ -from __future__ import with_statement """ An RPython implementation of sockets based on rffi. Note that the interface has to be slightly different - this is not @@ -10,7 +9,8 @@ from errno import EINVAL from rpython.rlib import _rsocket_rffi as _c, jit, rgc -from rpython.rlib.objectmodel import instantiate, keepalive_until_here +from rpython.rlib.objectmodel import ( + specialize, instantiate, keepalive_until_here) from rpython.rlib.rarithmetic import intmask, r_uint from rpython.rlib import rthread, rposix from rpython.rtyper.lltypesystem import lltype, rffi @@ -29,10 +29,11 @@ constants = _c.constants -locals().update(constants) # Define constants from _c +locals().update(constants) # Define constants from _c if _c.WIN32: from rpython.rlib import rwin32 + def rsocket_startup(): wsadata = lltype.malloc(_c.WSAData, flavor='raw', zero=True) try: @@ -89,13 +90,13 @@ if self.addr_p: lltype.free(self.addr_p, flavor='raw', track_allocation=False) + @specialize.ll() def setdata(self, addr, addrlen): # initialize self.addr and self.addrlen. 'addr' can be a different # pointer type than exactly sockaddr_ptr, and we cast it for you. assert not self.addr_p self.addr_p = rffi.cast(_c.sockaddr_ptr, addr) self.addrlen = addrlen - setdata._annspecialcase_ = 'specialize:ll' # the following slightly strange interface is needed to manipulate # what self.addr_p points to in a safe way. The problem is that @@ -107,11 +108,11 @@ # use of 'addr'. The interface to do that is called lock()/unlock() # because it strongly reminds callers not to forget unlock(). # + @specialize.ll() def lock(self, TYPE=_c.sockaddr): """Return self.addr_p, cast as a pointer to TYPE. Must call unlock()! """ return rffi.cast(lltype.Ptr(TYPE), self.addr_p) - lock._annspecialcase_ = 'specialize:ll' def unlock(self): """To call after we're done with the pointer returned by lock(). @@ -157,11 +158,8 @@ except ValueError: pass else: - if (0 <= d0 <= 255 and - 0 <= d1 <= 255 and - 0 <= d2 <= 255 and - 0 <= d3 <= 255): - + if (0 <= d0 <= 255 and 0 <= d1 <= 255 and + 0 <= d2 <= 255 and 0 <= d3 <= 255): addr = intmask(d0 << 24) | (d1 << 16) | (d2 << 8) | (d3 << 0) addr = rffi.cast(rffi.UINT, addr) addr = htonl(addr) @@ -467,6 +465,9 @@ # ____________________________________________________________ +HAVE_SOCK_NONBLOCK = "SOCK_NONBLOCK" in constants +HAVE_SOCK_CLOEXEC = "SOCK_CLOEXEC" in constants + def familyclass(family): return _FAMILIES.get(family, Address) af_get = familyclass @@ -526,7 +527,7 @@ fd=_c.INVALID_SOCKET, inheritable=True): """Create a new socket.""" if _c.invalid_socket(fd): - if not inheritable and 'SOCK_CLOEXEC' in constants: + if not inheritable and HAVE_SOCK_CLOEXEC: # Non-inheritable: we try to call socket() with # SOCK_CLOEXEC, which may fail. If we get EINVAL, # then we fall back to the SOCK_CLOEXEC-less case. @@ -549,8 +550,15 @@ self.fd = fd self.family = family self.type = type + if HAVE_SOCK_CLOEXEC: + self.type &= ~SOCK_CLOEXEC + if HAVE_SOCK_NONBLOCK: + self.type &= ~SOCK_NONBLOCK self.proto = proto - self.settimeout(defaults.timeout) + if HAVE_SOCK_NONBLOCK and type & SOCK_NONBLOCK: + self.timeout = 0.0 + else: + self.settimeout(defaults.timeout) @staticmethod def empty_rsocket(): @@ -619,8 +627,8 @@ return 0 tv = rffi.make(_c.timeval) rffi.setintfield(tv, 'c_tv_sec', int(timeout)) - rffi.setintfield(tv, 'c_tv_usec', int((timeout-int(timeout)) - * 1000000)) + rffi.setintfield(tv, 'c_tv_usec', + int((timeout - int(timeout)) * 1000000)) fds = lltype.malloc(_c.fd_set.TO, flavor='raw') _c.FD_ZERO(fds) _c.FD_SET(self.fd, fds) @@ -637,7 +645,6 @@ return 1 return 0 - def error_handler(self): return last_error() @@ -659,8 +666,7 @@ address, addr_p, addrlen_p = self._addrbuf() try: remove_inheritable = not inheritable - if (not inheritable and 'SOCK_CLOEXEC' in constants - and _c.HAVE_ACCEPT4 + if (not inheritable and HAVE_SOCK_CLOEXEC and _c.HAVE_ACCEPT4 and _accept4_syscall.attempt_syscall()): newfd = _c.socketaccept4(self.fd, addr_p, addrlen_p, SOCK_CLOEXEC) @@ -716,7 +722,7 @@ tv = rffi.make(_c.timeval) rffi.setintfield(tv, 'c_tv_sec', int(timeout)) rffi.setintfield(tv, 'c_tv_usec', - int((timeout-int(timeout)) * 1000000)) + int((timeout - int(timeout)) * 1000000)) fds = lltype.malloc(_c.fd_set.TO, flavor='raw') _c.FD_ZERO(fds) _c.FD_SET(self.fd, fds) @@ -972,7 +978,7 @@ raise self.error_handler() @jit.dont_look_inside - def recvmsg(self, message_size, ancbufsize = 0, flags = 0): + def recvmsg(self, message_size, ancbufsize=0, flags=0): """ Receive up to message_size bytes from a message. Also receives ancillary data. Returns the message, ancillary, flag and address of the sender. @@ -987,46 +993,74 @@ raise RSocketError("invalid ancillary data buffer length") self.wait_for_data(False) - address, addr_p, addrlen_p = self._addrbuf() - len_of_msgs = lltype.malloc(rffi.SIGNEDPP.TO,1,flavor='raw',track_allocation=True,nonmovable=False) - messages = lltype.malloc(rffi.CCHARPP.TO,1,flavor='raw',track_allocation=True,nonmovable=False ) - messages[0] = lltype.malloc(rffi.CCHARP.TO, message_size,flavor='raw',track_allocation=True,nonmovable=False) + address, addr_p, addrlen_p = self._addrbuf() + len_of_msgs = lltype.malloc( + rffi.SIGNEDPP.TO, 1, + flavor='raw', track_allocation=True, nonmovable=False) + messages = lltype.malloc( + rffi.CCHARPP.TO, 1, + flavor='raw', track_allocation=True, nonmovable=False) + messages[0] = lltype.malloc( + rffi.CCHARP.TO, message_size, + flavor='raw', track_allocation=True, nonmovable=False) rffi.c_memset(messages[0], 0, message_size) - no_of_messages = lltype.malloc(rffi.SIGNEDP.TO,1,flavor='raw',track_allocation=True,nonmovable=False ) + no_of_messages = lltype.malloc( + rffi.SIGNEDP.TO, 1, + flavor='raw', track_allocation=True, nonmovable=False) no_of_messages[0] = rffi.cast(rffi.SIGNED, 0) - size_of_anc = lltype.malloc(rffi.SIGNEDP.TO,1,flavor='raw',track_allocation=True,nonmovable=False ) - size_of_anc[0] = rffi.cast(rffi.SIGNED,0) - levels = lltype.malloc(rffi.SIGNEDPP.TO,1,flavor='raw',track_allocation=True,nonmovable=False) - types = lltype.malloc(rffi.SIGNEDPP.TO,1,flavor='raw',track_allocation=True,nonmovable=False) - file_descr = lltype.malloc(rffi.CCHARPP.TO,1,flavor='raw',track_allocation=True,nonmovable=False ) - descr_per_anc = lltype.malloc(rffi.SIGNEDPP.TO,1,flavor='raw',track_allocation=True,nonmovable=False) - retflag = lltype.malloc(rffi.SIGNEDP.TO,1,flavor='raw',track_allocation=True,nonmovable=False ) - retflag[0] = rffi.cast(rffi.SIGNED,0) + size_of_anc = lltype.malloc( + rffi.SIGNEDP.TO, 1, + flavor='raw', track_allocation=True, nonmovable=False) + size_of_anc[0] = rffi.cast(rffi.SIGNED, 0) + levels = lltype.malloc( + rffi.SIGNEDPP.TO, 1, + flavor='raw', track_allocation=True, nonmovable=False) + types = lltype.malloc( + rffi.SIGNEDPP.TO, 1, + flavor='raw', track_allocation=True, nonmovable=False) + file_descr = lltype.malloc( + rffi.CCHARPP.TO, 1, + flavor='raw', track_allocation=True, nonmovable=False) + descr_per_anc = lltype.malloc( + rffi.SIGNEDPP.TO, 1, + flavor='raw', track_allocation=True, nonmovable=False) + retflag = lltype.malloc( + rffi.SIGNEDP.TO, 1, + flavor='raw', track_allocation=True, nonmovable=False) + retflag[0] = rffi.cast(rffi.SIGNED, 0) # a mask for the SIGNEDP's that need to be cast to int. (long default) - reply = _c.recvmsg(self.fd, rffi.cast(lltype.Signed,message_size), - rffi.cast(lltype.Signed,ancbufsize),rffi.cast(lltype.Signed,flags), - addr_p, addrlen_p, len_of_msgs, messages, no_of_messages,size_of_anc, - levels, types,file_descr,descr_per_anc,retflag) + reply = _c.recvmsg( + self.fd, rffi.cast(lltype.Signed, message_size), + rffi.cast(lltype.Signed, ancbufsize), + rffi.cast(lltype.Signed, flags), + addr_p, addrlen_p, len_of_msgs, messages, no_of_messages, + size_of_anc, levels, types, file_descr, descr_per_anc, retflag) if reply >= 0: - anc_size = rffi.cast(rffi.SIGNED,size_of_anc[0]) - returnflag = rffi.cast(rffi.SIGNED,retflag[0]) - addrlen = rffi.cast(rffi.SIGNED,addrlen_p[0]) + anc_size = rffi.cast(rffi.SIGNED, size_of_anc[0]) + returnflag = rffi.cast(rffi.SIGNED, retflag[0]) + addrlen = rffi.cast(rffi.SIGNED, addrlen_p[0]) - retmsg = rffi.charpsize2str(messages[0],reply) + retmsg = rffi.charpsize2str(messages[0], reply) offset = 0 list_of_tuples = [] - pre_anc = lltype.malloc(rffi.CCHARPP.TO, 1, flavor='raw', track_allocation=True, nonmovable=False) + pre_anc = lltype.malloc( + rffi.CCHARPP.TO, 1, + flavor='raw', track_allocation=True, nonmovable=False) for i in range(anc_size): level = rffi.cast(rffi.SIGNED, levels[0][i]) type = rffi.cast(rffi.SIGNED, types[0][i]) bytes_in_anc = rffi.cast(rffi.SIGNED, descr_per_anc[0][i]) - pre_anc[0] = lltype.malloc(rffi.CCHARP.TO, bytes_in_anc,flavor='raw',track_allocation=True,nonmovable=False) - _c.memcpy_from_CCHARP_at_offset(file_descr[0], pre_anc,rffi.cast(rffi.SIGNED,offset), bytes_in_anc) - anc = rffi.charpsize2str(pre_anc[0],bytes_in_anc) - tup = (level,type, anc) + pre_anc[0] = lltype.malloc( + rffi.CCHARP.TO, bytes_in_anc, + flavor='raw', track_allocation=True, nonmovable=False) + _c.memcpy_from_CCHARP_at_offset( + file_descr[0], pre_anc, rffi.cast(rffi.SIGNED, offset), + bytes_in_anc) + anc = rffi.charpsize2str(pre_anc[0], bytes_in_anc) + tup = (level, type, anc) list_of_tuples.append(tup) offset += bytes_in_anc lltype.free(pre_anc[0], flavor='raw') @@ -1037,7 +1071,7 @@ address.unlock() address = None - rettup = (retmsg,list_of_tuples,returnflag,address) + rettup = (retmsg, list_of_tuples, returnflag, address) if address is not None: address.unlock() @@ -1049,22 +1083,21 @@ _c.freesignedp(descr_per_anc) lltype.free(messages[0], flavor='raw') - lltype.free(pre_anc,flavor='raw') - lltype.free(messages,flavor='raw') - lltype.free(file_descr,flavor='raw') - lltype.free(len_of_msgs,flavor='raw') + lltype.free(pre_anc, flavor='raw') + lltype.free(messages, flavor='raw') + lltype.free(file_descr, flavor='raw') + lltype.free(len_of_msgs, flavor='raw') lltype.free(no_of_messages, flavor='raw') lltype.free(size_of_anc, flavor='raw') lltype.free(levels, flavor='raw') lltype.free(types, flavor='raw') lltype.free(descr_per_anc, flavor='raw') lltype.free(retflag, flavor='raw') - lltype.free(addrlen_p,flavor='raw') + lltype.free(addrlen_p, flavor='raw') return rettup else: - - #in case of failure the underlying complexity has already been freed + # in case of failure the underlying complexity has already been freed lltype.free(messages[0], flavor='raw') lltype.free(messages, flavor='raw') lltype.free(file_descr, flavor='raw') @@ -1086,11 +1119,11 @@ if (reply == -10001): raise RSocketError("Invalid ancillary data buffer length") if (reply == -10002): - raise RSocketError("received malformed or improperly truncated ancillary data") + raise RSocketError( + "received malformed or improperly truncated " + "ancillary data") raise last_error() - - def send_raw(self, dataptr, length, flags=0): """Send data from a CCHARP buffer.""" self.wait_for_data(True) @@ -1159,8 +1192,12 @@ addrlen = address.addrlen no_of_messages = len(messages) - messages_ptr = lltype.malloc(rffi.CCHARPP.TO,no_of_messages+1,flavor='raw',track_allocation=True,nonmovable=False) - messages_length_ptr = lltype.malloc(rffi.SIGNEDP.TO,no_of_messages,flavor='raw',zero=True, track_allocation=True,nonmovable=False) + messages_ptr = lltype.malloc( + rffi.CCHARPP.TO, no_of_messages + 1, + flavor='raw', track_allocation=True, nonmovable=False) + messages_length_ptr = lltype.malloc( + rffi.SIGNEDP.TO, no_of_messages, + flavor='raw', zero=True, track_allocation=True, nonmovable=False) counter = 0 for message in messages: messages_ptr[counter] = rffi.str2charp(message) @@ -1171,28 +1208,39 @@ size_of_ancillary = len(ancillary) else: size_of_ancillary = 0 - levels = lltype.malloc(rffi.SIGNEDP.TO, size_of_ancillary,flavor='raw',zero=True, track_allocation=True,nonmovable=False) - types = lltype.malloc(rffi.SIGNEDP.TO, size_of_ancillary,flavor='raw',zero=True, track_allocation=True,nonmovable=False) - desc_per_ancillary = lltype.malloc(rffi.SIGNEDP.TO, size_of_ancillary,flavor='raw',zero=True, track_allocation=True,nonmovable=False) - file_descr = lltype.malloc(rffi.CCHARPP.TO, size_of_ancillary,flavor='raw', track_allocation=True,nonmovable=False) + levels = lltype.malloc( + rffi.SIGNEDP.TO, size_of_ancillary, + flavor='raw', zero=True, track_allocation=True, nonmovable=False) + types = lltype.malloc( + rffi.SIGNEDP.TO, size_of_ancillary, + flavor='raw', zero=True, track_allocation=True, nonmovable=False) + desc_per_ancillary = lltype.malloc( + rffi.SIGNEDP.TO, size_of_ancillary, + flavor='raw', zero=True, track_allocation=True, nonmovable=False) + file_descr = lltype.malloc( + rffi.CCHARPP.TO, size_of_ancillary, + flavor='raw', track_allocation=True, nonmovable=False) if ancillary is not None: counter = 0 for level, type, content in ancillary: - assert isinstance(type,int) + assert isinstance(type, int) assert isinstance(level, int) - levels[counter] = rffi.cast(rffi.SIGNED,level) - types[counter] = rffi.cast(rffi.SIGNED,type) - desc_per_ancillary[counter] = rffi.cast(rffi.SIGNED, (len(content))) - file_descr[counter] = rffi.str2charp(content, track_allocation=True) - counter +=1 + levels[counter] = rffi.cast(rffi.SIGNED, level) + types[counter] = rffi.cast(rffi.SIGNED, type) + desc_per_ancillary[counter] = rffi.cast( + rffi.SIGNED, (len(content))) + file_descr[counter] = rffi.str2charp( + content, track_allocation=True) + counter += 1 else: size_of_ancillary = 0 snd_no_msgs = rffi.cast(rffi.SIGNED, no_of_messages) - snd_anc_size =rffi.cast(rffi.SIGNED, size_of_ancillary) - - - bytes_sent = _c.sendmsg(self.fd, addr, addrlen, messages_length_ptr, messages_ptr, snd_no_msgs,levels,types,file_descr,desc_per_ancillary,snd_anc_size,flags) + snd_anc_size = rffi.cast(rffi.SIGNED, size_of_ancillary) + bytes_sent = _c.sendmsg( + self.fd, addr, addrlen, messages_length_ptr, messages_ptr, + snd_no_msgs, levels, types, file_descr, + desc_per_ancillary, snd_anc_size, flags) if need_to_free_address: address.unlock() @@ -1210,13 +1258,12 @@ lltype.free(file_descr, flavor='raw', track_allocation=True) self.wait_for_data(True) - if (bytes_sent < 0) and (bytes_sent!=-1000) and (bytes_sent!=-1001) and (bytes_sent!=-1002): + if ((bytes_sent < 0) and (bytes_sent != -1000) and + (bytes_sent != -1001) and (bytes_sent != -1002)): raise last_error() return bytes_sent - - def setblocking(self, block): if block: timeout = -1.0 @@ -1260,6 +1307,7 @@ # ____________________________________________________________ +@specialize.arg(4) def make_socket(fd, family, type, proto, SocketClass=RSocket): result = instantiate(SocketClass) result.fd = fd @@ -1268,7 +1316,6 @@ result.proto = proto result.timeout = defaults.timeout return result -make_socket._annspecialcase_ = 'specialize:arg(4)' if _c.WIN32: def sock_set_inheritable(fd, inheritable): @@ -1299,15 +1346,20 @@ class SocketError(Exception): applevelerrcls = 'error' + def __init__(self): pass + def get_msg(self): return '' + def get_msg_unicode(self): return self.get_msg().decode('latin-1') + def get_msg_utf8(self): msg = self.get_msg() return msg, len(msg) + def __str__(self): return self.get_msg() @@ -1318,35 +1370,44 @@ class RSocketError(SocketError): def __init__(self, message): self.message = message + def get_msg(self): return self.message class CSocketError(SocketErrorWithErrno): def get_msg(self): return _c.socket_strerror_str(self.errno) + def get_msg_unicode(self): return _c.socket_strerror_unicode(self.errno) + def get_msg_utf8(self): return _c.socket_strerror_utf8(self.errno) + def last_error(): return CSocketError(_c.geterrno()) class GAIError(SocketErrorWithErrno): applevelerrcls = 'gaierror' + def get_msg(self): return _c.gai_strerror_str(self.errno) + def get_msg_unicode(self): return _c.gai_strerror_unicode(self.errno) + def get_msg_utf8(self): return _c.gai_strerror_utf8(self.errno) class HSocketError(SocketError): applevelerrcls = 'herror' + def __init__(self, host): self.host = host # XXX h_errno is not easily available, and hstrerror() is # marked as deprecated in the Linux man pages + def get_msg(self): return "host lookup failed: '%s'" % (self.host,) @@ -1356,7 +1417,7 @@ return 'timed out' class Defaults: - timeout = -1.0 # Blocking + timeout = -1.0 # Blocking defaults = Defaults() @@ -1380,7 +1441,7 @@ try: res = -1 remove_inheritable = not inheritable - if not inheritable and 'SOCK_CLOEXEC' in constants: + if not inheritable and HAVE_SOCK_CLOEXEC: # Non-inheritable: we try to call socketpair() with # SOCK_CLOEXEC, which may fail. If we get EINVAL, # then we fall back to the SOCK_CLOEXEC-less case. @@ -1412,7 +1473,7 @@ make_socket(fd1, family, type, proto, SocketClass)) if _c.HAVE_SENDMSG: - def CMSG_LEN( demanded_len): + def CMSG_LEN(demanded_len): """ Socket method to determine the optimal byte size of the ancillary. Recommended to be used when computing the ancillary size for recvmsg. @@ -1424,7 +1485,7 @@ result = _c.CMSG_LEN(demanded_len) return result - def CMSG_SPACE( demanded_size): + def CMSG_SPACE(demanded_size): """ Socket method to determine the optimal byte size of the ancillary. Recommended to be used when computing the ancillary size for recvmsg. @@ -1569,10 +1630,10 @@ (port_or_service is None or port_or_service == '0'): port_or_service = '00' hints = lltype.malloc(_c.addrinfo, flavor='raw', zero=True) - rffi.setintfield(hints, 'c_ai_family', family) + rffi.setintfield(hints, 'c_ai_family', family) rffi.setintfield(hints, 'c_ai_socktype', socktype) rffi.setintfield(hints, 'c_ai_protocol', proto) - rffi.setintfield(hints, 'c_ai_flags' , flags) + rffi.setintfield(hints, 'c_ai_flags', flags) # XXX need to lock around getaddrinfo() calls? p_res = lltype.malloc(rffi.CArray(_c.addrinfo_ptr), 1, flavor='raw') error = intmask(_c.getaddrinfo(host, port_or_service, hints, p_res)) @@ -1644,6 +1705,35 @@ finally: lltype.free(host, flavor='raw') +@jit.dont_look_inside +def getsockopt_int(fd, level, option): + # XXX almost the same code as RSocket.getsockopt_int + # some win32 calls use only a byte to represent a bool + # zero out so the result is correct anyway + with lltype.scoped_alloc(rffi.INTP.TO, n=1, zero=True) as flag_p, \ + lltype.scoped_alloc(_c.socklen_t_ptr.TO) as flagsize_p: + flagsize_p[0] = rffi.cast(_c.socklen_t, rffi.sizeof(rffi.INT)) + res = _c.socketgetsockopt(fd, level, option, + rffi.cast(rffi.VOIDP, flag_p), + flagsize_p) + if res < 0: + raise last_error() + result = rffi.cast(lltype.Signed, flag_p[0]) + return result + +@jit.dont_look_inside +def get_socket_family(fd): + """Return the family of a file descriptor.""" + with lltype.scoped_alloc(_c.sockaddr, zero=True) as addr_p, \ + lltype.scoped_alloc(_c.socklen_t_ptr.TO) as addrlen_p: + addrlen_p[0] = rffi.cast(_c.socklen_t, sizeof(_c.sockaddr)) + res = _c.socketgetsockname(fd, addr_p, addrlen_p) + addrlen = addrlen_p[0] + result = rffi.cast(lltype.Signed, addr_p.c_sa_family) + if res < 0: + raise last_error() + return result + if hasattr(_c, 'inet_aton'): def inet_aton(ip): "IPv4 dotted string -> packed 32-bits string" diff -Nru pypy-7.1.1+dfsg/rpython/rlib/_rsocket_rffi.py pypy-7.3.1+dfsg/rpython/rlib/_rsocket_rffi.py --- pypy-7.1.1+dfsg/rpython/rlib/_rsocket_rffi.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/rlib/_rsocket_rffi.py 2020-04-10 19:28:41.000000000 +0000 @@ -149,7 +149,7 @@ IPPROTO_ICMPV6 IPPROTO_IDP IPPROTO_IGMP IPPROTO_IPCOMP IPPROTO_IPIP IPPROTO_IPV4 IPPROTO_IPV6 IPPROTO_MAX IPPROTO_MOBILE IPPROTO_ND IPPROTO_NONE IPPROTO_PIM IPPROTO_PUP IPPROTO_ROUTING IPPROTO_RSVP IPPROTO_TCP IPPROTO_TP -IPPROTO_VRRP IPPROTO_XTP +IPPROTO_VRRP IPPROTO_XTP IPPROTO_SCTP IPV6_CHECKSUM IPV6_DONTFRAG IPV6_DSTOPTS IPV6_HOPLIMIT IPV6_HOPOPTS IPV6_JOIN_GROUP IPV6_LEAVE_GROUP IPV6_MULTICAST_HOPS IPV6_MULTICAST_IF @@ -179,7 +179,7 @@ SOCK_DGRAM SOCK_RAW SOCK_RDM SOCK_SEQPACKET SOCK_STREAM -SOCK_CLOEXEC +SOCK_CLOEXEC SOCK_NONBLOCK SOL_SOCKET SOL_IPX SOL_AX25 SOL_ATALK SOL_NETROM SOL_ROSE @@ -203,9 +203,12 @@ FD_CONNECT_BIT FD_CLOSE_BIT WSA_IO_PENDING WSA_IO_INCOMPLETE WSA_INVALID_HANDLE WSA_INVALID_PARAMETER WSA_NOT_ENOUGH_MEMORY WSA_OPERATION_ABORTED +WSA_FLAG_OVERLAPPED SIO_RCVALL SIO_KEEPALIVE_VALS SIOCGIFNAME SIOCGIFINDEX + +SO_DOMAIN SO_PROTOCOL SO_PEERSEC SO_PASSSEC TCP_USER_TIMEOUT TCP_CONGESTION '''.split() for name in constant_names: @@ -213,8 +216,8 @@ if _WIN32: # some SDKs define these values with an enum, #ifdef won't work - for name in ('RCVALL_ON', 'RCVALL_OFF', 'RCVALL_SOCKETLEVELONLY'): - setattr(CConfig, name, platform.ConstantInteger(name)) + for name in ('RCVALL_ON', 'RCVALL_OFF', 'RCVALL_SOCKETLEVELONLY', 'TCP_FASTOPEN'): + setattr(CConfig, name, platform.DefinedConstantInteger(name)) constant_names.append(name) constants["BDADDR_ANY"] = "00:00:00:00:00:00" @@ -225,6 +228,7 @@ ('SOL_UDP', 17), ('SOMAXCONN', 5), ('IPPROTO_IP', 6), + ('IPPROTO_IPV6', 41), ('IPPROTO_ICMP', 1), ('IPPROTO_TCP', 6), ('IPPROTO_UDP', 17), @@ -1009,6 +1013,7 @@ CConfig.WSAPROTOCOL_INFO = platform.Struct( 'WSAPROTOCOL_INFOA', []) # Struct is just passed between functions + CConfig.FROM_PROTOCOL_INFO = platform.DefinedConstantInteger( 'FROM_PROTOCOL_INFO') @@ -1034,6 +1039,45 @@ ('keepalivetime', rffi.ULONG), ('keepaliveinterval', rffi.ULONG)]) + CConfig.GUID = platform.Struct( + 'struct _GUID', + [('Data1', rffi.UINT), + ('Data2', rffi.UINT), + ('Data3', rffi.UINT), + ('Data4', rffi.CFixedArray(rffi.UCHAR, 8)) + ]) + + CConfig.WSAPROTOCOLCHAIN = platform.Struct( + 'struct _WSAPROTOCOLCHAIN', + [('ChainLen', rffi.INT), + ('ChainEntries', rffi.CFixedArray(rffi.UINT, 7))]) + + WSAPROTOCOLCHAIN = CConfig.WSAPROTOCOLCHAIN + GUID = CConfig.GUID + + CConfig.WSAPROTOCOL_INFOW = platform.Struct( + 'struct _WSAPROTOCOL_INFOW', + [('dwServiceFlags1', rffi.UINT), + ('dwServiceFlags2', rffi.UINT), + ('dwServiceFlags3', rffi.UINT), + ('dwServiceFlags4', rffi.UINT), + ('dwProviderFlags', rffi.UINT), + ('ProviderId', GUID), + ('dwCatalogEntryId', rffi.UINT), + ('ProtocolChain', WSAPROTOCOLCHAIN), + ('iVersion', rffi.INT), + ('iAddressFamily', rffi.INT), + ('iMaxSockAddr', rffi.INT), + ('iMinSockAddr', rffi.INT), + ('iSocketType', rffi.INT), + ('iProtocol', rffi.INT), + ('iProtocolMaxOffset', rffi.INT), + ('iNetworkByteOrder', rffi.INT), + ('iSecurityScheme', rffi.INT), + ('dwMessageSize', rffi.UINT), + ('dwProviderReserved', rffi.UINT), + ('szProtocol', rffi.CFixedArray(rffi.UCHAR, 256))]) + class cConfig: pass @@ -1336,6 +1380,20 @@ rffi.VOIDP, rwin32.DWORD, rwin32.LPDWORD, rffi.VOIDP, rffi.VOIDP], rffi.INT, save_err=SAVE_ERR) + + WSAPROTOCOL_INFOW = cConfig.WSAPROTOCOL_INFOW + + WSADuplicateSocketW = external('WSADuplicateSocketW', + [socketfd_type, rwin32.DWORD, + lltype.Ptr(WSAPROTOCOL_INFOW)], + rffi.INT, save_err=SAVE_ERR) + + WSASocketW = external('WSASocketW', + [rffi.INT, rffi.INT, rffi.INT, + lltype.Ptr(WSAPROTOCOL_INFOW), + rwin32.DWORD, rwin32.DWORD], + socketfd_type, save_err=SAVE_ERR) + tcp_keepalive = cConfig.tcp_keepalive WSAPROTOCOL_INFO = cConfig.WSAPROTOCOL_INFO @@ -1370,10 +1428,10 @@ return rwin32.FormatError(errno) def socket_strerror_unicode(errno): - return rwin32.FormatErrorW(errno)[0] + return rwin32.FormatErrorW(errno)[0].decode('utf-8') def gai_strerror_unicode(errno): - return rwin32.FormatErrorW(errno)[0] + return rwin32.FormatErrorW(errno)[0].decode('utf-8') def socket_strerror_utf8(errno): return rwin32.FormatErrorW(errno) diff -Nru pypy-7.1.1+dfsg/rpython/rlib/rsre/rsre_core.py pypy-7.3.1+dfsg/rpython/rlib/rsre/rsre_core.py --- pypy-7.1.1+dfsg/rpython/rlib/rsre/rsre_core.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/rlib/rsre/rsre_core.py 2020-04-10 19:28:42.000000000 +0000 @@ -96,8 +96,10 @@ def __init__(self, pattern): self.pattern = pattern # check we don't get the old value of MAXREPEAT - # during the untranslated tests - if not we_are_translated(): + # during the untranslated tests. + # On python3, MAXCODE can appear in patterns. It will be 65535 + # when CODESIZE is 2 + if not we_are_translated() and rsre_char.CODESIZE != 2: assert 65535 not in pattern def pat(self, index): @@ -973,7 +975,7 @@ raise Error("rsre.find_repetition_end[%d]" % op) @specializectx -def general_find_repetition_end(ctx, patern, ppos, ptr, maxcount, marks): +def general_find_repetition_end(ctx, pattern, ppos, ptr, maxcount, marks): # moved into its own JIT-opaque function end = ctx.end if maxcount != rsre_char.MAXREPEAT: @@ -981,7 +983,7 @@ end1 = ptr + maxcount if end1 <= end: end = end1 - while ptr < end and sre_match(ctx, patern, ppos, ptr, marks) is not None: + while ptr < end and sre_match(ctx, pattern, ppos, ptr, marks) is not None: ptr = ctx.next(ptr) return ptr diff -Nru pypy-7.1.1+dfsg/rpython/rlib/rsre/rsre_utf8.py pypy-7.3.1+dfsg/rpython/rlib/rsre/rsre_utf8.py --- pypy-7.1.1+dfsg/rpython/rlib/rsre/rsre_utf8.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/rlib/rsre/rsre_utf8.py 2020-04-10 19:28:42.000000000 +0000 @@ -25,7 +25,7 @@ return rsre_char.getlower(c, self.flags) def get_single_byte(self, base_position, index): - return self.str(base_position + index) + return self._utf8[base_position + index] def next(self, position): return rutf8.next_codepoint_pos(self._utf8, position) diff -Nru pypy-7.1.1+dfsg/rpython/rlib/rsre/test/test_search.py pypy-7.3.1+dfsg/rpython/rlib/rsre/test/test_search.py --- pypy-7.1.1+dfsg/rpython/rlib/rsre/test/test_search.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/rlib/rsre/test/test_search.py 2020-04-10 19:28:41.000000000 +0000 @@ -1,3 +1,4 @@ +# encoding: utf-8 import re, py from rpython.rlib.rsre.test.test_match import get_code, get_code_and_re from rpython.rlib.rsre.test import support @@ -240,3 +241,14 @@ search = staticmethod(rsre_utf8.utf8search) match = staticmethod(rsre_utf8.utf8match) P = staticmethod(lambda n: n) # NB. only for plain ascii + + def test_groupref_unicode_bug(self): + r = get_code(ur"(üü+)\1+$", re.UNICODE) # match non-prime numbers of ü + assert not self.match(r, u"üü".encode("utf-8")) + assert not self.match(r, u"üüü".encode("utf-8")) + assert self.match(r, u"üüüü".encode("utf-8")) + assert not self.match(r, u"üüüüü".encode("utf-8")) + assert self.match(r, u"üüüüüü".encode("utf-8")) + assert not self.match(r, u"üüüüüüü".encode("utf-8")) + assert self.match(r, u"üüüüüüüü".encode("utf-8")) + assert self.match(r, u"üüüüüüüüü".encode("utf-8")) diff -Nru pypy-7.1.1+dfsg/rpython/rlib/rstring.py pypy-7.3.1+dfsg/rpython/rlib/rstring.py --- pypy-7.1.1+dfsg/rpython/rlib/rstring.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/rlib/rstring.py 2020-04-10 19:28:41.000000000 +0000 @@ -139,7 +139,7 @@ if by is None: res = [] - i = len(value) - 1 + i = _decr(value, len(value), isutf8) while True: # starting from the end, find the end of the next word while i >= 0: @@ -500,60 +500,90 @@ (self.fname, self.original_base)) def __init__(self, s, literal, base, fname, allow_underscores=False, - no_implicit_octal=False): + no_implicit_octal=False, start=0, end=-1): self.fname = fname sign = 1 - if s.startswith('-'): + self.s = s + self.start = start + if end == -1: + end = len(s) + self.end = end + self._strip_spaces() + if self._startswith1('-'): sign = -1 - s = strip_spaces(s[1:]) - elif s.startswith('+'): - s = strip_spaces(s[1:]) + self.start += 1 + self._strip_spaces() + elif self._startswith1('+'): + self.start += 1 + self._strip_spaces() self.sign = sign self.original_base = base self.allow_underscores = allow_underscores if base == 0: - if s.startswith('0x') or s.startswith('0X'): + if self._startswith2('0x') or self._startswith2('0X'): base = 16 - elif s.startswith('0b') or s.startswith('0B'): + elif self._startswith2('0b') or self._startswith2('0B'): base = 2 - elif s.startswith('0'): # also covers the '0o' case - if no_implicit_octal and not (s.startswith('0o') or - s.startswith('0O')): + elif self._startswith1('0'): # also covers the '0o' case + if no_implicit_octal and not (self._startswith2('0o') or + self._startswith2('0O')): base = 1 # this makes only the digit '0' valid... else: base = 8 else: base = 10 elif base < 2 or base > 36: - raise InvalidBaseError("%s() base must be >= 2 and <= 36" % fname) + raise InvalidBaseError("%s() base must be >= 2 and <= 36, or 0" % fname) self.base = base # Leading underscores are not allowed - if s.startswith('_'): + if self._startswith1('_'): self.error() - if base == 16 and (s.startswith('0x') or s.startswith('0X')): - s = s[2:] - if base == 8 and (s.startswith('0o') or s.startswith('0O')): - s = s[2:] - if base == 2 and (s.startswith('0b') or s.startswith('0B')): - s = s[2:] - if not s: + if base == 16 and (self._startswith2('0x') or self._startswith2('0X')): + self.start += 2 + if base == 8 and (self._startswith2('0o') or self._startswith2('0O')): + self.start += 2 + if base == 2 and (self._startswith2('0b') or self._startswith2('0B')): + self.start += 2 + if self.start == self.end: self.error() - self.s = s - self.n = len(s) - self.i = 0 + self.i = self.start + + def _startswith1(self, prefix): + if self.start >= self.end: + return False + return self.s[self.start] == prefix[0] + return startswith(self.s, prefix, start=self.start, end=self.end) + + def _startswith2(self, prefix): + if self.start + 1 >= self.end: + return False + return self.s[self.start] == prefix[0] and self.s[self.start + 1] == prefix[1] + + def _strip_spaces(self): + # XXX this is not locale-dependent + p = self.start + q = self.end + s = self.s + while p < q and s[p] in ' \f\n\r\t\v': + p += 1 + while p < q and s[q-1] in ' \f\n\r\t\v': + q -= 1 + assert q >= p + self.start = p + self.end = q def rewind(self): - self.i = 0 + self.i = self.start def next_digit(self): # -1 => exhausted - if self.i < self.n: + if self.i < self.end: c = self.s[self.i] if self.allow_underscores and c == '_': self.i += 1 - if self.i >= self.n: + if self.i >= self.end: self.error() c = self.s[self.i] digit = ord(c) @@ -576,9 +606,14 @@ # After exhausting all n digits in next_digit(), you can walk them # again in reverse order by calling prev_digit() exactly n times i = self.i - 1 - assert i >= 0 + assert i >= self.start self.i = i c = self.s[i] + if self.allow_underscores and c == '_': + i = self.i - 1 + assert i >= 0 + self.i = i + c = self.s[i] digit = ord(c) if '0' <= c <= '9': digit -= ord('0') diff -Nru pypy-7.1.1+dfsg/rpython/rlib/rstruct/runpack.py pypy-7.3.1+dfsg/rpython/rlib/rstruct/runpack.py --- pypy-7.1.1+dfsg/rpython/rlib/rstruct/runpack.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/rlib/rstruct/runpack.py 2020-04-10 19:28:41.000000000 +0000 @@ -27,9 +27,8 @@ def read(self, count): curpos = self.inputpos - end = curpos + count self.advance(count) # raise if we are out of bound - return self.inputbuf.getslice(curpos, end, 1, count) + return self.inputbuf.getslice(curpos, 1, count) def align(self, mask): self.inputpos = (self.inputpos + mask) & ~mask @@ -86,12 +85,12 @@ for i in rg: fmtdesc, rep, mask = self.formats[i] miniglobals['unpacker%d' % i] = fmtdesc.unpack - if mask is not None: - perform_lst.append('master_reader.align(%d)' % mask) if not fmtdesc.needcount: perform_lst.append('unpacker%d(reader%d)' % (i, i)) else: perform_lst.append('unpacker%d(reader%d, %d)' % (i, i, rep)) + if mask is not None: + perform_lst.append('master_reader.align(%d)' % mask) miniglobals['reader_cls%d' % i] = reader_for_pos(i) readers = ";".join(["reader%d = reader_cls%d(master_reader, bigendian)" % (i, i) for i in rg]) diff -Nru pypy-7.1.1+dfsg/rpython/rlib/rstruct/test/test_pack.py pypy-7.3.1+dfsg/rpython/rlib/rstruct/test/test_pack.py --- pypy-7.1.1+dfsg/rpython/rlib/rstruct/test/test_pack.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/rlib/rstruct/test/test_pack.py 2020-04-10 19:28:41.000000000 +0000 @@ -1,5 +1,5 @@ import pytest -from rpython.rlib.rarithmetic import r_ulonglong +from rpython.rlib.rarithmetic import r_uint, r_longlong, r_ulonglong from rpython.rlib.rstruct import standardfmttable, nativefmttable from rpython.rlib.rstruct.error import StructOverflowError from rpython.rlib import buffer @@ -129,9 +129,9 @@ self.check("i", 0x41424344) self.check("i", -3) self.check("i", -2147483648) - self.check("I", 0x81424344) - self.check("q", 0x4142434445464748) - self.check("q", -0x41B2B3B4B5B6B7B8) + self.check("I", r_uint(0x81424344)) + self.check("q", r_longlong(0x4142434445464748)) + self.check("q", r_longlong(-0x41B2B3B4B5B6B7B8)) self.check("Q", r_ulonglong(0x8142434445464748)) def test_pack_ieee(self): diff -Nru pypy-7.1.1+dfsg/rpython/rlib/rstruct/test/test_runpack.py pypy-7.3.1+dfsg/rpython/rlib/rstruct/test/test_runpack.py --- pypy-7.1.1+dfsg/rpython/rlib/rstruct/test/test_runpack.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/rlib/rstruct/test/test_runpack.py 2020-04-10 19:28:41.000000000 +0000 @@ -110,6 +110,15 @@ assert unpack(">q", '\xbeMLKJIHH') == -0x41B2B3B4B5B6B7B8 assert unpack(">Q", '\x81BCDEFGH') == 0x8142434445464748 + def test_align(self): + data = struct.pack('BBhi', 1, 2, 3, 4) + def fn(): + a, b, c, d = runpack('BBhi', data) + return a + (b << 4) + (c << 8) + (d << 12) + assert fn() == 0x4321 + assert self.interpret(fn, []) == 0x4321 + + class TestNoFastPath(TestRStruct): diff -Nru pypy-7.1.1+dfsg/rpython/rlib/rtime.py pypy-7.3.1+dfsg/rpython/rlib/rtime.py --- pypy-7.1.1+dfsg/rpython/rlib/rtime.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/rlib/rtime.py 2020-04-10 19:28:41.000000000 +0000 @@ -9,7 +9,7 @@ from rpython.rtyper.tool import rffi_platform from rpython.rtyper.lltypesystem import rffi, lltype from rpython.rlib.objectmodel import register_replacement_for -from rpython.rlib.rarithmetic import intmask, UINT_MAX +from rpython.rlib.rarithmetic import intmask, r_int64, UINT_MAX from rpython.rlib import rposix _WIN32 = sys.platform.startswith('win') @@ -94,6 +94,10 @@ return (float(rffi.getintfield(t, 'c_tv_sec')) + float(rffi.getintfield(t, 'c_tv_usec')) * 0.000001) +def decode_timeval_ns(t): + return (r_int64(rffi.getintfield(t, 'c_tv_sec')) * 10**9 + + r_int64(rffi.getintfield(t, 'c_tv_usec')) * 10**3) + def external(name, args, result, compilation_info=eci, **kwds): return rffi.llexternal(name, args, result, diff -Nru pypy-7.1.1+dfsg/rpython/rlib/runicode.py pypy-7.3.1+dfsg/rpython/rlib/runicode.py --- pypy-7.1.1+dfsg/rpython/rlib/runicode.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/rlib/runicode.py 2020-04-10 19:28:41.000000000 +0000 @@ -407,8 +407,9 @@ _encodeUCS4(result, ch) return result.build() unicode_encode_utf_8_elidable = jit.elidable( + enforceargs(s=unicode, allow_surrogates=bool)( func_with_new_name(unicode_encode_utf_8_impl, - "unicode_encode_utf_8_elidable")) + "unicode_encode_utf_8_elidable"))) def unicode_encode_utf8sp(s, size): # Surrogate-preserving utf-8 encoding. Any surrogate character @@ -1902,7 +1903,9 @@ if MultiByteToWideChar(CP_ACP, flags, dataptr, size, buf.raw, usize) == 0: _decode_mbcs_error(s, errorhandler) - return buf.str(usize), size + ret = buf.str(usize) + assert ret is not None + return ret, size def unicode_encode_mbcs(s, size, errors, errorhandler=None, force_replace=True): diff -Nru pypy-7.1.1+dfsg/rpython/rlib/rutf8.py pypy-7.3.1+dfsg/rpython/rlib/rutf8.py --- pypy-7.1.1+dfsg/rpython/rlib/rutf8.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/rlib/rutf8.py 2020-04-10 19:28:41.000000000 +0000 @@ -153,22 +153,20 @@ """Gives the position of the previous codepoint. 'pos' must not be zero. """ - assert pos != 0 pos -= 1 + assert pos >= 0 if pos >= len(code): # for the case where pos - 1 == len(code): - assert pos >= 0 return pos # assume there is an extra '\x00' character chr1 = ord(code[pos]) if chr1 <= 0x7F: - assert pos >= 0 return pos pos -= 1 + assert pos >= 0 if ord(code[pos]) >= 0xC0: - assert pos >= 0 return pos pos -= 1 + assert pos >= 0 if ord(code[pos]) >= 0xC0: - assert pos >= 0 return pos pos -= 1 assert pos >= 0 @@ -363,9 +361,12 @@ raise CheckError(~res) def get_utf8_length(s, start=0, end=-1): - """ Get the length out of valid utf8. For now just calls check_utf8 + # DEPRECATED! use codepoints_in_utf8 instead + """ Get the length out of valid utf8. """ - return check_utf8(s, True, start, end) + if end < 0: + end = len(s) + return codepoints_in_utf8(s, start, end) @jit.elidable def _check_utf8(s, allow_surrogates, start, stop): @@ -435,11 +436,7 @@ return result def has_surrogates(utf8): - # XXX write a faster version maybe - for ch in Utf8StringIterator(utf8): - if 0xD800 <= ch <= 0xDBFF: - return True - return False + return surrogate_in_utf8(utf8) >= 0 def reencode_utf8_with_surrogates(utf8): """ Receiving valid UTF8 which contains surrogates, combine surrogate @@ -486,14 +483,24 @@ length += 1 return length + @jit.elidable -def surrogate_in_utf8(value): +def surrogate_in_utf8(utf8): """Check if the UTF-8 byte string 'value' contains a surrogate. The 'value' argument must be otherwise correctly formed for UTF-8. + Returns the position of the first surrogate, otherwise -1. """ - for i in range(len(value) - 2): - if value[i] == '\xed' and value[i + 1] >= '\xa0': - return i + # a surrogate starts with 0xed in utf-8 encoding + pos = 0 + while True: + pos = utf8.find("\xed", pos) + if pos < 0: + return -1 + assert pos <= len(utf8) - 1 # otherwise invalid utf-8 + ordch2 = ord(utf8[pos + 1]) + if _invalid_byte_2_of_3(0xed, ordch2, allow_surrogates=False): + return pos + pos += 1 return -1 @@ -583,7 +590,7 @@ return codepoint_at_pos(utf8, bytepos) @jit.elidable -def codepoint_index_at_byte_position(utf8, storage, bytepos): +def codepoint_index_at_byte_position(utf8, storage, bytepos, num_codepoints): """ Return the character index for which codepoint_position_at_index(index) == bytepos. This is a relatively slow operation in that it runs in a time @@ -592,17 +599,38 @@ """ if bytepos < 0: return bytepos + # binary search on elements of storage index_min = 0 index_max = len(storage) - 1 while index_min < index_max: + # this addition can't overflow because storage has a length that is + # 1/64 of the length of a string index_middle = (index_min + index_max + 1) // 2 base_bytepos = storage[index_middle].baseindex if bytepos < base_bytepos: index_max = index_middle - 1 else: index_min = index_middle - bytepos1 = storage[index_min].baseindex + + baseindex = storage[index_min].baseindex + if baseindex == bytepos: + return index_min << 6 + + # use ofs to get closer to the correct character index result = index_min << 6 + bytepos1 = baseindex + if index_min == len(storage) - 1: + maxindex = ((num_codepoints - 1) >> 2) & 0x0F + else: + maxindex = 16 + for i in range(maxindex): + x = baseindex + ord(storage[index_min].ofs[i]) + if x >= bytepos: + break + bytepos1 = x + result = (index_min << 6) + (i << 2) + 1 + + # this loop should runs at most four times while bytepos1 < bytepos: bytepos1 = next_codepoint_pos(utf8, bytepos1) result += 1 @@ -716,13 +744,13 @@ def append(self, s): # for strings self._s.append(s) - newlgt = get_utf8_length(s) + newlgt = codepoints_in_utf8(s) self._lgt += newlgt @always_inline def append_slice(self, s, start, end): self._s.append_slice(s, start, end) - newlgt = get_utf8_length(s, start, end) + newlgt = codepoints_in_utf8(s, start, end) self._lgt += newlgt @signature(types.self(), char(), returns=none()) @@ -743,6 +771,13 @@ self._lgt += length @always_inline + def append_utf8_slice(self, utf8, start, end, slicelength): + self._s.append_slice(utf8, start, end) + self._lgt += slicelength + if not we_are_translated(): + assert len(utf8[start: end].decode("utf-8")) == slicelength + + @always_inline def append_multiple_char(self, utf8, times): self._s.append(utf8 * times) self._lgt += times diff -Nru pypy-7.1.1+dfsg/rpython/rlib/rvmprof/rvmprof.py pypy-7.3.1+dfsg/rpython/rlib/rvmprof/rvmprof.py --- pypy-7.1.1+dfsg/rpython/rlib/rvmprof/rvmprof.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/rlib/rvmprof/rvmprof.py 2020-04-10 19:28:41.000000000 +0000 @@ -143,7 +143,7 @@ native = 0 # force disabled on Windows lines = 0 # not supported on PyPy currently - p_error = self.cintf.vmprof_init(fileno, interval, lines, memory, "pypy", native, real_time) + p_error = self.cintf.vmprof_init(fileno, interval, memory, lines, "pypy", native, real_time) if p_error: raise VMProfError(rffi.charp2str(p_error)) diff -Nru pypy-7.1.1+dfsg/rpython/rlib/rvmprof/src/shared/_vmprof.c pypy-7.3.1+dfsg/rpython/rlib/rvmprof/src/shared/_vmprof.c --- pypy-7.1.1+dfsg/rpython/rlib/rvmprof/src/shared/_vmprof.c 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/rlib/rvmprof/src/shared/_vmprof.c 2020-04-10 19:28:41.000000000 +0000 @@ -383,8 +383,22 @@ #ifdef VMPROF_UNIX static PyObject * -insert_real_time_thread(PyObject *module, PyObject * noargs) { +insert_real_time_thread(PyObject *module, PyObject * args) { ssize_t thread_count; + unsigned long thread_id = 0; + pthread_t th = pthread_self(); + + if (!PyArg_ParseTuple(args, "|k", &thread_id)) { + return NULL; + } + + if (thread_id) { +#if SIZEOF_LONG <= SIZEOF_PTHREAD_T + th = (pthread_t) thread_id; +#else + th = (pthread_t) *(unsigned long *) &thread_id; +#endif + } if (!vmprof_is_enabled()) { PyErr_SetString(PyExc_ValueError, "vmprof is not enabled"); @@ -397,15 +411,29 @@ } vmprof_aquire_lock(); - thread_count = insert_thread(pthread_self(), -1); + thread_count = insert_thread(th, -1); vmprof_release_lock(); return PyLong_FromSsize_t(thread_count); } static PyObject * -remove_real_time_thread(PyObject *module, PyObject * noargs) { +remove_real_time_thread(PyObject *module, PyObject * args) { ssize_t thread_count; + unsigned long thread_id = 0; + pthread_t th = pthread_self(); + + if (!PyArg_ParseTuple(args, "|k", &thread_id)) { + return NULL; + } + + if (thread_id) { +#if SIZEOF_LONG <= SIZEOF_PTHREAD_T + th = (pthread_t) thread_id; +#else + th = (pthread_t) *(unsigned long *) &thread_id; +#endif + } if (!vmprof_is_enabled()) { PyErr_SetString(PyExc_ValueError, "vmprof is not enabled"); @@ -418,7 +446,7 @@ } vmprof_aquire_lock(); - thread_count = remove_thread(pthread_self(), -1); + thread_count = remove_thread(th, -1); vmprof_release_lock(); return PyLong_FromSsize_t(thread_count); @@ -445,9 +473,9 @@ #ifdef VMPROF_UNIX {"get_profile_path", vmp_get_profile_path, METH_NOARGS, "Profile path the profiler logs to."}, - {"insert_real_time_thread", insert_real_time_thread, METH_NOARGS, + {"insert_real_time_thread", insert_real_time_thread, METH_VARARGS, "Insert a thread into the real time profiling list."}, - {"remove_real_time_thread", remove_real_time_thread, METH_NOARGS, + {"remove_real_time_thread", remove_real_time_thread, METH_VARARGS, "Remove a thread from the real time profiling list."}, #endif {NULL, NULL, 0, NULL} /* Sentinel */ diff -Nru pypy-7.1.1+dfsg/rpython/rlib/rvmprof/src/shared/vmprof_common.c pypy-7.3.1+dfsg/rpython/rlib/rvmprof/src/shared/vmprof_common.c --- pypy-7.1.1+dfsg/rpython/rlib/rvmprof/src/shared/vmprof_common.c 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/rlib/rvmprof/src/shared/vmprof_common.c 2020-04-10 19:28:41.000000000 +0000 @@ -165,17 +165,6 @@ } -/* Seems that CPython 3.5.1 made our job harder. Did not find out how - to do that without these hacks. We can't use PyThreadState_GET(), - because that calls PyThreadState_Get() which fails an assert if the - result is NULL. */ -#if PY_MAJOR_VERSION >= 3 && !defined(_Py_atomic_load_relaxed) - /* this was abruptly un-defined in 3.5.1 */ -void *volatile _PyThreadState_Current; - /* XXX simple volatile access is assumed atomic */ -# define _Py_atomic_load_relaxed(pp) (*(pp)) -#endif - #ifdef RPYTHON_VMPROF #ifndef RPYTHON_LL2CTYPES PY_STACK_FRAME_T *get_vmprof_stack(void) @@ -244,9 +233,9 @@ return -1; if (thread_count == threads_size) { threads_size += threads_size_step; - threads = realloc(threads, sizeof(pid_t) * threads_size); + threads = realloc(threads, sizeof(pthread_t) * threads_size); assert(threads != NULL); - memset(threads + thread_count, 0, sizeof(pid_t) * threads_size_step); + memset(threads + thread_count, 0, sizeof(pthread_t) * threads_size_step); } threads[thread_count++] = tid; return thread_count; diff -Nru pypy-7.1.1+dfsg/rpython/rlib/rvmprof/src/shared/vmprof_common.h pypy-7.3.1+dfsg/rpython/rlib/rvmprof/src/shared/vmprof_common.h --- pypy-7.1.1+dfsg/rpython/rlib/rvmprof/src/shared/vmprof_common.h 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/rlib/rvmprof/src/shared/vmprof_common.h 2020-04-10 19:28:41.000000000 +0000 @@ -83,17 +83,6 @@ int opened_profile(const char *interp_name, int memory, int proflines, int native, int real_time); -/* Seems that CPython 3.5.1 made our job harder. Did not find out how - to do that without these hacks. We can't use PyThreadState_GET(), - because that calls PyThreadState_Get() which fails an assert if the - result is NULL. */ -#if PY_MAJOR_VERSION >= 3 && !defined(_Py_atomic_load_relaxed) - /* this was abruptly un-defined in 3.5.1 */ -void *volatile _PyThreadState_Current; - /* XXX simple volatile access is assumed atomic */ -# define _Py_atomic_load_relaxed(pp) (*(pp)) -#endif - #ifdef RPYTHON_VMPROF #ifndef RPYTHON_LL2CTYPES PY_STACK_FRAME_T *get_vmprof_stack(void); diff -Nru pypy-7.1.1+dfsg/rpython/rlib/rvmprof/src/shared/vmprof_unix.c pypy-7.3.1+dfsg/rpython/rlib/rvmprof/src/shared/vmprof_unix.c --- pypy-7.1.1+dfsg/rpython/rlib/rvmprof/src/shared/vmprof_unix.c 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/rlib/rvmprof/src/shared/vmprof_unix.c 2020-04-10 19:28:41.000000000 +0000 @@ -127,7 +127,9 @@ mythread_id = PyThread_get_thread_ident(); istate = PyInterpreterState_Head(); if (istate == NULL) { +#if DEBUG fprintf(stderr, "WARNING: interp state head is null (for thread id %ld)\n", mythread_id); +#endif return NULL; } // fish fish fish, it will NOT lock the keymutex in pythread @@ -141,7 +143,9 @@ } while ((istate = PyInterpreterState_Next(istate)) != NULL); // uh? not found? +#if DEBUG fprintf(stderr, "WARNING: cannot find thread state (for thread id %ld), sample will be thrown away\n", mythread_id); +#endif return NULL; } #endif @@ -244,9 +248,7 @@ if (commit) { commit_buffer(fd, p); } else { -#ifndef RPYTHON_VMPROF - fprintf(stderr, "WARNING: canceled buffer, no stack trace was written\n"); -#else +#if DEBUG fprintf(stderr, "WARNING: canceled buffer, no stack trace was written\n"); #endif cancel_buffer(p); @@ -481,13 +483,17 @@ frame = (PY_STACK_FRAME_T*)current; #else if (current == NULL) { +#if DEBUG fprintf(stderr, "WARNING: get_stack_trace, current is NULL\n"); +#endif return 0; } frame = current->frame; #endif if (frame == NULL) { +#if DEBUG fprintf(stderr, "WARNING: get_stack_trace, frame is NULL\n"); +#endif return 0; } return vmp_walk_and_record_stack(frame, result, max_depth, 1, pc); diff -Nru pypy-7.1.1+dfsg/rpython/rlib/rvmprof/src/shared/vmprof_win.c pypy-7.3.1+dfsg/rpython/rlib/rvmprof/src/shared/vmprof_win.c --- pypy-7.1.1+dfsg/rpython/rlib/rvmprof/src/shared/vmprof_win.c 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/rlib/rvmprof/src/shared/vmprof_win.c 2020-04-10 19:28:41.000000000 +0000 @@ -104,6 +104,17 @@ #endif } +/* Seems that CPython 3.5.1 made our job harder. Did not find out how + to do that without these hacks. We can't use PyThreadState_GET(), + because that calls PyThreadState_Get() which fails an assert if the + result is NULL. */ +#if PY_MAJOR_VERSION >= 3 && !defined(_Py_atomic_load_relaxed) + /* this was abruptly un-defined in 3.5.1 */ +void *volatile _PyThreadState_Current; + /* XXX simple volatile access is assumed atomic */ +# define _Py_atomic_load_relaxed(pp) (*(pp)) +#endif + #ifndef RPYTHON_VMPROF static PY_WIN_THREAD_STATE * get_current_thread_state(void) diff -Nru pypy-7.1.1+dfsg/rpython/rlib/rvmprof/src/shared/vmp_stack.c pypy-7.3.1+dfsg/rpython/rlib/rvmprof/src/shared/vmp_stack.c --- pypy-7.1.1+dfsg/rpython/rlib/rvmprof/src/shared/vmp_stack.c 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/rlib/rvmprof/src/shared/vmp_stack.c 2020-04-10 19:28:41.000000000 +0000 @@ -82,12 +82,6 @@ static PY_STACK_FRAME_T * _write_python_stack_entry(PY_STACK_FRAME_T * frame, void ** result, int * depth, int max_depth) { - int len; - int addr; - int j; - uint64_t line; - char *lnotab; - #ifndef RPYTHON_VMPROF // pypy does not support line profiling if (vmp_profiles_python_lines()) { // In the line profiling mode we save a line number for every frame. @@ -99,27 +93,8 @@ // NOTE: the profiling overhead can be reduced by storing co_lnotab in the dump and // moving this computation to the reader instead of doing it here. - lnotab = PyStr_AS_STRING(frame->f_code->co_lnotab); - - if (lnotab != NULL) { - line = (uint64_t)frame->f_lineno; - addr = 0; - - len = (int)PyStr_GET_SIZE(frame->f_code->co_lnotab); - - for (j = 0; j < len; j += 2) { - addr += lnotab[j]; - if (addr > frame->f_lasti) { - break; - } - line += lnotab[j+1]; - } - result[*depth] = (void*) line; - *depth = *depth + 1; - } else { - result[*depth] = (void*) 0; - *depth = *depth + 1; - } + result[*depth] = (void*) (int64_t) PyFrame_GetLineNumber(frame); + *depth = *depth + 1; } result[*depth] = (void*)CODE_ADDR_TO_UID(FRAME_CODE(frame)); *depth = *depth + 1; @@ -214,14 +189,18 @@ ret = unw_getcontext(&uc); if (ret < 0) { // could not initialize lib unwind cursor and context +#if DEBUG fprintf(stderr, "WARNING: unw_getcontext did not retreive context, switching to python profiling mode \n"); +#endif vmp_native_disable(); return vmp_walk_and_record_python_stack_only(frame, result, max_depth, 0, pc); } ret = unw_init_local(&cursor, &uc); if (ret < 0) { // could not initialize lib unwind cursor and context +#if DEBUG fprintf(stderr, "WARNING: unw_init_local did not succeed, switching to python profiling mode \n"); +#endif vmp_native_disable(); return vmp_walk_and_record_python_stack_only(frame, result, max_depth, 0, pc); } @@ -230,7 +209,9 @@ while (signal < 0) { int err = unw_step(&cursor); if (err <= 0) { +#if DEBUG fprintf(stderr, "WARNING: did not find signal frame, skipping sample\n"); +#endif return 0; } signal++; @@ -245,7 +226,9 @@ } int err = unw_step(&cursor); if (err <= 0) { +#if DEBUG fprintf(stderr,"WARNING: did not find signal frame, skipping sample\n"); +#endif return 0; } } @@ -602,7 +585,9 @@ if (libhandle != NULL) { if (dlclose(libhandle)) { vmprof_error = dlerror(); +#if DEBUG fprintf(stderr, "could not close libunwind at runtime. error: %s\n", vmprof_error); +#endif } libhandle = NULL; } diff -Nru pypy-7.1.1+dfsg/rpython/rlib/rvmprof/test/test_file.py pypy-7.3.1+dfsg/rpython/rlib/rvmprof/test/test_file.py --- pypy-7.1.1+dfsg/rpython/rlib/rvmprof/test/test_file.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/rlib/rvmprof/test/test_file.py 2020-04-10 19:28:41.000000000 +0000 @@ -11,10 +11,11 @@ def get_list_of_files(shared): files = list(shared.visit('*.[ch]')) # in PyPy we checkin the result of ./configure; as such, these files are - # not in github and can be skipped + # not in github or different and can be skipped files.remove(shared.join('libbacktrace', 'config-x86_32.h')) files.remove(shared.join('libbacktrace', 'config-x86_64.h')) files.remove(shared.join('libbacktrace', 'gstdint.h')) + files.remove(shared.join('libbacktrace', 'config.h')) return files def test_same_file(): @@ -37,7 +38,7 @@ # if no_matches: print - print 'The following file dit NOT match' + print 'The following file did NOT match' for f in no_matches: print ' ', f.relto(RVMPROF) raise AssertionError("some files were updated on github, " diff -Nru pypy-7.1.1+dfsg/rpython/rlib/rvmprof/test/test_rvmprof.py pypy-7.3.1+dfsg/rpython/rlib/rvmprof/test/test_rvmprof.py --- pypy-7.1.1+dfsg/rpython/rlib/rvmprof/test/test_rvmprof.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/rlib/rvmprof/test/test_rvmprof.py 2020-04-10 19:28:41.000000000 +0000 @@ -98,12 +98,12 @@ self.tmpfilename = str(self.tmpfile) super(RVMProfSamplingTest, self).init() - ENTRY_POINT_ARGS = (int, float) - def entry_point(self, value, delta_t): + ENTRY_POINT_ARGS = (int, float, int) + def entry_point(self, value, delta_t, memory=0): code = self.MyCode('py:code:52:test_enable') rvmprof.register_code(code, self.MyCode.get_name) fd = os.open(self.tmpfilename, os.O_WRONLY | os.O_CREAT, 0666) - rvmprof.enable(fd, self.SAMPLING_INTERVAL) + rvmprof.enable(fd, self.SAMPLING_INTERVAL, memory=memory) start = time.time() res = 0 while time.time() < start+delta_t: @@ -128,17 +128,25 @@ def test(self): from vmprof import read_profile - assert self.entry_point(10**4, 0.1) == 99990000 + assert self.entry_point(10**4, 0.1, 0) == 99990000 assert self.tmpfile.check() self.tmpfile.remove() # - assert self.rpy_entry_point(10**4, 0.5) == 99990000 + assert self.rpy_entry_point(10**4, 0.5, 0) == 99990000 assert self.tmpfile.check() prof = read_profile(self.tmpfilename) tree = prof.get_tree() assert tree.name == 'py:code:52:test_enable' assert self.approx_equal(tree.count, 0.5/self.SAMPLING_INTERVAL) + def test_mem(self): + from vmprof import read_profile + assert self.rpy_entry_point(10**4, 0.5, 1) == 99990000 + assert self.tmpfile.check() + prof = read_profile(self.tmpfilename) + assert prof.profile_memory + assert all(p[-1] > 0 for p in prof.profiles) + class TestNative(RVMProfSamplingTest): @@ -177,7 +185,7 @@ def test(self): from vmprof import read_profile # from vmprof.show import PrettyPrinter - assert self.rpy_entry_point(3, 0.5) == 42000 + assert self.rpy_entry_point(3, 0.5, 0) == 42000 assert self.tmpfile.check() prof = read_profile(self.tmpfilename) diff -Nru pypy-7.1.1+dfsg/rpython/rlib/rwin32.py pypy-7.3.1+dfsg/rpython/rlib/rwin32.py --- pypy-7.1.1+dfsg/rpython/rlib/rwin32.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/rlib/rwin32.py 2020-04-10 19:28:41.000000000 +0000 @@ -114,6 +114,7 @@ WC_NO_BEST_FIT_CHARS STD_INPUT_HANDLE STD_OUTPUT_HANDLE STD_ERROR_HANDLE HANDLE_FLAG_INHERIT FILE_TYPE_CHAR LOAD_WITH_ALTERED_SEARCH_PATH + CP_ACP CP_UTF8 CP_UTF7 CP_OEMCP MB_ERR_INVALID_CHARS """ from rpython.translator.platform import host_factory static_platform = host_factory() diff -Nru pypy-7.1.1+dfsg/rpython/rlib/_stacklet_asmgcc.py pypy-7.3.1+dfsg/rpython/rlib/_stacklet_asmgcc.py --- pypy-7.1.1+dfsg/rpython/rlib/_stacklet_asmgcc.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/rlib/_stacklet_asmgcc.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,325 +0,0 @@ -from rpython.rlib.debug import ll_assert -from rpython.rlib import rgc -from rpython.rlib.objectmodel import specialize -from rpython.rtyper.lltypesystem import lltype, llmemory, rffi -from rpython.rtyper.lltypesystem.lloperation import llop -from rpython.rtyper.annlowlevel import llhelper, MixLevelHelperAnnotator -from rpython.annotator import model as annmodel -from rpython.rtyper.llannotation import lltype_to_annotation -from rpython.rlib import _rffi_stacklet as _c - - -_asmstackrootwalker = None # BIG HACK: monkey-patched by asmgcroot.py -_stackletrootwalker = None - -def get_stackletrootwalker(): - # XXX this is too complicated now; we don't need a StackletRootWalker - # instance to store global state. We could rewrite it all in one big - # function. We don't care enough for now. - - # lazily called, to make the following imports lazy - global _stackletrootwalker - if _stackletrootwalker is not None: - return _stackletrootwalker - - from rpython.memory.gctransform.asmgcroot import ( - WALKFRAME, CALLEE_SAVED_REGS, INDEX_OF_EBP, sizeofaddr) - - assert _asmstackrootwalker is not None, "should have been monkey-patched" - basewalker = _asmstackrootwalker - - class StackletRootWalker(object): - _alloc_flavor_ = "raw" - - def setup(self, obj): - # initialization: read the SUSPSTACK object - p = llmemory.cast_adr_to_ptr(obj, lltype.Ptr(SUSPSTACK)) - if not p.handle: - return False - self.context = llmemory.cast_ptr_to_adr(p.handle) - self.next_callback_piece = p.callback_pieces - anchor = p.anchor - del p - self.curframe = lltype.malloc(WALKFRAME, flavor='raw') - self.otherframe = lltype.malloc(WALKFRAME, flavor='raw') - self.fill_initial_frame(self.curframe, anchor) - return True - - def fill_initial_frame(self, curframe, initialframedata): - # Copy&paste :-( - initialframedata += 2*sizeofaddr - reg = 0 - while reg < CALLEE_SAVED_REGS: - curframe.regs_stored_at[reg] = initialframedata+reg*sizeofaddr - reg += 1 - retaddraddr = initialframedata + CALLEE_SAVED_REGS * sizeofaddr - retaddraddr = self.translateptr(retaddraddr) - curframe.frame_address = retaddraddr.address[0] - - def fetch_next_stack_piece(self): - if self.next_callback_piece == llmemory.NULL: - lltype.free(self.curframe, flavor='raw') - lltype.free(self.otherframe, flavor='raw') - self.context = llmemory.NULL - return False - else: - anchor = self.next_callback_piece - nextaddr = anchor + sizeofaddr - nextaddr = self.translateptr(nextaddr) - self.next_callback_piece = nextaddr.address[0] - self.fill_initial_frame(self.curframe, anchor) - return True - - @specialize.arg(3) - def customtrace(self, gc, obj, callback, arg): - # - # Pointers to the stack can be "translated" or not: - # - # * Non-translated pointers point to where the data would be - # if the stack was installed and running. - # - # * Translated pointers correspond to where the data - # is now really in memory. - # - # Note that 'curframe' contains non-translated pointers, and - # of course the stack itself is full of non-translated pointers. - # - if not self.setup(obj): - return - - while True: - callee = self.curframe - retaddraddr = self.translateptr(callee.frame_address) - retaddr = retaddraddr.address[0] - ebp_in_caller = callee.regs_stored_at[INDEX_OF_EBP] - ebp_in_caller = self.translateptr(ebp_in_caller) - ebp_in_caller = ebp_in_caller.address[0] - basewalker.locate_caller_based_on_retaddr(retaddr, - ebp_in_caller) - - # see asmgcroot for similarity: - while True: - location = basewalker._shape_decompressor.next() - if location == 0: - break - addr = basewalker.getlocation(callee, ebp_in_caller, - location) - # yield the translated addr of the next GCREF in the stack - addr = self.translateptr(addr) - gc._trace_callback(callback, arg, addr) - - caller = self.otherframe - reg = CALLEE_SAVED_REGS - 1 - while reg >= 0: - location = basewalker._shape_decompressor.next() - addr = basewalker.getlocation(callee, ebp_in_caller, - location) - caller.regs_stored_at[reg] = addr # non-translated - reg -= 1 - - location = basewalker._shape_decompressor.next() - caller.frame_address = basewalker.getlocation(callee, - ebp_in_caller, - location) - # ^^^ non-translated - if caller.frame_address == llmemory.NULL: - # completely done with this piece of stack - if not self.fetch_next_stack_piece(): - return - continue - # - self.otherframe = callee - self.curframe = caller - # loop back - - def translateptr(self, addr): - return _c._translate_pointer(self.context, addr) - - _stackletrootwalker = StackletRootWalker() - return _stackletrootwalker -get_stackletrootwalker._annspecialcase_ = 'specialize:memo' - -def complete_destrptr(gctransformer): - translator = gctransformer.translator - mixlevelannotator = MixLevelHelperAnnotator(translator.rtyper) - args_s = [lltype_to_annotation(lltype.Ptr(SUSPSTACK))] - s_result = annmodel.s_None - destrptr = mixlevelannotator.delayedfunction(suspstack_destructor, - args_s, s_result) - mixlevelannotator.finish() - lltype.attachRuntimeTypeInfo(SUSPSTACK, destrptr=destrptr) - - -def customtrace(gc, obj, callback, arg): - stackletrootwalker = get_stackletrootwalker() - stackletrootwalker.customtrace(gc, obj, callback, arg) -lambda_customtrace = lambda: customtrace - -def suspstack_destructor(suspstack): - h = suspstack.handle - if h: - _c.destroy(h) - - -SUSPSTACK = lltype.GcStruct('SuspStack', - ('handle', _c.handle), - ('anchor', llmemory.Address), - ('callback_pieces', llmemory.Address), - rtti=True) -NULL_SUSPSTACK = lltype.nullptr(SUSPSTACK) - -ASM_FRAMEDATA_HEAD_PTR = lltype.Ptr(lltype.ForwardReference()) -ASM_FRAMEDATA_HEAD_PTR.TO.become(lltype.Struct('ASM_FRAMEDATA_HEAD', - ('prev', ASM_FRAMEDATA_HEAD_PTR), - ('next', ASM_FRAMEDATA_HEAD_PTR) - )) -alternateanchor = lltype.malloc(ASM_FRAMEDATA_HEAD_PTR.TO, - immortal=True) -alternateanchor.prev = alternateanchor -alternateanchor.next = alternateanchor - -FUNCNOARG_P = lltype.Ptr(lltype.FuncType([], _c.handle)) -pypy_asm_stackwalk2 = rffi.llexternal('pypy_asm_stackwalk', - [FUNCNOARG_P, - ASM_FRAMEDATA_HEAD_PTR], - lltype.Signed, sandboxsafe=True, - _nowrapper=True) - - -def _new_callback(): - # Here, we just closed the stack. Get the stack anchor, store - # it in the gcrootfinder.suspstack.anchor, and create a new - # stacklet with stacklet_new(). If this call fails, then we - # are just returning NULL. - _stack_just_closed() - # - return _c.new(gcrootfinder.newthrd, llhelper(_c.run_fn, _new_runfn), - llmemory.NULL) - -def _stack_just_closed(): - # Immediately unlink the new stackanchor from the doubly-linked - # chained list. When returning from pypy_asm_stackwalk2, the - # assembler code will try to unlink it again, which should be - # a no-op given that the doubly-linked list is empty. - stackanchor = llmemory.cast_ptr_to_adr(alternateanchor.next) - gcrootfinder.suspstack.anchor = stackanchor - alternateanchor.prev = alternateanchor - alternateanchor.next = alternateanchor - -def _new_runfn(h, _): - # Here, we are in a fresh new stacklet. - llop.gc_stack_bottom(lltype.Void) # marker for trackgcroot.py - # - # There is a fresh suspstack object waiting on the gcrootfinder, - # so populate it with data that represents the parent suspended - # stacklet and detach the suspstack object from gcrootfinder. - suspstack = gcrootfinder.attach_handle_on_suspstack(h) - # - # Call the main function provided by the (RPython) user. - suspstack = gcrootfinder.runfn(suspstack, gcrootfinder.arg) - # - # Here, suspstack points to the target stacklet to which we want - # to jump to next. Read the 'handle' and forget about the - # suspstack object. - return _consume_suspstack(suspstack) - -def _consume_suspstack(suspstack): - h = suspstack.handle - ll_assert(bool(h), "_consume_suspstack: null handle") - suspstack.handle = _c.null_handle - return h - -def _switch_callback(): - # Here, we just closed the stack. Get the stack anchor, store - # it in the gcrootfinder.suspstack.anchor, and switch to this - # suspstack with stacklet_switch(). If this call fails, then we - # are just returning NULL. - oldanchor = gcrootfinder.suspstack.anchor - _stack_just_closed() - h = _consume_suspstack(gcrootfinder.suspstack) - # - # gcrootfinder.suspstack.anchor is left with the anchor of the - # previous place (i.e. before the call to switch()). - h2 = _c.switch(h) - # - if not h2: # MemoryError: restore - gcrootfinder.suspstack.anchor = oldanchor - gcrootfinder.suspstack.handle = h - return h2 - - -class StackletGcRootFinder(object): - suspstack = NULL_SUSPSTACK - - def new(self, thrd, callback, arg): - self.newthrd = thrd._thrd - self.runfn = callback - self.arg = arg - # make a fresh new clean SUSPSTACK - rgc.register_custom_trace_hook(SUSPSTACK, lambda_customtrace) - newsuspstack = lltype.malloc(SUSPSTACK) - newsuspstack.handle = _c.null_handle - self.suspstack = newsuspstack - # Invoke '_new_callback' by closing the stack - # - callback_pieces = llop.gc_detach_callback_pieces(llmemory.Address) - newsuspstack.callback_pieces = callback_pieces - # - h = pypy_asm_stackwalk2(llhelper(FUNCNOARG_P, _new_callback), - alternateanchor) - h = rffi.cast(_c.handle, h) - # - llop.gc_reattach_callback_pieces(lltype.Void, callback_pieces) - return self.get_result_suspstack(h) - - def switch(self, suspstack): - # Immediately before the switch, 'suspstack' describes the suspended - # state of the *target* of the switch. Then it is theoretically - # freed. In fact what occurs is that we reuse the same 'suspstack' - # object in the target, just after the switch, to store the - # description of where we came from. Then that "other" 'suspstack' - # object is returned. - self.suspstack = suspstack - # - callback_pieces = llop.gc_detach_callback_pieces(llmemory.Address) - old_callback_pieces = suspstack.callback_pieces - suspstack.callback_pieces = callback_pieces - # - h = pypy_asm_stackwalk2(llhelper(FUNCNOARG_P, _switch_callback), - alternateanchor) - h = rffi.cast(_c.handle, h) - # - llop.gc_reattach_callback_pieces(lltype.Void, callback_pieces) - if not h: - self.suspstack.callback_pieces = old_callback_pieces - # - return self.get_result_suspstack(h) - - def attach_handle_on_suspstack(self, handle): - s = self.suspstack - self.suspstack = NULL_SUSPSTACK - ll_assert(bool(s.anchor), "s.anchor should not be null") - s.handle = handle - llop.gc_writebarrier(lltype.Void, llmemory.cast_ptr_to_adr(s)) - return s - - def get_result_suspstack(self, h): - # - # Return from a new() or a switch(): 'h' is a handle, possibly - # an empty one, that says from where we switched to. - if not h: - raise MemoryError - elif _c.is_empty_handle(h): - return NULL_SUSPSTACK - else: - # This is a return that gave us a real handle. Store it. - return self.attach_handle_on_suspstack(h) - - def is_empty_handle(self, suspstack): - return not suspstack - - def get_null_handle(self): - return NULL_SUSPSTACK - - -gcrootfinder = StackletGcRootFinder() diff -Nru pypy-7.1.1+dfsg/rpython/rlib/streamio.py pypy-7.3.1+dfsg/rpython/rlib/streamio.py --- pypy-7.1.1+dfsg/rpython/rlib/streamio.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/rlib/streamio.py 2020-04-10 19:28:41.000000000 +0000 @@ -317,7 +317,8 @@ os.lseek(self.fd, offset, whence) def tell(self): - return os.lseek(self.fd, 0, 1) + result = os.lseek(self.fd, 0, 1) + return r_longlong(result) def read(self, n): assert isinstance(n, int) diff -Nru pypy-7.1.1+dfsg/rpython/rlib/test/test_buffer.py pypy-7.3.1+dfsg/rpython/rlib/test/test_buffer.py --- pypy-7.1.1+dfsg/rpython/rlib/test/test_buffer.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/rlib/test/test_buffer.py 2020-04-10 19:28:41.000000000 +0000 @@ -2,7 +2,7 @@ from rpython.rtyper.lltypesystem import lltype, rffi from rpython.rlib.rarithmetic import r_singlefloat from rpython.rlib.buffer import (StringBuffer, SubBuffer, Buffer, RawBuffer, - ByteBuffer) + RawByteBuffer, ByteBuffer) from rpython.annotator.annrpython import RPythonAnnotator from rpython.annotator.model import SomeInteger from rpython.rtyper.test.tool import BaseRtypingTest @@ -39,9 +39,9 @@ assert buf.getitem(4) == buf[4] assert buf.getlength() == 11 assert buf.getlength() == len(buf) - assert buf.getslice(1, 6, 1, 5) == 'ello ' - assert buf.getslice(1, 6, 1, 5) == buf[1:6] - assert buf.getslice(1, 6, 2, 3) == 'el ' + assert buf.getslice(1, 1, 5) == 'ello ' + assert buf.getslice(1, 1, 5) == buf[1:6] + assert buf.getslice(1, 2, 3) == 'el ' assert buf.as_str() == 'hello world' @@ -125,8 +125,8 @@ class TestSubBufferTypedReadDirect(BaseTypedReadTest): def read(self, TYPE, data, offset): - buf = StringBuffer('xx' + data) - subbuf = SubBuffer(buf, 2, len(data)) + buf = StringBuffer('x' * 16 + data) + subbuf = SubBuffer(buf, 16, len(data)) return subbuf.typed_read(TYPE, offset) @@ -173,10 +173,9 @@ return lltype.cast_primitive(TYPE, x) -class TestByteBuffer(object): - +class _TestByteBufferBase(object): def test_basic(self): - buf = ByteBuffer(4) + buf = self.buffer_class(4) assert buf.getlength() == 4 assert buf.getitem(2) == '\x00' buf.setitem(0, 'A') @@ -184,7 +183,7 @@ assert buf.as_str() == 'A\x00\x00Z' def test_typed_write(self): - buf = ByteBuffer(4) + buf = self.buffer_class(4) buf.typed_write(rffi.USHORT, 0, 0x1234) buf.typed_write(rffi.USHORT, 2, 0x5678) expected = struct.pack('HH', 0x1234, 0x5678) @@ -192,11 +191,51 @@ def test_typed_read(self): data = struct.pack('HH', 0x1234, 0x5678) - buf = ByteBuffer(4) + buf = self.buffer_class(4) buf.setslice(0, data) assert buf.typed_read(rffi.USHORT, 0) == 0x1234 assert buf.typed_read(rffi.USHORT, 2) == 0x5678 + def test_getslice_shortcut(self): + buf = self.buffer_class(4) + buf.setslice(0, b"data") + buf.getitem = None + assert buf.getslice(0, 1, 2) == b"da" # no crash! + + def test_getslice_slowpath(self): + buf = self.buffer_class(4) + buf.setslice(0, b"datu") + assert buf.getslice(0, 2, 2) == b"dt" + assert buf.getslice(1, 2, 2) == b"au" + assert buf.getslice(2, -2, 2) == b"td" + assert buf.getslice(3, -2, 2) == b"ua" + + def test_getslice_clipped1(self): + buf = self.buffer_class(4) + buf.setslice(0, b"data") + buf.getitem = None + assert buf[0:8] == b"data" # no crash! + + def test_getslice_clipped2(self): + buf = self.buffer_class(4) + buf.setslice(0, b"data") + buf.getitem = None + assert buf[1:8] == b"ata" # no crash! + + def test_getslice_open(self): + buf = self.buffer_class(4) + buf.setslice(0, b"data") + buf.getitem = None + assert buf[:] == b"data" # no crash! + + +class TestRawByteBuffer(_TestByteBufferBase): + buffer_class = RawByteBuffer + + +class TestByteBuffer(_TestByteBufferBase): + buffer_class = ByteBuffer + class TestJIT(LLJitMixin): diff -Nru pypy-7.1.1+dfsg/rpython/rlib/test/test_rarithmetic.py pypy-7.3.1+dfsg/rpython/rlib/test/test_rarithmetic.py --- pypy-7.1.1+dfsg/rpython/rlib/test/test_rarithmetic.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/rlib/test/test_rarithmetic.py 2020-04-10 19:28:41.000000000 +0000 @@ -337,6 +337,10 @@ res = self.interpret(f, [123]) assert res == 4 + 2 + def test_string_to_int_translates(self): + def f(s): + return string_to_int(str(s)) + self.interpret(f, [123]) == 123 def test_int_real_union(): from rpython.rtyper.lltypesystem.rffi import r_int_real diff -Nru pypy-7.1.1+dfsg/rpython/rlib/test/test_rbigint.py pypy-7.3.1+dfsg/rpython/rlib/test/test_rbigint.py --- pypy-7.1.1+dfsg/rpython/rlib/test/test_rbigint.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/rlib/test/test_rbigint.py 2020-04-10 19:28:41.000000000 +0000 @@ -3,20 +3,20 @@ import operator import sys import math -from random import random, randint, sample, seed +from random import random, randint, sample -import py import pytest from rpython.rlib import rbigint as lobj from rpython.rlib.rarithmetic import r_uint, r_longlong, r_ulonglong, intmask from rpython.rlib.rbigint import (rbigint, SHIFT, MASK, KARATSUBA_CUTOFF, - _store_digit, _mask_digit, InvalidEndiannessError, InvalidSignednessError) + _store_digit, _mask_digit, InvalidEndiannessError, InvalidSignednessError, + gcd_lehmer, lehmer_xgcd, gcd_binary) from rpython.rlib.rfloat import NAN from rpython.rtyper.test.test_llinterp import interpret from rpython.translator.c.test.test_standalone import StandaloneTests -from hypothesis import given, strategies, example +from hypothesis import given, strategies, example, settings longs = strategies.builds( long, strategies.integers()) @@ -110,7 +110,8 @@ r2 = op1 // op2 assert r1.tolong() == r2 - assert pytest.raises(ZeroDivisionError, r.int_floordiv, 0) + with pytest.raises(ZeroDivisionError): + r.int_floordiv(0) # Error pointed out by Armin Rigo n = sys.maxint+1 @@ -141,7 +142,8 @@ for op2 in gen_signs(long_vals): rl_op2 = rbigint.fromlong(op2) if not op2: - py.test.raises(ZeroDivisionError, rl_op1.truediv, rl_op2) + with pytest.raises(ZeroDivisionError): + rl_op1.truediv(rl_op2) continue r1 = rl_op1.truediv(rl_op2) r2 = op1 / op2 @@ -172,7 +174,8 @@ op1 = rbigint.fromlong(overflowing) op2 = rbigint.fromlong(1) - py.test.raises(OverflowError, op1.truediv, op2) + with pytest.raises(OverflowError): + op1.truediv(op2) def test_truediv_overflow2(self): overflowing = 2**1024 - 2**(1024-53-1) @@ -190,7 +193,8 @@ for op2 in gen_signs(long_vals): rl_op2 = rbigint.fromlong(op2) if not op2: - py.test.raises(ZeroDivisionError, rl_op1.mod, rl_op2) + with pytest.raises(ZeroDivisionError): + rl_op1.mod(rl_op2) continue r1 = rl_op1.mod(rl_op2) r2 = op1 % op2 @@ -202,7 +206,8 @@ op1 = rbigint.fromlong(x) for y in signed_int_vals: if not y: - py.test.raises(ZeroDivisionError, op1.int_mod, 0) + with pytest.raises(ZeroDivisionError): + op1.int_mod(0) continue r1 = op1.int_mod(y) r2 = x % y @@ -244,8 +249,10 @@ def test_pow_raises(self): r1 = rbigint.fromint(2) r0 = rbigint.fromint(0) - py.test.raises(ValueError, r1.int_pow, 2, r0) - py.test.raises(ValueError, r1.pow, r1, r0) + with pytest.raises(ValueError): + r1.int_pow(2, r0) + with pytest.raises(ValueError): + r1.pow(r1, r0) def test_touint(self): result = r_uint(sys.maxint + 42) @@ -339,14 +346,39 @@ from rpython.rlib.rstring import ParseStringError assert rbigint.fromstr('123L').tolong() == 123 assert rbigint.fromstr('123L ').tolong() == 123 - py.test.raises(ParseStringError, rbigint.fromstr, 'L') - py.test.raises(ParseStringError, rbigint.fromstr, 'L ') + with pytest.raises(ParseStringError): + rbigint.fromstr('L') + with pytest.raises(ParseStringError): + rbigint.fromstr('L ') assert rbigint.fromstr('123L', 4).tolong() == 27 assert rbigint.fromstr('123L', 30).tolong() == 27000 + 1800 + 90 + 21 assert rbigint.fromstr('123L', 22).tolong() == 10648 + 968 + 66 + 21 assert rbigint.fromstr('123L', 21).tolong() == 441 + 42 + 3 assert rbigint.fromstr('1891234174197319').tolong() == 1891234174197319 + def test__from_numberstring_parser_rewind_bug(self): + from rpython.rlib.rstring import NumberStringParser + s = "-99" + p = NumberStringParser(s, s, 10, 'int') + assert p.sign == -1 + res = p.next_digit() + assert res == 9 + res = p.next_digit() + assert res == 9 + res = p.next_digit() + assert res == -1 + p.rewind() + res = p.next_digit() + assert res == 9 + res = p.next_digit() + assert res == 9 + res = p.next_digit() + assert res == -1 + + @given(longs) + def test_fromstr_hypothesis(self, l): + assert rbigint.fromstr(str(l)).tolong() == l + def test_from_numberstring_parser(self): from rpython.rlib.rstring import NumberStringParser parser = NumberStringParser("1231231241", "1231231241", 10, "long") @@ -357,8 +389,8 @@ s = "077777777777777777777777777777" parser = NumberStringParser(s, s, 0, "long", no_implicit_octal=True) - py.test.raises(ParseStringError, rbigint._from_numberstring_parser, - parser) + with pytest.raises(ParseStringError): + rbigint._from_numberstring_parser(parser) parser = NumberStringParser("000", "000", 0, "long", no_implicit_octal=True) assert rbigint._from_numberstring_parser(parser).tolong() == 0 @@ -422,7 +454,8 @@ assert d == float(x) x = x ** 100 f1 = rbigint.fromlong(x) - assert py.test.raises(OverflowError, f1.tofloat) + with pytest.raises(OverflowError): + f1.tofloat() f2 = rbigint.fromlong(2097152 << SHIFT) d = f2.tofloat() assert d == float(2097152 << SHIFT) @@ -455,8 +488,10 @@ # XXX don't use such consts. marshal doesn't handle them right. x = 12345.6789e200 x *= x - assert py.test.raises(OverflowError, rbigint.fromfloat, x) - assert py.test.raises(ValueError, rbigint.fromfloat, NAN) + with pytest.raises(OverflowError): + rbigint.fromfloat(x) + with pytest.raises(ValueError): + rbigint.fromfloat(NAN) # f1 = rbigint.fromfloat(9007199254740991.0) assert f1.tolong() == 9007199254740991 @@ -546,7 +581,8 @@ assert u == v assert type(u) is r_uint else: - py.test.raises(ValueError, l.touint) + with pytest.raises(ValueError): + l.touint() toobig_lv1 = rbigint.fromlong(sys.maxint+1) assert toobig_lv1.tolong() == sys.maxint+1 @@ -556,7 +592,8 @@ assert toobig_lv3.tolong() == -sys.maxint-2 for lv in (toobig_lv1, toobig_lv2, toobig_lv3): - py.test.raises(OverflowError, lv.toint) + with pytest.raises(OverflowError): + lv.toint() lmaxuint = rbigint.fromlong(2*sys.maxint+1) toobig_lv4 = rbigint.fromlong(2*sys.maxint+2) @@ -564,8 +601,10 @@ u = lmaxuint.touint() assert u == 2*sys.maxint+1 - py.test.raises(ValueError, toobig_lv3.touint) - py.test.raises(OverflowError, toobig_lv4.touint) + with pytest.raises(ValueError): + toobig_lv3.touint() + with pytest.raises(OverflowError): + toobig_lv4.touint() def test_pow_lll(self): @@ -583,10 +622,12 @@ # f1, f2, f3 = [rbigint.fromlong(i) for i in (10L, -1L, 42L)] - py.test.raises(TypeError, f1.pow, f2, f3) + with pytest.raises(TypeError): + f1.pow(f2, f3) f1, f2, f3 = [rbigint.fromlong(i) for i in (10L, 5L, 0L)] - py.test.raises(ValueError, f1.pow, f2, f3) + with pytest.raises(ValueError): + f1.pow(f2, f3) def test_pow_lll_bug(self): two = rbigint.fromint(2) @@ -644,8 +685,10 @@ masks_list = [int((1 << i) - 1) for i in range(1, r_uint.BITS-1)] for x in gen_signs([3L ** 30L, 5L ** 20L, 7 ** 300, 0L, 1L]): f1 = rbigint.fromlong(x) - py.test.raises(ValueError, f1.lshift, negative) - py.test.raises(ValueError, f1.rshift, negative) + with pytest.raises(ValueError): + f1.lshift(negative) + with pytest.raises(ValueError): + f1.rshift(negative) for y in [0L, 1L, 32L, 2304L, 11233L, 3 ** 9]: res1 = f1.lshift(int(y)).tolong() res2 = f1.rshift(int(y)).tolong() @@ -661,6 +704,10 @@ # Chek value accuracy. assert rbigint.fromlong(18446744073709551615L).rshift(1).tolong() == 18446744073709551615L >> 1 + def test_shift_optimization(self): + # does not crash with memory error + assert rbigint.fromint(0).lshift(sys.maxint).tolong() == 0 + def test_qshift(self): for x in range(10): for y in range(1, 161, 16): @@ -784,7 +831,8 @@ for op in long_vals: for base in [0, 2, 4, 8, 16, 10, math.e]: if not op: - py.test.raises(ValueError, rbigint.fromlong(op).log, base) + with pytest.raises(ValueError): + rbigint.fromlong(op).log(base) continue l = rbigint.fromlong(op).log(base) if base: @@ -808,15 +856,16 @@ s = "\xFF\x02\x03\x04\x05\x06\x07\x08\x09\x10\x11\x12\x13\x14\x15\xFF" bigint = rbigint.frombytes(s, byteorder="big", signed=False) assert s == bigint.tobytes(16, byteorder="big", signed=False) - py.test.raises(InvalidEndiannessError, bigint.frombytes, '\xFF', 'foo', - signed=True) + with pytest.raises(InvalidEndiannessError): + bigint.frombytes('\xFF', 'foo', signed=True) bigint = rbigint.frombytes('\x82', byteorder='big', signed=True) assert bigint.tolong() == -126 def test_tobytes(self): assert rbigint.fromint(0).tobytes(1, 'big', signed=True) == '\x00' assert rbigint.fromint(1).tobytes(2, 'big', signed=True) == '\x00\x01' - py.test.raises(OverflowError, rbigint.fromint(255).tobytes, 1, 'big', signed=True) + with pytest.raises(OverflowError): + rbigint.fromint(255).tobytes(1, 'big', signed=True) assert rbigint.fromint(-129).tobytes(2, 'big', signed=True) == '\xff\x7f' assert rbigint.fromint(-129).tobytes(2, 'little', signed=True) == '\x7f\xff' assert rbigint.fromint(65535).tobytes(3, 'big', signed=True) == '\x00\xff\xff' @@ -824,9 +873,12 @@ assert rbigint.fromint(65535).tobytes(2, 'big', signed=False) == '\xff\xff' assert rbigint.fromint(-8388608).tobytes(3, 'little', signed=True) == '\x00\x00\x80' i = rbigint.fromint(-8388608) - py.test.raises(InvalidEndiannessError, i.tobytes, 3, 'foo', signed=True) - py.test.raises(InvalidSignednessError, i.tobytes, 3, 'little', signed=False) - py.test.raises(OverflowError, i.tobytes, 2, 'little', signed=True) + with pytest.raises(InvalidEndiannessError): + i.tobytes(3, 'foo', signed=True) + with pytest.raises(InvalidSignednessError): + i.tobytes(3, 'little', signed=False) + with pytest.raises(OverflowError): + i.tobytes(2, 'little', signed=True) @given(strategies.binary(), strategies.booleans(), strategies.booleans()) def test_frombytes_tobytes_hypothesis(self, s, big, signed): @@ -836,6 +888,29 @@ t = bigint.tobytes(len(s), byteorder=byteorder, signed=signed) assert s == t + def test_gcd(self): + assert gcd_binary(2*3*7**2, 2**2*7) == 2*7 + pytest.raises(ValueError, gcd_binary, 2*3*7**2, -2**2*7) + assert gcd_binary(1234, 5678) == 2 + assert gcd_binary(13, 13**6) == 13 + assert gcd_binary(12, 0) == 12 + assert gcd_binary(0, 0) == 0 + with pytest.raises(ValueError): + gcd_binary(-10, 0) + with pytest.raises(ValueError): + gcd_binary(10, -10) + + x = rbigint.fromlong(9969216677189303386214405760200) + y = rbigint.fromlong(16130531424904581415797907386349) + g = x.gcd(y) + assert g == rbigint.fromlong(1) + + for x in gen_signs([12843440367927679363613699686751681643652809878241019930204617606850071260822269719878805]): + x = rbigint.fromlong(x) + for y in gen_signs([12372280584571061381380725743231391746505148712246738812788540537514927882776203827701778968535]): + y = rbigint.fromlong(y) + g = x.gcd(y) + assert g.tolong() == 18218089570126697993340888567155155527541105 class TestInternalFunctions(object): @@ -917,7 +992,8 @@ _div, _rem = divmod(sx, sy) assert div.tolong() == _div assert rem.tolong() == _rem - py.test.raises(ZeroDivisionError, rbigint.fromlong(x).divmod, rbigint.fromlong(0)) + with pytest.raises(ZeroDivisionError): + rbigint.fromlong(x).divmod(rbigint.fromlong(0)) # an explicit example for a very rare case in _x_divrem: # "add w back if q was too large (this branch taken rarely)" @@ -950,7 +1026,8 @@ assert rem1.tolong() == _rem assert div.tolong() == _div assert rem.tolong() == _rem - py.test.raises(ZeroDivisionError, rbigint.fromlong(x).int_divmod, 0) + with pytest.raises(ZeroDivisionError): + rbigint.fromlong(x).int_divmod(0) # testing Karatsuba stuff def test__v_iadd(self): @@ -991,8 +1068,10 @@ f4 = rbigint.fromlong(-max-1) # overflows assert f1.tolonglong() == max-1 assert f2.tolonglong() == -max - py.test.raises(OverflowError, f3.tolonglong) - py.test.raises(OverflowError, f4.tolonglong) + with pytest.raises(OverflowError): + f3.tolonglong() + with pytest.raises(OverflowError): + f4.tolonglong() def test_uintmask(self): assert rbigint.fromint(-1).uintmask() == r_uint(-1) @@ -1153,7 +1232,8 @@ try: res = pow(x, y, z) except Exception as e: - pytest.raises(type(e), f1.pow, f2, f3) + with pytest.raises(type(e)): + f1.pow(f2, f3) else: v1 = f1.pow(f2, f3) try: @@ -1176,7 +1256,8 @@ try: res = divmod(x, y) except Exception as e: - pytest.raises(type(e), f1.divmod, f2) + with pytest.raises(type(e)): + f1.divmod(f2) else: print x, y a, b = f1.divmod(f2) @@ -1188,7 +1269,8 @@ try: res = divmod(x, iy) except Exception as e: - pytest.raises(type(e), f1.int_divmod, iy) + with pytest.raises(type(e)): + f1.int_divmod(iy) else: print x, iy a, b = f1.int_divmod(iy) @@ -1219,7 +1301,8 @@ ra = rbigint.fromlong(a) rb = rbigint.fromlong(b) if not b: - pytest.raises(ZeroDivisionError, ra.truediv, rb) + with pytest.raises(ZeroDivisionError): + ra.truediv(rb) else: assert ra.truediv(rb) == a / b @@ -1249,9 +1332,58 @@ assert lx.int_le(y) == (x <= y) @given(longs, longs) - def test_int_comparison(self, x, y): + def test_int_comparison2(self, x, y): lx = rbigint.fromlong(x) ly = rbigint.fromlong(y) assert lx.lt(ly) == (x < y) assert lx.eq(ly) == (x == y) assert lx.le(ly) == (x <= y) + + @given(ints, ints, ints) + def test_gcd_binary(self, x, y, z): + x, y, z = abs(x), abs(y), abs(z) + + def test(a, b, res): + g = gcd_binary(a, b) + + assert g == res + + a, b = x, y + while b: + a, b = b, a % b + + gcd_x_y = a + + test(x, y, gcd_x_y) + test(x, 0, x) + test(0, x, x) + test(x * z, y * z, gcd_x_y * z) + test(x * z, z, z) + test(z, y * z, z) + + @given(biglongs, biglongs, biglongs) + @example(112233445566778899112233445566778899112233445566778899, + 13579246801357924680135792468013579246801, + 99887766554433221113) + @settings(max_examples=10) + def test_gcd(self, x, y, z): + print(x, y, z) + x, y, z = abs(x), abs(y), abs(z) + + def test(a, b, res): + g = rbigint.fromlong(a).gcd(rbigint.fromlong(b)).tolong() + + assert g == res + + a, b = x, y + while b: + a, b = b, a % b + + gcd_x_y = a + + test(x, y, gcd_x_y) + test(x * z, y * z, gcd_x_y * z) + test(x * z, z, z) + test(z, y * z, z) + test(x, 0, x) + test(0, x, x) diff -Nru pypy-7.1.1+dfsg/rpython/rlib/test/test_rfile.py pypy-7.3.1+dfsg/rpython/rlib/test/test_rfile.py --- pypy-7.1.1+dfsg/rpython/rlib/test/test_rfile.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/rlib/test/test_rfile.py 2020-04-10 19:28:41.000000000 +0000 @@ -411,7 +411,10 @@ def f(): with open(fname, "w") as f: f.write("dupa") + assert not f.closed + try: + assert f.closed f.write("dupb") except ValueError: pass diff -Nru pypy-7.1.1+dfsg/rpython/rlib/test/test_rgil.py pypy-7.3.1+dfsg/rpython/rlib/test/test_rgil.py --- pypy-7.1.1+dfsg/rpython/rlib/test/test_rgil.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/rlib/test/test_rgil.py 2020-04-10 19:28:41.000000000 +0000 @@ -1,5 +1,7 @@ from rpython.rlib import rgil +from rpython.rlib.debug import debug_print from rpython.translator.c.test.test_standalone import StandaloneTests +from rpython.config.translationoption import get_combined_translation_config class BaseTestGIL(StandaloneTests): @@ -37,10 +39,127 @@ data = cbuilder.cmdexec('') assert data == "Test\n1\n2\n" + def test_am_I_holding_the_GIL(self): + def check(name, expected=True): + # we may not have the GIL here, don't use "print" + debug_print(name) + if rgil.am_I_holding_the_GIL() != expected: + debug_print('assert failed at point', name) + debug_print('rgil.gil_get_holder() ==', rgil.gil_get_holder()) + assert False + + def main(argv): + check('1') + rgil.release() + # don't have the GIL here + check('2', False) + rgil.acquire() + check('3') + rgil.yield_thread() + check('4') + print "OK" # there is also a release/acquire pair here + check('5') + return 0 + + main([]) + + t, cbuilder = self.compile(main) + data = cbuilder.cmdexec('') + assert data == "OK\n" + + def test_multiple_threads(self): + import time, random + from rpython.rlib import rthread + + def check(name, nextop, expected=True): + # we may not have the GIL here, don't use "print" + if rgil.am_I_holding_the_GIL() != expected: + debug_print('assert failed at point', name, 'at', nextop) + debug_print('rgil.gil_get_holder() ==', rgil.gil_get_holder()) + assert False + + seed = int(time.time()) + print "Random seed:", seed + random.seed(seed) + + # This is just a complicated way of simulating random work. + # We randomly release the GIL in various ways from 4 different threads + # and check that at least rgil.am_I_holding_the_GIL() is sane. + + OP_YIELD = 0 + OP_RELEASE_AND_ACQUIRE = 1 + OP_BUSY = 2 # without releasing the GIL + OP_SLEEP = 3 # time.sleep() always releases the GIL + OPS = [OP_YIELD, OP_RELEASE_AND_ACQUIRE, OP_BUSY, OP_SLEEP] + + N_THREADS = 4 + ops_by_thread = [] + for i in range(N_THREADS): + ops = [] + for j in range(10000): + op = random.choice(OPS) + ops.append(op) + if op >= 2: + ops.append(random.randint(0, 1000)) + ops_by_thread.append(ops) + + class Glob: + def __init__(self): + self.my_locks = [] + self.n_threads = 0 + glob = Glob() + + def do_random_work(): + thread_index = glob.n_threads + glob.n_threads += 1 + ops = ops_by_thread[thread_index] + nextop = 0 + while nextop < len(ops): + op = ops[nextop] + nextop += 1 + if op == OP_YIELD: + rgil.yield_thread() + check("after yield", nextop) + elif op == OP_RELEASE_AND_ACQUIRE: + rgil.release() + check("after release_gil", nextop, expected=False) + rgil.acquire() + check("after acquire_gil", nextop) + else: + arg = ops[nextop] + nextop += 1 + if op == OP_BUSY: + end_time = time.time() + arg * 1e-6 + while time.time() < end_time: + pass + check("after busy work", nextop) + else: + time.sleep(arg * 1e-6) + check("after time.sleep()", nextop) + finish_lock = glob.my_locks[thread_index] + finish_lock.release() + + def main(argv): + for j in range(N_THREADS): + lock = rthread.allocate_lock() + lock.acquire(True) + glob.my_locks.append(lock) + + for j in range(N_THREADS): + rthread.start_new_thread(do_random_work, ()) + + for j in range(N_THREADS): + glob.my_locks[j].acquire(True) + + print "OK" + return 0 + + self.config = get_combined_translation_config( + overrides={"translation.thread": True}) + t, cbuilder = self.compile(main) + data = cbuilder.cmdexec('') + assert data == "OK\n" -class TestGILAsmGcc(BaseTestGIL): - gc = 'minimark' - gcrootfinder = 'asmgcc' class TestGILShadowStack(BaseTestGIL): gc = 'minimark' diff -Nru pypy-7.1.1+dfsg/rpython/rlib/test/test_rsiphash.py pypy-7.3.1+dfsg/rpython/rlib/test/test_rsiphash.py --- pypy-7.1.1+dfsg/rpython/rlib/test/test_rsiphash.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/rlib/test/test_rsiphash.py 2020-04-10 19:28:41.000000000 +0000 @@ -2,6 +2,7 @@ from rpython.rlib.rsiphash import siphash24, _siphash24, choosen_seed from rpython.rlib.rsiphash import initialize_from_env, enable_siphash24 from rpython.rlib.rsiphash import ll_hash_string_siphash24 +from rpython.rlib.rsiphash import siphash24_with_key from rpython.rlib.objectmodel import compute_hash from rpython.rlib.rarithmetic import intmask from rpython.rtyper.annlowlevel import llstr, llunicode @@ -50,6 +51,10 @@ for expected, string in CASES: assert check(string) == expected +def test_siphash24_with_key(): + from rpython.rlib.rarithmetic import r_uint64 + assert siphash24_with_key(b"abcdef", r_uint64(1)) == r_uint64(7956077396882317016L) + def check_latin1(s, expected, test_prebuilt=False): with choosen_seed(0x8a9f065a358479f4, 0x11cb1e9ee7f40e1f, test_misaligned_path=True, test_prebuilt=test_prebuilt): diff -Nru pypy-7.1.1+dfsg/rpython/rlib/test/test_rsocket.py pypy-7.3.1+dfsg/rpython/rlib/test/test_rsocket.py --- pypy-7.1.1+dfsg/rpython/rlib/test/test_rsocket.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/rlib/test/test_rsocket.py 2020-04-10 19:28:41.000000000 +0000 @@ -495,6 +495,26 @@ value, = struct.unpack("i", reusestr) assert value != 0 +def test_getsetsockopt_global(): + # A socket sould start with reuse == 0 + s = RSocket(AF_INET, SOCK_STREAM) + fd = s.fd + reuse = getsockopt_int(fd, SOL_SOCKET, SO_REUSEADDR) + assert reuse == 0 + s.setsockopt_int(SOL_SOCKET, SO_REUSEADDR, 1) + reuse = getsockopt_int(fd, SOL_SOCKET, SO_REUSEADDR) + assert reuse != 0 + +def test_get_socket_family(): + s = RSocket(AF_INET, SOCK_STREAM) + fd = s.fd + assert get_socket_family(fd) == AF_INET + + if getattr(rsocket, 'AF_UNIX', None) is not None: + s = RSocket(AF_UNIX) + fd = s.fd + assert get_socket_family(fd) == AF_UNIX + def test_dup(): s = RSocket(AF_INET, SOCK_STREAM) try: @@ -715,3 +735,11 @@ RSocket, family=AF_INET, type=SOCK_STREAM, proto=SOL_UDP) assert e.value.errno in (errno.EPROTOTYPE, errno.EPROTONOSUPPORT) + +def test_socket_init_non_blocking(): + import fcntl, os + s = RSocket(AF_INET, SOCK_STREAM | SOCK_NONBLOCK) + assert s.type == SOCK_STREAM + assert s.gettimeout() == 0.0 + assert fcntl.fcntl(s.fd, fcntl.F_GETFL, os.O_NONBLOCK) & os.O_NONBLOCK + diff -Nru pypy-7.1.1+dfsg/rpython/rlib/test/test_rstacklet.py pypy-7.3.1+dfsg/rpython/rlib/test/test_rstacklet.py --- pypy-7.1.1+dfsg/rpython/rlib/test/test_rstacklet.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/rlib/test/test_rstacklet.py 2020-04-10 19:28:41.000000000 +0000 @@ -307,9 +307,6 @@ class BaseTestStacklet(StandaloneTests): def setup_class(cls): - if cls.gcrootfinder == "asmgcc" and DEFL_ROOTFINDER_WITHJIT != "asmgcc": - py.test.skip("asmgcc is disabled on the current platform") - from rpython.config.translationoption import get_combined_translation_config config = get_combined_translation_config(translating=True) config.translation.gc = cls.gc @@ -347,13 +344,6 @@ gc = 'boehm' gcrootfinder = None -class TestStackletAsmGcc(BaseTestStacklet): - gc = 'minimark' - gcrootfinder = 'asmgcc' - - @py.test.mark.skipif("sys.platform != 'linux2' or platform.machine().startswith('arm')") - def test_demo1(self): - BaseTestStacklet.test_demo1(self) class TestStackletShadowStack(BaseTestStacklet): gc = 'minimark' diff -Nru pypy-7.1.1+dfsg/rpython/rlib/test/test_rstring.py pypy-7.3.1+dfsg/rpython/rlib/test/test_rstring.py --- pypy-7.1.1+dfsg/rpython/rlib/test/test_rstring.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/rlib/test/test_rstring.py 2020-04-10 19:28:41.000000000 +0000 @@ -88,6 +88,7 @@ assert rsplit('baba', 'a', isutf8=1) == ['b', 'b', ''] assert rsplit('b b', isutf8=1) == ['b', 'b'] assert rsplit('b\xe1\x9a\x80b', isutf8=1) == ['b', 'b'] + assert rsplit('b\xe1\x9a\x80', isutf8=1) == ['b'] def test_string_replace(): def check_replace(value, sub, *args, **kwargs): diff -Nru pypy-7.1.1+dfsg/rpython/rlib/test/test_rutf8.py pypy-7.3.1+dfsg/rpython/rlib/test/test_rutf8.py --- pypy-7.1.1+dfsg/rpython/rlib/test/test_rutf8.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/rlib/test/test_rutf8.py 2020-04-10 19:28:41.000000000 +0000 @@ -1,3 +1,4 @@ +#encoding: utf-8 import pytest import sys from hypothesis import given, strategies, settings, example @@ -133,12 +134,24 @@ @given(strategies.text()) @example(u'x' * 64 * 5) @example(u'x' * (64 * 5 - 1)) +@example(u'ä' + u'x«' * 1000 + u'–' + u'y' * 100) def test_codepoint_index_at_byte_position(u): - storage = rutf8.create_utf8_index_storage(u.encode('utf8'), len(u)) + b = u.encode('utf8') + storage = rutf8.create_utf8_index_storage(b, len(u)) for i in range(len(u) + 1): bytepos = len(u[:i].encode('utf8')) assert rutf8.codepoint_index_at_byte_position( - u.encode('utf8'), storage, bytepos) == i + b, storage, bytepos, len(u)) == i + +@given(strategies.text()) +def test_codepoint_position_at_index_inverse(u): + print u + b = u.encode('utf8') + storage = rutf8.create_utf8_index_storage(b, len(u)) + for i in range(len(u) + 1): + bytepos = rutf8.codepoint_position_at_index(b, storage, i) + assert rutf8.codepoint_index_at_byte_position( + b, storage, bytepos, len(u)) == i repr_func = rutf8.make_utf8_escape_function(prefix='u', pass_printable=False, @@ -156,14 +169,6 @@ expected = any(uch for uch in unichars if u'\ud800' <= uch <= u'\udfff') assert result == expected -@given(strategies.lists(strategies.characters())) -def test_get_utf8_length(unichars): - u = u''.join(unichars) - exp_lgt = len(u) - s = ''.join([c.encode('utf8') for c in u]) - lgt = rutf8.get_utf8_length(s) - if not _has_surrogates(s) or sys.maxunicode > 0xffff: - assert lgt == exp_lgt def test_utf8_string_builder(): s = rutf8.Utf8StringBuilder() @@ -198,6 +203,10 @@ s.append_code(0xD800) assert s.getlength() == 5 + s.append_utf8_slice(u"äöüß".encode("utf-8"), 2, 6, 2) + assert s.getlength() == 7 + assert s.build().decode("utf-8") == u"abc\u1234\ud800öü" + def test_utf8_string_builder_bad_code(): s = rutf8.Utf8StringBuilder() with pytest.raises(rutf8.OutOfRange): @@ -225,3 +234,17 @@ assert pos == i i = rutf8.next_codepoint_pos(utf8s, i) assert list(arg) == l + + +@given(strategies.text(), strategies.integers(0xd800, 0xdfff)) +def test_has_surrogates(arg, surrogate): + b = (arg + unichr(surrogate) + arg).encode("utf-8") + assert not rutf8.has_surrogates(arg.encode("utf-8")) + assert rutf8.has_surrogates(unichr(surrogate).encode("utf-8")) + assert rutf8.has_surrogates(b) + +def test_has_surrogate_xed_no_surrogate(): + u = unichr(55217) + unichr(54990) + b = u.encode("utf-8") + assert b.startswith(b"\xed") + assert not rutf8.has_surrogates(b) diff -Nru pypy-7.1.1+dfsg/rpython/rlib/test/test_rwin32.py pypy-7.3.1+dfsg/rpython/rlib/test/test_rwin32.py --- pypy-7.1.1+dfsg/rpython/rlib/test/test_rwin32.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/rlib/test/test_rwin32.py 2020-04-10 19:28:41.000000000 +0000 @@ -50,7 +50,10 @@ fd = fid.fileno() rwin32.get_osfhandle(fd) fid.close() - py.test.raises(OSError, rwin32.get_osfhandle, fd) + # Somehow the FdValidator's c_enter_suppress_iph, which resolves + # to calling _set_thread_local_invalid_parameter_handler, does not work + # untranslated. After translation it does work. + # py.test.raises(OSError, rwin32.get_osfhandle, fd) rwin32.get_osfhandle(0) def test_open_process(): diff -Nru pypy-7.1.1+dfsg/rpython/rlib/test/test_rzlib.py pypy-7.3.1+dfsg/rpython/rlib/test/test_rzlib.py --- pypy-7.1.1+dfsg/rpython/rlib/test/test_rzlib.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/rlib/test/test_rzlib.py 2020-04-10 19:28:41.000000000 +0000 @@ -274,7 +274,7 @@ rzlib.deflateEnd(copied) assert bytes1 + bytes_copy == compressed -@py.test.mark.skipif(rzlib.ZLIB_VERSION == '1.2.8', reason='does not error check') +@py.test.mark.skipif(rzlib.ZLIB_VERSION in ('1.2.3', '1.2.8'), reason='does not error check') def test_unsuccessful_compress_copy(): """ Errors during unsuccesful deflateCopy operations raise RZlibErrors. diff -Nru pypy-7.1.1+dfsg/rpython/rlib/unicodedata/CaseFolding-11.0.0.txt pypy-7.3.1+dfsg/rpython/rlib/unicodedata/CaseFolding-11.0.0.txt --- pypy-7.1.1+dfsg/rpython/rlib/unicodedata/CaseFolding-11.0.0.txt 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/rlib/unicodedata/CaseFolding-11.0.0.txt 2020-04-10 19:28:41.000000000 +0000 @@ -0,0 +1,1574 @@ +# CaseFolding-11.0.0.txt +# Date: 2018-01-31, 08:20:09 GMT +# © 2018 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/ +# +# Case Folding Properties +# +# This file is a supplement to the UnicodeData file. +# It provides a case folding mapping generated from the Unicode Character Database. +# If all characters are mapped according to the full mapping below, then +# case differences (according to UnicodeData.txt and SpecialCasing.txt) +# are eliminated. +# +# The data supports both implementations that require simple case foldings +# (where string lengths don't change), and implementations that allow full case folding +# (where string lengths may grow). Note that where they can be supported, the +# full case foldings are superior: for example, they allow "MASSE" and "Maße" to match. +# +# All code points not listed in this file map to themselves. +# +# NOTE: case folding does not preserve normalization formats! +# +# 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. +# +# ================================================================================ +# Format +# ================================================================================ +# The entries in this file are in the following machine-readable format: +# +# ; ; ; # +# +# The status field is: +# C: common case folding, common mappings shared by both simple and full mappings. +# F: full case folding, mappings that cause strings to grow in length. Multiple characters are separated by spaces. +# S: simple case folding, mappings to single characters where different from F. +# T: special case for uppercase I and dotted uppercase I +# - For non-Turkic languages, this mapping is normally not used. +# - For Turkic languages (tr, az), this mapping can be used instead of the normal mapping for these characters. +# Note that the Turkic mappings do not maintain canonical equivalence without additional processing. +# See the discussions of case mapping in the Unicode Standard for more information. +# +# Usage: +# A. To do a simple case folding, use the mappings with status C + S. +# B. To do a full case folding, use the mappings with status C + F. +# +# The mappings with status T can be used or omitted depending on the desired case-folding +# behavior. (The default option is to exclude them.) +# +# ================================================================= + +# Property: Case_Folding + +# All code points not explicitly listed for Case_Folding +# have the value C for the status field, and the code point itself for the mapping field. + +# ================================================================= +0041; C; 0061; # LATIN CAPITAL LETTER A +0042; C; 0062; # LATIN CAPITAL LETTER B +0043; C; 0063; # LATIN CAPITAL LETTER C +0044; C; 0064; # LATIN CAPITAL LETTER D +0045; C; 0065; # LATIN CAPITAL LETTER E +0046; C; 0066; # LATIN CAPITAL LETTER F +0047; C; 0067; # LATIN CAPITAL LETTER G +0048; C; 0068; # LATIN CAPITAL LETTER H +0049; C; 0069; # LATIN CAPITAL LETTER I +0049; T; 0131; # LATIN CAPITAL LETTER I +004A; C; 006A; # LATIN CAPITAL LETTER J +004B; C; 006B; # LATIN CAPITAL LETTER K +004C; C; 006C; # LATIN CAPITAL LETTER L +004D; C; 006D; # LATIN CAPITAL LETTER M +004E; C; 006E; # LATIN CAPITAL LETTER N +004F; C; 006F; # LATIN CAPITAL LETTER O +0050; C; 0070; # LATIN CAPITAL LETTER P +0051; C; 0071; # LATIN CAPITAL LETTER Q +0052; C; 0072; # LATIN CAPITAL LETTER R +0053; C; 0073; # LATIN CAPITAL LETTER S +0054; C; 0074; # LATIN CAPITAL LETTER T +0055; C; 0075; # LATIN CAPITAL LETTER U +0056; C; 0076; # LATIN CAPITAL LETTER V +0057; C; 0077; # LATIN CAPITAL LETTER W +0058; C; 0078; # LATIN CAPITAL LETTER X +0059; C; 0079; # LATIN CAPITAL LETTER Y +005A; C; 007A; # LATIN CAPITAL LETTER Z +00B5; C; 03BC; # MICRO SIGN +00C0; C; 00E0; # LATIN CAPITAL LETTER A WITH GRAVE +00C1; C; 00E1; # LATIN CAPITAL LETTER A WITH ACUTE +00C2; C; 00E2; # LATIN CAPITAL LETTER A WITH CIRCUMFLEX +00C3; C; 00E3; # LATIN CAPITAL LETTER A WITH TILDE +00C4; C; 00E4; # LATIN CAPITAL LETTER A WITH DIAERESIS +00C5; C; 00E5; # LATIN CAPITAL LETTER A WITH RING ABOVE +00C6; C; 00E6; # LATIN CAPITAL LETTER AE +00C7; C; 00E7; # LATIN CAPITAL LETTER C WITH CEDILLA +00C8; C; 00E8; # LATIN CAPITAL LETTER E WITH GRAVE +00C9; C; 00E9; # LATIN CAPITAL LETTER E WITH ACUTE +00CA; C; 00EA; # LATIN CAPITAL LETTER E WITH CIRCUMFLEX +00CB; C; 00EB; # LATIN CAPITAL LETTER E WITH DIAERESIS +00CC; C; 00EC; # LATIN CAPITAL LETTER I WITH GRAVE +00CD; C; 00ED; # LATIN CAPITAL LETTER I WITH ACUTE +00CE; C; 00EE; # LATIN CAPITAL LETTER I WITH CIRCUMFLEX +00CF; C; 00EF; # LATIN CAPITAL LETTER I WITH DIAERESIS +00D0; C; 00F0; # LATIN CAPITAL LETTER ETH +00D1; C; 00F1; # LATIN CAPITAL LETTER N WITH TILDE +00D2; C; 00F2; # LATIN CAPITAL LETTER O WITH GRAVE +00D3; C; 00F3; # LATIN CAPITAL LETTER O WITH ACUTE +00D4; C; 00F4; # LATIN CAPITAL LETTER O WITH CIRCUMFLEX +00D5; C; 00F5; # LATIN CAPITAL LETTER O WITH TILDE +00D6; C; 00F6; # LATIN CAPITAL LETTER O WITH DIAERESIS +00D8; C; 00F8; # LATIN CAPITAL LETTER O WITH STROKE +00D9; C; 00F9; # LATIN CAPITAL LETTER U WITH GRAVE +00DA; C; 00FA; # LATIN CAPITAL LETTER U WITH ACUTE +00DB; C; 00FB; # LATIN CAPITAL LETTER U WITH CIRCUMFLEX +00DC; C; 00FC; # LATIN CAPITAL LETTER U WITH DIAERESIS +00DD; C; 00FD; # LATIN CAPITAL LETTER Y WITH ACUTE +00DE; C; 00FE; # LATIN CAPITAL LETTER THORN +00DF; F; 0073 0073; # LATIN SMALL LETTER SHARP S +0100; C; 0101; # LATIN CAPITAL LETTER A WITH MACRON +0102; C; 0103; # LATIN CAPITAL LETTER A WITH BREVE +0104; C; 0105; # LATIN CAPITAL LETTER A WITH OGONEK +0106; C; 0107; # LATIN CAPITAL LETTER C WITH ACUTE +0108; C; 0109; # LATIN CAPITAL LETTER C WITH CIRCUMFLEX +010A; C; 010B; # LATIN CAPITAL LETTER C WITH DOT ABOVE +010C; C; 010D; # LATIN CAPITAL LETTER C WITH CARON +010E; C; 010F; # LATIN CAPITAL LETTER D WITH CARON +0110; C; 0111; # LATIN CAPITAL LETTER D WITH STROKE +0112; C; 0113; # LATIN CAPITAL LETTER E WITH MACRON +0114; C; 0115; # LATIN CAPITAL LETTER E WITH BREVE +0116; C; 0117; # LATIN CAPITAL LETTER E WITH DOT ABOVE +0118; C; 0119; # LATIN CAPITAL LETTER E WITH OGONEK +011A; C; 011B; # LATIN CAPITAL LETTER E WITH CARON +011C; C; 011D; # LATIN CAPITAL LETTER G WITH CIRCUMFLEX +011E; C; 011F; # LATIN CAPITAL LETTER G WITH BREVE +0120; C; 0121; # LATIN CAPITAL LETTER G WITH DOT ABOVE +0122; C; 0123; # LATIN CAPITAL LETTER G WITH CEDILLA +0124; C; 0125; # LATIN CAPITAL LETTER H WITH CIRCUMFLEX +0126; C; 0127; # LATIN CAPITAL LETTER H WITH STROKE +0128; C; 0129; # LATIN CAPITAL LETTER I WITH TILDE +012A; C; 012B; # LATIN CAPITAL LETTER I WITH MACRON +012C; C; 012D; # LATIN CAPITAL LETTER I WITH BREVE +012E; C; 012F; # LATIN CAPITAL LETTER I WITH OGONEK +0130; F; 0069 0307; # LATIN CAPITAL LETTER I WITH DOT ABOVE +0130; T; 0069; # LATIN CAPITAL LETTER I WITH DOT ABOVE +0132; C; 0133; # LATIN CAPITAL LIGATURE IJ +0134; C; 0135; # LATIN CAPITAL LETTER J WITH CIRCUMFLEX +0136; C; 0137; # LATIN CAPITAL LETTER K WITH CEDILLA +0139; C; 013A; # LATIN CAPITAL LETTER L WITH ACUTE +013B; C; 013C; # LATIN CAPITAL LETTER L WITH CEDILLA +013D; C; 013E; # LATIN CAPITAL LETTER L WITH CARON +013F; C; 0140; # LATIN CAPITAL LETTER L WITH MIDDLE DOT +0141; C; 0142; # LATIN CAPITAL LETTER L WITH STROKE +0143; C; 0144; # LATIN CAPITAL LETTER N WITH ACUTE +0145; C; 0146; # LATIN CAPITAL LETTER N WITH CEDILLA +0147; C; 0148; # LATIN CAPITAL LETTER N WITH CARON +0149; F; 02BC 006E; # LATIN SMALL LETTER N PRECEDED BY APOSTROPHE +014A; C; 014B; # LATIN CAPITAL LETTER ENG +014C; C; 014D; # LATIN CAPITAL LETTER O WITH MACRON +014E; C; 014F; # LATIN CAPITAL LETTER O WITH BREVE +0150; C; 0151; # LATIN CAPITAL LETTER O WITH DOUBLE ACUTE +0152; C; 0153; # LATIN CAPITAL LIGATURE OE +0154; C; 0155; # LATIN CAPITAL LETTER R WITH ACUTE +0156; C; 0157; # LATIN CAPITAL LETTER R WITH CEDILLA +0158; C; 0159; # LATIN CAPITAL LETTER R WITH CARON +015A; C; 015B; # LATIN CAPITAL LETTER S WITH ACUTE +015C; C; 015D; # LATIN CAPITAL LETTER S WITH CIRCUMFLEX +015E; C; 015F; # LATIN CAPITAL LETTER S WITH CEDILLA +0160; C; 0161; # LATIN CAPITAL LETTER S WITH CARON +0162; C; 0163; # LATIN CAPITAL LETTER T WITH CEDILLA +0164; C; 0165; # LATIN CAPITAL LETTER T WITH CARON +0166; C; 0167; # LATIN CAPITAL LETTER T WITH STROKE +0168; C; 0169; # LATIN CAPITAL LETTER U WITH TILDE +016A; C; 016B; # LATIN CAPITAL LETTER U WITH MACRON +016C; C; 016D; # LATIN CAPITAL LETTER U WITH BREVE +016E; C; 016F; # LATIN CAPITAL LETTER U WITH RING ABOVE +0170; C; 0171; # LATIN CAPITAL LETTER U WITH DOUBLE ACUTE +0172; C; 0173; # LATIN CAPITAL LETTER U WITH OGONEK +0174; C; 0175; # LATIN CAPITAL LETTER W WITH CIRCUMFLEX +0176; C; 0177; # LATIN CAPITAL LETTER Y WITH CIRCUMFLEX +0178; C; 00FF; # LATIN CAPITAL LETTER Y WITH DIAERESIS +0179; C; 017A; # LATIN CAPITAL LETTER Z WITH ACUTE +017B; C; 017C; # LATIN CAPITAL LETTER Z WITH DOT ABOVE +017D; C; 017E; # LATIN CAPITAL LETTER Z WITH CARON +017F; C; 0073; # LATIN SMALL LETTER LONG S +0181; C; 0253; # LATIN CAPITAL LETTER B WITH HOOK +0182; C; 0183; # LATIN CAPITAL LETTER B WITH TOPBAR +0184; C; 0185; # LATIN CAPITAL LETTER TONE SIX +0186; C; 0254; # LATIN CAPITAL LETTER OPEN O +0187; C; 0188; # LATIN CAPITAL LETTER C WITH HOOK +0189; C; 0256; # LATIN CAPITAL LETTER AFRICAN D +018A; C; 0257; # LATIN CAPITAL LETTER D WITH HOOK +018B; C; 018C; # LATIN CAPITAL LETTER D WITH TOPBAR +018E; C; 01DD; # LATIN CAPITAL LETTER REVERSED E +018F; C; 0259; # LATIN CAPITAL LETTER SCHWA +0190; C; 025B; # LATIN CAPITAL LETTER OPEN E +0191; C; 0192; # LATIN CAPITAL LETTER F WITH HOOK +0193; C; 0260; # LATIN CAPITAL LETTER G WITH HOOK +0194; C; 0263; # LATIN CAPITAL LETTER GAMMA +0196; C; 0269; # LATIN CAPITAL LETTER IOTA +0197; C; 0268; # LATIN CAPITAL LETTER I WITH STROKE +0198; C; 0199; # LATIN CAPITAL LETTER K WITH HOOK +019C; C; 026F; # LATIN CAPITAL LETTER TURNED M +019D; C; 0272; # LATIN CAPITAL LETTER N WITH LEFT HOOK +019F; C; 0275; # LATIN CAPITAL LETTER O WITH MIDDLE TILDE +01A0; C; 01A1; # LATIN CAPITAL LETTER O WITH HORN +01A2; C; 01A3; # LATIN CAPITAL LETTER OI +01A4; C; 01A5; # LATIN CAPITAL LETTER P WITH HOOK +01A6; C; 0280; # LATIN LETTER YR +01A7; C; 01A8; # LATIN CAPITAL LETTER TONE TWO +01A9; C; 0283; # LATIN CAPITAL LETTER ESH +01AC; C; 01AD; # LATIN CAPITAL LETTER T WITH HOOK +01AE; C; 0288; # LATIN CAPITAL LETTER T WITH RETROFLEX HOOK +01AF; C; 01B0; # LATIN CAPITAL LETTER U WITH HORN +01B1; C; 028A; # LATIN CAPITAL LETTER UPSILON +01B2; C; 028B; # LATIN CAPITAL LETTER V WITH HOOK +01B3; C; 01B4; # LATIN CAPITAL LETTER Y WITH HOOK +01B5; C; 01B6; # LATIN CAPITAL LETTER Z WITH STROKE +01B7; C; 0292; # LATIN CAPITAL LETTER EZH +01B8; C; 01B9; # LATIN CAPITAL LETTER EZH REVERSED +01BC; C; 01BD; # LATIN CAPITAL LETTER TONE FIVE +01C4; C; 01C6; # LATIN CAPITAL LETTER DZ WITH CARON +01C5; C; 01C6; # LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON +01C7; C; 01C9; # LATIN CAPITAL LETTER LJ +01C8; C; 01C9; # LATIN CAPITAL LETTER L WITH SMALL LETTER J +01CA; C; 01CC; # LATIN CAPITAL LETTER NJ +01CB; C; 01CC; # LATIN CAPITAL LETTER N WITH SMALL LETTER J +01CD; C; 01CE; # LATIN CAPITAL LETTER A WITH CARON +01CF; C; 01D0; # LATIN CAPITAL LETTER I WITH CARON +01D1; C; 01D2; # LATIN CAPITAL LETTER O WITH CARON +01D3; C; 01D4; # LATIN CAPITAL LETTER U WITH CARON +01D5; C; 01D6; # LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON +01D7; C; 01D8; # LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE +01D9; C; 01DA; # LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON +01DB; C; 01DC; # LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE +01DE; C; 01DF; # LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON +01E0; C; 01E1; # LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON +01E2; C; 01E3; # LATIN CAPITAL LETTER AE WITH MACRON +01E4; C; 01E5; # LATIN CAPITAL LETTER G WITH STROKE +01E6; C; 01E7; # LATIN CAPITAL LETTER G WITH CARON +01E8; C; 01E9; # LATIN CAPITAL LETTER K WITH CARON +01EA; C; 01EB; # LATIN CAPITAL LETTER O WITH OGONEK +01EC; C; 01ED; # LATIN CAPITAL LETTER O WITH OGONEK AND MACRON +01EE; C; 01EF; # LATIN CAPITAL LETTER EZH WITH CARON +01F0; F; 006A 030C; # LATIN SMALL LETTER J WITH CARON +01F1; C; 01F3; # LATIN CAPITAL LETTER DZ +01F2; C; 01F3; # LATIN CAPITAL LETTER D WITH SMALL LETTER Z +01F4; C; 01F5; # LATIN CAPITAL LETTER G WITH ACUTE +01F6; C; 0195; # LATIN CAPITAL LETTER HWAIR +01F7; C; 01BF; # LATIN CAPITAL LETTER WYNN +01F8; C; 01F9; # LATIN CAPITAL LETTER N WITH GRAVE +01FA; C; 01FB; # LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE +01FC; C; 01FD; # LATIN CAPITAL LETTER AE WITH ACUTE +01FE; C; 01FF; # LATIN CAPITAL LETTER O WITH STROKE AND ACUTE +0200; C; 0201; # LATIN CAPITAL LETTER A WITH DOUBLE GRAVE +0202; C; 0203; # LATIN CAPITAL LETTER A WITH INVERTED BREVE +0204; C; 0205; # LATIN CAPITAL LETTER E WITH DOUBLE GRAVE +0206; C; 0207; # LATIN CAPITAL LETTER E WITH INVERTED BREVE +0208; C; 0209; # LATIN CAPITAL LETTER I WITH DOUBLE GRAVE +020A; C; 020B; # LATIN CAPITAL LETTER I WITH INVERTED BREVE +020C; C; 020D; # LATIN CAPITAL LETTER O WITH DOUBLE GRAVE +020E; C; 020F; # LATIN CAPITAL LETTER O WITH INVERTED BREVE +0210; C; 0211; # LATIN CAPITAL LETTER R WITH DOUBLE GRAVE +0212; C; 0213; # LATIN CAPITAL LETTER R WITH INVERTED BREVE +0214; C; 0215; # LATIN CAPITAL LETTER U WITH DOUBLE GRAVE +0216; C; 0217; # LATIN CAPITAL LETTER U WITH INVERTED BREVE +0218; C; 0219; # LATIN CAPITAL LETTER S WITH COMMA BELOW +021A; C; 021B; # LATIN CAPITAL LETTER T WITH COMMA BELOW +021C; C; 021D; # LATIN CAPITAL LETTER YOGH +021E; C; 021F; # LATIN CAPITAL LETTER H WITH CARON +0220; C; 019E; # LATIN CAPITAL LETTER N WITH LONG RIGHT LEG +0222; C; 0223; # LATIN CAPITAL LETTER OU +0224; C; 0225; # LATIN CAPITAL LETTER Z WITH HOOK +0226; C; 0227; # LATIN CAPITAL LETTER A WITH DOT ABOVE +0228; C; 0229; # LATIN CAPITAL LETTER E WITH CEDILLA +022A; C; 022B; # LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON +022C; C; 022D; # LATIN CAPITAL LETTER O WITH TILDE AND MACRON +022E; C; 022F; # LATIN CAPITAL LETTER O WITH DOT ABOVE +0230; C; 0231; # LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON +0232; C; 0233; # LATIN CAPITAL LETTER Y WITH MACRON +023A; C; 2C65; # LATIN CAPITAL LETTER A WITH STROKE +023B; C; 023C; # LATIN CAPITAL LETTER C WITH STROKE +023D; C; 019A; # LATIN CAPITAL LETTER L WITH BAR +023E; C; 2C66; # LATIN CAPITAL LETTER T WITH DIAGONAL STROKE +0241; C; 0242; # LATIN CAPITAL LETTER GLOTTAL STOP +0243; C; 0180; # LATIN CAPITAL LETTER B WITH STROKE +0244; C; 0289; # LATIN CAPITAL LETTER U BAR +0245; C; 028C; # LATIN CAPITAL LETTER TURNED V +0246; C; 0247; # LATIN CAPITAL LETTER E WITH STROKE +0248; C; 0249; # LATIN CAPITAL LETTER J WITH STROKE +024A; C; 024B; # LATIN CAPITAL LETTER SMALL Q WITH HOOK TAIL +024C; C; 024D; # LATIN CAPITAL LETTER R WITH STROKE +024E; C; 024F; # LATIN CAPITAL LETTER Y WITH STROKE +0345; C; 03B9; # COMBINING GREEK YPOGEGRAMMENI +0370; C; 0371; # GREEK CAPITAL LETTER HETA +0372; C; 0373; # GREEK CAPITAL LETTER ARCHAIC SAMPI +0376; C; 0377; # GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA +037F; C; 03F3; # GREEK CAPITAL LETTER YOT +0386; C; 03AC; # GREEK CAPITAL LETTER ALPHA WITH TONOS +0388; C; 03AD; # GREEK CAPITAL LETTER EPSILON WITH TONOS +0389; C; 03AE; # GREEK CAPITAL LETTER ETA WITH TONOS +038A; C; 03AF; # GREEK CAPITAL LETTER IOTA WITH TONOS +038C; C; 03CC; # GREEK CAPITAL LETTER OMICRON WITH TONOS +038E; C; 03CD; # GREEK CAPITAL LETTER UPSILON WITH TONOS +038F; C; 03CE; # GREEK CAPITAL LETTER OMEGA WITH TONOS +0390; F; 03B9 0308 0301; # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS +0391; C; 03B1; # GREEK CAPITAL LETTER ALPHA +0392; C; 03B2; # GREEK CAPITAL LETTER BETA +0393; C; 03B3; # GREEK CAPITAL LETTER GAMMA +0394; C; 03B4; # GREEK CAPITAL LETTER DELTA +0395; C; 03B5; # GREEK CAPITAL LETTER EPSILON +0396; C; 03B6; # GREEK CAPITAL LETTER ZETA +0397; C; 03B7; # GREEK CAPITAL LETTER ETA +0398; C; 03B8; # GREEK CAPITAL LETTER THETA +0399; C; 03B9; # GREEK CAPITAL LETTER IOTA +039A; C; 03BA; # GREEK CAPITAL LETTER KAPPA +039B; C; 03BB; # GREEK CAPITAL LETTER LAMDA +039C; C; 03BC; # GREEK CAPITAL LETTER MU +039D; C; 03BD; # GREEK CAPITAL LETTER NU +039E; C; 03BE; # GREEK CAPITAL LETTER XI +039F; C; 03BF; # GREEK CAPITAL LETTER OMICRON +03A0; C; 03C0; # GREEK CAPITAL LETTER PI +03A1; C; 03C1; # GREEK CAPITAL LETTER RHO +03A3; C; 03C3; # GREEK CAPITAL LETTER SIGMA +03A4; C; 03C4; # GREEK CAPITAL LETTER TAU +03A5; C; 03C5; # GREEK CAPITAL LETTER UPSILON +03A6; C; 03C6; # GREEK CAPITAL LETTER PHI +03A7; C; 03C7; # GREEK CAPITAL LETTER CHI +03A8; C; 03C8; # GREEK CAPITAL LETTER PSI +03A9; C; 03C9; # GREEK CAPITAL LETTER OMEGA +03AA; C; 03CA; # GREEK CAPITAL LETTER IOTA WITH DIALYTIKA +03AB; C; 03CB; # GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA +03B0; F; 03C5 0308 0301; # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS +03C2; C; 03C3; # GREEK SMALL LETTER FINAL SIGMA +03CF; C; 03D7; # GREEK CAPITAL KAI SYMBOL +03D0; C; 03B2; # GREEK BETA SYMBOL +03D1; C; 03B8; # GREEK THETA SYMBOL +03D5; C; 03C6; # GREEK PHI SYMBOL +03D6; C; 03C0; # GREEK PI SYMBOL +03D8; C; 03D9; # GREEK LETTER ARCHAIC KOPPA +03DA; C; 03DB; # GREEK LETTER STIGMA +03DC; C; 03DD; # GREEK LETTER DIGAMMA +03DE; C; 03DF; # GREEK LETTER KOPPA +03E0; C; 03E1; # GREEK LETTER SAMPI +03E2; C; 03E3; # COPTIC CAPITAL LETTER SHEI +03E4; C; 03E5; # COPTIC CAPITAL LETTER FEI +03E6; C; 03E7; # COPTIC CAPITAL LETTER KHEI +03E8; C; 03E9; # COPTIC CAPITAL LETTER HORI +03EA; C; 03EB; # COPTIC CAPITAL LETTER GANGIA +03EC; C; 03ED; # COPTIC CAPITAL LETTER SHIMA +03EE; C; 03EF; # COPTIC CAPITAL LETTER DEI +03F0; C; 03BA; # GREEK KAPPA SYMBOL +03F1; C; 03C1; # GREEK RHO SYMBOL +03F4; C; 03B8; # GREEK CAPITAL THETA SYMBOL +03F5; C; 03B5; # GREEK LUNATE EPSILON SYMBOL +03F7; C; 03F8; # GREEK CAPITAL LETTER SHO +03F9; C; 03F2; # GREEK CAPITAL LUNATE SIGMA SYMBOL +03FA; C; 03FB; # GREEK CAPITAL LETTER SAN +03FD; C; 037B; # GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL +03FE; C; 037C; # GREEK CAPITAL DOTTED LUNATE SIGMA SYMBOL +03FF; C; 037D; # GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL +0400; C; 0450; # CYRILLIC CAPITAL LETTER IE WITH GRAVE +0401; C; 0451; # CYRILLIC CAPITAL LETTER IO +0402; C; 0452; # CYRILLIC CAPITAL LETTER DJE +0403; C; 0453; # CYRILLIC CAPITAL LETTER GJE +0404; C; 0454; # CYRILLIC CAPITAL LETTER UKRAINIAN IE +0405; C; 0455; # CYRILLIC CAPITAL LETTER DZE +0406; C; 0456; # CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I +0407; C; 0457; # CYRILLIC CAPITAL LETTER YI +0408; C; 0458; # CYRILLIC CAPITAL LETTER JE +0409; C; 0459; # CYRILLIC CAPITAL LETTER LJE +040A; C; 045A; # CYRILLIC CAPITAL LETTER NJE +040B; C; 045B; # CYRILLIC CAPITAL LETTER TSHE +040C; C; 045C; # CYRILLIC CAPITAL LETTER KJE +040D; C; 045D; # CYRILLIC CAPITAL LETTER I WITH GRAVE +040E; C; 045E; # CYRILLIC CAPITAL LETTER SHORT U +040F; C; 045F; # CYRILLIC CAPITAL LETTER DZHE +0410; C; 0430; # CYRILLIC CAPITAL LETTER A +0411; C; 0431; # CYRILLIC CAPITAL LETTER BE +0412; C; 0432; # CYRILLIC CAPITAL LETTER VE +0413; C; 0433; # CYRILLIC CAPITAL LETTER GHE +0414; C; 0434; # CYRILLIC CAPITAL LETTER DE +0415; C; 0435; # CYRILLIC CAPITAL LETTER IE +0416; C; 0436; # CYRILLIC CAPITAL LETTER ZHE +0417; C; 0437; # CYRILLIC CAPITAL LETTER ZE +0418; C; 0438; # CYRILLIC CAPITAL LETTER I +0419; C; 0439; # CYRILLIC CAPITAL LETTER SHORT I +041A; C; 043A; # CYRILLIC CAPITAL LETTER KA +041B; C; 043B; # CYRILLIC CAPITAL LETTER EL +041C; C; 043C; # CYRILLIC CAPITAL LETTER EM +041D; C; 043D; # CYRILLIC CAPITAL LETTER EN +041E; C; 043E; # CYRILLIC CAPITAL LETTER O +041F; C; 043F; # CYRILLIC CAPITAL LETTER PE +0420; C; 0440; # CYRILLIC CAPITAL LETTER ER +0421; C; 0441; # CYRILLIC CAPITAL LETTER ES +0422; C; 0442; # CYRILLIC CAPITAL LETTER TE +0423; C; 0443; # CYRILLIC CAPITAL LETTER U +0424; C; 0444; # CYRILLIC CAPITAL LETTER EF +0425; C; 0445; # CYRILLIC CAPITAL LETTER HA +0426; C; 0446; # CYRILLIC CAPITAL LETTER TSE +0427; C; 0447; # CYRILLIC CAPITAL LETTER CHE +0428; C; 0448; # CYRILLIC CAPITAL LETTER SHA +0429; C; 0449; # CYRILLIC CAPITAL LETTER SHCHA +042A; C; 044A; # CYRILLIC CAPITAL LETTER HARD SIGN +042B; C; 044B; # CYRILLIC CAPITAL LETTER YERU +042C; C; 044C; # CYRILLIC CAPITAL LETTER SOFT SIGN +042D; C; 044D; # CYRILLIC CAPITAL LETTER E +042E; C; 044E; # CYRILLIC CAPITAL LETTER YU +042F; C; 044F; # CYRILLIC CAPITAL LETTER YA +0460; C; 0461; # CYRILLIC CAPITAL LETTER OMEGA +0462; C; 0463; # CYRILLIC CAPITAL LETTER YAT +0464; C; 0465; # CYRILLIC CAPITAL LETTER IOTIFIED E +0466; C; 0467; # CYRILLIC CAPITAL LETTER LITTLE YUS +0468; C; 0469; # CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS +046A; C; 046B; # CYRILLIC CAPITAL LETTER BIG YUS +046C; C; 046D; # CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS +046E; C; 046F; # CYRILLIC CAPITAL LETTER KSI +0470; C; 0471; # CYRILLIC CAPITAL LETTER PSI +0472; C; 0473; # CYRILLIC CAPITAL LETTER FITA +0474; C; 0475; # CYRILLIC CAPITAL LETTER IZHITSA +0476; C; 0477; # CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT +0478; C; 0479; # CYRILLIC CAPITAL LETTER UK +047A; C; 047B; # CYRILLIC CAPITAL LETTER ROUND OMEGA +047C; C; 047D; # CYRILLIC CAPITAL LETTER OMEGA WITH TITLO +047E; C; 047F; # CYRILLIC CAPITAL LETTER OT +0480; C; 0481; # CYRILLIC CAPITAL LETTER KOPPA +048A; C; 048B; # CYRILLIC CAPITAL LETTER SHORT I WITH TAIL +048C; C; 048D; # CYRILLIC CAPITAL LETTER SEMISOFT SIGN +048E; C; 048F; # CYRILLIC CAPITAL LETTER ER WITH TICK +0490; C; 0491; # CYRILLIC CAPITAL LETTER GHE WITH UPTURN +0492; C; 0493; # CYRILLIC CAPITAL LETTER GHE WITH STROKE +0494; C; 0495; # CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK +0496; C; 0497; # CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER +0498; C; 0499; # CYRILLIC CAPITAL LETTER ZE WITH DESCENDER +049A; C; 049B; # CYRILLIC CAPITAL LETTER KA WITH DESCENDER +049C; C; 049D; # CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE +049E; C; 049F; # CYRILLIC CAPITAL LETTER KA WITH STROKE +04A0; C; 04A1; # CYRILLIC CAPITAL LETTER BASHKIR KA +04A2; C; 04A3; # CYRILLIC CAPITAL LETTER EN WITH DESCENDER +04A4; C; 04A5; # CYRILLIC CAPITAL LIGATURE EN GHE +04A6; C; 04A7; # CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK +04A8; C; 04A9; # CYRILLIC CAPITAL LETTER ABKHASIAN HA +04AA; C; 04AB; # CYRILLIC CAPITAL LETTER ES WITH DESCENDER +04AC; C; 04AD; # CYRILLIC CAPITAL LETTER TE WITH DESCENDER +04AE; C; 04AF; # CYRILLIC CAPITAL LETTER STRAIGHT U +04B0; C; 04B1; # CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE +04B2; C; 04B3; # CYRILLIC CAPITAL LETTER HA WITH DESCENDER +04B4; C; 04B5; # CYRILLIC CAPITAL LIGATURE TE TSE +04B6; C; 04B7; # CYRILLIC CAPITAL LETTER CHE WITH DESCENDER +04B8; C; 04B9; # CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE +04BA; C; 04BB; # CYRILLIC CAPITAL LETTER SHHA +04BC; C; 04BD; # CYRILLIC CAPITAL LETTER ABKHASIAN CHE +04BE; C; 04BF; # CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER +04C0; C; 04CF; # CYRILLIC LETTER PALOCHKA +04C1; C; 04C2; # CYRILLIC CAPITAL LETTER ZHE WITH BREVE +04C3; C; 04C4; # CYRILLIC CAPITAL LETTER KA WITH HOOK +04C5; C; 04C6; # CYRILLIC CAPITAL LETTER EL WITH TAIL +04C7; C; 04C8; # CYRILLIC CAPITAL LETTER EN WITH HOOK +04C9; C; 04CA; # CYRILLIC CAPITAL LETTER EN WITH TAIL +04CB; C; 04CC; # CYRILLIC CAPITAL LETTER KHAKASSIAN CHE +04CD; C; 04CE; # CYRILLIC CAPITAL LETTER EM WITH TAIL +04D0; C; 04D1; # CYRILLIC CAPITAL LETTER A WITH BREVE +04D2; C; 04D3; # CYRILLIC CAPITAL LETTER A WITH DIAERESIS +04D4; C; 04D5; # CYRILLIC CAPITAL LIGATURE A IE +04D6; C; 04D7; # CYRILLIC CAPITAL LETTER IE WITH BREVE +04D8; C; 04D9; # CYRILLIC CAPITAL LETTER SCHWA +04DA; C; 04DB; # CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS +04DC; C; 04DD; # CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS +04DE; C; 04DF; # CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS +04E0; C; 04E1; # CYRILLIC CAPITAL LETTER ABKHASIAN DZE +04E2; C; 04E3; # CYRILLIC CAPITAL LETTER I WITH MACRON +04E4; C; 04E5; # CYRILLIC CAPITAL LETTER I WITH DIAERESIS +04E6; C; 04E7; # CYRILLIC CAPITAL LETTER O WITH DIAERESIS +04E8; C; 04E9; # CYRILLIC CAPITAL LETTER BARRED O +04EA; C; 04EB; # CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS +04EC; C; 04ED; # CYRILLIC CAPITAL LETTER E WITH DIAERESIS +04EE; C; 04EF; # CYRILLIC CAPITAL LETTER U WITH MACRON +04F0; C; 04F1; # CYRILLIC CAPITAL LETTER U WITH DIAERESIS +04F2; C; 04F3; # CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE +04F4; C; 04F5; # CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS +04F6; C; 04F7; # CYRILLIC CAPITAL LETTER GHE WITH DESCENDER +04F8; C; 04F9; # CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS +04FA; C; 04FB; # CYRILLIC CAPITAL LETTER GHE WITH STROKE AND HOOK +04FC; C; 04FD; # CYRILLIC CAPITAL LETTER HA WITH HOOK +04FE; C; 04FF; # CYRILLIC CAPITAL LETTER HA WITH STROKE +0500; C; 0501; # CYRILLIC CAPITAL LETTER KOMI DE +0502; C; 0503; # CYRILLIC CAPITAL LETTER KOMI DJE +0504; C; 0505; # CYRILLIC CAPITAL LETTER KOMI ZJE +0506; C; 0507; # CYRILLIC CAPITAL LETTER KOMI DZJE +0508; C; 0509; # CYRILLIC CAPITAL LETTER KOMI LJE +050A; C; 050B; # CYRILLIC CAPITAL LETTER KOMI NJE +050C; C; 050D; # CYRILLIC CAPITAL LETTER KOMI SJE +050E; C; 050F; # CYRILLIC CAPITAL LETTER KOMI TJE +0510; C; 0511; # CYRILLIC CAPITAL LETTER REVERSED ZE +0512; C; 0513; # CYRILLIC CAPITAL LETTER EL WITH HOOK +0514; C; 0515; # CYRILLIC CAPITAL LETTER LHA +0516; C; 0517; # CYRILLIC CAPITAL LETTER RHA +0518; C; 0519; # CYRILLIC CAPITAL LETTER YAE +051A; C; 051B; # CYRILLIC CAPITAL LETTER QA +051C; C; 051D; # CYRILLIC CAPITAL LETTER WE +051E; C; 051F; # CYRILLIC CAPITAL LETTER ALEUT KA +0520; C; 0521; # CYRILLIC CAPITAL LETTER EL WITH MIDDLE HOOK +0522; C; 0523; # CYRILLIC CAPITAL LETTER EN WITH MIDDLE HOOK +0524; C; 0525; # CYRILLIC CAPITAL LETTER PE WITH DESCENDER +0526; C; 0527; # CYRILLIC CAPITAL LETTER SHHA WITH DESCENDER +0528; C; 0529; # CYRILLIC CAPITAL LETTER EN WITH LEFT HOOK +052A; C; 052B; # CYRILLIC CAPITAL LETTER DZZHE +052C; C; 052D; # CYRILLIC CAPITAL LETTER DCHE +052E; C; 052F; # CYRILLIC CAPITAL LETTER EL WITH DESCENDER +0531; C; 0561; # ARMENIAN CAPITAL LETTER AYB +0532; C; 0562; # ARMENIAN CAPITAL LETTER BEN +0533; C; 0563; # ARMENIAN CAPITAL LETTER GIM +0534; C; 0564; # ARMENIAN CAPITAL LETTER DA +0535; C; 0565; # ARMENIAN CAPITAL LETTER ECH +0536; C; 0566; # ARMENIAN CAPITAL LETTER ZA +0537; C; 0567; # ARMENIAN CAPITAL LETTER EH +0538; C; 0568; # ARMENIAN CAPITAL LETTER ET +0539; C; 0569; # ARMENIAN CAPITAL LETTER TO +053A; C; 056A; # ARMENIAN CAPITAL LETTER ZHE +053B; C; 056B; # ARMENIAN CAPITAL LETTER INI +053C; C; 056C; # ARMENIAN CAPITAL LETTER LIWN +053D; C; 056D; # ARMENIAN CAPITAL LETTER XEH +053E; C; 056E; # ARMENIAN CAPITAL LETTER CA +053F; C; 056F; # ARMENIAN CAPITAL LETTER KEN +0540; C; 0570; # ARMENIAN CAPITAL LETTER HO +0541; C; 0571; # ARMENIAN CAPITAL LETTER JA +0542; C; 0572; # ARMENIAN CAPITAL LETTER GHAD +0543; C; 0573; # ARMENIAN CAPITAL LETTER CHEH +0544; C; 0574; # ARMENIAN CAPITAL LETTER MEN +0545; C; 0575; # ARMENIAN CAPITAL LETTER YI +0546; C; 0576; # ARMENIAN CAPITAL LETTER NOW +0547; C; 0577; # ARMENIAN CAPITAL LETTER SHA +0548; C; 0578; # ARMENIAN CAPITAL LETTER VO +0549; C; 0579; # ARMENIAN CAPITAL LETTER CHA +054A; C; 057A; # ARMENIAN CAPITAL LETTER PEH +054B; C; 057B; # ARMENIAN CAPITAL LETTER JHEH +054C; C; 057C; # ARMENIAN CAPITAL LETTER RA +054D; C; 057D; # ARMENIAN CAPITAL LETTER SEH +054E; C; 057E; # ARMENIAN CAPITAL LETTER VEW +054F; C; 057F; # ARMENIAN CAPITAL LETTER TIWN +0550; C; 0580; # ARMENIAN CAPITAL LETTER REH +0551; C; 0581; # ARMENIAN CAPITAL LETTER CO +0552; C; 0582; # ARMENIAN CAPITAL LETTER YIWN +0553; C; 0583; # ARMENIAN CAPITAL LETTER PIWR +0554; C; 0584; # ARMENIAN CAPITAL LETTER KEH +0555; C; 0585; # ARMENIAN CAPITAL LETTER OH +0556; C; 0586; # ARMENIAN CAPITAL LETTER FEH +0587; F; 0565 0582; # ARMENIAN SMALL LIGATURE ECH YIWN +10A0; C; 2D00; # GEORGIAN CAPITAL LETTER AN +10A1; C; 2D01; # GEORGIAN CAPITAL LETTER BAN +10A2; C; 2D02; # GEORGIAN CAPITAL LETTER GAN +10A3; C; 2D03; # GEORGIAN CAPITAL LETTER DON +10A4; C; 2D04; # GEORGIAN CAPITAL LETTER EN +10A5; C; 2D05; # GEORGIAN CAPITAL LETTER VIN +10A6; C; 2D06; # GEORGIAN CAPITAL LETTER ZEN +10A7; C; 2D07; # GEORGIAN CAPITAL LETTER TAN +10A8; C; 2D08; # GEORGIAN CAPITAL LETTER IN +10A9; C; 2D09; # GEORGIAN CAPITAL LETTER KAN +10AA; C; 2D0A; # GEORGIAN CAPITAL LETTER LAS +10AB; C; 2D0B; # GEORGIAN CAPITAL LETTER MAN +10AC; C; 2D0C; # GEORGIAN CAPITAL LETTER NAR +10AD; C; 2D0D; # GEORGIAN CAPITAL LETTER ON +10AE; C; 2D0E; # GEORGIAN CAPITAL LETTER PAR +10AF; C; 2D0F; # GEORGIAN CAPITAL LETTER ZHAR +10B0; C; 2D10; # GEORGIAN CAPITAL LETTER RAE +10B1; C; 2D11; # GEORGIAN CAPITAL LETTER SAN +10B2; C; 2D12; # GEORGIAN CAPITAL LETTER TAR +10B3; C; 2D13; # GEORGIAN CAPITAL LETTER UN +10B4; C; 2D14; # GEORGIAN CAPITAL LETTER PHAR +10B5; C; 2D15; # GEORGIAN CAPITAL LETTER KHAR +10B6; C; 2D16; # GEORGIAN CAPITAL LETTER GHAN +10B7; C; 2D17; # GEORGIAN CAPITAL LETTER QAR +10B8; C; 2D18; # GEORGIAN CAPITAL LETTER SHIN +10B9; C; 2D19; # GEORGIAN CAPITAL LETTER CHIN +10BA; C; 2D1A; # GEORGIAN CAPITAL LETTER CAN +10BB; C; 2D1B; # GEORGIAN CAPITAL LETTER JIL +10BC; C; 2D1C; # GEORGIAN CAPITAL LETTER CIL +10BD; C; 2D1D; # GEORGIAN CAPITAL LETTER CHAR +10BE; C; 2D1E; # GEORGIAN CAPITAL LETTER XAN +10BF; C; 2D1F; # GEORGIAN CAPITAL LETTER JHAN +10C0; C; 2D20; # GEORGIAN CAPITAL LETTER HAE +10C1; C; 2D21; # GEORGIAN CAPITAL LETTER HE +10C2; C; 2D22; # GEORGIAN CAPITAL LETTER HIE +10C3; C; 2D23; # GEORGIAN CAPITAL LETTER WE +10C4; C; 2D24; # GEORGIAN CAPITAL LETTER HAR +10C5; C; 2D25; # GEORGIAN CAPITAL LETTER HOE +10C7; C; 2D27; # GEORGIAN CAPITAL LETTER YN +10CD; C; 2D2D; # GEORGIAN CAPITAL LETTER AEN +13F8; C; 13F0; # CHEROKEE SMALL LETTER YE +13F9; C; 13F1; # CHEROKEE SMALL LETTER YI +13FA; C; 13F2; # CHEROKEE SMALL LETTER YO +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 +1C90; C; 10D0; # GEORGIAN MTAVRULI CAPITAL LETTER AN +1C91; C; 10D1; # GEORGIAN MTAVRULI CAPITAL LETTER BAN +1C92; C; 10D2; # GEORGIAN MTAVRULI CAPITAL LETTER GAN +1C93; C; 10D3; # GEORGIAN MTAVRULI CAPITAL LETTER DON +1C94; C; 10D4; # GEORGIAN MTAVRULI CAPITAL LETTER EN +1C95; C; 10D5; # GEORGIAN MTAVRULI CAPITAL LETTER VIN +1C96; C; 10D6; # GEORGIAN MTAVRULI CAPITAL LETTER ZEN +1C97; C; 10D7; # GEORGIAN MTAVRULI CAPITAL LETTER TAN +1C98; C; 10D8; # GEORGIAN MTAVRULI CAPITAL LETTER IN +1C99; C; 10D9; # GEORGIAN MTAVRULI CAPITAL LETTER KAN +1C9A; C; 10DA; # GEORGIAN MTAVRULI CAPITAL LETTER LAS +1C9B; C; 10DB; # GEORGIAN MTAVRULI CAPITAL LETTER MAN +1C9C; C; 10DC; # GEORGIAN MTAVRULI CAPITAL LETTER NAR +1C9D; C; 10DD; # GEORGIAN MTAVRULI CAPITAL LETTER ON +1C9E; C; 10DE; # GEORGIAN MTAVRULI CAPITAL LETTER PAR +1C9F; C; 10DF; # GEORGIAN MTAVRULI CAPITAL LETTER ZHAR +1CA0; C; 10E0; # GEORGIAN MTAVRULI CAPITAL LETTER RAE +1CA1; C; 10E1; # GEORGIAN MTAVRULI CAPITAL LETTER SAN +1CA2; C; 10E2; # GEORGIAN MTAVRULI CAPITAL LETTER TAR +1CA3; C; 10E3; # GEORGIAN MTAVRULI CAPITAL LETTER UN +1CA4; C; 10E4; # GEORGIAN MTAVRULI CAPITAL LETTER PHAR +1CA5; C; 10E5; # GEORGIAN MTAVRULI CAPITAL LETTER KHAR +1CA6; C; 10E6; # GEORGIAN MTAVRULI CAPITAL LETTER GHAN +1CA7; C; 10E7; # GEORGIAN MTAVRULI CAPITAL LETTER QAR +1CA8; C; 10E8; # GEORGIAN MTAVRULI CAPITAL LETTER SHIN +1CA9; C; 10E9; # GEORGIAN MTAVRULI CAPITAL LETTER CHIN +1CAA; C; 10EA; # GEORGIAN MTAVRULI CAPITAL LETTER CAN +1CAB; C; 10EB; # GEORGIAN MTAVRULI CAPITAL LETTER JIL +1CAC; C; 10EC; # GEORGIAN MTAVRULI CAPITAL LETTER CIL +1CAD; C; 10ED; # GEORGIAN MTAVRULI CAPITAL LETTER CHAR +1CAE; C; 10EE; # GEORGIAN MTAVRULI CAPITAL LETTER XAN +1CAF; C; 10EF; # GEORGIAN MTAVRULI CAPITAL LETTER JHAN +1CB0; C; 10F0; # GEORGIAN MTAVRULI CAPITAL LETTER HAE +1CB1; C; 10F1; # GEORGIAN MTAVRULI CAPITAL LETTER HE +1CB2; C; 10F2; # GEORGIAN MTAVRULI CAPITAL LETTER HIE +1CB3; C; 10F3; # GEORGIAN MTAVRULI CAPITAL LETTER WE +1CB4; C; 10F4; # GEORGIAN MTAVRULI CAPITAL LETTER HAR +1CB5; C; 10F5; # GEORGIAN MTAVRULI CAPITAL LETTER HOE +1CB6; C; 10F6; # GEORGIAN MTAVRULI CAPITAL LETTER FI +1CB7; C; 10F7; # GEORGIAN MTAVRULI CAPITAL LETTER YN +1CB8; C; 10F8; # GEORGIAN MTAVRULI CAPITAL LETTER ELIFI +1CB9; C; 10F9; # GEORGIAN MTAVRULI CAPITAL LETTER TURNED GAN +1CBA; C; 10FA; # GEORGIAN MTAVRULI CAPITAL LETTER AIN +1CBD; C; 10FD; # GEORGIAN MTAVRULI CAPITAL LETTER AEN +1CBE; C; 10FE; # GEORGIAN MTAVRULI CAPITAL LETTER HARD SIGN +1CBF; C; 10FF; # GEORGIAN MTAVRULI CAPITAL LETTER LABIAL SIGN +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 +1E06; C; 1E07; # LATIN CAPITAL LETTER B WITH LINE BELOW +1E08; C; 1E09; # LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE +1E0A; C; 1E0B; # LATIN CAPITAL LETTER D WITH DOT ABOVE +1E0C; C; 1E0D; # LATIN CAPITAL LETTER D WITH DOT BELOW +1E0E; C; 1E0F; # LATIN CAPITAL LETTER D WITH LINE BELOW +1E10; C; 1E11; # LATIN CAPITAL LETTER D WITH CEDILLA +1E12; C; 1E13; # LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW +1E14; C; 1E15; # LATIN CAPITAL LETTER E WITH MACRON AND GRAVE +1E16; C; 1E17; # LATIN CAPITAL LETTER E WITH MACRON AND ACUTE +1E18; C; 1E19; # LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW +1E1A; C; 1E1B; # LATIN CAPITAL LETTER E WITH TILDE BELOW +1E1C; C; 1E1D; # LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE +1E1E; C; 1E1F; # LATIN CAPITAL LETTER F WITH DOT ABOVE +1E20; C; 1E21; # LATIN CAPITAL LETTER G WITH MACRON +1E22; C; 1E23; # LATIN CAPITAL LETTER H WITH DOT ABOVE +1E24; C; 1E25; # LATIN CAPITAL LETTER H WITH DOT BELOW +1E26; C; 1E27; # LATIN CAPITAL LETTER H WITH DIAERESIS +1E28; C; 1E29; # LATIN CAPITAL LETTER H WITH CEDILLA +1E2A; C; 1E2B; # LATIN CAPITAL LETTER H WITH BREVE BELOW +1E2C; C; 1E2D; # LATIN CAPITAL LETTER I WITH TILDE BELOW +1E2E; C; 1E2F; # LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE +1E30; C; 1E31; # LATIN CAPITAL LETTER K WITH ACUTE +1E32; C; 1E33; # LATIN CAPITAL LETTER K WITH DOT BELOW +1E34; C; 1E35; # LATIN CAPITAL LETTER K WITH LINE BELOW +1E36; C; 1E37; # LATIN CAPITAL LETTER L WITH DOT BELOW +1E38; C; 1E39; # LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON +1E3A; C; 1E3B; # LATIN CAPITAL LETTER L WITH LINE BELOW +1E3C; C; 1E3D; # LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW +1E3E; C; 1E3F; # LATIN CAPITAL LETTER M WITH ACUTE +1E40; C; 1E41; # LATIN CAPITAL LETTER M WITH DOT ABOVE +1E42; C; 1E43; # LATIN CAPITAL LETTER M WITH DOT BELOW +1E44; C; 1E45; # LATIN CAPITAL LETTER N WITH DOT ABOVE +1E46; C; 1E47; # LATIN CAPITAL LETTER N WITH DOT BELOW +1E48; C; 1E49; # LATIN CAPITAL LETTER N WITH LINE BELOW +1E4A; C; 1E4B; # LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW +1E4C; C; 1E4D; # LATIN CAPITAL LETTER O WITH TILDE AND ACUTE +1E4E; C; 1E4F; # LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS +1E50; C; 1E51; # LATIN CAPITAL LETTER O WITH MACRON AND GRAVE +1E52; C; 1E53; # LATIN CAPITAL LETTER O WITH MACRON AND ACUTE +1E54; C; 1E55; # LATIN CAPITAL LETTER P WITH ACUTE +1E56; C; 1E57; # LATIN CAPITAL LETTER P WITH DOT ABOVE +1E58; C; 1E59; # LATIN CAPITAL LETTER R WITH DOT ABOVE +1E5A; C; 1E5B; # LATIN CAPITAL LETTER R WITH DOT BELOW +1E5C; C; 1E5D; # LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON +1E5E; C; 1E5F; # LATIN CAPITAL LETTER R WITH LINE BELOW +1E60; C; 1E61; # LATIN CAPITAL LETTER S WITH DOT ABOVE +1E62; C; 1E63; # LATIN CAPITAL LETTER S WITH DOT BELOW +1E64; C; 1E65; # LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE +1E66; C; 1E67; # LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE +1E68; C; 1E69; # LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE +1E6A; C; 1E6B; # LATIN CAPITAL LETTER T WITH DOT ABOVE +1E6C; C; 1E6D; # LATIN CAPITAL LETTER T WITH DOT BELOW +1E6E; C; 1E6F; # LATIN CAPITAL LETTER T WITH LINE BELOW +1E70; C; 1E71; # LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW +1E72; C; 1E73; # LATIN CAPITAL LETTER U WITH DIAERESIS BELOW +1E74; C; 1E75; # LATIN CAPITAL LETTER U WITH TILDE BELOW +1E76; C; 1E77; # LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW +1E78; C; 1E79; # LATIN CAPITAL LETTER U WITH TILDE AND ACUTE +1E7A; C; 1E7B; # LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS +1E7C; C; 1E7D; # LATIN CAPITAL LETTER V WITH TILDE +1E7E; C; 1E7F; # LATIN CAPITAL LETTER V WITH DOT BELOW +1E80; C; 1E81; # LATIN CAPITAL LETTER W WITH GRAVE +1E82; C; 1E83; # LATIN CAPITAL LETTER W WITH ACUTE +1E84; C; 1E85; # LATIN CAPITAL LETTER W WITH DIAERESIS +1E86; C; 1E87; # LATIN CAPITAL LETTER W WITH DOT ABOVE +1E88; C; 1E89; # LATIN CAPITAL LETTER W WITH DOT BELOW +1E8A; C; 1E8B; # LATIN CAPITAL LETTER X WITH DOT ABOVE +1E8C; C; 1E8D; # LATIN CAPITAL LETTER X WITH DIAERESIS +1E8E; C; 1E8F; # LATIN CAPITAL LETTER Y WITH DOT ABOVE +1E90; C; 1E91; # LATIN CAPITAL LETTER Z WITH CIRCUMFLEX +1E92; C; 1E93; # LATIN CAPITAL LETTER Z WITH DOT BELOW +1E94; C; 1E95; # LATIN CAPITAL LETTER Z WITH LINE BELOW +1E96; F; 0068 0331; # LATIN SMALL LETTER H WITH LINE BELOW +1E97; F; 0074 0308; # LATIN SMALL LETTER T WITH DIAERESIS +1E98; F; 0077 030A; # LATIN SMALL LETTER W WITH RING ABOVE +1E99; F; 0079 030A; # LATIN SMALL LETTER Y WITH RING ABOVE +1E9A; F; 0061 02BE; # LATIN SMALL LETTER A WITH RIGHT HALF RING +1E9B; C; 1E61; # LATIN SMALL LETTER LONG S WITH DOT ABOVE +1E9E; F; 0073 0073; # LATIN CAPITAL LETTER SHARP S +1E9E; S; 00DF; # LATIN CAPITAL LETTER SHARP S +1EA0; C; 1EA1; # LATIN CAPITAL LETTER A WITH DOT BELOW +1EA2; C; 1EA3; # LATIN CAPITAL LETTER A WITH HOOK ABOVE +1EA4; C; 1EA5; # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE +1EA6; C; 1EA7; # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE +1EA8; C; 1EA9; # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE +1EAA; C; 1EAB; # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE +1EAC; C; 1EAD; # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW +1EAE; C; 1EAF; # LATIN CAPITAL LETTER A WITH BREVE AND ACUTE +1EB0; C; 1EB1; # LATIN CAPITAL LETTER A WITH BREVE AND GRAVE +1EB2; C; 1EB3; # LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE +1EB4; C; 1EB5; # LATIN CAPITAL LETTER A WITH BREVE AND TILDE +1EB6; C; 1EB7; # LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW +1EB8; C; 1EB9; # LATIN CAPITAL LETTER E WITH DOT BELOW +1EBA; C; 1EBB; # LATIN CAPITAL LETTER E WITH HOOK ABOVE +1EBC; C; 1EBD; # LATIN CAPITAL LETTER E WITH TILDE +1EBE; C; 1EBF; # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE +1EC0; C; 1EC1; # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE +1EC2; C; 1EC3; # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE +1EC4; C; 1EC5; # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE +1EC6; C; 1EC7; # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW +1EC8; C; 1EC9; # LATIN CAPITAL LETTER I WITH HOOK ABOVE +1ECA; C; 1ECB; # LATIN CAPITAL LETTER I WITH DOT BELOW +1ECC; C; 1ECD; # LATIN CAPITAL LETTER O WITH DOT BELOW +1ECE; C; 1ECF; # LATIN CAPITAL LETTER O WITH HOOK ABOVE +1ED0; C; 1ED1; # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE +1ED2; C; 1ED3; # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE +1ED4; C; 1ED5; # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE +1ED6; C; 1ED7; # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE +1ED8; C; 1ED9; # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW +1EDA; C; 1EDB; # LATIN CAPITAL LETTER O WITH HORN AND ACUTE +1EDC; C; 1EDD; # LATIN CAPITAL LETTER O WITH HORN AND GRAVE +1EDE; C; 1EDF; # LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE +1EE0; C; 1EE1; # LATIN CAPITAL LETTER O WITH HORN AND TILDE +1EE2; C; 1EE3; # LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW +1EE4; C; 1EE5; # LATIN CAPITAL LETTER U WITH DOT BELOW +1EE6; C; 1EE7; # LATIN CAPITAL LETTER U WITH HOOK ABOVE +1EE8; C; 1EE9; # LATIN CAPITAL LETTER U WITH HORN AND ACUTE +1EEA; C; 1EEB; # LATIN CAPITAL LETTER U WITH HORN AND GRAVE +1EEC; C; 1EED; # LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE +1EEE; C; 1EEF; # LATIN CAPITAL LETTER U WITH HORN AND TILDE +1EF0; C; 1EF1; # LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW +1EF2; C; 1EF3; # LATIN CAPITAL LETTER Y WITH GRAVE +1EF4; C; 1EF5; # LATIN CAPITAL LETTER Y WITH DOT BELOW +1EF6; C; 1EF7; # LATIN CAPITAL LETTER Y WITH HOOK ABOVE +1EF8; C; 1EF9; # LATIN CAPITAL LETTER Y WITH TILDE +1EFA; C; 1EFB; # LATIN CAPITAL LETTER MIDDLE-WELSH LL +1EFC; C; 1EFD; # LATIN CAPITAL LETTER MIDDLE-WELSH V +1EFE; C; 1EFF; # LATIN CAPITAL LETTER Y WITH LOOP +1F08; C; 1F00; # GREEK CAPITAL LETTER ALPHA WITH PSILI +1F09; C; 1F01; # GREEK CAPITAL LETTER ALPHA WITH DASIA +1F0A; C; 1F02; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA +1F0B; C; 1F03; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA +1F0C; C; 1F04; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA +1F0D; C; 1F05; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA +1F0E; C; 1F06; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI +1F0F; C; 1F07; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI +1F18; C; 1F10; # GREEK CAPITAL LETTER EPSILON WITH PSILI +1F19; C; 1F11; # GREEK CAPITAL LETTER EPSILON WITH DASIA +1F1A; C; 1F12; # GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA +1F1B; C; 1F13; # GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA +1F1C; C; 1F14; # GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA +1F1D; C; 1F15; # GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA +1F28; C; 1F20; # GREEK CAPITAL LETTER ETA WITH PSILI +1F29; C; 1F21; # GREEK CAPITAL LETTER ETA WITH DASIA +1F2A; C; 1F22; # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA +1F2B; C; 1F23; # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA +1F2C; C; 1F24; # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA +1F2D; C; 1F25; # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA +1F2E; C; 1F26; # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI +1F2F; C; 1F27; # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI +1F38; C; 1F30; # GREEK CAPITAL LETTER IOTA WITH PSILI +1F39; C; 1F31; # GREEK CAPITAL LETTER IOTA WITH DASIA +1F3A; C; 1F32; # GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA +1F3B; C; 1F33; # GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA +1F3C; C; 1F34; # GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA +1F3D; C; 1F35; # GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA +1F3E; C; 1F36; # GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI +1F3F; C; 1F37; # GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI +1F48; C; 1F40; # GREEK CAPITAL LETTER OMICRON WITH PSILI +1F49; C; 1F41; # GREEK CAPITAL LETTER OMICRON WITH DASIA +1F4A; C; 1F42; # GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA +1F4B; C; 1F43; # GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA +1F4C; C; 1F44; # GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA +1F4D; C; 1F45; # GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA +1F50; F; 03C5 0313; # GREEK SMALL LETTER UPSILON WITH PSILI +1F52; F; 03C5 0313 0300; # GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA +1F54; F; 03C5 0313 0301; # GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA +1F56; F; 03C5 0313 0342; # GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI +1F59; C; 1F51; # GREEK CAPITAL LETTER UPSILON WITH DASIA +1F5B; C; 1F53; # GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA +1F5D; C; 1F55; # GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA +1F5F; C; 1F57; # GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI +1F68; C; 1F60; # GREEK CAPITAL LETTER OMEGA WITH PSILI +1F69; C; 1F61; # GREEK CAPITAL LETTER OMEGA WITH DASIA +1F6A; C; 1F62; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA +1F6B; C; 1F63; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA +1F6C; C; 1F64; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA +1F6D; C; 1F65; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA +1F6E; C; 1F66; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI +1F6F; C; 1F67; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI +1F80; F; 1F00 03B9; # GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI +1F81; F; 1F01 03B9; # GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI +1F82; F; 1F02 03B9; # GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI +1F83; F; 1F03 03B9; # GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI +1F84; F; 1F04 03B9; # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI +1F85; F; 1F05 03B9; # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI +1F86; F; 1F06 03B9; # GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI +1F87; F; 1F07 03B9; # GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI +1F88; F; 1F00 03B9; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI +1F88; S; 1F80; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI +1F89; F; 1F01 03B9; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI +1F89; S; 1F81; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI +1F8A; F; 1F02 03B9; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI +1F8A; S; 1F82; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI +1F8B; F; 1F03 03B9; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI +1F8B; S; 1F83; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI +1F8C; F; 1F04 03B9; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI +1F8C; S; 1F84; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI +1F8D; F; 1F05 03B9; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI +1F8D; S; 1F85; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI +1F8E; F; 1F06 03B9; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI +1F8E; S; 1F86; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI +1F8F; F; 1F07 03B9; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI +1F8F; S; 1F87; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI +1F90; F; 1F20 03B9; # GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI +1F91; F; 1F21 03B9; # GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI +1F92; F; 1F22 03B9; # GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI +1F93; F; 1F23 03B9; # GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI +1F94; F; 1F24 03B9; # GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI +1F95; F; 1F25 03B9; # GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI +1F96; F; 1F26 03B9; # GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI +1F97; F; 1F27 03B9; # GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI +1F98; F; 1F20 03B9; # GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI +1F98; S; 1F90; # GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI +1F99; F; 1F21 03B9; # GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI +1F99; S; 1F91; # GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI +1F9A; F; 1F22 03B9; # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI +1F9A; S; 1F92; # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI +1F9B; F; 1F23 03B9; # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI +1F9B; S; 1F93; # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI +1F9C; F; 1F24 03B9; # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI +1F9C; S; 1F94; # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI +1F9D; F; 1F25 03B9; # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI +1F9D; S; 1F95; # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI +1F9E; F; 1F26 03B9; # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI +1F9E; S; 1F96; # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI +1F9F; F; 1F27 03B9; # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI +1F9F; S; 1F97; # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI +1FA0; F; 1F60 03B9; # GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI +1FA1; F; 1F61 03B9; # GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI +1FA2; F; 1F62 03B9; # GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI +1FA3; F; 1F63 03B9; # GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI +1FA4; F; 1F64 03B9; # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI +1FA5; F; 1F65 03B9; # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI +1FA6; F; 1F66 03B9; # GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI +1FA7; F; 1F67 03B9; # GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI +1FA8; F; 1F60 03B9; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI +1FA8; S; 1FA0; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI +1FA9; F; 1F61 03B9; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI +1FA9; S; 1FA1; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI +1FAA; F; 1F62 03B9; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI +1FAA; S; 1FA2; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI +1FAB; F; 1F63 03B9; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI +1FAB; S; 1FA3; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI +1FAC; F; 1F64 03B9; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI +1FAC; S; 1FA4; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI +1FAD; F; 1F65 03B9; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI +1FAD; S; 1FA5; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI +1FAE; F; 1F66 03B9; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI +1FAE; S; 1FA6; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI +1FAF; F; 1F67 03B9; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI +1FAF; S; 1FA7; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI +1FB2; F; 1F70 03B9; # GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI +1FB3; F; 03B1 03B9; # GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI +1FB4; F; 03AC 03B9; # GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI +1FB6; F; 03B1 0342; # GREEK SMALL LETTER ALPHA WITH PERISPOMENI +1FB7; F; 03B1 0342 03B9; # GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI +1FB8; C; 1FB0; # GREEK CAPITAL LETTER ALPHA WITH VRACHY +1FB9; C; 1FB1; # GREEK CAPITAL LETTER ALPHA WITH MACRON +1FBA; C; 1F70; # GREEK CAPITAL LETTER ALPHA WITH VARIA +1FBB; C; 1F71; # GREEK CAPITAL LETTER ALPHA WITH OXIA +1FBC; F; 03B1 03B9; # GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI +1FBC; S; 1FB3; # GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI +1FBE; C; 03B9; # GREEK PROSGEGRAMMENI +1FC2; F; 1F74 03B9; # GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI +1FC3; F; 03B7 03B9; # GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI +1FC4; F; 03AE 03B9; # GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI +1FC6; F; 03B7 0342; # GREEK SMALL LETTER ETA WITH PERISPOMENI +1FC7; F; 03B7 0342 03B9; # GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI +1FC8; C; 1F72; # GREEK CAPITAL LETTER EPSILON WITH VARIA +1FC9; C; 1F73; # GREEK CAPITAL LETTER EPSILON WITH OXIA +1FCA; C; 1F74; # GREEK CAPITAL LETTER ETA WITH VARIA +1FCB; C; 1F75; # GREEK CAPITAL LETTER ETA WITH OXIA +1FCC; F; 03B7 03B9; # GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI +1FCC; S; 1FC3; # GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI +1FD2; F; 03B9 0308 0300; # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA +1FD3; F; 03B9 0308 0301; # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA +1FD6; F; 03B9 0342; # GREEK SMALL LETTER IOTA WITH PERISPOMENI +1FD7; F; 03B9 0308 0342; # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI +1FD8; C; 1FD0; # GREEK CAPITAL LETTER IOTA WITH VRACHY +1FD9; C; 1FD1; # GREEK CAPITAL LETTER IOTA WITH MACRON +1FDA; C; 1F76; # GREEK CAPITAL LETTER IOTA WITH VARIA +1FDB; C; 1F77; # GREEK CAPITAL LETTER IOTA WITH OXIA +1FE2; F; 03C5 0308 0300; # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA +1FE3; F; 03C5 0308 0301; # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA +1FE4; F; 03C1 0313; # GREEK SMALL LETTER RHO WITH PSILI +1FE6; F; 03C5 0342; # GREEK SMALL LETTER UPSILON WITH PERISPOMENI +1FE7; F; 03C5 0308 0342; # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI +1FE8; C; 1FE0; # GREEK CAPITAL LETTER UPSILON WITH VRACHY +1FE9; C; 1FE1; # GREEK CAPITAL LETTER UPSILON WITH MACRON +1FEA; C; 1F7A; # GREEK CAPITAL LETTER UPSILON WITH VARIA +1FEB; C; 1F7B; # GREEK CAPITAL LETTER UPSILON WITH OXIA +1FEC; C; 1FE5; # GREEK CAPITAL LETTER RHO WITH DASIA +1FF2; F; 1F7C 03B9; # GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI +1FF3; F; 03C9 03B9; # GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI +1FF4; F; 03CE 03B9; # GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI +1FF6; F; 03C9 0342; # GREEK SMALL LETTER OMEGA WITH PERISPOMENI +1FF7; F; 03C9 0342 03B9; # GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI +1FF8; C; 1F78; # GREEK CAPITAL LETTER OMICRON WITH VARIA +1FF9; C; 1F79; # GREEK CAPITAL LETTER OMICRON WITH OXIA +1FFA; C; 1F7C; # GREEK CAPITAL LETTER OMEGA WITH VARIA +1FFB; C; 1F7D; # GREEK CAPITAL LETTER OMEGA WITH OXIA +1FFC; F; 03C9 03B9; # GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI +1FFC; S; 1FF3; # GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI +2126; C; 03C9; # OHM SIGN +212A; C; 006B; # KELVIN SIGN +212B; C; 00E5; # ANGSTROM SIGN +2132; C; 214E; # TURNED CAPITAL F +2160; C; 2170; # ROMAN NUMERAL ONE +2161; C; 2171; # ROMAN NUMERAL TWO +2162; C; 2172; # ROMAN NUMERAL THREE +2163; C; 2173; # ROMAN NUMERAL FOUR +2164; C; 2174; # ROMAN NUMERAL FIVE +2165; C; 2175; # ROMAN NUMERAL SIX +2166; C; 2176; # ROMAN NUMERAL SEVEN +2167; C; 2177; # ROMAN NUMERAL EIGHT +2168; C; 2178; # ROMAN NUMERAL NINE +2169; C; 2179; # ROMAN NUMERAL TEN +216A; C; 217A; # ROMAN NUMERAL ELEVEN +216B; C; 217B; # ROMAN NUMERAL TWELVE +216C; C; 217C; # ROMAN NUMERAL FIFTY +216D; C; 217D; # ROMAN NUMERAL ONE HUNDRED +216E; C; 217E; # ROMAN NUMERAL FIVE HUNDRED +216F; C; 217F; # ROMAN NUMERAL ONE THOUSAND +2183; C; 2184; # ROMAN NUMERAL REVERSED ONE HUNDRED +24B6; C; 24D0; # CIRCLED LATIN CAPITAL LETTER A +24B7; C; 24D1; # CIRCLED LATIN CAPITAL LETTER B +24B8; C; 24D2; # CIRCLED LATIN CAPITAL LETTER C +24B9; C; 24D3; # CIRCLED LATIN CAPITAL LETTER D +24BA; C; 24D4; # CIRCLED LATIN CAPITAL LETTER E +24BB; C; 24D5; # CIRCLED LATIN CAPITAL LETTER F +24BC; C; 24D6; # CIRCLED LATIN CAPITAL LETTER G +24BD; C; 24D7; # CIRCLED LATIN CAPITAL LETTER H +24BE; C; 24D8; # CIRCLED LATIN CAPITAL LETTER I +24BF; C; 24D9; # CIRCLED LATIN CAPITAL LETTER J +24C0; C; 24DA; # CIRCLED LATIN CAPITAL LETTER K +24C1; C; 24DB; # CIRCLED LATIN CAPITAL LETTER L +24C2; C; 24DC; # CIRCLED LATIN CAPITAL LETTER M +24C3; C; 24DD; # CIRCLED LATIN CAPITAL LETTER N +24C4; C; 24DE; # CIRCLED LATIN CAPITAL LETTER O +24C5; C; 24DF; # CIRCLED LATIN CAPITAL LETTER P +24C6; C; 24E0; # CIRCLED LATIN CAPITAL LETTER Q +24C7; C; 24E1; # CIRCLED LATIN CAPITAL LETTER R +24C8; C; 24E2; # CIRCLED LATIN CAPITAL LETTER S +24C9; C; 24E3; # CIRCLED LATIN CAPITAL LETTER T +24CA; C; 24E4; # CIRCLED LATIN CAPITAL LETTER U +24CB; C; 24E5; # CIRCLED LATIN CAPITAL LETTER V +24CC; C; 24E6; # CIRCLED LATIN CAPITAL LETTER W +24CD; C; 24E7; # CIRCLED LATIN CAPITAL LETTER X +24CE; C; 24E8; # CIRCLED LATIN CAPITAL LETTER Y +24CF; C; 24E9; # CIRCLED LATIN CAPITAL LETTER Z +2C00; C; 2C30; # GLAGOLITIC CAPITAL LETTER AZU +2C01; C; 2C31; # GLAGOLITIC CAPITAL LETTER BUKY +2C02; C; 2C32; # GLAGOLITIC CAPITAL LETTER VEDE +2C03; C; 2C33; # GLAGOLITIC CAPITAL LETTER GLAGOLI +2C04; C; 2C34; # GLAGOLITIC CAPITAL LETTER DOBRO +2C05; C; 2C35; # GLAGOLITIC CAPITAL LETTER YESTU +2C06; C; 2C36; # GLAGOLITIC CAPITAL LETTER ZHIVETE +2C07; C; 2C37; # GLAGOLITIC CAPITAL LETTER DZELO +2C08; C; 2C38; # GLAGOLITIC CAPITAL LETTER ZEMLJA +2C09; C; 2C39; # GLAGOLITIC CAPITAL LETTER IZHE +2C0A; C; 2C3A; # GLAGOLITIC CAPITAL LETTER INITIAL IZHE +2C0B; C; 2C3B; # GLAGOLITIC CAPITAL LETTER I +2C0C; C; 2C3C; # GLAGOLITIC CAPITAL LETTER DJERVI +2C0D; C; 2C3D; # GLAGOLITIC CAPITAL LETTER KAKO +2C0E; C; 2C3E; # GLAGOLITIC CAPITAL LETTER LJUDIJE +2C0F; C; 2C3F; # GLAGOLITIC CAPITAL LETTER MYSLITE +2C10; C; 2C40; # GLAGOLITIC CAPITAL LETTER NASHI +2C11; C; 2C41; # GLAGOLITIC CAPITAL LETTER ONU +2C12; C; 2C42; # GLAGOLITIC CAPITAL LETTER POKOJI +2C13; C; 2C43; # GLAGOLITIC CAPITAL LETTER RITSI +2C14; C; 2C44; # GLAGOLITIC CAPITAL LETTER SLOVO +2C15; C; 2C45; # GLAGOLITIC CAPITAL LETTER TVRIDO +2C16; C; 2C46; # GLAGOLITIC CAPITAL LETTER UKU +2C17; C; 2C47; # GLAGOLITIC CAPITAL LETTER FRITU +2C18; C; 2C48; # GLAGOLITIC CAPITAL LETTER HERU +2C19; C; 2C49; # GLAGOLITIC CAPITAL LETTER OTU +2C1A; C; 2C4A; # GLAGOLITIC CAPITAL LETTER PE +2C1B; C; 2C4B; # GLAGOLITIC CAPITAL LETTER SHTA +2C1C; C; 2C4C; # GLAGOLITIC CAPITAL LETTER TSI +2C1D; C; 2C4D; # GLAGOLITIC CAPITAL LETTER CHRIVI +2C1E; C; 2C4E; # GLAGOLITIC CAPITAL LETTER SHA +2C1F; C; 2C4F; # GLAGOLITIC CAPITAL LETTER YERU +2C20; C; 2C50; # GLAGOLITIC CAPITAL LETTER YERI +2C21; C; 2C51; # GLAGOLITIC CAPITAL LETTER YATI +2C22; C; 2C52; # GLAGOLITIC CAPITAL LETTER SPIDERY HA +2C23; C; 2C53; # GLAGOLITIC CAPITAL LETTER YU +2C24; C; 2C54; # GLAGOLITIC CAPITAL LETTER SMALL YUS +2C25; C; 2C55; # GLAGOLITIC CAPITAL LETTER SMALL YUS WITH TAIL +2C26; C; 2C56; # GLAGOLITIC CAPITAL LETTER YO +2C27; C; 2C57; # GLAGOLITIC CAPITAL LETTER IOTATED SMALL YUS +2C28; C; 2C58; # GLAGOLITIC CAPITAL LETTER BIG YUS +2C29; C; 2C59; # GLAGOLITIC CAPITAL LETTER IOTATED BIG YUS +2C2A; C; 2C5A; # GLAGOLITIC CAPITAL LETTER FITA +2C2B; C; 2C5B; # GLAGOLITIC CAPITAL LETTER IZHITSA +2C2C; C; 2C5C; # GLAGOLITIC CAPITAL LETTER SHTAPIC +2C2D; C; 2C5D; # GLAGOLITIC CAPITAL LETTER TROKUTASTI A +2C2E; C; 2C5E; # GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE +2C60; C; 2C61; # LATIN CAPITAL LETTER L WITH DOUBLE BAR +2C62; C; 026B; # LATIN CAPITAL LETTER L WITH MIDDLE TILDE +2C63; C; 1D7D; # LATIN CAPITAL LETTER P WITH STROKE +2C64; C; 027D; # LATIN CAPITAL LETTER R WITH TAIL +2C67; C; 2C68; # LATIN CAPITAL LETTER H WITH DESCENDER +2C69; C; 2C6A; # LATIN CAPITAL LETTER K WITH DESCENDER +2C6B; C; 2C6C; # LATIN CAPITAL LETTER Z WITH DESCENDER +2C6D; C; 0251; # LATIN CAPITAL LETTER ALPHA +2C6E; C; 0271; # LATIN CAPITAL LETTER M WITH HOOK +2C6F; C; 0250; # LATIN CAPITAL LETTER TURNED A +2C70; C; 0252; # LATIN CAPITAL LETTER TURNED ALPHA +2C72; C; 2C73; # LATIN CAPITAL LETTER W WITH HOOK +2C75; C; 2C76; # LATIN CAPITAL LETTER HALF H +2C7E; C; 023F; # LATIN CAPITAL LETTER S WITH SWASH TAIL +2C7F; C; 0240; # LATIN CAPITAL LETTER Z WITH SWASH TAIL +2C80; C; 2C81; # COPTIC CAPITAL LETTER ALFA +2C82; C; 2C83; # COPTIC CAPITAL LETTER VIDA +2C84; C; 2C85; # COPTIC CAPITAL LETTER GAMMA +2C86; C; 2C87; # COPTIC CAPITAL LETTER DALDA +2C88; C; 2C89; # COPTIC CAPITAL LETTER EIE +2C8A; C; 2C8B; # COPTIC CAPITAL LETTER SOU +2C8C; C; 2C8D; # COPTIC CAPITAL LETTER ZATA +2C8E; C; 2C8F; # COPTIC CAPITAL LETTER HATE +2C90; C; 2C91; # COPTIC CAPITAL LETTER THETHE +2C92; C; 2C93; # COPTIC CAPITAL LETTER IAUDA +2C94; C; 2C95; # COPTIC CAPITAL LETTER KAPA +2C96; C; 2C97; # COPTIC CAPITAL LETTER LAULA +2C98; C; 2C99; # COPTIC CAPITAL LETTER MI +2C9A; C; 2C9B; # COPTIC CAPITAL LETTER NI +2C9C; C; 2C9D; # COPTIC CAPITAL LETTER KSI +2C9E; C; 2C9F; # COPTIC CAPITAL LETTER O +2CA0; C; 2CA1; # COPTIC CAPITAL LETTER PI +2CA2; C; 2CA3; # COPTIC CAPITAL LETTER RO +2CA4; C; 2CA5; # COPTIC CAPITAL LETTER SIMA +2CA6; C; 2CA7; # COPTIC CAPITAL LETTER TAU +2CA8; C; 2CA9; # COPTIC CAPITAL LETTER UA +2CAA; C; 2CAB; # COPTIC CAPITAL LETTER FI +2CAC; C; 2CAD; # COPTIC CAPITAL LETTER KHI +2CAE; C; 2CAF; # COPTIC CAPITAL LETTER PSI +2CB0; C; 2CB1; # COPTIC CAPITAL LETTER OOU +2CB2; C; 2CB3; # COPTIC CAPITAL LETTER DIALECT-P ALEF +2CB4; C; 2CB5; # COPTIC CAPITAL LETTER OLD COPTIC AIN +2CB6; C; 2CB7; # COPTIC CAPITAL LETTER CRYPTOGRAMMIC EIE +2CB8; C; 2CB9; # COPTIC CAPITAL LETTER DIALECT-P KAPA +2CBA; C; 2CBB; # COPTIC CAPITAL LETTER DIALECT-P NI +2CBC; C; 2CBD; # COPTIC CAPITAL LETTER CRYPTOGRAMMIC NI +2CBE; C; 2CBF; # COPTIC CAPITAL LETTER OLD COPTIC OOU +2CC0; C; 2CC1; # COPTIC CAPITAL LETTER SAMPI +2CC2; C; 2CC3; # COPTIC CAPITAL LETTER CROSSED SHEI +2CC4; C; 2CC5; # COPTIC CAPITAL LETTER OLD COPTIC SHEI +2CC6; C; 2CC7; # COPTIC CAPITAL LETTER OLD COPTIC ESH +2CC8; C; 2CC9; # COPTIC CAPITAL LETTER AKHMIMIC KHEI +2CCA; C; 2CCB; # COPTIC CAPITAL LETTER DIALECT-P HORI +2CCC; C; 2CCD; # COPTIC CAPITAL LETTER OLD COPTIC HORI +2CCE; C; 2CCF; # COPTIC CAPITAL LETTER OLD COPTIC HA +2CD0; C; 2CD1; # COPTIC CAPITAL LETTER L-SHAPED HA +2CD2; C; 2CD3; # COPTIC CAPITAL LETTER OLD COPTIC HEI +2CD4; C; 2CD5; # COPTIC CAPITAL LETTER OLD COPTIC HAT +2CD6; C; 2CD7; # COPTIC CAPITAL LETTER OLD COPTIC GANGIA +2CD8; C; 2CD9; # COPTIC CAPITAL LETTER OLD COPTIC DJA +2CDA; C; 2CDB; # COPTIC CAPITAL LETTER OLD COPTIC SHIMA +2CDC; C; 2CDD; # COPTIC CAPITAL LETTER OLD NUBIAN SHIMA +2CDE; C; 2CDF; # COPTIC CAPITAL LETTER OLD NUBIAN NGI +2CE0; C; 2CE1; # COPTIC CAPITAL LETTER OLD NUBIAN NYI +2CE2; C; 2CE3; # COPTIC CAPITAL LETTER OLD NUBIAN WAU +2CEB; C; 2CEC; # COPTIC CAPITAL LETTER CRYPTOGRAMMIC SHEI +2CED; C; 2CEE; # COPTIC CAPITAL LETTER CRYPTOGRAMMIC GANGIA +2CF2; C; 2CF3; # COPTIC CAPITAL LETTER BOHAIRIC KHEI +A640; C; A641; # CYRILLIC CAPITAL LETTER ZEMLYA +A642; C; A643; # CYRILLIC CAPITAL LETTER DZELO +A644; C; A645; # CYRILLIC CAPITAL LETTER REVERSED DZE +A646; C; A647; # CYRILLIC CAPITAL LETTER IOTA +A648; C; A649; # CYRILLIC CAPITAL LETTER DJERV +A64A; C; A64B; # CYRILLIC CAPITAL LETTER MONOGRAPH UK +A64C; C; A64D; # CYRILLIC CAPITAL LETTER BROAD OMEGA +A64E; C; A64F; # CYRILLIC CAPITAL LETTER NEUTRAL YER +A650; C; A651; # CYRILLIC CAPITAL LETTER YERU WITH BACK YER +A652; C; A653; # CYRILLIC CAPITAL LETTER IOTIFIED YAT +A654; C; A655; # CYRILLIC CAPITAL LETTER REVERSED YU +A656; C; A657; # CYRILLIC CAPITAL LETTER IOTIFIED A +A658; C; A659; # CYRILLIC CAPITAL LETTER CLOSED LITTLE YUS +A65A; C; A65B; # CYRILLIC CAPITAL LETTER BLENDED YUS +A65C; C; A65D; # CYRILLIC CAPITAL LETTER IOTIFIED CLOSED LITTLE YUS +A65E; C; A65F; # CYRILLIC CAPITAL LETTER YN +A660; C; A661; # CYRILLIC CAPITAL LETTER REVERSED TSE +A662; C; A663; # CYRILLIC CAPITAL LETTER SOFT DE +A664; C; A665; # CYRILLIC CAPITAL LETTER SOFT EL +A666; C; A667; # CYRILLIC CAPITAL LETTER SOFT EM +A668; C; A669; # CYRILLIC CAPITAL LETTER MONOCULAR O +A66A; C; A66B; # CYRILLIC CAPITAL LETTER BINOCULAR O +A66C; C; A66D; # CYRILLIC CAPITAL LETTER DOUBLE MONOCULAR O +A680; C; A681; # CYRILLIC CAPITAL LETTER DWE +A682; C; A683; # CYRILLIC CAPITAL LETTER DZWE +A684; C; A685; # CYRILLIC CAPITAL LETTER ZHWE +A686; C; A687; # CYRILLIC CAPITAL LETTER CCHE +A688; C; A689; # CYRILLIC CAPITAL LETTER DZZE +A68A; C; A68B; # CYRILLIC CAPITAL LETTER TE WITH MIDDLE HOOK +A68C; C; A68D; # CYRILLIC CAPITAL LETTER TWE +A68E; C; A68F; # CYRILLIC CAPITAL LETTER TSWE +A690; C; A691; # CYRILLIC CAPITAL LETTER TSSE +A692; C; A693; # CYRILLIC CAPITAL LETTER TCHE +A694; C; A695; # CYRILLIC CAPITAL LETTER HWE +A696; C; A697; # CYRILLIC CAPITAL LETTER SHWE +A698; C; A699; # CYRILLIC CAPITAL LETTER DOUBLE O +A69A; C; A69B; # CYRILLIC CAPITAL LETTER CROSSED O +A722; C; A723; # LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF +A724; C; A725; # LATIN CAPITAL LETTER EGYPTOLOGICAL AIN +A726; C; A727; # LATIN CAPITAL LETTER HENG +A728; C; A729; # LATIN CAPITAL LETTER TZ +A72A; C; A72B; # LATIN CAPITAL LETTER TRESILLO +A72C; C; A72D; # LATIN CAPITAL LETTER CUATRILLO +A72E; C; A72F; # LATIN CAPITAL LETTER CUATRILLO WITH COMMA +A732; C; A733; # LATIN CAPITAL LETTER AA +A734; C; A735; # LATIN CAPITAL LETTER AO +A736; C; A737; # LATIN CAPITAL LETTER AU +A738; C; A739; # LATIN CAPITAL LETTER AV +A73A; C; A73B; # LATIN CAPITAL LETTER AV WITH HORIZONTAL BAR +A73C; C; A73D; # LATIN CAPITAL LETTER AY +A73E; C; A73F; # LATIN CAPITAL LETTER REVERSED C WITH DOT +A740; C; A741; # LATIN CAPITAL LETTER K WITH STROKE +A742; C; A743; # LATIN CAPITAL LETTER K WITH DIAGONAL STROKE +A744; C; A745; # LATIN CAPITAL LETTER K WITH STROKE AND DIAGONAL STROKE +A746; C; A747; # LATIN CAPITAL LETTER BROKEN L +A748; C; A749; # LATIN CAPITAL LETTER L WITH HIGH STROKE +A74A; C; A74B; # LATIN CAPITAL LETTER O WITH LONG STROKE OVERLAY +A74C; C; A74D; # LATIN CAPITAL LETTER O WITH LOOP +A74E; C; A74F; # LATIN CAPITAL LETTER OO +A750; C; A751; # LATIN CAPITAL LETTER P WITH STROKE THROUGH DESCENDER +A752; C; A753; # LATIN CAPITAL LETTER P WITH FLOURISH +A754; C; A755; # LATIN CAPITAL LETTER P WITH SQUIRREL TAIL +A756; C; A757; # LATIN CAPITAL LETTER Q WITH STROKE THROUGH DESCENDER +A758; C; A759; # LATIN CAPITAL LETTER Q WITH DIAGONAL STROKE +A75A; C; A75B; # LATIN CAPITAL LETTER R ROTUNDA +A75C; C; A75D; # LATIN CAPITAL LETTER RUM ROTUNDA +A75E; C; A75F; # LATIN CAPITAL LETTER V WITH DIAGONAL STROKE +A760; C; A761; # LATIN CAPITAL LETTER VY +A762; C; A763; # LATIN CAPITAL LETTER VISIGOTHIC Z +A764; C; A765; # LATIN CAPITAL LETTER THORN WITH STROKE +A766; C; A767; # LATIN CAPITAL LETTER THORN WITH STROKE THROUGH DESCENDER +A768; C; A769; # LATIN CAPITAL LETTER VEND +A76A; C; A76B; # LATIN CAPITAL LETTER ET +A76C; C; A76D; # LATIN CAPITAL LETTER IS +A76E; C; A76F; # LATIN CAPITAL LETTER CON +A779; C; A77A; # LATIN CAPITAL LETTER INSULAR D +A77B; C; A77C; # LATIN CAPITAL LETTER INSULAR F +A77D; C; 1D79; # LATIN CAPITAL LETTER INSULAR G +A77E; C; A77F; # LATIN CAPITAL LETTER TURNED INSULAR G +A780; C; A781; # LATIN CAPITAL LETTER TURNED L +A782; C; A783; # LATIN CAPITAL LETTER INSULAR R +A784; C; A785; # LATIN CAPITAL LETTER INSULAR S +A786; C; A787; # LATIN CAPITAL LETTER INSULAR T +A78B; C; A78C; # LATIN CAPITAL LETTER SALTILLO +A78D; C; 0265; # LATIN CAPITAL LETTER TURNED H +A790; C; A791; # LATIN CAPITAL LETTER N WITH DESCENDER +A792; C; A793; # LATIN CAPITAL LETTER C WITH BAR +A796; C; A797; # LATIN CAPITAL LETTER B WITH FLOURISH +A798; C; A799; # LATIN CAPITAL LETTER F WITH STROKE +A79A; C; A79B; # LATIN CAPITAL LETTER VOLAPUK AE +A79C; C; A79D; # LATIN CAPITAL LETTER VOLAPUK OE +A79E; C; A79F; # LATIN CAPITAL LETTER VOLAPUK UE +A7A0; C; A7A1; # LATIN CAPITAL LETTER G WITH OBLIQUE STROKE +A7A2; C; A7A3; # LATIN CAPITAL LETTER K WITH OBLIQUE STROKE +A7A4; C; A7A5; # LATIN CAPITAL LETTER N WITH OBLIQUE STROKE +A7A6; C; A7A7; # LATIN CAPITAL LETTER R WITH OBLIQUE STROKE +A7A8; C; A7A9; # LATIN CAPITAL LETTER S WITH OBLIQUE STROKE +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 +A7B3; C; AB53; # LATIN CAPITAL LETTER CHI +A7B4; C; A7B5; # LATIN CAPITAL LETTER BETA +A7B6; C; A7B7; # LATIN CAPITAL LETTER OMEGA +A7B8; C; A7B9; # LATIN CAPITAL LETTER U WITH STROKE +AB70; C; 13A0; # CHEROKEE SMALL LETTER A +AB71; C; 13A1; # CHEROKEE SMALL LETTER E +AB72; C; 13A2; # CHEROKEE SMALL LETTER I +AB73; C; 13A3; # CHEROKEE SMALL LETTER O +AB74; C; 13A4; # CHEROKEE SMALL LETTER U +AB75; C; 13A5; # CHEROKEE SMALL LETTER V +AB76; C; 13A6; # CHEROKEE SMALL LETTER GA +AB77; C; 13A7; # CHEROKEE SMALL LETTER KA +AB78; C; 13A8; # CHEROKEE SMALL LETTER GE +AB79; C; 13A9; # CHEROKEE SMALL LETTER GI +AB7A; C; 13AA; # CHEROKEE SMALL LETTER GO +AB7B; C; 13AB; # CHEROKEE SMALL LETTER GU +AB7C; C; 13AC; # CHEROKEE SMALL LETTER GV +AB7D; C; 13AD; # CHEROKEE SMALL LETTER HA +AB7E; C; 13AE; # CHEROKEE SMALL LETTER HE +AB7F; C; 13AF; # CHEROKEE SMALL LETTER HI +AB80; C; 13B0; # CHEROKEE SMALL LETTER HO +AB81; C; 13B1; # CHEROKEE SMALL LETTER HU +AB82; C; 13B2; # CHEROKEE SMALL LETTER HV +AB83; C; 13B3; # CHEROKEE SMALL LETTER LA +AB84; C; 13B4; # CHEROKEE SMALL LETTER LE +AB85; C; 13B5; # CHEROKEE SMALL LETTER LI +AB86; C; 13B6; # CHEROKEE SMALL LETTER LO +AB87; C; 13B7; # CHEROKEE SMALL LETTER LU +AB88; C; 13B8; # CHEROKEE SMALL LETTER LV +AB89; C; 13B9; # CHEROKEE SMALL LETTER MA +AB8A; C; 13BA; # CHEROKEE SMALL LETTER ME +AB8B; C; 13BB; # CHEROKEE SMALL LETTER MI +AB8C; C; 13BC; # CHEROKEE SMALL LETTER MO +AB8D; C; 13BD; # CHEROKEE SMALL LETTER MU +AB8E; C; 13BE; # CHEROKEE SMALL LETTER NA +AB8F; C; 13BF; # CHEROKEE SMALL LETTER HNA +AB90; C; 13C0; # CHEROKEE SMALL LETTER NAH +AB91; C; 13C1; # CHEROKEE SMALL LETTER NE +AB92; C; 13C2; # CHEROKEE SMALL LETTER NI +AB93; C; 13C3; # CHEROKEE SMALL LETTER NO +AB94; C; 13C4; # CHEROKEE SMALL LETTER NU +AB95; C; 13C5; # CHEROKEE SMALL LETTER NV +AB96; C; 13C6; # CHEROKEE SMALL LETTER QUA +AB97; C; 13C7; # CHEROKEE SMALL LETTER QUE +AB98; C; 13C8; # CHEROKEE SMALL LETTER QUI +AB99; C; 13C9; # CHEROKEE SMALL LETTER QUO +AB9A; C; 13CA; # CHEROKEE SMALL LETTER QUU +AB9B; C; 13CB; # CHEROKEE SMALL LETTER QUV +AB9C; C; 13CC; # CHEROKEE SMALL LETTER SA +AB9D; C; 13CD; # CHEROKEE SMALL LETTER S +AB9E; C; 13CE; # CHEROKEE SMALL LETTER SE +AB9F; C; 13CF; # CHEROKEE SMALL LETTER SI +ABA0; C; 13D0; # CHEROKEE SMALL LETTER SO +ABA1; C; 13D1; # CHEROKEE SMALL LETTER SU +ABA2; C; 13D2; # CHEROKEE SMALL LETTER SV +ABA3; C; 13D3; # CHEROKEE SMALL LETTER DA +ABA4; C; 13D4; # CHEROKEE SMALL LETTER TA +ABA5; C; 13D5; # CHEROKEE SMALL LETTER DE +ABA6; C; 13D6; # CHEROKEE SMALL LETTER TE +ABA7; C; 13D7; # CHEROKEE SMALL LETTER DI +ABA8; C; 13D8; # CHEROKEE SMALL LETTER TI +ABA9; C; 13D9; # CHEROKEE SMALL LETTER DO +ABAA; C; 13DA; # CHEROKEE SMALL LETTER DU +ABAB; C; 13DB; # CHEROKEE SMALL LETTER DV +ABAC; C; 13DC; # CHEROKEE SMALL LETTER DLA +ABAD; C; 13DD; # CHEROKEE SMALL LETTER TLA +ABAE; C; 13DE; # CHEROKEE SMALL LETTER TLE +ABAF; C; 13DF; # CHEROKEE SMALL LETTER TLI +ABB0; C; 13E0; # CHEROKEE SMALL LETTER TLO +ABB1; C; 13E1; # CHEROKEE SMALL LETTER TLU +ABB2; C; 13E2; # CHEROKEE SMALL LETTER TLV +ABB3; C; 13E3; # CHEROKEE SMALL LETTER TSA +ABB4; C; 13E4; # CHEROKEE SMALL LETTER TSE +ABB5; C; 13E5; # CHEROKEE SMALL LETTER TSI +ABB6; C; 13E6; # CHEROKEE SMALL LETTER TSO +ABB7; C; 13E7; # CHEROKEE SMALL LETTER TSU +ABB8; C; 13E8; # CHEROKEE SMALL LETTER TSV +ABB9; C; 13E9; # CHEROKEE SMALL LETTER WA +ABBA; C; 13EA; # CHEROKEE SMALL LETTER WE +ABBB; C; 13EB; # CHEROKEE SMALL LETTER WI +ABBC; C; 13EC; # CHEROKEE SMALL LETTER WO +ABBD; C; 13ED; # CHEROKEE SMALL LETTER WU +ABBE; C; 13EE; # CHEROKEE SMALL LETTER WV +ABBF; C; 13EF; # CHEROKEE SMALL LETTER YA +FB00; F; 0066 0066; # LATIN SMALL LIGATURE FF +FB01; F; 0066 0069; # LATIN SMALL LIGATURE FI +FB02; F; 0066 006C; # LATIN SMALL LIGATURE FL +FB03; F; 0066 0066 0069; # LATIN SMALL LIGATURE FFI +FB04; F; 0066 0066 006C; # LATIN SMALL LIGATURE FFL +FB05; F; 0073 0074; # LATIN SMALL LIGATURE LONG S T +FB06; F; 0073 0074; # LATIN SMALL LIGATURE ST +FB13; F; 0574 0576; # ARMENIAN SMALL LIGATURE MEN NOW +FB14; F; 0574 0565; # ARMENIAN SMALL LIGATURE MEN ECH +FB15; F; 0574 056B; # ARMENIAN SMALL LIGATURE MEN INI +FB16; F; 057E 0576; # ARMENIAN SMALL LIGATURE VEW NOW +FB17; F; 0574 056D; # ARMENIAN SMALL LIGATURE MEN XEH +FF21; C; FF41; # FULLWIDTH LATIN CAPITAL LETTER A +FF22; C; FF42; # FULLWIDTH LATIN CAPITAL LETTER B +FF23; C; FF43; # FULLWIDTH LATIN CAPITAL LETTER C +FF24; C; FF44; # FULLWIDTH LATIN CAPITAL LETTER D +FF25; C; FF45; # FULLWIDTH LATIN CAPITAL LETTER E +FF26; C; FF46; # FULLWIDTH LATIN CAPITAL LETTER F +FF27; C; FF47; # FULLWIDTH LATIN CAPITAL LETTER G +FF28; C; FF48; # FULLWIDTH LATIN CAPITAL LETTER H +FF29; C; FF49; # FULLWIDTH LATIN CAPITAL LETTER I +FF2A; C; FF4A; # FULLWIDTH LATIN CAPITAL LETTER J +FF2B; C; FF4B; # FULLWIDTH LATIN CAPITAL LETTER K +FF2C; C; FF4C; # FULLWIDTH LATIN CAPITAL LETTER L +FF2D; C; FF4D; # FULLWIDTH LATIN CAPITAL LETTER M +FF2E; C; FF4E; # FULLWIDTH LATIN CAPITAL LETTER N +FF2F; C; FF4F; # FULLWIDTH LATIN CAPITAL LETTER O +FF30; C; FF50; # FULLWIDTH LATIN CAPITAL LETTER P +FF31; C; FF51; # FULLWIDTH LATIN CAPITAL LETTER Q +FF32; C; FF52; # FULLWIDTH LATIN CAPITAL LETTER R +FF33; C; FF53; # FULLWIDTH LATIN CAPITAL LETTER S +FF34; C; FF54; # FULLWIDTH LATIN CAPITAL LETTER T +FF35; C; FF55; # FULLWIDTH LATIN CAPITAL LETTER U +FF36; C; FF56; # FULLWIDTH LATIN CAPITAL LETTER V +FF37; C; FF57; # FULLWIDTH LATIN CAPITAL LETTER W +FF38; C; FF58; # FULLWIDTH LATIN CAPITAL LETTER X +FF39; C; FF59; # FULLWIDTH LATIN CAPITAL LETTER Y +FF3A; C; FF5A; # FULLWIDTH LATIN CAPITAL LETTER Z +10400; C; 10428; # DESERET CAPITAL LETTER LONG I +10401; C; 10429; # DESERET CAPITAL LETTER LONG E +10402; C; 1042A; # DESERET CAPITAL LETTER LONG A +10403; C; 1042B; # DESERET CAPITAL LETTER LONG AH +10404; C; 1042C; # DESERET CAPITAL LETTER LONG O +10405; C; 1042D; # DESERET CAPITAL LETTER LONG OO +10406; C; 1042E; # DESERET CAPITAL LETTER SHORT I +10407; C; 1042F; # DESERET CAPITAL LETTER SHORT E +10408; C; 10430; # DESERET CAPITAL LETTER SHORT A +10409; C; 10431; # DESERET CAPITAL LETTER SHORT AH +1040A; C; 10432; # DESERET CAPITAL LETTER SHORT O +1040B; C; 10433; # DESERET CAPITAL LETTER SHORT OO +1040C; C; 10434; # DESERET CAPITAL LETTER AY +1040D; C; 10435; # DESERET CAPITAL LETTER OW +1040E; C; 10436; # DESERET CAPITAL LETTER WU +1040F; C; 10437; # DESERET CAPITAL LETTER YEE +10410; C; 10438; # DESERET CAPITAL LETTER H +10411; C; 10439; # DESERET CAPITAL LETTER PEE +10412; C; 1043A; # DESERET CAPITAL LETTER BEE +10413; C; 1043B; # DESERET CAPITAL LETTER TEE +10414; C; 1043C; # DESERET CAPITAL LETTER DEE +10415; C; 1043D; # DESERET CAPITAL LETTER CHEE +10416; C; 1043E; # DESERET CAPITAL LETTER JEE +10417; C; 1043F; # DESERET CAPITAL LETTER KAY +10418; C; 10440; # DESERET CAPITAL LETTER GAY +10419; C; 10441; # DESERET CAPITAL LETTER EF +1041A; C; 10442; # DESERET CAPITAL LETTER VEE +1041B; C; 10443; # DESERET CAPITAL LETTER ETH +1041C; C; 10444; # DESERET CAPITAL LETTER THEE +1041D; C; 10445; # DESERET CAPITAL LETTER ES +1041E; C; 10446; # DESERET CAPITAL LETTER ZEE +1041F; C; 10447; # DESERET CAPITAL LETTER ESH +10420; C; 10448; # DESERET CAPITAL LETTER ZHEE +10421; C; 10449; # DESERET CAPITAL LETTER ER +10422; C; 1044A; # DESERET CAPITAL LETTER EL +10423; C; 1044B; # DESERET CAPITAL LETTER EM +10424; C; 1044C; # DESERET CAPITAL LETTER EN +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 +10C83; C; 10CC3; # OLD HUNGARIAN CAPITAL LETTER AMB +10C84; C; 10CC4; # OLD HUNGARIAN CAPITAL LETTER EC +10C85; C; 10CC5; # OLD HUNGARIAN CAPITAL LETTER ENC +10C86; C; 10CC6; # OLD HUNGARIAN CAPITAL LETTER ECS +10C87; C; 10CC7; # OLD HUNGARIAN CAPITAL LETTER ED +10C88; C; 10CC8; # OLD HUNGARIAN CAPITAL LETTER AND +10C89; C; 10CC9; # OLD HUNGARIAN CAPITAL LETTER E +10C8A; C; 10CCA; # OLD HUNGARIAN CAPITAL LETTER CLOSE E +10C8B; C; 10CCB; # OLD HUNGARIAN CAPITAL LETTER EE +10C8C; C; 10CCC; # OLD HUNGARIAN CAPITAL LETTER EF +10C8D; C; 10CCD; # OLD HUNGARIAN CAPITAL LETTER EG +10C8E; C; 10CCE; # OLD HUNGARIAN CAPITAL LETTER EGY +10C8F; C; 10CCF; # OLD HUNGARIAN CAPITAL LETTER EH +10C90; C; 10CD0; # OLD HUNGARIAN CAPITAL LETTER I +10C91; C; 10CD1; # OLD HUNGARIAN CAPITAL LETTER II +10C92; C; 10CD2; # OLD HUNGARIAN CAPITAL LETTER EJ +10C93; C; 10CD3; # OLD HUNGARIAN CAPITAL LETTER EK +10C94; C; 10CD4; # OLD HUNGARIAN CAPITAL LETTER AK +10C95; C; 10CD5; # OLD HUNGARIAN CAPITAL LETTER UNK +10C96; C; 10CD6; # OLD HUNGARIAN CAPITAL LETTER EL +10C97; C; 10CD7; # OLD HUNGARIAN CAPITAL LETTER ELY +10C98; C; 10CD8; # OLD HUNGARIAN CAPITAL LETTER EM +10C99; C; 10CD9; # OLD HUNGARIAN CAPITAL LETTER EN +10C9A; C; 10CDA; # OLD HUNGARIAN CAPITAL LETTER ENY +10C9B; C; 10CDB; # OLD HUNGARIAN CAPITAL LETTER O +10C9C; C; 10CDC; # OLD HUNGARIAN CAPITAL LETTER OO +10C9D; C; 10CDD; # OLD HUNGARIAN CAPITAL LETTER NIKOLSBURG OE +10C9E; C; 10CDE; # OLD HUNGARIAN CAPITAL LETTER RUDIMENTA OE +10C9F; C; 10CDF; # OLD HUNGARIAN CAPITAL LETTER OEE +10CA0; C; 10CE0; # OLD HUNGARIAN CAPITAL LETTER EP +10CA1; C; 10CE1; # OLD HUNGARIAN CAPITAL LETTER EMP +10CA2; C; 10CE2; # OLD HUNGARIAN CAPITAL LETTER ER +10CA3; C; 10CE3; # OLD HUNGARIAN CAPITAL LETTER SHORT ER +10CA4; C; 10CE4; # OLD HUNGARIAN CAPITAL LETTER ES +10CA5; C; 10CE5; # OLD HUNGARIAN CAPITAL LETTER ESZ +10CA6; C; 10CE6; # OLD HUNGARIAN CAPITAL LETTER ET +10CA7; C; 10CE7; # OLD HUNGARIAN CAPITAL LETTER ENT +10CA8; C; 10CE8; # OLD HUNGARIAN CAPITAL LETTER ETY +10CA9; C; 10CE9; # OLD HUNGARIAN CAPITAL LETTER ECH +10CAA; C; 10CEA; # OLD HUNGARIAN CAPITAL LETTER U +10CAB; C; 10CEB; # OLD HUNGARIAN CAPITAL LETTER UU +10CAC; C; 10CEC; # OLD HUNGARIAN CAPITAL LETTER NIKOLSBURG UE +10CAD; C; 10CED; # OLD HUNGARIAN CAPITAL LETTER RUDIMENTA UE +10CAE; C; 10CEE; # OLD HUNGARIAN CAPITAL LETTER EV +10CAF; C; 10CEF; # OLD HUNGARIAN CAPITAL LETTER EZ +10CB0; C; 10CF0; # OLD HUNGARIAN CAPITAL LETTER EZS +10CB1; C; 10CF1; # OLD HUNGARIAN CAPITAL LETTER ENT-SHAPED SIGN +10CB2; C; 10CF2; # OLD HUNGARIAN CAPITAL LETTER US +118A0; C; 118C0; # WARANG CITI CAPITAL LETTER NGAA +118A1; C; 118C1; # WARANG CITI CAPITAL LETTER A +118A2; C; 118C2; # WARANG CITI CAPITAL LETTER WI +118A3; C; 118C3; # WARANG CITI CAPITAL LETTER YU +118A4; C; 118C4; # WARANG CITI CAPITAL LETTER YA +118A5; C; 118C5; # WARANG CITI CAPITAL LETTER YO +118A6; C; 118C6; # WARANG CITI CAPITAL LETTER II +118A7; C; 118C7; # WARANG CITI CAPITAL LETTER UU +118A8; C; 118C8; # WARANG CITI CAPITAL LETTER E +118A9; C; 118C9; # WARANG CITI CAPITAL LETTER O +118AA; C; 118CA; # WARANG CITI CAPITAL LETTER ANG +118AB; C; 118CB; # WARANG CITI CAPITAL LETTER GA +118AC; C; 118CC; # WARANG CITI CAPITAL LETTER KO +118AD; C; 118CD; # WARANG CITI CAPITAL LETTER ENY +118AE; C; 118CE; # WARANG CITI CAPITAL LETTER YUJ +118AF; C; 118CF; # WARANG CITI CAPITAL LETTER UC +118B0; C; 118D0; # WARANG CITI CAPITAL LETTER ENN +118B1; C; 118D1; # WARANG CITI CAPITAL LETTER ODD +118B2; C; 118D2; # WARANG CITI CAPITAL LETTER TTE +118B3; C; 118D3; # WARANG CITI CAPITAL LETTER NUNG +118B4; C; 118D4; # WARANG CITI CAPITAL LETTER DA +118B5; C; 118D5; # WARANG CITI CAPITAL LETTER AT +118B6; C; 118D6; # WARANG CITI CAPITAL LETTER AM +118B7; C; 118D7; # WARANG CITI CAPITAL LETTER BU +118B8; C; 118D8; # WARANG CITI CAPITAL LETTER PU +118B9; C; 118D9; # WARANG CITI CAPITAL LETTER HIYO +118BA; C; 118DA; # WARANG CITI CAPITAL LETTER HOLO +118BB; C; 118DB; # WARANG CITI CAPITAL LETTER HORR +118BC; C; 118DC; # WARANG CITI CAPITAL LETTER HAR +118BD; C; 118DD; # WARANG CITI CAPITAL LETTER SSUU +118BE; C; 118DE; # WARANG CITI CAPITAL LETTER SII +118BF; C; 118DF; # WARANG CITI CAPITAL LETTER VIYO +16E40; C; 16E60; # MEDEFAIDRIN CAPITAL LETTER M +16E41; C; 16E61; # MEDEFAIDRIN CAPITAL LETTER S +16E42; C; 16E62; # MEDEFAIDRIN CAPITAL LETTER V +16E43; C; 16E63; # MEDEFAIDRIN CAPITAL LETTER W +16E44; C; 16E64; # MEDEFAIDRIN CAPITAL LETTER ATIU +16E45; C; 16E65; # MEDEFAIDRIN CAPITAL LETTER Z +16E46; C; 16E66; # MEDEFAIDRIN CAPITAL LETTER KP +16E47; C; 16E67; # MEDEFAIDRIN CAPITAL LETTER P +16E48; C; 16E68; # MEDEFAIDRIN CAPITAL LETTER T +16E49; C; 16E69; # MEDEFAIDRIN CAPITAL LETTER G +16E4A; C; 16E6A; # MEDEFAIDRIN CAPITAL LETTER F +16E4B; C; 16E6B; # MEDEFAIDRIN CAPITAL LETTER I +16E4C; C; 16E6C; # MEDEFAIDRIN CAPITAL LETTER K +16E4D; C; 16E6D; # MEDEFAIDRIN CAPITAL LETTER A +16E4E; C; 16E6E; # MEDEFAIDRIN CAPITAL LETTER J +16E4F; C; 16E6F; # MEDEFAIDRIN CAPITAL LETTER E +16E50; C; 16E70; # MEDEFAIDRIN CAPITAL LETTER B +16E51; C; 16E71; # MEDEFAIDRIN CAPITAL LETTER C +16E52; C; 16E72; # MEDEFAIDRIN CAPITAL LETTER U +16E53; C; 16E73; # MEDEFAIDRIN CAPITAL LETTER YU +16E54; C; 16E74; # MEDEFAIDRIN CAPITAL LETTER L +16E55; C; 16E75; # MEDEFAIDRIN CAPITAL LETTER Q +16E56; C; 16E76; # MEDEFAIDRIN CAPITAL LETTER HP +16E57; C; 16E77; # MEDEFAIDRIN CAPITAL LETTER NY +16E58; C; 16E78; # MEDEFAIDRIN CAPITAL LETTER X +16E59; C; 16E79; # MEDEFAIDRIN CAPITAL LETTER D +16E5A; C; 16E7A; # MEDEFAIDRIN CAPITAL LETTER OE +16E5B; C; 16E7B; # MEDEFAIDRIN CAPITAL LETTER N +16E5C; C; 16E7C; # MEDEFAIDRIN CAPITAL LETTER R +16E5D; C; 16E7D; # MEDEFAIDRIN CAPITAL LETTER O +16E5E; C; 16E7E; # MEDEFAIDRIN CAPITAL LETTER AI +16E5F; C; 16E7F; # MEDEFAIDRIN CAPITAL LETTER Y +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 -Nru pypy-7.1.1+dfsg/rpython/rlib/unicodedata/CompositionExclusions-11.0.0.txt pypy-7.3.1+dfsg/rpython/rlib/unicodedata/CompositionExclusions-11.0.0.txt --- pypy-7.1.1+dfsg/rpython/rlib/unicodedata/CompositionExclusions-11.0.0.txt 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/rlib/unicodedata/CompositionExclusions-11.0.0.txt 2020-04-10 19:28:41.000000000 +0000 @@ -0,0 +1,208 @@ +# CompositionExclusions-11.0.0.txt +# Date: 2017-12-06, 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 +# 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. +# +# This file is a normative contributory data file in the +# Unicode Character Database. +# +# For more information, see +# http://www.unicode.org/unicode/reports/tr15/#Primary_Exclusion_List_Table +# +# For a full derivation of composition exclusions, see the derived property +# Full_Composition_Exclusion in DerivedNormalizationProps.txt +# + +# ================================================ +# (1) Script Specifics +# +# This list of characters cannot be derived from the UnicodeData.txt file. +# ================================================ + +0958 # DEVANAGARI LETTER QA +0959 # DEVANAGARI LETTER KHHA +095A # DEVANAGARI LETTER GHHA +095B # DEVANAGARI LETTER ZA +095C # DEVANAGARI LETTER DDDHA +095D # DEVANAGARI LETTER RHA +095E # DEVANAGARI LETTER FA +095F # DEVANAGARI LETTER YYA +09DC # BENGALI LETTER RRA +09DD # BENGALI LETTER RHA +09DF # BENGALI LETTER YYA +0A33 # GURMUKHI LETTER LLA +0A36 # GURMUKHI LETTER SHA +0A59 # GURMUKHI LETTER KHHA +0A5A # GURMUKHI LETTER GHHA +0A5B # GURMUKHI LETTER ZA +0A5E # GURMUKHI LETTER FA +0B5C # ORIYA LETTER RRA +0B5D # ORIYA LETTER RHA +0F43 # TIBETAN LETTER GHA +0F4D # TIBETAN LETTER DDHA +0F52 # TIBETAN LETTER DHA +0F57 # TIBETAN LETTER BHA +0F5C # TIBETAN LETTER DZHA +0F69 # TIBETAN LETTER KSSA +0F76 # TIBETAN VOWEL SIGN VOCALIC R +0F78 # TIBETAN VOWEL SIGN VOCALIC L +0F93 # TIBETAN SUBJOINED LETTER GHA +0F9D # TIBETAN SUBJOINED LETTER DDHA +0FA2 # TIBETAN SUBJOINED LETTER DHA +0FA7 # TIBETAN SUBJOINED LETTER BHA +0FAC # TIBETAN SUBJOINED LETTER DZHA +0FB9 # TIBETAN SUBJOINED LETTER KSSA +FB1D # HEBREW LETTER YOD WITH HIRIQ +FB1F # HEBREW LIGATURE YIDDISH YOD YOD PATAH +FB2A # HEBREW LETTER SHIN WITH SHIN DOT +FB2B # HEBREW LETTER SHIN WITH SIN DOT +FB2C # HEBREW LETTER SHIN WITH DAGESH AND SHIN DOT +FB2D # HEBREW LETTER SHIN WITH DAGESH AND SIN DOT +FB2E # HEBREW LETTER ALEF WITH PATAH +FB2F # HEBREW LETTER ALEF WITH QAMATS +FB30 # HEBREW LETTER ALEF WITH MAPIQ +FB31 # HEBREW LETTER BET WITH DAGESH +FB32 # HEBREW LETTER GIMEL WITH DAGESH +FB33 # HEBREW LETTER DALET WITH DAGESH +FB34 # HEBREW LETTER HE WITH MAPIQ +FB35 # HEBREW LETTER VAV WITH DAGESH +FB36 # HEBREW LETTER ZAYIN WITH DAGESH +FB38 # HEBREW LETTER TET WITH DAGESH +FB39 # HEBREW LETTER YOD WITH DAGESH +FB3A # HEBREW LETTER FINAL KAF WITH DAGESH +FB3B # HEBREW LETTER KAF WITH DAGESH +FB3C # HEBREW LETTER LAMED WITH DAGESH +FB3E # HEBREW LETTER MEM WITH DAGESH +FB40 # HEBREW LETTER NUN WITH DAGESH +FB41 # HEBREW LETTER SAMEKH WITH DAGESH +FB43 # HEBREW LETTER FINAL PE WITH DAGESH +FB44 # HEBREW LETTER PE WITH DAGESH +FB46 # HEBREW LETTER TSADI WITH DAGESH +FB47 # HEBREW LETTER QOF WITH DAGESH +FB48 # HEBREW LETTER RESH WITH DAGESH +FB49 # HEBREW LETTER SHIN WITH DAGESH +FB4A # HEBREW LETTER TAV WITH DAGESH +FB4B # HEBREW LETTER VAV WITH HOLAM +FB4C # HEBREW LETTER BET WITH RAFE +FB4D # HEBREW LETTER KAF WITH RAFE +FB4E # HEBREW LETTER PE WITH RAFE + +# Total code points: 67 + +# ================================================ +# (2) Post Composition Version precomposed characters +# +# These characters cannot be derived solely from the UnicodeData.txt file +# in this version of Unicode. +# +# Note that characters added to the standard after the +# Composition Version and which have canonical decomposition mappings +# are not automatically added to this list of Post Composition +# Version precomposed characters. +# ================================================ + +2ADC # FORKING +1D15E # MUSICAL SYMBOL HALF NOTE +1D15F # MUSICAL SYMBOL QUARTER NOTE +1D160 # MUSICAL SYMBOL EIGHTH NOTE +1D161 # MUSICAL SYMBOL SIXTEENTH NOTE +1D162 # MUSICAL SYMBOL THIRTY-SECOND NOTE +1D163 # MUSICAL SYMBOL SIXTY-FOURTH NOTE +1D164 # MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH NOTE +1D1BB # MUSICAL SYMBOL MINIMA +1D1BC # MUSICAL SYMBOL MINIMA BLACK +1D1BD # MUSICAL SYMBOL SEMIMINIMA WHITE +1D1BE # MUSICAL SYMBOL SEMIMINIMA BLACK +1D1BF # MUSICAL SYMBOL FUSA WHITE +1D1C0 # MUSICAL SYMBOL FUSA BLACK + +# Total code points: 14 + +# ================================================ +# (3) Singleton Decompositions +# +# These characters can be derived from the UnicodeData.txt file +# by including all canonically decomposable characters whose +# canonical decomposition consists of a single character. +# +# These characters are simply quoted here for reference. +# See also Full_Composition_Exclusion in DerivedNormalizationProps.txt +# ================================================ + +# 0340..0341 [2] COMBINING GRAVE TONE MARK..COMBINING ACUTE TONE MARK +# 0343 COMBINING GREEK KORONIS +# 0374 GREEK NUMERAL SIGN +# 037E GREEK QUESTION MARK +# 0387 GREEK ANO TELEIA +# 1F71 GREEK SMALL LETTER ALPHA WITH OXIA +# 1F73 GREEK SMALL LETTER EPSILON WITH OXIA +# 1F75 GREEK SMALL LETTER ETA WITH OXIA +# 1F77 GREEK SMALL LETTER IOTA WITH OXIA +# 1F79 GREEK SMALL LETTER OMICRON WITH OXIA +# 1F7B GREEK SMALL LETTER UPSILON WITH OXIA +# 1F7D GREEK SMALL LETTER OMEGA WITH OXIA +# 1FBB GREEK CAPITAL LETTER ALPHA WITH OXIA +# 1FBE GREEK PROSGEGRAMMENI +# 1FC9 GREEK CAPITAL LETTER EPSILON WITH OXIA +# 1FCB GREEK CAPITAL LETTER ETA WITH OXIA +# 1FD3 GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA +# 1FDB GREEK CAPITAL LETTER IOTA WITH OXIA +# 1FE3 GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA +# 1FEB GREEK CAPITAL LETTER UPSILON WITH OXIA +# 1FEE..1FEF [2] GREEK DIALYTIKA AND OXIA..GREEK VARIA +# 1FF9 GREEK CAPITAL LETTER OMICRON WITH OXIA +# 1FFB GREEK CAPITAL LETTER OMEGA WITH OXIA +# 1FFD GREEK OXIA +# 2000..2001 [2] EN QUAD..EM QUAD +# 2126 OHM SIGN +# 212A..212B [2] KELVIN SIGN..ANGSTROM SIGN +# 2329 LEFT-POINTING ANGLE BRACKET +# 232A RIGHT-POINTING ANGLE BRACKET +# F900..FA0D [270] CJK COMPATIBILITY IDEOGRAPH-F900..CJK COMPATIBILITY IDEOGRAPH-FA0D +# FA10 CJK COMPATIBILITY IDEOGRAPH-FA10 +# FA12 CJK COMPATIBILITY IDEOGRAPH-FA12 +# FA15..FA1E [10] CJK COMPATIBILITY IDEOGRAPH-FA15..CJK COMPATIBILITY IDEOGRAPH-FA1E +# FA20 CJK COMPATIBILITY IDEOGRAPH-FA20 +# FA22 CJK COMPATIBILITY IDEOGRAPH-FA22 +# FA25..FA26 [2] CJK COMPATIBILITY IDEOGRAPH-FA25..CJK COMPATIBILITY IDEOGRAPH-FA26 +# FA2A..FA6D [68] CJK COMPATIBILITY IDEOGRAPH-FA2A..CJK COMPATIBILITY IDEOGRAPH-FA6D +# FA70..FAD9 [106] CJK COMPATIBILITY IDEOGRAPH-FA70..CJK COMPATIBILITY IDEOGRAPH-FAD9 +# 2F800..2FA1D [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D + +# Total code points: 1035 + +# ================================================ +# (4) Non-Starter Decompositions +# +# These characters can be derived from the UnicodeData.txt file +# by including each expanding canonical decomposition +# (i.e., those which canonically decompose to a sequence +# of characters instead of a single character), such that: +# +# A. The character is not a Starter. +# +# OR (inclusive) +# +# B. The character's canonical decomposition begins +# with a character that is not a Starter. +# +# Note that a "Starter" is any character with a zero combining class. +# +# These characters are simply quoted here for reference. +# See also Full_Composition_Exclusion in DerivedNormalizationProps.txt +# ================================================ + +# 0344 COMBINING GREEK DIALYTIKA TONOS +# 0F73 TIBETAN VOWEL SIGN II +# 0F75 TIBETAN VOWEL SIGN UU +# 0F81 TIBETAN VOWEL SIGN REVERSED II + +# Total code points: 4 + +# EOF diff -Nru pypy-7.1.1+dfsg/rpython/rlib/unicodedata/DerivedCoreProperties-11.0.0.txt pypy-7.3.1+dfsg/rpython/rlib/unicodedata/DerivedCoreProperties-11.0.0.txt --- pypy-7.1.1+dfsg/rpython/rlib/unicodedata/DerivedCoreProperties-11.0.0.txt 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/rlib/unicodedata/DerivedCoreProperties-11.0.0.txt 2020-04-10 19:28:41.000000000 +0000 @@ -0,0 +1,11724 @@ +# DerivedCoreProperties-11.0.0.txt +# Date: 2018-02-21, 05:34:02 GMT +# © 2018 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/ + +# ================================================ + +# Derived Property: Math +# Generated from: Sm + Other_Math + +002B ; Math # Sm PLUS SIGN +003C..003E ; Math # Sm [3] LESS-THAN SIGN..GREATER-THAN SIGN +005E ; Math # Sk CIRCUMFLEX ACCENT +007C ; Math # Sm VERTICAL LINE +007E ; Math # Sm TILDE +00AC ; Math # Sm NOT SIGN +00B1 ; Math # Sm PLUS-MINUS SIGN +00D7 ; Math # Sm MULTIPLICATION SIGN +00F7 ; Math # Sm DIVISION SIGN +03D0..03D2 ; Math # L& [3] GREEK BETA SYMBOL..GREEK UPSILON WITH HOOK SYMBOL +03D5 ; Math # L& GREEK PHI SYMBOL +03F0..03F1 ; Math # L& [2] GREEK KAPPA SYMBOL..GREEK RHO SYMBOL +03F4..03F5 ; Math # L& [2] GREEK CAPITAL THETA SYMBOL..GREEK LUNATE EPSILON SYMBOL +03F6 ; Math # Sm GREEK REVERSED LUNATE EPSILON SYMBOL +0606..0608 ; Math # Sm [3] ARABIC-INDIC CUBE ROOT..ARABIC RAY +2016 ; Math # Po DOUBLE VERTICAL LINE +2032..2034 ; Math # Po [3] PRIME..TRIPLE PRIME +2040 ; Math # Pc CHARACTER TIE +2044 ; Math # Sm FRACTION SLASH +2052 ; Math # Sm COMMERCIAL MINUS SIGN +2061..2064 ; Math # Cf [4] FUNCTION APPLICATION..INVISIBLE PLUS +207A..207C ; Math # Sm [3] SUPERSCRIPT PLUS SIGN..SUPERSCRIPT EQUALS SIGN +207D ; Math # Ps SUPERSCRIPT LEFT PARENTHESIS +207E ; Math # Pe SUPERSCRIPT RIGHT PARENTHESIS +208A..208C ; Math # Sm [3] SUBSCRIPT PLUS SIGN..SUBSCRIPT EQUALS SIGN +208D ; Math # Ps SUBSCRIPT LEFT PARENTHESIS +208E ; Math # Pe SUBSCRIPT RIGHT PARENTHESIS +20D0..20DC ; Math # Mn [13] COMBINING LEFT HARPOON ABOVE..COMBINING FOUR DOTS ABOVE +20E1 ; Math # Mn COMBINING LEFT RIGHT ARROW ABOVE +20E5..20E6 ; Math # Mn [2] COMBINING REVERSE SOLIDUS OVERLAY..COMBINING DOUBLE VERTICAL STROKE OVERLAY +20EB..20EF ; Math # Mn [5] COMBINING LONG DOUBLE SOLIDUS OVERLAY..COMBINING RIGHT ARROW BELOW +2102 ; Math # L& DOUBLE-STRUCK CAPITAL C +2107 ; Math # L& EULER CONSTANT +210A..2113 ; Math # L& [10] SCRIPT SMALL G..SCRIPT SMALL L +2115 ; Math # L& DOUBLE-STRUCK CAPITAL N +2118 ; Math # Sm SCRIPT CAPITAL P +2119..211D ; Math # L& [5] DOUBLE-STRUCK CAPITAL P..DOUBLE-STRUCK CAPITAL R +2124 ; Math # L& DOUBLE-STRUCK CAPITAL Z +2128 ; Math # L& BLACK-LETTER CAPITAL Z +2129 ; Math # So TURNED GREEK SMALL LETTER IOTA +212C..212D ; Math # L& [2] SCRIPT CAPITAL B..BLACK-LETTER CAPITAL C +212F..2131 ; Math # L& [3] SCRIPT SMALL E..SCRIPT CAPITAL F +2133..2134 ; Math # L& [2] SCRIPT CAPITAL M..SCRIPT SMALL O +2135..2138 ; Math # Lo [4] ALEF SYMBOL..DALET SYMBOL +213C..213F ; Math # L& [4] DOUBLE-STRUCK SMALL PI..DOUBLE-STRUCK CAPITAL PI +2140..2144 ; Math # Sm [5] DOUBLE-STRUCK N-ARY SUMMATION..TURNED SANS-SERIF CAPITAL Y +2145..2149 ; Math # L& [5] DOUBLE-STRUCK ITALIC CAPITAL D..DOUBLE-STRUCK ITALIC SMALL J +214B ; Math # Sm TURNED AMPERSAND +2190..2194 ; Math # Sm [5] LEFTWARDS ARROW..LEFT RIGHT ARROW +2195..2199 ; Math # So [5] UP DOWN ARROW..SOUTH WEST ARROW +219A..219B ; Math # Sm [2] LEFTWARDS ARROW WITH STROKE..RIGHTWARDS ARROW WITH STROKE +219C..219F ; Math # So [4] LEFTWARDS WAVE ARROW..UPWARDS TWO HEADED ARROW +21A0 ; Math # Sm RIGHTWARDS TWO HEADED ARROW +21A1..21A2 ; Math # So [2] DOWNWARDS TWO HEADED ARROW..LEFTWARDS ARROW WITH TAIL +21A3 ; Math # Sm RIGHTWARDS ARROW WITH TAIL +21A4..21A5 ; Math # So [2] LEFTWARDS ARROW FROM BAR..UPWARDS ARROW FROM BAR +21A6 ; Math # Sm RIGHTWARDS ARROW FROM BAR +21A7 ; Math # So DOWNWARDS ARROW FROM BAR +21A9..21AD ; Math # So [5] LEFTWARDS ARROW WITH HOOK..LEFT RIGHT WAVE ARROW +21AE ; Math # Sm LEFT RIGHT ARROW WITH STROKE +21B0..21B1 ; Math # So [2] UPWARDS ARROW WITH TIP LEFTWARDS..UPWARDS ARROW WITH TIP RIGHTWARDS +21B6..21B7 ; Math # So [2] ANTICLOCKWISE TOP SEMICIRCLE ARROW..CLOCKWISE TOP SEMICIRCLE ARROW +21BC..21CD ; Math # So [18] LEFTWARDS HARPOON WITH BARB UPWARDS..LEFTWARDS DOUBLE ARROW WITH STROKE +21CE..21CF ; Math # Sm [2] LEFT RIGHT DOUBLE ARROW WITH STROKE..RIGHTWARDS DOUBLE ARROW WITH STROKE +21D0..21D1 ; Math # So [2] LEFTWARDS DOUBLE ARROW..UPWARDS DOUBLE ARROW +21D2 ; Math # Sm RIGHTWARDS DOUBLE ARROW +21D3 ; Math # So DOWNWARDS DOUBLE ARROW +21D4 ; Math # Sm LEFT RIGHT DOUBLE ARROW +21D5..21DB ; Math # So [7] UP DOWN DOUBLE ARROW..RIGHTWARDS TRIPLE ARROW +21DD ; Math # So RIGHTWARDS SQUIGGLE ARROW +21E4..21E5 ; Math # So [2] LEFTWARDS ARROW TO BAR..RIGHTWARDS ARROW TO BAR +21F4..22FF ; Math # Sm [268] RIGHT ARROW WITH SMALL CIRCLE..Z NOTATION BAG MEMBERSHIP +2308 ; Math # Ps LEFT CEILING +2309 ; Math # Pe RIGHT CEILING +230A ; Math # Ps LEFT FLOOR +230B ; Math # Pe RIGHT FLOOR +2320..2321 ; Math # Sm [2] TOP HALF INTEGRAL..BOTTOM HALF INTEGRAL +237C ; Math # Sm RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW +239B..23B3 ; Math # Sm [25] LEFT PARENTHESIS UPPER HOOK..SUMMATION BOTTOM +23B4..23B5 ; Math # So [2] TOP SQUARE BRACKET..BOTTOM SQUARE BRACKET +23B7 ; Math # So RADICAL SYMBOL BOTTOM +23D0 ; Math # So VERTICAL LINE EXTENSION +23DC..23E1 ; Math # Sm [6] TOP PARENTHESIS..BOTTOM TORTOISE SHELL BRACKET +23E2 ; Math # So WHITE TRAPEZIUM +25A0..25A1 ; Math # So [2] BLACK SQUARE..WHITE SQUARE +25AE..25B6 ; Math # So [9] BLACK VERTICAL RECTANGLE..BLACK RIGHT-POINTING TRIANGLE +25B7 ; Math # Sm WHITE RIGHT-POINTING TRIANGLE +25BC..25C0 ; Math # So [5] BLACK DOWN-POINTING TRIANGLE..BLACK LEFT-POINTING TRIANGLE +25C1 ; Math # Sm WHITE LEFT-POINTING TRIANGLE +25C6..25C7 ; Math # So [2] BLACK DIAMOND..WHITE DIAMOND +25CA..25CB ; Math # So [2] LOZENGE..WHITE CIRCLE +25CF..25D3 ; Math # So [5] BLACK CIRCLE..CIRCLE WITH UPPER HALF BLACK +25E2 ; Math # So BLACK LOWER RIGHT TRIANGLE +25E4 ; Math # So BLACK UPPER LEFT TRIANGLE +25E7..25EC ; Math # So [6] SQUARE WITH LEFT HALF BLACK..WHITE UP-POINTING TRIANGLE WITH DOT +25F8..25FF ; Math # Sm [8] UPPER LEFT TRIANGLE..LOWER RIGHT TRIANGLE +2605..2606 ; Math # So [2] BLACK STAR..WHITE STAR +2640 ; Math # So FEMALE SIGN +2642 ; Math # So MALE SIGN +2660..2663 ; Math # So [4] BLACK SPADE SUIT..BLACK CLUB SUIT +266D..266E ; Math # So [2] MUSIC FLAT SIGN..MUSIC NATURAL SIGN +266F ; Math # Sm MUSIC SHARP SIGN +27C0..27C4 ; Math # Sm [5] THREE DIMENSIONAL ANGLE..OPEN SUPERSET +27C5 ; Math # Ps LEFT S-SHAPED BAG DELIMITER +27C6 ; Math # Pe RIGHT S-SHAPED BAG DELIMITER +27C7..27E5 ; Math # Sm [31] OR WITH DOT INSIDE..WHITE SQUARE WITH RIGHTWARDS TICK +27E6 ; Math # Ps MATHEMATICAL LEFT WHITE SQUARE BRACKET +27E7 ; Math # Pe MATHEMATICAL RIGHT WHITE SQUARE BRACKET +27E8 ; Math # Ps MATHEMATICAL LEFT ANGLE BRACKET +27E9 ; Math # Pe MATHEMATICAL RIGHT ANGLE BRACKET +27EA ; Math # Ps MATHEMATICAL LEFT DOUBLE ANGLE BRACKET +27EB ; Math # Pe MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET +27EC ; Math # Ps MATHEMATICAL LEFT WHITE TORTOISE SHELL BRACKET +27ED ; Math # Pe MATHEMATICAL RIGHT WHITE TORTOISE SHELL BRACKET +27EE ; Math # Ps MATHEMATICAL LEFT FLATTENED PARENTHESIS +27EF ; Math # Pe MATHEMATICAL RIGHT FLATTENED PARENTHESIS +27F0..27FF ; Math # Sm [16] UPWARDS QUADRUPLE ARROW..LONG RIGHTWARDS SQUIGGLE ARROW +2900..2982 ; Math # Sm [131] RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE..Z NOTATION TYPE COLON +2983 ; Math # Ps LEFT WHITE CURLY BRACKET +2984 ; Math # Pe RIGHT WHITE CURLY BRACKET +2985 ; Math # Ps LEFT WHITE PARENTHESIS +2986 ; Math # Pe RIGHT WHITE PARENTHESIS +2987 ; Math # Ps Z NOTATION LEFT IMAGE BRACKET +2988 ; Math # Pe Z NOTATION RIGHT IMAGE BRACKET +2989 ; Math # Ps Z NOTATION LEFT BINDING BRACKET +298A ; Math # Pe Z NOTATION RIGHT BINDING BRACKET +298B ; Math # Ps LEFT SQUARE BRACKET WITH UNDERBAR +298C ; Math # Pe RIGHT SQUARE BRACKET WITH UNDERBAR +298D ; Math # Ps LEFT SQUARE BRACKET WITH TICK IN TOP CORNER +298E ; Math # Pe RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER +298F ; Math # Ps LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER +2990 ; Math # Pe RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER +2991 ; Math # Ps LEFT ANGLE BRACKET WITH DOT +2992 ; Math # Pe RIGHT ANGLE BRACKET WITH DOT +2993 ; Math # Ps LEFT ARC LESS-THAN BRACKET +2994 ; Math # Pe RIGHT ARC GREATER-THAN BRACKET +2995 ; Math # Ps DOUBLE LEFT ARC GREATER-THAN BRACKET +2996 ; Math # Pe DOUBLE RIGHT ARC LESS-THAN BRACKET +2997 ; Math # Ps LEFT BLACK TORTOISE SHELL BRACKET +2998 ; Math # Pe RIGHT BLACK TORTOISE SHELL BRACKET +2999..29D7 ; Math # Sm [63] DOTTED FENCE..BLACK HOURGLASS +29D8 ; Math # Ps LEFT WIGGLY FENCE +29D9 ; Math # Pe RIGHT WIGGLY FENCE +29DA ; Math # Ps LEFT DOUBLE WIGGLY FENCE +29DB ; Math # Pe RIGHT DOUBLE WIGGLY FENCE +29DC..29FB ; Math # Sm [32] INCOMPLETE INFINITY..TRIPLE PLUS +29FC ; Math # Ps LEFT-POINTING CURVED ANGLE BRACKET +29FD ; Math # Pe RIGHT-POINTING CURVED ANGLE BRACKET +29FE..2AFF ; Math # Sm [258] TINY..N-ARY WHITE VERTICAL BAR +2B30..2B44 ; Math # Sm [21] LEFT ARROW WITH SMALL CIRCLE..RIGHTWARDS ARROW THROUGH SUPERSET +2B47..2B4C ; Math # Sm [6] REVERSE TILDE OPERATOR ABOVE RIGHTWARDS ARROW..RIGHTWARDS ARROW ABOVE REVERSE TILDE OPERATOR +FB29 ; Math # Sm HEBREW LETTER ALTERNATIVE PLUS SIGN +FE61 ; Math # Po SMALL ASTERISK +FE62 ; Math # Sm SMALL PLUS SIGN +FE63 ; Math # Pd SMALL HYPHEN-MINUS +FE64..FE66 ; Math # Sm [3] SMALL LESS-THAN SIGN..SMALL EQUALS SIGN +FE68 ; Math # Po SMALL REVERSE SOLIDUS +FF0B ; Math # Sm FULLWIDTH PLUS SIGN +FF1C..FF1E ; Math # Sm [3] FULLWIDTH LESS-THAN SIGN..FULLWIDTH GREATER-THAN SIGN +FF3C ; Math # Po FULLWIDTH REVERSE SOLIDUS +FF3E ; Math # Sk FULLWIDTH CIRCUMFLEX ACCENT +FF5C ; Math # Sm FULLWIDTH VERTICAL LINE +FF5E ; Math # Sm FULLWIDTH TILDE +FFE2 ; Math # Sm FULLWIDTH NOT SIGN +FFE9..FFEC ; Math # Sm [4] HALFWIDTH LEFTWARDS ARROW..HALFWIDTH DOWNWARDS ARROW +1D400..1D454 ; Math # L& [85] MATHEMATICAL BOLD CAPITAL A..MATHEMATICAL ITALIC SMALL G +1D456..1D49C ; Math # L& [71] MATHEMATICAL ITALIC SMALL I..MATHEMATICAL SCRIPT CAPITAL A +1D49E..1D49F ; Math # L& [2] MATHEMATICAL SCRIPT CAPITAL C..MATHEMATICAL SCRIPT CAPITAL D +1D4A2 ; Math # L& MATHEMATICAL SCRIPT CAPITAL G +1D4A5..1D4A6 ; Math # L& [2] MATHEMATICAL SCRIPT CAPITAL J..MATHEMATICAL SCRIPT CAPITAL K +1D4A9..1D4AC ; Math # L& [4] MATHEMATICAL SCRIPT CAPITAL N..MATHEMATICAL SCRIPT CAPITAL Q +1D4AE..1D4B9 ; Math # L& [12] MATHEMATICAL SCRIPT CAPITAL S..MATHEMATICAL SCRIPT SMALL D +1D4BB ; Math # L& MATHEMATICAL SCRIPT SMALL F +1D4BD..1D4C3 ; Math # L& [7] MATHEMATICAL SCRIPT SMALL H..MATHEMATICAL SCRIPT SMALL N +1D4C5..1D505 ; Math # L& [65] MATHEMATICAL SCRIPT SMALL P..MATHEMATICAL FRAKTUR CAPITAL B +1D507..1D50A ; Math # L& [4] MATHEMATICAL FRAKTUR CAPITAL D..MATHEMATICAL FRAKTUR CAPITAL G +1D50D..1D514 ; Math # L& [8] MATHEMATICAL FRAKTUR CAPITAL J..MATHEMATICAL FRAKTUR CAPITAL Q +1D516..1D51C ; Math # L& [7] MATHEMATICAL FRAKTUR CAPITAL S..MATHEMATICAL FRAKTUR CAPITAL Y +1D51E..1D539 ; Math # L& [28] MATHEMATICAL FRAKTUR SMALL A..MATHEMATICAL DOUBLE-STRUCK CAPITAL B +1D53B..1D53E ; Math # L& [4] MATHEMATICAL DOUBLE-STRUCK CAPITAL D..MATHEMATICAL DOUBLE-STRUCK CAPITAL G +1D540..1D544 ; Math # L& [5] MATHEMATICAL DOUBLE-STRUCK CAPITAL I..MATHEMATICAL DOUBLE-STRUCK CAPITAL M +1D546 ; Math # L& MATHEMATICAL DOUBLE-STRUCK CAPITAL O +1D54A..1D550 ; Math # L& [7] MATHEMATICAL DOUBLE-STRUCK CAPITAL S..MATHEMATICAL DOUBLE-STRUCK CAPITAL Y +1D552..1D6A5 ; Math # L& [340] MATHEMATICAL DOUBLE-STRUCK SMALL A..MATHEMATICAL ITALIC SMALL DOTLESS J +1D6A8..1D6C0 ; Math # L& [25] MATHEMATICAL BOLD CAPITAL ALPHA..MATHEMATICAL BOLD CAPITAL OMEGA +1D6C1 ; Math # Sm MATHEMATICAL BOLD NABLA +1D6C2..1D6DA ; Math # L& [25] MATHEMATICAL BOLD SMALL ALPHA..MATHEMATICAL BOLD SMALL OMEGA +1D6DB ; Math # Sm MATHEMATICAL BOLD PARTIAL DIFFERENTIAL +1D6DC..1D6FA ; Math # L& [31] MATHEMATICAL BOLD EPSILON SYMBOL..MATHEMATICAL ITALIC CAPITAL OMEGA +1D6FB ; Math # Sm MATHEMATICAL ITALIC NABLA +1D6FC..1D714 ; Math # L& [25] MATHEMATICAL ITALIC SMALL ALPHA..MATHEMATICAL ITALIC SMALL OMEGA +1D715 ; Math # Sm MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL +1D716..1D734 ; Math # L& [31] MATHEMATICAL ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD ITALIC CAPITAL OMEGA +1D735 ; Math # Sm MATHEMATICAL BOLD ITALIC NABLA +1D736..1D74E ; Math # L& [25] MATHEMATICAL BOLD ITALIC SMALL ALPHA..MATHEMATICAL BOLD ITALIC SMALL OMEGA +1D74F ; Math # Sm MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL +1D750..1D76E ; Math # L& [31] MATHEMATICAL BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA +1D76F ; Math # Sm MATHEMATICAL SANS-SERIF BOLD NABLA +1D770..1D788 ; Math # L& [25] MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA +1D789 ; Math # Sm MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL +1D78A..1D7A8 ; Math # L& [31] MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA +1D7A9 ; Math # Sm MATHEMATICAL SANS-SERIF BOLD ITALIC NABLA +1D7AA..1D7C2 ; Math # L& [25] MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA +1D7C3 ; Math # Sm MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL +1D7C4..1D7CB ; Math # L& [8] MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD SMALL DIGAMMA +1D7CE..1D7FF ; Math # Nd [50] MATHEMATICAL BOLD DIGIT ZERO..MATHEMATICAL MONOSPACE DIGIT NINE +1EE00..1EE03 ; Math # Lo [4] ARABIC MATHEMATICAL ALEF..ARABIC MATHEMATICAL DAL +1EE05..1EE1F ; Math # Lo [27] ARABIC MATHEMATICAL WAW..ARABIC MATHEMATICAL DOTLESS QAF +1EE21..1EE22 ; Math # Lo [2] ARABIC MATHEMATICAL INITIAL BEH..ARABIC MATHEMATICAL INITIAL JEEM +1EE24 ; Math # Lo ARABIC MATHEMATICAL INITIAL HEH +1EE27 ; Math # Lo ARABIC MATHEMATICAL INITIAL HAH +1EE29..1EE32 ; Math # Lo [10] ARABIC MATHEMATICAL INITIAL YEH..ARABIC MATHEMATICAL INITIAL QAF +1EE34..1EE37 ; Math # Lo [4] ARABIC MATHEMATICAL INITIAL SHEEN..ARABIC MATHEMATICAL INITIAL KHAH +1EE39 ; Math # Lo ARABIC MATHEMATICAL INITIAL DAD +1EE3B ; Math # Lo ARABIC MATHEMATICAL INITIAL GHAIN +1EE42 ; Math # Lo ARABIC MATHEMATICAL TAILED JEEM +1EE47 ; Math # Lo ARABIC MATHEMATICAL TAILED HAH +1EE49 ; Math # Lo ARABIC MATHEMATICAL TAILED YEH +1EE4B ; Math # Lo ARABIC MATHEMATICAL TAILED LAM +1EE4D..1EE4F ; Math # Lo [3] ARABIC MATHEMATICAL TAILED NOON..ARABIC MATHEMATICAL TAILED AIN +1EE51..1EE52 ; Math # Lo [2] ARABIC MATHEMATICAL TAILED SAD..ARABIC MATHEMATICAL TAILED QAF +1EE54 ; Math # Lo ARABIC MATHEMATICAL TAILED SHEEN +1EE57 ; Math # Lo ARABIC MATHEMATICAL TAILED KHAH +1EE59 ; Math # Lo ARABIC MATHEMATICAL TAILED DAD +1EE5B ; Math # Lo ARABIC MATHEMATICAL TAILED GHAIN +1EE5D ; Math # Lo ARABIC MATHEMATICAL TAILED DOTLESS NOON +1EE5F ; Math # Lo ARABIC MATHEMATICAL TAILED DOTLESS QAF +1EE61..1EE62 ; Math # Lo [2] ARABIC MATHEMATICAL STRETCHED BEH..ARABIC MATHEMATICAL STRETCHED JEEM +1EE64 ; Math # Lo ARABIC MATHEMATICAL STRETCHED HEH +1EE67..1EE6A ; Math # Lo [4] ARABIC MATHEMATICAL STRETCHED HAH..ARABIC MATHEMATICAL STRETCHED KAF +1EE6C..1EE72 ; Math # Lo [7] ARABIC MATHEMATICAL STRETCHED MEEM..ARABIC MATHEMATICAL STRETCHED QAF +1EE74..1EE77 ; Math # Lo [4] ARABIC MATHEMATICAL STRETCHED SHEEN..ARABIC MATHEMATICAL STRETCHED KHAH +1EE79..1EE7C ; Math # Lo [4] ARABIC MATHEMATICAL STRETCHED DAD..ARABIC MATHEMATICAL STRETCHED DOTLESS BEH +1EE7E ; Math # Lo ARABIC MATHEMATICAL STRETCHED DOTLESS FEH +1EE80..1EE89 ; Math # Lo [10] ARABIC MATHEMATICAL LOOPED ALEF..ARABIC MATHEMATICAL LOOPED YEH +1EE8B..1EE9B ; Math # Lo [17] ARABIC MATHEMATICAL LOOPED LAM..ARABIC MATHEMATICAL LOOPED GHAIN +1EEA1..1EEA3 ; Math # Lo [3] ARABIC MATHEMATICAL DOUBLE-STRUCK BEH..ARABIC MATHEMATICAL DOUBLE-STRUCK DAL +1EEA5..1EEA9 ; Math # Lo [5] ARABIC MATHEMATICAL DOUBLE-STRUCK WAW..ARABIC MATHEMATICAL DOUBLE-STRUCK YEH +1EEAB..1EEBB ; Math # Lo [17] ARABIC MATHEMATICAL DOUBLE-STRUCK LAM..ARABIC MATHEMATICAL DOUBLE-STRUCK GHAIN +1EEF0..1EEF1 ; Math # Sm [2] ARABIC MATHEMATICAL OPERATOR MEEM WITH HAH WITH TATWEEL..ARABIC MATHEMATICAL OPERATOR HAH WITH DAL + +# Total code points: 2310 + +# ================================================ + +# Derived Property: Alphabetic +# Generated from: Uppercase + Lowercase + Lt + Lm + Lo + Nl + Other_Alphabetic + +0041..005A ; Alphabetic # L& [26] LATIN CAPITAL LETTER A..LATIN CAPITAL LETTER Z +0061..007A ; Alphabetic # L& [26] LATIN SMALL LETTER A..LATIN SMALL LETTER Z +00AA ; Alphabetic # Lo FEMININE ORDINAL INDICATOR +00B5 ; Alphabetic # L& MICRO SIGN +00BA ; Alphabetic # Lo MASCULINE ORDINAL INDICATOR +00C0..00D6 ; Alphabetic # L& [23] LATIN CAPITAL LETTER A WITH GRAVE..LATIN CAPITAL LETTER O WITH DIAERESIS +00D8..00F6 ; Alphabetic # L& [31] LATIN CAPITAL LETTER O WITH STROKE..LATIN SMALL LETTER O WITH DIAERESIS +00F8..01BA ; Alphabetic # L& [195] LATIN SMALL LETTER O WITH STROKE..LATIN SMALL LETTER EZH WITH TAIL +01BB ; Alphabetic # Lo LATIN LETTER TWO WITH STROKE +01BC..01BF ; Alphabetic # L& [4] LATIN CAPITAL LETTER TONE FIVE..LATIN LETTER WYNN +01C0..01C3 ; Alphabetic # Lo [4] LATIN LETTER DENTAL CLICK..LATIN LETTER RETROFLEX CLICK +01C4..0293 ; Alphabetic # L& [208] LATIN CAPITAL LETTER DZ WITH CARON..LATIN SMALL LETTER EZH WITH CURL +0294 ; Alphabetic # Lo LATIN LETTER GLOTTAL STOP +0295..02AF ; Alphabetic # L& [27] LATIN LETTER PHARYNGEAL VOICED FRICATIVE..LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL +02B0..02C1 ; Alphabetic # Lm [18] MODIFIER LETTER SMALL H..MODIFIER LETTER REVERSED GLOTTAL STOP +02C6..02D1 ; Alphabetic # Lm [12] MODIFIER LETTER CIRCUMFLEX ACCENT..MODIFIER LETTER HALF TRIANGULAR COLON +02E0..02E4 ; Alphabetic # Lm [5] MODIFIER LETTER SMALL GAMMA..MODIFIER LETTER SMALL REVERSED GLOTTAL STOP +02EC ; Alphabetic # Lm MODIFIER LETTER VOICING +02EE ; Alphabetic # Lm MODIFIER LETTER DOUBLE APOSTROPHE +0345 ; Alphabetic # Mn COMBINING GREEK YPOGEGRAMMENI +0370..0373 ; Alphabetic # L& [4] GREEK CAPITAL LETTER HETA..GREEK SMALL LETTER ARCHAIC SAMPI +0374 ; Alphabetic # Lm GREEK NUMERAL SIGN +0376..0377 ; Alphabetic # L& [2] GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA..GREEK SMALL LETTER PAMPHYLIAN DIGAMMA +037A ; Alphabetic # Lm GREEK YPOGEGRAMMENI +037B..037D ; Alphabetic # L& [3] GREEK SMALL REVERSED LUNATE SIGMA SYMBOL..GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL +037F ; Alphabetic # L& GREEK CAPITAL LETTER YOT +0386 ; Alphabetic # L& GREEK CAPITAL LETTER ALPHA WITH TONOS +0388..038A ; Alphabetic # L& [3] GREEK CAPITAL LETTER EPSILON WITH TONOS..GREEK CAPITAL LETTER IOTA WITH TONOS +038C ; Alphabetic # L& GREEK CAPITAL LETTER OMICRON WITH TONOS +038E..03A1 ; Alphabetic # L& [20] GREEK CAPITAL LETTER UPSILON WITH TONOS..GREEK CAPITAL LETTER RHO +03A3..03F5 ; Alphabetic # L& [83] GREEK CAPITAL LETTER SIGMA..GREEK LUNATE EPSILON SYMBOL +03F7..0481 ; Alphabetic # L& [139] GREEK CAPITAL LETTER SHO..CYRILLIC SMALL LETTER KOPPA +048A..052F ; Alphabetic # L& [166] CYRILLIC CAPITAL LETTER SHORT I WITH TAIL..CYRILLIC SMALL LETTER EL WITH DESCENDER +0531..0556 ; Alphabetic # L& [38] ARMENIAN CAPITAL LETTER AYB..ARMENIAN CAPITAL LETTER FEH +0559 ; Alphabetic # Lm ARMENIAN MODIFIER LETTER LEFT HALF RING +0560..0588 ; Alphabetic # L& [41] ARMENIAN SMALL LETTER TURNED AYB..ARMENIAN SMALL LETTER YI WITH STROKE +05B0..05BD ; Alphabetic # Mn [14] HEBREW POINT SHEVA..HEBREW POINT METEG +05BF ; Alphabetic # Mn HEBREW POINT RAFE +05C1..05C2 ; Alphabetic # Mn [2] HEBREW POINT SHIN DOT..HEBREW POINT SIN DOT +05C4..05C5 ; Alphabetic # Mn [2] HEBREW MARK UPPER DOT..HEBREW MARK LOWER DOT +05C7 ; Alphabetic # Mn HEBREW POINT QAMATS QATAN +05D0..05EA ; Alphabetic # Lo [27] HEBREW LETTER ALEF..HEBREW LETTER TAV +05EF..05F2 ; Alphabetic # Lo [4] HEBREW YOD TRIANGLE..HEBREW LIGATURE YIDDISH DOUBLE YOD +0610..061A ; Alphabetic # Mn [11] ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM..ARABIC SMALL KASRA +0620..063F ; Alphabetic # Lo [32] ARABIC LETTER KASHMIRI YEH..ARABIC LETTER FARSI YEH WITH THREE DOTS ABOVE +0640 ; Alphabetic # Lm ARABIC TATWEEL +0641..064A ; Alphabetic # Lo [10] ARABIC LETTER FEH..ARABIC LETTER YEH +064B..0657 ; Alphabetic # Mn [13] ARABIC FATHATAN..ARABIC INVERTED DAMMA +0659..065F ; Alphabetic # Mn [7] ARABIC ZWARAKAY..ARABIC WAVY HAMZA BELOW +066E..066F ; Alphabetic # Lo [2] ARABIC LETTER DOTLESS BEH..ARABIC LETTER DOTLESS QAF +0670 ; Alphabetic # Mn ARABIC LETTER SUPERSCRIPT ALEF +0671..06D3 ; Alphabetic # Lo [99] ARABIC LETTER ALEF WASLA..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE +06D5 ; Alphabetic # Lo ARABIC LETTER AE +06D6..06DC ; Alphabetic # Mn [7] ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA..ARABIC SMALL HIGH SEEN +06E1..06E4 ; Alphabetic # Mn [4] ARABIC SMALL HIGH DOTLESS HEAD OF KHAH..ARABIC SMALL HIGH MADDA +06E5..06E6 ; Alphabetic # Lm [2] ARABIC SMALL WAW..ARABIC SMALL YEH +06E7..06E8 ; Alphabetic # Mn [2] ARABIC SMALL HIGH YEH..ARABIC SMALL HIGH NOON +06ED ; Alphabetic # Mn ARABIC SMALL LOW MEEM +06EE..06EF ; Alphabetic # Lo [2] ARABIC LETTER DAL WITH INVERTED V..ARABIC LETTER REH WITH INVERTED V +06FA..06FC ; Alphabetic # Lo [3] ARABIC LETTER SHEEN WITH DOT BELOW..ARABIC LETTER GHAIN WITH DOT BELOW +06FF ; Alphabetic # Lo ARABIC LETTER HEH WITH INVERTED V +0710 ; Alphabetic # Lo SYRIAC LETTER ALAPH +0711 ; Alphabetic # Mn SYRIAC LETTER SUPERSCRIPT ALAPH +0712..072F ; Alphabetic # Lo [30] SYRIAC LETTER BETH..SYRIAC LETTER PERSIAN DHALATH +0730..073F ; Alphabetic # Mn [16] SYRIAC PTHAHA ABOVE..SYRIAC RWAHA +074D..07A5 ; Alphabetic # Lo [89] SYRIAC LETTER SOGDIAN ZHAIN..THAANA LETTER WAAVU +07A6..07B0 ; Alphabetic # Mn [11] THAANA ABAFILI..THAANA SUKUN +07B1 ; Alphabetic # Lo THAANA LETTER NAA +07CA..07EA ; Alphabetic # Lo [33] NKO LETTER A..NKO LETTER JONA RA +07F4..07F5 ; Alphabetic # Lm [2] NKO HIGH TONE APOSTROPHE..NKO LOW TONE APOSTROPHE +07FA ; Alphabetic # Lm NKO LAJANYALAN +0800..0815 ; Alphabetic # Lo [22] SAMARITAN LETTER ALAF..SAMARITAN LETTER TAAF +0816..0817 ; Alphabetic # Mn [2] SAMARITAN MARK IN..SAMARITAN MARK IN-ALAF +081A ; Alphabetic # Lm SAMARITAN MODIFIER LETTER EPENTHETIC YUT +081B..0823 ; Alphabetic # Mn [9] SAMARITAN MARK EPENTHETIC YUT..SAMARITAN VOWEL SIGN A +0824 ; Alphabetic # Lm SAMARITAN MODIFIER LETTER SHORT A +0825..0827 ; Alphabetic # Mn [3] SAMARITAN VOWEL SIGN SHORT A..SAMARITAN VOWEL SIGN U +0828 ; Alphabetic # Lm SAMARITAN MODIFIER LETTER I +0829..082C ; Alphabetic # Mn [4] SAMARITAN VOWEL SIGN LONG I..SAMARITAN VOWEL SIGN SUKUN +0840..0858 ; Alphabetic # Lo [25] MANDAIC LETTER HALQA..MANDAIC LETTER AIN +0860..086A ; Alphabetic # Lo [11] SYRIAC LETTER MALAYALAM NGA..SYRIAC LETTER MALAYALAM SSA +08A0..08B4 ; Alphabetic # Lo [21] ARABIC LETTER BEH WITH SMALL V BELOW..ARABIC LETTER KAF WITH DOT BELOW +08B6..08BD ; Alphabetic # Lo [8] ARABIC LETTER BEH WITH SMALL MEEM ABOVE..ARABIC LETTER AFRICAN NOON +08D4..08DF ; Alphabetic # Mn [12] ARABIC SMALL HIGH WORD AR-RUB..ARABIC SMALL HIGH WORD WAQFA +08E3..08E9 ; Alphabetic # Mn [7] ARABIC TURNED DAMMA BELOW..ARABIC CURLY KASRATAN +08F0..0902 ; Alphabetic # Mn [19] ARABIC OPEN FATHATAN..DEVANAGARI SIGN ANUSVARA +0903 ; Alphabetic # Mc DEVANAGARI SIGN VISARGA +0904..0939 ; Alphabetic # Lo [54] DEVANAGARI LETTER SHORT A..DEVANAGARI LETTER HA +093A ; Alphabetic # Mn DEVANAGARI VOWEL SIGN OE +093B ; Alphabetic # Mc DEVANAGARI VOWEL SIGN OOE +093D ; Alphabetic # Lo DEVANAGARI SIGN AVAGRAHA +093E..0940 ; Alphabetic # Mc [3] DEVANAGARI VOWEL SIGN AA..DEVANAGARI VOWEL SIGN II +0941..0948 ; Alphabetic # Mn [8] DEVANAGARI VOWEL SIGN U..DEVANAGARI VOWEL SIGN AI +0949..094C ; Alphabetic # Mc [4] DEVANAGARI VOWEL SIGN CANDRA O..DEVANAGARI VOWEL SIGN AU +094E..094F ; Alphabetic # Mc [2] DEVANAGARI VOWEL SIGN PRISHTHAMATRA E..DEVANAGARI VOWEL SIGN AW +0950 ; Alphabetic # Lo DEVANAGARI OM +0955..0957 ; Alphabetic # Mn [3] DEVANAGARI VOWEL SIGN CANDRA LONG E..DEVANAGARI VOWEL SIGN UUE +0958..0961 ; Alphabetic # Lo [10] DEVANAGARI LETTER QA..DEVANAGARI LETTER VOCALIC LL +0962..0963 ; Alphabetic # Mn [2] DEVANAGARI VOWEL SIGN VOCALIC L..DEVANAGARI VOWEL SIGN VOCALIC LL +0971 ; Alphabetic # Lm DEVANAGARI SIGN HIGH SPACING DOT +0972..0980 ; Alphabetic # Lo [15] DEVANAGARI LETTER CANDRA A..BENGALI ANJI +0981 ; Alphabetic # Mn BENGALI SIGN CANDRABINDU +0982..0983 ; Alphabetic # Mc [2] BENGALI SIGN ANUSVARA..BENGALI SIGN VISARGA +0985..098C ; Alphabetic # Lo [8] BENGALI LETTER A..BENGALI LETTER VOCALIC L +098F..0990 ; Alphabetic # Lo [2] BENGALI LETTER E..BENGALI LETTER AI +0993..09A8 ; Alphabetic # Lo [22] BENGALI LETTER O..BENGALI LETTER NA +09AA..09B0 ; Alphabetic # Lo [7] BENGALI LETTER PA..BENGALI LETTER RA +09B2 ; Alphabetic # Lo BENGALI LETTER LA +09B6..09B9 ; Alphabetic # Lo [4] BENGALI LETTER SHA..BENGALI LETTER HA +09BD ; Alphabetic # Lo BENGALI SIGN AVAGRAHA +09BE..09C0 ; Alphabetic # Mc [3] BENGALI VOWEL SIGN AA..BENGALI VOWEL SIGN II +09C1..09C4 ; Alphabetic # Mn [4] BENGALI VOWEL SIGN U..BENGALI VOWEL SIGN VOCALIC RR +09C7..09C8 ; Alphabetic # Mc [2] BENGALI VOWEL SIGN E..BENGALI VOWEL SIGN AI +09CB..09CC ; Alphabetic # Mc [2] BENGALI VOWEL SIGN O..BENGALI VOWEL SIGN AU +09CE ; Alphabetic # Lo BENGALI LETTER KHANDA TA +09D7 ; Alphabetic # Mc BENGALI AU LENGTH MARK +09DC..09DD ; Alphabetic # Lo [2] BENGALI LETTER RRA..BENGALI LETTER RHA +09DF..09E1 ; Alphabetic # Lo [3] BENGALI LETTER YYA..BENGALI LETTER VOCALIC LL +09E2..09E3 ; Alphabetic # Mn [2] BENGALI VOWEL SIGN VOCALIC L..BENGALI VOWEL SIGN VOCALIC LL +09F0..09F1 ; Alphabetic # Lo [2] BENGALI LETTER RA WITH MIDDLE DIAGONAL..BENGALI LETTER RA WITH LOWER DIAGONAL +09FC ; Alphabetic # Lo BENGALI LETTER VEDIC ANUSVARA +0A01..0A02 ; Alphabetic # Mn [2] GURMUKHI SIGN ADAK BINDI..GURMUKHI SIGN BINDI +0A03 ; Alphabetic # Mc GURMUKHI SIGN VISARGA +0A05..0A0A ; Alphabetic # Lo [6] GURMUKHI LETTER A..GURMUKHI LETTER UU +0A0F..0A10 ; Alphabetic # Lo [2] GURMUKHI LETTER EE..GURMUKHI LETTER AI +0A13..0A28 ; Alphabetic # Lo [22] GURMUKHI LETTER OO..GURMUKHI LETTER NA +0A2A..0A30 ; Alphabetic # Lo [7] GURMUKHI LETTER PA..GURMUKHI LETTER RA +0A32..0A33 ; Alphabetic # Lo [2] GURMUKHI LETTER LA..GURMUKHI LETTER LLA +0A35..0A36 ; Alphabetic # Lo [2] GURMUKHI LETTER VA..GURMUKHI LETTER SHA +0A38..0A39 ; Alphabetic # Lo [2] GURMUKHI LETTER SA..GURMUKHI LETTER HA +0A3E..0A40 ; Alphabetic # Mc [3] GURMUKHI VOWEL SIGN AA..GURMUKHI VOWEL SIGN II +0A41..0A42 ; Alphabetic # Mn [2] GURMUKHI VOWEL SIGN U..GURMUKHI VOWEL SIGN UU +0A47..0A48 ; Alphabetic # Mn [2] GURMUKHI VOWEL SIGN EE..GURMUKHI VOWEL SIGN AI +0A4B..0A4C ; Alphabetic # Mn [2] GURMUKHI VOWEL SIGN OO..GURMUKHI VOWEL SIGN AU +0A51 ; Alphabetic # Mn GURMUKHI SIGN UDAAT +0A59..0A5C ; Alphabetic # Lo [4] GURMUKHI LETTER KHHA..GURMUKHI LETTER RRA +0A5E ; Alphabetic # Lo GURMUKHI LETTER FA +0A70..0A71 ; Alphabetic # Mn [2] GURMUKHI TIPPI..GURMUKHI ADDAK +0A72..0A74 ; Alphabetic # Lo [3] GURMUKHI IRI..GURMUKHI EK ONKAR +0A75 ; Alphabetic # Mn GURMUKHI SIGN YAKASH +0A81..0A82 ; Alphabetic # Mn [2] GUJARATI SIGN CANDRABINDU..GUJARATI SIGN ANUSVARA +0A83 ; Alphabetic # Mc GUJARATI SIGN VISARGA +0A85..0A8D ; Alphabetic # Lo [9] GUJARATI LETTER A..GUJARATI VOWEL CANDRA E +0A8F..0A91 ; Alphabetic # Lo [3] GUJARATI LETTER E..GUJARATI VOWEL CANDRA O +0A93..0AA8 ; Alphabetic # Lo [22] GUJARATI LETTER O..GUJARATI LETTER NA +0AAA..0AB0 ; Alphabetic # Lo [7] GUJARATI LETTER PA..GUJARATI LETTER RA +0AB2..0AB3 ; Alphabetic # Lo [2] GUJARATI LETTER LA..GUJARATI LETTER LLA +0AB5..0AB9 ; Alphabetic # Lo [5] GUJARATI LETTER VA..GUJARATI LETTER HA +0ABD ; Alphabetic # Lo GUJARATI SIGN AVAGRAHA +0ABE..0AC0 ; Alphabetic # Mc [3] GUJARATI VOWEL SIGN AA..GUJARATI VOWEL SIGN II +0AC1..0AC5 ; Alphabetic # Mn [5] GUJARATI VOWEL SIGN U..GUJARATI VOWEL SIGN CANDRA E +0AC7..0AC8 ; Alphabetic # Mn [2] GUJARATI VOWEL SIGN E..GUJARATI VOWEL SIGN AI +0AC9 ; Alphabetic # Mc GUJARATI VOWEL SIGN CANDRA O +0ACB..0ACC ; Alphabetic # Mc [2] GUJARATI VOWEL SIGN O..GUJARATI VOWEL SIGN AU +0AD0 ; Alphabetic # Lo GUJARATI OM +0AE0..0AE1 ; Alphabetic # Lo [2] GUJARATI LETTER VOCALIC RR..GUJARATI LETTER VOCALIC LL +0AE2..0AE3 ; Alphabetic # Mn [2] GUJARATI VOWEL SIGN VOCALIC L..GUJARATI VOWEL SIGN VOCALIC LL +0AF9 ; Alphabetic # Lo GUJARATI LETTER ZHA +0AFA..0AFC ; Alphabetic # Mn [3] GUJARATI SIGN SUKUN..GUJARATI SIGN MADDAH +0B01 ; Alphabetic # Mn ORIYA SIGN CANDRABINDU +0B02..0B03 ; Alphabetic # Mc [2] ORIYA SIGN ANUSVARA..ORIYA SIGN VISARGA +0B05..0B0C ; Alphabetic # Lo [8] ORIYA LETTER A..ORIYA LETTER VOCALIC L +0B0F..0B10 ; Alphabetic # Lo [2] ORIYA LETTER E..ORIYA LETTER AI +0B13..0B28 ; Alphabetic # Lo [22] ORIYA LETTER O..ORIYA LETTER NA +0B2A..0B30 ; Alphabetic # Lo [7] ORIYA LETTER PA..ORIYA LETTER RA +0B32..0B33 ; Alphabetic # Lo [2] ORIYA LETTER LA..ORIYA LETTER LLA +0B35..0B39 ; Alphabetic # Lo [5] ORIYA LETTER VA..ORIYA LETTER HA +0B3D ; Alphabetic # Lo ORIYA SIGN AVAGRAHA +0B3E ; Alphabetic # Mc ORIYA VOWEL SIGN AA +0B3F ; Alphabetic # Mn ORIYA VOWEL SIGN I +0B40 ; Alphabetic # Mc ORIYA VOWEL SIGN II +0B41..0B44 ; Alphabetic # Mn [4] ORIYA VOWEL SIGN U..ORIYA VOWEL SIGN VOCALIC RR +0B47..0B48 ; Alphabetic # Mc [2] ORIYA VOWEL SIGN E..ORIYA VOWEL SIGN AI +0B4B..0B4C ; Alphabetic # Mc [2] ORIYA VOWEL SIGN O..ORIYA VOWEL SIGN AU +0B56 ; Alphabetic # Mn ORIYA AI LENGTH MARK +0B57 ; Alphabetic # Mc ORIYA AU LENGTH MARK +0B5C..0B5D ; Alphabetic # Lo [2] ORIYA LETTER RRA..ORIYA LETTER RHA +0B5F..0B61 ; Alphabetic # Lo [3] ORIYA LETTER YYA..ORIYA LETTER VOCALIC LL +0B62..0B63 ; Alphabetic # Mn [2] ORIYA VOWEL SIGN VOCALIC L..ORIYA VOWEL SIGN VOCALIC LL +0B71 ; Alphabetic # Lo ORIYA LETTER WA +0B82 ; Alphabetic # Mn TAMIL SIGN ANUSVARA +0B83 ; Alphabetic # Lo TAMIL SIGN VISARGA +0B85..0B8A ; Alphabetic # Lo [6] TAMIL LETTER A..TAMIL LETTER UU +0B8E..0B90 ; Alphabetic # Lo [3] TAMIL LETTER E..TAMIL LETTER AI +0B92..0B95 ; Alphabetic # Lo [4] TAMIL LETTER O..TAMIL LETTER KA +0B99..0B9A ; Alphabetic # Lo [2] TAMIL LETTER NGA..TAMIL LETTER CA +0B9C ; Alphabetic # Lo TAMIL LETTER JA +0B9E..0B9F ; Alphabetic # Lo [2] TAMIL LETTER NYA..TAMIL LETTER TTA +0BA3..0BA4 ; Alphabetic # Lo [2] TAMIL LETTER NNA..TAMIL LETTER TA +0BA8..0BAA ; Alphabetic # Lo [3] TAMIL LETTER NA..TAMIL LETTER PA +0BAE..0BB9 ; Alphabetic # Lo [12] TAMIL LETTER MA..TAMIL LETTER HA +0BBE..0BBF ; Alphabetic # Mc [2] TAMIL VOWEL SIGN AA..TAMIL VOWEL SIGN I +0BC0 ; Alphabetic # Mn TAMIL VOWEL SIGN II +0BC1..0BC2 ; Alphabetic # Mc [2] TAMIL VOWEL SIGN U..TAMIL VOWEL SIGN UU +0BC6..0BC8 ; Alphabetic # Mc [3] TAMIL VOWEL SIGN E..TAMIL VOWEL SIGN AI +0BCA..0BCC ; Alphabetic # Mc [3] TAMIL VOWEL SIGN O..TAMIL VOWEL SIGN AU +0BD0 ; Alphabetic # Lo TAMIL OM +0BD7 ; Alphabetic # Mc TAMIL AU LENGTH MARK +0C00 ; Alphabetic # Mn TELUGU SIGN COMBINING CANDRABINDU ABOVE +0C01..0C03 ; Alphabetic # Mc [3] TELUGU SIGN CANDRABINDU..TELUGU SIGN VISARGA +0C05..0C0C ; Alphabetic # Lo [8] TELUGU LETTER A..TELUGU LETTER VOCALIC L +0C0E..0C10 ; Alphabetic # Lo [3] TELUGU LETTER E..TELUGU LETTER AI +0C12..0C28 ; Alphabetic # Lo [23] TELUGU LETTER O..TELUGU LETTER NA +0C2A..0C39 ; Alphabetic # Lo [16] TELUGU LETTER PA..TELUGU LETTER HA +0C3D ; Alphabetic # Lo TELUGU SIGN AVAGRAHA +0C3E..0C40 ; Alphabetic # Mn [3] TELUGU VOWEL SIGN AA..TELUGU VOWEL SIGN II +0C41..0C44 ; Alphabetic # Mc [4] TELUGU VOWEL SIGN U..TELUGU VOWEL SIGN VOCALIC RR +0C46..0C48 ; Alphabetic # Mn [3] TELUGU VOWEL SIGN E..TELUGU VOWEL SIGN AI +0C4A..0C4C ; Alphabetic # Mn [3] TELUGU VOWEL SIGN O..TELUGU VOWEL SIGN AU +0C55..0C56 ; Alphabetic # Mn [2] TELUGU LENGTH MARK..TELUGU AI LENGTH MARK +0C58..0C5A ; Alphabetic # Lo [3] TELUGU LETTER TSA..TELUGU LETTER RRRA +0C60..0C61 ; Alphabetic # Lo [2] TELUGU LETTER VOCALIC RR..TELUGU LETTER VOCALIC LL +0C62..0C63 ; Alphabetic # Mn [2] TELUGU VOWEL SIGN VOCALIC L..TELUGU VOWEL SIGN VOCALIC LL +0C80 ; Alphabetic # Lo KANNADA SIGN SPACING CANDRABINDU +0C81 ; Alphabetic # Mn KANNADA SIGN CANDRABINDU +0C82..0C83 ; Alphabetic # Mc [2] KANNADA SIGN ANUSVARA..KANNADA SIGN VISARGA +0C85..0C8C ; Alphabetic # Lo [8] KANNADA LETTER A..KANNADA LETTER VOCALIC L +0C8E..0C90 ; Alphabetic # Lo [3] KANNADA LETTER E..KANNADA LETTER AI +0C92..0CA8 ; Alphabetic # Lo [23] KANNADA LETTER O..KANNADA LETTER NA +0CAA..0CB3 ; Alphabetic # Lo [10] KANNADA LETTER PA..KANNADA LETTER LLA +0CB5..0CB9 ; Alphabetic # Lo [5] KANNADA LETTER VA..KANNADA LETTER HA +0CBD ; Alphabetic # Lo KANNADA SIGN AVAGRAHA +0CBE ; Alphabetic # Mc KANNADA VOWEL SIGN AA +0CBF ; Alphabetic # Mn KANNADA VOWEL SIGN I +0CC0..0CC4 ; Alphabetic # Mc [5] KANNADA VOWEL SIGN II..KANNADA VOWEL SIGN VOCALIC RR +0CC6 ; Alphabetic # Mn KANNADA VOWEL SIGN E +0CC7..0CC8 ; Alphabetic # Mc [2] KANNADA VOWEL SIGN EE..KANNADA VOWEL SIGN AI +0CCA..0CCB ; Alphabetic # Mc [2] KANNADA VOWEL SIGN O..KANNADA VOWEL SIGN OO +0CCC ; Alphabetic # Mn KANNADA VOWEL SIGN AU +0CD5..0CD6 ; Alphabetic # Mc [2] KANNADA LENGTH MARK..KANNADA AI LENGTH MARK +0CDE ; Alphabetic # Lo KANNADA LETTER FA +0CE0..0CE1 ; Alphabetic # Lo [2] KANNADA LETTER VOCALIC RR..KANNADA LETTER VOCALIC LL +0CE2..0CE3 ; Alphabetic # Mn [2] KANNADA VOWEL SIGN VOCALIC L..KANNADA VOWEL SIGN VOCALIC LL +0CF1..0CF2 ; Alphabetic # Lo [2] KANNADA SIGN JIHVAMULIYA..KANNADA SIGN UPADHMANIYA +0D00..0D01 ; Alphabetic # Mn [2] MALAYALAM SIGN COMBINING ANUSVARA ABOVE..MALAYALAM SIGN CANDRABINDU +0D02..0D03 ; Alphabetic # Mc [2] MALAYALAM SIGN ANUSVARA..MALAYALAM SIGN VISARGA +0D05..0D0C ; Alphabetic # Lo [8] MALAYALAM LETTER A..MALAYALAM LETTER VOCALIC L +0D0E..0D10 ; Alphabetic # Lo [3] MALAYALAM LETTER E..MALAYALAM LETTER AI +0D12..0D3A ; Alphabetic # Lo [41] MALAYALAM LETTER O..MALAYALAM LETTER TTTA +0D3D ; Alphabetic # Lo MALAYALAM SIGN AVAGRAHA +0D3E..0D40 ; Alphabetic # Mc [3] MALAYALAM VOWEL SIGN AA..MALAYALAM VOWEL SIGN II +0D41..0D44 ; Alphabetic # Mn [4] MALAYALAM VOWEL SIGN U..MALAYALAM VOWEL SIGN VOCALIC RR +0D46..0D48 ; Alphabetic # Mc [3] MALAYALAM VOWEL SIGN E..MALAYALAM VOWEL SIGN AI +0D4A..0D4C ; Alphabetic # Mc [3] MALAYALAM VOWEL SIGN O..MALAYALAM VOWEL SIGN AU +0D4E ; Alphabetic # Lo MALAYALAM LETTER DOT REPH +0D54..0D56 ; Alphabetic # Lo [3] MALAYALAM LETTER CHILLU M..MALAYALAM LETTER CHILLU LLL +0D57 ; Alphabetic # Mc MALAYALAM AU LENGTH MARK +0D5F..0D61 ; Alphabetic # Lo [3] MALAYALAM LETTER ARCHAIC II..MALAYALAM LETTER VOCALIC LL +0D62..0D63 ; Alphabetic # Mn [2] MALAYALAM VOWEL SIGN VOCALIC L..MALAYALAM VOWEL SIGN VOCALIC LL +0D7A..0D7F ; Alphabetic # Lo [6] MALAYALAM LETTER CHILLU NN..MALAYALAM LETTER CHILLU K +0D82..0D83 ; Alphabetic # Mc [2] SINHALA SIGN ANUSVARAYA..SINHALA SIGN VISARGAYA +0D85..0D96 ; Alphabetic # Lo [18] SINHALA LETTER AYANNA..SINHALA LETTER AUYANNA +0D9A..0DB1 ; Alphabetic # Lo [24] SINHALA LETTER ALPAPRAANA KAYANNA..SINHALA LETTER DANTAJA NAYANNA +0DB3..0DBB ; Alphabetic # Lo [9] SINHALA LETTER SANYAKA DAYANNA..SINHALA LETTER RAYANNA +0DBD ; Alphabetic # Lo SINHALA LETTER DANTAJA LAYANNA +0DC0..0DC6 ; Alphabetic # Lo [7] SINHALA LETTER VAYANNA..SINHALA LETTER FAYANNA +0DCF..0DD1 ; Alphabetic # Mc [3] SINHALA VOWEL SIGN AELA-PILLA..SINHALA VOWEL SIGN DIGA AEDA-PILLA +0DD2..0DD4 ; Alphabetic # Mn [3] SINHALA VOWEL SIGN KETTI IS-PILLA..SINHALA VOWEL SIGN KETTI PAA-PILLA +0DD6 ; Alphabetic # Mn SINHALA VOWEL SIGN DIGA PAA-PILLA +0DD8..0DDF ; Alphabetic # Mc [8] SINHALA VOWEL SIGN GAETTA-PILLA..SINHALA VOWEL SIGN GAYANUKITTA +0DF2..0DF3 ; Alphabetic # Mc [2] SINHALA VOWEL SIGN DIGA GAETTA-PILLA..SINHALA VOWEL SIGN DIGA GAYANUKITTA +0E01..0E30 ; Alphabetic # Lo [48] THAI CHARACTER KO KAI..THAI CHARACTER SARA A +0E31 ; Alphabetic # Mn THAI CHARACTER MAI HAN-AKAT +0E32..0E33 ; Alphabetic # Lo [2] THAI CHARACTER SARA AA..THAI CHARACTER SARA AM +0E34..0E3A ; Alphabetic # Mn [7] THAI CHARACTER SARA I..THAI CHARACTER PHINTHU +0E40..0E45 ; Alphabetic # Lo [6] THAI CHARACTER SARA E..THAI CHARACTER LAKKHANGYAO +0E46 ; Alphabetic # Lm THAI CHARACTER MAIYAMOK +0E4D ; Alphabetic # Mn THAI CHARACTER NIKHAHIT +0E81..0E82 ; Alphabetic # Lo [2] LAO LETTER KO..LAO LETTER KHO SUNG +0E84 ; Alphabetic # Lo LAO LETTER KHO TAM +0E87..0E88 ; Alphabetic # Lo [2] LAO LETTER NGO..LAO LETTER CO +0E8A ; Alphabetic # Lo LAO LETTER SO TAM +0E8D ; Alphabetic # Lo LAO LETTER NYO +0E94..0E97 ; Alphabetic # Lo [4] LAO LETTER DO..LAO LETTER THO TAM +0E99..0E9F ; Alphabetic # Lo [7] LAO LETTER NO..LAO LETTER FO SUNG +0EA1..0EA3 ; Alphabetic # Lo [3] LAO LETTER MO..LAO LETTER LO LING +0EA5 ; Alphabetic # Lo LAO LETTER LO LOOT +0EA7 ; Alphabetic # Lo LAO LETTER WO +0EAA..0EAB ; Alphabetic # Lo [2] LAO LETTER SO SUNG..LAO LETTER HO SUNG +0EAD..0EB0 ; Alphabetic # Lo [4] LAO LETTER O..LAO VOWEL SIGN A +0EB1 ; Alphabetic # Mn LAO VOWEL SIGN MAI KAN +0EB2..0EB3 ; Alphabetic # Lo [2] LAO VOWEL SIGN AA..LAO VOWEL SIGN AM +0EB4..0EB9 ; Alphabetic # Mn [6] LAO VOWEL SIGN I..LAO VOWEL SIGN UU +0EBB..0EBC ; Alphabetic # Mn [2] LAO VOWEL SIGN MAI KON..LAO SEMIVOWEL SIGN LO +0EBD ; Alphabetic # Lo LAO SEMIVOWEL SIGN NYO +0EC0..0EC4 ; Alphabetic # Lo [5] LAO VOWEL SIGN E..LAO VOWEL SIGN AI +0EC6 ; Alphabetic # Lm LAO KO LA +0ECD ; Alphabetic # Mn LAO NIGGAHITA +0EDC..0EDF ; Alphabetic # Lo [4] LAO HO NO..LAO LETTER KHMU NYO +0F00 ; Alphabetic # Lo TIBETAN SYLLABLE OM +0F40..0F47 ; Alphabetic # Lo [8] TIBETAN LETTER KA..TIBETAN LETTER JA +0F49..0F6C ; Alphabetic # Lo [36] TIBETAN LETTER NYA..TIBETAN LETTER RRA +0F71..0F7E ; Alphabetic # Mn [14] TIBETAN VOWEL SIGN AA..TIBETAN SIGN RJES SU NGA RO +0F7F ; Alphabetic # Mc TIBETAN SIGN RNAM BCAD +0F80..0F81 ; Alphabetic # Mn [2] TIBETAN VOWEL SIGN REVERSED I..TIBETAN VOWEL SIGN REVERSED II +0F88..0F8C ; Alphabetic # Lo [5] TIBETAN SIGN LCE TSA CAN..TIBETAN SIGN INVERTED MCHU CAN +0F8D..0F97 ; Alphabetic # Mn [11] TIBETAN SUBJOINED SIGN LCE TSA CAN..TIBETAN SUBJOINED LETTER JA +0F99..0FBC ; Alphabetic # Mn [36] TIBETAN SUBJOINED LETTER NYA..TIBETAN SUBJOINED LETTER FIXED-FORM RA +1000..102A ; Alphabetic # Lo [43] MYANMAR LETTER KA..MYANMAR LETTER AU +102B..102C ; Alphabetic # Mc [2] MYANMAR VOWEL SIGN TALL AA..MYANMAR VOWEL SIGN AA +102D..1030 ; Alphabetic # Mn [4] MYANMAR VOWEL SIGN I..MYANMAR VOWEL SIGN UU +1031 ; Alphabetic # Mc MYANMAR VOWEL SIGN E +1032..1036 ; Alphabetic # Mn [5] MYANMAR VOWEL SIGN AI..MYANMAR SIGN ANUSVARA +1038 ; Alphabetic # Mc MYANMAR SIGN VISARGA +103B..103C ; Alphabetic # Mc [2] MYANMAR CONSONANT SIGN MEDIAL YA..MYANMAR CONSONANT SIGN MEDIAL RA +103D..103E ; Alphabetic # Mn [2] MYANMAR CONSONANT SIGN MEDIAL WA..MYANMAR CONSONANT SIGN MEDIAL HA +103F ; Alphabetic # Lo MYANMAR LETTER GREAT SA +1050..1055 ; Alphabetic # Lo [6] MYANMAR LETTER SHA..MYANMAR LETTER VOCALIC LL +1056..1057 ; Alphabetic # Mc [2] MYANMAR VOWEL SIGN VOCALIC R..MYANMAR VOWEL SIGN VOCALIC RR +1058..1059 ; Alphabetic # Mn [2] MYANMAR VOWEL SIGN VOCALIC L..MYANMAR VOWEL SIGN VOCALIC LL +105A..105D ; Alphabetic # Lo [4] MYANMAR LETTER MON NGA..MYANMAR LETTER MON BBE +105E..1060 ; Alphabetic # Mn [3] MYANMAR CONSONANT SIGN MON MEDIAL NA..MYANMAR CONSONANT SIGN MON MEDIAL LA +1061 ; Alphabetic # Lo MYANMAR LETTER SGAW KAREN SHA +1062 ; Alphabetic # Mc MYANMAR VOWEL SIGN SGAW KAREN EU +1065..1066 ; Alphabetic # Lo [2] MYANMAR LETTER WESTERN PWO KAREN THA..MYANMAR LETTER WESTERN PWO KAREN PWA +1067..1068 ; Alphabetic # Mc [2] MYANMAR VOWEL SIGN WESTERN PWO KAREN EU..MYANMAR VOWEL SIGN WESTERN PWO KAREN UE +106E..1070 ; Alphabetic # Lo [3] MYANMAR LETTER EASTERN PWO KAREN NNA..MYANMAR LETTER EASTERN PWO KAREN GHWA +1071..1074 ; Alphabetic # Mn [4] MYANMAR VOWEL SIGN GEBA KAREN I..MYANMAR VOWEL SIGN KAYAH EE +1075..1081 ; Alphabetic # Lo [13] MYANMAR LETTER SHAN KA..MYANMAR LETTER SHAN HA +1082 ; Alphabetic # Mn MYANMAR CONSONANT SIGN SHAN MEDIAL WA +1083..1084 ; Alphabetic # Mc [2] MYANMAR VOWEL SIGN SHAN AA..MYANMAR VOWEL SIGN SHAN E +1085..1086 ; Alphabetic # Mn [2] MYANMAR VOWEL SIGN SHAN E ABOVE..MYANMAR VOWEL SIGN SHAN FINAL Y +108E ; Alphabetic # Lo MYANMAR LETTER RUMAI PALAUNG FA +109C ; Alphabetic # Mc MYANMAR VOWEL SIGN AITON A +109D ; Alphabetic # Mn MYANMAR VOWEL SIGN AITON AI +10A0..10C5 ; Alphabetic # L& [38] GEORGIAN CAPITAL LETTER AN..GEORGIAN CAPITAL LETTER HOE +10C7 ; Alphabetic # L& GEORGIAN CAPITAL LETTER YN +10CD ; Alphabetic # L& GEORGIAN CAPITAL LETTER AEN +10D0..10FA ; Alphabetic # L& [43] GEORGIAN LETTER AN..GEORGIAN LETTER AIN +10FC ; Alphabetic # Lm MODIFIER LETTER GEORGIAN NAR +10FD..10FF ; Alphabetic # L& [3] GEORGIAN LETTER AEN..GEORGIAN LETTER LABIAL SIGN +1100..1248 ; Alphabetic # Lo [329] HANGUL CHOSEONG KIYEOK..ETHIOPIC SYLLABLE QWA +124A..124D ; Alphabetic # Lo [4] ETHIOPIC SYLLABLE QWI..ETHIOPIC SYLLABLE QWE +1250..1256 ; Alphabetic # Lo [7] ETHIOPIC SYLLABLE QHA..ETHIOPIC SYLLABLE QHO +1258 ; Alphabetic # Lo ETHIOPIC SYLLABLE QHWA +125A..125D ; Alphabetic # Lo [4] ETHIOPIC SYLLABLE QHWI..ETHIOPIC SYLLABLE QHWE +1260..1288 ; Alphabetic # Lo [41] ETHIOPIC SYLLABLE BA..ETHIOPIC SYLLABLE XWA +128A..128D ; Alphabetic # Lo [4] ETHIOPIC SYLLABLE XWI..ETHIOPIC SYLLABLE XWE +1290..12B0 ; Alphabetic # Lo [33] ETHIOPIC SYLLABLE NA..ETHIOPIC SYLLABLE KWA +12B2..12B5 ; Alphabetic # Lo [4] ETHIOPIC SYLLABLE KWI..ETHIOPIC SYLLABLE KWE +12B8..12BE ; Alphabetic # Lo [7] ETHIOPIC SYLLABLE KXA..ETHIOPIC SYLLABLE KXO +12C0 ; Alphabetic # Lo ETHIOPIC SYLLABLE KXWA +12C2..12C5 ; Alphabetic # Lo [4] ETHIOPIC SYLLABLE KXWI..ETHIOPIC SYLLABLE KXWE +12C8..12D6 ; Alphabetic # Lo [15] ETHIOPIC SYLLABLE WA..ETHIOPIC SYLLABLE PHARYNGEAL O +12D8..1310 ; Alphabetic # Lo [57] ETHIOPIC SYLLABLE ZA..ETHIOPIC SYLLABLE GWA +1312..1315 ; Alphabetic # Lo [4] ETHIOPIC SYLLABLE GWI..ETHIOPIC SYLLABLE GWE +1318..135A ; Alphabetic # Lo [67] ETHIOPIC SYLLABLE GGA..ETHIOPIC SYLLABLE FYA +135F ; Alphabetic # Mn ETHIOPIC COMBINING GEMINATION MARK +1380..138F ; Alphabetic # Lo [16] ETHIOPIC SYLLABLE SEBATBEIT MWA..ETHIOPIC SYLLABLE PWE +13A0..13F5 ; Alphabetic # L& [86] CHEROKEE LETTER A..CHEROKEE LETTER MV +13F8..13FD ; Alphabetic # L& [6] CHEROKEE SMALL LETTER YE..CHEROKEE SMALL LETTER MV +1401..166C ; Alphabetic # Lo [620] CANADIAN SYLLABICS E..CANADIAN SYLLABICS CARRIER TTSA +166F..167F ; Alphabetic # Lo [17] CANADIAN SYLLABICS QAI..CANADIAN SYLLABICS BLACKFOOT W +1681..169A ; Alphabetic # Lo [26] OGHAM LETTER BEITH..OGHAM LETTER PEITH +16A0..16EA ; Alphabetic # Lo [75] RUNIC LETTER FEHU FEOH FE F..RUNIC LETTER X +16EE..16F0 ; Alphabetic # Nl [3] RUNIC ARLAUG SYMBOL..RUNIC BELGTHOR SYMBOL +16F1..16F8 ; Alphabetic # Lo [8] RUNIC LETTER K..RUNIC LETTER FRANKS CASKET AESC +1700..170C ; Alphabetic # Lo [13] TAGALOG LETTER A..TAGALOG LETTER YA +170E..1711 ; Alphabetic # Lo [4] TAGALOG LETTER LA..TAGALOG LETTER HA +1712..1713 ; Alphabetic # Mn [2] TAGALOG VOWEL SIGN I..TAGALOG VOWEL SIGN U +1720..1731 ; Alphabetic # Lo [18] HANUNOO LETTER A..HANUNOO LETTER HA +1732..1733 ; Alphabetic # Mn [2] HANUNOO VOWEL SIGN I..HANUNOO VOWEL SIGN U +1740..1751 ; Alphabetic # Lo [18] BUHID LETTER A..BUHID LETTER HA +1752..1753 ; Alphabetic # Mn [2] BUHID VOWEL SIGN I..BUHID VOWEL SIGN U +1760..176C ; Alphabetic # Lo [13] TAGBANWA LETTER A..TAGBANWA LETTER YA +176E..1770 ; Alphabetic # Lo [3] TAGBANWA LETTER LA..TAGBANWA LETTER SA +1772..1773 ; Alphabetic # Mn [2] TAGBANWA VOWEL SIGN I..TAGBANWA VOWEL SIGN U +1780..17B3 ; Alphabetic # Lo [52] KHMER LETTER KA..KHMER INDEPENDENT VOWEL QAU +17B6 ; Alphabetic # Mc KHMER VOWEL SIGN AA +17B7..17BD ; Alphabetic # Mn [7] KHMER VOWEL SIGN I..KHMER VOWEL SIGN UA +17BE..17C5 ; Alphabetic # Mc [8] KHMER VOWEL SIGN OE..KHMER VOWEL SIGN AU +17C6 ; Alphabetic # Mn KHMER SIGN NIKAHIT +17C7..17C8 ; Alphabetic # Mc [2] KHMER SIGN REAHMUK..KHMER SIGN YUUKALEAPINTU +17D7 ; Alphabetic # Lm KHMER SIGN LEK TOO +17DC ; Alphabetic # Lo KHMER SIGN AVAKRAHASANYA +1820..1842 ; Alphabetic # Lo [35] MONGOLIAN LETTER A..MONGOLIAN LETTER CHI +1843 ; Alphabetic # Lm MONGOLIAN LETTER TODO LONG VOWEL SIGN +1844..1878 ; Alphabetic # Lo [53] MONGOLIAN LETTER TODO E..MONGOLIAN LETTER CHA WITH TWO DOTS +1880..1884 ; Alphabetic # Lo [5] MONGOLIAN LETTER ALI GALI ANUSVARA ONE..MONGOLIAN LETTER ALI GALI INVERTED UBADAMA +1885..1886 ; Alphabetic # Mn [2] MONGOLIAN LETTER ALI GALI BALUDA..MONGOLIAN LETTER ALI GALI THREE BALUDA +1887..18A8 ; Alphabetic # Lo [34] MONGOLIAN LETTER ALI GALI A..MONGOLIAN LETTER MANCHU ALI GALI BHA +18A9 ; Alphabetic # Mn MONGOLIAN LETTER ALI GALI DAGALGA +18AA ; Alphabetic # Lo MONGOLIAN LETTER MANCHU ALI GALI LHA +18B0..18F5 ; Alphabetic # Lo [70] CANADIAN SYLLABICS OY..CANADIAN SYLLABICS CARRIER DENTAL S +1900..191E ; Alphabetic # Lo [31] LIMBU VOWEL-CARRIER LETTER..LIMBU LETTER TRA +1920..1922 ; Alphabetic # Mn [3] LIMBU VOWEL SIGN A..LIMBU VOWEL SIGN U +1923..1926 ; Alphabetic # Mc [4] LIMBU VOWEL SIGN EE..LIMBU VOWEL SIGN AU +1927..1928 ; Alphabetic # Mn [2] LIMBU VOWEL SIGN E..LIMBU VOWEL SIGN O +1929..192B ; Alphabetic # Mc [3] LIMBU SUBJOINED LETTER YA..LIMBU SUBJOINED LETTER WA +1930..1931 ; Alphabetic # Mc [2] LIMBU SMALL LETTER KA..LIMBU SMALL LETTER NGA +1932 ; Alphabetic # Mn LIMBU SMALL LETTER ANUSVARA +1933..1938 ; Alphabetic # Mc [6] LIMBU SMALL LETTER TA..LIMBU SMALL LETTER LA +1950..196D ; Alphabetic # Lo [30] TAI LE LETTER KA..TAI LE LETTER AI +1970..1974 ; Alphabetic # Lo [5] TAI LE LETTER TONE-2..TAI LE LETTER TONE-6 +1980..19AB ; Alphabetic # Lo [44] NEW TAI LUE LETTER HIGH QA..NEW TAI LUE LETTER LOW SUA +19B0..19C9 ; Alphabetic # Lo [26] NEW TAI LUE VOWEL SIGN VOWEL SHORTENER..NEW TAI LUE TONE MARK-2 +1A00..1A16 ; Alphabetic # Lo [23] BUGINESE LETTER KA..BUGINESE LETTER HA +1A17..1A18 ; Alphabetic # Mn [2] BUGINESE VOWEL SIGN I..BUGINESE VOWEL SIGN U +1A19..1A1A ; Alphabetic # Mc [2] BUGINESE VOWEL SIGN E..BUGINESE VOWEL SIGN O +1A1B ; Alphabetic # Mn BUGINESE VOWEL SIGN AE +1A20..1A54 ; Alphabetic # Lo [53] TAI THAM LETTER HIGH KA..TAI THAM LETTER GREAT SA +1A55 ; Alphabetic # Mc TAI THAM CONSONANT SIGN MEDIAL RA +1A56 ; Alphabetic # Mn TAI THAM CONSONANT SIGN MEDIAL LA +1A57 ; Alphabetic # Mc TAI THAM CONSONANT SIGN LA TANG LAI +1A58..1A5E ; Alphabetic # Mn [7] TAI THAM SIGN MAI KANG LAI..TAI THAM CONSONANT SIGN SA +1A61 ; Alphabetic # Mc TAI THAM VOWEL SIGN A +1A62 ; Alphabetic # Mn TAI THAM VOWEL SIGN MAI SAT +1A63..1A64 ; Alphabetic # Mc [2] TAI THAM VOWEL SIGN AA..TAI THAM VOWEL SIGN TALL AA +1A65..1A6C ; Alphabetic # Mn [8] TAI THAM VOWEL SIGN I..TAI THAM VOWEL SIGN OA BELOW +1A6D..1A72 ; Alphabetic # Mc [6] TAI THAM VOWEL SIGN OY..TAI THAM VOWEL SIGN THAM AI +1A73..1A74 ; Alphabetic # Mn [2] TAI THAM VOWEL SIGN OA ABOVE..TAI THAM SIGN MAI KANG +1AA7 ; Alphabetic # Lm TAI THAM SIGN MAI YAMOK +1B00..1B03 ; Alphabetic # Mn [4] BALINESE SIGN ULU RICEM..BALINESE SIGN SURANG +1B04 ; Alphabetic # Mc BALINESE SIGN BISAH +1B05..1B33 ; Alphabetic # Lo [47] BALINESE LETTER AKARA..BALINESE LETTER HA +1B35 ; Alphabetic # Mc BALINESE VOWEL SIGN TEDUNG +1B36..1B3A ; Alphabetic # Mn [5] BALINESE VOWEL SIGN ULU..BALINESE VOWEL SIGN RA REPA +1B3B ; Alphabetic # Mc BALINESE VOWEL SIGN RA REPA TEDUNG +1B3C ; Alphabetic # Mn BALINESE VOWEL SIGN LA LENGA +1B3D..1B41 ; Alphabetic # Mc [5] BALINESE VOWEL SIGN LA LENGA TEDUNG..BALINESE VOWEL SIGN TALING REPA TEDUNG +1B42 ; Alphabetic # Mn BALINESE VOWEL SIGN PEPET +1B43 ; Alphabetic # Mc BALINESE VOWEL SIGN PEPET TEDUNG +1B45..1B4B ; Alphabetic # Lo [7] BALINESE LETTER KAF SASAK..BALINESE LETTER ASYURA SASAK +1B80..1B81 ; Alphabetic # Mn [2] SUNDANESE SIGN PANYECEK..SUNDANESE SIGN PANGLAYAR +1B82 ; Alphabetic # Mc SUNDANESE SIGN PANGWISAD +1B83..1BA0 ; Alphabetic # Lo [30] SUNDANESE LETTER A..SUNDANESE LETTER HA +1BA1 ; Alphabetic # Mc SUNDANESE CONSONANT SIGN PAMINGKAL +1BA2..1BA5 ; Alphabetic # Mn [4] SUNDANESE CONSONANT SIGN PANYAKRA..SUNDANESE VOWEL SIGN PANYUKU +1BA6..1BA7 ; Alphabetic # Mc [2] SUNDANESE VOWEL SIGN PANAELAENG..SUNDANESE VOWEL SIGN PANOLONG +1BA8..1BA9 ; Alphabetic # Mn [2] SUNDANESE VOWEL SIGN PAMEPET..SUNDANESE VOWEL SIGN PANEULEUNG +1BAC..1BAD ; Alphabetic # Mn [2] SUNDANESE CONSONANT SIGN PASANGAN MA..SUNDANESE CONSONANT SIGN PASANGAN WA +1BAE..1BAF ; Alphabetic # Lo [2] SUNDANESE LETTER KHA..SUNDANESE LETTER SYA +1BBA..1BE5 ; Alphabetic # Lo [44] SUNDANESE AVAGRAHA..BATAK LETTER U +1BE7 ; Alphabetic # Mc BATAK VOWEL SIGN E +1BE8..1BE9 ; Alphabetic # Mn [2] BATAK VOWEL SIGN PAKPAK E..BATAK VOWEL SIGN EE +1BEA..1BEC ; Alphabetic # Mc [3] BATAK VOWEL SIGN I..BATAK VOWEL SIGN O +1BED ; Alphabetic # Mn BATAK VOWEL SIGN KARO O +1BEE ; Alphabetic # Mc BATAK VOWEL SIGN U +1BEF..1BF1 ; Alphabetic # Mn [3] BATAK VOWEL SIGN U FOR SIMALUNGUN SA..BATAK CONSONANT SIGN H +1C00..1C23 ; Alphabetic # Lo [36] LEPCHA LETTER KA..LEPCHA LETTER A +1C24..1C2B ; Alphabetic # Mc [8] LEPCHA SUBJOINED LETTER YA..LEPCHA VOWEL SIGN UU +1C2C..1C33 ; Alphabetic # Mn [8] LEPCHA VOWEL SIGN E..LEPCHA CONSONANT SIGN T +1C34..1C35 ; Alphabetic # Mc [2] LEPCHA CONSONANT SIGN NYIN-DO..LEPCHA CONSONANT SIGN KANG +1C4D..1C4F ; Alphabetic # Lo [3] LEPCHA LETTER TTA..LEPCHA LETTER DDA +1C5A..1C77 ; Alphabetic # Lo [30] OL CHIKI LETTER LA..OL CHIKI LETTER OH +1C78..1C7D ; Alphabetic # Lm [6] OL CHIKI MU TTUDDAG..OL CHIKI AHAD +1C80..1C88 ; Alphabetic # L& [9] CYRILLIC SMALL LETTER ROUNDED VE..CYRILLIC SMALL LETTER UNBLENDED UK +1C90..1CBA ; Alphabetic # L& [43] GEORGIAN MTAVRULI CAPITAL LETTER AN..GEORGIAN MTAVRULI CAPITAL LETTER AIN +1CBD..1CBF ; Alphabetic # L& [3] GEORGIAN MTAVRULI CAPITAL LETTER AEN..GEORGIAN MTAVRULI CAPITAL LETTER LABIAL SIGN +1CE9..1CEC ; Alphabetic # Lo [4] VEDIC SIGN ANUSVARA ANTARGOMUKHA..VEDIC SIGN ANUSVARA VAMAGOMUKHA WITH TAIL +1CEE..1CF1 ; Alphabetic # Lo [4] VEDIC SIGN HEXIFORM LONG ANUSVARA..VEDIC SIGN ANUSVARA UBHAYATO MUKHA +1CF2..1CF3 ; Alphabetic # Mc [2] VEDIC SIGN ARDHAVISARGA..VEDIC SIGN ROTATED ARDHAVISARGA +1CF5..1CF6 ; Alphabetic # Lo [2] VEDIC SIGN JIHVAMULIYA..VEDIC SIGN UPADHMANIYA +1D00..1D2B ; Alphabetic # L& [44] LATIN LETTER SMALL CAPITAL A..CYRILLIC LETTER SMALL CAPITAL EL +1D2C..1D6A ; Alphabetic # Lm [63] MODIFIER LETTER CAPITAL A..GREEK SUBSCRIPT SMALL LETTER CHI +1D6B..1D77 ; Alphabetic # L& [13] LATIN SMALL LETTER UE..LATIN SMALL LETTER TURNED G +1D78 ; Alphabetic # Lm MODIFIER LETTER CYRILLIC EN +1D79..1D9A ; Alphabetic # L& [34] LATIN SMALL LETTER INSULAR G..LATIN SMALL LETTER EZH WITH RETROFLEX HOOK +1D9B..1DBF ; Alphabetic # Lm [37] MODIFIER LETTER SMALL TURNED ALPHA..MODIFIER LETTER SMALL THETA +1DE7..1DF4 ; Alphabetic # Mn [14] COMBINING LATIN SMALL LETTER ALPHA..COMBINING LATIN SMALL LETTER U WITH DIAERESIS +1E00..1F15 ; Alphabetic # L& [278] LATIN CAPITAL LETTER A WITH RING BELOW..GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA +1F18..1F1D ; Alphabetic # L& [6] GREEK CAPITAL LETTER EPSILON WITH PSILI..GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA +1F20..1F45 ; Alphabetic # L& [38] GREEK SMALL LETTER ETA WITH PSILI..GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA +1F48..1F4D ; Alphabetic # L& [6] GREEK CAPITAL LETTER OMICRON WITH PSILI..GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA +1F50..1F57 ; Alphabetic # L& [8] GREEK SMALL LETTER UPSILON WITH PSILI..GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI +1F59 ; Alphabetic # L& GREEK CAPITAL LETTER UPSILON WITH DASIA +1F5B ; Alphabetic # L& GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA +1F5D ; Alphabetic # L& GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA +1F5F..1F7D ; Alphabetic # L& [31] GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI..GREEK SMALL LETTER OMEGA WITH OXIA +1F80..1FB4 ; Alphabetic # L& [53] GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI..GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI +1FB6..1FBC ; Alphabetic # L& [7] GREEK SMALL LETTER ALPHA WITH PERISPOMENI..GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI +1FBE ; Alphabetic # L& GREEK PROSGEGRAMMENI +1FC2..1FC4 ; Alphabetic # L& [3] GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI +1FC6..1FCC ; Alphabetic # L& [7] GREEK SMALL LETTER ETA WITH PERISPOMENI..GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI +1FD0..1FD3 ; Alphabetic # L& [4] GREEK SMALL LETTER IOTA WITH VRACHY..GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA +1FD6..1FDB ; Alphabetic # L& [6] GREEK SMALL LETTER IOTA WITH PERISPOMENI..GREEK CAPITAL LETTER IOTA WITH OXIA +1FE0..1FEC ; Alphabetic # L& [13] GREEK SMALL LETTER UPSILON WITH VRACHY..GREEK CAPITAL LETTER RHO WITH DASIA +1FF2..1FF4 ; Alphabetic # L& [3] GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI +1FF6..1FFC ; Alphabetic # L& [7] GREEK SMALL LETTER OMEGA WITH PERISPOMENI..GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI +2071 ; Alphabetic # Lm SUPERSCRIPT LATIN SMALL LETTER I +207F ; Alphabetic # Lm SUPERSCRIPT LATIN SMALL LETTER N +2090..209C ; Alphabetic # Lm [13] LATIN SUBSCRIPT SMALL LETTER A..LATIN SUBSCRIPT SMALL LETTER T +2102 ; Alphabetic # L& DOUBLE-STRUCK CAPITAL C +2107 ; Alphabetic # L& EULER CONSTANT +210A..2113 ; Alphabetic # L& [10] SCRIPT SMALL G..SCRIPT SMALL L +2115 ; Alphabetic # L& DOUBLE-STRUCK CAPITAL N +2119..211D ; Alphabetic # L& [5] DOUBLE-STRUCK CAPITAL P..DOUBLE-STRUCK CAPITAL R +2124 ; Alphabetic # L& DOUBLE-STRUCK CAPITAL Z +2126 ; Alphabetic # L& OHM SIGN +2128 ; Alphabetic # L& BLACK-LETTER CAPITAL Z +212A..212D ; Alphabetic # L& [4] KELVIN SIGN..BLACK-LETTER CAPITAL C +212F..2134 ; Alphabetic # L& [6] SCRIPT SMALL E..SCRIPT SMALL O +2135..2138 ; Alphabetic # Lo [4] ALEF SYMBOL..DALET SYMBOL +2139 ; Alphabetic # L& INFORMATION SOURCE +213C..213F ; Alphabetic # L& [4] DOUBLE-STRUCK SMALL PI..DOUBLE-STRUCK CAPITAL PI +2145..2149 ; Alphabetic # L& [5] DOUBLE-STRUCK ITALIC CAPITAL D..DOUBLE-STRUCK ITALIC SMALL J +214E ; Alphabetic # L& TURNED SMALL F +2160..2182 ; Alphabetic # Nl [35] ROMAN NUMERAL ONE..ROMAN NUMERAL TEN THOUSAND +2183..2184 ; Alphabetic # L& [2] ROMAN NUMERAL REVERSED ONE HUNDRED..LATIN SMALL LETTER REVERSED C +2185..2188 ; Alphabetic # Nl [4] ROMAN NUMERAL SIX LATE FORM..ROMAN NUMERAL ONE HUNDRED THOUSAND +24B6..24E9 ; Alphabetic # So [52] CIRCLED LATIN CAPITAL LETTER A..CIRCLED LATIN SMALL LETTER Z +2C00..2C2E ; Alphabetic # L& [47] GLAGOLITIC CAPITAL LETTER AZU..GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE +2C30..2C5E ; Alphabetic # L& [47] GLAGOLITIC SMALL LETTER AZU..GLAGOLITIC SMALL LETTER LATINATE MYSLITE +2C60..2C7B ; Alphabetic # L& [28] LATIN CAPITAL LETTER L WITH DOUBLE BAR..LATIN LETTER SMALL CAPITAL TURNED E +2C7C..2C7D ; Alphabetic # Lm [2] LATIN SUBSCRIPT SMALL LETTER J..MODIFIER LETTER CAPITAL V +2C7E..2CE4 ; Alphabetic # L& [103] LATIN CAPITAL LETTER S WITH SWASH TAIL..COPTIC SYMBOL KAI +2CEB..2CEE ; Alphabetic # L& [4] COPTIC CAPITAL LETTER CRYPTOGRAMMIC SHEI..COPTIC SMALL LETTER CRYPTOGRAMMIC GANGIA +2CF2..2CF3 ; Alphabetic # L& [2] COPTIC CAPITAL LETTER BOHAIRIC KHEI..COPTIC SMALL LETTER BOHAIRIC KHEI +2D00..2D25 ; Alphabetic # L& [38] GEORGIAN SMALL LETTER AN..GEORGIAN SMALL LETTER HOE +2D27 ; Alphabetic # L& GEORGIAN SMALL LETTER YN +2D2D ; Alphabetic # L& GEORGIAN SMALL LETTER AEN +2D30..2D67 ; Alphabetic # Lo [56] TIFINAGH LETTER YA..TIFINAGH LETTER YO +2D6F ; Alphabetic # Lm TIFINAGH MODIFIER LETTER LABIALIZATION MARK +2D80..2D96 ; Alphabetic # Lo [23] ETHIOPIC SYLLABLE LOA..ETHIOPIC SYLLABLE GGWE +2DA0..2DA6 ; Alphabetic # Lo [7] ETHIOPIC SYLLABLE SSA..ETHIOPIC SYLLABLE SSO +2DA8..2DAE ; Alphabetic # Lo [7] ETHIOPIC SYLLABLE CCA..ETHIOPIC SYLLABLE CCO +2DB0..2DB6 ; Alphabetic # Lo [7] ETHIOPIC SYLLABLE ZZA..ETHIOPIC SYLLABLE ZZO +2DB8..2DBE ; Alphabetic # Lo [7] ETHIOPIC SYLLABLE CCHA..ETHIOPIC SYLLABLE CCHO +2DC0..2DC6 ; Alphabetic # Lo [7] ETHIOPIC SYLLABLE QYA..ETHIOPIC SYLLABLE QYO +2DC8..2DCE ; Alphabetic # Lo [7] ETHIOPIC SYLLABLE KYA..ETHIOPIC SYLLABLE KYO +2DD0..2DD6 ; Alphabetic # Lo [7] ETHIOPIC SYLLABLE XYA..ETHIOPIC SYLLABLE XYO +2DD8..2DDE ; Alphabetic # Lo [7] ETHIOPIC SYLLABLE GYA..ETHIOPIC SYLLABLE GYO +2DE0..2DFF ; Alphabetic # Mn [32] COMBINING CYRILLIC LETTER BE..COMBINING CYRILLIC LETTER IOTIFIED BIG YUS +2E2F ; Alphabetic # Lm VERTICAL TILDE +3005 ; Alphabetic # Lm IDEOGRAPHIC ITERATION MARK +3006 ; Alphabetic # Lo IDEOGRAPHIC CLOSING MARK +3007 ; Alphabetic # Nl IDEOGRAPHIC NUMBER ZERO +3021..3029 ; Alphabetic # Nl [9] HANGZHOU NUMERAL ONE..HANGZHOU NUMERAL NINE +3031..3035 ; Alphabetic # Lm [5] VERTICAL KANA REPEAT MARK..VERTICAL KANA REPEAT MARK LOWER HALF +3038..303A ; Alphabetic # Nl [3] HANGZHOU NUMERAL TEN..HANGZHOU NUMERAL THIRTY +303B ; Alphabetic # Lm VERTICAL IDEOGRAPHIC ITERATION MARK +303C ; Alphabetic # Lo MASU MARK +3041..3096 ; Alphabetic # Lo [86] HIRAGANA LETTER SMALL A..HIRAGANA LETTER SMALL KE +309D..309E ; Alphabetic # Lm [2] HIRAGANA ITERATION MARK..HIRAGANA VOICED ITERATION MARK +309F ; Alphabetic # Lo HIRAGANA DIGRAPH YORI +30A1..30FA ; Alphabetic # Lo [90] KATAKANA LETTER SMALL A..KATAKANA LETTER VO +30FC..30FE ; Alphabetic # Lm [3] KATAKANA-HIRAGANA PROLONGED SOUND MARK..KATAKANA VOICED ITERATION MARK +30FF ; Alphabetic # Lo KATAKANA DIGRAPH KOTO +3105..312F ; Alphabetic # Lo [43] BOPOMOFO LETTER B..BOPOMOFO LETTER NN +3131..318E ; Alphabetic # Lo [94] HANGUL LETTER KIYEOK..HANGUL LETTER ARAEAE +31A0..31BA ; Alphabetic # Lo [27] BOPOMOFO LETTER BU..BOPOMOFO LETTER ZY +31F0..31FF ; Alphabetic # Lo [16] KATAKANA LETTER SMALL KU..KATAKANA LETTER SMALL RO +3400..4DB5 ; Alphabetic # Lo [6582] CJK UNIFIED IDEOGRAPH-3400..CJK UNIFIED IDEOGRAPH-4DB5 +4E00..9FEF ; Alphabetic # Lo [20976] CJK UNIFIED IDEOGRAPH-4E00..CJK UNIFIED IDEOGRAPH-9FEF +A000..A014 ; Alphabetic # Lo [21] YI SYLLABLE IT..YI SYLLABLE E +A015 ; Alphabetic # Lm YI SYLLABLE WU +A016..A48C ; Alphabetic # Lo [1143] YI SYLLABLE BIT..YI SYLLABLE YYR +A4D0..A4F7 ; Alphabetic # Lo [40] LISU LETTER BA..LISU LETTER OE +A4F8..A4FD ; Alphabetic # Lm [6] LISU LETTER TONE MYA TI..LISU LETTER TONE MYA JEU +A500..A60B ; Alphabetic # Lo [268] VAI SYLLABLE EE..VAI SYLLABLE NG +A60C ; Alphabetic # Lm VAI SYLLABLE LENGTHENER +A610..A61F ; Alphabetic # Lo [16] VAI SYLLABLE NDOLE FA..VAI SYMBOL JONG +A62A..A62B ; Alphabetic # Lo [2] VAI SYLLABLE NDOLE MA..VAI SYLLABLE NDOLE DO +A640..A66D ; Alphabetic # L& [46] CYRILLIC CAPITAL LETTER ZEMLYA..CYRILLIC SMALL LETTER DOUBLE MONOCULAR O +A66E ; Alphabetic # Lo CYRILLIC LETTER MULTIOCULAR O +A674..A67B ; Alphabetic # Mn [8] COMBINING CYRILLIC LETTER UKRAINIAN IE..COMBINING CYRILLIC LETTER OMEGA +A67F ; Alphabetic # Lm CYRILLIC PAYEROK +A680..A69B ; Alphabetic # L& [28] CYRILLIC CAPITAL LETTER DWE..CYRILLIC SMALL LETTER CROSSED O +A69C..A69D ; Alphabetic # Lm [2] MODIFIER LETTER CYRILLIC HARD SIGN..MODIFIER LETTER CYRILLIC SOFT SIGN +A69E..A69F ; Alphabetic # Mn [2] COMBINING CYRILLIC LETTER EF..COMBINING CYRILLIC LETTER IOTIFIED E +A6A0..A6E5 ; Alphabetic # Lo [70] BAMUM LETTER A..BAMUM LETTER KI +A6E6..A6EF ; Alphabetic # Nl [10] BAMUM LETTER MO..BAMUM LETTER KOGHOM +A717..A71F ; Alphabetic # Lm [9] MODIFIER LETTER DOT VERTICAL BAR..MODIFIER LETTER LOW INVERTED EXCLAMATION MARK +A722..A76F ; Alphabetic # L& [78] LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF..LATIN SMALL LETTER CON +A770 ; Alphabetic # Lm MODIFIER LETTER US +A771..A787 ; Alphabetic # L& [23] LATIN SMALL LETTER DUM..LATIN SMALL LETTER INSULAR T +A788 ; Alphabetic # Lm MODIFIER LETTER LOW CIRCUMFLEX ACCENT +A78B..A78E ; Alphabetic # L& [4] LATIN CAPITAL LETTER SALTILLO..LATIN SMALL LETTER L WITH RETROFLEX HOOK AND BELT +A78F ; Alphabetic # Lo LATIN LETTER SINOLOGICAL DOT +A790..A7B9 ; Alphabetic # L& [42] LATIN CAPITAL LETTER N WITH DESCENDER..LATIN SMALL LETTER U WITH STROKE +A7F7 ; Alphabetic # Lo LATIN EPIGRAPHIC LETTER SIDEWAYS I +A7F8..A7F9 ; Alphabetic # Lm [2] MODIFIER LETTER CAPITAL H WITH STROKE..MODIFIER LETTER SMALL LIGATURE OE +A7FA ; Alphabetic # L& LATIN LETTER SMALL CAPITAL TURNED M +A7FB..A801 ; Alphabetic # Lo [7] LATIN EPIGRAPHIC LETTER REVERSED F..SYLOTI NAGRI LETTER I +A803..A805 ; Alphabetic # Lo [3] SYLOTI NAGRI LETTER U..SYLOTI NAGRI LETTER O +A807..A80A ; Alphabetic # Lo [4] SYLOTI NAGRI LETTER KO..SYLOTI NAGRI LETTER GHO +A80C..A822 ; Alphabetic # Lo [23] SYLOTI NAGRI LETTER CO..SYLOTI NAGRI LETTER HO +A823..A824 ; Alphabetic # Mc [2] SYLOTI NAGRI VOWEL SIGN A..SYLOTI NAGRI VOWEL SIGN I +A825..A826 ; Alphabetic # Mn [2] SYLOTI NAGRI VOWEL SIGN U..SYLOTI NAGRI VOWEL SIGN E +A827 ; Alphabetic # Mc SYLOTI NAGRI VOWEL SIGN OO +A840..A873 ; Alphabetic # Lo [52] PHAGS-PA LETTER KA..PHAGS-PA LETTER CANDRABINDU +A880..A881 ; Alphabetic # Mc [2] SAURASHTRA SIGN ANUSVARA..SAURASHTRA SIGN VISARGA +A882..A8B3 ; Alphabetic # Lo [50] SAURASHTRA LETTER A..SAURASHTRA LETTER LLA +A8B4..A8C3 ; Alphabetic # Mc [16] SAURASHTRA CONSONANT SIGN HAARU..SAURASHTRA VOWEL SIGN AU +A8C5 ; Alphabetic # Mn SAURASHTRA SIGN CANDRABINDU +A8F2..A8F7 ; Alphabetic # Lo [6] DEVANAGARI SIGN SPACING CANDRABINDU..DEVANAGARI SIGN CANDRABINDU AVAGRAHA +A8FB ; Alphabetic # Lo DEVANAGARI HEADSTROKE +A8FD..A8FE ; Alphabetic # Lo [2] DEVANAGARI JAIN OM..DEVANAGARI LETTER AY +A90A..A925 ; Alphabetic # Lo [28] KAYAH LI LETTER KA..KAYAH LI LETTER OO +A926..A92A ; Alphabetic # Mn [5] KAYAH LI VOWEL UE..KAYAH LI VOWEL O +A930..A946 ; Alphabetic # Lo [23] REJANG LETTER KA..REJANG LETTER A +A947..A951 ; Alphabetic # Mn [11] REJANG VOWEL SIGN I..REJANG CONSONANT SIGN R +A952 ; Alphabetic # Mc REJANG CONSONANT SIGN H +A960..A97C ; Alphabetic # Lo [29] HANGUL CHOSEONG TIKEUT-MIEUM..HANGUL CHOSEONG SSANGYEORINHIEUH +A980..A982 ; Alphabetic # Mn [3] JAVANESE SIGN PANYANGGA..JAVANESE SIGN LAYAR +A983 ; Alphabetic # Mc JAVANESE SIGN WIGNYAN +A984..A9B2 ; Alphabetic # Lo [47] JAVANESE LETTER A..JAVANESE LETTER HA +A9B4..A9B5 ; Alphabetic # Mc [2] JAVANESE VOWEL SIGN TARUNG..JAVANESE VOWEL SIGN TOLONG +A9B6..A9B9 ; Alphabetic # Mn [4] JAVANESE VOWEL SIGN WULU..JAVANESE VOWEL SIGN SUKU MENDUT +A9BA..A9BB ; Alphabetic # Mc [2] JAVANESE VOWEL SIGN TALING..JAVANESE VOWEL SIGN DIRGA MURE +A9BC ; Alphabetic # Mn JAVANESE VOWEL SIGN PEPET +A9BD..A9BF ; Alphabetic # Mc [3] JAVANESE CONSONANT SIGN KERET..JAVANESE CONSONANT SIGN CAKRA +A9CF ; Alphabetic # Lm JAVANESE PANGRANGKEP +A9E0..A9E4 ; Alphabetic # Lo [5] MYANMAR LETTER SHAN GHA..MYANMAR LETTER SHAN BHA +A9E6 ; Alphabetic # Lm MYANMAR MODIFIER LETTER SHAN REDUPLICATION +A9E7..A9EF ; Alphabetic # Lo [9] MYANMAR LETTER TAI LAING NYA..MYANMAR LETTER TAI LAING NNA +A9FA..A9FE ; Alphabetic # Lo [5] MYANMAR LETTER TAI LAING LLA..MYANMAR LETTER TAI LAING BHA +AA00..AA28 ; Alphabetic # Lo [41] CHAM LETTER A..CHAM LETTER HA +AA29..AA2E ; Alphabetic # Mn [6] CHAM VOWEL SIGN AA..CHAM VOWEL SIGN OE +AA2F..AA30 ; Alphabetic # Mc [2] CHAM VOWEL SIGN O..CHAM VOWEL SIGN AI +AA31..AA32 ; Alphabetic # Mn [2] CHAM VOWEL SIGN AU..CHAM VOWEL SIGN UE +AA33..AA34 ; Alphabetic # Mc [2] CHAM CONSONANT SIGN YA..CHAM CONSONANT SIGN RA +AA35..AA36 ; Alphabetic # Mn [2] CHAM CONSONANT SIGN LA..CHAM CONSONANT SIGN WA +AA40..AA42 ; Alphabetic # Lo [3] CHAM LETTER FINAL K..CHAM LETTER FINAL NG +AA43 ; Alphabetic # Mn CHAM CONSONANT SIGN FINAL NG +AA44..AA4B ; Alphabetic # Lo [8] CHAM LETTER FINAL CH..CHAM LETTER FINAL SS +AA4C ; Alphabetic # Mn CHAM CONSONANT SIGN FINAL M +AA4D ; Alphabetic # Mc CHAM CONSONANT SIGN FINAL H +AA60..AA6F ; Alphabetic # Lo [16] MYANMAR LETTER KHAMTI GA..MYANMAR LETTER KHAMTI FA +AA70 ; Alphabetic # Lm MYANMAR MODIFIER LETTER KHAMTI REDUPLICATION +AA71..AA76 ; Alphabetic # Lo [6] MYANMAR LETTER KHAMTI XA..MYANMAR LOGOGRAM KHAMTI HM +AA7A ; Alphabetic # Lo MYANMAR LETTER AITON RA +AA7E..AAAF ; Alphabetic # Lo [50] MYANMAR LETTER SHWE PALAUNG CHA..TAI VIET LETTER HIGH O +AAB0 ; Alphabetic # Mn TAI VIET MAI KANG +AAB1 ; Alphabetic # Lo TAI VIET VOWEL AA +AAB2..AAB4 ; Alphabetic # Mn [3] TAI VIET VOWEL I..TAI VIET VOWEL U +AAB5..AAB6 ; Alphabetic # Lo [2] TAI VIET VOWEL E..TAI VIET VOWEL O +AAB7..AAB8 ; Alphabetic # Mn [2] TAI VIET MAI KHIT..TAI VIET VOWEL IA +AAB9..AABD ; Alphabetic # Lo [5] TAI VIET VOWEL UEA..TAI VIET VOWEL AN +AABE ; Alphabetic # Mn TAI VIET VOWEL AM +AAC0 ; Alphabetic # Lo TAI VIET TONE MAI NUENG +AAC2 ; Alphabetic # Lo TAI VIET TONE MAI SONG +AADB..AADC ; Alphabetic # Lo [2] TAI VIET SYMBOL KON..TAI VIET SYMBOL NUENG +AADD ; Alphabetic # Lm TAI VIET SYMBOL SAM +AAE0..AAEA ; Alphabetic # Lo [11] MEETEI MAYEK LETTER E..MEETEI MAYEK LETTER SSA +AAEB ; Alphabetic # Mc MEETEI MAYEK VOWEL SIGN II +AAEC..AAED ; Alphabetic # Mn [2] MEETEI MAYEK VOWEL SIGN UU..MEETEI MAYEK VOWEL SIGN AAI +AAEE..AAEF ; Alphabetic # Mc [2] MEETEI MAYEK VOWEL SIGN AU..MEETEI MAYEK VOWEL SIGN AAU +AAF2 ; Alphabetic # Lo MEETEI MAYEK ANJI +AAF3..AAF4 ; Alphabetic # Lm [2] MEETEI MAYEK SYLLABLE REPETITION MARK..MEETEI MAYEK WORD REPETITION MARK +AAF5 ; Alphabetic # Mc MEETEI MAYEK VOWEL SIGN VISARGA +AB01..AB06 ; Alphabetic # Lo [6] ETHIOPIC SYLLABLE TTHU..ETHIOPIC SYLLABLE TTHO +AB09..AB0E ; Alphabetic # Lo [6] ETHIOPIC SYLLABLE DDHU..ETHIOPIC SYLLABLE DDHO +AB11..AB16 ; Alphabetic # Lo [6] ETHIOPIC SYLLABLE DZU..ETHIOPIC SYLLABLE DZO +AB20..AB26 ; Alphabetic # Lo [7] ETHIOPIC SYLLABLE CCHHA..ETHIOPIC SYLLABLE CCHHO +AB28..AB2E ; Alphabetic # Lo [7] ETHIOPIC SYLLABLE BBA..ETHIOPIC SYLLABLE BBO +AB30..AB5A ; Alphabetic # L& [43] LATIN SMALL LETTER BARRED ALPHA..LATIN SMALL LETTER Y WITH SHORT RIGHT LEG +AB5C..AB5F ; Alphabetic # Lm [4] MODIFIER LETTER SMALL HENG..MODIFIER LETTER SMALL U WITH LEFT HOOK +AB60..AB65 ; Alphabetic # L& [6] LATIN SMALL LETTER SAKHA YAT..GREEK LETTER SMALL CAPITAL OMEGA +AB70..ABBF ; Alphabetic # L& [80] CHEROKEE SMALL LETTER A..CHEROKEE SMALL LETTER YA +ABC0..ABE2 ; Alphabetic # Lo [35] MEETEI MAYEK LETTER KOK..MEETEI MAYEK LETTER I LONSUM +ABE3..ABE4 ; Alphabetic # Mc [2] MEETEI MAYEK VOWEL SIGN ONAP..MEETEI MAYEK VOWEL SIGN INAP +ABE5 ; Alphabetic # Mn MEETEI MAYEK VOWEL SIGN ANAP +ABE6..ABE7 ; Alphabetic # Mc [2] MEETEI MAYEK VOWEL SIGN YENAP..MEETEI MAYEK VOWEL SIGN SOUNAP +ABE8 ; Alphabetic # Mn MEETEI MAYEK VOWEL SIGN UNAP +ABE9..ABEA ; Alphabetic # Mc [2] MEETEI MAYEK VOWEL SIGN CHEINAP..MEETEI MAYEK VOWEL SIGN NUNG +AC00..D7A3 ; Alphabetic # Lo [11172] HANGUL SYLLABLE GA..HANGUL SYLLABLE HIH +D7B0..D7C6 ; Alphabetic # Lo [23] HANGUL JUNGSEONG O-YEO..HANGUL JUNGSEONG ARAEA-E +D7CB..D7FB ; Alphabetic # Lo [49] HANGUL JONGSEONG NIEUN-RIEUL..HANGUL JONGSEONG PHIEUPH-THIEUTH +F900..FA6D ; Alphabetic # Lo [366] CJK COMPATIBILITY IDEOGRAPH-F900..CJK COMPATIBILITY IDEOGRAPH-FA6D +FA70..FAD9 ; Alphabetic # Lo [106] CJK COMPATIBILITY IDEOGRAPH-FA70..CJK COMPATIBILITY IDEOGRAPH-FAD9 +FB00..FB06 ; Alphabetic # L& [7] LATIN SMALL LIGATURE FF..LATIN SMALL LIGATURE ST +FB13..FB17 ; Alphabetic # L& [5] ARMENIAN SMALL LIGATURE MEN NOW..ARMENIAN SMALL LIGATURE MEN XEH +FB1D ; Alphabetic # Lo HEBREW LETTER YOD WITH HIRIQ +FB1E ; Alphabetic # Mn HEBREW POINT JUDEO-SPANISH VARIKA +FB1F..FB28 ; Alphabetic # Lo [10] HEBREW LIGATURE YIDDISH YOD YOD PATAH..HEBREW LETTER WIDE TAV +FB2A..FB36 ; Alphabetic # Lo [13] HEBREW LETTER SHIN WITH SHIN DOT..HEBREW LETTER ZAYIN WITH DAGESH +FB38..FB3C ; Alphabetic # Lo [5] HEBREW LETTER TET WITH DAGESH..HEBREW LETTER LAMED WITH DAGESH +FB3E ; Alphabetic # Lo HEBREW LETTER MEM WITH DAGESH +FB40..FB41 ; Alphabetic # Lo [2] HEBREW LETTER NUN WITH DAGESH..HEBREW LETTER SAMEKH WITH DAGESH +FB43..FB44 ; Alphabetic # Lo [2] HEBREW LETTER FINAL PE WITH DAGESH..HEBREW LETTER PE WITH DAGESH +FB46..FBB1 ; Alphabetic # Lo [108] HEBREW LETTER TSADI WITH DAGESH..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM +FBD3..FD3D ; Alphabetic # Lo [363] ARABIC LETTER NG ISOLATED FORM..ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM +FD50..FD8F ; Alphabetic # Lo [64] ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM..ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM +FD92..FDC7 ; Alphabetic # Lo [54] ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM..ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM +FDF0..FDFB ; Alphabetic # Lo [12] ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM..ARABIC LIGATURE JALLAJALALOUHOU +FE70..FE74 ; Alphabetic # Lo [5] ARABIC FATHATAN ISOLATED FORM..ARABIC KASRATAN ISOLATED FORM +FE76..FEFC ; Alphabetic # Lo [135] ARABIC FATHA ISOLATED FORM..ARABIC LIGATURE LAM WITH ALEF FINAL FORM +FF21..FF3A ; Alphabetic # L& [26] FULLWIDTH LATIN CAPITAL LETTER A..FULLWIDTH LATIN CAPITAL LETTER Z +FF41..FF5A ; Alphabetic # L& [26] FULLWIDTH LATIN SMALL LETTER A..FULLWIDTH LATIN SMALL LETTER Z +FF66..FF6F ; Alphabetic # Lo [10] HALFWIDTH KATAKANA LETTER WO..HALFWIDTH KATAKANA LETTER SMALL TU +FF70 ; Alphabetic # Lm HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK +FF71..FF9D ; Alphabetic # Lo [45] HALFWIDTH KATAKANA LETTER A..HALFWIDTH KATAKANA LETTER N +FF9E..FF9F ; Alphabetic # Lm [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK +FFA0..FFBE ; Alphabetic # Lo [31] HALFWIDTH HANGUL FILLER..HALFWIDTH HANGUL LETTER HIEUH +FFC2..FFC7 ; Alphabetic # Lo [6] HALFWIDTH HANGUL LETTER A..HALFWIDTH HANGUL LETTER E +FFCA..FFCF ; Alphabetic # Lo [6] HALFWIDTH HANGUL LETTER YEO..HALFWIDTH HANGUL LETTER OE +FFD2..FFD7 ; Alphabetic # Lo [6] HALFWIDTH HANGUL LETTER YO..HALFWIDTH HANGUL LETTER YU +FFDA..FFDC ; Alphabetic # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL LETTER I +10000..1000B ; Alphabetic # Lo [12] LINEAR B SYLLABLE B008 A..LINEAR B SYLLABLE B046 JE +1000D..10026 ; Alphabetic # Lo [26] LINEAR B SYLLABLE B036 JO..LINEAR B SYLLABLE B032 QO +10028..1003A ; Alphabetic # Lo [19] LINEAR B SYLLABLE B060 RA..LINEAR B SYLLABLE B042 WO +1003C..1003D ; Alphabetic # Lo [2] LINEAR B SYLLABLE B017 ZA..LINEAR B SYLLABLE B074 ZE +1003F..1004D ; Alphabetic # Lo [15] LINEAR B SYLLABLE B020 ZO..LINEAR B SYLLABLE B091 TWO +10050..1005D ; Alphabetic # Lo [14] LINEAR B SYMBOL B018..LINEAR B SYMBOL B089 +10080..100FA ; Alphabetic # Lo [123] LINEAR B IDEOGRAM B100 MAN..LINEAR B IDEOGRAM VESSEL B305 +10140..10174 ; Alphabetic # Nl [53] GREEK ACROPHONIC ATTIC ONE QUARTER..GREEK ACROPHONIC STRATIAN FIFTY MNAS +10280..1029C ; Alphabetic # Lo [29] LYCIAN LETTER A..LYCIAN LETTER X +102A0..102D0 ; Alphabetic # Lo [49] CARIAN LETTER A..CARIAN LETTER UUU3 +10300..1031F ; Alphabetic # Lo [32] OLD ITALIC LETTER A..OLD ITALIC LETTER ESS +1032D..10340 ; Alphabetic # Lo [20] OLD ITALIC LETTER YE..GOTHIC LETTER PAIRTHRA +10341 ; Alphabetic # Nl GOTHIC LETTER NINETY +10342..10349 ; Alphabetic # Lo [8] GOTHIC LETTER RAIDA..GOTHIC LETTER OTHAL +1034A ; Alphabetic # Nl GOTHIC LETTER NINE HUNDRED +10350..10375 ; Alphabetic # Lo [38] OLD PERMIC LETTER AN..OLD PERMIC LETTER IA +10376..1037A ; Alphabetic # Mn [5] COMBINING OLD PERMIC LETTER AN..COMBINING OLD PERMIC LETTER SII +10380..1039D ; Alphabetic # Lo [30] UGARITIC LETTER ALPA..UGARITIC LETTER SSU +103A0..103C3 ; Alphabetic # Lo [36] OLD PERSIAN SIGN A..OLD PERSIAN SIGN HA +103C8..103CF ; Alphabetic # Lo [8] OLD PERSIAN SIGN AURAMAZDAA..OLD PERSIAN SIGN BUUMISH +103D1..103D5 ; Alphabetic # Nl [5] OLD PERSIAN NUMBER ONE..OLD PERSIAN NUMBER HUNDRED +10400..1044F ; Alphabetic # L& [80] DESERET CAPITAL LETTER LONG I..DESERET SMALL LETTER EW +10450..1049D ; Alphabetic # Lo [78] SHAVIAN LETTER PEEP..OSMANYA LETTER OO +104B0..104D3 ; Alphabetic # L& [36] OSAGE CAPITAL LETTER A..OSAGE CAPITAL LETTER ZHA +104D8..104FB ; Alphabetic # L& [36] OSAGE SMALL LETTER A..OSAGE SMALL LETTER ZHA +10500..10527 ; Alphabetic # Lo [40] ELBASAN LETTER A..ELBASAN LETTER KHE +10530..10563 ; Alphabetic # Lo [52] CAUCASIAN ALBANIAN LETTER ALT..CAUCASIAN ALBANIAN LETTER KIW +10600..10736 ; Alphabetic # Lo [311] LINEAR A SIGN AB001..LINEAR A SIGN A664 +10740..10755 ; Alphabetic # Lo [22] LINEAR A SIGN A701 A..LINEAR A SIGN A732 JE +10760..10767 ; Alphabetic # Lo [8] LINEAR A SIGN A800..LINEAR A SIGN A807 +10800..10805 ; Alphabetic # Lo [6] CYPRIOT SYLLABLE A..CYPRIOT SYLLABLE JA +10808 ; Alphabetic # Lo CYPRIOT SYLLABLE JO +1080A..10835 ; Alphabetic # Lo [44] CYPRIOT SYLLABLE KA..CYPRIOT SYLLABLE WO +10837..10838 ; Alphabetic # Lo [2] CYPRIOT SYLLABLE XA..CYPRIOT SYLLABLE XE +1083C ; Alphabetic # Lo CYPRIOT SYLLABLE ZA +1083F..10855 ; Alphabetic # Lo [23] CYPRIOT SYLLABLE ZO..IMPERIAL ARAMAIC LETTER TAW +10860..10876 ; Alphabetic # Lo [23] PALMYRENE LETTER ALEPH..PALMYRENE LETTER TAW +10880..1089E ; Alphabetic # Lo [31] NABATAEAN LETTER FINAL ALEPH..NABATAEAN LETTER TAW +108E0..108F2 ; Alphabetic # Lo [19] HATRAN LETTER ALEPH..HATRAN LETTER QOPH +108F4..108F5 ; Alphabetic # Lo [2] HATRAN LETTER SHIN..HATRAN LETTER TAW +10900..10915 ; Alphabetic # Lo [22] PHOENICIAN LETTER ALF..PHOENICIAN LETTER TAU +10920..10939 ; Alphabetic # Lo [26] LYDIAN LETTER A..LYDIAN LETTER C +10980..109B7 ; Alphabetic # Lo [56] MEROITIC HIEROGLYPHIC LETTER A..MEROITIC CURSIVE LETTER DA +109BE..109BF ; Alphabetic # Lo [2] MEROITIC CURSIVE LOGOGRAM RMT..MEROITIC CURSIVE LOGOGRAM IMN +10A00 ; Alphabetic # Lo KHAROSHTHI LETTER A +10A01..10A03 ; Alphabetic # Mn [3] KHAROSHTHI VOWEL SIGN I..KHAROSHTHI VOWEL SIGN VOCALIC R +10A05..10A06 ; Alphabetic # Mn [2] KHAROSHTHI VOWEL SIGN E..KHAROSHTHI VOWEL SIGN O +10A0C..10A0F ; Alphabetic # Mn [4] KHAROSHTHI VOWEL LENGTH MARK..KHAROSHTHI SIGN VISARGA +10A10..10A13 ; Alphabetic # Lo [4] KHAROSHTHI LETTER KA..KHAROSHTHI LETTER GHA +10A15..10A17 ; Alphabetic # Lo [3] KHAROSHTHI LETTER CA..KHAROSHTHI LETTER JA +10A19..10A35 ; Alphabetic # Lo [29] KHAROSHTHI LETTER NYA..KHAROSHTHI LETTER VHA +10A60..10A7C ; Alphabetic # Lo [29] OLD SOUTH ARABIAN LETTER HE..OLD SOUTH ARABIAN LETTER THETH +10A80..10A9C ; Alphabetic # Lo [29] OLD NORTH ARABIAN LETTER HEH..OLD NORTH ARABIAN LETTER ZAH +10AC0..10AC7 ; Alphabetic # Lo [8] MANICHAEAN LETTER ALEPH..MANICHAEAN LETTER WAW +10AC9..10AE4 ; Alphabetic # Lo [28] MANICHAEAN LETTER ZAYIN..MANICHAEAN LETTER TAW +10B00..10B35 ; Alphabetic # Lo [54] AVESTAN LETTER A..AVESTAN LETTER HE +10B40..10B55 ; Alphabetic # Lo [22] INSCRIPTIONAL PARTHIAN LETTER ALEPH..INSCRIPTIONAL PARTHIAN LETTER TAW +10B60..10B72 ; Alphabetic # Lo [19] INSCRIPTIONAL PAHLAVI LETTER ALEPH..INSCRIPTIONAL PAHLAVI LETTER TAW +10B80..10B91 ; Alphabetic # Lo [18] PSALTER PAHLAVI LETTER ALEPH..PSALTER PAHLAVI LETTER TAW +10C00..10C48 ; Alphabetic # Lo [73] OLD TURKIC LETTER ORKHON A..OLD TURKIC LETTER ORKHON BASH +10C80..10CB2 ; Alphabetic # L& [51] OLD HUNGARIAN CAPITAL LETTER A..OLD HUNGARIAN CAPITAL LETTER US +10CC0..10CF2 ; Alphabetic # L& [51] OLD HUNGARIAN SMALL LETTER A..OLD HUNGARIAN SMALL LETTER US +10D00..10D23 ; Alphabetic # Lo [36] HANIFI ROHINGYA LETTER A..HANIFI ROHINGYA MARK NA KHONNA +10D24..10D27 ; Alphabetic # Mn [4] HANIFI ROHINGYA SIGN HARBAHAY..HANIFI ROHINGYA SIGN TASSI +10F00..10F1C ; Alphabetic # Lo [29] OLD SOGDIAN LETTER ALEPH..OLD SOGDIAN LETTER FINAL TAW WITH VERTICAL TAIL +10F27 ; Alphabetic # Lo OLD SOGDIAN LIGATURE AYIN-DALETH +10F30..10F45 ; Alphabetic # Lo [22] SOGDIAN LETTER ALEPH..SOGDIAN INDEPENDENT SHIN +11000 ; Alphabetic # Mc BRAHMI SIGN CANDRABINDU +11001 ; Alphabetic # Mn BRAHMI SIGN ANUSVARA +11002 ; Alphabetic # Mc BRAHMI SIGN VISARGA +11003..11037 ; Alphabetic # Lo [53] BRAHMI SIGN JIHVAMULIYA..BRAHMI LETTER OLD TAMIL NNNA +11038..11045 ; Alphabetic # Mn [14] BRAHMI VOWEL SIGN AA..BRAHMI VOWEL SIGN AU +11082 ; Alphabetic # Mc KAITHI SIGN VISARGA +11083..110AF ; Alphabetic # Lo [45] KAITHI LETTER A..KAITHI LETTER HA +110B0..110B2 ; Alphabetic # Mc [3] KAITHI VOWEL SIGN AA..KAITHI VOWEL SIGN II +110B3..110B6 ; Alphabetic # Mn [4] KAITHI VOWEL SIGN U..KAITHI VOWEL SIGN AI +110B7..110B8 ; Alphabetic # Mc [2] KAITHI VOWEL SIGN O..KAITHI VOWEL SIGN AU +110D0..110E8 ; Alphabetic # Lo [25] SORA SOMPENG LETTER SAH..SORA SOMPENG LETTER MAE +11100..11102 ; Alphabetic # Mn [3] CHAKMA SIGN CANDRABINDU..CHAKMA SIGN VISARGA +11103..11126 ; Alphabetic # Lo [36] CHAKMA LETTER AA..CHAKMA LETTER HAA +11127..1112B ; Alphabetic # Mn [5] CHAKMA VOWEL SIGN A..CHAKMA VOWEL SIGN UU +1112C ; Alphabetic # Mc CHAKMA VOWEL SIGN E +1112D..11132 ; Alphabetic # Mn [6] CHAKMA VOWEL SIGN AI..CHAKMA AU MARK +11144 ; Alphabetic # Lo CHAKMA LETTER LHAA +11145..11146 ; Alphabetic # Mc [2] CHAKMA VOWEL SIGN AA..CHAKMA VOWEL SIGN EI +11150..11172 ; Alphabetic # Lo [35] MAHAJANI LETTER A..MAHAJANI LETTER RRA +11176 ; Alphabetic # Lo MAHAJANI LIGATURE SHRI +11180..11181 ; Alphabetic # Mn [2] SHARADA SIGN CANDRABINDU..SHARADA SIGN ANUSVARA +11182 ; Alphabetic # Mc SHARADA SIGN VISARGA +11183..111B2 ; Alphabetic # Lo [48] SHARADA LETTER A..SHARADA LETTER HA +111B3..111B5 ; Alphabetic # Mc [3] SHARADA VOWEL SIGN AA..SHARADA VOWEL SIGN II +111B6..111BE ; Alphabetic # Mn [9] SHARADA VOWEL SIGN U..SHARADA VOWEL SIGN O +111BF ; Alphabetic # Mc SHARADA VOWEL SIGN AU +111C1..111C4 ; Alphabetic # Lo [4] SHARADA SIGN AVAGRAHA..SHARADA OM +111DA ; Alphabetic # Lo SHARADA EKAM +111DC ; Alphabetic # Lo SHARADA HEADSTROKE +11200..11211 ; Alphabetic # Lo [18] KHOJKI LETTER A..KHOJKI LETTER JJA +11213..1122B ; Alphabetic # Lo [25] KHOJKI LETTER NYA..KHOJKI LETTER LLA +1122C..1122E ; Alphabetic # Mc [3] KHOJKI VOWEL SIGN AA..KHOJKI VOWEL SIGN II +1122F..11231 ; Alphabetic # Mn [3] KHOJKI VOWEL SIGN U..KHOJKI VOWEL SIGN AI +11232..11233 ; Alphabetic # Mc [2] KHOJKI VOWEL SIGN O..KHOJKI VOWEL SIGN AU +11234 ; Alphabetic # Mn KHOJKI SIGN ANUSVARA +11237 ; Alphabetic # Mn KHOJKI SIGN SHADDA +1123E ; Alphabetic # Mn KHOJKI SIGN SUKUN +11280..11286 ; Alphabetic # Lo [7] MULTANI LETTER A..MULTANI LETTER GA +11288 ; Alphabetic # Lo MULTANI LETTER GHA +1128A..1128D ; Alphabetic # Lo [4] MULTANI LETTER CA..MULTANI LETTER JJA +1128F..1129D ; Alphabetic # Lo [15] MULTANI LETTER NYA..MULTANI LETTER BA +1129F..112A8 ; Alphabetic # Lo [10] MULTANI LETTER BHA..MULTANI LETTER RHA +112B0..112DE ; Alphabetic # Lo [47] KHUDAWADI LETTER A..KHUDAWADI LETTER HA +112DF ; Alphabetic # Mn KHUDAWADI SIGN ANUSVARA +112E0..112E2 ; Alphabetic # Mc [3] KHUDAWADI VOWEL SIGN AA..KHUDAWADI VOWEL SIGN II +112E3..112E8 ; Alphabetic # Mn [6] KHUDAWADI VOWEL SIGN U..KHUDAWADI VOWEL SIGN AU +11300..11301 ; Alphabetic # Mn [2] GRANTHA SIGN COMBINING ANUSVARA ABOVE..GRANTHA SIGN CANDRABINDU +11302..11303 ; Alphabetic # Mc [2] GRANTHA SIGN ANUSVARA..GRANTHA SIGN VISARGA +11305..1130C ; Alphabetic # Lo [8] GRANTHA LETTER A..GRANTHA LETTER VOCALIC L +1130F..11310 ; Alphabetic # Lo [2] GRANTHA LETTER EE..GRANTHA LETTER AI +11313..11328 ; Alphabetic # Lo [22] GRANTHA LETTER OO..GRANTHA LETTER NA +1132A..11330 ; Alphabetic # Lo [7] GRANTHA LETTER PA..GRANTHA LETTER RA +11332..11333 ; Alphabetic # Lo [2] GRANTHA LETTER LA..GRANTHA LETTER LLA +11335..11339 ; Alphabetic # Lo [5] GRANTHA LETTER VA..GRANTHA LETTER HA +1133D ; Alphabetic # Lo GRANTHA SIGN AVAGRAHA +1133E..1133F ; Alphabetic # Mc [2] GRANTHA VOWEL SIGN AA..GRANTHA VOWEL SIGN I +11340 ; Alphabetic # Mn GRANTHA VOWEL SIGN II +11341..11344 ; Alphabetic # Mc [4] GRANTHA VOWEL SIGN U..GRANTHA VOWEL SIGN VOCALIC RR +11347..11348 ; Alphabetic # Mc [2] GRANTHA VOWEL SIGN EE..GRANTHA VOWEL SIGN AI +1134B..1134C ; Alphabetic # Mc [2] GRANTHA VOWEL SIGN OO..GRANTHA VOWEL SIGN AU +11350 ; Alphabetic # Lo GRANTHA OM +11357 ; Alphabetic # Mc GRANTHA AU LENGTH MARK +1135D..11361 ; Alphabetic # Lo [5] GRANTHA SIGN PLUTA..GRANTHA LETTER VOCALIC LL +11362..11363 ; Alphabetic # Mc [2] GRANTHA VOWEL SIGN VOCALIC L..GRANTHA VOWEL SIGN VOCALIC LL +11400..11434 ; Alphabetic # Lo [53] NEWA LETTER A..NEWA LETTER HA +11435..11437 ; Alphabetic # Mc [3] NEWA VOWEL SIGN AA..NEWA VOWEL SIGN II +11438..1143F ; Alphabetic # Mn [8] NEWA VOWEL SIGN U..NEWA VOWEL SIGN AI +11440..11441 ; Alphabetic # Mc [2] NEWA VOWEL SIGN O..NEWA VOWEL SIGN AU +11443..11444 ; Alphabetic # Mn [2] NEWA SIGN CANDRABINDU..NEWA SIGN ANUSVARA +11445 ; Alphabetic # Mc NEWA SIGN VISARGA +11447..1144A ; Alphabetic # Lo [4] NEWA SIGN AVAGRAHA..NEWA SIDDHI +11480..114AF ; Alphabetic # Lo [48] TIRHUTA ANJI..TIRHUTA LETTER HA +114B0..114B2 ; Alphabetic # Mc [3] TIRHUTA VOWEL SIGN AA..TIRHUTA VOWEL SIGN II +114B3..114B8 ; Alphabetic # Mn [6] TIRHUTA VOWEL SIGN U..TIRHUTA VOWEL SIGN VOCALIC LL +114B9 ; Alphabetic # Mc TIRHUTA VOWEL SIGN E +114BA ; Alphabetic # Mn TIRHUTA VOWEL SIGN SHORT E +114BB..114BE ; Alphabetic # Mc [4] TIRHUTA VOWEL SIGN AI..TIRHUTA VOWEL SIGN AU +114BF..114C0 ; Alphabetic # Mn [2] TIRHUTA SIGN CANDRABINDU..TIRHUTA SIGN ANUSVARA +114C1 ; Alphabetic # Mc TIRHUTA SIGN VISARGA +114C4..114C5 ; Alphabetic # Lo [2] TIRHUTA SIGN AVAGRAHA..TIRHUTA GVANG +114C7 ; Alphabetic # Lo TIRHUTA OM +11580..115AE ; Alphabetic # Lo [47] SIDDHAM LETTER A..SIDDHAM LETTER HA +115AF..115B1 ; Alphabetic # Mc [3] SIDDHAM VOWEL SIGN AA..SIDDHAM VOWEL SIGN II +115B2..115B5 ; Alphabetic # Mn [4] SIDDHAM VOWEL SIGN U..SIDDHAM VOWEL SIGN VOCALIC RR +115B8..115BB ; Alphabetic # Mc [4] SIDDHAM VOWEL SIGN E..SIDDHAM VOWEL SIGN AU +115BC..115BD ; Alphabetic # Mn [2] SIDDHAM SIGN CANDRABINDU..SIDDHAM SIGN ANUSVARA +115BE ; Alphabetic # Mc SIDDHAM SIGN VISARGA +115D8..115DB ; Alphabetic # Lo [4] SIDDHAM LETTER THREE-CIRCLE ALTERNATE I..SIDDHAM LETTER ALTERNATE U +115DC..115DD ; Alphabetic # Mn [2] SIDDHAM VOWEL SIGN ALTERNATE U..SIDDHAM VOWEL SIGN ALTERNATE UU +11600..1162F ; Alphabetic # Lo [48] MODI LETTER A..MODI LETTER LLA +11630..11632 ; Alphabetic # Mc [3] MODI VOWEL SIGN AA..MODI VOWEL SIGN II +11633..1163A ; Alphabetic # Mn [8] MODI VOWEL SIGN U..MODI VOWEL SIGN AI +1163B..1163C ; Alphabetic # Mc [2] MODI VOWEL SIGN O..MODI VOWEL SIGN AU +1163D ; Alphabetic # Mn MODI SIGN ANUSVARA +1163E ; Alphabetic # Mc MODI SIGN VISARGA +11640 ; Alphabetic # Mn MODI SIGN ARDHACANDRA +11644 ; Alphabetic # Lo MODI SIGN HUVA +11680..116AA ; Alphabetic # Lo [43] TAKRI LETTER A..TAKRI LETTER RRA +116AB ; Alphabetic # Mn TAKRI SIGN ANUSVARA +116AC ; Alphabetic # Mc TAKRI SIGN VISARGA +116AD ; Alphabetic # Mn TAKRI VOWEL SIGN AA +116AE..116AF ; Alphabetic # Mc [2] TAKRI VOWEL SIGN I..TAKRI VOWEL SIGN II +116B0..116B5 ; Alphabetic # Mn [6] TAKRI VOWEL SIGN U..TAKRI VOWEL SIGN AU +11700..1171A ; Alphabetic # Lo [27] AHOM LETTER KA..AHOM LETTER ALTERNATE BA +1171D..1171F ; Alphabetic # Mn [3] AHOM CONSONANT SIGN MEDIAL LA..AHOM CONSONANT SIGN MEDIAL LIGATING RA +11720..11721 ; Alphabetic # Mc [2] AHOM VOWEL SIGN A..AHOM VOWEL SIGN AA +11722..11725 ; Alphabetic # Mn [4] AHOM VOWEL SIGN I..AHOM VOWEL SIGN UU +11726 ; Alphabetic # Mc AHOM VOWEL SIGN E +11727..1172A ; Alphabetic # Mn [4] AHOM VOWEL SIGN AW..AHOM VOWEL SIGN AM +11800..1182B ; Alphabetic # Lo [44] DOGRA LETTER A..DOGRA LETTER RRA +1182C..1182E ; Alphabetic # Mc [3] DOGRA VOWEL SIGN AA..DOGRA VOWEL SIGN II +1182F..11837 ; Alphabetic # Mn [9] DOGRA VOWEL SIGN U..DOGRA SIGN ANUSVARA +11838 ; Alphabetic # Mc DOGRA SIGN VISARGA +118A0..118DF ; Alphabetic # L& [64] WARANG CITI CAPITAL LETTER NGAA..WARANG CITI SMALL LETTER VIYO +118FF ; Alphabetic # Lo WARANG CITI OM +11A00 ; Alphabetic # Lo ZANABAZAR SQUARE LETTER A +11A01..11A0A ; Alphabetic # Mn [10] ZANABAZAR SQUARE VOWEL SIGN I..ZANABAZAR SQUARE VOWEL LENGTH MARK +11A0B..11A32 ; Alphabetic # Lo [40] ZANABAZAR SQUARE LETTER KA..ZANABAZAR SQUARE LETTER KSSA +11A35..11A38 ; Alphabetic # Mn [4] ZANABAZAR SQUARE SIGN CANDRABINDU..ZANABAZAR SQUARE SIGN ANUSVARA +11A39 ; Alphabetic # Mc ZANABAZAR SQUARE SIGN VISARGA +11A3A ; Alphabetic # Lo ZANABAZAR SQUARE CLUSTER-INITIAL LETTER RA +11A3B..11A3E ; Alphabetic # Mn [4] ZANABAZAR SQUARE CLUSTER-FINAL LETTER YA..ZANABAZAR SQUARE CLUSTER-FINAL LETTER VA +11A50 ; Alphabetic # Lo SOYOMBO LETTER A +11A51..11A56 ; Alphabetic # Mn [6] SOYOMBO VOWEL SIGN I..SOYOMBO VOWEL SIGN OE +11A57..11A58 ; Alphabetic # Mc [2] SOYOMBO VOWEL SIGN AI..SOYOMBO VOWEL SIGN AU +11A59..11A5B ; Alphabetic # Mn [3] SOYOMBO VOWEL SIGN VOCALIC R..SOYOMBO VOWEL LENGTH MARK +11A5C..11A83 ; Alphabetic # Lo [40] SOYOMBO LETTER KA..SOYOMBO LETTER KSSA +11A86..11A89 ; Alphabetic # Lo [4] SOYOMBO CLUSTER-INITIAL LETTER RA..SOYOMBO CLUSTER-INITIAL LETTER SA +11A8A..11A96 ; Alphabetic # Mn [13] SOYOMBO FINAL CONSONANT SIGN G..SOYOMBO SIGN ANUSVARA +11A97 ; Alphabetic # Mc SOYOMBO SIGN VISARGA +11A9D ; Alphabetic # Lo SOYOMBO MARK PLUTA +11AC0..11AF8 ; Alphabetic # Lo [57] PAU CIN HAU LETTER PA..PAU CIN HAU GLOTTAL STOP FINAL +11C00..11C08 ; Alphabetic # Lo [9] BHAIKSUKI LETTER A..BHAIKSUKI LETTER VOCALIC L +11C0A..11C2E ; Alphabetic # Lo [37] BHAIKSUKI LETTER E..BHAIKSUKI LETTER HA +11C2F ; Alphabetic # Mc BHAIKSUKI VOWEL SIGN AA +11C30..11C36 ; Alphabetic # Mn [7] BHAIKSUKI VOWEL SIGN I..BHAIKSUKI VOWEL SIGN VOCALIC L +11C38..11C3D ; Alphabetic # Mn [6] BHAIKSUKI VOWEL SIGN E..BHAIKSUKI SIGN ANUSVARA +11C3E ; Alphabetic # Mc BHAIKSUKI SIGN VISARGA +11C40 ; Alphabetic # Lo BHAIKSUKI SIGN AVAGRAHA +11C72..11C8F ; Alphabetic # Lo [30] MARCHEN LETTER KA..MARCHEN LETTER A +11C92..11CA7 ; Alphabetic # Mn [22] MARCHEN SUBJOINED LETTER KA..MARCHEN SUBJOINED LETTER ZA +11CA9 ; Alphabetic # Mc MARCHEN SUBJOINED LETTER YA +11CAA..11CB0 ; Alphabetic # Mn [7] MARCHEN SUBJOINED LETTER RA..MARCHEN VOWEL SIGN AA +11CB1 ; Alphabetic # Mc MARCHEN VOWEL SIGN I +11CB2..11CB3 ; Alphabetic # Mn [2] MARCHEN VOWEL SIGN U..MARCHEN VOWEL SIGN E +11CB4 ; Alphabetic # Mc MARCHEN VOWEL SIGN O +11CB5..11CB6 ; Alphabetic # Mn [2] MARCHEN SIGN ANUSVARA..MARCHEN SIGN CANDRABINDU +11D00..11D06 ; Alphabetic # Lo [7] MASARAM GONDI LETTER A..MASARAM GONDI LETTER E +11D08..11D09 ; Alphabetic # Lo [2] MASARAM GONDI LETTER AI..MASARAM GONDI LETTER O +11D0B..11D30 ; Alphabetic # Lo [38] MASARAM GONDI LETTER AU..MASARAM GONDI LETTER TRA +11D31..11D36 ; Alphabetic # Mn [6] MASARAM GONDI VOWEL SIGN AA..MASARAM GONDI VOWEL SIGN VOCALIC R +11D3A ; Alphabetic # Mn MASARAM GONDI VOWEL SIGN E +11D3C..11D3D ; Alphabetic # Mn [2] MASARAM GONDI VOWEL SIGN AI..MASARAM GONDI VOWEL SIGN O +11D3F..11D41 ; Alphabetic # Mn [3] MASARAM GONDI VOWEL SIGN AU..MASARAM GONDI SIGN VISARGA +11D43 ; Alphabetic # Mn MASARAM GONDI SIGN CANDRA +11D46 ; Alphabetic # Lo MASARAM GONDI REPHA +11D47 ; Alphabetic # Mn MASARAM GONDI RA-KARA +11D60..11D65 ; Alphabetic # Lo [6] GUNJALA GONDI LETTER A..GUNJALA GONDI LETTER UU +11D67..11D68 ; Alphabetic # Lo [2] GUNJALA GONDI LETTER EE..GUNJALA GONDI LETTER AI +11D6A..11D89 ; Alphabetic # Lo [32] GUNJALA GONDI LETTER OO..GUNJALA GONDI LETTER SA +11D8A..11D8E ; Alphabetic # Mc [5] GUNJALA GONDI VOWEL SIGN AA..GUNJALA GONDI VOWEL SIGN UU +11D90..11D91 ; Alphabetic # Mn [2] GUNJALA GONDI VOWEL SIGN EE..GUNJALA GONDI VOWEL SIGN AI +11D93..11D94 ; Alphabetic # Mc [2] GUNJALA GONDI VOWEL SIGN OO..GUNJALA GONDI VOWEL SIGN AU +11D95 ; Alphabetic # Mn GUNJALA GONDI SIGN ANUSVARA +11D96 ; Alphabetic # Mc GUNJALA GONDI SIGN VISARGA +11D98 ; Alphabetic # Lo GUNJALA GONDI OM +11EE0..11EF2 ; Alphabetic # Lo [19] MAKASAR LETTER KA..MAKASAR ANGKA +11EF3..11EF4 ; Alphabetic # Mn [2] MAKASAR VOWEL SIGN I..MAKASAR VOWEL SIGN U +11EF5..11EF6 ; Alphabetic # Mc [2] MAKASAR VOWEL SIGN E..MAKASAR VOWEL SIGN O +12000..12399 ; Alphabetic # Lo [922] CUNEIFORM SIGN A..CUNEIFORM SIGN U U +12400..1246E ; Alphabetic # Nl [111] CUNEIFORM NUMERIC SIGN TWO ASH..CUNEIFORM NUMERIC SIGN NINE U VARIANT FORM +12480..12543 ; Alphabetic # Lo [196] CUNEIFORM SIGN AB TIMES NUN TENU..CUNEIFORM SIGN ZU5 TIMES THREE DISH TENU +13000..1342E ; Alphabetic # Lo [1071] EGYPTIAN HIEROGLYPH A001..EGYPTIAN HIEROGLYPH AA032 +14400..14646 ; Alphabetic # Lo [583] ANATOLIAN HIEROGLYPH A001..ANATOLIAN HIEROGLYPH A530 +16800..16A38 ; Alphabetic # Lo [569] BAMUM LETTER PHASE-A NGKUE MFON..BAMUM LETTER PHASE-F VUEQ +16A40..16A5E ; Alphabetic # Lo [31] MRO LETTER TA..MRO LETTER TEK +16AD0..16AED ; Alphabetic # Lo [30] BASSA VAH LETTER ENNI..BASSA VAH LETTER I +16B00..16B2F ; Alphabetic # Lo [48] PAHAWH HMONG VOWEL KEEB..PAHAWH HMONG CONSONANT CAU +16B30..16B36 ; Alphabetic # Mn [7] PAHAWH HMONG MARK CIM TUB..PAHAWH HMONG MARK CIM TAUM +16B40..16B43 ; Alphabetic # Lm [4] PAHAWH HMONG SIGN VOS SEEV..PAHAWH HMONG SIGN IB YAM +16B63..16B77 ; Alphabetic # Lo [21] PAHAWH HMONG SIGN VOS LUB..PAHAWH HMONG SIGN CIM NRES TOS +16B7D..16B8F ; Alphabetic # Lo [19] PAHAWH HMONG CLAN SIGN TSHEEJ..PAHAWH HMONG CLAN SIGN VWJ +16E40..16E7F ; Alphabetic # L& [64] MEDEFAIDRIN CAPITAL LETTER M..MEDEFAIDRIN SMALL LETTER Y +16F00..16F44 ; Alphabetic # Lo [69] MIAO LETTER PA..MIAO LETTER HHA +16F50 ; Alphabetic # Lo MIAO LETTER NASALIZATION +16F51..16F7E ; Alphabetic # Mc [46] MIAO SIGN ASPIRATION..MIAO VOWEL SIGN NG +16F93..16F9F ; Alphabetic # Lm [13] MIAO LETTER TONE-2..MIAO LETTER REFORMED TONE-8 +16FE0..16FE1 ; Alphabetic # Lm [2] TANGUT ITERATION MARK..NUSHU ITERATION MARK +17000..187F1 ; Alphabetic # Lo [6130] TANGUT IDEOGRAPH-17000..TANGUT IDEOGRAPH-187F1 +18800..18AF2 ; Alphabetic # Lo [755] TANGUT COMPONENT-001..TANGUT COMPONENT-755 +1B000..1B11E ; Alphabetic # Lo [287] KATAKANA LETTER ARCHAIC E..HENTAIGANA LETTER N-MU-MO-2 +1B170..1B2FB ; Alphabetic # Lo [396] NUSHU CHARACTER-1B170..NUSHU CHARACTER-1B2FB +1BC00..1BC6A ; Alphabetic # Lo [107] DUPLOYAN LETTER H..DUPLOYAN LETTER VOCALIC M +1BC70..1BC7C ; Alphabetic # Lo [13] DUPLOYAN AFFIX LEFT HORIZONTAL SECANT..DUPLOYAN AFFIX ATTACHED TANGENT HOOK +1BC80..1BC88 ; Alphabetic # Lo [9] DUPLOYAN AFFIX HIGH ACUTE..DUPLOYAN AFFIX HIGH VERTICAL +1BC90..1BC99 ; Alphabetic # Lo [10] DUPLOYAN AFFIX LOW ACUTE..DUPLOYAN AFFIX LOW ARROW +1BC9E ; Alphabetic # Mn DUPLOYAN DOUBLE MARK +1D400..1D454 ; Alphabetic # L& [85] MATHEMATICAL BOLD CAPITAL A..MATHEMATICAL ITALIC SMALL G +1D456..1D49C ; Alphabetic # L& [71] MATHEMATICAL ITALIC SMALL I..MATHEMATICAL SCRIPT CAPITAL A +1D49E..1D49F ; Alphabetic # L& [2] MATHEMATICAL SCRIPT CAPITAL C..MATHEMATICAL SCRIPT CAPITAL D +1D4A2 ; Alphabetic # L& MATHEMATICAL SCRIPT CAPITAL G +1D4A5..1D4A6 ; Alphabetic # L& [2] MATHEMATICAL SCRIPT CAPITAL J..MATHEMATICAL SCRIPT CAPITAL K +1D4A9..1D4AC ; Alphabetic # L& [4] MATHEMATICAL SCRIPT CAPITAL N..MATHEMATICAL SCRIPT CAPITAL Q +1D4AE..1D4B9 ; Alphabetic # L& [12] MATHEMATICAL SCRIPT CAPITAL S..MATHEMATICAL SCRIPT SMALL D +1D4BB ; Alphabetic # L& MATHEMATICAL SCRIPT SMALL F +1D4BD..1D4C3 ; Alphabetic # L& [7] MATHEMATICAL SCRIPT SMALL H..MATHEMATICAL SCRIPT SMALL N +1D4C5..1D505 ; Alphabetic # L& [65] MATHEMATICAL SCRIPT SMALL P..MATHEMATICAL FRAKTUR CAPITAL B +1D507..1D50A ; Alphabetic # L& [4] MATHEMATICAL FRAKTUR CAPITAL D..MATHEMATICAL FRAKTUR CAPITAL G +1D50D..1D514 ; Alphabetic # L& [8] MATHEMATICAL FRAKTUR CAPITAL J..MATHEMATICAL FRAKTUR CAPITAL Q +1D516..1D51C ; Alphabetic # L& [7] MATHEMATICAL FRAKTUR CAPITAL S..MATHEMATICAL FRAKTUR CAPITAL Y +1D51E..1D539 ; Alphabetic # L& [28] MATHEMATICAL FRAKTUR SMALL A..MATHEMATICAL DOUBLE-STRUCK CAPITAL B +1D53B..1D53E ; Alphabetic # L& [4] MATHEMATICAL DOUBLE-STRUCK CAPITAL D..MATHEMATICAL DOUBLE-STRUCK CAPITAL G +1D540..1D544 ; Alphabetic # L& [5] MATHEMATICAL DOUBLE-STRUCK CAPITAL I..MATHEMATICAL DOUBLE-STRUCK CAPITAL M +1D546 ; Alphabetic # L& MATHEMATICAL DOUBLE-STRUCK CAPITAL O +1D54A..1D550 ; Alphabetic # L& [7] MATHEMATICAL DOUBLE-STRUCK CAPITAL S..MATHEMATICAL DOUBLE-STRUCK CAPITAL Y +1D552..1D6A5 ; Alphabetic # L& [340] MATHEMATICAL DOUBLE-STRUCK SMALL A..MATHEMATICAL ITALIC SMALL DOTLESS J +1D6A8..1D6C0 ; Alphabetic # L& [25] MATHEMATICAL BOLD CAPITAL ALPHA..MATHEMATICAL BOLD CAPITAL OMEGA +1D6C2..1D6DA ; Alphabetic # L& [25] MATHEMATICAL BOLD SMALL ALPHA..MATHEMATICAL BOLD SMALL OMEGA +1D6DC..1D6FA ; Alphabetic # L& [31] MATHEMATICAL BOLD EPSILON SYMBOL..MATHEMATICAL ITALIC CAPITAL OMEGA +1D6FC..1D714 ; Alphabetic # L& [25] MATHEMATICAL ITALIC SMALL ALPHA..MATHEMATICAL ITALIC SMALL OMEGA +1D716..1D734 ; Alphabetic # L& [31] MATHEMATICAL ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD ITALIC CAPITAL OMEGA +1D736..1D74E ; Alphabetic # L& [25] MATHEMATICAL BOLD ITALIC SMALL ALPHA..MATHEMATICAL BOLD ITALIC SMALL OMEGA +1D750..1D76E ; Alphabetic # L& [31] MATHEMATICAL BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA +1D770..1D788 ; Alphabetic # L& [25] MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA +1D78A..1D7A8 ; Alphabetic # L& [31] MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA +1D7AA..1D7C2 ; Alphabetic # L& [25] MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA +1D7C4..1D7CB ; Alphabetic # L& [8] MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD SMALL DIGAMMA +1E000..1E006 ; Alphabetic # Mn [7] COMBINING GLAGOLITIC LETTER AZU..COMBINING GLAGOLITIC LETTER ZHIVETE +1E008..1E018 ; Alphabetic # Mn [17] COMBINING GLAGOLITIC LETTER ZEMLJA..COMBINING GLAGOLITIC LETTER HERU +1E01B..1E021 ; Alphabetic # Mn [7] COMBINING GLAGOLITIC LETTER SHTA..COMBINING GLAGOLITIC LETTER YATI +1E023..1E024 ; Alphabetic # Mn [2] COMBINING GLAGOLITIC LETTER YU..COMBINING GLAGOLITIC LETTER SMALL YUS +1E026..1E02A ; Alphabetic # Mn [5] COMBINING GLAGOLITIC LETTER YO..COMBINING GLAGOLITIC LETTER FITA +1E800..1E8C4 ; Alphabetic # Lo [197] MENDE KIKAKUI SYLLABLE M001 KI..MENDE KIKAKUI SYLLABLE M060 NYON +1E900..1E943 ; Alphabetic # L& [68] ADLAM CAPITAL LETTER ALIF..ADLAM SMALL LETTER SHA +1E947 ; Alphabetic # Mn ADLAM HAMZA +1EE00..1EE03 ; Alphabetic # Lo [4] ARABIC MATHEMATICAL ALEF..ARABIC MATHEMATICAL DAL +1EE05..1EE1F ; Alphabetic # Lo [27] ARABIC MATHEMATICAL WAW..ARABIC MATHEMATICAL DOTLESS QAF +1EE21..1EE22 ; Alphabetic # Lo [2] ARABIC MATHEMATICAL INITIAL BEH..ARABIC MATHEMATICAL INITIAL JEEM +1EE24 ; Alphabetic # Lo ARABIC MATHEMATICAL INITIAL HEH +1EE27 ; Alphabetic # Lo ARABIC MATHEMATICAL INITIAL HAH +1EE29..1EE32 ; Alphabetic # Lo [10] ARABIC MATHEMATICAL INITIAL YEH..ARABIC MATHEMATICAL INITIAL QAF +1EE34..1EE37 ; Alphabetic # Lo [4] ARABIC MATHEMATICAL INITIAL SHEEN..ARABIC MATHEMATICAL INITIAL KHAH +1EE39 ; Alphabetic # Lo ARABIC MATHEMATICAL INITIAL DAD +1EE3B ; Alphabetic # Lo ARABIC MATHEMATICAL INITIAL GHAIN +1EE42 ; Alphabetic # Lo ARABIC MATHEMATICAL TAILED JEEM +1EE47 ; Alphabetic # Lo ARABIC MATHEMATICAL TAILED HAH +1EE49 ; Alphabetic # Lo ARABIC MATHEMATICAL TAILED YEH +1EE4B ; Alphabetic # Lo ARABIC MATHEMATICAL TAILED LAM +1EE4D..1EE4F ; Alphabetic # Lo [3] ARABIC MATHEMATICAL TAILED NOON..ARABIC MATHEMATICAL TAILED AIN +1EE51..1EE52 ; Alphabetic # Lo [2] ARABIC MATHEMATICAL TAILED SAD..ARABIC MATHEMATICAL TAILED QAF +1EE54 ; Alphabetic # Lo ARABIC MATHEMATICAL TAILED SHEEN +1EE57 ; Alphabetic # Lo ARABIC MATHEMATICAL TAILED KHAH +1EE59 ; Alphabetic # Lo ARABIC MATHEMATICAL TAILED DAD +1EE5B ; Alphabetic # Lo ARABIC MATHEMATICAL TAILED GHAIN +1EE5D ; Alphabetic # Lo ARABIC MATHEMATICAL TAILED DOTLESS NOON +1EE5F ; Alphabetic # Lo ARABIC MATHEMATICAL TAILED DOTLESS QAF +1EE61..1EE62 ; Alphabetic # Lo [2] ARABIC MATHEMATICAL STRETCHED BEH..ARABIC MATHEMATICAL STRETCHED JEEM +1EE64 ; Alphabetic # Lo ARABIC MATHEMATICAL STRETCHED HEH +1EE67..1EE6A ; Alphabetic # Lo [4] ARABIC MATHEMATICAL STRETCHED HAH..ARABIC MATHEMATICAL STRETCHED KAF +1EE6C..1EE72 ; Alphabetic # Lo [7] ARABIC MATHEMATICAL STRETCHED MEEM..ARABIC MATHEMATICAL STRETCHED QAF +1EE74..1EE77 ; Alphabetic # Lo [4] ARABIC MATHEMATICAL STRETCHED SHEEN..ARABIC MATHEMATICAL STRETCHED KHAH +1EE79..1EE7C ; Alphabetic # Lo [4] ARABIC MATHEMATICAL STRETCHED DAD..ARABIC MATHEMATICAL STRETCHED DOTLESS BEH +1EE7E ; Alphabetic # Lo ARABIC MATHEMATICAL STRETCHED DOTLESS FEH +1EE80..1EE89 ; Alphabetic # Lo [10] ARABIC MATHEMATICAL LOOPED ALEF..ARABIC MATHEMATICAL LOOPED YEH +1EE8B..1EE9B ; Alphabetic # Lo [17] ARABIC MATHEMATICAL LOOPED LAM..ARABIC MATHEMATICAL LOOPED GHAIN +1EEA1..1EEA3 ; Alphabetic # Lo [3] ARABIC MATHEMATICAL DOUBLE-STRUCK BEH..ARABIC MATHEMATICAL DOUBLE-STRUCK DAL +1EEA5..1EEA9 ; Alphabetic # Lo [5] ARABIC MATHEMATICAL DOUBLE-STRUCK WAW..ARABIC MATHEMATICAL DOUBLE-STRUCK YEH +1EEAB..1EEBB ; Alphabetic # Lo [17] ARABIC MATHEMATICAL DOUBLE-STRUCK LAM..ARABIC MATHEMATICAL DOUBLE-STRUCK GHAIN +1F130..1F149 ; Alphabetic # So [26] SQUARED LATIN CAPITAL LETTER A..SQUARED LATIN CAPITAL LETTER Z +1F150..1F169 ; Alphabetic # So [26] NEGATIVE CIRCLED LATIN CAPITAL LETTER A..NEGATIVE CIRCLED LATIN CAPITAL LETTER Z +1F170..1F189 ; Alphabetic # So [26] NEGATIVE SQUARED LATIN CAPITAL LETTER A..NEGATIVE SQUARED LATIN CAPITAL LETTER Z +20000..2A6D6 ; Alphabetic # Lo [42711] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6D6 +2A700..2B734 ; Alphabetic # Lo [4149] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B734 +2B740..2B81D ; Alphabetic # Lo [222] CJK UNIFIED IDEOGRAPH-2B740..CJK UNIFIED IDEOGRAPH-2B81D +2B820..2CEA1 ; Alphabetic # Lo [5762] CJK UNIFIED IDEOGRAPH-2B820..CJK UNIFIED IDEOGRAPH-2CEA1 +2CEB0..2EBE0 ; Alphabetic # Lo [7473] CJK UNIFIED IDEOGRAPH-2CEB0..CJK UNIFIED IDEOGRAPH-2EBE0 +2F800..2FA1D ; Alphabetic # Lo [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D + +# Total code points: 126989 + +# ================================================ + +# Derived Property: Lowercase +# Generated from: Ll + Other_Lowercase + +0061..007A ; Lowercase # L& [26] LATIN SMALL LETTER A..LATIN SMALL LETTER Z +00AA ; Lowercase # Lo FEMININE ORDINAL INDICATOR +00B5 ; Lowercase # L& MICRO SIGN +00BA ; Lowercase # Lo MASCULINE ORDINAL INDICATOR +00DF..00F6 ; Lowercase # L& [24] LATIN SMALL LETTER SHARP S..LATIN SMALL LETTER O WITH DIAERESIS +00F8..00FF ; Lowercase # L& [8] LATIN SMALL LETTER O WITH STROKE..LATIN SMALL LETTER Y WITH DIAERESIS +0101 ; Lowercase # L& LATIN SMALL LETTER A WITH MACRON +0103 ; Lowercase # L& LATIN SMALL LETTER A WITH BREVE +0105 ; Lowercase # L& LATIN SMALL LETTER A WITH OGONEK +0107 ; Lowercase # L& LATIN SMALL LETTER C WITH ACUTE +0109 ; Lowercase # L& LATIN SMALL LETTER C WITH CIRCUMFLEX +010B ; Lowercase # L& LATIN SMALL LETTER C WITH DOT ABOVE +010D ; Lowercase # L& LATIN SMALL LETTER C WITH CARON +010F ; Lowercase # L& LATIN SMALL LETTER D WITH CARON +0111 ; Lowercase # L& LATIN SMALL LETTER D WITH STROKE +0113 ; Lowercase # L& LATIN SMALL LETTER E WITH MACRON +0115 ; Lowercase # L& LATIN SMALL LETTER E WITH BREVE +0117 ; Lowercase # L& LATIN SMALL LETTER E WITH DOT ABOVE +0119 ; Lowercase # L& LATIN SMALL LETTER E WITH OGONEK +011B ; Lowercase # L& LATIN SMALL LETTER E WITH CARON +011D ; Lowercase # L& LATIN SMALL LETTER G WITH CIRCUMFLEX +011F ; Lowercase # L& LATIN SMALL LETTER G WITH BREVE +0121 ; Lowercase # L& LATIN SMALL LETTER G WITH DOT ABOVE +0123 ; Lowercase # L& LATIN SMALL LETTER G WITH CEDILLA +0125 ; Lowercase # L& LATIN SMALL LETTER H WITH CIRCUMFLEX +0127 ; Lowercase # L& LATIN SMALL LETTER H WITH STROKE +0129 ; Lowercase # L& LATIN SMALL LETTER I WITH TILDE +012B ; Lowercase # L& LATIN SMALL LETTER I WITH MACRON +012D ; Lowercase # L& LATIN SMALL LETTER I WITH BREVE +012F ; Lowercase # L& LATIN SMALL LETTER I WITH OGONEK +0131 ; Lowercase # L& LATIN SMALL LETTER DOTLESS I +0133 ; Lowercase # L& LATIN SMALL LIGATURE IJ +0135 ; Lowercase # L& LATIN SMALL LETTER J WITH CIRCUMFLEX +0137..0138 ; Lowercase # L& [2] LATIN SMALL LETTER K WITH CEDILLA..LATIN SMALL LETTER KRA +013A ; Lowercase # L& LATIN SMALL LETTER L WITH ACUTE +013C ; Lowercase # L& LATIN SMALL LETTER L WITH CEDILLA +013E ; Lowercase # L& LATIN SMALL LETTER L WITH CARON +0140 ; Lowercase # L& LATIN SMALL LETTER L WITH MIDDLE DOT +0142 ; Lowercase # L& LATIN SMALL LETTER L WITH STROKE +0144 ; Lowercase # L& LATIN SMALL LETTER N WITH ACUTE +0146 ; Lowercase # L& LATIN SMALL LETTER N WITH CEDILLA +0148..0149 ; Lowercase # L& [2] LATIN SMALL LETTER N WITH CARON..LATIN SMALL LETTER N PRECEDED BY APOSTROPHE +014B ; Lowercase # L& LATIN SMALL LETTER ENG +014D ; Lowercase # L& LATIN SMALL LETTER O WITH MACRON +014F ; Lowercase # L& LATIN SMALL LETTER O WITH BREVE +0151 ; Lowercase # L& LATIN SMALL LETTER O WITH DOUBLE ACUTE +0153 ; Lowercase # L& LATIN SMALL LIGATURE OE +0155 ; Lowercase # L& LATIN SMALL LETTER R WITH ACUTE +0157 ; Lowercase # L& LATIN SMALL LETTER R WITH CEDILLA +0159 ; Lowercase # L& LATIN SMALL LETTER R WITH CARON +015B ; Lowercase # L& LATIN SMALL LETTER S WITH ACUTE +015D ; Lowercase # L& LATIN SMALL LETTER S WITH CIRCUMFLEX +015F ; Lowercase # L& LATIN SMALL LETTER S WITH CEDILLA +0161 ; Lowercase # L& LATIN SMALL LETTER S WITH CARON +0163 ; Lowercase # L& LATIN SMALL LETTER T WITH CEDILLA +0165 ; Lowercase # L& LATIN SMALL LETTER T WITH CARON +0167 ; Lowercase # L& LATIN SMALL LETTER T WITH STROKE +0169 ; Lowercase # L& LATIN SMALL LETTER U WITH TILDE +016B ; Lowercase # L& LATIN SMALL LETTER U WITH MACRON +016D ; Lowercase # L& LATIN SMALL LETTER U WITH BREVE +016F ; Lowercase # L& LATIN SMALL LETTER U WITH RING ABOVE +0171 ; Lowercase # L& LATIN SMALL LETTER U WITH DOUBLE ACUTE +0173 ; Lowercase # L& LATIN SMALL LETTER U WITH OGONEK +0175 ; Lowercase # L& LATIN SMALL LETTER W WITH CIRCUMFLEX +0177 ; Lowercase # L& LATIN SMALL LETTER Y WITH CIRCUMFLEX +017A ; Lowercase # L& LATIN SMALL LETTER Z WITH ACUTE +017C ; Lowercase # L& LATIN SMALL LETTER Z WITH DOT ABOVE +017E..0180 ; Lowercase # L& [3] LATIN SMALL LETTER Z WITH CARON..LATIN SMALL LETTER B WITH STROKE +0183 ; Lowercase # L& LATIN SMALL LETTER B WITH TOPBAR +0185 ; Lowercase # L& LATIN SMALL LETTER TONE SIX +0188 ; Lowercase # L& LATIN SMALL LETTER C WITH HOOK +018C..018D ; Lowercase # L& [2] LATIN SMALL LETTER D WITH TOPBAR..LATIN SMALL LETTER TURNED DELTA +0192 ; Lowercase # L& LATIN SMALL LETTER F WITH HOOK +0195 ; Lowercase # L& LATIN SMALL LETTER HV +0199..019B ; Lowercase # L& [3] LATIN SMALL LETTER K WITH HOOK..LATIN SMALL LETTER LAMBDA WITH STROKE +019E ; Lowercase # L& LATIN SMALL LETTER N WITH LONG RIGHT LEG +01A1 ; Lowercase # L& LATIN SMALL LETTER O WITH HORN +01A3 ; Lowercase # L& LATIN SMALL LETTER OI +01A5 ; Lowercase # L& LATIN SMALL LETTER P WITH HOOK +01A8 ; Lowercase # L& LATIN SMALL LETTER TONE TWO +01AA..01AB ; Lowercase # L& [2] LATIN LETTER REVERSED ESH LOOP..LATIN SMALL LETTER T WITH PALATAL HOOK +01AD ; Lowercase # L& LATIN SMALL LETTER T WITH HOOK +01B0 ; Lowercase # L& LATIN SMALL LETTER U WITH HORN +01B4 ; Lowercase # L& LATIN SMALL LETTER Y WITH HOOK +01B6 ; Lowercase # L& LATIN SMALL LETTER Z WITH STROKE +01B9..01BA ; Lowercase # L& [2] LATIN SMALL LETTER EZH REVERSED..LATIN SMALL LETTER EZH WITH TAIL +01BD..01BF ; Lowercase # L& [3] LATIN SMALL LETTER TONE FIVE..LATIN LETTER WYNN +01C6 ; Lowercase # L& LATIN SMALL LETTER DZ WITH CARON +01C9 ; Lowercase # L& LATIN SMALL LETTER LJ +01CC ; Lowercase # L& LATIN SMALL LETTER NJ +01CE ; Lowercase # L& LATIN SMALL LETTER A WITH CARON +01D0 ; Lowercase # L& LATIN SMALL LETTER I WITH CARON +01D2 ; Lowercase # L& LATIN SMALL LETTER O WITH CARON +01D4 ; Lowercase # L& LATIN SMALL LETTER U WITH CARON +01D6 ; Lowercase # L& LATIN SMALL LETTER U WITH DIAERESIS AND MACRON +01D8 ; Lowercase # L& LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE +01DA ; Lowercase # L& LATIN SMALL LETTER U WITH DIAERESIS AND CARON +01DC..01DD ; Lowercase # L& [2] LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE..LATIN SMALL LETTER TURNED E +01DF ; Lowercase # L& LATIN SMALL LETTER A WITH DIAERESIS AND MACRON +01E1 ; Lowercase # L& LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON +01E3 ; Lowercase # L& LATIN SMALL LETTER AE WITH MACRON +01E5 ; Lowercase # L& LATIN SMALL LETTER G WITH STROKE +01E7 ; Lowercase # L& LATIN SMALL LETTER G WITH CARON +01E9 ; Lowercase # L& LATIN SMALL LETTER K WITH CARON +01EB ; Lowercase # L& LATIN SMALL LETTER O WITH OGONEK +01ED ; Lowercase # L& LATIN SMALL LETTER O WITH OGONEK AND MACRON +01EF..01F0 ; Lowercase # L& [2] LATIN SMALL LETTER EZH WITH CARON..LATIN SMALL LETTER J WITH CARON +01F3 ; Lowercase # L& LATIN SMALL LETTER DZ +01F5 ; Lowercase # L& LATIN SMALL LETTER G WITH ACUTE +01F9 ; Lowercase # L& LATIN SMALL LETTER N WITH GRAVE +01FB ; Lowercase # L& LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE +01FD ; Lowercase # L& LATIN SMALL LETTER AE WITH ACUTE +01FF ; Lowercase # L& LATIN SMALL LETTER O WITH STROKE AND ACUTE +0201 ; Lowercase # L& LATIN SMALL LETTER A WITH DOUBLE GRAVE +0203 ; Lowercase # L& LATIN SMALL LETTER A WITH INVERTED BREVE +0205 ; Lowercase # L& LATIN SMALL LETTER E WITH DOUBLE GRAVE +0207 ; Lowercase # L& LATIN SMALL LETTER E WITH INVERTED BREVE +0209 ; Lowercase # L& LATIN SMALL LETTER I WITH DOUBLE GRAVE +020B ; Lowercase # L& LATIN SMALL LETTER I WITH INVERTED BREVE +020D ; Lowercase # L& LATIN SMALL LETTER O WITH DOUBLE GRAVE +020F ; Lowercase # L& LATIN SMALL LETTER O WITH INVERTED BREVE +0211 ; Lowercase # L& LATIN SMALL LETTER R WITH DOUBLE GRAVE +0213 ; Lowercase # L& LATIN SMALL LETTER R WITH INVERTED BREVE +0215 ; Lowercase # L& LATIN SMALL LETTER U WITH DOUBLE GRAVE +0217 ; Lowercase # L& LATIN SMALL LETTER U WITH INVERTED BREVE +0219 ; Lowercase # L& LATIN SMALL LETTER S WITH COMMA BELOW +021B ; Lowercase # L& LATIN SMALL LETTER T WITH COMMA BELOW +021D ; Lowercase # L& LATIN SMALL LETTER YOGH +021F ; Lowercase # L& LATIN SMALL LETTER H WITH CARON +0221 ; Lowercase # L& LATIN SMALL LETTER D WITH CURL +0223 ; Lowercase # L& LATIN SMALL LETTER OU +0225 ; Lowercase # L& LATIN SMALL LETTER Z WITH HOOK +0227 ; Lowercase # L& LATIN SMALL LETTER A WITH DOT ABOVE +0229 ; Lowercase # L& LATIN SMALL LETTER E WITH CEDILLA +022B ; Lowercase # L& LATIN SMALL LETTER O WITH DIAERESIS AND MACRON +022D ; Lowercase # L& LATIN SMALL LETTER O WITH TILDE AND MACRON +022F ; Lowercase # L& LATIN SMALL LETTER O WITH DOT ABOVE +0231 ; Lowercase # L& LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON +0233..0239 ; Lowercase # L& [7] LATIN SMALL LETTER Y WITH MACRON..LATIN SMALL LETTER QP DIGRAPH +023C ; Lowercase # L& LATIN SMALL LETTER C WITH STROKE +023F..0240 ; Lowercase # L& [2] LATIN SMALL LETTER S WITH SWASH TAIL..LATIN SMALL LETTER Z WITH SWASH TAIL +0242 ; Lowercase # L& LATIN SMALL LETTER GLOTTAL STOP +0247 ; Lowercase # L& LATIN SMALL LETTER E WITH STROKE +0249 ; Lowercase # L& LATIN SMALL LETTER J WITH STROKE +024B ; Lowercase # L& LATIN SMALL LETTER Q WITH HOOK TAIL +024D ; Lowercase # L& LATIN SMALL LETTER R WITH STROKE +024F..0293 ; Lowercase # L& [69] LATIN SMALL LETTER Y WITH STROKE..LATIN SMALL LETTER EZH WITH CURL +0295..02AF ; Lowercase # L& [27] LATIN LETTER PHARYNGEAL VOICED FRICATIVE..LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL +02B0..02B8 ; Lowercase # Lm [9] MODIFIER LETTER SMALL H..MODIFIER LETTER SMALL Y +02C0..02C1 ; Lowercase # Lm [2] MODIFIER LETTER GLOTTAL STOP..MODIFIER LETTER REVERSED GLOTTAL STOP +02E0..02E4 ; Lowercase # Lm [5] MODIFIER LETTER SMALL GAMMA..MODIFIER LETTER SMALL REVERSED GLOTTAL STOP +0345 ; Lowercase # Mn COMBINING GREEK YPOGEGRAMMENI +0371 ; Lowercase # L& GREEK SMALL LETTER HETA +0373 ; Lowercase # L& GREEK SMALL LETTER ARCHAIC SAMPI +0377 ; Lowercase # L& GREEK SMALL LETTER PAMPHYLIAN DIGAMMA +037A ; Lowercase # Lm GREEK YPOGEGRAMMENI +037B..037D ; Lowercase # L& [3] GREEK SMALL REVERSED LUNATE SIGMA SYMBOL..GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL +0390 ; Lowercase # L& GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS +03AC..03CE ; Lowercase # L& [35] GREEK SMALL LETTER ALPHA WITH TONOS..GREEK SMALL LETTER OMEGA WITH TONOS +03D0..03D1 ; Lowercase # L& [2] GREEK BETA SYMBOL..GREEK THETA SYMBOL +03D5..03D7 ; Lowercase # L& [3] GREEK PHI SYMBOL..GREEK KAI SYMBOL +03D9 ; Lowercase # L& GREEK SMALL LETTER ARCHAIC KOPPA +03DB ; Lowercase # L& GREEK SMALL LETTER STIGMA +03DD ; Lowercase # L& GREEK SMALL LETTER DIGAMMA +03DF ; Lowercase # L& GREEK SMALL LETTER KOPPA +03E1 ; Lowercase # L& GREEK SMALL LETTER SAMPI +03E3 ; Lowercase # L& COPTIC SMALL LETTER SHEI +03E5 ; Lowercase # L& COPTIC SMALL LETTER FEI +03E7 ; Lowercase # L& COPTIC SMALL LETTER KHEI +03E9 ; Lowercase # L& COPTIC SMALL LETTER HORI +03EB ; Lowercase # L& COPTIC SMALL LETTER GANGIA +03ED ; Lowercase # L& COPTIC SMALL LETTER SHIMA +03EF..03F3 ; Lowercase # L& [5] COPTIC SMALL LETTER DEI..GREEK LETTER YOT +03F5 ; Lowercase # L& GREEK LUNATE EPSILON SYMBOL +03F8 ; Lowercase # L& GREEK SMALL LETTER SHO +03FB..03FC ; Lowercase # L& [2] GREEK SMALL LETTER SAN..GREEK RHO WITH STROKE SYMBOL +0430..045F ; Lowercase # L& [48] CYRILLIC SMALL LETTER A..CYRILLIC SMALL LETTER DZHE +0461 ; Lowercase # L& CYRILLIC SMALL LETTER OMEGA +0463 ; Lowercase # L& CYRILLIC SMALL LETTER YAT +0465 ; Lowercase # L& CYRILLIC SMALL LETTER IOTIFIED E +0467 ; Lowercase # L& CYRILLIC SMALL LETTER LITTLE YUS +0469 ; Lowercase # L& CYRILLIC SMALL LETTER IOTIFIED LITTLE YUS +046B ; Lowercase # L& CYRILLIC SMALL LETTER BIG YUS +046D ; Lowercase # L& CYRILLIC SMALL LETTER IOTIFIED BIG YUS +046F ; Lowercase # L& CYRILLIC SMALL LETTER KSI +0471 ; Lowercase # L& CYRILLIC SMALL LETTER PSI +0473 ; Lowercase # L& CYRILLIC SMALL LETTER FITA +0475 ; Lowercase # L& CYRILLIC SMALL LETTER IZHITSA +0477 ; Lowercase # L& CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT +0479 ; Lowercase # L& CYRILLIC SMALL LETTER UK +047B ; Lowercase # L& CYRILLIC SMALL LETTER ROUND OMEGA +047D ; Lowercase # L& CYRILLIC SMALL LETTER OMEGA WITH TITLO +047F ; Lowercase # L& CYRILLIC SMALL LETTER OT +0481 ; Lowercase # L& CYRILLIC SMALL LETTER KOPPA +048B ; Lowercase # L& CYRILLIC SMALL LETTER SHORT I WITH TAIL +048D ; Lowercase # L& CYRILLIC SMALL LETTER SEMISOFT SIGN +048F ; Lowercase # L& CYRILLIC SMALL LETTER ER WITH TICK +0491 ; Lowercase # L& CYRILLIC SMALL LETTER GHE WITH UPTURN +0493 ; Lowercase # L& CYRILLIC SMALL LETTER GHE WITH STROKE +0495 ; Lowercase # L& CYRILLIC SMALL LETTER GHE WITH MIDDLE HOOK +0497 ; Lowercase # L& CYRILLIC SMALL LETTER ZHE WITH DESCENDER +0499 ; Lowercase # L& CYRILLIC SMALL LETTER ZE WITH DESCENDER +049B ; Lowercase # L& CYRILLIC SMALL LETTER KA WITH DESCENDER +049D ; Lowercase # L& CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE +049F ; Lowercase # L& CYRILLIC SMALL LETTER KA WITH STROKE +04A1 ; Lowercase # L& CYRILLIC SMALL LETTER BASHKIR KA +04A3 ; Lowercase # L& CYRILLIC SMALL LETTER EN WITH DESCENDER +04A5 ; Lowercase # L& CYRILLIC SMALL LIGATURE EN GHE +04A7 ; Lowercase # L& CYRILLIC SMALL LETTER PE WITH MIDDLE HOOK +04A9 ; Lowercase # L& CYRILLIC SMALL LETTER ABKHASIAN HA +04AB ; Lowercase # L& CYRILLIC SMALL LETTER ES WITH DESCENDER +04AD ; Lowercase # L& CYRILLIC SMALL LETTER TE WITH DESCENDER +04AF ; Lowercase # L& CYRILLIC SMALL LETTER STRAIGHT U +04B1 ; Lowercase # L& CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE +04B3 ; Lowercase # L& CYRILLIC SMALL LETTER HA WITH DESCENDER +04B5 ; Lowercase # L& CYRILLIC SMALL LIGATURE TE TSE +04B7 ; Lowercase # L& CYRILLIC SMALL LETTER CHE WITH DESCENDER +04B9 ; Lowercase # L& CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE +04BB ; Lowercase # L& CYRILLIC SMALL LETTER SHHA +04BD ; Lowercase # L& CYRILLIC SMALL LETTER ABKHASIAN CHE +04BF ; Lowercase # L& CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER +04C2 ; Lowercase # L& CYRILLIC SMALL LETTER ZHE WITH BREVE +04C4 ; Lowercase # L& CYRILLIC SMALL LETTER KA WITH HOOK +04C6 ; Lowercase # L& CYRILLIC SMALL LETTER EL WITH TAIL +04C8 ; Lowercase # L& CYRILLIC SMALL LETTER EN WITH HOOK +04CA ; Lowercase # L& CYRILLIC SMALL LETTER EN WITH TAIL +04CC ; Lowercase # L& CYRILLIC SMALL LETTER KHAKASSIAN CHE +04CE..04CF ; Lowercase # L& [2] CYRILLIC SMALL LETTER EM WITH TAIL..CYRILLIC SMALL LETTER PALOCHKA +04D1 ; Lowercase # L& CYRILLIC SMALL LETTER A WITH BREVE +04D3 ; Lowercase # L& CYRILLIC SMALL LETTER A WITH DIAERESIS +04D5 ; Lowercase # L& CYRILLIC SMALL LIGATURE A IE +04D7 ; Lowercase # L& CYRILLIC SMALL LETTER IE WITH BREVE +04D9 ; Lowercase # L& CYRILLIC SMALL LETTER SCHWA +04DB ; Lowercase # L& CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS +04DD ; Lowercase # L& CYRILLIC SMALL LETTER ZHE WITH DIAERESIS +04DF ; Lowercase # L& CYRILLIC SMALL LETTER ZE WITH DIAERESIS +04E1 ; Lowercase # L& CYRILLIC SMALL LETTER ABKHASIAN DZE +04E3 ; Lowercase # L& CYRILLIC SMALL LETTER I WITH MACRON +04E5 ; Lowercase # L& CYRILLIC SMALL LETTER I WITH DIAERESIS +04E7 ; Lowercase # L& CYRILLIC SMALL LETTER O WITH DIAERESIS +04E9 ; Lowercase # L& CYRILLIC SMALL LETTER BARRED O +04EB ; Lowercase # L& CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS +04ED ; Lowercase # L& CYRILLIC SMALL LETTER E WITH DIAERESIS +04EF ; Lowercase # L& CYRILLIC SMALL LETTER U WITH MACRON +04F1 ; Lowercase # L& CYRILLIC SMALL LETTER U WITH DIAERESIS +04F3 ; Lowercase # L& CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE +04F5 ; Lowercase # L& CYRILLIC SMALL LETTER CHE WITH DIAERESIS +04F7 ; Lowercase # L& CYRILLIC SMALL LETTER GHE WITH DESCENDER +04F9 ; Lowercase # L& CYRILLIC SMALL LETTER YERU WITH DIAERESIS +04FB ; Lowercase # L& CYRILLIC SMALL LETTER GHE WITH STROKE AND HOOK +04FD ; Lowercase # L& CYRILLIC SMALL LETTER HA WITH HOOK +04FF ; Lowercase # L& CYRILLIC SMALL LETTER HA WITH STROKE +0501 ; Lowercase # L& CYRILLIC SMALL LETTER KOMI DE +0503 ; Lowercase # L& CYRILLIC SMALL LETTER KOMI DJE +0505 ; Lowercase # L& CYRILLIC SMALL LETTER KOMI ZJE +0507 ; Lowercase # L& CYRILLIC SMALL LETTER KOMI DZJE +0509 ; Lowercase # L& CYRILLIC SMALL LETTER KOMI LJE +050B ; Lowercase # L& CYRILLIC SMALL LETTER KOMI NJE +050D ; Lowercase # L& CYRILLIC SMALL LETTER KOMI SJE +050F ; Lowercase # L& CYRILLIC SMALL LETTER KOMI TJE +0511 ; Lowercase # L& CYRILLIC SMALL LETTER REVERSED ZE +0513 ; Lowercase # L& CYRILLIC SMALL LETTER EL WITH HOOK +0515 ; Lowercase # L& CYRILLIC SMALL LETTER LHA +0517 ; Lowercase # L& CYRILLIC SMALL LETTER RHA +0519 ; Lowercase # L& CYRILLIC SMALL LETTER YAE +051B ; Lowercase # L& CYRILLIC SMALL LETTER QA +051D ; Lowercase # L& CYRILLIC SMALL LETTER WE +051F ; Lowercase # L& CYRILLIC SMALL LETTER ALEUT KA +0521 ; Lowercase # L& CYRILLIC SMALL LETTER EL WITH MIDDLE HOOK +0523 ; Lowercase # L& CYRILLIC SMALL LETTER EN WITH MIDDLE HOOK +0525 ; Lowercase # L& CYRILLIC SMALL LETTER PE WITH DESCENDER +0527 ; Lowercase # L& CYRILLIC SMALL LETTER SHHA WITH DESCENDER +0529 ; Lowercase # L& CYRILLIC SMALL LETTER EN WITH LEFT HOOK +052B ; Lowercase # L& CYRILLIC SMALL LETTER DZZHE +052D ; Lowercase # L& CYRILLIC SMALL LETTER DCHE +052F ; Lowercase # L& CYRILLIC SMALL LETTER EL WITH DESCENDER +0560..0588 ; Lowercase # L& [41] ARMENIAN SMALL LETTER TURNED AYB..ARMENIAN SMALL LETTER YI WITH STROKE +10D0..10FA ; Lowercase # L& [43] GEORGIAN LETTER AN..GEORGIAN LETTER AIN +10FD..10FF ; Lowercase # L& [3] GEORGIAN LETTER AEN..GEORGIAN LETTER LABIAL SIGN +13F8..13FD ; Lowercase # L& [6] CHEROKEE SMALL LETTER YE..CHEROKEE SMALL LETTER MV +1C80..1C88 ; Lowercase # L& [9] CYRILLIC SMALL LETTER ROUNDED VE..CYRILLIC SMALL LETTER UNBLENDED UK +1D00..1D2B ; Lowercase # L& [44] LATIN LETTER SMALL CAPITAL A..CYRILLIC LETTER SMALL CAPITAL EL +1D2C..1D6A ; Lowercase # Lm [63] MODIFIER LETTER CAPITAL A..GREEK SUBSCRIPT SMALL LETTER CHI +1D6B..1D77 ; Lowercase # L& [13] LATIN SMALL LETTER UE..LATIN SMALL LETTER TURNED G +1D78 ; Lowercase # Lm MODIFIER LETTER CYRILLIC EN +1D79..1D9A ; Lowercase # L& [34] LATIN SMALL LETTER INSULAR G..LATIN SMALL LETTER EZH WITH RETROFLEX HOOK +1D9B..1DBF ; Lowercase # Lm [37] MODIFIER LETTER SMALL TURNED ALPHA..MODIFIER LETTER SMALL THETA +1E01 ; Lowercase # L& LATIN SMALL LETTER A WITH RING BELOW +1E03 ; Lowercase # L& LATIN SMALL LETTER B WITH DOT ABOVE +1E05 ; Lowercase # L& LATIN SMALL LETTER B WITH DOT BELOW +1E07 ; Lowercase # L& LATIN SMALL LETTER B WITH LINE BELOW +1E09 ; Lowercase # L& LATIN SMALL LETTER C WITH CEDILLA AND ACUTE +1E0B ; Lowercase # L& LATIN SMALL LETTER D WITH DOT ABOVE +1E0D ; Lowercase # L& LATIN SMALL LETTER D WITH DOT BELOW +1E0F ; Lowercase # L& LATIN SMALL LETTER D WITH LINE BELOW +1E11 ; Lowercase # L& LATIN SMALL LETTER D WITH CEDILLA +1E13 ; Lowercase # L& LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW +1E15 ; Lowercase # L& LATIN SMALL LETTER E WITH MACRON AND GRAVE +1E17 ; Lowercase # L& LATIN SMALL LETTER E WITH MACRON AND ACUTE +1E19 ; Lowercase # L& LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW +1E1B ; Lowercase # L& LATIN SMALL LETTER E WITH TILDE BELOW +1E1D ; Lowercase # L& LATIN SMALL LETTER E WITH CEDILLA AND BREVE +1E1F ; Lowercase # L& LATIN SMALL LETTER F WITH DOT ABOVE +1E21 ; Lowercase # L& LATIN SMALL LETTER G WITH MACRON +1E23 ; Lowercase # L& LATIN SMALL LETTER H WITH DOT ABOVE +1E25 ; Lowercase # L& LATIN SMALL LETTER H WITH DOT BELOW +1E27 ; Lowercase # L& LATIN SMALL LETTER H WITH DIAERESIS +1E29 ; Lowercase # L& LATIN SMALL LETTER H WITH CEDILLA +1E2B ; Lowercase # L& LATIN SMALL LETTER H WITH BREVE BELOW +1E2D ; Lowercase # L& LATIN SMALL LETTER I WITH TILDE BELOW +1E2F ; Lowercase # L& LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE +1E31 ; Lowercase # L& LATIN SMALL LETTER K WITH ACUTE +1E33 ; Lowercase # L& LATIN SMALL LETTER K WITH DOT BELOW +1E35 ; Lowercase # L& LATIN SMALL LETTER K WITH LINE BELOW +1E37 ; Lowercase # L& LATIN SMALL LETTER L WITH DOT BELOW +1E39 ; Lowercase # L& LATIN SMALL LETTER L WITH DOT BELOW AND MACRON +1E3B ; Lowercase # L& LATIN SMALL LETTER L WITH LINE BELOW +1E3D ; Lowercase # L& LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW +1E3F ; Lowercase # L& LATIN SMALL LETTER M WITH ACUTE +1E41 ; Lowercase # L& LATIN SMALL LETTER M WITH DOT ABOVE +1E43 ; Lowercase # L& LATIN SMALL LETTER M WITH DOT BELOW +1E45 ; Lowercase # L& LATIN SMALL LETTER N WITH DOT ABOVE +1E47 ; Lowercase # L& LATIN SMALL LETTER N WITH DOT BELOW +1E49 ; Lowercase # L& LATIN SMALL LETTER N WITH LINE BELOW +1E4B ; Lowercase # L& LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW +1E4D ; Lowercase # L& LATIN SMALL LETTER O WITH TILDE AND ACUTE +1E4F ; Lowercase # L& LATIN SMALL LETTER O WITH TILDE AND DIAERESIS +1E51 ; Lowercase # L& LATIN SMALL LETTER O WITH MACRON AND GRAVE +1E53 ; Lowercase # L& LATIN SMALL LETTER O WITH MACRON AND ACUTE +1E55 ; Lowercase # L& LATIN SMALL LETTER P WITH ACUTE +1E57 ; Lowercase # L& LATIN SMALL LETTER P WITH DOT ABOVE +1E59 ; Lowercase # L& LATIN SMALL LETTER R WITH DOT ABOVE +1E5B ; Lowercase # L& LATIN SMALL LETTER R WITH DOT BELOW +1E5D ; Lowercase # L& LATIN SMALL LETTER R WITH DOT BELOW AND MACRON +1E5F ; Lowercase # L& LATIN SMALL LETTER R WITH LINE BELOW +1E61 ; Lowercase # L& LATIN SMALL LETTER S WITH DOT ABOVE +1E63 ; Lowercase # L& LATIN SMALL LETTER S WITH DOT BELOW +1E65 ; Lowercase # L& LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE +1E67 ; Lowercase # L& LATIN SMALL LETTER S WITH CARON AND DOT ABOVE +1E69 ; Lowercase # L& LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE +1E6B ; Lowercase # L& LATIN SMALL LETTER T WITH DOT ABOVE +1E6D ; Lowercase # L& LATIN SMALL LETTER T WITH DOT BELOW +1E6F ; Lowercase # L& LATIN SMALL LETTER T WITH LINE BELOW +1E71 ; Lowercase # L& LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW +1E73 ; Lowercase # L& LATIN SMALL LETTER U WITH DIAERESIS BELOW +1E75 ; Lowercase # L& LATIN SMALL LETTER U WITH TILDE BELOW +1E77 ; Lowercase # L& LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW +1E79 ; Lowercase # L& LATIN SMALL LETTER U WITH TILDE AND ACUTE +1E7B ; Lowercase # L& LATIN SMALL LETTER U WITH MACRON AND DIAERESIS +1E7D ; Lowercase # L& LATIN SMALL LETTER V WITH TILDE +1E7F ; Lowercase # L& LATIN SMALL LETTER V WITH DOT BELOW +1E81 ; Lowercase # L& LATIN SMALL LETTER W WITH GRAVE +1E83 ; Lowercase # L& LATIN SMALL LETTER W WITH ACUTE +1E85 ; Lowercase # L& LATIN SMALL LETTER W WITH DIAERESIS +1E87 ; Lowercase # L& LATIN SMALL LETTER W WITH DOT ABOVE +1E89 ; Lowercase # L& LATIN SMALL LETTER W WITH DOT BELOW +1E8B ; Lowercase # L& LATIN SMALL LETTER X WITH DOT ABOVE +1E8D ; Lowercase # L& LATIN SMALL LETTER X WITH DIAERESIS +1E8F ; Lowercase # L& LATIN SMALL LETTER Y WITH DOT ABOVE +1E91 ; Lowercase # L& LATIN SMALL LETTER Z WITH CIRCUMFLEX +1E93 ; Lowercase # L& LATIN SMALL LETTER Z WITH DOT BELOW +1E95..1E9D ; Lowercase # L& [9] LATIN SMALL LETTER Z WITH LINE BELOW..LATIN SMALL LETTER LONG S WITH HIGH STROKE +1E9F ; Lowercase # L& LATIN SMALL LETTER DELTA +1EA1 ; Lowercase # L& LATIN SMALL LETTER A WITH DOT BELOW +1EA3 ; Lowercase # L& LATIN SMALL LETTER A WITH HOOK ABOVE +1EA5 ; Lowercase # L& LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE +1EA7 ; Lowercase # L& LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE +1EA9 ; Lowercase # L& LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE +1EAB ; Lowercase # L& LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE +1EAD ; Lowercase # L& LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW +1EAF ; Lowercase # L& LATIN SMALL LETTER A WITH BREVE AND ACUTE +1EB1 ; Lowercase # L& LATIN SMALL LETTER A WITH BREVE AND GRAVE +1EB3 ; Lowercase # L& LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE +1EB5 ; Lowercase # L& LATIN SMALL LETTER A WITH BREVE AND TILDE +1EB7 ; Lowercase # L& LATIN SMALL LETTER A WITH BREVE AND DOT BELOW +1EB9 ; Lowercase # L& LATIN SMALL LETTER E WITH DOT BELOW +1EBB ; Lowercase # L& LATIN SMALL LETTER E WITH HOOK ABOVE +1EBD ; Lowercase # L& LATIN SMALL LETTER E WITH TILDE +1EBF ; Lowercase # L& LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE +1EC1 ; Lowercase # L& LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE +1EC3 ; Lowercase # L& LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE +1EC5 ; Lowercase # L& LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE +1EC7 ; Lowercase # L& LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW +1EC9 ; Lowercase # L& LATIN SMALL LETTER I WITH HOOK ABOVE +1ECB ; Lowercase # L& LATIN SMALL LETTER I WITH DOT BELOW +1ECD ; Lowercase # L& LATIN SMALL LETTER O WITH DOT BELOW +1ECF ; Lowercase # L& LATIN SMALL LETTER O WITH HOOK ABOVE +1ED1 ; Lowercase # L& LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE +1ED3 ; Lowercase # L& LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE +1ED5 ; Lowercase # L& LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE +1ED7 ; Lowercase # L& LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE +1ED9 ; Lowercase # L& LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW +1EDB ; Lowercase # L& LATIN SMALL LETTER O WITH HORN AND ACUTE +1EDD ; Lowercase # L& LATIN SMALL LETTER O WITH HORN AND GRAVE +1EDF ; Lowercase # L& LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE +1EE1 ; Lowercase # L& LATIN SMALL LETTER O WITH HORN AND TILDE +1EE3 ; Lowercase # L& LATIN SMALL LETTER O WITH HORN AND DOT BELOW +1EE5 ; Lowercase # L& LATIN SMALL LETTER U WITH DOT BELOW +1EE7 ; Lowercase # L& LATIN SMALL LETTER U WITH HOOK ABOVE +1EE9 ; Lowercase # L& LATIN SMALL LETTER U WITH HORN AND ACUTE +1EEB ; Lowercase # L& LATIN SMALL LETTER U WITH HORN AND GRAVE +1EED ; Lowercase # L& LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE +1EEF ; Lowercase # L& LATIN SMALL LETTER U WITH HORN AND TILDE +1EF1 ; Lowercase # L& LATIN SMALL LETTER U WITH HORN AND DOT BELOW +1EF3 ; Lowercase # L& LATIN SMALL LETTER Y WITH GRAVE +1EF5 ; Lowercase # L& LATIN SMALL LETTER Y WITH DOT BELOW +1EF7 ; Lowercase # L& LATIN SMALL LETTER Y WITH HOOK ABOVE +1EF9 ; Lowercase # L& LATIN SMALL LETTER Y WITH TILDE +1EFB ; Lowercase # L& LATIN SMALL LETTER MIDDLE-WELSH LL +1EFD ; Lowercase # L& LATIN SMALL LETTER MIDDLE-WELSH V +1EFF..1F07 ; Lowercase # L& [9] LATIN SMALL LETTER Y WITH LOOP..GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI +1F10..1F15 ; Lowercase # L& [6] GREEK SMALL LETTER EPSILON WITH PSILI..GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA +1F20..1F27 ; Lowercase # L& [8] GREEK SMALL LETTER ETA WITH PSILI..GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI +1F30..1F37 ; Lowercase # L& [8] GREEK SMALL LETTER IOTA WITH PSILI..GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI +1F40..1F45 ; Lowercase # L& [6] GREEK SMALL LETTER OMICRON WITH PSILI..GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA +1F50..1F57 ; Lowercase # L& [8] GREEK SMALL LETTER UPSILON WITH PSILI..GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI +1F60..1F67 ; Lowercase # L& [8] GREEK SMALL LETTER OMEGA WITH PSILI..GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI +1F70..1F7D ; Lowercase # L& [14] GREEK SMALL LETTER ALPHA WITH VARIA..GREEK SMALL LETTER OMEGA WITH OXIA +1F80..1F87 ; Lowercase # L& [8] GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI..GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI +1F90..1F97 ; Lowercase # L& [8] GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI..GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI +1FA0..1FA7 ; Lowercase # L& [8] GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI..GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI +1FB0..1FB4 ; Lowercase # L& [5] GREEK SMALL LETTER ALPHA WITH VRACHY..GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI +1FB6..1FB7 ; Lowercase # L& [2] GREEK SMALL LETTER ALPHA WITH PERISPOMENI..GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI +1FBE ; Lowercase # L& GREEK PROSGEGRAMMENI +1FC2..1FC4 ; Lowercase # L& [3] GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI +1FC6..1FC7 ; Lowercase # L& [2] GREEK SMALL LETTER ETA WITH PERISPOMENI..GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI +1FD0..1FD3 ; Lowercase # L& [4] GREEK SMALL LETTER IOTA WITH VRACHY..GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA +1FD6..1FD7 ; Lowercase # L& [2] GREEK SMALL LETTER IOTA WITH PERISPOMENI..GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI +1FE0..1FE7 ; Lowercase # L& [8] GREEK SMALL LETTER UPSILON WITH VRACHY..GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI +1FF2..1FF4 ; Lowercase # L& [3] GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI +1FF6..1FF7 ; Lowercase # L& [2] GREEK SMALL LETTER OMEGA WITH PERISPOMENI..GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI +2071 ; Lowercase # Lm SUPERSCRIPT LATIN SMALL LETTER I +207F ; Lowercase # Lm SUPERSCRIPT LATIN SMALL LETTER N +2090..209C ; Lowercase # Lm [13] LATIN SUBSCRIPT SMALL LETTER A..LATIN SUBSCRIPT SMALL LETTER T +210A ; Lowercase # L& SCRIPT SMALL G +210E..210F ; Lowercase # L& [2] PLANCK CONSTANT..PLANCK CONSTANT OVER TWO PI +2113 ; Lowercase # L& SCRIPT SMALL L +212F ; Lowercase # L& SCRIPT SMALL E +2134 ; Lowercase # L& SCRIPT SMALL O +2139 ; Lowercase # L& INFORMATION SOURCE +213C..213D ; Lowercase # L& [2] DOUBLE-STRUCK SMALL PI..DOUBLE-STRUCK SMALL GAMMA +2146..2149 ; Lowercase # L& [4] DOUBLE-STRUCK ITALIC SMALL D..DOUBLE-STRUCK ITALIC SMALL J +214E ; Lowercase # L& TURNED SMALL F +2170..217F ; Lowercase # Nl [16] SMALL ROMAN NUMERAL ONE..SMALL ROMAN NUMERAL ONE THOUSAND +2184 ; Lowercase # L& LATIN SMALL LETTER REVERSED C +24D0..24E9 ; Lowercase # So [26] CIRCLED LATIN SMALL LETTER A..CIRCLED LATIN SMALL LETTER Z +2C30..2C5E ; Lowercase # L& [47] GLAGOLITIC SMALL LETTER AZU..GLAGOLITIC SMALL LETTER LATINATE MYSLITE +2C61 ; Lowercase # L& LATIN SMALL LETTER L WITH DOUBLE BAR +2C65..2C66 ; Lowercase # L& [2] LATIN SMALL LETTER A WITH STROKE..LATIN SMALL LETTER T WITH DIAGONAL STROKE +2C68 ; Lowercase # L& LATIN SMALL LETTER H WITH DESCENDER +2C6A ; Lowercase # L& LATIN SMALL LETTER K WITH DESCENDER +2C6C ; Lowercase # L& LATIN SMALL LETTER Z WITH DESCENDER +2C71 ; Lowercase # L& LATIN SMALL LETTER V WITH RIGHT HOOK +2C73..2C74 ; Lowercase # L& [2] LATIN SMALL LETTER W WITH HOOK..LATIN SMALL LETTER V WITH CURL +2C76..2C7B ; Lowercase # L& [6] LATIN SMALL LETTER HALF H..LATIN LETTER SMALL CAPITAL TURNED E +2C7C..2C7D ; Lowercase # Lm [2] LATIN SUBSCRIPT SMALL LETTER J..MODIFIER LETTER CAPITAL V +2C81 ; Lowercase # L& COPTIC SMALL LETTER ALFA +2C83 ; Lowercase # L& COPTIC SMALL LETTER VIDA +2C85 ; Lowercase # L& COPTIC SMALL LETTER GAMMA +2C87 ; Lowercase # L& COPTIC SMALL LETTER DALDA +2C89 ; Lowercase # L& COPTIC SMALL LETTER EIE +2C8B ; Lowercase # L& COPTIC SMALL LETTER SOU +2C8D ; Lowercase # L& COPTIC SMALL LETTER ZATA +2C8F ; Lowercase # L& COPTIC SMALL LETTER HATE +2C91 ; Lowercase # L& COPTIC SMALL LETTER THETHE +2C93 ; Lowercase # L& COPTIC SMALL LETTER IAUDA +2C95 ; Lowercase # L& COPTIC SMALL LETTER KAPA +2C97 ; Lowercase # L& COPTIC SMALL LETTER LAULA +2C99 ; Lowercase # L& COPTIC SMALL LETTER MI +2C9B ; Lowercase # L& COPTIC SMALL LETTER NI +2C9D ; Lowercase # L& COPTIC SMALL LETTER KSI +2C9F ; Lowercase # L& COPTIC SMALL LETTER O +2CA1 ; Lowercase # L& COPTIC SMALL LETTER PI +2CA3 ; Lowercase # L& COPTIC SMALL LETTER RO +2CA5 ; Lowercase # L& COPTIC SMALL LETTER SIMA +2CA7 ; Lowercase # L& COPTIC SMALL LETTER TAU +2CA9 ; Lowercase # L& COPTIC SMALL LETTER UA +2CAB ; Lowercase # L& COPTIC SMALL LETTER FI +2CAD ; Lowercase # L& COPTIC SMALL LETTER KHI +2CAF ; Lowercase # L& COPTIC SMALL LETTER PSI +2CB1 ; Lowercase # L& COPTIC SMALL LETTER OOU +2CB3 ; Lowercase # L& COPTIC SMALL LETTER DIALECT-P ALEF +2CB5 ; Lowercase # L& COPTIC SMALL LETTER OLD COPTIC AIN +2CB7 ; Lowercase # L& COPTIC SMALL LETTER CRYPTOGRAMMIC EIE +2CB9 ; Lowercase # L& COPTIC SMALL LETTER DIALECT-P KAPA +2CBB ; Lowercase # L& COPTIC SMALL LETTER DIALECT-P NI +2CBD ; Lowercase # L& COPTIC SMALL LETTER CRYPTOGRAMMIC NI +2CBF ; Lowercase # L& COPTIC SMALL LETTER OLD COPTIC OOU +2CC1 ; Lowercase # L& COPTIC SMALL LETTER SAMPI +2CC3 ; Lowercase # L& COPTIC SMALL LETTER CROSSED SHEI +2CC5 ; Lowercase # L& COPTIC SMALL LETTER OLD COPTIC SHEI +2CC7 ; Lowercase # L& COPTIC SMALL LETTER OLD COPTIC ESH +2CC9 ; Lowercase # L& COPTIC SMALL LETTER AKHMIMIC KHEI +2CCB ; Lowercase # L& COPTIC SMALL LETTER DIALECT-P HORI +2CCD ; Lowercase # L& COPTIC SMALL LETTER OLD COPTIC HORI +2CCF ; Lowercase # L& COPTIC SMALL LETTER OLD COPTIC HA +2CD1 ; Lowercase # L& COPTIC SMALL LETTER L-SHAPED HA +2CD3 ; Lowercase # L& COPTIC SMALL LETTER OLD COPTIC HEI +2CD5 ; Lowercase # L& COPTIC SMALL LETTER OLD COPTIC HAT +2CD7 ; Lowercase # L& COPTIC SMALL LETTER OLD COPTIC GANGIA +2CD9 ; Lowercase # L& COPTIC SMALL LETTER OLD COPTIC DJA +2CDB ; Lowercase # L& COPTIC SMALL LETTER OLD COPTIC SHIMA +2CDD ; Lowercase # L& COPTIC SMALL LETTER OLD NUBIAN SHIMA +2CDF ; Lowercase # L& COPTIC SMALL LETTER OLD NUBIAN NGI +2CE1 ; Lowercase # L& COPTIC SMALL LETTER OLD NUBIAN NYI +2CE3..2CE4 ; Lowercase # L& [2] COPTIC SMALL LETTER OLD NUBIAN WAU..COPTIC SYMBOL KAI +2CEC ; Lowercase # L& COPTIC SMALL LETTER CRYPTOGRAMMIC SHEI +2CEE ; Lowercase # L& COPTIC SMALL LETTER CRYPTOGRAMMIC GANGIA +2CF3 ; Lowercase # L& COPTIC SMALL LETTER BOHAIRIC KHEI +2D00..2D25 ; Lowercase # L& [38] GEORGIAN SMALL LETTER AN..GEORGIAN SMALL LETTER HOE +2D27 ; Lowercase # L& GEORGIAN SMALL LETTER YN +2D2D ; Lowercase # L& GEORGIAN SMALL LETTER AEN +A641 ; Lowercase # L& CYRILLIC SMALL LETTER ZEMLYA +A643 ; Lowercase # L& CYRILLIC SMALL LETTER DZELO +A645 ; Lowercase # L& CYRILLIC SMALL LETTER REVERSED DZE +A647 ; Lowercase # L& CYRILLIC SMALL LETTER IOTA +A649 ; Lowercase # L& CYRILLIC SMALL LETTER DJERV +A64B ; Lowercase # L& CYRILLIC SMALL LETTER MONOGRAPH UK +A64D ; Lowercase # L& CYRILLIC SMALL LETTER BROAD OMEGA +A64F ; Lowercase # L& CYRILLIC SMALL LETTER NEUTRAL YER +A651 ; Lowercase # L& CYRILLIC SMALL LETTER YERU WITH BACK YER +A653 ; Lowercase # L& CYRILLIC SMALL LETTER IOTIFIED YAT +A655 ; Lowercase # L& CYRILLIC SMALL LETTER REVERSED YU +A657 ; Lowercase # L& CYRILLIC SMALL LETTER IOTIFIED A +A659 ; Lowercase # L& CYRILLIC SMALL LETTER CLOSED LITTLE YUS +A65B ; Lowercase # L& CYRILLIC SMALL LETTER BLENDED YUS +A65D ; Lowercase # L& CYRILLIC SMALL LETTER IOTIFIED CLOSED LITTLE YUS +A65F ; Lowercase # L& CYRILLIC SMALL LETTER YN +A661 ; Lowercase # L& CYRILLIC SMALL LETTER REVERSED TSE +A663 ; Lowercase # L& CYRILLIC SMALL LETTER SOFT DE +A665 ; Lowercase # L& CYRILLIC SMALL LETTER SOFT EL +A667 ; Lowercase # L& CYRILLIC SMALL LETTER SOFT EM +A669 ; Lowercase # L& CYRILLIC SMALL LETTER MONOCULAR O +A66B ; Lowercase # L& CYRILLIC SMALL LETTER BINOCULAR O +A66D ; Lowercase # L& CYRILLIC SMALL LETTER DOUBLE MONOCULAR O +A681 ; Lowercase # L& CYRILLIC SMALL LETTER DWE +A683 ; Lowercase # L& CYRILLIC SMALL LETTER DZWE +A685 ; Lowercase # L& CYRILLIC SMALL LETTER ZHWE +A687 ; Lowercase # L& CYRILLIC SMALL LETTER CCHE +A689 ; Lowercase # L& CYRILLIC SMALL LETTER DZZE +A68B ; Lowercase # L& CYRILLIC SMALL LETTER TE WITH MIDDLE HOOK +A68D ; Lowercase # L& CYRILLIC SMALL LETTER TWE +A68F ; Lowercase # L& CYRILLIC SMALL LETTER TSWE +A691 ; Lowercase # L& CYRILLIC SMALL LETTER TSSE +A693 ; Lowercase # L& CYRILLIC SMALL LETTER TCHE +A695 ; Lowercase # L& CYRILLIC SMALL LETTER HWE +A697 ; Lowercase # L& CYRILLIC SMALL LETTER SHWE +A699 ; Lowercase # L& CYRILLIC SMALL LETTER DOUBLE O +A69B ; Lowercase # L& CYRILLIC SMALL LETTER CROSSED O +A69C..A69D ; Lowercase # Lm [2] MODIFIER LETTER CYRILLIC HARD SIGN..MODIFIER LETTER CYRILLIC SOFT SIGN +A723 ; Lowercase # L& LATIN SMALL LETTER EGYPTOLOGICAL ALEF +A725 ; Lowercase # L& LATIN SMALL LETTER EGYPTOLOGICAL AIN +A727 ; Lowercase # L& LATIN SMALL LETTER HENG +A729 ; Lowercase # L& LATIN SMALL LETTER TZ +A72B ; Lowercase # L& LATIN SMALL LETTER TRESILLO +A72D ; Lowercase # L& LATIN SMALL LETTER CUATRILLO +A72F..A731 ; Lowercase # L& [3] LATIN SMALL LETTER CUATRILLO WITH COMMA..LATIN LETTER SMALL CAPITAL S +A733 ; Lowercase # L& LATIN SMALL LETTER AA +A735 ; Lowercase # L& LATIN SMALL LETTER AO +A737 ; Lowercase # L& LATIN SMALL LETTER AU +A739 ; Lowercase # L& LATIN SMALL LETTER AV +A73B ; Lowercase # L& LATIN SMALL LETTER AV WITH HORIZONTAL BAR +A73D ; Lowercase # L& LATIN SMALL LETTER AY +A73F ; Lowercase # L& LATIN SMALL LETTER REVERSED C WITH DOT +A741 ; Lowercase # L& LATIN SMALL LETTER K WITH STROKE +A743 ; Lowercase # L& LATIN SMALL LETTER K WITH DIAGONAL STROKE +A745 ; Lowercase # L& LATIN SMALL LETTER K WITH STROKE AND DIAGONAL STROKE +A747 ; Lowercase # L& LATIN SMALL LETTER BROKEN L +A749 ; Lowercase # L& LATIN SMALL LETTER L WITH HIGH STROKE +A74B ; Lowercase # L& LATIN SMALL LETTER O WITH LONG STROKE OVERLAY +A74D ; Lowercase # L& LATIN SMALL LETTER O WITH LOOP +A74F ; Lowercase # L& LATIN SMALL LETTER OO +A751 ; Lowercase # L& LATIN SMALL LETTER P WITH STROKE THROUGH DESCENDER +A753 ; Lowercase # L& LATIN SMALL LETTER P WITH FLOURISH +A755 ; Lowercase # L& LATIN SMALL LETTER P WITH SQUIRREL TAIL +A757 ; Lowercase # L& LATIN SMALL LETTER Q WITH STROKE THROUGH DESCENDER +A759 ; Lowercase # L& LATIN SMALL LETTER Q WITH DIAGONAL STROKE +A75B ; Lowercase # L& LATIN SMALL LETTER R ROTUNDA +A75D ; Lowercase # L& LATIN SMALL LETTER RUM ROTUNDA +A75F ; Lowercase # L& LATIN SMALL LETTER V WITH DIAGONAL STROKE +A761 ; Lowercase # L& LATIN SMALL LETTER VY +A763 ; Lowercase # L& LATIN SMALL LETTER VISIGOTHIC Z +A765 ; Lowercase # L& LATIN SMALL LETTER THORN WITH STROKE +A767 ; Lowercase # L& LATIN SMALL LETTER THORN WITH STROKE THROUGH DESCENDER +A769 ; Lowercase # L& LATIN SMALL LETTER VEND +A76B ; Lowercase # L& LATIN SMALL LETTER ET +A76D ; Lowercase # L& LATIN SMALL LETTER IS +A76F ; Lowercase # L& LATIN SMALL LETTER CON +A770 ; Lowercase # Lm MODIFIER LETTER US +A771..A778 ; Lowercase # L& [8] LATIN SMALL LETTER DUM..LATIN SMALL LETTER UM +A77A ; Lowercase # L& LATIN SMALL LETTER INSULAR D +A77C ; Lowercase # L& LATIN SMALL LETTER INSULAR F +A77F ; Lowercase # L& LATIN SMALL LETTER TURNED INSULAR G +A781 ; Lowercase # L& LATIN SMALL LETTER TURNED L +A783 ; Lowercase # L& LATIN SMALL LETTER INSULAR R +A785 ; Lowercase # L& LATIN SMALL LETTER INSULAR S +A787 ; Lowercase # L& LATIN SMALL LETTER INSULAR T +A78C ; Lowercase # L& LATIN SMALL LETTER SALTILLO +A78E ; Lowercase # L& LATIN SMALL LETTER L WITH RETROFLEX HOOK AND BELT +A791 ; Lowercase # L& LATIN SMALL LETTER N WITH DESCENDER +A793..A795 ; Lowercase # L& [3] LATIN SMALL LETTER C WITH BAR..LATIN SMALL LETTER H WITH PALATAL HOOK +A797 ; Lowercase # L& LATIN SMALL LETTER B WITH FLOURISH +A799 ; Lowercase # L& LATIN SMALL LETTER F WITH STROKE +A79B ; Lowercase # L& LATIN SMALL LETTER VOLAPUK AE +A79D ; Lowercase # L& LATIN SMALL LETTER VOLAPUK OE +A79F ; Lowercase # L& LATIN SMALL LETTER VOLAPUK UE +A7A1 ; Lowercase # L& LATIN SMALL LETTER G WITH OBLIQUE STROKE +A7A3 ; Lowercase # L& LATIN SMALL LETTER K WITH OBLIQUE STROKE +A7A5 ; Lowercase # L& LATIN SMALL LETTER N WITH OBLIQUE STROKE +A7A7 ; Lowercase # L& LATIN SMALL LETTER R WITH OBLIQUE STROKE +A7A9 ; Lowercase # L& LATIN SMALL LETTER S WITH OBLIQUE STROKE +A7AF ; Lowercase # L& LATIN LETTER SMALL CAPITAL Q +A7B5 ; Lowercase # L& LATIN SMALL LETTER BETA +A7B7 ; Lowercase # L& LATIN SMALL LETTER OMEGA +A7B9 ; Lowercase # L& LATIN SMALL LETTER U WITH STROKE +A7F8..A7F9 ; Lowercase # Lm [2] MODIFIER LETTER CAPITAL H WITH STROKE..MODIFIER LETTER SMALL LIGATURE OE +A7FA ; Lowercase # L& LATIN LETTER SMALL CAPITAL TURNED M +AB30..AB5A ; Lowercase # L& [43] LATIN SMALL LETTER BARRED ALPHA..LATIN SMALL LETTER Y WITH SHORT RIGHT LEG +AB5C..AB5F ; Lowercase # Lm [4] MODIFIER LETTER SMALL HENG..MODIFIER LETTER SMALL U WITH LEFT HOOK +AB60..AB65 ; Lowercase # L& [6] LATIN SMALL LETTER SAKHA YAT..GREEK LETTER SMALL CAPITAL OMEGA +AB70..ABBF ; Lowercase # L& [80] CHEROKEE SMALL LETTER A..CHEROKEE SMALL LETTER YA +FB00..FB06 ; Lowercase # L& [7] LATIN SMALL LIGATURE FF..LATIN SMALL LIGATURE ST +FB13..FB17 ; Lowercase # L& [5] ARMENIAN SMALL LIGATURE MEN NOW..ARMENIAN SMALL LIGATURE MEN XEH +FF41..FF5A ; Lowercase # L& [26] FULLWIDTH LATIN SMALL LETTER A..FULLWIDTH LATIN SMALL LETTER Z +10428..1044F ; Lowercase # L& [40] DESERET SMALL LETTER LONG I..DESERET SMALL LETTER EW +104D8..104FB ; Lowercase # L& [36] OSAGE SMALL LETTER A..OSAGE SMALL LETTER ZHA +10CC0..10CF2 ; Lowercase # L& [51] OLD HUNGARIAN SMALL LETTER A..OLD HUNGARIAN SMALL LETTER US +118C0..118DF ; Lowercase # L& [32] WARANG CITI SMALL LETTER NGAA..WARANG CITI SMALL LETTER VIYO +16E60..16E7F ; Lowercase # L& [32] MEDEFAIDRIN SMALL LETTER M..MEDEFAIDRIN SMALL LETTER Y +1D41A..1D433 ; Lowercase # L& [26] MATHEMATICAL BOLD SMALL A..MATHEMATICAL BOLD SMALL Z +1D44E..1D454 ; Lowercase # L& [7] MATHEMATICAL ITALIC SMALL A..MATHEMATICAL ITALIC SMALL G +1D456..1D467 ; Lowercase # L& [18] MATHEMATICAL ITALIC SMALL I..MATHEMATICAL ITALIC SMALL Z +1D482..1D49B ; Lowercase # L& [26] MATHEMATICAL BOLD ITALIC SMALL A..MATHEMATICAL BOLD ITALIC SMALL Z +1D4B6..1D4B9 ; Lowercase # L& [4] MATHEMATICAL SCRIPT SMALL A..MATHEMATICAL SCRIPT SMALL D +1D4BB ; Lowercase # L& MATHEMATICAL SCRIPT SMALL F +1D4BD..1D4C3 ; Lowercase # L& [7] MATHEMATICAL SCRIPT SMALL H..MATHEMATICAL SCRIPT SMALL N +1D4C5..1D4CF ; Lowercase # L& [11] MATHEMATICAL SCRIPT SMALL P..MATHEMATICAL SCRIPT SMALL Z +1D4EA..1D503 ; Lowercase # L& [26] MATHEMATICAL BOLD SCRIPT SMALL A..MATHEMATICAL BOLD SCRIPT SMALL Z +1D51E..1D537 ; Lowercase # L& [26] MATHEMATICAL FRAKTUR SMALL A..MATHEMATICAL FRAKTUR SMALL Z +1D552..1D56B ; Lowercase # L& [26] MATHEMATICAL DOUBLE-STRUCK SMALL A..MATHEMATICAL DOUBLE-STRUCK SMALL Z +1D586..1D59F ; Lowercase # L& [26] MATHEMATICAL BOLD FRAKTUR SMALL A..MATHEMATICAL BOLD FRAKTUR SMALL Z +1D5BA..1D5D3 ; Lowercase # L& [26] MATHEMATICAL SANS-SERIF SMALL A..MATHEMATICAL SANS-SERIF SMALL Z +1D5EE..1D607 ; Lowercase # L& [26] MATHEMATICAL SANS-SERIF BOLD SMALL A..MATHEMATICAL SANS-SERIF BOLD SMALL Z +1D622..1D63B ; Lowercase # L& [26] MATHEMATICAL SANS-SERIF ITALIC SMALL A..MATHEMATICAL SANS-SERIF ITALIC SMALL Z +1D656..1D66F ; Lowercase # L& [26] MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL A..MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Z +1D68A..1D6A5 ; Lowercase # L& [28] MATHEMATICAL MONOSPACE SMALL A..MATHEMATICAL ITALIC SMALL DOTLESS J +1D6C2..1D6DA ; Lowercase # L& [25] MATHEMATICAL BOLD SMALL ALPHA..MATHEMATICAL BOLD SMALL OMEGA +1D6DC..1D6E1 ; Lowercase # L& [6] MATHEMATICAL BOLD EPSILON SYMBOL..MATHEMATICAL BOLD PI SYMBOL +1D6FC..1D714 ; Lowercase # L& [25] MATHEMATICAL ITALIC SMALL ALPHA..MATHEMATICAL ITALIC SMALL OMEGA +1D716..1D71B ; Lowercase # L& [6] MATHEMATICAL ITALIC EPSILON SYMBOL..MATHEMATICAL ITALIC PI SYMBOL +1D736..1D74E ; Lowercase # L& [25] MATHEMATICAL BOLD ITALIC SMALL ALPHA..MATHEMATICAL BOLD ITALIC SMALL OMEGA +1D750..1D755 ; Lowercase # L& [6] MATHEMATICAL BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD ITALIC PI SYMBOL +1D770..1D788 ; Lowercase # L& [25] MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA +1D78A..1D78F ; Lowercase # L& [6] MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD PI SYMBOL +1D7AA..1D7C2 ; Lowercase # L& [25] MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA +1D7C4..1D7C9 ; Lowercase # L& [6] MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD ITALIC PI SYMBOL +1D7CB ; Lowercase # L& MATHEMATICAL BOLD SMALL DIGAMMA +1E922..1E943 ; Lowercase # L& [34] ADLAM SMALL LETTER ALIF..ADLAM SMALL LETTER SHA + +# Total code points: 2334 + +# ================================================ + +# Derived Property: Uppercase +# Generated from: Lu + Other_Uppercase + +0041..005A ; Uppercase # L& [26] LATIN CAPITAL LETTER A..LATIN CAPITAL LETTER Z +00C0..00D6 ; Uppercase # L& [23] LATIN CAPITAL LETTER A WITH GRAVE..LATIN CAPITAL LETTER O WITH DIAERESIS +00D8..00DE ; Uppercase # L& [7] LATIN CAPITAL LETTER O WITH STROKE..LATIN CAPITAL LETTER THORN +0100 ; Uppercase # L& LATIN CAPITAL LETTER A WITH MACRON +0102 ; Uppercase # L& LATIN CAPITAL LETTER A WITH BREVE +0104 ; Uppercase # L& LATIN CAPITAL LETTER A WITH OGONEK +0106 ; Uppercase # L& LATIN CAPITAL LETTER C WITH ACUTE +0108 ; Uppercase # L& LATIN CAPITAL LETTER C WITH CIRCUMFLEX +010A ; Uppercase # L& LATIN CAPITAL LETTER C WITH DOT ABOVE +010C ; Uppercase # L& LATIN CAPITAL LETTER C WITH CARON +010E ; Uppercase # L& LATIN CAPITAL LETTER D WITH CARON +0110 ; Uppercase # L& LATIN CAPITAL LETTER D WITH STROKE +0112 ; Uppercase # L& LATIN CAPITAL LETTER E WITH MACRON +0114 ; Uppercase # L& LATIN CAPITAL LETTER E WITH BREVE +0116 ; Uppercase # L& LATIN CAPITAL LETTER E WITH DOT ABOVE +0118 ; Uppercase # L& LATIN CAPITAL LETTER E WITH OGONEK +011A ; Uppercase # L& LATIN CAPITAL LETTER E WITH CARON +011C ; Uppercase # L& LATIN CAPITAL LETTER G WITH CIRCUMFLEX +011E ; Uppercase # L& LATIN CAPITAL LETTER G WITH BREVE +0120 ; Uppercase # L& LATIN CAPITAL LETTER G WITH DOT ABOVE +0122 ; Uppercase # L& LATIN CAPITAL LETTER G WITH CEDILLA +0124 ; Uppercase # L& LATIN CAPITAL LETTER H WITH CIRCUMFLEX +0126 ; Uppercase # L& LATIN CAPITAL LETTER H WITH STROKE +0128 ; Uppercase # L& LATIN CAPITAL LETTER I WITH TILDE +012A ; Uppercase # L& LATIN CAPITAL LETTER I WITH MACRON +012C ; Uppercase # L& LATIN CAPITAL LETTER I WITH BREVE +012E ; Uppercase # L& LATIN CAPITAL LETTER I WITH OGONEK +0130 ; Uppercase # L& LATIN CAPITAL LETTER I WITH DOT ABOVE +0132 ; Uppercase # L& LATIN CAPITAL LIGATURE IJ +0134 ; Uppercase # L& LATIN CAPITAL LETTER J WITH CIRCUMFLEX +0136 ; Uppercase # L& LATIN CAPITAL LETTER K WITH CEDILLA +0139 ; Uppercase # L& LATIN CAPITAL LETTER L WITH ACUTE +013B ; Uppercase # L& LATIN CAPITAL LETTER L WITH CEDILLA +013D ; Uppercase # L& LATIN CAPITAL LETTER L WITH CARON +013F ; Uppercase # L& LATIN CAPITAL LETTER L WITH MIDDLE DOT +0141 ; Uppercase # L& LATIN CAPITAL LETTER L WITH STROKE +0143 ; Uppercase # L& LATIN CAPITAL LETTER N WITH ACUTE +0145 ; Uppercase # L& LATIN CAPITAL LETTER N WITH CEDILLA +0147 ; Uppercase # L& LATIN CAPITAL LETTER N WITH CARON +014A ; Uppercase # L& LATIN CAPITAL LETTER ENG +014C ; Uppercase # L& LATIN CAPITAL LETTER O WITH MACRON +014E ; Uppercase # L& LATIN CAPITAL LETTER O WITH BREVE +0150 ; Uppercase # L& LATIN CAPITAL LETTER O WITH DOUBLE ACUTE +0152 ; Uppercase # L& LATIN CAPITAL LIGATURE OE +0154 ; Uppercase # L& LATIN CAPITAL LETTER R WITH ACUTE +0156 ; Uppercase # L& LATIN CAPITAL LETTER R WITH CEDILLA +0158 ; Uppercase # L& LATIN CAPITAL LETTER R WITH CARON +015A ; Uppercase # L& LATIN CAPITAL LETTER S WITH ACUTE +015C ; Uppercase # L& LATIN CAPITAL LETTER S WITH CIRCUMFLEX +015E ; Uppercase # L& LATIN CAPITAL LETTER S WITH CEDILLA +0160 ; Uppercase # L& LATIN CAPITAL LETTER S WITH CARON +0162 ; Uppercase # L& LATIN CAPITAL LETTER T WITH CEDILLA +0164 ; Uppercase # L& LATIN CAPITAL LETTER T WITH CARON +0166 ; Uppercase # L& LATIN CAPITAL LETTER T WITH STROKE +0168 ; Uppercase # L& LATIN CAPITAL LETTER U WITH TILDE +016A ; Uppercase # L& LATIN CAPITAL LETTER U WITH MACRON +016C ; Uppercase # L& LATIN CAPITAL LETTER U WITH BREVE +016E ; Uppercase # L& LATIN CAPITAL LETTER U WITH RING ABOVE +0170 ; Uppercase # L& LATIN CAPITAL LETTER U WITH DOUBLE ACUTE +0172 ; Uppercase # L& LATIN CAPITAL LETTER U WITH OGONEK +0174 ; Uppercase # L& LATIN CAPITAL LETTER W WITH CIRCUMFLEX +0176 ; Uppercase # L& LATIN CAPITAL LETTER Y WITH CIRCUMFLEX +0178..0179 ; Uppercase # L& [2] LATIN CAPITAL LETTER Y WITH DIAERESIS..LATIN CAPITAL LETTER Z WITH ACUTE +017B ; Uppercase # L& LATIN CAPITAL LETTER Z WITH DOT ABOVE +017D ; Uppercase # L& LATIN CAPITAL LETTER Z WITH CARON +0181..0182 ; Uppercase # L& [2] LATIN CAPITAL LETTER B WITH HOOK..LATIN CAPITAL LETTER B WITH TOPBAR +0184 ; Uppercase # L& LATIN CAPITAL LETTER TONE SIX +0186..0187 ; Uppercase # L& [2] LATIN CAPITAL LETTER OPEN O..LATIN CAPITAL LETTER C WITH HOOK +0189..018B ; Uppercase # L& [3] LATIN CAPITAL LETTER AFRICAN D..LATIN CAPITAL LETTER D WITH TOPBAR +018E..0191 ; Uppercase # L& [4] LATIN CAPITAL LETTER REVERSED E..LATIN CAPITAL LETTER F WITH HOOK +0193..0194 ; Uppercase # L& [2] LATIN CAPITAL LETTER G WITH HOOK..LATIN CAPITAL LETTER GAMMA +0196..0198 ; Uppercase # L& [3] LATIN CAPITAL LETTER IOTA..LATIN CAPITAL LETTER K WITH HOOK +019C..019D ; Uppercase # L& [2] LATIN CAPITAL LETTER TURNED M..LATIN CAPITAL LETTER N WITH LEFT HOOK +019F..01A0 ; Uppercase # L& [2] LATIN CAPITAL LETTER O WITH MIDDLE TILDE..LATIN CAPITAL LETTER O WITH HORN +01A2 ; Uppercase # L& LATIN CAPITAL LETTER OI +01A4 ; Uppercase # L& LATIN CAPITAL LETTER P WITH HOOK +01A6..01A7 ; Uppercase # L& [2] LATIN LETTER YR..LATIN CAPITAL LETTER TONE TWO +01A9 ; Uppercase # L& LATIN CAPITAL LETTER ESH +01AC ; Uppercase # L& LATIN CAPITAL LETTER T WITH HOOK +01AE..01AF ; Uppercase # L& [2] LATIN CAPITAL LETTER T WITH RETROFLEX HOOK..LATIN CAPITAL LETTER U WITH HORN +01B1..01B3 ; Uppercase # L& [3] LATIN CAPITAL LETTER UPSILON..LATIN CAPITAL LETTER Y WITH HOOK +01B5 ; Uppercase # L& LATIN CAPITAL LETTER Z WITH STROKE +01B7..01B8 ; Uppercase # L& [2] LATIN CAPITAL LETTER EZH..LATIN CAPITAL LETTER EZH REVERSED +01BC ; Uppercase # L& LATIN CAPITAL LETTER TONE FIVE +01C4 ; Uppercase # L& LATIN CAPITAL LETTER DZ WITH CARON +01C7 ; Uppercase # L& LATIN CAPITAL LETTER LJ +01CA ; Uppercase # L& LATIN CAPITAL LETTER NJ +01CD ; Uppercase # L& LATIN CAPITAL LETTER A WITH CARON +01CF ; Uppercase # L& LATIN CAPITAL LETTER I WITH CARON +01D1 ; Uppercase # L& LATIN CAPITAL LETTER O WITH CARON +01D3 ; Uppercase # L& LATIN CAPITAL LETTER U WITH CARON +01D5 ; Uppercase # L& LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON +01D7 ; Uppercase # L& LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE +01D9 ; Uppercase # L& LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON +01DB ; Uppercase # L& LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE +01DE ; Uppercase # L& LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON +01E0 ; Uppercase # L& LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON +01E2 ; Uppercase # L& LATIN CAPITAL LETTER AE WITH MACRON +01E4 ; Uppercase # L& LATIN CAPITAL LETTER G WITH STROKE +01E6 ; Uppercase # L& LATIN CAPITAL LETTER G WITH CARON +01E8 ; Uppercase # L& LATIN CAPITAL LETTER K WITH CARON +01EA ; Uppercase # L& LATIN CAPITAL LETTER O WITH OGONEK +01EC ; Uppercase # L& LATIN CAPITAL LETTER O WITH OGONEK AND MACRON +01EE ; Uppercase # L& LATIN CAPITAL LETTER EZH WITH CARON +01F1 ; Uppercase # L& LATIN CAPITAL LETTER DZ +01F4 ; Uppercase # L& LATIN CAPITAL LETTER G WITH ACUTE +01F6..01F8 ; Uppercase # L& [3] LATIN CAPITAL LETTER HWAIR..LATIN CAPITAL LETTER N WITH GRAVE +01FA ; Uppercase # L& LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE +01FC ; Uppercase # L& LATIN CAPITAL LETTER AE WITH ACUTE +01FE ; Uppercase # L& LATIN CAPITAL LETTER O WITH STROKE AND ACUTE +0200 ; Uppercase # L& LATIN CAPITAL LETTER A WITH DOUBLE GRAVE +0202 ; Uppercase # L& LATIN CAPITAL LETTER A WITH INVERTED BREVE +0204 ; Uppercase # L& LATIN CAPITAL LETTER E WITH DOUBLE GRAVE +0206 ; Uppercase # L& LATIN CAPITAL LETTER E WITH INVERTED BREVE +0208 ; Uppercase # L& LATIN CAPITAL LETTER I WITH DOUBLE GRAVE +020A ; Uppercase # L& LATIN CAPITAL LETTER I WITH INVERTED BREVE +020C ; Uppercase # L& LATIN CAPITAL LETTER O WITH DOUBLE GRAVE +020E ; Uppercase # L& LATIN CAPITAL LETTER O WITH INVERTED BREVE +0210 ; Uppercase # L& LATIN CAPITAL LETTER R WITH DOUBLE GRAVE +0212 ; Uppercase # L& LATIN CAPITAL LETTER R WITH INVERTED BREVE +0214 ; Uppercase # L& LATIN CAPITAL LETTER U WITH DOUBLE GRAVE +0216 ; Uppercase # L& LATIN CAPITAL LETTER U WITH INVERTED BREVE +0218 ; Uppercase # L& LATIN CAPITAL LETTER S WITH COMMA BELOW +021A ; Uppercase # L& LATIN CAPITAL LETTER T WITH COMMA BELOW +021C ; Uppercase # L& LATIN CAPITAL LETTER YOGH +021E ; Uppercase # L& LATIN CAPITAL LETTER H WITH CARON +0220 ; Uppercase # L& LATIN CAPITAL LETTER N WITH LONG RIGHT LEG +0222 ; Uppercase # L& LATIN CAPITAL LETTER OU +0224 ; Uppercase # L& LATIN CAPITAL LETTER Z WITH HOOK +0226 ; Uppercase # L& LATIN CAPITAL LETTER A WITH DOT ABOVE +0228 ; Uppercase # L& LATIN CAPITAL LETTER E WITH CEDILLA +022A ; Uppercase # L& LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON +022C ; Uppercase # L& LATIN CAPITAL LETTER O WITH TILDE AND MACRON +022E ; Uppercase # L& LATIN CAPITAL LETTER O WITH DOT ABOVE +0230 ; Uppercase # L& LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON +0232 ; Uppercase # L& LATIN CAPITAL LETTER Y WITH MACRON +023A..023B ; Uppercase # L& [2] LATIN CAPITAL LETTER A WITH STROKE..LATIN CAPITAL LETTER C WITH STROKE +023D..023E ; Uppercase # L& [2] LATIN CAPITAL LETTER L WITH BAR..LATIN CAPITAL LETTER T WITH DIAGONAL STROKE +0241 ; Uppercase # L& LATIN CAPITAL LETTER GLOTTAL STOP +0243..0246 ; Uppercase # L& [4] LATIN CAPITAL LETTER B WITH STROKE..LATIN CAPITAL LETTER E WITH STROKE +0248 ; Uppercase # L& LATIN CAPITAL LETTER J WITH STROKE +024A ; Uppercase # L& LATIN CAPITAL LETTER SMALL Q WITH HOOK TAIL +024C ; Uppercase # L& LATIN CAPITAL LETTER R WITH STROKE +024E ; Uppercase # L& LATIN CAPITAL LETTER Y WITH STROKE +0370 ; Uppercase # L& GREEK CAPITAL LETTER HETA +0372 ; Uppercase # L& GREEK CAPITAL LETTER ARCHAIC SAMPI +0376 ; Uppercase # L& GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA +037F ; Uppercase # L& GREEK CAPITAL LETTER YOT +0386 ; Uppercase # L& GREEK CAPITAL LETTER ALPHA WITH TONOS +0388..038A ; Uppercase # L& [3] GREEK CAPITAL LETTER EPSILON WITH TONOS..GREEK CAPITAL LETTER IOTA WITH TONOS +038C ; Uppercase # L& GREEK CAPITAL LETTER OMICRON WITH TONOS +038E..038F ; Uppercase # L& [2] GREEK CAPITAL LETTER UPSILON WITH TONOS..GREEK CAPITAL LETTER OMEGA WITH TONOS +0391..03A1 ; Uppercase # L& [17] GREEK CAPITAL LETTER ALPHA..GREEK CAPITAL LETTER RHO +03A3..03AB ; Uppercase # L& [9] GREEK CAPITAL LETTER SIGMA..GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA +03CF ; Uppercase # L& GREEK CAPITAL KAI SYMBOL +03D2..03D4 ; Uppercase # L& [3] GREEK UPSILON WITH HOOK SYMBOL..GREEK UPSILON WITH DIAERESIS AND HOOK SYMBOL +03D8 ; Uppercase # L& GREEK LETTER ARCHAIC KOPPA +03DA ; Uppercase # L& GREEK LETTER STIGMA +03DC ; Uppercase # L& GREEK LETTER DIGAMMA +03DE ; Uppercase # L& GREEK LETTER KOPPA +03E0 ; Uppercase # L& GREEK LETTER SAMPI +03E2 ; Uppercase # L& COPTIC CAPITAL LETTER SHEI +03E4 ; Uppercase # L& COPTIC CAPITAL LETTER FEI +03E6 ; Uppercase # L& COPTIC CAPITAL LETTER KHEI +03E8 ; Uppercase # L& COPTIC CAPITAL LETTER HORI +03EA ; Uppercase # L& COPTIC CAPITAL LETTER GANGIA +03EC ; Uppercase # L& COPTIC CAPITAL LETTER SHIMA +03EE ; Uppercase # L& COPTIC CAPITAL LETTER DEI +03F4 ; Uppercase # L& GREEK CAPITAL THETA SYMBOL +03F7 ; Uppercase # L& GREEK CAPITAL LETTER SHO +03F9..03FA ; Uppercase # L& [2] GREEK CAPITAL LUNATE SIGMA SYMBOL..GREEK CAPITAL LETTER SAN +03FD..042F ; Uppercase # L& [51] GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL..CYRILLIC CAPITAL LETTER YA +0460 ; Uppercase # L& CYRILLIC CAPITAL LETTER OMEGA +0462 ; Uppercase # L& CYRILLIC CAPITAL LETTER YAT +0464 ; Uppercase # L& CYRILLIC CAPITAL LETTER IOTIFIED E +0466 ; Uppercase # L& CYRILLIC CAPITAL LETTER LITTLE YUS +0468 ; Uppercase # L& CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS +046A ; Uppercase # L& CYRILLIC CAPITAL LETTER BIG YUS +046C ; Uppercase # L& CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS +046E ; Uppercase # L& CYRILLIC CAPITAL LETTER KSI +0470 ; Uppercase # L& CYRILLIC CAPITAL LETTER PSI +0472 ; Uppercase # L& CYRILLIC CAPITAL LETTER FITA +0474 ; Uppercase # L& CYRILLIC CAPITAL LETTER IZHITSA +0476 ; Uppercase # L& CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT +0478 ; Uppercase # L& CYRILLIC CAPITAL LETTER UK +047A ; Uppercase # L& CYRILLIC CAPITAL LETTER ROUND OMEGA +047C ; Uppercase # L& CYRILLIC CAPITAL LETTER OMEGA WITH TITLO +047E ; Uppercase # L& CYRILLIC CAPITAL LETTER OT +0480 ; Uppercase # L& CYRILLIC CAPITAL LETTER KOPPA +048A ; Uppercase # L& CYRILLIC CAPITAL LETTER SHORT I WITH TAIL +048C ; Uppercase # L& CYRILLIC CAPITAL LETTER SEMISOFT SIGN +048E ; Uppercase # L& CYRILLIC CAPITAL LETTER ER WITH TICK +0490 ; Uppercase # L& CYRILLIC CAPITAL LETTER GHE WITH UPTURN +0492 ; Uppercase # L& CYRILLIC CAPITAL LETTER GHE WITH STROKE +0494 ; Uppercase # L& CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK +0496 ; Uppercase # L& CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER +0498 ; Uppercase # L& CYRILLIC CAPITAL LETTER ZE WITH DESCENDER +049A ; Uppercase # L& CYRILLIC CAPITAL LETTER KA WITH DESCENDER +049C ; Uppercase # L& CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE +049E ; Uppercase # L& CYRILLIC CAPITAL LETTER KA WITH STROKE +04A0 ; Uppercase # L& CYRILLIC CAPITAL LETTER BASHKIR KA +04A2 ; Uppercase # L& CYRILLIC CAPITAL LETTER EN WITH DESCENDER +04A4 ; Uppercase # L& CYRILLIC CAPITAL LIGATURE EN GHE +04A6 ; Uppercase # L& CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK +04A8 ; Uppercase # L& CYRILLIC CAPITAL LETTER ABKHASIAN HA +04AA ; Uppercase # L& CYRILLIC CAPITAL LETTER ES WITH DESCENDER +04AC ; Uppercase # L& CYRILLIC CAPITAL LETTER TE WITH DESCENDER +04AE ; Uppercase # L& CYRILLIC CAPITAL LETTER STRAIGHT U +04B0 ; Uppercase # L& CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE +04B2 ; Uppercase # L& CYRILLIC CAPITAL LETTER HA WITH DESCENDER +04B4 ; Uppercase # L& CYRILLIC CAPITAL LIGATURE TE TSE +04B6 ; Uppercase # L& CYRILLIC CAPITAL LETTER CHE WITH DESCENDER +04B8 ; Uppercase # L& CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE +04BA ; Uppercase # L& CYRILLIC CAPITAL LETTER SHHA +04BC ; Uppercase # L& CYRILLIC CAPITAL LETTER ABKHASIAN CHE +04BE ; Uppercase # L& CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER +04C0..04C1 ; Uppercase # L& [2] CYRILLIC LETTER PALOCHKA..CYRILLIC CAPITAL LETTER ZHE WITH BREVE +04C3 ; Uppercase # L& CYRILLIC CAPITAL LETTER KA WITH HOOK +04C5 ; Uppercase # L& CYRILLIC CAPITAL LETTER EL WITH TAIL +04C7 ; Uppercase # L& CYRILLIC CAPITAL LETTER EN WITH HOOK +04C9 ; Uppercase # L& CYRILLIC CAPITAL LETTER EN WITH TAIL +04CB ; Uppercase # L& CYRILLIC CAPITAL LETTER KHAKASSIAN CHE +04CD ; Uppercase # L& CYRILLIC CAPITAL LETTER EM WITH TAIL +04D0 ; Uppercase # L& CYRILLIC CAPITAL LETTER A WITH BREVE +04D2 ; Uppercase # L& CYRILLIC CAPITAL LETTER A WITH DIAERESIS +04D4 ; Uppercase # L& CYRILLIC CAPITAL LIGATURE A IE +04D6 ; Uppercase # L& CYRILLIC CAPITAL LETTER IE WITH BREVE +04D8 ; Uppercase # L& CYRILLIC CAPITAL LETTER SCHWA +04DA ; Uppercase # L& CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS +04DC ; Uppercase # L& CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS +04DE ; Uppercase # L& CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS +04E0 ; Uppercase # L& CYRILLIC CAPITAL LETTER ABKHASIAN DZE +04E2 ; Uppercase # L& CYRILLIC CAPITAL LETTER I WITH MACRON +04E4 ; Uppercase # L& CYRILLIC CAPITAL LETTER I WITH DIAERESIS +04E6 ; Uppercase # L& CYRILLIC CAPITAL LETTER O WITH DIAERESIS +04E8 ; Uppercase # L& CYRILLIC CAPITAL LETTER BARRED O +04EA ; Uppercase # L& CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS +04EC ; Uppercase # L& CYRILLIC CAPITAL LETTER E WITH DIAERESIS +04EE ; Uppercase # L& CYRILLIC CAPITAL LETTER U WITH MACRON +04F0 ; Uppercase # L& CYRILLIC CAPITAL LETTER U WITH DIAERESIS +04F2 ; Uppercase # L& CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE +04F4 ; Uppercase # L& CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS +04F6 ; Uppercase # L& CYRILLIC CAPITAL LETTER GHE WITH DESCENDER +04F8 ; Uppercase # L& CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS +04FA ; Uppercase # L& CYRILLIC CAPITAL LETTER GHE WITH STROKE AND HOOK +04FC ; Uppercase # L& CYRILLIC CAPITAL LETTER HA WITH HOOK +04FE ; Uppercase # L& CYRILLIC CAPITAL LETTER HA WITH STROKE +0500 ; Uppercase # L& CYRILLIC CAPITAL LETTER KOMI DE +0502 ; Uppercase # L& CYRILLIC CAPITAL LETTER KOMI DJE +0504 ; Uppercase # L& CYRILLIC CAPITAL LETTER KOMI ZJE +0506 ; Uppercase # L& CYRILLIC CAPITAL LETTER KOMI DZJE +0508 ; Uppercase # L& CYRILLIC CAPITAL LETTER KOMI LJE +050A ; Uppercase # L& CYRILLIC CAPITAL LETTER KOMI NJE +050C ; Uppercase # L& CYRILLIC CAPITAL LETTER KOMI SJE +050E ; Uppercase # L& CYRILLIC CAPITAL LETTER KOMI TJE +0510 ; Uppercase # L& CYRILLIC CAPITAL LETTER REVERSED ZE +0512 ; Uppercase # L& CYRILLIC CAPITAL LETTER EL WITH HOOK +0514 ; Uppercase # L& CYRILLIC CAPITAL LETTER LHA +0516 ; Uppercase # L& CYRILLIC CAPITAL LETTER RHA +0518 ; Uppercase # L& CYRILLIC CAPITAL LETTER YAE +051A ; Uppercase # L& CYRILLIC CAPITAL LETTER QA +051C ; Uppercase # L& CYRILLIC CAPITAL LETTER WE +051E ; Uppercase # L& CYRILLIC CAPITAL LETTER ALEUT KA +0520 ; Uppercase # L& CYRILLIC CAPITAL LETTER EL WITH MIDDLE HOOK +0522 ; Uppercase # L& CYRILLIC CAPITAL LETTER EN WITH MIDDLE HOOK +0524 ; Uppercase # L& CYRILLIC CAPITAL LETTER PE WITH DESCENDER +0526 ; Uppercase # L& CYRILLIC CAPITAL LETTER SHHA WITH DESCENDER +0528 ; Uppercase # L& CYRILLIC CAPITAL LETTER EN WITH LEFT HOOK +052A ; Uppercase # L& CYRILLIC CAPITAL LETTER DZZHE +052C ; Uppercase # L& CYRILLIC CAPITAL LETTER DCHE +052E ; Uppercase # L& CYRILLIC CAPITAL LETTER EL WITH DESCENDER +0531..0556 ; Uppercase # L& [38] ARMENIAN CAPITAL LETTER AYB..ARMENIAN CAPITAL LETTER FEH +10A0..10C5 ; Uppercase # L& [38] GEORGIAN CAPITAL LETTER AN..GEORGIAN CAPITAL LETTER HOE +10C7 ; Uppercase # L& GEORGIAN CAPITAL LETTER YN +10CD ; Uppercase # L& GEORGIAN CAPITAL LETTER AEN +13A0..13F5 ; Uppercase # L& [86] CHEROKEE LETTER A..CHEROKEE LETTER MV +1C90..1CBA ; Uppercase # L& [43] GEORGIAN MTAVRULI CAPITAL LETTER AN..GEORGIAN MTAVRULI CAPITAL LETTER AIN +1CBD..1CBF ; Uppercase # L& [3] GEORGIAN MTAVRULI CAPITAL LETTER AEN..GEORGIAN MTAVRULI CAPITAL LETTER LABIAL SIGN +1E00 ; Uppercase # L& LATIN CAPITAL LETTER A WITH RING BELOW +1E02 ; Uppercase # L& LATIN CAPITAL LETTER B WITH DOT ABOVE +1E04 ; Uppercase # L& LATIN CAPITAL LETTER B WITH DOT BELOW +1E06 ; Uppercase # L& LATIN CAPITAL LETTER B WITH LINE BELOW +1E08 ; Uppercase # L& LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE +1E0A ; Uppercase # L& LATIN CAPITAL LETTER D WITH DOT ABOVE +1E0C ; Uppercase # L& LATIN CAPITAL LETTER D WITH DOT BELOW +1E0E ; Uppercase # L& LATIN CAPITAL LETTER D WITH LINE BELOW +1E10 ; Uppercase # L& LATIN CAPITAL LETTER D WITH CEDILLA +1E12 ; Uppercase # L& LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW +1E14 ; Uppercase # L& LATIN CAPITAL LETTER E WITH MACRON AND GRAVE +1E16 ; Uppercase # L& LATIN CAPITAL LETTER E WITH MACRON AND ACUTE +1E18 ; Uppercase # L& LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW +1E1A ; Uppercase # L& LATIN CAPITAL LETTER E WITH TILDE BELOW +1E1C ; Uppercase # L& LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE +1E1E ; Uppercase # L& LATIN CAPITAL LETTER F WITH DOT ABOVE +1E20 ; Uppercase # L& LATIN CAPITAL LETTER G WITH MACRON +1E22 ; Uppercase # L& LATIN CAPITAL LETTER H WITH DOT ABOVE +1E24 ; Uppercase # L& LATIN CAPITAL LETTER H WITH DOT BELOW +1E26 ; Uppercase # L& LATIN CAPITAL LETTER H WITH DIAERESIS +1E28 ; Uppercase # L& LATIN CAPITAL LETTER H WITH CEDILLA +1E2A ; Uppercase # L& LATIN CAPITAL LETTER H WITH BREVE BELOW +1E2C ; Uppercase # L& LATIN CAPITAL LETTER I WITH TILDE BELOW +1E2E ; Uppercase # L& LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE +1E30 ; Uppercase # L& LATIN CAPITAL LETTER K WITH ACUTE +1E32 ; Uppercase # L& LATIN CAPITAL LETTER K WITH DOT BELOW +1E34 ; Uppercase # L& LATIN CAPITAL LETTER K WITH LINE BELOW +1E36 ; Uppercase # L& LATIN CAPITAL LETTER L WITH DOT BELOW +1E38 ; Uppercase # L& LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON +1E3A ; Uppercase # L& LATIN CAPITAL LETTER L WITH LINE BELOW +1E3C ; Uppercase # L& LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW +1E3E ; Uppercase # L& LATIN CAPITAL LETTER M WITH ACUTE +1E40 ; Uppercase # L& LATIN CAPITAL LETTER M WITH DOT ABOVE +1E42 ; Uppercase # L& LATIN CAPITAL LETTER M WITH DOT BELOW +1E44 ; Uppercase # L& LATIN CAPITAL LETTER N WITH DOT ABOVE +1E46 ; Uppercase # L& LATIN CAPITAL LETTER N WITH DOT BELOW +1E48 ; Uppercase # L& LATIN CAPITAL LETTER N WITH LINE BELOW +1E4A ; Uppercase # L& LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW +1E4C ; Uppercase # L& LATIN CAPITAL LETTER O WITH TILDE AND ACUTE +1E4E ; Uppercase # L& LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS +1E50 ; Uppercase # L& LATIN CAPITAL LETTER O WITH MACRON AND GRAVE +1E52 ; Uppercase # L& LATIN CAPITAL LETTER O WITH MACRON AND ACUTE +1E54 ; Uppercase # L& LATIN CAPITAL LETTER P WITH ACUTE +1E56 ; Uppercase # L& LATIN CAPITAL LETTER P WITH DOT ABOVE +1E58 ; Uppercase # L& LATIN CAPITAL LETTER R WITH DOT ABOVE +1E5A ; Uppercase # L& LATIN CAPITAL LETTER R WITH DOT BELOW +1E5C ; Uppercase # L& LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON +1E5E ; Uppercase # L& LATIN CAPITAL LETTER R WITH LINE BELOW +1E60 ; Uppercase # L& LATIN CAPITAL LETTER S WITH DOT ABOVE +1E62 ; Uppercase # L& LATIN CAPITAL LETTER S WITH DOT BELOW +1E64 ; Uppercase # L& LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE +1E66 ; Uppercase # L& LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE +1E68 ; Uppercase # L& LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE +1E6A ; Uppercase # L& LATIN CAPITAL LETTER T WITH DOT ABOVE +1E6C ; Uppercase # L& LATIN CAPITAL LETTER T WITH DOT BELOW +1E6E ; Uppercase # L& LATIN CAPITAL LETTER T WITH LINE BELOW +1E70 ; Uppercase # L& LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW +1E72 ; Uppercase # L& LATIN CAPITAL LETTER U WITH DIAERESIS BELOW +1E74 ; Uppercase # L& LATIN CAPITAL LETTER U WITH TILDE BELOW +1E76 ; Uppercase # L& LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW +1E78 ; Uppercase # L& LATIN CAPITAL LETTER U WITH TILDE AND ACUTE +1E7A ; Uppercase # L& LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS +1E7C ; Uppercase # L& LATIN CAPITAL LETTER V WITH TILDE +1E7E ; Uppercase # L& LATIN CAPITAL LETTER V WITH DOT BELOW +1E80 ; Uppercase # L& LATIN CAPITAL LETTER W WITH GRAVE +1E82 ; Uppercase # L& LATIN CAPITAL LETTER W WITH ACUTE +1E84 ; Uppercase # L& LATIN CAPITAL LETTER W WITH DIAERESIS +1E86 ; Uppercase # L& LATIN CAPITAL LETTER W WITH DOT ABOVE +1E88 ; Uppercase # L& LATIN CAPITAL LETTER W WITH DOT BELOW +1E8A ; Uppercase # L& LATIN CAPITAL LETTER X WITH DOT ABOVE +1E8C ; Uppercase # L& LATIN CAPITAL LETTER X WITH DIAERESIS +1E8E ; Uppercase # L& LATIN CAPITAL LETTER Y WITH DOT ABOVE +1E90 ; Uppercase # L& LATIN CAPITAL LETTER Z WITH CIRCUMFLEX +1E92 ; Uppercase # L& LATIN CAPITAL LETTER Z WITH DOT BELOW +1E94 ; Uppercase # L& LATIN CAPITAL LETTER Z WITH LINE BELOW +1E9E ; Uppercase # L& LATIN CAPITAL LETTER SHARP S +1EA0 ; Uppercase # L& LATIN CAPITAL LETTER A WITH DOT BELOW +1EA2 ; Uppercase # L& LATIN CAPITAL LETTER A WITH HOOK ABOVE +1EA4 ; Uppercase # L& LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE +1EA6 ; Uppercase # L& LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE +1EA8 ; Uppercase # L& LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE +1EAA ; Uppercase # L& LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE +1EAC ; Uppercase # L& LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW +1EAE ; Uppercase # L& LATIN CAPITAL LETTER A WITH BREVE AND ACUTE +1EB0 ; Uppercase # L& LATIN CAPITAL LETTER A WITH BREVE AND GRAVE +1EB2 ; Uppercase # L& LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE +1EB4 ; Uppercase # L& LATIN CAPITAL LETTER A WITH BREVE AND TILDE +1EB6 ; Uppercase # L& LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW +1EB8 ; Uppercase # L& LATIN CAPITAL LETTER E WITH DOT BELOW +1EBA ; Uppercase # L& LATIN CAPITAL LETTER E WITH HOOK ABOVE +1EBC ; Uppercase # L& LATIN CAPITAL LETTER E WITH TILDE +1EBE ; Uppercase # L& LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE +1EC0 ; Uppercase # L& LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE +1EC2 ; Uppercase # L& LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE +1EC4 ; Uppercase # L& LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE +1EC6 ; Uppercase # L& LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW +1EC8 ; Uppercase # L& LATIN CAPITAL LETTER I WITH HOOK ABOVE +1ECA ; Uppercase # L& LATIN CAPITAL LETTER I WITH DOT BELOW +1ECC ; Uppercase # L& LATIN CAPITAL LETTER O WITH DOT BELOW +1ECE ; Uppercase # L& LATIN CAPITAL LETTER O WITH HOOK ABOVE +1ED0 ; Uppercase # L& LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE +1ED2 ; Uppercase # L& LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE +1ED4 ; Uppercase # L& LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE +1ED6 ; Uppercase # L& LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE +1ED8 ; Uppercase # L& LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW +1EDA ; Uppercase # L& LATIN CAPITAL LETTER O WITH HORN AND ACUTE +1EDC ; Uppercase # L& LATIN CAPITAL LETTER O WITH HORN AND GRAVE +1EDE ; Uppercase # L& LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE +1EE0 ; Uppercase # L& LATIN CAPITAL LETTER O WITH HORN AND TILDE +1EE2 ; Uppercase # L& LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW +1EE4 ; Uppercase # L& LATIN CAPITAL LETTER U WITH DOT BELOW +1EE6 ; Uppercase # L& LATIN CAPITAL LETTER U WITH HOOK ABOVE +1EE8 ; Uppercase # L& LATIN CAPITAL LETTER U WITH HORN AND ACUTE +1EEA ; Uppercase # L& LATIN CAPITAL LETTER U WITH HORN AND GRAVE +1EEC ; Uppercase # L& LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE +1EEE ; Uppercase # L& LATIN CAPITAL LETTER U WITH HORN AND TILDE +1EF0 ; Uppercase # L& LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW +1EF2 ; Uppercase # L& LATIN CAPITAL LETTER Y WITH GRAVE +1EF4 ; Uppercase # L& LATIN CAPITAL LETTER Y WITH DOT BELOW +1EF6 ; Uppercase # L& LATIN CAPITAL LETTER Y WITH HOOK ABOVE +1EF8 ; Uppercase # L& LATIN CAPITAL LETTER Y WITH TILDE +1EFA ; Uppercase # L& LATIN CAPITAL LETTER MIDDLE-WELSH LL +1EFC ; Uppercase # L& LATIN CAPITAL LETTER MIDDLE-WELSH V +1EFE ; Uppercase # L& LATIN CAPITAL LETTER Y WITH LOOP +1F08..1F0F ; Uppercase # L& [8] GREEK CAPITAL LETTER ALPHA WITH PSILI..GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI +1F18..1F1D ; Uppercase # L& [6] GREEK CAPITAL LETTER EPSILON WITH PSILI..GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA +1F28..1F2F ; Uppercase # L& [8] GREEK CAPITAL LETTER ETA WITH PSILI..GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI +1F38..1F3F ; Uppercase # L& [8] GREEK CAPITAL LETTER IOTA WITH PSILI..GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI +1F48..1F4D ; Uppercase # L& [6] GREEK CAPITAL LETTER OMICRON WITH PSILI..GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA +1F59 ; Uppercase # L& GREEK CAPITAL LETTER UPSILON WITH DASIA +1F5B ; Uppercase # L& GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA +1F5D ; Uppercase # L& GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA +1F5F ; Uppercase # L& GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI +1F68..1F6F ; Uppercase # L& [8] GREEK CAPITAL LETTER OMEGA WITH PSILI..GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI +1FB8..1FBB ; Uppercase # L& [4] GREEK CAPITAL LETTER ALPHA WITH VRACHY..GREEK CAPITAL LETTER ALPHA WITH OXIA +1FC8..1FCB ; Uppercase # L& [4] GREEK CAPITAL LETTER EPSILON WITH VARIA..GREEK CAPITAL LETTER ETA WITH OXIA +1FD8..1FDB ; Uppercase # L& [4] GREEK CAPITAL LETTER IOTA WITH VRACHY..GREEK CAPITAL LETTER IOTA WITH OXIA +1FE8..1FEC ; Uppercase # L& [5] GREEK CAPITAL LETTER UPSILON WITH VRACHY..GREEK CAPITAL LETTER RHO WITH DASIA +1FF8..1FFB ; Uppercase # L& [4] GREEK CAPITAL LETTER OMICRON WITH VARIA..GREEK CAPITAL LETTER OMEGA WITH OXIA +2102 ; Uppercase # L& DOUBLE-STRUCK CAPITAL C +2107 ; Uppercase # L& EULER CONSTANT +210B..210D ; Uppercase # L& [3] SCRIPT CAPITAL H..DOUBLE-STRUCK CAPITAL H +2110..2112 ; Uppercase # L& [3] SCRIPT CAPITAL I..SCRIPT CAPITAL L +2115 ; Uppercase # L& DOUBLE-STRUCK CAPITAL N +2119..211D ; Uppercase # L& [5] DOUBLE-STRUCK CAPITAL P..DOUBLE-STRUCK CAPITAL R +2124 ; Uppercase # L& DOUBLE-STRUCK CAPITAL Z +2126 ; Uppercase # L& OHM SIGN +2128 ; Uppercase # L& BLACK-LETTER CAPITAL Z +212A..212D ; Uppercase # L& [4] KELVIN SIGN..BLACK-LETTER CAPITAL C +2130..2133 ; Uppercase # L& [4] SCRIPT CAPITAL E..SCRIPT CAPITAL M +213E..213F ; Uppercase # L& [2] DOUBLE-STRUCK CAPITAL GAMMA..DOUBLE-STRUCK CAPITAL PI +2145 ; Uppercase # L& DOUBLE-STRUCK ITALIC CAPITAL D +2160..216F ; Uppercase # Nl [16] ROMAN NUMERAL ONE..ROMAN NUMERAL ONE THOUSAND +2183 ; Uppercase # L& ROMAN NUMERAL REVERSED ONE HUNDRED +24B6..24CF ; Uppercase # So [26] CIRCLED LATIN CAPITAL LETTER A..CIRCLED LATIN CAPITAL LETTER Z +2C00..2C2E ; Uppercase # L& [47] GLAGOLITIC CAPITAL LETTER AZU..GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE +2C60 ; Uppercase # L& LATIN CAPITAL LETTER L WITH DOUBLE BAR +2C62..2C64 ; Uppercase # L& [3] LATIN CAPITAL LETTER L WITH MIDDLE TILDE..LATIN CAPITAL LETTER R WITH TAIL +2C67 ; Uppercase # L& LATIN CAPITAL LETTER H WITH DESCENDER +2C69 ; Uppercase # L& LATIN CAPITAL LETTER K WITH DESCENDER +2C6B ; Uppercase # L& LATIN CAPITAL LETTER Z WITH DESCENDER +2C6D..2C70 ; Uppercase # L& [4] LATIN CAPITAL LETTER ALPHA..LATIN CAPITAL LETTER TURNED ALPHA +2C72 ; Uppercase # L& LATIN CAPITAL LETTER W WITH HOOK +2C75 ; Uppercase # L& LATIN CAPITAL LETTER HALF H +2C7E..2C80 ; Uppercase # L& [3] LATIN CAPITAL LETTER S WITH SWASH TAIL..COPTIC CAPITAL LETTER ALFA +2C82 ; Uppercase # L& COPTIC CAPITAL LETTER VIDA +2C84 ; Uppercase # L& COPTIC CAPITAL LETTER GAMMA +2C86 ; Uppercase # L& COPTIC CAPITAL LETTER DALDA +2C88 ; Uppercase # L& COPTIC CAPITAL LETTER EIE +2C8A ; Uppercase # L& COPTIC CAPITAL LETTER SOU +2C8C ; Uppercase # L& COPTIC CAPITAL LETTER ZATA +2C8E ; Uppercase # L& COPTIC CAPITAL LETTER HATE +2C90 ; Uppercase # L& COPTIC CAPITAL LETTER THETHE +2C92 ; Uppercase # L& COPTIC CAPITAL LETTER IAUDA +2C94 ; Uppercase # L& COPTIC CAPITAL LETTER KAPA +2C96 ; Uppercase # L& COPTIC CAPITAL LETTER LAULA +2C98 ; Uppercase # L& COPTIC CAPITAL LETTER MI +2C9A ; Uppercase # L& COPTIC CAPITAL LETTER NI +2C9C ; Uppercase # L& COPTIC CAPITAL LETTER KSI +2C9E ; Uppercase # L& COPTIC CAPITAL LETTER O +2CA0 ; Uppercase # L& COPTIC CAPITAL LETTER PI +2CA2 ; Uppercase # L& COPTIC CAPITAL LETTER RO +2CA4 ; Uppercase # L& COPTIC CAPITAL LETTER SIMA +2CA6 ; Uppercase # L& COPTIC CAPITAL LETTER TAU +2CA8 ; Uppercase # L& COPTIC CAPITAL LETTER UA +2CAA ; Uppercase # L& COPTIC CAPITAL LETTER FI +2CAC ; Uppercase # L& COPTIC CAPITAL LETTER KHI +2CAE ; Uppercase # L& COPTIC CAPITAL LETTER PSI +2CB0 ; Uppercase # L& COPTIC CAPITAL LETTER OOU +2CB2 ; Uppercase # L& COPTIC CAPITAL LETTER DIALECT-P ALEF +2CB4 ; Uppercase # L& COPTIC CAPITAL LETTER OLD COPTIC AIN +2CB6 ; Uppercase # L& COPTIC CAPITAL LETTER CRYPTOGRAMMIC EIE +2CB8 ; Uppercase # L& COPTIC CAPITAL LETTER DIALECT-P KAPA +2CBA ; Uppercase # L& COPTIC CAPITAL LETTER DIALECT-P NI +2CBC ; Uppercase # L& COPTIC CAPITAL LETTER CRYPTOGRAMMIC NI +2CBE ; Uppercase # L& COPTIC CAPITAL LETTER OLD COPTIC OOU +2CC0 ; Uppercase # L& COPTIC CAPITAL LETTER SAMPI +2CC2 ; Uppercase # L& COPTIC CAPITAL LETTER CROSSED SHEI +2CC4 ; Uppercase # L& COPTIC CAPITAL LETTER OLD COPTIC SHEI +2CC6 ; Uppercase # L& COPTIC CAPITAL LETTER OLD COPTIC ESH +2CC8 ; Uppercase # L& COPTIC CAPITAL LETTER AKHMIMIC KHEI +2CCA ; Uppercase # L& COPTIC CAPITAL LETTER DIALECT-P HORI +2CCC ; Uppercase # L& COPTIC CAPITAL LETTER OLD COPTIC HORI +2CCE ; Uppercase # L& COPTIC CAPITAL LETTER OLD COPTIC HA +2CD0 ; Uppercase # L& COPTIC CAPITAL LETTER L-SHAPED HA +2CD2 ; Uppercase # L& COPTIC CAPITAL LETTER OLD COPTIC HEI +2CD4 ; Uppercase # L& COPTIC CAPITAL LETTER OLD COPTIC HAT +2CD6 ; Uppercase # L& COPTIC CAPITAL LETTER OLD COPTIC GANGIA +2CD8 ; Uppercase # L& COPTIC CAPITAL LETTER OLD COPTIC DJA +2CDA ; Uppercase # L& COPTIC CAPITAL LETTER OLD COPTIC SHIMA +2CDC ; Uppercase # L& COPTIC CAPITAL LETTER OLD NUBIAN SHIMA +2CDE ; Uppercase # L& COPTIC CAPITAL LETTER OLD NUBIAN NGI +2CE0 ; Uppercase # L& COPTIC CAPITAL LETTER OLD NUBIAN NYI +2CE2 ; Uppercase # L& COPTIC CAPITAL LETTER OLD NUBIAN WAU +2CEB ; Uppercase # L& COPTIC CAPITAL LETTER CRYPTOGRAMMIC SHEI +2CED ; Uppercase # L& COPTIC CAPITAL LETTER CRYPTOGRAMMIC GANGIA +2CF2 ; Uppercase # L& COPTIC CAPITAL LETTER BOHAIRIC KHEI +A640 ; Uppercase # L& CYRILLIC CAPITAL LETTER ZEMLYA +A642 ; Uppercase # L& CYRILLIC CAPITAL LETTER DZELO +A644 ; Uppercase # L& CYRILLIC CAPITAL LETTER REVERSED DZE +A646 ; Uppercase # L& CYRILLIC CAPITAL LETTER IOTA +A648 ; Uppercase # L& CYRILLIC CAPITAL LETTER DJERV +A64A ; Uppercase # L& CYRILLIC CAPITAL LETTER MONOGRAPH UK +A64C ; Uppercase # L& CYRILLIC CAPITAL LETTER BROAD OMEGA +A64E ; Uppercase # L& CYRILLIC CAPITAL LETTER NEUTRAL YER +A650 ; Uppercase # L& CYRILLIC CAPITAL LETTER YERU WITH BACK YER +A652 ; Uppercase # L& CYRILLIC CAPITAL LETTER IOTIFIED YAT +A654 ; Uppercase # L& CYRILLIC CAPITAL LETTER REVERSED YU +A656 ; Uppercase # L& CYRILLIC CAPITAL LETTER IOTIFIED A +A658 ; Uppercase # L& CYRILLIC CAPITAL LETTER CLOSED LITTLE YUS +A65A ; Uppercase # L& CYRILLIC CAPITAL LETTER BLENDED YUS +A65C ; Uppercase # L& CYRILLIC CAPITAL LETTER IOTIFIED CLOSED LITTLE YUS +A65E ; Uppercase # L& CYRILLIC CAPITAL LETTER YN +A660 ; Uppercase # L& CYRILLIC CAPITAL LETTER REVERSED TSE +A662 ; Uppercase # L& CYRILLIC CAPITAL LETTER SOFT DE +A664 ; Uppercase # L& CYRILLIC CAPITAL LETTER SOFT EL +A666 ; Uppercase # L& CYRILLIC CAPITAL LETTER SOFT EM +A668 ; Uppercase # L& CYRILLIC CAPITAL LETTER MONOCULAR O +A66A ; Uppercase # L& CYRILLIC CAPITAL LETTER BINOCULAR O +A66C ; Uppercase # L& CYRILLIC CAPITAL LETTER DOUBLE MONOCULAR O +A680 ; Uppercase # L& CYRILLIC CAPITAL LETTER DWE +A682 ; Uppercase # L& CYRILLIC CAPITAL LETTER DZWE +A684 ; Uppercase # L& CYRILLIC CAPITAL LETTER ZHWE +A686 ; Uppercase # L& CYRILLIC CAPITAL LETTER CCHE +A688 ; Uppercase # L& CYRILLIC CAPITAL LETTER DZZE +A68A ; Uppercase # L& CYRILLIC CAPITAL LETTER TE WITH MIDDLE HOOK +A68C ; Uppercase # L& CYRILLIC CAPITAL LETTER TWE +A68E ; Uppercase # L& CYRILLIC CAPITAL LETTER TSWE +A690 ; Uppercase # L& CYRILLIC CAPITAL LETTER TSSE +A692 ; Uppercase # L& CYRILLIC CAPITAL LETTER TCHE +A694 ; Uppercase # L& CYRILLIC CAPITAL LETTER HWE +A696 ; Uppercase # L& CYRILLIC CAPITAL LETTER SHWE +A698 ; Uppercase # L& CYRILLIC CAPITAL LETTER DOUBLE O +A69A ; Uppercase # L& CYRILLIC CAPITAL LETTER CROSSED O +A722 ; Uppercase # L& LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF +A724 ; Uppercase # L& LATIN CAPITAL LETTER EGYPTOLOGICAL AIN +A726 ; Uppercase # L& LATIN CAPITAL LETTER HENG +A728 ; Uppercase # L& LATIN CAPITAL LETTER TZ +A72A ; Uppercase # L& LATIN CAPITAL LETTER TRESILLO +A72C ; Uppercase # L& LATIN CAPITAL LETTER CUATRILLO +A72E ; Uppercase # L& LATIN CAPITAL LETTER CUATRILLO WITH COMMA +A732 ; Uppercase # L& LATIN CAPITAL LETTER AA +A734 ; Uppercase # L& LATIN CAPITAL LETTER AO +A736 ; Uppercase # L& LATIN CAPITAL LETTER AU +A738 ; Uppercase # L& LATIN CAPITAL LETTER AV +A73A ; Uppercase # L& LATIN CAPITAL LETTER AV WITH HORIZONTAL BAR +A73C ; Uppercase # L& LATIN CAPITAL LETTER AY +A73E ; Uppercase # L& LATIN CAPITAL LETTER REVERSED C WITH DOT +A740 ; Uppercase # L& LATIN CAPITAL LETTER K WITH STROKE +A742 ; Uppercase # L& LATIN CAPITAL LETTER K WITH DIAGONAL STROKE +A744 ; Uppercase # L& LATIN CAPITAL LETTER K WITH STROKE AND DIAGONAL STROKE +A746 ; Uppercase # L& LATIN CAPITAL LETTER BROKEN L +A748 ; Uppercase # L& LATIN CAPITAL LETTER L WITH HIGH STROKE +A74A ; Uppercase # L& LATIN CAPITAL LETTER O WITH LONG STROKE OVERLAY +A74C ; Uppercase # L& LATIN CAPITAL LETTER O WITH LOOP +A74E ; Uppercase # L& LATIN CAPITAL LETTER OO +A750 ; Uppercase # L& LATIN CAPITAL LETTER P WITH STROKE THROUGH DESCENDER +A752 ; Uppercase # L& LATIN CAPITAL LETTER P WITH FLOURISH +A754 ; Uppercase # L& LATIN CAPITAL LETTER P WITH SQUIRREL TAIL +A756 ; Uppercase # L& LATIN CAPITAL LETTER Q WITH STROKE THROUGH DESCENDER +A758 ; Uppercase # L& LATIN CAPITAL LETTER Q WITH DIAGONAL STROKE +A75A ; Uppercase # L& LATIN CAPITAL LETTER R ROTUNDA +A75C ; Uppercase # L& LATIN CAPITAL LETTER RUM ROTUNDA +A75E ; Uppercase # L& LATIN CAPITAL LETTER V WITH DIAGONAL STROKE +A760 ; Uppercase # L& LATIN CAPITAL LETTER VY +A762 ; Uppercase # L& LATIN CAPITAL LETTER VISIGOTHIC Z +A764 ; Uppercase # L& LATIN CAPITAL LETTER THORN WITH STROKE +A766 ; Uppercase # L& LATIN CAPITAL LETTER THORN WITH STROKE THROUGH DESCENDER +A768 ; Uppercase # L& LATIN CAPITAL LETTER VEND +A76A ; Uppercase # L& LATIN CAPITAL LETTER ET +A76C ; Uppercase # L& LATIN CAPITAL LETTER IS +A76E ; Uppercase # L& LATIN CAPITAL LETTER CON +A779 ; Uppercase # L& LATIN CAPITAL LETTER INSULAR D +A77B ; Uppercase # L& LATIN CAPITAL LETTER INSULAR F +A77D..A77E ; Uppercase # L& [2] LATIN CAPITAL LETTER INSULAR G..LATIN CAPITAL LETTER TURNED INSULAR G +A780 ; Uppercase # L& LATIN CAPITAL LETTER TURNED L +A782 ; Uppercase # L& LATIN CAPITAL LETTER INSULAR R +A784 ; Uppercase # L& LATIN CAPITAL LETTER INSULAR S +A786 ; Uppercase # L& LATIN CAPITAL LETTER INSULAR T +A78B ; Uppercase # L& LATIN CAPITAL LETTER SALTILLO +A78D ; Uppercase # L& LATIN CAPITAL LETTER TURNED H +A790 ; Uppercase # L& LATIN CAPITAL LETTER N WITH DESCENDER +A792 ; Uppercase # L& LATIN CAPITAL LETTER C WITH BAR +A796 ; Uppercase # L& LATIN CAPITAL LETTER B WITH FLOURISH +A798 ; Uppercase # L& LATIN CAPITAL LETTER F WITH STROKE +A79A ; Uppercase # L& LATIN CAPITAL LETTER VOLAPUK AE +A79C ; Uppercase # L& LATIN CAPITAL LETTER VOLAPUK OE +A79E ; Uppercase # L& LATIN CAPITAL LETTER VOLAPUK UE +A7A0 ; Uppercase # L& LATIN CAPITAL LETTER G WITH OBLIQUE STROKE +A7A2 ; Uppercase # L& LATIN CAPITAL LETTER K WITH OBLIQUE STROKE +A7A4 ; Uppercase # L& LATIN CAPITAL LETTER N WITH OBLIQUE STROKE +A7A6 ; Uppercase # L& LATIN CAPITAL LETTER R WITH OBLIQUE STROKE +A7A8 ; Uppercase # L& LATIN CAPITAL LETTER S WITH OBLIQUE STROKE +A7AA..A7AE ; Uppercase # L& [5] LATIN CAPITAL LETTER H WITH HOOK..LATIN CAPITAL LETTER SMALL CAPITAL I +A7B0..A7B4 ; Uppercase # L& [5] LATIN CAPITAL LETTER TURNED K..LATIN CAPITAL LETTER BETA +A7B6 ; Uppercase # L& LATIN CAPITAL LETTER OMEGA +A7B8 ; Uppercase # L& LATIN CAPITAL LETTER U WITH STROKE +FF21..FF3A ; Uppercase # L& [26] FULLWIDTH LATIN CAPITAL LETTER A..FULLWIDTH LATIN CAPITAL LETTER Z +10400..10427 ; Uppercase # L& [40] DESERET CAPITAL LETTER LONG I..DESERET CAPITAL LETTER EW +104B0..104D3 ; Uppercase # L& [36] OSAGE CAPITAL LETTER A..OSAGE CAPITAL LETTER ZHA +10C80..10CB2 ; Uppercase # L& [51] OLD HUNGARIAN CAPITAL LETTER A..OLD HUNGARIAN CAPITAL LETTER US +118A0..118BF ; Uppercase # L& [32] WARANG CITI CAPITAL LETTER NGAA..WARANG CITI CAPITAL LETTER VIYO +16E40..16E5F ; Uppercase # L& [32] MEDEFAIDRIN CAPITAL LETTER M..MEDEFAIDRIN CAPITAL LETTER Y +1D400..1D419 ; Uppercase # L& [26] MATHEMATICAL BOLD CAPITAL A..MATHEMATICAL BOLD CAPITAL Z +1D434..1D44D ; Uppercase # L& [26] MATHEMATICAL ITALIC CAPITAL A..MATHEMATICAL ITALIC CAPITAL Z +1D468..1D481 ; Uppercase # L& [26] MATHEMATICAL BOLD ITALIC CAPITAL A..MATHEMATICAL BOLD ITALIC CAPITAL Z +1D49C ; Uppercase # L& MATHEMATICAL SCRIPT CAPITAL A +1D49E..1D49F ; Uppercase # L& [2] MATHEMATICAL SCRIPT CAPITAL C..MATHEMATICAL SCRIPT CAPITAL D +1D4A2 ; Uppercase # L& MATHEMATICAL SCRIPT CAPITAL G +1D4A5..1D4A6 ; Uppercase # L& [2] MATHEMATICAL SCRIPT CAPITAL J..MATHEMATICAL SCRIPT CAPITAL K +1D4A9..1D4AC ; Uppercase # L& [4] MATHEMATICAL SCRIPT CAPITAL N..MATHEMATICAL SCRIPT CAPITAL Q +1D4AE..1D4B5 ; Uppercase # L& [8] MATHEMATICAL SCRIPT CAPITAL S..MATHEMATICAL SCRIPT CAPITAL Z +1D4D0..1D4E9 ; Uppercase # L& [26] MATHEMATICAL BOLD SCRIPT CAPITAL A..MATHEMATICAL BOLD SCRIPT CAPITAL Z +1D504..1D505 ; Uppercase # L& [2] MATHEMATICAL FRAKTUR CAPITAL A..MATHEMATICAL FRAKTUR CAPITAL B +1D507..1D50A ; Uppercase # L& [4] MATHEMATICAL FRAKTUR CAPITAL D..MATHEMATICAL FRAKTUR CAPITAL G +1D50D..1D514 ; Uppercase # L& [8] MATHEMATICAL FRAKTUR CAPITAL J..MATHEMATICAL FRAKTUR CAPITAL Q +1D516..1D51C ; Uppercase # L& [7] MATHEMATICAL FRAKTUR CAPITAL S..MATHEMATICAL FRAKTUR CAPITAL Y +1D538..1D539 ; Uppercase # L& [2] MATHEMATICAL DOUBLE-STRUCK CAPITAL A..MATHEMATICAL DOUBLE-STRUCK CAPITAL B +1D53B..1D53E ; Uppercase # L& [4] MATHEMATICAL DOUBLE-STRUCK CAPITAL D..MATHEMATICAL DOUBLE-STRUCK CAPITAL G +1D540..1D544 ; Uppercase # L& [5] MATHEMATICAL DOUBLE-STRUCK CAPITAL I..MATHEMATICAL DOUBLE-STRUCK CAPITAL M +1D546 ; Uppercase # L& MATHEMATICAL DOUBLE-STRUCK CAPITAL O +1D54A..1D550 ; Uppercase # L& [7] MATHEMATICAL DOUBLE-STRUCK CAPITAL S..MATHEMATICAL DOUBLE-STRUCK CAPITAL Y +1D56C..1D585 ; Uppercase # L& [26] MATHEMATICAL BOLD FRAKTUR CAPITAL A..MATHEMATICAL BOLD FRAKTUR CAPITAL Z +1D5A0..1D5B9 ; Uppercase # L& [26] MATHEMATICAL SANS-SERIF CAPITAL A..MATHEMATICAL SANS-SERIF CAPITAL Z +1D5D4..1D5ED ; Uppercase # L& [26] MATHEMATICAL SANS-SERIF BOLD CAPITAL A..MATHEMATICAL SANS-SERIF BOLD CAPITAL Z +1D608..1D621 ; Uppercase # L& [26] MATHEMATICAL SANS-SERIF ITALIC CAPITAL A..MATHEMATICAL SANS-SERIF ITALIC CAPITAL Z +1D63C..1D655 ; Uppercase # L& [26] MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL A..MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Z +1D670..1D689 ; Uppercase # L& [26] MATHEMATICAL MONOSPACE CAPITAL A..MATHEMATICAL MONOSPACE CAPITAL Z +1D6A8..1D6C0 ; Uppercase # L& [25] MATHEMATICAL BOLD CAPITAL ALPHA..MATHEMATICAL BOLD CAPITAL OMEGA +1D6E2..1D6FA ; Uppercase # L& [25] MATHEMATICAL ITALIC CAPITAL ALPHA..MATHEMATICAL ITALIC CAPITAL OMEGA +1D71C..1D734 ; Uppercase # L& [25] MATHEMATICAL BOLD ITALIC CAPITAL ALPHA..MATHEMATICAL BOLD ITALIC CAPITAL OMEGA +1D756..1D76E ; Uppercase # L& [25] MATHEMATICAL SANS-SERIF BOLD CAPITAL ALPHA..MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA +1D790..1D7A8 ; Uppercase # L& [25] MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ALPHA..MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA +1D7CA ; Uppercase # L& MATHEMATICAL BOLD CAPITAL DIGAMMA +1E900..1E921 ; Uppercase # L& [34] ADLAM CAPITAL LETTER ALIF..ADLAM CAPITAL LETTER SHA +1F130..1F149 ; Uppercase # So [26] SQUARED LATIN CAPITAL LETTER A..SQUARED LATIN CAPITAL LETTER Z +1F150..1F169 ; Uppercase # So [26] NEGATIVE CIRCLED LATIN CAPITAL LETTER A..NEGATIVE CIRCLED LATIN CAPITAL LETTER Z +1F170..1F189 ; Uppercase # So [26] NEGATIVE SQUARED LATIN CAPITAL LETTER A..NEGATIVE SQUARED LATIN CAPITAL LETTER Z + +# Total code points: 1901 + +# ================================================ + +# Derived Property: Cased (Cased) +# As defined by Unicode Standard Definition D135 +# C has the Lowercase or Uppercase property or has a General_Category value of Titlecase_Letter. + +0041..005A ; Cased # L& [26] LATIN CAPITAL LETTER A..LATIN CAPITAL LETTER Z +0061..007A ; Cased # L& [26] LATIN SMALL LETTER A..LATIN SMALL LETTER Z +00AA ; Cased # Lo FEMININE ORDINAL INDICATOR +00B5 ; Cased # L& MICRO SIGN +00BA ; Cased # Lo MASCULINE ORDINAL INDICATOR +00C0..00D6 ; Cased # L& [23] LATIN CAPITAL LETTER A WITH GRAVE..LATIN CAPITAL LETTER O WITH DIAERESIS +00D8..00F6 ; Cased # L& [31] LATIN CAPITAL LETTER O WITH STROKE..LATIN SMALL LETTER O WITH DIAERESIS +00F8..01BA ; Cased # L& [195] LATIN SMALL LETTER O WITH STROKE..LATIN SMALL LETTER EZH WITH TAIL +01BC..01BF ; Cased # L& [4] LATIN CAPITAL LETTER TONE FIVE..LATIN LETTER WYNN +01C4..0293 ; Cased # L& [208] LATIN CAPITAL LETTER DZ WITH CARON..LATIN SMALL LETTER EZH WITH CURL +0295..02AF ; Cased # L& [27] LATIN LETTER PHARYNGEAL VOICED FRICATIVE..LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL +02B0..02B8 ; Cased # Lm [9] MODIFIER LETTER SMALL H..MODIFIER LETTER SMALL Y +02C0..02C1 ; Cased # Lm [2] MODIFIER LETTER GLOTTAL STOP..MODIFIER LETTER REVERSED GLOTTAL STOP +02E0..02E4 ; Cased # Lm [5] MODIFIER LETTER SMALL GAMMA..MODIFIER LETTER SMALL REVERSED GLOTTAL STOP +0345 ; Cased # Mn COMBINING GREEK YPOGEGRAMMENI +0370..0373 ; Cased # L& [4] GREEK CAPITAL LETTER HETA..GREEK SMALL LETTER ARCHAIC SAMPI +0376..0377 ; Cased # L& [2] GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA..GREEK SMALL LETTER PAMPHYLIAN DIGAMMA +037A ; Cased # Lm GREEK YPOGEGRAMMENI +037B..037D ; Cased # L& [3] GREEK SMALL REVERSED LUNATE SIGMA SYMBOL..GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL +037F ; Cased # L& GREEK CAPITAL LETTER YOT +0386 ; Cased # L& GREEK CAPITAL LETTER ALPHA WITH TONOS +0388..038A ; Cased # L& [3] GREEK CAPITAL LETTER EPSILON WITH TONOS..GREEK CAPITAL LETTER IOTA WITH TONOS +038C ; Cased # L& GREEK CAPITAL LETTER OMICRON WITH TONOS +038E..03A1 ; Cased # L& [20] GREEK CAPITAL LETTER UPSILON WITH TONOS..GREEK CAPITAL LETTER RHO +03A3..03F5 ; Cased # L& [83] GREEK CAPITAL LETTER SIGMA..GREEK LUNATE EPSILON SYMBOL +03F7..0481 ; Cased # L& [139] GREEK CAPITAL LETTER SHO..CYRILLIC SMALL LETTER KOPPA +048A..052F ; Cased # L& [166] CYRILLIC CAPITAL LETTER SHORT I WITH TAIL..CYRILLIC SMALL LETTER EL WITH DESCENDER +0531..0556 ; Cased # L& [38] ARMENIAN CAPITAL LETTER AYB..ARMENIAN CAPITAL LETTER FEH +0560..0588 ; Cased # L& [41] ARMENIAN SMALL LETTER TURNED AYB..ARMENIAN SMALL LETTER YI WITH STROKE +10A0..10C5 ; Cased # L& [38] GEORGIAN CAPITAL LETTER AN..GEORGIAN CAPITAL LETTER HOE +10C7 ; Cased # L& GEORGIAN CAPITAL LETTER YN +10CD ; Cased # L& GEORGIAN CAPITAL LETTER AEN +10D0..10FA ; Cased # L& [43] GEORGIAN LETTER AN..GEORGIAN LETTER AIN +10FD..10FF ; Cased # L& [3] GEORGIAN LETTER AEN..GEORGIAN LETTER LABIAL SIGN +13A0..13F5 ; Cased # L& [86] CHEROKEE LETTER A..CHEROKEE LETTER MV +13F8..13FD ; Cased # L& [6] CHEROKEE SMALL LETTER YE..CHEROKEE SMALL LETTER MV +1C80..1C88 ; Cased # L& [9] CYRILLIC SMALL LETTER ROUNDED VE..CYRILLIC SMALL LETTER UNBLENDED UK +1C90..1CBA ; Cased # L& [43] GEORGIAN MTAVRULI CAPITAL LETTER AN..GEORGIAN MTAVRULI CAPITAL LETTER AIN +1CBD..1CBF ; Cased # L& [3] GEORGIAN MTAVRULI CAPITAL LETTER AEN..GEORGIAN MTAVRULI CAPITAL LETTER LABIAL SIGN +1D00..1D2B ; Cased # L& [44] LATIN LETTER SMALL CAPITAL A..CYRILLIC LETTER SMALL CAPITAL EL +1D2C..1D6A ; Cased # Lm [63] MODIFIER LETTER CAPITAL A..GREEK SUBSCRIPT SMALL LETTER CHI +1D6B..1D77 ; Cased # L& [13] LATIN SMALL LETTER UE..LATIN SMALL LETTER TURNED G +1D78 ; Cased # Lm MODIFIER LETTER CYRILLIC EN +1D79..1D9A ; Cased # L& [34] LATIN SMALL LETTER INSULAR G..LATIN SMALL LETTER EZH WITH RETROFLEX HOOK +1D9B..1DBF ; Cased # Lm [37] MODIFIER LETTER SMALL TURNED ALPHA..MODIFIER LETTER SMALL THETA +1E00..1F15 ; Cased # L& [278] LATIN CAPITAL LETTER A WITH RING BELOW..GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA +1F18..1F1D ; Cased # L& [6] GREEK CAPITAL LETTER EPSILON WITH PSILI..GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA +1F20..1F45 ; Cased # L& [38] GREEK SMALL LETTER ETA WITH PSILI..GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA +1F48..1F4D ; Cased # L& [6] GREEK CAPITAL LETTER OMICRON WITH PSILI..GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA +1F50..1F57 ; Cased # L& [8] GREEK SMALL LETTER UPSILON WITH PSILI..GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI +1F59 ; Cased # L& GREEK CAPITAL LETTER UPSILON WITH DASIA +1F5B ; Cased # L& GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA +1F5D ; Cased # L& GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA +1F5F..1F7D ; Cased # L& [31] GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI..GREEK SMALL LETTER OMEGA WITH OXIA +1F80..1FB4 ; Cased # L& [53] GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI..GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI +1FB6..1FBC ; Cased # L& [7] GREEK SMALL LETTER ALPHA WITH PERISPOMENI..GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI +1FBE ; Cased # L& GREEK PROSGEGRAMMENI +1FC2..1FC4 ; Cased # L& [3] GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI +1FC6..1FCC ; Cased # L& [7] GREEK SMALL LETTER ETA WITH PERISPOMENI..GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI +1FD0..1FD3 ; Cased # L& [4] GREEK SMALL LETTER IOTA WITH VRACHY..GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA +1FD6..1FDB ; Cased # L& [6] GREEK SMALL LETTER IOTA WITH PERISPOMENI..GREEK CAPITAL LETTER IOTA WITH OXIA +1FE0..1FEC ; Cased # L& [13] GREEK SMALL LETTER UPSILON WITH VRACHY..GREEK CAPITAL LETTER RHO WITH DASIA +1FF2..1FF4 ; Cased # L& [3] GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI +1FF6..1FFC ; Cased # L& [7] GREEK SMALL LETTER OMEGA WITH PERISPOMENI..GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI +2071 ; Cased # Lm SUPERSCRIPT LATIN SMALL LETTER I +207F ; Cased # Lm SUPERSCRIPT LATIN SMALL LETTER N +2090..209C ; Cased # Lm [13] LATIN SUBSCRIPT SMALL LETTER A..LATIN SUBSCRIPT SMALL LETTER T +2102 ; Cased # L& DOUBLE-STRUCK CAPITAL C +2107 ; Cased # L& EULER CONSTANT +210A..2113 ; Cased # L& [10] SCRIPT SMALL G..SCRIPT SMALL L +2115 ; Cased # L& DOUBLE-STRUCK CAPITAL N +2119..211D ; Cased # L& [5] DOUBLE-STRUCK CAPITAL P..DOUBLE-STRUCK CAPITAL R +2124 ; Cased # L& DOUBLE-STRUCK CAPITAL Z +2126 ; Cased # L& OHM SIGN +2128 ; Cased # L& BLACK-LETTER CAPITAL Z +212A..212D ; Cased # L& [4] KELVIN SIGN..BLACK-LETTER CAPITAL C +212F..2134 ; Cased # L& [6] SCRIPT SMALL E..SCRIPT SMALL O +2139 ; Cased # L& INFORMATION SOURCE +213C..213F ; Cased # L& [4] DOUBLE-STRUCK SMALL PI..DOUBLE-STRUCK CAPITAL PI +2145..2149 ; Cased # L& [5] DOUBLE-STRUCK ITALIC CAPITAL D..DOUBLE-STRUCK ITALIC SMALL J +214E ; Cased # L& TURNED SMALL F +2160..217F ; Cased # Nl [32] ROMAN NUMERAL ONE..SMALL ROMAN NUMERAL ONE THOUSAND +2183..2184 ; Cased # L& [2] ROMAN NUMERAL REVERSED ONE HUNDRED..LATIN SMALL LETTER REVERSED C +24B6..24E9 ; Cased # So [52] CIRCLED LATIN CAPITAL LETTER A..CIRCLED LATIN SMALL LETTER Z +2C00..2C2E ; Cased # L& [47] GLAGOLITIC CAPITAL LETTER AZU..GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE +2C30..2C5E ; Cased # L& [47] GLAGOLITIC SMALL LETTER AZU..GLAGOLITIC SMALL LETTER LATINATE MYSLITE +2C60..2C7B ; Cased # L& [28] LATIN CAPITAL LETTER L WITH DOUBLE BAR..LATIN LETTER SMALL CAPITAL TURNED E +2C7C..2C7D ; Cased # Lm [2] LATIN SUBSCRIPT SMALL LETTER J..MODIFIER LETTER CAPITAL V +2C7E..2CE4 ; Cased # L& [103] LATIN CAPITAL LETTER S WITH SWASH TAIL..COPTIC SYMBOL KAI +2CEB..2CEE ; Cased # L& [4] COPTIC CAPITAL LETTER CRYPTOGRAMMIC SHEI..COPTIC SMALL LETTER CRYPTOGRAMMIC GANGIA +2CF2..2CF3 ; Cased # L& [2] COPTIC CAPITAL LETTER BOHAIRIC KHEI..COPTIC SMALL LETTER BOHAIRIC KHEI +2D00..2D25 ; Cased # L& [38] GEORGIAN SMALL LETTER AN..GEORGIAN SMALL LETTER HOE +2D27 ; Cased # L& GEORGIAN SMALL LETTER YN +2D2D ; Cased # L& GEORGIAN SMALL LETTER AEN +A640..A66D ; Cased # L& [46] CYRILLIC CAPITAL LETTER ZEMLYA..CYRILLIC SMALL LETTER DOUBLE MONOCULAR O +A680..A69B ; Cased # L& [28] CYRILLIC CAPITAL LETTER DWE..CYRILLIC SMALL LETTER CROSSED O +A69C..A69D ; Cased # Lm [2] MODIFIER LETTER CYRILLIC HARD SIGN..MODIFIER LETTER CYRILLIC SOFT SIGN +A722..A76F ; Cased # L& [78] LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF..LATIN SMALL LETTER CON +A770 ; Cased # Lm MODIFIER LETTER US +A771..A787 ; Cased # L& [23] LATIN SMALL LETTER DUM..LATIN SMALL LETTER INSULAR T +A78B..A78E ; Cased # L& [4] LATIN CAPITAL LETTER SALTILLO..LATIN SMALL LETTER L WITH RETROFLEX HOOK AND BELT +A790..A7B9 ; Cased # L& [42] LATIN CAPITAL LETTER N WITH DESCENDER..LATIN SMALL LETTER U WITH STROKE +A7F8..A7F9 ; Cased # Lm [2] MODIFIER LETTER CAPITAL H WITH STROKE..MODIFIER LETTER SMALL LIGATURE OE +A7FA ; Cased # L& LATIN LETTER SMALL CAPITAL TURNED M +AB30..AB5A ; Cased # L& [43] LATIN SMALL LETTER BARRED ALPHA..LATIN SMALL LETTER Y WITH SHORT RIGHT LEG +AB5C..AB5F ; Cased # Lm [4] MODIFIER LETTER SMALL HENG..MODIFIER LETTER SMALL U WITH LEFT HOOK +AB60..AB65 ; Cased # L& [6] LATIN SMALL LETTER SAKHA YAT..GREEK LETTER SMALL CAPITAL OMEGA +AB70..ABBF ; Cased # L& [80] CHEROKEE SMALL LETTER A..CHEROKEE SMALL LETTER YA +FB00..FB06 ; Cased # L& [7] LATIN SMALL LIGATURE FF..LATIN SMALL LIGATURE ST +FB13..FB17 ; Cased # L& [5] ARMENIAN SMALL LIGATURE MEN NOW..ARMENIAN SMALL LIGATURE MEN XEH +FF21..FF3A ; Cased # L& [26] FULLWIDTH LATIN CAPITAL LETTER A..FULLWIDTH LATIN CAPITAL LETTER Z +FF41..FF5A ; Cased # L& [26] FULLWIDTH LATIN SMALL LETTER A..FULLWIDTH LATIN SMALL LETTER Z +10400..1044F ; Cased # L& [80] DESERET CAPITAL LETTER LONG I..DESERET SMALL LETTER EW +104B0..104D3 ; Cased # L& [36] OSAGE CAPITAL LETTER A..OSAGE CAPITAL LETTER ZHA +104D8..104FB ; Cased # L& [36] OSAGE SMALL LETTER A..OSAGE SMALL LETTER ZHA +10C80..10CB2 ; Cased # L& [51] OLD HUNGARIAN CAPITAL LETTER A..OLD HUNGARIAN CAPITAL LETTER US +10CC0..10CF2 ; Cased # L& [51] OLD HUNGARIAN SMALL LETTER A..OLD HUNGARIAN SMALL LETTER US +118A0..118DF ; Cased # L& [64] WARANG CITI CAPITAL LETTER NGAA..WARANG CITI SMALL LETTER VIYO +16E40..16E7F ; Cased # L& [64] MEDEFAIDRIN CAPITAL LETTER M..MEDEFAIDRIN SMALL LETTER Y +1D400..1D454 ; Cased # L& [85] MATHEMATICAL BOLD CAPITAL A..MATHEMATICAL ITALIC SMALL G +1D456..1D49C ; Cased # L& [71] MATHEMATICAL ITALIC SMALL I..MATHEMATICAL SCRIPT CAPITAL A +1D49E..1D49F ; Cased # L& [2] MATHEMATICAL SCRIPT CAPITAL C..MATHEMATICAL SCRIPT CAPITAL D +1D4A2 ; Cased # L& MATHEMATICAL SCRIPT CAPITAL G +1D4A5..1D4A6 ; Cased # L& [2] MATHEMATICAL SCRIPT CAPITAL J..MATHEMATICAL SCRIPT CAPITAL K +1D4A9..1D4AC ; Cased # L& [4] MATHEMATICAL SCRIPT CAPITAL N..MATHEMATICAL SCRIPT CAPITAL Q +1D4AE..1D4B9 ; Cased # L& [12] MATHEMATICAL SCRIPT CAPITAL S..MATHEMATICAL SCRIPT SMALL D +1D4BB ; Cased # L& MATHEMATICAL SCRIPT SMALL F +1D4BD..1D4C3 ; Cased # L& [7] MATHEMATICAL SCRIPT SMALL H..MATHEMATICAL SCRIPT SMALL N +1D4C5..1D505 ; Cased # L& [65] MATHEMATICAL SCRIPT SMALL P..MATHEMATICAL FRAKTUR CAPITAL B +1D507..1D50A ; Cased # L& [4] MATHEMATICAL FRAKTUR CAPITAL D..MATHEMATICAL FRAKTUR CAPITAL G +1D50D..1D514 ; Cased # L& [8] MATHEMATICAL FRAKTUR CAPITAL J..MATHEMATICAL FRAKTUR CAPITAL Q +1D516..1D51C ; Cased # L& [7] MATHEMATICAL FRAKTUR CAPITAL S..MATHEMATICAL FRAKTUR CAPITAL Y +1D51E..1D539 ; Cased # L& [28] MATHEMATICAL FRAKTUR SMALL A..MATHEMATICAL DOUBLE-STRUCK CAPITAL B +1D53B..1D53E ; Cased # L& [4] MATHEMATICAL DOUBLE-STRUCK CAPITAL D..MATHEMATICAL DOUBLE-STRUCK CAPITAL G +1D540..1D544 ; Cased # L& [5] MATHEMATICAL DOUBLE-STRUCK CAPITAL I..MATHEMATICAL DOUBLE-STRUCK CAPITAL M +1D546 ; Cased # L& MATHEMATICAL DOUBLE-STRUCK CAPITAL O +1D54A..1D550 ; Cased # L& [7] MATHEMATICAL DOUBLE-STRUCK CAPITAL S..MATHEMATICAL DOUBLE-STRUCK CAPITAL Y +1D552..1D6A5 ; Cased # L& [340] MATHEMATICAL DOUBLE-STRUCK SMALL A..MATHEMATICAL ITALIC SMALL DOTLESS J +1D6A8..1D6C0 ; Cased # L& [25] MATHEMATICAL BOLD CAPITAL ALPHA..MATHEMATICAL BOLD CAPITAL OMEGA +1D6C2..1D6DA ; Cased # L& [25] MATHEMATICAL BOLD SMALL ALPHA..MATHEMATICAL BOLD SMALL OMEGA +1D6DC..1D6FA ; Cased # L& [31] MATHEMATICAL BOLD EPSILON SYMBOL..MATHEMATICAL ITALIC CAPITAL OMEGA +1D6FC..1D714 ; Cased # L& [25] MATHEMATICAL ITALIC SMALL ALPHA..MATHEMATICAL ITALIC SMALL OMEGA +1D716..1D734 ; Cased # L& [31] MATHEMATICAL ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD ITALIC CAPITAL OMEGA +1D736..1D74E ; Cased # L& [25] MATHEMATICAL BOLD ITALIC SMALL ALPHA..MATHEMATICAL BOLD ITALIC SMALL OMEGA +1D750..1D76E ; Cased # L& [31] MATHEMATICAL BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA +1D770..1D788 ; Cased # L& [25] MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA +1D78A..1D7A8 ; Cased # L& [31] MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA +1D7AA..1D7C2 ; Cased # L& [25] MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA +1D7C4..1D7CB ; Cased # L& [8] MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD SMALL DIGAMMA +1E900..1E943 ; Cased # L& [68] ADLAM CAPITAL LETTER ALIF..ADLAM SMALL LETTER SHA +1F130..1F149 ; Cased # So [26] SQUARED LATIN CAPITAL LETTER A..SQUARED LATIN CAPITAL LETTER Z +1F150..1F169 ; Cased # So [26] NEGATIVE CIRCLED LATIN CAPITAL LETTER A..NEGATIVE CIRCLED LATIN CAPITAL LETTER Z +1F170..1F189 ; Cased # So [26] NEGATIVE SQUARED LATIN CAPITAL LETTER A..NEGATIVE SQUARED LATIN CAPITAL LETTER Z + +# Total code points: 4266 + +# ================================================ + +# Derived Property: Case_Ignorable (CI) +# As defined by Unicode Standard Definition D136 +# C is defined to be case-ignorable if +# Word_Break(C) = MidLetter or MidNumLet or Single_Quote, or +# General_Category(C) = Nonspacing_Mark (Mn), Enclosing_Mark (Me), Format (Cf), Modifier_Letter (Lm), or Modifier_Symbol (Sk). + +0027 ; Case_Ignorable # Po APOSTROPHE +002E ; Case_Ignorable # Po FULL STOP +003A ; Case_Ignorable # Po COLON +005E ; Case_Ignorable # Sk CIRCUMFLEX ACCENT +0060 ; Case_Ignorable # Sk GRAVE ACCENT +00A8 ; Case_Ignorable # Sk DIAERESIS +00AD ; Case_Ignorable # Cf SOFT HYPHEN +00AF ; Case_Ignorable # Sk MACRON +00B4 ; Case_Ignorable # Sk ACUTE ACCENT +00B7 ; Case_Ignorable # Po MIDDLE DOT +00B8 ; Case_Ignorable # Sk CEDILLA +02B0..02C1 ; Case_Ignorable # Lm [18] MODIFIER LETTER SMALL H..MODIFIER LETTER REVERSED GLOTTAL STOP +02C2..02C5 ; Case_Ignorable # Sk [4] MODIFIER LETTER LEFT ARROWHEAD..MODIFIER LETTER DOWN ARROWHEAD +02C6..02D1 ; Case_Ignorable # Lm [12] MODIFIER LETTER CIRCUMFLEX ACCENT..MODIFIER LETTER HALF TRIANGULAR COLON +02D2..02DF ; Case_Ignorable # Sk [14] MODIFIER LETTER CENTRED RIGHT HALF RING..MODIFIER LETTER CROSS ACCENT +02E0..02E4 ; Case_Ignorable # Lm [5] MODIFIER LETTER SMALL GAMMA..MODIFIER LETTER SMALL REVERSED GLOTTAL STOP +02E5..02EB ; Case_Ignorable # Sk [7] MODIFIER LETTER EXTRA-HIGH TONE BAR..MODIFIER LETTER YANG DEPARTING TONE MARK +02EC ; Case_Ignorable # Lm MODIFIER LETTER VOICING +02ED ; Case_Ignorable # Sk MODIFIER LETTER UNASPIRATED +02EE ; Case_Ignorable # Lm MODIFIER LETTER DOUBLE APOSTROPHE +02EF..02FF ; Case_Ignorable # Sk [17] MODIFIER LETTER LOW DOWN ARROWHEAD..MODIFIER LETTER LOW LEFT ARROW +0300..036F ; Case_Ignorable # Mn [112] COMBINING GRAVE ACCENT..COMBINING LATIN SMALL LETTER X +0374 ; Case_Ignorable # Lm GREEK NUMERAL SIGN +0375 ; Case_Ignorable # Sk GREEK LOWER NUMERAL SIGN +037A ; Case_Ignorable # Lm GREEK YPOGEGRAMMENI +0384..0385 ; Case_Ignorable # Sk [2] GREEK TONOS..GREEK DIALYTIKA TONOS +0387 ; Case_Ignorable # Po GREEK ANO TELEIA +0483..0487 ; Case_Ignorable # Mn [5] COMBINING CYRILLIC TITLO..COMBINING CYRILLIC POKRYTIE +0488..0489 ; Case_Ignorable # Me [2] COMBINING CYRILLIC HUNDRED THOUSANDS SIGN..COMBINING CYRILLIC MILLIONS SIGN +0559 ; Case_Ignorable # Lm ARMENIAN MODIFIER LETTER LEFT HALF RING +0591..05BD ; Case_Ignorable # Mn [45] HEBREW ACCENT ETNAHTA..HEBREW POINT METEG +05BF ; Case_Ignorable # Mn HEBREW POINT RAFE +05C1..05C2 ; Case_Ignorable # Mn [2] HEBREW POINT SHIN DOT..HEBREW POINT SIN DOT +05C4..05C5 ; Case_Ignorable # Mn [2] HEBREW MARK UPPER DOT..HEBREW MARK LOWER DOT +05C7 ; Case_Ignorable # Mn HEBREW POINT QAMATS QATAN +05F4 ; Case_Ignorable # Po HEBREW PUNCTUATION GERSHAYIM +0600..0605 ; Case_Ignorable # Cf [6] ARABIC NUMBER SIGN..ARABIC NUMBER MARK ABOVE +0610..061A ; Case_Ignorable # Mn [11] ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM..ARABIC SMALL KASRA +061C ; Case_Ignorable # Cf ARABIC LETTER MARK +0640 ; Case_Ignorable # Lm ARABIC TATWEEL +064B..065F ; Case_Ignorable # Mn [21] ARABIC FATHATAN..ARABIC WAVY HAMZA BELOW +0670 ; Case_Ignorable # Mn ARABIC LETTER SUPERSCRIPT ALEF +06D6..06DC ; Case_Ignorable # Mn [7] ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA..ARABIC SMALL HIGH SEEN +06DD ; Case_Ignorable # Cf ARABIC END OF AYAH +06DF..06E4 ; Case_Ignorable # Mn [6] ARABIC SMALL HIGH ROUNDED ZERO..ARABIC SMALL HIGH MADDA +06E5..06E6 ; Case_Ignorable # Lm [2] ARABIC SMALL WAW..ARABIC SMALL YEH +06E7..06E8 ; Case_Ignorable # Mn [2] ARABIC SMALL HIGH YEH..ARABIC SMALL HIGH NOON +06EA..06ED ; Case_Ignorable # Mn [4] ARABIC EMPTY CENTRE LOW STOP..ARABIC SMALL LOW MEEM +070F ; Case_Ignorable # Cf SYRIAC ABBREVIATION MARK +0711 ; Case_Ignorable # Mn SYRIAC LETTER SUPERSCRIPT ALAPH +0730..074A ; Case_Ignorable # Mn [27] SYRIAC PTHAHA ABOVE..SYRIAC BARREKH +07A6..07B0 ; Case_Ignorable # Mn [11] THAANA ABAFILI..THAANA SUKUN +07EB..07F3 ; Case_Ignorable # Mn [9] NKO COMBINING SHORT HIGH TONE..NKO COMBINING DOUBLE DOT ABOVE +07F4..07F5 ; Case_Ignorable # Lm [2] NKO HIGH TONE APOSTROPHE..NKO LOW TONE APOSTROPHE +07FA ; Case_Ignorable # Lm NKO LAJANYALAN +07FD ; Case_Ignorable # Mn NKO DANTAYALAN +0816..0819 ; Case_Ignorable # Mn [4] SAMARITAN MARK IN..SAMARITAN MARK DAGESH +081A ; Case_Ignorable # Lm SAMARITAN MODIFIER LETTER EPENTHETIC YUT +081B..0823 ; Case_Ignorable # Mn [9] SAMARITAN MARK EPENTHETIC YUT..SAMARITAN VOWEL SIGN A +0824 ; Case_Ignorable # Lm SAMARITAN MODIFIER LETTER SHORT A +0825..0827 ; Case_Ignorable # Mn [3] SAMARITAN VOWEL SIGN SHORT A..SAMARITAN VOWEL SIGN U +0828 ; Case_Ignorable # Lm SAMARITAN MODIFIER LETTER I +0829..082D ; Case_Ignorable # Mn [5] SAMARITAN VOWEL SIGN LONG I..SAMARITAN MARK NEQUDAA +0859..085B ; Case_Ignorable # Mn [3] MANDAIC AFFRICATION MARK..MANDAIC GEMINATION MARK +08D3..08E1 ; Case_Ignorable # Mn [15] ARABIC SMALL LOW WAW..ARABIC SMALL HIGH SIGN SAFHA +08E2 ; Case_Ignorable # Cf ARABIC DISPUTED END OF AYAH +08E3..0902 ; Case_Ignorable # Mn [32] ARABIC TURNED DAMMA BELOW..DEVANAGARI SIGN ANUSVARA +093A ; Case_Ignorable # Mn DEVANAGARI VOWEL SIGN OE +093C ; Case_Ignorable # Mn DEVANAGARI SIGN NUKTA +0941..0948 ; Case_Ignorable # Mn [8] DEVANAGARI VOWEL SIGN U..DEVANAGARI VOWEL SIGN AI +094D ; Case_Ignorable # Mn DEVANAGARI SIGN VIRAMA +0951..0957 ; Case_Ignorable # Mn [7] DEVANAGARI STRESS SIGN UDATTA..DEVANAGARI VOWEL SIGN UUE +0962..0963 ; Case_Ignorable # Mn [2] DEVANAGARI VOWEL SIGN VOCALIC L..DEVANAGARI VOWEL SIGN VOCALIC LL +0971 ; Case_Ignorable # Lm DEVANAGARI SIGN HIGH SPACING DOT +0981 ; Case_Ignorable # Mn BENGALI SIGN CANDRABINDU +09BC ; Case_Ignorable # Mn BENGALI SIGN NUKTA +09C1..09C4 ; Case_Ignorable # Mn [4] BENGALI VOWEL SIGN U..BENGALI VOWEL SIGN VOCALIC RR +09CD ; Case_Ignorable # Mn BENGALI SIGN VIRAMA +09E2..09E3 ; Case_Ignorable # Mn [2] BENGALI VOWEL SIGN VOCALIC L..BENGALI VOWEL SIGN VOCALIC LL +09FE ; Case_Ignorable # Mn BENGALI SANDHI MARK +0A01..0A02 ; Case_Ignorable # Mn [2] GURMUKHI SIGN ADAK BINDI..GURMUKHI SIGN BINDI +0A3C ; Case_Ignorable # Mn GURMUKHI SIGN NUKTA +0A41..0A42 ; Case_Ignorable # Mn [2] GURMUKHI VOWEL SIGN U..GURMUKHI VOWEL SIGN UU +0A47..0A48 ; Case_Ignorable # Mn [2] GURMUKHI VOWEL SIGN EE..GURMUKHI VOWEL SIGN AI +0A4B..0A4D ; Case_Ignorable # Mn [3] GURMUKHI VOWEL SIGN OO..GURMUKHI SIGN VIRAMA +0A51 ; Case_Ignorable # Mn GURMUKHI SIGN UDAAT +0A70..0A71 ; Case_Ignorable # Mn [2] GURMUKHI TIPPI..GURMUKHI ADDAK +0A75 ; Case_Ignorable # Mn GURMUKHI SIGN YAKASH +0A81..0A82 ; Case_Ignorable # Mn [2] GUJARATI SIGN CANDRABINDU..GUJARATI SIGN ANUSVARA +0ABC ; Case_Ignorable # Mn GUJARATI SIGN NUKTA +0AC1..0AC5 ; Case_Ignorable # Mn [5] GUJARATI VOWEL SIGN U..GUJARATI VOWEL SIGN CANDRA E +0AC7..0AC8 ; Case_Ignorable # Mn [2] GUJARATI VOWEL SIGN E..GUJARATI VOWEL SIGN AI +0ACD ; Case_Ignorable # Mn GUJARATI SIGN VIRAMA +0AE2..0AE3 ; Case_Ignorable # Mn [2] GUJARATI VOWEL SIGN VOCALIC L..GUJARATI VOWEL SIGN VOCALIC LL +0AFA..0AFF ; Case_Ignorable # Mn [6] GUJARATI SIGN SUKUN..GUJARATI SIGN TWO-CIRCLE NUKTA ABOVE +0B01 ; Case_Ignorable # Mn ORIYA SIGN CANDRABINDU +0B3C ; Case_Ignorable # Mn ORIYA SIGN NUKTA +0B3F ; Case_Ignorable # Mn ORIYA VOWEL SIGN I +0B41..0B44 ; Case_Ignorable # Mn [4] ORIYA VOWEL SIGN U..ORIYA VOWEL SIGN VOCALIC RR +0B4D ; Case_Ignorable # Mn ORIYA SIGN VIRAMA +0B56 ; Case_Ignorable # Mn ORIYA AI LENGTH MARK +0B62..0B63 ; Case_Ignorable # Mn [2] ORIYA VOWEL SIGN VOCALIC L..ORIYA VOWEL SIGN VOCALIC LL +0B82 ; Case_Ignorable # Mn TAMIL SIGN ANUSVARA +0BC0 ; Case_Ignorable # Mn TAMIL VOWEL SIGN II +0BCD ; Case_Ignorable # Mn TAMIL SIGN VIRAMA +0C00 ; Case_Ignorable # Mn TELUGU SIGN COMBINING CANDRABINDU ABOVE +0C04 ; Case_Ignorable # Mn TELUGU SIGN COMBINING ANUSVARA ABOVE +0C3E..0C40 ; Case_Ignorable # Mn [3] TELUGU VOWEL SIGN AA..TELUGU VOWEL SIGN II +0C46..0C48 ; Case_Ignorable # Mn [3] TELUGU VOWEL SIGN E..TELUGU VOWEL SIGN AI +0C4A..0C4D ; Case_Ignorable # Mn [4] TELUGU VOWEL SIGN O..TELUGU SIGN VIRAMA +0C55..0C56 ; Case_Ignorable # Mn [2] TELUGU LENGTH MARK..TELUGU AI LENGTH MARK +0C62..0C63 ; Case_Ignorable # Mn [2] TELUGU VOWEL SIGN VOCALIC L..TELUGU VOWEL SIGN VOCALIC LL +0C81 ; Case_Ignorable # Mn KANNADA SIGN CANDRABINDU +0CBC ; Case_Ignorable # Mn KANNADA SIGN NUKTA +0CBF ; Case_Ignorable # Mn KANNADA VOWEL SIGN I +0CC6 ; Case_Ignorable # Mn KANNADA VOWEL SIGN E +0CCC..0CCD ; Case_Ignorable # Mn [2] KANNADA VOWEL SIGN AU..KANNADA SIGN VIRAMA +0CE2..0CE3 ; Case_Ignorable # Mn [2] KANNADA VOWEL SIGN VOCALIC L..KANNADA VOWEL SIGN VOCALIC LL +0D00..0D01 ; Case_Ignorable # Mn [2] MALAYALAM SIGN COMBINING ANUSVARA ABOVE..MALAYALAM SIGN CANDRABINDU +0D3B..0D3C ; Case_Ignorable # Mn [2] MALAYALAM SIGN VERTICAL BAR VIRAMA..MALAYALAM SIGN CIRCULAR VIRAMA +0D41..0D44 ; Case_Ignorable # Mn [4] MALAYALAM VOWEL SIGN U..MALAYALAM VOWEL SIGN VOCALIC RR +0D4D ; Case_Ignorable # Mn MALAYALAM SIGN VIRAMA +0D62..0D63 ; Case_Ignorable # Mn [2] MALAYALAM VOWEL SIGN VOCALIC L..MALAYALAM VOWEL SIGN VOCALIC LL +0DCA ; Case_Ignorable # Mn SINHALA SIGN AL-LAKUNA +0DD2..0DD4 ; Case_Ignorable # Mn [3] SINHALA VOWEL SIGN KETTI IS-PILLA..SINHALA VOWEL SIGN KETTI PAA-PILLA +0DD6 ; Case_Ignorable # Mn SINHALA VOWEL SIGN DIGA PAA-PILLA +0E31 ; Case_Ignorable # Mn THAI CHARACTER MAI HAN-AKAT +0E34..0E3A ; Case_Ignorable # Mn [7] THAI CHARACTER SARA I..THAI CHARACTER PHINTHU +0E46 ; Case_Ignorable # Lm THAI CHARACTER MAIYAMOK +0E47..0E4E ; Case_Ignorable # Mn [8] THAI CHARACTER MAITAIKHU..THAI CHARACTER YAMAKKAN +0EB1 ; Case_Ignorable # Mn LAO VOWEL SIGN MAI KAN +0EB4..0EB9 ; Case_Ignorable # Mn [6] LAO VOWEL SIGN I..LAO VOWEL SIGN UU +0EBB..0EBC ; Case_Ignorable # Mn [2] LAO VOWEL SIGN MAI KON..LAO SEMIVOWEL SIGN LO +0EC6 ; Case_Ignorable # Lm LAO KO LA +0EC8..0ECD ; Case_Ignorable # Mn [6] LAO TONE MAI EK..LAO NIGGAHITA +0F18..0F19 ; Case_Ignorable # Mn [2] TIBETAN ASTROLOGICAL SIGN -KHYUD PA..TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS +0F35 ; Case_Ignorable # Mn TIBETAN MARK NGAS BZUNG NYI ZLA +0F37 ; Case_Ignorable # Mn TIBETAN MARK NGAS BZUNG SGOR RTAGS +0F39 ; Case_Ignorable # Mn TIBETAN MARK TSA -PHRU +0F71..0F7E ; Case_Ignorable # Mn [14] TIBETAN VOWEL SIGN AA..TIBETAN SIGN RJES SU NGA RO +0F80..0F84 ; Case_Ignorable # Mn [5] TIBETAN VOWEL SIGN REVERSED I..TIBETAN MARK HALANTA +0F86..0F87 ; Case_Ignorable # Mn [2] TIBETAN SIGN LCI RTAGS..TIBETAN SIGN YANG RTAGS +0F8D..0F97 ; Case_Ignorable # Mn [11] TIBETAN SUBJOINED SIGN LCE TSA CAN..TIBETAN SUBJOINED LETTER JA +0F99..0FBC ; Case_Ignorable # Mn [36] TIBETAN SUBJOINED LETTER NYA..TIBETAN SUBJOINED LETTER FIXED-FORM RA +0FC6 ; Case_Ignorable # Mn TIBETAN SYMBOL PADMA GDAN +102D..1030 ; Case_Ignorable # Mn [4] MYANMAR VOWEL SIGN I..MYANMAR VOWEL SIGN UU +1032..1037 ; Case_Ignorable # Mn [6] MYANMAR VOWEL SIGN AI..MYANMAR SIGN DOT BELOW +1039..103A ; Case_Ignorable # Mn [2] MYANMAR SIGN VIRAMA..MYANMAR SIGN ASAT +103D..103E ; Case_Ignorable # Mn [2] MYANMAR CONSONANT SIGN MEDIAL WA..MYANMAR CONSONANT SIGN MEDIAL HA +1058..1059 ; Case_Ignorable # Mn [2] MYANMAR VOWEL SIGN VOCALIC L..MYANMAR VOWEL SIGN VOCALIC LL +105E..1060 ; Case_Ignorable # Mn [3] MYANMAR CONSONANT SIGN MON MEDIAL NA..MYANMAR CONSONANT SIGN MON MEDIAL LA +1071..1074 ; Case_Ignorable # Mn [4] MYANMAR VOWEL SIGN GEBA KAREN I..MYANMAR VOWEL SIGN KAYAH EE +1082 ; Case_Ignorable # Mn MYANMAR CONSONANT SIGN SHAN MEDIAL WA +1085..1086 ; Case_Ignorable # Mn [2] MYANMAR VOWEL SIGN SHAN E ABOVE..MYANMAR VOWEL SIGN SHAN FINAL Y +108D ; Case_Ignorable # Mn MYANMAR SIGN SHAN COUNCIL EMPHATIC TONE +109D ; Case_Ignorable # Mn MYANMAR VOWEL SIGN AITON AI +10FC ; Case_Ignorable # Lm MODIFIER LETTER GEORGIAN NAR +135D..135F ; Case_Ignorable # Mn [3] ETHIOPIC COMBINING GEMINATION AND VOWEL LENGTH MARK..ETHIOPIC COMBINING GEMINATION MARK +1712..1714 ; Case_Ignorable # Mn [3] TAGALOG VOWEL SIGN I..TAGALOG SIGN VIRAMA +1732..1734 ; Case_Ignorable # Mn [3] HANUNOO VOWEL SIGN I..HANUNOO SIGN PAMUDPOD +1752..1753 ; Case_Ignorable # Mn [2] BUHID VOWEL SIGN I..BUHID VOWEL SIGN U +1772..1773 ; Case_Ignorable # Mn [2] TAGBANWA VOWEL SIGN I..TAGBANWA VOWEL SIGN U +17B4..17B5 ; Case_Ignorable # Mn [2] KHMER VOWEL INHERENT AQ..KHMER VOWEL INHERENT AA +17B7..17BD ; Case_Ignorable # Mn [7] KHMER VOWEL SIGN I..KHMER VOWEL SIGN UA +17C6 ; Case_Ignorable # Mn KHMER SIGN NIKAHIT +17C9..17D3 ; Case_Ignorable # Mn [11] KHMER SIGN MUUSIKATOAN..KHMER SIGN BATHAMASAT +17D7 ; Case_Ignorable # Lm KHMER SIGN LEK TOO +17DD ; Case_Ignorable # Mn KHMER SIGN ATTHACAN +180B..180D ; Case_Ignorable # Mn [3] MONGOLIAN FREE VARIATION SELECTOR ONE..MONGOLIAN FREE VARIATION SELECTOR THREE +180E ; Case_Ignorable # Cf MONGOLIAN VOWEL SEPARATOR +1843 ; Case_Ignorable # Lm MONGOLIAN LETTER TODO LONG VOWEL SIGN +1885..1886 ; Case_Ignorable # Mn [2] MONGOLIAN LETTER ALI GALI BALUDA..MONGOLIAN LETTER ALI GALI THREE BALUDA +18A9 ; Case_Ignorable # Mn MONGOLIAN LETTER ALI GALI DAGALGA +1920..1922 ; Case_Ignorable # Mn [3] LIMBU VOWEL SIGN A..LIMBU VOWEL SIGN U +1927..1928 ; Case_Ignorable # Mn [2] LIMBU VOWEL SIGN E..LIMBU VOWEL SIGN O +1932 ; Case_Ignorable # Mn LIMBU SMALL LETTER ANUSVARA +1939..193B ; Case_Ignorable # Mn [3] LIMBU SIGN MUKPHRENG..LIMBU SIGN SA-I +1A17..1A18 ; Case_Ignorable # Mn [2] BUGINESE VOWEL SIGN I..BUGINESE VOWEL SIGN U +1A1B ; Case_Ignorable # Mn BUGINESE VOWEL SIGN AE +1A56 ; Case_Ignorable # Mn TAI THAM CONSONANT SIGN MEDIAL LA +1A58..1A5E ; Case_Ignorable # Mn [7] TAI THAM SIGN MAI KANG LAI..TAI THAM CONSONANT SIGN SA +1A60 ; Case_Ignorable # Mn TAI THAM SIGN SAKOT +1A62 ; Case_Ignorable # Mn TAI THAM VOWEL SIGN MAI SAT +1A65..1A6C ; Case_Ignorable # Mn [8] TAI THAM VOWEL SIGN I..TAI THAM VOWEL SIGN OA BELOW +1A73..1A7C ; Case_Ignorable # Mn [10] TAI THAM VOWEL SIGN OA ABOVE..TAI THAM SIGN KHUEN-LUE KARAN +1A7F ; Case_Ignorable # Mn TAI THAM COMBINING CRYPTOGRAMMIC DOT +1AA7 ; Case_Ignorable # Lm TAI THAM SIGN MAI YAMOK +1AB0..1ABD ; Case_Ignorable # Mn [14] COMBINING DOUBLED CIRCUMFLEX ACCENT..COMBINING PARENTHESES BELOW +1ABE ; Case_Ignorable # Me COMBINING PARENTHESES OVERLAY +1B00..1B03 ; Case_Ignorable # Mn [4] BALINESE SIGN ULU RICEM..BALINESE SIGN SURANG +1B34 ; Case_Ignorable # Mn BALINESE SIGN REREKAN +1B36..1B3A ; Case_Ignorable # Mn [5] BALINESE VOWEL SIGN ULU..BALINESE VOWEL SIGN RA REPA +1B3C ; Case_Ignorable # Mn BALINESE VOWEL SIGN LA LENGA +1B42 ; Case_Ignorable # Mn BALINESE VOWEL SIGN PEPET +1B6B..1B73 ; Case_Ignorable # Mn [9] BALINESE MUSICAL SYMBOL COMBINING TEGEH..BALINESE MUSICAL SYMBOL COMBINING GONG +1B80..1B81 ; Case_Ignorable # Mn [2] SUNDANESE SIGN PANYECEK..SUNDANESE SIGN PANGLAYAR +1BA2..1BA5 ; Case_Ignorable # Mn [4] SUNDANESE CONSONANT SIGN PANYAKRA..SUNDANESE VOWEL SIGN PANYUKU +1BA8..1BA9 ; Case_Ignorable # Mn [2] SUNDANESE VOWEL SIGN PAMEPET..SUNDANESE VOWEL SIGN PANEULEUNG +1BAB..1BAD ; Case_Ignorable # Mn [3] SUNDANESE SIGN VIRAMA..SUNDANESE CONSONANT SIGN PASANGAN WA +1BE6 ; Case_Ignorable # Mn BATAK SIGN TOMPI +1BE8..1BE9 ; Case_Ignorable # Mn [2] BATAK VOWEL SIGN PAKPAK E..BATAK VOWEL SIGN EE +1BED ; Case_Ignorable # Mn BATAK VOWEL SIGN KARO O +1BEF..1BF1 ; Case_Ignorable # Mn [3] BATAK VOWEL SIGN U FOR SIMALUNGUN SA..BATAK CONSONANT SIGN H +1C2C..1C33 ; Case_Ignorable # Mn [8] LEPCHA VOWEL SIGN E..LEPCHA CONSONANT SIGN T +1C36..1C37 ; Case_Ignorable # Mn [2] LEPCHA SIGN RAN..LEPCHA SIGN NUKTA +1C78..1C7D ; Case_Ignorable # Lm [6] OL CHIKI MU TTUDDAG..OL CHIKI AHAD +1CD0..1CD2 ; Case_Ignorable # Mn [3] VEDIC TONE KARSHANA..VEDIC TONE PRENKHA +1CD4..1CE0 ; Case_Ignorable # Mn [13] VEDIC SIGN YAJURVEDIC MIDLINE SVARITA..VEDIC TONE RIGVEDIC KASHMIRI INDEPENDENT SVARITA +1CE2..1CE8 ; Case_Ignorable # Mn [7] VEDIC SIGN VISARGA SVARITA..VEDIC SIGN VISARGA ANUDATTA WITH TAIL +1CED ; Case_Ignorable # Mn VEDIC SIGN TIRYAK +1CF4 ; Case_Ignorable # Mn VEDIC TONE CANDRA ABOVE +1CF8..1CF9 ; Case_Ignorable # Mn [2] VEDIC TONE RING ABOVE..VEDIC TONE DOUBLE RING ABOVE +1D2C..1D6A ; Case_Ignorable # Lm [63] MODIFIER LETTER CAPITAL A..GREEK SUBSCRIPT SMALL LETTER CHI +1D78 ; Case_Ignorable # Lm MODIFIER LETTER CYRILLIC EN +1D9B..1DBF ; Case_Ignorable # Lm [37] MODIFIER LETTER SMALL TURNED ALPHA..MODIFIER LETTER SMALL THETA +1DC0..1DF9 ; Case_Ignorable # Mn [58] COMBINING DOTTED GRAVE ACCENT..COMBINING WIDE INVERTED BRIDGE BELOW +1DFB..1DFF ; Case_Ignorable # Mn [5] COMBINING DELETION MARK..COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW +1FBD ; Case_Ignorable # Sk GREEK KORONIS +1FBF..1FC1 ; Case_Ignorable # Sk [3] GREEK PSILI..GREEK DIALYTIKA AND PERISPOMENI +1FCD..1FCF ; Case_Ignorable # Sk [3] GREEK PSILI AND VARIA..GREEK PSILI AND PERISPOMENI +1FDD..1FDF ; Case_Ignorable # Sk [3] GREEK DASIA AND VARIA..GREEK DASIA AND PERISPOMENI +1FED..1FEF ; Case_Ignorable # Sk [3] GREEK DIALYTIKA AND VARIA..GREEK VARIA +1FFD..1FFE ; Case_Ignorable # Sk [2] GREEK OXIA..GREEK DASIA +200B..200F ; Case_Ignorable # Cf [5] ZERO WIDTH SPACE..RIGHT-TO-LEFT MARK +2018 ; Case_Ignorable # Pi LEFT SINGLE QUOTATION MARK +2019 ; Case_Ignorable # Pf RIGHT SINGLE QUOTATION MARK +2024 ; Case_Ignorable # Po ONE DOT LEADER +2027 ; Case_Ignorable # Po HYPHENATION POINT +202A..202E ; Case_Ignorable # Cf [5] LEFT-TO-RIGHT EMBEDDING..RIGHT-TO-LEFT OVERRIDE +2060..2064 ; Case_Ignorable # Cf [5] WORD JOINER..INVISIBLE PLUS +2066..206F ; Case_Ignorable # Cf [10] LEFT-TO-RIGHT ISOLATE..NOMINAL DIGIT SHAPES +2071 ; Case_Ignorable # Lm SUPERSCRIPT LATIN SMALL LETTER I +207F ; Case_Ignorable # Lm SUPERSCRIPT LATIN SMALL LETTER N +2090..209C ; Case_Ignorable # Lm [13] LATIN SUBSCRIPT SMALL LETTER A..LATIN SUBSCRIPT SMALL LETTER T +20D0..20DC ; Case_Ignorable # Mn [13] COMBINING LEFT HARPOON ABOVE..COMBINING FOUR DOTS ABOVE +20DD..20E0 ; Case_Ignorable # Me [4] COMBINING ENCLOSING CIRCLE..COMBINING ENCLOSING CIRCLE BACKSLASH +20E1 ; Case_Ignorable # Mn COMBINING LEFT RIGHT ARROW ABOVE +20E2..20E4 ; Case_Ignorable # Me [3] COMBINING ENCLOSING SCREEN..COMBINING ENCLOSING UPWARD POINTING TRIANGLE +20E5..20F0 ; Case_Ignorable # Mn [12] COMBINING REVERSE SOLIDUS OVERLAY..COMBINING ASTERISK ABOVE +2C7C..2C7D ; Case_Ignorable # Lm [2] LATIN SUBSCRIPT SMALL LETTER J..MODIFIER LETTER CAPITAL V +2CEF..2CF1 ; Case_Ignorable # Mn [3] COPTIC COMBINING NI ABOVE..COPTIC COMBINING SPIRITUS LENIS +2D6F ; Case_Ignorable # Lm TIFINAGH MODIFIER LETTER LABIALIZATION MARK +2D7F ; Case_Ignorable # Mn TIFINAGH CONSONANT JOINER +2DE0..2DFF ; Case_Ignorable # Mn [32] COMBINING CYRILLIC LETTER BE..COMBINING CYRILLIC LETTER IOTIFIED BIG YUS +2E2F ; Case_Ignorable # Lm VERTICAL TILDE +3005 ; Case_Ignorable # Lm IDEOGRAPHIC ITERATION MARK +302A..302D ; Case_Ignorable # Mn [4] IDEOGRAPHIC LEVEL TONE MARK..IDEOGRAPHIC ENTERING TONE MARK +3031..3035 ; Case_Ignorable # Lm [5] VERTICAL KANA REPEAT MARK..VERTICAL KANA REPEAT MARK LOWER HALF +303B ; Case_Ignorable # Lm VERTICAL IDEOGRAPHIC ITERATION MARK +3099..309A ; Case_Ignorable # Mn [2] COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK..COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK +309B..309C ; Case_Ignorable # Sk [2] KATAKANA-HIRAGANA VOICED SOUND MARK..KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK +309D..309E ; Case_Ignorable # Lm [2] HIRAGANA ITERATION MARK..HIRAGANA VOICED ITERATION MARK +30FC..30FE ; Case_Ignorable # Lm [3] KATAKANA-HIRAGANA PROLONGED SOUND MARK..KATAKANA VOICED ITERATION MARK +A015 ; Case_Ignorable # Lm YI SYLLABLE WU +A4F8..A4FD ; Case_Ignorable # Lm [6] LISU LETTER TONE MYA TI..LISU LETTER TONE MYA JEU +A60C ; Case_Ignorable # Lm VAI SYLLABLE LENGTHENER +A66F ; Case_Ignorable # Mn COMBINING CYRILLIC VZMET +A670..A672 ; Case_Ignorable # Me [3] COMBINING CYRILLIC TEN MILLIONS SIGN..COMBINING CYRILLIC THOUSAND MILLIONS SIGN +A674..A67D ; Case_Ignorable # Mn [10] COMBINING CYRILLIC LETTER UKRAINIAN IE..COMBINING CYRILLIC PAYEROK +A67F ; Case_Ignorable # Lm CYRILLIC PAYEROK +A69C..A69D ; Case_Ignorable # Lm [2] MODIFIER LETTER CYRILLIC HARD SIGN..MODIFIER LETTER CYRILLIC SOFT SIGN +A69E..A69F ; Case_Ignorable # Mn [2] COMBINING CYRILLIC LETTER EF..COMBINING CYRILLIC LETTER IOTIFIED E +A6F0..A6F1 ; Case_Ignorable # Mn [2] BAMUM COMBINING MARK KOQNDON..BAMUM COMBINING MARK TUKWENTIS +A700..A716 ; Case_Ignorable # Sk [23] MODIFIER LETTER CHINESE TONE YIN PING..MODIFIER LETTER EXTRA-LOW LEFT-STEM TONE BAR +A717..A71F ; Case_Ignorable # Lm [9] MODIFIER LETTER DOT VERTICAL BAR..MODIFIER LETTER LOW INVERTED EXCLAMATION MARK +A720..A721 ; Case_Ignorable # Sk [2] MODIFIER LETTER STRESS AND HIGH TONE..MODIFIER LETTER STRESS AND LOW TONE +A770 ; Case_Ignorable # Lm MODIFIER LETTER US +A788 ; Case_Ignorable # Lm MODIFIER LETTER LOW CIRCUMFLEX ACCENT +A789..A78A ; Case_Ignorable # Sk [2] MODIFIER LETTER COLON..MODIFIER LETTER SHORT EQUALS SIGN +A7F8..A7F9 ; Case_Ignorable # Lm [2] MODIFIER LETTER CAPITAL H WITH STROKE..MODIFIER LETTER SMALL LIGATURE OE +A802 ; Case_Ignorable # Mn SYLOTI NAGRI SIGN DVISVARA +A806 ; Case_Ignorable # Mn SYLOTI NAGRI SIGN HASANTA +A80B ; Case_Ignorable # Mn SYLOTI NAGRI SIGN ANUSVARA +A825..A826 ; Case_Ignorable # Mn [2] SYLOTI NAGRI VOWEL SIGN U..SYLOTI NAGRI VOWEL SIGN E +A8C4..A8C5 ; Case_Ignorable # Mn [2] SAURASHTRA SIGN VIRAMA..SAURASHTRA SIGN CANDRABINDU +A8E0..A8F1 ; Case_Ignorable # Mn [18] COMBINING DEVANAGARI DIGIT ZERO..COMBINING DEVANAGARI SIGN AVAGRAHA +A8FF ; Case_Ignorable # Mn DEVANAGARI VOWEL SIGN AY +A926..A92D ; Case_Ignorable # Mn [8] KAYAH LI VOWEL UE..KAYAH LI TONE CALYA PLOPHU +A947..A951 ; Case_Ignorable # Mn [11] REJANG VOWEL SIGN I..REJANG CONSONANT SIGN R +A980..A982 ; Case_Ignorable # Mn [3] JAVANESE SIGN PANYANGGA..JAVANESE SIGN LAYAR +A9B3 ; Case_Ignorable # Mn JAVANESE SIGN CECAK TELU +A9B6..A9B9 ; Case_Ignorable # Mn [4] JAVANESE VOWEL SIGN WULU..JAVANESE VOWEL SIGN SUKU MENDUT +A9BC ; Case_Ignorable # Mn JAVANESE VOWEL SIGN PEPET +A9CF ; Case_Ignorable # Lm JAVANESE PANGRANGKEP +A9E5 ; Case_Ignorable # Mn MYANMAR SIGN SHAN SAW +A9E6 ; Case_Ignorable # Lm MYANMAR MODIFIER LETTER SHAN REDUPLICATION +AA29..AA2E ; Case_Ignorable # Mn [6] CHAM VOWEL SIGN AA..CHAM VOWEL SIGN OE +AA31..AA32 ; Case_Ignorable # Mn [2] CHAM VOWEL SIGN AU..CHAM VOWEL SIGN UE +AA35..AA36 ; Case_Ignorable # Mn [2] CHAM CONSONANT SIGN LA..CHAM CONSONANT SIGN WA +AA43 ; Case_Ignorable # Mn CHAM CONSONANT SIGN FINAL NG +AA4C ; Case_Ignorable # Mn CHAM CONSONANT SIGN FINAL M +AA70 ; Case_Ignorable # Lm MYANMAR MODIFIER LETTER KHAMTI REDUPLICATION +AA7C ; Case_Ignorable # Mn MYANMAR SIGN TAI LAING TONE-2 +AAB0 ; Case_Ignorable # Mn TAI VIET MAI KANG +AAB2..AAB4 ; Case_Ignorable # Mn [3] TAI VIET VOWEL I..TAI VIET VOWEL U +AAB7..AAB8 ; Case_Ignorable # Mn [2] TAI VIET MAI KHIT..TAI VIET VOWEL IA +AABE..AABF ; Case_Ignorable # Mn [2] TAI VIET VOWEL AM..TAI VIET TONE MAI EK +AAC1 ; Case_Ignorable # Mn TAI VIET TONE MAI THO +AADD ; Case_Ignorable # Lm TAI VIET SYMBOL SAM +AAEC..AAED ; Case_Ignorable # Mn [2] MEETEI MAYEK VOWEL SIGN UU..MEETEI MAYEK VOWEL SIGN AAI +AAF3..AAF4 ; Case_Ignorable # Lm [2] MEETEI MAYEK SYLLABLE REPETITION MARK..MEETEI MAYEK WORD REPETITION MARK +AAF6 ; Case_Ignorable # Mn MEETEI MAYEK VIRAMA +AB5B ; Case_Ignorable # Sk MODIFIER BREVE WITH INVERTED BREVE +AB5C..AB5F ; Case_Ignorable # Lm [4] MODIFIER LETTER SMALL HENG..MODIFIER LETTER SMALL U WITH LEFT HOOK +ABE5 ; Case_Ignorable # Mn MEETEI MAYEK VOWEL SIGN ANAP +ABE8 ; Case_Ignorable # Mn MEETEI MAYEK VOWEL SIGN UNAP +ABED ; Case_Ignorable # Mn MEETEI MAYEK APUN IYEK +FB1E ; Case_Ignorable # Mn HEBREW POINT JUDEO-SPANISH VARIKA +FBB2..FBC1 ; Case_Ignorable # Sk [16] ARABIC SYMBOL DOT ABOVE..ARABIC SYMBOL SMALL TAH BELOW +FE00..FE0F ; Case_Ignorable # Mn [16] VARIATION SELECTOR-1..VARIATION SELECTOR-16 +FE13 ; Case_Ignorable # Po PRESENTATION FORM FOR VERTICAL COLON +FE20..FE2F ; Case_Ignorable # Mn [16] COMBINING LIGATURE LEFT HALF..COMBINING CYRILLIC TITLO RIGHT HALF +FE52 ; Case_Ignorable # Po SMALL FULL STOP +FE55 ; Case_Ignorable # Po SMALL COLON +FEFF ; Case_Ignorable # Cf ZERO WIDTH NO-BREAK SPACE +FF07 ; Case_Ignorable # Po FULLWIDTH APOSTROPHE +FF0E ; Case_Ignorable # Po FULLWIDTH FULL STOP +FF1A ; Case_Ignorable # Po FULLWIDTH COLON +FF3E ; Case_Ignorable # Sk FULLWIDTH CIRCUMFLEX ACCENT +FF40 ; Case_Ignorable # Sk FULLWIDTH GRAVE ACCENT +FF70 ; Case_Ignorable # Lm HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK +FF9E..FF9F ; Case_Ignorable # Lm [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK +FFE3 ; Case_Ignorable # Sk FULLWIDTH MACRON +FFF9..FFFB ; Case_Ignorable # Cf [3] INTERLINEAR ANNOTATION ANCHOR..INTERLINEAR ANNOTATION TERMINATOR +101FD ; Case_Ignorable # Mn PHAISTOS DISC SIGN COMBINING OBLIQUE STROKE +102E0 ; Case_Ignorable # Mn COPTIC EPACT THOUSANDS MARK +10376..1037A ; Case_Ignorable # Mn [5] COMBINING OLD PERMIC LETTER AN..COMBINING OLD PERMIC LETTER SII +10A01..10A03 ; Case_Ignorable # Mn [3] KHAROSHTHI VOWEL SIGN I..KHAROSHTHI VOWEL SIGN VOCALIC R +10A05..10A06 ; Case_Ignorable # Mn [2] KHAROSHTHI VOWEL SIGN E..KHAROSHTHI VOWEL SIGN O +10A0C..10A0F ; Case_Ignorable # Mn [4] KHAROSHTHI VOWEL LENGTH MARK..KHAROSHTHI SIGN VISARGA +10A38..10A3A ; Case_Ignorable # Mn [3] KHAROSHTHI SIGN BAR ABOVE..KHAROSHTHI SIGN DOT BELOW +10A3F ; Case_Ignorable # Mn KHAROSHTHI VIRAMA +10AE5..10AE6 ; Case_Ignorable # Mn [2] MANICHAEAN ABBREVIATION MARK ABOVE..MANICHAEAN ABBREVIATION MARK BELOW +10D24..10D27 ; Case_Ignorable # Mn [4] HANIFI ROHINGYA SIGN HARBAHAY..HANIFI ROHINGYA SIGN TASSI +10F46..10F50 ; Case_Ignorable # Mn [11] SOGDIAN COMBINING DOT BELOW..SOGDIAN COMBINING STROKE BELOW +11001 ; Case_Ignorable # Mn BRAHMI SIGN ANUSVARA +11038..11046 ; Case_Ignorable # Mn [15] BRAHMI VOWEL SIGN AA..BRAHMI VIRAMA +1107F..11081 ; Case_Ignorable # Mn [3] BRAHMI NUMBER JOINER..KAITHI SIGN ANUSVARA +110B3..110B6 ; Case_Ignorable # Mn [4] KAITHI VOWEL SIGN U..KAITHI VOWEL SIGN AI +110B9..110BA ; Case_Ignorable # Mn [2] KAITHI SIGN VIRAMA..KAITHI SIGN NUKTA +110BD ; Case_Ignorable # Cf KAITHI NUMBER SIGN +110CD ; Case_Ignorable # Cf KAITHI NUMBER SIGN ABOVE +11100..11102 ; Case_Ignorable # Mn [3] CHAKMA SIGN CANDRABINDU..CHAKMA SIGN VISARGA +11127..1112B ; Case_Ignorable # Mn [5] CHAKMA VOWEL SIGN A..CHAKMA VOWEL SIGN UU +1112D..11134 ; Case_Ignorable # Mn [8] CHAKMA VOWEL SIGN AI..CHAKMA MAAYYAA +11173 ; Case_Ignorable # Mn MAHAJANI SIGN NUKTA +11180..11181 ; Case_Ignorable # Mn [2] SHARADA SIGN CANDRABINDU..SHARADA SIGN ANUSVARA +111B6..111BE ; Case_Ignorable # Mn [9] SHARADA VOWEL SIGN U..SHARADA VOWEL SIGN O +111C9..111CC ; Case_Ignorable # Mn [4] SHARADA SANDHI MARK..SHARADA EXTRA SHORT VOWEL MARK +1122F..11231 ; Case_Ignorable # Mn [3] KHOJKI VOWEL SIGN U..KHOJKI VOWEL SIGN AI +11234 ; Case_Ignorable # Mn KHOJKI SIGN ANUSVARA +11236..11237 ; Case_Ignorable # Mn [2] KHOJKI SIGN NUKTA..KHOJKI SIGN SHADDA +1123E ; Case_Ignorable # Mn KHOJKI SIGN SUKUN +112DF ; Case_Ignorable # Mn KHUDAWADI SIGN ANUSVARA +112E3..112EA ; Case_Ignorable # Mn [8] KHUDAWADI VOWEL SIGN U..KHUDAWADI SIGN VIRAMA +11300..11301 ; Case_Ignorable # Mn [2] GRANTHA SIGN COMBINING ANUSVARA ABOVE..GRANTHA SIGN CANDRABINDU +1133B..1133C ; Case_Ignorable # Mn [2] COMBINING BINDU BELOW..GRANTHA SIGN NUKTA +11340 ; Case_Ignorable # Mn GRANTHA VOWEL SIGN II +11366..1136C ; Case_Ignorable # Mn [7] COMBINING GRANTHA DIGIT ZERO..COMBINING GRANTHA DIGIT SIX +11370..11374 ; Case_Ignorable # Mn [5] COMBINING GRANTHA LETTER A..COMBINING GRANTHA LETTER PA +11438..1143F ; Case_Ignorable # Mn [8] NEWA VOWEL SIGN U..NEWA VOWEL SIGN AI +11442..11444 ; Case_Ignorable # Mn [3] NEWA SIGN VIRAMA..NEWA SIGN ANUSVARA +11446 ; Case_Ignorable # Mn NEWA SIGN NUKTA +1145E ; Case_Ignorable # Mn NEWA SANDHI MARK +114B3..114B8 ; Case_Ignorable # Mn [6] TIRHUTA VOWEL SIGN U..TIRHUTA VOWEL SIGN VOCALIC LL +114BA ; Case_Ignorable # Mn TIRHUTA VOWEL SIGN SHORT E +114BF..114C0 ; Case_Ignorable # Mn [2] TIRHUTA SIGN CANDRABINDU..TIRHUTA SIGN ANUSVARA +114C2..114C3 ; Case_Ignorable # Mn [2] TIRHUTA SIGN VIRAMA..TIRHUTA SIGN NUKTA +115B2..115B5 ; Case_Ignorable # Mn [4] SIDDHAM VOWEL SIGN U..SIDDHAM VOWEL SIGN VOCALIC RR +115BC..115BD ; Case_Ignorable # Mn [2] SIDDHAM SIGN CANDRABINDU..SIDDHAM SIGN ANUSVARA +115BF..115C0 ; Case_Ignorable # Mn [2] SIDDHAM SIGN VIRAMA..SIDDHAM SIGN NUKTA +115DC..115DD ; Case_Ignorable # Mn [2] SIDDHAM VOWEL SIGN ALTERNATE U..SIDDHAM VOWEL SIGN ALTERNATE UU +11633..1163A ; Case_Ignorable # Mn [8] MODI VOWEL SIGN U..MODI VOWEL SIGN AI +1163D ; Case_Ignorable # Mn MODI SIGN ANUSVARA +1163F..11640 ; Case_Ignorable # Mn [2] MODI SIGN VIRAMA..MODI SIGN ARDHACANDRA +116AB ; Case_Ignorable # Mn TAKRI SIGN ANUSVARA +116AD ; Case_Ignorable # Mn TAKRI VOWEL SIGN AA +116B0..116B5 ; Case_Ignorable # Mn [6] TAKRI VOWEL SIGN U..TAKRI VOWEL SIGN AU +116B7 ; Case_Ignorable # Mn TAKRI SIGN NUKTA +1171D..1171F ; Case_Ignorable # Mn [3] AHOM CONSONANT SIGN MEDIAL LA..AHOM CONSONANT SIGN MEDIAL LIGATING RA +11722..11725 ; Case_Ignorable # Mn [4] AHOM VOWEL SIGN I..AHOM VOWEL SIGN UU +11727..1172B ; Case_Ignorable # Mn [5] AHOM VOWEL SIGN AW..AHOM SIGN KILLER +1182F..11837 ; Case_Ignorable # Mn [9] DOGRA VOWEL SIGN U..DOGRA SIGN ANUSVARA +11839..1183A ; Case_Ignorable # Mn [2] DOGRA SIGN VIRAMA..DOGRA SIGN NUKTA +11A01..11A0A ; Case_Ignorable # Mn [10] ZANABAZAR SQUARE VOWEL SIGN I..ZANABAZAR SQUARE VOWEL LENGTH MARK +11A33..11A38 ; Case_Ignorable # Mn [6] ZANABAZAR SQUARE FINAL CONSONANT MARK..ZANABAZAR SQUARE SIGN ANUSVARA +11A3B..11A3E ; Case_Ignorable # Mn [4] ZANABAZAR SQUARE CLUSTER-FINAL LETTER YA..ZANABAZAR SQUARE CLUSTER-FINAL LETTER VA +11A47 ; Case_Ignorable # Mn ZANABAZAR SQUARE SUBJOINER +11A51..11A56 ; Case_Ignorable # Mn [6] SOYOMBO VOWEL SIGN I..SOYOMBO VOWEL SIGN OE +11A59..11A5B ; Case_Ignorable # Mn [3] SOYOMBO VOWEL SIGN VOCALIC R..SOYOMBO VOWEL LENGTH MARK +11A8A..11A96 ; Case_Ignorable # Mn [13] SOYOMBO FINAL CONSONANT SIGN G..SOYOMBO SIGN ANUSVARA +11A98..11A99 ; Case_Ignorable # Mn [2] SOYOMBO GEMINATION MARK..SOYOMBO SUBJOINER +11C30..11C36 ; Case_Ignorable # Mn [7] BHAIKSUKI VOWEL SIGN I..BHAIKSUKI VOWEL SIGN VOCALIC L +11C38..11C3D ; Case_Ignorable # Mn [6] BHAIKSUKI VOWEL SIGN E..BHAIKSUKI SIGN ANUSVARA +11C3F ; Case_Ignorable # Mn BHAIKSUKI SIGN VIRAMA +11C92..11CA7 ; Case_Ignorable # Mn [22] MARCHEN SUBJOINED LETTER KA..MARCHEN SUBJOINED LETTER ZA +11CAA..11CB0 ; Case_Ignorable # Mn [7] MARCHEN SUBJOINED LETTER RA..MARCHEN VOWEL SIGN AA +11CB2..11CB3 ; Case_Ignorable # Mn [2] MARCHEN VOWEL SIGN U..MARCHEN VOWEL SIGN E +11CB5..11CB6 ; Case_Ignorable # Mn [2] MARCHEN SIGN ANUSVARA..MARCHEN SIGN CANDRABINDU +11D31..11D36 ; Case_Ignorable # Mn [6] MASARAM GONDI VOWEL SIGN AA..MASARAM GONDI VOWEL SIGN VOCALIC R +11D3A ; Case_Ignorable # Mn MASARAM GONDI VOWEL SIGN E +11D3C..11D3D ; Case_Ignorable # Mn [2] MASARAM GONDI VOWEL SIGN AI..MASARAM GONDI VOWEL SIGN O +11D3F..11D45 ; Case_Ignorable # Mn [7] MASARAM GONDI VOWEL SIGN AU..MASARAM GONDI VIRAMA +11D47 ; Case_Ignorable # Mn MASARAM GONDI RA-KARA +11D90..11D91 ; Case_Ignorable # Mn [2] GUNJALA GONDI VOWEL SIGN EE..GUNJALA GONDI VOWEL SIGN AI +11D95 ; Case_Ignorable # Mn GUNJALA GONDI SIGN ANUSVARA +11D97 ; Case_Ignorable # Mn GUNJALA GONDI VIRAMA +11EF3..11EF4 ; Case_Ignorable # Mn [2] MAKASAR VOWEL SIGN I..MAKASAR VOWEL SIGN U +16AF0..16AF4 ; Case_Ignorable # Mn [5] BASSA VAH COMBINING HIGH TONE..BASSA VAH COMBINING HIGH-LOW TONE +16B30..16B36 ; Case_Ignorable # Mn [7] PAHAWH HMONG MARK CIM TUB..PAHAWH HMONG MARK CIM TAUM +16B40..16B43 ; Case_Ignorable # Lm [4] PAHAWH HMONG SIGN VOS SEEV..PAHAWH HMONG SIGN IB YAM +16F8F..16F92 ; Case_Ignorable # Mn [4] MIAO TONE RIGHT..MIAO TONE BELOW +16F93..16F9F ; Case_Ignorable # Lm [13] MIAO LETTER TONE-2..MIAO LETTER REFORMED TONE-8 +16FE0..16FE1 ; Case_Ignorable # Lm [2] TANGUT ITERATION MARK..NUSHU ITERATION MARK +1BC9D..1BC9E ; Case_Ignorable # Mn [2] DUPLOYAN THICK LETTER SELECTOR..DUPLOYAN DOUBLE MARK +1BCA0..1BCA3 ; Case_Ignorable # Cf [4] SHORTHAND FORMAT LETTER OVERLAP..SHORTHAND FORMAT UP STEP +1D167..1D169 ; Case_Ignorable # Mn [3] MUSICAL SYMBOL COMBINING TREMOLO-1..MUSICAL SYMBOL COMBINING TREMOLO-3 +1D173..1D17A ; Case_Ignorable # Cf [8] MUSICAL SYMBOL BEGIN BEAM..MUSICAL SYMBOL END PHRASE +1D17B..1D182 ; Case_Ignorable # Mn [8] MUSICAL SYMBOL COMBINING ACCENT..MUSICAL SYMBOL COMBINING LOURE +1D185..1D18B ; Case_Ignorable # Mn [7] MUSICAL SYMBOL COMBINING DOIT..MUSICAL SYMBOL COMBINING TRIPLE TONGUE +1D1AA..1D1AD ; Case_Ignorable # Mn [4] MUSICAL SYMBOL COMBINING DOWN BOW..MUSICAL SYMBOL COMBINING SNAP PIZZICATO +1D242..1D244 ; Case_Ignorable # Mn [3] COMBINING GREEK MUSICAL TRISEME..COMBINING GREEK MUSICAL PENTASEME +1DA00..1DA36 ; Case_Ignorable # Mn [55] SIGNWRITING HEAD RIM..SIGNWRITING AIR SUCKING IN +1DA3B..1DA6C ; Case_Ignorable # Mn [50] SIGNWRITING MOUTH CLOSED NEUTRAL..SIGNWRITING EXCITEMENT +1DA75 ; Case_Ignorable # Mn SIGNWRITING UPPER BODY TILTING FROM HIP JOINTS +1DA84 ; Case_Ignorable # Mn SIGNWRITING LOCATION HEAD NECK +1DA9B..1DA9F ; Case_Ignorable # Mn [5] SIGNWRITING FILL MODIFIER-2..SIGNWRITING FILL MODIFIER-6 +1DAA1..1DAAF ; Case_Ignorable # Mn [15] SIGNWRITING ROTATION MODIFIER-2..SIGNWRITING ROTATION MODIFIER-16 +1E000..1E006 ; Case_Ignorable # Mn [7] COMBINING GLAGOLITIC LETTER AZU..COMBINING GLAGOLITIC LETTER ZHIVETE +1E008..1E018 ; Case_Ignorable # Mn [17] COMBINING GLAGOLITIC LETTER ZEMLJA..COMBINING GLAGOLITIC LETTER HERU +1E01B..1E021 ; Case_Ignorable # Mn [7] COMBINING GLAGOLITIC LETTER SHTA..COMBINING GLAGOLITIC LETTER YATI +1E023..1E024 ; Case_Ignorable # Mn [2] COMBINING GLAGOLITIC LETTER YU..COMBINING GLAGOLITIC LETTER SMALL YUS +1E026..1E02A ; Case_Ignorable # Mn [5] COMBINING GLAGOLITIC LETTER YO..COMBINING GLAGOLITIC LETTER FITA +1E8D0..1E8D6 ; Case_Ignorable # Mn [7] MENDE KIKAKUI COMBINING NUMBER TEENS..MENDE KIKAKUI COMBINING NUMBER MILLIONS +1E944..1E94A ; Case_Ignorable # Mn [7] ADLAM ALIF LENGTHENER..ADLAM NUKTA +1F3FB..1F3FF ; Case_Ignorable # Sk [5] EMOJI MODIFIER FITZPATRICK TYPE-1-2..EMOJI MODIFIER FITZPATRICK TYPE-6 +E0001 ; Case_Ignorable # Cf LANGUAGE TAG +E0020..E007F ; Case_Ignorable # Cf [96] TAG SPACE..CANCEL TAG +E0100..E01EF ; Case_Ignorable # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256 + +# Total code points: 2357 + +# ================================================ + +# Derived Property: Changes_When_Lowercased (CWL) +# Characters whose normalized forms are not stable under a toLowercase mapping. +# For more information, see D139 in Section 3.13, "Default Case Algorithms". +# Changes_When_Lowercased(X) is true when toLowercase(toNFD(X)) != toNFD(X) + +0041..005A ; Changes_When_Lowercased # L& [26] LATIN CAPITAL LETTER A..LATIN CAPITAL LETTER Z +00C0..00D6 ; Changes_When_Lowercased # L& [23] LATIN CAPITAL LETTER A WITH GRAVE..LATIN CAPITAL LETTER O WITH DIAERESIS +00D8..00DE ; Changes_When_Lowercased # L& [7] LATIN CAPITAL LETTER O WITH STROKE..LATIN CAPITAL LETTER THORN +0100 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER A WITH MACRON +0102 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER A WITH BREVE +0104 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER A WITH OGONEK +0106 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER C WITH ACUTE +0108 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER C WITH CIRCUMFLEX +010A ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER C WITH DOT ABOVE +010C ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER C WITH CARON +010E ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER D WITH CARON +0110 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER D WITH STROKE +0112 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER E WITH MACRON +0114 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER E WITH BREVE +0116 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER E WITH DOT ABOVE +0118 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER E WITH OGONEK +011A ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER E WITH CARON +011C ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER G WITH CIRCUMFLEX +011E ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER G WITH BREVE +0120 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER G WITH DOT ABOVE +0122 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER G WITH CEDILLA +0124 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER H WITH CIRCUMFLEX +0126 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER H WITH STROKE +0128 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER I WITH TILDE +012A ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER I WITH MACRON +012C ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER I WITH BREVE +012E ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER I WITH OGONEK +0130 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER I WITH DOT ABOVE +0132 ; Changes_When_Lowercased # L& LATIN CAPITAL LIGATURE IJ +0134 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER J WITH CIRCUMFLEX +0136 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER K WITH CEDILLA +0139 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER L WITH ACUTE +013B ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER L WITH CEDILLA +013D ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER L WITH CARON +013F ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER L WITH MIDDLE DOT +0141 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER L WITH STROKE +0143 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER N WITH ACUTE +0145 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER N WITH CEDILLA +0147 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER N WITH CARON +014A ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER ENG +014C ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER O WITH MACRON +014E ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER O WITH BREVE +0150 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER O WITH DOUBLE ACUTE +0152 ; Changes_When_Lowercased # L& LATIN CAPITAL LIGATURE OE +0154 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER R WITH ACUTE +0156 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER R WITH CEDILLA +0158 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER R WITH CARON +015A ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER S WITH ACUTE +015C ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER S WITH CIRCUMFLEX +015E ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER S WITH CEDILLA +0160 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER S WITH CARON +0162 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER T WITH CEDILLA +0164 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER T WITH CARON +0166 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER T WITH STROKE +0168 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER U WITH TILDE +016A ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER U WITH MACRON +016C ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER U WITH BREVE +016E ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER U WITH RING ABOVE +0170 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER U WITH DOUBLE ACUTE +0172 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER U WITH OGONEK +0174 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER W WITH CIRCUMFLEX +0176 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER Y WITH CIRCUMFLEX +0178..0179 ; Changes_When_Lowercased # L& [2] LATIN CAPITAL LETTER Y WITH DIAERESIS..LATIN CAPITAL LETTER Z WITH ACUTE +017B ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER Z WITH DOT ABOVE +017D ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER Z WITH CARON +0181..0182 ; Changes_When_Lowercased # L& [2] LATIN CAPITAL LETTER B WITH HOOK..LATIN CAPITAL LETTER B WITH TOPBAR +0184 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER TONE SIX +0186..0187 ; Changes_When_Lowercased # L& [2] LATIN CAPITAL LETTER OPEN O..LATIN CAPITAL LETTER C WITH HOOK +0189..018B ; Changes_When_Lowercased # L& [3] LATIN CAPITAL LETTER AFRICAN D..LATIN CAPITAL LETTER D WITH TOPBAR +018E..0191 ; Changes_When_Lowercased # L& [4] LATIN CAPITAL LETTER REVERSED E..LATIN CAPITAL LETTER F WITH HOOK +0193..0194 ; Changes_When_Lowercased # L& [2] LATIN CAPITAL LETTER G WITH HOOK..LATIN CAPITAL LETTER GAMMA +0196..0198 ; Changes_When_Lowercased # L& [3] LATIN CAPITAL LETTER IOTA..LATIN CAPITAL LETTER K WITH HOOK +019C..019D ; Changes_When_Lowercased # L& [2] LATIN CAPITAL LETTER TURNED M..LATIN CAPITAL LETTER N WITH LEFT HOOK +019F..01A0 ; Changes_When_Lowercased # L& [2] LATIN CAPITAL LETTER O WITH MIDDLE TILDE..LATIN CAPITAL LETTER O WITH HORN +01A2 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER OI +01A4 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER P WITH HOOK +01A6..01A7 ; Changes_When_Lowercased # L& [2] LATIN LETTER YR..LATIN CAPITAL LETTER TONE TWO +01A9 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER ESH +01AC ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER T WITH HOOK +01AE..01AF ; Changes_When_Lowercased # L& [2] LATIN CAPITAL LETTER T WITH RETROFLEX HOOK..LATIN CAPITAL LETTER U WITH HORN +01B1..01B3 ; Changes_When_Lowercased # L& [3] LATIN CAPITAL LETTER UPSILON..LATIN CAPITAL LETTER Y WITH HOOK +01B5 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER Z WITH STROKE +01B7..01B8 ; Changes_When_Lowercased # L& [2] LATIN CAPITAL LETTER EZH..LATIN CAPITAL LETTER EZH REVERSED +01BC ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER TONE FIVE +01C4..01C5 ; Changes_When_Lowercased # L& [2] LATIN CAPITAL LETTER DZ WITH CARON..LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON +01C7..01C8 ; Changes_When_Lowercased # L& [2] LATIN CAPITAL LETTER LJ..LATIN CAPITAL LETTER L WITH SMALL LETTER J +01CA..01CB ; Changes_When_Lowercased # L& [2] LATIN CAPITAL LETTER NJ..LATIN CAPITAL LETTER N WITH SMALL LETTER J +01CD ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER A WITH CARON +01CF ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER I WITH CARON +01D1 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER O WITH CARON +01D3 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER U WITH CARON +01D5 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON +01D7 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE +01D9 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON +01DB ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE +01DE ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON +01E0 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON +01E2 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER AE WITH MACRON +01E4 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER G WITH STROKE +01E6 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER G WITH CARON +01E8 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER K WITH CARON +01EA ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER O WITH OGONEK +01EC ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER O WITH OGONEK AND MACRON +01EE ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER EZH WITH CARON +01F1..01F2 ; Changes_When_Lowercased # L& [2] LATIN CAPITAL LETTER DZ..LATIN CAPITAL LETTER D WITH SMALL LETTER Z +01F4 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER G WITH ACUTE +01F6..01F8 ; Changes_When_Lowercased # L& [3] LATIN CAPITAL LETTER HWAIR..LATIN CAPITAL LETTER N WITH GRAVE +01FA ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE +01FC ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER AE WITH ACUTE +01FE ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER O WITH STROKE AND ACUTE +0200 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER A WITH DOUBLE GRAVE +0202 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER A WITH INVERTED BREVE +0204 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER E WITH DOUBLE GRAVE +0206 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER E WITH INVERTED BREVE +0208 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER I WITH DOUBLE GRAVE +020A ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER I WITH INVERTED BREVE +020C ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER O WITH DOUBLE GRAVE +020E ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER O WITH INVERTED BREVE +0210 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER R WITH DOUBLE GRAVE +0212 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER R WITH INVERTED BREVE +0214 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER U WITH DOUBLE GRAVE +0216 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER U WITH INVERTED BREVE +0218 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER S WITH COMMA BELOW +021A ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER T WITH COMMA BELOW +021C ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER YOGH +021E ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER H WITH CARON +0220 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER N WITH LONG RIGHT LEG +0222 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER OU +0224 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER Z WITH HOOK +0226 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER A WITH DOT ABOVE +0228 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER E WITH CEDILLA +022A ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON +022C ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER O WITH TILDE AND MACRON +022E ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER O WITH DOT ABOVE +0230 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON +0232 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER Y WITH MACRON +023A..023B ; Changes_When_Lowercased # L& [2] LATIN CAPITAL LETTER A WITH STROKE..LATIN CAPITAL LETTER C WITH STROKE +023D..023E ; Changes_When_Lowercased # L& [2] LATIN CAPITAL LETTER L WITH BAR..LATIN CAPITAL LETTER T WITH DIAGONAL STROKE +0241 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER GLOTTAL STOP +0243..0246 ; Changes_When_Lowercased # L& [4] LATIN CAPITAL LETTER B WITH STROKE..LATIN CAPITAL LETTER E WITH STROKE +0248 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER J WITH STROKE +024A ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER SMALL Q WITH HOOK TAIL +024C ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER R WITH STROKE +024E ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER Y WITH STROKE +0370 ; Changes_When_Lowercased # L& GREEK CAPITAL LETTER HETA +0372 ; Changes_When_Lowercased # L& GREEK CAPITAL LETTER ARCHAIC SAMPI +0376 ; Changes_When_Lowercased # L& GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA +037F ; Changes_When_Lowercased # L& GREEK CAPITAL LETTER YOT +0386 ; Changes_When_Lowercased # L& GREEK CAPITAL LETTER ALPHA WITH TONOS +0388..038A ; Changes_When_Lowercased # L& [3] GREEK CAPITAL LETTER EPSILON WITH TONOS..GREEK CAPITAL LETTER IOTA WITH TONOS +038C ; Changes_When_Lowercased # L& GREEK CAPITAL LETTER OMICRON WITH TONOS +038E..038F ; Changes_When_Lowercased # L& [2] GREEK CAPITAL LETTER UPSILON WITH TONOS..GREEK CAPITAL LETTER OMEGA WITH TONOS +0391..03A1 ; Changes_When_Lowercased # L& [17] GREEK CAPITAL LETTER ALPHA..GREEK CAPITAL LETTER RHO +03A3..03AB ; Changes_When_Lowercased # L& [9] GREEK CAPITAL LETTER SIGMA..GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA +03CF ; Changes_When_Lowercased # L& GREEK CAPITAL KAI SYMBOL +03D8 ; Changes_When_Lowercased # L& GREEK LETTER ARCHAIC KOPPA +03DA ; Changes_When_Lowercased # L& GREEK LETTER STIGMA +03DC ; Changes_When_Lowercased # L& GREEK LETTER DIGAMMA +03DE ; Changes_When_Lowercased # L& GREEK LETTER KOPPA +03E0 ; Changes_When_Lowercased # L& GREEK LETTER SAMPI +03E2 ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER SHEI +03E4 ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER FEI +03E6 ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER KHEI +03E8 ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER HORI +03EA ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER GANGIA +03EC ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER SHIMA +03EE ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER DEI +03F4 ; Changes_When_Lowercased # L& GREEK CAPITAL THETA SYMBOL +03F7 ; Changes_When_Lowercased # L& GREEK CAPITAL LETTER SHO +03F9..03FA ; Changes_When_Lowercased # L& [2] GREEK CAPITAL LUNATE SIGMA SYMBOL..GREEK CAPITAL LETTER SAN +03FD..042F ; Changes_When_Lowercased # L& [51] GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL..CYRILLIC CAPITAL LETTER YA +0460 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER OMEGA +0462 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER YAT +0464 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER IOTIFIED E +0466 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER LITTLE YUS +0468 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS +046A ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER BIG YUS +046C ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS +046E ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER KSI +0470 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER PSI +0472 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER FITA +0474 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER IZHITSA +0476 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT +0478 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER UK +047A ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER ROUND OMEGA +047C ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER OMEGA WITH TITLO +047E ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER OT +0480 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER KOPPA +048A ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER SHORT I WITH TAIL +048C ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER SEMISOFT SIGN +048E ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER ER WITH TICK +0490 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER GHE WITH UPTURN +0492 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER GHE WITH STROKE +0494 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK +0496 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER +0498 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER ZE WITH DESCENDER +049A ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER KA WITH DESCENDER +049C ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE +049E ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER KA WITH STROKE +04A0 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER BASHKIR KA +04A2 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER EN WITH DESCENDER +04A4 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LIGATURE EN GHE +04A6 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK +04A8 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER ABKHASIAN HA +04AA ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER ES WITH DESCENDER +04AC ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER TE WITH DESCENDER +04AE ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER STRAIGHT U +04B0 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE +04B2 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER HA WITH DESCENDER +04B4 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LIGATURE TE TSE +04B6 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER CHE WITH DESCENDER +04B8 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE +04BA ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER SHHA +04BC ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER ABKHASIAN CHE +04BE ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER +04C0..04C1 ; Changes_When_Lowercased # L& [2] CYRILLIC LETTER PALOCHKA..CYRILLIC CAPITAL LETTER ZHE WITH BREVE +04C3 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER KA WITH HOOK +04C5 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER EL WITH TAIL +04C7 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER EN WITH HOOK +04C9 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER EN WITH TAIL +04CB ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER KHAKASSIAN CHE +04CD ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER EM WITH TAIL +04D0 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER A WITH BREVE +04D2 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER A WITH DIAERESIS +04D4 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LIGATURE A IE +04D6 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER IE WITH BREVE +04D8 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER SCHWA +04DA ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS +04DC ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS +04DE ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS +04E0 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER ABKHASIAN DZE +04E2 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER I WITH MACRON +04E4 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER I WITH DIAERESIS +04E6 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER O WITH DIAERESIS +04E8 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER BARRED O +04EA ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS +04EC ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER E WITH DIAERESIS +04EE ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER U WITH MACRON +04F0 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER U WITH DIAERESIS +04F2 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE +04F4 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS +04F6 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER GHE WITH DESCENDER +04F8 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS +04FA ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER GHE WITH STROKE AND HOOK +04FC ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER HA WITH HOOK +04FE ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER HA WITH STROKE +0500 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER KOMI DE +0502 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER KOMI DJE +0504 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER KOMI ZJE +0506 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER KOMI DZJE +0508 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER KOMI LJE +050A ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER KOMI NJE +050C ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER KOMI SJE +050E ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER KOMI TJE +0510 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER REVERSED ZE +0512 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER EL WITH HOOK +0514 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER LHA +0516 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER RHA +0518 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER YAE +051A ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER QA +051C ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER WE +051E ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER ALEUT KA +0520 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER EL WITH MIDDLE HOOK +0522 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER EN WITH MIDDLE HOOK +0524 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER PE WITH DESCENDER +0526 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER SHHA WITH DESCENDER +0528 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER EN WITH LEFT HOOK +052A ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER DZZHE +052C ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER DCHE +052E ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER EL WITH DESCENDER +0531..0556 ; Changes_When_Lowercased # L& [38] ARMENIAN CAPITAL LETTER AYB..ARMENIAN CAPITAL LETTER FEH +10A0..10C5 ; Changes_When_Lowercased # L& [38] GEORGIAN CAPITAL LETTER AN..GEORGIAN CAPITAL LETTER HOE +10C7 ; Changes_When_Lowercased # L& GEORGIAN CAPITAL LETTER YN +10CD ; Changes_When_Lowercased # L& GEORGIAN CAPITAL LETTER AEN +13A0..13F5 ; Changes_When_Lowercased # L& [86] CHEROKEE LETTER A..CHEROKEE LETTER MV +1C90..1CBA ; Changes_When_Lowercased # L& [43] GEORGIAN MTAVRULI CAPITAL LETTER AN..GEORGIAN MTAVRULI CAPITAL LETTER AIN +1CBD..1CBF ; Changes_When_Lowercased # L& [3] GEORGIAN MTAVRULI CAPITAL LETTER AEN..GEORGIAN MTAVRULI CAPITAL LETTER LABIAL SIGN +1E00 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER A WITH RING BELOW +1E02 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER B WITH DOT ABOVE +1E04 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER B WITH DOT BELOW +1E06 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER B WITH LINE BELOW +1E08 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE +1E0A ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER D WITH DOT ABOVE +1E0C ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER D WITH DOT BELOW +1E0E ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER D WITH LINE BELOW +1E10 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER D WITH CEDILLA +1E12 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW +1E14 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER E WITH MACRON AND GRAVE +1E16 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER E WITH MACRON AND ACUTE +1E18 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW +1E1A ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER E WITH TILDE BELOW +1E1C ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE +1E1E ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER F WITH DOT ABOVE +1E20 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER G WITH MACRON +1E22 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER H WITH DOT ABOVE +1E24 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER H WITH DOT BELOW +1E26 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER H WITH DIAERESIS +1E28 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER H WITH CEDILLA +1E2A ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER H WITH BREVE BELOW +1E2C ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER I WITH TILDE BELOW +1E2E ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE +1E30 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER K WITH ACUTE +1E32 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER K WITH DOT BELOW +1E34 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER K WITH LINE BELOW +1E36 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER L WITH DOT BELOW +1E38 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON +1E3A ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER L WITH LINE BELOW +1E3C ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW +1E3E ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER M WITH ACUTE +1E40 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER M WITH DOT ABOVE +1E42 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER M WITH DOT BELOW +1E44 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER N WITH DOT ABOVE +1E46 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER N WITH DOT BELOW +1E48 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER N WITH LINE BELOW +1E4A ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW +1E4C ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER O WITH TILDE AND ACUTE +1E4E ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS +1E50 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER O WITH MACRON AND GRAVE +1E52 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER O WITH MACRON AND ACUTE +1E54 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER P WITH ACUTE +1E56 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER P WITH DOT ABOVE +1E58 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER R WITH DOT ABOVE +1E5A ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER R WITH DOT BELOW +1E5C ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON +1E5E ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER R WITH LINE BELOW +1E60 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER S WITH DOT ABOVE +1E62 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER S WITH DOT BELOW +1E64 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE +1E66 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE +1E68 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE +1E6A ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER T WITH DOT ABOVE +1E6C ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER T WITH DOT BELOW +1E6E ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER T WITH LINE BELOW +1E70 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW +1E72 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER U WITH DIAERESIS BELOW +1E74 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER U WITH TILDE BELOW +1E76 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW +1E78 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER U WITH TILDE AND ACUTE +1E7A ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS +1E7C ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER V WITH TILDE +1E7E ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER V WITH DOT BELOW +1E80 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER W WITH GRAVE +1E82 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER W WITH ACUTE +1E84 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER W WITH DIAERESIS +1E86 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER W WITH DOT ABOVE +1E88 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER W WITH DOT BELOW +1E8A ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER X WITH DOT ABOVE +1E8C ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER X WITH DIAERESIS +1E8E ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER Y WITH DOT ABOVE +1E90 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER Z WITH CIRCUMFLEX +1E92 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER Z WITH DOT BELOW +1E94 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER Z WITH LINE BELOW +1E9E ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER SHARP S +1EA0 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER A WITH DOT BELOW +1EA2 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER A WITH HOOK ABOVE +1EA4 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE +1EA6 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE +1EA8 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE +1EAA ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE +1EAC ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW +1EAE ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER A WITH BREVE AND ACUTE +1EB0 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER A WITH BREVE AND GRAVE +1EB2 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE +1EB4 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER A WITH BREVE AND TILDE +1EB6 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW +1EB8 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER E WITH DOT BELOW +1EBA ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER E WITH HOOK ABOVE +1EBC ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER E WITH TILDE +1EBE ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE +1EC0 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE +1EC2 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE +1EC4 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE +1EC6 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW +1EC8 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER I WITH HOOK ABOVE +1ECA ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER I WITH DOT BELOW +1ECC ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER O WITH DOT BELOW +1ECE ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER O WITH HOOK ABOVE +1ED0 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE +1ED2 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE +1ED4 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE +1ED6 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE +1ED8 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW +1EDA ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER O WITH HORN AND ACUTE +1EDC ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER O WITH HORN AND GRAVE +1EDE ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE +1EE0 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER O WITH HORN AND TILDE +1EE2 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW +1EE4 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER U WITH DOT BELOW +1EE6 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER U WITH HOOK ABOVE +1EE8 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER U WITH HORN AND ACUTE +1EEA ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER U WITH HORN AND GRAVE +1EEC ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE +1EEE ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER U WITH HORN AND TILDE +1EF0 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW +1EF2 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER Y WITH GRAVE +1EF4 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER Y WITH DOT BELOW +1EF6 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER Y WITH HOOK ABOVE +1EF8 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER Y WITH TILDE +1EFA ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER MIDDLE-WELSH LL +1EFC ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER MIDDLE-WELSH V +1EFE ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER Y WITH LOOP +1F08..1F0F ; Changes_When_Lowercased # L& [8] GREEK CAPITAL LETTER ALPHA WITH PSILI..GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI +1F18..1F1D ; Changes_When_Lowercased # L& [6] GREEK CAPITAL LETTER EPSILON WITH PSILI..GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA +1F28..1F2F ; Changes_When_Lowercased # L& [8] GREEK CAPITAL LETTER ETA WITH PSILI..GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI +1F38..1F3F ; Changes_When_Lowercased # L& [8] GREEK CAPITAL LETTER IOTA WITH PSILI..GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI +1F48..1F4D ; Changes_When_Lowercased # L& [6] GREEK CAPITAL LETTER OMICRON WITH PSILI..GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA +1F59 ; Changes_When_Lowercased # L& GREEK CAPITAL LETTER UPSILON WITH DASIA +1F5B ; Changes_When_Lowercased # L& GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA +1F5D ; Changes_When_Lowercased # L& GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA +1F5F ; Changes_When_Lowercased # L& GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI +1F68..1F6F ; Changes_When_Lowercased # L& [8] GREEK CAPITAL LETTER OMEGA WITH PSILI..GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI +1F88..1F8F ; Changes_When_Lowercased # L& [8] GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI..GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI +1F98..1F9F ; Changes_When_Lowercased # L& [8] GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI..GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI +1FA8..1FAF ; Changes_When_Lowercased # L& [8] GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI..GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI +1FB8..1FBC ; Changes_When_Lowercased # L& [5] GREEK CAPITAL LETTER ALPHA WITH VRACHY..GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI +1FC8..1FCC ; Changes_When_Lowercased # L& [5] GREEK CAPITAL LETTER EPSILON WITH VARIA..GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI +1FD8..1FDB ; Changes_When_Lowercased # L& [4] GREEK CAPITAL LETTER IOTA WITH VRACHY..GREEK CAPITAL LETTER IOTA WITH OXIA +1FE8..1FEC ; Changes_When_Lowercased # L& [5] GREEK CAPITAL LETTER UPSILON WITH VRACHY..GREEK CAPITAL LETTER RHO WITH DASIA +1FF8..1FFC ; Changes_When_Lowercased # L& [5] GREEK CAPITAL LETTER OMICRON WITH VARIA..GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI +2126 ; Changes_When_Lowercased # L& OHM SIGN +212A..212B ; Changes_When_Lowercased # L& [2] KELVIN SIGN..ANGSTROM SIGN +2132 ; Changes_When_Lowercased # L& TURNED CAPITAL F +2160..216F ; Changes_When_Lowercased # Nl [16] ROMAN NUMERAL ONE..ROMAN NUMERAL ONE THOUSAND +2183 ; Changes_When_Lowercased # L& ROMAN NUMERAL REVERSED ONE HUNDRED +24B6..24CF ; Changes_When_Lowercased # So [26] CIRCLED LATIN CAPITAL LETTER A..CIRCLED LATIN CAPITAL LETTER Z +2C00..2C2E ; Changes_When_Lowercased # L& [47] GLAGOLITIC CAPITAL LETTER AZU..GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE +2C60 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER L WITH DOUBLE BAR +2C62..2C64 ; Changes_When_Lowercased # L& [3] LATIN CAPITAL LETTER L WITH MIDDLE TILDE..LATIN CAPITAL LETTER R WITH TAIL +2C67 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER H WITH DESCENDER +2C69 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER K WITH DESCENDER +2C6B ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER Z WITH DESCENDER +2C6D..2C70 ; Changes_When_Lowercased # L& [4] LATIN CAPITAL LETTER ALPHA..LATIN CAPITAL LETTER TURNED ALPHA +2C72 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER W WITH HOOK +2C75 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER HALF H +2C7E..2C80 ; Changes_When_Lowercased # L& [3] LATIN CAPITAL LETTER S WITH SWASH TAIL..COPTIC CAPITAL LETTER ALFA +2C82 ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER VIDA +2C84 ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER GAMMA +2C86 ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER DALDA +2C88 ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER EIE +2C8A ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER SOU +2C8C ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER ZATA +2C8E ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER HATE +2C90 ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER THETHE +2C92 ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER IAUDA +2C94 ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER KAPA +2C96 ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER LAULA +2C98 ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER MI +2C9A ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER NI +2C9C ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER KSI +2C9E ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER O +2CA0 ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER PI +2CA2 ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER RO +2CA4 ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER SIMA +2CA6 ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER TAU +2CA8 ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER UA +2CAA ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER FI +2CAC ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER KHI +2CAE ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER PSI +2CB0 ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER OOU +2CB2 ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER DIALECT-P ALEF +2CB4 ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER OLD COPTIC AIN +2CB6 ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER CRYPTOGRAMMIC EIE +2CB8 ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER DIALECT-P KAPA +2CBA ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER DIALECT-P NI +2CBC ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER CRYPTOGRAMMIC NI +2CBE ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER OLD COPTIC OOU +2CC0 ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER SAMPI +2CC2 ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER CROSSED SHEI +2CC4 ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER OLD COPTIC SHEI +2CC6 ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER OLD COPTIC ESH +2CC8 ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER AKHMIMIC KHEI +2CCA ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER DIALECT-P HORI +2CCC ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER OLD COPTIC HORI +2CCE ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER OLD COPTIC HA +2CD0 ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER L-SHAPED HA +2CD2 ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER OLD COPTIC HEI +2CD4 ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER OLD COPTIC HAT +2CD6 ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER OLD COPTIC GANGIA +2CD8 ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER OLD COPTIC DJA +2CDA ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER OLD COPTIC SHIMA +2CDC ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER OLD NUBIAN SHIMA +2CDE ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER OLD NUBIAN NGI +2CE0 ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER OLD NUBIAN NYI +2CE2 ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER OLD NUBIAN WAU +2CEB ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER CRYPTOGRAMMIC SHEI +2CED ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER CRYPTOGRAMMIC GANGIA +2CF2 ; Changes_When_Lowercased # L& COPTIC CAPITAL LETTER BOHAIRIC KHEI +A640 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER ZEMLYA +A642 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER DZELO +A644 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER REVERSED DZE +A646 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER IOTA +A648 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER DJERV +A64A ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER MONOGRAPH UK +A64C ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER BROAD OMEGA +A64E ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER NEUTRAL YER +A650 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER YERU WITH BACK YER +A652 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER IOTIFIED YAT +A654 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER REVERSED YU +A656 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER IOTIFIED A +A658 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER CLOSED LITTLE YUS +A65A ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER BLENDED YUS +A65C ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER IOTIFIED CLOSED LITTLE YUS +A65E ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER YN +A660 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER REVERSED TSE +A662 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER SOFT DE +A664 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER SOFT EL +A666 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER SOFT EM +A668 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER MONOCULAR O +A66A ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER BINOCULAR O +A66C ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER DOUBLE MONOCULAR O +A680 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER DWE +A682 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER DZWE +A684 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER ZHWE +A686 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER CCHE +A688 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER DZZE +A68A ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER TE WITH MIDDLE HOOK +A68C ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER TWE +A68E ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER TSWE +A690 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER TSSE +A692 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER TCHE +A694 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER HWE +A696 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER SHWE +A698 ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER DOUBLE O +A69A ; Changes_When_Lowercased # L& CYRILLIC CAPITAL LETTER CROSSED O +A722 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF +A724 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER EGYPTOLOGICAL AIN +A726 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER HENG +A728 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER TZ +A72A ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER TRESILLO +A72C ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER CUATRILLO +A72E ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER CUATRILLO WITH COMMA +A732 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER AA +A734 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER AO +A736 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER AU +A738 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER AV +A73A ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER AV WITH HORIZONTAL BAR +A73C ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER AY +A73E ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER REVERSED C WITH DOT +A740 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER K WITH STROKE +A742 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER K WITH DIAGONAL STROKE +A744 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER K WITH STROKE AND DIAGONAL STROKE +A746 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER BROKEN L +A748 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER L WITH HIGH STROKE +A74A ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER O WITH LONG STROKE OVERLAY +A74C ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER O WITH LOOP +A74E ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER OO +A750 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER P WITH STROKE THROUGH DESCENDER +A752 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER P WITH FLOURISH +A754 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER P WITH SQUIRREL TAIL +A756 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER Q WITH STROKE THROUGH DESCENDER +A758 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER Q WITH DIAGONAL STROKE +A75A ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER R ROTUNDA +A75C ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER RUM ROTUNDA +A75E ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER V WITH DIAGONAL STROKE +A760 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER VY +A762 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER VISIGOTHIC Z +A764 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER THORN WITH STROKE +A766 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER THORN WITH STROKE THROUGH DESCENDER +A768 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER VEND +A76A ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER ET +A76C ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER IS +A76E ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER CON +A779 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER INSULAR D +A77B ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER INSULAR F +A77D..A77E ; Changes_When_Lowercased # L& [2] LATIN CAPITAL LETTER INSULAR G..LATIN CAPITAL LETTER TURNED INSULAR G +A780 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER TURNED L +A782 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER INSULAR R +A784 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER INSULAR S +A786 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER INSULAR T +A78B ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER SALTILLO +A78D ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER TURNED H +A790 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER N WITH DESCENDER +A792 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER C WITH BAR +A796 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER B WITH FLOURISH +A798 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER F WITH STROKE +A79A ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER VOLAPUK AE +A79C ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER VOLAPUK OE +A79E ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER VOLAPUK UE +A7A0 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER G WITH OBLIQUE STROKE +A7A2 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER K WITH OBLIQUE STROKE +A7A4 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER N WITH OBLIQUE STROKE +A7A6 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER R WITH OBLIQUE STROKE +A7A8 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER S WITH OBLIQUE STROKE +A7AA..A7AE ; Changes_When_Lowercased # L& [5] LATIN CAPITAL LETTER H WITH HOOK..LATIN CAPITAL LETTER SMALL CAPITAL I +A7B0..A7B4 ; Changes_When_Lowercased # L& [5] LATIN CAPITAL LETTER TURNED K..LATIN CAPITAL LETTER BETA +A7B6 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER OMEGA +A7B8 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER U WITH STROKE +FF21..FF3A ; Changes_When_Lowercased # L& [26] FULLWIDTH LATIN CAPITAL LETTER A..FULLWIDTH LATIN CAPITAL LETTER Z +10400..10427 ; Changes_When_Lowercased # L& [40] DESERET CAPITAL LETTER LONG I..DESERET CAPITAL LETTER EW +104B0..104D3 ; Changes_When_Lowercased # L& [36] OSAGE CAPITAL LETTER A..OSAGE CAPITAL LETTER ZHA +10C80..10CB2 ; Changes_When_Lowercased # L& [51] OLD HUNGARIAN CAPITAL LETTER A..OLD HUNGARIAN CAPITAL LETTER US +118A0..118BF ; Changes_When_Lowercased # L& [32] WARANG CITI CAPITAL LETTER NGAA..WARANG CITI CAPITAL LETTER VIYO +16E40..16E5F ; Changes_When_Lowercased # L& [32] MEDEFAIDRIN CAPITAL LETTER M..MEDEFAIDRIN CAPITAL LETTER Y +1E900..1E921 ; Changes_When_Lowercased # L& [34] ADLAM CAPITAL LETTER ALIF..ADLAM CAPITAL LETTER SHA + +# Total code points: 1383 + +# ================================================ + +# Derived Property: Changes_When_Uppercased (CWU) +# Characters whose normalized forms are not stable under a toUppercase mapping. +# For more information, see D140 in Section 3.13, "Default Case Algorithms". +# Changes_When_Uppercased(X) is true when toUppercase(toNFD(X)) != toNFD(X) + +0061..007A ; Changes_When_Uppercased # L& [26] LATIN SMALL LETTER A..LATIN SMALL LETTER Z +00B5 ; Changes_When_Uppercased # L& MICRO SIGN +00DF..00F6 ; Changes_When_Uppercased # L& [24] LATIN SMALL LETTER SHARP S..LATIN SMALL LETTER O WITH DIAERESIS +00F8..00FF ; Changes_When_Uppercased # L& [8] LATIN SMALL LETTER O WITH STROKE..LATIN SMALL LETTER Y WITH DIAERESIS +0101 ; Changes_When_Uppercased # L& LATIN SMALL LETTER A WITH MACRON +0103 ; Changes_When_Uppercased # L& LATIN SMALL LETTER A WITH BREVE +0105 ; Changes_When_Uppercased # L& LATIN SMALL LETTER A WITH OGONEK +0107 ; Changes_When_Uppercased # L& LATIN SMALL LETTER C WITH ACUTE +0109 ; Changes_When_Uppercased # L& LATIN SMALL LETTER C WITH CIRCUMFLEX +010B ; Changes_When_Uppercased # L& LATIN SMALL LETTER C WITH DOT ABOVE +010D ; Changes_When_Uppercased # L& LATIN SMALL LETTER C WITH CARON +010F ; Changes_When_Uppercased # L& LATIN SMALL LETTER D WITH CARON +0111 ; Changes_When_Uppercased # L& LATIN SMALL LETTER D WITH STROKE +0113 ; Changes_When_Uppercased # L& LATIN SMALL LETTER E WITH MACRON +0115 ; Changes_When_Uppercased # L& LATIN SMALL LETTER E WITH BREVE +0117 ; Changes_When_Uppercased # L& LATIN SMALL LETTER E WITH DOT ABOVE +0119 ; Changes_When_Uppercased # L& LATIN SMALL LETTER E WITH OGONEK +011B ; Changes_When_Uppercased # L& LATIN SMALL LETTER E WITH CARON +011D ; Changes_When_Uppercased # L& LATIN SMALL LETTER G WITH CIRCUMFLEX +011F ; Changes_When_Uppercased # L& LATIN SMALL LETTER G WITH BREVE +0121 ; Changes_When_Uppercased # L& LATIN SMALL LETTER G WITH DOT ABOVE +0123 ; Changes_When_Uppercased # L& LATIN SMALL LETTER G WITH CEDILLA +0125 ; Changes_When_Uppercased # L& LATIN SMALL LETTER H WITH CIRCUMFLEX +0127 ; Changes_When_Uppercased # L& LATIN SMALL LETTER H WITH STROKE +0129 ; Changes_When_Uppercased # L& LATIN SMALL LETTER I WITH TILDE +012B ; Changes_When_Uppercased # L& LATIN SMALL LETTER I WITH MACRON +012D ; Changes_When_Uppercased # L& LATIN SMALL LETTER I WITH BREVE +012F ; Changes_When_Uppercased # L& LATIN SMALL LETTER I WITH OGONEK +0131 ; Changes_When_Uppercased # L& LATIN SMALL LETTER DOTLESS I +0133 ; Changes_When_Uppercased # L& LATIN SMALL LIGATURE IJ +0135 ; Changes_When_Uppercased # L& LATIN SMALL LETTER J WITH CIRCUMFLEX +0137 ; Changes_When_Uppercased # L& LATIN SMALL LETTER K WITH CEDILLA +013A ; Changes_When_Uppercased # L& LATIN SMALL LETTER L WITH ACUTE +013C ; Changes_When_Uppercased # L& LATIN SMALL LETTER L WITH CEDILLA +013E ; Changes_When_Uppercased # L& LATIN SMALL LETTER L WITH CARON +0140 ; Changes_When_Uppercased # L& LATIN SMALL LETTER L WITH MIDDLE DOT +0142 ; Changes_When_Uppercased # L& LATIN SMALL LETTER L WITH STROKE +0144 ; Changes_When_Uppercased # L& LATIN SMALL LETTER N WITH ACUTE +0146 ; Changes_When_Uppercased # L& LATIN SMALL LETTER N WITH CEDILLA +0148..0149 ; Changes_When_Uppercased # L& [2] LATIN SMALL LETTER N WITH CARON..LATIN SMALL LETTER N PRECEDED BY APOSTROPHE +014B ; Changes_When_Uppercased # L& LATIN SMALL LETTER ENG +014D ; Changes_When_Uppercased # L& LATIN SMALL LETTER O WITH MACRON +014F ; Changes_When_Uppercased # L& LATIN SMALL LETTER O WITH BREVE +0151 ; Changes_When_Uppercased # L& LATIN SMALL LETTER O WITH DOUBLE ACUTE +0153 ; Changes_When_Uppercased # L& LATIN SMALL LIGATURE OE +0155 ; Changes_When_Uppercased # L& LATIN SMALL LETTER R WITH ACUTE +0157 ; Changes_When_Uppercased # L& LATIN SMALL LETTER R WITH CEDILLA +0159 ; Changes_When_Uppercased # L& LATIN SMALL LETTER R WITH CARON +015B ; Changes_When_Uppercased # L& LATIN SMALL LETTER S WITH ACUTE +015D ; Changes_When_Uppercased # L& LATIN SMALL LETTER S WITH CIRCUMFLEX +015F ; Changes_When_Uppercased # L& LATIN SMALL LETTER S WITH CEDILLA +0161 ; Changes_When_Uppercased # L& LATIN SMALL LETTER S WITH CARON +0163 ; Changes_When_Uppercased # L& LATIN SMALL LETTER T WITH CEDILLA +0165 ; Changes_When_Uppercased # L& LATIN SMALL LETTER T WITH CARON +0167 ; Changes_When_Uppercased # L& LATIN SMALL LETTER T WITH STROKE +0169 ; Changes_When_Uppercased # L& LATIN SMALL LETTER U WITH TILDE +016B ; Changes_When_Uppercased # L& LATIN SMALL LETTER U WITH MACRON +016D ; Changes_When_Uppercased # L& LATIN SMALL LETTER U WITH BREVE +016F ; Changes_When_Uppercased # L& LATIN SMALL LETTER U WITH RING ABOVE +0171 ; Changes_When_Uppercased # L& LATIN SMALL LETTER U WITH DOUBLE ACUTE +0173 ; Changes_When_Uppercased # L& LATIN SMALL LETTER U WITH OGONEK +0175 ; Changes_When_Uppercased # L& LATIN SMALL LETTER W WITH CIRCUMFLEX +0177 ; Changes_When_Uppercased # L& LATIN SMALL LETTER Y WITH CIRCUMFLEX +017A ; Changes_When_Uppercased # L& LATIN SMALL LETTER Z WITH ACUTE +017C ; Changes_When_Uppercased # L& LATIN SMALL LETTER Z WITH DOT ABOVE +017E..0180 ; Changes_When_Uppercased # L& [3] LATIN SMALL LETTER Z WITH CARON..LATIN SMALL LETTER B WITH STROKE +0183 ; Changes_When_Uppercased # L& LATIN SMALL LETTER B WITH TOPBAR +0185 ; Changes_When_Uppercased # L& LATIN SMALL LETTER TONE SIX +0188 ; Changes_When_Uppercased # L& LATIN SMALL LETTER C WITH HOOK +018C ; Changes_When_Uppercased # L& LATIN SMALL LETTER D WITH TOPBAR +0192 ; Changes_When_Uppercased # L& LATIN SMALL LETTER F WITH HOOK +0195 ; Changes_When_Uppercased # L& LATIN SMALL LETTER HV +0199..019A ; Changes_When_Uppercased # L& [2] LATIN SMALL LETTER K WITH HOOK..LATIN SMALL LETTER L WITH BAR +019E ; Changes_When_Uppercased # L& LATIN SMALL LETTER N WITH LONG RIGHT LEG +01A1 ; Changes_When_Uppercased # L& LATIN SMALL LETTER O WITH HORN +01A3 ; Changes_When_Uppercased # L& LATIN SMALL LETTER OI +01A5 ; Changes_When_Uppercased # L& LATIN SMALL LETTER P WITH HOOK +01A8 ; Changes_When_Uppercased # L& LATIN SMALL LETTER TONE TWO +01AD ; Changes_When_Uppercased # L& LATIN SMALL LETTER T WITH HOOK +01B0 ; Changes_When_Uppercased # L& LATIN SMALL LETTER U WITH HORN +01B4 ; Changes_When_Uppercased # L& LATIN SMALL LETTER Y WITH HOOK +01B6 ; Changes_When_Uppercased # L& LATIN SMALL LETTER Z WITH STROKE +01B9 ; Changes_When_Uppercased # L& LATIN SMALL LETTER EZH REVERSED +01BD ; Changes_When_Uppercased # L& LATIN SMALL LETTER TONE FIVE +01BF ; Changes_When_Uppercased # L& LATIN LETTER WYNN +01C5..01C6 ; Changes_When_Uppercased # L& [2] LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON..LATIN SMALL LETTER DZ WITH CARON +01C8..01C9 ; Changes_When_Uppercased # L& [2] LATIN CAPITAL LETTER L WITH SMALL LETTER J..LATIN SMALL LETTER LJ +01CB..01CC ; Changes_When_Uppercased # L& [2] LATIN CAPITAL LETTER N WITH SMALL LETTER J..LATIN SMALL LETTER NJ +01CE ; Changes_When_Uppercased # L& LATIN SMALL LETTER A WITH CARON +01D0 ; Changes_When_Uppercased # L& LATIN SMALL LETTER I WITH CARON +01D2 ; Changes_When_Uppercased # L& LATIN SMALL LETTER O WITH CARON +01D4 ; Changes_When_Uppercased # L& LATIN SMALL LETTER U WITH CARON +01D6 ; Changes_When_Uppercased # L& LATIN SMALL LETTER U WITH DIAERESIS AND MACRON +01D8 ; Changes_When_Uppercased # L& LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE +01DA ; Changes_When_Uppercased # L& LATIN SMALL LETTER U WITH DIAERESIS AND CARON +01DC..01DD ; Changes_When_Uppercased # L& [2] LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE..LATIN SMALL LETTER TURNED E +01DF ; Changes_When_Uppercased # L& LATIN SMALL LETTER A WITH DIAERESIS AND MACRON +01E1 ; Changes_When_Uppercased # L& LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON +01E3 ; Changes_When_Uppercased # L& LATIN SMALL LETTER AE WITH MACRON +01E5 ; Changes_When_Uppercased # L& LATIN SMALL LETTER G WITH STROKE +01E7 ; Changes_When_Uppercased # L& LATIN SMALL LETTER G WITH CARON +01E9 ; Changes_When_Uppercased # L& LATIN SMALL LETTER K WITH CARON +01EB ; Changes_When_Uppercased # L& LATIN SMALL LETTER O WITH OGONEK +01ED ; Changes_When_Uppercased # L& LATIN SMALL LETTER O WITH OGONEK AND MACRON +01EF..01F0 ; Changes_When_Uppercased # L& [2] LATIN SMALL LETTER EZH WITH CARON..LATIN SMALL LETTER J WITH CARON +01F2..01F3 ; Changes_When_Uppercased # L& [2] LATIN CAPITAL LETTER D WITH SMALL LETTER Z..LATIN SMALL LETTER DZ +01F5 ; Changes_When_Uppercased # L& LATIN SMALL LETTER G WITH ACUTE +01F9 ; Changes_When_Uppercased # L& LATIN SMALL LETTER N WITH GRAVE +01FB ; Changes_When_Uppercased # L& LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE +01FD ; Changes_When_Uppercased # L& LATIN SMALL LETTER AE WITH ACUTE +01FF ; Changes_When_Uppercased # L& LATIN SMALL LETTER O WITH STROKE AND ACUTE +0201 ; Changes_When_Uppercased # L& LATIN SMALL LETTER A WITH DOUBLE GRAVE +0203 ; Changes_When_Uppercased # L& LATIN SMALL LETTER A WITH INVERTED BREVE +0205 ; Changes_When_Uppercased # L& LATIN SMALL LETTER E WITH DOUBLE GRAVE +0207 ; Changes_When_Uppercased # L& LATIN SMALL LETTER E WITH INVERTED BREVE +0209 ; Changes_When_Uppercased # L& LATIN SMALL LETTER I WITH DOUBLE GRAVE +020B ; Changes_When_Uppercased # L& LATIN SMALL LETTER I WITH INVERTED BREVE +020D ; Changes_When_Uppercased # L& LATIN SMALL LETTER O WITH DOUBLE GRAVE +020F ; Changes_When_Uppercased # L& LATIN SMALL LETTER O WITH INVERTED BREVE +0211 ; Changes_When_Uppercased # L& LATIN SMALL LETTER R WITH DOUBLE GRAVE +0213 ; Changes_When_Uppercased # L& LATIN SMALL LETTER R WITH INVERTED BREVE +0215 ; Changes_When_Uppercased # L& LATIN SMALL LETTER U WITH DOUBLE GRAVE +0217 ; Changes_When_Uppercased # L& LATIN SMALL LETTER U WITH INVERTED BREVE +0219 ; Changes_When_Uppercased # L& LATIN SMALL LETTER S WITH COMMA BELOW +021B ; Changes_When_Uppercased # L& LATIN SMALL LETTER T WITH COMMA BELOW +021D ; Changes_When_Uppercased # L& LATIN SMALL LETTER YOGH +021F ; Changes_When_Uppercased # L& LATIN SMALL LETTER H WITH CARON +0223 ; Changes_When_Uppercased # L& LATIN SMALL LETTER OU +0225 ; Changes_When_Uppercased # L& LATIN SMALL LETTER Z WITH HOOK +0227 ; Changes_When_Uppercased # L& LATIN SMALL LETTER A WITH DOT ABOVE +0229 ; Changes_When_Uppercased # L& LATIN SMALL LETTER E WITH CEDILLA +022B ; Changes_When_Uppercased # L& LATIN SMALL LETTER O WITH DIAERESIS AND MACRON +022D ; Changes_When_Uppercased # L& LATIN SMALL LETTER O WITH TILDE AND MACRON +022F ; Changes_When_Uppercased # L& LATIN SMALL LETTER O WITH DOT ABOVE +0231 ; Changes_When_Uppercased # L& LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON +0233 ; Changes_When_Uppercased # L& LATIN SMALL LETTER Y WITH MACRON +023C ; Changes_When_Uppercased # L& LATIN SMALL LETTER C WITH STROKE +023F..0240 ; Changes_When_Uppercased # L& [2] LATIN SMALL LETTER S WITH SWASH TAIL..LATIN SMALL LETTER Z WITH SWASH TAIL +0242 ; Changes_When_Uppercased # L& LATIN SMALL LETTER GLOTTAL STOP +0247 ; Changes_When_Uppercased # L& LATIN SMALL LETTER E WITH STROKE +0249 ; Changes_When_Uppercased # L& LATIN SMALL LETTER J WITH STROKE +024B ; Changes_When_Uppercased # L& LATIN SMALL LETTER Q WITH HOOK TAIL +024D ; Changes_When_Uppercased # L& LATIN SMALL LETTER R WITH STROKE +024F..0254 ; Changes_When_Uppercased # L& [6] LATIN SMALL LETTER Y WITH STROKE..LATIN SMALL LETTER OPEN O +0256..0257 ; Changes_When_Uppercased # L& [2] LATIN SMALL LETTER D WITH TAIL..LATIN SMALL LETTER D WITH HOOK +0259 ; Changes_When_Uppercased # L& LATIN SMALL LETTER SCHWA +025B..025C ; Changes_When_Uppercased # L& [2] LATIN SMALL LETTER OPEN E..LATIN SMALL LETTER REVERSED OPEN E +0260..0261 ; Changes_When_Uppercased # L& [2] LATIN SMALL LETTER G WITH HOOK..LATIN SMALL LETTER SCRIPT G +0263 ; Changes_When_Uppercased # L& LATIN SMALL LETTER GAMMA +0265..0266 ; Changes_When_Uppercased # L& [2] LATIN SMALL LETTER TURNED H..LATIN SMALL LETTER H WITH HOOK +0268..026C ; Changes_When_Uppercased # L& [5] LATIN SMALL LETTER I WITH STROKE..LATIN SMALL LETTER L WITH BELT +026F ; Changes_When_Uppercased # L& LATIN SMALL LETTER TURNED M +0271..0272 ; Changes_When_Uppercased # L& [2] LATIN SMALL LETTER M WITH HOOK..LATIN SMALL LETTER N WITH LEFT HOOK +0275 ; Changes_When_Uppercased # L& LATIN SMALL LETTER BARRED O +027D ; Changes_When_Uppercased # L& LATIN SMALL LETTER R WITH TAIL +0280 ; Changes_When_Uppercased # L& LATIN LETTER SMALL CAPITAL R +0283 ; Changes_When_Uppercased # L& LATIN SMALL LETTER ESH +0287..028C ; Changes_When_Uppercased # L& [6] LATIN SMALL LETTER TURNED T..LATIN SMALL LETTER TURNED V +0292 ; Changes_When_Uppercased # L& LATIN SMALL LETTER EZH +029D..029E ; Changes_When_Uppercased # L& [2] LATIN SMALL LETTER J WITH CROSSED-TAIL..LATIN SMALL LETTER TURNED K +0345 ; Changes_When_Uppercased # Mn COMBINING GREEK YPOGEGRAMMENI +0371 ; Changes_When_Uppercased # L& GREEK SMALL LETTER HETA +0373 ; Changes_When_Uppercased # L& GREEK SMALL LETTER ARCHAIC SAMPI +0377 ; Changes_When_Uppercased # L& GREEK SMALL LETTER PAMPHYLIAN DIGAMMA +037B..037D ; Changes_When_Uppercased # L& [3] GREEK SMALL REVERSED LUNATE SIGMA SYMBOL..GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL +0390 ; Changes_When_Uppercased # L& GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS +03AC..03CE ; Changes_When_Uppercased # L& [35] GREEK SMALL LETTER ALPHA WITH TONOS..GREEK SMALL LETTER OMEGA WITH TONOS +03D0..03D1 ; Changes_When_Uppercased # L& [2] GREEK BETA SYMBOL..GREEK THETA SYMBOL +03D5..03D7 ; Changes_When_Uppercased # L& [3] GREEK PHI SYMBOL..GREEK KAI SYMBOL +03D9 ; Changes_When_Uppercased # L& GREEK SMALL LETTER ARCHAIC KOPPA +03DB ; Changes_When_Uppercased # L& GREEK SMALL LETTER STIGMA +03DD ; Changes_When_Uppercased # L& GREEK SMALL LETTER DIGAMMA +03DF ; Changes_When_Uppercased # L& GREEK SMALL LETTER KOPPA +03E1 ; Changes_When_Uppercased # L& GREEK SMALL LETTER SAMPI +03E3 ; Changes_When_Uppercased # L& COPTIC SMALL LETTER SHEI +03E5 ; Changes_When_Uppercased # L& COPTIC SMALL LETTER FEI +03E7 ; Changes_When_Uppercased # L& COPTIC SMALL LETTER KHEI +03E9 ; Changes_When_Uppercased # L& COPTIC SMALL LETTER HORI +03EB ; Changes_When_Uppercased # L& COPTIC SMALL LETTER GANGIA +03ED ; Changes_When_Uppercased # L& COPTIC SMALL LETTER SHIMA +03EF..03F3 ; Changes_When_Uppercased # L& [5] COPTIC SMALL LETTER DEI..GREEK LETTER YOT +03F5 ; Changes_When_Uppercased # L& GREEK LUNATE EPSILON SYMBOL +03F8 ; Changes_When_Uppercased # L& GREEK SMALL LETTER SHO +03FB ; Changes_When_Uppercased # L& GREEK SMALL LETTER SAN +0430..045F ; Changes_When_Uppercased # L& [48] CYRILLIC SMALL LETTER A..CYRILLIC SMALL LETTER DZHE +0461 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER OMEGA +0463 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER YAT +0465 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER IOTIFIED E +0467 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER LITTLE YUS +0469 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER IOTIFIED LITTLE YUS +046B ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER BIG YUS +046D ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER IOTIFIED BIG YUS +046F ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER KSI +0471 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER PSI +0473 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER FITA +0475 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER IZHITSA +0477 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT +0479 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER UK +047B ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER ROUND OMEGA +047D ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER OMEGA WITH TITLO +047F ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER OT +0481 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER KOPPA +048B ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER SHORT I WITH TAIL +048D ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER SEMISOFT SIGN +048F ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER ER WITH TICK +0491 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER GHE WITH UPTURN +0493 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER GHE WITH STROKE +0495 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER GHE WITH MIDDLE HOOK +0497 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER ZHE WITH DESCENDER +0499 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER ZE WITH DESCENDER +049B ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER KA WITH DESCENDER +049D ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE +049F ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER KA WITH STROKE +04A1 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER BASHKIR KA +04A3 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER EN WITH DESCENDER +04A5 ; Changes_When_Uppercased # L& CYRILLIC SMALL LIGATURE EN GHE +04A7 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER PE WITH MIDDLE HOOK +04A9 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER ABKHASIAN HA +04AB ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER ES WITH DESCENDER +04AD ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER TE WITH DESCENDER +04AF ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER STRAIGHT U +04B1 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE +04B3 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER HA WITH DESCENDER +04B5 ; Changes_When_Uppercased # L& CYRILLIC SMALL LIGATURE TE TSE +04B7 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER CHE WITH DESCENDER +04B9 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE +04BB ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER SHHA +04BD ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER ABKHASIAN CHE +04BF ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER +04C2 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER ZHE WITH BREVE +04C4 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER KA WITH HOOK +04C6 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER EL WITH TAIL +04C8 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER EN WITH HOOK +04CA ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER EN WITH TAIL +04CC ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER KHAKASSIAN CHE +04CE..04CF ; Changes_When_Uppercased # L& [2] CYRILLIC SMALL LETTER EM WITH TAIL..CYRILLIC SMALL LETTER PALOCHKA +04D1 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER A WITH BREVE +04D3 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER A WITH DIAERESIS +04D5 ; Changes_When_Uppercased # L& CYRILLIC SMALL LIGATURE A IE +04D7 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER IE WITH BREVE +04D9 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER SCHWA +04DB ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS +04DD ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER ZHE WITH DIAERESIS +04DF ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER ZE WITH DIAERESIS +04E1 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER ABKHASIAN DZE +04E3 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER I WITH MACRON +04E5 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER I WITH DIAERESIS +04E7 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER O WITH DIAERESIS +04E9 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER BARRED O +04EB ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS +04ED ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER E WITH DIAERESIS +04EF ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER U WITH MACRON +04F1 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER U WITH DIAERESIS +04F3 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE +04F5 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER CHE WITH DIAERESIS +04F7 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER GHE WITH DESCENDER +04F9 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER YERU WITH DIAERESIS +04FB ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER GHE WITH STROKE AND HOOK +04FD ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER HA WITH HOOK +04FF ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER HA WITH STROKE +0501 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER KOMI DE +0503 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER KOMI DJE +0505 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER KOMI ZJE +0507 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER KOMI DZJE +0509 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER KOMI LJE +050B ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER KOMI NJE +050D ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER KOMI SJE +050F ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER KOMI TJE +0511 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER REVERSED ZE +0513 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER EL WITH HOOK +0515 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER LHA +0517 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER RHA +0519 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER YAE +051B ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER QA +051D ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER WE +051F ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER ALEUT KA +0521 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER EL WITH MIDDLE HOOK +0523 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER EN WITH MIDDLE HOOK +0525 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER PE WITH DESCENDER +0527 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER SHHA WITH DESCENDER +0529 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER EN WITH LEFT HOOK +052B ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER DZZHE +052D ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER DCHE +052F ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER EL WITH DESCENDER +0561..0587 ; Changes_When_Uppercased # L& [39] ARMENIAN SMALL LETTER AYB..ARMENIAN SMALL LIGATURE ECH YIWN +10D0..10FA ; Changes_When_Uppercased # L& [43] GEORGIAN LETTER AN..GEORGIAN LETTER AIN +10FD..10FF ; Changes_When_Uppercased # L& [3] GEORGIAN LETTER AEN..GEORGIAN LETTER LABIAL SIGN +13F8..13FD ; Changes_When_Uppercased # L& [6] CHEROKEE SMALL LETTER YE..CHEROKEE SMALL LETTER MV +1C80..1C88 ; Changes_When_Uppercased # L& [9] CYRILLIC SMALL LETTER ROUNDED VE..CYRILLIC SMALL LETTER UNBLENDED UK +1D79 ; Changes_When_Uppercased # L& LATIN SMALL LETTER INSULAR G +1D7D ; Changes_When_Uppercased # L& LATIN SMALL LETTER P WITH STROKE +1E01 ; Changes_When_Uppercased # L& LATIN SMALL LETTER A WITH RING BELOW +1E03 ; Changes_When_Uppercased # L& LATIN SMALL LETTER B WITH DOT ABOVE +1E05 ; Changes_When_Uppercased # L& LATIN SMALL LETTER B WITH DOT BELOW +1E07 ; Changes_When_Uppercased # L& LATIN SMALL LETTER B WITH LINE BELOW +1E09 ; Changes_When_Uppercased # L& LATIN SMALL LETTER C WITH CEDILLA AND ACUTE +1E0B ; Changes_When_Uppercased # L& LATIN SMALL LETTER D WITH DOT ABOVE +1E0D ; Changes_When_Uppercased # L& LATIN SMALL LETTER D WITH DOT BELOW +1E0F ; Changes_When_Uppercased # L& LATIN SMALL LETTER D WITH LINE BELOW +1E11 ; Changes_When_Uppercased # L& LATIN SMALL LETTER D WITH CEDILLA +1E13 ; Changes_When_Uppercased # L& LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW +1E15 ; Changes_When_Uppercased # L& LATIN SMALL LETTER E WITH MACRON AND GRAVE +1E17 ; Changes_When_Uppercased # L& LATIN SMALL LETTER E WITH MACRON AND ACUTE +1E19 ; Changes_When_Uppercased # L& LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW +1E1B ; Changes_When_Uppercased # L& LATIN SMALL LETTER E WITH TILDE BELOW +1E1D ; Changes_When_Uppercased # L& LATIN SMALL LETTER E WITH CEDILLA AND BREVE +1E1F ; Changes_When_Uppercased # L& LATIN SMALL LETTER F WITH DOT ABOVE +1E21 ; Changes_When_Uppercased # L& LATIN SMALL LETTER G WITH MACRON +1E23 ; Changes_When_Uppercased # L& LATIN SMALL LETTER H WITH DOT ABOVE +1E25 ; Changes_When_Uppercased # L& LATIN SMALL LETTER H WITH DOT BELOW +1E27 ; Changes_When_Uppercased # L& LATIN SMALL LETTER H WITH DIAERESIS +1E29 ; Changes_When_Uppercased # L& LATIN SMALL LETTER H WITH CEDILLA +1E2B ; Changes_When_Uppercased # L& LATIN SMALL LETTER H WITH BREVE BELOW +1E2D ; Changes_When_Uppercased # L& LATIN SMALL LETTER I WITH TILDE BELOW +1E2F ; Changes_When_Uppercased # L& LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE +1E31 ; Changes_When_Uppercased # L& LATIN SMALL LETTER K WITH ACUTE +1E33 ; Changes_When_Uppercased # L& LATIN SMALL LETTER K WITH DOT BELOW +1E35 ; Changes_When_Uppercased # L& LATIN SMALL LETTER K WITH LINE BELOW +1E37 ; Changes_When_Uppercased # L& LATIN SMALL LETTER L WITH DOT BELOW +1E39 ; Changes_When_Uppercased # L& LATIN SMALL LETTER L WITH DOT BELOW AND MACRON +1E3B ; Changes_When_Uppercased # L& LATIN SMALL LETTER L WITH LINE BELOW +1E3D ; Changes_When_Uppercased # L& LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW +1E3F ; Changes_When_Uppercased # L& LATIN SMALL LETTER M WITH ACUTE +1E41 ; Changes_When_Uppercased # L& LATIN SMALL LETTER M WITH DOT ABOVE +1E43 ; Changes_When_Uppercased # L& LATIN SMALL LETTER M WITH DOT BELOW +1E45 ; Changes_When_Uppercased # L& LATIN SMALL LETTER N WITH DOT ABOVE +1E47 ; Changes_When_Uppercased # L& LATIN SMALL LETTER N WITH DOT BELOW +1E49 ; Changes_When_Uppercased # L& LATIN SMALL LETTER N WITH LINE BELOW +1E4B ; Changes_When_Uppercased # L& LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW +1E4D ; Changes_When_Uppercased # L& LATIN SMALL LETTER O WITH TILDE AND ACUTE +1E4F ; Changes_When_Uppercased # L& LATIN SMALL LETTER O WITH TILDE AND DIAERESIS +1E51 ; Changes_When_Uppercased # L& LATIN SMALL LETTER O WITH MACRON AND GRAVE +1E53 ; Changes_When_Uppercased # L& LATIN SMALL LETTER O WITH MACRON AND ACUTE +1E55 ; Changes_When_Uppercased # L& LATIN SMALL LETTER P WITH ACUTE +1E57 ; Changes_When_Uppercased # L& LATIN SMALL LETTER P WITH DOT ABOVE +1E59 ; Changes_When_Uppercased # L& LATIN SMALL LETTER R WITH DOT ABOVE +1E5B ; Changes_When_Uppercased # L& LATIN SMALL LETTER R WITH DOT BELOW +1E5D ; Changes_When_Uppercased # L& LATIN SMALL LETTER R WITH DOT BELOW AND MACRON +1E5F ; Changes_When_Uppercased # L& LATIN SMALL LETTER R WITH LINE BELOW +1E61 ; Changes_When_Uppercased # L& LATIN SMALL LETTER S WITH DOT ABOVE +1E63 ; Changes_When_Uppercased # L& LATIN SMALL LETTER S WITH DOT BELOW +1E65 ; Changes_When_Uppercased # L& LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE +1E67 ; Changes_When_Uppercased # L& LATIN SMALL LETTER S WITH CARON AND DOT ABOVE +1E69 ; Changes_When_Uppercased # L& LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE +1E6B ; Changes_When_Uppercased # L& LATIN SMALL LETTER T WITH DOT ABOVE +1E6D ; Changes_When_Uppercased # L& LATIN SMALL LETTER T WITH DOT BELOW +1E6F ; Changes_When_Uppercased # L& LATIN SMALL LETTER T WITH LINE BELOW +1E71 ; Changes_When_Uppercased # L& LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW +1E73 ; Changes_When_Uppercased # L& LATIN SMALL LETTER U WITH DIAERESIS BELOW +1E75 ; Changes_When_Uppercased # L& LATIN SMALL LETTER U WITH TILDE BELOW +1E77 ; Changes_When_Uppercased # L& LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW +1E79 ; Changes_When_Uppercased # L& LATIN SMALL LETTER U WITH TILDE AND ACUTE +1E7B ; Changes_When_Uppercased # L& LATIN SMALL LETTER U WITH MACRON AND DIAERESIS +1E7D ; Changes_When_Uppercased # L& LATIN SMALL LETTER V WITH TILDE +1E7F ; Changes_When_Uppercased # L& LATIN SMALL LETTER V WITH DOT BELOW +1E81 ; Changes_When_Uppercased # L& LATIN SMALL LETTER W WITH GRAVE +1E83 ; Changes_When_Uppercased # L& LATIN SMALL LETTER W WITH ACUTE +1E85 ; Changes_When_Uppercased # L& LATIN SMALL LETTER W WITH DIAERESIS +1E87 ; Changes_When_Uppercased # L& LATIN SMALL LETTER W WITH DOT ABOVE +1E89 ; Changes_When_Uppercased # L& LATIN SMALL LETTER W WITH DOT BELOW +1E8B ; Changes_When_Uppercased # L& LATIN SMALL LETTER X WITH DOT ABOVE +1E8D ; Changes_When_Uppercased # L& LATIN SMALL LETTER X WITH DIAERESIS +1E8F ; Changes_When_Uppercased # L& LATIN SMALL LETTER Y WITH DOT ABOVE +1E91 ; Changes_When_Uppercased # L& LATIN SMALL LETTER Z WITH CIRCUMFLEX +1E93 ; Changes_When_Uppercased # L& LATIN SMALL LETTER Z WITH DOT BELOW +1E95..1E9B ; Changes_When_Uppercased # L& [7] LATIN SMALL LETTER Z WITH LINE BELOW..LATIN SMALL LETTER LONG S WITH DOT ABOVE +1EA1 ; Changes_When_Uppercased # L& LATIN SMALL LETTER A WITH DOT BELOW +1EA3 ; Changes_When_Uppercased # L& LATIN SMALL LETTER A WITH HOOK ABOVE +1EA5 ; Changes_When_Uppercased # L& LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE +1EA7 ; Changes_When_Uppercased # L& LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE +1EA9 ; Changes_When_Uppercased # L& LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE +1EAB ; Changes_When_Uppercased # L& LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE +1EAD ; Changes_When_Uppercased # L& LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW +1EAF ; Changes_When_Uppercased # L& LATIN SMALL LETTER A WITH BREVE AND ACUTE +1EB1 ; Changes_When_Uppercased # L& LATIN SMALL LETTER A WITH BREVE AND GRAVE +1EB3 ; Changes_When_Uppercased # L& LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE +1EB5 ; Changes_When_Uppercased # L& LATIN SMALL LETTER A WITH BREVE AND TILDE +1EB7 ; Changes_When_Uppercased # L& LATIN SMALL LETTER A WITH BREVE AND DOT BELOW +1EB9 ; Changes_When_Uppercased # L& LATIN SMALL LETTER E WITH DOT BELOW +1EBB ; Changes_When_Uppercased # L& LATIN SMALL LETTER E WITH HOOK ABOVE +1EBD ; Changes_When_Uppercased # L& LATIN SMALL LETTER E WITH TILDE +1EBF ; Changes_When_Uppercased # L& LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE +1EC1 ; Changes_When_Uppercased # L& LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE +1EC3 ; Changes_When_Uppercased # L& LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE +1EC5 ; Changes_When_Uppercased # L& LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE +1EC7 ; Changes_When_Uppercased # L& LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW +1EC9 ; Changes_When_Uppercased # L& LATIN SMALL LETTER I WITH HOOK ABOVE +1ECB ; Changes_When_Uppercased # L& LATIN SMALL LETTER I WITH DOT BELOW +1ECD ; Changes_When_Uppercased # L& LATIN SMALL LETTER O WITH DOT BELOW +1ECF ; Changes_When_Uppercased # L& LATIN SMALL LETTER O WITH HOOK ABOVE +1ED1 ; Changes_When_Uppercased # L& LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE +1ED3 ; Changes_When_Uppercased # L& LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE +1ED5 ; Changes_When_Uppercased # L& LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE +1ED7 ; Changes_When_Uppercased # L& LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE +1ED9 ; Changes_When_Uppercased # L& LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW +1EDB ; Changes_When_Uppercased # L& LATIN SMALL LETTER O WITH HORN AND ACUTE +1EDD ; Changes_When_Uppercased # L& LATIN SMALL LETTER O WITH HORN AND GRAVE +1EDF ; Changes_When_Uppercased # L& LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE +1EE1 ; Changes_When_Uppercased # L& LATIN SMALL LETTER O WITH HORN AND TILDE +1EE3 ; Changes_When_Uppercased # L& LATIN SMALL LETTER O WITH HORN AND DOT BELOW +1EE5 ; Changes_When_Uppercased # L& LATIN SMALL LETTER U WITH DOT BELOW +1EE7 ; Changes_When_Uppercased # L& LATIN SMALL LETTER U WITH HOOK ABOVE +1EE9 ; Changes_When_Uppercased # L& LATIN SMALL LETTER U WITH HORN AND ACUTE +1EEB ; Changes_When_Uppercased # L& LATIN SMALL LETTER U WITH HORN AND GRAVE +1EED ; Changes_When_Uppercased # L& LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE +1EEF ; Changes_When_Uppercased # L& LATIN SMALL LETTER U WITH HORN AND TILDE +1EF1 ; Changes_When_Uppercased # L& LATIN SMALL LETTER U WITH HORN AND DOT BELOW +1EF3 ; Changes_When_Uppercased # L& LATIN SMALL LETTER Y WITH GRAVE +1EF5 ; Changes_When_Uppercased # L& LATIN SMALL LETTER Y WITH DOT BELOW +1EF7 ; Changes_When_Uppercased # L& LATIN SMALL LETTER Y WITH HOOK ABOVE +1EF9 ; Changes_When_Uppercased # L& LATIN SMALL LETTER Y WITH TILDE +1EFB ; Changes_When_Uppercased # L& LATIN SMALL LETTER MIDDLE-WELSH LL +1EFD ; Changes_When_Uppercased # L& LATIN SMALL LETTER MIDDLE-WELSH V +1EFF..1F07 ; Changes_When_Uppercased # L& [9] LATIN SMALL LETTER Y WITH LOOP..GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI +1F10..1F15 ; Changes_When_Uppercased # L& [6] GREEK SMALL LETTER EPSILON WITH PSILI..GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA +1F20..1F27 ; Changes_When_Uppercased # L& [8] GREEK SMALL LETTER ETA WITH PSILI..GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI +1F30..1F37 ; Changes_When_Uppercased # L& [8] GREEK SMALL LETTER IOTA WITH PSILI..GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI +1F40..1F45 ; Changes_When_Uppercased # L& [6] GREEK SMALL LETTER OMICRON WITH PSILI..GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA +1F50..1F57 ; Changes_When_Uppercased # L& [8] GREEK SMALL LETTER UPSILON WITH PSILI..GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI +1F60..1F67 ; Changes_When_Uppercased # L& [8] GREEK SMALL LETTER OMEGA WITH PSILI..GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI +1F70..1F7D ; Changes_When_Uppercased # L& [14] GREEK SMALL LETTER ALPHA WITH VARIA..GREEK SMALL LETTER OMEGA WITH OXIA +1F80..1FB4 ; Changes_When_Uppercased # L& [53] GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI..GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI +1FB6..1FB7 ; Changes_When_Uppercased # L& [2] GREEK SMALL LETTER ALPHA WITH PERISPOMENI..GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI +1FBC ; Changes_When_Uppercased # L& GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI +1FBE ; Changes_When_Uppercased # L& GREEK PROSGEGRAMMENI +1FC2..1FC4 ; Changes_When_Uppercased # L& [3] GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI +1FC6..1FC7 ; Changes_When_Uppercased # L& [2] GREEK SMALL LETTER ETA WITH PERISPOMENI..GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI +1FCC ; Changes_When_Uppercased # L& GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI +1FD0..1FD3 ; Changes_When_Uppercased # L& [4] GREEK SMALL LETTER IOTA WITH VRACHY..GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA +1FD6..1FD7 ; Changes_When_Uppercased # L& [2] GREEK SMALL LETTER IOTA WITH PERISPOMENI..GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI +1FE0..1FE7 ; Changes_When_Uppercased # L& [8] GREEK SMALL LETTER UPSILON WITH VRACHY..GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI +1FF2..1FF4 ; Changes_When_Uppercased # L& [3] GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI +1FF6..1FF7 ; Changes_When_Uppercased # L& [2] GREEK SMALL LETTER OMEGA WITH PERISPOMENI..GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI +1FFC ; Changes_When_Uppercased # L& GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI +214E ; Changes_When_Uppercased # L& TURNED SMALL F +2170..217F ; Changes_When_Uppercased # Nl [16] SMALL ROMAN NUMERAL ONE..SMALL ROMAN NUMERAL ONE THOUSAND +2184 ; Changes_When_Uppercased # L& LATIN SMALL LETTER REVERSED C +24D0..24E9 ; Changes_When_Uppercased # So [26] CIRCLED LATIN SMALL LETTER A..CIRCLED LATIN SMALL LETTER Z +2C30..2C5E ; Changes_When_Uppercased # L& [47] GLAGOLITIC SMALL LETTER AZU..GLAGOLITIC SMALL LETTER LATINATE MYSLITE +2C61 ; Changes_When_Uppercased # L& LATIN SMALL LETTER L WITH DOUBLE BAR +2C65..2C66 ; Changes_When_Uppercased # L& [2] LATIN SMALL LETTER A WITH STROKE..LATIN SMALL LETTER T WITH DIAGONAL STROKE +2C68 ; Changes_When_Uppercased # L& LATIN SMALL LETTER H WITH DESCENDER +2C6A ; Changes_When_Uppercased # L& LATIN SMALL LETTER K WITH DESCENDER +2C6C ; Changes_When_Uppercased # L& LATIN SMALL LETTER Z WITH DESCENDER +2C73 ; Changes_When_Uppercased # L& LATIN SMALL LETTER W WITH HOOK +2C76 ; Changes_When_Uppercased # L& LATIN SMALL LETTER HALF H +2C81 ; Changes_When_Uppercased # L& COPTIC SMALL LETTER ALFA +2C83 ; Changes_When_Uppercased # L& COPTIC SMALL LETTER VIDA +2C85 ; Changes_When_Uppercased # L& COPTIC SMALL LETTER GAMMA +2C87 ; Changes_When_Uppercased # L& COPTIC SMALL LETTER DALDA +2C89 ; Changes_When_Uppercased # L& COPTIC SMALL LETTER EIE +2C8B ; Changes_When_Uppercased # L& COPTIC SMALL LETTER SOU +2C8D ; Changes_When_Uppercased # L& COPTIC SMALL LETTER ZATA +2C8F ; Changes_When_Uppercased # L& COPTIC SMALL LETTER HATE +2C91 ; Changes_When_Uppercased # L& COPTIC SMALL LETTER THETHE +2C93 ; Changes_When_Uppercased # L& COPTIC SMALL LETTER IAUDA +2C95 ; Changes_When_Uppercased # L& COPTIC SMALL LETTER KAPA +2C97 ; Changes_When_Uppercased # L& COPTIC SMALL LETTER LAULA +2C99 ; Changes_When_Uppercased # L& COPTIC SMALL LETTER MI +2C9B ; Changes_When_Uppercased # L& COPTIC SMALL LETTER NI +2C9D ; Changes_When_Uppercased # L& COPTIC SMALL LETTER KSI +2C9F ; Changes_When_Uppercased # L& COPTIC SMALL LETTER O +2CA1 ; Changes_When_Uppercased # L& COPTIC SMALL LETTER PI +2CA3 ; Changes_When_Uppercased # L& COPTIC SMALL LETTER RO +2CA5 ; Changes_When_Uppercased # L& COPTIC SMALL LETTER SIMA +2CA7 ; Changes_When_Uppercased # L& COPTIC SMALL LETTER TAU +2CA9 ; Changes_When_Uppercased # L& COPTIC SMALL LETTER UA +2CAB ; Changes_When_Uppercased # L& COPTIC SMALL LETTER FI +2CAD ; Changes_When_Uppercased # L& COPTIC SMALL LETTER KHI +2CAF ; Changes_When_Uppercased # L& COPTIC SMALL LETTER PSI +2CB1 ; Changes_When_Uppercased # L& COPTIC SMALL LETTER OOU +2CB3 ; Changes_When_Uppercased # L& COPTIC SMALL LETTER DIALECT-P ALEF +2CB5 ; Changes_When_Uppercased # L& COPTIC SMALL LETTER OLD COPTIC AIN +2CB7 ; Changes_When_Uppercased # L& COPTIC SMALL LETTER CRYPTOGRAMMIC EIE +2CB9 ; Changes_When_Uppercased # L& COPTIC SMALL LETTER DIALECT-P KAPA +2CBB ; Changes_When_Uppercased # L& COPTIC SMALL LETTER DIALECT-P NI +2CBD ; Changes_When_Uppercased # L& COPTIC SMALL LETTER CRYPTOGRAMMIC NI +2CBF ; Changes_When_Uppercased # L& COPTIC SMALL LETTER OLD COPTIC OOU +2CC1 ; Changes_When_Uppercased # L& COPTIC SMALL LETTER SAMPI +2CC3 ; Changes_When_Uppercased # L& COPTIC SMALL LETTER CROSSED SHEI +2CC5 ; Changes_When_Uppercased # L& COPTIC SMALL LETTER OLD COPTIC SHEI +2CC7 ; Changes_When_Uppercased # L& COPTIC SMALL LETTER OLD COPTIC ESH +2CC9 ; Changes_When_Uppercased # L& COPTIC SMALL LETTER AKHMIMIC KHEI +2CCB ; Changes_When_Uppercased # L& COPTIC SMALL LETTER DIALECT-P HORI +2CCD ; Changes_When_Uppercased # L& COPTIC SMALL LETTER OLD COPTIC HORI +2CCF ; Changes_When_Uppercased # L& COPTIC SMALL LETTER OLD COPTIC HA +2CD1 ; Changes_When_Uppercased # L& COPTIC SMALL LETTER L-SHAPED HA +2CD3 ; Changes_When_Uppercased # L& COPTIC SMALL LETTER OLD COPTIC HEI +2CD5 ; Changes_When_Uppercased # L& COPTIC SMALL LETTER OLD COPTIC HAT +2CD7 ; Changes_When_Uppercased # L& COPTIC SMALL LETTER OLD COPTIC GANGIA +2CD9 ; Changes_When_Uppercased # L& COPTIC SMALL LETTER OLD COPTIC DJA +2CDB ; Changes_When_Uppercased # L& COPTIC SMALL LETTER OLD COPTIC SHIMA +2CDD ; Changes_When_Uppercased # L& COPTIC SMALL LETTER OLD NUBIAN SHIMA +2CDF ; Changes_When_Uppercased # L& COPTIC SMALL LETTER OLD NUBIAN NGI +2CE1 ; Changes_When_Uppercased # L& COPTIC SMALL LETTER OLD NUBIAN NYI +2CE3 ; Changes_When_Uppercased # L& COPTIC SMALL LETTER OLD NUBIAN WAU +2CEC ; Changes_When_Uppercased # L& COPTIC SMALL LETTER CRYPTOGRAMMIC SHEI +2CEE ; Changes_When_Uppercased # L& COPTIC SMALL LETTER CRYPTOGRAMMIC GANGIA +2CF3 ; Changes_When_Uppercased # L& COPTIC SMALL LETTER BOHAIRIC KHEI +2D00..2D25 ; Changes_When_Uppercased # L& [38] GEORGIAN SMALL LETTER AN..GEORGIAN SMALL LETTER HOE +2D27 ; Changes_When_Uppercased # L& GEORGIAN SMALL LETTER YN +2D2D ; Changes_When_Uppercased # L& GEORGIAN SMALL LETTER AEN +A641 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER ZEMLYA +A643 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER DZELO +A645 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER REVERSED DZE +A647 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER IOTA +A649 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER DJERV +A64B ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER MONOGRAPH UK +A64D ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER BROAD OMEGA +A64F ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER NEUTRAL YER +A651 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER YERU WITH BACK YER +A653 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER IOTIFIED YAT +A655 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER REVERSED YU +A657 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER IOTIFIED A +A659 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER CLOSED LITTLE YUS +A65B ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER BLENDED YUS +A65D ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER IOTIFIED CLOSED LITTLE YUS +A65F ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER YN +A661 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER REVERSED TSE +A663 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER SOFT DE +A665 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER SOFT EL +A667 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER SOFT EM +A669 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER MONOCULAR O +A66B ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER BINOCULAR O +A66D ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER DOUBLE MONOCULAR O +A681 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER DWE +A683 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER DZWE +A685 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER ZHWE +A687 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER CCHE +A689 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER DZZE +A68B ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER TE WITH MIDDLE HOOK +A68D ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER TWE +A68F ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER TSWE +A691 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER TSSE +A693 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER TCHE +A695 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER HWE +A697 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER SHWE +A699 ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER DOUBLE O +A69B ; Changes_When_Uppercased # L& CYRILLIC SMALL LETTER CROSSED O +A723 ; Changes_When_Uppercased # L& LATIN SMALL LETTER EGYPTOLOGICAL ALEF +A725 ; Changes_When_Uppercased # L& LATIN SMALL LETTER EGYPTOLOGICAL AIN +A727 ; Changes_When_Uppercased # L& LATIN SMALL LETTER HENG +A729 ; Changes_When_Uppercased # L& LATIN SMALL LETTER TZ +A72B ; Changes_When_Uppercased # L& LATIN SMALL LETTER TRESILLO +A72D ; Changes_When_Uppercased # L& LATIN SMALL LETTER CUATRILLO +A72F ; Changes_When_Uppercased # L& LATIN SMALL LETTER CUATRILLO WITH COMMA +A733 ; Changes_When_Uppercased # L& LATIN SMALL LETTER AA +A735 ; Changes_When_Uppercased # L& LATIN SMALL LETTER AO +A737 ; Changes_When_Uppercased # L& LATIN SMALL LETTER AU +A739 ; Changes_When_Uppercased # L& LATIN SMALL LETTER AV +A73B ; Changes_When_Uppercased # L& LATIN SMALL LETTER AV WITH HORIZONTAL BAR +A73D ; Changes_When_Uppercased # L& LATIN SMALL LETTER AY +A73F ; Changes_When_Uppercased # L& LATIN SMALL LETTER REVERSED C WITH DOT +A741 ; Changes_When_Uppercased # L& LATIN SMALL LETTER K WITH STROKE +A743 ; Changes_When_Uppercased # L& LATIN SMALL LETTER K WITH DIAGONAL STROKE +A745 ; Changes_When_Uppercased # L& LATIN SMALL LETTER K WITH STROKE AND DIAGONAL STROKE +A747 ; Changes_When_Uppercased # L& LATIN SMALL LETTER BROKEN L +A749 ; Changes_When_Uppercased # L& LATIN SMALL LETTER L WITH HIGH STROKE +A74B ; Changes_When_Uppercased # L& LATIN SMALL LETTER O WITH LONG STROKE OVERLAY +A74D ; Changes_When_Uppercased # L& LATIN SMALL LETTER O WITH LOOP +A74F ; Changes_When_Uppercased # L& LATIN SMALL LETTER OO +A751 ; Changes_When_Uppercased # L& LATIN SMALL LETTER P WITH STROKE THROUGH DESCENDER +A753 ; Changes_When_Uppercased # L& LATIN SMALL LETTER P WITH FLOURISH +A755 ; Changes_When_Uppercased # L& LATIN SMALL LETTER P WITH SQUIRREL TAIL +A757 ; Changes_When_Uppercased # L& LATIN SMALL LETTER Q WITH STROKE THROUGH DESCENDER +A759 ; Changes_When_Uppercased # L& LATIN SMALL LETTER Q WITH DIAGONAL STROKE +A75B ; Changes_When_Uppercased # L& LATIN SMALL LETTER R ROTUNDA +A75D ; Changes_When_Uppercased # L& LATIN SMALL LETTER RUM ROTUNDA +A75F ; Changes_When_Uppercased # L& LATIN SMALL LETTER V WITH DIAGONAL STROKE +A761 ; Changes_When_Uppercased # L& LATIN SMALL LETTER VY +A763 ; Changes_When_Uppercased # L& LATIN SMALL LETTER VISIGOTHIC Z +A765 ; Changes_When_Uppercased # L& LATIN SMALL LETTER THORN WITH STROKE +A767 ; Changes_When_Uppercased # L& LATIN SMALL LETTER THORN WITH STROKE THROUGH DESCENDER +A769 ; Changes_When_Uppercased # L& LATIN SMALL LETTER VEND +A76B ; Changes_When_Uppercased # L& LATIN SMALL LETTER ET +A76D ; Changes_When_Uppercased # L& LATIN SMALL LETTER IS +A76F ; Changes_When_Uppercased # L& LATIN SMALL LETTER CON +A77A ; Changes_When_Uppercased # L& LATIN SMALL LETTER INSULAR D +A77C ; Changes_When_Uppercased # L& LATIN SMALL LETTER INSULAR F +A77F ; Changes_When_Uppercased # L& LATIN SMALL LETTER TURNED INSULAR G +A781 ; Changes_When_Uppercased # L& LATIN SMALL LETTER TURNED L +A783 ; Changes_When_Uppercased # L& LATIN SMALL LETTER INSULAR R +A785 ; Changes_When_Uppercased # L& LATIN SMALL LETTER INSULAR S +A787 ; Changes_When_Uppercased # L& LATIN SMALL LETTER INSULAR T +A78C ; Changes_When_Uppercased # L& LATIN SMALL LETTER SALTILLO +A791 ; Changes_When_Uppercased # L& LATIN SMALL LETTER N WITH DESCENDER +A793 ; Changes_When_Uppercased # L& LATIN SMALL LETTER C WITH BAR +A797 ; Changes_When_Uppercased # L& LATIN SMALL LETTER B WITH FLOURISH +A799 ; Changes_When_Uppercased # L& LATIN SMALL LETTER F WITH STROKE +A79B ; Changes_When_Uppercased # L& LATIN SMALL LETTER VOLAPUK AE +A79D ; Changes_When_Uppercased # L& LATIN SMALL LETTER VOLAPUK OE +A79F ; Changes_When_Uppercased # L& LATIN SMALL LETTER VOLAPUK UE +A7A1 ; Changes_When_Uppercased # L& LATIN SMALL LETTER G WITH OBLIQUE STROKE +A7A3 ; Changes_When_Uppercased # L& LATIN SMALL LETTER K WITH OBLIQUE STROKE +A7A5 ; Changes_When_Uppercased # L& LATIN SMALL LETTER N WITH OBLIQUE STROKE +A7A7 ; Changes_When_Uppercased # L& LATIN SMALL LETTER R WITH OBLIQUE STROKE +A7A9 ; Changes_When_Uppercased # L& LATIN SMALL LETTER S WITH OBLIQUE STROKE +A7B5 ; Changes_When_Uppercased # L& LATIN SMALL LETTER BETA +A7B7 ; Changes_When_Uppercased # L& LATIN SMALL LETTER OMEGA +A7B9 ; Changes_When_Uppercased # L& LATIN SMALL LETTER U WITH STROKE +AB53 ; Changes_When_Uppercased # L& LATIN SMALL LETTER CHI +AB70..ABBF ; Changes_When_Uppercased # L& [80] CHEROKEE SMALL LETTER A..CHEROKEE SMALL LETTER YA +FB00..FB06 ; Changes_When_Uppercased # L& [7] LATIN SMALL LIGATURE FF..LATIN SMALL LIGATURE ST +FB13..FB17 ; Changes_When_Uppercased # L& [5] ARMENIAN SMALL LIGATURE MEN NOW..ARMENIAN SMALL LIGATURE MEN XEH +FF41..FF5A ; Changes_When_Uppercased # L& [26] FULLWIDTH LATIN SMALL LETTER A..FULLWIDTH LATIN SMALL LETTER Z +10428..1044F ; Changes_When_Uppercased # L& [40] DESERET SMALL LETTER LONG I..DESERET SMALL LETTER EW +104D8..104FB ; Changes_When_Uppercased # L& [36] OSAGE SMALL LETTER A..OSAGE SMALL LETTER ZHA +10CC0..10CF2 ; Changes_When_Uppercased # L& [51] OLD HUNGARIAN SMALL LETTER A..OLD HUNGARIAN SMALL LETTER US +118C0..118DF ; Changes_When_Uppercased # L& [32] WARANG CITI SMALL LETTER NGAA..WARANG CITI SMALL LETTER VIYO +16E60..16E7F ; Changes_When_Uppercased # L& [32] MEDEFAIDRIN SMALL LETTER M..MEDEFAIDRIN SMALL LETTER Y +1E922..1E943 ; Changes_When_Uppercased # L& [34] ADLAM SMALL LETTER ALIF..ADLAM SMALL LETTER SHA + +# Total code points: 1475 + +# ================================================ + +# Derived Property: Changes_When_Titlecased (CWT) +# Characters whose normalized forms are not stable under a toTitlecase mapping. +# For more information, see D141 in Section 3.13, "Default Case Algorithms". +# Changes_When_Titlecased(X) is true when toTitlecase(toNFD(X)) != toNFD(X) + +0061..007A ; Changes_When_Titlecased # L& [26] LATIN SMALL LETTER A..LATIN SMALL LETTER Z +00B5 ; Changes_When_Titlecased # L& MICRO SIGN +00DF..00F6 ; Changes_When_Titlecased # L& [24] LATIN SMALL LETTER SHARP S..LATIN SMALL LETTER O WITH DIAERESIS +00F8..00FF ; Changes_When_Titlecased # L& [8] LATIN SMALL LETTER O WITH STROKE..LATIN SMALL LETTER Y WITH DIAERESIS +0101 ; Changes_When_Titlecased # L& LATIN SMALL LETTER A WITH MACRON +0103 ; Changes_When_Titlecased # L& LATIN SMALL LETTER A WITH BREVE +0105 ; Changes_When_Titlecased # L& LATIN SMALL LETTER A WITH OGONEK +0107 ; Changes_When_Titlecased # L& LATIN SMALL LETTER C WITH ACUTE +0109 ; Changes_When_Titlecased # L& LATIN SMALL LETTER C WITH CIRCUMFLEX +010B ; Changes_When_Titlecased # L& LATIN SMALL LETTER C WITH DOT ABOVE +010D ; Changes_When_Titlecased # L& LATIN SMALL LETTER C WITH CARON +010F ; Changes_When_Titlecased # L& LATIN SMALL LETTER D WITH CARON +0111 ; Changes_When_Titlecased # L& LATIN SMALL LETTER D WITH STROKE +0113 ; Changes_When_Titlecased # L& LATIN SMALL LETTER E WITH MACRON +0115 ; Changes_When_Titlecased # L& LATIN SMALL LETTER E WITH BREVE +0117 ; Changes_When_Titlecased # L& LATIN SMALL LETTER E WITH DOT ABOVE +0119 ; Changes_When_Titlecased # L& LATIN SMALL LETTER E WITH OGONEK +011B ; Changes_When_Titlecased # L& LATIN SMALL LETTER E WITH CARON +011D ; Changes_When_Titlecased # L& LATIN SMALL LETTER G WITH CIRCUMFLEX +011F ; Changes_When_Titlecased # L& LATIN SMALL LETTER G WITH BREVE +0121 ; Changes_When_Titlecased # L& LATIN SMALL LETTER G WITH DOT ABOVE +0123 ; Changes_When_Titlecased # L& LATIN SMALL LETTER G WITH CEDILLA +0125 ; Changes_When_Titlecased # L& LATIN SMALL LETTER H WITH CIRCUMFLEX +0127 ; Changes_When_Titlecased # L& LATIN SMALL LETTER H WITH STROKE +0129 ; Changes_When_Titlecased # L& LATIN SMALL LETTER I WITH TILDE +012B ; Changes_When_Titlecased # L& LATIN SMALL LETTER I WITH MACRON +012D ; Changes_When_Titlecased # L& LATIN SMALL LETTER I WITH BREVE +012F ; Changes_When_Titlecased # L& LATIN SMALL LETTER I WITH OGONEK +0131 ; Changes_When_Titlecased # L& LATIN SMALL LETTER DOTLESS I +0133 ; Changes_When_Titlecased # L& LATIN SMALL LIGATURE IJ +0135 ; Changes_When_Titlecased # L& LATIN SMALL LETTER J WITH CIRCUMFLEX +0137 ; Changes_When_Titlecased # L& LATIN SMALL LETTER K WITH CEDILLA +013A ; Changes_When_Titlecased # L& LATIN SMALL LETTER L WITH ACUTE +013C ; Changes_When_Titlecased # L& LATIN SMALL LETTER L WITH CEDILLA +013E ; Changes_When_Titlecased # L& LATIN SMALL LETTER L WITH CARON +0140 ; Changes_When_Titlecased # L& LATIN SMALL LETTER L WITH MIDDLE DOT +0142 ; Changes_When_Titlecased # L& LATIN SMALL LETTER L WITH STROKE +0144 ; Changes_When_Titlecased # L& LATIN SMALL LETTER N WITH ACUTE +0146 ; Changes_When_Titlecased # L& LATIN SMALL LETTER N WITH CEDILLA +0148..0149 ; Changes_When_Titlecased # L& [2] LATIN SMALL LETTER N WITH CARON..LATIN SMALL LETTER N PRECEDED BY APOSTROPHE +014B ; Changes_When_Titlecased # L& LATIN SMALL LETTER ENG +014D ; Changes_When_Titlecased # L& LATIN SMALL LETTER O WITH MACRON +014F ; Changes_When_Titlecased # L& LATIN SMALL LETTER O WITH BREVE +0151 ; Changes_When_Titlecased # L& LATIN SMALL LETTER O WITH DOUBLE ACUTE +0153 ; Changes_When_Titlecased # L& LATIN SMALL LIGATURE OE +0155 ; Changes_When_Titlecased # L& LATIN SMALL LETTER R WITH ACUTE +0157 ; Changes_When_Titlecased # L& LATIN SMALL LETTER R WITH CEDILLA +0159 ; Changes_When_Titlecased # L& LATIN SMALL LETTER R WITH CARON +015B ; Changes_When_Titlecased # L& LATIN SMALL LETTER S WITH ACUTE +015D ; Changes_When_Titlecased # L& LATIN SMALL LETTER S WITH CIRCUMFLEX +015F ; Changes_When_Titlecased # L& LATIN SMALL LETTER S WITH CEDILLA +0161 ; Changes_When_Titlecased # L& LATIN SMALL LETTER S WITH CARON +0163 ; Changes_When_Titlecased # L& LATIN SMALL LETTER T WITH CEDILLA +0165 ; Changes_When_Titlecased # L& LATIN SMALL LETTER T WITH CARON +0167 ; Changes_When_Titlecased # L& LATIN SMALL LETTER T WITH STROKE +0169 ; Changes_When_Titlecased # L& LATIN SMALL LETTER U WITH TILDE +016B ; Changes_When_Titlecased # L& LATIN SMALL LETTER U WITH MACRON +016D ; Changes_When_Titlecased # L& LATIN SMALL LETTER U WITH BREVE +016F ; Changes_When_Titlecased # L& LATIN SMALL LETTER U WITH RING ABOVE +0171 ; Changes_When_Titlecased # L& LATIN SMALL LETTER U WITH DOUBLE ACUTE +0173 ; Changes_When_Titlecased # L& LATIN SMALL LETTER U WITH OGONEK +0175 ; Changes_When_Titlecased # L& LATIN SMALL LETTER W WITH CIRCUMFLEX +0177 ; Changes_When_Titlecased # L& LATIN SMALL LETTER Y WITH CIRCUMFLEX +017A ; Changes_When_Titlecased # L& LATIN SMALL LETTER Z WITH ACUTE +017C ; Changes_When_Titlecased # L& LATIN SMALL LETTER Z WITH DOT ABOVE +017E..0180 ; Changes_When_Titlecased # L& [3] LATIN SMALL LETTER Z WITH CARON..LATIN SMALL LETTER B WITH STROKE +0183 ; Changes_When_Titlecased # L& LATIN SMALL LETTER B WITH TOPBAR +0185 ; Changes_When_Titlecased # L& LATIN SMALL LETTER TONE SIX +0188 ; Changes_When_Titlecased # L& LATIN SMALL LETTER C WITH HOOK +018C ; Changes_When_Titlecased # L& LATIN SMALL LETTER D WITH TOPBAR +0192 ; Changes_When_Titlecased # L& LATIN SMALL LETTER F WITH HOOK +0195 ; Changes_When_Titlecased # L& LATIN SMALL LETTER HV +0199..019A ; Changes_When_Titlecased # L& [2] LATIN SMALL LETTER K WITH HOOK..LATIN SMALL LETTER L WITH BAR +019E ; Changes_When_Titlecased # L& LATIN SMALL LETTER N WITH LONG RIGHT LEG +01A1 ; Changes_When_Titlecased # L& LATIN SMALL LETTER O WITH HORN +01A3 ; Changes_When_Titlecased # L& LATIN SMALL LETTER OI +01A5 ; Changes_When_Titlecased # L& LATIN SMALL LETTER P WITH HOOK +01A8 ; Changes_When_Titlecased # L& LATIN SMALL LETTER TONE TWO +01AD ; Changes_When_Titlecased # L& LATIN SMALL LETTER T WITH HOOK +01B0 ; Changes_When_Titlecased # L& LATIN SMALL LETTER U WITH HORN +01B4 ; Changes_When_Titlecased # L& LATIN SMALL LETTER Y WITH HOOK +01B6 ; Changes_When_Titlecased # L& LATIN SMALL LETTER Z WITH STROKE +01B9 ; Changes_When_Titlecased # L& LATIN SMALL LETTER EZH REVERSED +01BD ; Changes_When_Titlecased # L& LATIN SMALL LETTER TONE FIVE +01BF ; Changes_When_Titlecased # L& LATIN LETTER WYNN +01C4 ; Changes_When_Titlecased # L& LATIN CAPITAL LETTER DZ WITH CARON +01C6..01C7 ; Changes_When_Titlecased # L& [2] LATIN SMALL LETTER DZ WITH CARON..LATIN CAPITAL LETTER LJ +01C9..01CA ; Changes_When_Titlecased # L& [2] LATIN SMALL LETTER LJ..LATIN CAPITAL LETTER NJ +01CC ; Changes_When_Titlecased # L& LATIN SMALL LETTER NJ +01CE ; Changes_When_Titlecased # L& LATIN SMALL LETTER A WITH CARON +01D0 ; Changes_When_Titlecased # L& LATIN SMALL LETTER I WITH CARON +01D2 ; Changes_When_Titlecased # L& LATIN SMALL LETTER O WITH CARON +01D4 ; Changes_When_Titlecased # L& LATIN SMALL LETTER U WITH CARON +01D6 ; Changes_When_Titlecased # L& LATIN SMALL LETTER U WITH DIAERESIS AND MACRON +01D8 ; Changes_When_Titlecased # L& LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE +01DA ; Changes_When_Titlecased # L& LATIN SMALL LETTER U WITH DIAERESIS AND CARON +01DC..01DD ; Changes_When_Titlecased # L& [2] LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE..LATIN SMALL LETTER TURNED E +01DF ; Changes_When_Titlecased # L& LATIN SMALL LETTER A WITH DIAERESIS AND MACRON +01E1 ; Changes_When_Titlecased # L& LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON +01E3 ; Changes_When_Titlecased # L& LATIN SMALL LETTER AE WITH MACRON +01E5 ; Changes_When_Titlecased # L& LATIN SMALL LETTER G WITH STROKE +01E7 ; Changes_When_Titlecased # L& LATIN SMALL LETTER G WITH CARON +01E9 ; Changes_When_Titlecased # L& LATIN SMALL LETTER K WITH CARON +01EB ; Changes_When_Titlecased # L& LATIN SMALL LETTER O WITH OGONEK +01ED ; Changes_When_Titlecased # L& LATIN SMALL LETTER O WITH OGONEK AND MACRON +01EF..01F1 ; Changes_When_Titlecased # L& [3] LATIN SMALL LETTER EZH WITH CARON..LATIN CAPITAL LETTER DZ +01F3 ; Changes_When_Titlecased # L& LATIN SMALL LETTER DZ +01F5 ; Changes_When_Titlecased # L& LATIN SMALL LETTER G WITH ACUTE +01F9 ; Changes_When_Titlecased # L& LATIN SMALL LETTER N WITH GRAVE +01FB ; Changes_When_Titlecased # L& LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE +01FD ; Changes_When_Titlecased # L& LATIN SMALL LETTER AE WITH ACUTE +01FF ; Changes_When_Titlecased # L& LATIN SMALL LETTER O WITH STROKE AND ACUTE +0201 ; Changes_When_Titlecased # L& LATIN SMALL LETTER A WITH DOUBLE GRAVE +0203 ; Changes_When_Titlecased # L& LATIN SMALL LETTER A WITH INVERTED BREVE +0205 ; Changes_When_Titlecased # L& LATIN SMALL LETTER E WITH DOUBLE GRAVE +0207 ; Changes_When_Titlecased # L& LATIN SMALL LETTER E WITH INVERTED BREVE +0209 ; Changes_When_Titlecased # L& LATIN SMALL LETTER I WITH DOUBLE GRAVE +020B ; Changes_When_Titlecased # L& LATIN SMALL LETTER I WITH INVERTED BREVE +020D ; Changes_When_Titlecased # L& LATIN SMALL LETTER O WITH DOUBLE GRAVE +020F ; Changes_When_Titlecased # L& LATIN SMALL LETTER O WITH INVERTED BREVE +0211 ; Changes_When_Titlecased # L& LATIN SMALL LETTER R WITH DOUBLE GRAVE +0213 ; Changes_When_Titlecased # L& LATIN SMALL LETTER R WITH INVERTED BREVE +0215 ; Changes_When_Titlecased # L& LATIN SMALL LETTER U WITH DOUBLE GRAVE +0217 ; Changes_When_Titlecased # L& LATIN SMALL LETTER U WITH INVERTED BREVE +0219 ; Changes_When_Titlecased # L& LATIN SMALL LETTER S WITH COMMA BELOW +021B ; Changes_When_Titlecased # L& LATIN SMALL LETTER T WITH COMMA BELOW +021D ; Changes_When_Titlecased # L& LATIN SMALL LETTER YOGH +021F ; Changes_When_Titlecased # L& LATIN SMALL LETTER H WITH CARON +0223 ; Changes_When_Titlecased # L& LATIN SMALL LETTER OU +0225 ; Changes_When_Titlecased # L& LATIN SMALL LETTER Z WITH HOOK +0227 ; Changes_When_Titlecased # L& LATIN SMALL LETTER A WITH DOT ABOVE +0229 ; Changes_When_Titlecased # L& LATIN SMALL LETTER E WITH CEDILLA +022B ; Changes_When_Titlecased # L& LATIN SMALL LETTER O WITH DIAERESIS AND MACRON +022D ; Changes_When_Titlecased # L& LATIN SMALL LETTER O WITH TILDE AND MACRON +022F ; Changes_When_Titlecased # L& LATIN SMALL LETTER O WITH DOT ABOVE +0231 ; Changes_When_Titlecased # L& LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON +0233 ; Changes_When_Titlecased # L& LATIN SMALL LETTER Y WITH MACRON +023C ; Changes_When_Titlecased # L& LATIN SMALL LETTER C WITH STROKE +023F..0240 ; Changes_When_Titlecased # L& [2] LATIN SMALL LETTER S WITH SWASH TAIL..LATIN SMALL LETTER Z WITH SWASH TAIL +0242 ; Changes_When_Titlecased # L& LATIN SMALL LETTER GLOTTAL STOP +0247 ; Changes_When_Titlecased # L& LATIN SMALL LETTER E WITH STROKE +0249 ; Changes_When_Titlecased # L& LATIN SMALL LETTER J WITH STROKE +024B ; Changes_When_Titlecased # L& LATIN SMALL LETTER Q WITH HOOK TAIL +024D ; Changes_When_Titlecased # L& LATIN SMALL LETTER R WITH STROKE +024F..0254 ; Changes_When_Titlecased # L& [6] LATIN SMALL LETTER Y WITH STROKE..LATIN SMALL LETTER OPEN O +0256..0257 ; Changes_When_Titlecased # L& [2] LATIN SMALL LETTER D WITH TAIL..LATIN SMALL LETTER D WITH HOOK +0259 ; Changes_When_Titlecased # L& LATIN SMALL LETTER SCHWA +025B..025C ; Changes_When_Titlecased # L& [2] LATIN SMALL LETTER OPEN E..LATIN SMALL LETTER REVERSED OPEN E +0260..0261 ; Changes_When_Titlecased # L& [2] LATIN SMALL LETTER G WITH HOOK..LATIN SMALL LETTER SCRIPT G +0263 ; Changes_When_Titlecased # L& LATIN SMALL LETTER GAMMA +0265..0266 ; Changes_When_Titlecased # L& [2] LATIN SMALL LETTER TURNED H..LATIN SMALL LETTER H WITH HOOK +0268..026C ; Changes_When_Titlecased # L& [5] LATIN SMALL LETTER I WITH STROKE..LATIN SMALL LETTER L WITH BELT +026F ; Changes_When_Titlecased # L& LATIN SMALL LETTER TURNED M +0271..0272 ; Changes_When_Titlecased # L& [2] LATIN SMALL LETTER M WITH HOOK..LATIN SMALL LETTER N WITH LEFT HOOK +0275 ; Changes_When_Titlecased # L& LATIN SMALL LETTER BARRED O +027D ; Changes_When_Titlecased # L& LATIN SMALL LETTER R WITH TAIL +0280 ; Changes_When_Titlecased # L& LATIN LETTER SMALL CAPITAL R +0283 ; Changes_When_Titlecased # L& LATIN SMALL LETTER ESH +0287..028C ; Changes_When_Titlecased # L& [6] LATIN SMALL LETTER TURNED T..LATIN SMALL LETTER TURNED V +0292 ; Changes_When_Titlecased # L& LATIN SMALL LETTER EZH +029D..029E ; Changes_When_Titlecased # L& [2] LATIN SMALL LETTER J WITH CROSSED-TAIL..LATIN SMALL LETTER TURNED K +0345 ; Changes_When_Titlecased # Mn COMBINING GREEK YPOGEGRAMMENI +0371 ; Changes_When_Titlecased # L& GREEK SMALL LETTER HETA +0373 ; Changes_When_Titlecased # L& GREEK SMALL LETTER ARCHAIC SAMPI +0377 ; Changes_When_Titlecased # L& GREEK SMALL LETTER PAMPHYLIAN DIGAMMA +037B..037D ; Changes_When_Titlecased # L& [3] GREEK SMALL REVERSED LUNATE SIGMA SYMBOL..GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL +0390 ; Changes_When_Titlecased # L& GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS +03AC..03CE ; Changes_When_Titlecased # L& [35] GREEK SMALL LETTER ALPHA WITH TONOS..GREEK SMALL LETTER OMEGA WITH TONOS +03D0..03D1 ; Changes_When_Titlecased # L& [2] GREEK BETA SYMBOL..GREEK THETA SYMBOL +03D5..03D7 ; Changes_When_Titlecased # L& [3] GREEK PHI SYMBOL..GREEK KAI SYMBOL +03D9 ; Changes_When_Titlecased # L& GREEK SMALL LETTER ARCHAIC KOPPA +03DB ; Changes_When_Titlecased # L& GREEK SMALL LETTER STIGMA +03DD ; Changes_When_Titlecased # L& GREEK SMALL LETTER DIGAMMA +03DF ; Changes_When_Titlecased # L& GREEK SMALL LETTER KOPPA +03E1 ; Changes_When_Titlecased # L& GREEK SMALL LETTER SAMPI +03E3 ; Changes_When_Titlecased # L& COPTIC SMALL LETTER SHEI +03E5 ; Changes_When_Titlecased # L& COPTIC SMALL LETTER FEI +03E7 ; Changes_When_Titlecased # L& COPTIC SMALL LETTER KHEI +03E9 ; Changes_When_Titlecased # L& COPTIC SMALL LETTER HORI +03EB ; Changes_When_Titlecased # L& COPTIC SMALL LETTER GANGIA +03ED ; Changes_When_Titlecased # L& COPTIC SMALL LETTER SHIMA +03EF..03F3 ; Changes_When_Titlecased # L& [5] COPTIC SMALL LETTER DEI..GREEK LETTER YOT +03F5 ; Changes_When_Titlecased # L& GREEK LUNATE EPSILON SYMBOL +03F8 ; Changes_When_Titlecased # L& GREEK SMALL LETTER SHO +03FB ; Changes_When_Titlecased # L& GREEK SMALL LETTER SAN +0430..045F ; Changes_When_Titlecased # L& [48] CYRILLIC SMALL LETTER A..CYRILLIC SMALL LETTER DZHE +0461 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER OMEGA +0463 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER YAT +0465 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER IOTIFIED E +0467 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER LITTLE YUS +0469 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER IOTIFIED LITTLE YUS +046B ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER BIG YUS +046D ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER IOTIFIED BIG YUS +046F ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER KSI +0471 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER PSI +0473 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER FITA +0475 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER IZHITSA +0477 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT +0479 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER UK +047B ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER ROUND OMEGA +047D ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER OMEGA WITH TITLO +047F ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER OT +0481 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER KOPPA +048B ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER SHORT I WITH TAIL +048D ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER SEMISOFT SIGN +048F ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER ER WITH TICK +0491 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER GHE WITH UPTURN +0493 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER GHE WITH STROKE +0495 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER GHE WITH MIDDLE HOOK +0497 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER ZHE WITH DESCENDER +0499 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER ZE WITH DESCENDER +049B ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER KA WITH DESCENDER +049D ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE +049F ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER KA WITH STROKE +04A1 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER BASHKIR KA +04A3 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER EN WITH DESCENDER +04A5 ; Changes_When_Titlecased # L& CYRILLIC SMALL LIGATURE EN GHE +04A7 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER PE WITH MIDDLE HOOK +04A9 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER ABKHASIAN HA +04AB ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER ES WITH DESCENDER +04AD ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER TE WITH DESCENDER +04AF ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER STRAIGHT U +04B1 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE +04B3 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER HA WITH DESCENDER +04B5 ; Changes_When_Titlecased # L& CYRILLIC SMALL LIGATURE TE TSE +04B7 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER CHE WITH DESCENDER +04B9 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE +04BB ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER SHHA +04BD ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER ABKHASIAN CHE +04BF ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER +04C2 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER ZHE WITH BREVE +04C4 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER KA WITH HOOK +04C6 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER EL WITH TAIL +04C8 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER EN WITH HOOK +04CA ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER EN WITH TAIL +04CC ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER KHAKASSIAN CHE +04CE..04CF ; Changes_When_Titlecased # L& [2] CYRILLIC SMALL LETTER EM WITH TAIL..CYRILLIC SMALL LETTER PALOCHKA +04D1 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER A WITH BREVE +04D3 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER A WITH DIAERESIS +04D5 ; Changes_When_Titlecased # L& CYRILLIC SMALL LIGATURE A IE +04D7 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER IE WITH BREVE +04D9 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER SCHWA +04DB ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS +04DD ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER ZHE WITH DIAERESIS +04DF ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER ZE WITH DIAERESIS +04E1 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER ABKHASIAN DZE +04E3 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER I WITH MACRON +04E5 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER I WITH DIAERESIS +04E7 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER O WITH DIAERESIS +04E9 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER BARRED O +04EB ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS +04ED ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER E WITH DIAERESIS +04EF ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER U WITH MACRON +04F1 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER U WITH DIAERESIS +04F3 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE +04F5 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER CHE WITH DIAERESIS +04F7 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER GHE WITH DESCENDER +04F9 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER YERU WITH DIAERESIS +04FB ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER GHE WITH STROKE AND HOOK +04FD ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER HA WITH HOOK +04FF ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER HA WITH STROKE +0501 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER KOMI DE +0503 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER KOMI DJE +0505 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER KOMI ZJE +0507 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER KOMI DZJE +0509 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER KOMI LJE +050B ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER KOMI NJE +050D ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER KOMI SJE +050F ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER KOMI TJE +0511 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER REVERSED ZE +0513 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER EL WITH HOOK +0515 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER LHA +0517 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER RHA +0519 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER YAE +051B ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER QA +051D ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER WE +051F ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER ALEUT KA +0521 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER EL WITH MIDDLE HOOK +0523 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER EN WITH MIDDLE HOOK +0525 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER PE WITH DESCENDER +0527 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER SHHA WITH DESCENDER +0529 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER EN WITH LEFT HOOK +052B ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER DZZHE +052D ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER DCHE +052F ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER EL WITH DESCENDER +0561..0587 ; Changes_When_Titlecased # L& [39] ARMENIAN SMALL LETTER AYB..ARMENIAN SMALL LIGATURE ECH YIWN +13F8..13FD ; Changes_When_Titlecased # L& [6] CHEROKEE SMALL LETTER YE..CHEROKEE SMALL LETTER MV +1C80..1C88 ; Changes_When_Titlecased # L& [9] CYRILLIC SMALL LETTER ROUNDED VE..CYRILLIC SMALL LETTER UNBLENDED UK +1D79 ; Changes_When_Titlecased # L& LATIN SMALL LETTER INSULAR G +1D7D ; Changes_When_Titlecased # L& LATIN SMALL LETTER P WITH STROKE +1E01 ; Changes_When_Titlecased # L& LATIN SMALL LETTER A WITH RING BELOW +1E03 ; Changes_When_Titlecased # L& LATIN SMALL LETTER B WITH DOT ABOVE +1E05 ; Changes_When_Titlecased # L& LATIN SMALL LETTER B WITH DOT BELOW +1E07 ; Changes_When_Titlecased # L& LATIN SMALL LETTER B WITH LINE BELOW +1E09 ; Changes_When_Titlecased # L& LATIN SMALL LETTER C WITH CEDILLA AND ACUTE +1E0B ; Changes_When_Titlecased # L& LATIN SMALL LETTER D WITH DOT ABOVE +1E0D ; Changes_When_Titlecased # L& LATIN SMALL LETTER D WITH DOT BELOW +1E0F ; Changes_When_Titlecased # L& LATIN SMALL LETTER D WITH LINE BELOW +1E11 ; Changes_When_Titlecased # L& LATIN SMALL LETTER D WITH CEDILLA +1E13 ; Changes_When_Titlecased # L& LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW +1E15 ; Changes_When_Titlecased # L& LATIN SMALL LETTER E WITH MACRON AND GRAVE +1E17 ; Changes_When_Titlecased # L& LATIN SMALL LETTER E WITH MACRON AND ACUTE +1E19 ; Changes_When_Titlecased # L& LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW +1E1B ; Changes_When_Titlecased # L& LATIN SMALL LETTER E WITH TILDE BELOW +1E1D ; Changes_When_Titlecased # L& LATIN SMALL LETTER E WITH CEDILLA AND BREVE +1E1F ; Changes_When_Titlecased # L& LATIN SMALL LETTER F WITH DOT ABOVE +1E21 ; Changes_When_Titlecased # L& LATIN SMALL LETTER G WITH MACRON +1E23 ; Changes_When_Titlecased # L& LATIN SMALL LETTER H WITH DOT ABOVE +1E25 ; Changes_When_Titlecased # L& LATIN SMALL LETTER H WITH DOT BELOW +1E27 ; Changes_When_Titlecased # L& LATIN SMALL LETTER H WITH DIAERESIS +1E29 ; Changes_When_Titlecased # L& LATIN SMALL LETTER H WITH CEDILLA +1E2B ; Changes_When_Titlecased # L& LATIN SMALL LETTER H WITH BREVE BELOW +1E2D ; Changes_When_Titlecased # L& LATIN SMALL LETTER I WITH TILDE BELOW +1E2F ; Changes_When_Titlecased # L& LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE +1E31 ; Changes_When_Titlecased # L& LATIN SMALL LETTER K WITH ACUTE +1E33 ; Changes_When_Titlecased # L& LATIN SMALL LETTER K WITH DOT BELOW +1E35 ; Changes_When_Titlecased # L& LATIN SMALL LETTER K WITH LINE BELOW +1E37 ; Changes_When_Titlecased # L& LATIN SMALL LETTER L WITH DOT BELOW +1E39 ; Changes_When_Titlecased # L& LATIN SMALL LETTER L WITH DOT BELOW AND MACRON +1E3B ; Changes_When_Titlecased # L& LATIN SMALL LETTER L WITH LINE BELOW +1E3D ; Changes_When_Titlecased # L& LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW +1E3F ; Changes_When_Titlecased # L& LATIN SMALL LETTER M WITH ACUTE +1E41 ; Changes_When_Titlecased # L& LATIN SMALL LETTER M WITH DOT ABOVE +1E43 ; Changes_When_Titlecased # L& LATIN SMALL LETTER M WITH DOT BELOW +1E45 ; Changes_When_Titlecased # L& LATIN SMALL LETTER N WITH DOT ABOVE +1E47 ; Changes_When_Titlecased # L& LATIN SMALL LETTER N WITH DOT BELOW +1E49 ; Changes_When_Titlecased # L& LATIN SMALL LETTER N WITH LINE BELOW +1E4B ; Changes_When_Titlecased # L& LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW +1E4D ; Changes_When_Titlecased # L& LATIN SMALL LETTER O WITH TILDE AND ACUTE +1E4F ; Changes_When_Titlecased # L& LATIN SMALL LETTER O WITH TILDE AND DIAERESIS +1E51 ; Changes_When_Titlecased # L& LATIN SMALL LETTER O WITH MACRON AND GRAVE +1E53 ; Changes_When_Titlecased # L& LATIN SMALL LETTER O WITH MACRON AND ACUTE +1E55 ; Changes_When_Titlecased # L& LATIN SMALL LETTER P WITH ACUTE +1E57 ; Changes_When_Titlecased # L& LATIN SMALL LETTER P WITH DOT ABOVE +1E59 ; Changes_When_Titlecased # L& LATIN SMALL LETTER R WITH DOT ABOVE +1E5B ; Changes_When_Titlecased # L& LATIN SMALL LETTER R WITH DOT BELOW +1E5D ; Changes_When_Titlecased # L& LATIN SMALL LETTER R WITH DOT BELOW AND MACRON +1E5F ; Changes_When_Titlecased # L& LATIN SMALL LETTER R WITH LINE BELOW +1E61 ; Changes_When_Titlecased # L& LATIN SMALL LETTER S WITH DOT ABOVE +1E63 ; Changes_When_Titlecased # L& LATIN SMALL LETTER S WITH DOT BELOW +1E65 ; Changes_When_Titlecased # L& LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE +1E67 ; Changes_When_Titlecased # L& LATIN SMALL LETTER S WITH CARON AND DOT ABOVE +1E69 ; Changes_When_Titlecased # L& LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE +1E6B ; Changes_When_Titlecased # L& LATIN SMALL LETTER T WITH DOT ABOVE +1E6D ; Changes_When_Titlecased # L& LATIN SMALL LETTER T WITH DOT BELOW +1E6F ; Changes_When_Titlecased # L& LATIN SMALL LETTER T WITH LINE BELOW +1E71 ; Changes_When_Titlecased # L& LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW +1E73 ; Changes_When_Titlecased # L& LATIN SMALL LETTER U WITH DIAERESIS BELOW +1E75 ; Changes_When_Titlecased # L& LATIN SMALL LETTER U WITH TILDE BELOW +1E77 ; Changes_When_Titlecased # L& LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW +1E79 ; Changes_When_Titlecased # L& LATIN SMALL LETTER U WITH TILDE AND ACUTE +1E7B ; Changes_When_Titlecased # L& LATIN SMALL LETTER U WITH MACRON AND DIAERESIS +1E7D ; Changes_When_Titlecased # L& LATIN SMALL LETTER V WITH TILDE +1E7F ; Changes_When_Titlecased # L& LATIN SMALL LETTER V WITH DOT BELOW +1E81 ; Changes_When_Titlecased # L& LATIN SMALL LETTER W WITH GRAVE +1E83 ; Changes_When_Titlecased # L& LATIN SMALL LETTER W WITH ACUTE +1E85 ; Changes_When_Titlecased # L& LATIN SMALL LETTER W WITH DIAERESIS +1E87 ; Changes_When_Titlecased # L& LATIN SMALL LETTER W WITH DOT ABOVE +1E89 ; Changes_When_Titlecased # L& LATIN SMALL LETTER W WITH DOT BELOW +1E8B ; Changes_When_Titlecased # L& LATIN SMALL LETTER X WITH DOT ABOVE +1E8D ; Changes_When_Titlecased # L& LATIN SMALL LETTER X WITH DIAERESIS +1E8F ; Changes_When_Titlecased # L& LATIN SMALL LETTER Y WITH DOT ABOVE +1E91 ; Changes_When_Titlecased # L& LATIN SMALL LETTER Z WITH CIRCUMFLEX +1E93 ; Changes_When_Titlecased # L& LATIN SMALL LETTER Z WITH DOT BELOW +1E95..1E9B ; Changes_When_Titlecased # L& [7] LATIN SMALL LETTER Z WITH LINE BELOW..LATIN SMALL LETTER LONG S WITH DOT ABOVE +1EA1 ; Changes_When_Titlecased # L& LATIN SMALL LETTER A WITH DOT BELOW +1EA3 ; Changes_When_Titlecased # L& LATIN SMALL LETTER A WITH HOOK ABOVE +1EA5 ; Changes_When_Titlecased # L& LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE +1EA7 ; Changes_When_Titlecased # L& LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE +1EA9 ; Changes_When_Titlecased # L& LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE +1EAB ; Changes_When_Titlecased # L& LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE +1EAD ; Changes_When_Titlecased # L& LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW +1EAF ; Changes_When_Titlecased # L& LATIN SMALL LETTER A WITH BREVE AND ACUTE +1EB1 ; Changes_When_Titlecased # L& LATIN SMALL LETTER A WITH BREVE AND GRAVE +1EB3 ; Changes_When_Titlecased # L& LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE +1EB5 ; Changes_When_Titlecased # L& LATIN SMALL LETTER A WITH BREVE AND TILDE +1EB7 ; Changes_When_Titlecased # L& LATIN SMALL LETTER A WITH BREVE AND DOT BELOW +1EB9 ; Changes_When_Titlecased # L& LATIN SMALL LETTER E WITH DOT BELOW +1EBB ; Changes_When_Titlecased # L& LATIN SMALL LETTER E WITH HOOK ABOVE +1EBD ; Changes_When_Titlecased # L& LATIN SMALL LETTER E WITH TILDE +1EBF ; Changes_When_Titlecased # L& LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE +1EC1 ; Changes_When_Titlecased # L& LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE +1EC3 ; Changes_When_Titlecased # L& LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE +1EC5 ; Changes_When_Titlecased # L& LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE +1EC7 ; Changes_When_Titlecased # L& LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW +1EC9 ; Changes_When_Titlecased # L& LATIN SMALL LETTER I WITH HOOK ABOVE +1ECB ; Changes_When_Titlecased # L& LATIN SMALL LETTER I WITH DOT BELOW +1ECD ; Changes_When_Titlecased # L& LATIN SMALL LETTER O WITH DOT BELOW +1ECF ; Changes_When_Titlecased # L& LATIN SMALL LETTER O WITH HOOK ABOVE +1ED1 ; Changes_When_Titlecased # L& LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE +1ED3 ; Changes_When_Titlecased # L& LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE +1ED5 ; Changes_When_Titlecased # L& LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE +1ED7 ; Changes_When_Titlecased # L& LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE +1ED9 ; Changes_When_Titlecased # L& LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW +1EDB ; Changes_When_Titlecased # L& LATIN SMALL LETTER O WITH HORN AND ACUTE +1EDD ; Changes_When_Titlecased # L& LATIN SMALL LETTER O WITH HORN AND GRAVE +1EDF ; Changes_When_Titlecased # L& LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE +1EE1 ; Changes_When_Titlecased # L& LATIN SMALL LETTER O WITH HORN AND TILDE +1EE3 ; Changes_When_Titlecased # L& LATIN SMALL LETTER O WITH HORN AND DOT BELOW +1EE5 ; Changes_When_Titlecased # L& LATIN SMALL LETTER U WITH DOT BELOW +1EE7 ; Changes_When_Titlecased # L& LATIN SMALL LETTER U WITH HOOK ABOVE +1EE9 ; Changes_When_Titlecased # L& LATIN SMALL LETTER U WITH HORN AND ACUTE +1EEB ; Changes_When_Titlecased # L& LATIN SMALL LETTER U WITH HORN AND GRAVE +1EED ; Changes_When_Titlecased # L& LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE +1EEF ; Changes_When_Titlecased # L& LATIN SMALL LETTER U WITH HORN AND TILDE +1EF1 ; Changes_When_Titlecased # L& LATIN SMALL LETTER U WITH HORN AND DOT BELOW +1EF3 ; Changes_When_Titlecased # L& LATIN SMALL LETTER Y WITH GRAVE +1EF5 ; Changes_When_Titlecased # L& LATIN SMALL LETTER Y WITH DOT BELOW +1EF7 ; Changes_When_Titlecased # L& LATIN SMALL LETTER Y WITH HOOK ABOVE +1EF9 ; Changes_When_Titlecased # L& LATIN SMALL LETTER Y WITH TILDE +1EFB ; Changes_When_Titlecased # L& LATIN SMALL LETTER MIDDLE-WELSH LL +1EFD ; Changes_When_Titlecased # L& LATIN SMALL LETTER MIDDLE-WELSH V +1EFF..1F07 ; Changes_When_Titlecased # L& [9] LATIN SMALL LETTER Y WITH LOOP..GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI +1F10..1F15 ; Changes_When_Titlecased # L& [6] GREEK SMALL LETTER EPSILON WITH PSILI..GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA +1F20..1F27 ; Changes_When_Titlecased # L& [8] GREEK SMALL LETTER ETA WITH PSILI..GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI +1F30..1F37 ; Changes_When_Titlecased # L& [8] GREEK SMALL LETTER IOTA WITH PSILI..GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI +1F40..1F45 ; Changes_When_Titlecased # L& [6] GREEK SMALL LETTER OMICRON WITH PSILI..GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA +1F50..1F57 ; Changes_When_Titlecased # L& [8] GREEK SMALL LETTER UPSILON WITH PSILI..GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI +1F60..1F67 ; Changes_When_Titlecased # L& [8] GREEK SMALL LETTER OMEGA WITH PSILI..GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI +1F70..1F7D ; Changes_When_Titlecased # L& [14] GREEK SMALL LETTER ALPHA WITH VARIA..GREEK SMALL LETTER OMEGA WITH OXIA +1F80..1F87 ; Changes_When_Titlecased # L& [8] GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI..GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI +1F90..1F97 ; Changes_When_Titlecased # L& [8] GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI..GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI +1FA0..1FA7 ; Changes_When_Titlecased # L& [8] GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI..GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI +1FB0..1FB4 ; Changes_When_Titlecased # L& [5] GREEK SMALL LETTER ALPHA WITH VRACHY..GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI +1FB6..1FB7 ; Changes_When_Titlecased # L& [2] GREEK SMALL LETTER ALPHA WITH PERISPOMENI..GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI +1FBE ; Changes_When_Titlecased # L& GREEK PROSGEGRAMMENI +1FC2..1FC4 ; Changes_When_Titlecased # L& [3] GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI +1FC6..1FC7 ; Changes_When_Titlecased # L& [2] GREEK SMALL LETTER ETA WITH PERISPOMENI..GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI +1FD0..1FD3 ; Changes_When_Titlecased # L& [4] GREEK SMALL LETTER IOTA WITH VRACHY..GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA +1FD6..1FD7 ; Changes_When_Titlecased # L& [2] GREEK SMALL LETTER IOTA WITH PERISPOMENI..GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI +1FE0..1FE7 ; Changes_When_Titlecased # L& [8] GREEK SMALL LETTER UPSILON WITH VRACHY..GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI +1FF2..1FF4 ; Changes_When_Titlecased # L& [3] GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI +1FF6..1FF7 ; Changes_When_Titlecased # L& [2] GREEK SMALL LETTER OMEGA WITH PERISPOMENI..GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI +214E ; Changes_When_Titlecased # L& TURNED SMALL F +2170..217F ; Changes_When_Titlecased # Nl [16] SMALL ROMAN NUMERAL ONE..SMALL ROMAN NUMERAL ONE THOUSAND +2184 ; Changes_When_Titlecased # L& LATIN SMALL LETTER REVERSED C +24D0..24E9 ; Changes_When_Titlecased # So [26] CIRCLED LATIN SMALL LETTER A..CIRCLED LATIN SMALL LETTER Z +2C30..2C5E ; Changes_When_Titlecased # L& [47] GLAGOLITIC SMALL LETTER AZU..GLAGOLITIC SMALL LETTER LATINATE MYSLITE +2C61 ; Changes_When_Titlecased # L& LATIN SMALL LETTER L WITH DOUBLE BAR +2C65..2C66 ; Changes_When_Titlecased # L& [2] LATIN SMALL LETTER A WITH STROKE..LATIN SMALL LETTER T WITH DIAGONAL STROKE +2C68 ; Changes_When_Titlecased # L& LATIN SMALL LETTER H WITH DESCENDER +2C6A ; Changes_When_Titlecased # L& LATIN SMALL LETTER K WITH DESCENDER +2C6C ; Changes_When_Titlecased # L& LATIN SMALL LETTER Z WITH DESCENDER +2C73 ; Changes_When_Titlecased # L& LATIN SMALL LETTER W WITH HOOK +2C76 ; Changes_When_Titlecased # L& LATIN SMALL LETTER HALF H +2C81 ; Changes_When_Titlecased # L& COPTIC SMALL LETTER ALFA +2C83 ; Changes_When_Titlecased # L& COPTIC SMALL LETTER VIDA +2C85 ; Changes_When_Titlecased # L& COPTIC SMALL LETTER GAMMA +2C87 ; Changes_When_Titlecased # L& COPTIC SMALL LETTER DALDA +2C89 ; Changes_When_Titlecased # L& COPTIC SMALL LETTER EIE +2C8B ; Changes_When_Titlecased # L& COPTIC SMALL LETTER SOU +2C8D ; Changes_When_Titlecased # L& COPTIC SMALL LETTER ZATA +2C8F ; Changes_When_Titlecased # L& COPTIC SMALL LETTER HATE +2C91 ; Changes_When_Titlecased # L& COPTIC SMALL LETTER THETHE +2C93 ; Changes_When_Titlecased # L& COPTIC SMALL LETTER IAUDA +2C95 ; Changes_When_Titlecased # L& COPTIC SMALL LETTER KAPA +2C97 ; Changes_When_Titlecased # L& COPTIC SMALL LETTER LAULA +2C99 ; Changes_When_Titlecased # L& COPTIC SMALL LETTER MI +2C9B ; Changes_When_Titlecased # L& COPTIC SMALL LETTER NI +2C9D ; Changes_When_Titlecased # L& COPTIC SMALL LETTER KSI +2C9F ; Changes_When_Titlecased # L& COPTIC SMALL LETTER O +2CA1 ; Changes_When_Titlecased # L& COPTIC SMALL LETTER PI +2CA3 ; Changes_When_Titlecased # L& COPTIC SMALL LETTER RO +2CA5 ; Changes_When_Titlecased # L& COPTIC SMALL LETTER SIMA +2CA7 ; Changes_When_Titlecased # L& COPTIC SMALL LETTER TAU +2CA9 ; Changes_When_Titlecased # L& COPTIC SMALL LETTER UA +2CAB ; Changes_When_Titlecased # L& COPTIC SMALL LETTER FI +2CAD ; Changes_When_Titlecased # L& COPTIC SMALL LETTER KHI +2CAF ; Changes_When_Titlecased # L& COPTIC SMALL LETTER PSI +2CB1 ; Changes_When_Titlecased # L& COPTIC SMALL LETTER OOU +2CB3 ; Changes_When_Titlecased # L& COPTIC SMALL LETTER DIALECT-P ALEF +2CB5 ; Changes_When_Titlecased # L& COPTIC SMALL LETTER OLD COPTIC AIN +2CB7 ; Changes_When_Titlecased # L& COPTIC SMALL LETTER CRYPTOGRAMMIC EIE +2CB9 ; Changes_When_Titlecased # L& COPTIC SMALL LETTER DIALECT-P KAPA +2CBB ; Changes_When_Titlecased # L& COPTIC SMALL LETTER DIALECT-P NI +2CBD ; Changes_When_Titlecased # L& COPTIC SMALL LETTER CRYPTOGRAMMIC NI +2CBF ; Changes_When_Titlecased # L& COPTIC SMALL LETTER OLD COPTIC OOU +2CC1 ; Changes_When_Titlecased # L& COPTIC SMALL LETTER SAMPI +2CC3 ; Changes_When_Titlecased # L& COPTIC SMALL LETTER CROSSED SHEI +2CC5 ; Changes_When_Titlecased # L& COPTIC SMALL LETTER OLD COPTIC SHEI +2CC7 ; Changes_When_Titlecased # L& COPTIC SMALL LETTER OLD COPTIC ESH +2CC9 ; Changes_When_Titlecased # L& COPTIC SMALL LETTER AKHMIMIC KHEI +2CCB ; Changes_When_Titlecased # L& COPTIC SMALL LETTER DIALECT-P HORI +2CCD ; Changes_When_Titlecased # L& COPTIC SMALL LETTER OLD COPTIC HORI +2CCF ; Changes_When_Titlecased # L& COPTIC SMALL LETTER OLD COPTIC HA +2CD1 ; Changes_When_Titlecased # L& COPTIC SMALL LETTER L-SHAPED HA +2CD3 ; Changes_When_Titlecased # L& COPTIC SMALL LETTER OLD COPTIC HEI +2CD5 ; Changes_When_Titlecased # L& COPTIC SMALL LETTER OLD COPTIC HAT +2CD7 ; Changes_When_Titlecased # L& COPTIC SMALL LETTER OLD COPTIC GANGIA +2CD9 ; Changes_When_Titlecased # L& COPTIC SMALL LETTER OLD COPTIC DJA +2CDB ; Changes_When_Titlecased # L& COPTIC SMALL LETTER OLD COPTIC SHIMA +2CDD ; Changes_When_Titlecased # L& COPTIC SMALL LETTER OLD NUBIAN SHIMA +2CDF ; Changes_When_Titlecased # L& COPTIC SMALL LETTER OLD NUBIAN NGI +2CE1 ; Changes_When_Titlecased # L& COPTIC SMALL LETTER OLD NUBIAN NYI +2CE3 ; Changes_When_Titlecased # L& COPTIC SMALL LETTER OLD NUBIAN WAU +2CEC ; Changes_When_Titlecased # L& COPTIC SMALL LETTER CRYPTOGRAMMIC SHEI +2CEE ; Changes_When_Titlecased # L& COPTIC SMALL LETTER CRYPTOGRAMMIC GANGIA +2CF3 ; Changes_When_Titlecased # L& COPTIC SMALL LETTER BOHAIRIC KHEI +2D00..2D25 ; Changes_When_Titlecased # L& [38] GEORGIAN SMALL LETTER AN..GEORGIAN SMALL LETTER HOE +2D27 ; Changes_When_Titlecased # L& GEORGIAN SMALL LETTER YN +2D2D ; Changes_When_Titlecased # L& GEORGIAN SMALL LETTER AEN +A641 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER ZEMLYA +A643 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER DZELO +A645 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER REVERSED DZE +A647 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER IOTA +A649 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER DJERV +A64B ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER MONOGRAPH UK +A64D ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER BROAD OMEGA +A64F ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER NEUTRAL YER +A651 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER YERU WITH BACK YER +A653 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER IOTIFIED YAT +A655 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER REVERSED YU +A657 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER IOTIFIED A +A659 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER CLOSED LITTLE YUS +A65B ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER BLENDED YUS +A65D ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER IOTIFIED CLOSED LITTLE YUS +A65F ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER YN +A661 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER REVERSED TSE +A663 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER SOFT DE +A665 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER SOFT EL +A667 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER SOFT EM +A669 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER MONOCULAR O +A66B ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER BINOCULAR O +A66D ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER DOUBLE MONOCULAR O +A681 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER DWE +A683 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER DZWE +A685 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER ZHWE +A687 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER CCHE +A689 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER DZZE +A68B ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER TE WITH MIDDLE HOOK +A68D ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER TWE +A68F ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER TSWE +A691 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER TSSE +A693 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER TCHE +A695 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER HWE +A697 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER SHWE +A699 ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER DOUBLE O +A69B ; Changes_When_Titlecased # L& CYRILLIC SMALL LETTER CROSSED O +A723 ; Changes_When_Titlecased # L& LATIN SMALL LETTER EGYPTOLOGICAL ALEF +A725 ; Changes_When_Titlecased # L& LATIN SMALL LETTER EGYPTOLOGICAL AIN +A727 ; Changes_When_Titlecased # L& LATIN SMALL LETTER HENG +A729 ; Changes_When_Titlecased # L& LATIN SMALL LETTER TZ +A72B ; Changes_When_Titlecased # L& LATIN SMALL LETTER TRESILLO +A72D ; Changes_When_Titlecased # L& LATIN SMALL LETTER CUATRILLO +A72F ; Changes_When_Titlecased # L& LATIN SMALL LETTER CUATRILLO WITH COMMA +A733 ; Changes_When_Titlecased # L& LATIN SMALL LETTER AA +A735 ; Changes_When_Titlecased # L& LATIN SMALL LETTER AO +A737 ; Changes_When_Titlecased # L& LATIN SMALL LETTER AU +A739 ; Changes_When_Titlecased # L& LATIN SMALL LETTER AV +A73B ; Changes_When_Titlecased # L& LATIN SMALL LETTER AV WITH HORIZONTAL BAR +A73D ; Changes_When_Titlecased # L& LATIN SMALL LETTER AY +A73F ; Changes_When_Titlecased # L& LATIN SMALL LETTER REVERSED C WITH DOT +A741 ; Changes_When_Titlecased # L& LATIN SMALL LETTER K WITH STROKE +A743 ; Changes_When_Titlecased # L& LATIN SMALL LETTER K WITH DIAGONAL STROKE +A745 ; Changes_When_Titlecased # L& LATIN SMALL LETTER K WITH STROKE AND DIAGONAL STROKE +A747 ; Changes_When_Titlecased # L& LATIN SMALL LETTER BROKEN L +A749 ; Changes_When_Titlecased # L& LATIN SMALL LETTER L WITH HIGH STROKE +A74B ; Changes_When_Titlecased # L& LATIN SMALL LETTER O WITH LONG STROKE OVERLAY +A74D ; Changes_When_Titlecased # L& LATIN SMALL LETTER O WITH LOOP +A74F ; Changes_When_Titlecased # L& LATIN SMALL LETTER OO +A751 ; Changes_When_Titlecased # L& LATIN SMALL LETTER P WITH STROKE THROUGH DESCENDER +A753 ; Changes_When_Titlecased # L& LATIN SMALL LETTER P WITH FLOURISH +A755 ; Changes_When_Titlecased # L& LATIN SMALL LETTER P WITH SQUIRREL TAIL +A757 ; Changes_When_Titlecased # L& LATIN SMALL LETTER Q WITH STROKE THROUGH DESCENDER +A759 ; Changes_When_Titlecased # L& LATIN SMALL LETTER Q WITH DIAGONAL STROKE +A75B ; Changes_When_Titlecased # L& LATIN SMALL LETTER R ROTUNDA +A75D ; Changes_When_Titlecased # L& LATIN SMALL LETTER RUM ROTUNDA +A75F ; Changes_When_Titlecased # L& LATIN SMALL LETTER V WITH DIAGONAL STROKE +A761 ; Changes_When_Titlecased # L& LATIN SMALL LETTER VY +A763 ; Changes_When_Titlecased # L& LATIN SMALL LETTER VISIGOTHIC Z +A765 ; Changes_When_Titlecased # L& LATIN SMALL LETTER THORN WITH STROKE +A767 ; Changes_When_Titlecased # L& LATIN SMALL LETTER THORN WITH STROKE THROUGH DESCENDER +A769 ; Changes_When_Titlecased # L& LATIN SMALL LETTER VEND +A76B ; Changes_When_Titlecased # L& LATIN SMALL LETTER ET +A76D ; Changes_When_Titlecased # L& LATIN SMALL LETTER IS +A76F ; Changes_When_Titlecased # L& LATIN SMALL LETTER CON +A77A ; Changes_When_Titlecased # L& LATIN SMALL LETTER INSULAR D +A77C ; Changes_When_Titlecased # L& LATIN SMALL LETTER INSULAR F +A77F ; Changes_When_Titlecased # L& LATIN SMALL LETTER TURNED INSULAR G +A781 ; Changes_When_Titlecased # L& LATIN SMALL LETTER TURNED L +A783 ; Changes_When_Titlecased # L& LATIN SMALL LETTER INSULAR R +A785 ; Changes_When_Titlecased # L& LATIN SMALL LETTER INSULAR S +A787 ; Changes_When_Titlecased # L& LATIN SMALL LETTER INSULAR T +A78C ; Changes_When_Titlecased # L& LATIN SMALL LETTER SALTILLO +A791 ; Changes_When_Titlecased # L& LATIN SMALL LETTER N WITH DESCENDER +A793 ; Changes_When_Titlecased # L& LATIN SMALL LETTER C WITH BAR +A797 ; Changes_When_Titlecased # L& LATIN SMALL LETTER B WITH FLOURISH +A799 ; Changes_When_Titlecased # L& LATIN SMALL LETTER F WITH STROKE +A79B ; Changes_When_Titlecased # L& LATIN SMALL LETTER VOLAPUK AE +A79D ; Changes_When_Titlecased # L& LATIN SMALL LETTER VOLAPUK OE +A79F ; Changes_When_Titlecased # L& LATIN SMALL LETTER VOLAPUK UE +A7A1 ; Changes_When_Titlecased # L& LATIN SMALL LETTER G WITH OBLIQUE STROKE +A7A3 ; Changes_When_Titlecased # L& LATIN SMALL LETTER K WITH OBLIQUE STROKE +A7A5 ; Changes_When_Titlecased # L& LATIN SMALL LETTER N WITH OBLIQUE STROKE +A7A7 ; Changes_When_Titlecased # L& LATIN SMALL LETTER R WITH OBLIQUE STROKE +A7A9 ; Changes_When_Titlecased # L& LATIN SMALL LETTER S WITH OBLIQUE STROKE +A7B5 ; Changes_When_Titlecased # L& LATIN SMALL LETTER BETA +A7B7 ; Changes_When_Titlecased # L& LATIN SMALL LETTER OMEGA +A7B9 ; Changes_When_Titlecased # L& LATIN SMALL LETTER U WITH STROKE +AB53 ; Changes_When_Titlecased # L& LATIN SMALL LETTER CHI +AB70..ABBF ; Changes_When_Titlecased # L& [80] CHEROKEE SMALL LETTER A..CHEROKEE SMALL LETTER YA +FB00..FB06 ; Changes_When_Titlecased # L& [7] LATIN SMALL LIGATURE FF..LATIN SMALL LIGATURE ST +FB13..FB17 ; Changes_When_Titlecased # L& [5] ARMENIAN SMALL LIGATURE MEN NOW..ARMENIAN SMALL LIGATURE MEN XEH +FF41..FF5A ; Changes_When_Titlecased # L& [26] FULLWIDTH LATIN SMALL LETTER A..FULLWIDTH LATIN SMALL LETTER Z +10428..1044F ; Changes_When_Titlecased # L& [40] DESERET SMALL LETTER LONG I..DESERET SMALL LETTER EW +104D8..104FB ; Changes_When_Titlecased # L& [36] OSAGE SMALL LETTER A..OSAGE SMALL LETTER ZHA +10CC0..10CF2 ; Changes_When_Titlecased # L& [51] OLD HUNGARIAN SMALL LETTER A..OLD HUNGARIAN SMALL LETTER US +118C0..118DF ; Changes_When_Titlecased # L& [32] WARANG CITI SMALL LETTER NGAA..WARANG CITI SMALL LETTER VIYO +16E60..16E7F ; Changes_When_Titlecased # L& [32] MEDEFAIDRIN SMALL LETTER M..MEDEFAIDRIN SMALL LETTER Y +1E922..1E943 ; Changes_When_Titlecased # L& [34] ADLAM SMALL LETTER ALIF..ADLAM SMALL LETTER SHA + +# Total code points: 1402 + +# ================================================ + +# Derived Property: Changes_When_Casefolded (CWCF) +# Characters whose normalized forms are not stable under case folding. +# For more information, see D142 in Section 3.13, "Default Case Algorithms". +# Changes_When_Casefolded(X) is true when toCasefold(toNFD(X)) != toNFD(X) + +0041..005A ; Changes_When_Casefolded # L& [26] LATIN CAPITAL LETTER A..LATIN CAPITAL LETTER Z +00B5 ; Changes_When_Casefolded # L& MICRO SIGN +00C0..00D6 ; Changes_When_Casefolded # L& [23] LATIN CAPITAL LETTER A WITH GRAVE..LATIN CAPITAL LETTER O WITH DIAERESIS +00D8..00DF ; Changes_When_Casefolded # L& [8] LATIN CAPITAL LETTER O WITH STROKE..LATIN SMALL LETTER SHARP S +0100 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER A WITH MACRON +0102 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER A WITH BREVE +0104 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER A WITH OGONEK +0106 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER C WITH ACUTE +0108 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER C WITH CIRCUMFLEX +010A ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER C WITH DOT ABOVE +010C ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER C WITH CARON +010E ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER D WITH CARON +0110 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER D WITH STROKE +0112 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER E WITH MACRON +0114 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER E WITH BREVE +0116 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER E WITH DOT ABOVE +0118 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER E WITH OGONEK +011A ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER E WITH CARON +011C ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER G WITH CIRCUMFLEX +011E ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER G WITH BREVE +0120 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER G WITH DOT ABOVE +0122 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER G WITH CEDILLA +0124 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER H WITH CIRCUMFLEX +0126 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER H WITH STROKE +0128 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER I WITH TILDE +012A ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER I WITH MACRON +012C ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER I WITH BREVE +012E ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER I WITH OGONEK +0130 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER I WITH DOT ABOVE +0132 ; Changes_When_Casefolded # L& LATIN CAPITAL LIGATURE IJ +0134 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER J WITH CIRCUMFLEX +0136 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER K WITH CEDILLA +0139 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER L WITH ACUTE +013B ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER L WITH CEDILLA +013D ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER L WITH CARON +013F ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER L WITH MIDDLE DOT +0141 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER L WITH STROKE +0143 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER N WITH ACUTE +0145 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER N WITH CEDILLA +0147 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER N WITH CARON +0149..014A ; Changes_When_Casefolded # L& [2] LATIN SMALL LETTER N PRECEDED BY APOSTROPHE..LATIN CAPITAL LETTER ENG +014C ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER O WITH MACRON +014E ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER O WITH BREVE +0150 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER O WITH DOUBLE ACUTE +0152 ; Changes_When_Casefolded # L& LATIN CAPITAL LIGATURE OE +0154 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER R WITH ACUTE +0156 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER R WITH CEDILLA +0158 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER R WITH CARON +015A ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER S WITH ACUTE +015C ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER S WITH CIRCUMFLEX +015E ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER S WITH CEDILLA +0160 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER S WITH CARON +0162 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER T WITH CEDILLA +0164 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER T WITH CARON +0166 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER T WITH STROKE +0168 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER U WITH TILDE +016A ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER U WITH MACRON +016C ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER U WITH BREVE +016E ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER U WITH RING ABOVE +0170 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER U WITH DOUBLE ACUTE +0172 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER U WITH OGONEK +0174 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER W WITH CIRCUMFLEX +0176 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER Y WITH CIRCUMFLEX +0178..0179 ; Changes_When_Casefolded # L& [2] LATIN CAPITAL LETTER Y WITH DIAERESIS..LATIN CAPITAL LETTER Z WITH ACUTE +017B ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER Z WITH DOT ABOVE +017D ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER Z WITH CARON +017F ; Changes_When_Casefolded # L& LATIN SMALL LETTER LONG S +0181..0182 ; Changes_When_Casefolded # L& [2] LATIN CAPITAL LETTER B WITH HOOK..LATIN CAPITAL LETTER B WITH TOPBAR +0184 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER TONE SIX +0186..0187 ; Changes_When_Casefolded # L& [2] LATIN CAPITAL LETTER OPEN O..LATIN CAPITAL LETTER C WITH HOOK +0189..018B ; Changes_When_Casefolded # L& [3] LATIN CAPITAL LETTER AFRICAN D..LATIN CAPITAL LETTER D WITH TOPBAR +018E..0191 ; Changes_When_Casefolded # L& [4] LATIN CAPITAL LETTER REVERSED E..LATIN CAPITAL LETTER F WITH HOOK +0193..0194 ; Changes_When_Casefolded # L& [2] LATIN CAPITAL LETTER G WITH HOOK..LATIN CAPITAL LETTER GAMMA +0196..0198 ; Changes_When_Casefolded # L& [3] LATIN CAPITAL LETTER IOTA..LATIN CAPITAL LETTER K WITH HOOK +019C..019D ; Changes_When_Casefolded # L& [2] LATIN CAPITAL LETTER TURNED M..LATIN CAPITAL LETTER N WITH LEFT HOOK +019F..01A0 ; Changes_When_Casefolded # L& [2] LATIN CAPITAL LETTER O WITH MIDDLE TILDE..LATIN CAPITAL LETTER O WITH HORN +01A2 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER OI +01A4 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER P WITH HOOK +01A6..01A7 ; Changes_When_Casefolded # L& [2] LATIN LETTER YR..LATIN CAPITAL LETTER TONE TWO +01A9 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER ESH +01AC ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER T WITH HOOK +01AE..01AF ; Changes_When_Casefolded # L& [2] LATIN CAPITAL LETTER T WITH RETROFLEX HOOK..LATIN CAPITAL LETTER U WITH HORN +01B1..01B3 ; Changes_When_Casefolded # L& [3] LATIN CAPITAL LETTER UPSILON..LATIN CAPITAL LETTER Y WITH HOOK +01B5 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER Z WITH STROKE +01B7..01B8 ; Changes_When_Casefolded # L& [2] LATIN CAPITAL LETTER EZH..LATIN CAPITAL LETTER EZH REVERSED +01BC ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER TONE FIVE +01C4..01C5 ; Changes_When_Casefolded # L& [2] LATIN CAPITAL LETTER DZ WITH CARON..LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON +01C7..01C8 ; Changes_When_Casefolded # L& [2] LATIN CAPITAL LETTER LJ..LATIN CAPITAL LETTER L WITH SMALL LETTER J +01CA..01CB ; Changes_When_Casefolded # L& [2] LATIN CAPITAL LETTER NJ..LATIN CAPITAL LETTER N WITH SMALL LETTER J +01CD ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER A WITH CARON +01CF ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER I WITH CARON +01D1 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER O WITH CARON +01D3 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER U WITH CARON +01D5 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON +01D7 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE +01D9 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON +01DB ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE +01DE ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON +01E0 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON +01E2 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER AE WITH MACRON +01E4 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER G WITH STROKE +01E6 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER G WITH CARON +01E8 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER K WITH CARON +01EA ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER O WITH OGONEK +01EC ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER O WITH OGONEK AND MACRON +01EE ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER EZH WITH CARON +01F1..01F2 ; Changes_When_Casefolded # L& [2] LATIN CAPITAL LETTER DZ..LATIN CAPITAL LETTER D WITH SMALL LETTER Z +01F4 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER G WITH ACUTE +01F6..01F8 ; Changes_When_Casefolded # L& [3] LATIN CAPITAL LETTER HWAIR..LATIN CAPITAL LETTER N WITH GRAVE +01FA ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE +01FC ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER AE WITH ACUTE +01FE ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER O WITH STROKE AND ACUTE +0200 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER A WITH DOUBLE GRAVE +0202 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER A WITH INVERTED BREVE +0204 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER E WITH DOUBLE GRAVE +0206 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER E WITH INVERTED BREVE +0208 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER I WITH DOUBLE GRAVE +020A ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER I WITH INVERTED BREVE +020C ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER O WITH DOUBLE GRAVE +020E ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER O WITH INVERTED BREVE +0210 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER R WITH DOUBLE GRAVE +0212 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER R WITH INVERTED BREVE +0214 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER U WITH DOUBLE GRAVE +0216 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER U WITH INVERTED BREVE +0218 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER S WITH COMMA BELOW +021A ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER T WITH COMMA BELOW +021C ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER YOGH +021E ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER H WITH CARON +0220 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER N WITH LONG RIGHT LEG +0222 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER OU +0224 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER Z WITH HOOK +0226 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER A WITH DOT ABOVE +0228 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER E WITH CEDILLA +022A ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON +022C ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER O WITH TILDE AND MACRON +022E ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER O WITH DOT ABOVE +0230 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON +0232 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER Y WITH MACRON +023A..023B ; Changes_When_Casefolded # L& [2] LATIN CAPITAL LETTER A WITH STROKE..LATIN CAPITAL LETTER C WITH STROKE +023D..023E ; Changes_When_Casefolded # L& [2] LATIN CAPITAL LETTER L WITH BAR..LATIN CAPITAL LETTER T WITH DIAGONAL STROKE +0241 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER GLOTTAL STOP +0243..0246 ; Changes_When_Casefolded # L& [4] LATIN CAPITAL LETTER B WITH STROKE..LATIN CAPITAL LETTER E WITH STROKE +0248 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER J WITH STROKE +024A ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER SMALL Q WITH HOOK TAIL +024C ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER R WITH STROKE +024E ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER Y WITH STROKE +0345 ; Changes_When_Casefolded # Mn COMBINING GREEK YPOGEGRAMMENI +0370 ; Changes_When_Casefolded # L& GREEK CAPITAL LETTER HETA +0372 ; Changes_When_Casefolded # L& GREEK CAPITAL LETTER ARCHAIC SAMPI +0376 ; Changes_When_Casefolded # L& GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA +037F ; Changes_When_Casefolded # L& GREEK CAPITAL LETTER YOT +0386 ; Changes_When_Casefolded # L& GREEK CAPITAL LETTER ALPHA WITH TONOS +0388..038A ; Changes_When_Casefolded # L& [3] GREEK CAPITAL LETTER EPSILON WITH TONOS..GREEK CAPITAL LETTER IOTA WITH TONOS +038C ; Changes_When_Casefolded # L& GREEK CAPITAL LETTER OMICRON WITH TONOS +038E..038F ; Changes_When_Casefolded # L& [2] GREEK CAPITAL LETTER UPSILON WITH TONOS..GREEK CAPITAL LETTER OMEGA WITH TONOS +0391..03A1 ; Changes_When_Casefolded # L& [17] GREEK CAPITAL LETTER ALPHA..GREEK CAPITAL LETTER RHO +03A3..03AB ; Changes_When_Casefolded # L& [9] GREEK CAPITAL LETTER SIGMA..GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA +03C2 ; Changes_When_Casefolded # L& GREEK SMALL LETTER FINAL SIGMA +03CF..03D1 ; Changes_When_Casefolded # L& [3] GREEK CAPITAL KAI SYMBOL..GREEK THETA SYMBOL +03D5..03D6 ; Changes_When_Casefolded # L& [2] GREEK PHI SYMBOL..GREEK PI SYMBOL +03D8 ; Changes_When_Casefolded # L& GREEK LETTER ARCHAIC KOPPA +03DA ; Changes_When_Casefolded # L& GREEK LETTER STIGMA +03DC ; Changes_When_Casefolded # L& GREEK LETTER DIGAMMA +03DE ; Changes_When_Casefolded # L& GREEK LETTER KOPPA +03E0 ; Changes_When_Casefolded # L& GREEK LETTER SAMPI +03E2 ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER SHEI +03E4 ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER FEI +03E6 ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER KHEI +03E8 ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER HORI +03EA ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER GANGIA +03EC ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER SHIMA +03EE ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER DEI +03F0..03F1 ; Changes_When_Casefolded # L& [2] GREEK KAPPA SYMBOL..GREEK RHO SYMBOL +03F4..03F5 ; Changes_When_Casefolded # L& [2] GREEK CAPITAL THETA SYMBOL..GREEK LUNATE EPSILON SYMBOL +03F7 ; Changes_When_Casefolded # L& GREEK CAPITAL LETTER SHO +03F9..03FA ; Changes_When_Casefolded # L& [2] GREEK CAPITAL LUNATE SIGMA SYMBOL..GREEK CAPITAL LETTER SAN +03FD..042F ; Changes_When_Casefolded # L& [51] GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL..CYRILLIC CAPITAL LETTER YA +0460 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER OMEGA +0462 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER YAT +0464 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER IOTIFIED E +0466 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER LITTLE YUS +0468 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS +046A ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER BIG YUS +046C ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS +046E ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER KSI +0470 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER PSI +0472 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER FITA +0474 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER IZHITSA +0476 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT +0478 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER UK +047A ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER ROUND OMEGA +047C ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER OMEGA WITH TITLO +047E ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER OT +0480 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER KOPPA +048A ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER SHORT I WITH TAIL +048C ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER SEMISOFT SIGN +048E ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER ER WITH TICK +0490 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER GHE WITH UPTURN +0492 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER GHE WITH STROKE +0494 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK +0496 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER +0498 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER ZE WITH DESCENDER +049A ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER KA WITH DESCENDER +049C ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE +049E ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER KA WITH STROKE +04A0 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER BASHKIR KA +04A2 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER EN WITH DESCENDER +04A4 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LIGATURE EN GHE +04A6 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK +04A8 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER ABKHASIAN HA +04AA ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER ES WITH DESCENDER +04AC ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER TE WITH DESCENDER +04AE ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER STRAIGHT U +04B0 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE +04B2 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER HA WITH DESCENDER +04B4 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LIGATURE TE TSE +04B6 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER CHE WITH DESCENDER +04B8 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE +04BA ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER SHHA +04BC ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER ABKHASIAN CHE +04BE ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER +04C0..04C1 ; Changes_When_Casefolded # L& [2] CYRILLIC LETTER PALOCHKA..CYRILLIC CAPITAL LETTER ZHE WITH BREVE +04C3 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER KA WITH HOOK +04C5 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER EL WITH TAIL +04C7 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER EN WITH HOOK +04C9 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER EN WITH TAIL +04CB ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER KHAKASSIAN CHE +04CD ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER EM WITH TAIL +04D0 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER A WITH BREVE +04D2 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER A WITH DIAERESIS +04D4 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LIGATURE A IE +04D6 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER IE WITH BREVE +04D8 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER SCHWA +04DA ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS +04DC ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS +04DE ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS +04E0 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER ABKHASIAN DZE +04E2 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER I WITH MACRON +04E4 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER I WITH DIAERESIS +04E6 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER O WITH DIAERESIS +04E8 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER BARRED O +04EA ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS +04EC ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER E WITH DIAERESIS +04EE ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER U WITH MACRON +04F0 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER U WITH DIAERESIS +04F2 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE +04F4 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS +04F6 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER GHE WITH DESCENDER +04F8 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS +04FA ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER GHE WITH STROKE AND HOOK +04FC ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER HA WITH HOOK +04FE ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER HA WITH STROKE +0500 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER KOMI DE +0502 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER KOMI DJE +0504 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER KOMI ZJE +0506 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER KOMI DZJE +0508 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER KOMI LJE +050A ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER KOMI NJE +050C ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER KOMI SJE +050E ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER KOMI TJE +0510 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER REVERSED ZE +0512 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER EL WITH HOOK +0514 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER LHA +0516 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER RHA +0518 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER YAE +051A ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER QA +051C ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER WE +051E ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER ALEUT KA +0520 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER EL WITH MIDDLE HOOK +0522 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER EN WITH MIDDLE HOOK +0524 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER PE WITH DESCENDER +0526 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER SHHA WITH DESCENDER +0528 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER EN WITH LEFT HOOK +052A ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER DZZHE +052C ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER DCHE +052E ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER EL WITH DESCENDER +0531..0556 ; Changes_When_Casefolded # L& [38] ARMENIAN CAPITAL LETTER AYB..ARMENIAN CAPITAL LETTER FEH +0587 ; Changes_When_Casefolded # L& ARMENIAN SMALL LIGATURE ECH YIWN +10A0..10C5 ; Changes_When_Casefolded # L& [38] GEORGIAN CAPITAL LETTER AN..GEORGIAN CAPITAL LETTER HOE +10C7 ; Changes_When_Casefolded # L& GEORGIAN CAPITAL LETTER YN +10CD ; Changes_When_Casefolded # L& GEORGIAN CAPITAL LETTER AEN +13F8..13FD ; Changes_When_Casefolded # L& [6] CHEROKEE SMALL LETTER YE..CHEROKEE SMALL LETTER MV +1C80..1C88 ; Changes_When_Casefolded # L& [9] CYRILLIC SMALL LETTER ROUNDED VE..CYRILLIC SMALL LETTER UNBLENDED UK +1C90..1CBA ; Changes_When_Casefolded # L& [43] GEORGIAN MTAVRULI CAPITAL LETTER AN..GEORGIAN MTAVRULI CAPITAL LETTER AIN +1CBD..1CBF ; Changes_When_Casefolded # L& [3] GEORGIAN MTAVRULI CAPITAL LETTER AEN..GEORGIAN MTAVRULI CAPITAL LETTER LABIAL SIGN +1E00 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER A WITH RING BELOW +1E02 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER B WITH DOT ABOVE +1E04 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER B WITH DOT BELOW +1E06 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER B WITH LINE BELOW +1E08 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE +1E0A ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER D WITH DOT ABOVE +1E0C ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER D WITH DOT BELOW +1E0E ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER D WITH LINE BELOW +1E10 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER D WITH CEDILLA +1E12 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW +1E14 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER E WITH MACRON AND GRAVE +1E16 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER E WITH MACRON AND ACUTE +1E18 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW +1E1A ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER E WITH TILDE BELOW +1E1C ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE +1E1E ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER F WITH DOT ABOVE +1E20 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER G WITH MACRON +1E22 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER H WITH DOT ABOVE +1E24 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER H WITH DOT BELOW +1E26 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER H WITH DIAERESIS +1E28 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER H WITH CEDILLA +1E2A ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER H WITH BREVE BELOW +1E2C ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER I WITH TILDE BELOW +1E2E ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE +1E30 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER K WITH ACUTE +1E32 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER K WITH DOT BELOW +1E34 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER K WITH LINE BELOW +1E36 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER L WITH DOT BELOW +1E38 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON +1E3A ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER L WITH LINE BELOW +1E3C ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW +1E3E ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER M WITH ACUTE +1E40 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER M WITH DOT ABOVE +1E42 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER M WITH DOT BELOW +1E44 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER N WITH DOT ABOVE +1E46 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER N WITH DOT BELOW +1E48 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER N WITH LINE BELOW +1E4A ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW +1E4C ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER O WITH TILDE AND ACUTE +1E4E ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS +1E50 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER O WITH MACRON AND GRAVE +1E52 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER O WITH MACRON AND ACUTE +1E54 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER P WITH ACUTE +1E56 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER P WITH DOT ABOVE +1E58 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER R WITH DOT ABOVE +1E5A ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER R WITH DOT BELOW +1E5C ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON +1E5E ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER R WITH LINE BELOW +1E60 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER S WITH DOT ABOVE +1E62 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER S WITH DOT BELOW +1E64 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE +1E66 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE +1E68 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE +1E6A ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER T WITH DOT ABOVE +1E6C ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER T WITH DOT BELOW +1E6E ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER T WITH LINE BELOW +1E70 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW +1E72 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER U WITH DIAERESIS BELOW +1E74 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER U WITH TILDE BELOW +1E76 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW +1E78 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER U WITH TILDE AND ACUTE +1E7A ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS +1E7C ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER V WITH TILDE +1E7E ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER V WITH DOT BELOW +1E80 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER W WITH GRAVE +1E82 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER W WITH ACUTE +1E84 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER W WITH DIAERESIS +1E86 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER W WITH DOT ABOVE +1E88 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER W WITH DOT BELOW +1E8A ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER X WITH DOT ABOVE +1E8C ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER X WITH DIAERESIS +1E8E ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER Y WITH DOT ABOVE +1E90 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER Z WITH CIRCUMFLEX +1E92 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER Z WITH DOT BELOW +1E94 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER Z WITH LINE BELOW +1E9A..1E9B ; Changes_When_Casefolded # L& [2] LATIN SMALL LETTER A WITH RIGHT HALF RING..LATIN SMALL LETTER LONG S WITH DOT ABOVE +1E9E ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER SHARP S +1EA0 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER A WITH DOT BELOW +1EA2 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER A WITH HOOK ABOVE +1EA4 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE +1EA6 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE +1EA8 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE +1EAA ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE +1EAC ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW +1EAE ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER A WITH BREVE AND ACUTE +1EB0 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER A WITH BREVE AND GRAVE +1EB2 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE +1EB4 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER A WITH BREVE AND TILDE +1EB6 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW +1EB8 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER E WITH DOT BELOW +1EBA ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER E WITH HOOK ABOVE +1EBC ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER E WITH TILDE +1EBE ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE +1EC0 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE +1EC2 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE +1EC4 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE +1EC6 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW +1EC8 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER I WITH HOOK ABOVE +1ECA ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER I WITH DOT BELOW +1ECC ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER O WITH DOT BELOW +1ECE ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER O WITH HOOK ABOVE +1ED0 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE +1ED2 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE +1ED4 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE +1ED6 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE +1ED8 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW +1EDA ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER O WITH HORN AND ACUTE +1EDC ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER O WITH HORN AND GRAVE +1EDE ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE +1EE0 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER O WITH HORN AND TILDE +1EE2 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW +1EE4 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER U WITH DOT BELOW +1EE6 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER U WITH HOOK ABOVE +1EE8 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER U WITH HORN AND ACUTE +1EEA ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER U WITH HORN AND GRAVE +1EEC ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE +1EEE ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER U WITH HORN AND TILDE +1EF0 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW +1EF2 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER Y WITH GRAVE +1EF4 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER Y WITH DOT BELOW +1EF6 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER Y WITH HOOK ABOVE +1EF8 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER Y WITH TILDE +1EFA ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER MIDDLE-WELSH LL +1EFC ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER MIDDLE-WELSH V +1EFE ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER Y WITH LOOP +1F08..1F0F ; Changes_When_Casefolded # L& [8] GREEK CAPITAL LETTER ALPHA WITH PSILI..GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI +1F18..1F1D ; Changes_When_Casefolded # L& [6] GREEK CAPITAL LETTER EPSILON WITH PSILI..GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA +1F28..1F2F ; Changes_When_Casefolded # L& [8] GREEK CAPITAL LETTER ETA WITH PSILI..GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI +1F38..1F3F ; Changes_When_Casefolded # L& [8] GREEK CAPITAL LETTER IOTA WITH PSILI..GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI +1F48..1F4D ; Changes_When_Casefolded # L& [6] GREEK CAPITAL LETTER OMICRON WITH PSILI..GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA +1F59 ; Changes_When_Casefolded # L& GREEK CAPITAL LETTER UPSILON WITH DASIA +1F5B ; Changes_When_Casefolded # L& GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA +1F5D ; Changes_When_Casefolded # L& GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA +1F5F ; Changes_When_Casefolded # L& GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI +1F68..1F6F ; Changes_When_Casefolded # L& [8] GREEK CAPITAL LETTER OMEGA WITH PSILI..GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI +1F80..1FAF ; Changes_When_Casefolded # L& [48] GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI..GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI +1FB2..1FB4 ; Changes_When_Casefolded # L& [3] GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI +1FB7..1FBC ; Changes_When_Casefolded # L& [6] GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI..GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI +1FC2..1FC4 ; Changes_When_Casefolded # L& [3] GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI +1FC7..1FCC ; Changes_When_Casefolded # L& [6] GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI..GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI +1FD8..1FDB ; Changes_When_Casefolded # L& [4] GREEK CAPITAL LETTER IOTA WITH VRACHY..GREEK CAPITAL LETTER IOTA WITH OXIA +1FE8..1FEC ; Changes_When_Casefolded # L& [5] GREEK CAPITAL LETTER UPSILON WITH VRACHY..GREEK CAPITAL LETTER RHO WITH DASIA +1FF2..1FF4 ; Changes_When_Casefolded # L& [3] GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI +1FF7..1FFC ; Changes_When_Casefolded # L& [6] GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI..GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI +2126 ; Changes_When_Casefolded # L& OHM SIGN +212A..212B ; Changes_When_Casefolded # L& [2] KELVIN SIGN..ANGSTROM SIGN +2132 ; Changes_When_Casefolded # L& TURNED CAPITAL F +2160..216F ; Changes_When_Casefolded # Nl [16] ROMAN NUMERAL ONE..ROMAN NUMERAL ONE THOUSAND +2183 ; Changes_When_Casefolded # L& ROMAN NUMERAL REVERSED ONE HUNDRED +24B6..24CF ; Changes_When_Casefolded # So [26] CIRCLED LATIN CAPITAL LETTER A..CIRCLED LATIN CAPITAL LETTER Z +2C00..2C2E ; Changes_When_Casefolded # L& [47] GLAGOLITIC CAPITAL LETTER AZU..GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE +2C60 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER L WITH DOUBLE BAR +2C62..2C64 ; Changes_When_Casefolded # L& [3] LATIN CAPITAL LETTER L WITH MIDDLE TILDE..LATIN CAPITAL LETTER R WITH TAIL +2C67 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER H WITH DESCENDER +2C69 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER K WITH DESCENDER +2C6B ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER Z WITH DESCENDER +2C6D..2C70 ; Changes_When_Casefolded # L& [4] LATIN CAPITAL LETTER ALPHA..LATIN CAPITAL LETTER TURNED ALPHA +2C72 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER W WITH HOOK +2C75 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER HALF H +2C7E..2C80 ; Changes_When_Casefolded # L& [3] LATIN CAPITAL LETTER S WITH SWASH TAIL..COPTIC CAPITAL LETTER ALFA +2C82 ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER VIDA +2C84 ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER GAMMA +2C86 ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER DALDA +2C88 ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER EIE +2C8A ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER SOU +2C8C ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER ZATA +2C8E ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER HATE +2C90 ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER THETHE +2C92 ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER IAUDA +2C94 ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER KAPA +2C96 ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER LAULA +2C98 ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER MI +2C9A ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER NI +2C9C ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER KSI +2C9E ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER O +2CA0 ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER PI +2CA2 ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER RO +2CA4 ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER SIMA +2CA6 ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER TAU +2CA8 ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER UA +2CAA ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER FI +2CAC ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER KHI +2CAE ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER PSI +2CB0 ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER OOU +2CB2 ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER DIALECT-P ALEF +2CB4 ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER OLD COPTIC AIN +2CB6 ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER CRYPTOGRAMMIC EIE +2CB8 ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER DIALECT-P KAPA +2CBA ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER DIALECT-P NI +2CBC ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER CRYPTOGRAMMIC NI +2CBE ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER OLD COPTIC OOU +2CC0 ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER SAMPI +2CC2 ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER CROSSED SHEI +2CC4 ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER OLD COPTIC SHEI +2CC6 ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER OLD COPTIC ESH +2CC8 ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER AKHMIMIC KHEI +2CCA ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER DIALECT-P HORI +2CCC ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER OLD COPTIC HORI +2CCE ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER OLD COPTIC HA +2CD0 ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER L-SHAPED HA +2CD2 ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER OLD COPTIC HEI +2CD4 ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER OLD COPTIC HAT +2CD6 ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER OLD COPTIC GANGIA +2CD8 ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER OLD COPTIC DJA +2CDA ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER OLD COPTIC SHIMA +2CDC ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER OLD NUBIAN SHIMA +2CDE ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER OLD NUBIAN NGI +2CE0 ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER OLD NUBIAN NYI +2CE2 ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER OLD NUBIAN WAU +2CEB ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER CRYPTOGRAMMIC SHEI +2CED ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER CRYPTOGRAMMIC GANGIA +2CF2 ; Changes_When_Casefolded # L& COPTIC CAPITAL LETTER BOHAIRIC KHEI +A640 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER ZEMLYA +A642 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER DZELO +A644 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER REVERSED DZE +A646 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER IOTA +A648 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER DJERV +A64A ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER MONOGRAPH UK +A64C ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER BROAD OMEGA +A64E ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER NEUTRAL YER +A650 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER YERU WITH BACK YER +A652 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER IOTIFIED YAT +A654 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER REVERSED YU +A656 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER IOTIFIED A +A658 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER CLOSED LITTLE YUS +A65A ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER BLENDED YUS +A65C ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER IOTIFIED CLOSED LITTLE YUS +A65E ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER YN +A660 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER REVERSED TSE +A662 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER SOFT DE +A664 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER SOFT EL +A666 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER SOFT EM +A668 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER MONOCULAR O +A66A ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER BINOCULAR O +A66C ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER DOUBLE MONOCULAR O +A680 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER DWE +A682 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER DZWE +A684 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER ZHWE +A686 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER CCHE +A688 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER DZZE +A68A ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER TE WITH MIDDLE HOOK +A68C ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER TWE +A68E ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER TSWE +A690 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER TSSE +A692 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER TCHE +A694 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER HWE +A696 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER SHWE +A698 ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER DOUBLE O +A69A ; Changes_When_Casefolded # L& CYRILLIC CAPITAL LETTER CROSSED O +A722 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF +A724 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER EGYPTOLOGICAL AIN +A726 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER HENG +A728 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER TZ +A72A ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER TRESILLO +A72C ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER CUATRILLO +A72E ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER CUATRILLO WITH COMMA +A732 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER AA +A734 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER AO +A736 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER AU +A738 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER AV +A73A ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER AV WITH HORIZONTAL BAR +A73C ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER AY +A73E ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER REVERSED C WITH DOT +A740 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER K WITH STROKE +A742 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER K WITH DIAGONAL STROKE +A744 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER K WITH STROKE AND DIAGONAL STROKE +A746 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER BROKEN L +A748 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER L WITH HIGH STROKE +A74A ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER O WITH LONG STROKE OVERLAY +A74C ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER O WITH LOOP +A74E ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER OO +A750 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER P WITH STROKE THROUGH DESCENDER +A752 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER P WITH FLOURISH +A754 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER P WITH SQUIRREL TAIL +A756 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER Q WITH STROKE THROUGH DESCENDER +A758 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER Q WITH DIAGONAL STROKE +A75A ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER R ROTUNDA +A75C ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER RUM ROTUNDA +A75E ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER V WITH DIAGONAL STROKE +A760 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER VY +A762 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER VISIGOTHIC Z +A764 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER THORN WITH STROKE +A766 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER THORN WITH STROKE THROUGH DESCENDER +A768 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER VEND +A76A ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER ET +A76C ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER IS +A76E ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER CON +A779 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER INSULAR D +A77B ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER INSULAR F +A77D..A77E ; Changes_When_Casefolded # L& [2] LATIN CAPITAL LETTER INSULAR G..LATIN CAPITAL LETTER TURNED INSULAR G +A780 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER TURNED L +A782 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER INSULAR R +A784 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER INSULAR S +A786 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER INSULAR T +A78B ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER SALTILLO +A78D ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER TURNED H +A790 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER N WITH DESCENDER +A792 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER C WITH BAR +A796 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER B WITH FLOURISH +A798 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER F WITH STROKE +A79A ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER VOLAPUK AE +A79C ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER VOLAPUK OE +A79E ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER VOLAPUK UE +A7A0 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER G WITH OBLIQUE STROKE +A7A2 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER K WITH OBLIQUE STROKE +A7A4 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER N WITH OBLIQUE STROKE +A7A6 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER R WITH OBLIQUE STROKE +A7A8 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER S WITH OBLIQUE STROKE +A7AA..A7AE ; Changes_When_Casefolded # L& [5] LATIN CAPITAL LETTER H WITH HOOK..LATIN CAPITAL LETTER SMALL CAPITAL I +A7B0..A7B4 ; Changes_When_Casefolded # L& [5] LATIN CAPITAL LETTER TURNED K..LATIN CAPITAL LETTER BETA +A7B6 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER OMEGA +A7B8 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER U WITH STROKE +AB70..ABBF ; Changes_When_Casefolded # L& [80] CHEROKEE SMALL LETTER A..CHEROKEE SMALL LETTER YA +FB00..FB06 ; Changes_When_Casefolded # L& [7] LATIN SMALL LIGATURE FF..LATIN SMALL LIGATURE ST +FB13..FB17 ; Changes_When_Casefolded # L& [5] ARMENIAN SMALL LIGATURE MEN NOW..ARMENIAN SMALL LIGATURE MEN XEH +FF21..FF3A ; Changes_When_Casefolded # L& [26] FULLWIDTH LATIN CAPITAL LETTER A..FULLWIDTH LATIN CAPITAL LETTER Z +10400..10427 ; Changes_When_Casefolded # L& [40] DESERET CAPITAL LETTER LONG I..DESERET CAPITAL LETTER EW +104B0..104D3 ; Changes_When_Casefolded # L& [36] OSAGE CAPITAL LETTER A..OSAGE CAPITAL LETTER ZHA +10C80..10CB2 ; Changes_When_Casefolded # L& [51] OLD HUNGARIAN CAPITAL LETTER A..OLD HUNGARIAN CAPITAL LETTER US +118A0..118BF ; Changes_When_Casefolded # L& [32] WARANG CITI CAPITAL LETTER NGAA..WARANG CITI CAPITAL LETTER VIYO +16E40..16E5F ; Changes_When_Casefolded # L& [32] MEDEFAIDRIN CAPITAL LETTER M..MEDEFAIDRIN CAPITAL LETTER Y +1E900..1E921 ; Changes_When_Casefolded # L& [34] ADLAM CAPITAL LETTER ALIF..ADLAM CAPITAL LETTER SHA + +# Total code points: 1456 + +# ================================================ + +# Derived Property: Changes_When_Casemapped (CWCM) +# Characters whose normalized forms are not stable under case mapping. +# For more information, see D143 in Section 3.13, "Default Case Algorithms". +# Changes_When_Casemapped(X) is true when CWL(X), or CWT(X), or CWU(X) + +0041..005A ; Changes_When_Casemapped # L& [26] LATIN CAPITAL LETTER A..LATIN CAPITAL LETTER Z +0061..007A ; Changes_When_Casemapped # L& [26] LATIN SMALL LETTER A..LATIN SMALL LETTER Z +00B5 ; Changes_When_Casemapped # L& MICRO SIGN +00C0..00D6 ; Changes_When_Casemapped # L& [23] LATIN CAPITAL LETTER A WITH GRAVE..LATIN CAPITAL LETTER O WITH DIAERESIS +00D8..00F6 ; Changes_When_Casemapped # L& [31] LATIN CAPITAL LETTER O WITH STROKE..LATIN SMALL LETTER O WITH DIAERESIS +00F8..0137 ; Changes_When_Casemapped # L& [64] LATIN SMALL LETTER O WITH STROKE..LATIN SMALL LETTER K WITH CEDILLA +0139..018C ; Changes_When_Casemapped # L& [84] LATIN CAPITAL LETTER L WITH ACUTE..LATIN SMALL LETTER D WITH TOPBAR +018E..019A ; Changes_When_Casemapped # L& [13] LATIN CAPITAL LETTER REVERSED E..LATIN SMALL LETTER L WITH BAR +019C..01A9 ; Changes_When_Casemapped # L& [14] LATIN CAPITAL LETTER TURNED M..LATIN CAPITAL LETTER ESH +01AC..01B9 ; Changes_When_Casemapped # L& [14] LATIN CAPITAL LETTER T WITH HOOK..LATIN SMALL LETTER EZH REVERSED +01BC..01BD ; Changes_When_Casemapped # L& [2] LATIN CAPITAL LETTER TONE FIVE..LATIN SMALL LETTER TONE FIVE +01BF ; Changes_When_Casemapped # L& LATIN LETTER WYNN +01C4..0220 ; Changes_When_Casemapped # L& [93] LATIN CAPITAL LETTER DZ WITH CARON..LATIN CAPITAL LETTER N WITH LONG RIGHT LEG +0222..0233 ; Changes_When_Casemapped # L& [18] LATIN CAPITAL LETTER OU..LATIN SMALL LETTER Y WITH MACRON +023A..0254 ; Changes_When_Casemapped # L& [27] LATIN CAPITAL LETTER A WITH STROKE..LATIN SMALL LETTER OPEN O +0256..0257 ; Changes_When_Casemapped # L& [2] LATIN SMALL LETTER D WITH TAIL..LATIN SMALL LETTER D WITH HOOK +0259 ; Changes_When_Casemapped # L& LATIN SMALL LETTER SCHWA +025B..025C ; Changes_When_Casemapped # L& [2] LATIN SMALL LETTER OPEN E..LATIN SMALL LETTER REVERSED OPEN E +0260..0261 ; Changes_When_Casemapped # L& [2] LATIN SMALL LETTER G WITH HOOK..LATIN SMALL LETTER SCRIPT G +0263 ; Changes_When_Casemapped # L& LATIN SMALL LETTER GAMMA +0265..0266 ; Changes_When_Casemapped # L& [2] LATIN SMALL LETTER TURNED H..LATIN SMALL LETTER H WITH HOOK +0268..026C ; Changes_When_Casemapped # L& [5] LATIN SMALL LETTER I WITH STROKE..LATIN SMALL LETTER L WITH BELT +026F ; Changes_When_Casemapped # L& LATIN SMALL LETTER TURNED M +0271..0272 ; Changes_When_Casemapped # L& [2] LATIN SMALL LETTER M WITH HOOK..LATIN SMALL LETTER N WITH LEFT HOOK +0275 ; Changes_When_Casemapped # L& LATIN SMALL LETTER BARRED O +027D ; Changes_When_Casemapped # L& LATIN SMALL LETTER R WITH TAIL +0280 ; Changes_When_Casemapped # L& LATIN LETTER SMALL CAPITAL R +0283 ; Changes_When_Casemapped # L& LATIN SMALL LETTER ESH +0287..028C ; Changes_When_Casemapped # L& [6] LATIN SMALL LETTER TURNED T..LATIN SMALL LETTER TURNED V +0292 ; Changes_When_Casemapped # L& LATIN SMALL LETTER EZH +029D..029E ; Changes_When_Casemapped # L& [2] LATIN SMALL LETTER J WITH CROSSED-TAIL..LATIN SMALL LETTER TURNED K +0345 ; Changes_When_Casemapped # Mn COMBINING GREEK YPOGEGRAMMENI +0370..0373 ; Changes_When_Casemapped # L& [4] GREEK CAPITAL LETTER HETA..GREEK SMALL LETTER ARCHAIC SAMPI +0376..0377 ; Changes_When_Casemapped # L& [2] GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA..GREEK SMALL LETTER PAMPHYLIAN DIGAMMA +037B..037D ; Changes_When_Casemapped # L& [3] GREEK SMALL REVERSED LUNATE SIGMA SYMBOL..GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL +037F ; Changes_When_Casemapped # L& GREEK CAPITAL LETTER YOT +0386 ; Changes_When_Casemapped # L& GREEK CAPITAL LETTER ALPHA WITH TONOS +0388..038A ; Changes_When_Casemapped # L& [3] GREEK CAPITAL LETTER EPSILON WITH TONOS..GREEK CAPITAL LETTER IOTA WITH TONOS +038C ; Changes_When_Casemapped # L& GREEK CAPITAL LETTER OMICRON WITH TONOS +038E..03A1 ; Changes_When_Casemapped # L& [20] GREEK CAPITAL LETTER UPSILON WITH TONOS..GREEK CAPITAL LETTER RHO +03A3..03D1 ; Changes_When_Casemapped # L& [47] GREEK CAPITAL LETTER SIGMA..GREEK THETA SYMBOL +03D5..03F5 ; Changes_When_Casemapped # L& [33] GREEK PHI SYMBOL..GREEK LUNATE EPSILON SYMBOL +03F7..03FB ; Changes_When_Casemapped # L& [5] GREEK CAPITAL LETTER SHO..GREEK SMALL LETTER SAN +03FD..0481 ; Changes_When_Casemapped # L& [133] GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL..CYRILLIC SMALL LETTER KOPPA +048A..052F ; Changes_When_Casemapped # L& [166] CYRILLIC CAPITAL LETTER SHORT I WITH TAIL..CYRILLIC SMALL LETTER EL WITH DESCENDER +0531..0556 ; Changes_When_Casemapped # L& [38] ARMENIAN CAPITAL LETTER AYB..ARMENIAN CAPITAL LETTER FEH +0561..0587 ; Changes_When_Casemapped # L& [39] ARMENIAN SMALL LETTER AYB..ARMENIAN SMALL LIGATURE ECH YIWN +10A0..10C5 ; Changes_When_Casemapped # L& [38] GEORGIAN CAPITAL LETTER AN..GEORGIAN CAPITAL LETTER HOE +10C7 ; Changes_When_Casemapped # L& GEORGIAN CAPITAL LETTER YN +10CD ; Changes_When_Casemapped # L& GEORGIAN CAPITAL LETTER AEN +10D0..10FA ; Changes_When_Casemapped # L& [43] GEORGIAN LETTER AN..GEORGIAN LETTER AIN +10FD..10FF ; Changes_When_Casemapped # L& [3] GEORGIAN LETTER AEN..GEORGIAN LETTER LABIAL SIGN +13A0..13F5 ; Changes_When_Casemapped # L& [86] CHEROKEE LETTER A..CHEROKEE LETTER MV +13F8..13FD ; Changes_When_Casemapped # L& [6] CHEROKEE SMALL LETTER YE..CHEROKEE SMALL LETTER MV +1C80..1C88 ; Changes_When_Casemapped # L& [9] CYRILLIC SMALL LETTER ROUNDED VE..CYRILLIC SMALL LETTER UNBLENDED UK +1C90..1CBA ; Changes_When_Casemapped # L& [43] GEORGIAN MTAVRULI CAPITAL LETTER AN..GEORGIAN MTAVRULI CAPITAL LETTER AIN +1CBD..1CBF ; Changes_When_Casemapped # L& [3] GEORGIAN MTAVRULI CAPITAL LETTER AEN..GEORGIAN MTAVRULI CAPITAL LETTER LABIAL SIGN +1D79 ; Changes_When_Casemapped # L& LATIN SMALL LETTER INSULAR G +1D7D ; Changes_When_Casemapped # L& LATIN SMALL LETTER P WITH STROKE +1E00..1E9B ; Changes_When_Casemapped # L& [156] LATIN CAPITAL LETTER A WITH RING BELOW..LATIN SMALL LETTER LONG S WITH DOT ABOVE +1E9E ; Changes_When_Casemapped # L& LATIN CAPITAL LETTER SHARP S +1EA0..1F15 ; Changes_When_Casemapped # L& [118] LATIN CAPITAL LETTER A WITH DOT BELOW..GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA +1F18..1F1D ; Changes_When_Casemapped # L& [6] GREEK CAPITAL LETTER EPSILON WITH PSILI..GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA +1F20..1F45 ; Changes_When_Casemapped # L& [38] GREEK SMALL LETTER ETA WITH PSILI..GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA +1F48..1F4D ; Changes_When_Casemapped # L& [6] GREEK CAPITAL LETTER OMICRON WITH PSILI..GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA +1F50..1F57 ; Changes_When_Casemapped # L& [8] GREEK SMALL LETTER UPSILON WITH PSILI..GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI +1F59 ; Changes_When_Casemapped # L& GREEK CAPITAL LETTER UPSILON WITH DASIA +1F5B ; Changes_When_Casemapped # L& GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA +1F5D ; Changes_When_Casemapped # L& GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA +1F5F..1F7D ; Changes_When_Casemapped # L& [31] GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI..GREEK SMALL LETTER OMEGA WITH OXIA +1F80..1FB4 ; Changes_When_Casemapped # L& [53] GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI..GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI +1FB6..1FBC ; Changes_When_Casemapped # L& [7] GREEK SMALL LETTER ALPHA WITH PERISPOMENI..GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI +1FBE ; Changes_When_Casemapped # L& GREEK PROSGEGRAMMENI +1FC2..1FC4 ; Changes_When_Casemapped # L& [3] GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI +1FC6..1FCC ; Changes_When_Casemapped # L& [7] GREEK SMALL LETTER ETA WITH PERISPOMENI..GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI +1FD0..1FD3 ; Changes_When_Casemapped # L& [4] GREEK SMALL LETTER IOTA WITH VRACHY..GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA +1FD6..1FDB ; Changes_When_Casemapped # L& [6] GREEK SMALL LETTER IOTA WITH PERISPOMENI..GREEK CAPITAL LETTER IOTA WITH OXIA +1FE0..1FEC ; Changes_When_Casemapped # L& [13] GREEK SMALL LETTER UPSILON WITH VRACHY..GREEK CAPITAL LETTER RHO WITH DASIA +1FF2..1FF4 ; Changes_When_Casemapped # L& [3] GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI +1FF6..1FFC ; Changes_When_Casemapped # L& [7] GREEK SMALL LETTER OMEGA WITH PERISPOMENI..GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI +2126 ; Changes_When_Casemapped # L& OHM SIGN +212A..212B ; Changes_When_Casemapped # L& [2] KELVIN SIGN..ANGSTROM SIGN +2132 ; Changes_When_Casemapped # L& TURNED CAPITAL F +214E ; Changes_When_Casemapped # L& TURNED SMALL F +2160..217F ; Changes_When_Casemapped # Nl [32] ROMAN NUMERAL ONE..SMALL ROMAN NUMERAL ONE THOUSAND +2183..2184 ; Changes_When_Casemapped # L& [2] ROMAN NUMERAL REVERSED ONE HUNDRED..LATIN SMALL LETTER REVERSED C +24B6..24E9 ; Changes_When_Casemapped # So [52] CIRCLED LATIN CAPITAL LETTER A..CIRCLED LATIN SMALL LETTER Z +2C00..2C2E ; Changes_When_Casemapped # L& [47] GLAGOLITIC CAPITAL LETTER AZU..GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE +2C30..2C5E ; Changes_When_Casemapped # L& [47] GLAGOLITIC SMALL LETTER AZU..GLAGOLITIC SMALL LETTER LATINATE MYSLITE +2C60..2C70 ; Changes_When_Casemapped # L& [17] LATIN CAPITAL LETTER L WITH DOUBLE BAR..LATIN CAPITAL LETTER TURNED ALPHA +2C72..2C73 ; Changes_When_Casemapped # L& [2] LATIN CAPITAL LETTER W WITH HOOK..LATIN SMALL LETTER W WITH HOOK +2C75..2C76 ; Changes_When_Casemapped # L& [2] LATIN CAPITAL LETTER HALF H..LATIN SMALL LETTER HALF H +2C7E..2CE3 ; Changes_When_Casemapped # L& [102] LATIN CAPITAL LETTER S WITH SWASH TAIL..COPTIC SMALL LETTER OLD NUBIAN WAU +2CEB..2CEE ; Changes_When_Casemapped # L& [4] COPTIC CAPITAL LETTER CRYPTOGRAMMIC SHEI..COPTIC SMALL LETTER CRYPTOGRAMMIC GANGIA +2CF2..2CF3 ; Changes_When_Casemapped # L& [2] COPTIC CAPITAL LETTER BOHAIRIC KHEI..COPTIC SMALL LETTER BOHAIRIC KHEI +2D00..2D25 ; Changes_When_Casemapped # L& [38] GEORGIAN SMALL LETTER AN..GEORGIAN SMALL LETTER HOE +2D27 ; Changes_When_Casemapped # L& GEORGIAN SMALL LETTER YN +2D2D ; Changes_When_Casemapped # L& GEORGIAN SMALL LETTER AEN +A640..A66D ; Changes_When_Casemapped # L& [46] CYRILLIC CAPITAL LETTER ZEMLYA..CYRILLIC SMALL LETTER DOUBLE MONOCULAR O +A680..A69B ; Changes_When_Casemapped # L& [28] CYRILLIC CAPITAL LETTER DWE..CYRILLIC SMALL LETTER CROSSED O +A722..A72F ; Changes_When_Casemapped # L& [14] LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF..LATIN SMALL LETTER CUATRILLO WITH COMMA +A732..A76F ; Changes_When_Casemapped # L& [62] LATIN CAPITAL LETTER AA..LATIN SMALL LETTER CON +A779..A787 ; Changes_When_Casemapped # L& [15] LATIN CAPITAL LETTER INSULAR D..LATIN SMALL LETTER INSULAR T +A78B..A78D ; Changes_When_Casemapped # L& [3] LATIN CAPITAL LETTER SALTILLO..LATIN CAPITAL LETTER TURNED H +A790..A793 ; Changes_When_Casemapped # L& [4] LATIN CAPITAL LETTER N WITH DESCENDER..LATIN SMALL LETTER C WITH BAR +A796..A7AE ; Changes_When_Casemapped # L& [25] LATIN CAPITAL LETTER B WITH FLOURISH..LATIN CAPITAL LETTER SMALL CAPITAL I +A7B0..A7B9 ; Changes_When_Casemapped # L& [10] LATIN CAPITAL LETTER TURNED K..LATIN SMALL LETTER U WITH STROKE +AB53 ; Changes_When_Casemapped # L& LATIN SMALL LETTER CHI +AB70..ABBF ; Changes_When_Casemapped # L& [80] CHEROKEE SMALL LETTER A..CHEROKEE SMALL LETTER YA +FB00..FB06 ; Changes_When_Casemapped # L& [7] LATIN SMALL LIGATURE FF..LATIN SMALL LIGATURE ST +FB13..FB17 ; Changes_When_Casemapped # L& [5] ARMENIAN SMALL LIGATURE MEN NOW..ARMENIAN SMALL LIGATURE MEN XEH +FF21..FF3A ; Changes_When_Casemapped # L& [26] FULLWIDTH LATIN CAPITAL LETTER A..FULLWIDTH LATIN CAPITAL LETTER Z +FF41..FF5A ; Changes_When_Casemapped # L& [26] FULLWIDTH LATIN SMALL LETTER A..FULLWIDTH LATIN SMALL LETTER Z +10400..1044F ; Changes_When_Casemapped # L& [80] DESERET CAPITAL LETTER LONG I..DESERET SMALL LETTER EW +104B0..104D3 ; Changes_When_Casemapped # L& [36] OSAGE CAPITAL LETTER A..OSAGE CAPITAL LETTER ZHA +104D8..104FB ; Changes_When_Casemapped # L& [36] OSAGE SMALL LETTER A..OSAGE SMALL LETTER ZHA +10C80..10CB2 ; Changes_When_Casemapped # L& [51] OLD HUNGARIAN CAPITAL LETTER A..OLD HUNGARIAN CAPITAL LETTER US +10CC0..10CF2 ; Changes_When_Casemapped # L& [51] OLD HUNGARIAN SMALL LETTER A..OLD HUNGARIAN SMALL LETTER US +118A0..118DF ; Changes_When_Casemapped # L& [64] WARANG CITI CAPITAL LETTER NGAA..WARANG CITI SMALL LETTER VIYO +16E40..16E7F ; Changes_When_Casemapped # L& [64] MEDEFAIDRIN CAPITAL LETTER M..MEDEFAIDRIN SMALL LETTER Y +1E900..1E943 ; Changes_When_Casemapped # L& [68] ADLAM CAPITAL LETTER ALIF..ADLAM SMALL LETTER SHA + +# Total code points: 2827 + +# ================================================ + +# Derived Property: ID_Start +# Characters that can start an identifier. +# Generated from: +# Lu + Ll + Lt + Lm + Lo + Nl +# + Other_ID_Start +# - Pattern_Syntax +# - Pattern_White_Space +# NOTE: See UAX #31 for more information + +0041..005A ; ID_Start # L& [26] LATIN CAPITAL LETTER A..LATIN CAPITAL LETTER Z +0061..007A ; ID_Start # L& [26] LATIN SMALL LETTER A..LATIN SMALL LETTER Z +00AA ; ID_Start # Lo FEMININE ORDINAL INDICATOR +00B5 ; ID_Start # L& MICRO SIGN +00BA ; ID_Start # Lo MASCULINE ORDINAL INDICATOR +00C0..00D6 ; ID_Start # L& [23] LATIN CAPITAL LETTER A WITH GRAVE..LATIN CAPITAL LETTER O WITH DIAERESIS +00D8..00F6 ; ID_Start # L& [31] LATIN CAPITAL LETTER O WITH STROKE..LATIN SMALL LETTER O WITH DIAERESIS +00F8..01BA ; ID_Start # L& [195] LATIN SMALL LETTER O WITH STROKE..LATIN SMALL LETTER EZH WITH TAIL +01BB ; ID_Start # Lo LATIN LETTER TWO WITH STROKE +01BC..01BF ; ID_Start # L& [4] LATIN CAPITAL LETTER TONE FIVE..LATIN LETTER WYNN +01C0..01C3 ; ID_Start # Lo [4] LATIN LETTER DENTAL CLICK..LATIN LETTER RETROFLEX CLICK +01C4..0293 ; ID_Start # L& [208] LATIN CAPITAL LETTER DZ WITH CARON..LATIN SMALL LETTER EZH WITH CURL +0294 ; ID_Start # Lo LATIN LETTER GLOTTAL STOP +0295..02AF ; ID_Start # L& [27] LATIN LETTER PHARYNGEAL VOICED FRICATIVE..LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL +02B0..02C1 ; ID_Start # Lm [18] MODIFIER LETTER SMALL H..MODIFIER LETTER REVERSED GLOTTAL STOP +02C6..02D1 ; ID_Start # Lm [12] MODIFIER LETTER CIRCUMFLEX ACCENT..MODIFIER LETTER HALF TRIANGULAR COLON +02E0..02E4 ; ID_Start # Lm [5] MODIFIER LETTER SMALL GAMMA..MODIFIER LETTER SMALL REVERSED GLOTTAL STOP +02EC ; ID_Start # Lm MODIFIER LETTER VOICING +02EE ; ID_Start # Lm MODIFIER LETTER DOUBLE APOSTROPHE +0370..0373 ; ID_Start # L& [4] GREEK CAPITAL LETTER HETA..GREEK SMALL LETTER ARCHAIC SAMPI +0374 ; ID_Start # Lm GREEK NUMERAL SIGN +0376..0377 ; ID_Start # L& [2] GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA..GREEK SMALL LETTER PAMPHYLIAN DIGAMMA +037A ; ID_Start # Lm GREEK YPOGEGRAMMENI +037B..037D ; ID_Start # L& [3] GREEK SMALL REVERSED LUNATE SIGMA SYMBOL..GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL +037F ; ID_Start # L& GREEK CAPITAL LETTER YOT +0386 ; ID_Start # L& GREEK CAPITAL LETTER ALPHA WITH TONOS +0388..038A ; ID_Start # L& [3] GREEK CAPITAL LETTER EPSILON WITH TONOS..GREEK CAPITAL LETTER IOTA WITH TONOS +038C ; ID_Start # L& GREEK CAPITAL LETTER OMICRON WITH TONOS +038E..03A1 ; ID_Start # L& [20] GREEK CAPITAL LETTER UPSILON WITH TONOS..GREEK CAPITAL LETTER RHO +03A3..03F5 ; ID_Start # L& [83] GREEK CAPITAL LETTER SIGMA..GREEK LUNATE EPSILON SYMBOL +03F7..0481 ; ID_Start # L& [139] GREEK CAPITAL LETTER SHO..CYRILLIC SMALL LETTER KOPPA +048A..052F ; ID_Start # L& [166] CYRILLIC CAPITAL LETTER SHORT I WITH TAIL..CYRILLIC SMALL LETTER EL WITH DESCENDER +0531..0556 ; ID_Start # L& [38] ARMENIAN CAPITAL LETTER AYB..ARMENIAN CAPITAL LETTER FEH +0559 ; ID_Start # Lm ARMENIAN MODIFIER LETTER LEFT HALF RING +0560..0588 ; ID_Start # L& [41] ARMENIAN SMALL LETTER TURNED AYB..ARMENIAN SMALL LETTER YI WITH STROKE +05D0..05EA ; ID_Start # Lo [27] HEBREW LETTER ALEF..HEBREW LETTER TAV +05EF..05F2 ; ID_Start # Lo [4] HEBREW YOD TRIANGLE..HEBREW LIGATURE YIDDISH DOUBLE YOD +0620..063F ; ID_Start # Lo [32] ARABIC LETTER KASHMIRI YEH..ARABIC LETTER FARSI YEH WITH THREE DOTS ABOVE +0640 ; ID_Start # Lm ARABIC TATWEEL +0641..064A ; ID_Start # Lo [10] ARABIC LETTER FEH..ARABIC LETTER YEH +066E..066F ; ID_Start # Lo [2] ARABIC LETTER DOTLESS BEH..ARABIC LETTER DOTLESS QAF +0671..06D3 ; ID_Start # Lo [99] ARABIC LETTER ALEF WASLA..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE +06D5 ; ID_Start # Lo ARABIC LETTER AE +06E5..06E6 ; ID_Start # Lm [2] ARABIC SMALL WAW..ARABIC SMALL YEH +06EE..06EF ; ID_Start # Lo [2] ARABIC LETTER DAL WITH INVERTED V..ARABIC LETTER REH WITH INVERTED V +06FA..06FC ; ID_Start # Lo [3] ARABIC LETTER SHEEN WITH DOT BELOW..ARABIC LETTER GHAIN WITH DOT BELOW +06FF ; ID_Start # Lo ARABIC LETTER HEH WITH INVERTED V +0710 ; ID_Start # Lo SYRIAC LETTER ALAPH +0712..072F ; ID_Start # Lo [30] SYRIAC LETTER BETH..SYRIAC LETTER PERSIAN DHALATH +074D..07A5 ; ID_Start # Lo [89] SYRIAC LETTER SOGDIAN ZHAIN..THAANA LETTER WAAVU +07B1 ; ID_Start # Lo THAANA LETTER NAA +07CA..07EA ; ID_Start # Lo [33] NKO LETTER A..NKO LETTER JONA RA +07F4..07F5 ; ID_Start # Lm [2] NKO HIGH TONE APOSTROPHE..NKO LOW TONE APOSTROPHE +07FA ; ID_Start # Lm NKO LAJANYALAN +0800..0815 ; ID_Start # Lo [22] SAMARITAN LETTER ALAF..SAMARITAN LETTER TAAF +081A ; ID_Start # Lm SAMARITAN MODIFIER LETTER EPENTHETIC YUT +0824 ; ID_Start # Lm SAMARITAN MODIFIER LETTER SHORT A +0828 ; ID_Start # Lm SAMARITAN MODIFIER LETTER I +0840..0858 ; ID_Start # Lo [25] MANDAIC LETTER HALQA..MANDAIC LETTER AIN +0860..086A ; ID_Start # Lo [11] SYRIAC LETTER MALAYALAM NGA..SYRIAC LETTER MALAYALAM SSA +08A0..08B4 ; ID_Start # Lo [21] ARABIC LETTER BEH WITH SMALL V BELOW..ARABIC LETTER KAF WITH DOT BELOW +08B6..08BD ; ID_Start # Lo [8] ARABIC LETTER BEH WITH SMALL MEEM ABOVE..ARABIC LETTER AFRICAN NOON +0904..0939 ; ID_Start # Lo [54] DEVANAGARI LETTER SHORT A..DEVANAGARI LETTER HA +093D ; ID_Start # Lo DEVANAGARI SIGN AVAGRAHA +0950 ; ID_Start # Lo DEVANAGARI OM +0958..0961 ; ID_Start # Lo [10] DEVANAGARI LETTER QA..DEVANAGARI LETTER VOCALIC LL +0971 ; ID_Start # Lm DEVANAGARI SIGN HIGH SPACING DOT +0972..0980 ; ID_Start # Lo [15] DEVANAGARI LETTER CANDRA A..BENGALI ANJI +0985..098C ; ID_Start # Lo [8] BENGALI LETTER A..BENGALI LETTER VOCALIC L +098F..0990 ; ID_Start # Lo [2] BENGALI LETTER E..BENGALI LETTER AI +0993..09A8 ; ID_Start # Lo [22] BENGALI LETTER O..BENGALI LETTER NA +09AA..09B0 ; ID_Start # Lo [7] BENGALI LETTER PA..BENGALI LETTER RA +09B2 ; ID_Start # Lo BENGALI LETTER LA +09B6..09B9 ; ID_Start # Lo [4] BENGALI LETTER SHA..BENGALI LETTER HA +09BD ; ID_Start # Lo BENGALI SIGN AVAGRAHA +09CE ; ID_Start # Lo BENGALI LETTER KHANDA TA +09DC..09DD ; ID_Start # Lo [2] BENGALI LETTER RRA..BENGALI LETTER RHA +09DF..09E1 ; ID_Start # Lo [3] BENGALI LETTER YYA..BENGALI LETTER VOCALIC LL +09F0..09F1 ; ID_Start # Lo [2] BENGALI LETTER RA WITH MIDDLE DIAGONAL..BENGALI LETTER RA WITH LOWER DIAGONAL +09FC ; ID_Start # Lo BENGALI LETTER VEDIC ANUSVARA +0A05..0A0A ; ID_Start # Lo [6] GURMUKHI LETTER A..GURMUKHI LETTER UU +0A0F..0A10 ; ID_Start # Lo [2] GURMUKHI LETTER EE..GURMUKHI LETTER AI +0A13..0A28 ; ID_Start # Lo [22] GURMUKHI LETTER OO..GURMUKHI LETTER NA +0A2A..0A30 ; ID_Start # Lo [7] GURMUKHI LETTER PA..GURMUKHI LETTER RA +0A32..0A33 ; ID_Start # Lo [2] GURMUKHI LETTER LA..GURMUKHI LETTER LLA +0A35..0A36 ; ID_Start # Lo [2] GURMUKHI LETTER VA..GURMUKHI LETTER SHA +0A38..0A39 ; ID_Start # Lo [2] GURMUKHI LETTER SA..GURMUKHI LETTER HA +0A59..0A5C ; ID_Start # Lo [4] GURMUKHI LETTER KHHA..GURMUKHI LETTER RRA +0A5E ; ID_Start # Lo GURMUKHI LETTER FA +0A72..0A74 ; ID_Start # Lo [3] GURMUKHI IRI..GURMUKHI EK ONKAR +0A85..0A8D ; ID_Start # Lo [9] GUJARATI LETTER A..GUJARATI VOWEL CANDRA E +0A8F..0A91 ; ID_Start # Lo [3] GUJARATI LETTER E..GUJARATI VOWEL CANDRA O +0A93..0AA8 ; ID_Start # Lo [22] GUJARATI LETTER O..GUJARATI LETTER NA +0AAA..0AB0 ; ID_Start # Lo [7] GUJARATI LETTER PA..GUJARATI LETTER RA +0AB2..0AB3 ; ID_Start # Lo [2] GUJARATI LETTER LA..GUJARATI LETTER LLA +0AB5..0AB9 ; ID_Start # Lo [5] GUJARATI LETTER VA..GUJARATI LETTER HA +0ABD ; ID_Start # Lo GUJARATI SIGN AVAGRAHA +0AD0 ; ID_Start # Lo GUJARATI OM +0AE0..0AE1 ; ID_Start # Lo [2] GUJARATI LETTER VOCALIC RR..GUJARATI LETTER VOCALIC LL +0AF9 ; ID_Start # Lo GUJARATI LETTER ZHA +0B05..0B0C ; ID_Start # Lo [8] ORIYA LETTER A..ORIYA LETTER VOCALIC L +0B0F..0B10 ; ID_Start # Lo [2] ORIYA LETTER E..ORIYA LETTER AI +0B13..0B28 ; ID_Start # Lo [22] ORIYA LETTER O..ORIYA LETTER NA +0B2A..0B30 ; ID_Start # Lo [7] ORIYA LETTER PA..ORIYA LETTER RA +0B32..0B33 ; ID_Start # Lo [2] ORIYA LETTER LA..ORIYA LETTER LLA +0B35..0B39 ; ID_Start # Lo [5] ORIYA LETTER VA..ORIYA LETTER HA +0B3D ; ID_Start # Lo ORIYA SIGN AVAGRAHA +0B5C..0B5D ; ID_Start # Lo [2] ORIYA LETTER RRA..ORIYA LETTER RHA +0B5F..0B61 ; ID_Start # Lo [3] ORIYA LETTER YYA..ORIYA LETTER VOCALIC LL +0B71 ; ID_Start # Lo ORIYA LETTER WA +0B83 ; ID_Start # Lo TAMIL SIGN VISARGA +0B85..0B8A ; ID_Start # Lo [6] TAMIL LETTER A..TAMIL LETTER UU +0B8E..0B90 ; ID_Start # Lo [3] TAMIL LETTER E..TAMIL LETTER AI +0B92..0B95 ; ID_Start # Lo [4] TAMIL LETTER O..TAMIL LETTER KA +0B99..0B9A ; ID_Start # Lo [2] TAMIL LETTER NGA..TAMIL LETTER CA +0B9C ; ID_Start # Lo TAMIL LETTER JA +0B9E..0B9F ; ID_Start # Lo [2] TAMIL LETTER NYA..TAMIL LETTER TTA +0BA3..0BA4 ; ID_Start # Lo [2] TAMIL LETTER NNA..TAMIL LETTER TA +0BA8..0BAA ; ID_Start # Lo [3] TAMIL LETTER NA..TAMIL LETTER PA +0BAE..0BB9 ; ID_Start # Lo [12] TAMIL LETTER MA..TAMIL LETTER HA +0BD0 ; ID_Start # Lo TAMIL OM +0C05..0C0C ; ID_Start # Lo [8] TELUGU LETTER A..TELUGU LETTER VOCALIC L +0C0E..0C10 ; ID_Start # Lo [3] TELUGU LETTER E..TELUGU LETTER AI +0C12..0C28 ; ID_Start # Lo [23] TELUGU LETTER O..TELUGU LETTER NA +0C2A..0C39 ; ID_Start # Lo [16] TELUGU LETTER PA..TELUGU LETTER HA +0C3D ; ID_Start # Lo TELUGU SIGN AVAGRAHA +0C58..0C5A ; ID_Start # Lo [3] TELUGU LETTER TSA..TELUGU LETTER RRRA +0C60..0C61 ; ID_Start # Lo [2] TELUGU LETTER VOCALIC RR..TELUGU LETTER VOCALIC LL +0C80 ; ID_Start # Lo KANNADA SIGN SPACING CANDRABINDU +0C85..0C8C ; ID_Start # Lo [8] KANNADA LETTER A..KANNADA LETTER VOCALIC L +0C8E..0C90 ; ID_Start # Lo [3] KANNADA LETTER E..KANNADA LETTER AI +0C92..0CA8 ; ID_Start # Lo [23] KANNADA LETTER O..KANNADA LETTER NA +0CAA..0CB3 ; ID_Start # Lo [10] KANNADA LETTER PA..KANNADA LETTER LLA +0CB5..0CB9 ; ID_Start # Lo [5] KANNADA LETTER VA..KANNADA LETTER HA +0CBD ; ID_Start # Lo KANNADA SIGN AVAGRAHA +0CDE ; ID_Start # Lo KANNADA LETTER FA +0CE0..0CE1 ; ID_Start # Lo [2] KANNADA LETTER VOCALIC RR..KANNADA LETTER VOCALIC LL +0CF1..0CF2 ; ID_Start # Lo [2] KANNADA SIGN JIHVAMULIYA..KANNADA SIGN UPADHMANIYA +0D05..0D0C ; ID_Start # Lo [8] MALAYALAM LETTER A..MALAYALAM LETTER VOCALIC L +0D0E..0D10 ; ID_Start # Lo [3] MALAYALAM LETTER E..MALAYALAM LETTER AI +0D12..0D3A ; ID_Start # Lo [41] MALAYALAM LETTER O..MALAYALAM LETTER TTTA +0D3D ; ID_Start # Lo MALAYALAM SIGN AVAGRAHA +0D4E ; ID_Start # Lo MALAYALAM LETTER DOT REPH +0D54..0D56 ; ID_Start # Lo [3] MALAYALAM LETTER CHILLU M..MALAYALAM LETTER CHILLU LLL +0D5F..0D61 ; ID_Start # Lo [3] MALAYALAM LETTER ARCHAIC II..MALAYALAM LETTER VOCALIC LL +0D7A..0D7F ; ID_Start # Lo [6] MALAYALAM LETTER CHILLU NN..MALAYALAM LETTER CHILLU K +0D85..0D96 ; ID_Start # Lo [18] SINHALA LETTER AYANNA..SINHALA LETTER AUYANNA +0D9A..0DB1 ; ID_Start # Lo [24] SINHALA LETTER ALPAPRAANA KAYANNA..SINHALA LETTER DANTAJA NAYANNA +0DB3..0DBB ; ID_Start # Lo [9] SINHALA LETTER SANYAKA DAYANNA..SINHALA LETTER RAYANNA +0DBD ; ID_Start # Lo SINHALA LETTER DANTAJA LAYANNA +0DC0..0DC6 ; ID_Start # Lo [7] SINHALA LETTER VAYANNA..SINHALA LETTER FAYANNA +0E01..0E30 ; ID_Start # Lo [48] THAI CHARACTER KO KAI..THAI CHARACTER SARA A +0E32..0E33 ; ID_Start # Lo [2] THAI CHARACTER SARA AA..THAI CHARACTER SARA AM +0E40..0E45 ; ID_Start # Lo [6] THAI CHARACTER SARA E..THAI CHARACTER LAKKHANGYAO +0E46 ; ID_Start # Lm THAI CHARACTER MAIYAMOK +0E81..0E82 ; ID_Start # Lo [2] LAO LETTER KO..LAO LETTER KHO SUNG +0E84 ; ID_Start # Lo LAO LETTER KHO TAM +0E87..0E88 ; ID_Start # Lo [2] LAO LETTER NGO..LAO LETTER CO +0E8A ; ID_Start # Lo LAO LETTER SO TAM +0E8D ; ID_Start # Lo LAO LETTER NYO +0E94..0E97 ; ID_Start # Lo [4] LAO LETTER DO..LAO LETTER THO TAM +0E99..0E9F ; ID_Start # Lo [7] LAO LETTER NO..LAO LETTER FO SUNG +0EA1..0EA3 ; ID_Start # Lo [3] LAO LETTER MO..LAO LETTER LO LING +0EA5 ; ID_Start # Lo LAO LETTER LO LOOT +0EA7 ; ID_Start # Lo LAO LETTER WO +0EAA..0EAB ; ID_Start # Lo [2] LAO LETTER SO SUNG..LAO LETTER HO SUNG +0EAD..0EB0 ; ID_Start # Lo [4] LAO LETTER O..LAO VOWEL SIGN A +0EB2..0EB3 ; ID_Start # Lo [2] LAO VOWEL SIGN AA..LAO VOWEL SIGN AM +0EBD ; ID_Start # Lo LAO SEMIVOWEL SIGN NYO +0EC0..0EC4 ; ID_Start # Lo [5] LAO VOWEL SIGN E..LAO VOWEL SIGN AI +0EC6 ; ID_Start # Lm LAO KO LA +0EDC..0EDF ; ID_Start # Lo [4] LAO HO NO..LAO LETTER KHMU NYO +0F00 ; ID_Start # Lo TIBETAN SYLLABLE OM +0F40..0F47 ; ID_Start # Lo [8] TIBETAN LETTER KA..TIBETAN LETTER JA +0F49..0F6C ; ID_Start # Lo [36] TIBETAN LETTER NYA..TIBETAN LETTER RRA +0F88..0F8C ; ID_Start # Lo [5] TIBETAN SIGN LCE TSA CAN..TIBETAN SIGN INVERTED MCHU CAN +1000..102A ; ID_Start # Lo [43] MYANMAR LETTER KA..MYANMAR LETTER AU +103F ; ID_Start # Lo MYANMAR LETTER GREAT SA +1050..1055 ; ID_Start # Lo [6] MYANMAR LETTER SHA..MYANMAR LETTER VOCALIC LL +105A..105D ; ID_Start # Lo [4] MYANMAR LETTER MON NGA..MYANMAR LETTER MON BBE +1061 ; ID_Start # Lo MYANMAR LETTER SGAW KAREN SHA +1065..1066 ; ID_Start # Lo [2] MYANMAR LETTER WESTERN PWO KAREN THA..MYANMAR LETTER WESTERN PWO KAREN PWA +106E..1070 ; ID_Start # Lo [3] MYANMAR LETTER EASTERN PWO KAREN NNA..MYANMAR LETTER EASTERN PWO KAREN GHWA +1075..1081 ; ID_Start # Lo [13] MYANMAR LETTER SHAN KA..MYANMAR LETTER SHAN HA +108E ; ID_Start # Lo MYANMAR LETTER RUMAI PALAUNG FA +10A0..10C5 ; ID_Start # L& [38] GEORGIAN CAPITAL LETTER AN..GEORGIAN CAPITAL LETTER HOE +10C7 ; ID_Start # L& GEORGIAN CAPITAL LETTER YN +10CD ; ID_Start # L& GEORGIAN CAPITAL LETTER AEN +10D0..10FA ; ID_Start # L& [43] GEORGIAN LETTER AN..GEORGIAN LETTER AIN +10FC ; ID_Start # Lm MODIFIER LETTER GEORGIAN NAR +10FD..10FF ; ID_Start # L& [3] GEORGIAN LETTER AEN..GEORGIAN LETTER LABIAL SIGN +1100..1248 ; ID_Start # Lo [329] HANGUL CHOSEONG KIYEOK..ETHIOPIC SYLLABLE QWA +124A..124D ; ID_Start # Lo [4] ETHIOPIC SYLLABLE QWI..ETHIOPIC SYLLABLE QWE +1250..1256 ; ID_Start # Lo [7] ETHIOPIC SYLLABLE QHA..ETHIOPIC SYLLABLE QHO +1258 ; ID_Start # Lo ETHIOPIC SYLLABLE QHWA +125A..125D ; ID_Start # Lo [4] ETHIOPIC SYLLABLE QHWI..ETHIOPIC SYLLABLE QHWE +1260..1288 ; ID_Start # Lo [41] ETHIOPIC SYLLABLE BA..ETHIOPIC SYLLABLE XWA +128A..128D ; ID_Start # Lo [4] ETHIOPIC SYLLABLE XWI..ETHIOPIC SYLLABLE XWE +1290..12B0 ; ID_Start # Lo [33] ETHIOPIC SYLLABLE NA..ETHIOPIC SYLLABLE KWA +12B2..12B5 ; ID_Start # Lo [4] ETHIOPIC SYLLABLE KWI..ETHIOPIC SYLLABLE KWE +12B8..12BE ; ID_Start # Lo [7] ETHIOPIC SYLLABLE KXA..ETHIOPIC SYLLABLE KXO +12C0 ; ID_Start # Lo ETHIOPIC SYLLABLE KXWA +12C2..12C5 ; ID_Start # Lo [4] ETHIOPIC SYLLABLE KXWI..ETHIOPIC SYLLABLE KXWE +12C8..12D6 ; ID_Start # Lo [15] ETHIOPIC SYLLABLE WA..ETHIOPIC SYLLABLE PHARYNGEAL O +12D8..1310 ; ID_Start # Lo [57] ETHIOPIC SYLLABLE ZA..ETHIOPIC SYLLABLE GWA +1312..1315 ; ID_Start # Lo [4] ETHIOPIC SYLLABLE GWI..ETHIOPIC SYLLABLE GWE +1318..135A ; ID_Start # Lo [67] ETHIOPIC SYLLABLE GGA..ETHIOPIC SYLLABLE FYA +1380..138F ; ID_Start # Lo [16] ETHIOPIC SYLLABLE SEBATBEIT MWA..ETHIOPIC SYLLABLE PWE +13A0..13F5 ; ID_Start # L& [86] CHEROKEE LETTER A..CHEROKEE LETTER MV +13F8..13FD ; ID_Start # L& [6] CHEROKEE SMALL LETTER YE..CHEROKEE SMALL LETTER MV +1401..166C ; ID_Start # Lo [620] CANADIAN SYLLABICS E..CANADIAN SYLLABICS CARRIER TTSA +166F..167F ; ID_Start # Lo [17] CANADIAN SYLLABICS QAI..CANADIAN SYLLABICS BLACKFOOT W +1681..169A ; ID_Start # Lo [26] OGHAM LETTER BEITH..OGHAM LETTER PEITH +16A0..16EA ; ID_Start # Lo [75] RUNIC LETTER FEHU FEOH FE F..RUNIC LETTER X +16EE..16F0 ; ID_Start # Nl [3] RUNIC ARLAUG SYMBOL..RUNIC BELGTHOR SYMBOL +16F1..16F8 ; ID_Start # Lo [8] RUNIC LETTER K..RUNIC LETTER FRANKS CASKET AESC +1700..170C ; ID_Start # Lo [13] TAGALOG LETTER A..TAGALOG LETTER YA +170E..1711 ; ID_Start # Lo [4] TAGALOG LETTER LA..TAGALOG LETTER HA +1720..1731 ; ID_Start # Lo [18] HANUNOO LETTER A..HANUNOO LETTER HA +1740..1751 ; ID_Start # Lo [18] BUHID LETTER A..BUHID LETTER HA +1760..176C ; ID_Start # Lo [13] TAGBANWA LETTER A..TAGBANWA LETTER YA +176E..1770 ; ID_Start # Lo [3] TAGBANWA LETTER LA..TAGBANWA LETTER SA +1780..17B3 ; ID_Start # Lo [52] KHMER LETTER KA..KHMER INDEPENDENT VOWEL QAU +17D7 ; ID_Start # Lm KHMER SIGN LEK TOO +17DC ; ID_Start # Lo KHMER SIGN AVAKRAHASANYA +1820..1842 ; ID_Start # Lo [35] MONGOLIAN LETTER A..MONGOLIAN LETTER CHI +1843 ; ID_Start # Lm MONGOLIAN LETTER TODO LONG VOWEL SIGN +1844..1878 ; ID_Start # Lo [53] MONGOLIAN LETTER TODO E..MONGOLIAN LETTER CHA WITH TWO DOTS +1880..1884 ; ID_Start # Lo [5] MONGOLIAN LETTER ALI GALI ANUSVARA ONE..MONGOLIAN LETTER ALI GALI INVERTED UBADAMA +1885..1886 ; ID_Start # Mn [2] MONGOLIAN LETTER ALI GALI BALUDA..MONGOLIAN LETTER ALI GALI THREE BALUDA +1887..18A8 ; ID_Start # Lo [34] MONGOLIAN LETTER ALI GALI A..MONGOLIAN LETTER MANCHU ALI GALI BHA +18AA ; ID_Start # Lo MONGOLIAN LETTER MANCHU ALI GALI LHA +18B0..18F5 ; ID_Start # Lo [70] CANADIAN SYLLABICS OY..CANADIAN SYLLABICS CARRIER DENTAL S +1900..191E ; ID_Start # Lo [31] LIMBU VOWEL-CARRIER LETTER..LIMBU LETTER TRA +1950..196D ; ID_Start # Lo [30] TAI LE LETTER KA..TAI LE LETTER AI +1970..1974 ; ID_Start # Lo [5] TAI LE LETTER TONE-2..TAI LE LETTER TONE-6 +1980..19AB ; ID_Start # Lo [44] NEW TAI LUE LETTER HIGH QA..NEW TAI LUE LETTER LOW SUA +19B0..19C9 ; ID_Start # Lo [26] NEW TAI LUE VOWEL SIGN VOWEL SHORTENER..NEW TAI LUE TONE MARK-2 +1A00..1A16 ; ID_Start # Lo [23] BUGINESE LETTER KA..BUGINESE LETTER HA +1A20..1A54 ; ID_Start # Lo [53] TAI THAM LETTER HIGH KA..TAI THAM LETTER GREAT SA +1AA7 ; ID_Start # Lm TAI THAM SIGN MAI YAMOK +1B05..1B33 ; ID_Start # Lo [47] BALINESE LETTER AKARA..BALINESE LETTER HA +1B45..1B4B ; ID_Start # Lo [7] BALINESE LETTER KAF SASAK..BALINESE LETTER ASYURA SASAK +1B83..1BA0 ; ID_Start # Lo [30] SUNDANESE LETTER A..SUNDANESE LETTER HA +1BAE..1BAF ; ID_Start # Lo [2] SUNDANESE LETTER KHA..SUNDANESE LETTER SYA +1BBA..1BE5 ; ID_Start # Lo [44] SUNDANESE AVAGRAHA..BATAK LETTER U +1C00..1C23 ; ID_Start # Lo [36] LEPCHA LETTER KA..LEPCHA LETTER A +1C4D..1C4F ; ID_Start # Lo [3] LEPCHA LETTER TTA..LEPCHA LETTER DDA +1C5A..1C77 ; ID_Start # Lo [30] OL CHIKI LETTER LA..OL CHIKI LETTER OH +1C78..1C7D ; ID_Start # Lm [6] OL CHIKI MU TTUDDAG..OL CHIKI AHAD +1C80..1C88 ; ID_Start # L& [9] CYRILLIC SMALL LETTER ROUNDED VE..CYRILLIC SMALL LETTER UNBLENDED UK +1C90..1CBA ; ID_Start # L& [43] GEORGIAN MTAVRULI CAPITAL LETTER AN..GEORGIAN MTAVRULI CAPITAL LETTER AIN +1CBD..1CBF ; ID_Start # L& [3] GEORGIAN MTAVRULI CAPITAL LETTER AEN..GEORGIAN MTAVRULI CAPITAL LETTER LABIAL SIGN +1CE9..1CEC ; ID_Start # Lo [4] VEDIC SIGN ANUSVARA ANTARGOMUKHA..VEDIC SIGN ANUSVARA VAMAGOMUKHA WITH TAIL +1CEE..1CF1 ; ID_Start # Lo [4] VEDIC SIGN HEXIFORM LONG ANUSVARA..VEDIC SIGN ANUSVARA UBHAYATO MUKHA +1CF5..1CF6 ; ID_Start # Lo [2] VEDIC SIGN JIHVAMULIYA..VEDIC SIGN UPADHMANIYA +1D00..1D2B ; ID_Start # L& [44] LATIN LETTER SMALL CAPITAL A..CYRILLIC LETTER SMALL CAPITAL EL +1D2C..1D6A ; ID_Start # Lm [63] MODIFIER LETTER CAPITAL A..GREEK SUBSCRIPT SMALL LETTER CHI +1D6B..1D77 ; ID_Start # L& [13] LATIN SMALL LETTER UE..LATIN SMALL LETTER TURNED G +1D78 ; ID_Start # Lm MODIFIER LETTER CYRILLIC EN +1D79..1D9A ; ID_Start # L& [34] LATIN SMALL LETTER INSULAR G..LATIN SMALL LETTER EZH WITH RETROFLEX HOOK +1D9B..1DBF ; ID_Start # Lm [37] MODIFIER LETTER SMALL TURNED ALPHA..MODIFIER LETTER SMALL THETA +1E00..1F15 ; ID_Start # L& [278] LATIN CAPITAL LETTER A WITH RING BELOW..GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA +1F18..1F1D ; ID_Start # L& [6] GREEK CAPITAL LETTER EPSILON WITH PSILI..GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA +1F20..1F45 ; ID_Start # L& [38] GREEK SMALL LETTER ETA WITH PSILI..GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA +1F48..1F4D ; ID_Start # L& [6] GREEK CAPITAL LETTER OMICRON WITH PSILI..GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA +1F50..1F57 ; ID_Start # L& [8] GREEK SMALL LETTER UPSILON WITH PSILI..GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI +1F59 ; ID_Start # L& GREEK CAPITAL LETTER UPSILON WITH DASIA +1F5B ; ID_Start # L& GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA +1F5D ; ID_Start # L& GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA +1F5F..1F7D ; ID_Start # L& [31] GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI..GREEK SMALL LETTER OMEGA WITH OXIA +1F80..1FB4 ; ID_Start # L& [53] GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI..GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI +1FB6..1FBC ; ID_Start # L& [7] GREEK SMALL LETTER ALPHA WITH PERISPOMENI..GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI +1FBE ; ID_Start # L& GREEK PROSGEGRAMMENI +1FC2..1FC4 ; ID_Start # L& [3] GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI +1FC6..1FCC ; ID_Start # L& [7] GREEK SMALL LETTER ETA WITH PERISPOMENI..GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI +1FD0..1FD3 ; ID_Start # L& [4] GREEK SMALL LETTER IOTA WITH VRACHY..GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA +1FD6..1FDB ; ID_Start # L& [6] GREEK SMALL LETTER IOTA WITH PERISPOMENI..GREEK CAPITAL LETTER IOTA WITH OXIA +1FE0..1FEC ; ID_Start # L& [13] GREEK SMALL LETTER UPSILON WITH VRACHY..GREEK CAPITAL LETTER RHO WITH DASIA +1FF2..1FF4 ; ID_Start # L& [3] GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI +1FF6..1FFC ; ID_Start # L& [7] GREEK SMALL LETTER OMEGA WITH PERISPOMENI..GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI +2071 ; ID_Start # Lm SUPERSCRIPT LATIN SMALL LETTER I +207F ; ID_Start # Lm SUPERSCRIPT LATIN SMALL LETTER N +2090..209C ; ID_Start # Lm [13] LATIN SUBSCRIPT SMALL LETTER A..LATIN SUBSCRIPT SMALL LETTER T +2102 ; ID_Start # L& DOUBLE-STRUCK CAPITAL C +2107 ; ID_Start # L& EULER CONSTANT +210A..2113 ; ID_Start # L& [10] SCRIPT SMALL G..SCRIPT SMALL L +2115 ; ID_Start # L& DOUBLE-STRUCK CAPITAL N +2118 ; ID_Start # Sm SCRIPT CAPITAL P +2119..211D ; ID_Start # L& [5] DOUBLE-STRUCK CAPITAL P..DOUBLE-STRUCK CAPITAL R +2124 ; ID_Start # L& DOUBLE-STRUCK CAPITAL Z +2126 ; ID_Start # L& OHM SIGN +2128 ; ID_Start # L& BLACK-LETTER CAPITAL Z +212A..212D ; ID_Start # L& [4] KELVIN SIGN..BLACK-LETTER CAPITAL C +212E ; ID_Start # So ESTIMATED SYMBOL +212F..2134 ; ID_Start # L& [6] SCRIPT SMALL E..SCRIPT SMALL O +2135..2138 ; ID_Start # Lo [4] ALEF SYMBOL..DALET SYMBOL +2139 ; ID_Start # L& INFORMATION SOURCE +213C..213F ; ID_Start # L& [4] DOUBLE-STRUCK SMALL PI..DOUBLE-STRUCK CAPITAL PI +2145..2149 ; ID_Start # L& [5] DOUBLE-STRUCK ITALIC CAPITAL D..DOUBLE-STRUCK ITALIC SMALL J +214E ; ID_Start # L& TURNED SMALL F +2160..2182 ; ID_Start # Nl [35] ROMAN NUMERAL ONE..ROMAN NUMERAL TEN THOUSAND +2183..2184 ; ID_Start # L& [2] ROMAN NUMERAL REVERSED ONE HUNDRED..LATIN SMALL LETTER REVERSED C +2185..2188 ; ID_Start # Nl [4] ROMAN NUMERAL SIX LATE FORM..ROMAN NUMERAL ONE HUNDRED THOUSAND +2C00..2C2E ; ID_Start # L& [47] GLAGOLITIC CAPITAL LETTER AZU..GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE +2C30..2C5E ; ID_Start # L& [47] GLAGOLITIC SMALL LETTER AZU..GLAGOLITIC SMALL LETTER LATINATE MYSLITE +2C60..2C7B ; ID_Start # L& [28] LATIN CAPITAL LETTER L WITH DOUBLE BAR..LATIN LETTER SMALL CAPITAL TURNED E +2C7C..2C7D ; ID_Start # Lm [2] LATIN SUBSCRIPT SMALL LETTER J..MODIFIER LETTER CAPITAL V +2C7E..2CE4 ; ID_Start # L& [103] LATIN CAPITAL LETTER S WITH SWASH TAIL..COPTIC SYMBOL KAI +2CEB..2CEE ; ID_Start # L& [4] COPTIC CAPITAL LETTER CRYPTOGRAMMIC SHEI..COPTIC SMALL LETTER CRYPTOGRAMMIC GANGIA +2CF2..2CF3 ; ID_Start # L& [2] COPTIC CAPITAL LETTER BOHAIRIC KHEI..COPTIC SMALL LETTER BOHAIRIC KHEI +2D00..2D25 ; ID_Start # L& [38] GEORGIAN SMALL LETTER AN..GEORGIAN SMALL LETTER HOE +2D27 ; ID_Start # L& GEORGIAN SMALL LETTER YN +2D2D ; ID_Start # L& GEORGIAN SMALL LETTER AEN +2D30..2D67 ; ID_Start # Lo [56] TIFINAGH LETTER YA..TIFINAGH LETTER YO +2D6F ; ID_Start # Lm TIFINAGH MODIFIER LETTER LABIALIZATION MARK +2D80..2D96 ; ID_Start # Lo [23] ETHIOPIC SYLLABLE LOA..ETHIOPIC SYLLABLE GGWE +2DA0..2DA6 ; ID_Start # Lo [7] ETHIOPIC SYLLABLE SSA..ETHIOPIC SYLLABLE SSO +2DA8..2DAE ; ID_Start # Lo [7] ETHIOPIC SYLLABLE CCA..ETHIOPIC SYLLABLE CCO +2DB0..2DB6 ; ID_Start # Lo [7] ETHIOPIC SYLLABLE ZZA..ETHIOPIC SYLLABLE ZZO +2DB8..2DBE ; ID_Start # Lo [7] ETHIOPIC SYLLABLE CCHA..ETHIOPIC SYLLABLE CCHO +2DC0..2DC6 ; ID_Start # Lo [7] ETHIOPIC SYLLABLE QYA..ETHIOPIC SYLLABLE QYO +2DC8..2DCE ; ID_Start # Lo [7] ETHIOPIC SYLLABLE KYA..ETHIOPIC SYLLABLE KYO +2DD0..2DD6 ; ID_Start # Lo [7] ETHIOPIC SYLLABLE XYA..ETHIOPIC SYLLABLE XYO +2DD8..2DDE ; ID_Start # Lo [7] ETHIOPIC SYLLABLE GYA..ETHIOPIC SYLLABLE GYO +3005 ; ID_Start # Lm IDEOGRAPHIC ITERATION MARK +3006 ; ID_Start # Lo IDEOGRAPHIC CLOSING MARK +3007 ; ID_Start # Nl IDEOGRAPHIC NUMBER ZERO +3021..3029 ; ID_Start # Nl [9] HANGZHOU NUMERAL ONE..HANGZHOU NUMERAL NINE +3031..3035 ; ID_Start # Lm [5] VERTICAL KANA REPEAT MARK..VERTICAL KANA REPEAT MARK LOWER HALF +3038..303A ; ID_Start # Nl [3] HANGZHOU NUMERAL TEN..HANGZHOU NUMERAL THIRTY +303B ; ID_Start # Lm VERTICAL IDEOGRAPHIC ITERATION MARK +303C ; ID_Start # Lo MASU MARK +3041..3096 ; ID_Start # Lo [86] HIRAGANA LETTER SMALL A..HIRAGANA LETTER SMALL KE +309B..309C ; ID_Start # Sk [2] KATAKANA-HIRAGANA VOICED SOUND MARK..KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK +309D..309E ; ID_Start # Lm [2] HIRAGANA ITERATION MARK..HIRAGANA VOICED ITERATION MARK +309F ; ID_Start # Lo HIRAGANA DIGRAPH YORI +30A1..30FA ; ID_Start # Lo [90] KATAKANA LETTER SMALL A..KATAKANA LETTER VO +30FC..30FE ; ID_Start # Lm [3] KATAKANA-HIRAGANA PROLONGED SOUND MARK..KATAKANA VOICED ITERATION MARK +30FF ; ID_Start # Lo KATAKANA DIGRAPH KOTO +3105..312F ; ID_Start # Lo [43] BOPOMOFO LETTER B..BOPOMOFO LETTER NN +3131..318E ; ID_Start # Lo [94] HANGUL LETTER KIYEOK..HANGUL LETTER ARAEAE +31A0..31BA ; ID_Start # Lo [27] BOPOMOFO LETTER BU..BOPOMOFO LETTER ZY +31F0..31FF ; ID_Start # Lo [16] KATAKANA LETTER SMALL KU..KATAKANA LETTER SMALL RO +3400..4DB5 ; ID_Start # Lo [6582] CJK UNIFIED IDEOGRAPH-3400..CJK UNIFIED IDEOGRAPH-4DB5 +4E00..9FEF ; ID_Start # Lo [20976] CJK UNIFIED IDEOGRAPH-4E00..CJK UNIFIED IDEOGRAPH-9FEF +A000..A014 ; ID_Start # Lo [21] YI SYLLABLE IT..YI SYLLABLE E +A015 ; ID_Start # Lm YI SYLLABLE WU +A016..A48C ; ID_Start # Lo [1143] YI SYLLABLE BIT..YI SYLLABLE YYR +A4D0..A4F7 ; ID_Start # Lo [40] LISU LETTER BA..LISU LETTER OE +A4F8..A4FD ; ID_Start # Lm [6] LISU LETTER TONE MYA TI..LISU LETTER TONE MYA JEU +A500..A60B ; ID_Start # Lo [268] VAI SYLLABLE EE..VAI SYLLABLE NG +A60C ; ID_Start # Lm VAI SYLLABLE LENGTHENER +A610..A61F ; ID_Start # Lo [16] VAI SYLLABLE NDOLE FA..VAI SYMBOL JONG +A62A..A62B ; ID_Start # Lo [2] VAI SYLLABLE NDOLE MA..VAI SYLLABLE NDOLE DO +A640..A66D ; ID_Start # L& [46] CYRILLIC CAPITAL LETTER ZEMLYA..CYRILLIC SMALL LETTER DOUBLE MONOCULAR O +A66E ; ID_Start # Lo CYRILLIC LETTER MULTIOCULAR O +A67F ; ID_Start # Lm CYRILLIC PAYEROK +A680..A69B ; ID_Start # L& [28] CYRILLIC CAPITAL LETTER DWE..CYRILLIC SMALL LETTER CROSSED O +A69C..A69D ; ID_Start # Lm [2] MODIFIER LETTER CYRILLIC HARD SIGN..MODIFIER LETTER CYRILLIC SOFT SIGN +A6A0..A6E5 ; ID_Start # Lo [70] BAMUM LETTER A..BAMUM LETTER KI +A6E6..A6EF ; ID_Start # Nl [10] BAMUM LETTER MO..BAMUM LETTER KOGHOM +A717..A71F ; ID_Start # Lm [9] MODIFIER LETTER DOT VERTICAL BAR..MODIFIER LETTER LOW INVERTED EXCLAMATION MARK +A722..A76F ; ID_Start # L& [78] LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF..LATIN SMALL LETTER CON +A770 ; ID_Start # Lm MODIFIER LETTER US +A771..A787 ; ID_Start # L& [23] LATIN SMALL LETTER DUM..LATIN SMALL LETTER INSULAR T +A788 ; ID_Start # Lm MODIFIER LETTER LOW CIRCUMFLEX ACCENT +A78B..A78E ; ID_Start # L& [4] LATIN CAPITAL LETTER SALTILLO..LATIN SMALL LETTER L WITH RETROFLEX HOOK AND BELT +A78F ; ID_Start # Lo LATIN LETTER SINOLOGICAL DOT +A790..A7B9 ; ID_Start # L& [42] LATIN CAPITAL LETTER N WITH DESCENDER..LATIN SMALL LETTER U WITH STROKE +A7F7 ; ID_Start # Lo LATIN EPIGRAPHIC LETTER SIDEWAYS I +A7F8..A7F9 ; ID_Start # Lm [2] MODIFIER LETTER CAPITAL H WITH STROKE..MODIFIER LETTER SMALL LIGATURE OE +A7FA ; ID_Start # L& LATIN LETTER SMALL CAPITAL TURNED M +A7FB..A801 ; ID_Start # Lo [7] LATIN EPIGRAPHIC LETTER REVERSED F..SYLOTI NAGRI LETTER I +A803..A805 ; ID_Start # Lo [3] SYLOTI NAGRI LETTER U..SYLOTI NAGRI LETTER O +A807..A80A ; ID_Start # Lo [4] SYLOTI NAGRI LETTER KO..SYLOTI NAGRI LETTER GHO +A80C..A822 ; ID_Start # Lo [23] SYLOTI NAGRI LETTER CO..SYLOTI NAGRI LETTER HO +A840..A873 ; ID_Start # Lo [52] PHAGS-PA LETTER KA..PHAGS-PA LETTER CANDRABINDU +A882..A8B3 ; ID_Start # Lo [50] SAURASHTRA LETTER A..SAURASHTRA LETTER LLA +A8F2..A8F7 ; ID_Start # Lo [6] DEVANAGARI SIGN SPACING CANDRABINDU..DEVANAGARI SIGN CANDRABINDU AVAGRAHA +A8FB ; ID_Start # Lo DEVANAGARI HEADSTROKE +A8FD..A8FE ; ID_Start # Lo [2] DEVANAGARI JAIN OM..DEVANAGARI LETTER AY +A90A..A925 ; ID_Start # Lo [28] KAYAH LI LETTER KA..KAYAH LI LETTER OO +A930..A946 ; ID_Start # Lo [23] REJANG LETTER KA..REJANG LETTER A +A960..A97C ; ID_Start # Lo [29] HANGUL CHOSEONG TIKEUT-MIEUM..HANGUL CHOSEONG SSANGYEORINHIEUH +A984..A9B2 ; ID_Start # Lo [47] JAVANESE LETTER A..JAVANESE LETTER HA +A9CF ; ID_Start # Lm JAVANESE PANGRANGKEP +A9E0..A9E4 ; ID_Start # Lo [5] MYANMAR LETTER SHAN GHA..MYANMAR LETTER SHAN BHA +A9E6 ; ID_Start # Lm MYANMAR MODIFIER LETTER SHAN REDUPLICATION +A9E7..A9EF ; ID_Start # Lo [9] MYANMAR LETTER TAI LAING NYA..MYANMAR LETTER TAI LAING NNA +A9FA..A9FE ; ID_Start # Lo [5] MYANMAR LETTER TAI LAING LLA..MYANMAR LETTER TAI LAING BHA +AA00..AA28 ; ID_Start # Lo [41] CHAM LETTER A..CHAM LETTER HA +AA40..AA42 ; ID_Start # Lo [3] CHAM LETTER FINAL K..CHAM LETTER FINAL NG +AA44..AA4B ; ID_Start # Lo [8] CHAM LETTER FINAL CH..CHAM LETTER FINAL SS +AA60..AA6F ; ID_Start # Lo [16] MYANMAR LETTER KHAMTI GA..MYANMAR LETTER KHAMTI FA +AA70 ; ID_Start # Lm MYANMAR MODIFIER LETTER KHAMTI REDUPLICATION +AA71..AA76 ; ID_Start # Lo [6] MYANMAR LETTER KHAMTI XA..MYANMAR LOGOGRAM KHAMTI HM +AA7A ; ID_Start # Lo MYANMAR LETTER AITON RA +AA7E..AAAF ; ID_Start # Lo [50] MYANMAR LETTER SHWE PALAUNG CHA..TAI VIET LETTER HIGH O +AAB1 ; ID_Start # Lo TAI VIET VOWEL AA +AAB5..AAB6 ; ID_Start # Lo [2] TAI VIET VOWEL E..TAI VIET VOWEL O +AAB9..AABD ; ID_Start # Lo [5] TAI VIET VOWEL UEA..TAI VIET VOWEL AN +AAC0 ; ID_Start # Lo TAI VIET TONE MAI NUENG +AAC2 ; ID_Start # Lo TAI VIET TONE MAI SONG +AADB..AADC ; ID_Start # Lo [2] TAI VIET SYMBOL KON..TAI VIET SYMBOL NUENG +AADD ; ID_Start # Lm TAI VIET SYMBOL SAM +AAE0..AAEA ; ID_Start # Lo [11] MEETEI MAYEK LETTER E..MEETEI MAYEK LETTER SSA +AAF2 ; ID_Start # Lo MEETEI MAYEK ANJI +AAF3..AAF4 ; ID_Start # Lm [2] MEETEI MAYEK SYLLABLE REPETITION MARK..MEETEI MAYEK WORD REPETITION MARK +AB01..AB06 ; ID_Start # Lo [6] ETHIOPIC SYLLABLE TTHU..ETHIOPIC SYLLABLE TTHO +AB09..AB0E ; ID_Start # Lo [6] ETHIOPIC SYLLABLE DDHU..ETHIOPIC SYLLABLE DDHO +AB11..AB16 ; ID_Start # Lo [6] ETHIOPIC SYLLABLE DZU..ETHIOPIC SYLLABLE DZO +AB20..AB26 ; ID_Start # Lo [7] ETHIOPIC SYLLABLE CCHHA..ETHIOPIC SYLLABLE CCHHO +AB28..AB2E ; ID_Start # Lo [7] ETHIOPIC SYLLABLE BBA..ETHIOPIC SYLLABLE BBO +AB30..AB5A ; ID_Start # L& [43] LATIN SMALL LETTER BARRED ALPHA..LATIN SMALL LETTER Y WITH SHORT RIGHT LEG +AB5C..AB5F ; ID_Start # Lm [4] MODIFIER LETTER SMALL HENG..MODIFIER LETTER SMALL U WITH LEFT HOOK +AB60..AB65 ; ID_Start # L& [6] LATIN SMALL LETTER SAKHA YAT..GREEK LETTER SMALL CAPITAL OMEGA +AB70..ABBF ; ID_Start # L& [80] CHEROKEE SMALL LETTER A..CHEROKEE SMALL LETTER YA +ABC0..ABE2 ; ID_Start # Lo [35] MEETEI MAYEK LETTER KOK..MEETEI MAYEK LETTER I LONSUM +AC00..D7A3 ; ID_Start # Lo [11172] HANGUL SYLLABLE GA..HANGUL SYLLABLE HIH +D7B0..D7C6 ; ID_Start # Lo [23] HANGUL JUNGSEONG O-YEO..HANGUL JUNGSEONG ARAEA-E +D7CB..D7FB ; ID_Start # Lo [49] HANGUL JONGSEONG NIEUN-RIEUL..HANGUL JONGSEONG PHIEUPH-THIEUTH +F900..FA6D ; ID_Start # Lo [366] CJK COMPATIBILITY IDEOGRAPH-F900..CJK COMPATIBILITY IDEOGRAPH-FA6D +FA70..FAD9 ; ID_Start # Lo [106] CJK COMPATIBILITY IDEOGRAPH-FA70..CJK COMPATIBILITY IDEOGRAPH-FAD9 +FB00..FB06 ; ID_Start # L& [7] LATIN SMALL LIGATURE FF..LATIN SMALL LIGATURE ST +FB13..FB17 ; ID_Start # L& [5] ARMENIAN SMALL LIGATURE MEN NOW..ARMENIAN SMALL LIGATURE MEN XEH +FB1D ; ID_Start # Lo HEBREW LETTER YOD WITH HIRIQ +FB1F..FB28 ; ID_Start # Lo [10] HEBREW LIGATURE YIDDISH YOD YOD PATAH..HEBREW LETTER WIDE TAV +FB2A..FB36 ; ID_Start # Lo [13] HEBREW LETTER SHIN WITH SHIN DOT..HEBREW LETTER ZAYIN WITH DAGESH +FB38..FB3C ; ID_Start # Lo [5] HEBREW LETTER TET WITH DAGESH..HEBREW LETTER LAMED WITH DAGESH +FB3E ; ID_Start # Lo HEBREW LETTER MEM WITH DAGESH +FB40..FB41 ; ID_Start # Lo [2] HEBREW LETTER NUN WITH DAGESH..HEBREW LETTER SAMEKH WITH DAGESH +FB43..FB44 ; ID_Start # Lo [2] HEBREW LETTER FINAL PE WITH DAGESH..HEBREW LETTER PE WITH DAGESH +FB46..FBB1 ; ID_Start # Lo [108] HEBREW LETTER TSADI WITH DAGESH..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM +FBD3..FD3D ; ID_Start # Lo [363] ARABIC LETTER NG ISOLATED FORM..ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM +FD50..FD8F ; ID_Start # Lo [64] ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM..ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM +FD92..FDC7 ; ID_Start # Lo [54] ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM..ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM +FDF0..FDFB ; ID_Start # Lo [12] ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM..ARABIC LIGATURE JALLAJALALOUHOU +FE70..FE74 ; ID_Start # Lo [5] ARABIC FATHATAN ISOLATED FORM..ARABIC KASRATAN ISOLATED FORM +FE76..FEFC ; ID_Start # Lo [135] ARABIC FATHA ISOLATED FORM..ARABIC LIGATURE LAM WITH ALEF FINAL FORM +FF21..FF3A ; ID_Start # L& [26] FULLWIDTH LATIN CAPITAL LETTER A..FULLWIDTH LATIN CAPITAL LETTER Z +FF41..FF5A ; ID_Start # L& [26] FULLWIDTH LATIN SMALL LETTER A..FULLWIDTH LATIN SMALL LETTER Z +FF66..FF6F ; ID_Start # Lo [10] HALFWIDTH KATAKANA LETTER WO..HALFWIDTH KATAKANA LETTER SMALL TU +FF70 ; ID_Start # Lm HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK +FF71..FF9D ; ID_Start # Lo [45] HALFWIDTH KATAKANA LETTER A..HALFWIDTH KATAKANA LETTER N +FF9E..FF9F ; ID_Start # Lm [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK +FFA0..FFBE ; ID_Start # Lo [31] HALFWIDTH HANGUL FILLER..HALFWIDTH HANGUL LETTER HIEUH +FFC2..FFC7 ; ID_Start # Lo [6] HALFWIDTH HANGUL LETTER A..HALFWIDTH HANGUL LETTER E +FFCA..FFCF ; ID_Start # Lo [6] HALFWIDTH HANGUL LETTER YEO..HALFWIDTH HANGUL LETTER OE +FFD2..FFD7 ; ID_Start # Lo [6] HALFWIDTH HANGUL LETTER YO..HALFWIDTH HANGUL LETTER YU +FFDA..FFDC ; ID_Start # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL LETTER I +10000..1000B ; ID_Start # Lo [12] LINEAR B SYLLABLE B008 A..LINEAR B SYLLABLE B046 JE +1000D..10026 ; ID_Start # Lo [26] LINEAR B SYLLABLE B036 JO..LINEAR B SYLLABLE B032 QO +10028..1003A ; ID_Start # Lo [19] LINEAR B SYLLABLE B060 RA..LINEAR B SYLLABLE B042 WO +1003C..1003D ; ID_Start # Lo [2] LINEAR B SYLLABLE B017 ZA..LINEAR B SYLLABLE B074 ZE +1003F..1004D ; ID_Start # Lo [15] LINEAR B SYLLABLE B020 ZO..LINEAR B SYLLABLE B091 TWO +10050..1005D ; ID_Start # Lo [14] LINEAR B SYMBOL B018..LINEAR B SYMBOL B089 +10080..100FA ; ID_Start # Lo [123] LINEAR B IDEOGRAM B100 MAN..LINEAR B IDEOGRAM VESSEL B305 +10140..10174 ; ID_Start # Nl [53] GREEK ACROPHONIC ATTIC ONE QUARTER..GREEK ACROPHONIC STRATIAN FIFTY MNAS +10280..1029C ; ID_Start # Lo [29] LYCIAN LETTER A..LYCIAN LETTER X +102A0..102D0 ; ID_Start # Lo [49] CARIAN LETTER A..CARIAN LETTER UUU3 +10300..1031F ; ID_Start # Lo [32] OLD ITALIC LETTER A..OLD ITALIC LETTER ESS +1032D..10340 ; ID_Start # Lo [20] OLD ITALIC LETTER YE..GOTHIC LETTER PAIRTHRA +10341 ; ID_Start # Nl GOTHIC LETTER NINETY +10342..10349 ; ID_Start # Lo [8] GOTHIC LETTER RAIDA..GOTHIC LETTER OTHAL +1034A ; ID_Start # Nl GOTHIC LETTER NINE HUNDRED +10350..10375 ; ID_Start # Lo [38] OLD PERMIC LETTER AN..OLD PERMIC LETTER IA +10380..1039D ; ID_Start # Lo [30] UGARITIC LETTER ALPA..UGARITIC LETTER SSU +103A0..103C3 ; ID_Start # Lo [36] OLD PERSIAN SIGN A..OLD PERSIAN SIGN HA +103C8..103CF ; ID_Start # Lo [8] OLD PERSIAN SIGN AURAMAZDAA..OLD PERSIAN SIGN BUUMISH +103D1..103D5 ; ID_Start # Nl [5] OLD PERSIAN NUMBER ONE..OLD PERSIAN NUMBER HUNDRED +10400..1044F ; ID_Start # L& [80] DESERET CAPITAL LETTER LONG I..DESERET SMALL LETTER EW +10450..1049D ; ID_Start # Lo [78] SHAVIAN LETTER PEEP..OSMANYA LETTER OO +104B0..104D3 ; ID_Start # L& [36] OSAGE CAPITAL LETTER A..OSAGE CAPITAL LETTER ZHA +104D8..104FB ; ID_Start # L& [36] OSAGE SMALL LETTER A..OSAGE SMALL LETTER ZHA +10500..10527 ; ID_Start # Lo [40] ELBASAN LETTER A..ELBASAN LETTER KHE +10530..10563 ; ID_Start # Lo [52] CAUCASIAN ALBANIAN LETTER ALT..CAUCASIAN ALBANIAN LETTER KIW +10600..10736 ; ID_Start # Lo [311] LINEAR A SIGN AB001..LINEAR A SIGN A664 +10740..10755 ; ID_Start # Lo [22] LINEAR A SIGN A701 A..LINEAR A SIGN A732 JE +10760..10767 ; ID_Start # Lo [8] LINEAR A SIGN A800..LINEAR A SIGN A807 +10800..10805 ; ID_Start # Lo [6] CYPRIOT SYLLABLE A..CYPRIOT SYLLABLE JA +10808 ; ID_Start # Lo CYPRIOT SYLLABLE JO +1080A..10835 ; ID_Start # Lo [44] CYPRIOT SYLLABLE KA..CYPRIOT SYLLABLE WO +10837..10838 ; ID_Start # Lo [2] CYPRIOT SYLLABLE XA..CYPRIOT SYLLABLE XE +1083C ; ID_Start # Lo CYPRIOT SYLLABLE ZA +1083F..10855 ; ID_Start # Lo [23] CYPRIOT SYLLABLE ZO..IMPERIAL ARAMAIC LETTER TAW +10860..10876 ; ID_Start # Lo [23] PALMYRENE LETTER ALEPH..PALMYRENE LETTER TAW +10880..1089E ; ID_Start # Lo [31] NABATAEAN LETTER FINAL ALEPH..NABATAEAN LETTER TAW +108E0..108F2 ; ID_Start # Lo [19] HATRAN LETTER ALEPH..HATRAN LETTER QOPH +108F4..108F5 ; ID_Start # Lo [2] HATRAN LETTER SHIN..HATRAN LETTER TAW +10900..10915 ; ID_Start # Lo [22] PHOENICIAN LETTER ALF..PHOENICIAN LETTER TAU +10920..10939 ; ID_Start # Lo [26] LYDIAN LETTER A..LYDIAN LETTER C +10980..109B7 ; ID_Start # Lo [56] MEROITIC HIEROGLYPHIC LETTER A..MEROITIC CURSIVE LETTER DA +109BE..109BF ; ID_Start # Lo [2] MEROITIC CURSIVE LOGOGRAM RMT..MEROITIC CURSIVE LOGOGRAM IMN +10A00 ; ID_Start # Lo KHAROSHTHI LETTER A +10A10..10A13 ; ID_Start # Lo [4] KHAROSHTHI LETTER KA..KHAROSHTHI LETTER GHA +10A15..10A17 ; ID_Start # Lo [3] KHAROSHTHI LETTER CA..KHAROSHTHI LETTER JA +10A19..10A35 ; ID_Start # Lo [29] KHAROSHTHI LETTER NYA..KHAROSHTHI LETTER VHA +10A60..10A7C ; ID_Start # Lo [29] OLD SOUTH ARABIAN LETTER HE..OLD SOUTH ARABIAN LETTER THETH +10A80..10A9C ; ID_Start # Lo [29] OLD NORTH ARABIAN LETTER HEH..OLD NORTH ARABIAN LETTER ZAH +10AC0..10AC7 ; ID_Start # Lo [8] MANICHAEAN LETTER ALEPH..MANICHAEAN LETTER WAW +10AC9..10AE4 ; ID_Start # Lo [28] MANICHAEAN LETTER ZAYIN..MANICHAEAN LETTER TAW +10B00..10B35 ; ID_Start # Lo [54] AVESTAN LETTER A..AVESTAN LETTER HE +10B40..10B55 ; ID_Start # Lo [22] INSCRIPTIONAL PARTHIAN LETTER ALEPH..INSCRIPTIONAL PARTHIAN LETTER TAW +10B60..10B72 ; ID_Start # Lo [19] INSCRIPTIONAL PAHLAVI LETTER ALEPH..INSCRIPTIONAL PAHLAVI LETTER TAW +10B80..10B91 ; ID_Start # Lo [18] PSALTER PAHLAVI LETTER ALEPH..PSALTER PAHLAVI LETTER TAW +10C00..10C48 ; ID_Start # Lo [73] OLD TURKIC LETTER ORKHON A..OLD TURKIC LETTER ORKHON BASH +10C80..10CB2 ; ID_Start # L& [51] OLD HUNGARIAN CAPITAL LETTER A..OLD HUNGARIAN CAPITAL LETTER US +10CC0..10CF2 ; ID_Start # L& [51] OLD HUNGARIAN SMALL LETTER A..OLD HUNGARIAN SMALL LETTER US +10D00..10D23 ; ID_Start # Lo [36] HANIFI ROHINGYA LETTER A..HANIFI ROHINGYA MARK NA KHONNA +10F00..10F1C ; ID_Start # Lo [29] OLD SOGDIAN LETTER ALEPH..OLD SOGDIAN LETTER FINAL TAW WITH VERTICAL TAIL +10F27 ; ID_Start # Lo OLD SOGDIAN LIGATURE AYIN-DALETH +10F30..10F45 ; ID_Start # Lo [22] SOGDIAN LETTER ALEPH..SOGDIAN INDEPENDENT SHIN +11003..11037 ; ID_Start # Lo [53] BRAHMI SIGN JIHVAMULIYA..BRAHMI LETTER OLD TAMIL NNNA +11083..110AF ; ID_Start # Lo [45] KAITHI LETTER A..KAITHI LETTER HA +110D0..110E8 ; ID_Start # Lo [25] SORA SOMPENG LETTER SAH..SORA SOMPENG LETTER MAE +11103..11126 ; ID_Start # Lo [36] CHAKMA LETTER AA..CHAKMA LETTER HAA +11144 ; ID_Start # Lo CHAKMA LETTER LHAA +11150..11172 ; ID_Start # Lo [35] MAHAJANI LETTER A..MAHAJANI LETTER RRA +11176 ; ID_Start # Lo MAHAJANI LIGATURE SHRI +11183..111B2 ; ID_Start # Lo [48] SHARADA LETTER A..SHARADA LETTER HA +111C1..111C4 ; ID_Start # Lo [4] SHARADA SIGN AVAGRAHA..SHARADA OM +111DA ; ID_Start # Lo SHARADA EKAM +111DC ; ID_Start # Lo SHARADA HEADSTROKE +11200..11211 ; ID_Start # Lo [18] KHOJKI LETTER A..KHOJKI LETTER JJA +11213..1122B ; ID_Start # Lo [25] KHOJKI LETTER NYA..KHOJKI LETTER LLA +11280..11286 ; ID_Start # Lo [7] MULTANI LETTER A..MULTANI LETTER GA +11288 ; ID_Start # Lo MULTANI LETTER GHA +1128A..1128D ; ID_Start # Lo [4] MULTANI LETTER CA..MULTANI LETTER JJA +1128F..1129D ; ID_Start # Lo [15] MULTANI LETTER NYA..MULTANI LETTER BA +1129F..112A8 ; ID_Start # Lo [10] MULTANI LETTER BHA..MULTANI LETTER RHA +112B0..112DE ; ID_Start # Lo [47] KHUDAWADI LETTER A..KHUDAWADI LETTER HA +11305..1130C ; ID_Start # Lo [8] GRANTHA LETTER A..GRANTHA LETTER VOCALIC L +1130F..11310 ; ID_Start # Lo [2] GRANTHA LETTER EE..GRANTHA LETTER AI +11313..11328 ; ID_Start # Lo [22] GRANTHA LETTER OO..GRANTHA LETTER NA +1132A..11330 ; ID_Start # Lo [7] GRANTHA LETTER PA..GRANTHA LETTER RA +11332..11333 ; ID_Start # Lo [2] GRANTHA LETTER LA..GRANTHA LETTER LLA +11335..11339 ; ID_Start # Lo [5] GRANTHA LETTER VA..GRANTHA LETTER HA +1133D ; ID_Start # Lo GRANTHA SIGN AVAGRAHA +11350 ; ID_Start # Lo GRANTHA OM +1135D..11361 ; ID_Start # Lo [5] GRANTHA SIGN PLUTA..GRANTHA LETTER VOCALIC LL +11400..11434 ; ID_Start # Lo [53] NEWA LETTER A..NEWA LETTER HA +11447..1144A ; ID_Start # Lo [4] NEWA SIGN AVAGRAHA..NEWA SIDDHI +11480..114AF ; ID_Start # Lo [48] TIRHUTA ANJI..TIRHUTA LETTER HA +114C4..114C5 ; ID_Start # Lo [2] TIRHUTA SIGN AVAGRAHA..TIRHUTA GVANG +114C7 ; ID_Start # Lo TIRHUTA OM +11580..115AE ; ID_Start # Lo [47] SIDDHAM LETTER A..SIDDHAM LETTER HA +115D8..115DB ; ID_Start # Lo [4] SIDDHAM LETTER THREE-CIRCLE ALTERNATE I..SIDDHAM LETTER ALTERNATE U +11600..1162F ; ID_Start # Lo [48] MODI LETTER A..MODI LETTER LLA +11644 ; ID_Start # Lo MODI SIGN HUVA +11680..116AA ; ID_Start # Lo [43] TAKRI LETTER A..TAKRI LETTER RRA +11700..1171A ; ID_Start # Lo [27] AHOM LETTER KA..AHOM LETTER ALTERNATE BA +11800..1182B ; ID_Start # Lo [44] DOGRA LETTER A..DOGRA LETTER RRA +118A0..118DF ; ID_Start # L& [64] WARANG CITI CAPITAL LETTER NGAA..WARANG CITI SMALL LETTER VIYO +118FF ; ID_Start # Lo WARANG CITI OM +11A00 ; ID_Start # Lo ZANABAZAR SQUARE LETTER A +11A0B..11A32 ; ID_Start # Lo [40] ZANABAZAR SQUARE LETTER KA..ZANABAZAR SQUARE LETTER KSSA +11A3A ; ID_Start # Lo ZANABAZAR SQUARE CLUSTER-INITIAL LETTER RA +11A50 ; ID_Start # Lo SOYOMBO LETTER A +11A5C..11A83 ; ID_Start # Lo [40] SOYOMBO LETTER KA..SOYOMBO LETTER KSSA +11A86..11A89 ; ID_Start # Lo [4] SOYOMBO CLUSTER-INITIAL LETTER RA..SOYOMBO CLUSTER-INITIAL LETTER SA +11A9D ; ID_Start # Lo SOYOMBO MARK PLUTA +11AC0..11AF8 ; ID_Start # Lo [57] PAU CIN HAU LETTER PA..PAU CIN HAU GLOTTAL STOP FINAL +11C00..11C08 ; ID_Start # Lo [9] BHAIKSUKI LETTER A..BHAIKSUKI LETTER VOCALIC L +11C0A..11C2E ; ID_Start # Lo [37] BHAIKSUKI LETTER E..BHAIKSUKI LETTER HA +11C40 ; ID_Start # Lo BHAIKSUKI SIGN AVAGRAHA +11C72..11C8F ; ID_Start # Lo [30] MARCHEN LETTER KA..MARCHEN LETTER A +11D00..11D06 ; ID_Start # Lo [7] MASARAM GONDI LETTER A..MASARAM GONDI LETTER E +11D08..11D09 ; ID_Start # Lo [2] MASARAM GONDI LETTER AI..MASARAM GONDI LETTER O +11D0B..11D30 ; ID_Start # Lo [38] MASARAM GONDI LETTER AU..MASARAM GONDI LETTER TRA +11D46 ; ID_Start # Lo MASARAM GONDI REPHA +11D60..11D65 ; ID_Start # Lo [6] GUNJALA GONDI LETTER A..GUNJALA GONDI LETTER UU +11D67..11D68 ; ID_Start # Lo [2] GUNJALA GONDI LETTER EE..GUNJALA GONDI LETTER AI +11D6A..11D89 ; ID_Start # Lo [32] GUNJALA GONDI LETTER OO..GUNJALA GONDI LETTER SA +11D98 ; ID_Start # Lo GUNJALA GONDI OM +11EE0..11EF2 ; ID_Start # Lo [19] MAKASAR LETTER KA..MAKASAR ANGKA +12000..12399 ; ID_Start # Lo [922] CUNEIFORM SIGN A..CUNEIFORM SIGN U U +12400..1246E ; ID_Start # Nl [111] CUNEIFORM NUMERIC SIGN TWO ASH..CUNEIFORM NUMERIC SIGN NINE U VARIANT FORM +12480..12543 ; ID_Start # Lo [196] CUNEIFORM SIGN AB TIMES NUN TENU..CUNEIFORM SIGN ZU5 TIMES THREE DISH TENU +13000..1342E ; ID_Start # Lo [1071] EGYPTIAN HIEROGLYPH A001..EGYPTIAN HIEROGLYPH AA032 +14400..14646 ; ID_Start # Lo [583] ANATOLIAN HIEROGLYPH A001..ANATOLIAN HIEROGLYPH A530 +16800..16A38 ; ID_Start # Lo [569] BAMUM LETTER PHASE-A NGKUE MFON..BAMUM LETTER PHASE-F VUEQ +16A40..16A5E ; ID_Start # Lo [31] MRO LETTER TA..MRO LETTER TEK +16AD0..16AED ; ID_Start # Lo [30] BASSA VAH LETTER ENNI..BASSA VAH LETTER I +16B00..16B2F ; ID_Start # Lo [48] PAHAWH HMONG VOWEL KEEB..PAHAWH HMONG CONSONANT CAU +16B40..16B43 ; ID_Start # Lm [4] PAHAWH HMONG SIGN VOS SEEV..PAHAWH HMONG SIGN IB YAM +16B63..16B77 ; ID_Start # Lo [21] PAHAWH HMONG SIGN VOS LUB..PAHAWH HMONG SIGN CIM NRES TOS +16B7D..16B8F ; ID_Start # Lo [19] PAHAWH HMONG CLAN SIGN TSHEEJ..PAHAWH HMONG CLAN SIGN VWJ +16E40..16E7F ; ID_Start # L& [64] MEDEFAIDRIN CAPITAL LETTER M..MEDEFAIDRIN SMALL LETTER Y +16F00..16F44 ; ID_Start # Lo [69] MIAO LETTER PA..MIAO LETTER HHA +16F50 ; ID_Start # Lo MIAO LETTER NASALIZATION +16F93..16F9F ; ID_Start # Lm [13] MIAO LETTER TONE-2..MIAO LETTER REFORMED TONE-8 +16FE0..16FE1 ; ID_Start # Lm [2] TANGUT ITERATION MARK..NUSHU ITERATION MARK +17000..187F1 ; ID_Start # Lo [6130] TANGUT IDEOGRAPH-17000..TANGUT IDEOGRAPH-187F1 +18800..18AF2 ; ID_Start # Lo [755] TANGUT COMPONENT-001..TANGUT COMPONENT-755 +1B000..1B11E ; ID_Start # Lo [287] KATAKANA LETTER ARCHAIC E..HENTAIGANA LETTER N-MU-MO-2 +1B170..1B2FB ; ID_Start # Lo [396] NUSHU CHARACTER-1B170..NUSHU CHARACTER-1B2FB +1BC00..1BC6A ; ID_Start # Lo [107] DUPLOYAN LETTER H..DUPLOYAN LETTER VOCALIC M +1BC70..1BC7C ; ID_Start # Lo [13] DUPLOYAN AFFIX LEFT HORIZONTAL SECANT..DUPLOYAN AFFIX ATTACHED TANGENT HOOK +1BC80..1BC88 ; ID_Start # Lo [9] DUPLOYAN AFFIX HIGH ACUTE..DUPLOYAN AFFIX HIGH VERTICAL +1BC90..1BC99 ; ID_Start # Lo [10] DUPLOYAN AFFIX LOW ACUTE..DUPLOYAN AFFIX LOW ARROW +1D400..1D454 ; ID_Start # L& [85] MATHEMATICAL BOLD CAPITAL A..MATHEMATICAL ITALIC SMALL G +1D456..1D49C ; ID_Start # L& [71] MATHEMATICAL ITALIC SMALL I..MATHEMATICAL SCRIPT CAPITAL A +1D49E..1D49F ; ID_Start # L& [2] MATHEMATICAL SCRIPT CAPITAL C..MATHEMATICAL SCRIPT CAPITAL D +1D4A2 ; ID_Start # L& MATHEMATICAL SCRIPT CAPITAL G +1D4A5..1D4A6 ; ID_Start # L& [2] MATHEMATICAL SCRIPT CAPITAL J..MATHEMATICAL SCRIPT CAPITAL K +1D4A9..1D4AC ; ID_Start # L& [4] MATHEMATICAL SCRIPT CAPITAL N..MATHEMATICAL SCRIPT CAPITAL Q +1D4AE..1D4B9 ; ID_Start # L& [12] MATHEMATICAL SCRIPT CAPITAL S..MATHEMATICAL SCRIPT SMALL D +1D4BB ; ID_Start # L& MATHEMATICAL SCRIPT SMALL F +1D4BD..1D4C3 ; ID_Start # L& [7] MATHEMATICAL SCRIPT SMALL H..MATHEMATICAL SCRIPT SMALL N +1D4C5..1D505 ; ID_Start # L& [65] MATHEMATICAL SCRIPT SMALL P..MATHEMATICAL FRAKTUR CAPITAL B +1D507..1D50A ; ID_Start # L& [4] MATHEMATICAL FRAKTUR CAPITAL D..MATHEMATICAL FRAKTUR CAPITAL G +1D50D..1D514 ; ID_Start # L& [8] MATHEMATICAL FRAKTUR CAPITAL J..MATHEMATICAL FRAKTUR CAPITAL Q +1D516..1D51C ; ID_Start # L& [7] MATHEMATICAL FRAKTUR CAPITAL S..MATHEMATICAL FRAKTUR CAPITAL Y +1D51E..1D539 ; ID_Start # L& [28] MATHEMATICAL FRAKTUR SMALL A..MATHEMATICAL DOUBLE-STRUCK CAPITAL B +1D53B..1D53E ; ID_Start # L& [4] MATHEMATICAL DOUBLE-STRUCK CAPITAL D..MATHEMATICAL DOUBLE-STRUCK CAPITAL G +1D540..1D544 ; ID_Start # L& [5] MATHEMATICAL DOUBLE-STRUCK CAPITAL I..MATHEMATICAL DOUBLE-STRUCK CAPITAL M +1D546 ; ID_Start # L& MATHEMATICAL DOUBLE-STRUCK CAPITAL O +1D54A..1D550 ; ID_Start # L& [7] MATHEMATICAL DOUBLE-STRUCK CAPITAL S..MATHEMATICAL DOUBLE-STRUCK CAPITAL Y +1D552..1D6A5 ; ID_Start # L& [340] MATHEMATICAL DOUBLE-STRUCK SMALL A..MATHEMATICAL ITALIC SMALL DOTLESS J +1D6A8..1D6C0 ; ID_Start # L& [25] MATHEMATICAL BOLD CAPITAL ALPHA..MATHEMATICAL BOLD CAPITAL OMEGA +1D6C2..1D6DA ; ID_Start # L& [25] MATHEMATICAL BOLD SMALL ALPHA..MATHEMATICAL BOLD SMALL OMEGA +1D6DC..1D6FA ; ID_Start # L& [31] MATHEMATICAL BOLD EPSILON SYMBOL..MATHEMATICAL ITALIC CAPITAL OMEGA +1D6FC..1D714 ; ID_Start # L& [25] MATHEMATICAL ITALIC SMALL ALPHA..MATHEMATICAL ITALIC SMALL OMEGA +1D716..1D734 ; ID_Start # L& [31] MATHEMATICAL ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD ITALIC CAPITAL OMEGA +1D736..1D74E ; ID_Start # L& [25] MATHEMATICAL BOLD ITALIC SMALL ALPHA..MATHEMATICAL BOLD ITALIC SMALL OMEGA +1D750..1D76E ; ID_Start # L& [31] MATHEMATICAL BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA +1D770..1D788 ; ID_Start # L& [25] MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA +1D78A..1D7A8 ; ID_Start # L& [31] MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA +1D7AA..1D7C2 ; ID_Start # L& [25] MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA +1D7C4..1D7CB ; ID_Start # L& [8] MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD SMALL DIGAMMA +1E800..1E8C4 ; ID_Start # Lo [197] MENDE KIKAKUI SYLLABLE M001 KI..MENDE KIKAKUI SYLLABLE M060 NYON +1E900..1E943 ; ID_Start # L& [68] ADLAM CAPITAL LETTER ALIF..ADLAM SMALL LETTER SHA +1EE00..1EE03 ; ID_Start # Lo [4] ARABIC MATHEMATICAL ALEF..ARABIC MATHEMATICAL DAL +1EE05..1EE1F ; ID_Start # Lo [27] ARABIC MATHEMATICAL WAW..ARABIC MATHEMATICAL DOTLESS QAF +1EE21..1EE22 ; ID_Start # Lo [2] ARABIC MATHEMATICAL INITIAL BEH..ARABIC MATHEMATICAL INITIAL JEEM +1EE24 ; ID_Start # Lo ARABIC MATHEMATICAL INITIAL HEH +1EE27 ; ID_Start # Lo ARABIC MATHEMATICAL INITIAL HAH +1EE29..1EE32 ; ID_Start # Lo [10] ARABIC MATHEMATICAL INITIAL YEH..ARABIC MATHEMATICAL INITIAL QAF +1EE34..1EE37 ; ID_Start # Lo [4] ARABIC MATHEMATICAL INITIAL SHEEN..ARABIC MATHEMATICAL INITIAL KHAH +1EE39 ; ID_Start # Lo ARABIC MATHEMATICAL INITIAL DAD +1EE3B ; ID_Start # Lo ARABIC MATHEMATICAL INITIAL GHAIN +1EE42 ; ID_Start # Lo ARABIC MATHEMATICAL TAILED JEEM +1EE47 ; ID_Start # Lo ARABIC MATHEMATICAL TAILED HAH +1EE49 ; ID_Start # Lo ARABIC MATHEMATICAL TAILED YEH +1EE4B ; ID_Start # Lo ARABIC MATHEMATICAL TAILED LAM +1EE4D..1EE4F ; ID_Start # Lo [3] ARABIC MATHEMATICAL TAILED NOON..ARABIC MATHEMATICAL TAILED AIN +1EE51..1EE52 ; ID_Start # Lo [2] ARABIC MATHEMATICAL TAILED SAD..ARABIC MATHEMATICAL TAILED QAF +1EE54 ; ID_Start # Lo ARABIC MATHEMATICAL TAILED SHEEN +1EE57 ; ID_Start # Lo ARABIC MATHEMATICAL TAILED KHAH +1EE59 ; ID_Start # Lo ARABIC MATHEMATICAL TAILED DAD +1EE5B ; ID_Start # Lo ARABIC MATHEMATICAL TAILED GHAIN +1EE5D ; ID_Start # Lo ARABIC MATHEMATICAL TAILED DOTLESS NOON +1EE5F ; ID_Start # Lo ARABIC MATHEMATICAL TAILED DOTLESS QAF +1EE61..1EE62 ; ID_Start # Lo [2] ARABIC MATHEMATICAL STRETCHED BEH..ARABIC MATHEMATICAL STRETCHED JEEM +1EE64 ; ID_Start # Lo ARABIC MATHEMATICAL STRETCHED HEH +1EE67..1EE6A ; ID_Start # Lo [4] ARABIC MATHEMATICAL STRETCHED HAH..ARABIC MATHEMATICAL STRETCHED KAF +1EE6C..1EE72 ; ID_Start # Lo [7] ARABIC MATHEMATICAL STRETCHED MEEM..ARABIC MATHEMATICAL STRETCHED QAF +1EE74..1EE77 ; ID_Start # Lo [4] ARABIC MATHEMATICAL STRETCHED SHEEN..ARABIC MATHEMATICAL STRETCHED KHAH +1EE79..1EE7C ; ID_Start # Lo [4] ARABIC MATHEMATICAL STRETCHED DAD..ARABIC MATHEMATICAL STRETCHED DOTLESS BEH +1EE7E ; ID_Start # Lo ARABIC MATHEMATICAL STRETCHED DOTLESS FEH +1EE80..1EE89 ; ID_Start # Lo [10] ARABIC MATHEMATICAL LOOPED ALEF..ARABIC MATHEMATICAL LOOPED YEH +1EE8B..1EE9B ; ID_Start # Lo [17] ARABIC MATHEMATICAL LOOPED LAM..ARABIC MATHEMATICAL LOOPED GHAIN +1EEA1..1EEA3 ; ID_Start # Lo [3] ARABIC MATHEMATICAL DOUBLE-STRUCK BEH..ARABIC MATHEMATICAL DOUBLE-STRUCK DAL +1EEA5..1EEA9 ; ID_Start # Lo [5] ARABIC MATHEMATICAL DOUBLE-STRUCK WAW..ARABIC MATHEMATICAL DOUBLE-STRUCK YEH +1EEAB..1EEBB ; ID_Start # Lo [17] ARABIC MATHEMATICAL DOUBLE-STRUCK LAM..ARABIC MATHEMATICAL DOUBLE-STRUCK GHAIN +20000..2A6D6 ; ID_Start # Lo [42711] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6D6 +2A700..2B734 ; ID_Start # Lo [4149] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B734 +2B740..2B81D ; ID_Start # Lo [222] CJK UNIFIED IDEOGRAPH-2B740..CJK UNIFIED IDEOGRAPH-2B81D +2B820..2CEA1 ; ID_Start # Lo [5762] CJK UNIFIED IDEOGRAPH-2B820..CJK UNIFIED IDEOGRAPH-2CEA1 +2CEB0..2EBE0 ; ID_Start # Lo [7473] CJK UNIFIED IDEOGRAPH-2CEB0..CJK UNIFIED IDEOGRAPH-2EBE0 +2F800..2FA1D ; ID_Start # Lo [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D + +# Total code points: 125660 + +# ================================================ + +# Derived Property: ID_Continue +# Characters that can continue an identifier. +# Generated from: +# ID_Start +# + Mn + Mc + Nd + Pc +# + Other_ID_Continue +# - Pattern_Syntax +# - Pattern_White_Space +# NOTE: See UAX #31 for more information + +0030..0039 ; ID_Continue # Nd [10] DIGIT ZERO..DIGIT NINE +0041..005A ; ID_Continue # L& [26] LATIN CAPITAL LETTER A..LATIN CAPITAL LETTER Z +005F ; ID_Continue # Pc LOW LINE +0061..007A ; ID_Continue # L& [26] LATIN SMALL LETTER A..LATIN SMALL LETTER Z +00AA ; ID_Continue # Lo FEMININE ORDINAL INDICATOR +00B5 ; ID_Continue # L& MICRO SIGN +00B7 ; ID_Continue # Po MIDDLE DOT +00BA ; ID_Continue # Lo MASCULINE ORDINAL INDICATOR +00C0..00D6 ; ID_Continue # L& [23] LATIN CAPITAL LETTER A WITH GRAVE..LATIN CAPITAL LETTER O WITH DIAERESIS +00D8..00F6 ; ID_Continue # L& [31] LATIN CAPITAL LETTER O WITH STROKE..LATIN SMALL LETTER O WITH DIAERESIS +00F8..01BA ; ID_Continue # L& [195] LATIN SMALL LETTER O WITH STROKE..LATIN SMALL LETTER EZH WITH TAIL +01BB ; ID_Continue # Lo LATIN LETTER TWO WITH STROKE +01BC..01BF ; ID_Continue # L& [4] LATIN CAPITAL LETTER TONE FIVE..LATIN LETTER WYNN +01C0..01C3 ; ID_Continue # Lo [4] LATIN LETTER DENTAL CLICK..LATIN LETTER RETROFLEX CLICK +01C4..0293 ; ID_Continue # L& [208] LATIN CAPITAL LETTER DZ WITH CARON..LATIN SMALL LETTER EZH WITH CURL +0294 ; ID_Continue # Lo LATIN LETTER GLOTTAL STOP +0295..02AF ; ID_Continue # L& [27] LATIN LETTER PHARYNGEAL VOICED FRICATIVE..LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL +02B0..02C1 ; ID_Continue # Lm [18] MODIFIER LETTER SMALL H..MODIFIER LETTER REVERSED GLOTTAL STOP +02C6..02D1 ; ID_Continue # Lm [12] MODIFIER LETTER CIRCUMFLEX ACCENT..MODIFIER LETTER HALF TRIANGULAR COLON +02E0..02E4 ; ID_Continue # Lm [5] MODIFIER LETTER SMALL GAMMA..MODIFIER LETTER SMALL REVERSED GLOTTAL STOP +02EC ; ID_Continue # Lm MODIFIER LETTER VOICING +02EE ; ID_Continue # Lm MODIFIER LETTER DOUBLE APOSTROPHE +0300..036F ; ID_Continue # Mn [112] COMBINING GRAVE ACCENT..COMBINING LATIN SMALL LETTER X +0370..0373 ; ID_Continue # L& [4] GREEK CAPITAL LETTER HETA..GREEK SMALL LETTER ARCHAIC SAMPI +0374 ; ID_Continue # Lm GREEK NUMERAL SIGN +0376..0377 ; ID_Continue # L& [2] GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA..GREEK SMALL LETTER PAMPHYLIAN DIGAMMA +037A ; ID_Continue # Lm GREEK YPOGEGRAMMENI +037B..037D ; ID_Continue # L& [3] GREEK SMALL REVERSED LUNATE SIGMA SYMBOL..GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL +037F ; ID_Continue # L& GREEK CAPITAL LETTER YOT +0386 ; ID_Continue # L& GREEK CAPITAL LETTER ALPHA WITH TONOS +0387 ; ID_Continue # Po GREEK ANO TELEIA +0388..038A ; ID_Continue # L& [3] GREEK CAPITAL LETTER EPSILON WITH TONOS..GREEK CAPITAL LETTER IOTA WITH TONOS +038C ; ID_Continue # L& GREEK CAPITAL LETTER OMICRON WITH TONOS +038E..03A1 ; ID_Continue # L& [20] GREEK CAPITAL LETTER UPSILON WITH TONOS..GREEK CAPITAL LETTER RHO +03A3..03F5 ; ID_Continue # L& [83] GREEK CAPITAL LETTER SIGMA..GREEK LUNATE EPSILON SYMBOL +03F7..0481 ; ID_Continue # L& [139] GREEK CAPITAL LETTER SHO..CYRILLIC SMALL LETTER KOPPA +0483..0487 ; ID_Continue # Mn [5] COMBINING CYRILLIC TITLO..COMBINING CYRILLIC POKRYTIE +048A..052F ; ID_Continue # L& [166] CYRILLIC CAPITAL LETTER SHORT I WITH TAIL..CYRILLIC SMALL LETTER EL WITH DESCENDER +0531..0556 ; ID_Continue # L& [38] ARMENIAN CAPITAL LETTER AYB..ARMENIAN CAPITAL LETTER FEH +0559 ; ID_Continue # Lm ARMENIAN MODIFIER LETTER LEFT HALF RING +0560..0588 ; ID_Continue # L& [41] ARMENIAN SMALL LETTER TURNED AYB..ARMENIAN SMALL LETTER YI WITH STROKE +0591..05BD ; ID_Continue # Mn [45] HEBREW ACCENT ETNAHTA..HEBREW POINT METEG +05BF ; ID_Continue # Mn HEBREW POINT RAFE +05C1..05C2 ; ID_Continue # Mn [2] HEBREW POINT SHIN DOT..HEBREW POINT SIN DOT +05C4..05C5 ; ID_Continue # Mn [2] HEBREW MARK UPPER DOT..HEBREW MARK LOWER DOT +05C7 ; ID_Continue # Mn HEBREW POINT QAMATS QATAN +05D0..05EA ; ID_Continue # Lo [27] HEBREW LETTER ALEF..HEBREW LETTER TAV +05EF..05F2 ; ID_Continue # Lo [4] HEBREW YOD TRIANGLE..HEBREW LIGATURE YIDDISH DOUBLE YOD +0610..061A ; ID_Continue # Mn [11] ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM..ARABIC SMALL KASRA +0620..063F ; ID_Continue # Lo [32] ARABIC LETTER KASHMIRI YEH..ARABIC LETTER FARSI YEH WITH THREE DOTS ABOVE +0640 ; ID_Continue # Lm ARABIC TATWEEL +0641..064A ; ID_Continue # Lo [10] ARABIC LETTER FEH..ARABIC LETTER YEH +064B..065F ; ID_Continue # Mn [21] ARABIC FATHATAN..ARABIC WAVY HAMZA BELOW +0660..0669 ; ID_Continue # Nd [10] ARABIC-INDIC DIGIT ZERO..ARABIC-INDIC DIGIT NINE +066E..066F ; ID_Continue # Lo [2] ARABIC LETTER DOTLESS BEH..ARABIC LETTER DOTLESS QAF +0670 ; ID_Continue # Mn ARABIC LETTER SUPERSCRIPT ALEF +0671..06D3 ; ID_Continue # Lo [99] ARABIC LETTER ALEF WASLA..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE +06D5 ; ID_Continue # Lo ARABIC LETTER AE +06D6..06DC ; ID_Continue # Mn [7] ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA..ARABIC SMALL HIGH SEEN +06DF..06E4 ; ID_Continue # Mn [6] ARABIC SMALL HIGH ROUNDED ZERO..ARABIC SMALL HIGH MADDA +06E5..06E6 ; ID_Continue # Lm [2] ARABIC SMALL WAW..ARABIC SMALL YEH +06E7..06E8 ; ID_Continue # Mn [2] ARABIC SMALL HIGH YEH..ARABIC SMALL HIGH NOON +06EA..06ED ; ID_Continue # Mn [4] ARABIC EMPTY CENTRE LOW STOP..ARABIC SMALL LOW MEEM +06EE..06EF ; ID_Continue # Lo [2] ARABIC LETTER DAL WITH INVERTED V..ARABIC LETTER REH WITH INVERTED V +06F0..06F9 ; ID_Continue # Nd [10] EXTENDED ARABIC-INDIC DIGIT ZERO..EXTENDED ARABIC-INDIC DIGIT NINE +06FA..06FC ; ID_Continue # Lo [3] ARABIC LETTER SHEEN WITH DOT BELOW..ARABIC LETTER GHAIN WITH DOT BELOW +06FF ; ID_Continue # Lo ARABIC LETTER HEH WITH INVERTED V +0710 ; ID_Continue # Lo SYRIAC LETTER ALAPH +0711 ; ID_Continue # Mn SYRIAC LETTER SUPERSCRIPT ALAPH +0712..072F ; ID_Continue # Lo [30] SYRIAC LETTER BETH..SYRIAC LETTER PERSIAN DHALATH +0730..074A ; ID_Continue # Mn [27] SYRIAC PTHAHA ABOVE..SYRIAC BARREKH +074D..07A5 ; ID_Continue # Lo [89] SYRIAC LETTER SOGDIAN ZHAIN..THAANA LETTER WAAVU +07A6..07B0 ; ID_Continue # Mn [11] THAANA ABAFILI..THAANA SUKUN +07B1 ; ID_Continue # Lo THAANA LETTER NAA +07C0..07C9 ; ID_Continue # Nd [10] NKO DIGIT ZERO..NKO DIGIT NINE +07CA..07EA ; ID_Continue # Lo [33] NKO LETTER A..NKO LETTER JONA RA +07EB..07F3 ; ID_Continue # Mn [9] NKO COMBINING SHORT HIGH TONE..NKO COMBINING DOUBLE DOT ABOVE +07F4..07F5 ; ID_Continue # Lm [2] NKO HIGH TONE APOSTROPHE..NKO LOW TONE APOSTROPHE +07FA ; ID_Continue # Lm NKO LAJANYALAN +07FD ; ID_Continue # Mn NKO DANTAYALAN +0800..0815 ; ID_Continue # Lo [22] SAMARITAN LETTER ALAF..SAMARITAN LETTER TAAF +0816..0819 ; ID_Continue # Mn [4] SAMARITAN MARK IN..SAMARITAN MARK DAGESH +081A ; ID_Continue # Lm SAMARITAN MODIFIER LETTER EPENTHETIC YUT +081B..0823 ; ID_Continue # Mn [9] SAMARITAN MARK EPENTHETIC YUT..SAMARITAN VOWEL SIGN A +0824 ; ID_Continue # Lm SAMARITAN MODIFIER LETTER SHORT A +0825..0827 ; ID_Continue # Mn [3] SAMARITAN VOWEL SIGN SHORT A..SAMARITAN VOWEL SIGN U +0828 ; ID_Continue # Lm SAMARITAN MODIFIER LETTER I +0829..082D ; ID_Continue # Mn [5] SAMARITAN VOWEL SIGN LONG I..SAMARITAN MARK NEQUDAA +0840..0858 ; ID_Continue # Lo [25] MANDAIC LETTER HALQA..MANDAIC LETTER AIN +0859..085B ; ID_Continue # Mn [3] MANDAIC AFFRICATION MARK..MANDAIC GEMINATION MARK +0860..086A ; ID_Continue # Lo [11] SYRIAC LETTER MALAYALAM NGA..SYRIAC LETTER MALAYALAM SSA +08A0..08B4 ; ID_Continue # Lo [21] ARABIC LETTER BEH WITH SMALL V BELOW..ARABIC LETTER KAF WITH DOT BELOW +08B6..08BD ; ID_Continue # Lo [8] ARABIC LETTER BEH WITH SMALL MEEM ABOVE..ARABIC LETTER AFRICAN NOON +08D3..08E1 ; ID_Continue # Mn [15] ARABIC SMALL LOW WAW..ARABIC SMALL HIGH SIGN SAFHA +08E3..0902 ; ID_Continue # Mn [32] ARABIC TURNED DAMMA BELOW..DEVANAGARI SIGN ANUSVARA +0903 ; ID_Continue # Mc DEVANAGARI SIGN VISARGA +0904..0939 ; ID_Continue # Lo [54] DEVANAGARI LETTER SHORT A..DEVANAGARI LETTER HA +093A ; ID_Continue # Mn DEVANAGARI VOWEL SIGN OE +093B ; ID_Continue # Mc DEVANAGARI VOWEL SIGN OOE +093C ; ID_Continue # Mn DEVANAGARI SIGN NUKTA +093D ; ID_Continue # Lo DEVANAGARI SIGN AVAGRAHA +093E..0940 ; ID_Continue # Mc [3] DEVANAGARI VOWEL SIGN AA..DEVANAGARI VOWEL SIGN II +0941..0948 ; ID_Continue # Mn [8] DEVANAGARI VOWEL SIGN U..DEVANAGARI VOWEL SIGN AI +0949..094C ; ID_Continue # Mc [4] DEVANAGARI VOWEL SIGN CANDRA O..DEVANAGARI VOWEL SIGN AU +094D ; ID_Continue # Mn DEVANAGARI SIGN VIRAMA +094E..094F ; ID_Continue # Mc [2] DEVANAGARI VOWEL SIGN PRISHTHAMATRA E..DEVANAGARI VOWEL SIGN AW +0950 ; ID_Continue # Lo DEVANAGARI OM +0951..0957 ; ID_Continue # Mn [7] DEVANAGARI STRESS SIGN UDATTA..DEVANAGARI VOWEL SIGN UUE +0958..0961 ; ID_Continue # Lo [10] DEVANAGARI LETTER QA..DEVANAGARI LETTER VOCALIC LL +0962..0963 ; ID_Continue # Mn [2] DEVANAGARI VOWEL SIGN VOCALIC L..DEVANAGARI VOWEL SIGN VOCALIC LL +0966..096F ; ID_Continue # Nd [10] DEVANAGARI DIGIT ZERO..DEVANAGARI DIGIT NINE +0971 ; ID_Continue # Lm DEVANAGARI SIGN HIGH SPACING DOT +0972..0980 ; ID_Continue # Lo [15] DEVANAGARI LETTER CANDRA A..BENGALI ANJI +0981 ; ID_Continue # Mn BENGALI SIGN CANDRABINDU +0982..0983 ; ID_Continue # Mc [2] BENGALI SIGN ANUSVARA..BENGALI SIGN VISARGA +0985..098C ; ID_Continue # Lo [8] BENGALI LETTER A..BENGALI LETTER VOCALIC L +098F..0990 ; ID_Continue # Lo [2] BENGALI LETTER E..BENGALI LETTER AI +0993..09A8 ; ID_Continue # Lo [22] BENGALI LETTER O..BENGALI LETTER NA +09AA..09B0 ; ID_Continue # Lo [7] BENGALI LETTER PA..BENGALI LETTER RA +09B2 ; ID_Continue # Lo BENGALI LETTER LA +09B6..09B9 ; ID_Continue # Lo [4] BENGALI LETTER SHA..BENGALI LETTER HA +09BC ; ID_Continue # Mn BENGALI SIGN NUKTA +09BD ; ID_Continue # Lo BENGALI SIGN AVAGRAHA +09BE..09C0 ; ID_Continue # Mc [3] BENGALI VOWEL SIGN AA..BENGALI VOWEL SIGN II +09C1..09C4 ; ID_Continue # Mn [4] BENGALI VOWEL SIGN U..BENGALI VOWEL SIGN VOCALIC RR +09C7..09C8 ; ID_Continue # Mc [2] BENGALI VOWEL SIGN E..BENGALI VOWEL SIGN AI +09CB..09CC ; ID_Continue # Mc [2] BENGALI VOWEL SIGN O..BENGALI VOWEL SIGN AU +09CD ; ID_Continue # Mn BENGALI SIGN VIRAMA +09CE ; ID_Continue # Lo BENGALI LETTER KHANDA TA +09D7 ; ID_Continue # Mc BENGALI AU LENGTH MARK +09DC..09DD ; ID_Continue # Lo [2] BENGALI LETTER RRA..BENGALI LETTER RHA +09DF..09E1 ; ID_Continue # Lo [3] BENGALI LETTER YYA..BENGALI LETTER VOCALIC LL +09E2..09E3 ; ID_Continue # Mn [2] BENGALI VOWEL SIGN VOCALIC L..BENGALI VOWEL SIGN VOCALIC LL +09E6..09EF ; ID_Continue # Nd [10] BENGALI DIGIT ZERO..BENGALI DIGIT NINE +09F0..09F1 ; ID_Continue # Lo [2] BENGALI LETTER RA WITH MIDDLE DIAGONAL..BENGALI LETTER RA WITH LOWER DIAGONAL +09FC ; ID_Continue # Lo BENGALI LETTER VEDIC ANUSVARA +09FE ; ID_Continue # Mn BENGALI SANDHI MARK +0A01..0A02 ; ID_Continue # Mn [2] GURMUKHI SIGN ADAK BINDI..GURMUKHI SIGN BINDI +0A03 ; ID_Continue # Mc GURMUKHI SIGN VISARGA +0A05..0A0A ; ID_Continue # Lo [6] GURMUKHI LETTER A..GURMUKHI LETTER UU +0A0F..0A10 ; ID_Continue # Lo [2] GURMUKHI LETTER EE..GURMUKHI LETTER AI +0A13..0A28 ; ID_Continue # Lo [22] GURMUKHI LETTER OO..GURMUKHI LETTER NA +0A2A..0A30 ; ID_Continue # Lo [7] GURMUKHI LETTER PA..GURMUKHI LETTER RA +0A32..0A33 ; ID_Continue # Lo [2] GURMUKHI LETTER LA..GURMUKHI LETTER LLA +0A35..0A36 ; ID_Continue # Lo [2] GURMUKHI LETTER VA..GURMUKHI LETTER SHA +0A38..0A39 ; ID_Continue # Lo [2] GURMUKHI LETTER SA..GURMUKHI LETTER HA +0A3C ; ID_Continue # Mn GURMUKHI SIGN NUKTA +0A3E..0A40 ; ID_Continue # Mc [3] GURMUKHI VOWEL SIGN AA..GURMUKHI VOWEL SIGN II +0A41..0A42 ; ID_Continue # Mn [2] GURMUKHI VOWEL SIGN U..GURMUKHI VOWEL SIGN UU +0A47..0A48 ; ID_Continue # Mn [2] GURMUKHI VOWEL SIGN EE..GURMUKHI VOWEL SIGN AI +0A4B..0A4D ; ID_Continue # Mn [3] GURMUKHI VOWEL SIGN OO..GURMUKHI SIGN VIRAMA +0A51 ; ID_Continue # Mn GURMUKHI SIGN UDAAT +0A59..0A5C ; ID_Continue # Lo [4] GURMUKHI LETTER KHHA..GURMUKHI LETTER RRA +0A5E ; ID_Continue # Lo GURMUKHI LETTER FA +0A66..0A6F ; ID_Continue # Nd [10] GURMUKHI DIGIT ZERO..GURMUKHI DIGIT NINE +0A70..0A71 ; ID_Continue # Mn [2] GURMUKHI TIPPI..GURMUKHI ADDAK +0A72..0A74 ; ID_Continue # Lo [3] GURMUKHI IRI..GURMUKHI EK ONKAR +0A75 ; ID_Continue # Mn GURMUKHI SIGN YAKASH +0A81..0A82 ; ID_Continue # Mn [2] GUJARATI SIGN CANDRABINDU..GUJARATI SIGN ANUSVARA +0A83 ; ID_Continue # Mc GUJARATI SIGN VISARGA +0A85..0A8D ; ID_Continue # Lo [9] GUJARATI LETTER A..GUJARATI VOWEL CANDRA E +0A8F..0A91 ; ID_Continue # Lo [3] GUJARATI LETTER E..GUJARATI VOWEL CANDRA O +0A93..0AA8 ; ID_Continue # Lo [22] GUJARATI LETTER O..GUJARATI LETTER NA +0AAA..0AB0 ; ID_Continue # Lo [7] GUJARATI LETTER PA..GUJARATI LETTER RA +0AB2..0AB3 ; ID_Continue # Lo [2] GUJARATI LETTER LA..GUJARATI LETTER LLA +0AB5..0AB9 ; ID_Continue # Lo [5] GUJARATI LETTER VA..GUJARATI LETTER HA +0ABC ; ID_Continue # Mn GUJARATI SIGN NUKTA +0ABD ; ID_Continue # Lo GUJARATI SIGN AVAGRAHA +0ABE..0AC0 ; ID_Continue # Mc [3] GUJARATI VOWEL SIGN AA..GUJARATI VOWEL SIGN II +0AC1..0AC5 ; ID_Continue # Mn [5] GUJARATI VOWEL SIGN U..GUJARATI VOWEL SIGN CANDRA E +0AC7..0AC8 ; ID_Continue # Mn [2] GUJARATI VOWEL SIGN E..GUJARATI VOWEL SIGN AI +0AC9 ; ID_Continue # Mc GUJARATI VOWEL SIGN CANDRA O +0ACB..0ACC ; ID_Continue # Mc [2] GUJARATI VOWEL SIGN O..GUJARATI VOWEL SIGN AU +0ACD ; ID_Continue # Mn GUJARATI SIGN VIRAMA +0AD0 ; ID_Continue # Lo GUJARATI OM +0AE0..0AE1 ; ID_Continue # Lo [2] GUJARATI LETTER VOCALIC RR..GUJARATI LETTER VOCALIC LL +0AE2..0AE3 ; ID_Continue # Mn [2] GUJARATI VOWEL SIGN VOCALIC L..GUJARATI VOWEL SIGN VOCALIC LL +0AE6..0AEF ; ID_Continue # Nd [10] GUJARATI DIGIT ZERO..GUJARATI DIGIT NINE +0AF9 ; ID_Continue # Lo GUJARATI LETTER ZHA +0AFA..0AFF ; ID_Continue # Mn [6] GUJARATI SIGN SUKUN..GUJARATI SIGN TWO-CIRCLE NUKTA ABOVE +0B01 ; ID_Continue # Mn ORIYA SIGN CANDRABINDU +0B02..0B03 ; ID_Continue # Mc [2] ORIYA SIGN ANUSVARA..ORIYA SIGN VISARGA +0B05..0B0C ; ID_Continue # Lo [8] ORIYA LETTER A..ORIYA LETTER VOCALIC L +0B0F..0B10 ; ID_Continue # Lo [2] ORIYA LETTER E..ORIYA LETTER AI +0B13..0B28 ; ID_Continue # Lo [22] ORIYA LETTER O..ORIYA LETTER NA +0B2A..0B30 ; ID_Continue # Lo [7] ORIYA LETTER PA..ORIYA LETTER RA +0B32..0B33 ; ID_Continue # Lo [2] ORIYA LETTER LA..ORIYA LETTER LLA +0B35..0B39 ; ID_Continue # Lo [5] ORIYA LETTER VA..ORIYA LETTER HA +0B3C ; ID_Continue # Mn ORIYA SIGN NUKTA +0B3D ; ID_Continue # Lo ORIYA SIGN AVAGRAHA +0B3E ; ID_Continue # Mc ORIYA VOWEL SIGN AA +0B3F ; ID_Continue # Mn ORIYA VOWEL SIGN I +0B40 ; ID_Continue # Mc ORIYA VOWEL SIGN II +0B41..0B44 ; ID_Continue # Mn [4] ORIYA VOWEL SIGN U..ORIYA VOWEL SIGN VOCALIC RR +0B47..0B48 ; ID_Continue # Mc [2] ORIYA VOWEL SIGN E..ORIYA VOWEL SIGN AI +0B4B..0B4C ; ID_Continue # Mc [2] ORIYA VOWEL SIGN O..ORIYA VOWEL SIGN AU +0B4D ; ID_Continue # Mn ORIYA SIGN VIRAMA +0B56 ; ID_Continue # Mn ORIYA AI LENGTH MARK +0B57 ; ID_Continue # Mc ORIYA AU LENGTH MARK +0B5C..0B5D ; ID_Continue # Lo [2] ORIYA LETTER RRA..ORIYA LETTER RHA +0B5F..0B61 ; ID_Continue # Lo [3] ORIYA LETTER YYA..ORIYA LETTER VOCALIC LL +0B62..0B63 ; ID_Continue # Mn [2] ORIYA VOWEL SIGN VOCALIC L..ORIYA VOWEL SIGN VOCALIC LL +0B66..0B6F ; ID_Continue # Nd [10] ORIYA DIGIT ZERO..ORIYA DIGIT NINE +0B71 ; ID_Continue # Lo ORIYA LETTER WA +0B82 ; ID_Continue # Mn TAMIL SIGN ANUSVARA +0B83 ; ID_Continue # Lo TAMIL SIGN VISARGA +0B85..0B8A ; ID_Continue # Lo [6] TAMIL LETTER A..TAMIL LETTER UU +0B8E..0B90 ; ID_Continue # Lo [3] TAMIL LETTER E..TAMIL LETTER AI +0B92..0B95 ; ID_Continue # Lo [4] TAMIL LETTER O..TAMIL LETTER KA +0B99..0B9A ; ID_Continue # Lo [2] TAMIL LETTER NGA..TAMIL LETTER CA +0B9C ; ID_Continue # Lo TAMIL LETTER JA +0B9E..0B9F ; ID_Continue # Lo [2] TAMIL LETTER NYA..TAMIL LETTER TTA +0BA3..0BA4 ; ID_Continue # Lo [2] TAMIL LETTER NNA..TAMIL LETTER TA +0BA8..0BAA ; ID_Continue # Lo [3] TAMIL LETTER NA..TAMIL LETTER PA +0BAE..0BB9 ; ID_Continue # Lo [12] TAMIL LETTER MA..TAMIL LETTER HA +0BBE..0BBF ; ID_Continue # Mc [2] TAMIL VOWEL SIGN AA..TAMIL VOWEL SIGN I +0BC0 ; ID_Continue # Mn TAMIL VOWEL SIGN II +0BC1..0BC2 ; ID_Continue # Mc [2] TAMIL VOWEL SIGN U..TAMIL VOWEL SIGN UU +0BC6..0BC8 ; ID_Continue # Mc [3] TAMIL VOWEL SIGN E..TAMIL VOWEL SIGN AI +0BCA..0BCC ; ID_Continue # Mc [3] TAMIL VOWEL SIGN O..TAMIL VOWEL SIGN AU +0BCD ; ID_Continue # Mn TAMIL SIGN VIRAMA +0BD0 ; ID_Continue # Lo TAMIL OM +0BD7 ; ID_Continue # Mc TAMIL AU LENGTH MARK +0BE6..0BEF ; ID_Continue # Nd [10] TAMIL DIGIT ZERO..TAMIL DIGIT NINE +0C00 ; ID_Continue # Mn TELUGU SIGN COMBINING CANDRABINDU ABOVE +0C01..0C03 ; ID_Continue # Mc [3] TELUGU SIGN CANDRABINDU..TELUGU SIGN VISARGA +0C04 ; ID_Continue # Mn TELUGU SIGN COMBINING ANUSVARA ABOVE +0C05..0C0C ; ID_Continue # Lo [8] TELUGU LETTER A..TELUGU LETTER VOCALIC L +0C0E..0C10 ; ID_Continue # Lo [3] TELUGU LETTER E..TELUGU LETTER AI +0C12..0C28 ; ID_Continue # Lo [23] TELUGU LETTER O..TELUGU LETTER NA +0C2A..0C39 ; ID_Continue # Lo [16] TELUGU LETTER PA..TELUGU LETTER HA +0C3D ; ID_Continue # Lo TELUGU SIGN AVAGRAHA +0C3E..0C40 ; ID_Continue # Mn [3] TELUGU VOWEL SIGN AA..TELUGU VOWEL SIGN II +0C41..0C44 ; ID_Continue # Mc [4] TELUGU VOWEL SIGN U..TELUGU VOWEL SIGN VOCALIC RR +0C46..0C48 ; ID_Continue # Mn [3] TELUGU VOWEL SIGN E..TELUGU VOWEL SIGN AI +0C4A..0C4D ; ID_Continue # Mn [4] TELUGU VOWEL SIGN O..TELUGU SIGN VIRAMA +0C55..0C56 ; ID_Continue # Mn [2] TELUGU LENGTH MARK..TELUGU AI LENGTH MARK +0C58..0C5A ; ID_Continue # Lo [3] TELUGU LETTER TSA..TELUGU LETTER RRRA +0C60..0C61 ; ID_Continue # Lo [2] TELUGU LETTER VOCALIC RR..TELUGU LETTER VOCALIC LL +0C62..0C63 ; ID_Continue # Mn [2] TELUGU VOWEL SIGN VOCALIC L..TELUGU VOWEL SIGN VOCALIC LL +0C66..0C6F ; ID_Continue # Nd [10] TELUGU DIGIT ZERO..TELUGU DIGIT NINE +0C80 ; ID_Continue # Lo KANNADA SIGN SPACING CANDRABINDU +0C81 ; ID_Continue # Mn KANNADA SIGN CANDRABINDU +0C82..0C83 ; ID_Continue # Mc [2] KANNADA SIGN ANUSVARA..KANNADA SIGN VISARGA +0C85..0C8C ; ID_Continue # Lo [8] KANNADA LETTER A..KANNADA LETTER VOCALIC L +0C8E..0C90 ; ID_Continue # Lo [3] KANNADA LETTER E..KANNADA LETTER AI +0C92..0CA8 ; ID_Continue # Lo [23] KANNADA LETTER O..KANNADA LETTER NA +0CAA..0CB3 ; ID_Continue # Lo [10] KANNADA LETTER PA..KANNADA LETTER LLA +0CB5..0CB9 ; ID_Continue # Lo [5] KANNADA LETTER VA..KANNADA LETTER HA +0CBC ; ID_Continue # Mn KANNADA SIGN NUKTA +0CBD ; ID_Continue # Lo KANNADA SIGN AVAGRAHA +0CBE ; ID_Continue # Mc KANNADA VOWEL SIGN AA +0CBF ; ID_Continue # Mn KANNADA VOWEL SIGN I +0CC0..0CC4 ; ID_Continue # Mc [5] KANNADA VOWEL SIGN II..KANNADA VOWEL SIGN VOCALIC RR +0CC6 ; ID_Continue # Mn KANNADA VOWEL SIGN E +0CC7..0CC8 ; ID_Continue # Mc [2] KANNADA VOWEL SIGN EE..KANNADA VOWEL SIGN AI +0CCA..0CCB ; ID_Continue # Mc [2] KANNADA VOWEL SIGN O..KANNADA VOWEL SIGN OO +0CCC..0CCD ; ID_Continue # Mn [2] KANNADA VOWEL SIGN AU..KANNADA SIGN VIRAMA +0CD5..0CD6 ; ID_Continue # Mc [2] KANNADA LENGTH MARK..KANNADA AI LENGTH MARK +0CDE ; ID_Continue # Lo KANNADA LETTER FA +0CE0..0CE1 ; ID_Continue # Lo [2] KANNADA LETTER VOCALIC RR..KANNADA LETTER VOCALIC LL +0CE2..0CE3 ; ID_Continue # Mn [2] KANNADA VOWEL SIGN VOCALIC L..KANNADA VOWEL SIGN VOCALIC LL +0CE6..0CEF ; ID_Continue # Nd [10] KANNADA DIGIT ZERO..KANNADA DIGIT NINE +0CF1..0CF2 ; ID_Continue # Lo [2] KANNADA SIGN JIHVAMULIYA..KANNADA SIGN UPADHMANIYA +0D00..0D01 ; ID_Continue # Mn [2] MALAYALAM SIGN COMBINING ANUSVARA ABOVE..MALAYALAM SIGN CANDRABINDU +0D02..0D03 ; ID_Continue # Mc [2] MALAYALAM SIGN ANUSVARA..MALAYALAM SIGN VISARGA +0D05..0D0C ; ID_Continue # Lo [8] MALAYALAM LETTER A..MALAYALAM LETTER VOCALIC L +0D0E..0D10 ; ID_Continue # Lo [3] MALAYALAM LETTER E..MALAYALAM LETTER AI +0D12..0D3A ; ID_Continue # Lo [41] MALAYALAM LETTER O..MALAYALAM LETTER TTTA +0D3B..0D3C ; ID_Continue # Mn [2] MALAYALAM SIGN VERTICAL BAR VIRAMA..MALAYALAM SIGN CIRCULAR VIRAMA +0D3D ; ID_Continue # Lo MALAYALAM SIGN AVAGRAHA +0D3E..0D40 ; ID_Continue # Mc [3] MALAYALAM VOWEL SIGN AA..MALAYALAM VOWEL SIGN II +0D41..0D44 ; ID_Continue # Mn [4] MALAYALAM VOWEL SIGN U..MALAYALAM VOWEL SIGN VOCALIC RR +0D46..0D48 ; ID_Continue # Mc [3] MALAYALAM VOWEL SIGN E..MALAYALAM VOWEL SIGN AI +0D4A..0D4C ; ID_Continue # Mc [3] MALAYALAM VOWEL SIGN O..MALAYALAM VOWEL SIGN AU +0D4D ; ID_Continue # Mn MALAYALAM SIGN VIRAMA +0D4E ; ID_Continue # Lo MALAYALAM LETTER DOT REPH +0D54..0D56 ; ID_Continue # Lo [3] MALAYALAM LETTER CHILLU M..MALAYALAM LETTER CHILLU LLL +0D57 ; ID_Continue # Mc MALAYALAM AU LENGTH MARK +0D5F..0D61 ; ID_Continue # Lo [3] MALAYALAM LETTER ARCHAIC II..MALAYALAM LETTER VOCALIC LL +0D62..0D63 ; ID_Continue # Mn [2] MALAYALAM VOWEL SIGN VOCALIC L..MALAYALAM VOWEL SIGN VOCALIC LL +0D66..0D6F ; ID_Continue # Nd [10] MALAYALAM DIGIT ZERO..MALAYALAM DIGIT NINE +0D7A..0D7F ; ID_Continue # Lo [6] MALAYALAM LETTER CHILLU NN..MALAYALAM LETTER CHILLU K +0D82..0D83 ; ID_Continue # Mc [2] SINHALA SIGN ANUSVARAYA..SINHALA SIGN VISARGAYA +0D85..0D96 ; ID_Continue # Lo [18] SINHALA LETTER AYANNA..SINHALA LETTER AUYANNA +0D9A..0DB1 ; ID_Continue # Lo [24] SINHALA LETTER ALPAPRAANA KAYANNA..SINHALA LETTER DANTAJA NAYANNA +0DB3..0DBB ; ID_Continue # Lo [9] SINHALA LETTER SANYAKA DAYANNA..SINHALA LETTER RAYANNA +0DBD ; ID_Continue # Lo SINHALA LETTER DANTAJA LAYANNA +0DC0..0DC6 ; ID_Continue # Lo [7] SINHALA LETTER VAYANNA..SINHALA LETTER FAYANNA +0DCA ; ID_Continue # Mn SINHALA SIGN AL-LAKUNA +0DCF..0DD1 ; ID_Continue # Mc [3] SINHALA VOWEL SIGN AELA-PILLA..SINHALA VOWEL SIGN DIGA AEDA-PILLA +0DD2..0DD4 ; ID_Continue # Mn [3] SINHALA VOWEL SIGN KETTI IS-PILLA..SINHALA VOWEL SIGN KETTI PAA-PILLA +0DD6 ; ID_Continue # Mn SINHALA VOWEL SIGN DIGA PAA-PILLA +0DD8..0DDF ; ID_Continue # Mc [8] SINHALA VOWEL SIGN GAETTA-PILLA..SINHALA VOWEL SIGN GAYANUKITTA +0DE6..0DEF ; ID_Continue # Nd [10] SINHALA LITH DIGIT ZERO..SINHALA LITH DIGIT NINE +0DF2..0DF3 ; ID_Continue # Mc [2] SINHALA VOWEL SIGN DIGA GAETTA-PILLA..SINHALA VOWEL SIGN DIGA GAYANUKITTA +0E01..0E30 ; ID_Continue # Lo [48] THAI CHARACTER KO KAI..THAI CHARACTER SARA A +0E31 ; ID_Continue # Mn THAI CHARACTER MAI HAN-AKAT +0E32..0E33 ; ID_Continue # Lo [2] THAI CHARACTER SARA AA..THAI CHARACTER SARA AM +0E34..0E3A ; ID_Continue # Mn [7] THAI CHARACTER SARA I..THAI CHARACTER PHINTHU +0E40..0E45 ; ID_Continue # Lo [6] THAI CHARACTER SARA E..THAI CHARACTER LAKKHANGYAO +0E46 ; ID_Continue # Lm THAI CHARACTER MAIYAMOK +0E47..0E4E ; ID_Continue # Mn [8] THAI CHARACTER MAITAIKHU..THAI CHARACTER YAMAKKAN +0E50..0E59 ; ID_Continue # Nd [10] THAI DIGIT ZERO..THAI DIGIT NINE +0E81..0E82 ; ID_Continue # Lo [2] LAO LETTER KO..LAO LETTER KHO SUNG +0E84 ; ID_Continue # Lo LAO LETTER KHO TAM +0E87..0E88 ; ID_Continue # Lo [2] LAO LETTER NGO..LAO LETTER CO +0E8A ; ID_Continue # Lo LAO LETTER SO TAM +0E8D ; ID_Continue # Lo LAO LETTER NYO +0E94..0E97 ; ID_Continue # Lo [4] LAO LETTER DO..LAO LETTER THO TAM +0E99..0E9F ; ID_Continue # Lo [7] LAO LETTER NO..LAO LETTER FO SUNG +0EA1..0EA3 ; ID_Continue # Lo [3] LAO LETTER MO..LAO LETTER LO LING +0EA5 ; ID_Continue # Lo LAO LETTER LO LOOT +0EA7 ; ID_Continue # Lo LAO LETTER WO +0EAA..0EAB ; ID_Continue # Lo [2] LAO LETTER SO SUNG..LAO LETTER HO SUNG +0EAD..0EB0 ; ID_Continue # Lo [4] LAO LETTER O..LAO VOWEL SIGN A +0EB1 ; ID_Continue # Mn LAO VOWEL SIGN MAI KAN +0EB2..0EB3 ; ID_Continue # Lo [2] LAO VOWEL SIGN AA..LAO VOWEL SIGN AM +0EB4..0EB9 ; ID_Continue # Mn [6] LAO VOWEL SIGN I..LAO VOWEL SIGN UU +0EBB..0EBC ; ID_Continue # Mn [2] LAO VOWEL SIGN MAI KON..LAO SEMIVOWEL SIGN LO +0EBD ; ID_Continue # Lo LAO SEMIVOWEL SIGN NYO +0EC0..0EC4 ; ID_Continue # Lo [5] LAO VOWEL SIGN E..LAO VOWEL SIGN AI +0EC6 ; ID_Continue # Lm LAO KO LA +0EC8..0ECD ; ID_Continue # Mn [6] LAO TONE MAI EK..LAO NIGGAHITA +0ED0..0ED9 ; ID_Continue # Nd [10] LAO DIGIT ZERO..LAO DIGIT NINE +0EDC..0EDF ; ID_Continue # Lo [4] LAO HO NO..LAO LETTER KHMU NYO +0F00 ; ID_Continue # Lo TIBETAN SYLLABLE OM +0F18..0F19 ; ID_Continue # Mn [2] TIBETAN ASTROLOGICAL SIGN -KHYUD PA..TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS +0F20..0F29 ; ID_Continue # Nd [10] TIBETAN DIGIT ZERO..TIBETAN DIGIT NINE +0F35 ; ID_Continue # Mn TIBETAN MARK NGAS BZUNG NYI ZLA +0F37 ; ID_Continue # Mn TIBETAN MARK NGAS BZUNG SGOR RTAGS +0F39 ; ID_Continue # Mn TIBETAN MARK TSA -PHRU +0F3E..0F3F ; ID_Continue # Mc [2] TIBETAN SIGN YAR TSHES..TIBETAN SIGN MAR TSHES +0F40..0F47 ; ID_Continue # Lo [8] TIBETAN LETTER KA..TIBETAN LETTER JA +0F49..0F6C ; ID_Continue # Lo [36] TIBETAN LETTER NYA..TIBETAN LETTER RRA +0F71..0F7E ; ID_Continue # Mn [14] TIBETAN VOWEL SIGN AA..TIBETAN SIGN RJES SU NGA RO +0F7F ; ID_Continue # Mc TIBETAN SIGN RNAM BCAD +0F80..0F84 ; ID_Continue # Mn [5] TIBETAN VOWEL SIGN REVERSED I..TIBETAN MARK HALANTA +0F86..0F87 ; ID_Continue # Mn [2] TIBETAN SIGN LCI RTAGS..TIBETAN SIGN YANG RTAGS +0F88..0F8C ; ID_Continue # Lo [5] TIBETAN SIGN LCE TSA CAN..TIBETAN SIGN INVERTED MCHU CAN +0F8D..0F97 ; ID_Continue # Mn [11] TIBETAN SUBJOINED SIGN LCE TSA CAN..TIBETAN SUBJOINED LETTER JA +0F99..0FBC ; ID_Continue # Mn [36] TIBETAN SUBJOINED LETTER NYA..TIBETAN SUBJOINED LETTER FIXED-FORM RA +0FC6 ; ID_Continue # Mn TIBETAN SYMBOL PADMA GDAN +1000..102A ; ID_Continue # Lo [43] MYANMAR LETTER KA..MYANMAR LETTER AU +102B..102C ; ID_Continue # Mc [2] MYANMAR VOWEL SIGN TALL AA..MYANMAR VOWEL SIGN AA +102D..1030 ; ID_Continue # Mn [4] MYANMAR VOWEL SIGN I..MYANMAR VOWEL SIGN UU +1031 ; ID_Continue # Mc MYANMAR VOWEL SIGN E +1032..1037 ; ID_Continue # Mn [6] MYANMAR VOWEL SIGN AI..MYANMAR SIGN DOT BELOW +1038 ; ID_Continue # Mc MYANMAR SIGN VISARGA +1039..103A ; ID_Continue # Mn [2] MYANMAR SIGN VIRAMA..MYANMAR SIGN ASAT +103B..103C ; ID_Continue # Mc [2] MYANMAR CONSONANT SIGN MEDIAL YA..MYANMAR CONSONANT SIGN MEDIAL RA +103D..103E ; ID_Continue # Mn [2] MYANMAR CONSONANT SIGN MEDIAL WA..MYANMAR CONSONANT SIGN MEDIAL HA +103F ; ID_Continue # Lo MYANMAR LETTER GREAT SA +1040..1049 ; ID_Continue # Nd [10] MYANMAR DIGIT ZERO..MYANMAR DIGIT NINE +1050..1055 ; ID_Continue # Lo [6] MYANMAR LETTER SHA..MYANMAR LETTER VOCALIC LL +1056..1057 ; ID_Continue # Mc [2] MYANMAR VOWEL SIGN VOCALIC R..MYANMAR VOWEL SIGN VOCALIC RR +1058..1059 ; ID_Continue # Mn [2] MYANMAR VOWEL SIGN VOCALIC L..MYANMAR VOWEL SIGN VOCALIC LL +105A..105D ; ID_Continue # Lo [4] MYANMAR LETTER MON NGA..MYANMAR LETTER MON BBE +105E..1060 ; ID_Continue # Mn [3] MYANMAR CONSONANT SIGN MON MEDIAL NA..MYANMAR CONSONANT SIGN MON MEDIAL LA +1061 ; ID_Continue # Lo MYANMAR LETTER SGAW KAREN SHA +1062..1064 ; ID_Continue # Mc [3] MYANMAR VOWEL SIGN SGAW KAREN EU..MYANMAR TONE MARK SGAW KAREN KE PHO +1065..1066 ; ID_Continue # Lo [2] MYANMAR LETTER WESTERN PWO KAREN THA..MYANMAR LETTER WESTERN PWO KAREN PWA +1067..106D ; ID_Continue # Mc [7] MYANMAR VOWEL SIGN WESTERN PWO KAREN EU..MYANMAR SIGN WESTERN PWO KAREN TONE-5 +106E..1070 ; ID_Continue # Lo [3] MYANMAR LETTER EASTERN PWO KAREN NNA..MYANMAR LETTER EASTERN PWO KAREN GHWA +1071..1074 ; ID_Continue # Mn [4] MYANMAR VOWEL SIGN GEBA KAREN I..MYANMAR VOWEL SIGN KAYAH EE +1075..1081 ; ID_Continue # Lo [13] MYANMAR LETTER SHAN KA..MYANMAR LETTER SHAN HA +1082 ; ID_Continue # Mn MYANMAR CONSONANT SIGN SHAN MEDIAL WA +1083..1084 ; ID_Continue # Mc [2] MYANMAR VOWEL SIGN SHAN AA..MYANMAR VOWEL SIGN SHAN E +1085..1086 ; ID_Continue # Mn [2] MYANMAR VOWEL SIGN SHAN E ABOVE..MYANMAR VOWEL SIGN SHAN FINAL Y +1087..108C ; ID_Continue # Mc [6] MYANMAR SIGN SHAN TONE-2..MYANMAR SIGN SHAN COUNCIL TONE-3 +108D ; ID_Continue # Mn MYANMAR SIGN SHAN COUNCIL EMPHATIC TONE +108E ; ID_Continue # Lo MYANMAR LETTER RUMAI PALAUNG FA +108F ; ID_Continue # Mc MYANMAR SIGN RUMAI PALAUNG TONE-5 +1090..1099 ; ID_Continue # Nd [10] MYANMAR SHAN DIGIT ZERO..MYANMAR SHAN DIGIT NINE +109A..109C ; ID_Continue # Mc [3] MYANMAR SIGN KHAMTI TONE-1..MYANMAR VOWEL SIGN AITON A +109D ; ID_Continue # Mn MYANMAR VOWEL SIGN AITON AI +10A0..10C5 ; ID_Continue # L& [38] GEORGIAN CAPITAL LETTER AN..GEORGIAN CAPITAL LETTER HOE +10C7 ; ID_Continue # L& GEORGIAN CAPITAL LETTER YN +10CD ; ID_Continue # L& GEORGIAN CAPITAL LETTER AEN +10D0..10FA ; ID_Continue # L& [43] GEORGIAN LETTER AN..GEORGIAN LETTER AIN +10FC ; ID_Continue # Lm MODIFIER LETTER GEORGIAN NAR +10FD..10FF ; ID_Continue # L& [3] GEORGIAN LETTER AEN..GEORGIAN LETTER LABIAL SIGN +1100..1248 ; ID_Continue # Lo [329] HANGUL CHOSEONG KIYEOK..ETHIOPIC SYLLABLE QWA +124A..124D ; ID_Continue # Lo [4] ETHIOPIC SYLLABLE QWI..ETHIOPIC SYLLABLE QWE +1250..1256 ; ID_Continue # Lo [7] ETHIOPIC SYLLABLE QHA..ETHIOPIC SYLLABLE QHO +1258 ; ID_Continue # Lo ETHIOPIC SYLLABLE QHWA +125A..125D ; ID_Continue # Lo [4] ETHIOPIC SYLLABLE QHWI..ETHIOPIC SYLLABLE QHWE +1260..1288 ; ID_Continue # Lo [41] ETHIOPIC SYLLABLE BA..ETHIOPIC SYLLABLE XWA +128A..128D ; ID_Continue # Lo [4] ETHIOPIC SYLLABLE XWI..ETHIOPIC SYLLABLE XWE +1290..12B0 ; ID_Continue # Lo [33] ETHIOPIC SYLLABLE NA..ETHIOPIC SYLLABLE KWA +12B2..12B5 ; ID_Continue # Lo [4] ETHIOPIC SYLLABLE KWI..ETHIOPIC SYLLABLE KWE +12B8..12BE ; ID_Continue # Lo [7] ETHIOPIC SYLLABLE KXA..ETHIOPIC SYLLABLE KXO +12C0 ; ID_Continue # Lo ETHIOPIC SYLLABLE KXWA +12C2..12C5 ; ID_Continue # Lo [4] ETHIOPIC SYLLABLE KXWI..ETHIOPIC SYLLABLE KXWE +12C8..12D6 ; ID_Continue # Lo [15] ETHIOPIC SYLLABLE WA..ETHIOPIC SYLLABLE PHARYNGEAL O +12D8..1310 ; ID_Continue # Lo [57] ETHIOPIC SYLLABLE ZA..ETHIOPIC SYLLABLE GWA +1312..1315 ; ID_Continue # Lo [4] ETHIOPIC SYLLABLE GWI..ETHIOPIC SYLLABLE GWE +1318..135A ; ID_Continue # Lo [67] ETHIOPIC SYLLABLE GGA..ETHIOPIC SYLLABLE FYA +135D..135F ; ID_Continue # Mn [3] ETHIOPIC COMBINING GEMINATION AND VOWEL LENGTH MARK..ETHIOPIC COMBINING GEMINATION MARK +1369..1371 ; ID_Continue # No [9] ETHIOPIC DIGIT ONE..ETHIOPIC DIGIT NINE +1380..138F ; ID_Continue # Lo [16] ETHIOPIC SYLLABLE SEBATBEIT MWA..ETHIOPIC SYLLABLE PWE +13A0..13F5 ; ID_Continue # L& [86] CHEROKEE LETTER A..CHEROKEE LETTER MV +13F8..13FD ; ID_Continue # L& [6] CHEROKEE SMALL LETTER YE..CHEROKEE SMALL LETTER MV +1401..166C ; ID_Continue # Lo [620] CANADIAN SYLLABICS E..CANADIAN SYLLABICS CARRIER TTSA +166F..167F ; ID_Continue # Lo [17] CANADIAN SYLLABICS QAI..CANADIAN SYLLABICS BLACKFOOT W +1681..169A ; ID_Continue # Lo [26] OGHAM LETTER BEITH..OGHAM LETTER PEITH +16A0..16EA ; ID_Continue # Lo [75] RUNIC LETTER FEHU FEOH FE F..RUNIC LETTER X +16EE..16F0 ; ID_Continue # Nl [3] RUNIC ARLAUG SYMBOL..RUNIC BELGTHOR SYMBOL +16F1..16F8 ; ID_Continue # Lo [8] RUNIC LETTER K..RUNIC LETTER FRANKS CASKET AESC +1700..170C ; ID_Continue # Lo [13] TAGALOG LETTER A..TAGALOG LETTER YA +170E..1711 ; ID_Continue # Lo [4] TAGALOG LETTER LA..TAGALOG LETTER HA +1712..1714 ; ID_Continue # Mn [3] TAGALOG VOWEL SIGN I..TAGALOG SIGN VIRAMA +1720..1731 ; ID_Continue # Lo [18] HANUNOO LETTER A..HANUNOO LETTER HA +1732..1734 ; ID_Continue # Mn [3] HANUNOO VOWEL SIGN I..HANUNOO SIGN PAMUDPOD +1740..1751 ; ID_Continue # Lo [18] BUHID LETTER A..BUHID LETTER HA +1752..1753 ; ID_Continue # Mn [2] BUHID VOWEL SIGN I..BUHID VOWEL SIGN U +1760..176C ; ID_Continue # Lo [13] TAGBANWA LETTER A..TAGBANWA LETTER YA +176E..1770 ; ID_Continue # Lo [3] TAGBANWA LETTER LA..TAGBANWA LETTER SA +1772..1773 ; ID_Continue # Mn [2] TAGBANWA VOWEL SIGN I..TAGBANWA VOWEL SIGN U +1780..17B3 ; ID_Continue # Lo [52] KHMER LETTER KA..KHMER INDEPENDENT VOWEL QAU +17B4..17B5 ; ID_Continue # Mn [2] KHMER VOWEL INHERENT AQ..KHMER VOWEL INHERENT AA +17B6 ; ID_Continue # Mc KHMER VOWEL SIGN AA +17B7..17BD ; ID_Continue # Mn [7] KHMER VOWEL SIGN I..KHMER VOWEL SIGN UA +17BE..17C5 ; ID_Continue # Mc [8] KHMER VOWEL SIGN OE..KHMER VOWEL SIGN AU +17C6 ; ID_Continue # Mn KHMER SIGN NIKAHIT +17C7..17C8 ; ID_Continue # Mc [2] KHMER SIGN REAHMUK..KHMER SIGN YUUKALEAPINTU +17C9..17D3 ; ID_Continue # Mn [11] KHMER SIGN MUUSIKATOAN..KHMER SIGN BATHAMASAT +17D7 ; ID_Continue # Lm KHMER SIGN LEK TOO +17DC ; ID_Continue # Lo KHMER SIGN AVAKRAHASANYA +17DD ; ID_Continue # Mn KHMER SIGN ATTHACAN +17E0..17E9 ; ID_Continue # Nd [10] KHMER DIGIT ZERO..KHMER DIGIT NINE +180B..180D ; ID_Continue # Mn [3] MONGOLIAN FREE VARIATION SELECTOR ONE..MONGOLIAN FREE VARIATION SELECTOR THREE +1810..1819 ; ID_Continue # Nd [10] MONGOLIAN DIGIT ZERO..MONGOLIAN DIGIT NINE +1820..1842 ; ID_Continue # Lo [35] MONGOLIAN LETTER A..MONGOLIAN LETTER CHI +1843 ; ID_Continue # Lm MONGOLIAN LETTER TODO LONG VOWEL SIGN +1844..1878 ; ID_Continue # Lo [53] MONGOLIAN LETTER TODO E..MONGOLIAN LETTER CHA WITH TWO DOTS +1880..1884 ; ID_Continue # Lo [5] MONGOLIAN LETTER ALI GALI ANUSVARA ONE..MONGOLIAN LETTER ALI GALI INVERTED UBADAMA +1885..1886 ; ID_Continue # Mn [2] MONGOLIAN LETTER ALI GALI BALUDA..MONGOLIAN LETTER ALI GALI THREE BALUDA +1887..18A8 ; ID_Continue # Lo [34] MONGOLIAN LETTER ALI GALI A..MONGOLIAN LETTER MANCHU ALI GALI BHA +18A9 ; ID_Continue # Mn MONGOLIAN LETTER ALI GALI DAGALGA +18AA ; ID_Continue # Lo MONGOLIAN LETTER MANCHU ALI GALI LHA +18B0..18F5 ; ID_Continue # Lo [70] CANADIAN SYLLABICS OY..CANADIAN SYLLABICS CARRIER DENTAL S +1900..191E ; ID_Continue # Lo [31] LIMBU VOWEL-CARRIER LETTER..LIMBU LETTER TRA +1920..1922 ; ID_Continue # Mn [3] LIMBU VOWEL SIGN A..LIMBU VOWEL SIGN U +1923..1926 ; ID_Continue # Mc [4] LIMBU VOWEL SIGN EE..LIMBU VOWEL SIGN AU +1927..1928 ; ID_Continue # Mn [2] LIMBU VOWEL SIGN E..LIMBU VOWEL SIGN O +1929..192B ; ID_Continue # Mc [3] LIMBU SUBJOINED LETTER YA..LIMBU SUBJOINED LETTER WA +1930..1931 ; ID_Continue # Mc [2] LIMBU SMALL LETTER KA..LIMBU SMALL LETTER NGA +1932 ; ID_Continue # Mn LIMBU SMALL LETTER ANUSVARA +1933..1938 ; ID_Continue # Mc [6] LIMBU SMALL LETTER TA..LIMBU SMALL LETTER LA +1939..193B ; ID_Continue # Mn [3] LIMBU SIGN MUKPHRENG..LIMBU SIGN SA-I +1946..194F ; ID_Continue # Nd [10] LIMBU DIGIT ZERO..LIMBU DIGIT NINE +1950..196D ; ID_Continue # Lo [30] TAI LE LETTER KA..TAI LE LETTER AI +1970..1974 ; ID_Continue # Lo [5] TAI LE LETTER TONE-2..TAI LE LETTER TONE-6 +1980..19AB ; ID_Continue # Lo [44] NEW TAI LUE LETTER HIGH QA..NEW TAI LUE LETTER LOW SUA +19B0..19C9 ; ID_Continue # Lo [26] NEW TAI LUE VOWEL SIGN VOWEL SHORTENER..NEW TAI LUE TONE MARK-2 +19D0..19D9 ; ID_Continue # Nd [10] NEW TAI LUE DIGIT ZERO..NEW TAI LUE DIGIT NINE +19DA ; ID_Continue # No NEW TAI LUE THAM DIGIT ONE +1A00..1A16 ; ID_Continue # Lo [23] BUGINESE LETTER KA..BUGINESE LETTER HA +1A17..1A18 ; ID_Continue # Mn [2] BUGINESE VOWEL SIGN I..BUGINESE VOWEL SIGN U +1A19..1A1A ; ID_Continue # Mc [2] BUGINESE VOWEL SIGN E..BUGINESE VOWEL SIGN O +1A1B ; ID_Continue # Mn BUGINESE VOWEL SIGN AE +1A20..1A54 ; ID_Continue # Lo [53] TAI THAM LETTER HIGH KA..TAI THAM LETTER GREAT SA +1A55 ; ID_Continue # Mc TAI THAM CONSONANT SIGN MEDIAL RA +1A56 ; ID_Continue # Mn TAI THAM CONSONANT SIGN MEDIAL LA +1A57 ; ID_Continue # Mc TAI THAM CONSONANT SIGN LA TANG LAI +1A58..1A5E ; ID_Continue # Mn [7] TAI THAM SIGN MAI KANG LAI..TAI THAM CONSONANT SIGN SA +1A60 ; ID_Continue # Mn TAI THAM SIGN SAKOT +1A61 ; ID_Continue # Mc TAI THAM VOWEL SIGN A +1A62 ; ID_Continue # Mn TAI THAM VOWEL SIGN MAI SAT +1A63..1A64 ; ID_Continue # Mc [2] TAI THAM VOWEL SIGN AA..TAI THAM VOWEL SIGN TALL AA +1A65..1A6C ; ID_Continue # Mn [8] TAI THAM VOWEL SIGN I..TAI THAM VOWEL SIGN OA BELOW +1A6D..1A72 ; ID_Continue # Mc [6] TAI THAM VOWEL SIGN OY..TAI THAM VOWEL SIGN THAM AI +1A73..1A7C ; ID_Continue # Mn [10] TAI THAM VOWEL SIGN OA ABOVE..TAI THAM SIGN KHUEN-LUE KARAN +1A7F ; ID_Continue # Mn TAI THAM COMBINING CRYPTOGRAMMIC DOT +1A80..1A89 ; ID_Continue # Nd [10] TAI THAM HORA DIGIT ZERO..TAI THAM HORA DIGIT NINE +1A90..1A99 ; ID_Continue # Nd [10] TAI THAM THAM DIGIT ZERO..TAI THAM THAM DIGIT NINE +1AA7 ; ID_Continue # Lm TAI THAM SIGN MAI YAMOK +1AB0..1ABD ; ID_Continue # Mn [14] COMBINING DOUBLED CIRCUMFLEX ACCENT..COMBINING PARENTHESES BELOW +1B00..1B03 ; ID_Continue # Mn [4] BALINESE SIGN ULU RICEM..BALINESE SIGN SURANG +1B04 ; ID_Continue # Mc BALINESE SIGN BISAH +1B05..1B33 ; ID_Continue # Lo [47] BALINESE LETTER AKARA..BALINESE LETTER HA +1B34 ; ID_Continue # Mn BALINESE SIGN REREKAN +1B35 ; ID_Continue # Mc BALINESE VOWEL SIGN TEDUNG +1B36..1B3A ; ID_Continue # Mn [5] BALINESE VOWEL SIGN ULU..BALINESE VOWEL SIGN RA REPA +1B3B ; ID_Continue # Mc BALINESE VOWEL SIGN RA REPA TEDUNG +1B3C ; ID_Continue # Mn BALINESE VOWEL SIGN LA LENGA +1B3D..1B41 ; ID_Continue # Mc [5] BALINESE VOWEL SIGN LA LENGA TEDUNG..BALINESE VOWEL SIGN TALING REPA TEDUNG +1B42 ; ID_Continue # Mn BALINESE VOWEL SIGN PEPET +1B43..1B44 ; ID_Continue # Mc [2] BALINESE VOWEL SIGN PEPET TEDUNG..BALINESE ADEG ADEG +1B45..1B4B ; ID_Continue # Lo [7] BALINESE LETTER KAF SASAK..BALINESE LETTER ASYURA SASAK +1B50..1B59 ; ID_Continue # Nd [10] BALINESE DIGIT ZERO..BALINESE DIGIT NINE +1B6B..1B73 ; ID_Continue # Mn [9] BALINESE MUSICAL SYMBOL COMBINING TEGEH..BALINESE MUSICAL SYMBOL COMBINING GONG +1B80..1B81 ; ID_Continue # Mn [2] SUNDANESE SIGN PANYECEK..SUNDANESE SIGN PANGLAYAR +1B82 ; ID_Continue # Mc SUNDANESE SIGN PANGWISAD +1B83..1BA0 ; ID_Continue # Lo [30] SUNDANESE LETTER A..SUNDANESE LETTER HA +1BA1 ; ID_Continue # Mc SUNDANESE CONSONANT SIGN PAMINGKAL +1BA2..1BA5 ; ID_Continue # Mn [4] SUNDANESE CONSONANT SIGN PANYAKRA..SUNDANESE VOWEL SIGN PANYUKU +1BA6..1BA7 ; ID_Continue # Mc [2] SUNDANESE VOWEL SIGN PANAELAENG..SUNDANESE VOWEL SIGN PANOLONG +1BA8..1BA9 ; ID_Continue # Mn [2] SUNDANESE VOWEL SIGN PAMEPET..SUNDANESE VOWEL SIGN PANEULEUNG +1BAA ; ID_Continue # Mc SUNDANESE SIGN PAMAAEH +1BAB..1BAD ; ID_Continue # Mn [3] SUNDANESE SIGN VIRAMA..SUNDANESE CONSONANT SIGN PASANGAN WA +1BAE..1BAF ; ID_Continue # Lo [2] SUNDANESE LETTER KHA..SUNDANESE LETTER SYA +1BB0..1BB9 ; ID_Continue # Nd [10] SUNDANESE DIGIT ZERO..SUNDANESE DIGIT NINE +1BBA..1BE5 ; ID_Continue # Lo [44] SUNDANESE AVAGRAHA..BATAK LETTER U +1BE6 ; ID_Continue # Mn BATAK SIGN TOMPI +1BE7 ; ID_Continue # Mc BATAK VOWEL SIGN E +1BE8..1BE9 ; ID_Continue # Mn [2] BATAK VOWEL SIGN PAKPAK E..BATAK VOWEL SIGN EE +1BEA..1BEC ; ID_Continue # Mc [3] BATAK VOWEL SIGN I..BATAK VOWEL SIGN O +1BED ; ID_Continue # Mn BATAK VOWEL SIGN KARO O +1BEE ; ID_Continue # Mc BATAK VOWEL SIGN U +1BEF..1BF1 ; ID_Continue # Mn [3] BATAK VOWEL SIGN U FOR SIMALUNGUN SA..BATAK CONSONANT SIGN H +1BF2..1BF3 ; ID_Continue # Mc [2] BATAK PANGOLAT..BATAK PANONGONAN +1C00..1C23 ; ID_Continue # Lo [36] LEPCHA LETTER KA..LEPCHA LETTER A +1C24..1C2B ; ID_Continue # Mc [8] LEPCHA SUBJOINED LETTER YA..LEPCHA VOWEL SIGN UU +1C2C..1C33 ; ID_Continue # Mn [8] LEPCHA VOWEL SIGN E..LEPCHA CONSONANT SIGN T +1C34..1C35 ; ID_Continue # Mc [2] LEPCHA CONSONANT SIGN NYIN-DO..LEPCHA CONSONANT SIGN KANG +1C36..1C37 ; ID_Continue # Mn [2] LEPCHA SIGN RAN..LEPCHA SIGN NUKTA +1C40..1C49 ; ID_Continue # Nd [10] LEPCHA DIGIT ZERO..LEPCHA DIGIT NINE +1C4D..1C4F ; ID_Continue # Lo [3] LEPCHA LETTER TTA..LEPCHA LETTER DDA +1C50..1C59 ; ID_Continue # Nd [10] OL CHIKI DIGIT ZERO..OL CHIKI DIGIT NINE +1C5A..1C77 ; ID_Continue # Lo [30] OL CHIKI LETTER LA..OL CHIKI LETTER OH +1C78..1C7D ; ID_Continue # Lm [6] OL CHIKI MU TTUDDAG..OL CHIKI AHAD +1C80..1C88 ; ID_Continue # L& [9] CYRILLIC SMALL LETTER ROUNDED VE..CYRILLIC SMALL LETTER UNBLENDED UK +1C90..1CBA ; ID_Continue # L& [43] GEORGIAN MTAVRULI CAPITAL LETTER AN..GEORGIAN MTAVRULI CAPITAL LETTER AIN +1CBD..1CBF ; ID_Continue # L& [3] GEORGIAN MTAVRULI CAPITAL LETTER AEN..GEORGIAN MTAVRULI CAPITAL LETTER LABIAL SIGN +1CD0..1CD2 ; ID_Continue # Mn [3] VEDIC TONE KARSHANA..VEDIC TONE PRENKHA +1CD4..1CE0 ; ID_Continue # Mn [13] VEDIC SIGN YAJURVEDIC MIDLINE SVARITA..VEDIC TONE RIGVEDIC KASHMIRI INDEPENDENT SVARITA +1CE1 ; ID_Continue # Mc VEDIC TONE ATHARVAVEDIC INDEPENDENT SVARITA +1CE2..1CE8 ; ID_Continue # Mn [7] VEDIC SIGN VISARGA SVARITA..VEDIC SIGN VISARGA ANUDATTA WITH TAIL +1CE9..1CEC ; ID_Continue # Lo [4] VEDIC SIGN ANUSVARA ANTARGOMUKHA..VEDIC SIGN ANUSVARA VAMAGOMUKHA WITH TAIL +1CED ; ID_Continue # Mn VEDIC SIGN TIRYAK +1CEE..1CF1 ; ID_Continue # Lo [4] VEDIC SIGN HEXIFORM LONG ANUSVARA..VEDIC SIGN ANUSVARA UBHAYATO MUKHA +1CF2..1CF3 ; ID_Continue # Mc [2] VEDIC SIGN ARDHAVISARGA..VEDIC SIGN ROTATED ARDHAVISARGA +1CF4 ; ID_Continue # Mn VEDIC TONE CANDRA ABOVE +1CF5..1CF6 ; ID_Continue # Lo [2] VEDIC SIGN JIHVAMULIYA..VEDIC SIGN UPADHMANIYA +1CF7 ; ID_Continue # Mc VEDIC SIGN ATIKRAMA +1CF8..1CF9 ; ID_Continue # Mn [2] VEDIC TONE RING ABOVE..VEDIC TONE DOUBLE RING ABOVE +1D00..1D2B ; ID_Continue # L& [44] LATIN LETTER SMALL CAPITAL A..CYRILLIC LETTER SMALL CAPITAL EL +1D2C..1D6A ; ID_Continue # Lm [63] MODIFIER LETTER CAPITAL A..GREEK SUBSCRIPT SMALL LETTER CHI +1D6B..1D77 ; ID_Continue # L& [13] LATIN SMALL LETTER UE..LATIN SMALL LETTER TURNED G +1D78 ; ID_Continue # Lm MODIFIER LETTER CYRILLIC EN +1D79..1D9A ; ID_Continue # L& [34] LATIN SMALL LETTER INSULAR G..LATIN SMALL LETTER EZH WITH RETROFLEX HOOK +1D9B..1DBF ; ID_Continue # Lm [37] MODIFIER LETTER SMALL TURNED ALPHA..MODIFIER LETTER SMALL THETA +1DC0..1DF9 ; ID_Continue # Mn [58] COMBINING DOTTED GRAVE ACCENT..COMBINING WIDE INVERTED BRIDGE BELOW +1DFB..1DFF ; ID_Continue # Mn [5] COMBINING DELETION MARK..COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW +1E00..1F15 ; ID_Continue # L& [278] LATIN CAPITAL LETTER A WITH RING BELOW..GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA +1F18..1F1D ; ID_Continue # L& [6] GREEK CAPITAL LETTER EPSILON WITH PSILI..GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA +1F20..1F45 ; ID_Continue # L& [38] GREEK SMALL LETTER ETA WITH PSILI..GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA +1F48..1F4D ; ID_Continue # L& [6] GREEK CAPITAL LETTER OMICRON WITH PSILI..GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA +1F50..1F57 ; ID_Continue # L& [8] GREEK SMALL LETTER UPSILON WITH PSILI..GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI +1F59 ; ID_Continue # L& GREEK CAPITAL LETTER UPSILON WITH DASIA +1F5B ; ID_Continue # L& GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA +1F5D ; ID_Continue # L& GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA +1F5F..1F7D ; ID_Continue # L& [31] GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI..GREEK SMALL LETTER OMEGA WITH OXIA +1F80..1FB4 ; ID_Continue # L& [53] GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI..GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI +1FB6..1FBC ; ID_Continue # L& [7] GREEK SMALL LETTER ALPHA WITH PERISPOMENI..GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI +1FBE ; ID_Continue # L& GREEK PROSGEGRAMMENI +1FC2..1FC4 ; ID_Continue # L& [3] GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI +1FC6..1FCC ; ID_Continue # L& [7] GREEK SMALL LETTER ETA WITH PERISPOMENI..GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI +1FD0..1FD3 ; ID_Continue # L& [4] GREEK SMALL LETTER IOTA WITH VRACHY..GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA +1FD6..1FDB ; ID_Continue # L& [6] GREEK SMALL LETTER IOTA WITH PERISPOMENI..GREEK CAPITAL LETTER IOTA WITH OXIA +1FE0..1FEC ; ID_Continue # L& [13] GREEK SMALL LETTER UPSILON WITH VRACHY..GREEK CAPITAL LETTER RHO WITH DASIA +1FF2..1FF4 ; ID_Continue # L& [3] GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI +1FF6..1FFC ; ID_Continue # L& [7] GREEK SMALL LETTER OMEGA WITH PERISPOMENI..GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI +203F..2040 ; ID_Continue # Pc [2] UNDERTIE..CHARACTER TIE +2054 ; ID_Continue # Pc INVERTED UNDERTIE +2071 ; ID_Continue # Lm SUPERSCRIPT LATIN SMALL LETTER I +207F ; ID_Continue # Lm SUPERSCRIPT LATIN SMALL LETTER N +2090..209C ; ID_Continue # Lm [13] LATIN SUBSCRIPT SMALL LETTER A..LATIN SUBSCRIPT SMALL LETTER T +20D0..20DC ; ID_Continue # Mn [13] COMBINING LEFT HARPOON ABOVE..COMBINING FOUR DOTS ABOVE +20E1 ; ID_Continue # Mn COMBINING LEFT RIGHT ARROW ABOVE +20E5..20F0 ; ID_Continue # Mn [12] COMBINING REVERSE SOLIDUS OVERLAY..COMBINING ASTERISK ABOVE +2102 ; ID_Continue # L& DOUBLE-STRUCK CAPITAL C +2107 ; ID_Continue # L& EULER CONSTANT +210A..2113 ; ID_Continue # L& [10] SCRIPT SMALL G..SCRIPT SMALL L +2115 ; ID_Continue # L& DOUBLE-STRUCK CAPITAL N +2118 ; ID_Continue # Sm SCRIPT CAPITAL P +2119..211D ; ID_Continue # L& [5] DOUBLE-STRUCK CAPITAL P..DOUBLE-STRUCK CAPITAL R +2124 ; ID_Continue # L& DOUBLE-STRUCK CAPITAL Z +2126 ; ID_Continue # L& OHM SIGN +2128 ; ID_Continue # L& BLACK-LETTER CAPITAL Z +212A..212D ; ID_Continue # L& [4] KELVIN SIGN..BLACK-LETTER CAPITAL C +212E ; ID_Continue # So ESTIMATED SYMBOL +212F..2134 ; ID_Continue # L& [6] SCRIPT SMALL E..SCRIPT SMALL O +2135..2138 ; ID_Continue # Lo [4] ALEF SYMBOL..DALET SYMBOL +2139 ; ID_Continue # L& INFORMATION SOURCE +213C..213F ; ID_Continue # L& [4] DOUBLE-STRUCK SMALL PI..DOUBLE-STRUCK CAPITAL PI +2145..2149 ; ID_Continue # L& [5] DOUBLE-STRUCK ITALIC CAPITAL D..DOUBLE-STRUCK ITALIC SMALL J +214E ; ID_Continue # L& TURNED SMALL F +2160..2182 ; ID_Continue # Nl [35] ROMAN NUMERAL ONE..ROMAN NUMERAL TEN THOUSAND +2183..2184 ; ID_Continue # L& [2] ROMAN NUMERAL REVERSED ONE HUNDRED..LATIN SMALL LETTER REVERSED C +2185..2188 ; ID_Continue # Nl [4] ROMAN NUMERAL SIX LATE FORM..ROMAN NUMERAL ONE HUNDRED THOUSAND +2C00..2C2E ; ID_Continue # L& [47] GLAGOLITIC CAPITAL LETTER AZU..GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE +2C30..2C5E ; ID_Continue # L& [47] GLAGOLITIC SMALL LETTER AZU..GLAGOLITIC SMALL LETTER LATINATE MYSLITE +2C60..2C7B ; ID_Continue # L& [28] LATIN CAPITAL LETTER L WITH DOUBLE BAR..LATIN LETTER SMALL CAPITAL TURNED E +2C7C..2C7D ; ID_Continue # Lm [2] LATIN SUBSCRIPT SMALL LETTER J..MODIFIER LETTER CAPITAL V +2C7E..2CE4 ; ID_Continue # L& [103] LATIN CAPITAL LETTER S WITH SWASH TAIL..COPTIC SYMBOL KAI +2CEB..2CEE ; ID_Continue # L& [4] COPTIC CAPITAL LETTER CRYPTOGRAMMIC SHEI..COPTIC SMALL LETTER CRYPTOGRAMMIC GANGIA +2CEF..2CF1 ; ID_Continue # Mn [3] COPTIC COMBINING NI ABOVE..COPTIC COMBINING SPIRITUS LENIS +2CF2..2CF3 ; ID_Continue # L& [2] COPTIC CAPITAL LETTER BOHAIRIC KHEI..COPTIC SMALL LETTER BOHAIRIC KHEI +2D00..2D25 ; ID_Continue # L& [38] GEORGIAN SMALL LETTER AN..GEORGIAN SMALL LETTER HOE +2D27 ; ID_Continue # L& GEORGIAN SMALL LETTER YN +2D2D ; ID_Continue # L& GEORGIAN SMALL LETTER AEN +2D30..2D67 ; ID_Continue # Lo [56] TIFINAGH LETTER YA..TIFINAGH LETTER YO +2D6F ; ID_Continue # Lm TIFINAGH MODIFIER LETTER LABIALIZATION MARK +2D7F ; ID_Continue # Mn TIFINAGH CONSONANT JOINER +2D80..2D96 ; ID_Continue # Lo [23] ETHIOPIC SYLLABLE LOA..ETHIOPIC SYLLABLE GGWE +2DA0..2DA6 ; ID_Continue # Lo [7] ETHIOPIC SYLLABLE SSA..ETHIOPIC SYLLABLE SSO +2DA8..2DAE ; ID_Continue # Lo [7] ETHIOPIC SYLLABLE CCA..ETHIOPIC SYLLABLE CCO +2DB0..2DB6 ; ID_Continue # Lo [7] ETHIOPIC SYLLABLE ZZA..ETHIOPIC SYLLABLE ZZO +2DB8..2DBE ; ID_Continue # Lo [7] ETHIOPIC SYLLABLE CCHA..ETHIOPIC SYLLABLE CCHO +2DC0..2DC6 ; ID_Continue # Lo [7] ETHIOPIC SYLLABLE QYA..ETHIOPIC SYLLABLE QYO +2DC8..2DCE ; ID_Continue # Lo [7] ETHIOPIC SYLLABLE KYA..ETHIOPIC SYLLABLE KYO +2DD0..2DD6 ; ID_Continue # Lo [7] ETHIOPIC SYLLABLE XYA..ETHIOPIC SYLLABLE XYO +2DD8..2DDE ; ID_Continue # Lo [7] ETHIOPIC SYLLABLE GYA..ETHIOPIC SYLLABLE GYO +2DE0..2DFF ; ID_Continue # Mn [32] COMBINING CYRILLIC LETTER BE..COMBINING CYRILLIC LETTER IOTIFIED BIG YUS +3005 ; ID_Continue # Lm IDEOGRAPHIC ITERATION MARK +3006 ; ID_Continue # Lo IDEOGRAPHIC CLOSING MARK +3007 ; ID_Continue # Nl IDEOGRAPHIC NUMBER ZERO +3021..3029 ; ID_Continue # Nl [9] HANGZHOU NUMERAL ONE..HANGZHOU NUMERAL NINE +302A..302D ; ID_Continue # Mn [4] IDEOGRAPHIC LEVEL TONE MARK..IDEOGRAPHIC ENTERING TONE MARK +302E..302F ; ID_Continue # Mc [2] HANGUL SINGLE DOT TONE MARK..HANGUL DOUBLE DOT TONE MARK +3031..3035 ; ID_Continue # Lm [5] VERTICAL KANA REPEAT MARK..VERTICAL KANA REPEAT MARK LOWER HALF +3038..303A ; ID_Continue # Nl [3] HANGZHOU NUMERAL TEN..HANGZHOU NUMERAL THIRTY +303B ; ID_Continue # Lm VERTICAL IDEOGRAPHIC ITERATION MARK +303C ; ID_Continue # Lo MASU MARK +3041..3096 ; ID_Continue # Lo [86] HIRAGANA LETTER SMALL A..HIRAGANA LETTER SMALL KE +3099..309A ; ID_Continue # Mn [2] COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK..COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK +309B..309C ; ID_Continue # Sk [2] KATAKANA-HIRAGANA VOICED SOUND MARK..KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK +309D..309E ; ID_Continue # Lm [2] HIRAGANA ITERATION MARK..HIRAGANA VOICED ITERATION MARK +309F ; ID_Continue # Lo HIRAGANA DIGRAPH YORI +30A1..30FA ; ID_Continue # Lo [90] KATAKANA LETTER SMALL A..KATAKANA LETTER VO +30FC..30FE ; ID_Continue # Lm [3] KATAKANA-HIRAGANA PROLONGED SOUND MARK..KATAKANA VOICED ITERATION MARK +30FF ; ID_Continue # Lo KATAKANA DIGRAPH KOTO +3105..312F ; ID_Continue # Lo [43] BOPOMOFO LETTER B..BOPOMOFO LETTER NN +3131..318E ; ID_Continue # Lo [94] HANGUL LETTER KIYEOK..HANGUL LETTER ARAEAE +31A0..31BA ; ID_Continue # Lo [27] BOPOMOFO LETTER BU..BOPOMOFO LETTER ZY +31F0..31FF ; ID_Continue # Lo [16] KATAKANA LETTER SMALL KU..KATAKANA LETTER SMALL RO +3400..4DB5 ; ID_Continue # Lo [6582] CJK UNIFIED IDEOGRAPH-3400..CJK UNIFIED IDEOGRAPH-4DB5 +4E00..9FEF ; ID_Continue # Lo [20976] CJK UNIFIED IDEOGRAPH-4E00..CJK UNIFIED IDEOGRAPH-9FEF +A000..A014 ; ID_Continue # Lo [21] YI SYLLABLE IT..YI SYLLABLE E +A015 ; ID_Continue # Lm YI SYLLABLE WU +A016..A48C ; ID_Continue # Lo [1143] YI SYLLABLE BIT..YI SYLLABLE YYR +A4D0..A4F7 ; ID_Continue # Lo [40] LISU LETTER BA..LISU LETTER OE +A4F8..A4FD ; ID_Continue # Lm [6] LISU LETTER TONE MYA TI..LISU LETTER TONE MYA JEU +A500..A60B ; ID_Continue # Lo [268] VAI SYLLABLE EE..VAI SYLLABLE NG +A60C ; ID_Continue # Lm VAI SYLLABLE LENGTHENER +A610..A61F ; ID_Continue # Lo [16] VAI SYLLABLE NDOLE FA..VAI SYMBOL JONG +A620..A629 ; ID_Continue # Nd [10] VAI DIGIT ZERO..VAI DIGIT NINE +A62A..A62B ; ID_Continue # Lo [2] VAI SYLLABLE NDOLE MA..VAI SYLLABLE NDOLE DO +A640..A66D ; ID_Continue # L& [46] CYRILLIC CAPITAL LETTER ZEMLYA..CYRILLIC SMALL LETTER DOUBLE MONOCULAR O +A66E ; ID_Continue # Lo CYRILLIC LETTER MULTIOCULAR O +A66F ; ID_Continue # Mn COMBINING CYRILLIC VZMET +A674..A67D ; ID_Continue # Mn [10] COMBINING CYRILLIC LETTER UKRAINIAN IE..COMBINING CYRILLIC PAYEROK +A67F ; ID_Continue # Lm CYRILLIC PAYEROK +A680..A69B ; ID_Continue # L& [28] CYRILLIC CAPITAL LETTER DWE..CYRILLIC SMALL LETTER CROSSED O +A69C..A69D ; ID_Continue # Lm [2] MODIFIER LETTER CYRILLIC HARD SIGN..MODIFIER LETTER CYRILLIC SOFT SIGN +A69E..A69F ; ID_Continue # Mn [2] COMBINING CYRILLIC LETTER EF..COMBINING CYRILLIC LETTER IOTIFIED E +A6A0..A6E5 ; ID_Continue # Lo [70] BAMUM LETTER A..BAMUM LETTER KI +A6E6..A6EF ; ID_Continue # Nl [10] BAMUM LETTER MO..BAMUM LETTER KOGHOM +A6F0..A6F1 ; ID_Continue # Mn [2] BAMUM COMBINING MARK KOQNDON..BAMUM COMBINING MARK TUKWENTIS +A717..A71F ; ID_Continue # Lm [9] MODIFIER LETTER DOT VERTICAL BAR..MODIFIER LETTER LOW INVERTED EXCLAMATION MARK +A722..A76F ; ID_Continue # L& [78] LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF..LATIN SMALL LETTER CON +A770 ; ID_Continue # Lm MODIFIER LETTER US +A771..A787 ; ID_Continue # L& [23] LATIN SMALL LETTER DUM..LATIN SMALL LETTER INSULAR T +A788 ; ID_Continue # Lm MODIFIER LETTER LOW CIRCUMFLEX ACCENT +A78B..A78E ; ID_Continue # L& [4] LATIN CAPITAL LETTER SALTILLO..LATIN SMALL LETTER L WITH RETROFLEX HOOK AND BELT +A78F ; ID_Continue # Lo LATIN LETTER SINOLOGICAL DOT +A790..A7B9 ; ID_Continue # L& [42] LATIN CAPITAL LETTER N WITH DESCENDER..LATIN SMALL LETTER U WITH STROKE +A7F7 ; ID_Continue # Lo LATIN EPIGRAPHIC LETTER SIDEWAYS I +A7F8..A7F9 ; ID_Continue # Lm [2] MODIFIER LETTER CAPITAL H WITH STROKE..MODIFIER LETTER SMALL LIGATURE OE +A7FA ; ID_Continue # L& LATIN LETTER SMALL CAPITAL TURNED M +A7FB..A801 ; ID_Continue # Lo [7] LATIN EPIGRAPHIC LETTER REVERSED F..SYLOTI NAGRI LETTER I +A802 ; ID_Continue # Mn SYLOTI NAGRI SIGN DVISVARA +A803..A805 ; ID_Continue # Lo [3] SYLOTI NAGRI LETTER U..SYLOTI NAGRI LETTER O +A806 ; ID_Continue # Mn SYLOTI NAGRI SIGN HASANTA +A807..A80A ; ID_Continue # Lo [4] SYLOTI NAGRI LETTER KO..SYLOTI NAGRI LETTER GHO +A80B ; ID_Continue # Mn SYLOTI NAGRI SIGN ANUSVARA +A80C..A822 ; ID_Continue # Lo [23] SYLOTI NAGRI LETTER CO..SYLOTI NAGRI LETTER HO +A823..A824 ; ID_Continue # Mc [2] SYLOTI NAGRI VOWEL SIGN A..SYLOTI NAGRI VOWEL SIGN I +A825..A826 ; ID_Continue # Mn [2] SYLOTI NAGRI VOWEL SIGN U..SYLOTI NAGRI VOWEL SIGN E +A827 ; ID_Continue # Mc SYLOTI NAGRI VOWEL SIGN OO +A840..A873 ; ID_Continue # Lo [52] PHAGS-PA LETTER KA..PHAGS-PA LETTER CANDRABINDU +A880..A881 ; ID_Continue # Mc [2] SAURASHTRA SIGN ANUSVARA..SAURASHTRA SIGN VISARGA +A882..A8B3 ; ID_Continue # Lo [50] SAURASHTRA LETTER A..SAURASHTRA LETTER LLA +A8B4..A8C3 ; ID_Continue # Mc [16] SAURASHTRA CONSONANT SIGN HAARU..SAURASHTRA VOWEL SIGN AU +A8C4..A8C5 ; ID_Continue # Mn [2] SAURASHTRA SIGN VIRAMA..SAURASHTRA SIGN CANDRABINDU +A8D0..A8D9 ; ID_Continue # Nd [10] SAURASHTRA DIGIT ZERO..SAURASHTRA DIGIT NINE +A8E0..A8F1 ; ID_Continue # Mn [18] COMBINING DEVANAGARI DIGIT ZERO..COMBINING DEVANAGARI SIGN AVAGRAHA +A8F2..A8F7 ; ID_Continue # Lo [6] DEVANAGARI SIGN SPACING CANDRABINDU..DEVANAGARI SIGN CANDRABINDU AVAGRAHA +A8FB ; ID_Continue # Lo DEVANAGARI HEADSTROKE +A8FD..A8FE ; ID_Continue # Lo [2] DEVANAGARI JAIN OM..DEVANAGARI LETTER AY +A8FF ; ID_Continue # Mn DEVANAGARI VOWEL SIGN AY +A900..A909 ; ID_Continue # Nd [10] KAYAH LI DIGIT ZERO..KAYAH LI DIGIT NINE +A90A..A925 ; ID_Continue # Lo [28] KAYAH LI LETTER KA..KAYAH LI LETTER OO +A926..A92D ; ID_Continue # Mn [8] KAYAH LI VOWEL UE..KAYAH LI TONE CALYA PLOPHU +A930..A946 ; ID_Continue # Lo [23] REJANG LETTER KA..REJANG LETTER A +A947..A951 ; ID_Continue # Mn [11] REJANG VOWEL SIGN I..REJANG CONSONANT SIGN R +A952..A953 ; ID_Continue # Mc [2] REJANG CONSONANT SIGN H..REJANG VIRAMA +A960..A97C ; ID_Continue # Lo [29] HANGUL CHOSEONG TIKEUT-MIEUM..HANGUL CHOSEONG SSANGYEORINHIEUH +A980..A982 ; ID_Continue # Mn [3] JAVANESE SIGN PANYANGGA..JAVANESE SIGN LAYAR +A983 ; ID_Continue # Mc JAVANESE SIGN WIGNYAN +A984..A9B2 ; ID_Continue # Lo [47] JAVANESE LETTER A..JAVANESE LETTER HA +A9B3 ; ID_Continue # Mn JAVANESE SIGN CECAK TELU +A9B4..A9B5 ; ID_Continue # Mc [2] JAVANESE VOWEL SIGN TARUNG..JAVANESE VOWEL SIGN TOLONG +A9B6..A9B9 ; ID_Continue # Mn [4] JAVANESE VOWEL SIGN WULU..JAVANESE VOWEL SIGN SUKU MENDUT +A9BA..A9BB ; ID_Continue # Mc [2] JAVANESE VOWEL SIGN TALING..JAVANESE VOWEL SIGN DIRGA MURE +A9BC ; ID_Continue # Mn JAVANESE VOWEL SIGN PEPET +A9BD..A9C0 ; ID_Continue # Mc [4] JAVANESE CONSONANT SIGN KERET..JAVANESE PANGKON +A9CF ; ID_Continue # Lm JAVANESE PANGRANGKEP +A9D0..A9D9 ; ID_Continue # Nd [10] JAVANESE DIGIT ZERO..JAVANESE DIGIT NINE +A9E0..A9E4 ; ID_Continue # Lo [5] MYANMAR LETTER SHAN GHA..MYANMAR LETTER SHAN BHA +A9E5 ; ID_Continue # Mn MYANMAR SIGN SHAN SAW +A9E6 ; ID_Continue # Lm MYANMAR MODIFIER LETTER SHAN REDUPLICATION +A9E7..A9EF ; ID_Continue # Lo [9] MYANMAR LETTER TAI LAING NYA..MYANMAR LETTER TAI LAING NNA +A9F0..A9F9 ; ID_Continue # Nd [10] MYANMAR TAI LAING DIGIT ZERO..MYANMAR TAI LAING DIGIT NINE +A9FA..A9FE ; ID_Continue # Lo [5] MYANMAR LETTER TAI LAING LLA..MYANMAR LETTER TAI LAING BHA +AA00..AA28 ; ID_Continue # Lo [41] CHAM LETTER A..CHAM LETTER HA +AA29..AA2E ; ID_Continue # Mn [6] CHAM VOWEL SIGN AA..CHAM VOWEL SIGN OE +AA2F..AA30 ; ID_Continue # Mc [2] CHAM VOWEL SIGN O..CHAM VOWEL SIGN AI +AA31..AA32 ; ID_Continue # Mn [2] CHAM VOWEL SIGN AU..CHAM VOWEL SIGN UE +AA33..AA34 ; ID_Continue # Mc [2] CHAM CONSONANT SIGN YA..CHAM CONSONANT SIGN RA +AA35..AA36 ; ID_Continue # Mn [2] CHAM CONSONANT SIGN LA..CHAM CONSONANT SIGN WA +AA40..AA42 ; ID_Continue # Lo [3] CHAM LETTER FINAL K..CHAM LETTER FINAL NG +AA43 ; ID_Continue # Mn CHAM CONSONANT SIGN FINAL NG +AA44..AA4B ; ID_Continue # Lo [8] CHAM LETTER FINAL CH..CHAM LETTER FINAL SS +AA4C ; ID_Continue # Mn CHAM CONSONANT SIGN FINAL M +AA4D ; ID_Continue # Mc CHAM CONSONANT SIGN FINAL H +AA50..AA59 ; ID_Continue # Nd [10] CHAM DIGIT ZERO..CHAM DIGIT NINE +AA60..AA6F ; ID_Continue # Lo [16] MYANMAR LETTER KHAMTI GA..MYANMAR LETTER KHAMTI FA +AA70 ; ID_Continue # Lm MYANMAR MODIFIER LETTER KHAMTI REDUPLICATION +AA71..AA76 ; ID_Continue # Lo [6] MYANMAR LETTER KHAMTI XA..MYANMAR LOGOGRAM KHAMTI HM +AA7A ; ID_Continue # Lo MYANMAR LETTER AITON RA +AA7B ; ID_Continue # Mc MYANMAR SIGN PAO KAREN TONE +AA7C ; ID_Continue # Mn MYANMAR SIGN TAI LAING TONE-2 +AA7D ; ID_Continue # Mc MYANMAR SIGN TAI LAING TONE-5 +AA7E..AAAF ; ID_Continue # Lo [50] MYANMAR LETTER SHWE PALAUNG CHA..TAI VIET LETTER HIGH O +AAB0 ; ID_Continue # Mn TAI VIET MAI KANG +AAB1 ; ID_Continue # Lo TAI VIET VOWEL AA +AAB2..AAB4 ; ID_Continue # Mn [3] TAI VIET VOWEL I..TAI VIET VOWEL U +AAB5..AAB6 ; ID_Continue # Lo [2] TAI VIET VOWEL E..TAI VIET VOWEL O +AAB7..AAB8 ; ID_Continue # Mn [2] TAI VIET MAI KHIT..TAI VIET VOWEL IA +AAB9..AABD ; ID_Continue # Lo [5] TAI VIET VOWEL UEA..TAI VIET VOWEL AN +AABE..AABF ; ID_Continue # Mn [2] TAI VIET VOWEL AM..TAI VIET TONE MAI EK +AAC0 ; ID_Continue # Lo TAI VIET TONE MAI NUENG +AAC1 ; ID_Continue # Mn TAI VIET TONE MAI THO +AAC2 ; ID_Continue # Lo TAI VIET TONE MAI SONG +AADB..AADC ; ID_Continue # Lo [2] TAI VIET SYMBOL KON..TAI VIET SYMBOL NUENG +AADD ; ID_Continue # Lm TAI VIET SYMBOL SAM +AAE0..AAEA ; ID_Continue # Lo [11] MEETEI MAYEK LETTER E..MEETEI MAYEK LETTER SSA +AAEB ; ID_Continue # Mc MEETEI MAYEK VOWEL SIGN II +AAEC..AAED ; ID_Continue # Mn [2] MEETEI MAYEK VOWEL SIGN UU..MEETEI MAYEK VOWEL SIGN AAI +AAEE..AAEF ; ID_Continue # Mc [2] MEETEI MAYEK VOWEL SIGN AU..MEETEI MAYEK VOWEL SIGN AAU +AAF2 ; ID_Continue # Lo MEETEI MAYEK ANJI +AAF3..AAF4 ; ID_Continue # Lm [2] MEETEI MAYEK SYLLABLE REPETITION MARK..MEETEI MAYEK WORD REPETITION MARK +AAF5 ; ID_Continue # Mc MEETEI MAYEK VOWEL SIGN VISARGA +AAF6 ; ID_Continue # Mn MEETEI MAYEK VIRAMA +AB01..AB06 ; ID_Continue # Lo [6] ETHIOPIC SYLLABLE TTHU..ETHIOPIC SYLLABLE TTHO +AB09..AB0E ; ID_Continue # Lo [6] ETHIOPIC SYLLABLE DDHU..ETHIOPIC SYLLABLE DDHO +AB11..AB16 ; ID_Continue # Lo [6] ETHIOPIC SYLLABLE DZU..ETHIOPIC SYLLABLE DZO +AB20..AB26 ; ID_Continue # Lo [7] ETHIOPIC SYLLABLE CCHHA..ETHIOPIC SYLLABLE CCHHO +AB28..AB2E ; ID_Continue # Lo [7] ETHIOPIC SYLLABLE BBA..ETHIOPIC SYLLABLE BBO +AB30..AB5A ; ID_Continue # L& [43] LATIN SMALL LETTER BARRED ALPHA..LATIN SMALL LETTER Y WITH SHORT RIGHT LEG +AB5C..AB5F ; ID_Continue # Lm [4] MODIFIER LETTER SMALL HENG..MODIFIER LETTER SMALL U WITH LEFT HOOK +AB60..AB65 ; ID_Continue # L& [6] LATIN SMALL LETTER SAKHA YAT..GREEK LETTER SMALL CAPITAL OMEGA +AB70..ABBF ; ID_Continue # L& [80] CHEROKEE SMALL LETTER A..CHEROKEE SMALL LETTER YA +ABC0..ABE2 ; ID_Continue # Lo [35] MEETEI MAYEK LETTER KOK..MEETEI MAYEK LETTER I LONSUM +ABE3..ABE4 ; ID_Continue # Mc [2] MEETEI MAYEK VOWEL SIGN ONAP..MEETEI MAYEK VOWEL SIGN INAP +ABE5 ; ID_Continue # Mn MEETEI MAYEK VOWEL SIGN ANAP +ABE6..ABE7 ; ID_Continue # Mc [2] MEETEI MAYEK VOWEL SIGN YENAP..MEETEI MAYEK VOWEL SIGN SOUNAP +ABE8 ; ID_Continue # Mn MEETEI MAYEK VOWEL SIGN UNAP +ABE9..ABEA ; ID_Continue # Mc [2] MEETEI MAYEK VOWEL SIGN CHEINAP..MEETEI MAYEK VOWEL SIGN NUNG +ABEC ; ID_Continue # Mc MEETEI MAYEK LUM IYEK +ABED ; ID_Continue # Mn MEETEI MAYEK APUN IYEK +ABF0..ABF9 ; ID_Continue # Nd [10] MEETEI MAYEK DIGIT ZERO..MEETEI MAYEK DIGIT NINE +AC00..D7A3 ; ID_Continue # Lo [11172] HANGUL SYLLABLE GA..HANGUL SYLLABLE HIH +D7B0..D7C6 ; ID_Continue # Lo [23] HANGUL JUNGSEONG O-YEO..HANGUL JUNGSEONG ARAEA-E +D7CB..D7FB ; ID_Continue # Lo [49] HANGUL JONGSEONG NIEUN-RIEUL..HANGUL JONGSEONG PHIEUPH-THIEUTH +F900..FA6D ; ID_Continue # Lo [366] CJK COMPATIBILITY IDEOGRAPH-F900..CJK COMPATIBILITY IDEOGRAPH-FA6D +FA70..FAD9 ; ID_Continue # Lo [106] CJK COMPATIBILITY IDEOGRAPH-FA70..CJK COMPATIBILITY IDEOGRAPH-FAD9 +FB00..FB06 ; ID_Continue # L& [7] LATIN SMALL LIGATURE FF..LATIN SMALL LIGATURE ST +FB13..FB17 ; ID_Continue # L& [5] ARMENIAN SMALL LIGATURE MEN NOW..ARMENIAN SMALL LIGATURE MEN XEH +FB1D ; ID_Continue # Lo HEBREW LETTER YOD WITH HIRIQ +FB1E ; ID_Continue # Mn HEBREW POINT JUDEO-SPANISH VARIKA +FB1F..FB28 ; ID_Continue # Lo [10] HEBREW LIGATURE YIDDISH YOD YOD PATAH..HEBREW LETTER WIDE TAV +FB2A..FB36 ; ID_Continue # Lo [13] HEBREW LETTER SHIN WITH SHIN DOT..HEBREW LETTER ZAYIN WITH DAGESH +FB38..FB3C ; ID_Continue # Lo [5] HEBREW LETTER TET WITH DAGESH..HEBREW LETTER LAMED WITH DAGESH +FB3E ; ID_Continue # Lo HEBREW LETTER MEM WITH DAGESH +FB40..FB41 ; ID_Continue # Lo [2] HEBREW LETTER NUN WITH DAGESH..HEBREW LETTER SAMEKH WITH DAGESH +FB43..FB44 ; ID_Continue # Lo [2] HEBREW LETTER FINAL PE WITH DAGESH..HEBREW LETTER PE WITH DAGESH +FB46..FBB1 ; ID_Continue # Lo [108] HEBREW LETTER TSADI WITH DAGESH..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM +FBD3..FD3D ; ID_Continue # Lo [363] ARABIC LETTER NG ISOLATED FORM..ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM +FD50..FD8F ; ID_Continue # Lo [64] ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM..ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM +FD92..FDC7 ; ID_Continue # Lo [54] ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM..ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM +FDF0..FDFB ; ID_Continue # Lo [12] ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM..ARABIC LIGATURE JALLAJALALOUHOU +FE00..FE0F ; ID_Continue # Mn [16] VARIATION SELECTOR-1..VARIATION SELECTOR-16 +FE20..FE2F ; ID_Continue # Mn [16] COMBINING LIGATURE LEFT HALF..COMBINING CYRILLIC TITLO RIGHT HALF +FE33..FE34 ; ID_Continue # Pc [2] PRESENTATION FORM FOR VERTICAL LOW LINE..PRESENTATION FORM FOR VERTICAL WAVY LOW LINE +FE4D..FE4F ; ID_Continue # Pc [3] DASHED LOW LINE..WAVY LOW LINE +FE70..FE74 ; ID_Continue # Lo [5] ARABIC FATHATAN ISOLATED FORM..ARABIC KASRATAN ISOLATED FORM +FE76..FEFC ; ID_Continue # Lo [135] ARABIC FATHA ISOLATED FORM..ARABIC LIGATURE LAM WITH ALEF FINAL FORM +FF10..FF19 ; ID_Continue # Nd [10] FULLWIDTH DIGIT ZERO..FULLWIDTH DIGIT NINE +FF21..FF3A ; ID_Continue # L& [26] FULLWIDTH LATIN CAPITAL LETTER A..FULLWIDTH LATIN CAPITAL LETTER Z +FF3F ; ID_Continue # Pc FULLWIDTH LOW LINE +FF41..FF5A ; ID_Continue # L& [26] FULLWIDTH LATIN SMALL LETTER A..FULLWIDTH LATIN SMALL LETTER Z +FF66..FF6F ; ID_Continue # Lo [10] HALFWIDTH KATAKANA LETTER WO..HALFWIDTH KATAKANA LETTER SMALL TU +FF70 ; ID_Continue # Lm HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK +FF71..FF9D ; ID_Continue # Lo [45] HALFWIDTH KATAKANA LETTER A..HALFWIDTH KATAKANA LETTER N +FF9E..FF9F ; ID_Continue # Lm [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK +FFA0..FFBE ; ID_Continue # Lo [31] HALFWIDTH HANGUL FILLER..HALFWIDTH HANGUL LETTER HIEUH +FFC2..FFC7 ; ID_Continue # Lo [6] HALFWIDTH HANGUL LETTER A..HALFWIDTH HANGUL LETTER E +FFCA..FFCF ; ID_Continue # Lo [6] HALFWIDTH HANGUL LETTER YEO..HALFWIDTH HANGUL LETTER OE +FFD2..FFD7 ; ID_Continue # Lo [6] HALFWIDTH HANGUL LETTER YO..HALFWIDTH HANGUL LETTER YU +FFDA..FFDC ; ID_Continue # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL LETTER I +10000..1000B ; ID_Continue # Lo [12] LINEAR B SYLLABLE B008 A..LINEAR B SYLLABLE B046 JE +1000D..10026 ; ID_Continue # Lo [26] LINEAR B SYLLABLE B036 JO..LINEAR B SYLLABLE B032 QO +10028..1003A ; ID_Continue # Lo [19] LINEAR B SYLLABLE B060 RA..LINEAR B SYLLABLE B042 WO +1003C..1003D ; ID_Continue # Lo [2] LINEAR B SYLLABLE B017 ZA..LINEAR B SYLLABLE B074 ZE +1003F..1004D ; ID_Continue # Lo [15] LINEAR B SYLLABLE B020 ZO..LINEAR B SYLLABLE B091 TWO +10050..1005D ; ID_Continue # Lo [14] LINEAR B SYMBOL B018..LINEAR B SYMBOL B089 +10080..100FA ; ID_Continue # Lo [123] LINEAR B IDEOGRAM B100 MAN..LINEAR B IDEOGRAM VESSEL B305 +10140..10174 ; ID_Continue # Nl [53] GREEK ACROPHONIC ATTIC ONE QUARTER..GREEK ACROPHONIC STRATIAN FIFTY MNAS +101FD ; ID_Continue # Mn PHAISTOS DISC SIGN COMBINING OBLIQUE STROKE +10280..1029C ; ID_Continue # Lo [29] LYCIAN LETTER A..LYCIAN LETTER X +102A0..102D0 ; ID_Continue # Lo [49] CARIAN LETTER A..CARIAN LETTER UUU3 +102E0 ; ID_Continue # Mn COPTIC EPACT THOUSANDS MARK +10300..1031F ; ID_Continue # Lo [32] OLD ITALIC LETTER A..OLD ITALIC LETTER ESS +1032D..10340 ; ID_Continue # Lo [20] OLD ITALIC LETTER YE..GOTHIC LETTER PAIRTHRA +10341 ; ID_Continue # Nl GOTHIC LETTER NINETY +10342..10349 ; ID_Continue # Lo [8] GOTHIC LETTER RAIDA..GOTHIC LETTER OTHAL +1034A ; ID_Continue # Nl GOTHIC LETTER NINE HUNDRED +10350..10375 ; ID_Continue # Lo [38] OLD PERMIC LETTER AN..OLD PERMIC LETTER IA +10376..1037A ; ID_Continue # Mn [5] COMBINING OLD PERMIC LETTER AN..COMBINING OLD PERMIC LETTER SII +10380..1039D ; ID_Continue # Lo [30] UGARITIC LETTER ALPA..UGARITIC LETTER SSU +103A0..103C3 ; ID_Continue # Lo [36] OLD PERSIAN SIGN A..OLD PERSIAN SIGN HA +103C8..103CF ; ID_Continue # Lo [8] OLD PERSIAN SIGN AURAMAZDAA..OLD PERSIAN SIGN BUUMISH +103D1..103D5 ; ID_Continue # Nl [5] OLD PERSIAN NUMBER ONE..OLD PERSIAN NUMBER HUNDRED +10400..1044F ; ID_Continue # L& [80] DESERET CAPITAL LETTER LONG I..DESERET SMALL LETTER EW +10450..1049D ; ID_Continue # Lo [78] SHAVIAN LETTER PEEP..OSMANYA LETTER OO +104A0..104A9 ; ID_Continue # Nd [10] OSMANYA DIGIT ZERO..OSMANYA DIGIT NINE +104B0..104D3 ; ID_Continue # L& [36] OSAGE CAPITAL LETTER A..OSAGE CAPITAL LETTER ZHA +104D8..104FB ; ID_Continue # L& [36] OSAGE SMALL LETTER A..OSAGE SMALL LETTER ZHA +10500..10527 ; ID_Continue # Lo [40] ELBASAN LETTER A..ELBASAN LETTER KHE +10530..10563 ; ID_Continue # Lo [52] CAUCASIAN ALBANIAN LETTER ALT..CAUCASIAN ALBANIAN LETTER KIW +10600..10736 ; ID_Continue # Lo [311] LINEAR A SIGN AB001..LINEAR A SIGN A664 +10740..10755 ; ID_Continue # Lo [22] LINEAR A SIGN A701 A..LINEAR A SIGN A732 JE +10760..10767 ; ID_Continue # Lo [8] LINEAR A SIGN A800..LINEAR A SIGN A807 +10800..10805 ; ID_Continue # Lo [6] CYPRIOT SYLLABLE A..CYPRIOT SYLLABLE JA +10808 ; ID_Continue # Lo CYPRIOT SYLLABLE JO +1080A..10835 ; ID_Continue # Lo [44] CYPRIOT SYLLABLE KA..CYPRIOT SYLLABLE WO +10837..10838 ; ID_Continue # Lo [2] CYPRIOT SYLLABLE XA..CYPRIOT SYLLABLE XE +1083C ; ID_Continue # Lo CYPRIOT SYLLABLE ZA +1083F..10855 ; ID_Continue # Lo [23] CYPRIOT SYLLABLE ZO..IMPERIAL ARAMAIC LETTER TAW +10860..10876 ; ID_Continue # Lo [23] PALMYRENE LETTER ALEPH..PALMYRENE LETTER TAW +10880..1089E ; ID_Continue # Lo [31] NABATAEAN LETTER FINAL ALEPH..NABATAEAN LETTER TAW +108E0..108F2 ; ID_Continue # Lo [19] HATRAN LETTER ALEPH..HATRAN LETTER QOPH +108F4..108F5 ; ID_Continue # Lo [2] HATRAN LETTER SHIN..HATRAN LETTER TAW +10900..10915 ; ID_Continue # Lo [22] PHOENICIAN LETTER ALF..PHOENICIAN LETTER TAU +10920..10939 ; ID_Continue # Lo [26] LYDIAN LETTER A..LYDIAN LETTER C +10980..109B7 ; ID_Continue # Lo [56] MEROITIC HIEROGLYPHIC LETTER A..MEROITIC CURSIVE LETTER DA +109BE..109BF ; ID_Continue # Lo [2] MEROITIC CURSIVE LOGOGRAM RMT..MEROITIC CURSIVE LOGOGRAM IMN +10A00 ; ID_Continue # Lo KHAROSHTHI LETTER A +10A01..10A03 ; ID_Continue # Mn [3] KHAROSHTHI VOWEL SIGN I..KHAROSHTHI VOWEL SIGN VOCALIC R +10A05..10A06 ; ID_Continue # Mn [2] KHAROSHTHI VOWEL SIGN E..KHAROSHTHI VOWEL SIGN O +10A0C..10A0F ; ID_Continue # Mn [4] KHAROSHTHI VOWEL LENGTH MARK..KHAROSHTHI SIGN VISARGA +10A10..10A13 ; ID_Continue # Lo [4] KHAROSHTHI LETTER KA..KHAROSHTHI LETTER GHA +10A15..10A17 ; ID_Continue # Lo [3] KHAROSHTHI LETTER CA..KHAROSHTHI LETTER JA +10A19..10A35 ; ID_Continue # Lo [29] KHAROSHTHI LETTER NYA..KHAROSHTHI LETTER VHA +10A38..10A3A ; ID_Continue # Mn [3] KHAROSHTHI SIGN BAR ABOVE..KHAROSHTHI SIGN DOT BELOW +10A3F ; ID_Continue # Mn KHAROSHTHI VIRAMA +10A60..10A7C ; ID_Continue # Lo [29] OLD SOUTH ARABIAN LETTER HE..OLD SOUTH ARABIAN LETTER THETH +10A80..10A9C ; ID_Continue # Lo [29] OLD NORTH ARABIAN LETTER HEH..OLD NORTH ARABIAN LETTER ZAH +10AC0..10AC7 ; ID_Continue # Lo [8] MANICHAEAN LETTER ALEPH..MANICHAEAN LETTER WAW +10AC9..10AE4 ; ID_Continue # Lo [28] MANICHAEAN LETTER ZAYIN..MANICHAEAN LETTER TAW +10AE5..10AE6 ; ID_Continue # Mn [2] MANICHAEAN ABBREVIATION MARK ABOVE..MANICHAEAN ABBREVIATION MARK BELOW +10B00..10B35 ; ID_Continue # Lo [54] AVESTAN LETTER A..AVESTAN LETTER HE +10B40..10B55 ; ID_Continue # Lo [22] INSCRIPTIONAL PARTHIAN LETTER ALEPH..INSCRIPTIONAL PARTHIAN LETTER TAW +10B60..10B72 ; ID_Continue # Lo [19] INSCRIPTIONAL PAHLAVI LETTER ALEPH..INSCRIPTIONAL PAHLAVI LETTER TAW +10B80..10B91 ; ID_Continue # Lo [18] PSALTER PAHLAVI LETTER ALEPH..PSALTER PAHLAVI LETTER TAW +10C00..10C48 ; ID_Continue # Lo [73] OLD TURKIC LETTER ORKHON A..OLD TURKIC LETTER ORKHON BASH +10C80..10CB2 ; ID_Continue # L& [51] OLD HUNGARIAN CAPITAL LETTER A..OLD HUNGARIAN CAPITAL LETTER US +10CC0..10CF2 ; ID_Continue # L& [51] OLD HUNGARIAN SMALL LETTER A..OLD HUNGARIAN SMALL LETTER US +10D00..10D23 ; ID_Continue # Lo [36] HANIFI ROHINGYA LETTER A..HANIFI ROHINGYA MARK NA KHONNA +10D24..10D27 ; ID_Continue # Mn [4] HANIFI ROHINGYA SIGN HARBAHAY..HANIFI ROHINGYA SIGN TASSI +10D30..10D39 ; ID_Continue # Nd [10] HANIFI ROHINGYA DIGIT ZERO..HANIFI ROHINGYA DIGIT NINE +10F00..10F1C ; ID_Continue # Lo [29] OLD SOGDIAN LETTER ALEPH..OLD SOGDIAN LETTER FINAL TAW WITH VERTICAL TAIL +10F27 ; ID_Continue # Lo OLD SOGDIAN LIGATURE AYIN-DALETH +10F30..10F45 ; ID_Continue # Lo [22] SOGDIAN LETTER ALEPH..SOGDIAN INDEPENDENT SHIN +10F46..10F50 ; ID_Continue # Mn [11] SOGDIAN COMBINING DOT BELOW..SOGDIAN COMBINING STROKE BELOW +11000 ; ID_Continue # Mc BRAHMI SIGN CANDRABINDU +11001 ; ID_Continue # Mn BRAHMI SIGN ANUSVARA +11002 ; ID_Continue # Mc BRAHMI SIGN VISARGA +11003..11037 ; ID_Continue # Lo [53] BRAHMI SIGN JIHVAMULIYA..BRAHMI LETTER OLD TAMIL NNNA +11038..11046 ; ID_Continue # Mn [15] BRAHMI VOWEL SIGN AA..BRAHMI VIRAMA +11066..1106F ; ID_Continue # Nd [10] BRAHMI DIGIT ZERO..BRAHMI DIGIT NINE +1107F..11081 ; ID_Continue # Mn [3] BRAHMI NUMBER JOINER..KAITHI SIGN ANUSVARA +11082 ; ID_Continue # Mc KAITHI SIGN VISARGA +11083..110AF ; ID_Continue # Lo [45] KAITHI LETTER A..KAITHI LETTER HA +110B0..110B2 ; ID_Continue # Mc [3] KAITHI VOWEL SIGN AA..KAITHI VOWEL SIGN II +110B3..110B6 ; ID_Continue # Mn [4] KAITHI VOWEL SIGN U..KAITHI VOWEL SIGN AI +110B7..110B8 ; ID_Continue # Mc [2] KAITHI VOWEL SIGN O..KAITHI VOWEL SIGN AU +110B9..110BA ; ID_Continue # Mn [2] KAITHI SIGN VIRAMA..KAITHI SIGN NUKTA +110D0..110E8 ; ID_Continue # Lo [25] SORA SOMPENG LETTER SAH..SORA SOMPENG LETTER MAE +110F0..110F9 ; ID_Continue # Nd [10] SORA SOMPENG DIGIT ZERO..SORA SOMPENG DIGIT NINE +11100..11102 ; ID_Continue # Mn [3] CHAKMA SIGN CANDRABINDU..CHAKMA SIGN VISARGA +11103..11126 ; ID_Continue # Lo [36] CHAKMA LETTER AA..CHAKMA LETTER HAA +11127..1112B ; ID_Continue # Mn [5] CHAKMA VOWEL SIGN A..CHAKMA VOWEL SIGN UU +1112C ; ID_Continue # Mc CHAKMA VOWEL SIGN E +1112D..11134 ; ID_Continue # Mn [8] CHAKMA VOWEL SIGN AI..CHAKMA MAAYYAA +11136..1113F ; ID_Continue # Nd [10] CHAKMA DIGIT ZERO..CHAKMA DIGIT NINE +11144 ; ID_Continue # Lo CHAKMA LETTER LHAA +11145..11146 ; ID_Continue # Mc [2] CHAKMA VOWEL SIGN AA..CHAKMA VOWEL SIGN EI +11150..11172 ; ID_Continue # Lo [35] MAHAJANI LETTER A..MAHAJANI LETTER RRA +11173 ; ID_Continue # Mn MAHAJANI SIGN NUKTA +11176 ; ID_Continue # Lo MAHAJANI LIGATURE SHRI +11180..11181 ; ID_Continue # Mn [2] SHARADA SIGN CANDRABINDU..SHARADA SIGN ANUSVARA +11182 ; ID_Continue # Mc SHARADA SIGN VISARGA +11183..111B2 ; ID_Continue # Lo [48] SHARADA LETTER A..SHARADA LETTER HA +111B3..111B5 ; ID_Continue # Mc [3] SHARADA VOWEL SIGN AA..SHARADA VOWEL SIGN II +111B6..111BE ; ID_Continue # Mn [9] SHARADA VOWEL SIGN U..SHARADA VOWEL SIGN O +111BF..111C0 ; ID_Continue # Mc [2] SHARADA VOWEL SIGN AU..SHARADA SIGN VIRAMA +111C1..111C4 ; ID_Continue # Lo [4] SHARADA SIGN AVAGRAHA..SHARADA OM +111C9..111CC ; ID_Continue # Mn [4] SHARADA SANDHI MARK..SHARADA EXTRA SHORT VOWEL MARK +111D0..111D9 ; ID_Continue # Nd [10] SHARADA DIGIT ZERO..SHARADA DIGIT NINE +111DA ; ID_Continue # Lo SHARADA EKAM +111DC ; ID_Continue # Lo SHARADA HEADSTROKE +11200..11211 ; ID_Continue # Lo [18] KHOJKI LETTER A..KHOJKI LETTER JJA +11213..1122B ; ID_Continue # Lo [25] KHOJKI LETTER NYA..KHOJKI LETTER LLA +1122C..1122E ; ID_Continue # Mc [3] KHOJKI VOWEL SIGN AA..KHOJKI VOWEL SIGN II +1122F..11231 ; ID_Continue # Mn [3] KHOJKI VOWEL SIGN U..KHOJKI VOWEL SIGN AI +11232..11233 ; ID_Continue # Mc [2] KHOJKI VOWEL SIGN O..KHOJKI VOWEL SIGN AU +11234 ; ID_Continue # Mn KHOJKI SIGN ANUSVARA +11235 ; ID_Continue # Mc KHOJKI SIGN VIRAMA +11236..11237 ; ID_Continue # Mn [2] KHOJKI SIGN NUKTA..KHOJKI SIGN SHADDA +1123E ; ID_Continue # Mn KHOJKI SIGN SUKUN +11280..11286 ; ID_Continue # Lo [7] MULTANI LETTER A..MULTANI LETTER GA +11288 ; ID_Continue # Lo MULTANI LETTER GHA +1128A..1128D ; ID_Continue # Lo [4] MULTANI LETTER CA..MULTANI LETTER JJA +1128F..1129D ; ID_Continue # Lo [15] MULTANI LETTER NYA..MULTANI LETTER BA +1129F..112A8 ; ID_Continue # Lo [10] MULTANI LETTER BHA..MULTANI LETTER RHA +112B0..112DE ; ID_Continue # Lo [47] KHUDAWADI LETTER A..KHUDAWADI LETTER HA +112DF ; ID_Continue # Mn KHUDAWADI SIGN ANUSVARA +112E0..112E2 ; ID_Continue # Mc [3] KHUDAWADI VOWEL SIGN AA..KHUDAWADI VOWEL SIGN II +112E3..112EA ; ID_Continue # Mn [8] KHUDAWADI VOWEL SIGN U..KHUDAWADI SIGN VIRAMA +112F0..112F9 ; ID_Continue # Nd [10] KHUDAWADI DIGIT ZERO..KHUDAWADI DIGIT NINE +11300..11301 ; ID_Continue # Mn [2] GRANTHA SIGN COMBINING ANUSVARA ABOVE..GRANTHA SIGN CANDRABINDU +11302..11303 ; ID_Continue # Mc [2] GRANTHA SIGN ANUSVARA..GRANTHA SIGN VISARGA +11305..1130C ; ID_Continue # Lo [8] GRANTHA LETTER A..GRANTHA LETTER VOCALIC L +1130F..11310 ; ID_Continue # Lo [2] GRANTHA LETTER EE..GRANTHA LETTER AI +11313..11328 ; ID_Continue # Lo [22] GRANTHA LETTER OO..GRANTHA LETTER NA +1132A..11330 ; ID_Continue # Lo [7] GRANTHA LETTER PA..GRANTHA LETTER RA +11332..11333 ; ID_Continue # Lo [2] GRANTHA LETTER LA..GRANTHA LETTER LLA +11335..11339 ; ID_Continue # Lo [5] GRANTHA LETTER VA..GRANTHA LETTER HA +1133B..1133C ; ID_Continue # Mn [2] COMBINING BINDU BELOW..GRANTHA SIGN NUKTA +1133D ; ID_Continue # Lo GRANTHA SIGN AVAGRAHA +1133E..1133F ; ID_Continue # Mc [2] GRANTHA VOWEL SIGN AA..GRANTHA VOWEL SIGN I +11340 ; ID_Continue # Mn GRANTHA VOWEL SIGN II +11341..11344 ; ID_Continue # Mc [4] GRANTHA VOWEL SIGN U..GRANTHA VOWEL SIGN VOCALIC RR +11347..11348 ; ID_Continue # Mc [2] GRANTHA VOWEL SIGN EE..GRANTHA VOWEL SIGN AI +1134B..1134D ; ID_Continue # Mc [3] GRANTHA VOWEL SIGN OO..GRANTHA SIGN VIRAMA +11350 ; ID_Continue # Lo GRANTHA OM +11357 ; ID_Continue # Mc GRANTHA AU LENGTH MARK +1135D..11361 ; ID_Continue # Lo [5] GRANTHA SIGN PLUTA..GRANTHA LETTER VOCALIC LL +11362..11363 ; ID_Continue # Mc [2] GRANTHA VOWEL SIGN VOCALIC L..GRANTHA VOWEL SIGN VOCALIC LL +11366..1136C ; ID_Continue # Mn [7] COMBINING GRANTHA DIGIT ZERO..COMBINING GRANTHA DIGIT SIX +11370..11374 ; ID_Continue # Mn [5] COMBINING GRANTHA LETTER A..COMBINING GRANTHA LETTER PA +11400..11434 ; ID_Continue # Lo [53] NEWA LETTER A..NEWA LETTER HA +11435..11437 ; ID_Continue # Mc [3] NEWA VOWEL SIGN AA..NEWA VOWEL SIGN II +11438..1143F ; ID_Continue # Mn [8] NEWA VOWEL SIGN U..NEWA VOWEL SIGN AI +11440..11441 ; ID_Continue # Mc [2] NEWA VOWEL SIGN O..NEWA VOWEL SIGN AU +11442..11444 ; ID_Continue # Mn [3] NEWA SIGN VIRAMA..NEWA SIGN ANUSVARA +11445 ; ID_Continue # Mc NEWA SIGN VISARGA +11446 ; ID_Continue # Mn NEWA SIGN NUKTA +11447..1144A ; ID_Continue # Lo [4] NEWA SIGN AVAGRAHA..NEWA SIDDHI +11450..11459 ; ID_Continue # Nd [10] NEWA DIGIT ZERO..NEWA DIGIT NINE +1145E ; ID_Continue # Mn NEWA SANDHI MARK +11480..114AF ; ID_Continue # Lo [48] TIRHUTA ANJI..TIRHUTA LETTER HA +114B0..114B2 ; ID_Continue # Mc [3] TIRHUTA VOWEL SIGN AA..TIRHUTA VOWEL SIGN II +114B3..114B8 ; ID_Continue # Mn [6] TIRHUTA VOWEL SIGN U..TIRHUTA VOWEL SIGN VOCALIC LL +114B9 ; ID_Continue # Mc TIRHUTA VOWEL SIGN E +114BA ; ID_Continue # Mn TIRHUTA VOWEL SIGN SHORT E +114BB..114BE ; ID_Continue # Mc [4] TIRHUTA VOWEL SIGN AI..TIRHUTA VOWEL SIGN AU +114BF..114C0 ; ID_Continue # Mn [2] TIRHUTA SIGN CANDRABINDU..TIRHUTA SIGN ANUSVARA +114C1 ; ID_Continue # Mc TIRHUTA SIGN VISARGA +114C2..114C3 ; ID_Continue # Mn [2] TIRHUTA SIGN VIRAMA..TIRHUTA SIGN NUKTA +114C4..114C5 ; ID_Continue # Lo [2] TIRHUTA SIGN AVAGRAHA..TIRHUTA GVANG +114C7 ; ID_Continue # Lo TIRHUTA OM +114D0..114D9 ; ID_Continue # Nd [10] TIRHUTA DIGIT ZERO..TIRHUTA DIGIT NINE +11580..115AE ; ID_Continue # Lo [47] SIDDHAM LETTER A..SIDDHAM LETTER HA +115AF..115B1 ; ID_Continue # Mc [3] SIDDHAM VOWEL SIGN AA..SIDDHAM VOWEL SIGN II +115B2..115B5 ; ID_Continue # Mn [4] SIDDHAM VOWEL SIGN U..SIDDHAM VOWEL SIGN VOCALIC RR +115B8..115BB ; ID_Continue # Mc [4] SIDDHAM VOWEL SIGN E..SIDDHAM VOWEL SIGN AU +115BC..115BD ; ID_Continue # Mn [2] SIDDHAM SIGN CANDRABINDU..SIDDHAM SIGN ANUSVARA +115BE ; ID_Continue # Mc SIDDHAM SIGN VISARGA +115BF..115C0 ; ID_Continue # Mn [2] SIDDHAM SIGN VIRAMA..SIDDHAM SIGN NUKTA +115D8..115DB ; ID_Continue # Lo [4] SIDDHAM LETTER THREE-CIRCLE ALTERNATE I..SIDDHAM LETTER ALTERNATE U +115DC..115DD ; ID_Continue # Mn [2] SIDDHAM VOWEL SIGN ALTERNATE U..SIDDHAM VOWEL SIGN ALTERNATE UU +11600..1162F ; ID_Continue # Lo [48] MODI LETTER A..MODI LETTER LLA +11630..11632 ; ID_Continue # Mc [3] MODI VOWEL SIGN AA..MODI VOWEL SIGN II +11633..1163A ; ID_Continue # Mn [8] MODI VOWEL SIGN U..MODI VOWEL SIGN AI +1163B..1163C ; ID_Continue # Mc [2] MODI VOWEL SIGN O..MODI VOWEL SIGN AU +1163D ; ID_Continue # Mn MODI SIGN ANUSVARA +1163E ; ID_Continue # Mc MODI SIGN VISARGA +1163F..11640 ; ID_Continue # Mn [2] MODI SIGN VIRAMA..MODI SIGN ARDHACANDRA +11644 ; ID_Continue # Lo MODI SIGN HUVA +11650..11659 ; ID_Continue # Nd [10] MODI DIGIT ZERO..MODI DIGIT NINE +11680..116AA ; ID_Continue # Lo [43] TAKRI LETTER A..TAKRI LETTER RRA +116AB ; ID_Continue # Mn TAKRI SIGN ANUSVARA +116AC ; ID_Continue # Mc TAKRI SIGN VISARGA +116AD ; ID_Continue # Mn TAKRI VOWEL SIGN AA +116AE..116AF ; ID_Continue # Mc [2] TAKRI VOWEL SIGN I..TAKRI VOWEL SIGN II +116B0..116B5 ; ID_Continue # Mn [6] TAKRI VOWEL SIGN U..TAKRI VOWEL SIGN AU +116B6 ; ID_Continue # Mc TAKRI SIGN VIRAMA +116B7 ; ID_Continue # Mn TAKRI SIGN NUKTA +116C0..116C9 ; ID_Continue # Nd [10] TAKRI DIGIT ZERO..TAKRI DIGIT NINE +11700..1171A ; ID_Continue # Lo [27] AHOM LETTER KA..AHOM LETTER ALTERNATE BA +1171D..1171F ; ID_Continue # Mn [3] AHOM CONSONANT SIGN MEDIAL LA..AHOM CONSONANT SIGN MEDIAL LIGATING RA +11720..11721 ; ID_Continue # Mc [2] AHOM VOWEL SIGN A..AHOM VOWEL SIGN AA +11722..11725 ; ID_Continue # Mn [4] AHOM VOWEL SIGN I..AHOM VOWEL SIGN UU +11726 ; ID_Continue # Mc AHOM VOWEL SIGN E +11727..1172B ; ID_Continue # Mn [5] AHOM VOWEL SIGN AW..AHOM SIGN KILLER +11730..11739 ; ID_Continue # Nd [10] AHOM DIGIT ZERO..AHOM DIGIT NINE +11800..1182B ; ID_Continue # Lo [44] DOGRA LETTER A..DOGRA LETTER RRA +1182C..1182E ; ID_Continue # Mc [3] DOGRA VOWEL SIGN AA..DOGRA VOWEL SIGN II +1182F..11837 ; ID_Continue # Mn [9] DOGRA VOWEL SIGN U..DOGRA SIGN ANUSVARA +11838 ; ID_Continue # Mc DOGRA SIGN VISARGA +11839..1183A ; ID_Continue # Mn [2] DOGRA SIGN VIRAMA..DOGRA SIGN NUKTA +118A0..118DF ; ID_Continue # L& [64] WARANG CITI CAPITAL LETTER NGAA..WARANG CITI SMALL LETTER VIYO +118E0..118E9 ; ID_Continue # Nd [10] WARANG CITI DIGIT ZERO..WARANG CITI DIGIT NINE +118FF ; ID_Continue # Lo WARANG CITI OM +11A00 ; ID_Continue # Lo ZANABAZAR SQUARE LETTER A +11A01..11A0A ; ID_Continue # Mn [10] ZANABAZAR SQUARE VOWEL SIGN I..ZANABAZAR SQUARE VOWEL LENGTH MARK +11A0B..11A32 ; ID_Continue # Lo [40] ZANABAZAR SQUARE LETTER KA..ZANABAZAR SQUARE LETTER KSSA +11A33..11A38 ; ID_Continue # Mn [6] ZANABAZAR SQUARE FINAL CONSONANT MARK..ZANABAZAR SQUARE SIGN ANUSVARA +11A39 ; ID_Continue # Mc ZANABAZAR SQUARE SIGN VISARGA +11A3A ; ID_Continue # Lo ZANABAZAR SQUARE CLUSTER-INITIAL LETTER RA +11A3B..11A3E ; ID_Continue # Mn [4] ZANABAZAR SQUARE CLUSTER-FINAL LETTER YA..ZANABAZAR SQUARE CLUSTER-FINAL LETTER VA +11A47 ; ID_Continue # Mn ZANABAZAR SQUARE SUBJOINER +11A50 ; ID_Continue # Lo SOYOMBO LETTER A +11A51..11A56 ; ID_Continue # Mn [6] SOYOMBO VOWEL SIGN I..SOYOMBO VOWEL SIGN OE +11A57..11A58 ; ID_Continue # Mc [2] SOYOMBO VOWEL SIGN AI..SOYOMBO VOWEL SIGN AU +11A59..11A5B ; ID_Continue # Mn [3] SOYOMBO VOWEL SIGN VOCALIC R..SOYOMBO VOWEL LENGTH MARK +11A5C..11A83 ; ID_Continue # Lo [40] SOYOMBO LETTER KA..SOYOMBO LETTER KSSA +11A86..11A89 ; ID_Continue # Lo [4] SOYOMBO CLUSTER-INITIAL LETTER RA..SOYOMBO CLUSTER-INITIAL LETTER SA +11A8A..11A96 ; ID_Continue # Mn [13] SOYOMBO FINAL CONSONANT SIGN G..SOYOMBO SIGN ANUSVARA +11A97 ; ID_Continue # Mc SOYOMBO SIGN VISARGA +11A98..11A99 ; ID_Continue # Mn [2] SOYOMBO GEMINATION MARK..SOYOMBO SUBJOINER +11A9D ; ID_Continue # Lo SOYOMBO MARK PLUTA +11AC0..11AF8 ; ID_Continue # Lo [57] PAU CIN HAU LETTER PA..PAU CIN HAU GLOTTAL STOP FINAL +11C00..11C08 ; ID_Continue # Lo [9] BHAIKSUKI LETTER A..BHAIKSUKI LETTER VOCALIC L +11C0A..11C2E ; ID_Continue # Lo [37] BHAIKSUKI LETTER E..BHAIKSUKI LETTER HA +11C2F ; ID_Continue # Mc BHAIKSUKI VOWEL SIGN AA +11C30..11C36 ; ID_Continue # Mn [7] BHAIKSUKI VOWEL SIGN I..BHAIKSUKI VOWEL SIGN VOCALIC L +11C38..11C3D ; ID_Continue # Mn [6] BHAIKSUKI VOWEL SIGN E..BHAIKSUKI SIGN ANUSVARA +11C3E ; ID_Continue # Mc BHAIKSUKI SIGN VISARGA +11C3F ; ID_Continue # Mn BHAIKSUKI SIGN VIRAMA +11C40 ; ID_Continue # Lo BHAIKSUKI SIGN AVAGRAHA +11C50..11C59 ; ID_Continue # Nd [10] BHAIKSUKI DIGIT ZERO..BHAIKSUKI DIGIT NINE +11C72..11C8F ; ID_Continue # Lo [30] MARCHEN LETTER KA..MARCHEN LETTER A +11C92..11CA7 ; ID_Continue # Mn [22] MARCHEN SUBJOINED LETTER KA..MARCHEN SUBJOINED LETTER ZA +11CA9 ; ID_Continue # Mc MARCHEN SUBJOINED LETTER YA +11CAA..11CB0 ; ID_Continue # Mn [7] MARCHEN SUBJOINED LETTER RA..MARCHEN VOWEL SIGN AA +11CB1 ; ID_Continue # Mc MARCHEN VOWEL SIGN I +11CB2..11CB3 ; ID_Continue # Mn [2] MARCHEN VOWEL SIGN U..MARCHEN VOWEL SIGN E +11CB4 ; ID_Continue # Mc MARCHEN VOWEL SIGN O +11CB5..11CB6 ; ID_Continue # Mn [2] MARCHEN SIGN ANUSVARA..MARCHEN SIGN CANDRABINDU +11D00..11D06 ; ID_Continue # Lo [7] MASARAM GONDI LETTER A..MASARAM GONDI LETTER E +11D08..11D09 ; ID_Continue # Lo [2] MASARAM GONDI LETTER AI..MASARAM GONDI LETTER O +11D0B..11D30 ; ID_Continue # Lo [38] MASARAM GONDI LETTER AU..MASARAM GONDI LETTER TRA +11D31..11D36 ; ID_Continue # Mn [6] MASARAM GONDI VOWEL SIGN AA..MASARAM GONDI VOWEL SIGN VOCALIC R +11D3A ; ID_Continue # Mn MASARAM GONDI VOWEL SIGN E +11D3C..11D3D ; ID_Continue # Mn [2] MASARAM GONDI VOWEL SIGN AI..MASARAM GONDI VOWEL SIGN O +11D3F..11D45 ; ID_Continue # Mn [7] MASARAM GONDI VOWEL SIGN AU..MASARAM GONDI VIRAMA +11D46 ; ID_Continue # Lo MASARAM GONDI REPHA +11D47 ; ID_Continue # Mn MASARAM GONDI RA-KARA +11D50..11D59 ; ID_Continue # Nd [10] MASARAM GONDI DIGIT ZERO..MASARAM GONDI DIGIT NINE +11D60..11D65 ; ID_Continue # Lo [6] GUNJALA GONDI LETTER A..GUNJALA GONDI LETTER UU +11D67..11D68 ; ID_Continue # Lo [2] GUNJALA GONDI LETTER EE..GUNJALA GONDI LETTER AI +11D6A..11D89 ; ID_Continue # Lo [32] GUNJALA GONDI LETTER OO..GUNJALA GONDI LETTER SA +11D8A..11D8E ; ID_Continue # Mc [5] GUNJALA GONDI VOWEL SIGN AA..GUNJALA GONDI VOWEL SIGN UU +11D90..11D91 ; ID_Continue # Mn [2] GUNJALA GONDI VOWEL SIGN EE..GUNJALA GONDI VOWEL SIGN AI +11D93..11D94 ; ID_Continue # Mc [2] GUNJALA GONDI VOWEL SIGN OO..GUNJALA GONDI VOWEL SIGN AU +11D95 ; ID_Continue # Mn GUNJALA GONDI SIGN ANUSVARA +11D96 ; ID_Continue # Mc GUNJALA GONDI SIGN VISARGA +11D97 ; ID_Continue # Mn GUNJALA GONDI VIRAMA +11D98 ; ID_Continue # Lo GUNJALA GONDI OM +11DA0..11DA9 ; ID_Continue # Nd [10] GUNJALA GONDI DIGIT ZERO..GUNJALA GONDI DIGIT NINE +11EE0..11EF2 ; ID_Continue # Lo [19] MAKASAR LETTER KA..MAKASAR ANGKA +11EF3..11EF4 ; ID_Continue # Mn [2] MAKASAR VOWEL SIGN I..MAKASAR VOWEL SIGN U +11EF5..11EF6 ; ID_Continue # Mc [2] MAKASAR VOWEL SIGN E..MAKASAR VOWEL SIGN O +12000..12399 ; ID_Continue # Lo [922] CUNEIFORM SIGN A..CUNEIFORM SIGN U U +12400..1246E ; ID_Continue # Nl [111] CUNEIFORM NUMERIC SIGN TWO ASH..CUNEIFORM NUMERIC SIGN NINE U VARIANT FORM +12480..12543 ; ID_Continue # Lo [196] CUNEIFORM SIGN AB TIMES NUN TENU..CUNEIFORM SIGN ZU5 TIMES THREE DISH TENU +13000..1342E ; ID_Continue # Lo [1071] EGYPTIAN HIEROGLYPH A001..EGYPTIAN HIEROGLYPH AA032 +14400..14646 ; ID_Continue # Lo [583] ANATOLIAN HIEROGLYPH A001..ANATOLIAN HIEROGLYPH A530 +16800..16A38 ; ID_Continue # Lo [569] BAMUM LETTER PHASE-A NGKUE MFON..BAMUM LETTER PHASE-F VUEQ +16A40..16A5E ; ID_Continue # Lo [31] MRO LETTER TA..MRO LETTER TEK +16A60..16A69 ; ID_Continue # Nd [10] MRO DIGIT ZERO..MRO DIGIT NINE +16AD0..16AED ; ID_Continue # Lo [30] BASSA VAH LETTER ENNI..BASSA VAH LETTER I +16AF0..16AF4 ; ID_Continue # Mn [5] BASSA VAH COMBINING HIGH TONE..BASSA VAH COMBINING HIGH-LOW TONE +16B00..16B2F ; ID_Continue # Lo [48] PAHAWH HMONG VOWEL KEEB..PAHAWH HMONG CONSONANT CAU +16B30..16B36 ; ID_Continue # Mn [7] PAHAWH HMONG MARK CIM TUB..PAHAWH HMONG MARK CIM TAUM +16B40..16B43 ; ID_Continue # Lm [4] PAHAWH HMONG SIGN VOS SEEV..PAHAWH HMONG SIGN IB YAM +16B50..16B59 ; ID_Continue # Nd [10] PAHAWH HMONG DIGIT ZERO..PAHAWH HMONG DIGIT NINE +16B63..16B77 ; ID_Continue # Lo [21] PAHAWH HMONG SIGN VOS LUB..PAHAWH HMONG SIGN CIM NRES TOS +16B7D..16B8F ; ID_Continue # Lo [19] PAHAWH HMONG CLAN SIGN TSHEEJ..PAHAWH HMONG CLAN SIGN VWJ +16E40..16E7F ; ID_Continue # L& [64] MEDEFAIDRIN CAPITAL LETTER M..MEDEFAIDRIN SMALL LETTER Y +16F00..16F44 ; ID_Continue # Lo [69] MIAO LETTER PA..MIAO LETTER HHA +16F50 ; ID_Continue # Lo MIAO LETTER NASALIZATION +16F51..16F7E ; ID_Continue # Mc [46] MIAO SIGN ASPIRATION..MIAO VOWEL SIGN NG +16F8F..16F92 ; ID_Continue # Mn [4] MIAO TONE RIGHT..MIAO TONE BELOW +16F93..16F9F ; ID_Continue # Lm [13] MIAO LETTER TONE-2..MIAO LETTER REFORMED TONE-8 +16FE0..16FE1 ; ID_Continue # Lm [2] TANGUT ITERATION MARK..NUSHU ITERATION MARK +17000..187F1 ; ID_Continue # Lo [6130] TANGUT IDEOGRAPH-17000..TANGUT IDEOGRAPH-187F1 +18800..18AF2 ; ID_Continue # Lo [755] TANGUT COMPONENT-001..TANGUT COMPONENT-755 +1B000..1B11E ; ID_Continue # Lo [287] KATAKANA LETTER ARCHAIC E..HENTAIGANA LETTER N-MU-MO-2 +1B170..1B2FB ; ID_Continue # Lo [396] NUSHU CHARACTER-1B170..NUSHU CHARACTER-1B2FB +1BC00..1BC6A ; ID_Continue # Lo [107] DUPLOYAN LETTER H..DUPLOYAN LETTER VOCALIC M +1BC70..1BC7C ; ID_Continue # Lo [13] DUPLOYAN AFFIX LEFT HORIZONTAL SECANT..DUPLOYAN AFFIX ATTACHED TANGENT HOOK +1BC80..1BC88 ; ID_Continue # Lo [9] DUPLOYAN AFFIX HIGH ACUTE..DUPLOYAN AFFIX HIGH VERTICAL +1BC90..1BC99 ; ID_Continue # Lo [10] DUPLOYAN AFFIX LOW ACUTE..DUPLOYAN AFFIX LOW ARROW +1BC9D..1BC9E ; ID_Continue # Mn [2] DUPLOYAN THICK LETTER SELECTOR..DUPLOYAN DOUBLE MARK +1D165..1D166 ; ID_Continue # Mc [2] MUSICAL SYMBOL COMBINING STEM..MUSICAL SYMBOL COMBINING SPRECHGESANG STEM +1D167..1D169 ; ID_Continue # Mn [3] MUSICAL SYMBOL COMBINING TREMOLO-1..MUSICAL SYMBOL COMBINING TREMOLO-3 +1D16D..1D172 ; ID_Continue # Mc [6] MUSICAL SYMBOL COMBINING AUGMENTATION DOT..MUSICAL SYMBOL COMBINING FLAG-5 +1D17B..1D182 ; ID_Continue # Mn [8] MUSICAL SYMBOL COMBINING ACCENT..MUSICAL SYMBOL COMBINING LOURE +1D185..1D18B ; ID_Continue # Mn [7] MUSICAL SYMBOL COMBINING DOIT..MUSICAL SYMBOL COMBINING TRIPLE TONGUE +1D1AA..1D1AD ; ID_Continue # Mn [4] MUSICAL SYMBOL COMBINING DOWN BOW..MUSICAL SYMBOL COMBINING SNAP PIZZICATO +1D242..1D244 ; ID_Continue # Mn [3] COMBINING GREEK MUSICAL TRISEME..COMBINING GREEK MUSICAL PENTASEME +1D400..1D454 ; ID_Continue # L& [85] MATHEMATICAL BOLD CAPITAL A..MATHEMATICAL ITALIC SMALL G +1D456..1D49C ; ID_Continue # L& [71] MATHEMATICAL ITALIC SMALL I..MATHEMATICAL SCRIPT CAPITAL A +1D49E..1D49F ; ID_Continue # L& [2] MATHEMATICAL SCRIPT CAPITAL C..MATHEMATICAL SCRIPT CAPITAL D +1D4A2 ; ID_Continue # L& MATHEMATICAL SCRIPT CAPITAL G +1D4A5..1D4A6 ; ID_Continue # L& [2] MATHEMATICAL SCRIPT CAPITAL J..MATHEMATICAL SCRIPT CAPITAL K +1D4A9..1D4AC ; ID_Continue # L& [4] MATHEMATICAL SCRIPT CAPITAL N..MATHEMATICAL SCRIPT CAPITAL Q +1D4AE..1D4B9 ; ID_Continue # L& [12] MATHEMATICAL SCRIPT CAPITAL S..MATHEMATICAL SCRIPT SMALL D +1D4BB ; ID_Continue # L& MATHEMATICAL SCRIPT SMALL F +1D4BD..1D4C3 ; ID_Continue # L& [7] MATHEMATICAL SCRIPT SMALL H..MATHEMATICAL SCRIPT SMALL N +1D4C5..1D505 ; ID_Continue # L& [65] MATHEMATICAL SCRIPT SMALL P..MATHEMATICAL FRAKTUR CAPITAL B +1D507..1D50A ; ID_Continue # L& [4] MATHEMATICAL FRAKTUR CAPITAL D..MATHEMATICAL FRAKTUR CAPITAL G +1D50D..1D514 ; ID_Continue # L& [8] MATHEMATICAL FRAKTUR CAPITAL J..MATHEMATICAL FRAKTUR CAPITAL Q +1D516..1D51C ; ID_Continue # L& [7] MATHEMATICAL FRAKTUR CAPITAL S..MATHEMATICAL FRAKTUR CAPITAL Y +1D51E..1D539 ; ID_Continue # L& [28] MATHEMATICAL FRAKTUR SMALL A..MATHEMATICAL DOUBLE-STRUCK CAPITAL B +1D53B..1D53E ; ID_Continue # L& [4] MATHEMATICAL DOUBLE-STRUCK CAPITAL D..MATHEMATICAL DOUBLE-STRUCK CAPITAL G +1D540..1D544 ; ID_Continue # L& [5] MATHEMATICAL DOUBLE-STRUCK CAPITAL I..MATHEMATICAL DOUBLE-STRUCK CAPITAL M +1D546 ; ID_Continue # L& MATHEMATICAL DOUBLE-STRUCK CAPITAL O +1D54A..1D550 ; ID_Continue # L& [7] MATHEMATICAL DOUBLE-STRUCK CAPITAL S..MATHEMATICAL DOUBLE-STRUCK CAPITAL Y +1D552..1D6A5 ; ID_Continue # L& [340] MATHEMATICAL DOUBLE-STRUCK SMALL A..MATHEMATICAL ITALIC SMALL DOTLESS J +1D6A8..1D6C0 ; ID_Continue # L& [25] MATHEMATICAL BOLD CAPITAL ALPHA..MATHEMATICAL BOLD CAPITAL OMEGA +1D6C2..1D6DA ; ID_Continue # L& [25] MATHEMATICAL BOLD SMALL ALPHA..MATHEMATICAL BOLD SMALL OMEGA +1D6DC..1D6FA ; ID_Continue # L& [31] MATHEMATICAL BOLD EPSILON SYMBOL..MATHEMATICAL ITALIC CAPITAL OMEGA +1D6FC..1D714 ; ID_Continue # L& [25] MATHEMATICAL ITALIC SMALL ALPHA..MATHEMATICAL ITALIC SMALL OMEGA +1D716..1D734 ; ID_Continue # L& [31] MATHEMATICAL ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD ITALIC CAPITAL OMEGA +1D736..1D74E ; ID_Continue # L& [25] MATHEMATICAL BOLD ITALIC SMALL ALPHA..MATHEMATICAL BOLD ITALIC SMALL OMEGA +1D750..1D76E ; ID_Continue # L& [31] MATHEMATICAL BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA +1D770..1D788 ; ID_Continue # L& [25] MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA +1D78A..1D7A8 ; ID_Continue # L& [31] MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA +1D7AA..1D7C2 ; ID_Continue # L& [25] MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA +1D7C4..1D7CB ; ID_Continue # L& [8] MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD SMALL DIGAMMA +1D7CE..1D7FF ; ID_Continue # Nd [50] MATHEMATICAL BOLD DIGIT ZERO..MATHEMATICAL MONOSPACE DIGIT NINE +1DA00..1DA36 ; ID_Continue # Mn [55] SIGNWRITING HEAD RIM..SIGNWRITING AIR SUCKING IN +1DA3B..1DA6C ; ID_Continue # Mn [50] SIGNWRITING MOUTH CLOSED NEUTRAL..SIGNWRITING EXCITEMENT +1DA75 ; ID_Continue # Mn SIGNWRITING UPPER BODY TILTING FROM HIP JOINTS +1DA84 ; ID_Continue # Mn SIGNWRITING LOCATION HEAD NECK +1DA9B..1DA9F ; ID_Continue # Mn [5] SIGNWRITING FILL MODIFIER-2..SIGNWRITING FILL MODIFIER-6 +1DAA1..1DAAF ; ID_Continue # Mn [15] SIGNWRITING ROTATION MODIFIER-2..SIGNWRITING ROTATION MODIFIER-16 +1E000..1E006 ; ID_Continue # Mn [7] COMBINING GLAGOLITIC LETTER AZU..COMBINING GLAGOLITIC LETTER ZHIVETE +1E008..1E018 ; ID_Continue # Mn [17] COMBINING GLAGOLITIC LETTER ZEMLJA..COMBINING GLAGOLITIC LETTER HERU +1E01B..1E021 ; ID_Continue # Mn [7] COMBINING GLAGOLITIC LETTER SHTA..COMBINING GLAGOLITIC LETTER YATI +1E023..1E024 ; ID_Continue # Mn [2] COMBINING GLAGOLITIC LETTER YU..COMBINING GLAGOLITIC LETTER SMALL YUS +1E026..1E02A ; ID_Continue # Mn [5] COMBINING GLAGOLITIC LETTER YO..COMBINING GLAGOLITIC LETTER FITA +1E800..1E8C4 ; ID_Continue # Lo [197] MENDE KIKAKUI SYLLABLE M001 KI..MENDE KIKAKUI SYLLABLE M060 NYON +1E8D0..1E8D6 ; ID_Continue # Mn [7] MENDE KIKAKUI COMBINING NUMBER TEENS..MENDE KIKAKUI COMBINING NUMBER MILLIONS +1E900..1E943 ; ID_Continue # L& [68] ADLAM CAPITAL LETTER ALIF..ADLAM SMALL LETTER SHA +1E944..1E94A ; ID_Continue # Mn [7] ADLAM ALIF LENGTHENER..ADLAM NUKTA +1E950..1E959 ; ID_Continue # Nd [10] ADLAM DIGIT ZERO..ADLAM DIGIT NINE +1EE00..1EE03 ; ID_Continue # Lo [4] ARABIC MATHEMATICAL ALEF..ARABIC MATHEMATICAL DAL +1EE05..1EE1F ; ID_Continue # Lo [27] ARABIC MATHEMATICAL WAW..ARABIC MATHEMATICAL DOTLESS QAF +1EE21..1EE22 ; ID_Continue # Lo [2] ARABIC MATHEMATICAL INITIAL BEH..ARABIC MATHEMATICAL INITIAL JEEM +1EE24 ; ID_Continue # Lo ARABIC MATHEMATICAL INITIAL HEH +1EE27 ; ID_Continue # Lo ARABIC MATHEMATICAL INITIAL HAH +1EE29..1EE32 ; ID_Continue # Lo [10] ARABIC MATHEMATICAL INITIAL YEH..ARABIC MATHEMATICAL INITIAL QAF +1EE34..1EE37 ; ID_Continue # Lo [4] ARABIC MATHEMATICAL INITIAL SHEEN..ARABIC MATHEMATICAL INITIAL KHAH +1EE39 ; ID_Continue # Lo ARABIC MATHEMATICAL INITIAL DAD +1EE3B ; ID_Continue # Lo ARABIC MATHEMATICAL INITIAL GHAIN +1EE42 ; ID_Continue # Lo ARABIC MATHEMATICAL TAILED JEEM +1EE47 ; ID_Continue # Lo ARABIC MATHEMATICAL TAILED HAH +1EE49 ; ID_Continue # Lo ARABIC MATHEMATICAL TAILED YEH +1EE4B ; ID_Continue # Lo ARABIC MATHEMATICAL TAILED LAM +1EE4D..1EE4F ; ID_Continue # Lo [3] ARABIC MATHEMATICAL TAILED NOON..ARABIC MATHEMATICAL TAILED AIN +1EE51..1EE52 ; ID_Continue # Lo [2] ARABIC MATHEMATICAL TAILED SAD..ARABIC MATHEMATICAL TAILED QAF +1EE54 ; ID_Continue # Lo ARABIC MATHEMATICAL TAILED SHEEN +1EE57 ; ID_Continue # Lo ARABIC MATHEMATICAL TAILED KHAH +1EE59 ; ID_Continue # Lo ARABIC MATHEMATICAL TAILED DAD +1EE5B ; ID_Continue # Lo ARABIC MATHEMATICAL TAILED GHAIN +1EE5D ; ID_Continue # Lo ARABIC MATHEMATICAL TAILED DOTLESS NOON +1EE5F ; ID_Continue # Lo ARABIC MATHEMATICAL TAILED DOTLESS QAF +1EE61..1EE62 ; ID_Continue # Lo [2] ARABIC MATHEMATICAL STRETCHED BEH..ARABIC MATHEMATICAL STRETCHED JEEM +1EE64 ; ID_Continue # Lo ARABIC MATHEMATICAL STRETCHED HEH +1EE67..1EE6A ; ID_Continue # Lo [4] ARABIC MATHEMATICAL STRETCHED HAH..ARABIC MATHEMATICAL STRETCHED KAF +1EE6C..1EE72 ; ID_Continue # Lo [7] ARABIC MATHEMATICAL STRETCHED MEEM..ARABIC MATHEMATICAL STRETCHED QAF +1EE74..1EE77 ; ID_Continue # Lo [4] ARABIC MATHEMATICAL STRETCHED SHEEN..ARABIC MATHEMATICAL STRETCHED KHAH +1EE79..1EE7C ; ID_Continue # Lo [4] ARABIC MATHEMATICAL STRETCHED DAD..ARABIC MATHEMATICAL STRETCHED DOTLESS BEH +1EE7E ; ID_Continue # Lo ARABIC MATHEMATICAL STRETCHED DOTLESS FEH +1EE80..1EE89 ; ID_Continue # Lo [10] ARABIC MATHEMATICAL LOOPED ALEF..ARABIC MATHEMATICAL LOOPED YEH +1EE8B..1EE9B ; ID_Continue # Lo [17] ARABIC MATHEMATICAL LOOPED LAM..ARABIC MATHEMATICAL LOOPED GHAIN +1EEA1..1EEA3 ; ID_Continue # Lo [3] ARABIC MATHEMATICAL DOUBLE-STRUCK BEH..ARABIC MATHEMATICAL DOUBLE-STRUCK DAL +1EEA5..1EEA9 ; ID_Continue # Lo [5] ARABIC MATHEMATICAL DOUBLE-STRUCK WAW..ARABIC MATHEMATICAL DOUBLE-STRUCK YEH +1EEAB..1EEBB ; ID_Continue # Lo [17] ARABIC MATHEMATICAL DOUBLE-STRUCK LAM..ARABIC MATHEMATICAL DOUBLE-STRUCK GHAIN +20000..2A6D6 ; ID_Continue # Lo [42711] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6D6 +2A700..2B734 ; ID_Continue # Lo [4149] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B734 +2B740..2B81D ; ID_Continue # Lo [222] CJK UNIFIED IDEOGRAPH-2B740..CJK UNIFIED IDEOGRAPH-2B81D +2B820..2CEA1 ; ID_Continue # Lo [5762] CJK UNIFIED IDEOGRAPH-2B820..CJK UNIFIED IDEOGRAPH-2CEA1 +2CEB0..2EBE0 ; ID_Continue # Lo [7473] CJK UNIFIED IDEOGRAPH-2CEB0..CJK UNIFIED IDEOGRAPH-2EBE0 +2F800..2FA1D ; ID_Continue # Lo [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D +E0100..E01EF ; ID_Continue # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256 + +# Total code points: 128510 + +# ================================================ + +# Derived Property: XID_Start +# ID_Start modified for closure under NFKx +# Modified as described in UAX #15 +# NOTE: Does NOT remove the non-NFKx characters. +# Merely ensures that if isIdentifer(string) then isIdentifier(NFKx(string)) +# NOTE: See UAX #31 for more information + +0041..005A ; XID_Start # L& [26] LATIN CAPITAL LETTER A..LATIN CAPITAL LETTER Z +0061..007A ; XID_Start # L& [26] LATIN SMALL LETTER A..LATIN SMALL LETTER Z +00AA ; XID_Start # Lo FEMININE ORDINAL INDICATOR +00B5 ; XID_Start # L& MICRO SIGN +00BA ; XID_Start # Lo MASCULINE ORDINAL INDICATOR +00C0..00D6 ; XID_Start # L& [23] LATIN CAPITAL LETTER A WITH GRAVE..LATIN CAPITAL LETTER O WITH DIAERESIS +00D8..00F6 ; XID_Start # L& [31] LATIN CAPITAL LETTER O WITH STROKE..LATIN SMALL LETTER O WITH DIAERESIS +00F8..01BA ; XID_Start # L& [195] LATIN SMALL LETTER O WITH STROKE..LATIN SMALL LETTER EZH WITH TAIL +01BB ; XID_Start # Lo LATIN LETTER TWO WITH STROKE +01BC..01BF ; XID_Start # L& [4] LATIN CAPITAL LETTER TONE FIVE..LATIN LETTER WYNN +01C0..01C3 ; XID_Start # Lo [4] LATIN LETTER DENTAL CLICK..LATIN LETTER RETROFLEX CLICK +01C4..0293 ; XID_Start # L& [208] LATIN CAPITAL LETTER DZ WITH CARON..LATIN SMALL LETTER EZH WITH CURL +0294 ; XID_Start # Lo LATIN LETTER GLOTTAL STOP +0295..02AF ; XID_Start # L& [27] LATIN LETTER PHARYNGEAL VOICED FRICATIVE..LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL +02B0..02C1 ; XID_Start # Lm [18] MODIFIER LETTER SMALL H..MODIFIER LETTER REVERSED GLOTTAL STOP +02C6..02D1 ; XID_Start # Lm [12] MODIFIER LETTER CIRCUMFLEX ACCENT..MODIFIER LETTER HALF TRIANGULAR COLON +02E0..02E4 ; XID_Start # Lm [5] MODIFIER LETTER SMALL GAMMA..MODIFIER LETTER SMALL REVERSED GLOTTAL STOP +02EC ; XID_Start # Lm MODIFIER LETTER VOICING +02EE ; XID_Start # Lm MODIFIER LETTER DOUBLE APOSTROPHE +0370..0373 ; XID_Start # L& [4] GREEK CAPITAL LETTER HETA..GREEK SMALL LETTER ARCHAIC SAMPI +0374 ; XID_Start # Lm GREEK NUMERAL SIGN +0376..0377 ; XID_Start # L& [2] GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA..GREEK SMALL LETTER PAMPHYLIAN DIGAMMA +037B..037D ; XID_Start # L& [3] GREEK SMALL REVERSED LUNATE SIGMA SYMBOL..GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL +037F ; XID_Start # L& GREEK CAPITAL LETTER YOT +0386 ; XID_Start # L& GREEK CAPITAL LETTER ALPHA WITH TONOS +0388..038A ; XID_Start # L& [3] GREEK CAPITAL LETTER EPSILON WITH TONOS..GREEK CAPITAL LETTER IOTA WITH TONOS +038C ; XID_Start # L& GREEK CAPITAL LETTER OMICRON WITH TONOS +038E..03A1 ; XID_Start # L& [20] GREEK CAPITAL LETTER UPSILON WITH TONOS..GREEK CAPITAL LETTER RHO +03A3..03F5 ; XID_Start # L& [83] GREEK CAPITAL LETTER SIGMA..GREEK LUNATE EPSILON SYMBOL +03F7..0481 ; XID_Start # L& [139] GREEK CAPITAL LETTER SHO..CYRILLIC SMALL LETTER KOPPA +048A..052F ; XID_Start # L& [166] CYRILLIC CAPITAL LETTER SHORT I WITH TAIL..CYRILLIC SMALL LETTER EL WITH DESCENDER +0531..0556 ; XID_Start # L& [38] ARMENIAN CAPITAL LETTER AYB..ARMENIAN CAPITAL LETTER FEH +0559 ; XID_Start # Lm ARMENIAN MODIFIER LETTER LEFT HALF RING +0560..0588 ; XID_Start # L& [41] ARMENIAN SMALL LETTER TURNED AYB..ARMENIAN SMALL LETTER YI WITH STROKE +05D0..05EA ; XID_Start # Lo [27] HEBREW LETTER ALEF..HEBREW LETTER TAV +05EF..05F2 ; XID_Start # Lo [4] HEBREW YOD TRIANGLE..HEBREW LIGATURE YIDDISH DOUBLE YOD +0620..063F ; XID_Start # Lo [32] ARABIC LETTER KASHMIRI YEH..ARABIC LETTER FARSI YEH WITH THREE DOTS ABOVE +0640 ; XID_Start # Lm ARABIC TATWEEL +0641..064A ; XID_Start # Lo [10] ARABIC LETTER FEH..ARABIC LETTER YEH +066E..066F ; XID_Start # Lo [2] ARABIC LETTER DOTLESS BEH..ARABIC LETTER DOTLESS QAF +0671..06D3 ; XID_Start # Lo [99] ARABIC LETTER ALEF WASLA..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE +06D5 ; XID_Start # Lo ARABIC LETTER AE +06E5..06E6 ; XID_Start # Lm [2] ARABIC SMALL WAW..ARABIC SMALL YEH +06EE..06EF ; XID_Start # Lo [2] ARABIC LETTER DAL WITH INVERTED V..ARABIC LETTER REH WITH INVERTED V +06FA..06FC ; XID_Start # Lo [3] ARABIC LETTER SHEEN WITH DOT BELOW..ARABIC LETTER GHAIN WITH DOT BELOW +06FF ; XID_Start # Lo ARABIC LETTER HEH WITH INVERTED V +0710 ; XID_Start # Lo SYRIAC LETTER ALAPH +0712..072F ; XID_Start # Lo [30] SYRIAC LETTER BETH..SYRIAC LETTER PERSIAN DHALATH +074D..07A5 ; XID_Start # Lo [89] SYRIAC LETTER SOGDIAN ZHAIN..THAANA LETTER WAAVU +07B1 ; XID_Start # Lo THAANA LETTER NAA +07CA..07EA ; XID_Start # Lo [33] NKO LETTER A..NKO LETTER JONA RA +07F4..07F5 ; XID_Start # Lm [2] NKO HIGH TONE APOSTROPHE..NKO LOW TONE APOSTROPHE +07FA ; XID_Start # Lm NKO LAJANYALAN +0800..0815 ; XID_Start # Lo [22] SAMARITAN LETTER ALAF..SAMARITAN LETTER TAAF +081A ; XID_Start # Lm SAMARITAN MODIFIER LETTER EPENTHETIC YUT +0824 ; XID_Start # Lm SAMARITAN MODIFIER LETTER SHORT A +0828 ; XID_Start # Lm SAMARITAN MODIFIER LETTER I +0840..0858 ; XID_Start # Lo [25] MANDAIC LETTER HALQA..MANDAIC LETTER AIN +0860..086A ; XID_Start # Lo [11] SYRIAC LETTER MALAYALAM NGA..SYRIAC LETTER MALAYALAM SSA +08A0..08B4 ; XID_Start # Lo [21] ARABIC LETTER BEH WITH SMALL V BELOW..ARABIC LETTER KAF WITH DOT BELOW +08B6..08BD ; XID_Start # Lo [8] ARABIC LETTER BEH WITH SMALL MEEM ABOVE..ARABIC LETTER AFRICAN NOON +0904..0939 ; XID_Start # Lo [54] DEVANAGARI LETTER SHORT A..DEVANAGARI LETTER HA +093D ; XID_Start # Lo DEVANAGARI SIGN AVAGRAHA +0950 ; XID_Start # Lo DEVANAGARI OM +0958..0961 ; XID_Start # Lo [10] DEVANAGARI LETTER QA..DEVANAGARI LETTER VOCALIC LL +0971 ; XID_Start # Lm DEVANAGARI SIGN HIGH SPACING DOT +0972..0980 ; XID_Start # Lo [15] DEVANAGARI LETTER CANDRA A..BENGALI ANJI +0985..098C ; XID_Start # Lo [8] BENGALI LETTER A..BENGALI LETTER VOCALIC L +098F..0990 ; XID_Start # Lo [2] BENGALI LETTER E..BENGALI LETTER AI +0993..09A8 ; XID_Start # Lo [22] BENGALI LETTER O..BENGALI LETTER NA +09AA..09B0 ; XID_Start # Lo [7] BENGALI LETTER PA..BENGALI LETTER RA +09B2 ; XID_Start # Lo BENGALI LETTER LA +09B6..09B9 ; XID_Start # Lo [4] BENGALI LETTER SHA..BENGALI LETTER HA +09BD ; XID_Start # Lo BENGALI SIGN AVAGRAHA +09CE ; XID_Start # Lo BENGALI LETTER KHANDA TA +09DC..09DD ; XID_Start # Lo [2] BENGALI LETTER RRA..BENGALI LETTER RHA +09DF..09E1 ; XID_Start # Lo [3] BENGALI LETTER YYA..BENGALI LETTER VOCALIC LL +09F0..09F1 ; XID_Start # Lo [2] BENGALI LETTER RA WITH MIDDLE DIAGONAL..BENGALI LETTER RA WITH LOWER DIAGONAL +09FC ; XID_Start # Lo BENGALI LETTER VEDIC ANUSVARA +0A05..0A0A ; XID_Start # Lo [6] GURMUKHI LETTER A..GURMUKHI LETTER UU +0A0F..0A10 ; XID_Start # Lo [2] GURMUKHI LETTER EE..GURMUKHI LETTER AI +0A13..0A28 ; XID_Start # Lo [22] GURMUKHI LETTER OO..GURMUKHI LETTER NA +0A2A..0A30 ; XID_Start # Lo [7] GURMUKHI LETTER PA..GURMUKHI LETTER RA +0A32..0A33 ; XID_Start # Lo [2] GURMUKHI LETTER LA..GURMUKHI LETTER LLA +0A35..0A36 ; XID_Start # Lo [2] GURMUKHI LETTER VA..GURMUKHI LETTER SHA +0A38..0A39 ; XID_Start # Lo [2] GURMUKHI LETTER SA..GURMUKHI LETTER HA +0A59..0A5C ; XID_Start # Lo [4] GURMUKHI LETTER KHHA..GURMUKHI LETTER RRA +0A5E ; XID_Start # Lo GURMUKHI LETTER FA +0A72..0A74 ; XID_Start # Lo [3] GURMUKHI IRI..GURMUKHI EK ONKAR +0A85..0A8D ; XID_Start # Lo [9] GUJARATI LETTER A..GUJARATI VOWEL CANDRA E +0A8F..0A91 ; XID_Start # Lo [3] GUJARATI LETTER E..GUJARATI VOWEL CANDRA O +0A93..0AA8 ; XID_Start # Lo [22] GUJARATI LETTER O..GUJARATI LETTER NA +0AAA..0AB0 ; XID_Start # Lo [7] GUJARATI LETTER PA..GUJARATI LETTER RA +0AB2..0AB3 ; XID_Start # Lo [2] GUJARATI LETTER LA..GUJARATI LETTER LLA +0AB5..0AB9 ; XID_Start # Lo [5] GUJARATI LETTER VA..GUJARATI LETTER HA +0ABD ; XID_Start # Lo GUJARATI SIGN AVAGRAHA +0AD0 ; XID_Start # Lo GUJARATI OM +0AE0..0AE1 ; XID_Start # Lo [2] GUJARATI LETTER VOCALIC RR..GUJARATI LETTER VOCALIC LL +0AF9 ; XID_Start # Lo GUJARATI LETTER ZHA +0B05..0B0C ; XID_Start # Lo [8] ORIYA LETTER A..ORIYA LETTER VOCALIC L +0B0F..0B10 ; XID_Start # Lo [2] ORIYA LETTER E..ORIYA LETTER AI +0B13..0B28 ; XID_Start # Lo [22] ORIYA LETTER O..ORIYA LETTER NA +0B2A..0B30 ; XID_Start # Lo [7] ORIYA LETTER PA..ORIYA LETTER RA +0B32..0B33 ; XID_Start # Lo [2] ORIYA LETTER LA..ORIYA LETTER LLA +0B35..0B39 ; XID_Start # Lo [5] ORIYA LETTER VA..ORIYA LETTER HA +0B3D ; XID_Start # Lo ORIYA SIGN AVAGRAHA +0B5C..0B5D ; XID_Start # Lo [2] ORIYA LETTER RRA..ORIYA LETTER RHA +0B5F..0B61 ; XID_Start # Lo [3] ORIYA LETTER YYA..ORIYA LETTER VOCALIC LL +0B71 ; XID_Start # Lo ORIYA LETTER WA +0B83 ; XID_Start # Lo TAMIL SIGN VISARGA +0B85..0B8A ; XID_Start # Lo [6] TAMIL LETTER A..TAMIL LETTER UU +0B8E..0B90 ; XID_Start # Lo [3] TAMIL LETTER E..TAMIL LETTER AI +0B92..0B95 ; XID_Start # Lo [4] TAMIL LETTER O..TAMIL LETTER KA +0B99..0B9A ; XID_Start # Lo [2] TAMIL LETTER NGA..TAMIL LETTER CA +0B9C ; XID_Start # Lo TAMIL LETTER JA +0B9E..0B9F ; XID_Start # Lo [2] TAMIL LETTER NYA..TAMIL LETTER TTA +0BA3..0BA4 ; XID_Start # Lo [2] TAMIL LETTER NNA..TAMIL LETTER TA +0BA8..0BAA ; XID_Start # Lo [3] TAMIL LETTER NA..TAMIL LETTER PA +0BAE..0BB9 ; XID_Start # Lo [12] TAMIL LETTER MA..TAMIL LETTER HA +0BD0 ; XID_Start # Lo TAMIL OM +0C05..0C0C ; XID_Start # Lo [8] TELUGU LETTER A..TELUGU LETTER VOCALIC L +0C0E..0C10 ; XID_Start # Lo [3] TELUGU LETTER E..TELUGU LETTER AI +0C12..0C28 ; XID_Start # Lo [23] TELUGU LETTER O..TELUGU LETTER NA +0C2A..0C39 ; XID_Start # Lo [16] TELUGU LETTER PA..TELUGU LETTER HA +0C3D ; XID_Start # Lo TELUGU SIGN AVAGRAHA +0C58..0C5A ; XID_Start # Lo [3] TELUGU LETTER TSA..TELUGU LETTER RRRA +0C60..0C61 ; XID_Start # Lo [2] TELUGU LETTER VOCALIC RR..TELUGU LETTER VOCALIC LL +0C80 ; XID_Start # Lo KANNADA SIGN SPACING CANDRABINDU +0C85..0C8C ; XID_Start # Lo [8] KANNADA LETTER A..KANNADA LETTER VOCALIC L +0C8E..0C90 ; XID_Start # Lo [3] KANNADA LETTER E..KANNADA LETTER AI +0C92..0CA8 ; XID_Start # Lo [23] KANNADA LETTER O..KANNADA LETTER NA +0CAA..0CB3 ; XID_Start # Lo [10] KANNADA LETTER PA..KANNADA LETTER LLA +0CB5..0CB9 ; XID_Start # Lo [5] KANNADA LETTER VA..KANNADA LETTER HA +0CBD ; XID_Start # Lo KANNADA SIGN AVAGRAHA +0CDE ; XID_Start # Lo KANNADA LETTER FA +0CE0..0CE1 ; XID_Start # Lo [2] KANNADA LETTER VOCALIC RR..KANNADA LETTER VOCALIC LL +0CF1..0CF2 ; XID_Start # Lo [2] KANNADA SIGN JIHVAMULIYA..KANNADA SIGN UPADHMANIYA +0D05..0D0C ; XID_Start # Lo [8] MALAYALAM LETTER A..MALAYALAM LETTER VOCALIC L +0D0E..0D10 ; XID_Start # Lo [3] MALAYALAM LETTER E..MALAYALAM LETTER AI +0D12..0D3A ; XID_Start # Lo [41] MALAYALAM LETTER O..MALAYALAM LETTER TTTA +0D3D ; XID_Start # Lo MALAYALAM SIGN AVAGRAHA +0D4E ; XID_Start # Lo MALAYALAM LETTER DOT REPH +0D54..0D56 ; XID_Start # Lo [3] MALAYALAM LETTER CHILLU M..MALAYALAM LETTER CHILLU LLL +0D5F..0D61 ; XID_Start # Lo [3] MALAYALAM LETTER ARCHAIC II..MALAYALAM LETTER VOCALIC LL +0D7A..0D7F ; XID_Start # Lo [6] MALAYALAM LETTER CHILLU NN..MALAYALAM LETTER CHILLU K +0D85..0D96 ; XID_Start # Lo [18] SINHALA LETTER AYANNA..SINHALA LETTER AUYANNA +0D9A..0DB1 ; XID_Start # Lo [24] SINHALA LETTER ALPAPRAANA KAYANNA..SINHALA LETTER DANTAJA NAYANNA +0DB3..0DBB ; XID_Start # Lo [9] SINHALA LETTER SANYAKA DAYANNA..SINHALA LETTER RAYANNA +0DBD ; XID_Start # Lo SINHALA LETTER DANTAJA LAYANNA +0DC0..0DC6 ; XID_Start # Lo [7] SINHALA LETTER VAYANNA..SINHALA LETTER FAYANNA +0E01..0E30 ; XID_Start # Lo [48] THAI CHARACTER KO KAI..THAI CHARACTER SARA A +0E32 ; XID_Start # Lo THAI CHARACTER SARA AA +0E40..0E45 ; XID_Start # Lo [6] THAI CHARACTER SARA E..THAI CHARACTER LAKKHANGYAO +0E46 ; XID_Start # Lm THAI CHARACTER MAIYAMOK +0E81..0E82 ; XID_Start # Lo [2] LAO LETTER KO..LAO LETTER KHO SUNG +0E84 ; XID_Start # Lo LAO LETTER KHO TAM +0E87..0E88 ; XID_Start # Lo [2] LAO LETTER NGO..LAO LETTER CO +0E8A ; XID_Start # Lo LAO LETTER SO TAM +0E8D ; XID_Start # Lo LAO LETTER NYO +0E94..0E97 ; XID_Start # Lo [4] LAO LETTER DO..LAO LETTER THO TAM +0E99..0E9F ; XID_Start # Lo [7] LAO LETTER NO..LAO LETTER FO SUNG +0EA1..0EA3 ; XID_Start # Lo [3] LAO LETTER MO..LAO LETTER LO LING +0EA5 ; XID_Start # Lo LAO LETTER LO LOOT +0EA7 ; XID_Start # Lo LAO LETTER WO +0EAA..0EAB ; XID_Start # Lo [2] LAO LETTER SO SUNG..LAO LETTER HO SUNG +0EAD..0EB0 ; XID_Start # Lo [4] LAO LETTER O..LAO VOWEL SIGN A +0EB2 ; XID_Start # Lo LAO VOWEL SIGN AA +0EBD ; XID_Start # Lo LAO SEMIVOWEL SIGN NYO +0EC0..0EC4 ; XID_Start # Lo [5] LAO VOWEL SIGN E..LAO VOWEL SIGN AI +0EC6 ; XID_Start # Lm LAO KO LA +0EDC..0EDF ; XID_Start # Lo [4] LAO HO NO..LAO LETTER KHMU NYO +0F00 ; XID_Start # Lo TIBETAN SYLLABLE OM +0F40..0F47 ; XID_Start # Lo [8] TIBETAN LETTER KA..TIBETAN LETTER JA +0F49..0F6C ; XID_Start # Lo [36] TIBETAN LETTER NYA..TIBETAN LETTER RRA +0F88..0F8C ; XID_Start # Lo [5] TIBETAN SIGN LCE TSA CAN..TIBETAN SIGN INVERTED MCHU CAN +1000..102A ; XID_Start # Lo [43] MYANMAR LETTER KA..MYANMAR LETTER AU +103F ; XID_Start # Lo MYANMAR LETTER GREAT SA +1050..1055 ; XID_Start # Lo [6] MYANMAR LETTER SHA..MYANMAR LETTER VOCALIC LL +105A..105D ; XID_Start # Lo [4] MYANMAR LETTER MON NGA..MYANMAR LETTER MON BBE +1061 ; XID_Start # Lo MYANMAR LETTER SGAW KAREN SHA +1065..1066 ; XID_Start # Lo [2] MYANMAR LETTER WESTERN PWO KAREN THA..MYANMAR LETTER WESTERN PWO KAREN PWA +106E..1070 ; XID_Start # Lo [3] MYANMAR LETTER EASTERN PWO KAREN NNA..MYANMAR LETTER EASTERN PWO KAREN GHWA +1075..1081 ; XID_Start # Lo [13] MYANMAR LETTER SHAN KA..MYANMAR LETTER SHAN HA +108E ; XID_Start # Lo MYANMAR LETTER RUMAI PALAUNG FA +10A0..10C5 ; XID_Start # L& [38] GEORGIAN CAPITAL LETTER AN..GEORGIAN CAPITAL LETTER HOE +10C7 ; XID_Start # L& GEORGIAN CAPITAL LETTER YN +10CD ; XID_Start # L& GEORGIAN CAPITAL LETTER AEN +10D0..10FA ; XID_Start # L& [43] GEORGIAN LETTER AN..GEORGIAN LETTER AIN +10FC ; XID_Start # Lm MODIFIER LETTER GEORGIAN NAR +10FD..10FF ; XID_Start # L& [3] GEORGIAN LETTER AEN..GEORGIAN LETTER LABIAL SIGN +1100..1248 ; XID_Start # Lo [329] HANGUL CHOSEONG KIYEOK..ETHIOPIC SYLLABLE QWA +124A..124D ; XID_Start # Lo [4] ETHIOPIC SYLLABLE QWI..ETHIOPIC SYLLABLE QWE +1250..1256 ; XID_Start # Lo [7] ETHIOPIC SYLLABLE QHA..ETHIOPIC SYLLABLE QHO +1258 ; XID_Start # Lo ETHIOPIC SYLLABLE QHWA +125A..125D ; XID_Start # Lo [4] ETHIOPIC SYLLABLE QHWI..ETHIOPIC SYLLABLE QHWE +1260..1288 ; XID_Start # Lo [41] ETHIOPIC SYLLABLE BA..ETHIOPIC SYLLABLE XWA +128A..128D ; XID_Start # Lo [4] ETHIOPIC SYLLABLE XWI..ETHIOPIC SYLLABLE XWE +1290..12B0 ; XID_Start # Lo [33] ETHIOPIC SYLLABLE NA..ETHIOPIC SYLLABLE KWA +12B2..12B5 ; XID_Start # Lo [4] ETHIOPIC SYLLABLE KWI..ETHIOPIC SYLLABLE KWE +12B8..12BE ; XID_Start # Lo [7] ETHIOPIC SYLLABLE KXA..ETHIOPIC SYLLABLE KXO +12C0 ; XID_Start # Lo ETHIOPIC SYLLABLE KXWA +12C2..12C5 ; XID_Start # Lo [4] ETHIOPIC SYLLABLE KXWI..ETHIOPIC SYLLABLE KXWE +12C8..12D6 ; XID_Start # Lo [15] ETHIOPIC SYLLABLE WA..ETHIOPIC SYLLABLE PHARYNGEAL O +12D8..1310 ; XID_Start # Lo [57] ETHIOPIC SYLLABLE ZA..ETHIOPIC SYLLABLE GWA +1312..1315 ; XID_Start # Lo [4] ETHIOPIC SYLLABLE GWI..ETHIOPIC SYLLABLE GWE +1318..135A ; XID_Start # Lo [67] ETHIOPIC SYLLABLE GGA..ETHIOPIC SYLLABLE FYA +1380..138F ; XID_Start # Lo [16] ETHIOPIC SYLLABLE SEBATBEIT MWA..ETHIOPIC SYLLABLE PWE +13A0..13F5 ; XID_Start # L& [86] CHEROKEE LETTER A..CHEROKEE LETTER MV +13F8..13FD ; XID_Start # L& [6] CHEROKEE SMALL LETTER YE..CHEROKEE SMALL LETTER MV +1401..166C ; XID_Start # Lo [620] CANADIAN SYLLABICS E..CANADIAN SYLLABICS CARRIER TTSA +166F..167F ; XID_Start # Lo [17] CANADIAN SYLLABICS QAI..CANADIAN SYLLABICS BLACKFOOT W +1681..169A ; XID_Start # Lo [26] OGHAM LETTER BEITH..OGHAM LETTER PEITH +16A0..16EA ; XID_Start # Lo [75] RUNIC LETTER FEHU FEOH FE F..RUNIC LETTER X +16EE..16F0 ; XID_Start # Nl [3] RUNIC ARLAUG SYMBOL..RUNIC BELGTHOR SYMBOL +16F1..16F8 ; XID_Start # Lo [8] RUNIC LETTER K..RUNIC LETTER FRANKS CASKET AESC +1700..170C ; XID_Start # Lo [13] TAGALOG LETTER A..TAGALOG LETTER YA +170E..1711 ; XID_Start # Lo [4] TAGALOG LETTER LA..TAGALOG LETTER HA +1720..1731 ; XID_Start # Lo [18] HANUNOO LETTER A..HANUNOO LETTER HA +1740..1751 ; XID_Start # Lo [18] BUHID LETTER A..BUHID LETTER HA +1760..176C ; XID_Start # Lo [13] TAGBANWA LETTER A..TAGBANWA LETTER YA +176E..1770 ; XID_Start # Lo [3] TAGBANWA LETTER LA..TAGBANWA LETTER SA +1780..17B3 ; XID_Start # Lo [52] KHMER LETTER KA..KHMER INDEPENDENT VOWEL QAU +17D7 ; XID_Start # Lm KHMER SIGN LEK TOO +17DC ; XID_Start # Lo KHMER SIGN AVAKRAHASANYA +1820..1842 ; XID_Start # Lo [35] MONGOLIAN LETTER A..MONGOLIAN LETTER CHI +1843 ; XID_Start # Lm MONGOLIAN LETTER TODO LONG VOWEL SIGN +1844..1878 ; XID_Start # Lo [53] MONGOLIAN LETTER TODO E..MONGOLIAN LETTER CHA WITH TWO DOTS +1880..1884 ; XID_Start # Lo [5] MONGOLIAN LETTER ALI GALI ANUSVARA ONE..MONGOLIAN LETTER ALI GALI INVERTED UBADAMA +1885..1886 ; XID_Start # Mn [2] MONGOLIAN LETTER ALI GALI BALUDA..MONGOLIAN LETTER ALI GALI THREE BALUDA +1887..18A8 ; XID_Start # Lo [34] MONGOLIAN LETTER ALI GALI A..MONGOLIAN LETTER MANCHU ALI GALI BHA +18AA ; XID_Start # Lo MONGOLIAN LETTER MANCHU ALI GALI LHA +18B0..18F5 ; XID_Start # Lo [70] CANADIAN SYLLABICS OY..CANADIAN SYLLABICS CARRIER DENTAL S +1900..191E ; XID_Start # Lo [31] LIMBU VOWEL-CARRIER LETTER..LIMBU LETTER TRA +1950..196D ; XID_Start # Lo [30] TAI LE LETTER KA..TAI LE LETTER AI +1970..1974 ; XID_Start # Lo [5] TAI LE LETTER TONE-2..TAI LE LETTER TONE-6 +1980..19AB ; XID_Start # Lo [44] NEW TAI LUE LETTER HIGH QA..NEW TAI LUE LETTER LOW SUA +19B0..19C9 ; XID_Start # Lo [26] NEW TAI LUE VOWEL SIGN VOWEL SHORTENER..NEW TAI LUE TONE MARK-2 +1A00..1A16 ; XID_Start # Lo [23] BUGINESE LETTER KA..BUGINESE LETTER HA +1A20..1A54 ; XID_Start # Lo [53] TAI THAM LETTER HIGH KA..TAI THAM LETTER GREAT SA +1AA7 ; XID_Start # Lm TAI THAM SIGN MAI YAMOK +1B05..1B33 ; XID_Start # Lo [47] BALINESE LETTER AKARA..BALINESE LETTER HA +1B45..1B4B ; XID_Start # Lo [7] BALINESE LETTER KAF SASAK..BALINESE LETTER ASYURA SASAK +1B83..1BA0 ; XID_Start # Lo [30] SUNDANESE LETTER A..SUNDANESE LETTER HA +1BAE..1BAF ; XID_Start # Lo [2] SUNDANESE LETTER KHA..SUNDANESE LETTER SYA +1BBA..1BE5 ; XID_Start # Lo [44] SUNDANESE AVAGRAHA..BATAK LETTER U +1C00..1C23 ; XID_Start # Lo [36] LEPCHA LETTER KA..LEPCHA LETTER A +1C4D..1C4F ; XID_Start # Lo [3] LEPCHA LETTER TTA..LEPCHA LETTER DDA +1C5A..1C77 ; XID_Start # Lo [30] OL CHIKI LETTER LA..OL CHIKI LETTER OH +1C78..1C7D ; XID_Start # Lm [6] OL CHIKI MU TTUDDAG..OL CHIKI AHAD +1C80..1C88 ; XID_Start # L& [9] CYRILLIC SMALL LETTER ROUNDED VE..CYRILLIC SMALL LETTER UNBLENDED UK +1C90..1CBA ; XID_Start # L& [43] GEORGIAN MTAVRULI CAPITAL LETTER AN..GEORGIAN MTAVRULI CAPITAL LETTER AIN +1CBD..1CBF ; XID_Start # L& [3] GEORGIAN MTAVRULI CAPITAL LETTER AEN..GEORGIAN MTAVRULI CAPITAL LETTER LABIAL SIGN +1CE9..1CEC ; XID_Start # Lo [4] VEDIC SIGN ANUSVARA ANTARGOMUKHA..VEDIC SIGN ANUSVARA VAMAGOMUKHA WITH TAIL +1CEE..1CF1 ; XID_Start # Lo [4] VEDIC SIGN HEXIFORM LONG ANUSVARA..VEDIC SIGN ANUSVARA UBHAYATO MUKHA +1CF5..1CF6 ; XID_Start # Lo [2] VEDIC SIGN JIHVAMULIYA..VEDIC SIGN UPADHMANIYA +1D00..1D2B ; XID_Start # L& [44] LATIN LETTER SMALL CAPITAL A..CYRILLIC LETTER SMALL CAPITAL EL +1D2C..1D6A ; XID_Start # Lm [63] MODIFIER LETTER CAPITAL A..GREEK SUBSCRIPT SMALL LETTER CHI +1D6B..1D77 ; XID_Start # L& [13] LATIN SMALL LETTER UE..LATIN SMALL LETTER TURNED G +1D78 ; XID_Start # Lm MODIFIER LETTER CYRILLIC EN +1D79..1D9A ; XID_Start # L& [34] LATIN SMALL LETTER INSULAR G..LATIN SMALL LETTER EZH WITH RETROFLEX HOOK +1D9B..1DBF ; XID_Start # Lm [37] MODIFIER LETTER SMALL TURNED ALPHA..MODIFIER LETTER SMALL THETA +1E00..1F15 ; XID_Start # L& [278] LATIN CAPITAL LETTER A WITH RING BELOW..GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA +1F18..1F1D ; XID_Start # L& [6] GREEK CAPITAL LETTER EPSILON WITH PSILI..GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA +1F20..1F45 ; XID_Start # L& [38] GREEK SMALL LETTER ETA WITH PSILI..GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA +1F48..1F4D ; XID_Start # L& [6] GREEK CAPITAL LETTER OMICRON WITH PSILI..GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA +1F50..1F57 ; XID_Start # L& [8] GREEK SMALL LETTER UPSILON WITH PSILI..GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI +1F59 ; XID_Start # L& GREEK CAPITAL LETTER UPSILON WITH DASIA +1F5B ; XID_Start # L& GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA +1F5D ; XID_Start # L& GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA +1F5F..1F7D ; XID_Start # L& [31] GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI..GREEK SMALL LETTER OMEGA WITH OXIA +1F80..1FB4 ; XID_Start # L& [53] GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI..GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI +1FB6..1FBC ; XID_Start # L& [7] GREEK SMALL LETTER ALPHA WITH PERISPOMENI..GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI +1FBE ; XID_Start # L& GREEK PROSGEGRAMMENI +1FC2..1FC4 ; XID_Start # L& [3] GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI +1FC6..1FCC ; XID_Start # L& [7] GREEK SMALL LETTER ETA WITH PERISPOMENI..GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI +1FD0..1FD3 ; XID_Start # L& [4] GREEK SMALL LETTER IOTA WITH VRACHY..GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA +1FD6..1FDB ; XID_Start # L& [6] GREEK SMALL LETTER IOTA WITH PERISPOMENI..GREEK CAPITAL LETTER IOTA WITH OXIA +1FE0..1FEC ; XID_Start # L& [13] GREEK SMALL LETTER UPSILON WITH VRACHY..GREEK CAPITAL LETTER RHO WITH DASIA +1FF2..1FF4 ; XID_Start # L& [3] GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI +1FF6..1FFC ; XID_Start # L& [7] GREEK SMALL LETTER OMEGA WITH PERISPOMENI..GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI +2071 ; XID_Start # Lm SUPERSCRIPT LATIN SMALL LETTER I +207F ; XID_Start # Lm SUPERSCRIPT LATIN SMALL LETTER N +2090..209C ; XID_Start # Lm [13] LATIN SUBSCRIPT SMALL LETTER A..LATIN SUBSCRIPT SMALL LETTER T +2102 ; XID_Start # L& DOUBLE-STRUCK CAPITAL C +2107 ; XID_Start # L& EULER CONSTANT +210A..2113 ; XID_Start # L& [10] SCRIPT SMALL G..SCRIPT SMALL L +2115 ; XID_Start # L& DOUBLE-STRUCK CAPITAL N +2118 ; XID_Start # Sm SCRIPT CAPITAL P +2119..211D ; XID_Start # L& [5] DOUBLE-STRUCK CAPITAL P..DOUBLE-STRUCK CAPITAL R +2124 ; XID_Start # L& DOUBLE-STRUCK CAPITAL Z +2126 ; XID_Start # L& OHM SIGN +2128 ; XID_Start # L& BLACK-LETTER CAPITAL Z +212A..212D ; XID_Start # L& [4] KELVIN SIGN..BLACK-LETTER CAPITAL C +212E ; XID_Start # So ESTIMATED SYMBOL +212F..2134 ; XID_Start # L& [6] SCRIPT SMALL E..SCRIPT SMALL O +2135..2138 ; XID_Start # Lo [4] ALEF SYMBOL..DALET SYMBOL +2139 ; XID_Start # L& INFORMATION SOURCE +213C..213F ; XID_Start # L& [4] DOUBLE-STRUCK SMALL PI..DOUBLE-STRUCK CAPITAL PI +2145..2149 ; XID_Start # L& [5] DOUBLE-STRUCK ITALIC CAPITAL D..DOUBLE-STRUCK ITALIC SMALL J +214E ; XID_Start # L& TURNED SMALL F +2160..2182 ; XID_Start # Nl [35] ROMAN NUMERAL ONE..ROMAN NUMERAL TEN THOUSAND +2183..2184 ; XID_Start # L& [2] ROMAN NUMERAL REVERSED ONE HUNDRED..LATIN SMALL LETTER REVERSED C +2185..2188 ; XID_Start # Nl [4] ROMAN NUMERAL SIX LATE FORM..ROMAN NUMERAL ONE HUNDRED THOUSAND +2C00..2C2E ; XID_Start # L& [47] GLAGOLITIC CAPITAL LETTER AZU..GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE +2C30..2C5E ; XID_Start # L& [47] GLAGOLITIC SMALL LETTER AZU..GLAGOLITIC SMALL LETTER LATINATE MYSLITE +2C60..2C7B ; XID_Start # L& [28] LATIN CAPITAL LETTER L WITH DOUBLE BAR..LATIN LETTER SMALL CAPITAL TURNED E +2C7C..2C7D ; XID_Start # Lm [2] LATIN SUBSCRIPT SMALL LETTER J..MODIFIER LETTER CAPITAL V +2C7E..2CE4 ; XID_Start # L& [103] LATIN CAPITAL LETTER S WITH SWASH TAIL..COPTIC SYMBOL KAI +2CEB..2CEE ; XID_Start # L& [4] COPTIC CAPITAL LETTER CRYPTOGRAMMIC SHEI..COPTIC SMALL LETTER CRYPTOGRAMMIC GANGIA +2CF2..2CF3 ; XID_Start # L& [2] COPTIC CAPITAL LETTER BOHAIRIC KHEI..COPTIC SMALL LETTER BOHAIRIC KHEI +2D00..2D25 ; XID_Start # L& [38] GEORGIAN SMALL LETTER AN..GEORGIAN SMALL LETTER HOE +2D27 ; XID_Start # L& GEORGIAN SMALL LETTER YN +2D2D ; XID_Start # L& GEORGIAN SMALL LETTER AEN +2D30..2D67 ; XID_Start # Lo [56] TIFINAGH LETTER YA..TIFINAGH LETTER YO +2D6F ; XID_Start # Lm TIFINAGH MODIFIER LETTER LABIALIZATION MARK +2D80..2D96 ; XID_Start # Lo [23] ETHIOPIC SYLLABLE LOA..ETHIOPIC SYLLABLE GGWE +2DA0..2DA6 ; XID_Start # Lo [7] ETHIOPIC SYLLABLE SSA..ETHIOPIC SYLLABLE SSO +2DA8..2DAE ; XID_Start # Lo [7] ETHIOPIC SYLLABLE CCA..ETHIOPIC SYLLABLE CCO +2DB0..2DB6 ; XID_Start # Lo [7] ETHIOPIC SYLLABLE ZZA..ETHIOPIC SYLLABLE ZZO +2DB8..2DBE ; XID_Start # Lo [7] ETHIOPIC SYLLABLE CCHA..ETHIOPIC SYLLABLE CCHO +2DC0..2DC6 ; XID_Start # Lo [7] ETHIOPIC SYLLABLE QYA..ETHIOPIC SYLLABLE QYO +2DC8..2DCE ; XID_Start # Lo [7] ETHIOPIC SYLLABLE KYA..ETHIOPIC SYLLABLE KYO +2DD0..2DD6 ; XID_Start # Lo [7] ETHIOPIC SYLLABLE XYA..ETHIOPIC SYLLABLE XYO +2DD8..2DDE ; XID_Start # Lo [7] ETHIOPIC SYLLABLE GYA..ETHIOPIC SYLLABLE GYO +3005 ; XID_Start # Lm IDEOGRAPHIC ITERATION MARK +3006 ; XID_Start # Lo IDEOGRAPHIC CLOSING MARK +3007 ; XID_Start # Nl IDEOGRAPHIC NUMBER ZERO +3021..3029 ; XID_Start # Nl [9] HANGZHOU NUMERAL ONE..HANGZHOU NUMERAL NINE +3031..3035 ; XID_Start # Lm [5] VERTICAL KANA REPEAT MARK..VERTICAL KANA REPEAT MARK LOWER HALF +3038..303A ; XID_Start # Nl [3] HANGZHOU NUMERAL TEN..HANGZHOU NUMERAL THIRTY +303B ; XID_Start # Lm VERTICAL IDEOGRAPHIC ITERATION MARK +303C ; XID_Start # Lo MASU MARK +3041..3096 ; XID_Start # Lo [86] HIRAGANA LETTER SMALL A..HIRAGANA LETTER SMALL KE +309D..309E ; XID_Start # Lm [2] HIRAGANA ITERATION MARK..HIRAGANA VOICED ITERATION MARK +309F ; XID_Start # Lo HIRAGANA DIGRAPH YORI +30A1..30FA ; XID_Start # Lo [90] KATAKANA LETTER SMALL A..KATAKANA LETTER VO +30FC..30FE ; XID_Start # Lm [3] KATAKANA-HIRAGANA PROLONGED SOUND MARK..KATAKANA VOICED ITERATION MARK +30FF ; XID_Start # Lo KATAKANA DIGRAPH KOTO +3105..312F ; XID_Start # Lo [43] BOPOMOFO LETTER B..BOPOMOFO LETTER NN +3131..318E ; XID_Start # Lo [94] HANGUL LETTER KIYEOK..HANGUL LETTER ARAEAE +31A0..31BA ; XID_Start # Lo [27] BOPOMOFO LETTER BU..BOPOMOFO LETTER ZY +31F0..31FF ; XID_Start # Lo [16] KATAKANA LETTER SMALL KU..KATAKANA LETTER SMALL RO +3400..4DB5 ; XID_Start # Lo [6582] CJK UNIFIED IDEOGRAPH-3400..CJK UNIFIED IDEOGRAPH-4DB5 +4E00..9FEF ; XID_Start # Lo [20976] CJK UNIFIED IDEOGRAPH-4E00..CJK UNIFIED IDEOGRAPH-9FEF +A000..A014 ; XID_Start # Lo [21] YI SYLLABLE IT..YI SYLLABLE E +A015 ; XID_Start # Lm YI SYLLABLE WU +A016..A48C ; XID_Start # Lo [1143] YI SYLLABLE BIT..YI SYLLABLE YYR +A4D0..A4F7 ; XID_Start # Lo [40] LISU LETTER BA..LISU LETTER OE +A4F8..A4FD ; XID_Start # Lm [6] LISU LETTER TONE MYA TI..LISU LETTER TONE MYA JEU +A500..A60B ; XID_Start # Lo [268] VAI SYLLABLE EE..VAI SYLLABLE NG +A60C ; XID_Start # Lm VAI SYLLABLE LENGTHENER +A610..A61F ; XID_Start # Lo [16] VAI SYLLABLE NDOLE FA..VAI SYMBOL JONG +A62A..A62B ; XID_Start # Lo [2] VAI SYLLABLE NDOLE MA..VAI SYLLABLE NDOLE DO +A640..A66D ; XID_Start # L& [46] CYRILLIC CAPITAL LETTER ZEMLYA..CYRILLIC SMALL LETTER DOUBLE MONOCULAR O +A66E ; XID_Start # Lo CYRILLIC LETTER MULTIOCULAR O +A67F ; XID_Start # Lm CYRILLIC PAYEROK +A680..A69B ; XID_Start # L& [28] CYRILLIC CAPITAL LETTER DWE..CYRILLIC SMALL LETTER CROSSED O +A69C..A69D ; XID_Start # Lm [2] MODIFIER LETTER CYRILLIC HARD SIGN..MODIFIER LETTER CYRILLIC SOFT SIGN +A6A0..A6E5 ; XID_Start # Lo [70] BAMUM LETTER A..BAMUM LETTER KI +A6E6..A6EF ; XID_Start # Nl [10] BAMUM LETTER MO..BAMUM LETTER KOGHOM +A717..A71F ; XID_Start # Lm [9] MODIFIER LETTER DOT VERTICAL BAR..MODIFIER LETTER LOW INVERTED EXCLAMATION MARK +A722..A76F ; XID_Start # L& [78] LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF..LATIN SMALL LETTER CON +A770 ; XID_Start # Lm MODIFIER LETTER US +A771..A787 ; XID_Start # L& [23] LATIN SMALL LETTER DUM..LATIN SMALL LETTER INSULAR T +A788 ; XID_Start # Lm MODIFIER LETTER LOW CIRCUMFLEX ACCENT +A78B..A78E ; XID_Start # L& [4] LATIN CAPITAL LETTER SALTILLO..LATIN SMALL LETTER L WITH RETROFLEX HOOK AND BELT +A78F ; XID_Start # Lo LATIN LETTER SINOLOGICAL DOT +A790..A7B9 ; XID_Start # L& [42] LATIN CAPITAL LETTER N WITH DESCENDER..LATIN SMALL LETTER U WITH STROKE +A7F7 ; XID_Start # Lo LATIN EPIGRAPHIC LETTER SIDEWAYS I +A7F8..A7F9 ; XID_Start # Lm [2] MODIFIER LETTER CAPITAL H WITH STROKE..MODIFIER LETTER SMALL LIGATURE OE +A7FA ; XID_Start # L& LATIN LETTER SMALL CAPITAL TURNED M +A7FB..A801 ; XID_Start # Lo [7] LATIN EPIGRAPHIC LETTER REVERSED F..SYLOTI NAGRI LETTER I +A803..A805 ; XID_Start # Lo [3] SYLOTI NAGRI LETTER U..SYLOTI NAGRI LETTER O +A807..A80A ; XID_Start # Lo [4] SYLOTI NAGRI LETTER KO..SYLOTI NAGRI LETTER GHO +A80C..A822 ; XID_Start # Lo [23] SYLOTI NAGRI LETTER CO..SYLOTI NAGRI LETTER HO +A840..A873 ; XID_Start # Lo [52] PHAGS-PA LETTER KA..PHAGS-PA LETTER CANDRABINDU +A882..A8B3 ; XID_Start # Lo [50] SAURASHTRA LETTER A..SAURASHTRA LETTER LLA +A8F2..A8F7 ; XID_Start # Lo [6] DEVANAGARI SIGN SPACING CANDRABINDU..DEVANAGARI SIGN CANDRABINDU AVAGRAHA +A8FB ; XID_Start # Lo DEVANAGARI HEADSTROKE +A8FD..A8FE ; XID_Start # Lo [2] DEVANAGARI JAIN OM..DEVANAGARI LETTER AY +A90A..A925 ; XID_Start # Lo [28] KAYAH LI LETTER KA..KAYAH LI LETTER OO +A930..A946 ; XID_Start # Lo [23] REJANG LETTER KA..REJANG LETTER A +A960..A97C ; XID_Start # Lo [29] HANGUL CHOSEONG TIKEUT-MIEUM..HANGUL CHOSEONG SSANGYEORINHIEUH +A984..A9B2 ; XID_Start # Lo [47] JAVANESE LETTER A..JAVANESE LETTER HA +A9CF ; XID_Start # Lm JAVANESE PANGRANGKEP +A9E0..A9E4 ; XID_Start # Lo [5] MYANMAR LETTER SHAN GHA..MYANMAR LETTER SHAN BHA +A9E6 ; XID_Start # Lm MYANMAR MODIFIER LETTER SHAN REDUPLICATION +A9E7..A9EF ; XID_Start # Lo [9] MYANMAR LETTER TAI LAING NYA..MYANMAR LETTER TAI LAING NNA +A9FA..A9FE ; XID_Start # Lo [5] MYANMAR LETTER TAI LAING LLA..MYANMAR LETTER TAI LAING BHA +AA00..AA28 ; XID_Start # Lo [41] CHAM LETTER A..CHAM LETTER HA +AA40..AA42 ; XID_Start # Lo [3] CHAM LETTER FINAL K..CHAM LETTER FINAL NG +AA44..AA4B ; XID_Start # Lo [8] CHAM LETTER FINAL CH..CHAM LETTER FINAL SS +AA60..AA6F ; XID_Start # Lo [16] MYANMAR LETTER KHAMTI GA..MYANMAR LETTER KHAMTI FA +AA70 ; XID_Start # Lm MYANMAR MODIFIER LETTER KHAMTI REDUPLICATION +AA71..AA76 ; XID_Start # Lo [6] MYANMAR LETTER KHAMTI XA..MYANMAR LOGOGRAM KHAMTI HM +AA7A ; XID_Start # Lo MYANMAR LETTER AITON RA +AA7E..AAAF ; XID_Start # Lo [50] MYANMAR LETTER SHWE PALAUNG CHA..TAI VIET LETTER HIGH O +AAB1 ; XID_Start # Lo TAI VIET VOWEL AA +AAB5..AAB6 ; XID_Start # Lo [2] TAI VIET VOWEL E..TAI VIET VOWEL O +AAB9..AABD ; XID_Start # Lo [5] TAI VIET VOWEL UEA..TAI VIET VOWEL AN +AAC0 ; XID_Start # Lo TAI VIET TONE MAI NUENG +AAC2 ; XID_Start # Lo TAI VIET TONE MAI SONG +AADB..AADC ; XID_Start # Lo [2] TAI VIET SYMBOL KON..TAI VIET SYMBOL NUENG +AADD ; XID_Start # Lm TAI VIET SYMBOL SAM +AAE0..AAEA ; XID_Start # Lo [11] MEETEI MAYEK LETTER E..MEETEI MAYEK LETTER SSA +AAF2 ; XID_Start # Lo MEETEI MAYEK ANJI +AAF3..AAF4 ; XID_Start # Lm [2] MEETEI MAYEK SYLLABLE REPETITION MARK..MEETEI MAYEK WORD REPETITION MARK +AB01..AB06 ; XID_Start # Lo [6] ETHIOPIC SYLLABLE TTHU..ETHIOPIC SYLLABLE TTHO +AB09..AB0E ; XID_Start # Lo [6] ETHIOPIC SYLLABLE DDHU..ETHIOPIC SYLLABLE DDHO +AB11..AB16 ; XID_Start # Lo [6] ETHIOPIC SYLLABLE DZU..ETHIOPIC SYLLABLE DZO +AB20..AB26 ; XID_Start # Lo [7] ETHIOPIC SYLLABLE CCHHA..ETHIOPIC SYLLABLE CCHHO +AB28..AB2E ; XID_Start # Lo [7] ETHIOPIC SYLLABLE BBA..ETHIOPIC SYLLABLE BBO +AB30..AB5A ; XID_Start # L& [43] LATIN SMALL LETTER BARRED ALPHA..LATIN SMALL LETTER Y WITH SHORT RIGHT LEG +AB5C..AB5F ; XID_Start # Lm [4] MODIFIER LETTER SMALL HENG..MODIFIER LETTER SMALL U WITH LEFT HOOK +AB60..AB65 ; XID_Start # L& [6] LATIN SMALL LETTER SAKHA YAT..GREEK LETTER SMALL CAPITAL OMEGA +AB70..ABBF ; XID_Start # L& [80] CHEROKEE SMALL LETTER A..CHEROKEE SMALL LETTER YA +ABC0..ABE2 ; XID_Start # Lo [35] MEETEI MAYEK LETTER KOK..MEETEI MAYEK LETTER I LONSUM +AC00..D7A3 ; XID_Start # Lo [11172] HANGUL SYLLABLE GA..HANGUL SYLLABLE HIH +D7B0..D7C6 ; XID_Start # Lo [23] HANGUL JUNGSEONG O-YEO..HANGUL JUNGSEONG ARAEA-E +D7CB..D7FB ; XID_Start # Lo [49] HANGUL JONGSEONG NIEUN-RIEUL..HANGUL JONGSEONG PHIEUPH-THIEUTH +F900..FA6D ; XID_Start # Lo [366] CJK COMPATIBILITY IDEOGRAPH-F900..CJK COMPATIBILITY IDEOGRAPH-FA6D +FA70..FAD9 ; XID_Start # Lo [106] CJK COMPATIBILITY IDEOGRAPH-FA70..CJK COMPATIBILITY IDEOGRAPH-FAD9 +FB00..FB06 ; XID_Start # L& [7] LATIN SMALL LIGATURE FF..LATIN SMALL LIGATURE ST +FB13..FB17 ; XID_Start # L& [5] ARMENIAN SMALL LIGATURE MEN NOW..ARMENIAN SMALL LIGATURE MEN XEH +FB1D ; XID_Start # Lo HEBREW LETTER YOD WITH HIRIQ +FB1F..FB28 ; XID_Start # Lo [10] HEBREW LIGATURE YIDDISH YOD YOD PATAH..HEBREW LETTER WIDE TAV +FB2A..FB36 ; XID_Start # Lo [13] HEBREW LETTER SHIN WITH SHIN DOT..HEBREW LETTER ZAYIN WITH DAGESH +FB38..FB3C ; XID_Start # Lo [5] HEBREW LETTER TET WITH DAGESH..HEBREW LETTER LAMED WITH DAGESH +FB3E ; XID_Start # Lo HEBREW LETTER MEM WITH DAGESH +FB40..FB41 ; XID_Start # Lo [2] HEBREW LETTER NUN WITH DAGESH..HEBREW LETTER SAMEKH WITH DAGESH +FB43..FB44 ; XID_Start # Lo [2] HEBREW LETTER FINAL PE WITH DAGESH..HEBREW LETTER PE WITH DAGESH +FB46..FBB1 ; XID_Start # Lo [108] HEBREW LETTER TSADI WITH DAGESH..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM +FBD3..FC5D ; XID_Start # Lo [139] ARABIC LETTER NG ISOLATED FORM..ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF ISOLATED FORM +FC64..FD3D ; XID_Start # Lo [218] ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH REH FINAL FORM..ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM +FD50..FD8F ; XID_Start # Lo [64] ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM..ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM +FD92..FDC7 ; XID_Start # Lo [54] ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM..ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM +FDF0..FDF9 ; XID_Start # Lo [10] ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM..ARABIC LIGATURE SALLA ISOLATED FORM +FE71 ; XID_Start # Lo ARABIC TATWEEL WITH FATHATAN ABOVE +FE73 ; XID_Start # Lo ARABIC TAIL FRAGMENT +FE77 ; XID_Start # Lo ARABIC FATHA MEDIAL FORM +FE79 ; XID_Start # Lo ARABIC DAMMA MEDIAL FORM +FE7B ; XID_Start # Lo ARABIC KASRA MEDIAL FORM +FE7D ; XID_Start # Lo ARABIC SHADDA MEDIAL FORM +FE7F..FEFC ; XID_Start # Lo [126] ARABIC SUKUN MEDIAL FORM..ARABIC LIGATURE LAM WITH ALEF FINAL FORM +FF21..FF3A ; XID_Start # L& [26] FULLWIDTH LATIN CAPITAL LETTER A..FULLWIDTH LATIN CAPITAL LETTER Z +FF41..FF5A ; XID_Start # L& [26] FULLWIDTH LATIN SMALL LETTER A..FULLWIDTH LATIN SMALL LETTER Z +FF66..FF6F ; XID_Start # Lo [10] HALFWIDTH KATAKANA LETTER WO..HALFWIDTH KATAKANA LETTER SMALL TU +FF70 ; XID_Start # Lm HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK +FF71..FF9D ; XID_Start # Lo [45] HALFWIDTH KATAKANA LETTER A..HALFWIDTH KATAKANA LETTER N +FFA0..FFBE ; XID_Start # Lo [31] HALFWIDTH HANGUL FILLER..HALFWIDTH HANGUL LETTER HIEUH +FFC2..FFC7 ; XID_Start # Lo [6] HALFWIDTH HANGUL LETTER A..HALFWIDTH HANGUL LETTER E +FFCA..FFCF ; XID_Start # Lo [6] HALFWIDTH HANGUL LETTER YEO..HALFWIDTH HANGUL LETTER OE +FFD2..FFD7 ; XID_Start # Lo [6] HALFWIDTH HANGUL LETTER YO..HALFWIDTH HANGUL LETTER YU +FFDA..FFDC ; XID_Start # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL LETTER I +10000..1000B ; XID_Start # Lo [12] LINEAR B SYLLABLE B008 A..LINEAR B SYLLABLE B046 JE +1000D..10026 ; XID_Start # Lo [26] LINEAR B SYLLABLE B036 JO..LINEAR B SYLLABLE B032 QO +10028..1003A ; XID_Start # Lo [19] LINEAR B SYLLABLE B060 RA..LINEAR B SYLLABLE B042 WO +1003C..1003D ; XID_Start # Lo [2] LINEAR B SYLLABLE B017 ZA..LINEAR B SYLLABLE B074 ZE +1003F..1004D ; XID_Start # Lo [15] LINEAR B SYLLABLE B020 ZO..LINEAR B SYLLABLE B091 TWO +10050..1005D ; XID_Start # Lo [14] LINEAR B SYMBOL B018..LINEAR B SYMBOL B089 +10080..100FA ; XID_Start # Lo [123] LINEAR B IDEOGRAM B100 MAN..LINEAR B IDEOGRAM VESSEL B305 +10140..10174 ; XID_Start # Nl [53] GREEK ACROPHONIC ATTIC ONE QUARTER..GREEK ACROPHONIC STRATIAN FIFTY MNAS +10280..1029C ; XID_Start # Lo [29] LYCIAN LETTER A..LYCIAN LETTER X +102A0..102D0 ; XID_Start # Lo [49] CARIAN LETTER A..CARIAN LETTER UUU3 +10300..1031F ; XID_Start # Lo [32] OLD ITALIC LETTER A..OLD ITALIC LETTER ESS +1032D..10340 ; XID_Start # Lo [20] OLD ITALIC LETTER YE..GOTHIC LETTER PAIRTHRA +10341 ; XID_Start # Nl GOTHIC LETTER NINETY +10342..10349 ; XID_Start # Lo [8] GOTHIC LETTER RAIDA..GOTHIC LETTER OTHAL +1034A ; XID_Start # Nl GOTHIC LETTER NINE HUNDRED +10350..10375 ; XID_Start # Lo [38] OLD PERMIC LETTER AN..OLD PERMIC LETTER IA +10380..1039D ; XID_Start # Lo [30] UGARITIC LETTER ALPA..UGARITIC LETTER SSU +103A0..103C3 ; XID_Start # Lo [36] OLD PERSIAN SIGN A..OLD PERSIAN SIGN HA +103C8..103CF ; XID_Start # Lo [8] OLD PERSIAN SIGN AURAMAZDAA..OLD PERSIAN SIGN BUUMISH +103D1..103D5 ; XID_Start # Nl [5] OLD PERSIAN NUMBER ONE..OLD PERSIAN NUMBER HUNDRED +10400..1044F ; XID_Start # L& [80] DESERET CAPITAL LETTER LONG I..DESERET SMALL LETTER EW +10450..1049D ; XID_Start # Lo [78] SHAVIAN LETTER PEEP..OSMANYA LETTER OO +104B0..104D3 ; XID_Start # L& [36] OSAGE CAPITAL LETTER A..OSAGE CAPITAL LETTER ZHA +104D8..104FB ; XID_Start # L& [36] OSAGE SMALL LETTER A..OSAGE SMALL LETTER ZHA +10500..10527 ; XID_Start # Lo [40] ELBASAN LETTER A..ELBASAN LETTER KHE +10530..10563 ; XID_Start # Lo [52] CAUCASIAN ALBANIAN LETTER ALT..CAUCASIAN ALBANIAN LETTER KIW +10600..10736 ; XID_Start # Lo [311] LINEAR A SIGN AB001..LINEAR A SIGN A664 +10740..10755 ; XID_Start # Lo [22] LINEAR A SIGN A701 A..LINEAR A SIGN A732 JE +10760..10767 ; XID_Start # Lo [8] LINEAR A SIGN A800..LINEAR A SIGN A807 +10800..10805 ; XID_Start # Lo [6] CYPRIOT SYLLABLE A..CYPRIOT SYLLABLE JA +10808 ; XID_Start # Lo CYPRIOT SYLLABLE JO +1080A..10835 ; XID_Start # Lo [44] CYPRIOT SYLLABLE KA..CYPRIOT SYLLABLE WO +10837..10838 ; XID_Start # Lo [2] CYPRIOT SYLLABLE XA..CYPRIOT SYLLABLE XE +1083C ; XID_Start # Lo CYPRIOT SYLLABLE ZA +1083F..10855 ; XID_Start # Lo [23] CYPRIOT SYLLABLE ZO..IMPERIAL ARAMAIC LETTER TAW +10860..10876 ; XID_Start # Lo [23] PALMYRENE LETTER ALEPH..PALMYRENE LETTER TAW +10880..1089E ; XID_Start # Lo [31] NABATAEAN LETTER FINAL ALEPH..NABATAEAN LETTER TAW +108E0..108F2 ; XID_Start # Lo [19] HATRAN LETTER ALEPH..HATRAN LETTER QOPH +108F4..108F5 ; XID_Start # Lo [2] HATRAN LETTER SHIN..HATRAN LETTER TAW +10900..10915 ; XID_Start # Lo [22] PHOENICIAN LETTER ALF..PHOENICIAN LETTER TAU +10920..10939 ; XID_Start # Lo [26] LYDIAN LETTER A..LYDIAN LETTER C +10980..109B7 ; XID_Start # Lo [56] MEROITIC HIEROGLYPHIC LETTER A..MEROITIC CURSIVE LETTER DA +109BE..109BF ; XID_Start # Lo [2] MEROITIC CURSIVE LOGOGRAM RMT..MEROITIC CURSIVE LOGOGRAM IMN +10A00 ; XID_Start # Lo KHAROSHTHI LETTER A +10A10..10A13 ; XID_Start # Lo [4] KHAROSHTHI LETTER KA..KHAROSHTHI LETTER GHA +10A15..10A17 ; XID_Start # Lo [3] KHAROSHTHI LETTER CA..KHAROSHTHI LETTER JA +10A19..10A35 ; XID_Start # Lo [29] KHAROSHTHI LETTER NYA..KHAROSHTHI LETTER VHA +10A60..10A7C ; XID_Start # Lo [29] OLD SOUTH ARABIAN LETTER HE..OLD SOUTH ARABIAN LETTER THETH +10A80..10A9C ; XID_Start # Lo [29] OLD NORTH ARABIAN LETTER HEH..OLD NORTH ARABIAN LETTER ZAH +10AC0..10AC7 ; XID_Start # Lo [8] MANICHAEAN LETTER ALEPH..MANICHAEAN LETTER WAW +10AC9..10AE4 ; XID_Start # Lo [28] MANICHAEAN LETTER ZAYIN..MANICHAEAN LETTER TAW +10B00..10B35 ; XID_Start # Lo [54] AVESTAN LETTER A..AVESTAN LETTER HE +10B40..10B55 ; XID_Start # Lo [22] INSCRIPTIONAL PARTHIAN LETTER ALEPH..INSCRIPTIONAL PARTHIAN LETTER TAW +10B60..10B72 ; XID_Start # Lo [19] INSCRIPTIONAL PAHLAVI LETTER ALEPH..INSCRIPTIONAL PAHLAVI LETTER TAW +10B80..10B91 ; XID_Start # Lo [18] PSALTER PAHLAVI LETTER ALEPH..PSALTER PAHLAVI LETTER TAW +10C00..10C48 ; XID_Start # Lo [73] OLD TURKIC LETTER ORKHON A..OLD TURKIC LETTER ORKHON BASH +10C80..10CB2 ; XID_Start # L& [51] OLD HUNGARIAN CAPITAL LETTER A..OLD HUNGARIAN CAPITAL LETTER US +10CC0..10CF2 ; XID_Start # L& [51] OLD HUNGARIAN SMALL LETTER A..OLD HUNGARIAN SMALL LETTER US +10D00..10D23 ; XID_Start # Lo [36] HANIFI ROHINGYA LETTER A..HANIFI ROHINGYA MARK NA KHONNA +10F00..10F1C ; XID_Start # Lo [29] OLD SOGDIAN LETTER ALEPH..OLD SOGDIAN LETTER FINAL TAW WITH VERTICAL TAIL +10F27 ; XID_Start # Lo OLD SOGDIAN LIGATURE AYIN-DALETH +10F30..10F45 ; XID_Start # Lo [22] SOGDIAN LETTER ALEPH..SOGDIAN INDEPENDENT SHIN +11003..11037 ; XID_Start # Lo [53] BRAHMI SIGN JIHVAMULIYA..BRAHMI LETTER OLD TAMIL NNNA +11083..110AF ; XID_Start # Lo [45] KAITHI LETTER A..KAITHI LETTER HA +110D0..110E8 ; XID_Start # Lo [25] SORA SOMPENG LETTER SAH..SORA SOMPENG LETTER MAE +11103..11126 ; XID_Start # Lo [36] CHAKMA LETTER AA..CHAKMA LETTER HAA +11144 ; XID_Start # Lo CHAKMA LETTER LHAA +11150..11172 ; XID_Start # Lo [35] MAHAJANI LETTER A..MAHAJANI LETTER RRA +11176 ; XID_Start # Lo MAHAJANI LIGATURE SHRI +11183..111B2 ; XID_Start # Lo [48] SHARADA LETTER A..SHARADA LETTER HA +111C1..111C4 ; XID_Start # Lo [4] SHARADA SIGN AVAGRAHA..SHARADA OM +111DA ; XID_Start # Lo SHARADA EKAM +111DC ; XID_Start # Lo SHARADA HEADSTROKE +11200..11211 ; XID_Start # Lo [18] KHOJKI LETTER A..KHOJKI LETTER JJA +11213..1122B ; XID_Start # Lo [25] KHOJKI LETTER NYA..KHOJKI LETTER LLA +11280..11286 ; XID_Start # Lo [7] MULTANI LETTER A..MULTANI LETTER GA +11288 ; XID_Start # Lo MULTANI LETTER GHA +1128A..1128D ; XID_Start # Lo [4] MULTANI LETTER CA..MULTANI LETTER JJA +1128F..1129D ; XID_Start # Lo [15] MULTANI LETTER NYA..MULTANI LETTER BA +1129F..112A8 ; XID_Start # Lo [10] MULTANI LETTER BHA..MULTANI LETTER RHA +112B0..112DE ; XID_Start # Lo [47] KHUDAWADI LETTER A..KHUDAWADI LETTER HA +11305..1130C ; XID_Start # Lo [8] GRANTHA LETTER A..GRANTHA LETTER VOCALIC L +1130F..11310 ; XID_Start # Lo [2] GRANTHA LETTER EE..GRANTHA LETTER AI +11313..11328 ; XID_Start # Lo [22] GRANTHA LETTER OO..GRANTHA LETTER NA +1132A..11330 ; XID_Start # Lo [7] GRANTHA LETTER PA..GRANTHA LETTER RA +11332..11333 ; XID_Start # Lo [2] GRANTHA LETTER LA..GRANTHA LETTER LLA +11335..11339 ; XID_Start # Lo [5] GRANTHA LETTER VA..GRANTHA LETTER HA +1133D ; XID_Start # Lo GRANTHA SIGN AVAGRAHA +11350 ; XID_Start # Lo GRANTHA OM +1135D..11361 ; XID_Start # Lo [5] GRANTHA SIGN PLUTA..GRANTHA LETTER VOCALIC LL +11400..11434 ; XID_Start # Lo [53] NEWA LETTER A..NEWA LETTER HA +11447..1144A ; XID_Start # Lo [4] NEWA SIGN AVAGRAHA..NEWA SIDDHI +11480..114AF ; XID_Start # Lo [48] TIRHUTA ANJI..TIRHUTA LETTER HA +114C4..114C5 ; XID_Start # Lo [2] TIRHUTA SIGN AVAGRAHA..TIRHUTA GVANG +114C7 ; XID_Start # Lo TIRHUTA OM +11580..115AE ; XID_Start # Lo [47] SIDDHAM LETTER A..SIDDHAM LETTER HA +115D8..115DB ; XID_Start # Lo [4] SIDDHAM LETTER THREE-CIRCLE ALTERNATE I..SIDDHAM LETTER ALTERNATE U +11600..1162F ; XID_Start # Lo [48] MODI LETTER A..MODI LETTER LLA +11644 ; XID_Start # Lo MODI SIGN HUVA +11680..116AA ; XID_Start # Lo [43] TAKRI LETTER A..TAKRI LETTER RRA +11700..1171A ; XID_Start # Lo [27] AHOM LETTER KA..AHOM LETTER ALTERNATE BA +11800..1182B ; XID_Start # Lo [44] DOGRA LETTER A..DOGRA LETTER RRA +118A0..118DF ; XID_Start # L& [64] WARANG CITI CAPITAL LETTER NGAA..WARANG CITI SMALL LETTER VIYO +118FF ; XID_Start # Lo WARANG CITI OM +11A00 ; XID_Start # Lo ZANABAZAR SQUARE LETTER A +11A0B..11A32 ; XID_Start # Lo [40] ZANABAZAR SQUARE LETTER KA..ZANABAZAR SQUARE LETTER KSSA +11A3A ; XID_Start # Lo ZANABAZAR SQUARE CLUSTER-INITIAL LETTER RA +11A50 ; XID_Start # Lo SOYOMBO LETTER A +11A5C..11A83 ; XID_Start # Lo [40] SOYOMBO LETTER KA..SOYOMBO LETTER KSSA +11A86..11A89 ; XID_Start # Lo [4] SOYOMBO CLUSTER-INITIAL LETTER RA..SOYOMBO CLUSTER-INITIAL LETTER SA +11A9D ; XID_Start # Lo SOYOMBO MARK PLUTA +11AC0..11AF8 ; XID_Start # Lo [57] PAU CIN HAU LETTER PA..PAU CIN HAU GLOTTAL STOP FINAL +11C00..11C08 ; XID_Start # Lo [9] BHAIKSUKI LETTER A..BHAIKSUKI LETTER VOCALIC L +11C0A..11C2E ; XID_Start # Lo [37] BHAIKSUKI LETTER E..BHAIKSUKI LETTER HA +11C40 ; XID_Start # Lo BHAIKSUKI SIGN AVAGRAHA +11C72..11C8F ; XID_Start # Lo [30] MARCHEN LETTER KA..MARCHEN LETTER A +11D00..11D06 ; XID_Start # Lo [7] MASARAM GONDI LETTER A..MASARAM GONDI LETTER E +11D08..11D09 ; XID_Start # Lo [2] MASARAM GONDI LETTER AI..MASARAM GONDI LETTER O +11D0B..11D30 ; XID_Start # Lo [38] MASARAM GONDI LETTER AU..MASARAM GONDI LETTER TRA +11D46 ; XID_Start # Lo MASARAM GONDI REPHA +11D60..11D65 ; XID_Start # Lo [6] GUNJALA GONDI LETTER A..GUNJALA GONDI LETTER UU +11D67..11D68 ; XID_Start # Lo [2] GUNJALA GONDI LETTER EE..GUNJALA GONDI LETTER AI +11D6A..11D89 ; XID_Start # Lo [32] GUNJALA GONDI LETTER OO..GUNJALA GONDI LETTER SA +11D98 ; XID_Start # Lo GUNJALA GONDI OM +11EE0..11EF2 ; XID_Start # Lo [19] MAKASAR LETTER KA..MAKASAR ANGKA +12000..12399 ; XID_Start # Lo [922] CUNEIFORM SIGN A..CUNEIFORM SIGN U U +12400..1246E ; XID_Start # Nl [111] CUNEIFORM NUMERIC SIGN TWO ASH..CUNEIFORM NUMERIC SIGN NINE U VARIANT FORM +12480..12543 ; XID_Start # Lo [196] CUNEIFORM SIGN AB TIMES NUN TENU..CUNEIFORM SIGN ZU5 TIMES THREE DISH TENU +13000..1342E ; XID_Start # Lo [1071] EGYPTIAN HIEROGLYPH A001..EGYPTIAN HIEROGLYPH AA032 +14400..14646 ; XID_Start # Lo [583] ANATOLIAN HIEROGLYPH A001..ANATOLIAN HIEROGLYPH A530 +16800..16A38 ; XID_Start # Lo [569] BAMUM LETTER PHASE-A NGKUE MFON..BAMUM LETTER PHASE-F VUEQ +16A40..16A5E ; XID_Start # Lo [31] MRO LETTER TA..MRO LETTER TEK +16AD0..16AED ; XID_Start # Lo [30] BASSA VAH LETTER ENNI..BASSA VAH LETTER I +16B00..16B2F ; XID_Start # Lo [48] PAHAWH HMONG VOWEL KEEB..PAHAWH HMONG CONSONANT CAU +16B40..16B43 ; XID_Start # Lm [4] PAHAWH HMONG SIGN VOS SEEV..PAHAWH HMONG SIGN IB YAM +16B63..16B77 ; XID_Start # Lo [21] PAHAWH HMONG SIGN VOS LUB..PAHAWH HMONG SIGN CIM NRES TOS +16B7D..16B8F ; XID_Start # Lo [19] PAHAWH HMONG CLAN SIGN TSHEEJ..PAHAWH HMONG CLAN SIGN VWJ +16E40..16E7F ; XID_Start # L& [64] MEDEFAIDRIN CAPITAL LETTER M..MEDEFAIDRIN SMALL LETTER Y +16F00..16F44 ; XID_Start # Lo [69] MIAO LETTER PA..MIAO LETTER HHA +16F50 ; XID_Start # Lo MIAO LETTER NASALIZATION +16F93..16F9F ; XID_Start # Lm [13] MIAO LETTER TONE-2..MIAO LETTER REFORMED TONE-8 +16FE0..16FE1 ; XID_Start # Lm [2] TANGUT ITERATION MARK..NUSHU ITERATION MARK +17000..187F1 ; XID_Start # Lo [6130] TANGUT IDEOGRAPH-17000..TANGUT IDEOGRAPH-187F1 +18800..18AF2 ; XID_Start # Lo [755] TANGUT COMPONENT-001..TANGUT COMPONENT-755 +1B000..1B11E ; XID_Start # Lo [287] KATAKANA LETTER ARCHAIC E..HENTAIGANA LETTER N-MU-MO-2 +1B170..1B2FB ; XID_Start # Lo [396] NUSHU CHARACTER-1B170..NUSHU CHARACTER-1B2FB +1BC00..1BC6A ; XID_Start # Lo [107] DUPLOYAN LETTER H..DUPLOYAN LETTER VOCALIC M +1BC70..1BC7C ; XID_Start # Lo [13] DUPLOYAN AFFIX LEFT HORIZONTAL SECANT..DUPLOYAN AFFIX ATTACHED TANGENT HOOK +1BC80..1BC88 ; XID_Start # Lo [9] DUPLOYAN AFFIX HIGH ACUTE..DUPLOYAN AFFIX HIGH VERTICAL +1BC90..1BC99 ; XID_Start # Lo [10] DUPLOYAN AFFIX LOW ACUTE..DUPLOYAN AFFIX LOW ARROW +1D400..1D454 ; XID_Start # L& [85] MATHEMATICAL BOLD CAPITAL A..MATHEMATICAL ITALIC SMALL G +1D456..1D49C ; XID_Start # L& [71] MATHEMATICAL ITALIC SMALL I..MATHEMATICAL SCRIPT CAPITAL A +1D49E..1D49F ; XID_Start # L& [2] MATHEMATICAL SCRIPT CAPITAL C..MATHEMATICAL SCRIPT CAPITAL D +1D4A2 ; XID_Start # L& MATHEMATICAL SCRIPT CAPITAL G +1D4A5..1D4A6 ; XID_Start # L& [2] MATHEMATICAL SCRIPT CAPITAL J..MATHEMATICAL SCRIPT CAPITAL K +1D4A9..1D4AC ; XID_Start # L& [4] MATHEMATICAL SCRIPT CAPITAL N..MATHEMATICAL SCRIPT CAPITAL Q +1D4AE..1D4B9 ; XID_Start # L& [12] MATHEMATICAL SCRIPT CAPITAL S..MATHEMATICAL SCRIPT SMALL D +1D4BB ; XID_Start # L& MATHEMATICAL SCRIPT SMALL F +1D4BD..1D4C3 ; XID_Start # L& [7] MATHEMATICAL SCRIPT SMALL H..MATHEMATICAL SCRIPT SMALL N +1D4C5..1D505 ; XID_Start # L& [65] MATHEMATICAL SCRIPT SMALL P..MATHEMATICAL FRAKTUR CAPITAL B +1D507..1D50A ; XID_Start # L& [4] MATHEMATICAL FRAKTUR CAPITAL D..MATHEMATICAL FRAKTUR CAPITAL G +1D50D..1D514 ; XID_Start # L& [8] MATHEMATICAL FRAKTUR CAPITAL J..MATHEMATICAL FRAKTUR CAPITAL Q +1D516..1D51C ; XID_Start # L& [7] MATHEMATICAL FRAKTUR CAPITAL S..MATHEMATICAL FRAKTUR CAPITAL Y +1D51E..1D539 ; XID_Start # L& [28] MATHEMATICAL FRAKTUR SMALL A..MATHEMATICAL DOUBLE-STRUCK CAPITAL B +1D53B..1D53E ; XID_Start # L& [4] MATHEMATICAL DOUBLE-STRUCK CAPITAL D..MATHEMATICAL DOUBLE-STRUCK CAPITAL G +1D540..1D544 ; XID_Start # L& [5] MATHEMATICAL DOUBLE-STRUCK CAPITAL I..MATHEMATICAL DOUBLE-STRUCK CAPITAL M +1D546 ; XID_Start # L& MATHEMATICAL DOUBLE-STRUCK CAPITAL O +1D54A..1D550 ; XID_Start # L& [7] MATHEMATICAL DOUBLE-STRUCK CAPITAL S..MATHEMATICAL DOUBLE-STRUCK CAPITAL Y +1D552..1D6A5 ; XID_Start # L& [340] MATHEMATICAL DOUBLE-STRUCK SMALL A..MATHEMATICAL ITALIC SMALL DOTLESS J +1D6A8..1D6C0 ; XID_Start # L& [25] MATHEMATICAL BOLD CAPITAL ALPHA..MATHEMATICAL BOLD CAPITAL OMEGA +1D6C2..1D6DA ; XID_Start # L& [25] MATHEMATICAL BOLD SMALL ALPHA..MATHEMATICAL BOLD SMALL OMEGA +1D6DC..1D6FA ; XID_Start # L& [31] MATHEMATICAL BOLD EPSILON SYMBOL..MATHEMATICAL ITALIC CAPITAL OMEGA +1D6FC..1D714 ; XID_Start # L& [25] MATHEMATICAL ITALIC SMALL ALPHA..MATHEMATICAL ITALIC SMALL OMEGA +1D716..1D734 ; XID_Start # L& [31] MATHEMATICAL ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD ITALIC CAPITAL OMEGA +1D736..1D74E ; XID_Start # L& [25] MATHEMATICAL BOLD ITALIC SMALL ALPHA..MATHEMATICAL BOLD ITALIC SMALL OMEGA +1D750..1D76E ; XID_Start # L& [31] MATHEMATICAL BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA +1D770..1D788 ; XID_Start # L& [25] MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA +1D78A..1D7A8 ; XID_Start # L& [31] MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA +1D7AA..1D7C2 ; XID_Start # L& [25] MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA +1D7C4..1D7CB ; XID_Start # L& [8] MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD SMALL DIGAMMA +1E800..1E8C4 ; XID_Start # Lo [197] MENDE KIKAKUI SYLLABLE M001 KI..MENDE KIKAKUI SYLLABLE M060 NYON +1E900..1E943 ; XID_Start # L& [68] ADLAM CAPITAL LETTER ALIF..ADLAM SMALL LETTER SHA +1EE00..1EE03 ; XID_Start # Lo [4] ARABIC MATHEMATICAL ALEF..ARABIC MATHEMATICAL DAL +1EE05..1EE1F ; XID_Start # Lo [27] ARABIC MATHEMATICAL WAW..ARABIC MATHEMATICAL DOTLESS QAF +1EE21..1EE22 ; XID_Start # Lo [2] ARABIC MATHEMATICAL INITIAL BEH..ARABIC MATHEMATICAL INITIAL JEEM +1EE24 ; XID_Start # Lo ARABIC MATHEMATICAL INITIAL HEH +1EE27 ; XID_Start # Lo ARABIC MATHEMATICAL INITIAL HAH +1EE29..1EE32 ; XID_Start # Lo [10] ARABIC MATHEMATICAL INITIAL YEH..ARABIC MATHEMATICAL INITIAL QAF +1EE34..1EE37 ; XID_Start # Lo [4] ARABIC MATHEMATICAL INITIAL SHEEN..ARABIC MATHEMATICAL INITIAL KHAH +1EE39 ; XID_Start # Lo ARABIC MATHEMATICAL INITIAL DAD +1EE3B ; XID_Start # Lo ARABIC MATHEMATICAL INITIAL GHAIN +1EE42 ; XID_Start # Lo ARABIC MATHEMATICAL TAILED JEEM +1EE47 ; XID_Start # Lo ARABIC MATHEMATICAL TAILED HAH +1EE49 ; XID_Start # Lo ARABIC MATHEMATICAL TAILED YEH +1EE4B ; XID_Start # Lo ARABIC MATHEMATICAL TAILED LAM +1EE4D..1EE4F ; XID_Start # Lo [3] ARABIC MATHEMATICAL TAILED NOON..ARABIC MATHEMATICAL TAILED AIN +1EE51..1EE52 ; XID_Start # Lo [2] ARABIC MATHEMATICAL TAILED SAD..ARABIC MATHEMATICAL TAILED QAF +1EE54 ; XID_Start # Lo ARABIC MATHEMATICAL TAILED SHEEN +1EE57 ; XID_Start # Lo ARABIC MATHEMATICAL TAILED KHAH +1EE59 ; XID_Start # Lo ARABIC MATHEMATICAL TAILED DAD +1EE5B ; XID_Start # Lo ARABIC MATHEMATICAL TAILED GHAIN +1EE5D ; XID_Start # Lo ARABIC MATHEMATICAL TAILED DOTLESS NOON +1EE5F ; XID_Start # Lo ARABIC MATHEMATICAL TAILED DOTLESS QAF +1EE61..1EE62 ; XID_Start # Lo [2] ARABIC MATHEMATICAL STRETCHED BEH..ARABIC MATHEMATICAL STRETCHED JEEM +1EE64 ; XID_Start # Lo ARABIC MATHEMATICAL STRETCHED HEH +1EE67..1EE6A ; XID_Start # Lo [4] ARABIC MATHEMATICAL STRETCHED HAH..ARABIC MATHEMATICAL STRETCHED KAF +1EE6C..1EE72 ; XID_Start # Lo [7] ARABIC MATHEMATICAL STRETCHED MEEM..ARABIC MATHEMATICAL STRETCHED QAF +1EE74..1EE77 ; XID_Start # Lo [4] ARABIC MATHEMATICAL STRETCHED SHEEN..ARABIC MATHEMATICAL STRETCHED KHAH +1EE79..1EE7C ; XID_Start # Lo [4] ARABIC MATHEMATICAL STRETCHED DAD..ARABIC MATHEMATICAL STRETCHED DOTLESS BEH +1EE7E ; XID_Start # Lo ARABIC MATHEMATICAL STRETCHED DOTLESS FEH +1EE80..1EE89 ; XID_Start # Lo [10] ARABIC MATHEMATICAL LOOPED ALEF..ARABIC MATHEMATICAL LOOPED YEH +1EE8B..1EE9B ; XID_Start # Lo [17] ARABIC MATHEMATICAL LOOPED LAM..ARABIC MATHEMATICAL LOOPED GHAIN +1EEA1..1EEA3 ; XID_Start # Lo [3] ARABIC MATHEMATICAL DOUBLE-STRUCK BEH..ARABIC MATHEMATICAL DOUBLE-STRUCK DAL +1EEA5..1EEA9 ; XID_Start # Lo [5] ARABIC MATHEMATICAL DOUBLE-STRUCK WAW..ARABIC MATHEMATICAL DOUBLE-STRUCK YEH +1EEAB..1EEBB ; XID_Start # Lo [17] ARABIC MATHEMATICAL DOUBLE-STRUCK LAM..ARABIC MATHEMATICAL DOUBLE-STRUCK GHAIN +20000..2A6D6 ; XID_Start # Lo [42711] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6D6 +2A700..2B734 ; XID_Start # Lo [4149] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B734 +2B740..2B81D ; XID_Start # Lo [222] CJK UNIFIED IDEOGRAPH-2B740..CJK UNIFIED IDEOGRAPH-2B81D +2B820..2CEA1 ; XID_Start # Lo [5762] CJK UNIFIED IDEOGRAPH-2B820..CJK UNIFIED IDEOGRAPH-2CEA1 +2CEB0..2EBE0 ; XID_Start # Lo [7473] CJK UNIFIED IDEOGRAPH-2CEB0..CJK UNIFIED IDEOGRAPH-2EBE0 +2F800..2FA1D ; XID_Start # Lo [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D + +# Total code points: 125637 + +# ================================================ + +# Derived Property: XID_Continue +# Mod_ID_Continue modified for closure under NFKx +# Modified as described in UAX #15 +# NOTE: Does NOT remove the non-NFKx characters. +# Merely ensures that if isIdentifer(string) then isIdentifier(NFKx(string)) +# NOTE: See UAX #31 for more information + +0030..0039 ; XID_Continue # Nd [10] DIGIT ZERO..DIGIT NINE +0041..005A ; XID_Continue # L& [26] LATIN CAPITAL LETTER A..LATIN CAPITAL LETTER Z +005F ; XID_Continue # Pc LOW LINE +0061..007A ; XID_Continue # L& [26] LATIN SMALL LETTER A..LATIN SMALL LETTER Z +00AA ; XID_Continue # Lo FEMININE ORDINAL INDICATOR +00B5 ; XID_Continue # L& MICRO SIGN +00B7 ; XID_Continue # Po MIDDLE DOT +00BA ; XID_Continue # Lo MASCULINE ORDINAL INDICATOR +00C0..00D6 ; XID_Continue # L& [23] LATIN CAPITAL LETTER A WITH GRAVE..LATIN CAPITAL LETTER O WITH DIAERESIS +00D8..00F6 ; XID_Continue # L& [31] LATIN CAPITAL LETTER O WITH STROKE..LATIN SMALL LETTER O WITH DIAERESIS +00F8..01BA ; XID_Continue # L& [195] LATIN SMALL LETTER O WITH STROKE..LATIN SMALL LETTER EZH WITH TAIL +01BB ; XID_Continue # Lo LATIN LETTER TWO WITH STROKE +01BC..01BF ; XID_Continue # L& [4] LATIN CAPITAL LETTER TONE FIVE..LATIN LETTER WYNN +01C0..01C3 ; XID_Continue # Lo [4] LATIN LETTER DENTAL CLICK..LATIN LETTER RETROFLEX CLICK +01C4..0293 ; XID_Continue # L& [208] LATIN CAPITAL LETTER DZ WITH CARON..LATIN SMALL LETTER EZH WITH CURL +0294 ; XID_Continue # Lo LATIN LETTER GLOTTAL STOP +0295..02AF ; XID_Continue # L& [27] LATIN LETTER PHARYNGEAL VOICED FRICATIVE..LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL +02B0..02C1 ; XID_Continue # Lm [18] MODIFIER LETTER SMALL H..MODIFIER LETTER REVERSED GLOTTAL STOP +02C6..02D1 ; XID_Continue # Lm [12] MODIFIER LETTER CIRCUMFLEX ACCENT..MODIFIER LETTER HALF TRIANGULAR COLON +02E0..02E4 ; XID_Continue # Lm [5] MODIFIER LETTER SMALL GAMMA..MODIFIER LETTER SMALL REVERSED GLOTTAL STOP +02EC ; XID_Continue # Lm MODIFIER LETTER VOICING +02EE ; XID_Continue # Lm MODIFIER LETTER DOUBLE APOSTROPHE +0300..036F ; XID_Continue # Mn [112] COMBINING GRAVE ACCENT..COMBINING LATIN SMALL LETTER X +0370..0373 ; XID_Continue # L& [4] GREEK CAPITAL LETTER HETA..GREEK SMALL LETTER ARCHAIC SAMPI +0374 ; XID_Continue # Lm GREEK NUMERAL SIGN +0376..0377 ; XID_Continue # L& [2] GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA..GREEK SMALL LETTER PAMPHYLIAN DIGAMMA +037B..037D ; XID_Continue # L& [3] GREEK SMALL REVERSED LUNATE SIGMA SYMBOL..GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL +037F ; XID_Continue # L& GREEK CAPITAL LETTER YOT +0386 ; XID_Continue # L& GREEK CAPITAL LETTER ALPHA WITH TONOS +0387 ; XID_Continue # Po GREEK ANO TELEIA +0388..038A ; XID_Continue # L& [3] GREEK CAPITAL LETTER EPSILON WITH TONOS..GREEK CAPITAL LETTER IOTA WITH TONOS +038C ; XID_Continue # L& GREEK CAPITAL LETTER OMICRON WITH TONOS +038E..03A1 ; XID_Continue # L& [20] GREEK CAPITAL LETTER UPSILON WITH TONOS..GREEK CAPITAL LETTER RHO +03A3..03F5 ; XID_Continue # L& [83] GREEK CAPITAL LETTER SIGMA..GREEK LUNATE EPSILON SYMBOL +03F7..0481 ; XID_Continue # L& [139] GREEK CAPITAL LETTER SHO..CYRILLIC SMALL LETTER KOPPA +0483..0487 ; XID_Continue # Mn [5] COMBINING CYRILLIC TITLO..COMBINING CYRILLIC POKRYTIE +048A..052F ; XID_Continue # L& [166] CYRILLIC CAPITAL LETTER SHORT I WITH TAIL..CYRILLIC SMALL LETTER EL WITH DESCENDER +0531..0556 ; XID_Continue # L& [38] ARMENIAN CAPITAL LETTER AYB..ARMENIAN CAPITAL LETTER FEH +0559 ; XID_Continue # Lm ARMENIAN MODIFIER LETTER LEFT HALF RING +0560..0588 ; XID_Continue # L& [41] ARMENIAN SMALL LETTER TURNED AYB..ARMENIAN SMALL LETTER YI WITH STROKE +0591..05BD ; XID_Continue # Mn [45] HEBREW ACCENT ETNAHTA..HEBREW POINT METEG +05BF ; XID_Continue # Mn HEBREW POINT RAFE +05C1..05C2 ; XID_Continue # Mn [2] HEBREW POINT SHIN DOT..HEBREW POINT SIN DOT +05C4..05C5 ; XID_Continue # Mn [2] HEBREW MARK UPPER DOT..HEBREW MARK LOWER DOT +05C7 ; XID_Continue # Mn HEBREW POINT QAMATS QATAN +05D0..05EA ; XID_Continue # Lo [27] HEBREW LETTER ALEF..HEBREW LETTER TAV +05EF..05F2 ; XID_Continue # Lo [4] HEBREW YOD TRIANGLE..HEBREW LIGATURE YIDDISH DOUBLE YOD +0610..061A ; XID_Continue # Mn [11] ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM..ARABIC SMALL KASRA +0620..063F ; XID_Continue # Lo [32] ARABIC LETTER KASHMIRI YEH..ARABIC LETTER FARSI YEH WITH THREE DOTS ABOVE +0640 ; XID_Continue # Lm ARABIC TATWEEL +0641..064A ; XID_Continue # Lo [10] ARABIC LETTER FEH..ARABIC LETTER YEH +064B..065F ; XID_Continue # Mn [21] ARABIC FATHATAN..ARABIC WAVY HAMZA BELOW +0660..0669 ; XID_Continue # Nd [10] ARABIC-INDIC DIGIT ZERO..ARABIC-INDIC DIGIT NINE +066E..066F ; XID_Continue # Lo [2] ARABIC LETTER DOTLESS BEH..ARABIC LETTER DOTLESS QAF +0670 ; XID_Continue # Mn ARABIC LETTER SUPERSCRIPT ALEF +0671..06D3 ; XID_Continue # Lo [99] ARABIC LETTER ALEF WASLA..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE +06D5 ; XID_Continue # Lo ARABIC LETTER AE +06D6..06DC ; XID_Continue # Mn [7] ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA..ARABIC SMALL HIGH SEEN +06DF..06E4 ; XID_Continue # Mn [6] ARABIC SMALL HIGH ROUNDED ZERO..ARABIC SMALL HIGH MADDA +06E5..06E6 ; XID_Continue # Lm [2] ARABIC SMALL WAW..ARABIC SMALL YEH +06E7..06E8 ; XID_Continue # Mn [2] ARABIC SMALL HIGH YEH..ARABIC SMALL HIGH NOON +06EA..06ED ; XID_Continue # Mn [4] ARABIC EMPTY CENTRE LOW STOP..ARABIC SMALL LOW MEEM +06EE..06EF ; XID_Continue # Lo [2] ARABIC LETTER DAL WITH INVERTED V..ARABIC LETTER REH WITH INVERTED V +06F0..06F9 ; XID_Continue # Nd [10] EXTENDED ARABIC-INDIC DIGIT ZERO..EXTENDED ARABIC-INDIC DIGIT NINE +06FA..06FC ; XID_Continue # Lo [3] ARABIC LETTER SHEEN WITH DOT BELOW..ARABIC LETTER GHAIN WITH DOT BELOW +06FF ; XID_Continue # Lo ARABIC LETTER HEH WITH INVERTED V +0710 ; XID_Continue # Lo SYRIAC LETTER ALAPH +0711 ; XID_Continue # Mn SYRIAC LETTER SUPERSCRIPT ALAPH +0712..072F ; XID_Continue # Lo [30] SYRIAC LETTER BETH..SYRIAC LETTER PERSIAN DHALATH +0730..074A ; XID_Continue # Mn [27] SYRIAC PTHAHA ABOVE..SYRIAC BARREKH +074D..07A5 ; XID_Continue # Lo [89] SYRIAC LETTER SOGDIAN ZHAIN..THAANA LETTER WAAVU +07A6..07B0 ; XID_Continue # Mn [11] THAANA ABAFILI..THAANA SUKUN +07B1 ; XID_Continue # Lo THAANA LETTER NAA +07C0..07C9 ; XID_Continue # Nd [10] NKO DIGIT ZERO..NKO DIGIT NINE +07CA..07EA ; XID_Continue # Lo [33] NKO LETTER A..NKO LETTER JONA RA +07EB..07F3 ; XID_Continue # Mn [9] NKO COMBINING SHORT HIGH TONE..NKO COMBINING DOUBLE DOT ABOVE +07F4..07F5 ; XID_Continue # Lm [2] NKO HIGH TONE APOSTROPHE..NKO LOW TONE APOSTROPHE +07FA ; XID_Continue # Lm NKO LAJANYALAN +07FD ; XID_Continue # Mn NKO DANTAYALAN +0800..0815 ; XID_Continue # Lo [22] SAMARITAN LETTER ALAF..SAMARITAN LETTER TAAF +0816..0819 ; XID_Continue # Mn [4] SAMARITAN MARK IN..SAMARITAN MARK DAGESH +081A ; XID_Continue # Lm SAMARITAN MODIFIER LETTER EPENTHETIC YUT +081B..0823 ; XID_Continue # Mn [9] SAMARITAN MARK EPENTHETIC YUT..SAMARITAN VOWEL SIGN A +0824 ; XID_Continue # Lm SAMARITAN MODIFIER LETTER SHORT A +0825..0827 ; XID_Continue # Mn [3] SAMARITAN VOWEL SIGN SHORT A..SAMARITAN VOWEL SIGN U +0828 ; XID_Continue # Lm SAMARITAN MODIFIER LETTER I +0829..082D ; XID_Continue # Mn [5] SAMARITAN VOWEL SIGN LONG I..SAMARITAN MARK NEQUDAA +0840..0858 ; XID_Continue # Lo [25] MANDAIC LETTER HALQA..MANDAIC LETTER AIN +0859..085B ; XID_Continue # Mn [3] MANDAIC AFFRICATION MARK..MANDAIC GEMINATION MARK +0860..086A ; XID_Continue # Lo [11] SYRIAC LETTER MALAYALAM NGA..SYRIAC LETTER MALAYALAM SSA +08A0..08B4 ; XID_Continue # Lo [21] ARABIC LETTER BEH WITH SMALL V BELOW..ARABIC LETTER KAF WITH DOT BELOW +08B6..08BD ; XID_Continue # Lo [8] ARABIC LETTER BEH WITH SMALL MEEM ABOVE..ARABIC LETTER AFRICAN NOON +08D3..08E1 ; XID_Continue # Mn [15] ARABIC SMALL LOW WAW..ARABIC SMALL HIGH SIGN SAFHA +08E3..0902 ; XID_Continue # Mn [32] ARABIC TURNED DAMMA BELOW..DEVANAGARI SIGN ANUSVARA +0903 ; XID_Continue # Mc DEVANAGARI SIGN VISARGA +0904..0939 ; XID_Continue # Lo [54] DEVANAGARI LETTER SHORT A..DEVANAGARI LETTER HA +093A ; XID_Continue # Mn DEVANAGARI VOWEL SIGN OE +093B ; XID_Continue # Mc DEVANAGARI VOWEL SIGN OOE +093C ; XID_Continue # Mn DEVANAGARI SIGN NUKTA +093D ; XID_Continue # Lo DEVANAGARI SIGN AVAGRAHA +093E..0940 ; XID_Continue # Mc [3] DEVANAGARI VOWEL SIGN AA..DEVANAGARI VOWEL SIGN II +0941..0948 ; XID_Continue # Mn [8] DEVANAGARI VOWEL SIGN U..DEVANAGARI VOWEL SIGN AI +0949..094C ; XID_Continue # Mc [4] DEVANAGARI VOWEL SIGN CANDRA O..DEVANAGARI VOWEL SIGN AU +094D ; XID_Continue # Mn DEVANAGARI SIGN VIRAMA +094E..094F ; XID_Continue # Mc [2] DEVANAGARI VOWEL SIGN PRISHTHAMATRA E..DEVANAGARI VOWEL SIGN AW +0950 ; XID_Continue # Lo DEVANAGARI OM +0951..0957 ; XID_Continue # Mn [7] DEVANAGARI STRESS SIGN UDATTA..DEVANAGARI VOWEL SIGN UUE +0958..0961 ; XID_Continue # Lo [10] DEVANAGARI LETTER QA..DEVANAGARI LETTER VOCALIC LL +0962..0963 ; XID_Continue # Mn [2] DEVANAGARI VOWEL SIGN VOCALIC L..DEVANAGARI VOWEL SIGN VOCALIC LL +0966..096F ; XID_Continue # Nd [10] DEVANAGARI DIGIT ZERO..DEVANAGARI DIGIT NINE +0971 ; XID_Continue # Lm DEVANAGARI SIGN HIGH SPACING DOT +0972..0980 ; XID_Continue # Lo [15] DEVANAGARI LETTER CANDRA A..BENGALI ANJI +0981 ; XID_Continue # Mn BENGALI SIGN CANDRABINDU +0982..0983 ; XID_Continue # Mc [2] BENGALI SIGN ANUSVARA..BENGALI SIGN VISARGA +0985..098C ; XID_Continue # Lo [8] BENGALI LETTER A..BENGALI LETTER VOCALIC L +098F..0990 ; XID_Continue # Lo [2] BENGALI LETTER E..BENGALI LETTER AI +0993..09A8 ; XID_Continue # Lo [22] BENGALI LETTER O..BENGALI LETTER NA +09AA..09B0 ; XID_Continue # Lo [7] BENGALI LETTER PA..BENGALI LETTER RA +09B2 ; XID_Continue # Lo BENGALI LETTER LA +09B6..09B9 ; XID_Continue # Lo [4] BENGALI LETTER SHA..BENGALI LETTER HA +09BC ; XID_Continue # Mn BENGALI SIGN NUKTA +09BD ; XID_Continue # Lo BENGALI SIGN AVAGRAHA +09BE..09C0 ; XID_Continue # Mc [3] BENGALI VOWEL SIGN AA..BENGALI VOWEL SIGN II +09C1..09C4 ; XID_Continue # Mn [4] BENGALI VOWEL SIGN U..BENGALI VOWEL SIGN VOCALIC RR +09C7..09C8 ; XID_Continue # Mc [2] BENGALI VOWEL SIGN E..BENGALI VOWEL SIGN AI +09CB..09CC ; XID_Continue # Mc [2] BENGALI VOWEL SIGN O..BENGALI VOWEL SIGN AU +09CD ; XID_Continue # Mn BENGALI SIGN VIRAMA +09CE ; XID_Continue # Lo BENGALI LETTER KHANDA TA +09D7 ; XID_Continue # Mc BENGALI AU LENGTH MARK +09DC..09DD ; XID_Continue # Lo [2] BENGALI LETTER RRA..BENGALI LETTER RHA +09DF..09E1 ; XID_Continue # Lo [3] BENGALI LETTER YYA..BENGALI LETTER VOCALIC LL +09E2..09E3 ; XID_Continue # Mn [2] BENGALI VOWEL SIGN VOCALIC L..BENGALI VOWEL SIGN VOCALIC LL +09E6..09EF ; XID_Continue # Nd [10] BENGALI DIGIT ZERO..BENGALI DIGIT NINE +09F0..09F1 ; XID_Continue # Lo [2] BENGALI LETTER RA WITH MIDDLE DIAGONAL..BENGALI LETTER RA WITH LOWER DIAGONAL +09FC ; XID_Continue # Lo BENGALI LETTER VEDIC ANUSVARA +09FE ; XID_Continue # Mn BENGALI SANDHI MARK +0A01..0A02 ; XID_Continue # Mn [2] GURMUKHI SIGN ADAK BINDI..GURMUKHI SIGN BINDI +0A03 ; XID_Continue # Mc GURMUKHI SIGN VISARGA +0A05..0A0A ; XID_Continue # Lo [6] GURMUKHI LETTER A..GURMUKHI LETTER UU +0A0F..0A10 ; XID_Continue # Lo [2] GURMUKHI LETTER EE..GURMUKHI LETTER AI +0A13..0A28 ; XID_Continue # Lo [22] GURMUKHI LETTER OO..GURMUKHI LETTER NA +0A2A..0A30 ; XID_Continue # Lo [7] GURMUKHI LETTER PA..GURMUKHI LETTER RA +0A32..0A33 ; XID_Continue # Lo [2] GURMUKHI LETTER LA..GURMUKHI LETTER LLA +0A35..0A36 ; XID_Continue # Lo [2] GURMUKHI LETTER VA..GURMUKHI LETTER SHA +0A38..0A39 ; XID_Continue # Lo [2] GURMUKHI LETTER SA..GURMUKHI LETTER HA +0A3C ; XID_Continue # Mn GURMUKHI SIGN NUKTA +0A3E..0A40 ; XID_Continue # Mc [3] GURMUKHI VOWEL SIGN AA..GURMUKHI VOWEL SIGN II +0A41..0A42 ; XID_Continue # Mn [2] GURMUKHI VOWEL SIGN U..GURMUKHI VOWEL SIGN UU +0A47..0A48 ; XID_Continue # Mn [2] GURMUKHI VOWEL SIGN EE..GURMUKHI VOWEL SIGN AI +0A4B..0A4D ; XID_Continue # Mn [3] GURMUKHI VOWEL SIGN OO..GURMUKHI SIGN VIRAMA +0A51 ; XID_Continue # Mn GURMUKHI SIGN UDAAT +0A59..0A5C ; XID_Continue # Lo [4] GURMUKHI LETTER KHHA..GURMUKHI LETTER RRA +0A5E ; XID_Continue # Lo GURMUKHI LETTER FA +0A66..0A6F ; XID_Continue # Nd [10] GURMUKHI DIGIT ZERO..GURMUKHI DIGIT NINE +0A70..0A71 ; XID_Continue # Mn [2] GURMUKHI TIPPI..GURMUKHI ADDAK +0A72..0A74 ; XID_Continue # Lo [3] GURMUKHI IRI..GURMUKHI EK ONKAR +0A75 ; XID_Continue # Mn GURMUKHI SIGN YAKASH +0A81..0A82 ; XID_Continue # Mn [2] GUJARATI SIGN CANDRABINDU..GUJARATI SIGN ANUSVARA +0A83 ; XID_Continue # Mc GUJARATI SIGN VISARGA +0A85..0A8D ; XID_Continue # Lo [9] GUJARATI LETTER A..GUJARATI VOWEL CANDRA E +0A8F..0A91 ; XID_Continue # Lo [3] GUJARATI LETTER E..GUJARATI VOWEL CANDRA O +0A93..0AA8 ; XID_Continue # Lo [22] GUJARATI LETTER O..GUJARATI LETTER NA +0AAA..0AB0 ; XID_Continue # Lo [7] GUJARATI LETTER PA..GUJARATI LETTER RA +0AB2..0AB3 ; XID_Continue # Lo [2] GUJARATI LETTER LA..GUJARATI LETTER LLA +0AB5..0AB9 ; XID_Continue # Lo [5] GUJARATI LETTER VA..GUJARATI LETTER HA +0ABC ; XID_Continue # Mn GUJARATI SIGN NUKTA +0ABD ; XID_Continue # Lo GUJARATI SIGN AVAGRAHA +0ABE..0AC0 ; XID_Continue # Mc [3] GUJARATI VOWEL SIGN AA..GUJARATI VOWEL SIGN II +0AC1..0AC5 ; XID_Continue # Mn [5] GUJARATI VOWEL SIGN U..GUJARATI VOWEL SIGN CANDRA E +0AC7..0AC8 ; XID_Continue # Mn [2] GUJARATI VOWEL SIGN E..GUJARATI VOWEL SIGN AI +0AC9 ; XID_Continue # Mc GUJARATI VOWEL SIGN CANDRA O +0ACB..0ACC ; XID_Continue # Mc [2] GUJARATI VOWEL SIGN O..GUJARATI VOWEL SIGN AU +0ACD ; XID_Continue # Mn GUJARATI SIGN VIRAMA +0AD0 ; XID_Continue # Lo GUJARATI OM +0AE0..0AE1 ; XID_Continue # Lo [2] GUJARATI LETTER VOCALIC RR..GUJARATI LETTER VOCALIC LL +0AE2..0AE3 ; XID_Continue # Mn [2] GUJARATI VOWEL SIGN VOCALIC L..GUJARATI VOWEL SIGN VOCALIC LL +0AE6..0AEF ; XID_Continue # Nd [10] GUJARATI DIGIT ZERO..GUJARATI DIGIT NINE +0AF9 ; XID_Continue # Lo GUJARATI LETTER ZHA +0AFA..0AFF ; XID_Continue # Mn [6] GUJARATI SIGN SUKUN..GUJARATI SIGN TWO-CIRCLE NUKTA ABOVE +0B01 ; XID_Continue # Mn ORIYA SIGN CANDRABINDU +0B02..0B03 ; XID_Continue # Mc [2] ORIYA SIGN ANUSVARA..ORIYA SIGN VISARGA +0B05..0B0C ; XID_Continue # Lo [8] ORIYA LETTER A..ORIYA LETTER VOCALIC L +0B0F..0B10 ; XID_Continue # Lo [2] ORIYA LETTER E..ORIYA LETTER AI +0B13..0B28 ; XID_Continue # Lo [22] ORIYA LETTER O..ORIYA LETTER NA +0B2A..0B30 ; XID_Continue # Lo [7] ORIYA LETTER PA..ORIYA LETTER RA +0B32..0B33 ; XID_Continue # Lo [2] ORIYA LETTER LA..ORIYA LETTER LLA +0B35..0B39 ; XID_Continue # Lo [5] ORIYA LETTER VA..ORIYA LETTER HA +0B3C ; XID_Continue # Mn ORIYA SIGN NUKTA +0B3D ; XID_Continue # Lo ORIYA SIGN AVAGRAHA +0B3E ; XID_Continue # Mc ORIYA VOWEL SIGN AA +0B3F ; XID_Continue # Mn ORIYA VOWEL SIGN I +0B40 ; XID_Continue # Mc ORIYA VOWEL SIGN II +0B41..0B44 ; XID_Continue # Mn [4] ORIYA VOWEL SIGN U..ORIYA VOWEL SIGN VOCALIC RR +0B47..0B48 ; XID_Continue # Mc [2] ORIYA VOWEL SIGN E..ORIYA VOWEL SIGN AI +0B4B..0B4C ; XID_Continue # Mc [2] ORIYA VOWEL SIGN O..ORIYA VOWEL SIGN AU +0B4D ; XID_Continue # Mn ORIYA SIGN VIRAMA +0B56 ; XID_Continue # Mn ORIYA AI LENGTH MARK +0B57 ; XID_Continue # Mc ORIYA AU LENGTH MARK +0B5C..0B5D ; XID_Continue # Lo [2] ORIYA LETTER RRA..ORIYA LETTER RHA +0B5F..0B61 ; XID_Continue # Lo [3] ORIYA LETTER YYA..ORIYA LETTER VOCALIC LL +0B62..0B63 ; XID_Continue # Mn [2] ORIYA VOWEL SIGN VOCALIC L..ORIYA VOWEL SIGN VOCALIC LL +0B66..0B6F ; XID_Continue # Nd [10] ORIYA DIGIT ZERO..ORIYA DIGIT NINE +0B71 ; XID_Continue # Lo ORIYA LETTER WA +0B82 ; XID_Continue # Mn TAMIL SIGN ANUSVARA +0B83 ; XID_Continue # Lo TAMIL SIGN VISARGA +0B85..0B8A ; XID_Continue # Lo [6] TAMIL LETTER A..TAMIL LETTER UU +0B8E..0B90 ; XID_Continue # Lo [3] TAMIL LETTER E..TAMIL LETTER AI +0B92..0B95 ; XID_Continue # Lo [4] TAMIL LETTER O..TAMIL LETTER KA +0B99..0B9A ; XID_Continue # Lo [2] TAMIL LETTER NGA..TAMIL LETTER CA +0B9C ; XID_Continue # Lo TAMIL LETTER JA +0B9E..0B9F ; XID_Continue # Lo [2] TAMIL LETTER NYA..TAMIL LETTER TTA +0BA3..0BA4 ; XID_Continue # Lo [2] TAMIL LETTER NNA..TAMIL LETTER TA +0BA8..0BAA ; XID_Continue # Lo [3] TAMIL LETTER NA..TAMIL LETTER PA +0BAE..0BB9 ; XID_Continue # Lo [12] TAMIL LETTER MA..TAMIL LETTER HA +0BBE..0BBF ; XID_Continue # Mc [2] TAMIL VOWEL SIGN AA..TAMIL VOWEL SIGN I +0BC0 ; XID_Continue # Mn TAMIL VOWEL SIGN II +0BC1..0BC2 ; XID_Continue # Mc [2] TAMIL VOWEL SIGN U..TAMIL VOWEL SIGN UU +0BC6..0BC8 ; XID_Continue # Mc [3] TAMIL VOWEL SIGN E..TAMIL VOWEL SIGN AI +0BCA..0BCC ; XID_Continue # Mc [3] TAMIL VOWEL SIGN O..TAMIL VOWEL SIGN AU +0BCD ; XID_Continue # Mn TAMIL SIGN VIRAMA +0BD0 ; XID_Continue # Lo TAMIL OM +0BD7 ; XID_Continue # Mc TAMIL AU LENGTH MARK +0BE6..0BEF ; XID_Continue # Nd [10] TAMIL DIGIT ZERO..TAMIL DIGIT NINE +0C00 ; XID_Continue # Mn TELUGU SIGN COMBINING CANDRABINDU ABOVE +0C01..0C03 ; XID_Continue # Mc [3] TELUGU SIGN CANDRABINDU..TELUGU SIGN VISARGA +0C04 ; XID_Continue # Mn TELUGU SIGN COMBINING ANUSVARA ABOVE +0C05..0C0C ; XID_Continue # Lo [8] TELUGU LETTER A..TELUGU LETTER VOCALIC L +0C0E..0C10 ; XID_Continue # Lo [3] TELUGU LETTER E..TELUGU LETTER AI +0C12..0C28 ; XID_Continue # Lo [23] TELUGU LETTER O..TELUGU LETTER NA +0C2A..0C39 ; XID_Continue # Lo [16] TELUGU LETTER PA..TELUGU LETTER HA +0C3D ; XID_Continue # Lo TELUGU SIGN AVAGRAHA +0C3E..0C40 ; XID_Continue # Mn [3] TELUGU VOWEL SIGN AA..TELUGU VOWEL SIGN II +0C41..0C44 ; XID_Continue # Mc [4] TELUGU VOWEL SIGN U..TELUGU VOWEL SIGN VOCALIC RR +0C46..0C48 ; XID_Continue # Mn [3] TELUGU VOWEL SIGN E..TELUGU VOWEL SIGN AI +0C4A..0C4D ; XID_Continue # Mn [4] TELUGU VOWEL SIGN O..TELUGU SIGN VIRAMA +0C55..0C56 ; XID_Continue # Mn [2] TELUGU LENGTH MARK..TELUGU AI LENGTH MARK +0C58..0C5A ; XID_Continue # Lo [3] TELUGU LETTER TSA..TELUGU LETTER RRRA +0C60..0C61 ; XID_Continue # Lo [2] TELUGU LETTER VOCALIC RR..TELUGU LETTER VOCALIC LL +0C62..0C63 ; XID_Continue # Mn [2] TELUGU VOWEL SIGN VOCALIC L..TELUGU VOWEL SIGN VOCALIC LL +0C66..0C6F ; XID_Continue # Nd [10] TELUGU DIGIT ZERO..TELUGU DIGIT NINE +0C80 ; XID_Continue # Lo KANNADA SIGN SPACING CANDRABINDU +0C81 ; XID_Continue # Mn KANNADA SIGN CANDRABINDU +0C82..0C83 ; XID_Continue # Mc [2] KANNADA SIGN ANUSVARA..KANNADA SIGN VISARGA +0C85..0C8C ; XID_Continue # Lo [8] KANNADA LETTER A..KANNADA LETTER VOCALIC L +0C8E..0C90 ; XID_Continue # Lo [3] KANNADA LETTER E..KANNADA LETTER AI +0C92..0CA8 ; XID_Continue # Lo [23] KANNADA LETTER O..KANNADA LETTER NA +0CAA..0CB3 ; XID_Continue # Lo [10] KANNADA LETTER PA..KANNADA LETTER LLA +0CB5..0CB9 ; XID_Continue # Lo [5] KANNADA LETTER VA..KANNADA LETTER HA +0CBC ; XID_Continue # Mn KANNADA SIGN NUKTA +0CBD ; XID_Continue # Lo KANNADA SIGN AVAGRAHA +0CBE ; XID_Continue # Mc KANNADA VOWEL SIGN AA +0CBF ; XID_Continue # Mn KANNADA VOWEL SIGN I +0CC0..0CC4 ; XID_Continue # Mc [5] KANNADA VOWEL SIGN II..KANNADA VOWEL SIGN VOCALIC RR +0CC6 ; XID_Continue # Mn KANNADA VOWEL SIGN E +0CC7..0CC8 ; XID_Continue # Mc [2] KANNADA VOWEL SIGN EE..KANNADA VOWEL SIGN AI +0CCA..0CCB ; XID_Continue # Mc [2] KANNADA VOWEL SIGN O..KANNADA VOWEL SIGN OO +0CCC..0CCD ; XID_Continue # Mn [2] KANNADA VOWEL SIGN AU..KANNADA SIGN VIRAMA +0CD5..0CD6 ; XID_Continue # Mc [2] KANNADA LENGTH MARK..KANNADA AI LENGTH MARK +0CDE ; XID_Continue # Lo KANNADA LETTER FA +0CE0..0CE1 ; XID_Continue # Lo [2] KANNADA LETTER VOCALIC RR..KANNADA LETTER VOCALIC LL +0CE2..0CE3 ; XID_Continue # Mn [2] KANNADA VOWEL SIGN VOCALIC L..KANNADA VOWEL SIGN VOCALIC LL +0CE6..0CEF ; XID_Continue # Nd [10] KANNADA DIGIT ZERO..KANNADA DIGIT NINE +0CF1..0CF2 ; XID_Continue # Lo [2] KANNADA SIGN JIHVAMULIYA..KANNADA SIGN UPADHMANIYA +0D00..0D01 ; XID_Continue # Mn [2] MALAYALAM SIGN COMBINING ANUSVARA ABOVE..MALAYALAM SIGN CANDRABINDU +0D02..0D03 ; XID_Continue # Mc [2] MALAYALAM SIGN ANUSVARA..MALAYALAM SIGN VISARGA +0D05..0D0C ; XID_Continue # Lo [8] MALAYALAM LETTER A..MALAYALAM LETTER VOCALIC L +0D0E..0D10 ; XID_Continue # Lo [3] MALAYALAM LETTER E..MALAYALAM LETTER AI +0D12..0D3A ; XID_Continue # Lo [41] MALAYALAM LETTER O..MALAYALAM LETTER TTTA +0D3B..0D3C ; XID_Continue # Mn [2] MALAYALAM SIGN VERTICAL BAR VIRAMA..MALAYALAM SIGN CIRCULAR VIRAMA +0D3D ; XID_Continue # Lo MALAYALAM SIGN AVAGRAHA +0D3E..0D40 ; XID_Continue # Mc [3] MALAYALAM VOWEL SIGN AA..MALAYALAM VOWEL SIGN II +0D41..0D44 ; XID_Continue # Mn [4] MALAYALAM VOWEL SIGN U..MALAYALAM VOWEL SIGN VOCALIC RR +0D46..0D48 ; XID_Continue # Mc [3] MALAYALAM VOWEL SIGN E..MALAYALAM VOWEL SIGN AI +0D4A..0D4C ; XID_Continue # Mc [3] MALAYALAM VOWEL SIGN O..MALAYALAM VOWEL SIGN AU +0D4D ; XID_Continue # Mn MALAYALAM SIGN VIRAMA +0D4E ; XID_Continue # Lo MALAYALAM LETTER DOT REPH +0D54..0D56 ; XID_Continue # Lo [3] MALAYALAM LETTER CHILLU M..MALAYALAM LETTER CHILLU LLL +0D57 ; XID_Continue # Mc MALAYALAM AU LENGTH MARK +0D5F..0D61 ; XID_Continue # Lo [3] MALAYALAM LETTER ARCHAIC II..MALAYALAM LETTER VOCALIC LL +0D62..0D63 ; XID_Continue # Mn [2] MALAYALAM VOWEL SIGN VOCALIC L..MALAYALAM VOWEL SIGN VOCALIC LL +0D66..0D6F ; XID_Continue # Nd [10] MALAYALAM DIGIT ZERO..MALAYALAM DIGIT NINE +0D7A..0D7F ; XID_Continue # Lo [6] MALAYALAM LETTER CHILLU NN..MALAYALAM LETTER CHILLU K +0D82..0D83 ; XID_Continue # Mc [2] SINHALA SIGN ANUSVARAYA..SINHALA SIGN VISARGAYA +0D85..0D96 ; XID_Continue # Lo [18] SINHALA LETTER AYANNA..SINHALA LETTER AUYANNA +0D9A..0DB1 ; XID_Continue # Lo [24] SINHALA LETTER ALPAPRAANA KAYANNA..SINHALA LETTER DANTAJA NAYANNA +0DB3..0DBB ; XID_Continue # Lo [9] SINHALA LETTER SANYAKA DAYANNA..SINHALA LETTER RAYANNA +0DBD ; XID_Continue # Lo SINHALA LETTER DANTAJA LAYANNA +0DC0..0DC6 ; XID_Continue # Lo [7] SINHALA LETTER VAYANNA..SINHALA LETTER FAYANNA +0DCA ; XID_Continue # Mn SINHALA SIGN AL-LAKUNA +0DCF..0DD1 ; XID_Continue # Mc [3] SINHALA VOWEL SIGN AELA-PILLA..SINHALA VOWEL SIGN DIGA AEDA-PILLA +0DD2..0DD4 ; XID_Continue # Mn [3] SINHALA VOWEL SIGN KETTI IS-PILLA..SINHALA VOWEL SIGN KETTI PAA-PILLA +0DD6 ; XID_Continue # Mn SINHALA VOWEL SIGN DIGA PAA-PILLA +0DD8..0DDF ; XID_Continue # Mc [8] SINHALA VOWEL SIGN GAETTA-PILLA..SINHALA VOWEL SIGN GAYANUKITTA +0DE6..0DEF ; XID_Continue # Nd [10] SINHALA LITH DIGIT ZERO..SINHALA LITH DIGIT NINE +0DF2..0DF3 ; XID_Continue # Mc [2] SINHALA VOWEL SIGN DIGA GAETTA-PILLA..SINHALA VOWEL SIGN DIGA GAYANUKITTA +0E01..0E30 ; XID_Continue # Lo [48] THAI CHARACTER KO KAI..THAI CHARACTER SARA A +0E31 ; XID_Continue # Mn THAI CHARACTER MAI HAN-AKAT +0E32..0E33 ; XID_Continue # Lo [2] THAI CHARACTER SARA AA..THAI CHARACTER SARA AM +0E34..0E3A ; XID_Continue # Mn [7] THAI CHARACTER SARA I..THAI CHARACTER PHINTHU +0E40..0E45 ; XID_Continue # Lo [6] THAI CHARACTER SARA E..THAI CHARACTER LAKKHANGYAO +0E46 ; XID_Continue # Lm THAI CHARACTER MAIYAMOK +0E47..0E4E ; XID_Continue # Mn [8] THAI CHARACTER MAITAIKHU..THAI CHARACTER YAMAKKAN +0E50..0E59 ; XID_Continue # Nd [10] THAI DIGIT ZERO..THAI DIGIT NINE +0E81..0E82 ; XID_Continue # Lo [2] LAO LETTER KO..LAO LETTER KHO SUNG +0E84 ; XID_Continue # Lo LAO LETTER KHO TAM +0E87..0E88 ; XID_Continue # Lo [2] LAO LETTER NGO..LAO LETTER CO +0E8A ; XID_Continue # Lo LAO LETTER SO TAM +0E8D ; XID_Continue # Lo LAO LETTER NYO +0E94..0E97 ; XID_Continue # Lo [4] LAO LETTER DO..LAO LETTER THO TAM +0E99..0E9F ; XID_Continue # Lo [7] LAO LETTER NO..LAO LETTER FO SUNG +0EA1..0EA3 ; XID_Continue # Lo [3] LAO LETTER MO..LAO LETTER LO LING +0EA5 ; XID_Continue # Lo LAO LETTER LO LOOT +0EA7 ; XID_Continue # Lo LAO LETTER WO +0EAA..0EAB ; XID_Continue # Lo [2] LAO LETTER SO SUNG..LAO LETTER HO SUNG +0EAD..0EB0 ; XID_Continue # Lo [4] LAO LETTER O..LAO VOWEL SIGN A +0EB1 ; XID_Continue # Mn LAO VOWEL SIGN MAI KAN +0EB2..0EB3 ; XID_Continue # Lo [2] LAO VOWEL SIGN AA..LAO VOWEL SIGN AM +0EB4..0EB9 ; XID_Continue # Mn [6] LAO VOWEL SIGN I..LAO VOWEL SIGN UU +0EBB..0EBC ; XID_Continue # Mn [2] LAO VOWEL SIGN MAI KON..LAO SEMIVOWEL SIGN LO +0EBD ; XID_Continue # Lo LAO SEMIVOWEL SIGN NYO +0EC0..0EC4 ; XID_Continue # Lo [5] LAO VOWEL SIGN E..LAO VOWEL SIGN AI +0EC6 ; XID_Continue # Lm LAO KO LA +0EC8..0ECD ; XID_Continue # Mn [6] LAO TONE MAI EK..LAO NIGGAHITA +0ED0..0ED9 ; XID_Continue # Nd [10] LAO DIGIT ZERO..LAO DIGIT NINE +0EDC..0EDF ; XID_Continue # Lo [4] LAO HO NO..LAO LETTER KHMU NYO +0F00 ; XID_Continue # Lo TIBETAN SYLLABLE OM +0F18..0F19 ; XID_Continue # Mn [2] TIBETAN ASTROLOGICAL SIGN -KHYUD PA..TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS +0F20..0F29 ; XID_Continue # Nd [10] TIBETAN DIGIT ZERO..TIBETAN DIGIT NINE +0F35 ; XID_Continue # Mn TIBETAN MARK NGAS BZUNG NYI ZLA +0F37 ; XID_Continue # Mn TIBETAN MARK NGAS BZUNG SGOR RTAGS +0F39 ; XID_Continue # Mn TIBETAN MARK TSA -PHRU +0F3E..0F3F ; XID_Continue # Mc [2] TIBETAN SIGN YAR TSHES..TIBETAN SIGN MAR TSHES +0F40..0F47 ; XID_Continue # Lo [8] TIBETAN LETTER KA..TIBETAN LETTER JA +0F49..0F6C ; XID_Continue # Lo [36] TIBETAN LETTER NYA..TIBETAN LETTER RRA +0F71..0F7E ; XID_Continue # Mn [14] TIBETAN VOWEL SIGN AA..TIBETAN SIGN RJES SU NGA RO +0F7F ; XID_Continue # Mc TIBETAN SIGN RNAM BCAD +0F80..0F84 ; XID_Continue # Mn [5] TIBETAN VOWEL SIGN REVERSED I..TIBETAN MARK HALANTA +0F86..0F87 ; XID_Continue # Mn [2] TIBETAN SIGN LCI RTAGS..TIBETAN SIGN YANG RTAGS +0F88..0F8C ; XID_Continue # Lo [5] TIBETAN SIGN LCE TSA CAN..TIBETAN SIGN INVERTED MCHU CAN +0F8D..0F97 ; XID_Continue # Mn [11] TIBETAN SUBJOINED SIGN LCE TSA CAN..TIBETAN SUBJOINED LETTER JA +0F99..0FBC ; XID_Continue # Mn [36] TIBETAN SUBJOINED LETTER NYA..TIBETAN SUBJOINED LETTER FIXED-FORM RA +0FC6 ; XID_Continue # Mn TIBETAN SYMBOL PADMA GDAN +1000..102A ; XID_Continue # Lo [43] MYANMAR LETTER KA..MYANMAR LETTER AU +102B..102C ; XID_Continue # Mc [2] MYANMAR VOWEL SIGN TALL AA..MYANMAR VOWEL SIGN AA +102D..1030 ; XID_Continue # Mn [4] MYANMAR VOWEL SIGN I..MYANMAR VOWEL SIGN UU +1031 ; XID_Continue # Mc MYANMAR VOWEL SIGN E +1032..1037 ; XID_Continue # Mn [6] MYANMAR VOWEL SIGN AI..MYANMAR SIGN DOT BELOW +1038 ; XID_Continue # Mc MYANMAR SIGN VISARGA +1039..103A ; XID_Continue # Mn [2] MYANMAR SIGN VIRAMA..MYANMAR SIGN ASAT +103B..103C ; XID_Continue # Mc [2] MYANMAR CONSONANT SIGN MEDIAL YA..MYANMAR CONSONANT SIGN MEDIAL RA +103D..103E ; XID_Continue # Mn [2] MYANMAR CONSONANT SIGN MEDIAL WA..MYANMAR CONSONANT SIGN MEDIAL HA +103F ; XID_Continue # Lo MYANMAR LETTER GREAT SA +1040..1049 ; XID_Continue # Nd [10] MYANMAR DIGIT ZERO..MYANMAR DIGIT NINE +1050..1055 ; XID_Continue # Lo [6] MYANMAR LETTER SHA..MYANMAR LETTER VOCALIC LL +1056..1057 ; XID_Continue # Mc [2] MYANMAR VOWEL SIGN VOCALIC R..MYANMAR VOWEL SIGN VOCALIC RR +1058..1059 ; XID_Continue # Mn [2] MYANMAR VOWEL SIGN VOCALIC L..MYANMAR VOWEL SIGN VOCALIC LL +105A..105D ; XID_Continue # Lo [4] MYANMAR LETTER MON NGA..MYANMAR LETTER MON BBE +105E..1060 ; XID_Continue # Mn [3] MYANMAR CONSONANT SIGN MON MEDIAL NA..MYANMAR CONSONANT SIGN MON MEDIAL LA +1061 ; XID_Continue # Lo MYANMAR LETTER SGAW KAREN SHA +1062..1064 ; XID_Continue # Mc [3] MYANMAR VOWEL SIGN SGAW KAREN EU..MYANMAR TONE MARK SGAW KAREN KE PHO +1065..1066 ; XID_Continue # Lo [2] MYANMAR LETTER WESTERN PWO KAREN THA..MYANMAR LETTER WESTERN PWO KAREN PWA +1067..106D ; XID_Continue # Mc [7] MYANMAR VOWEL SIGN WESTERN PWO KAREN EU..MYANMAR SIGN WESTERN PWO KAREN TONE-5 +106E..1070 ; XID_Continue # Lo [3] MYANMAR LETTER EASTERN PWO KAREN NNA..MYANMAR LETTER EASTERN PWO KAREN GHWA +1071..1074 ; XID_Continue # Mn [4] MYANMAR VOWEL SIGN GEBA KAREN I..MYANMAR VOWEL SIGN KAYAH EE +1075..1081 ; XID_Continue # Lo [13] MYANMAR LETTER SHAN KA..MYANMAR LETTER SHAN HA +1082 ; XID_Continue # Mn MYANMAR CONSONANT SIGN SHAN MEDIAL WA +1083..1084 ; XID_Continue # Mc [2] MYANMAR VOWEL SIGN SHAN AA..MYANMAR VOWEL SIGN SHAN E +1085..1086 ; XID_Continue # Mn [2] MYANMAR VOWEL SIGN SHAN E ABOVE..MYANMAR VOWEL SIGN SHAN FINAL Y +1087..108C ; XID_Continue # Mc [6] MYANMAR SIGN SHAN TONE-2..MYANMAR SIGN SHAN COUNCIL TONE-3 +108D ; XID_Continue # Mn MYANMAR SIGN SHAN COUNCIL EMPHATIC TONE +108E ; XID_Continue # Lo MYANMAR LETTER RUMAI PALAUNG FA +108F ; XID_Continue # Mc MYANMAR SIGN RUMAI PALAUNG TONE-5 +1090..1099 ; XID_Continue # Nd [10] MYANMAR SHAN DIGIT ZERO..MYANMAR SHAN DIGIT NINE +109A..109C ; XID_Continue # Mc [3] MYANMAR SIGN KHAMTI TONE-1..MYANMAR VOWEL SIGN AITON A +109D ; XID_Continue # Mn MYANMAR VOWEL SIGN AITON AI +10A0..10C5 ; XID_Continue # L& [38] GEORGIAN CAPITAL LETTER AN..GEORGIAN CAPITAL LETTER HOE +10C7 ; XID_Continue # L& GEORGIAN CAPITAL LETTER YN +10CD ; XID_Continue # L& GEORGIAN CAPITAL LETTER AEN +10D0..10FA ; XID_Continue # L& [43] GEORGIAN LETTER AN..GEORGIAN LETTER AIN +10FC ; XID_Continue # Lm MODIFIER LETTER GEORGIAN NAR +10FD..10FF ; XID_Continue # L& [3] GEORGIAN LETTER AEN..GEORGIAN LETTER LABIAL SIGN +1100..1248 ; XID_Continue # Lo [329] HANGUL CHOSEONG KIYEOK..ETHIOPIC SYLLABLE QWA +124A..124D ; XID_Continue # Lo [4] ETHIOPIC SYLLABLE QWI..ETHIOPIC SYLLABLE QWE +1250..1256 ; XID_Continue # Lo [7] ETHIOPIC SYLLABLE QHA..ETHIOPIC SYLLABLE QHO +1258 ; XID_Continue # Lo ETHIOPIC SYLLABLE QHWA +125A..125D ; XID_Continue # Lo [4] ETHIOPIC SYLLABLE QHWI..ETHIOPIC SYLLABLE QHWE +1260..1288 ; XID_Continue # Lo [41] ETHIOPIC SYLLABLE BA..ETHIOPIC SYLLABLE XWA +128A..128D ; XID_Continue # Lo [4] ETHIOPIC SYLLABLE XWI..ETHIOPIC SYLLABLE XWE +1290..12B0 ; XID_Continue # Lo [33] ETHIOPIC SYLLABLE NA..ETHIOPIC SYLLABLE KWA +12B2..12B5 ; XID_Continue # Lo [4] ETHIOPIC SYLLABLE KWI..ETHIOPIC SYLLABLE KWE +12B8..12BE ; XID_Continue # Lo [7] ETHIOPIC SYLLABLE KXA..ETHIOPIC SYLLABLE KXO +12C0 ; XID_Continue # Lo ETHIOPIC SYLLABLE KXWA +12C2..12C5 ; XID_Continue # Lo [4] ETHIOPIC SYLLABLE KXWI..ETHIOPIC SYLLABLE KXWE +12C8..12D6 ; XID_Continue # Lo [15] ETHIOPIC SYLLABLE WA..ETHIOPIC SYLLABLE PHARYNGEAL O +12D8..1310 ; XID_Continue # Lo [57] ETHIOPIC SYLLABLE ZA..ETHIOPIC SYLLABLE GWA +1312..1315 ; XID_Continue # Lo [4] ETHIOPIC SYLLABLE GWI..ETHIOPIC SYLLABLE GWE +1318..135A ; XID_Continue # Lo [67] ETHIOPIC SYLLABLE GGA..ETHIOPIC SYLLABLE FYA +135D..135F ; XID_Continue # Mn [3] ETHIOPIC COMBINING GEMINATION AND VOWEL LENGTH MARK..ETHIOPIC COMBINING GEMINATION MARK +1369..1371 ; XID_Continue # No [9] ETHIOPIC DIGIT ONE..ETHIOPIC DIGIT NINE +1380..138F ; XID_Continue # Lo [16] ETHIOPIC SYLLABLE SEBATBEIT MWA..ETHIOPIC SYLLABLE PWE +13A0..13F5 ; XID_Continue # L& [86] CHEROKEE LETTER A..CHEROKEE LETTER MV +13F8..13FD ; XID_Continue # L& [6] CHEROKEE SMALL LETTER YE..CHEROKEE SMALL LETTER MV +1401..166C ; XID_Continue # Lo [620] CANADIAN SYLLABICS E..CANADIAN SYLLABICS CARRIER TTSA +166F..167F ; XID_Continue # Lo [17] CANADIAN SYLLABICS QAI..CANADIAN SYLLABICS BLACKFOOT W +1681..169A ; XID_Continue # Lo [26] OGHAM LETTER BEITH..OGHAM LETTER PEITH +16A0..16EA ; XID_Continue # Lo [75] RUNIC LETTER FEHU FEOH FE F..RUNIC LETTER X +16EE..16F0 ; XID_Continue # Nl [3] RUNIC ARLAUG SYMBOL..RUNIC BELGTHOR SYMBOL +16F1..16F8 ; XID_Continue # Lo [8] RUNIC LETTER K..RUNIC LETTER FRANKS CASKET AESC +1700..170C ; XID_Continue # Lo [13] TAGALOG LETTER A..TAGALOG LETTER YA +170E..1711 ; XID_Continue # Lo [4] TAGALOG LETTER LA..TAGALOG LETTER HA +1712..1714 ; XID_Continue # Mn [3] TAGALOG VOWEL SIGN I..TAGALOG SIGN VIRAMA +1720..1731 ; XID_Continue # Lo [18] HANUNOO LETTER A..HANUNOO LETTER HA +1732..1734 ; XID_Continue # Mn [3] HANUNOO VOWEL SIGN I..HANUNOO SIGN PAMUDPOD +1740..1751 ; XID_Continue # Lo [18] BUHID LETTER A..BUHID LETTER HA +1752..1753 ; XID_Continue # Mn [2] BUHID VOWEL SIGN I..BUHID VOWEL SIGN U +1760..176C ; XID_Continue # Lo [13] TAGBANWA LETTER A..TAGBANWA LETTER YA +176E..1770 ; XID_Continue # Lo [3] TAGBANWA LETTER LA..TAGBANWA LETTER SA +1772..1773 ; XID_Continue # Mn [2] TAGBANWA VOWEL SIGN I..TAGBANWA VOWEL SIGN U +1780..17B3 ; XID_Continue # Lo [52] KHMER LETTER KA..KHMER INDEPENDENT VOWEL QAU +17B4..17B5 ; XID_Continue # Mn [2] KHMER VOWEL INHERENT AQ..KHMER VOWEL INHERENT AA +17B6 ; XID_Continue # Mc KHMER VOWEL SIGN AA +17B7..17BD ; XID_Continue # Mn [7] KHMER VOWEL SIGN I..KHMER VOWEL SIGN UA +17BE..17C5 ; XID_Continue # Mc [8] KHMER VOWEL SIGN OE..KHMER VOWEL SIGN AU +17C6 ; XID_Continue # Mn KHMER SIGN NIKAHIT +17C7..17C8 ; XID_Continue # Mc [2] KHMER SIGN REAHMUK..KHMER SIGN YUUKALEAPINTU +17C9..17D3 ; XID_Continue # Mn [11] KHMER SIGN MUUSIKATOAN..KHMER SIGN BATHAMASAT +17D7 ; XID_Continue # Lm KHMER SIGN LEK TOO +17DC ; XID_Continue # Lo KHMER SIGN AVAKRAHASANYA +17DD ; XID_Continue # Mn KHMER SIGN ATTHACAN +17E0..17E9 ; XID_Continue # Nd [10] KHMER DIGIT ZERO..KHMER DIGIT NINE +180B..180D ; XID_Continue # Mn [3] MONGOLIAN FREE VARIATION SELECTOR ONE..MONGOLIAN FREE VARIATION SELECTOR THREE +1810..1819 ; XID_Continue # Nd [10] MONGOLIAN DIGIT ZERO..MONGOLIAN DIGIT NINE +1820..1842 ; XID_Continue # Lo [35] MONGOLIAN LETTER A..MONGOLIAN LETTER CHI +1843 ; XID_Continue # Lm MONGOLIAN LETTER TODO LONG VOWEL SIGN +1844..1878 ; XID_Continue # Lo [53] MONGOLIAN LETTER TODO E..MONGOLIAN LETTER CHA WITH TWO DOTS +1880..1884 ; XID_Continue # Lo [5] MONGOLIAN LETTER ALI GALI ANUSVARA ONE..MONGOLIAN LETTER ALI GALI INVERTED UBADAMA +1885..1886 ; XID_Continue # Mn [2] MONGOLIAN LETTER ALI GALI BALUDA..MONGOLIAN LETTER ALI GALI THREE BALUDA +1887..18A8 ; XID_Continue # Lo [34] MONGOLIAN LETTER ALI GALI A..MONGOLIAN LETTER MANCHU ALI GALI BHA +18A9 ; XID_Continue # Mn MONGOLIAN LETTER ALI GALI DAGALGA +18AA ; XID_Continue # Lo MONGOLIAN LETTER MANCHU ALI GALI LHA +18B0..18F5 ; XID_Continue # Lo [70] CANADIAN SYLLABICS OY..CANADIAN SYLLABICS CARRIER DENTAL S +1900..191E ; XID_Continue # Lo [31] LIMBU VOWEL-CARRIER LETTER..LIMBU LETTER TRA +1920..1922 ; XID_Continue # Mn [3] LIMBU VOWEL SIGN A..LIMBU VOWEL SIGN U +1923..1926 ; XID_Continue # Mc [4] LIMBU VOWEL SIGN EE..LIMBU VOWEL SIGN AU +1927..1928 ; XID_Continue # Mn [2] LIMBU VOWEL SIGN E..LIMBU VOWEL SIGN O +1929..192B ; XID_Continue # Mc [3] LIMBU SUBJOINED LETTER YA..LIMBU SUBJOINED LETTER WA +1930..1931 ; XID_Continue # Mc [2] LIMBU SMALL LETTER KA..LIMBU SMALL LETTER NGA +1932 ; XID_Continue # Mn LIMBU SMALL LETTER ANUSVARA +1933..1938 ; XID_Continue # Mc [6] LIMBU SMALL LETTER TA..LIMBU SMALL LETTER LA +1939..193B ; XID_Continue # Mn [3] LIMBU SIGN MUKPHRENG..LIMBU SIGN SA-I +1946..194F ; XID_Continue # Nd [10] LIMBU DIGIT ZERO..LIMBU DIGIT NINE +1950..196D ; XID_Continue # Lo [30] TAI LE LETTER KA..TAI LE LETTER AI +1970..1974 ; XID_Continue # Lo [5] TAI LE LETTER TONE-2..TAI LE LETTER TONE-6 +1980..19AB ; XID_Continue # Lo [44] NEW TAI LUE LETTER HIGH QA..NEW TAI LUE LETTER LOW SUA +19B0..19C9 ; XID_Continue # Lo [26] NEW TAI LUE VOWEL SIGN VOWEL SHORTENER..NEW TAI LUE TONE MARK-2 +19D0..19D9 ; XID_Continue # Nd [10] NEW TAI LUE DIGIT ZERO..NEW TAI LUE DIGIT NINE +19DA ; XID_Continue # No NEW TAI LUE THAM DIGIT ONE +1A00..1A16 ; XID_Continue # Lo [23] BUGINESE LETTER KA..BUGINESE LETTER HA +1A17..1A18 ; XID_Continue # Mn [2] BUGINESE VOWEL SIGN I..BUGINESE VOWEL SIGN U +1A19..1A1A ; XID_Continue # Mc [2] BUGINESE VOWEL SIGN E..BUGINESE VOWEL SIGN O +1A1B ; XID_Continue # Mn BUGINESE VOWEL SIGN AE +1A20..1A54 ; XID_Continue # Lo [53] TAI THAM LETTER HIGH KA..TAI THAM LETTER GREAT SA +1A55 ; XID_Continue # Mc TAI THAM CONSONANT SIGN MEDIAL RA +1A56 ; XID_Continue # Mn TAI THAM CONSONANT SIGN MEDIAL LA +1A57 ; XID_Continue # Mc TAI THAM CONSONANT SIGN LA TANG LAI +1A58..1A5E ; XID_Continue # Mn [7] TAI THAM SIGN MAI KANG LAI..TAI THAM CONSONANT SIGN SA +1A60 ; XID_Continue # Mn TAI THAM SIGN SAKOT +1A61 ; XID_Continue # Mc TAI THAM VOWEL SIGN A +1A62 ; XID_Continue # Mn TAI THAM VOWEL SIGN MAI SAT +1A63..1A64 ; XID_Continue # Mc [2] TAI THAM VOWEL SIGN AA..TAI THAM VOWEL SIGN TALL AA +1A65..1A6C ; XID_Continue # Mn [8] TAI THAM VOWEL SIGN I..TAI THAM VOWEL SIGN OA BELOW +1A6D..1A72 ; XID_Continue # Mc [6] TAI THAM VOWEL SIGN OY..TAI THAM VOWEL SIGN THAM AI +1A73..1A7C ; XID_Continue # Mn [10] TAI THAM VOWEL SIGN OA ABOVE..TAI THAM SIGN KHUEN-LUE KARAN +1A7F ; XID_Continue # Mn TAI THAM COMBINING CRYPTOGRAMMIC DOT +1A80..1A89 ; XID_Continue # Nd [10] TAI THAM HORA DIGIT ZERO..TAI THAM HORA DIGIT NINE +1A90..1A99 ; XID_Continue # Nd [10] TAI THAM THAM DIGIT ZERO..TAI THAM THAM DIGIT NINE +1AA7 ; XID_Continue # Lm TAI THAM SIGN MAI YAMOK +1AB0..1ABD ; XID_Continue # Mn [14] COMBINING DOUBLED CIRCUMFLEX ACCENT..COMBINING PARENTHESES BELOW +1B00..1B03 ; XID_Continue # Mn [4] BALINESE SIGN ULU RICEM..BALINESE SIGN SURANG +1B04 ; XID_Continue # Mc BALINESE SIGN BISAH +1B05..1B33 ; XID_Continue # Lo [47] BALINESE LETTER AKARA..BALINESE LETTER HA +1B34 ; XID_Continue # Mn BALINESE SIGN REREKAN +1B35 ; XID_Continue # Mc BALINESE VOWEL SIGN TEDUNG +1B36..1B3A ; XID_Continue # Mn [5] BALINESE VOWEL SIGN ULU..BALINESE VOWEL SIGN RA REPA +1B3B ; XID_Continue # Mc BALINESE VOWEL SIGN RA REPA TEDUNG +1B3C ; XID_Continue # Mn BALINESE VOWEL SIGN LA LENGA +1B3D..1B41 ; XID_Continue # Mc [5] BALINESE VOWEL SIGN LA LENGA TEDUNG..BALINESE VOWEL SIGN TALING REPA TEDUNG +1B42 ; XID_Continue # Mn BALINESE VOWEL SIGN PEPET +1B43..1B44 ; XID_Continue # Mc [2] BALINESE VOWEL SIGN PEPET TEDUNG..BALINESE ADEG ADEG +1B45..1B4B ; XID_Continue # Lo [7] BALINESE LETTER KAF SASAK..BALINESE LETTER ASYURA SASAK +1B50..1B59 ; XID_Continue # Nd [10] BALINESE DIGIT ZERO..BALINESE DIGIT NINE +1B6B..1B73 ; XID_Continue # Mn [9] BALINESE MUSICAL SYMBOL COMBINING TEGEH..BALINESE MUSICAL SYMBOL COMBINING GONG +1B80..1B81 ; XID_Continue # Mn [2] SUNDANESE SIGN PANYECEK..SUNDANESE SIGN PANGLAYAR +1B82 ; XID_Continue # Mc SUNDANESE SIGN PANGWISAD +1B83..1BA0 ; XID_Continue # Lo [30] SUNDANESE LETTER A..SUNDANESE LETTER HA +1BA1 ; XID_Continue # Mc SUNDANESE CONSONANT SIGN PAMINGKAL +1BA2..1BA5 ; XID_Continue # Mn [4] SUNDANESE CONSONANT SIGN PANYAKRA..SUNDANESE VOWEL SIGN PANYUKU +1BA6..1BA7 ; XID_Continue # Mc [2] SUNDANESE VOWEL SIGN PANAELAENG..SUNDANESE VOWEL SIGN PANOLONG +1BA8..1BA9 ; XID_Continue # Mn [2] SUNDANESE VOWEL SIGN PAMEPET..SUNDANESE VOWEL SIGN PANEULEUNG +1BAA ; XID_Continue # Mc SUNDANESE SIGN PAMAAEH +1BAB..1BAD ; XID_Continue # Mn [3] SUNDANESE SIGN VIRAMA..SUNDANESE CONSONANT SIGN PASANGAN WA +1BAE..1BAF ; XID_Continue # Lo [2] SUNDANESE LETTER KHA..SUNDANESE LETTER SYA +1BB0..1BB9 ; XID_Continue # Nd [10] SUNDANESE DIGIT ZERO..SUNDANESE DIGIT NINE +1BBA..1BE5 ; XID_Continue # Lo [44] SUNDANESE AVAGRAHA..BATAK LETTER U +1BE6 ; XID_Continue # Mn BATAK SIGN TOMPI +1BE7 ; XID_Continue # Mc BATAK VOWEL SIGN E +1BE8..1BE9 ; XID_Continue # Mn [2] BATAK VOWEL SIGN PAKPAK E..BATAK VOWEL SIGN EE +1BEA..1BEC ; XID_Continue # Mc [3] BATAK VOWEL SIGN I..BATAK VOWEL SIGN O +1BED ; XID_Continue # Mn BATAK VOWEL SIGN KARO O +1BEE ; XID_Continue # Mc BATAK VOWEL SIGN U +1BEF..1BF1 ; XID_Continue # Mn [3] BATAK VOWEL SIGN U FOR SIMALUNGUN SA..BATAK CONSONANT SIGN H +1BF2..1BF3 ; XID_Continue # Mc [2] BATAK PANGOLAT..BATAK PANONGONAN +1C00..1C23 ; XID_Continue # Lo [36] LEPCHA LETTER KA..LEPCHA LETTER A +1C24..1C2B ; XID_Continue # Mc [8] LEPCHA SUBJOINED LETTER YA..LEPCHA VOWEL SIGN UU +1C2C..1C33 ; XID_Continue # Mn [8] LEPCHA VOWEL SIGN E..LEPCHA CONSONANT SIGN T +1C34..1C35 ; XID_Continue # Mc [2] LEPCHA CONSONANT SIGN NYIN-DO..LEPCHA CONSONANT SIGN KANG +1C36..1C37 ; XID_Continue # Mn [2] LEPCHA SIGN RAN..LEPCHA SIGN NUKTA +1C40..1C49 ; XID_Continue # Nd [10] LEPCHA DIGIT ZERO..LEPCHA DIGIT NINE +1C4D..1C4F ; XID_Continue # Lo [3] LEPCHA LETTER TTA..LEPCHA LETTER DDA +1C50..1C59 ; XID_Continue # Nd [10] OL CHIKI DIGIT ZERO..OL CHIKI DIGIT NINE +1C5A..1C77 ; XID_Continue # Lo [30] OL CHIKI LETTER LA..OL CHIKI LETTER OH +1C78..1C7D ; XID_Continue # Lm [6] OL CHIKI MU TTUDDAG..OL CHIKI AHAD +1C80..1C88 ; XID_Continue # L& [9] CYRILLIC SMALL LETTER ROUNDED VE..CYRILLIC SMALL LETTER UNBLENDED UK +1C90..1CBA ; XID_Continue # L& [43] GEORGIAN MTAVRULI CAPITAL LETTER AN..GEORGIAN MTAVRULI CAPITAL LETTER AIN +1CBD..1CBF ; XID_Continue # L& [3] GEORGIAN MTAVRULI CAPITAL LETTER AEN..GEORGIAN MTAVRULI CAPITAL LETTER LABIAL SIGN +1CD0..1CD2 ; XID_Continue # Mn [3] VEDIC TONE KARSHANA..VEDIC TONE PRENKHA +1CD4..1CE0 ; XID_Continue # Mn [13] VEDIC SIGN YAJURVEDIC MIDLINE SVARITA..VEDIC TONE RIGVEDIC KASHMIRI INDEPENDENT SVARITA +1CE1 ; XID_Continue # Mc VEDIC TONE ATHARVAVEDIC INDEPENDENT SVARITA +1CE2..1CE8 ; XID_Continue # Mn [7] VEDIC SIGN VISARGA SVARITA..VEDIC SIGN VISARGA ANUDATTA WITH TAIL +1CE9..1CEC ; XID_Continue # Lo [4] VEDIC SIGN ANUSVARA ANTARGOMUKHA..VEDIC SIGN ANUSVARA VAMAGOMUKHA WITH TAIL +1CED ; XID_Continue # Mn VEDIC SIGN TIRYAK +1CEE..1CF1 ; XID_Continue # Lo [4] VEDIC SIGN HEXIFORM LONG ANUSVARA..VEDIC SIGN ANUSVARA UBHAYATO MUKHA +1CF2..1CF3 ; XID_Continue # Mc [2] VEDIC SIGN ARDHAVISARGA..VEDIC SIGN ROTATED ARDHAVISARGA +1CF4 ; XID_Continue # Mn VEDIC TONE CANDRA ABOVE +1CF5..1CF6 ; XID_Continue # Lo [2] VEDIC SIGN JIHVAMULIYA..VEDIC SIGN UPADHMANIYA +1CF7 ; XID_Continue # Mc VEDIC SIGN ATIKRAMA +1CF8..1CF9 ; XID_Continue # Mn [2] VEDIC TONE RING ABOVE..VEDIC TONE DOUBLE RING ABOVE +1D00..1D2B ; XID_Continue # L& [44] LATIN LETTER SMALL CAPITAL A..CYRILLIC LETTER SMALL CAPITAL EL +1D2C..1D6A ; XID_Continue # Lm [63] MODIFIER LETTER CAPITAL A..GREEK SUBSCRIPT SMALL LETTER CHI +1D6B..1D77 ; XID_Continue # L& [13] LATIN SMALL LETTER UE..LATIN SMALL LETTER TURNED G +1D78 ; XID_Continue # Lm MODIFIER LETTER CYRILLIC EN +1D79..1D9A ; XID_Continue # L& [34] LATIN SMALL LETTER INSULAR G..LATIN SMALL LETTER EZH WITH RETROFLEX HOOK +1D9B..1DBF ; XID_Continue # Lm [37] MODIFIER LETTER SMALL TURNED ALPHA..MODIFIER LETTER SMALL THETA +1DC0..1DF9 ; XID_Continue # Mn [58] COMBINING DOTTED GRAVE ACCENT..COMBINING WIDE INVERTED BRIDGE BELOW +1DFB..1DFF ; XID_Continue # Mn [5] COMBINING DELETION MARK..COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW +1E00..1F15 ; XID_Continue # L& [278] LATIN CAPITAL LETTER A WITH RING BELOW..GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA +1F18..1F1D ; XID_Continue # L& [6] GREEK CAPITAL LETTER EPSILON WITH PSILI..GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA +1F20..1F45 ; XID_Continue # L& [38] GREEK SMALL LETTER ETA WITH PSILI..GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA +1F48..1F4D ; XID_Continue # L& [6] GREEK CAPITAL LETTER OMICRON WITH PSILI..GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA +1F50..1F57 ; XID_Continue # L& [8] GREEK SMALL LETTER UPSILON WITH PSILI..GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI +1F59 ; XID_Continue # L& GREEK CAPITAL LETTER UPSILON WITH DASIA +1F5B ; XID_Continue # L& GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA +1F5D ; XID_Continue # L& GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA +1F5F..1F7D ; XID_Continue # L& [31] GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI..GREEK SMALL LETTER OMEGA WITH OXIA +1F80..1FB4 ; XID_Continue # L& [53] GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI..GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI +1FB6..1FBC ; XID_Continue # L& [7] GREEK SMALL LETTER ALPHA WITH PERISPOMENI..GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI +1FBE ; XID_Continue # L& GREEK PROSGEGRAMMENI +1FC2..1FC4 ; XID_Continue # L& [3] GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI +1FC6..1FCC ; XID_Continue # L& [7] GREEK SMALL LETTER ETA WITH PERISPOMENI..GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI +1FD0..1FD3 ; XID_Continue # L& [4] GREEK SMALL LETTER IOTA WITH VRACHY..GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA +1FD6..1FDB ; XID_Continue # L& [6] GREEK SMALL LETTER IOTA WITH PERISPOMENI..GREEK CAPITAL LETTER IOTA WITH OXIA +1FE0..1FEC ; XID_Continue # L& [13] GREEK SMALL LETTER UPSILON WITH VRACHY..GREEK CAPITAL LETTER RHO WITH DASIA +1FF2..1FF4 ; XID_Continue # L& [3] GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI +1FF6..1FFC ; XID_Continue # L& [7] GREEK SMALL LETTER OMEGA WITH PERISPOMENI..GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI +203F..2040 ; XID_Continue # Pc [2] UNDERTIE..CHARACTER TIE +2054 ; XID_Continue # Pc INVERTED UNDERTIE +2071 ; XID_Continue # Lm SUPERSCRIPT LATIN SMALL LETTER I +207F ; XID_Continue # Lm SUPERSCRIPT LATIN SMALL LETTER N +2090..209C ; XID_Continue # Lm [13] LATIN SUBSCRIPT SMALL LETTER A..LATIN SUBSCRIPT SMALL LETTER T +20D0..20DC ; XID_Continue # Mn [13] COMBINING LEFT HARPOON ABOVE..COMBINING FOUR DOTS ABOVE +20E1 ; XID_Continue # Mn COMBINING LEFT RIGHT ARROW ABOVE +20E5..20F0 ; XID_Continue # Mn [12] COMBINING REVERSE SOLIDUS OVERLAY..COMBINING ASTERISK ABOVE +2102 ; XID_Continue # L& DOUBLE-STRUCK CAPITAL C +2107 ; XID_Continue # L& EULER CONSTANT +210A..2113 ; XID_Continue # L& [10] SCRIPT SMALL G..SCRIPT SMALL L +2115 ; XID_Continue # L& DOUBLE-STRUCK CAPITAL N +2118 ; XID_Continue # Sm SCRIPT CAPITAL P +2119..211D ; XID_Continue # L& [5] DOUBLE-STRUCK CAPITAL P..DOUBLE-STRUCK CAPITAL R +2124 ; XID_Continue # L& DOUBLE-STRUCK CAPITAL Z +2126 ; XID_Continue # L& OHM SIGN +2128 ; XID_Continue # L& BLACK-LETTER CAPITAL Z +212A..212D ; XID_Continue # L& [4] KELVIN SIGN..BLACK-LETTER CAPITAL C +212E ; XID_Continue # So ESTIMATED SYMBOL +212F..2134 ; XID_Continue # L& [6] SCRIPT SMALL E..SCRIPT SMALL O +2135..2138 ; XID_Continue # Lo [4] ALEF SYMBOL..DALET SYMBOL +2139 ; XID_Continue # L& INFORMATION SOURCE +213C..213F ; XID_Continue # L& [4] DOUBLE-STRUCK SMALL PI..DOUBLE-STRUCK CAPITAL PI +2145..2149 ; XID_Continue # L& [5] DOUBLE-STRUCK ITALIC CAPITAL D..DOUBLE-STRUCK ITALIC SMALL J +214E ; XID_Continue # L& TURNED SMALL F +2160..2182 ; XID_Continue # Nl [35] ROMAN NUMERAL ONE..ROMAN NUMERAL TEN THOUSAND +2183..2184 ; XID_Continue # L& [2] ROMAN NUMERAL REVERSED ONE HUNDRED..LATIN SMALL LETTER REVERSED C +2185..2188 ; XID_Continue # Nl [4] ROMAN NUMERAL SIX LATE FORM..ROMAN NUMERAL ONE HUNDRED THOUSAND +2C00..2C2E ; XID_Continue # L& [47] GLAGOLITIC CAPITAL LETTER AZU..GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE +2C30..2C5E ; XID_Continue # L& [47] GLAGOLITIC SMALL LETTER AZU..GLAGOLITIC SMALL LETTER LATINATE MYSLITE +2C60..2C7B ; XID_Continue # L& [28] LATIN CAPITAL LETTER L WITH DOUBLE BAR..LATIN LETTER SMALL CAPITAL TURNED E +2C7C..2C7D ; XID_Continue # Lm [2] LATIN SUBSCRIPT SMALL LETTER J..MODIFIER LETTER CAPITAL V +2C7E..2CE4 ; XID_Continue # L& [103] LATIN CAPITAL LETTER S WITH SWASH TAIL..COPTIC SYMBOL KAI +2CEB..2CEE ; XID_Continue # L& [4] COPTIC CAPITAL LETTER CRYPTOGRAMMIC SHEI..COPTIC SMALL LETTER CRYPTOGRAMMIC GANGIA +2CEF..2CF1 ; XID_Continue # Mn [3] COPTIC COMBINING NI ABOVE..COPTIC COMBINING SPIRITUS LENIS +2CF2..2CF3 ; XID_Continue # L& [2] COPTIC CAPITAL LETTER BOHAIRIC KHEI..COPTIC SMALL LETTER BOHAIRIC KHEI +2D00..2D25 ; XID_Continue # L& [38] GEORGIAN SMALL LETTER AN..GEORGIAN SMALL LETTER HOE +2D27 ; XID_Continue # L& GEORGIAN SMALL LETTER YN +2D2D ; XID_Continue # L& GEORGIAN SMALL LETTER AEN +2D30..2D67 ; XID_Continue # Lo [56] TIFINAGH LETTER YA..TIFINAGH LETTER YO +2D6F ; XID_Continue # Lm TIFINAGH MODIFIER LETTER LABIALIZATION MARK +2D7F ; XID_Continue # Mn TIFINAGH CONSONANT JOINER +2D80..2D96 ; XID_Continue # Lo [23] ETHIOPIC SYLLABLE LOA..ETHIOPIC SYLLABLE GGWE +2DA0..2DA6 ; XID_Continue # Lo [7] ETHIOPIC SYLLABLE SSA..ETHIOPIC SYLLABLE SSO +2DA8..2DAE ; XID_Continue # Lo [7] ETHIOPIC SYLLABLE CCA..ETHIOPIC SYLLABLE CCO +2DB0..2DB6 ; XID_Continue # Lo [7] ETHIOPIC SYLLABLE ZZA..ETHIOPIC SYLLABLE ZZO +2DB8..2DBE ; XID_Continue # Lo [7] ETHIOPIC SYLLABLE CCHA..ETHIOPIC SYLLABLE CCHO +2DC0..2DC6 ; XID_Continue # Lo [7] ETHIOPIC SYLLABLE QYA..ETHIOPIC SYLLABLE QYO +2DC8..2DCE ; XID_Continue # Lo [7] ETHIOPIC SYLLABLE KYA..ETHIOPIC SYLLABLE KYO +2DD0..2DD6 ; XID_Continue # Lo [7] ETHIOPIC SYLLABLE XYA..ETHIOPIC SYLLABLE XYO +2DD8..2DDE ; XID_Continue # Lo [7] ETHIOPIC SYLLABLE GYA..ETHIOPIC SYLLABLE GYO +2DE0..2DFF ; XID_Continue # Mn [32] COMBINING CYRILLIC LETTER BE..COMBINING CYRILLIC LETTER IOTIFIED BIG YUS +3005 ; XID_Continue # Lm IDEOGRAPHIC ITERATION MARK +3006 ; XID_Continue # Lo IDEOGRAPHIC CLOSING MARK +3007 ; XID_Continue # Nl IDEOGRAPHIC NUMBER ZERO +3021..3029 ; XID_Continue # Nl [9] HANGZHOU NUMERAL ONE..HANGZHOU NUMERAL NINE +302A..302D ; XID_Continue # Mn [4] IDEOGRAPHIC LEVEL TONE MARK..IDEOGRAPHIC ENTERING TONE MARK +302E..302F ; XID_Continue # Mc [2] HANGUL SINGLE DOT TONE MARK..HANGUL DOUBLE DOT TONE MARK +3031..3035 ; XID_Continue # Lm [5] VERTICAL KANA REPEAT MARK..VERTICAL KANA REPEAT MARK LOWER HALF +3038..303A ; XID_Continue # Nl [3] HANGZHOU NUMERAL TEN..HANGZHOU NUMERAL THIRTY +303B ; XID_Continue # Lm VERTICAL IDEOGRAPHIC ITERATION MARK +303C ; XID_Continue # Lo MASU MARK +3041..3096 ; XID_Continue # Lo [86] HIRAGANA LETTER SMALL A..HIRAGANA LETTER SMALL KE +3099..309A ; XID_Continue # Mn [2] COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK..COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK +309D..309E ; XID_Continue # Lm [2] HIRAGANA ITERATION MARK..HIRAGANA VOICED ITERATION MARK +309F ; XID_Continue # Lo HIRAGANA DIGRAPH YORI +30A1..30FA ; XID_Continue # Lo [90] KATAKANA LETTER SMALL A..KATAKANA LETTER VO +30FC..30FE ; XID_Continue # Lm [3] KATAKANA-HIRAGANA PROLONGED SOUND MARK..KATAKANA VOICED ITERATION MARK +30FF ; XID_Continue # Lo KATAKANA DIGRAPH KOTO +3105..312F ; XID_Continue # Lo [43] BOPOMOFO LETTER B..BOPOMOFO LETTER NN +3131..318E ; XID_Continue # Lo [94] HANGUL LETTER KIYEOK..HANGUL LETTER ARAEAE +31A0..31BA ; XID_Continue # Lo [27] BOPOMOFO LETTER BU..BOPOMOFO LETTER ZY +31F0..31FF ; XID_Continue # Lo [16] KATAKANA LETTER SMALL KU..KATAKANA LETTER SMALL RO +3400..4DB5 ; XID_Continue # Lo [6582] CJK UNIFIED IDEOGRAPH-3400..CJK UNIFIED IDEOGRAPH-4DB5 +4E00..9FEF ; XID_Continue # Lo [20976] CJK UNIFIED IDEOGRAPH-4E00..CJK UNIFIED IDEOGRAPH-9FEF +A000..A014 ; XID_Continue # Lo [21] YI SYLLABLE IT..YI SYLLABLE E +A015 ; XID_Continue # Lm YI SYLLABLE WU +A016..A48C ; XID_Continue # Lo [1143] YI SYLLABLE BIT..YI SYLLABLE YYR +A4D0..A4F7 ; XID_Continue # Lo [40] LISU LETTER BA..LISU LETTER OE +A4F8..A4FD ; XID_Continue # Lm [6] LISU LETTER TONE MYA TI..LISU LETTER TONE MYA JEU +A500..A60B ; XID_Continue # Lo [268] VAI SYLLABLE EE..VAI SYLLABLE NG +A60C ; XID_Continue # Lm VAI SYLLABLE LENGTHENER +A610..A61F ; XID_Continue # Lo [16] VAI SYLLABLE NDOLE FA..VAI SYMBOL JONG +A620..A629 ; XID_Continue # Nd [10] VAI DIGIT ZERO..VAI DIGIT NINE +A62A..A62B ; XID_Continue # Lo [2] VAI SYLLABLE NDOLE MA..VAI SYLLABLE NDOLE DO +A640..A66D ; XID_Continue # L& [46] CYRILLIC CAPITAL LETTER ZEMLYA..CYRILLIC SMALL LETTER DOUBLE MONOCULAR O +A66E ; XID_Continue # Lo CYRILLIC LETTER MULTIOCULAR O +A66F ; XID_Continue # Mn COMBINING CYRILLIC VZMET +A674..A67D ; XID_Continue # Mn [10] COMBINING CYRILLIC LETTER UKRAINIAN IE..COMBINING CYRILLIC PAYEROK +A67F ; XID_Continue # Lm CYRILLIC PAYEROK +A680..A69B ; XID_Continue # L& [28] CYRILLIC CAPITAL LETTER DWE..CYRILLIC SMALL LETTER CROSSED O +A69C..A69D ; XID_Continue # Lm [2] MODIFIER LETTER CYRILLIC HARD SIGN..MODIFIER LETTER CYRILLIC SOFT SIGN +A69E..A69F ; XID_Continue # Mn [2] COMBINING CYRILLIC LETTER EF..COMBINING CYRILLIC LETTER IOTIFIED E +A6A0..A6E5 ; XID_Continue # Lo [70] BAMUM LETTER A..BAMUM LETTER KI +A6E6..A6EF ; XID_Continue # Nl [10] BAMUM LETTER MO..BAMUM LETTER KOGHOM +A6F0..A6F1 ; XID_Continue # Mn [2] BAMUM COMBINING MARK KOQNDON..BAMUM COMBINING MARK TUKWENTIS +A717..A71F ; XID_Continue # Lm [9] MODIFIER LETTER DOT VERTICAL BAR..MODIFIER LETTER LOW INVERTED EXCLAMATION MARK +A722..A76F ; XID_Continue # L& [78] LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF..LATIN SMALL LETTER CON +A770 ; XID_Continue # Lm MODIFIER LETTER US +A771..A787 ; XID_Continue # L& [23] LATIN SMALL LETTER DUM..LATIN SMALL LETTER INSULAR T +A788 ; XID_Continue # Lm MODIFIER LETTER LOW CIRCUMFLEX ACCENT +A78B..A78E ; XID_Continue # L& [4] LATIN CAPITAL LETTER SALTILLO..LATIN SMALL LETTER L WITH RETROFLEX HOOK AND BELT +A78F ; XID_Continue # Lo LATIN LETTER SINOLOGICAL DOT +A790..A7B9 ; XID_Continue # L& [42] LATIN CAPITAL LETTER N WITH DESCENDER..LATIN SMALL LETTER U WITH STROKE +A7F7 ; XID_Continue # Lo LATIN EPIGRAPHIC LETTER SIDEWAYS I +A7F8..A7F9 ; XID_Continue # Lm [2] MODIFIER LETTER CAPITAL H WITH STROKE..MODIFIER LETTER SMALL LIGATURE OE +A7FA ; XID_Continue # L& LATIN LETTER SMALL CAPITAL TURNED M +A7FB..A801 ; XID_Continue # Lo [7] LATIN EPIGRAPHIC LETTER REVERSED F..SYLOTI NAGRI LETTER I +A802 ; XID_Continue # Mn SYLOTI NAGRI SIGN DVISVARA +A803..A805 ; XID_Continue # Lo [3] SYLOTI NAGRI LETTER U..SYLOTI NAGRI LETTER O +A806 ; XID_Continue # Mn SYLOTI NAGRI SIGN HASANTA +A807..A80A ; XID_Continue # Lo [4] SYLOTI NAGRI LETTER KO..SYLOTI NAGRI LETTER GHO +A80B ; XID_Continue # Mn SYLOTI NAGRI SIGN ANUSVARA +A80C..A822 ; XID_Continue # Lo [23] SYLOTI NAGRI LETTER CO..SYLOTI NAGRI LETTER HO +A823..A824 ; XID_Continue # Mc [2] SYLOTI NAGRI VOWEL SIGN A..SYLOTI NAGRI VOWEL SIGN I +A825..A826 ; XID_Continue # Mn [2] SYLOTI NAGRI VOWEL SIGN U..SYLOTI NAGRI VOWEL SIGN E +A827 ; XID_Continue # Mc SYLOTI NAGRI VOWEL SIGN OO +A840..A873 ; XID_Continue # Lo [52] PHAGS-PA LETTER KA..PHAGS-PA LETTER CANDRABINDU +A880..A881 ; XID_Continue # Mc [2] SAURASHTRA SIGN ANUSVARA..SAURASHTRA SIGN VISARGA +A882..A8B3 ; XID_Continue # Lo [50] SAURASHTRA LETTER A..SAURASHTRA LETTER LLA +A8B4..A8C3 ; XID_Continue # Mc [16] SAURASHTRA CONSONANT SIGN HAARU..SAURASHTRA VOWEL SIGN AU +A8C4..A8C5 ; XID_Continue # Mn [2] SAURASHTRA SIGN VIRAMA..SAURASHTRA SIGN CANDRABINDU +A8D0..A8D9 ; XID_Continue # Nd [10] SAURASHTRA DIGIT ZERO..SAURASHTRA DIGIT NINE +A8E0..A8F1 ; XID_Continue # Mn [18] COMBINING DEVANAGARI DIGIT ZERO..COMBINING DEVANAGARI SIGN AVAGRAHA +A8F2..A8F7 ; XID_Continue # Lo [6] DEVANAGARI SIGN SPACING CANDRABINDU..DEVANAGARI SIGN CANDRABINDU AVAGRAHA +A8FB ; XID_Continue # Lo DEVANAGARI HEADSTROKE +A8FD..A8FE ; XID_Continue # Lo [2] DEVANAGARI JAIN OM..DEVANAGARI LETTER AY +A8FF ; XID_Continue # Mn DEVANAGARI VOWEL SIGN AY +A900..A909 ; XID_Continue # Nd [10] KAYAH LI DIGIT ZERO..KAYAH LI DIGIT NINE +A90A..A925 ; XID_Continue # Lo [28] KAYAH LI LETTER KA..KAYAH LI LETTER OO +A926..A92D ; XID_Continue # Mn [8] KAYAH LI VOWEL UE..KAYAH LI TONE CALYA PLOPHU +A930..A946 ; XID_Continue # Lo [23] REJANG LETTER KA..REJANG LETTER A +A947..A951 ; XID_Continue # Mn [11] REJANG VOWEL SIGN I..REJANG CONSONANT SIGN R +A952..A953 ; XID_Continue # Mc [2] REJANG CONSONANT SIGN H..REJANG VIRAMA +A960..A97C ; XID_Continue # Lo [29] HANGUL CHOSEONG TIKEUT-MIEUM..HANGUL CHOSEONG SSANGYEORINHIEUH +A980..A982 ; XID_Continue # Mn [3] JAVANESE SIGN PANYANGGA..JAVANESE SIGN LAYAR +A983 ; XID_Continue # Mc JAVANESE SIGN WIGNYAN +A984..A9B2 ; XID_Continue # Lo [47] JAVANESE LETTER A..JAVANESE LETTER HA +A9B3 ; XID_Continue # Mn JAVANESE SIGN CECAK TELU +A9B4..A9B5 ; XID_Continue # Mc [2] JAVANESE VOWEL SIGN TARUNG..JAVANESE VOWEL SIGN TOLONG +A9B6..A9B9 ; XID_Continue # Mn [4] JAVANESE VOWEL SIGN WULU..JAVANESE VOWEL SIGN SUKU MENDUT +A9BA..A9BB ; XID_Continue # Mc [2] JAVANESE VOWEL SIGN TALING..JAVANESE VOWEL SIGN DIRGA MURE +A9BC ; XID_Continue # Mn JAVANESE VOWEL SIGN PEPET +A9BD..A9C0 ; XID_Continue # Mc [4] JAVANESE CONSONANT SIGN KERET..JAVANESE PANGKON +A9CF ; XID_Continue # Lm JAVANESE PANGRANGKEP +A9D0..A9D9 ; XID_Continue # Nd [10] JAVANESE DIGIT ZERO..JAVANESE DIGIT NINE +A9E0..A9E4 ; XID_Continue # Lo [5] MYANMAR LETTER SHAN GHA..MYANMAR LETTER SHAN BHA +A9E5 ; XID_Continue # Mn MYANMAR SIGN SHAN SAW +A9E6 ; XID_Continue # Lm MYANMAR MODIFIER LETTER SHAN REDUPLICATION +A9E7..A9EF ; XID_Continue # Lo [9] MYANMAR LETTER TAI LAING NYA..MYANMAR LETTER TAI LAING NNA +A9F0..A9F9 ; XID_Continue # Nd [10] MYANMAR TAI LAING DIGIT ZERO..MYANMAR TAI LAING DIGIT NINE +A9FA..A9FE ; XID_Continue # Lo [5] MYANMAR LETTER TAI LAING LLA..MYANMAR LETTER TAI LAING BHA +AA00..AA28 ; XID_Continue # Lo [41] CHAM LETTER A..CHAM LETTER HA +AA29..AA2E ; XID_Continue # Mn [6] CHAM VOWEL SIGN AA..CHAM VOWEL SIGN OE +AA2F..AA30 ; XID_Continue # Mc [2] CHAM VOWEL SIGN O..CHAM VOWEL SIGN AI +AA31..AA32 ; XID_Continue # Mn [2] CHAM VOWEL SIGN AU..CHAM VOWEL SIGN UE +AA33..AA34 ; XID_Continue # Mc [2] CHAM CONSONANT SIGN YA..CHAM CONSONANT SIGN RA +AA35..AA36 ; XID_Continue # Mn [2] CHAM CONSONANT SIGN LA..CHAM CONSONANT SIGN WA +AA40..AA42 ; XID_Continue # Lo [3] CHAM LETTER FINAL K..CHAM LETTER FINAL NG +AA43 ; XID_Continue # Mn CHAM CONSONANT SIGN FINAL NG +AA44..AA4B ; XID_Continue # Lo [8] CHAM LETTER FINAL CH..CHAM LETTER FINAL SS +AA4C ; XID_Continue # Mn CHAM CONSONANT SIGN FINAL M +AA4D ; XID_Continue # Mc CHAM CONSONANT SIGN FINAL H +AA50..AA59 ; XID_Continue # Nd [10] CHAM DIGIT ZERO..CHAM DIGIT NINE +AA60..AA6F ; XID_Continue # Lo [16] MYANMAR LETTER KHAMTI GA..MYANMAR LETTER KHAMTI FA +AA70 ; XID_Continue # Lm MYANMAR MODIFIER LETTER KHAMTI REDUPLICATION +AA71..AA76 ; XID_Continue # Lo [6] MYANMAR LETTER KHAMTI XA..MYANMAR LOGOGRAM KHAMTI HM +AA7A ; XID_Continue # Lo MYANMAR LETTER AITON RA +AA7B ; XID_Continue # Mc MYANMAR SIGN PAO KAREN TONE +AA7C ; XID_Continue # Mn MYANMAR SIGN TAI LAING TONE-2 +AA7D ; XID_Continue # Mc MYANMAR SIGN TAI LAING TONE-5 +AA7E..AAAF ; XID_Continue # Lo [50] MYANMAR LETTER SHWE PALAUNG CHA..TAI VIET LETTER HIGH O +AAB0 ; XID_Continue # Mn TAI VIET MAI KANG +AAB1 ; XID_Continue # Lo TAI VIET VOWEL AA +AAB2..AAB4 ; XID_Continue # Mn [3] TAI VIET VOWEL I..TAI VIET VOWEL U +AAB5..AAB6 ; XID_Continue # Lo [2] TAI VIET VOWEL E..TAI VIET VOWEL O +AAB7..AAB8 ; XID_Continue # Mn [2] TAI VIET MAI KHIT..TAI VIET VOWEL IA +AAB9..AABD ; XID_Continue # Lo [5] TAI VIET VOWEL UEA..TAI VIET VOWEL AN +AABE..AABF ; XID_Continue # Mn [2] TAI VIET VOWEL AM..TAI VIET TONE MAI EK +AAC0 ; XID_Continue # Lo TAI VIET TONE MAI NUENG +AAC1 ; XID_Continue # Mn TAI VIET TONE MAI THO +AAC2 ; XID_Continue # Lo TAI VIET TONE MAI SONG +AADB..AADC ; XID_Continue # Lo [2] TAI VIET SYMBOL KON..TAI VIET SYMBOL NUENG +AADD ; XID_Continue # Lm TAI VIET SYMBOL SAM +AAE0..AAEA ; XID_Continue # Lo [11] MEETEI MAYEK LETTER E..MEETEI MAYEK LETTER SSA +AAEB ; XID_Continue # Mc MEETEI MAYEK VOWEL SIGN II +AAEC..AAED ; XID_Continue # Mn [2] MEETEI MAYEK VOWEL SIGN UU..MEETEI MAYEK VOWEL SIGN AAI +AAEE..AAEF ; XID_Continue # Mc [2] MEETEI MAYEK VOWEL SIGN AU..MEETEI MAYEK VOWEL SIGN AAU +AAF2 ; XID_Continue # Lo MEETEI MAYEK ANJI +AAF3..AAF4 ; XID_Continue # Lm [2] MEETEI MAYEK SYLLABLE REPETITION MARK..MEETEI MAYEK WORD REPETITION MARK +AAF5 ; XID_Continue # Mc MEETEI MAYEK VOWEL SIGN VISARGA +AAF6 ; XID_Continue # Mn MEETEI MAYEK VIRAMA +AB01..AB06 ; XID_Continue # Lo [6] ETHIOPIC SYLLABLE TTHU..ETHIOPIC SYLLABLE TTHO +AB09..AB0E ; XID_Continue # Lo [6] ETHIOPIC SYLLABLE DDHU..ETHIOPIC SYLLABLE DDHO +AB11..AB16 ; XID_Continue # Lo [6] ETHIOPIC SYLLABLE DZU..ETHIOPIC SYLLABLE DZO +AB20..AB26 ; XID_Continue # Lo [7] ETHIOPIC SYLLABLE CCHHA..ETHIOPIC SYLLABLE CCHHO +AB28..AB2E ; XID_Continue # Lo [7] ETHIOPIC SYLLABLE BBA..ETHIOPIC SYLLABLE BBO +AB30..AB5A ; XID_Continue # L& [43] LATIN SMALL LETTER BARRED ALPHA..LATIN SMALL LETTER Y WITH SHORT RIGHT LEG +AB5C..AB5F ; XID_Continue # Lm [4] MODIFIER LETTER SMALL HENG..MODIFIER LETTER SMALL U WITH LEFT HOOK +AB60..AB65 ; XID_Continue # L& [6] LATIN SMALL LETTER SAKHA YAT..GREEK LETTER SMALL CAPITAL OMEGA +AB70..ABBF ; XID_Continue # L& [80] CHEROKEE SMALL LETTER A..CHEROKEE SMALL LETTER YA +ABC0..ABE2 ; XID_Continue # Lo [35] MEETEI MAYEK LETTER KOK..MEETEI MAYEK LETTER I LONSUM +ABE3..ABE4 ; XID_Continue # Mc [2] MEETEI MAYEK VOWEL SIGN ONAP..MEETEI MAYEK VOWEL SIGN INAP +ABE5 ; XID_Continue # Mn MEETEI MAYEK VOWEL SIGN ANAP +ABE6..ABE7 ; XID_Continue # Mc [2] MEETEI MAYEK VOWEL SIGN YENAP..MEETEI MAYEK VOWEL SIGN SOUNAP +ABE8 ; XID_Continue # Mn MEETEI MAYEK VOWEL SIGN UNAP +ABE9..ABEA ; XID_Continue # Mc [2] MEETEI MAYEK VOWEL SIGN CHEINAP..MEETEI MAYEK VOWEL SIGN NUNG +ABEC ; XID_Continue # Mc MEETEI MAYEK LUM IYEK +ABED ; XID_Continue # Mn MEETEI MAYEK APUN IYEK +ABF0..ABF9 ; XID_Continue # Nd [10] MEETEI MAYEK DIGIT ZERO..MEETEI MAYEK DIGIT NINE +AC00..D7A3 ; XID_Continue # Lo [11172] HANGUL SYLLABLE GA..HANGUL SYLLABLE HIH +D7B0..D7C6 ; XID_Continue # Lo [23] HANGUL JUNGSEONG O-YEO..HANGUL JUNGSEONG ARAEA-E +D7CB..D7FB ; XID_Continue # Lo [49] HANGUL JONGSEONG NIEUN-RIEUL..HANGUL JONGSEONG PHIEUPH-THIEUTH +F900..FA6D ; XID_Continue # Lo [366] CJK COMPATIBILITY IDEOGRAPH-F900..CJK COMPATIBILITY IDEOGRAPH-FA6D +FA70..FAD9 ; XID_Continue # Lo [106] CJK COMPATIBILITY IDEOGRAPH-FA70..CJK COMPATIBILITY IDEOGRAPH-FAD9 +FB00..FB06 ; XID_Continue # L& [7] LATIN SMALL LIGATURE FF..LATIN SMALL LIGATURE ST +FB13..FB17 ; XID_Continue # L& [5] ARMENIAN SMALL LIGATURE MEN NOW..ARMENIAN SMALL LIGATURE MEN XEH +FB1D ; XID_Continue # Lo HEBREW LETTER YOD WITH HIRIQ +FB1E ; XID_Continue # Mn HEBREW POINT JUDEO-SPANISH VARIKA +FB1F..FB28 ; XID_Continue # Lo [10] HEBREW LIGATURE YIDDISH YOD YOD PATAH..HEBREW LETTER WIDE TAV +FB2A..FB36 ; XID_Continue # Lo [13] HEBREW LETTER SHIN WITH SHIN DOT..HEBREW LETTER ZAYIN WITH DAGESH +FB38..FB3C ; XID_Continue # Lo [5] HEBREW LETTER TET WITH DAGESH..HEBREW LETTER LAMED WITH DAGESH +FB3E ; XID_Continue # Lo HEBREW LETTER MEM WITH DAGESH +FB40..FB41 ; XID_Continue # Lo [2] HEBREW LETTER NUN WITH DAGESH..HEBREW LETTER SAMEKH WITH DAGESH +FB43..FB44 ; XID_Continue # Lo [2] HEBREW LETTER FINAL PE WITH DAGESH..HEBREW LETTER PE WITH DAGESH +FB46..FBB1 ; XID_Continue # Lo [108] HEBREW LETTER TSADI WITH DAGESH..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM +FBD3..FC5D ; XID_Continue # Lo [139] ARABIC LETTER NG ISOLATED FORM..ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF ISOLATED FORM +FC64..FD3D ; XID_Continue # Lo [218] ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH REH FINAL FORM..ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM +FD50..FD8F ; XID_Continue # Lo [64] ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM..ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM +FD92..FDC7 ; XID_Continue # Lo [54] ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM..ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM +FDF0..FDF9 ; XID_Continue # Lo [10] ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM..ARABIC LIGATURE SALLA ISOLATED FORM +FE00..FE0F ; XID_Continue # Mn [16] VARIATION SELECTOR-1..VARIATION SELECTOR-16 +FE20..FE2F ; XID_Continue # Mn [16] COMBINING LIGATURE LEFT HALF..COMBINING CYRILLIC TITLO RIGHT HALF +FE33..FE34 ; XID_Continue # Pc [2] PRESENTATION FORM FOR VERTICAL LOW LINE..PRESENTATION FORM FOR VERTICAL WAVY LOW LINE +FE4D..FE4F ; XID_Continue # Pc [3] DASHED LOW LINE..WAVY LOW LINE +FE71 ; XID_Continue # Lo ARABIC TATWEEL WITH FATHATAN ABOVE +FE73 ; XID_Continue # Lo ARABIC TAIL FRAGMENT +FE77 ; XID_Continue # Lo ARABIC FATHA MEDIAL FORM +FE79 ; XID_Continue # Lo ARABIC DAMMA MEDIAL FORM +FE7B ; XID_Continue # Lo ARABIC KASRA MEDIAL FORM +FE7D ; XID_Continue # Lo ARABIC SHADDA MEDIAL FORM +FE7F..FEFC ; XID_Continue # Lo [126] ARABIC SUKUN MEDIAL FORM..ARABIC LIGATURE LAM WITH ALEF FINAL FORM +FF10..FF19 ; XID_Continue # Nd [10] FULLWIDTH DIGIT ZERO..FULLWIDTH DIGIT NINE +FF21..FF3A ; XID_Continue # L& [26] FULLWIDTH LATIN CAPITAL LETTER A..FULLWIDTH LATIN CAPITAL LETTER Z +FF3F ; XID_Continue # Pc FULLWIDTH LOW LINE +FF41..FF5A ; XID_Continue # L& [26] FULLWIDTH LATIN SMALL LETTER A..FULLWIDTH LATIN SMALL LETTER Z +FF66..FF6F ; XID_Continue # Lo [10] HALFWIDTH KATAKANA LETTER WO..HALFWIDTH KATAKANA LETTER SMALL TU +FF70 ; XID_Continue # Lm HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK +FF71..FF9D ; XID_Continue # Lo [45] HALFWIDTH KATAKANA LETTER A..HALFWIDTH KATAKANA LETTER N +FF9E..FF9F ; XID_Continue # Lm [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK +FFA0..FFBE ; XID_Continue # Lo [31] HALFWIDTH HANGUL FILLER..HALFWIDTH HANGUL LETTER HIEUH +FFC2..FFC7 ; XID_Continue # Lo [6] HALFWIDTH HANGUL LETTER A..HALFWIDTH HANGUL LETTER E +FFCA..FFCF ; XID_Continue # Lo [6] HALFWIDTH HANGUL LETTER YEO..HALFWIDTH HANGUL LETTER OE +FFD2..FFD7 ; XID_Continue # Lo [6] HALFWIDTH HANGUL LETTER YO..HALFWIDTH HANGUL LETTER YU +FFDA..FFDC ; XID_Continue # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL LETTER I +10000..1000B ; XID_Continue # Lo [12] LINEAR B SYLLABLE B008 A..LINEAR B SYLLABLE B046 JE +1000D..10026 ; XID_Continue # Lo [26] LINEAR B SYLLABLE B036 JO..LINEAR B SYLLABLE B032 QO +10028..1003A ; XID_Continue # Lo [19] LINEAR B SYLLABLE B060 RA..LINEAR B SYLLABLE B042 WO +1003C..1003D ; XID_Continue # Lo [2] LINEAR B SYLLABLE B017 ZA..LINEAR B SYLLABLE B074 ZE +1003F..1004D ; XID_Continue # Lo [15] LINEAR B SYLLABLE B020 ZO..LINEAR B SYLLABLE B091 TWO +10050..1005D ; XID_Continue # Lo [14] LINEAR B SYMBOL B018..LINEAR B SYMBOL B089 +10080..100FA ; XID_Continue # Lo [123] LINEAR B IDEOGRAM B100 MAN..LINEAR B IDEOGRAM VESSEL B305 +10140..10174 ; XID_Continue # Nl [53] GREEK ACROPHONIC ATTIC ONE QUARTER..GREEK ACROPHONIC STRATIAN FIFTY MNAS +101FD ; XID_Continue # Mn PHAISTOS DISC SIGN COMBINING OBLIQUE STROKE +10280..1029C ; XID_Continue # Lo [29] LYCIAN LETTER A..LYCIAN LETTER X +102A0..102D0 ; XID_Continue # Lo [49] CARIAN LETTER A..CARIAN LETTER UUU3 +102E0 ; XID_Continue # Mn COPTIC EPACT THOUSANDS MARK +10300..1031F ; XID_Continue # Lo [32] OLD ITALIC LETTER A..OLD ITALIC LETTER ESS +1032D..10340 ; XID_Continue # Lo [20] OLD ITALIC LETTER YE..GOTHIC LETTER PAIRTHRA +10341 ; XID_Continue # Nl GOTHIC LETTER NINETY +10342..10349 ; XID_Continue # Lo [8] GOTHIC LETTER RAIDA..GOTHIC LETTER OTHAL +1034A ; XID_Continue # Nl GOTHIC LETTER NINE HUNDRED +10350..10375 ; XID_Continue # Lo [38] OLD PERMIC LETTER AN..OLD PERMIC LETTER IA +10376..1037A ; XID_Continue # Mn [5] COMBINING OLD PERMIC LETTER AN..COMBINING OLD PERMIC LETTER SII +10380..1039D ; XID_Continue # Lo [30] UGARITIC LETTER ALPA..UGARITIC LETTER SSU +103A0..103C3 ; XID_Continue # Lo [36] OLD PERSIAN SIGN A..OLD PERSIAN SIGN HA +103C8..103CF ; XID_Continue # Lo [8] OLD PERSIAN SIGN AURAMAZDAA..OLD PERSIAN SIGN BUUMISH +103D1..103D5 ; XID_Continue # Nl [5] OLD PERSIAN NUMBER ONE..OLD PERSIAN NUMBER HUNDRED +10400..1044F ; XID_Continue # L& [80] DESERET CAPITAL LETTER LONG I..DESERET SMALL LETTER EW +10450..1049D ; XID_Continue # Lo [78] SHAVIAN LETTER PEEP..OSMANYA LETTER OO +104A0..104A9 ; XID_Continue # Nd [10] OSMANYA DIGIT ZERO..OSMANYA DIGIT NINE +104B0..104D3 ; XID_Continue # L& [36] OSAGE CAPITAL LETTER A..OSAGE CAPITAL LETTER ZHA +104D8..104FB ; XID_Continue # L& [36] OSAGE SMALL LETTER A..OSAGE SMALL LETTER ZHA +10500..10527 ; XID_Continue # Lo [40] ELBASAN LETTER A..ELBASAN LETTER KHE +10530..10563 ; XID_Continue # Lo [52] CAUCASIAN ALBANIAN LETTER ALT..CAUCASIAN ALBANIAN LETTER KIW +10600..10736 ; XID_Continue # Lo [311] LINEAR A SIGN AB001..LINEAR A SIGN A664 +10740..10755 ; XID_Continue # Lo [22] LINEAR A SIGN A701 A..LINEAR A SIGN A732 JE +10760..10767 ; XID_Continue # Lo [8] LINEAR A SIGN A800..LINEAR A SIGN A807 +10800..10805 ; XID_Continue # Lo [6] CYPRIOT SYLLABLE A..CYPRIOT SYLLABLE JA +10808 ; XID_Continue # Lo CYPRIOT SYLLABLE JO +1080A..10835 ; XID_Continue # Lo [44] CYPRIOT SYLLABLE KA..CYPRIOT SYLLABLE WO +10837..10838 ; XID_Continue # Lo [2] CYPRIOT SYLLABLE XA..CYPRIOT SYLLABLE XE +1083C ; XID_Continue # Lo CYPRIOT SYLLABLE ZA +1083F..10855 ; XID_Continue # Lo [23] CYPRIOT SYLLABLE ZO..IMPERIAL ARAMAIC LETTER TAW +10860..10876 ; XID_Continue # Lo [23] PALMYRENE LETTER ALEPH..PALMYRENE LETTER TAW +10880..1089E ; XID_Continue # Lo [31] NABATAEAN LETTER FINAL ALEPH..NABATAEAN LETTER TAW +108E0..108F2 ; XID_Continue # Lo [19] HATRAN LETTER ALEPH..HATRAN LETTER QOPH +108F4..108F5 ; XID_Continue # Lo [2] HATRAN LETTER SHIN..HATRAN LETTER TAW +10900..10915 ; XID_Continue # Lo [22] PHOENICIAN LETTER ALF..PHOENICIAN LETTER TAU +10920..10939 ; XID_Continue # Lo [26] LYDIAN LETTER A..LYDIAN LETTER C +10980..109B7 ; XID_Continue # Lo [56] MEROITIC HIEROGLYPHIC LETTER A..MEROITIC CURSIVE LETTER DA +109BE..109BF ; XID_Continue # Lo [2] MEROITIC CURSIVE LOGOGRAM RMT..MEROITIC CURSIVE LOGOGRAM IMN +10A00 ; XID_Continue # Lo KHAROSHTHI LETTER A +10A01..10A03 ; XID_Continue # Mn [3] KHAROSHTHI VOWEL SIGN I..KHAROSHTHI VOWEL SIGN VOCALIC R +10A05..10A06 ; XID_Continue # Mn [2] KHAROSHTHI VOWEL SIGN E..KHAROSHTHI VOWEL SIGN O +10A0C..10A0F ; XID_Continue # Mn [4] KHAROSHTHI VOWEL LENGTH MARK..KHAROSHTHI SIGN VISARGA +10A10..10A13 ; XID_Continue # Lo [4] KHAROSHTHI LETTER KA..KHAROSHTHI LETTER GHA +10A15..10A17 ; XID_Continue # Lo [3] KHAROSHTHI LETTER CA..KHAROSHTHI LETTER JA +10A19..10A35 ; XID_Continue # Lo [29] KHAROSHTHI LETTER NYA..KHAROSHTHI LETTER VHA +10A38..10A3A ; XID_Continue # Mn [3] KHAROSHTHI SIGN BAR ABOVE..KHAROSHTHI SIGN DOT BELOW +10A3F ; XID_Continue # Mn KHAROSHTHI VIRAMA +10A60..10A7C ; XID_Continue # Lo [29] OLD SOUTH ARABIAN LETTER HE..OLD SOUTH ARABIAN LETTER THETH +10A80..10A9C ; XID_Continue # Lo [29] OLD NORTH ARABIAN LETTER HEH..OLD NORTH ARABIAN LETTER ZAH +10AC0..10AC7 ; XID_Continue # Lo [8] MANICHAEAN LETTER ALEPH..MANICHAEAN LETTER WAW +10AC9..10AE4 ; XID_Continue # Lo [28] MANICHAEAN LETTER ZAYIN..MANICHAEAN LETTER TAW +10AE5..10AE6 ; XID_Continue # Mn [2] MANICHAEAN ABBREVIATION MARK ABOVE..MANICHAEAN ABBREVIATION MARK BELOW +10B00..10B35 ; XID_Continue # Lo [54] AVESTAN LETTER A..AVESTAN LETTER HE +10B40..10B55 ; XID_Continue # Lo [22] INSCRIPTIONAL PARTHIAN LETTER ALEPH..INSCRIPTIONAL PARTHIAN LETTER TAW +10B60..10B72 ; XID_Continue # Lo [19] INSCRIPTIONAL PAHLAVI LETTER ALEPH..INSCRIPTIONAL PAHLAVI LETTER TAW +10B80..10B91 ; XID_Continue # Lo [18] PSALTER PAHLAVI LETTER ALEPH..PSALTER PAHLAVI LETTER TAW +10C00..10C48 ; XID_Continue # Lo [73] OLD TURKIC LETTER ORKHON A..OLD TURKIC LETTER ORKHON BASH +10C80..10CB2 ; XID_Continue # L& [51] OLD HUNGARIAN CAPITAL LETTER A..OLD HUNGARIAN CAPITAL LETTER US +10CC0..10CF2 ; XID_Continue # L& [51] OLD HUNGARIAN SMALL LETTER A..OLD HUNGARIAN SMALL LETTER US +10D00..10D23 ; XID_Continue # Lo [36] HANIFI ROHINGYA LETTER A..HANIFI ROHINGYA MARK NA KHONNA +10D24..10D27 ; XID_Continue # Mn [4] HANIFI ROHINGYA SIGN HARBAHAY..HANIFI ROHINGYA SIGN TASSI +10D30..10D39 ; XID_Continue # Nd [10] HANIFI ROHINGYA DIGIT ZERO..HANIFI ROHINGYA DIGIT NINE +10F00..10F1C ; XID_Continue # Lo [29] OLD SOGDIAN LETTER ALEPH..OLD SOGDIAN LETTER FINAL TAW WITH VERTICAL TAIL +10F27 ; XID_Continue # Lo OLD SOGDIAN LIGATURE AYIN-DALETH +10F30..10F45 ; XID_Continue # Lo [22] SOGDIAN LETTER ALEPH..SOGDIAN INDEPENDENT SHIN +10F46..10F50 ; XID_Continue # Mn [11] SOGDIAN COMBINING DOT BELOW..SOGDIAN COMBINING STROKE BELOW +11000 ; XID_Continue # Mc BRAHMI SIGN CANDRABINDU +11001 ; XID_Continue # Mn BRAHMI SIGN ANUSVARA +11002 ; XID_Continue # Mc BRAHMI SIGN VISARGA +11003..11037 ; XID_Continue # Lo [53] BRAHMI SIGN JIHVAMULIYA..BRAHMI LETTER OLD TAMIL NNNA +11038..11046 ; XID_Continue # Mn [15] BRAHMI VOWEL SIGN AA..BRAHMI VIRAMA +11066..1106F ; XID_Continue # Nd [10] BRAHMI DIGIT ZERO..BRAHMI DIGIT NINE +1107F..11081 ; XID_Continue # Mn [3] BRAHMI NUMBER JOINER..KAITHI SIGN ANUSVARA +11082 ; XID_Continue # Mc KAITHI SIGN VISARGA +11083..110AF ; XID_Continue # Lo [45] KAITHI LETTER A..KAITHI LETTER HA +110B0..110B2 ; XID_Continue # Mc [3] KAITHI VOWEL SIGN AA..KAITHI VOWEL SIGN II +110B3..110B6 ; XID_Continue # Mn [4] KAITHI VOWEL SIGN U..KAITHI VOWEL SIGN AI +110B7..110B8 ; XID_Continue # Mc [2] KAITHI VOWEL SIGN O..KAITHI VOWEL SIGN AU +110B9..110BA ; XID_Continue # Mn [2] KAITHI SIGN VIRAMA..KAITHI SIGN NUKTA +110D0..110E8 ; XID_Continue # Lo [25] SORA SOMPENG LETTER SAH..SORA SOMPENG LETTER MAE +110F0..110F9 ; XID_Continue # Nd [10] SORA SOMPENG DIGIT ZERO..SORA SOMPENG DIGIT NINE +11100..11102 ; XID_Continue # Mn [3] CHAKMA SIGN CANDRABINDU..CHAKMA SIGN VISARGA +11103..11126 ; XID_Continue # Lo [36] CHAKMA LETTER AA..CHAKMA LETTER HAA +11127..1112B ; XID_Continue # Mn [5] CHAKMA VOWEL SIGN A..CHAKMA VOWEL SIGN UU +1112C ; XID_Continue # Mc CHAKMA VOWEL SIGN E +1112D..11134 ; XID_Continue # Mn [8] CHAKMA VOWEL SIGN AI..CHAKMA MAAYYAA +11136..1113F ; XID_Continue # Nd [10] CHAKMA DIGIT ZERO..CHAKMA DIGIT NINE +11144 ; XID_Continue # Lo CHAKMA LETTER LHAA +11145..11146 ; XID_Continue # Mc [2] CHAKMA VOWEL SIGN AA..CHAKMA VOWEL SIGN EI +11150..11172 ; XID_Continue # Lo [35] MAHAJANI LETTER A..MAHAJANI LETTER RRA +11173 ; XID_Continue # Mn MAHAJANI SIGN NUKTA +11176 ; XID_Continue # Lo MAHAJANI LIGATURE SHRI +11180..11181 ; XID_Continue # Mn [2] SHARADA SIGN CANDRABINDU..SHARADA SIGN ANUSVARA +11182 ; XID_Continue # Mc SHARADA SIGN VISARGA +11183..111B2 ; XID_Continue # Lo [48] SHARADA LETTER A..SHARADA LETTER HA +111B3..111B5 ; XID_Continue # Mc [3] SHARADA VOWEL SIGN AA..SHARADA VOWEL SIGN II +111B6..111BE ; XID_Continue # Mn [9] SHARADA VOWEL SIGN U..SHARADA VOWEL SIGN O +111BF..111C0 ; XID_Continue # Mc [2] SHARADA VOWEL SIGN AU..SHARADA SIGN VIRAMA +111C1..111C4 ; XID_Continue # Lo [4] SHARADA SIGN AVAGRAHA..SHARADA OM +111C9..111CC ; XID_Continue # Mn [4] SHARADA SANDHI MARK..SHARADA EXTRA SHORT VOWEL MARK +111D0..111D9 ; XID_Continue # Nd [10] SHARADA DIGIT ZERO..SHARADA DIGIT NINE +111DA ; XID_Continue # Lo SHARADA EKAM +111DC ; XID_Continue # Lo SHARADA HEADSTROKE +11200..11211 ; XID_Continue # Lo [18] KHOJKI LETTER A..KHOJKI LETTER JJA +11213..1122B ; XID_Continue # Lo [25] KHOJKI LETTER NYA..KHOJKI LETTER LLA +1122C..1122E ; XID_Continue # Mc [3] KHOJKI VOWEL SIGN AA..KHOJKI VOWEL SIGN II +1122F..11231 ; XID_Continue # Mn [3] KHOJKI VOWEL SIGN U..KHOJKI VOWEL SIGN AI +11232..11233 ; XID_Continue # Mc [2] KHOJKI VOWEL SIGN O..KHOJKI VOWEL SIGN AU +11234 ; XID_Continue # Mn KHOJKI SIGN ANUSVARA +11235 ; XID_Continue # Mc KHOJKI SIGN VIRAMA +11236..11237 ; XID_Continue # Mn [2] KHOJKI SIGN NUKTA..KHOJKI SIGN SHADDA +1123E ; XID_Continue # Mn KHOJKI SIGN SUKUN +11280..11286 ; XID_Continue # Lo [7] MULTANI LETTER A..MULTANI LETTER GA +11288 ; XID_Continue # Lo MULTANI LETTER GHA +1128A..1128D ; XID_Continue # Lo [4] MULTANI LETTER CA..MULTANI LETTER JJA +1128F..1129D ; XID_Continue # Lo [15] MULTANI LETTER NYA..MULTANI LETTER BA +1129F..112A8 ; XID_Continue # Lo [10] MULTANI LETTER BHA..MULTANI LETTER RHA +112B0..112DE ; XID_Continue # Lo [47] KHUDAWADI LETTER A..KHUDAWADI LETTER HA +112DF ; XID_Continue # Mn KHUDAWADI SIGN ANUSVARA +112E0..112E2 ; XID_Continue # Mc [3] KHUDAWADI VOWEL SIGN AA..KHUDAWADI VOWEL SIGN II +112E3..112EA ; XID_Continue # Mn [8] KHUDAWADI VOWEL SIGN U..KHUDAWADI SIGN VIRAMA +112F0..112F9 ; XID_Continue # Nd [10] KHUDAWADI DIGIT ZERO..KHUDAWADI DIGIT NINE +11300..11301 ; XID_Continue # Mn [2] GRANTHA SIGN COMBINING ANUSVARA ABOVE..GRANTHA SIGN CANDRABINDU +11302..11303 ; XID_Continue # Mc [2] GRANTHA SIGN ANUSVARA..GRANTHA SIGN VISARGA +11305..1130C ; XID_Continue # Lo [8] GRANTHA LETTER A..GRANTHA LETTER VOCALIC L +1130F..11310 ; XID_Continue # Lo [2] GRANTHA LETTER EE..GRANTHA LETTER AI +11313..11328 ; XID_Continue # Lo [22] GRANTHA LETTER OO..GRANTHA LETTER NA +1132A..11330 ; XID_Continue # Lo [7] GRANTHA LETTER PA..GRANTHA LETTER RA +11332..11333 ; XID_Continue # Lo [2] GRANTHA LETTER LA..GRANTHA LETTER LLA +11335..11339 ; XID_Continue # Lo [5] GRANTHA LETTER VA..GRANTHA LETTER HA +1133B..1133C ; XID_Continue # Mn [2] COMBINING BINDU BELOW..GRANTHA SIGN NUKTA +1133D ; XID_Continue # Lo GRANTHA SIGN AVAGRAHA +1133E..1133F ; XID_Continue # Mc [2] GRANTHA VOWEL SIGN AA..GRANTHA VOWEL SIGN I +11340 ; XID_Continue # Mn GRANTHA VOWEL SIGN II +11341..11344 ; XID_Continue # Mc [4] GRANTHA VOWEL SIGN U..GRANTHA VOWEL SIGN VOCALIC RR +11347..11348 ; XID_Continue # Mc [2] GRANTHA VOWEL SIGN EE..GRANTHA VOWEL SIGN AI +1134B..1134D ; XID_Continue # Mc [3] GRANTHA VOWEL SIGN OO..GRANTHA SIGN VIRAMA +11350 ; XID_Continue # Lo GRANTHA OM +11357 ; XID_Continue # Mc GRANTHA AU LENGTH MARK +1135D..11361 ; XID_Continue # Lo [5] GRANTHA SIGN PLUTA..GRANTHA LETTER VOCALIC LL +11362..11363 ; XID_Continue # Mc [2] GRANTHA VOWEL SIGN VOCALIC L..GRANTHA VOWEL SIGN VOCALIC LL +11366..1136C ; XID_Continue # Mn [7] COMBINING GRANTHA DIGIT ZERO..COMBINING GRANTHA DIGIT SIX +11370..11374 ; XID_Continue # Mn [5] COMBINING GRANTHA LETTER A..COMBINING GRANTHA LETTER PA +11400..11434 ; XID_Continue # Lo [53] NEWA LETTER A..NEWA LETTER HA +11435..11437 ; XID_Continue # Mc [3] NEWA VOWEL SIGN AA..NEWA VOWEL SIGN II +11438..1143F ; XID_Continue # Mn [8] NEWA VOWEL SIGN U..NEWA VOWEL SIGN AI +11440..11441 ; XID_Continue # Mc [2] NEWA VOWEL SIGN O..NEWA VOWEL SIGN AU +11442..11444 ; XID_Continue # Mn [3] NEWA SIGN VIRAMA..NEWA SIGN ANUSVARA +11445 ; XID_Continue # Mc NEWA SIGN VISARGA +11446 ; XID_Continue # Mn NEWA SIGN NUKTA +11447..1144A ; XID_Continue # Lo [4] NEWA SIGN AVAGRAHA..NEWA SIDDHI +11450..11459 ; XID_Continue # Nd [10] NEWA DIGIT ZERO..NEWA DIGIT NINE +1145E ; XID_Continue # Mn NEWA SANDHI MARK +11480..114AF ; XID_Continue # Lo [48] TIRHUTA ANJI..TIRHUTA LETTER HA +114B0..114B2 ; XID_Continue # Mc [3] TIRHUTA VOWEL SIGN AA..TIRHUTA VOWEL SIGN II +114B3..114B8 ; XID_Continue # Mn [6] TIRHUTA VOWEL SIGN U..TIRHUTA VOWEL SIGN VOCALIC LL +114B9 ; XID_Continue # Mc TIRHUTA VOWEL SIGN E +114BA ; XID_Continue # Mn TIRHUTA VOWEL SIGN SHORT E +114BB..114BE ; XID_Continue # Mc [4] TIRHUTA VOWEL SIGN AI..TIRHUTA VOWEL SIGN AU +114BF..114C0 ; XID_Continue # Mn [2] TIRHUTA SIGN CANDRABINDU..TIRHUTA SIGN ANUSVARA +114C1 ; XID_Continue # Mc TIRHUTA SIGN VISARGA +114C2..114C3 ; XID_Continue # Mn [2] TIRHUTA SIGN VIRAMA..TIRHUTA SIGN NUKTA +114C4..114C5 ; XID_Continue # Lo [2] TIRHUTA SIGN AVAGRAHA..TIRHUTA GVANG +114C7 ; XID_Continue # Lo TIRHUTA OM +114D0..114D9 ; XID_Continue # Nd [10] TIRHUTA DIGIT ZERO..TIRHUTA DIGIT NINE +11580..115AE ; XID_Continue # Lo [47] SIDDHAM LETTER A..SIDDHAM LETTER HA +115AF..115B1 ; XID_Continue # Mc [3] SIDDHAM VOWEL SIGN AA..SIDDHAM VOWEL SIGN II +115B2..115B5 ; XID_Continue # Mn [4] SIDDHAM VOWEL SIGN U..SIDDHAM VOWEL SIGN VOCALIC RR +115B8..115BB ; XID_Continue # Mc [4] SIDDHAM VOWEL SIGN E..SIDDHAM VOWEL SIGN AU +115BC..115BD ; XID_Continue # Mn [2] SIDDHAM SIGN CANDRABINDU..SIDDHAM SIGN ANUSVARA +115BE ; XID_Continue # Mc SIDDHAM SIGN VISARGA +115BF..115C0 ; XID_Continue # Mn [2] SIDDHAM SIGN VIRAMA..SIDDHAM SIGN NUKTA +115D8..115DB ; XID_Continue # Lo [4] SIDDHAM LETTER THREE-CIRCLE ALTERNATE I..SIDDHAM LETTER ALTERNATE U +115DC..115DD ; XID_Continue # Mn [2] SIDDHAM VOWEL SIGN ALTERNATE U..SIDDHAM VOWEL SIGN ALTERNATE UU +11600..1162F ; XID_Continue # Lo [48] MODI LETTER A..MODI LETTER LLA +11630..11632 ; XID_Continue # Mc [3] MODI VOWEL SIGN AA..MODI VOWEL SIGN II +11633..1163A ; XID_Continue # Mn [8] MODI VOWEL SIGN U..MODI VOWEL SIGN AI +1163B..1163C ; XID_Continue # Mc [2] MODI VOWEL SIGN O..MODI VOWEL SIGN AU +1163D ; XID_Continue # Mn MODI SIGN ANUSVARA +1163E ; XID_Continue # Mc MODI SIGN VISARGA +1163F..11640 ; XID_Continue # Mn [2] MODI SIGN VIRAMA..MODI SIGN ARDHACANDRA +11644 ; XID_Continue # Lo MODI SIGN HUVA +11650..11659 ; XID_Continue # Nd [10] MODI DIGIT ZERO..MODI DIGIT NINE +11680..116AA ; XID_Continue # Lo [43] TAKRI LETTER A..TAKRI LETTER RRA +116AB ; XID_Continue # Mn TAKRI SIGN ANUSVARA +116AC ; XID_Continue # Mc TAKRI SIGN VISARGA +116AD ; XID_Continue # Mn TAKRI VOWEL SIGN AA +116AE..116AF ; XID_Continue # Mc [2] TAKRI VOWEL SIGN I..TAKRI VOWEL SIGN II +116B0..116B5 ; XID_Continue # Mn [6] TAKRI VOWEL SIGN U..TAKRI VOWEL SIGN AU +116B6 ; XID_Continue # Mc TAKRI SIGN VIRAMA +116B7 ; XID_Continue # Mn TAKRI SIGN NUKTA +116C0..116C9 ; XID_Continue # Nd [10] TAKRI DIGIT ZERO..TAKRI DIGIT NINE +11700..1171A ; XID_Continue # Lo [27] AHOM LETTER KA..AHOM LETTER ALTERNATE BA +1171D..1171F ; XID_Continue # Mn [3] AHOM CONSONANT SIGN MEDIAL LA..AHOM CONSONANT SIGN MEDIAL LIGATING RA +11720..11721 ; XID_Continue # Mc [2] AHOM VOWEL SIGN A..AHOM VOWEL SIGN AA +11722..11725 ; XID_Continue # Mn [4] AHOM VOWEL SIGN I..AHOM VOWEL SIGN UU +11726 ; XID_Continue # Mc AHOM VOWEL SIGN E +11727..1172B ; XID_Continue # Mn [5] AHOM VOWEL SIGN AW..AHOM SIGN KILLER +11730..11739 ; XID_Continue # Nd [10] AHOM DIGIT ZERO..AHOM DIGIT NINE +11800..1182B ; XID_Continue # Lo [44] DOGRA LETTER A..DOGRA LETTER RRA +1182C..1182E ; XID_Continue # Mc [3] DOGRA VOWEL SIGN AA..DOGRA VOWEL SIGN II +1182F..11837 ; XID_Continue # Mn [9] DOGRA VOWEL SIGN U..DOGRA SIGN ANUSVARA +11838 ; XID_Continue # Mc DOGRA SIGN VISARGA +11839..1183A ; XID_Continue # Mn [2] DOGRA SIGN VIRAMA..DOGRA SIGN NUKTA +118A0..118DF ; XID_Continue # L& [64] WARANG CITI CAPITAL LETTER NGAA..WARANG CITI SMALL LETTER VIYO +118E0..118E9 ; XID_Continue # Nd [10] WARANG CITI DIGIT ZERO..WARANG CITI DIGIT NINE +118FF ; XID_Continue # Lo WARANG CITI OM +11A00 ; XID_Continue # Lo ZANABAZAR SQUARE LETTER A +11A01..11A0A ; XID_Continue # Mn [10] ZANABAZAR SQUARE VOWEL SIGN I..ZANABAZAR SQUARE VOWEL LENGTH MARK +11A0B..11A32 ; XID_Continue # Lo [40] ZANABAZAR SQUARE LETTER KA..ZANABAZAR SQUARE LETTER KSSA +11A33..11A38 ; XID_Continue # Mn [6] ZANABAZAR SQUARE FINAL CONSONANT MARK..ZANABAZAR SQUARE SIGN ANUSVARA +11A39 ; XID_Continue # Mc ZANABAZAR SQUARE SIGN VISARGA +11A3A ; XID_Continue # Lo ZANABAZAR SQUARE CLUSTER-INITIAL LETTER RA +11A3B..11A3E ; XID_Continue # Mn [4] ZANABAZAR SQUARE CLUSTER-FINAL LETTER YA..ZANABAZAR SQUARE CLUSTER-FINAL LETTER VA +11A47 ; XID_Continue # Mn ZANABAZAR SQUARE SUBJOINER +11A50 ; XID_Continue # Lo SOYOMBO LETTER A +11A51..11A56 ; XID_Continue # Mn [6] SOYOMBO VOWEL SIGN I..SOYOMBO VOWEL SIGN OE +11A57..11A58 ; XID_Continue # Mc [2] SOYOMBO VOWEL SIGN AI..SOYOMBO VOWEL SIGN AU +11A59..11A5B ; XID_Continue # Mn [3] SOYOMBO VOWEL SIGN VOCALIC R..SOYOMBO VOWEL LENGTH MARK +11A5C..11A83 ; XID_Continue # Lo [40] SOYOMBO LETTER KA..SOYOMBO LETTER KSSA +11A86..11A89 ; XID_Continue # Lo [4] SOYOMBO CLUSTER-INITIAL LETTER RA..SOYOMBO CLUSTER-INITIAL LETTER SA +11A8A..11A96 ; XID_Continue # Mn [13] SOYOMBO FINAL CONSONANT SIGN G..SOYOMBO SIGN ANUSVARA +11A97 ; XID_Continue # Mc SOYOMBO SIGN VISARGA +11A98..11A99 ; XID_Continue # Mn [2] SOYOMBO GEMINATION MARK..SOYOMBO SUBJOINER +11A9D ; XID_Continue # Lo SOYOMBO MARK PLUTA +11AC0..11AF8 ; XID_Continue # Lo [57] PAU CIN HAU LETTER PA..PAU CIN HAU GLOTTAL STOP FINAL +11C00..11C08 ; XID_Continue # Lo [9] BHAIKSUKI LETTER A..BHAIKSUKI LETTER VOCALIC L +11C0A..11C2E ; XID_Continue # Lo [37] BHAIKSUKI LETTER E..BHAIKSUKI LETTER HA +11C2F ; XID_Continue # Mc BHAIKSUKI VOWEL SIGN AA +11C30..11C36 ; XID_Continue # Mn [7] BHAIKSUKI VOWEL SIGN I..BHAIKSUKI VOWEL SIGN VOCALIC L +11C38..11C3D ; XID_Continue # Mn [6] BHAIKSUKI VOWEL SIGN E..BHAIKSUKI SIGN ANUSVARA +11C3E ; XID_Continue # Mc BHAIKSUKI SIGN VISARGA +11C3F ; XID_Continue # Mn BHAIKSUKI SIGN VIRAMA +11C40 ; XID_Continue # Lo BHAIKSUKI SIGN AVAGRAHA +11C50..11C59 ; XID_Continue # Nd [10] BHAIKSUKI DIGIT ZERO..BHAIKSUKI DIGIT NINE +11C72..11C8F ; XID_Continue # Lo [30] MARCHEN LETTER KA..MARCHEN LETTER A +11C92..11CA7 ; XID_Continue # Mn [22] MARCHEN SUBJOINED LETTER KA..MARCHEN SUBJOINED LETTER ZA +11CA9 ; XID_Continue # Mc MARCHEN SUBJOINED LETTER YA +11CAA..11CB0 ; XID_Continue # Mn [7] MARCHEN SUBJOINED LETTER RA..MARCHEN VOWEL SIGN AA +11CB1 ; XID_Continue # Mc MARCHEN VOWEL SIGN I +11CB2..11CB3 ; XID_Continue # Mn [2] MARCHEN VOWEL SIGN U..MARCHEN VOWEL SIGN E +11CB4 ; XID_Continue # Mc MARCHEN VOWEL SIGN O +11CB5..11CB6 ; XID_Continue # Mn [2] MARCHEN SIGN ANUSVARA..MARCHEN SIGN CANDRABINDU +11D00..11D06 ; XID_Continue # Lo [7] MASARAM GONDI LETTER A..MASARAM GONDI LETTER E +11D08..11D09 ; XID_Continue # Lo [2] MASARAM GONDI LETTER AI..MASARAM GONDI LETTER O +11D0B..11D30 ; XID_Continue # Lo [38] MASARAM GONDI LETTER AU..MASARAM GONDI LETTER TRA +11D31..11D36 ; XID_Continue # Mn [6] MASARAM GONDI VOWEL SIGN AA..MASARAM GONDI VOWEL SIGN VOCALIC R +11D3A ; XID_Continue # Mn MASARAM GONDI VOWEL SIGN E +11D3C..11D3D ; XID_Continue # Mn [2] MASARAM GONDI VOWEL SIGN AI..MASARAM GONDI VOWEL SIGN O +11D3F..11D45 ; XID_Continue # Mn [7] MASARAM GONDI VOWEL SIGN AU..MASARAM GONDI VIRAMA +11D46 ; XID_Continue # Lo MASARAM GONDI REPHA +11D47 ; XID_Continue # Mn MASARAM GONDI RA-KARA +11D50..11D59 ; XID_Continue # Nd [10] MASARAM GONDI DIGIT ZERO..MASARAM GONDI DIGIT NINE +11D60..11D65 ; XID_Continue # Lo [6] GUNJALA GONDI LETTER A..GUNJALA GONDI LETTER UU +11D67..11D68 ; XID_Continue # Lo [2] GUNJALA GONDI LETTER EE..GUNJALA GONDI LETTER AI +11D6A..11D89 ; XID_Continue # Lo [32] GUNJALA GONDI LETTER OO..GUNJALA GONDI LETTER SA +11D8A..11D8E ; XID_Continue # Mc [5] GUNJALA GONDI VOWEL SIGN AA..GUNJALA GONDI VOWEL SIGN UU +11D90..11D91 ; XID_Continue # Mn [2] GUNJALA GONDI VOWEL SIGN EE..GUNJALA GONDI VOWEL SIGN AI +11D93..11D94 ; XID_Continue # Mc [2] GUNJALA GONDI VOWEL SIGN OO..GUNJALA GONDI VOWEL SIGN AU +11D95 ; XID_Continue # Mn GUNJALA GONDI SIGN ANUSVARA +11D96 ; XID_Continue # Mc GUNJALA GONDI SIGN VISARGA +11D97 ; XID_Continue # Mn GUNJALA GONDI VIRAMA +11D98 ; XID_Continue # Lo GUNJALA GONDI OM +11DA0..11DA9 ; XID_Continue # Nd [10] GUNJALA GONDI DIGIT ZERO..GUNJALA GONDI DIGIT NINE +11EE0..11EF2 ; XID_Continue # Lo [19] MAKASAR LETTER KA..MAKASAR ANGKA +11EF3..11EF4 ; XID_Continue # Mn [2] MAKASAR VOWEL SIGN I..MAKASAR VOWEL SIGN U +11EF5..11EF6 ; XID_Continue # Mc [2] MAKASAR VOWEL SIGN E..MAKASAR VOWEL SIGN O +12000..12399 ; XID_Continue # Lo [922] CUNEIFORM SIGN A..CUNEIFORM SIGN U U +12400..1246E ; XID_Continue # Nl [111] CUNEIFORM NUMERIC SIGN TWO ASH..CUNEIFORM NUMERIC SIGN NINE U VARIANT FORM +12480..12543 ; XID_Continue # Lo [196] CUNEIFORM SIGN AB TIMES NUN TENU..CUNEIFORM SIGN ZU5 TIMES THREE DISH TENU +13000..1342E ; XID_Continue # Lo [1071] EGYPTIAN HIEROGLYPH A001..EGYPTIAN HIEROGLYPH AA032 +14400..14646 ; XID_Continue # Lo [583] ANATOLIAN HIEROGLYPH A001..ANATOLIAN HIEROGLYPH A530 +16800..16A38 ; XID_Continue # Lo [569] BAMUM LETTER PHASE-A NGKUE MFON..BAMUM LETTER PHASE-F VUEQ +16A40..16A5E ; XID_Continue # Lo [31] MRO LETTER TA..MRO LETTER TEK +16A60..16A69 ; XID_Continue # Nd [10] MRO DIGIT ZERO..MRO DIGIT NINE +16AD0..16AED ; XID_Continue # Lo [30] BASSA VAH LETTER ENNI..BASSA VAH LETTER I +16AF0..16AF4 ; XID_Continue # Mn [5] BASSA VAH COMBINING HIGH TONE..BASSA VAH COMBINING HIGH-LOW TONE +16B00..16B2F ; XID_Continue # Lo [48] PAHAWH HMONG VOWEL KEEB..PAHAWH HMONG CONSONANT CAU +16B30..16B36 ; XID_Continue # Mn [7] PAHAWH HMONG MARK CIM TUB..PAHAWH HMONG MARK CIM TAUM +16B40..16B43 ; XID_Continue # Lm [4] PAHAWH HMONG SIGN VOS SEEV..PAHAWH HMONG SIGN IB YAM +16B50..16B59 ; XID_Continue # Nd [10] PAHAWH HMONG DIGIT ZERO..PAHAWH HMONG DIGIT NINE +16B63..16B77 ; XID_Continue # Lo [21] PAHAWH HMONG SIGN VOS LUB..PAHAWH HMONG SIGN CIM NRES TOS +16B7D..16B8F ; XID_Continue # Lo [19] PAHAWH HMONG CLAN SIGN TSHEEJ..PAHAWH HMONG CLAN SIGN VWJ +16E40..16E7F ; XID_Continue # L& [64] MEDEFAIDRIN CAPITAL LETTER M..MEDEFAIDRIN SMALL LETTER Y +16F00..16F44 ; XID_Continue # Lo [69] MIAO LETTER PA..MIAO LETTER HHA +16F50 ; XID_Continue # Lo MIAO LETTER NASALIZATION +16F51..16F7E ; XID_Continue # Mc [46] MIAO SIGN ASPIRATION..MIAO VOWEL SIGN NG +16F8F..16F92 ; XID_Continue # Mn [4] MIAO TONE RIGHT..MIAO TONE BELOW +16F93..16F9F ; XID_Continue # Lm [13] MIAO LETTER TONE-2..MIAO LETTER REFORMED TONE-8 +16FE0..16FE1 ; XID_Continue # Lm [2] TANGUT ITERATION MARK..NUSHU ITERATION MARK +17000..187F1 ; XID_Continue # Lo [6130] TANGUT IDEOGRAPH-17000..TANGUT IDEOGRAPH-187F1 +18800..18AF2 ; XID_Continue # Lo [755] TANGUT COMPONENT-001..TANGUT COMPONENT-755 +1B000..1B11E ; XID_Continue # Lo [287] KATAKANA LETTER ARCHAIC E..HENTAIGANA LETTER N-MU-MO-2 +1B170..1B2FB ; XID_Continue # Lo [396] NUSHU CHARACTER-1B170..NUSHU CHARACTER-1B2FB +1BC00..1BC6A ; XID_Continue # Lo [107] DUPLOYAN LETTER H..DUPLOYAN LETTER VOCALIC M +1BC70..1BC7C ; XID_Continue # Lo [13] DUPLOYAN AFFIX LEFT HORIZONTAL SECANT..DUPLOYAN AFFIX ATTACHED TANGENT HOOK +1BC80..1BC88 ; XID_Continue # Lo [9] DUPLOYAN AFFIX HIGH ACUTE..DUPLOYAN AFFIX HIGH VERTICAL +1BC90..1BC99 ; XID_Continue # Lo [10] DUPLOYAN AFFIX LOW ACUTE..DUPLOYAN AFFIX LOW ARROW +1BC9D..1BC9E ; XID_Continue # Mn [2] DUPLOYAN THICK LETTER SELECTOR..DUPLOYAN DOUBLE MARK +1D165..1D166 ; XID_Continue # Mc [2] MUSICAL SYMBOL COMBINING STEM..MUSICAL SYMBOL COMBINING SPRECHGESANG STEM +1D167..1D169 ; XID_Continue # Mn [3] MUSICAL SYMBOL COMBINING TREMOLO-1..MUSICAL SYMBOL COMBINING TREMOLO-3 +1D16D..1D172 ; XID_Continue # Mc [6] MUSICAL SYMBOL COMBINING AUGMENTATION DOT..MUSICAL SYMBOL COMBINING FLAG-5 +1D17B..1D182 ; XID_Continue # Mn [8] MUSICAL SYMBOL COMBINING ACCENT..MUSICAL SYMBOL COMBINING LOURE +1D185..1D18B ; XID_Continue # Mn [7] MUSICAL SYMBOL COMBINING DOIT..MUSICAL SYMBOL COMBINING TRIPLE TONGUE +1D1AA..1D1AD ; XID_Continue # Mn [4] MUSICAL SYMBOL COMBINING DOWN BOW..MUSICAL SYMBOL COMBINING SNAP PIZZICATO +1D242..1D244 ; XID_Continue # Mn [3] COMBINING GREEK MUSICAL TRISEME..COMBINING GREEK MUSICAL PENTASEME +1D400..1D454 ; XID_Continue # L& [85] MATHEMATICAL BOLD CAPITAL A..MATHEMATICAL ITALIC SMALL G +1D456..1D49C ; XID_Continue # L& [71] MATHEMATICAL ITALIC SMALL I..MATHEMATICAL SCRIPT CAPITAL A +1D49E..1D49F ; XID_Continue # L& [2] MATHEMATICAL SCRIPT CAPITAL C..MATHEMATICAL SCRIPT CAPITAL D +1D4A2 ; XID_Continue # L& MATHEMATICAL SCRIPT CAPITAL G +1D4A5..1D4A6 ; XID_Continue # L& [2] MATHEMATICAL SCRIPT CAPITAL J..MATHEMATICAL SCRIPT CAPITAL K +1D4A9..1D4AC ; XID_Continue # L& [4] MATHEMATICAL SCRIPT CAPITAL N..MATHEMATICAL SCRIPT CAPITAL Q +1D4AE..1D4B9 ; XID_Continue # L& [12] MATHEMATICAL SCRIPT CAPITAL S..MATHEMATICAL SCRIPT SMALL D +1D4BB ; XID_Continue # L& MATHEMATICAL SCRIPT SMALL F +1D4BD..1D4C3 ; XID_Continue # L& [7] MATHEMATICAL SCRIPT SMALL H..MATHEMATICAL SCRIPT SMALL N +1D4C5..1D505 ; XID_Continue # L& [65] MATHEMATICAL SCRIPT SMALL P..MATHEMATICAL FRAKTUR CAPITAL B +1D507..1D50A ; XID_Continue # L& [4] MATHEMATICAL FRAKTUR CAPITAL D..MATHEMATICAL FRAKTUR CAPITAL G +1D50D..1D514 ; XID_Continue # L& [8] MATHEMATICAL FRAKTUR CAPITAL J..MATHEMATICAL FRAKTUR CAPITAL Q +1D516..1D51C ; XID_Continue # L& [7] MATHEMATICAL FRAKTUR CAPITAL S..MATHEMATICAL FRAKTUR CAPITAL Y +1D51E..1D539 ; XID_Continue # L& [28] MATHEMATICAL FRAKTUR SMALL A..MATHEMATICAL DOUBLE-STRUCK CAPITAL B +1D53B..1D53E ; XID_Continue # L& [4] MATHEMATICAL DOUBLE-STRUCK CAPITAL D..MATHEMATICAL DOUBLE-STRUCK CAPITAL G +1D540..1D544 ; XID_Continue # L& [5] MATHEMATICAL DOUBLE-STRUCK CAPITAL I..MATHEMATICAL DOUBLE-STRUCK CAPITAL M +1D546 ; XID_Continue # L& MATHEMATICAL DOUBLE-STRUCK CAPITAL O +1D54A..1D550 ; XID_Continue # L& [7] MATHEMATICAL DOUBLE-STRUCK CAPITAL S..MATHEMATICAL DOUBLE-STRUCK CAPITAL Y +1D552..1D6A5 ; XID_Continue # L& [340] MATHEMATICAL DOUBLE-STRUCK SMALL A..MATHEMATICAL ITALIC SMALL DOTLESS J +1D6A8..1D6C0 ; XID_Continue # L& [25] MATHEMATICAL BOLD CAPITAL ALPHA..MATHEMATICAL BOLD CAPITAL OMEGA +1D6C2..1D6DA ; XID_Continue # L& [25] MATHEMATICAL BOLD SMALL ALPHA..MATHEMATICAL BOLD SMALL OMEGA +1D6DC..1D6FA ; XID_Continue # L& [31] MATHEMATICAL BOLD EPSILON SYMBOL..MATHEMATICAL ITALIC CAPITAL OMEGA +1D6FC..1D714 ; XID_Continue # L& [25] MATHEMATICAL ITALIC SMALL ALPHA..MATHEMATICAL ITALIC SMALL OMEGA +1D716..1D734 ; XID_Continue # L& [31] MATHEMATICAL ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD ITALIC CAPITAL OMEGA +1D736..1D74E ; XID_Continue # L& [25] MATHEMATICAL BOLD ITALIC SMALL ALPHA..MATHEMATICAL BOLD ITALIC SMALL OMEGA +1D750..1D76E ; XID_Continue # L& [31] MATHEMATICAL BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA +1D770..1D788 ; XID_Continue # L& [25] MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA +1D78A..1D7A8 ; XID_Continue # L& [31] MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA +1D7AA..1D7C2 ; XID_Continue # L& [25] MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA +1D7C4..1D7CB ; XID_Continue # L& [8] MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD SMALL DIGAMMA +1D7CE..1D7FF ; XID_Continue # Nd [50] MATHEMATICAL BOLD DIGIT ZERO..MATHEMATICAL MONOSPACE DIGIT NINE +1DA00..1DA36 ; XID_Continue # Mn [55] SIGNWRITING HEAD RIM..SIGNWRITING AIR SUCKING IN +1DA3B..1DA6C ; XID_Continue # Mn [50] SIGNWRITING MOUTH CLOSED NEUTRAL..SIGNWRITING EXCITEMENT +1DA75 ; XID_Continue # Mn SIGNWRITING UPPER BODY TILTING FROM HIP JOINTS +1DA84 ; XID_Continue # Mn SIGNWRITING LOCATION HEAD NECK +1DA9B..1DA9F ; XID_Continue # Mn [5] SIGNWRITING FILL MODIFIER-2..SIGNWRITING FILL MODIFIER-6 +1DAA1..1DAAF ; XID_Continue # Mn [15] SIGNWRITING ROTATION MODIFIER-2..SIGNWRITING ROTATION MODIFIER-16 +1E000..1E006 ; XID_Continue # Mn [7] COMBINING GLAGOLITIC LETTER AZU..COMBINING GLAGOLITIC LETTER ZHIVETE +1E008..1E018 ; XID_Continue # Mn [17] COMBINING GLAGOLITIC LETTER ZEMLJA..COMBINING GLAGOLITIC LETTER HERU +1E01B..1E021 ; XID_Continue # Mn [7] COMBINING GLAGOLITIC LETTER SHTA..COMBINING GLAGOLITIC LETTER YATI +1E023..1E024 ; XID_Continue # Mn [2] COMBINING GLAGOLITIC LETTER YU..COMBINING GLAGOLITIC LETTER SMALL YUS +1E026..1E02A ; XID_Continue # Mn [5] COMBINING GLAGOLITIC LETTER YO..COMBINING GLAGOLITIC LETTER FITA +1E800..1E8C4 ; XID_Continue # Lo [197] MENDE KIKAKUI SYLLABLE M001 KI..MENDE KIKAKUI SYLLABLE M060 NYON +1E8D0..1E8D6 ; XID_Continue # Mn [7] MENDE KIKAKUI COMBINING NUMBER TEENS..MENDE KIKAKUI COMBINING NUMBER MILLIONS +1E900..1E943 ; XID_Continue # L& [68] ADLAM CAPITAL LETTER ALIF..ADLAM SMALL LETTER SHA +1E944..1E94A ; XID_Continue # Mn [7] ADLAM ALIF LENGTHENER..ADLAM NUKTA +1E950..1E959 ; XID_Continue # Nd [10] ADLAM DIGIT ZERO..ADLAM DIGIT NINE +1EE00..1EE03 ; XID_Continue # Lo [4] ARABIC MATHEMATICAL ALEF..ARABIC MATHEMATICAL DAL +1EE05..1EE1F ; XID_Continue # Lo [27] ARABIC MATHEMATICAL WAW..ARABIC MATHEMATICAL DOTLESS QAF +1EE21..1EE22 ; XID_Continue # Lo [2] ARABIC MATHEMATICAL INITIAL BEH..ARABIC MATHEMATICAL INITIAL JEEM +1EE24 ; XID_Continue # Lo ARABIC MATHEMATICAL INITIAL HEH +1EE27 ; XID_Continue # Lo ARABIC MATHEMATICAL INITIAL HAH +1EE29..1EE32 ; XID_Continue # Lo [10] ARABIC MATHEMATICAL INITIAL YEH..ARABIC MATHEMATICAL INITIAL QAF +1EE34..1EE37 ; XID_Continue # Lo [4] ARABIC MATHEMATICAL INITIAL SHEEN..ARABIC MATHEMATICAL INITIAL KHAH +1EE39 ; XID_Continue # Lo ARABIC MATHEMATICAL INITIAL DAD +1EE3B ; XID_Continue # Lo ARABIC MATHEMATICAL INITIAL GHAIN +1EE42 ; XID_Continue # Lo ARABIC MATHEMATICAL TAILED JEEM +1EE47 ; XID_Continue # Lo ARABIC MATHEMATICAL TAILED HAH +1EE49 ; XID_Continue # Lo ARABIC MATHEMATICAL TAILED YEH +1EE4B ; XID_Continue # Lo ARABIC MATHEMATICAL TAILED LAM +1EE4D..1EE4F ; XID_Continue # Lo [3] ARABIC MATHEMATICAL TAILED NOON..ARABIC MATHEMATICAL TAILED AIN +1EE51..1EE52 ; XID_Continue # Lo [2] ARABIC MATHEMATICAL TAILED SAD..ARABIC MATHEMATICAL TAILED QAF +1EE54 ; XID_Continue # Lo ARABIC MATHEMATICAL TAILED SHEEN +1EE57 ; XID_Continue # Lo ARABIC MATHEMATICAL TAILED KHAH +1EE59 ; XID_Continue # Lo ARABIC MATHEMATICAL TAILED DAD +1EE5B ; XID_Continue # Lo ARABIC MATHEMATICAL TAILED GHAIN +1EE5D ; XID_Continue # Lo ARABIC MATHEMATICAL TAILED DOTLESS NOON +1EE5F ; XID_Continue # Lo ARABIC MATHEMATICAL TAILED DOTLESS QAF +1EE61..1EE62 ; XID_Continue # Lo [2] ARABIC MATHEMATICAL STRETCHED BEH..ARABIC MATHEMATICAL STRETCHED JEEM +1EE64 ; XID_Continue # Lo ARABIC MATHEMATICAL STRETCHED HEH +1EE67..1EE6A ; XID_Continue # Lo [4] ARABIC MATHEMATICAL STRETCHED HAH..ARABIC MATHEMATICAL STRETCHED KAF +1EE6C..1EE72 ; XID_Continue # Lo [7] ARABIC MATHEMATICAL STRETCHED MEEM..ARABIC MATHEMATICAL STRETCHED QAF +1EE74..1EE77 ; XID_Continue # Lo [4] ARABIC MATHEMATICAL STRETCHED SHEEN..ARABIC MATHEMATICAL STRETCHED KHAH +1EE79..1EE7C ; XID_Continue # Lo [4] ARABIC MATHEMATICAL STRETCHED DAD..ARABIC MATHEMATICAL STRETCHED DOTLESS BEH +1EE7E ; XID_Continue # Lo ARABIC MATHEMATICAL STRETCHED DOTLESS FEH +1EE80..1EE89 ; XID_Continue # Lo [10] ARABIC MATHEMATICAL LOOPED ALEF..ARABIC MATHEMATICAL LOOPED YEH +1EE8B..1EE9B ; XID_Continue # Lo [17] ARABIC MATHEMATICAL LOOPED LAM..ARABIC MATHEMATICAL LOOPED GHAIN +1EEA1..1EEA3 ; XID_Continue # Lo [3] ARABIC MATHEMATICAL DOUBLE-STRUCK BEH..ARABIC MATHEMATICAL DOUBLE-STRUCK DAL +1EEA5..1EEA9 ; XID_Continue # Lo [5] ARABIC MATHEMATICAL DOUBLE-STRUCK WAW..ARABIC MATHEMATICAL DOUBLE-STRUCK YEH +1EEAB..1EEBB ; XID_Continue # Lo [17] ARABIC MATHEMATICAL DOUBLE-STRUCK LAM..ARABIC MATHEMATICAL DOUBLE-STRUCK GHAIN +20000..2A6D6 ; XID_Continue # Lo [42711] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6D6 +2A700..2B734 ; XID_Continue # Lo [4149] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B734 +2B740..2B81D ; XID_Continue # Lo [222] CJK UNIFIED IDEOGRAPH-2B740..CJK UNIFIED IDEOGRAPH-2B81D +2B820..2CEA1 ; XID_Continue # Lo [5762] CJK UNIFIED IDEOGRAPH-2B820..CJK UNIFIED IDEOGRAPH-2CEA1 +2CEB0..2EBE0 ; XID_Continue # Lo [7473] CJK UNIFIED IDEOGRAPH-2CEB0..CJK UNIFIED IDEOGRAPH-2EBE0 +2F800..2FA1D ; XID_Continue # Lo [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D +E0100..E01EF ; XID_Continue # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256 + +# Total code points: 128491 + +# ================================================ + +# Derived Property: Default_Ignorable_Code_Point +# Generated from +# Other_Default_Ignorable_Code_Point +# + Cf (Format characters) +# + Variation_Selector +# - White_Space +# - FFF9..FFFB (Annotation characters) +# - Prepended_Concatenation_Mark (Exceptional format characters that should be visible) + +00AD ; Default_Ignorable_Code_Point # Cf SOFT HYPHEN +034F ; Default_Ignorable_Code_Point # Mn COMBINING GRAPHEME JOINER +061C ; Default_Ignorable_Code_Point # Cf ARABIC LETTER MARK +115F..1160 ; Default_Ignorable_Code_Point # Lo [2] HANGUL CHOSEONG FILLER..HANGUL JUNGSEONG FILLER +17B4..17B5 ; Default_Ignorable_Code_Point # Mn [2] KHMER VOWEL INHERENT AQ..KHMER VOWEL INHERENT AA +180B..180D ; Default_Ignorable_Code_Point # Mn [3] MONGOLIAN FREE VARIATION SELECTOR ONE..MONGOLIAN FREE VARIATION SELECTOR THREE +180E ; Default_Ignorable_Code_Point # Cf MONGOLIAN VOWEL SEPARATOR +200B..200F ; Default_Ignorable_Code_Point # Cf [5] ZERO WIDTH SPACE..RIGHT-TO-LEFT MARK +202A..202E ; Default_Ignorable_Code_Point # Cf [5] LEFT-TO-RIGHT EMBEDDING..RIGHT-TO-LEFT OVERRIDE +2060..2064 ; Default_Ignorable_Code_Point # Cf [5] WORD JOINER..INVISIBLE PLUS +2065 ; Default_Ignorable_Code_Point # Cn +2066..206F ; Default_Ignorable_Code_Point # Cf [10] LEFT-TO-RIGHT ISOLATE..NOMINAL DIGIT SHAPES +3164 ; Default_Ignorable_Code_Point # Lo HANGUL FILLER +FE00..FE0F ; Default_Ignorable_Code_Point # Mn [16] VARIATION SELECTOR-1..VARIATION SELECTOR-16 +FEFF ; Default_Ignorable_Code_Point # Cf ZERO WIDTH NO-BREAK SPACE +FFA0 ; Default_Ignorable_Code_Point # Lo HALFWIDTH HANGUL FILLER +FFF0..FFF8 ; Default_Ignorable_Code_Point # Cn [9] .. +1BCA0..1BCA3 ; Default_Ignorable_Code_Point # Cf [4] SHORTHAND FORMAT LETTER OVERLAP..SHORTHAND FORMAT UP STEP +1D173..1D17A ; Default_Ignorable_Code_Point # Cf [8] MUSICAL SYMBOL BEGIN BEAM..MUSICAL SYMBOL END PHRASE +E0000 ; Default_Ignorable_Code_Point # Cn +E0001 ; Default_Ignorable_Code_Point # Cf LANGUAGE TAG +E0002..E001F ; Default_Ignorable_Code_Point # Cn [30] .. +E0020..E007F ; Default_Ignorable_Code_Point # Cf [96] TAG SPACE..CANCEL TAG +E0080..E00FF ; Default_Ignorable_Code_Point # Cn [128] .. +E0100..E01EF ; Default_Ignorable_Code_Point # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256 +E01F0..E0FFF ; Default_Ignorable_Code_Point # Cn [3600] .. + +# Total code points: 4173 + +# ================================================ + +# Derived Property: Grapheme_Extend +# Generated from: Me + Mn + Other_Grapheme_Extend +# Note: depending on an application's interpretation of Co (private use), +# they may be either in Grapheme_Base, or in Grapheme_Extend, or in neither. + +0300..036F ; Grapheme_Extend # Mn [112] COMBINING GRAVE ACCENT..COMBINING LATIN SMALL LETTER X +0483..0487 ; Grapheme_Extend # Mn [5] COMBINING CYRILLIC TITLO..COMBINING CYRILLIC POKRYTIE +0488..0489 ; Grapheme_Extend # Me [2] COMBINING CYRILLIC HUNDRED THOUSANDS SIGN..COMBINING CYRILLIC MILLIONS SIGN +0591..05BD ; Grapheme_Extend # Mn [45] HEBREW ACCENT ETNAHTA..HEBREW POINT METEG +05BF ; Grapheme_Extend # Mn HEBREW POINT RAFE +05C1..05C2 ; Grapheme_Extend # Mn [2] HEBREW POINT SHIN DOT..HEBREW POINT SIN DOT +05C4..05C5 ; Grapheme_Extend # Mn [2] HEBREW MARK UPPER DOT..HEBREW MARK LOWER DOT +05C7 ; Grapheme_Extend # Mn HEBREW POINT QAMATS QATAN +0610..061A ; Grapheme_Extend # Mn [11] ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM..ARABIC SMALL KASRA +064B..065F ; Grapheme_Extend # Mn [21] ARABIC FATHATAN..ARABIC WAVY HAMZA BELOW +0670 ; Grapheme_Extend # Mn ARABIC LETTER SUPERSCRIPT ALEF +06D6..06DC ; Grapheme_Extend # Mn [7] ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA..ARABIC SMALL HIGH SEEN +06DF..06E4 ; Grapheme_Extend # Mn [6] ARABIC SMALL HIGH ROUNDED ZERO..ARABIC SMALL HIGH MADDA +06E7..06E8 ; Grapheme_Extend # Mn [2] ARABIC SMALL HIGH YEH..ARABIC SMALL HIGH NOON +06EA..06ED ; Grapheme_Extend # Mn [4] ARABIC EMPTY CENTRE LOW STOP..ARABIC SMALL LOW MEEM +0711 ; Grapheme_Extend # Mn SYRIAC LETTER SUPERSCRIPT ALAPH +0730..074A ; Grapheme_Extend # Mn [27] SYRIAC PTHAHA ABOVE..SYRIAC BARREKH +07A6..07B0 ; Grapheme_Extend # Mn [11] THAANA ABAFILI..THAANA SUKUN +07EB..07F3 ; Grapheme_Extend # Mn [9] NKO COMBINING SHORT HIGH TONE..NKO COMBINING DOUBLE DOT ABOVE +07FD ; Grapheme_Extend # Mn NKO DANTAYALAN +0816..0819 ; Grapheme_Extend # Mn [4] SAMARITAN MARK IN..SAMARITAN MARK DAGESH +081B..0823 ; Grapheme_Extend # Mn [9] SAMARITAN MARK EPENTHETIC YUT..SAMARITAN VOWEL SIGN A +0825..0827 ; Grapheme_Extend # Mn [3] SAMARITAN VOWEL SIGN SHORT A..SAMARITAN VOWEL SIGN U +0829..082D ; Grapheme_Extend # Mn [5] SAMARITAN VOWEL SIGN LONG I..SAMARITAN MARK NEQUDAA +0859..085B ; Grapheme_Extend # Mn [3] MANDAIC AFFRICATION MARK..MANDAIC GEMINATION MARK +08D3..08E1 ; Grapheme_Extend # Mn [15] ARABIC SMALL LOW WAW..ARABIC SMALL HIGH SIGN SAFHA +08E3..0902 ; Grapheme_Extend # Mn [32] ARABIC TURNED DAMMA BELOW..DEVANAGARI SIGN ANUSVARA +093A ; Grapheme_Extend # Mn DEVANAGARI VOWEL SIGN OE +093C ; Grapheme_Extend # Mn DEVANAGARI SIGN NUKTA +0941..0948 ; Grapheme_Extend # Mn [8] DEVANAGARI VOWEL SIGN U..DEVANAGARI VOWEL SIGN AI +094D ; Grapheme_Extend # Mn DEVANAGARI SIGN VIRAMA +0951..0957 ; Grapheme_Extend # Mn [7] DEVANAGARI STRESS SIGN UDATTA..DEVANAGARI VOWEL SIGN UUE +0962..0963 ; Grapheme_Extend # Mn [2] DEVANAGARI VOWEL SIGN VOCALIC L..DEVANAGARI VOWEL SIGN VOCALIC LL +0981 ; Grapheme_Extend # Mn BENGALI SIGN CANDRABINDU +09BC ; Grapheme_Extend # Mn BENGALI SIGN NUKTA +09BE ; Grapheme_Extend # Mc BENGALI VOWEL SIGN AA +09C1..09C4 ; Grapheme_Extend # Mn [4] BENGALI VOWEL SIGN U..BENGALI VOWEL SIGN VOCALIC RR +09CD ; Grapheme_Extend # Mn BENGALI SIGN VIRAMA +09D7 ; Grapheme_Extend # Mc BENGALI AU LENGTH MARK +09E2..09E3 ; Grapheme_Extend # Mn [2] BENGALI VOWEL SIGN VOCALIC L..BENGALI VOWEL SIGN VOCALIC LL +09FE ; Grapheme_Extend # Mn BENGALI SANDHI MARK +0A01..0A02 ; Grapheme_Extend # Mn [2] GURMUKHI SIGN ADAK BINDI..GURMUKHI SIGN BINDI +0A3C ; Grapheme_Extend # Mn GURMUKHI SIGN NUKTA +0A41..0A42 ; Grapheme_Extend # Mn [2] GURMUKHI VOWEL SIGN U..GURMUKHI VOWEL SIGN UU +0A47..0A48 ; Grapheme_Extend # Mn [2] GURMUKHI VOWEL SIGN EE..GURMUKHI VOWEL SIGN AI +0A4B..0A4D ; Grapheme_Extend # Mn [3] GURMUKHI VOWEL SIGN OO..GURMUKHI SIGN VIRAMA +0A51 ; Grapheme_Extend # Mn GURMUKHI SIGN UDAAT +0A70..0A71 ; Grapheme_Extend # Mn [2] GURMUKHI TIPPI..GURMUKHI ADDAK +0A75 ; Grapheme_Extend # Mn GURMUKHI SIGN YAKASH +0A81..0A82 ; Grapheme_Extend # Mn [2] GUJARATI SIGN CANDRABINDU..GUJARATI SIGN ANUSVARA +0ABC ; Grapheme_Extend # Mn GUJARATI SIGN NUKTA +0AC1..0AC5 ; Grapheme_Extend # Mn [5] GUJARATI VOWEL SIGN U..GUJARATI VOWEL SIGN CANDRA E +0AC7..0AC8 ; Grapheme_Extend # Mn [2] GUJARATI VOWEL SIGN E..GUJARATI VOWEL SIGN AI +0ACD ; Grapheme_Extend # Mn GUJARATI SIGN VIRAMA +0AE2..0AE3 ; Grapheme_Extend # Mn [2] GUJARATI VOWEL SIGN VOCALIC L..GUJARATI VOWEL SIGN VOCALIC LL +0AFA..0AFF ; Grapheme_Extend # Mn [6] GUJARATI SIGN SUKUN..GUJARATI SIGN TWO-CIRCLE NUKTA ABOVE +0B01 ; Grapheme_Extend # Mn ORIYA SIGN CANDRABINDU +0B3C ; Grapheme_Extend # Mn ORIYA SIGN NUKTA +0B3E ; Grapheme_Extend # Mc ORIYA VOWEL SIGN AA +0B3F ; Grapheme_Extend # Mn ORIYA VOWEL SIGN I +0B41..0B44 ; Grapheme_Extend # Mn [4] ORIYA VOWEL SIGN U..ORIYA VOWEL SIGN VOCALIC RR +0B4D ; Grapheme_Extend # Mn ORIYA SIGN VIRAMA +0B56 ; Grapheme_Extend # Mn ORIYA AI LENGTH MARK +0B57 ; Grapheme_Extend # Mc ORIYA AU LENGTH MARK +0B62..0B63 ; Grapheme_Extend # Mn [2] ORIYA VOWEL SIGN VOCALIC L..ORIYA VOWEL SIGN VOCALIC LL +0B82 ; Grapheme_Extend # Mn TAMIL SIGN ANUSVARA +0BBE ; Grapheme_Extend # Mc TAMIL VOWEL SIGN AA +0BC0 ; Grapheme_Extend # Mn TAMIL VOWEL SIGN II +0BCD ; Grapheme_Extend # Mn TAMIL SIGN VIRAMA +0BD7 ; Grapheme_Extend # Mc TAMIL AU LENGTH MARK +0C00 ; Grapheme_Extend # Mn TELUGU SIGN COMBINING CANDRABINDU ABOVE +0C04 ; Grapheme_Extend # Mn TELUGU SIGN COMBINING ANUSVARA ABOVE +0C3E..0C40 ; Grapheme_Extend # Mn [3] TELUGU VOWEL SIGN AA..TELUGU VOWEL SIGN II +0C46..0C48 ; Grapheme_Extend # Mn [3] TELUGU VOWEL SIGN E..TELUGU VOWEL SIGN AI +0C4A..0C4D ; Grapheme_Extend # Mn [4] TELUGU VOWEL SIGN O..TELUGU SIGN VIRAMA +0C55..0C56 ; Grapheme_Extend # Mn [2] TELUGU LENGTH MARK..TELUGU AI LENGTH MARK +0C62..0C63 ; Grapheme_Extend # Mn [2] TELUGU VOWEL SIGN VOCALIC L..TELUGU VOWEL SIGN VOCALIC LL +0C81 ; Grapheme_Extend # Mn KANNADA SIGN CANDRABINDU +0CBC ; Grapheme_Extend # Mn KANNADA SIGN NUKTA +0CBF ; Grapheme_Extend # Mn KANNADA VOWEL SIGN I +0CC2 ; Grapheme_Extend # Mc KANNADA VOWEL SIGN UU +0CC6 ; Grapheme_Extend # Mn KANNADA VOWEL SIGN E +0CCC..0CCD ; Grapheme_Extend # Mn [2] KANNADA VOWEL SIGN AU..KANNADA SIGN VIRAMA +0CD5..0CD6 ; Grapheme_Extend # Mc [2] KANNADA LENGTH MARK..KANNADA AI LENGTH MARK +0CE2..0CE3 ; Grapheme_Extend # Mn [2] KANNADA VOWEL SIGN VOCALIC L..KANNADA VOWEL SIGN VOCALIC LL +0D00..0D01 ; Grapheme_Extend # Mn [2] MALAYALAM SIGN COMBINING ANUSVARA ABOVE..MALAYALAM SIGN CANDRABINDU +0D3B..0D3C ; Grapheme_Extend # Mn [2] MALAYALAM SIGN VERTICAL BAR VIRAMA..MALAYALAM SIGN CIRCULAR VIRAMA +0D3E ; Grapheme_Extend # Mc MALAYALAM VOWEL SIGN AA +0D41..0D44 ; Grapheme_Extend # Mn [4] MALAYALAM VOWEL SIGN U..MALAYALAM VOWEL SIGN VOCALIC RR +0D4D ; Grapheme_Extend # Mn MALAYALAM SIGN VIRAMA +0D57 ; Grapheme_Extend # Mc MALAYALAM AU LENGTH MARK +0D62..0D63 ; Grapheme_Extend # Mn [2] MALAYALAM VOWEL SIGN VOCALIC L..MALAYALAM VOWEL SIGN VOCALIC LL +0DCA ; Grapheme_Extend # Mn SINHALA SIGN AL-LAKUNA +0DCF ; Grapheme_Extend # Mc SINHALA VOWEL SIGN AELA-PILLA +0DD2..0DD4 ; Grapheme_Extend # Mn [3] SINHALA VOWEL SIGN KETTI IS-PILLA..SINHALA VOWEL SIGN KETTI PAA-PILLA +0DD6 ; Grapheme_Extend # Mn SINHALA VOWEL SIGN DIGA PAA-PILLA +0DDF ; Grapheme_Extend # Mc SINHALA VOWEL SIGN GAYANUKITTA +0E31 ; Grapheme_Extend # Mn THAI CHARACTER MAI HAN-AKAT +0E34..0E3A ; Grapheme_Extend # Mn [7] THAI CHARACTER SARA I..THAI CHARACTER PHINTHU +0E47..0E4E ; Grapheme_Extend # Mn [8] THAI CHARACTER MAITAIKHU..THAI CHARACTER YAMAKKAN +0EB1 ; Grapheme_Extend # Mn LAO VOWEL SIGN MAI KAN +0EB4..0EB9 ; Grapheme_Extend # Mn [6] LAO VOWEL SIGN I..LAO VOWEL SIGN UU +0EBB..0EBC ; Grapheme_Extend # Mn [2] LAO VOWEL SIGN MAI KON..LAO SEMIVOWEL SIGN LO +0EC8..0ECD ; Grapheme_Extend # Mn [6] LAO TONE MAI EK..LAO NIGGAHITA +0F18..0F19 ; Grapheme_Extend # Mn [2] TIBETAN ASTROLOGICAL SIGN -KHYUD PA..TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS +0F35 ; Grapheme_Extend # Mn TIBETAN MARK NGAS BZUNG NYI ZLA +0F37 ; Grapheme_Extend # Mn TIBETAN MARK NGAS BZUNG SGOR RTAGS +0F39 ; Grapheme_Extend # Mn TIBETAN MARK TSA -PHRU +0F71..0F7E ; Grapheme_Extend # Mn [14] TIBETAN VOWEL SIGN AA..TIBETAN SIGN RJES SU NGA RO +0F80..0F84 ; Grapheme_Extend # Mn [5] TIBETAN VOWEL SIGN REVERSED I..TIBETAN MARK HALANTA +0F86..0F87 ; Grapheme_Extend # Mn [2] TIBETAN SIGN LCI RTAGS..TIBETAN SIGN YANG RTAGS +0F8D..0F97 ; Grapheme_Extend # Mn [11] TIBETAN SUBJOINED SIGN LCE TSA CAN..TIBETAN SUBJOINED LETTER JA +0F99..0FBC ; Grapheme_Extend # Mn [36] TIBETAN SUBJOINED LETTER NYA..TIBETAN SUBJOINED LETTER FIXED-FORM RA +0FC6 ; Grapheme_Extend # Mn TIBETAN SYMBOL PADMA GDAN +102D..1030 ; Grapheme_Extend # Mn [4] MYANMAR VOWEL SIGN I..MYANMAR VOWEL SIGN UU +1032..1037 ; Grapheme_Extend # Mn [6] MYANMAR VOWEL SIGN AI..MYANMAR SIGN DOT BELOW +1039..103A ; Grapheme_Extend # Mn [2] MYANMAR SIGN VIRAMA..MYANMAR SIGN ASAT +103D..103E ; Grapheme_Extend # Mn [2] MYANMAR CONSONANT SIGN MEDIAL WA..MYANMAR CONSONANT SIGN MEDIAL HA +1058..1059 ; Grapheme_Extend # Mn [2] MYANMAR VOWEL SIGN VOCALIC L..MYANMAR VOWEL SIGN VOCALIC LL +105E..1060 ; Grapheme_Extend # Mn [3] MYANMAR CONSONANT SIGN MON MEDIAL NA..MYANMAR CONSONANT SIGN MON MEDIAL LA +1071..1074 ; Grapheme_Extend # Mn [4] MYANMAR VOWEL SIGN GEBA KAREN I..MYANMAR VOWEL SIGN KAYAH EE +1082 ; Grapheme_Extend # Mn MYANMAR CONSONANT SIGN SHAN MEDIAL WA +1085..1086 ; Grapheme_Extend # Mn [2] MYANMAR VOWEL SIGN SHAN E ABOVE..MYANMAR VOWEL SIGN SHAN FINAL Y +108D ; Grapheme_Extend # Mn MYANMAR SIGN SHAN COUNCIL EMPHATIC TONE +109D ; Grapheme_Extend # Mn MYANMAR VOWEL SIGN AITON AI +135D..135F ; Grapheme_Extend # Mn [3] ETHIOPIC COMBINING GEMINATION AND VOWEL LENGTH MARK..ETHIOPIC COMBINING GEMINATION MARK +1712..1714 ; Grapheme_Extend # Mn [3] TAGALOG VOWEL SIGN I..TAGALOG SIGN VIRAMA +1732..1734 ; Grapheme_Extend # Mn [3] HANUNOO VOWEL SIGN I..HANUNOO SIGN PAMUDPOD +1752..1753 ; Grapheme_Extend # Mn [2] BUHID VOWEL SIGN I..BUHID VOWEL SIGN U +1772..1773 ; Grapheme_Extend # Mn [2] TAGBANWA VOWEL SIGN I..TAGBANWA VOWEL SIGN U +17B4..17B5 ; Grapheme_Extend # Mn [2] KHMER VOWEL INHERENT AQ..KHMER VOWEL INHERENT AA +17B7..17BD ; Grapheme_Extend # Mn [7] KHMER VOWEL SIGN I..KHMER VOWEL SIGN UA +17C6 ; Grapheme_Extend # Mn KHMER SIGN NIKAHIT +17C9..17D3 ; Grapheme_Extend # Mn [11] KHMER SIGN MUUSIKATOAN..KHMER SIGN BATHAMASAT +17DD ; Grapheme_Extend # Mn KHMER SIGN ATTHACAN +180B..180D ; Grapheme_Extend # Mn [3] MONGOLIAN FREE VARIATION SELECTOR ONE..MONGOLIAN FREE VARIATION SELECTOR THREE +1885..1886 ; Grapheme_Extend # Mn [2] MONGOLIAN LETTER ALI GALI BALUDA..MONGOLIAN LETTER ALI GALI THREE BALUDA +18A9 ; Grapheme_Extend # Mn MONGOLIAN LETTER ALI GALI DAGALGA +1920..1922 ; Grapheme_Extend # Mn [3] LIMBU VOWEL SIGN A..LIMBU VOWEL SIGN U +1927..1928 ; Grapheme_Extend # Mn [2] LIMBU VOWEL SIGN E..LIMBU VOWEL SIGN O +1932 ; Grapheme_Extend # Mn LIMBU SMALL LETTER ANUSVARA +1939..193B ; Grapheme_Extend # Mn [3] LIMBU SIGN MUKPHRENG..LIMBU SIGN SA-I +1A17..1A18 ; Grapheme_Extend # Mn [2] BUGINESE VOWEL SIGN I..BUGINESE VOWEL SIGN U +1A1B ; Grapheme_Extend # Mn BUGINESE VOWEL SIGN AE +1A56 ; Grapheme_Extend # Mn TAI THAM CONSONANT SIGN MEDIAL LA +1A58..1A5E ; Grapheme_Extend # Mn [7] TAI THAM SIGN MAI KANG LAI..TAI THAM CONSONANT SIGN SA +1A60 ; Grapheme_Extend # Mn TAI THAM SIGN SAKOT +1A62 ; Grapheme_Extend # Mn TAI THAM VOWEL SIGN MAI SAT +1A65..1A6C ; Grapheme_Extend # Mn [8] TAI THAM VOWEL SIGN I..TAI THAM VOWEL SIGN OA BELOW +1A73..1A7C ; Grapheme_Extend # Mn [10] TAI THAM VOWEL SIGN OA ABOVE..TAI THAM SIGN KHUEN-LUE KARAN +1A7F ; Grapheme_Extend # Mn TAI THAM COMBINING CRYPTOGRAMMIC DOT +1AB0..1ABD ; Grapheme_Extend # Mn [14] COMBINING DOUBLED CIRCUMFLEX ACCENT..COMBINING PARENTHESES BELOW +1ABE ; Grapheme_Extend # Me COMBINING PARENTHESES OVERLAY +1B00..1B03 ; Grapheme_Extend # Mn [4] BALINESE SIGN ULU RICEM..BALINESE SIGN SURANG +1B34 ; Grapheme_Extend # Mn BALINESE SIGN REREKAN +1B36..1B3A ; Grapheme_Extend # Mn [5] BALINESE VOWEL SIGN ULU..BALINESE VOWEL SIGN RA REPA +1B3C ; Grapheme_Extend # Mn BALINESE VOWEL SIGN LA LENGA +1B42 ; Grapheme_Extend # Mn BALINESE VOWEL SIGN PEPET +1B6B..1B73 ; Grapheme_Extend # Mn [9] BALINESE MUSICAL SYMBOL COMBINING TEGEH..BALINESE MUSICAL SYMBOL COMBINING GONG +1B80..1B81 ; Grapheme_Extend # Mn [2] SUNDANESE SIGN PANYECEK..SUNDANESE SIGN PANGLAYAR +1BA2..1BA5 ; Grapheme_Extend # Mn [4] SUNDANESE CONSONANT SIGN PANYAKRA..SUNDANESE VOWEL SIGN PANYUKU +1BA8..1BA9 ; Grapheme_Extend # Mn [2] SUNDANESE VOWEL SIGN PAMEPET..SUNDANESE VOWEL SIGN PANEULEUNG +1BAB..1BAD ; Grapheme_Extend # Mn [3] SUNDANESE SIGN VIRAMA..SUNDANESE CONSONANT SIGN PASANGAN WA +1BE6 ; Grapheme_Extend # Mn BATAK SIGN TOMPI +1BE8..1BE9 ; Grapheme_Extend # Mn [2] BATAK VOWEL SIGN PAKPAK E..BATAK VOWEL SIGN EE +1BED ; Grapheme_Extend # Mn BATAK VOWEL SIGN KARO O +1BEF..1BF1 ; Grapheme_Extend # Mn [3] BATAK VOWEL SIGN U FOR SIMALUNGUN SA..BATAK CONSONANT SIGN H +1C2C..1C33 ; Grapheme_Extend # Mn [8] LEPCHA VOWEL SIGN E..LEPCHA CONSONANT SIGN T +1C36..1C37 ; Grapheme_Extend # Mn [2] LEPCHA SIGN RAN..LEPCHA SIGN NUKTA +1CD0..1CD2 ; Grapheme_Extend # Mn [3] VEDIC TONE KARSHANA..VEDIC TONE PRENKHA +1CD4..1CE0 ; Grapheme_Extend # Mn [13] VEDIC SIGN YAJURVEDIC MIDLINE SVARITA..VEDIC TONE RIGVEDIC KASHMIRI INDEPENDENT SVARITA +1CE2..1CE8 ; Grapheme_Extend # Mn [7] VEDIC SIGN VISARGA SVARITA..VEDIC SIGN VISARGA ANUDATTA WITH TAIL +1CED ; Grapheme_Extend # Mn VEDIC SIGN TIRYAK +1CF4 ; Grapheme_Extend # Mn VEDIC TONE CANDRA ABOVE +1CF8..1CF9 ; Grapheme_Extend # Mn [2] VEDIC TONE RING ABOVE..VEDIC TONE DOUBLE RING ABOVE +1DC0..1DF9 ; Grapheme_Extend # Mn [58] COMBINING DOTTED GRAVE ACCENT..COMBINING WIDE INVERTED BRIDGE BELOW +1DFB..1DFF ; Grapheme_Extend # Mn [5] COMBINING DELETION MARK..COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW +200C ; Grapheme_Extend # Cf ZERO WIDTH NON-JOINER +20D0..20DC ; Grapheme_Extend # Mn [13] COMBINING LEFT HARPOON ABOVE..COMBINING FOUR DOTS ABOVE +20DD..20E0 ; Grapheme_Extend # Me [4] COMBINING ENCLOSING CIRCLE..COMBINING ENCLOSING CIRCLE BACKSLASH +20E1 ; Grapheme_Extend # Mn COMBINING LEFT RIGHT ARROW ABOVE +20E2..20E4 ; Grapheme_Extend # Me [3] COMBINING ENCLOSING SCREEN..COMBINING ENCLOSING UPWARD POINTING TRIANGLE +20E5..20F0 ; Grapheme_Extend # Mn [12] COMBINING REVERSE SOLIDUS OVERLAY..COMBINING ASTERISK ABOVE +2CEF..2CF1 ; Grapheme_Extend # Mn [3] COPTIC COMBINING NI ABOVE..COPTIC COMBINING SPIRITUS LENIS +2D7F ; Grapheme_Extend # Mn TIFINAGH CONSONANT JOINER +2DE0..2DFF ; Grapheme_Extend # Mn [32] COMBINING CYRILLIC LETTER BE..COMBINING CYRILLIC LETTER IOTIFIED BIG YUS +302A..302D ; Grapheme_Extend # Mn [4] IDEOGRAPHIC LEVEL TONE MARK..IDEOGRAPHIC ENTERING TONE MARK +302E..302F ; Grapheme_Extend # Mc [2] HANGUL SINGLE DOT TONE MARK..HANGUL DOUBLE DOT TONE MARK +3099..309A ; Grapheme_Extend # Mn [2] COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK..COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK +A66F ; Grapheme_Extend # Mn COMBINING CYRILLIC VZMET +A670..A672 ; Grapheme_Extend # Me [3] COMBINING CYRILLIC TEN MILLIONS SIGN..COMBINING CYRILLIC THOUSAND MILLIONS SIGN +A674..A67D ; Grapheme_Extend # Mn [10] COMBINING CYRILLIC LETTER UKRAINIAN IE..COMBINING CYRILLIC PAYEROK +A69E..A69F ; Grapheme_Extend # Mn [2] COMBINING CYRILLIC LETTER EF..COMBINING CYRILLIC LETTER IOTIFIED E +A6F0..A6F1 ; Grapheme_Extend # Mn [2] BAMUM COMBINING MARK KOQNDON..BAMUM COMBINING MARK TUKWENTIS +A802 ; Grapheme_Extend # Mn SYLOTI NAGRI SIGN DVISVARA +A806 ; Grapheme_Extend # Mn SYLOTI NAGRI SIGN HASANTA +A80B ; Grapheme_Extend # Mn SYLOTI NAGRI SIGN ANUSVARA +A825..A826 ; Grapheme_Extend # Mn [2] SYLOTI NAGRI VOWEL SIGN U..SYLOTI NAGRI VOWEL SIGN E +A8C4..A8C5 ; Grapheme_Extend # Mn [2] SAURASHTRA SIGN VIRAMA..SAURASHTRA SIGN CANDRABINDU +A8E0..A8F1 ; Grapheme_Extend # Mn [18] COMBINING DEVANAGARI DIGIT ZERO..COMBINING DEVANAGARI SIGN AVAGRAHA +A8FF ; Grapheme_Extend # Mn DEVANAGARI VOWEL SIGN AY +A926..A92D ; Grapheme_Extend # Mn [8] KAYAH LI VOWEL UE..KAYAH LI TONE CALYA PLOPHU +A947..A951 ; Grapheme_Extend # Mn [11] REJANG VOWEL SIGN I..REJANG CONSONANT SIGN R +A980..A982 ; Grapheme_Extend # Mn [3] JAVANESE SIGN PANYANGGA..JAVANESE SIGN LAYAR +A9B3 ; Grapheme_Extend # Mn JAVANESE SIGN CECAK TELU +A9B6..A9B9 ; Grapheme_Extend # Mn [4] JAVANESE VOWEL SIGN WULU..JAVANESE VOWEL SIGN SUKU MENDUT +A9BC ; Grapheme_Extend # Mn JAVANESE VOWEL SIGN PEPET +A9E5 ; Grapheme_Extend # Mn MYANMAR SIGN SHAN SAW +AA29..AA2E ; Grapheme_Extend # Mn [6] CHAM VOWEL SIGN AA..CHAM VOWEL SIGN OE +AA31..AA32 ; Grapheme_Extend # Mn [2] CHAM VOWEL SIGN AU..CHAM VOWEL SIGN UE +AA35..AA36 ; Grapheme_Extend # Mn [2] CHAM CONSONANT SIGN LA..CHAM CONSONANT SIGN WA +AA43 ; Grapheme_Extend # Mn CHAM CONSONANT SIGN FINAL NG +AA4C ; Grapheme_Extend # Mn CHAM CONSONANT SIGN FINAL M +AA7C ; Grapheme_Extend # Mn MYANMAR SIGN TAI LAING TONE-2 +AAB0 ; Grapheme_Extend # Mn TAI VIET MAI KANG +AAB2..AAB4 ; Grapheme_Extend # Mn [3] TAI VIET VOWEL I..TAI VIET VOWEL U +AAB7..AAB8 ; Grapheme_Extend # Mn [2] TAI VIET MAI KHIT..TAI VIET VOWEL IA +AABE..AABF ; Grapheme_Extend # Mn [2] TAI VIET VOWEL AM..TAI VIET TONE MAI EK +AAC1 ; Grapheme_Extend # Mn TAI VIET TONE MAI THO +AAEC..AAED ; Grapheme_Extend # Mn [2] MEETEI MAYEK VOWEL SIGN UU..MEETEI MAYEK VOWEL SIGN AAI +AAF6 ; Grapheme_Extend # Mn MEETEI MAYEK VIRAMA +ABE5 ; Grapheme_Extend # Mn MEETEI MAYEK VOWEL SIGN ANAP +ABE8 ; Grapheme_Extend # Mn MEETEI MAYEK VOWEL SIGN UNAP +ABED ; Grapheme_Extend # Mn MEETEI MAYEK APUN IYEK +FB1E ; Grapheme_Extend # Mn HEBREW POINT JUDEO-SPANISH VARIKA +FE00..FE0F ; Grapheme_Extend # Mn [16] VARIATION SELECTOR-1..VARIATION SELECTOR-16 +FE20..FE2F ; Grapheme_Extend # Mn [16] COMBINING LIGATURE LEFT HALF..COMBINING CYRILLIC TITLO RIGHT HALF +FF9E..FF9F ; Grapheme_Extend # Lm [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK +101FD ; Grapheme_Extend # Mn PHAISTOS DISC SIGN COMBINING OBLIQUE STROKE +102E0 ; Grapheme_Extend # Mn COPTIC EPACT THOUSANDS MARK +10376..1037A ; Grapheme_Extend # Mn [5] COMBINING OLD PERMIC LETTER AN..COMBINING OLD PERMIC LETTER SII +10A01..10A03 ; Grapheme_Extend # Mn [3] KHAROSHTHI VOWEL SIGN I..KHAROSHTHI VOWEL SIGN VOCALIC R +10A05..10A06 ; Grapheme_Extend # Mn [2] KHAROSHTHI VOWEL SIGN E..KHAROSHTHI VOWEL SIGN O +10A0C..10A0F ; Grapheme_Extend # Mn [4] KHAROSHTHI VOWEL LENGTH MARK..KHAROSHTHI SIGN VISARGA +10A38..10A3A ; Grapheme_Extend # Mn [3] KHAROSHTHI SIGN BAR ABOVE..KHAROSHTHI SIGN DOT BELOW +10A3F ; Grapheme_Extend # Mn KHAROSHTHI VIRAMA +10AE5..10AE6 ; Grapheme_Extend # Mn [2] MANICHAEAN ABBREVIATION MARK ABOVE..MANICHAEAN ABBREVIATION MARK BELOW +10D24..10D27 ; Grapheme_Extend # Mn [4] HANIFI ROHINGYA SIGN HARBAHAY..HANIFI ROHINGYA SIGN TASSI +10F46..10F50 ; Grapheme_Extend # Mn [11] SOGDIAN COMBINING DOT BELOW..SOGDIAN COMBINING STROKE BELOW +11001 ; Grapheme_Extend # Mn BRAHMI SIGN ANUSVARA +11038..11046 ; Grapheme_Extend # Mn [15] BRAHMI VOWEL SIGN AA..BRAHMI VIRAMA +1107F..11081 ; Grapheme_Extend # Mn [3] BRAHMI NUMBER JOINER..KAITHI SIGN ANUSVARA +110B3..110B6 ; Grapheme_Extend # Mn [4] KAITHI VOWEL SIGN U..KAITHI VOWEL SIGN AI +110B9..110BA ; Grapheme_Extend # Mn [2] KAITHI SIGN VIRAMA..KAITHI SIGN NUKTA +11100..11102 ; Grapheme_Extend # Mn [3] CHAKMA SIGN CANDRABINDU..CHAKMA SIGN VISARGA +11127..1112B ; Grapheme_Extend # Mn [5] CHAKMA VOWEL SIGN A..CHAKMA VOWEL SIGN UU +1112D..11134 ; Grapheme_Extend # Mn [8] CHAKMA VOWEL SIGN AI..CHAKMA MAAYYAA +11173 ; Grapheme_Extend # Mn MAHAJANI SIGN NUKTA +11180..11181 ; Grapheme_Extend # Mn [2] SHARADA SIGN CANDRABINDU..SHARADA SIGN ANUSVARA +111B6..111BE ; Grapheme_Extend # Mn [9] SHARADA VOWEL SIGN U..SHARADA VOWEL SIGN O +111C9..111CC ; Grapheme_Extend # Mn [4] SHARADA SANDHI MARK..SHARADA EXTRA SHORT VOWEL MARK +1122F..11231 ; Grapheme_Extend # Mn [3] KHOJKI VOWEL SIGN U..KHOJKI VOWEL SIGN AI +11234 ; Grapheme_Extend # Mn KHOJKI SIGN ANUSVARA +11236..11237 ; Grapheme_Extend # Mn [2] KHOJKI SIGN NUKTA..KHOJKI SIGN SHADDA +1123E ; Grapheme_Extend # Mn KHOJKI SIGN SUKUN +112DF ; Grapheme_Extend # Mn KHUDAWADI SIGN ANUSVARA +112E3..112EA ; Grapheme_Extend # Mn [8] KHUDAWADI VOWEL SIGN U..KHUDAWADI SIGN VIRAMA +11300..11301 ; Grapheme_Extend # Mn [2] GRANTHA SIGN COMBINING ANUSVARA ABOVE..GRANTHA SIGN CANDRABINDU +1133B..1133C ; Grapheme_Extend # Mn [2] COMBINING BINDU BELOW..GRANTHA SIGN NUKTA +1133E ; Grapheme_Extend # Mc GRANTHA VOWEL SIGN AA +11340 ; Grapheme_Extend # Mn GRANTHA VOWEL SIGN II +11357 ; Grapheme_Extend # Mc GRANTHA AU LENGTH MARK +11366..1136C ; Grapheme_Extend # Mn [7] COMBINING GRANTHA DIGIT ZERO..COMBINING GRANTHA DIGIT SIX +11370..11374 ; Grapheme_Extend # Mn [5] COMBINING GRANTHA LETTER A..COMBINING GRANTHA LETTER PA +11438..1143F ; Grapheme_Extend # Mn [8] NEWA VOWEL SIGN U..NEWA VOWEL SIGN AI +11442..11444 ; Grapheme_Extend # Mn [3] NEWA SIGN VIRAMA..NEWA SIGN ANUSVARA +11446 ; Grapheme_Extend # Mn NEWA SIGN NUKTA +1145E ; Grapheme_Extend # Mn NEWA SANDHI MARK +114B0 ; Grapheme_Extend # Mc TIRHUTA VOWEL SIGN AA +114B3..114B8 ; Grapheme_Extend # Mn [6] TIRHUTA VOWEL SIGN U..TIRHUTA VOWEL SIGN VOCALIC LL +114BA ; Grapheme_Extend # Mn TIRHUTA VOWEL SIGN SHORT E +114BD ; Grapheme_Extend # Mc TIRHUTA VOWEL SIGN SHORT O +114BF..114C0 ; Grapheme_Extend # Mn [2] TIRHUTA SIGN CANDRABINDU..TIRHUTA SIGN ANUSVARA +114C2..114C3 ; Grapheme_Extend # Mn [2] TIRHUTA SIGN VIRAMA..TIRHUTA SIGN NUKTA +115AF ; Grapheme_Extend # Mc SIDDHAM VOWEL SIGN AA +115B2..115B5 ; Grapheme_Extend # Mn [4] SIDDHAM VOWEL SIGN U..SIDDHAM VOWEL SIGN VOCALIC RR +115BC..115BD ; Grapheme_Extend # Mn [2] SIDDHAM SIGN CANDRABINDU..SIDDHAM SIGN ANUSVARA +115BF..115C0 ; Grapheme_Extend # Mn [2] SIDDHAM SIGN VIRAMA..SIDDHAM SIGN NUKTA +115DC..115DD ; Grapheme_Extend # Mn [2] SIDDHAM VOWEL SIGN ALTERNATE U..SIDDHAM VOWEL SIGN ALTERNATE UU +11633..1163A ; Grapheme_Extend # Mn [8] MODI VOWEL SIGN U..MODI VOWEL SIGN AI +1163D ; Grapheme_Extend # Mn MODI SIGN ANUSVARA +1163F..11640 ; Grapheme_Extend # Mn [2] MODI SIGN VIRAMA..MODI SIGN ARDHACANDRA +116AB ; Grapheme_Extend # Mn TAKRI SIGN ANUSVARA +116AD ; Grapheme_Extend # Mn TAKRI VOWEL SIGN AA +116B0..116B5 ; Grapheme_Extend # Mn [6] TAKRI VOWEL SIGN U..TAKRI VOWEL SIGN AU +116B7 ; Grapheme_Extend # Mn TAKRI SIGN NUKTA +1171D..1171F ; Grapheme_Extend # Mn [3] AHOM CONSONANT SIGN MEDIAL LA..AHOM CONSONANT SIGN MEDIAL LIGATING RA +11722..11725 ; Grapheme_Extend # Mn [4] AHOM VOWEL SIGN I..AHOM VOWEL SIGN UU +11727..1172B ; Grapheme_Extend # Mn [5] AHOM VOWEL SIGN AW..AHOM SIGN KILLER +1182F..11837 ; Grapheme_Extend # Mn [9] DOGRA VOWEL SIGN U..DOGRA SIGN ANUSVARA +11839..1183A ; Grapheme_Extend # Mn [2] DOGRA SIGN VIRAMA..DOGRA SIGN NUKTA +11A01..11A0A ; Grapheme_Extend # Mn [10] ZANABAZAR SQUARE VOWEL SIGN I..ZANABAZAR SQUARE VOWEL LENGTH MARK +11A33..11A38 ; Grapheme_Extend # Mn [6] ZANABAZAR SQUARE FINAL CONSONANT MARK..ZANABAZAR SQUARE SIGN ANUSVARA +11A3B..11A3E ; Grapheme_Extend # Mn [4] ZANABAZAR SQUARE CLUSTER-FINAL LETTER YA..ZANABAZAR SQUARE CLUSTER-FINAL LETTER VA +11A47 ; Grapheme_Extend # Mn ZANABAZAR SQUARE SUBJOINER +11A51..11A56 ; Grapheme_Extend # Mn [6] SOYOMBO VOWEL SIGN I..SOYOMBO VOWEL SIGN OE +11A59..11A5B ; Grapheme_Extend # Mn [3] SOYOMBO VOWEL SIGN VOCALIC R..SOYOMBO VOWEL LENGTH MARK +11A8A..11A96 ; Grapheme_Extend # Mn [13] SOYOMBO FINAL CONSONANT SIGN G..SOYOMBO SIGN ANUSVARA +11A98..11A99 ; Grapheme_Extend # Mn [2] SOYOMBO GEMINATION MARK..SOYOMBO SUBJOINER +11C30..11C36 ; Grapheme_Extend # Mn [7] BHAIKSUKI VOWEL SIGN I..BHAIKSUKI VOWEL SIGN VOCALIC L +11C38..11C3D ; Grapheme_Extend # Mn [6] BHAIKSUKI VOWEL SIGN E..BHAIKSUKI SIGN ANUSVARA +11C3F ; Grapheme_Extend # Mn BHAIKSUKI SIGN VIRAMA +11C92..11CA7 ; Grapheme_Extend # Mn [22] MARCHEN SUBJOINED LETTER KA..MARCHEN SUBJOINED LETTER ZA +11CAA..11CB0 ; Grapheme_Extend # Mn [7] MARCHEN SUBJOINED LETTER RA..MARCHEN VOWEL SIGN AA +11CB2..11CB3 ; Grapheme_Extend # Mn [2] MARCHEN VOWEL SIGN U..MARCHEN VOWEL SIGN E +11CB5..11CB6 ; Grapheme_Extend # Mn [2] MARCHEN SIGN ANUSVARA..MARCHEN SIGN CANDRABINDU +11D31..11D36 ; Grapheme_Extend # Mn [6] MASARAM GONDI VOWEL SIGN AA..MASARAM GONDI VOWEL SIGN VOCALIC R +11D3A ; Grapheme_Extend # Mn MASARAM GONDI VOWEL SIGN E +11D3C..11D3D ; Grapheme_Extend # Mn [2] MASARAM GONDI VOWEL SIGN AI..MASARAM GONDI VOWEL SIGN O +11D3F..11D45 ; Grapheme_Extend # Mn [7] MASARAM GONDI VOWEL SIGN AU..MASARAM GONDI VIRAMA +11D47 ; Grapheme_Extend # Mn MASARAM GONDI RA-KARA +11D90..11D91 ; Grapheme_Extend # Mn [2] GUNJALA GONDI VOWEL SIGN EE..GUNJALA GONDI VOWEL SIGN AI +11D95 ; Grapheme_Extend # Mn GUNJALA GONDI SIGN ANUSVARA +11D97 ; Grapheme_Extend # Mn GUNJALA GONDI VIRAMA +11EF3..11EF4 ; Grapheme_Extend # Mn [2] MAKASAR VOWEL SIGN I..MAKASAR VOWEL SIGN U +16AF0..16AF4 ; Grapheme_Extend # Mn [5] BASSA VAH COMBINING HIGH TONE..BASSA VAH COMBINING HIGH-LOW TONE +16B30..16B36 ; Grapheme_Extend # Mn [7] PAHAWH HMONG MARK CIM TUB..PAHAWH HMONG MARK CIM TAUM +16F8F..16F92 ; Grapheme_Extend # Mn [4] MIAO TONE RIGHT..MIAO TONE BELOW +1BC9D..1BC9E ; Grapheme_Extend # Mn [2] DUPLOYAN THICK LETTER SELECTOR..DUPLOYAN DOUBLE MARK +1D165 ; Grapheme_Extend # Mc MUSICAL SYMBOL COMBINING STEM +1D167..1D169 ; Grapheme_Extend # Mn [3] MUSICAL SYMBOL COMBINING TREMOLO-1..MUSICAL SYMBOL COMBINING TREMOLO-3 +1D16E..1D172 ; Grapheme_Extend # Mc [5] MUSICAL SYMBOL COMBINING FLAG-1..MUSICAL SYMBOL COMBINING FLAG-5 +1D17B..1D182 ; Grapheme_Extend # Mn [8] MUSICAL SYMBOL COMBINING ACCENT..MUSICAL SYMBOL COMBINING LOURE +1D185..1D18B ; Grapheme_Extend # Mn [7] MUSICAL SYMBOL COMBINING DOIT..MUSICAL SYMBOL COMBINING TRIPLE TONGUE +1D1AA..1D1AD ; Grapheme_Extend # Mn [4] MUSICAL SYMBOL COMBINING DOWN BOW..MUSICAL SYMBOL COMBINING SNAP PIZZICATO +1D242..1D244 ; Grapheme_Extend # Mn [3] COMBINING GREEK MUSICAL TRISEME..COMBINING GREEK MUSICAL PENTASEME +1DA00..1DA36 ; Grapheme_Extend # Mn [55] SIGNWRITING HEAD RIM..SIGNWRITING AIR SUCKING IN +1DA3B..1DA6C ; Grapheme_Extend # Mn [50] SIGNWRITING MOUTH CLOSED NEUTRAL..SIGNWRITING EXCITEMENT +1DA75 ; Grapheme_Extend # Mn SIGNWRITING UPPER BODY TILTING FROM HIP JOINTS +1DA84 ; Grapheme_Extend # Mn SIGNWRITING LOCATION HEAD NECK +1DA9B..1DA9F ; Grapheme_Extend # Mn [5] SIGNWRITING FILL MODIFIER-2..SIGNWRITING FILL MODIFIER-6 +1DAA1..1DAAF ; Grapheme_Extend # Mn [15] SIGNWRITING ROTATION MODIFIER-2..SIGNWRITING ROTATION MODIFIER-16 +1E000..1E006 ; Grapheme_Extend # Mn [7] COMBINING GLAGOLITIC LETTER AZU..COMBINING GLAGOLITIC LETTER ZHIVETE +1E008..1E018 ; Grapheme_Extend # Mn [17] COMBINING GLAGOLITIC LETTER ZEMLJA..COMBINING GLAGOLITIC LETTER HERU +1E01B..1E021 ; Grapheme_Extend # Mn [7] COMBINING GLAGOLITIC LETTER SHTA..COMBINING GLAGOLITIC LETTER YATI +1E023..1E024 ; Grapheme_Extend # Mn [2] COMBINING GLAGOLITIC LETTER YU..COMBINING GLAGOLITIC LETTER SMALL YUS +1E026..1E02A ; Grapheme_Extend # Mn [5] COMBINING GLAGOLITIC LETTER YO..COMBINING GLAGOLITIC LETTER FITA +1E8D0..1E8D6 ; Grapheme_Extend # Mn [7] MENDE KIKAKUI COMBINING NUMBER TEENS..MENDE KIKAKUI COMBINING NUMBER MILLIONS +1E944..1E94A ; Grapheme_Extend # Mn [7] ADLAM ALIF LENGTHENER..ADLAM NUKTA +E0020..E007F ; Grapheme_Extend # Cf [96] TAG SPACE..CANCEL TAG +E0100..E01EF ; Grapheme_Extend # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256 + +# Total code points: 1943 + +# ================================================ + +# Derived Property: Grapheme_Base +# Generated from: [0..10FFFF] - Cc - Cf - Cs - Co - Cn - Zl - Zp - Grapheme_Extend +# Note: depending on an application's interpretation of Co (private use), +# they may be either in Grapheme_Base, or in Grapheme_Extend, or in neither. + +0020 ; Grapheme_Base # Zs SPACE +0021..0023 ; Grapheme_Base # Po [3] EXCLAMATION MARK..NUMBER SIGN +0024 ; Grapheme_Base # Sc DOLLAR SIGN +0025..0027 ; Grapheme_Base # Po [3] PERCENT SIGN..APOSTROPHE +0028 ; Grapheme_Base # Ps LEFT PARENTHESIS +0029 ; Grapheme_Base # Pe RIGHT PARENTHESIS +002A ; Grapheme_Base # Po ASTERISK +002B ; Grapheme_Base # Sm PLUS SIGN +002C ; Grapheme_Base # Po COMMA +002D ; Grapheme_Base # Pd HYPHEN-MINUS +002E..002F ; Grapheme_Base # Po [2] FULL STOP..SOLIDUS +0030..0039 ; Grapheme_Base # Nd [10] DIGIT ZERO..DIGIT NINE +003A..003B ; Grapheme_Base # Po [2] COLON..SEMICOLON +003C..003E ; Grapheme_Base # Sm [3] LESS-THAN SIGN..GREATER-THAN SIGN +003F..0040 ; Grapheme_Base # Po [2] QUESTION MARK..COMMERCIAL AT +0041..005A ; Grapheme_Base # L& [26] LATIN CAPITAL LETTER A..LATIN CAPITAL LETTER Z +005B ; Grapheme_Base # Ps LEFT SQUARE BRACKET +005C ; Grapheme_Base # Po REVERSE SOLIDUS +005D ; Grapheme_Base # Pe RIGHT SQUARE BRACKET +005E ; Grapheme_Base # Sk CIRCUMFLEX ACCENT +005F ; Grapheme_Base # Pc LOW LINE +0060 ; Grapheme_Base # Sk GRAVE ACCENT +0061..007A ; Grapheme_Base # L& [26] LATIN SMALL LETTER A..LATIN SMALL LETTER Z +007B ; Grapheme_Base # Ps LEFT CURLY BRACKET +007C ; Grapheme_Base # Sm VERTICAL LINE +007D ; Grapheme_Base # Pe RIGHT CURLY BRACKET +007E ; Grapheme_Base # Sm TILDE +00A0 ; Grapheme_Base # Zs NO-BREAK SPACE +00A1 ; Grapheme_Base # Po INVERTED EXCLAMATION MARK +00A2..00A5 ; Grapheme_Base # Sc [4] CENT SIGN..YEN SIGN +00A6 ; Grapheme_Base # So BROKEN BAR +00A7 ; Grapheme_Base # Po SECTION SIGN +00A8 ; Grapheme_Base # Sk DIAERESIS +00A9 ; Grapheme_Base # So COPYRIGHT SIGN +00AA ; Grapheme_Base # Lo FEMININE ORDINAL INDICATOR +00AB ; Grapheme_Base # Pi LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +00AC ; Grapheme_Base # Sm NOT SIGN +00AE ; Grapheme_Base # So REGISTERED SIGN +00AF ; Grapheme_Base # Sk MACRON +00B0 ; Grapheme_Base # So DEGREE SIGN +00B1 ; Grapheme_Base # Sm PLUS-MINUS SIGN +00B2..00B3 ; Grapheme_Base # No [2] SUPERSCRIPT TWO..SUPERSCRIPT THREE +00B4 ; Grapheme_Base # Sk ACUTE ACCENT +00B5 ; Grapheme_Base # L& MICRO SIGN +00B6..00B7 ; Grapheme_Base # Po [2] PILCROW SIGN..MIDDLE DOT +00B8 ; Grapheme_Base # Sk CEDILLA +00B9 ; Grapheme_Base # No SUPERSCRIPT ONE +00BA ; Grapheme_Base # Lo MASCULINE ORDINAL INDICATOR +00BB ; Grapheme_Base # Pf RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +00BC..00BE ; Grapheme_Base # No [3] VULGAR FRACTION ONE QUARTER..VULGAR FRACTION THREE QUARTERS +00BF ; Grapheme_Base # Po INVERTED QUESTION MARK +00C0..00D6 ; Grapheme_Base # L& [23] LATIN CAPITAL LETTER A WITH GRAVE..LATIN CAPITAL LETTER O WITH DIAERESIS +00D7 ; Grapheme_Base # Sm MULTIPLICATION SIGN +00D8..00F6 ; Grapheme_Base # L& [31] LATIN CAPITAL LETTER O WITH STROKE..LATIN SMALL LETTER O WITH DIAERESIS +00F7 ; Grapheme_Base # Sm DIVISION SIGN +00F8..01BA ; Grapheme_Base # L& [195] LATIN SMALL LETTER O WITH STROKE..LATIN SMALL LETTER EZH WITH TAIL +01BB ; Grapheme_Base # Lo LATIN LETTER TWO WITH STROKE +01BC..01BF ; Grapheme_Base # L& [4] LATIN CAPITAL LETTER TONE FIVE..LATIN LETTER WYNN +01C0..01C3 ; Grapheme_Base # Lo [4] LATIN LETTER DENTAL CLICK..LATIN LETTER RETROFLEX CLICK +01C4..0293 ; Grapheme_Base # L& [208] LATIN CAPITAL LETTER DZ WITH CARON..LATIN SMALL LETTER EZH WITH CURL +0294 ; Grapheme_Base # Lo LATIN LETTER GLOTTAL STOP +0295..02AF ; Grapheme_Base # L& [27] LATIN LETTER PHARYNGEAL VOICED FRICATIVE..LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL +02B0..02C1 ; Grapheme_Base # Lm [18] MODIFIER LETTER SMALL H..MODIFIER LETTER REVERSED GLOTTAL STOP +02C2..02C5 ; Grapheme_Base # Sk [4] MODIFIER LETTER LEFT ARROWHEAD..MODIFIER LETTER DOWN ARROWHEAD +02C6..02D1 ; Grapheme_Base # Lm [12] MODIFIER LETTER CIRCUMFLEX ACCENT..MODIFIER LETTER HALF TRIANGULAR COLON +02D2..02DF ; Grapheme_Base # Sk [14] MODIFIER LETTER CENTRED RIGHT HALF RING..MODIFIER LETTER CROSS ACCENT +02E0..02E4 ; Grapheme_Base # Lm [5] MODIFIER LETTER SMALL GAMMA..MODIFIER LETTER SMALL REVERSED GLOTTAL STOP +02E5..02EB ; Grapheme_Base # Sk [7] MODIFIER LETTER EXTRA-HIGH TONE BAR..MODIFIER LETTER YANG DEPARTING TONE MARK +02EC ; Grapheme_Base # Lm MODIFIER LETTER VOICING +02ED ; Grapheme_Base # Sk MODIFIER LETTER UNASPIRATED +02EE ; Grapheme_Base # Lm MODIFIER LETTER DOUBLE APOSTROPHE +02EF..02FF ; Grapheme_Base # Sk [17] MODIFIER LETTER LOW DOWN ARROWHEAD..MODIFIER LETTER LOW LEFT ARROW +0370..0373 ; Grapheme_Base # L& [4] GREEK CAPITAL LETTER HETA..GREEK SMALL LETTER ARCHAIC SAMPI +0374 ; Grapheme_Base # Lm GREEK NUMERAL SIGN +0375 ; Grapheme_Base # Sk GREEK LOWER NUMERAL SIGN +0376..0377 ; Grapheme_Base # L& [2] GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA..GREEK SMALL LETTER PAMPHYLIAN DIGAMMA +037A ; Grapheme_Base # Lm GREEK YPOGEGRAMMENI +037B..037D ; Grapheme_Base # L& [3] GREEK SMALL REVERSED LUNATE SIGMA SYMBOL..GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL +037E ; Grapheme_Base # Po GREEK QUESTION MARK +037F ; Grapheme_Base # L& GREEK CAPITAL LETTER YOT +0384..0385 ; Grapheme_Base # Sk [2] GREEK TONOS..GREEK DIALYTIKA TONOS +0386 ; Grapheme_Base # L& GREEK CAPITAL LETTER ALPHA WITH TONOS +0387 ; Grapheme_Base # Po GREEK ANO TELEIA +0388..038A ; Grapheme_Base # L& [3] GREEK CAPITAL LETTER EPSILON WITH TONOS..GREEK CAPITAL LETTER IOTA WITH TONOS +038C ; Grapheme_Base # L& GREEK CAPITAL LETTER OMICRON WITH TONOS +038E..03A1 ; Grapheme_Base # L& [20] GREEK CAPITAL LETTER UPSILON WITH TONOS..GREEK CAPITAL LETTER RHO +03A3..03F5 ; Grapheme_Base # L& [83] GREEK CAPITAL LETTER SIGMA..GREEK LUNATE EPSILON SYMBOL +03F6 ; Grapheme_Base # Sm GREEK REVERSED LUNATE EPSILON SYMBOL +03F7..0481 ; Grapheme_Base # L& [139] GREEK CAPITAL LETTER SHO..CYRILLIC SMALL LETTER KOPPA +0482 ; Grapheme_Base # So CYRILLIC THOUSANDS SIGN +048A..052F ; Grapheme_Base # L& [166] CYRILLIC CAPITAL LETTER SHORT I WITH TAIL..CYRILLIC SMALL LETTER EL WITH DESCENDER +0531..0556 ; Grapheme_Base # L& [38] ARMENIAN CAPITAL LETTER AYB..ARMENIAN CAPITAL LETTER FEH +0559 ; Grapheme_Base # Lm ARMENIAN MODIFIER LETTER LEFT HALF RING +055A..055F ; Grapheme_Base # Po [6] ARMENIAN APOSTROPHE..ARMENIAN ABBREVIATION MARK +0560..0588 ; Grapheme_Base # L& [41] ARMENIAN SMALL LETTER TURNED AYB..ARMENIAN SMALL LETTER YI WITH STROKE +0589 ; Grapheme_Base # Po ARMENIAN FULL STOP +058A ; Grapheme_Base # Pd ARMENIAN HYPHEN +058D..058E ; Grapheme_Base # So [2] RIGHT-FACING ARMENIAN ETERNITY SIGN..LEFT-FACING ARMENIAN ETERNITY SIGN +058F ; Grapheme_Base # Sc ARMENIAN DRAM SIGN +05BE ; Grapheme_Base # Pd HEBREW PUNCTUATION MAQAF +05C0 ; Grapheme_Base # Po HEBREW PUNCTUATION PASEQ +05C3 ; Grapheme_Base # Po HEBREW PUNCTUATION SOF PASUQ +05C6 ; Grapheme_Base # Po HEBREW PUNCTUATION NUN HAFUKHA +05D0..05EA ; Grapheme_Base # Lo [27] HEBREW LETTER ALEF..HEBREW LETTER TAV +05EF..05F2 ; Grapheme_Base # Lo [4] HEBREW YOD TRIANGLE..HEBREW LIGATURE YIDDISH DOUBLE YOD +05F3..05F4 ; Grapheme_Base # Po [2] HEBREW PUNCTUATION GERESH..HEBREW PUNCTUATION GERSHAYIM +0606..0608 ; Grapheme_Base # Sm [3] ARABIC-INDIC CUBE ROOT..ARABIC RAY +0609..060A ; Grapheme_Base # Po [2] ARABIC-INDIC PER MILLE SIGN..ARABIC-INDIC PER TEN THOUSAND SIGN +060B ; Grapheme_Base # Sc AFGHANI SIGN +060C..060D ; Grapheme_Base # Po [2] ARABIC COMMA..ARABIC DATE SEPARATOR +060E..060F ; Grapheme_Base # So [2] ARABIC POETIC VERSE SIGN..ARABIC SIGN MISRA +061B ; Grapheme_Base # Po ARABIC SEMICOLON +061E..061F ; Grapheme_Base # Po [2] ARABIC TRIPLE DOT PUNCTUATION MARK..ARABIC QUESTION MARK +0620..063F ; Grapheme_Base # Lo [32] ARABIC LETTER KASHMIRI YEH..ARABIC LETTER FARSI YEH WITH THREE DOTS ABOVE +0640 ; Grapheme_Base # Lm ARABIC TATWEEL +0641..064A ; Grapheme_Base # Lo [10] ARABIC LETTER FEH..ARABIC LETTER YEH +0660..0669 ; Grapheme_Base # Nd [10] ARABIC-INDIC DIGIT ZERO..ARABIC-INDIC DIGIT NINE +066A..066D ; Grapheme_Base # Po [4] ARABIC PERCENT SIGN..ARABIC FIVE POINTED STAR +066E..066F ; Grapheme_Base # Lo [2] ARABIC LETTER DOTLESS BEH..ARABIC LETTER DOTLESS QAF +0671..06D3 ; Grapheme_Base # Lo [99] ARABIC LETTER ALEF WASLA..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE +06D4 ; Grapheme_Base # Po ARABIC FULL STOP +06D5 ; Grapheme_Base # Lo ARABIC LETTER AE +06DE ; Grapheme_Base # So ARABIC START OF RUB EL HIZB +06E5..06E6 ; Grapheme_Base # Lm [2] ARABIC SMALL WAW..ARABIC SMALL YEH +06E9 ; Grapheme_Base # So ARABIC PLACE OF SAJDAH +06EE..06EF ; Grapheme_Base # Lo [2] ARABIC LETTER DAL WITH INVERTED V..ARABIC LETTER REH WITH INVERTED V +06F0..06F9 ; Grapheme_Base # Nd [10] EXTENDED ARABIC-INDIC DIGIT ZERO..EXTENDED ARABIC-INDIC DIGIT NINE +06FA..06FC ; Grapheme_Base # Lo [3] ARABIC LETTER SHEEN WITH DOT BELOW..ARABIC LETTER GHAIN WITH DOT BELOW +06FD..06FE ; Grapheme_Base # So [2] ARABIC SIGN SINDHI AMPERSAND..ARABIC SIGN SINDHI POSTPOSITION MEN +06FF ; Grapheme_Base # Lo ARABIC LETTER HEH WITH INVERTED V +0700..070D ; Grapheme_Base # Po [14] SYRIAC END OF PARAGRAPH..SYRIAC HARKLEAN ASTERISCUS +0710 ; Grapheme_Base # Lo SYRIAC LETTER ALAPH +0712..072F ; Grapheme_Base # Lo [30] SYRIAC LETTER BETH..SYRIAC LETTER PERSIAN DHALATH +074D..07A5 ; Grapheme_Base # Lo [89] SYRIAC LETTER SOGDIAN ZHAIN..THAANA LETTER WAAVU +07B1 ; Grapheme_Base # Lo THAANA LETTER NAA +07C0..07C9 ; Grapheme_Base # Nd [10] NKO DIGIT ZERO..NKO DIGIT NINE +07CA..07EA ; Grapheme_Base # Lo [33] NKO LETTER A..NKO LETTER JONA RA +07F4..07F5 ; Grapheme_Base # Lm [2] NKO HIGH TONE APOSTROPHE..NKO LOW TONE APOSTROPHE +07F6 ; Grapheme_Base # So NKO SYMBOL OO DENNEN +07F7..07F9 ; Grapheme_Base # Po [3] NKO SYMBOL GBAKURUNEN..NKO EXCLAMATION MARK +07FA ; Grapheme_Base # Lm NKO LAJANYALAN +07FE..07FF ; Grapheme_Base # Sc [2] NKO DOROME SIGN..NKO TAMAN SIGN +0800..0815 ; Grapheme_Base # Lo [22] SAMARITAN LETTER ALAF..SAMARITAN LETTER TAAF +081A ; Grapheme_Base # Lm SAMARITAN MODIFIER LETTER EPENTHETIC YUT +0824 ; Grapheme_Base # Lm SAMARITAN MODIFIER LETTER SHORT A +0828 ; Grapheme_Base # Lm SAMARITAN MODIFIER LETTER I +0830..083E ; Grapheme_Base # Po [15] SAMARITAN PUNCTUATION NEQUDAA..SAMARITAN PUNCTUATION ANNAAU +0840..0858 ; Grapheme_Base # Lo [25] MANDAIC LETTER HALQA..MANDAIC LETTER AIN +085E ; Grapheme_Base # Po MANDAIC PUNCTUATION +0860..086A ; Grapheme_Base # Lo [11] SYRIAC LETTER MALAYALAM NGA..SYRIAC LETTER MALAYALAM SSA +08A0..08B4 ; Grapheme_Base # Lo [21] ARABIC LETTER BEH WITH SMALL V BELOW..ARABIC LETTER KAF WITH DOT BELOW +08B6..08BD ; Grapheme_Base # Lo [8] ARABIC LETTER BEH WITH SMALL MEEM ABOVE..ARABIC LETTER AFRICAN NOON +0903 ; Grapheme_Base # Mc DEVANAGARI SIGN VISARGA +0904..0939 ; Grapheme_Base # Lo [54] DEVANAGARI LETTER SHORT A..DEVANAGARI LETTER HA +093B ; Grapheme_Base # Mc DEVANAGARI VOWEL SIGN OOE +093D ; Grapheme_Base # Lo DEVANAGARI SIGN AVAGRAHA +093E..0940 ; Grapheme_Base # Mc [3] DEVANAGARI VOWEL SIGN AA..DEVANAGARI VOWEL SIGN II +0949..094C ; Grapheme_Base # Mc [4] DEVANAGARI VOWEL SIGN CANDRA O..DEVANAGARI VOWEL SIGN AU +094E..094F ; Grapheme_Base # Mc [2] DEVANAGARI VOWEL SIGN PRISHTHAMATRA E..DEVANAGARI VOWEL SIGN AW +0950 ; Grapheme_Base # Lo DEVANAGARI OM +0958..0961 ; Grapheme_Base # Lo [10] DEVANAGARI LETTER QA..DEVANAGARI LETTER VOCALIC LL +0964..0965 ; Grapheme_Base # Po [2] DEVANAGARI DANDA..DEVANAGARI DOUBLE DANDA +0966..096F ; Grapheme_Base # Nd [10] DEVANAGARI DIGIT ZERO..DEVANAGARI DIGIT NINE +0970 ; Grapheme_Base # Po DEVANAGARI ABBREVIATION SIGN +0971 ; Grapheme_Base # Lm DEVANAGARI SIGN HIGH SPACING DOT +0972..0980 ; Grapheme_Base # Lo [15] DEVANAGARI LETTER CANDRA A..BENGALI ANJI +0982..0983 ; Grapheme_Base # Mc [2] BENGALI SIGN ANUSVARA..BENGALI SIGN VISARGA +0985..098C ; Grapheme_Base # Lo [8] BENGALI LETTER A..BENGALI LETTER VOCALIC L +098F..0990 ; Grapheme_Base # Lo [2] BENGALI LETTER E..BENGALI LETTER AI +0993..09A8 ; Grapheme_Base # Lo [22] BENGALI LETTER O..BENGALI LETTER NA +09AA..09B0 ; Grapheme_Base # Lo [7] BENGALI LETTER PA..BENGALI LETTER RA +09B2 ; Grapheme_Base # Lo BENGALI LETTER LA +09B6..09B9 ; Grapheme_Base # Lo [4] BENGALI LETTER SHA..BENGALI LETTER HA +09BD ; Grapheme_Base # Lo BENGALI SIGN AVAGRAHA +09BF..09C0 ; Grapheme_Base # Mc [2] BENGALI VOWEL SIGN I..BENGALI VOWEL SIGN II +09C7..09C8 ; Grapheme_Base # Mc [2] BENGALI VOWEL SIGN E..BENGALI VOWEL SIGN AI +09CB..09CC ; Grapheme_Base # Mc [2] BENGALI VOWEL SIGN O..BENGALI VOWEL SIGN AU +09CE ; Grapheme_Base # Lo BENGALI LETTER KHANDA TA +09DC..09DD ; Grapheme_Base # Lo [2] BENGALI LETTER RRA..BENGALI LETTER RHA +09DF..09E1 ; Grapheme_Base # Lo [3] BENGALI LETTER YYA..BENGALI LETTER VOCALIC LL +09E6..09EF ; Grapheme_Base # Nd [10] BENGALI DIGIT ZERO..BENGALI DIGIT NINE +09F0..09F1 ; Grapheme_Base # Lo [2] BENGALI LETTER RA WITH MIDDLE DIAGONAL..BENGALI LETTER RA WITH LOWER DIAGONAL +09F2..09F3 ; Grapheme_Base # Sc [2] BENGALI RUPEE MARK..BENGALI RUPEE SIGN +09F4..09F9 ; Grapheme_Base # No [6] BENGALI CURRENCY NUMERATOR ONE..BENGALI CURRENCY DENOMINATOR SIXTEEN +09FA ; Grapheme_Base # So BENGALI ISSHAR +09FB ; Grapheme_Base # Sc BENGALI GANDA MARK +09FC ; Grapheme_Base # Lo BENGALI LETTER VEDIC ANUSVARA +09FD ; Grapheme_Base # Po BENGALI ABBREVIATION SIGN +0A03 ; Grapheme_Base # Mc GURMUKHI SIGN VISARGA +0A05..0A0A ; Grapheme_Base # Lo [6] GURMUKHI LETTER A..GURMUKHI LETTER UU +0A0F..0A10 ; Grapheme_Base # Lo [2] GURMUKHI LETTER EE..GURMUKHI LETTER AI +0A13..0A28 ; Grapheme_Base # Lo [22] GURMUKHI LETTER OO..GURMUKHI LETTER NA +0A2A..0A30 ; Grapheme_Base # Lo [7] GURMUKHI LETTER PA..GURMUKHI LETTER RA +0A32..0A33 ; Grapheme_Base # Lo [2] GURMUKHI LETTER LA..GURMUKHI LETTER LLA +0A35..0A36 ; Grapheme_Base # Lo [2] GURMUKHI LETTER VA..GURMUKHI LETTER SHA +0A38..0A39 ; Grapheme_Base # Lo [2] GURMUKHI LETTER SA..GURMUKHI LETTER HA +0A3E..0A40 ; Grapheme_Base # Mc [3] GURMUKHI VOWEL SIGN AA..GURMUKHI VOWEL SIGN II +0A59..0A5C ; Grapheme_Base # Lo [4] GURMUKHI LETTER KHHA..GURMUKHI LETTER RRA +0A5E ; Grapheme_Base # Lo GURMUKHI LETTER FA +0A66..0A6F ; Grapheme_Base # Nd [10] GURMUKHI DIGIT ZERO..GURMUKHI DIGIT NINE +0A72..0A74 ; Grapheme_Base # Lo [3] GURMUKHI IRI..GURMUKHI EK ONKAR +0A76 ; Grapheme_Base # Po GURMUKHI ABBREVIATION SIGN +0A83 ; Grapheme_Base # Mc GUJARATI SIGN VISARGA +0A85..0A8D ; Grapheme_Base # Lo [9] GUJARATI LETTER A..GUJARATI VOWEL CANDRA E +0A8F..0A91 ; Grapheme_Base # Lo [3] GUJARATI LETTER E..GUJARATI VOWEL CANDRA O +0A93..0AA8 ; Grapheme_Base # Lo [22] GUJARATI LETTER O..GUJARATI LETTER NA +0AAA..0AB0 ; Grapheme_Base # Lo [7] GUJARATI LETTER PA..GUJARATI LETTER RA +0AB2..0AB3 ; Grapheme_Base # Lo [2] GUJARATI LETTER LA..GUJARATI LETTER LLA +0AB5..0AB9 ; Grapheme_Base # Lo [5] GUJARATI LETTER VA..GUJARATI LETTER HA +0ABD ; Grapheme_Base # Lo GUJARATI SIGN AVAGRAHA +0ABE..0AC0 ; Grapheme_Base # Mc [3] GUJARATI VOWEL SIGN AA..GUJARATI VOWEL SIGN II +0AC9 ; Grapheme_Base # Mc GUJARATI VOWEL SIGN CANDRA O +0ACB..0ACC ; Grapheme_Base # Mc [2] GUJARATI VOWEL SIGN O..GUJARATI VOWEL SIGN AU +0AD0 ; Grapheme_Base # Lo GUJARATI OM +0AE0..0AE1 ; Grapheme_Base # Lo [2] GUJARATI LETTER VOCALIC RR..GUJARATI LETTER VOCALIC LL +0AE6..0AEF ; Grapheme_Base # Nd [10] GUJARATI DIGIT ZERO..GUJARATI DIGIT NINE +0AF0 ; Grapheme_Base # Po GUJARATI ABBREVIATION SIGN +0AF1 ; Grapheme_Base # Sc GUJARATI RUPEE SIGN +0AF9 ; Grapheme_Base # Lo GUJARATI LETTER ZHA +0B02..0B03 ; Grapheme_Base # Mc [2] ORIYA SIGN ANUSVARA..ORIYA SIGN VISARGA +0B05..0B0C ; Grapheme_Base # Lo [8] ORIYA LETTER A..ORIYA LETTER VOCALIC L +0B0F..0B10 ; Grapheme_Base # Lo [2] ORIYA LETTER E..ORIYA LETTER AI +0B13..0B28 ; Grapheme_Base # Lo [22] ORIYA LETTER O..ORIYA LETTER NA +0B2A..0B30 ; Grapheme_Base # Lo [7] ORIYA LETTER PA..ORIYA LETTER RA +0B32..0B33 ; Grapheme_Base # Lo [2] ORIYA LETTER LA..ORIYA LETTER LLA +0B35..0B39 ; Grapheme_Base # Lo [5] ORIYA LETTER VA..ORIYA LETTER HA +0B3D ; Grapheme_Base # Lo ORIYA SIGN AVAGRAHA +0B40 ; Grapheme_Base # Mc ORIYA VOWEL SIGN II +0B47..0B48 ; Grapheme_Base # Mc [2] ORIYA VOWEL SIGN E..ORIYA VOWEL SIGN AI +0B4B..0B4C ; Grapheme_Base # Mc [2] ORIYA VOWEL SIGN O..ORIYA VOWEL SIGN AU +0B5C..0B5D ; Grapheme_Base # Lo [2] ORIYA LETTER RRA..ORIYA LETTER RHA +0B5F..0B61 ; Grapheme_Base # Lo [3] ORIYA LETTER YYA..ORIYA LETTER VOCALIC LL +0B66..0B6F ; Grapheme_Base # Nd [10] ORIYA DIGIT ZERO..ORIYA DIGIT NINE +0B70 ; Grapheme_Base # So ORIYA ISSHAR +0B71 ; Grapheme_Base # Lo ORIYA LETTER WA +0B72..0B77 ; Grapheme_Base # No [6] ORIYA FRACTION ONE QUARTER..ORIYA FRACTION THREE SIXTEENTHS +0B83 ; Grapheme_Base # Lo TAMIL SIGN VISARGA +0B85..0B8A ; Grapheme_Base # Lo [6] TAMIL LETTER A..TAMIL LETTER UU +0B8E..0B90 ; Grapheme_Base # Lo [3] TAMIL LETTER E..TAMIL LETTER AI +0B92..0B95 ; Grapheme_Base # Lo [4] TAMIL LETTER O..TAMIL LETTER KA +0B99..0B9A ; Grapheme_Base # Lo [2] TAMIL LETTER NGA..TAMIL LETTER CA +0B9C ; Grapheme_Base # Lo TAMIL LETTER JA +0B9E..0B9F ; Grapheme_Base # Lo [2] TAMIL LETTER NYA..TAMIL LETTER TTA +0BA3..0BA4 ; Grapheme_Base # Lo [2] TAMIL LETTER NNA..TAMIL LETTER TA +0BA8..0BAA ; Grapheme_Base # Lo [3] TAMIL LETTER NA..TAMIL LETTER PA +0BAE..0BB9 ; Grapheme_Base # Lo [12] TAMIL LETTER MA..TAMIL LETTER HA +0BBF ; Grapheme_Base # Mc TAMIL VOWEL SIGN I +0BC1..0BC2 ; Grapheme_Base # Mc [2] TAMIL VOWEL SIGN U..TAMIL VOWEL SIGN UU +0BC6..0BC8 ; Grapheme_Base # Mc [3] TAMIL VOWEL SIGN E..TAMIL VOWEL SIGN AI +0BCA..0BCC ; Grapheme_Base # Mc [3] TAMIL VOWEL SIGN O..TAMIL VOWEL SIGN AU +0BD0 ; Grapheme_Base # Lo TAMIL OM +0BE6..0BEF ; Grapheme_Base # Nd [10] TAMIL DIGIT ZERO..TAMIL DIGIT NINE +0BF0..0BF2 ; Grapheme_Base # No [3] TAMIL NUMBER TEN..TAMIL NUMBER ONE THOUSAND +0BF3..0BF8 ; Grapheme_Base # So [6] TAMIL DAY SIGN..TAMIL AS ABOVE SIGN +0BF9 ; Grapheme_Base # Sc TAMIL RUPEE SIGN +0BFA ; Grapheme_Base # So TAMIL NUMBER SIGN +0C01..0C03 ; Grapheme_Base # Mc [3] TELUGU SIGN CANDRABINDU..TELUGU SIGN VISARGA +0C05..0C0C ; Grapheme_Base # Lo [8] TELUGU LETTER A..TELUGU LETTER VOCALIC L +0C0E..0C10 ; Grapheme_Base # Lo [3] TELUGU LETTER E..TELUGU LETTER AI +0C12..0C28 ; Grapheme_Base # Lo [23] TELUGU LETTER O..TELUGU LETTER NA +0C2A..0C39 ; Grapheme_Base # Lo [16] TELUGU LETTER PA..TELUGU LETTER HA +0C3D ; Grapheme_Base # Lo TELUGU SIGN AVAGRAHA +0C41..0C44 ; Grapheme_Base # Mc [4] TELUGU VOWEL SIGN U..TELUGU VOWEL SIGN VOCALIC RR +0C58..0C5A ; Grapheme_Base # Lo [3] TELUGU LETTER TSA..TELUGU LETTER RRRA +0C60..0C61 ; Grapheme_Base # Lo [2] TELUGU LETTER VOCALIC RR..TELUGU LETTER VOCALIC LL +0C66..0C6F ; Grapheme_Base # Nd [10] TELUGU DIGIT ZERO..TELUGU DIGIT NINE +0C78..0C7E ; Grapheme_Base # No [7] TELUGU FRACTION DIGIT ZERO FOR ODD POWERS OF FOUR..TELUGU FRACTION DIGIT THREE FOR EVEN POWERS OF FOUR +0C7F ; Grapheme_Base # So TELUGU SIGN TUUMU +0C80 ; Grapheme_Base # Lo KANNADA SIGN SPACING CANDRABINDU +0C82..0C83 ; Grapheme_Base # Mc [2] KANNADA SIGN ANUSVARA..KANNADA SIGN VISARGA +0C84 ; Grapheme_Base # Po KANNADA SIGN SIDDHAM +0C85..0C8C ; Grapheme_Base # Lo [8] KANNADA LETTER A..KANNADA LETTER VOCALIC L +0C8E..0C90 ; Grapheme_Base # Lo [3] KANNADA LETTER E..KANNADA LETTER AI +0C92..0CA8 ; Grapheme_Base # Lo [23] KANNADA LETTER O..KANNADA LETTER NA +0CAA..0CB3 ; Grapheme_Base # Lo [10] KANNADA LETTER PA..KANNADA LETTER LLA +0CB5..0CB9 ; Grapheme_Base # Lo [5] KANNADA LETTER VA..KANNADA LETTER HA +0CBD ; Grapheme_Base # Lo KANNADA SIGN AVAGRAHA +0CBE ; Grapheme_Base # Mc KANNADA VOWEL SIGN AA +0CC0..0CC1 ; Grapheme_Base # Mc [2] KANNADA VOWEL SIGN II..KANNADA VOWEL SIGN U +0CC3..0CC4 ; Grapheme_Base # Mc [2] KANNADA VOWEL SIGN VOCALIC R..KANNADA VOWEL SIGN VOCALIC RR +0CC7..0CC8 ; Grapheme_Base # Mc [2] KANNADA VOWEL SIGN EE..KANNADA VOWEL SIGN AI +0CCA..0CCB ; Grapheme_Base # Mc [2] KANNADA VOWEL SIGN O..KANNADA VOWEL SIGN OO +0CDE ; Grapheme_Base # Lo KANNADA LETTER FA +0CE0..0CE1 ; Grapheme_Base # Lo [2] KANNADA LETTER VOCALIC RR..KANNADA LETTER VOCALIC LL +0CE6..0CEF ; Grapheme_Base # Nd [10] KANNADA DIGIT ZERO..KANNADA DIGIT NINE +0CF1..0CF2 ; Grapheme_Base # Lo [2] KANNADA SIGN JIHVAMULIYA..KANNADA SIGN UPADHMANIYA +0D02..0D03 ; Grapheme_Base # Mc [2] MALAYALAM SIGN ANUSVARA..MALAYALAM SIGN VISARGA +0D05..0D0C ; Grapheme_Base # Lo [8] MALAYALAM LETTER A..MALAYALAM LETTER VOCALIC L +0D0E..0D10 ; Grapheme_Base # Lo [3] MALAYALAM LETTER E..MALAYALAM LETTER AI +0D12..0D3A ; Grapheme_Base # Lo [41] MALAYALAM LETTER O..MALAYALAM LETTER TTTA +0D3D ; Grapheme_Base # Lo MALAYALAM SIGN AVAGRAHA +0D3F..0D40 ; Grapheme_Base # Mc [2] MALAYALAM VOWEL SIGN I..MALAYALAM VOWEL SIGN II +0D46..0D48 ; Grapheme_Base # Mc [3] MALAYALAM VOWEL SIGN E..MALAYALAM VOWEL SIGN AI +0D4A..0D4C ; Grapheme_Base # Mc [3] MALAYALAM VOWEL SIGN O..MALAYALAM VOWEL SIGN AU +0D4E ; Grapheme_Base # Lo MALAYALAM LETTER DOT REPH +0D4F ; Grapheme_Base # So MALAYALAM SIGN PARA +0D54..0D56 ; Grapheme_Base # Lo [3] MALAYALAM LETTER CHILLU M..MALAYALAM LETTER CHILLU LLL +0D58..0D5E ; Grapheme_Base # No [7] MALAYALAM FRACTION ONE ONE-HUNDRED-AND-SIXTIETH..MALAYALAM FRACTION ONE FIFTH +0D5F..0D61 ; Grapheme_Base # Lo [3] MALAYALAM LETTER ARCHAIC II..MALAYALAM LETTER VOCALIC LL +0D66..0D6F ; Grapheme_Base # Nd [10] MALAYALAM DIGIT ZERO..MALAYALAM DIGIT NINE +0D70..0D78 ; Grapheme_Base # No [9] MALAYALAM NUMBER TEN..MALAYALAM FRACTION THREE SIXTEENTHS +0D79 ; Grapheme_Base # So MALAYALAM DATE MARK +0D7A..0D7F ; Grapheme_Base # Lo [6] MALAYALAM LETTER CHILLU NN..MALAYALAM LETTER CHILLU K +0D82..0D83 ; Grapheme_Base # Mc [2] SINHALA SIGN ANUSVARAYA..SINHALA SIGN VISARGAYA +0D85..0D96 ; Grapheme_Base # Lo [18] SINHALA LETTER AYANNA..SINHALA LETTER AUYANNA +0D9A..0DB1 ; Grapheme_Base # Lo [24] SINHALA LETTER ALPAPRAANA KAYANNA..SINHALA LETTER DANTAJA NAYANNA +0DB3..0DBB ; Grapheme_Base # Lo [9] SINHALA LETTER SANYAKA DAYANNA..SINHALA LETTER RAYANNA +0DBD ; Grapheme_Base # Lo SINHALA LETTER DANTAJA LAYANNA +0DC0..0DC6 ; Grapheme_Base # Lo [7] SINHALA LETTER VAYANNA..SINHALA LETTER FAYANNA +0DD0..0DD1 ; Grapheme_Base # Mc [2] SINHALA VOWEL SIGN KETTI AEDA-PILLA..SINHALA VOWEL SIGN DIGA AEDA-PILLA +0DD8..0DDE ; Grapheme_Base # Mc [7] SINHALA VOWEL SIGN GAETTA-PILLA..SINHALA VOWEL SIGN KOMBUVA HAA GAYANUKITTA +0DE6..0DEF ; Grapheme_Base # Nd [10] SINHALA LITH DIGIT ZERO..SINHALA LITH DIGIT NINE +0DF2..0DF3 ; Grapheme_Base # Mc [2] SINHALA VOWEL SIGN DIGA GAETTA-PILLA..SINHALA VOWEL SIGN DIGA GAYANUKITTA +0DF4 ; Grapheme_Base # Po SINHALA PUNCTUATION KUNDDALIYA +0E01..0E30 ; Grapheme_Base # Lo [48] THAI CHARACTER KO KAI..THAI CHARACTER SARA A +0E32..0E33 ; Grapheme_Base # Lo [2] THAI CHARACTER SARA AA..THAI CHARACTER SARA AM +0E3F ; Grapheme_Base # Sc THAI CURRENCY SYMBOL BAHT +0E40..0E45 ; Grapheme_Base # Lo [6] THAI CHARACTER SARA E..THAI CHARACTER LAKKHANGYAO +0E46 ; Grapheme_Base # Lm THAI CHARACTER MAIYAMOK +0E4F ; Grapheme_Base # Po THAI CHARACTER FONGMAN +0E50..0E59 ; Grapheme_Base # Nd [10] THAI DIGIT ZERO..THAI DIGIT NINE +0E5A..0E5B ; Grapheme_Base # Po [2] THAI CHARACTER ANGKHANKHU..THAI CHARACTER KHOMUT +0E81..0E82 ; Grapheme_Base # Lo [2] LAO LETTER KO..LAO LETTER KHO SUNG +0E84 ; Grapheme_Base # Lo LAO LETTER KHO TAM +0E87..0E88 ; Grapheme_Base # Lo [2] LAO LETTER NGO..LAO LETTER CO +0E8A ; Grapheme_Base # Lo LAO LETTER SO TAM +0E8D ; Grapheme_Base # Lo LAO LETTER NYO +0E94..0E97 ; Grapheme_Base # Lo [4] LAO LETTER DO..LAO LETTER THO TAM +0E99..0E9F ; Grapheme_Base # Lo [7] LAO LETTER NO..LAO LETTER FO SUNG +0EA1..0EA3 ; Grapheme_Base # Lo [3] LAO LETTER MO..LAO LETTER LO LING +0EA5 ; Grapheme_Base # Lo LAO LETTER LO LOOT +0EA7 ; Grapheme_Base # Lo LAO LETTER WO +0EAA..0EAB ; Grapheme_Base # Lo [2] LAO LETTER SO SUNG..LAO LETTER HO SUNG +0EAD..0EB0 ; Grapheme_Base # Lo [4] LAO LETTER O..LAO VOWEL SIGN A +0EB2..0EB3 ; Grapheme_Base # Lo [2] LAO VOWEL SIGN AA..LAO VOWEL SIGN AM +0EBD ; Grapheme_Base # Lo LAO SEMIVOWEL SIGN NYO +0EC0..0EC4 ; Grapheme_Base # Lo [5] LAO VOWEL SIGN E..LAO VOWEL SIGN AI +0EC6 ; Grapheme_Base # Lm LAO KO LA +0ED0..0ED9 ; Grapheme_Base # Nd [10] LAO DIGIT ZERO..LAO DIGIT NINE +0EDC..0EDF ; Grapheme_Base # Lo [4] LAO HO NO..LAO LETTER KHMU NYO +0F00 ; Grapheme_Base # Lo TIBETAN SYLLABLE OM +0F01..0F03 ; Grapheme_Base # So [3] TIBETAN MARK GTER YIG MGO TRUNCATED A..TIBETAN MARK GTER YIG MGO -UM GTER TSHEG MA +0F04..0F12 ; Grapheme_Base # Po [15] TIBETAN MARK INITIAL YIG MGO MDUN MA..TIBETAN MARK RGYA GRAM SHAD +0F13 ; Grapheme_Base # So TIBETAN MARK CARET -DZUD RTAGS ME LONG CAN +0F14 ; Grapheme_Base # Po TIBETAN MARK GTER TSHEG +0F15..0F17 ; Grapheme_Base # So [3] TIBETAN LOGOTYPE SIGN CHAD RTAGS..TIBETAN ASTROLOGICAL SIGN SGRA GCAN -CHAR RTAGS +0F1A..0F1F ; Grapheme_Base # So [6] TIBETAN SIGN RDEL DKAR GCIG..TIBETAN SIGN RDEL DKAR RDEL NAG +0F20..0F29 ; Grapheme_Base # Nd [10] TIBETAN DIGIT ZERO..TIBETAN DIGIT NINE +0F2A..0F33 ; Grapheme_Base # No [10] TIBETAN DIGIT HALF ONE..TIBETAN DIGIT HALF ZERO +0F34 ; Grapheme_Base # So TIBETAN MARK BSDUS RTAGS +0F36 ; Grapheme_Base # So TIBETAN MARK CARET -DZUD RTAGS BZHI MIG CAN +0F38 ; Grapheme_Base # So TIBETAN MARK CHE MGO +0F3A ; Grapheme_Base # Ps TIBETAN MARK GUG RTAGS GYON +0F3B ; Grapheme_Base # Pe TIBETAN MARK GUG RTAGS GYAS +0F3C ; Grapheme_Base # Ps TIBETAN MARK ANG KHANG GYON +0F3D ; Grapheme_Base # Pe TIBETAN MARK ANG KHANG GYAS +0F3E..0F3F ; Grapheme_Base # Mc [2] TIBETAN SIGN YAR TSHES..TIBETAN SIGN MAR TSHES +0F40..0F47 ; Grapheme_Base # Lo [8] TIBETAN LETTER KA..TIBETAN LETTER JA +0F49..0F6C ; Grapheme_Base # Lo [36] TIBETAN LETTER NYA..TIBETAN LETTER RRA +0F7F ; Grapheme_Base # Mc TIBETAN SIGN RNAM BCAD +0F85 ; Grapheme_Base # Po TIBETAN MARK PALUTA +0F88..0F8C ; Grapheme_Base # Lo [5] TIBETAN SIGN LCE TSA CAN..TIBETAN SIGN INVERTED MCHU CAN +0FBE..0FC5 ; Grapheme_Base # So [8] TIBETAN KU RU KHA..TIBETAN SYMBOL RDO RJE +0FC7..0FCC ; Grapheme_Base # So [6] TIBETAN SYMBOL RDO RJE RGYA GRAM..TIBETAN SYMBOL NOR BU BZHI -KHYIL +0FCE..0FCF ; Grapheme_Base # So [2] TIBETAN SIGN RDEL NAG RDEL DKAR..TIBETAN SIGN RDEL NAG GSUM +0FD0..0FD4 ; Grapheme_Base # Po [5] TIBETAN MARK BSKA- SHOG GI MGO RGYAN..TIBETAN MARK CLOSING BRDA RNYING YIG MGO SGAB MA +0FD5..0FD8 ; Grapheme_Base # So [4] RIGHT-FACING SVASTI SIGN..LEFT-FACING SVASTI SIGN WITH DOTS +0FD9..0FDA ; Grapheme_Base # Po [2] TIBETAN MARK LEADING MCHAN RTAGS..TIBETAN MARK TRAILING MCHAN RTAGS +1000..102A ; Grapheme_Base # Lo [43] MYANMAR LETTER KA..MYANMAR LETTER AU +102B..102C ; Grapheme_Base # Mc [2] MYANMAR VOWEL SIGN TALL AA..MYANMAR VOWEL SIGN AA +1031 ; Grapheme_Base # Mc MYANMAR VOWEL SIGN E +1038 ; Grapheme_Base # Mc MYANMAR SIGN VISARGA +103B..103C ; Grapheme_Base # Mc [2] MYANMAR CONSONANT SIGN MEDIAL YA..MYANMAR CONSONANT SIGN MEDIAL RA +103F ; Grapheme_Base # Lo MYANMAR LETTER GREAT SA +1040..1049 ; Grapheme_Base # Nd [10] MYANMAR DIGIT ZERO..MYANMAR DIGIT NINE +104A..104F ; Grapheme_Base # Po [6] MYANMAR SIGN LITTLE SECTION..MYANMAR SYMBOL GENITIVE +1050..1055 ; Grapheme_Base # Lo [6] MYANMAR LETTER SHA..MYANMAR LETTER VOCALIC LL +1056..1057 ; Grapheme_Base # Mc [2] MYANMAR VOWEL SIGN VOCALIC R..MYANMAR VOWEL SIGN VOCALIC RR +105A..105D ; Grapheme_Base # Lo [4] MYANMAR LETTER MON NGA..MYANMAR LETTER MON BBE +1061 ; Grapheme_Base # Lo MYANMAR LETTER SGAW KAREN SHA +1062..1064 ; Grapheme_Base # Mc [3] MYANMAR VOWEL SIGN SGAW KAREN EU..MYANMAR TONE MARK SGAW KAREN KE PHO +1065..1066 ; Grapheme_Base # Lo [2] MYANMAR LETTER WESTERN PWO KAREN THA..MYANMAR LETTER WESTERN PWO KAREN PWA +1067..106D ; Grapheme_Base # Mc [7] MYANMAR VOWEL SIGN WESTERN PWO KAREN EU..MYANMAR SIGN WESTERN PWO KAREN TONE-5 +106E..1070 ; Grapheme_Base # Lo [3] MYANMAR LETTER EASTERN PWO KAREN NNA..MYANMAR LETTER EASTERN PWO KAREN GHWA +1075..1081 ; Grapheme_Base # Lo [13] MYANMAR LETTER SHAN KA..MYANMAR LETTER SHAN HA +1083..1084 ; Grapheme_Base # Mc [2] MYANMAR VOWEL SIGN SHAN AA..MYANMAR VOWEL SIGN SHAN E +1087..108C ; Grapheme_Base # Mc [6] MYANMAR SIGN SHAN TONE-2..MYANMAR SIGN SHAN COUNCIL TONE-3 +108E ; Grapheme_Base # Lo MYANMAR LETTER RUMAI PALAUNG FA +108F ; Grapheme_Base # Mc MYANMAR SIGN RUMAI PALAUNG TONE-5 +1090..1099 ; Grapheme_Base # Nd [10] MYANMAR SHAN DIGIT ZERO..MYANMAR SHAN DIGIT NINE +109A..109C ; Grapheme_Base # Mc [3] MYANMAR SIGN KHAMTI TONE-1..MYANMAR VOWEL SIGN AITON A +109E..109F ; Grapheme_Base # So [2] MYANMAR SYMBOL SHAN ONE..MYANMAR SYMBOL SHAN EXCLAMATION +10A0..10C5 ; Grapheme_Base # L& [38] GEORGIAN CAPITAL LETTER AN..GEORGIAN CAPITAL LETTER HOE +10C7 ; Grapheme_Base # L& GEORGIAN CAPITAL LETTER YN +10CD ; Grapheme_Base # L& GEORGIAN CAPITAL LETTER AEN +10D0..10FA ; Grapheme_Base # L& [43] GEORGIAN LETTER AN..GEORGIAN LETTER AIN +10FB ; Grapheme_Base # Po GEORGIAN PARAGRAPH SEPARATOR +10FC ; Grapheme_Base # Lm MODIFIER LETTER GEORGIAN NAR +10FD..10FF ; Grapheme_Base # L& [3] GEORGIAN LETTER AEN..GEORGIAN LETTER LABIAL SIGN +1100..1248 ; Grapheme_Base # Lo [329] HANGUL CHOSEONG KIYEOK..ETHIOPIC SYLLABLE QWA +124A..124D ; Grapheme_Base # Lo [4] ETHIOPIC SYLLABLE QWI..ETHIOPIC SYLLABLE QWE +1250..1256 ; Grapheme_Base # Lo [7] ETHIOPIC SYLLABLE QHA..ETHIOPIC SYLLABLE QHO +1258 ; Grapheme_Base # Lo ETHIOPIC SYLLABLE QHWA +125A..125D ; Grapheme_Base # Lo [4] ETHIOPIC SYLLABLE QHWI..ETHIOPIC SYLLABLE QHWE +1260..1288 ; Grapheme_Base # Lo [41] ETHIOPIC SYLLABLE BA..ETHIOPIC SYLLABLE XWA +128A..128D ; Grapheme_Base # Lo [4] ETHIOPIC SYLLABLE XWI..ETHIOPIC SYLLABLE XWE +1290..12B0 ; Grapheme_Base # Lo [33] ETHIOPIC SYLLABLE NA..ETHIOPIC SYLLABLE KWA +12B2..12B5 ; Grapheme_Base # Lo [4] ETHIOPIC SYLLABLE KWI..ETHIOPIC SYLLABLE KWE +12B8..12BE ; Grapheme_Base # Lo [7] ETHIOPIC SYLLABLE KXA..ETHIOPIC SYLLABLE KXO +12C0 ; Grapheme_Base # Lo ETHIOPIC SYLLABLE KXWA +12C2..12C5 ; Grapheme_Base # Lo [4] ETHIOPIC SYLLABLE KXWI..ETHIOPIC SYLLABLE KXWE +12C8..12D6 ; Grapheme_Base # Lo [15] ETHIOPIC SYLLABLE WA..ETHIOPIC SYLLABLE PHARYNGEAL O +12D8..1310 ; Grapheme_Base # Lo [57] ETHIOPIC SYLLABLE ZA..ETHIOPIC SYLLABLE GWA +1312..1315 ; Grapheme_Base # Lo [4] ETHIOPIC SYLLABLE GWI..ETHIOPIC SYLLABLE GWE +1318..135A ; Grapheme_Base # Lo [67] ETHIOPIC SYLLABLE GGA..ETHIOPIC SYLLABLE FYA +1360..1368 ; Grapheme_Base # Po [9] ETHIOPIC SECTION MARK..ETHIOPIC PARAGRAPH SEPARATOR +1369..137C ; Grapheme_Base # No [20] ETHIOPIC DIGIT ONE..ETHIOPIC NUMBER TEN THOUSAND +1380..138F ; Grapheme_Base # Lo [16] ETHIOPIC SYLLABLE SEBATBEIT MWA..ETHIOPIC SYLLABLE PWE +1390..1399 ; Grapheme_Base # So [10] ETHIOPIC TONAL MARK YIZET..ETHIOPIC TONAL MARK KURT +13A0..13F5 ; Grapheme_Base # L& [86] CHEROKEE LETTER A..CHEROKEE LETTER MV +13F8..13FD ; Grapheme_Base # L& [6] CHEROKEE SMALL LETTER YE..CHEROKEE SMALL LETTER MV +1400 ; Grapheme_Base # Pd CANADIAN SYLLABICS HYPHEN +1401..166C ; Grapheme_Base # Lo [620] CANADIAN SYLLABICS E..CANADIAN SYLLABICS CARRIER TTSA +166D..166E ; Grapheme_Base # Po [2] CANADIAN SYLLABICS CHI SIGN..CANADIAN SYLLABICS FULL STOP +166F..167F ; Grapheme_Base # Lo [17] CANADIAN SYLLABICS QAI..CANADIAN SYLLABICS BLACKFOOT W +1680 ; Grapheme_Base # Zs OGHAM SPACE MARK +1681..169A ; Grapheme_Base # Lo [26] OGHAM LETTER BEITH..OGHAM LETTER PEITH +169B ; Grapheme_Base # Ps OGHAM FEATHER MARK +169C ; Grapheme_Base # Pe OGHAM REVERSED FEATHER MARK +16A0..16EA ; Grapheme_Base # Lo [75] RUNIC LETTER FEHU FEOH FE F..RUNIC LETTER X +16EB..16ED ; Grapheme_Base # Po [3] RUNIC SINGLE PUNCTUATION..RUNIC CROSS PUNCTUATION +16EE..16F0 ; Grapheme_Base # Nl [3] RUNIC ARLAUG SYMBOL..RUNIC BELGTHOR SYMBOL +16F1..16F8 ; Grapheme_Base # Lo [8] RUNIC LETTER K..RUNIC LETTER FRANKS CASKET AESC +1700..170C ; Grapheme_Base # Lo [13] TAGALOG LETTER A..TAGALOG LETTER YA +170E..1711 ; Grapheme_Base # Lo [4] TAGALOG LETTER LA..TAGALOG LETTER HA +1720..1731 ; Grapheme_Base # Lo [18] HANUNOO LETTER A..HANUNOO LETTER HA +1735..1736 ; Grapheme_Base # Po [2] PHILIPPINE SINGLE PUNCTUATION..PHILIPPINE DOUBLE PUNCTUATION +1740..1751 ; Grapheme_Base # Lo [18] BUHID LETTER A..BUHID LETTER HA +1760..176C ; Grapheme_Base # Lo [13] TAGBANWA LETTER A..TAGBANWA LETTER YA +176E..1770 ; Grapheme_Base # Lo [3] TAGBANWA LETTER LA..TAGBANWA LETTER SA +1780..17B3 ; Grapheme_Base # Lo [52] KHMER LETTER KA..KHMER INDEPENDENT VOWEL QAU +17B6 ; Grapheme_Base # Mc KHMER VOWEL SIGN AA +17BE..17C5 ; Grapheme_Base # Mc [8] KHMER VOWEL SIGN OE..KHMER VOWEL SIGN AU +17C7..17C8 ; Grapheme_Base # Mc [2] KHMER SIGN REAHMUK..KHMER SIGN YUUKALEAPINTU +17D4..17D6 ; Grapheme_Base # Po [3] KHMER SIGN KHAN..KHMER SIGN CAMNUC PII KUUH +17D7 ; Grapheme_Base # Lm KHMER SIGN LEK TOO +17D8..17DA ; Grapheme_Base # Po [3] KHMER SIGN BEYYAL..KHMER SIGN KOOMUUT +17DB ; Grapheme_Base # Sc KHMER CURRENCY SYMBOL RIEL +17DC ; Grapheme_Base # Lo KHMER SIGN AVAKRAHASANYA +17E0..17E9 ; Grapheme_Base # Nd [10] KHMER DIGIT ZERO..KHMER DIGIT NINE +17F0..17F9 ; Grapheme_Base # No [10] KHMER SYMBOL LEK ATTAK SON..KHMER SYMBOL LEK ATTAK PRAM-BUON +1800..1805 ; Grapheme_Base # Po [6] MONGOLIAN BIRGA..MONGOLIAN FOUR DOTS +1806 ; Grapheme_Base # Pd MONGOLIAN TODO SOFT HYPHEN +1807..180A ; Grapheme_Base # Po [4] MONGOLIAN SIBE SYLLABLE BOUNDARY MARKER..MONGOLIAN NIRUGU +1810..1819 ; Grapheme_Base # Nd [10] MONGOLIAN DIGIT ZERO..MONGOLIAN DIGIT NINE +1820..1842 ; Grapheme_Base # Lo [35] MONGOLIAN LETTER A..MONGOLIAN LETTER CHI +1843 ; Grapheme_Base # Lm MONGOLIAN LETTER TODO LONG VOWEL SIGN +1844..1878 ; Grapheme_Base # Lo [53] MONGOLIAN LETTER TODO E..MONGOLIAN LETTER CHA WITH TWO DOTS +1880..1884 ; Grapheme_Base # Lo [5] MONGOLIAN LETTER ALI GALI ANUSVARA ONE..MONGOLIAN LETTER ALI GALI INVERTED UBADAMA +1887..18A8 ; Grapheme_Base # Lo [34] MONGOLIAN LETTER ALI GALI A..MONGOLIAN LETTER MANCHU ALI GALI BHA +18AA ; Grapheme_Base # Lo MONGOLIAN LETTER MANCHU ALI GALI LHA +18B0..18F5 ; Grapheme_Base # Lo [70] CANADIAN SYLLABICS OY..CANADIAN SYLLABICS CARRIER DENTAL S +1900..191E ; Grapheme_Base # Lo [31] LIMBU VOWEL-CARRIER LETTER..LIMBU LETTER TRA +1923..1926 ; Grapheme_Base # Mc [4] LIMBU VOWEL SIGN EE..LIMBU VOWEL SIGN AU +1929..192B ; Grapheme_Base # Mc [3] LIMBU SUBJOINED LETTER YA..LIMBU SUBJOINED LETTER WA +1930..1931 ; Grapheme_Base # Mc [2] LIMBU SMALL LETTER KA..LIMBU SMALL LETTER NGA +1933..1938 ; Grapheme_Base # Mc [6] LIMBU SMALL LETTER TA..LIMBU SMALL LETTER LA +1940 ; Grapheme_Base # So LIMBU SIGN LOO +1944..1945 ; Grapheme_Base # Po [2] LIMBU EXCLAMATION MARK..LIMBU QUESTION MARK +1946..194F ; Grapheme_Base # Nd [10] LIMBU DIGIT ZERO..LIMBU DIGIT NINE +1950..196D ; Grapheme_Base # Lo [30] TAI LE LETTER KA..TAI LE LETTER AI +1970..1974 ; Grapheme_Base # Lo [5] TAI LE LETTER TONE-2..TAI LE LETTER TONE-6 +1980..19AB ; Grapheme_Base # Lo [44] NEW TAI LUE LETTER HIGH QA..NEW TAI LUE LETTER LOW SUA +19B0..19C9 ; Grapheme_Base # Lo [26] NEW TAI LUE VOWEL SIGN VOWEL SHORTENER..NEW TAI LUE TONE MARK-2 +19D0..19D9 ; Grapheme_Base # Nd [10] NEW TAI LUE DIGIT ZERO..NEW TAI LUE DIGIT NINE +19DA ; Grapheme_Base # No NEW TAI LUE THAM DIGIT ONE +19DE..19FF ; Grapheme_Base # So [34] NEW TAI LUE SIGN LAE..KHMER SYMBOL DAP-PRAM ROC +1A00..1A16 ; Grapheme_Base # Lo [23] BUGINESE LETTER KA..BUGINESE LETTER HA +1A19..1A1A ; Grapheme_Base # Mc [2] BUGINESE VOWEL SIGN E..BUGINESE VOWEL SIGN O +1A1E..1A1F ; Grapheme_Base # Po [2] BUGINESE PALLAWA..BUGINESE END OF SECTION +1A20..1A54 ; Grapheme_Base # Lo [53] TAI THAM LETTER HIGH KA..TAI THAM LETTER GREAT SA +1A55 ; Grapheme_Base # Mc TAI THAM CONSONANT SIGN MEDIAL RA +1A57 ; Grapheme_Base # Mc TAI THAM CONSONANT SIGN LA TANG LAI +1A61 ; Grapheme_Base # Mc TAI THAM VOWEL SIGN A +1A63..1A64 ; Grapheme_Base # Mc [2] TAI THAM VOWEL SIGN AA..TAI THAM VOWEL SIGN TALL AA +1A6D..1A72 ; Grapheme_Base # Mc [6] TAI THAM VOWEL SIGN OY..TAI THAM VOWEL SIGN THAM AI +1A80..1A89 ; Grapheme_Base # Nd [10] TAI THAM HORA DIGIT ZERO..TAI THAM HORA DIGIT NINE +1A90..1A99 ; Grapheme_Base # Nd [10] TAI THAM THAM DIGIT ZERO..TAI THAM THAM DIGIT NINE +1AA0..1AA6 ; Grapheme_Base # Po [7] TAI THAM SIGN WIANG..TAI THAM SIGN REVERSED ROTATED RANA +1AA7 ; Grapheme_Base # Lm TAI THAM SIGN MAI YAMOK +1AA8..1AAD ; Grapheme_Base # Po [6] TAI THAM SIGN KAAN..TAI THAM SIGN CAANG +1B04 ; Grapheme_Base # Mc BALINESE SIGN BISAH +1B05..1B33 ; Grapheme_Base # Lo [47] BALINESE LETTER AKARA..BALINESE LETTER HA +1B35 ; Grapheme_Base # Mc BALINESE VOWEL SIGN TEDUNG +1B3B ; Grapheme_Base # Mc BALINESE VOWEL SIGN RA REPA TEDUNG +1B3D..1B41 ; Grapheme_Base # Mc [5] BALINESE VOWEL SIGN LA LENGA TEDUNG..BALINESE VOWEL SIGN TALING REPA TEDUNG +1B43..1B44 ; Grapheme_Base # Mc [2] BALINESE VOWEL SIGN PEPET TEDUNG..BALINESE ADEG ADEG +1B45..1B4B ; Grapheme_Base # Lo [7] BALINESE LETTER KAF SASAK..BALINESE LETTER ASYURA SASAK +1B50..1B59 ; Grapheme_Base # Nd [10] BALINESE DIGIT ZERO..BALINESE DIGIT NINE +1B5A..1B60 ; Grapheme_Base # Po [7] BALINESE PANTI..BALINESE PAMENENG +1B61..1B6A ; Grapheme_Base # So [10] BALINESE MUSICAL SYMBOL DONG..BALINESE MUSICAL SYMBOL DANG GEDE +1B74..1B7C ; Grapheme_Base # So [9] BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DUG..BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PING +1B82 ; Grapheme_Base # Mc SUNDANESE SIGN PANGWISAD +1B83..1BA0 ; Grapheme_Base # Lo [30] SUNDANESE LETTER A..SUNDANESE LETTER HA +1BA1 ; Grapheme_Base # Mc SUNDANESE CONSONANT SIGN PAMINGKAL +1BA6..1BA7 ; Grapheme_Base # Mc [2] SUNDANESE VOWEL SIGN PANAELAENG..SUNDANESE VOWEL SIGN PANOLONG +1BAA ; Grapheme_Base # Mc SUNDANESE SIGN PAMAAEH +1BAE..1BAF ; Grapheme_Base # Lo [2] SUNDANESE LETTER KHA..SUNDANESE LETTER SYA +1BB0..1BB9 ; Grapheme_Base # Nd [10] SUNDANESE DIGIT ZERO..SUNDANESE DIGIT NINE +1BBA..1BE5 ; Grapheme_Base # Lo [44] SUNDANESE AVAGRAHA..BATAK LETTER U +1BE7 ; Grapheme_Base # Mc BATAK VOWEL SIGN E +1BEA..1BEC ; Grapheme_Base # Mc [3] BATAK VOWEL SIGN I..BATAK VOWEL SIGN O +1BEE ; Grapheme_Base # Mc BATAK VOWEL SIGN U +1BF2..1BF3 ; Grapheme_Base # Mc [2] BATAK PANGOLAT..BATAK PANONGONAN +1BFC..1BFF ; Grapheme_Base # Po [4] BATAK SYMBOL BINDU NA METEK..BATAK SYMBOL BINDU PANGOLAT +1C00..1C23 ; Grapheme_Base # Lo [36] LEPCHA LETTER KA..LEPCHA LETTER A +1C24..1C2B ; Grapheme_Base # Mc [8] LEPCHA SUBJOINED LETTER YA..LEPCHA VOWEL SIGN UU +1C34..1C35 ; Grapheme_Base # Mc [2] LEPCHA CONSONANT SIGN NYIN-DO..LEPCHA CONSONANT SIGN KANG +1C3B..1C3F ; Grapheme_Base # Po [5] LEPCHA PUNCTUATION TA-ROL..LEPCHA PUNCTUATION TSHOOK +1C40..1C49 ; Grapheme_Base # Nd [10] LEPCHA DIGIT ZERO..LEPCHA DIGIT NINE +1C4D..1C4F ; Grapheme_Base # Lo [3] LEPCHA LETTER TTA..LEPCHA LETTER DDA +1C50..1C59 ; Grapheme_Base # Nd [10] OL CHIKI DIGIT ZERO..OL CHIKI DIGIT NINE +1C5A..1C77 ; Grapheme_Base # Lo [30] OL CHIKI LETTER LA..OL CHIKI LETTER OH +1C78..1C7D ; Grapheme_Base # Lm [6] OL CHIKI MU TTUDDAG..OL CHIKI AHAD +1C7E..1C7F ; Grapheme_Base # Po [2] OL CHIKI PUNCTUATION MUCAAD..OL CHIKI PUNCTUATION DOUBLE MUCAAD +1C80..1C88 ; Grapheme_Base # L& [9] CYRILLIC SMALL LETTER ROUNDED VE..CYRILLIC SMALL LETTER UNBLENDED UK +1C90..1CBA ; Grapheme_Base # L& [43] GEORGIAN MTAVRULI CAPITAL LETTER AN..GEORGIAN MTAVRULI CAPITAL LETTER AIN +1CBD..1CBF ; Grapheme_Base # L& [3] GEORGIAN MTAVRULI CAPITAL LETTER AEN..GEORGIAN MTAVRULI CAPITAL LETTER LABIAL SIGN +1CC0..1CC7 ; Grapheme_Base # Po [8] SUNDANESE PUNCTUATION BINDU SURYA..SUNDANESE PUNCTUATION BINDU BA SATANGA +1CD3 ; Grapheme_Base # Po VEDIC SIGN NIHSHVASA +1CE1 ; Grapheme_Base # Mc VEDIC TONE ATHARVAVEDIC INDEPENDENT SVARITA +1CE9..1CEC ; Grapheme_Base # Lo [4] VEDIC SIGN ANUSVARA ANTARGOMUKHA..VEDIC SIGN ANUSVARA VAMAGOMUKHA WITH TAIL +1CEE..1CF1 ; Grapheme_Base # Lo [4] VEDIC SIGN HEXIFORM LONG ANUSVARA..VEDIC SIGN ANUSVARA UBHAYATO MUKHA +1CF2..1CF3 ; Grapheme_Base # Mc [2] VEDIC SIGN ARDHAVISARGA..VEDIC SIGN ROTATED ARDHAVISARGA +1CF5..1CF6 ; Grapheme_Base # Lo [2] VEDIC SIGN JIHVAMULIYA..VEDIC SIGN UPADHMANIYA +1CF7 ; Grapheme_Base # Mc VEDIC SIGN ATIKRAMA +1D00..1D2B ; Grapheme_Base # L& [44] LATIN LETTER SMALL CAPITAL A..CYRILLIC LETTER SMALL CAPITAL EL +1D2C..1D6A ; Grapheme_Base # Lm [63] MODIFIER LETTER CAPITAL A..GREEK SUBSCRIPT SMALL LETTER CHI +1D6B..1D77 ; Grapheme_Base # L& [13] LATIN SMALL LETTER UE..LATIN SMALL LETTER TURNED G +1D78 ; Grapheme_Base # Lm MODIFIER LETTER CYRILLIC EN +1D79..1D9A ; Grapheme_Base # L& [34] LATIN SMALL LETTER INSULAR G..LATIN SMALL LETTER EZH WITH RETROFLEX HOOK +1D9B..1DBF ; Grapheme_Base # Lm [37] MODIFIER LETTER SMALL TURNED ALPHA..MODIFIER LETTER SMALL THETA +1E00..1F15 ; Grapheme_Base # L& [278] LATIN CAPITAL LETTER A WITH RING BELOW..GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA +1F18..1F1D ; Grapheme_Base # L& [6] GREEK CAPITAL LETTER EPSILON WITH PSILI..GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA +1F20..1F45 ; Grapheme_Base # L& [38] GREEK SMALL LETTER ETA WITH PSILI..GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA +1F48..1F4D ; Grapheme_Base # L& [6] GREEK CAPITAL LETTER OMICRON WITH PSILI..GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA +1F50..1F57 ; Grapheme_Base # L& [8] GREEK SMALL LETTER UPSILON WITH PSILI..GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI +1F59 ; Grapheme_Base # L& GREEK CAPITAL LETTER UPSILON WITH DASIA +1F5B ; Grapheme_Base # L& GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA +1F5D ; Grapheme_Base # L& GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA +1F5F..1F7D ; Grapheme_Base # L& [31] GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI..GREEK SMALL LETTER OMEGA WITH OXIA +1F80..1FB4 ; Grapheme_Base # L& [53] GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI..GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI +1FB6..1FBC ; Grapheme_Base # L& [7] GREEK SMALL LETTER ALPHA WITH PERISPOMENI..GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI +1FBD ; Grapheme_Base # Sk GREEK KORONIS +1FBE ; Grapheme_Base # L& GREEK PROSGEGRAMMENI +1FBF..1FC1 ; Grapheme_Base # Sk [3] GREEK PSILI..GREEK DIALYTIKA AND PERISPOMENI +1FC2..1FC4 ; Grapheme_Base # L& [3] GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI +1FC6..1FCC ; Grapheme_Base # L& [7] GREEK SMALL LETTER ETA WITH PERISPOMENI..GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI +1FCD..1FCF ; Grapheme_Base # Sk [3] GREEK PSILI AND VARIA..GREEK PSILI AND PERISPOMENI +1FD0..1FD3 ; Grapheme_Base # L& [4] GREEK SMALL LETTER IOTA WITH VRACHY..GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA +1FD6..1FDB ; Grapheme_Base # L& [6] GREEK SMALL LETTER IOTA WITH PERISPOMENI..GREEK CAPITAL LETTER IOTA WITH OXIA +1FDD..1FDF ; Grapheme_Base # Sk [3] GREEK DASIA AND VARIA..GREEK DASIA AND PERISPOMENI +1FE0..1FEC ; Grapheme_Base # L& [13] GREEK SMALL LETTER UPSILON WITH VRACHY..GREEK CAPITAL LETTER RHO WITH DASIA +1FED..1FEF ; Grapheme_Base # Sk [3] GREEK DIALYTIKA AND VARIA..GREEK VARIA +1FF2..1FF4 ; Grapheme_Base # L& [3] GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI +1FF6..1FFC ; Grapheme_Base # L& [7] GREEK SMALL LETTER OMEGA WITH PERISPOMENI..GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI +1FFD..1FFE ; Grapheme_Base # Sk [2] GREEK OXIA..GREEK DASIA +2000..200A ; Grapheme_Base # Zs [11] EN QUAD..HAIR SPACE +2010..2015 ; Grapheme_Base # Pd [6] HYPHEN..HORIZONTAL BAR +2016..2017 ; Grapheme_Base # Po [2] DOUBLE VERTICAL LINE..DOUBLE LOW LINE +2018 ; Grapheme_Base # Pi LEFT SINGLE QUOTATION MARK +2019 ; Grapheme_Base # Pf RIGHT SINGLE QUOTATION MARK +201A ; Grapheme_Base # Ps SINGLE LOW-9 QUOTATION MARK +201B..201C ; Grapheme_Base # Pi [2] SINGLE HIGH-REVERSED-9 QUOTATION MARK..LEFT DOUBLE QUOTATION MARK +201D ; Grapheme_Base # Pf RIGHT DOUBLE QUOTATION MARK +201E ; Grapheme_Base # Ps DOUBLE LOW-9 QUOTATION MARK +201F ; Grapheme_Base # Pi DOUBLE HIGH-REVERSED-9 QUOTATION MARK +2020..2027 ; Grapheme_Base # Po [8] DAGGER..HYPHENATION POINT +202F ; Grapheme_Base # Zs NARROW NO-BREAK SPACE +2030..2038 ; Grapheme_Base # Po [9] PER MILLE SIGN..CARET +2039 ; Grapheme_Base # Pi SINGLE LEFT-POINTING ANGLE QUOTATION MARK +203A ; Grapheme_Base # Pf SINGLE RIGHT-POINTING ANGLE QUOTATION MARK +203B..203E ; Grapheme_Base # Po [4] REFERENCE MARK..OVERLINE +203F..2040 ; Grapheme_Base # Pc [2] UNDERTIE..CHARACTER TIE +2041..2043 ; Grapheme_Base # Po [3] CARET INSERTION POINT..HYPHEN BULLET +2044 ; Grapheme_Base # Sm FRACTION SLASH +2045 ; Grapheme_Base # Ps LEFT SQUARE BRACKET WITH QUILL +2046 ; Grapheme_Base # Pe RIGHT SQUARE BRACKET WITH QUILL +2047..2051 ; Grapheme_Base # Po [11] DOUBLE QUESTION MARK..TWO ASTERISKS ALIGNED VERTICALLY +2052 ; Grapheme_Base # Sm COMMERCIAL MINUS SIGN +2053 ; Grapheme_Base # Po SWUNG DASH +2054 ; Grapheme_Base # Pc INVERTED UNDERTIE +2055..205E ; Grapheme_Base # Po [10] FLOWER PUNCTUATION MARK..VERTICAL FOUR DOTS +205F ; Grapheme_Base # Zs MEDIUM MATHEMATICAL SPACE +2070 ; Grapheme_Base # No SUPERSCRIPT ZERO +2071 ; Grapheme_Base # Lm SUPERSCRIPT LATIN SMALL LETTER I +2074..2079 ; Grapheme_Base # No [6] SUPERSCRIPT FOUR..SUPERSCRIPT NINE +207A..207C ; Grapheme_Base # Sm [3] SUPERSCRIPT PLUS SIGN..SUPERSCRIPT EQUALS SIGN +207D ; Grapheme_Base # Ps SUPERSCRIPT LEFT PARENTHESIS +207E ; Grapheme_Base # Pe SUPERSCRIPT RIGHT PARENTHESIS +207F ; Grapheme_Base # Lm SUPERSCRIPT LATIN SMALL LETTER N +2080..2089 ; Grapheme_Base # No [10] SUBSCRIPT ZERO..SUBSCRIPT NINE +208A..208C ; Grapheme_Base # Sm [3] SUBSCRIPT PLUS SIGN..SUBSCRIPT EQUALS SIGN +208D ; Grapheme_Base # Ps SUBSCRIPT LEFT PARENTHESIS +208E ; Grapheme_Base # Pe SUBSCRIPT RIGHT PARENTHESIS +2090..209C ; Grapheme_Base # Lm [13] LATIN SUBSCRIPT SMALL LETTER A..LATIN SUBSCRIPT SMALL LETTER T +20A0..20BF ; Grapheme_Base # Sc [32] EURO-CURRENCY SIGN..BITCOIN SIGN +2100..2101 ; Grapheme_Base # So [2] ACCOUNT OF..ADDRESSED TO THE SUBJECT +2102 ; Grapheme_Base # L& DOUBLE-STRUCK CAPITAL C +2103..2106 ; Grapheme_Base # So [4] DEGREE CELSIUS..CADA UNA +2107 ; Grapheme_Base # L& EULER CONSTANT +2108..2109 ; Grapheme_Base # So [2] SCRUPLE..DEGREE FAHRENHEIT +210A..2113 ; Grapheme_Base # L& [10] SCRIPT SMALL G..SCRIPT SMALL L +2114 ; Grapheme_Base # So L B BAR SYMBOL +2115 ; Grapheme_Base # L& DOUBLE-STRUCK CAPITAL N +2116..2117 ; Grapheme_Base # So [2] NUMERO SIGN..SOUND RECORDING COPYRIGHT +2118 ; Grapheme_Base # Sm SCRIPT CAPITAL P +2119..211D ; Grapheme_Base # L& [5] DOUBLE-STRUCK CAPITAL P..DOUBLE-STRUCK CAPITAL R +211E..2123 ; Grapheme_Base # So [6] PRESCRIPTION TAKE..VERSICLE +2124 ; Grapheme_Base # L& DOUBLE-STRUCK CAPITAL Z +2125 ; Grapheme_Base # So OUNCE SIGN +2126 ; Grapheme_Base # L& OHM SIGN +2127 ; Grapheme_Base # So INVERTED OHM SIGN +2128 ; Grapheme_Base # L& BLACK-LETTER CAPITAL Z +2129 ; Grapheme_Base # So TURNED GREEK SMALL LETTER IOTA +212A..212D ; Grapheme_Base # L& [4] KELVIN SIGN..BLACK-LETTER CAPITAL C +212E ; Grapheme_Base # So ESTIMATED SYMBOL +212F..2134 ; Grapheme_Base # L& [6] SCRIPT SMALL E..SCRIPT SMALL O +2135..2138 ; Grapheme_Base # Lo [4] ALEF SYMBOL..DALET SYMBOL +2139 ; Grapheme_Base # L& INFORMATION SOURCE +213A..213B ; Grapheme_Base # So [2] ROTATED CAPITAL Q..FACSIMILE SIGN +213C..213F ; Grapheme_Base # L& [4] DOUBLE-STRUCK SMALL PI..DOUBLE-STRUCK CAPITAL PI +2140..2144 ; Grapheme_Base # Sm [5] DOUBLE-STRUCK N-ARY SUMMATION..TURNED SANS-SERIF CAPITAL Y +2145..2149 ; Grapheme_Base # L& [5] DOUBLE-STRUCK ITALIC CAPITAL D..DOUBLE-STRUCK ITALIC SMALL J +214A ; Grapheme_Base # So PROPERTY LINE +214B ; Grapheme_Base # Sm TURNED AMPERSAND +214C..214D ; Grapheme_Base # So [2] PER SIGN..AKTIESELSKAB +214E ; Grapheme_Base # L& TURNED SMALL F +214F ; Grapheme_Base # So SYMBOL FOR SAMARITAN SOURCE +2150..215F ; Grapheme_Base # No [16] VULGAR FRACTION ONE SEVENTH..FRACTION NUMERATOR ONE +2160..2182 ; Grapheme_Base # Nl [35] ROMAN NUMERAL ONE..ROMAN NUMERAL TEN THOUSAND +2183..2184 ; Grapheme_Base # L& [2] ROMAN NUMERAL REVERSED ONE HUNDRED..LATIN SMALL LETTER REVERSED C +2185..2188 ; Grapheme_Base # Nl [4] ROMAN NUMERAL SIX LATE FORM..ROMAN NUMERAL ONE HUNDRED THOUSAND +2189 ; Grapheme_Base # No VULGAR FRACTION ZERO THIRDS +218A..218B ; Grapheme_Base # So [2] TURNED DIGIT TWO..TURNED DIGIT THREE +2190..2194 ; Grapheme_Base # Sm [5] LEFTWARDS ARROW..LEFT RIGHT ARROW +2195..2199 ; Grapheme_Base # So [5] UP DOWN ARROW..SOUTH WEST ARROW +219A..219B ; Grapheme_Base # Sm [2] LEFTWARDS ARROW WITH STROKE..RIGHTWARDS ARROW WITH STROKE +219C..219F ; Grapheme_Base # So [4] LEFTWARDS WAVE ARROW..UPWARDS TWO HEADED ARROW +21A0 ; Grapheme_Base # Sm RIGHTWARDS TWO HEADED ARROW +21A1..21A2 ; Grapheme_Base # So [2] DOWNWARDS TWO HEADED ARROW..LEFTWARDS ARROW WITH TAIL +21A3 ; Grapheme_Base # Sm RIGHTWARDS ARROW WITH TAIL +21A4..21A5 ; Grapheme_Base # So [2] LEFTWARDS ARROW FROM BAR..UPWARDS ARROW FROM BAR +21A6 ; Grapheme_Base # Sm RIGHTWARDS ARROW FROM BAR +21A7..21AD ; Grapheme_Base # So [7] DOWNWARDS ARROW FROM BAR..LEFT RIGHT WAVE ARROW +21AE ; Grapheme_Base # Sm LEFT RIGHT ARROW WITH STROKE +21AF..21CD ; Grapheme_Base # So [31] DOWNWARDS ZIGZAG ARROW..LEFTWARDS DOUBLE ARROW WITH STROKE +21CE..21CF ; Grapheme_Base # Sm [2] LEFT RIGHT DOUBLE ARROW WITH STROKE..RIGHTWARDS DOUBLE ARROW WITH STROKE +21D0..21D1 ; Grapheme_Base # So [2] LEFTWARDS DOUBLE ARROW..UPWARDS DOUBLE ARROW +21D2 ; Grapheme_Base # Sm RIGHTWARDS DOUBLE ARROW +21D3 ; Grapheme_Base # So DOWNWARDS DOUBLE ARROW +21D4 ; Grapheme_Base # Sm LEFT RIGHT DOUBLE ARROW +21D5..21F3 ; Grapheme_Base # So [31] UP DOWN DOUBLE ARROW..UP DOWN WHITE ARROW +21F4..22FF ; Grapheme_Base # Sm [268] RIGHT ARROW WITH SMALL CIRCLE..Z NOTATION BAG MEMBERSHIP +2300..2307 ; Grapheme_Base # So [8] DIAMETER SIGN..WAVY LINE +2308 ; Grapheme_Base # Ps LEFT CEILING +2309 ; Grapheme_Base # Pe RIGHT CEILING +230A ; Grapheme_Base # Ps LEFT FLOOR +230B ; Grapheme_Base # Pe RIGHT FLOOR +230C..231F ; Grapheme_Base # So [20] BOTTOM RIGHT CROP..BOTTOM RIGHT CORNER +2320..2321 ; Grapheme_Base # Sm [2] TOP HALF INTEGRAL..BOTTOM HALF INTEGRAL +2322..2328 ; Grapheme_Base # So [7] FROWN..KEYBOARD +2329 ; Grapheme_Base # Ps LEFT-POINTING ANGLE BRACKET +232A ; Grapheme_Base # Pe RIGHT-POINTING ANGLE BRACKET +232B..237B ; Grapheme_Base # So [81] ERASE TO THE LEFT..NOT CHECK MARK +237C ; Grapheme_Base # Sm RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW +237D..239A ; Grapheme_Base # So [30] SHOULDERED OPEN BOX..CLEAR SCREEN SYMBOL +239B..23B3 ; Grapheme_Base # Sm [25] LEFT PARENTHESIS UPPER HOOK..SUMMATION BOTTOM +23B4..23DB ; Grapheme_Base # So [40] TOP SQUARE BRACKET..FUSE +23DC..23E1 ; Grapheme_Base # Sm [6] TOP PARENTHESIS..BOTTOM TORTOISE SHELL BRACKET +23E2..2426 ; Grapheme_Base # So [69] WHITE TRAPEZIUM..SYMBOL FOR SUBSTITUTE FORM TWO +2440..244A ; Grapheme_Base # So [11] OCR HOOK..OCR DOUBLE BACKSLASH +2460..249B ; Grapheme_Base # No [60] CIRCLED DIGIT ONE..NUMBER TWENTY FULL STOP +249C..24E9 ; Grapheme_Base # So [78] PARENTHESIZED LATIN SMALL LETTER A..CIRCLED LATIN SMALL LETTER Z +24EA..24FF ; Grapheme_Base # No [22] CIRCLED DIGIT ZERO..NEGATIVE CIRCLED DIGIT ZERO +2500..25B6 ; Grapheme_Base # So [183] BOX DRAWINGS LIGHT HORIZONTAL..BLACK RIGHT-POINTING TRIANGLE +25B7 ; Grapheme_Base # Sm WHITE RIGHT-POINTING TRIANGLE +25B8..25C0 ; Grapheme_Base # So [9] BLACK RIGHT-POINTING SMALL TRIANGLE..BLACK LEFT-POINTING TRIANGLE +25C1 ; Grapheme_Base # Sm WHITE LEFT-POINTING TRIANGLE +25C2..25F7 ; Grapheme_Base # So [54] BLACK LEFT-POINTING SMALL TRIANGLE..WHITE CIRCLE WITH UPPER RIGHT QUADRANT +25F8..25FF ; Grapheme_Base # Sm [8] UPPER LEFT TRIANGLE..LOWER RIGHT TRIANGLE +2600..266E ; Grapheme_Base # So [111] BLACK SUN WITH RAYS..MUSIC NATURAL SIGN +266F ; Grapheme_Base # Sm MUSIC SHARP SIGN +2670..2767 ; Grapheme_Base # So [248] WEST SYRIAC CROSS..ROTATED FLORAL HEART BULLET +2768 ; Grapheme_Base # Ps MEDIUM LEFT PARENTHESIS ORNAMENT +2769 ; Grapheme_Base # Pe MEDIUM RIGHT PARENTHESIS ORNAMENT +276A ; Grapheme_Base # Ps MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT +276B ; Grapheme_Base # Pe MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT +276C ; Grapheme_Base # Ps MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT +276D ; Grapheme_Base # Pe MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT +276E ; Grapheme_Base # Ps HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT +276F ; Grapheme_Base # Pe HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT +2770 ; Grapheme_Base # Ps HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT +2771 ; Grapheme_Base # Pe HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT +2772 ; Grapheme_Base # Ps LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT +2773 ; Grapheme_Base # Pe LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT +2774 ; Grapheme_Base # Ps MEDIUM LEFT CURLY BRACKET ORNAMENT +2775 ; Grapheme_Base # Pe MEDIUM RIGHT CURLY BRACKET ORNAMENT +2776..2793 ; Grapheme_Base # No [30] DINGBAT NEGATIVE CIRCLED DIGIT ONE..DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN +2794..27BF ; Grapheme_Base # So [44] HEAVY WIDE-HEADED RIGHTWARDS ARROW..DOUBLE CURLY LOOP +27C0..27C4 ; Grapheme_Base # Sm [5] THREE DIMENSIONAL ANGLE..OPEN SUPERSET +27C5 ; Grapheme_Base # Ps LEFT S-SHAPED BAG DELIMITER +27C6 ; Grapheme_Base # Pe RIGHT S-SHAPED BAG DELIMITER +27C7..27E5 ; Grapheme_Base # Sm [31] OR WITH DOT INSIDE..WHITE SQUARE WITH RIGHTWARDS TICK +27E6 ; Grapheme_Base # Ps MATHEMATICAL LEFT WHITE SQUARE BRACKET +27E7 ; Grapheme_Base # Pe MATHEMATICAL RIGHT WHITE SQUARE BRACKET +27E8 ; Grapheme_Base # Ps MATHEMATICAL LEFT ANGLE BRACKET +27E9 ; Grapheme_Base # Pe MATHEMATICAL RIGHT ANGLE BRACKET +27EA ; Grapheme_Base # Ps MATHEMATICAL LEFT DOUBLE ANGLE BRACKET +27EB ; Grapheme_Base # Pe MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET +27EC ; Grapheme_Base # Ps MATHEMATICAL LEFT WHITE TORTOISE SHELL BRACKET +27ED ; Grapheme_Base # Pe MATHEMATICAL RIGHT WHITE TORTOISE SHELL BRACKET +27EE ; Grapheme_Base # Ps MATHEMATICAL LEFT FLATTENED PARENTHESIS +27EF ; Grapheme_Base # Pe MATHEMATICAL RIGHT FLATTENED PARENTHESIS +27F0..27FF ; Grapheme_Base # Sm [16] UPWARDS QUADRUPLE ARROW..LONG RIGHTWARDS SQUIGGLE ARROW +2800..28FF ; Grapheme_Base # So [256] BRAILLE PATTERN BLANK..BRAILLE PATTERN DOTS-12345678 +2900..2982 ; Grapheme_Base # Sm [131] RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE..Z NOTATION TYPE COLON +2983 ; Grapheme_Base # Ps LEFT WHITE CURLY BRACKET +2984 ; Grapheme_Base # Pe RIGHT WHITE CURLY BRACKET +2985 ; Grapheme_Base # Ps LEFT WHITE PARENTHESIS +2986 ; Grapheme_Base # Pe RIGHT WHITE PARENTHESIS +2987 ; Grapheme_Base # Ps Z NOTATION LEFT IMAGE BRACKET +2988 ; Grapheme_Base # Pe Z NOTATION RIGHT IMAGE BRACKET +2989 ; Grapheme_Base # Ps Z NOTATION LEFT BINDING BRACKET +298A ; Grapheme_Base # Pe Z NOTATION RIGHT BINDING BRACKET +298B ; Grapheme_Base # Ps LEFT SQUARE BRACKET WITH UNDERBAR +298C ; Grapheme_Base # Pe RIGHT SQUARE BRACKET WITH UNDERBAR +298D ; Grapheme_Base # Ps LEFT SQUARE BRACKET WITH TICK IN TOP CORNER +298E ; Grapheme_Base # Pe RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER +298F ; Grapheme_Base # Ps LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER +2990 ; Grapheme_Base # Pe RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER +2991 ; Grapheme_Base # Ps LEFT ANGLE BRACKET WITH DOT +2992 ; Grapheme_Base # Pe RIGHT ANGLE BRACKET WITH DOT +2993 ; Grapheme_Base # Ps LEFT ARC LESS-THAN BRACKET +2994 ; Grapheme_Base # Pe RIGHT ARC GREATER-THAN BRACKET +2995 ; Grapheme_Base # Ps DOUBLE LEFT ARC GREATER-THAN BRACKET +2996 ; Grapheme_Base # Pe DOUBLE RIGHT ARC LESS-THAN BRACKET +2997 ; Grapheme_Base # Ps LEFT BLACK TORTOISE SHELL BRACKET +2998 ; Grapheme_Base # Pe RIGHT BLACK TORTOISE SHELL BRACKET +2999..29D7 ; Grapheme_Base # Sm [63] DOTTED FENCE..BLACK HOURGLASS +29D8 ; Grapheme_Base # Ps LEFT WIGGLY FENCE +29D9 ; Grapheme_Base # Pe RIGHT WIGGLY FENCE +29DA ; Grapheme_Base # Ps LEFT DOUBLE WIGGLY FENCE +29DB ; Grapheme_Base # Pe RIGHT DOUBLE WIGGLY FENCE +29DC..29FB ; Grapheme_Base # Sm [32] INCOMPLETE INFINITY..TRIPLE PLUS +29FC ; Grapheme_Base # Ps LEFT-POINTING CURVED ANGLE BRACKET +29FD ; Grapheme_Base # Pe RIGHT-POINTING CURVED ANGLE BRACKET +29FE..2AFF ; Grapheme_Base # Sm [258] TINY..N-ARY WHITE VERTICAL BAR +2B00..2B2F ; Grapheme_Base # So [48] NORTH EAST WHITE ARROW..WHITE VERTICAL ELLIPSE +2B30..2B44 ; Grapheme_Base # Sm [21] LEFT ARROW WITH SMALL CIRCLE..RIGHTWARDS ARROW THROUGH SUPERSET +2B45..2B46 ; Grapheme_Base # So [2] LEFTWARDS QUADRUPLE ARROW..RIGHTWARDS QUADRUPLE ARROW +2B47..2B4C ; Grapheme_Base # Sm [6] REVERSE TILDE OPERATOR ABOVE RIGHTWARDS ARROW..RIGHTWARDS ARROW ABOVE REVERSE TILDE OPERATOR +2B4D..2B73 ; Grapheme_Base # So [39] DOWNWARDS TRIANGLE-HEADED ZIGZAG ARROW..DOWNWARDS TRIANGLE-HEADED ARROW TO BAR +2B76..2B95 ; Grapheme_Base # So [32] NORTH WEST TRIANGLE-HEADED ARROW TO BAR..RIGHTWARDS BLACK ARROW +2B98..2BC8 ; Grapheme_Base # So [49] THREE-D TOP-LIGHTED LEFTWARDS EQUILATERAL ARROWHEAD..BLACK MEDIUM RIGHT-POINTING TRIANGLE CENTRED +2BCA..2BFE ; Grapheme_Base # So [53] TOP HALF BLACK CIRCLE..REVERSED RIGHT ANGLE +2C00..2C2E ; Grapheme_Base # L& [47] GLAGOLITIC CAPITAL LETTER AZU..GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE +2C30..2C5E ; Grapheme_Base # L& [47] GLAGOLITIC SMALL LETTER AZU..GLAGOLITIC SMALL LETTER LATINATE MYSLITE +2C60..2C7B ; Grapheme_Base # L& [28] LATIN CAPITAL LETTER L WITH DOUBLE BAR..LATIN LETTER SMALL CAPITAL TURNED E +2C7C..2C7D ; Grapheme_Base # Lm [2] LATIN SUBSCRIPT SMALL LETTER J..MODIFIER LETTER CAPITAL V +2C7E..2CE4 ; Grapheme_Base # L& [103] LATIN CAPITAL LETTER S WITH SWASH TAIL..COPTIC SYMBOL KAI +2CE5..2CEA ; Grapheme_Base # So [6] COPTIC SYMBOL MI RO..COPTIC SYMBOL SHIMA SIMA +2CEB..2CEE ; Grapheme_Base # L& [4] COPTIC CAPITAL LETTER CRYPTOGRAMMIC SHEI..COPTIC SMALL LETTER CRYPTOGRAMMIC GANGIA +2CF2..2CF3 ; Grapheme_Base # L& [2] COPTIC CAPITAL LETTER BOHAIRIC KHEI..COPTIC SMALL LETTER BOHAIRIC KHEI +2CF9..2CFC ; Grapheme_Base # Po [4] COPTIC OLD NUBIAN FULL STOP..COPTIC OLD NUBIAN VERSE DIVIDER +2CFD ; Grapheme_Base # No COPTIC FRACTION ONE HALF +2CFE..2CFF ; Grapheme_Base # Po [2] COPTIC FULL STOP..COPTIC MORPHOLOGICAL DIVIDER +2D00..2D25 ; Grapheme_Base # L& [38] GEORGIAN SMALL LETTER AN..GEORGIAN SMALL LETTER HOE +2D27 ; Grapheme_Base # L& GEORGIAN SMALL LETTER YN +2D2D ; Grapheme_Base # L& GEORGIAN SMALL LETTER AEN +2D30..2D67 ; Grapheme_Base # Lo [56] TIFINAGH LETTER YA..TIFINAGH LETTER YO +2D6F ; Grapheme_Base # Lm TIFINAGH MODIFIER LETTER LABIALIZATION MARK +2D70 ; Grapheme_Base # Po TIFINAGH SEPARATOR MARK +2D80..2D96 ; Grapheme_Base # Lo [23] ETHIOPIC SYLLABLE LOA..ETHIOPIC SYLLABLE GGWE +2DA0..2DA6 ; Grapheme_Base # Lo [7] ETHIOPIC SYLLABLE SSA..ETHIOPIC SYLLABLE SSO +2DA8..2DAE ; Grapheme_Base # Lo [7] ETHIOPIC SYLLABLE CCA..ETHIOPIC SYLLABLE CCO +2DB0..2DB6 ; Grapheme_Base # Lo [7] ETHIOPIC SYLLABLE ZZA..ETHIOPIC SYLLABLE ZZO +2DB8..2DBE ; Grapheme_Base # Lo [7] ETHIOPIC SYLLABLE CCHA..ETHIOPIC SYLLABLE CCHO +2DC0..2DC6 ; Grapheme_Base # Lo [7] ETHIOPIC SYLLABLE QYA..ETHIOPIC SYLLABLE QYO +2DC8..2DCE ; Grapheme_Base # Lo [7] ETHIOPIC SYLLABLE KYA..ETHIOPIC SYLLABLE KYO +2DD0..2DD6 ; Grapheme_Base # Lo [7] ETHIOPIC SYLLABLE XYA..ETHIOPIC SYLLABLE XYO +2DD8..2DDE ; Grapheme_Base # Lo [7] ETHIOPIC SYLLABLE GYA..ETHIOPIC SYLLABLE GYO +2E00..2E01 ; Grapheme_Base # Po [2] RIGHT ANGLE SUBSTITUTION MARKER..RIGHT ANGLE DOTTED SUBSTITUTION MARKER +2E02 ; Grapheme_Base # Pi LEFT SUBSTITUTION BRACKET +2E03 ; Grapheme_Base # Pf RIGHT SUBSTITUTION BRACKET +2E04 ; Grapheme_Base # Pi LEFT DOTTED SUBSTITUTION BRACKET +2E05 ; Grapheme_Base # Pf RIGHT DOTTED SUBSTITUTION BRACKET +2E06..2E08 ; Grapheme_Base # Po [3] RAISED INTERPOLATION MARKER..DOTTED TRANSPOSITION MARKER +2E09 ; Grapheme_Base # Pi LEFT TRANSPOSITION BRACKET +2E0A ; Grapheme_Base # Pf RIGHT TRANSPOSITION BRACKET +2E0B ; Grapheme_Base # Po RAISED SQUARE +2E0C ; Grapheme_Base # Pi LEFT RAISED OMISSION BRACKET +2E0D ; Grapheme_Base # Pf RIGHT RAISED OMISSION BRACKET +2E0E..2E16 ; Grapheme_Base # Po [9] EDITORIAL CORONIS..DOTTED RIGHT-POINTING ANGLE +2E17 ; Grapheme_Base # Pd DOUBLE OBLIQUE HYPHEN +2E18..2E19 ; Grapheme_Base # Po [2] INVERTED INTERROBANG..PALM BRANCH +2E1A ; Grapheme_Base # Pd HYPHEN WITH DIAERESIS +2E1B ; Grapheme_Base # Po TILDE WITH RING ABOVE +2E1C ; Grapheme_Base # Pi LEFT LOW PARAPHRASE BRACKET +2E1D ; Grapheme_Base # Pf RIGHT LOW PARAPHRASE BRACKET +2E1E..2E1F ; Grapheme_Base # Po [2] TILDE WITH DOT ABOVE..TILDE WITH DOT BELOW +2E20 ; Grapheme_Base # Pi LEFT VERTICAL BAR WITH QUILL +2E21 ; Grapheme_Base # Pf RIGHT VERTICAL BAR WITH QUILL +2E22 ; Grapheme_Base # Ps TOP LEFT HALF BRACKET +2E23 ; Grapheme_Base # Pe TOP RIGHT HALF BRACKET +2E24 ; Grapheme_Base # Ps BOTTOM LEFT HALF BRACKET +2E25 ; Grapheme_Base # Pe BOTTOM RIGHT HALF BRACKET +2E26 ; Grapheme_Base # Ps LEFT SIDEWAYS U BRACKET +2E27 ; Grapheme_Base # Pe RIGHT SIDEWAYS U BRACKET +2E28 ; Grapheme_Base # Ps LEFT DOUBLE PARENTHESIS +2E29 ; Grapheme_Base # Pe RIGHT DOUBLE PARENTHESIS +2E2A..2E2E ; Grapheme_Base # Po [5] TWO DOTS OVER ONE DOT PUNCTUATION..REVERSED QUESTION MARK +2E2F ; Grapheme_Base # Lm VERTICAL TILDE +2E30..2E39 ; Grapheme_Base # Po [10] RING POINT..TOP HALF SECTION SIGN +2E3A..2E3B ; Grapheme_Base # Pd [2] TWO-EM DASH..THREE-EM DASH +2E3C..2E3F ; Grapheme_Base # Po [4] STENOGRAPHIC FULL STOP..CAPITULUM +2E40 ; Grapheme_Base # Pd DOUBLE HYPHEN +2E41 ; Grapheme_Base # Po REVERSED COMMA +2E42 ; Grapheme_Base # Ps DOUBLE LOW-REVERSED-9 QUOTATION MARK +2E43..2E4E ; Grapheme_Base # Po [12] DASH WITH LEFT UPTURN..PUNCTUS ELEVATUS MARK +2E80..2E99 ; Grapheme_Base # So [26] CJK RADICAL REPEAT..CJK RADICAL RAP +2E9B..2EF3 ; Grapheme_Base # So [89] CJK RADICAL CHOKE..CJK RADICAL C-SIMPLIFIED TURTLE +2F00..2FD5 ; Grapheme_Base # So [214] KANGXI RADICAL ONE..KANGXI RADICAL FLUTE +2FF0..2FFB ; Grapheme_Base # So [12] IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT..IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID +3000 ; Grapheme_Base # Zs IDEOGRAPHIC SPACE +3001..3003 ; Grapheme_Base # Po [3] IDEOGRAPHIC COMMA..DITTO MARK +3004 ; Grapheme_Base # So JAPANESE INDUSTRIAL STANDARD SYMBOL +3005 ; Grapheme_Base # Lm IDEOGRAPHIC ITERATION MARK +3006 ; Grapheme_Base # Lo IDEOGRAPHIC CLOSING MARK +3007 ; Grapheme_Base # Nl IDEOGRAPHIC NUMBER ZERO +3008 ; Grapheme_Base # Ps LEFT ANGLE BRACKET +3009 ; Grapheme_Base # Pe RIGHT ANGLE BRACKET +300A ; Grapheme_Base # Ps LEFT DOUBLE ANGLE BRACKET +300B ; Grapheme_Base # Pe RIGHT DOUBLE ANGLE BRACKET +300C ; Grapheme_Base # Ps LEFT CORNER BRACKET +300D ; Grapheme_Base # Pe RIGHT CORNER BRACKET +300E ; Grapheme_Base # Ps LEFT WHITE CORNER BRACKET +300F ; Grapheme_Base # Pe RIGHT WHITE CORNER BRACKET +3010 ; Grapheme_Base # Ps LEFT BLACK LENTICULAR BRACKET +3011 ; Grapheme_Base # Pe RIGHT BLACK LENTICULAR BRACKET +3012..3013 ; Grapheme_Base # So [2] POSTAL MARK..GETA MARK +3014 ; Grapheme_Base # Ps LEFT TORTOISE SHELL BRACKET +3015 ; Grapheme_Base # Pe RIGHT TORTOISE SHELL BRACKET +3016 ; Grapheme_Base # Ps LEFT WHITE LENTICULAR BRACKET +3017 ; Grapheme_Base # Pe RIGHT WHITE LENTICULAR BRACKET +3018 ; Grapheme_Base # Ps LEFT WHITE TORTOISE SHELL BRACKET +3019 ; Grapheme_Base # Pe RIGHT WHITE TORTOISE SHELL BRACKET +301A ; Grapheme_Base # Ps LEFT WHITE SQUARE BRACKET +301B ; Grapheme_Base # Pe RIGHT WHITE SQUARE BRACKET +301C ; Grapheme_Base # Pd WAVE DASH +301D ; Grapheme_Base # Ps REVERSED DOUBLE PRIME QUOTATION MARK +301E..301F ; Grapheme_Base # Pe [2] DOUBLE PRIME QUOTATION MARK..LOW DOUBLE PRIME QUOTATION MARK +3020 ; Grapheme_Base # So POSTAL MARK FACE +3021..3029 ; Grapheme_Base # Nl [9] HANGZHOU NUMERAL ONE..HANGZHOU NUMERAL NINE +3030 ; Grapheme_Base # Pd WAVY DASH +3031..3035 ; Grapheme_Base # Lm [5] VERTICAL KANA REPEAT MARK..VERTICAL KANA REPEAT MARK LOWER HALF +3036..3037 ; Grapheme_Base # So [2] CIRCLED POSTAL MARK..IDEOGRAPHIC TELEGRAPH LINE FEED SEPARATOR SYMBOL +3038..303A ; Grapheme_Base # Nl [3] HANGZHOU NUMERAL TEN..HANGZHOU NUMERAL THIRTY +303B ; Grapheme_Base # Lm VERTICAL IDEOGRAPHIC ITERATION MARK +303C ; Grapheme_Base # Lo MASU MARK +303D ; Grapheme_Base # Po PART ALTERNATION MARK +303E..303F ; Grapheme_Base # So [2] IDEOGRAPHIC VARIATION INDICATOR..IDEOGRAPHIC HALF FILL SPACE +3041..3096 ; Grapheme_Base # Lo [86] HIRAGANA LETTER SMALL A..HIRAGANA LETTER SMALL KE +309B..309C ; Grapheme_Base # Sk [2] KATAKANA-HIRAGANA VOICED SOUND MARK..KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK +309D..309E ; Grapheme_Base # Lm [2] HIRAGANA ITERATION MARK..HIRAGANA VOICED ITERATION MARK +309F ; Grapheme_Base # Lo HIRAGANA DIGRAPH YORI +30A0 ; Grapheme_Base # Pd KATAKANA-HIRAGANA DOUBLE HYPHEN +30A1..30FA ; Grapheme_Base # Lo [90] KATAKANA LETTER SMALL A..KATAKANA LETTER VO +30FB ; Grapheme_Base # Po KATAKANA MIDDLE DOT +30FC..30FE ; Grapheme_Base # Lm [3] KATAKANA-HIRAGANA PROLONGED SOUND MARK..KATAKANA VOICED ITERATION MARK +30FF ; Grapheme_Base # Lo KATAKANA DIGRAPH KOTO +3105..312F ; Grapheme_Base # Lo [43] BOPOMOFO LETTER B..BOPOMOFO LETTER NN +3131..318E ; Grapheme_Base # Lo [94] HANGUL LETTER KIYEOK..HANGUL LETTER ARAEAE +3190..3191 ; Grapheme_Base # So [2] IDEOGRAPHIC ANNOTATION LINKING MARK..IDEOGRAPHIC ANNOTATION REVERSE MARK +3192..3195 ; Grapheme_Base # No [4] IDEOGRAPHIC ANNOTATION ONE MARK..IDEOGRAPHIC ANNOTATION FOUR MARK +3196..319F ; Grapheme_Base # So [10] IDEOGRAPHIC ANNOTATION TOP MARK..IDEOGRAPHIC ANNOTATION MAN MARK +31A0..31BA ; Grapheme_Base # Lo [27] BOPOMOFO LETTER BU..BOPOMOFO LETTER ZY +31C0..31E3 ; Grapheme_Base # So [36] CJK STROKE T..CJK STROKE Q +31F0..31FF ; Grapheme_Base # Lo [16] KATAKANA LETTER SMALL KU..KATAKANA LETTER SMALL RO +3200..321E ; Grapheme_Base # So [31] PARENTHESIZED HANGUL KIYEOK..PARENTHESIZED KOREAN CHARACTER O HU +3220..3229 ; Grapheme_Base # No [10] PARENTHESIZED IDEOGRAPH ONE..PARENTHESIZED IDEOGRAPH TEN +322A..3247 ; Grapheme_Base # So [30] PARENTHESIZED IDEOGRAPH MOON..CIRCLED IDEOGRAPH KOTO +3248..324F ; Grapheme_Base # No [8] CIRCLED NUMBER TEN ON BLACK SQUARE..CIRCLED NUMBER EIGHTY ON BLACK SQUARE +3250 ; Grapheme_Base # So PARTNERSHIP SIGN +3251..325F ; Grapheme_Base # No [15] CIRCLED NUMBER TWENTY ONE..CIRCLED NUMBER THIRTY FIVE +3260..327F ; Grapheme_Base # So [32] CIRCLED HANGUL KIYEOK..KOREAN STANDARD SYMBOL +3280..3289 ; Grapheme_Base # No [10] CIRCLED IDEOGRAPH ONE..CIRCLED IDEOGRAPH TEN +328A..32B0 ; Grapheme_Base # So [39] CIRCLED IDEOGRAPH MOON..CIRCLED IDEOGRAPH NIGHT +32B1..32BF ; Grapheme_Base # No [15] CIRCLED NUMBER THIRTY SIX..CIRCLED NUMBER FIFTY +32C0..32FE ; Grapheme_Base # So [63] IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY..CIRCLED KATAKANA WO +3300..33FF ; Grapheme_Base # So [256] SQUARE APAATO..SQUARE GAL +3400..4DB5 ; Grapheme_Base # Lo [6582] CJK UNIFIED IDEOGRAPH-3400..CJK UNIFIED IDEOGRAPH-4DB5 +4DC0..4DFF ; Grapheme_Base # So [64] HEXAGRAM FOR THE CREATIVE HEAVEN..HEXAGRAM FOR BEFORE COMPLETION +4E00..9FEF ; Grapheme_Base # Lo [20976] CJK UNIFIED IDEOGRAPH-4E00..CJK UNIFIED IDEOGRAPH-9FEF +A000..A014 ; Grapheme_Base # Lo [21] YI SYLLABLE IT..YI SYLLABLE E +A015 ; Grapheme_Base # Lm YI SYLLABLE WU +A016..A48C ; Grapheme_Base # Lo [1143] YI SYLLABLE BIT..YI SYLLABLE YYR +A490..A4C6 ; Grapheme_Base # So [55] YI RADICAL QOT..YI RADICAL KE +A4D0..A4F7 ; Grapheme_Base # Lo [40] LISU LETTER BA..LISU LETTER OE +A4F8..A4FD ; Grapheme_Base # Lm [6] LISU LETTER TONE MYA TI..LISU LETTER TONE MYA JEU +A4FE..A4FF ; Grapheme_Base # Po [2] LISU PUNCTUATION COMMA..LISU PUNCTUATION FULL STOP +A500..A60B ; Grapheme_Base # Lo [268] VAI SYLLABLE EE..VAI SYLLABLE NG +A60C ; Grapheme_Base # Lm VAI SYLLABLE LENGTHENER +A60D..A60F ; Grapheme_Base # Po [3] VAI COMMA..VAI QUESTION MARK +A610..A61F ; Grapheme_Base # Lo [16] VAI SYLLABLE NDOLE FA..VAI SYMBOL JONG +A620..A629 ; Grapheme_Base # Nd [10] VAI DIGIT ZERO..VAI DIGIT NINE +A62A..A62B ; Grapheme_Base # Lo [2] VAI SYLLABLE NDOLE MA..VAI SYLLABLE NDOLE DO +A640..A66D ; Grapheme_Base # L& [46] CYRILLIC CAPITAL LETTER ZEMLYA..CYRILLIC SMALL LETTER DOUBLE MONOCULAR O +A66E ; Grapheme_Base # Lo CYRILLIC LETTER MULTIOCULAR O +A673 ; Grapheme_Base # Po SLAVONIC ASTERISK +A67E ; Grapheme_Base # Po CYRILLIC KAVYKA +A67F ; Grapheme_Base # Lm CYRILLIC PAYEROK +A680..A69B ; Grapheme_Base # L& [28] CYRILLIC CAPITAL LETTER DWE..CYRILLIC SMALL LETTER CROSSED O +A69C..A69D ; Grapheme_Base # Lm [2] MODIFIER LETTER CYRILLIC HARD SIGN..MODIFIER LETTER CYRILLIC SOFT SIGN +A6A0..A6E5 ; Grapheme_Base # Lo [70] BAMUM LETTER A..BAMUM LETTER KI +A6E6..A6EF ; Grapheme_Base # Nl [10] BAMUM LETTER MO..BAMUM LETTER KOGHOM +A6F2..A6F7 ; Grapheme_Base # Po [6] BAMUM NJAEMLI..BAMUM QUESTION MARK +A700..A716 ; Grapheme_Base # Sk [23] MODIFIER LETTER CHINESE TONE YIN PING..MODIFIER LETTER EXTRA-LOW LEFT-STEM TONE BAR +A717..A71F ; Grapheme_Base # Lm [9] MODIFIER LETTER DOT VERTICAL BAR..MODIFIER LETTER LOW INVERTED EXCLAMATION MARK +A720..A721 ; Grapheme_Base # Sk [2] MODIFIER LETTER STRESS AND HIGH TONE..MODIFIER LETTER STRESS AND LOW TONE +A722..A76F ; Grapheme_Base # L& [78] LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF..LATIN SMALL LETTER CON +A770 ; Grapheme_Base # Lm MODIFIER LETTER US +A771..A787 ; Grapheme_Base # L& [23] LATIN SMALL LETTER DUM..LATIN SMALL LETTER INSULAR T +A788 ; Grapheme_Base # Lm MODIFIER LETTER LOW CIRCUMFLEX ACCENT +A789..A78A ; Grapheme_Base # Sk [2] MODIFIER LETTER COLON..MODIFIER LETTER SHORT EQUALS SIGN +A78B..A78E ; Grapheme_Base # L& [4] LATIN CAPITAL LETTER SALTILLO..LATIN SMALL LETTER L WITH RETROFLEX HOOK AND BELT +A78F ; Grapheme_Base # Lo LATIN LETTER SINOLOGICAL DOT +A790..A7B9 ; Grapheme_Base # L& [42] LATIN CAPITAL LETTER N WITH DESCENDER..LATIN SMALL LETTER U WITH STROKE +A7F7 ; Grapheme_Base # Lo LATIN EPIGRAPHIC LETTER SIDEWAYS I +A7F8..A7F9 ; Grapheme_Base # Lm [2] MODIFIER LETTER CAPITAL H WITH STROKE..MODIFIER LETTER SMALL LIGATURE OE +A7FA ; Grapheme_Base # L& LATIN LETTER SMALL CAPITAL TURNED M +A7FB..A801 ; Grapheme_Base # Lo [7] LATIN EPIGRAPHIC LETTER REVERSED F..SYLOTI NAGRI LETTER I +A803..A805 ; Grapheme_Base # Lo [3] SYLOTI NAGRI LETTER U..SYLOTI NAGRI LETTER O +A807..A80A ; Grapheme_Base # Lo [4] SYLOTI NAGRI LETTER KO..SYLOTI NAGRI LETTER GHO +A80C..A822 ; Grapheme_Base # Lo [23] SYLOTI NAGRI LETTER CO..SYLOTI NAGRI LETTER HO +A823..A824 ; Grapheme_Base # Mc [2] SYLOTI NAGRI VOWEL SIGN A..SYLOTI NAGRI VOWEL SIGN I +A827 ; Grapheme_Base # Mc SYLOTI NAGRI VOWEL SIGN OO +A828..A82B ; Grapheme_Base # So [4] SYLOTI NAGRI POETRY MARK-1..SYLOTI NAGRI POETRY MARK-4 +A830..A835 ; Grapheme_Base # No [6] NORTH INDIC FRACTION ONE QUARTER..NORTH INDIC FRACTION THREE SIXTEENTHS +A836..A837 ; Grapheme_Base # So [2] NORTH INDIC QUARTER MARK..NORTH INDIC PLACEHOLDER MARK +A838 ; Grapheme_Base # Sc NORTH INDIC RUPEE MARK +A839 ; Grapheme_Base # So NORTH INDIC QUANTITY MARK +A840..A873 ; Grapheme_Base # Lo [52] PHAGS-PA LETTER KA..PHAGS-PA LETTER CANDRABINDU +A874..A877 ; Grapheme_Base # Po [4] PHAGS-PA SINGLE HEAD MARK..PHAGS-PA MARK DOUBLE SHAD +A880..A881 ; Grapheme_Base # Mc [2] SAURASHTRA SIGN ANUSVARA..SAURASHTRA SIGN VISARGA +A882..A8B3 ; Grapheme_Base # Lo [50] SAURASHTRA LETTER A..SAURASHTRA LETTER LLA +A8B4..A8C3 ; Grapheme_Base # Mc [16] SAURASHTRA CONSONANT SIGN HAARU..SAURASHTRA VOWEL SIGN AU +A8CE..A8CF ; Grapheme_Base # Po [2] SAURASHTRA DANDA..SAURASHTRA DOUBLE DANDA +A8D0..A8D9 ; Grapheme_Base # Nd [10] SAURASHTRA DIGIT ZERO..SAURASHTRA DIGIT NINE +A8F2..A8F7 ; Grapheme_Base # Lo [6] DEVANAGARI SIGN SPACING CANDRABINDU..DEVANAGARI SIGN CANDRABINDU AVAGRAHA +A8F8..A8FA ; Grapheme_Base # Po [3] DEVANAGARI SIGN PUSHPIKA..DEVANAGARI CARET +A8FB ; Grapheme_Base # Lo DEVANAGARI HEADSTROKE +A8FC ; Grapheme_Base # Po DEVANAGARI SIGN SIDDHAM +A8FD..A8FE ; Grapheme_Base # Lo [2] DEVANAGARI JAIN OM..DEVANAGARI LETTER AY +A900..A909 ; Grapheme_Base # Nd [10] KAYAH LI DIGIT ZERO..KAYAH LI DIGIT NINE +A90A..A925 ; Grapheme_Base # Lo [28] KAYAH LI LETTER KA..KAYAH LI LETTER OO +A92E..A92F ; Grapheme_Base # Po [2] KAYAH LI SIGN CWI..KAYAH LI SIGN SHYA +A930..A946 ; Grapheme_Base # Lo [23] REJANG LETTER KA..REJANG LETTER A +A952..A953 ; Grapheme_Base # Mc [2] REJANG CONSONANT SIGN H..REJANG VIRAMA +A95F ; Grapheme_Base # Po REJANG SECTION MARK +A960..A97C ; Grapheme_Base # Lo [29] HANGUL CHOSEONG TIKEUT-MIEUM..HANGUL CHOSEONG SSANGYEORINHIEUH +A983 ; Grapheme_Base # Mc JAVANESE SIGN WIGNYAN +A984..A9B2 ; Grapheme_Base # Lo [47] JAVANESE LETTER A..JAVANESE LETTER HA +A9B4..A9B5 ; Grapheme_Base # Mc [2] JAVANESE VOWEL SIGN TARUNG..JAVANESE VOWEL SIGN TOLONG +A9BA..A9BB ; Grapheme_Base # Mc [2] JAVANESE VOWEL SIGN TALING..JAVANESE VOWEL SIGN DIRGA MURE +A9BD..A9C0 ; Grapheme_Base # Mc [4] JAVANESE CONSONANT SIGN KERET..JAVANESE PANGKON +A9C1..A9CD ; Grapheme_Base # Po [13] JAVANESE LEFT RERENGGAN..JAVANESE TURNED PADA PISELEH +A9CF ; Grapheme_Base # Lm JAVANESE PANGRANGKEP +A9D0..A9D9 ; Grapheme_Base # Nd [10] JAVANESE DIGIT ZERO..JAVANESE DIGIT NINE +A9DE..A9DF ; Grapheme_Base # Po [2] JAVANESE PADA TIRTA TUMETES..JAVANESE PADA ISEN-ISEN +A9E0..A9E4 ; Grapheme_Base # Lo [5] MYANMAR LETTER SHAN GHA..MYANMAR LETTER SHAN BHA +A9E6 ; Grapheme_Base # Lm MYANMAR MODIFIER LETTER SHAN REDUPLICATION +A9E7..A9EF ; Grapheme_Base # Lo [9] MYANMAR LETTER TAI LAING NYA..MYANMAR LETTER TAI LAING NNA +A9F0..A9F9 ; Grapheme_Base # Nd [10] MYANMAR TAI LAING DIGIT ZERO..MYANMAR TAI LAING DIGIT NINE +A9FA..A9FE ; Grapheme_Base # Lo [5] MYANMAR LETTER TAI LAING LLA..MYANMAR LETTER TAI LAING BHA +AA00..AA28 ; Grapheme_Base # Lo [41] CHAM LETTER A..CHAM LETTER HA +AA2F..AA30 ; Grapheme_Base # Mc [2] CHAM VOWEL SIGN O..CHAM VOWEL SIGN AI +AA33..AA34 ; Grapheme_Base # Mc [2] CHAM CONSONANT SIGN YA..CHAM CONSONANT SIGN RA +AA40..AA42 ; Grapheme_Base # Lo [3] CHAM LETTER FINAL K..CHAM LETTER FINAL NG +AA44..AA4B ; Grapheme_Base # Lo [8] CHAM LETTER FINAL CH..CHAM LETTER FINAL SS +AA4D ; Grapheme_Base # Mc CHAM CONSONANT SIGN FINAL H +AA50..AA59 ; Grapheme_Base # Nd [10] CHAM DIGIT ZERO..CHAM DIGIT NINE +AA5C..AA5F ; Grapheme_Base # Po [4] CHAM PUNCTUATION SPIRAL..CHAM PUNCTUATION TRIPLE DANDA +AA60..AA6F ; Grapheme_Base # Lo [16] MYANMAR LETTER KHAMTI GA..MYANMAR LETTER KHAMTI FA +AA70 ; Grapheme_Base # Lm MYANMAR MODIFIER LETTER KHAMTI REDUPLICATION +AA71..AA76 ; Grapheme_Base # Lo [6] MYANMAR LETTER KHAMTI XA..MYANMAR LOGOGRAM KHAMTI HM +AA77..AA79 ; Grapheme_Base # So [3] MYANMAR SYMBOL AITON EXCLAMATION..MYANMAR SYMBOL AITON TWO +AA7A ; Grapheme_Base # Lo MYANMAR LETTER AITON RA +AA7B ; Grapheme_Base # Mc MYANMAR SIGN PAO KAREN TONE +AA7D ; Grapheme_Base # Mc MYANMAR SIGN TAI LAING TONE-5 +AA7E..AAAF ; Grapheme_Base # Lo [50] MYANMAR LETTER SHWE PALAUNG CHA..TAI VIET LETTER HIGH O +AAB1 ; Grapheme_Base # Lo TAI VIET VOWEL AA +AAB5..AAB6 ; Grapheme_Base # Lo [2] TAI VIET VOWEL E..TAI VIET VOWEL O +AAB9..AABD ; Grapheme_Base # Lo [5] TAI VIET VOWEL UEA..TAI VIET VOWEL AN +AAC0 ; Grapheme_Base # Lo TAI VIET TONE MAI NUENG +AAC2 ; Grapheme_Base # Lo TAI VIET TONE MAI SONG +AADB..AADC ; Grapheme_Base # Lo [2] TAI VIET SYMBOL KON..TAI VIET SYMBOL NUENG +AADD ; Grapheme_Base # Lm TAI VIET SYMBOL SAM +AADE..AADF ; Grapheme_Base # Po [2] TAI VIET SYMBOL HO HOI..TAI VIET SYMBOL KOI KOI +AAE0..AAEA ; Grapheme_Base # Lo [11] MEETEI MAYEK LETTER E..MEETEI MAYEK LETTER SSA +AAEB ; Grapheme_Base # Mc MEETEI MAYEK VOWEL SIGN II +AAEE..AAEF ; Grapheme_Base # Mc [2] MEETEI MAYEK VOWEL SIGN AU..MEETEI MAYEK VOWEL SIGN AAU +AAF0..AAF1 ; Grapheme_Base # Po [2] MEETEI MAYEK CHEIKHAN..MEETEI MAYEK AHANG KHUDAM +AAF2 ; Grapheme_Base # Lo MEETEI MAYEK ANJI +AAF3..AAF4 ; Grapheme_Base # Lm [2] MEETEI MAYEK SYLLABLE REPETITION MARK..MEETEI MAYEK WORD REPETITION MARK +AAF5 ; Grapheme_Base # Mc MEETEI MAYEK VOWEL SIGN VISARGA +AB01..AB06 ; Grapheme_Base # Lo [6] ETHIOPIC SYLLABLE TTHU..ETHIOPIC SYLLABLE TTHO +AB09..AB0E ; Grapheme_Base # Lo [6] ETHIOPIC SYLLABLE DDHU..ETHIOPIC SYLLABLE DDHO +AB11..AB16 ; Grapheme_Base # Lo [6] ETHIOPIC SYLLABLE DZU..ETHIOPIC SYLLABLE DZO +AB20..AB26 ; Grapheme_Base # Lo [7] ETHIOPIC SYLLABLE CCHHA..ETHIOPIC SYLLABLE CCHHO +AB28..AB2E ; Grapheme_Base # Lo [7] ETHIOPIC SYLLABLE BBA..ETHIOPIC SYLLABLE BBO +AB30..AB5A ; Grapheme_Base # L& [43] LATIN SMALL LETTER BARRED ALPHA..LATIN SMALL LETTER Y WITH SHORT RIGHT LEG +AB5B ; Grapheme_Base # Sk MODIFIER BREVE WITH INVERTED BREVE +AB5C..AB5F ; Grapheme_Base # Lm [4] MODIFIER LETTER SMALL HENG..MODIFIER LETTER SMALL U WITH LEFT HOOK +AB60..AB65 ; Grapheme_Base # L& [6] LATIN SMALL LETTER SAKHA YAT..GREEK LETTER SMALL CAPITAL OMEGA +AB70..ABBF ; Grapheme_Base # L& [80] CHEROKEE SMALL LETTER A..CHEROKEE SMALL LETTER YA +ABC0..ABE2 ; Grapheme_Base # Lo [35] MEETEI MAYEK LETTER KOK..MEETEI MAYEK LETTER I LONSUM +ABE3..ABE4 ; Grapheme_Base # Mc [2] MEETEI MAYEK VOWEL SIGN ONAP..MEETEI MAYEK VOWEL SIGN INAP +ABE6..ABE7 ; Grapheme_Base # Mc [2] MEETEI MAYEK VOWEL SIGN YENAP..MEETEI MAYEK VOWEL SIGN SOUNAP +ABE9..ABEA ; Grapheme_Base # Mc [2] MEETEI MAYEK VOWEL SIGN CHEINAP..MEETEI MAYEK VOWEL SIGN NUNG +ABEB ; Grapheme_Base # Po MEETEI MAYEK CHEIKHEI +ABEC ; Grapheme_Base # Mc MEETEI MAYEK LUM IYEK +ABF0..ABF9 ; Grapheme_Base # Nd [10] MEETEI MAYEK DIGIT ZERO..MEETEI MAYEK DIGIT NINE +AC00..D7A3 ; Grapheme_Base # Lo [11172] HANGUL SYLLABLE GA..HANGUL SYLLABLE HIH +D7B0..D7C6 ; Grapheme_Base # Lo [23] HANGUL JUNGSEONG O-YEO..HANGUL JUNGSEONG ARAEA-E +D7CB..D7FB ; Grapheme_Base # Lo [49] HANGUL JONGSEONG NIEUN-RIEUL..HANGUL JONGSEONG PHIEUPH-THIEUTH +F900..FA6D ; Grapheme_Base # Lo [366] CJK COMPATIBILITY IDEOGRAPH-F900..CJK COMPATIBILITY IDEOGRAPH-FA6D +FA70..FAD9 ; Grapheme_Base # Lo [106] CJK COMPATIBILITY IDEOGRAPH-FA70..CJK COMPATIBILITY IDEOGRAPH-FAD9 +FB00..FB06 ; Grapheme_Base # L& [7] LATIN SMALL LIGATURE FF..LATIN SMALL LIGATURE ST +FB13..FB17 ; Grapheme_Base # L& [5] ARMENIAN SMALL LIGATURE MEN NOW..ARMENIAN SMALL LIGATURE MEN XEH +FB1D ; Grapheme_Base # Lo HEBREW LETTER YOD WITH HIRIQ +FB1F..FB28 ; Grapheme_Base # Lo [10] HEBREW LIGATURE YIDDISH YOD YOD PATAH..HEBREW LETTER WIDE TAV +FB29 ; Grapheme_Base # Sm HEBREW LETTER ALTERNATIVE PLUS SIGN +FB2A..FB36 ; Grapheme_Base # Lo [13] HEBREW LETTER SHIN WITH SHIN DOT..HEBREW LETTER ZAYIN WITH DAGESH +FB38..FB3C ; Grapheme_Base # Lo [5] HEBREW LETTER TET WITH DAGESH..HEBREW LETTER LAMED WITH DAGESH +FB3E ; Grapheme_Base # Lo HEBREW LETTER MEM WITH DAGESH +FB40..FB41 ; Grapheme_Base # Lo [2] HEBREW LETTER NUN WITH DAGESH..HEBREW LETTER SAMEKH WITH DAGESH +FB43..FB44 ; Grapheme_Base # Lo [2] HEBREW LETTER FINAL PE WITH DAGESH..HEBREW LETTER PE WITH DAGESH +FB46..FBB1 ; Grapheme_Base # Lo [108] HEBREW LETTER TSADI WITH DAGESH..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM +FBB2..FBC1 ; Grapheme_Base # Sk [16] ARABIC SYMBOL DOT ABOVE..ARABIC SYMBOL SMALL TAH BELOW +FBD3..FD3D ; Grapheme_Base # Lo [363] ARABIC LETTER NG ISOLATED FORM..ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM +FD3E ; Grapheme_Base # Pe ORNATE LEFT PARENTHESIS +FD3F ; Grapheme_Base # Ps ORNATE RIGHT PARENTHESIS +FD50..FD8F ; Grapheme_Base # Lo [64] ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM..ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM +FD92..FDC7 ; Grapheme_Base # Lo [54] ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM..ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM +FDF0..FDFB ; Grapheme_Base # Lo [12] ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM..ARABIC LIGATURE JALLAJALALOUHOU +FDFC ; Grapheme_Base # Sc RIAL SIGN +FDFD ; Grapheme_Base # So ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM +FE10..FE16 ; Grapheme_Base # Po [7] PRESENTATION FORM FOR VERTICAL COMMA..PRESENTATION FORM FOR VERTICAL QUESTION MARK +FE17 ; Grapheme_Base # Ps PRESENTATION FORM FOR VERTICAL LEFT WHITE LENTICULAR BRACKET +FE18 ; Grapheme_Base # Pe PRESENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRAKCET +FE19 ; Grapheme_Base # Po PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS +FE30 ; Grapheme_Base # Po PRESENTATION FORM FOR VERTICAL TWO DOT LEADER +FE31..FE32 ; Grapheme_Base # Pd [2] PRESENTATION FORM FOR VERTICAL EM DASH..PRESENTATION FORM FOR VERTICAL EN DASH +FE33..FE34 ; Grapheme_Base # Pc [2] PRESENTATION FORM FOR VERTICAL LOW LINE..PRESENTATION FORM FOR VERTICAL WAVY LOW LINE +FE35 ; Grapheme_Base # Ps PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS +FE36 ; Grapheme_Base # Pe PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS +FE37 ; Grapheme_Base # Ps PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET +FE38 ; Grapheme_Base # Pe PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET +FE39 ; Grapheme_Base # Ps PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET +FE3A ; Grapheme_Base # Pe PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET +FE3B ; Grapheme_Base # Ps PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET +FE3C ; Grapheme_Base # Pe PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET +FE3D ; Grapheme_Base # Ps PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET +FE3E ; Grapheme_Base # Pe PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET +FE3F ; Grapheme_Base # Ps PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET +FE40 ; Grapheme_Base # Pe PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET +FE41 ; Grapheme_Base # Ps PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET +FE42 ; Grapheme_Base # Pe PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET +FE43 ; Grapheme_Base # Ps PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET +FE44 ; Grapheme_Base # Pe PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET +FE45..FE46 ; Grapheme_Base # Po [2] SESAME DOT..WHITE SESAME DOT +FE47 ; Grapheme_Base # Ps PRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKET +FE48 ; Grapheme_Base # Pe PRESENTATION FORM FOR VERTICAL RIGHT SQUARE BRACKET +FE49..FE4C ; Grapheme_Base # Po [4] DASHED OVERLINE..DOUBLE WAVY OVERLINE +FE4D..FE4F ; Grapheme_Base # Pc [3] DASHED LOW LINE..WAVY LOW LINE +FE50..FE52 ; Grapheme_Base # Po [3] SMALL COMMA..SMALL FULL STOP +FE54..FE57 ; Grapheme_Base # Po [4] SMALL SEMICOLON..SMALL EXCLAMATION MARK +FE58 ; Grapheme_Base # Pd SMALL EM DASH +FE59 ; Grapheme_Base # Ps SMALL LEFT PARENTHESIS +FE5A ; Grapheme_Base # Pe SMALL RIGHT PARENTHESIS +FE5B ; Grapheme_Base # Ps SMALL LEFT CURLY BRACKET +FE5C ; Grapheme_Base # Pe SMALL RIGHT CURLY BRACKET +FE5D ; Grapheme_Base # Ps SMALL LEFT TORTOISE SHELL BRACKET +FE5E ; Grapheme_Base # Pe SMALL RIGHT TORTOISE SHELL BRACKET +FE5F..FE61 ; Grapheme_Base # Po [3] SMALL NUMBER SIGN..SMALL ASTERISK +FE62 ; Grapheme_Base # Sm SMALL PLUS SIGN +FE63 ; Grapheme_Base # Pd SMALL HYPHEN-MINUS +FE64..FE66 ; Grapheme_Base # Sm [3] SMALL LESS-THAN SIGN..SMALL EQUALS SIGN +FE68 ; Grapheme_Base # Po SMALL REVERSE SOLIDUS +FE69 ; Grapheme_Base # Sc SMALL DOLLAR SIGN +FE6A..FE6B ; Grapheme_Base # Po [2] SMALL PERCENT SIGN..SMALL COMMERCIAL AT +FE70..FE74 ; Grapheme_Base # Lo [5] ARABIC FATHATAN ISOLATED FORM..ARABIC KASRATAN ISOLATED FORM +FE76..FEFC ; Grapheme_Base # Lo [135] ARABIC FATHA ISOLATED FORM..ARABIC LIGATURE LAM WITH ALEF FINAL FORM +FF01..FF03 ; Grapheme_Base # Po [3] FULLWIDTH EXCLAMATION MARK..FULLWIDTH NUMBER SIGN +FF04 ; Grapheme_Base # Sc FULLWIDTH DOLLAR SIGN +FF05..FF07 ; Grapheme_Base # Po [3] FULLWIDTH PERCENT SIGN..FULLWIDTH APOSTROPHE +FF08 ; Grapheme_Base # Ps FULLWIDTH LEFT PARENTHESIS +FF09 ; Grapheme_Base # Pe FULLWIDTH RIGHT PARENTHESIS +FF0A ; Grapheme_Base # Po FULLWIDTH ASTERISK +FF0B ; Grapheme_Base # Sm FULLWIDTH PLUS SIGN +FF0C ; Grapheme_Base # Po FULLWIDTH COMMA +FF0D ; Grapheme_Base # Pd FULLWIDTH HYPHEN-MINUS +FF0E..FF0F ; Grapheme_Base # Po [2] FULLWIDTH FULL STOP..FULLWIDTH SOLIDUS +FF10..FF19 ; Grapheme_Base # Nd [10] FULLWIDTH DIGIT ZERO..FULLWIDTH DIGIT NINE +FF1A..FF1B ; Grapheme_Base # Po [2] FULLWIDTH COLON..FULLWIDTH SEMICOLON +FF1C..FF1E ; Grapheme_Base # Sm [3] FULLWIDTH LESS-THAN SIGN..FULLWIDTH GREATER-THAN SIGN +FF1F..FF20 ; Grapheme_Base # Po [2] FULLWIDTH QUESTION MARK..FULLWIDTH COMMERCIAL AT +FF21..FF3A ; Grapheme_Base # L& [26] FULLWIDTH LATIN CAPITAL LETTER A..FULLWIDTH LATIN CAPITAL LETTER Z +FF3B ; Grapheme_Base # Ps FULLWIDTH LEFT SQUARE BRACKET +FF3C ; Grapheme_Base # Po FULLWIDTH REVERSE SOLIDUS +FF3D ; Grapheme_Base # Pe FULLWIDTH RIGHT SQUARE BRACKET +FF3E ; Grapheme_Base # Sk FULLWIDTH CIRCUMFLEX ACCENT +FF3F ; Grapheme_Base # Pc FULLWIDTH LOW LINE +FF40 ; Grapheme_Base # Sk FULLWIDTH GRAVE ACCENT +FF41..FF5A ; Grapheme_Base # L& [26] FULLWIDTH LATIN SMALL LETTER A..FULLWIDTH LATIN SMALL LETTER Z +FF5B ; Grapheme_Base # Ps FULLWIDTH LEFT CURLY BRACKET +FF5C ; Grapheme_Base # Sm FULLWIDTH VERTICAL LINE +FF5D ; Grapheme_Base # Pe FULLWIDTH RIGHT CURLY BRACKET +FF5E ; Grapheme_Base # Sm FULLWIDTH TILDE +FF5F ; Grapheme_Base # Ps FULLWIDTH LEFT WHITE PARENTHESIS +FF60 ; Grapheme_Base # Pe FULLWIDTH RIGHT WHITE PARENTHESIS +FF61 ; Grapheme_Base # Po HALFWIDTH IDEOGRAPHIC FULL STOP +FF62 ; Grapheme_Base # Ps HALFWIDTH LEFT CORNER BRACKET +FF63 ; Grapheme_Base # Pe HALFWIDTH RIGHT CORNER BRACKET +FF64..FF65 ; Grapheme_Base # Po [2] HALFWIDTH IDEOGRAPHIC COMMA..HALFWIDTH KATAKANA MIDDLE DOT +FF66..FF6F ; Grapheme_Base # Lo [10] HALFWIDTH KATAKANA LETTER WO..HALFWIDTH KATAKANA LETTER SMALL TU +FF70 ; Grapheme_Base # Lm HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK +FF71..FF9D ; Grapheme_Base # Lo [45] HALFWIDTH KATAKANA LETTER A..HALFWIDTH KATAKANA LETTER N +FFA0..FFBE ; Grapheme_Base # Lo [31] HALFWIDTH HANGUL FILLER..HALFWIDTH HANGUL LETTER HIEUH +FFC2..FFC7 ; Grapheme_Base # Lo [6] HALFWIDTH HANGUL LETTER A..HALFWIDTH HANGUL LETTER E +FFCA..FFCF ; Grapheme_Base # Lo [6] HALFWIDTH HANGUL LETTER YEO..HALFWIDTH HANGUL LETTER OE +FFD2..FFD7 ; Grapheme_Base # Lo [6] HALFWIDTH HANGUL LETTER YO..HALFWIDTH HANGUL LETTER YU +FFDA..FFDC ; Grapheme_Base # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL LETTER I +FFE0..FFE1 ; Grapheme_Base # Sc [2] FULLWIDTH CENT SIGN..FULLWIDTH POUND SIGN +FFE2 ; Grapheme_Base # Sm FULLWIDTH NOT SIGN +FFE3 ; Grapheme_Base # Sk FULLWIDTH MACRON +FFE4 ; Grapheme_Base # So FULLWIDTH BROKEN BAR +FFE5..FFE6 ; Grapheme_Base # Sc [2] FULLWIDTH YEN SIGN..FULLWIDTH WON SIGN +FFE8 ; Grapheme_Base # So HALFWIDTH FORMS LIGHT VERTICAL +FFE9..FFEC ; Grapheme_Base # Sm [4] HALFWIDTH LEFTWARDS ARROW..HALFWIDTH DOWNWARDS ARROW +FFED..FFEE ; Grapheme_Base # So [2] HALFWIDTH BLACK SQUARE..HALFWIDTH WHITE CIRCLE +FFFC..FFFD ; Grapheme_Base # So [2] OBJECT REPLACEMENT CHARACTER..REPLACEMENT CHARACTER +10000..1000B ; Grapheme_Base # Lo [12] LINEAR B SYLLABLE B008 A..LINEAR B SYLLABLE B046 JE +1000D..10026 ; Grapheme_Base # Lo [26] LINEAR B SYLLABLE B036 JO..LINEAR B SYLLABLE B032 QO +10028..1003A ; Grapheme_Base # Lo [19] LINEAR B SYLLABLE B060 RA..LINEAR B SYLLABLE B042 WO +1003C..1003D ; Grapheme_Base # Lo [2] LINEAR B SYLLABLE B017 ZA..LINEAR B SYLLABLE B074 ZE +1003F..1004D ; Grapheme_Base # Lo [15] LINEAR B SYLLABLE B020 ZO..LINEAR B SYLLABLE B091 TWO +10050..1005D ; Grapheme_Base # Lo [14] LINEAR B SYMBOL B018..LINEAR B SYMBOL B089 +10080..100FA ; Grapheme_Base # Lo [123] LINEAR B IDEOGRAM B100 MAN..LINEAR B IDEOGRAM VESSEL B305 +10100..10102 ; Grapheme_Base # Po [3] AEGEAN WORD SEPARATOR LINE..AEGEAN CHECK MARK +10107..10133 ; Grapheme_Base # No [45] AEGEAN NUMBER ONE..AEGEAN NUMBER NINETY THOUSAND +10137..1013F ; Grapheme_Base # So [9] AEGEAN WEIGHT BASE UNIT..AEGEAN MEASURE THIRD SUBUNIT +10140..10174 ; Grapheme_Base # Nl [53] GREEK ACROPHONIC ATTIC ONE QUARTER..GREEK ACROPHONIC STRATIAN FIFTY MNAS +10175..10178 ; Grapheme_Base # No [4] GREEK ONE HALF SIGN..GREEK THREE QUARTERS SIGN +10179..10189 ; Grapheme_Base # So [17] GREEK YEAR SIGN..GREEK TRYBLION BASE SIGN +1018A..1018B ; Grapheme_Base # No [2] GREEK ZERO SIGN..GREEK ONE QUARTER SIGN +1018C..1018E ; Grapheme_Base # So [3] GREEK SINUSOID SIGN..NOMISMA SIGN +10190..1019B ; Grapheme_Base # So [12] ROMAN SEXTANS SIGN..ROMAN CENTURIAL SIGN +101A0 ; Grapheme_Base # So GREEK SYMBOL TAU RHO +101D0..101FC ; Grapheme_Base # So [45] PHAISTOS DISC SIGN PEDESTRIAN..PHAISTOS DISC SIGN WAVY BAND +10280..1029C ; Grapheme_Base # Lo [29] LYCIAN LETTER A..LYCIAN LETTER X +102A0..102D0 ; Grapheme_Base # Lo [49] CARIAN LETTER A..CARIAN LETTER UUU3 +102E1..102FB ; Grapheme_Base # No [27] COPTIC EPACT DIGIT ONE..COPTIC EPACT NUMBER NINE HUNDRED +10300..1031F ; Grapheme_Base # Lo [32] OLD ITALIC LETTER A..OLD ITALIC LETTER ESS +10320..10323 ; Grapheme_Base # No [4] OLD ITALIC NUMERAL ONE..OLD ITALIC NUMERAL FIFTY +1032D..10340 ; Grapheme_Base # Lo [20] OLD ITALIC LETTER YE..GOTHIC LETTER PAIRTHRA +10341 ; Grapheme_Base # Nl GOTHIC LETTER NINETY +10342..10349 ; Grapheme_Base # Lo [8] GOTHIC LETTER RAIDA..GOTHIC LETTER OTHAL +1034A ; Grapheme_Base # Nl GOTHIC LETTER NINE HUNDRED +10350..10375 ; Grapheme_Base # Lo [38] OLD PERMIC LETTER AN..OLD PERMIC LETTER IA +10380..1039D ; Grapheme_Base # Lo [30] UGARITIC LETTER ALPA..UGARITIC LETTER SSU +1039F ; Grapheme_Base # Po UGARITIC WORD DIVIDER +103A0..103C3 ; Grapheme_Base # Lo [36] OLD PERSIAN SIGN A..OLD PERSIAN SIGN HA +103C8..103CF ; Grapheme_Base # Lo [8] OLD PERSIAN SIGN AURAMAZDAA..OLD PERSIAN SIGN BUUMISH +103D0 ; Grapheme_Base # Po OLD PERSIAN WORD DIVIDER +103D1..103D5 ; Grapheme_Base # Nl [5] OLD PERSIAN NUMBER ONE..OLD PERSIAN NUMBER HUNDRED +10400..1044F ; Grapheme_Base # L& [80] DESERET CAPITAL LETTER LONG I..DESERET SMALL LETTER EW +10450..1049D ; Grapheme_Base # Lo [78] SHAVIAN LETTER PEEP..OSMANYA LETTER OO +104A0..104A9 ; Grapheme_Base # Nd [10] OSMANYA DIGIT ZERO..OSMANYA DIGIT NINE +104B0..104D3 ; Grapheme_Base # L& [36] OSAGE CAPITAL LETTER A..OSAGE CAPITAL LETTER ZHA +104D8..104FB ; Grapheme_Base # L& [36] OSAGE SMALL LETTER A..OSAGE SMALL LETTER ZHA +10500..10527 ; Grapheme_Base # Lo [40] ELBASAN LETTER A..ELBASAN LETTER KHE +10530..10563 ; Grapheme_Base # Lo [52] CAUCASIAN ALBANIAN LETTER ALT..CAUCASIAN ALBANIAN LETTER KIW +1056F ; Grapheme_Base # Po CAUCASIAN ALBANIAN CITATION MARK +10600..10736 ; Grapheme_Base # Lo [311] LINEAR A SIGN AB001..LINEAR A SIGN A664 +10740..10755 ; Grapheme_Base # Lo [22] LINEAR A SIGN A701 A..LINEAR A SIGN A732 JE +10760..10767 ; Grapheme_Base # Lo [8] LINEAR A SIGN A800..LINEAR A SIGN A807 +10800..10805 ; Grapheme_Base # Lo [6] CYPRIOT SYLLABLE A..CYPRIOT SYLLABLE JA +10808 ; Grapheme_Base # Lo CYPRIOT SYLLABLE JO +1080A..10835 ; Grapheme_Base # Lo [44] CYPRIOT SYLLABLE KA..CYPRIOT SYLLABLE WO +10837..10838 ; Grapheme_Base # Lo [2] CYPRIOT SYLLABLE XA..CYPRIOT SYLLABLE XE +1083C ; Grapheme_Base # Lo CYPRIOT SYLLABLE ZA +1083F..10855 ; Grapheme_Base # Lo [23] CYPRIOT SYLLABLE ZO..IMPERIAL ARAMAIC LETTER TAW +10857 ; Grapheme_Base # Po IMPERIAL ARAMAIC SECTION SIGN +10858..1085F ; Grapheme_Base # No [8] IMPERIAL ARAMAIC NUMBER ONE..IMPERIAL ARAMAIC NUMBER TEN THOUSAND +10860..10876 ; Grapheme_Base # Lo [23] PALMYRENE LETTER ALEPH..PALMYRENE LETTER TAW +10877..10878 ; Grapheme_Base # So [2] PALMYRENE LEFT-POINTING FLEURON..PALMYRENE RIGHT-POINTING FLEURON +10879..1087F ; Grapheme_Base # No [7] PALMYRENE NUMBER ONE..PALMYRENE NUMBER TWENTY +10880..1089E ; Grapheme_Base # Lo [31] NABATAEAN LETTER FINAL ALEPH..NABATAEAN LETTER TAW +108A7..108AF ; Grapheme_Base # No [9] NABATAEAN NUMBER ONE..NABATAEAN NUMBER ONE HUNDRED +108E0..108F2 ; Grapheme_Base # Lo [19] HATRAN LETTER ALEPH..HATRAN LETTER QOPH +108F4..108F5 ; Grapheme_Base # Lo [2] HATRAN LETTER SHIN..HATRAN LETTER TAW +108FB..108FF ; Grapheme_Base # No [5] HATRAN NUMBER ONE..HATRAN NUMBER ONE HUNDRED +10900..10915 ; Grapheme_Base # Lo [22] PHOENICIAN LETTER ALF..PHOENICIAN LETTER TAU +10916..1091B ; Grapheme_Base # No [6] PHOENICIAN NUMBER ONE..PHOENICIAN NUMBER THREE +1091F ; Grapheme_Base # Po PHOENICIAN WORD SEPARATOR +10920..10939 ; Grapheme_Base # Lo [26] LYDIAN LETTER A..LYDIAN LETTER C +1093F ; Grapheme_Base # Po LYDIAN TRIANGULAR MARK +10980..109B7 ; Grapheme_Base # Lo [56] MEROITIC HIEROGLYPHIC LETTER A..MEROITIC CURSIVE LETTER DA +109BC..109BD ; Grapheme_Base # No [2] MEROITIC CURSIVE FRACTION ELEVEN TWELFTHS..MEROITIC CURSIVE FRACTION ONE HALF +109BE..109BF ; Grapheme_Base # Lo [2] MEROITIC CURSIVE LOGOGRAM RMT..MEROITIC CURSIVE LOGOGRAM IMN +109C0..109CF ; Grapheme_Base # No [16] MEROITIC CURSIVE NUMBER ONE..MEROITIC CURSIVE NUMBER SEVENTY +109D2..109FF ; Grapheme_Base # No [46] MEROITIC CURSIVE NUMBER ONE HUNDRED..MEROITIC CURSIVE FRACTION TEN TWELFTHS +10A00 ; Grapheme_Base # Lo KHAROSHTHI LETTER A +10A10..10A13 ; Grapheme_Base # Lo [4] KHAROSHTHI LETTER KA..KHAROSHTHI LETTER GHA +10A15..10A17 ; Grapheme_Base # Lo [3] KHAROSHTHI LETTER CA..KHAROSHTHI LETTER JA +10A19..10A35 ; Grapheme_Base # Lo [29] KHAROSHTHI LETTER NYA..KHAROSHTHI LETTER VHA +10A40..10A48 ; Grapheme_Base # No [9] KHAROSHTHI DIGIT ONE..KHAROSHTHI FRACTION ONE HALF +10A50..10A58 ; Grapheme_Base # Po [9] KHAROSHTHI PUNCTUATION DOT..KHAROSHTHI PUNCTUATION LINES +10A60..10A7C ; Grapheme_Base # Lo [29] OLD SOUTH ARABIAN LETTER HE..OLD SOUTH ARABIAN LETTER THETH +10A7D..10A7E ; Grapheme_Base # No [2] OLD SOUTH ARABIAN NUMBER ONE..OLD SOUTH ARABIAN NUMBER FIFTY +10A7F ; Grapheme_Base # Po OLD SOUTH ARABIAN NUMERIC INDICATOR +10A80..10A9C ; Grapheme_Base # Lo [29] OLD NORTH ARABIAN LETTER HEH..OLD NORTH ARABIAN LETTER ZAH +10A9D..10A9F ; Grapheme_Base # No [3] OLD NORTH ARABIAN NUMBER ONE..OLD NORTH ARABIAN NUMBER TWENTY +10AC0..10AC7 ; Grapheme_Base # Lo [8] MANICHAEAN LETTER ALEPH..MANICHAEAN LETTER WAW +10AC8 ; Grapheme_Base # So MANICHAEAN SIGN UD +10AC9..10AE4 ; Grapheme_Base # Lo [28] MANICHAEAN LETTER ZAYIN..MANICHAEAN LETTER TAW +10AEB..10AEF ; Grapheme_Base # No [5] MANICHAEAN NUMBER ONE..MANICHAEAN NUMBER ONE HUNDRED +10AF0..10AF6 ; Grapheme_Base # Po [7] MANICHAEAN PUNCTUATION STAR..MANICHAEAN PUNCTUATION LINE FILLER +10B00..10B35 ; Grapheme_Base # Lo [54] AVESTAN LETTER A..AVESTAN LETTER HE +10B39..10B3F ; Grapheme_Base # Po [7] AVESTAN ABBREVIATION MARK..LARGE ONE RING OVER TWO RINGS PUNCTUATION +10B40..10B55 ; Grapheme_Base # Lo [22] INSCRIPTIONAL PARTHIAN LETTER ALEPH..INSCRIPTIONAL PARTHIAN LETTER TAW +10B58..10B5F ; Grapheme_Base # No [8] INSCRIPTIONAL PARTHIAN NUMBER ONE..INSCRIPTIONAL PARTHIAN NUMBER ONE THOUSAND +10B60..10B72 ; Grapheme_Base # Lo [19] INSCRIPTIONAL PAHLAVI LETTER ALEPH..INSCRIPTIONAL PAHLAVI LETTER TAW +10B78..10B7F ; Grapheme_Base # No [8] INSCRIPTIONAL PAHLAVI NUMBER ONE..INSCRIPTIONAL PAHLAVI NUMBER ONE THOUSAND +10B80..10B91 ; Grapheme_Base # Lo [18] PSALTER PAHLAVI LETTER ALEPH..PSALTER PAHLAVI LETTER TAW +10B99..10B9C ; Grapheme_Base # Po [4] PSALTER PAHLAVI SECTION MARK..PSALTER PAHLAVI FOUR DOTS WITH DOT +10BA9..10BAF ; Grapheme_Base # No [7] PSALTER PAHLAVI NUMBER ONE..PSALTER PAHLAVI NUMBER ONE HUNDRED +10C00..10C48 ; Grapheme_Base # Lo [73] OLD TURKIC LETTER ORKHON A..OLD TURKIC LETTER ORKHON BASH +10C80..10CB2 ; Grapheme_Base # L& [51] OLD HUNGARIAN CAPITAL LETTER A..OLD HUNGARIAN CAPITAL LETTER US +10CC0..10CF2 ; Grapheme_Base # L& [51] OLD HUNGARIAN SMALL LETTER A..OLD HUNGARIAN SMALL LETTER US +10CFA..10CFF ; Grapheme_Base # No [6] OLD HUNGARIAN NUMBER ONE..OLD HUNGARIAN NUMBER ONE THOUSAND +10D00..10D23 ; Grapheme_Base # Lo [36] HANIFI ROHINGYA LETTER A..HANIFI ROHINGYA MARK NA KHONNA +10D30..10D39 ; Grapheme_Base # Nd [10] HANIFI ROHINGYA DIGIT ZERO..HANIFI ROHINGYA DIGIT NINE +10E60..10E7E ; Grapheme_Base # No [31] RUMI DIGIT ONE..RUMI FRACTION TWO THIRDS +10F00..10F1C ; Grapheme_Base # Lo [29] OLD SOGDIAN LETTER ALEPH..OLD SOGDIAN LETTER FINAL TAW WITH VERTICAL TAIL +10F1D..10F26 ; Grapheme_Base # No [10] OLD SOGDIAN NUMBER ONE..OLD SOGDIAN FRACTION ONE HALF +10F27 ; Grapheme_Base # Lo OLD SOGDIAN LIGATURE AYIN-DALETH +10F30..10F45 ; Grapheme_Base # Lo [22] SOGDIAN LETTER ALEPH..SOGDIAN INDEPENDENT SHIN +10F51..10F54 ; Grapheme_Base # No [4] SOGDIAN NUMBER ONE..SOGDIAN NUMBER ONE HUNDRED +10F55..10F59 ; Grapheme_Base # Po [5] SOGDIAN PUNCTUATION TWO VERTICAL BARS..SOGDIAN PUNCTUATION HALF CIRCLE WITH DOT +11000 ; Grapheme_Base # Mc BRAHMI SIGN CANDRABINDU +11002 ; Grapheme_Base # Mc BRAHMI SIGN VISARGA +11003..11037 ; Grapheme_Base # Lo [53] BRAHMI SIGN JIHVAMULIYA..BRAHMI LETTER OLD TAMIL NNNA +11047..1104D ; Grapheme_Base # Po [7] BRAHMI DANDA..BRAHMI PUNCTUATION LOTUS +11052..11065 ; Grapheme_Base # No [20] BRAHMI NUMBER ONE..BRAHMI NUMBER ONE THOUSAND +11066..1106F ; Grapheme_Base # Nd [10] BRAHMI DIGIT ZERO..BRAHMI DIGIT NINE +11082 ; Grapheme_Base # Mc KAITHI SIGN VISARGA +11083..110AF ; Grapheme_Base # Lo [45] KAITHI LETTER A..KAITHI LETTER HA +110B0..110B2 ; Grapheme_Base # Mc [3] KAITHI VOWEL SIGN AA..KAITHI VOWEL SIGN II +110B7..110B8 ; Grapheme_Base # Mc [2] KAITHI VOWEL SIGN O..KAITHI VOWEL SIGN AU +110BB..110BC ; Grapheme_Base # Po [2] KAITHI ABBREVIATION SIGN..KAITHI ENUMERATION SIGN +110BE..110C1 ; Grapheme_Base # Po [4] KAITHI SECTION MARK..KAITHI DOUBLE DANDA +110D0..110E8 ; Grapheme_Base # Lo [25] SORA SOMPENG LETTER SAH..SORA SOMPENG LETTER MAE +110F0..110F9 ; Grapheme_Base # Nd [10] SORA SOMPENG DIGIT ZERO..SORA SOMPENG DIGIT NINE +11103..11126 ; Grapheme_Base # Lo [36] CHAKMA LETTER AA..CHAKMA LETTER HAA +1112C ; Grapheme_Base # Mc CHAKMA VOWEL SIGN E +11136..1113F ; Grapheme_Base # Nd [10] CHAKMA DIGIT ZERO..CHAKMA DIGIT NINE +11140..11143 ; Grapheme_Base # Po [4] CHAKMA SECTION MARK..CHAKMA QUESTION MARK +11144 ; Grapheme_Base # Lo CHAKMA LETTER LHAA +11145..11146 ; Grapheme_Base # Mc [2] CHAKMA VOWEL SIGN AA..CHAKMA VOWEL SIGN EI +11150..11172 ; Grapheme_Base # Lo [35] MAHAJANI LETTER A..MAHAJANI LETTER RRA +11174..11175 ; Grapheme_Base # Po [2] MAHAJANI ABBREVIATION SIGN..MAHAJANI SECTION MARK +11176 ; Grapheme_Base # Lo MAHAJANI LIGATURE SHRI +11182 ; Grapheme_Base # Mc SHARADA SIGN VISARGA +11183..111B2 ; Grapheme_Base # Lo [48] SHARADA LETTER A..SHARADA LETTER HA +111B3..111B5 ; Grapheme_Base # Mc [3] SHARADA VOWEL SIGN AA..SHARADA VOWEL SIGN II +111BF..111C0 ; Grapheme_Base # Mc [2] SHARADA VOWEL SIGN AU..SHARADA SIGN VIRAMA +111C1..111C4 ; Grapheme_Base # Lo [4] SHARADA SIGN AVAGRAHA..SHARADA OM +111C5..111C8 ; Grapheme_Base # Po [4] SHARADA DANDA..SHARADA SEPARATOR +111CD ; Grapheme_Base # Po SHARADA SUTRA MARK +111D0..111D9 ; Grapheme_Base # Nd [10] SHARADA DIGIT ZERO..SHARADA DIGIT NINE +111DA ; Grapheme_Base # Lo SHARADA EKAM +111DB ; Grapheme_Base # Po SHARADA SIGN SIDDHAM +111DC ; Grapheme_Base # Lo SHARADA HEADSTROKE +111DD..111DF ; Grapheme_Base # Po [3] SHARADA CONTINUATION SIGN..SHARADA SECTION MARK-2 +111E1..111F4 ; Grapheme_Base # No [20] SINHALA ARCHAIC DIGIT ONE..SINHALA ARCHAIC NUMBER ONE THOUSAND +11200..11211 ; Grapheme_Base # Lo [18] KHOJKI LETTER A..KHOJKI LETTER JJA +11213..1122B ; Grapheme_Base # Lo [25] KHOJKI LETTER NYA..KHOJKI LETTER LLA +1122C..1122E ; Grapheme_Base # Mc [3] KHOJKI VOWEL SIGN AA..KHOJKI VOWEL SIGN II +11232..11233 ; Grapheme_Base # Mc [2] KHOJKI VOWEL SIGN O..KHOJKI VOWEL SIGN AU +11235 ; Grapheme_Base # Mc KHOJKI SIGN VIRAMA +11238..1123D ; Grapheme_Base # Po [6] KHOJKI DANDA..KHOJKI ABBREVIATION SIGN +11280..11286 ; Grapheme_Base # Lo [7] MULTANI LETTER A..MULTANI LETTER GA +11288 ; Grapheme_Base # Lo MULTANI LETTER GHA +1128A..1128D ; Grapheme_Base # Lo [4] MULTANI LETTER CA..MULTANI LETTER JJA +1128F..1129D ; Grapheme_Base # Lo [15] MULTANI LETTER NYA..MULTANI LETTER BA +1129F..112A8 ; Grapheme_Base # Lo [10] MULTANI LETTER BHA..MULTANI LETTER RHA +112A9 ; Grapheme_Base # Po MULTANI SECTION MARK +112B0..112DE ; Grapheme_Base # Lo [47] KHUDAWADI LETTER A..KHUDAWADI LETTER HA +112E0..112E2 ; Grapheme_Base # Mc [3] KHUDAWADI VOWEL SIGN AA..KHUDAWADI VOWEL SIGN II +112F0..112F9 ; Grapheme_Base # Nd [10] KHUDAWADI DIGIT ZERO..KHUDAWADI DIGIT NINE +11302..11303 ; Grapheme_Base # Mc [2] GRANTHA SIGN ANUSVARA..GRANTHA SIGN VISARGA +11305..1130C ; Grapheme_Base # Lo [8] GRANTHA LETTER A..GRANTHA LETTER VOCALIC L +1130F..11310 ; Grapheme_Base # Lo [2] GRANTHA LETTER EE..GRANTHA LETTER AI +11313..11328 ; Grapheme_Base # Lo [22] GRANTHA LETTER OO..GRANTHA LETTER NA +1132A..11330 ; Grapheme_Base # Lo [7] GRANTHA LETTER PA..GRANTHA LETTER RA +11332..11333 ; Grapheme_Base # Lo [2] GRANTHA LETTER LA..GRANTHA LETTER LLA +11335..11339 ; Grapheme_Base # Lo [5] GRANTHA LETTER VA..GRANTHA LETTER HA +1133D ; Grapheme_Base # Lo GRANTHA SIGN AVAGRAHA +1133F ; Grapheme_Base # Mc GRANTHA VOWEL SIGN I +11341..11344 ; Grapheme_Base # Mc [4] GRANTHA VOWEL SIGN U..GRANTHA VOWEL SIGN VOCALIC RR +11347..11348 ; Grapheme_Base # Mc [2] GRANTHA VOWEL SIGN EE..GRANTHA VOWEL SIGN AI +1134B..1134D ; Grapheme_Base # Mc [3] GRANTHA VOWEL SIGN OO..GRANTHA SIGN VIRAMA +11350 ; Grapheme_Base # Lo GRANTHA OM +1135D..11361 ; Grapheme_Base # Lo [5] GRANTHA SIGN PLUTA..GRANTHA LETTER VOCALIC LL +11362..11363 ; Grapheme_Base # Mc [2] GRANTHA VOWEL SIGN VOCALIC L..GRANTHA VOWEL SIGN VOCALIC LL +11400..11434 ; Grapheme_Base # Lo [53] NEWA LETTER A..NEWA LETTER HA +11435..11437 ; Grapheme_Base # Mc [3] NEWA VOWEL SIGN AA..NEWA VOWEL SIGN II +11440..11441 ; Grapheme_Base # Mc [2] NEWA VOWEL SIGN O..NEWA VOWEL SIGN AU +11445 ; Grapheme_Base # Mc NEWA SIGN VISARGA +11447..1144A ; Grapheme_Base # Lo [4] NEWA SIGN AVAGRAHA..NEWA SIDDHI +1144B..1144F ; Grapheme_Base # Po [5] NEWA DANDA..NEWA ABBREVIATION SIGN +11450..11459 ; Grapheme_Base # Nd [10] NEWA DIGIT ZERO..NEWA DIGIT NINE +1145B ; Grapheme_Base # Po NEWA PLACEHOLDER MARK +1145D ; Grapheme_Base # Po NEWA INSERTION SIGN +11480..114AF ; Grapheme_Base # Lo [48] TIRHUTA ANJI..TIRHUTA LETTER HA +114B1..114B2 ; Grapheme_Base # Mc [2] TIRHUTA VOWEL SIGN I..TIRHUTA VOWEL SIGN II +114B9 ; Grapheme_Base # Mc TIRHUTA VOWEL SIGN E +114BB..114BC ; Grapheme_Base # Mc [2] TIRHUTA VOWEL SIGN AI..TIRHUTA VOWEL SIGN O +114BE ; Grapheme_Base # Mc TIRHUTA VOWEL SIGN AU +114C1 ; Grapheme_Base # Mc TIRHUTA SIGN VISARGA +114C4..114C5 ; Grapheme_Base # Lo [2] TIRHUTA SIGN AVAGRAHA..TIRHUTA GVANG +114C6 ; Grapheme_Base # Po TIRHUTA ABBREVIATION SIGN +114C7 ; Grapheme_Base # Lo TIRHUTA OM +114D0..114D9 ; Grapheme_Base # Nd [10] TIRHUTA DIGIT ZERO..TIRHUTA DIGIT NINE +11580..115AE ; Grapheme_Base # Lo [47] SIDDHAM LETTER A..SIDDHAM LETTER HA +115B0..115B1 ; Grapheme_Base # Mc [2] SIDDHAM VOWEL SIGN I..SIDDHAM VOWEL SIGN II +115B8..115BB ; Grapheme_Base # Mc [4] SIDDHAM VOWEL SIGN E..SIDDHAM VOWEL SIGN AU +115BE ; Grapheme_Base # Mc SIDDHAM SIGN VISARGA +115C1..115D7 ; Grapheme_Base # Po [23] SIDDHAM SIGN SIDDHAM..SIDDHAM SECTION MARK WITH CIRCLES AND FOUR ENCLOSURES +115D8..115DB ; Grapheme_Base # Lo [4] SIDDHAM LETTER THREE-CIRCLE ALTERNATE I..SIDDHAM LETTER ALTERNATE U +11600..1162F ; Grapheme_Base # Lo [48] MODI LETTER A..MODI LETTER LLA +11630..11632 ; Grapheme_Base # Mc [3] MODI VOWEL SIGN AA..MODI VOWEL SIGN II +1163B..1163C ; Grapheme_Base # Mc [2] MODI VOWEL SIGN O..MODI VOWEL SIGN AU +1163E ; Grapheme_Base # Mc MODI SIGN VISARGA +11641..11643 ; Grapheme_Base # Po [3] MODI DANDA..MODI ABBREVIATION SIGN +11644 ; Grapheme_Base # Lo MODI SIGN HUVA +11650..11659 ; Grapheme_Base # Nd [10] MODI DIGIT ZERO..MODI DIGIT NINE +11660..1166C ; Grapheme_Base # Po [13] MONGOLIAN BIRGA WITH ORNAMENT..MONGOLIAN TURNED SWIRL BIRGA WITH DOUBLE ORNAMENT +11680..116AA ; Grapheme_Base # Lo [43] TAKRI LETTER A..TAKRI LETTER RRA +116AC ; Grapheme_Base # Mc TAKRI SIGN VISARGA +116AE..116AF ; Grapheme_Base # Mc [2] TAKRI VOWEL SIGN I..TAKRI VOWEL SIGN II +116B6 ; Grapheme_Base # Mc TAKRI SIGN VIRAMA +116C0..116C9 ; Grapheme_Base # Nd [10] TAKRI DIGIT ZERO..TAKRI DIGIT NINE +11700..1171A ; Grapheme_Base # Lo [27] AHOM LETTER KA..AHOM LETTER ALTERNATE BA +11720..11721 ; Grapheme_Base # Mc [2] AHOM VOWEL SIGN A..AHOM VOWEL SIGN AA +11726 ; Grapheme_Base # Mc AHOM VOWEL SIGN E +11730..11739 ; Grapheme_Base # Nd [10] AHOM DIGIT ZERO..AHOM DIGIT NINE +1173A..1173B ; Grapheme_Base # No [2] AHOM NUMBER TEN..AHOM NUMBER TWENTY +1173C..1173E ; Grapheme_Base # Po [3] AHOM SIGN SMALL SECTION..AHOM SIGN RULAI +1173F ; Grapheme_Base # So AHOM SYMBOL VI +11800..1182B ; Grapheme_Base # Lo [44] DOGRA LETTER A..DOGRA LETTER RRA +1182C..1182E ; Grapheme_Base # Mc [3] DOGRA VOWEL SIGN AA..DOGRA VOWEL SIGN II +11838 ; Grapheme_Base # Mc DOGRA SIGN VISARGA +1183B ; Grapheme_Base # Po DOGRA ABBREVIATION SIGN +118A0..118DF ; Grapheme_Base # L& [64] WARANG CITI CAPITAL LETTER NGAA..WARANG CITI SMALL LETTER VIYO +118E0..118E9 ; Grapheme_Base # Nd [10] WARANG CITI DIGIT ZERO..WARANG CITI DIGIT NINE +118EA..118F2 ; Grapheme_Base # No [9] WARANG CITI NUMBER TEN..WARANG CITI NUMBER NINETY +118FF ; Grapheme_Base # Lo WARANG CITI OM +11A00 ; Grapheme_Base # Lo ZANABAZAR SQUARE LETTER A +11A0B..11A32 ; Grapheme_Base # Lo [40] ZANABAZAR SQUARE LETTER KA..ZANABAZAR SQUARE LETTER KSSA +11A39 ; Grapheme_Base # Mc ZANABAZAR SQUARE SIGN VISARGA +11A3A ; Grapheme_Base # Lo ZANABAZAR SQUARE CLUSTER-INITIAL LETTER RA +11A3F..11A46 ; Grapheme_Base # Po [8] ZANABAZAR SQUARE INITIAL HEAD MARK..ZANABAZAR SQUARE CLOSING DOUBLE-LINED HEAD MARK +11A50 ; Grapheme_Base # Lo SOYOMBO LETTER A +11A57..11A58 ; Grapheme_Base # Mc [2] SOYOMBO VOWEL SIGN AI..SOYOMBO VOWEL SIGN AU +11A5C..11A83 ; Grapheme_Base # Lo [40] SOYOMBO LETTER KA..SOYOMBO LETTER KSSA +11A86..11A89 ; Grapheme_Base # Lo [4] SOYOMBO CLUSTER-INITIAL LETTER RA..SOYOMBO CLUSTER-INITIAL LETTER SA +11A97 ; Grapheme_Base # Mc SOYOMBO SIGN VISARGA +11A9A..11A9C ; Grapheme_Base # Po [3] SOYOMBO MARK TSHEG..SOYOMBO MARK DOUBLE SHAD +11A9D ; Grapheme_Base # Lo SOYOMBO MARK PLUTA +11A9E..11AA2 ; Grapheme_Base # Po [5] SOYOMBO HEAD MARK WITH MOON AND SUN AND TRIPLE FLAME..SOYOMBO TERMINAL MARK-2 +11AC0..11AF8 ; Grapheme_Base # Lo [57] PAU CIN HAU LETTER PA..PAU CIN HAU GLOTTAL STOP FINAL +11C00..11C08 ; Grapheme_Base # Lo [9] BHAIKSUKI LETTER A..BHAIKSUKI LETTER VOCALIC L +11C0A..11C2E ; Grapheme_Base # Lo [37] BHAIKSUKI LETTER E..BHAIKSUKI LETTER HA +11C2F ; Grapheme_Base # Mc BHAIKSUKI VOWEL SIGN AA +11C3E ; Grapheme_Base # Mc BHAIKSUKI SIGN VISARGA +11C40 ; Grapheme_Base # Lo BHAIKSUKI SIGN AVAGRAHA +11C41..11C45 ; Grapheme_Base # Po [5] BHAIKSUKI DANDA..BHAIKSUKI GAP FILLER-2 +11C50..11C59 ; Grapheme_Base # Nd [10] BHAIKSUKI DIGIT ZERO..BHAIKSUKI DIGIT NINE +11C5A..11C6C ; Grapheme_Base # No [19] BHAIKSUKI NUMBER ONE..BHAIKSUKI HUNDREDS UNIT MARK +11C70..11C71 ; Grapheme_Base # Po [2] MARCHEN HEAD MARK..MARCHEN MARK SHAD +11C72..11C8F ; Grapheme_Base # Lo [30] MARCHEN LETTER KA..MARCHEN LETTER A +11CA9 ; Grapheme_Base # Mc MARCHEN SUBJOINED LETTER YA +11CB1 ; Grapheme_Base # Mc MARCHEN VOWEL SIGN I +11CB4 ; Grapheme_Base # Mc MARCHEN VOWEL SIGN O +11D00..11D06 ; Grapheme_Base # Lo [7] MASARAM GONDI LETTER A..MASARAM GONDI LETTER E +11D08..11D09 ; Grapheme_Base # Lo [2] MASARAM GONDI LETTER AI..MASARAM GONDI LETTER O +11D0B..11D30 ; Grapheme_Base # Lo [38] MASARAM GONDI LETTER AU..MASARAM GONDI LETTER TRA +11D46 ; Grapheme_Base # Lo MASARAM GONDI REPHA +11D50..11D59 ; Grapheme_Base # Nd [10] MASARAM GONDI DIGIT ZERO..MASARAM GONDI DIGIT NINE +11D60..11D65 ; Grapheme_Base # Lo [6] GUNJALA GONDI LETTER A..GUNJALA GONDI LETTER UU +11D67..11D68 ; Grapheme_Base # Lo [2] GUNJALA GONDI LETTER EE..GUNJALA GONDI LETTER AI +11D6A..11D89 ; Grapheme_Base # Lo [32] GUNJALA GONDI LETTER OO..GUNJALA GONDI LETTER SA +11D8A..11D8E ; Grapheme_Base # Mc [5] GUNJALA GONDI VOWEL SIGN AA..GUNJALA GONDI VOWEL SIGN UU +11D93..11D94 ; Grapheme_Base # Mc [2] GUNJALA GONDI VOWEL SIGN OO..GUNJALA GONDI VOWEL SIGN AU +11D96 ; Grapheme_Base # Mc GUNJALA GONDI SIGN VISARGA +11D98 ; Grapheme_Base # Lo GUNJALA GONDI OM +11DA0..11DA9 ; Grapheme_Base # Nd [10] GUNJALA GONDI DIGIT ZERO..GUNJALA GONDI DIGIT NINE +11EE0..11EF2 ; Grapheme_Base # Lo [19] MAKASAR LETTER KA..MAKASAR ANGKA +11EF5..11EF6 ; Grapheme_Base # Mc [2] MAKASAR VOWEL SIGN E..MAKASAR VOWEL SIGN O +11EF7..11EF8 ; Grapheme_Base # Po [2] MAKASAR PASSIMBANG..MAKASAR END OF SECTION +12000..12399 ; Grapheme_Base # Lo [922] CUNEIFORM SIGN A..CUNEIFORM SIGN U U +12400..1246E ; Grapheme_Base # Nl [111] CUNEIFORM NUMERIC SIGN TWO ASH..CUNEIFORM NUMERIC SIGN NINE U VARIANT FORM +12470..12474 ; Grapheme_Base # Po [5] CUNEIFORM PUNCTUATION SIGN OLD ASSYRIAN WORD DIVIDER..CUNEIFORM PUNCTUATION SIGN DIAGONAL QUADCOLON +12480..12543 ; Grapheme_Base # Lo [196] CUNEIFORM SIGN AB TIMES NUN TENU..CUNEIFORM SIGN ZU5 TIMES THREE DISH TENU +13000..1342E ; Grapheme_Base # Lo [1071] EGYPTIAN HIEROGLYPH A001..EGYPTIAN HIEROGLYPH AA032 +14400..14646 ; Grapheme_Base # Lo [583] ANATOLIAN HIEROGLYPH A001..ANATOLIAN HIEROGLYPH A530 +16800..16A38 ; Grapheme_Base # Lo [569] BAMUM LETTER PHASE-A NGKUE MFON..BAMUM LETTER PHASE-F VUEQ +16A40..16A5E ; Grapheme_Base # Lo [31] MRO LETTER TA..MRO LETTER TEK +16A60..16A69 ; Grapheme_Base # Nd [10] MRO DIGIT ZERO..MRO DIGIT NINE +16A6E..16A6F ; Grapheme_Base # Po [2] MRO DANDA..MRO DOUBLE DANDA +16AD0..16AED ; Grapheme_Base # Lo [30] BASSA VAH LETTER ENNI..BASSA VAH LETTER I +16AF5 ; Grapheme_Base # Po BASSA VAH FULL STOP +16B00..16B2F ; Grapheme_Base # Lo [48] PAHAWH HMONG VOWEL KEEB..PAHAWH HMONG CONSONANT CAU +16B37..16B3B ; Grapheme_Base # Po [5] PAHAWH HMONG SIGN VOS THOM..PAHAWH HMONG SIGN VOS FEEM +16B3C..16B3F ; Grapheme_Base # So [4] PAHAWH HMONG SIGN XYEEM NTXIV..PAHAWH HMONG SIGN XYEEM FAIB +16B40..16B43 ; Grapheme_Base # Lm [4] PAHAWH HMONG SIGN VOS SEEV..PAHAWH HMONG SIGN IB YAM +16B44 ; Grapheme_Base # Po PAHAWH HMONG SIGN XAUS +16B45 ; Grapheme_Base # So PAHAWH HMONG SIGN CIM TSOV ROG +16B50..16B59 ; Grapheme_Base # Nd [10] PAHAWH HMONG DIGIT ZERO..PAHAWH HMONG DIGIT NINE +16B5B..16B61 ; Grapheme_Base # No [7] PAHAWH HMONG NUMBER TENS..PAHAWH HMONG NUMBER TRILLIONS +16B63..16B77 ; Grapheme_Base # Lo [21] PAHAWH HMONG SIGN VOS LUB..PAHAWH HMONG SIGN CIM NRES TOS +16B7D..16B8F ; Grapheme_Base # Lo [19] PAHAWH HMONG CLAN SIGN TSHEEJ..PAHAWH HMONG CLAN SIGN VWJ +16E40..16E7F ; Grapheme_Base # L& [64] MEDEFAIDRIN CAPITAL LETTER M..MEDEFAIDRIN SMALL LETTER Y +16E80..16E96 ; Grapheme_Base # No [23] MEDEFAIDRIN DIGIT ZERO..MEDEFAIDRIN DIGIT THREE ALTERNATE FORM +16E97..16E9A ; Grapheme_Base # Po [4] MEDEFAIDRIN COMMA..MEDEFAIDRIN EXCLAMATION OH +16F00..16F44 ; Grapheme_Base # Lo [69] MIAO LETTER PA..MIAO LETTER HHA +16F50 ; Grapheme_Base # Lo MIAO LETTER NASALIZATION +16F51..16F7E ; Grapheme_Base # Mc [46] MIAO SIGN ASPIRATION..MIAO VOWEL SIGN NG +16F93..16F9F ; Grapheme_Base # Lm [13] MIAO LETTER TONE-2..MIAO LETTER REFORMED TONE-8 +16FE0..16FE1 ; Grapheme_Base # Lm [2] TANGUT ITERATION MARK..NUSHU ITERATION MARK +17000..187F1 ; Grapheme_Base # Lo [6130] TANGUT IDEOGRAPH-17000..TANGUT IDEOGRAPH-187F1 +18800..18AF2 ; Grapheme_Base # Lo [755] TANGUT COMPONENT-001..TANGUT COMPONENT-755 +1B000..1B11E ; Grapheme_Base # Lo [287] KATAKANA LETTER ARCHAIC E..HENTAIGANA LETTER N-MU-MO-2 +1B170..1B2FB ; Grapheme_Base # Lo [396] NUSHU CHARACTER-1B170..NUSHU CHARACTER-1B2FB +1BC00..1BC6A ; Grapheme_Base # Lo [107] DUPLOYAN LETTER H..DUPLOYAN LETTER VOCALIC M +1BC70..1BC7C ; Grapheme_Base # Lo [13] DUPLOYAN AFFIX LEFT HORIZONTAL SECANT..DUPLOYAN AFFIX ATTACHED TANGENT HOOK +1BC80..1BC88 ; Grapheme_Base # Lo [9] DUPLOYAN AFFIX HIGH ACUTE..DUPLOYAN AFFIX HIGH VERTICAL +1BC90..1BC99 ; Grapheme_Base # Lo [10] DUPLOYAN AFFIX LOW ACUTE..DUPLOYAN AFFIX LOW ARROW +1BC9C ; Grapheme_Base # So DUPLOYAN SIGN O WITH CROSS +1BC9F ; Grapheme_Base # Po DUPLOYAN PUNCTUATION CHINOOK FULL STOP +1D000..1D0F5 ; Grapheme_Base # So [246] BYZANTINE MUSICAL SYMBOL PSILI..BYZANTINE MUSICAL SYMBOL GORGON NEO KATO +1D100..1D126 ; Grapheme_Base # So [39] MUSICAL SYMBOL SINGLE BARLINE..MUSICAL SYMBOL DRUM CLEF-2 +1D129..1D164 ; Grapheme_Base # So [60] MUSICAL SYMBOL MULTIPLE MEASURE REST..MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH NOTE +1D166 ; Grapheme_Base # Mc MUSICAL SYMBOL COMBINING SPRECHGESANG STEM +1D16A..1D16C ; Grapheme_Base # So [3] MUSICAL SYMBOL FINGERED TREMOLO-1..MUSICAL SYMBOL FINGERED TREMOLO-3 +1D16D ; Grapheme_Base # Mc MUSICAL SYMBOL COMBINING AUGMENTATION DOT +1D183..1D184 ; Grapheme_Base # So [2] MUSICAL SYMBOL ARPEGGIATO UP..MUSICAL SYMBOL ARPEGGIATO DOWN +1D18C..1D1A9 ; Grapheme_Base # So [30] MUSICAL SYMBOL RINFORZANDO..MUSICAL SYMBOL DEGREE SLASH +1D1AE..1D1E8 ; Grapheme_Base # So [59] MUSICAL SYMBOL PEDAL MARK..MUSICAL SYMBOL KIEVAN FLAT SIGN +1D200..1D241 ; Grapheme_Base # So [66] GREEK VOCAL NOTATION SYMBOL-1..GREEK INSTRUMENTAL NOTATION SYMBOL-54 +1D245 ; Grapheme_Base # So GREEK MUSICAL LEIMMA +1D2E0..1D2F3 ; Grapheme_Base # No [20] MAYAN NUMERAL ZERO..MAYAN NUMERAL NINETEEN +1D300..1D356 ; Grapheme_Base # So [87] MONOGRAM FOR EARTH..TETRAGRAM FOR FOSTERING +1D360..1D378 ; Grapheme_Base # No [25] COUNTING ROD UNIT DIGIT ONE..TALLY MARK FIVE +1D400..1D454 ; Grapheme_Base # L& [85] MATHEMATICAL BOLD CAPITAL A..MATHEMATICAL ITALIC SMALL G +1D456..1D49C ; Grapheme_Base # L& [71] MATHEMATICAL ITALIC SMALL I..MATHEMATICAL SCRIPT CAPITAL A +1D49E..1D49F ; Grapheme_Base # L& [2] MATHEMATICAL SCRIPT CAPITAL C..MATHEMATICAL SCRIPT CAPITAL D +1D4A2 ; Grapheme_Base # L& MATHEMATICAL SCRIPT CAPITAL G +1D4A5..1D4A6 ; Grapheme_Base # L& [2] MATHEMATICAL SCRIPT CAPITAL J..MATHEMATICAL SCRIPT CAPITAL K +1D4A9..1D4AC ; Grapheme_Base # L& [4] MATHEMATICAL SCRIPT CAPITAL N..MATHEMATICAL SCRIPT CAPITAL Q +1D4AE..1D4B9 ; Grapheme_Base # L& [12] MATHEMATICAL SCRIPT CAPITAL S..MATHEMATICAL SCRIPT SMALL D +1D4BB ; Grapheme_Base # L& MATHEMATICAL SCRIPT SMALL F +1D4BD..1D4C3 ; Grapheme_Base # L& [7] MATHEMATICAL SCRIPT SMALL H..MATHEMATICAL SCRIPT SMALL N +1D4C5..1D505 ; Grapheme_Base # L& [65] MATHEMATICAL SCRIPT SMALL P..MATHEMATICAL FRAKTUR CAPITAL B +1D507..1D50A ; Grapheme_Base # L& [4] MATHEMATICAL FRAKTUR CAPITAL D..MATHEMATICAL FRAKTUR CAPITAL G +1D50D..1D514 ; Grapheme_Base # L& [8] MATHEMATICAL FRAKTUR CAPITAL J..MATHEMATICAL FRAKTUR CAPITAL Q +1D516..1D51C ; Grapheme_Base # L& [7] MATHEMATICAL FRAKTUR CAPITAL S..MATHEMATICAL FRAKTUR CAPITAL Y +1D51E..1D539 ; Grapheme_Base # L& [28] MATHEMATICAL FRAKTUR SMALL A..MATHEMATICAL DOUBLE-STRUCK CAPITAL B +1D53B..1D53E ; Grapheme_Base # L& [4] MATHEMATICAL DOUBLE-STRUCK CAPITAL D..MATHEMATICAL DOUBLE-STRUCK CAPITAL G +1D540..1D544 ; Grapheme_Base # L& [5] MATHEMATICAL DOUBLE-STRUCK CAPITAL I..MATHEMATICAL DOUBLE-STRUCK CAPITAL M +1D546 ; Grapheme_Base # L& MATHEMATICAL DOUBLE-STRUCK CAPITAL O +1D54A..1D550 ; Grapheme_Base # L& [7] MATHEMATICAL DOUBLE-STRUCK CAPITAL S..MATHEMATICAL DOUBLE-STRUCK CAPITAL Y +1D552..1D6A5 ; Grapheme_Base # L& [340] MATHEMATICAL DOUBLE-STRUCK SMALL A..MATHEMATICAL ITALIC SMALL DOTLESS J +1D6A8..1D6C0 ; Grapheme_Base # L& [25] MATHEMATICAL BOLD CAPITAL ALPHA..MATHEMATICAL BOLD CAPITAL OMEGA +1D6C1 ; Grapheme_Base # Sm MATHEMATICAL BOLD NABLA +1D6C2..1D6DA ; Grapheme_Base # L& [25] MATHEMATICAL BOLD SMALL ALPHA..MATHEMATICAL BOLD SMALL OMEGA +1D6DB ; Grapheme_Base # Sm MATHEMATICAL BOLD PARTIAL DIFFERENTIAL +1D6DC..1D6FA ; Grapheme_Base # L& [31] MATHEMATICAL BOLD EPSILON SYMBOL..MATHEMATICAL ITALIC CAPITAL OMEGA +1D6FB ; Grapheme_Base # Sm MATHEMATICAL ITALIC NABLA +1D6FC..1D714 ; Grapheme_Base # L& [25] MATHEMATICAL ITALIC SMALL ALPHA..MATHEMATICAL ITALIC SMALL OMEGA +1D715 ; Grapheme_Base # Sm MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL +1D716..1D734 ; Grapheme_Base # L& [31] MATHEMATICAL ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD ITALIC CAPITAL OMEGA +1D735 ; Grapheme_Base # Sm MATHEMATICAL BOLD ITALIC NABLA +1D736..1D74E ; Grapheme_Base # L& [25] MATHEMATICAL BOLD ITALIC SMALL ALPHA..MATHEMATICAL BOLD ITALIC SMALL OMEGA +1D74F ; Grapheme_Base # Sm MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL +1D750..1D76E ; Grapheme_Base # L& [31] MATHEMATICAL BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA +1D76F ; Grapheme_Base # Sm MATHEMATICAL SANS-SERIF BOLD NABLA +1D770..1D788 ; Grapheme_Base # L& [25] MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA +1D789 ; Grapheme_Base # Sm MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL +1D78A..1D7A8 ; Grapheme_Base # L& [31] MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA +1D7A9 ; Grapheme_Base # Sm MATHEMATICAL SANS-SERIF BOLD ITALIC NABLA +1D7AA..1D7C2 ; Grapheme_Base # L& [25] MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA +1D7C3 ; Grapheme_Base # Sm MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL +1D7C4..1D7CB ; Grapheme_Base # L& [8] MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD SMALL DIGAMMA +1D7CE..1D7FF ; Grapheme_Base # Nd [50] MATHEMATICAL BOLD DIGIT ZERO..MATHEMATICAL MONOSPACE DIGIT NINE +1D800..1D9FF ; Grapheme_Base # So [512] SIGNWRITING HAND-FIST INDEX..SIGNWRITING HEAD +1DA37..1DA3A ; Grapheme_Base # So [4] SIGNWRITING AIR BLOW SMALL ROTATIONS..SIGNWRITING BREATH EXHALE +1DA6D..1DA74 ; Grapheme_Base # So [8] SIGNWRITING SHOULDER HIP SPINE..SIGNWRITING TORSO-FLOORPLANE TWISTING +1DA76..1DA83 ; Grapheme_Base # So [14] SIGNWRITING LIMB COMBINATION..SIGNWRITING LOCATION DEPTH +1DA85..1DA86 ; Grapheme_Base # So [2] SIGNWRITING LOCATION TORSO..SIGNWRITING LOCATION LIMBS DIGITS +1DA87..1DA8B ; Grapheme_Base # Po [5] SIGNWRITING COMMA..SIGNWRITING PARENTHESIS +1E800..1E8C4 ; Grapheme_Base # Lo [197] MENDE KIKAKUI SYLLABLE M001 KI..MENDE KIKAKUI SYLLABLE M060 NYON +1E8C7..1E8CF ; Grapheme_Base # No [9] MENDE KIKAKUI DIGIT ONE..MENDE KIKAKUI DIGIT NINE +1E900..1E943 ; Grapheme_Base # L& [68] ADLAM CAPITAL LETTER ALIF..ADLAM SMALL LETTER SHA +1E950..1E959 ; Grapheme_Base # Nd [10] ADLAM DIGIT ZERO..ADLAM DIGIT NINE +1E95E..1E95F ; Grapheme_Base # Po [2] ADLAM INITIAL EXCLAMATION MARK..ADLAM INITIAL QUESTION MARK +1EC71..1ECAB ; Grapheme_Base # No [59] INDIC SIYAQ NUMBER ONE..INDIC SIYAQ NUMBER PREFIXED NINE +1ECAC ; Grapheme_Base # So INDIC SIYAQ PLACEHOLDER +1ECAD..1ECAF ; Grapheme_Base # No [3] INDIC SIYAQ FRACTION ONE QUARTER..INDIC SIYAQ FRACTION THREE QUARTERS +1ECB0 ; Grapheme_Base # Sc INDIC SIYAQ RUPEE MARK +1ECB1..1ECB4 ; Grapheme_Base # No [4] INDIC SIYAQ NUMBER ALTERNATE ONE..INDIC SIYAQ ALTERNATE LAKH MARK +1EE00..1EE03 ; Grapheme_Base # Lo [4] ARABIC MATHEMATICAL ALEF..ARABIC MATHEMATICAL DAL +1EE05..1EE1F ; Grapheme_Base # Lo [27] ARABIC MATHEMATICAL WAW..ARABIC MATHEMATICAL DOTLESS QAF +1EE21..1EE22 ; Grapheme_Base # Lo [2] ARABIC MATHEMATICAL INITIAL BEH..ARABIC MATHEMATICAL INITIAL JEEM +1EE24 ; Grapheme_Base # Lo ARABIC MATHEMATICAL INITIAL HEH +1EE27 ; Grapheme_Base # Lo ARABIC MATHEMATICAL INITIAL HAH +1EE29..1EE32 ; Grapheme_Base # Lo [10] ARABIC MATHEMATICAL INITIAL YEH..ARABIC MATHEMATICAL INITIAL QAF +1EE34..1EE37 ; Grapheme_Base # Lo [4] ARABIC MATHEMATICAL INITIAL SHEEN..ARABIC MATHEMATICAL INITIAL KHAH +1EE39 ; Grapheme_Base # Lo ARABIC MATHEMATICAL INITIAL DAD +1EE3B ; Grapheme_Base # Lo ARABIC MATHEMATICAL INITIAL GHAIN +1EE42 ; Grapheme_Base # Lo ARABIC MATHEMATICAL TAILED JEEM +1EE47 ; Grapheme_Base # Lo ARABIC MATHEMATICAL TAILED HAH +1EE49 ; Grapheme_Base # Lo ARABIC MATHEMATICAL TAILED YEH +1EE4B ; Grapheme_Base # Lo ARABIC MATHEMATICAL TAILED LAM +1EE4D..1EE4F ; Grapheme_Base # Lo [3] ARABIC MATHEMATICAL TAILED NOON..ARABIC MATHEMATICAL TAILED AIN +1EE51..1EE52 ; Grapheme_Base # Lo [2] ARABIC MATHEMATICAL TAILED SAD..ARABIC MATHEMATICAL TAILED QAF +1EE54 ; Grapheme_Base # Lo ARABIC MATHEMATICAL TAILED SHEEN +1EE57 ; Grapheme_Base # Lo ARABIC MATHEMATICAL TAILED KHAH +1EE59 ; Grapheme_Base # Lo ARABIC MATHEMATICAL TAILED DAD +1EE5B ; Grapheme_Base # Lo ARABIC MATHEMATICAL TAILED GHAIN +1EE5D ; Grapheme_Base # Lo ARABIC MATHEMATICAL TAILED DOTLESS NOON +1EE5F ; Grapheme_Base # Lo ARABIC MATHEMATICAL TAILED DOTLESS QAF +1EE61..1EE62 ; Grapheme_Base # Lo [2] ARABIC MATHEMATICAL STRETCHED BEH..ARABIC MATHEMATICAL STRETCHED JEEM +1EE64 ; Grapheme_Base # Lo ARABIC MATHEMATICAL STRETCHED HEH +1EE67..1EE6A ; Grapheme_Base # Lo [4] ARABIC MATHEMATICAL STRETCHED HAH..ARABIC MATHEMATICAL STRETCHED KAF +1EE6C..1EE72 ; Grapheme_Base # Lo [7] ARABIC MATHEMATICAL STRETCHED MEEM..ARABIC MATHEMATICAL STRETCHED QAF +1EE74..1EE77 ; Grapheme_Base # Lo [4] ARABIC MATHEMATICAL STRETCHED SHEEN..ARABIC MATHEMATICAL STRETCHED KHAH +1EE79..1EE7C ; Grapheme_Base # Lo [4] ARABIC MATHEMATICAL STRETCHED DAD..ARABIC MATHEMATICAL STRETCHED DOTLESS BEH +1EE7E ; Grapheme_Base # Lo ARABIC MATHEMATICAL STRETCHED DOTLESS FEH +1EE80..1EE89 ; Grapheme_Base # Lo [10] ARABIC MATHEMATICAL LOOPED ALEF..ARABIC MATHEMATICAL LOOPED YEH +1EE8B..1EE9B ; Grapheme_Base # Lo [17] ARABIC MATHEMATICAL LOOPED LAM..ARABIC MATHEMATICAL LOOPED GHAIN +1EEA1..1EEA3 ; Grapheme_Base # Lo [3] ARABIC MATHEMATICAL DOUBLE-STRUCK BEH..ARABIC MATHEMATICAL DOUBLE-STRUCK DAL +1EEA5..1EEA9 ; Grapheme_Base # Lo [5] ARABIC MATHEMATICAL DOUBLE-STRUCK WAW..ARABIC MATHEMATICAL DOUBLE-STRUCK YEH +1EEAB..1EEBB ; Grapheme_Base # Lo [17] ARABIC MATHEMATICAL DOUBLE-STRUCK LAM..ARABIC MATHEMATICAL DOUBLE-STRUCK GHAIN +1EEF0..1EEF1 ; Grapheme_Base # Sm [2] ARABIC MATHEMATICAL OPERATOR MEEM WITH HAH WITH TATWEEL..ARABIC MATHEMATICAL OPERATOR HAH WITH DAL +1F000..1F02B ; Grapheme_Base # So [44] MAHJONG TILE EAST WIND..MAHJONG TILE BACK +1F030..1F093 ; Grapheme_Base # So [100] DOMINO TILE HORIZONTAL BACK..DOMINO TILE VERTICAL-06-06 +1F0A0..1F0AE ; Grapheme_Base # So [15] PLAYING CARD BACK..PLAYING CARD KING OF SPADES +1F0B1..1F0BF ; Grapheme_Base # So [15] PLAYING CARD ACE OF HEARTS..PLAYING CARD RED JOKER +1F0C1..1F0CF ; Grapheme_Base # So [15] PLAYING CARD ACE OF DIAMONDS..PLAYING CARD BLACK JOKER +1F0D1..1F0F5 ; Grapheme_Base # So [37] PLAYING CARD ACE OF CLUBS..PLAYING CARD TRUMP-21 +1F100..1F10C ; Grapheme_Base # No [13] DIGIT ZERO FULL STOP..DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ZERO +1F110..1F16B ; Grapheme_Base # So [92] PARENTHESIZED LATIN CAPITAL LETTER A..RAISED MD SIGN +1F170..1F1AC ; Grapheme_Base # So [61] NEGATIVE SQUARED LATIN CAPITAL LETTER A..SQUARED VOD +1F1E6..1F202 ; Grapheme_Base # So [29] REGIONAL INDICATOR SYMBOL LETTER A..SQUARED KATAKANA SA +1F210..1F23B ; Grapheme_Base # So [44] SQUARED CJK UNIFIED IDEOGRAPH-624B..SQUARED CJK UNIFIED IDEOGRAPH-914D +1F240..1F248 ; Grapheme_Base # So [9] TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-672C..TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-6557 +1F250..1F251 ; Grapheme_Base # So [2] CIRCLED IDEOGRAPH ADVANTAGE..CIRCLED IDEOGRAPH ACCEPT +1F260..1F265 ; Grapheme_Base # So [6] ROUNDED SYMBOL FOR FU..ROUNDED SYMBOL FOR CAI +1F300..1F3FA ; Grapheme_Base # So [251] CYCLONE..AMPHORA +1F3FB..1F3FF ; Grapheme_Base # Sk [5] EMOJI MODIFIER FITZPATRICK TYPE-1-2..EMOJI MODIFIER FITZPATRICK TYPE-6 +1F400..1F6D4 ; Grapheme_Base # So [725] RAT..PAGODA +1F6E0..1F6EC ; Grapheme_Base # So [13] HAMMER AND WRENCH..AIRPLANE ARRIVING +1F6F0..1F6F9 ; Grapheme_Base # So [10] SATELLITE..SKATEBOARD +1F700..1F773 ; Grapheme_Base # So [116] ALCHEMICAL SYMBOL FOR QUINTESSENCE..ALCHEMICAL SYMBOL FOR HALF OUNCE +1F780..1F7D8 ; Grapheme_Base # So [89] BLACK LEFT-POINTING ISOSCELES RIGHT TRIANGLE..NEGATIVE CIRCLED SQUARE +1F800..1F80B ; Grapheme_Base # So [12] LEFTWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD..DOWNWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD +1F810..1F847 ; Grapheme_Base # So [56] LEFTWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD..DOWNWARDS HEAVY ARROW +1F850..1F859 ; Grapheme_Base # So [10] LEFTWARDS SANS-SERIF ARROW..UP DOWN SANS-SERIF ARROW +1F860..1F887 ; Grapheme_Base # So [40] WIDE-HEADED LEFTWARDS LIGHT BARB ARROW..WIDE-HEADED SOUTH WEST VERY HEAVY BARB ARROW +1F890..1F8AD ; Grapheme_Base # So [30] LEFTWARDS TRIANGLE ARROWHEAD..WHITE ARROW SHAFT WIDTH TWO THIRDS +1F900..1F90B ; Grapheme_Base # So [12] CIRCLED CROSS FORMEE WITH FOUR DOTS..DOWNWARD FACING NOTCHED HOOK WITH DOT +1F910..1F93E ; Grapheme_Base # So [47] ZIPPER-MOUTH FACE..HANDBALL +1F940..1F970 ; Grapheme_Base # So [49] WILTED FLOWER..SMILING FACE WITH SMILING EYES AND THREE HEARTS +1F973..1F976 ; Grapheme_Base # So [4] FACE WITH PARTY HORN AND PARTY HAT..FREEZING FACE +1F97A ; Grapheme_Base # So FACE WITH PLEADING EYES +1F97C..1F9A2 ; Grapheme_Base # So [39] LAB COAT..SWAN +1F9B0..1F9B9 ; Grapheme_Base # So [10] EMOJI COMPONENT RED HAIR..SUPERVILLAIN +1F9C0..1F9C2 ; Grapheme_Base # So [3] CHEESE WEDGE..SALT SHAKER +1F9D0..1F9FF ; Grapheme_Base # So [48] FACE WITH MONOCLE..NAZAR AMULET +1FA60..1FA6D ; Grapheme_Base # So [14] XIANGQI RED GENERAL..XIANGQI BLACK SOLDIER +20000..2A6D6 ; Grapheme_Base # Lo [42711] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6D6 +2A700..2B734 ; Grapheme_Base # Lo [4149] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B734 +2B740..2B81D ; Grapheme_Base # Lo [222] CJK UNIFIED IDEOGRAPH-2B740..CJK UNIFIED IDEOGRAPH-2B81D +2B820..2CEA1 ; Grapheme_Base # Lo [5762] CJK UNIFIED IDEOGRAPH-2B820..CJK UNIFIED IDEOGRAPH-2CEA1 +2CEB0..2EBE0 ; Grapheme_Base # Lo [7473] CJK UNIFIED IDEOGRAPH-2CEB0..CJK UNIFIED IDEOGRAPH-2EBE0 +2F800..2FA1D ; Grapheme_Base # Lo [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D + +# Total code points: 135374 + +# ================================================ + +# Derived Property: Grapheme_Link (deprecated) +# Generated from: Canonical_Combining_Class=Virama +# Use Canonical_Combining_Class=Virama directly instead + +094D ; Grapheme_Link # Mn DEVANAGARI SIGN VIRAMA +09CD ; Grapheme_Link # Mn BENGALI SIGN VIRAMA +0A4D ; Grapheme_Link # Mn GURMUKHI SIGN VIRAMA +0ACD ; Grapheme_Link # Mn GUJARATI SIGN VIRAMA +0B4D ; Grapheme_Link # Mn ORIYA SIGN VIRAMA +0BCD ; Grapheme_Link # Mn TAMIL SIGN VIRAMA +0C4D ; Grapheme_Link # Mn TELUGU SIGN VIRAMA +0CCD ; Grapheme_Link # Mn KANNADA SIGN VIRAMA +0D3B..0D3C ; Grapheme_Link # Mn [2] MALAYALAM SIGN VERTICAL BAR VIRAMA..MALAYALAM SIGN CIRCULAR VIRAMA +0D4D ; Grapheme_Link # Mn MALAYALAM SIGN VIRAMA +0DCA ; Grapheme_Link # Mn SINHALA SIGN AL-LAKUNA +0E3A ; Grapheme_Link # Mn THAI CHARACTER PHINTHU +0F84 ; Grapheme_Link # Mn TIBETAN MARK HALANTA +1039..103A ; Grapheme_Link # Mn [2] MYANMAR SIGN VIRAMA..MYANMAR SIGN ASAT +1714 ; Grapheme_Link # Mn TAGALOG SIGN VIRAMA +1734 ; Grapheme_Link # Mn HANUNOO SIGN PAMUDPOD +17D2 ; Grapheme_Link # Mn KHMER SIGN COENG +1A60 ; Grapheme_Link # Mn TAI THAM SIGN SAKOT +1B44 ; Grapheme_Link # Mc BALINESE ADEG ADEG +1BAA ; Grapheme_Link # Mc SUNDANESE SIGN PAMAAEH +1BAB ; Grapheme_Link # Mn SUNDANESE SIGN VIRAMA +1BF2..1BF3 ; Grapheme_Link # Mc [2] BATAK PANGOLAT..BATAK PANONGONAN +2D7F ; Grapheme_Link # Mn TIFINAGH CONSONANT JOINER +A806 ; Grapheme_Link # Mn SYLOTI NAGRI SIGN HASANTA +A8C4 ; Grapheme_Link # Mn SAURASHTRA SIGN VIRAMA +A953 ; Grapheme_Link # Mc REJANG VIRAMA +A9C0 ; Grapheme_Link # Mc JAVANESE PANGKON +AAF6 ; Grapheme_Link # Mn MEETEI MAYEK VIRAMA +ABED ; Grapheme_Link # Mn MEETEI MAYEK APUN IYEK +10A3F ; Grapheme_Link # Mn KHAROSHTHI VIRAMA +11046 ; Grapheme_Link # Mn BRAHMI VIRAMA +1107F ; Grapheme_Link # Mn BRAHMI NUMBER JOINER +110B9 ; Grapheme_Link # Mn KAITHI SIGN VIRAMA +11133..11134 ; Grapheme_Link # Mn [2] CHAKMA VIRAMA..CHAKMA MAAYYAA +111C0 ; Grapheme_Link # Mc SHARADA SIGN VIRAMA +11235 ; Grapheme_Link # Mc KHOJKI SIGN VIRAMA +112EA ; Grapheme_Link # Mn KHUDAWADI SIGN VIRAMA +1134D ; Grapheme_Link # Mc GRANTHA SIGN VIRAMA +11442 ; Grapheme_Link # Mn NEWA SIGN VIRAMA +114C2 ; Grapheme_Link # Mn TIRHUTA SIGN VIRAMA +115BF ; Grapheme_Link # Mn SIDDHAM SIGN VIRAMA +1163F ; Grapheme_Link # Mn MODI SIGN VIRAMA +116B6 ; Grapheme_Link # Mc TAKRI SIGN VIRAMA +1172B ; Grapheme_Link # Mn AHOM SIGN KILLER +11839 ; Grapheme_Link # Mn DOGRA SIGN VIRAMA +11A34 ; Grapheme_Link # Mn ZANABAZAR SQUARE SIGN VIRAMA +11A47 ; Grapheme_Link # Mn ZANABAZAR SQUARE SUBJOINER +11A99 ; Grapheme_Link # Mn SOYOMBO SUBJOINER +11C3F ; Grapheme_Link # Mn BHAIKSUKI SIGN VIRAMA +11D44..11D45 ; Grapheme_Link # Mn [2] MASARAM GONDI SIGN HALANTA..MASARAM GONDI VIRAMA +11D97 ; Grapheme_Link # Mn GUNJALA GONDI VIRAMA + +# Total code points: 56 + +# EOF diff -Nru pypy-7.1.1+dfsg/rpython/rlib/unicodedata/EastAsianWidth-11.0.0.txt pypy-7.3.1+dfsg/rpython/rlib/unicodedata/EastAsianWidth-11.0.0.txt --- pypy-7.1.1+dfsg/rpython/rlib/unicodedata/EastAsianWidth-11.0.0.txt 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/rlib/unicodedata/EastAsianWidth-11.0.0.txt 2020-04-10 19:28:41.000000000 +0000 @@ -0,0 +1,2435 @@ +# EastAsianWidth-11.0.0.txt +# Date: 2018-05-14, 09:41:59 GMT [KW, LI] +# © 2018 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. +# +# 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: +# "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 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 +# "#" list the General_Category property value or the L& alias of the +# derived value LC, the Unicode character name or names, and, in lines +# with ranges of code points, the code point count in square brackets. +# +# For more information, see UAX #11: East Asian Width, +# at http://www.unicode.org/reports/tr11/ +# +# @missing: 0000..10FFFF; N +0000..001F;N # Cc [32] .. +0020;Na # Zs SPACE +0021..0023;Na # Po [3] EXCLAMATION MARK..NUMBER SIGN +0024;Na # Sc DOLLAR SIGN +0025..0027;Na # Po [3] PERCENT SIGN..APOSTROPHE +0028;Na # Ps LEFT PARENTHESIS +0029;Na # Pe RIGHT PARENTHESIS +002A;Na # Po ASTERISK +002B;Na # Sm PLUS SIGN +002C;Na # Po COMMA +002D;Na # Pd HYPHEN-MINUS +002E..002F;Na # Po [2] FULL STOP..SOLIDUS +0030..0039;Na # Nd [10] DIGIT ZERO..DIGIT NINE +003A..003B;Na # Po [2] COLON..SEMICOLON +003C..003E;Na # Sm [3] LESS-THAN SIGN..GREATER-THAN SIGN +003F..0040;Na # Po [2] QUESTION MARK..COMMERCIAL AT +0041..005A;Na # Lu [26] LATIN CAPITAL LETTER A..LATIN CAPITAL LETTER Z +005B;Na # Ps LEFT SQUARE BRACKET +005C;Na # Po REVERSE SOLIDUS +005D;Na # Pe RIGHT SQUARE BRACKET +005E;Na # Sk CIRCUMFLEX ACCENT +005F;Na # Pc LOW LINE +0060;Na # Sk GRAVE ACCENT +0061..007A;Na # Ll [26] LATIN SMALL LETTER A..LATIN SMALL LETTER Z +007B;Na # Ps LEFT CURLY BRACKET +007C;Na # Sm VERTICAL LINE +007D;Na # Pe RIGHT CURLY BRACKET +007E;Na # Sm TILDE +007F;N # Cc +0080..009F;N # Cc [32] .. +00A0;N # Zs NO-BREAK SPACE +00A1;A # Po INVERTED EXCLAMATION MARK +00A2..00A3;Na # Sc [2] CENT SIGN..POUND SIGN +00A4;A # Sc CURRENCY SIGN +00A5;Na # Sc YEN SIGN +00A6;Na # So BROKEN BAR +00A7;A # Po SECTION SIGN +00A8;A # Sk DIAERESIS +00A9;N # So COPYRIGHT SIGN +00AA;A # Lo FEMININE ORDINAL INDICATOR +00AB;N # Pi LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +00AC;Na # Sm NOT SIGN +00AD;A # Cf SOFT HYPHEN +00AE;A # So REGISTERED SIGN +00AF;Na # Sk MACRON +00B0;A # So DEGREE SIGN +00B1;A # Sm PLUS-MINUS SIGN +00B2..00B3;A # No [2] SUPERSCRIPT TWO..SUPERSCRIPT THREE +00B4;A # Sk ACUTE ACCENT +00B5;N # Ll MICRO SIGN +00B6..00B7;A # Po [2] PILCROW SIGN..MIDDLE DOT +00B8;A # Sk CEDILLA +00B9;A # No SUPERSCRIPT ONE +00BA;A # Lo MASCULINE ORDINAL INDICATOR +00BB;N # Pf RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +00BC..00BE;A # No [3] VULGAR FRACTION ONE QUARTER..VULGAR FRACTION THREE QUARTERS +00BF;A # Po INVERTED QUESTION MARK +00C0..00C5;N # Lu [6] LATIN CAPITAL LETTER A WITH GRAVE..LATIN CAPITAL LETTER A WITH RING ABOVE +00C6;A # Lu LATIN CAPITAL LETTER AE +00C7..00CF;N # Lu [9] LATIN CAPITAL LETTER C WITH CEDILLA..LATIN CAPITAL LETTER I WITH DIAERESIS +00D0;A # Lu LATIN CAPITAL LETTER ETH +00D1..00D6;N # Lu [6] LATIN CAPITAL LETTER N WITH TILDE..LATIN CAPITAL LETTER O WITH DIAERESIS +00D7;A # Sm MULTIPLICATION SIGN +00D8;A # Lu LATIN CAPITAL LETTER O WITH STROKE +00D9..00DD;N # Lu [5] LATIN CAPITAL LETTER U WITH GRAVE..LATIN CAPITAL LETTER Y WITH ACUTE +00DE..00E1;A # L& [4] LATIN CAPITAL LETTER THORN..LATIN SMALL LETTER A WITH ACUTE +00E2..00E5;N # Ll [4] LATIN SMALL LETTER A WITH CIRCUMFLEX..LATIN SMALL LETTER A WITH RING ABOVE +00E6;A # Ll LATIN SMALL LETTER AE +00E7;N # Ll LATIN SMALL LETTER C WITH CEDILLA +00E8..00EA;A # Ll [3] LATIN SMALL LETTER E WITH GRAVE..LATIN SMALL LETTER E WITH CIRCUMFLEX +00EB;N # Ll LATIN SMALL LETTER E WITH DIAERESIS +00EC..00ED;A # Ll [2] LATIN SMALL LETTER I WITH GRAVE..LATIN SMALL LETTER I WITH ACUTE +00EE..00EF;N # Ll [2] LATIN SMALL LETTER I WITH CIRCUMFLEX..LATIN SMALL LETTER I WITH DIAERESIS +00F0;A # Ll LATIN SMALL LETTER ETH +00F1;N # Ll LATIN SMALL LETTER N WITH TILDE +00F2..00F3;A # Ll [2] LATIN SMALL LETTER O WITH GRAVE..LATIN SMALL LETTER O WITH ACUTE +00F4..00F6;N # Ll [3] LATIN SMALL LETTER O WITH CIRCUMFLEX..LATIN SMALL LETTER O WITH DIAERESIS +00F7;A # Sm DIVISION SIGN +00F8..00FA;A # Ll [3] LATIN SMALL LETTER O WITH STROKE..LATIN SMALL LETTER U WITH ACUTE +00FB;N # Ll LATIN SMALL LETTER U WITH CIRCUMFLEX +00FC;A # Ll LATIN SMALL LETTER U WITH DIAERESIS +00FD;N # Ll LATIN SMALL LETTER Y WITH ACUTE +00FE;A # Ll LATIN SMALL LETTER THORN +00FF;N # Ll LATIN SMALL LETTER Y WITH DIAERESIS +0100;N # Lu LATIN CAPITAL LETTER A WITH MACRON +0101;A # Ll LATIN SMALL LETTER A WITH MACRON +0102..0110;N # L& [15] LATIN CAPITAL LETTER A WITH BREVE..LATIN CAPITAL LETTER D WITH STROKE +0111;A # Ll LATIN SMALL LETTER D WITH STROKE +0112;N # Lu LATIN CAPITAL LETTER E WITH MACRON +0113;A # Ll LATIN SMALL LETTER E WITH MACRON +0114..011A;N # L& [7] LATIN CAPITAL LETTER E WITH BREVE..LATIN CAPITAL LETTER E WITH CARON +011B;A # Ll LATIN SMALL LETTER E WITH CARON +011C..0125;N # L& [10] LATIN CAPITAL LETTER G WITH CIRCUMFLEX..LATIN SMALL LETTER H WITH CIRCUMFLEX +0126..0127;A # L& [2] LATIN CAPITAL LETTER H WITH STROKE..LATIN SMALL LETTER H WITH STROKE +0128..012A;N # L& [3] LATIN CAPITAL LETTER I WITH TILDE..LATIN CAPITAL LETTER I WITH MACRON +012B;A # Ll LATIN SMALL LETTER I WITH MACRON +012C..0130;N # L& [5] LATIN CAPITAL LETTER I WITH BREVE..LATIN CAPITAL LETTER I WITH DOT ABOVE +0131..0133;A # L& [3] LATIN SMALL LETTER DOTLESS I..LATIN SMALL LIGATURE IJ +0134..0137;N # L& [4] LATIN CAPITAL LETTER J WITH CIRCUMFLEX..LATIN SMALL LETTER K WITH CEDILLA +0138;A # Ll LATIN SMALL LETTER KRA +0139..013E;N # L& [6] LATIN CAPITAL LETTER L WITH ACUTE..LATIN SMALL LETTER L WITH CARON +013F..0142;A # L& [4] LATIN CAPITAL LETTER L WITH MIDDLE DOT..LATIN SMALL LETTER L WITH STROKE +0143;N # Lu LATIN CAPITAL LETTER N WITH ACUTE +0144;A # Ll LATIN SMALL LETTER N WITH ACUTE +0145..0147;N # L& [3] LATIN CAPITAL LETTER N WITH CEDILLA..LATIN CAPITAL LETTER N WITH CARON +0148..014B;A # L& [4] LATIN SMALL LETTER N WITH CARON..LATIN SMALL LETTER ENG +014C;N # Lu LATIN CAPITAL LETTER O WITH MACRON +014D;A # Ll LATIN SMALL LETTER O WITH MACRON +014E..0151;N # L& [4] LATIN CAPITAL LETTER O WITH BREVE..LATIN SMALL LETTER O WITH DOUBLE ACUTE +0152..0153;A # L& [2] LATIN CAPITAL LIGATURE OE..LATIN SMALL LIGATURE OE +0154..0165;N # L& [18] LATIN CAPITAL LETTER R WITH ACUTE..LATIN SMALL LETTER T WITH CARON +0166..0167;A # L& [2] LATIN CAPITAL LETTER T WITH STROKE..LATIN SMALL LETTER T WITH STROKE +0168..016A;N # L& [3] LATIN CAPITAL LETTER U WITH TILDE..LATIN CAPITAL LETTER U WITH MACRON +016B;A # Ll LATIN SMALL LETTER U WITH MACRON +016C..017F;N # L& [20] LATIN CAPITAL LETTER U WITH BREVE..LATIN SMALL LETTER LONG S +0180..01BA;N # L& [59] LATIN SMALL LETTER B WITH STROKE..LATIN SMALL LETTER EZH WITH TAIL +01BB;N # Lo LATIN LETTER TWO WITH STROKE +01BC..01BF;N # L& [4] LATIN CAPITAL LETTER TONE FIVE..LATIN LETTER WYNN +01C0..01C3;N # Lo [4] LATIN LETTER DENTAL CLICK..LATIN LETTER RETROFLEX CLICK +01C4..01CD;N # L& [10] LATIN CAPITAL LETTER DZ WITH CARON..LATIN CAPITAL LETTER A WITH CARON +01CE;A # Ll LATIN SMALL LETTER A WITH CARON +01CF;N # Lu LATIN CAPITAL LETTER I WITH CARON +01D0;A # Ll LATIN SMALL LETTER I WITH CARON +01D1;N # Lu LATIN CAPITAL LETTER O WITH CARON +01D2;A # Ll LATIN SMALL LETTER O WITH CARON +01D3;N # Lu LATIN CAPITAL LETTER U WITH CARON +01D4;A # Ll LATIN SMALL LETTER U WITH CARON +01D5;N # Lu LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON +01D6;A # Ll LATIN SMALL LETTER U WITH DIAERESIS AND MACRON +01D7;N # Lu LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE +01D8;A # Ll LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE +01D9;N # Lu LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON +01DA;A # Ll LATIN SMALL LETTER U WITH DIAERESIS AND CARON +01DB;N # Lu LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE +01DC;A # Ll LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE +01DD..024F;N # L& [115] LATIN SMALL LETTER TURNED E..LATIN SMALL LETTER Y WITH STROKE +0250;N # Ll LATIN SMALL LETTER TURNED A +0251;A # Ll LATIN SMALL LETTER ALPHA +0252..0260;N # Ll [15] LATIN SMALL LETTER TURNED ALPHA..LATIN SMALL LETTER G WITH HOOK +0261;A # Ll LATIN SMALL LETTER SCRIPT G +0262..0293;N # Ll [50] LATIN LETTER SMALL CAPITAL G..LATIN SMALL LETTER EZH WITH CURL +0294;N # Lo LATIN LETTER GLOTTAL STOP +0295..02AF;N # Ll [27] LATIN LETTER PHARYNGEAL VOICED FRICATIVE..LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL +02B0..02C1;N # Lm [18] MODIFIER LETTER SMALL H..MODIFIER LETTER REVERSED GLOTTAL STOP +02C2..02C3;N # Sk [2] MODIFIER LETTER LEFT ARROWHEAD..MODIFIER LETTER RIGHT ARROWHEAD +02C4;A # Sk MODIFIER LETTER UP ARROWHEAD +02C5;N # Sk MODIFIER LETTER DOWN ARROWHEAD +02C6;N # Lm MODIFIER LETTER CIRCUMFLEX ACCENT +02C7;A # Lm CARON +02C8;N # Lm MODIFIER LETTER VERTICAL LINE +02C9..02CB;A # Lm [3] MODIFIER LETTER MACRON..MODIFIER LETTER GRAVE ACCENT +02CC;N # Lm MODIFIER LETTER LOW VERTICAL LINE +02CD;A # Lm MODIFIER LETTER LOW MACRON +02CE..02CF;N # Lm [2] MODIFIER LETTER LOW GRAVE ACCENT..MODIFIER LETTER LOW ACUTE ACCENT +02D0;A # Lm MODIFIER LETTER TRIANGULAR COLON +02D1;N # Lm MODIFIER LETTER HALF TRIANGULAR COLON +02D2..02D7;N # Sk [6] MODIFIER LETTER CENTRED RIGHT HALF RING..MODIFIER LETTER MINUS SIGN +02D8..02DB;A # Sk [4] BREVE..OGONEK +02DC;N # Sk SMALL TILDE +02DD;A # Sk DOUBLE ACUTE ACCENT +02DE;N # Sk MODIFIER LETTER RHOTIC HOOK +02DF;A # Sk MODIFIER LETTER CROSS ACCENT +02E0..02E4;N # Lm [5] MODIFIER LETTER SMALL GAMMA..MODIFIER LETTER SMALL REVERSED GLOTTAL STOP +02E5..02EB;N # Sk [7] MODIFIER LETTER EXTRA-HIGH TONE BAR..MODIFIER LETTER YANG DEPARTING TONE MARK +02EC;N # Lm MODIFIER LETTER VOICING +02ED;N # Sk MODIFIER LETTER UNASPIRATED +02EE;N # Lm MODIFIER LETTER DOUBLE APOSTROPHE +02EF..02FF;N # Sk [17] MODIFIER LETTER LOW DOWN ARROWHEAD..MODIFIER LETTER LOW LEFT ARROW +0300..036F;A # Mn [112] COMBINING GRAVE ACCENT..COMBINING LATIN SMALL LETTER X +0370..0373;N # L& [4] GREEK CAPITAL LETTER HETA..GREEK SMALL LETTER ARCHAIC SAMPI +0374;N # Lm GREEK NUMERAL SIGN +0375;N # Sk GREEK LOWER NUMERAL SIGN +0376..0377;N # L& [2] GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA..GREEK SMALL LETTER PAMPHYLIAN DIGAMMA +037A;N # Lm GREEK YPOGEGRAMMENI +037B..037D;N # Ll [3] GREEK SMALL REVERSED LUNATE SIGMA SYMBOL..GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL +037E;N # Po GREEK QUESTION MARK +037F;N # Lu GREEK CAPITAL LETTER YOT +0384..0385;N # Sk [2] GREEK TONOS..GREEK DIALYTIKA TONOS +0386;N # Lu GREEK CAPITAL LETTER ALPHA WITH TONOS +0387;N # Po GREEK ANO TELEIA +0388..038A;N # Lu [3] GREEK CAPITAL LETTER EPSILON WITH TONOS..GREEK CAPITAL LETTER IOTA WITH TONOS +038C;N # Lu GREEK CAPITAL LETTER OMICRON WITH TONOS +038E..0390;N # L& [3] GREEK CAPITAL LETTER UPSILON WITH TONOS..GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS +0391..03A1;A # Lu [17] GREEK CAPITAL LETTER ALPHA..GREEK CAPITAL LETTER RHO +03A3..03A9;A # Lu [7] GREEK CAPITAL LETTER SIGMA..GREEK CAPITAL LETTER OMEGA +03AA..03B0;N # L& [7] GREEK CAPITAL LETTER IOTA WITH DIALYTIKA..GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS +03B1..03C1;A # Ll [17] GREEK SMALL LETTER ALPHA..GREEK SMALL LETTER RHO +03C2;N # Ll GREEK SMALL LETTER FINAL SIGMA +03C3..03C9;A # Ll [7] GREEK SMALL LETTER SIGMA..GREEK SMALL LETTER OMEGA +03CA..03F5;N # L& [44] GREEK SMALL LETTER IOTA WITH DIALYTIKA..GREEK LUNATE EPSILON SYMBOL +03F6;N # Sm GREEK REVERSED LUNATE EPSILON SYMBOL +03F7..03FF;N # L& [9] GREEK CAPITAL LETTER SHO..GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL +0400;N # Lu CYRILLIC CAPITAL LETTER IE WITH GRAVE +0401;A # Lu CYRILLIC CAPITAL LETTER IO +0402..040F;N # Lu [14] CYRILLIC CAPITAL LETTER DJE..CYRILLIC CAPITAL LETTER DZHE +0410..044F;A # L& [64] CYRILLIC CAPITAL LETTER A..CYRILLIC SMALL LETTER YA +0450;N # Ll CYRILLIC SMALL LETTER IE WITH GRAVE +0451;A # Ll CYRILLIC SMALL LETTER IO +0452..0481;N # L& [48] CYRILLIC SMALL LETTER DJE..CYRILLIC SMALL LETTER KOPPA +0482;N # So CYRILLIC THOUSANDS SIGN +0483..0487;N # Mn [5] COMBINING CYRILLIC TITLO..COMBINING CYRILLIC POKRYTIE +0488..0489;N # Me [2] COMBINING CYRILLIC HUNDRED THOUSANDS SIGN..COMBINING CYRILLIC MILLIONS SIGN +048A..04FF;N # L& [118] CYRILLIC CAPITAL LETTER SHORT I WITH TAIL..CYRILLIC SMALL LETTER HA WITH STROKE +0500..052F;N # L& [48] CYRILLIC CAPITAL LETTER KOMI DE..CYRILLIC SMALL LETTER EL WITH DESCENDER +0531..0556;N # Lu [38] ARMENIAN CAPITAL LETTER AYB..ARMENIAN CAPITAL LETTER FEH +0559;N # Lm ARMENIAN MODIFIER LETTER LEFT HALF RING +055A..055F;N # Po [6] ARMENIAN APOSTROPHE..ARMENIAN ABBREVIATION MARK +0560..0588;N # Ll [41] ARMENIAN SMALL LETTER TURNED AYB..ARMENIAN SMALL LETTER YI WITH STROKE +0589;N # Po ARMENIAN FULL STOP +058A;N # Pd ARMENIAN HYPHEN +058D..058E;N # So [2] RIGHT-FACING ARMENIAN ETERNITY SIGN..LEFT-FACING ARMENIAN ETERNITY SIGN +058F;N # Sc ARMENIAN DRAM SIGN +0591..05BD;N # Mn [45] HEBREW ACCENT ETNAHTA..HEBREW POINT METEG +05BE;N # Pd HEBREW PUNCTUATION MAQAF +05BF;N # Mn HEBREW POINT RAFE +05C0;N # Po HEBREW PUNCTUATION PASEQ +05C1..05C2;N # Mn [2] HEBREW POINT SHIN DOT..HEBREW POINT SIN DOT +05C3;N # Po HEBREW PUNCTUATION SOF PASUQ +05C4..05C5;N # Mn [2] HEBREW MARK UPPER DOT..HEBREW MARK LOWER DOT +05C6;N # Po HEBREW PUNCTUATION NUN HAFUKHA +05C7;N # Mn HEBREW POINT QAMATS QATAN +05D0..05EA;N # Lo [27] HEBREW LETTER ALEF..HEBREW LETTER TAV +05EF..05F2;N # Lo [4] HEBREW YOD TRIANGLE..HEBREW LIGATURE YIDDISH DOUBLE YOD +05F3..05F4;N # Po [2] HEBREW PUNCTUATION GERESH..HEBREW PUNCTUATION GERSHAYIM +0600..0605;N # Cf [6] ARABIC NUMBER SIGN..ARABIC NUMBER MARK ABOVE +0606..0608;N # Sm [3] ARABIC-INDIC CUBE ROOT..ARABIC RAY +0609..060A;N # Po [2] ARABIC-INDIC PER MILLE SIGN..ARABIC-INDIC PER TEN THOUSAND SIGN +060B;N # Sc AFGHANI SIGN +060C..060D;N # Po [2] ARABIC COMMA..ARABIC DATE SEPARATOR +060E..060F;N # So [2] ARABIC POETIC VERSE SIGN..ARABIC SIGN MISRA +0610..061A;N # Mn [11] ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM..ARABIC SMALL KASRA +061B;N # Po ARABIC SEMICOLON +061C;N # Cf ARABIC LETTER MARK +061E..061F;N # Po [2] ARABIC TRIPLE DOT PUNCTUATION MARK..ARABIC QUESTION MARK +0620..063F;N # Lo [32] ARABIC LETTER KASHMIRI YEH..ARABIC LETTER FARSI YEH WITH THREE DOTS ABOVE +0640;N # Lm ARABIC TATWEEL +0641..064A;N # Lo [10] ARABIC LETTER FEH..ARABIC LETTER YEH +064B..065F;N # Mn [21] ARABIC FATHATAN..ARABIC WAVY HAMZA BELOW +0660..0669;N # Nd [10] ARABIC-INDIC DIGIT ZERO..ARABIC-INDIC DIGIT NINE +066A..066D;N # Po [4] ARABIC PERCENT SIGN..ARABIC FIVE POINTED STAR +066E..066F;N # Lo [2] ARABIC LETTER DOTLESS BEH..ARABIC LETTER DOTLESS QAF +0670;N # Mn ARABIC LETTER SUPERSCRIPT ALEF +0671..06D3;N # Lo [99] ARABIC LETTER ALEF WASLA..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE +06D4;N # Po ARABIC FULL STOP +06D5;N # Lo ARABIC LETTER AE +06D6..06DC;N # Mn [7] ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA..ARABIC SMALL HIGH SEEN +06DD;N # Cf ARABIC END OF AYAH +06DE;N # So ARABIC START OF RUB EL HIZB +06DF..06E4;N # Mn [6] ARABIC SMALL HIGH ROUNDED ZERO..ARABIC SMALL HIGH MADDA +06E5..06E6;N # Lm [2] ARABIC SMALL WAW..ARABIC SMALL YEH +06E7..06E8;N # Mn [2] ARABIC SMALL HIGH YEH..ARABIC SMALL HIGH NOON +06E9;N # So ARABIC PLACE OF SAJDAH +06EA..06ED;N # Mn [4] ARABIC EMPTY CENTRE LOW STOP..ARABIC SMALL LOW MEEM +06EE..06EF;N # Lo [2] ARABIC LETTER DAL WITH INVERTED V..ARABIC LETTER REH WITH INVERTED V +06F0..06F9;N # Nd [10] EXTENDED ARABIC-INDIC DIGIT ZERO..EXTENDED ARABIC-INDIC DIGIT NINE +06FA..06FC;N # Lo [3] ARABIC LETTER SHEEN WITH DOT BELOW..ARABIC LETTER GHAIN WITH DOT BELOW +06FD..06FE;N # So [2] ARABIC SIGN SINDHI AMPERSAND..ARABIC SIGN SINDHI POSTPOSITION MEN +06FF;N # Lo ARABIC LETTER HEH WITH INVERTED V +0700..070D;N # Po [14] SYRIAC END OF PARAGRAPH..SYRIAC HARKLEAN ASTERISCUS +070F;N # Cf SYRIAC ABBREVIATION MARK +0710;N # Lo SYRIAC LETTER ALAPH +0711;N # Mn SYRIAC LETTER SUPERSCRIPT ALAPH +0712..072F;N # Lo [30] SYRIAC LETTER BETH..SYRIAC LETTER PERSIAN DHALATH +0730..074A;N # Mn [27] SYRIAC PTHAHA ABOVE..SYRIAC BARREKH +074D..074F;N # Lo [3] SYRIAC LETTER SOGDIAN ZHAIN..SYRIAC LETTER SOGDIAN FE +0750..077F;N # Lo [48] ARABIC LETTER BEH WITH THREE DOTS HORIZONTALLY BELOW..ARABIC LETTER KAF WITH TWO DOTS ABOVE +0780..07A5;N # Lo [38] THAANA LETTER HAA..THAANA LETTER WAAVU +07A6..07B0;N # Mn [11] THAANA ABAFILI..THAANA SUKUN +07B1;N # Lo THAANA LETTER NAA +07C0..07C9;N # Nd [10] NKO DIGIT ZERO..NKO DIGIT NINE +07CA..07EA;N # Lo [33] NKO LETTER A..NKO LETTER JONA RA +07EB..07F3;N # Mn [9] NKO COMBINING SHORT HIGH TONE..NKO COMBINING DOUBLE DOT ABOVE +07F4..07F5;N # Lm [2] NKO HIGH TONE APOSTROPHE..NKO LOW TONE APOSTROPHE +07F6;N # So NKO SYMBOL OO DENNEN +07F7..07F9;N # Po [3] NKO SYMBOL GBAKURUNEN..NKO EXCLAMATION MARK +07FA;N # Lm NKO LAJANYALAN +07FD;N # Mn NKO DANTAYALAN +07FE..07FF;N # Sc [2] NKO DOROME SIGN..NKO TAMAN SIGN +0800..0815;N # Lo [22] SAMARITAN LETTER ALAF..SAMARITAN LETTER TAAF +0816..0819;N # Mn [4] SAMARITAN MARK IN..SAMARITAN MARK DAGESH +081A;N # Lm SAMARITAN MODIFIER LETTER EPENTHETIC YUT +081B..0823;N # Mn [9] SAMARITAN MARK EPENTHETIC YUT..SAMARITAN VOWEL SIGN A +0824;N # Lm SAMARITAN MODIFIER LETTER SHORT A +0825..0827;N # Mn [3] SAMARITAN VOWEL SIGN SHORT A..SAMARITAN VOWEL SIGN U +0828;N # Lm SAMARITAN MODIFIER LETTER I +0829..082D;N # Mn [5] SAMARITAN VOWEL SIGN LONG I..SAMARITAN MARK NEQUDAA +0830..083E;N # Po [15] SAMARITAN PUNCTUATION NEQUDAA..SAMARITAN PUNCTUATION ANNAAU +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 +08D3..08E1;N # Mn [15] ARABIC SMALL LOW WAW..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 +0904..0939;N # Lo [54] DEVANAGARI LETTER SHORT A..DEVANAGARI LETTER HA +093A;N # Mn DEVANAGARI VOWEL SIGN OE +093B;N # Mc DEVANAGARI VOWEL SIGN OOE +093C;N # Mn DEVANAGARI SIGN NUKTA +093D;N # Lo DEVANAGARI SIGN AVAGRAHA +093E..0940;N # Mc [3] DEVANAGARI VOWEL SIGN AA..DEVANAGARI VOWEL SIGN II +0941..0948;N # Mn [8] DEVANAGARI VOWEL SIGN U..DEVANAGARI VOWEL SIGN AI +0949..094C;N # Mc [4] DEVANAGARI VOWEL SIGN CANDRA O..DEVANAGARI VOWEL SIGN AU +094D;N # Mn DEVANAGARI SIGN VIRAMA +094E..094F;N # Mc [2] DEVANAGARI VOWEL SIGN PRISHTHAMATRA E..DEVANAGARI VOWEL SIGN AW +0950;N # Lo DEVANAGARI OM +0951..0957;N # Mn [7] DEVANAGARI STRESS SIGN UDATTA..DEVANAGARI VOWEL SIGN UUE +0958..0961;N # Lo [10] DEVANAGARI LETTER QA..DEVANAGARI LETTER VOCALIC LL +0962..0963;N # Mn [2] DEVANAGARI VOWEL SIGN VOCALIC L..DEVANAGARI VOWEL SIGN VOCALIC LL +0964..0965;N # Po [2] DEVANAGARI DANDA..DEVANAGARI DOUBLE DANDA +0966..096F;N # Nd [10] DEVANAGARI DIGIT ZERO..DEVANAGARI DIGIT NINE +0970;N # Po DEVANAGARI ABBREVIATION SIGN +0971;N # Lm DEVANAGARI SIGN HIGH SPACING DOT +0972..097F;N # Lo [14] DEVANAGARI LETTER CANDRA A..DEVANAGARI LETTER BBA +0980;N # Lo BENGALI ANJI +0981;N # Mn BENGALI SIGN CANDRABINDU +0982..0983;N # Mc [2] BENGALI SIGN ANUSVARA..BENGALI SIGN VISARGA +0985..098C;N # Lo [8] BENGALI LETTER A..BENGALI LETTER VOCALIC L +098F..0990;N # Lo [2] BENGALI LETTER E..BENGALI LETTER AI +0993..09A8;N # Lo [22] BENGALI LETTER O..BENGALI LETTER NA +09AA..09B0;N # Lo [7] BENGALI LETTER PA..BENGALI LETTER RA +09B2;N # Lo BENGALI LETTER LA +09B6..09B9;N # Lo [4] BENGALI LETTER SHA..BENGALI LETTER HA +09BC;N # Mn BENGALI SIGN NUKTA +09BD;N # Lo BENGALI SIGN AVAGRAHA +09BE..09C0;N # Mc [3] BENGALI VOWEL SIGN AA..BENGALI VOWEL SIGN II +09C1..09C4;N # Mn [4] BENGALI VOWEL SIGN U..BENGALI VOWEL SIGN VOCALIC RR +09C7..09C8;N # Mc [2] BENGALI VOWEL SIGN E..BENGALI VOWEL SIGN AI +09CB..09CC;N # Mc [2] BENGALI VOWEL SIGN O..BENGALI VOWEL SIGN AU +09CD;N # Mn BENGALI SIGN VIRAMA +09CE;N # Lo BENGALI LETTER KHANDA TA +09D7;N # Mc BENGALI AU LENGTH MARK +09DC..09DD;N # Lo [2] BENGALI LETTER RRA..BENGALI LETTER RHA +09DF..09E1;N # Lo [3] BENGALI LETTER YYA..BENGALI LETTER VOCALIC LL +09E2..09E3;N # Mn [2] BENGALI VOWEL SIGN VOCALIC L..BENGALI VOWEL SIGN VOCALIC LL +09E6..09EF;N # Nd [10] BENGALI DIGIT ZERO..BENGALI DIGIT NINE +09F0..09F1;N # Lo [2] BENGALI LETTER RA WITH MIDDLE DIAGONAL..BENGALI LETTER RA WITH LOWER DIAGONAL +09F2..09F3;N # Sc [2] BENGALI RUPEE MARK..BENGALI RUPEE SIGN +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 +09FE;N # Mn BENGALI SANDHI MARK +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 +0A0F..0A10;N # Lo [2] GURMUKHI LETTER EE..GURMUKHI LETTER AI +0A13..0A28;N # Lo [22] GURMUKHI LETTER OO..GURMUKHI LETTER NA +0A2A..0A30;N # Lo [7] GURMUKHI LETTER PA..GURMUKHI LETTER RA +0A32..0A33;N # Lo [2] GURMUKHI LETTER LA..GURMUKHI LETTER LLA +0A35..0A36;N # Lo [2] GURMUKHI LETTER VA..GURMUKHI LETTER SHA +0A38..0A39;N # Lo [2] GURMUKHI LETTER SA..GURMUKHI LETTER HA +0A3C;N # Mn GURMUKHI SIGN NUKTA +0A3E..0A40;N # Mc [3] GURMUKHI VOWEL SIGN AA..GURMUKHI VOWEL SIGN II +0A41..0A42;N # Mn [2] GURMUKHI VOWEL SIGN U..GURMUKHI VOWEL SIGN UU +0A47..0A48;N # Mn [2] GURMUKHI VOWEL SIGN EE..GURMUKHI VOWEL SIGN AI +0A4B..0A4D;N # Mn [3] GURMUKHI VOWEL SIGN OO..GURMUKHI SIGN VIRAMA +0A51;N # Mn GURMUKHI SIGN UDAAT +0A59..0A5C;N # Lo [4] GURMUKHI LETTER KHHA..GURMUKHI LETTER RRA +0A5E;N # Lo GURMUKHI LETTER FA +0A66..0A6F;N # Nd [10] GURMUKHI DIGIT ZERO..GURMUKHI DIGIT NINE +0A70..0A71;N # Mn [2] GURMUKHI TIPPI..GURMUKHI ADDAK +0A72..0A74;N # Lo [3] GURMUKHI IRI..GURMUKHI EK ONKAR +0A75;N # Mn GURMUKHI SIGN YAKASH +0A76;N # Po GURMUKHI ABBREVIATION SIGN +0A81..0A82;N # Mn [2] GUJARATI SIGN CANDRABINDU..GUJARATI SIGN ANUSVARA +0A83;N # Mc GUJARATI SIGN VISARGA +0A85..0A8D;N # Lo [9] GUJARATI LETTER A..GUJARATI VOWEL CANDRA E +0A8F..0A91;N # Lo [3] GUJARATI LETTER E..GUJARATI VOWEL CANDRA O +0A93..0AA8;N # Lo [22] GUJARATI LETTER O..GUJARATI LETTER NA +0AAA..0AB0;N # Lo [7] GUJARATI LETTER PA..GUJARATI LETTER RA +0AB2..0AB3;N # Lo [2] GUJARATI LETTER LA..GUJARATI LETTER LLA +0AB5..0AB9;N # Lo [5] GUJARATI LETTER VA..GUJARATI LETTER HA +0ABC;N # Mn GUJARATI SIGN NUKTA +0ABD;N # Lo GUJARATI SIGN AVAGRAHA +0ABE..0AC0;N # Mc [3] GUJARATI VOWEL SIGN AA..GUJARATI VOWEL SIGN II +0AC1..0AC5;N # Mn [5] GUJARATI VOWEL SIGN U..GUJARATI VOWEL SIGN CANDRA E +0AC7..0AC8;N # Mn [2] GUJARATI VOWEL SIGN E..GUJARATI VOWEL SIGN AI +0AC9;N # Mc GUJARATI VOWEL SIGN CANDRA O +0ACB..0ACC;N # Mc [2] GUJARATI VOWEL SIGN O..GUJARATI VOWEL SIGN AU +0ACD;N # Mn GUJARATI SIGN VIRAMA +0AD0;N # Lo GUJARATI OM +0AE0..0AE1;N # Lo [2] GUJARATI LETTER VOCALIC RR..GUJARATI LETTER VOCALIC LL +0AE2..0AE3;N # Mn [2] GUJARATI VOWEL SIGN VOCALIC L..GUJARATI VOWEL SIGN VOCALIC LL +0AE6..0AEF;N # Nd [10] GUJARATI DIGIT ZERO..GUJARATI DIGIT NINE +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 +0B0F..0B10;N # Lo [2] ORIYA LETTER E..ORIYA LETTER AI +0B13..0B28;N # Lo [22] ORIYA LETTER O..ORIYA LETTER NA +0B2A..0B30;N # Lo [7] ORIYA LETTER PA..ORIYA LETTER RA +0B32..0B33;N # Lo [2] ORIYA LETTER LA..ORIYA LETTER LLA +0B35..0B39;N # Lo [5] ORIYA LETTER VA..ORIYA LETTER HA +0B3C;N # Mn ORIYA SIGN NUKTA +0B3D;N # Lo ORIYA SIGN AVAGRAHA +0B3E;N # Mc ORIYA VOWEL SIGN AA +0B3F;N # Mn ORIYA VOWEL SIGN I +0B40;N # Mc ORIYA VOWEL SIGN II +0B41..0B44;N # Mn [4] ORIYA VOWEL SIGN U..ORIYA VOWEL SIGN VOCALIC RR +0B47..0B48;N # Mc [2] ORIYA VOWEL SIGN E..ORIYA VOWEL SIGN AI +0B4B..0B4C;N # Mc [2] ORIYA VOWEL SIGN O..ORIYA VOWEL SIGN AU +0B4D;N # Mn ORIYA SIGN VIRAMA +0B56;N # Mn ORIYA AI LENGTH MARK +0B57;N # Mc ORIYA AU LENGTH MARK +0B5C..0B5D;N # Lo [2] ORIYA LETTER RRA..ORIYA LETTER RHA +0B5F..0B61;N # Lo [3] ORIYA LETTER YYA..ORIYA LETTER VOCALIC LL +0B62..0B63;N # Mn [2] ORIYA VOWEL SIGN VOCALIC L..ORIYA VOWEL SIGN VOCALIC LL +0B66..0B6F;N # Nd [10] ORIYA DIGIT ZERO..ORIYA DIGIT NINE +0B70;N # So ORIYA ISSHAR +0B71;N # Lo ORIYA LETTER WA +0B72..0B77;N # No [6] ORIYA FRACTION ONE QUARTER..ORIYA FRACTION THREE SIXTEENTHS +0B82;N # Mn TAMIL SIGN ANUSVARA +0B83;N # Lo TAMIL SIGN VISARGA +0B85..0B8A;N # Lo [6] TAMIL LETTER A..TAMIL LETTER UU +0B8E..0B90;N # Lo [3] TAMIL LETTER E..TAMIL LETTER AI +0B92..0B95;N # Lo [4] TAMIL LETTER O..TAMIL LETTER KA +0B99..0B9A;N # Lo [2] TAMIL LETTER NGA..TAMIL LETTER CA +0B9C;N # Lo TAMIL LETTER JA +0B9E..0B9F;N # Lo [2] TAMIL LETTER NYA..TAMIL LETTER TTA +0BA3..0BA4;N # Lo [2] TAMIL LETTER NNA..TAMIL LETTER TA +0BA8..0BAA;N # Lo [3] TAMIL LETTER NA..TAMIL LETTER PA +0BAE..0BB9;N # Lo [12] TAMIL LETTER MA..TAMIL LETTER HA +0BBE..0BBF;N # Mc [2] TAMIL VOWEL SIGN AA..TAMIL VOWEL SIGN I +0BC0;N # Mn TAMIL VOWEL SIGN II +0BC1..0BC2;N # Mc [2] TAMIL VOWEL SIGN U..TAMIL VOWEL SIGN UU +0BC6..0BC8;N # Mc [3] TAMIL VOWEL SIGN E..TAMIL VOWEL SIGN AI +0BCA..0BCC;N # Mc [3] TAMIL VOWEL SIGN O..TAMIL VOWEL SIGN AU +0BCD;N # Mn TAMIL SIGN VIRAMA +0BD0;N # Lo TAMIL OM +0BD7;N # Mc TAMIL AU LENGTH MARK +0BE6..0BEF;N # Nd [10] TAMIL DIGIT ZERO..TAMIL DIGIT NINE +0BF0..0BF2;N # No [3] TAMIL NUMBER TEN..TAMIL NUMBER ONE THOUSAND +0BF3..0BF8;N # So [6] TAMIL DAY SIGN..TAMIL AS ABOVE SIGN +0BF9;N # Sc TAMIL RUPEE SIGN +0BFA;N # So TAMIL NUMBER SIGN +0C00;N # Mn TELUGU SIGN COMBINING CANDRABINDU ABOVE +0C01..0C03;N # Mc [3] TELUGU SIGN CANDRABINDU..TELUGU SIGN VISARGA +0C04;N # Mn TELUGU SIGN COMBINING ANUSVARA ABOVE +0C05..0C0C;N # Lo [8] TELUGU LETTER A..TELUGU LETTER VOCALIC L +0C0E..0C10;N # Lo [3] TELUGU LETTER E..TELUGU LETTER AI +0C12..0C28;N # Lo [23] TELUGU LETTER O..TELUGU LETTER NA +0C2A..0C39;N # Lo [16] TELUGU LETTER PA..TELUGU LETTER HA +0C3D;N # Lo TELUGU SIGN AVAGRAHA +0C3E..0C40;N # Mn [3] TELUGU VOWEL SIGN AA..TELUGU VOWEL SIGN II +0C41..0C44;N # Mc [4] TELUGU VOWEL SIGN U..TELUGU VOWEL SIGN VOCALIC RR +0C46..0C48;N # Mn [3] TELUGU VOWEL SIGN E..TELUGU VOWEL SIGN AI +0C4A..0C4D;N # Mn [4] TELUGU VOWEL SIGN O..TELUGU SIGN VIRAMA +0C55..0C56;N # Mn [2] TELUGU LENGTH MARK..TELUGU AI LENGTH MARK +0C58..0C5A;N # Lo [3] TELUGU LETTER TSA..TELUGU LETTER RRRA +0C60..0C61;N # Lo [2] TELUGU LETTER VOCALIC RR..TELUGU LETTER VOCALIC LL +0C62..0C63;N # Mn [2] TELUGU VOWEL SIGN VOCALIC L..TELUGU VOWEL SIGN VOCALIC LL +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 +0C84;N # Po KANNADA SIGN SIDDHAM +0C85..0C8C;N # Lo [8] KANNADA LETTER A..KANNADA LETTER VOCALIC L +0C8E..0C90;N # Lo [3] KANNADA LETTER E..KANNADA LETTER AI +0C92..0CA8;N # Lo [23] KANNADA LETTER O..KANNADA LETTER NA +0CAA..0CB3;N # Lo [10] KANNADA LETTER PA..KANNADA LETTER LLA +0CB5..0CB9;N # Lo [5] KANNADA LETTER VA..KANNADA LETTER HA +0CBC;N # Mn KANNADA SIGN NUKTA +0CBD;N # Lo KANNADA SIGN AVAGRAHA +0CBE;N # Mc KANNADA VOWEL SIGN AA +0CBF;N # Mn KANNADA VOWEL SIGN I +0CC0..0CC4;N # Mc [5] KANNADA VOWEL SIGN II..KANNADA VOWEL SIGN VOCALIC RR +0CC6;N # Mn KANNADA VOWEL SIGN E +0CC7..0CC8;N # Mc [2] KANNADA VOWEL SIGN EE..KANNADA VOWEL SIGN AI +0CCA..0CCB;N # Mc [2] KANNADA VOWEL SIGN O..KANNADA VOWEL SIGN OO +0CCC..0CCD;N # Mn [2] KANNADA VOWEL SIGN AU..KANNADA SIGN VIRAMA +0CD5..0CD6;N # Mc [2] KANNADA LENGTH MARK..KANNADA AI LENGTH MARK +0CDE;N # Lo KANNADA LETTER FA +0CE0..0CE1;N # Lo [2] KANNADA LETTER VOCALIC RR..KANNADA LETTER VOCALIC LL +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 +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 +0D46..0D48;N # Mc [3] MALAYALAM VOWEL SIGN E..MALAYALAM VOWEL SIGN AI +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..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 +0D85..0D96;N # Lo [18] SINHALA LETTER AYANNA..SINHALA LETTER AUYANNA +0D9A..0DB1;N # Lo [24] SINHALA LETTER ALPAPRAANA KAYANNA..SINHALA LETTER DANTAJA NAYANNA +0DB3..0DBB;N # Lo [9] SINHALA LETTER SANYAKA DAYANNA..SINHALA LETTER RAYANNA +0DBD;N # Lo SINHALA LETTER DANTAJA LAYANNA +0DC0..0DC6;N # Lo [7] SINHALA LETTER VAYANNA..SINHALA LETTER FAYANNA +0DCA;N # Mn SINHALA SIGN AL-LAKUNA +0DCF..0DD1;N # Mc [3] SINHALA VOWEL SIGN AELA-PILLA..SINHALA VOWEL SIGN DIGA AEDA-PILLA +0DD2..0DD4;N # Mn [3] SINHALA VOWEL SIGN KETTI IS-PILLA..SINHALA VOWEL SIGN KETTI PAA-PILLA +0DD6;N # Mn SINHALA VOWEL SIGN DIGA PAA-PILLA +0DD8..0DDF;N # Mc [8] SINHALA VOWEL SIGN GAETTA-PILLA..SINHALA VOWEL SIGN GAYANUKITTA +0DE6..0DEF;N # Nd [10] SINHALA LITH DIGIT ZERO..SINHALA LITH DIGIT NINE +0DF2..0DF3;N # Mc [2] SINHALA VOWEL SIGN DIGA GAETTA-PILLA..SINHALA VOWEL SIGN DIGA GAYANUKITTA +0DF4;N # Po SINHALA PUNCTUATION KUNDDALIYA +0E01..0E30;N # Lo [48] THAI CHARACTER KO KAI..THAI CHARACTER SARA A +0E31;N # Mn THAI CHARACTER MAI HAN-AKAT +0E32..0E33;N # Lo [2] THAI CHARACTER SARA AA..THAI CHARACTER SARA AM +0E34..0E3A;N # Mn [7] THAI CHARACTER SARA I..THAI CHARACTER PHINTHU +0E3F;N # Sc THAI CURRENCY SYMBOL BAHT +0E40..0E45;N # Lo [6] THAI CHARACTER SARA E..THAI CHARACTER LAKKHANGYAO +0E46;N # Lm THAI CHARACTER MAIYAMOK +0E47..0E4E;N # Mn [8] THAI CHARACTER MAITAIKHU..THAI CHARACTER YAMAKKAN +0E4F;N # Po THAI CHARACTER FONGMAN +0E50..0E59;N # Nd [10] THAI DIGIT ZERO..THAI DIGIT NINE +0E5A..0E5B;N # Po [2] THAI CHARACTER ANGKHANKHU..THAI CHARACTER KHOMUT +0E81..0E82;N # Lo [2] LAO LETTER KO..LAO LETTER KHO SUNG +0E84;N # Lo LAO LETTER KHO TAM +0E87..0E88;N # Lo [2] LAO LETTER NGO..LAO LETTER CO +0E8A;N # Lo LAO LETTER SO TAM +0E8D;N # Lo LAO LETTER NYO +0E94..0E97;N # Lo [4] LAO LETTER DO..LAO LETTER THO TAM +0E99..0E9F;N # Lo [7] LAO LETTER NO..LAO LETTER FO SUNG +0EA1..0EA3;N # Lo [3] LAO LETTER MO..LAO LETTER LO LING +0EA5;N # Lo LAO LETTER LO LOOT +0EA7;N # Lo LAO LETTER WO +0EAA..0EAB;N # Lo [2] LAO LETTER SO SUNG..LAO LETTER HO SUNG +0EAD..0EB0;N # Lo [4] LAO LETTER O..LAO VOWEL SIGN A +0EB1;N # Mn LAO VOWEL SIGN MAI KAN +0EB2..0EB3;N # Lo [2] LAO VOWEL SIGN AA..LAO VOWEL SIGN AM +0EB4..0EB9;N # Mn [6] LAO VOWEL SIGN I..LAO VOWEL SIGN UU +0EBB..0EBC;N # Mn [2] LAO VOWEL SIGN MAI KON..LAO SEMIVOWEL SIGN LO +0EBD;N # Lo LAO SEMIVOWEL SIGN NYO +0EC0..0EC4;N # Lo [5] LAO VOWEL SIGN E..LAO VOWEL SIGN AI +0EC6;N # Lm LAO KO LA +0EC8..0ECD;N # Mn [6] LAO TONE MAI EK..LAO NIGGAHITA +0ED0..0ED9;N # Nd [10] LAO DIGIT ZERO..LAO DIGIT NINE +0EDC..0EDF;N # Lo [4] LAO HO NO..LAO LETTER KHMU NYO +0F00;N # Lo TIBETAN SYLLABLE OM +0F01..0F03;N # So [3] TIBETAN MARK GTER YIG MGO TRUNCATED A..TIBETAN MARK GTER YIG MGO -UM GTER TSHEG MA +0F04..0F12;N # Po [15] TIBETAN MARK INITIAL YIG MGO MDUN MA..TIBETAN MARK RGYA GRAM SHAD +0F13;N # So TIBETAN MARK CARET -DZUD RTAGS ME LONG CAN +0F14;N # Po TIBETAN MARK GTER TSHEG +0F15..0F17;N # So [3] TIBETAN LOGOTYPE SIGN CHAD RTAGS..TIBETAN ASTROLOGICAL SIGN SGRA GCAN -CHAR RTAGS +0F18..0F19;N # Mn [2] TIBETAN ASTROLOGICAL SIGN -KHYUD PA..TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS +0F1A..0F1F;N # So [6] TIBETAN SIGN RDEL DKAR GCIG..TIBETAN SIGN RDEL DKAR RDEL NAG +0F20..0F29;N # Nd [10] TIBETAN DIGIT ZERO..TIBETAN DIGIT NINE +0F2A..0F33;N # No [10] TIBETAN DIGIT HALF ONE..TIBETAN DIGIT HALF ZERO +0F34;N # So TIBETAN MARK BSDUS RTAGS +0F35;N # Mn TIBETAN MARK NGAS BZUNG NYI ZLA +0F36;N # So TIBETAN MARK CARET -DZUD RTAGS BZHI MIG CAN +0F37;N # Mn TIBETAN MARK NGAS BZUNG SGOR RTAGS +0F38;N # So TIBETAN MARK CHE MGO +0F39;N # Mn TIBETAN MARK TSA -PHRU +0F3A;N # Ps TIBETAN MARK GUG RTAGS GYON +0F3B;N # Pe TIBETAN MARK GUG RTAGS GYAS +0F3C;N # Ps TIBETAN MARK ANG KHANG GYON +0F3D;N # Pe TIBETAN MARK ANG KHANG GYAS +0F3E..0F3F;N # Mc [2] TIBETAN SIGN YAR TSHES..TIBETAN SIGN MAR TSHES +0F40..0F47;N # Lo [8] TIBETAN LETTER KA..TIBETAN LETTER JA +0F49..0F6C;N # Lo [36] TIBETAN LETTER NYA..TIBETAN LETTER RRA +0F71..0F7E;N # Mn [14] TIBETAN VOWEL SIGN AA..TIBETAN SIGN RJES SU NGA RO +0F7F;N # Mc TIBETAN SIGN RNAM BCAD +0F80..0F84;N # Mn [5] TIBETAN VOWEL SIGN REVERSED I..TIBETAN MARK HALANTA +0F85;N # Po TIBETAN MARK PALUTA +0F86..0F87;N # Mn [2] TIBETAN SIGN LCI RTAGS..TIBETAN SIGN YANG RTAGS +0F88..0F8C;N # Lo [5] TIBETAN SIGN LCE TSA CAN..TIBETAN SIGN INVERTED MCHU CAN +0F8D..0F97;N # Mn [11] TIBETAN SUBJOINED SIGN LCE TSA CAN..TIBETAN SUBJOINED LETTER JA +0F99..0FBC;N # Mn [36] TIBETAN SUBJOINED LETTER NYA..TIBETAN SUBJOINED LETTER FIXED-FORM RA +0FBE..0FC5;N # So [8] TIBETAN KU RU KHA..TIBETAN SYMBOL RDO RJE +0FC6;N # Mn TIBETAN SYMBOL PADMA GDAN +0FC7..0FCC;N # So [6] TIBETAN SYMBOL RDO RJE RGYA GRAM..TIBETAN SYMBOL NOR BU BZHI -KHYIL +0FCE..0FCF;N # So [2] TIBETAN SIGN RDEL NAG RDEL DKAR..TIBETAN SIGN RDEL NAG GSUM +0FD0..0FD4;N # Po [5] TIBETAN MARK BSKA- SHOG GI MGO RGYAN..TIBETAN MARK CLOSING BRDA RNYING YIG MGO SGAB MA +0FD5..0FD8;N # So [4] RIGHT-FACING SVASTI SIGN..LEFT-FACING SVASTI SIGN WITH DOTS +0FD9..0FDA;N # Po [2] TIBETAN MARK LEADING MCHAN RTAGS..TIBETAN MARK TRAILING MCHAN RTAGS +1000..102A;N # Lo [43] MYANMAR LETTER KA..MYANMAR LETTER AU +102B..102C;N # Mc [2] MYANMAR VOWEL SIGN TALL AA..MYANMAR VOWEL SIGN AA +102D..1030;N # Mn [4] MYANMAR VOWEL SIGN I..MYANMAR VOWEL SIGN UU +1031;N # Mc MYANMAR VOWEL SIGN E +1032..1037;N # Mn [6] MYANMAR VOWEL SIGN AI..MYANMAR SIGN DOT BELOW +1038;N # Mc MYANMAR SIGN VISARGA +1039..103A;N # Mn [2] MYANMAR SIGN VIRAMA..MYANMAR SIGN ASAT +103B..103C;N # Mc [2] MYANMAR CONSONANT SIGN MEDIAL YA..MYANMAR CONSONANT SIGN MEDIAL RA +103D..103E;N # Mn [2] MYANMAR CONSONANT SIGN MEDIAL WA..MYANMAR CONSONANT SIGN MEDIAL HA +103F;N # Lo MYANMAR LETTER GREAT SA +1040..1049;N # Nd [10] MYANMAR DIGIT ZERO..MYANMAR DIGIT NINE +104A..104F;N # Po [6] MYANMAR SIGN LITTLE SECTION..MYANMAR SYMBOL GENITIVE +1050..1055;N # Lo [6] MYANMAR LETTER SHA..MYANMAR LETTER VOCALIC LL +1056..1057;N # Mc [2] MYANMAR VOWEL SIGN VOCALIC R..MYANMAR VOWEL SIGN VOCALIC RR +1058..1059;N # Mn [2] MYANMAR VOWEL SIGN VOCALIC L..MYANMAR VOWEL SIGN VOCALIC LL +105A..105D;N # Lo [4] MYANMAR LETTER MON NGA..MYANMAR LETTER MON BBE +105E..1060;N # Mn [3] MYANMAR CONSONANT SIGN MON MEDIAL NA..MYANMAR CONSONANT SIGN MON MEDIAL LA +1061;N # Lo MYANMAR LETTER SGAW KAREN SHA +1062..1064;N # Mc [3] MYANMAR VOWEL SIGN SGAW KAREN EU..MYANMAR TONE MARK SGAW KAREN KE PHO +1065..1066;N # Lo [2] MYANMAR LETTER WESTERN PWO KAREN THA..MYANMAR LETTER WESTERN PWO KAREN PWA +1067..106D;N # Mc [7] MYANMAR VOWEL SIGN WESTERN PWO KAREN EU..MYANMAR SIGN WESTERN PWO KAREN TONE-5 +106E..1070;N # Lo [3] MYANMAR LETTER EASTERN PWO KAREN NNA..MYANMAR LETTER EASTERN PWO KAREN GHWA +1071..1074;N # Mn [4] MYANMAR VOWEL SIGN GEBA KAREN I..MYANMAR VOWEL SIGN KAYAH EE +1075..1081;N # Lo [13] MYANMAR LETTER SHAN KA..MYANMAR LETTER SHAN HA +1082;N # Mn MYANMAR CONSONANT SIGN SHAN MEDIAL WA +1083..1084;N # Mc [2] MYANMAR VOWEL SIGN SHAN AA..MYANMAR VOWEL SIGN SHAN E +1085..1086;N # Mn [2] MYANMAR VOWEL SIGN SHAN E ABOVE..MYANMAR VOWEL SIGN SHAN FINAL Y +1087..108C;N # Mc [6] MYANMAR SIGN SHAN TONE-2..MYANMAR SIGN SHAN COUNCIL TONE-3 +108D;N # Mn MYANMAR SIGN SHAN COUNCIL EMPHATIC TONE +108E;N # Lo MYANMAR LETTER RUMAI PALAUNG FA +108F;N # Mc MYANMAR SIGN RUMAI PALAUNG TONE-5 +1090..1099;N # Nd [10] MYANMAR SHAN DIGIT ZERO..MYANMAR SHAN DIGIT NINE +109A..109C;N # Mc [3] MYANMAR SIGN KHAMTI TONE-1..MYANMAR VOWEL SIGN AITON A +109D;N # Mn MYANMAR VOWEL SIGN AITON AI +109E..109F;N # So [2] MYANMAR SYMBOL SHAN ONE..MYANMAR SYMBOL SHAN EXCLAMATION +10A0..10C5;N # Lu [38] GEORGIAN CAPITAL LETTER AN..GEORGIAN CAPITAL LETTER HOE +10C7;N # Lu GEORGIAN CAPITAL LETTER YN +10CD;N # Lu GEORGIAN CAPITAL LETTER AEN +10D0..10FA;N # Ll [43] GEORGIAN LETTER AN..GEORGIAN LETTER AIN +10FB;N # Po GEORGIAN PARAGRAPH SEPARATOR +10FC;N # Lm MODIFIER LETTER GEORGIAN NAR +10FD..10FF;N # Ll [3] GEORGIAN LETTER AEN..GEORGIAN LETTER LABIAL SIGN +1100..115F;W # Lo [96] HANGUL CHOSEONG KIYEOK..HANGUL CHOSEONG FILLER +1160..11FF;N # Lo [160] HANGUL JUNGSEONG FILLER..HANGUL JONGSEONG SSANGNIEUN +1200..1248;N # Lo [73] ETHIOPIC SYLLABLE HA..ETHIOPIC SYLLABLE QWA +124A..124D;N # Lo [4] ETHIOPIC SYLLABLE QWI..ETHIOPIC SYLLABLE QWE +1250..1256;N # Lo [7] ETHIOPIC SYLLABLE QHA..ETHIOPIC SYLLABLE QHO +1258;N # Lo ETHIOPIC SYLLABLE QHWA +125A..125D;N # Lo [4] ETHIOPIC SYLLABLE QHWI..ETHIOPIC SYLLABLE QHWE +1260..1288;N # Lo [41] ETHIOPIC SYLLABLE BA..ETHIOPIC SYLLABLE XWA +128A..128D;N # Lo [4] ETHIOPIC SYLLABLE XWI..ETHIOPIC SYLLABLE XWE +1290..12B0;N # Lo [33] ETHIOPIC SYLLABLE NA..ETHIOPIC SYLLABLE KWA +12B2..12B5;N # Lo [4] ETHIOPIC SYLLABLE KWI..ETHIOPIC SYLLABLE KWE +12B8..12BE;N # Lo [7] ETHIOPIC SYLLABLE KXA..ETHIOPIC SYLLABLE KXO +12C0;N # Lo ETHIOPIC SYLLABLE KXWA +12C2..12C5;N # Lo [4] ETHIOPIC SYLLABLE KXWI..ETHIOPIC SYLLABLE KXWE +12C8..12D6;N # Lo [15] ETHIOPIC SYLLABLE WA..ETHIOPIC SYLLABLE PHARYNGEAL O +12D8..1310;N # Lo [57] ETHIOPIC SYLLABLE ZA..ETHIOPIC SYLLABLE GWA +1312..1315;N # Lo [4] ETHIOPIC SYLLABLE GWI..ETHIOPIC SYLLABLE GWE +1318..135A;N # Lo [67] ETHIOPIC SYLLABLE GGA..ETHIOPIC SYLLABLE FYA +135D..135F;N # Mn [3] ETHIOPIC COMBINING GEMINATION AND VOWEL LENGTH MARK..ETHIOPIC COMBINING GEMINATION MARK +1360..1368;N # Po [9] ETHIOPIC SECTION MARK..ETHIOPIC PARAGRAPH SEPARATOR +1369..137C;N # No [20] ETHIOPIC DIGIT ONE..ETHIOPIC NUMBER TEN THOUSAND +1380..138F;N # Lo [16] ETHIOPIC SYLLABLE SEBATBEIT MWA..ETHIOPIC SYLLABLE PWE +1390..1399;N # So [10] ETHIOPIC TONAL MARK YIZET..ETHIOPIC TONAL MARK KURT +13A0..13F5;N # Lu [86] CHEROKEE LETTER A..CHEROKEE LETTER MV +13F8..13FD;N # Ll [6] CHEROKEE SMALL LETTER YE..CHEROKEE SMALL LETTER MV +1400;N # Pd CANADIAN SYLLABICS HYPHEN +1401..166C;N # Lo [620] CANADIAN SYLLABICS E..CANADIAN SYLLABICS CARRIER TTSA +166D..166E;N # Po [2] CANADIAN SYLLABICS CHI SIGN..CANADIAN SYLLABICS FULL STOP +166F..167F;N # Lo [17] CANADIAN SYLLABICS QAI..CANADIAN SYLLABICS BLACKFOOT W +1680;N # Zs OGHAM SPACE MARK +1681..169A;N # Lo [26] OGHAM LETTER BEITH..OGHAM LETTER PEITH +169B;N # Ps OGHAM FEATHER MARK +169C;N # Pe OGHAM REVERSED FEATHER MARK +16A0..16EA;N # Lo [75] RUNIC LETTER FEHU FEOH FE F..RUNIC LETTER X +16EB..16ED;N # Po [3] RUNIC SINGLE PUNCTUATION..RUNIC CROSS PUNCTUATION +16EE..16F0;N # Nl [3] RUNIC ARLAUG SYMBOL..RUNIC BELGTHOR SYMBOL +16F1..16F8;N # Lo [8] RUNIC LETTER K..RUNIC LETTER FRANKS CASKET AESC +1700..170C;N # Lo [13] TAGALOG LETTER A..TAGALOG LETTER YA +170E..1711;N # Lo [4] TAGALOG LETTER LA..TAGALOG LETTER HA +1712..1714;N # Mn [3] TAGALOG VOWEL SIGN I..TAGALOG SIGN VIRAMA +1720..1731;N # Lo [18] HANUNOO LETTER A..HANUNOO LETTER HA +1732..1734;N # Mn [3] HANUNOO VOWEL SIGN I..HANUNOO SIGN PAMUDPOD +1735..1736;N # Po [2] PHILIPPINE SINGLE PUNCTUATION..PHILIPPINE DOUBLE PUNCTUATION +1740..1751;N # Lo [18] BUHID LETTER A..BUHID LETTER HA +1752..1753;N # Mn [2] BUHID VOWEL SIGN I..BUHID VOWEL SIGN U +1760..176C;N # Lo [13] TAGBANWA LETTER A..TAGBANWA LETTER YA +176E..1770;N # Lo [3] TAGBANWA LETTER LA..TAGBANWA LETTER SA +1772..1773;N # Mn [2] TAGBANWA VOWEL SIGN I..TAGBANWA VOWEL SIGN U +1780..17B3;N # Lo [52] KHMER LETTER KA..KHMER INDEPENDENT VOWEL QAU +17B4..17B5;N # Mn [2] KHMER VOWEL INHERENT AQ..KHMER VOWEL INHERENT AA +17B6;N # Mc KHMER VOWEL SIGN AA +17B7..17BD;N # Mn [7] KHMER VOWEL SIGN I..KHMER VOWEL SIGN UA +17BE..17C5;N # Mc [8] KHMER VOWEL SIGN OE..KHMER VOWEL SIGN AU +17C6;N # Mn KHMER SIGN NIKAHIT +17C7..17C8;N # Mc [2] KHMER SIGN REAHMUK..KHMER SIGN YUUKALEAPINTU +17C9..17D3;N # Mn [11] KHMER SIGN MUUSIKATOAN..KHMER SIGN BATHAMASAT +17D4..17D6;N # Po [3] KHMER SIGN KHAN..KHMER SIGN CAMNUC PII KUUH +17D7;N # Lm KHMER SIGN LEK TOO +17D8..17DA;N # Po [3] KHMER SIGN BEYYAL..KHMER SIGN KOOMUUT +17DB;N # Sc KHMER CURRENCY SYMBOL RIEL +17DC;N # Lo KHMER SIGN AVAKRAHASANYA +17DD;N # Mn KHMER SIGN ATTHACAN +17E0..17E9;N # Nd [10] KHMER DIGIT ZERO..KHMER DIGIT NINE +17F0..17F9;N # No [10] KHMER SYMBOL LEK ATTAK SON..KHMER SYMBOL LEK ATTAK PRAM-BUON +1800..1805;N # Po [6] MONGOLIAN BIRGA..MONGOLIAN FOUR DOTS +1806;N # Pd MONGOLIAN TODO SOFT HYPHEN +1807..180A;N # Po [4] MONGOLIAN SIBE SYLLABLE BOUNDARY MARKER..MONGOLIAN NIRUGU +180B..180D;N # Mn [3] MONGOLIAN FREE VARIATION SELECTOR ONE..MONGOLIAN FREE VARIATION SELECTOR THREE +180E;N # Cf MONGOLIAN VOWEL SEPARATOR +1810..1819;N # Nd [10] MONGOLIAN DIGIT ZERO..MONGOLIAN DIGIT NINE +1820..1842;N # Lo [35] MONGOLIAN LETTER A..MONGOLIAN LETTER CHI +1843;N # Lm MONGOLIAN LETTER TODO LONG VOWEL SIGN +1844..1878;N # Lo [53] MONGOLIAN LETTER TODO E..MONGOLIAN LETTER CHA WITH TWO DOTS +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 +1900..191E;N # Lo [31] LIMBU VOWEL-CARRIER LETTER..LIMBU LETTER TRA +1920..1922;N # Mn [3] LIMBU VOWEL SIGN A..LIMBU VOWEL SIGN U +1923..1926;N # Mc [4] LIMBU VOWEL SIGN EE..LIMBU VOWEL SIGN AU +1927..1928;N # Mn [2] LIMBU VOWEL SIGN E..LIMBU VOWEL SIGN O +1929..192B;N # Mc [3] LIMBU SUBJOINED LETTER YA..LIMBU SUBJOINED LETTER WA +1930..1931;N # Mc [2] LIMBU SMALL LETTER KA..LIMBU SMALL LETTER NGA +1932;N # Mn LIMBU SMALL LETTER ANUSVARA +1933..1938;N # Mc [6] LIMBU SMALL LETTER TA..LIMBU SMALL LETTER LA +1939..193B;N # Mn [3] LIMBU SIGN MUKPHRENG..LIMBU SIGN SA-I +1940;N # So LIMBU SIGN LOO +1944..1945;N # Po [2] LIMBU EXCLAMATION MARK..LIMBU QUESTION MARK +1946..194F;N # Nd [10] LIMBU DIGIT ZERO..LIMBU DIGIT NINE +1950..196D;N # Lo [30] TAI LE LETTER KA..TAI LE LETTER AI +1970..1974;N # Lo [5] TAI LE LETTER TONE-2..TAI LE LETTER TONE-6 +1980..19AB;N # Lo [44] NEW TAI LUE LETTER HIGH QA..NEW TAI LUE LETTER LOW SUA +19B0..19C9;N # Lo [26] NEW TAI LUE VOWEL SIGN VOWEL SHORTENER..NEW TAI LUE TONE MARK-2 +19D0..19D9;N # Nd [10] NEW TAI LUE DIGIT ZERO..NEW TAI LUE DIGIT NINE +19DA;N # No NEW TAI LUE THAM DIGIT ONE +19DE..19DF;N # So [2] NEW TAI LUE SIGN LAE..NEW TAI LUE SIGN LAEV +19E0..19FF;N # So [32] KHMER SYMBOL PATHAMASAT..KHMER SYMBOL DAP-PRAM ROC +1A00..1A16;N # Lo [23] BUGINESE LETTER KA..BUGINESE LETTER HA +1A17..1A18;N # Mn [2] BUGINESE VOWEL SIGN I..BUGINESE VOWEL SIGN U +1A19..1A1A;N # Mc [2] BUGINESE VOWEL SIGN E..BUGINESE VOWEL SIGN O +1A1B;N # Mn BUGINESE VOWEL SIGN AE +1A1E..1A1F;N # Po [2] BUGINESE PALLAWA..BUGINESE END OF SECTION +1A20..1A54;N # Lo [53] TAI THAM LETTER HIGH KA..TAI THAM LETTER GREAT SA +1A55;N # Mc TAI THAM CONSONANT SIGN MEDIAL RA +1A56;N # Mn TAI THAM CONSONANT SIGN MEDIAL LA +1A57;N # Mc TAI THAM CONSONANT SIGN LA TANG LAI +1A58..1A5E;N # Mn [7] TAI THAM SIGN MAI KANG LAI..TAI THAM CONSONANT SIGN SA +1A60;N # Mn TAI THAM SIGN SAKOT +1A61;N # Mc TAI THAM VOWEL SIGN A +1A62;N # Mn TAI THAM VOWEL SIGN MAI SAT +1A63..1A64;N # Mc [2] TAI THAM VOWEL SIGN AA..TAI THAM VOWEL SIGN TALL AA +1A65..1A6C;N # Mn [8] TAI THAM VOWEL SIGN I..TAI THAM VOWEL SIGN OA BELOW +1A6D..1A72;N # Mc [6] TAI THAM VOWEL SIGN OY..TAI THAM VOWEL SIGN THAM AI +1A73..1A7C;N # Mn [10] TAI THAM VOWEL SIGN OA ABOVE..TAI THAM SIGN KHUEN-LUE KARAN +1A7F;N # Mn TAI THAM COMBINING CRYPTOGRAMMIC DOT +1A80..1A89;N # Nd [10] TAI THAM HORA DIGIT ZERO..TAI THAM HORA DIGIT NINE +1A90..1A99;N # Nd [10] TAI THAM THAM DIGIT ZERO..TAI THAM THAM DIGIT NINE +1AA0..1AA6;N # Po [7] TAI THAM SIGN WIANG..TAI THAM SIGN REVERSED ROTATED RANA +1AA7;N # Lm TAI THAM SIGN MAI YAMOK +1AA8..1AAD;N # Po [6] TAI THAM SIGN KAAN..TAI THAM SIGN CAANG +1AB0..1ABD;N # Mn [14] COMBINING DOUBLED CIRCUMFLEX ACCENT..COMBINING PARENTHESES BELOW +1ABE;N # Me COMBINING PARENTHESES OVERLAY +1B00..1B03;N # Mn [4] BALINESE SIGN ULU RICEM..BALINESE SIGN SURANG +1B04;N # Mc BALINESE SIGN BISAH +1B05..1B33;N # Lo [47] BALINESE LETTER AKARA..BALINESE LETTER HA +1B34;N # Mn BALINESE SIGN REREKAN +1B35;N # Mc BALINESE VOWEL SIGN TEDUNG +1B36..1B3A;N # Mn [5] BALINESE VOWEL SIGN ULU..BALINESE VOWEL SIGN RA REPA +1B3B;N # Mc BALINESE VOWEL SIGN RA REPA TEDUNG +1B3C;N # Mn BALINESE VOWEL SIGN LA LENGA +1B3D..1B41;N # Mc [5] BALINESE VOWEL SIGN LA LENGA TEDUNG..BALINESE VOWEL SIGN TALING REPA TEDUNG +1B42;N # Mn BALINESE VOWEL SIGN PEPET +1B43..1B44;N # Mc [2] BALINESE VOWEL SIGN PEPET TEDUNG..BALINESE ADEG ADEG +1B45..1B4B;N # Lo [7] BALINESE LETTER KAF SASAK..BALINESE LETTER ASYURA SASAK +1B50..1B59;N # Nd [10] BALINESE DIGIT ZERO..BALINESE DIGIT NINE +1B5A..1B60;N # Po [7] BALINESE PANTI..BALINESE PAMENENG +1B61..1B6A;N # So [10] BALINESE MUSICAL SYMBOL DONG..BALINESE MUSICAL SYMBOL DANG GEDE +1B6B..1B73;N # Mn [9] BALINESE MUSICAL SYMBOL COMBINING TEGEH..BALINESE MUSICAL SYMBOL COMBINING GONG +1B74..1B7C;N # So [9] BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DUG..BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PING +1B80..1B81;N # Mn [2] SUNDANESE SIGN PANYECEK..SUNDANESE SIGN PANGLAYAR +1B82;N # Mc SUNDANESE SIGN PANGWISAD +1B83..1BA0;N # Lo [30] SUNDANESE LETTER A..SUNDANESE LETTER HA +1BA1;N # Mc SUNDANESE CONSONANT SIGN PAMINGKAL +1BA2..1BA5;N # Mn [4] SUNDANESE CONSONANT SIGN PANYAKRA..SUNDANESE VOWEL SIGN PANYUKU +1BA6..1BA7;N # Mc [2] SUNDANESE VOWEL SIGN PANAELAENG..SUNDANESE VOWEL SIGN PANOLONG +1BA8..1BA9;N # Mn [2] SUNDANESE VOWEL SIGN PAMEPET..SUNDANESE VOWEL SIGN PANEULEUNG +1BAA;N # Mc SUNDANESE SIGN PAMAAEH +1BAB..1BAD;N # Mn [3] SUNDANESE SIGN VIRAMA..SUNDANESE CONSONANT SIGN PASANGAN WA +1BAE..1BAF;N # Lo [2] SUNDANESE LETTER KHA..SUNDANESE LETTER SYA +1BB0..1BB9;N # Nd [10] SUNDANESE DIGIT ZERO..SUNDANESE DIGIT NINE +1BBA..1BBF;N # Lo [6] SUNDANESE AVAGRAHA..SUNDANESE LETTER FINAL M +1BC0..1BE5;N # Lo [38] BATAK LETTER A..BATAK LETTER U +1BE6;N # Mn BATAK SIGN TOMPI +1BE7;N # Mc BATAK VOWEL SIGN E +1BE8..1BE9;N # Mn [2] BATAK VOWEL SIGN PAKPAK E..BATAK VOWEL SIGN EE +1BEA..1BEC;N # Mc [3] BATAK VOWEL SIGN I..BATAK VOWEL SIGN O +1BED;N # Mn BATAK VOWEL SIGN KARO O +1BEE;N # Mc BATAK VOWEL SIGN U +1BEF..1BF1;N # Mn [3] BATAK VOWEL SIGN U FOR SIMALUNGUN SA..BATAK CONSONANT SIGN H +1BF2..1BF3;N # Mc [2] BATAK PANGOLAT..BATAK PANONGONAN +1BFC..1BFF;N # Po [4] BATAK SYMBOL BINDU NA METEK..BATAK SYMBOL BINDU PANGOLAT +1C00..1C23;N # Lo [36] LEPCHA LETTER KA..LEPCHA LETTER A +1C24..1C2B;N # Mc [8] LEPCHA SUBJOINED LETTER YA..LEPCHA VOWEL SIGN UU +1C2C..1C33;N # Mn [8] LEPCHA VOWEL SIGN E..LEPCHA CONSONANT SIGN T +1C34..1C35;N # Mc [2] LEPCHA CONSONANT SIGN NYIN-DO..LEPCHA CONSONANT SIGN KANG +1C36..1C37;N # Mn [2] LEPCHA SIGN RAN..LEPCHA SIGN NUKTA +1C3B..1C3F;N # Po [5] LEPCHA PUNCTUATION TA-ROL..LEPCHA PUNCTUATION TSHOOK +1C40..1C49;N # Nd [10] LEPCHA DIGIT ZERO..LEPCHA DIGIT NINE +1C4D..1C4F;N # Lo [3] LEPCHA LETTER TTA..LEPCHA LETTER DDA +1C50..1C59;N # Nd [10] OL CHIKI DIGIT ZERO..OL CHIKI DIGIT NINE +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 +1C90..1CBA;N # Lu [43] GEORGIAN MTAVRULI CAPITAL LETTER AN..GEORGIAN MTAVRULI CAPITAL LETTER AIN +1CBD..1CBF;N # Lu [3] GEORGIAN MTAVRULI CAPITAL LETTER AEN..GEORGIAN MTAVRULI CAPITAL LETTER LABIAL SIGN +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 +1CD4..1CE0;N # Mn [13] VEDIC SIGN YAJURVEDIC MIDLINE SVARITA..VEDIC TONE RIGVEDIC KASHMIRI INDEPENDENT SVARITA +1CE1;N # Mc VEDIC TONE ATHARVAVEDIC INDEPENDENT SVARITA +1CE2..1CE8;N # Mn [7] VEDIC SIGN VISARGA SVARITA..VEDIC SIGN VISARGA ANUDATTA WITH TAIL +1CE9..1CEC;N # Lo [4] VEDIC SIGN ANUSVARA ANTARGOMUKHA..VEDIC SIGN ANUSVARA VAMAGOMUKHA WITH TAIL +1CED;N # Mn VEDIC SIGN TIRYAK +1CEE..1CF1;N # Lo [4] VEDIC SIGN HEXIFORM LONG ANUSVARA..VEDIC SIGN ANUSVARA UBHAYATO MUKHA +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 +1D6B..1D77;N # Ll [13] LATIN SMALL LETTER UE..LATIN SMALL LETTER TURNED G +1D78;N # Lm MODIFIER LETTER CYRILLIC EN +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..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 +1F18..1F1D;N # Lu [6] GREEK CAPITAL LETTER EPSILON WITH PSILI..GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA +1F20..1F45;N # L& [38] GREEK SMALL LETTER ETA WITH PSILI..GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA +1F48..1F4D;N # Lu [6] GREEK CAPITAL LETTER OMICRON WITH PSILI..GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA +1F50..1F57;N # Ll [8] GREEK SMALL LETTER UPSILON WITH PSILI..GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI +1F59;N # Lu GREEK CAPITAL LETTER UPSILON WITH DASIA +1F5B;N # Lu GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA +1F5D;N # Lu GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA +1F5F..1F7D;N # L& [31] GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI..GREEK SMALL LETTER OMEGA WITH OXIA +1F80..1FB4;N # L& [53] GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI..GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI +1FB6..1FBC;N # L& [7] GREEK SMALL LETTER ALPHA WITH PERISPOMENI..GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI +1FBD;N # Sk GREEK KORONIS +1FBE;N # Ll GREEK PROSGEGRAMMENI +1FBF..1FC1;N # Sk [3] GREEK PSILI..GREEK DIALYTIKA AND PERISPOMENI +1FC2..1FC4;N # Ll [3] GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI +1FC6..1FCC;N # L& [7] GREEK SMALL LETTER ETA WITH PERISPOMENI..GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI +1FCD..1FCF;N # Sk [3] GREEK PSILI AND VARIA..GREEK PSILI AND PERISPOMENI +1FD0..1FD3;N # Ll [4] GREEK SMALL LETTER IOTA WITH VRACHY..GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA +1FD6..1FDB;N # L& [6] GREEK SMALL LETTER IOTA WITH PERISPOMENI..GREEK CAPITAL LETTER IOTA WITH OXIA +1FDD..1FDF;N # Sk [3] GREEK DASIA AND VARIA..GREEK DASIA AND PERISPOMENI +1FE0..1FEC;N # L& [13] GREEK SMALL LETTER UPSILON WITH VRACHY..GREEK CAPITAL LETTER RHO WITH DASIA +1FED..1FEF;N # Sk [3] GREEK DIALYTIKA AND VARIA..GREEK VARIA +1FF2..1FF4;N # Ll [3] GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI +1FF6..1FFC;N # L& [7] GREEK SMALL LETTER OMEGA WITH PERISPOMENI..GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI +1FFD..1FFE;N # Sk [2] GREEK OXIA..GREEK DASIA +2000..200A;N # Zs [11] EN QUAD..HAIR SPACE +200B..200F;N # Cf [5] ZERO WIDTH SPACE..RIGHT-TO-LEFT MARK +2010;A # Pd HYPHEN +2011..2012;N # Pd [2] NON-BREAKING HYPHEN..FIGURE DASH +2013..2015;A # Pd [3] EN DASH..HORIZONTAL BAR +2016;A # Po DOUBLE VERTICAL LINE +2017;N # Po DOUBLE LOW LINE +2018;A # Pi LEFT SINGLE QUOTATION MARK +2019;A # Pf RIGHT SINGLE QUOTATION MARK +201A;N # Ps SINGLE LOW-9 QUOTATION MARK +201B;N # Pi SINGLE HIGH-REVERSED-9 QUOTATION MARK +201C;A # Pi LEFT DOUBLE QUOTATION MARK +201D;A # Pf RIGHT DOUBLE QUOTATION MARK +201E;N # Ps DOUBLE LOW-9 QUOTATION MARK +201F;N # Pi DOUBLE HIGH-REVERSED-9 QUOTATION MARK +2020..2022;A # Po [3] DAGGER..BULLET +2023;N # Po TRIANGULAR BULLET +2024..2027;A # Po [4] ONE DOT LEADER..HYPHENATION POINT +2028;N # Zl LINE SEPARATOR +2029;N # Zp PARAGRAPH SEPARATOR +202A..202E;N # Cf [5] LEFT-TO-RIGHT EMBEDDING..RIGHT-TO-LEFT OVERRIDE +202F;N # Zs NARROW NO-BREAK SPACE +2030;A # Po PER MILLE SIGN +2031;N # Po PER TEN THOUSAND SIGN +2032..2033;A # Po [2] PRIME..DOUBLE PRIME +2034;N # Po TRIPLE PRIME +2035;A # Po REVERSED PRIME +2036..2038;N # Po [3] REVERSED DOUBLE PRIME..CARET +2039;N # Pi SINGLE LEFT-POINTING ANGLE QUOTATION MARK +203A;N # Pf SINGLE RIGHT-POINTING ANGLE QUOTATION MARK +203B;A # Po REFERENCE MARK +203C..203D;N # Po [2] DOUBLE EXCLAMATION MARK..INTERROBANG +203E;A # Po OVERLINE +203F..2040;N # Pc [2] UNDERTIE..CHARACTER TIE +2041..2043;N # Po [3] CARET INSERTION POINT..HYPHEN BULLET +2044;N # Sm FRACTION SLASH +2045;N # Ps LEFT SQUARE BRACKET WITH QUILL +2046;N # Pe RIGHT SQUARE BRACKET WITH QUILL +2047..2051;N # Po [11] DOUBLE QUESTION MARK..TWO ASTERISKS ALIGNED VERTICALLY +2052;N # Sm COMMERCIAL MINUS SIGN +2053;N # Po SWUNG DASH +2054;N # Pc INVERTED UNDERTIE +2055..205E;N # Po [10] FLOWER PUNCTUATION MARK..VERTICAL FOUR DOTS +205F;N # Zs MEDIUM MATHEMATICAL SPACE +2060..2064;N # Cf [5] WORD JOINER..INVISIBLE PLUS +2066..206F;N # Cf [10] LEFT-TO-RIGHT ISOLATE..NOMINAL DIGIT SHAPES +2070;N # No SUPERSCRIPT ZERO +2071;N # Lm SUPERSCRIPT LATIN SMALL LETTER I +2074;A # No SUPERSCRIPT FOUR +2075..2079;N # No [5] SUPERSCRIPT FIVE..SUPERSCRIPT NINE +207A..207C;N # Sm [3] SUPERSCRIPT PLUS SIGN..SUPERSCRIPT EQUALS SIGN +207D;N # Ps SUPERSCRIPT LEFT PARENTHESIS +207E;N # Pe SUPERSCRIPT RIGHT PARENTHESIS +207F;A # Lm SUPERSCRIPT LATIN SMALL LETTER N +2080;N # No SUBSCRIPT ZERO +2081..2084;A # No [4] SUBSCRIPT ONE..SUBSCRIPT FOUR +2085..2089;N # No [5] SUBSCRIPT FIVE..SUBSCRIPT NINE +208A..208C;N # Sm [3] SUBSCRIPT PLUS SIGN..SUBSCRIPT EQUALS SIGN +208D;N # Ps SUBSCRIPT LEFT PARENTHESIS +208E;N # Pe SUBSCRIPT RIGHT PARENTHESIS +2090..209C;N # Lm [13] LATIN SUBSCRIPT SMALL LETTER A..LATIN SUBSCRIPT SMALL LETTER T +20A0..20A8;N # Sc [9] EURO-CURRENCY SIGN..RUPEE SIGN +20A9;H # Sc WON SIGN +20AA..20AB;N # Sc [2] NEW SHEQEL SIGN..DONG SIGN +20AC;A # Sc EURO 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 +20E2..20E4;N # Me [3] COMBINING ENCLOSING SCREEN..COMBINING ENCLOSING UPWARD POINTING TRIANGLE +20E5..20F0;N # Mn [12] COMBINING REVERSE SOLIDUS OVERLAY..COMBINING ASTERISK ABOVE +2100..2101;N # So [2] ACCOUNT OF..ADDRESSED TO THE SUBJECT +2102;N # Lu DOUBLE-STRUCK CAPITAL C +2103;A # So DEGREE CELSIUS +2104;N # So CENTRE LINE SYMBOL +2105;A # So CARE OF +2106;N # So CADA UNA +2107;N # Lu EULER CONSTANT +2108;N # So SCRUPLE +2109;A # So DEGREE FAHRENHEIT +210A..2112;N # L& [9] SCRIPT SMALL G..SCRIPT CAPITAL L +2113;A # Ll SCRIPT SMALL L +2114;N # So L B BAR SYMBOL +2115;N # Lu DOUBLE-STRUCK CAPITAL N +2116;A # So NUMERO SIGN +2117;N # So SOUND RECORDING COPYRIGHT +2118;N # Sm SCRIPT CAPITAL P +2119..211D;N # Lu [5] DOUBLE-STRUCK CAPITAL P..DOUBLE-STRUCK CAPITAL R +211E..2120;N # So [3] PRESCRIPTION TAKE..SERVICE MARK +2121..2122;A # So [2] TELEPHONE SIGN..TRADE MARK SIGN +2123;N # So VERSICLE +2124;N # Lu DOUBLE-STRUCK CAPITAL Z +2125;N # So OUNCE SIGN +2126;A # Lu OHM SIGN +2127;N # So INVERTED OHM SIGN +2128;N # Lu BLACK-LETTER CAPITAL Z +2129;N # So TURNED GREEK SMALL LETTER IOTA +212A;N # Lu KELVIN SIGN +212B;A # Lu ANGSTROM SIGN +212C..212D;N # Lu [2] SCRIPT CAPITAL B..BLACK-LETTER CAPITAL C +212E;N # So ESTIMATED SYMBOL +212F..2134;N # L& [6] SCRIPT SMALL E..SCRIPT SMALL O +2135..2138;N # Lo [4] ALEF SYMBOL..DALET SYMBOL +2139;N # Ll INFORMATION SOURCE +213A..213B;N # So [2] ROTATED CAPITAL Q..FACSIMILE SIGN +213C..213F;N # L& [4] DOUBLE-STRUCK SMALL PI..DOUBLE-STRUCK CAPITAL PI +2140..2144;N # Sm [5] DOUBLE-STRUCK N-ARY SUMMATION..TURNED SANS-SERIF CAPITAL Y +2145..2149;N # L& [5] DOUBLE-STRUCK ITALIC CAPITAL D..DOUBLE-STRUCK ITALIC SMALL J +214A;N # So PROPERTY LINE +214B;N # Sm TURNED AMPERSAND +214C..214D;N # So [2] PER SIGN..AKTIESELSKAB +214E;N # Ll TURNED SMALL F +214F;N # So SYMBOL FOR SAMARITAN SOURCE +2150..2152;N # No [3] VULGAR FRACTION ONE SEVENTH..VULGAR FRACTION ONE TENTH +2153..2154;A # No [2] VULGAR FRACTION ONE THIRD..VULGAR FRACTION TWO THIRDS +2155..215A;N # No [6] VULGAR FRACTION ONE FIFTH..VULGAR FRACTION FIVE SIXTHS +215B..215E;A # No [4] VULGAR FRACTION ONE EIGHTH..VULGAR FRACTION SEVEN EIGHTHS +215F;N # No FRACTION NUMERATOR ONE +2160..216B;A # Nl [12] ROMAN NUMERAL ONE..ROMAN NUMERAL TWELVE +216C..216F;N # Nl [4] ROMAN NUMERAL FIFTY..ROMAN NUMERAL ONE THOUSAND +2170..2179;A # Nl [10] SMALL ROMAN NUMERAL ONE..SMALL ROMAN NUMERAL TEN +217A..2182;N # Nl [9] SMALL ROMAN NUMERAL ELEVEN..ROMAN NUMERAL TEN THOUSAND +2183..2184;N # L& [2] ROMAN NUMERAL REVERSED ONE HUNDRED..LATIN SMALL LETTER REVERSED C +2185..2188;N # Nl [4] ROMAN NUMERAL SIX LATE FORM..ROMAN NUMERAL ONE HUNDRED THOUSAND +2189;A # No VULGAR FRACTION ZERO THIRDS +218A..218B;N # So [2] TURNED DIGIT TWO..TURNED DIGIT THREE +2190..2194;A # Sm [5] LEFTWARDS ARROW..LEFT RIGHT ARROW +2195..2199;A # So [5] UP DOWN ARROW..SOUTH WEST ARROW +219A..219B;N # Sm [2] LEFTWARDS ARROW WITH STROKE..RIGHTWARDS ARROW WITH STROKE +219C..219F;N # So [4] LEFTWARDS WAVE ARROW..UPWARDS TWO HEADED ARROW +21A0;N # Sm RIGHTWARDS TWO HEADED ARROW +21A1..21A2;N # So [2] DOWNWARDS TWO HEADED ARROW..LEFTWARDS ARROW WITH TAIL +21A3;N # Sm RIGHTWARDS ARROW WITH TAIL +21A4..21A5;N # So [2] LEFTWARDS ARROW FROM BAR..UPWARDS ARROW FROM BAR +21A6;N # Sm RIGHTWARDS ARROW FROM BAR +21A7..21AD;N # So [7] DOWNWARDS ARROW FROM BAR..LEFT RIGHT WAVE ARROW +21AE;N # Sm LEFT RIGHT ARROW WITH STROKE +21AF..21B7;N # So [9] DOWNWARDS ZIGZAG ARROW..CLOCKWISE TOP SEMICIRCLE ARROW +21B8..21B9;A # So [2] NORTH WEST ARROW TO LONG BAR..LEFTWARDS ARROW TO BAR OVER RIGHTWARDS ARROW TO BAR +21BA..21CD;N # So [20] ANTICLOCKWISE OPEN CIRCLE ARROW..LEFTWARDS DOUBLE ARROW WITH STROKE +21CE..21CF;N # Sm [2] LEFT RIGHT DOUBLE ARROW WITH STROKE..RIGHTWARDS DOUBLE ARROW WITH STROKE +21D0..21D1;N # So [2] LEFTWARDS DOUBLE ARROW..UPWARDS DOUBLE ARROW +21D2;A # Sm RIGHTWARDS DOUBLE ARROW +21D3;N # So DOWNWARDS DOUBLE ARROW +21D4;A # Sm LEFT RIGHT DOUBLE ARROW +21D5..21E6;N # So [18] UP DOWN DOUBLE ARROW..LEFTWARDS WHITE ARROW +21E7;A # So UPWARDS WHITE ARROW +21E8..21F3;N # So [12] RIGHTWARDS WHITE ARROW..UP DOWN WHITE ARROW +21F4..21FF;N # Sm [12] RIGHT ARROW WITH SMALL CIRCLE..LEFT RIGHT OPEN-HEADED ARROW +2200;A # Sm FOR ALL +2201;N # Sm COMPLEMENT +2202..2203;A # Sm [2] PARTIAL DIFFERENTIAL..THERE EXISTS +2204..2206;N # Sm [3] THERE DOES NOT EXIST..INCREMENT +2207..2208;A # Sm [2] NABLA..ELEMENT OF +2209..220A;N # Sm [2] NOT AN ELEMENT OF..SMALL ELEMENT OF +220B;A # Sm CONTAINS AS MEMBER +220C..220E;N # Sm [3] DOES NOT CONTAIN AS MEMBER..END OF PROOF +220F;A # Sm N-ARY PRODUCT +2210;N # Sm N-ARY COPRODUCT +2211;A # Sm N-ARY SUMMATION +2212..2214;N # Sm [3] MINUS SIGN..DOT PLUS +2215;A # Sm DIVISION SLASH +2216..2219;N # Sm [4] SET MINUS..BULLET OPERATOR +221A;A # Sm SQUARE ROOT +221B..221C;N # Sm [2] CUBE ROOT..FOURTH ROOT +221D..2220;A # Sm [4] PROPORTIONAL TO..ANGLE +2221..2222;N # Sm [2] MEASURED ANGLE..SPHERICAL ANGLE +2223;A # Sm DIVIDES +2224;N # Sm DOES NOT DIVIDE +2225;A # Sm PARALLEL TO +2226;N # Sm NOT PARALLEL TO +2227..222C;A # Sm [6] LOGICAL AND..DOUBLE INTEGRAL +222D;N # Sm TRIPLE INTEGRAL +222E;A # Sm CONTOUR INTEGRAL +222F..2233;N # Sm [5] SURFACE INTEGRAL..ANTICLOCKWISE CONTOUR INTEGRAL +2234..2237;A # Sm [4] THEREFORE..PROPORTION +2238..223B;N # Sm [4] DOT MINUS..HOMOTHETIC +223C..223D;A # Sm [2] TILDE OPERATOR..REVERSED TILDE +223E..2247;N # Sm [10] INVERTED LAZY S..NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO +2248;A # Sm ALMOST EQUAL TO +2249..224B;N # Sm [3] NOT ALMOST EQUAL TO..TRIPLE TILDE +224C;A # Sm ALL EQUAL TO +224D..2251;N # Sm [5] EQUIVALENT TO..GEOMETRICALLY EQUAL TO +2252;A # Sm APPROXIMATELY EQUAL TO OR THE IMAGE OF +2253..225F;N # Sm [13] IMAGE OF OR APPROXIMATELY EQUAL TO..QUESTIONED EQUAL TO +2260..2261;A # Sm [2] NOT EQUAL TO..IDENTICAL TO +2262..2263;N # Sm [2] NOT IDENTICAL TO..STRICTLY EQUIVALENT TO +2264..2267;A # Sm [4] LESS-THAN OR EQUAL TO..GREATER-THAN OVER EQUAL TO +2268..2269;N # Sm [2] LESS-THAN BUT NOT EQUAL TO..GREATER-THAN BUT NOT EQUAL TO +226A..226B;A # Sm [2] MUCH LESS-THAN..MUCH GREATER-THAN +226C..226D;N # Sm [2] BETWEEN..NOT EQUIVALENT TO +226E..226F;A # Sm [2] NOT LESS-THAN..NOT GREATER-THAN +2270..2281;N # Sm [18] NEITHER LESS-THAN NOR EQUAL TO..DOES NOT SUCCEED +2282..2283;A # Sm [2] SUBSET OF..SUPERSET OF +2284..2285;N # Sm [2] NOT A SUBSET OF..NOT A SUPERSET OF +2286..2287;A # Sm [2] SUBSET OF OR EQUAL TO..SUPERSET OF OR EQUAL TO +2288..2294;N # Sm [13] NEITHER A SUBSET OF NOR EQUAL TO..SQUARE CUP +2295;A # Sm CIRCLED PLUS +2296..2298;N # Sm [3] CIRCLED MINUS..CIRCLED DIVISION SLASH +2299;A # Sm CIRCLED DOT OPERATOR +229A..22A4;N # Sm [11] CIRCLED RING OPERATOR..DOWN TACK +22A5;A # Sm UP TACK +22A6..22BE;N # Sm [25] ASSERTION..RIGHT ANGLE WITH ARC +22BF;A # Sm RIGHT TRIANGLE +22C0..22FF;N # Sm [64] N-ARY LOGICAL AND..Z NOTATION BAG MEMBERSHIP +2300..2307;N # So [8] DIAMETER SIGN..WAVY LINE +2308;N # Ps LEFT CEILING +2309;N # Pe RIGHT CEILING +230A;N # Ps LEFT FLOOR +230B;N # Pe RIGHT FLOOR +230C..2311;N # So [6] BOTTOM RIGHT CROP..SQUARE LOZENGE +2312;A # So ARC +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 +232A;W # Pe RIGHT-POINTING ANGLE BRACKET +232B..237B;N # So [81] ERASE TO THE LEFT..NOT CHECK MARK +237C;N # Sm RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW +237D..239A;N # So [30] SHOULDERED OPEN BOX..CLEAR SCREEN SYMBOL +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..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..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 +249C..24E9;A # So [78] PARENTHESIZED LATIN SMALL LETTER A..CIRCLED LATIN SMALL LETTER Z +24EA;N # No CIRCLED DIGIT ZERO +24EB..24FF;A # No [21] NEGATIVE CIRCLED NUMBER ELEVEN..NEGATIVE CIRCLED DIGIT ZERO +2500..254B;A # So [76] BOX DRAWINGS LIGHT HORIZONTAL..BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL +254C..254F;N # So [4] BOX DRAWINGS LIGHT DOUBLE DASH HORIZONTAL..BOX DRAWINGS HEAVY DOUBLE DASH VERTICAL +2550..2573;A # So [36] BOX DRAWINGS DOUBLE HORIZONTAL..BOX DRAWINGS LIGHT DIAGONAL CROSS +2574..257F;N # So [12] BOX DRAWINGS LIGHT LEFT..BOX DRAWINGS HEAVY UP AND LIGHT DOWN +2580..258F;A # So [16] UPPER HALF BLOCK..LEFT ONE EIGHTH BLOCK +2590..2591;N # So [2] RIGHT HALF BLOCK..LIGHT SHADE +2592..2595;A # So [4] MEDIUM SHADE..RIGHT ONE EIGHTH BLOCK +2596..259F;N # So [10] QUADRANT LOWER LEFT..QUADRANT UPPER RIGHT AND LOWER LEFT AND LOWER RIGHT +25A0..25A1;A # So [2] BLACK SQUARE..WHITE SQUARE +25A2;N # So WHITE SQUARE WITH ROUNDED CORNERS +25A3..25A9;A # So [7] WHITE SQUARE CONTAINING BLACK SMALL SQUARE..SQUARE WITH DIAGONAL CROSSHATCH FILL +25AA..25B1;N # So [8] BLACK SMALL SQUARE..WHITE PARALLELOGRAM +25B2..25B3;A # So [2] BLACK UP-POINTING TRIANGLE..WHITE UP-POINTING TRIANGLE +25B4..25B5;N # So [2] BLACK UP-POINTING SMALL TRIANGLE..WHITE UP-POINTING SMALL TRIANGLE +25B6;A # So BLACK RIGHT-POINTING TRIANGLE +25B7;A # Sm WHITE RIGHT-POINTING TRIANGLE +25B8..25BB;N # So [4] BLACK RIGHT-POINTING SMALL TRIANGLE..WHITE RIGHT-POINTING POINTER +25BC..25BD;A # So [2] BLACK DOWN-POINTING TRIANGLE..WHITE DOWN-POINTING TRIANGLE +25BE..25BF;N # So [2] BLACK DOWN-POINTING SMALL TRIANGLE..WHITE DOWN-POINTING SMALL TRIANGLE +25C0;A # So BLACK LEFT-POINTING TRIANGLE +25C1;A # Sm WHITE LEFT-POINTING TRIANGLE +25C2..25C5;N # So [4] BLACK LEFT-POINTING SMALL TRIANGLE..WHITE LEFT-POINTING POINTER +25C6..25C8;A # So [3] BLACK DIAMOND..WHITE DIAMOND CONTAINING BLACK SMALL DIAMOND +25C9..25CA;N # So [2] FISHEYE..LOZENGE +25CB;A # So WHITE CIRCLE +25CC..25CD;N # So [2] DOTTED CIRCLE..CIRCLE WITH VERTICAL FILL +25CE..25D1;A # So [4] BULLSEYE..CIRCLE WITH RIGHT HALF BLACK +25D2..25E1;N # So [16] CIRCLE WITH LOWER HALF BLACK..LOWER HALF CIRCLE +25E2..25E5;A # So [4] BLACK LOWER RIGHT TRIANGLE..BLACK UPPER RIGHT TRIANGLE +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..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 +2609;A # So SUN +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;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 +261E;A # So WHITE RIGHT POINTING INDEX +261F..263F;N # So [33] WHITE DOWN POINTING INDEX..MERCURY +2640;A # So FEMALE SIGN +2641;N # So EARTH +2642;A # So MALE SIGN +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 +2666;N # So BLACK DIAMOND SUIT +2667..266A;A # So [4] WHITE CLUB SUIT..EIGHTH NOTE +266B;N # So BEAMED EIGHTH NOTES +266C..266D;A # So [2] BEAMED SIXTEENTH NOTES..MUSIC FLAT SIGN +266E;N # So MUSIC NATURAL SIGN +266F;A # Sm MUSIC SHARP SIGN +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;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..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..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..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 +276A;N # Ps MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT +276B;N # Pe MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT +276C;N # Ps MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT +276D;N # Pe MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT +276E;N # Ps HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT +276F;N # Pe HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT +2770;N # Ps HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT +2771;N # Pe HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT +2772;N # Ps LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT +2773;N # Pe LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT +2774;N # Ps MEDIUM LEFT CURLY BRACKET ORNAMENT +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;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 +27C7..27E5;N # Sm [31] OR WITH DOT INSIDE..WHITE SQUARE WITH RIGHTWARDS TICK +27E6;Na # Ps MATHEMATICAL LEFT WHITE SQUARE BRACKET +27E7;Na # Pe MATHEMATICAL RIGHT WHITE SQUARE BRACKET +27E8;Na # Ps MATHEMATICAL LEFT ANGLE BRACKET +27E9;Na # Pe MATHEMATICAL RIGHT ANGLE BRACKET +27EA;Na # Ps MATHEMATICAL LEFT DOUBLE ANGLE BRACKET +27EB;Na # Pe MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET +27EC;Na # Ps MATHEMATICAL LEFT WHITE TORTOISE SHELL BRACKET +27ED;Na # Pe MATHEMATICAL RIGHT WHITE TORTOISE SHELL BRACKET +27EE;N # Ps MATHEMATICAL LEFT FLATTENED PARENTHESIS +27EF;N # Pe MATHEMATICAL RIGHT FLATTENED PARENTHESIS +27F0..27FF;N # Sm [16] UPWARDS QUADRUPLE ARROW..LONG RIGHTWARDS SQUIGGLE ARROW +2800..28FF;N # So [256] BRAILLE PATTERN BLANK..BRAILLE PATTERN DOTS-12345678 +2900..297F;N # Sm [128] RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE..DOWN FISH TAIL +2980..2982;N # Sm [3] TRIPLE VERTICAL BAR DELIMITER..Z NOTATION TYPE COLON +2983;N # Ps LEFT WHITE CURLY BRACKET +2984;N # Pe RIGHT WHITE CURLY BRACKET +2985;Na # Ps LEFT WHITE PARENTHESIS +2986;Na # Pe RIGHT WHITE PARENTHESIS +2987;N # Ps Z NOTATION LEFT IMAGE BRACKET +2988;N # Pe Z NOTATION RIGHT IMAGE BRACKET +2989;N # Ps Z NOTATION LEFT BINDING BRACKET +298A;N # Pe Z NOTATION RIGHT BINDING BRACKET +298B;N # Ps LEFT SQUARE BRACKET WITH UNDERBAR +298C;N # Pe RIGHT SQUARE BRACKET WITH UNDERBAR +298D;N # Ps LEFT SQUARE BRACKET WITH TICK IN TOP CORNER +298E;N # Pe RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER +298F;N # Ps LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER +2990;N # Pe RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER +2991;N # Ps LEFT ANGLE BRACKET WITH DOT +2992;N # Pe RIGHT ANGLE BRACKET WITH DOT +2993;N # Ps LEFT ARC LESS-THAN BRACKET +2994;N # Pe RIGHT ARC GREATER-THAN BRACKET +2995;N # Ps DOUBLE LEFT ARC GREATER-THAN BRACKET +2996;N # Pe DOUBLE RIGHT ARC LESS-THAN BRACKET +2997;N # Ps LEFT BLACK TORTOISE SHELL BRACKET +2998;N # Pe RIGHT BLACK TORTOISE SHELL BRACKET +2999..29D7;N # Sm [63] DOTTED FENCE..BLACK HOURGLASS +29D8;N # Ps LEFT WIGGLY FENCE +29D9;N # Pe RIGHT WIGGLY FENCE +29DA;N # Ps LEFT DOUBLE WIGGLY FENCE +29DB;N # Pe RIGHT DOUBLE WIGGLY FENCE +29DC..29FB;N # Sm [32] INCOMPLETE INFINITY..TRIPLE PLUS +29FC;N # Ps LEFT-POINTING CURVED ANGLE BRACKET +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..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..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..2BC8;N # So [49] THREE-D TOP-LIGHTED LEFTWARDS EQUILATERAL ARROWHEAD..BLACK MEDIUM RIGHT-POINTING TRIANGLE CENTRED +2BCA..2BFE;N # So [53] TOP HALF BLACK CIRCLE..REVERSED RIGHT ANGLE +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 +2C60..2C7B;N # L& [28] LATIN CAPITAL LETTER L WITH DOUBLE BAR..LATIN LETTER SMALL CAPITAL TURNED E +2C7C..2C7D;N # Lm [2] LATIN SUBSCRIPT SMALL LETTER J..MODIFIER LETTER CAPITAL V +2C7E..2C7F;N # Lu [2] LATIN CAPITAL LETTER S WITH SWASH TAIL..LATIN CAPITAL LETTER Z WITH SWASH TAIL +2C80..2CE4;N # L& [101] COPTIC CAPITAL LETTER ALFA..COPTIC SYMBOL KAI +2CE5..2CEA;N # So [6] COPTIC SYMBOL MI RO..COPTIC SYMBOL SHIMA SIMA +2CEB..2CEE;N # L& [4] COPTIC CAPITAL LETTER CRYPTOGRAMMIC SHEI..COPTIC SMALL LETTER CRYPTOGRAMMIC GANGIA +2CEF..2CF1;N # Mn [3] COPTIC COMBINING NI ABOVE..COPTIC COMBINING SPIRITUS LENIS +2CF2..2CF3;N # L& [2] COPTIC CAPITAL LETTER BOHAIRIC KHEI..COPTIC SMALL LETTER BOHAIRIC KHEI +2CF9..2CFC;N # Po [4] COPTIC OLD NUBIAN FULL STOP..COPTIC OLD NUBIAN VERSE DIVIDER +2CFD;N # No COPTIC FRACTION ONE HALF +2CFE..2CFF;N # Po [2] COPTIC FULL STOP..COPTIC MORPHOLOGICAL DIVIDER +2D00..2D25;N # Ll [38] GEORGIAN SMALL LETTER AN..GEORGIAN SMALL LETTER HOE +2D27;N # Ll GEORGIAN SMALL LETTER YN +2D2D;N # Ll GEORGIAN SMALL LETTER AEN +2D30..2D67;N # Lo [56] TIFINAGH LETTER YA..TIFINAGH LETTER YO +2D6F;N # Lm TIFINAGH MODIFIER LETTER LABIALIZATION MARK +2D70;N # Po TIFINAGH SEPARATOR MARK +2D7F;N # Mn TIFINAGH CONSONANT JOINER +2D80..2D96;N # Lo [23] ETHIOPIC SYLLABLE LOA..ETHIOPIC SYLLABLE GGWE +2DA0..2DA6;N # Lo [7] ETHIOPIC SYLLABLE SSA..ETHIOPIC SYLLABLE SSO +2DA8..2DAE;N # Lo [7] ETHIOPIC SYLLABLE CCA..ETHIOPIC SYLLABLE CCO +2DB0..2DB6;N # Lo [7] ETHIOPIC SYLLABLE ZZA..ETHIOPIC SYLLABLE ZZO +2DB8..2DBE;N # Lo [7] ETHIOPIC SYLLABLE CCHA..ETHIOPIC SYLLABLE CCHO +2DC0..2DC6;N # Lo [7] ETHIOPIC SYLLABLE QYA..ETHIOPIC SYLLABLE QYO +2DC8..2DCE;N # Lo [7] ETHIOPIC SYLLABLE KYA..ETHIOPIC SYLLABLE KYO +2DD0..2DD6;N # Lo [7] ETHIOPIC SYLLABLE XYA..ETHIOPIC SYLLABLE XYO +2DD8..2DDE;N # Lo [7] ETHIOPIC SYLLABLE GYA..ETHIOPIC SYLLABLE GYO +2DE0..2DFF;N # Mn [32] COMBINING CYRILLIC LETTER BE..COMBINING CYRILLIC LETTER IOTIFIED BIG YUS +2E00..2E01;N # Po [2] RIGHT ANGLE SUBSTITUTION MARKER..RIGHT ANGLE DOTTED SUBSTITUTION MARKER +2E02;N # Pi LEFT SUBSTITUTION BRACKET +2E03;N # Pf RIGHT SUBSTITUTION BRACKET +2E04;N # Pi LEFT DOTTED SUBSTITUTION BRACKET +2E05;N # Pf RIGHT DOTTED SUBSTITUTION BRACKET +2E06..2E08;N # Po [3] RAISED INTERPOLATION MARKER..DOTTED TRANSPOSITION MARKER +2E09;N # Pi LEFT TRANSPOSITION BRACKET +2E0A;N # Pf RIGHT TRANSPOSITION BRACKET +2E0B;N # Po RAISED SQUARE +2E0C;N # Pi LEFT RAISED OMISSION BRACKET +2E0D;N # Pf RIGHT RAISED OMISSION BRACKET +2E0E..2E16;N # Po [9] EDITORIAL CORONIS..DOTTED RIGHT-POINTING ANGLE +2E17;N # Pd DOUBLE OBLIQUE HYPHEN +2E18..2E19;N # Po [2] INVERTED INTERROBANG..PALM BRANCH +2E1A;N # Pd HYPHEN WITH DIAERESIS +2E1B;N # Po TILDE WITH RING ABOVE +2E1C;N # Pi LEFT LOW PARAPHRASE BRACKET +2E1D;N # Pf RIGHT LOW PARAPHRASE BRACKET +2E1E..2E1F;N # Po [2] TILDE WITH DOT ABOVE..TILDE WITH DOT BELOW +2E20;N # Pi LEFT VERTICAL BAR WITH QUILL +2E21;N # Pf RIGHT VERTICAL BAR WITH QUILL +2E22;N # Ps TOP LEFT HALF BRACKET +2E23;N # Pe TOP RIGHT HALF BRACKET +2E24;N # Ps BOTTOM LEFT HALF BRACKET +2E25;N # Pe BOTTOM RIGHT HALF BRACKET +2E26;N # Ps LEFT SIDEWAYS U BRACKET +2E27;N # Pe RIGHT SIDEWAYS U BRACKET +2E28;N # Ps LEFT DOUBLE PARENTHESIS +2E29;N # Pe RIGHT DOUBLE PARENTHESIS +2E2A..2E2E;N # Po [5] TWO DOTS OVER ONE DOT PUNCTUATION..REVERSED QUESTION MARK +2E2F;N # Lm VERTICAL TILDE +2E30..2E39;N # Po [10] RING POINT..TOP HALF SECTION SIGN +2E3A..2E3B;N # Pd [2] TWO-EM DASH..THREE-EM DASH +2E3C..2E3F;N # Po [4] STENOGRAPHIC FULL STOP..CAPITULUM +2E40;N # Pd DOUBLE HYPHEN +2E41;N # Po REVERSED COMMA +2E42;N # Ps DOUBLE LOW-REVERSED-9 QUOTATION MARK +2E43..2E4E;N # Po [12] DASH WITH LEFT UPTURN..PUNCTUS ELEVATUS 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 +2FF0..2FFB;W # So [12] IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT..IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID +3000;F # Zs IDEOGRAPHIC SPACE +3001..3003;W # Po [3] IDEOGRAPHIC COMMA..DITTO MARK +3004;W # So JAPANESE INDUSTRIAL STANDARD SYMBOL +3005;W # Lm IDEOGRAPHIC ITERATION MARK +3006;W # Lo IDEOGRAPHIC CLOSING MARK +3007;W # Nl IDEOGRAPHIC NUMBER ZERO +3008;W # Ps LEFT ANGLE BRACKET +3009;W # Pe RIGHT ANGLE BRACKET +300A;W # Ps LEFT DOUBLE ANGLE BRACKET +300B;W # Pe RIGHT DOUBLE ANGLE BRACKET +300C;W # Ps LEFT CORNER BRACKET +300D;W # Pe RIGHT CORNER BRACKET +300E;W # Ps LEFT WHITE CORNER BRACKET +300F;W # Pe RIGHT WHITE CORNER BRACKET +3010;W # Ps LEFT BLACK LENTICULAR BRACKET +3011;W # Pe RIGHT BLACK LENTICULAR BRACKET +3012..3013;W # So [2] POSTAL MARK..GETA MARK +3014;W # Ps LEFT TORTOISE SHELL BRACKET +3015;W # Pe RIGHT TORTOISE SHELL BRACKET +3016;W # Ps LEFT WHITE LENTICULAR BRACKET +3017;W # Pe RIGHT WHITE LENTICULAR BRACKET +3018;W # Ps LEFT WHITE TORTOISE SHELL BRACKET +3019;W # Pe RIGHT WHITE TORTOISE SHELL BRACKET +301A;W # Ps LEFT WHITE SQUARE BRACKET +301B;W # Pe RIGHT WHITE SQUARE BRACKET +301C;W # Pd WAVE DASH +301D;W # Ps REVERSED DOUBLE PRIME QUOTATION MARK +301E..301F;W # Pe [2] DOUBLE PRIME QUOTATION MARK..LOW DOUBLE PRIME QUOTATION MARK +3020;W # So POSTAL MARK FACE +3021..3029;W # Nl [9] HANGZHOU NUMERAL ONE..HANGZHOU NUMERAL NINE +302A..302D;W # Mn [4] IDEOGRAPHIC LEVEL TONE MARK..IDEOGRAPHIC ENTERING TONE MARK +302E..302F;W # Mc [2] HANGUL SINGLE DOT TONE MARK..HANGUL DOUBLE DOT TONE MARK +3030;W # Pd WAVY DASH +3031..3035;W # Lm [5] VERTICAL KANA REPEAT MARK..VERTICAL KANA REPEAT MARK LOWER HALF +3036..3037;W # So [2] CIRCLED POSTAL MARK..IDEOGRAPHIC TELEGRAPH LINE FEED SEPARATOR SYMBOL +3038..303A;W # Nl [3] HANGZHOU NUMERAL TEN..HANGZHOU NUMERAL THIRTY +303B;W # Lm VERTICAL IDEOGRAPHIC ITERATION MARK +303C;W # Lo MASU MARK +303D;W # Po PART ALTERNATION MARK +303E;W # So IDEOGRAPHIC VARIATION INDICATOR +303F;N # So IDEOGRAPHIC HALF FILL SPACE +3041..3096;W # Lo [86] HIRAGANA LETTER SMALL A..HIRAGANA LETTER SMALL KE +3099..309A;W # Mn [2] COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK..COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK +309B..309C;W # Sk [2] KATAKANA-HIRAGANA VOICED SOUND MARK..KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK +309D..309E;W # Lm [2] HIRAGANA ITERATION MARK..HIRAGANA VOICED ITERATION MARK +309F;W # Lo HIRAGANA DIGRAPH YORI +30A0;W # Pd KATAKANA-HIRAGANA DOUBLE HYPHEN +30A1..30FA;W # Lo [90] KATAKANA LETTER SMALL A..KATAKANA LETTER VO +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..312F;W # Lo [43] BOPOMOFO LETTER B..BOPOMOFO LETTER NN +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 +3196..319F;W # So [10] IDEOGRAPHIC ANNOTATION TOP MARK..IDEOGRAPHIC ANNOTATION MAN MARK +31A0..31BA;W # Lo [27] BOPOMOFO LETTER BU..BOPOMOFO LETTER ZY +31C0..31E3;W # So [36] CJK STROKE T..CJK STROKE Q +31F0..31FF;W # Lo [16] KATAKANA LETTER SMALL KU..KATAKANA LETTER SMALL RO +3200..321E;W # So [31] PARENTHESIZED HANGUL KIYEOK..PARENTHESIZED KOREAN CHARACTER O HU +3220..3229;W # No [10] PARENTHESIZED IDEOGRAPH ONE..PARENTHESIZED IDEOGRAPH TEN +322A..3247;W # So [30] PARENTHESIZED IDEOGRAPH MOON..CIRCLED IDEOGRAPH KOTO +3248..324F;A # No [8] CIRCLED NUMBER TEN ON BLACK SQUARE..CIRCLED NUMBER EIGHTY ON BLACK SQUARE +3250;W # So PARTNERSHIP SIGN +3251..325F;W # No [15] CIRCLED NUMBER TWENTY ONE..CIRCLED NUMBER THIRTY FIVE +3260..327F;W # So [32] CIRCLED HANGUL KIYEOK..KOREAN STANDARD SYMBOL +3280..3289;W # No [10] CIRCLED IDEOGRAPH ONE..CIRCLED IDEOGRAPH TEN +328A..32B0;W # So [39] CIRCLED IDEOGRAPH MOON..CIRCLED IDEOGRAPH NIGHT +32B1..32BF;W # No [15] CIRCLED NUMBER THIRTY SIX..CIRCLED NUMBER FIFTY +32C0..32FE;W # So [63] IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY..CIRCLED KATAKANA WO +3300..33FF;W # So [256] SQUARE APAATO..SQUARE GAL +3400..4DB5;W # Lo [6582] CJK UNIFIED IDEOGRAPH-3400..CJK UNIFIED IDEOGRAPH-4DB5 +4DB6..4DBF;W # Cn [10] .. +4DC0..4DFF;N # So [64] HEXAGRAM FOR THE CREATIVE HEAVEN..HEXAGRAM FOR BEFORE COMPLETION +4E00..9FEF;W # Lo [20976] CJK UNIFIED IDEOGRAPH-4E00..CJK UNIFIED IDEOGRAPH-9FEF +9FF0..9FFF;W # Cn [16] .. +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 +A490..A4C6;W # So [55] YI RADICAL QOT..YI RADICAL KE +A4D0..A4F7;N # Lo [40] LISU LETTER BA..LISU LETTER OE +A4F8..A4FD;N # Lm [6] LISU LETTER TONE MYA TI..LISU LETTER TONE MYA JEU +A4FE..A4FF;N # Po [2] LISU PUNCTUATION COMMA..LISU PUNCTUATION FULL STOP +A500..A60B;N # Lo [268] VAI SYLLABLE EE..VAI SYLLABLE NG +A60C;N # Lm VAI SYLLABLE LENGTHENER +A60D..A60F;N # Po [3] VAI COMMA..VAI QUESTION MARK +A610..A61F;N # Lo [16] VAI SYLLABLE NDOLE FA..VAI SYMBOL JONG +A620..A629;N # Nd [10] VAI DIGIT ZERO..VAI DIGIT NINE +A62A..A62B;N # Lo [2] VAI SYLLABLE NDOLE MA..VAI SYLLABLE NDOLE DO +A640..A66D;N # L& [46] CYRILLIC CAPITAL LETTER ZEMLYA..CYRILLIC SMALL LETTER DOUBLE MONOCULAR O +A66E;N # Lo CYRILLIC LETTER MULTIOCULAR O +A66F;N # Mn COMBINING CYRILLIC VZMET +A670..A672;N # Me [3] COMBINING CYRILLIC TEN MILLIONS SIGN..COMBINING CYRILLIC THOUSAND MILLIONS SIGN +A673;N # Po SLAVONIC ASTERISK +A674..A67D;N # Mn [10] COMBINING CYRILLIC LETTER UKRAINIAN IE..COMBINING CYRILLIC PAYEROK +A67E;N # Po CYRILLIC KAVYKA +A67F;N # Lm CYRILLIC PAYEROK +A680..A69B;N # L& [28] CYRILLIC CAPITAL LETTER DWE..CYRILLIC SMALL LETTER CROSSED O +A69C..A69D;N # Lm [2] MODIFIER LETTER CYRILLIC HARD SIGN..MODIFIER LETTER CYRILLIC SOFT SIGN +A69E..A69F;N # Mn [2] COMBINING CYRILLIC LETTER EF..COMBINING CYRILLIC LETTER IOTIFIED E +A6A0..A6E5;N # Lo [70] BAMUM LETTER A..BAMUM LETTER KI +A6E6..A6EF;N # Nl [10] BAMUM LETTER MO..BAMUM LETTER KOGHOM +A6F0..A6F1;N # Mn [2] BAMUM COMBINING MARK KOQNDON..BAMUM COMBINING MARK TUKWENTIS +A6F2..A6F7;N # Po [6] BAMUM NJAEMLI..BAMUM QUESTION MARK +A700..A716;N # Sk [23] MODIFIER LETTER CHINESE TONE YIN PING..MODIFIER LETTER EXTRA-LOW LEFT-STEM TONE BAR +A717..A71F;N # Lm [9] MODIFIER LETTER DOT VERTICAL BAR..MODIFIER LETTER LOW INVERTED EXCLAMATION MARK +A720..A721;N # Sk [2] MODIFIER LETTER STRESS AND HIGH TONE..MODIFIER LETTER STRESS AND LOW TONE +A722..A76F;N # L& [78] LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF..LATIN SMALL LETTER CON +A770;N # Lm MODIFIER LETTER US +A771..A787;N # L& [23] LATIN SMALL LETTER DUM..LATIN SMALL LETTER INSULAR T +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..A7B9;N # L& [42] LATIN CAPITAL LETTER N WITH DESCENDER..LATIN SMALL LETTER U WITH STROKE +A7F7;N # Lo LATIN EPIGRAPHIC LETTER SIDEWAYS I +A7F8..A7F9;N # Lm [2] MODIFIER LETTER CAPITAL H WITH STROKE..MODIFIER LETTER SMALL LIGATURE OE +A7FA;N # Ll LATIN LETTER SMALL CAPITAL TURNED M +A7FB..A7FF;N # Lo [5] LATIN EPIGRAPHIC LETTER REVERSED F..LATIN EPIGRAPHIC LETTER ARCHAIC M +A800..A801;N # Lo [2] SYLOTI NAGRI LETTER A..SYLOTI NAGRI LETTER I +A802;N # Mn SYLOTI NAGRI SIGN DVISVARA +A803..A805;N # Lo [3] SYLOTI NAGRI LETTER U..SYLOTI NAGRI LETTER O +A806;N # Mn SYLOTI NAGRI SIGN HASANTA +A807..A80A;N # Lo [4] SYLOTI NAGRI LETTER KO..SYLOTI NAGRI LETTER GHO +A80B;N # Mn SYLOTI NAGRI SIGN ANUSVARA +A80C..A822;N # Lo [23] SYLOTI NAGRI LETTER CO..SYLOTI NAGRI LETTER HO +A823..A824;N # Mc [2] SYLOTI NAGRI VOWEL SIGN A..SYLOTI NAGRI VOWEL SIGN I +A825..A826;N # Mn [2] SYLOTI NAGRI VOWEL SIGN U..SYLOTI NAGRI VOWEL SIGN E +A827;N # Mc SYLOTI NAGRI VOWEL SIGN OO +A828..A82B;N # So [4] SYLOTI NAGRI POETRY MARK-1..SYLOTI NAGRI POETRY MARK-4 +A830..A835;N # No [6] NORTH INDIC FRACTION ONE QUARTER..NORTH INDIC FRACTION THREE SIXTEENTHS +A836..A837;N # So [2] NORTH INDIC QUARTER MARK..NORTH INDIC PLACEHOLDER MARK +A838;N # Sc NORTH INDIC RUPEE MARK +A839;N # So NORTH INDIC QUANTITY MARK +A840..A873;N # Lo [52] PHAGS-PA LETTER KA..PHAGS-PA LETTER CANDRABINDU +A874..A877;N # Po [4] PHAGS-PA SINGLE HEAD MARK..PHAGS-PA MARK DOUBLE SHAD +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..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 +A8F2..A8F7;N # Lo [6] DEVANAGARI SIGN SPACING CANDRABINDU..DEVANAGARI SIGN CANDRABINDU AVAGRAHA +A8F8..A8FA;N # Po [3] DEVANAGARI SIGN PUSHPIKA..DEVANAGARI CARET +A8FB;N # Lo DEVANAGARI HEADSTROKE +A8FC;N # Po DEVANAGARI SIGN SIDDHAM +A8FD..A8FE;N # Lo [2] DEVANAGARI JAIN OM..DEVANAGARI LETTER AY +A8FF;N # Mn DEVANAGARI VOWEL SIGN AY +A900..A909;N # Nd [10] KAYAH LI DIGIT ZERO..KAYAH LI DIGIT NINE +A90A..A925;N # Lo [28] KAYAH LI LETTER KA..KAYAH LI LETTER OO +A926..A92D;N # Mn [8] KAYAH LI VOWEL UE..KAYAH LI TONE CALYA PLOPHU +A92E..A92F;N # Po [2] KAYAH LI SIGN CWI..KAYAH LI SIGN SHYA +A930..A946;N # Lo [23] REJANG LETTER KA..REJANG LETTER A +A947..A951;N # Mn [11] REJANG VOWEL SIGN I..REJANG CONSONANT SIGN R +A952..A953;N # Mc [2] REJANG CONSONANT SIGN H..REJANG VIRAMA +A95F;N # Po REJANG SECTION MARK +A960..A97C;W # Lo [29] HANGUL CHOSEONG TIKEUT-MIEUM..HANGUL CHOSEONG SSANGYEORINHIEUH +A980..A982;N # Mn [3] JAVANESE SIGN PANYANGGA..JAVANESE SIGN LAYAR +A983;N # Mc JAVANESE SIGN WIGNYAN +A984..A9B2;N # Lo [47] JAVANESE LETTER A..JAVANESE LETTER HA +A9B3;N # Mn JAVANESE SIGN CECAK TELU +A9B4..A9B5;N # Mc [2] JAVANESE VOWEL SIGN TARUNG..JAVANESE VOWEL SIGN TOLONG +A9B6..A9B9;N # Mn [4] JAVANESE VOWEL SIGN WULU..JAVANESE VOWEL SIGN SUKU MENDUT +A9BA..A9BB;N # Mc [2] JAVANESE VOWEL SIGN TALING..JAVANESE VOWEL SIGN DIRGA MURE +A9BC;N # Mn JAVANESE VOWEL SIGN PEPET +A9BD..A9C0;N # Mc [4] JAVANESE CONSONANT SIGN KERET..JAVANESE PANGKON +A9C1..A9CD;N # Po [13] JAVANESE LEFT RERENGGAN..JAVANESE TURNED PADA PISELEH +A9CF;N # Lm JAVANESE PANGRANGKEP +A9D0..A9D9;N # Nd [10] JAVANESE DIGIT ZERO..JAVANESE DIGIT NINE +A9DE..A9DF;N # Po [2] JAVANESE PADA TIRTA TUMETES..JAVANESE PADA ISEN-ISEN +A9E0..A9E4;N # Lo [5] MYANMAR LETTER SHAN GHA..MYANMAR LETTER SHAN BHA +A9E5;N # Mn MYANMAR SIGN SHAN SAW +A9E6;N # Lm MYANMAR MODIFIER LETTER SHAN REDUPLICATION +A9E7..A9EF;N # Lo [9] MYANMAR LETTER TAI LAING NYA..MYANMAR LETTER TAI LAING NNA +A9F0..A9F9;N # Nd [10] MYANMAR TAI LAING DIGIT ZERO..MYANMAR TAI LAING DIGIT NINE +A9FA..A9FE;N # Lo [5] MYANMAR LETTER TAI LAING LLA..MYANMAR LETTER TAI LAING BHA +AA00..AA28;N # Lo [41] CHAM LETTER A..CHAM LETTER HA +AA29..AA2E;N # Mn [6] CHAM VOWEL SIGN AA..CHAM VOWEL SIGN OE +AA2F..AA30;N # Mc [2] CHAM VOWEL SIGN O..CHAM VOWEL SIGN AI +AA31..AA32;N # Mn [2] CHAM VOWEL SIGN AU..CHAM VOWEL SIGN UE +AA33..AA34;N # Mc [2] CHAM CONSONANT SIGN YA..CHAM CONSONANT SIGN RA +AA35..AA36;N # Mn [2] CHAM CONSONANT SIGN LA..CHAM CONSONANT SIGN WA +AA40..AA42;N # Lo [3] CHAM LETTER FINAL K..CHAM LETTER FINAL NG +AA43;N # Mn CHAM CONSONANT SIGN FINAL NG +AA44..AA4B;N # Lo [8] CHAM LETTER FINAL CH..CHAM LETTER FINAL SS +AA4C;N # Mn CHAM CONSONANT SIGN FINAL M +AA4D;N # Mc CHAM CONSONANT SIGN FINAL H +AA50..AA59;N # Nd [10] CHAM DIGIT ZERO..CHAM DIGIT NINE +AA5C..AA5F;N # Po [4] CHAM PUNCTUATION SPIRAL..CHAM PUNCTUATION TRIPLE DANDA +AA60..AA6F;N # Lo [16] MYANMAR LETTER KHAMTI GA..MYANMAR LETTER KHAMTI FA +AA70;N # Lm MYANMAR MODIFIER LETTER KHAMTI REDUPLICATION +AA71..AA76;N # Lo [6] MYANMAR LETTER KHAMTI XA..MYANMAR LOGOGRAM KHAMTI HM +AA77..AA79;N # So [3] MYANMAR SYMBOL AITON EXCLAMATION..MYANMAR SYMBOL AITON TWO +AA7A;N # Lo MYANMAR LETTER AITON RA +AA7B;N # Mc MYANMAR SIGN PAO KAREN TONE +AA7C;N # Mn MYANMAR SIGN TAI LAING TONE-2 +AA7D;N # Mc MYANMAR SIGN TAI LAING TONE-5 +AA7E..AA7F;N # Lo [2] MYANMAR LETTER SHWE PALAUNG CHA..MYANMAR LETTER SHWE PALAUNG SHA +AA80..AAAF;N # Lo [48] TAI VIET LETTER LOW KO..TAI VIET LETTER HIGH O +AAB0;N # Mn TAI VIET MAI KANG +AAB1;N # Lo TAI VIET VOWEL AA +AAB2..AAB4;N # Mn [3] TAI VIET VOWEL I..TAI VIET VOWEL U +AAB5..AAB6;N # Lo [2] TAI VIET VOWEL E..TAI VIET VOWEL O +AAB7..AAB8;N # Mn [2] TAI VIET MAI KHIT..TAI VIET VOWEL IA +AAB9..AABD;N # Lo [5] TAI VIET VOWEL UEA..TAI VIET VOWEL AN +AABE..AABF;N # Mn [2] TAI VIET VOWEL AM..TAI VIET TONE MAI EK +AAC0;N # Lo TAI VIET TONE MAI NUENG +AAC1;N # Mn TAI VIET TONE MAI THO +AAC2;N # Lo TAI VIET TONE MAI SONG +AADB..AADC;N # Lo [2] TAI VIET SYMBOL KON..TAI VIET SYMBOL NUENG +AADD;N # Lm TAI VIET SYMBOL SAM +AADE..AADF;N # Po [2] TAI VIET SYMBOL HO HOI..TAI VIET SYMBOL KOI KOI +AAE0..AAEA;N # Lo [11] MEETEI MAYEK LETTER E..MEETEI MAYEK LETTER SSA +AAEB;N # Mc MEETEI MAYEK VOWEL SIGN II +AAEC..AAED;N # Mn [2] MEETEI MAYEK VOWEL SIGN UU..MEETEI MAYEK VOWEL SIGN AAI +AAEE..AAEF;N # Mc [2] MEETEI MAYEK VOWEL SIGN AU..MEETEI MAYEK VOWEL SIGN AAU +AAF0..AAF1;N # Po [2] MEETEI MAYEK CHEIKHAN..MEETEI MAYEK AHANG KHUDAM +AAF2;N # Lo MEETEI MAYEK ANJI +AAF3..AAF4;N # Lm [2] MEETEI MAYEK SYLLABLE REPETITION MARK..MEETEI MAYEK WORD REPETITION MARK +AAF5;N # Mc MEETEI MAYEK VOWEL SIGN VISARGA +AAF6;N # Mn MEETEI MAYEK VIRAMA +AB01..AB06;N # Lo [6] ETHIOPIC SYLLABLE TTHU..ETHIOPIC SYLLABLE TTHO +AB09..AB0E;N # Lo [6] ETHIOPIC SYLLABLE DDHU..ETHIOPIC SYLLABLE DDHO +AB11..AB16;N # Lo [6] ETHIOPIC SYLLABLE DZU..ETHIOPIC SYLLABLE DZO +AB20..AB26;N # Lo [7] ETHIOPIC SYLLABLE CCHHA..ETHIOPIC SYLLABLE CCHHO +AB28..AB2E;N # Lo [7] ETHIOPIC SYLLABLE BBA..ETHIOPIC SYLLABLE BBO +AB30..AB5A;N # Ll [43] LATIN SMALL LETTER BARRED ALPHA..LATIN SMALL LETTER Y WITH SHORT RIGHT LEG +AB5B;N # Sk MODIFIER BREVE WITH INVERTED BREVE +AB5C..AB5F;N # Lm [4] MODIFIER LETTER SMALL HENG..MODIFIER LETTER SMALL U WITH LEFT HOOK +AB60..AB65;N # Ll [6] LATIN SMALL LETTER SAKHA YAT..GREEK LETTER SMALL CAPITAL OMEGA +AB70..ABBF;N # Ll [80] CHEROKEE SMALL LETTER A..CHEROKEE SMALL LETTER YA +ABC0..ABE2;N # Lo [35] MEETEI MAYEK LETTER KOK..MEETEI MAYEK LETTER I LONSUM +ABE3..ABE4;N # Mc [2] MEETEI MAYEK VOWEL SIGN ONAP..MEETEI MAYEK VOWEL SIGN INAP +ABE5;N # Mn MEETEI MAYEK VOWEL SIGN ANAP +ABE6..ABE7;N # Mc [2] MEETEI MAYEK VOWEL SIGN YENAP..MEETEI MAYEK VOWEL SIGN SOUNAP +ABE8;N # Mn MEETEI MAYEK VOWEL SIGN UNAP +ABE9..ABEA;N # Mc [2] MEETEI MAYEK VOWEL SIGN CHEINAP..MEETEI MAYEK VOWEL SIGN NUNG +ABEB;N # Po MEETEI MAYEK CHEIKHEI +ABEC;N # Mc MEETEI MAYEK LUM IYEK +ABED;N # Mn MEETEI MAYEK APUN IYEK +ABF0..ABF9;N # Nd [10] MEETEI MAYEK DIGIT ZERO..MEETEI MAYEK DIGIT NINE +AC00..D7A3;W # Lo [11172] HANGUL SYLLABLE GA..HANGUL SYLLABLE HIH +D7B0..D7C6;N # Lo [23] HANGUL JUNGSEONG O-YEO..HANGUL JUNGSEONG ARAEA-E +D7CB..D7FB;N # Lo [49] HANGUL JONGSEONG NIEUN-RIEUL..HANGUL JONGSEONG PHIEUPH-THIEUTH +D800..DB7F;N # Cs [896] .. +DB80..DBFF;N # Cs [128] .. +DC00..DFFF;N # Cs [1024] .. +E000..F8FF;A # Co [6400] .. +F900..FA6D;W # Lo [366] CJK COMPATIBILITY IDEOGRAPH-F900..CJK COMPATIBILITY IDEOGRAPH-FA6D +FA6E..FA6F;W # Cn [2] .. +FA70..FAD9;W # Lo [106] CJK COMPATIBILITY IDEOGRAPH-FA70..CJK COMPATIBILITY IDEOGRAPH-FAD9 +FADA..FAFF;W # Cn [38] .. +FB00..FB06;N # Ll [7] LATIN SMALL LIGATURE FF..LATIN SMALL LIGATURE ST +FB13..FB17;N # Ll [5] ARMENIAN SMALL LIGATURE MEN NOW..ARMENIAN SMALL LIGATURE MEN XEH +FB1D;N # Lo HEBREW LETTER YOD WITH HIRIQ +FB1E;N # Mn HEBREW POINT JUDEO-SPANISH VARIKA +FB1F..FB28;N # Lo [10] HEBREW LIGATURE YIDDISH YOD YOD PATAH..HEBREW LETTER WIDE TAV +FB29;N # Sm HEBREW LETTER ALTERNATIVE PLUS SIGN +FB2A..FB36;N # Lo [13] HEBREW LETTER SHIN WITH SHIN DOT..HEBREW LETTER ZAYIN WITH DAGESH +FB38..FB3C;N # Lo [5] HEBREW LETTER TET WITH DAGESH..HEBREW LETTER LAMED WITH DAGESH +FB3E;N # Lo HEBREW LETTER MEM WITH DAGESH +FB40..FB41;N # Lo [2] HEBREW LETTER NUN WITH DAGESH..HEBREW LETTER SAMEKH WITH DAGESH +FB43..FB44;N # Lo [2] HEBREW LETTER FINAL PE WITH DAGESH..HEBREW LETTER PE WITH DAGESH +FB46..FB4F;N # Lo [10] HEBREW LETTER TSADI WITH DAGESH..HEBREW LIGATURE ALEF LAMED +FB50..FBB1;N # Lo [98] ARABIC LETTER ALEF WASLA ISOLATED FORM..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM +FBB2..FBC1;N # Sk [16] ARABIC SYMBOL DOT ABOVE..ARABIC SYMBOL SMALL TAH BELOW +FBD3..FD3D;N # Lo [363] ARABIC LETTER NG ISOLATED FORM..ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM +FD3E;N # Pe ORNATE LEFT PARENTHESIS +FD3F;N # Ps ORNATE RIGHT PARENTHESIS +FD50..FD8F;N # Lo [64] ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM..ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM +FD92..FDC7;N # Lo [54] ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM..ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM +FDF0..FDFB;N # Lo [12] ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM..ARABIC LIGATURE JALLAJALALOUHOU +FDFC;N # Sc RIAL SIGN +FDFD;N # So ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM +FE00..FE0F;A # Mn [16] VARIATION SELECTOR-1..VARIATION SELECTOR-16 +FE10..FE16;W # Po [7] PRESENTATION FORM FOR VERTICAL COMMA..PRESENTATION FORM FOR VERTICAL QUESTION MARK +FE17;W # Ps PRESENTATION FORM FOR VERTICAL LEFT WHITE LENTICULAR BRACKET +FE18;W # Pe PRESENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRAKCET +FE19;W # Po PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS +FE20..FE2F;N # Mn [16] COMBINING LIGATURE LEFT HALF..COMBINING CYRILLIC TITLO RIGHT HALF +FE30;W # Po PRESENTATION FORM FOR VERTICAL TWO DOT LEADER +FE31..FE32;W # Pd [2] PRESENTATION FORM FOR VERTICAL EM DASH..PRESENTATION FORM FOR VERTICAL EN DASH +FE33..FE34;W # Pc [2] PRESENTATION FORM FOR VERTICAL LOW LINE..PRESENTATION FORM FOR VERTICAL WAVY LOW LINE +FE35;W # Ps PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS +FE36;W # Pe PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS +FE37;W # Ps PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET +FE38;W # Pe PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET +FE39;W # Ps PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET +FE3A;W # Pe PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET +FE3B;W # Ps PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET +FE3C;W # Pe PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET +FE3D;W # Ps PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET +FE3E;W # Pe PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET +FE3F;W # Ps PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET +FE40;W # Pe PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET +FE41;W # Ps PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET +FE42;W # Pe PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET +FE43;W # Ps PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET +FE44;W # Pe PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET +FE45..FE46;W # Po [2] SESAME DOT..WHITE SESAME DOT +FE47;W # Ps PRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKET +FE48;W # Pe PRESENTATION FORM FOR VERTICAL RIGHT SQUARE BRACKET +FE49..FE4C;W # Po [4] DASHED OVERLINE..DOUBLE WAVY OVERLINE +FE4D..FE4F;W # Pc [3] DASHED LOW LINE..WAVY LOW LINE +FE50..FE52;W # Po [3] SMALL COMMA..SMALL FULL STOP +FE54..FE57;W # Po [4] SMALL SEMICOLON..SMALL EXCLAMATION MARK +FE58;W # Pd SMALL EM DASH +FE59;W # Ps SMALL LEFT PARENTHESIS +FE5A;W # Pe SMALL RIGHT PARENTHESIS +FE5B;W # Ps SMALL LEFT CURLY BRACKET +FE5C;W # Pe SMALL RIGHT CURLY BRACKET +FE5D;W # Ps SMALL LEFT TORTOISE SHELL BRACKET +FE5E;W # Pe SMALL RIGHT TORTOISE SHELL BRACKET +FE5F..FE61;W # Po [3] SMALL NUMBER SIGN..SMALL ASTERISK +FE62;W # Sm SMALL PLUS SIGN +FE63;W # Pd SMALL HYPHEN-MINUS +FE64..FE66;W # Sm [3] SMALL LESS-THAN SIGN..SMALL EQUALS SIGN +FE68;W # Po SMALL REVERSE SOLIDUS +FE69;W # Sc SMALL DOLLAR SIGN +FE6A..FE6B;W # Po [2] SMALL PERCENT SIGN..SMALL COMMERCIAL AT +FE70..FE74;N # Lo [5] ARABIC FATHATAN ISOLATED FORM..ARABIC KASRATAN ISOLATED FORM +FE76..FEFC;N # Lo [135] ARABIC FATHA ISOLATED FORM..ARABIC LIGATURE LAM WITH ALEF FINAL FORM +FEFF;N # Cf ZERO WIDTH NO-BREAK SPACE +FF01..FF03;F # Po [3] FULLWIDTH EXCLAMATION MARK..FULLWIDTH NUMBER SIGN +FF04;F # Sc FULLWIDTH DOLLAR SIGN +FF05..FF07;F # Po [3] FULLWIDTH PERCENT SIGN..FULLWIDTH APOSTROPHE +FF08;F # Ps FULLWIDTH LEFT PARENTHESIS +FF09;F # Pe FULLWIDTH RIGHT PARENTHESIS +FF0A;F # Po FULLWIDTH ASTERISK +FF0B;F # Sm FULLWIDTH PLUS SIGN +FF0C;F # Po FULLWIDTH COMMA +FF0D;F # Pd FULLWIDTH HYPHEN-MINUS +FF0E..FF0F;F # Po [2] FULLWIDTH FULL STOP..FULLWIDTH SOLIDUS +FF10..FF19;F # Nd [10] FULLWIDTH DIGIT ZERO..FULLWIDTH DIGIT NINE +FF1A..FF1B;F # Po [2] FULLWIDTH COLON..FULLWIDTH SEMICOLON +FF1C..FF1E;F # Sm [3] FULLWIDTH LESS-THAN SIGN..FULLWIDTH GREATER-THAN SIGN +FF1F..FF20;F # Po [2] FULLWIDTH QUESTION MARK..FULLWIDTH COMMERCIAL AT +FF21..FF3A;F # Lu [26] FULLWIDTH LATIN CAPITAL LETTER A..FULLWIDTH LATIN CAPITAL LETTER Z +FF3B;F # Ps FULLWIDTH LEFT SQUARE BRACKET +FF3C;F # Po FULLWIDTH REVERSE SOLIDUS +FF3D;F # Pe FULLWIDTH RIGHT SQUARE BRACKET +FF3E;F # Sk FULLWIDTH CIRCUMFLEX ACCENT +FF3F;F # Pc FULLWIDTH LOW LINE +FF40;F # Sk FULLWIDTH GRAVE ACCENT +FF41..FF5A;F # Ll [26] FULLWIDTH LATIN SMALL LETTER A..FULLWIDTH LATIN SMALL LETTER Z +FF5B;F # Ps FULLWIDTH LEFT CURLY BRACKET +FF5C;F # Sm FULLWIDTH VERTICAL LINE +FF5D;F # Pe FULLWIDTH RIGHT CURLY BRACKET +FF5E;F # Sm FULLWIDTH TILDE +FF5F;F # Ps FULLWIDTH LEFT WHITE PARENTHESIS +FF60;F # Pe FULLWIDTH RIGHT WHITE PARENTHESIS +FF61;H # Po HALFWIDTH IDEOGRAPHIC FULL STOP +FF62;H # Ps HALFWIDTH LEFT CORNER BRACKET +FF63;H # Pe HALFWIDTH RIGHT CORNER BRACKET +FF64..FF65;H # Po [2] HALFWIDTH IDEOGRAPHIC COMMA..HALFWIDTH KATAKANA MIDDLE DOT +FF66..FF6F;H # Lo [10] HALFWIDTH KATAKANA LETTER WO..HALFWIDTH KATAKANA LETTER SMALL TU +FF70;H # Lm HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK +FF71..FF9D;H # Lo [45] HALFWIDTH KATAKANA LETTER A..HALFWIDTH KATAKANA LETTER N +FF9E..FF9F;H # Lm [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK +FFA0..FFBE;H # Lo [31] HALFWIDTH HANGUL FILLER..HALFWIDTH HANGUL LETTER HIEUH +FFC2..FFC7;H # Lo [6] HALFWIDTH HANGUL LETTER A..HALFWIDTH HANGUL LETTER E +FFCA..FFCF;H # Lo [6] HALFWIDTH HANGUL LETTER YEO..HALFWIDTH HANGUL LETTER OE +FFD2..FFD7;H # Lo [6] HALFWIDTH HANGUL LETTER YO..HALFWIDTH HANGUL LETTER YU +FFDA..FFDC;H # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL LETTER I +FFE0..FFE1;F # Sc [2] FULLWIDTH CENT SIGN..FULLWIDTH POUND SIGN +FFE2;F # Sm FULLWIDTH NOT SIGN +FFE3;F # Sk FULLWIDTH MACRON +FFE4;F # So FULLWIDTH BROKEN BAR +FFE5..FFE6;F # Sc [2] FULLWIDTH YEN SIGN..FULLWIDTH WON SIGN +FFE8;H # So HALFWIDTH FORMS LIGHT VERTICAL +FFE9..FFEC;H # Sm [4] HALFWIDTH LEFTWARDS ARROW..HALFWIDTH DOWNWARDS ARROW +FFED..FFEE;H # So [2] HALFWIDTH BLACK SQUARE..HALFWIDTH WHITE CIRCLE +FFF9..FFFB;N # Cf [3] INTERLINEAR ANNOTATION ANCHOR..INTERLINEAR ANNOTATION TERMINATOR +FFFC;N # So OBJECT REPLACEMENT CHARACTER +FFFD;A # So REPLACEMENT CHARACTER +10000..1000B;N # Lo [12] LINEAR B SYLLABLE B008 A..LINEAR B SYLLABLE B046 JE +1000D..10026;N # Lo [26] LINEAR B SYLLABLE B036 JO..LINEAR B SYLLABLE B032 QO +10028..1003A;N # Lo [19] LINEAR B SYLLABLE B060 RA..LINEAR B SYLLABLE B042 WO +1003C..1003D;N # Lo [2] LINEAR B SYLLABLE B017 ZA..LINEAR B SYLLABLE B074 ZE +1003F..1004D;N # Lo [15] LINEAR B SYLLABLE B020 ZO..LINEAR B SYLLABLE B091 TWO +10050..1005D;N # Lo [14] LINEAR B SYMBOL B018..LINEAR B SYMBOL B089 +10080..100FA;N # Lo [123] LINEAR B IDEOGRAM B100 MAN..LINEAR B IDEOGRAM VESSEL B305 +10100..10102;N # Po [3] AEGEAN WORD SEPARATOR LINE..AEGEAN CHECK MARK +10107..10133;N # No [45] AEGEAN NUMBER ONE..AEGEAN NUMBER NINETY THOUSAND +10137..1013F;N # So [9] AEGEAN WEIGHT BASE UNIT..AEGEAN MEASURE THIRD SUBUNIT +10140..10174;N # Nl [53] GREEK ACROPHONIC ATTIC ONE QUARTER..GREEK ACROPHONIC STRATIAN FIFTY MNAS +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..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 +101FD;N # Mn PHAISTOS DISC SIGN COMBINING OBLIQUE STROKE +10280..1029C;N # Lo [29] LYCIAN LETTER A..LYCIAN LETTER X +102A0..102D0;N # Lo [49] CARIAN LETTER A..CARIAN LETTER UUU3 +102E0;N # Mn COPTIC EPACT THOUSANDS MARK +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 +1034A;N # Nl GOTHIC LETTER NINE HUNDRED +10350..10375;N # Lo [38] OLD PERMIC LETTER AN..OLD PERMIC LETTER IA +10376..1037A;N # Mn [5] COMBINING OLD PERMIC LETTER AN..COMBINING OLD PERMIC LETTER SII +10380..1039D;N # Lo [30] UGARITIC LETTER ALPA..UGARITIC LETTER SSU +1039F;N # Po UGARITIC WORD DIVIDER +103A0..103C3;N # Lo [36] OLD PERSIAN SIGN A..OLD PERSIAN SIGN HA +103C8..103CF;N # Lo [8] OLD PERSIAN SIGN AURAMAZDAA..OLD PERSIAN SIGN BUUMISH +103D0;N # Po OLD PERSIAN WORD DIVIDER +103D1..103D5;N # Nl [5] OLD PERSIAN NUMBER ONE..OLD PERSIAN NUMBER HUNDRED +10400..1044F;N # L& [80] DESERET CAPITAL LETTER LONG I..DESERET SMALL LETTER EW +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 +10600..10736;N # Lo [311] LINEAR A SIGN AB001..LINEAR A SIGN A664 +10740..10755;N # Lo [22] LINEAR A SIGN A701 A..LINEAR A SIGN A732 JE +10760..10767;N # Lo [8] LINEAR A SIGN A800..LINEAR A SIGN A807 +10800..10805;N # Lo [6] CYPRIOT SYLLABLE A..CYPRIOT SYLLABLE JA +10808;N # Lo CYPRIOT SYLLABLE JO +1080A..10835;N # Lo [44] CYPRIOT SYLLABLE KA..CYPRIOT SYLLABLE WO +10837..10838;N # Lo [2] CYPRIOT SYLLABLE XA..CYPRIOT SYLLABLE XE +1083C;N # Lo CYPRIOT SYLLABLE ZA +1083F;N # Lo CYPRIOT SYLLABLE ZO +10840..10855;N # Lo [22] IMPERIAL ARAMAIC LETTER ALEPH..IMPERIAL ARAMAIC LETTER TAW +10857;N # Po IMPERIAL ARAMAIC SECTION SIGN +10858..1085F;N # No [8] IMPERIAL ARAMAIC NUMBER ONE..IMPERIAL ARAMAIC NUMBER TEN THOUSAND +10860..10876;N # Lo [23] PALMYRENE LETTER ALEPH..PALMYRENE LETTER TAW +10877..10878;N # So [2] PALMYRENE LEFT-POINTING FLEURON..PALMYRENE RIGHT-POINTING FLEURON +10879..1087F;N # No [7] PALMYRENE NUMBER ONE..PALMYRENE NUMBER TWENTY +10880..1089E;N # Lo [31] NABATAEAN LETTER FINAL ALEPH..NABATAEAN LETTER TAW +108A7..108AF;N # No [9] NABATAEAN NUMBER ONE..NABATAEAN NUMBER ONE HUNDRED +108E0..108F2;N # Lo [19] HATRAN LETTER ALEPH..HATRAN LETTER QOPH +108F4..108F5;N # Lo [2] HATRAN LETTER SHIN..HATRAN LETTER TAW +108FB..108FF;N # No [5] HATRAN NUMBER ONE..HATRAN NUMBER ONE HUNDRED +10900..10915;N # Lo [22] PHOENICIAN LETTER ALF..PHOENICIAN LETTER TAU +10916..1091B;N # No [6] PHOENICIAN NUMBER ONE..PHOENICIAN NUMBER THREE +1091F;N # Po PHOENICIAN WORD SEPARATOR +10920..10939;N # Lo [26] LYDIAN LETTER A..LYDIAN LETTER C +1093F;N # Po LYDIAN TRIANGULAR MARK +10980..1099F;N # Lo [32] MEROITIC HIEROGLYPHIC LETTER A..MEROITIC HIEROGLYPHIC SYMBOL VIDJ-2 +109A0..109B7;N # Lo [24] MEROITIC CURSIVE LETTER A..MEROITIC CURSIVE LETTER DA +109BC..109BD;N # No [2] MEROITIC CURSIVE FRACTION ELEVEN TWELFTHS..MEROITIC CURSIVE FRACTION ONE HALF +109BE..109BF;N # Lo [2] MEROITIC CURSIVE LOGOGRAM RMT..MEROITIC CURSIVE LOGOGRAM IMN +109C0..109CF;N # No [16] MEROITIC CURSIVE NUMBER ONE..MEROITIC CURSIVE NUMBER SEVENTY +109D2..109FF;N # No [46] MEROITIC CURSIVE NUMBER ONE HUNDRED..MEROITIC CURSIVE FRACTION TEN TWELFTHS +10A00;N # Lo KHAROSHTHI LETTER A +10A01..10A03;N # Mn [3] KHAROSHTHI VOWEL SIGN I..KHAROSHTHI VOWEL SIGN VOCALIC R +10A05..10A06;N # Mn [2] KHAROSHTHI VOWEL SIGN E..KHAROSHTHI VOWEL SIGN O +10A0C..10A0F;N # Mn [4] KHAROSHTHI VOWEL LENGTH MARK..KHAROSHTHI SIGN VISARGA +10A10..10A13;N # Lo [4] KHAROSHTHI LETTER KA..KHAROSHTHI LETTER GHA +10A15..10A17;N # Lo [3] KHAROSHTHI LETTER CA..KHAROSHTHI LETTER JA +10A19..10A35;N # Lo [29] KHAROSHTHI LETTER NYA..KHAROSHTHI LETTER VHA +10A38..10A3A;N # Mn [3] KHAROSHTHI SIGN BAR ABOVE..KHAROSHTHI SIGN DOT BELOW +10A3F;N # Mn KHAROSHTHI VIRAMA +10A40..10A48;N # No [9] KHAROSHTHI DIGIT ONE..KHAROSHTHI FRACTION ONE HALF +10A50..10A58;N # Po [9] KHAROSHTHI PUNCTUATION DOT..KHAROSHTHI PUNCTUATION LINES +10A60..10A7C;N # Lo [29] OLD SOUTH ARABIAN LETTER HE..OLD SOUTH ARABIAN LETTER THETH +10A7D..10A7E;N # No [2] OLD SOUTH ARABIAN NUMBER ONE..OLD SOUTH ARABIAN NUMBER FIFTY +10A7F;N # Po OLD SOUTH ARABIAN NUMERIC INDICATOR +10A80..10A9C;N # Lo [29] OLD NORTH ARABIAN LETTER HEH..OLD NORTH ARABIAN LETTER ZAH +10A9D..10A9F;N # No [3] OLD NORTH ARABIAN NUMBER ONE..OLD NORTH ARABIAN NUMBER TWENTY +10AC0..10AC7;N # Lo [8] MANICHAEAN LETTER ALEPH..MANICHAEAN LETTER WAW +10AC8;N # So MANICHAEAN SIGN UD +10AC9..10AE4;N # Lo [28] MANICHAEAN LETTER ZAYIN..MANICHAEAN LETTER TAW +10AE5..10AE6;N # Mn [2] MANICHAEAN ABBREVIATION MARK ABOVE..MANICHAEAN ABBREVIATION MARK BELOW +10AEB..10AEF;N # No [5] MANICHAEAN NUMBER ONE..MANICHAEAN NUMBER ONE HUNDRED +10AF0..10AF6;N # Po [7] MANICHAEAN PUNCTUATION STAR..MANICHAEAN PUNCTUATION LINE FILLER +10B00..10B35;N # Lo [54] AVESTAN LETTER A..AVESTAN LETTER HE +10B39..10B3F;N # Po [7] AVESTAN ABBREVIATION MARK..LARGE ONE RING OVER TWO RINGS PUNCTUATION +10B40..10B55;N # Lo [22] INSCRIPTIONAL PARTHIAN LETTER ALEPH..INSCRIPTIONAL PARTHIAN LETTER TAW +10B58..10B5F;N # No [8] INSCRIPTIONAL PARTHIAN NUMBER ONE..INSCRIPTIONAL PARTHIAN NUMBER ONE THOUSAND +10B60..10B72;N # Lo [19] INSCRIPTIONAL PAHLAVI LETTER ALEPH..INSCRIPTIONAL PAHLAVI LETTER TAW +10B78..10B7F;N # No [8] INSCRIPTIONAL PAHLAVI NUMBER ONE..INSCRIPTIONAL PAHLAVI NUMBER ONE THOUSAND +10B80..10B91;N # Lo [18] PSALTER PAHLAVI LETTER ALEPH..PSALTER PAHLAVI LETTER TAW +10B99..10B9C;N # Po [4] PSALTER PAHLAVI SECTION MARK..PSALTER PAHLAVI FOUR DOTS WITH DOT +10BA9..10BAF;N # No [7] PSALTER PAHLAVI NUMBER ONE..PSALTER PAHLAVI NUMBER ONE HUNDRED +10C00..10C48;N # Lo [73] OLD TURKIC LETTER ORKHON A..OLD TURKIC LETTER ORKHON BASH +10C80..10CB2;N # Lu [51] OLD HUNGARIAN CAPITAL LETTER A..OLD HUNGARIAN CAPITAL LETTER US +10CC0..10CF2;N # Ll [51] OLD HUNGARIAN SMALL LETTER A..OLD HUNGARIAN SMALL LETTER US +10CFA..10CFF;N # No [6] OLD HUNGARIAN NUMBER ONE..OLD HUNGARIAN NUMBER ONE THOUSAND +10D00..10D23;N # Lo [36] HANIFI ROHINGYA LETTER A..HANIFI ROHINGYA MARK NA KHONNA +10D24..10D27;N # Mn [4] HANIFI ROHINGYA SIGN HARBAHAY..HANIFI ROHINGYA SIGN TASSI +10D30..10D39;N # Nd [10] HANIFI ROHINGYA DIGIT ZERO..HANIFI ROHINGYA DIGIT NINE +10E60..10E7E;N # No [31] RUMI DIGIT ONE..RUMI FRACTION TWO THIRDS +10F00..10F1C;N # Lo [29] OLD SOGDIAN LETTER ALEPH..OLD SOGDIAN LETTER FINAL TAW WITH VERTICAL TAIL +10F1D..10F26;N # No [10] OLD SOGDIAN NUMBER ONE..OLD SOGDIAN FRACTION ONE HALF +10F27;N # Lo OLD SOGDIAN LIGATURE AYIN-DALETH +10F30..10F45;N # Lo [22] SOGDIAN LETTER ALEPH..SOGDIAN INDEPENDENT SHIN +10F46..10F50;N # Mn [11] SOGDIAN COMBINING DOT BELOW..SOGDIAN COMBINING STROKE BELOW +10F51..10F54;N # No [4] SOGDIAN NUMBER ONE..SOGDIAN NUMBER ONE HUNDRED +10F55..10F59;N # Po [5] SOGDIAN PUNCTUATION TWO VERTICAL BARS..SOGDIAN PUNCTUATION HALF CIRCLE WITH DOT +11000;N # Mc BRAHMI SIGN CANDRABINDU +11001;N # Mn BRAHMI SIGN ANUSVARA +11002;N # Mc BRAHMI SIGN VISARGA +11003..11037;N # Lo [53] BRAHMI SIGN JIHVAMULIYA..BRAHMI LETTER OLD TAMIL NNNA +11038..11046;N # Mn [15] BRAHMI VOWEL SIGN AA..BRAHMI VIRAMA +11047..1104D;N # Po [7] BRAHMI DANDA..BRAHMI PUNCTUATION LOTUS +11052..11065;N # No [20] BRAHMI NUMBER ONE..BRAHMI NUMBER ONE THOUSAND +11066..1106F;N # Nd [10] BRAHMI DIGIT ZERO..BRAHMI DIGIT NINE +1107F;N # Mn BRAHMI NUMBER JOINER +11080..11081;N # Mn [2] KAITHI SIGN CANDRABINDU..KAITHI SIGN ANUSVARA +11082;N # Mc KAITHI SIGN VISARGA +11083..110AF;N # Lo [45] KAITHI LETTER A..KAITHI LETTER HA +110B0..110B2;N # Mc [3] KAITHI VOWEL SIGN AA..KAITHI VOWEL SIGN II +110B3..110B6;N # Mn [4] KAITHI VOWEL SIGN U..KAITHI VOWEL SIGN AI +110B7..110B8;N # Mc [2] KAITHI VOWEL SIGN O..KAITHI VOWEL SIGN AU +110B9..110BA;N # Mn [2] KAITHI SIGN VIRAMA..KAITHI SIGN NUKTA +110BB..110BC;N # Po [2] KAITHI ABBREVIATION SIGN..KAITHI ENUMERATION SIGN +110BD;N # Cf KAITHI NUMBER SIGN +110BE..110C1;N # Po [4] KAITHI SECTION MARK..KAITHI DOUBLE DANDA +110CD;N # Cf KAITHI NUMBER SIGN ABOVE +110D0..110E8;N # Lo [25] SORA SOMPENG LETTER SAH..SORA SOMPENG LETTER MAE +110F0..110F9;N # Nd [10] SORA SOMPENG DIGIT ZERO..SORA SOMPENG DIGIT NINE +11100..11102;N # Mn [3] CHAKMA SIGN CANDRABINDU..CHAKMA SIGN VISARGA +11103..11126;N # Lo [36] CHAKMA LETTER AA..CHAKMA LETTER HAA +11127..1112B;N # Mn [5] CHAKMA VOWEL SIGN A..CHAKMA VOWEL SIGN UU +1112C;N # Mc CHAKMA VOWEL SIGN E +1112D..11134;N # Mn [8] CHAKMA VOWEL SIGN AI..CHAKMA MAAYYAA +11136..1113F;N # Nd [10] CHAKMA DIGIT ZERO..CHAKMA DIGIT NINE +11140..11143;N # Po [4] CHAKMA SECTION MARK..CHAKMA QUESTION MARK +11144;N # Lo CHAKMA LETTER LHAA +11145..11146;N # Mc [2] CHAKMA VOWEL SIGN AA..CHAKMA VOWEL SIGN EI +11150..11172;N # Lo [35] MAHAJANI LETTER A..MAHAJANI LETTER RRA +11173;N # Mn MAHAJANI SIGN NUKTA +11174..11175;N # Po [2] MAHAJANI ABBREVIATION SIGN..MAHAJANI SECTION MARK +11176;N # Lo MAHAJANI LIGATURE SHRI +11180..11181;N # Mn [2] SHARADA SIGN CANDRABINDU..SHARADA SIGN ANUSVARA +11182;N # Mc SHARADA SIGN VISARGA +11183..111B2;N # Lo [48] SHARADA LETTER A..SHARADA LETTER HA +111B3..111B5;N # Mc [3] SHARADA VOWEL SIGN AA..SHARADA VOWEL SIGN II +111B6..111BE;N # Mn [9] SHARADA VOWEL SIGN U..SHARADA VOWEL SIGN O +111BF..111C0;N # Mc [2] SHARADA VOWEL SIGN AU..SHARADA SIGN VIRAMA +111C1..111C4;N # Lo [4] SHARADA SIGN AVAGRAHA..SHARADA OM +111C5..111C8;N # Po [4] SHARADA DANDA..SHARADA SEPARATOR +111C9..111CC;N # Mn [4] SHARADA SANDHI MARK..SHARADA EXTRA SHORT VOWEL MARK +111CD;N # Po SHARADA SUTRA MARK +111D0..111D9;N # Nd [10] SHARADA DIGIT ZERO..SHARADA DIGIT NINE +111DA;N # Lo SHARADA EKAM +111DB;N # Po SHARADA SIGN SIDDHAM +111DC;N # Lo SHARADA HEADSTROKE +111DD..111DF;N # Po [3] SHARADA CONTINUATION SIGN..SHARADA SECTION MARK-2 +111E1..111F4;N # No [20] SINHALA ARCHAIC DIGIT ONE..SINHALA ARCHAIC NUMBER ONE THOUSAND +11200..11211;N # Lo [18] KHOJKI LETTER A..KHOJKI LETTER JJA +11213..1122B;N # Lo [25] KHOJKI LETTER NYA..KHOJKI LETTER LLA +1122C..1122E;N # Mc [3] KHOJKI VOWEL SIGN AA..KHOJKI VOWEL SIGN II +1122F..11231;N # Mn [3] KHOJKI VOWEL SIGN U..KHOJKI VOWEL SIGN AI +11232..11233;N # Mc [2] KHOJKI VOWEL SIGN O..KHOJKI VOWEL SIGN AU +11234;N # Mn KHOJKI SIGN ANUSVARA +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 +1128F..1129D;N # Lo [15] MULTANI LETTER NYA..MULTANI LETTER BA +1129F..112A8;N # Lo [10] MULTANI LETTER BHA..MULTANI LETTER RHA +112A9;N # Po MULTANI SECTION MARK +112B0..112DE;N # Lo [47] KHUDAWADI LETTER A..KHUDAWADI LETTER HA +112DF;N # Mn KHUDAWADI SIGN ANUSVARA +112E0..112E2;N # Mc [3] KHUDAWADI VOWEL SIGN AA..KHUDAWADI VOWEL SIGN II +112E3..112EA;N # Mn [8] KHUDAWADI VOWEL SIGN U..KHUDAWADI SIGN VIRAMA +112F0..112F9;N # Nd [10] KHUDAWADI DIGIT ZERO..KHUDAWADI DIGIT NINE +11300..11301;N # Mn [2] GRANTHA SIGN COMBINING ANUSVARA ABOVE..GRANTHA SIGN CANDRABINDU +11302..11303;N # Mc [2] GRANTHA SIGN ANUSVARA..GRANTHA SIGN VISARGA +11305..1130C;N # Lo [8] GRANTHA LETTER A..GRANTHA LETTER VOCALIC L +1130F..11310;N # Lo [2] GRANTHA LETTER EE..GRANTHA LETTER AI +11313..11328;N # Lo [22] GRANTHA LETTER OO..GRANTHA LETTER NA +1132A..11330;N # Lo [7] GRANTHA LETTER PA..GRANTHA LETTER RA +11332..11333;N # Lo [2] GRANTHA LETTER LA..GRANTHA LETTER LLA +11335..11339;N # Lo [5] GRANTHA LETTER VA..GRANTHA LETTER HA +1133B..1133C;N # Mn [2] COMBINING BINDU BELOW..GRANTHA SIGN NUKTA +1133D;N # Lo GRANTHA SIGN AVAGRAHA +1133E..1133F;N # Mc [2] GRANTHA VOWEL SIGN AA..GRANTHA VOWEL SIGN I +11340;N # Mn GRANTHA VOWEL SIGN II +11341..11344;N # Mc [4] GRANTHA VOWEL SIGN U..GRANTHA VOWEL SIGN VOCALIC RR +11347..11348;N # Mc [2] GRANTHA VOWEL SIGN EE..GRANTHA VOWEL SIGN AI +1134B..1134D;N # Mc [3] GRANTHA VOWEL SIGN OO..GRANTHA SIGN VIRAMA +11350;N # Lo GRANTHA OM +11357;N # Mc GRANTHA AU LENGTH MARK +1135D..11361;N # Lo [5] GRANTHA SIGN PLUTA..GRANTHA LETTER VOCALIC LL +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 +1145E;N # Mn NEWA SANDHI MARK +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 +114B9;N # Mc TIRHUTA VOWEL SIGN E +114BA;N # Mn TIRHUTA VOWEL SIGN SHORT E +114BB..114BE;N # Mc [4] TIRHUTA VOWEL SIGN AI..TIRHUTA VOWEL SIGN AU +114BF..114C0;N # Mn [2] TIRHUTA SIGN CANDRABINDU..TIRHUTA SIGN ANUSVARA +114C1;N # Mc TIRHUTA SIGN VISARGA +114C2..114C3;N # Mn [2] TIRHUTA SIGN VIRAMA..TIRHUTA SIGN NUKTA +114C4..114C5;N # Lo [2] TIRHUTA SIGN AVAGRAHA..TIRHUTA GVANG +114C6;N # Po TIRHUTA ABBREVIATION SIGN +114C7;N # Lo TIRHUTA OM +114D0..114D9;N # Nd [10] TIRHUTA DIGIT ZERO..TIRHUTA DIGIT NINE +11580..115AE;N # Lo [47] SIDDHAM LETTER A..SIDDHAM LETTER HA +115AF..115B1;N # Mc [3] SIDDHAM VOWEL SIGN AA..SIDDHAM VOWEL SIGN II +115B2..115B5;N # Mn [4] SIDDHAM VOWEL SIGN U..SIDDHAM VOWEL SIGN VOCALIC RR +115B8..115BB;N # Mc [4] SIDDHAM VOWEL SIGN E..SIDDHAM VOWEL SIGN AU +115BC..115BD;N # Mn [2] SIDDHAM SIGN CANDRABINDU..SIDDHAM SIGN ANUSVARA +115BE;N # Mc SIDDHAM SIGN VISARGA +115BF..115C0;N # Mn [2] SIDDHAM SIGN VIRAMA..SIDDHAM SIGN NUKTA +115C1..115D7;N # Po [23] SIDDHAM SIGN SIDDHAM..SIDDHAM SECTION MARK WITH CIRCLES AND FOUR ENCLOSURES +115D8..115DB;N # Lo [4] SIDDHAM LETTER THREE-CIRCLE ALTERNATE I..SIDDHAM LETTER ALTERNATE U +115DC..115DD;N # Mn [2] SIDDHAM VOWEL SIGN ALTERNATE U..SIDDHAM VOWEL SIGN ALTERNATE UU +11600..1162F;N # Lo [48] MODI LETTER A..MODI LETTER LLA +11630..11632;N # Mc [3] MODI VOWEL SIGN AA..MODI VOWEL SIGN II +11633..1163A;N # Mn [8] MODI VOWEL SIGN U..MODI VOWEL SIGN AI +1163B..1163C;N # Mc [2] MODI VOWEL SIGN O..MODI VOWEL SIGN AU +1163D;N # Mn MODI SIGN ANUSVARA +1163E;N # Mc MODI SIGN VISARGA +1163F..11640;N # Mn [2] MODI SIGN VIRAMA..MODI SIGN ARDHACANDRA +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 +116AD;N # Mn TAKRI VOWEL SIGN AA +116AE..116AF;N # Mc [2] TAKRI VOWEL SIGN I..TAKRI VOWEL SIGN II +116B0..116B5;N # Mn [6] TAKRI VOWEL SIGN U..TAKRI VOWEL SIGN AU +116B6;N # Mc TAKRI SIGN VIRAMA +116B7;N # Mn TAKRI SIGN NUKTA +116C0..116C9;N # Nd [10] TAKRI DIGIT ZERO..TAKRI DIGIT NINE +11700..1171A;N # Lo [27] AHOM LETTER KA..AHOM LETTER ALTERNATE BA +1171D..1171F;N # Mn [3] AHOM CONSONANT SIGN MEDIAL LA..AHOM CONSONANT SIGN MEDIAL LIGATING RA +11720..11721;N # Mc [2] AHOM VOWEL SIGN A..AHOM VOWEL SIGN AA +11722..11725;N # Mn [4] AHOM VOWEL SIGN I..AHOM VOWEL SIGN UU +11726;N # Mc AHOM VOWEL SIGN E +11727..1172B;N # Mn [5] AHOM VOWEL SIGN AW..AHOM SIGN KILLER +11730..11739;N # Nd [10] AHOM DIGIT ZERO..AHOM DIGIT NINE +1173A..1173B;N # No [2] AHOM NUMBER TEN..AHOM NUMBER TWENTY +1173C..1173E;N # Po [3] AHOM SIGN SMALL SECTION..AHOM SIGN RULAI +1173F;N # So AHOM SYMBOL VI +11800..1182B;N # Lo [44] DOGRA LETTER A..DOGRA LETTER RRA +1182C..1182E;N # Mc [3] DOGRA VOWEL SIGN AA..DOGRA VOWEL SIGN II +1182F..11837;N # Mn [9] DOGRA VOWEL SIGN U..DOGRA SIGN ANUSVARA +11838;N # Mc DOGRA SIGN VISARGA +11839..1183A;N # Mn [2] DOGRA SIGN VIRAMA..DOGRA SIGN NUKTA +1183B;N # Po DOGRA ABBREVIATION SIGN +118A0..118DF;N # L& [64] WARANG CITI CAPITAL LETTER NGAA..WARANG CITI SMALL LETTER VIYO +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..11A0A;N # Mn [10] ZANABAZAR SQUARE VOWEL SIGN 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 +11A9D;N # Lo SOYOMBO MARK PLUTA +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 +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 +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 +11D60..11D65;N # Lo [6] GUNJALA GONDI LETTER A..GUNJALA GONDI LETTER UU +11D67..11D68;N # Lo [2] GUNJALA GONDI LETTER EE..GUNJALA GONDI LETTER AI +11D6A..11D89;N # Lo [32] GUNJALA GONDI LETTER OO..GUNJALA GONDI LETTER SA +11D8A..11D8E;N # Mc [5] GUNJALA GONDI VOWEL SIGN AA..GUNJALA GONDI VOWEL SIGN UU +11D90..11D91;N # Mn [2] GUNJALA GONDI VOWEL SIGN EE..GUNJALA GONDI VOWEL SIGN AI +11D93..11D94;N # Mc [2] GUNJALA GONDI VOWEL SIGN OO..GUNJALA GONDI VOWEL SIGN AU +11D95;N # Mn GUNJALA GONDI SIGN ANUSVARA +11D96;N # Mc GUNJALA GONDI SIGN VISARGA +11D97;N # Mn GUNJALA GONDI VIRAMA +11D98;N # Lo GUNJALA GONDI OM +11DA0..11DA9;N # Nd [10] GUNJALA GONDI DIGIT ZERO..GUNJALA GONDI DIGIT NINE +11EE0..11EF2;N # Lo [19] MAKASAR LETTER KA..MAKASAR ANGKA +11EF3..11EF4;N # Mn [2] MAKASAR VOWEL SIGN I..MAKASAR VOWEL SIGN U +11EF5..11EF6;N # Mc [2] MAKASAR VOWEL SIGN E..MAKASAR VOWEL SIGN O +11EF7..11EF8;N # Po [2] MAKASAR PASSIMBANG..MAKASAR END OF SECTION +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 +12480..12543;N # Lo [196] CUNEIFORM SIGN AB TIMES NUN TENU..CUNEIFORM SIGN ZU5 TIMES THREE DISH TENU +13000..1342E;N # Lo [1071] EGYPTIAN HIEROGLYPH A001..EGYPTIAN HIEROGLYPH AA032 +14400..14646;N # Lo [583] ANATOLIAN HIEROGLYPH A001..ANATOLIAN HIEROGLYPH A530 +16800..16A38;N # Lo [569] BAMUM LETTER PHASE-A NGKUE MFON..BAMUM LETTER PHASE-F VUEQ +16A40..16A5E;N # Lo [31] MRO LETTER TA..MRO LETTER TEK +16A60..16A69;N # Nd [10] MRO DIGIT ZERO..MRO DIGIT NINE +16A6E..16A6F;N # Po [2] MRO DANDA..MRO DOUBLE DANDA +16AD0..16AED;N # Lo [30] BASSA VAH LETTER ENNI..BASSA VAH LETTER I +16AF0..16AF4;N # Mn [5] BASSA VAH COMBINING HIGH TONE..BASSA VAH COMBINING HIGH-LOW TONE +16AF5;N # Po BASSA VAH FULL STOP +16B00..16B2F;N # Lo [48] PAHAWH HMONG VOWEL KEEB..PAHAWH HMONG CONSONANT CAU +16B30..16B36;N # Mn [7] PAHAWH HMONG MARK CIM TUB..PAHAWH HMONG MARK CIM TAUM +16B37..16B3B;N # Po [5] PAHAWH HMONG SIGN VOS THOM..PAHAWH HMONG SIGN VOS FEEM +16B3C..16B3F;N # So [4] PAHAWH HMONG SIGN XYEEM NTXIV..PAHAWH HMONG SIGN XYEEM FAIB +16B40..16B43;N # Lm [4] PAHAWH HMONG SIGN VOS SEEV..PAHAWH HMONG SIGN IB YAM +16B44;N # Po PAHAWH HMONG SIGN XAUS +16B45;N # So PAHAWH HMONG SIGN CIM TSOV ROG +16B50..16B59;N # Nd [10] PAHAWH HMONG DIGIT ZERO..PAHAWH HMONG DIGIT NINE +16B5B..16B61;N # No [7] PAHAWH HMONG NUMBER TENS..PAHAWH HMONG NUMBER TRILLIONS +16B63..16B77;N # Lo [21] PAHAWH HMONG SIGN VOS LUB..PAHAWH HMONG SIGN CIM NRES TOS +16B7D..16B8F;N # Lo [19] PAHAWH HMONG CLAN SIGN TSHEEJ..PAHAWH HMONG CLAN SIGN VWJ +16E40..16E7F;N # L& [64] MEDEFAIDRIN CAPITAL LETTER M..MEDEFAIDRIN SMALL LETTER Y +16E80..16E96;N # No [23] MEDEFAIDRIN DIGIT ZERO..MEDEFAIDRIN DIGIT THREE ALTERNATE FORM +16E97..16E9A;N # Po [4] MEDEFAIDRIN COMMA..MEDEFAIDRIN EXCLAMATION OH +16F00..16F44;N # Lo [69] MIAO LETTER PA..MIAO LETTER HHA +16F50;N # Lo MIAO LETTER NASALIZATION +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..16FE1;W # Lm [2] TANGUT ITERATION MARK..NUSHU ITERATION MARK +17000..187F1;W # Lo [6130] TANGUT IDEOGRAPH-17000..TANGUT IDEOGRAPH-187F1 +18800..18AF2;W # Lo [755] TANGUT COMPONENT-001..TANGUT COMPONENT-755 +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 +1BC90..1BC99;N # Lo [10] DUPLOYAN AFFIX LOW ACUTE..DUPLOYAN AFFIX LOW ARROW +1BC9C;N # So DUPLOYAN SIGN O WITH CROSS +1BC9D..1BC9E;N # Mn [2] DUPLOYAN THICK LETTER SELECTOR..DUPLOYAN DOUBLE MARK +1BC9F;N # Po DUPLOYAN PUNCTUATION CHINOOK FULL STOP +1BCA0..1BCA3;N # Cf [4] SHORTHAND FORMAT LETTER OVERLAP..SHORTHAND FORMAT UP STEP +1D000..1D0F5;N # So [246] BYZANTINE MUSICAL SYMBOL PSILI..BYZANTINE MUSICAL SYMBOL GORGON NEO KATO +1D100..1D126;N # So [39] MUSICAL SYMBOL SINGLE BARLINE..MUSICAL SYMBOL DRUM CLEF-2 +1D129..1D164;N # So [60] MUSICAL SYMBOL MULTIPLE MEASURE REST..MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH NOTE +1D165..1D166;N # Mc [2] MUSICAL SYMBOL COMBINING STEM..MUSICAL SYMBOL COMBINING SPRECHGESANG STEM +1D167..1D169;N # Mn [3] MUSICAL SYMBOL COMBINING TREMOLO-1..MUSICAL SYMBOL COMBINING TREMOLO-3 +1D16A..1D16C;N # So [3] MUSICAL SYMBOL FINGERED TREMOLO-1..MUSICAL SYMBOL FINGERED TREMOLO-3 +1D16D..1D172;N # Mc [6] MUSICAL SYMBOL COMBINING AUGMENTATION DOT..MUSICAL SYMBOL COMBINING FLAG-5 +1D173..1D17A;N # Cf [8] MUSICAL SYMBOL BEGIN BEAM..MUSICAL SYMBOL END PHRASE +1D17B..1D182;N # Mn [8] MUSICAL SYMBOL COMBINING ACCENT..MUSICAL SYMBOL COMBINING LOURE +1D183..1D184;N # So [2] MUSICAL SYMBOL ARPEGGIATO UP..MUSICAL SYMBOL ARPEGGIATO DOWN +1D185..1D18B;N # Mn [7] MUSICAL SYMBOL COMBINING DOIT..MUSICAL SYMBOL COMBINING TRIPLE TONGUE +1D18C..1D1A9;N # So [30] MUSICAL SYMBOL RINFORZANDO..MUSICAL SYMBOL DEGREE SLASH +1D1AA..1D1AD;N # Mn [4] MUSICAL SYMBOL COMBINING DOWN BOW..MUSICAL SYMBOL COMBINING SNAP PIZZICATO +1D1AE..1D1E8;N # So [59] MUSICAL SYMBOL PEDAL MARK..MUSICAL SYMBOL KIEVAN FLAT SIGN +1D200..1D241;N # So [66] GREEK VOCAL NOTATION SYMBOL-1..GREEK INSTRUMENTAL NOTATION SYMBOL-54 +1D242..1D244;N # Mn [3] COMBINING GREEK MUSICAL TRISEME..COMBINING GREEK MUSICAL PENTASEME +1D245;N # So GREEK MUSICAL LEIMMA +1D2E0..1D2F3;N # No [20] MAYAN NUMERAL ZERO..MAYAN NUMERAL NINETEEN +1D300..1D356;N # So [87] MONOGRAM FOR EARTH..TETRAGRAM FOR FOSTERING +1D360..1D378;N # No [25] COUNTING ROD UNIT DIGIT ONE..TALLY MARK FIVE +1D400..1D454;N # L& [85] MATHEMATICAL BOLD CAPITAL A..MATHEMATICAL ITALIC SMALL G +1D456..1D49C;N # L& [71] MATHEMATICAL ITALIC SMALL I..MATHEMATICAL SCRIPT CAPITAL A +1D49E..1D49F;N # Lu [2] MATHEMATICAL SCRIPT CAPITAL C..MATHEMATICAL SCRIPT CAPITAL D +1D4A2;N # Lu MATHEMATICAL SCRIPT CAPITAL G +1D4A5..1D4A6;N # Lu [2] MATHEMATICAL SCRIPT CAPITAL J..MATHEMATICAL SCRIPT CAPITAL K +1D4A9..1D4AC;N # Lu [4] MATHEMATICAL SCRIPT CAPITAL N..MATHEMATICAL SCRIPT CAPITAL Q +1D4AE..1D4B9;N # L& [12] MATHEMATICAL SCRIPT CAPITAL S..MATHEMATICAL SCRIPT SMALL D +1D4BB;N # Ll MATHEMATICAL SCRIPT SMALL F +1D4BD..1D4C3;N # Ll [7] MATHEMATICAL SCRIPT SMALL H..MATHEMATICAL SCRIPT SMALL N +1D4C5..1D505;N # L& [65] MATHEMATICAL SCRIPT SMALL P..MATHEMATICAL FRAKTUR CAPITAL B +1D507..1D50A;N # Lu [4] MATHEMATICAL FRAKTUR CAPITAL D..MATHEMATICAL FRAKTUR CAPITAL G +1D50D..1D514;N # Lu [8] MATHEMATICAL FRAKTUR CAPITAL J..MATHEMATICAL FRAKTUR CAPITAL Q +1D516..1D51C;N # Lu [7] MATHEMATICAL FRAKTUR CAPITAL S..MATHEMATICAL FRAKTUR CAPITAL Y +1D51E..1D539;N # L& [28] MATHEMATICAL FRAKTUR SMALL A..MATHEMATICAL DOUBLE-STRUCK CAPITAL B +1D53B..1D53E;N # Lu [4] MATHEMATICAL DOUBLE-STRUCK CAPITAL D..MATHEMATICAL DOUBLE-STRUCK CAPITAL G +1D540..1D544;N # Lu [5] MATHEMATICAL DOUBLE-STRUCK CAPITAL I..MATHEMATICAL DOUBLE-STRUCK CAPITAL M +1D546;N # Lu MATHEMATICAL DOUBLE-STRUCK CAPITAL O +1D54A..1D550;N # Lu [7] MATHEMATICAL DOUBLE-STRUCK CAPITAL S..MATHEMATICAL DOUBLE-STRUCK CAPITAL Y +1D552..1D6A5;N # L& [340] MATHEMATICAL DOUBLE-STRUCK SMALL A..MATHEMATICAL ITALIC SMALL DOTLESS J +1D6A8..1D6C0;N # Lu [25] MATHEMATICAL BOLD CAPITAL ALPHA..MATHEMATICAL BOLD CAPITAL OMEGA +1D6C1;N # Sm MATHEMATICAL BOLD NABLA +1D6C2..1D6DA;N # Ll [25] MATHEMATICAL BOLD SMALL ALPHA..MATHEMATICAL BOLD SMALL OMEGA +1D6DB;N # Sm MATHEMATICAL BOLD PARTIAL DIFFERENTIAL +1D6DC..1D6FA;N # L& [31] MATHEMATICAL BOLD EPSILON SYMBOL..MATHEMATICAL ITALIC CAPITAL OMEGA +1D6FB;N # Sm MATHEMATICAL ITALIC NABLA +1D6FC..1D714;N # Ll [25] MATHEMATICAL ITALIC SMALL ALPHA..MATHEMATICAL ITALIC SMALL OMEGA +1D715;N # Sm MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL +1D716..1D734;N # L& [31] MATHEMATICAL ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD ITALIC CAPITAL OMEGA +1D735;N # Sm MATHEMATICAL BOLD ITALIC NABLA +1D736..1D74E;N # Ll [25] MATHEMATICAL BOLD ITALIC SMALL ALPHA..MATHEMATICAL BOLD ITALIC SMALL OMEGA +1D74F;N # Sm MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL +1D750..1D76E;N # L& [31] MATHEMATICAL BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA +1D76F;N # Sm MATHEMATICAL SANS-SERIF BOLD NABLA +1D770..1D788;N # Ll [25] MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA +1D789;N # Sm MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL +1D78A..1D7A8;N # L& [31] MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA +1D7A9;N # Sm MATHEMATICAL SANS-SERIF BOLD ITALIC NABLA +1D7AA..1D7C2;N # Ll [25] MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA +1D7C3;N # Sm MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL +1D7C4..1D7CB;N # L& [8] MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD SMALL DIGAMMA +1D7CE..1D7FF;N # Nd [50] MATHEMATICAL BOLD DIGIT ZERO..MATHEMATICAL MONOSPACE DIGIT NINE +1D800..1D9FF;N # So [512] SIGNWRITING HAND-FIST INDEX..SIGNWRITING HEAD +1DA00..1DA36;N # Mn [55] SIGNWRITING HEAD RIM..SIGNWRITING AIR SUCKING IN +1DA37..1DA3A;N # So [4] SIGNWRITING AIR BLOW SMALL ROTATIONS..SIGNWRITING BREATH EXHALE +1DA3B..1DA6C;N # Mn [50] SIGNWRITING MOUTH CLOSED NEUTRAL..SIGNWRITING EXCITEMENT +1DA6D..1DA74;N # So [8] SIGNWRITING SHOULDER HIP SPINE..SIGNWRITING TORSO-FLOORPLANE TWISTING +1DA75;N # Mn SIGNWRITING UPPER BODY TILTING FROM HIP JOINTS +1DA76..1DA83;N # So [14] SIGNWRITING LIMB COMBINATION..SIGNWRITING LOCATION DEPTH +1DA84;N # Mn SIGNWRITING LOCATION HEAD NECK +1DA85..1DA86;N # So [2] SIGNWRITING LOCATION TORSO..SIGNWRITING LOCATION LIMBS DIGITS +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 +1EC71..1ECAB;N # No [59] INDIC SIYAQ NUMBER ONE..INDIC SIYAQ NUMBER PREFIXED NINE +1ECAC;N # So INDIC SIYAQ PLACEHOLDER +1ECAD..1ECAF;N # No [3] INDIC SIYAQ FRACTION ONE QUARTER..INDIC SIYAQ FRACTION THREE QUARTERS +1ECB0;N # Sc INDIC SIYAQ RUPEE MARK +1ECB1..1ECB4;N # No [4] INDIC SIYAQ NUMBER ALTERNATE ONE..INDIC SIYAQ ALTERNATE LAKH 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 +1EE24;N # Lo ARABIC MATHEMATICAL INITIAL HEH +1EE27;N # Lo ARABIC MATHEMATICAL INITIAL HAH +1EE29..1EE32;N # Lo [10] ARABIC MATHEMATICAL INITIAL YEH..ARABIC MATHEMATICAL INITIAL QAF +1EE34..1EE37;N # Lo [4] ARABIC MATHEMATICAL INITIAL SHEEN..ARABIC MATHEMATICAL INITIAL KHAH +1EE39;N # Lo ARABIC MATHEMATICAL INITIAL DAD +1EE3B;N # Lo ARABIC MATHEMATICAL INITIAL GHAIN +1EE42;N # Lo ARABIC MATHEMATICAL TAILED JEEM +1EE47;N # Lo ARABIC MATHEMATICAL TAILED HAH +1EE49;N # Lo ARABIC MATHEMATICAL TAILED YEH +1EE4B;N # Lo ARABIC MATHEMATICAL TAILED LAM +1EE4D..1EE4F;N # Lo [3] ARABIC MATHEMATICAL TAILED NOON..ARABIC MATHEMATICAL TAILED AIN +1EE51..1EE52;N # Lo [2] ARABIC MATHEMATICAL TAILED SAD..ARABIC MATHEMATICAL TAILED QAF +1EE54;N # Lo ARABIC MATHEMATICAL TAILED SHEEN +1EE57;N # Lo ARABIC MATHEMATICAL TAILED KHAH +1EE59;N # Lo ARABIC MATHEMATICAL TAILED DAD +1EE5B;N # Lo ARABIC MATHEMATICAL TAILED GHAIN +1EE5D;N # Lo ARABIC MATHEMATICAL TAILED DOTLESS NOON +1EE5F;N # Lo ARABIC MATHEMATICAL TAILED DOTLESS QAF +1EE61..1EE62;N # Lo [2] ARABIC MATHEMATICAL STRETCHED BEH..ARABIC MATHEMATICAL STRETCHED JEEM +1EE64;N # Lo ARABIC MATHEMATICAL STRETCHED HEH +1EE67..1EE6A;N # Lo [4] ARABIC MATHEMATICAL STRETCHED HAH..ARABIC MATHEMATICAL STRETCHED KAF +1EE6C..1EE72;N # Lo [7] ARABIC MATHEMATICAL STRETCHED MEEM..ARABIC MATHEMATICAL STRETCHED QAF +1EE74..1EE77;N # Lo [4] ARABIC MATHEMATICAL STRETCHED SHEEN..ARABIC MATHEMATICAL STRETCHED KHAH +1EE79..1EE7C;N # Lo [4] ARABIC MATHEMATICAL STRETCHED DAD..ARABIC MATHEMATICAL STRETCHED DOTLESS BEH +1EE7E;N # Lo ARABIC MATHEMATICAL STRETCHED DOTLESS FEH +1EE80..1EE89;N # Lo [10] ARABIC MATHEMATICAL LOOPED ALEF..ARABIC MATHEMATICAL LOOPED YEH +1EE8B..1EE9B;N # Lo [17] ARABIC MATHEMATICAL LOOPED LAM..ARABIC MATHEMATICAL LOOPED GHAIN +1EEA1..1EEA3;N # Lo [3] ARABIC MATHEMATICAL DOUBLE-STRUCK BEH..ARABIC MATHEMATICAL DOUBLE-STRUCK DAL +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..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..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 +1F110..1F12D;A # So [30] PARENTHESIZED LATIN CAPITAL LETTER A..CIRCLED CD +1F12E..1F12F;N # So [2] CIRCLED WZ..COPYLEFT SYMBOL +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..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..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 +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..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 +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..1F6F9;W # So [6] SCOOTER..SKATEBOARD +1F700..1F773;N # So [116] ALCHEMICAL SYMBOL FOR QUINTESSENCE..ALCHEMICAL SYMBOL FOR HALF OUNCE +1F780..1F7D8;N # So [89] BLACK LEFT-POINTING ISOSCELES RIGHT TRIANGLE..NEGATIVE CIRCLED SQUARE +1F800..1F80B;N # So [12] LEFTWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD..DOWNWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD +1F810..1F847;N # So [56] LEFTWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD..DOWNWARDS HEAVY ARROW +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 +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..1F970;W # So [49] WILTED FLOWER..SMILING FACE WITH SMILING EYES AND THREE HEARTS +1F973..1F976;W # So [4] FACE WITH PARTY HORN AND PARTY HAT..FREEZING FACE +1F97A;W # So FACE WITH PLEADING EYES +1F97C..1F9A2;W # So [39] LAB COAT..SWAN +1F9B0..1F9B9;W # So [10] EMOJI COMPONENT RED HAIR..SUPERVILLAIN +1F9C0..1F9C2;W # So [3] CHEESE WEDGE..SALT SHAKER +1F9D0..1F9FF;W # So [48] FACE WITH MONOCLE..NAZAR AMULET +1FA60..1FA6D;N # So [14] XIANGQI RED GENERAL..XIANGQI BLACK SOLDIER +20000..2A6D6;W # Lo [42711] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6D6 +2A6D7..2A6FF;W # Cn [41] .. +2A700..2B734;W # Lo [4149] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B734 +2B735..2B73F;W # Cn [11] .. +2B740..2B81D;W # Lo [222] CJK UNIFIED IDEOGRAPH-2B740..CJK UNIFIED IDEOGRAPH-2B81D +2B81E..2B81F;W # Cn [2] .. +2B820..2CEA1;W # Lo [5762] CJK UNIFIED IDEOGRAPH-2B820..CJK UNIFIED IDEOGRAPH-2CEA1 +2CEA2..2CEAF;W # Cn [14] .. +2CEB0..2EBE0;W # Lo [7473] CJK UNIFIED IDEOGRAPH-2CEB0..CJK UNIFIED IDEOGRAPH-2EBE0 +2EBE1..2F7FF;W # Cn [3103] .. +2F800..2FA1D;W # Lo [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D +2FA1E..2FA1F;W # Cn [2] .. +2FA20..2FFFD;W # Cn [1502] .. +30000..3FFFD;W # Cn [65534] .. +E0001;N # Cf LANGUAGE TAG +E0020..E007F;N # Cf [96] TAG SPACE..CANCEL TAG +E0100..E01EF;A # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256 +F0000..FFFFD;A # Co [65534] .. +100000..10FFFD;A # Co [65534] .. + +# EOF diff -Nru pypy-7.1.1+dfsg/rpython/rlib/unicodedata/generate_unicodedb.py pypy-7.3.1+dfsg/rpython/rlib/unicodedata/generate_unicodedb.py --- pypy-7.1.1+dfsg/rpython/rlib/unicodedata/generate_unicodedb.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/rlib/unicodedata/generate_unicodedb.py 2020-04-10 19:28:41.000000000 +0000 @@ -538,7 +538,7 @@ print >> outfile, '}' -def writeUnicodedata(version, table, outfile, base): +def writeUnicodedata(version, version_tuple, table, outfile, base): if base: print >> outfile, 'import %s as base_mod' % base base_mod = __import__(base) @@ -549,38 +549,47 @@ print >> outfile, 'version = %r' % version print >> outfile - if version < "4.1": + if version_tuple < (4, 1, 0): cjk_interval = ("(0x3400 <= code <= 0x4DB5 or" " 0x4E00 <= code <= 0x9FA5 or" " 0x20000 <= code <= 0x2A6D6)") - elif version < "5": # don't know the exact limit + elif version_tuple < (5, 0, 0): # don't know the exact limit cjk_interval = ("(0x3400 <= code <= 0x4DB5 or" " 0x4E00 <= code <= 0x9FBB or" " 0x20000 <= code <= 0x2A6D6)") - elif version < "6": + elif version_tuple < (6, 0, 0): cjk_interval = ("(0x3400 <= code <= 0x4DB5 or" " 0x4E00 <= code <= 0x9FCB or" " 0x20000 <= code <= 0x2A6D6 or" " 0x2A700 <= code <= 0x2B734)") - elif version < "6.1": + elif version_tuple < (6, 1, 0): cjk_interval = ("(0x3400 <= code <= 0x4DB5 or" " 0x4E00 <= code <= 0x9FCB or" " 0x20000 <= code <= 0x2A6D6 or" " 0x2A700 <= code <= 0x2B734 or" " 0x2B740 <= code <= 0x2B81D)") - elif version < "8": + elif version_tuple < (8, 0, 0): cjk_interval = ("(0x3400 <= code <= 0x4DB5 or" " 0x4E00 <= code <= 0x9FCC or" " 0x20000 <= code <= 0x2A6D6 or" " 0x2A700 <= code <= 0x2B734 or" " 0x2B740 <= code <= 0x2B81D)") - else: + elif version_tuple == (9, 0, 0): cjk_interval = ("(0x3400 <= code <= 0x4DB5 or" " 0x4E00 <= code <= 0x9FD5 or" " 0x20000 <= code <= 0x2A6D6 or" " 0x2A700 <= code <= 0x2B734 or" " 0x2B740 <= code <= 0x2B81D or" " 0x2B820 <= code <= 0x2CEA1)") + elif version_tuple == (11, 0, 0): + cjk_interval = ("(0x3400 <= code <= 0x4DB5 or" + " 0x4E00 <= code <= 0x9FEF or" + " 0x20000 <= code <= 0x2A6D6 or" + " 0x2A700 <= code <= 0x2B734 or" + " 0x2B740 <= code <= 0x2B81D or" + " 0x2B820 <= code <= 0x2CEA1)") + else: + raise ValueError("please look up CJK ranges and fix the script, e.g. here: https://en.wikipedia.org/wiki/CJK_Unified_Ideographs_(Unicode_block)") write_character_names(outfile, table, base_mod) @@ -977,7 +986,8 @@ named_sequences = 'NamedSequences-%(version)s.txt', casefolding = 'CaseFolding-%(version)s.txt', ) - if options.unidata_version > '5': + version_tuple = tuple(int(x) for x in options.unidata_version.split(".")) + if version_tuple[0] > 5: filenames['special_casing'] = 'SpecialCasing-%(version)s.txt' filenames = dict((name, filename % dict(version=options.unidata_version)) for (name, filename) in filenames.items()) @@ -985,7 +995,7 @@ for (name, filename) in filenames.items()) table = read_unicodedata(files) - table.upper_lower_from_properties = (options.unidata_version >= '6') + table.upper_lower_from_properties = (version_tuple[0] >= 6) print >> outfile, '# UNICODE CHARACTER DATABASE' print >> outfile, '# This file was generated with the command:' print >> outfile, '# ', ' '.join(sys.argv) @@ -993,7 +1003,7 @@ print >> outfile, 'from rpython.rlib.rarithmetic import r_longlong' print >> outfile print >> outfile - writeUnicodedata(options.unidata_version, table, outfile, options.base) + writeUnicodedata(options.unidata_version, version_tuple, table, outfile, options.base) if __name__ == '__main__': main() diff -Nru pypy-7.1.1+dfsg/rpython/rlib/unicodedata/LineBreak-11.0.0.txt pypy-7.3.1+dfsg/rpython/rlib/unicodedata/LineBreak-11.0.0.txt --- pypy-7.1.1+dfsg/rpython/rlib/unicodedata/LineBreak-11.0.0.txt 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/rlib/unicodedata/LineBreak-11.0.0.txt 2020-04-10 19:28:41.000000000 +0000 @@ -0,0 +1,3392 @@ +# LineBreak-11.0.0.txt +# Date: 2018-03-22, 09:20:10 GMT [KW, LI] +# © 2018 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. +# +# 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: +# 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 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 +# "#" list the General_Category property value or the L& alias of the +# derived value LC, the Unicode character name or names, and, in lines +# with ranges of code points, the code point count in square brackets. +# +# For more information, see UAX #14: Unicode Line Breaking Algorithm, +# at http://www.unicode.org/reports/tr14/ +# +# @missing: 0000..10FFFF; XX +0000..0008;CM # Cc [9] .. +0009;BA # Cc +000A;LF # Cc +000B..000C;BK # Cc [2] .. +000D;CR # Cc +000E..001F;CM # Cc [18] .. +0020;SP # Zs SPACE +0021;EX # Po EXCLAMATION MARK +0022;QU # Po QUOTATION MARK +0023;AL # Po NUMBER SIGN +0024;PR # Sc DOLLAR SIGN +0025;PO # Po PERCENT SIGN +0026;AL # Po AMPERSAND +0027;QU # Po APOSTROPHE +0028;OP # Ps LEFT PARENTHESIS +0029;CP # Pe RIGHT PARENTHESIS +002A;AL # Po ASTERISK +002B;PR # Sm PLUS SIGN +002C;IS # Po COMMA +002D;HY # Pd HYPHEN-MINUS +002E;IS # Po FULL STOP +002F;SY # Po SOLIDUS +0030..0039;NU # Nd [10] DIGIT ZERO..DIGIT NINE +003A..003B;IS # Po [2] COLON..SEMICOLON +003C..003E;AL # Sm [3] LESS-THAN SIGN..GREATER-THAN SIGN +003F;EX # Po QUESTION MARK +0040;AL # Po COMMERCIAL AT +0041..005A;AL # Lu [26] LATIN CAPITAL LETTER A..LATIN CAPITAL LETTER Z +005B;OP # Ps LEFT SQUARE BRACKET +005C;PR # Po REVERSE SOLIDUS +005D;CP # Pe RIGHT SQUARE BRACKET +005E;AL # Sk CIRCUMFLEX ACCENT +005F;AL # Pc LOW LINE +0060;AL # Sk GRAVE ACCENT +0061..007A;AL # Ll [26] LATIN SMALL LETTER A..LATIN SMALL LETTER Z +007B;OP # Ps LEFT CURLY BRACKET +007C;BA # Sm VERTICAL LINE +007D;CL # Pe RIGHT CURLY BRACKET +007E;AL # Sm TILDE +007F;CM # Cc +0080..0084;CM # Cc [5] .. +0085;NL # Cc +0086..009F;CM # Cc [26] .. +00A0;GL # Zs NO-BREAK SPACE +00A1;OP # Po INVERTED EXCLAMATION MARK +00A2;PO # Sc CENT SIGN +00A3..00A5;PR # Sc [3] POUND SIGN..YEN SIGN +00A6;AL # So BROKEN BAR +00A7;AI # Po SECTION SIGN +00A8;AI # Sk DIAERESIS +00A9;AL # So COPYRIGHT SIGN +00AA;AI # Lo FEMININE ORDINAL INDICATOR +00AB;QU # Pi LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +00AC;AL # Sm NOT SIGN +00AD;BA # Cf SOFT HYPHEN +00AE;AL # So REGISTERED SIGN +00AF;AL # Sk MACRON +00B0;PO # So DEGREE SIGN +00B1;PR # Sm PLUS-MINUS SIGN +00B2..00B3;AI # No [2] SUPERSCRIPT TWO..SUPERSCRIPT THREE +00B4;BB # Sk ACUTE ACCENT +00B5;AL # Ll MICRO SIGN +00B6..00B7;AI # Po [2] PILCROW SIGN..MIDDLE DOT +00B8;AI # Sk CEDILLA +00B9;AI # No SUPERSCRIPT ONE +00BA;AI # Lo MASCULINE ORDINAL INDICATOR +00BB;QU # Pf RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +00BC..00BE;AI # No [3] VULGAR FRACTION ONE QUARTER..VULGAR FRACTION THREE QUARTERS +00BF;OP # Po INVERTED QUESTION MARK +00C0..00D6;AL # Lu [23] LATIN CAPITAL LETTER A WITH GRAVE..LATIN CAPITAL LETTER O WITH DIAERESIS +00D7;AI # Sm MULTIPLICATION SIGN +00D8..00F6;AL # L& [31] LATIN CAPITAL LETTER O WITH STROKE..LATIN SMALL LETTER O WITH DIAERESIS +00F7;AI # Sm DIVISION SIGN +00F8..00FF;AL # Ll [8] LATIN SMALL LETTER O WITH STROKE..LATIN SMALL LETTER Y WITH DIAERESIS +0100..017F;AL # L& [128] LATIN CAPITAL LETTER A WITH MACRON..LATIN SMALL LETTER LONG S +0180..01BA;AL # L& [59] LATIN SMALL LETTER B WITH STROKE..LATIN SMALL LETTER EZH WITH TAIL +01BB;AL # Lo LATIN LETTER TWO WITH STROKE +01BC..01BF;AL # L& [4] LATIN CAPITAL LETTER TONE FIVE..LATIN LETTER WYNN +01C0..01C3;AL # Lo [4] LATIN LETTER DENTAL CLICK..LATIN LETTER RETROFLEX CLICK +01C4..024F;AL # L& [140] LATIN CAPITAL LETTER DZ WITH CARON..LATIN SMALL LETTER Y WITH STROKE +0250..0293;AL # Ll [68] LATIN SMALL LETTER TURNED A..LATIN SMALL LETTER EZH WITH CURL +0294;AL # Lo LATIN LETTER GLOTTAL STOP +0295..02AF;AL # Ll [27] LATIN LETTER PHARYNGEAL VOICED FRICATIVE..LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL +02B0..02C1;AL # Lm [18] MODIFIER LETTER SMALL H..MODIFIER LETTER REVERSED GLOTTAL STOP +02C2..02C5;AL # Sk [4] MODIFIER LETTER LEFT ARROWHEAD..MODIFIER LETTER DOWN ARROWHEAD +02C6;AL # Lm MODIFIER LETTER CIRCUMFLEX ACCENT +02C7;AI # Lm CARON +02C8;BB # Lm MODIFIER LETTER VERTICAL LINE +02C9..02CB;AI # Lm [3] MODIFIER LETTER MACRON..MODIFIER LETTER GRAVE ACCENT +02CC;BB # Lm MODIFIER LETTER LOW VERTICAL LINE +02CD;AI # Lm MODIFIER LETTER LOW MACRON +02CE..02CF;AL # Lm [2] MODIFIER LETTER LOW GRAVE ACCENT..MODIFIER LETTER LOW ACUTE ACCENT +02D0;AI # Lm MODIFIER LETTER TRIANGULAR COLON +02D1;AL # Lm MODIFIER LETTER HALF TRIANGULAR COLON +02D2..02D7;AL # Sk [6] MODIFIER LETTER CENTRED RIGHT HALF RING..MODIFIER LETTER MINUS SIGN +02D8..02DB;AI # Sk [4] BREVE..OGONEK +02DC;AL # Sk SMALL TILDE +02DD;AI # Sk DOUBLE ACUTE ACCENT +02DE;AL # Sk MODIFIER LETTER RHOTIC HOOK +02DF;BB # Sk MODIFIER LETTER CROSS ACCENT +02E0..02E4;AL # Lm [5] MODIFIER LETTER SMALL GAMMA..MODIFIER LETTER SMALL REVERSED GLOTTAL STOP +02E5..02EB;AL # Sk [7] MODIFIER LETTER EXTRA-HIGH TONE BAR..MODIFIER LETTER YANG DEPARTING TONE MARK +02EC;AL # Lm MODIFIER LETTER VOICING +02ED;AL # Sk MODIFIER LETTER UNASPIRATED +02EE;AL # Lm MODIFIER LETTER DOUBLE APOSTROPHE +02EF..02FF;AL # Sk [17] MODIFIER LETTER LOW DOWN ARROWHEAD..MODIFIER LETTER LOW LEFT ARROW +0300..034E;CM # Mn [79] COMBINING GRAVE ACCENT..COMBINING UPWARDS ARROW BELOW +034F;GL # Mn COMBINING GRAPHEME JOINER +0350..035B;CM # Mn [12] COMBINING RIGHT ARROWHEAD ABOVE..COMBINING ZIGZAG ABOVE +035C..0362;GL # Mn [7] COMBINING DOUBLE BREVE BELOW..COMBINING DOUBLE RIGHTWARDS ARROW BELOW +0363..036F;CM # Mn [13] COMBINING LATIN SMALL LETTER A..COMBINING LATIN SMALL LETTER X +0370..0373;AL # L& [4] GREEK CAPITAL LETTER HETA..GREEK SMALL LETTER ARCHAIC SAMPI +0374;AL # Lm GREEK NUMERAL SIGN +0375;AL # Sk GREEK LOWER NUMERAL SIGN +0376..0377;AL # L& [2] GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA..GREEK SMALL LETTER PAMPHYLIAN DIGAMMA +037A;AL # Lm GREEK YPOGEGRAMMENI +037B..037D;AL # Ll [3] GREEK SMALL REVERSED LUNATE SIGMA SYMBOL..GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL +037E;IS # Po GREEK QUESTION MARK +037F;AL # Lu GREEK CAPITAL LETTER YOT +0384..0385;AL # Sk [2] GREEK TONOS..GREEK DIALYTIKA TONOS +0386;AL # Lu GREEK CAPITAL LETTER ALPHA WITH TONOS +0387;AL # Po GREEK ANO TELEIA +0388..038A;AL # Lu [3] GREEK CAPITAL LETTER EPSILON WITH TONOS..GREEK CAPITAL LETTER IOTA WITH TONOS +038C;AL # Lu GREEK CAPITAL LETTER OMICRON WITH TONOS +038E..03A1;AL # L& [20] GREEK CAPITAL LETTER UPSILON WITH TONOS..GREEK CAPITAL LETTER RHO +03A3..03F5;AL # L& [83] GREEK CAPITAL LETTER SIGMA..GREEK LUNATE EPSILON SYMBOL +03F6;AL # Sm GREEK REVERSED LUNATE EPSILON SYMBOL +03F7..03FF;AL # L& [9] GREEK CAPITAL LETTER SHO..GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL +0400..0481;AL # L& [130] CYRILLIC CAPITAL LETTER IE WITH GRAVE..CYRILLIC SMALL LETTER KOPPA +0482;AL # So CYRILLIC THOUSANDS SIGN +0483..0487;CM # Mn [5] COMBINING CYRILLIC TITLO..COMBINING CYRILLIC POKRYTIE +0488..0489;CM # Me [2] COMBINING CYRILLIC HUNDRED THOUSANDS SIGN..COMBINING CYRILLIC MILLIONS SIGN +048A..04FF;AL # L& [118] CYRILLIC CAPITAL LETTER SHORT I WITH TAIL..CYRILLIC SMALL LETTER HA WITH STROKE +0500..052F;AL # L& [48] CYRILLIC CAPITAL LETTER KOMI DE..CYRILLIC SMALL LETTER EL WITH DESCENDER +0531..0556;AL # Lu [38] ARMENIAN CAPITAL LETTER AYB..ARMENIAN CAPITAL LETTER FEH +0559;AL # Lm ARMENIAN MODIFIER LETTER LEFT HALF RING +055A..055F;AL # Po [6] ARMENIAN APOSTROPHE..ARMENIAN ABBREVIATION MARK +0560..0588;AL # Ll [41] ARMENIAN SMALL LETTER TURNED AYB..ARMENIAN SMALL LETTER YI WITH STROKE +0589;IS # Po ARMENIAN FULL STOP +058A;BA # Pd ARMENIAN HYPHEN +058D..058E;AL # So [2] RIGHT-FACING ARMENIAN ETERNITY SIGN..LEFT-FACING ARMENIAN ETERNITY SIGN +058F;PR # Sc ARMENIAN DRAM SIGN +0591..05BD;CM # Mn [45] HEBREW ACCENT ETNAHTA..HEBREW POINT METEG +05BE;BA # Pd HEBREW PUNCTUATION MAQAF +05BF;CM # Mn HEBREW POINT RAFE +05C0;AL # Po HEBREW PUNCTUATION PASEQ +05C1..05C2;CM # Mn [2] HEBREW POINT SHIN DOT..HEBREW POINT SIN DOT +05C3;AL # Po HEBREW PUNCTUATION SOF PASUQ +05C4..05C5;CM # Mn [2] HEBREW MARK UPPER DOT..HEBREW MARK LOWER DOT +05C6;EX # Po HEBREW PUNCTUATION NUN HAFUKHA +05C7;CM # Mn HEBREW POINT QAMATS QATAN +05D0..05EA;HL # Lo [27] HEBREW LETTER ALEF..HEBREW LETTER TAV +05EF..05F2;HL # Lo [4] HEBREW YOD TRIANGLE..HEBREW LIGATURE YIDDISH DOUBLE YOD +05F3..05F4;AL # Po [2] HEBREW PUNCTUATION GERESH..HEBREW PUNCTUATION GERSHAYIM +0600..0605;AL # Cf [6] ARABIC NUMBER SIGN..ARABIC NUMBER MARK ABOVE +0606..0608;AL # Sm [3] ARABIC-INDIC CUBE ROOT..ARABIC RAY +0609..060A;PO # Po [2] ARABIC-INDIC PER MILLE SIGN..ARABIC-INDIC PER TEN THOUSAND SIGN +060B;PO # Sc AFGHANI SIGN +060C..060D;IS # Po [2] ARABIC COMMA..ARABIC DATE SEPARATOR +060E..060F;AL # So [2] ARABIC POETIC VERSE SIGN..ARABIC SIGN MISRA +0610..061A;CM # Mn [11] ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM..ARABIC SMALL KASRA +061B;EX # Po ARABIC SEMICOLON +061C;CM # Cf ARABIC LETTER MARK +061E..061F;EX # Po [2] ARABIC TRIPLE DOT PUNCTUATION MARK..ARABIC QUESTION MARK +0620..063F;AL # Lo [32] ARABIC LETTER KASHMIRI YEH..ARABIC LETTER FARSI YEH WITH THREE DOTS ABOVE +0640;AL # Lm ARABIC TATWEEL +0641..064A;AL # Lo [10] ARABIC LETTER FEH..ARABIC LETTER YEH +064B..065F;CM # Mn [21] ARABIC FATHATAN..ARABIC WAVY HAMZA BELOW +0660..0669;NU # Nd [10] ARABIC-INDIC DIGIT ZERO..ARABIC-INDIC DIGIT NINE +066A;PO # Po ARABIC PERCENT SIGN +066B..066C;NU # Po [2] ARABIC DECIMAL SEPARATOR..ARABIC THOUSANDS SEPARATOR +066D;AL # Po ARABIC FIVE POINTED STAR +066E..066F;AL # Lo [2] ARABIC LETTER DOTLESS BEH..ARABIC LETTER DOTLESS QAF +0670;CM # Mn ARABIC LETTER SUPERSCRIPT ALEF +0671..06D3;AL # Lo [99] ARABIC LETTER ALEF WASLA..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE +06D4;EX # Po ARABIC FULL STOP +06D5;AL # Lo ARABIC LETTER AE +06D6..06DC;CM # Mn [7] ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA..ARABIC SMALL HIGH SEEN +06DD;AL # Cf ARABIC END OF AYAH +06DE;AL # So ARABIC START OF RUB EL HIZB +06DF..06E4;CM # Mn [6] ARABIC SMALL HIGH ROUNDED ZERO..ARABIC SMALL HIGH MADDA +06E5..06E6;AL # Lm [2] ARABIC SMALL WAW..ARABIC SMALL YEH +06E7..06E8;CM # Mn [2] ARABIC SMALL HIGH YEH..ARABIC SMALL HIGH NOON +06E9;AL # So ARABIC PLACE OF SAJDAH +06EA..06ED;CM # Mn [4] ARABIC EMPTY CENTRE LOW STOP..ARABIC SMALL LOW MEEM +06EE..06EF;AL # Lo [2] ARABIC LETTER DAL WITH INVERTED V..ARABIC LETTER REH WITH INVERTED V +06F0..06F9;NU # Nd [10] EXTENDED ARABIC-INDIC DIGIT ZERO..EXTENDED ARABIC-INDIC DIGIT NINE +06FA..06FC;AL # Lo [3] ARABIC LETTER SHEEN WITH DOT BELOW..ARABIC LETTER GHAIN WITH DOT BELOW +06FD..06FE;AL # So [2] ARABIC SIGN SINDHI AMPERSAND..ARABIC SIGN SINDHI POSTPOSITION MEN +06FF;AL # Lo ARABIC LETTER HEH WITH INVERTED V +0700..070D;AL # Po [14] SYRIAC END OF PARAGRAPH..SYRIAC HARKLEAN ASTERISCUS +070F;AL # Cf SYRIAC ABBREVIATION MARK +0710;AL # Lo SYRIAC LETTER ALAPH +0711;CM # Mn SYRIAC LETTER SUPERSCRIPT ALAPH +0712..072F;AL # Lo [30] SYRIAC LETTER BETH..SYRIAC LETTER PERSIAN DHALATH +0730..074A;CM # Mn [27] SYRIAC PTHAHA ABOVE..SYRIAC BARREKH +074D..074F;AL # Lo [3] SYRIAC LETTER SOGDIAN ZHAIN..SYRIAC LETTER SOGDIAN FE +0750..077F;AL # Lo [48] ARABIC LETTER BEH WITH THREE DOTS HORIZONTALLY BELOW..ARABIC LETTER KAF WITH TWO DOTS ABOVE +0780..07A5;AL # Lo [38] THAANA LETTER HAA..THAANA LETTER WAAVU +07A6..07B0;CM # Mn [11] THAANA ABAFILI..THAANA SUKUN +07B1;AL # Lo THAANA LETTER NAA +07C0..07C9;NU # Nd [10] NKO DIGIT ZERO..NKO DIGIT NINE +07CA..07EA;AL # Lo [33] NKO LETTER A..NKO LETTER JONA RA +07EB..07F3;CM # Mn [9] NKO COMBINING SHORT HIGH TONE..NKO COMBINING DOUBLE DOT ABOVE +07F4..07F5;AL # Lm [2] NKO HIGH TONE APOSTROPHE..NKO LOW TONE APOSTROPHE +07F6;AL # So NKO SYMBOL OO DENNEN +07F7;AL # Po NKO SYMBOL GBAKURUNEN +07F8;IS # Po NKO COMMA +07F9;EX # Po NKO EXCLAMATION MARK +07FA;AL # Lm NKO LAJANYALAN +07FD;CM # Mn NKO DANTAYALAN +07FE..07FF;PR # Sc [2] NKO DOROME SIGN..NKO TAMAN SIGN +0800..0815;AL # Lo [22] SAMARITAN LETTER ALAF..SAMARITAN LETTER TAAF +0816..0819;CM # Mn [4] SAMARITAN MARK IN..SAMARITAN MARK DAGESH +081A;AL # Lm SAMARITAN MODIFIER LETTER EPENTHETIC YUT +081B..0823;CM # Mn [9] SAMARITAN MARK EPENTHETIC YUT..SAMARITAN VOWEL SIGN A +0824;AL # Lm SAMARITAN MODIFIER LETTER SHORT A +0825..0827;CM # Mn [3] SAMARITAN VOWEL SIGN SHORT A..SAMARITAN VOWEL SIGN U +0828;AL # Lm SAMARITAN MODIFIER LETTER I +0829..082D;CM # Mn [5] SAMARITAN VOWEL SIGN LONG I..SAMARITAN MARK NEQUDAA +0830..083E;AL # Po [15] SAMARITAN PUNCTUATION NEQUDAA..SAMARITAN PUNCTUATION ANNAAU +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 +08D3..08E1;CM # Mn [15] ARABIC SMALL LOW WAW..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 +0904..0939;AL # Lo [54] DEVANAGARI LETTER SHORT A..DEVANAGARI LETTER HA +093A;CM # Mn DEVANAGARI VOWEL SIGN OE +093B;CM # Mc DEVANAGARI VOWEL SIGN OOE +093C;CM # Mn DEVANAGARI SIGN NUKTA +093D;AL # Lo DEVANAGARI SIGN AVAGRAHA +093E..0940;CM # Mc [3] DEVANAGARI VOWEL SIGN AA..DEVANAGARI VOWEL SIGN II +0941..0948;CM # Mn [8] DEVANAGARI VOWEL SIGN U..DEVANAGARI VOWEL SIGN AI +0949..094C;CM # Mc [4] DEVANAGARI VOWEL SIGN CANDRA O..DEVANAGARI VOWEL SIGN AU +094D;CM # Mn DEVANAGARI SIGN VIRAMA +094E..094F;CM # Mc [2] DEVANAGARI VOWEL SIGN PRISHTHAMATRA E..DEVANAGARI VOWEL SIGN AW +0950;AL # Lo DEVANAGARI OM +0951..0957;CM # Mn [7] DEVANAGARI STRESS SIGN UDATTA..DEVANAGARI VOWEL SIGN UUE +0958..0961;AL # Lo [10] DEVANAGARI LETTER QA..DEVANAGARI LETTER VOCALIC LL +0962..0963;CM # Mn [2] DEVANAGARI VOWEL SIGN VOCALIC L..DEVANAGARI VOWEL SIGN VOCALIC LL +0964..0965;BA # Po [2] DEVANAGARI DANDA..DEVANAGARI DOUBLE DANDA +0966..096F;NU # Nd [10] DEVANAGARI DIGIT ZERO..DEVANAGARI DIGIT NINE +0970;AL # Po DEVANAGARI ABBREVIATION SIGN +0971;AL # Lm DEVANAGARI SIGN HIGH SPACING DOT +0972..097F;AL # Lo [14] DEVANAGARI LETTER CANDRA A..DEVANAGARI LETTER BBA +0980;AL # Lo BENGALI ANJI +0981;CM # Mn BENGALI SIGN CANDRABINDU +0982..0983;CM # Mc [2] BENGALI SIGN ANUSVARA..BENGALI SIGN VISARGA +0985..098C;AL # Lo [8] BENGALI LETTER A..BENGALI LETTER VOCALIC L +098F..0990;AL # Lo [2] BENGALI LETTER E..BENGALI LETTER AI +0993..09A8;AL # Lo [22] BENGALI LETTER O..BENGALI LETTER NA +09AA..09B0;AL # Lo [7] BENGALI LETTER PA..BENGALI LETTER RA +09B2;AL # Lo BENGALI LETTER LA +09B6..09B9;AL # Lo [4] BENGALI LETTER SHA..BENGALI LETTER HA +09BC;CM # Mn BENGALI SIGN NUKTA +09BD;AL # Lo BENGALI SIGN AVAGRAHA +09BE..09C0;CM # Mc [3] BENGALI VOWEL SIGN AA..BENGALI VOWEL SIGN II +09C1..09C4;CM # Mn [4] BENGALI VOWEL SIGN U..BENGALI VOWEL SIGN VOCALIC RR +09C7..09C8;CM # Mc [2] BENGALI VOWEL SIGN E..BENGALI VOWEL SIGN AI +09CB..09CC;CM # Mc [2] BENGALI VOWEL SIGN O..BENGALI VOWEL SIGN AU +09CD;CM # Mn BENGALI SIGN VIRAMA +09CE;AL # Lo BENGALI LETTER KHANDA TA +09D7;CM # Mc BENGALI AU LENGTH MARK +09DC..09DD;AL # Lo [2] BENGALI LETTER RRA..BENGALI LETTER RHA +09DF..09E1;AL # Lo [3] BENGALI LETTER YYA..BENGALI LETTER VOCALIC LL +09E2..09E3;CM # Mn [2] BENGALI VOWEL SIGN VOCALIC L..BENGALI VOWEL SIGN VOCALIC LL +09E6..09EF;NU # Nd [10] BENGALI DIGIT ZERO..BENGALI DIGIT NINE +09F0..09F1;AL # Lo [2] BENGALI LETTER RA WITH MIDDLE DIAGONAL..BENGALI LETTER RA WITH LOWER DIAGONAL +09F2..09F3;PO # Sc [2] BENGALI RUPEE MARK..BENGALI RUPEE SIGN +09F4..09F8;AL # No [5] BENGALI CURRENCY NUMERATOR ONE..BENGALI CURRENCY NUMERATOR ONE LESS THAN THE DENOMINATOR +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 +09FE;CM # Mn BENGALI SANDHI MARK +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 +0A0F..0A10;AL # Lo [2] GURMUKHI LETTER EE..GURMUKHI LETTER AI +0A13..0A28;AL # Lo [22] GURMUKHI LETTER OO..GURMUKHI LETTER NA +0A2A..0A30;AL # Lo [7] GURMUKHI LETTER PA..GURMUKHI LETTER RA +0A32..0A33;AL # Lo [2] GURMUKHI LETTER LA..GURMUKHI LETTER LLA +0A35..0A36;AL # Lo [2] GURMUKHI LETTER VA..GURMUKHI LETTER SHA +0A38..0A39;AL # Lo [2] GURMUKHI LETTER SA..GURMUKHI LETTER HA +0A3C;CM # Mn GURMUKHI SIGN NUKTA +0A3E..0A40;CM # Mc [3] GURMUKHI VOWEL SIGN AA..GURMUKHI VOWEL SIGN II +0A41..0A42;CM # Mn [2] GURMUKHI VOWEL SIGN U..GURMUKHI VOWEL SIGN UU +0A47..0A48;CM # Mn [2] GURMUKHI VOWEL SIGN EE..GURMUKHI VOWEL SIGN AI +0A4B..0A4D;CM # Mn [3] GURMUKHI VOWEL SIGN OO..GURMUKHI SIGN VIRAMA +0A51;CM # Mn GURMUKHI SIGN UDAAT +0A59..0A5C;AL # Lo [4] GURMUKHI LETTER KHHA..GURMUKHI LETTER RRA +0A5E;AL # Lo GURMUKHI LETTER FA +0A66..0A6F;NU # Nd [10] GURMUKHI DIGIT ZERO..GURMUKHI DIGIT NINE +0A70..0A71;CM # Mn [2] GURMUKHI TIPPI..GURMUKHI ADDAK +0A72..0A74;AL # Lo [3] GURMUKHI IRI..GURMUKHI EK ONKAR +0A75;CM # Mn GURMUKHI SIGN YAKASH +0A76;AL # Po GURMUKHI ABBREVIATION SIGN +0A81..0A82;CM # Mn [2] GUJARATI SIGN CANDRABINDU..GUJARATI SIGN ANUSVARA +0A83;CM # Mc GUJARATI SIGN VISARGA +0A85..0A8D;AL # Lo [9] GUJARATI LETTER A..GUJARATI VOWEL CANDRA E +0A8F..0A91;AL # Lo [3] GUJARATI LETTER E..GUJARATI VOWEL CANDRA O +0A93..0AA8;AL # Lo [22] GUJARATI LETTER O..GUJARATI LETTER NA +0AAA..0AB0;AL # Lo [7] GUJARATI LETTER PA..GUJARATI LETTER RA +0AB2..0AB3;AL # Lo [2] GUJARATI LETTER LA..GUJARATI LETTER LLA +0AB5..0AB9;AL # Lo [5] GUJARATI LETTER VA..GUJARATI LETTER HA +0ABC;CM # Mn GUJARATI SIGN NUKTA +0ABD;AL # Lo GUJARATI SIGN AVAGRAHA +0ABE..0AC0;CM # Mc [3] GUJARATI VOWEL SIGN AA..GUJARATI VOWEL SIGN II +0AC1..0AC5;CM # Mn [5] GUJARATI VOWEL SIGN U..GUJARATI VOWEL SIGN CANDRA E +0AC7..0AC8;CM # Mn [2] GUJARATI VOWEL SIGN E..GUJARATI VOWEL SIGN AI +0AC9;CM # Mc GUJARATI VOWEL SIGN CANDRA O +0ACB..0ACC;CM # Mc [2] GUJARATI VOWEL SIGN O..GUJARATI VOWEL SIGN AU +0ACD;CM # Mn GUJARATI SIGN VIRAMA +0AD0;AL # Lo GUJARATI OM +0AE0..0AE1;AL # Lo [2] GUJARATI LETTER VOCALIC RR..GUJARATI LETTER VOCALIC LL +0AE2..0AE3;CM # Mn [2] GUJARATI VOWEL SIGN VOCALIC L..GUJARATI VOWEL SIGN VOCALIC LL +0AE6..0AEF;NU # Nd [10] GUJARATI DIGIT ZERO..GUJARATI DIGIT NINE +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 +0B0F..0B10;AL # Lo [2] ORIYA LETTER E..ORIYA LETTER AI +0B13..0B28;AL # Lo [22] ORIYA LETTER O..ORIYA LETTER NA +0B2A..0B30;AL # Lo [7] ORIYA LETTER PA..ORIYA LETTER RA +0B32..0B33;AL # Lo [2] ORIYA LETTER LA..ORIYA LETTER LLA +0B35..0B39;AL # Lo [5] ORIYA LETTER VA..ORIYA LETTER HA +0B3C;CM # Mn ORIYA SIGN NUKTA +0B3D;AL # Lo ORIYA SIGN AVAGRAHA +0B3E;CM # Mc ORIYA VOWEL SIGN AA +0B3F;CM # Mn ORIYA VOWEL SIGN I +0B40;CM # Mc ORIYA VOWEL SIGN II +0B41..0B44;CM # Mn [4] ORIYA VOWEL SIGN U..ORIYA VOWEL SIGN VOCALIC RR +0B47..0B48;CM # Mc [2] ORIYA VOWEL SIGN E..ORIYA VOWEL SIGN AI +0B4B..0B4C;CM # Mc [2] ORIYA VOWEL SIGN O..ORIYA VOWEL SIGN AU +0B4D;CM # Mn ORIYA SIGN VIRAMA +0B56;CM # Mn ORIYA AI LENGTH MARK +0B57;CM # Mc ORIYA AU LENGTH MARK +0B5C..0B5D;AL # Lo [2] ORIYA LETTER RRA..ORIYA LETTER RHA +0B5F..0B61;AL # Lo [3] ORIYA LETTER YYA..ORIYA LETTER VOCALIC LL +0B62..0B63;CM # Mn [2] ORIYA VOWEL SIGN VOCALIC L..ORIYA VOWEL SIGN VOCALIC LL +0B66..0B6F;NU # Nd [10] ORIYA DIGIT ZERO..ORIYA DIGIT NINE +0B70;AL # So ORIYA ISSHAR +0B71;AL # Lo ORIYA LETTER WA +0B72..0B77;AL # No [6] ORIYA FRACTION ONE QUARTER..ORIYA FRACTION THREE SIXTEENTHS +0B82;CM # Mn TAMIL SIGN ANUSVARA +0B83;AL # Lo TAMIL SIGN VISARGA +0B85..0B8A;AL # Lo [6] TAMIL LETTER A..TAMIL LETTER UU +0B8E..0B90;AL # Lo [3] TAMIL LETTER E..TAMIL LETTER AI +0B92..0B95;AL # Lo [4] TAMIL LETTER O..TAMIL LETTER KA +0B99..0B9A;AL # Lo [2] TAMIL LETTER NGA..TAMIL LETTER CA +0B9C;AL # Lo TAMIL LETTER JA +0B9E..0B9F;AL # Lo [2] TAMIL LETTER NYA..TAMIL LETTER TTA +0BA3..0BA4;AL # Lo [2] TAMIL LETTER NNA..TAMIL LETTER TA +0BA8..0BAA;AL # Lo [3] TAMIL LETTER NA..TAMIL LETTER PA +0BAE..0BB9;AL # Lo [12] TAMIL LETTER MA..TAMIL LETTER HA +0BBE..0BBF;CM # Mc [2] TAMIL VOWEL SIGN AA..TAMIL VOWEL SIGN I +0BC0;CM # Mn TAMIL VOWEL SIGN II +0BC1..0BC2;CM # Mc [2] TAMIL VOWEL SIGN U..TAMIL VOWEL SIGN UU +0BC6..0BC8;CM # Mc [3] TAMIL VOWEL SIGN E..TAMIL VOWEL SIGN AI +0BCA..0BCC;CM # Mc [3] TAMIL VOWEL SIGN O..TAMIL VOWEL SIGN AU +0BCD;CM # Mn TAMIL SIGN VIRAMA +0BD0;AL # Lo TAMIL OM +0BD7;CM # Mc TAMIL AU LENGTH MARK +0BE6..0BEF;NU # Nd [10] TAMIL DIGIT ZERO..TAMIL DIGIT NINE +0BF0..0BF2;AL # No [3] TAMIL NUMBER TEN..TAMIL NUMBER ONE THOUSAND +0BF3..0BF8;AL # So [6] TAMIL DAY SIGN..TAMIL AS ABOVE SIGN +0BF9;PR # Sc TAMIL RUPEE SIGN +0BFA;AL # So TAMIL NUMBER SIGN +0C00;CM # Mn TELUGU SIGN COMBINING CANDRABINDU ABOVE +0C01..0C03;CM # Mc [3] TELUGU SIGN CANDRABINDU..TELUGU SIGN VISARGA +0C04;CM # Mn TELUGU SIGN COMBINING ANUSVARA ABOVE +0C05..0C0C;AL # Lo [8] TELUGU LETTER A..TELUGU LETTER VOCALIC L +0C0E..0C10;AL # Lo [3] TELUGU LETTER E..TELUGU LETTER AI +0C12..0C28;AL # Lo [23] TELUGU LETTER O..TELUGU LETTER NA +0C2A..0C39;AL # Lo [16] TELUGU LETTER PA..TELUGU LETTER HA +0C3D;AL # Lo TELUGU SIGN AVAGRAHA +0C3E..0C40;CM # Mn [3] TELUGU VOWEL SIGN AA..TELUGU VOWEL SIGN II +0C41..0C44;CM # Mc [4] TELUGU VOWEL SIGN U..TELUGU VOWEL SIGN VOCALIC RR +0C46..0C48;CM # Mn [3] TELUGU VOWEL SIGN E..TELUGU VOWEL SIGN AI +0C4A..0C4D;CM # Mn [4] TELUGU VOWEL SIGN O..TELUGU SIGN VIRAMA +0C55..0C56;CM # Mn [2] TELUGU LENGTH MARK..TELUGU AI LENGTH MARK +0C58..0C5A;AL # Lo [3] TELUGU LETTER TSA..TELUGU LETTER RRRA +0C60..0C61;AL # Lo [2] TELUGU LETTER VOCALIC RR..TELUGU LETTER VOCALIC LL +0C62..0C63;CM # Mn [2] TELUGU VOWEL SIGN VOCALIC L..TELUGU VOWEL SIGN VOCALIC LL +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 +0C84;BB # Po KANNADA SIGN SIDDHAM +0C85..0C8C;AL # Lo [8] KANNADA LETTER A..KANNADA LETTER VOCALIC L +0C8E..0C90;AL # Lo [3] KANNADA LETTER E..KANNADA LETTER AI +0C92..0CA8;AL # Lo [23] KANNADA LETTER O..KANNADA LETTER NA +0CAA..0CB3;AL # Lo [10] KANNADA LETTER PA..KANNADA LETTER LLA +0CB5..0CB9;AL # Lo [5] KANNADA LETTER VA..KANNADA LETTER HA +0CBC;CM # Mn KANNADA SIGN NUKTA +0CBD;AL # Lo KANNADA SIGN AVAGRAHA +0CBE;CM # Mc KANNADA VOWEL SIGN AA +0CBF;CM # Mn KANNADA VOWEL SIGN I +0CC0..0CC4;CM # Mc [5] KANNADA VOWEL SIGN II..KANNADA VOWEL SIGN VOCALIC RR +0CC6;CM # Mn KANNADA VOWEL SIGN E +0CC7..0CC8;CM # Mc [2] KANNADA VOWEL SIGN EE..KANNADA VOWEL SIGN AI +0CCA..0CCB;CM # Mc [2] KANNADA VOWEL SIGN O..KANNADA VOWEL SIGN OO +0CCC..0CCD;CM # Mn [2] KANNADA VOWEL SIGN AU..KANNADA SIGN VIRAMA +0CD5..0CD6;CM # Mc [2] KANNADA LENGTH MARK..KANNADA AI LENGTH MARK +0CDE;AL # Lo KANNADA LETTER FA +0CE0..0CE1;AL # Lo [2] KANNADA LETTER VOCALIC RR..KANNADA LETTER VOCALIC LL +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 +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 +0D46..0D48;CM # Mc [3] MALAYALAM VOWEL SIGN E..MALAYALAM VOWEL SIGN AI +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..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 +0D85..0D96;AL # Lo [18] SINHALA LETTER AYANNA..SINHALA LETTER AUYANNA +0D9A..0DB1;AL # Lo [24] SINHALA LETTER ALPAPRAANA KAYANNA..SINHALA LETTER DANTAJA NAYANNA +0DB3..0DBB;AL # Lo [9] SINHALA LETTER SANYAKA DAYANNA..SINHALA LETTER RAYANNA +0DBD;AL # Lo SINHALA LETTER DANTAJA LAYANNA +0DC0..0DC6;AL # Lo [7] SINHALA LETTER VAYANNA..SINHALA LETTER FAYANNA +0DCA;CM # Mn SINHALA SIGN AL-LAKUNA +0DCF..0DD1;CM # Mc [3] SINHALA VOWEL SIGN AELA-PILLA..SINHALA VOWEL SIGN DIGA AEDA-PILLA +0DD2..0DD4;CM # Mn [3] SINHALA VOWEL SIGN KETTI IS-PILLA..SINHALA VOWEL SIGN KETTI PAA-PILLA +0DD6;CM # Mn SINHALA VOWEL SIGN DIGA PAA-PILLA +0DD8..0DDF;CM # Mc [8] SINHALA VOWEL SIGN GAETTA-PILLA..SINHALA VOWEL SIGN GAYANUKITTA +0DE6..0DEF;NU # Nd [10] SINHALA LITH DIGIT ZERO..SINHALA LITH DIGIT NINE +0DF2..0DF3;CM # Mc [2] SINHALA VOWEL SIGN DIGA GAETTA-PILLA..SINHALA VOWEL SIGN DIGA GAYANUKITTA +0DF4;AL # Po SINHALA PUNCTUATION KUNDDALIYA +0E01..0E30;SA # Lo [48] THAI CHARACTER KO KAI..THAI CHARACTER SARA A +0E31;SA # Mn THAI CHARACTER MAI HAN-AKAT +0E32..0E33;SA # Lo [2] THAI CHARACTER SARA AA..THAI CHARACTER SARA AM +0E34..0E3A;SA # Mn [7] THAI CHARACTER SARA I..THAI CHARACTER PHINTHU +0E3F;PR # Sc THAI CURRENCY SYMBOL BAHT +0E40..0E45;SA # Lo [6] THAI CHARACTER SARA E..THAI CHARACTER LAKKHANGYAO +0E46;SA # Lm THAI CHARACTER MAIYAMOK +0E47..0E4E;SA # Mn [8] THAI CHARACTER MAITAIKHU..THAI CHARACTER YAMAKKAN +0E4F;AL # Po THAI CHARACTER FONGMAN +0E50..0E59;NU # Nd [10] THAI DIGIT ZERO..THAI DIGIT NINE +0E5A..0E5B;BA # Po [2] THAI CHARACTER ANGKHANKHU..THAI CHARACTER KHOMUT +0E81..0E82;SA # Lo [2] LAO LETTER KO..LAO LETTER KHO SUNG +0E84;SA # Lo LAO LETTER KHO TAM +0E87..0E88;SA # Lo [2] LAO LETTER NGO..LAO LETTER CO +0E8A;SA # Lo LAO LETTER SO TAM +0E8D;SA # Lo LAO LETTER NYO +0E94..0E97;SA # Lo [4] LAO LETTER DO..LAO LETTER THO TAM +0E99..0E9F;SA # Lo [7] LAO LETTER NO..LAO LETTER FO SUNG +0EA1..0EA3;SA # Lo [3] LAO LETTER MO..LAO LETTER LO LING +0EA5;SA # Lo LAO LETTER LO LOOT +0EA7;SA # Lo LAO LETTER WO +0EAA..0EAB;SA # Lo [2] LAO LETTER SO SUNG..LAO LETTER HO SUNG +0EAD..0EB0;SA # Lo [4] LAO LETTER O..LAO VOWEL SIGN A +0EB1;SA # Mn LAO VOWEL SIGN MAI KAN +0EB2..0EB3;SA # Lo [2] LAO VOWEL SIGN AA..LAO VOWEL SIGN AM +0EB4..0EB9;SA # Mn [6] LAO VOWEL SIGN I..LAO VOWEL SIGN UU +0EBB..0EBC;SA # Mn [2] LAO VOWEL SIGN MAI KON..LAO SEMIVOWEL SIGN LO +0EBD;SA # Lo LAO SEMIVOWEL SIGN NYO +0EC0..0EC4;SA # Lo [5] LAO VOWEL SIGN E..LAO VOWEL SIGN AI +0EC6;SA # Lm LAO KO LA +0EC8..0ECD;SA # Mn [6] LAO TONE MAI EK..LAO NIGGAHITA +0ED0..0ED9;NU # Nd [10] LAO DIGIT ZERO..LAO DIGIT NINE +0EDC..0EDF;SA # Lo [4] LAO HO NO..LAO LETTER KHMU NYO +0F00;AL # Lo TIBETAN SYLLABLE OM +0F01..0F03;BB # So [3] TIBETAN MARK GTER YIG MGO TRUNCATED A..TIBETAN MARK GTER YIG MGO -UM GTER TSHEG MA +0F04;BB # Po TIBETAN MARK INITIAL YIG MGO MDUN MA +0F05;AL # Po TIBETAN MARK CLOSING YIG MGO SGAB MA +0F06..0F07;BB # Po [2] TIBETAN MARK CARET YIG MGO PHUR SHAD MA..TIBETAN MARK YIG MGO TSHEG SHAD MA +0F08;GL # Po TIBETAN MARK SBRUL SHAD +0F09..0F0A;BB # Po [2] TIBETAN MARK BSKUR YIG MGO..TIBETAN MARK BKA- SHOG YIG MGO +0F0B;BA # Po TIBETAN MARK INTERSYLLABIC TSHEG +0F0C;GL # Po TIBETAN MARK DELIMITER TSHEG BSTAR +0F0D..0F11;EX # Po [5] TIBETAN MARK SHAD..TIBETAN MARK RIN CHEN SPUNGS SHAD +0F12;GL # Po TIBETAN MARK RGYA GRAM SHAD +0F13;AL # So TIBETAN MARK CARET -DZUD RTAGS ME LONG CAN +0F14;EX # Po TIBETAN MARK GTER TSHEG +0F15..0F17;AL # So [3] TIBETAN LOGOTYPE SIGN CHAD RTAGS..TIBETAN ASTROLOGICAL SIGN SGRA GCAN -CHAR RTAGS +0F18..0F19;CM # Mn [2] TIBETAN ASTROLOGICAL SIGN -KHYUD PA..TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS +0F1A..0F1F;AL # So [6] TIBETAN SIGN RDEL DKAR GCIG..TIBETAN SIGN RDEL DKAR RDEL NAG +0F20..0F29;NU # Nd [10] TIBETAN DIGIT ZERO..TIBETAN DIGIT NINE +0F2A..0F33;AL # No [10] TIBETAN DIGIT HALF ONE..TIBETAN DIGIT HALF ZERO +0F34;BA # So TIBETAN MARK BSDUS RTAGS +0F35;CM # Mn TIBETAN MARK NGAS BZUNG NYI ZLA +0F36;AL # So TIBETAN MARK CARET -DZUD RTAGS BZHI MIG CAN +0F37;CM # Mn TIBETAN MARK NGAS BZUNG SGOR RTAGS +0F38;AL # So TIBETAN MARK CHE MGO +0F39;CM # Mn TIBETAN MARK TSA -PHRU +0F3A;OP # Ps TIBETAN MARK GUG RTAGS GYON +0F3B;CL # Pe TIBETAN MARK GUG RTAGS GYAS +0F3C;OP # Ps TIBETAN MARK ANG KHANG GYON +0F3D;CL # Pe TIBETAN MARK ANG KHANG GYAS +0F3E..0F3F;CM # Mc [2] TIBETAN SIGN YAR TSHES..TIBETAN SIGN MAR TSHES +0F40..0F47;AL # Lo [8] TIBETAN LETTER KA..TIBETAN LETTER JA +0F49..0F6C;AL # Lo [36] TIBETAN LETTER NYA..TIBETAN LETTER RRA +0F71..0F7E;CM # Mn [14] TIBETAN VOWEL SIGN AA..TIBETAN SIGN RJES SU NGA RO +0F7F;BA # Mc TIBETAN SIGN RNAM BCAD +0F80..0F84;CM # Mn [5] TIBETAN VOWEL SIGN REVERSED I..TIBETAN MARK HALANTA +0F85;BA # Po TIBETAN MARK PALUTA +0F86..0F87;CM # Mn [2] TIBETAN SIGN LCI RTAGS..TIBETAN SIGN YANG RTAGS +0F88..0F8C;AL # Lo [5] TIBETAN SIGN LCE TSA CAN..TIBETAN SIGN INVERTED MCHU CAN +0F8D..0F97;CM # Mn [11] TIBETAN SUBJOINED SIGN LCE TSA CAN..TIBETAN SUBJOINED LETTER JA +0F99..0FBC;CM # Mn [36] TIBETAN SUBJOINED LETTER NYA..TIBETAN SUBJOINED LETTER FIXED-FORM RA +0FBE..0FBF;BA # So [2] TIBETAN KU RU KHA..TIBETAN KU RU KHA BZHI MIG CAN +0FC0..0FC5;AL # So [6] TIBETAN CANTILLATION SIGN HEAVY BEAT..TIBETAN SYMBOL RDO RJE +0FC6;CM # Mn TIBETAN SYMBOL PADMA GDAN +0FC7..0FCC;AL # So [6] TIBETAN SYMBOL RDO RJE RGYA GRAM..TIBETAN SYMBOL NOR BU BZHI -KHYIL +0FCE..0FCF;AL # So [2] TIBETAN SIGN RDEL NAG RDEL DKAR..TIBETAN SIGN RDEL NAG GSUM +0FD0..0FD1;BB # Po [2] TIBETAN MARK BSKA- SHOG GI MGO RGYAN..TIBETAN MARK MNYAM YIG GI MGO RGYAN +0FD2;BA # Po TIBETAN MARK NYIS TSHEG +0FD3;BB # Po TIBETAN MARK INITIAL BRDA RNYING YIG MGO MDUN MA +0FD4;AL # Po TIBETAN MARK CLOSING BRDA RNYING YIG MGO SGAB MA +0FD5..0FD8;AL # So [4] RIGHT-FACING SVASTI SIGN..LEFT-FACING SVASTI SIGN WITH DOTS +0FD9..0FDA;GL # Po [2] TIBETAN MARK LEADING MCHAN RTAGS..TIBETAN MARK TRAILING MCHAN RTAGS +1000..102A;SA # Lo [43] MYANMAR LETTER KA..MYANMAR LETTER AU +102B..102C;SA # Mc [2] MYANMAR VOWEL SIGN TALL AA..MYANMAR VOWEL SIGN AA +102D..1030;SA # Mn [4] MYANMAR VOWEL SIGN I..MYANMAR VOWEL SIGN UU +1031;SA # Mc MYANMAR VOWEL SIGN E +1032..1037;SA # Mn [6] MYANMAR VOWEL SIGN AI..MYANMAR SIGN DOT BELOW +1038;SA # Mc MYANMAR SIGN VISARGA +1039..103A;SA # Mn [2] MYANMAR SIGN VIRAMA..MYANMAR SIGN ASAT +103B..103C;SA # Mc [2] MYANMAR CONSONANT SIGN MEDIAL YA..MYANMAR CONSONANT SIGN MEDIAL RA +103D..103E;SA # Mn [2] MYANMAR CONSONANT SIGN MEDIAL WA..MYANMAR CONSONANT SIGN MEDIAL HA +103F;SA # Lo MYANMAR LETTER GREAT SA +1040..1049;NU # Nd [10] MYANMAR DIGIT ZERO..MYANMAR DIGIT NINE +104A..104B;BA # Po [2] MYANMAR SIGN LITTLE SECTION..MYANMAR SIGN SECTION +104C..104F;AL # Po [4] MYANMAR SYMBOL LOCATIVE..MYANMAR SYMBOL GENITIVE +1050..1055;SA # Lo [6] MYANMAR LETTER SHA..MYANMAR LETTER VOCALIC LL +1056..1057;SA # Mc [2] MYANMAR VOWEL SIGN VOCALIC R..MYANMAR VOWEL SIGN VOCALIC RR +1058..1059;SA # Mn [2] MYANMAR VOWEL SIGN VOCALIC L..MYANMAR VOWEL SIGN VOCALIC LL +105A..105D;SA # Lo [4] MYANMAR LETTER MON NGA..MYANMAR LETTER MON BBE +105E..1060;SA # Mn [3] MYANMAR CONSONANT SIGN MON MEDIAL NA..MYANMAR CONSONANT SIGN MON MEDIAL LA +1061;SA # Lo MYANMAR LETTER SGAW KAREN SHA +1062..1064;SA # Mc [3] MYANMAR VOWEL SIGN SGAW KAREN EU..MYANMAR TONE MARK SGAW KAREN KE PHO +1065..1066;SA # Lo [2] MYANMAR LETTER WESTERN PWO KAREN THA..MYANMAR LETTER WESTERN PWO KAREN PWA +1067..106D;SA # Mc [7] MYANMAR VOWEL SIGN WESTERN PWO KAREN EU..MYANMAR SIGN WESTERN PWO KAREN TONE-5 +106E..1070;SA # Lo [3] MYANMAR LETTER EASTERN PWO KAREN NNA..MYANMAR LETTER EASTERN PWO KAREN GHWA +1071..1074;SA # Mn [4] MYANMAR VOWEL SIGN GEBA KAREN I..MYANMAR VOWEL SIGN KAYAH EE +1075..1081;SA # Lo [13] MYANMAR LETTER SHAN KA..MYANMAR LETTER SHAN HA +1082;SA # Mn MYANMAR CONSONANT SIGN SHAN MEDIAL WA +1083..1084;SA # Mc [2] MYANMAR VOWEL SIGN SHAN AA..MYANMAR VOWEL SIGN SHAN E +1085..1086;SA # Mn [2] MYANMAR VOWEL SIGN SHAN E ABOVE..MYANMAR VOWEL SIGN SHAN FINAL Y +1087..108C;SA # Mc [6] MYANMAR SIGN SHAN TONE-2..MYANMAR SIGN SHAN COUNCIL TONE-3 +108D;SA # Mn MYANMAR SIGN SHAN COUNCIL EMPHATIC TONE +108E;SA # Lo MYANMAR LETTER RUMAI PALAUNG FA +108F;SA # Mc MYANMAR SIGN RUMAI PALAUNG TONE-5 +1090..1099;NU # Nd [10] MYANMAR SHAN DIGIT ZERO..MYANMAR SHAN DIGIT NINE +109A..109C;SA # Mc [3] MYANMAR SIGN KHAMTI TONE-1..MYANMAR VOWEL SIGN AITON A +109D;SA # Mn MYANMAR VOWEL SIGN AITON AI +109E..109F;SA # So [2] MYANMAR SYMBOL SHAN ONE..MYANMAR SYMBOL SHAN EXCLAMATION +10A0..10C5;AL # Lu [38] GEORGIAN CAPITAL LETTER AN..GEORGIAN CAPITAL LETTER HOE +10C7;AL # Lu GEORGIAN CAPITAL LETTER YN +10CD;AL # Lu GEORGIAN CAPITAL LETTER AEN +10D0..10FA;AL # Ll [43] GEORGIAN LETTER AN..GEORGIAN LETTER AIN +10FB;AL # Po GEORGIAN PARAGRAPH SEPARATOR +10FC;AL # Lm MODIFIER LETTER GEORGIAN NAR +10FD..10FF;AL # Ll [3] GEORGIAN LETTER AEN..GEORGIAN LETTER LABIAL SIGN +1100..115F;JL # Lo [96] HANGUL CHOSEONG KIYEOK..HANGUL CHOSEONG FILLER +1160..11A7;JV # Lo [72] HANGUL JUNGSEONG FILLER..HANGUL JUNGSEONG O-YAE +11A8..11FF;JT # Lo [88] HANGUL JONGSEONG KIYEOK..HANGUL JONGSEONG SSANGNIEUN +1200..1248;AL # Lo [73] ETHIOPIC SYLLABLE HA..ETHIOPIC SYLLABLE QWA +124A..124D;AL # Lo [4] ETHIOPIC SYLLABLE QWI..ETHIOPIC SYLLABLE QWE +1250..1256;AL # Lo [7] ETHIOPIC SYLLABLE QHA..ETHIOPIC SYLLABLE QHO +1258;AL # Lo ETHIOPIC SYLLABLE QHWA +125A..125D;AL # Lo [4] ETHIOPIC SYLLABLE QHWI..ETHIOPIC SYLLABLE QHWE +1260..1288;AL # Lo [41] ETHIOPIC SYLLABLE BA..ETHIOPIC SYLLABLE XWA +128A..128D;AL # Lo [4] ETHIOPIC SYLLABLE XWI..ETHIOPIC SYLLABLE XWE +1290..12B0;AL # Lo [33] ETHIOPIC SYLLABLE NA..ETHIOPIC SYLLABLE KWA +12B2..12B5;AL # Lo [4] ETHIOPIC SYLLABLE KWI..ETHIOPIC SYLLABLE KWE +12B8..12BE;AL # Lo [7] ETHIOPIC SYLLABLE KXA..ETHIOPIC SYLLABLE KXO +12C0;AL # Lo ETHIOPIC SYLLABLE KXWA +12C2..12C5;AL # Lo [4] ETHIOPIC SYLLABLE KXWI..ETHIOPIC SYLLABLE KXWE +12C8..12D6;AL # Lo [15] ETHIOPIC SYLLABLE WA..ETHIOPIC SYLLABLE PHARYNGEAL O +12D8..1310;AL # Lo [57] ETHIOPIC SYLLABLE ZA..ETHIOPIC SYLLABLE GWA +1312..1315;AL # Lo [4] ETHIOPIC SYLLABLE GWI..ETHIOPIC SYLLABLE GWE +1318..135A;AL # Lo [67] ETHIOPIC SYLLABLE GGA..ETHIOPIC SYLLABLE FYA +135D..135F;CM # Mn [3] ETHIOPIC COMBINING GEMINATION AND VOWEL LENGTH MARK..ETHIOPIC COMBINING GEMINATION MARK +1360;AL # Po ETHIOPIC SECTION MARK +1361;BA # Po ETHIOPIC WORDSPACE +1362..1368;AL # Po [7] ETHIOPIC FULL STOP..ETHIOPIC PARAGRAPH SEPARATOR +1369..137C;AL # No [20] ETHIOPIC DIGIT ONE..ETHIOPIC NUMBER TEN THOUSAND +1380..138F;AL # Lo [16] ETHIOPIC SYLLABLE SEBATBEIT MWA..ETHIOPIC SYLLABLE PWE +1390..1399;AL # So [10] ETHIOPIC TONAL MARK YIZET..ETHIOPIC TONAL MARK KURT +13A0..13F5;AL # Lu [86] CHEROKEE LETTER A..CHEROKEE LETTER MV +13F8..13FD;AL # Ll [6] CHEROKEE SMALL LETTER YE..CHEROKEE SMALL LETTER MV +1400;BA # Pd CANADIAN SYLLABICS HYPHEN +1401..166C;AL # Lo [620] CANADIAN SYLLABICS E..CANADIAN SYLLABICS CARRIER TTSA +166D..166E;AL # Po [2] CANADIAN SYLLABICS CHI SIGN..CANADIAN SYLLABICS FULL STOP +166F..167F;AL # Lo [17] CANADIAN SYLLABICS QAI..CANADIAN SYLLABICS BLACKFOOT W +1680;BA # Zs OGHAM SPACE MARK +1681..169A;AL # Lo [26] OGHAM LETTER BEITH..OGHAM LETTER PEITH +169B;OP # Ps OGHAM FEATHER MARK +169C;CL # Pe OGHAM REVERSED FEATHER MARK +16A0..16EA;AL # Lo [75] RUNIC LETTER FEHU FEOH FE F..RUNIC LETTER X +16EB..16ED;BA # Po [3] RUNIC SINGLE PUNCTUATION..RUNIC CROSS PUNCTUATION +16EE..16F0;AL # Nl [3] RUNIC ARLAUG SYMBOL..RUNIC BELGTHOR SYMBOL +16F1..16F8;AL # Lo [8] RUNIC LETTER K..RUNIC LETTER FRANKS CASKET AESC +1700..170C;AL # Lo [13] TAGALOG LETTER A..TAGALOG LETTER YA +170E..1711;AL # Lo [4] TAGALOG LETTER LA..TAGALOG LETTER HA +1712..1714;CM # Mn [3] TAGALOG VOWEL SIGN I..TAGALOG SIGN VIRAMA +1720..1731;AL # Lo [18] HANUNOO LETTER A..HANUNOO LETTER HA +1732..1734;CM # Mn [3] HANUNOO VOWEL SIGN I..HANUNOO SIGN PAMUDPOD +1735..1736;BA # Po [2] PHILIPPINE SINGLE PUNCTUATION..PHILIPPINE DOUBLE PUNCTUATION +1740..1751;AL # Lo [18] BUHID LETTER A..BUHID LETTER HA +1752..1753;CM # Mn [2] BUHID VOWEL SIGN I..BUHID VOWEL SIGN U +1760..176C;AL # Lo [13] TAGBANWA LETTER A..TAGBANWA LETTER YA +176E..1770;AL # Lo [3] TAGBANWA LETTER LA..TAGBANWA LETTER SA +1772..1773;CM # Mn [2] TAGBANWA VOWEL SIGN I..TAGBANWA VOWEL SIGN U +1780..17B3;SA # Lo [52] KHMER LETTER KA..KHMER INDEPENDENT VOWEL QAU +17B4..17B5;SA # Mn [2] KHMER VOWEL INHERENT AQ..KHMER VOWEL INHERENT AA +17B6;SA # Mc KHMER VOWEL SIGN AA +17B7..17BD;SA # Mn [7] KHMER VOWEL SIGN I..KHMER VOWEL SIGN UA +17BE..17C5;SA # Mc [8] KHMER VOWEL SIGN OE..KHMER VOWEL SIGN AU +17C6;SA # Mn KHMER SIGN NIKAHIT +17C7..17C8;SA # Mc [2] KHMER SIGN REAHMUK..KHMER SIGN YUUKALEAPINTU +17C9..17D3;SA # Mn [11] KHMER SIGN MUUSIKATOAN..KHMER SIGN BATHAMASAT +17D4..17D5;BA # Po [2] KHMER SIGN KHAN..KHMER SIGN BARIYOOSAN +17D6;NS # Po KHMER SIGN CAMNUC PII KUUH +17D7;SA # Lm KHMER SIGN LEK TOO +17D8;BA # Po KHMER SIGN BEYYAL +17D9;AL # Po KHMER SIGN PHNAEK MUAN +17DA;BA # Po KHMER SIGN KOOMUUT +17DB;PR # Sc KHMER CURRENCY SYMBOL RIEL +17DC;SA # Lo KHMER SIGN AVAKRAHASANYA +17DD;SA # Mn KHMER SIGN ATTHACAN +17E0..17E9;NU # Nd [10] KHMER DIGIT ZERO..KHMER DIGIT NINE +17F0..17F9;AL # No [10] KHMER SYMBOL LEK ATTAK SON..KHMER SYMBOL LEK ATTAK PRAM-BUON +1800..1801;AL # Po [2] MONGOLIAN BIRGA..MONGOLIAN ELLIPSIS +1802..1803;EX # Po [2] MONGOLIAN COMMA..MONGOLIAN FULL STOP +1804..1805;BA # Po [2] MONGOLIAN COLON..MONGOLIAN FOUR DOTS +1806;BB # Pd MONGOLIAN TODO SOFT HYPHEN +1807;AL # Po MONGOLIAN SIBE SYLLABLE BOUNDARY MARKER +1808..1809;EX # Po [2] MONGOLIAN MANCHU COMMA..MONGOLIAN MANCHU FULL STOP +180A;AL # Po MONGOLIAN NIRUGU +180B..180D;CM # Mn [3] MONGOLIAN FREE VARIATION SELECTOR ONE..MONGOLIAN FREE VARIATION SELECTOR THREE +180E;GL # Cf MONGOLIAN VOWEL SEPARATOR +1810..1819;NU # Nd [10] MONGOLIAN DIGIT ZERO..MONGOLIAN DIGIT NINE +1820..1842;AL # Lo [35] MONGOLIAN LETTER A..MONGOLIAN LETTER CHI +1843;AL # Lm MONGOLIAN LETTER TODO LONG VOWEL SIGN +1844..1878;AL # Lo [53] MONGOLIAN LETTER TODO E..MONGOLIAN LETTER CHA WITH TWO DOTS +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 +1900..191E;AL # Lo [31] LIMBU VOWEL-CARRIER LETTER..LIMBU LETTER TRA +1920..1922;CM # Mn [3] LIMBU VOWEL SIGN A..LIMBU VOWEL SIGN U +1923..1926;CM # Mc [4] LIMBU VOWEL SIGN EE..LIMBU VOWEL SIGN AU +1927..1928;CM # Mn [2] LIMBU VOWEL SIGN E..LIMBU VOWEL SIGN O +1929..192B;CM # Mc [3] LIMBU SUBJOINED LETTER YA..LIMBU SUBJOINED LETTER WA +1930..1931;CM # Mc [2] LIMBU SMALL LETTER KA..LIMBU SMALL LETTER NGA +1932;CM # Mn LIMBU SMALL LETTER ANUSVARA +1933..1938;CM # Mc [6] LIMBU SMALL LETTER TA..LIMBU SMALL LETTER LA +1939..193B;CM # Mn [3] LIMBU SIGN MUKPHRENG..LIMBU SIGN SA-I +1940;AL # So LIMBU SIGN LOO +1944..1945;EX # Po [2] LIMBU EXCLAMATION MARK..LIMBU QUESTION MARK +1946..194F;NU # Nd [10] LIMBU DIGIT ZERO..LIMBU DIGIT NINE +1950..196D;SA # Lo [30] TAI LE LETTER KA..TAI LE LETTER AI +1970..1974;SA # Lo [5] TAI LE LETTER TONE-2..TAI LE LETTER TONE-6 +1980..19AB;SA # Lo [44] NEW TAI LUE LETTER HIGH QA..NEW TAI LUE LETTER LOW SUA +19B0..19C9;SA # Lo [26] NEW TAI LUE VOWEL SIGN VOWEL SHORTENER..NEW TAI LUE TONE MARK-2 +19D0..19D9;NU # Nd [10] NEW TAI LUE DIGIT ZERO..NEW TAI LUE DIGIT NINE +19DA;SA # No NEW TAI LUE THAM DIGIT ONE +19DE..19DF;SA # So [2] NEW TAI LUE SIGN LAE..NEW TAI LUE SIGN LAEV +19E0..19FF;AL # So [32] KHMER SYMBOL PATHAMASAT..KHMER SYMBOL DAP-PRAM ROC +1A00..1A16;AL # Lo [23] BUGINESE LETTER KA..BUGINESE LETTER HA +1A17..1A18;CM # Mn [2] BUGINESE VOWEL SIGN I..BUGINESE VOWEL SIGN U +1A19..1A1A;CM # Mc [2] BUGINESE VOWEL SIGN E..BUGINESE VOWEL SIGN O +1A1B;CM # Mn BUGINESE VOWEL SIGN AE +1A1E..1A1F;AL # Po [2] BUGINESE PALLAWA..BUGINESE END OF SECTION +1A20..1A54;SA # Lo [53] TAI THAM LETTER HIGH KA..TAI THAM LETTER GREAT SA +1A55;SA # Mc TAI THAM CONSONANT SIGN MEDIAL RA +1A56;SA # Mn TAI THAM CONSONANT SIGN MEDIAL LA +1A57;SA # Mc TAI THAM CONSONANT SIGN LA TANG LAI +1A58..1A5E;SA # Mn [7] TAI THAM SIGN MAI KANG LAI..TAI THAM CONSONANT SIGN SA +1A60;SA # Mn TAI THAM SIGN SAKOT +1A61;SA # Mc TAI THAM VOWEL SIGN A +1A62;SA # Mn TAI THAM VOWEL SIGN MAI SAT +1A63..1A64;SA # Mc [2] TAI THAM VOWEL SIGN AA..TAI THAM VOWEL SIGN TALL AA +1A65..1A6C;SA # Mn [8] TAI THAM VOWEL SIGN I..TAI THAM VOWEL SIGN OA BELOW +1A6D..1A72;SA # Mc [6] TAI THAM VOWEL SIGN OY..TAI THAM VOWEL SIGN THAM AI +1A73..1A7C;SA # Mn [10] TAI THAM VOWEL SIGN OA ABOVE..TAI THAM SIGN KHUEN-LUE KARAN +1A7F;CM # Mn TAI THAM COMBINING CRYPTOGRAMMIC DOT +1A80..1A89;NU # Nd [10] TAI THAM HORA DIGIT ZERO..TAI THAM HORA DIGIT NINE +1A90..1A99;NU # Nd [10] TAI THAM THAM DIGIT ZERO..TAI THAM THAM DIGIT NINE +1AA0..1AA6;SA # Po [7] TAI THAM SIGN WIANG..TAI THAM SIGN REVERSED ROTATED RANA +1AA7;SA # Lm TAI THAM SIGN MAI YAMOK +1AA8..1AAD;SA # Po [6] TAI THAM SIGN KAAN..TAI THAM SIGN CAANG +1AB0..1ABD;CM # Mn [14] COMBINING DOUBLED CIRCUMFLEX ACCENT..COMBINING PARENTHESES BELOW +1ABE;CM # Me COMBINING PARENTHESES OVERLAY +1B00..1B03;CM # Mn [4] BALINESE SIGN ULU RICEM..BALINESE SIGN SURANG +1B04;CM # Mc BALINESE SIGN BISAH +1B05..1B33;AL # Lo [47] BALINESE LETTER AKARA..BALINESE LETTER HA +1B34;CM # Mn BALINESE SIGN REREKAN +1B35;CM # Mc BALINESE VOWEL SIGN TEDUNG +1B36..1B3A;CM # Mn [5] BALINESE VOWEL SIGN ULU..BALINESE VOWEL SIGN RA REPA +1B3B;CM # Mc BALINESE VOWEL SIGN RA REPA TEDUNG +1B3C;CM # Mn BALINESE VOWEL SIGN LA LENGA +1B3D..1B41;CM # Mc [5] BALINESE VOWEL SIGN LA LENGA TEDUNG..BALINESE VOWEL SIGN TALING REPA TEDUNG +1B42;CM # Mn BALINESE VOWEL SIGN PEPET +1B43..1B44;CM # Mc [2] BALINESE VOWEL SIGN PEPET TEDUNG..BALINESE ADEG ADEG +1B45..1B4B;AL # Lo [7] BALINESE LETTER KAF SASAK..BALINESE LETTER ASYURA SASAK +1B50..1B59;NU # Nd [10] BALINESE DIGIT ZERO..BALINESE DIGIT NINE +1B5A..1B5B;BA # Po [2] BALINESE PANTI..BALINESE PAMADA +1B5C;AL # Po BALINESE WINDU +1B5D..1B60;BA # Po [4] BALINESE CARIK PAMUNGKAH..BALINESE PAMENENG +1B61..1B6A;AL # So [10] BALINESE MUSICAL SYMBOL DONG..BALINESE MUSICAL SYMBOL DANG GEDE +1B6B..1B73;CM # Mn [9] BALINESE MUSICAL SYMBOL COMBINING TEGEH..BALINESE MUSICAL SYMBOL COMBINING GONG +1B74..1B7C;AL # So [9] BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DUG..BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PING +1B80..1B81;CM # Mn [2] SUNDANESE SIGN PANYECEK..SUNDANESE SIGN PANGLAYAR +1B82;CM # Mc SUNDANESE SIGN PANGWISAD +1B83..1BA0;AL # Lo [30] SUNDANESE LETTER A..SUNDANESE LETTER HA +1BA1;CM # Mc SUNDANESE CONSONANT SIGN PAMINGKAL +1BA2..1BA5;CM # Mn [4] SUNDANESE CONSONANT SIGN PANYAKRA..SUNDANESE VOWEL SIGN PANYUKU +1BA6..1BA7;CM # Mc [2] SUNDANESE VOWEL SIGN PANAELAENG..SUNDANESE VOWEL SIGN PANOLONG +1BA8..1BA9;CM # Mn [2] SUNDANESE VOWEL SIGN PAMEPET..SUNDANESE VOWEL SIGN PANEULEUNG +1BAA;CM # Mc SUNDANESE SIGN PAMAAEH +1BAB..1BAD;CM # Mn [3] SUNDANESE SIGN VIRAMA..SUNDANESE CONSONANT SIGN PASANGAN WA +1BAE..1BAF;AL # Lo [2] SUNDANESE LETTER KHA..SUNDANESE LETTER SYA +1BB0..1BB9;NU # Nd [10] SUNDANESE DIGIT ZERO..SUNDANESE DIGIT NINE +1BBA..1BBF;AL # Lo [6] SUNDANESE AVAGRAHA..SUNDANESE LETTER FINAL M +1BC0..1BE5;AL # Lo [38] BATAK LETTER A..BATAK LETTER U +1BE6;CM # Mn BATAK SIGN TOMPI +1BE7;CM # Mc BATAK VOWEL SIGN E +1BE8..1BE9;CM # Mn [2] BATAK VOWEL SIGN PAKPAK E..BATAK VOWEL SIGN EE +1BEA..1BEC;CM # Mc [3] BATAK VOWEL SIGN I..BATAK VOWEL SIGN O +1BED;CM # Mn BATAK VOWEL SIGN KARO O +1BEE;CM # Mc BATAK VOWEL SIGN U +1BEF..1BF1;CM # Mn [3] BATAK VOWEL SIGN U FOR SIMALUNGUN SA..BATAK CONSONANT SIGN H +1BF2..1BF3;CM # Mc [2] BATAK PANGOLAT..BATAK PANONGONAN +1BFC..1BFF;AL # Po [4] BATAK SYMBOL BINDU NA METEK..BATAK SYMBOL BINDU PANGOLAT +1C00..1C23;AL # Lo [36] LEPCHA LETTER KA..LEPCHA LETTER A +1C24..1C2B;CM # Mc [8] LEPCHA SUBJOINED LETTER YA..LEPCHA VOWEL SIGN UU +1C2C..1C33;CM # Mn [8] LEPCHA VOWEL SIGN E..LEPCHA CONSONANT SIGN T +1C34..1C35;CM # Mc [2] LEPCHA CONSONANT SIGN NYIN-DO..LEPCHA CONSONANT SIGN KANG +1C36..1C37;CM # Mn [2] LEPCHA SIGN RAN..LEPCHA SIGN NUKTA +1C3B..1C3F;BA # Po [5] LEPCHA PUNCTUATION TA-ROL..LEPCHA PUNCTUATION TSHOOK +1C40..1C49;NU # Nd [10] LEPCHA DIGIT ZERO..LEPCHA DIGIT NINE +1C4D..1C4F;AL # Lo [3] LEPCHA LETTER TTA..LEPCHA LETTER DDA +1C50..1C59;NU # Nd [10] OL CHIKI DIGIT ZERO..OL CHIKI DIGIT NINE +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 +1C90..1CBA;AL # Lu [43] GEORGIAN MTAVRULI CAPITAL LETTER AN..GEORGIAN MTAVRULI CAPITAL LETTER AIN +1CBD..1CBF;AL # Lu [3] GEORGIAN MTAVRULI CAPITAL LETTER AEN..GEORGIAN MTAVRULI CAPITAL LETTER LABIAL SIGN +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 +1CD4..1CE0;CM # Mn [13] VEDIC SIGN YAJURVEDIC MIDLINE SVARITA..VEDIC TONE RIGVEDIC KASHMIRI INDEPENDENT SVARITA +1CE1;CM # Mc VEDIC TONE ATHARVAVEDIC INDEPENDENT SVARITA +1CE2..1CE8;CM # Mn [7] VEDIC SIGN VISARGA SVARITA..VEDIC SIGN VISARGA ANUDATTA WITH TAIL +1CE9..1CEC;AL # Lo [4] VEDIC SIGN ANUSVARA ANTARGOMUKHA..VEDIC SIGN ANUSVARA VAMAGOMUKHA WITH TAIL +1CED;CM # Mn VEDIC SIGN TIRYAK +1CEE..1CF1;AL # Lo [4] VEDIC SIGN HEXIFORM LONG ANUSVARA..VEDIC SIGN ANUSVARA UBHAYATO MUKHA +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 +1D6B..1D77;AL # Ll [13] LATIN SMALL LETTER UE..LATIN SMALL LETTER TURNED G +1D78;AL # Lm MODIFIER LETTER CYRILLIC EN +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..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 +1F18..1F1D;AL # Lu [6] GREEK CAPITAL LETTER EPSILON WITH PSILI..GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA +1F20..1F45;AL # L& [38] GREEK SMALL LETTER ETA WITH PSILI..GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA +1F48..1F4D;AL # Lu [6] GREEK CAPITAL LETTER OMICRON WITH PSILI..GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA +1F50..1F57;AL # Ll [8] GREEK SMALL LETTER UPSILON WITH PSILI..GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI +1F59;AL # Lu GREEK CAPITAL LETTER UPSILON WITH DASIA +1F5B;AL # Lu GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA +1F5D;AL # Lu GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA +1F5F..1F7D;AL # L& [31] GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI..GREEK SMALL LETTER OMEGA WITH OXIA +1F80..1FB4;AL # L& [53] GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI..GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI +1FB6..1FBC;AL # L& [7] GREEK SMALL LETTER ALPHA WITH PERISPOMENI..GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI +1FBD;AL # Sk GREEK KORONIS +1FBE;AL # Ll GREEK PROSGEGRAMMENI +1FBF..1FC1;AL # Sk [3] GREEK PSILI..GREEK DIALYTIKA AND PERISPOMENI +1FC2..1FC4;AL # Ll [3] GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI +1FC6..1FCC;AL # L& [7] GREEK SMALL LETTER ETA WITH PERISPOMENI..GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI +1FCD..1FCF;AL # Sk [3] GREEK PSILI AND VARIA..GREEK PSILI AND PERISPOMENI +1FD0..1FD3;AL # Ll [4] GREEK SMALL LETTER IOTA WITH VRACHY..GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA +1FD6..1FDB;AL # L& [6] GREEK SMALL LETTER IOTA WITH PERISPOMENI..GREEK CAPITAL LETTER IOTA WITH OXIA +1FDD..1FDF;AL # Sk [3] GREEK DASIA AND VARIA..GREEK DASIA AND PERISPOMENI +1FE0..1FEC;AL # L& [13] GREEK SMALL LETTER UPSILON WITH VRACHY..GREEK CAPITAL LETTER RHO WITH DASIA +1FED..1FEF;AL # Sk [3] GREEK DIALYTIKA AND VARIA..GREEK VARIA +1FF2..1FF4;AL # Ll [3] GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI +1FF6..1FFC;AL # L& [7] GREEK SMALL LETTER OMEGA WITH PERISPOMENI..GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI +1FFD;BB # Sk GREEK OXIA +1FFE;AL # Sk GREEK DASIA +2000..2006;BA # Zs [7] EN QUAD..SIX-PER-EM SPACE +2007;GL # Zs FIGURE SPACE +2008..200A;BA # Zs [3] PUNCTUATION SPACE..HAIR SPACE +200B;ZW # Cf ZERO WIDTH SPACE +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 +2014;B2 # Pd EM DASH +2015;AI # Pd HORIZONTAL BAR +2016;AI # Po DOUBLE VERTICAL LINE +2017;AL # Po DOUBLE LOW LINE +2018;QU # Pi LEFT SINGLE QUOTATION MARK +2019;QU # Pf RIGHT SINGLE QUOTATION MARK +201A;OP # Ps SINGLE LOW-9 QUOTATION MARK +201B..201C;QU # Pi [2] SINGLE HIGH-REVERSED-9 QUOTATION MARK..LEFT DOUBLE QUOTATION MARK +201D;QU # Pf RIGHT DOUBLE QUOTATION MARK +201E;OP # Ps DOUBLE LOW-9 QUOTATION MARK +201F;QU # Pi DOUBLE HIGH-REVERSED-9 QUOTATION MARK +2020..2021;AI # Po [2] DAGGER..DOUBLE DAGGER +2022..2023;AL # Po [2] BULLET..TRIANGULAR BULLET +2024..2026;IN # Po [3] ONE DOT LEADER..HORIZONTAL ELLIPSIS +2027;BA # Po HYPHENATION POINT +2028;BK # Zl LINE SEPARATOR +2029;BK # Zp PARAGRAPH SEPARATOR +202A..202E;CM # Cf [5] LEFT-TO-RIGHT EMBEDDING..RIGHT-TO-LEFT OVERRIDE +202F;GL # Zs NARROW NO-BREAK SPACE +2030..2037;PO # Po [8] PER MILLE SIGN..REVERSED TRIPLE PRIME +2038;AL # Po CARET +2039;QU # Pi SINGLE LEFT-POINTING ANGLE QUOTATION MARK +203A;QU # Pf SINGLE RIGHT-POINTING ANGLE QUOTATION MARK +203B;AI # Po REFERENCE MARK +203C..203D;NS # Po [2] DOUBLE EXCLAMATION MARK..INTERROBANG +203E;AL # Po OVERLINE +203F..2040;AL # Pc [2] UNDERTIE..CHARACTER TIE +2041..2043;AL # Po [3] CARET INSERTION POINT..HYPHEN BULLET +2044;IS # Sm FRACTION SLASH +2045;OP # Ps LEFT SQUARE BRACKET WITH QUILL +2046;CL # Pe RIGHT SQUARE BRACKET WITH QUILL +2047..2049;NS # Po [3] DOUBLE QUESTION MARK..EXCLAMATION QUESTION MARK +204A..2051;AL # Po [8] TIRONIAN SIGN ET..TWO ASTERISKS ALIGNED VERTICALLY +2052;AL # Sm COMMERCIAL MINUS SIGN +2053;AL # Po SWUNG DASH +2054;AL # Pc INVERTED UNDERTIE +2055;AL # Po FLOWER PUNCTUATION MARK +2056;BA # Po THREE DOT PUNCTUATION +2057;AL # Po QUADRUPLE PRIME +2058..205B;BA # Po [4] FOUR DOT PUNCTUATION..FOUR DOT MARK +205C;AL # Po DOTTED CROSS +205D..205E;BA # Po [2] TRICOLON..VERTICAL FOUR DOTS +205F;BA # Zs MEDIUM MATHEMATICAL SPACE +2060;WJ # Cf WORD JOINER +2061..2064;AL # Cf [4] FUNCTION APPLICATION..INVISIBLE PLUS +2066..206F;CM # Cf [10] LEFT-TO-RIGHT ISOLATE..NOMINAL DIGIT SHAPES +2070;AL # No SUPERSCRIPT ZERO +2071;AL # Lm SUPERSCRIPT LATIN SMALL LETTER I +2074;AI # No SUPERSCRIPT FOUR +2075..2079;AL # No [5] SUPERSCRIPT FIVE..SUPERSCRIPT NINE +207A..207C;AL # Sm [3] SUPERSCRIPT PLUS SIGN..SUPERSCRIPT EQUALS SIGN +207D;OP # Ps SUPERSCRIPT LEFT PARENTHESIS +207E;CL # Pe SUPERSCRIPT RIGHT PARENTHESIS +207F;AI # Lm SUPERSCRIPT LATIN SMALL LETTER N +2080;AL # No SUBSCRIPT ZERO +2081..2084;AI # No [4] SUBSCRIPT ONE..SUBSCRIPT FOUR +2085..2089;AL # No [5] SUBSCRIPT FIVE..SUBSCRIPT NINE +208A..208C;AL # Sm [3] SUBSCRIPT PLUS SIGN..SUBSCRIPT EQUALS SIGN +208D;OP # Ps SUBSCRIPT LEFT PARENTHESIS +208E;CL # Pe SUBSCRIPT RIGHT PARENTHESIS +2090..209C;AL # Lm [13] LATIN SUBSCRIPT SMALL LETTER A..LATIN SUBSCRIPT SMALL LETTER T +20A0..20A6;PR # Sc [7] EURO-CURRENCY SIGN..NAIRA SIGN +20A7;PO # Sc PESETA SIGN +20A8..20B5;PR # Sc [14] RUPEE SIGN..CEDI SIGN +20B6;PO # Sc LIVRE TOURNOIS SIGN +20B7..20BA;PR # Sc [4] SPESMILO SIGN..TURKISH LIRA SIGN +20BB;PO # Sc NORDIC MARK SIGN +20BC..20BD;PR # Sc [2] MANAT SIGN..RUBLE SIGN +20BE;PO # Sc LARI SIGN +20BF;PR # Sc BITCOIN SIGN +20C0..20CF;PR # Cn [16] .. +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 +20E2..20E4;CM # Me [3] COMBINING ENCLOSING SCREEN..COMBINING ENCLOSING UPWARD POINTING TRIANGLE +20E5..20F0;CM # Mn [12] COMBINING REVERSE SOLIDUS OVERLAY..COMBINING ASTERISK ABOVE +2100..2101;AL # So [2] ACCOUNT OF..ADDRESSED TO THE SUBJECT +2102;AL # Lu DOUBLE-STRUCK CAPITAL C +2103;PO # So DEGREE CELSIUS +2104;AL # So CENTRE LINE SYMBOL +2105;AI # So CARE OF +2106;AL # So CADA UNA +2107;AL # Lu EULER CONSTANT +2108;AL # So SCRUPLE +2109;PO # So DEGREE FAHRENHEIT +210A..2112;AL # L& [9] SCRIPT SMALL G..SCRIPT CAPITAL L +2113;AI # Ll SCRIPT SMALL L +2114;AL # So L B BAR SYMBOL +2115;AL # Lu DOUBLE-STRUCK CAPITAL N +2116;PR # So NUMERO SIGN +2117;AL # So SOUND RECORDING COPYRIGHT +2118;AL # Sm SCRIPT CAPITAL P +2119..211D;AL # Lu [5] DOUBLE-STRUCK CAPITAL P..DOUBLE-STRUCK CAPITAL R +211E..2120;AL # So [3] PRESCRIPTION TAKE..SERVICE MARK +2121..2122;AI # So [2] TELEPHONE SIGN..TRADE MARK SIGN +2123;AL # So VERSICLE +2124;AL # Lu DOUBLE-STRUCK CAPITAL Z +2125;AL # So OUNCE SIGN +2126;AL # Lu OHM SIGN +2127;AL # So INVERTED OHM SIGN +2128;AL # Lu BLACK-LETTER CAPITAL Z +2129;AL # So TURNED GREEK SMALL LETTER IOTA +212A;AL # Lu KELVIN SIGN +212B;AI # Lu ANGSTROM SIGN +212C..212D;AL # Lu [2] SCRIPT CAPITAL B..BLACK-LETTER CAPITAL C +212E;AL # So ESTIMATED SYMBOL +212F..2134;AL # L& [6] SCRIPT SMALL E..SCRIPT SMALL O +2135..2138;AL # Lo [4] ALEF SYMBOL..DALET SYMBOL +2139;AL # Ll INFORMATION SOURCE +213A..213B;AL # So [2] ROTATED CAPITAL Q..FACSIMILE SIGN +213C..213F;AL # L& [4] DOUBLE-STRUCK SMALL PI..DOUBLE-STRUCK CAPITAL PI +2140..2144;AL # Sm [5] DOUBLE-STRUCK N-ARY SUMMATION..TURNED SANS-SERIF CAPITAL Y +2145..2149;AL # L& [5] DOUBLE-STRUCK ITALIC CAPITAL D..DOUBLE-STRUCK ITALIC SMALL J +214A;AL # So PROPERTY LINE +214B;AL # Sm TURNED AMPERSAND +214C..214D;AL # So [2] PER SIGN..AKTIESELSKAB +214E;AL # Ll TURNED SMALL F +214F;AL # So SYMBOL FOR SAMARITAN SOURCE +2150..2153;AL # No [4] VULGAR FRACTION ONE SEVENTH..VULGAR FRACTION ONE THIRD +2154..2155;AI # No [2] VULGAR FRACTION TWO THIRDS..VULGAR FRACTION ONE FIFTH +2156..215A;AL # No [5] VULGAR FRACTION TWO FIFTHS..VULGAR FRACTION FIVE SIXTHS +215B;AI # No VULGAR FRACTION ONE EIGHTH +215C..215D;AL # No [2] VULGAR FRACTION THREE EIGHTHS..VULGAR FRACTION FIVE EIGHTHS +215E;AI # No VULGAR FRACTION SEVEN EIGHTHS +215F;AL # No FRACTION NUMERATOR ONE +2160..216B;AI # Nl [12] ROMAN NUMERAL ONE..ROMAN NUMERAL TWELVE +216C..216F;AL # Nl [4] ROMAN NUMERAL FIFTY..ROMAN NUMERAL ONE THOUSAND +2170..2179;AI # Nl [10] SMALL ROMAN NUMERAL ONE..SMALL ROMAN NUMERAL TEN +217A..2182;AL # Nl [9] SMALL ROMAN NUMERAL ELEVEN..ROMAN NUMERAL TEN THOUSAND +2183..2184;AL # L& [2] ROMAN NUMERAL REVERSED ONE HUNDRED..LATIN SMALL LETTER REVERSED C +2185..2188;AL # Nl [4] ROMAN NUMERAL SIX LATE FORM..ROMAN NUMERAL ONE HUNDRED THOUSAND +2189;AI # No VULGAR FRACTION ZERO THIRDS +218A..218B;AL # So [2] TURNED DIGIT TWO..TURNED DIGIT THREE +2190..2194;AI # Sm [5] LEFTWARDS ARROW..LEFT RIGHT ARROW +2195..2199;AI # So [5] UP DOWN ARROW..SOUTH WEST ARROW +219A..219B;AL # Sm [2] LEFTWARDS ARROW WITH STROKE..RIGHTWARDS ARROW WITH STROKE +219C..219F;AL # So [4] LEFTWARDS WAVE ARROW..UPWARDS TWO HEADED ARROW +21A0;AL # Sm RIGHTWARDS TWO HEADED ARROW +21A1..21A2;AL # So [2] DOWNWARDS TWO HEADED ARROW..LEFTWARDS ARROW WITH TAIL +21A3;AL # Sm RIGHTWARDS ARROW WITH TAIL +21A4..21A5;AL # So [2] LEFTWARDS ARROW FROM BAR..UPWARDS ARROW FROM BAR +21A6;AL # Sm RIGHTWARDS ARROW FROM BAR +21A7..21AD;AL # So [7] DOWNWARDS ARROW FROM BAR..LEFT RIGHT WAVE ARROW +21AE;AL # Sm LEFT RIGHT ARROW WITH STROKE +21AF..21CD;AL # So [31] DOWNWARDS ZIGZAG ARROW..LEFTWARDS DOUBLE ARROW WITH STROKE +21CE..21CF;AL # Sm [2] LEFT RIGHT DOUBLE ARROW WITH STROKE..RIGHTWARDS DOUBLE ARROW WITH STROKE +21D0..21D1;AL # So [2] LEFTWARDS DOUBLE ARROW..UPWARDS DOUBLE ARROW +21D2;AI # Sm RIGHTWARDS DOUBLE ARROW +21D3;AL # So DOWNWARDS DOUBLE ARROW +21D4;AI # Sm LEFT RIGHT DOUBLE ARROW +21D5..21F3;AL # So [31] UP DOWN DOUBLE ARROW..UP DOWN WHITE ARROW +21F4..21FF;AL # Sm [12] RIGHT ARROW WITH SMALL CIRCLE..LEFT RIGHT OPEN-HEADED ARROW +2200;AI # Sm FOR ALL +2201;AL # Sm COMPLEMENT +2202..2203;AI # Sm [2] PARTIAL DIFFERENTIAL..THERE EXISTS +2204..2206;AL # Sm [3] THERE DOES NOT EXIST..INCREMENT +2207..2208;AI # Sm [2] NABLA..ELEMENT OF +2209..220A;AL # Sm [2] NOT AN ELEMENT OF..SMALL ELEMENT OF +220B;AI # Sm CONTAINS AS MEMBER +220C..220E;AL # Sm [3] DOES NOT CONTAIN AS MEMBER..END OF PROOF +220F;AI # Sm N-ARY PRODUCT +2210;AL # Sm N-ARY COPRODUCT +2211;AI # Sm N-ARY SUMMATION +2212..2213;PR # Sm [2] MINUS SIGN..MINUS-OR-PLUS SIGN +2214;AL # Sm DOT PLUS +2215;AI # Sm DIVISION SLASH +2216..2219;AL # Sm [4] SET MINUS..BULLET OPERATOR +221A;AI # Sm SQUARE ROOT +221B..221C;AL # Sm [2] CUBE ROOT..FOURTH ROOT +221D..2220;AI # Sm [4] PROPORTIONAL TO..ANGLE +2221..2222;AL # Sm [2] MEASURED ANGLE..SPHERICAL ANGLE +2223;AI # Sm DIVIDES +2224;AL # Sm DOES NOT DIVIDE +2225;AI # Sm PARALLEL TO +2226;AL # Sm NOT PARALLEL TO +2227..222C;AI # Sm [6] LOGICAL AND..DOUBLE INTEGRAL +222D;AL # Sm TRIPLE INTEGRAL +222E;AI # Sm CONTOUR INTEGRAL +222F..2233;AL # Sm [5] SURFACE INTEGRAL..ANTICLOCKWISE CONTOUR INTEGRAL +2234..2237;AI # Sm [4] THEREFORE..PROPORTION +2238..223B;AL # Sm [4] DOT MINUS..HOMOTHETIC +223C..223D;AI # Sm [2] TILDE OPERATOR..REVERSED TILDE +223E..2247;AL # Sm [10] INVERTED LAZY S..NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO +2248;AI # Sm ALMOST EQUAL TO +2249..224B;AL # Sm [3] NOT ALMOST EQUAL TO..TRIPLE TILDE +224C;AI # Sm ALL EQUAL TO +224D..2251;AL # Sm [5] EQUIVALENT TO..GEOMETRICALLY EQUAL TO +2252;AI # Sm APPROXIMATELY EQUAL TO OR THE IMAGE OF +2253..225F;AL # Sm [13] IMAGE OF OR APPROXIMATELY EQUAL TO..QUESTIONED EQUAL TO +2260..2261;AI # Sm [2] NOT EQUAL TO..IDENTICAL TO +2262..2263;AL # Sm [2] NOT IDENTICAL TO..STRICTLY EQUIVALENT TO +2264..2267;AI # Sm [4] LESS-THAN OR EQUAL TO..GREATER-THAN OVER EQUAL TO +2268..2269;AL # Sm [2] LESS-THAN BUT NOT EQUAL TO..GREATER-THAN BUT NOT EQUAL TO +226A..226B;AI # Sm [2] MUCH LESS-THAN..MUCH GREATER-THAN +226C..226D;AL # Sm [2] BETWEEN..NOT EQUIVALENT TO +226E..226F;AI # Sm [2] NOT LESS-THAN..NOT GREATER-THAN +2270..2281;AL # Sm [18] NEITHER LESS-THAN NOR EQUAL TO..DOES NOT SUCCEED +2282..2283;AI # Sm [2] SUBSET OF..SUPERSET OF +2284..2285;AL # Sm [2] NOT A SUBSET OF..NOT A SUPERSET OF +2286..2287;AI # Sm [2] SUBSET OF OR EQUAL TO..SUPERSET OF OR EQUAL TO +2288..2294;AL # Sm [13] NEITHER A SUBSET OF NOR EQUAL TO..SQUARE CUP +2295;AI # Sm CIRCLED PLUS +2296..2298;AL # Sm [3] CIRCLED MINUS..CIRCLED DIVISION SLASH +2299;AI # Sm CIRCLED DOT OPERATOR +229A..22A4;AL # Sm [11] CIRCLED RING OPERATOR..DOWN TACK +22A5;AI # Sm UP TACK +22A6..22BE;AL # Sm [25] ASSERTION..RIGHT ANGLE WITH ARC +22BF;AI # Sm RIGHT TRIANGLE +22C0..22EE;AL # Sm [47] N-ARY LOGICAL AND..VERTICAL ELLIPSIS +22EF;IN # Sm MIDLINE HORIZONTAL ELLIPSIS +22F0..22FF;AL # Sm [16] UP RIGHT DIAGONAL ELLIPSIS..Z NOTATION BAG MEMBERSHIP +2300..2307;AL # So [8] DIAMETER SIGN..WAVY LINE +2308;OP # Ps LEFT CEILING +2309;CL # Pe RIGHT CEILING +230A;OP # Ps LEFT FLOOR +230B;CL # Pe RIGHT FLOOR +230C..2311;AL # So [6] BOTTOM RIGHT CROP..SQUARE LOZENGE +2312;AI # So ARC +2313..2319;AL # So [7] SEGMENT..TURNED NOT SIGN +231A..231B;ID # So [2] WATCH..HOURGLASS +231C..231F;AL # So [4] TOP LEFT CORNER..BOTTOM RIGHT CORNER +2320..2321;AL # Sm [2] TOP HALF INTEGRAL..BOTTOM HALF INTEGRAL +2322..2328;AL # So [7] FROWN..KEYBOARD +2329;OP # Ps LEFT-POINTING ANGLE BRACKET +232A;CL # Pe RIGHT-POINTING ANGLE BRACKET +232B..237B;AL # So [81] ERASE TO THE LEFT..NOT CHECK MARK +237C;AL # Sm RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW +237D..239A;AL # So [30] SHOULDERED OPEN BOX..CLEAR SCREEN SYMBOL +239B..23B3;AL # Sm [25] LEFT PARENTHESIS UPPER HOOK..SUMMATION BOTTOM +23B4..23DB;AL # So [40] TOP SQUARE BRACKET..FUSE +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..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 +249C..24E9;AI # So [78] PARENTHESIZED LATIN SMALL LETTER A..CIRCLED LATIN SMALL LETTER Z +24EA..24FE;AI # No [21] CIRCLED DIGIT ZERO..DOUBLE CIRCLED NUMBER TEN +24FF;AL # No NEGATIVE CIRCLED DIGIT ZERO +2500..254B;AI # So [76] BOX DRAWINGS LIGHT HORIZONTAL..BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL +254C..254F;AL # So [4] BOX DRAWINGS LIGHT DOUBLE DASH HORIZONTAL..BOX DRAWINGS HEAVY DOUBLE DASH VERTICAL +2550..2574;AI # So [37] BOX DRAWINGS DOUBLE HORIZONTAL..BOX DRAWINGS LIGHT LEFT +2575..257F;AL # So [11] BOX DRAWINGS LIGHT UP..BOX DRAWINGS HEAVY UP AND LIGHT DOWN +2580..258F;AI # So [16] UPPER HALF BLOCK..LEFT ONE EIGHTH BLOCK +2590..2591;AL # So [2] RIGHT HALF BLOCK..LIGHT SHADE +2592..2595;AI # So [4] MEDIUM SHADE..RIGHT ONE EIGHTH BLOCK +2596..259F;AL # So [10] QUADRANT LOWER LEFT..QUADRANT UPPER RIGHT AND LOWER LEFT AND LOWER RIGHT +25A0..25A1;AI # So [2] BLACK SQUARE..WHITE SQUARE +25A2;AL # So WHITE SQUARE WITH ROUNDED CORNERS +25A3..25A9;AI # So [7] WHITE SQUARE CONTAINING BLACK SMALL SQUARE..SQUARE WITH DIAGONAL CROSSHATCH FILL +25AA..25B1;AL # So [8] BLACK SMALL SQUARE..WHITE PARALLELOGRAM +25B2..25B3;AI # So [2] BLACK UP-POINTING TRIANGLE..WHITE UP-POINTING TRIANGLE +25B4..25B5;AL # So [2] BLACK UP-POINTING SMALL TRIANGLE..WHITE UP-POINTING SMALL TRIANGLE +25B6;AI # So BLACK RIGHT-POINTING TRIANGLE +25B7;AI # Sm WHITE RIGHT-POINTING TRIANGLE +25B8..25BB;AL # So [4] BLACK RIGHT-POINTING SMALL TRIANGLE..WHITE RIGHT-POINTING POINTER +25BC..25BD;AI # So [2] BLACK DOWN-POINTING TRIANGLE..WHITE DOWN-POINTING TRIANGLE +25BE..25BF;AL # So [2] BLACK DOWN-POINTING SMALL TRIANGLE..WHITE DOWN-POINTING SMALL TRIANGLE +25C0;AI # So BLACK LEFT-POINTING TRIANGLE +25C1;AI # Sm WHITE LEFT-POINTING TRIANGLE +25C2..25C5;AL # So [4] BLACK LEFT-POINTING SMALL TRIANGLE..WHITE LEFT-POINTING POINTER +25C6..25C8;AI # So [3] BLACK DIAMOND..WHITE DIAMOND CONTAINING BLACK SMALL DIAMOND +25C9..25CA;AL # So [2] FISHEYE..LOZENGE +25CB;AI # So WHITE CIRCLE +25CC..25CD;AL # So [2] DOTTED CIRCLE..CIRCLE WITH VERTICAL FILL +25CE..25D1;AI # So [4] BULLSEYE..CIRCLE WITH RIGHT HALF BLACK +25D2..25E1;AL # So [16] CIRCLE WITH LOWER HALF BLACK..LOWER HALF CIRCLE +25E2..25E5;AI # So [4] BLACK LOWER RIGHT TRIANGLE..BLACK UPPER RIGHT TRIANGLE +25E6..25EE;AL # So [9] WHITE BULLET..UP-POINTING TRIANGLE WITH RIGHT HALF BLACK +25EF;AI # So LARGE CIRCLE +25F0..25F7;AL # So [8] WHITE SQUARE WITH UPPER LEFT QUADRANT..WHITE CIRCLE WITH UPPER RIGHT QUADRANT +25F8..25FF;AL # Sm [8] UPPER LEFT TRIANGLE..LOWER RIGHT TRIANGLE +2600..2603;ID # So [4] BLACK SUN WITH RAYS..SNOWMAN +2604;AL # So COMET +2605..2606;AI # So [2] BLACK STAR..WHITE STAR +2607..2608;AL # So [2] LIGHTNING..THUNDERSTORM +2609;AI # So SUN +260A..260D;AL # So [4] ASCENDING NODE..OPPOSITION +260E..260F;AI # So [2] BLACK TELEPHONE..WHITE TELEPHONE +2610..2613;AL # So [4] BALLOT BOX..SALTIRE +2614..2615;ID # So [2] UMBRELLA WITH RAIN DROPS..HOT BEVERAGE +2616..2617;AI # So [2] WHITE SHOGI PIECE..BLACK SHOGI PIECE +2618;ID # So SHAMROCK +2619;AL # So REVERSED ROTATED FLORAL HEART BULLET +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 +2640;AI # So FEMALE SIGN +2641;AL # So EARTH +2642;AI # So MALE SIGN +2643..265F;AL # So [29] JUPITER..BLACK CHESS PAWN +2660..2661;AI # So [2] BLACK SPADE SUIT..WHITE HEART SUIT +2662;AL # So WHITE DIAMOND SUIT +2663..2665;AI # So [3] BLACK CLUB SUIT..BLACK HEART SUIT +2666;AL # So BLACK DIAMOND SUIT +2667;AI # So WHITE CLUB SUIT +2668;ID # So HOT SPRINGS +2669..266A;AI # So [2] QUARTER NOTE..EIGHTH NOTE +266B;AL # So BEAMED EIGHTH NOTES +266C..266D;AI # So [2] BEAMED SIXTEENTH NOTES..MUSIC FLAT SIGN +266E;AL # So MUSIC NATURAL SIGN +266F;AI # Sm MUSIC SHARP SIGN +2670..267E;AL # So [15] WEST SYRIAC CROSS..PERMANENT PAPER SIGN +267F;ID # So WHEELCHAIR SYMBOL +2680..269D;AL # So [30] DIE FACE-1..OUTLINED WHITE STAR +269E..269F;AI # So [2] THREE LINES CONVERGING RIGHT..THREE LINES CONVERGING LEFT +26A0..26BC;AL # So [29] WARNING SIGN..SESQUIQUADRATE +26BD..26C8;ID # So [12] SOCCER BALL..THUNDER CLOUD AND RAIN +26C9..26CC;AI # So [4] TURNED WHITE SHOGI PIECE..CROSSING LANES +26CD;ID # So DISABLED CAR +26CE;AL # So OPHIUCHUS +26CF..26D1;ID # So [3] PICK..HELMET WITH WHITE CROSS +26D2;AI # So CIRCLED CROSSING LANES +26D3..26D4;ID # So [2] CHAINS..NO ENTRY +26D5..26D7;AI # So [3] ALTERNATE ONE-WAY LEFT WAY TRAFFIC..WHITE TWO-WAY LEFT WAY TRAFFIC +26D8..26D9;ID # So [2] BLACK LEFT LANE MERGE..WHITE LEFT LANE MERGE +26DA..26DB;AI # So [2] DRIVE SLOW SIGN..HEAVY WHITE DOWN-POINTING TRIANGLE +26DC;ID # So LEFT CLOSED ENTRY +26DD..26DE;AI # So [2] SQUARED SALTIRE..FALLING DIAGONAL IN WHITE CIRCLE IN BLACK SQUARE +26DF..26E1;ID # So [3] BLACK TRUCK..RESTRICTED LEFT ENTRY-2 +26E2;AL # So ASTRONOMICAL SYMBOL FOR URANUS +26E3;AI # So HEAVY CIRCLE WITH STROKE AND TWO DOTS ABOVE +26E4..26E7;AL # So [4] PENTAGRAM..INVERTED PENTAGRAM +26E8..26E9;AI # So [2] BLACK CROSS ON SHIELD..SHINTO SHRINE +26EA;ID # So CHURCH +26EB..26F0;AI # So [6] CASTLE..MOUNTAIN +26F1..26F5;ID # So [5] UMBRELLA ON GROUND..SAILBOAT +26F6;AI # So SQUARE FOUR CORNERS +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..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;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 +276B;CL # Pe MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT +276C;OP # Ps MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT +276D;CL # Pe MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT +276E;OP # Ps HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT +276F;CL # Pe HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT +2770;OP # Ps HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT +2771;CL # Pe HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT +2772;OP # Ps LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT +2773;CL # Pe LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT +2774;OP # Ps MEDIUM LEFT CURLY BRACKET ORNAMENT +2775;CL # Pe MEDIUM RIGHT CURLY BRACKET ORNAMENT +2776..2793;AI # No [30] DINGBAT NEGATIVE CIRCLED DIGIT ONE..DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN +2794..27BF;AL # So [44] HEAVY WIDE-HEADED RIGHTWARDS ARROW..DOUBLE CURLY LOOP +27C0..27C4;AL # Sm [5] THREE DIMENSIONAL ANGLE..OPEN SUPERSET +27C5;OP # Ps LEFT S-SHAPED BAG DELIMITER +27C6;CL # Pe RIGHT S-SHAPED BAG DELIMITER +27C7..27E5;AL # Sm [31] OR WITH DOT INSIDE..WHITE SQUARE WITH RIGHTWARDS TICK +27E6;OP # Ps MATHEMATICAL LEFT WHITE SQUARE BRACKET +27E7;CL # Pe MATHEMATICAL RIGHT WHITE SQUARE BRACKET +27E8;OP # Ps MATHEMATICAL LEFT ANGLE BRACKET +27E9;CL # Pe MATHEMATICAL RIGHT ANGLE BRACKET +27EA;OP # Ps MATHEMATICAL LEFT DOUBLE ANGLE BRACKET +27EB;CL # Pe MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET +27EC;OP # Ps MATHEMATICAL LEFT WHITE TORTOISE SHELL BRACKET +27ED;CL # Pe MATHEMATICAL RIGHT WHITE TORTOISE SHELL BRACKET +27EE;OP # Ps MATHEMATICAL LEFT FLATTENED PARENTHESIS +27EF;CL # Pe MATHEMATICAL RIGHT FLATTENED PARENTHESIS +27F0..27FF;AL # Sm [16] UPWARDS QUADRUPLE ARROW..LONG RIGHTWARDS SQUIGGLE ARROW +2800..28FF;AL # So [256] BRAILLE PATTERN BLANK..BRAILLE PATTERN DOTS-12345678 +2900..297F;AL # Sm [128] RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE..DOWN FISH TAIL +2980..2982;AL # Sm [3] TRIPLE VERTICAL BAR DELIMITER..Z NOTATION TYPE COLON +2983;OP # Ps LEFT WHITE CURLY BRACKET +2984;CL # Pe RIGHT WHITE CURLY BRACKET +2985;OP # Ps LEFT WHITE PARENTHESIS +2986;CL # Pe RIGHT WHITE PARENTHESIS +2987;OP # Ps Z NOTATION LEFT IMAGE BRACKET +2988;CL # Pe Z NOTATION RIGHT IMAGE BRACKET +2989;OP # Ps Z NOTATION LEFT BINDING BRACKET +298A;CL # Pe Z NOTATION RIGHT BINDING BRACKET +298B;OP # Ps LEFT SQUARE BRACKET WITH UNDERBAR +298C;CL # Pe RIGHT SQUARE BRACKET WITH UNDERBAR +298D;OP # Ps LEFT SQUARE BRACKET WITH TICK IN TOP CORNER +298E;CL # Pe RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER +298F;OP # Ps LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER +2990;CL # Pe RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER +2991;OP # Ps LEFT ANGLE BRACKET WITH DOT +2992;CL # Pe RIGHT ANGLE BRACKET WITH DOT +2993;OP # Ps LEFT ARC LESS-THAN BRACKET +2994;CL # Pe RIGHT ARC GREATER-THAN BRACKET +2995;OP # Ps DOUBLE LEFT ARC GREATER-THAN BRACKET +2996;CL # Pe DOUBLE RIGHT ARC LESS-THAN BRACKET +2997;OP # Ps LEFT BLACK TORTOISE SHELL BRACKET +2998;CL # Pe RIGHT BLACK TORTOISE SHELL BRACKET +2999..29D7;AL # Sm [63] DOTTED FENCE..BLACK HOURGLASS +29D8;OP # Ps LEFT WIGGLY FENCE +29D9;CL # Pe RIGHT WIGGLY FENCE +29DA;OP # Ps LEFT DOUBLE WIGGLY FENCE +29DB;CL # Pe RIGHT DOUBLE WIGGLY FENCE +29DC..29FB;AL # Sm [32] INCOMPLETE INFINITY..TRIPLE PLUS +29FC;OP # Ps LEFT-POINTING CURVED ANGLE BRACKET +29FD;CL # Pe RIGHT-POINTING CURVED ANGLE BRACKET +29FE..29FF;AL # Sm [2] TINY..MINY +2A00..2AFF;AL # Sm [256] N-ARY CIRCLED DOT OPERATOR..N-ARY WHITE VERTICAL BAR +2B00..2B2F;AL # So [48] NORTH EAST WHITE ARROW..WHITE VERTICAL ELLIPSE +2B30..2B44;AL # Sm [21] LEFT ARROW WITH SMALL CIRCLE..RIGHTWARDS ARROW THROUGH SUPERSET +2B45..2B46;AL # So [2] LEFTWARDS QUADRUPLE ARROW..RIGHTWARDS QUADRUPLE ARROW +2B47..2B4C;AL # Sm [6] REVERSE TILDE OPERATOR ABOVE RIGHTWARDS ARROW..RIGHTWARDS ARROW ABOVE REVERSE TILDE OPERATOR +2B4D..2B54;AL # So [8] DOWNWARDS TRIANGLE-HEADED ZIGZAG ARROW..WHITE RIGHT-POINTING PENTAGON +2B55..2B59;AI # So [5] HEAVY LARGE CIRCLE..HEAVY CIRCLED SALTIRE +2B5A..2B73;AL # So [26] SLANTED NORTH ARROW WITH HOOKED HEAD..DOWNWARDS TRIANGLE-HEADED ARROW TO BAR +2B76..2B95;AL # So [32] NORTH WEST TRIANGLE-HEADED ARROW TO BAR..RIGHTWARDS BLACK ARROW +2B98..2BC8;AL # So [49] THREE-D TOP-LIGHTED LEFTWARDS EQUILATERAL ARROWHEAD..BLACK MEDIUM RIGHT-POINTING TRIANGLE CENTRED +2BCA..2BFE;AL # So [53] TOP HALF BLACK CIRCLE..REVERSED RIGHT ANGLE +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 +2C60..2C7B;AL # L& [28] LATIN CAPITAL LETTER L WITH DOUBLE BAR..LATIN LETTER SMALL CAPITAL TURNED E +2C7C..2C7D;AL # Lm [2] LATIN SUBSCRIPT SMALL LETTER J..MODIFIER LETTER CAPITAL V +2C7E..2C7F;AL # Lu [2] LATIN CAPITAL LETTER S WITH SWASH TAIL..LATIN CAPITAL LETTER Z WITH SWASH TAIL +2C80..2CE4;AL # L& [101] COPTIC CAPITAL LETTER ALFA..COPTIC SYMBOL KAI +2CE5..2CEA;AL # So [6] COPTIC SYMBOL MI RO..COPTIC SYMBOL SHIMA SIMA +2CEB..2CEE;AL # L& [4] COPTIC CAPITAL LETTER CRYPTOGRAMMIC SHEI..COPTIC SMALL LETTER CRYPTOGRAMMIC GANGIA +2CEF..2CF1;CM # Mn [3] COPTIC COMBINING NI ABOVE..COPTIC COMBINING SPIRITUS LENIS +2CF2..2CF3;AL # L& [2] COPTIC CAPITAL LETTER BOHAIRIC KHEI..COPTIC SMALL LETTER BOHAIRIC KHEI +2CF9;EX # Po COPTIC OLD NUBIAN FULL STOP +2CFA..2CFC;BA # Po [3] COPTIC OLD NUBIAN DIRECT QUESTION MARK..COPTIC OLD NUBIAN VERSE DIVIDER +2CFD;AL # No COPTIC FRACTION ONE HALF +2CFE;EX # Po COPTIC FULL STOP +2CFF;BA # Po COPTIC MORPHOLOGICAL DIVIDER +2D00..2D25;AL # Ll [38] GEORGIAN SMALL LETTER AN..GEORGIAN SMALL LETTER HOE +2D27;AL # Ll GEORGIAN SMALL LETTER YN +2D2D;AL # Ll GEORGIAN SMALL LETTER AEN +2D30..2D67;AL # Lo [56] TIFINAGH LETTER YA..TIFINAGH LETTER YO +2D6F;AL # Lm TIFINAGH MODIFIER LETTER LABIALIZATION MARK +2D70;BA # Po TIFINAGH SEPARATOR MARK +2D7F;CM # Mn TIFINAGH CONSONANT JOINER +2D80..2D96;AL # Lo [23] ETHIOPIC SYLLABLE LOA..ETHIOPIC SYLLABLE GGWE +2DA0..2DA6;AL # Lo [7] ETHIOPIC SYLLABLE SSA..ETHIOPIC SYLLABLE SSO +2DA8..2DAE;AL # Lo [7] ETHIOPIC SYLLABLE CCA..ETHIOPIC SYLLABLE CCO +2DB0..2DB6;AL # Lo [7] ETHIOPIC SYLLABLE ZZA..ETHIOPIC SYLLABLE ZZO +2DB8..2DBE;AL # Lo [7] ETHIOPIC SYLLABLE CCHA..ETHIOPIC SYLLABLE CCHO +2DC0..2DC6;AL # Lo [7] ETHIOPIC SYLLABLE QYA..ETHIOPIC SYLLABLE QYO +2DC8..2DCE;AL # Lo [7] ETHIOPIC SYLLABLE KYA..ETHIOPIC SYLLABLE KYO +2DD0..2DD6;AL # Lo [7] ETHIOPIC SYLLABLE XYA..ETHIOPIC SYLLABLE XYO +2DD8..2DDE;AL # Lo [7] ETHIOPIC SYLLABLE GYA..ETHIOPIC SYLLABLE GYO +2DE0..2DFF;CM # Mn [32] COMBINING CYRILLIC LETTER BE..COMBINING CYRILLIC LETTER IOTIFIED BIG YUS +2E00..2E01;QU # Po [2] RIGHT ANGLE SUBSTITUTION MARKER..RIGHT ANGLE DOTTED SUBSTITUTION MARKER +2E02;QU # Pi LEFT SUBSTITUTION BRACKET +2E03;QU # Pf RIGHT SUBSTITUTION BRACKET +2E04;QU # Pi LEFT DOTTED SUBSTITUTION BRACKET +2E05;QU # Pf RIGHT DOTTED SUBSTITUTION BRACKET +2E06..2E08;QU # Po [3] RAISED INTERPOLATION MARKER..DOTTED TRANSPOSITION MARKER +2E09;QU # Pi LEFT TRANSPOSITION BRACKET +2E0A;QU # Pf RIGHT TRANSPOSITION BRACKET +2E0B;QU # Po RAISED SQUARE +2E0C;QU # Pi LEFT RAISED OMISSION BRACKET +2E0D;QU # Pf RIGHT RAISED OMISSION BRACKET +2E0E..2E15;BA # Po [8] EDITORIAL CORONIS..UPWARDS ANCORA +2E16;AL # Po DOTTED RIGHT-POINTING ANGLE +2E17;BA # Pd DOUBLE OBLIQUE HYPHEN +2E18;OP # Po INVERTED INTERROBANG +2E19;BA # Po PALM BRANCH +2E1A;AL # Pd HYPHEN WITH DIAERESIS +2E1B;AL # Po TILDE WITH RING ABOVE +2E1C;QU # Pi LEFT LOW PARAPHRASE BRACKET +2E1D;QU # Pf RIGHT LOW PARAPHRASE BRACKET +2E1E..2E1F;AL # Po [2] TILDE WITH DOT ABOVE..TILDE WITH DOT BELOW +2E20;QU # Pi LEFT VERTICAL BAR WITH QUILL +2E21;QU # Pf RIGHT VERTICAL BAR WITH QUILL +2E22;OP # Ps TOP LEFT HALF BRACKET +2E23;CL # Pe TOP RIGHT HALF BRACKET +2E24;OP # Ps BOTTOM LEFT HALF BRACKET +2E25;CL # Pe BOTTOM RIGHT HALF BRACKET +2E26;OP # Ps LEFT SIDEWAYS U BRACKET +2E27;CL # Pe RIGHT SIDEWAYS U BRACKET +2E28;OP # Ps LEFT DOUBLE PARENTHESIS +2E29;CL # Pe RIGHT DOUBLE PARENTHESIS +2E2A..2E2D;BA # Po [4] TWO DOTS OVER ONE DOT PUNCTUATION..FIVE DOT MARK +2E2E;EX # Po REVERSED QUESTION MARK +2E2F;AL # Lm VERTICAL TILDE +2E30..2E31;BA # Po [2] RING POINT..WORD SEPARATOR MIDDLE DOT +2E32;AL # Po TURNED COMMA +2E33..2E34;BA # Po [2] RAISED DOT..RAISED COMMA +2E35..2E39;AL # Po [5] TURNED SEMICOLON..TOP HALF SECTION SIGN +2E3A..2E3B;B2 # Pd [2] TWO-EM DASH..THREE-EM DASH +2E3C..2E3E;BA # Po [3] STENOGRAPHIC FULL STOP..WIGGLY VERTICAL LINE +2E3F;AL # Po CAPITULUM +2E40;BA # Pd DOUBLE HYPHEN +2E41;BA # Po REVERSED COMMA +2E42;OP # Ps DOUBLE LOW-REVERSED-9 QUOTATION MARK +2E43..2E4A;BA # Po [8] DASH WITH LEFT UPTURN..DOTTED SOLIDUS +2E4B;AL # Po TRIPLE DAGGER +2E4C;BA # Po MEDIEVAL COMMA +2E4D;AL # Po PARAGRAPHUS MARK +2E4E;BA # Po PUNCTUS ELEVATUS 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 +2FF0..2FFB;ID # So [12] IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT..IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID +3000;BA # Zs IDEOGRAPHIC SPACE +3001..3002;CL # Po [2] IDEOGRAPHIC COMMA..IDEOGRAPHIC FULL STOP +3003;ID # Po DITTO MARK +3004;ID # So JAPANESE INDUSTRIAL STANDARD SYMBOL +3005;NS # Lm IDEOGRAPHIC ITERATION MARK +3006;ID # Lo IDEOGRAPHIC CLOSING MARK +3007;ID # Nl IDEOGRAPHIC NUMBER ZERO +3008;OP # Ps LEFT ANGLE BRACKET +3009;CL # Pe RIGHT ANGLE BRACKET +300A;OP # Ps LEFT DOUBLE ANGLE BRACKET +300B;CL # Pe RIGHT DOUBLE ANGLE BRACKET +300C;OP # Ps LEFT CORNER BRACKET +300D;CL # Pe RIGHT CORNER BRACKET +300E;OP # Ps LEFT WHITE CORNER BRACKET +300F;CL # Pe RIGHT WHITE CORNER BRACKET +3010;OP # Ps LEFT BLACK LENTICULAR BRACKET +3011;CL # Pe RIGHT BLACK LENTICULAR BRACKET +3012..3013;ID # So [2] POSTAL MARK..GETA MARK +3014;OP # Ps LEFT TORTOISE SHELL BRACKET +3015;CL # Pe RIGHT TORTOISE SHELL BRACKET +3016;OP # Ps LEFT WHITE LENTICULAR BRACKET +3017;CL # Pe RIGHT WHITE LENTICULAR BRACKET +3018;OP # Ps LEFT WHITE TORTOISE SHELL BRACKET +3019;CL # Pe RIGHT WHITE TORTOISE SHELL BRACKET +301A;OP # Ps LEFT WHITE SQUARE BRACKET +301B;CL # Pe RIGHT WHITE SQUARE BRACKET +301C;NS # Pd WAVE DASH +301D;OP # Ps REVERSED DOUBLE PRIME QUOTATION MARK +301E..301F;CL # Pe [2] DOUBLE PRIME QUOTATION MARK..LOW DOUBLE PRIME QUOTATION MARK +3020;ID # So POSTAL MARK FACE +3021..3029;ID # Nl [9] HANGZHOU NUMERAL ONE..HANGZHOU NUMERAL NINE +302A..302D;CM # Mn [4] IDEOGRAPHIC LEVEL TONE MARK..IDEOGRAPHIC ENTERING TONE MARK +302E..302F;CM # Mc [2] HANGUL SINGLE DOT TONE MARK..HANGUL DOUBLE DOT TONE MARK +3030;ID # Pd WAVY DASH +3031..3034;ID # Lm [4] VERTICAL KANA REPEAT MARK..VERTICAL KANA REPEAT WITH VOICED SOUND MARK UPPER HALF +3035;CM # Lm VERTICAL KANA REPEAT MARK LOWER HALF +3036..3037;ID # So [2] CIRCLED POSTAL MARK..IDEOGRAPHIC TELEGRAPH LINE FEED SEPARATOR SYMBOL +3038..303A;ID # Nl [3] HANGZHOU NUMERAL TEN..HANGZHOU NUMERAL THIRTY +303B;NS # Lm VERTICAL IDEOGRAPHIC ITERATION MARK +303C;NS # Lo MASU MARK +303D;ID # Po PART ALTERNATION MARK +303E..303F;ID # So [2] IDEOGRAPHIC VARIATION INDICATOR..IDEOGRAPHIC HALF FILL SPACE +3041;CJ # Lo HIRAGANA LETTER SMALL A +3042;ID # Lo HIRAGANA LETTER A +3043;CJ # Lo HIRAGANA LETTER SMALL I +3044;ID # Lo HIRAGANA LETTER I +3045;CJ # Lo HIRAGANA LETTER SMALL U +3046;ID # Lo HIRAGANA LETTER U +3047;CJ # Lo HIRAGANA LETTER SMALL E +3048;ID # Lo HIRAGANA LETTER E +3049;CJ # Lo HIRAGANA LETTER SMALL O +304A..3062;ID # Lo [25] HIRAGANA LETTER O..HIRAGANA LETTER DI +3063;CJ # Lo HIRAGANA LETTER SMALL TU +3064..3082;ID # Lo [31] HIRAGANA LETTER TU..HIRAGANA LETTER MO +3083;CJ # Lo HIRAGANA LETTER SMALL YA +3084;ID # Lo HIRAGANA LETTER YA +3085;CJ # Lo HIRAGANA LETTER SMALL YU +3086;ID # Lo HIRAGANA LETTER YU +3087;CJ # Lo HIRAGANA LETTER SMALL YO +3088..308D;ID # Lo [6] HIRAGANA LETTER YO..HIRAGANA LETTER RO +308E;CJ # Lo HIRAGANA LETTER SMALL WA +308F..3094;ID # Lo [6] HIRAGANA LETTER WA..HIRAGANA LETTER VU +3095..3096;CJ # Lo [2] HIRAGANA LETTER SMALL KA..HIRAGANA LETTER SMALL KE +3099..309A;CM # Mn [2] COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK..COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK +309B..309C;NS # Sk [2] KATAKANA-HIRAGANA VOICED SOUND MARK..KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK +309D..309E;NS # Lm [2] HIRAGANA ITERATION MARK..HIRAGANA VOICED ITERATION MARK +309F;ID # Lo HIRAGANA DIGRAPH YORI +30A0;NS # Pd KATAKANA-HIRAGANA DOUBLE HYPHEN +30A1;CJ # Lo KATAKANA LETTER SMALL A +30A2;ID # Lo KATAKANA LETTER A +30A3;CJ # Lo KATAKANA LETTER SMALL I +30A4;ID # Lo KATAKANA LETTER I +30A5;CJ # Lo KATAKANA LETTER SMALL U +30A6;ID # Lo KATAKANA LETTER U +30A7;CJ # Lo KATAKANA LETTER SMALL E +30A8;ID # Lo KATAKANA LETTER E +30A9;CJ # Lo KATAKANA LETTER SMALL O +30AA..30C2;ID # Lo [25] KATAKANA LETTER O..KATAKANA LETTER DI +30C3;CJ # Lo KATAKANA LETTER SMALL TU +30C4..30E2;ID # Lo [31] KATAKANA LETTER TU..KATAKANA LETTER MO +30E3;CJ # Lo KATAKANA LETTER SMALL YA +30E4;ID # Lo KATAKANA LETTER YA +30E5;CJ # Lo KATAKANA LETTER SMALL YU +30E6;ID # Lo KATAKANA LETTER YU +30E7;CJ # Lo KATAKANA LETTER SMALL YO +30E8..30ED;ID # Lo [6] KATAKANA LETTER YO..KATAKANA LETTER RO +30EE;CJ # Lo KATAKANA LETTER SMALL WA +30EF..30F4;ID # Lo [6] KATAKANA LETTER WA..KATAKANA LETTER VU +30F5..30F6;CJ # Lo [2] KATAKANA LETTER SMALL KA..KATAKANA LETTER SMALL KE +30F7..30FA;ID # Lo [4] KATAKANA LETTER VA..KATAKANA LETTER VO +30FB;NS # Po KATAKANA MIDDLE DOT +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..312F;ID # Lo [43] BOPOMOFO LETTER B..BOPOMOFO LETTER NN +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 +3196..319F;ID # So [10] IDEOGRAPHIC ANNOTATION TOP MARK..IDEOGRAPHIC ANNOTATION MAN MARK +31A0..31BA;ID # Lo [27] BOPOMOFO LETTER BU..BOPOMOFO LETTER ZY +31C0..31E3;ID # So [36] CJK STROKE T..CJK STROKE Q +31F0..31FF;CJ # Lo [16] KATAKANA LETTER SMALL KU..KATAKANA LETTER SMALL RO +3200..321E;ID # So [31] PARENTHESIZED HANGUL KIYEOK..PARENTHESIZED KOREAN CHARACTER O HU +3220..3229;ID # No [10] PARENTHESIZED IDEOGRAPH ONE..PARENTHESIZED IDEOGRAPH TEN +322A..3247;ID # So [30] PARENTHESIZED IDEOGRAPH MOON..CIRCLED IDEOGRAPH KOTO +3248..324F;AI # No [8] CIRCLED NUMBER TEN ON BLACK SQUARE..CIRCLED NUMBER EIGHTY ON BLACK SQUARE +3250;ID # So PARTNERSHIP SIGN +3251..325F;ID # No [15] CIRCLED NUMBER TWENTY ONE..CIRCLED NUMBER THIRTY FIVE +3260..327F;ID # So [32] CIRCLED HANGUL KIYEOK..KOREAN STANDARD SYMBOL +3280..3289;ID # No [10] CIRCLED IDEOGRAPH ONE..CIRCLED IDEOGRAPH TEN +328A..32B0;ID # So [39] CIRCLED IDEOGRAPH MOON..CIRCLED IDEOGRAPH NIGHT +32B1..32BF;ID # No [15] CIRCLED NUMBER THIRTY SIX..CIRCLED NUMBER FIFTY +32C0..32FE;ID # So [63] IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY..CIRCLED KATAKANA WO +3300..33FF;ID # So [256] SQUARE APAATO..SQUARE GAL +3400..4DB5;ID # Lo [6582] CJK UNIFIED IDEOGRAPH-3400..CJK UNIFIED IDEOGRAPH-4DB5 +4DB6..4DBF;ID # Cn [10] .. +4DC0..4DFF;AL # So [64] HEXAGRAM FOR THE CREATIVE HEAVEN..HEXAGRAM FOR BEFORE COMPLETION +4E00..9FEF;ID # Lo [20976] CJK UNIFIED IDEOGRAPH-4E00..CJK UNIFIED IDEOGRAPH-9FEF +9FF0..9FFF;ID # Cn [16] .. +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 +A490..A4C6;ID # So [55] YI RADICAL QOT..YI RADICAL KE +A4D0..A4F7;AL # Lo [40] LISU LETTER BA..LISU LETTER OE +A4F8..A4FD;AL # Lm [6] LISU LETTER TONE MYA TI..LISU LETTER TONE MYA JEU +A4FE..A4FF;BA # Po [2] LISU PUNCTUATION COMMA..LISU PUNCTUATION FULL STOP +A500..A60B;AL # Lo [268] VAI SYLLABLE EE..VAI SYLLABLE NG +A60C;AL # Lm VAI SYLLABLE LENGTHENER +A60D;BA # Po VAI COMMA +A60E;EX # Po VAI FULL STOP +A60F;BA # Po VAI QUESTION MARK +A610..A61F;AL # Lo [16] VAI SYLLABLE NDOLE FA..VAI SYMBOL JONG +A620..A629;NU # Nd [10] VAI DIGIT ZERO..VAI DIGIT NINE +A62A..A62B;AL # Lo [2] VAI SYLLABLE NDOLE MA..VAI SYLLABLE NDOLE DO +A640..A66D;AL # L& [46] CYRILLIC CAPITAL LETTER ZEMLYA..CYRILLIC SMALL LETTER DOUBLE MONOCULAR O +A66E;AL # Lo CYRILLIC LETTER MULTIOCULAR O +A66F;CM # Mn COMBINING CYRILLIC VZMET +A670..A672;CM # Me [3] COMBINING CYRILLIC TEN MILLIONS SIGN..COMBINING CYRILLIC THOUSAND MILLIONS SIGN +A673;AL # Po SLAVONIC ASTERISK +A674..A67D;CM # Mn [10] COMBINING CYRILLIC LETTER UKRAINIAN IE..COMBINING CYRILLIC PAYEROK +A67E;AL # Po CYRILLIC KAVYKA +A67F;AL # Lm CYRILLIC PAYEROK +A680..A69B;AL # L& [28] CYRILLIC CAPITAL LETTER DWE..CYRILLIC SMALL LETTER CROSSED O +A69C..A69D;AL # Lm [2] MODIFIER LETTER CYRILLIC HARD SIGN..MODIFIER LETTER CYRILLIC SOFT SIGN +A69E..A69F;CM # Mn [2] COMBINING CYRILLIC LETTER EF..COMBINING CYRILLIC LETTER IOTIFIED E +A6A0..A6E5;AL # Lo [70] BAMUM LETTER A..BAMUM LETTER KI +A6E6..A6EF;AL # Nl [10] BAMUM LETTER MO..BAMUM LETTER KOGHOM +A6F0..A6F1;CM # Mn [2] BAMUM COMBINING MARK KOQNDON..BAMUM COMBINING MARK TUKWENTIS +A6F2;AL # Po BAMUM NJAEMLI +A6F3..A6F7;BA # Po [5] BAMUM FULL STOP..BAMUM QUESTION MARK +A700..A716;AL # Sk [23] MODIFIER LETTER CHINESE TONE YIN PING..MODIFIER LETTER EXTRA-LOW LEFT-STEM TONE BAR +A717..A71F;AL # Lm [9] MODIFIER LETTER DOT VERTICAL BAR..MODIFIER LETTER LOW INVERTED EXCLAMATION MARK +A720..A721;AL # Sk [2] MODIFIER LETTER STRESS AND HIGH TONE..MODIFIER LETTER STRESS AND LOW TONE +A722..A76F;AL # L& [78] LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF..LATIN SMALL LETTER CON +A770;AL # Lm MODIFIER LETTER US +A771..A787;AL # L& [23] LATIN SMALL LETTER DUM..LATIN SMALL LETTER INSULAR T +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..A7B9;AL # L& [42] LATIN CAPITAL LETTER N WITH DESCENDER..LATIN SMALL LETTER U WITH STROKE +A7F7;AL # Lo LATIN EPIGRAPHIC LETTER SIDEWAYS I +A7F8..A7F9;AL # Lm [2] MODIFIER LETTER CAPITAL H WITH STROKE..MODIFIER LETTER SMALL LIGATURE OE +A7FA;AL # Ll LATIN LETTER SMALL CAPITAL TURNED M +A7FB..A7FF;AL # Lo [5] LATIN EPIGRAPHIC LETTER REVERSED F..LATIN EPIGRAPHIC LETTER ARCHAIC M +A800..A801;AL # Lo [2] SYLOTI NAGRI LETTER A..SYLOTI NAGRI LETTER I +A802;CM # Mn SYLOTI NAGRI SIGN DVISVARA +A803..A805;AL # Lo [3] SYLOTI NAGRI LETTER U..SYLOTI NAGRI LETTER O +A806;CM # Mn SYLOTI NAGRI SIGN HASANTA +A807..A80A;AL # Lo [4] SYLOTI NAGRI LETTER KO..SYLOTI NAGRI LETTER GHO +A80B;CM # Mn SYLOTI NAGRI SIGN ANUSVARA +A80C..A822;AL # Lo [23] SYLOTI NAGRI LETTER CO..SYLOTI NAGRI LETTER HO +A823..A824;CM # Mc [2] SYLOTI NAGRI VOWEL SIGN A..SYLOTI NAGRI VOWEL SIGN I +A825..A826;CM # Mn [2] SYLOTI NAGRI VOWEL SIGN U..SYLOTI NAGRI VOWEL SIGN E +A827;CM # Mc SYLOTI NAGRI VOWEL SIGN OO +A828..A82B;AL # So [4] SYLOTI NAGRI POETRY MARK-1..SYLOTI NAGRI POETRY MARK-4 +A830..A835;AL # No [6] NORTH INDIC FRACTION ONE QUARTER..NORTH INDIC FRACTION THREE SIXTEENTHS +A836..A837;AL # So [2] NORTH INDIC QUARTER MARK..NORTH INDIC PLACEHOLDER MARK +A838;PO # Sc NORTH INDIC RUPEE MARK +A839;AL # So NORTH INDIC QUANTITY MARK +A840..A873;AL # Lo [52] PHAGS-PA LETTER KA..PHAGS-PA LETTER CANDRABINDU +A874..A875;BB # Po [2] PHAGS-PA SINGLE HEAD MARK..PHAGS-PA DOUBLE HEAD MARK +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..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 +A8F2..A8F7;AL # Lo [6] DEVANAGARI SIGN SPACING CANDRABINDU..DEVANAGARI SIGN CANDRABINDU AVAGRAHA +A8F8..A8FA;AL # Po [3] DEVANAGARI SIGN PUSHPIKA..DEVANAGARI CARET +A8FB;AL # Lo DEVANAGARI HEADSTROKE +A8FC;BB # Po DEVANAGARI SIGN SIDDHAM +A8FD..A8FE;AL # Lo [2] DEVANAGARI JAIN OM..DEVANAGARI LETTER AY +A8FF;CM # Mn DEVANAGARI VOWEL SIGN AY +A900..A909;NU # Nd [10] KAYAH LI DIGIT ZERO..KAYAH LI DIGIT NINE +A90A..A925;AL # Lo [28] KAYAH LI LETTER KA..KAYAH LI LETTER OO +A926..A92D;CM # Mn [8] KAYAH LI VOWEL UE..KAYAH LI TONE CALYA PLOPHU +A92E..A92F;BA # Po [2] KAYAH LI SIGN CWI..KAYAH LI SIGN SHYA +A930..A946;AL # Lo [23] REJANG LETTER KA..REJANG LETTER A +A947..A951;CM # Mn [11] REJANG VOWEL SIGN I..REJANG CONSONANT SIGN R +A952..A953;CM # Mc [2] REJANG CONSONANT SIGN H..REJANG VIRAMA +A95F;AL # Po REJANG SECTION MARK +A960..A97C;JL # Lo [29] HANGUL CHOSEONG TIKEUT-MIEUM..HANGUL CHOSEONG SSANGYEORINHIEUH +A980..A982;CM # Mn [3] JAVANESE SIGN PANYANGGA..JAVANESE SIGN LAYAR +A983;CM # Mc JAVANESE SIGN WIGNYAN +A984..A9B2;AL # Lo [47] JAVANESE LETTER A..JAVANESE LETTER HA +A9B3;CM # Mn JAVANESE SIGN CECAK TELU +A9B4..A9B5;CM # Mc [2] JAVANESE VOWEL SIGN TARUNG..JAVANESE VOWEL SIGN TOLONG +A9B6..A9B9;CM # Mn [4] JAVANESE VOWEL SIGN WULU..JAVANESE VOWEL SIGN SUKU MENDUT +A9BA..A9BB;CM # Mc [2] JAVANESE VOWEL SIGN TALING..JAVANESE VOWEL SIGN DIRGA MURE +A9BC;CM # Mn JAVANESE VOWEL SIGN PEPET +A9BD..A9C0;CM # Mc [4] JAVANESE CONSONANT SIGN KERET..JAVANESE PANGKON +A9C1..A9C6;AL # Po [6] JAVANESE LEFT RERENGGAN..JAVANESE PADA WINDU +A9C7..A9C9;BA # Po [3] JAVANESE PADA PANGKAT..JAVANESE PADA LUNGSI +A9CA..A9CD;AL # Po [4] JAVANESE PADA ADEG..JAVANESE TURNED PADA PISELEH +A9CF;AL # Lm JAVANESE PANGRANGKEP +A9D0..A9D9;NU # Nd [10] JAVANESE DIGIT ZERO..JAVANESE DIGIT NINE +A9DE..A9DF;AL # Po [2] JAVANESE PADA TIRTA TUMETES..JAVANESE PADA ISEN-ISEN +A9E0..A9E4;SA # Lo [5] MYANMAR LETTER SHAN GHA..MYANMAR LETTER SHAN BHA +A9E5;SA # Mn MYANMAR SIGN SHAN SAW +A9E6;SA # Lm MYANMAR MODIFIER LETTER SHAN REDUPLICATION +A9E7..A9EF;SA # Lo [9] MYANMAR LETTER TAI LAING NYA..MYANMAR LETTER TAI LAING NNA +A9F0..A9F9;NU # Nd [10] MYANMAR TAI LAING DIGIT ZERO..MYANMAR TAI LAING DIGIT NINE +A9FA..A9FE;SA # Lo [5] MYANMAR LETTER TAI LAING LLA..MYANMAR LETTER TAI LAING BHA +AA00..AA28;AL # Lo [41] CHAM LETTER A..CHAM LETTER HA +AA29..AA2E;CM # Mn [6] CHAM VOWEL SIGN AA..CHAM VOWEL SIGN OE +AA2F..AA30;CM # Mc [2] CHAM VOWEL SIGN O..CHAM VOWEL SIGN AI +AA31..AA32;CM # Mn [2] CHAM VOWEL SIGN AU..CHAM VOWEL SIGN UE +AA33..AA34;CM # Mc [2] CHAM CONSONANT SIGN YA..CHAM CONSONANT SIGN RA +AA35..AA36;CM # Mn [2] CHAM CONSONANT SIGN LA..CHAM CONSONANT SIGN WA +AA40..AA42;AL # Lo [3] CHAM LETTER FINAL K..CHAM LETTER FINAL NG +AA43;CM # Mn CHAM CONSONANT SIGN FINAL NG +AA44..AA4B;AL # Lo [8] CHAM LETTER FINAL CH..CHAM LETTER FINAL SS +AA4C;CM # Mn CHAM CONSONANT SIGN FINAL M +AA4D;CM # Mc CHAM CONSONANT SIGN FINAL H +AA50..AA59;NU # Nd [10] CHAM DIGIT ZERO..CHAM DIGIT NINE +AA5C;AL # Po CHAM PUNCTUATION SPIRAL +AA5D..AA5F;BA # Po [3] CHAM PUNCTUATION DANDA..CHAM PUNCTUATION TRIPLE DANDA +AA60..AA6F;SA # Lo [16] MYANMAR LETTER KHAMTI GA..MYANMAR LETTER KHAMTI FA +AA70;SA # Lm MYANMAR MODIFIER LETTER KHAMTI REDUPLICATION +AA71..AA76;SA # Lo [6] MYANMAR LETTER KHAMTI XA..MYANMAR LOGOGRAM KHAMTI HM +AA77..AA79;SA # So [3] MYANMAR SYMBOL AITON EXCLAMATION..MYANMAR SYMBOL AITON TWO +AA7A;SA # Lo MYANMAR LETTER AITON RA +AA7B;SA # Mc MYANMAR SIGN PAO KAREN TONE +AA7C;SA # Mn MYANMAR SIGN TAI LAING TONE-2 +AA7D;SA # Mc MYANMAR SIGN TAI LAING TONE-5 +AA7E..AA7F;SA # Lo [2] MYANMAR LETTER SHWE PALAUNG CHA..MYANMAR LETTER SHWE PALAUNG SHA +AA80..AAAF;SA # Lo [48] TAI VIET LETTER LOW KO..TAI VIET LETTER HIGH O +AAB0;SA # Mn TAI VIET MAI KANG +AAB1;SA # Lo TAI VIET VOWEL AA +AAB2..AAB4;SA # Mn [3] TAI VIET VOWEL I..TAI VIET VOWEL U +AAB5..AAB6;SA # Lo [2] TAI VIET VOWEL E..TAI VIET VOWEL O +AAB7..AAB8;SA # Mn [2] TAI VIET MAI KHIT..TAI VIET VOWEL IA +AAB9..AABD;SA # Lo [5] TAI VIET VOWEL UEA..TAI VIET VOWEL AN +AABE..AABF;SA # Mn [2] TAI VIET VOWEL AM..TAI VIET TONE MAI EK +AAC0;SA # Lo TAI VIET TONE MAI NUENG +AAC1;SA # Mn TAI VIET TONE MAI THO +AAC2;SA # Lo TAI VIET TONE MAI SONG +AADB..AADC;SA # Lo [2] TAI VIET SYMBOL KON..TAI VIET SYMBOL NUENG +AADD;SA # Lm TAI VIET SYMBOL SAM +AADE..AADF;SA # Po [2] TAI VIET SYMBOL HO HOI..TAI VIET SYMBOL KOI KOI +AAE0..AAEA;AL # Lo [11] MEETEI MAYEK LETTER E..MEETEI MAYEK LETTER SSA +AAEB;CM # Mc MEETEI MAYEK VOWEL SIGN II +AAEC..AAED;CM # Mn [2] MEETEI MAYEK VOWEL SIGN UU..MEETEI MAYEK VOWEL SIGN AAI +AAEE..AAEF;CM # Mc [2] MEETEI MAYEK VOWEL SIGN AU..MEETEI MAYEK VOWEL SIGN AAU +AAF0..AAF1;BA # Po [2] MEETEI MAYEK CHEIKHAN..MEETEI MAYEK AHANG KHUDAM +AAF2;AL # Lo MEETEI MAYEK ANJI +AAF3..AAF4;AL # Lm [2] MEETEI MAYEK SYLLABLE REPETITION MARK..MEETEI MAYEK WORD REPETITION MARK +AAF5;CM # Mc MEETEI MAYEK VOWEL SIGN VISARGA +AAF6;CM # Mn MEETEI MAYEK VIRAMA +AB01..AB06;AL # Lo [6] ETHIOPIC SYLLABLE TTHU..ETHIOPIC SYLLABLE TTHO +AB09..AB0E;AL # Lo [6] ETHIOPIC SYLLABLE DDHU..ETHIOPIC SYLLABLE DDHO +AB11..AB16;AL # Lo [6] ETHIOPIC SYLLABLE DZU..ETHIOPIC SYLLABLE DZO +AB20..AB26;AL # Lo [7] ETHIOPIC SYLLABLE CCHHA..ETHIOPIC SYLLABLE CCHHO +AB28..AB2E;AL # Lo [7] ETHIOPIC SYLLABLE BBA..ETHIOPIC SYLLABLE BBO +AB30..AB5A;AL # Ll [43] LATIN SMALL LETTER BARRED ALPHA..LATIN SMALL LETTER Y WITH SHORT RIGHT LEG +AB5B;AL # Sk MODIFIER BREVE WITH INVERTED BREVE +AB5C..AB5F;AL # Lm [4] MODIFIER LETTER SMALL HENG..MODIFIER LETTER SMALL U WITH LEFT HOOK +AB60..AB65;AL # Ll [6] LATIN SMALL LETTER SAKHA YAT..GREEK LETTER SMALL CAPITAL OMEGA +AB70..ABBF;AL # Ll [80] CHEROKEE SMALL LETTER A..CHEROKEE SMALL LETTER YA +ABC0..ABE2;AL # Lo [35] MEETEI MAYEK LETTER KOK..MEETEI MAYEK LETTER I LONSUM +ABE3..ABE4;CM # Mc [2] MEETEI MAYEK VOWEL SIGN ONAP..MEETEI MAYEK VOWEL SIGN INAP +ABE5;CM # Mn MEETEI MAYEK VOWEL SIGN ANAP +ABE6..ABE7;CM # Mc [2] MEETEI MAYEK VOWEL SIGN YENAP..MEETEI MAYEK VOWEL SIGN SOUNAP +ABE8;CM # Mn MEETEI MAYEK VOWEL SIGN UNAP +ABE9..ABEA;CM # Mc [2] MEETEI MAYEK VOWEL SIGN CHEINAP..MEETEI MAYEK VOWEL SIGN NUNG +ABEB;BA # Po MEETEI MAYEK CHEIKHEI +ABEC;CM # Mc MEETEI MAYEK LUM IYEK +ABED;CM # Mn MEETEI MAYEK APUN IYEK +ABF0..ABF9;NU # Nd [10] MEETEI MAYEK DIGIT ZERO..MEETEI MAYEK DIGIT NINE +AC00;H2 # Lo HANGUL SYLLABLE GA +AC01..AC1B;H3 # Lo [27] HANGUL SYLLABLE GAG..HANGUL SYLLABLE GAH +AC1C;H2 # Lo HANGUL SYLLABLE GAE +AC1D..AC37;H3 # Lo [27] HANGUL SYLLABLE GAEG..HANGUL SYLLABLE GAEH +AC38;H2 # Lo HANGUL SYLLABLE GYA +AC39..AC53;H3 # Lo [27] HANGUL SYLLABLE GYAG..HANGUL SYLLABLE GYAH +AC54;H2 # Lo HANGUL SYLLABLE GYAE +AC55..AC6F;H3 # Lo [27] HANGUL SYLLABLE GYAEG..HANGUL SYLLABLE GYAEH +AC70;H2 # Lo HANGUL SYLLABLE GEO +AC71..AC8B;H3 # Lo [27] HANGUL SYLLABLE GEOG..HANGUL SYLLABLE GEOH +AC8C;H2 # Lo HANGUL SYLLABLE GE +AC8D..ACA7;H3 # Lo [27] HANGUL SYLLABLE GEG..HANGUL SYLLABLE GEH +ACA8;H2 # Lo HANGUL SYLLABLE GYEO +ACA9..ACC3;H3 # Lo [27] HANGUL SYLLABLE GYEOG..HANGUL SYLLABLE GYEOH +ACC4;H2 # Lo HANGUL SYLLABLE GYE +ACC5..ACDF;H3 # Lo [27] HANGUL SYLLABLE GYEG..HANGUL SYLLABLE GYEH +ACE0;H2 # Lo HANGUL SYLLABLE GO +ACE1..ACFB;H3 # Lo [27] HANGUL SYLLABLE GOG..HANGUL SYLLABLE GOH +ACFC;H2 # Lo HANGUL SYLLABLE GWA +ACFD..AD17;H3 # Lo [27] HANGUL SYLLABLE GWAG..HANGUL SYLLABLE GWAH +AD18;H2 # Lo HANGUL SYLLABLE GWAE +AD19..AD33;H3 # Lo [27] HANGUL SYLLABLE GWAEG..HANGUL SYLLABLE GWAEH +AD34;H2 # Lo HANGUL SYLLABLE GOE +AD35..AD4F;H3 # Lo [27] HANGUL SYLLABLE GOEG..HANGUL SYLLABLE GOEH +AD50;H2 # Lo HANGUL SYLLABLE GYO +AD51..AD6B;H3 # Lo [27] HANGUL SYLLABLE GYOG..HANGUL SYLLABLE GYOH +AD6C;H2 # Lo HANGUL SYLLABLE GU +AD6D..AD87;H3 # Lo [27] HANGUL SYLLABLE GUG..HANGUL SYLLABLE GUH +AD88;H2 # Lo HANGUL SYLLABLE GWEO +AD89..ADA3;H3 # Lo [27] HANGUL SYLLABLE GWEOG..HANGUL SYLLABLE GWEOH +ADA4;H2 # Lo HANGUL SYLLABLE GWE +ADA5..ADBF;H3 # Lo [27] HANGUL SYLLABLE GWEG..HANGUL SYLLABLE GWEH +ADC0;H2 # Lo HANGUL SYLLABLE GWI +ADC1..ADDB;H3 # Lo [27] HANGUL SYLLABLE GWIG..HANGUL SYLLABLE GWIH +ADDC;H2 # Lo HANGUL SYLLABLE GYU +ADDD..ADF7;H3 # Lo [27] HANGUL SYLLABLE GYUG..HANGUL SYLLABLE GYUH +ADF8;H2 # Lo HANGUL SYLLABLE GEU +ADF9..AE13;H3 # Lo [27] HANGUL SYLLABLE GEUG..HANGUL SYLLABLE GEUH +AE14;H2 # Lo HANGUL SYLLABLE GYI +AE15..AE2F;H3 # Lo [27] HANGUL SYLLABLE GYIG..HANGUL SYLLABLE GYIH +AE30;H2 # Lo HANGUL SYLLABLE GI +AE31..AE4B;H3 # Lo [27] HANGUL SYLLABLE GIG..HANGUL SYLLABLE GIH +AE4C;H2 # Lo HANGUL SYLLABLE GGA +AE4D..AE67;H3 # Lo [27] HANGUL SYLLABLE GGAG..HANGUL SYLLABLE GGAH +AE68;H2 # Lo HANGUL SYLLABLE GGAE +AE69..AE83;H3 # Lo [27] HANGUL SYLLABLE GGAEG..HANGUL SYLLABLE GGAEH +AE84;H2 # Lo HANGUL SYLLABLE GGYA +AE85..AE9F;H3 # Lo [27] HANGUL SYLLABLE GGYAG..HANGUL SYLLABLE GGYAH +AEA0;H2 # Lo HANGUL SYLLABLE GGYAE +AEA1..AEBB;H3 # Lo [27] HANGUL SYLLABLE GGYAEG..HANGUL SYLLABLE GGYAEH +AEBC;H2 # Lo HANGUL SYLLABLE GGEO +AEBD..AED7;H3 # Lo [27] HANGUL SYLLABLE GGEOG..HANGUL SYLLABLE GGEOH +AED8;H2 # Lo HANGUL SYLLABLE GGE +AED9..AEF3;H3 # Lo [27] HANGUL SYLLABLE GGEG..HANGUL SYLLABLE GGEH +AEF4;H2 # Lo HANGUL SYLLABLE GGYEO +AEF5..AF0F;H3 # Lo [27] HANGUL SYLLABLE GGYEOG..HANGUL SYLLABLE GGYEOH +AF10;H2 # Lo HANGUL SYLLABLE GGYE +AF11..AF2B;H3 # Lo [27] HANGUL SYLLABLE GGYEG..HANGUL SYLLABLE GGYEH +AF2C;H2 # Lo HANGUL SYLLABLE GGO +AF2D..AF47;H3 # Lo [27] HANGUL SYLLABLE GGOG..HANGUL SYLLABLE GGOH +AF48;H2 # Lo HANGUL SYLLABLE GGWA +AF49..AF63;H3 # Lo [27] HANGUL SYLLABLE GGWAG..HANGUL SYLLABLE GGWAH +AF64;H2 # Lo HANGUL SYLLABLE GGWAE +AF65..AF7F;H3 # Lo [27] HANGUL SYLLABLE GGWAEG..HANGUL SYLLABLE GGWAEH +AF80;H2 # Lo HANGUL SYLLABLE GGOE +AF81..AF9B;H3 # Lo [27] HANGUL SYLLABLE GGOEG..HANGUL SYLLABLE GGOEH +AF9C;H2 # Lo HANGUL SYLLABLE GGYO +AF9D..AFB7;H3 # Lo [27] HANGUL SYLLABLE GGYOG..HANGUL SYLLABLE GGYOH +AFB8;H2 # Lo HANGUL SYLLABLE GGU +AFB9..AFD3;H3 # Lo [27] HANGUL SYLLABLE GGUG..HANGUL SYLLABLE GGUH +AFD4;H2 # Lo HANGUL SYLLABLE GGWEO +AFD5..AFEF;H3 # Lo [27] HANGUL SYLLABLE GGWEOG..HANGUL SYLLABLE GGWEOH +AFF0;H2 # Lo HANGUL SYLLABLE GGWE +AFF1..B00B;H3 # Lo [27] HANGUL SYLLABLE GGWEG..HANGUL SYLLABLE GGWEH +B00C;H2 # Lo HANGUL SYLLABLE GGWI +B00D..B027;H3 # Lo [27] HANGUL SYLLABLE GGWIG..HANGUL SYLLABLE GGWIH +B028;H2 # Lo HANGUL SYLLABLE GGYU +B029..B043;H3 # Lo [27] HANGUL SYLLABLE GGYUG..HANGUL SYLLABLE GGYUH +B044;H2 # Lo HANGUL SYLLABLE GGEU +B045..B05F;H3 # Lo [27] HANGUL SYLLABLE GGEUG..HANGUL SYLLABLE GGEUH +B060;H2 # Lo HANGUL SYLLABLE GGYI +B061..B07B;H3 # Lo [27] HANGUL SYLLABLE GGYIG..HANGUL SYLLABLE GGYIH +B07C;H2 # Lo HANGUL SYLLABLE GGI +B07D..B097;H3 # Lo [27] HANGUL SYLLABLE GGIG..HANGUL SYLLABLE GGIH +B098;H2 # Lo HANGUL SYLLABLE NA +B099..B0B3;H3 # Lo [27] HANGUL SYLLABLE NAG..HANGUL SYLLABLE NAH +B0B4;H2 # Lo HANGUL SYLLABLE NAE +B0B5..B0CF;H3 # Lo [27] HANGUL SYLLABLE NAEG..HANGUL SYLLABLE NAEH +B0D0;H2 # Lo HANGUL SYLLABLE NYA +B0D1..B0EB;H3 # Lo [27] HANGUL SYLLABLE NYAG..HANGUL SYLLABLE NYAH +B0EC;H2 # Lo HANGUL SYLLABLE NYAE +B0ED..B107;H3 # Lo [27] HANGUL SYLLABLE NYAEG..HANGUL SYLLABLE NYAEH +B108;H2 # Lo HANGUL SYLLABLE NEO +B109..B123;H3 # Lo [27] HANGUL SYLLABLE NEOG..HANGUL SYLLABLE NEOH +B124;H2 # Lo HANGUL SYLLABLE NE +B125..B13F;H3 # Lo [27] HANGUL SYLLABLE NEG..HANGUL SYLLABLE NEH +B140;H2 # Lo HANGUL SYLLABLE NYEO +B141..B15B;H3 # Lo [27] HANGUL SYLLABLE NYEOG..HANGUL SYLLABLE NYEOH +B15C;H2 # Lo HANGUL SYLLABLE NYE +B15D..B177;H3 # Lo [27] HANGUL SYLLABLE NYEG..HANGUL SYLLABLE NYEH +B178;H2 # Lo HANGUL SYLLABLE NO +B179..B193;H3 # Lo [27] HANGUL SYLLABLE NOG..HANGUL SYLLABLE NOH +B194;H2 # Lo HANGUL SYLLABLE NWA +B195..B1AF;H3 # Lo [27] HANGUL SYLLABLE NWAG..HANGUL SYLLABLE NWAH +B1B0;H2 # Lo HANGUL SYLLABLE NWAE +B1B1..B1CB;H3 # Lo [27] HANGUL SYLLABLE NWAEG..HANGUL SYLLABLE NWAEH +B1CC;H2 # Lo HANGUL SYLLABLE NOE +B1CD..B1E7;H3 # Lo [27] HANGUL SYLLABLE NOEG..HANGUL SYLLABLE NOEH +B1E8;H2 # Lo HANGUL SYLLABLE NYO +B1E9..B203;H3 # Lo [27] HANGUL SYLLABLE NYOG..HANGUL SYLLABLE NYOH +B204;H2 # Lo HANGUL SYLLABLE NU +B205..B21F;H3 # Lo [27] HANGUL SYLLABLE NUG..HANGUL SYLLABLE NUH +B220;H2 # Lo HANGUL SYLLABLE NWEO +B221..B23B;H3 # Lo [27] HANGUL SYLLABLE NWEOG..HANGUL SYLLABLE NWEOH +B23C;H2 # Lo HANGUL SYLLABLE NWE +B23D..B257;H3 # Lo [27] HANGUL SYLLABLE NWEG..HANGUL SYLLABLE NWEH +B258;H2 # Lo HANGUL SYLLABLE NWI +B259..B273;H3 # Lo [27] HANGUL SYLLABLE NWIG..HANGUL SYLLABLE NWIH +B274;H2 # Lo HANGUL SYLLABLE NYU +B275..B28F;H3 # Lo [27] HANGUL SYLLABLE NYUG..HANGUL SYLLABLE NYUH +B290;H2 # Lo HANGUL SYLLABLE NEU +B291..B2AB;H3 # Lo [27] HANGUL SYLLABLE NEUG..HANGUL SYLLABLE NEUH +B2AC;H2 # Lo HANGUL SYLLABLE NYI +B2AD..B2C7;H3 # Lo [27] HANGUL SYLLABLE NYIG..HANGUL SYLLABLE NYIH +B2C8;H2 # Lo HANGUL SYLLABLE NI +B2C9..B2E3;H3 # Lo [27] HANGUL SYLLABLE NIG..HANGUL SYLLABLE NIH +B2E4;H2 # Lo HANGUL SYLLABLE DA +B2E5..B2FF;H3 # Lo [27] HANGUL SYLLABLE DAG..HANGUL SYLLABLE DAH +B300;H2 # Lo HANGUL SYLLABLE DAE +B301..B31B;H3 # Lo [27] HANGUL SYLLABLE DAEG..HANGUL SYLLABLE DAEH +B31C;H2 # Lo HANGUL SYLLABLE DYA +B31D..B337;H3 # Lo [27] HANGUL SYLLABLE DYAG..HANGUL SYLLABLE DYAH +B338;H2 # Lo HANGUL SYLLABLE DYAE +B339..B353;H3 # Lo [27] HANGUL SYLLABLE DYAEG..HANGUL SYLLABLE DYAEH +B354;H2 # Lo HANGUL SYLLABLE DEO +B355..B36F;H3 # Lo [27] HANGUL SYLLABLE DEOG..HANGUL SYLLABLE DEOH +B370;H2 # Lo HANGUL SYLLABLE DE +B371..B38B;H3 # Lo [27] HANGUL SYLLABLE DEG..HANGUL SYLLABLE DEH +B38C;H2 # Lo HANGUL SYLLABLE DYEO +B38D..B3A7;H3 # Lo [27] HANGUL SYLLABLE DYEOG..HANGUL SYLLABLE DYEOH +B3A8;H2 # Lo HANGUL SYLLABLE DYE +B3A9..B3C3;H3 # Lo [27] HANGUL SYLLABLE DYEG..HANGUL SYLLABLE DYEH +B3C4;H2 # Lo HANGUL SYLLABLE DO +B3C5..B3DF;H3 # Lo [27] HANGUL SYLLABLE DOG..HANGUL SYLLABLE DOH +B3E0;H2 # Lo HANGUL SYLLABLE DWA +B3E1..B3FB;H3 # Lo [27] HANGUL SYLLABLE DWAG..HANGUL SYLLABLE DWAH +B3FC;H2 # Lo HANGUL SYLLABLE DWAE +B3FD..B417;H3 # Lo [27] HANGUL SYLLABLE DWAEG..HANGUL SYLLABLE DWAEH +B418;H2 # Lo HANGUL SYLLABLE DOE +B419..B433;H3 # Lo [27] HANGUL SYLLABLE DOEG..HANGUL SYLLABLE DOEH +B434;H2 # Lo HANGUL SYLLABLE DYO +B435..B44F;H3 # Lo [27] HANGUL SYLLABLE DYOG..HANGUL SYLLABLE DYOH +B450;H2 # Lo HANGUL SYLLABLE DU +B451..B46B;H3 # Lo [27] HANGUL SYLLABLE DUG..HANGUL SYLLABLE DUH +B46C;H2 # Lo HANGUL SYLLABLE DWEO +B46D..B487;H3 # Lo [27] HANGUL SYLLABLE DWEOG..HANGUL SYLLABLE DWEOH +B488;H2 # Lo HANGUL SYLLABLE DWE +B489..B4A3;H3 # Lo [27] HANGUL SYLLABLE DWEG..HANGUL SYLLABLE DWEH +B4A4;H2 # Lo HANGUL SYLLABLE DWI +B4A5..B4BF;H3 # Lo [27] HANGUL SYLLABLE DWIG..HANGUL SYLLABLE DWIH +B4C0;H2 # Lo HANGUL SYLLABLE DYU +B4C1..B4DB;H3 # Lo [27] HANGUL SYLLABLE DYUG..HANGUL SYLLABLE DYUH +B4DC;H2 # Lo HANGUL SYLLABLE DEU +B4DD..B4F7;H3 # Lo [27] HANGUL SYLLABLE DEUG..HANGUL SYLLABLE DEUH +B4F8;H2 # Lo HANGUL SYLLABLE DYI +B4F9..B513;H3 # Lo [27] HANGUL SYLLABLE DYIG..HANGUL SYLLABLE DYIH +B514;H2 # Lo HANGUL SYLLABLE DI +B515..B52F;H3 # Lo [27] HANGUL SYLLABLE DIG..HANGUL SYLLABLE DIH +B530;H2 # Lo HANGUL SYLLABLE DDA +B531..B54B;H3 # Lo [27] HANGUL SYLLABLE DDAG..HANGUL SYLLABLE DDAH +B54C;H2 # Lo HANGUL SYLLABLE DDAE +B54D..B567;H3 # Lo [27] HANGUL SYLLABLE DDAEG..HANGUL SYLLABLE DDAEH +B568;H2 # Lo HANGUL SYLLABLE DDYA +B569..B583;H3 # Lo [27] HANGUL SYLLABLE DDYAG..HANGUL SYLLABLE DDYAH +B584;H2 # Lo HANGUL SYLLABLE DDYAE +B585..B59F;H3 # Lo [27] HANGUL SYLLABLE DDYAEG..HANGUL SYLLABLE DDYAEH +B5A0;H2 # Lo HANGUL SYLLABLE DDEO +B5A1..B5BB;H3 # Lo [27] HANGUL SYLLABLE DDEOG..HANGUL SYLLABLE DDEOH +B5BC;H2 # Lo HANGUL SYLLABLE DDE +B5BD..B5D7;H3 # Lo [27] HANGUL SYLLABLE DDEG..HANGUL SYLLABLE DDEH +B5D8;H2 # Lo HANGUL SYLLABLE DDYEO +B5D9..B5F3;H3 # Lo [27] HANGUL SYLLABLE DDYEOG..HANGUL SYLLABLE DDYEOH +B5F4;H2 # Lo HANGUL SYLLABLE DDYE +B5F5..B60F;H3 # Lo [27] HANGUL SYLLABLE DDYEG..HANGUL SYLLABLE DDYEH +B610;H2 # Lo HANGUL SYLLABLE DDO +B611..B62B;H3 # Lo [27] HANGUL SYLLABLE DDOG..HANGUL SYLLABLE DDOH +B62C;H2 # Lo HANGUL SYLLABLE DDWA +B62D..B647;H3 # Lo [27] HANGUL SYLLABLE DDWAG..HANGUL SYLLABLE DDWAH +B648;H2 # Lo HANGUL SYLLABLE DDWAE +B649..B663;H3 # Lo [27] HANGUL SYLLABLE DDWAEG..HANGUL SYLLABLE DDWAEH +B664;H2 # Lo HANGUL SYLLABLE DDOE +B665..B67F;H3 # Lo [27] HANGUL SYLLABLE DDOEG..HANGUL SYLLABLE DDOEH +B680;H2 # Lo HANGUL SYLLABLE DDYO +B681..B69B;H3 # Lo [27] HANGUL SYLLABLE DDYOG..HANGUL SYLLABLE DDYOH +B69C;H2 # Lo HANGUL SYLLABLE DDU +B69D..B6B7;H3 # Lo [27] HANGUL SYLLABLE DDUG..HANGUL SYLLABLE DDUH +B6B8;H2 # Lo HANGUL SYLLABLE DDWEO +B6B9..B6D3;H3 # Lo [27] HANGUL SYLLABLE DDWEOG..HANGUL SYLLABLE DDWEOH +B6D4;H2 # Lo HANGUL SYLLABLE DDWE +B6D5..B6EF;H3 # Lo [27] HANGUL SYLLABLE DDWEG..HANGUL SYLLABLE DDWEH +B6F0;H2 # Lo HANGUL SYLLABLE DDWI +B6F1..B70B;H3 # Lo [27] HANGUL SYLLABLE DDWIG..HANGUL SYLLABLE DDWIH +B70C;H2 # Lo HANGUL SYLLABLE DDYU +B70D..B727;H3 # Lo [27] HANGUL SYLLABLE DDYUG..HANGUL SYLLABLE DDYUH +B728;H2 # Lo HANGUL SYLLABLE DDEU +B729..B743;H3 # Lo [27] HANGUL SYLLABLE DDEUG..HANGUL SYLLABLE DDEUH +B744;H2 # Lo HANGUL SYLLABLE DDYI +B745..B75F;H3 # Lo [27] HANGUL SYLLABLE DDYIG..HANGUL SYLLABLE DDYIH +B760;H2 # Lo HANGUL SYLLABLE DDI +B761..B77B;H3 # Lo [27] HANGUL SYLLABLE DDIG..HANGUL SYLLABLE DDIH +B77C;H2 # Lo HANGUL SYLLABLE RA +B77D..B797;H3 # Lo [27] HANGUL SYLLABLE RAG..HANGUL SYLLABLE RAH +B798;H2 # Lo HANGUL SYLLABLE RAE +B799..B7B3;H3 # Lo [27] HANGUL SYLLABLE RAEG..HANGUL SYLLABLE RAEH +B7B4;H2 # Lo HANGUL SYLLABLE RYA +B7B5..B7CF;H3 # Lo [27] HANGUL SYLLABLE RYAG..HANGUL SYLLABLE RYAH +B7D0;H2 # Lo HANGUL SYLLABLE RYAE +B7D1..B7EB;H3 # Lo [27] HANGUL SYLLABLE RYAEG..HANGUL SYLLABLE RYAEH +B7EC;H2 # Lo HANGUL SYLLABLE REO +B7ED..B807;H3 # Lo [27] HANGUL SYLLABLE REOG..HANGUL SYLLABLE REOH +B808;H2 # Lo HANGUL SYLLABLE RE +B809..B823;H3 # Lo [27] HANGUL SYLLABLE REG..HANGUL SYLLABLE REH +B824;H2 # Lo HANGUL SYLLABLE RYEO +B825..B83F;H3 # Lo [27] HANGUL SYLLABLE RYEOG..HANGUL SYLLABLE RYEOH +B840;H2 # Lo HANGUL SYLLABLE RYE +B841..B85B;H3 # Lo [27] HANGUL SYLLABLE RYEG..HANGUL SYLLABLE RYEH +B85C;H2 # Lo HANGUL SYLLABLE RO +B85D..B877;H3 # Lo [27] HANGUL SYLLABLE ROG..HANGUL SYLLABLE ROH +B878;H2 # Lo HANGUL SYLLABLE RWA +B879..B893;H3 # Lo [27] HANGUL SYLLABLE RWAG..HANGUL SYLLABLE RWAH +B894;H2 # Lo HANGUL SYLLABLE RWAE +B895..B8AF;H3 # Lo [27] HANGUL SYLLABLE RWAEG..HANGUL SYLLABLE RWAEH +B8B0;H2 # Lo HANGUL SYLLABLE ROE +B8B1..B8CB;H3 # Lo [27] HANGUL SYLLABLE ROEG..HANGUL SYLLABLE ROEH +B8CC;H2 # Lo HANGUL SYLLABLE RYO +B8CD..B8E7;H3 # Lo [27] HANGUL SYLLABLE RYOG..HANGUL SYLLABLE RYOH +B8E8;H2 # Lo HANGUL SYLLABLE RU +B8E9..B903;H3 # Lo [27] HANGUL SYLLABLE RUG..HANGUL SYLLABLE RUH +B904;H2 # Lo HANGUL SYLLABLE RWEO +B905..B91F;H3 # Lo [27] HANGUL SYLLABLE RWEOG..HANGUL SYLLABLE RWEOH +B920;H2 # Lo HANGUL SYLLABLE RWE +B921..B93B;H3 # Lo [27] HANGUL SYLLABLE RWEG..HANGUL SYLLABLE RWEH +B93C;H2 # Lo HANGUL SYLLABLE RWI +B93D..B957;H3 # Lo [27] HANGUL SYLLABLE RWIG..HANGUL SYLLABLE RWIH +B958;H2 # Lo HANGUL SYLLABLE RYU +B959..B973;H3 # Lo [27] HANGUL SYLLABLE RYUG..HANGUL SYLLABLE RYUH +B974;H2 # Lo HANGUL SYLLABLE REU +B975..B98F;H3 # Lo [27] HANGUL SYLLABLE REUG..HANGUL SYLLABLE REUH +B990;H2 # Lo HANGUL SYLLABLE RYI +B991..B9AB;H3 # Lo [27] HANGUL SYLLABLE RYIG..HANGUL SYLLABLE RYIH +B9AC;H2 # Lo HANGUL SYLLABLE RI +B9AD..B9C7;H3 # Lo [27] HANGUL SYLLABLE RIG..HANGUL SYLLABLE RIH +B9C8;H2 # Lo HANGUL SYLLABLE MA +B9C9..B9E3;H3 # Lo [27] HANGUL SYLLABLE MAG..HANGUL SYLLABLE MAH +B9E4;H2 # Lo HANGUL SYLLABLE MAE +B9E5..B9FF;H3 # Lo [27] HANGUL SYLLABLE MAEG..HANGUL SYLLABLE MAEH +BA00;H2 # Lo HANGUL SYLLABLE MYA +BA01..BA1B;H3 # Lo [27] HANGUL SYLLABLE MYAG..HANGUL SYLLABLE MYAH +BA1C;H2 # Lo HANGUL SYLLABLE MYAE +BA1D..BA37;H3 # Lo [27] HANGUL SYLLABLE MYAEG..HANGUL SYLLABLE MYAEH +BA38;H2 # Lo HANGUL SYLLABLE MEO +BA39..BA53;H3 # Lo [27] HANGUL SYLLABLE MEOG..HANGUL SYLLABLE MEOH +BA54;H2 # Lo HANGUL SYLLABLE ME +BA55..BA6F;H3 # Lo [27] HANGUL SYLLABLE MEG..HANGUL SYLLABLE MEH +BA70;H2 # Lo HANGUL SYLLABLE MYEO +BA71..BA8B;H3 # Lo [27] HANGUL SYLLABLE MYEOG..HANGUL SYLLABLE MYEOH +BA8C;H2 # Lo HANGUL SYLLABLE MYE +BA8D..BAA7;H3 # Lo [27] HANGUL SYLLABLE MYEG..HANGUL SYLLABLE MYEH +BAA8;H2 # Lo HANGUL SYLLABLE MO +BAA9..BAC3;H3 # Lo [27] HANGUL SYLLABLE MOG..HANGUL SYLLABLE MOH +BAC4;H2 # Lo HANGUL SYLLABLE MWA +BAC5..BADF;H3 # Lo [27] HANGUL SYLLABLE MWAG..HANGUL SYLLABLE MWAH +BAE0;H2 # Lo HANGUL SYLLABLE MWAE +BAE1..BAFB;H3 # Lo [27] HANGUL SYLLABLE MWAEG..HANGUL SYLLABLE MWAEH +BAFC;H2 # Lo HANGUL SYLLABLE MOE +BAFD..BB17;H3 # Lo [27] HANGUL SYLLABLE MOEG..HANGUL SYLLABLE MOEH +BB18;H2 # Lo HANGUL SYLLABLE MYO +BB19..BB33;H3 # Lo [27] HANGUL SYLLABLE MYOG..HANGUL SYLLABLE MYOH +BB34;H2 # Lo HANGUL SYLLABLE MU +BB35..BB4F;H3 # Lo [27] HANGUL SYLLABLE MUG..HANGUL SYLLABLE MUH +BB50;H2 # Lo HANGUL SYLLABLE MWEO +BB51..BB6B;H3 # Lo [27] HANGUL SYLLABLE MWEOG..HANGUL SYLLABLE MWEOH +BB6C;H2 # Lo HANGUL SYLLABLE MWE +BB6D..BB87;H3 # Lo [27] HANGUL SYLLABLE MWEG..HANGUL SYLLABLE MWEH +BB88;H2 # Lo HANGUL SYLLABLE MWI +BB89..BBA3;H3 # Lo [27] HANGUL SYLLABLE MWIG..HANGUL SYLLABLE MWIH +BBA4;H2 # Lo HANGUL SYLLABLE MYU +BBA5..BBBF;H3 # Lo [27] HANGUL SYLLABLE MYUG..HANGUL SYLLABLE MYUH +BBC0;H2 # Lo HANGUL SYLLABLE MEU +BBC1..BBDB;H3 # Lo [27] HANGUL SYLLABLE MEUG..HANGUL SYLLABLE MEUH +BBDC;H2 # Lo HANGUL SYLLABLE MYI +BBDD..BBF7;H3 # Lo [27] HANGUL SYLLABLE MYIG..HANGUL SYLLABLE MYIH +BBF8;H2 # Lo HANGUL SYLLABLE MI +BBF9..BC13;H3 # Lo [27] HANGUL SYLLABLE MIG..HANGUL SYLLABLE MIH +BC14;H2 # Lo HANGUL SYLLABLE BA +BC15..BC2F;H3 # Lo [27] HANGUL SYLLABLE BAG..HANGUL SYLLABLE BAH +BC30;H2 # Lo HANGUL SYLLABLE BAE +BC31..BC4B;H3 # Lo [27] HANGUL SYLLABLE BAEG..HANGUL SYLLABLE BAEH +BC4C;H2 # Lo HANGUL SYLLABLE BYA +BC4D..BC67;H3 # Lo [27] HANGUL SYLLABLE BYAG..HANGUL SYLLABLE BYAH +BC68;H2 # Lo HANGUL SYLLABLE BYAE +BC69..BC83;H3 # Lo [27] HANGUL SYLLABLE BYAEG..HANGUL SYLLABLE BYAEH +BC84;H2 # Lo HANGUL SYLLABLE BEO +BC85..BC9F;H3 # Lo [27] HANGUL SYLLABLE BEOG..HANGUL SYLLABLE BEOH +BCA0;H2 # Lo HANGUL SYLLABLE BE +BCA1..BCBB;H3 # Lo [27] HANGUL SYLLABLE BEG..HANGUL SYLLABLE BEH +BCBC;H2 # Lo HANGUL SYLLABLE BYEO +BCBD..BCD7;H3 # Lo [27] HANGUL SYLLABLE BYEOG..HANGUL SYLLABLE BYEOH +BCD8;H2 # Lo HANGUL SYLLABLE BYE +BCD9..BCF3;H3 # Lo [27] HANGUL SYLLABLE BYEG..HANGUL SYLLABLE BYEH +BCF4;H2 # Lo HANGUL SYLLABLE BO +BCF5..BD0F;H3 # Lo [27] HANGUL SYLLABLE BOG..HANGUL SYLLABLE BOH +BD10;H2 # Lo HANGUL SYLLABLE BWA +BD11..BD2B;H3 # Lo [27] HANGUL SYLLABLE BWAG..HANGUL SYLLABLE BWAH +BD2C;H2 # Lo HANGUL SYLLABLE BWAE +BD2D..BD47;H3 # Lo [27] HANGUL SYLLABLE BWAEG..HANGUL SYLLABLE BWAEH +BD48;H2 # Lo HANGUL SYLLABLE BOE +BD49..BD63;H3 # Lo [27] HANGUL SYLLABLE BOEG..HANGUL SYLLABLE BOEH +BD64;H2 # Lo HANGUL SYLLABLE BYO +BD65..BD7F;H3 # Lo [27] HANGUL SYLLABLE BYOG..HANGUL SYLLABLE BYOH +BD80;H2 # Lo HANGUL SYLLABLE BU +BD81..BD9B;H3 # Lo [27] HANGUL SYLLABLE BUG..HANGUL SYLLABLE BUH +BD9C;H2 # Lo HANGUL SYLLABLE BWEO +BD9D..BDB7;H3 # Lo [27] HANGUL SYLLABLE BWEOG..HANGUL SYLLABLE BWEOH +BDB8;H2 # Lo HANGUL SYLLABLE BWE +BDB9..BDD3;H3 # Lo [27] HANGUL SYLLABLE BWEG..HANGUL SYLLABLE BWEH +BDD4;H2 # Lo HANGUL SYLLABLE BWI +BDD5..BDEF;H3 # Lo [27] HANGUL SYLLABLE BWIG..HANGUL SYLLABLE BWIH +BDF0;H2 # Lo HANGUL SYLLABLE BYU +BDF1..BE0B;H3 # Lo [27] HANGUL SYLLABLE BYUG..HANGUL SYLLABLE BYUH +BE0C;H2 # Lo HANGUL SYLLABLE BEU +BE0D..BE27;H3 # Lo [27] HANGUL SYLLABLE BEUG..HANGUL SYLLABLE BEUH +BE28;H2 # Lo HANGUL SYLLABLE BYI +BE29..BE43;H3 # Lo [27] HANGUL SYLLABLE BYIG..HANGUL SYLLABLE BYIH +BE44;H2 # Lo HANGUL SYLLABLE BI +BE45..BE5F;H3 # Lo [27] HANGUL SYLLABLE BIG..HANGUL SYLLABLE BIH +BE60;H2 # Lo HANGUL SYLLABLE BBA +BE61..BE7B;H3 # Lo [27] HANGUL SYLLABLE BBAG..HANGUL SYLLABLE BBAH +BE7C;H2 # Lo HANGUL SYLLABLE BBAE +BE7D..BE97;H3 # Lo [27] HANGUL SYLLABLE BBAEG..HANGUL SYLLABLE BBAEH +BE98;H2 # Lo HANGUL SYLLABLE BBYA +BE99..BEB3;H3 # Lo [27] HANGUL SYLLABLE BBYAG..HANGUL SYLLABLE BBYAH +BEB4;H2 # Lo HANGUL SYLLABLE BBYAE +BEB5..BECF;H3 # Lo [27] HANGUL SYLLABLE BBYAEG..HANGUL SYLLABLE BBYAEH +BED0;H2 # Lo HANGUL SYLLABLE BBEO +BED1..BEEB;H3 # Lo [27] HANGUL SYLLABLE BBEOG..HANGUL SYLLABLE BBEOH +BEEC;H2 # Lo HANGUL SYLLABLE BBE +BEED..BF07;H3 # Lo [27] HANGUL SYLLABLE BBEG..HANGUL SYLLABLE BBEH +BF08;H2 # Lo HANGUL SYLLABLE BBYEO +BF09..BF23;H3 # Lo [27] HANGUL SYLLABLE BBYEOG..HANGUL SYLLABLE BBYEOH +BF24;H2 # Lo HANGUL SYLLABLE BBYE +BF25..BF3F;H3 # Lo [27] HANGUL SYLLABLE BBYEG..HANGUL SYLLABLE BBYEH +BF40;H2 # Lo HANGUL SYLLABLE BBO +BF41..BF5B;H3 # Lo [27] HANGUL SYLLABLE BBOG..HANGUL SYLLABLE BBOH +BF5C;H2 # Lo HANGUL SYLLABLE BBWA +BF5D..BF77;H3 # Lo [27] HANGUL SYLLABLE BBWAG..HANGUL SYLLABLE BBWAH +BF78;H2 # Lo HANGUL SYLLABLE BBWAE +BF79..BF93;H3 # Lo [27] HANGUL SYLLABLE BBWAEG..HANGUL SYLLABLE BBWAEH +BF94;H2 # Lo HANGUL SYLLABLE BBOE +BF95..BFAF;H3 # Lo [27] HANGUL SYLLABLE BBOEG..HANGUL SYLLABLE BBOEH +BFB0;H2 # Lo HANGUL SYLLABLE BBYO +BFB1..BFCB;H3 # Lo [27] HANGUL SYLLABLE BBYOG..HANGUL SYLLABLE BBYOH +BFCC;H2 # Lo HANGUL SYLLABLE BBU +BFCD..BFE7;H3 # Lo [27] HANGUL SYLLABLE BBUG..HANGUL SYLLABLE BBUH +BFE8;H2 # Lo HANGUL SYLLABLE BBWEO +BFE9..C003;H3 # Lo [27] HANGUL SYLLABLE BBWEOG..HANGUL SYLLABLE BBWEOH +C004;H2 # Lo HANGUL SYLLABLE BBWE +C005..C01F;H3 # Lo [27] HANGUL SYLLABLE BBWEG..HANGUL SYLLABLE BBWEH +C020;H2 # Lo HANGUL SYLLABLE BBWI +C021..C03B;H3 # Lo [27] HANGUL SYLLABLE BBWIG..HANGUL SYLLABLE BBWIH +C03C;H2 # Lo HANGUL SYLLABLE BBYU +C03D..C057;H3 # Lo [27] HANGUL SYLLABLE BBYUG..HANGUL SYLLABLE BBYUH +C058;H2 # Lo HANGUL SYLLABLE BBEU +C059..C073;H3 # Lo [27] HANGUL SYLLABLE BBEUG..HANGUL SYLLABLE BBEUH +C074;H2 # Lo HANGUL SYLLABLE BBYI +C075..C08F;H3 # Lo [27] HANGUL SYLLABLE BBYIG..HANGUL SYLLABLE BBYIH +C090;H2 # Lo HANGUL SYLLABLE BBI +C091..C0AB;H3 # Lo [27] HANGUL SYLLABLE BBIG..HANGUL SYLLABLE BBIH +C0AC;H2 # Lo HANGUL SYLLABLE SA +C0AD..C0C7;H3 # Lo [27] HANGUL SYLLABLE SAG..HANGUL SYLLABLE SAH +C0C8;H2 # Lo HANGUL SYLLABLE SAE +C0C9..C0E3;H3 # Lo [27] HANGUL SYLLABLE SAEG..HANGUL SYLLABLE SAEH +C0E4;H2 # Lo HANGUL SYLLABLE SYA +C0E5..C0FF;H3 # Lo [27] HANGUL SYLLABLE SYAG..HANGUL SYLLABLE SYAH +C100;H2 # Lo HANGUL SYLLABLE SYAE +C101..C11B;H3 # Lo [27] HANGUL SYLLABLE SYAEG..HANGUL SYLLABLE SYAEH +C11C;H2 # Lo HANGUL SYLLABLE SEO +C11D..C137;H3 # Lo [27] HANGUL SYLLABLE SEOG..HANGUL SYLLABLE SEOH +C138;H2 # Lo HANGUL SYLLABLE SE +C139..C153;H3 # Lo [27] HANGUL SYLLABLE SEG..HANGUL SYLLABLE SEH +C154;H2 # Lo HANGUL SYLLABLE SYEO +C155..C16F;H3 # Lo [27] HANGUL SYLLABLE SYEOG..HANGUL SYLLABLE SYEOH +C170;H2 # Lo HANGUL SYLLABLE SYE +C171..C18B;H3 # Lo [27] HANGUL SYLLABLE SYEG..HANGUL SYLLABLE SYEH +C18C;H2 # Lo HANGUL SYLLABLE SO +C18D..C1A7;H3 # Lo [27] HANGUL SYLLABLE SOG..HANGUL SYLLABLE SOH +C1A8;H2 # Lo HANGUL SYLLABLE SWA +C1A9..C1C3;H3 # Lo [27] HANGUL SYLLABLE SWAG..HANGUL SYLLABLE SWAH +C1C4;H2 # Lo HANGUL SYLLABLE SWAE +C1C5..C1DF;H3 # Lo [27] HANGUL SYLLABLE SWAEG..HANGUL SYLLABLE SWAEH +C1E0;H2 # Lo HANGUL SYLLABLE SOE +C1E1..C1FB;H3 # Lo [27] HANGUL SYLLABLE SOEG..HANGUL SYLLABLE SOEH +C1FC;H2 # Lo HANGUL SYLLABLE SYO +C1FD..C217;H3 # Lo [27] HANGUL SYLLABLE SYOG..HANGUL SYLLABLE SYOH +C218;H2 # Lo HANGUL SYLLABLE SU +C219..C233;H3 # Lo [27] HANGUL SYLLABLE SUG..HANGUL SYLLABLE SUH +C234;H2 # Lo HANGUL SYLLABLE SWEO +C235..C24F;H3 # Lo [27] HANGUL SYLLABLE SWEOG..HANGUL SYLLABLE SWEOH +C250;H2 # Lo HANGUL SYLLABLE SWE +C251..C26B;H3 # Lo [27] HANGUL SYLLABLE SWEG..HANGUL SYLLABLE SWEH +C26C;H2 # Lo HANGUL SYLLABLE SWI +C26D..C287;H3 # Lo [27] HANGUL SYLLABLE SWIG..HANGUL SYLLABLE SWIH +C288;H2 # Lo HANGUL SYLLABLE SYU +C289..C2A3;H3 # Lo [27] HANGUL SYLLABLE SYUG..HANGUL SYLLABLE SYUH +C2A4;H2 # Lo HANGUL SYLLABLE SEU +C2A5..C2BF;H3 # Lo [27] HANGUL SYLLABLE SEUG..HANGUL SYLLABLE SEUH +C2C0;H2 # Lo HANGUL SYLLABLE SYI +C2C1..C2DB;H3 # Lo [27] HANGUL SYLLABLE SYIG..HANGUL SYLLABLE SYIH +C2DC;H2 # Lo HANGUL SYLLABLE SI +C2DD..C2F7;H3 # Lo [27] HANGUL SYLLABLE SIG..HANGUL SYLLABLE SIH +C2F8;H2 # Lo HANGUL SYLLABLE SSA +C2F9..C313;H3 # Lo [27] HANGUL SYLLABLE SSAG..HANGUL SYLLABLE SSAH +C314;H2 # Lo HANGUL SYLLABLE SSAE +C315..C32F;H3 # Lo [27] HANGUL SYLLABLE SSAEG..HANGUL SYLLABLE SSAEH +C330;H2 # Lo HANGUL SYLLABLE SSYA +C331..C34B;H3 # Lo [27] HANGUL SYLLABLE SSYAG..HANGUL SYLLABLE SSYAH +C34C;H2 # Lo HANGUL SYLLABLE SSYAE +C34D..C367;H3 # Lo [27] HANGUL SYLLABLE SSYAEG..HANGUL SYLLABLE SSYAEH +C368;H2 # Lo HANGUL SYLLABLE SSEO +C369..C383;H3 # Lo [27] HANGUL SYLLABLE SSEOG..HANGUL SYLLABLE SSEOH +C384;H2 # Lo HANGUL SYLLABLE SSE +C385..C39F;H3 # Lo [27] HANGUL SYLLABLE SSEG..HANGUL SYLLABLE SSEH +C3A0;H2 # Lo HANGUL SYLLABLE SSYEO +C3A1..C3BB;H3 # Lo [27] HANGUL SYLLABLE SSYEOG..HANGUL SYLLABLE SSYEOH +C3BC;H2 # Lo HANGUL SYLLABLE SSYE +C3BD..C3D7;H3 # Lo [27] HANGUL SYLLABLE SSYEG..HANGUL SYLLABLE SSYEH +C3D8;H2 # Lo HANGUL SYLLABLE SSO +C3D9..C3F3;H3 # Lo [27] HANGUL SYLLABLE SSOG..HANGUL SYLLABLE SSOH +C3F4;H2 # Lo HANGUL SYLLABLE SSWA +C3F5..C40F;H3 # Lo [27] HANGUL SYLLABLE SSWAG..HANGUL SYLLABLE SSWAH +C410;H2 # Lo HANGUL SYLLABLE SSWAE +C411..C42B;H3 # Lo [27] HANGUL SYLLABLE SSWAEG..HANGUL SYLLABLE SSWAEH +C42C;H2 # Lo HANGUL SYLLABLE SSOE +C42D..C447;H3 # Lo [27] HANGUL SYLLABLE SSOEG..HANGUL SYLLABLE SSOEH +C448;H2 # Lo HANGUL SYLLABLE SSYO +C449..C463;H3 # Lo [27] HANGUL SYLLABLE SSYOG..HANGUL SYLLABLE SSYOH +C464;H2 # Lo HANGUL SYLLABLE SSU +C465..C47F;H3 # Lo [27] HANGUL SYLLABLE SSUG..HANGUL SYLLABLE SSUH +C480;H2 # Lo HANGUL SYLLABLE SSWEO +C481..C49B;H3 # Lo [27] HANGUL SYLLABLE SSWEOG..HANGUL SYLLABLE SSWEOH +C49C;H2 # Lo HANGUL SYLLABLE SSWE +C49D..C4B7;H3 # Lo [27] HANGUL SYLLABLE SSWEG..HANGUL SYLLABLE SSWEH +C4B8;H2 # Lo HANGUL SYLLABLE SSWI +C4B9..C4D3;H3 # Lo [27] HANGUL SYLLABLE SSWIG..HANGUL SYLLABLE SSWIH +C4D4;H2 # Lo HANGUL SYLLABLE SSYU +C4D5..C4EF;H3 # Lo [27] HANGUL SYLLABLE SSYUG..HANGUL SYLLABLE SSYUH +C4F0;H2 # Lo HANGUL SYLLABLE SSEU +C4F1..C50B;H3 # Lo [27] HANGUL SYLLABLE SSEUG..HANGUL SYLLABLE SSEUH +C50C;H2 # Lo HANGUL SYLLABLE SSYI +C50D..C527;H3 # Lo [27] HANGUL SYLLABLE SSYIG..HANGUL SYLLABLE SSYIH +C528;H2 # Lo HANGUL SYLLABLE SSI +C529..C543;H3 # Lo [27] HANGUL SYLLABLE SSIG..HANGUL SYLLABLE SSIH +C544;H2 # Lo HANGUL SYLLABLE A +C545..C55F;H3 # Lo [27] HANGUL SYLLABLE AG..HANGUL SYLLABLE AH +C560;H2 # Lo HANGUL SYLLABLE AE +C561..C57B;H3 # Lo [27] HANGUL SYLLABLE AEG..HANGUL SYLLABLE AEH +C57C;H2 # Lo HANGUL SYLLABLE YA +C57D..C597;H3 # Lo [27] HANGUL SYLLABLE YAG..HANGUL SYLLABLE YAH +C598;H2 # Lo HANGUL SYLLABLE YAE +C599..C5B3;H3 # Lo [27] HANGUL SYLLABLE YAEG..HANGUL SYLLABLE YAEH +C5B4;H2 # Lo HANGUL SYLLABLE EO +C5B5..C5CF;H3 # Lo [27] HANGUL SYLLABLE EOG..HANGUL SYLLABLE EOH +C5D0;H2 # Lo HANGUL SYLLABLE E +C5D1..C5EB;H3 # Lo [27] HANGUL SYLLABLE EG..HANGUL SYLLABLE EH +C5EC;H2 # Lo HANGUL SYLLABLE YEO +C5ED..C607;H3 # Lo [27] HANGUL SYLLABLE YEOG..HANGUL SYLLABLE YEOH +C608;H2 # Lo HANGUL SYLLABLE YE +C609..C623;H3 # Lo [27] HANGUL SYLLABLE YEG..HANGUL SYLLABLE YEH +C624;H2 # Lo HANGUL SYLLABLE O +C625..C63F;H3 # Lo [27] HANGUL SYLLABLE OG..HANGUL SYLLABLE OH +C640;H2 # Lo HANGUL SYLLABLE WA +C641..C65B;H3 # Lo [27] HANGUL SYLLABLE WAG..HANGUL SYLLABLE WAH +C65C;H2 # Lo HANGUL SYLLABLE WAE +C65D..C677;H3 # Lo [27] HANGUL SYLLABLE WAEG..HANGUL SYLLABLE WAEH +C678;H2 # Lo HANGUL SYLLABLE OE +C679..C693;H3 # Lo [27] HANGUL SYLLABLE OEG..HANGUL SYLLABLE OEH +C694;H2 # Lo HANGUL SYLLABLE YO +C695..C6AF;H3 # Lo [27] HANGUL SYLLABLE YOG..HANGUL SYLLABLE YOH +C6B0;H2 # Lo HANGUL SYLLABLE U +C6B1..C6CB;H3 # Lo [27] HANGUL SYLLABLE UG..HANGUL SYLLABLE UH +C6CC;H2 # Lo HANGUL SYLLABLE WEO +C6CD..C6E7;H3 # Lo [27] HANGUL SYLLABLE WEOG..HANGUL SYLLABLE WEOH +C6E8;H2 # Lo HANGUL SYLLABLE WE +C6E9..C703;H3 # Lo [27] HANGUL SYLLABLE WEG..HANGUL SYLLABLE WEH +C704;H2 # Lo HANGUL SYLLABLE WI +C705..C71F;H3 # Lo [27] HANGUL SYLLABLE WIG..HANGUL SYLLABLE WIH +C720;H2 # Lo HANGUL SYLLABLE YU +C721..C73B;H3 # Lo [27] HANGUL SYLLABLE YUG..HANGUL SYLLABLE YUH +C73C;H2 # Lo HANGUL SYLLABLE EU +C73D..C757;H3 # Lo [27] HANGUL SYLLABLE EUG..HANGUL SYLLABLE EUH +C758;H2 # Lo HANGUL SYLLABLE YI +C759..C773;H3 # Lo [27] HANGUL SYLLABLE YIG..HANGUL SYLLABLE YIH +C774;H2 # Lo HANGUL SYLLABLE I +C775..C78F;H3 # Lo [27] HANGUL SYLLABLE IG..HANGUL SYLLABLE IH +C790;H2 # Lo HANGUL SYLLABLE JA +C791..C7AB;H3 # Lo [27] HANGUL SYLLABLE JAG..HANGUL SYLLABLE JAH +C7AC;H2 # Lo HANGUL SYLLABLE JAE +C7AD..C7C7;H3 # Lo [27] HANGUL SYLLABLE JAEG..HANGUL SYLLABLE JAEH +C7C8;H2 # Lo HANGUL SYLLABLE JYA +C7C9..C7E3;H3 # Lo [27] HANGUL SYLLABLE JYAG..HANGUL SYLLABLE JYAH +C7E4;H2 # Lo HANGUL SYLLABLE JYAE +C7E5..C7FF;H3 # Lo [27] HANGUL SYLLABLE JYAEG..HANGUL SYLLABLE JYAEH +C800;H2 # Lo HANGUL SYLLABLE JEO +C801..C81B;H3 # Lo [27] HANGUL SYLLABLE JEOG..HANGUL SYLLABLE JEOH +C81C;H2 # Lo HANGUL SYLLABLE JE +C81D..C837;H3 # Lo [27] HANGUL SYLLABLE JEG..HANGUL SYLLABLE JEH +C838;H2 # Lo HANGUL SYLLABLE JYEO +C839..C853;H3 # Lo [27] HANGUL SYLLABLE JYEOG..HANGUL SYLLABLE JYEOH +C854;H2 # Lo HANGUL SYLLABLE JYE +C855..C86F;H3 # Lo [27] HANGUL SYLLABLE JYEG..HANGUL SYLLABLE JYEH +C870;H2 # Lo HANGUL SYLLABLE JO +C871..C88B;H3 # Lo [27] HANGUL SYLLABLE JOG..HANGUL SYLLABLE JOH +C88C;H2 # Lo HANGUL SYLLABLE JWA +C88D..C8A7;H3 # Lo [27] HANGUL SYLLABLE JWAG..HANGUL SYLLABLE JWAH +C8A8;H2 # Lo HANGUL SYLLABLE JWAE +C8A9..C8C3;H3 # Lo [27] HANGUL SYLLABLE JWAEG..HANGUL SYLLABLE JWAEH +C8C4;H2 # Lo HANGUL SYLLABLE JOE +C8C5..C8DF;H3 # Lo [27] HANGUL SYLLABLE JOEG..HANGUL SYLLABLE JOEH +C8E0;H2 # Lo HANGUL SYLLABLE JYO +C8E1..C8FB;H3 # Lo [27] HANGUL SYLLABLE JYOG..HANGUL SYLLABLE JYOH +C8FC;H2 # Lo HANGUL SYLLABLE JU +C8FD..C917;H3 # Lo [27] HANGUL SYLLABLE JUG..HANGUL SYLLABLE JUH +C918;H2 # Lo HANGUL SYLLABLE JWEO +C919..C933;H3 # Lo [27] HANGUL SYLLABLE JWEOG..HANGUL SYLLABLE JWEOH +C934;H2 # Lo HANGUL SYLLABLE JWE +C935..C94F;H3 # Lo [27] HANGUL SYLLABLE JWEG..HANGUL SYLLABLE JWEH +C950;H2 # Lo HANGUL SYLLABLE JWI +C951..C96B;H3 # Lo [27] HANGUL SYLLABLE JWIG..HANGUL SYLLABLE JWIH +C96C;H2 # Lo HANGUL SYLLABLE JYU +C96D..C987;H3 # Lo [27] HANGUL SYLLABLE JYUG..HANGUL SYLLABLE JYUH +C988;H2 # Lo HANGUL SYLLABLE JEU +C989..C9A3;H3 # Lo [27] HANGUL SYLLABLE JEUG..HANGUL SYLLABLE JEUH +C9A4;H2 # Lo HANGUL SYLLABLE JYI +C9A5..C9BF;H3 # Lo [27] HANGUL SYLLABLE JYIG..HANGUL SYLLABLE JYIH +C9C0;H2 # Lo HANGUL SYLLABLE JI +C9C1..C9DB;H3 # Lo [27] HANGUL SYLLABLE JIG..HANGUL SYLLABLE JIH +C9DC;H2 # Lo HANGUL SYLLABLE JJA +C9DD..C9F7;H3 # Lo [27] HANGUL SYLLABLE JJAG..HANGUL SYLLABLE JJAH +C9F8;H2 # Lo HANGUL SYLLABLE JJAE +C9F9..CA13;H3 # Lo [27] HANGUL SYLLABLE JJAEG..HANGUL SYLLABLE JJAEH +CA14;H2 # Lo HANGUL SYLLABLE JJYA +CA15..CA2F;H3 # Lo [27] HANGUL SYLLABLE JJYAG..HANGUL SYLLABLE JJYAH +CA30;H2 # Lo HANGUL SYLLABLE JJYAE +CA31..CA4B;H3 # Lo [27] HANGUL SYLLABLE JJYAEG..HANGUL SYLLABLE JJYAEH +CA4C;H2 # Lo HANGUL SYLLABLE JJEO +CA4D..CA67;H3 # Lo [27] HANGUL SYLLABLE JJEOG..HANGUL SYLLABLE JJEOH +CA68;H2 # Lo HANGUL SYLLABLE JJE +CA69..CA83;H3 # Lo [27] HANGUL SYLLABLE JJEG..HANGUL SYLLABLE JJEH +CA84;H2 # Lo HANGUL SYLLABLE JJYEO +CA85..CA9F;H3 # Lo [27] HANGUL SYLLABLE JJYEOG..HANGUL SYLLABLE JJYEOH +CAA0;H2 # Lo HANGUL SYLLABLE JJYE +CAA1..CABB;H3 # Lo [27] HANGUL SYLLABLE JJYEG..HANGUL SYLLABLE JJYEH +CABC;H2 # Lo HANGUL SYLLABLE JJO +CABD..CAD7;H3 # Lo [27] HANGUL SYLLABLE JJOG..HANGUL SYLLABLE JJOH +CAD8;H2 # Lo HANGUL SYLLABLE JJWA +CAD9..CAF3;H3 # Lo [27] HANGUL SYLLABLE JJWAG..HANGUL SYLLABLE JJWAH +CAF4;H2 # Lo HANGUL SYLLABLE JJWAE +CAF5..CB0F;H3 # Lo [27] HANGUL SYLLABLE JJWAEG..HANGUL SYLLABLE JJWAEH +CB10;H2 # Lo HANGUL SYLLABLE JJOE +CB11..CB2B;H3 # Lo [27] HANGUL SYLLABLE JJOEG..HANGUL SYLLABLE JJOEH +CB2C;H2 # Lo HANGUL SYLLABLE JJYO +CB2D..CB47;H3 # Lo [27] HANGUL SYLLABLE JJYOG..HANGUL SYLLABLE JJYOH +CB48;H2 # Lo HANGUL SYLLABLE JJU +CB49..CB63;H3 # Lo [27] HANGUL SYLLABLE JJUG..HANGUL SYLLABLE JJUH +CB64;H2 # Lo HANGUL SYLLABLE JJWEO +CB65..CB7F;H3 # Lo [27] HANGUL SYLLABLE JJWEOG..HANGUL SYLLABLE JJWEOH +CB80;H2 # Lo HANGUL SYLLABLE JJWE +CB81..CB9B;H3 # Lo [27] HANGUL SYLLABLE JJWEG..HANGUL SYLLABLE JJWEH +CB9C;H2 # Lo HANGUL SYLLABLE JJWI +CB9D..CBB7;H3 # Lo [27] HANGUL SYLLABLE JJWIG..HANGUL SYLLABLE JJWIH +CBB8;H2 # Lo HANGUL SYLLABLE JJYU +CBB9..CBD3;H3 # Lo [27] HANGUL SYLLABLE JJYUG..HANGUL SYLLABLE JJYUH +CBD4;H2 # Lo HANGUL SYLLABLE JJEU +CBD5..CBEF;H3 # Lo [27] HANGUL SYLLABLE JJEUG..HANGUL SYLLABLE JJEUH +CBF0;H2 # Lo HANGUL SYLLABLE JJYI +CBF1..CC0B;H3 # Lo [27] HANGUL SYLLABLE JJYIG..HANGUL SYLLABLE JJYIH +CC0C;H2 # Lo HANGUL SYLLABLE JJI +CC0D..CC27;H3 # Lo [27] HANGUL SYLLABLE JJIG..HANGUL SYLLABLE JJIH +CC28;H2 # Lo HANGUL SYLLABLE CA +CC29..CC43;H3 # Lo [27] HANGUL SYLLABLE CAG..HANGUL SYLLABLE CAH +CC44;H2 # Lo HANGUL SYLLABLE CAE +CC45..CC5F;H3 # Lo [27] HANGUL SYLLABLE CAEG..HANGUL SYLLABLE CAEH +CC60;H2 # Lo HANGUL SYLLABLE CYA +CC61..CC7B;H3 # Lo [27] HANGUL SYLLABLE CYAG..HANGUL SYLLABLE CYAH +CC7C;H2 # Lo HANGUL SYLLABLE CYAE +CC7D..CC97;H3 # Lo [27] HANGUL SYLLABLE CYAEG..HANGUL SYLLABLE CYAEH +CC98;H2 # Lo HANGUL SYLLABLE CEO +CC99..CCB3;H3 # Lo [27] HANGUL SYLLABLE CEOG..HANGUL SYLLABLE CEOH +CCB4;H2 # Lo HANGUL SYLLABLE CE +CCB5..CCCF;H3 # Lo [27] HANGUL SYLLABLE CEG..HANGUL SYLLABLE CEH +CCD0;H2 # Lo HANGUL SYLLABLE CYEO +CCD1..CCEB;H3 # Lo [27] HANGUL SYLLABLE CYEOG..HANGUL SYLLABLE CYEOH +CCEC;H2 # Lo HANGUL SYLLABLE CYE +CCED..CD07;H3 # Lo [27] HANGUL SYLLABLE CYEG..HANGUL SYLLABLE CYEH +CD08;H2 # Lo HANGUL SYLLABLE CO +CD09..CD23;H3 # Lo [27] HANGUL SYLLABLE COG..HANGUL SYLLABLE COH +CD24;H2 # Lo HANGUL SYLLABLE CWA +CD25..CD3F;H3 # Lo [27] HANGUL SYLLABLE CWAG..HANGUL SYLLABLE CWAH +CD40;H2 # Lo HANGUL SYLLABLE CWAE +CD41..CD5B;H3 # Lo [27] HANGUL SYLLABLE CWAEG..HANGUL SYLLABLE CWAEH +CD5C;H2 # Lo HANGUL SYLLABLE COE +CD5D..CD77;H3 # Lo [27] HANGUL SYLLABLE COEG..HANGUL SYLLABLE COEH +CD78;H2 # Lo HANGUL SYLLABLE CYO +CD79..CD93;H3 # Lo [27] HANGUL SYLLABLE CYOG..HANGUL SYLLABLE CYOH +CD94;H2 # Lo HANGUL SYLLABLE CU +CD95..CDAF;H3 # Lo [27] HANGUL SYLLABLE CUG..HANGUL SYLLABLE CUH +CDB0;H2 # Lo HANGUL SYLLABLE CWEO +CDB1..CDCB;H3 # Lo [27] HANGUL SYLLABLE CWEOG..HANGUL SYLLABLE CWEOH +CDCC;H2 # Lo HANGUL SYLLABLE CWE +CDCD..CDE7;H3 # Lo [27] HANGUL SYLLABLE CWEG..HANGUL SYLLABLE CWEH +CDE8;H2 # Lo HANGUL SYLLABLE CWI +CDE9..CE03;H3 # Lo [27] HANGUL SYLLABLE CWIG..HANGUL SYLLABLE CWIH +CE04;H2 # Lo HANGUL SYLLABLE CYU +CE05..CE1F;H3 # Lo [27] HANGUL SYLLABLE CYUG..HANGUL SYLLABLE CYUH +CE20;H2 # Lo HANGUL SYLLABLE CEU +CE21..CE3B;H3 # Lo [27] HANGUL SYLLABLE CEUG..HANGUL SYLLABLE CEUH +CE3C;H2 # Lo HANGUL SYLLABLE CYI +CE3D..CE57;H3 # Lo [27] HANGUL SYLLABLE CYIG..HANGUL SYLLABLE CYIH +CE58;H2 # Lo HANGUL SYLLABLE CI +CE59..CE73;H3 # Lo [27] HANGUL SYLLABLE CIG..HANGUL SYLLABLE CIH +CE74;H2 # Lo HANGUL SYLLABLE KA +CE75..CE8F;H3 # Lo [27] HANGUL SYLLABLE KAG..HANGUL SYLLABLE KAH +CE90;H2 # Lo HANGUL SYLLABLE KAE +CE91..CEAB;H3 # Lo [27] HANGUL SYLLABLE KAEG..HANGUL SYLLABLE KAEH +CEAC;H2 # Lo HANGUL SYLLABLE KYA +CEAD..CEC7;H3 # Lo [27] HANGUL SYLLABLE KYAG..HANGUL SYLLABLE KYAH +CEC8;H2 # Lo HANGUL SYLLABLE KYAE +CEC9..CEE3;H3 # Lo [27] HANGUL SYLLABLE KYAEG..HANGUL SYLLABLE KYAEH +CEE4;H2 # Lo HANGUL SYLLABLE KEO +CEE5..CEFF;H3 # Lo [27] HANGUL SYLLABLE KEOG..HANGUL SYLLABLE KEOH +CF00;H2 # Lo HANGUL SYLLABLE KE +CF01..CF1B;H3 # Lo [27] HANGUL SYLLABLE KEG..HANGUL SYLLABLE KEH +CF1C;H2 # Lo HANGUL SYLLABLE KYEO +CF1D..CF37;H3 # Lo [27] HANGUL SYLLABLE KYEOG..HANGUL SYLLABLE KYEOH +CF38;H2 # Lo HANGUL SYLLABLE KYE +CF39..CF53;H3 # Lo [27] HANGUL SYLLABLE KYEG..HANGUL SYLLABLE KYEH +CF54;H2 # Lo HANGUL SYLLABLE KO +CF55..CF6F;H3 # Lo [27] HANGUL SYLLABLE KOG..HANGUL SYLLABLE KOH +CF70;H2 # Lo HANGUL SYLLABLE KWA +CF71..CF8B;H3 # Lo [27] HANGUL SYLLABLE KWAG..HANGUL SYLLABLE KWAH +CF8C;H2 # Lo HANGUL SYLLABLE KWAE +CF8D..CFA7;H3 # Lo [27] HANGUL SYLLABLE KWAEG..HANGUL SYLLABLE KWAEH +CFA8;H2 # Lo HANGUL SYLLABLE KOE +CFA9..CFC3;H3 # Lo [27] HANGUL SYLLABLE KOEG..HANGUL SYLLABLE KOEH +CFC4;H2 # Lo HANGUL SYLLABLE KYO +CFC5..CFDF;H3 # Lo [27] HANGUL SYLLABLE KYOG..HANGUL SYLLABLE KYOH +CFE0;H2 # Lo HANGUL SYLLABLE KU +CFE1..CFFB;H3 # Lo [27] HANGUL SYLLABLE KUG..HANGUL SYLLABLE KUH +CFFC;H2 # Lo HANGUL SYLLABLE KWEO +CFFD..D017;H3 # Lo [27] HANGUL SYLLABLE KWEOG..HANGUL SYLLABLE KWEOH +D018;H2 # Lo HANGUL SYLLABLE KWE +D019..D033;H3 # Lo [27] HANGUL SYLLABLE KWEG..HANGUL SYLLABLE KWEH +D034;H2 # Lo HANGUL SYLLABLE KWI +D035..D04F;H3 # Lo [27] HANGUL SYLLABLE KWIG..HANGUL SYLLABLE KWIH +D050;H2 # Lo HANGUL SYLLABLE KYU +D051..D06B;H3 # Lo [27] HANGUL SYLLABLE KYUG..HANGUL SYLLABLE KYUH +D06C;H2 # Lo HANGUL SYLLABLE KEU +D06D..D087;H3 # Lo [27] HANGUL SYLLABLE KEUG..HANGUL SYLLABLE KEUH +D088;H2 # Lo HANGUL SYLLABLE KYI +D089..D0A3;H3 # Lo [27] HANGUL SYLLABLE KYIG..HANGUL SYLLABLE KYIH +D0A4;H2 # Lo HANGUL SYLLABLE KI +D0A5..D0BF;H3 # Lo [27] HANGUL SYLLABLE KIG..HANGUL SYLLABLE KIH +D0C0;H2 # Lo HANGUL SYLLABLE TA +D0C1..D0DB;H3 # Lo [27] HANGUL SYLLABLE TAG..HANGUL SYLLABLE TAH +D0DC;H2 # Lo HANGUL SYLLABLE TAE +D0DD..D0F7;H3 # Lo [27] HANGUL SYLLABLE TAEG..HANGUL SYLLABLE TAEH +D0F8;H2 # Lo HANGUL SYLLABLE TYA +D0F9..D113;H3 # Lo [27] HANGUL SYLLABLE TYAG..HANGUL SYLLABLE TYAH +D114;H2 # Lo HANGUL SYLLABLE TYAE +D115..D12F;H3 # Lo [27] HANGUL SYLLABLE TYAEG..HANGUL SYLLABLE TYAEH +D130;H2 # Lo HANGUL SYLLABLE TEO +D131..D14B;H3 # Lo [27] HANGUL SYLLABLE TEOG..HANGUL SYLLABLE TEOH +D14C;H2 # Lo HANGUL SYLLABLE TE +D14D..D167;H3 # Lo [27] HANGUL SYLLABLE TEG..HANGUL SYLLABLE TEH +D168;H2 # Lo HANGUL SYLLABLE TYEO +D169..D183;H3 # Lo [27] HANGUL SYLLABLE TYEOG..HANGUL SYLLABLE TYEOH +D184;H2 # Lo HANGUL SYLLABLE TYE +D185..D19F;H3 # Lo [27] HANGUL SYLLABLE TYEG..HANGUL SYLLABLE TYEH +D1A0;H2 # Lo HANGUL SYLLABLE TO +D1A1..D1BB;H3 # Lo [27] HANGUL SYLLABLE TOG..HANGUL SYLLABLE TOH +D1BC;H2 # Lo HANGUL SYLLABLE TWA +D1BD..D1D7;H3 # Lo [27] HANGUL SYLLABLE TWAG..HANGUL SYLLABLE TWAH +D1D8;H2 # Lo HANGUL SYLLABLE TWAE +D1D9..D1F3;H3 # Lo [27] HANGUL SYLLABLE TWAEG..HANGUL SYLLABLE TWAEH +D1F4;H2 # Lo HANGUL SYLLABLE TOE +D1F5..D20F;H3 # Lo [27] HANGUL SYLLABLE TOEG..HANGUL SYLLABLE TOEH +D210;H2 # Lo HANGUL SYLLABLE TYO +D211..D22B;H3 # Lo [27] HANGUL SYLLABLE TYOG..HANGUL SYLLABLE TYOH +D22C;H2 # Lo HANGUL SYLLABLE TU +D22D..D247;H3 # Lo [27] HANGUL SYLLABLE TUG..HANGUL SYLLABLE TUH +D248;H2 # Lo HANGUL SYLLABLE TWEO +D249..D263;H3 # Lo [27] HANGUL SYLLABLE TWEOG..HANGUL SYLLABLE TWEOH +D264;H2 # Lo HANGUL SYLLABLE TWE +D265..D27F;H3 # Lo [27] HANGUL SYLLABLE TWEG..HANGUL SYLLABLE TWEH +D280;H2 # Lo HANGUL SYLLABLE TWI +D281..D29B;H3 # Lo [27] HANGUL SYLLABLE TWIG..HANGUL SYLLABLE TWIH +D29C;H2 # Lo HANGUL SYLLABLE TYU +D29D..D2B7;H3 # Lo [27] HANGUL SYLLABLE TYUG..HANGUL SYLLABLE TYUH +D2B8;H2 # Lo HANGUL SYLLABLE TEU +D2B9..D2D3;H3 # Lo [27] HANGUL SYLLABLE TEUG..HANGUL SYLLABLE TEUH +D2D4;H2 # Lo HANGUL SYLLABLE TYI +D2D5..D2EF;H3 # Lo [27] HANGUL SYLLABLE TYIG..HANGUL SYLLABLE TYIH +D2F0;H2 # Lo HANGUL SYLLABLE TI +D2F1..D30B;H3 # Lo [27] HANGUL SYLLABLE TIG..HANGUL SYLLABLE TIH +D30C;H2 # Lo HANGUL SYLLABLE PA +D30D..D327;H3 # Lo [27] HANGUL SYLLABLE PAG..HANGUL SYLLABLE PAH +D328;H2 # Lo HANGUL SYLLABLE PAE +D329..D343;H3 # Lo [27] HANGUL SYLLABLE PAEG..HANGUL SYLLABLE PAEH +D344;H2 # Lo HANGUL SYLLABLE PYA +D345..D35F;H3 # Lo [27] HANGUL SYLLABLE PYAG..HANGUL SYLLABLE PYAH +D360;H2 # Lo HANGUL SYLLABLE PYAE +D361..D37B;H3 # Lo [27] HANGUL SYLLABLE PYAEG..HANGUL SYLLABLE PYAEH +D37C;H2 # Lo HANGUL SYLLABLE PEO +D37D..D397;H3 # Lo [27] HANGUL SYLLABLE PEOG..HANGUL SYLLABLE PEOH +D398;H2 # Lo HANGUL SYLLABLE PE +D399..D3B3;H3 # Lo [27] HANGUL SYLLABLE PEG..HANGUL SYLLABLE PEH +D3B4;H2 # Lo HANGUL SYLLABLE PYEO +D3B5..D3CF;H3 # Lo [27] HANGUL SYLLABLE PYEOG..HANGUL SYLLABLE PYEOH +D3D0;H2 # Lo HANGUL SYLLABLE PYE +D3D1..D3EB;H3 # Lo [27] HANGUL SYLLABLE PYEG..HANGUL SYLLABLE PYEH +D3EC;H2 # Lo HANGUL SYLLABLE PO +D3ED..D407;H3 # Lo [27] HANGUL SYLLABLE POG..HANGUL SYLLABLE POH +D408;H2 # Lo HANGUL SYLLABLE PWA +D409..D423;H3 # Lo [27] HANGUL SYLLABLE PWAG..HANGUL SYLLABLE PWAH +D424;H2 # Lo HANGUL SYLLABLE PWAE +D425..D43F;H3 # Lo [27] HANGUL SYLLABLE PWAEG..HANGUL SYLLABLE PWAEH +D440;H2 # Lo HANGUL SYLLABLE POE +D441..D45B;H3 # Lo [27] HANGUL SYLLABLE POEG..HANGUL SYLLABLE POEH +D45C;H2 # Lo HANGUL SYLLABLE PYO +D45D..D477;H3 # Lo [27] HANGUL SYLLABLE PYOG..HANGUL SYLLABLE PYOH +D478;H2 # Lo HANGUL SYLLABLE PU +D479..D493;H3 # Lo [27] HANGUL SYLLABLE PUG..HANGUL SYLLABLE PUH +D494;H2 # Lo HANGUL SYLLABLE PWEO +D495..D4AF;H3 # Lo [27] HANGUL SYLLABLE PWEOG..HANGUL SYLLABLE PWEOH +D4B0;H2 # Lo HANGUL SYLLABLE PWE +D4B1..D4CB;H3 # Lo [27] HANGUL SYLLABLE PWEG..HANGUL SYLLABLE PWEH +D4CC;H2 # Lo HANGUL SYLLABLE PWI +D4CD..D4E7;H3 # Lo [27] HANGUL SYLLABLE PWIG..HANGUL SYLLABLE PWIH +D4E8;H2 # Lo HANGUL SYLLABLE PYU +D4E9..D503;H3 # Lo [27] HANGUL SYLLABLE PYUG..HANGUL SYLLABLE PYUH +D504;H2 # Lo HANGUL SYLLABLE PEU +D505..D51F;H3 # Lo [27] HANGUL SYLLABLE PEUG..HANGUL SYLLABLE PEUH +D520;H2 # Lo HANGUL SYLLABLE PYI +D521..D53B;H3 # Lo [27] HANGUL SYLLABLE PYIG..HANGUL SYLLABLE PYIH +D53C;H2 # Lo HANGUL SYLLABLE PI +D53D..D557;H3 # Lo [27] HANGUL SYLLABLE PIG..HANGUL SYLLABLE PIH +D558;H2 # Lo HANGUL SYLLABLE HA +D559..D573;H3 # Lo [27] HANGUL SYLLABLE HAG..HANGUL SYLLABLE HAH +D574;H2 # Lo HANGUL SYLLABLE HAE +D575..D58F;H3 # Lo [27] HANGUL SYLLABLE HAEG..HANGUL SYLLABLE HAEH +D590;H2 # Lo HANGUL SYLLABLE HYA +D591..D5AB;H3 # Lo [27] HANGUL SYLLABLE HYAG..HANGUL SYLLABLE HYAH +D5AC;H2 # Lo HANGUL SYLLABLE HYAE +D5AD..D5C7;H3 # Lo [27] HANGUL SYLLABLE HYAEG..HANGUL SYLLABLE HYAEH +D5C8;H2 # Lo HANGUL SYLLABLE HEO +D5C9..D5E3;H3 # Lo [27] HANGUL SYLLABLE HEOG..HANGUL SYLLABLE HEOH +D5E4;H2 # Lo HANGUL SYLLABLE HE +D5E5..D5FF;H3 # Lo [27] HANGUL SYLLABLE HEG..HANGUL SYLLABLE HEH +D600;H2 # Lo HANGUL SYLLABLE HYEO +D601..D61B;H3 # Lo [27] HANGUL SYLLABLE HYEOG..HANGUL SYLLABLE HYEOH +D61C;H2 # Lo HANGUL SYLLABLE HYE +D61D..D637;H3 # Lo [27] HANGUL SYLLABLE HYEG..HANGUL SYLLABLE HYEH +D638;H2 # Lo HANGUL SYLLABLE HO +D639..D653;H3 # Lo [27] HANGUL SYLLABLE HOG..HANGUL SYLLABLE HOH +D654;H2 # Lo HANGUL SYLLABLE HWA +D655..D66F;H3 # Lo [27] HANGUL SYLLABLE HWAG..HANGUL SYLLABLE HWAH +D670;H2 # Lo HANGUL SYLLABLE HWAE +D671..D68B;H3 # Lo [27] HANGUL SYLLABLE HWAEG..HANGUL SYLLABLE HWAEH +D68C;H2 # Lo HANGUL SYLLABLE HOE +D68D..D6A7;H3 # Lo [27] HANGUL SYLLABLE HOEG..HANGUL SYLLABLE HOEH +D6A8;H2 # Lo HANGUL SYLLABLE HYO +D6A9..D6C3;H3 # Lo [27] HANGUL SYLLABLE HYOG..HANGUL SYLLABLE HYOH +D6C4;H2 # Lo HANGUL SYLLABLE HU +D6C5..D6DF;H3 # Lo [27] HANGUL SYLLABLE HUG..HANGUL SYLLABLE HUH +D6E0;H2 # Lo HANGUL SYLLABLE HWEO +D6E1..D6FB;H3 # Lo [27] HANGUL SYLLABLE HWEOG..HANGUL SYLLABLE HWEOH +D6FC;H2 # Lo HANGUL SYLLABLE HWE +D6FD..D717;H3 # Lo [27] HANGUL SYLLABLE HWEG..HANGUL SYLLABLE HWEH +D718;H2 # Lo HANGUL SYLLABLE HWI +D719..D733;H3 # Lo [27] HANGUL SYLLABLE HWIG..HANGUL SYLLABLE HWIH +D734;H2 # Lo HANGUL SYLLABLE HYU +D735..D74F;H3 # Lo [27] HANGUL SYLLABLE HYUG..HANGUL SYLLABLE HYUH +D750;H2 # Lo HANGUL SYLLABLE HEU +D751..D76B;H3 # Lo [27] HANGUL SYLLABLE HEUG..HANGUL SYLLABLE HEUH +D76C;H2 # Lo HANGUL SYLLABLE HYI +D76D..D787;H3 # Lo [27] HANGUL SYLLABLE HYIG..HANGUL SYLLABLE HYIH +D788;H2 # Lo HANGUL SYLLABLE HI +D789..D7A3;H3 # Lo [27] HANGUL SYLLABLE HIG..HANGUL SYLLABLE HIH +D7B0..D7C6;JV # Lo [23] HANGUL JUNGSEONG O-YEO..HANGUL JUNGSEONG ARAEA-E +D7CB..D7FB;JT # Lo [49] HANGUL JONGSEONG NIEUN-RIEUL..HANGUL JONGSEONG PHIEUPH-THIEUTH +D800..DB7F;SG # Cs [896] .. +DB80..DBFF;SG # Cs [128] .. +DC00..DFFF;SG # Cs [1024] .. +E000..F8FF;XX # Co [6400] .. +F900..FA6D;ID # Lo [366] CJK COMPATIBILITY IDEOGRAPH-F900..CJK COMPATIBILITY IDEOGRAPH-FA6D +FA6E..FA6F;ID # Cn [2] .. +FA70..FAD9;ID # Lo [106] CJK COMPATIBILITY IDEOGRAPH-FA70..CJK COMPATIBILITY IDEOGRAPH-FAD9 +FADA..FAFF;ID # Cn [38] .. +FB00..FB06;AL # Ll [7] LATIN SMALL LIGATURE FF..LATIN SMALL LIGATURE ST +FB13..FB17;AL # Ll [5] ARMENIAN SMALL LIGATURE MEN NOW..ARMENIAN SMALL LIGATURE MEN XEH +FB1D;HL # Lo HEBREW LETTER YOD WITH HIRIQ +FB1E;CM # Mn HEBREW POINT JUDEO-SPANISH VARIKA +FB1F..FB28;HL # Lo [10] HEBREW LIGATURE YIDDISH YOD YOD PATAH..HEBREW LETTER WIDE TAV +FB29;AL # Sm HEBREW LETTER ALTERNATIVE PLUS SIGN +FB2A..FB36;HL # Lo [13] HEBREW LETTER SHIN WITH SHIN DOT..HEBREW LETTER ZAYIN WITH DAGESH +FB38..FB3C;HL # Lo [5] HEBREW LETTER TET WITH DAGESH..HEBREW LETTER LAMED WITH DAGESH +FB3E;HL # Lo HEBREW LETTER MEM WITH DAGESH +FB40..FB41;HL # Lo [2] HEBREW LETTER NUN WITH DAGESH..HEBREW LETTER SAMEKH WITH DAGESH +FB43..FB44;HL # Lo [2] HEBREW LETTER FINAL PE WITH DAGESH..HEBREW LETTER PE WITH DAGESH +FB46..FB4F;HL # Lo [10] HEBREW LETTER TSADI WITH DAGESH..HEBREW LIGATURE ALEF LAMED +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 +FBD3..FD3D;AL # Lo [363] ARABIC LETTER NG ISOLATED FORM..ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM +FD3E;CL # Pe ORNATE LEFT PARENTHESIS +FD3F;OP # Ps ORNATE RIGHT PARENTHESIS +FD50..FD8F;AL # Lo [64] ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM..ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM +FD92..FDC7;AL # Lo [54] ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM..ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM +FDF0..FDFB;AL # Lo [12] ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM..ARABIC LIGATURE JALLAJALALOUHOU +FDFC;PO # Sc RIAL SIGN +FDFD;AL # So ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM +FE00..FE0F;CM # Mn [16] VARIATION SELECTOR-1..VARIATION SELECTOR-16 +FE10;IS # Po PRESENTATION FORM FOR VERTICAL COMMA +FE11..FE12;CL # Po [2] PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC COMMA..PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC FULL STOP +FE13..FE14;IS # Po [2] PRESENTATION FORM FOR VERTICAL COLON..PRESENTATION FORM FOR VERTICAL SEMICOLON +FE15..FE16;EX # Po [2] PRESENTATION FORM FOR VERTICAL EXCLAMATION MARK..PRESENTATION FORM FOR VERTICAL QUESTION MARK +FE17;OP # Ps PRESENTATION FORM FOR VERTICAL LEFT WHITE LENTICULAR BRACKET +FE18;CL # Pe PRESENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRAKCET +FE19;IN # Po PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS +FE20..FE2F;CM # Mn [16] COMBINING LIGATURE LEFT HALF..COMBINING CYRILLIC TITLO RIGHT HALF +FE30;ID # Po PRESENTATION FORM FOR VERTICAL TWO DOT LEADER +FE31..FE32;ID # Pd [2] PRESENTATION FORM FOR VERTICAL EM DASH..PRESENTATION FORM FOR VERTICAL EN DASH +FE33..FE34;ID # Pc [2] PRESENTATION FORM FOR VERTICAL LOW LINE..PRESENTATION FORM FOR VERTICAL WAVY LOW LINE +FE35;OP # Ps PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS +FE36;CL # Pe PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS +FE37;OP # Ps PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET +FE38;CL # Pe PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET +FE39;OP # Ps PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET +FE3A;CL # Pe PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET +FE3B;OP # Ps PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET +FE3C;CL # Pe PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET +FE3D;OP # Ps PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET +FE3E;CL # Pe PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET +FE3F;OP # Ps PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET +FE40;CL # Pe PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET +FE41;OP # Ps PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET +FE42;CL # Pe PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET +FE43;OP # Ps PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET +FE44;CL # Pe PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET +FE45..FE46;ID # Po [2] SESAME DOT..WHITE SESAME DOT +FE47;OP # Ps PRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKET +FE48;CL # Pe PRESENTATION FORM FOR VERTICAL RIGHT SQUARE BRACKET +FE49..FE4C;ID # Po [4] DASHED OVERLINE..DOUBLE WAVY OVERLINE +FE4D..FE4F;ID # Pc [3] DASHED LOW LINE..WAVY LOW LINE +FE50;CL # Po SMALL COMMA +FE51;ID # Po SMALL IDEOGRAPHIC COMMA +FE52;CL # Po SMALL FULL STOP +FE54..FE55;NS # Po [2] SMALL SEMICOLON..SMALL COLON +FE56..FE57;EX # Po [2] SMALL QUESTION MARK..SMALL EXCLAMATION MARK +FE58;ID # Pd SMALL EM DASH +FE59;OP # Ps SMALL LEFT PARENTHESIS +FE5A;CL # Pe SMALL RIGHT PARENTHESIS +FE5B;OP # Ps SMALL LEFT CURLY BRACKET +FE5C;CL # Pe SMALL RIGHT CURLY BRACKET +FE5D;OP # Ps SMALL LEFT TORTOISE SHELL BRACKET +FE5E;CL # Pe SMALL RIGHT TORTOISE SHELL BRACKET +FE5F..FE61;ID # Po [3] SMALL NUMBER SIGN..SMALL ASTERISK +FE62;ID # Sm SMALL PLUS SIGN +FE63;ID # Pd SMALL HYPHEN-MINUS +FE64..FE66;ID # Sm [3] SMALL LESS-THAN SIGN..SMALL EQUALS SIGN +FE68;ID # Po SMALL REVERSE SOLIDUS +FE69;PR # Sc SMALL DOLLAR SIGN +FE6A;PO # Po SMALL PERCENT SIGN +FE6B;ID # Po SMALL COMMERCIAL AT +FE70..FE74;AL # Lo [5] ARABIC FATHATAN ISOLATED FORM..ARABIC KASRATAN ISOLATED FORM +FE76..FEFC;AL # Lo [135] ARABIC FATHA ISOLATED FORM..ARABIC LIGATURE LAM WITH ALEF FINAL FORM +FEFF;WJ # Cf ZERO WIDTH NO-BREAK SPACE +FF01;EX # Po FULLWIDTH EXCLAMATION MARK +FF02..FF03;ID # Po [2] FULLWIDTH QUOTATION MARK..FULLWIDTH NUMBER SIGN +FF04;PR # Sc FULLWIDTH DOLLAR SIGN +FF05;PO # Po FULLWIDTH PERCENT SIGN +FF06..FF07;ID # Po [2] FULLWIDTH AMPERSAND..FULLWIDTH APOSTROPHE +FF08;OP # Ps FULLWIDTH LEFT PARENTHESIS +FF09;CL # Pe FULLWIDTH RIGHT PARENTHESIS +FF0A;ID # Po FULLWIDTH ASTERISK +FF0B;ID # Sm FULLWIDTH PLUS SIGN +FF0C;CL # Po FULLWIDTH COMMA +FF0D;ID # Pd FULLWIDTH HYPHEN-MINUS +FF0E;CL # Po FULLWIDTH FULL STOP +FF0F;ID # Po FULLWIDTH SOLIDUS +FF10..FF19;ID # Nd [10] FULLWIDTH DIGIT ZERO..FULLWIDTH DIGIT NINE +FF1A..FF1B;NS # Po [2] FULLWIDTH COLON..FULLWIDTH SEMICOLON +FF1C..FF1E;ID # Sm [3] FULLWIDTH LESS-THAN SIGN..FULLWIDTH GREATER-THAN SIGN +FF1F;EX # Po FULLWIDTH QUESTION MARK +FF20;ID # Po FULLWIDTH COMMERCIAL AT +FF21..FF3A;ID # Lu [26] FULLWIDTH LATIN CAPITAL LETTER A..FULLWIDTH LATIN CAPITAL LETTER Z +FF3B;OP # Ps FULLWIDTH LEFT SQUARE BRACKET +FF3C;ID # Po FULLWIDTH REVERSE SOLIDUS +FF3D;CL # Pe FULLWIDTH RIGHT SQUARE BRACKET +FF3E;ID # Sk FULLWIDTH CIRCUMFLEX ACCENT +FF3F;ID # Pc FULLWIDTH LOW LINE +FF40;ID # Sk FULLWIDTH GRAVE ACCENT +FF41..FF5A;ID # Ll [26] FULLWIDTH LATIN SMALL LETTER A..FULLWIDTH LATIN SMALL LETTER Z +FF5B;OP # Ps FULLWIDTH LEFT CURLY BRACKET +FF5C;ID # Sm FULLWIDTH VERTICAL LINE +FF5D;CL # Pe FULLWIDTH RIGHT CURLY BRACKET +FF5E;ID # Sm FULLWIDTH TILDE +FF5F;OP # Ps FULLWIDTH LEFT WHITE PARENTHESIS +FF60;CL # Pe FULLWIDTH RIGHT WHITE PARENTHESIS +FF61;CL # Po HALFWIDTH IDEOGRAPHIC FULL STOP +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;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;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;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 +FFE3;ID # Sk FULLWIDTH MACRON +FFE4;ID # So FULLWIDTH BROKEN BAR +FFE5..FFE6;PR # Sc [2] FULLWIDTH YEN SIGN..FULLWIDTH WON SIGN +FFE8;AL # So HALFWIDTH FORMS LIGHT VERTICAL +FFE9..FFEC;AL # Sm [4] HALFWIDTH LEFTWARDS ARROW..HALFWIDTH DOWNWARDS ARROW +FFED..FFEE;AL # So [2] HALFWIDTH BLACK SQUARE..HALFWIDTH WHITE CIRCLE +FFF9..FFFB;CM # Cf [3] INTERLINEAR ANNOTATION ANCHOR..INTERLINEAR ANNOTATION TERMINATOR +FFFC;CB # So OBJECT REPLACEMENT CHARACTER +FFFD;AI # So REPLACEMENT CHARACTER +10000..1000B;AL # Lo [12] LINEAR B SYLLABLE B008 A..LINEAR B SYLLABLE B046 JE +1000D..10026;AL # Lo [26] LINEAR B SYLLABLE B036 JO..LINEAR B SYLLABLE B032 QO +10028..1003A;AL # Lo [19] LINEAR B SYLLABLE B060 RA..LINEAR B SYLLABLE B042 WO +1003C..1003D;AL # Lo [2] LINEAR B SYLLABLE B017 ZA..LINEAR B SYLLABLE B074 ZE +1003F..1004D;AL # Lo [15] LINEAR B SYLLABLE B020 ZO..LINEAR B SYLLABLE B091 TWO +10050..1005D;AL # Lo [14] LINEAR B SYMBOL B018..LINEAR B SYMBOL B089 +10080..100FA;AL # Lo [123] LINEAR B IDEOGRAM B100 MAN..LINEAR B IDEOGRAM VESSEL B305 +10100..10102;BA # Po [3] AEGEAN WORD SEPARATOR LINE..AEGEAN CHECK MARK +10107..10133;AL # No [45] AEGEAN NUMBER ONE..AEGEAN NUMBER NINETY THOUSAND +10137..1013F;AL # So [9] AEGEAN WEIGHT BASE UNIT..AEGEAN MEASURE THIRD SUBUNIT +10140..10174;AL # Nl [53] GREEK ACROPHONIC ATTIC ONE QUARTER..GREEK ACROPHONIC STRATIAN FIFTY MNAS +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..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 +101FD;CM # Mn PHAISTOS DISC SIGN COMBINING OBLIQUE STROKE +10280..1029C;AL # Lo [29] LYCIAN LETTER A..LYCIAN LETTER X +102A0..102D0;AL # Lo [49] CARIAN LETTER A..CARIAN LETTER UUU3 +102E0;CM # Mn COPTIC EPACT THOUSANDS MARK +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 +1034A;AL # Nl GOTHIC LETTER NINE HUNDRED +10350..10375;AL # Lo [38] OLD PERMIC LETTER AN..OLD PERMIC LETTER IA +10376..1037A;CM # Mn [5] COMBINING OLD PERMIC LETTER AN..COMBINING OLD PERMIC LETTER SII +10380..1039D;AL # Lo [30] UGARITIC LETTER ALPA..UGARITIC LETTER SSU +1039F;BA # Po UGARITIC WORD DIVIDER +103A0..103C3;AL # Lo [36] OLD PERSIAN SIGN A..OLD PERSIAN SIGN HA +103C8..103CF;AL # Lo [8] OLD PERSIAN SIGN AURAMAZDAA..OLD PERSIAN SIGN BUUMISH +103D0;BA # Po OLD PERSIAN WORD DIVIDER +103D1..103D5;AL # Nl [5] OLD PERSIAN NUMBER ONE..OLD PERSIAN NUMBER HUNDRED +10400..1044F;AL # L& [80] DESERET CAPITAL LETTER LONG I..DESERET SMALL LETTER EW +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 +10600..10736;AL # Lo [311] LINEAR A SIGN AB001..LINEAR A SIGN A664 +10740..10755;AL # Lo [22] LINEAR A SIGN A701 A..LINEAR A SIGN A732 JE +10760..10767;AL # Lo [8] LINEAR A SIGN A800..LINEAR A SIGN A807 +10800..10805;AL # Lo [6] CYPRIOT SYLLABLE A..CYPRIOT SYLLABLE JA +10808;AL # Lo CYPRIOT SYLLABLE JO +1080A..10835;AL # Lo [44] CYPRIOT SYLLABLE KA..CYPRIOT SYLLABLE WO +10837..10838;AL # Lo [2] CYPRIOT SYLLABLE XA..CYPRIOT SYLLABLE XE +1083C;AL # Lo CYPRIOT SYLLABLE ZA +1083F;AL # Lo CYPRIOT SYLLABLE ZO +10840..10855;AL # Lo [22] IMPERIAL ARAMAIC LETTER ALEPH..IMPERIAL ARAMAIC LETTER TAW +10857;BA # Po IMPERIAL ARAMAIC SECTION SIGN +10858..1085F;AL # No [8] IMPERIAL ARAMAIC NUMBER ONE..IMPERIAL ARAMAIC NUMBER TEN THOUSAND +10860..10876;AL # Lo [23] PALMYRENE LETTER ALEPH..PALMYRENE LETTER TAW +10877..10878;AL # So [2] PALMYRENE LEFT-POINTING FLEURON..PALMYRENE RIGHT-POINTING FLEURON +10879..1087F;AL # No [7] PALMYRENE NUMBER ONE..PALMYRENE NUMBER TWENTY +10880..1089E;AL # Lo [31] NABATAEAN LETTER FINAL ALEPH..NABATAEAN LETTER TAW +108A7..108AF;AL # No [9] NABATAEAN NUMBER ONE..NABATAEAN NUMBER ONE HUNDRED +108E0..108F2;AL # Lo [19] HATRAN LETTER ALEPH..HATRAN LETTER QOPH +108F4..108F5;AL # Lo [2] HATRAN LETTER SHIN..HATRAN LETTER TAW +108FB..108FF;AL # No [5] HATRAN NUMBER ONE..HATRAN NUMBER ONE HUNDRED +10900..10915;AL # Lo [22] PHOENICIAN LETTER ALF..PHOENICIAN LETTER TAU +10916..1091B;AL # No [6] PHOENICIAN NUMBER ONE..PHOENICIAN NUMBER THREE +1091F;BA # Po PHOENICIAN WORD SEPARATOR +10920..10939;AL # Lo [26] LYDIAN LETTER A..LYDIAN LETTER C +1093F;AL # Po LYDIAN TRIANGULAR MARK +10980..1099F;AL # Lo [32] MEROITIC HIEROGLYPHIC LETTER A..MEROITIC HIEROGLYPHIC SYMBOL VIDJ-2 +109A0..109B7;AL # Lo [24] MEROITIC CURSIVE LETTER A..MEROITIC CURSIVE LETTER DA +109BC..109BD;AL # No [2] MEROITIC CURSIVE FRACTION ELEVEN TWELFTHS..MEROITIC CURSIVE FRACTION ONE HALF +109BE..109BF;AL # Lo [2] MEROITIC CURSIVE LOGOGRAM RMT..MEROITIC CURSIVE LOGOGRAM IMN +109C0..109CF;AL # No [16] MEROITIC CURSIVE NUMBER ONE..MEROITIC CURSIVE NUMBER SEVENTY +109D2..109FF;AL # No [46] MEROITIC CURSIVE NUMBER ONE HUNDRED..MEROITIC CURSIVE FRACTION TEN TWELFTHS +10A00;AL # Lo KHAROSHTHI LETTER A +10A01..10A03;CM # Mn [3] KHAROSHTHI VOWEL SIGN I..KHAROSHTHI VOWEL SIGN VOCALIC R +10A05..10A06;CM # Mn [2] KHAROSHTHI VOWEL SIGN E..KHAROSHTHI VOWEL SIGN O +10A0C..10A0F;CM # Mn [4] KHAROSHTHI VOWEL LENGTH MARK..KHAROSHTHI SIGN VISARGA +10A10..10A13;AL # Lo [4] KHAROSHTHI LETTER KA..KHAROSHTHI LETTER GHA +10A15..10A17;AL # Lo [3] KHAROSHTHI LETTER CA..KHAROSHTHI LETTER JA +10A19..10A35;AL # Lo [29] KHAROSHTHI LETTER NYA..KHAROSHTHI LETTER VHA +10A38..10A3A;CM # Mn [3] KHAROSHTHI SIGN BAR ABOVE..KHAROSHTHI SIGN DOT BELOW +10A3F;CM # Mn KHAROSHTHI VIRAMA +10A40..10A48;AL # No [9] KHAROSHTHI DIGIT ONE..KHAROSHTHI FRACTION ONE HALF +10A50..10A57;BA # Po [8] KHAROSHTHI PUNCTUATION DOT..KHAROSHTHI PUNCTUATION DOUBLE DANDA +10A58;AL # Po KHAROSHTHI PUNCTUATION LINES +10A60..10A7C;AL # Lo [29] OLD SOUTH ARABIAN LETTER HE..OLD SOUTH ARABIAN LETTER THETH +10A7D..10A7E;AL # No [2] OLD SOUTH ARABIAN NUMBER ONE..OLD SOUTH ARABIAN NUMBER FIFTY +10A7F;AL # Po OLD SOUTH ARABIAN NUMERIC INDICATOR +10A80..10A9C;AL # Lo [29] OLD NORTH ARABIAN LETTER HEH..OLD NORTH ARABIAN LETTER ZAH +10A9D..10A9F;AL # No [3] OLD NORTH ARABIAN NUMBER ONE..OLD NORTH ARABIAN NUMBER TWENTY +10AC0..10AC7;AL # Lo [8] MANICHAEAN LETTER ALEPH..MANICHAEAN LETTER WAW +10AC8;AL # So MANICHAEAN SIGN UD +10AC9..10AE4;AL # Lo [28] MANICHAEAN LETTER ZAYIN..MANICHAEAN LETTER TAW +10AE5..10AE6;CM # Mn [2] MANICHAEAN ABBREVIATION MARK ABOVE..MANICHAEAN ABBREVIATION MARK BELOW +10AEB..10AEF;AL # No [5] MANICHAEAN NUMBER ONE..MANICHAEAN NUMBER ONE HUNDRED +10AF0..10AF5;BA # Po [6] MANICHAEAN PUNCTUATION STAR..MANICHAEAN PUNCTUATION TWO DOTS +10AF6;IN # Po MANICHAEAN PUNCTUATION LINE FILLER +10B00..10B35;AL # Lo [54] AVESTAN LETTER A..AVESTAN LETTER HE +10B39..10B3F;BA # Po [7] AVESTAN ABBREVIATION MARK..LARGE ONE RING OVER TWO RINGS PUNCTUATION +10B40..10B55;AL # Lo [22] INSCRIPTIONAL PARTHIAN LETTER ALEPH..INSCRIPTIONAL PARTHIAN LETTER TAW +10B58..10B5F;AL # No [8] INSCRIPTIONAL PARTHIAN NUMBER ONE..INSCRIPTIONAL PARTHIAN NUMBER ONE THOUSAND +10B60..10B72;AL # Lo [19] INSCRIPTIONAL PAHLAVI LETTER ALEPH..INSCRIPTIONAL PAHLAVI LETTER TAW +10B78..10B7F;AL # No [8] INSCRIPTIONAL PAHLAVI NUMBER ONE..INSCRIPTIONAL PAHLAVI NUMBER ONE THOUSAND +10B80..10B91;AL # Lo [18] PSALTER PAHLAVI LETTER ALEPH..PSALTER PAHLAVI LETTER TAW +10B99..10B9C;AL # Po [4] PSALTER PAHLAVI SECTION MARK..PSALTER PAHLAVI FOUR DOTS WITH DOT +10BA9..10BAF;AL # No [7] PSALTER PAHLAVI NUMBER ONE..PSALTER PAHLAVI NUMBER ONE HUNDRED +10C00..10C48;AL # Lo [73] OLD TURKIC LETTER ORKHON A..OLD TURKIC LETTER ORKHON BASH +10C80..10CB2;AL # Lu [51] OLD HUNGARIAN CAPITAL LETTER A..OLD HUNGARIAN CAPITAL LETTER US +10CC0..10CF2;AL # Ll [51] OLD HUNGARIAN SMALL LETTER A..OLD HUNGARIAN SMALL LETTER US +10CFA..10CFF;AL # No [6] OLD HUNGARIAN NUMBER ONE..OLD HUNGARIAN NUMBER ONE THOUSAND +10D00..10D23;AL # Lo [36] HANIFI ROHINGYA LETTER A..HANIFI ROHINGYA MARK NA KHONNA +10D24..10D27;CM # Mn [4] HANIFI ROHINGYA SIGN HARBAHAY..HANIFI ROHINGYA SIGN TASSI +10D30..10D39;NU # Nd [10] HANIFI ROHINGYA DIGIT ZERO..HANIFI ROHINGYA DIGIT NINE +10E60..10E7E;AL # No [31] RUMI DIGIT ONE..RUMI FRACTION TWO THIRDS +10F00..10F1C;AL # Lo [29] OLD SOGDIAN LETTER ALEPH..OLD SOGDIAN LETTER FINAL TAW WITH VERTICAL TAIL +10F1D..10F26;AL # No [10] OLD SOGDIAN NUMBER ONE..OLD SOGDIAN FRACTION ONE HALF +10F27;AL # Lo OLD SOGDIAN LIGATURE AYIN-DALETH +10F30..10F45;AL # Lo [22] SOGDIAN LETTER ALEPH..SOGDIAN INDEPENDENT SHIN +10F46..10F50;CM # Mn [11] SOGDIAN COMBINING DOT BELOW..SOGDIAN COMBINING STROKE BELOW +10F51..10F54;AL # No [4] SOGDIAN NUMBER ONE..SOGDIAN NUMBER ONE HUNDRED +10F55..10F59;AL # Po [5] SOGDIAN PUNCTUATION TWO VERTICAL BARS..SOGDIAN PUNCTUATION HALF CIRCLE WITH DOT +11000;CM # Mc BRAHMI SIGN CANDRABINDU +11001;CM # Mn BRAHMI SIGN ANUSVARA +11002;CM # Mc BRAHMI SIGN VISARGA +11003..11037;AL # Lo [53] BRAHMI SIGN JIHVAMULIYA..BRAHMI LETTER OLD TAMIL NNNA +11038..11046;CM # Mn [15] BRAHMI VOWEL SIGN AA..BRAHMI VIRAMA +11047..11048;BA # Po [2] BRAHMI DANDA..BRAHMI DOUBLE DANDA +11049..1104D;AL # Po [5] BRAHMI PUNCTUATION DOT..BRAHMI PUNCTUATION LOTUS +11052..11065;AL # No [20] BRAHMI NUMBER ONE..BRAHMI NUMBER ONE THOUSAND +11066..1106F;NU # Nd [10] BRAHMI DIGIT ZERO..BRAHMI DIGIT NINE +1107F;CM # Mn BRAHMI NUMBER JOINER +11080..11081;CM # Mn [2] KAITHI SIGN CANDRABINDU..KAITHI SIGN ANUSVARA +11082;CM # Mc KAITHI SIGN VISARGA +11083..110AF;AL # Lo [45] KAITHI LETTER A..KAITHI LETTER HA +110B0..110B2;CM # Mc [3] KAITHI VOWEL SIGN AA..KAITHI VOWEL SIGN II +110B3..110B6;CM # Mn [4] KAITHI VOWEL SIGN U..KAITHI VOWEL SIGN AI +110B7..110B8;CM # Mc [2] KAITHI VOWEL SIGN O..KAITHI VOWEL SIGN AU +110B9..110BA;CM # Mn [2] KAITHI SIGN VIRAMA..KAITHI SIGN NUKTA +110BB..110BC;AL # Po [2] KAITHI ABBREVIATION SIGN..KAITHI ENUMERATION SIGN +110BD;AL # Cf KAITHI NUMBER SIGN +110BE..110C1;BA # Po [4] KAITHI SECTION MARK..KAITHI DOUBLE DANDA +110CD;AL # Cf KAITHI NUMBER SIGN ABOVE +110D0..110E8;AL # Lo [25] SORA SOMPENG LETTER SAH..SORA SOMPENG LETTER MAE +110F0..110F9;NU # Nd [10] SORA SOMPENG DIGIT ZERO..SORA SOMPENG DIGIT NINE +11100..11102;CM # Mn [3] CHAKMA SIGN CANDRABINDU..CHAKMA SIGN VISARGA +11103..11126;AL # Lo [36] CHAKMA LETTER AA..CHAKMA LETTER HAA +11127..1112B;CM # Mn [5] CHAKMA VOWEL SIGN A..CHAKMA VOWEL SIGN UU +1112C;CM # Mc CHAKMA VOWEL SIGN E +1112D..11134;CM # Mn [8] CHAKMA VOWEL SIGN AI..CHAKMA MAAYYAA +11136..1113F;NU # Nd [10] CHAKMA DIGIT ZERO..CHAKMA DIGIT NINE +11140..11143;BA # Po [4] CHAKMA SECTION MARK..CHAKMA QUESTION MARK +11144;AL # Lo CHAKMA LETTER LHAA +11145..11146;CM # Mc [2] CHAKMA VOWEL SIGN AA..CHAKMA VOWEL SIGN EI +11150..11172;AL # Lo [35] MAHAJANI LETTER A..MAHAJANI LETTER RRA +11173;CM # Mn MAHAJANI SIGN NUKTA +11174;AL # Po MAHAJANI ABBREVIATION SIGN +11175;BB # Po MAHAJANI SECTION MARK +11176;AL # Lo MAHAJANI LIGATURE SHRI +11180..11181;CM # Mn [2] SHARADA SIGN CANDRABINDU..SHARADA SIGN ANUSVARA +11182;CM # Mc SHARADA SIGN VISARGA +11183..111B2;AL # Lo [48] SHARADA LETTER A..SHARADA LETTER HA +111B3..111B5;CM # Mc [3] SHARADA VOWEL SIGN AA..SHARADA VOWEL SIGN II +111B6..111BE;CM # Mn [9] SHARADA VOWEL SIGN U..SHARADA VOWEL SIGN O +111BF..111C0;CM # Mc [2] SHARADA VOWEL SIGN AU..SHARADA SIGN VIRAMA +111C1..111C4;AL # Lo [4] SHARADA SIGN AVAGRAHA..SHARADA OM +111C5..111C6;BA # Po [2] SHARADA DANDA..SHARADA DOUBLE DANDA +111C7;AL # Po SHARADA ABBREVIATION SIGN +111C8;BA # Po SHARADA SEPARATOR +111C9..111CC;CM # Mn [4] SHARADA SANDHI MARK..SHARADA EXTRA SHORT VOWEL MARK +111CD;AL # Po SHARADA SUTRA MARK +111D0..111D9;NU # Nd [10] SHARADA DIGIT ZERO..SHARADA DIGIT NINE +111DA;AL # Lo SHARADA EKAM +111DB;BB # Po SHARADA SIGN SIDDHAM +111DC;AL # Lo SHARADA HEADSTROKE +111DD..111DF;BA # Po [3] SHARADA CONTINUATION SIGN..SHARADA SECTION MARK-2 +111E1..111F4;AL # No [20] SINHALA ARCHAIC DIGIT ONE..SINHALA ARCHAIC NUMBER ONE THOUSAND +11200..11211;AL # Lo [18] KHOJKI LETTER A..KHOJKI LETTER JJA +11213..1122B;AL # Lo [25] KHOJKI LETTER NYA..KHOJKI LETTER LLA +1122C..1122E;CM # Mc [3] KHOJKI VOWEL SIGN AA..KHOJKI VOWEL SIGN II +1122F..11231;CM # Mn [3] KHOJKI VOWEL SIGN U..KHOJKI VOWEL SIGN AI +11232..11233;CM # Mc [2] KHOJKI VOWEL SIGN O..KHOJKI VOWEL SIGN AU +11234;CM # Mn KHOJKI SIGN ANUSVARA +11235;CM # Mc KHOJKI SIGN VIRAMA +11236..11237;CM # Mn [2] KHOJKI SIGN NUKTA..KHOJKI SIGN SHADDA +11238..11239;BA # Po [2] KHOJKI DANDA..KHOJKI DOUBLE DANDA +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 +1128F..1129D;AL # Lo [15] MULTANI LETTER NYA..MULTANI LETTER BA +1129F..112A8;AL # Lo [10] MULTANI LETTER BHA..MULTANI LETTER RHA +112A9;BA # Po MULTANI SECTION MARK +112B0..112DE;AL # Lo [47] KHUDAWADI LETTER A..KHUDAWADI LETTER HA +112DF;CM # Mn KHUDAWADI SIGN ANUSVARA +112E0..112E2;CM # Mc [3] KHUDAWADI VOWEL SIGN AA..KHUDAWADI VOWEL SIGN II +112E3..112EA;CM # Mn [8] KHUDAWADI VOWEL SIGN U..KHUDAWADI SIGN VIRAMA +112F0..112F9;NU # Nd [10] KHUDAWADI DIGIT ZERO..KHUDAWADI DIGIT NINE +11300..11301;CM # Mn [2] GRANTHA SIGN COMBINING ANUSVARA ABOVE..GRANTHA SIGN CANDRABINDU +11302..11303;CM # Mc [2] GRANTHA SIGN ANUSVARA..GRANTHA SIGN VISARGA +11305..1130C;AL # Lo [8] GRANTHA LETTER A..GRANTHA LETTER VOCALIC L +1130F..11310;AL # Lo [2] GRANTHA LETTER EE..GRANTHA LETTER AI +11313..11328;AL # Lo [22] GRANTHA LETTER OO..GRANTHA LETTER NA +1132A..11330;AL # Lo [7] GRANTHA LETTER PA..GRANTHA LETTER RA +11332..11333;AL # Lo [2] GRANTHA LETTER LA..GRANTHA LETTER LLA +11335..11339;AL # Lo [5] GRANTHA LETTER VA..GRANTHA LETTER HA +1133B..1133C;CM # Mn [2] COMBINING BINDU BELOW..GRANTHA SIGN NUKTA +1133D;AL # Lo GRANTHA SIGN AVAGRAHA +1133E..1133F;CM # Mc [2] GRANTHA VOWEL SIGN AA..GRANTHA VOWEL SIGN I +11340;CM # Mn GRANTHA VOWEL SIGN II +11341..11344;CM # Mc [4] GRANTHA VOWEL SIGN U..GRANTHA VOWEL SIGN VOCALIC RR +11347..11348;CM # Mc [2] GRANTHA VOWEL SIGN EE..GRANTHA VOWEL SIGN AI +1134B..1134D;CM # Mc [3] GRANTHA VOWEL SIGN OO..GRANTHA SIGN VIRAMA +11350;AL # Lo GRANTHA OM +11357;CM # Mc GRANTHA AU LENGTH MARK +1135D..11361;AL # Lo [5] GRANTHA SIGN PLUTA..GRANTHA LETTER VOCALIC LL +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 +1145E;CM # Mn NEWA SANDHI MARK +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 +114B9;CM # Mc TIRHUTA VOWEL SIGN E +114BA;CM # Mn TIRHUTA VOWEL SIGN SHORT E +114BB..114BE;CM # Mc [4] TIRHUTA VOWEL SIGN AI..TIRHUTA VOWEL SIGN AU +114BF..114C0;CM # Mn [2] TIRHUTA SIGN CANDRABINDU..TIRHUTA SIGN ANUSVARA +114C1;CM # Mc TIRHUTA SIGN VISARGA +114C2..114C3;CM # Mn [2] TIRHUTA SIGN VIRAMA..TIRHUTA SIGN NUKTA +114C4..114C5;AL # Lo [2] TIRHUTA SIGN AVAGRAHA..TIRHUTA GVANG +114C6;AL # Po TIRHUTA ABBREVIATION SIGN +114C7;AL # Lo TIRHUTA OM +114D0..114D9;NU # Nd [10] TIRHUTA DIGIT ZERO..TIRHUTA DIGIT NINE +11580..115AE;AL # Lo [47] SIDDHAM LETTER A..SIDDHAM LETTER HA +115AF..115B1;CM # Mc [3] SIDDHAM VOWEL SIGN AA..SIDDHAM VOWEL SIGN II +115B2..115B5;CM # Mn [4] SIDDHAM VOWEL SIGN U..SIDDHAM VOWEL SIGN VOCALIC RR +115B8..115BB;CM # Mc [4] SIDDHAM VOWEL SIGN E..SIDDHAM VOWEL SIGN AU +115BC..115BD;CM # Mn [2] SIDDHAM SIGN CANDRABINDU..SIDDHAM SIGN ANUSVARA +115BE;CM # Mc SIDDHAM SIGN VISARGA +115BF..115C0;CM # Mn [2] SIDDHAM SIGN VIRAMA..SIDDHAM SIGN NUKTA +115C1;BB # Po SIDDHAM SIGN SIDDHAM +115C2..115C3;BA # Po [2] SIDDHAM DANDA..SIDDHAM DOUBLE DANDA +115C4..115C5;EX # Po [2] SIDDHAM SEPARATOR DOT..SIDDHAM SEPARATOR BAR +115C6..115C8;AL # Po [3] SIDDHAM REPETITION MARK-1..SIDDHAM REPETITION MARK-3 +115C9..115D7;BA # Po [15] SIDDHAM END OF TEXT MARK..SIDDHAM SECTION MARK WITH CIRCLES AND FOUR ENCLOSURES +115D8..115DB;AL # Lo [4] SIDDHAM LETTER THREE-CIRCLE ALTERNATE I..SIDDHAM LETTER ALTERNATE U +115DC..115DD;CM # Mn [2] SIDDHAM VOWEL SIGN ALTERNATE U..SIDDHAM VOWEL SIGN ALTERNATE UU +11600..1162F;AL # Lo [48] MODI LETTER A..MODI LETTER LLA +11630..11632;CM # Mc [3] MODI VOWEL SIGN AA..MODI VOWEL SIGN II +11633..1163A;CM # Mn [8] MODI VOWEL SIGN U..MODI VOWEL SIGN AI +1163B..1163C;CM # Mc [2] MODI VOWEL SIGN O..MODI VOWEL SIGN AU +1163D;CM # Mn MODI SIGN ANUSVARA +1163E;CM # Mc MODI SIGN VISARGA +1163F..11640;CM # Mn [2] MODI SIGN VIRAMA..MODI SIGN ARDHACANDRA +11641..11642;BA # Po [2] MODI DANDA..MODI DOUBLE DANDA +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 +116AD;CM # Mn TAKRI VOWEL SIGN AA +116AE..116AF;CM # Mc [2] TAKRI VOWEL SIGN I..TAKRI VOWEL SIGN II +116B0..116B5;CM # Mn [6] TAKRI VOWEL SIGN U..TAKRI VOWEL SIGN AU +116B6;CM # Mc TAKRI SIGN VIRAMA +116B7;CM # Mn TAKRI SIGN NUKTA +116C0..116C9;NU # Nd [10] TAKRI DIGIT ZERO..TAKRI DIGIT NINE +11700..1171A;SA # Lo [27] AHOM LETTER KA..AHOM LETTER ALTERNATE BA +1171D..1171F;SA # Mn [3] AHOM CONSONANT SIGN MEDIAL LA..AHOM CONSONANT SIGN MEDIAL LIGATING RA +11720..11721;SA # Mc [2] AHOM VOWEL SIGN A..AHOM VOWEL SIGN AA +11722..11725;SA # Mn [4] AHOM VOWEL SIGN I..AHOM VOWEL SIGN UU +11726;SA # Mc AHOM VOWEL SIGN E +11727..1172B;SA # Mn [5] AHOM VOWEL SIGN AW..AHOM SIGN KILLER +11730..11739;NU # Nd [10] AHOM DIGIT ZERO..AHOM DIGIT NINE +1173A..1173B;SA # No [2] AHOM NUMBER TEN..AHOM NUMBER TWENTY +1173C..1173E;BA # Po [3] AHOM SIGN SMALL SECTION..AHOM SIGN RULAI +1173F;SA # So AHOM SYMBOL VI +11800..1182B;AL # Lo [44] DOGRA LETTER A..DOGRA LETTER RRA +1182C..1182E;CM # Mc [3] DOGRA VOWEL SIGN AA..DOGRA VOWEL SIGN II +1182F..11837;CM # Mn [9] DOGRA VOWEL SIGN U..DOGRA SIGN ANUSVARA +11838;CM # Mc DOGRA SIGN VISARGA +11839..1183A;CM # Mn [2] DOGRA SIGN VIRAMA..DOGRA SIGN NUKTA +1183B;AL # Po DOGRA ABBREVIATION SIGN +118A0..118DF;AL # L& [64] WARANG CITI CAPITAL LETTER NGAA..WARANG CITI SMALL LETTER VIYO +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..11A0A;CM # Mn [10] ZANABAZAR SQUARE VOWEL SIGN 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 +11A9D;AL # Lo SOYOMBO MARK PLUTA +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 +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 +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 +11D60..11D65;AL # Lo [6] GUNJALA GONDI LETTER A..GUNJALA GONDI LETTER UU +11D67..11D68;AL # Lo [2] GUNJALA GONDI LETTER EE..GUNJALA GONDI LETTER AI +11D6A..11D89;AL # Lo [32] GUNJALA GONDI LETTER OO..GUNJALA GONDI LETTER SA +11D8A..11D8E;CM # Mc [5] GUNJALA GONDI VOWEL SIGN AA..GUNJALA GONDI VOWEL SIGN UU +11D90..11D91;CM # Mn [2] GUNJALA GONDI VOWEL SIGN EE..GUNJALA GONDI VOWEL SIGN AI +11D93..11D94;CM # Mc [2] GUNJALA GONDI VOWEL SIGN OO..GUNJALA GONDI VOWEL SIGN AU +11D95;CM # Mn GUNJALA GONDI SIGN ANUSVARA +11D96;CM # Mc GUNJALA GONDI SIGN VISARGA +11D97;CM # Mn GUNJALA GONDI VIRAMA +11D98;AL # Lo GUNJALA GONDI OM +11DA0..11DA9;NU # Nd [10] GUNJALA GONDI DIGIT ZERO..GUNJALA GONDI DIGIT NINE +11EE0..11EF2;AL # Lo [19] MAKASAR LETTER KA..MAKASAR ANGKA +11EF3..11EF4;CM # Mn [2] MAKASAR VOWEL SIGN I..MAKASAR VOWEL SIGN U +11EF5..11EF6;CM # Mc [2] MAKASAR VOWEL SIGN E..MAKASAR VOWEL SIGN O +11EF7..11EF8;AL # Po [2] MAKASAR PASSIMBANG..MAKASAR END OF SECTION +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 +12480..12543;AL # Lo [196] CUNEIFORM SIGN AB TIMES NUN TENU..CUNEIFORM SIGN ZU5 TIMES THREE DISH TENU +13000..13257;AL # Lo [600] EGYPTIAN HIEROGLYPH A001..EGYPTIAN HIEROGLYPH O006 +13258..1325A;OP # Lo [3] EGYPTIAN HIEROGLYPH O006A..EGYPTIAN HIEROGLYPH O006C +1325B..1325D;CL # Lo [3] EGYPTIAN HIEROGLYPH O006D..EGYPTIAN HIEROGLYPH O006F +1325E..13281;AL # Lo [36] EGYPTIAN HIEROGLYPH O007..EGYPTIAN HIEROGLYPH O033 +13282;CL # Lo EGYPTIAN HIEROGLYPH O033A +13283..13285;AL # Lo [3] EGYPTIAN HIEROGLYPH O034..EGYPTIAN HIEROGLYPH O036 +13286;OP # Lo EGYPTIAN HIEROGLYPH O036A +13287;CL # Lo EGYPTIAN HIEROGLYPH O036B +13288;OP # Lo EGYPTIAN HIEROGLYPH O036C +13289;CL # Lo EGYPTIAN HIEROGLYPH O036D +1328A..13378;AL # Lo [239] EGYPTIAN HIEROGLYPH O037..EGYPTIAN HIEROGLYPH V011 +13379;OP # Lo EGYPTIAN HIEROGLYPH V011A +1337A..1337B;CL # Lo [2] EGYPTIAN HIEROGLYPH V011B..EGYPTIAN HIEROGLYPH V011C +1337C..1342E;AL # Lo [179] EGYPTIAN HIEROGLYPH V012..EGYPTIAN HIEROGLYPH AA032 +14400..145CD;AL # Lo [462] ANATOLIAN HIEROGLYPH A001..ANATOLIAN HIEROGLYPH A409 +145CE;OP # Lo ANATOLIAN HIEROGLYPH A410 BEGIN LOGOGRAM MARK +145CF;CL # Lo ANATOLIAN HIEROGLYPH A410A END LOGOGRAM MARK +145D0..14646;AL # Lo [119] ANATOLIAN HIEROGLYPH A411..ANATOLIAN HIEROGLYPH A530 +16800..16A38;AL # Lo [569] BAMUM LETTER PHASE-A NGKUE MFON..BAMUM LETTER PHASE-F VUEQ +16A40..16A5E;AL # Lo [31] MRO LETTER TA..MRO LETTER TEK +16A60..16A69;NU # Nd [10] MRO DIGIT ZERO..MRO DIGIT NINE +16A6E..16A6F;BA # Po [2] MRO DANDA..MRO DOUBLE DANDA +16AD0..16AED;AL # Lo [30] BASSA VAH LETTER ENNI..BASSA VAH LETTER I +16AF0..16AF4;CM # Mn [5] BASSA VAH COMBINING HIGH TONE..BASSA VAH COMBINING HIGH-LOW TONE +16AF5;BA # Po BASSA VAH FULL STOP +16B00..16B2F;AL # Lo [48] PAHAWH HMONG VOWEL KEEB..PAHAWH HMONG CONSONANT CAU +16B30..16B36;CM # Mn [7] PAHAWH HMONG MARK CIM TUB..PAHAWH HMONG MARK CIM TAUM +16B37..16B39;BA # Po [3] PAHAWH HMONG SIGN VOS THOM..PAHAWH HMONG SIGN CIM CHEEM +16B3A..16B3B;AL # Po [2] PAHAWH HMONG SIGN VOS THIAB..PAHAWH HMONG SIGN VOS FEEM +16B3C..16B3F;AL # So [4] PAHAWH HMONG SIGN XYEEM NTXIV..PAHAWH HMONG SIGN XYEEM FAIB +16B40..16B43;AL # Lm [4] PAHAWH HMONG SIGN VOS SEEV..PAHAWH HMONG SIGN IB YAM +16B44;BA # Po PAHAWH HMONG SIGN XAUS +16B45;AL # So PAHAWH HMONG SIGN CIM TSOV ROG +16B50..16B59;NU # Nd [10] PAHAWH HMONG DIGIT ZERO..PAHAWH HMONG DIGIT NINE +16B5B..16B61;AL # No [7] PAHAWH HMONG NUMBER TENS..PAHAWH HMONG NUMBER TRILLIONS +16B63..16B77;AL # Lo [21] PAHAWH HMONG SIGN VOS LUB..PAHAWH HMONG SIGN CIM NRES TOS +16B7D..16B8F;AL # Lo [19] PAHAWH HMONG CLAN SIGN TSHEEJ..PAHAWH HMONG CLAN SIGN VWJ +16E40..16E7F;AL # L& [64] MEDEFAIDRIN CAPITAL LETTER M..MEDEFAIDRIN SMALL LETTER Y +16E80..16E96;AL # No [23] MEDEFAIDRIN DIGIT ZERO..MEDEFAIDRIN DIGIT THREE ALTERNATE FORM +16E97..16E98;BA # Po [2] MEDEFAIDRIN COMMA..MEDEFAIDRIN FULL STOP +16E99..16E9A;AL # Po [2] MEDEFAIDRIN SYMBOL AIVA..MEDEFAIDRIN EXCLAMATION OH +16F00..16F44;AL # Lo [69] MIAO LETTER PA..MIAO LETTER HHA +16F50;AL # Lo MIAO LETTER NASALIZATION +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..16FE1;NS # Lm [2] TANGUT ITERATION MARK..NUSHU ITERATION MARK +17000..187F1;ID # Lo [6130] TANGUT IDEOGRAPH-17000..TANGUT IDEOGRAPH-187F1 +18800..18AF2;ID # Lo [755] TANGUT COMPONENT-001..TANGUT COMPONENT-755 +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 +1BC90..1BC99;AL # Lo [10] DUPLOYAN AFFIX LOW ACUTE..DUPLOYAN AFFIX LOW ARROW +1BC9C;AL # So DUPLOYAN SIGN O WITH CROSS +1BC9D..1BC9E;CM # Mn [2] DUPLOYAN THICK LETTER SELECTOR..DUPLOYAN DOUBLE MARK +1BC9F;BA # Po DUPLOYAN PUNCTUATION CHINOOK FULL STOP +1BCA0..1BCA3;CM # Cf [4] SHORTHAND FORMAT LETTER OVERLAP..SHORTHAND FORMAT UP STEP +1D000..1D0F5;AL # So [246] BYZANTINE MUSICAL SYMBOL PSILI..BYZANTINE MUSICAL SYMBOL GORGON NEO KATO +1D100..1D126;AL # So [39] MUSICAL SYMBOL SINGLE BARLINE..MUSICAL SYMBOL DRUM CLEF-2 +1D129..1D164;AL # So [60] MUSICAL SYMBOL MULTIPLE MEASURE REST..MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH NOTE +1D165..1D166;CM # Mc [2] MUSICAL SYMBOL COMBINING STEM..MUSICAL SYMBOL COMBINING SPRECHGESANG STEM +1D167..1D169;CM # Mn [3] MUSICAL SYMBOL COMBINING TREMOLO-1..MUSICAL SYMBOL COMBINING TREMOLO-3 +1D16A..1D16C;AL # So [3] MUSICAL SYMBOL FINGERED TREMOLO-1..MUSICAL SYMBOL FINGERED TREMOLO-3 +1D16D..1D172;CM # Mc [6] MUSICAL SYMBOL COMBINING AUGMENTATION DOT..MUSICAL SYMBOL COMBINING FLAG-5 +1D173..1D17A;CM # Cf [8] MUSICAL SYMBOL BEGIN BEAM..MUSICAL SYMBOL END PHRASE +1D17B..1D182;CM # Mn [8] MUSICAL SYMBOL COMBINING ACCENT..MUSICAL SYMBOL COMBINING LOURE +1D183..1D184;AL # So [2] MUSICAL SYMBOL ARPEGGIATO UP..MUSICAL SYMBOL ARPEGGIATO DOWN +1D185..1D18B;CM # Mn [7] MUSICAL SYMBOL COMBINING DOIT..MUSICAL SYMBOL COMBINING TRIPLE TONGUE +1D18C..1D1A9;AL # So [30] MUSICAL SYMBOL RINFORZANDO..MUSICAL SYMBOL DEGREE SLASH +1D1AA..1D1AD;CM # Mn [4] MUSICAL SYMBOL COMBINING DOWN BOW..MUSICAL SYMBOL COMBINING SNAP PIZZICATO +1D1AE..1D1E8;AL # So [59] MUSICAL SYMBOL PEDAL MARK..MUSICAL SYMBOL KIEVAN FLAT SIGN +1D200..1D241;AL # So [66] GREEK VOCAL NOTATION SYMBOL-1..GREEK INSTRUMENTAL NOTATION SYMBOL-54 +1D242..1D244;CM # Mn [3] COMBINING GREEK MUSICAL TRISEME..COMBINING GREEK MUSICAL PENTASEME +1D245;AL # So GREEK MUSICAL LEIMMA +1D2E0..1D2F3;AL # No [20] MAYAN NUMERAL ZERO..MAYAN NUMERAL NINETEEN +1D300..1D356;AL # So [87] MONOGRAM FOR EARTH..TETRAGRAM FOR FOSTERING +1D360..1D378;AL # No [25] COUNTING ROD UNIT DIGIT ONE..TALLY MARK FIVE +1D400..1D454;AL # L& [85] MATHEMATICAL BOLD CAPITAL A..MATHEMATICAL ITALIC SMALL G +1D456..1D49C;AL # L& [71] MATHEMATICAL ITALIC SMALL I..MATHEMATICAL SCRIPT CAPITAL A +1D49E..1D49F;AL # Lu [2] MATHEMATICAL SCRIPT CAPITAL C..MATHEMATICAL SCRIPT CAPITAL D +1D4A2;AL # Lu MATHEMATICAL SCRIPT CAPITAL G +1D4A5..1D4A6;AL # Lu [2] MATHEMATICAL SCRIPT CAPITAL J..MATHEMATICAL SCRIPT CAPITAL K +1D4A9..1D4AC;AL # Lu [4] MATHEMATICAL SCRIPT CAPITAL N..MATHEMATICAL SCRIPT CAPITAL Q +1D4AE..1D4B9;AL # L& [12] MATHEMATICAL SCRIPT CAPITAL S..MATHEMATICAL SCRIPT SMALL D +1D4BB;AL # Ll MATHEMATICAL SCRIPT SMALL F +1D4BD..1D4C3;AL # Ll [7] MATHEMATICAL SCRIPT SMALL H..MATHEMATICAL SCRIPT SMALL N +1D4C5..1D505;AL # L& [65] MATHEMATICAL SCRIPT SMALL P..MATHEMATICAL FRAKTUR CAPITAL B +1D507..1D50A;AL # Lu [4] MATHEMATICAL FRAKTUR CAPITAL D..MATHEMATICAL FRAKTUR CAPITAL G +1D50D..1D514;AL # Lu [8] MATHEMATICAL FRAKTUR CAPITAL J..MATHEMATICAL FRAKTUR CAPITAL Q +1D516..1D51C;AL # Lu [7] MATHEMATICAL FRAKTUR CAPITAL S..MATHEMATICAL FRAKTUR CAPITAL Y +1D51E..1D539;AL # L& [28] MATHEMATICAL FRAKTUR SMALL A..MATHEMATICAL DOUBLE-STRUCK CAPITAL B +1D53B..1D53E;AL # Lu [4] MATHEMATICAL DOUBLE-STRUCK CAPITAL D..MATHEMATICAL DOUBLE-STRUCK CAPITAL G +1D540..1D544;AL # Lu [5] MATHEMATICAL DOUBLE-STRUCK CAPITAL I..MATHEMATICAL DOUBLE-STRUCK CAPITAL M +1D546;AL # Lu MATHEMATICAL DOUBLE-STRUCK CAPITAL O +1D54A..1D550;AL # Lu [7] MATHEMATICAL DOUBLE-STRUCK CAPITAL S..MATHEMATICAL DOUBLE-STRUCK CAPITAL Y +1D552..1D6A5;AL # L& [340] MATHEMATICAL DOUBLE-STRUCK SMALL A..MATHEMATICAL ITALIC SMALL DOTLESS J +1D6A8..1D6C0;AL # Lu [25] MATHEMATICAL BOLD CAPITAL ALPHA..MATHEMATICAL BOLD CAPITAL OMEGA +1D6C1;AL # Sm MATHEMATICAL BOLD NABLA +1D6C2..1D6DA;AL # Ll [25] MATHEMATICAL BOLD SMALL ALPHA..MATHEMATICAL BOLD SMALL OMEGA +1D6DB;AL # Sm MATHEMATICAL BOLD PARTIAL DIFFERENTIAL +1D6DC..1D6FA;AL # L& [31] MATHEMATICAL BOLD EPSILON SYMBOL..MATHEMATICAL ITALIC CAPITAL OMEGA +1D6FB;AL # Sm MATHEMATICAL ITALIC NABLA +1D6FC..1D714;AL # Ll [25] MATHEMATICAL ITALIC SMALL ALPHA..MATHEMATICAL ITALIC SMALL OMEGA +1D715;AL # Sm MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL +1D716..1D734;AL # L& [31] MATHEMATICAL ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD ITALIC CAPITAL OMEGA +1D735;AL # Sm MATHEMATICAL BOLD ITALIC NABLA +1D736..1D74E;AL # Ll [25] MATHEMATICAL BOLD ITALIC SMALL ALPHA..MATHEMATICAL BOLD ITALIC SMALL OMEGA +1D74F;AL # Sm MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL +1D750..1D76E;AL # L& [31] MATHEMATICAL BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA +1D76F;AL # Sm MATHEMATICAL SANS-SERIF BOLD NABLA +1D770..1D788;AL # Ll [25] MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA +1D789;AL # Sm MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL +1D78A..1D7A8;AL # L& [31] MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA +1D7A9;AL # Sm MATHEMATICAL SANS-SERIF BOLD ITALIC NABLA +1D7AA..1D7C2;AL # Ll [25] MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA +1D7C3;AL # Sm MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL +1D7C4..1D7CB;AL # L& [8] MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD SMALL DIGAMMA +1D7CE..1D7FF;NU # Nd [50] MATHEMATICAL BOLD DIGIT ZERO..MATHEMATICAL MONOSPACE DIGIT NINE +1D800..1D9FF;AL # So [512] SIGNWRITING HAND-FIST INDEX..SIGNWRITING HEAD +1DA00..1DA36;CM # Mn [55] SIGNWRITING HEAD RIM..SIGNWRITING AIR SUCKING IN +1DA37..1DA3A;AL # So [4] SIGNWRITING AIR BLOW SMALL ROTATIONS..SIGNWRITING BREATH EXHALE +1DA3B..1DA6C;CM # Mn [50] SIGNWRITING MOUTH CLOSED NEUTRAL..SIGNWRITING EXCITEMENT +1DA6D..1DA74;AL # So [8] SIGNWRITING SHOULDER HIP SPINE..SIGNWRITING TORSO-FLOORPLANE TWISTING +1DA75;CM # Mn SIGNWRITING UPPER BODY TILTING FROM HIP JOINTS +1DA76..1DA83;AL # So [14] SIGNWRITING LIMB COMBINATION..SIGNWRITING LOCATION DEPTH +1DA84;CM # Mn SIGNWRITING LOCATION HEAD NECK +1DA85..1DA86;AL # So [2] SIGNWRITING LOCATION TORSO..SIGNWRITING LOCATION LIMBS DIGITS +1DA87..1DA8A;BA # Po [4] SIGNWRITING COMMA..SIGNWRITING COLON +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 +1EC71..1ECAB;AL # No [59] INDIC SIYAQ NUMBER ONE..INDIC SIYAQ NUMBER PREFIXED NINE +1ECAC;PO # So INDIC SIYAQ PLACEHOLDER +1ECAD..1ECAF;AL # No [3] INDIC SIYAQ FRACTION ONE QUARTER..INDIC SIYAQ FRACTION THREE QUARTERS +1ECB0;PO # Sc INDIC SIYAQ RUPEE MARK +1ECB1..1ECB4;AL # No [4] INDIC SIYAQ NUMBER ALTERNATE ONE..INDIC SIYAQ ALTERNATE LAKH 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 +1EE24;AL # Lo ARABIC MATHEMATICAL INITIAL HEH +1EE27;AL # Lo ARABIC MATHEMATICAL INITIAL HAH +1EE29..1EE32;AL # Lo [10] ARABIC MATHEMATICAL INITIAL YEH..ARABIC MATHEMATICAL INITIAL QAF +1EE34..1EE37;AL # Lo [4] ARABIC MATHEMATICAL INITIAL SHEEN..ARABIC MATHEMATICAL INITIAL KHAH +1EE39;AL # Lo ARABIC MATHEMATICAL INITIAL DAD +1EE3B;AL # Lo ARABIC MATHEMATICAL INITIAL GHAIN +1EE42;AL # Lo ARABIC MATHEMATICAL TAILED JEEM +1EE47;AL # Lo ARABIC MATHEMATICAL TAILED HAH +1EE49;AL # Lo ARABIC MATHEMATICAL TAILED YEH +1EE4B;AL # Lo ARABIC MATHEMATICAL TAILED LAM +1EE4D..1EE4F;AL # Lo [3] ARABIC MATHEMATICAL TAILED NOON..ARABIC MATHEMATICAL TAILED AIN +1EE51..1EE52;AL # Lo [2] ARABIC MATHEMATICAL TAILED SAD..ARABIC MATHEMATICAL TAILED QAF +1EE54;AL # Lo ARABIC MATHEMATICAL TAILED SHEEN +1EE57;AL # Lo ARABIC MATHEMATICAL TAILED KHAH +1EE59;AL # Lo ARABIC MATHEMATICAL TAILED DAD +1EE5B;AL # Lo ARABIC MATHEMATICAL TAILED GHAIN +1EE5D;AL # Lo ARABIC MATHEMATICAL TAILED DOTLESS NOON +1EE5F;AL # Lo ARABIC MATHEMATICAL TAILED DOTLESS QAF +1EE61..1EE62;AL # Lo [2] ARABIC MATHEMATICAL STRETCHED BEH..ARABIC MATHEMATICAL STRETCHED JEEM +1EE64;AL # Lo ARABIC MATHEMATICAL STRETCHED HEH +1EE67..1EE6A;AL # Lo [4] ARABIC MATHEMATICAL STRETCHED HAH..ARABIC MATHEMATICAL STRETCHED KAF +1EE6C..1EE72;AL # Lo [7] ARABIC MATHEMATICAL STRETCHED MEEM..ARABIC MATHEMATICAL STRETCHED QAF +1EE74..1EE77;AL # Lo [4] ARABIC MATHEMATICAL STRETCHED SHEEN..ARABIC MATHEMATICAL STRETCHED KHAH +1EE79..1EE7C;AL # Lo [4] ARABIC MATHEMATICAL STRETCHED DAD..ARABIC MATHEMATICAL STRETCHED DOTLESS BEH +1EE7E;AL # Lo ARABIC MATHEMATICAL STRETCHED DOTLESS FEH +1EE80..1EE89;AL # Lo [10] ARABIC MATHEMATICAL LOOPED ALEF..ARABIC MATHEMATICAL LOOPED YEH +1EE8B..1EE9B;AL # Lo [17] ARABIC MATHEMATICAL LOOPED LAM..ARABIC MATHEMATICAL LOOPED GHAIN +1EEA1..1EEA3;AL # Lo [3] ARABIC MATHEMATICAL DOUBLE-STRUCK BEH..ARABIC MATHEMATICAL DOUBLE-STRUCK DAL +1EEA5..1EEA9;AL # Lo [5] ARABIC MATHEMATICAL DOUBLE-STRUCK WAW..ARABIC MATHEMATICAL DOUBLE-STRUCK YEH +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] .. +1F030..1F093;ID # So [100] DOMINO TILE HORIZONTAL BACK..DOMINO TILE VERTICAL-06-06 +1F094..1F09F;ID # Cn [12] .. +1F0A0..1F0AE;ID # So [15] PLAYING CARD BACK..PLAYING CARD KING OF SPADES +1F0AF..1F0B0;ID # Cn [2] .. +1F0B1..1F0BF;ID # So [15] PLAYING CARD ACE OF HEARTS..PLAYING CARD RED JOKER +1F0C0;ID # Cn +1F0C1..1F0CF;ID # So [15] PLAYING CARD ACE OF DIAMONDS..PLAYING CARD BLACK JOKER +1F0D0;ID # Cn +1F0D1..1F0F5;ID # So [37] PLAYING CARD ACE OF CLUBS..PLAYING CARD TRUMP-21 +1F0F6..1F0FF;ID # Cn [10] .. +1F100..1F10C;AI # No [13] DIGIT ZERO FULL STOP..DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ZERO +1F10D..1F10F;ID # Cn [3] .. +1F110..1F12D;AI # So [30] PARENTHESIZED LATIN CAPITAL LETTER A..CIRCLED CD +1F12E..1F12F;AL # So [2] CIRCLED WZ..COPYLEFT SYMBOL +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 +1F16C..1F16F;ID # Cn [4] .. +1F170..1F1AC;AI # So [61] NEGATIVE SQUARED LATIN CAPITAL LETTER A..SQUARED VOD +1F1AD..1F1E5;ID # Cn [57] .. +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 +1F203..1F20F;ID # Cn [13] .. +1F210..1F23B;ID # So [44] SQUARED CJK UNIFIED IDEOGRAPH-624B..SQUARED CJK UNIFIED IDEOGRAPH-914D +1F23C..1F23F;ID # Cn [4] .. +1F240..1F248;ID # So [9] TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-672C..TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-6557 +1F249..1F24F;ID # Cn [7] .. +1F250..1F251;ID # So [2] CIRCLED IDEOGRAPH ADVANTAGE..CIRCLED IDEOGRAPH ACCEPT +1F252..1F25F;ID # Cn [14] .. +1F260..1F265;ID # So [6] ROUNDED SYMBOL FOR FU..ROUNDED SYMBOL FOR CAI +1F266..1F2FF;ID # Cn [154] .. +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..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 +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..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 +1F4B3..1F4FF;ID # So [77] CREDIT CARD..PRAYER BEADS +1F500..1F506;AL # So [7] TWISTED RIGHTWARDS ARROWS..HIGH BRIGHTNESS SYMBOL +1F507..1F516;ID # So [16] SPEAKER WITH CANCELLATION STROKE..BOOKMARK +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..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 +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..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..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..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] .. +1F6E0..1F6EC;ID # So [13] HAMMER AND WRENCH..AIRPLANE ARRIVING +1F6ED..1F6EF;ID # Cn [3] .. +1F6F0..1F6F9;ID # So [10] SATELLITE..SKATEBOARD +1F6FA..1F6FF;ID # Cn [6] .. +1F700..1F773;AL # So [116] ALCHEMICAL SYMBOL FOR QUINTESSENCE..ALCHEMICAL SYMBOL FOR HALF OUNCE +1F774..1F77F;ID # Cn [12] .. +1F780..1F7D4;AL # So [85] BLACK LEFT-POINTING ISOSCELES RIGHT TRIANGLE..HEAVY TWELVE POINTED PINWHEEL STAR +1F7D5..1F7D8;ID # So [4] CIRCLED TRIANGLE..NEGATIVE CIRCLED SQUARE +1F7D9..1F7FF;ID # Cn [39] .. +1F800..1F80B;AL # So [12] LEFTWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD..DOWNWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD +1F80C..1F80F;ID # Cn [4] .. +1F810..1F847;AL # So [56] LEFTWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD..DOWNWARDS HEAVY ARROW +1F848..1F84F;ID # Cn [8] .. +1F850..1F859;AL # So [10] LEFTWARDS SANS-SERIF ARROW..UP DOWN SANS-SERIF ARROW +1F85A..1F85F;ID # Cn [6] .. +1F860..1F887;AL # So [40] WIDE-HEADED LEFTWARDS LIGHT BARB ARROW..WIDE-HEADED SOUTH WEST VERY HEAVY BARB ARROW +1F888..1F88F;ID # Cn [8] .. +1F890..1F8AD;AL # So [30] LEFTWARDS TRIANGLE ARROWHEAD..WHITE ARROW SHAFT WIDTH TWO THIRDS +1F8AE..1F8FF;ID # Cn [82] .. +1F900..1F90B;AL # So [12] CIRCLED CROSS FORMEE WITH FOUR DOTS..DOWNWARD FACING NOTCHED HOOK WITH DOT +1F90C..1F90F;ID # Cn [4] .. +1F910..1F917;ID # So [8] ZIPPER-MOUTH FACE..HUGGING FACE +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..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 +1F940..1F970;ID # So [49] WILTED FLOWER..SMILING FACE WITH SMILING EYES AND THREE HEARTS +1F971..1F972;ID # Cn [2] .. +1F973..1F976;ID # So [4] FACE WITH PARTY HORN AND PARTY HAT..FREEZING FACE +1F977..1F979;ID # Cn [3] .. +1F97A;ID # So FACE WITH PLEADING EYES +1F97B;ID # Cn +1F97C..1F9A2;ID # So [39] LAB COAT..SWAN +1F9A3..1F9AF;ID # Cn [13] .. +1F9B0..1F9B4;ID # So [5] EMOJI COMPONENT RED HAIR..BONE +1F9B5..1F9B6;EB # So [2] LEG..FOOT +1F9B7;ID # So TOOTH +1F9B8..1F9B9;EB # So [2] SUPERHERO..SUPERVILLAIN +1F9BA..1F9BF;ID # Cn [6] .. +1F9C0..1F9C2;ID # So [3] CHEESE WEDGE..SALT SHAKER +1F9C3..1F9CF;ID # Cn [13] .. +1F9D0;ID # So FACE WITH MONOCLE +1F9D1..1F9DD;EB # So [13] ADULT..ELF +1F9DE..1F9FF;ID # So [34] GENIE..NAZAR AMULET +1FA00..1FA5F;ID # Cn [96] .. +1FA60..1FA6D;ID # So [14] XIANGQI RED GENERAL..XIANGQI BLACK SOLDIER +1FA6E..1FA6F;ID # Cn [2] .. +1FA70..1FFFD;ID # Cn [1422] .. +20000..2A6D6;ID # Lo [42711] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6D6 +2A6D7..2A6FF;ID # Cn [41] .. +2A700..2B734;ID # Lo [4149] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B734 +2B735..2B73F;ID # Cn [11] .. +2B740..2B81D;ID # Lo [222] CJK UNIFIED IDEOGRAPH-2B740..CJK UNIFIED IDEOGRAPH-2B81D +2B81E..2B81F;ID # Cn [2] .. +2B820..2CEA1;ID # Lo [5762] CJK UNIFIED IDEOGRAPH-2B820..CJK UNIFIED IDEOGRAPH-2CEA1 +2CEA2..2CEAF;ID # Cn [14] .. +2CEB0..2EBE0;ID # Lo [7473] CJK UNIFIED IDEOGRAPH-2CEB0..CJK UNIFIED IDEOGRAPH-2EBE0 +2EBE1..2F7FF;ID # Cn [3103] .. +2F800..2FA1D;ID # Lo [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D +2FA1E..2FA1F;ID # Cn [2] .. +2FA20..2FFFD;ID # Cn [1502] .. +30000..3FFFD;ID # Cn [65534] .. +E0001;CM # Cf LANGUAGE TAG +E0020..E007F;CM # Cf [96] TAG SPACE..CANCEL TAG +E0100..E01EF;CM # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256 +F0000..FFFFD;XX # Co [65534] .. +100000..10FFFD;XX # Co [65534] .. + +# EOF diff -Nru pypy-7.1.1+dfsg/rpython/rlib/unicodedata/NameAliases-11.0.0.txt pypy-7.3.1+dfsg/rpython/rlib/unicodedata/NameAliases-11.0.0.txt --- pypy-7.1.1+dfsg/rpython/rlib/unicodedata/NameAliases-11.0.0.txt 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/rlib/unicodedata/NameAliases-11.0.0.txt 2020-04-10 19:28:41.000000000 +0000 @@ -0,0 +1,565 @@ +# NameAliases-11.0.0.txt +# Date: 2018-05-07, 00:00:00 GMT [KW, LI] +# © 2018 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. +# +# This file defines the formal name aliases for Unicode characters. +# +# For informative aliases, see NamesList.txt +# +# The formal name aliases are divided into five types, each with a distinct label. +# +# Type Labels: +# +# 1. correction +# Corrections for serious problems in the character names +# 2. control +# ISO 6429 names for C0 and C1 control functions, and other +# commonly occurring names for control codes +# 3. alternate +# A few widely used alternate names for format characters +# 4. figment +# Several documented labels for C1 control code points which +# were never actually approved in any standard +# 5. abbreviation +# Commonly occurring abbreviations (or acronyms) for control codes, +# format characters, spaces, and variation selectors +# +# The formal name aliases are part of the Unicode character namespace, which +# includes the character names and the names of named character sequences. +# The inclusion of ISO 6429 names and other commonly occurring names and +# abbreviations for control codes and format characters as formal name aliases +# is to help avoid name collisions between Unicode character names and the +# labels which commonly appear in text and/or in implementations such as regex, for +# control codes (which for historical reasons have no Unicode character name) +# or for format characters. +# +# For documentation, see NamesList.html and http://www.unicode.org/reports/tr44/ +# +# FORMAT +# +# Each line has three fields, as described here: +# +# First field: Code point +# Second field: Alias +# Third field: Type +# +# The type labels used are defined above. As for property values, comparisons +# of type labels should ignore case. +# +# The type labels can be mapped to other strings for display, if desired. +# +# In case multiple aliases are assigned, additional aliases +# are provided on separate lines. Parsers of this data file should +# take note that the same code point can (and does) occur more than once. +# +# Note that currently the only instances of multiple aliases of the same +# type for a single code point are either of type "control" or "abbreviation". +# An alias of type "abbreviation" can, in principle, be added for any code +# point, although currently aliases of type "correction" do not have +# any additional aliases of type "abbreviation". Such relationships +# are not enforced by stability policies. +# +#----------------------------------------------------------------- + +0000;NULL;control +0000;NUL;abbreviation +0001;START OF HEADING;control +0001;SOH;abbreviation +0002;START OF TEXT;control +0002;STX;abbreviation +0003;END OF TEXT;control +0003;ETX;abbreviation +0004;END OF TRANSMISSION;control +0004;EOT;abbreviation +0005;ENQUIRY;control +0005;ENQ;abbreviation +0006;ACKNOWLEDGE;control +0006;ACK;abbreviation + +# Note that no formal name alias for the ISO 6429 "BELL" is +# provided for U+0007, because of the existing name collision +# with U+1F514 BELL. + +0007;ALERT;control +0007;BEL;abbreviation + +0008;BACKSPACE;control +0008;BS;abbreviation +0009;CHARACTER TABULATION;control +0009;HORIZONTAL TABULATION;control +0009;HT;abbreviation +0009;TAB;abbreviation +000A;LINE FEED;control +000A;NEW LINE;control +000A;END OF LINE;control +000A;LF;abbreviation +000A;NL;abbreviation +000A;EOL;abbreviation +000B;LINE TABULATION;control +000B;VERTICAL TABULATION;control +000B;VT;abbreviation +000C;FORM FEED;control +000C;FF;abbreviation +000D;CARRIAGE RETURN;control +000D;CR;abbreviation +000E;SHIFT OUT;control +000E;LOCKING-SHIFT ONE;control +000E;SO;abbreviation +000F;SHIFT IN;control +000F;LOCKING-SHIFT ZERO;control +000F;SI;abbreviation +0010;DATA LINK ESCAPE;control +0010;DLE;abbreviation +0011;DEVICE CONTROL ONE;control +0011;DC1;abbreviation +0012;DEVICE CONTROL TWO;control +0012;DC2;abbreviation +0013;DEVICE CONTROL THREE;control +0013;DC3;abbreviation +0014;DEVICE CONTROL FOUR;control +0014;DC4;abbreviation +0015;NEGATIVE ACKNOWLEDGE;control +0015;NAK;abbreviation +0016;SYNCHRONOUS IDLE;control +0016;SYN;abbreviation +0017;END OF TRANSMISSION BLOCK;control +0017;ETB;abbreviation +0018;CANCEL;control +0018;CAN;abbreviation +0019;END OF MEDIUM;control +0019;EOM;abbreviation +001A;SUBSTITUTE;control +001A;SUB;abbreviation +001B;ESCAPE;control +001B;ESC;abbreviation +001C;INFORMATION SEPARATOR FOUR;control +001C;FILE SEPARATOR;control +001C;FS;abbreviation +001D;INFORMATION SEPARATOR THREE;control +001D;GROUP SEPARATOR;control +001D;GS;abbreviation +001E;INFORMATION SEPARATOR TWO;control +001E;RECORD SEPARATOR;control +001E;RS;abbreviation +001F;INFORMATION SEPARATOR ONE;control +001F;UNIT SEPARATOR;control +001F;US;abbreviation +0020;SP;abbreviation +007F;DELETE;control +007F;DEL;abbreviation + +# PADDING CHARACTER and HIGH OCTET PRESET represent +# architectural concepts initially proposed for early +# drafts of ISO/IEC 10646-1. They were never actually +# approved or standardized: hence their designation +# here as the "figment" type. Formal name aliases +# (and corresponding abbreviations) for these code +# points are included here because these names leaked +# out from the draft documents and were published in +# at least one RFC whose names for code points was +# implemented in Perl regex expressions. + +0080;PADDING CHARACTER;figment +0080;PAD;abbreviation +0081;HIGH OCTET PRESET;figment +0081;HOP;abbreviation + +0082;BREAK PERMITTED HERE;control +0082;BPH;abbreviation +0083;NO BREAK HERE;control +0083;NBH;abbreviation +0084;INDEX;control +0084;IND;abbreviation +0085;NEXT LINE;control +0085;NEL;abbreviation +0086;START OF SELECTED AREA;control +0086;SSA;abbreviation +0087;END OF SELECTED AREA;control +0087;ESA;abbreviation +0088;CHARACTER TABULATION SET;control +0088;HORIZONTAL TABULATION SET;control +0088;HTS;abbreviation +0089;CHARACTER TABULATION WITH JUSTIFICATION;control +0089;HORIZONTAL TABULATION WITH JUSTIFICATION;control +0089;HTJ;abbreviation +008A;LINE TABULATION SET;control +008A;VERTICAL TABULATION SET;control +008A;VTS;abbreviation +008B;PARTIAL LINE FORWARD;control +008B;PARTIAL LINE DOWN;control +008B;PLD;abbreviation +008C;PARTIAL LINE BACKWARD;control +008C;PARTIAL LINE UP;control +008C;PLU;abbreviation +008D;REVERSE LINE FEED;control +008D;REVERSE INDEX;control +008D;RI;abbreviation +008E;SINGLE SHIFT TWO;control +008E;SINGLE-SHIFT-2;control +008E;SS2;abbreviation +008F;SINGLE SHIFT THREE;control +008F;SINGLE-SHIFT-3;control +008F;SS3;abbreviation +0090;DEVICE CONTROL STRING;control +0090;DCS;abbreviation +0091;PRIVATE USE ONE;control +0091;PRIVATE USE-1;control +0091;PU1;abbreviation +0092;PRIVATE USE TWO;control +0092;PRIVATE USE-2;control +0092;PU2;abbreviation +0093;SET TRANSMIT STATE;control +0093;STS;abbreviation +0094;CANCEL CHARACTER;control +0094;CCH;abbreviation +0095;MESSAGE WAITING;control +0095;MW;abbreviation +0096;START OF GUARDED AREA;control +0096;START OF PROTECTED AREA;control +0096;SPA;abbreviation +0097;END OF GUARDED AREA;control +0097;END OF PROTECTED AREA;control +0097;EPA;abbreviation +0098;START OF STRING;control +0098;SOS;abbreviation + +# SINGLE GRAPHIC CHARACTER INTRODUCER is another +# architectural concept from early drafts of ISO/IEC 10646-1 +# which was never approved and standardized. + +0099;SINGLE GRAPHIC CHARACTER INTRODUCER;figment +0099;SGC;abbreviation + +009A;SINGLE CHARACTER INTRODUCER;control +009A;SCI;abbreviation +009B;CONTROL SEQUENCE INTRODUCER;control +009B;CSI;abbreviation +009C;STRING TERMINATOR;control +009C;ST;abbreviation +009D;OPERATING SYSTEM COMMAND;control +009D;OSC;abbreviation +009E;PRIVACY MESSAGE;control +009E;PM;abbreviation +009F;APPLICATION PROGRAM COMMAND;control +009F;APC;abbreviation +00A0;NBSP;abbreviation +00AD;SHY;abbreviation +01A2;LATIN CAPITAL LETTER GHA;correction +01A3;LATIN SMALL LETTER GHA;correction +034F;CGJ;abbreviation +061C;ALM;abbreviation +0709;SYRIAC SUBLINEAR COLON SKEWED LEFT;correction +0CDE;KANNADA LETTER LLLA;correction +0E9D;LAO LETTER FO FON;correction +0E9F;LAO LETTER FO FAY;correction +0EA3;LAO LETTER RO;correction +0EA5;LAO LETTER LO;correction +0FD0;TIBETAN MARK BKA- SHOG GI MGO RGYAN;correction +11EC;HANGUL JONGSEONG YESIEUNG-KIYEOK;correction +11ED;HANGUL JONGSEONG YESIEUNG-SSANGKIYEOK;correction +11EE;HANGUL JONGSEONG SSANGYESIEUNG;correction +11EF;HANGUL JONGSEONG YESIEUNG-KHIEUKH;correction +180B;FVS1;abbreviation +180C;FVS2;abbreviation +180D;FVS3;abbreviation +180E;MVS;abbreviation +200B;ZWSP;abbreviation +200C;ZWNJ;abbreviation +200D;ZWJ;abbreviation +200E;LRM;abbreviation +200F;RLM;abbreviation +202A;LRE;abbreviation +202B;RLE;abbreviation +202C;PDF;abbreviation +202D;LRO;abbreviation +202E;RLO;abbreviation +202F;NNBSP;abbreviation +205F;MMSP;abbreviation +2060;WJ;abbreviation +2066;LRI;abbreviation +2067;RLI;abbreviation +2068;FSI;abbreviation +2069;PDI;abbreviation +2118;WEIERSTRASS ELLIPTIC FUNCTION;correction +2448;MICR ON US SYMBOL;correction +2449;MICR DASH SYMBOL;correction +2B7A;LEFTWARDS TRIANGLE-HEADED ARROW WITH DOUBLE VERTICAL STROKE;correction +2B7C;RIGHTWARDS TRIANGLE-HEADED ARROW WITH DOUBLE VERTICAL STROKE;correction +A015;YI SYLLABLE ITERATION MARK;correction +FE00;VS1;abbreviation +FE01;VS2;abbreviation +FE02;VS3;abbreviation +FE03;VS4;abbreviation +FE04;VS5;abbreviation +FE05;VS6;abbreviation +FE06;VS7;abbreviation +FE07;VS8;abbreviation +FE08;VS9;abbreviation +FE09;VS10;abbreviation +FE0A;VS11;abbreviation +FE0B;VS12;abbreviation +FE0C;VS13;abbreviation +FE0D;VS14;abbreviation +FE0E;VS15;abbreviation +FE0F;VS16;abbreviation +FE18;PRESENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRACKET;correction +FEFF;BYTE ORDER MARK;alternate +FEFF;BOM;abbreviation +FEFF;ZWNBSP;abbreviation +122D4;CUNEIFORM SIGN NU11 TENU;correction +122D5;CUNEIFORM SIGN NU11 OVER NU11 BUR OVER BUR;correction +16E56;MEDEFAIDRIN CAPITAL LETTER H;correction +16E57;MEDEFAIDRIN CAPITAL LETTER NG;correction +16E76;MEDEFAIDRIN SMALL LETTER H;correction +16E77;MEDEFAIDRIN SMALL LETTER NG;correction +1B001;HENTAIGANA LETTER E-1;correction +1D0C5;BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON CHROMA VASIS;correction +E0100;VS17;abbreviation +E0101;VS18;abbreviation +E0102;VS19;abbreviation +E0103;VS20;abbreviation +E0104;VS21;abbreviation +E0105;VS22;abbreviation +E0106;VS23;abbreviation +E0107;VS24;abbreviation +E0108;VS25;abbreviation +E0109;VS26;abbreviation +E010A;VS27;abbreviation +E010B;VS28;abbreviation +E010C;VS29;abbreviation +E010D;VS30;abbreviation +E010E;VS31;abbreviation +E010F;VS32;abbreviation +E0110;VS33;abbreviation +E0111;VS34;abbreviation +E0112;VS35;abbreviation +E0113;VS36;abbreviation +E0114;VS37;abbreviation +E0115;VS38;abbreviation +E0116;VS39;abbreviation +E0117;VS40;abbreviation +E0118;VS41;abbreviation +E0119;VS42;abbreviation +E011A;VS43;abbreviation +E011B;VS44;abbreviation +E011C;VS45;abbreviation +E011D;VS46;abbreviation +E011E;VS47;abbreviation +E011F;VS48;abbreviation +E0120;VS49;abbreviation +E0121;VS50;abbreviation +E0122;VS51;abbreviation +E0123;VS52;abbreviation +E0124;VS53;abbreviation +E0125;VS54;abbreviation +E0126;VS55;abbreviation +E0127;VS56;abbreviation +E0128;VS57;abbreviation +E0129;VS58;abbreviation +E012A;VS59;abbreviation +E012B;VS60;abbreviation +E012C;VS61;abbreviation +E012D;VS62;abbreviation +E012E;VS63;abbreviation +E012F;VS64;abbreviation +E0130;VS65;abbreviation +E0131;VS66;abbreviation +E0132;VS67;abbreviation +E0133;VS68;abbreviation +E0134;VS69;abbreviation +E0135;VS70;abbreviation +E0136;VS71;abbreviation +E0137;VS72;abbreviation +E0138;VS73;abbreviation +E0139;VS74;abbreviation +E013A;VS75;abbreviation +E013B;VS76;abbreviation +E013C;VS77;abbreviation +E013D;VS78;abbreviation +E013E;VS79;abbreviation +E013F;VS80;abbreviation +E0140;VS81;abbreviation +E0141;VS82;abbreviation +E0142;VS83;abbreviation +E0143;VS84;abbreviation +E0144;VS85;abbreviation +E0145;VS86;abbreviation +E0146;VS87;abbreviation +E0147;VS88;abbreviation +E0148;VS89;abbreviation +E0149;VS90;abbreviation +E014A;VS91;abbreviation +E014B;VS92;abbreviation +E014C;VS93;abbreviation +E014D;VS94;abbreviation +E014E;VS95;abbreviation +E014F;VS96;abbreviation +E0150;VS97;abbreviation +E0151;VS98;abbreviation +E0152;VS99;abbreviation +E0153;VS100;abbreviation +E0154;VS101;abbreviation +E0155;VS102;abbreviation +E0156;VS103;abbreviation +E0157;VS104;abbreviation +E0158;VS105;abbreviation +E0159;VS106;abbreviation +E015A;VS107;abbreviation +E015B;VS108;abbreviation +E015C;VS109;abbreviation +E015D;VS110;abbreviation +E015E;VS111;abbreviation +E015F;VS112;abbreviation +E0160;VS113;abbreviation +E0161;VS114;abbreviation +E0162;VS115;abbreviation +E0163;VS116;abbreviation +E0164;VS117;abbreviation +E0165;VS118;abbreviation +E0166;VS119;abbreviation +E0167;VS120;abbreviation +E0168;VS121;abbreviation +E0169;VS122;abbreviation +E016A;VS123;abbreviation +E016B;VS124;abbreviation +E016C;VS125;abbreviation +E016D;VS126;abbreviation +E016E;VS127;abbreviation +E016F;VS128;abbreviation +E0170;VS129;abbreviation +E0171;VS130;abbreviation +E0172;VS131;abbreviation +E0173;VS132;abbreviation +E0174;VS133;abbreviation +E0175;VS134;abbreviation +E0176;VS135;abbreviation +E0177;VS136;abbreviation +E0178;VS137;abbreviation +E0179;VS138;abbreviation +E017A;VS139;abbreviation +E017B;VS140;abbreviation +E017C;VS141;abbreviation +E017D;VS142;abbreviation +E017E;VS143;abbreviation +E017F;VS144;abbreviation +E0180;VS145;abbreviation +E0181;VS146;abbreviation +E0182;VS147;abbreviation +E0183;VS148;abbreviation +E0184;VS149;abbreviation +E0185;VS150;abbreviation +E0186;VS151;abbreviation +E0187;VS152;abbreviation +E0188;VS153;abbreviation +E0189;VS154;abbreviation +E018A;VS155;abbreviation +E018B;VS156;abbreviation +E018C;VS157;abbreviation +E018D;VS158;abbreviation +E018E;VS159;abbreviation +E018F;VS160;abbreviation +E0190;VS161;abbreviation +E0191;VS162;abbreviation +E0192;VS163;abbreviation +E0193;VS164;abbreviation +E0194;VS165;abbreviation +E0195;VS166;abbreviation +E0196;VS167;abbreviation +E0197;VS168;abbreviation +E0198;VS169;abbreviation +E0199;VS170;abbreviation +E019A;VS171;abbreviation +E019B;VS172;abbreviation +E019C;VS173;abbreviation +E019D;VS174;abbreviation +E019E;VS175;abbreviation +E019F;VS176;abbreviation +E01A0;VS177;abbreviation +E01A1;VS178;abbreviation +E01A2;VS179;abbreviation +E01A3;VS180;abbreviation +E01A4;VS181;abbreviation +E01A5;VS182;abbreviation +E01A6;VS183;abbreviation +E01A7;VS184;abbreviation +E01A8;VS185;abbreviation +E01A9;VS186;abbreviation +E01AA;VS187;abbreviation +E01AB;VS188;abbreviation +E01AC;VS189;abbreviation +E01AD;VS190;abbreviation +E01AE;VS191;abbreviation +E01AF;VS192;abbreviation +E01B0;VS193;abbreviation +E01B1;VS194;abbreviation +E01B2;VS195;abbreviation +E01B3;VS196;abbreviation +E01B4;VS197;abbreviation +E01B5;VS198;abbreviation +E01B6;VS199;abbreviation +E01B7;VS200;abbreviation +E01B8;VS201;abbreviation +E01B9;VS202;abbreviation +E01BA;VS203;abbreviation +E01BB;VS204;abbreviation +E01BC;VS205;abbreviation +E01BD;VS206;abbreviation +E01BE;VS207;abbreviation +E01BF;VS208;abbreviation +E01C0;VS209;abbreviation +E01C1;VS210;abbreviation +E01C2;VS211;abbreviation +E01C3;VS212;abbreviation +E01C4;VS213;abbreviation +E01C5;VS214;abbreviation +E01C6;VS215;abbreviation +E01C7;VS216;abbreviation +E01C8;VS217;abbreviation +E01C9;VS218;abbreviation +E01CA;VS219;abbreviation +E01CB;VS220;abbreviation +E01CC;VS221;abbreviation +E01CD;VS222;abbreviation +E01CE;VS223;abbreviation +E01CF;VS224;abbreviation +E01D0;VS225;abbreviation +E01D1;VS226;abbreviation +E01D2;VS227;abbreviation +E01D3;VS228;abbreviation +E01D4;VS229;abbreviation +E01D5;VS230;abbreviation +E01D6;VS231;abbreviation +E01D7;VS232;abbreviation +E01D8;VS233;abbreviation +E01D9;VS234;abbreviation +E01DA;VS235;abbreviation +E01DB;VS236;abbreviation +E01DC;VS237;abbreviation +E01DD;VS238;abbreviation +E01DE;VS239;abbreviation +E01DF;VS240;abbreviation +E01E0;VS241;abbreviation +E01E1;VS242;abbreviation +E01E2;VS243;abbreviation +E01E3;VS244;abbreviation +E01E4;VS245;abbreviation +E01E5;VS246;abbreviation +E01E6;VS247;abbreviation +E01E7;VS248;abbreviation +E01E8;VS249;abbreviation +E01E9;VS250;abbreviation +E01EA;VS251;abbreviation +E01EB;VS252;abbreviation +E01EC;VS253;abbreviation +E01ED;VS254;abbreviation +E01EE;VS255;abbreviation +E01EF;VS256;abbreviation + +# EOF diff -Nru pypy-7.1.1+dfsg/rpython/rlib/unicodedata/NamedSequences-11.0.0.txt pypy-7.3.1+dfsg/rpython/rlib/unicodedata/NamedSequences-11.0.0.txt --- pypy-7.1.1+dfsg/rpython/rlib/unicodedata/NamedSequences-11.0.0.txt 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/rlib/unicodedata/NamedSequences-11.0.0.txt 2020-04-10 19:28:41.000000000 +0000 @@ -0,0 +1,565 @@ +# NamedSequences-11.0.0.txt +# Date: 2017-12-06, 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 +# For documentation, see http://www.unicode.org/reports/tr44/ +# +# Unicode Named Character Sequences +# +# This file is a normative contributory data file in the Unicode +# Character Database. +# +# Format: +# Name of Sequence; Code Point Sequence for USI +# +# Code point sequences in the Unicode Character Database +# use spaces as delimiters. The corresponding format for a +# UCS Sequence Identifier (USI) in ISO/IEC 10646 uses +# comma delimitation and angle brackets. Thus, a Unicode +# named character sequence of the form: +# +# EXAMPLE NAME;1000 1001 1002 +# +# in this data file, would correspond to an ISO/IEC 10646 USI +# as follows: +# +# <1000, 1001, 1002> +# +# For more information, see UAX #34: Unicode Named Character +# Sequences, at http://www.unicode.org/unicode/reports/tr34/ +# +# Note: The order of entries in this file is not significant. +# However, entries are generally in script order corresponding +# to block order in the Unicode Standard, to make it easier +# to find entries in the list. + +# ================================================ + +# Named keycap sequences for telephone keypad (used for emoji) +# Provisional, 2015-05-05 +# FE0F added to the sequences, 2016-05-11 +# Approved 2017-05-12 + +KEYCAP NUMBER SIGN;0023 FE0F 20E3 +KEYCAP ASTERISK;002A FE0F 20E3 +KEYCAP DIGIT ZERO;0030 FE0F 20E3 +KEYCAP DIGIT ONE;0031 FE0F 20E3 +KEYCAP DIGIT TWO;0032 FE0F 20E3 +KEYCAP DIGIT THREE;0033 FE0F 20E3 +KEYCAP DIGIT FOUR;0034 FE0F 20E3 +KEYCAP DIGIT FIVE;0035 FE0F 20E3 +KEYCAP DIGIT SIX;0036 FE0F 20E3 +KEYCAP DIGIT SEVEN;0037 FE0F 20E3 +KEYCAP DIGIT EIGHT;0038 FE0F 20E3 +KEYCAP DIGIT NINE;0039 FE0F 20E3 + +# Latin letter plus accent combinations. +# These are part of the original set of approved named sequences +# for Unicode 4.1. 2005. + +LATIN CAPITAL LETTER A WITH MACRON AND GRAVE;0100 0300 +LATIN SMALL LETTER A WITH MACRON AND GRAVE;0101 0300 +LATIN CAPITAL LETTER E WITH VERTICAL LINE BELOW;0045 0329 +LATIN SMALL LETTER E WITH VERTICAL LINE BELOW;0065 0329 +LATIN CAPITAL LETTER E WITH VERTICAL LINE BELOW AND GRAVE;00C8 0329 +LATIN SMALL LETTER E WITH VERTICAL LINE BELOW AND GRAVE;00E8 0329 +LATIN CAPITAL LETTER E WITH VERTICAL LINE BELOW AND ACUTE;00C9 0329 +LATIN SMALL LETTER E WITH VERTICAL LINE BELOW AND ACUTE;00E9 0329 +LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND MACRON;00CA 0304 +LATIN SMALL LETTER E WITH CIRCUMFLEX AND MACRON;00EA 0304 +LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND CARON;00CA 030C +LATIN SMALL LETTER E WITH CIRCUMFLEX AND CARON;00EA 030C +LATIN CAPITAL LETTER I WITH MACRON AND GRAVE;012A 0300 +LATIN SMALL LETTER I WITH MACRON AND GRAVE;012B 0300 +LATIN SMALL LETTER I WITH DOT ABOVE AND ACUTE;0069 0307 0301 +LATIN SMALL LETTER NG WITH TILDE ABOVE;006E 0360 0067 +LATIN CAPITAL LETTER O WITH VERTICAL LINE BELOW;004F 0329 +LATIN SMALL LETTER O WITH VERTICAL LINE BELOW;006F 0329 +LATIN CAPITAL LETTER O WITH VERTICAL LINE BELOW AND GRAVE;00D2 0329 +LATIN SMALL LETTER O WITH VERTICAL LINE BELOW AND GRAVE;00F2 0329 +LATIN CAPITAL LETTER O WITH VERTICAL LINE BELOW AND ACUTE;00D3 0329 +LATIN SMALL LETTER O WITH VERTICAL LINE BELOW AND ACUTE;00F3 0329 +LATIN CAPITAL LETTER S WITH VERTICAL LINE BELOW;0053 0329 +LATIN SMALL LETTER S WITH VERTICAL LINE BELOW;0073 0329 +LATIN CAPITAL LETTER U WITH MACRON AND GRAVE;016A 0300 +LATIN SMALL LETTER U WITH MACRON AND GRAVE;016B 0300 + +# Additions for Lithuanian. +# Provisional 2006-05-18, Approved 2007-10-19 + +LATIN CAPITAL LETTER A WITH OGONEK AND ACUTE;0104 0301 +LATIN SMALL LETTER A WITH OGONEK AND ACUTE;0105 0301 +LATIN CAPITAL LETTER A WITH OGONEK AND TILDE;0104 0303 +LATIN SMALL LETTER A WITH OGONEK AND TILDE;0105 0303 +LATIN CAPITAL LETTER E WITH OGONEK AND ACUTE;0118 0301 +LATIN SMALL LETTER E WITH OGONEK AND ACUTE;0119 0301 +LATIN CAPITAL LETTER E WITH OGONEK AND TILDE;0118 0303 +LATIN SMALL LETTER E WITH OGONEK AND TILDE;0119 0303 +LATIN CAPITAL LETTER E WITH DOT ABOVE AND ACUTE;0116 0301 +LATIN SMALL LETTER E WITH DOT ABOVE AND ACUTE;0117 0301 +LATIN CAPITAL LETTER E WITH DOT ABOVE AND TILDE;0116 0303 +LATIN SMALL LETTER E WITH DOT ABOVE AND TILDE;0117 0303 +LATIN SMALL LETTER I WITH DOT ABOVE AND GRAVE;0069 0307 0300 +LATIN SMALL LETTER I WITH DOT ABOVE AND TILDE;0069 0307 0303 +LATIN CAPITAL LETTER I WITH OGONEK AND ACUTE;012E 0301 +LATIN SMALL LETTER I WITH OGONEK AND DOT ABOVE AND ACUTE;012F 0307 0301 +LATIN CAPITAL LETTER I WITH OGONEK AND TILDE;012E 0303 +LATIN SMALL LETTER I WITH OGONEK AND DOT ABOVE AND TILDE;012F 0307 0303 +LATIN CAPITAL LETTER J WITH TILDE;004A 0303 +LATIN SMALL LETTER J WITH DOT ABOVE AND TILDE;006A 0307 0303 +LATIN CAPITAL LETTER L WITH TILDE;004C 0303 +LATIN SMALL LETTER L WITH TILDE;006C 0303 +LATIN CAPITAL LETTER M WITH TILDE;004D 0303 +LATIN SMALL LETTER M WITH TILDE;006D 0303 +LATIN CAPITAL LETTER R WITH TILDE;0052 0303 +LATIN SMALL LETTER R WITH TILDE;0072 0303 +LATIN CAPITAL LETTER U WITH OGONEK AND ACUTE;0172 0301 +LATIN SMALL LETTER U WITH OGONEK AND ACUTE;0173 0301 +LATIN CAPITAL LETTER U WITH OGONEK AND TILDE;0172 0303 +LATIN SMALL LETTER U WITH OGONEK AND TILDE;0173 0303 +LATIN CAPITAL LETTER U WITH MACRON AND ACUTE;016A 0301 +LATIN SMALL LETTER U WITH MACRON AND ACUTE;016B 0301 +LATIN CAPITAL LETTER U WITH MACRON AND TILDE;016A 0303 +LATIN SMALL LETTER U WITH MACRON AND TILDE;016B 0303 + +# Entries for JIS X 0213 compatibility mapping. +# Provisional 2008-11-07, Approved 2010-05-14 + +LATIN SMALL LETTER AE WITH GRAVE;00E6 0300 +LATIN SMALL LETTER OPEN O WITH GRAVE;0254 0300 +LATIN SMALL LETTER OPEN O WITH ACUTE;0254 0301 +LATIN SMALL LETTER TURNED V WITH GRAVE;028C 0300 +LATIN SMALL LETTER TURNED V WITH ACUTE;028C 0301 +LATIN SMALL LETTER SCHWA WITH GRAVE;0259 0300 +LATIN SMALL LETTER SCHWA WITH ACUTE;0259 0301 +LATIN SMALL LETTER HOOKED SCHWA WITH GRAVE;025A 0300 +LATIN SMALL LETTER HOOKED SCHWA WITH ACUTE;025A 0301 + +# Entries for Uyghur and Chagatai. +# Provisional N/A, Approved 2012-11-08 + +ARABIC SEQUENCE YEH WITH HAMZA ABOVE WITH ALEF;0626 0627 +ARABIC SEQUENCE YEH WITH HAMZA ABOVE WITH WAW;0626 0648 +ARABIC SEQUENCE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA;0626 0649 +ARABIC SEQUENCE YEH WITH HAMZA ABOVE WITH OE;0626 06C6 +ARABIC SEQUENCE YEH WITH HAMZA ABOVE WITH U;0626 06C7 +ARABIC SEQUENCE YEH WITH HAMZA ABOVE WITH YU;0626 06C8 +ARABIC SEQUENCE YEH WITH HAMZA ABOVE WITH E;0626 06D0 +ARABIC SEQUENCE YEH WITH HAMZA ABOVE WITH AE;0626 06D5 +ARABIC SEQUENCE NOON WITH KEHEH;0646 06A9 + +# Entry for a Bangla entity. +# Provisional 2009-08-10, Approved 2010-05-14 +# +# Note that this same sequence is also used for the ASSAMESE LETTER KSSA. + +BENGALI LETTER KHINYA;0995 09CD 09B7 + +# Additions for Tamil. +# Provisional 2008-02-08, Approved 2009-08-14 +# +# A visual display of the Tamil named character sequences is available +# in the documentation for the Unicode Standard. See Section 12.6, Tamil in +# http://www.unicode.org/versions/latest/ + +TAMIL CONSONANT K; 0B95 0BCD +TAMIL CONSONANT NG; 0B99 0BCD +TAMIL CONSONANT C; 0B9A 0BCD +TAMIL CONSONANT NY; 0B9E 0BCD +TAMIL CONSONANT TT; 0B9F 0BCD +TAMIL CONSONANT NN; 0BA3 0BCD +TAMIL CONSONANT T; 0BA4 0BCD +TAMIL CONSONANT N; 0BA8 0BCD +TAMIL CONSONANT P; 0BAA 0BCD +TAMIL CONSONANT M; 0BAE 0BCD +TAMIL CONSONANT Y; 0BAF 0BCD +TAMIL CONSONANT R; 0BB0 0BCD +TAMIL CONSONANT L; 0BB2 0BCD +TAMIL CONSONANT V; 0BB5 0BCD +TAMIL CONSONANT LLL;0BB4 0BCD +TAMIL CONSONANT LL; 0BB3 0BCD +TAMIL CONSONANT RR; 0BB1 0BCD +TAMIL CONSONANT NNN;0BA9 0BCD +TAMIL CONSONANT J; 0B9C 0BCD +TAMIL CONSONANT SH; 0BB6 0BCD +TAMIL CONSONANT SS; 0BB7 0BCD +TAMIL CONSONANT S; 0BB8 0BCD +TAMIL CONSONANT H; 0BB9 0BCD +TAMIL CONSONANT KSS;0B95 0BCD 0BB7 0BCD + +TAMIL SYLLABLE KAA; 0B95 0BBE +TAMIL SYLLABLE KI; 0B95 0BBF +TAMIL SYLLABLE KII; 0B95 0BC0 +TAMIL SYLLABLE KU; 0B95 0BC1 +TAMIL SYLLABLE KUU; 0B95 0BC2 +TAMIL SYLLABLE KE; 0B95 0BC6 +TAMIL SYLLABLE KEE; 0B95 0BC7 +TAMIL SYLLABLE KAI; 0B95 0BC8 +TAMIL SYLLABLE KO; 0B95 0BCA +TAMIL SYLLABLE KOO; 0B95 0BCB +TAMIL SYLLABLE KAU; 0B95 0BCC + +TAMIL SYLLABLE NGAA; 0B99 0BBE +TAMIL SYLLABLE NGI; 0B99 0BBF +TAMIL SYLLABLE NGII; 0B99 0BC0 +TAMIL SYLLABLE NGU; 0B99 0BC1 +TAMIL SYLLABLE NGUU; 0B99 0BC2 +TAMIL SYLLABLE NGE; 0B99 0BC6 +TAMIL SYLLABLE NGEE; 0B99 0BC7 +TAMIL SYLLABLE NGAI; 0B99 0BC8 +TAMIL SYLLABLE NGO; 0B99 0BCA +TAMIL SYLLABLE NGOO; 0B99 0BCB +TAMIL SYLLABLE NGAU; 0B99 0BCC + +TAMIL SYLLABLE CAA; 0B9A 0BBE +TAMIL SYLLABLE CI; 0B9A 0BBF +TAMIL SYLLABLE CII; 0B9A 0BC0 +TAMIL SYLLABLE CU; 0B9A 0BC1 +TAMIL SYLLABLE CUU; 0B9A 0BC2 +TAMIL SYLLABLE CE; 0B9A 0BC6 +TAMIL SYLLABLE CEE; 0B9A 0BC7 +TAMIL SYLLABLE CAI; 0B9A 0BC8 +TAMIL SYLLABLE CO; 0B9A 0BCA +TAMIL SYLLABLE COO; 0B9A 0BCB +TAMIL SYLLABLE CAU; 0B9A 0BCC + +TAMIL SYLLABLE NYAA; 0B9E 0BBE +TAMIL SYLLABLE NYI; 0B9E 0BBF +TAMIL SYLLABLE NYII; 0B9E 0BC0 +TAMIL SYLLABLE NYU; 0B9E 0BC1 +TAMIL SYLLABLE NYUU; 0B9E 0BC2 +TAMIL SYLLABLE NYE; 0B9E 0BC6 +TAMIL SYLLABLE NYEE; 0B9E 0BC7 +TAMIL SYLLABLE NYAI; 0B9E 0BC8 +TAMIL SYLLABLE NYO; 0B9E 0BCA +TAMIL SYLLABLE NYOO; 0B9E 0BCB +TAMIL SYLLABLE NYAU; 0B9E 0BCC + +TAMIL SYLLABLE TTAA; 0B9F 0BBE +TAMIL SYLLABLE TTI; 0B9F 0BBF +TAMIL SYLLABLE TTII; 0B9F 0BC0 +TAMIL SYLLABLE TTU; 0B9F 0BC1 +TAMIL SYLLABLE TTUU; 0B9F 0BC2 +TAMIL SYLLABLE TTE; 0B9F 0BC6 +TAMIL SYLLABLE TTEE; 0B9F 0BC7 +TAMIL SYLLABLE TTAI; 0B9F 0BC8 +TAMIL SYLLABLE TTO; 0B9F 0BCA +TAMIL SYLLABLE TTOO; 0B9F 0BCB +TAMIL SYLLABLE TTAU; 0B9F 0BCC + +TAMIL SYLLABLE NNAA; 0BA3 0BBE +TAMIL SYLLABLE NNI; 0BA3 0BBF +TAMIL SYLLABLE NNII; 0BA3 0BC0 +TAMIL SYLLABLE NNU; 0BA3 0BC1 +TAMIL SYLLABLE NNUU; 0BA3 0BC2 +TAMIL SYLLABLE NNE; 0BA3 0BC6 +TAMIL SYLLABLE NNEE; 0BA3 0BC7 +TAMIL SYLLABLE NNAI; 0BA3 0BC8 +TAMIL SYLLABLE NNO; 0BA3 0BCA +TAMIL SYLLABLE NNOO; 0BA3 0BCB +TAMIL SYLLABLE NNAU; 0BA3 0BCC + +TAMIL SYLLABLE TAA; 0BA4 0BBE +TAMIL SYLLABLE TI; 0BA4 0BBF +TAMIL SYLLABLE TII; 0BA4 0BC0 +TAMIL SYLLABLE TU; 0BA4 0BC1 +TAMIL SYLLABLE TUU; 0BA4 0BC2 +TAMIL SYLLABLE TE; 0BA4 0BC6 +TAMIL SYLLABLE TEE; 0BA4 0BC7 +TAMIL SYLLABLE TAI; 0BA4 0BC8 +TAMIL SYLLABLE TO; 0BA4 0BCA +TAMIL SYLLABLE TOO; 0BA4 0BCB +TAMIL SYLLABLE TAU; 0BA4 0BCC + +TAMIL SYLLABLE NAA; 0BA8 0BBE +TAMIL SYLLABLE NI; 0BA8 0BBF +TAMIL SYLLABLE NII; 0BA8 0BC0 +TAMIL SYLLABLE NU; 0BA8 0BC1 +TAMIL SYLLABLE NUU; 0BA8 0BC2 +TAMIL SYLLABLE NE; 0BA8 0BC6 +TAMIL SYLLABLE NEE; 0BA8 0BC7 +TAMIL SYLLABLE NAI; 0BA8 0BC8 +TAMIL SYLLABLE NO; 0BA8 0BCA +TAMIL SYLLABLE NOO; 0BA8 0BCB +TAMIL SYLLABLE NAU; 0BA8 0BCC + +TAMIL SYLLABLE PAA; 0BAA 0BBE +TAMIL SYLLABLE PI; 0BAA 0BBF +TAMIL SYLLABLE PII; 0BAA 0BC0 +TAMIL SYLLABLE PU; 0BAA 0BC1 +TAMIL SYLLABLE PUU; 0BAA 0BC2 +TAMIL SYLLABLE PE; 0BAA 0BC6 +TAMIL SYLLABLE PEE; 0BAA 0BC7 +TAMIL SYLLABLE PAI; 0BAA 0BC8 +TAMIL SYLLABLE PO; 0BAA 0BCA +TAMIL SYLLABLE POO; 0BAA 0BCB +TAMIL SYLLABLE PAU; 0BAA 0BCC + +TAMIL SYLLABLE MAA; 0BAE 0BBE +TAMIL SYLLABLE MI; 0BAE 0BBF +TAMIL SYLLABLE MII; 0BAE 0BC0 +TAMIL SYLLABLE MU; 0BAE 0BC1 +TAMIL SYLLABLE MUU; 0BAE 0BC2 +TAMIL SYLLABLE ME; 0BAE 0BC6 +TAMIL SYLLABLE MEE; 0BAE 0BC7 +TAMIL SYLLABLE MAI; 0BAE 0BC8 +TAMIL SYLLABLE MO; 0BAE 0BCA +TAMIL SYLLABLE MOO; 0BAE 0BCB +TAMIL SYLLABLE MAU; 0BAE 0BCC + +TAMIL SYLLABLE YAA; 0BAF 0BBE +TAMIL SYLLABLE YI; 0BAF 0BBF +TAMIL SYLLABLE YII; 0BAF 0BC0 +TAMIL SYLLABLE YU; 0BAF 0BC1 +TAMIL SYLLABLE YUU; 0BAF 0BC2 +TAMIL SYLLABLE YE; 0BAF 0BC6 +TAMIL SYLLABLE YEE; 0BAF 0BC7 +TAMIL SYLLABLE YAI; 0BAF 0BC8 +TAMIL SYLLABLE YO; 0BAF 0BCA +TAMIL SYLLABLE YOO; 0BAF 0BCB +TAMIL SYLLABLE YAU; 0BAF 0BCC + +TAMIL SYLLABLE RAA; 0BB0 0BBE +TAMIL SYLLABLE RI; 0BB0 0BBF +TAMIL SYLLABLE RII; 0BB0 0BC0 +TAMIL SYLLABLE RU; 0BB0 0BC1 +TAMIL SYLLABLE RUU; 0BB0 0BC2 +TAMIL SYLLABLE RE; 0BB0 0BC6 +TAMIL SYLLABLE REE; 0BB0 0BC7 +TAMIL SYLLABLE RAI; 0BB0 0BC8 +TAMIL SYLLABLE RO; 0BB0 0BCA +TAMIL SYLLABLE ROO; 0BB0 0BCB +TAMIL SYLLABLE RAU; 0BB0 0BCC + +TAMIL SYLLABLE LAA; 0BB2 0BBE +TAMIL SYLLABLE LI; 0BB2 0BBF +TAMIL SYLLABLE LII; 0BB2 0BC0 +TAMIL SYLLABLE LU; 0BB2 0BC1 +TAMIL SYLLABLE LUU; 0BB2 0BC2 +TAMIL SYLLABLE LE; 0BB2 0BC6 +TAMIL SYLLABLE LEE; 0BB2 0BC7 +TAMIL SYLLABLE LAI; 0BB2 0BC8 +TAMIL SYLLABLE LO; 0BB2 0BCA +TAMIL SYLLABLE LOO; 0BB2 0BCB +TAMIL SYLLABLE LAU; 0BB2 0BCC + +TAMIL SYLLABLE VAA; 0BB5 0BBE +TAMIL SYLLABLE VI; 0BB5 0BBF +TAMIL SYLLABLE VII; 0BB5 0BC0 +TAMIL SYLLABLE VU; 0BB5 0BC1 +TAMIL SYLLABLE VUU; 0BB5 0BC2 +TAMIL SYLLABLE VE; 0BB5 0BC6 +TAMIL SYLLABLE VEE; 0BB5 0BC7 +TAMIL SYLLABLE VAI; 0BB5 0BC8 +TAMIL SYLLABLE VO; 0BB5 0BCA +TAMIL SYLLABLE VOO; 0BB5 0BCB +TAMIL SYLLABLE VAU; 0BB5 0BCC + +TAMIL SYLLABLE LLLAA; 0BB4 0BBE +TAMIL SYLLABLE LLLI; 0BB4 0BBF +TAMIL SYLLABLE LLLII; 0BB4 0BC0 +TAMIL SYLLABLE LLLU; 0BB4 0BC1 +TAMIL SYLLABLE LLLUU; 0BB4 0BC2 +TAMIL SYLLABLE LLLE; 0BB4 0BC6 +TAMIL SYLLABLE LLLEE; 0BB4 0BC7 +TAMIL SYLLABLE LLLAI; 0BB4 0BC8 +TAMIL SYLLABLE LLLO; 0BB4 0BCA +TAMIL SYLLABLE LLLOO; 0BB4 0BCB +TAMIL SYLLABLE LLLAU; 0BB4 0BCC + +TAMIL SYLLABLE LLAA; 0BB3 0BBE +TAMIL SYLLABLE LLI; 0BB3 0BBF +TAMIL SYLLABLE LLII; 0BB3 0BC0 +TAMIL SYLLABLE LLU; 0BB3 0BC1 +TAMIL SYLLABLE LLUU; 0BB3 0BC2 +TAMIL SYLLABLE LLE; 0BB3 0BC6 +TAMIL SYLLABLE LLEE; 0BB3 0BC7 +TAMIL SYLLABLE LLAI; 0BB3 0BC8 +TAMIL SYLLABLE LLO; 0BB3 0BCA +TAMIL SYLLABLE LLOO; 0BB3 0BCB +TAMIL SYLLABLE LLAU; 0BB3 0BCC + +TAMIL SYLLABLE RRAA; 0BB1 0BBE +TAMIL SYLLABLE RRI; 0BB1 0BBF +TAMIL SYLLABLE RRII; 0BB1 0BC0 +TAMIL SYLLABLE RRU; 0BB1 0BC1 +TAMIL SYLLABLE RRUU; 0BB1 0BC2 +TAMIL SYLLABLE RRE; 0BB1 0BC6 +TAMIL SYLLABLE RREE; 0BB1 0BC7 +TAMIL SYLLABLE RRAI; 0BB1 0BC8 +TAMIL SYLLABLE RRO; 0BB1 0BCA +TAMIL SYLLABLE RROO; 0BB1 0BCB +TAMIL SYLLABLE RRAU; 0BB1 0BCC + +TAMIL SYLLABLE NNNAA; 0BA9 0BBE +TAMIL SYLLABLE NNNI; 0BA9 0BBF +TAMIL SYLLABLE NNNII; 0BA9 0BC0 +TAMIL SYLLABLE NNNU; 0BA9 0BC1 +TAMIL SYLLABLE NNNUU; 0BA9 0BC2 +TAMIL SYLLABLE NNNE; 0BA9 0BC6 +TAMIL SYLLABLE NNNEE; 0BA9 0BC7 +TAMIL SYLLABLE NNNAI; 0BA9 0BC8 +TAMIL SYLLABLE NNNO; 0BA9 0BCA +TAMIL SYLLABLE NNNOO; 0BA9 0BCB +TAMIL SYLLABLE NNNAU; 0BA9 0BCC + +TAMIL SYLLABLE JAA; 0B9C 0BBE +TAMIL SYLLABLE JI; 0B9C 0BBF +TAMIL SYLLABLE JII; 0B9C 0BC0 +TAMIL SYLLABLE JU; 0B9C 0BC1 +TAMIL SYLLABLE JUU; 0B9C 0BC2 +TAMIL SYLLABLE JE; 0B9C 0BC6 +TAMIL SYLLABLE JEE; 0B9C 0BC7 +TAMIL SYLLABLE JAI; 0B9C 0BC8 +TAMIL SYLLABLE JO; 0B9C 0BCA +TAMIL SYLLABLE JOO; 0B9C 0BCB +TAMIL SYLLABLE JAU; 0B9C 0BCC + +TAMIL SYLLABLE SHAA; 0BB6 0BBE +TAMIL SYLLABLE SHI; 0BB6 0BBF +TAMIL SYLLABLE SHII; 0BB6 0BC0 +TAMIL SYLLABLE SHU; 0BB6 0BC1 +TAMIL SYLLABLE SHUU; 0BB6 0BC2 +TAMIL SYLLABLE SHE; 0BB6 0BC6 +TAMIL SYLLABLE SHEE; 0BB6 0BC7 +TAMIL SYLLABLE SHAI; 0BB6 0BC8 +TAMIL SYLLABLE SHO; 0BB6 0BCA +TAMIL SYLLABLE SHOO; 0BB6 0BCB +TAMIL SYLLABLE SHAU; 0BB6 0BCC + +TAMIL SYLLABLE SSAA; 0BB7 0BBE +TAMIL SYLLABLE SSI; 0BB7 0BBF +TAMIL SYLLABLE SSII; 0BB7 0BC0 +TAMIL SYLLABLE SSU; 0BB7 0BC1 +TAMIL SYLLABLE SSUU; 0BB7 0BC2 +TAMIL SYLLABLE SSE; 0BB7 0BC6 +TAMIL SYLLABLE SSEE; 0BB7 0BC7 +TAMIL SYLLABLE SSAI; 0BB7 0BC8 +TAMIL SYLLABLE SSO; 0BB7 0BCA +TAMIL SYLLABLE SSOO; 0BB7 0BCB +TAMIL SYLLABLE SSAU; 0BB7 0BCC + +TAMIL SYLLABLE SAA; 0BB8 0BBE +TAMIL SYLLABLE SI; 0BB8 0BBF +TAMIL SYLLABLE SII; 0BB8 0BC0 +TAMIL SYLLABLE SU; 0BB8 0BC1 +TAMIL SYLLABLE SUU; 0BB8 0BC2 +TAMIL SYLLABLE SE; 0BB8 0BC6 +TAMIL SYLLABLE SEE; 0BB8 0BC7 +TAMIL SYLLABLE SAI; 0BB8 0BC8 +TAMIL SYLLABLE SO; 0BB8 0BCA +TAMIL SYLLABLE SOO; 0BB8 0BCB +TAMIL SYLLABLE SAU; 0BB8 0BCC + +TAMIL SYLLABLE HAA; 0BB9 0BBE +TAMIL SYLLABLE HI; 0BB9 0BBF +TAMIL SYLLABLE HII; 0BB9 0BC0 +TAMIL SYLLABLE HU; 0BB9 0BC1 +TAMIL SYLLABLE HUU; 0BB9 0BC2 +TAMIL SYLLABLE HE; 0BB9 0BC6 +TAMIL SYLLABLE HEE; 0BB9 0BC7 +TAMIL SYLLABLE HAI; 0BB9 0BC8 +TAMIL SYLLABLE HO; 0BB9 0BCA +TAMIL SYLLABLE HOO; 0BB9 0BCB +TAMIL SYLLABLE HAU; 0BB9 0BCC + +TAMIL SYLLABLE KSSA; 0B95 0BCD 0BB7 +TAMIL SYLLABLE KSSAA; 0B95 0BCD 0BB7 0BBE +TAMIL SYLLABLE KSSI; 0B95 0BCD 0BB7 0BBF +TAMIL SYLLABLE KSSII; 0B95 0BCD 0BB7 0BC0 +TAMIL SYLLABLE KSSU; 0B95 0BCD 0BB7 0BC1 +TAMIL SYLLABLE KSSUU; 0B95 0BCD 0BB7 0BC2 +TAMIL SYLLABLE KSSE; 0B95 0BCD 0BB7 0BC6 +TAMIL SYLLABLE KSSEE; 0B95 0BCD 0BB7 0BC7 +TAMIL SYLLABLE KSSAI; 0B95 0BCD 0BB7 0BC8 +TAMIL SYLLABLE KSSO; 0B95 0BCD 0BB7 0BCA +TAMIL SYLLABLE KSSOO; 0B95 0BCD 0BB7 0BCB +TAMIL SYLLABLE KSSAU; 0B95 0BCD 0BB7 0BCC + +TAMIL SYLLABLE SHRII; 0BB6 0BCD 0BB0 0BC0 + +# Sinhala medial consonants and "reph" form. +# Provisional 2010-05-13, Approved 2011-08-05 + +SINHALA CONSONANT SIGN YANSAYA;0DCA 200D 0DBA +SINHALA CONSONANT SIGN RAKAARAANSAYA;0DCA 200D 0DBB +SINHALA CONSONANT SIGN REPAYA;0DBB 0DCA 200D + +# Georgian letter plus accent sequence. +# This is part of the original set of approved named sequences +# for Unicode 4.1. 2005. + +GEORGIAN LETTER U-BRJGU;10E3 0302 + +# Khmer subjoined forms and other sequences. +# These are part of the original set of approved named sequences +# for Unicode 4.1. 2005. + +KHMER CONSONANT SIGN COENG KA;17D2 1780 +KHMER CONSONANT SIGN COENG KHA;17D2 1781 +KHMER CONSONANT SIGN COENG KO;17D2 1782 +KHMER CONSONANT SIGN COENG KHO;17D2 1783 +KHMER CONSONANT SIGN COENG NGO;17D2 1784 +KHMER CONSONANT SIGN COENG CA;17D2 1785 +KHMER CONSONANT SIGN COENG CHA;17D2 1786 +KHMER CONSONANT SIGN COENG CO;17D2 1787 +KHMER CONSONANT SIGN COENG CHO;17D2 1788 +KHMER CONSONANT SIGN COENG NYO;17D2 1789 +KHMER CONSONANT SIGN COENG DA;17D2 178A +KHMER CONSONANT SIGN COENG TTHA;17D2 178B +KHMER CONSONANT SIGN COENG DO;17D2 178C +KHMER CONSONANT SIGN COENG TTHO;17D2 178D +KHMER CONSONANT SIGN COENG NA;17D2 178E +KHMER CONSONANT SIGN COENG TA;17D2 178F +KHMER CONSONANT SIGN COENG THA;17D2 1790 +KHMER CONSONANT SIGN COENG TO;17D2 1791 +KHMER CONSONANT SIGN COENG THO;17D2 1792 +KHMER CONSONANT SIGN COENG NO;17D2 1793 +KHMER CONSONANT SIGN COENG BA;17D2 1794 +KHMER CONSONANT SIGN COENG PHA;17D2 1795 +KHMER CONSONANT SIGN COENG PO;17D2 1796 +KHMER CONSONANT SIGN COENG PHO;17D2 1797 +KHMER CONSONANT SIGN COENG MO;17D2 1798 +KHMER CONSONANT SIGN COENG YO;17D2 1799 +KHMER CONSONANT SIGN COENG RO;17D2 179A +KHMER CONSONANT SIGN COENG LO;17D2 179B +KHMER CONSONANT SIGN COENG VO;17D2 179C +KHMER CONSONANT SIGN COENG SHA;17D2 179D +KHMER CONSONANT SIGN COENG SSA;17D2 179E +KHMER CONSONANT SIGN COENG SA;17D2 179F +KHMER CONSONANT SIGN COENG HA;17D2 17A0 +KHMER CONSONANT SIGN COENG LA;17D2 17A1 +KHMER VOWEL SIGN COENG QA;17D2 17A2 +KHMER INDEPENDENT VOWEL SIGN COENG QU;17D2 17A7 +KHMER INDEPENDENT VOWEL SIGN COENG RY;17D2 17AB +KHMER INDEPENDENT VOWEL SIGN COENG RYY;17D2 17AC +KHMER INDEPENDENT VOWEL SIGN COENG QE;17D2 17AF +KHMER VOWEL SIGN OM;17BB 17C6 +KHMER VOWEL SIGN AAM;17B6 17C6 + +# Entries for JIS X 0213 compatibility mapping. +# Provisional 2008-11-07, Approved 2010-05-14 +# +# Two of these were part of the original set of approved named sequences +# for Unicode 4.1. 2005. + +HIRAGANA LETTER BIDAKUON NGA;304B 309A +HIRAGANA LETTER BIDAKUON NGI;304D 309A +HIRAGANA LETTER BIDAKUON NGU;304F 309A +HIRAGANA LETTER BIDAKUON NGE;3051 309A +HIRAGANA LETTER BIDAKUON NGO;3053 309A +KATAKANA LETTER BIDAKUON NGA;30AB 309A +KATAKANA LETTER BIDAKUON NGI;30AD 309A +KATAKANA LETTER BIDAKUON NGU;30AF 309A +KATAKANA LETTER BIDAKUON NGE;30B1 309A +KATAKANA LETTER BIDAKUON NGO;30B3 309A +KATAKANA LETTER AINU CE;30BB 309A +KATAKANA LETTER AINU TU;30C4 309A +KATAKANA LETTER AINU TO;30C8 309A +KATAKANA LETTER AINU P;31F7 309A +MODIFIER LETTER EXTRA-HIGH EXTRA-LOW CONTOUR TONE BAR;02E5 02E9 +MODIFIER LETTER EXTRA-LOW EXTRA-HIGH CONTOUR TONE BAR;02E9 02E5 + +# EOF diff -Nru pypy-7.1.1+dfsg/rpython/rlib/unicodedata/SpecialCasing-11.0.0.txt pypy-7.3.1+dfsg/rpython/rlib/unicodedata/SpecialCasing-11.0.0.txt --- pypy-7.1.1+dfsg/rpython/rlib/unicodedata/SpecialCasing-11.0.0.txt 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/rlib/unicodedata/SpecialCasing-11.0.0.txt 2020-04-10 19:28:41.000000000 +0000 @@ -0,0 +1,281 @@ +# SpecialCasing-11.0.0.txt +# Date: 2018-02-22, 06:16:47 GMT +# © 2018 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/ +# +# Special Casing +# +# This file is a supplement to the UnicodeData.txt file. It does not define any +# properties, but rather provides additional information about the casing of +# Unicode characters, for situations when casing incurs a change in string length +# or is dependent on context or locale. For compatibility, the UnicodeData.txt +# file only contains simple case mappings for characters where they are one-to-one +# and independent of context and language. The data in this file, combined with +# the simple case mappings in UnicodeData.txt, defines the full case mappings +# Lowercase_Mapping (lc), Titlecase_Mapping (tc), and Uppercase_Mapping (uc). +# +# Note that the preferred mechanism for defining tailored casing operations is +# the Unicode Common Locale Data Repository (CLDR). For more information, see the +# discussion of case mappings and case algorithms in the Unicode Standard. +# +# All code points not listed in this file that do not have a simple case mappings +# in UnicodeData.txt map to themselves. +# ================================================================================ +# Format +# ================================================================================ +# The entries in this file are in the following machine-readable format: +# +# ; ; ; <upper>; (<condition_list>;)? # <comment> +# +# <code>, <lower>, <title>, and <upper> provide the respective full case mappings +# of <code>, expressed as character values in hex. If there is more than one character, +# they are separated by spaces. Other than as used to separate elements, spaces are +# to be ignored. +# +# The <condition_list> is optional. Where present, it consists of one or more language IDs +# or casing contexts, separated by spaces. In these conditions: +# - A condition list overrides the normal behavior if all of the listed conditions are true. +# - The casing context is always the context of the characters in the original string, +# NOT in the resulting string. +# - Case distinctions in the condition list are not significant. +# - Conditions preceded by "Not_" represent the negation of the condition. +# The condition list is not represented in the UCD as a formal property. +# +# A language ID is defined by BCP 47, with '-' and '_' treated equivalently. +# +# A casing context for a character is defined by Section 3.13 Default Case Algorithms +# of The Unicode Standard. +# +# Parsers of this file must be prepared to deal with future additions to this format: +# * Additional contexts +# * Additional fields +# ================================================================================ + +# ================================================================================ +# Unconditional mappings +# ================================================================================ + +# The German es-zed is special--the normal mapping is to SS. +# Note: the titlecase should never occur in practice. It is equal to titlecase(uppercase(<es-zed>)) + +00DF; 00DF; 0053 0073; 0053 0053; # LATIN SMALL LETTER SHARP S + +# Preserve canonical equivalence for I with dot. Turkic is handled below. + +0130; 0069 0307; 0130; 0130; # LATIN CAPITAL LETTER I WITH DOT ABOVE + +# Ligatures + +FB00; FB00; 0046 0066; 0046 0046; # LATIN SMALL LIGATURE FF +FB01; FB01; 0046 0069; 0046 0049; # LATIN SMALL LIGATURE FI +FB02; FB02; 0046 006C; 0046 004C; # LATIN SMALL LIGATURE FL +FB03; FB03; 0046 0066 0069; 0046 0046 0049; # LATIN SMALL LIGATURE FFI +FB04; FB04; 0046 0066 006C; 0046 0046 004C; # LATIN SMALL LIGATURE FFL +FB05; FB05; 0053 0074; 0053 0054; # LATIN SMALL LIGATURE LONG S T +FB06; FB06; 0053 0074; 0053 0054; # LATIN SMALL LIGATURE ST + +0587; 0587; 0535 0582; 0535 0552; # ARMENIAN SMALL LIGATURE ECH YIWN +FB13; FB13; 0544 0576; 0544 0546; # ARMENIAN SMALL LIGATURE MEN NOW +FB14; FB14; 0544 0565; 0544 0535; # ARMENIAN SMALL LIGATURE MEN ECH +FB15; FB15; 0544 056B; 0544 053B; # ARMENIAN SMALL LIGATURE MEN INI +FB16; FB16; 054E 0576; 054E 0546; # ARMENIAN SMALL LIGATURE VEW NOW +FB17; FB17; 0544 056D; 0544 053D; # ARMENIAN SMALL LIGATURE MEN XEH + +# No corresponding uppercase precomposed character + +0149; 0149; 02BC 004E; 02BC 004E; # LATIN SMALL LETTER N PRECEDED BY APOSTROPHE +0390; 0390; 0399 0308 0301; 0399 0308 0301; # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS +03B0; 03B0; 03A5 0308 0301; 03A5 0308 0301; # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS +01F0; 01F0; 004A 030C; 004A 030C; # LATIN SMALL LETTER J WITH CARON +1E96; 1E96; 0048 0331; 0048 0331; # LATIN SMALL LETTER H WITH LINE BELOW +1E97; 1E97; 0054 0308; 0054 0308; # LATIN SMALL LETTER T WITH DIAERESIS +1E98; 1E98; 0057 030A; 0057 030A; # LATIN SMALL LETTER W WITH RING ABOVE +1E99; 1E99; 0059 030A; 0059 030A; # LATIN SMALL LETTER Y WITH RING ABOVE +1E9A; 1E9A; 0041 02BE; 0041 02BE; # LATIN SMALL LETTER A WITH RIGHT HALF RING +1F50; 1F50; 03A5 0313; 03A5 0313; # GREEK SMALL LETTER UPSILON WITH PSILI +1F52; 1F52; 03A5 0313 0300; 03A5 0313 0300; # GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA +1F54; 1F54; 03A5 0313 0301; 03A5 0313 0301; # GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA +1F56; 1F56; 03A5 0313 0342; 03A5 0313 0342; # GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI +1FB6; 1FB6; 0391 0342; 0391 0342; # GREEK SMALL LETTER ALPHA WITH PERISPOMENI +1FC6; 1FC6; 0397 0342; 0397 0342; # GREEK SMALL LETTER ETA WITH PERISPOMENI +1FD2; 1FD2; 0399 0308 0300; 0399 0308 0300; # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA +1FD3; 1FD3; 0399 0308 0301; 0399 0308 0301; # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA +1FD6; 1FD6; 0399 0342; 0399 0342; # GREEK SMALL LETTER IOTA WITH PERISPOMENI +1FD7; 1FD7; 0399 0308 0342; 0399 0308 0342; # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI +1FE2; 1FE2; 03A5 0308 0300; 03A5 0308 0300; # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA +1FE3; 1FE3; 03A5 0308 0301; 03A5 0308 0301; # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA +1FE4; 1FE4; 03A1 0313; 03A1 0313; # GREEK SMALL LETTER RHO WITH PSILI +1FE6; 1FE6; 03A5 0342; 03A5 0342; # GREEK SMALL LETTER UPSILON WITH PERISPOMENI +1FE7; 1FE7; 03A5 0308 0342; 03A5 0308 0342; # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI +1FF6; 1FF6; 03A9 0342; 03A9 0342; # GREEK SMALL LETTER OMEGA WITH PERISPOMENI + +# IMPORTANT-when iota-subscript (0345) is uppercased or titlecased, +# the result will be incorrect unless the iota-subscript is moved to the end +# of any sequence of combining marks. Otherwise, the accents will go on the capital iota. +# This process can be achieved by first transforming the text to NFC before casing. +# E.g. <alpha><iota_subscript><acute> is uppercased to <ALPHA><acute><IOTA> + +# The following cases are already in the UnicodeData.txt file, so are only commented here. + +# 0345; 0345; 0399; 0399; # COMBINING GREEK YPOGEGRAMMENI + +# All letters with YPOGEGRAMMENI (iota-subscript) or PROSGEGRAMMENI (iota adscript) +# have special uppercases. +# Note: characters with PROSGEGRAMMENI are actually titlecase, not uppercase! + +1F80; 1F80; 1F88; 1F08 0399; # GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI +1F81; 1F81; 1F89; 1F09 0399; # GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI +1F82; 1F82; 1F8A; 1F0A 0399; # GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI +1F83; 1F83; 1F8B; 1F0B 0399; # GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI +1F84; 1F84; 1F8C; 1F0C 0399; # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI +1F85; 1F85; 1F8D; 1F0D 0399; # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI +1F86; 1F86; 1F8E; 1F0E 0399; # GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI +1F87; 1F87; 1F8F; 1F0F 0399; # GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI +1F88; 1F80; 1F88; 1F08 0399; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI +1F89; 1F81; 1F89; 1F09 0399; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI +1F8A; 1F82; 1F8A; 1F0A 0399; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI +1F8B; 1F83; 1F8B; 1F0B 0399; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI +1F8C; 1F84; 1F8C; 1F0C 0399; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI +1F8D; 1F85; 1F8D; 1F0D 0399; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI +1F8E; 1F86; 1F8E; 1F0E 0399; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI +1F8F; 1F87; 1F8F; 1F0F 0399; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI +1F90; 1F90; 1F98; 1F28 0399; # GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI +1F91; 1F91; 1F99; 1F29 0399; # GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI +1F92; 1F92; 1F9A; 1F2A 0399; # GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI +1F93; 1F93; 1F9B; 1F2B 0399; # GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI +1F94; 1F94; 1F9C; 1F2C 0399; # GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI +1F95; 1F95; 1F9D; 1F2D 0399; # GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI +1F96; 1F96; 1F9E; 1F2E 0399; # GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI +1F97; 1F97; 1F9F; 1F2F 0399; # GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI +1F98; 1F90; 1F98; 1F28 0399; # GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI +1F99; 1F91; 1F99; 1F29 0399; # GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI +1F9A; 1F92; 1F9A; 1F2A 0399; # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI +1F9B; 1F93; 1F9B; 1F2B 0399; # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI +1F9C; 1F94; 1F9C; 1F2C 0399; # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI +1F9D; 1F95; 1F9D; 1F2D 0399; # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI +1F9E; 1F96; 1F9E; 1F2E 0399; # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI +1F9F; 1F97; 1F9F; 1F2F 0399; # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI +1FA0; 1FA0; 1FA8; 1F68 0399; # GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI +1FA1; 1FA1; 1FA9; 1F69 0399; # GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI +1FA2; 1FA2; 1FAA; 1F6A 0399; # GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI +1FA3; 1FA3; 1FAB; 1F6B 0399; # GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI +1FA4; 1FA4; 1FAC; 1F6C 0399; # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI +1FA5; 1FA5; 1FAD; 1F6D 0399; # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI +1FA6; 1FA6; 1FAE; 1F6E 0399; # GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI +1FA7; 1FA7; 1FAF; 1F6F 0399; # GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI +1FA8; 1FA0; 1FA8; 1F68 0399; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI +1FA9; 1FA1; 1FA9; 1F69 0399; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI +1FAA; 1FA2; 1FAA; 1F6A 0399; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI +1FAB; 1FA3; 1FAB; 1F6B 0399; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI +1FAC; 1FA4; 1FAC; 1F6C 0399; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI +1FAD; 1FA5; 1FAD; 1F6D 0399; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI +1FAE; 1FA6; 1FAE; 1F6E 0399; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI +1FAF; 1FA7; 1FAF; 1F6F 0399; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI +1FB3; 1FB3; 1FBC; 0391 0399; # GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI +1FBC; 1FB3; 1FBC; 0391 0399; # GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI +1FC3; 1FC3; 1FCC; 0397 0399; # GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI +1FCC; 1FC3; 1FCC; 0397 0399; # GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI +1FF3; 1FF3; 1FFC; 03A9 0399; # GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI +1FFC; 1FF3; 1FFC; 03A9 0399; # GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI + +# Some characters with YPOGEGRAMMENI also have no corresponding titlecases + +1FB2; 1FB2; 1FBA 0345; 1FBA 0399; # GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI +1FB4; 1FB4; 0386 0345; 0386 0399; # GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI +1FC2; 1FC2; 1FCA 0345; 1FCA 0399; # GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI +1FC4; 1FC4; 0389 0345; 0389 0399; # GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI +1FF2; 1FF2; 1FFA 0345; 1FFA 0399; # GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI +1FF4; 1FF4; 038F 0345; 038F 0399; # GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI + +1FB7; 1FB7; 0391 0342 0345; 0391 0342 0399; # GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI +1FC7; 1FC7; 0397 0342 0345; 0397 0342 0399; # GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI +1FF7; 1FF7; 03A9 0342 0345; 03A9 0342 0399; # GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI + +# ================================================================================ +# Conditional Mappings +# The remainder of this file provides conditional casing data used to produce +# full case mappings. +# ================================================================================ +# Language-Insensitive Mappings +# These are characters whose full case mappings do not depend on language, but do +# depend on context (which characters come before or after). For more information +# see the header of this file and the Unicode Standard. +# ================================================================================ + +# Special case for final form of sigma + +03A3; 03C2; 03A3; 03A3; Final_Sigma; # GREEK CAPITAL LETTER SIGMA + +# Note: the following cases for non-final are already in the UnicodeData.txt file. + +# 03A3; 03C3; 03A3; 03A3; # GREEK CAPITAL LETTER SIGMA +# 03C3; 03C3; 03A3; 03A3; # GREEK SMALL LETTER SIGMA +# 03C2; 03C2; 03A3; 03A3; # GREEK SMALL LETTER FINAL SIGMA + +# Note: the following cases are not included, since they would case-fold in lowercasing + +# 03C3; 03C2; 03A3; 03A3; Final_Sigma; # GREEK SMALL LETTER SIGMA +# 03C2; 03C3; 03A3; 03A3; Not_Final_Sigma; # GREEK SMALL LETTER FINAL SIGMA + +# ================================================================================ +# Language-Sensitive Mappings +# These are characters whose full case mappings depend on language and perhaps also +# context (which characters come before or after). For more information +# see the header of this file and the Unicode Standard. +# ================================================================================ + +# Lithuanian + +# Lithuanian retains the dot in a lowercase i when followed by accents. + +# Remove DOT ABOVE after "i" with upper or titlecase + +0307; 0307; ; ; lt After_Soft_Dotted; # COMBINING DOT ABOVE + +# Introduce an explicit dot above when lowercasing capital I's and J's +# whenever there are more accents above. +# (of the accents used in Lithuanian: grave, acute, tilde above, and ogonek) + +0049; 0069 0307; 0049; 0049; lt More_Above; # LATIN CAPITAL LETTER I +004A; 006A 0307; 004A; 004A; lt More_Above; # LATIN CAPITAL LETTER J +012E; 012F 0307; 012E; 012E; lt More_Above; # LATIN CAPITAL LETTER I WITH OGONEK +00CC; 0069 0307 0300; 00CC; 00CC; lt; # LATIN CAPITAL LETTER I WITH GRAVE +00CD; 0069 0307 0301; 00CD; 00CD; lt; # LATIN CAPITAL LETTER I WITH ACUTE +0128; 0069 0307 0303; 0128; 0128; lt; # LATIN CAPITAL LETTER I WITH TILDE + +# ================================================================================ + +# Turkish and Azeri + +# I and i-dotless; I-dot and i are case pairs in Turkish and Azeri +# The following rules handle those cases. + +0130; 0069; 0130; 0130; tr; # LATIN CAPITAL LETTER I WITH DOT ABOVE +0130; 0069; 0130; 0130; az; # LATIN CAPITAL LETTER I WITH DOT ABOVE + +# When lowercasing, remove dot_above in the sequence I + dot_above, which will turn into i. +# This matches the behavior of the canonically equivalent I-dot_above + +0307; ; 0307; 0307; tr After_I; # COMBINING DOT ABOVE +0307; ; 0307; 0307; az After_I; # COMBINING DOT ABOVE + +# When lowercasing, unless an I is before a dot_above, it turns into a dotless i. + +0049; 0131; 0049; 0049; tr Not_Before_Dot; # LATIN CAPITAL LETTER I +0049; 0131; 0049; 0049; az Not_Before_Dot; # LATIN CAPITAL LETTER I + +# When uppercasing, i turns into a dotted capital I + +0069; 0069; 0130; 0130; tr; # LATIN SMALL LETTER I +0069; 0069; 0130; 0130; az; # LATIN SMALL LETTER I + +# Note: the following case is already in the UnicodeData.txt file. + +# 0131; 0131; 0049; 0049; tr; # LATIN SMALL LETTER DOTLESS I + +# EOF + diff -Nru pypy-7.1.1+dfsg/rpython/rlib/unicodedata/test/test_ucd.py pypy-7.3.1+dfsg/rpython/rlib/unicodedata/test/test_ucd.py --- pypy-7.1.1+dfsg/rpython/rlib/unicodedata/test/test_ucd.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/rlib/unicodedata/test/test_ucd.py 2020-04-10 19:28:41.000000000 +0000 @@ -1,5 +1,6 @@ +import pytest from rpython.rlib.runicode import code_to_unichr, MAXUNICODE -from rpython.rlib.unicodedata import unicodedb_5_2_0 +from rpython.rlib.unicodedata import unicodedb_5_2_0, unicodedb_11_0_0 from rpython.rtyper.test.tool import BaseRtypingTest from rpython.translator.c.test.test_genc import compile @@ -26,3 +27,26 @@ assert got == 0xd808 # first char of a pair else: assert got == 0x12346 + +def test_cjk(): + cases = [ + ('3400', '4DB5'), + ('4E00', '9FEF'), + ('20000', '2A6D6'), + ('2A700', '2B734'), + ('2B740', '2B81D'), + ('2B820', '2CEA1'), + ] + for first, last in cases: + first = int(first, 16) + last = int(last, 16) + # Test at and inside the boundary + for i in (first, first + 1, last - 1, last): + charname = 'CJK UNIFIED IDEOGRAPH-%X'%i + assert unicodedb_11_0_0.lookup(charname) == i + # Test outside the boundary + for i in first - 1, last + 1: + charname = 'CJK UNIFIED IDEOGRAPH-%X'%i + with pytest.raises(KeyError): + unicodedb_11_0_0.lookup(charname) + diff -Nru pypy-7.1.1+dfsg/rpython/rlib/unicodedata/test/test_unicodedata.py pypy-7.3.1+dfsg/rpython/rlib/unicodedata/test/test_unicodedata.py --- pypy-7.1.1+dfsg/rpython/rlib/unicodedata/test/test_unicodedata.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/rlib/unicodedata/test/test_unicodedata.py 2020-04-10 19:28:41.000000000 +0000 @@ -6,7 +6,7 @@ from rpython.rlib.unicodedata import ( unicodedb_3_2_0, unicodedb_5_2_0, unicodedb_6_0_0, unicodedb_6_2_0, - unicodedb_8_0_0) + unicodedb_8_0_0, unicodedb_11_0_0) class TestUnicodeData(object): @@ -160,3 +160,7 @@ # returns the argument itself, and not None, in rare cases # where tolower_full() would return something different assert unicodedb_8_0_0.casefold_lookup(0x13A0) == [0x13A0] + +class TestUnicodeData1100(object): + def test_changed_in_version_11(self): + unicodedb_11_0_0.name(0x1f970) == 'SMILING FACE WITH SMILING EYES AND THREE HEARTS' diff -Nru pypy-7.1.1+dfsg/rpython/rlib/unicodedata/UnicodeData-11.0.0.txt pypy-7.3.1+dfsg/rpython/rlib/unicodedata/UnicodeData-11.0.0.txt --- pypy-7.1.1+dfsg/rpython/rlib/unicodedata/UnicodeData-11.0.0.txt 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/rlib/unicodedata/UnicodeData-11.0.0.txt 2020-04-10 19:28:41.000000000 +0000 @@ -0,0 +1,32292 @@ +0000;<control>;Cc;0;BN;;;;;N;NULL;;;; +0001;<control>;Cc;0;BN;;;;;N;START OF HEADING;;;; +0002;<control>;Cc;0;BN;;;;;N;START OF TEXT;;;; +0003;<control>;Cc;0;BN;;;;;N;END OF TEXT;;;; +0004;<control>;Cc;0;BN;;;;;N;END OF TRANSMISSION;;;; +0005;<control>;Cc;0;BN;;;;;N;ENQUIRY;;;; +0006;<control>;Cc;0;BN;;;;;N;ACKNOWLEDGE;;;; +0007;<control>;Cc;0;BN;;;;;N;BELL;;;; +0008;<control>;Cc;0;BN;;;;;N;BACKSPACE;;;; +0009;<control>;Cc;0;S;;;;;N;CHARACTER TABULATION;;;; +000A;<control>;Cc;0;B;;;;;N;LINE FEED (LF);;;; +000B;<control>;Cc;0;S;;;;;N;LINE TABULATION;;;; +000C;<control>;Cc;0;WS;;;;;N;FORM FEED (FF);;;; +000D;<control>;Cc;0;B;;;;;N;CARRIAGE RETURN (CR);;;; +000E;<control>;Cc;0;BN;;;;;N;SHIFT OUT;;;; +000F;<control>;Cc;0;BN;;;;;N;SHIFT IN;;;; +0010;<control>;Cc;0;BN;;;;;N;DATA LINK ESCAPE;;;; +0011;<control>;Cc;0;BN;;;;;N;DEVICE CONTROL ONE;;;; +0012;<control>;Cc;0;BN;;;;;N;DEVICE CONTROL TWO;;;; +0013;<control>;Cc;0;BN;;;;;N;DEVICE CONTROL THREE;;;; +0014;<control>;Cc;0;BN;;;;;N;DEVICE CONTROL FOUR;;;; +0015;<control>;Cc;0;BN;;;;;N;NEGATIVE ACKNOWLEDGE;;;; +0016;<control>;Cc;0;BN;;;;;N;SYNCHRONOUS IDLE;;;; +0017;<control>;Cc;0;BN;;;;;N;END OF TRANSMISSION BLOCK;;;; +0018;<control>;Cc;0;BN;;;;;N;CANCEL;;;; +0019;<control>;Cc;0;BN;;;;;N;END OF MEDIUM;;;; +001A;<control>;Cc;0;BN;;;;;N;SUBSTITUTE;;;; +001B;<control>;Cc;0;BN;;;;;N;ESCAPE;;;; +001C;<control>;Cc;0;B;;;;;N;INFORMATION SEPARATOR FOUR;;;; +001D;<control>;Cc;0;B;;;;;N;INFORMATION SEPARATOR THREE;;;; +001E;<control>;Cc;0;B;;;;;N;INFORMATION SEPARATOR TWO;;;; +001F;<control>;Cc;0;S;;;;;N;INFORMATION SEPARATOR ONE;;;; +0020;SPACE;Zs;0;WS;;;;;N;;;;; +0021;EXCLAMATION MARK;Po;0;ON;;;;;N;;;;; +0022;QUOTATION MARK;Po;0;ON;;;;;N;;;;; +0023;NUMBER SIGN;Po;0;ET;;;;;N;;;;; +0024;DOLLAR SIGN;Sc;0;ET;;;;;N;;;;; +0025;PERCENT SIGN;Po;0;ET;;;;;N;;;;; +0026;AMPERSAND;Po;0;ON;;;;;N;;;;; +0027;APOSTROPHE;Po;0;ON;;;;;N;APOSTROPHE-QUOTE;;;; +0028;LEFT PARENTHESIS;Ps;0;ON;;;;;Y;OPENING PARENTHESIS;;;; +0029;RIGHT PARENTHESIS;Pe;0;ON;;;;;Y;CLOSING PARENTHESIS;;;; +002A;ASTERISK;Po;0;ON;;;;;N;;;;; +002B;PLUS SIGN;Sm;0;ES;;;;;N;;;;; +002C;COMMA;Po;0;CS;;;;;N;;;;; +002D;HYPHEN-MINUS;Pd;0;ES;;;;;N;;;;; +002E;FULL STOP;Po;0;CS;;;;;N;PERIOD;;;; +002F;SOLIDUS;Po;0;CS;;;;;N;SLASH;;;; +0030;DIGIT ZERO;Nd;0;EN;;0;0;0;N;;;;; +0031;DIGIT ONE;Nd;0;EN;;1;1;1;N;;;;; +0032;DIGIT TWO;Nd;0;EN;;2;2;2;N;;;;; +0033;DIGIT THREE;Nd;0;EN;;3;3;3;N;;;;; +0034;DIGIT FOUR;Nd;0;EN;;4;4;4;N;;;;; +0035;DIGIT FIVE;Nd;0;EN;;5;5;5;N;;;;; +0036;DIGIT SIX;Nd;0;EN;;6;6;6;N;;;;; +0037;DIGIT SEVEN;Nd;0;EN;;7;7;7;N;;;;; +0038;DIGIT EIGHT;Nd;0;EN;;8;8;8;N;;;;; +0039;DIGIT NINE;Nd;0;EN;;9;9;9;N;;;;; +003A;COLON;Po;0;CS;;;;;N;;;;; +003B;SEMICOLON;Po;0;ON;;;;;N;;;;; +003C;LESS-THAN SIGN;Sm;0;ON;;;;;Y;;;;; +003D;EQUALS SIGN;Sm;0;ON;;;;;N;;;;; +003E;GREATER-THAN SIGN;Sm;0;ON;;;;;Y;;;;; +003F;QUESTION MARK;Po;0;ON;;;;;N;;;;; +0040;COMMERCIAL AT;Po;0;ON;;;;;N;;;;; +0041;LATIN CAPITAL LETTER A;Lu;0;L;;;;;N;;;;0061; +0042;LATIN CAPITAL LETTER B;Lu;0;L;;;;;N;;;;0062; +0043;LATIN CAPITAL LETTER C;Lu;0;L;;;;;N;;;;0063; +0044;LATIN CAPITAL LETTER D;Lu;0;L;;;;;N;;;;0064; +0045;LATIN CAPITAL LETTER E;Lu;0;L;;;;;N;;;;0065; +0046;LATIN CAPITAL LETTER F;Lu;0;L;;;;;N;;;;0066; +0047;LATIN CAPITAL LETTER G;Lu;0;L;;;;;N;;;;0067; +0048;LATIN CAPITAL LETTER H;Lu;0;L;;;;;N;;;;0068; +0049;LATIN CAPITAL LETTER I;Lu;0;L;;;;;N;;;;0069; +004A;LATIN CAPITAL LETTER J;Lu;0;L;;;;;N;;;;006A; +004B;LATIN CAPITAL LETTER K;Lu;0;L;;;;;N;;;;006B; +004C;LATIN CAPITAL LETTER L;Lu;0;L;;;;;N;;;;006C; +004D;LATIN CAPITAL LETTER M;Lu;0;L;;;;;N;;;;006D; +004E;LATIN CAPITAL LETTER N;Lu;0;L;;;;;N;;;;006E; +004F;LATIN CAPITAL LETTER O;Lu;0;L;;;;;N;;;;006F; +0050;LATIN CAPITAL LETTER P;Lu;0;L;;;;;N;;;;0070; +0051;LATIN CAPITAL LETTER Q;Lu;0;L;;;;;N;;;;0071; +0052;LATIN CAPITAL LETTER R;Lu;0;L;;;;;N;;;;0072; +0053;LATIN CAPITAL LETTER S;Lu;0;L;;;;;N;;;;0073; +0054;LATIN CAPITAL LETTER T;Lu;0;L;;;;;N;;;;0074; +0055;LATIN CAPITAL LETTER U;Lu;0;L;;;;;N;;;;0075; +0056;LATIN CAPITAL LETTER V;Lu;0;L;;;;;N;;;;0076; +0057;LATIN CAPITAL LETTER W;Lu;0;L;;;;;N;;;;0077; +0058;LATIN CAPITAL LETTER X;Lu;0;L;;;;;N;;;;0078; +0059;LATIN CAPITAL LETTER Y;Lu;0;L;;;;;N;;;;0079; +005A;LATIN CAPITAL LETTER Z;Lu;0;L;;;;;N;;;;007A; +005B;LEFT SQUARE BRACKET;Ps;0;ON;;;;;Y;OPENING SQUARE BRACKET;;;; +005C;REVERSE SOLIDUS;Po;0;ON;;;;;N;BACKSLASH;;;; +005D;RIGHT SQUARE BRACKET;Pe;0;ON;;;;;Y;CLOSING SQUARE BRACKET;;;; +005E;CIRCUMFLEX ACCENT;Sk;0;ON;;;;;N;SPACING CIRCUMFLEX;;;; +005F;LOW LINE;Pc;0;ON;;;;;N;SPACING UNDERSCORE;;;; +0060;GRAVE ACCENT;Sk;0;ON;;;;;N;SPACING GRAVE;;;; +0061;LATIN SMALL LETTER A;Ll;0;L;;;;;N;;;0041;;0041 +0062;LATIN SMALL LETTER B;Ll;0;L;;;;;N;;;0042;;0042 +0063;LATIN SMALL LETTER C;Ll;0;L;;;;;N;;;0043;;0043 +0064;LATIN SMALL LETTER D;Ll;0;L;;;;;N;;;0044;;0044 +0065;LATIN SMALL LETTER E;Ll;0;L;;;;;N;;;0045;;0045 +0066;LATIN SMALL LETTER F;Ll;0;L;;;;;N;;;0046;;0046 +0067;LATIN SMALL LETTER G;Ll;0;L;;;;;N;;;0047;;0047 +0068;LATIN SMALL LETTER H;Ll;0;L;;;;;N;;;0048;;0048 +0069;LATIN SMALL LETTER I;Ll;0;L;;;;;N;;;0049;;0049 +006A;LATIN SMALL LETTER J;Ll;0;L;;;;;N;;;004A;;004A +006B;LATIN SMALL LETTER K;Ll;0;L;;;;;N;;;004B;;004B +006C;LATIN SMALL LETTER L;Ll;0;L;;;;;N;;;004C;;004C +006D;LATIN SMALL LETTER M;Ll;0;L;;;;;N;;;004D;;004D +006E;LATIN SMALL LETTER N;Ll;0;L;;;;;N;;;004E;;004E +006F;LATIN SMALL LETTER O;Ll;0;L;;;;;N;;;004F;;004F +0070;LATIN SMALL LETTER P;Ll;0;L;;;;;N;;;0050;;0050 +0071;LATIN SMALL LETTER Q;Ll;0;L;;;;;N;;;0051;;0051 +0072;LATIN SMALL LETTER R;Ll;0;L;;;;;N;;;0052;;0052 +0073;LATIN SMALL LETTER S;Ll;0;L;;;;;N;;;0053;;0053 +0074;LATIN SMALL LETTER T;Ll;0;L;;;;;N;;;0054;;0054 +0075;LATIN SMALL LETTER U;Ll;0;L;;;;;N;;;0055;;0055 +0076;LATIN SMALL LETTER V;Ll;0;L;;;;;N;;;0056;;0056 +0077;LATIN SMALL LETTER W;Ll;0;L;;;;;N;;;0057;;0057 +0078;LATIN SMALL LETTER X;Ll;0;L;;;;;N;;;0058;;0058 +0079;LATIN SMALL LETTER Y;Ll;0;L;;;;;N;;;0059;;0059 +007A;LATIN SMALL LETTER Z;Ll;0;L;;;;;N;;;005A;;005A +007B;LEFT CURLY BRACKET;Ps;0;ON;;;;;Y;OPENING CURLY BRACKET;;;; +007C;VERTICAL LINE;Sm;0;ON;;;;;N;VERTICAL BAR;;;; +007D;RIGHT CURLY BRACKET;Pe;0;ON;;;;;Y;CLOSING CURLY BRACKET;;;; +007E;TILDE;Sm;0;ON;;;;;N;;;;; +007F;<control>;Cc;0;BN;;;;;N;DELETE;;;; +0080;<control>;Cc;0;BN;;;;;N;;;;; +0081;<control>;Cc;0;BN;;;;;N;;;;; +0082;<control>;Cc;0;BN;;;;;N;BREAK PERMITTED HERE;;;; +0083;<control>;Cc;0;BN;;;;;N;NO BREAK HERE;;;; +0084;<control>;Cc;0;BN;;;;;N;;;;; +0085;<control>;Cc;0;B;;;;;N;NEXT LINE (NEL);;;; +0086;<control>;Cc;0;BN;;;;;N;START OF SELECTED AREA;;;; +0087;<control>;Cc;0;BN;;;;;N;END OF SELECTED AREA;;;; +0088;<control>;Cc;0;BN;;;;;N;CHARACTER TABULATION SET;;;; +0089;<control>;Cc;0;BN;;;;;N;CHARACTER TABULATION WITH JUSTIFICATION;;;; +008A;<control>;Cc;0;BN;;;;;N;LINE TABULATION SET;;;; +008B;<control>;Cc;0;BN;;;;;N;PARTIAL LINE FORWARD;;;; +008C;<control>;Cc;0;BN;;;;;N;PARTIAL LINE BACKWARD;;;; +008D;<control>;Cc;0;BN;;;;;N;REVERSE LINE FEED;;;; +008E;<control>;Cc;0;BN;;;;;N;SINGLE SHIFT TWO;;;; +008F;<control>;Cc;0;BN;;;;;N;SINGLE SHIFT THREE;;;; +0090;<control>;Cc;0;BN;;;;;N;DEVICE CONTROL STRING;;;; +0091;<control>;Cc;0;BN;;;;;N;PRIVATE USE ONE;;;; +0092;<control>;Cc;0;BN;;;;;N;PRIVATE USE TWO;;;; +0093;<control>;Cc;0;BN;;;;;N;SET TRANSMIT STATE;;;; +0094;<control>;Cc;0;BN;;;;;N;CANCEL CHARACTER;;;; +0095;<control>;Cc;0;BN;;;;;N;MESSAGE WAITING;;;; +0096;<control>;Cc;0;BN;;;;;N;START OF GUARDED AREA;;;; +0097;<control>;Cc;0;BN;;;;;N;END OF GUARDED AREA;;;; +0098;<control>;Cc;0;BN;;;;;N;START OF STRING;;;; +0099;<control>;Cc;0;BN;;;;;N;;;;; +009A;<control>;Cc;0;BN;;;;;N;SINGLE CHARACTER INTRODUCER;;;; +009B;<control>;Cc;0;BN;;;;;N;CONTROL SEQUENCE INTRODUCER;;;; +009C;<control>;Cc;0;BN;;;;;N;STRING TERMINATOR;;;; +009D;<control>;Cc;0;BN;;;;;N;OPERATING SYSTEM COMMAND;;;; +009E;<control>;Cc;0;BN;;;;;N;PRIVACY MESSAGE;;;; +009F;<control>;Cc;0;BN;;;;;N;APPLICATION PROGRAM COMMAND;;;; +00A0;NO-BREAK SPACE;Zs;0;CS;<noBreak> 0020;;;;N;NON-BREAKING SPACE;;;; +00A1;INVERTED EXCLAMATION MARK;Po;0;ON;;;;;N;;;;; +00A2;CENT SIGN;Sc;0;ET;;;;;N;;;;; +00A3;POUND SIGN;Sc;0;ET;;;;;N;;;;; +00A4;CURRENCY SIGN;Sc;0;ET;;;;;N;;;;; +00A5;YEN SIGN;Sc;0;ET;;;;;N;;;;; +00A6;BROKEN BAR;So;0;ON;;;;;N;BROKEN VERTICAL BAR;;;; +00A7;SECTION SIGN;Po;0;ON;;;;;N;;;;; +00A8;DIAERESIS;Sk;0;ON;<compat> 0020 0308;;;;N;SPACING DIAERESIS;;;; +00A9;COPYRIGHT SIGN;So;0;ON;;;;;N;;;;; +00AA;FEMININE ORDINAL INDICATOR;Lo;0;L;<super> 0061;;;;N;;;;; +00AB;LEFT-POINTING DOUBLE ANGLE QUOTATION MARK;Pi;0;ON;;;;;Y;LEFT POINTING GUILLEMET;;;; +00AC;NOT SIGN;Sm;0;ON;;;;;N;;;;; +00AD;SOFT HYPHEN;Cf;0;BN;;;;;N;;;;; +00AE;REGISTERED SIGN;So;0;ON;;;;;N;REGISTERED TRADE MARK SIGN;;;; +00AF;MACRON;Sk;0;ON;<compat> 0020 0304;;;;N;SPACING MACRON;;;; +00B0;DEGREE SIGN;So;0;ET;;;;;N;;;;; +00B1;PLUS-MINUS SIGN;Sm;0;ET;;;;;N;PLUS-OR-MINUS SIGN;;;; +00B2;SUPERSCRIPT TWO;No;0;EN;<super> 0032;;2;2;N;SUPERSCRIPT DIGIT TWO;;;; +00B3;SUPERSCRIPT THREE;No;0;EN;<super> 0033;;3;3;N;SUPERSCRIPT DIGIT THREE;;;; +00B4;ACUTE ACCENT;Sk;0;ON;<compat> 0020 0301;;;;N;SPACING ACUTE;;;; +00B5;MICRO SIGN;Ll;0;L;<compat> 03BC;;;;N;;;039C;;039C +00B6;PILCROW SIGN;Po;0;ON;;;;;N;PARAGRAPH SIGN;;;; +00B7;MIDDLE DOT;Po;0;ON;;;;;N;;;;; +00B8;CEDILLA;Sk;0;ON;<compat> 0020 0327;;;;N;SPACING CEDILLA;;;; +00B9;SUPERSCRIPT ONE;No;0;EN;<super> 0031;;1;1;N;SUPERSCRIPT DIGIT ONE;;;; +00BA;MASCULINE ORDINAL INDICATOR;Lo;0;L;<super> 006F;;;;N;;;;; +00BB;RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK;Pf;0;ON;;;;;Y;RIGHT POINTING GUILLEMET;;;; +00BC;VULGAR FRACTION ONE QUARTER;No;0;ON;<fraction> 0031 2044 0034;;;1/4;N;FRACTION ONE QUARTER;;;; +00BD;VULGAR FRACTION ONE HALF;No;0;ON;<fraction> 0031 2044 0032;;;1/2;N;FRACTION ONE HALF;;;; +00BE;VULGAR FRACTION THREE QUARTERS;No;0;ON;<fraction> 0033 2044 0034;;;3/4;N;FRACTION THREE QUARTERS;;;; +00BF;INVERTED QUESTION MARK;Po;0;ON;;;;;N;;;;; +00C0;LATIN CAPITAL LETTER A WITH GRAVE;Lu;0;L;0041 0300;;;;N;LATIN CAPITAL LETTER A GRAVE;;;00E0; +00C1;LATIN CAPITAL LETTER A WITH ACUTE;Lu;0;L;0041 0301;;;;N;LATIN CAPITAL LETTER A ACUTE;;;00E1; +00C2;LATIN CAPITAL LETTER A WITH CIRCUMFLEX;Lu;0;L;0041 0302;;;;N;LATIN CAPITAL LETTER A CIRCUMFLEX;;;00E2; +00C3;LATIN CAPITAL LETTER A WITH TILDE;Lu;0;L;0041 0303;;;;N;LATIN CAPITAL LETTER A TILDE;;;00E3; +00C4;LATIN CAPITAL LETTER A WITH DIAERESIS;Lu;0;L;0041 0308;;;;N;LATIN CAPITAL LETTER A DIAERESIS;;;00E4; +00C5;LATIN CAPITAL LETTER A WITH RING ABOVE;Lu;0;L;0041 030A;;;;N;LATIN CAPITAL LETTER A RING;;;00E5; +00C6;LATIN CAPITAL LETTER AE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER A E;;;00E6; +00C7;LATIN CAPITAL LETTER C WITH CEDILLA;Lu;0;L;0043 0327;;;;N;LATIN CAPITAL LETTER C CEDILLA;;;00E7; +00C8;LATIN CAPITAL LETTER E WITH GRAVE;Lu;0;L;0045 0300;;;;N;LATIN CAPITAL LETTER E GRAVE;;;00E8; +00C9;LATIN CAPITAL LETTER E WITH ACUTE;Lu;0;L;0045 0301;;;;N;LATIN CAPITAL LETTER E ACUTE;;;00E9; +00CA;LATIN CAPITAL LETTER E WITH CIRCUMFLEX;Lu;0;L;0045 0302;;;;N;LATIN CAPITAL LETTER E CIRCUMFLEX;;;00EA; +00CB;LATIN CAPITAL LETTER E WITH DIAERESIS;Lu;0;L;0045 0308;;;;N;LATIN CAPITAL LETTER E DIAERESIS;;;00EB; +00CC;LATIN CAPITAL LETTER I WITH GRAVE;Lu;0;L;0049 0300;;;;N;LATIN CAPITAL LETTER I GRAVE;;;00EC; +00CD;LATIN CAPITAL LETTER I WITH ACUTE;Lu;0;L;0049 0301;;;;N;LATIN CAPITAL LETTER I ACUTE;;;00ED; +00CE;LATIN CAPITAL LETTER I WITH CIRCUMFLEX;Lu;0;L;0049 0302;;;;N;LATIN CAPITAL LETTER I CIRCUMFLEX;;;00EE; +00CF;LATIN CAPITAL LETTER I WITH DIAERESIS;Lu;0;L;0049 0308;;;;N;LATIN CAPITAL LETTER I DIAERESIS;;;00EF; +00D0;LATIN CAPITAL LETTER ETH;Lu;0;L;;;;;N;;;;00F0; +00D1;LATIN CAPITAL LETTER N WITH TILDE;Lu;0;L;004E 0303;;;;N;LATIN CAPITAL LETTER N TILDE;;;00F1; +00D2;LATIN CAPITAL LETTER O WITH GRAVE;Lu;0;L;004F 0300;;;;N;LATIN CAPITAL LETTER O GRAVE;;;00F2; +00D3;LATIN CAPITAL LETTER O WITH ACUTE;Lu;0;L;004F 0301;;;;N;LATIN CAPITAL LETTER O ACUTE;;;00F3; +00D4;LATIN CAPITAL LETTER O WITH CIRCUMFLEX;Lu;0;L;004F 0302;;;;N;LATIN CAPITAL LETTER O CIRCUMFLEX;;;00F4; +00D5;LATIN CAPITAL LETTER O WITH TILDE;Lu;0;L;004F 0303;;;;N;LATIN CAPITAL LETTER O TILDE;;;00F5; +00D6;LATIN CAPITAL LETTER O WITH DIAERESIS;Lu;0;L;004F 0308;;;;N;LATIN CAPITAL LETTER O DIAERESIS;;;00F6; +00D7;MULTIPLICATION SIGN;Sm;0;ON;;;;;N;;;;; +00D8;LATIN CAPITAL LETTER O WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER O SLASH;;;00F8; +00D9;LATIN CAPITAL LETTER U WITH GRAVE;Lu;0;L;0055 0300;;;;N;LATIN CAPITAL LETTER U GRAVE;;;00F9; +00DA;LATIN CAPITAL LETTER U WITH ACUTE;Lu;0;L;0055 0301;;;;N;LATIN CAPITAL LETTER U ACUTE;;;00FA; +00DB;LATIN CAPITAL LETTER U WITH CIRCUMFLEX;Lu;0;L;0055 0302;;;;N;LATIN CAPITAL LETTER U CIRCUMFLEX;;;00FB; +00DC;LATIN CAPITAL LETTER U WITH DIAERESIS;Lu;0;L;0055 0308;;;;N;LATIN CAPITAL LETTER U DIAERESIS;;;00FC; +00DD;LATIN CAPITAL LETTER Y WITH ACUTE;Lu;0;L;0059 0301;;;;N;LATIN CAPITAL LETTER Y ACUTE;;;00FD; +00DE;LATIN CAPITAL LETTER THORN;Lu;0;L;;;;;N;;;;00FE; +00DF;LATIN SMALL LETTER SHARP S;Ll;0;L;;;;;N;;;;; +00E0;LATIN SMALL LETTER A WITH GRAVE;Ll;0;L;0061 0300;;;;N;LATIN SMALL LETTER A GRAVE;;00C0;;00C0 +00E1;LATIN SMALL LETTER A WITH ACUTE;Ll;0;L;0061 0301;;;;N;LATIN SMALL LETTER A ACUTE;;00C1;;00C1 +00E2;LATIN SMALL LETTER A WITH CIRCUMFLEX;Ll;0;L;0061 0302;;;;N;LATIN SMALL LETTER A CIRCUMFLEX;;00C2;;00C2 +00E3;LATIN SMALL LETTER A WITH TILDE;Ll;0;L;0061 0303;;;;N;LATIN SMALL LETTER A TILDE;;00C3;;00C3 +00E4;LATIN SMALL LETTER A WITH DIAERESIS;Ll;0;L;0061 0308;;;;N;LATIN SMALL LETTER A DIAERESIS;;00C4;;00C4 +00E5;LATIN SMALL LETTER A WITH RING ABOVE;Ll;0;L;0061 030A;;;;N;LATIN SMALL LETTER A RING;;00C5;;00C5 +00E6;LATIN SMALL LETTER AE;Ll;0;L;;;;;N;LATIN SMALL LETTER A E;;00C6;;00C6 +00E7;LATIN SMALL LETTER C WITH CEDILLA;Ll;0;L;0063 0327;;;;N;LATIN SMALL LETTER C CEDILLA;;00C7;;00C7 +00E8;LATIN SMALL LETTER E WITH GRAVE;Ll;0;L;0065 0300;;;;N;LATIN SMALL LETTER E GRAVE;;00C8;;00C8 +00E9;LATIN SMALL LETTER E WITH ACUTE;Ll;0;L;0065 0301;;;;N;LATIN SMALL LETTER E ACUTE;;00C9;;00C9 +00EA;LATIN SMALL LETTER E WITH CIRCUMFLEX;Ll;0;L;0065 0302;;;;N;LATIN SMALL LETTER E CIRCUMFLEX;;00CA;;00CA +00EB;LATIN SMALL LETTER E WITH DIAERESIS;Ll;0;L;0065 0308;;;;N;LATIN SMALL LETTER E DIAERESIS;;00CB;;00CB +00EC;LATIN SMALL LETTER I WITH GRAVE;Ll;0;L;0069 0300;;;;N;LATIN SMALL LETTER I GRAVE;;00CC;;00CC +00ED;LATIN SMALL LETTER I WITH ACUTE;Ll;0;L;0069 0301;;;;N;LATIN SMALL LETTER I ACUTE;;00CD;;00CD +00EE;LATIN SMALL LETTER I WITH CIRCUMFLEX;Ll;0;L;0069 0302;;;;N;LATIN SMALL LETTER I CIRCUMFLEX;;00CE;;00CE +00EF;LATIN SMALL LETTER I WITH DIAERESIS;Ll;0;L;0069 0308;;;;N;LATIN SMALL LETTER I DIAERESIS;;00CF;;00CF +00F0;LATIN SMALL LETTER ETH;Ll;0;L;;;;;N;;;00D0;;00D0 +00F1;LATIN SMALL LETTER N WITH TILDE;Ll;0;L;006E 0303;;;;N;LATIN SMALL LETTER N TILDE;;00D1;;00D1 +00F2;LATIN SMALL LETTER O WITH GRAVE;Ll;0;L;006F 0300;;;;N;LATIN SMALL LETTER O GRAVE;;00D2;;00D2 +00F3;LATIN SMALL LETTER O WITH ACUTE;Ll;0;L;006F 0301;;;;N;LATIN SMALL LETTER O ACUTE;;00D3;;00D3 +00F4;LATIN SMALL LETTER O WITH CIRCUMFLEX;Ll;0;L;006F 0302;;;;N;LATIN SMALL LETTER O CIRCUMFLEX;;00D4;;00D4 +00F5;LATIN SMALL LETTER O WITH TILDE;Ll;0;L;006F 0303;;;;N;LATIN SMALL LETTER O TILDE;;00D5;;00D5 +00F6;LATIN SMALL LETTER O WITH DIAERESIS;Ll;0;L;006F 0308;;;;N;LATIN SMALL LETTER O DIAERESIS;;00D6;;00D6 +00F7;DIVISION SIGN;Sm;0;ON;;;;;N;;;;; +00F8;LATIN SMALL LETTER O WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER O SLASH;;00D8;;00D8 +00F9;LATIN SMALL LETTER U WITH GRAVE;Ll;0;L;0075 0300;;;;N;LATIN SMALL LETTER U GRAVE;;00D9;;00D9 +00FA;LATIN SMALL LETTER U WITH ACUTE;Ll;0;L;0075 0301;;;;N;LATIN SMALL LETTER U ACUTE;;00DA;;00DA +00FB;LATIN SMALL LETTER U WITH CIRCUMFLEX;Ll;0;L;0075 0302;;;;N;LATIN SMALL LETTER U CIRCUMFLEX;;00DB;;00DB +00FC;LATIN SMALL LETTER U WITH DIAERESIS;Ll;0;L;0075 0308;;;;N;LATIN SMALL LETTER U DIAERESIS;;00DC;;00DC +00FD;LATIN SMALL LETTER Y WITH ACUTE;Ll;0;L;0079 0301;;;;N;LATIN SMALL LETTER Y ACUTE;;00DD;;00DD +00FE;LATIN SMALL LETTER THORN;Ll;0;L;;;;;N;;;00DE;;00DE +00FF;LATIN SMALL LETTER Y WITH DIAERESIS;Ll;0;L;0079 0308;;;;N;LATIN SMALL LETTER Y DIAERESIS;;0178;;0178 +0100;LATIN CAPITAL LETTER A WITH MACRON;Lu;0;L;0041 0304;;;;N;LATIN CAPITAL LETTER A MACRON;;;0101; +0101;LATIN SMALL LETTER A WITH MACRON;Ll;0;L;0061 0304;;;;N;LATIN SMALL LETTER A MACRON;;0100;;0100 +0102;LATIN CAPITAL LETTER A WITH BREVE;Lu;0;L;0041 0306;;;;N;LATIN CAPITAL LETTER A BREVE;;;0103; +0103;LATIN SMALL LETTER A WITH BREVE;Ll;0;L;0061 0306;;;;N;LATIN SMALL LETTER A BREVE;;0102;;0102 +0104;LATIN CAPITAL LETTER A WITH OGONEK;Lu;0;L;0041 0328;;;;N;LATIN CAPITAL LETTER A OGONEK;;;0105; +0105;LATIN SMALL LETTER A WITH OGONEK;Ll;0;L;0061 0328;;;;N;LATIN SMALL LETTER A OGONEK;;0104;;0104 +0106;LATIN CAPITAL LETTER C WITH ACUTE;Lu;0;L;0043 0301;;;;N;LATIN CAPITAL LETTER C ACUTE;;;0107; +0107;LATIN SMALL LETTER C WITH ACUTE;Ll;0;L;0063 0301;;;;N;LATIN SMALL LETTER C ACUTE;;0106;;0106 +0108;LATIN CAPITAL LETTER C WITH CIRCUMFLEX;Lu;0;L;0043 0302;;;;N;LATIN CAPITAL LETTER C CIRCUMFLEX;;;0109; +0109;LATIN SMALL LETTER C WITH CIRCUMFLEX;Ll;0;L;0063 0302;;;;N;LATIN SMALL LETTER C CIRCUMFLEX;;0108;;0108 +010A;LATIN CAPITAL LETTER C WITH DOT ABOVE;Lu;0;L;0043 0307;;;;N;LATIN CAPITAL LETTER C DOT;;;010B; +010B;LATIN SMALL LETTER C WITH DOT ABOVE;Ll;0;L;0063 0307;;;;N;LATIN SMALL LETTER C DOT;;010A;;010A +010C;LATIN CAPITAL LETTER C WITH CARON;Lu;0;L;0043 030C;;;;N;LATIN CAPITAL LETTER C HACEK;;;010D; +010D;LATIN SMALL LETTER C WITH CARON;Ll;0;L;0063 030C;;;;N;LATIN SMALL LETTER C HACEK;;010C;;010C +010E;LATIN CAPITAL LETTER D WITH CARON;Lu;0;L;0044 030C;;;;N;LATIN CAPITAL LETTER D HACEK;;;010F; +010F;LATIN SMALL LETTER D WITH CARON;Ll;0;L;0064 030C;;;;N;LATIN SMALL LETTER D HACEK;;010E;;010E +0110;LATIN CAPITAL LETTER D WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER D BAR;;;0111; +0111;LATIN SMALL LETTER D WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER D BAR;;0110;;0110 +0112;LATIN CAPITAL LETTER E WITH MACRON;Lu;0;L;0045 0304;;;;N;LATIN CAPITAL LETTER E MACRON;;;0113; +0113;LATIN SMALL LETTER E WITH MACRON;Ll;0;L;0065 0304;;;;N;LATIN SMALL LETTER E MACRON;;0112;;0112 +0114;LATIN CAPITAL LETTER E WITH BREVE;Lu;0;L;0045 0306;;;;N;LATIN CAPITAL LETTER E BREVE;;;0115; +0115;LATIN SMALL LETTER E WITH BREVE;Ll;0;L;0065 0306;;;;N;LATIN SMALL LETTER E BREVE;;0114;;0114 +0116;LATIN CAPITAL LETTER E WITH DOT ABOVE;Lu;0;L;0045 0307;;;;N;LATIN CAPITAL LETTER E DOT;;;0117; +0117;LATIN SMALL LETTER E WITH DOT ABOVE;Ll;0;L;0065 0307;;;;N;LATIN SMALL LETTER E DOT;;0116;;0116 +0118;LATIN CAPITAL LETTER E WITH OGONEK;Lu;0;L;0045 0328;;;;N;LATIN CAPITAL LETTER E OGONEK;;;0119; +0119;LATIN SMALL LETTER E WITH OGONEK;Ll;0;L;0065 0328;;;;N;LATIN SMALL LETTER E OGONEK;;0118;;0118 +011A;LATIN CAPITAL LETTER E WITH CARON;Lu;0;L;0045 030C;;;;N;LATIN CAPITAL LETTER E HACEK;;;011B; +011B;LATIN SMALL LETTER E WITH CARON;Ll;0;L;0065 030C;;;;N;LATIN SMALL LETTER E HACEK;;011A;;011A +011C;LATIN CAPITAL LETTER G WITH CIRCUMFLEX;Lu;0;L;0047 0302;;;;N;LATIN CAPITAL LETTER G CIRCUMFLEX;;;011D; +011D;LATIN SMALL LETTER G WITH CIRCUMFLEX;Ll;0;L;0067 0302;;;;N;LATIN SMALL LETTER G CIRCUMFLEX;;011C;;011C +011E;LATIN CAPITAL LETTER G WITH BREVE;Lu;0;L;0047 0306;;;;N;LATIN CAPITAL LETTER G BREVE;;;011F; +011F;LATIN SMALL LETTER G WITH BREVE;Ll;0;L;0067 0306;;;;N;LATIN SMALL LETTER G BREVE;;011E;;011E +0120;LATIN CAPITAL LETTER G WITH DOT ABOVE;Lu;0;L;0047 0307;;;;N;LATIN CAPITAL LETTER G DOT;;;0121; +0121;LATIN SMALL LETTER G WITH DOT ABOVE;Ll;0;L;0067 0307;;;;N;LATIN SMALL LETTER G DOT;;0120;;0120 +0122;LATIN CAPITAL LETTER G WITH CEDILLA;Lu;0;L;0047 0327;;;;N;LATIN CAPITAL LETTER G CEDILLA;;;0123; +0123;LATIN SMALL LETTER G WITH CEDILLA;Ll;0;L;0067 0327;;;;N;LATIN SMALL LETTER G CEDILLA;;0122;;0122 +0124;LATIN CAPITAL LETTER H WITH CIRCUMFLEX;Lu;0;L;0048 0302;;;;N;LATIN CAPITAL LETTER H CIRCUMFLEX;;;0125; +0125;LATIN SMALL LETTER H WITH CIRCUMFLEX;Ll;0;L;0068 0302;;;;N;LATIN SMALL LETTER H CIRCUMFLEX;;0124;;0124 +0126;LATIN CAPITAL LETTER H WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER H BAR;;;0127; +0127;LATIN SMALL LETTER H WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER H BAR;;0126;;0126 +0128;LATIN CAPITAL LETTER I WITH TILDE;Lu;0;L;0049 0303;;;;N;LATIN CAPITAL LETTER I TILDE;;;0129; +0129;LATIN SMALL LETTER I WITH TILDE;Ll;0;L;0069 0303;;;;N;LATIN SMALL LETTER I TILDE;;0128;;0128 +012A;LATIN CAPITAL LETTER I WITH MACRON;Lu;0;L;0049 0304;;;;N;LATIN CAPITAL LETTER I MACRON;;;012B; +012B;LATIN SMALL LETTER I WITH MACRON;Ll;0;L;0069 0304;;;;N;LATIN SMALL LETTER I MACRON;;012A;;012A +012C;LATIN CAPITAL LETTER I WITH BREVE;Lu;0;L;0049 0306;;;;N;LATIN CAPITAL LETTER I BREVE;;;012D; +012D;LATIN SMALL LETTER I WITH BREVE;Ll;0;L;0069 0306;;;;N;LATIN SMALL LETTER I BREVE;;012C;;012C +012E;LATIN CAPITAL LETTER I WITH OGONEK;Lu;0;L;0049 0328;;;;N;LATIN CAPITAL LETTER I OGONEK;;;012F; +012F;LATIN SMALL LETTER I WITH OGONEK;Ll;0;L;0069 0328;;;;N;LATIN SMALL LETTER I OGONEK;;012E;;012E +0130;LATIN CAPITAL LETTER I WITH DOT ABOVE;Lu;0;L;0049 0307;;;;N;LATIN CAPITAL LETTER I DOT;;;0069; +0131;LATIN SMALL LETTER DOTLESS I;Ll;0;L;;;;;N;;;0049;;0049 +0132;LATIN CAPITAL LIGATURE IJ;Lu;0;L;<compat> 0049 004A;;;;N;LATIN CAPITAL LETTER I J;;;0133; +0133;LATIN SMALL LIGATURE IJ;Ll;0;L;<compat> 0069 006A;;;;N;LATIN SMALL LETTER I J;;0132;;0132 +0134;LATIN CAPITAL LETTER J WITH CIRCUMFLEX;Lu;0;L;004A 0302;;;;N;LATIN CAPITAL LETTER J CIRCUMFLEX;;;0135; +0135;LATIN SMALL LETTER J WITH CIRCUMFLEX;Ll;0;L;006A 0302;;;;N;LATIN SMALL LETTER J CIRCUMFLEX;;0134;;0134 +0136;LATIN CAPITAL LETTER K WITH CEDILLA;Lu;0;L;004B 0327;;;;N;LATIN CAPITAL LETTER K CEDILLA;;;0137; +0137;LATIN SMALL LETTER K WITH CEDILLA;Ll;0;L;006B 0327;;;;N;LATIN SMALL LETTER K CEDILLA;;0136;;0136 +0138;LATIN SMALL LETTER KRA;Ll;0;L;;;;;N;;;;; +0139;LATIN CAPITAL LETTER L WITH ACUTE;Lu;0;L;004C 0301;;;;N;LATIN CAPITAL LETTER L ACUTE;;;013A; +013A;LATIN SMALL LETTER L WITH ACUTE;Ll;0;L;006C 0301;;;;N;LATIN SMALL LETTER L ACUTE;;0139;;0139 +013B;LATIN CAPITAL LETTER L WITH CEDILLA;Lu;0;L;004C 0327;;;;N;LATIN CAPITAL LETTER L CEDILLA;;;013C; +013C;LATIN SMALL LETTER L WITH CEDILLA;Ll;0;L;006C 0327;;;;N;LATIN SMALL LETTER L CEDILLA;;013B;;013B +013D;LATIN CAPITAL LETTER L WITH CARON;Lu;0;L;004C 030C;;;;N;LATIN CAPITAL LETTER L HACEK;;;013E; +013E;LATIN SMALL LETTER L WITH CARON;Ll;0;L;006C 030C;;;;N;LATIN SMALL LETTER L HACEK;;013D;;013D +013F;LATIN CAPITAL LETTER L WITH MIDDLE DOT;Lu;0;L;<compat> 004C 00B7;;;;N;;;;0140; +0140;LATIN SMALL LETTER L WITH MIDDLE DOT;Ll;0;L;<compat> 006C 00B7;;;;N;;;013F;;013F +0141;LATIN CAPITAL LETTER L WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER L SLASH;;;0142; +0142;LATIN SMALL LETTER L WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER L SLASH;;0141;;0141 +0143;LATIN CAPITAL LETTER N WITH ACUTE;Lu;0;L;004E 0301;;;;N;LATIN CAPITAL LETTER N ACUTE;;;0144; +0144;LATIN SMALL LETTER N WITH ACUTE;Ll;0;L;006E 0301;;;;N;LATIN SMALL LETTER N ACUTE;;0143;;0143 +0145;LATIN CAPITAL LETTER N WITH CEDILLA;Lu;0;L;004E 0327;;;;N;LATIN CAPITAL LETTER N CEDILLA;;;0146; +0146;LATIN SMALL LETTER N WITH CEDILLA;Ll;0;L;006E 0327;;;;N;LATIN SMALL LETTER N CEDILLA;;0145;;0145 +0147;LATIN CAPITAL LETTER N WITH CARON;Lu;0;L;004E 030C;;;;N;LATIN CAPITAL LETTER N HACEK;;;0148; +0148;LATIN SMALL LETTER N WITH CARON;Ll;0;L;006E 030C;;;;N;LATIN SMALL LETTER N HACEK;;0147;;0147 +0149;LATIN SMALL LETTER N PRECEDED BY APOSTROPHE;Ll;0;L;<compat> 02BC 006E;;;;N;LATIN SMALL LETTER APOSTROPHE N;;;; +014A;LATIN CAPITAL LETTER ENG;Lu;0;L;;;;;N;;;;014B; +014B;LATIN SMALL LETTER ENG;Ll;0;L;;;;;N;;;014A;;014A +014C;LATIN CAPITAL LETTER O WITH MACRON;Lu;0;L;004F 0304;;;;N;LATIN CAPITAL LETTER O MACRON;;;014D; +014D;LATIN SMALL LETTER O WITH MACRON;Ll;0;L;006F 0304;;;;N;LATIN SMALL LETTER O MACRON;;014C;;014C +014E;LATIN CAPITAL LETTER O WITH BREVE;Lu;0;L;004F 0306;;;;N;LATIN CAPITAL LETTER O BREVE;;;014F; +014F;LATIN SMALL LETTER O WITH BREVE;Ll;0;L;006F 0306;;;;N;LATIN SMALL LETTER O BREVE;;014E;;014E +0150;LATIN CAPITAL LETTER O WITH DOUBLE ACUTE;Lu;0;L;004F 030B;;;;N;LATIN CAPITAL LETTER O DOUBLE ACUTE;;;0151; +0151;LATIN SMALL LETTER O WITH DOUBLE ACUTE;Ll;0;L;006F 030B;;;;N;LATIN SMALL LETTER O DOUBLE ACUTE;;0150;;0150 +0152;LATIN CAPITAL LIGATURE OE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER O E;;;0153; +0153;LATIN SMALL LIGATURE OE;Ll;0;L;;;;;N;LATIN SMALL LETTER O E;;0152;;0152 +0154;LATIN CAPITAL LETTER R WITH ACUTE;Lu;0;L;0052 0301;;;;N;LATIN CAPITAL LETTER R ACUTE;;;0155; +0155;LATIN SMALL LETTER R WITH ACUTE;Ll;0;L;0072 0301;;;;N;LATIN SMALL LETTER R ACUTE;;0154;;0154 +0156;LATIN CAPITAL LETTER R WITH CEDILLA;Lu;0;L;0052 0327;;;;N;LATIN CAPITAL LETTER R CEDILLA;;;0157; +0157;LATIN SMALL LETTER R WITH CEDILLA;Ll;0;L;0072 0327;;;;N;LATIN SMALL LETTER R CEDILLA;;0156;;0156 +0158;LATIN CAPITAL LETTER R WITH CARON;Lu;0;L;0052 030C;;;;N;LATIN CAPITAL LETTER R HACEK;;;0159; +0159;LATIN SMALL LETTER R WITH CARON;Ll;0;L;0072 030C;;;;N;LATIN SMALL LETTER R HACEK;;0158;;0158 +015A;LATIN CAPITAL LETTER S WITH ACUTE;Lu;0;L;0053 0301;;;;N;LATIN CAPITAL LETTER S ACUTE;;;015B; +015B;LATIN SMALL LETTER S WITH ACUTE;Ll;0;L;0073 0301;;;;N;LATIN SMALL LETTER S ACUTE;;015A;;015A +015C;LATIN CAPITAL LETTER S WITH CIRCUMFLEX;Lu;0;L;0053 0302;;;;N;LATIN CAPITAL LETTER S CIRCUMFLEX;;;015D; +015D;LATIN SMALL LETTER S WITH CIRCUMFLEX;Ll;0;L;0073 0302;;;;N;LATIN SMALL LETTER S CIRCUMFLEX;;015C;;015C +015E;LATIN CAPITAL LETTER S WITH CEDILLA;Lu;0;L;0053 0327;;;;N;LATIN CAPITAL LETTER S CEDILLA;;;015F; +015F;LATIN SMALL LETTER S WITH CEDILLA;Ll;0;L;0073 0327;;;;N;LATIN SMALL LETTER S CEDILLA;;015E;;015E +0160;LATIN CAPITAL LETTER S WITH CARON;Lu;0;L;0053 030C;;;;N;LATIN CAPITAL LETTER S HACEK;;;0161; +0161;LATIN SMALL LETTER S WITH CARON;Ll;0;L;0073 030C;;;;N;LATIN SMALL LETTER S HACEK;;0160;;0160 +0162;LATIN CAPITAL LETTER T WITH CEDILLA;Lu;0;L;0054 0327;;;;N;LATIN CAPITAL LETTER T CEDILLA;;;0163; +0163;LATIN SMALL LETTER T WITH CEDILLA;Ll;0;L;0074 0327;;;;N;LATIN SMALL LETTER T CEDILLA;;0162;;0162 +0164;LATIN CAPITAL LETTER T WITH CARON;Lu;0;L;0054 030C;;;;N;LATIN CAPITAL LETTER T HACEK;;;0165; +0165;LATIN SMALL LETTER T WITH CARON;Ll;0;L;0074 030C;;;;N;LATIN SMALL LETTER T HACEK;;0164;;0164 +0166;LATIN CAPITAL LETTER T WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER T BAR;;;0167; +0167;LATIN SMALL LETTER T WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER T BAR;;0166;;0166 +0168;LATIN CAPITAL LETTER U WITH TILDE;Lu;0;L;0055 0303;;;;N;LATIN CAPITAL LETTER U TILDE;;;0169; +0169;LATIN SMALL LETTER U WITH TILDE;Ll;0;L;0075 0303;;;;N;LATIN SMALL LETTER U TILDE;;0168;;0168 +016A;LATIN CAPITAL LETTER U WITH MACRON;Lu;0;L;0055 0304;;;;N;LATIN CAPITAL LETTER U MACRON;;;016B; +016B;LATIN SMALL LETTER U WITH MACRON;Ll;0;L;0075 0304;;;;N;LATIN SMALL LETTER U MACRON;;016A;;016A +016C;LATIN CAPITAL LETTER U WITH BREVE;Lu;0;L;0055 0306;;;;N;LATIN CAPITAL LETTER U BREVE;;;016D; +016D;LATIN SMALL LETTER U WITH BREVE;Ll;0;L;0075 0306;;;;N;LATIN SMALL LETTER U BREVE;;016C;;016C +016E;LATIN CAPITAL LETTER U WITH RING ABOVE;Lu;0;L;0055 030A;;;;N;LATIN CAPITAL LETTER U RING;;;016F; +016F;LATIN SMALL LETTER U WITH RING ABOVE;Ll;0;L;0075 030A;;;;N;LATIN SMALL LETTER U RING;;016E;;016E +0170;LATIN CAPITAL LETTER U WITH DOUBLE ACUTE;Lu;0;L;0055 030B;;;;N;LATIN CAPITAL LETTER U DOUBLE ACUTE;;;0171; +0171;LATIN SMALL LETTER U WITH DOUBLE ACUTE;Ll;0;L;0075 030B;;;;N;LATIN SMALL LETTER U DOUBLE ACUTE;;0170;;0170 +0172;LATIN CAPITAL LETTER U WITH OGONEK;Lu;0;L;0055 0328;;;;N;LATIN CAPITAL LETTER U OGONEK;;;0173; +0173;LATIN SMALL LETTER U WITH OGONEK;Ll;0;L;0075 0328;;;;N;LATIN SMALL LETTER U OGONEK;;0172;;0172 +0174;LATIN CAPITAL LETTER W WITH CIRCUMFLEX;Lu;0;L;0057 0302;;;;N;LATIN CAPITAL LETTER W CIRCUMFLEX;;;0175; +0175;LATIN SMALL LETTER W WITH CIRCUMFLEX;Ll;0;L;0077 0302;;;;N;LATIN SMALL LETTER W CIRCUMFLEX;;0174;;0174 +0176;LATIN CAPITAL LETTER Y WITH CIRCUMFLEX;Lu;0;L;0059 0302;;;;N;LATIN CAPITAL LETTER Y CIRCUMFLEX;;;0177; +0177;LATIN SMALL LETTER Y WITH CIRCUMFLEX;Ll;0;L;0079 0302;;;;N;LATIN SMALL LETTER Y CIRCUMFLEX;;0176;;0176 +0178;LATIN CAPITAL LETTER Y WITH DIAERESIS;Lu;0;L;0059 0308;;;;N;LATIN CAPITAL LETTER Y DIAERESIS;;;00FF; +0179;LATIN CAPITAL LETTER Z WITH ACUTE;Lu;0;L;005A 0301;;;;N;LATIN CAPITAL LETTER Z ACUTE;;;017A; +017A;LATIN SMALL LETTER Z WITH ACUTE;Ll;0;L;007A 0301;;;;N;LATIN SMALL LETTER Z ACUTE;;0179;;0179 +017B;LATIN CAPITAL LETTER Z WITH DOT ABOVE;Lu;0;L;005A 0307;;;;N;LATIN CAPITAL LETTER Z DOT;;;017C; +017C;LATIN SMALL LETTER Z WITH DOT ABOVE;Ll;0;L;007A 0307;;;;N;LATIN SMALL LETTER Z DOT;;017B;;017B +017D;LATIN CAPITAL LETTER Z WITH CARON;Lu;0;L;005A 030C;;;;N;LATIN CAPITAL LETTER Z HACEK;;;017E; +017E;LATIN SMALL LETTER Z WITH CARON;Ll;0;L;007A 030C;;;;N;LATIN SMALL LETTER Z HACEK;;017D;;017D +017F;LATIN SMALL LETTER LONG S;Ll;0;L;<compat> 0073;;;;N;;;0053;;0053 +0180;LATIN SMALL LETTER B WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER B BAR;;0243;;0243 +0181;LATIN CAPITAL LETTER B WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER B HOOK;;;0253; +0182;LATIN CAPITAL LETTER B WITH TOPBAR;Lu;0;L;;;;;N;LATIN CAPITAL LETTER B TOPBAR;;;0183; +0183;LATIN SMALL LETTER B WITH TOPBAR;Ll;0;L;;;;;N;LATIN SMALL LETTER B TOPBAR;;0182;;0182 +0184;LATIN CAPITAL LETTER TONE SIX;Lu;0;L;;;;;N;;;;0185; +0185;LATIN SMALL LETTER TONE SIX;Ll;0;L;;;;;N;;;0184;;0184 +0186;LATIN CAPITAL LETTER OPEN O;Lu;0;L;;;;;N;;;;0254; +0187;LATIN CAPITAL LETTER C WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER C HOOK;;;0188; +0188;LATIN SMALL LETTER C WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER C HOOK;;0187;;0187 +0189;LATIN CAPITAL LETTER AFRICAN D;Lu;0;L;;;;;N;;;;0256; +018A;LATIN CAPITAL LETTER D WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER D HOOK;;;0257; +018B;LATIN CAPITAL LETTER D WITH TOPBAR;Lu;0;L;;;;;N;LATIN CAPITAL LETTER D TOPBAR;;;018C; +018C;LATIN SMALL LETTER D WITH TOPBAR;Ll;0;L;;;;;N;LATIN SMALL LETTER D TOPBAR;;018B;;018B +018D;LATIN SMALL LETTER TURNED DELTA;Ll;0;L;;;;;N;;;;; +018E;LATIN CAPITAL LETTER REVERSED E;Lu;0;L;;;;;N;LATIN CAPITAL LETTER TURNED E;;;01DD; +018F;LATIN CAPITAL LETTER SCHWA;Lu;0;L;;;;;N;;;;0259; +0190;LATIN CAPITAL LETTER OPEN E;Lu;0;L;;;;;N;LATIN CAPITAL LETTER EPSILON;;;025B; +0191;LATIN CAPITAL LETTER F WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER F HOOK;;;0192; +0192;LATIN SMALL LETTER F WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER SCRIPT F;;0191;;0191 +0193;LATIN CAPITAL LETTER G WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER G HOOK;;;0260; +0194;LATIN CAPITAL LETTER GAMMA;Lu;0;L;;;;;N;;;;0263; +0195;LATIN SMALL LETTER HV;Ll;0;L;;;;;N;LATIN SMALL LETTER H V;;01F6;;01F6 +0196;LATIN CAPITAL LETTER IOTA;Lu;0;L;;;;;N;;;;0269; +0197;LATIN CAPITAL LETTER I WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER BARRED I;;;0268; +0198;LATIN CAPITAL LETTER K WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER K HOOK;;;0199; +0199;LATIN SMALL LETTER K WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER K HOOK;;0198;;0198 +019A;LATIN SMALL LETTER L WITH BAR;Ll;0;L;;;;;N;LATIN SMALL LETTER BARRED L;;023D;;023D +019B;LATIN SMALL LETTER LAMBDA WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER BARRED LAMBDA;;;; +019C;LATIN CAPITAL LETTER TURNED M;Lu;0;L;;;;;N;;;;026F; +019D;LATIN CAPITAL LETTER N WITH LEFT HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER N HOOK;;;0272; +019E;LATIN SMALL LETTER N WITH LONG RIGHT LEG;Ll;0;L;;;;;N;;;0220;;0220 +019F;LATIN CAPITAL LETTER O WITH MIDDLE TILDE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER BARRED O;;;0275; +01A0;LATIN CAPITAL LETTER O WITH HORN;Lu;0;L;004F 031B;;;;N;LATIN CAPITAL LETTER O HORN;;;01A1; +01A1;LATIN SMALL LETTER O WITH HORN;Ll;0;L;006F 031B;;;;N;LATIN SMALL LETTER O HORN;;01A0;;01A0 +01A2;LATIN CAPITAL LETTER OI;Lu;0;L;;;;;N;LATIN CAPITAL LETTER O I;;;01A3; +01A3;LATIN SMALL LETTER OI;Ll;0;L;;;;;N;LATIN SMALL LETTER O I;;01A2;;01A2 +01A4;LATIN CAPITAL LETTER P WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER P HOOK;;;01A5; +01A5;LATIN SMALL LETTER P WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER P HOOK;;01A4;;01A4 +01A6;LATIN LETTER YR;Lu;0;L;;;;;N;LATIN LETTER Y R;;;0280; +01A7;LATIN CAPITAL LETTER TONE TWO;Lu;0;L;;;;;N;;;;01A8; +01A8;LATIN SMALL LETTER TONE TWO;Ll;0;L;;;;;N;;;01A7;;01A7 +01A9;LATIN CAPITAL LETTER ESH;Lu;0;L;;;;;N;;;;0283; +01AA;LATIN LETTER REVERSED ESH LOOP;Ll;0;L;;;;;N;;;;; +01AB;LATIN SMALL LETTER T WITH PALATAL HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER T PALATAL HOOK;;;; +01AC;LATIN CAPITAL LETTER T WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER T HOOK;;;01AD; +01AD;LATIN SMALL LETTER T WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER T HOOK;;01AC;;01AC +01AE;LATIN CAPITAL LETTER T WITH RETROFLEX HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER T RETROFLEX HOOK;;;0288; +01AF;LATIN CAPITAL LETTER U WITH HORN;Lu;0;L;0055 031B;;;;N;LATIN CAPITAL LETTER U HORN;;;01B0; +01B0;LATIN SMALL LETTER U WITH HORN;Ll;0;L;0075 031B;;;;N;LATIN SMALL LETTER U HORN;;01AF;;01AF +01B1;LATIN CAPITAL LETTER UPSILON;Lu;0;L;;;;;N;;;;028A; +01B2;LATIN CAPITAL LETTER V WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER SCRIPT V;;;028B; +01B3;LATIN CAPITAL LETTER Y WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER Y HOOK;;;01B4; +01B4;LATIN SMALL LETTER Y WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER Y HOOK;;01B3;;01B3 +01B5;LATIN CAPITAL LETTER Z WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER Z BAR;;;01B6; +01B6;LATIN SMALL LETTER Z WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER Z BAR;;01B5;;01B5 +01B7;LATIN CAPITAL LETTER EZH;Lu;0;L;;;;;N;LATIN CAPITAL LETTER YOGH;;;0292; +01B8;LATIN CAPITAL LETTER EZH REVERSED;Lu;0;L;;;;;N;LATIN CAPITAL LETTER REVERSED YOGH;;;01B9; +01B9;LATIN SMALL LETTER EZH REVERSED;Ll;0;L;;;;;N;LATIN SMALL LETTER REVERSED YOGH;;01B8;;01B8 +01BA;LATIN SMALL LETTER EZH WITH TAIL;Ll;0;L;;;;;N;LATIN SMALL LETTER YOGH WITH TAIL;;;; +01BB;LATIN LETTER TWO WITH STROKE;Lo;0;L;;;;;N;LATIN LETTER TWO BAR;;;; +01BC;LATIN CAPITAL LETTER TONE FIVE;Lu;0;L;;;;;N;;;;01BD; +01BD;LATIN SMALL LETTER TONE FIVE;Ll;0;L;;;;;N;;;01BC;;01BC +01BE;LATIN LETTER INVERTED GLOTTAL STOP WITH STROKE;Ll;0;L;;;;;N;LATIN LETTER INVERTED GLOTTAL STOP BAR;;;; +01BF;LATIN LETTER WYNN;Ll;0;L;;;;;N;;;01F7;;01F7 +01C0;LATIN LETTER DENTAL CLICK;Lo;0;L;;;;;N;LATIN LETTER PIPE;;;; +01C1;LATIN LETTER LATERAL CLICK;Lo;0;L;;;;;N;LATIN LETTER DOUBLE PIPE;;;; +01C2;LATIN LETTER ALVEOLAR CLICK;Lo;0;L;;;;;N;LATIN LETTER PIPE DOUBLE BAR;;;; +01C3;LATIN LETTER RETROFLEX CLICK;Lo;0;L;;;;;N;LATIN LETTER EXCLAMATION MARK;;;; +01C4;LATIN CAPITAL LETTER DZ WITH CARON;Lu;0;L;<compat> 0044 017D;;;;N;LATIN CAPITAL LETTER D Z HACEK;;;01C6;01C5 +01C5;LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON;Lt;0;L;<compat> 0044 017E;;;;N;LATIN LETTER CAPITAL D SMALL Z HACEK;;01C4;01C6;01C5 +01C6;LATIN SMALL LETTER DZ WITH CARON;Ll;0;L;<compat> 0064 017E;;;;N;LATIN SMALL LETTER D Z HACEK;;01C4;;01C5 +01C7;LATIN CAPITAL LETTER LJ;Lu;0;L;<compat> 004C 004A;;;;N;LATIN CAPITAL LETTER L J;;;01C9;01C8 +01C8;LATIN CAPITAL LETTER L WITH SMALL LETTER J;Lt;0;L;<compat> 004C 006A;;;;N;LATIN LETTER CAPITAL L SMALL J;;01C7;01C9;01C8 +01C9;LATIN SMALL LETTER LJ;Ll;0;L;<compat> 006C 006A;;;;N;LATIN SMALL LETTER L J;;01C7;;01C8 +01CA;LATIN CAPITAL LETTER NJ;Lu;0;L;<compat> 004E 004A;;;;N;LATIN CAPITAL LETTER N J;;;01CC;01CB +01CB;LATIN CAPITAL LETTER N WITH SMALL LETTER J;Lt;0;L;<compat> 004E 006A;;;;N;LATIN LETTER CAPITAL N SMALL J;;01CA;01CC;01CB +01CC;LATIN SMALL LETTER NJ;Ll;0;L;<compat> 006E 006A;;;;N;LATIN SMALL LETTER N J;;01CA;;01CB +01CD;LATIN CAPITAL LETTER A WITH CARON;Lu;0;L;0041 030C;;;;N;LATIN CAPITAL LETTER A HACEK;;;01CE; +01CE;LATIN SMALL LETTER A WITH CARON;Ll;0;L;0061 030C;;;;N;LATIN SMALL LETTER A HACEK;;01CD;;01CD +01CF;LATIN CAPITAL LETTER I WITH CARON;Lu;0;L;0049 030C;;;;N;LATIN CAPITAL LETTER I HACEK;;;01D0; +01D0;LATIN SMALL LETTER I WITH CARON;Ll;0;L;0069 030C;;;;N;LATIN SMALL LETTER I HACEK;;01CF;;01CF +01D1;LATIN CAPITAL LETTER O WITH CARON;Lu;0;L;004F 030C;;;;N;LATIN CAPITAL LETTER O HACEK;;;01D2; +01D2;LATIN SMALL LETTER O WITH CARON;Ll;0;L;006F 030C;;;;N;LATIN SMALL LETTER O HACEK;;01D1;;01D1 +01D3;LATIN CAPITAL LETTER U WITH CARON;Lu;0;L;0055 030C;;;;N;LATIN CAPITAL LETTER U HACEK;;;01D4; +01D4;LATIN SMALL LETTER U WITH CARON;Ll;0;L;0075 030C;;;;N;LATIN SMALL LETTER U HACEK;;01D3;;01D3 +01D5;LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON;Lu;0;L;00DC 0304;;;;N;LATIN CAPITAL LETTER U DIAERESIS MACRON;;;01D6; +01D6;LATIN SMALL LETTER U WITH DIAERESIS AND MACRON;Ll;0;L;00FC 0304;;;;N;LATIN SMALL LETTER U DIAERESIS MACRON;;01D5;;01D5 +01D7;LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE;Lu;0;L;00DC 0301;;;;N;LATIN CAPITAL LETTER U DIAERESIS ACUTE;;;01D8; +01D8;LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE;Ll;0;L;00FC 0301;;;;N;LATIN SMALL LETTER U DIAERESIS ACUTE;;01D7;;01D7 +01D9;LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON;Lu;0;L;00DC 030C;;;;N;LATIN CAPITAL LETTER U DIAERESIS HACEK;;;01DA; +01DA;LATIN SMALL LETTER U WITH DIAERESIS AND CARON;Ll;0;L;00FC 030C;;;;N;LATIN SMALL LETTER U DIAERESIS HACEK;;01D9;;01D9 +01DB;LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE;Lu;0;L;00DC 0300;;;;N;LATIN CAPITAL LETTER U DIAERESIS GRAVE;;;01DC; +01DC;LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE;Ll;0;L;00FC 0300;;;;N;LATIN SMALL LETTER U DIAERESIS GRAVE;;01DB;;01DB +01DD;LATIN SMALL LETTER TURNED E;Ll;0;L;;;;;N;;;018E;;018E +01DE;LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON;Lu;0;L;00C4 0304;;;;N;LATIN CAPITAL LETTER A DIAERESIS MACRON;;;01DF; +01DF;LATIN SMALL LETTER A WITH DIAERESIS AND MACRON;Ll;0;L;00E4 0304;;;;N;LATIN SMALL LETTER A DIAERESIS MACRON;;01DE;;01DE +01E0;LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON;Lu;0;L;0226 0304;;;;N;LATIN CAPITAL LETTER A DOT MACRON;;;01E1; +01E1;LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON;Ll;0;L;0227 0304;;;;N;LATIN SMALL LETTER A DOT MACRON;;01E0;;01E0 +01E2;LATIN CAPITAL LETTER AE WITH MACRON;Lu;0;L;00C6 0304;;;;N;LATIN CAPITAL LETTER A E MACRON;;;01E3; +01E3;LATIN SMALL LETTER AE WITH MACRON;Ll;0;L;00E6 0304;;;;N;LATIN SMALL LETTER A E MACRON;;01E2;;01E2 +01E4;LATIN CAPITAL LETTER G WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER G BAR;;;01E5; +01E5;LATIN SMALL LETTER G WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER G BAR;;01E4;;01E4 +01E6;LATIN CAPITAL LETTER G WITH CARON;Lu;0;L;0047 030C;;;;N;LATIN CAPITAL LETTER G HACEK;;;01E7; +01E7;LATIN SMALL LETTER G WITH CARON;Ll;0;L;0067 030C;;;;N;LATIN SMALL LETTER G HACEK;;01E6;;01E6 +01E8;LATIN CAPITAL LETTER K WITH CARON;Lu;0;L;004B 030C;;;;N;LATIN CAPITAL LETTER K HACEK;;;01E9; +01E9;LATIN SMALL LETTER K WITH CARON;Ll;0;L;006B 030C;;;;N;LATIN SMALL LETTER K HACEK;;01E8;;01E8 +01EA;LATIN CAPITAL LETTER O WITH OGONEK;Lu;0;L;004F 0328;;;;N;LATIN CAPITAL LETTER O OGONEK;;;01EB; +01EB;LATIN SMALL LETTER O WITH OGONEK;Ll;0;L;006F 0328;;;;N;LATIN SMALL LETTER O OGONEK;;01EA;;01EA +01EC;LATIN CAPITAL LETTER O WITH OGONEK AND MACRON;Lu;0;L;01EA 0304;;;;N;LATIN CAPITAL LETTER O OGONEK MACRON;;;01ED; +01ED;LATIN SMALL LETTER O WITH OGONEK AND MACRON;Ll;0;L;01EB 0304;;;;N;LATIN SMALL LETTER O OGONEK MACRON;;01EC;;01EC +01EE;LATIN CAPITAL LETTER EZH WITH CARON;Lu;0;L;01B7 030C;;;;N;LATIN CAPITAL LETTER YOGH HACEK;;;01EF; +01EF;LATIN SMALL LETTER EZH WITH CARON;Ll;0;L;0292 030C;;;;N;LATIN SMALL LETTER YOGH HACEK;;01EE;;01EE +01F0;LATIN SMALL LETTER J WITH CARON;Ll;0;L;006A 030C;;;;N;LATIN SMALL LETTER J HACEK;;;; +01F1;LATIN CAPITAL LETTER DZ;Lu;0;L;<compat> 0044 005A;;;;N;;;;01F3;01F2 +01F2;LATIN CAPITAL LETTER D WITH SMALL LETTER Z;Lt;0;L;<compat> 0044 007A;;;;N;;;01F1;01F3;01F2 +01F3;LATIN SMALL LETTER DZ;Ll;0;L;<compat> 0064 007A;;;;N;;;01F1;;01F2 +01F4;LATIN CAPITAL LETTER G WITH ACUTE;Lu;0;L;0047 0301;;;;N;;;;01F5; +01F5;LATIN SMALL LETTER G WITH ACUTE;Ll;0;L;0067 0301;;;;N;;;01F4;;01F4 +01F6;LATIN CAPITAL LETTER HWAIR;Lu;0;L;;;;;N;;;;0195; +01F7;LATIN CAPITAL LETTER WYNN;Lu;0;L;;;;;N;;;;01BF; +01F8;LATIN CAPITAL LETTER N WITH GRAVE;Lu;0;L;004E 0300;;;;N;;;;01F9; +01F9;LATIN SMALL LETTER N WITH GRAVE;Ll;0;L;006E 0300;;;;N;;;01F8;;01F8 +01FA;LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE;Lu;0;L;00C5 0301;;;;N;;;;01FB; +01FB;LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE;Ll;0;L;00E5 0301;;;;N;;;01FA;;01FA +01FC;LATIN CAPITAL LETTER AE WITH ACUTE;Lu;0;L;00C6 0301;;;;N;;;;01FD; +01FD;LATIN SMALL LETTER AE WITH ACUTE;Ll;0;L;00E6 0301;;;;N;;;01FC;;01FC +01FE;LATIN CAPITAL LETTER O WITH STROKE AND ACUTE;Lu;0;L;00D8 0301;;;;N;;;;01FF; +01FF;LATIN SMALL LETTER O WITH STROKE AND ACUTE;Ll;0;L;00F8 0301;;;;N;;;01FE;;01FE +0200;LATIN CAPITAL LETTER A WITH DOUBLE GRAVE;Lu;0;L;0041 030F;;;;N;;;;0201; +0201;LATIN SMALL LETTER A WITH DOUBLE GRAVE;Ll;0;L;0061 030F;;;;N;;;0200;;0200 +0202;LATIN CAPITAL LETTER A WITH INVERTED BREVE;Lu;0;L;0041 0311;;;;N;;;;0203; +0203;LATIN SMALL LETTER A WITH INVERTED BREVE;Ll;0;L;0061 0311;;;;N;;;0202;;0202 +0204;LATIN CAPITAL LETTER E WITH DOUBLE GRAVE;Lu;0;L;0045 030F;;;;N;;;;0205; +0205;LATIN SMALL LETTER E WITH DOUBLE GRAVE;Ll;0;L;0065 030F;;;;N;;;0204;;0204 +0206;LATIN CAPITAL LETTER E WITH INVERTED BREVE;Lu;0;L;0045 0311;;;;N;;;;0207; +0207;LATIN SMALL LETTER E WITH INVERTED BREVE;Ll;0;L;0065 0311;;;;N;;;0206;;0206 +0208;LATIN CAPITAL LETTER I WITH DOUBLE GRAVE;Lu;0;L;0049 030F;;;;N;;;;0209; +0209;LATIN SMALL LETTER I WITH DOUBLE GRAVE;Ll;0;L;0069 030F;;;;N;;;0208;;0208 +020A;LATIN CAPITAL LETTER I WITH INVERTED BREVE;Lu;0;L;0049 0311;;;;N;;;;020B; +020B;LATIN SMALL LETTER I WITH INVERTED BREVE;Ll;0;L;0069 0311;;;;N;;;020A;;020A +020C;LATIN CAPITAL LETTER O WITH DOUBLE GRAVE;Lu;0;L;004F 030F;;;;N;;;;020D; +020D;LATIN SMALL LETTER O WITH DOUBLE GRAVE;Ll;0;L;006F 030F;;;;N;;;020C;;020C +020E;LATIN CAPITAL LETTER O WITH INVERTED BREVE;Lu;0;L;004F 0311;;;;N;;;;020F; +020F;LATIN SMALL LETTER O WITH INVERTED BREVE;Ll;0;L;006F 0311;;;;N;;;020E;;020E +0210;LATIN CAPITAL LETTER R WITH DOUBLE GRAVE;Lu;0;L;0052 030F;;;;N;;;;0211; +0211;LATIN SMALL LETTER R WITH DOUBLE GRAVE;Ll;0;L;0072 030F;;;;N;;;0210;;0210 +0212;LATIN CAPITAL LETTER R WITH INVERTED BREVE;Lu;0;L;0052 0311;;;;N;;;;0213; +0213;LATIN SMALL LETTER R WITH INVERTED BREVE;Ll;0;L;0072 0311;;;;N;;;0212;;0212 +0214;LATIN CAPITAL LETTER U WITH DOUBLE GRAVE;Lu;0;L;0055 030F;;;;N;;;;0215; +0215;LATIN SMALL LETTER U WITH DOUBLE GRAVE;Ll;0;L;0075 030F;;;;N;;;0214;;0214 +0216;LATIN CAPITAL LETTER U WITH INVERTED BREVE;Lu;0;L;0055 0311;;;;N;;;;0217; +0217;LATIN SMALL LETTER U WITH INVERTED BREVE;Ll;0;L;0075 0311;;;;N;;;0216;;0216 +0218;LATIN CAPITAL LETTER S WITH COMMA BELOW;Lu;0;L;0053 0326;;;;N;;;;0219; +0219;LATIN SMALL LETTER S WITH COMMA BELOW;Ll;0;L;0073 0326;;;;N;;;0218;;0218 +021A;LATIN CAPITAL LETTER T WITH COMMA BELOW;Lu;0;L;0054 0326;;;;N;;;;021B; +021B;LATIN SMALL LETTER T WITH COMMA BELOW;Ll;0;L;0074 0326;;;;N;;;021A;;021A +021C;LATIN CAPITAL LETTER YOGH;Lu;0;L;;;;;N;;;;021D; +021D;LATIN SMALL LETTER YOGH;Ll;0;L;;;;;N;;;021C;;021C +021E;LATIN CAPITAL LETTER H WITH CARON;Lu;0;L;0048 030C;;;;N;;;;021F; +021F;LATIN SMALL LETTER H WITH CARON;Ll;0;L;0068 030C;;;;N;;;021E;;021E +0220;LATIN CAPITAL LETTER N WITH LONG RIGHT LEG;Lu;0;L;;;;;N;;;;019E; +0221;LATIN SMALL LETTER D WITH CURL;Ll;0;L;;;;;N;;;;; +0222;LATIN CAPITAL LETTER OU;Lu;0;L;;;;;N;;;;0223; +0223;LATIN SMALL LETTER OU;Ll;0;L;;;;;N;;;0222;;0222 +0224;LATIN CAPITAL LETTER Z WITH HOOK;Lu;0;L;;;;;N;;;;0225; +0225;LATIN SMALL LETTER Z WITH HOOK;Ll;0;L;;;;;N;;;0224;;0224 +0226;LATIN CAPITAL LETTER A WITH DOT ABOVE;Lu;0;L;0041 0307;;;;N;;;;0227; +0227;LATIN SMALL LETTER A WITH DOT ABOVE;Ll;0;L;0061 0307;;;;N;;;0226;;0226 +0228;LATIN CAPITAL LETTER E WITH CEDILLA;Lu;0;L;0045 0327;;;;N;;;;0229; +0229;LATIN SMALL LETTER E WITH CEDILLA;Ll;0;L;0065 0327;;;;N;;;0228;;0228 +022A;LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON;Lu;0;L;00D6 0304;;;;N;;;;022B; +022B;LATIN SMALL LETTER O WITH DIAERESIS AND MACRON;Ll;0;L;00F6 0304;;;;N;;;022A;;022A +022C;LATIN CAPITAL LETTER O WITH TILDE AND MACRON;Lu;0;L;00D5 0304;;;;N;;;;022D; +022D;LATIN SMALL LETTER O WITH TILDE AND MACRON;Ll;0;L;00F5 0304;;;;N;;;022C;;022C +022E;LATIN CAPITAL LETTER O WITH DOT ABOVE;Lu;0;L;004F 0307;;;;N;;;;022F; +022F;LATIN SMALL LETTER O WITH DOT ABOVE;Ll;0;L;006F 0307;;;;N;;;022E;;022E +0230;LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON;Lu;0;L;022E 0304;;;;N;;;;0231; +0231;LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON;Ll;0;L;022F 0304;;;;N;;;0230;;0230 +0232;LATIN CAPITAL LETTER Y WITH MACRON;Lu;0;L;0059 0304;;;;N;;;;0233; +0233;LATIN SMALL LETTER Y WITH MACRON;Ll;0;L;0079 0304;;;;N;;;0232;;0232 +0234;LATIN SMALL LETTER L WITH CURL;Ll;0;L;;;;;N;;;;; +0235;LATIN SMALL LETTER N WITH CURL;Ll;0;L;;;;;N;;;;; +0236;LATIN SMALL LETTER T WITH CURL;Ll;0;L;;;;;N;;;;; +0237;LATIN SMALL LETTER DOTLESS J;Ll;0;L;;;;;N;;;;; +0238;LATIN SMALL LETTER DB DIGRAPH;Ll;0;L;;;;;N;;;;; +0239;LATIN SMALL LETTER QP DIGRAPH;Ll;0;L;;;;;N;;;;; +023A;LATIN CAPITAL LETTER A WITH STROKE;Lu;0;L;;;;;N;;;;2C65; +023B;LATIN CAPITAL LETTER C WITH STROKE;Lu;0;L;;;;;N;;;;023C; +023C;LATIN SMALL LETTER C WITH STROKE;Ll;0;L;;;;;N;;;023B;;023B +023D;LATIN CAPITAL LETTER L WITH BAR;Lu;0;L;;;;;N;;;;019A; +023E;LATIN CAPITAL LETTER T WITH DIAGONAL STROKE;Lu;0;L;;;;;N;;;;2C66; +023F;LATIN SMALL LETTER S WITH SWASH TAIL;Ll;0;L;;;;;N;;;2C7E;;2C7E +0240;LATIN SMALL LETTER Z WITH SWASH TAIL;Ll;0;L;;;;;N;;;2C7F;;2C7F +0241;LATIN CAPITAL LETTER GLOTTAL STOP;Lu;0;L;;;;;N;;;;0242; +0242;LATIN SMALL LETTER GLOTTAL STOP;Ll;0;L;;;;;N;;;0241;;0241 +0243;LATIN CAPITAL LETTER B WITH STROKE;Lu;0;L;;;;;N;;;;0180; +0244;LATIN CAPITAL LETTER U BAR;Lu;0;L;;;;;N;;;;0289; +0245;LATIN CAPITAL LETTER TURNED V;Lu;0;L;;;;;N;;;;028C; +0246;LATIN CAPITAL LETTER E WITH STROKE;Lu;0;L;;;;;N;;;;0247; +0247;LATIN SMALL LETTER E WITH STROKE;Ll;0;L;;;;;N;;;0246;;0246 +0248;LATIN CAPITAL LETTER J WITH STROKE;Lu;0;L;;;;;N;;;;0249; +0249;LATIN SMALL LETTER J WITH STROKE;Ll;0;L;;;;;N;;;0248;;0248 +024A;LATIN CAPITAL LETTER SMALL Q WITH HOOK TAIL;Lu;0;L;;;;;N;;;;024B; +024B;LATIN SMALL LETTER Q WITH HOOK TAIL;Ll;0;L;;;;;N;;;024A;;024A +024C;LATIN CAPITAL LETTER R WITH STROKE;Lu;0;L;;;;;N;;;;024D; +024D;LATIN SMALL LETTER R WITH STROKE;Ll;0;L;;;;;N;;;024C;;024C +024E;LATIN CAPITAL LETTER Y WITH STROKE;Lu;0;L;;;;;N;;;;024F; +024F;LATIN SMALL LETTER Y WITH STROKE;Ll;0;L;;;;;N;;;024E;;024E +0250;LATIN SMALL LETTER TURNED A;Ll;0;L;;;;;N;;;2C6F;;2C6F +0251;LATIN SMALL LETTER ALPHA;Ll;0;L;;;;;N;LATIN SMALL LETTER SCRIPT A;;2C6D;;2C6D +0252;LATIN SMALL LETTER TURNED ALPHA;Ll;0;L;;;;;N;LATIN SMALL LETTER TURNED SCRIPT A;;2C70;;2C70 +0253;LATIN SMALL LETTER B WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER B HOOK;;0181;;0181 +0254;LATIN SMALL LETTER OPEN O;Ll;0;L;;;;;N;;;0186;;0186 +0255;LATIN SMALL LETTER C WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER C CURL;;;; +0256;LATIN SMALL LETTER D WITH TAIL;Ll;0;L;;;;;N;LATIN SMALL LETTER D RETROFLEX HOOK;;0189;;0189 +0257;LATIN SMALL LETTER D WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER D HOOK;;018A;;018A +0258;LATIN SMALL LETTER REVERSED E;Ll;0;L;;;;;N;;;;; +0259;LATIN SMALL LETTER SCHWA;Ll;0;L;;;;;N;;;018F;;018F +025A;LATIN SMALL LETTER SCHWA WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER SCHWA HOOK;;;; +025B;LATIN SMALL LETTER OPEN E;Ll;0;L;;;;;N;LATIN SMALL LETTER EPSILON;;0190;;0190 +025C;LATIN SMALL LETTER REVERSED OPEN E;Ll;0;L;;;;;N;LATIN SMALL LETTER REVERSED EPSILON;;A7AB;;A7AB +025D;LATIN SMALL LETTER REVERSED OPEN E WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER REVERSED EPSILON HOOK;;;; +025E;LATIN SMALL LETTER CLOSED REVERSED OPEN E;Ll;0;L;;;;;N;LATIN SMALL LETTER CLOSED REVERSED EPSILON;;;; +025F;LATIN SMALL LETTER DOTLESS J WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER DOTLESS J BAR;;;; +0260;LATIN SMALL LETTER G WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER G HOOK;;0193;;0193 +0261;LATIN SMALL LETTER SCRIPT G;Ll;0;L;;;;;N;;;A7AC;;A7AC +0262;LATIN LETTER SMALL CAPITAL G;Ll;0;L;;;;;N;;;;; +0263;LATIN SMALL LETTER GAMMA;Ll;0;L;;;;;N;;;0194;;0194 +0264;LATIN SMALL LETTER RAMS HORN;Ll;0;L;;;;;N;LATIN SMALL LETTER BABY GAMMA;;;; +0265;LATIN SMALL LETTER TURNED H;Ll;0;L;;;;;N;;;A78D;;A78D +0266;LATIN SMALL LETTER H WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER H HOOK;;A7AA;;A7AA +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;;;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;;;; +026E;LATIN SMALL LETTER LEZH;Ll;0;L;;;;;N;LATIN SMALL LETTER L YOGH;;;; +026F;LATIN SMALL LETTER TURNED M;Ll;0;L;;;;;N;;;019C;;019C +0270;LATIN SMALL LETTER TURNED M WITH LONG LEG;Ll;0;L;;;;;N;;;;; +0271;LATIN SMALL LETTER M WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER M HOOK;;2C6E;;2C6E +0272;LATIN SMALL LETTER N WITH LEFT HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER N HOOK;;019D;;019D +0273;LATIN SMALL LETTER N WITH RETROFLEX HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER N RETROFLEX HOOK;;;; +0274;LATIN LETTER SMALL CAPITAL N;Ll;0;L;;;;;N;;;;; +0275;LATIN SMALL LETTER BARRED O;Ll;0;L;;;;;N;;;019F;;019F +0276;LATIN LETTER SMALL CAPITAL OE;Ll;0;L;;;;;N;LATIN LETTER SMALL CAPITAL O E;;;; +0277;LATIN SMALL LETTER CLOSED OMEGA;Ll;0;L;;;;;N;;;;; +0278;LATIN SMALL LETTER PHI;Ll;0;L;;;;;N;;;;; +0279;LATIN SMALL LETTER TURNED R;Ll;0;L;;;;;N;;;;; +027A;LATIN SMALL LETTER TURNED R WITH LONG LEG;Ll;0;L;;;;;N;;;;; +027B;LATIN SMALL LETTER TURNED R WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER TURNED R HOOK;;;; +027C;LATIN SMALL LETTER R WITH LONG LEG;Ll;0;L;;;;;N;;;;; +027D;LATIN SMALL LETTER R WITH TAIL;Ll;0;L;;;;;N;LATIN SMALL LETTER R HOOK;;2C64;;2C64 +027E;LATIN SMALL LETTER R WITH FISHHOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER FISHHOOK R;;;; +027F;LATIN SMALL LETTER REVERSED R WITH FISHHOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER REVERSED FISHHOOK R;;;; +0280;LATIN LETTER SMALL CAPITAL R;Ll;0;L;;;;;N;;;01A6;;01A6 +0281;LATIN LETTER SMALL CAPITAL INVERTED R;Ll;0;L;;;;;N;;;;; +0282;LATIN SMALL LETTER S WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER S HOOK;;;; +0283;LATIN SMALL LETTER ESH;Ll;0;L;;;;;N;;;01A9;;01A9 +0284;LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER DOTLESS J BAR HOOK;;;; +0285;LATIN SMALL LETTER SQUAT REVERSED ESH;Ll;0;L;;;;;N;;;;; +0286;LATIN SMALL LETTER ESH WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER ESH CURL;;;; +0287;LATIN SMALL LETTER TURNED T;Ll;0;L;;;;;N;;;A7B1;;A7B1 +0288;LATIN SMALL LETTER T WITH RETROFLEX HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER T RETROFLEX HOOK;;01AE;;01AE +0289;LATIN SMALL LETTER U BAR;Ll;0;L;;;;;N;;;0244;;0244 +028A;LATIN SMALL LETTER UPSILON;Ll;0;L;;;;;N;;;01B1;;01B1 +028B;LATIN SMALL LETTER V WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER SCRIPT V;;01B2;;01B2 +028C;LATIN SMALL LETTER TURNED V;Ll;0;L;;;;;N;;;0245;;0245 +028D;LATIN SMALL LETTER TURNED W;Ll;0;L;;;;;N;;;;; +028E;LATIN SMALL LETTER TURNED Y;Ll;0;L;;;;;N;;;;; +028F;LATIN LETTER SMALL CAPITAL Y;Ll;0;L;;;;;N;;;;; +0290;LATIN SMALL LETTER Z WITH RETROFLEX HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER Z RETROFLEX HOOK;;;; +0291;LATIN SMALL LETTER Z WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER Z CURL;;;; +0292;LATIN SMALL LETTER EZH;Ll;0;L;;;;;N;LATIN SMALL LETTER YOGH;;01B7;;01B7 +0293;LATIN SMALL LETTER EZH WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER YOGH CURL;;;; +0294;LATIN LETTER GLOTTAL STOP;Lo;0;L;;;;;N;;;;; +0295;LATIN LETTER PHARYNGEAL VOICED FRICATIVE;Ll;0;L;;;;;N;LATIN LETTER REVERSED GLOTTAL STOP;;;; +0296;LATIN LETTER INVERTED GLOTTAL STOP;Ll;0;L;;;;;N;;;;; +0297;LATIN LETTER STRETCHED C;Ll;0;L;;;;;N;;;;; +0298;LATIN LETTER BILABIAL CLICK;Ll;0;L;;;;;N;LATIN LETTER BULLSEYE;;;; +0299;LATIN LETTER SMALL CAPITAL B;Ll;0;L;;;;;N;;;;; +029A;LATIN SMALL LETTER CLOSED OPEN E;Ll;0;L;;;;;N;LATIN SMALL LETTER CLOSED EPSILON;;;; +029B;LATIN LETTER SMALL CAPITAL G WITH HOOK;Ll;0;L;;;;;N;LATIN LETTER SMALL CAPITAL G HOOK;;;; +029C;LATIN LETTER SMALL CAPITAL H;Ll;0;L;;;;;N;;;;; +029D;LATIN SMALL LETTER J WITH CROSSED-TAIL;Ll;0;L;;;;;N;LATIN SMALL LETTER CROSSED-TAIL J;;A7B2;;A7B2 +029E;LATIN SMALL LETTER TURNED K;Ll;0;L;;;;;N;;;A7B0;;A7B0 +029F;LATIN LETTER SMALL CAPITAL L;Ll;0;L;;;;;N;;;;; +02A0;LATIN SMALL LETTER Q WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER Q HOOK;;;; +02A1;LATIN LETTER GLOTTAL STOP WITH STROKE;Ll;0;L;;;;;N;LATIN LETTER GLOTTAL STOP BAR;;;; +02A2;LATIN LETTER REVERSED GLOTTAL STOP WITH STROKE;Ll;0;L;;;;;N;LATIN LETTER REVERSED GLOTTAL STOP BAR;;;; +02A3;LATIN SMALL LETTER DZ DIGRAPH;Ll;0;L;;;;;N;LATIN SMALL LETTER D Z;;;; +02A4;LATIN SMALL LETTER DEZH DIGRAPH;Ll;0;L;;;;;N;LATIN SMALL LETTER D YOGH;;;; +02A5;LATIN SMALL LETTER DZ DIGRAPH WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER D Z CURL;;;; +02A6;LATIN SMALL LETTER TS DIGRAPH;Ll;0;L;;;;;N;LATIN SMALL LETTER T S;;;; +02A7;LATIN SMALL LETTER TESH DIGRAPH;Ll;0;L;;;;;N;LATIN SMALL LETTER T ESH;;;; +02A8;LATIN SMALL LETTER TC DIGRAPH WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER T C CURL;;;; +02A9;LATIN SMALL LETTER FENG DIGRAPH;Ll;0;L;;;;;N;;;;; +02AA;LATIN SMALL LETTER LS DIGRAPH;Ll;0;L;;;;;N;;;;; +02AB;LATIN SMALL LETTER LZ DIGRAPH;Ll;0;L;;;;;N;;;;; +02AC;LATIN LETTER BILABIAL PERCUSSIVE;Ll;0;L;;;;;N;;;;; +02AD;LATIN LETTER BIDENTAL PERCUSSIVE;Ll;0;L;;;;;N;;;;; +02AE;LATIN SMALL LETTER TURNED H WITH FISHHOOK;Ll;0;L;;;;;N;;;;; +02AF;LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL;Ll;0;L;;;;;N;;;;; +02B0;MODIFIER LETTER SMALL H;Lm;0;L;<super> 0068;;;;N;;;;; +02B1;MODIFIER LETTER SMALL H WITH HOOK;Lm;0;L;<super> 0266;;;;N;MODIFIER LETTER SMALL H HOOK;;;; +02B2;MODIFIER LETTER SMALL J;Lm;0;L;<super> 006A;;;;N;;;;; +02B3;MODIFIER LETTER SMALL R;Lm;0;L;<super> 0072;;;;N;;;;; +02B4;MODIFIER LETTER SMALL TURNED R;Lm;0;L;<super> 0279;;;;N;;;;; +02B5;MODIFIER LETTER SMALL TURNED R WITH HOOK;Lm;0;L;<super> 027B;;;;N;MODIFIER LETTER SMALL TURNED R HOOK;;;; +02B6;MODIFIER LETTER SMALL CAPITAL INVERTED R;Lm;0;L;<super> 0281;;;;N;;;;; +02B7;MODIFIER LETTER SMALL W;Lm;0;L;<super> 0077;;;;N;;;;; +02B8;MODIFIER LETTER SMALL Y;Lm;0;L;<super> 0079;;;;N;;;;; +02B9;MODIFIER LETTER PRIME;Lm;0;ON;;;;;N;;;;; +02BA;MODIFIER LETTER DOUBLE PRIME;Lm;0;ON;;;;;N;;;;; +02BB;MODIFIER LETTER TURNED COMMA;Lm;0;L;;;;;N;;;;; +02BC;MODIFIER LETTER APOSTROPHE;Lm;0;L;;;;;N;;;;; +02BD;MODIFIER LETTER REVERSED COMMA;Lm;0;L;;;;;N;;;;; +02BE;MODIFIER LETTER RIGHT HALF RING;Lm;0;L;;;;;N;;;;; +02BF;MODIFIER LETTER LEFT HALF RING;Lm;0;L;;;;;N;;;;; +02C0;MODIFIER LETTER GLOTTAL STOP;Lm;0;L;;;;;N;;;;; +02C1;MODIFIER LETTER REVERSED GLOTTAL STOP;Lm;0;L;;;;;N;;;;; +02C2;MODIFIER LETTER LEFT ARROWHEAD;Sk;0;ON;;;;;N;;;;; +02C3;MODIFIER LETTER RIGHT ARROWHEAD;Sk;0;ON;;;;;N;;;;; +02C4;MODIFIER LETTER UP ARROWHEAD;Sk;0;ON;;;;;N;;;;; +02C5;MODIFIER LETTER DOWN ARROWHEAD;Sk;0;ON;;;;;N;;;;; +02C6;MODIFIER LETTER CIRCUMFLEX ACCENT;Lm;0;ON;;;;;N;MODIFIER LETTER CIRCUMFLEX;;;; +02C7;CARON;Lm;0;ON;;;;;N;MODIFIER LETTER HACEK;;;; +02C8;MODIFIER LETTER VERTICAL LINE;Lm;0;ON;;;;;N;;;;; +02C9;MODIFIER LETTER MACRON;Lm;0;ON;;;;;N;;;;; +02CA;MODIFIER LETTER ACUTE ACCENT;Lm;0;ON;;;;;N;MODIFIER LETTER ACUTE;;;; +02CB;MODIFIER LETTER GRAVE ACCENT;Lm;0;ON;;;;;N;MODIFIER LETTER GRAVE;;;; +02CC;MODIFIER LETTER LOW VERTICAL LINE;Lm;0;ON;;;;;N;;;;; +02CD;MODIFIER LETTER LOW MACRON;Lm;0;ON;;;;;N;;;;; +02CE;MODIFIER LETTER LOW GRAVE ACCENT;Lm;0;ON;;;;;N;MODIFIER LETTER LOW GRAVE;;;; +02CF;MODIFIER LETTER LOW ACUTE ACCENT;Lm;0;ON;;;;;N;MODIFIER LETTER LOW ACUTE;;;; +02D0;MODIFIER LETTER TRIANGULAR COLON;Lm;0;L;;;;;N;;;;; +02D1;MODIFIER LETTER HALF TRIANGULAR COLON;Lm;0;L;;;;;N;;;;; +02D2;MODIFIER LETTER CENTRED RIGHT HALF RING;Sk;0;ON;;;;;N;MODIFIER LETTER CENTERED RIGHT HALF RING;;;; +02D3;MODIFIER LETTER CENTRED LEFT HALF RING;Sk;0;ON;;;;;N;MODIFIER LETTER CENTERED LEFT HALF RING;;;; +02D4;MODIFIER LETTER UP TACK;Sk;0;ON;;;;;N;;;;; +02D5;MODIFIER LETTER DOWN TACK;Sk;0;ON;;;;;N;;;;; +02D6;MODIFIER LETTER PLUS SIGN;Sk;0;ON;;;;;N;;;;; +02D7;MODIFIER LETTER MINUS SIGN;Sk;0;ON;;;;;N;;;;; +02D8;BREVE;Sk;0;ON;<compat> 0020 0306;;;;N;SPACING BREVE;;;; +02D9;DOT ABOVE;Sk;0;ON;<compat> 0020 0307;;;;N;SPACING DOT ABOVE;;;; +02DA;RING ABOVE;Sk;0;ON;<compat> 0020 030A;;;;N;SPACING RING ABOVE;;;; +02DB;OGONEK;Sk;0;ON;<compat> 0020 0328;;;;N;SPACING OGONEK;;;; +02DC;SMALL TILDE;Sk;0;ON;<compat> 0020 0303;;;;N;SPACING TILDE;;;; +02DD;DOUBLE ACUTE ACCENT;Sk;0;ON;<compat> 0020 030B;;;;N;SPACING DOUBLE ACUTE;;;; +02DE;MODIFIER LETTER RHOTIC HOOK;Sk;0;ON;;;;;N;;;;; +02DF;MODIFIER LETTER CROSS ACCENT;Sk;0;ON;;;;;N;;;;; +02E0;MODIFIER LETTER SMALL GAMMA;Lm;0;L;<super> 0263;;;;N;;;;; +02E1;MODIFIER LETTER SMALL L;Lm;0;L;<super> 006C;;;;N;;;;; +02E2;MODIFIER LETTER SMALL S;Lm;0;L;<super> 0073;;;;N;;;;; +02E3;MODIFIER LETTER SMALL X;Lm;0;L;<super> 0078;;;;N;;;;; +02E4;MODIFIER LETTER SMALL REVERSED GLOTTAL STOP;Lm;0;L;<super> 0295;;;;N;;;;; +02E5;MODIFIER LETTER EXTRA-HIGH TONE BAR;Sk;0;ON;;;;;N;;;;; +02E6;MODIFIER LETTER HIGH TONE BAR;Sk;0;ON;;;;;N;;;;; +02E7;MODIFIER LETTER MID TONE BAR;Sk;0;ON;;;;;N;;;;; +02E8;MODIFIER LETTER LOW TONE BAR;Sk;0;ON;;;;;N;;;;; +02E9;MODIFIER LETTER EXTRA-LOW TONE BAR;Sk;0;ON;;;;;N;;;;; +02EA;MODIFIER LETTER YIN DEPARTING TONE MARK;Sk;0;ON;;;;;N;;;;; +02EB;MODIFIER LETTER YANG DEPARTING TONE MARK;Sk;0;ON;;;;;N;;;;; +02EC;MODIFIER LETTER VOICING;Lm;0;ON;;;;;N;;;;; +02ED;MODIFIER LETTER UNASPIRATED;Sk;0;ON;;;;;N;;;;; +02EE;MODIFIER LETTER DOUBLE APOSTROPHE;Lm;0;L;;;;;N;;;;; +02EF;MODIFIER LETTER LOW DOWN ARROWHEAD;Sk;0;ON;;;;;N;;;;; +02F0;MODIFIER LETTER LOW UP ARROWHEAD;Sk;0;ON;;;;;N;;;;; +02F1;MODIFIER LETTER LOW LEFT ARROWHEAD;Sk;0;ON;;;;;N;;;;; +02F2;MODIFIER LETTER LOW RIGHT ARROWHEAD;Sk;0;ON;;;;;N;;;;; +02F3;MODIFIER LETTER LOW RING;Sk;0;ON;;;;;N;;;;; +02F4;MODIFIER LETTER MIDDLE GRAVE ACCENT;Sk;0;ON;;;;;N;;;;; +02F5;MODIFIER LETTER MIDDLE DOUBLE GRAVE ACCENT;Sk;0;ON;;;;;N;;;;; +02F6;MODIFIER LETTER MIDDLE DOUBLE ACUTE ACCENT;Sk;0;ON;;;;;N;;;;; +02F7;MODIFIER LETTER LOW TILDE;Sk;0;ON;;;;;N;;;;; +02F8;MODIFIER LETTER RAISED COLON;Sk;0;ON;;;;;N;;;;; +02F9;MODIFIER LETTER BEGIN HIGH TONE;Sk;0;ON;;;;;N;;;;; +02FA;MODIFIER LETTER END HIGH TONE;Sk;0;ON;;;;;N;;;;; +02FB;MODIFIER LETTER BEGIN LOW TONE;Sk;0;ON;;;;;N;;;;; +02FC;MODIFIER LETTER END LOW TONE;Sk;0;ON;;;;;N;;;;; +02FD;MODIFIER LETTER SHELF;Sk;0;ON;;;;;N;;;;; +02FE;MODIFIER LETTER OPEN SHELF;Sk;0;ON;;;;;N;;;;; +02FF;MODIFIER LETTER LOW LEFT ARROW;Sk;0;ON;;;;;N;;;;; +0300;COMBINING GRAVE ACCENT;Mn;230;NSM;;;;;N;NON-SPACING GRAVE;;;; +0301;COMBINING ACUTE ACCENT;Mn;230;NSM;;;;;N;NON-SPACING ACUTE;;;; +0302;COMBINING CIRCUMFLEX ACCENT;Mn;230;NSM;;;;;N;NON-SPACING CIRCUMFLEX;;;; +0303;COMBINING TILDE;Mn;230;NSM;;;;;N;NON-SPACING TILDE;;;; +0304;COMBINING MACRON;Mn;230;NSM;;;;;N;NON-SPACING MACRON;;;; +0305;COMBINING OVERLINE;Mn;230;NSM;;;;;N;NON-SPACING OVERSCORE;;;; +0306;COMBINING BREVE;Mn;230;NSM;;;;;N;NON-SPACING BREVE;;;; +0307;COMBINING DOT ABOVE;Mn;230;NSM;;;;;N;NON-SPACING DOT ABOVE;;;; +0308;COMBINING DIAERESIS;Mn;230;NSM;;;;;N;NON-SPACING DIAERESIS;;;; +0309;COMBINING HOOK ABOVE;Mn;230;NSM;;;;;N;NON-SPACING HOOK ABOVE;;;; +030A;COMBINING RING ABOVE;Mn;230;NSM;;;;;N;NON-SPACING RING ABOVE;;;; +030B;COMBINING DOUBLE ACUTE ACCENT;Mn;230;NSM;;;;;N;NON-SPACING DOUBLE ACUTE;;;; +030C;COMBINING CARON;Mn;230;NSM;;;;;N;NON-SPACING HACEK;;;; +030D;COMBINING VERTICAL LINE ABOVE;Mn;230;NSM;;;;;N;NON-SPACING VERTICAL LINE ABOVE;;;; +030E;COMBINING DOUBLE VERTICAL LINE ABOVE;Mn;230;NSM;;;;;N;NON-SPACING DOUBLE VERTICAL LINE ABOVE;;;; +030F;COMBINING DOUBLE GRAVE ACCENT;Mn;230;NSM;;;;;N;NON-SPACING DOUBLE GRAVE;;;; +0310;COMBINING CANDRABINDU;Mn;230;NSM;;;;;N;NON-SPACING CANDRABINDU;;;; +0311;COMBINING INVERTED BREVE;Mn;230;NSM;;;;;N;NON-SPACING INVERTED BREVE;;;; +0312;COMBINING TURNED COMMA ABOVE;Mn;230;NSM;;;;;N;NON-SPACING TURNED COMMA ABOVE;;;; +0313;COMBINING COMMA ABOVE;Mn;230;NSM;;;;;N;NON-SPACING COMMA ABOVE;;;; +0314;COMBINING REVERSED COMMA ABOVE;Mn;230;NSM;;;;;N;NON-SPACING REVERSED COMMA ABOVE;;;; +0315;COMBINING COMMA ABOVE RIGHT;Mn;232;NSM;;;;;N;NON-SPACING COMMA ABOVE RIGHT;;;; +0316;COMBINING GRAVE ACCENT BELOW;Mn;220;NSM;;;;;N;NON-SPACING GRAVE BELOW;;;; +0317;COMBINING ACUTE ACCENT BELOW;Mn;220;NSM;;;;;N;NON-SPACING ACUTE BELOW;;;; +0318;COMBINING LEFT TACK BELOW;Mn;220;NSM;;;;;N;NON-SPACING LEFT TACK BELOW;;;; +0319;COMBINING RIGHT TACK BELOW;Mn;220;NSM;;;;;N;NON-SPACING RIGHT TACK BELOW;;;; +031A;COMBINING LEFT ANGLE ABOVE;Mn;232;NSM;;;;;N;NON-SPACING LEFT ANGLE ABOVE;;;; +031B;COMBINING HORN;Mn;216;NSM;;;;;N;NON-SPACING HORN;;;; +031C;COMBINING LEFT HALF RING BELOW;Mn;220;NSM;;;;;N;NON-SPACING LEFT HALF RING BELOW;;;; +031D;COMBINING UP TACK BELOW;Mn;220;NSM;;;;;N;NON-SPACING UP TACK BELOW;;;; +031E;COMBINING DOWN TACK BELOW;Mn;220;NSM;;;;;N;NON-SPACING DOWN TACK BELOW;;;; +031F;COMBINING PLUS SIGN BELOW;Mn;220;NSM;;;;;N;NON-SPACING PLUS SIGN BELOW;;;; +0320;COMBINING MINUS SIGN BELOW;Mn;220;NSM;;;;;N;NON-SPACING MINUS SIGN BELOW;;;; +0321;COMBINING PALATALIZED HOOK BELOW;Mn;202;NSM;;;;;N;NON-SPACING PALATALIZED HOOK BELOW;;;; +0322;COMBINING RETROFLEX HOOK BELOW;Mn;202;NSM;;;;;N;NON-SPACING RETROFLEX HOOK BELOW;;;; +0323;COMBINING DOT BELOW;Mn;220;NSM;;;;;N;NON-SPACING DOT BELOW;;;; +0324;COMBINING DIAERESIS BELOW;Mn;220;NSM;;;;;N;NON-SPACING DOUBLE DOT BELOW;;;; +0325;COMBINING RING BELOW;Mn;220;NSM;;;;;N;NON-SPACING RING BELOW;;;; +0326;COMBINING COMMA BELOW;Mn;220;NSM;;;;;N;NON-SPACING COMMA BELOW;;;; +0327;COMBINING CEDILLA;Mn;202;NSM;;;;;N;NON-SPACING CEDILLA;;;; +0328;COMBINING OGONEK;Mn;202;NSM;;;;;N;NON-SPACING OGONEK;;;; +0329;COMBINING VERTICAL LINE BELOW;Mn;220;NSM;;;;;N;NON-SPACING VERTICAL LINE BELOW;;;; +032A;COMBINING BRIDGE BELOW;Mn;220;NSM;;;;;N;NON-SPACING BRIDGE BELOW;;;; +032B;COMBINING INVERTED DOUBLE ARCH BELOW;Mn;220;NSM;;;;;N;NON-SPACING INVERTED DOUBLE ARCH BELOW;;;; +032C;COMBINING CARON BELOW;Mn;220;NSM;;;;;N;NON-SPACING HACEK BELOW;;;; +032D;COMBINING CIRCUMFLEX ACCENT BELOW;Mn;220;NSM;;;;;N;NON-SPACING CIRCUMFLEX BELOW;;;; +032E;COMBINING BREVE BELOW;Mn;220;NSM;;;;;N;NON-SPACING BREVE BELOW;;;; +032F;COMBINING INVERTED BREVE BELOW;Mn;220;NSM;;;;;N;NON-SPACING INVERTED BREVE BELOW;;;; +0330;COMBINING TILDE BELOW;Mn;220;NSM;;;;;N;NON-SPACING TILDE BELOW;;;; +0331;COMBINING MACRON BELOW;Mn;220;NSM;;;;;N;NON-SPACING MACRON BELOW;;;; +0332;COMBINING LOW LINE;Mn;220;NSM;;;;;N;NON-SPACING UNDERSCORE;;;; +0333;COMBINING DOUBLE LOW LINE;Mn;220;NSM;;;;;N;NON-SPACING DOUBLE UNDERSCORE;;;; +0334;COMBINING TILDE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING TILDE OVERLAY;;;; +0335;COMBINING SHORT STROKE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING SHORT BAR OVERLAY;;;; +0336;COMBINING LONG STROKE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING LONG BAR OVERLAY;;;; +0337;COMBINING SHORT SOLIDUS OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING SHORT SLASH OVERLAY;;;; +0338;COMBINING LONG SOLIDUS OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING LONG SLASH OVERLAY;;;; +0339;COMBINING RIGHT HALF RING BELOW;Mn;220;NSM;;;;;N;NON-SPACING RIGHT HALF RING BELOW;;;; +033A;COMBINING INVERTED BRIDGE BELOW;Mn;220;NSM;;;;;N;NON-SPACING INVERTED BRIDGE BELOW;;;; +033B;COMBINING SQUARE BELOW;Mn;220;NSM;;;;;N;NON-SPACING SQUARE BELOW;;;; +033C;COMBINING SEAGULL BELOW;Mn;220;NSM;;;;;N;NON-SPACING SEAGULL BELOW;;;; +033D;COMBINING X ABOVE;Mn;230;NSM;;;;;N;NON-SPACING X ABOVE;;;; +033E;COMBINING VERTICAL TILDE;Mn;230;NSM;;;;;N;NON-SPACING VERTICAL TILDE;;;; +033F;COMBINING DOUBLE OVERLINE;Mn;230;NSM;;;;;N;NON-SPACING DOUBLE OVERSCORE;;;; +0340;COMBINING GRAVE TONE MARK;Mn;230;NSM;0300;;;;N;NON-SPACING GRAVE TONE MARK;;;; +0341;COMBINING ACUTE TONE MARK;Mn;230;NSM;0301;;;;N;NON-SPACING ACUTE TONE MARK;;;; +0342;COMBINING GREEK PERISPOMENI;Mn;230;NSM;;;;;N;;;;; +0343;COMBINING GREEK KORONIS;Mn;230;NSM;0313;;;;N;;;;; +0344;COMBINING GREEK DIALYTIKA TONOS;Mn;230;NSM;0308 0301;;;;N;GREEK NON-SPACING DIAERESIS TONOS;;;; +0345;COMBINING GREEK YPOGEGRAMMENI;Mn;240;NSM;;;;;N;GREEK NON-SPACING IOTA BELOW;;0399;;0399 +0346;COMBINING BRIDGE ABOVE;Mn;230;NSM;;;;;N;;;;; +0347;COMBINING EQUALS SIGN BELOW;Mn;220;NSM;;;;;N;;;;; +0348;COMBINING DOUBLE VERTICAL LINE BELOW;Mn;220;NSM;;;;;N;;;;; +0349;COMBINING LEFT ANGLE BELOW;Mn;220;NSM;;;;;N;;;;; +034A;COMBINING NOT TILDE ABOVE;Mn;230;NSM;;;;;N;;;;; +034B;COMBINING HOMOTHETIC ABOVE;Mn;230;NSM;;;;;N;;;;; +034C;COMBINING ALMOST EQUAL TO ABOVE;Mn;230;NSM;;;;;N;;;;; +034D;COMBINING LEFT RIGHT ARROW BELOW;Mn;220;NSM;;;;;N;;;;; +034E;COMBINING UPWARDS ARROW BELOW;Mn;220;NSM;;;;;N;;;;; +034F;COMBINING GRAPHEME JOINER;Mn;0;NSM;;;;;N;;;;; +0350;COMBINING RIGHT ARROWHEAD ABOVE;Mn;230;NSM;;;;;N;;;;; +0351;COMBINING LEFT HALF RING ABOVE;Mn;230;NSM;;;;;N;;;;; +0352;COMBINING FERMATA;Mn;230;NSM;;;;;N;;;;; +0353;COMBINING X BELOW;Mn;220;NSM;;;;;N;;;;; +0354;COMBINING LEFT ARROWHEAD BELOW;Mn;220;NSM;;;;;N;;;;; +0355;COMBINING RIGHT ARROWHEAD BELOW;Mn;220;NSM;;;;;N;;;;; +0356;COMBINING RIGHT ARROWHEAD AND UP ARROWHEAD BELOW;Mn;220;NSM;;;;;N;;;;; +0357;COMBINING RIGHT HALF RING ABOVE;Mn;230;NSM;;;;;N;;;;; +0358;COMBINING DOT ABOVE RIGHT;Mn;232;NSM;;;;;N;;;;; +0359;COMBINING ASTERISK BELOW;Mn;220;NSM;;;;;N;;;;; +035A;COMBINING DOUBLE RING BELOW;Mn;220;NSM;;;;;N;;;;; +035B;COMBINING ZIGZAG ABOVE;Mn;230;NSM;;;;;N;;;;; +035C;COMBINING DOUBLE BREVE BELOW;Mn;233;NSM;;;;;N;;;;; +035D;COMBINING DOUBLE BREVE;Mn;234;NSM;;;;;N;;;;; +035E;COMBINING DOUBLE MACRON;Mn;234;NSM;;;;;N;;;;; +035F;COMBINING DOUBLE MACRON BELOW;Mn;233;NSM;;;;;N;;;;; +0360;COMBINING DOUBLE TILDE;Mn;234;NSM;;;;;N;;;;; +0361;COMBINING DOUBLE INVERTED BREVE;Mn;234;NSM;;;;;N;;;;; +0362;COMBINING DOUBLE RIGHTWARDS ARROW BELOW;Mn;233;NSM;;;;;N;;;;; +0363;COMBINING LATIN SMALL LETTER A;Mn;230;NSM;;;;;N;;;;; +0364;COMBINING LATIN SMALL LETTER E;Mn;230;NSM;;;;;N;;;;; +0365;COMBINING LATIN SMALL LETTER I;Mn;230;NSM;;;;;N;;;;; +0366;COMBINING LATIN SMALL LETTER O;Mn;230;NSM;;;;;N;;;;; +0367;COMBINING LATIN SMALL LETTER U;Mn;230;NSM;;;;;N;;;;; +0368;COMBINING LATIN SMALL LETTER C;Mn;230;NSM;;;;;N;;;;; +0369;COMBINING LATIN SMALL LETTER D;Mn;230;NSM;;;;;N;;;;; +036A;COMBINING LATIN SMALL LETTER H;Mn;230;NSM;;;;;N;;;;; +036B;COMBINING LATIN SMALL LETTER M;Mn;230;NSM;;;;;N;;;;; +036C;COMBINING LATIN SMALL LETTER R;Mn;230;NSM;;;;;N;;;;; +036D;COMBINING LATIN SMALL LETTER T;Mn;230;NSM;;;;;N;;;;; +036E;COMBINING LATIN SMALL LETTER V;Mn;230;NSM;;;;;N;;;;; +036F;COMBINING LATIN SMALL LETTER X;Mn;230;NSM;;;;;N;;;;; +0370;GREEK CAPITAL LETTER HETA;Lu;0;L;;;;;N;;;;0371; +0371;GREEK SMALL LETTER HETA;Ll;0;L;;;;;N;;;0370;;0370 +0372;GREEK CAPITAL LETTER ARCHAIC SAMPI;Lu;0;L;;;;;N;;;;0373; +0373;GREEK SMALL LETTER ARCHAIC SAMPI;Ll;0;L;;;;;N;;;0372;;0372 +0374;GREEK NUMERAL SIGN;Lm;0;ON;02B9;;;;N;GREEK UPPER NUMERAL SIGN;;;; +0375;GREEK LOWER NUMERAL SIGN;Sk;0;ON;;;;;N;;;;; +0376;GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA;Lu;0;L;;;;;N;;;;0377; +0377;GREEK SMALL LETTER PAMPHYLIAN DIGAMMA;Ll;0;L;;;;;N;;;0376;;0376 +037A;GREEK YPOGEGRAMMENI;Lm;0;L;<compat> 0020 0345;;;;N;GREEK SPACING IOTA BELOW;;;; +037B;GREEK SMALL REVERSED LUNATE SIGMA SYMBOL;Ll;0;L;;;;;N;;;03FD;;03FD +037C;GREEK SMALL DOTTED LUNATE SIGMA SYMBOL;Ll;0;L;;;;;N;;;03FE;;03FE +037D;GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL;Ll;0;L;;;;;N;;;03FF;;03FF +037E;GREEK QUESTION MARK;Po;0;ON;003B;;;;N;;;;; +037F;GREEK CAPITAL LETTER YOT;Lu;0;L;;;;;N;;;;03F3; +0384;GREEK TONOS;Sk;0;ON;<compat> 0020 0301;;;;N;GREEK SPACING TONOS;;;; +0385;GREEK DIALYTIKA TONOS;Sk;0;ON;00A8 0301;;;;N;GREEK SPACING DIAERESIS TONOS;;;; +0386;GREEK CAPITAL LETTER ALPHA WITH TONOS;Lu;0;L;0391 0301;;;;N;GREEK CAPITAL LETTER ALPHA TONOS;;;03AC; +0387;GREEK ANO TELEIA;Po;0;ON;00B7;;;;N;;;;; +0388;GREEK CAPITAL LETTER EPSILON WITH TONOS;Lu;0;L;0395 0301;;;;N;GREEK CAPITAL LETTER EPSILON TONOS;;;03AD; +0389;GREEK CAPITAL LETTER ETA WITH TONOS;Lu;0;L;0397 0301;;;;N;GREEK CAPITAL LETTER ETA TONOS;;;03AE; +038A;GREEK CAPITAL LETTER IOTA WITH TONOS;Lu;0;L;0399 0301;;;;N;GREEK CAPITAL LETTER IOTA TONOS;;;03AF; +038C;GREEK CAPITAL LETTER OMICRON WITH TONOS;Lu;0;L;039F 0301;;;;N;GREEK CAPITAL LETTER OMICRON TONOS;;;03CC; +038E;GREEK CAPITAL LETTER UPSILON WITH TONOS;Lu;0;L;03A5 0301;;;;N;GREEK CAPITAL LETTER UPSILON TONOS;;;03CD; +038F;GREEK CAPITAL LETTER OMEGA WITH TONOS;Lu;0;L;03A9 0301;;;;N;GREEK CAPITAL LETTER OMEGA TONOS;;;03CE; +0390;GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS;Ll;0;L;03CA 0301;;;;N;GREEK SMALL LETTER IOTA DIAERESIS TONOS;;;; +0391;GREEK CAPITAL LETTER ALPHA;Lu;0;L;;;;;N;;;;03B1; +0392;GREEK CAPITAL LETTER BETA;Lu;0;L;;;;;N;;;;03B2; +0393;GREEK CAPITAL LETTER GAMMA;Lu;0;L;;;;;N;;;;03B3; +0394;GREEK CAPITAL LETTER DELTA;Lu;0;L;;;;;N;;;;03B4; +0395;GREEK CAPITAL LETTER EPSILON;Lu;0;L;;;;;N;;;;03B5; +0396;GREEK CAPITAL LETTER ZETA;Lu;0;L;;;;;N;;;;03B6; +0397;GREEK CAPITAL LETTER ETA;Lu;0;L;;;;;N;;;;03B7; +0398;GREEK CAPITAL LETTER THETA;Lu;0;L;;;;;N;;;;03B8; +0399;GREEK CAPITAL LETTER IOTA;Lu;0;L;;;;;N;;;;03B9; +039A;GREEK CAPITAL LETTER KAPPA;Lu;0;L;;;;;N;;;;03BA; +039B;GREEK CAPITAL LETTER LAMDA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER LAMBDA;;;03BB; +039C;GREEK CAPITAL LETTER MU;Lu;0;L;;;;;N;;;;03BC; +039D;GREEK CAPITAL LETTER NU;Lu;0;L;;;;;N;;;;03BD; +039E;GREEK CAPITAL LETTER XI;Lu;0;L;;;;;N;;;;03BE; +039F;GREEK CAPITAL LETTER OMICRON;Lu;0;L;;;;;N;;;;03BF; +03A0;GREEK CAPITAL LETTER PI;Lu;0;L;;;;;N;;;;03C0; +03A1;GREEK CAPITAL LETTER RHO;Lu;0;L;;;;;N;;;;03C1; +03A3;GREEK CAPITAL LETTER SIGMA;Lu;0;L;;;;;N;;;;03C3; +03A4;GREEK CAPITAL LETTER TAU;Lu;0;L;;;;;N;;;;03C4; +03A5;GREEK CAPITAL LETTER UPSILON;Lu;0;L;;;;;N;;;;03C5; +03A6;GREEK CAPITAL LETTER PHI;Lu;0;L;;;;;N;;;;03C6; +03A7;GREEK CAPITAL LETTER CHI;Lu;0;L;;;;;N;;;;03C7; +03A8;GREEK CAPITAL LETTER PSI;Lu;0;L;;;;;N;;;;03C8; +03A9;GREEK CAPITAL LETTER OMEGA;Lu;0;L;;;;;N;;;;03C9; +03AA;GREEK CAPITAL LETTER IOTA WITH DIALYTIKA;Lu;0;L;0399 0308;;;;N;GREEK CAPITAL LETTER IOTA DIAERESIS;;;03CA; +03AB;GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA;Lu;0;L;03A5 0308;;;;N;GREEK CAPITAL LETTER UPSILON DIAERESIS;;;03CB; +03AC;GREEK SMALL LETTER ALPHA WITH TONOS;Ll;0;L;03B1 0301;;;;N;GREEK SMALL LETTER ALPHA TONOS;;0386;;0386 +03AD;GREEK SMALL LETTER EPSILON WITH TONOS;Ll;0;L;03B5 0301;;;;N;GREEK SMALL LETTER EPSILON TONOS;;0388;;0388 +03AE;GREEK SMALL LETTER ETA WITH TONOS;Ll;0;L;03B7 0301;;;;N;GREEK SMALL LETTER ETA TONOS;;0389;;0389 +03AF;GREEK SMALL LETTER IOTA WITH TONOS;Ll;0;L;03B9 0301;;;;N;GREEK SMALL LETTER IOTA TONOS;;038A;;038A +03B0;GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS;Ll;0;L;03CB 0301;;;;N;GREEK SMALL LETTER UPSILON DIAERESIS TONOS;;;; +03B1;GREEK SMALL LETTER ALPHA;Ll;0;L;;;;;N;;;0391;;0391 +03B2;GREEK SMALL LETTER BETA;Ll;0;L;;;;;N;;;0392;;0392 +03B3;GREEK SMALL LETTER GAMMA;Ll;0;L;;;;;N;;;0393;;0393 +03B4;GREEK SMALL LETTER DELTA;Ll;0;L;;;;;N;;;0394;;0394 +03B5;GREEK SMALL LETTER EPSILON;Ll;0;L;;;;;N;;;0395;;0395 +03B6;GREEK SMALL LETTER ZETA;Ll;0;L;;;;;N;;;0396;;0396 +03B7;GREEK SMALL LETTER ETA;Ll;0;L;;;;;N;;;0397;;0397 +03B8;GREEK SMALL LETTER THETA;Ll;0;L;;;;;N;;;0398;;0398 +03B9;GREEK SMALL LETTER IOTA;Ll;0;L;;;;;N;;;0399;;0399 +03BA;GREEK SMALL LETTER KAPPA;Ll;0;L;;;;;N;;;039A;;039A +03BB;GREEK SMALL LETTER LAMDA;Ll;0;L;;;;;N;GREEK SMALL LETTER LAMBDA;;039B;;039B +03BC;GREEK SMALL LETTER MU;Ll;0;L;;;;;N;;;039C;;039C +03BD;GREEK SMALL LETTER NU;Ll;0;L;;;;;N;;;039D;;039D +03BE;GREEK SMALL LETTER XI;Ll;0;L;;;;;N;;;039E;;039E +03BF;GREEK SMALL LETTER OMICRON;Ll;0;L;;;;;N;;;039F;;039F +03C0;GREEK SMALL LETTER PI;Ll;0;L;;;;;N;;;03A0;;03A0 +03C1;GREEK SMALL LETTER RHO;Ll;0;L;;;;;N;;;03A1;;03A1 +03C2;GREEK SMALL LETTER FINAL SIGMA;Ll;0;L;;;;;N;;;03A3;;03A3 +03C3;GREEK SMALL LETTER SIGMA;Ll;0;L;;;;;N;;;03A3;;03A3 +03C4;GREEK SMALL LETTER TAU;Ll;0;L;;;;;N;;;03A4;;03A4 +03C5;GREEK SMALL LETTER UPSILON;Ll;0;L;;;;;N;;;03A5;;03A5 +03C6;GREEK SMALL LETTER PHI;Ll;0;L;;;;;N;;;03A6;;03A6 +03C7;GREEK SMALL LETTER CHI;Ll;0;L;;;;;N;;;03A7;;03A7 +03C8;GREEK SMALL LETTER PSI;Ll;0;L;;;;;N;;;03A8;;03A8 +03C9;GREEK SMALL LETTER OMEGA;Ll;0;L;;;;;N;;;03A9;;03A9 +03CA;GREEK SMALL LETTER IOTA WITH DIALYTIKA;Ll;0;L;03B9 0308;;;;N;GREEK SMALL LETTER IOTA DIAERESIS;;03AA;;03AA +03CB;GREEK SMALL LETTER UPSILON WITH DIALYTIKA;Ll;0;L;03C5 0308;;;;N;GREEK SMALL LETTER UPSILON DIAERESIS;;03AB;;03AB +03CC;GREEK SMALL LETTER OMICRON WITH TONOS;Ll;0;L;03BF 0301;;;;N;GREEK SMALL LETTER OMICRON TONOS;;038C;;038C +03CD;GREEK SMALL LETTER UPSILON WITH TONOS;Ll;0;L;03C5 0301;;;;N;GREEK SMALL LETTER UPSILON TONOS;;038E;;038E +03CE;GREEK SMALL LETTER OMEGA WITH TONOS;Ll;0;L;03C9 0301;;;;N;GREEK SMALL LETTER OMEGA TONOS;;038F;;038F +03CF;GREEK CAPITAL KAI SYMBOL;Lu;0;L;;;;;N;;;;03D7; +03D0;GREEK BETA SYMBOL;Ll;0;L;<compat> 03B2;;;;N;GREEK SMALL LETTER CURLED BETA;;0392;;0392 +03D1;GREEK THETA SYMBOL;Ll;0;L;<compat> 03B8;;;;N;GREEK SMALL LETTER SCRIPT THETA;;0398;;0398 +03D2;GREEK UPSILON WITH HOOK SYMBOL;Lu;0;L;<compat> 03A5;;;;N;GREEK CAPITAL LETTER UPSILON HOOK;;;; +03D3;GREEK UPSILON WITH ACUTE AND HOOK SYMBOL;Lu;0;L;03D2 0301;;;;N;GREEK CAPITAL LETTER UPSILON HOOK TONOS;;;; +03D4;GREEK UPSILON WITH DIAERESIS AND HOOK SYMBOL;Lu;0;L;03D2 0308;;;;N;GREEK CAPITAL LETTER UPSILON HOOK DIAERESIS;;;; +03D5;GREEK PHI SYMBOL;Ll;0;L;<compat> 03C6;;;;N;GREEK SMALL LETTER SCRIPT PHI;;03A6;;03A6 +03D6;GREEK PI SYMBOL;Ll;0;L;<compat> 03C0;;;;N;GREEK SMALL LETTER OMEGA PI;;03A0;;03A0 +03D7;GREEK KAI SYMBOL;Ll;0;L;;;;;N;;;03CF;;03CF +03D8;GREEK LETTER ARCHAIC KOPPA;Lu;0;L;;;;;N;;;;03D9; +03D9;GREEK SMALL LETTER ARCHAIC KOPPA;Ll;0;L;;;;;N;;;03D8;;03D8 +03DA;GREEK LETTER STIGMA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER STIGMA;;;03DB; +03DB;GREEK SMALL LETTER STIGMA;Ll;0;L;;;;;N;;;03DA;;03DA +03DC;GREEK LETTER DIGAMMA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER DIGAMMA;;;03DD; +03DD;GREEK SMALL LETTER DIGAMMA;Ll;0;L;;;;;N;;;03DC;;03DC +03DE;GREEK LETTER KOPPA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER KOPPA;;;03DF; +03DF;GREEK SMALL LETTER KOPPA;Ll;0;L;;;;;N;;;03DE;;03DE +03E0;GREEK LETTER SAMPI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER SAMPI;;;03E1; +03E1;GREEK SMALL LETTER SAMPI;Ll;0;L;;;;;N;;;03E0;;03E0 +03E2;COPTIC CAPITAL LETTER SHEI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER SHEI;;;03E3; +03E3;COPTIC SMALL LETTER SHEI;Ll;0;L;;;;;N;GREEK SMALL LETTER SHEI;;03E2;;03E2 +03E4;COPTIC CAPITAL LETTER FEI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER FEI;;;03E5; +03E5;COPTIC SMALL LETTER FEI;Ll;0;L;;;;;N;GREEK SMALL LETTER FEI;;03E4;;03E4 +03E6;COPTIC CAPITAL LETTER KHEI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER KHEI;;;03E7; +03E7;COPTIC SMALL LETTER KHEI;Ll;0;L;;;;;N;GREEK SMALL LETTER KHEI;;03E6;;03E6 +03E8;COPTIC CAPITAL LETTER HORI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER HORI;;;03E9; +03E9;COPTIC SMALL LETTER HORI;Ll;0;L;;;;;N;GREEK SMALL LETTER HORI;;03E8;;03E8 +03EA;COPTIC CAPITAL LETTER GANGIA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER GANGIA;;;03EB; +03EB;COPTIC SMALL LETTER GANGIA;Ll;0;L;;;;;N;GREEK SMALL LETTER GANGIA;;03EA;;03EA +03EC;COPTIC CAPITAL LETTER SHIMA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER SHIMA;;;03ED; +03ED;COPTIC SMALL LETTER SHIMA;Ll;0;L;;;;;N;GREEK SMALL LETTER SHIMA;;03EC;;03EC +03EE;COPTIC CAPITAL LETTER DEI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER DEI;;;03EF; +03EF;COPTIC SMALL LETTER DEI;Ll;0;L;;;;;N;GREEK SMALL LETTER DEI;;03EE;;03EE +03F0;GREEK KAPPA SYMBOL;Ll;0;L;<compat> 03BA;;;;N;GREEK SMALL LETTER SCRIPT KAPPA;;039A;;039A +03F1;GREEK RHO SYMBOL;Ll;0;L;<compat> 03C1;;;;N;GREEK SMALL LETTER TAILED RHO;;03A1;;03A1 +03F2;GREEK LUNATE SIGMA SYMBOL;Ll;0;L;<compat> 03C2;;;;N;GREEK SMALL LETTER LUNATE SIGMA;;03F9;;03F9 +03F3;GREEK LETTER YOT;Ll;0;L;;;;;N;;;037F;;037F +03F4;GREEK CAPITAL THETA SYMBOL;Lu;0;L;<compat> 0398;;;;N;;;;03B8; +03F5;GREEK LUNATE EPSILON SYMBOL;Ll;0;L;<compat> 03B5;;;;N;;;0395;;0395 +03F6;GREEK REVERSED LUNATE EPSILON SYMBOL;Sm;0;ON;;;;;N;;;;; +03F7;GREEK CAPITAL LETTER SHO;Lu;0;L;;;;;N;;;;03F8; +03F8;GREEK SMALL LETTER SHO;Ll;0;L;;;;;N;;;03F7;;03F7 +03F9;GREEK CAPITAL LUNATE SIGMA SYMBOL;Lu;0;L;<compat> 03A3;;;;N;;;;03F2; +03FA;GREEK CAPITAL LETTER SAN;Lu;0;L;;;;;N;;;;03FB; +03FB;GREEK SMALL LETTER SAN;Ll;0;L;;;;;N;;;03FA;;03FA +03FC;GREEK RHO WITH STROKE SYMBOL;Ll;0;L;;;;;N;;;;; +03FD;GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL;Lu;0;L;;;;;N;;;;037B; +03FE;GREEK CAPITAL DOTTED LUNATE SIGMA SYMBOL;Lu;0;L;;;;;N;;;;037C; +03FF;GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL;Lu;0;L;;;;;N;;;;037D; +0400;CYRILLIC CAPITAL LETTER IE WITH GRAVE;Lu;0;L;0415 0300;;;;N;;;;0450; +0401;CYRILLIC CAPITAL LETTER IO;Lu;0;L;0415 0308;;;;N;;;;0451; +0402;CYRILLIC CAPITAL LETTER DJE;Lu;0;L;;;;;N;;;;0452; +0403;CYRILLIC CAPITAL LETTER GJE;Lu;0;L;0413 0301;;;;N;;;;0453; +0404;CYRILLIC CAPITAL LETTER UKRAINIAN IE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER E;;;0454; +0405;CYRILLIC CAPITAL LETTER DZE;Lu;0;L;;;;;N;;;;0455; +0406;CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER I;;;0456; +0407;CYRILLIC CAPITAL LETTER YI;Lu;0;L;0406 0308;;;;N;;;;0457; +0408;CYRILLIC CAPITAL LETTER JE;Lu;0;L;;;;;N;;;;0458; +0409;CYRILLIC CAPITAL LETTER LJE;Lu;0;L;;;;;N;;;;0459; +040A;CYRILLIC CAPITAL LETTER NJE;Lu;0;L;;;;;N;;;;045A; +040B;CYRILLIC CAPITAL LETTER TSHE;Lu;0;L;;;;;N;;;;045B; +040C;CYRILLIC CAPITAL LETTER KJE;Lu;0;L;041A 0301;;;;N;;;;045C; +040D;CYRILLIC CAPITAL LETTER I WITH GRAVE;Lu;0;L;0418 0300;;;;N;;;;045D; +040E;CYRILLIC CAPITAL LETTER SHORT U;Lu;0;L;0423 0306;;;;N;;;;045E; +040F;CYRILLIC CAPITAL LETTER DZHE;Lu;0;L;;;;;N;;;;045F; +0410;CYRILLIC CAPITAL LETTER A;Lu;0;L;;;;;N;;;;0430; +0411;CYRILLIC CAPITAL LETTER BE;Lu;0;L;;;;;N;;;;0431; +0412;CYRILLIC CAPITAL LETTER VE;Lu;0;L;;;;;N;;;;0432; +0413;CYRILLIC CAPITAL LETTER GHE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER GE;;;0433; +0414;CYRILLIC CAPITAL LETTER DE;Lu;0;L;;;;;N;;;;0434; +0415;CYRILLIC CAPITAL LETTER IE;Lu;0;L;;;;;N;;;;0435; +0416;CYRILLIC CAPITAL LETTER ZHE;Lu;0;L;;;;;N;;;;0436; +0417;CYRILLIC CAPITAL LETTER ZE;Lu;0;L;;;;;N;;;;0437; +0418;CYRILLIC CAPITAL LETTER I;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER II;;;0438; +0419;CYRILLIC CAPITAL LETTER SHORT I;Lu;0;L;0418 0306;;;;N;CYRILLIC CAPITAL LETTER SHORT II;;;0439; +041A;CYRILLIC CAPITAL LETTER KA;Lu;0;L;;;;;N;;;;043A; +041B;CYRILLIC CAPITAL LETTER EL;Lu;0;L;;;;;N;;;;043B; +041C;CYRILLIC CAPITAL LETTER EM;Lu;0;L;;;;;N;;;;043C; +041D;CYRILLIC CAPITAL LETTER EN;Lu;0;L;;;;;N;;;;043D; +041E;CYRILLIC CAPITAL LETTER O;Lu;0;L;;;;;N;;;;043E; +041F;CYRILLIC CAPITAL LETTER PE;Lu;0;L;;;;;N;;;;043F; +0420;CYRILLIC CAPITAL LETTER ER;Lu;0;L;;;;;N;;;;0440; +0421;CYRILLIC CAPITAL LETTER ES;Lu;0;L;;;;;N;;;;0441; +0422;CYRILLIC CAPITAL LETTER TE;Lu;0;L;;;;;N;;;;0442; +0423;CYRILLIC CAPITAL LETTER U;Lu;0;L;;;;;N;;;;0443; +0424;CYRILLIC CAPITAL LETTER EF;Lu;0;L;;;;;N;;;;0444; +0425;CYRILLIC CAPITAL LETTER HA;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KHA;;;0445; +0426;CYRILLIC CAPITAL LETTER TSE;Lu;0;L;;;;;N;;;;0446; +0427;CYRILLIC CAPITAL LETTER CHE;Lu;0;L;;;;;N;;;;0447; +0428;CYRILLIC CAPITAL LETTER SHA;Lu;0;L;;;;;N;;;;0448; +0429;CYRILLIC CAPITAL LETTER SHCHA;Lu;0;L;;;;;N;;;;0449; +042A;CYRILLIC CAPITAL LETTER HARD SIGN;Lu;0;L;;;;;N;;;;044A; +042B;CYRILLIC CAPITAL LETTER YERU;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER YERI;;;044B; +042C;CYRILLIC CAPITAL LETTER SOFT SIGN;Lu;0;L;;;;;N;;;;044C; +042D;CYRILLIC CAPITAL LETTER E;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER REVERSED E;;;044D; +042E;CYRILLIC CAPITAL LETTER YU;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER IU;;;044E; +042F;CYRILLIC CAPITAL LETTER YA;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER IA;;;044F; +0430;CYRILLIC SMALL LETTER A;Ll;0;L;;;;;N;;;0410;;0410 +0431;CYRILLIC SMALL LETTER BE;Ll;0;L;;;;;N;;;0411;;0411 +0432;CYRILLIC SMALL LETTER VE;Ll;0;L;;;;;N;;;0412;;0412 +0433;CYRILLIC SMALL LETTER GHE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER GE;;0413;;0413 +0434;CYRILLIC SMALL LETTER DE;Ll;0;L;;;;;N;;;0414;;0414 +0435;CYRILLIC SMALL LETTER IE;Ll;0;L;;;;;N;;;0415;;0415 +0436;CYRILLIC SMALL LETTER ZHE;Ll;0;L;;;;;N;;;0416;;0416 +0437;CYRILLIC SMALL LETTER ZE;Ll;0;L;;;;;N;;;0417;;0417 +0438;CYRILLIC SMALL LETTER I;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER II;;0418;;0418 +0439;CYRILLIC SMALL LETTER SHORT I;Ll;0;L;0438 0306;;;;N;CYRILLIC SMALL LETTER SHORT II;;0419;;0419 +043A;CYRILLIC SMALL LETTER KA;Ll;0;L;;;;;N;;;041A;;041A +043B;CYRILLIC SMALL LETTER EL;Ll;0;L;;;;;N;;;041B;;041B +043C;CYRILLIC SMALL LETTER EM;Ll;0;L;;;;;N;;;041C;;041C +043D;CYRILLIC SMALL LETTER EN;Ll;0;L;;;;;N;;;041D;;041D +043E;CYRILLIC SMALL LETTER O;Ll;0;L;;;;;N;;;041E;;041E +043F;CYRILLIC SMALL LETTER PE;Ll;0;L;;;;;N;;;041F;;041F +0440;CYRILLIC SMALL LETTER ER;Ll;0;L;;;;;N;;;0420;;0420 +0441;CYRILLIC SMALL LETTER ES;Ll;0;L;;;;;N;;;0421;;0421 +0442;CYRILLIC SMALL LETTER TE;Ll;0;L;;;;;N;;;0422;;0422 +0443;CYRILLIC SMALL LETTER U;Ll;0;L;;;;;N;;;0423;;0423 +0444;CYRILLIC SMALL LETTER EF;Ll;0;L;;;;;N;;;0424;;0424 +0445;CYRILLIC SMALL LETTER HA;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KHA;;0425;;0425 +0446;CYRILLIC SMALL LETTER TSE;Ll;0;L;;;;;N;;;0426;;0426 +0447;CYRILLIC SMALL LETTER CHE;Ll;0;L;;;;;N;;;0427;;0427 +0448;CYRILLIC SMALL LETTER SHA;Ll;0;L;;;;;N;;;0428;;0428 +0449;CYRILLIC SMALL LETTER SHCHA;Ll;0;L;;;;;N;;;0429;;0429 +044A;CYRILLIC SMALL LETTER HARD SIGN;Ll;0;L;;;;;N;;;042A;;042A +044B;CYRILLIC SMALL LETTER YERU;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER YERI;;042B;;042B +044C;CYRILLIC SMALL LETTER SOFT SIGN;Ll;0;L;;;;;N;;;042C;;042C +044D;CYRILLIC SMALL LETTER E;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER REVERSED E;;042D;;042D +044E;CYRILLIC SMALL LETTER YU;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER IU;;042E;;042E +044F;CYRILLIC SMALL LETTER YA;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER IA;;042F;;042F +0450;CYRILLIC SMALL LETTER IE WITH GRAVE;Ll;0;L;0435 0300;;;;N;;;0400;;0400 +0451;CYRILLIC SMALL LETTER IO;Ll;0;L;0435 0308;;;;N;;;0401;;0401 +0452;CYRILLIC SMALL LETTER DJE;Ll;0;L;;;;;N;;;0402;;0402 +0453;CYRILLIC SMALL LETTER GJE;Ll;0;L;0433 0301;;;;N;;;0403;;0403 +0454;CYRILLIC SMALL LETTER UKRAINIAN IE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER E;;0404;;0404 +0455;CYRILLIC SMALL LETTER DZE;Ll;0;L;;;;;N;;;0405;;0405 +0456;CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER I;;0406;;0406 +0457;CYRILLIC SMALL LETTER YI;Ll;0;L;0456 0308;;;;N;;;0407;;0407 +0458;CYRILLIC SMALL LETTER JE;Ll;0;L;;;;;N;;;0408;;0408 +0459;CYRILLIC SMALL LETTER LJE;Ll;0;L;;;;;N;;;0409;;0409 +045A;CYRILLIC SMALL LETTER NJE;Ll;0;L;;;;;N;;;040A;;040A +045B;CYRILLIC SMALL LETTER TSHE;Ll;0;L;;;;;N;;;040B;;040B +045C;CYRILLIC SMALL LETTER KJE;Ll;0;L;043A 0301;;;;N;;;040C;;040C +045D;CYRILLIC SMALL LETTER I WITH GRAVE;Ll;0;L;0438 0300;;;;N;;;040D;;040D +045E;CYRILLIC SMALL LETTER SHORT U;Ll;0;L;0443 0306;;;;N;;;040E;;040E +045F;CYRILLIC SMALL LETTER DZHE;Ll;0;L;;;;;N;;;040F;;040F +0460;CYRILLIC CAPITAL LETTER OMEGA;Lu;0;L;;;;;N;;;;0461; +0461;CYRILLIC SMALL LETTER OMEGA;Ll;0;L;;;;;N;;;0460;;0460 +0462;CYRILLIC CAPITAL LETTER YAT;Lu;0;L;;;;;N;;;;0463; +0463;CYRILLIC SMALL LETTER YAT;Ll;0;L;;;;;N;;;0462;;0462 +0464;CYRILLIC CAPITAL LETTER IOTIFIED E;Lu;0;L;;;;;N;;;;0465; +0465;CYRILLIC SMALL LETTER IOTIFIED E;Ll;0;L;;;;;N;;;0464;;0464 +0466;CYRILLIC CAPITAL LETTER LITTLE YUS;Lu;0;L;;;;;N;;;;0467; +0467;CYRILLIC SMALL LETTER LITTLE YUS;Ll;0;L;;;;;N;;;0466;;0466 +0468;CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS;Lu;0;L;;;;;N;;;;0469; +0469;CYRILLIC SMALL LETTER IOTIFIED LITTLE YUS;Ll;0;L;;;;;N;;;0468;;0468 +046A;CYRILLIC CAPITAL LETTER BIG YUS;Lu;0;L;;;;;N;;;;046B; +046B;CYRILLIC SMALL LETTER BIG YUS;Ll;0;L;;;;;N;;;046A;;046A +046C;CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS;Lu;0;L;;;;;N;;;;046D; +046D;CYRILLIC SMALL LETTER IOTIFIED BIG YUS;Ll;0;L;;;;;N;;;046C;;046C +046E;CYRILLIC CAPITAL LETTER KSI;Lu;0;L;;;;;N;;;;046F; +046F;CYRILLIC SMALL LETTER KSI;Ll;0;L;;;;;N;;;046E;;046E +0470;CYRILLIC CAPITAL LETTER PSI;Lu;0;L;;;;;N;;;;0471; +0471;CYRILLIC SMALL LETTER PSI;Ll;0;L;;;;;N;;;0470;;0470 +0472;CYRILLIC CAPITAL LETTER FITA;Lu;0;L;;;;;N;;;;0473; +0473;CYRILLIC SMALL LETTER FITA;Ll;0;L;;;;;N;;;0472;;0472 +0474;CYRILLIC CAPITAL LETTER IZHITSA;Lu;0;L;;;;;N;;;;0475; +0475;CYRILLIC SMALL LETTER IZHITSA;Ll;0;L;;;;;N;;;0474;;0474 +0476;CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT;Lu;0;L;0474 030F;;;;N;CYRILLIC CAPITAL LETTER IZHITSA DOUBLE GRAVE;;;0477; +0477;CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT;Ll;0;L;0475 030F;;;;N;CYRILLIC SMALL LETTER IZHITSA DOUBLE GRAVE;;0476;;0476 +0478;CYRILLIC CAPITAL LETTER UK;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER UK DIGRAPH;;;0479; +0479;CYRILLIC SMALL LETTER UK;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER UK DIGRAPH;;0478;;0478 +047A;CYRILLIC CAPITAL LETTER ROUND OMEGA;Lu;0;L;;;;;N;;;;047B; +047B;CYRILLIC SMALL LETTER ROUND OMEGA;Ll;0;L;;;;;N;;;047A;;047A +047C;CYRILLIC CAPITAL LETTER OMEGA WITH TITLO;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER OMEGA TITLO;;;047D; +047D;CYRILLIC SMALL LETTER OMEGA WITH TITLO;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER OMEGA TITLO;;047C;;047C +047E;CYRILLIC CAPITAL LETTER OT;Lu;0;L;;;;;N;;;;047F; +047F;CYRILLIC SMALL LETTER OT;Ll;0;L;;;;;N;;;047E;;047E +0480;CYRILLIC CAPITAL LETTER KOPPA;Lu;0;L;;;;;N;;;;0481; +0481;CYRILLIC SMALL LETTER KOPPA;Ll;0;L;;;;;N;;;0480;;0480 +0482;CYRILLIC THOUSANDS SIGN;So;0;L;;;;;N;;;;; +0483;COMBINING CYRILLIC TITLO;Mn;230;NSM;;;;;N;CYRILLIC NON-SPACING TITLO;;;; +0484;COMBINING CYRILLIC PALATALIZATION;Mn;230;NSM;;;;;N;CYRILLIC NON-SPACING PALATALIZATION;;;; +0485;COMBINING CYRILLIC DASIA PNEUMATA;Mn;230;NSM;;;;;N;CYRILLIC NON-SPACING DASIA PNEUMATA;;;; +0486;COMBINING CYRILLIC PSILI PNEUMATA;Mn;230;NSM;;;;;N;CYRILLIC NON-SPACING PSILI PNEUMATA;;;; +0487;COMBINING CYRILLIC POKRYTIE;Mn;230;NSM;;;;;N;;;;; +0488;COMBINING CYRILLIC HUNDRED THOUSANDS SIGN;Me;0;NSM;;;;;N;;;;; +0489;COMBINING CYRILLIC MILLIONS SIGN;Me;0;NSM;;;;;N;;;;; +048A;CYRILLIC CAPITAL LETTER SHORT I WITH TAIL;Lu;0;L;;;;;N;;;;048B; +048B;CYRILLIC SMALL LETTER SHORT I WITH TAIL;Ll;0;L;;;;;N;;;048A;;048A +048C;CYRILLIC CAPITAL LETTER SEMISOFT SIGN;Lu;0;L;;;;;N;;;;048D; +048D;CYRILLIC SMALL LETTER SEMISOFT SIGN;Ll;0;L;;;;;N;;;048C;;048C +048E;CYRILLIC CAPITAL LETTER ER WITH TICK;Lu;0;L;;;;;N;;;;048F; +048F;CYRILLIC SMALL LETTER ER WITH TICK;Ll;0;L;;;;;N;;;048E;;048E +0490;CYRILLIC CAPITAL LETTER GHE WITH UPTURN;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER GE WITH UPTURN;;;0491; +0491;CYRILLIC SMALL LETTER GHE WITH UPTURN;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER GE WITH UPTURN;;0490;;0490 +0492;CYRILLIC CAPITAL LETTER GHE WITH STROKE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER GE BAR;;;0493; +0493;CYRILLIC SMALL LETTER GHE WITH STROKE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER GE BAR;;0492;;0492 +0494;CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER GE HOOK;;;0495; +0495;CYRILLIC SMALL LETTER GHE WITH MIDDLE HOOK;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER GE HOOK;;0494;;0494 +0496;CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER ZHE WITH RIGHT DESCENDER;;;0497; +0497;CYRILLIC SMALL LETTER ZHE WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER ZHE WITH RIGHT DESCENDER;;0496;;0496 +0498;CYRILLIC CAPITAL LETTER ZE WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER ZE CEDILLA;;;0499; +0499;CYRILLIC SMALL LETTER ZE WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER ZE CEDILLA;;0498;;0498 +049A;CYRILLIC CAPITAL LETTER KA WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KA WITH RIGHT DESCENDER;;;049B; +049B;CYRILLIC SMALL LETTER KA WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KA WITH RIGHT DESCENDER;;049A;;049A +049C;CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KA VERTICAL BAR;;;049D; +049D;CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KA VERTICAL BAR;;049C;;049C +049E;CYRILLIC CAPITAL LETTER KA WITH STROKE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KA BAR;;;049F; +049F;CYRILLIC SMALL LETTER KA WITH STROKE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KA BAR;;049E;;049E +04A0;CYRILLIC CAPITAL LETTER BASHKIR KA;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER REVERSED GE KA;;;04A1; +04A1;CYRILLIC SMALL LETTER BASHKIR KA;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER REVERSED GE KA;;04A0;;04A0 +04A2;CYRILLIC CAPITAL LETTER EN WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER EN WITH RIGHT DESCENDER;;;04A3; +04A3;CYRILLIC SMALL LETTER EN WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER EN WITH RIGHT DESCENDER;;04A2;;04A2 +04A4;CYRILLIC CAPITAL LIGATURE EN GHE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER EN GE;;;04A5; +04A5;CYRILLIC SMALL LIGATURE EN GHE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER EN GE;;04A4;;04A4 +04A6;CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER PE HOOK;;;04A7; +04A7;CYRILLIC SMALL LETTER PE WITH MIDDLE HOOK;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER PE HOOK;;04A6;;04A6 +04A8;CYRILLIC CAPITAL LETTER ABKHASIAN HA;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER O HOOK;;;04A9; +04A9;CYRILLIC SMALL LETTER ABKHASIAN HA;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER O HOOK;;04A8;;04A8 +04AA;CYRILLIC CAPITAL LETTER ES WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER ES CEDILLA;;;04AB; +04AB;CYRILLIC SMALL LETTER ES WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER ES CEDILLA;;04AA;;04AA +04AC;CYRILLIC CAPITAL LETTER TE WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER TE WITH RIGHT DESCENDER;;;04AD; +04AD;CYRILLIC SMALL LETTER TE WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER TE WITH RIGHT DESCENDER;;04AC;;04AC +04AE;CYRILLIC CAPITAL LETTER STRAIGHT U;Lu;0;L;;;;;N;;;;04AF; +04AF;CYRILLIC SMALL LETTER STRAIGHT U;Ll;0;L;;;;;N;;;04AE;;04AE +04B0;CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER STRAIGHT U BAR;;;04B1; +04B1;CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER STRAIGHT U BAR;;04B0;;04B0 +04B2;CYRILLIC CAPITAL LETTER HA WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KHA WITH RIGHT DESCENDER;;;04B3; +04B3;CYRILLIC SMALL LETTER HA WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KHA WITH RIGHT DESCENDER;;04B2;;04B2 +04B4;CYRILLIC CAPITAL LIGATURE TE TSE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER TE TSE;;;04B5; +04B5;CYRILLIC SMALL LIGATURE TE TSE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER TE TSE;;04B4;;04B4 +04B6;CYRILLIC CAPITAL LETTER CHE WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER CHE WITH RIGHT DESCENDER;;;04B7; +04B7;CYRILLIC SMALL LETTER CHE WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER CHE WITH RIGHT DESCENDER;;04B6;;04B6 +04B8;CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER CHE VERTICAL BAR;;;04B9; +04B9;CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER CHE VERTICAL BAR;;04B8;;04B8 +04BA;CYRILLIC CAPITAL LETTER SHHA;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER H;;;04BB; +04BB;CYRILLIC SMALL LETTER SHHA;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER H;;04BA;;04BA +04BC;CYRILLIC CAPITAL LETTER ABKHASIAN CHE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER IE HOOK;;;04BD; +04BD;CYRILLIC SMALL LETTER ABKHASIAN CHE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER IE HOOK;;04BC;;04BC +04BE;CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER IE HOOK OGONEK;;;04BF; +04BF;CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER IE HOOK OGONEK;;04BE;;04BE +04C0;CYRILLIC LETTER PALOCHKA;Lu;0;L;;;;;N;CYRILLIC LETTER I;;;04CF; +04C1;CYRILLIC CAPITAL LETTER ZHE WITH BREVE;Lu;0;L;0416 0306;;;;N;CYRILLIC CAPITAL LETTER SHORT ZHE;;;04C2; +04C2;CYRILLIC SMALL LETTER ZHE WITH BREVE;Ll;0;L;0436 0306;;;;N;CYRILLIC SMALL LETTER SHORT ZHE;;04C1;;04C1 +04C3;CYRILLIC CAPITAL LETTER KA WITH HOOK;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KA HOOK;;;04C4; +04C4;CYRILLIC SMALL LETTER KA WITH HOOK;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KA HOOK;;04C3;;04C3 +04C5;CYRILLIC CAPITAL LETTER EL WITH TAIL;Lu;0;L;;;;;N;;;;04C6; +04C6;CYRILLIC SMALL LETTER EL WITH TAIL;Ll;0;L;;;;;N;;;04C5;;04C5 +04C7;CYRILLIC CAPITAL LETTER EN WITH HOOK;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER EN HOOK;;;04C8; +04C8;CYRILLIC SMALL LETTER EN WITH HOOK;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER EN HOOK;;04C7;;04C7 +04C9;CYRILLIC CAPITAL LETTER EN WITH TAIL;Lu;0;L;;;;;N;;;;04CA; +04CA;CYRILLIC SMALL LETTER EN WITH TAIL;Ll;0;L;;;;;N;;;04C9;;04C9 +04CB;CYRILLIC CAPITAL LETTER KHAKASSIAN CHE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER CHE WITH LEFT DESCENDER;;;04CC; +04CC;CYRILLIC SMALL LETTER KHAKASSIAN CHE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER CHE WITH LEFT DESCENDER;;04CB;;04CB +04CD;CYRILLIC CAPITAL LETTER EM WITH TAIL;Lu;0;L;;;;;N;;;;04CE; +04CE;CYRILLIC SMALL LETTER EM WITH TAIL;Ll;0;L;;;;;N;;;04CD;;04CD +04CF;CYRILLIC SMALL LETTER PALOCHKA;Ll;0;L;;;;;N;;;04C0;;04C0 +04D0;CYRILLIC CAPITAL LETTER A WITH BREVE;Lu;0;L;0410 0306;;;;N;;;;04D1; +04D1;CYRILLIC SMALL LETTER A WITH BREVE;Ll;0;L;0430 0306;;;;N;;;04D0;;04D0 +04D2;CYRILLIC CAPITAL LETTER A WITH DIAERESIS;Lu;0;L;0410 0308;;;;N;;;;04D3; +04D3;CYRILLIC SMALL LETTER A WITH DIAERESIS;Ll;0;L;0430 0308;;;;N;;;04D2;;04D2 +04D4;CYRILLIC CAPITAL LIGATURE A IE;Lu;0;L;;;;;N;;;;04D5; +04D5;CYRILLIC SMALL LIGATURE A IE;Ll;0;L;;;;;N;;;04D4;;04D4 +04D6;CYRILLIC CAPITAL LETTER IE WITH BREVE;Lu;0;L;0415 0306;;;;N;;;;04D7; +04D7;CYRILLIC SMALL LETTER IE WITH BREVE;Ll;0;L;0435 0306;;;;N;;;04D6;;04D6 +04D8;CYRILLIC CAPITAL LETTER SCHWA;Lu;0;L;;;;;N;;;;04D9; +04D9;CYRILLIC SMALL LETTER SCHWA;Ll;0;L;;;;;N;;;04D8;;04D8 +04DA;CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS;Lu;0;L;04D8 0308;;;;N;;;;04DB; +04DB;CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS;Ll;0;L;04D9 0308;;;;N;;;04DA;;04DA +04DC;CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS;Lu;0;L;0416 0308;;;;N;;;;04DD; +04DD;CYRILLIC SMALL LETTER ZHE WITH DIAERESIS;Ll;0;L;0436 0308;;;;N;;;04DC;;04DC +04DE;CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS;Lu;0;L;0417 0308;;;;N;;;;04DF; +04DF;CYRILLIC SMALL LETTER ZE WITH DIAERESIS;Ll;0;L;0437 0308;;;;N;;;04DE;;04DE +04E0;CYRILLIC CAPITAL LETTER ABKHASIAN DZE;Lu;0;L;;;;;N;;;;04E1; +04E1;CYRILLIC SMALL LETTER ABKHASIAN DZE;Ll;0;L;;;;;N;;;04E0;;04E0 +04E2;CYRILLIC CAPITAL LETTER I WITH MACRON;Lu;0;L;0418 0304;;;;N;;;;04E3; +04E3;CYRILLIC SMALL LETTER I WITH MACRON;Ll;0;L;0438 0304;;;;N;;;04E2;;04E2 +04E4;CYRILLIC CAPITAL LETTER I WITH DIAERESIS;Lu;0;L;0418 0308;;;;N;;;;04E5; +04E5;CYRILLIC SMALL LETTER I WITH DIAERESIS;Ll;0;L;0438 0308;;;;N;;;04E4;;04E4 +04E6;CYRILLIC CAPITAL LETTER O WITH DIAERESIS;Lu;0;L;041E 0308;;;;N;;;;04E7; +04E7;CYRILLIC SMALL LETTER O WITH DIAERESIS;Ll;0;L;043E 0308;;;;N;;;04E6;;04E6 +04E8;CYRILLIC CAPITAL LETTER BARRED O;Lu;0;L;;;;;N;;;;04E9; +04E9;CYRILLIC SMALL LETTER BARRED O;Ll;0;L;;;;;N;;;04E8;;04E8 +04EA;CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS;Lu;0;L;04E8 0308;;;;N;;;;04EB; +04EB;CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS;Ll;0;L;04E9 0308;;;;N;;;04EA;;04EA +04EC;CYRILLIC CAPITAL LETTER E WITH DIAERESIS;Lu;0;L;042D 0308;;;;N;;;;04ED; +04ED;CYRILLIC SMALL LETTER E WITH DIAERESIS;Ll;0;L;044D 0308;;;;N;;;04EC;;04EC +04EE;CYRILLIC CAPITAL LETTER U WITH MACRON;Lu;0;L;0423 0304;;;;N;;;;04EF; +04EF;CYRILLIC SMALL LETTER U WITH MACRON;Ll;0;L;0443 0304;;;;N;;;04EE;;04EE +04F0;CYRILLIC CAPITAL LETTER U WITH DIAERESIS;Lu;0;L;0423 0308;;;;N;;;;04F1; +04F1;CYRILLIC SMALL LETTER U WITH DIAERESIS;Ll;0;L;0443 0308;;;;N;;;04F0;;04F0 +04F2;CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE;Lu;0;L;0423 030B;;;;N;;;;04F3; +04F3;CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE;Ll;0;L;0443 030B;;;;N;;;04F2;;04F2 +04F4;CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS;Lu;0;L;0427 0308;;;;N;;;;04F5; +04F5;CYRILLIC SMALL LETTER CHE WITH DIAERESIS;Ll;0;L;0447 0308;;;;N;;;04F4;;04F4 +04F6;CYRILLIC CAPITAL LETTER GHE WITH DESCENDER;Lu;0;L;;;;;N;;;;04F7; +04F7;CYRILLIC SMALL LETTER GHE WITH DESCENDER;Ll;0;L;;;;;N;;;04F6;;04F6 +04F8;CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS;Lu;0;L;042B 0308;;;;N;;;;04F9; +04F9;CYRILLIC SMALL LETTER YERU WITH DIAERESIS;Ll;0;L;044B 0308;;;;N;;;04F8;;04F8 +04FA;CYRILLIC CAPITAL LETTER GHE WITH STROKE AND HOOK;Lu;0;L;;;;;N;;;;04FB; +04FB;CYRILLIC SMALL LETTER GHE WITH STROKE AND HOOK;Ll;0;L;;;;;N;;;04FA;;04FA +04FC;CYRILLIC CAPITAL LETTER HA WITH HOOK;Lu;0;L;;;;;N;;;;04FD; +04FD;CYRILLIC SMALL LETTER HA WITH HOOK;Ll;0;L;;;;;N;;;04FC;;04FC +04FE;CYRILLIC CAPITAL LETTER HA WITH STROKE;Lu;0;L;;;;;N;;;;04FF; +04FF;CYRILLIC SMALL LETTER HA WITH STROKE;Ll;0;L;;;;;N;;;04FE;;04FE +0500;CYRILLIC CAPITAL LETTER KOMI DE;Lu;0;L;;;;;N;;;;0501; +0501;CYRILLIC SMALL LETTER KOMI DE;Ll;0;L;;;;;N;;;0500;;0500 +0502;CYRILLIC CAPITAL LETTER KOMI DJE;Lu;0;L;;;;;N;;;;0503; +0503;CYRILLIC SMALL LETTER KOMI DJE;Ll;0;L;;;;;N;;;0502;;0502 +0504;CYRILLIC CAPITAL LETTER KOMI ZJE;Lu;0;L;;;;;N;;;;0505; +0505;CYRILLIC SMALL LETTER KOMI ZJE;Ll;0;L;;;;;N;;;0504;;0504 +0506;CYRILLIC CAPITAL LETTER KOMI DZJE;Lu;0;L;;;;;N;;;;0507; +0507;CYRILLIC SMALL LETTER KOMI DZJE;Ll;0;L;;;;;N;;;0506;;0506 +0508;CYRILLIC CAPITAL LETTER KOMI LJE;Lu;0;L;;;;;N;;;;0509; +0509;CYRILLIC SMALL LETTER KOMI LJE;Ll;0;L;;;;;N;;;0508;;0508 +050A;CYRILLIC CAPITAL LETTER KOMI NJE;Lu;0;L;;;;;N;;;;050B; +050B;CYRILLIC SMALL LETTER KOMI NJE;Ll;0;L;;;;;N;;;050A;;050A +050C;CYRILLIC CAPITAL LETTER KOMI SJE;Lu;0;L;;;;;N;;;;050D; +050D;CYRILLIC SMALL LETTER KOMI SJE;Ll;0;L;;;;;N;;;050C;;050C +050E;CYRILLIC CAPITAL LETTER KOMI TJE;Lu;0;L;;;;;N;;;;050F; +050F;CYRILLIC SMALL LETTER KOMI TJE;Ll;0;L;;;;;N;;;050E;;050E +0510;CYRILLIC CAPITAL LETTER REVERSED ZE;Lu;0;L;;;;;N;;;;0511; +0511;CYRILLIC SMALL LETTER REVERSED ZE;Ll;0;L;;;;;N;;;0510;;0510 +0512;CYRILLIC CAPITAL LETTER EL WITH HOOK;Lu;0;L;;;;;N;;;;0513; +0513;CYRILLIC SMALL LETTER EL WITH HOOK;Ll;0;L;;;;;N;;;0512;;0512 +0514;CYRILLIC CAPITAL LETTER LHA;Lu;0;L;;;;;N;;;;0515; +0515;CYRILLIC SMALL LETTER LHA;Ll;0;L;;;;;N;;;0514;;0514 +0516;CYRILLIC CAPITAL LETTER RHA;Lu;0;L;;;;;N;;;;0517; +0517;CYRILLIC SMALL LETTER RHA;Ll;0;L;;;;;N;;;0516;;0516 +0518;CYRILLIC CAPITAL LETTER YAE;Lu;0;L;;;;;N;;;;0519; +0519;CYRILLIC SMALL LETTER YAE;Ll;0;L;;;;;N;;;0518;;0518 +051A;CYRILLIC CAPITAL LETTER QA;Lu;0;L;;;;;N;;;;051B; +051B;CYRILLIC SMALL LETTER QA;Ll;0;L;;;;;N;;;051A;;051A +051C;CYRILLIC CAPITAL LETTER WE;Lu;0;L;;;;;N;;;;051D; +051D;CYRILLIC SMALL LETTER WE;Ll;0;L;;;;;N;;;051C;;051C +051E;CYRILLIC CAPITAL LETTER ALEUT KA;Lu;0;L;;;;;N;;;;051F; +051F;CYRILLIC SMALL LETTER ALEUT KA;Ll;0;L;;;;;N;;;051E;;051E +0520;CYRILLIC CAPITAL LETTER EL WITH MIDDLE HOOK;Lu;0;L;;;;;N;;;;0521; +0521;CYRILLIC SMALL LETTER EL WITH MIDDLE HOOK;Ll;0;L;;;;;N;;;0520;;0520 +0522;CYRILLIC CAPITAL LETTER EN WITH MIDDLE HOOK;Lu;0;L;;;;;N;;;;0523; +0523;CYRILLIC SMALL LETTER EN WITH MIDDLE HOOK;Ll;0;L;;;;;N;;;0522;;0522 +0524;CYRILLIC CAPITAL LETTER PE WITH DESCENDER;Lu;0;L;;;;;N;;;;0525; +0525;CYRILLIC SMALL LETTER PE WITH DESCENDER;Ll;0;L;;;;;N;;;0524;;0524 +0526;CYRILLIC CAPITAL LETTER SHHA WITH DESCENDER;Lu;0;L;;;;;N;;;;0527; +0527;CYRILLIC SMALL LETTER SHHA WITH DESCENDER;Ll;0;L;;;;;N;;;0526;;0526 +0528;CYRILLIC CAPITAL LETTER EN WITH LEFT HOOK;Lu;0;L;;;;;N;;;;0529; +0529;CYRILLIC SMALL LETTER EN WITH LEFT HOOK;Ll;0;L;;;;;N;;;0528;;0528 +052A;CYRILLIC CAPITAL LETTER DZZHE;Lu;0;L;;;;;N;;;;052B; +052B;CYRILLIC SMALL LETTER DZZHE;Ll;0;L;;;;;N;;;052A;;052A +052C;CYRILLIC CAPITAL LETTER DCHE;Lu;0;L;;;;;N;;;;052D; +052D;CYRILLIC SMALL LETTER DCHE;Ll;0;L;;;;;N;;;052C;;052C +052E;CYRILLIC CAPITAL LETTER EL WITH DESCENDER;Lu;0;L;;;;;N;;;;052F; +052F;CYRILLIC SMALL LETTER EL WITH DESCENDER;Ll;0;L;;;;;N;;;052E;;052E +0531;ARMENIAN CAPITAL LETTER AYB;Lu;0;L;;;;;N;;;;0561; +0532;ARMENIAN CAPITAL LETTER BEN;Lu;0;L;;;;;N;;;;0562; +0533;ARMENIAN CAPITAL LETTER GIM;Lu;0;L;;;;;N;;;;0563; +0534;ARMENIAN CAPITAL LETTER DA;Lu;0;L;;;;;N;;;;0564; +0535;ARMENIAN CAPITAL LETTER ECH;Lu;0;L;;;;;N;;;;0565; +0536;ARMENIAN CAPITAL LETTER ZA;Lu;0;L;;;;;N;;;;0566; +0537;ARMENIAN CAPITAL LETTER EH;Lu;0;L;;;;;N;;;;0567; +0538;ARMENIAN CAPITAL LETTER ET;Lu;0;L;;;;;N;;;;0568; +0539;ARMENIAN CAPITAL LETTER TO;Lu;0;L;;;;;N;;;;0569; +053A;ARMENIAN CAPITAL LETTER ZHE;Lu;0;L;;;;;N;;;;056A; +053B;ARMENIAN CAPITAL LETTER INI;Lu;0;L;;;;;N;;;;056B; +053C;ARMENIAN CAPITAL LETTER LIWN;Lu;0;L;;;;;N;;;;056C; +053D;ARMENIAN CAPITAL LETTER XEH;Lu;0;L;;;;;N;;;;056D; +053E;ARMENIAN CAPITAL LETTER CA;Lu;0;L;;;;;N;;;;056E; +053F;ARMENIAN CAPITAL LETTER KEN;Lu;0;L;;;;;N;;;;056F; +0540;ARMENIAN CAPITAL LETTER HO;Lu;0;L;;;;;N;;;;0570; +0541;ARMENIAN CAPITAL LETTER JA;Lu;0;L;;;;;N;;;;0571; +0542;ARMENIAN CAPITAL LETTER GHAD;Lu;0;L;;;;;N;ARMENIAN CAPITAL LETTER LAD;;;0572; +0543;ARMENIAN CAPITAL LETTER CHEH;Lu;0;L;;;;;N;;;;0573; +0544;ARMENIAN CAPITAL LETTER MEN;Lu;0;L;;;;;N;;;;0574; +0545;ARMENIAN CAPITAL LETTER YI;Lu;0;L;;;;;N;;;;0575; +0546;ARMENIAN CAPITAL LETTER NOW;Lu;0;L;;;;;N;;;;0576; +0547;ARMENIAN CAPITAL LETTER SHA;Lu;0;L;;;;;N;;;;0577; +0548;ARMENIAN CAPITAL LETTER VO;Lu;0;L;;;;;N;;;;0578; +0549;ARMENIAN CAPITAL LETTER CHA;Lu;0;L;;;;;N;;;;0579; +054A;ARMENIAN CAPITAL LETTER PEH;Lu;0;L;;;;;N;;;;057A; +054B;ARMENIAN CAPITAL LETTER JHEH;Lu;0;L;;;;;N;;;;057B; +054C;ARMENIAN CAPITAL LETTER RA;Lu;0;L;;;;;N;;;;057C; +054D;ARMENIAN CAPITAL LETTER SEH;Lu;0;L;;;;;N;;;;057D; +054E;ARMENIAN CAPITAL LETTER VEW;Lu;0;L;;;;;N;;;;057E; +054F;ARMENIAN CAPITAL LETTER TIWN;Lu;0;L;;;;;N;;;;057F; +0550;ARMENIAN CAPITAL LETTER REH;Lu;0;L;;;;;N;;;;0580; +0551;ARMENIAN CAPITAL LETTER CO;Lu;0;L;;;;;N;;;;0581; +0552;ARMENIAN CAPITAL LETTER YIWN;Lu;0;L;;;;;N;;;;0582; +0553;ARMENIAN CAPITAL LETTER PIWR;Lu;0;L;;;;;N;;;;0583; +0554;ARMENIAN CAPITAL LETTER KEH;Lu;0;L;;;;;N;;;;0584; +0555;ARMENIAN CAPITAL LETTER OH;Lu;0;L;;;;;N;;;;0585; +0556;ARMENIAN CAPITAL LETTER FEH;Lu;0;L;;;;;N;;;;0586; +0559;ARMENIAN MODIFIER LETTER LEFT HALF RING;Lm;0;L;;;;;N;;;;; +055A;ARMENIAN APOSTROPHE;Po;0;L;;;;;N;ARMENIAN MODIFIER LETTER RIGHT HALF RING;;;; +055B;ARMENIAN EMPHASIS MARK;Po;0;L;;;;;N;;;;; +055C;ARMENIAN EXCLAMATION MARK;Po;0;L;;;;;N;;;;; +055D;ARMENIAN COMMA;Po;0;L;;;;;N;;;;; +055E;ARMENIAN QUESTION MARK;Po;0;L;;;;;N;;;;; +055F;ARMENIAN ABBREVIATION MARK;Po;0;L;;;;;N;;;;; +0560;ARMENIAN SMALL LETTER TURNED AYB;Ll;0;L;;;;;N;;;;; +0561;ARMENIAN SMALL LETTER AYB;Ll;0;L;;;;;N;;;0531;;0531 +0562;ARMENIAN SMALL LETTER BEN;Ll;0;L;;;;;N;;;0532;;0532 +0563;ARMENIAN SMALL LETTER GIM;Ll;0;L;;;;;N;;;0533;;0533 +0564;ARMENIAN SMALL LETTER DA;Ll;0;L;;;;;N;;;0534;;0534 +0565;ARMENIAN SMALL LETTER ECH;Ll;0;L;;;;;N;;;0535;;0535 +0566;ARMENIAN SMALL LETTER ZA;Ll;0;L;;;;;N;;;0536;;0536 +0567;ARMENIAN SMALL LETTER EH;Ll;0;L;;;;;N;;;0537;;0537 +0568;ARMENIAN SMALL LETTER ET;Ll;0;L;;;;;N;;;0538;;0538 +0569;ARMENIAN SMALL LETTER TO;Ll;0;L;;;;;N;;;0539;;0539 +056A;ARMENIAN SMALL LETTER ZHE;Ll;0;L;;;;;N;;;053A;;053A +056B;ARMENIAN SMALL LETTER INI;Ll;0;L;;;;;N;;;053B;;053B +056C;ARMENIAN SMALL LETTER LIWN;Ll;0;L;;;;;N;;;053C;;053C +056D;ARMENIAN SMALL LETTER XEH;Ll;0;L;;;;;N;;;053D;;053D +056E;ARMENIAN SMALL LETTER CA;Ll;0;L;;;;;N;;;053E;;053E +056F;ARMENIAN SMALL LETTER KEN;Ll;0;L;;;;;N;;;053F;;053F +0570;ARMENIAN SMALL LETTER HO;Ll;0;L;;;;;N;;;0540;;0540 +0571;ARMENIAN SMALL LETTER JA;Ll;0;L;;;;;N;;;0541;;0541 +0572;ARMENIAN SMALL LETTER GHAD;Ll;0;L;;;;;N;ARMENIAN SMALL LETTER LAD;;0542;;0542 +0573;ARMENIAN SMALL LETTER CHEH;Ll;0;L;;;;;N;;;0543;;0543 +0574;ARMENIAN SMALL LETTER MEN;Ll;0;L;;;;;N;;;0544;;0544 +0575;ARMENIAN SMALL LETTER YI;Ll;0;L;;;;;N;;;0545;;0545 +0576;ARMENIAN SMALL LETTER NOW;Ll;0;L;;;;;N;;;0546;;0546 +0577;ARMENIAN SMALL LETTER SHA;Ll;0;L;;;;;N;;;0547;;0547 +0578;ARMENIAN SMALL LETTER VO;Ll;0;L;;;;;N;;;0548;;0548 +0579;ARMENIAN SMALL LETTER CHA;Ll;0;L;;;;;N;;;0549;;0549 +057A;ARMENIAN SMALL LETTER PEH;Ll;0;L;;;;;N;;;054A;;054A +057B;ARMENIAN SMALL LETTER JHEH;Ll;0;L;;;;;N;;;054B;;054B +057C;ARMENIAN SMALL LETTER RA;Ll;0;L;;;;;N;;;054C;;054C +057D;ARMENIAN SMALL LETTER SEH;Ll;0;L;;;;;N;;;054D;;054D +057E;ARMENIAN SMALL LETTER VEW;Ll;0;L;;;;;N;;;054E;;054E +057F;ARMENIAN SMALL LETTER TIWN;Ll;0;L;;;;;N;;;054F;;054F +0580;ARMENIAN SMALL LETTER REH;Ll;0;L;;;;;N;;;0550;;0550 +0581;ARMENIAN SMALL LETTER CO;Ll;0;L;;;;;N;;;0551;;0551 +0582;ARMENIAN SMALL LETTER YIWN;Ll;0;L;;;;;N;;;0552;;0552 +0583;ARMENIAN SMALL LETTER PIWR;Ll;0;L;;;;;N;;;0553;;0553 +0584;ARMENIAN SMALL LETTER KEH;Ll;0;L;;;;;N;;;0554;;0554 +0585;ARMENIAN SMALL LETTER OH;Ll;0;L;;;;;N;;;0555;;0555 +0586;ARMENIAN SMALL LETTER FEH;Ll;0;L;;;;;N;;;0556;;0556 +0587;ARMENIAN SMALL LIGATURE ECH YIWN;Ll;0;L;<compat> 0565 0582;;;;N;;;;; +0588;ARMENIAN SMALL LETTER YI WITH STROKE;Ll;0;L;;;;;N;;;;; +0589;ARMENIAN FULL STOP;Po;0;L;;;;;N;ARMENIAN PERIOD;;;; +058A;ARMENIAN HYPHEN;Pd;0;ON;;;;;N;;;;; +058D;RIGHT-FACING ARMENIAN ETERNITY SIGN;So;0;ON;;;;;N;;;;; +058E;LEFT-FACING ARMENIAN ETERNITY SIGN;So;0;ON;;;;;N;;;;; +058F;ARMENIAN DRAM SIGN;Sc;0;ET;;;;;N;;;;; +0591;HEBREW ACCENT ETNAHTA;Mn;220;NSM;;;;;N;;;;; +0592;HEBREW ACCENT SEGOL;Mn;230;NSM;;;;;N;;;;; +0593;HEBREW ACCENT SHALSHELET;Mn;230;NSM;;;;;N;;;;; +0594;HEBREW ACCENT ZAQEF QATAN;Mn;230;NSM;;;;;N;;;;; +0595;HEBREW ACCENT ZAQEF GADOL;Mn;230;NSM;;;;;N;;;;; +0596;HEBREW ACCENT TIPEHA;Mn;220;NSM;;;;;N;;;;; +0597;HEBREW ACCENT REVIA;Mn;230;NSM;;;;;N;;;;; +0598;HEBREW ACCENT ZARQA;Mn;230;NSM;;;;;N;;;;; +0599;HEBREW ACCENT PASHTA;Mn;230;NSM;;;;;N;;;;; +059A;HEBREW ACCENT YETIV;Mn;222;NSM;;;;;N;;;;; +059B;HEBREW ACCENT TEVIR;Mn;220;NSM;;;;;N;;;;; +059C;HEBREW ACCENT GERESH;Mn;230;NSM;;;;;N;;;;; +059D;HEBREW ACCENT GERESH MUQDAM;Mn;230;NSM;;;;;N;;;;; +059E;HEBREW ACCENT GERSHAYIM;Mn;230;NSM;;;;;N;;;;; +059F;HEBREW ACCENT QARNEY PARA;Mn;230;NSM;;;;;N;;;;; +05A0;HEBREW ACCENT TELISHA GEDOLA;Mn;230;NSM;;;;;N;;;;; +05A1;HEBREW ACCENT PAZER;Mn;230;NSM;;;;;N;;;;; +05A2;HEBREW ACCENT ATNAH HAFUKH;Mn;220;NSM;;;;;N;;;;; +05A3;HEBREW ACCENT MUNAH;Mn;220;NSM;;;;;N;;;;; +05A4;HEBREW ACCENT MAHAPAKH;Mn;220;NSM;;;;;N;;;;; +05A5;HEBREW ACCENT MERKHA;Mn;220;NSM;;;;;N;;;;; +05A6;HEBREW ACCENT MERKHA KEFULA;Mn;220;NSM;;;;;N;;;;; +05A7;HEBREW ACCENT DARGA;Mn;220;NSM;;;;;N;;;;; +05A8;HEBREW ACCENT QADMA;Mn;230;NSM;;;;;N;;;;; +05A9;HEBREW ACCENT TELISHA QETANA;Mn;230;NSM;;;;;N;;;;; +05AA;HEBREW ACCENT YERAH BEN YOMO;Mn;220;NSM;;;;;N;;;;; +05AB;HEBREW ACCENT OLE;Mn;230;NSM;;;;;N;;;;; +05AC;HEBREW ACCENT ILUY;Mn;230;NSM;;;;;N;;;;; +05AD;HEBREW ACCENT DEHI;Mn;222;NSM;;;;;N;;;;; +05AE;HEBREW ACCENT ZINOR;Mn;228;NSM;;;;;N;;;;; +05AF;HEBREW MARK MASORA CIRCLE;Mn;230;NSM;;;;;N;;;;; +05B0;HEBREW POINT SHEVA;Mn;10;NSM;;;;;N;;;;; +05B1;HEBREW POINT HATAF SEGOL;Mn;11;NSM;;;;;N;;;;; +05B2;HEBREW POINT HATAF PATAH;Mn;12;NSM;;;;;N;;;;; +05B3;HEBREW POINT HATAF QAMATS;Mn;13;NSM;;;;;N;;;;; +05B4;HEBREW POINT HIRIQ;Mn;14;NSM;;;;;N;;;;; +05B5;HEBREW POINT TSERE;Mn;15;NSM;;;;;N;;;;; +05B6;HEBREW POINT SEGOL;Mn;16;NSM;;;;;N;;;;; +05B7;HEBREW POINT PATAH;Mn;17;NSM;;;;;N;;;;; +05B8;HEBREW POINT QAMATS;Mn;18;NSM;;;;;N;;;;; +05B9;HEBREW POINT HOLAM;Mn;19;NSM;;;;;N;;;;; +05BA;HEBREW POINT HOLAM HASER FOR VAV;Mn;19;NSM;;;;;N;;;;; +05BB;HEBREW POINT QUBUTS;Mn;20;NSM;;;;;N;;;;; +05BC;HEBREW POINT DAGESH OR MAPIQ;Mn;21;NSM;;;;;N;HEBREW POINT DAGESH;;;; +05BD;HEBREW POINT METEG;Mn;22;NSM;;;;;N;;;;; +05BE;HEBREW PUNCTUATION MAQAF;Pd;0;R;;;;;N;;;;; +05BF;HEBREW POINT RAFE;Mn;23;NSM;;;;;N;;;;; +05C0;HEBREW PUNCTUATION PASEQ;Po;0;R;;;;;N;HEBREW POINT PASEQ;;;; +05C1;HEBREW POINT SHIN DOT;Mn;24;NSM;;;;;N;;;;; +05C2;HEBREW POINT SIN DOT;Mn;25;NSM;;;;;N;;;;; +05C3;HEBREW PUNCTUATION SOF PASUQ;Po;0;R;;;;;N;;;;; +05C4;HEBREW MARK UPPER DOT;Mn;230;NSM;;;;;N;;;;; +05C5;HEBREW MARK LOWER DOT;Mn;220;NSM;;;;;N;;;;; +05C6;HEBREW PUNCTUATION NUN HAFUKHA;Po;0;R;;;;;N;;;;; +05C7;HEBREW POINT QAMATS QATAN;Mn;18;NSM;;;;;N;;;;; +05D0;HEBREW LETTER ALEF;Lo;0;R;;;;;N;;;;; +05D1;HEBREW LETTER BET;Lo;0;R;;;;;N;;;;; +05D2;HEBREW LETTER GIMEL;Lo;0;R;;;;;N;;;;; +05D3;HEBREW LETTER DALET;Lo;0;R;;;;;N;;;;; +05D4;HEBREW LETTER HE;Lo;0;R;;;;;N;;;;; +05D5;HEBREW LETTER VAV;Lo;0;R;;;;;N;;;;; +05D6;HEBREW LETTER ZAYIN;Lo;0;R;;;;;N;;;;; +05D7;HEBREW LETTER HET;Lo;0;R;;;;;N;;;;; +05D8;HEBREW LETTER TET;Lo;0;R;;;;;N;;;;; +05D9;HEBREW LETTER YOD;Lo;0;R;;;;;N;;;;; +05DA;HEBREW LETTER FINAL KAF;Lo;0;R;;;;;N;;;;; +05DB;HEBREW LETTER KAF;Lo;0;R;;;;;N;;;;; +05DC;HEBREW LETTER LAMED;Lo;0;R;;;;;N;;;;; +05DD;HEBREW LETTER FINAL MEM;Lo;0;R;;;;;N;;;;; +05DE;HEBREW LETTER MEM;Lo;0;R;;;;;N;;;;; +05DF;HEBREW LETTER FINAL NUN;Lo;0;R;;;;;N;;;;; +05E0;HEBREW LETTER NUN;Lo;0;R;;;;;N;;;;; +05E1;HEBREW LETTER SAMEKH;Lo;0;R;;;;;N;;;;; +05E2;HEBREW LETTER AYIN;Lo;0;R;;;;;N;;;;; +05E3;HEBREW LETTER FINAL PE;Lo;0;R;;;;;N;;;;; +05E4;HEBREW LETTER PE;Lo;0;R;;;;;N;;;;; +05E5;HEBREW LETTER FINAL TSADI;Lo;0;R;;;;;N;;;;; +05E6;HEBREW LETTER TSADI;Lo;0;R;;;;;N;;;;; +05E7;HEBREW LETTER QOF;Lo;0;R;;;;;N;;;;; +05E8;HEBREW LETTER RESH;Lo;0;R;;;;;N;;;;; +05E9;HEBREW LETTER SHIN;Lo;0;R;;;;;N;;;;; +05EA;HEBREW LETTER TAV;Lo;0;R;;;;;N;;;;; +05EF;HEBREW YOD TRIANGLE;Lo;0;R;;;;;N;;;;; +05F0;HEBREW LIGATURE YIDDISH DOUBLE VAV;Lo;0;R;;;;;N;HEBREW LETTER DOUBLE VAV;;;; +05F1;HEBREW LIGATURE YIDDISH VAV YOD;Lo;0;R;;;;;N;HEBREW LETTER VAV YOD;;;; +05F2;HEBREW LIGATURE YIDDISH DOUBLE YOD;Lo;0;R;;;;;N;HEBREW LETTER DOUBLE YOD;;;; +05F3;HEBREW PUNCTUATION GERESH;Po;0;R;;;;;N;;;;; +05F4;HEBREW PUNCTUATION GERSHAYIM;Po;0;R;;;;;N;;;;; +0600;ARABIC NUMBER SIGN;Cf;0;AN;;;;;N;;;;; +0601;ARABIC SIGN SANAH;Cf;0;AN;;;;;N;;;;; +0602;ARABIC FOOTNOTE MARKER;Cf;0;AN;;;;;N;;;;; +0603;ARABIC SIGN SAFHA;Cf;0;AN;;;;;N;;;;; +0604;ARABIC SIGN SAMVAT;Cf;0;AN;;;;;N;;;;; +0605;ARABIC NUMBER MARK ABOVE;Cf;0;AN;;;;;N;;;;; +0606;ARABIC-INDIC CUBE ROOT;Sm;0;ON;;;;;N;;;;; +0607;ARABIC-INDIC FOURTH ROOT;Sm;0;ON;;;;;N;;;;; +0608;ARABIC RAY;Sm;0;AL;;;;;N;;;;; +0609;ARABIC-INDIC PER MILLE SIGN;Po;0;ET;;;;;N;;;;; +060A;ARABIC-INDIC PER TEN THOUSAND SIGN;Po;0;ET;;;;;N;;;;; +060B;AFGHANI SIGN;Sc;0;AL;;;;;N;;;;; +060C;ARABIC COMMA;Po;0;CS;;;;;N;;;;; +060D;ARABIC DATE SEPARATOR;Po;0;AL;;;;;N;;;;; +060E;ARABIC POETIC VERSE SIGN;So;0;ON;;;;;N;;;;; +060F;ARABIC SIGN MISRA;So;0;ON;;;;;N;;;;; +0610;ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM;Mn;230;NSM;;;;;N;;;;; +0611;ARABIC SIGN ALAYHE ASSALLAM;Mn;230;NSM;;;;;N;;;;; +0612;ARABIC SIGN RAHMATULLAH ALAYHE;Mn;230;NSM;;;;;N;;;;; +0613;ARABIC SIGN RADI ALLAHOU ANHU;Mn;230;NSM;;;;;N;;;;; +0614;ARABIC SIGN TAKHALLUS;Mn;230;NSM;;;;;N;;;;; +0615;ARABIC SMALL HIGH TAH;Mn;230;NSM;;;;;N;;;;; +0616;ARABIC SMALL HIGH LIGATURE ALEF WITH LAM WITH YEH;Mn;230;NSM;;;;;N;;;;; +0617;ARABIC SMALL HIGH ZAIN;Mn;230;NSM;;;;;N;;;;; +0618;ARABIC SMALL FATHA;Mn;30;NSM;;;;;N;;;;; +0619;ARABIC SMALL DAMMA;Mn;31;NSM;;;;;N;;;;; +061A;ARABIC SMALL KASRA;Mn;32;NSM;;;;;N;;;;; +061B;ARABIC SEMICOLON;Po;0;AL;;;;;N;;;;; +061C;ARABIC LETTER MARK;Cf;0;AL;;;;;N;;;;; +061E;ARABIC TRIPLE DOT PUNCTUATION MARK;Po;0;AL;;;;;N;;;;; +061F;ARABIC QUESTION MARK;Po;0;AL;;;;;N;;;;; +0620;ARABIC LETTER KASHMIRI YEH;Lo;0;AL;;;;;N;;;;; +0621;ARABIC LETTER HAMZA;Lo;0;AL;;;;;N;ARABIC LETTER HAMZAH;;;; +0622;ARABIC LETTER ALEF WITH MADDA ABOVE;Lo;0;AL;0627 0653;;;;N;ARABIC LETTER MADDAH ON ALEF;;;; +0623;ARABIC LETTER ALEF WITH HAMZA ABOVE;Lo;0;AL;0627 0654;;;;N;ARABIC LETTER HAMZAH ON ALEF;;;; +0624;ARABIC LETTER WAW WITH HAMZA ABOVE;Lo;0;AL;0648 0654;;;;N;ARABIC LETTER HAMZAH ON WAW;;;; +0625;ARABIC LETTER ALEF WITH HAMZA BELOW;Lo;0;AL;0627 0655;;;;N;ARABIC LETTER HAMZAH UNDER ALEF;;;; +0626;ARABIC LETTER YEH WITH HAMZA ABOVE;Lo;0;AL;064A 0654;;;;N;ARABIC LETTER HAMZAH ON YA;;;; +0627;ARABIC LETTER ALEF;Lo;0;AL;;;;;N;;;;; +0628;ARABIC LETTER BEH;Lo;0;AL;;;;;N;ARABIC LETTER BAA;;;; +0629;ARABIC LETTER TEH MARBUTA;Lo;0;AL;;;;;N;ARABIC LETTER TAA MARBUTAH;;;; +062A;ARABIC LETTER TEH;Lo;0;AL;;;;;N;ARABIC LETTER TAA;;;; +062B;ARABIC LETTER THEH;Lo;0;AL;;;;;N;ARABIC LETTER THAA;;;; +062C;ARABIC LETTER JEEM;Lo;0;AL;;;;;N;;;;; +062D;ARABIC LETTER HAH;Lo;0;AL;;;;;N;ARABIC LETTER HAA;;;; +062E;ARABIC LETTER KHAH;Lo;0;AL;;;;;N;ARABIC LETTER KHAA;;;; +062F;ARABIC LETTER DAL;Lo;0;AL;;;;;N;;;;; +0630;ARABIC LETTER THAL;Lo;0;AL;;;;;N;;;;; +0631;ARABIC LETTER REH;Lo;0;AL;;;;;N;ARABIC LETTER RA;;;; +0632;ARABIC LETTER ZAIN;Lo;0;AL;;;;;N;;;;; +0633;ARABIC LETTER SEEN;Lo;0;AL;;;;;N;;;;; +0634;ARABIC LETTER SHEEN;Lo;0;AL;;;;;N;;;;; +0635;ARABIC LETTER SAD;Lo;0;AL;;;;;N;;;;; +0636;ARABIC LETTER DAD;Lo;0;AL;;;;;N;;;;; +0637;ARABIC LETTER TAH;Lo;0;AL;;;;;N;;;;; +0638;ARABIC LETTER ZAH;Lo;0;AL;;;;;N;ARABIC LETTER DHAH;;;; +0639;ARABIC LETTER AIN;Lo;0;AL;;;;;N;;;;; +063A;ARABIC LETTER GHAIN;Lo;0;AL;;;;;N;;;;; +063B;ARABIC LETTER KEHEH WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +063C;ARABIC LETTER KEHEH WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;;;;; +063D;ARABIC LETTER FARSI YEH WITH INVERTED V;Lo;0;AL;;;;;N;;;;; +063E;ARABIC LETTER FARSI YEH WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +063F;ARABIC LETTER FARSI YEH WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +0640;ARABIC TATWEEL;Lm;0;AL;;;;;N;;;;; +0641;ARABIC LETTER FEH;Lo;0;AL;;;;;N;ARABIC LETTER FA;;;; +0642;ARABIC LETTER QAF;Lo;0;AL;;;;;N;;;;; +0643;ARABIC LETTER KAF;Lo;0;AL;;;;;N;ARABIC LETTER CAF;;;; +0644;ARABIC LETTER LAM;Lo;0;AL;;;;;N;;;;; +0645;ARABIC LETTER MEEM;Lo;0;AL;;;;;N;;;;; +0646;ARABIC LETTER NOON;Lo;0;AL;;;;;N;;;;; +0647;ARABIC LETTER HEH;Lo;0;AL;;;;;N;ARABIC LETTER HA;;;; +0648;ARABIC LETTER WAW;Lo;0;AL;;;;;N;;;;; +0649;ARABIC LETTER ALEF MAKSURA;Lo;0;AL;;;;;N;ARABIC LETTER ALEF MAQSURAH;;;; +064A;ARABIC LETTER YEH;Lo;0;AL;;;;;N;ARABIC LETTER YA;;;; +064B;ARABIC FATHATAN;Mn;27;NSM;;;;;N;;;;; +064C;ARABIC DAMMATAN;Mn;28;NSM;;;;;N;;;;; +064D;ARABIC KASRATAN;Mn;29;NSM;;;;;N;;;;; +064E;ARABIC FATHA;Mn;30;NSM;;;;;N;ARABIC FATHAH;;;; +064F;ARABIC DAMMA;Mn;31;NSM;;;;;N;ARABIC DAMMAH;;;; +0650;ARABIC KASRA;Mn;32;NSM;;;;;N;ARABIC KASRAH;;;; +0651;ARABIC SHADDA;Mn;33;NSM;;;;;N;ARABIC SHADDAH;;;; +0652;ARABIC SUKUN;Mn;34;NSM;;;;;N;;;;; +0653;ARABIC MADDAH ABOVE;Mn;230;NSM;;;;;N;;;;; +0654;ARABIC HAMZA ABOVE;Mn;230;NSM;;;;;N;;;;; +0655;ARABIC HAMZA BELOW;Mn;220;NSM;;;;;N;;;;; +0656;ARABIC SUBSCRIPT ALEF;Mn;220;NSM;;;;;N;;;;; +0657;ARABIC INVERTED DAMMA;Mn;230;NSM;;;;;N;;;;; +0658;ARABIC MARK NOON GHUNNA;Mn;230;NSM;;;;;N;;;;; +0659;ARABIC ZWARAKAY;Mn;230;NSM;;;;;N;;;;; +065A;ARABIC VOWEL SIGN SMALL V ABOVE;Mn;230;NSM;;;;;N;;;;; +065B;ARABIC VOWEL SIGN INVERTED SMALL V ABOVE;Mn;230;NSM;;;;;N;;;;; +065C;ARABIC VOWEL SIGN DOT BELOW;Mn;220;NSM;;;;;N;;;;; +065D;ARABIC REVERSED DAMMA;Mn;230;NSM;;;;;N;;;;; +065E;ARABIC FATHA WITH TWO DOTS;Mn;230;NSM;;;;;N;;;;; +065F;ARABIC WAVY HAMZA BELOW;Mn;220;NSM;;;;;N;;;;; +0660;ARABIC-INDIC DIGIT ZERO;Nd;0;AN;;0;0;0;N;;;;; +0661;ARABIC-INDIC DIGIT ONE;Nd;0;AN;;1;1;1;N;;;;; +0662;ARABIC-INDIC DIGIT TWO;Nd;0;AN;;2;2;2;N;;;;; +0663;ARABIC-INDIC DIGIT THREE;Nd;0;AN;;3;3;3;N;;;;; +0664;ARABIC-INDIC DIGIT FOUR;Nd;0;AN;;4;4;4;N;;;;; +0665;ARABIC-INDIC DIGIT FIVE;Nd;0;AN;;5;5;5;N;;;;; +0666;ARABIC-INDIC DIGIT SIX;Nd;0;AN;;6;6;6;N;;;;; +0667;ARABIC-INDIC DIGIT SEVEN;Nd;0;AN;;7;7;7;N;;;;; +0668;ARABIC-INDIC DIGIT EIGHT;Nd;0;AN;;8;8;8;N;;;;; +0669;ARABIC-INDIC DIGIT NINE;Nd;0;AN;;9;9;9;N;;;;; +066A;ARABIC PERCENT SIGN;Po;0;ET;;;;;N;;;;; +066B;ARABIC DECIMAL SEPARATOR;Po;0;AN;;;;;N;;;;; +066C;ARABIC THOUSANDS SEPARATOR;Po;0;AN;;;;;N;;;;; +066D;ARABIC FIVE POINTED STAR;Po;0;AL;;;;;N;;;;; +066E;ARABIC LETTER DOTLESS BEH;Lo;0;AL;;;;;N;;;;; +066F;ARABIC LETTER DOTLESS QAF;Lo;0;AL;;;;;N;;;;; +0670;ARABIC LETTER SUPERSCRIPT ALEF;Mn;35;NSM;;;;;N;ARABIC ALEF ABOVE;;;; +0671;ARABIC LETTER ALEF WASLA;Lo;0;AL;;;;;N;ARABIC LETTER HAMZAT WASL ON ALEF;;;; +0672;ARABIC LETTER ALEF WITH WAVY HAMZA ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER WAVY HAMZAH ON ALEF;;;; +0673;ARABIC LETTER ALEF WITH WAVY HAMZA BELOW;Lo;0;AL;;;;;N;ARABIC LETTER WAVY HAMZAH UNDER ALEF;;;; +0674;ARABIC LETTER HIGH HAMZA;Lo;0;AL;;;;;N;ARABIC LETTER HIGH HAMZAH;;;; +0675;ARABIC LETTER HIGH HAMZA ALEF;Lo;0;AL;<compat> 0627 0674;;;;N;ARABIC LETTER HIGH HAMZAH ALEF;;;; +0676;ARABIC LETTER HIGH HAMZA WAW;Lo;0;AL;<compat> 0648 0674;;;;N;ARABIC LETTER HIGH HAMZAH WAW;;;; +0677;ARABIC LETTER U WITH HAMZA ABOVE;Lo;0;AL;<compat> 06C7 0674;;;;N;ARABIC LETTER HIGH HAMZAH WAW WITH DAMMAH;;;; +0678;ARABIC LETTER HIGH HAMZA YEH;Lo;0;AL;<compat> 064A 0674;;;;N;ARABIC LETTER HIGH HAMZAH YA;;;; +0679;ARABIC LETTER TTEH;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH SMALL TAH;;;; +067A;ARABIC LETTER TTEHEH;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH TWO DOTS VERTICAL ABOVE;;;; +067B;ARABIC LETTER BEEH;Lo;0;AL;;;;;N;ARABIC LETTER BAA WITH TWO DOTS VERTICAL BELOW;;;; +067C;ARABIC LETTER TEH WITH RING;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH RING;;;; +067D;ARABIC LETTER TEH WITH THREE DOTS ABOVE DOWNWARDS;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH THREE DOTS ABOVE DOWNWARD;;;; +067E;ARABIC LETTER PEH;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH THREE DOTS BELOW;;;; +067F;ARABIC LETTER TEHEH;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH FOUR DOTS ABOVE;;;; +0680;ARABIC LETTER BEHEH;Lo;0;AL;;;;;N;ARABIC LETTER BAA WITH FOUR DOTS BELOW;;;; +0681;ARABIC LETTER HAH WITH HAMZA ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER HAMZAH ON HAA;;;; +0682;ARABIC LETTER HAH WITH TWO DOTS VERTICAL ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH TWO DOTS VERTICAL ABOVE;;;; +0683;ARABIC LETTER NYEH;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH MIDDLE TWO DOTS;;;; +0684;ARABIC LETTER DYEH;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH MIDDLE TWO DOTS VERTICAL;;;; +0685;ARABIC LETTER HAH WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH THREE DOTS ABOVE;;;; +0686;ARABIC LETTER TCHEH;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH MIDDLE THREE DOTS DOWNWARD;;;; +0687;ARABIC LETTER TCHEHEH;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH MIDDLE FOUR DOTS;;;; +0688;ARABIC LETTER DDAL;Lo;0;AL;;;;;N;ARABIC LETTER DAL WITH SMALL TAH;;;; +0689;ARABIC LETTER DAL WITH RING;Lo;0;AL;;;;;N;;;;; +068A;ARABIC LETTER DAL WITH DOT BELOW;Lo;0;AL;;;;;N;;;;; +068B;ARABIC LETTER DAL WITH DOT BELOW AND SMALL TAH;Lo;0;AL;;;;;N;;;;; +068C;ARABIC LETTER DAHAL;Lo;0;AL;;;;;N;ARABIC LETTER DAL WITH TWO DOTS ABOVE;;;; +068D;ARABIC LETTER DDAHAL;Lo;0;AL;;;;;N;ARABIC LETTER DAL WITH TWO DOTS BELOW;;;; +068E;ARABIC LETTER DUL;Lo;0;AL;;;;;N;ARABIC LETTER DAL WITH THREE DOTS ABOVE;;;; +068F;ARABIC LETTER DAL WITH THREE DOTS ABOVE DOWNWARDS;Lo;0;AL;;;;;N;ARABIC LETTER DAL WITH THREE DOTS ABOVE DOWNWARD;;;; +0690;ARABIC LETTER DAL WITH FOUR DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +0691;ARABIC LETTER RREH;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH SMALL TAH;;;; +0692;ARABIC LETTER REH WITH SMALL V;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH SMALL V;;;; +0693;ARABIC LETTER REH WITH RING;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH RING;;;; +0694;ARABIC LETTER REH WITH DOT BELOW;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH DOT BELOW;;;; +0695;ARABIC LETTER REH WITH SMALL V BELOW;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH SMALL V BELOW;;;; +0696;ARABIC LETTER REH WITH DOT BELOW AND DOT ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH DOT BELOW AND DOT ABOVE;;;; +0697;ARABIC LETTER REH WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH TWO DOTS ABOVE;;;; +0698;ARABIC LETTER JEH;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH THREE DOTS ABOVE;;;; +0699;ARABIC LETTER REH WITH FOUR DOTS ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH FOUR DOTS ABOVE;;;; +069A;ARABIC LETTER SEEN WITH DOT BELOW AND DOT ABOVE;Lo;0;AL;;;;;N;;;;; +069B;ARABIC LETTER SEEN WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;;;;; +069C;ARABIC LETTER SEEN WITH THREE DOTS BELOW AND THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +069D;ARABIC LETTER SAD WITH TWO DOTS BELOW;Lo;0;AL;;;;;N;;;;; +069E;ARABIC LETTER SAD WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +069F;ARABIC LETTER TAH WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +06A0;ARABIC LETTER AIN WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +06A1;ARABIC LETTER DOTLESS FEH;Lo;0;AL;;;;;N;ARABIC LETTER DOTLESS FA;;;; +06A2;ARABIC LETTER FEH WITH DOT MOVED BELOW;Lo;0;AL;;;;;N;ARABIC LETTER FA WITH DOT MOVED BELOW;;;; +06A3;ARABIC LETTER FEH WITH DOT BELOW;Lo;0;AL;;;;;N;ARABIC LETTER FA WITH DOT BELOW;;;; +06A4;ARABIC LETTER VEH;Lo;0;AL;;;;;N;ARABIC LETTER FA WITH THREE DOTS ABOVE;;;; +06A5;ARABIC LETTER FEH WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;ARABIC LETTER FA WITH THREE DOTS BELOW;;;; +06A6;ARABIC LETTER PEHEH;Lo;0;AL;;;;;N;ARABIC LETTER FA WITH FOUR DOTS ABOVE;;;; +06A7;ARABIC LETTER QAF WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;; +06A8;ARABIC LETTER QAF WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +06A9;ARABIC LETTER KEHEH;Lo;0;AL;;;;;N;ARABIC LETTER OPEN CAF;;;; +06AA;ARABIC LETTER SWASH KAF;Lo;0;AL;;;;;N;ARABIC LETTER SWASH CAF;;;; +06AB;ARABIC LETTER KAF WITH RING;Lo;0;AL;;;;;N;ARABIC LETTER CAF WITH RING;;;; +06AC;ARABIC LETTER KAF WITH DOT ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER CAF WITH DOT ABOVE;;;; +06AD;ARABIC LETTER NG;Lo;0;AL;;;;;N;ARABIC LETTER CAF WITH THREE DOTS ABOVE;;;; +06AE;ARABIC LETTER KAF WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;ARABIC LETTER CAF WITH THREE DOTS BELOW;;;; +06AF;ARABIC LETTER GAF;Lo;0;AL;;;;;N;;;;; +06B0;ARABIC LETTER GAF WITH RING;Lo;0;AL;;;;;N;;;;; +06B1;ARABIC LETTER NGOEH;Lo;0;AL;;;;;N;ARABIC LETTER GAF WITH TWO DOTS ABOVE;;;; +06B2;ARABIC LETTER GAF WITH TWO DOTS BELOW;Lo;0;AL;;;;;N;;;;; +06B3;ARABIC LETTER GUEH;Lo;0;AL;;;;;N;ARABIC LETTER GAF WITH TWO DOTS VERTICAL BELOW;;;; +06B4;ARABIC LETTER GAF WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +06B5;ARABIC LETTER LAM WITH SMALL V;Lo;0;AL;;;;;N;;;;; +06B6;ARABIC LETTER LAM WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;; +06B7;ARABIC LETTER LAM WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +06B8;ARABIC LETTER LAM WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;;;;; +06B9;ARABIC LETTER NOON WITH DOT BELOW;Lo;0;AL;;;;;N;;;;; +06BA;ARABIC LETTER NOON GHUNNA;Lo;0;AL;;;;;N;ARABIC LETTER DOTLESS NOON;;;; +06BB;ARABIC LETTER RNOON;Lo;0;AL;;;;;N;ARABIC LETTER DOTLESS NOON WITH SMALL TAH;;;; +06BC;ARABIC LETTER NOON WITH RING;Lo;0;AL;;;;;N;;;;; +06BD;ARABIC LETTER NOON WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +06BE;ARABIC LETTER HEH DOACHASHMEE;Lo;0;AL;;;;;N;ARABIC LETTER KNOTTED HA;;;; +06BF;ARABIC LETTER TCHEH WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;; +06C0;ARABIC LETTER HEH WITH YEH ABOVE;Lo;0;AL;06D5 0654;;;;N;ARABIC LETTER HAMZAH ON HA;;;; +06C1;ARABIC LETTER HEH GOAL;Lo;0;AL;;;;;N;ARABIC LETTER HA GOAL;;;; +06C2;ARABIC LETTER HEH GOAL WITH HAMZA ABOVE;Lo;0;AL;06C1 0654;;;;N;ARABIC LETTER HAMZAH ON HA GOAL;;;; +06C3;ARABIC LETTER TEH MARBUTA GOAL;Lo;0;AL;;;;;N;ARABIC LETTER TAA MARBUTAH GOAL;;;; +06C4;ARABIC LETTER WAW WITH RING;Lo;0;AL;;;;;N;;;;; +06C5;ARABIC LETTER KIRGHIZ OE;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH BAR;;;; +06C6;ARABIC LETTER OE;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH SMALL V;;;; +06C7;ARABIC LETTER U;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH DAMMAH;;;; +06C8;ARABIC LETTER YU;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH ALEF ABOVE;;;; +06C9;ARABIC LETTER KIRGHIZ YU;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH INVERTED SMALL V;;;; +06CA;ARABIC LETTER WAW WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +06CB;ARABIC LETTER VE;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH THREE DOTS ABOVE;;;; +06CC;ARABIC LETTER FARSI YEH;Lo;0;AL;;;;;N;ARABIC LETTER DOTLESS YA;;;; +06CD;ARABIC LETTER YEH WITH TAIL;Lo;0;AL;;;;;N;ARABIC LETTER YA WITH TAIL;;;; +06CE;ARABIC LETTER YEH WITH SMALL V;Lo;0;AL;;;;;N;ARABIC LETTER YA WITH SMALL V;;;; +06CF;ARABIC LETTER WAW WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;; +06D0;ARABIC LETTER E;Lo;0;AL;;;;;N;ARABIC LETTER YA WITH TWO DOTS VERTICAL BELOW;;;; +06D1;ARABIC LETTER YEH WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;ARABIC LETTER YA WITH THREE DOTS BELOW;;;; +06D2;ARABIC LETTER YEH BARREE;Lo;0;AL;;;;;N;ARABIC LETTER YA BARREE;;;; +06D3;ARABIC LETTER YEH BARREE WITH HAMZA ABOVE;Lo;0;AL;06D2 0654;;;;N;ARABIC LETTER HAMZAH ON YA BARREE;;;; +06D4;ARABIC FULL STOP;Po;0;AL;;;;;N;ARABIC PERIOD;;;; +06D5;ARABIC LETTER AE;Lo;0;AL;;;;;N;;;;; +06D6;ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA;Mn;230;NSM;;;;;N;;;;; +06D7;ARABIC SMALL HIGH LIGATURE QAF WITH LAM WITH ALEF MAKSURA;Mn;230;NSM;;;;;N;;;;; +06D8;ARABIC SMALL HIGH MEEM INITIAL FORM;Mn;230;NSM;;;;;N;;;;; +06D9;ARABIC SMALL HIGH LAM ALEF;Mn;230;NSM;;;;;N;;;;; +06DA;ARABIC SMALL HIGH JEEM;Mn;230;NSM;;;;;N;;;;; +06DB;ARABIC SMALL HIGH THREE DOTS;Mn;230;NSM;;;;;N;;;;; +06DC;ARABIC SMALL HIGH SEEN;Mn;230;NSM;;;;;N;;;;; +06DD;ARABIC END OF AYAH;Cf;0;AN;;;;;N;;;;; +06DE;ARABIC START OF RUB EL HIZB;So;0;ON;;;;;N;;;;; +06DF;ARABIC SMALL HIGH ROUNDED ZERO;Mn;230;NSM;;;;;N;;;;; +06E0;ARABIC SMALL HIGH UPRIGHT RECTANGULAR ZERO;Mn;230;NSM;;;;;N;;;;; +06E1;ARABIC SMALL HIGH DOTLESS HEAD OF KHAH;Mn;230;NSM;;;;;N;;;;; +06E2;ARABIC SMALL HIGH MEEM ISOLATED FORM;Mn;230;NSM;;;;;N;;;;; +06E3;ARABIC SMALL LOW SEEN;Mn;220;NSM;;;;;N;;;;; +06E4;ARABIC SMALL HIGH MADDA;Mn;230;NSM;;;;;N;;;;; +06E5;ARABIC SMALL WAW;Lm;0;AL;;;;;N;;;;; +06E6;ARABIC SMALL YEH;Lm;0;AL;;;;;N;;;;; +06E7;ARABIC SMALL HIGH YEH;Mn;230;NSM;;;;;N;;;;; +06E8;ARABIC SMALL HIGH NOON;Mn;230;NSM;;;;;N;;;;; +06E9;ARABIC PLACE OF SAJDAH;So;0;ON;;;;;N;;;;; +06EA;ARABIC EMPTY CENTRE LOW STOP;Mn;220;NSM;;;;;N;;;;; +06EB;ARABIC EMPTY CENTRE HIGH STOP;Mn;230;NSM;;;;;N;;;;; +06EC;ARABIC ROUNDED HIGH STOP WITH FILLED CENTRE;Mn;230;NSM;;;;;N;;;;; +06ED;ARABIC SMALL LOW MEEM;Mn;220;NSM;;;;;N;;;;; +06EE;ARABIC LETTER DAL WITH INVERTED V;Lo;0;AL;;;;;N;;;;; +06EF;ARABIC LETTER REH WITH INVERTED V;Lo;0;AL;;;;;N;;;;; +06F0;EXTENDED ARABIC-INDIC DIGIT ZERO;Nd;0;EN;;0;0;0;N;EASTERN ARABIC-INDIC DIGIT ZERO;;;; +06F1;EXTENDED ARABIC-INDIC DIGIT ONE;Nd;0;EN;;1;1;1;N;EASTERN ARABIC-INDIC DIGIT ONE;;;; +06F2;EXTENDED ARABIC-INDIC DIGIT TWO;Nd;0;EN;;2;2;2;N;EASTERN ARABIC-INDIC DIGIT TWO;;;; +06F3;EXTENDED ARABIC-INDIC DIGIT THREE;Nd;0;EN;;3;3;3;N;EASTERN ARABIC-INDIC DIGIT THREE;;;; +06F4;EXTENDED ARABIC-INDIC DIGIT FOUR;Nd;0;EN;;4;4;4;N;EASTERN ARABIC-INDIC DIGIT FOUR;;;; +06F5;EXTENDED ARABIC-INDIC DIGIT FIVE;Nd;0;EN;;5;5;5;N;EASTERN ARABIC-INDIC DIGIT FIVE;;;; +06F6;EXTENDED ARABIC-INDIC DIGIT SIX;Nd;0;EN;;6;6;6;N;EASTERN ARABIC-INDIC DIGIT SIX;;;; +06F7;EXTENDED ARABIC-INDIC DIGIT SEVEN;Nd;0;EN;;7;7;7;N;EASTERN ARABIC-INDIC DIGIT SEVEN;;;; +06F8;EXTENDED ARABIC-INDIC DIGIT EIGHT;Nd;0;EN;;8;8;8;N;EASTERN ARABIC-INDIC DIGIT EIGHT;;;; +06F9;EXTENDED ARABIC-INDIC DIGIT NINE;Nd;0;EN;;9;9;9;N;EASTERN ARABIC-INDIC DIGIT NINE;;;; +06FA;ARABIC LETTER SHEEN WITH DOT BELOW;Lo;0;AL;;;;;N;;;;; +06FB;ARABIC LETTER DAD WITH DOT BELOW;Lo;0;AL;;;;;N;;;;; +06FC;ARABIC LETTER GHAIN WITH DOT BELOW;Lo;0;AL;;;;;N;;;;; +06FD;ARABIC SIGN SINDHI AMPERSAND;So;0;AL;;;;;N;;;;; +06FE;ARABIC SIGN SINDHI POSTPOSITION MEN;So;0;AL;;;;;N;;;;; +06FF;ARABIC LETTER HEH WITH INVERTED V;Lo;0;AL;;;;;N;;;;; +0700;SYRIAC END OF PARAGRAPH;Po;0;AL;;;;;N;;;;; +0701;SYRIAC SUPRALINEAR FULL STOP;Po;0;AL;;;;;N;;;;; +0702;SYRIAC SUBLINEAR FULL STOP;Po;0;AL;;;;;N;;;;; +0703;SYRIAC SUPRALINEAR COLON;Po;0;AL;;;;;N;;;;; +0704;SYRIAC SUBLINEAR COLON;Po;0;AL;;;;;N;;;;; +0705;SYRIAC HORIZONTAL COLON;Po;0;AL;;;;;N;;;;; +0706;SYRIAC COLON SKEWED LEFT;Po;0;AL;;;;;N;;;;; +0707;SYRIAC COLON SKEWED RIGHT;Po;0;AL;;;;;N;;;;; +0708;SYRIAC SUPRALINEAR COLON SKEWED LEFT;Po;0;AL;;;;;N;;;;; +0709;SYRIAC SUBLINEAR COLON SKEWED RIGHT;Po;0;AL;;;;;N;;;;; +070A;SYRIAC CONTRACTION;Po;0;AL;;;;;N;;;;; +070B;SYRIAC HARKLEAN OBELUS;Po;0;AL;;;;;N;;;;; +070C;SYRIAC HARKLEAN METOBELUS;Po;0;AL;;;;;N;;;;; +070D;SYRIAC HARKLEAN ASTERISCUS;Po;0;AL;;;;;N;;;;; +070F;SYRIAC ABBREVIATION MARK;Cf;0;AL;;;;;N;;;;; +0710;SYRIAC LETTER ALAPH;Lo;0;AL;;;;;N;;;;; +0711;SYRIAC LETTER SUPERSCRIPT ALAPH;Mn;36;NSM;;;;;N;;;;; +0712;SYRIAC LETTER BETH;Lo;0;AL;;;;;N;;;;; +0713;SYRIAC LETTER GAMAL;Lo;0;AL;;;;;N;;;;; +0714;SYRIAC LETTER GAMAL GARSHUNI;Lo;0;AL;;;;;N;;;;; +0715;SYRIAC LETTER DALATH;Lo;0;AL;;;;;N;;;;; +0716;SYRIAC LETTER DOTLESS DALATH RISH;Lo;0;AL;;;;;N;;;;; +0717;SYRIAC LETTER HE;Lo;0;AL;;;;;N;;;;; +0718;SYRIAC LETTER WAW;Lo;0;AL;;;;;N;;;;; +0719;SYRIAC LETTER ZAIN;Lo;0;AL;;;;;N;;;;; +071A;SYRIAC LETTER HETH;Lo;0;AL;;;;;N;;;;; +071B;SYRIAC LETTER TETH;Lo;0;AL;;;;;N;;;;; +071C;SYRIAC LETTER TETH GARSHUNI;Lo;0;AL;;;;;N;;;;; +071D;SYRIAC LETTER YUDH;Lo;0;AL;;;;;N;;;;; +071E;SYRIAC LETTER YUDH HE;Lo;0;AL;;;;;N;;;;; +071F;SYRIAC LETTER KAPH;Lo;0;AL;;;;;N;;;;; +0720;SYRIAC LETTER LAMADH;Lo;0;AL;;;;;N;;;;; +0721;SYRIAC LETTER MIM;Lo;0;AL;;;;;N;;;;; +0722;SYRIAC LETTER NUN;Lo;0;AL;;;;;N;;;;; +0723;SYRIAC LETTER SEMKATH;Lo;0;AL;;;;;N;;;;; +0724;SYRIAC LETTER FINAL SEMKATH;Lo;0;AL;;;;;N;;;;; +0725;SYRIAC LETTER E;Lo;0;AL;;;;;N;;;;; +0726;SYRIAC LETTER PE;Lo;0;AL;;;;;N;;;;; +0727;SYRIAC LETTER REVERSED PE;Lo;0;AL;;;;;N;;;;; +0728;SYRIAC LETTER SADHE;Lo;0;AL;;;;;N;;;;; +0729;SYRIAC LETTER QAPH;Lo;0;AL;;;;;N;;;;; +072A;SYRIAC LETTER RISH;Lo;0;AL;;;;;N;;;;; +072B;SYRIAC LETTER SHIN;Lo;0;AL;;;;;N;;;;; +072C;SYRIAC LETTER TAW;Lo;0;AL;;;;;N;;;;; +072D;SYRIAC LETTER PERSIAN BHETH;Lo;0;AL;;;;;N;;;;; +072E;SYRIAC LETTER PERSIAN GHAMAL;Lo;0;AL;;;;;N;;;;; +072F;SYRIAC LETTER PERSIAN DHALATH;Lo;0;AL;;;;;N;;;;; +0730;SYRIAC PTHAHA ABOVE;Mn;230;NSM;;;;;N;;;;; +0731;SYRIAC PTHAHA BELOW;Mn;220;NSM;;;;;N;;;;; +0732;SYRIAC PTHAHA DOTTED;Mn;230;NSM;;;;;N;;;;; +0733;SYRIAC ZQAPHA ABOVE;Mn;230;NSM;;;;;N;;;;; +0734;SYRIAC ZQAPHA BELOW;Mn;220;NSM;;;;;N;;;;; +0735;SYRIAC ZQAPHA DOTTED;Mn;230;NSM;;;;;N;;;;; +0736;SYRIAC RBASA ABOVE;Mn;230;NSM;;;;;N;;;;; +0737;SYRIAC RBASA BELOW;Mn;220;NSM;;;;;N;;;;; +0738;SYRIAC DOTTED ZLAMA HORIZONTAL;Mn;220;NSM;;;;;N;;;;; +0739;SYRIAC DOTTED ZLAMA ANGULAR;Mn;220;NSM;;;;;N;;;;; +073A;SYRIAC HBASA ABOVE;Mn;230;NSM;;;;;N;;;;; +073B;SYRIAC HBASA BELOW;Mn;220;NSM;;;;;N;;;;; +073C;SYRIAC HBASA-ESASA DOTTED;Mn;220;NSM;;;;;N;;;;; +073D;SYRIAC ESASA ABOVE;Mn;230;NSM;;;;;N;;;;; +073E;SYRIAC ESASA BELOW;Mn;220;NSM;;;;;N;;;;; +073F;SYRIAC RWAHA;Mn;230;NSM;;;;;N;;;;; +0740;SYRIAC FEMININE DOT;Mn;230;NSM;;;;;N;;;;; +0741;SYRIAC QUSHSHAYA;Mn;230;NSM;;;;;N;;;;; +0742;SYRIAC RUKKAKHA;Mn;220;NSM;;;;;N;;;;; +0743;SYRIAC TWO VERTICAL DOTS ABOVE;Mn;230;NSM;;;;;N;;;;; +0744;SYRIAC TWO VERTICAL DOTS BELOW;Mn;220;NSM;;;;;N;;;;; +0745;SYRIAC THREE DOTS ABOVE;Mn;230;NSM;;;;;N;;;;; +0746;SYRIAC THREE DOTS BELOW;Mn;220;NSM;;;;;N;;;;; +0747;SYRIAC OBLIQUE LINE ABOVE;Mn;230;NSM;;;;;N;;;;; +0748;SYRIAC OBLIQUE LINE BELOW;Mn;220;NSM;;;;;N;;;;; +0749;SYRIAC MUSIC;Mn;230;NSM;;;;;N;;;;; +074A;SYRIAC BARREKH;Mn;230;NSM;;;;;N;;;;; +074D;SYRIAC LETTER SOGDIAN ZHAIN;Lo;0;AL;;;;;N;;;;; +074E;SYRIAC LETTER SOGDIAN KHAPH;Lo;0;AL;;;;;N;;;;; +074F;SYRIAC LETTER SOGDIAN FE;Lo;0;AL;;;;;N;;;;; +0750;ARABIC LETTER BEH WITH THREE DOTS HORIZONTALLY BELOW;Lo;0;AL;;;;;N;;;;; +0751;ARABIC LETTER BEH WITH DOT BELOW AND THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +0752;ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW;Lo;0;AL;;;;;N;;;;; +0753;ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW AND TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +0754;ARABIC LETTER BEH WITH TWO DOTS BELOW AND DOT ABOVE;Lo;0;AL;;;;;N;;;;; +0755;ARABIC LETTER BEH WITH INVERTED SMALL V BELOW;Lo;0;AL;;;;;N;;;;; +0756;ARABIC LETTER BEH WITH SMALL V;Lo;0;AL;;;;;N;;;;; +0757;ARABIC LETTER HAH WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +0758;ARABIC LETTER HAH WITH THREE DOTS POINTING UPWARDS BELOW;Lo;0;AL;;;;;N;;;;; +0759;ARABIC LETTER DAL WITH TWO DOTS VERTICALLY BELOW AND SMALL TAH;Lo;0;AL;;;;;N;;;;; +075A;ARABIC LETTER DAL WITH INVERTED SMALL V BELOW;Lo;0;AL;;;;;N;;;;; +075B;ARABIC LETTER REH WITH STROKE;Lo;0;AL;;;;;N;;;;; +075C;ARABIC LETTER SEEN WITH FOUR DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +075D;ARABIC LETTER AIN WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +075E;ARABIC LETTER AIN WITH THREE DOTS POINTING DOWNWARDS ABOVE;Lo;0;AL;;;;;N;;;;; +075F;ARABIC LETTER AIN WITH TWO DOTS VERTICALLY ABOVE;Lo;0;AL;;;;;N;;;;; +0760;ARABIC LETTER FEH WITH TWO DOTS BELOW;Lo;0;AL;;;;;N;;;;; +0761;ARABIC LETTER FEH WITH THREE DOTS POINTING UPWARDS BELOW;Lo;0;AL;;;;;N;;;;; +0762;ARABIC LETTER KEHEH WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;; +0763;ARABIC LETTER KEHEH WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +0764;ARABIC LETTER KEHEH WITH THREE DOTS POINTING UPWARDS BELOW;Lo;0;AL;;;;;N;;;;; +0765;ARABIC LETTER MEEM WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;; +0766;ARABIC LETTER MEEM WITH DOT BELOW;Lo;0;AL;;;;;N;;;;; +0767;ARABIC LETTER NOON WITH TWO DOTS BELOW;Lo;0;AL;;;;;N;;;;; +0768;ARABIC LETTER NOON WITH SMALL TAH;Lo;0;AL;;;;;N;;;;; +0769;ARABIC LETTER NOON WITH SMALL V;Lo;0;AL;;;;;N;;;;; +076A;ARABIC LETTER LAM WITH BAR;Lo;0;AL;;;;;N;;;;; +076B;ARABIC LETTER REH WITH TWO DOTS VERTICALLY ABOVE;Lo;0;AL;;;;;N;;;;; +076C;ARABIC LETTER REH WITH HAMZA ABOVE;Lo;0;AL;;;;;N;;;;; +076D;ARABIC LETTER SEEN WITH TWO DOTS VERTICALLY ABOVE;Lo;0;AL;;;;;N;;;;; +076E;ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH BELOW;Lo;0;AL;;;;;N;;;;; +076F;ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH AND TWO DOTS;Lo;0;AL;;;;;N;;;;; +0770;ARABIC LETTER SEEN WITH SMALL ARABIC LETTER TAH AND TWO DOTS;Lo;0;AL;;;;;N;;;;; +0771;ARABIC LETTER REH WITH SMALL ARABIC LETTER TAH AND TWO DOTS;Lo;0;AL;;;;;N;;;;; +0772;ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH ABOVE;Lo;0;AL;;;;;N;;;;; +0773;ARABIC LETTER ALEF WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE;Lo;0;AL;;;;;N;;;;; +0774;ARABIC LETTER ALEF WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE;Lo;0;AL;;;;;N;;;;; +0775;ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE;Lo;0;AL;;;;;N;;;;; +0776;ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE;Lo;0;AL;;;;;N;;;;; +0777;ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT FOUR BELOW;Lo;0;AL;;;;;N;;;;; +0778;ARABIC LETTER WAW WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE;Lo;0;AL;;;;;N;;;;; +0779;ARABIC LETTER WAW WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE;Lo;0;AL;;;;;N;;;;; +077A;ARABIC LETTER YEH BARREE WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE;Lo;0;AL;;;;;N;;;;; +077B;ARABIC LETTER YEH BARREE WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE;Lo;0;AL;;;;;N;;;;; +077C;ARABIC LETTER HAH WITH EXTENDED ARABIC-INDIC DIGIT FOUR BELOW;Lo;0;AL;;;;;N;;;;; +077D;ARABIC LETTER SEEN WITH EXTENDED ARABIC-INDIC DIGIT FOUR ABOVE;Lo;0;AL;;;;;N;;;;; +077E;ARABIC LETTER SEEN WITH INVERTED V;Lo;0;AL;;;;;N;;;;; +077F;ARABIC LETTER KAF WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +0780;THAANA LETTER HAA;Lo;0;AL;;;;;N;;;;; +0781;THAANA LETTER SHAVIYANI;Lo;0;AL;;;;;N;;;;; +0782;THAANA LETTER NOONU;Lo;0;AL;;;;;N;;;;; +0783;THAANA LETTER RAA;Lo;0;AL;;;;;N;;;;; +0784;THAANA LETTER BAA;Lo;0;AL;;;;;N;;;;; +0785;THAANA LETTER LHAVIYANI;Lo;0;AL;;;;;N;;;;; +0786;THAANA LETTER KAAFU;Lo;0;AL;;;;;N;;;;; +0787;THAANA LETTER ALIFU;Lo;0;AL;;;;;N;;;;; +0788;THAANA LETTER VAAVU;Lo;0;AL;;;;;N;;;;; +0789;THAANA LETTER MEEMU;Lo;0;AL;;;;;N;;;;; +078A;THAANA LETTER FAAFU;Lo;0;AL;;;;;N;;;;; +078B;THAANA LETTER DHAALU;Lo;0;AL;;;;;N;;;;; +078C;THAANA LETTER THAA;Lo;0;AL;;;;;N;;;;; +078D;THAANA LETTER LAAMU;Lo;0;AL;;;;;N;;;;; +078E;THAANA LETTER GAAFU;Lo;0;AL;;;;;N;;;;; +078F;THAANA LETTER GNAVIYANI;Lo;0;AL;;;;;N;;;;; +0790;THAANA LETTER SEENU;Lo;0;AL;;;;;N;;;;; +0791;THAANA LETTER DAVIYANI;Lo;0;AL;;;;;N;;;;; +0792;THAANA LETTER ZAVIYANI;Lo;0;AL;;;;;N;;;;; +0793;THAANA LETTER TAVIYANI;Lo;0;AL;;;;;N;;;;; +0794;THAANA LETTER YAA;Lo;0;AL;;;;;N;;;;; +0795;THAANA LETTER PAVIYANI;Lo;0;AL;;;;;N;;;;; +0796;THAANA LETTER JAVIYANI;Lo;0;AL;;;;;N;;;;; +0797;THAANA LETTER CHAVIYANI;Lo;0;AL;;;;;N;;;;; +0798;THAANA LETTER TTAA;Lo;0;AL;;;;;N;;;;; +0799;THAANA LETTER HHAA;Lo;0;AL;;;;;N;;;;; +079A;THAANA LETTER KHAA;Lo;0;AL;;;;;N;;;;; +079B;THAANA LETTER THAALU;Lo;0;AL;;;;;N;;;;; +079C;THAANA LETTER ZAA;Lo;0;AL;;;;;N;;;;; +079D;THAANA LETTER SHEENU;Lo;0;AL;;;;;N;;;;; +079E;THAANA LETTER SAADHU;Lo;0;AL;;;;;N;;;;; +079F;THAANA LETTER DAADHU;Lo;0;AL;;;;;N;;;;; +07A0;THAANA LETTER TO;Lo;0;AL;;;;;N;;;;; +07A1;THAANA LETTER ZO;Lo;0;AL;;;;;N;;;;; +07A2;THAANA LETTER AINU;Lo;0;AL;;;;;N;;;;; +07A3;THAANA LETTER GHAINU;Lo;0;AL;;;;;N;;;;; +07A4;THAANA LETTER QAAFU;Lo;0;AL;;;;;N;;;;; +07A5;THAANA LETTER WAAVU;Lo;0;AL;;;;;N;;;;; +07A6;THAANA ABAFILI;Mn;0;NSM;;;;;N;;;;; +07A7;THAANA AABAAFILI;Mn;0;NSM;;;;;N;;;;; +07A8;THAANA IBIFILI;Mn;0;NSM;;;;;N;;;;; +07A9;THAANA EEBEEFILI;Mn;0;NSM;;;;;N;;;;; +07AA;THAANA UBUFILI;Mn;0;NSM;;;;;N;;;;; +07AB;THAANA OOBOOFILI;Mn;0;NSM;;;;;N;;;;; +07AC;THAANA EBEFILI;Mn;0;NSM;;;;;N;;;;; +07AD;THAANA EYBEYFILI;Mn;0;NSM;;;;;N;;;;; +07AE;THAANA OBOFILI;Mn;0;NSM;;;;;N;;;;; +07AF;THAANA OABOAFILI;Mn;0;NSM;;;;;N;;;;; +07B0;THAANA SUKUN;Mn;0;NSM;;;;;N;;;;; +07B1;THAANA LETTER NAA;Lo;0;AL;;;;;N;;;;; +07C0;NKO DIGIT ZERO;Nd;0;R;;0;0;0;N;;;;; +07C1;NKO DIGIT ONE;Nd;0;R;;1;1;1;N;;;;; +07C2;NKO DIGIT TWO;Nd;0;R;;2;2;2;N;;;;; +07C3;NKO DIGIT THREE;Nd;0;R;;3;3;3;N;;;;; +07C4;NKO DIGIT FOUR;Nd;0;R;;4;4;4;N;;;;; +07C5;NKO DIGIT FIVE;Nd;0;R;;5;5;5;N;;;;; +07C6;NKO DIGIT SIX;Nd;0;R;;6;6;6;N;;;;; +07C7;NKO DIGIT SEVEN;Nd;0;R;;7;7;7;N;;;;; +07C8;NKO DIGIT EIGHT;Nd;0;R;;8;8;8;N;;;;; +07C9;NKO DIGIT NINE;Nd;0;R;;9;9;9;N;;;;; +07CA;NKO LETTER A;Lo;0;R;;;;;N;;;;; +07CB;NKO LETTER EE;Lo;0;R;;;;;N;;;;; +07CC;NKO LETTER I;Lo;0;R;;;;;N;;;;; +07CD;NKO LETTER E;Lo;0;R;;;;;N;;;;; +07CE;NKO LETTER U;Lo;0;R;;;;;N;;;;; +07CF;NKO LETTER OO;Lo;0;R;;;;;N;;;;; +07D0;NKO LETTER O;Lo;0;R;;;;;N;;;;; +07D1;NKO LETTER DAGBASINNA;Lo;0;R;;;;;N;;;;; +07D2;NKO LETTER N;Lo;0;R;;;;;N;;;;; +07D3;NKO LETTER BA;Lo;0;R;;;;;N;;;;; +07D4;NKO LETTER PA;Lo;0;R;;;;;N;;;;; +07D5;NKO LETTER TA;Lo;0;R;;;;;N;;;;; +07D6;NKO LETTER JA;Lo;0;R;;;;;N;;;;; +07D7;NKO LETTER CHA;Lo;0;R;;;;;N;;;;; +07D8;NKO LETTER DA;Lo;0;R;;;;;N;;;;; +07D9;NKO LETTER RA;Lo;0;R;;;;;N;;;;; +07DA;NKO LETTER RRA;Lo;0;R;;;;;N;;;;; +07DB;NKO LETTER SA;Lo;0;R;;;;;N;;;;; +07DC;NKO LETTER GBA;Lo;0;R;;;;;N;;;;; +07DD;NKO LETTER FA;Lo;0;R;;;;;N;;;;; +07DE;NKO LETTER KA;Lo;0;R;;;;;N;;;;; +07DF;NKO LETTER LA;Lo;0;R;;;;;N;;;;; +07E0;NKO LETTER NA WOLOSO;Lo;0;R;;;;;N;;;;; +07E1;NKO LETTER MA;Lo;0;R;;;;;N;;;;; +07E2;NKO LETTER NYA;Lo;0;R;;;;;N;;;;; +07E3;NKO LETTER NA;Lo;0;R;;;;;N;;;;; +07E4;NKO LETTER HA;Lo;0;R;;;;;N;;;;; +07E5;NKO LETTER WA;Lo;0;R;;;;;N;;;;; +07E6;NKO LETTER YA;Lo;0;R;;;;;N;;;;; +07E7;NKO LETTER NYA WOLOSO;Lo;0;R;;;;;N;;;;; +07E8;NKO LETTER JONA JA;Lo;0;R;;;;;N;;;;; +07E9;NKO LETTER JONA CHA;Lo;0;R;;;;;N;;;;; +07EA;NKO LETTER JONA RA;Lo;0;R;;;;;N;;;;; +07EB;NKO COMBINING SHORT HIGH TONE;Mn;230;NSM;;;;;N;;;;; +07EC;NKO COMBINING SHORT LOW TONE;Mn;230;NSM;;;;;N;;;;; +07ED;NKO COMBINING SHORT RISING TONE;Mn;230;NSM;;;;;N;;;;; +07EE;NKO COMBINING LONG DESCENDING TONE;Mn;230;NSM;;;;;N;;;;; +07EF;NKO COMBINING LONG HIGH TONE;Mn;230;NSM;;;;;N;;;;; +07F0;NKO COMBINING LONG LOW TONE;Mn;230;NSM;;;;;N;;;;; +07F1;NKO COMBINING LONG RISING TONE;Mn;230;NSM;;;;;N;;;;; +07F2;NKO COMBINING NASALIZATION MARK;Mn;220;NSM;;;;;N;;;;; +07F3;NKO COMBINING DOUBLE DOT ABOVE;Mn;230;NSM;;;;;N;;;;; +07F4;NKO HIGH TONE APOSTROPHE;Lm;0;R;;;;;N;;;;; +07F5;NKO LOW TONE APOSTROPHE;Lm;0;R;;;;;N;;;;; +07F6;NKO SYMBOL OO DENNEN;So;0;ON;;;;;N;;;;; +07F7;NKO SYMBOL GBAKURUNEN;Po;0;ON;;;;;N;;;;; +07F8;NKO COMMA;Po;0;ON;;;;;N;;;;; +07F9;NKO EXCLAMATION MARK;Po;0;ON;;;;;N;;;;; +07FA;NKO LAJANYALAN;Lm;0;R;;;;;N;;;;; +07FD;NKO DANTAYALAN;Mn;220;NSM;;;;;N;;;;; +07FE;NKO DOROME SIGN;Sc;0;R;;;;;N;;;;; +07FF;NKO TAMAN SIGN;Sc;0;R;;;;;N;;;;; +0800;SAMARITAN LETTER ALAF;Lo;0;R;;;;;N;;;;; +0801;SAMARITAN LETTER BIT;Lo;0;R;;;;;N;;;;; +0802;SAMARITAN LETTER GAMAN;Lo;0;R;;;;;N;;;;; +0803;SAMARITAN LETTER DALAT;Lo;0;R;;;;;N;;;;; +0804;SAMARITAN LETTER IY;Lo;0;R;;;;;N;;;;; +0805;SAMARITAN LETTER BAA;Lo;0;R;;;;;N;;;;; +0806;SAMARITAN LETTER ZEN;Lo;0;R;;;;;N;;;;; +0807;SAMARITAN LETTER IT;Lo;0;R;;;;;N;;;;; +0808;SAMARITAN LETTER TIT;Lo;0;R;;;;;N;;;;; +0809;SAMARITAN LETTER YUT;Lo;0;R;;;;;N;;;;; +080A;SAMARITAN LETTER KAAF;Lo;0;R;;;;;N;;;;; +080B;SAMARITAN LETTER LABAT;Lo;0;R;;;;;N;;;;; +080C;SAMARITAN LETTER MIM;Lo;0;R;;;;;N;;;;; +080D;SAMARITAN LETTER NUN;Lo;0;R;;;;;N;;;;; +080E;SAMARITAN LETTER SINGAAT;Lo;0;R;;;;;N;;;;; +080F;SAMARITAN LETTER IN;Lo;0;R;;;;;N;;;;; +0810;SAMARITAN LETTER FI;Lo;0;R;;;;;N;;;;; +0811;SAMARITAN LETTER TSAADIY;Lo;0;R;;;;;N;;;;; +0812;SAMARITAN LETTER QUF;Lo;0;R;;;;;N;;;;; +0813;SAMARITAN LETTER RISH;Lo;0;R;;;;;N;;;;; +0814;SAMARITAN LETTER SHAN;Lo;0;R;;;;;N;;;;; +0815;SAMARITAN LETTER TAAF;Lo;0;R;;;;;N;;;;; +0816;SAMARITAN MARK IN;Mn;230;NSM;;;;;N;;;;; +0817;SAMARITAN MARK IN-ALAF;Mn;230;NSM;;;;;N;;;;; +0818;SAMARITAN MARK OCCLUSION;Mn;230;NSM;;;;;N;;;;; +0819;SAMARITAN MARK DAGESH;Mn;230;NSM;;;;;N;;;;; +081A;SAMARITAN MODIFIER LETTER EPENTHETIC YUT;Lm;0;R;;;;;N;;;;; +081B;SAMARITAN MARK EPENTHETIC YUT;Mn;230;NSM;;;;;N;;;;; +081C;SAMARITAN VOWEL SIGN LONG E;Mn;230;NSM;;;;;N;;;;; +081D;SAMARITAN VOWEL SIGN E;Mn;230;NSM;;;;;N;;;;; +081E;SAMARITAN VOWEL SIGN OVERLONG AA;Mn;230;NSM;;;;;N;;;;; +081F;SAMARITAN VOWEL SIGN LONG AA;Mn;230;NSM;;;;;N;;;;; +0820;SAMARITAN VOWEL SIGN AA;Mn;230;NSM;;;;;N;;;;; +0821;SAMARITAN VOWEL SIGN OVERLONG A;Mn;230;NSM;;;;;N;;;;; +0822;SAMARITAN VOWEL SIGN LONG A;Mn;230;NSM;;;;;N;;;;; +0823;SAMARITAN VOWEL SIGN A;Mn;230;NSM;;;;;N;;;;; +0824;SAMARITAN MODIFIER LETTER SHORT A;Lm;0;R;;;;;N;;;;; +0825;SAMARITAN VOWEL SIGN SHORT A;Mn;230;NSM;;;;;N;;;;; +0826;SAMARITAN VOWEL SIGN LONG U;Mn;230;NSM;;;;;N;;;;; +0827;SAMARITAN VOWEL SIGN U;Mn;230;NSM;;;;;N;;;;; +0828;SAMARITAN MODIFIER LETTER I;Lm;0;R;;;;;N;;;;; +0829;SAMARITAN VOWEL SIGN LONG I;Mn;230;NSM;;;;;N;;;;; +082A;SAMARITAN VOWEL SIGN I;Mn;230;NSM;;;;;N;;;;; +082B;SAMARITAN VOWEL SIGN O;Mn;230;NSM;;;;;N;;;;; +082C;SAMARITAN VOWEL SIGN SUKUN;Mn;230;NSM;;;;;N;;;;; +082D;SAMARITAN MARK NEQUDAA;Mn;230;NSM;;;;;N;;;;; +0830;SAMARITAN PUNCTUATION NEQUDAA;Po;0;R;;;;;N;;;;; +0831;SAMARITAN PUNCTUATION AFSAAQ;Po;0;R;;;;;N;;;;; +0832;SAMARITAN PUNCTUATION ANGED;Po;0;R;;;;;N;;;;; +0833;SAMARITAN PUNCTUATION BAU;Po;0;R;;;;;N;;;;; +0834;SAMARITAN PUNCTUATION ATMAAU;Po;0;R;;;;;N;;;;; +0835;SAMARITAN PUNCTUATION SHIYYAALAA;Po;0;R;;;;;N;;;;; +0836;SAMARITAN ABBREVIATION MARK;Po;0;R;;;;;N;;;;; +0837;SAMARITAN PUNCTUATION MELODIC QITSA;Po;0;R;;;;;N;;;;; +0838;SAMARITAN PUNCTUATION ZIQAA;Po;0;R;;;;;N;;;;; +0839;SAMARITAN PUNCTUATION QITSA;Po;0;R;;;;;N;;;;; +083A;SAMARITAN PUNCTUATION ZAEF;Po;0;R;;;;;N;;;;; +083B;SAMARITAN PUNCTUATION TURU;Po;0;R;;;;;N;;;;; +083C;SAMARITAN PUNCTUATION ARKAANU;Po;0;R;;;;;N;;;;; +083D;SAMARITAN PUNCTUATION SOF MASHFAAT;Po;0;R;;;;;N;;;;; +083E;SAMARITAN PUNCTUATION ANNAAU;Po;0;R;;;;;N;;;;; +0840;MANDAIC LETTER HALQA;Lo;0;R;;;;;N;;;;; +0841;MANDAIC LETTER AB;Lo;0;R;;;;;N;;;;; +0842;MANDAIC LETTER AG;Lo;0;R;;;;;N;;;;; +0843;MANDAIC LETTER AD;Lo;0;R;;;;;N;;;;; +0844;MANDAIC LETTER AH;Lo;0;R;;;;;N;;;;; +0845;MANDAIC LETTER USHENNA;Lo;0;R;;;;;N;;;;; +0846;MANDAIC LETTER AZ;Lo;0;R;;;;;N;;;;; +0847;MANDAIC LETTER IT;Lo;0;R;;;;;N;;;;; +0848;MANDAIC LETTER ATT;Lo;0;R;;;;;N;;;;; +0849;MANDAIC LETTER AKSA;Lo;0;R;;;;;N;;;;; +084A;MANDAIC LETTER AK;Lo;0;R;;;;;N;;;;; +084B;MANDAIC LETTER AL;Lo;0;R;;;;;N;;;;; +084C;MANDAIC LETTER AM;Lo;0;R;;;;;N;;;;; +084D;MANDAIC LETTER AN;Lo;0;R;;;;;N;;;;; +084E;MANDAIC LETTER AS;Lo;0;R;;;;;N;;;;; +084F;MANDAIC LETTER IN;Lo;0;R;;;;;N;;;;; +0850;MANDAIC LETTER AP;Lo;0;R;;;;;N;;;;; +0851;MANDAIC LETTER ASZ;Lo;0;R;;;;;N;;;;; +0852;MANDAIC LETTER AQ;Lo;0;R;;;;;N;;;;; +0853;MANDAIC LETTER AR;Lo;0;R;;;;;N;;;;; +0854;MANDAIC LETTER ASH;Lo;0;R;;;;;N;;;;; +0855;MANDAIC LETTER AT;Lo;0;R;;;;;N;;;;; +0856;MANDAIC LETTER DUSHENNA;Lo;0;R;;;;;N;;;;; +0857;MANDAIC LETTER KAD;Lo;0;R;;;;;N;;;;; +0858;MANDAIC LETTER AIN;Lo;0;R;;;;;N;;;;; +0859;MANDAIC AFFRICATION MARK;Mn;220;NSM;;;;;N;;;;; +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;;;;; +08A3;ARABIC LETTER TAH WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +08A4;ARABIC LETTER FEH WITH DOT BELOW AND THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +08A5;ARABIC LETTER QAF WITH DOT BELOW;Lo;0;AL;;;;;N;;;;; +08A6;ARABIC LETTER LAM WITH DOUBLE BAR;Lo;0;AL;;;;;N;;;;; +08A7;ARABIC LETTER MEEM WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +08A8;ARABIC LETTER YEH WITH TWO DOTS BELOW AND HAMZA ABOVE;Lo;0;AL;;;;;N;;;;; +08A9;ARABIC LETTER YEH WITH TWO DOTS BELOW AND DOT ABOVE;Lo;0;AL;;;;;N;;;;; +08AA;ARABIC LETTER REH WITH LOOP;Lo;0;AL;;;;;N;;;;; +08AB;ARABIC LETTER WAW WITH DOT WITHIN;Lo;0;AL;;;;;N;;;;; +08AC;ARABIC LETTER ROHINGYA YEH;Lo;0;AL;;;;;N;;;;; +08AD;ARABIC LETTER LOW ALEF;Lo;0;AL;;;;;N;;;;; +08AE;ARABIC LETTER DAL WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;;;;; +08AF;ARABIC LETTER SAD WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;;;;; +08B0;ARABIC LETTER GAF WITH INVERTED STROKE;Lo;0;AL;;;;;N;;;;; +08B1;ARABIC LETTER STRAIGHT WAW;Lo;0;AL;;;;;N;;;;; +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;;;;; +08D3;ARABIC SMALL LOW WAW;Mn;220;NSM;;;;;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;;;;; +08E6;ARABIC CURLY KASRA;Mn;220;NSM;;;;;N;;;;; +08E7;ARABIC CURLY FATHATAN;Mn;230;NSM;;;;;N;;;;; +08E8;ARABIC CURLY DAMMATAN;Mn;230;NSM;;;;;N;;;;; +08E9;ARABIC CURLY KASRATAN;Mn;220;NSM;;;;;N;;;;; +08EA;ARABIC TONE ONE DOT ABOVE;Mn;230;NSM;;;;;N;;;;; +08EB;ARABIC TONE TWO DOTS ABOVE;Mn;230;NSM;;;;;N;;;;; +08EC;ARABIC TONE LOOP ABOVE;Mn;230;NSM;;;;;N;;;;; +08ED;ARABIC TONE ONE DOT BELOW;Mn;220;NSM;;;;;N;;;;; +08EE;ARABIC TONE TWO DOTS BELOW;Mn;220;NSM;;;;;N;;;;; +08EF;ARABIC TONE LOOP BELOW;Mn;220;NSM;;;;;N;;;;; +08F0;ARABIC OPEN FATHATAN;Mn;27;NSM;;;;;N;;;;; +08F1;ARABIC OPEN DAMMATAN;Mn;28;NSM;;;;;N;;;;; +08F2;ARABIC OPEN KASRATAN;Mn;29;NSM;;;;;N;;;;; +08F3;ARABIC SMALL HIGH WAW;Mn;230;NSM;;;;;N;;;;; +08F4;ARABIC FATHA WITH RING;Mn;230;NSM;;;;;N;;;;; +08F5;ARABIC FATHA WITH DOT ABOVE;Mn;230;NSM;;;;;N;;;;; +08F6;ARABIC KASRA WITH DOT BELOW;Mn;220;NSM;;;;;N;;;;; +08F7;ARABIC LEFT ARROWHEAD ABOVE;Mn;230;NSM;;;;;N;;;;; +08F8;ARABIC RIGHT ARROWHEAD ABOVE;Mn;230;NSM;;;;;N;;;;; +08F9;ARABIC LEFT ARROWHEAD BELOW;Mn;220;NSM;;;;;N;;;;; +08FA;ARABIC RIGHT ARROWHEAD BELOW;Mn;220;NSM;;;;;N;;;;; +08FB;ARABIC DOUBLE RIGHT ARROWHEAD ABOVE;Mn;230;NSM;;;;;N;;;;; +08FC;ARABIC DOUBLE RIGHT ARROWHEAD ABOVE WITH DOT;Mn;230;NSM;;;;;N;;;;; +08FD;ARABIC RIGHT ARROWHEAD ABOVE WITH DOT;Mn;230;NSM;;;;;N;;;;; +08FE;ARABIC DAMMA WITH DOT;Mn;230;NSM;;;;;N;;;;; +08FF;ARABIC MARK SIDEWAYS NOON GHUNNA;Mn;230;NSM;;;;;N;;;;; +0900;DEVANAGARI SIGN INVERTED CANDRABINDU;Mn;0;NSM;;;;;N;;;;; +0901;DEVANAGARI SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; +0902;DEVANAGARI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +0903;DEVANAGARI SIGN VISARGA;Mc;0;L;;;;;N;;;;; +0904;DEVANAGARI LETTER SHORT A;Lo;0;L;;;;;N;;;;; +0905;DEVANAGARI LETTER A;Lo;0;L;;;;;N;;;;; +0906;DEVANAGARI LETTER AA;Lo;0;L;;;;;N;;;;; +0907;DEVANAGARI LETTER I;Lo;0;L;;;;;N;;;;; +0908;DEVANAGARI LETTER II;Lo;0;L;;;;;N;;;;; +0909;DEVANAGARI LETTER U;Lo;0;L;;;;;N;;;;; +090A;DEVANAGARI LETTER UU;Lo;0;L;;;;;N;;;;; +090B;DEVANAGARI LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +090C;DEVANAGARI LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +090D;DEVANAGARI LETTER CANDRA E;Lo;0;L;;;;;N;;;;; +090E;DEVANAGARI LETTER SHORT E;Lo;0;L;;;;;N;;;;; +090F;DEVANAGARI LETTER E;Lo;0;L;;;;;N;;;;; +0910;DEVANAGARI LETTER AI;Lo;0;L;;;;;N;;;;; +0911;DEVANAGARI LETTER CANDRA O;Lo;0;L;;;;;N;;;;; +0912;DEVANAGARI LETTER SHORT O;Lo;0;L;;;;;N;;;;; +0913;DEVANAGARI LETTER O;Lo;0;L;;;;;N;;;;; +0914;DEVANAGARI LETTER AU;Lo;0;L;;;;;N;;;;; +0915;DEVANAGARI LETTER KA;Lo;0;L;;;;;N;;;;; +0916;DEVANAGARI LETTER KHA;Lo;0;L;;;;;N;;;;; +0917;DEVANAGARI LETTER GA;Lo;0;L;;;;;N;;;;; +0918;DEVANAGARI LETTER GHA;Lo;0;L;;;;;N;;;;; +0919;DEVANAGARI LETTER NGA;Lo;0;L;;;;;N;;;;; +091A;DEVANAGARI LETTER CA;Lo;0;L;;;;;N;;;;; +091B;DEVANAGARI LETTER CHA;Lo;0;L;;;;;N;;;;; +091C;DEVANAGARI LETTER JA;Lo;0;L;;;;;N;;;;; +091D;DEVANAGARI LETTER JHA;Lo;0;L;;;;;N;;;;; +091E;DEVANAGARI LETTER NYA;Lo;0;L;;;;;N;;;;; +091F;DEVANAGARI LETTER TTA;Lo;0;L;;;;;N;;;;; +0920;DEVANAGARI LETTER TTHA;Lo;0;L;;;;;N;;;;; +0921;DEVANAGARI LETTER DDA;Lo;0;L;;;;;N;;;;; +0922;DEVANAGARI LETTER DDHA;Lo;0;L;;;;;N;;;;; +0923;DEVANAGARI LETTER NNA;Lo;0;L;;;;;N;;;;; +0924;DEVANAGARI LETTER TA;Lo;0;L;;;;;N;;;;; +0925;DEVANAGARI LETTER THA;Lo;0;L;;;;;N;;;;; +0926;DEVANAGARI LETTER DA;Lo;0;L;;;;;N;;;;; +0927;DEVANAGARI LETTER DHA;Lo;0;L;;;;;N;;;;; +0928;DEVANAGARI LETTER NA;Lo;0;L;;;;;N;;;;; +0929;DEVANAGARI LETTER NNNA;Lo;0;L;0928 093C;;;;N;;;;; +092A;DEVANAGARI LETTER PA;Lo;0;L;;;;;N;;;;; +092B;DEVANAGARI LETTER PHA;Lo;0;L;;;;;N;;;;; +092C;DEVANAGARI LETTER BA;Lo;0;L;;;;;N;;;;; +092D;DEVANAGARI LETTER BHA;Lo;0;L;;;;;N;;;;; +092E;DEVANAGARI LETTER MA;Lo;0;L;;;;;N;;;;; +092F;DEVANAGARI LETTER YA;Lo;0;L;;;;;N;;;;; +0930;DEVANAGARI LETTER RA;Lo;0;L;;;;;N;;;;; +0931;DEVANAGARI LETTER RRA;Lo;0;L;0930 093C;;;;N;;;;; +0932;DEVANAGARI LETTER LA;Lo;0;L;;;;;N;;;;; +0933;DEVANAGARI LETTER LLA;Lo;0;L;;;;;N;;;;; +0934;DEVANAGARI LETTER LLLA;Lo;0;L;0933 093C;;;;N;;;;; +0935;DEVANAGARI LETTER VA;Lo;0;L;;;;;N;;;;; +0936;DEVANAGARI LETTER SHA;Lo;0;L;;;;;N;;;;; +0937;DEVANAGARI LETTER SSA;Lo;0;L;;;;;N;;;;; +0938;DEVANAGARI LETTER SA;Lo;0;L;;;;;N;;;;; +0939;DEVANAGARI LETTER HA;Lo;0;L;;;;;N;;;;; +093A;DEVANAGARI VOWEL SIGN OE;Mn;0;NSM;;;;;N;;;;; +093B;DEVANAGARI VOWEL SIGN OOE;Mc;0;L;;;;;N;;;;; +093C;DEVANAGARI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +093D;DEVANAGARI SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; +093E;DEVANAGARI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +093F;DEVANAGARI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +0940;DEVANAGARI VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +0941;DEVANAGARI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +0942;DEVANAGARI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +0943;DEVANAGARI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +0944;DEVANAGARI VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; +0945;DEVANAGARI VOWEL SIGN CANDRA E;Mn;0;NSM;;;;;N;;;;; +0946;DEVANAGARI VOWEL SIGN SHORT E;Mn;0;NSM;;;;;N;;;;; +0947;DEVANAGARI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +0948;DEVANAGARI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +0949;DEVANAGARI VOWEL SIGN CANDRA O;Mc;0;L;;;;;N;;;;; +094A;DEVANAGARI VOWEL SIGN SHORT O;Mc;0;L;;;;;N;;;;; +094B;DEVANAGARI VOWEL SIGN O;Mc;0;L;;;;;N;;;;; +094C;DEVANAGARI VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; +094D;DEVANAGARI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +094E;DEVANAGARI VOWEL SIGN PRISHTHAMATRA E;Mc;0;L;;;;;N;;;;; +094F;DEVANAGARI VOWEL SIGN AW;Mc;0;L;;;;;N;;;;; +0950;DEVANAGARI OM;Lo;0;L;;;;;N;;;;; +0951;DEVANAGARI STRESS SIGN UDATTA;Mn;230;NSM;;;;;N;;;;; +0952;DEVANAGARI STRESS SIGN ANUDATTA;Mn;220;NSM;;;;;N;;;;; +0953;DEVANAGARI GRAVE ACCENT;Mn;230;NSM;;;;;N;;;;; +0954;DEVANAGARI ACUTE ACCENT;Mn;230;NSM;;;;;N;;;;; +0955;DEVANAGARI VOWEL SIGN CANDRA LONG E;Mn;0;NSM;;;;;N;;;;; +0956;DEVANAGARI VOWEL SIGN UE;Mn;0;NSM;;;;;N;;;;; +0957;DEVANAGARI VOWEL SIGN UUE;Mn;0;NSM;;;;;N;;;;; +0958;DEVANAGARI LETTER QA;Lo;0;L;0915 093C;;;;N;;;;; +0959;DEVANAGARI LETTER KHHA;Lo;0;L;0916 093C;;;;N;;;;; +095A;DEVANAGARI LETTER GHHA;Lo;0;L;0917 093C;;;;N;;;;; +095B;DEVANAGARI LETTER ZA;Lo;0;L;091C 093C;;;;N;;;;; +095C;DEVANAGARI LETTER DDDHA;Lo;0;L;0921 093C;;;;N;;;;; +095D;DEVANAGARI LETTER RHA;Lo;0;L;0922 093C;;;;N;;;;; +095E;DEVANAGARI LETTER FA;Lo;0;L;092B 093C;;;;N;;;;; +095F;DEVANAGARI LETTER YYA;Lo;0;L;092F 093C;;;;N;;;;; +0960;DEVANAGARI LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +0961;DEVANAGARI LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +0962;DEVANAGARI VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; +0963;DEVANAGARI VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; +0964;DEVANAGARI DANDA;Po;0;L;;;;;N;;;;; +0965;DEVANAGARI DOUBLE DANDA;Po;0;L;;;;;N;;;;; +0966;DEVANAGARI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +0967;DEVANAGARI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +0968;DEVANAGARI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +0969;DEVANAGARI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +096A;DEVANAGARI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +096B;DEVANAGARI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +096C;DEVANAGARI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +096D;DEVANAGARI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +096E;DEVANAGARI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +096F;DEVANAGARI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +0970;DEVANAGARI ABBREVIATION SIGN;Po;0;L;;;;;N;;;;; +0971;DEVANAGARI SIGN HIGH SPACING DOT;Lm;0;L;;;;;N;;;;; +0972;DEVANAGARI LETTER CANDRA A;Lo;0;L;;;;;N;;;;; +0973;DEVANAGARI LETTER OE;Lo;0;L;;;;;N;;;;; +0974;DEVANAGARI LETTER OOE;Lo;0;L;;;;;N;;;;; +0975;DEVANAGARI LETTER AW;Lo;0;L;;;;;N;;;;; +0976;DEVANAGARI LETTER UE;Lo;0;L;;;;;N;;;;; +0977;DEVANAGARI LETTER UUE;Lo;0;L;;;;;N;;;;; +0978;DEVANAGARI LETTER MARWARI DDA;Lo;0;L;;;;;N;;;;; +0979;DEVANAGARI LETTER ZHA;Lo;0;L;;;;;N;;;;; +097A;DEVANAGARI LETTER HEAVY YA;Lo;0;L;;;;;N;;;;; +097B;DEVANAGARI LETTER GGA;Lo;0;L;;;;;N;;;;; +097C;DEVANAGARI LETTER JJA;Lo;0;L;;;;;N;;;;; +097D;DEVANAGARI LETTER GLOTTAL STOP;Lo;0;L;;;;;N;;;;; +097E;DEVANAGARI LETTER DDDA;Lo;0;L;;;;;N;;;;; +097F;DEVANAGARI LETTER BBA;Lo;0;L;;;;;N;;;;; +0980;BENGALI ANJI;Lo;0;L;;;;;N;;;;; +0981;BENGALI SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; +0982;BENGALI SIGN ANUSVARA;Mc;0;L;;;;;N;;;;; +0983;BENGALI SIGN VISARGA;Mc;0;L;;;;;N;;;;; +0985;BENGALI LETTER A;Lo;0;L;;;;;N;;;;; +0986;BENGALI LETTER AA;Lo;0;L;;;;;N;;;;; +0987;BENGALI LETTER I;Lo;0;L;;;;;N;;;;; +0988;BENGALI LETTER II;Lo;0;L;;;;;N;;;;; +0989;BENGALI LETTER U;Lo;0;L;;;;;N;;;;; +098A;BENGALI LETTER UU;Lo;0;L;;;;;N;;;;; +098B;BENGALI LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +098C;BENGALI LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +098F;BENGALI LETTER E;Lo;0;L;;;;;N;;;;; +0990;BENGALI LETTER AI;Lo;0;L;;;;;N;;;;; +0993;BENGALI LETTER O;Lo;0;L;;;;;N;;;;; +0994;BENGALI LETTER AU;Lo;0;L;;;;;N;;;;; +0995;BENGALI LETTER KA;Lo;0;L;;;;;N;;;;; +0996;BENGALI LETTER KHA;Lo;0;L;;;;;N;;;;; +0997;BENGALI LETTER GA;Lo;0;L;;;;;N;;;;; +0998;BENGALI LETTER GHA;Lo;0;L;;;;;N;;;;; +0999;BENGALI LETTER NGA;Lo;0;L;;;;;N;;;;; +099A;BENGALI LETTER CA;Lo;0;L;;;;;N;;;;; +099B;BENGALI LETTER CHA;Lo;0;L;;;;;N;;;;; +099C;BENGALI LETTER JA;Lo;0;L;;;;;N;;;;; +099D;BENGALI LETTER JHA;Lo;0;L;;;;;N;;;;; +099E;BENGALI LETTER NYA;Lo;0;L;;;;;N;;;;; +099F;BENGALI LETTER TTA;Lo;0;L;;;;;N;;;;; +09A0;BENGALI LETTER TTHA;Lo;0;L;;;;;N;;;;; +09A1;BENGALI LETTER DDA;Lo;0;L;;;;;N;;;;; +09A2;BENGALI LETTER DDHA;Lo;0;L;;;;;N;;;;; +09A3;BENGALI LETTER NNA;Lo;0;L;;;;;N;;;;; +09A4;BENGALI LETTER TA;Lo;0;L;;;;;N;;;;; +09A5;BENGALI LETTER THA;Lo;0;L;;;;;N;;;;; +09A6;BENGALI LETTER DA;Lo;0;L;;;;;N;;;;; +09A7;BENGALI LETTER DHA;Lo;0;L;;;;;N;;;;; +09A8;BENGALI LETTER NA;Lo;0;L;;;;;N;;;;; +09AA;BENGALI LETTER PA;Lo;0;L;;;;;N;;;;; +09AB;BENGALI LETTER PHA;Lo;0;L;;;;;N;;;;; +09AC;BENGALI LETTER BA;Lo;0;L;;;;;N;;;;; +09AD;BENGALI LETTER BHA;Lo;0;L;;;;;N;;;;; +09AE;BENGALI LETTER MA;Lo;0;L;;;;;N;;;;; +09AF;BENGALI LETTER YA;Lo;0;L;;;;;N;;;;; +09B0;BENGALI LETTER RA;Lo;0;L;;;;;N;;;;; +09B2;BENGALI LETTER LA;Lo;0;L;;;;;N;;;;; +09B6;BENGALI LETTER SHA;Lo;0;L;;;;;N;;;;; +09B7;BENGALI LETTER SSA;Lo;0;L;;;;;N;;;;; +09B8;BENGALI LETTER SA;Lo;0;L;;;;;N;;;;; +09B9;BENGALI LETTER HA;Lo;0;L;;;;;N;;;;; +09BC;BENGALI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +09BD;BENGALI SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; +09BE;BENGALI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +09BF;BENGALI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +09C0;BENGALI VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +09C1;BENGALI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +09C2;BENGALI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +09C3;BENGALI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +09C4;BENGALI VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; +09C7;BENGALI VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +09C8;BENGALI VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; +09CB;BENGALI VOWEL SIGN O;Mc;0;L;09C7 09BE;;;;N;;;;; +09CC;BENGALI VOWEL SIGN AU;Mc;0;L;09C7 09D7;;;;N;;;;; +09CD;BENGALI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +09CE;BENGALI LETTER KHANDA TA;Lo;0;L;;;;;N;;;;; +09D7;BENGALI AU LENGTH MARK;Mc;0;L;;;;;N;;;;; +09DC;BENGALI LETTER RRA;Lo;0;L;09A1 09BC;;;;N;;;;; +09DD;BENGALI LETTER RHA;Lo;0;L;09A2 09BC;;;;N;;;;; +09DF;BENGALI LETTER YYA;Lo;0;L;09AF 09BC;;;;N;;;;; +09E0;BENGALI LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +09E1;BENGALI LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +09E2;BENGALI VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; +09E3;BENGALI VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; +09E6;BENGALI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +09E7;BENGALI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +09E8;BENGALI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +09E9;BENGALI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +09EA;BENGALI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +09EB;BENGALI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +09EC;BENGALI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +09ED;BENGALI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +09EE;BENGALI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +09EF;BENGALI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +09F0;BENGALI LETTER RA WITH MIDDLE DIAGONAL;Lo;0;L;;;;;N;;;;; +09F1;BENGALI LETTER RA WITH LOWER DIAGONAL;Lo;0;L;;;;;N;BENGALI LETTER VA WITH LOWER DIAGONAL;;;; +09F2;BENGALI RUPEE MARK;Sc;0;ET;;;;;N;;;;; +09F3;BENGALI RUPEE SIGN;Sc;0;ET;;;;;N;;;;; +09F4;BENGALI CURRENCY NUMERATOR ONE;No;0;L;;;;1/16;N;;;;; +09F5;BENGALI CURRENCY NUMERATOR TWO;No;0;L;;;;1/8;N;;;;; +09F6;BENGALI CURRENCY NUMERATOR THREE;No;0;L;;;;3/16;N;;;;; +09F7;BENGALI CURRENCY NUMERATOR FOUR;No;0;L;;;;1/4;N;;;;; +09F8;BENGALI CURRENCY NUMERATOR ONE LESS THAN THE DENOMINATOR;No;0;L;;;;3/4;N;;;;; +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;;;;; +09FE;BENGALI SANDHI MARK;Mn;230;NSM;;;;;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;;;;; +0A05;GURMUKHI LETTER A;Lo;0;L;;;;;N;;;;; +0A06;GURMUKHI LETTER AA;Lo;0;L;;;;;N;;;;; +0A07;GURMUKHI LETTER I;Lo;0;L;;;;;N;;;;; +0A08;GURMUKHI LETTER II;Lo;0;L;;;;;N;;;;; +0A09;GURMUKHI LETTER U;Lo;0;L;;;;;N;;;;; +0A0A;GURMUKHI LETTER UU;Lo;0;L;;;;;N;;;;; +0A0F;GURMUKHI LETTER EE;Lo;0;L;;;;;N;;;;; +0A10;GURMUKHI LETTER AI;Lo;0;L;;;;;N;;;;; +0A13;GURMUKHI LETTER OO;Lo;0;L;;;;;N;;;;; +0A14;GURMUKHI LETTER AU;Lo;0;L;;;;;N;;;;; +0A15;GURMUKHI LETTER KA;Lo;0;L;;;;;N;;;;; +0A16;GURMUKHI LETTER KHA;Lo;0;L;;;;;N;;;;; +0A17;GURMUKHI LETTER GA;Lo;0;L;;;;;N;;;;; +0A18;GURMUKHI LETTER GHA;Lo;0;L;;;;;N;;;;; +0A19;GURMUKHI LETTER NGA;Lo;0;L;;;;;N;;;;; +0A1A;GURMUKHI LETTER CA;Lo;0;L;;;;;N;;;;; +0A1B;GURMUKHI LETTER CHA;Lo;0;L;;;;;N;;;;; +0A1C;GURMUKHI LETTER JA;Lo;0;L;;;;;N;;;;; +0A1D;GURMUKHI LETTER JHA;Lo;0;L;;;;;N;;;;; +0A1E;GURMUKHI LETTER NYA;Lo;0;L;;;;;N;;;;; +0A1F;GURMUKHI LETTER TTA;Lo;0;L;;;;;N;;;;; +0A20;GURMUKHI LETTER TTHA;Lo;0;L;;;;;N;;;;; +0A21;GURMUKHI LETTER DDA;Lo;0;L;;;;;N;;;;; +0A22;GURMUKHI LETTER DDHA;Lo;0;L;;;;;N;;;;; +0A23;GURMUKHI LETTER NNA;Lo;0;L;;;;;N;;;;; +0A24;GURMUKHI LETTER TA;Lo;0;L;;;;;N;;;;; +0A25;GURMUKHI LETTER THA;Lo;0;L;;;;;N;;;;; +0A26;GURMUKHI LETTER DA;Lo;0;L;;;;;N;;;;; +0A27;GURMUKHI LETTER DHA;Lo;0;L;;;;;N;;;;; +0A28;GURMUKHI LETTER NA;Lo;0;L;;;;;N;;;;; +0A2A;GURMUKHI LETTER PA;Lo;0;L;;;;;N;;;;; +0A2B;GURMUKHI LETTER PHA;Lo;0;L;;;;;N;;;;; +0A2C;GURMUKHI LETTER BA;Lo;0;L;;;;;N;;;;; +0A2D;GURMUKHI LETTER BHA;Lo;0;L;;;;;N;;;;; +0A2E;GURMUKHI LETTER MA;Lo;0;L;;;;;N;;;;; +0A2F;GURMUKHI LETTER YA;Lo;0;L;;;;;N;;;;; +0A30;GURMUKHI LETTER RA;Lo;0;L;;;;;N;;;;; +0A32;GURMUKHI LETTER LA;Lo;0;L;;;;;N;;;;; +0A33;GURMUKHI LETTER LLA;Lo;0;L;0A32 0A3C;;;;N;;;;; +0A35;GURMUKHI LETTER VA;Lo;0;L;;;;;N;;;;; +0A36;GURMUKHI LETTER SHA;Lo;0;L;0A38 0A3C;;;;N;;;;; +0A38;GURMUKHI LETTER SA;Lo;0;L;;;;;N;;;;; +0A39;GURMUKHI LETTER HA;Lo;0;L;;;;;N;;;;; +0A3C;GURMUKHI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +0A3E;GURMUKHI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +0A3F;GURMUKHI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +0A40;GURMUKHI VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +0A41;GURMUKHI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +0A42;GURMUKHI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +0A47;GURMUKHI VOWEL SIGN EE;Mn;0;NSM;;;;;N;;;;; +0A48;GURMUKHI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +0A4B;GURMUKHI VOWEL SIGN OO;Mn;0;NSM;;;;;N;;;;; +0A4C;GURMUKHI VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;; +0A4D;GURMUKHI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +0A51;GURMUKHI SIGN UDAAT;Mn;0;NSM;;;;;N;;;;; +0A59;GURMUKHI LETTER KHHA;Lo;0;L;0A16 0A3C;;;;N;;;;; +0A5A;GURMUKHI LETTER GHHA;Lo;0;L;0A17 0A3C;;;;N;;;;; +0A5B;GURMUKHI LETTER ZA;Lo;0;L;0A1C 0A3C;;;;N;;;;; +0A5C;GURMUKHI LETTER RRA;Lo;0;L;;;;;N;;;;; +0A5E;GURMUKHI LETTER FA;Lo;0;L;0A2B 0A3C;;;;N;;;;; +0A66;GURMUKHI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +0A67;GURMUKHI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +0A68;GURMUKHI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +0A69;GURMUKHI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +0A6A;GURMUKHI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +0A6B;GURMUKHI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +0A6C;GURMUKHI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +0A6D;GURMUKHI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +0A6E;GURMUKHI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +0A6F;GURMUKHI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +0A70;GURMUKHI TIPPI;Mn;0;NSM;;;;;N;;;;; +0A71;GURMUKHI ADDAK;Mn;0;NSM;;;;;N;;;;; +0A72;GURMUKHI IRI;Lo;0;L;;;;;N;;;;; +0A73;GURMUKHI URA;Lo;0;L;;;;;N;;;;; +0A74;GURMUKHI EK ONKAR;Lo;0;L;;;;;N;;;;; +0A75;GURMUKHI SIGN YAKASH;Mn;0;NSM;;;;;N;;;;; +0A76;GURMUKHI ABBREVIATION SIGN;Po;0;L;;;;;N;;;;; +0A81;GUJARATI SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; +0A82;GUJARATI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +0A83;GUJARATI SIGN VISARGA;Mc;0;L;;;;;N;;;;; +0A85;GUJARATI LETTER A;Lo;0;L;;;;;N;;;;; +0A86;GUJARATI LETTER AA;Lo;0;L;;;;;N;;;;; +0A87;GUJARATI LETTER I;Lo;0;L;;;;;N;;;;; +0A88;GUJARATI LETTER II;Lo;0;L;;;;;N;;;;; +0A89;GUJARATI LETTER U;Lo;0;L;;;;;N;;;;; +0A8A;GUJARATI LETTER UU;Lo;0;L;;;;;N;;;;; +0A8B;GUJARATI LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +0A8C;GUJARATI LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +0A8D;GUJARATI VOWEL CANDRA E;Lo;0;L;;;;;N;;;;; +0A8F;GUJARATI LETTER E;Lo;0;L;;;;;N;;;;; +0A90;GUJARATI LETTER AI;Lo;0;L;;;;;N;;;;; +0A91;GUJARATI VOWEL CANDRA O;Lo;0;L;;;;;N;;;;; +0A93;GUJARATI LETTER O;Lo;0;L;;;;;N;;;;; +0A94;GUJARATI LETTER AU;Lo;0;L;;;;;N;;;;; +0A95;GUJARATI LETTER KA;Lo;0;L;;;;;N;;;;; +0A96;GUJARATI LETTER KHA;Lo;0;L;;;;;N;;;;; +0A97;GUJARATI LETTER GA;Lo;0;L;;;;;N;;;;; +0A98;GUJARATI LETTER GHA;Lo;0;L;;;;;N;;;;; +0A99;GUJARATI LETTER NGA;Lo;0;L;;;;;N;;;;; +0A9A;GUJARATI LETTER CA;Lo;0;L;;;;;N;;;;; +0A9B;GUJARATI LETTER CHA;Lo;0;L;;;;;N;;;;; +0A9C;GUJARATI LETTER JA;Lo;0;L;;;;;N;;;;; +0A9D;GUJARATI LETTER JHA;Lo;0;L;;;;;N;;;;; +0A9E;GUJARATI LETTER NYA;Lo;0;L;;;;;N;;;;; +0A9F;GUJARATI LETTER TTA;Lo;0;L;;;;;N;;;;; +0AA0;GUJARATI LETTER TTHA;Lo;0;L;;;;;N;;;;; +0AA1;GUJARATI LETTER DDA;Lo;0;L;;;;;N;;;;; +0AA2;GUJARATI LETTER DDHA;Lo;0;L;;;;;N;;;;; +0AA3;GUJARATI LETTER NNA;Lo;0;L;;;;;N;;;;; +0AA4;GUJARATI LETTER TA;Lo;0;L;;;;;N;;;;; +0AA5;GUJARATI LETTER THA;Lo;0;L;;;;;N;;;;; +0AA6;GUJARATI LETTER DA;Lo;0;L;;;;;N;;;;; +0AA7;GUJARATI LETTER DHA;Lo;0;L;;;;;N;;;;; +0AA8;GUJARATI LETTER NA;Lo;0;L;;;;;N;;;;; +0AAA;GUJARATI LETTER PA;Lo;0;L;;;;;N;;;;; +0AAB;GUJARATI LETTER PHA;Lo;0;L;;;;;N;;;;; +0AAC;GUJARATI LETTER BA;Lo;0;L;;;;;N;;;;; +0AAD;GUJARATI LETTER BHA;Lo;0;L;;;;;N;;;;; +0AAE;GUJARATI LETTER MA;Lo;0;L;;;;;N;;;;; +0AAF;GUJARATI LETTER YA;Lo;0;L;;;;;N;;;;; +0AB0;GUJARATI LETTER RA;Lo;0;L;;;;;N;;;;; +0AB2;GUJARATI LETTER LA;Lo;0;L;;;;;N;;;;; +0AB3;GUJARATI LETTER LLA;Lo;0;L;;;;;N;;;;; +0AB5;GUJARATI LETTER VA;Lo;0;L;;;;;N;;;;; +0AB6;GUJARATI LETTER SHA;Lo;0;L;;;;;N;;;;; +0AB7;GUJARATI LETTER SSA;Lo;0;L;;;;;N;;;;; +0AB8;GUJARATI LETTER SA;Lo;0;L;;;;;N;;;;; +0AB9;GUJARATI LETTER HA;Lo;0;L;;;;;N;;;;; +0ABC;GUJARATI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +0ABD;GUJARATI SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; +0ABE;GUJARATI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +0ABF;GUJARATI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +0AC0;GUJARATI VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +0AC1;GUJARATI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +0AC2;GUJARATI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +0AC3;GUJARATI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +0AC4;GUJARATI VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; +0AC5;GUJARATI VOWEL SIGN CANDRA E;Mn;0;NSM;;;;;N;;;;; +0AC7;GUJARATI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +0AC8;GUJARATI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +0AC9;GUJARATI VOWEL SIGN CANDRA O;Mc;0;L;;;;;N;;;;; +0ACB;GUJARATI VOWEL SIGN O;Mc;0;L;;;;;N;;;;; +0ACC;GUJARATI VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; +0ACD;GUJARATI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +0AD0;GUJARATI OM;Lo;0;L;;;;;N;;;;; +0AE0;GUJARATI LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +0AE1;GUJARATI LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +0AE2;GUJARATI VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; +0AE3;GUJARATI VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; +0AE6;GUJARATI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +0AE7;GUJARATI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +0AE8;GUJARATI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +0AE9;GUJARATI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +0AEA;GUJARATI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +0AEB;GUJARATI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +0AEC;GUJARATI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +0AED;GUJARATI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +0AEE;GUJARATI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +0AEF;GUJARATI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +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;;;;; +0B05;ORIYA LETTER A;Lo;0;L;;;;;N;;;;; +0B06;ORIYA LETTER AA;Lo;0;L;;;;;N;;;;; +0B07;ORIYA LETTER I;Lo;0;L;;;;;N;;;;; +0B08;ORIYA LETTER II;Lo;0;L;;;;;N;;;;; +0B09;ORIYA LETTER U;Lo;0;L;;;;;N;;;;; +0B0A;ORIYA LETTER UU;Lo;0;L;;;;;N;;;;; +0B0B;ORIYA LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +0B0C;ORIYA LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +0B0F;ORIYA LETTER E;Lo;0;L;;;;;N;;;;; +0B10;ORIYA LETTER AI;Lo;0;L;;;;;N;;;;; +0B13;ORIYA LETTER O;Lo;0;L;;;;;N;;;;; +0B14;ORIYA LETTER AU;Lo;0;L;;;;;N;;;;; +0B15;ORIYA LETTER KA;Lo;0;L;;;;;N;;;;; +0B16;ORIYA LETTER KHA;Lo;0;L;;;;;N;;;;; +0B17;ORIYA LETTER GA;Lo;0;L;;;;;N;;;;; +0B18;ORIYA LETTER GHA;Lo;0;L;;;;;N;;;;; +0B19;ORIYA LETTER NGA;Lo;0;L;;;;;N;;;;; +0B1A;ORIYA LETTER CA;Lo;0;L;;;;;N;;;;; +0B1B;ORIYA LETTER CHA;Lo;0;L;;;;;N;;;;; +0B1C;ORIYA LETTER JA;Lo;0;L;;;;;N;;;;; +0B1D;ORIYA LETTER JHA;Lo;0;L;;;;;N;;;;; +0B1E;ORIYA LETTER NYA;Lo;0;L;;;;;N;;;;; +0B1F;ORIYA LETTER TTA;Lo;0;L;;;;;N;;;;; +0B20;ORIYA LETTER TTHA;Lo;0;L;;;;;N;;;;; +0B21;ORIYA LETTER DDA;Lo;0;L;;;;;N;;;;; +0B22;ORIYA LETTER DDHA;Lo;0;L;;;;;N;;;;; +0B23;ORIYA LETTER NNA;Lo;0;L;;;;;N;;;;; +0B24;ORIYA LETTER TA;Lo;0;L;;;;;N;;;;; +0B25;ORIYA LETTER THA;Lo;0;L;;;;;N;;;;; +0B26;ORIYA LETTER DA;Lo;0;L;;;;;N;;;;; +0B27;ORIYA LETTER DHA;Lo;0;L;;;;;N;;;;; +0B28;ORIYA LETTER NA;Lo;0;L;;;;;N;;;;; +0B2A;ORIYA LETTER PA;Lo;0;L;;;;;N;;;;; +0B2B;ORIYA LETTER PHA;Lo;0;L;;;;;N;;;;; +0B2C;ORIYA LETTER BA;Lo;0;L;;;;;N;;;;; +0B2D;ORIYA LETTER BHA;Lo;0;L;;;;;N;;;;; +0B2E;ORIYA LETTER MA;Lo;0;L;;;;;N;;;;; +0B2F;ORIYA LETTER YA;Lo;0;L;;;;;N;;;;; +0B30;ORIYA LETTER RA;Lo;0;L;;;;;N;;;;; +0B32;ORIYA LETTER LA;Lo;0;L;;;;;N;;;;; +0B33;ORIYA LETTER LLA;Lo;0;L;;;;;N;;;;; +0B35;ORIYA LETTER VA;Lo;0;L;;;;;N;;;;; +0B36;ORIYA LETTER SHA;Lo;0;L;;;;;N;;;;; +0B37;ORIYA LETTER SSA;Lo;0;L;;;;;N;;;;; +0B38;ORIYA LETTER SA;Lo;0;L;;;;;N;;;;; +0B39;ORIYA LETTER HA;Lo;0;L;;;;;N;;;;; +0B3C;ORIYA SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +0B3D;ORIYA SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; +0B3E;ORIYA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +0B3F;ORIYA VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +0B40;ORIYA VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +0B41;ORIYA VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +0B42;ORIYA VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +0B43;ORIYA VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +0B44;ORIYA VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; +0B47;ORIYA VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +0B48;ORIYA VOWEL SIGN AI;Mc;0;L;0B47 0B56;;;;N;;;;; +0B4B;ORIYA VOWEL SIGN O;Mc;0;L;0B47 0B3E;;;;N;;;;; +0B4C;ORIYA VOWEL SIGN AU;Mc;0;L;0B47 0B57;;;;N;;;;; +0B4D;ORIYA SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +0B56;ORIYA AI LENGTH MARK;Mn;0;NSM;;;;;N;;;;; +0B57;ORIYA AU LENGTH MARK;Mc;0;L;;;;;N;;;;; +0B5C;ORIYA LETTER RRA;Lo;0;L;0B21 0B3C;;;;N;;;;; +0B5D;ORIYA LETTER RHA;Lo;0;L;0B22 0B3C;;;;N;;;;; +0B5F;ORIYA LETTER YYA;Lo;0;L;;;;;N;;;;; +0B60;ORIYA LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +0B61;ORIYA LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +0B62;ORIYA VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; +0B63;ORIYA VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; +0B66;ORIYA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +0B67;ORIYA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +0B68;ORIYA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +0B69;ORIYA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +0B6A;ORIYA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +0B6B;ORIYA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +0B6C;ORIYA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +0B6D;ORIYA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +0B6E;ORIYA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +0B6F;ORIYA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +0B70;ORIYA ISSHAR;So;0;L;;;;;N;;;;; +0B71;ORIYA LETTER WA;Lo;0;L;;;;;N;;;;; +0B72;ORIYA FRACTION ONE QUARTER;No;0;L;;;;1/4;N;;;;; +0B73;ORIYA FRACTION ONE HALF;No;0;L;;;;1/2;N;;;;; +0B74;ORIYA FRACTION THREE QUARTERS;No;0;L;;;;3/4;N;;;;; +0B75;ORIYA FRACTION ONE SIXTEENTH;No;0;L;;;;1/16;N;;;;; +0B76;ORIYA FRACTION ONE EIGHTH;No;0;L;;;;1/8;N;;;;; +0B77;ORIYA FRACTION THREE SIXTEENTHS;No;0;L;;;;3/16;N;;;;; +0B82;TAMIL SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +0B83;TAMIL SIGN VISARGA;Lo;0;L;;;;;N;;;;; +0B85;TAMIL LETTER A;Lo;0;L;;;;;N;;;;; +0B86;TAMIL LETTER AA;Lo;0;L;;;;;N;;;;; +0B87;TAMIL LETTER I;Lo;0;L;;;;;N;;;;; +0B88;TAMIL LETTER II;Lo;0;L;;;;;N;;;;; +0B89;TAMIL LETTER U;Lo;0;L;;;;;N;;;;; +0B8A;TAMIL LETTER UU;Lo;0;L;;;;;N;;;;; +0B8E;TAMIL LETTER E;Lo;0;L;;;;;N;;;;; +0B8F;TAMIL LETTER EE;Lo;0;L;;;;;N;;;;; +0B90;TAMIL LETTER AI;Lo;0;L;;;;;N;;;;; +0B92;TAMIL LETTER O;Lo;0;L;;;;;N;;;;; +0B93;TAMIL LETTER OO;Lo;0;L;;;;;N;;;;; +0B94;TAMIL LETTER AU;Lo;0;L;0B92 0BD7;;;;N;;;;; +0B95;TAMIL LETTER KA;Lo;0;L;;;;;N;;;;; +0B99;TAMIL LETTER NGA;Lo;0;L;;;;;N;;;;; +0B9A;TAMIL LETTER CA;Lo;0;L;;;;;N;;;;; +0B9C;TAMIL LETTER JA;Lo;0;L;;;;;N;;;;; +0B9E;TAMIL LETTER NYA;Lo;0;L;;;;;N;;;;; +0B9F;TAMIL LETTER TTA;Lo;0;L;;;;;N;;;;; +0BA3;TAMIL LETTER NNA;Lo;0;L;;;;;N;;;;; +0BA4;TAMIL LETTER TA;Lo;0;L;;;;;N;;;;; +0BA8;TAMIL LETTER NA;Lo;0;L;;;;;N;;;;; +0BA9;TAMIL LETTER NNNA;Lo;0;L;;;;;N;;;;; +0BAA;TAMIL LETTER PA;Lo;0;L;;;;;N;;;;; +0BAE;TAMIL LETTER MA;Lo;0;L;;;;;N;;;;; +0BAF;TAMIL LETTER YA;Lo;0;L;;;;;N;;;;; +0BB0;TAMIL LETTER RA;Lo;0;L;;;;;N;;;;; +0BB1;TAMIL LETTER RRA;Lo;0;L;;;;;N;;;;; +0BB2;TAMIL LETTER LA;Lo;0;L;;;;;N;;;;; +0BB3;TAMIL LETTER LLA;Lo;0;L;;;;;N;;;;; +0BB4;TAMIL LETTER LLLA;Lo;0;L;;;;;N;;;;; +0BB5;TAMIL LETTER VA;Lo;0;L;;;;;N;;;;; +0BB6;TAMIL LETTER SHA;Lo;0;L;;;;;N;;;;; +0BB7;TAMIL LETTER SSA;Lo;0;L;;;;;N;;;;; +0BB8;TAMIL LETTER SA;Lo;0;L;;;;;N;;;;; +0BB9;TAMIL LETTER HA;Lo;0;L;;;;;N;;;;; +0BBE;TAMIL VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +0BBF;TAMIL VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +0BC0;TAMIL VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; +0BC1;TAMIL VOWEL SIGN U;Mc;0;L;;;;;N;;;;; +0BC2;TAMIL VOWEL SIGN UU;Mc;0;L;;;;;N;;;;; +0BC6;TAMIL VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +0BC7;TAMIL VOWEL SIGN EE;Mc;0;L;;;;;N;;;;; +0BC8;TAMIL VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; +0BCA;TAMIL VOWEL SIGN O;Mc;0;L;0BC6 0BBE;;;;N;;;;; +0BCB;TAMIL VOWEL SIGN OO;Mc;0;L;0BC7 0BBE;;;;N;;;;; +0BCC;TAMIL VOWEL SIGN AU;Mc;0;L;0BC6 0BD7;;;;N;;;;; +0BCD;TAMIL SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +0BD0;TAMIL OM;Lo;0;L;;;;;N;;;;; +0BD7;TAMIL AU LENGTH MARK;Mc;0;L;;;;;N;;;;; +0BE6;TAMIL DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +0BE7;TAMIL DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +0BE8;TAMIL DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +0BE9;TAMIL DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +0BEA;TAMIL DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +0BEB;TAMIL DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +0BEC;TAMIL DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +0BED;TAMIL DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +0BEE;TAMIL DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +0BEF;TAMIL DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +0BF0;TAMIL NUMBER TEN;No;0;L;;;;10;N;;;;; +0BF1;TAMIL NUMBER ONE HUNDRED;No;0;L;;;;100;N;;;;; +0BF2;TAMIL NUMBER ONE THOUSAND;No;0;L;;;;1000;N;;;;; +0BF3;TAMIL DAY SIGN;So;0;ON;;;;;N;;;;; +0BF4;TAMIL MONTH SIGN;So;0;ON;;;;;N;;;;; +0BF5;TAMIL YEAR SIGN;So;0;ON;;;;;N;;;;; +0BF6;TAMIL DEBIT SIGN;So;0;ON;;;;;N;;;;; +0BF7;TAMIL CREDIT SIGN;So;0;ON;;;;;N;;;;; +0BF8;TAMIL AS ABOVE SIGN;So;0;ON;;;;;N;;;;; +0BF9;TAMIL RUPEE SIGN;Sc;0;ET;;;;;N;;;;; +0BFA;TAMIL NUMBER SIGN;So;0;ON;;;;;N;;;;; +0C00;TELUGU SIGN COMBINING CANDRABINDU ABOVE;Mn;0;NSM;;;;;N;;;;; +0C01;TELUGU SIGN CANDRABINDU;Mc;0;L;;;;;N;;;;; +0C02;TELUGU SIGN ANUSVARA;Mc;0;L;;;;;N;;;;; +0C03;TELUGU SIGN VISARGA;Mc;0;L;;;;;N;;;;; +0C04;TELUGU SIGN COMBINING ANUSVARA ABOVE;Mn;0;NSM;;;;;N;;;;; +0C05;TELUGU LETTER A;Lo;0;L;;;;;N;;;;; +0C06;TELUGU LETTER AA;Lo;0;L;;;;;N;;;;; +0C07;TELUGU LETTER I;Lo;0;L;;;;;N;;;;; +0C08;TELUGU LETTER II;Lo;0;L;;;;;N;;;;; +0C09;TELUGU LETTER U;Lo;0;L;;;;;N;;;;; +0C0A;TELUGU LETTER UU;Lo;0;L;;;;;N;;;;; +0C0B;TELUGU LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +0C0C;TELUGU LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +0C0E;TELUGU LETTER E;Lo;0;L;;;;;N;;;;; +0C0F;TELUGU LETTER EE;Lo;0;L;;;;;N;;;;; +0C10;TELUGU LETTER AI;Lo;0;L;;;;;N;;;;; +0C12;TELUGU LETTER O;Lo;0;L;;;;;N;;;;; +0C13;TELUGU LETTER OO;Lo;0;L;;;;;N;;;;; +0C14;TELUGU LETTER AU;Lo;0;L;;;;;N;;;;; +0C15;TELUGU LETTER KA;Lo;0;L;;;;;N;;;;; +0C16;TELUGU LETTER KHA;Lo;0;L;;;;;N;;;;; +0C17;TELUGU LETTER GA;Lo;0;L;;;;;N;;;;; +0C18;TELUGU LETTER GHA;Lo;0;L;;;;;N;;;;; +0C19;TELUGU LETTER NGA;Lo;0;L;;;;;N;;;;; +0C1A;TELUGU LETTER CA;Lo;0;L;;;;;N;;;;; +0C1B;TELUGU LETTER CHA;Lo;0;L;;;;;N;;;;; +0C1C;TELUGU LETTER JA;Lo;0;L;;;;;N;;;;; +0C1D;TELUGU LETTER JHA;Lo;0;L;;;;;N;;;;; +0C1E;TELUGU LETTER NYA;Lo;0;L;;;;;N;;;;; +0C1F;TELUGU LETTER TTA;Lo;0;L;;;;;N;;;;; +0C20;TELUGU LETTER TTHA;Lo;0;L;;;;;N;;;;; +0C21;TELUGU LETTER DDA;Lo;0;L;;;;;N;;;;; +0C22;TELUGU LETTER DDHA;Lo;0;L;;;;;N;;;;; +0C23;TELUGU LETTER NNA;Lo;0;L;;;;;N;;;;; +0C24;TELUGU LETTER TA;Lo;0;L;;;;;N;;;;; +0C25;TELUGU LETTER THA;Lo;0;L;;;;;N;;;;; +0C26;TELUGU LETTER DA;Lo;0;L;;;;;N;;;;; +0C27;TELUGU LETTER DHA;Lo;0;L;;;;;N;;;;; +0C28;TELUGU LETTER NA;Lo;0;L;;;;;N;;;;; +0C2A;TELUGU LETTER PA;Lo;0;L;;;;;N;;;;; +0C2B;TELUGU LETTER PHA;Lo;0;L;;;;;N;;;;; +0C2C;TELUGU LETTER BA;Lo;0;L;;;;;N;;;;; +0C2D;TELUGU LETTER BHA;Lo;0;L;;;;;N;;;;; +0C2E;TELUGU LETTER MA;Lo;0;L;;;;;N;;;;; +0C2F;TELUGU LETTER YA;Lo;0;L;;;;;N;;;;; +0C30;TELUGU LETTER RA;Lo;0;L;;;;;N;;;;; +0C31;TELUGU LETTER RRA;Lo;0;L;;;;;N;;;;; +0C32;TELUGU LETTER LA;Lo;0;L;;;;;N;;;;; +0C33;TELUGU LETTER LLA;Lo;0;L;;;;;N;;;;; +0C34;TELUGU LETTER LLLA;Lo;0;L;;;;;N;;;;; +0C35;TELUGU LETTER VA;Lo;0;L;;;;;N;;;;; +0C36;TELUGU LETTER SHA;Lo;0;L;;;;;N;;;;; +0C37;TELUGU LETTER SSA;Lo;0;L;;;;;N;;;;; +0C38;TELUGU LETTER SA;Lo;0;L;;;;;N;;;;; +0C39;TELUGU LETTER HA;Lo;0;L;;;;;N;;;;; +0C3D;TELUGU SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; +0C3E;TELUGU VOWEL SIGN AA;Mn;0;NSM;;;;;N;;;;; +0C3F;TELUGU VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +0C40;TELUGU VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; +0C41;TELUGU VOWEL SIGN U;Mc;0;L;;;;;N;;;;; +0C42;TELUGU VOWEL SIGN UU;Mc;0;L;;;;;N;;;;; +0C43;TELUGU VOWEL SIGN VOCALIC R;Mc;0;L;;;;;N;;;;; +0C44;TELUGU VOWEL SIGN VOCALIC RR;Mc;0;L;;;;;N;;;;; +0C46;TELUGU VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +0C47;TELUGU VOWEL SIGN EE;Mn;0;NSM;;;;;N;;;;; +0C48;TELUGU VOWEL SIGN AI;Mn;0;NSM;0C46 0C56;;;;N;;;;; +0C4A;TELUGU VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; +0C4B;TELUGU VOWEL SIGN OO;Mn;0;NSM;;;;;N;;;;; +0C4C;TELUGU VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;; +0C4D;TELUGU SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +0C55;TELUGU LENGTH MARK;Mn;84;NSM;;;;;N;;;;; +0C56;TELUGU AI LENGTH MARK;Mn;91;NSM;;;;;N;;;;; +0C58;TELUGU LETTER TSA;Lo;0;L;;;;;N;;;;; +0C59;TELUGU LETTER DZA;Lo;0;L;;;;;N;;;;; +0C5A;TELUGU LETTER RRRA;Lo;0;L;;;;;N;;;;; +0C60;TELUGU LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +0C61;TELUGU LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +0C62;TELUGU VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; +0C63;TELUGU VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; +0C66;TELUGU DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +0C67;TELUGU DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +0C68;TELUGU DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +0C69;TELUGU DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +0C6A;TELUGU DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +0C6B;TELUGU DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +0C6C;TELUGU DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +0C6D;TELUGU DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +0C6E;TELUGU DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +0C6F;TELUGU DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +0C78;TELUGU FRACTION DIGIT ZERO FOR ODD POWERS OF FOUR;No;0;ON;;;;0;N;;;;; +0C79;TELUGU FRACTION DIGIT ONE FOR ODD POWERS OF FOUR;No;0;ON;;;;1;N;;;;; +0C7A;TELUGU FRACTION DIGIT TWO FOR ODD POWERS OF FOUR;No;0;ON;;;;2;N;;;;; +0C7B;TELUGU FRACTION DIGIT THREE FOR ODD POWERS OF FOUR;No;0;ON;;;;3;N;;;;; +0C7C;TELUGU FRACTION DIGIT ONE FOR EVEN POWERS OF FOUR;No;0;ON;;;;1;N;;;;; +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;;;;; +0C84;KANNADA SIGN SIDDHAM;Po;0;L;;;;;N;;;;; +0C85;KANNADA LETTER A;Lo;0;L;;;;;N;;;;; +0C86;KANNADA LETTER AA;Lo;0;L;;;;;N;;;;; +0C87;KANNADA LETTER I;Lo;0;L;;;;;N;;;;; +0C88;KANNADA LETTER II;Lo;0;L;;;;;N;;;;; +0C89;KANNADA LETTER U;Lo;0;L;;;;;N;;;;; +0C8A;KANNADA LETTER UU;Lo;0;L;;;;;N;;;;; +0C8B;KANNADA LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +0C8C;KANNADA LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +0C8E;KANNADA LETTER E;Lo;0;L;;;;;N;;;;; +0C8F;KANNADA LETTER EE;Lo;0;L;;;;;N;;;;; +0C90;KANNADA LETTER AI;Lo;0;L;;;;;N;;;;; +0C92;KANNADA LETTER O;Lo;0;L;;;;;N;;;;; +0C93;KANNADA LETTER OO;Lo;0;L;;;;;N;;;;; +0C94;KANNADA LETTER AU;Lo;0;L;;;;;N;;;;; +0C95;KANNADA LETTER KA;Lo;0;L;;;;;N;;;;; +0C96;KANNADA LETTER KHA;Lo;0;L;;;;;N;;;;; +0C97;KANNADA LETTER GA;Lo;0;L;;;;;N;;;;; +0C98;KANNADA LETTER GHA;Lo;0;L;;;;;N;;;;; +0C99;KANNADA LETTER NGA;Lo;0;L;;;;;N;;;;; +0C9A;KANNADA LETTER CA;Lo;0;L;;;;;N;;;;; +0C9B;KANNADA LETTER CHA;Lo;0;L;;;;;N;;;;; +0C9C;KANNADA LETTER JA;Lo;0;L;;;;;N;;;;; +0C9D;KANNADA LETTER JHA;Lo;0;L;;;;;N;;;;; +0C9E;KANNADA LETTER NYA;Lo;0;L;;;;;N;;;;; +0C9F;KANNADA LETTER TTA;Lo;0;L;;;;;N;;;;; +0CA0;KANNADA LETTER TTHA;Lo;0;L;;;;;N;;;;; +0CA1;KANNADA LETTER DDA;Lo;0;L;;;;;N;;;;; +0CA2;KANNADA LETTER DDHA;Lo;0;L;;;;;N;;;;; +0CA3;KANNADA LETTER NNA;Lo;0;L;;;;;N;;;;; +0CA4;KANNADA LETTER TA;Lo;0;L;;;;;N;;;;; +0CA5;KANNADA LETTER THA;Lo;0;L;;;;;N;;;;; +0CA6;KANNADA LETTER DA;Lo;0;L;;;;;N;;;;; +0CA7;KANNADA LETTER DHA;Lo;0;L;;;;;N;;;;; +0CA8;KANNADA LETTER NA;Lo;0;L;;;;;N;;;;; +0CAA;KANNADA LETTER PA;Lo;0;L;;;;;N;;;;; +0CAB;KANNADA LETTER PHA;Lo;0;L;;;;;N;;;;; +0CAC;KANNADA LETTER BA;Lo;0;L;;;;;N;;;;; +0CAD;KANNADA LETTER BHA;Lo;0;L;;;;;N;;;;; +0CAE;KANNADA LETTER MA;Lo;0;L;;;;;N;;;;; +0CAF;KANNADA LETTER YA;Lo;0;L;;;;;N;;;;; +0CB0;KANNADA LETTER RA;Lo;0;L;;;;;N;;;;; +0CB1;KANNADA LETTER RRA;Lo;0;L;;;;;N;;;;; +0CB2;KANNADA LETTER LA;Lo;0;L;;;;;N;;;;; +0CB3;KANNADA LETTER LLA;Lo;0;L;;;;;N;;;;; +0CB5;KANNADA LETTER VA;Lo;0;L;;;;;N;;;;; +0CB6;KANNADA LETTER SHA;Lo;0;L;;;;;N;;;;; +0CB7;KANNADA LETTER SSA;Lo;0;L;;;;;N;;;;; +0CB8;KANNADA LETTER SA;Lo;0;L;;;;;N;;;;; +0CB9;KANNADA LETTER HA;Lo;0;L;;;;;N;;;;; +0CBC;KANNADA SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +0CBD;KANNADA SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; +0CBE;KANNADA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +0CBF;KANNADA VOWEL SIGN I;Mn;0;L;;;;;N;;;;; +0CC0;KANNADA VOWEL SIGN II;Mc;0;L;0CBF 0CD5;;;;N;;;;; +0CC1;KANNADA VOWEL SIGN U;Mc;0;L;;;;;N;;;;; +0CC2;KANNADA VOWEL SIGN UU;Mc;0;L;;;;;N;;;;; +0CC3;KANNADA VOWEL SIGN VOCALIC R;Mc;0;L;;;;;N;;;;; +0CC4;KANNADA VOWEL SIGN VOCALIC RR;Mc;0;L;;;;;N;;;;; +0CC6;KANNADA VOWEL SIGN E;Mn;0;L;;;;;N;;;;; +0CC7;KANNADA VOWEL SIGN EE;Mc;0;L;0CC6 0CD5;;;;N;;;;; +0CC8;KANNADA VOWEL SIGN AI;Mc;0;L;0CC6 0CD6;;;;N;;;;; +0CCA;KANNADA VOWEL SIGN O;Mc;0;L;0CC6 0CC2;;;;N;;;;; +0CCB;KANNADA VOWEL SIGN OO;Mc;0;L;0CCA 0CD5;;;;N;;;;; +0CCC;KANNADA VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;; +0CCD;KANNADA SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +0CD5;KANNADA LENGTH MARK;Mc;0;L;;;;;N;;;;; +0CD6;KANNADA AI LENGTH MARK;Mc;0;L;;;;;N;;;;; +0CDE;KANNADA LETTER FA;Lo;0;L;;;;;N;;;;; +0CE0;KANNADA LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +0CE1;KANNADA LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +0CE2;KANNADA VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; +0CE3;KANNADA VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; +0CE6;KANNADA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +0CE7;KANNADA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +0CE8;KANNADA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +0CE9;KANNADA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +0CEA;KANNADA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +0CEB;KANNADA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +0CEC;KANNADA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +0CED;KANNADA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +0CEE;KANNADA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +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;;;;; +0D05;MALAYALAM LETTER A;Lo;0;L;;;;;N;;;;; +0D06;MALAYALAM LETTER AA;Lo;0;L;;;;;N;;;;; +0D07;MALAYALAM LETTER I;Lo;0;L;;;;;N;;;;; +0D08;MALAYALAM LETTER II;Lo;0;L;;;;;N;;;;; +0D09;MALAYALAM LETTER U;Lo;0;L;;;;;N;;;;; +0D0A;MALAYALAM LETTER UU;Lo;0;L;;;;;N;;;;; +0D0B;MALAYALAM LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +0D0C;MALAYALAM LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +0D0E;MALAYALAM LETTER E;Lo;0;L;;;;;N;;;;; +0D0F;MALAYALAM LETTER EE;Lo;0;L;;;;;N;;;;; +0D10;MALAYALAM LETTER AI;Lo;0;L;;;;;N;;;;; +0D12;MALAYALAM LETTER O;Lo;0;L;;;;;N;;;;; +0D13;MALAYALAM LETTER OO;Lo;0;L;;;;;N;;;;; +0D14;MALAYALAM LETTER AU;Lo;0;L;;;;;N;;;;; +0D15;MALAYALAM LETTER KA;Lo;0;L;;;;;N;;;;; +0D16;MALAYALAM LETTER KHA;Lo;0;L;;;;;N;;;;; +0D17;MALAYALAM LETTER GA;Lo;0;L;;;;;N;;;;; +0D18;MALAYALAM LETTER GHA;Lo;0;L;;;;;N;;;;; +0D19;MALAYALAM LETTER NGA;Lo;0;L;;;;;N;;;;; +0D1A;MALAYALAM LETTER CA;Lo;0;L;;;;;N;;;;; +0D1B;MALAYALAM LETTER CHA;Lo;0;L;;;;;N;;;;; +0D1C;MALAYALAM LETTER JA;Lo;0;L;;;;;N;;;;; +0D1D;MALAYALAM LETTER JHA;Lo;0;L;;;;;N;;;;; +0D1E;MALAYALAM LETTER NYA;Lo;0;L;;;;;N;;;;; +0D1F;MALAYALAM LETTER TTA;Lo;0;L;;;;;N;;;;; +0D20;MALAYALAM LETTER TTHA;Lo;0;L;;;;;N;;;;; +0D21;MALAYALAM LETTER DDA;Lo;0;L;;;;;N;;;;; +0D22;MALAYALAM LETTER DDHA;Lo;0;L;;;;;N;;;;; +0D23;MALAYALAM LETTER NNA;Lo;0;L;;;;;N;;;;; +0D24;MALAYALAM LETTER TA;Lo;0;L;;;;;N;;;;; +0D25;MALAYALAM LETTER THA;Lo;0;L;;;;;N;;;;; +0D26;MALAYALAM LETTER DA;Lo;0;L;;;;;N;;;;; +0D27;MALAYALAM LETTER DHA;Lo;0;L;;;;;N;;;;; +0D28;MALAYALAM LETTER NA;Lo;0;L;;;;;N;;;;; +0D29;MALAYALAM LETTER NNNA;Lo;0;L;;;;;N;;;;; +0D2A;MALAYALAM LETTER PA;Lo;0;L;;;;;N;;;;; +0D2B;MALAYALAM LETTER PHA;Lo;0;L;;;;;N;;;;; +0D2C;MALAYALAM LETTER BA;Lo;0;L;;;;;N;;;;; +0D2D;MALAYALAM LETTER BHA;Lo;0;L;;;;;N;;;;; +0D2E;MALAYALAM LETTER MA;Lo;0;L;;;;;N;;;;; +0D2F;MALAYALAM LETTER YA;Lo;0;L;;;;;N;;;;; +0D30;MALAYALAM LETTER RA;Lo;0;L;;;;;N;;;;; +0D31;MALAYALAM LETTER RRA;Lo;0;L;;;;;N;;;;; +0D32;MALAYALAM LETTER LA;Lo;0;L;;;;;N;;;;; +0D33;MALAYALAM LETTER LLA;Lo;0;L;;;;;N;;;;; +0D34;MALAYALAM LETTER LLLA;Lo;0;L;;;;;N;;;;; +0D35;MALAYALAM LETTER VA;Lo;0;L;;;;;N;;;;; +0D36;MALAYALAM LETTER SHA;Lo;0;L;;;;;N;;;;; +0D37;MALAYALAM LETTER SSA;Lo;0;L;;;;;N;;;;; +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;;;;; +0D40;MALAYALAM VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +0D41;MALAYALAM VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +0D42;MALAYALAM VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +0D43;MALAYALAM VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +0D44;MALAYALAM VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; +0D46;MALAYALAM VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +0D47;MALAYALAM VOWEL SIGN EE;Mc;0;L;;;;;N;;;;; +0D48;MALAYALAM VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; +0D4A;MALAYALAM VOWEL SIGN O;Mc;0;L;0D46 0D3E;;;;N;;;;; +0D4B;MALAYALAM VOWEL SIGN OO;Mc;0;L;0D47 0D3E;;;;N;;;;; +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;;;;; +0D62;MALAYALAM VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; +0D63;MALAYALAM VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; +0D66;MALAYALAM DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +0D67;MALAYALAM DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +0D68;MALAYALAM DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +0D69;MALAYALAM DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +0D6A;MALAYALAM DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +0D6B;MALAYALAM DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +0D6C;MALAYALAM DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +0D6D;MALAYALAM DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +0D6E;MALAYALAM DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +0D6F;MALAYALAM DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +0D70;MALAYALAM NUMBER TEN;No;0;L;;;;10;N;;;;; +0D71;MALAYALAM NUMBER ONE HUNDRED;No;0;L;;;;100;N;;;;; +0D72;MALAYALAM NUMBER ONE THOUSAND;No;0;L;;;;1000;N;;;;; +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;;;;; +0D7C;MALAYALAM LETTER CHILLU RR;Lo;0;L;;;;;N;;;;; +0D7D;MALAYALAM LETTER CHILLU L;Lo;0;L;;;;;N;;;;; +0D7E;MALAYALAM LETTER CHILLU LL;Lo;0;L;;;;;N;;;;; +0D7F;MALAYALAM LETTER CHILLU K;Lo;0;L;;;;;N;;;;; +0D82;SINHALA SIGN ANUSVARAYA;Mc;0;L;;;;;N;;;;; +0D83;SINHALA SIGN VISARGAYA;Mc;0;L;;;;;N;;;;; +0D85;SINHALA LETTER AYANNA;Lo;0;L;;;;;N;;;;; +0D86;SINHALA LETTER AAYANNA;Lo;0;L;;;;;N;;;;; +0D87;SINHALA LETTER AEYANNA;Lo;0;L;;;;;N;;;;; +0D88;SINHALA LETTER AEEYANNA;Lo;0;L;;;;;N;;;;; +0D89;SINHALA LETTER IYANNA;Lo;0;L;;;;;N;;;;; +0D8A;SINHALA LETTER IIYANNA;Lo;0;L;;;;;N;;;;; +0D8B;SINHALA LETTER UYANNA;Lo;0;L;;;;;N;;;;; +0D8C;SINHALA LETTER UUYANNA;Lo;0;L;;;;;N;;;;; +0D8D;SINHALA LETTER IRUYANNA;Lo;0;L;;;;;N;;;;; +0D8E;SINHALA LETTER IRUUYANNA;Lo;0;L;;;;;N;;;;; +0D8F;SINHALA LETTER ILUYANNA;Lo;0;L;;;;;N;;;;; +0D90;SINHALA LETTER ILUUYANNA;Lo;0;L;;;;;N;;;;; +0D91;SINHALA LETTER EYANNA;Lo;0;L;;;;;N;;;;; +0D92;SINHALA LETTER EEYANNA;Lo;0;L;;;;;N;;;;; +0D93;SINHALA LETTER AIYANNA;Lo;0;L;;;;;N;;;;; +0D94;SINHALA LETTER OYANNA;Lo;0;L;;;;;N;;;;; +0D95;SINHALA LETTER OOYANNA;Lo;0;L;;;;;N;;;;; +0D96;SINHALA LETTER AUYANNA;Lo;0;L;;;;;N;;;;; +0D9A;SINHALA LETTER ALPAPRAANA KAYANNA;Lo;0;L;;;;;N;;;;; +0D9B;SINHALA LETTER MAHAAPRAANA KAYANNA;Lo;0;L;;;;;N;;;;; +0D9C;SINHALA LETTER ALPAPRAANA GAYANNA;Lo;0;L;;;;;N;;;;; +0D9D;SINHALA LETTER MAHAAPRAANA GAYANNA;Lo;0;L;;;;;N;;;;; +0D9E;SINHALA LETTER KANTAJA NAASIKYAYA;Lo;0;L;;;;;N;;;;; +0D9F;SINHALA LETTER SANYAKA GAYANNA;Lo;0;L;;;;;N;;;;; +0DA0;SINHALA LETTER ALPAPRAANA CAYANNA;Lo;0;L;;;;;N;;;;; +0DA1;SINHALA LETTER MAHAAPRAANA CAYANNA;Lo;0;L;;;;;N;;;;; +0DA2;SINHALA LETTER ALPAPRAANA JAYANNA;Lo;0;L;;;;;N;;;;; +0DA3;SINHALA LETTER MAHAAPRAANA JAYANNA;Lo;0;L;;;;;N;;;;; +0DA4;SINHALA LETTER TAALUJA NAASIKYAYA;Lo;0;L;;;;;N;;;;; +0DA5;SINHALA LETTER TAALUJA SANYOOGA NAAKSIKYAYA;Lo;0;L;;;;;N;;;;; +0DA6;SINHALA LETTER SANYAKA JAYANNA;Lo;0;L;;;;;N;;;;; +0DA7;SINHALA LETTER ALPAPRAANA TTAYANNA;Lo;0;L;;;;;N;;;;; +0DA8;SINHALA LETTER MAHAAPRAANA TTAYANNA;Lo;0;L;;;;;N;;;;; +0DA9;SINHALA LETTER ALPAPRAANA DDAYANNA;Lo;0;L;;;;;N;;;;; +0DAA;SINHALA LETTER MAHAAPRAANA DDAYANNA;Lo;0;L;;;;;N;;;;; +0DAB;SINHALA LETTER MUURDHAJA NAYANNA;Lo;0;L;;;;;N;;;;; +0DAC;SINHALA LETTER SANYAKA DDAYANNA;Lo;0;L;;;;;N;;;;; +0DAD;SINHALA LETTER ALPAPRAANA TAYANNA;Lo;0;L;;;;;N;;;;; +0DAE;SINHALA LETTER MAHAAPRAANA TAYANNA;Lo;0;L;;;;;N;;;;; +0DAF;SINHALA LETTER ALPAPRAANA DAYANNA;Lo;0;L;;;;;N;;;;; +0DB0;SINHALA LETTER MAHAAPRAANA DAYANNA;Lo;0;L;;;;;N;;;;; +0DB1;SINHALA LETTER DANTAJA NAYANNA;Lo;0;L;;;;;N;;;;; +0DB3;SINHALA LETTER SANYAKA DAYANNA;Lo;0;L;;;;;N;;;;; +0DB4;SINHALA LETTER ALPAPRAANA PAYANNA;Lo;0;L;;;;;N;;;;; +0DB5;SINHALA LETTER MAHAAPRAANA PAYANNA;Lo;0;L;;;;;N;;;;; +0DB6;SINHALA LETTER ALPAPRAANA BAYANNA;Lo;0;L;;;;;N;;;;; +0DB7;SINHALA LETTER MAHAAPRAANA BAYANNA;Lo;0;L;;;;;N;;;;; +0DB8;SINHALA LETTER MAYANNA;Lo;0;L;;;;;N;;;;; +0DB9;SINHALA LETTER AMBA BAYANNA;Lo;0;L;;;;;N;;;;; +0DBA;SINHALA LETTER YAYANNA;Lo;0;L;;;;;N;;;;; +0DBB;SINHALA LETTER RAYANNA;Lo;0;L;;;;;N;;;;; +0DBD;SINHALA LETTER DANTAJA LAYANNA;Lo;0;L;;;;;N;;;;; +0DC0;SINHALA LETTER VAYANNA;Lo;0;L;;;;;N;;;;; +0DC1;SINHALA LETTER TAALUJA SAYANNA;Lo;0;L;;;;;N;;;;; +0DC2;SINHALA LETTER MUURDHAJA SAYANNA;Lo;0;L;;;;;N;;;;; +0DC3;SINHALA LETTER DANTAJA SAYANNA;Lo;0;L;;;;;N;;;;; +0DC4;SINHALA LETTER HAYANNA;Lo;0;L;;;;;N;;;;; +0DC5;SINHALA LETTER MUURDHAJA LAYANNA;Lo;0;L;;;;;N;;;;; +0DC6;SINHALA LETTER FAYANNA;Lo;0;L;;;;;N;;;;; +0DCA;SINHALA SIGN AL-LAKUNA;Mn;9;NSM;;;;;N;;;;; +0DCF;SINHALA VOWEL SIGN AELA-PILLA;Mc;0;L;;;;;N;;;;; +0DD0;SINHALA VOWEL SIGN KETTI AEDA-PILLA;Mc;0;L;;;;;N;;;;; +0DD1;SINHALA VOWEL SIGN DIGA AEDA-PILLA;Mc;0;L;;;;;N;;;;; +0DD2;SINHALA VOWEL SIGN KETTI IS-PILLA;Mn;0;NSM;;;;;N;;;;; +0DD3;SINHALA VOWEL SIGN DIGA IS-PILLA;Mn;0;NSM;;;;;N;;;;; +0DD4;SINHALA VOWEL SIGN KETTI PAA-PILLA;Mn;0;NSM;;;;;N;;;;; +0DD6;SINHALA VOWEL SIGN DIGA PAA-PILLA;Mn;0;NSM;;;;;N;;;;; +0DD8;SINHALA VOWEL SIGN GAETTA-PILLA;Mc;0;L;;;;;N;;;;; +0DD9;SINHALA VOWEL SIGN KOMBUVA;Mc;0;L;;;;;N;;;;; +0DDA;SINHALA VOWEL SIGN DIGA KOMBUVA;Mc;0;L;0DD9 0DCA;;;;N;;;;; +0DDB;SINHALA VOWEL SIGN KOMBU DEKA;Mc;0;L;;;;;N;;;;; +0DDC;SINHALA VOWEL SIGN KOMBUVA HAA AELA-PILLA;Mc;0;L;0DD9 0DCF;;;;N;;;;; +0DDD;SINHALA VOWEL SIGN KOMBUVA HAA DIGA AELA-PILLA;Mc;0;L;0DDC 0DCA;;;;N;;;;; +0DDE;SINHALA VOWEL SIGN KOMBUVA HAA GAYANUKITTA;Mc;0;L;0DD9 0DDF;;;;N;;;;; +0DDF;SINHALA VOWEL SIGN GAYANUKITTA;Mc;0;L;;;;;N;;;;; +0DE6;SINHALA LITH DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +0DE7;SINHALA LITH DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +0DE8;SINHALA LITH DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +0DE9;SINHALA LITH DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +0DEA;SINHALA LITH DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +0DEB;SINHALA LITH DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +0DEC;SINHALA LITH DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +0DED;SINHALA LITH DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +0DEE;SINHALA LITH DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +0DEF;SINHALA LITH DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +0DF2;SINHALA VOWEL SIGN DIGA GAETTA-PILLA;Mc;0;L;;;;;N;;;;; +0DF3;SINHALA VOWEL SIGN DIGA GAYANUKITTA;Mc;0;L;;;;;N;;;;; +0DF4;SINHALA PUNCTUATION KUNDDALIYA;Po;0;L;;;;;N;;;;; +0E01;THAI CHARACTER KO KAI;Lo;0;L;;;;;N;THAI LETTER KO KAI;;;; +0E02;THAI CHARACTER KHO KHAI;Lo;0;L;;;;;N;THAI LETTER KHO KHAI;;;; +0E03;THAI CHARACTER KHO KHUAT;Lo;0;L;;;;;N;THAI LETTER KHO KHUAT;;;; +0E04;THAI CHARACTER KHO KHWAI;Lo;0;L;;;;;N;THAI LETTER KHO KHWAI;;;; +0E05;THAI CHARACTER KHO KHON;Lo;0;L;;;;;N;THAI LETTER KHO KHON;;;; +0E06;THAI CHARACTER KHO RAKHANG;Lo;0;L;;;;;N;THAI LETTER KHO RAKHANG;;;; +0E07;THAI CHARACTER NGO NGU;Lo;0;L;;;;;N;THAI LETTER NGO NGU;;;; +0E08;THAI CHARACTER CHO CHAN;Lo;0;L;;;;;N;THAI LETTER CHO CHAN;;;; +0E09;THAI CHARACTER CHO CHING;Lo;0;L;;;;;N;THAI LETTER CHO CHING;;;; +0E0A;THAI CHARACTER CHO CHANG;Lo;0;L;;;;;N;THAI LETTER CHO CHANG;;;; +0E0B;THAI CHARACTER SO SO;Lo;0;L;;;;;N;THAI LETTER SO SO;;;; +0E0C;THAI CHARACTER CHO CHOE;Lo;0;L;;;;;N;THAI LETTER CHO CHOE;;;; +0E0D;THAI CHARACTER YO YING;Lo;0;L;;;;;N;THAI LETTER YO YING;;;; +0E0E;THAI CHARACTER DO CHADA;Lo;0;L;;;;;N;THAI LETTER DO CHADA;;;; +0E0F;THAI CHARACTER TO PATAK;Lo;0;L;;;;;N;THAI LETTER TO PATAK;;;; +0E10;THAI CHARACTER THO THAN;Lo;0;L;;;;;N;THAI LETTER THO THAN;;;; +0E11;THAI CHARACTER THO NANGMONTHO;Lo;0;L;;;;;N;THAI LETTER THO NANGMONTHO;;;; +0E12;THAI CHARACTER THO PHUTHAO;Lo;0;L;;;;;N;THAI LETTER THO PHUTHAO;;;; +0E13;THAI CHARACTER NO NEN;Lo;0;L;;;;;N;THAI LETTER NO NEN;;;; +0E14;THAI CHARACTER DO DEK;Lo;0;L;;;;;N;THAI LETTER DO DEK;;;; +0E15;THAI CHARACTER TO TAO;Lo;0;L;;;;;N;THAI LETTER TO TAO;;;; +0E16;THAI CHARACTER THO THUNG;Lo;0;L;;;;;N;THAI LETTER THO THUNG;;;; +0E17;THAI CHARACTER THO THAHAN;Lo;0;L;;;;;N;THAI LETTER THO THAHAN;;;; +0E18;THAI CHARACTER THO THONG;Lo;0;L;;;;;N;THAI LETTER THO THONG;;;; +0E19;THAI CHARACTER NO NU;Lo;0;L;;;;;N;THAI LETTER NO NU;;;; +0E1A;THAI CHARACTER BO BAIMAI;Lo;0;L;;;;;N;THAI LETTER BO BAIMAI;;;; +0E1B;THAI CHARACTER PO PLA;Lo;0;L;;;;;N;THAI LETTER PO PLA;;;; +0E1C;THAI CHARACTER PHO PHUNG;Lo;0;L;;;;;N;THAI LETTER PHO PHUNG;;;; +0E1D;THAI CHARACTER FO FA;Lo;0;L;;;;;N;THAI LETTER FO FA;;;; +0E1E;THAI CHARACTER PHO PHAN;Lo;0;L;;;;;N;THAI LETTER PHO PHAN;;;; +0E1F;THAI CHARACTER FO FAN;Lo;0;L;;;;;N;THAI LETTER FO FAN;;;; +0E20;THAI CHARACTER PHO SAMPHAO;Lo;0;L;;;;;N;THAI LETTER PHO SAMPHAO;;;; +0E21;THAI CHARACTER MO MA;Lo;0;L;;;;;N;THAI LETTER MO MA;;;; +0E22;THAI CHARACTER YO YAK;Lo;0;L;;;;;N;THAI LETTER YO YAK;;;; +0E23;THAI CHARACTER RO RUA;Lo;0;L;;;;;N;THAI LETTER RO RUA;;;; +0E24;THAI CHARACTER RU;Lo;0;L;;;;;N;THAI LETTER RU;;;; +0E25;THAI CHARACTER LO LING;Lo;0;L;;;;;N;THAI LETTER LO LING;;;; +0E26;THAI CHARACTER LU;Lo;0;L;;;;;N;THAI LETTER LU;;;; +0E27;THAI CHARACTER WO WAEN;Lo;0;L;;;;;N;THAI LETTER WO WAEN;;;; +0E28;THAI CHARACTER SO SALA;Lo;0;L;;;;;N;THAI LETTER SO SALA;;;; +0E29;THAI CHARACTER SO RUSI;Lo;0;L;;;;;N;THAI LETTER SO RUSI;;;; +0E2A;THAI CHARACTER SO SUA;Lo;0;L;;;;;N;THAI LETTER SO SUA;;;; +0E2B;THAI CHARACTER HO HIP;Lo;0;L;;;;;N;THAI LETTER HO HIP;;;; +0E2C;THAI CHARACTER LO CHULA;Lo;0;L;;;;;N;THAI LETTER LO CHULA;;;; +0E2D;THAI CHARACTER O ANG;Lo;0;L;;;;;N;THAI LETTER O ANG;;;; +0E2E;THAI CHARACTER HO NOKHUK;Lo;0;L;;;;;N;THAI LETTER HO NOK HUK;;;; +0E2F;THAI CHARACTER PAIYANNOI;Lo;0;L;;;;;N;THAI PAI YAN NOI;;;; +0E30;THAI CHARACTER SARA A;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA A;;;; +0E31;THAI CHARACTER MAI HAN-AKAT;Mn;0;NSM;;;;;N;THAI VOWEL SIGN MAI HAN-AKAT;;;; +0E32;THAI CHARACTER SARA AA;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA AA;;;; +0E33;THAI CHARACTER SARA AM;Lo;0;L;<compat> 0E4D 0E32;;;;N;THAI VOWEL SIGN SARA AM;;;; +0E34;THAI CHARACTER SARA I;Mn;0;NSM;;;;;N;THAI VOWEL SIGN SARA I;;;; +0E35;THAI CHARACTER SARA II;Mn;0;NSM;;;;;N;THAI VOWEL SIGN SARA II;;;; +0E36;THAI CHARACTER SARA UE;Mn;0;NSM;;;;;N;THAI VOWEL SIGN SARA UE;;;; +0E37;THAI CHARACTER SARA UEE;Mn;0;NSM;;;;;N;THAI VOWEL SIGN SARA UEE;;;; +0E38;THAI CHARACTER SARA U;Mn;103;NSM;;;;;N;THAI VOWEL SIGN SARA U;;;; +0E39;THAI CHARACTER SARA UU;Mn;103;NSM;;;;;N;THAI VOWEL SIGN SARA UU;;;; +0E3A;THAI CHARACTER PHINTHU;Mn;9;NSM;;;;;N;THAI VOWEL SIGN PHINTHU;;;; +0E3F;THAI CURRENCY SYMBOL BAHT;Sc;0;ET;;;;;N;THAI BAHT SIGN;;;; +0E40;THAI CHARACTER SARA E;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA E;;;; +0E41;THAI CHARACTER SARA AE;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA AE;;;; +0E42;THAI CHARACTER SARA O;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA O;;;; +0E43;THAI CHARACTER SARA AI MAIMUAN;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA MAI MUAN;;;; +0E44;THAI CHARACTER SARA AI MAIMALAI;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA MAI MALAI;;;; +0E45;THAI CHARACTER LAKKHANGYAO;Lo;0;L;;;;;N;THAI LAK KHANG YAO;;;; +0E46;THAI CHARACTER MAIYAMOK;Lm;0;L;;;;;N;THAI MAI YAMOK;;;; +0E47;THAI CHARACTER MAITAIKHU;Mn;0;NSM;;;;;N;THAI VOWEL SIGN MAI TAI KHU;;;; +0E48;THAI CHARACTER MAI EK;Mn;107;NSM;;;;;N;THAI TONE MAI EK;;;; +0E49;THAI CHARACTER MAI THO;Mn;107;NSM;;;;;N;THAI TONE MAI THO;;;; +0E4A;THAI CHARACTER MAI TRI;Mn;107;NSM;;;;;N;THAI TONE MAI TRI;;;; +0E4B;THAI CHARACTER MAI CHATTAWA;Mn;107;NSM;;;;;N;THAI TONE MAI CHATTAWA;;;; +0E4C;THAI CHARACTER THANTHAKHAT;Mn;0;NSM;;;;;N;THAI THANTHAKHAT;;;; +0E4D;THAI CHARACTER NIKHAHIT;Mn;0;NSM;;;;;N;THAI NIKKHAHIT;;;; +0E4E;THAI CHARACTER YAMAKKAN;Mn;0;NSM;;;;;N;THAI YAMAKKAN;;;; +0E4F;THAI CHARACTER FONGMAN;Po;0;L;;;;;N;THAI FONGMAN;;;; +0E50;THAI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +0E51;THAI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +0E52;THAI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +0E53;THAI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +0E54;THAI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +0E55;THAI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +0E56;THAI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +0E57;THAI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +0E58;THAI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +0E59;THAI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +0E5A;THAI CHARACTER ANGKHANKHU;Po;0;L;;;;;N;THAI ANGKHANKHU;;;; +0E5B;THAI CHARACTER KHOMUT;Po;0;L;;;;;N;THAI KHOMUT;;;; +0E81;LAO LETTER KO;Lo;0;L;;;;;N;;;;; +0E82;LAO LETTER KHO SUNG;Lo;0;L;;;;;N;;;;; +0E84;LAO LETTER KHO TAM;Lo;0;L;;;;;N;;;;; +0E87;LAO LETTER NGO;Lo;0;L;;;;;N;;;;; +0E88;LAO LETTER CO;Lo;0;L;;;;;N;;;;; +0E8A;LAO LETTER SO TAM;Lo;0;L;;;;;N;;;;; +0E8D;LAO LETTER NYO;Lo;0;L;;;;;N;;;;; +0E94;LAO LETTER DO;Lo;0;L;;;;;N;;;;; +0E95;LAO LETTER TO;Lo;0;L;;;;;N;;;;; +0E96;LAO LETTER THO SUNG;Lo;0;L;;;;;N;;;;; +0E97;LAO LETTER THO TAM;Lo;0;L;;;;;N;;;;; +0E99;LAO LETTER NO;Lo;0;L;;;;;N;;;;; +0E9A;LAO LETTER BO;Lo;0;L;;;;;N;;;;; +0E9B;LAO LETTER PO;Lo;0;L;;;;;N;;;;; +0E9C;LAO LETTER PHO SUNG;Lo;0;L;;;;;N;;;;; +0E9D;LAO LETTER FO TAM;Lo;0;L;;;;;N;;;;; +0E9E;LAO LETTER PHO TAM;Lo;0;L;;;;;N;;;;; +0E9F;LAO LETTER FO SUNG;Lo;0;L;;;;;N;;;;; +0EA1;LAO LETTER MO;Lo;0;L;;;;;N;;;;; +0EA2;LAO LETTER YO;Lo;0;L;;;;;N;;;;; +0EA3;LAO LETTER LO LING;Lo;0;L;;;;;N;;;;; +0EA5;LAO LETTER LO LOOT;Lo;0;L;;;;;N;;;;; +0EA7;LAO LETTER WO;Lo;0;L;;;;;N;;;;; +0EAA;LAO LETTER SO SUNG;Lo;0;L;;;;;N;;;;; +0EAB;LAO LETTER HO SUNG;Lo;0;L;;;;;N;;;;; +0EAD;LAO LETTER O;Lo;0;L;;;;;N;;;;; +0EAE;LAO LETTER HO TAM;Lo;0;L;;;;;N;;;;; +0EAF;LAO ELLIPSIS;Lo;0;L;;;;;N;;;;; +0EB0;LAO VOWEL SIGN A;Lo;0;L;;;;;N;;;;; +0EB1;LAO VOWEL SIGN MAI KAN;Mn;0;NSM;;;;;N;;;;; +0EB2;LAO VOWEL SIGN AA;Lo;0;L;;;;;N;;;;; +0EB3;LAO VOWEL SIGN AM;Lo;0;L;<compat> 0ECD 0EB2;;;;N;;;;; +0EB4;LAO VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +0EB5;LAO VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; +0EB6;LAO VOWEL SIGN Y;Mn;0;NSM;;;;;N;;;;; +0EB7;LAO VOWEL SIGN YY;Mn;0;NSM;;;;;N;;;;; +0EB8;LAO VOWEL SIGN U;Mn;118;NSM;;;;;N;;;;; +0EB9;LAO VOWEL SIGN UU;Mn;118;NSM;;;;;N;;;;; +0EBB;LAO VOWEL SIGN MAI KON;Mn;0;NSM;;;;;N;;;;; +0EBC;LAO SEMIVOWEL SIGN LO;Mn;0;NSM;;;;;N;;;;; +0EBD;LAO SEMIVOWEL SIGN NYO;Lo;0;L;;;;;N;;;;; +0EC0;LAO VOWEL SIGN E;Lo;0;L;;;;;N;;;;; +0EC1;LAO VOWEL SIGN EI;Lo;0;L;;;;;N;;;;; +0EC2;LAO VOWEL SIGN O;Lo;0;L;;;;;N;;;;; +0EC3;LAO VOWEL SIGN AY;Lo;0;L;;;;;N;;;;; +0EC4;LAO VOWEL SIGN AI;Lo;0;L;;;;;N;;;;; +0EC6;LAO KO LA;Lm;0;L;;;;;N;;;;; +0EC8;LAO TONE MAI EK;Mn;122;NSM;;;;;N;;;;; +0EC9;LAO TONE MAI THO;Mn;122;NSM;;;;;N;;;;; +0ECA;LAO TONE MAI TI;Mn;122;NSM;;;;;N;;;;; +0ECB;LAO TONE MAI CATAWA;Mn;122;NSM;;;;;N;;;;; +0ECC;LAO CANCELLATION MARK;Mn;0;NSM;;;;;N;;;;; +0ECD;LAO NIGGAHITA;Mn;0;NSM;;;;;N;;;;; +0ED0;LAO DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +0ED1;LAO DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +0ED2;LAO DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +0ED3;LAO DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +0ED4;LAO DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +0ED5;LAO DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +0ED6;LAO DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +0ED7;LAO DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +0ED8;LAO DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +0ED9;LAO DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +0EDC;LAO HO NO;Lo;0;L;<compat> 0EAB 0E99;;;;N;;;;; +0EDD;LAO HO MO;Lo;0;L;<compat> 0EAB 0EA1;;;;N;;;;; +0EDE;LAO LETTER KHMU GO;Lo;0;L;;;;;N;;;;; +0EDF;LAO LETTER KHMU NYO;Lo;0;L;;;;;N;;;;; +0F00;TIBETAN SYLLABLE OM;Lo;0;L;;;;;N;;;;; +0F01;TIBETAN MARK GTER YIG MGO TRUNCATED A;So;0;L;;;;;N;;;;; +0F02;TIBETAN MARK GTER YIG MGO -UM RNAM BCAD MA;So;0;L;;;;;N;;;;; +0F03;TIBETAN MARK GTER YIG MGO -UM GTER TSHEG MA;So;0;L;;;;;N;;;;; +0F04;TIBETAN MARK INITIAL YIG MGO MDUN MA;Po;0;L;;;;;N;TIBETAN SINGLE ORNAMENT;;;; +0F05;TIBETAN MARK CLOSING YIG MGO SGAB MA;Po;0;L;;;;;N;;;;; +0F06;TIBETAN MARK CARET YIG MGO PHUR SHAD MA;Po;0;L;;;;;N;;;;; +0F07;TIBETAN MARK YIG MGO TSHEG SHAD MA;Po;0;L;;;;;N;;;;; +0F08;TIBETAN MARK SBRUL SHAD;Po;0;L;;;;;N;TIBETAN RGYANSHAD;;;; +0F09;TIBETAN MARK BSKUR YIG MGO;Po;0;L;;;;;N;;;;; +0F0A;TIBETAN MARK BKA- SHOG YIG MGO;Po;0;L;;;;;N;;;;; +0F0B;TIBETAN MARK INTERSYLLABIC TSHEG;Po;0;L;;;;;N;TIBETAN TSEG;;;; +0F0C;TIBETAN MARK DELIMITER TSHEG BSTAR;Po;0;L;<noBreak> 0F0B;;;;N;;;;; +0F0D;TIBETAN MARK SHAD;Po;0;L;;;;;N;TIBETAN SHAD;;;; +0F0E;TIBETAN MARK NYIS SHAD;Po;0;L;;;;;N;TIBETAN DOUBLE SHAD;;;; +0F0F;TIBETAN MARK TSHEG SHAD;Po;0;L;;;;;N;;;;; +0F10;TIBETAN MARK NYIS TSHEG SHAD;Po;0;L;;;;;N;;;;; +0F11;TIBETAN MARK RIN CHEN SPUNGS SHAD;Po;0;L;;;;;N;TIBETAN RINCHANPHUNGSHAD;;;; +0F12;TIBETAN MARK RGYA GRAM SHAD;Po;0;L;;;;;N;;;;; +0F13;TIBETAN MARK CARET -DZUD RTAGS ME LONG CAN;So;0;L;;;;;N;;;;; +0F14;TIBETAN MARK GTER TSHEG;Po;0;L;;;;;N;TIBETAN COMMA;;;; +0F15;TIBETAN LOGOTYPE SIGN CHAD RTAGS;So;0;L;;;;;N;;;;; +0F16;TIBETAN LOGOTYPE SIGN LHAG RTAGS;So;0;L;;;;;N;;;;; +0F17;TIBETAN ASTROLOGICAL SIGN SGRA GCAN -CHAR RTAGS;So;0;L;;;;;N;;;;; +0F18;TIBETAN ASTROLOGICAL SIGN -KHYUD PA;Mn;220;NSM;;;;;N;;;;; +0F19;TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS;Mn;220;NSM;;;;;N;;;;; +0F1A;TIBETAN SIGN RDEL DKAR GCIG;So;0;L;;;;;N;;;;; +0F1B;TIBETAN SIGN RDEL DKAR GNYIS;So;0;L;;;;;N;;;;; +0F1C;TIBETAN SIGN RDEL DKAR GSUM;So;0;L;;;;;N;;;;; +0F1D;TIBETAN SIGN RDEL NAG GCIG;So;0;L;;;;;N;;;;; +0F1E;TIBETAN SIGN RDEL NAG GNYIS;So;0;L;;;;;N;;;;; +0F1F;TIBETAN SIGN RDEL DKAR RDEL NAG;So;0;L;;;;;N;;;;; +0F20;TIBETAN DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +0F21;TIBETAN DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +0F22;TIBETAN DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +0F23;TIBETAN DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +0F24;TIBETAN DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +0F25;TIBETAN DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +0F26;TIBETAN DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +0F27;TIBETAN DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +0F28;TIBETAN DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +0F29;TIBETAN DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +0F2A;TIBETAN DIGIT HALF ONE;No;0;L;;;;1/2;N;;;;; +0F2B;TIBETAN DIGIT HALF TWO;No;0;L;;;;3/2;N;;;;; +0F2C;TIBETAN DIGIT HALF THREE;No;0;L;;;;5/2;N;;;;; +0F2D;TIBETAN DIGIT HALF FOUR;No;0;L;;;;7/2;N;;;;; +0F2E;TIBETAN DIGIT HALF FIVE;No;0;L;;;;9/2;N;;;;; +0F2F;TIBETAN DIGIT HALF SIX;No;0;L;;;;11/2;N;;;;; +0F30;TIBETAN DIGIT HALF SEVEN;No;0;L;;;;13/2;N;;;;; +0F31;TIBETAN DIGIT HALF EIGHT;No;0;L;;;;15/2;N;;;;; +0F32;TIBETAN DIGIT HALF NINE;No;0;L;;;;17/2;N;;;;; +0F33;TIBETAN DIGIT HALF ZERO;No;0;L;;;;-1/2;N;;;;; +0F34;TIBETAN MARK BSDUS RTAGS;So;0;L;;;;;N;;;;; +0F35;TIBETAN MARK NGAS BZUNG NYI ZLA;Mn;220;NSM;;;;;N;TIBETAN HONORIFIC UNDER RING;;;; +0F36;TIBETAN MARK CARET -DZUD RTAGS BZHI MIG CAN;So;0;L;;;;;N;;;;; +0F37;TIBETAN MARK NGAS BZUNG SGOR RTAGS;Mn;220;NSM;;;;;N;TIBETAN UNDER RING;;;; +0F38;TIBETAN MARK CHE MGO;So;0;L;;;;;N;;;;; +0F39;TIBETAN MARK TSA -PHRU;Mn;216;NSM;;;;;N;TIBETAN LENITION MARK;;;; +0F3A;TIBETAN MARK GUG RTAGS GYON;Ps;0;ON;;;;;Y;;;;; +0F3B;TIBETAN MARK GUG RTAGS GYAS;Pe;0;ON;;;;;Y;;;;; +0F3C;TIBETAN MARK ANG KHANG GYON;Ps;0;ON;;;;;Y;TIBETAN LEFT BRACE;;;; +0F3D;TIBETAN MARK ANG KHANG GYAS;Pe;0;ON;;;;;Y;TIBETAN RIGHT BRACE;;;; +0F3E;TIBETAN SIGN YAR TSHES;Mc;0;L;;;;;N;;;;; +0F3F;TIBETAN SIGN MAR TSHES;Mc;0;L;;;;;N;;;;; +0F40;TIBETAN LETTER KA;Lo;0;L;;;;;N;;;;; +0F41;TIBETAN LETTER KHA;Lo;0;L;;;;;N;;;;; +0F42;TIBETAN LETTER GA;Lo;0;L;;;;;N;;;;; +0F43;TIBETAN LETTER GHA;Lo;0;L;0F42 0FB7;;;;N;;;;; +0F44;TIBETAN LETTER NGA;Lo;0;L;;;;;N;;;;; +0F45;TIBETAN LETTER CA;Lo;0;L;;;;;N;;;;; +0F46;TIBETAN LETTER CHA;Lo;0;L;;;;;N;;;;; +0F47;TIBETAN LETTER JA;Lo;0;L;;;;;N;;;;; +0F49;TIBETAN LETTER NYA;Lo;0;L;;;;;N;;;;; +0F4A;TIBETAN LETTER TTA;Lo;0;L;;;;;N;TIBETAN LETTER REVERSED TA;;;; +0F4B;TIBETAN LETTER TTHA;Lo;0;L;;;;;N;TIBETAN LETTER REVERSED THA;;;; +0F4C;TIBETAN LETTER DDA;Lo;0;L;;;;;N;TIBETAN LETTER REVERSED DA;;;; +0F4D;TIBETAN LETTER DDHA;Lo;0;L;0F4C 0FB7;;;;N;;;;; +0F4E;TIBETAN LETTER NNA;Lo;0;L;;;;;N;TIBETAN LETTER REVERSED NA;;;; +0F4F;TIBETAN LETTER TA;Lo;0;L;;;;;N;;;;; +0F50;TIBETAN LETTER THA;Lo;0;L;;;;;N;;;;; +0F51;TIBETAN LETTER DA;Lo;0;L;;;;;N;;;;; +0F52;TIBETAN LETTER DHA;Lo;0;L;0F51 0FB7;;;;N;;;;; +0F53;TIBETAN LETTER NA;Lo;0;L;;;;;N;;;;; +0F54;TIBETAN LETTER PA;Lo;0;L;;;;;N;;;;; +0F55;TIBETAN LETTER PHA;Lo;0;L;;;;;N;;;;; +0F56;TIBETAN LETTER BA;Lo;0;L;;;;;N;;;;; +0F57;TIBETAN LETTER BHA;Lo;0;L;0F56 0FB7;;;;N;;;;; +0F58;TIBETAN LETTER MA;Lo;0;L;;;;;N;;;;; +0F59;TIBETAN LETTER TSA;Lo;0;L;;;;;N;;;;; +0F5A;TIBETAN LETTER TSHA;Lo;0;L;;;;;N;;;;; +0F5B;TIBETAN LETTER DZA;Lo;0;L;;;;;N;;;;; +0F5C;TIBETAN LETTER DZHA;Lo;0;L;0F5B 0FB7;;;;N;;;;; +0F5D;TIBETAN LETTER WA;Lo;0;L;;;;;N;;;;; +0F5E;TIBETAN LETTER ZHA;Lo;0;L;;;;;N;;;;; +0F5F;TIBETAN LETTER ZA;Lo;0;L;;;;;N;;;;; +0F60;TIBETAN LETTER -A;Lo;0;L;;;;;N;TIBETAN LETTER AA;;;; +0F61;TIBETAN LETTER YA;Lo;0;L;;;;;N;;;;; +0F62;TIBETAN LETTER RA;Lo;0;L;;;;;N;;;;; +0F63;TIBETAN LETTER LA;Lo;0;L;;;;;N;;;;; +0F64;TIBETAN LETTER SHA;Lo;0;L;;;;;N;;;;; +0F65;TIBETAN LETTER SSA;Lo;0;L;;;;;N;TIBETAN LETTER REVERSED SHA;;;; +0F66;TIBETAN LETTER SA;Lo;0;L;;;;;N;;;;; +0F67;TIBETAN LETTER HA;Lo;0;L;;;;;N;;;;; +0F68;TIBETAN LETTER A;Lo;0;L;;;;;N;;;;; +0F69;TIBETAN LETTER KSSA;Lo;0;L;0F40 0FB5;;;;N;;;;; +0F6A;TIBETAN LETTER FIXED-FORM RA;Lo;0;L;;;;;N;;;;; +0F6B;TIBETAN LETTER KKA;Lo;0;L;;;;;N;;;;; +0F6C;TIBETAN LETTER RRA;Lo;0;L;;;;;N;;;;; +0F71;TIBETAN VOWEL SIGN AA;Mn;129;NSM;;;;;N;;;;; +0F72;TIBETAN VOWEL SIGN I;Mn;130;NSM;;;;;N;;;;; +0F73;TIBETAN VOWEL SIGN II;Mn;0;NSM;0F71 0F72;;;;N;;;;; +0F74;TIBETAN VOWEL SIGN U;Mn;132;NSM;;;;;N;;;;; +0F75;TIBETAN VOWEL SIGN UU;Mn;0;NSM;0F71 0F74;;;;N;;;;; +0F76;TIBETAN VOWEL SIGN VOCALIC R;Mn;0;NSM;0FB2 0F80;;;;N;;;;; +0F77;TIBETAN VOWEL SIGN VOCALIC RR;Mn;0;NSM;<compat> 0FB2 0F81;;;;N;;;;; +0F78;TIBETAN VOWEL SIGN VOCALIC L;Mn;0;NSM;0FB3 0F80;;;;N;;;;; +0F79;TIBETAN VOWEL SIGN VOCALIC LL;Mn;0;NSM;<compat> 0FB3 0F81;;;;N;;;;; +0F7A;TIBETAN VOWEL SIGN E;Mn;130;NSM;;;;;N;;;;; +0F7B;TIBETAN VOWEL SIGN EE;Mn;130;NSM;;;;;N;TIBETAN VOWEL SIGN AI;;;; +0F7C;TIBETAN VOWEL SIGN O;Mn;130;NSM;;;;;N;;;;; +0F7D;TIBETAN VOWEL SIGN OO;Mn;130;NSM;;;;;N;TIBETAN VOWEL SIGN AU;;;; +0F7E;TIBETAN SIGN RJES SU NGA RO;Mn;0;NSM;;;;;N;TIBETAN ANUSVARA;;;; +0F7F;TIBETAN SIGN RNAM BCAD;Mc;0;L;;;;;N;TIBETAN VISARGA;;;; +0F80;TIBETAN VOWEL SIGN REVERSED I;Mn;130;NSM;;;;;N;TIBETAN VOWEL SIGN SHORT I;;;; +0F81;TIBETAN VOWEL SIGN REVERSED II;Mn;0;NSM;0F71 0F80;;;;N;;;;; +0F82;TIBETAN SIGN NYI ZLA NAA DA;Mn;230;NSM;;;;;N;TIBETAN CANDRABINDU WITH ORNAMENT;;;; +0F83;TIBETAN SIGN SNA LDAN;Mn;230;NSM;;;;;N;TIBETAN CANDRABINDU;;;; +0F84;TIBETAN MARK HALANTA;Mn;9;NSM;;;;;N;TIBETAN VIRAMA;;;; +0F85;TIBETAN MARK PALUTA;Po;0;L;;;;;N;TIBETAN CHUCHENYIGE;;;; +0F86;TIBETAN SIGN LCI RTAGS;Mn;230;NSM;;;;;N;;;;; +0F87;TIBETAN SIGN YANG RTAGS;Mn;230;NSM;;;;;N;;;;; +0F88;TIBETAN SIGN LCE TSA CAN;Lo;0;L;;;;;N;;;;; +0F89;TIBETAN SIGN MCHU CAN;Lo;0;L;;;;;N;;;;; +0F8A;TIBETAN SIGN GRU CAN RGYINGS;Lo;0;L;;;;;N;;;;; +0F8B;TIBETAN SIGN GRU MED RGYINGS;Lo;0;L;;;;;N;;;;; +0F8C;TIBETAN SIGN INVERTED MCHU CAN;Lo;0;L;;;;;N;;;;; +0F8D;TIBETAN SUBJOINED SIGN LCE TSA CAN;Mn;0;NSM;;;;;N;;;;; +0F8E;TIBETAN SUBJOINED SIGN MCHU CAN;Mn;0;NSM;;;;;N;;;;; +0F8F;TIBETAN SUBJOINED SIGN INVERTED MCHU CAN;Mn;0;NSM;;;;;N;;;;; +0F90;TIBETAN SUBJOINED LETTER KA;Mn;0;NSM;;;;;N;;;;; +0F91;TIBETAN SUBJOINED LETTER KHA;Mn;0;NSM;;;;;N;;;;; +0F92;TIBETAN SUBJOINED LETTER GA;Mn;0;NSM;;;;;N;;;;; +0F93;TIBETAN SUBJOINED LETTER GHA;Mn;0;NSM;0F92 0FB7;;;;N;;;;; +0F94;TIBETAN SUBJOINED LETTER NGA;Mn;0;NSM;;;;;N;;;;; +0F95;TIBETAN SUBJOINED LETTER CA;Mn;0;NSM;;;;;N;;;;; +0F96;TIBETAN SUBJOINED LETTER CHA;Mn;0;NSM;;;;;N;;;;; +0F97;TIBETAN SUBJOINED LETTER JA;Mn;0;NSM;;;;;N;;;;; +0F99;TIBETAN SUBJOINED LETTER NYA;Mn;0;NSM;;;;;N;;;;; +0F9A;TIBETAN SUBJOINED LETTER TTA;Mn;0;NSM;;;;;N;;;;; +0F9B;TIBETAN SUBJOINED LETTER TTHA;Mn;0;NSM;;;;;N;;;;; +0F9C;TIBETAN SUBJOINED LETTER DDA;Mn;0;NSM;;;;;N;;;;; +0F9D;TIBETAN SUBJOINED LETTER DDHA;Mn;0;NSM;0F9C 0FB7;;;;N;;;;; +0F9E;TIBETAN SUBJOINED LETTER NNA;Mn;0;NSM;;;;;N;;;;; +0F9F;TIBETAN SUBJOINED LETTER TA;Mn;0;NSM;;;;;N;;;;; +0FA0;TIBETAN SUBJOINED LETTER THA;Mn;0;NSM;;;;;N;;;;; +0FA1;TIBETAN SUBJOINED LETTER DA;Mn;0;NSM;;;;;N;;;;; +0FA2;TIBETAN SUBJOINED LETTER DHA;Mn;0;NSM;0FA1 0FB7;;;;N;;;;; +0FA3;TIBETAN SUBJOINED LETTER NA;Mn;0;NSM;;;;;N;;;;; +0FA4;TIBETAN SUBJOINED LETTER PA;Mn;0;NSM;;;;;N;;;;; +0FA5;TIBETAN SUBJOINED LETTER PHA;Mn;0;NSM;;;;;N;;;;; +0FA6;TIBETAN SUBJOINED LETTER BA;Mn;0;NSM;;;;;N;;;;; +0FA7;TIBETAN SUBJOINED LETTER BHA;Mn;0;NSM;0FA6 0FB7;;;;N;;;;; +0FA8;TIBETAN SUBJOINED LETTER MA;Mn;0;NSM;;;;;N;;;;; +0FA9;TIBETAN SUBJOINED LETTER TSA;Mn;0;NSM;;;;;N;;;;; +0FAA;TIBETAN SUBJOINED LETTER TSHA;Mn;0;NSM;;;;;N;;;;; +0FAB;TIBETAN SUBJOINED LETTER DZA;Mn;0;NSM;;;;;N;;;;; +0FAC;TIBETAN SUBJOINED LETTER DZHA;Mn;0;NSM;0FAB 0FB7;;;;N;;;;; +0FAD;TIBETAN SUBJOINED LETTER WA;Mn;0;NSM;;;;;N;;;;; +0FAE;TIBETAN SUBJOINED LETTER ZHA;Mn;0;NSM;;;;;N;;;;; +0FAF;TIBETAN SUBJOINED LETTER ZA;Mn;0;NSM;;;;;N;;;;; +0FB0;TIBETAN SUBJOINED LETTER -A;Mn;0;NSM;;;;;N;;;;; +0FB1;TIBETAN SUBJOINED LETTER YA;Mn;0;NSM;;;;;N;;;;; +0FB2;TIBETAN SUBJOINED LETTER RA;Mn;0;NSM;;;;;N;;;;; +0FB3;TIBETAN SUBJOINED LETTER LA;Mn;0;NSM;;;;;N;;;;; +0FB4;TIBETAN SUBJOINED LETTER SHA;Mn;0;NSM;;;;;N;;;;; +0FB5;TIBETAN SUBJOINED LETTER SSA;Mn;0;NSM;;;;;N;;;;; +0FB6;TIBETAN SUBJOINED LETTER SA;Mn;0;NSM;;;;;N;;;;; +0FB7;TIBETAN SUBJOINED LETTER HA;Mn;0;NSM;;;;;N;;;;; +0FB8;TIBETAN SUBJOINED LETTER A;Mn;0;NSM;;;;;N;;;;; +0FB9;TIBETAN SUBJOINED LETTER KSSA;Mn;0;NSM;0F90 0FB5;;;;N;;;;; +0FBA;TIBETAN SUBJOINED LETTER FIXED-FORM WA;Mn;0;NSM;;;;;N;;;;; +0FBB;TIBETAN SUBJOINED LETTER FIXED-FORM YA;Mn;0;NSM;;;;;N;;;;; +0FBC;TIBETAN SUBJOINED LETTER FIXED-FORM RA;Mn;0;NSM;;;;;N;;;;; +0FBE;TIBETAN KU RU KHA;So;0;L;;;;;N;;;;; +0FBF;TIBETAN KU RU KHA BZHI MIG CAN;So;0;L;;;;;N;;;;; +0FC0;TIBETAN CANTILLATION SIGN HEAVY BEAT;So;0;L;;;;;N;;;;; +0FC1;TIBETAN CANTILLATION SIGN LIGHT BEAT;So;0;L;;;;;N;;;;; +0FC2;TIBETAN CANTILLATION SIGN CANG TE-U;So;0;L;;;;;N;;;;; +0FC3;TIBETAN CANTILLATION SIGN SBUB -CHAL;So;0;L;;;;;N;;;;; +0FC4;TIBETAN SYMBOL DRIL BU;So;0;L;;;;;N;;;;; +0FC5;TIBETAN SYMBOL RDO RJE;So;0;L;;;;;N;;;;; +0FC6;TIBETAN SYMBOL PADMA GDAN;Mn;220;NSM;;;;;N;;;;; +0FC7;TIBETAN SYMBOL RDO RJE RGYA GRAM;So;0;L;;;;;N;;;;; +0FC8;TIBETAN SYMBOL PHUR PA;So;0;L;;;;;N;;;;; +0FC9;TIBETAN SYMBOL NOR BU;So;0;L;;;;;N;;;;; +0FCA;TIBETAN SYMBOL NOR BU NYIS -KHYIL;So;0;L;;;;;N;;;;; +0FCB;TIBETAN SYMBOL NOR BU GSUM -KHYIL;So;0;L;;;;;N;;;;; +0FCC;TIBETAN SYMBOL NOR BU BZHI -KHYIL;So;0;L;;;;;N;;;;; +0FCE;TIBETAN SIGN RDEL NAG RDEL DKAR;So;0;L;;;;;N;;;;; +0FCF;TIBETAN SIGN RDEL NAG GSUM;So;0;L;;;;;N;;;;; +0FD0;TIBETAN MARK BSKA- SHOG GI MGO RGYAN;Po;0;L;;;;;N;;;;; +0FD1;TIBETAN MARK MNYAM YIG GI MGO RGYAN;Po;0;L;;;;;N;;;;; +0FD2;TIBETAN MARK NYIS TSHEG;Po;0;L;;;;;N;;;;; +0FD3;TIBETAN MARK INITIAL BRDA RNYING YIG MGO MDUN MA;Po;0;L;;;;;N;;;;; +0FD4;TIBETAN MARK CLOSING BRDA RNYING YIG MGO SGAB MA;Po;0;L;;;;;N;;;;; +0FD5;RIGHT-FACING SVASTI SIGN;So;0;L;;;;;N;;;;; +0FD6;LEFT-FACING SVASTI SIGN;So;0;L;;;;;N;;;;; +0FD7;RIGHT-FACING SVASTI SIGN WITH DOTS;So;0;L;;;;;N;;;;; +0FD8;LEFT-FACING SVASTI SIGN WITH DOTS;So;0;L;;;;;N;;;;; +0FD9;TIBETAN MARK LEADING MCHAN RTAGS;Po;0;L;;;;;N;;;;; +0FDA;TIBETAN MARK TRAILING MCHAN RTAGS;Po;0;L;;;;;N;;;;; +1000;MYANMAR LETTER KA;Lo;0;L;;;;;N;;;;; +1001;MYANMAR LETTER KHA;Lo;0;L;;;;;N;;;;; +1002;MYANMAR LETTER GA;Lo;0;L;;;;;N;;;;; +1003;MYANMAR LETTER GHA;Lo;0;L;;;;;N;;;;; +1004;MYANMAR LETTER NGA;Lo;0;L;;;;;N;;;;; +1005;MYANMAR LETTER CA;Lo;0;L;;;;;N;;;;; +1006;MYANMAR LETTER CHA;Lo;0;L;;;;;N;;;;; +1007;MYANMAR LETTER JA;Lo;0;L;;;;;N;;;;; +1008;MYANMAR LETTER JHA;Lo;0;L;;;;;N;;;;; +1009;MYANMAR LETTER NYA;Lo;0;L;;;;;N;;;;; +100A;MYANMAR LETTER NNYA;Lo;0;L;;;;;N;;;;; +100B;MYANMAR LETTER TTA;Lo;0;L;;;;;N;;;;; +100C;MYANMAR LETTER TTHA;Lo;0;L;;;;;N;;;;; +100D;MYANMAR LETTER DDA;Lo;0;L;;;;;N;;;;; +100E;MYANMAR LETTER DDHA;Lo;0;L;;;;;N;;;;; +100F;MYANMAR LETTER NNA;Lo;0;L;;;;;N;;;;; +1010;MYANMAR LETTER TA;Lo;0;L;;;;;N;;;;; +1011;MYANMAR LETTER THA;Lo;0;L;;;;;N;;;;; +1012;MYANMAR LETTER DA;Lo;0;L;;;;;N;;;;; +1013;MYANMAR LETTER DHA;Lo;0;L;;;;;N;;;;; +1014;MYANMAR LETTER NA;Lo;0;L;;;;;N;;;;; +1015;MYANMAR LETTER PA;Lo;0;L;;;;;N;;;;; +1016;MYANMAR LETTER PHA;Lo;0;L;;;;;N;;;;; +1017;MYANMAR LETTER BA;Lo;0;L;;;;;N;;;;; +1018;MYANMAR LETTER BHA;Lo;0;L;;;;;N;;;;; +1019;MYANMAR LETTER MA;Lo;0;L;;;;;N;;;;; +101A;MYANMAR LETTER YA;Lo;0;L;;;;;N;;;;; +101B;MYANMAR LETTER RA;Lo;0;L;;;;;N;;;;; +101C;MYANMAR LETTER LA;Lo;0;L;;;;;N;;;;; +101D;MYANMAR LETTER WA;Lo;0;L;;;;;N;;;;; +101E;MYANMAR LETTER SA;Lo;0;L;;;;;N;;;;; +101F;MYANMAR LETTER HA;Lo;0;L;;;;;N;;;;; +1020;MYANMAR LETTER LLA;Lo;0;L;;;;;N;;;;; +1021;MYANMAR LETTER A;Lo;0;L;;;;;N;;;;; +1022;MYANMAR LETTER SHAN A;Lo;0;L;;;;;N;;;;; +1023;MYANMAR LETTER I;Lo;0;L;;;;;N;;;;; +1024;MYANMAR LETTER II;Lo;0;L;;;;;N;;;;; +1025;MYANMAR LETTER U;Lo;0;L;;;;;N;;;;; +1026;MYANMAR LETTER UU;Lo;0;L;1025 102E;;;;N;;;;; +1027;MYANMAR LETTER E;Lo;0;L;;;;;N;;;;; +1028;MYANMAR LETTER MON E;Lo;0;L;;;;;N;;;;; +1029;MYANMAR LETTER O;Lo;0;L;;;;;N;;;;; +102A;MYANMAR LETTER AU;Lo;0;L;;;;;N;;;;; +102B;MYANMAR VOWEL SIGN TALL AA;Mc;0;L;;;;;N;;;;; +102C;MYANMAR VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +102D;MYANMAR VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +102E;MYANMAR VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; +102F;MYANMAR VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +1030;MYANMAR VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +1031;MYANMAR VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +1032;MYANMAR VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +1033;MYANMAR VOWEL SIGN MON II;Mn;0;NSM;;;;;N;;;;; +1034;MYANMAR VOWEL SIGN MON O;Mn;0;NSM;;;;;N;;;;; +1035;MYANMAR VOWEL SIGN E ABOVE;Mn;0;NSM;;;;;N;;;;; +1036;MYANMAR SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +1037;MYANMAR SIGN DOT BELOW;Mn;7;NSM;;;;;N;;;;; +1038;MYANMAR SIGN VISARGA;Mc;0;L;;;;;N;;;;; +1039;MYANMAR SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +103A;MYANMAR SIGN ASAT;Mn;9;NSM;;;;;N;;;;; +103B;MYANMAR CONSONANT SIGN MEDIAL YA;Mc;0;L;;;;;N;;;;; +103C;MYANMAR CONSONANT SIGN MEDIAL RA;Mc;0;L;;;;;N;;;;; +103D;MYANMAR CONSONANT SIGN MEDIAL WA;Mn;0;NSM;;;;;N;;;;; +103E;MYANMAR CONSONANT SIGN MEDIAL HA;Mn;0;NSM;;;;;N;;;;; +103F;MYANMAR LETTER GREAT SA;Lo;0;L;;;;;N;;;;; +1040;MYANMAR DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +1041;MYANMAR DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +1042;MYANMAR DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +1043;MYANMAR DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +1044;MYANMAR DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +1045;MYANMAR DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +1046;MYANMAR DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +1047;MYANMAR DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +1048;MYANMAR DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +1049;MYANMAR DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +104A;MYANMAR SIGN LITTLE SECTION;Po;0;L;;;;;N;;;;; +104B;MYANMAR SIGN SECTION;Po;0;L;;;;;N;;;;; +104C;MYANMAR SYMBOL LOCATIVE;Po;0;L;;;;;N;;;;; +104D;MYANMAR SYMBOL COMPLETED;Po;0;L;;;;;N;;;;; +104E;MYANMAR SYMBOL AFOREMENTIONED;Po;0;L;;;;;N;;;;; +104F;MYANMAR SYMBOL GENITIVE;Po;0;L;;;;;N;;;;; +1050;MYANMAR LETTER SHA;Lo;0;L;;;;;N;;;;; +1051;MYANMAR LETTER SSA;Lo;0;L;;;;;N;;;;; +1052;MYANMAR LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +1053;MYANMAR LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +1054;MYANMAR LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +1055;MYANMAR LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +1056;MYANMAR VOWEL SIGN VOCALIC R;Mc;0;L;;;;;N;;;;; +1057;MYANMAR VOWEL SIGN VOCALIC RR;Mc;0;L;;;;;N;;;;; +1058;MYANMAR VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; +1059;MYANMAR VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; +105A;MYANMAR LETTER MON NGA;Lo;0;L;;;;;N;;;;; +105B;MYANMAR LETTER MON JHA;Lo;0;L;;;;;N;;;;; +105C;MYANMAR LETTER MON BBA;Lo;0;L;;;;;N;;;;; +105D;MYANMAR LETTER MON BBE;Lo;0;L;;;;;N;;;;; +105E;MYANMAR CONSONANT SIGN MON MEDIAL NA;Mn;0;NSM;;;;;N;;;;; +105F;MYANMAR CONSONANT SIGN MON MEDIAL MA;Mn;0;NSM;;;;;N;;;;; +1060;MYANMAR CONSONANT SIGN MON MEDIAL LA;Mn;0;NSM;;;;;N;;;;; +1061;MYANMAR LETTER SGAW KAREN SHA;Lo;0;L;;;;;N;;;;; +1062;MYANMAR VOWEL SIGN SGAW KAREN EU;Mc;0;L;;;;;N;;;;; +1063;MYANMAR TONE MARK SGAW KAREN HATHI;Mc;0;L;;;;;N;;;;; +1064;MYANMAR TONE MARK SGAW KAREN KE PHO;Mc;0;L;;;;;N;;;;; +1065;MYANMAR LETTER WESTERN PWO KAREN THA;Lo;0;L;;;;;N;;;;; +1066;MYANMAR LETTER WESTERN PWO KAREN PWA;Lo;0;L;;;;;N;;;;; +1067;MYANMAR VOWEL SIGN WESTERN PWO KAREN EU;Mc;0;L;;;;;N;;;;; +1068;MYANMAR VOWEL SIGN WESTERN PWO KAREN UE;Mc;0;L;;;;;N;;;;; +1069;MYANMAR SIGN WESTERN PWO KAREN TONE-1;Mc;0;L;;;;;N;;;;; +106A;MYANMAR SIGN WESTERN PWO KAREN TONE-2;Mc;0;L;;;;;N;;;;; +106B;MYANMAR SIGN WESTERN PWO KAREN TONE-3;Mc;0;L;;;;;N;;;;; +106C;MYANMAR SIGN WESTERN PWO KAREN TONE-4;Mc;0;L;;;;;N;;;;; +106D;MYANMAR SIGN WESTERN PWO KAREN TONE-5;Mc;0;L;;;;;N;;;;; +106E;MYANMAR LETTER EASTERN PWO KAREN NNA;Lo;0;L;;;;;N;;;;; +106F;MYANMAR LETTER EASTERN PWO KAREN YWA;Lo;0;L;;;;;N;;;;; +1070;MYANMAR LETTER EASTERN PWO KAREN GHWA;Lo;0;L;;;;;N;;;;; +1071;MYANMAR VOWEL SIGN GEBA KAREN I;Mn;0;NSM;;;;;N;;;;; +1072;MYANMAR VOWEL SIGN KAYAH OE;Mn;0;NSM;;;;;N;;;;; +1073;MYANMAR VOWEL SIGN KAYAH U;Mn;0;NSM;;;;;N;;;;; +1074;MYANMAR VOWEL SIGN KAYAH EE;Mn;0;NSM;;;;;N;;;;; +1075;MYANMAR LETTER SHAN KA;Lo;0;L;;;;;N;;;;; +1076;MYANMAR LETTER SHAN KHA;Lo;0;L;;;;;N;;;;; +1077;MYANMAR LETTER SHAN GA;Lo;0;L;;;;;N;;;;; +1078;MYANMAR LETTER SHAN CA;Lo;0;L;;;;;N;;;;; +1079;MYANMAR LETTER SHAN ZA;Lo;0;L;;;;;N;;;;; +107A;MYANMAR LETTER SHAN NYA;Lo;0;L;;;;;N;;;;; +107B;MYANMAR LETTER SHAN DA;Lo;0;L;;;;;N;;;;; +107C;MYANMAR LETTER SHAN NA;Lo;0;L;;;;;N;;;;; +107D;MYANMAR LETTER SHAN PHA;Lo;0;L;;;;;N;;;;; +107E;MYANMAR LETTER SHAN FA;Lo;0;L;;;;;N;;;;; +107F;MYANMAR LETTER SHAN BA;Lo;0;L;;;;;N;;;;; +1080;MYANMAR LETTER SHAN THA;Lo;0;L;;;;;N;;;;; +1081;MYANMAR LETTER SHAN HA;Lo;0;L;;;;;N;;;;; +1082;MYANMAR CONSONANT SIGN SHAN MEDIAL WA;Mn;0;NSM;;;;;N;;;;; +1083;MYANMAR VOWEL SIGN SHAN AA;Mc;0;L;;;;;N;;;;; +1084;MYANMAR VOWEL SIGN SHAN E;Mc;0;L;;;;;N;;;;; +1085;MYANMAR VOWEL SIGN SHAN E ABOVE;Mn;0;NSM;;;;;N;;;;; +1086;MYANMAR VOWEL SIGN SHAN FINAL Y;Mn;0;NSM;;;;;N;;;;; +1087;MYANMAR SIGN SHAN TONE-2;Mc;0;L;;;;;N;;;;; +1088;MYANMAR SIGN SHAN TONE-3;Mc;0;L;;;;;N;;;;; +1089;MYANMAR SIGN SHAN TONE-5;Mc;0;L;;;;;N;;;;; +108A;MYANMAR SIGN SHAN TONE-6;Mc;0;L;;;;;N;;;;; +108B;MYANMAR SIGN SHAN COUNCIL TONE-2;Mc;0;L;;;;;N;;;;; +108C;MYANMAR SIGN SHAN COUNCIL TONE-3;Mc;0;L;;;;;N;;;;; +108D;MYANMAR SIGN SHAN COUNCIL EMPHATIC TONE;Mn;220;NSM;;;;;N;;;;; +108E;MYANMAR LETTER RUMAI PALAUNG FA;Lo;0;L;;;;;N;;;;; +108F;MYANMAR SIGN RUMAI PALAUNG TONE-5;Mc;0;L;;;;;N;;;;; +1090;MYANMAR SHAN DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +1091;MYANMAR SHAN DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +1092;MYANMAR SHAN DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +1093;MYANMAR SHAN DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +1094;MYANMAR SHAN DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +1095;MYANMAR SHAN DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +1096;MYANMAR SHAN DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +1097;MYANMAR SHAN DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +1098;MYANMAR SHAN DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +1099;MYANMAR SHAN DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +109A;MYANMAR SIGN KHAMTI TONE-1;Mc;0;L;;;;;N;;;;; +109B;MYANMAR SIGN KHAMTI TONE-3;Mc;0;L;;;;;N;;;;; +109C;MYANMAR VOWEL SIGN AITON A;Mc;0;L;;;;;N;;;;; +109D;MYANMAR VOWEL SIGN AITON AI;Mn;0;NSM;;;;;N;;;;; +109E;MYANMAR SYMBOL SHAN ONE;So;0;L;;;;;N;;;;; +109F;MYANMAR SYMBOL SHAN EXCLAMATION;So;0;L;;;;;N;;;;; +10A0;GEORGIAN CAPITAL LETTER AN;Lu;0;L;;;;;N;;;;2D00; +10A1;GEORGIAN CAPITAL LETTER BAN;Lu;0;L;;;;;N;;;;2D01; +10A2;GEORGIAN CAPITAL LETTER GAN;Lu;0;L;;;;;N;;;;2D02; +10A3;GEORGIAN CAPITAL LETTER DON;Lu;0;L;;;;;N;;;;2D03; +10A4;GEORGIAN CAPITAL LETTER EN;Lu;0;L;;;;;N;;;;2D04; +10A5;GEORGIAN CAPITAL LETTER VIN;Lu;0;L;;;;;N;;;;2D05; +10A6;GEORGIAN CAPITAL LETTER ZEN;Lu;0;L;;;;;N;;;;2D06; +10A7;GEORGIAN CAPITAL LETTER TAN;Lu;0;L;;;;;N;;;;2D07; +10A8;GEORGIAN CAPITAL LETTER IN;Lu;0;L;;;;;N;;;;2D08; +10A9;GEORGIAN CAPITAL LETTER KAN;Lu;0;L;;;;;N;;;;2D09; +10AA;GEORGIAN CAPITAL LETTER LAS;Lu;0;L;;;;;N;;;;2D0A; +10AB;GEORGIAN CAPITAL LETTER MAN;Lu;0;L;;;;;N;;;;2D0B; +10AC;GEORGIAN CAPITAL LETTER NAR;Lu;0;L;;;;;N;;;;2D0C; +10AD;GEORGIAN CAPITAL LETTER ON;Lu;0;L;;;;;N;;;;2D0D; +10AE;GEORGIAN CAPITAL LETTER PAR;Lu;0;L;;;;;N;;;;2D0E; +10AF;GEORGIAN CAPITAL LETTER ZHAR;Lu;0;L;;;;;N;;;;2D0F; +10B0;GEORGIAN CAPITAL LETTER RAE;Lu;0;L;;;;;N;;;;2D10; +10B1;GEORGIAN CAPITAL LETTER SAN;Lu;0;L;;;;;N;;;;2D11; +10B2;GEORGIAN CAPITAL LETTER TAR;Lu;0;L;;;;;N;;;;2D12; +10B3;GEORGIAN CAPITAL LETTER UN;Lu;0;L;;;;;N;;;;2D13; +10B4;GEORGIAN CAPITAL LETTER PHAR;Lu;0;L;;;;;N;;;;2D14; +10B5;GEORGIAN CAPITAL LETTER KHAR;Lu;0;L;;;;;N;;;;2D15; +10B6;GEORGIAN CAPITAL LETTER GHAN;Lu;0;L;;;;;N;;;;2D16; +10B7;GEORGIAN CAPITAL LETTER QAR;Lu;0;L;;;;;N;;;;2D17; +10B8;GEORGIAN CAPITAL LETTER SHIN;Lu;0;L;;;;;N;;;;2D18; +10B9;GEORGIAN CAPITAL LETTER CHIN;Lu;0;L;;;;;N;;;;2D19; +10BA;GEORGIAN CAPITAL LETTER CAN;Lu;0;L;;;;;N;;;;2D1A; +10BB;GEORGIAN CAPITAL LETTER JIL;Lu;0;L;;;;;N;;;;2D1B; +10BC;GEORGIAN CAPITAL LETTER CIL;Lu;0;L;;;;;N;;;;2D1C; +10BD;GEORGIAN CAPITAL LETTER CHAR;Lu;0;L;;;;;N;;;;2D1D; +10BE;GEORGIAN CAPITAL LETTER XAN;Lu;0;L;;;;;N;;;;2D1E; +10BF;GEORGIAN CAPITAL LETTER JHAN;Lu;0;L;;;;;N;;;;2D1F; +10C0;GEORGIAN CAPITAL LETTER HAE;Lu;0;L;;;;;N;;;;2D20; +10C1;GEORGIAN CAPITAL LETTER HE;Lu;0;L;;;;;N;;;;2D21; +10C2;GEORGIAN CAPITAL LETTER HIE;Lu;0;L;;;;;N;;;;2D22; +10C3;GEORGIAN CAPITAL LETTER WE;Lu;0;L;;;;;N;;;;2D23; +10C4;GEORGIAN CAPITAL LETTER HAR;Lu;0;L;;;;;N;;;;2D24; +10C5;GEORGIAN CAPITAL LETTER HOE;Lu;0;L;;;;;N;;;;2D25; +10C7;GEORGIAN CAPITAL LETTER YN;Lu;0;L;;;;;N;;;;2D27; +10CD;GEORGIAN CAPITAL LETTER AEN;Lu;0;L;;;;;N;;;;2D2D; +10D0;GEORGIAN LETTER AN;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER AN;;1C90;;10D0 +10D1;GEORGIAN LETTER BAN;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER BAN;;1C91;;10D1 +10D2;GEORGIAN LETTER GAN;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER GAN;;1C92;;10D2 +10D3;GEORGIAN LETTER DON;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER DON;;1C93;;10D3 +10D4;GEORGIAN LETTER EN;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER EN;;1C94;;10D4 +10D5;GEORGIAN LETTER VIN;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER VIN;;1C95;;10D5 +10D6;GEORGIAN LETTER ZEN;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER ZEN;;1C96;;10D6 +10D7;GEORGIAN LETTER TAN;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER TAN;;1C97;;10D7 +10D8;GEORGIAN LETTER IN;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER IN;;1C98;;10D8 +10D9;GEORGIAN LETTER KAN;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER KAN;;1C99;;10D9 +10DA;GEORGIAN LETTER LAS;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER LAS;;1C9A;;10DA +10DB;GEORGIAN LETTER MAN;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER MAN;;1C9B;;10DB +10DC;GEORGIAN LETTER NAR;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER NAR;;1C9C;;10DC +10DD;GEORGIAN LETTER ON;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER ON;;1C9D;;10DD +10DE;GEORGIAN LETTER PAR;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER PAR;;1C9E;;10DE +10DF;GEORGIAN LETTER ZHAR;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER ZHAR;;1C9F;;10DF +10E0;GEORGIAN LETTER RAE;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER RAE;;1CA0;;10E0 +10E1;GEORGIAN LETTER SAN;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER SAN;;1CA1;;10E1 +10E2;GEORGIAN LETTER TAR;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER TAR;;1CA2;;10E2 +10E3;GEORGIAN LETTER UN;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER UN;;1CA3;;10E3 +10E4;GEORGIAN LETTER PHAR;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER PHAR;;1CA4;;10E4 +10E5;GEORGIAN LETTER KHAR;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER KHAR;;1CA5;;10E5 +10E6;GEORGIAN LETTER GHAN;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER GHAN;;1CA6;;10E6 +10E7;GEORGIAN LETTER QAR;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER QAR;;1CA7;;10E7 +10E8;GEORGIAN LETTER SHIN;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER SHIN;;1CA8;;10E8 +10E9;GEORGIAN LETTER CHIN;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER CHIN;;1CA9;;10E9 +10EA;GEORGIAN LETTER CAN;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER CAN;;1CAA;;10EA +10EB;GEORGIAN LETTER JIL;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER JIL;;1CAB;;10EB +10EC;GEORGIAN LETTER CIL;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER CIL;;1CAC;;10EC +10ED;GEORGIAN LETTER CHAR;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER CHAR;;1CAD;;10ED +10EE;GEORGIAN LETTER XAN;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER XAN;;1CAE;;10EE +10EF;GEORGIAN LETTER JHAN;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER JHAN;;1CAF;;10EF +10F0;GEORGIAN LETTER HAE;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER HAE;;1CB0;;10F0 +10F1;GEORGIAN LETTER HE;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER HE;;1CB1;;10F1 +10F2;GEORGIAN LETTER HIE;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER HIE;;1CB2;;10F2 +10F3;GEORGIAN LETTER WE;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER WE;;1CB3;;10F3 +10F4;GEORGIAN LETTER HAR;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER HAR;;1CB4;;10F4 +10F5;GEORGIAN LETTER HOE;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER HOE;;1CB5;;10F5 +10F6;GEORGIAN LETTER FI;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER FI;;1CB6;;10F6 +10F7;GEORGIAN LETTER YN;Ll;0;L;;;;;N;;;1CB7;;10F7 +10F8;GEORGIAN LETTER ELIFI;Ll;0;L;;;;;N;;;1CB8;;10F8 +10F9;GEORGIAN LETTER TURNED GAN;Ll;0;L;;;;;N;;;1CB9;;10F9 +10FA;GEORGIAN LETTER AIN;Ll;0;L;;;;;N;;;1CBA;;10FA +10FB;GEORGIAN PARAGRAPH SEPARATOR;Po;0;L;;;;;N;;;;; +10FC;MODIFIER LETTER GEORGIAN NAR;Lm;0;L;<super> 10DC;;;;N;;;;; +10FD;GEORGIAN LETTER AEN;Ll;0;L;;;;;N;;;1CBD;;10FD +10FE;GEORGIAN LETTER HARD SIGN;Ll;0;L;;;;;N;;;1CBE;;10FE +10FF;GEORGIAN LETTER LABIAL SIGN;Ll;0;L;;;;;N;;;1CBF;;10FF +1100;HANGUL CHOSEONG KIYEOK;Lo;0;L;;;;;N;;;;; +1101;HANGUL CHOSEONG SSANGKIYEOK;Lo;0;L;;;;;N;;;;; +1102;HANGUL CHOSEONG NIEUN;Lo;0;L;;;;;N;;;;; +1103;HANGUL CHOSEONG TIKEUT;Lo;0;L;;;;;N;;;;; +1104;HANGUL CHOSEONG SSANGTIKEUT;Lo;0;L;;;;;N;;;;; +1105;HANGUL CHOSEONG RIEUL;Lo;0;L;;;;;N;;;;; +1106;HANGUL CHOSEONG MIEUM;Lo;0;L;;;;;N;;;;; +1107;HANGUL CHOSEONG PIEUP;Lo;0;L;;;;;N;;;;; +1108;HANGUL CHOSEONG SSANGPIEUP;Lo;0;L;;;;;N;;;;; +1109;HANGUL CHOSEONG SIOS;Lo;0;L;;;;;N;;;;; +110A;HANGUL CHOSEONG SSANGSIOS;Lo;0;L;;;;;N;;;;; +110B;HANGUL CHOSEONG IEUNG;Lo;0;L;;;;;N;;;;; +110C;HANGUL CHOSEONG CIEUC;Lo;0;L;;;;;N;;;;; +110D;HANGUL CHOSEONG SSANGCIEUC;Lo;0;L;;;;;N;;;;; +110E;HANGUL CHOSEONG CHIEUCH;Lo;0;L;;;;;N;;;;; +110F;HANGUL CHOSEONG KHIEUKH;Lo;0;L;;;;;N;;;;; +1110;HANGUL CHOSEONG THIEUTH;Lo;0;L;;;;;N;;;;; +1111;HANGUL CHOSEONG PHIEUPH;Lo;0;L;;;;;N;;;;; +1112;HANGUL CHOSEONG HIEUH;Lo;0;L;;;;;N;;;;; +1113;HANGUL CHOSEONG NIEUN-KIYEOK;Lo;0;L;;;;;N;;;;; +1114;HANGUL CHOSEONG SSANGNIEUN;Lo;0;L;;;;;N;;;;; +1115;HANGUL CHOSEONG NIEUN-TIKEUT;Lo;0;L;;;;;N;;;;; +1116;HANGUL CHOSEONG NIEUN-PIEUP;Lo;0;L;;;;;N;;;;; +1117;HANGUL CHOSEONG TIKEUT-KIYEOK;Lo;0;L;;;;;N;;;;; +1118;HANGUL CHOSEONG RIEUL-NIEUN;Lo;0;L;;;;;N;;;;; +1119;HANGUL CHOSEONG SSANGRIEUL;Lo;0;L;;;;;N;;;;; +111A;HANGUL CHOSEONG RIEUL-HIEUH;Lo;0;L;;;;;N;;;;; +111B;HANGUL CHOSEONG KAPYEOUNRIEUL;Lo;0;L;;;;;N;;;;; +111C;HANGUL CHOSEONG MIEUM-PIEUP;Lo;0;L;;;;;N;;;;; +111D;HANGUL CHOSEONG KAPYEOUNMIEUM;Lo;0;L;;;;;N;;;;; +111E;HANGUL CHOSEONG PIEUP-KIYEOK;Lo;0;L;;;;;N;;;;; +111F;HANGUL CHOSEONG PIEUP-NIEUN;Lo;0;L;;;;;N;;;;; +1120;HANGUL CHOSEONG PIEUP-TIKEUT;Lo;0;L;;;;;N;;;;; +1121;HANGUL CHOSEONG PIEUP-SIOS;Lo;0;L;;;;;N;;;;; +1122;HANGUL CHOSEONG PIEUP-SIOS-KIYEOK;Lo;0;L;;;;;N;;;;; +1123;HANGUL CHOSEONG PIEUP-SIOS-TIKEUT;Lo;0;L;;;;;N;;;;; +1124;HANGUL CHOSEONG PIEUP-SIOS-PIEUP;Lo;0;L;;;;;N;;;;; +1125;HANGUL CHOSEONG PIEUP-SSANGSIOS;Lo;0;L;;;;;N;;;;; +1126;HANGUL CHOSEONG PIEUP-SIOS-CIEUC;Lo;0;L;;;;;N;;;;; +1127;HANGUL CHOSEONG PIEUP-CIEUC;Lo;0;L;;;;;N;;;;; +1128;HANGUL CHOSEONG PIEUP-CHIEUCH;Lo;0;L;;;;;N;;;;; +1129;HANGUL CHOSEONG PIEUP-THIEUTH;Lo;0;L;;;;;N;;;;; +112A;HANGUL CHOSEONG PIEUP-PHIEUPH;Lo;0;L;;;;;N;;;;; +112B;HANGUL CHOSEONG KAPYEOUNPIEUP;Lo;0;L;;;;;N;;;;; +112C;HANGUL CHOSEONG KAPYEOUNSSANGPIEUP;Lo;0;L;;;;;N;;;;; +112D;HANGUL CHOSEONG SIOS-KIYEOK;Lo;0;L;;;;;N;;;;; +112E;HANGUL CHOSEONG SIOS-NIEUN;Lo;0;L;;;;;N;;;;; +112F;HANGUL CHOSEONG SIOS-TIKEUT;Lo;0;L;;;;;N;;;;; +1130;HANGUL CHOSEONG SIOS-RIEUL;Lo;0;L;;;;;N;;;;; +1131;HANGUL CHOSEONG SIOS-MIEUM;Lo;0;L;;;;;N;;;;; +1132;HANGUL CHOSEONG SIOS-PIEUP;Lo;0;L;;;;;N;;;;; +1133;HANGUL CHOSEONG SIOS-PIEUP-KIYEOK;Lo;0;L;;;;;N;;;;; +1134;HANGUL CHOSEONG SIOS-SSANGSIOS;Lo;0;L;;;;;N;;;;; +1135;HANGUL CHOSEONG SIOS-IEUNG;Lo;0;L;;;;;N;;;;; +1136;HANGUL CHOSEONG SIOS-CIEUC;Lo;0;L;;;;;N;;;;; +1137;HANGUL CHOSEONG SIOS-CHIEUCH;Lo;0;L;;;;;N;;;;; +1138;HANGUL CHOSEONG SIOS-KHIEUKH;Lo;0;L;;;;;N;;;;; +1139;HANGUL CHOSEONG SIOS-THIEUTH;Lo;0;L;;;;;N;;;;; +113A;HANGUL CHOSEONG SIOS-PHIEUPH;Lo;0;L;;;;;N;;;;; +113B;HANGUL CHOSEONG SIOS-HIEUH;Lo;0;L;;;;;N;;;;; +113C;HANGUL CHOSEONG CHITUEUMSIOS;Lo;0;L;;;;;N;;;;; +113D;HANGUL CHOSEONG CHITUEUMSSANGSIOS;Lo;0;L;;;;;N;;;;; +113E;HANGUL CHOSEONG CEONGCHIEUMSIOS;Lo;0;L;;;;;N;;;;; +113F;HANGUL CHOSEONG CEONGCHIEUMSSANGSIOS;Lo;0;L;;;;;N;;;;; +1140;HANGUL CHOSEONG PANSIOS;Lo;0;L;;;;;N;;;;; +1141;HANGUL CHOSEONG IEUNG-KIYEOK;Lo;0;L;;;;;N;;;;; +1142;HANGUL CHOSEONG IEUNG-TIKEUT;Lo;0;L;;;;;N;;;;; +1143;HANGUL CHOSEONG IEUNG-MIEUM;Lo;0;L;;;;;N;;;;; +1144;HANGUL CHOSEONG IEUNG-PIEUP;Lo;0;L;;;;;N;;;;; +1145;HANGUL CHOSEONG IEUNG-SIOS;Lo;0;L;;;;;N;;;;; +1146;HANGUL CHOSEONG IEUNG-PANSIOS;Lo;0;L;;;;;N;;;;; +1147;HANGUL CHOSEONG SSANGIEUNG;Lo;0;L;;;;;N;;;;; +1148;HANGUL CHOSEONG IEUNG-CIEUC;Lo;0;L;;;;;N;;;;; +1149;HANGUL CHOSEONG IEUNG-CHIEUCH;Lo;0;L;;;;;N;;;;; +114A;HANGUL CHOSEONG IEUNG-THIEUTH;Lo;0;L;;;;;N;;;;; +114B;HANGUL CHOSEONG IEUNG-PHIEUPH;Lo;0;L;;;;;N;;;;; +114C;HANGUL CHOSEONG YESIEUNG;Lo;0;L;;;;;N;;;;; +114D;HANGUL CHOSEONG CIEUC-IEUNG;Lo;0;L;;;;;N;;;;; +114E;HANGUL CHOSEONG CHITUEUMCIEUC;Lo;0;L;;;;;N;;;;; +114F;HANGUL CHOSEONG CHITUEUMSSANGCIEUC;Lo;0;L;;;;;N;;;;; +1150;HANGUL CHOSEONG CEONGCHIEUMCIEUC;Lo;0;L;;;;;N;;;;; +1151;HANGUL CHOSEONG CEONGCHIEUMSSANGCIEUC;Lo;0;L;;;;;N;;;;; +1152;HANGUL CHOSEONG CHIEUCH-KHIEUKH;Lo;0;L;;;;;N;;;;; +1153;HANGUL CHOSEONG CHIEUCH-HIEUH;Lo;0;L;;;;;N;;;;; +1154;HANGUL CHOSEONG CHITUEUMCHIEUCH;Lo;0;L;;;;;N;;;;; +1155;HANGUL CHOSEONG CEONGCHIEUMCHIEUCH;Lo;0;L;;;;;N;;;;; +1156;HANGUL CHOSEONG PHIEUPH-PIEUP;Lo;0;L;;;;;N;;;;; +1157;HANGUL CHOSEONG KAPYEOUNPHIEUPH;Lo;0;L;;;;;N;;;;; +1158;HANGUL CHOSEONG SSANGHIEUH;Lo;0;L;;;;;N;;;;; +1159;HANGUL CHOSEONG YEORINHIEUH;Lo;0;L;;;;;N;;;;; +115A;HANGUL CHOSEONG KIYEOK-TIKEUT;Lo;0;L;;;;;N;;;;; +115B;HANGUL CHOSEONG NIEUN-SIOS;Lo;0;L;;;;;N;;;;; +115C;HANGUL CHOSEONG NIEUN-CIEUC;Lo;0;L;;;;;N;;;;; +115D;HANGUL CHOSEONG NIEUN-HIEUH;Lo;0;L;;;;;N;;;;; +115E;HANGUL CHOSEONG TIKEUT-RIEUL;Lo;0;L;;;;;N;;;;; +115F;HANGUL CHOSEONG FILLER;Lo;0;L;;;;;N;;;;; +1160;HANGUL JUNGSEONG FILLER;Lo;0;L;;;;;N;;;;; +1161;HANGUL JUNGSEONG A;Lo;0;L;;;;;N;;;;; +1162;HANGUL JUNGSEONG AE;Lo;0;L;;;;;N;;;;; +1163;HANGUL JUNGSEONG YA;Lo;0;L;;;;;N;;;;; +1164;HANGUL JUNGSEONG YAE;Lo;0;L;;;;;N;;;;; +1165;HANGUL JUNGSEONG EO;Lo;0;L;;;;;N;;;;; +1166;HANGUL JUNGSEONG E;Lo;0;L;;;;;N;;;;; +1167;HANGUL JUNGSEONG YEO;Lo;0;L;;;;;N;;;;; +1168;HANGUL JUNGSEONG YE;Lo;0;L;;;;;N;;;;; +1169;HANGUL JUNGSEONG O;Lo;0;L;;;;;N;;;;; +116A;HANGUL JUNGSEONG WA;Lo;0;L;;;;;N;;;;; +116B;HANGUL JUNGSEONG WAE;Lo;0;L;;;;;N;;;;; +116C;HANGUL JUNGSEONG OE;Lo;0;L;;;;;N;;;;; +116D;HANGUL JUNGSEONG YO;Lo;0;L;;;;;N;;;;; +116E;HANGUL JUNGSEONG U;Lo;0;L;;;;;N;;;;; +116F;HANGUL JUNGSEONG WEO;Lo;0;L;;;;;N;;;;; +1170;HANGUL JUNGSEONG WE;Lo;0;L;;;;;N;;;;; +1171;HANGUL JUNGSEONG WI;Lo;0;L;;;;;N;;;;; +1172;HANGUL JUNGSEONG YU;Lo;0;L;;;;;N;;;;; +1173;HANGUL JUNGSEONG EU;Lo;0;L;;;;;N;;;;; +1174;HANGUL JUNGSEONG YI;Lo;0;L;;;;;N;;;;; +1175;HANGUL JUNGSEONG I;Lo;0;L;;;;;N;;;;; +1176;HANGUL JUNGSEONG A-O;Lo;0;L;;;;;N;;;;; +1177;HANGUL JUNGSEONG A-U;Lo;0;L;;;;;N;;;;; +1178;HANGUL JUNGSEONG YA-O;Lo;0;L;;;;;N;;;;; +1179;HANGUL JUNGSEONG YA-YO;Lo;0;L;;;;;N;;;;; +117A;HANGUL JUNGSEONG EO-O;Lo;0;L;;;;;N;;;;; +117B;HANGUL JUNGSEONG EO-U;Lo;0;L;;;;;N;;;;; +117C;HANGUL JUNGSEONG EO-EU;Lo;0;L;;;;;N;;;;; +117D;HANGUL JUNGSEONG YEO-O;Lo;0;L;;;;;N;;;;; +117E;HANGUL JUNGSEONG YEO-U;Lo;0;L;;;;;N;;;;; +117F;HANGUL JUNGSEONG O-EO;Lo;0;L;;;;;N;;;;; +1180;HANGUL JUNGSEONG O-E;Lo;0;L;;;;;N;;;;; +1181;HANGUL JUNGSEONG O-YE;Lo;0;L;;;;;N;;;;; +1182;HANGUL JUNGSEONG O-O;Lo;0;L;;;;;N;;;;; +1183;HANGUL JUNGSEONG O-U;Lo;0;L;;;;;N;;;;; +1184;HANGUL JUNGSEONG YO-YA;Lo;0;L;;;;;N;;;;; +1185;HANGUL JUNGSEONG YO-YAE;Lo;0;L;;;;;N;;;;; +1186;HANGUL JUNGSEONG YO-YEO;Lo;0;L;;;;;N;;;;; +1187;HANGUL JUNGSEONG YO-O;Lo;0;L;;;;;N;;;;; +1188;HANGUL JUNGSEONG YO-I;Lo;0;L;;;;;N;;;;; +1189;HANGUL JUNGSEONG U-A;Lo;0;L;;;;;N;;;;; +118A;HANGUL JUNGSEONG U-AE;Lo;0;L;;;;;N;;;;; +118B;HANGUL JUNGSEONG U-EO-EU;Lo;0;L;;;;;N;;;;; +118C;HANGUL JUNGSEONG U-YE;Lo;0;L;;;;;N;;;;; +118D;HANGUL JUNGSEONG U-U;Lo;0;L;;;;;N;;;;; +118E;HANGUL JUNGSEONG YU-A;Lo;0;L;;;;;N;;;;; +118F;HANGUL JUNGSEONG YU-EO;Lo;0;L;;;;;N;;;;; +1190;HANGUL JUNGSEONG YU-E;Lo;0;L;;;;;N;;;;; +1191;HANGUL JUNGSEONG YU-YEO;Lo;0;L;;;;;N;;;;; +1192;HANGUL JUNGSEONG YU-YE;Lo;0;L;;;;;N;;;;; +1193;HANGUL JUNGSEONG YU-U;Lo;0;L;;;;;N;;;;; +1194;HANGUL JUNGSEONG YU-I;Lo;0;L;;;;;N;;;;; +1195;HANGUL JUNGSEONG EU-U;Lo;0;L;;;;;N;;;;; +1196;HANGUL JUNGSEONG EU-EU;Lo;0;L;;;;;N;;;;; +1197;HANGUL JUNGSEONG YI-U;Lo;0;L;;;;;N;;;;; +1198;HANGUL JUNGSEONG I-A;Lo;0;L;;;;;N;;;;; +1199;HANGUL JUNGSEONG I-YA;Lo;0;L;;;;;N;;;;; +119A;HANGUL JUNGSEONG I-O;Lo;0;L;;;;;N;;;;; +119B;HANGUL JUNGSEONG I-U;Lo;0;L;;;;;N;;;;; +119C;HANGUL JUNGSEONG I-EU;Lo;0;L;;;;;N;;;;; +119D;HANGUL JUNGSEONG I-ARAEA;Lo;0;L;;;;;N;;;;; +119E;HANGUL JUNGSEONG ARAEA;Lo;0;L;;;;;N;;;;; +119F;HANGUL JUNGSEONG ARAEA-EO;Lo;0;L;;;;;N;;;;; +11A0;HANGUL JUNGSEONG ARAEA-U;Lo;0;L;;;;;N;;;;; +11A1;HANGUL JUNGSEONG ARAEA-I;Lo;0;L;;;;;N;;;;; +11A2;HANGUL JUNGSEONG SSANGARAEA;Lo;0;L;;;;;N;;;;; +11A3;HANGUL JUNGSEONG A-EU;Lo;0;L;;;;;N;;;;; +11A4;HANGUL JUNGSEONG YA-U;Lo;0;L;;;;;N;;;;; +11A5;HANGUL JUNGSEONG YEO-YA;Lo;0;L;;;;;N;;;;; +11A6;HANGUL JUNGSEONG O-YA;Lo;0;L;;;;;N;;;;; +11A7;HANGUL JUNGSEONG O-YAE;Lo;0;L;;;;;N;;;;; +11A8;HANGUL JONGSEONG KIYEOK;Lo;0;L;;;;;N;;;;; +11A9;HANGUL JONGSEONG SSANGKIYEOK;Lo;0;L;;;;;N;;;;; +11AA;HANGUL JONGSEONG KIYEOK-SIOS;Lo;0;L;;;;;N;;;;; +11AB;HANGUL JONGSEONG NIEUN;Lo;0;L;;;;;N;;;;; +11AC;HANGUL JONGSEONG NIEUN-CIEUC;Lo;0;L;;;;;N;;;;; +11AD;HANGUL JONGSEONG NIEUN-HIEUH;Lo;0;L;;;;;N;;;;; +11AE;HANGUL JONGSEONG TIKEUT;Lo;0;L;;;;;N;;;;; +11AF;HANGUL JONGSEONG RIEUL;Lo;0;L;;;;;N;;;;; +11B0;HANGUL JONGSEONG RIEUL-KIYEOK;Lo;0;L;;;;;N;;;;; +11B1;HANGUL JONGSEONG RIEUL-MIEUM;Lo;0;L;;;;;N;;;;; +11B2;HANGUL JONGSEONG RIEUL-PIEUP;Lo;0;L;;;;;N;;;;; +11B3;HANGUL JONGSEONG RIEUL-SIOS;Lo;0;L;;;;;N;;;;; +11B4;HANGUL JONGSEONG RIEUL-THIEUTH;Lo;0;L;;;;;N;;;;; +11B5;HANGUL JONGSEONG RIEUL-PHIEUPH;Lo;0;L;;;;;N;;;;; +11B6;HANGUL JONGSEONG RIEUL-HIEUH;Lo;0;L;;;;;N;;;;; +11B7;HANGUL JONGSEONG MIEUM;Lo;0;L;;;;;N;;;;; +11B8;HANGUL JONGSEONG PIEUP;Lo;0;L;;;;;N;;;;; +11B9;HANGUL JONGSEONG PIEUP-SIOS;Lo;0;L;;;;;N;;;;; +11BA;HANGUL JONGSEONG SIOS;Lo;0;L;;;;;N;;;;; +11BB;HANGUL JONGSEONG SSANGSIOS;Lo;0;L;;;;;N;;;;; +11BC;HANGUL JONGSEONG IEUNG;Lo;0;L;;;;;N;;;;; +11BD;HANGUL JONGSEONG CIEUC;Lo;0;L;;;;;N;;;;; +11BE;HANGUL JONGSEONG CHIEUCH;Lo;0;L;;;;;N;;;;; +11BF;HANGUL JONGSEONG KHIEUKH;Lo;0;L;;;;;N;;;;; +11C0;HANGUL JONGSEONG THIEUTH;Lo;0;L;;;;;N;;;;; +11C1;HANGUL JONGSEONG PHIEUPH;Lo;0;L;;;;;N;;;;; +11C2;HANGUL JONGSEONG HIEUH;Lo;0;L;;;;;N;;;;; +11C3;HANGUL JONGSEONG KIYEOK-RIEUL;Lo;0;L;;;;;N;;;;; +11C4;HANGUL JONGSEONG KIYEOK-SIOS-KIYEOK;Lo;0;L;;;;;N;;;;; +11C5;HANGUL JONGSEONG NIEUN-KIYEOK;Lo;0;L;;;;;N;;;;; +11C6;HANGUL JONGSEONG NIEUN-TIKEUT;Lo;0;L;;;;;N;;;;; +11C7;HANGUL JONGSEONG NIEUN-SIOS;Lo;0;L;;;;;N;;;;; +11C8;HANGUL JONGSEONG NIEUN-PANSIOS;Lo;0;L;;;;;N;;;;; +11C9;HANGUL JONGSEONG NIEUN-THIEUTH;Lo;0;L;;;;;N;;;;; +11CA;HANGUL JONGSEONG TIKEUT-KIYEOK;Lo;0;L;;;;;N;;;;; +11CB;HANGUL JONGSEONG TIKEUT-RIEUL;Lo;0;L;;;;;N;;;;; +11CC;HANGUL JONGSEONG RIEUL-KIYEOK-SIOS;Lo;0;L;;;;;N;;;;; +11CD;HANGUL JONGSEONG RIEUL-NIEUN;Lo;0;L;;;;;N;;;;; +11CE;HANGUL JONGSEONG RIEUL-TIKEUT;Lo;0;L;;;;;N;;;;; +11CF;HANGUL JONGSEONG RIEUL-TIKEUT-HIEUH;Lo;0;L;;;;;N;;;;; +11D0;HANGUL JONGSEONG SSANGRIEUL;Lo;0;L;;;;;N;;;;; +11D1;HANGUL JONGSEONG RIEUL-MIEUM-KIYEOK;Lo;0;L;;;;;N;;;;; +11D2;HANGUL JONGSEONG RIEUL-MIEUM-SIOS;Lo;0;L;;;;;N;;;;; +11D3;HANGUL JONGSEONG RIEUL-PIEUP-SIOS;Lo;0;L;;;;;N;;;;; +11D4;HANGUL JONGSEONG RIEUL-PIEUP-HIEUH;Lo;0;L;;;;;N;;;;; +11D5;HANGUL JONGSEONG RIEUL-KAPYEOUNPIEUP;Lo;0;L;;;;;N;;;;; +11D6;HANGUL JONGSEONG RIEUL-SSANGSIOS;Lo;0;L;;;;;N;;;;; +11D7;HANGUL JONGSEONG RIEUL-PANSIOS;Lo;0;L;;;;;N;;;;; +11D8;HANGUL JONGSEONG RIEUL-KHIEUKH;Lo;0;L;;;;;N;;;;; +11D9;HANGUL JONGSEONG RIEUL-YEORINHIEUH;Lo;0;L;;;;;N;;;;; +11DA;HANGUL JONGSEONG MIEUM-KIYEOK;Lo;0;L;;;;;N;;;;; +11DB;HANGUL JONGSEONG MIEUM-RIEUL;Lo;0;L;;;;;N;;;;; +11DC;HANGUL JONGSEONG MIEUM-PIEUP;Lo;0;L;;;;;N;;;;; +11DD;HANGUL JONGSEONG MIEUM-SIOS;Lo;0;L;;;;;N;;;;; +11DE;HANGUL JONGSEONG MIEUM-SSANGSIOS;Lo;0;L;;;;;N;;;;; +11DF;HANGUL JONGSEONG MIEUM-PANSIOS;Lo;0;L;;;;;N;;;;; +11E0;HANGUL JONGSEONG MIEUM-CHIEUCH;Lo;0;L;;;;;N;;;;; +11E1;HANGUL JONGSEONG MIEUM-HIEUH;Lo;0;L;;;;;N;;;;; +11E2;HANGUL JONGSEONG KAPYEOUNMIEUM;Lo;0;L;;;;;N;;;;; +11E3;HANGUL JONGSEONG PIEUP-RIEUL;Lo;0;L;;;;;N;;;;; +11E4;HANGUL JONGSEONG PIEUP-PHIEUPH;Lo;0;L;;;;;N;;;;; +11E5;HANGUL JONGSEONG PIEUP-HIEUH;Lo;0;L;;;;;N;;;;; +11E6;HANGUL JONGSEONG KAPYEOUNPIEUP;Lo;0;L;;;;;N;;;;; +11E7;HANGUL JONGSEONG SIOS-KIYEOK;Lo;0;L;;;;;N;;;;; +11E8;HANGUL JONGSEONG SIOS-TIKEUT;Lo;0;L;;;;;N;;;;; +11E9;HANGUL JONGSEONG SIOS-RIEUL;Lo;0;L;;;;;N;;;;; +11EA;HANGUL JONGSEONG SIOS-PIEUP;Lo;0;L;;;;;N;;;;; +11EB;HANGUL JONGSEONG PANSIOS;Lo;0;L;;;;;N;;;;; +11EC;HANGUL JONGSEONG IEUNG-KIYEOK;Lo;0;L;;;;;N;;;;; +11ED;HANGUL JONGSEONG IEUNG-SSANGKIYEOK;Lo;0;L;;;;;N;;;;; +11EE;HANGUL JONGSEONG SSANGIEUNG;Lo;0;L;;;;;N;;;;; +11EF;HANGUL JONGSEONG IEUNG-KHIEUKH;Lo;0;L;;;;;N;;;;; +11F0;HANGUL JONGSEONG YESIEUNG;Lo;0;L;;;;;N;;;;; +11F1;HANGUL JONGSEONG YESIEUNG-SIOS;Lo;0;L;;;;;N;;;;; +11F2;HANGUL JONGSEONG YESIEUNG-PANSIOS;Lo;0;L;;;;;N;;;;; +11F3;HANGUL JONGSEONG PHIEUPH-PIEUP;Lo;0;L;;;;;N;;;;; +11F4;HANGUL JONGSEONG KAPYEOUNPHIEUPH;Lo;0;L;;;;;N;;;;; +11F5;HANGUL JONGSEONG HIEUH-NIEUN;Lo;0;L;;;;;N;;;;; +11F6;HANGUL JONGSEONG HIEUH-RIEUL;Lo;0;L;;;;;N;;;;; +11F7;HANGUL JONGSEONG HIEUH-MIEUM;Lo;0;L;;;;;N;;;;; +11F8;HANGUL JONGSEONG HIEUH-PIEUP;Lo;0;L;;;;;N;;;;; +11F9;HANGUL JONGSEONG YEORINHIEUH;Lo;0;L;;;;;N;;;;; +11FA;HANGUL JONGSEONG KIYEOK-NIEUN;Lo;0;L;;;;;N;;;;; +11FB;HANGUL JONGSEONG KIYEOK-PIEUP;Lo;0;L;;;;;N;;;;; +11FC;HANGUL JONGSEONG KIYEOK-CHIEUCH;Lo;0;L;;;;;N;;;;; +11FD;HANGUL JONGSEONG KIYEOK-KHIEUKH;Lo;0;L;;;;;N;;;;; +11FE;HANGUL JONGSEONG KIYEOK-HIEUH;Lo;0;L;;;;;N;;;;; +11FF;HANGUL JONGSEONG SSANGNIEUN;Lo;0;L;;;;;N;;;;; +1200;ETHIOPIC SYLLABLE HA;Lo;0;L;;;;;N;;;;; +1201;ETHIOPIC SYLLABLE HU;Lo;0;L;;;;;N;;;;; +1202;ETHIOPIC SYLLABLE HI;Lo;0;L;;;;;N;;;;; +1203;ETHIOPIC SYLLABLE HAA;Lo;0;L;;;;;N;;;;; +1204;ETHIOPIC SYLLABLE HEE;Lo;0;L;;;;;N;;;;; +1205;ETHIOPIC SYLLABLE HE;Lo;0;L;;;;;N;;;;; +1206;ETHIOPIC SYLLABLE HO;Lo;0;L;;;;;N;;;;; +1207;ETHIOPIC SYLLABLE HOA;Lo;0;L;;;;;N;;;;; +1208;ETHIOPIC SYLLABLE LA;Lo;0;L;;;;;N;;;;; +1209;ETHIOPIC SYLLABLE LU;Lo;0;L;;;;;N;;;;; +120A;ETHIOPIC SYLLABLE LI;Lo;0;L;;;;;N;;;;; +120B;ETHIOPIC SYLLABLE LAA;Lo;0;L;;;;;N;;;;; +120C;ETHIOPIC SYLLABLE LEE;Lo;0;L;;;;;N;;;;; +120D;ETHIOPIC SYLLABLE LE;Lo;0;L;;;;;N;;;;; +120E;ETHIOPIC SYLLABLE LO;Lo;0;L;;;;;N;;;;; +120F;ETHIOPIC SYLLABLE LWA;Lo;0;L;;;;;N;;;;; +1210;ETHIOPIC SYLLABLE HHA;Lo;0;L;;;;;N;;;;; +1211;ETHIOPIC SYLLABLE HHU;Lo;0;L;;;;;N;;;;; +1212;ETHIOPIC SYLLABLE HHI;Lo;0;L;;;;;N;;;;; +1213;ETHIOPIC SYLLABLE HHAA;Lo;0;L;;;;;N;;;;; +1214;ETHIOPIC SYLLABLE HHEE;Lo;0;L;;;;;N;;;;; +1215;ETHIOPIC SYLLABLE HHE;Lo;0;L;;;;;N;;;;; +1216;ETHIOPIC SYLLABLE HHO;Lo;0;L;;;;;N;;;;; +1217;ETHIOPIC SYLLABLE HHWA;Lo;0;L;;;;;N;;;;; +1218;ETHIOPIC SYLLABLE MA;Lo;0;L;;;;;N;;;;; +1219;ETHIOPIC SYLLABLE MU;Lo;0;L;;;;;N;;;;; +121A;ETHIOPIC SYLLABLE MI;Lo;0;L;;;;;N;;;;; +121B;ETHIOPIC SYLLABLE MAA;Lo;0;L;;;;;N;;;;; +121C;ETHIOPIC SYLLABLE MEE;Lo;0;L;;;;;N;;;;; +121D;ETHIOPIC SYLLABLE ME;Lo;0;L;;;;;N;;;;; +121E;ETHIOPIC SYLLABLE MO;Lo;0;L;;;;;N;;;;; +121F;ETHIOPIC SYLLABLE MWA;Lo;0;L;;;;;N;;;;; +1220;ETHIOPIC SYLLABLE SZA;Lo;0;L;;;;;N;;;;; +1221;ETHIOPIC SYLLABLE SZU;Lo;0;L;;;;;N;;;;; +1222;ETHIOPIC SYLLABLE SZI;Lo;0;L;;;;;N;;;;; +1223;ETHIOPIC SYLLABLE SZAA;Lo;0;L;;;;;N;;;;; +1224;ETHIOPIC SYLLABLE SZEE;Lo;0;L;;;;;N;;;;; +1225;ETHIOPIC SYLLABLE SZE;Lo;0;L;;;;;N;;;;; +1226;ETHIOPIC SYLLABLE SZO;Lo;0;L;;;;;N;;;;; +1227;ETHIOPIC SYLLABLE SZWA;Lo;0;L;;;;;N;;;;; +1228;ETHIOPIC SYLLABLE RA;Lo;0;L;;;;;N;;;;; +1229;ETHIOPIC SYLLABLE RU;Lo;0;L;;;;;N;;;;; +122A;ETHIOPIC SYLLABLE RI;Lo;0;L;;;;;N;;;;; +122B;ETHIOPIC SYLLABLE RAA;Lo;0;L;;;;;N;;;;; +122C;ETHIOPIC SYLLABLE REE;Lo;0;L;;;;;N;;;;; +122D;ETHIOPIC SYLLABLE RE;Lo;0;L;;;;;N;;;;; +122E;ETHIOPIC SYLLABLE RO;Lo;0;L;;;;;N;;;;; +122F;ETHIOPIC SYLLABLE RWA;Lo;0;L;;;;;N;;;;; +1230;ETHIOPIC SYLLABLE SA;Lo;0;L;;;;;N;;;;; +1231;ETHIOPIC SYLLABLE SU;Lo;0;L;;;;;N;;;;; +1232;ETHIOPIC SYLLABLE SI;Lo;0;L;;;;;N;;;;; +1233;ETHIOPIC SYLLABLE SAA;Lo;0;L;;;;;N;;;;; +1234;ETHIOPIC SYLLABLE SEE;Lo;0;L;;;;;N;;;;; +1235;ETHIOPIC SYLLABLE SE;Lo;0;L;;;;;N;;;;; +1236;ETHIOPIC SYLLABLE SO;Lo;0;L;;;;;N;;;;; +1237;ETHIOPIC SYLLABLE SWA;Lo;0;L;;;;;N;;;;; +1238;ETHIOPIC SYLLABLE SHA;Lo;0;L;;;;;N;;;;; +1239;ETHIOPIC SYLLABLE SHU;Lo;0;L;;;;;N;;;;; +123A;ETHIOPIC SYLLABLE SHI;Lo;0;L;;;;;N;;;;; +123B;ETHIOPIC SYLLABLE SHAA;Lo;0;L;;;;;N;;;;; +123C;ETHIOPIC SYLLABLE SHEE;Lo;0;L;;;;;N;;;;; +123D;ETHIOPIC SYLLABLE SHE;Lo;0;L;;;;;N;;;;; +123E;ETHIOPIC SYLLABLE SHO;Lo;0;L;;;;;N;;;;; +123F;ETHIOPIC SYLLABLE SHWA;Lo;0;L;;;;;N;;;;; +1240;ETHIOPIC SYLLABLE QA;Lo;0;L;;;;;N;;;;; +1241;ETHIOPIC SYLLABLE QU;Lo;0;L;;;;;N;;;;; +1242;ETHIOPIC SYLLABLE QI;Lo;0;L;;;;;N;;;;; +1243;ETHIOPIC SYLLABLE QAA;Lo;0;L;;;;;N;;;;; +1244;ETHIOPIC SYLLABLE QEE;Lo;0;L;;;;;N;;;;; +1245;ETHIOPIC SYLLABLE QE;Lo;0;L;;;;;N;;;;; +1246;ETHIOPIC SYLLABLE QO;Lo;0;L;;;;;N;;;;; +1247;ETHIOPIC SYLLABLE QOA;Lo;0;L;;;;;N;;;;; +1248;ETHIOPIC SYLLABLE QWA;Lo;0;L;;;;;N;;;;; +124A;ETHIOPIC SYLLABLE QWI;Lo;0;L;;;;;N;;;;; +124B;ETHIOPIC SYLLABLE QWAA;Lo;0;L;;;;;N;;;;; +124C;ETHIOPIC SYLLABLE QWEE;Lo;0;L;;;;;N;;;;; +124D;ETHIOPIC SYLLABLE QWE;Lo;0;L;;;;;N;;;;; +1250;ETHIOPIC SYLLABLE QHA;Lo;0;L;;;;;N;;;;; +1251;ETHIOPIC SYLLABLE QHU;Lo;0;L;;;;;N;;;;; +1252;ETHIOPIC SYLLABLE QHI;Lo;0;L;;;;;N;;;;; +1253;ETHIOPIC SYLLABLE QHAA;Lo;0;L;;;;;N;;;;; +1254;ETHIOPIC SYLLABLE QHEE;Lo;0;L;;;;;N;;;;; +1255;ETHIOPIC SYLLABLE QHE;Lo;0;L;;;;;N;;;;; +1256;ETHIOPIC SYLLABLE QHO;Lo;0;L;;;;;N;;;;; +1258;ETHIOPIC SYLLABLE QHWA;Lo;0;L;;;;;N;;;;; +125A;ETHIOPIC SYLLABLE QHWI;Lo;0;L;;;;;N;;;;; +125B;ETHIOPIC SYLLABLE QHWAA;Lo;0;L;;;;;N;;;;; +125C;ETHIOPIC SYLLABLE QHWEE;Lo;0;L;;;;;N;;;;; +125D;ETHIOPIC SYLLABLE QHWE;Lo;0;L;;;;;N;;;;; +1260;ETHIOPIC SYLLABLE BA;Lo;0;L;;;;;N;;;;; +1261;ETHIOPIC SYLLABLE BU;Lo;0;L;;;;;N;;;;; +1262;ETHIOPIC SYLLABLE BI;Lo;0;L;;;;;N;;;;; +1263;ETHIOPIC SYLLABLE BAA;Lo;0;L;;;;;N;;;;; +1264;ETHIOPIC SYLLABLE BEE;Lo;0;L;;;;;N;;;;; +1265;ETHIOPIC SYLLABLE BE;Lo;0;L;;;;;N;;;;; +1266;ETHIOPIC SYLLABLE BO;Lo;0;L;;;;;N;;;;; +1267;ETHIOPIC SYLLABLE BWA;Lo;0;L;;;;;N;;;;; +1268;ETHIOPIC SYLLABLE VA;Lo;0;L;;;;;N;;;;; +1269;ETHIOPIC SYLLABLE VU;Lo;0;L;;;;;N;;;;; +126A;ETHIOPIC SYLLABLE VI;Lo;0;L;;;;;N;;;;; +126B;ETHIOPIC SYLLABLE VAA;Lo;0;L;;;;;N;;;;; +126C;ETHIOPIC SYLLABLE VEE;Lo;0;L;;;;;N;;;;; +126D;ETHIOPIC SYLLABLE VE;Lo;0;L;;;;;N;;;;; +126E;ETHIOPIC SYLLABLE VO;Lo;0;L;;;;;N;;;;; +126F;ETHIOPIC SYLLABLE VWA;Lo;0;L;;;;;N;;;;; +1270;ETHIOPIC SYLLABLE TA;Lo;0;L;;;;;N;;;;; +1271;ETHIOPIC SYLLABLE TU;Lo;0;L;;;;;N;;;;; +1272;ETHIOPIC SYLLABLE TI;Lo;0;L;;;;;N;;;;; +1273;ETHIOPIC SYLLABLE TAA;Lo;0;L;;;;;N;;;;; +1274;ETHIOPIC SYLLABLE TEE;Lo;0;L;;;;;N;;;;; +1275;ETHIOPIC SYLLABLE TE;Lo;0;L;;;;;N;;;;; +1276;ETHIOPIC SYLLABLE TO;Lo;0;L;;;;;N;;;;; +1277;ETHIOPIC SYLLABLE TWA;Lo;0;L;;;;;N;;;;; +1278;ETHIOPIC SYLLABLE CA;Lo;0;L;;;;;N;;;;; +1279;ETHIOPIC SYLLABLE CU;Lo;0;L;;;;;N;;;;; +127A;ETHIOPIC SYLLABLE CI;Lo;0;L;;;;;N;;;;; +127B;ETHIOPIC SYLLABLE CAA;Lo;0;L;;;;;N;;;;; +127C;ETHIOPIC SYLLABLE CEE;Lo;0;L;;;;;N;;;;; +127D;ETHIOPIC SYLLABLE CE;Lo;0;L;;;;;N;;;;; +127E;ETHIOPIC SYLLABLE CO;Lo;0;L;;;;;N;;;;; +127F;ETHIOPIC SYLLABLE CWA;Lo;0;L;;;;;N;;;;; +1280;ETHIOPIC SYLLABLE XA;Lo;0;L;;;;;N;;;;; +1281;ETHIOPIC SYLLABLE XU;Lo;0;L;;;;;N;;;;; +1282;ETHIOPIC SYLLABLE XI;Lo;0;L;;;;;N;;;;; +1283;ETHIOPIC SYLLABLE XAA;Lo;0;L;;;;;N;;;;; +1284;ETHIOPIC SYLLABLE XEE;Lo;0;L;;;;;N;;;;; +1285;ETHIOPIC SYLLABLE XE;Lo;0;L;;;;;N;;;;; +1286;ETHIOPIC SYLLABLE XO;Lo;0;L;;;;;N;;;;; +1287;ETHIOPIC SYLLABLE XOA;Lo;0;L;;;;;N;;;;; +1288;ETHIOPIC SYLLABLE XWA;Lo;0;L;;;;;N;;;;; +128A;ETHIOPIC SYLLABLE XWI;Lo;0;L;;;;;N;;;;; +128B;ETHIOPIC SYLLABLE XWAA;Lo;0;L;;;;;N;;;;; +128C;ETHIOPIC SYLLABLE XWEE;Lo;0;L;;;;;N;;;;; +128D;ETHIOPIC SYLLABLE XWE;Lo;0;L;;;;;N;;;;; +1290;ETHIOPIC SYLLABLE NA;Lo;0;L;;;;;N;;;;; +1291;ETHIOPIC SYLLABLE NU;Lo;0;L;;;;;N;;;;; +1292;ETHIOPIC SYLLABLE NI;Lo;0;L;;;;;N;;;;; +1293;ETHIOPIC SYLLABLE NAA;Lo;0;L;;;;;N;;;;; +1294;ETHIOPIC SYLLABLE NEE;Lo;0;L;;;;;N;;;;; +1295;ETHIOPIC SYLLABLE NE;Lo;0;L;;;;;N;;;;; +1296;ETHIOPIC SYLLABLE NO;Lo;0;L;;;;;N;;;;; +1297;ETHIOPIC SYLLABLE NWA;Lo;0;L;;;;;N;;;;; +1298;ETHIOPIC SYLLABLE NYA;Lo;0;L;;;;;N;;;;; +1299;ETHIOPIC SYLLABLE NYU;Lo;0;L;;;;;N;;;;; +129A;ETHIOPIC SYLLABLE NYI;Lo;0;L;;;;;N;;;;; +129B;ETHIOPIC SYLLABLE NYAA;Lo;0;L;;;;;N;;;;; +129C;ETHIOPIC SYLLABLE NYEE;Lo;0;L;;;;;N;;;;; +129D;ETHIOPIC SYLLABLE NYE;Lo;0;L;;;;;N;;;;; +129E;ETHIOPIC SYLLABLE NYO;Lo;0;L;;;;;N;;;;; +129F;ETHIOPIC SYLLABLE NYWA;Lo;0;L;;;;;N;;;;; +12A0;ETHIOPIC SYLLABLE GLOTTAL A;Lo;0;L;;;;;N;;;;; +12A1;ETHIOPIC SYLLABLE GLOTTAL U;Lo;0;L;;;;;N;;;;; +12A2;ETHIOPIC SYLLABLE GLOTTAL I;Lo;0;L;;;;;N;;;;; +12A3;ETHIOPIC SYLLABLE GLOTTAL AA;Lo;0;L;;;;;N;;;;; +12A4;ETHIOPIC SYLLABLE GLOTTAL EE;Lo;0;L;;;;;N;;;;; +12A5;ETHIOPIC SYLLABLE GLOTTAL E;Lo;0;L;;;;;N;;;;; +12A6;ETHIOPIC SYLLABLE GLOTTAL O;Lo;0;L;;;;;N;;;;; +12A7;ETHIOPIC SYLLABLE GLOTTAL WA;Lo;0;L;;;;;N;;;;; +12A8;ETHIOPIC SYLLABLE KA;Lo;0;L;;;;;N;;;;; +12A9;ETHIOPIC SYLLABLE KU;Lo;0;L;;;;;N;;;;; +12AA;ETHIOPIC SYLLABLE KI;Lo;0;L;;;;;N;;;;; +12AB;ETHIOPIC SYLLABLE KAA;Lo;0;L;;;;;N;;;;; +12AC;ETHIOPIC SYLLABLE KEE;Lo;0;L;;;;;N;;;;; +12AD;ETHIOPIC SYLLABLE KE;Lo;0;L;;;;;N;;;;; +12AE;ETHIOPIC SYLLABLE KO;Lo;0;L;;;;;N;;;;; +12AF;ETHIOPIC SYLLABLE KOA;Lo;0;L;;;;;N;;;;; +12B0;ETHIOPIC SYLLABLE KWA;Lo;0;L;;;;;N;;;;; +12B2;ETHIOPIC SYLLABLE KWI;Lo;0;L;;;;;N;;;;; +12B3;ETHIOPIC SYLLABLE KWAA;Lo;0;L;;;;;N;;;;; +12B4;ETHIOPIC SYLLABLE KWEE;Lo;0;L;;;;;N;;;;; +12B5;ETHIOPIC SYLLABLE KWE;Lo;0;L;;;;;N;;;;; +12B8;ETHIOPIC SYLLABLE KXA;Lo;0;L;;;;;N;;;;; +12B9;ETHIOPIC SYLLABLE KXU;Lo;0;L;;;;;N;;;;; +12BA;ETHIOPIC SYLLABLE KXI;Lo;0;L;;;;;N;;;;; +12BB;ETHIOPIC SYLLABLE KXAA;Lo;0;L;;;;;N;;;;; +12BC;ETHIOPIC SYLLABLE KXEE;Lo;0;L;;;;;N;;;;; +12BD;ETHIOPIC SYLLABLE KXE;Lo;0;L;;;;;N;;;;; +12BE;ETHIOPIC SYLLABLE KXO;Lo;0;L;;;;;N;;;;; +12C0;ETHIOPIC SYLLABLE KXWA;Lo;0;L;;;;;N;;;;; +12C2;ETHIOPIC SYLLABLE KXWI;Lo;0;L;;;;;N;;;;; +12C3;ETHIOPIC SYLLABLE KXWAA;Lo;0;L;;;;;N;;;;; +12C4;ETHIOPIC SYLLABLE KXWEE;Lo;0;L;;;;;N;;;;; +12C5;ETHIOPIC SYLLABLE KXWE;Lo;0;L;;;;;N;;;;; +12C8;ETHIOPIC SYLLABLE WA;Lo;0;L;;;;;N;;;;; +12C9;ETHIOPIC SYLLABLE WU;Lo;0;L;;;;;N;;;;; +12CA;ETHIOPIC SYLLABLE WI;Lo;0;L;;;;;N;;;;; +12CB;ETHIOPIC SYLLABLE WAA;Lo;0;L;;;;;N;;;;; +12CC;ETHIOPIC SYLLABLE WEE;Lo;0;L;;;;;N;;;;; +12CD;ETHIOPIC SYLLABLE WE;Lo;0;L;;;;;N;;;;; +12CE;ETHIOPIC SYLLABLE WO;Lo;0;L;;;;;N;;;;; +12CF;ETHIOPIC SYLLABLE WOA;Lo;0;L;;;;;N;;;;; +12D0;ETHIOPIC SYLLABLE PHARYNGEAL A;Lo;0;L;;;;;N;;;;; +12D1;ETHIOPIC SYLLABLE PHARYNGEAL U;Lo;0;L;;;;;N;;;;; +12D2;ETHIOPIC SYLLABLE PHARYNGEAL I;Lo;0;L;;;;;N;;;;; +12D3;ETHIOPIC SYLLABLE PHARYNGEAL AA;Lo;0;L;;;;;N;;;;; +12D4;ETHIOPIC SYLLABLE PHARYNGEAL EE;Lo;0;L;;;;;N;;;;; +12D5;ETHIOPIC SYLLABLE PHARYNGEAL E;Lo;0;L;;;;;N;;;;; +12D6;ETHIOPIC SYLLABLE PHARYNGEAL O;Lo;0;L;;;;;N;;;;; +12D8;ETHIOPIC SYLLABLE ZA;Lo;0;L;;;;;N;;;;; +12D9;ETHIOPIC SYLLABLE ZU;Lo;0;L;;;;;N;;;;; +12DA;ETHIOPIC SYLLABLE ZI;Lo;0;L;;;;;N;;;;; +12DB;ETHIOPIC SYLLABLE ZAA;Lo;0;L;;;;;N;;;;; +12DC;ETHIOPIC SYLLABLE ZEE;Lo;0;L;;;;;N;;;;; +12DD;ETHIOPIC SYLLABLE ZE;Lo;0;L;;;;;N;;;;; +12DE;ETHIOPIC SYLLABLE ZO;Lo;0;L;;;;;N;;;;; +12DF;ETHIOPIC SYLLABLE ZWA;Lo;0;L;;;;;N;;;;; +12E0;ETHIOPIC SYLLABLE ZHA;Lo;0;L;;;;;N;;;;; +12E1;ETHIOPIC SYLLABLE ZHU;Lo;0;L;;;;;N;;;;; +12E2;ETHIOPIC SYLLABLE ZHI;Lo;0;L;;;;;N;;;;; +12E3;ETHIOPIC SYLLABLE ZHAA;Lo;0;L;;;;;N;;;;; +12E4;ETHIOPIC SYLLABLE ZHEE;Lo;0;L;;;;;N;;;;; +12E5;ETHIOPIC SYLLABLE ZHE;Lo;0;L;;;;;N;;;;; +12E6;ETHIOPIC SYLLABLE ZHO;Lo;0;L;;;;;N;;;;; +12E7;ETHIOPIC SYLLABLE ZHWA;Lo;0;L;;;;;N;;;;; +12E8;ETHIOPIC SYLLABLE YA;Lo;0;L;;;;;N;;;;; +12E9;ETHIOPIC SYLLABLE YU;Lo;0;L;;;;;N;;;;; +12EA;ETHIOPIC SYLLABLE YI;Lo;0;L;;;;;N;;;;; +12EB;ETHIOPIC SYLLABLE YAA;Lo;0;L;;;;;N;;;;; +12EC;ETHIOPIC SYLLABLE YEE;Lo;0;L;;;;;N;;;;; +12ED;ETHIOPIC SYLLABLE YE;Lo;0;L;;;;;N;;;;; +12EE;ETHIOPIC SYLLABLE YO;Lo;0;L;;;;;N;;;;; +12EF;ETHIOPIC SYLLABLE YOA;Lo;0;L;;;;;N;;;;; +12F0;ETHIOPIC SYLLABLE DA;Lo;0;L;;;;;N;;;;; +12F1;ETHIOPIC SYLLABLE DU;Lo;0;L;;;;;N;;;;; +12F2;ETHIOPIC SYLLABLE DI;Lo;0;L;;;;;N;;;;; +12F3;ETHIOPIC SYLLABLE DAA;Lo;0;L;;;;;N;;;;; +12F4;ETHIOPIC SYLLABLE DEE;Lo;0;L;;;;;N;;;;; +12F5;ETHIOPIC SYLLABLE DE;Lo;0;L;;;;;N;;;;; +12F6;ETHIOPIC SYLLABLE DO;Lo;0;L;;;;;N;;;;; +12F7;ETHIOPIC SYLLABLE DWA;Lo;0;L;;;;;N;;;;; +12F8;ETHIOPIC SYLLABLE DDA;Lo;0;L;;;;;N;;;;; +12F9;ETHIOPIC SYLLABLE DDU;Lo;0;L;;;;;N;;;;; +12FA;ETHIOPIC SYLLABLE DDI;Lo;0;L;;;;;N;;;;; +12FB;ETHIOPIC SYLLABLE DDAA;Lo;0;L;;;;;N;;;;; +12FC;ETHIOPIC SYLLABLE DDEE;Lo;0;L;;;;;N;;;;; +12FD;ETHIOPIC SYLLABLE DDE;Lo;0;L;;;;;N;;;;; +12FE;ETHIOPIC SYLLABLE DDO;Lo;0;L;;;;;N;;;;; +12FF;ETHIOPIC SYLLABLE DDWA;Lo;0;L;;;;;N;;;;; +1300;ETHIOPIC SYLLABLE JA;Lo;0;L;;;;;N;;;;; +1301;ETHIOPIC SYLLABLE JU;Lo;0;L;;;;;N;;;;; +1302;ETHIOPIC SYLLABLE JI;Lo;0;L;;;;;N;;;;; +1303;ETHIOPIC SYLLABLE JAA;Lo;0;L;;;;;N;;;;; +1304;ETHIOPIC SYLLABLE JEE;Lo;0;L;;;;;N;;;;; +1305;ETHIOPIC SYLLABLE JE;Lo;0;L;;;;;N;;;;; +1306;ETHIOPIC SYLLABLE JO;Lo;0;L;;;;;N;;;;; +1307;ETHIOPIC SYLLABLE JWA;Lo;0;L;;;;;N;;;;; +1308;ETHIOPIC SYLLABLE GA;Lo;0;L;;;;;N;;;;; +1309;ETHIOPIC SYLLABLE GU;Lo;0;L;;;;;N;;;;; +130A;ETHIOPIC SYLLABLE GI;Lo;0;L;;;;;N;;;;; +130B;ETHIOPIC SYLLABLE GAA;Lo;0;L;;;;;N;;;;; +130C;ETHIOPIC SYLLABLE GEE;Lo;0;L;;;;;N;;;;; +130D;ETHIOPIC SYLLABLE GE;Lo;0;L;;;;;N;;;;; +130E;ETHIOPIC SYLLABLE GO;Lo;0;L;;;;;N;;;;; +130F;ETHIOPIC SYLLABLE GOA;Lo;0;L;;;;;N;;;;; +1310;ETHIOPIC SYLLABLE GWA;Lo;0;L;;;;;N;;;;; +1312;ETHIOPIC SYLLABLE GWI;Lo;0;L;;;;;N;;;;; +1313;ETHIOPIC SYLLABLE GWAA;Lo;0;L;;;;;N;;;;; +1314;ETHIOPIC SYLLABLE GWEE;Lo;0;L;;;;;N;;;;; +1315;ETHIOPIC SYLLABLE GWE;Lo;0;L;;;;;N;;;;; +1318;ETHIOPIC SYLLABLE GGA;Lo;0;L;;;;;N;;;;; +1319;ETHIOPIC SYLLABLE GGU;Lo;0;L;;;;;N;;;;; +131A;ETHIOPIC SYLLABLE GGI;Lo;0;L;;;;;N;;;;; +131B;ETHIOPIC SYLLABLE GGAA;Lo;0;L;;;;;N;;;;; +131C;ETHIOPIC SYLLABLE GGEE;Lo;0;L;;;;;N;;;;; +131D;ETHIOPIC SYLLABLE GGE;Lo;0;L;;;;;N;;;;; +131E;ETHIOPIC SYLLABLE GGO;Lo;0;L;;;;;N;;;;; +131F;ETHIOPIC SYLLABLE GGWAA;Lo;0;L;;;;;N;;;;; +1320;ETHIOPIC SYLLABLE THA;Lo;0;L;;;;;N;;;;; +1321;ETHIOPIC SYLLABLE THU;Lo;0;L;;;;;N;;;;; +1322;ETHIOPIC SYLLABLE THI;Lo;0;L;;;;;N;;;;; +1323;ETHIOPIC SYLLABLE THAA;Lo;0;L;;;;;N;;;;; +1324;ETHIOPIC SYLLABLE THEE;Lo;0;L;;;;;N;;;;; +1325;ETHIOPIC SYLLABLE THE;Lo;0;L;;;;;N;;;;; +1326;ETHIOPIC SYLLABLE THO;Lo;0;L;;;;;N;;;;; +1327;ETHIOPIC SYLLABLE THWA;Lo;0;L;;;;;N;;;;; +1328;ETHIOPIC SYLLABLE CHA;Lo;0;L;;;;;N;;;;; +1329;ETHIOPIC SYLLABLE CHU;Lo;0;L;;;;;N;;;;; +132A;ETHIOPIC SYLLABLE CHI;Lo;0;L;;;;;N;;;;; +132B;ETHIOPIC SYLLABLE CHAA;Lo;0;L;;;;;N;;;;; +132C;ETHIOPIC SYLLABLE CHEE;Lo;0;L;;;;;N;;;;; +132D;ETHIOPIC SYLLABLE CHE;Lo;0;L;;;;;N;;;;; +132E;ETHIOPIC SYLLABLE CHO;Lo;0;L;;;;;N;;;;; +132F;ETHIOPIC SYLLABLE CHWA;Lo;0;L;;;;;N;;;;; +1330;ETHIOPIC SYLLABLE PHA;Lo;0;L;;;;;N;;;;; +1331;ETHIOPIC SYLLABLE PHU;Lo;0;L;;;;;N;;;;; +1332;ETHIOPIC SYLLABLE PHI;Lo;0;L;;;;;N;;;;; +1333;ETHIOPIC SYLLABLE PHAA;Lo;0;L;;;;;N;;;;; +1334;ETHIOPIC SYLLABLE PHEE;Lo;0;L;;;;;N;;;;; +1335;ETHIOPIC SYLLABLE PHE;Lo;0;L;;;;;N;;;;; +1336;ETHIOPIC SYLLABLE PHO;Lo;0;L;;;;;N;;;;; +1337;ETHIOPIC SYLLABLE PHWA;Lo;0;L;;;;;N;;;;; +1338;ETHIOPIC SYLLABLE TSA;Lo;0;L;;;;;N;;;;; +1339;ETHIOPIC SYLLABLE TSU;Lo;0;L;;;;;N;;;;; +133A;ETHIOPIC SYLLABLE TSI;Lo;0;L;;;;;N;;;;; +133B;ETHIOPIC SYLLABLE TSAA;Lo;0;L;;;;;N;;;;; +133C;ETHIOPIC SYLLABLE TSEE;Lo;0;L;;;;;N;;;;; +133D;ETHIOPIC SYLLABLE TSE;Lo;0;L;;;;;N;;;;; +133E;ETHIOPIC SYLLABLE TSO;Lo;0;L;;;;;N;;;;; +133F;ETHIOPIC SYLLABLE TSWA;Lo;0;L;;;;;N;;;;; +1340;ETHIOPIC SYLLABLE TZA;Lo;0;L;;;;;N;;;;; +1341;ETHIOPIC SYLLABLE TZU;Lo;0;L;;;;;N;;;;; +1342;ETHIOPIC SYLLABLE TZI;Lo;0;L;;;;;N;;;;; +1343;ETHIOPIC SYLLABLE TZAA;Lo;0;L;;;;;N;;;;; +1344;ETHIOPIC SYLLABLE TZEE;Lo;0;L;;;;;N;;;;; +1345;ETHIOPIC SYLLABLE TZE;Lo;0;L;;;;;N;;;;; +1346;ETHIOPIC SYLLABLE TZO;Lo;0;L;;;;;N;;;;; +1347;ETHIOPIC SYLLABLE TZOA;Lo;0;L;;;;;N;;;;; +1348;ETHIOPIC SYLLABLE FA;Lo;0;L;;;;;N;;;;; +1349;ETHIOPIC SYLLABLE FU;Lo;0;L;;;;;N;;;;; +134A;ETHIOPIC SYLLABLE FI;Lo;0;L;;;;;N;;;;; +134B;ETHIOPIC SYLLABLE FAA;Lo;0;L;;;;;N;;;;; +134C;ETHIOPIC SYLLABLE FEE;Lo;0;L;;;;;N;;;;; +134D;ETHIOPIC SYLLABLE FE;Lo;0;L;;;;;N;;;;; +134E;ETHIOPIC SYLLABLE FO;Lo;0;L;;;;;N;;;;; +134F;ETHIOPIC SYLLABLE FWA;Lo;0;L;;;;;N;;;;; +1350;ETHIOPIC SYLLABLE PA;Lo;0;L;;;;;N;;;;; +1351;ETHIOPIC SYLLABLE PU;Lo;0;L;;;;;N;;;;; +1352;ETHIOPIC SYLLABLE PI;Lo;0;L;;;;;N;;;;; +1353;ETHIOPIC SYLLABLE PAA;Lo;0;L;;;;;N;;;;; +1354;ETHIOPIC SYLLABLE PEE;Lo;0;L;;;;;N;;;;; +1355;ETHIOPIC SYLLABLE PE;Lo;0;L;;;;;N;;;;; +1356;ETHIOPIC SYLLABLE PO;Lo;0;L;;;;;N;;;;; +1357;ETHIOPIC SYLLABLE PWA;Lo;0;L;;;;;N;;;;; +1358;ETHIOPIC SYLLABLE RYA;Lo;0;L;;;;;N;;;;; +1359;ETHIOPIC SYLLABLE MYA;Lo;0;L;;;;;N;;;;; +135A;ETHIOPIC SYLLABLE FYA;Lo;0;L;;;;;N;;;;; +135D;ETHIOPIC COMBINING GEMINATION AND VOWEL LENGTH MARK;Mn;230;NSM;;;;;N;;;;; +135E;ETHIOPIC COMBINING VOWEL LENGTH MARK;Mn;230;NSM;;;;;N;;;;; +135F;ETHIOPIC COMBINING GEMINATION MARK;Mn;230;NSM;;;;;N;;;;; +1360;ETHIOPIC SECTION MARK;Po;0;L;;;;;N;;;;; +1361;ETHIOPIC WORDSPACE;Po;0;L;;;;;N;;;;; +1362;ETHIOPIC FULL STOP;Po;0;L;;;;;N;;;;; +1363;ETHIOPIC COMMA;Po;0;L;;;;;N;;;;; +1364;ETHIOPIC SEMICOLON;Po;0;L;;;;;N;;;;; +1365;ETHIOPIC COLON;Po;0;L;;;;;N;;;;; +1366;ETHIOPIC PREFACE COLON;Po;0;L;;;;;N;;;;; +1367;ETHIOPIC QUESTION MARK;Po;0;L;;;;;N;;;;; +1368;ETHIOPIC PARAGRAPH SEPARATOR;Po;0;L;;;;;N;;;;; +1369;ETHIOPIC DIGIT ONE;No;0;L;;;1;1;N;;;;; +136A;ETHIOPIC DIGIT TWO;No;0;L;;;2;2;N;;;;; +136B;ETHIOPIC DIGIT THREE;No;0;L;;;3;3;N;;;;; +136C;ETHIOPIC DIGIT FOUR;No;0;L;;;4;4;N;;;;; +136D;ETHIOPIC DIGIT FIVE;No;0;L;;;5;5;N;;;;; +136E;ETHIOPIC DIGIT SIX;No;0;L;;;6;6;N;;;;; +136F;ETHIOPIC DIGIT SEVEN;No;0;L;;;7;7;N;;;;; +1370;ETHIOPIC DIGIT EIGHT;No;0;L;;;8;8;N;;;;; +1371;ETHIOPIC DIGIT NINE;No;0;L;;;9;9;N;;;;; +1372;ETHIOPIC NUMBER TEN;No;0;L;;;;10;N;;;;; +1373;ETHIOPIC NUMBER TWENTY;No;0;L;;;;20;N;;;;; +1374;ETHIOPIC NUMBER THIRTY;No;0;L;;;;30;N;;;;; +1375;ETHIOPIC NUMBER FORTY;No;0;L;;;;40;N;;;;; +1376;ETHIOPIC NUMBER FIFTY;No;0;L;;;;50;N;;;;; +1377;ETHIOPIC NUMBER SIXTY;No;0;L;;;;60;N;;;;; +1378;ETHIOPIC NUMBER SEVENTY;No;0;L;;;;70;N;;;;; +1379;ETHIOPIC NUMBER EIGHTY;No;0;L;;;;80;N;;;;; +137A;ETHIOPIC NUMBER NINETY;No;0;L;;;;90;N;;;;; +137B;ETHIOPIC NUMBER HUNDRED;No;0;L;;;;100;N;;;;; +137C;ETHIOPIC NUMBER TEN THOUSAND;No;0;L;;;;10000;N;;;;; +1380;ETHIOPIC SYLLABLE SEBATBEIT MWA;Lo;0;L;;;;;N;;;;; +1381;ETHIOPIC SYLLABLE MWI;Lo;0;L;;;;;N;;;;; +1382;ETHIOPIC SYLLABLE MWEE;Lo;0;L;;;;;N;;;;; +1383;ETHIOPIC SYLLABLE MWE;Lo;0;L;;;;;N;;;;; +1384;ETHIOPIC SYLLABLE SEBATBEIT BWA;Lo;0;L;;;;;N;;;;; +1385;ETHIOPIC SYLLABLE BWI;Lo;0;L;;;;;N;;;;; +1386;ETHIOPIC SYLLABLE BWEE;Lo;0;L;;;;;N;;;;; +1387;ETHIOPIC SYLLABLE BWE;Lo;0;L;;;;;N;;;;; +1388;ETHIOPIC SYLLABLE SEBATBEIT FWA;Lo;0;L;;;;;N;;;;; +1389;ETHIOPIC SYLLABLE FWI;Lo;0;L;;;;;N;;;;; +138A;ETHIOPIC SYLLABLE FWEE;Lo;0;L;;;;;N;;;;; +138B;ETHIOPIC SYLLABLE FWE;Lo;0;L;;;;;N;;;;; +138C;ETHIOPIC SYLLABLE SEBATBEIT PWA;Lo;0;L;;;;;N;;;;; +138D;ETHIOPIC SYLLABLE PWI;Lo;0;L;;;;;N;;;;; +138E;ETHIOPIC SYLLABLE PWEE;Lo;0;L;;;;;N;;;;; +138F;ETHIOPIC SYLLABLE PWE;Lo;0;L;;;;;N;;;;; +1390;ETHIOPIC TONAL MARK YIZET;So;0;ON;;;;;N;;;;; +1391;ETHIOPIC TONAL MARK DERET;So;0;ON;;;;;N;;;;; +1392;ETHIOPIC TONAL MARK RIKRIK;So;0;ON;;;;;N;;;;; +1393;ETHIOPIC TONAL MARK SHORT RIKRIK;So;0;ON;;;;;N;;;;; +1394;ETHIOPIC TONAL MARK DIFAT;So;0;ON;;;;;N;;;;; +1395;ETHIOPIC TONAL MARK KENAT;So;0;ON;;;;;N;;;;; +1396;ETHIOPIC TONAL MARK CHIRET;So;0;ON;;;;;N;;;;; +1397;ETHIOPIC TONAL MARK HIDET;So;0;ON;;;;;N;;;;; +1398;ETHIOPIC TONAL MARK DERET-HIDET;So;0;ON;;;;;N;;;;; +1399;ETHIOPIC TONAL MARK KURT;So;0;ON;;;;;N;;;;; +13A0;CHEROKEE LETTER A;Lu;0;L;;;;;N;;;;AB70; +13A1;CHEROKEE LETTER E;Lu;0;L;;;;;N;;;;AB71; +13A2;CHEROKEE LETTER I;Lu;0;L;;;;;N;;;;AB72; +13A3;CHEROKEE LETTER O;Lu;0;L;;;;;N;;;;AB73; +13A4;CHEROKEE LETTER U;Lu;0;L;;;;;N;;;;AB74; +13A5;CHEROKEE LETTER V;Lu;0;L;;;;;N;;;;AB75; +13A6;CHEROKEE LETTER GA;Lu;0;L;;;;;N;;;;AB76; +13A7;CHEROKEE LETTER KA;Lu;0;L;;;;;N;;;;AB77; +13A8;CHEROKEE LETTER GE;Lu;0;L;;;;;N;;;;AB78; +13A9;CHEROKEE LETTER GI;Lu;0;L;;;;;N;;;;AB79; +13AA;CHEROKEE LETTER GO;Lu;0;L;;;;;N;;;;AB7A; +13AB;CHEROKEE LETTER GU;Lu;0;L;;;;;N;;;;AB7B; +13AC;CHEROKEE LETTER GV;Lu;0;L;;;;;N;;;;AB7C; +13AD;CHEROKEE LETTER HA;Lu;0;L;;;;;N;;;;AB7D; +13AE;CHEROKEE LETTER HE;Lu;0;L;;;;;N;;;;AB7E; +13AF;CHEROKEE LETTER HI;Lu;0;L;;;;;N;;;;AB7F; +13B0;CHEROKEE LETTER HO;Lu;0;L;;;;;N;;;;AB80; +13B1;CHEROKEE LETTER HU;Lu;0;L;;;;;N;;;;AB81; +13B2;CHEROKEE LETTER HV;Lu;0;L;;;;;N;;;;AB82; +13B3;CHEROKEE LETTER LA;Lu;0;L;;;;;N;;;;AB83; +13B4;CHEROKEE LETTER LE;Lu;0;L;;;;;N;;;;AB84; +13B5;CHEROKEE LETTER LI;Lu;0;L;;;;;N;;;;AB85; +13B6;CHEROKEE LETTER LO;Lu;0;L;;;;;N;;;;AB86; +13B7;CHEROKEE LETTER LU;Lu;0;L;;;;;N;;;;AB87; +13B8;CHEROKEE LETTER LV;Lu;0;L;;;;;N;;;;AB88; +13B9;CHEROKEE LETTER MA;Lu;0;L;;;;;N;;;;AB89; +13BA;CHEROKEE LETTER ME;Lu;0;L;;;;;N;;;;AB8A; +13BB;CHEROKEE LETTER MI;Lu;0;L;;;;;N;;;;AB8B; +13BC;CHEROKEE LETTER MO;Lu;0;L;;;;;N;;;;AB8C; +13BD;CHEROKEE LETTER MU;Lu;0;L;;;;;N;;;;AB8D; +13BE;CHEROKEE LETTER NA;Lu;0;L;;;;;N;;;;AB8E; +13BF;CHEROKEE LETTER HNA;Lu;0;L;;;;;N;;;;AB8F; +13C0;CHEROKEE LETTER NAH;Lu;0;L;;;;;N;;;;AB90; +13C1;CHEROKEE LETTER NE;Lu;0;L;;;;;N;;;;AB91; +13C2;CHEROKEE LETTER NI;Lu;0;L;;;;;N;;;;AB92; +13C3;CHEROKEE LETTER NO;Lu;0;L;;;;;N;;;;AB93; +13C4;CHEROKEE LETTER NU;Lu;0;L;;;;;N;;;;AB94; +13C5;CHEROKEE LETTER NV;Lu;0;L;;;;;N;;;;AB95; +13C6;CHEROKEE LETTER QUA;Lu;0;L;;;;;N;;;;AB96; +13C7;CHEROKEE LETTER QUE;Lu;0;L;;;;;N;;;;AB97; +13C8;CHEROKEE LETTER QUI;Lu;0;L;;;;;N;;;;AB98; +13C9;CHEROKEE LETTER QUO;Lu;0;L;;;;;N;;;;AB99; +13CA;CHEROKEE LETTER QUU;Lu;0;L;;;;;N;;;;AB9A; +13CB;CHEROKEE LETTER QUV;Lu;0;L;;;;;N;;;;AB9B; +13CC;CHEROKEE LETTER SA;Lu;0;L;;;;;N;;;;AB9C; +13CD;CHEROKEE LETTER S;Lu;0;L;;;;;N;;;;AB9D; +13CE;CHEROKEE LETTER SE;Lu;0;L;;;;;N;;;;AB9E; +13CF;CHEROKEE LETTER SI;Lu;0;L;;;;;N;;;;AB9F; +13D0;CHEROKEE LETTER SO;Lu;0;L;;;;;N;;;;ABA0; +13D1;CHEROKEE LETTER SU;Lu;0;L;;;;;N;;;;ABA1; +13D2;CHEROKEE LETTER SV;Lu;0;L;;;;;N;;;;ABA2; +13D3;CHEROKEE LETTER DA;Lu;0;L;;;;;N;;;;ABA3; +13D4;CHEROKEE LETTER TA;Lu;0;L;;;;;N;;;;ABA4; +13D5;CHEROKEE LETTER DE;Lu;0;L;;;;;N;;;;ABA5; +13D6;CHEROKEE LETTER TE;Lu;0;L;;;;;N;;;;ABA6; +13D7;CHEROKEE LETTER DI;Lu;0;L;;;;;N;;;;ABA7; +13D8;CHEROKEE LETTER TI;Lu;0;L;;;;;N;;;;ABA8; +13D9;CHEROKEE LETTER DO;Lu;0;L;;;;;N;;;;ABA9; +13DA;CHEROKEE LETTER DU;Lu;0;L;;;;;N;;;;ABAA; +13DB;CHEROKEE LETTER DV;Lu;0;L;;;;;N;;;;ABAB; +13DC;CHEROKEE LETTER DLA;Lu;0;L;;;;;N;;;;ABAC; +13DD;CHEROKEE LETTER TLA;Lu;0;L;;;;;N;;;;ABAD; +13DE;CHEROKEE LETTER TLE;Lu;0;L;;;;;N;;;;ABAE; +13DF;CHEROKEE LETTER TLI;Lu;0;L;;;;;N;;;;ABAF; +13E0;CHEROKEE LETTER TLO;Lu;0;L;;;;;N;;;;ABB0; +13E1;CHEROKEE LETTER TLU;Lu;0;L;;;;;N;;;;ABB1; +13E2;CHEROKEE LETTER TLV;Lu;0;L;;;;;N;;;;ABB2; +13E3;CHEROKEE LETTER TSA;Lu;0;L;;;;;N;;;;ABB3; +13E4;CHEROKEE LETTER TSE;Lu;0;L;;;;;N;;;;ABB4; +13E5;CHEROKEE LETTER TSI;Lu;0;L;;;;;N;;;;ABB5; +13E6;CHEROKEE LETTER TSO;Lu;0;L;;;;;N;;;;ABB6; +13E7;CHEROKEE LETTER TSU;Lu;0;L;;;;;N;;;;ABB7; +13E8;CHEROKEE LETTER TSV;Lu;0;L;;;;;N;;;;ABB8; +13E9;CHEROKEE LETTER WA;Lu;0;L;;;;;N;;;;ABB9; +13EA;CHEROKEE LETTER WE;Lu;0;L;;;;;N;;;;ABBA; +13EB;CHEROKEE LETTER WI;Lu;0;L;;;;;N;;;;ABBB; +13EC;CHEROKEE LETTER WO;Lu;0;L;;;;;N;;;;ABBC; +13ED;CHEROKEE LETTER WU;Lu;0;L;;;;;N;;;;ABBD; +13EE;CHEROKEE LETTER WV;Lu;0;L;;;;;N;;;;ABBE; +13EF;CHEROKEE LETTER YA;Lu;0;L;;;;;N;;;;ABBF; +13F0;CHEROKEE LETTER YE;Lu;0;L;;;;;N;;;;13F8; +13F1;CHEROKEE LETTER YI;Lu;0;L;;;;;N;;;;13F9; +13F2;CHEROKEE LETTER YO;Lu;0;L;;;;;N;;;;13FA; +13F3;CHEROKEE LETTER YU;Lu;0;L;;;;;N;;;;13FB; +13F4;CHEROKEE LETTER YV;Lu;0;L;;;;;N;;;;13FC; +13F5;CHEROKEE LETTER MV;Lu;0;L;;;;;N;;;;13FD; +13F8;CHEROKEE SMALL LETTER YE;Ll;0;L;;;;;N;;;13F0;;13F0 +13F9;CHEROKEE SMALL LETTER YI;Ll;0;L;;;;;N;;;13F1;;13F1 +13FA;CHEROKEE SMALL LETTER YO;Ll;0;L;;;;;N;;;13F2;;13F2 +13FB;CHEROKEE SMALL LETTER YU;Ll;0;L;;;;;N;;;13F3;;13F3 +13FC;CHEROKEE SMALL LETTER YV;Ll;0;L;;;;;N;;;13F4;;13F4 +13FD;CHEROKEE SMALL LETTER MV;Ll;0;L;;;;;N;;;13F5;;13F5 +1400;CANADIAN SYLLABICS HYPHEN;Pd;0;ON;;;;;N;;;;; +1401;CANADIAN SYLLABICS E;Lo;0;L;;;;;N;;;;; +1402;CANADIAN SYLLABICS AAI;Lo;0;L;;;;;N;;;;; +1403;CANADIAN SYLLABICS I;Lo;0;L;;;;;N;;;;; +1404;CANADIAN SYLLABICS II;Lo;0;L;;;;;N;;;;; +1405;CANADIAN SYLLABICS O;Lo;0;L;;;;;N;;;;; +1406;CANADIAN SYLLABICS OO;Lo;0;L;;;;;N;;;;; +1407;CANADIAN SYLLABICS Y-CREE OO;Lo;0;L;;;;;N;;;;; +1408;CANADIAN SYLLABICS CARRIER EE;Lo;0;L;;;;;N;;;;; +1409;CANADIAN SYLLABICS CARRIER I;Lo;0;L;;;;;N;;;;; +140A;CANADIAN SYLLABICS A;Lo;0;L;;;;;N;;;;; +140B;CANADIAN SYLLABICS AA;Lo;0;L;;;;;N;;;;; +140C;CANADIAN SYLLABICS WE;Lo;0;L;;;;;N;;;;; +140D;CANADIAN SYLLABICS WEST-CREE WE;Lo;0;L;;;;;N;;;;; +140E;CANADIAN SYLLABICS WI;Lo;0;L;;;;;N;;;;; +140F;CANADIAN SYLLABICS WEST-CREE WI;Lo;0;L;;;;;N;;;;; +1410;CANADIAN SYLLABICS WII;Lo;0;L;;;;;N;;;;; +1411;CANADIAN SYLLABICS WEST-CREE WII;Lo;0;L;;;;;N;;;;; +1412;CANADIAN SYLLABICS WO;Lo;0;L;;;;;N;;;;; +1413;CANADIAN SYLLABICS WEST-CREE WO;Lo;0;L;;;;;N;;;;; +1414;CANADIAN SYLLABICS WOO;Lo;0;L;;;;;N;;;;; +1415;CANADIAN SYLLABICS WEST-CREE WOO;Lo;0;L;;;;;N;;;;; +1416;CANADIAN SYLLABICS NASKAPI WOO;Lo;0;L;;;;;N;;;;; +1417;CANADIAN SYLLABICS WA;Lo;0;L;;;;;N;;;;; +1418;CANADIAN SYLLABICS WEST-CREE WA;Lo;0;L;;;;;N;;;;; +1419;CANADIAN SYLLABICS WAA;Lo;0;L;;;;;N;;;;; +141A;CANADIAN SYLLABICS WEST-CREE WAA;Lo;0;L;;;;;N;;;;; +141B;CANADIAN SYLLABICS NASKAPI WAA;Lo;0;L;;;;;N;;;;; +141C;CANADIAN SYLLABICS AI;Lo;0;L;;;;;N;;;;; +141D;CANADIAN SYLLABICS Y-CREE W;Lo;0;L;;;;;N;;;;; +141E;CANADIAN SYLLABICS GLOTTAL STOP;Lo;0;L;;;;;N;;;;; +141F;CANADIAN SYLLABICS FINAL ACUTE;Lo;0;L;;;;;N;;;;; +1420;CANADIAN SYLLABICS FINAL GRAVE;Lo;0;L;;;;;N;;;;; +1421;CANADIAN SYLLABICS FINAL BOTTOM HALF RING;Lo;0;L;;;;;N;;;;; +1422;CANADIAN SYLLABICS FINAL TOP HALF RING;Lo;0;L;;;;;N;;;;; +1423;CANADIAN SYLLABICS FINAL RIGHT HALF RING;Lo;0;L;;;;;N;;;;; +1424;CANADIAN SYLLABICS FINAL RING;Lo;0;L;;;;;N;;;;; +1425;CANADIAN SYLLABICS FINAL DOUBLE ACUTE;Lo;0;L;;;;;N;;;;; +1426;CANADIAN SYLLABICS FINAL DOUBLE SHORT VERTICAL STROKES;Lo;0;L;;;;;N;;;;; +1427;CANADIAN SYLLABICS FINAL MIDDLE DOT;Lo;0;L;;;;;N;;;;; +1428;CANADIAN SYLLABICS FINAL SHORT HORIZONTAL STROKE;Lo;0;L;;;;;N;;;;; +1429;CANADIAN SYLLABICS FINAL PLUS;Lo;0;L;;;;;N;;;;; +142A;CANADIAN SYLLABICS FINAL DOWN TACK;Lo;0;L;;;;;N;;;;; +142B;CANADIAN SYLLABICS EN;Lo;0;L;;;;;N;;;;; +142C;CANADIAN SYLLABICS IN;Lo;0;L;;;;;N;;;;; +142D;CANADIAN SYLLABICS ON;Lo;0;L;;;;;N;;;;; +142E;CANADIAN SYLLABICS AN;Lo;0;L;;;;;N;;;;; +142F;CANADIAN SYLLABICS PE;Lo;0;L;;;;;N;;;;; +1430;CANADIAN SYLLABICS PAAI;Lo;0;L;;;;;N;;;;; +1431;CANADIAN SYLLABICS PI;Lo;0;L;;;;;N;;;;; +1432;CANADIAN SYLLABICS PII;Lo;0;L;;;;;N;;;;; +1433;CANADIAN SYLLABICS PO;Lo;0;L;;;;;N;;;;; +1434;CANADIAN SYLLABICS POO;Lo;0;L;;;;;N;;;;; +1435;CANADIAN SYLLABICS Y-CREE POO;Lo;0;L;;;;;N;;;;; +1436;CANADIAN SYLLABICS CARRIER HEE;Lo;0;L;;;;;N;;;;; +1437;CANADIAN SYLLABICS CARRIER HI;Lo;0;L;;;;;N;;;;; +1438;CANADIAN SYLLABICS PA;Lo;0;L;;;;;N;;;;; +1439;CANADIAN SYLLABICS PAA;Lo;0;L;;;;;N;;;;; +143A;CANADIAN SYLLABICS PWE;Lo;0;L;;;;;N;;;;; +143B;CANADIAN SYLLABICS WEST-CREE PWE;Lo;0;L;;;;;N;;;;; +143C;CANADIAN SYLLABICS PWI;Lo;0;L;;;;;N;;;;; +143D;CANADIAN SYLLABICS WEST-CREE PWI;Lo;0;L;;;;;N;;;;; +143E;CANADIAN SYLLABICS PWII;Lo;0;L;;;;;N;;;;; +143F;CANADIAN SYLLABICS WEST-CREE PWII;Lo;0;L;;;;;N;;;;; +1440;CANADIAN SYLLABICS PWO;Lo;0;L;;;;;N;;;;; +1441;CANADIAN SYLLABICS WEST-CREE PWO;Lo;0;L;;;;;N;;;;; +1442;CANADIAN SYLLABICS PWOO;Lo;0;L;;;;;N;;;;; +1443;CANADIAN SYLLABICS WEST-CREE PWOO;Lo;0;L;;;;;N;;;;; +1444;CANADIAN SYLLABICS PWA;Lo;0;L;;;;;N;;;;; +1445;CANADIAN SYLLABICS WEST-CREE PWA;Lo;0;L;;;;;N;;;;; +1446;CANADIAN SYLLABICS PWAA;Lo;0;L;;;;;N;;;;; +1447;CANADIAN SYLLABICS WEST-CREE PWAA;Lo;0;L;;;;;N;;;;; +1448;CANADIAN SYLLABICS Y-CREE PWAA;Lo;0;L;;;;;N;;;;; +1449;CANADIAN SYLLABICS P;Lo;0;L;;;;;N;;;;; +144A;CANADIAN SYLLABICS WEST-CREE P;Lo;0;L;;;;;N;;;;; +144B;CANADIAN SYLLABICS CARRIER H;Lo;0;L;;;;;N;;;;; +144C;CANADIAN SYLLABICS TE;Lo;0;L;;;;;N;;;;; +144D;CANADIAN SYLLABICS TAAI;Lo;0;L;;;;;N;;;;; +144E;CANADIAN SYLLABICS TI;Lo;0;L;;;;;N;;;;; +144F;CANADIAN SYLLABICS TII;Lo;0;L;;;;;N;;;;; +1450;CANADIAN SYLLABICS TO;Lo;0;L;;;;;N;;;;; +1451;CANADIAN SYLLABICS TOO;Lo;0;L;;;;;N;;;;; +1452;CANADIAN SYLLABICS Y-CREE TOO;Lo;0;L;;;;;N;;;;; +1453;CANADIAN SYLLABICS CARRIER DEE;Lo;0;L;;;;;N;;;;; +1454;CANADIAN SYLLABICS CARRIER DI;Lo;0;L;;;;;N;;;;; +1455;CANADIAN SYLLABICS TA;Lo;0;L;;;;;N;;;;; +1456;CANADIAN SYLLABICS TAA;Lo;0;L;;;;;N;;;;; +1457;CANADIAN SYLLABICS TWE;Lo;0;L;;;;;N;;;;; +1458;CANADIAN SYLLABICS WEST-CREE TWE;Lo;0;L;;;;;N;;;;; +1459;CANADIAN SYLLABICS TWI;Lo;0;L;;;;;N;;;;; +145A;CANADIAN SYLLABICS WEST-CREE TWI;Lo;0;L;;;;;N;;;;; +145B;CANADIAN SYLLABICS TWII;Lo;0;L;;;;;N;;;;; +145C;CANADIAN SYLLABICS WEST-CREE TWII;Lo;0;L;;;;;N;;;;; +145D;CANADIAN SYLLABICS TWO;Lo;0;L;;;;;N;;;;; +145E;CANADIAN SYLLABICS WEST-CREE TWO;Lo;0;L;;;;;N;;;;; +145F;CANADIAN SYLLABICS TWOO;Lo;0;L;;;;;N;;;;; +1460;CANADIAN SYLLABICS WEST-CREE TWOO;Lo;0;L;;;;;N;;;;; +1461;CANADIAN SYLLABICS TWA;Lo;0;L;;;;;N;;;;; +1462;CANADIAN SYLLABICS WEST-CREE TWA;Lo;0;L;;;;;N;;;;; +1463;CANADIAN SYLLABICS TWAA;Lo;0;L;;;;;N;;;;; +1464;CANADIAN SYLLABICS WEST-CREE TWAA;Lo;0;L;;;;;N;;;;; +1465;CANADIAN SYLLABICS NASKAPI TWAA;Lo;0;L;;;;;N;;;;; +1466;CANADIAN SYLLABICS T;Lo;0;L;;;;;N;;;;; +1467;CANADIAN SYLLABICS TTE;Lo;0;L;;;;;N;;;;; +1468;CANADIAN SYLLABICS TTI;Lo;0;L;;;;;N;;;;; +1469;CANADIAN SYLLABICS TTO;Lo;0;L;;;;;N;;;;; +146A;CANADIAN SYLLABICS TTA;Lo;0;L;;;;;N;;;;; +146B;CANADIAN SYLLABICS KE;Lo;0;L;;;;;N;;;;; +146C;CANADIAN SYLLABICS KAAI;Lo;0;L;;;;;N;;;;; +146D;CANADIAN SYLLABICS KI;Lo;0;L;;;;;N;;;;; +146E;CANADIAN SYLLABICS KII;Lo;0;L;;;;;N;;;;; +146F;CANADIAN SYLLABICS KO;Lo;0;L;;;;;N;;;;; +1470;CANADIAN SYLLABICS KOO;Lo;0;L;;;;;N;;;;; +1471;CANADIAN SYLLABICS Y-CREE KOO;Lo;0;L;;;;;N;;;;; +1472;CANADIAN SYLLABICS KA;Lo;0;L;;;;;N;;;;; +1473;CANADIAN SYLLABICS KAA;Lo;0;L;;;;;N;;;;; +1474;CANADIAN SYLLABICS KWE;Lo;0;L;;;;;N;;;;; +1475;CANADIAN SYLLABICS WEST-CREE KWE;Lo;0;L;;;;;N;;;;; +1476;CANADIAN SYLLABICS KWI;Lo;0;L;;;;;N;;;;; +1477;CANADIAN SYLLABICS WEST-CREE KWI;Lo;0;L;;;;;N;;;;; +1478;CANADIAN SYLLABICS KWII;Lo;0;L;;;;;N;;;;; +1479;CANADIAN SYLLABICS WEST-CREE KWII;Lo;0;L;;;;;N;;;;; +147A;CANADIAN SYLLABICS KWO;Lo;0;L;;;;;N;;;;; +147B;CANADIAN SYLLABICS WEST-CREE KWO;Lo;0;L;;;;;N;;;;; +147C;CANADIAN SYLLABICS KWOO;Lo;0;L;;;;;N;;;;; +147D;CANADIAN SYLLABICS WEST-CREE KWOO;Lo;0;L;;;;;N;;;;; +147E;CANADIAN SYLLABICS KWA;Lo;0;L;;;;;N;;;;; +147F;CANADIAN SYLLABICS WEST-CREE KWA;Lo;0;L;;;;;N;;;;; +1480;CANADIAN SYLLABICS KWAA;Lo;0;L;;;;;N;;;;; +1481;CANADIAN SYLLABICS WEST-CREE KWAA;Lo;0;L;;;;;N;;;;; +1482;CANADIAN SYLLABICS NASKAPI KWAA;Lo;0;L;;;;;N;;;;; +1483;CANADIAN SYLLABICS K;Lo;0;L;;;;;N;;;;; +1484;CANADIAN SYLLABICS KW;Lo;0;L;;;;;N;;;;; +1485;CANADIAN SYLLABICS SOUTH-SLAVEY KEH;Lo;0;L;;;;;N;;;;; +1486;CANADIAN SYLLABICS SOUTH-SLAVEY KIH;Lo;0;L;;;;;N;;;;; +1487;CANADIAN SYLLABICS SOUTH-SLAVEY KOH;Lo;0;L;;;;;N;;;;; +1488;CANADIAN SYLLABICS SOUTH-SLAVEY KAH;Lo;0;L;;;;;N;;;;; +1489;CANADIAN SYLLABICS CE;Lo;0;L;;;;;N;;;;; +148A;CANADIAN SYLLABICS CAAI;Lo;0;L;;;;;N;;;;; +148B;CANADIAN SYLLABICS CI;Lo;0;L;;;;;N;;;;; +148C;CANADIAN SYLLABICS CII;Lo;0;L;;;;;N;;;;; +148D;CANADIAN SYLLABICS CO;Lo;0;L;;;;;N;;;;; +148E;CANADIAN SYLLABICS COO;Lo;0;L;;;;;N;;;;; +148F;CANADIAN SYLLABICS Y-CREE COO;Lo;0;L;;;;;N;;;;; +1490;CANADIAN SYLLABICS CA;Lo;0;L;;;;;N;;;;; +1491;CANADIAN SYLLABICS CAA;Lo;0;L;;;;;N;;;;; +1492;CANADIAN SYLLABICS CWE;Lo;0;L;;;;;N;;;;; +1493;CANADIAN SYLLABICS WEST-CREE CWE;Lo;0;L;;;;;N;;;;; +1494;CANADIAN SYLLABICS CWI;Lo;0;L;;;;;N;;;;; +1495;CANADIAN SYLLABICS WEST-CREE CWI;Lo;0;L;;;;;N;;;;; +1496;CANADIAN SYLLABICS CWII;Lo;0;L;;;;;N;;;;; +1497;CANADIAN SYLLABICS WEST-CREE CWII;Lo;0;L;;;;;N;;;;; +1498;CANADIAN SYLLABICS CWO;Lo;0;L;;;;;N;;;;; +1499;CANADIAN SYLLABICS WEST-CREE CWO;Lo;0;L;;;;;N;;;;; +149A;CANADIAN SYLLABICS CWOO;Lo;0;L;;;;;N;;;;; +149B;CANADIAN SYLLABICS WEST-CREE CWOO;Lo;0;L;;;;;N;;;;; +149C;CANADIAN SYLLABICS CWA;Lo;0;L;;;;;N;;;;; +149D;CANADIAN SYLLABICS WEST-CREE CWA;Lo;0;L;;;;;N;;;;; +149E;CANADIAN SYLLABICS CWAA;Lo;0;L;;;;;N;;;;; +149F;CANADIAN SYLLABICS WEST-CREE CWAA;Lo;0;L;;;;;N;;;;; +14A0;CANADIAN SYLLABICS NASKAPI CWAA;Lo;0;L;;;;;N;;;;; +14A1;CANADIAN SYLLABICS C;Lo;0;L;;;;;N;;;;; +14A2;CANADIAN SYLLABICS SAYISI TH;Lo;0;L;;;;;N;;;;; +14A3;CANADIAN SYLLABICS ME;Lo;0;L;;;;;N;;;;; +14A4;CANADIAN SYLLABICS MAAI;Lo;0;L;;;;;N;;;;; +14A5;CANADIAN SYLLABICS MI;Lo;0;L;;;;;N;;;;; +14A6;CANADIAN SYLLABICS MII;Lo;0;L;;;;;N;;;;; +14A7;CANADIAN SYLLABICS MO;Lo;0;L;;;;;N;;;;; +14A8;CANADIAN SYLLABICS MOO;Lo;0;L;;;;;N;;;;; +14A9;CANADIAN SYLLABICS Y-CREE MOO;Lo;0;L;;;;;N;;;;; +14AA;CANADIAN SYLLABICS MA;Lo;0;L;;;;;N;;;;; +14AB;CANADIAN SYLLABICS MAA;Lo;0;L;;;;;N;;;;; +14AC;CANADIAN SYLLABICS MWE;Lo;0;L;;;;;N;;;;; +14AD;CANADIAN SYLLABICS WEST-CREE MWE;Lo;0;L;;;;;N;;;;; +14AE;CANADIAN SYLLABICS MWI;Lo;0;L;;;;;N;;;;; +14AF;CANADIAN SYLLABICS WEST-CREE MWI;Lo;0;L;;;;;N;;;;; +14B0;CANADIAN SYLLABICS MWII;Lo;0;L;;;;;N;;;;; +14B1;CANADIAN SYLLABICS WEST-CREE MWII;Lo;0;L;;;;;N;;;;; +14B2;CANADIAN SYLLABICS MWO;Lo;0;L;;;;;N;;;;; +14B3;CANADIAN SYLLABICS WEST-CREE MWO;Lo;0;L;;;;;N;;;;; +14B4;CANADIAN SYLLABICS MWOO;Lo;0;L;;;;;N;;;;; +14B5;CANADIAN SYLLABICS WEST-CREE MWOO;Lo;0;L;;;;;N;;;;; +14B6;CANADIAN SYLLABICS MWA;Lo;0;L;;;;;N;;;;; +14B7;CANADIAN SYLLABICS WEST-CREE MWA;Lo;0;L;;;;;N;;;;; +14B8;CANADIAN SYLLABICS MWAA;Lo;0;L;;;;;N;;;;; +14B9;CANADIAN SYLLABICS WEST-CREE MWAA;Lo;0;L;;;;;N;;;;; +14BA;CANADIAN SYLLABICS NASKAPI MWAA;Lo;0;L;;;;;N;;;;; +14BB;CANADIAN SYLLABICS M;Lo;0;L;;;;;N;;;;; +14BC;CANADIAN SYLLABICS WEST-CREE M;Lo;0;L;;;;;N;;;;; +14BD;CANADIAN SYLLABICS MH;Lo;0;L;;;;;N;;;;; +14BE;CANADIAN SYLLABICS ATHAPASCAN M;Lo;0;L;;;;;N;;;;; +14BF;CANADIAN SYLLABICS SAYISI M;Lo;0;L;;;;;N;;;;; +14C0;CANADIAN SYLLABICS NE;Lo;0;L;;;;;N;;;;; +14C1;CANADIAN SYLLABICS NAAI;Lo;0;L;;;;;N;;;;; +14C2;CANADIAN SYLLABICS NI;Lo;0;L;;;;;N;;;;; +14C3;CANADIAN SYLLABICS NII;Lo;0;L;;;;;N;;;;; +14C4;CANADIAN SYLLABICS NO;Lo;0;L;;;;;N;;;;; +14C5;CANADIAN SYLLABICS NOO;Lo;0;L;;;;;N;;;;; +14C6;CANADIAN SYLLABICS Y-CREE NOO;Lo;0;L;;;;;N;;;;; +14C7;CANADIAN SYLLABICS NA;Lo;0;L;;;;;N;;;;; +14C8;CANADIAN SYLLABICS NAA;Lo;0;L;;;;;N;;;;; +14C9;CANADIAN SYLLABICS NWE;Lo;0;L;;;;;N;;;;; +14CA;CANADIAN SYLLABICS WEST-CREE NWE;Lo;0;L;;;;;N;;;;; +14CB;CANADIAN SYLLABICS NWA;Lo;0;L;;;;;N;;;;; +14CC;CANADIAN SYLLABICS WEST-CREE NWA;Lo;0;L;;;;;N;;;;; +14CD;CANADIAN SYLLABICS NWAA;Lo;0;L;;;;;N;;;;; +14CE;CANADIAN SYLLABICS WEST-CREE NWAA;Lo;0;L;;;;;N;;;;; +14CF;CANADIAN SYLLABICS NASKAPI NWAA;Lo;0;L;;;;;N;;;;; +14D0;CANADIAN SYLLABICS N;Lo;0;L;;;;;N;;;;; +14D1;CANADIAN SYLLABICS CARRIER NG;Lo;0;L;;;;;N;;;;; +14D2;CANADIAN SYLLABICS NH;Lo;0;L;;;;;N;;;;; +14D3;CANADIAN SYLLABICS LE;Lo;0;L;;;;;N;;;;; +14D4;CANADIAN SYLLABICS LAAI;Lo;0;L;;;;;N;;;;; +14D5;CANADIAN SYLLABICS LI;Lo;0;L;;;;;N;;;;; +14D6;CANADIAN SYLLABICS LII;Lo;0;L;;;;;N;;;;; +14D7;CANADIAN SYLLABICS LO;Lo;0;L;;;;;N;;;;; +14D8;CANADIAN SYLLABICS LOO;Lo;0;L;;;;;N;;;;; +14D9;CANADIAN SYLLABICS Y-CREE LOO;Lo;0;L;;;;;N;;;;; +14DA;CANADIAN SYLLABICS LA;Lo;0;L;;;;;N;;;;; +14DB;CANADIAN SYLLABICS LAA;Lo;0;L;;;;;N;;;;; +14DC;CANADIAN SYLLABICS LWE;Lo;0;L;;;;;N;;;;; +14DD;CANADIAN SYLLABICS WEST-CREE LWE;Lo;0;L;;;;;N;;;;; +14DE;CANADIAN SYLLABICS LWI;Lo;0;L;;;;;N;;;;; +14DF;CANADIAN SYLLABICS WEST-CREE LWI;Lo;0;L;;;;;N;;;;; +14E0;CANADIAN SYLLABICS LWII;Lo;0;L;;;;;N;;;;; +14E1;CANADIAN SYLLABICS WEST-CREE LWII;Lo;0;L;;;;;N;;;;; +14E2;CANADIAN SYLLABICS LWO;Lo;0;L;;;;;N;;;;; +14E3;CANADIAN SYLLABICS WEST-CREE LWO;Lo;0;L;;;;;N;;;;; +14E4;CANADIAN SYLLABICS LWOO;Lo;0;L;;;;;N;;;;; +14E5;CANADIAN SYLLABICS WEST-CREE LWOO;Lo;0;L;;;;;N;;;;; +14E6;CANADIAN SYLLABICS LWA;Lo;0;L;;;;;N;;;;; +14E7;CANADIAN SYLLABICS WEST-CREE LWA;Lo;0;L;;;;;N;;;;; +14E8;CANADIAN SYLLABICS LWAA;Lo;0;L;;;;;N;;;;; +14E9;CANADIAN SYLLABICS WEST-CREE LWAA;Lo;0;L;;;;;N;;;;; +14EA;CANADIAN SYLLABICS L;Lo;0;L;;;;;N;;;;; +14EB;CANADIAN SYLLABICS WEST-CREE L;Lo;0;L;;;;;N;;;;; +14EC;CANADIAN SYLLABICS MEDIAL L;Lo;0;L;;;;;N;;;;; +14ED;CANADIAN SYLLABICS SE;Lo;0;L;;;;;N;;;;; +14EE;CANADIAN SYLLABICS SAAI;Lo;0;L;;;;;N;;;;; +14EF;CANADIAN SYLLABICS SI;Lo;0;L;;;;;N;;;;; +14F0;CANADIAN SYLLABICS SII;Lo;0;L;;;;;N;;;;; +14F1;CANADIAN SYLLABICS SO;Lo;0;L;;;;;N;;;;; +14F2;CANADIAN SYLLABICS SOO;Lo;0;L;;;;;N;;;;; +14F3;CANADIAN SYLLABICS Y-CREE SOO;Lo;0;L;;;;;N;;;;; +14F4;CANADIAN SYLLABICS SA;Lo;0;L;;;;;N;;;;; +14F5;CANADIAN SYLLABICS SAA;Lo;0;L;;;;;N;;;;; +14F6;CANADIAN SYLLABICS SWE;Lo;0;L;;;;;N;;;;; +14F7;CANADIAN SYLLABICS WEST-CREE SWE;Lo;0;L;;;;;N;;;;; +14F8;CANADIAN SYLLABICS SWI;Lo;0;L;;;;;N;;;;; +14F9;CANADIAN SYLLABICS WEST-CREE SWI;Lo;0;L;;;;;N;;;;; +14FA;CANADIAN SYLLABICS SWII;Lo;0;L;;;;;N;;;;; +14FB;CANADIAN SYLLABICS WEST-CREE SWII;Lo;0;L;;;;;N;;;;; +14FC;CANADIAN SYLLABICS SWO;Lo;0;L;;;;;N;;;;; +14FD;CANADIAN SYLLABICS WEST-CREE SWO;Lo;0;L;;;;;N;;;;; +14FE;CANADIAN SYLLABICS SWOO;Lo;0;L;;;;;N;;;;; +14FF;CANADIAN SYLLABICS WEST-CREE SWOO;Lo;0;L;;;;;N;;;;; +1500;CANADIAN SYLLABICS SWA;Lo;0;L;;;;;N;;;;; +1501;CANADIAN SYLLABICS WEST-CREE SWA;Lo;0;L;;;;;N;;;;; +1502;CANADIAN SYLLABICS SWAA;Lo;0;L;;;;;N;;;;; +1503;CANADIAN SYLLABICS WEST-CREE SWAA;Lo;0;L;;;;;N;;;;; +1504;CANADIAN SYLLABICS NASKAPI SWAA;Lo;0;L;;;;;N;;;;; +1505;CANADIAN SYLLABICS S;Lo;0;L;;;;;N;;;;; +1506;CANADIAN SYLLABICS ATHAPASCAN S;Lo;0;L;;;;;N;;;;; +1507;CANADIAN SYLLABICS SW;Lo;0;L;;;;;N;;;;; +1508;CANADIAN SYLLABICS BLACKFOOT S;Lo;0;L;;;;;N;;;;; +1509;CANADIAN SYLLABICS MOOSE-CREE SK;Lo;0;L;;;;;N;;;;; +150A;CANADIAN SYLLABICS NASKAPI SKW;Lo;0;L;;;;;N;;;;; +150B;CANADIAN SYLLABICS NASKAPI S-W;Lo;0;L;;;;;N;;;;; +150C;CANADIAN SYLLABICS NASKAPI SPWA;Lo;0;L;;;;;N;;;;; +150D;CANADIAN SYLLABICS NASKAPI STWA;Lo;0;L;;;;;N;;;;; +150E;CANADIAN SYLLABICS NASKAPI SKWA;Lo;0;L;;;;;N;;;;; +150F;CANADIAN SYLLABICS NASKAPI SCWA;Lo;0;L;;;;;N;;;;; +1510;CANADIAN SYLLABICS SHE;Lo;0;L;;;;;N;;;;; +1511;CANADIAN SYLLABICS SHI;Lo;0;L;;;;;N;;;;; +1512;CANADIAN SYLLABICS SHII;Lo;0;L;;;;;N;;;;; +1513;CANADIAN SYLLABICS SHO;Lo;0;L;;;;;N;;;;; +1514;CANADIAN SYLLABICS SHOO;Lo;0;L;;;;;N;;;;; +1515;CANADIAN SYLLABICS SHA;Lo;0;L;;;;;N;;;;; +1516;CANADIAN SYLLABICS SHAA;Lo;0;L;;;;;N;;;;; +1517;CANADIAN SYLLABICS SHWE;Lo;0;L;;;;;N;;;;; +1518;CANADIAN SYLLABICS WEST-CREE SHWE;Lo;0;L;;;;;N;;;;; +1519;CANADIAN SYLLABICS SHWI;Lo;0;L;;;;;N;;;;; +151A;CANADIAN SYLLABICS WEST-CREE SHWI;Lo;0;L;;;;;N;;;;; +151B;CANADIAN SYLLABICS SHWII;Lo;0;L;;;;;N;;;;; +151C;CANADIAN SYLLABICS WEST-CREE SHWII;Lo;0;L;;;;;N;;;;; +151D;CANADIAN SYLLABICS SHWO;Lo;0;L;;;;;N;;;;; +151E;CANADIAN SYLLABICS WEST-CREE SHWO;Lo;0;L;;;;;N;;;;; +151F;CANADIAN SYLLABICS SHWOO;Lo;0;L;;;;;N;;;;; +1520;CANADIAN SYLLABICS WEST-CREE SHWOO;Lo;0;L;;;;;N;;;;; +1521;CANADIAN SYLLABICS SHWA;Lo;0;L;;;;;N;;;;; +1522;CANADIAN SYLLABICS WEST-CREE SHWA;Lo;0;L;;;;;N;;;;; +1523;CANADIAN SYLLABICS SHWAA;Lo;0;L;;;;;N;;;;; +1524;CANADIAN SYLLABICS WEST-CREE SHWAA;Lo;0;L;;;;;N;;;;; +1525;CANADIAN SYLLABICS SH;Lo;0;L;;;;;N;;;;; +1526;CANADIAN SYLLABICS YE;Lo;0;L;;;;;N;;;;; +1527;CANADIAN SYLLABICS YAAI;Lo;0;L;;;;;N;;;;; +1528;CANADIAN SYLLABICS YI;Lo;0;L;;;;;N;;;;; +1529;CANADIAN SYLLABICS YII;Lo;0;L;;;;;N;;;;; +152A;CANADIAN SYLLABICS YO;Lo;0;L;;;;;N;;;;; +152B;CANADIAN SYLLABICS YOO;Lo;0;L;;;;;N;;;;; +152C;CANADIAN SYLLABICS Y-CREE YOO;Lo;0;L;;;;;N;;;;; +152D;CANADIAN SYLLABICS YA;Lo;0;L;;;;;N;;;;; +152E;CANADIAN SYLLABICS YAA;Lo;0;L;;;;;N;;;;; +152F;CANADIAN SYLLABICS YWE;Lo;0;L;;;;;N;;;;; +1530;CANADIAN SYLLABICS WEST-CREE YWE;Lo;0;L;;;;;N;;;;; +1531;CANADIAN SYLLABICS YWI;Lo;0;L;;;;;N;;;;; +1532;CANADIAN SYLLABICS WEST-CREE YWI;Lo;0;L;;;;;N;;;;; +1533;CANADIAN SYLLABICS YWII;Lo;0;L;;;;;N;;;;; +1534;CANADIAN SYLLABICS WEST-CREE YWII;Lo;0;L;;;;;N;;;;; +1535;CANADIAN SYLLABICS YWO;Lo;0;L;;;;;N;;;;; +1536;CANADIAN SYLLABICS WEST-CREE YWO;Lo;0;L;;;;;N;;;;; +1537;CANADIAN SYLLABICS YWOO;Lo;0;L;;;;;N;;;;; +1538;CANADIAN SYLLABICS WEST-CREE YWOO;Lo;0;L;;;;;N;;;;; +1539;CANADIAN SYLLABICS YWA;Lo;0;L;;;;;N;;;;; +153A;CANADIAN SYLLABICS WEST-CREE YWA;Lo;0;L;;;;;N;;;;; +153B;CANADIAN SYLLABICS YWAA;Lo;0;L;;;;;N;;;;; +153C;CANADIAN SYLLABICS WEST-CREE YWAA;Lo;0;L;;;;;N;;;;; +153D;CANADIAN SYLLABICS NASKAPI YWAA;Lo;0;L;;;;;N;;;;; +153E;CANADIAN SYLLABICS Y;Lo;0;L;;;;;N;;;;; +153F;CANADIAN SYLLABICS BIBLE-CREE Y;Lo;0;L;;;;;N;;;;; +1540;CANADIAN SYLLABICS WEST-CREE Y;Lo;0;L;;;;;N;;;;; +1541;CANADIAN SYLLABICS SAYISI YI;Lo;0;L;;;;;N;;;;; +1542;CANADIAN SYLLABICS RE;Lo;0;L;;;;;N;;;;; +1543;CANADIAN SYLLABICS R-CREE RE;Lo;0;L;;;;;N;;;;; +1544;CANADIAN SYLLABICS WEST-CREE LE;Lo;0;L;;;;;N;;;;; +1545;CANADIAN SYLLABICS RAAI;Lo;0;L;;;;;N;;;;; +1546;CANADIAN SYLLABICS RI;Lo;0;L;;;;;N;;;;; +1547;CANADIAN SYLLABICS RII;Lo;0;L;;;;;N;;;;; +1548;CANADIAN SYLLABICS RO;Lo;0;L;;;;;N;;;;; +1549;CANADIAN SYLLABICS ROO;Lo;0;L;;;;;N;;;;; +154A;CANADIAN SYLLABICS WEST-CREE LO;Lo;0;L;;;;;N;;;;; +154B;CANADIAN SYLLABICS RA;Lo;0;L;;;;;N;;;;; +154C;CANADIAN SYLLABICS RAA;Lo;0;L;;;;;N;;;;; +154D;CANADIAN SYLLABICS WEST-CREE LA;Lo;0;L;;;;;N;;;;; +154E;CANADIAN SYLLABICS RWAA;Lo;0;L;;;;;N;;;;; +154F;CANADIAN SYLLABICS WEST-CREE RWAA;Lo;0;L;;;;;N;;;;; +1550;CANADIAN SYLLABICS R;Lo;0;L;;;;;N;;;;; +1551;CANADIAN SYLLABICS WEST-CREE R;Lo;0;L;;;;;N;;;;; +1552;CANADIAN SYLLABICS MEDIAL R;Lo;0;L;;;;;N;;;;; +1553;CANADIAN SYLLABICS FE;Lo;0;L;;;;;N;;;;; +1554;CANADIAN SYLLABICS FAAI;Lo;0;L;;;;;N;;;;; +1555;CANADIAN SYLLABICS FI;Lo;0;L;;;;;N;;;;; +1556;CANADIAN SYLLABICS FII;Lo;0;L;;;;;N;;;;; +1557;CANADIAN SYLLABICS FO;Lo;0;L;;;;;N;;;;; +1558;CANADIAN SYLLABICS FOO;Lo;0;L;;;;;N;;;;; +1559;CANADIAN SYLLABICS FA;Lo;0;L;;;;;N;;;;; +155A;CANADIAN SYLLABICS FAA;Lo;0;L;;;;;N;;;;; +155B;CANADIAN SYLLABICS FWAA;Lo;0;L;;;;;N;;;;; +155C;CANADIAN SYLLABICS WEST-CREE FWAA;Lo;0;L;;;;;N;;;;; +155D;CANADIAN SYLLABICS F;Lo;0;L;;;;;N;;;;; +155E;CANADIAN SYLLABICS THE;Lo;0;L;;;;;N;;;;; +155F;CANADIAN SYLLABICS N-CREE THE;Lo;0;L;;;;;N;;;;; +1560;CANADIAN SYLLABICS THI;Lo;0;L;;;;;N;;;;; +1561;CANADIAN SYLLABICS N-CREE THI;Lo;0;L;;;;;N;;;;; +1562;CANADIAN SYLLABICS THII;Lo;0;L;;;;;N;;;;; +1563;CANADIAN SYLLABICS N-CREE THII;Lo;0;L;;;;;N;;;;; +1564;CANADIAN SYLLABICS THO;Lo;0;L;;;;;N;;;;; +1565;CANADIAN SYLLABICS THOO;Lo;0;L;;;;;N;;;;; +1566;CANADIAN SYLLABICS THA;Lo;0;L;;;;;N;;;;; +1567;CANADIAN SYLLABICS THAA;Lo;0;L;;;;;N;;;;; +1568;CANADIAN SYLLABICS THWAA;Lo;0;L;;;;;N;;;;; +1569;CANADIAN SYLLABICS WEST-CREE THWAA;Lo;0;L;;;;;N;;;;; +156A;CANADIAN SYLLABICS TH;Lo;0;L;;;;;N;;;;; +156B;CANADIAN SYLLABICS TTHE;Lo;0;L;;;;;N;;;;; +156C;CANADIAN SYLLABICS TTHI;Lo;0;L;;;;;N;;;;; +156D;CANADIAN SYLLABICS TTHO;Lo;0;L;;;;;N;;;;; +156E;CANADIAN SYLLABICS TTHA;Lo;0;L;;;;;N;;;;; +156F;CANADIAN SYLLABICS TTH;Lo;0;L;;;;;N;;;;; +1570;CANADIAN SYLLABICS TYE;Lo;0;L;;;;;N;;;;; +1571;CANADIAN SYLLABICS TYI;Lo;0;L;;;;;N;;;;; +1572;CANADIAN SYLLABICS TYO;Lo;0;L;;;;;N;;;;; +1573;CANADIAN SYLLABICS TYA;Lo;0;L;;;;;N;;;;; +1574;CANADIAN SYLLABICS NUNAVIK HE;Lo;0;L;;;;;N;;;;; +1575;CANADIAN SYLLABICS NUNAVIK HI;Lo;0;L;;;;;N;;;;; +1576;CANADIAN SYLLABICS NUNAVIK HII;Lo;0;L;;;;;N;;;;; +1577;CANADIAN SYLLABICS NUNAVIK HO;Lo;0;L;;;;;N;;;;; +1578;CANADIAN SYLLABICS NUNAVIK HOO;Lo;0;L;;;;;N;;;;; +1579;CANADIAN SYLLABICS NUNAVIK HA;Lo;0;L;;;;;N;;;;; +157A;CANADIAN SYLLABICS NUNAVIK HAA;Lo;0;L;;;;;N;;;;; +157B;CANADIAN SYLLABICS NUNAVIK H;Lo;0;L;;;;;N;;;;; +157C;CANADIAN SYLLABICS NUNAVUT H;Lo;0;L;;;;;N;;;;; +157D;CANADIAN SYLLABICS HK;Lo;0;L;;;;;N;;;;; +157E;CANADIAN SYLLABICS QAAI;Lo;0;L;;;;;N;;;;; +157F;CANADIAN SYLLABICS QI;Lo;0;L;;;;;N;;;;; +1580;CANADIAN SYLLABICS QII;Lo;0;L;;;;;N;;;;; +1581;CANADIAN SYLLABICS QO;Lo;0;L;;;;;N;;;;; +1582;CANADIAN SYLLABICS QOO;Lo;0;L;;;;;N;;;;; +1583;CANADIAN SYLLABICS QA;Lo;0;L;;;;;N;;;;; +1584;CANADIAN SYLLABICS QAA;Lo;0;L;;;;;N;;;;; +1585;CANADIAN SYLLABICS Q;Lo;0;L;;;;;N;;;;; +1586;CANADIAN SYLLABICS TLHE;Lo;0;L;;;;;N;;;;; +1587;CANADIAN SYLLABICS TLHI;Lo;0;L;;;;;N;;;;; +1588;CANADIAN SYLLABICS TLHO;Lo;0;L;;;;;N;;;;; +1589;CANADIAN SYLLABICS TLHA;Lo;0;L;;;;;N;;;;; +158A;CANADIAN SYLLABICS WEST-CREE RE;Lo;0;L;;;;;N;;;;; +158B;CANADIAN SYLLABICS WEST-CREE RI;Lo;0;L;;;;;N;;;;; +158C;CANADIAN SYLLABICS WEST-CREE RO;Lo;0;L;;;;;N;;;;; +158D;CANADIAN SYLLABICS WEST-CREE RA;Lo;0;L;;;;;N;;;;; +158E;CANADIAN SYLLABICS NGAAI;Lo;0;L;;;;;N;;;;; +158F;CANADIAN SYLLABICS NGI;Lo;0;L;;;;;N;;;;; +1590;CANADIAN SYLLABICS NGII;Lo;0;L;;;;;N;;;;; +1591;CANADIAN SYLLABICS NGO;Lo;0;L;;;;;N;;;;; +1592;CANADIAN SYLLABICS NGOO;Lo;0;L;;;;;N;;;;; +1593;CANADIAN SYLLABICS NGA;Lo;0;L;;;;;N;;;;; +1594;CANADIAN SYLLABICS NGAA;Lo;0;L;;;;;N;;;;; +1595;CANADIAN SYLLABICS NG;Lo;0;L;;;;;N;;;;; +1596;CANADIAN SYLLABICS NNG;Lo;0;L;;;;;N;;;;; +1597;CANADIAN SYLLABICS SAYISI SHE;Lo;0;L;;;;;N;;;;; +1598;CANADIAN SYLLABICS SAYISI SHI;Lo;0;L;;;;;N;;;;; +1599;CANADIAN SYLLABICS SAYISI SHO;Lo;0;L;;;;;N;;;;; +159A;CANADIAN SYLLABICS SAYISI SHA;Lo;0;L;;;;;N;;;;; +159B;CANADIAN SYLLABICS WOODS-CREE THE;Lo;0;L;;;;;N;;;;; +159C;CANADIAN SYLLABICS WOODS-CREE THI;Lo;0;L;;;;;N;;;;; +159D;CANADIAN SYLLABICS WOODS-CREE THO;Lo;0;L;;;;;N;;;;; +159E;CANADIAN SYLLABICS WOODS-CREE THA;Lo;0;L;;;;;N;;;;; +159F;CANADIAN SYLLABICS WOODS-CREE TH;Lo;0;L;;;;;N;;;;; +15A0;CANADIAN SYLLABICS LHI;Lo;0;L;;;;;N;;;;; +15A1;CANADIAN SYLLABICS LHII;Lo;0;L;;;;;N;;;;; +15A2;CANADIAN SYLLABICS LHO;Lo;0;L;;;;;N;;;;; +15A3;CANADIAN SYLLABICS LHOO;Lo;0;L;;;;;N;;;;; +15A4;CANADIAN SYLLABICS LHA;Lo;0;L;;;;;N;;;;; +15A5;CANADIAN SYLLABICS LHAA;Lo;0;L;;;;;N;;;;; +15A6;CANADIAN SYLLABICS LH;Lo;0;L;;;;;N;;;;; +15A7;CANADIAN SYLLABICS TH-CREE THE;Lo;0;L;;;;;N;;;;; +15A8;CANADIAN SYLLABICS TH-CREE THI;Lo;0;L;;;;;N;;;;; +15A9;CANADIAN SYLLABICS TH-CREE THII;Lo;0;L;;;;;N;;;;; +15AA;CANADIAN SYLLABICS TH-CREE THO;Lo;0;L;;;;;N;;;;; +15AB;CANADIAN SYLLABICS TH-CREE THOO;Lo;0;L;;;;;N;;;;; +15AC;CANADIAN SYLLABICS TH-CREE THA;Lo;0;L;;;;;N;;;;; +15AD;CANADIAN SYLLABICS TH-CREE THAA;Lo;0;L;;;;;N;;;;; +15AE;CANADIAN SYLLABICS TH-CREE TH;Lo;0;L;;;;;N;;;;; +15AF;CANADIAN SYLLABICS AIVILIK B;Lo;0;L;;;;;N;;;;; +15B0;CANADIAN SYLLABICS BLACKFOOT E;Lo;0;L;;;;;N;;;;; +15B1;CANADIAN SYLLABICS BLACKFOOT I;Lo;0;L;;;;;N;;;;; +15B2;CANADIAN SYLLABICS BLACKFOOT O;Lo;0;L;;;;;N;;;;; +15B3;CANADIAN SYLLABICS BLACKFOOT A;Lo;0;L;;;;;N;;;;; +15B4;CANADIAN SYLLABICS BLACKFOOT WE;Lo;0;L;;;;;N;;;;; +15B5;CANADIAN SYLLABICS BLACKFOOT WI;Lo;0;L;;;;;N;;;;; +15B6;CANADIAN SYLLABICS BLACKFOOT WO;Lo;0;L;;;;;N;;;;; +15B7;CANADIAN SYLLABICS BLACKFOOT WA;Lo;0;L;;;;;N;;;;; +15B8;CANADIAN SYLLABICS BLACKFOOT NE;Lo;0;L;;;;;N;;;;; +15B9;CANADIAN SYLLABICS BLACKFOOT NI;Lo;0;L;;;;;N;;;;; +15BA;CANADIAN SYLLABICS BLACKFOOT NO;Lo;0;L;;;;;N;;;;; +15BB;CANADIAN SYLLABICS BLACKFOOT NA;Lo;0;L;;;;;N;;;;; +15BC;CANADIAN SYLLABICS BLACKFOOT KE;Lo;0;L;;;;;N;;;;; +15BD;CANADIAN SYLLABICS BLACKFOOT KI;Lo;0;L;;;;;N;;;;; +15BE;CANADIAN SYLLABICS BLACKFOOT KO;Lo;0;L;;;;;N;;;;; +15BF;CANADIAN SYLLABICS BLACKFOOT KA;Lo;0;L;;;;;N;;;;; +15C0;CANADIAN SYLLABICS SAYISI HE;Lo;0;L;;;;;N;;;;; +15C1;CANADIAN SYLLABICS SAYISI HI;Lo;0;L;;;;;N;;;;; +15C2;CANADIAN SYLLABICS SAYISI HO;Lo;0;L;;;;;N;;;;; +15C3;CANADIAN SYLLABICS SAYISI HA;Lo;0;L;;;;;N;;;;; +15C4;CANADIAN SYLLABICS CARRIER GHU;Lo;0;L;;;;;N;;;;; +15C5;CANADIAN SYLLABICS CARRIER GHO;Lo;0;L;;;;;N;;;;; +15C6;CANADIAN SYLLABICS CARRIER GHE;Lo;0;L;;;;;N;;;;; +15C7;CANADIAN SYLLABICS CARRIER GHEE;Lo;0;L;;;;;N;;;;; +15C8;CANADIAN SYLLABICS CARRIER GHI;Lo;0;L;;;;;N;;;;; +15C9;CANADIAN SYLLABICS CARRIER GHA;Lo;0;L;;;;;N;;;;; +15CA;CANADIAN SYLLABICS CARRIER RU;Lo;0;L;;;;;N;;;;; +15CB;CANADIAN SYLLABICS CARRIER RO;Lo;0;L;;;;;N;;;;; +15CC;CANADIAN SYLLABICS CARRIER RE;Lo;0;L;;;;;N;;;;; +15CD;CANADIAN SYLLABICS CARRIER REE;Lo;0;L;;;;;N;;;;; +15CE;CANADIAN SYLLABICS CARRIER RI;Lo;0;L;;;;;N;;;;; +15CF;CANADIAN SYLLABICS CARRIER RA;Lo;0;L;;;;;N;;;;; +15D0;CANADIAN SYLLABICS CARRIER WU;Lo;0;L;;;;;N;;;;; +15D1;CANADIAN SYLLABICS CARRIER WO;Lo;0;L;;;;;N;;;;; +15D2;CANADIAN SYLLABICS CARRIER WE;Lo;0;L;;;;;N;;;;; +15D3;CANADIAN SYLLABICS CARRIER WEE;Lo;0;L;;;;;N;;;;; +15D4;CANADIAN SYLLABICS CARRIER WI;Lo;0;L;;;;;N;;;;; +15D5;CANADIAN SYLLABICS CARRIER WA;Lo;0;L;;;;;N;;;;; +15D6;CANADIAN SYLLABICS CARRIER HWU;Lo;0;L;;;;;N;;;;; +15D7;CANADIAN SYLLABICS CARRIER HWO;Lo;0;L;;;;;N;;;;; +15D8;CANADIAN SYLLABICS CARRIER HWE;Lo;0;L;;;;;N;;;;; +15D9;CANADIAN SYLLABICS CARRIER HWEE;Lo;0;L;;;;;N;;;;; +15DA;CANADIAN SYLLABICS CARRIER HWI;Lo;0;L;;;;;N;;;;; +15DB;CANADIAN SYLLABICS CARRIER HWA;Lo;0;L;;;;;N;;;;; +15DC;CANADIAN SYLLABICS CARRIER THU;Lo;0;L;;;;;N;;;;; +15DD;CANADIAN SYLLABICS CARRIER THO;Lo;0;L;;;;;N;;;;; +15DE;CANADIAN SYLLABICS CARRIER THE;Lo;0;L;;;;;N;;;;; +15DF;CANADIAN SYLLABICS CARRIER THEE;Lo;0;L;;;;;N;;;;; +15E0;CANADIAN SYLLABICS CARRIER THI;Lo;0;L;;;;;N;;;;; +15E1;CANADIAN SYLLABICS CARRIER THA;Lo;0;L;;;;;N;;;;; +15E2;CANADIAN SYLLABICS CARRIER TTU;Lo;0;L;;;;;N;;;;; +15E3;CANADIAN SYLLABICS CARRIER TTO;Lo;0;L;;;;;N;;;;; +15E4;CANADIAN SYLLABICS CARRIER TTE;Lo;0;L;;;;;N;;;;; +15E5;CANADIAN SYLLABICS CARRIER TTEE;Lo;0;L;;;;;N;;;;; +15E6;CANADIAN SYLLABICS CARRIER TTI;Lo;0;L;;;;;N;;;;; +15E7;CANADIAN SYLLABICS CARRIER TTA;Lo;0;L;;;;;N;;;;; +15E8;CANADIAN SYLLABICS CARRIER PU;Lo;0;L;;;;;N;;;;; +15E9;CANADIAN SYLLABICS CARRIER PO;Lo;0;L;;;;;N;;;;; +15EA;CANADIAN SYLLABICS CARRIER PE;Lo;0;L;;;;;N;;;;; +15EB;CANADIAN SYLLABICS CARRIER PEE;Lo;0;L;;;;;N;;;;; +15EC;CANADIAN SYLLABICS CARRIER PI;Lo;0;L;;;;;N;;;;; +15ED;CANADIAN SYLLABICS CARRIER PA;Lo;0;L;;;;;N;;;;; +15EE;CANADIAN SYLLABICS CARRIER P;Lo;0;L;;;;;N;;;;; +15EF;CANADIAN SYLLABICS CARRIER GU;Lo;0;L;;;;;N;;;;; +15F0;CANADIAN SYLLABICS CARRIER GO;Lo;0;L;;;;;N;;;;; +15F1;CANADIAN SYLLABICS CARRIER GE;Lo;0;L;;;;;N;;;;; +15F2;CANADIAN SYLLABICS CARRIER GEE;Lo;0;L;;;;;N;;;;; +15F3;CANADIAN SYLLABICS CARRIER GI;Lo;0;L;;;;;N;;;;; +15F4;CANADIAN SYLLABICS CARRIER GA;Lo;0;L;;;;;N;;;;; +15F5;CANADIAN SYLLABICS CARRIER KHU;Lo;0;L;;;;;N;;;;; +15F6;CANADIAN SYLLABICS CARRIER KHO;Lo;0;L;;;;;N;;;;; +15F7;CANADIAN SYLLABICS CARRIER KHE;Lo;0;L;;;;;N;;;;; +15F8;CANADIAN SYLLABICS CARRIER KHEE;Lo;0;L;;;;;N;;;;; +15F9;CANADIAN SYLLABICS CARRIER KHI;Lo;0;L;;;;;N;;;;; +15FA;CANADIAN SYLLABICS CARRIER KHA;Lo;0;L;;;;;N;;;;; +15FB;CANADIAN SYLLABICS CARRIER KKU;Lo;0;L;;;;;N;;;;; +15FC;CANADIAN SYLLABICS CARRIER KKO;Lo;0;L;;;;;N;;;;; +15FD;CANADIAN SYLLABICS CARRIER KKE;Lo;0;L;;;;;N;;;;; +15FE;CANADIAN SYLLABICS CARRIER KKEE;Lo;0;L;;;;;N;;;;; +15FF;CANADIAN SYLLABICS CARRIER KKI;Lo;0;L;;;;;N;;;;; +1600;CANADIAN SYLLABICS CARRIER KKA;Lo;0;L;;;;;N;;;;; +1601;CANADIAN SYLLABICS CARRIER KK;Lo;0;L;;;;;N;;;;; +1602;CANADIAN SYLLABICS CARRIER NU;Lo;0;L;;;;;N;;;;; +1603;CANADIAN SYLLABICS CARRIER NO;Lo;0;L;;;;;N;;;;; +1604;CANADIAN SYLLABICS CARRIER NE;Lo;0;L;;;;;N;;;;; +1605;CANADIAN SYLLABICS CARRIER NEE;Lo;0;L;;;;;N;;;;; +1606;CANADIAN SYLLABICS CARRIER NI;Lo;0;L;;;;;N;;;;; +1607;CANADIAN SYLLABICS CARRIER NA;Lo;0;L;;;;;N;;;;; +1608;CANADIAN SYLLABICS CARRIER MU;Lo;0;L;;;;;N;;;;; +1609;CANADIAN SYLLABICS CARRIER MO;Lo;0;L;;;;;N;;;;; +160A;CANADIAN SYLLABICS CARRIER ME;Lo;0;L;;;;;N;;;;; +160B;CANADIAN SYLLABICS CARRIER MEE;Lo;0;L;;;;;N;;;;; +160C;CANADIAN SYLLABICS CARRIER MI;Lo;0;L;;;;;N;;;;; +160D;CANADIAN SYLLABICS CARRIER MA;Lo;0;L;;;;;N;;;;; +160E;CANADIAN SYLLABICS CARRIER YU;Lo;0;L;;;;;N;;;;; +160F;CANADIAN SYLLABICS CARRIER YO;Lo;0;L;;;;;N;;;;; +1610;CANADIAN SYLLABICS CARRIER YE;Lo;0;L;;;;;N;;;;; +1611;CANADIAN SYLLABICS CARRIER YEE;Lo;0;L;;;;;N;;;;; +1612;CANADIAN SYLLABICS CARRIER YI;Lo;0;L;;;;;N;;;;; +1613;CANADIAN SYLLABICS CARRIER YA;Lo;0;L;;;;;N;;;;; +1614;CANADIAN SYLLABICS CARRIER JU;Lo;0;L;;;;;N;;;;; +1615;CANADIAN SYLLABICS SAYISI JU;Lo;0;L;;;;;N;;;;; +1616;CANADIAN SYLLABICS CARRIER JO;Lo;0;L;;;;;N;;;;; +1617;CANADIAN SYLLABICS CARRIER JE;Lo;0;L;;;;;N;;;;; +1618;CANADIAN SYLLABICS CARRIER JEE;Lo;0;L;;;;;N;;;;; +1619;CANADIAN SYLLABICS CARRIER JI;Lo;0;L;;;;;N;;;;; +161A;CANADIAN SYLLABICS SAYISI JI;Lo;0;L;;;;;N;;;;; +161B;CANADIAN SYLLABICS CARRIER JA;Lo;0;L;;;;;N;;;;; +161C;CANADIAN SYLLABICS CARRIER JJU;Lo;0;L;;;;;N;;;;; +161D;CANADIAN SYLLABICS CARRIER JJO;Lo;0;L;;;;;N;;;;; +161E;CANADIAN SYLLABICS CARRIER JJE;Lo;0;L;;;;;N;;;;; +161F;CANADIAN SYLLABICS CARRIER JJEE;Lo;0;L;;;;;N;;;;; +1620;CANADIAN SYLLABICS CARRIER JJI;Lo;0;L;;;;;N;;;;; +1621;CANADIAN SYLLABICS CARRIER JJA;Lo;0;L;;;;;N;;;;; +1622;CANADIAN SYLLABICS CARRIER LU;Lo;0;L;;;;;N;;;;; +1623;CANADIAN SYLLABICS CARRIER LO;Lo;0;L;;;;;N;;;;; +1624;CANADIAN SYLLABICS CARRIER LE;Lo;0;L;;;;;N;;;;; +1625;CANADIAN SYLLABICS CARRIER LEE;Lo;0;L;;;;;N;;;;; +1626;CANADIAN SYLLABICS CARRIER LI;Lo;0;L;;;;;N;;;;; +1627;CANADIAN SYLLABICS CARRIER LA;Lo;0;L;;;;;N;;;;; +1628;CANADIAN SYLLABICS CARRIER DLU;Lo;0;L;;;;;N;;;;; +1629;CANADIAN SYLLABICS CARRIER DLO;Lo;0;L;;;;;N;;;;; +162A;CANADIAN SYLLABICS CARRIER DLE;Lo;0;L;;;;;N;;;;; +162B;CANADIAN SYLLABICS CARRIER DLEE;Lo;0;L;;;;;N;;;;; +162C;CANADIAN SYLLABICS CARRIER DLI;Lo;0;L;;;;;N;;;;; +162D;CANADIAN SYLLABICS CARRIER DLA;Lo;0;L;;;;;N;;;;; +162E;CANADIAN SYLLABICS CARRIER LHU;Lo;0;L;;;;;N;;;;; +162F;CANADIAN SYLLABICS CARRIER LHO;Lo;0;L;;;;;N;;;;; +1630;CANADIAN SYLLABICS CARRIER LHE;Lo;0;L;;;;;N;;;;; +1631;CANADIAN SYLLABICS CARRIER LHEE;Lo;0;L;;;;;N;;;;; +1632;CANADIAN SYLLABICS CARRIER LHI;Lo;0;L;;;;;N;;;;; +1633;CANADIAN SYLLABICS CARRIER LHA;Lo;0;L;;;;;N;;;;; +1634;CANADIAN SYLLABICS CARRIER TLHU;Lo;0;L;;;;;N;;;;; +1635;CANADIAN SYLLABICS CARRIER TLHO;Lo;0;L;;;;;N;;;;; +1636;CANADIAN SYLLABICS CARRIER TLHE;Lo;0;L;;;;;N;;;;; +1637;CANADIAN SYLLABICS CARRIER TLHEE;Lo;0;L;;;;;N;;;;; +1638;CANADIAN SYLLABICS CARRIER TLHI;Lo;0;L;;;;;N;;;;; +1639;CANADIAN SYLLABICS CARRIER TLHA;Lo;0;L;;;;;N;;;;; +163A;CANADIAN SYLLABICS CARRIER TLU;Lo;0;L;;;;;N;;;;; +163B;CANADIAN SYLLABICS CARRIER TLO;Lo;0;L;;;;;N;;;;; +163C;CANADIAN SYLLABICS CARRIER TLE;Lo;0;L;;;;;N;;;;; +163D;CANADIAN SYLLABICS CARRIER TLEE;Lo;0;L;;;;;N;;;;; +163E;CANADIAN SYLLABICS CARRIER TLI;Lo;0;L;;;;;N;;;;; +163F;CANADIAN SYLLABICS CARRIER TLA;Lo;0;L;;;;;N;;;;; +1640;CANADIAN SYLLABICS CARRIER ZU;Lo;0;L;;;;;N;;;;; +1641;CANADIAN SYLLABICS CARRIER ZO;Lo;0;L;;;;;N;;;;; +1642;CANADIAN SYLLABICS CARRIER ZE;Lo;0;L;;;;;N;;;;; +1643;CANADIAN SYLLABICS CARRIER ZEE;Lo;0;L;;;;;N;;;;; +1644;CANADIAN SYLLABICS CARRIER ZI;Lo;0;L;;;;;N;;;;; +1645;CANADIAN SYLLABICS CARRIER ZA;Lo;0;L;;;;;N;;;;; +1646;CANADIAN SYLLABICS CARRIER Z;Lo;0;L;;;;;N;;;;; +1647;CANADIAN SYLLABICS CARRIER INITIAL Z;Lo;0;L;;;;;N;;;;; +1648;CANADIAN SYLLABICS CARRIER DZU;Lo;0;L;;;;;N;;;;; +1649;CANADIAN SYLLABICS CARRIER DZO;Lo;0;L;;;;;N;;;;; +164A;CANADIAN SYLLABICS CARRIER DZE;Lo;0;L;;;;;N;;;;; +164B;CANADIAN SYLLABICS CARRIER DZEE;Lo;0;L;;;;;N;;;;; +164C;CANADIAN SYLLABICS CARRIER DZI;Lo;0;L;;;;;N;;;;; +164D;CANADIAN SYLLABICS CARRIER DZA;Lo;0;L;;;;;N;;;;; +164E;CANADIAN SYLLABICS CARRIER SU;Lo;0;L;;;;;N;;;;; +164F;CANADIAN SYLLABICS CARRIER SO;Lo;0;L;;;;;N;;;;; +1650;CANADIAN SYLLABICS CARRIER SE;Lo;0;L;;;;;N;;;;; +1651;CANADIAN SYLLABICS CARRIER SEE;Lo;0;L;;;;;N;;;;; +1652;CANADIAN SYLLABICS CARRIER SI;Lo;0;L;;;;;N;;;;; +1653;CANADIAN SYLLABICS CARRIER SA;Lo;0;L;;;;;N;;;;; +1654;CANADIAN SYLLABICS CARRIER SHU;Lo;0;L;;;;;N;;;;; +1655;CANADIAN SYLLABICS CARRIER SHO;Lo;0;L;;;;;N;;;;; +1656;CANADIAN SYLLABICS CARRIER SHE;Lo;0;L;;;;;N;;;;; +1657;CANADIAN SYLLABICS CARRIER SHEE;Lo;0;L;;;;;N;;;;; +1658;CANADIAN SYLLABICS CARRIER SHI;Lo;0;L;;;;;N;;;;; +1659;CANADIAN SYLLABICS CARRIER SHA;Lo;0;L;;;;;N;;;;; +165A;CANADIAN SYLLABICS CARRIER SH;Lo;0;L;;;;;N;;;;; +165B;CANADIAN SYLLABICS CARRIER TSU;Lo;0;L;;;;;N;;;;; +165C;CANADIAN SYLLABICS CARRIER TSO;Lo;0;L;;;;;N;;;;; +165D;CANADIAN SYLLABICS CARRIER TSE;Lo;0;L;;;;;N;;;;; +165E;CANADIAN SYLLABICS CARRIER TSEE;Lo;0;L;;;;;N;;;;; +165F;CANADIAN SYLLABICS CARRIER TSI;Lo;0;L;;;;;N;;;;; +1660;CANADIAN SYLLABICS CARRIER TSA;Lo;0;L;;;;;N;;;;; +1661;CANADIAN SYLLABICS CARRIER CHU;Lo;0;L;;;;;N;;;;; +1662;CANADIAN SYLLABICS CARRIER CHO;Lo;0;L;;;;;N;;;;; +1663;CANADIAN SYLLABICS CARRIER CHE;Lo;0;L;;;;;N;;;;; +1664;CANADIAN SYLLABICS CARRIER CHEE;Lo;0;L;;;;;N;;;;; +1665;CANADIAN SYLLABICS CARRIER CHI;Lo;0;L;;;;;N;;;;; +1666;CANADIAN SYLLABICS CARRIER CHA;Lo;0;L;;;;;N;;;;; +1667;CANADIAN SYLLABICS CARRIER TTSU;Lo;0;L;;;;;N;;;;; +1668;CANADIAN SYLLABICS CARRIER TTSO;Lo;0;L;;;;;N;;;;; +1669;CANADIAN SYLLABICS CARRIER TTSE;Lo;0;L;;;;;N;;;;; +166A;CANADIAN SYLLABICS CARRIER TTSEE;Lo;0;L;;;;;N;;;;; +166B;CANADIAN SYLLABICS CARRIER TTSI;Lo;0;L;;;;;N;;;;; +166C;CANADIAN SYLLABICS CARRIER TTSA;Lo;0;L;;;;;N;;;;; +166D;CANADIAN SYLLABICS CHI SIGN;Po;0;L;;;;;N;;;;; +166E;CANADIAN SYLLABICS FULL STOP;Po;0;L;;;;;N;;;;; +166F;CANADIAN SYLLABICS QAI;Lo;0;L;;;;;N;;;;; +1670;CANADIAN SYLLABICS NGAI;Lo;0;L;;;;;N;;;;; +1671;CANADIAN SYLLABICS NNGI;Lo;0;L;;;;;N;;;;; +1672;CANADIAN SYLLABICS NNGII;Lo;0;L;;;;;N;;;;; +1673;CANADIAN SYLLABICS NNGO;Lo;0;L;;;;;N;;;;; +1674;CANADIAN SYLLABICS NNGOO;Lo;0;L;;;;;N;;;;; +1675;CANADIAN SYLLABICS NNGA;Lo;0;L;;;;;N;;;;; +1676;CANADIAN SYLLABICS NNGAA;Lo;0;L;;;;;N;;;;; +1677;CANADIAN SYLLABICS WOODS-CREE THWEE;Lo;0;L;;;;;N;;;;; +1678;CANADIAN SYLLABICS WOODS-CREE THWI;Lo;0;L;;;;;N;;;;; +1679;CANADIAN SYLLABICS WOODS-CREE THWII;Lo;0;L;;;;;N;;;;; +167A;CANADIAN SYLLABICS WOODS-CREE THWO;Lo;0;L;;;;;N;;;;; +167B;CANADIAN SYLLABICS WOODS-CREE THWOO;Lo;0;L;;;;;N;;;;; +167C;CANADIAN SYLLABICS WOODS-CREE THWA;Lo;0;L;;;;;N;;;;; +167D;CANADIAN SYLLABICS WOODS-CREE THWAA;Lo;0;L;;;;;N;;;;; +167E;CANADIAN SYLLABICS WOODS-CREE FINAL TH;Lo;0;L;;;;;N;;;;; +167F;CANADIAN SYLLABICS BLACKFOOT W;Lo;0;L;;;;;N;;;;; +1680;OGHAM SPACE MARK;Zs;0;WS;;;;;N;;;;; +1681;OGHAM LETTER BEITH;Lo;0;L;;;;;N;;;;; +1682;OGHAM LETTER LUIS;Lo;0;L;;;;;N;;;;; +1683;OGHAM LETTER FEARN;Lo;0;L;;;;;N;;;;; +1684;OGHAM LETTER SAIL;Lo;0;L;;;;;N;;;;; +1685;OGHAM LETTER NION;Lo;0;L;;;;;N;;;;; +1686;OGHAM LETTER UATH;Lo;0;L;;;;;N;;;;; +1687;OGHAM LETTER DAIR;Lo;0;L;;;;;N;;;;; +1688;OGHAM LETTER TINNE;Lo;0;L;;;;;N;;;;; +1689;OGHAM LETTER COLL;Lo;0;L;;;;;N;;;;; +168A;OGHAM LETTER CEIRT;Lo;0;L;;;;;N;;;;; +168B;OGHAM LETTER MUIN;Lo;0;L;;;;;N;;;;; +168C;OGHAM LETTER GORT;Lo;0;L;;;;;N;;;;; +168D;OGHAM LETTER NGEADAL;Lo;0;L;;;;;N;;;;; +168E;OGHAM LETTER STRAIF;Lo;0;L;;;;;N;;;;; +168F;OGHAM LETTER RUIS;Lo;0;L;;;;;N;;;;; +1690;OGHAM LETTER AILM;Lo;0;L;;;;;N;;;;; +1691;OGHAM LETTER ONN;Lo;0;L;;;;;N;;;;; +1692;OGHAM LETTER UR;Lo;0;L;;;;;N;;;;; +1693;OGHAM LETTER EADHADH;Lo;0;L;;;;;N;;;;; +1694;OGHAM LETTER IODHADH;Lo;0;L;;;;;N;;;;; +1695;OGHAM LETTER EABHADH;Lo;0;L;;;;;N;;;;; +1696;OGHAM LETTER OR;Lo;0;L;;;;;N;;;;; +1697;OGHAM LETTER UILLEANN;Lo;0;L;;;;;N;;;;; +1698;OGHAM LETTER IFIN;Lo;0;L;;;;;N;;;;; +1699;OGHAM LETTER EAMHANCHOLL;Lo;0;L;;;;;N;;;;; +169A;OGHAM LETTER PEITH;Lo;0;L;;;;;N;;;;; +169B;OGHAM FEATHER MARK;Ps;0;ON;;;;;Y;;;;; +169C;OGHAM REVERSED FEATHER MARK;Pe;0;ON;;;;;Y;;;;; +16A0;RUNIC LETTER FEHU FEOH FE F;Lo;0;L;;;;;N;;;;; +16A1;RUNIC LETTER V;Lo;0;L;;;;;N;;;;; +16A2;RUNIC LETTER URUZ UR U;Lo;0;L;;;;;N;;;;; +16A3;RUNIC LETTER YR;Lo;0;L;;;;;N;;;;; +16A4;RUNIC LETTER Y;Lo;0;L;;;;;N;;;;; +16A5;RUNIC LETTER W;Lo;0;L;;;;;N;;;;; +16A6;RUNIC LETTER THURISAZ THURS THORN;Lo;0;L;;;;;N;;;;; +16A7;RUNIC LETTER ETH;Lo;0;L;;;;;N;;;;; +16A8;RUNIC LETTER ANSUZ A;Lo;0;L;;;;;N;;;;; +16A9;RUNIC LETTER OS O;Lo;0;L;;;;;N;;;;; +16AA;RUNIC LETTER AC A;Lo;0;L;;;;;N;;;;; +16AB;RUNIC LETTER AESC;Lo;0;L;;;;;N;;;;; +16AC;RUNIC LETTER LONG-BRANCH-OSS O;Lo;0;L;;;;;N;;;;; +16AD;RUNIC LETTER SHORT-TWIG-OSS O;Lo;0;L;;;;;N;;;;; +16AE;RUNIC LETTER O;Lo;0;L;;;;;N;;;;; +16AF;RUNIC LETTER OE;Lo;0;L;;;;;N;;;;; +16B0;RUNIC LETTER ON;Lo;0;L;;;;;N;;;;; +16B1;RUNIC LETTER RAIDO RAD REID R;Lo;0;L;;;;;N;;;;; +16B2;RUNIC LETTER KAUNA;Lo;0;L;;;;;N;;;;; +16B3;RUNIC LETTER CEN;Lo;0;L;;;;;N;;;;; +16B4;RUNIC LETTER KAUN K;Lo;0;L;;;;;N;;;;; +16B5;RUNIC LETTER G;Lo;0;L;;;;;N;;;;; +16B6;RUNIC LETTER ENG;Lo;0;L;;;;;N;;;;; +16B7;RUNIC LETTER GEBO GYFU G;Lo;0;L;;;;;N;;;;; +16B8;RUNIC LETTER GAR;Lo;0;L;;;;;N;;;;; +16B9;RUNIC LETTER WUNJO WYNN W;Lo;0;L;;;;;N;;;;; +16BA;RUNIC LETTER HAGLAZ H;Lo;0;L;;;;;N;;;;; +16BB;RUNIC LETTER HAEGL H;Lo;0;L;;;;;N;;;;; +16BC;RUNIC LETTER LONG-BRANCH-HAGALL H;Lo;0;L;;;;;N;;;;; +16BD;RUNIC LETTER SHORT-TWIG-HAGALL H;Lo;0;L;;;;;N;;;;; +16BE;RUNIC LETTER NAUDIZ NYD NAUD N;Lo;0;L;;;;;N;;;;; +16BF;RUNIC LETTER SHORT-TWIG-NAUD N;Lo;0;L;;;;;N;;;;; +16C0;RUNIC LETTER DOTTED-N;Lo;0;L;;;;;N;;;;; +16C1;RUNIC LETTER ISAZ IS ISS I;Lo;0;L;;;;;N;;;;; +16C2;RUNIC LETTER E;Lo;0;L;;;;;N;;;;; +16C3;RUNIC LETTER JERAN J;Lo;0;L;;;;;N;;;;; +16C4;RUNIC LETTER GER;Lo;0;L;;;;;N;;;;; +16C5;RUNIC LETTER LONG-BRANCH-AR AE;Lo;0;L;;;;;N;;;;; +16C6;RUNIC LETTER SHORT-TWIG-AR A;Lo;0;L;;;;;N;;;;; +16C7;RUNIC LETTER IWAZ EOH;Lo;0;L;;;;;N;;;;; +16C8;RUNIC LETTER PERTHO PEORTH P;Lo;0;L;;;;;N;;;;; +16C9;RUNIC LETTER ALGIZ EOLHX;Lo;0;L;;;;;N;;;;; +16CA;RUNIC LETTER SOWILO S;Lo;0;L;;;;;N;;;;; +16CB;RUNIC LETTER SIGEL LONG-BRANCH-SOL S;Lo;0;L;;;;;N;;;;; +16CC;RUNIC LETTER SHORT-TWIG-SOL S;Lo;0;L;;;;;N;;;;; +16CD;RUNIC LETTER C;Lo;0;L;;;;;N;;;;; +16CE;RUNIC LETTER Z;Lo;0;L;;;;;N;;;;; +16CF;RUNIC LETTER TIWAZ TIR TYR T;Lo;0;L;;;;;N;;;;; +16D0;RUNIC LETTER SHORT-TWIG-TYR T;Lo;0;L;;;;;N;;;;; +16D1;RUNIC LETTER D;Lo;0;L;;;;;N;;;;; +16D2;RUNIC LETTER BERKANAN BEORC BJARKAN B;Lo;0;L;;;;;N;;;;; +16D3;RUNIC LETTER SHORT-TWIG-BJARKAN B;Lo;0;L;;;;;N;;;;; +16D4;RUNIC LETTER DOTTED-P;Lo;0;L;;;;;N;;;;; +16D5;RUNIC LETTER OPEN-P;Lo;0;L;;;;;N;;;;; +16D6;RUNIC LETTER EHWAZ EH E;Lo;0;L;;;;;N;;;;; +16D7;RUNIC LETTER MANNAZ MAN M;Lo;0;L;;;;;N;;;;; +16D8;RUNIC LETTER LONG-BRANCH-MADR M;Lo;0;L;;;;;N;;;;; +16D9;RUNIC LETTER SHORT-TWIG-MADR M;Lo;0;L;;;;;N;;;;; +16DA;RUNIC LETTER LAUKAZ LAGU LOGR L;Lo;0;L;;;;;N;;;;; +16DB;RUNIC LETTER DOTTED-L;Lo;0;L;;;;;N;;;;; +16DC;RUNIC LETTER INGWAZ;Lo;0;L;;;;;N;;;;; +16DD;RUNIC LETTER ING;Lo;0;L;;;;;N;;;;; +16DE;RUNIC LETTER DAGAZ DAEG D;Lo;0;L;;;;;N;;;;; +16DF;RUNIC LETTER OTHALAN ETHEL O;Lo;0;L;;;;;N;;;;; +16E0;RUNIC LETTER EAR;Lo;0;L;;;;;N;;;;; +16E1;RUNIC LETTER IOR;Lo;0;L;;;;;N;;;;; +16E2;RUNIC LETTER CWEORTH;Lo;0;L;;;;;N;;;;; +16E3;RUNIC LETTER CALC;Lo;0;L;;;;;N;;;;; +16E4;RUNIC LETTER CEALC;Lo;0;L;;;;;N;;;;; +16E5;RUNIC LETTER STAN;Lo;0;L;;;;;N;;;;; +16E6;RUNIC LETTER LONG-BRANCH-YR;Lo;0;L;;;;;N;;;;; +16E7;RUNIC LETTER SHORT-TWIG-YR;Lo;0;L;;;;;N;;;;; +16E8;RUNIC LETTER ICELANDIC-YR;Lo;0;L;;;;;N;;;;; +16E9;RUNIC LETTER Q;Lo;0;L;;;;;N;;;;; +16EA;RUNIC LETTER X;Lo;0;L;;;;;N;;;;; +16EB;RUNIC SINGLE PUNCTUATION;Po;0;L;;;;;N;;;;; +16EC;RUNIC MULTIPLE PUNCTUATION;Po;0;L;;;;;N;;;;; +16ED;RUNIC CROSS PUNCTUATION;Po;0;L;;;;;N;;;;; +16EE;RUNIC ARLAUG SYMBOL;Nl;0;L;;;;17;N;;;;; +16EF;RUNIC TVIMADUR SYMBOL;Nl;0;L;;;;18;N;;;;; +16F0;RUNIC BELGTHOR SYMBOL;Nl;0;L;;;;19;N;;;;; +16F1;RUNIC LETTER K;Lo;0;L;;;;;N;;;;; +16F2;RUNIC LETTER SH;Lo;0;L;;;;;N;;;;; +16F3;RUNIC LETTER OO;Lo;0;L;;;;;N;;;;; +16F4;RUNIC LETTER FRANKS CASKET OS;Lo;0;L;;;;;N;;;;; +16F5;RUNIC LETTER FRANKS CASKET IS;Lo;0;L;;;;;N;;;;; +16F6;RUNIC LETTER FRANKS CASKET EH;Lo;0;L;;;;;N;;;;; +16F7;RUNIC LETTER FRANKS CASKET AC;Lo;0;L;;;;;N;;;;; +16F8;RUNIC LETTER FRANKS CASKET AESC;Lo;0;L;;;;;N;;;;; +1700;TAGALOG LETTER A;Lo;0;L;;;;;N;;;;; +1701;TAGALOG LETTER I;Lo;0;L;;;;;N;;;;; +1702;TAGALOG LETTER U;Lo;0;L;;;;;N;;;;; +1703;TAGALOG LETTER KA;Lo;0;L;;;;;N;;;;; +1704;TAGALOG LETTER GA;Lo;0;L;;;;;N;;;;; +1705;TAGALOG LETTER NGA;Lo;0;L;;;;;N;;;;; +1706;TAGALOG LETTER TA;Lo;0;L;;;;;N;;;;; +1707;TAGALOG LETTER DA;Lo;0;L;;;;;N;;;;; +1708;TAGALOG LETTER NA;Lo;0;L;;;;;N;;;;; +1709;TAGALOG LETTER PA;Lo;0;L;;;;;N;;;;; +170A;TAGALOG LETTER BA;Lo;0;L;;;;;N;;;;; +170B;TAGALOG LETTER MA;Lo;0;L;;;;;N;;;;; +170C;TAGALOG LETTER YA;Lo;0;L;;;;;N;;;;; +170E;TAGALOG LETTER LA;Lo;0;L;;;;;N;;;;; +170F;TAGALOG LETTER WA;Lo;0;L;;;;;N;;;;; +1710;TAGALOG LETTER SA;Lo;0;L;;;;;N;;;;; +1711;TAGALOG LETTER HA;Lo;0;L;;;;;N;;;;; +1712;TAGALOG VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +1713;TAGALOG VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +1714;TAGALOG SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +1720;HANUNOO LETTER A;Lo;0;L;;;;;N;;;;; +1721;HANUNOO LETTER I;Lo;0;L;;;;;N;;;;; +1722;HANUNOO LETTER U;Lo;0;L;;;;;N;;;;; +1723;HANUNOO LETTER KA;Lo;0;L;;;;;N;;;;; +1724;HANUNOO LETTER GA;Lo;0;L;;;;;N;;;;; +1725;HANUNOO LETTER NGA;Lo;0;L;;;;;N;;;;; +1726;HANUNOO LETTER TA;Lo;0;L;;;;;N;;;;; +1727;HANUNOO LETTER DA;Lo;0;L;;;;;N;;;;; +1728;HANUNOO LETTER NA;Lo;0;L;;;;;N;;;;; +1729;HANUNOO LETTER PA;Lo;0;L;;;;;N;;;;; +172A;HANUNOO LETTER BA;Lo;0;L;;;;;N;;;;; +172B;HANUNOO LETTER MA;Lo;0;L;;;;;N;;;;; +172C;HANUNOO LETTER YA;Lo;0;L;;;;;N;;;;; +172D;HANUNOO LETTER RA;Lo;0;L;;;;;N;;;;; +172E;HANUNOO LETTER LA;Lo;0;L;;;;;N;;;;; +172F;HANUNOO LETTER WA;Lo;0;L;;;;;N;;;;; +1730;HANUNOO LETTER SA;Lo;0;L;;;;;N;;;;; +1731;HANUNOO LETTER HA;Lo;0;L;;;;;N;;;;; +1732;HANUNOO VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +1733;HANUNOO VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +1734;HANUNOO SIGN PAMUDPOD;Mn;9;NSM;;;;;N;;;;; +1735;PHILIPPINE SINGLE PUNCTUATION;Po;0;L;;;;;N;;;;; +1736;PHILIPPINE DOUBLE PUNCTUATION;Po;0;L;;;;;N;;;;; +1740;BUHID LETTER A;Lo;0;L;;;;;N;;;;; +1741;BUHID LETTER I;Lo;0;L;;;;;N;;;;; +1742;BUHID LETTER U;Lo;0;L;;;;;N;;;;; +1743;BUHID LETTER KA;Lo;0;L;;;;;N;;;;; +1744;BUHID LETTER GA;Lo;0;L;;;;;N;;;;; +1745;BUHID LETTER NGA;Lo;0;L;;;;;N;;;;; +1746;BUHID LETTER TA;Lo;0;L;;;;;N;;;;; +1747;BUHID LETTER DA;Lo;0;L;;;;;N;;;;; +1748;BUHID LETTER NA;Lo;0;L;;;;;N;;;;; +1749;BUHID LETTER PA;Lo;0;L;;;;;N;;;;; +174A;BUHID LETTER BA;Lo;0;L;;;;;N;;;;; +174B;BUHID LETTER MA;Lo;0;L;;;;;N;;;;; +174C;BUHID LETTER YA;Lo;0;L;;;;;N;;;;; +174D;BUHID LETTER RA;Lo;0;L;;;;;N;;;;; +174E;BUHID LETTER LA;Lo;0;L;;;;;N;;;;; +174F;BUHID LETTER WA;Lo;0;L;;;;;N;;;;; +1750;BUHID LETTER SA;Lo;0;L;;;;;N;;;;; +1751;BUHID LETTER HA;Lo;0;L;;;;;N;;;;; +1752;BUHID VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +1753;BUHID VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +1760;TAGBANWA LETTER A;Lo;0;L;;;;;N;;;;; +1761;TAGBANWA LETTER I;Lo;0;L;;;;;N;;;;; +1762;TAGBANWA LETTER U;Lo;0;L;;;;;N;;;;; +1763;TAGBANWA LETTER KA;Lo;0;L;;;;;N;;;;; +1764;TAGBANWA LETTER GA;Lo;0;L;;;;;N;;;;; +1765;TAGBANWA LETTER NGA;Lo;0;L;;;;;N;;;;; +1766;TAGBANWA LETTER TA;Lo;0;L;;;;;N;;;;; +1767;TAGBANWA LETTER DA;Lo;0;L;;;;;N;;;;; +1768;TAGBANWA LETTER NA;Lo;0;L;;;;;N;;;;; +1769;TAGBANWA LETTER PA;Lo;0;L;;;;;N;;;;; +176A;TAGBANWA LETTER BA;Lo;0;L;;;;;N;;;;; +176B;TAGBANWA LETTER MA;Lo;0;L;;;;;N;;;;; +176C;TAGBANWA LETTER YA;Lo;0;L;;;;;N;;;;; +176E;TAGBANWA LETTER LA;Lo;0;L;;;;;N;;;;; +176F;TAGBANWA LETTER WA;Lo;0;L;;;;;N;;;;; +1770;TAGBANWA LETTER SA;Lo;0;L;;;;;N;;;;; +1772;TAGBANWA VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +1773;TAGBANWA VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +1780;KHMER LETTER KA;Lo;0;L;;;;;N;;;;; +1781;KHMER LETTER KHA;Lo;0;L;;;;;N;;;;; +1782;KHMER LETTER KO;Lo;0;L;;;;;N;;;;; +1783;KHMER LETTER KHO;Lo;0;L;;;;;N;;;;; +1784;KHMER LETTER NGO;Lo;0;L;;;;;N;;;;; +1785;KHMER LETTER CA;Lo;0;L;;;;;N;;;;; +1786;KHMER LETTER CHA;Lo;0;L;;;;;N;;;;; +1787;KHMER LETTER CO;Lo;0;L;;;;;N;;;;; +1788;KHMER LETTER CHO;Lo;0;L;;;;;N;;;;; +1789;KHMER LETTER NYO;Lo;0;L;;;;;N;;;;; +178A;KHMER LETTER DA;Lo;0;L;;;;;N;;;;; +178B;KHMER LETTER TTHA;Lo;0;L;;;;;N;;;;; +178C;KHMER LETTER DO;Lo;0;L;;;;;N;;;;; +178D;KHMER LETTER TTHO;Lo;0;L;;;;;N;;;;; +178E;KHMER LETTER NNO;Lo;0;L;;;;;N;;;;; +178F;KHMER LETTER TA;Lo;0;L;;;;;N;;;;; +1790;KHMER LETTER THA;Lo;0;L;;;;;N;;;;; +1791;KHMER LETTER TO;Lo;0;L;;;;;N;;;;; +1792;KHMER LETTER THO;Lo;0;L;;;;;N;;;;; +1793;KHMER LETTER NO;Lo;0;L;;;;;N;;;;; +1794;KHMER LETTER BA;Lo;0;L;;;;;N;;;;; +1795;KHMER LETTER PHA;Lo;0;L;;;;;N;;;;; +1796;KHMER LETTER PO;Lo;0;L;;;;;N;;;;; +1797;KHMER LETTER PHO;Lo;0;L;;;;;N;;;;; +1798;KHMER LETTER MO;Lo;0;L;;;;;N;;;;; +1799;KHMER LETTER YO;Lo;0;L;;;;;N;;;;; +179A;KHMER LETTER RO;Lo;0;L;;;;;N;;;;; +179B;KHMER LETTER LO;Lo;0;L;;;;;N;;;;; +179C;KHMER LETTER VO;Lo;0;L;;;;;N;;;;; +179D;KHMER LETTER SHA;Lo;0;L;;;;;N;;;;; +179E;KHMER LETTER SSO;Lo;0;L;;;;;N;;;;; +179F;KHMER LETTER SA;Lo;0;L;;;;;N;;;;; +17A0;KHMER LETTER HA;Lo;0;L;;;;;N;;;;; +17A1;KHMER LETTER LA;Lo;0;L;;;;;N;;;;; +17A2;KHMER LETTER QA;Lo;0;L;;;;;N;;;;; +17A3;KHMER INDEPENDENT VOWEL QAQ;Lo;0;L;;;;;N;;;;; +17A4;KHMER INDEPENDENT VOWEL QAA;Lo;0;L;;;;;N;;;;; +17A5;KHMER INDEPENDENT VOWEL QI;Lo;0;L;;;;;N;;;;; +17A6;KHMER INDEPENDENT VOWEL QII;Lo;0;L;;;;;N;;;;; +17A7;KHMER INDEPENDENT VOWEL QU;Lo;0;L;;;;;N;;;;; +17A8;KHMER INDEPENDENT VOWEL QUK;Lo;0;L;;;;;N;;;;; +17A9;KHMER INDEPENDENT VOWEL QUU;Lo;0;L;;;;;N;;;;; +17AA;KHMER INDEPENDENT VOWEL QUUV;Lo;0;L;;;;;N;;;;; +17AB;KHMER INDEPENDENT VOWEL RY;Lo;0;L;;;;;N;;;;; +17AC;KHMER INDEPENDENT VOWEL RYY;Lo;0;L;;;;;N;;;;; +17AD;KHMER INDEPENDENT VOWEL LY;Lo;0;L;;;;;N;;;;; +17AE;KHMER INDEPENDENT VOWEL LYY;Lo;0;L;;;;;N;;;;; +17AF;KHMER INDEPENDENT VOWEL QE;Lo;0;L;;;;;N;;;;; +17B0;KHMER INDEPENDENT VOWEL QAI;Lo;0;L;;;;;N;;;;; +17B1;KHMER INDEPENDENT VOWEL QOO TYPE ONE;Lo;0;L;;;;;N;;;;; +17B2;KHMER INDEPENDENT VOWEL QOO TYPE TWO;Lo;0;L;;;;;N;;;;; +17B3;KHMER INDEPENDENT VOWEL QAU;Lo;0;L;;;;;N;;;;; +17B4;KHMER VOWEL INHERENT AQ;Mn;0;NSM;;;;;N;;;;; +17B5;KHMER VOWEL INHERENT AA;Mn;0;NSM;;;;;N;;;;; +17B6;KHMER VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +17B7;KHMER VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +17B8;KHMER VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; +17B9;KHMER VOWEL SIGN Y;Mn;0;NSM;;;;;N;;;;; +17BA;KHMER VOWEL SIGN YY;Mn;0;NSM;;;;;N;;;;; +17BB;KHMER VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +17BC;KHMER VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +17BD;KHMER VOWEL SIGN UA;Mn;0;NSM;;;;;N;;;;; +17BE;KHMER VOWEL SIGN OE;Mc;0;L;;;;;N;;;;; +17BF;KHMER VOWEL SIGN YA;Mc;0;L;;;;;N;;;;; +17C0;KHMER VOWEL SIGN IE;Mc;0;L;;;;;N;;;;; +17C1;KHMER VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +17C2;KHMER VOWEL SIGN AE;Mc;0;L;;;;;N;;;;; +17C3;KHMER VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; +17C4;KHMER VOWEL SIGN OO;Mc;0;L;;;;;N;;;;; +17C5;KHMER VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; +17C6;KHMER SIGN NIKAHIT;Mn;0;NSM;;;;;N;;;;; +17C7;KHMER SIGN REAHMUK;Mc;0;L;;;;;N;;;;; +17C8;KHMER SIGN YUUKALEAPINTU;Mc;0;L;;;;;N;;;;; +17C9;KHMER SIGN MUUSIKATOAN;Mn;0;NSM;;;;;N;;;;; +17CA;KHMER SIGN TRIISAP;Mn;0;NSM;;;;;N;;;;; +17CB;KHMER SIGN BANTOC;Mn;0;NSM;;;;;N;;;;; +17CC;KHMER SIGN ROBAT;Mn;0;NSM;;;;;N;;;;; +17CD;KHMER SIGN TOANDAKHIAT;Mn;0;NSM;;;;;N;;;;; +17CE;KHMER SIGN KAKABAT;Mn;0;NSM;;;;;N;;;;; +17CF;KHMER SIGN AHSDA;Mn;0;NSM;;;;;N;;;;; +17D0;KHMER SIGN SAMYOK SANNYA;Mn;0;NSM;;;;;N;;;;; +17D1;KHMER SIGN VIRIAM;Mn;0;NSM;;;;;N;;;;; +17D2;KHMER SIGN COENG;Mn;9;NSM;;;;;N;;;;; +17D3;KHMER SIGN BATHAMASAT;Mn;0;NSM;;;;;N;;;;; +17D4;KHMER SIGN KHAN;Po;0;L;;;;;N;;;;; +17D5;KHMER SIGN BARIYOOSAN;Po;0;L;;;;;N;;;;; +17D6;KHMER SIGN CAMNUC PII KUUH;Po;0;L;;;;;N;;;;; +17D7;KHMER SIGN LEK TOO;Lm;0;L;;;;;N;;;;; +17D8;KHMER SIGN BEYYAL;Po;0;L;;;;;N;;;;; +17D9;KHMER SIGN PHNAEK MUAN;Po;0;L;;;;;N;;;;; +17DA;KHMER SIGN KOOMUUT;Po;0;L;;;;;N;;;;; +17DB;KHMER CURRENCY SYMBOL RIEL;Sc;0;ET;;;;;N;;;;; +17DC;KHMER SIGN AVAKRAHASANYA;Lo;0;L;;;;;N;;;;; +17DD;KHMER SIGN ATTHACAN;Mn;230;NSM;;;;;N;;;;; +17E0;KHMER DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +17E1;KHMER DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +17E2;KHMER DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +17E3;KHMER DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +17E4;KHMER DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +17E5;KHMER DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +17E6;KHMER DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +17E7;KHMER DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +17E8;KHMER DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +17E9;KHMER DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +17F0;KHMER SYMBOL LEK ATTAK SON;No;0;ON;;;;0;N;;;;; +17F1;KHMER SYMBOL LEK ATTAK MUOY;No;0;ON;;;;1;N;;;;; +17F2;KHMER SYMBOL LEK ATTAK PII;No;0;ON;;;;2;N;;;;; +17F3;KHMER SYMBOL LEK ATTAK BEI;No;0;ON;;;;3;N;;;;; +17F4;KHMER SYMBOL LEK ATTAK BUON;No;0;ON;;;;4;N;;;;; +17F5;KHMER SYMBOL LEK ATTAK PRAM;No;0;ON;;;;5;N;;;;; +17F6;KHMER SYMBOL LEK ATTAK PRAM-MUOY;No;0;ON;;;;6;N;;;;; +17F7;KHMER SYMBOL LEK ATTAK PRAM-PII;No;0;ON;;;;7;N;;;;; +17F8;KHMER SYMBOL LEK ATTAK PRAM-BEI;No;0;ON;;;;8;N;;;;; +17F9;KHMER SYMBOL LEK ATTAK PRAM-BUON;No;0;ON;;;;9;N;;;;; +1800;MONGOLIAN BIRGA;Po;0;ON;;;;;N;;;;; +1801;MONGOLIAN ELLIPSIS;Po;0;ON;;;;;N;;;;; +1802;MONGOLIAN COMMA;Po;0;ON;;;;;N;;;;; +1803;MONGOLIAN FULL STOP;Po;0;ON;;;;;N;;;;; +1804;MONGOLIAN COLON;Po;0;ON;;;;;N;;;;; +1805;MONGOLIAN FOUR DOTS;Po;0;ON;;;;;N;;;;; +1806;MONGOLIAN TODO SOFT HYPHEN;Pd;0;ON;;;;;N;;;;; +1807;MONGOLIAN SIBE SYLLABLE BOUNDARY MARKER;Po;0;ON;;;;;N;;;;; +1808;MONGOLIAN MANCHU COMMA;Po;0;ON;;;;;N;;;;; +1809;MONGOLIAN MANCHU FULL STOP;Po;0;ON;;;;;N;;;;; +180A;MONGOLIAN NIRUGU;Po;0;ON;;;;;N;;;;; +180B;MONGOLIAN FREE VARIATION SELECTOR ONE;Mn;0;NSM;;;;;N;;;;; +180C;MONGOLIAN FREE VARIATION SELECTOR TWO;Mn;0;NSM;;;;;N;;;;; +180D;MONGOLIAN FREE VARIATION SELECTOR THREE;Mn;0;NSM;;;;;N;;;;; +180E;MONGOLIAN VOWEL SEPARATOR;Cf;0;BN;;;;;N;;;;; +1810;MONGOLIAN DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +1811;MONGOLIAN DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +1812;MONGOLIAN DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +1813;MONGOLIAN DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +1814;MONGOLIAN DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +1815;MONGOLIAN DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +1816;MONGOLIAN DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +1817;MONGOLIAN DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +1818;MONGOLIAN DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +1819;MONGOLIAN DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +1820;MONGOLIAN LETTER A;Lo;0;L;;;;;N;;;;; +1821;MONGOLIAN LETTER E;Lo;0;L;;;;;N;;;;; +1822;MONGOLIAN LETTER I;Lo;0;L;;;;;N;;;;; +1823;MONGOLIAN LETTER O;Lo;0;L;;;;;N;;;;; +1824;MONGOLIAN LETTER U;Lo;0;L;;;;;N;;;;; +1825;MONGOLIAN LETTER OE;Lo;0;L;;;;;N;;;;; +1826;MONGOLIAN LETTER UE;Lo;0;L;;;;;N;;;;; +1827;MONGOLIAN LETTER EE;Lo;0;L;;;;;N;;;;; +1828;MONGOLIAN LETTER NA;Lo;0;L;;;;;N;;;;; +1829;MONGOLIAN LETTER ANG;Lo;0;L;;;;;N;;;;; +182A;MONGOLIAN LETTER BA;Lo;0;L;;;;;N;;;;; +182B;MONGOLIAN LETTER PA;Lo;0;L;;;;;N;;;;; +182C;MONGOLIAN LETTER QA;Lo;0;L;;;;;N;;;;; +182D;MONGOLIAN LETTER GA;Lo;0;L;;;;;N;;;;; +182E;MONGOLIAN LETTER MA;Lo;0;L;;;;;N;;;;; +182F;MONGOLIAN LETTER LA;Lo;0;L;;;;;N;;;;; +1830;MONGOLIAN LETTER SA;Lo;0;L;;;;;N;;;;; +1831;MONGOLIAN LETTER SHA;Lo;0;L;;;;;N;;;;; +1832;MONGOLIAN LETTER TA;Lo;0;L;;;;;N;;;;; +1833;MONGOLIAN LETTER DA;Lo;0;L;;;;;N;;;;; +1834;MONGOLIAN LETTER CHA;Lo;0;L;;;;;N;;;;; +1835;MONGOLIAN LETTER JA;Lo;0;L;;;;;N;;;;; +1836;MONGOLIAN LETTER YA;Lo;0;L;;;;;N;;;;; +1837;MONGOLIAN LETTER RA;Lo;0;L;;;;;N;;;;; +1838;MONGOLIAN LETTER WA;Lo;0;L;;;;;N;;;;; +1839;MONGOLIAN LETTER FA;Lo;0;L;;;;;N;;;;; +183A;MONGOLIAN LETTER KA;Lo;0;L;;;;;N;;;;; +183B;MONGOLIAN LETTER KHA;Lo;0;L;;;;;N;;;;; +183C;MONGOLIAN LETTER TSA;Lo;0;L;;;;;N;;;;; +183D;MONGOLIAN LETTER ZA;Lo;0;L;;;;;N;;;;; +183E;MONGOLIAN LETTER HAA;Lo;0;L;;;;;N;;;;; +183F;MONGOLIAN LETTER ZRA;Lo;0;L;;;;;N;;;;; +1840;MONGOLIAN LETTER LHA;Lo;0;L;;;;;N;;;;; +1841;MONGOLIAN LETTER ZHI;Lo;0;L;;;;;N;;;;; +1842;MONGOLIAN LETTER CHI;Lo;0;L;;;;;N;;;;; +1843;MONGOLIAN LETTER TODO LONG VOWEL SIGN;Lm;0;L;;;;;N;;;;; +1844;MONGOLIAN LETTER TODO E;Lo;0;L;;;;;N;;;;; +1845;MONGOLIAN LETTER TODO I;Lo;0;L;;;;;N;;;;; +1846;MONGOLIAN LETTER TODO O;Lo;0;L;;;;;N;;;;; +1847;MONGOLIAN LETTER TODO U;Lo;0;L;;;;;N;;;;; +1848;MONGOLIAN LETTER TODO OE;Lo;0;L;;;;;N;;;;; +1849;MONGOLIAN LETTER TODO UE;Lo;0;L;;;;;N;;;;; +184A;MONGOLIAN LETTER TODO ANG;Lo;0;L;;;;;N;;;;; +184B;MONGOLIAN LETTER TODO BA;Lo;0;L;;;;;N;;;;; +184C;MONGOLIAN LETTER TODO PA;Lo;0;L;;;;;N;;;;; +184D;MONGOLIAN LETTER TODO QA;Lo;0;L;;;;;N;;;;; +184E;MONGOLIAN LETTER TODO GA;Lo;0;L;;;;;N;;;;; +184F;MONGOLIAN LETTER TODO MA;Lo;0;L;;;;;N;;;;; +1850;MONGOLIAN LETTER TODO TA;Lo;0;L;;;;;N;;;;; +1851;MONGOLIAN LETTER TODO DA;Lo;0;L;;;;;N;;;;; +1852;MONGOLIAN LETTER TODO CHA;Lo;0;L;;;;;N;;;;; +1853;MONGOLIAN LETTER TODO JA;Lo;0;L;;;;;N;;;;; +1854;MONGOLIAN LETTER TODO TSA;Lo;0;L;;;;;N;;;;; +1855;MONGOLIAN LETTER TODO YA;Lo;0;L;;;;;N;;;;; +1856;MONGOLIAN LETTER TODO WA;Lo;0;L;;;;;N;;;;; +1857;MONGOLIAN LETTER TODO KA;Lo;0;L;;;;;N;;;;; +1858;MONGOLIAN LETTER TODO GAA;Lo;0;L;;;;;N;;;;; +1859;MONGOLIAN LETTER TODO HAA;Lo;0;L;;;;;N;;;;; +185A;MONGOLIAN LETTER TODO JIA;Lo;0;L;;;;;N;;;;; +185B;MONGOLIAN LETTER TODO NIA;Lo;0;L;;;;;N;;;;; +185C;MONGOLIAN LETTER TODO DZA;Lo;0;L;;;;;N;;;;; +185D;MONGOLIAN LETTER SIBE E;Lo;0;L;;;;;N;;;;; +185E;MONGOLIAN LETTER SIBE I;Lo;0;L;;;;;N;;;;; +185F;MONGOLIAN LETTER SIBE IY;Lo;0;L;;;;;N;;;;; +1860;MONGOLIAN LETTER SIBE UE;Lo;0;L;;;;;N;;;;; +1861;MONGOLIAN LETTER SIBE U;Lo;0;L;;;;;N;;;;; +1862;MONGOLIAN LETTER SIBE ANG;Lo;0;L;;;;;N;;;;; +1863;MONGOLIAN LETTER SIBE KA;Lo;0;L;;;;;N;;;;; +1864;MONGOLIAN LETTER SIBE GA;Lo;0;L;;;;;N;;;;; +1865;MONGOLIAN LETTER SIBE HA;Lo;0;L;;;;;N;;;;; +1866;MONGOLIAN LETTER SIBE PA;Lo;0;L;;;;;N;;;;; +1867;MONGOLIAN LETTER SIBE SHA;Lo;0;L;;;;;N;;;;; +1868;MONGOLIAN LETTER SIBE TA;Lo;0;L;;;;;N;;;;; +1869;MONGOLIAN LETTER SIBE DA;Lo;0;L;;;;;N;;;;; +186A;MONGOLIAN LETTER SIBE JA;Lo;0;L;;;;;N;;;;; +186B;MONGOLIAN LETTER SIBE FA;Lo;0;L;;;;;N;;;;; +186C;MONGOLIAN LETTER SIBE GAA;Lo;0;L;;;;;N;;;;; +186D;MONGOLIAN LETTER SIBE HAA;Lo;0;L;;;;;N;;;;; +186E;MONGOLIAN LETTER SIBE TSA;Lo;0;L;;;;;N;;;;; +186F;MONGOLIAN LETTER SIBE ZA;Lo;0;L;;;;;N;;;;; +1870;MONGOLIAN LETTER SIBE RAA;Lo;0;L;;;;;N;;;;; +1871;MONGOLIAN LETTER SIBE CHA;Lo;0;L;;;;;N;;;;; +1872;MONGOLIAN LETTER SIBE ZHA;Lo;0;L;;;;;N;;;;; +1873;MONGOLIAN LETTER MANCHU I;Lo;0;L;;;;;N;;;;; +1874;MONGOLIAN LETTER MANCHU KA;Lo;0;L;;;;;N;;;;; +1875;MONGOLIAN LETTER MANCHU RA;Lo;0;L;;;;;N;;;;; +1876;MONGOLIAN LETTER MANCHU FA;Lo;0;L;;;;;N;;;;; +1877;MONGOLIAN LETTER MANCHU ZHA;Lo;0;L;;;;;N;;;;; +1878;MONGOLIAN LETTER CHA WITH TWO DOTS;Lo;0;L;;;;;N;;;;; +1880;MONGOLIAN LETTER ALI GALI ANUSVARA ONE;Lo;0;L;;;;;N;;;;; +1881;MONGOLIAN LETTER ALI GALI VISARGA ONE;Lo;0;L;;;;;N;;;;; +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;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;;;;; +188A;MONGOLIAN LETTER ALI GALI NGA;Lo;0;L;;;;;N;;;;; +188B;MONGOLIAN LETTER ALI GALI CA;Lo;0;L;;;;;N;;;;; +188C;MONGOLIAN LETTER ALI GALI TTA;Lo;0;L;;;;;N;;;;; +188D;MONGOLIAN LETTER ALI GALI TTHA;Lo;0;L;;;;;N;;;;; +188E;MONGOLIAN LETTER ALI GALI DDA;Lo;0;L;;;;;N;;;;; +188F;MONGOLIAN LETTER ALI GALI NNA;Lo;0;L;;;;;N;;;;; +1890;MONGOLIAN LETTER ALI GALI TA;Lo;0;L;;;;;N;;;;; +1891;MONGOLIAN LETTER ALI GALI DA;Lo;0;L;;;;;N;;;;; +1892;MONGOLIAN LETTER ALI GALI PA;Lo;0;L;;;;;N;;;;; +1893;MONGOLIAN LETTER ALI GALI PHA;Lo;0;L;;;;;N;;;;; +1894;MONGOLIAN LETTER ALI GALI SSA;Lo;0;L;;;;;N;;;;; +1895;MONGOLIAN LETTER ALI GALI ZHA;Lo;0;L;;;;;N;;;;; +1896;MONGOLIAN LETTER ALI GALI ZA;Lo;0;L;;;;;N;;;;; +1897;MONGOLIAN LETTER ALI GALI AH;Lo;0;L;;;;;N;;;;; +1898;MONGOLIAN LETTER TODO ALI GALI TA;Lo;0;L;;;;;N;;;;; +1899;MONGOLIAN LETTER TODO ALI GALI ZHA;Lo;0;L;;;;;N;;;;; +189A;MONGOLIAN LETTER MANCHU ALI GALI GHA;Lo;0;L;;;;;N;;;;; +189B;MONGOLIAN LETTER MANCHU ALI GALI NGA;Lo;0;L;;;;;N;;;;; +189C;MONGOLIAN LETTER MANCHU ALI GALI CA;Lo;0;L;;;;;N;;;;; +189D;MONGOLIAN LETTER MANCHU ALI GALI JHA;Lo;0;L;;;;;N;;;;; +189E;MONGOLIAN LETTER MANCHU ALI GALI TTA;Lo;0;L;;;;;N;;;;; +189F;MONGOLIAN LETTER MANCHU ALI GALI DDHA;Lo;0;L;;;;;N;;;;; +18A0;MONGOLIAN LETTER MANCHU ALI GALI TA;Lo;0;L;;;;;N;;;;; +18A1;MONGOLIAN LETTER MANCHU ALI GALI DHA;Lo;0;L;;;;;N;;;;; +18A2;MONGOLIAN LETTER MANCHU ALI GALI SSA;Lo;0;L;;;;;N;;;;; +18A3;MONGOLIAN LETTER MANCHU ALI GALI CYA;Lo;0;L;;;;;N;;;;; +18A4;MONGOLIAN LETTER MANCHU ALI GALI ZHA;Lo;0;L;;;;;N;;;;; +18A5;MONGOLIAN LETTER MANCHU ALI GALI ZA;Lo;0;L;;;;;N;;;;; +18A6;MONGOLIAN LETTER ALI GALI HALF U;Lo;0;L;;;;;N;;;;; +18A7;MONGOLIAN LETTER ALI GALI HALF YA;Lo;0;L;;;;;N;;;;; +18A8;MONGOLIAN LETTER MANCHU ALI GALI BHA;Lo;0;L;;;;;N;;;;; +18A9;MONGOLIAN LETTER ALI GALI DAGALGA;Mn;228;NSM;;;;;N;;;;; +18AA;MONGOLIAN LETTER MANCHU ALI GALI LHA;Lo;0;L;;;;;N;;;;; +18B0;CANADIAN SYLLABICS OY;Lo;0;L;;;;;N;;;;; +18B1;CANADIAN SYLLABICS AY;Lo;0;L;;;;;N;;;;; +18B2;CANADIAN SYLLABICS AAY;Lo;0;L;;;;;N;;;;; +18B3;CANADIAN SYLLABICS WAY;Lo;0;L;;;;;N;;;;; +18B4;CANADIAN SYLLABICS POY;Lo;0;L;;;;;N;;;;; +18B5;CANADIAN SYLLABICS PAY;Lo;0;L;;;;;N;;;;; +18B6;CANADIAN SYLLABICS PWOY;Lo;0;L;;;;;N;;;;; +18B7;CANADIAN SYLLABICS TAY;Lo;0;L;;;;;N;;;;; +18B8;CANADIAN SYLLABICS KAY;Lo;0;L;;;;;N;;;;; +18B9;CANADIAN SYLLABICS KWAY;Lo;0;L;;;;;N;;;;; +18BA;CANADIAN SYLLABICS MAY;Lo;0;L;;;;;N;;;;; +18BB;CANADIAN SYLLABICS NOY;Lo;0;L;;;;;N;;;;; +18BC;CANADIAN SYLLABICS NAY;Lo;0;L;;;;;N;;;;; +18BD;CANADIAN SYLLABICS LAY;Lo;0;L;;;;;N;;;;; +18BE;CANADIAN SYLLABICS SOY;Lo;0;L;;;;;N;;;;; +18BF;CANADIAN SYLLABICS SAY;Lo;0;L;;;;;N;;;;; +18C0;CANADIAN SYLLABICS SHOY;Lo;0;L;;;;;N;;;;; +18C1;CANADIAN SYLLABICS SHAY;Lo;0;L;;;;;N;;;;; +18C2;CANADIAN SYLLABICS SHWOY;Lo;0;L;;;;;N;;;;; +18C3;CANADIAN SYLLABICS YOY;Lo;0;L;;;;;N;;;;; +18C4;CANADIAN SYLLABICS YAY;Lo;0;L;;;;;N;;;;; +18C5;CANADIAN SYLLABICS RAY;Lo;0;L;;;;;N;;;;; +18C6;CANADIAN SYLLABICS NWI;Lo;0;L;;;;;N;;;;; +18C7;CANADIAN SYLLABICS OJIBWAY NWI;Lo;0;L;;;;;N;;;;; +18C8;CANADIAN SYLLABICS NWII;Lo;0;L;;;;;N;;;;; +18C9;CANADIAN SYLLABICS OJIBWAY NWII;Lo;0;L;;;;;N;;;;; +18CA;CANADIAN SYLLABICS NWO;Lo;0;L;;;;;N;;;;; +18CB;CANADIAN SYLLABICS OJIBWAY NWO;Lo;0;L;;;;;N;;;;; +18CC;CANADIAN SYLLABICS NWOO;Lo;0;L;;;;;N;;;;; +18CD;CANADIAN SYLLABICS OJIBWAY NWOO;Lo;0;L;;;;;N;;;;; +18CE;CANADIAN SYLLABICS RWEE;Lo;0;L;;;;;N;;;;; +18CF;CANADIAN SYLLABICS RWI;Lo;0;L;;;;;N;;;;; +18D0;CANADIAN SYLLABICS RWII;Lo;0;L;;;;;N;;;;; +18D1;CANADIAN SYLLABICS RWO;Lo;0;L;;;;;N;;;;; +18D2;CANADIAN SYLLABICS RWOO;Lo;0;L;;;;;N;;;;; +18D3;CANADIAN SYLLABICS RWA;Lo;0;L;;;;;N;;;;; +18D4;CANADIAN SYLLABICS OJIBWAY P;Lo;0;L;;;;;N;;;;; +18D5;CANADIAN SYLLABICS OJIBWAY T;Lo;0;L;;;;;N;;;;; +18D6;CANADIAN SYLLABICS OJIBWAY K;Lo;0;L;;;;;N;;;;; +18D7;CANADIAN SYLLABICS OJIBWAY C;Lo;0;L;;;;;N;;;;; +18D8;CANADIAN SYLLABICS OJIBWAY M;Lo;0;L;;;;;N;;;;; +18D9;CANADIAN SYLLABICS OJIBWAY N;Lo;0;L;;;;;N;;;;; +18DA;CANADIAN SYLLABICS OJIBWAY S;Lo;0;L;;;;;N;;;;; +18DB;CANADIAN SYLLABICS OJIBWAY SH;Lo;0;L;;;;;N;;;;; +18DC;CANADIAN SYLLABICS EASTERN W;Lo;0;L;;;;;N;;;;; +18DD;CANADIAN SYLLABICS WESTERN W;Lo;0;L;;;;;N;;;;; +18DE;CANADIAN SYLLABICS FINAL SMALL RING;Lo;0;L;;;;;N;;;;; +18DF;CANADIAN SYLLABICS FINAL RAISED DOT;Lo;0;L;;;;;N;;;;; +18E0;CANADIAN SYLLABICS R-CREE RWE;Lo;0;L;;;;;N;;;;; +18E1;CANADIAN SYLLABICS WEST-CREE LOO;Lo;0;L;;;;;N;;;;; +18E2;CANADIAN SYLLABICS WEST-CREE LAA;Lo;0;L;;;;;N;;;;; +18E3;CANADIAN SYLLABICS THWE;Lo;0;L;;;;;N;;;;; +18E4;CANADIAN SYLLABICS THWA;Lo;0;L;;;;;N;;;;; +18E5;CANADIAN SYLLABICS TTHWE;Lo;0;L;;;;;N;;;;; +18E6;CANADIAN SYLLABICS TTHOO;Lo;0;L;;;;;N;;;;; +18E7;CANADIAN SYLLABICS TTHAA;Lo;0;L;;;;;N;;;;; +18E8;CANADIAN SYLLABICS TLHWE;Lo;0;L;;;;;N;;;;; +18E9;CANADIAN SYLLABICS TLHOO;Lo;0;L;;;;;N;;;;; +18EA;CANADIAN SYLLABICS SAYISI SHWE;Lo;0;L;;;;;N;;;;; +18EB;CANADIAN SYLLABICS SAYISI SHOO;Lo;0;L;;;;;N;;;;; +18EC;CANADIAN SYLLABICS SAYISI HOO;Lo;0;L;;;;;N;;;;; +18ED;CANADIAN SYLLABICS CARRIER GWU;Lo;0;L;;;;;N;;;;; +18EE;CANADIAN SYLLABICS CARRIER DENE GEE;Lo;0;L;;;;;N;;;;; +18EF;CANADIAN SYLLABICS CARRIER GAA;Lo;0;L;;;;;N;;;;; +18F0;CANADIAN SYLLABICS CARRIER GWA;Lo;0;L;;;;;N;;;;; +18F1;CANADIAN SYLLABICS SAYISI JUU;Lo;0;L;;;;;N;;;;; +18F2;CANADIAN SYLLABICS CARRIER JWA;Lo;0;L;;;;;N;;;;; +18F3;CANADIAN SYLLABICS BEAVER DENE L;Lo;0;L;;;;;N;;;;; +18F4;CANADIAN SYLLABICS BEAVER DENE R;Lo;0;L;;;;;N;;;;; +18F5;CANADIAN SYLLABICS CARRIER DENTAL S;Lo;0;L;;;;;N;;;;; +1900;LIMBU VOWEL-CARRIER LETTER;Lo;0;L;;;;;N;;;;; +1901;LIMBU LETTER KA;Lo;0;L;;;;;N;;;;; +1902;LIMBU LETTER KHA;Lo;0;L;;;;;N;;;;; +1903;LIMBU LETTER GA;Lo;0;L;;;;;N;;;;; +1904;LIMBU LETTER GHA;Lo;0;L;;;;;N;;;;; +1905;LIMBU LETTER NGA;Lo;0;L;;;;;N;;;;; +1906;LIMBU LETTER CA;Lo;0;L;;;;;N;;;;; +1907;LIMBU LETTER CHA;Lo;0;L;;;;;N;;;;; +1908;LIMBU LETTER JA;Lo;0;L;;;;;N;;;;; +1909;LIMBU LETTER JHA;Lo;0;L;;;;;N;;;;; +190A;LIMBU LETTER YAN;Lo;0;L;;;;;N;;;;; +190B;LIMBU LETTER TA;Lo;0;L;;;;;N;;;;; +190C;LIMBU LETTER THA;Lo;0;L;;;;;N;;;;; +190D;LIMBU LETTER DA;Lo;0;L;;;;;N;;;;; +190E;LIMBU LETTER DHA;Lo;0;L;;;;;N;;;;; +190F;LIMBU LETTER NA;Lo;0;L;;;;;N;;;;; +1910;LIMBU LETTER PA;Lo;0;L;;;;;N;;;;; +1911;LIMBU LETTER PHA;Lo;0;L;;;;;N;;;;; +1912;LIMBU LETTER BA;Lo;0;L;;;;;N;;;;; +1913;LIMBU LETTER BHA;Lo;0;L;;;;;N;;;;; +1914;LIMBU LETTER MA;Lo;0;L;;;;;N;;;;; +1915;LIMBU LETTER YA;Lo;0;L;;;;;N;;;;; +1916;LIMBU LETTER RA;Lo;0;L;;;;;N;;;;; +1917;LIMBU LETTER LA;Lo;0;L;;;;;N;;;;; +1918;LIMBU LETTER WA;Lo;0;L;;;;;N;;;;; +1919;LIMBU LETTER SHA;Lo;0;L;;;;;N;;;;; +191A;LIMBU LETTER SSA;Lo;0;L;;;;;N;;;;; +191B;LIMBU LETTER SA;Lo;0;L;;;;;N;;;;; +191C;LIMBU LETTER HA;Lo;0;L;;;;;N;;;;; +191D;LIMBU LETTER GYAN;Lo;0;L;;;;;N;;;;; +191E;LIMBU LETTER TRA;Lo;0;L;;;;;N;;;;; +1920;LIMBU VOWEL SIGN A;Mn;0;NSM;;;;;N;;;;; +1921;LIMBU VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +1922;LIMBU VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +1923;LIMBU VOWEL SIGN EE;Mc;0;L;;;;;N;;;;; +1924;LIMBU VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; +1925;LIMBU VOWEL SIGN OO;Mc;0;L;;;;;N;;;;; +1926;LIMBU VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; +1927;LIMBU VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +1928;LIMBU VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; +1929;LIMBU SUBJOINED LETTER YA;Mc;0;L;;;;;N;;;;; +192A;LIMBU SUBJOINED LETTER RA;Mc;0;L;;;;;N;;;;; +192B;LIMBU SUBJOINED LETTER WA;Mc;0;L;;;;;N;;;;; +1930;LIMBU SMALL LETTER KA;Mc;0;L;;;;;N;;;;; +1931;LIMBU SMALL LETTER NGA;Mc;0;L;;;;;N;;;;; +1932;LIMBU SMALL LETTER ANUSVARA;Mn;0;NSM;;;;;N;;;;; +1933;LIMBU SMALL LETTER TA;Mc;0;L;;;;;N;;;;; +1934;LIMBU SMALL LETTER NA;Mc;0;L;;;;;N;;;;; +1935;LIMBU SMALL LETTER PA;Mc;0;L;;;;;N;;;;; +1936;LIMBU SMALL LETTER MA;Mc;0;L;;;;;N;;;;; +1937;LIMBU SMALL LETTER RA;Mc;0;L;;;;;N;;;;; +1938;LIMBU SMALL LETTER LA;Mc;0;L;;;;;N;;;;; +1939;LIMBU SIGN MUKPHRENG;Mn;222;NSM;;;;;N;;;;; +193A;LIMBU SIGN KEMPHRENG;Mn;230;NSM;;;;;N;;;;; +193B;LIMBU SIGN SA-I;Mn;220;NSM;;;;;N;;;;; +1940;LIMBU SIGN LOO;So;0;ON;;;;;N;;;;; +1944;LIMBU EXCLAMATION MARK;Po;0;ON;;;;;N;;;;; +1945;LIMBU QUESTION MARK;Po;0;ON;;;;;N;;;;; +1946;LIMBU DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +1947;LIMBU DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +1948;LIMBU DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +1949;LIMBU DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +194A;LIMBU DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +194B;LIMBU DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +194C;LIMBU DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +194D;LIMBU DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +194E;LIMBU DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +194F;LIMBU DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +1950;TAI LE LETTER KA;Lo;0;L;;;;;N;;;;; +1951;TAI LE LETTER XA;Lo;0;L;;;;;N;;;;; +1952;TAI LE LETTER NGA;Lo;0;L;;;;;N;;;;; +1953;TAI LE LETTER TSA;Lo;0;L;;;;;N;;;;; +1954;TAI LE LETTER SA;Lo;0;L;;;;;N;;;;; +1955;TAI LE LETTER YA;Lo;0;L;;;;;N;;;;; +1956;TAI LE LETTER TA;Lo;0;L;;;;;N;;;;; +1957;TAI LE LETTER THA;Lo;0;L;;;;;N;;;;; +1958;TAI LE LETTER LA;Lo;0;L;;;;;N;;;;; +1959;TAI LE LETTER PA;Lo;0;L;;;;;N;;;;; +195A;TAI LE LETTER PHA;Lo;0;L;;;;;N;;;;; +195B;TAI LE LETTER MA;Lo;0;L;;;;;N;;;;; +195C;TAI LE LETTER FA;Lo;0;L;;;;;N;;;;; +195D;TAI LE LETTER VA;Lo;0;L;;;;;N;;;;; +195E;TAI LE LETTER HA;Lo;0;L;;;;;N;;;;; +195F;TAI LE LETTER QA;Lo;0;L;;;;;N;;;;; +1960;TAI LE LETTER KHA;Lo;0;L;;;;;N;;;;; +1961;TAI LE LETTER TSHA;Lo;0;L;;;;;N;;;;; +1962;TAI LE LETTER NA;Lo;0;L;;;;;N;;;;; +1963;TAI LE LETTER A;Lo;0;L;;;;;N;;;;; +1964;TAI LE LETTER I;Lo;0;L;;;;;N;;;;; +1965;TAI LE LETTER EE;Lo;0;L;;;;;N;;;;; +1966;TAI LE LETTER EH;Lo;0;L;;;;;N;;;;; +1967;TAI LE LETTER U;Lo;0;L;;;;;N;;;;; +1968;TAI LE LETTER OO;Lo;0;L;;;;;N;;;;; +1969;TAI LE LETTER O;Lo;0;L;;;;;N;;;;; +196A;TAI LE LETTER UE;Lo;0;L;;;;;N;;;;; +196B;TAI LE LETTER E;Lo;0;L;;;;;N;;;;; +196C;TAI LE LETTER AUE;Lo;0;L;;;;;N;;;;; +196D;TAI LE LETTER AI;Lo;0;L;;;;;N;;;;; +1970;TAI LE LETTER TONE-2;Lo;0;L;;;;;N;;;;; +1971;TAI LE LETTER TONE-3;Lo;0;L;;;;;N;;;;; +1972;TAI LE LETTER TONE-4;Lo;0;L;;;;;N;;;;; +1973;TAI LE LETTER TONE-5;Lo;0;L;;;;;N;;;;; +1974;TAI LE LETTER TONE-6;Lo;0;L;;;;;N;;;;; +1980;NEW TAI LUE LETTER HIGH QA;Lo;0;L;;;;;N;;;;; +1981;NEW TAI LUE LETTER LOW QA;Lo;0;L;;;;;N;;;;; +1982;NEW TAI LUE LETTER HIGH KA;Lo;0;L;;;;;N;;;;; +1983;NEW TAI LUE LETTER HIGH XA;Lo;0;L;;;;;N;;;;; +1984;NEW TAI LUE LETTER HIGH NGA;Lo;0;L;;;;;N;;;;; +1985;NEW TAI LUE LETTER LOW KA;Lo;0;L;;;;;N;;;;; +1986;NEW TAI LUE LETTER LOW XA;Lo;0;L;;;;;N;;;;; +1987;NEW TAI LUE LETTER LOW NGA;Lo;0;L;;;;;N;;;;; +1988;NEW TAI LUE LETTER HIGH TSA;Lo;0;L;;;;;N;;;;; +1989;NEW TAI LUE LETTER HIGH SA;Lo;0;L;;;;;N;;;;; +198A;NEW TAI LUE LETTER HIGH YA;Lo;0;L;;;;;N;;;;; +198B;NEW TAI LUE LETTER LOW TSA;Lo;0;L;;;;;N;;;;; +198C;NEW TAI LUE LETTER LOW SA;Lo;0;L;;;;;N;;;;; +198D;NEW TAI LUE LETTER LOW YA;Lo;0;L;;;;;N;;;;; +198E;NEW TAI LUE LETTER HIGH TA;Lo;0;L;;;;;N;;;;; +198F;NEW TAI LUE LETTER HIGH THA;Lo;0;L;;;;;N;;;;; +1990;NEW TAI LUE LETTER HIGH NA;Lo;0;L;;;;;N;;;;; +1991;NEW TAI LUE LETTER LOW TA;Lo;0;L;;;;;N;;;;; +1992;NEW TAI LUE LETTER LOW THA;Lo;0;L;;;;;N;;;;; +1993;NEW TAI LUE LETTER LOW NA;Lo;0;L;;;;;N;;;;; +1994;NEW TAI LUE LETTER HIGH PA;Lo;0;L;;;;;N;;;;; +1995;NEW TAI LUE LETTER HIGH PHA;Lo;0;L;;;;;N;;;;; +1996;NEW TAI LUE LETTER HIGH MA;Lo;0;L;;;;;N;;;;; +1997;NEW TAI LUE LETTER LOW PA;Lo;0;L;;;;;N;;;;; +1998;NEW TAI LUE LETTER LOW PHA;Lo;0;L;;;;;N;;;;; +1999;NEW TAI LUE LETTER LOW MA;Lo;0;L;;;;;N;;;;; +199A;NEW TAI LUE LETTER HIGH FA;Lo;0;L;;;;;N;;;;; +199B;NEW TAI LUE LETTER HIGH VA;Lo;0;L;;;;;N;;;;; +199C;NEW TAI LUE LETTER HIGH LA;Lo;0;L;;;;;N;;;;; +199D;NEW TAI LUE LETTER LOW FA;Lo;0;L;;;;;N;;;;; +199E;NEW TAI LUE LETTER LOW VA;Lo;0;L;;;;;N;;;;; +199F;NEW TAI LUE LETTER LOW LA;Lo;0;L;;;;;N;;;;; +19A0;NEW TAI LUE LETTER HIGH HA;Lo;0;L;;;;;N;;;;; +19A1;NEW TAI LUE LETTER HIGH DA;Lo;0;L;;;;;N;;;;; +19A2;NEW TAI LUE LETTER HIGH BA;Lo;0;L;;;;;N;;;;; +19A3;NEW TAI LUE LETTER LOW HA;Lo;0;L;;;;;N;;;;; +19A4;NEW TAI LUE LETTER LOW DA;Lo;0;L;;;;;N;;;;; +19A5;NEW TAI LUE LETTER LOW BA;Lo;0;L;;;;;N;;;;; +19A6;NEW TAI LUE LETTER HIGH KVA;Lo;0;L;;;;;N;;;;; +19A7;NEW TAI LUE LETTER HIGH XVA;Lo;0;L;;;;;N;;;;; +19A8;NEW TAI LUE LETTER LOW KVA;Lo;0;L;;;;;N;;;;; +19A9;NEW TAI LUE LETTER LOW XVA;Lo;0;L;;;;;N;;;;; +19AA;NEW TAI LUE LETTER HIGH SUA;Lo;0;L;;;;;N;;;;; +19AB;NEW TAI LUE LETTER LOW SUA;Lo;0;L;;;;;N;;;;; +19B0;NEW TAI LUE VOWEL SIGN VOWEL SHORTENER;Lo;0;L;;;;;N;;;;; +19B1;NEW TAI LUE VOWEL SIGN AA;Lo;0;L;;;;;N;;;;; +19B2;NEW TAI LUE VOWEL SIGN II;Lo;0;L;;;;;N;;;;; +19B3;NEW TAI LUE VOWEL SIGN U;Lo;0;L;;;;;N;;;;; +19B4;NEW TAI LUE VOWEL SIGN UU;Lo;0;L;;;;;N;;;;; +19B5;NEW TAI LUE VOWEL SIGN E;Lo;0;L;;;;;N;;;;; +19B6;NEW TAI LUE VOWEL SIGN AE;Lo;0;L;;;;;N;;;;; +19B7;NEW TAI LUE VOWEL SIGN O;Lo;0;L;;;;;N;;;;; +19B8;NEW TAI LUE VOWEL SIGN OA;Lo;0;L;;;;;N;;;;; +19B9;NEW TAI LUE VOWEL SIGN UE;Lo;0;L;;;;;N;;;;; +19BA;NEW TAI LUE VOWEL SIGN AY;Lo;0;L;;;;;N;;;;; +19BB;NEW TAI LUE VOWEL SIGN AAY;Lo;0;L;;;;;N;;;;; +19BC;NEW TAI LUE VOWEL SIGN UY;Lo;0;L;;;;;N;;;;; +19BD;NEW TAI LUE VOWEL SIGN OY;Lo;0;L;;;;;N;;;;; +19BE;NEW TAI LUE VOWEL SIGN OAY;Lo;0;L;;;;;N;;;;; +19BF;NEW TAI LUE VOWEL SIGN UEY;Lo;0;L;;;;;N;;;;; +19C0;NEW TAI LUE VOWEL SIGN IY;Lo;0;L;;;;;N;;;;; +19C1;NEW TAI LUE LETTER FINAL V;Lo;0;L;;;;;N;;;;; +19C2;NEW TAI LUE LETTER FINAL NG;Lo;0;L;;;;;N;;;;; +19C3;NEW TAI LUE LETTER FINAL N;Lo;0;L;;;;;N;;;;; +19C4;NEW TAI LUE LETTER FINAL M;Lo;0;L;;;;;N;;;;; +19C5;NEW TAI LUE LETTER FINAL K;Lo;0;L;;;;;N;;;;; +19C6;NEW TAI LUE LETTER FINAL D;Lo;0;L;;;;;N;;;;; +19C7;NEW TAI LUE LETTER FINAL B;Lo;0;L;;;;;N;;;;; +19C8;NEW TAI LUE TONE MARK-1;Lo;0;L;;;;;N;;;;; +19C9;NEW TAI LUE TONE MARK-2;Lo;0;L;;;;;N;;;;; +19D0;NEW TAI LUE DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +19D1;NEW TAI LUE DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +19D2;NEW TAI LUE DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +19D3;NEW TAI LUE DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +19D4;NEW TAI LUE DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +19D5;NEW TAI LUE DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +19D6;NEW TAI LUE DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +19D7;NEW TAI LUE DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +19D8;NEW TAI LUE DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +19D9;NEW TAI LUE DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +19DA;NEW TAI LUE THAM DIGIT ONE;No;0;L;;;1;1;N;;;;; +19DE;NEW TAI LUE SIGN LAE;So;0;ON;;;;;N;;;;; +19DF;NEW TAI LUE SIGN LAEV;So;0;ON;;;;;N;;;;; +19E0;KHMER SYMBOL PATHAMASAT;So;0;ON;;;;;N;;;;; +19E1;KHMER SYMBOL MUOY KOET;So;0;ON;;;;;N;;;;; +19E2;KHMER SYMBOL PII KOET;So;0;ON;;;;;N;;;;; +19E3;KHMER SYMBOL BEI KOET;So;0;ON;;;;;N;;;;; +19E4;KHMER SYMBOL BUON KOET;So;0;ON;;;;;N;;;;; +19E5;KHMER SYMBOL PRAM KOET;So;0;ON;;;;;N;;;;; +19E6;KHMER SYMBOL PRAM-MUOY KOET;So;0;ON;;;;;N;;;;; +19E7;KHMER SYMBOL PRAM-PII KOET;So;0;ON;;;;;N;;;;; +19E8;KHMER SYMBOL PRAM-BEI KOET;So;0;ON;;;;;N;;;;; +19E9;KHMER SYMBOL PRAM-BUON KOET;So;0;ON;;;;;N;;;;; +19EA;KHMER SYMBOL DAP KOET;So;0;ON;;;;;N;;;;; +19EB;KHMER SYMBOL DAP-MUOY KOET;So;0;ON;;;;;N;;;;; +19EC;KHMER SYMBOL DAP-PII KOET;So;0;ON;;;;;N;;;;; +19ED;KHMER SYMBOL DAP-BEI KOET;So;0;ON;;;;;N;;;;; +19EE;KHMER SYMBOL DAP-BUON KOET;So;0;ON;;;;;N;;;;; +19EF;KHMER SYMBOL DAP-PRAM KOET;So;0;ON;;;;;N;;;;; +19F0;KHMER SYMBOL TUTEYASAT;So;0;ON;;;;;N;;;;; +19F1;KHMER SYMBOL MUOY ROC;So;0;ON;;;;;N;;;;; +19F2;KHMER SYMBOL PII ROC;So;0;ON;;;;;N;;;;; +19F3;KHMER SYMBOL BEI ROC;So;0;ON;;;;;N;;;;; +19F4;KHMER SYMBOL BUON ROC;So;0;ON;;;;;N;;;;; +19F5;KHMER SYMBOL PRAM ROC;So;0;ON;;;;;N;;;;; +19F6;KHMER SYMBOL PRAM-MUOY ROC;So;0;ON;;;;;N;;;;; +19F7;KHMER SYMBOL PRAM-PII ROC;So;0;ON;;;;;N;;;;; +19F8;KHMER SYMBOL PRAM-BEI ROC;So;0;ON;;;;;N;;;;; +19F9;KHMER SYMBOL PRAM-BUON ROC;So;0;ON;;;;;N;;;;; +19FA;KHMER SYMBOL DAP ROC;So;0;ON;;;;;N;;;;; +19FB;KHMER SYMBOL DAP-MUOY ROC;So;0;ON;;;;;N;;;;; +19FC;KHMER SYMBOL DAP-PII ROC;So;0;ON;;;;;N;;;;; +19FD;KHMER SYMBOL DAP-BEI ROC;So;0;ON;;;;;N;;;;; +19FE;KHMER SYMBOL DAP-BUON ROC;So;0;ON;;;;;N;;;;; +19FF;KHMER SYMBOL DAP-PRAM ROC;So;0;ON;;;;;N;;;;; +1A00;BUGINESE LETTER KA;Lo;0;L;;;;;N;;;;; +1A01;BUGINESE LETTER GA;Lo;0;L;;;;;N;;;;; +1A02;BUGINESE LETTER NGA;Lo;0;L;;;;;N;;;;; +1A03;BUGINESE LETTER NGKA;Lo;0;L;;;;;N;;;;; +1A04;BUGINESE LETTER PA;Lo;0;L;;;;;N;;;;; +1A05;BUGINESE LETTER BA;Lo;0;L;;;;;N;;;;; +1A06;BUGINESE LETTER MA;Lo;0;L;;;;;N;;;;; +1A07;BUGINESE LETTER MPA;Lo;0;L;;;;;N;;;;; +1A08;BUGINESE LETTER TA;Lo;0;L;;;;;N;;;;; +1A09;BUGINESE LETTER DA;Lo;0;L;;;;;N;;;;; +1A0A;BUGINESE LETTER NA;Lo;0;L;;;;;N;;;;; +1A0B;BUGINESE LETTER NRA;Lo;0;L;;;;;N;;;;; +1A0C;BUGINESE LETTER CA;Lo;0;L;;;;;N;;;;; +1A0D;BUGINESE LETTER JA;Lo;0;L;;;;;N;;;;; +1A0E;BUGINESE LETTER NYA;Lo;0;L;;;;;N;;;;; +1A0F;BUGINESE LETTER NYCA;Lo;0;L;;;;;N;;;;; +1A10;BUGINESE LETTER YA;Lo;0;L;;;;;N;;;;; +1A11;BUGINESE LETTER RA;Lo;0;L;;;;;N;;;;; +1A12;BUGINESE LETTER LA;Lo;0;L;;;;;N;;;;; +1A13;BUGINESE LETTER VA;Lo;0;L;;;;;N;;;;; +1A14;BUGINESE LETTER SA;Lo;0;L;;;;;N;;;;; +1A15;BUGINESE LETTER A;Lo;0;L;;;;;N;;;;; +1A16;BUGINESE LETTER HA;Lo;0;L;;;;;N;;;;; +1A17;BUGINESE VOWEL SIGN I;Mn;230;NSM;;;;;N;;;;; +1A18;BUGINESE VOWEL SIGN U;Mn;220;NSM;;;;;N;;;;; +1A19;BUGINESE VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +1A1A;BUGINESE VOWEL SIGN O;Mc;0;L;;;;;N;;;;; +1A1B;BUGINESE VOWEL SIGN AE;Mn;0;NSM;;;;;N;;;;; +1A1E;BUGINESE PALLAWA;Po;0;L;;;;;N;;;;; +1A1F;BUGINESE END OF SECTION;Po;0;L;;;;;N;;;;; +1A20;TAI THAM LETTER HIGH KA;Lo;0;L;;;;;N;;;;; +1A21;TAI THAM LETTER HIGH KHA;Lo;0;L;;;;;N;;;;; +1A22;TAI THAM LETTER HIGH KXA;Lo;0;L;;;;;N;;;;; +1A23;TAI THAM LETTER LOW KA;Lo;0;L;;;;;N;;;;; +1A24;TAI THAM LETTER LOW KXA;Lo;0;L;;;;;N;;;;; +1A25;TAI THAM LETTER LOW KHA;Lo;0;L;;;;;N;;;;; +1A26;TAI THAM LETTER NGA;Lo;0;L;;;;;N;;;;; +1A27;TAI THAM LETTER HIGH CA;Lo;0;L;;;;;N;;;;; +1A28;TAI THAM LETTER HIGH CHA;Lo;0;L;;;;;N;;;;; +1A29;TAI THAM LETTER LOW CA;Lo;0;L;;;;;N;;;;; +1A2A;TAI THAM LETTER LOW SA;Lo;0;L;;;;;N;;;;; +1A2B;TAI THAM LETTER LOW CHA;Lo;0;L;;;;;N;;;;; +1A2C;TAI THAM LETTER NYA;Lo;0;L;;;;;N;;;;; +1A2D;TAI THAM LETTER RATA;Lo;0;L;;;;;N;;;;; +1A2E;TAI THAM LETTER HIGH RATHA;Lo;0;L;;;;;N;;;;; +1A2F;TAI THAM LETTER DA;Lo;0;L;;;;;N;;;;; +1A30;TAI THAM LETTER LOW RATHA;Lo;0;L;;;;;N;;;;; +1A31;TAI THAM LETTER RANA;Lo;0;L;;;;;N;;;;; +1A32;TAI THAM LETTER HIGH TA;Lo;0;L;;;;;N;;;;; +1A33;TAI THAM LETTER HIGH THA;Lo;0;L;;;;;N;;;;; +1A34;TAI THAM LETTER LOW TA;Lo;0;L;;;;;N;;;;; +1A35;TAI THAM LETTER LOW THA;Lo;0;L;;;;;N;;;;; +1A36;TAI THAM LETTER NA;Lo;0;L;;;;;N;;;;; +1A37;TAI THAM LETTER BA;Lo;0;L;;;;;N;;;;; +1A38;TAI THAM LETTER HIGH PA;Lo;0;L;;;;;N;;;;; +1A39;TAI THAM LETTER HIGH PHA;Lo;0;L;;;;;N;;;;; +1A3A;TAI THAM LETTER HIGH FA;Lo;0;L;;;;;N;;;;; +1A3B;TAI THAM LETTER LOW PA;Lo;0;L;;;;;N;;;;; +1A3C;TAI THAM LETTER LOW FA;Lo;0;L;;;;;N;;;;; +1A3D;TAI THAM LETTER LOW PHA;Lo;0;L;;;;;N;;;;; +1A3E;TAI THAM LETTER MA;Lo;0;L;;;;;N;;;;; +1A3F;TAI THAM LETTER LOW YA;Lo;0;L;;;;;N;;;;; +1A40;TAI THAM LETTER HIGH YA;Lo;0;L;;;;;N;;;;; +1A41;TAI THAM LETTER RA;Lo;0;L;;;;;N;;;;; +1A42;TAI THAM LETTER RUE;Lo;0;L;;;;;N;;;;; +1A43;TAI THAM LETTER LA;Lo;0;L;;;;;N;;;;; +1A44;TAI THAM LETTER LUE;Lo;0;L;;;;;N;;;;; +1A45;TAI THAM LETTER WA;Lo;0;L;;;;;N;;;;; +1A46;TAI THAM LETTER HIGH SHA;Lo;0;L;;;;;N;;;;; +1A47;TAI THAM LETTER HIGH SSA;Lo;0;L;;;;;N;;;;; +1A48;TAI THAM LETTER HIGH SA;Lo;0;L;;;;;N;;;;; +1A49;TAI THAM LETTER HIGH HA;Lo;0;L;;;;;N;;;;; +1A4A;TAI THAM LETTER LLA;Lo;0;L;;;;;N;;;;; +1A4B;TAI THAM LETTER A;Lo;0;L;;;;;N;;;;; +1A4C;TAI THAM LETTER LOW HA;Lo;0;L;;;;;N;;;;; +1A4D;TAI THAM LETTER I;Lo;0;L;;;;;N;;;;; +1A4E;TAI THAM LETTER II;Lo;0;L;;;;;N;;;;; +1A4F;TAI THAM LETTER U;Lo;0;L;;;;;N;;;;; +1A50;TAI THAM LETTER UU;Lo;0;L;;;;;N;;;;; +1A51;TAI THAM LETTER EE;Lo;0;L;;;;;N;;;;; +1A52;TAI THAM LETTER OO;Lo;0;L;;;;;N;;;;; +1A53;TAI THAM LETTER LAE;Lo;0;L;;;;;N;;;;; +1A54;TAI THAM LETTER GREAT SA;Lo;0;L;;;;;N;;;;; +1A55;TAI THAM CONSONANT SIGN MEDIAL RA;Mc;0;L;;;;;N;;;;; +1A56;TAI THAM CONSONANT SIGN MEDIAL LA;Mn;0;NSM;;;;;N;;;;; +1A57;TAI THAM CONSONANT SIGN LA TANG LAI;Mc;0;L;;;;;N;;;;; +1A58;TAI THAM SIGN MAI KANG LAI;Mn;0;NSM;;;;;N;;;;; +1A59;TAI THAM CONSONANT SIGN FINAL NGA;Mn;0;NSM;;;;;N;;;;; +1A5A;TAI THAM CONSONANT SIGN LOW PA;Mn;0;NSM;;;;;N;;;;; +1A5B;TAI THAM CONSONANT SIGN HIGH RATHA OR LOW PA;Mn;0;NSM;;;;;N;;;;; +1A5C;TAI THAM CONSONANT SIGN MA;Mn;0;NSM;;;;;N;;;;; +1A5D;TAI THAM CONSONANT SIGN BA;Mn;0;NSM;;;;;N;;;;; +1A5E;TAI THAM CONSONANT SIGN SA;Mn;0;NSM;;;;;N;;;;; +1A60;TAI THAM SIGN SAKOT;Mn;9;NSM;;;;;N;;;;; +1A61;TAI THAM VOWEL SIGN A;Mc;0;L;;;;;N;;;;; +1A62;TAI THAM VOWEL SIGN MAI SAT;Mn;0;NSM;;;;;N;;;;; +1A63;TAI THAM VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +1A64;TAI THAM VOWEL SIGN TALL AA;Mc;0;L;;;;;N;;;;; +1A65;TAI THAM VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +1A66;TAI THAM VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; +1A67;TAI THAM VOWEL SIGN UE;Mn;0;NSM;;;;;N;;;;; +1A68;TAI THAM VOWEL SIGN UUE;Mn;0;NSM;;;;;N;;;;; +1A69;TAI THAM VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +1A6A;TAI THAM VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +1A6B;TAI THAM VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; +1A6C;TAI THAM VOWEL SIGN OA BELOW;Mn;0;NSM;;;;;N;;;;; +1A6D;TAI THAM VOWEL SIGN OY;Mc;0;L;;;;;N;;;;; +1A6E;TAI THAM VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +1A6F;TAI THAM VOWEL SIGN AE;Mc;0;L;;;;;N;;;;; +1A70;TAI THAM VOWEL SIGN OO;Mc;0;L;;;;;N;;;;; +1A71;TAI THAM VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; +1A72;TAI THAM VOWEL SIGN THAM AI;Mc;0;L;;;;;N;;;;; +1A73;TAI THAM VOWEL SIGN OA ABOVE;Mn;0;NSM;;;;;N;;;;; +1A74;TAI THAM SIGN MAI KANG;Mn;0;NSM;;;;;N;;;;; +1A75;TAI THAM SIGN TONE-1;Mn;230;NSM;;;;;N;;;;; +1A76;TAI THAM SIGN TONE-2;Mn;230;NSM;;;;;N;;;;; +1A77;TAI THAM SIGN KHUEN TONE-3;Mn;230;NSM;;;;;N;;;;; +1A78;TAI THAM SIGN KHUEN TONE-4;Mn;230;NSM;;;;;N;;;;; +1A79;TAI THAM SIGN KHUEN TONE-5;Mn;230;NSM;;;;;N;;;;; +1A7A;TAI THAM SIGN RA HAAM;Mn;230;NSM;;;;;N;;;;; +1A7B;TAI THAM SIGN MAI SAM;Mn;230;NSM;;;;;N;;;;; +1A7C;TAI THAM SIGN KHUEN-LUE KARAN;Mn;230;NSM;;;;;N;;;;; +1A7F;TAI THAM COMBINING CRYPTOGRAMMIC DOT;Mn;220;NSM;;;;;N;;;;; +1A80;TAI THAM HORA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +1A81;TAI THAM HORA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +1A82;TAI THAM HORA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +1A83;TAI THAM HORA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +1A84;TAI THAM HORA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +1A85;TAI THAM HORA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +1A86;TAI THAM HORA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +1A87;TAI THAM HORA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +1A88;TAI THAM HORA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +1A89;TAI THAM HORA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +1A90;TAI THAM THAM DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +1A91;TAI THAM THAM DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +1A92;TAI THAM THAM DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +1A93;TAI THAM THAM DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +1A94;TAI THAM THAM DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +1A95;TAI THAM THAM DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +1A96;TAI THAM THAM DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +1A97;TAI THAM THAM DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +1A98;TAI THAM THAM DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +1A99;TAI THAM THAM DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +1AA0;TAI THAM SIGN WIANG;Po;0;L;;;;;N;;;;; +1AA1;TAI THAM SIGN WIANGWAAK;Po;0;L;;;;;N;;;;; +1AA2;TAI THAM SIGN SAWAN;Po;0;L;;;;;N;;;;; +1AA3;TAI THAM SIGN KEOW;Po;0;L;;;;;N;;;;; +1AA4;TAI THAM SIGN HOY;Po;0;L;;;;;N;;;;; +1AA5;TAI THAM SIGN DOKMAI;Po;0;L;;;;;N;;;;; +1AA6;TAI THAM SIGN REVERSED ROTATED RANA;Po;0;L;;;;;N;;;;; +1AA7;TAI THAM SIGN MAI YAMOK;Lm;0;L;;;;;N;;;;; +1AA8;TAI THAM SIGN KAAN;Po;0;L;;;;;N;;;;; +1AA9;TAI THAM SIGN KAANKUU;Po;0;L;;;;;N;;;;; +1AAA;TAI THAM SIGN SATKAAN;Po;0;L;;;;;N;;;;; +1AAB;TAI THAM SIGN SATKAANKUU;Po;0;L;;;;;N;;;;; +1AAC;TAI THAM SIGN HANG;Po;0;L;;;;;N;;;;; +1AAD;TAI THAM SIGN CAANG;Po;0;L;;;;;N;;;;; +1AB0;COMBINING DOUBLED CIRCUMFLEX ACCENT;Mn;230;NSM;;;;;N;;;;; +1AB1;COMBINING DIAERESIS-RING;Mn;230;NSM;;;;;N;;;;; +1AB2;COMBINING INFINITY;Mn;230;NSM;;;;;N;;;;; +1AB3;COMBINING DOWNWARDS ARROW;Mn;230;NSM;;;;;N;;;;; +1AB4;COMBINING TRIPLE DOT;Mn;230;NSM;;;;;N;;;;; +1AB5;COMBINING X-X BELOW;Mn;220;NSM;;;;;N;;;;; +1AB6;COMBINING WIGGLY LINE BELOW;Mn;220;NSM;;;;;N;;;;; +1AB7;COMBINING OPEN MARK BELOW;Mn;220;NSM;;;;;N;;;;; +1AB8;COMBINING DOUBLE OPEN MARK BELOW;Mn;220;NSM;;;;;N;;;;; +1AB9;COMBINING LIGHT CENTRALIZATION STROKE BELOW;Mn;220;NSM;;;;;N;;;;; +1ABA;COMBINING STRONG CENTRALIZATION STROKE BELOW;Mn;220;NSM;;;;;N;;;;; +1ABB;COMBINING PARENTHESES ABOVE;Mn;230;NSM;;;;;N;;;;; +1ABC;COMBINING DOUBLE PARENTHESES ABOVE;Mn;230;NSM;;;;;N;;;;; +1ABD;COMBINING PARENTHESES BELOW;Mn;220;NSM;;;;;N;;;;; +1ABE;COMBINING PARENTHESES OVERLAY;Me;0;NSM;;;;;N;;;;; +1B00;BALINESE SIGN ULU RICEM;Mn;0;NSM;;;;;N;;;;; +1B01;BALINESE SIGN ULU CANDRA;Mn;0;NSM;;;;;N;;;;; +1B02;BALINESE SIGN CECEK;Mn;0;NSM;;;;;N;;;;; +1B03;BALINESE SIGN SURANG;Mn;0;NSM;;;;;N;;;;; +1B04;BALINESE SIGN BISAH;Mc;0;L;;;;;N;;;;; +1B05;BALINESE LETTER AKARA;Lo;0;L;;;;;N;;;;; +1B06;BALINESE LETTER AKARA TEDUNG;Lo;0;L;1B05 1B35;;;;N;;;;; +1B07;BALINESE LETTER IKARA;Lo;0;L;;;;;N;;;;; +1B08;BALINESE LETTER IKARA TEDUNG;Lo;0;L;1B07 1B35;;;;N;;;;; +1B09;BALINESE LETTER UKARA;Lo;0;L;;;;;N;;;;; +1B0A;BALINESE LETTER UKARA TEDUNG;Lo;0;L;1B09 1B35;;;;N;;;;; +1B0B;BALINESE LETTER RA REPA;Lo;0;L;;;;;N;;;;; +1B0C;BALINESE LETTER RA REPA TEDUNG;Lo;0;L;1B0B 1B35;;;;N;;;;; +1B0D;BALINESE LETTER LA LENGA;Lo;0;L;;;;;N;;;;; +1B0E;BALINESE LETTER LA LENGA TEDUNG;Lo;0;L;1B0D 1B35;;;;N;;;;; +1B0F;BALINESE LETTER EKARA;Lo;0;L;;;;;N;;;;; +1B10;BALINESE LETTER AIKARA;Lo;0;L;;;;;N;;;;; +1B11;BALINESE LETTER OKARA;Lo;0;L;;;;;N;;;;; +1B12;BALINESE LETTER OKARA TEDUNG;Lo;0;L;1B11 1B35;;;;N;;;;; +1B13;BALINESE LETTER KA;Lo;0;L;;;;;N;;;;; +1B14;BALINESE LETTER KA MAHAPRANA;Lo;0;L;;;;;N;;;;; +1B15;BALINESE LETTER GA;Lo;0;L;;;;;N;;;;; +1B16;BALINESE LETTER GA GORA;Lo;0;L;;;;;N;;;;; +1B17;BALINESE LETTER NGA;Lo;0;L;;;;;N;;;;; +1B18;BALINESE LETTER CA;Lo;0;L;;;;;N;;;;; +1B19;BALINESE LETTER CA LACA;Lo;0;L;;;;;N;;;;; +1B1A;BALINESE LETTER JA;Lo;0;L;;;;;N;;;;; +1B1B;BALINESE LETTER JA JERA;Lo;0;L;;;;;N;;;;; +1B1C;BALINESE LETTER NYA;Lo;0;L;;;;;N;;;;; +1B1D;BALINESE LETTER TA LATIK;Lo;0;L;;;;;N;;;;; +1B1E;BALINESE LETTER TA MURDA MAHAPRANA;Lo;0;L;;;;;N;;;;; +1B1F;BALINESE LETTER DA MURDA ALPAPRANA;Lo;0;L;;;;;N;;;;; +1B20;BALINESE LETTER DA MURDA MAHAPRANA;Lo;0;L;;;;;N;;;;; +1B21;BALINESE LETTER NA RAMBAT;Lo;0;L;;;;;N;;;;; +1B22;BALINESE LETTER TA;Lo;0;L;;;;;N;;;;; +1B23;BALINESE LETTER TA TAWA;Lo;0;L;;;;;N;;;;; +1B24;BALINESE LETTER DA;Lo;0;L;;;;;N;;;;; +1B25;BALINESE LETTER DA MADU;Lo;0;L;;;;;N;;;;; +1B26;BALINESE LETTER NA;Lo;0;L;;;;;N;;;;; +1B27;BALINESE LETTER PA;Lo;0;L;;;;;N;;;;; +1B28;BALINESE LETTER PA KAPAL;Lo;0;L;;;;;N;;;;; +1B29;BALINESE LETTER BA;Lo;0;L;;;;;N;;;;; +1B2A;BALINESE LETTER BA KEMBANG;Lo;0;L;;;;;N;;;;; +1B2B;BALINESE LETTER MA;Lo;0;L;;;;;N;;;;; +1B2C;BALINESE LETTER YA;Lo;0;L;;;;;N;;;;; +1B2D;BALINESE LETTER RA;Lo;0;L;;;;;N;;;;; +1B2E;BALINESE LETTER LA;Lo;0;L;;;;;N;;;;; +1B2F;BALINESE LETTER WA;Lo;0;L;;;;;N;;;;; +1B30;BALINESE LETTER SA SAGA;Lo;0;L;;;;;N;;;;; +1B31;BALINESE LETTER SA SAPA;Lo;0;L;;;;;N;;;;; +1B32;BALINESE LETTER SA;Lo;0;L;;;;;N;;;;; +1B33;BALINESE LETTER HA;Lo;0;L;;;;;N;;;;; +1B34;BALINESE SIGN REREKAN;Mn;7;NSM;;;;;N;;;;; +1B35;BALINESE VOWEL SIGN TEDUNG;Mc;0;L;;;;;N;;;;; +1B36;BALINESE VOWEL SIGN ULU;Mn;0;NSM;;;;;N;;;;; +1B37;BALINESE VOWEL SIGN ULU SARI;Mn;0;NSM;;;;;N;;;;; +1B38;BALINESE VOWEL SIGN SUKU;Mn;0;NSM;;;;;N;;;;; +1B39;BALINESE VOWEL SIGN SUKU ILUT;Mn;0;NSM;;;;;N;;;;; +1B3A;BALINESE VOWEL SIGN RA REPA;Mn;0;NSM;;;;;N;;;;; +1B3B;BALINESE VOWEL SIGN RA REPA TEDUNG;Mc;0;L;1B3A 1B35;;;;N;;;;; +1B3C;BALINESE VOWEL SIGN LA LENGA;Mn;0;NSM;;;;;N;;;;; +1B3D;BALINESE VOWEL SIGN LA LENGA TEDUNG;Mc;0;L;1B3C 1B35;;;;N;;;;; +1B3E;BALINESE VOWEL SIGN TALING;Mc;0;L;;;;;N;;;;; +1B3F;BALINESE VOWEL SIGN TALING REPA;Mc;0;L;;;;;N;;;;; +1B40;BALINESE VOWEL SIGN TALING TEDUNG;Mc;0;L;1B3E 1B35;;;;N;;;;; +1B41;BALINESE VOWEL SIGN TALING REPA TEDUNG;Mc;0;L;1B3F 1B35;;;;N;;;;; +1B42;BALINESE VOWEL SIGN PEPET;Mn;0;NSM;;;;;N;;;;; +1B43;BALINESE VOWEL SIGN PEPET TEDUNG;Mc;0;L;1B42 1B35;;;;N;;;;; +1B44;BALINESE ADEG ADEG;Mc;9;L;;;;;N;;;;; +1B45;BALINESE LETTER KAF SASAK;Lo;0;L;;;;;N;;;;; +1B46;BALINESE LETTER KHOT SASAK;Lo;0;L;;;;;N;;;;; +1B47;BALINESE LETTER TZIR SASAK;Lo;0;L;;;;;N;;;;; +1B48;BALINESE LETTER EF SASAK;Lo;0;L;;;;;N;;;;; +1B49;BALINESE LETTER VE SASAK;Lo;0;L;;;;;N;;;;; +1B4A;BALINESE LETTER ZAL SASAK;Lo;0;L;;;;;N;;;;; +1B4B;BALINESE LETTER ASYURA SASAK;Lo;0;L;;;;;N;;;;; +1B50;BALINESE DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +1B51;BALINESE DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +1B52;BALINESE DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +1B53;BALINESE DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +1B54;BALINESE DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +1B55;BALINESE DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +1B56;BALINESE DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +1B57;BALINESE DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +1B58;BALINESE DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +1B59;BALINESE DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +1B5A;BALINESE PANTI;Po;0;L;;;;;N;;;;; +1B5B;BALINESE PAMADA;Po;0;L;;;;;N;;;;; +1B5C;BALINESE WINDU;Po;0;L;;;;;N;;;;; +1B5D;BALINESE CARIK PAMUNGKAH;Po;0;L;;;;;N;;;;; +1B5E;BALINESE CARIK SIKI;Po;0;L;;;;;N;;;;; +1B5F;BALINESE CARIK PAREREN;Po;0;L;;;;;N;;;;; +1B60;BALINESE PAMENENG;Po;0;L;;;;;N;;;;; +1B61;BALINESE MUSICAL SYMBOL DONG;So;0;L;;;;;N;;;;; +1B62;BALINESE MUSICAL SYMBOL DENG;So;0;L;;;;;N;;;;; +1B63;BALINESE MUSICAL SYMBOL DUNG;So;0;L;;;;;N;;;;; +1B64;BALINESE MUSICAL SYMBOL DANG;So;0;L;;;;;N;;;;; +1B65;BALINESE MUSICAL SYMBOL DANG SURANG;So;0;L;;;;;N;;;;; +1B66;BALINESE MUSICAL SYMBOL DING;So;0;L;;;;;N;;;;; +1B67;BALINESE MUSICAL SYMBOL DAENG;So;0;L;;;;;N;;;;; +1B68;BALINESE MUSICAL SYMBOL DEUNG;So;0;L;;;;;N;;;;; +1B69;BALINESE MUSICAL SYMBOL DAING;So;0;L;;;;;N;;;;; +1B6A;BALINESE MUSICAL SYMBOL DANG GEDE;So;0;L;;;;;N;;;;; +1B6B;BALINESE MUSICAL SYMBOL COMBINING TEGEH;Mn;230;NSM;;;;;N;;;;; +1B6C;BALINESE MUSICAL SYMBOL COMBINING ENDEP;Mn;220;NSM;;;;;N;;;;; +1B6D;BALINESE MUSICAL SYMBOL COMBINING KEMPUL;Mn;230;NSM;;;;;N;;;;; +1B6E;BALINESE MUSICAL SYMBOL COMBINING KEMPLI;Mn;230;NSM;;;;;N;;;;; +1B6F;BALINESE MUSICAL SYMBOL COMBINING JEGOGAN;Mn;230;NSM;;;;;N;;;;; +1B70;BALINESE MUSICAL SYMBOL COMBINING KEMPUL WITH JEGOGAN;Mn;230;NSM;;;;;N;;;;; +1B71;BALINESE MUSICAL SYMBOL COMBINING KEMPLI WITH JEGOGAN;Mn;230;NSM;;;;;N;;;;; +1B72;BALINESE MUSICAL SYMBOL COMBINING BENDE;Mn;230;NSM;;;;;N;;;;; +1B73;BALINESE MUSICAL SYMBOL COMBINING GONG;Mn;230;NSM;;;;;N;;;;; +1B74;BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DUG;So;0;L;;;;;N;;;;; +1B75;BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DAG;So;0;L;;;;;N;;;;; +1B76;BALINESE MUSICAL SYMBOL RIGHT-HAND CLOSED TUK;So;0;L;;;;;N;;;;; +1B77;BALINESE MUSICAL SYMBOL RIGHT-HAND CLOSED TAK;So;0;L;;;;;N;;;;; +1B78;BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PANG;So;0;L;;;;;N;;;;; +1B79;BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PUNG;So;0;L;;;;;N;;;;; +1B7A;BALINESE MUSICAL SYMBOL LEFT-HAND CLOSED PLAK;So;0;L;;;;;N;;;;; +1B7B;BALINESE MUSICAL SYMBOL LEFT-HAND CLOSED PLUK;So;0;L;;;;;N;;;;; +1B7C;BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PING;So;0;L;;;;;N;;;;; +1B80;SUNDANESE SIGN PANYECEK;Mn;0;NSM;;;;;N;;;;; +1B81;SUNDANESE SIGN PANGLAYAR;Mn;0;NSM;;;;;N;;;;; +1B82;SUNDANESE SIGN PANGWISAD;Mc;0;L;;;;;N;;;;; +1B83;SUNDANESE LETTER A;Lo;0;L;;;;;N;;;;; +1B84;SUNDANESE LETTER I;Lo;0;L;;;;;N;;;;; +1B85;SUNDANESE LETTER U;Lo;0;L;;;;;N;;;;; +1B86;SUNDANESE LETTER AE;Lo;0;L;;;;;N;;;;; +1B87;SUNDANESE LETTER O;Lo;0;L;;;;;N;;;;; +1B88;SUNDANESE LETTER E;Lo;0;L;;;;;N;;;;; +1B89;SUNDANESE LETTER EU;Lo;0;L;;;;;N;;;;; +1B8A;SUNDANESE LETTER KA;Lo;0;L;;;;;N;;;;; +1B8B;SUNDANESE LETTER QA;Lo;0;L;;;;;N;;;;; +1B8C;SUNDANESE LETTER GA;Lo;0;L;;;;;N;;;;; +1B8D;SUNDANESE LETTER NGA;Lo;0;L;;;;;N;;;;; +1B8E;SUNDANESE LETTER CA;Lo;0;L;;;;;N;;;;; +1B8F;SUNDANESE LETTER JA;Lo;0;L;;;;;N;;;;; +1B90;SUNDANESE LETTER ZA;Lo;0;L;;;;;N;;;;; +1B91;SUNDANESE LETTER NYA;Lo;0;L;;;;;N;;;;; +1B92;SUNDANESE LETTER TA;Lo;0;L;;;;;N;;;;; +1B93;SUNDANESE LETTER DA;Lo;0;L;;;;;N;;;;; +1B94;SUNDANESE LETTER NA;Lo;0;L;;;;;N;;;;; +1B95;SUNDANESE LETTER PA;Lo;0;L;;;;;N;;;;; +1B96;SUNDANESE LETTER FA;Lo;0;L;;;;;N;;;;; +1B97;SUNDANESE LETTER VA;Lo;0;L;;;;;N;;;;; +1B98;SUNDANESE LETTER BA;Lo;0;L;;;;;N;;;;; +1B99;SUNDANESE LETTER MA;Lo;0;L;;;;;N;;;;; +1B9A;SUNDANESE LETTER YA;Lo;0;L;;;;;N;;;;; +1B9B;SUNDANESE LETTER RA;Lo;0;L;;;;;N;;;;; +1B9C;SUNDANESE LETTER LA;Lo;0;L;;;;;N;;;;; +1B9D;SUNDANESE LETTER WA;Lo;0;L;;;;;N;;;;; +1B9E;SUNDANESE LETTER SA;Lo;0;L;;;;;N;;;;; +1B9F;SUNDANESE LETTER XA;Lo;0;L;;;;;N;;;;; +1BA0;SUNDANESE LETTER HA;Lo;0;L;;;;;N;;;;; +1BA1;SUNDANESE CONSONANT SIGN PAMINGKAL;Mc;0;L;;;;;N;;;;; +1BA2;SUNDANESE CONSONANT SIGN PANYAKRA;Mn;0;NSM;;;;;N;;;;; +1BA3;SUNDANESE CONSONANT SIGN PANYIKU;Mn;0;NSM;;;;;N;;;;; +1BA4;SUNDANESE VOWEL SIGN PANGHULU;Mn;0;NSM;;;;;N;;;;; +1BA5;SUNDANESE VOWEL SIGN PANYUKU;Mn;0;NSM;;;;;N;;;;; +1BA6;SUNDANESE VOWEL SIGN PANAELAENG;Mc;0;L;;;;;N;;;;; +1BA7;SUNDANESE VOWEL SIGN PANOLONG;Mc;0;L;;;;;N;;;;; +1BA8;SUNDANESE VOWEL SIGN PAMEPET;Mn;0;NSM;;;;;N;;;;; +1BA9;SUNDANESE VOWEL SIGN PANEULEUNG;Mn;0;NSM;;;;;N;;;;; +1BAA;SUNDANESE SIGN PAMAAEH;Mc;9;L;;;;;N;;;;; +1BAB;SUNDANESE SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +1BAC;SUNDANESE CONSONANT SIGN PASANGAN MA;Mn;0;NSM;;;;;N;;;;; +1BAD;SUNDANESE CONSONANT SIGN PASANGAN WA;Mn;0;NSM;;;;;N;;;;; +1BAE;SUNDANESE LETTER KHA;Lo;0;L;;;;;N;;;;; +1BAF;SUNDANESE LETTER SYA;Lo;0;L;;;;;N;;;;; +1BB0;SUNDANESE DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +1BB1;SUNDANESE DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +1BB2;SUNDANESE DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +1BB3;SUNDANESE DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +1BB4;SUNDANESE DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +1BB5;SUNDANESE DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +1BB6;SUNDANESE DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +1BB7;SUNDANESE DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +1BB8;SUNDANESE DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +1BB9;SUNDANESE DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +1BBA;SUNDANESE AVAGRAHA;Lo;0;L;;;;;N;;;;; +1BBB;SUNDANESE LETTER REU;Lo;0;L;;;;;N;;;;; +1BBC;SUNDANESE LETTER LEU;Lo;0;L;;;;;N;;;;; +1BBD;SUNDANESE LETTER BHA;Lo;0;L;;;;;N;;;;; +1BBE;SUNDANESE LETTER FINAL K;Lo;0;L;;;;;N;;;;; +1BBF;SUNDANESE LETTER FINAL M;Lo;0;L;;;;;N;;;;; +1BC0;BATAK LETTER A;Lo;0;L;;;;;N;;;;; +1BC1;BATAK LETTER SIMALUNGUN A;Lo;0;L;;;;;N;;;;; +1BC2;BATAK LETTER HA;Lo;0;L;;;;;N;;;;; +1BC3;BATAK LETTER SIMALUNGUN HA;Lo;0;L;;;;;N;;;;; +1BC4;BATAK LETTER MANDAILING HA;Lo;0;L;;;;;N;;;;; +1BC5;BATAK LETTER BA;Lo;0;L;;;;;N;;;;; +1BC6;BATAK LETTER KARO BA;Lo;0;L;;;;;N;;;;; +1BC7;BATAK LETTER PA;Lo;0;L;;;;;N;;;;; +1BC8;BATAK LETTER SIMALUNGUN PA;Lo;0;L;;;;;N;;;;; +1BC9;BATAK LETTER NA;Lo;0;L;;;;;N;;;;; +1BCA;BATAK LETTER MANDAILING NA;Lo;0;L;;;;;N;;;;; +1BCB;BATAK LETTER WA;Lo;0;L;;;;;N;;;;; +1BCC;BATAK LETTER SIMALUNGUN WA;Lo;0;L;;;;;N;;;;; +1BCD;BATAK LETTER PAKPAK WA;Lo;0;L;;;;;N;;;;; +1BCE;BATAK LETTER GA;Lo;0;L;;;;;N;;;;; +1BCF;BATAK LETTER SIMALUNGUN GA;Lo;0;L;;;;;N;;;;; +1BD0;BATAK LETTER JA;Lo;0;L;;;;;N;;;;; +1BD1;BATAK LETTER DA;Lo;0;L;;;;;N;;;;; +1BD2;BATAK LETTER RA;Lo;0;L;;;;;N;;;;; +1BD3;BATAK LETTER SIMALUNGUN RA;Lo;0;L;;;;;N;;;;; +1BD4;BATAK LETTER MA;Lo;0;L;;;;;N;;;;; +1BD5;BATAK LETTER SIMALUNGUN MA;Lo;0;L;;;;;N;;;;; +1BD6;BATAK LETTER SOUTHERN TA;Lo;0;L;;;;;N;;;;; +1BD7;BATAK LETTER NORTHERN TA;Lo;0;L;;;;;N;;;;; +1BD8;BATAK LETTER SA;Lo;0;L;;;;;N;;;;; +1BD9;BATAK LETTER SIMALUNGUN SA;Lo;0;L;;;;;N;;;;; +1BDA;BATAK LETTER MANDAILING SA;Lo;0;L;;;;;N;;;;; +1BDB;BATAK LETTER YA;Lo;0;L;;;;;N;;;;; +1BDC;BATAK LETTER SIMALUNGUN YA;Lo;0;L;;;;;N;;;;; +1BDD;BATAK LETTER NGA;Lo;0;L;;;;;N;;;;; +1BDE;BATAK LETTER LA;Lo;0;L;;;;;N;;;;; +1BDF;BATAK LETTER SIMALUNGUN LA;Lo;0;L;;;;;N;;;;; +1BE0;BATAK LETTER NYA;Lo;0;L;;;;;N;;;;; +1BE1;BATAK LETTER CA;Lo;0;L;;;;;N;;;;; +1BE2;BATAK LETTER NDA;Lo;0;L;;;;;N;;;;; +1BE3;BATAK LETTER MBA;Lo;0;L;;;;;N;;;;; +1BE4;BATAK LETTER I;Lo;0;L;;;;;N;;;;; +1BE5;BATAK LETTER U;Lo;0;L;;;;;N;;;;; +1BE6;BATAK SIGN TOMPI;Mn;7;NSM;;;;;N;;;;; +1BE7;BATAK VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +1BE8;BATAK VOWEL SIGN PAKPAK E;Mn;0;NSM;;;;;N;;;;; +1BE9;BATAK VOWEL SIGN EE;Mn;0;NSM;;;;;N;;;;; +1BEA;BATAK VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +1BEB;BATAK VOWEL SIGN KARO I;Mc;0;L;;;;;N;;;;; +1BEC;BATAK VOWEL SIGN O;Mc;0;L;;;;;N;;;;; +1BED;BATAK VOWEL SIGN KARO O;Mn;0;NSM;;;;;N;;;;; +1BEE;BATAK VOWEL SIGN U;Mc;0;L;;;;;N;;;;; +1BEF;BATAK VOWEL SIGN U FOR SIMALUNGUN SA;Mn;0;NSM;;;;;N;;;;; +1BF0;BATAK CONSONANT SIGN NG;Mn;0;NSM;;;;;N;;;;; +1BF1;BATAK CONSONANT SIGN H;Mn;0;NSM;;;;;N;;;;; +1BF2;BATAK PANGOLAT;Mc;9;L;;;;;N;;;;; +1BF3;BATAK PANONGONAN;Mc;9;L;;;;;N;;;;; +1BFC;BATAK SYMBOL BINDU NA METEK;Po;0;L;;;;;N;;;;; +1BFD;BATAK SYMBOL BINDU PINARBORAS;Po;0;L;;;;;N;;;;; +1BFE;BATAK SYMBOL BINDU JUDUL;Po;0;L;;;;;N;;;;; +1BFF;BATAK SYMBOL BINDU PANGOLAT;Po;0;L;;;;;N;;;;; +1C00;LEPCHA LETTER KA;Lo;0;L;;;;;N;;;;; +1C01;LEPCHA LETTER KLA;Lo;0;L;;;;;N;;;;; +1C02;LEPCHA LETTER KHA;Lo;0;L;;;;;N;;;;; +1C03;LEPCHA LETTER GA;Lo;0;L;;;;;N;;;;; +1C04;LEPCHA LETTER GLA;Lo;0;L;;;;;N;;;;; +1C05;LEPCHA LETTER NGA;Lo;0;L;;;;;N;;;;; +1C06;LEPCHA LETTER CA;Lo;0;L;;;;;N;;;;; +1C07;LEPCHA LETTER CHA;Lo;0;L;;;;;N;;;;; +1C08;LEPCHA LETTER JA;Lo;0;L;;;;;N;;;;; +1C09;LEPCHA LETTER NYA;Lo;0;L;;;;;N;;;;; +1C0A;LEPCHA LETTER TA;Lo;0;L;;;;;N;;;;; +1C0B;LEPCHA LETTER THA;Lo;0;L;;;;;N;;;;; +1C0C;LEPCHA LETTER DA;Lo;0;L;;;;;N;;;;; +1C0D;LEPCHA LETTER NA;Lo;0;L;;;;;N;;;;; +1C0E;LEPCHA LETTER PA;Lo;0;L;;;;;N;;;;; +1C0F;LEPCHA LETTER PLA;Lo;0;L;;;;;N;;;;; +1C10;LEPCHA LETTER PHA;Lo;0;L;;;;;N;;;;; +1C11;LEPCHA LETTER FA;Lo;0;L;;;;;N;;;;; +1C12;LEPCHA LETTER FLA;Lo;0;L;;;;;N;;;;; +1C13;LEPCHA LETTER BA;Lo;0;L;;;;;N;;;;; +1C14;LEPCHA LETTER BLA;Lo;0;L;;;;;N;;;;; +1C15;LEPCHA LETTER MA;Lo;0;L;;;;;N;;;;; +1C16;LEPCHA LETTER MLA;Lo;0;L;;;;;N;;;;; +1C17;LEPCHA LETTER TSA;Lo;0;L;;;;;N;;;;; +1C18;LEPCHA LETTER TSHA;Lo;0;L;;;;;N;;;;; +1C19;LEPCHA LETTER DZA;Lo;0;L;;;;;N;;;;; +1C1A;LEPCHA LETTER YA;Lo;0;L;;;;;N;;;;; +1C1B;LEPCHA LETTER RA;Lo;0;L;;;;;N;;;;; +1C1C;LEPCHA LETTER LA;Lo;0;L;;;;;N;;;;; +1C1D;LEPCHA LETTER HA;Lo;0;L;;;;;N;;;;; +1C1E;LEPCHA LETTER HLA;Lo;0;L;;;;;N;;;;; +1C1F;LEPCHA LETTER VA;Lo;0;L;;;;;N;;;;; +1C20;LEPCHA LETTER SA;Lo;0;L;;;;;N;;;;; +1C21;LEPCHA LETTER SHA;Lo;0;L;;;;;N;;;;; +1C22;LEPCHA LETTER WA;Lo;0;L;;;;;N;;;;; +1C23;LEPCHA LETTER A;Lo;0;L;;;;;N;;;;; +1C24;LEPCHA SUBJOINED LETTER YA;Mc;0;L;;;;;N;;;;; +1C25;LEPCHA SUBJOINED LETTER RA;Mc;0;L;;;;;N;;;;; +1C26;LEPCHA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +1C27;LEPCHA VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +1C28;LEPCHA VOWEL SIGN O;Mc;0;L;;;;;N;;;;; +1C29;LEPCHA VOWEL SIGN OO;Mc;0;L;;;;;N;;;;; +1C2A;LEPCHA VOWEL SIGN U;Mc;0;L;;;;;N;;;;; +1C2B;LEPCHA VOWEL SIGN UU;Mc;0;L;;;;;N;;;;; +1C2C;LEPCHA VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +1C2D;LEPCHA CONSONANT SIGN K;Mn;0;NSM;;;;;N;;;;; +1C2E;LEPCHA CONSONANT SIGN M;Mn;0;NSM;;;;;N;;;;; +1C2F;LEPCHA CONSONANT SIGN L;Mn;0;NSM;;;;;N;;;;; +1C30;LEPCHA CONSONANT SIGN N;Mn;0;NSM;;;;;N;;;;; +1C31;LEPCHA CONSONANT SIGN P;Mn;0;NSM;;;;;N;;;;; +1C32;LEPCHA CONSONANT SIGN R;Mn;0;NSM;;;;;N;;;;; +1C33;LEPCHA CONSONANT SIGN T;Mn;0;NSM;;;;;N;;;;; +1C34;LEPCHA CONSONANT SIGN NYIN-DO;Mc;0;L;;;;;N;;;;; +1C35;LEPCHA CONSONANT SIGN KANG;Mc;0;L;;;;;N;;;;; +1C36;LEPCHA SIGN RAN;Mn;0;NSM;;;;;N;;;;; +1C37;LEPCHA SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +1C3B;LEPCHA PUNCTUATION TA-ROL;Po;0;L;;;;;N;;;;; +1C3C;LEPCHA PUNCTUATION NYET THYOOM TA-ROL;Po;0;L;;;;;N;;;;; +1C3D;LEPCHA PUNCTUATION CER-WA;Po;0;L;;;;;N;;;;; +1C3E;LEPCHA PUNCTUATION TSHOOK CER-WA;Po;0;L;;;;;N;;;;; +1C3F;LEPCHA PUNCTUATION TSHOOK;Po;0;L;;;;;N;;;;; +1C40;LEPCHA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +1C41;LEPCHA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +1C42;LEPCHA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +1C43;LEPCHA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +1C44;LEPCHA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +1C45;LEPCHA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +1C46;LEPCHA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +1C47;LEPCHA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +1C48;LEPCHA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +1C49;LEPCHA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +1C4D;LEPCHA LETTER TTA;Lo;0;L;;;;;N;;;;; +1C4E;LEPCHA LETTER TTHA;Lo;0;L;;;;;N;;;;; +1C4F;LEPCHA LETTER DDA;Lo;0;L;;;;;N;;;;; +1C50;OL CHIKI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +1C51;OL CHIKI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +1C52;OL CHIKI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +1C53;OL CHIKI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +1C54;OL CHIKI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +1C55;OL CHIKI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +1C56;OL CHIKI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +1C57;OL CHIKI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +1C58;OL CHIKI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +1C59;OL CHIKI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +1C5A;OL CHIKI LETTER LA;Lo;0;L;;;;;N;;;;; +1C5B;OL CHIKI LETTER AT;Lo;0;L;;;;;N;;;;; +1C5C;OL CHIKI LETTER AG;Lo;0;L;;;;;N;;;;; +1C5D;OL CHIKI LETTER ANG;Lo;0;L;;;;;N;;;;; +1C5E;OL CHIKI LETTER AL;Lo;0;L;;;;;N;;;;; +1C5F;OL CHIKI LETTER LAA;Lo;0;L;;;;;N;;;;; +1C60;OL CHIKI LETTER AAK;Lo;0;L;;;;;N;;;;; +1C61;OL CHIKI LETTER AAJ;Lo;0;L;;;;;N;;;;; +1C62;OL CHIKI LETTER AAM;Lo;0;L;;;;;N;;;;; +1C63;OL CHIKI LETTER AAW;Lo;0;L;;;;;N;;;;; +1C64;OL CHIKI LETTER LI;Lo;0;L;;;;;N;;;;; +1C65;OL CHIKI LETTER IS;Lo;0;L;;;;;N;;;;; +1C66;OL CHIKI LETTER IH;Lo;0;L;;;;;N;;;;; +1C67;OL CHIKI LETTER INY;Lo;0;L;;;;;N;;;;; +1C68;OL CHIKI LETTER IR;Lo;0;L;;;;;N;;;;; +1C69;OL CHIKI LETTER LU;Lo;0;L;;;;;N;;;;; +1C6A;OL CHIKI LETTER UC;Lo;0;L;;;;;N;;;;; +1C6B;OL CHIKI LETTER UD;Lo;0;L;;;;;N;;;;; +1C6C;OL CHIKI LETTER UNN;Lo;0;L;;;;;N;;;;; +1C6D;OL CHIKI LETTER UY;Lo;0;L;;;;;N;;;;; +1C6E;OL CHIKI LETTER LE;Lo;0;L;;;;;N;;;;; +1C6F;OL CHIKI LETTER EP;Lo;0;L;;;;;N;;;;; +1C70;OL CHIKI LETTER EDD;Lo;0;L;;;;;N;;;;; +1C71;OL CHIKI LETTER EN;Lo;0;L;;;;;N;;;;; +1C72;OL CHIKI LETTER ERR;Lo;0;L;;;;;N;;;;; +1C73;OL CHIKI LETTER LO;Lo;0;L;;;;;N;;;;; +1C74;OL CHIKI LETTER OTT;Lo;0;L;;;;;N;;;;; +1C75;OL CHIKI LETTER OB;Lo;0;L;;;;;N;;;;; +1C76;OL CHIKI LETTER OV;Lo;0;L;;;;;N;;;;; +1C77;OL CHIKI LETTER OH;Lo;0;L;;;;;N;;;;; +1C78;OL CHIKI MU TTUDDAG;Lm;0;L;;;;;N;;;;; +1C79;OL CHIKI GAAHLAA TTUDDAAG;Lm;0;L;;;;;N;;;;; +1C7A;OL CHIKI MU-GAAHLAA TTUDDAAG;Lm;0;L;;;;;N;;;;; +1C7B;OL CHIKI RELAA;Lm;0;L;;;;;N;;;;; +1C7C;OL CHIKI PHAARKAA;Lm;0;L;;;;;N;;;;; +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 +1C90;GEORGIAN MTAVRULI CAPITAL LETTER AN;Lu;0;L;;;;;N;;;;10D0; +1C91;GEORGIAN MTAVRULI CAPITAL LETTER BAN;Lu;0;L;;;;;N;;;;10D1; +1C92;GEORGIAN MTAVRULI CAPITAL LETTER GAN;Lu;0;L;;;;;N;;;;10D2; +1C93;GEORGIAN MTAVRULI CAPITAL LETTER DON;Lu;0;L;;;;;N;;;;10D3; +1C94;GEORGIAN MTAVRULI CAPITAL LETTER EN;Lu;0;L;;;;;N;;;;10D4; +1C95;GEORGIAN MTAVRULI CAPITAL LETTER VIN;Lu;0;L;;;;;N;;;;10D5; +1C96;GEORGIAN MTAVRULI CAPITAL LETTER ZEN;Lu;0;L;;;;;N;;;;10D6; +1C97;GEORGIAN MTAVRULI CAPITAL LETTER TAN;Lu;0;L;;;;;N;;;;10D7; +1C98;GEORGIAN MTAVRULI CAPITAL LETTER IN;Lu;0;L;;;;;N;;;;10D8; +1C99;GEORGIAN MTAVRULI CAPITAL LETTER KAN;Lu;0;L;;;;;N;;;;10D9; +1C9A;GEORGIAN MTAVRULI CAPITAL LETTER LAS;Lu;0;L;;;;;N;;;;10DA; +1C9B;GEORGIAN MTAVRULI CAPITAL LETTER MAN;Lu;0;L;;;;;N;;;;10DB; +1C9C;GEORGIAN MTAVRULI CAPITAL LETTER NAR;Lu;0;L;;;;;N;;;;10DC; +1C9D;GEORGIAN MTAVRULI CAPITAL LETTER ON;Lu;0;L;;;;;N;;;;10DD; +1C9E;GEORGIAN MTAVRULI CAPITAL LETTER PAR;Lu;0;L;;;;;N;;;;10DE; +1C9F;GEORGIAN MTAVRULI CAPITAL LETTER ZHAR;Lu;0;L;;;;;N;;;;10DF; +1CA0;GEORGIAN MTAVRULI CAPITAL LETTER RAE;Lu;0;L;;;;;N;;;;10E0; +1CA1;GEORGIAN MTAVRULI CAPITAL LETTER SAN;Lu;0;L;;;;;N;;;;10E1; +1CA2;GEORGIAN MTAVRULI CAPITAL LETTER TAR;Lu;0;L;;;;;N;;;;10E2; +1CA3;GEORGIAN MTAVRULI CAPITAL LETTER UN;Lu;0;L;;;;;N;;;;10E3; +1CA4;GEORGIAN MTAVRULI CAPITAL LETTER PHAR;Lu;0;L;;;;;N;;;;10E4; +1CA5;GEORGIAN MTAVRULI CAPITAL LETTER KHAR;Lu;0;L;;;;;N;;;;10E5; +1CA6;GEORGIAN MTAVRULI CAPITAL LETTER GHAN;Lu;0;L;;;;;N;;;;10E6; +1CA7;GEORGIAN MTAVRULI CAPITAL LETTER QAR;Lu;0;L;;;;;N;;;;10E7; +1CA8;GEORGIAN MTAVRULI CAPITAL LETTER SHIN;Lu;0;L;;;;;N;;;;10E8; +1CA9;GEORGIAN MTAVRULI CAPITAL LETTER CHIN;Lu;0;L;;;;;N;;;;10E9; +1CAA;GEORGIAN MTAVRULI CAPITAL LETTER CAN;Lu;0;L;;;;;N;;;;10EA; +1CAB;GEORGIAN MTAVRULI CAPITAL LETTER JIL;Lu;0;L;;;;;N;;;;10EB; +1CAC;GEORGIAN MTAVRULI CAPITAL LETTER CIL;Lu;0;L;;;;;N;;;;10EC; +1CAD;GEORGIAN MTAVRULI CAPITAL LETTER CHAR;Lu;0;L;;;;;N;;;;10ED; +1CAE;GEORGIAN MTAVRULI CAPITAL LETTER XAN;Lu;0;L;;;;;N;;;;10EE; +1CAF;GEORGIAN MTAVRULI CAPITAL LETTER JHAN;Lu;0;L;;;;;N;;;;10EF; +1CB0;GEORGIAN MTAVRULI CAPITAL LETTER HAE;Lu;0;L;;;;;N;;;;10F0; +1CB1;GEORGIAN MTAVRULI CAPITAL LETTER HE;Lu;0;L;;;;;N;;;;10F1; +1CB2;GEORGIAN MTAVRULI CAPITAL LETTER HIE;Lu;0;L;;;;;N;;;;10F2; +1CB3;GEORGIAN MTAVRULI CAPITAL LETTER WE;Lu;0;L;;;;;N;;;;10F3; +1CB4;GEORGIAN MTAVRULI CAPITAL LETTER HAR;Lu;0;L;;;;;N;;;;10F4; +1CB5;GEORGIAN MTAVRULI CAPITAL LETTER HOE;Lu;0;L;;;;;N;;;;10F5; +1CB6;GEORGIAN MTAVRULI CAPITAL LETTER FI;Lu;0;L;;;;;N;;;;10F6; +1CB7;GEORGIAN MTAVRULI CAPITAL LETTER YN;Lu;0;L;;;;;N;;;;10F7; +1CB8;GEORGIAN MTAVRULI CAPITAL LETTER ELIFI;Lu;0;L;;;;;N;;;;10F8; +1CB9;GEORGIAN MTAVRULI CAPITAL LETTER TURNED GAN;Lu;0;L;;;;;N;;;;10F9; +1CBA;GEORGIAN MTAVRULI CAPITAL LETTER AIN;Lu;0;L;;;;;N;;;;10FA; +1CBD;GEORGIAN MTAVRULI CAPITAL LETTER AEN;Lu;0;L;;;;;N;;;;10FD; +1CBE;GEORGIAN MTAVRULI CAPITAL LETTER HARD SIGN;Lu;0;L;;;;;N;;;;10FE; +1CBF;GEORGIAN MTAVRULI CAPITAL LETTER LABIAL SIGN;Lu;0;L;;;;;N;;;;10FF; +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;;;;; +1CC3;SUNDANESE PUNCTUATION BINDU CAKRA;Po;0;L;;;;;N;;;;; +1CC4;SUNDANESE PUNCTUATION BINDU LEU SATANGA;Po;0;L;;;;;N;;;;; +1CC5;SUNDANESE PUNCTUATION BINDU KA SATANGA;Po;0;L;;;;;N;;;;; +1CC6;SUNDANESE PUNCTUATION BINDU DA SATANGA;Po;0;L;;;;;N;;;;; +1CC7;SUNDANESE PUNCTUATION BINDU BA SATANGA;Po;0;L;;;;;N;;;;; +1CD0;VEDIC TONE KARSHANA;Mn;230;NSM;;;;;N;;;;; +1CD1;VEDIC TONE SHARA;Mn;230;NSM;;;;;N;;;;; +1CD2;VEDIC TONE PRENKHA;Mn;230;NSM;;;;;N;;;;; +1CD3;VEDIC SIGN NIHSHVASA;Po;0;L;;;;;N;;;;; +1CD4;VEDIC SIGN YAJURVEDIC MIDLINE SVARITA;Mn;1;NSM;;;;;N;;;;; +1CD5;VEDIC TONE YAJURVEDIC AGGRAVATED INDEPENDENT SVARITA;Mn;220;NSM;;;;;N;;;;; +1CD6;VEDIC TONE YAJURVEDIC INDEPENDENT SVARITA;Mn;220;NSM;;;;;N;;;;; +1CD7;VEDIC TONE YAJURVEDIC KATHAKA INDEPENDENT SVARITA;Mn;220;NSM;;;;;N;;;;; +1CD8;VEDIC TONE CANDRA BELOW;Mn;220;NSM;;;;;N;;;;; +1CD9;VEDIC TONE YAJURVEDIC KATHAKA INDEPENDENT SVARITA SCHROEDER;Mn;220;NSM;;;;;N;;;;; +1CDA;VEDIC TONE DOUBLE SVARITA;Mn;230;NSM;;;;;N;;;;; +1CDB;VEDIC TONE TRIPLE SVARITA;Mn;230;NSM;;;;;N;;;;; +1CDC;VEDIC TONE KATHAKA ANUDATTA;Mn;220;NSM;;;;;N;;;;; +1CDD;VEDIC TONE DOT BELOW;Mn;220;NSM;;;;;N;;;;; +1CDE;VEDIC TONE TWO DOTS BELOW;Mn;220;NSM;;;;;N;;;;; +1CDF;VEDIC TONE THREE DOTS BELOW;Mn;220;NSM;;;;;N;;;;; +1CE0;VEDIC TONE RIGVEDIC KASHMIRI INDEPENDENT SVARITA;Mn;230;NSM;;;;;N;;;;; +1CE1;VEDIC TONE ATHARVAVEDIC INDEPENDENT SVARITA;Mc;0;L;;;;;N;;;;; +1CE2;VEDIC SIGN VISARGA SVARITA;Mn;1;NSM;;;;;N;;;;; +1CE3;VEDIC SIGN VISARGA UDATTA;Mn;1;NSM;;;;;N;;;;; +1CE4;VEDIC SIGN REVERSED VISARGA UDATTA;Mn;1;NSM;;;;;N;;;;; +1CE5;VEDIC SIGN VISARGA ANUDATTA;Mn;1;NSM;;;;;N;;;;; +1CE6;VEDIC SIGN REVERSED VISARGA ANUDATTA;Mn;1;NSM;;;;;N;;;;; +1CE7;VEDIC SIGN VISARGA UDATTA WITH TAIL;Mn;1;NSM;;;;;N;;;;; +1CE8;VEDIC SIGN VISARGA ANUDATTA WITH TAIL;Mn;1;NSM;;;;;N;;;;; +1CE9;VEDIC SIGN ANUSVARA ANTARGOMUKHA;Lo;0;L;;;;;N;;;;; +1CEA;VEDIC SIGN ANUSVARA BAHIRGOMUKHA;Lo;0;L;;;;;N;;;;; +1CEB;VEDIC SIGN ANUSVARA VAMAGOMUKHA;Lo;0;L;;;;;N;;;;; +1CEC;VEDIC SIGN ANUSVARA VAMAGOMUKHA WITH TAIL;Lo;0;L;;;;;N;;;;; +1CED;VEDIC SIGN TIRYAK;Mn;220;NSM;;;;;N;;;;; +1CEE;VEDIC SIGN HEXIFORM LONG ANUSVARA;Lo;0;L;;;;;N;;;;; +1CEF;VEDIC SIGN LONG ANUSVARA;Lo;0;L;;;;;N;;;;; +1CF0;VEDIC SIGN RTHANG LONG ANUSVARA;Lo;0;L;;;;;N;;;;; +1CF1;VEDIC SIGN ANUSVARA UBHAYATO MUKHA;Lo;0;L;;;;;N;;;;; +1CF2;VEDIC SIGN ARDHAVISARGA;Mc;0;L;;;;;N;;;;; +1CF3;VEDIC SIGN ROTATED ARDHAVISARGA;Mc;0;L;;;;;N;;;;; +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;;;;; +1D01;LATIN LETTER SMALL CAPITAL AE;Ll;0;L;;;;;N;;;;; +1D02;LATIN SMALL LETTER TURNED AE;Ll;0;L;;;;;N;;;;; +1D03;LATIN LETTER SMALL CAPITAL BARRED B;Ll;0;L;;;;;N;;;;; +1D04;LATIN LETTER SMALL CAPITAL C;Ll;0;L;;;;;N;;;;; +1D05;LATIN LETTER SMALL CAPITAL D;Ll;0;L;;;;;N;;;;; +1D06;LATIN LETTER SMALL CAPITAL ETH;Ll;0;L;;;;;N;;;;; +1D07;LATIN LETTER SMALL CAPITAL E;Ll;0;L;;;;;N;;;;; +1D08;LATIN SMALL LETTER TURNED OPEN E;Ll;0;L;;;;;N;;;;; +1D09;LATIN SMALL LETTER TURNED I;Ll;0;L;;;;;N;;;;; +1D0A;LATIN LETTER SMALL CAPITAL J;Ll;0;L;;;;;N;;;;; +1D0B;LATIN LETTER SMALL CAPITAL K;Ll;0;L;;;;;N;;;;; +1D0C;LATIN LETTER SMALL CAPITAL L WITH STROKE;Ll;0;L;;;;;N;;;;; +1D0D;LATIN LETTER SMALL CAPITAL M;Ll;0;L;;;;;N;;;;; +1D0E;LATIN LETTER SMALL CAPITAL REVERSED N;Ll;0;L;;;;;N;;;;; +1D0F;LATIN LETTER SMALL CAPITAL O;Ll;0;L;;;;;N;;;;; +1D10;LATIN LETTER SMALL CAPITAL OPEN O;Ll;0;L;;;;;N;;;;; +1D11;LATIN SMALL LETTER SIDEWAYS O;Ll;0;L;;;;;N;;;;; +1D12;LATIN SMALL LETTER SIDEWAYS OPEN O;Ll;0;L;;;;;N;;;;; +1D13;LATIN SMALL LETTER SIDEWAYS O WITH STROKE;Ll;0;L;;;;;N;;;;; +1D14;LATIN SMALL LETTER TURNED OE;Ll;0;L;;;;;N;;;;; +1D15;LATIN LETTER SMALL CAPITAL OU;Ll;0;L;;;;;N;;;;; +1D16;LATIN SMALL LETTER TOP HALF O;Ll;0;L;;;;;N;;;;; +1D17;LATIN SMALL LETTER BOTTOM HALF O;Ll;0;L;;;;;N;;;;; +1D18;LATIN LETTER SMALL CAPITAL P;Ll;0;L;;;;;N;;;;; +1D19;LATIN LETTER SMALL CAPITAL REVERSED R;Ll;0;L;;;;;N;;;;; +1D1A;LATIN LETTER SMALL CAPITAL TURNED R;Ll;0;L;;;;;N;;;;; +1D1B;LATIN LETTER SMALL CAPITAL T;Ll;0;L;;;;;N;;;;; +1D1C;LATIN LETTER SMALL CAPITAL U;Ll;0;L;;;;;N;;;;; +1D1D;LATIN SMALL LETTER SIDEWAYS U;Ll;0;L;;;;;N;;;;; +1D1E;LATIN SMALL LETTER SIDEWAYS DIAERESIZED U;Ll;0;L;;;;;N;;;;; +1D1F;LATIN SMALL LETTER SIDEWAYS TURNED M;Ll;0;L;;;;;N;;;;; +1D20;LATIN LETTER SMALL CAPITAL V;Ll;0;L;;;;;N;;;;; +1D21;LATIN LETTER SMALL CAPITAL W;Ll;0;L;;;;;N;;;;; +1D22;LATIN LETTER SMALL CAPITAL Z;Ll;0;L;;;;;N;;;;; +1D23;LATIN LETTER SMALL CAPITAL EZH;Ll;0;L;;;;;N;;;;; +1D24;LATIN LETTER VOICED LARYNGEAL SPIRANT;Ll;0;L;;;;;N;;;;; +1D25;LATIN LETTER AIN;Ll;0;L;;;;;N;;;;; +1D26;GREEK LETTER SMALL CAPITAL GAMMA;Ll;0;L;;;;;N;;;;; +1D27;GREEK LETTER SMALL CAPITAL LAMDA;Ll;0;L;;;;;N;;;;; +1D28;GREEK LETTER SMALL CAPITAL PI;Ll;0;L;;;;;N;;;;; +1D29;GREEK LETTER SMALL CAPITAL RHO;Ll;0;L;;;;;N;;;;; +1D2A;GREEK LETTER SMALL CAPITAL PSI;Ll;0;L;;;;;N;;;;; +1D2B;CYRILLIC LETTER SMALL CAPITAL EL;Ll;0;L;;;;;N;;;;; +1D2C;MODIFIER LETTER CAPITAL A;Lm;0;L;<super> 0041;;;;N;;;;; +1D2D;MODIFIER LETTER CAPITAL AE;Lm;0;L;<super> 00C6;;;;N;;;;; +1D2E;MODIFIER LETTER CAPITAL B;Lm;0;L;<super> 0042;;;;N;;;;; +1D2F;MODIFIER LETTER CAPITAL BARRED B;Lm;0;L;;;;;N;;;;; +1D30;MODIFIER LETTER CAPITAL D;Lm;0;L;<super> 0044;;;;N;;;;; +1D31;MODIFIER LETTER CAPITAL E;Lm;0;L;<super> 0045;;;;N;;;;; +1D32;MODIFIER LETTER CAPITAL REVERSED E;Lm;0;L;<super> 018E;;;;N;;;;; +1D33;MODIFIER LETTER CAPITAL G;Lm;0;L;<super> 0047;;;;N;;;;; +1D34;MODIFIER LETTER CAPITAL H;Lm;0;L;<super> 0048;;;;N;;;;; +1D35;MODIFIER LETTER CAPITAL I;Lm;0;L;<super> 0049;;;;N;;;;; +1D36;MODIFIER LETTER CAPITAL J;Lm;0;L;<super> 004A;;;;N;;;;; +1D37;MODIFIER LETTER CAPITAL K;Lm;0;L;<super> 004B;;;;N;;;;; +1D38;MODIFIER LETTER CAPITAL L;Lm;0;L;<super> 004C;;;;N;;;;; +1D39;MODIFIER LETTER CAPITAL M;Lm;0;L;<super> 004D;;;;N;;;;; +1D3A;MODIFIER LETTER CAPITAL N;Lm;0;L;<super> 004E;;;;N;;;;; +1D3B;MODIFIER LETTER CAPITAL REVERSED N;Lm;0;L;;;;;N;;;;; +1D3C;MODIFIER LETTER CAPITAL O;Lm;0;L;<super> 004F;;;;N;;;;; +1D3D;MODIFIER LETTER CAPITAL OU;Lm;0;L;<super> 0222;;;;N;;;;; +1D3E;MODIFIER LETTER CAPITAL P;Lm;0;L;<super> 0050;;;;N;;;;; +1D3F;MODIFIER LETTER CAPITAL R;Lm;0;L;<super> 0052;;;;N;;;;; +1D40;MODIFIER LETTER CAPITAL T;Lm;0;L;<super> 0054;;;;N;;;;; +1D41;MODIFIER LETTER CAPITAL U;Lm;0;L;<super> 0055;;;;N;;;;; +1D42;MODIFIER LETTER CAPITAL W;Lm;0;L;<super> 0057;;;;N;;;;; +1D43;MODIFIER LETTER SMALL A;Lm;0;L;<super> 0061;;;;N;;;;; +1D44;MODIFIER LETTER SMALL TURNED A;Lm;0;L;<super> 0250;;;;N;;;;; +1D45;MODIFIER LETTER SMALL ALPHA;Lm;0;L;<super> 0251;;;;N;;;;; +1D46;MODIFIER LETTER SMALL TURNED AE;Lm;0;L;<super> 1D02;;;;N;;;;; +1D47;MODIFIER LETTER SMALL B;Lm;0;L;<super> 0062;;;;N;;;;; +1D48;MODIFIER LETTER SMALL D;Lm;0;L;<super> 0064;;;;N;;;;; +1D49;MODIFIER LETTER SMALL E;Lm;0;L;<super> 0065;;;;N;;;;; +1D4A;MODIFIER LETTER SMALL SCHWA;Lm;0;L;<super> 0259;;;;N;;;;; +1D4B;MODIFIER LETTER SMALL OPEN E;Lm;0;L;<super> 025B;;;;N;;;;; +1D4C;MODIFIER LETTER SMALL TURNED OPEN E;Lm;0;L;<super> 025C;;;;N;;;;; +1D4D;MODIFIER LETTER SMALL G;Lm;0;L;<super> 0067;;;;N;;;;; +1D4E;MODIFIER LETTER SMALL TURNED I;Lm;0;L;;;;;N;;;;; +1D4F;MODIFIER LETTER SMALL K;Lm;0;L;<super> 006B;;;;N;;;;; +1D50;MODIFIER LETTER SMALL M;Lm;0;L;<super> 006D;;;;N;;;;; +1D51;MODIFIER LETTER SMALL ENG;Lm;0;L;<super> 014B;;;;N;;;;; +1D52;MODIFIER LETTER SMALL O;Lm;0;L;<super> 006F;;;;N;;;;; +1D53;MODIFIER LETTER SMALL OPEN O;Lm;0;L;<super> 0254;;;;N;;;;; +1D54;MODIFIER LETTER SMALL TOP HALF O;Lm;0;L;<super> 1D16;;;;N;;;;; +1D55;MODIFIER LETTER SMALL BOTTOM HALF O;Lm;0;L;<super> 1D17;;;;N;;;;; +1D56;MODIFIER LETTER SMALL P;Lm;0;L;<super> 0070;;;;N;;;;; +1D57;MODIFIER LETTER SMALL T;Lm;0;L;<super> 0074;;;;N;;;;; +1D58;MODIFIER LETTER SMALL U;Lm;0;L;<super> 0075;;;;N;;;;; +1D59;MODIFIER LETTER SMALL SIDEWAYS U;Lm;0;L;<super> 1D1D;;;;N;;;;; +1D5A;MODIFIER LETTER SMALL TURNED M;Lm;0;L;<super> 026F;;;;N;;;;; +1D5B;MODIFIER LETTER SMALL V;Lm;0;L;<super> 0076;;;;N;;;;; +1D5C;MODIFIER LETTER SMALL AIN;Lm;0;L;<super> 1D25;;;;N;;;;; +1D5D;MODIFIER LETTER SMALL BETA;Lm;0;L;<super> 03B2;;;;N;;;;; +1D5E;MODIFIER LETTER SMALL GREEK GAMMA;Lm;0;L;<super> 03B3;;;;N;;;;; +1D5F;MODIFIER LETTER SMALL DELTA;Lm;0;L;<super> 03B4;;;;N;;;;; +1D60;MODIFIER LETTER SMALL GREEK PHI;Lm;0;L;<super> 03C6;;;;N;;;;; +1D61;MODIFIER LETTER SMALL CHI;Lm;0;L;<super> 03C7;;;;N;;;;; +1D62;LATIN SUBSCRIPT SMALL LETTER I;Lm;0;L;<sub> 0069;;;;N;;;;; +1D63;LATIN SUBSCRIPT SMALL LETTER R;Lm;0;L;<sub> 0072;;;;N;;;;; +1D64;LATIN SUBSCRIPT SMALL LETTER U;Lm;0;L;<sub> 0075;;;;N;;;;; +1D65;LATIN SUBSCRIPT SMALL LETTER V;Lm;0;L;<sub> 0076;;;;N;;;;; +1D66;GREEK SUBSCRIPT SMALL LETTER BETA;Lm;0;L;<sub> 03B2;;;;N;;;;; +1D67;GREEK SUBSCRIPT SMALL LETTER GAMMA;Lm;0;L;<sub> 03B3;;;;N;;;;; +1D68;GREEK SUBSCRIPT SMALL LETTER RHO;Lm;0;L;<sub> 03C1;;;;N;;;;; +1D69;GREEK SUBSCRIPT SMALL LETTER PHI;Lm;0;L;<sub> 03C6;;;;N;;;;; +1D6A;GREEK SUBSCRIPT SMALL LETTER CHI;Lm;0;L;<sub> 03C7;;;;N;;;;; +1D6B;LATIN SMALL LETTER UE;Ll;0;L;;;;;N;;;;; +1D6C;LATIN SMALL LETTER B WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +1D6D;LATIN SMALL LETTER D WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +1D6E;LATIN SMALL LETTER F WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +1D6F;LATIN SMALL LETTER M WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +1D70;LATIN SMALL LETTER N WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +1D71;LATIN SMALL LETTER P WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +1D72;LATIN SMALL LETTER R WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +1D73;LATIN SMALL LETTER R WITH FISHHOOK AND MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +1D74;LATIN SMALL LETTER S WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +1D75;LATIN SMALL LETTER T WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +1D76;LATIN SMALL LETTER Z WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +1D77;LATIN SMALL LETTER TURNED G;Ll;0;L;;;;;N;;;;; +1D78;MODIFIER LETTER CYRILLIC EN;Lm;0;L;<super> 043D;;;;N;;;;; +1D79;LATIN SMALL LETTER INSULAR G;Ll;0;L;;;;;N;;;A77D;;A77D +1D7A;LATIN SMALL LETTER TH WITH STRIKETHROUGH;Ll;0;L;;;;;N;;;;; +1D7B;LATIN SMALL CAPITAL LETTER I WITH STROKE;Ll;0;L;;;;;N;;;;; +1D7C;LATIN SMALL LETTER IOTA WITH STROKE;Ll;0;L;;;;;N;;;;; +1D7D;LATIN SMALL LETTER P WITH STROKE;Ll;0;L;;;;;N;;;2C63;;2C63 +1D7E;LATIN SMALL CAPITAL LETTER U WITH STROKE;Ll;0;L;;;;;N;;;;; +1D7F;LATIN SMALL LETTER UPSILON WITH STROKE;Ll;0;L;;;;;N;;;;; +1D80;LATIN SMALL LETTER B WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D81;LATIN SMALL LETTER D WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D82;LATIN SMALL LETTER F WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D83;LATIN SMALL LETTER G WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D84;LATIN SMALL LETTER K WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D85;LATIN SMALL LETTER L WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D86;LATIN SMALL LETTER M WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D87;LATIN SMALL LETTER N WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D88;LATIN SMALL LETTER P WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D89;LATIN SMALL LETTER R WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D8A;LATIN SMALL LETTER S WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D8B;LATIN SMALL LETTER ESH WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D8C;LATIN SMALL LETTER V WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D8D;LATIN SMALL LETTER X WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D8E;LATIN SMALL LETTER Z WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D8F;LATIN SMALL LETTER A WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1D90;LATIN SMALL LETTER ALPHA WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1D91;LATIN SMALL LETTER D WITH HOOK AND TAIL;Ll;0;L;;;;;N;;;;; +1D92;LATIN SMALL LETTER E WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1D93;LATIN SMALL LETTER OPEN E WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1D94;LATIN SMALL LETTER REVERSED OPEN E WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1D95;LATIN SMALL LETTER SCHWA WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1D96;LATIN SMALL LETTER I WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1D97;LATIN SMALL LETTER OPEN O WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1D98;LATIN SMALL LETTER ESH WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1D99;LATIN SMALL LETTER U WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1D9A;LATIN SMALL LETTER EZH WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1D9B;MODIFIER LETTER SMALL TURNED ALPHA;Lm;0;L;<super> 0252;;;;N;;;;; +1D9C;MODIFIER LETTER SMALL C;Lm;0;L;<super> 0063;;;;N;;;;; +1D9D;MODIFIER LETTER SMALL C WITH CURL;Lm;0;L;<super> 0255;;;;N;;;;; +1D9E;MODIFIER LETTER SMALL ETH;Lm;0;L;<super> 00F0;;;;N;;;;; +1D9F;MODIFIER LETTER SMALL REVERSED OPEN E;Lm;0;L;<super> 025C;;;;N;;;;; +1DA0;MODIFIER LETTER SMALL F;Lm;0;L;<super> 0066;;;;N;;;;; +1DA1;MODIFIER LETTER SMALL DOTLESS J WITH STROKE;Lm;0;L;<super> 025F;;;;N;;;;; +1DA2;MODIFIER LETTER SMALL SCRIPT G;Lm;0;L;<super> 0261;;;;N;;;;; +1DA3;MODIFIER LETTER SMALL TURNED H;Lm;0;L;<super> 0265;;;;N;;;;; +1DA4;MODIFIER LETTER SMALL I WITH STROKE;Lm;0;L;<super> 0268;;;;N;;;;; +1DA5;MODIFIER LETTER SMALL IOTA;Lm;0;L;<super> 0269;;;;N;;;;; +1DA6;MODIFIER LETTER SMALL CAPITAL I;Lm;0;L;<super> 026A;;;;N;;;;; +1DA7;MODIFIER LETTER SMALL CAPITAL I WITH STROKE;Lm;0;L;<super> 1D7B;;;;N;;;;; +1DA8;MODIFIER LETTER SMALL J WITH CROSSED-TAIL;Lm;0;L;<super> 029D;;;;N;;;;; +1DA9;MODIFIER LETTER SMALL L WITH RETROFLEX HOOK;Lm;0;L;<super> 026D;;;;N;;;;; +1DAA;MODIFIER LETTER SMALL L WITH PALATAL HOOK;Lm;0;L;<super> 1D85;;;;N;;;;; +1DAB;MODIFIER LETTER SMALL CAPITAL L;Lm;0;L;<super> 029F;;;;N;;;;; +1DAC;MODIFIER LETTER SMALL M WITH HOOK;Lm;0;L;<super> 0271;;;;N;;;;; +1DAD;MODIFIER LETTER SMALL TURNED M WITH LONG LEG;Lm;0;L;<super> 0270;;;;N;;;;; +1DAE;MODIFIER LETTER SMALL N WITH LEFT HOOK;Lm;0;L;<super> 0272;;;;N;;;;; +1DAF;MODIFIER LETTER SMALL N WITH RETROFLEX HOOK;Lm;0;L;<super> 0273;;;;N;;;;; +1DB0;MODIFIER LETTER SMALL CAPITAL N;Lm;0;L;<super> 0274;;;;N;;;;; +1DB1;MODIFIER LETTER SMALL BARRED O;Lm;0;L;<super> 0275;;;;N;;;;; +1DB2;MODIFIER LETTER SMALL PHI;Lm;0;L;<super> 0278;;;;N;;;;; +1DB3;MODIFIER LETTER SMALL S WITH HOOK;Lm;0;L;<super> 0282;;;;N;;;;; +1DB4;MODIFIER LETTER SMALL ESH;Lm;0;L;<super> 0283;;;;N;;;;; +1DB5;MODIFIER LETTER SMALL T WITH PALATAL HOOK;Lm;0;L;<super> 01AB;;;;N;;;;; +1DB6;MODIFIER LETTER SMALL U BAR;Lm;0;L;<super> 0289;;;;N;;;;; +1DB7;MODIFIER LETTER SMALL UPSILON;Lm;0;L;<super> 028A;;;;N;;;;; +1DB8;MODIFIER LETTER SMALL CAPITAL U;Lm;0;L;<super> 1D1C;;;;N;;;;; +1DB9;MODIFIER LETTER SMALL V WITH HOOK;Lm;0;L;<super> 028B;;;;N;;;;; +1DBA;MODIFIER LETTER SMALL TURNED V;Lm;0;L;<super> 028C;;;;N;;;;; +1DBB;MODIFIER LETTER SMALL Z;Lm;0;L;<super> 007A;;;;N;;;;; +1DBC;MODIFIER LETTER SMALL Z WITH RETROFLEX HOOK;Lm;0;L;<super> 0290;;;;N;;;;; +1DBD;MODIFIER LETTER SMALL Z WITH CURL;Lm;0;L;<super> 0291;;;;N;;;;; +1DBE;MODIFIER LETTER SMALL EZH;Lm;0;L;<super> 0292;;;;N;;;;; +1DBF;MODIFIER LETTER SMALL THETA;Lm;0;L;<super> 03B8;;;;N;;;;; +1DC0;COMBINING DOTTED GRAVE ACCENT;Mn;230;NSM;;;;;N;;;;; +1DC1;COMBINING DOTTED ACUTE ACCENT;Mn;230;NSM;;;;;N;;;;; +1DC2;COMBINING SNAKE BELOW;Mn;220;NSM;;;;;N;;;;; +1DC3;COMBINING SUSPENSION MARK;Mn;230;NSM;;;;;N;;;;; +1DC4;COMBINING MACRON-ACUTE;Mn;230;NSM;;;;;N;;;;; +1DC5;COMBINING GRAVE-MACRON;Mn;230;NSM;;;;;N;;;;; +1DC6;COMBINING MACRON-GRAVE;Mn;230;NSM;;;;;N;;;;; +1DC7;COMBINING ACUTE-MACRON;Mn;230;NSM;;;;;N;;;;; +1DC8;COMBINING GRAVE-ACUTE-GRAVE;Mn;230;NSM;;;;;N;;;;; +1DC9;COMBINING ACUTE-GRAVE-ACUTE;Mn;230;NSM;;;;;N;;;;; +1DCA;COMBINING LATIN SMALL LETTER R BELOW;Mn;220;NSM;;;;;N;;;;; +1DCB;COMBINING BREVE-MACRON;Mn;230;NSM;;;;;N;;;;; +1DCC;COMBINING MACRON-BREVE;Mn;230;NSM;;;;;N;;;;; +1DCD;COMBINING DOUBLE CIRCUMFLEX ABOVE;Mn;234;NSM;;;;;N;;;;; +1DCE;COMBINING OGONEK ABOVE;Mn;214;NSM;;;;;N;;;;; +1DCF;COMBINING ZIGZAG BELOW;Mn;220;NSM;;;;;N;;;;; +1DD0;COMBINING IS BELOW;Mn;202;NSM;;;;;N;;;;; +1DD1;COMBINING UR ABOVE;Mn;230;NSM;;;;;N;;;;; +1DD2;COMBINING US ABOVE;Mn;230;NSM;;;;;N;;;;; +1DD3;COMBINING LATIN SMALL LETTER FLATTENED OPEN A ABOVE;Mn;230;NSM;;;;;N;;;;; +1DD4;COMBINING LATIN SMALL LETTER AE;Mn;230;NSM;;;;;N;;;;; +1DD5;COMBINING LATIN SMALL LETTER AO;Mn;230;NSM;;;;;N;;;;; +1DD6;COMBINING LATIN SMALL LETTER AV;Mn;230;NSM;;;;;N;;;;; +1DD7;COMBINING LATIN SMALL LETTER C CEDILLA;Mn;230;NSM;;;;;N;;;;; +1DD8;COMBINING LATIN SMALL LETTER INSULAR D;Mn;230;NSM;;;;;N;;;;; +1DD9;COMBINING LATIN SMALL LETTER ETH;Mn;230;NSM;;;;;N;;;;; +1DDA;COMBINING LATIN SMALL LETTER G;Mn;230;NSM;;;;;N;;;;; +1DDB;COMBINING LATIN LETTER SMALL CAPITAL G;Mn;230;NSM;;;;;N;;;;; +1DDC;COMBINING LATIN SMALL LETTER K;Mn;230;NSM;;;;;N;;;;; +1DDD;COMBINING LATIN SMALL LETTER L;Mn;230;NSM;;;;;N;;;;; +1DDE;COMBINING LATIN LETTER SMALL CAPITAL L;Mn;230;NSM;;;;;N;;;;; +1DDF;COMBINING LATIN LETTER SMALL CAPITAL M;Mn;230;NSM;;;;;N;;;;; +1DE0;COMBINING LATIN SMALL LETTER N;Mn;230;NSM;;;;;N;;;;; +1DE1;COMBINING LATIN LETTER SMALL CAPITAL N;Mn;230;NSM;;;;;N;;;;; +1DE2;COMBINING LATIN LETTER SMALL CAPITAL R;Mn;230;NSM;;;;;N;;;;; +1DE3;COMBINING LATIN SMALL LETTER R ROTUNDA;Mn;230;NSM;;;;;N;;;;; +1DE4;COMBINING LATIN SMALL LETTER S;Mn;230;NSM;;;;;N;;;;; +1DE5;COMBINING LATIN SMALL LETTER LONG S;Mn;230;NSM;;;;;N;;;;; +1DE6;COMBINING LATIN SMALL LETTER Z;Mn;230;NSM;;;;;N;;;;; +1DE7;COMBINING LATIN SMALL LETTER ALPHA;Mn;230;NSM;;;;;N;;;;; +1DE8;COMBINING LATIN SMALL LETTER B;Mn;230;NSM;;;;;N;;;;; +1DE9;COMBINING LATIN SMALL LETTER BETA;Mn;230;NSM;;;;;N;;;;; +1DEA;COMBINING LATIN SMALL LETTER SCHWA;Mn;230;NSM;;;;;N;;;;; +1DEB;COMBINING LATIN SMALL LETTER F;Mn;230;NSM;;;;;N;;;;; +1DEC;COMBINING LATIN SMALL LETTER L WITH DOUBLE MIDDLE TILDE;Mn;230;NSM;;;;;N;;;;; +1DED;COMBINING LATIN SMALL LETTER O WITH LIGHT CENTRALIZATION STROKE;Mn;230;NSM;;;;;N;;;;; +1DEE;COMBINING LATIN SMALL LETTER P;Mn;230;NSM;;;;;N;;;;; +1DEF;COMBINING LATIN SMALL LETTER ESH;Mn;230;NSM;;;;;N;;;;; +1DF0;COMBINING LATIN SMALL LETTER U WITH LIGHT CENTRALIZATION STROKE;Mn;230;NSM;;;;;N;;;;; +1DF1;COMBINING LATIN SMALL LETTER W;Mn;230;NSM;;;;;N;;;;; +1DF2;COMBINING LATIN SMALL LETTER A WITH DIAERESIS;Mn;230;NSM;;;;;N;;;;; +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;;;;; +1DFE;COMBINING LEFT ARROWHEAD ABOVE;Mn;230;NSM;;;;;N;;;;; +1DFF;COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW;Mn;220;NSM;;;;;N;;;;; +1E00;LATIN CAPITAL LETTER A WITH RING BELOW;Lu;0;L;0041 0325;;;;N;;;;1E01; +1E01;LATIN SMALL LETTER A WITH RING BELOW;Ll;0;L;0061 0325;;;;N;;;1E00;;1E00 +1E02;LATIN CAPITAL LETTER B WITH DOT ABOVE;Lu;0;L;0042 0307;;;;N;;;;1E03; +1E03;LATIN SMALL LETTER B WITH DOT ABOVE;Ll;0;L;0062 0307;;;;N;;;1E02;;1E02 +1E04;LATIN CAPITAL LETTER B WITH DOT BELOW;Lu;0;L;0042 0323;;;;N;;;;1E05; +1E05;LATIN SMALL LETTER B WITH DOT BELOW;Ll;0;L;0062 0323;;;;N;;;1E04;;1E04 +1E06;LATIN CAPITAL LETTER B WITH LINE BELOW;Lu;0;L;0042 0331;;;;N;;;;1E07; +1E07;LATIN SMALL LETTER B WITH LINE BELOW;Ll;0;L;0062 0331;;;;N;;;1E06;;1E06 +1E08;LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE;Lu;0;L;00C7 0301;;;;N;;;;1E09; +1E09;LATIN SMALL LETTER C WITH CEDILLA AND ACUTE;Ll;0;L;00E7 0301;;;;N;;;1E08;;1E08 +1E0A;LATIN CAPITAL LETTER D WITH DOT ABOVE;Lu;0;L;0044 0307;;;;N;;;;1E0B; +1E0B;LATIN SMALL LETTER D WITH DOT ABOVE;Ll;0;L;0064 0307;;;;N;;;1E0A;;1E0A +1E0C;LATIN CAPITAL LETTER D WITH DOT BELOW;Lu;0;L;0044 0323;;;;N;;;;1E0D; +1E0D;LATIN SMALL LETTER D WITH DOT BELOW;Ll;0;L;0064 0323;;;;N;;;1E0C;;1E0C +1E0E;LATIN CAPITAL LETTER D WITH LINE BELOW;Lu;0;L;0044 0331;;;;N;;;;1E0F; +1E0F;LATIN SMALL LETTER D WITH LINE BELOW;Ll;0;L;0064 0331;;;;N;;;1E0E;;1E0E +1E10;LATIN CAPITAL LETTER D WITH CEDILLA;Lu;0;L;0044 0327;;;;N;;;;1E11; +1E11;LATIN SMALL LETTER D WITH CEDILLA;Ll;0;L;0064 0327;;;;N;;;1E10;;1E10 +1E12;LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW;Lu;0;L;0044 032D;;;;N;;;;1E13; +1E13;LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW;Ll;0;L;0064 032D;;;;N;;;1E12;;1E12 +1E14;LATIN CAPITAL LETTER E WITH MACRON AND GRAVE;Lu;0;L;0112 0300;;;;N;;;;1E15; +1E15;LATIN SMALL LETTER E WITH MACRON AND GRAVE;Ll;0;L;0113 0300;;;;N;;;1E14;;1E14 +1E16;LATIN CAPITAL LETTER E WITH MACRON AND ACUTE;Lu;0;L;0112 0301;;;;N;;;;1E17; +1E17;LATIN SMALL LETTER E WITH MACRON AND ACUTE;Ll;0;L;0113 0301;;;;N;;;1E16;;1E16 +1E18;LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW;Lu;0;L;0045 032D;;;;N;;;;1E19; +1E19;LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW;Ll;0;L;0065 032D;;;;N;;;1E18;;1E18 +1E1A;LATIN CAPITAL LETTER E WITH TILDE BELOW;Lu;0;L;0045 0330;;;;N;;;;1E1B; +1E1B;LATIN SMALL LETTER E WITH TILDE BELOW;Ll;0;L;0065 0330;;;;N;;;1E1A;;1E1A +1E1C;LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE;Lu;0;L;0228 0306;;;;N;;;;1E1D; +1E1D;LATIN SMALL LETTER E WITH CEDILLA AND BREVE;Ll;0;L;0229 0306;;;;N;;;1E1C;;1E1C +1E1E;LATIN CAPITAL LETTER F WITH DOT ABOVE;Lu;0;L;0046 0307;;;;N;;;;1E1F; +1E1F;LATIN SMALL LETTER F WITH DOT ABOVE;Ll;0;L;0066 0307;;;;N;;;1E1E;;1E1E +1E20;LATIN CAPITAL LETTER G WITH MACRON;Lu;0;L;0047 0304;;;;N;;;;1E21; +1E21;LATIN SMALL LETTER G WITH MACRON;Ll;0;L;0067 0304;;;;N;;;1E20;;1E20 +1E22;LATIN CAPITAL LETTER H WITH DOT ABOVE;Lu;0;L;0048 0307;;;;N;;;;1E23; +1E23;LATIN SMALL LETTER H WITH DOT ABOVE;Ll;0;L;0068 0307;;;;N;;;1E22;;1E22 +1E24;LATIN CAPITAL LETTER H WITH DOT BELOW;Lu;0;L;0048 0323;;;;N;;;;1E25; +1E25;LATIN SMALL LETTER H WITH DOT BELOW;Ll;0;L;0068 0323;;;;N;;;1E24;;1E24 +1E26;LATIN CAPITAL LETTER H WITH DIAERESIS;Lu;0;L;0048 0308;;;;N;;;;1E27; +1E27;LATIN SMALL LETTER H WITH DIAERESIS;Ll;0;L;0068 0308;;;;N;;;1E26;;1E26 +1E28;LATIN CAPITAL LETTER H WITH CEDILLA;Lu;0;L;0048 0327;;;;N;;;;1E29; +1E29;LATIN SMALL LETTER H WITH CEDILLA;Ll;0;L;0068 0327;;;;N;;;1E28;;1E28 +1E2A;LATIN CAPITAL LETTER H WITH BREVE BELOW;Lu;0;L;0048 032E;;;;N;;;;1E2B; +1E2B;LATIN SMALL LETTER H WITH BREVE BELOW;Ll;0;L;0068 032E;;;;N;;;1E2A;;1E2A +1E2C;LATIN CAPITAL LETTER I WITH TILDE BELOW;Lu;0;L;0049 0330;;;;N;;;;1E2D; +1E2D;LATIN SMALL LETTER I WITH TILDE BELOW;Ll;0;L;0069 0330;;;;N;;;1E2C;;1E2C +1E2E;LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE;Lu;0;L;00CF 0301;;;;N;;;;1E2F; +1E2F;LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE;Ll;0;L;00EF 0301;;;;N;;;1E2E;;1E2E +1E30;LATIN CAPITAL LETTER K WITH ACUTE;Lu;0;L;004B 0301;;;;N;;;;1E31; +1E31;LATIN SMALL LETTER K WITH ACUTE;Ll;0;L;006B 0301;;;;N;;;1E30;;1E30 +1E32;LATIN CAPITAL LETTER K WITH DOT BELOW;Lu;0;L;004B 0323;;;;N;;;;1E33; +1E33;LATIN SMALL LETTER K WITH DOT BELOW;Ll;0;L;006B 0323;;;;N;;;1E32;;1E32 +1E34;LATIN CAPITAL LETTER K WITH LINE BELOW;Lu;0;L;004B 0331;;;;N;;;;1E35; +1E35;LATIN SMALL LETTER K WITH LINE BELOW;Ll;0;L;006B 0331;;;;N;;;1E34;;1E34 +1E36;LATIN CAPITAL LETTER L WITH DOT BELOW;Lu;0;L;004C 0323;;;;N;;;;1E37; +1E37;LATIN SMALL LETTER L WITH DOT BELOW;Ll;0;L;006C 0323;;;;N;;;1E36;;1E36 +1E38;LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON;Lu;0;L;1E36 0304;;;;N;;;;1E39; +1E39;LATIN SMALL LETTER L WITH DOT BELOW AND MACRON;Ll;0;L;1E37 0304;;;;N;;;1E38;;1E38 +1E3A;LATIN CAPITAL LETTER L WITH LINE BELOW;Lu;0;L;004C 0331;;;;N;;;;1E3B; +1E3B;LATIN SMALL LETTER L WITH LINE BELOW;Ll;0;L;006C 0331;;;;N;;;1E3A;;1E3A +1E3C;LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW;Lu;0;L;004C 032D;;;;N;;;;1E3D; +1E3D;LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW;Ll;0;L;006C 032D;;;;N;;;1E3C;;1E3C +1E3E;LATIN CAPITAL LETTER M WITH ACUTE;Lu;0;L;004D 0301;;;;N;;;;1E3F; +1E3F;LATIN SMALL LETTER M WITH ACUTE;Ll;0;L;006D 0301;;;;N;;;1E3E;;1E3E +1E40;LATIN CAPITAL LETTER M WITH DOT ABOVE;Lu;0;L;004D 0307;;;;N;;;;1E41; +1E41;LATIN SMALL LETTER M WITH DOT ABOVE;Ll;0;L;006D 0307;;;;N;;;1E40;;1E40 +1E42;LATIN CAPITAL LETTER M WITH DOT BELOW;Lu;0;L;004D 0323;;;;N;;;;1E43; +1E43;LATIN SMALL LETTER M WITH DOT BELOW;Ll;0;L;006D 0323;;;;N;;;1E42;;1E42 +1E44;LATIN CAPITAL LETTER N WITH DOT ABOVE;Lu;0;L;004E 0307;;;;N;;;;1E45; +1E45;LATIN SMALL LETTER N WITH DOT ABOVE;Ll;0;L;006E 0307;;;;N;;;1E44;;1E44 +1E46;LATIN CAPITAL LETTER N WITH DOT BELOW;Lu;0;L;004E 0323;;;;N;;;;1E47; +1E47;LATIN SMALL LETTER N WITH DOT BELOW;Ll;0;L;006E 0323;;;;N;;;1E46;;1E46 +1E48;LATIN CAPITAL LETTER N WITH LINE BELOW;Lu;0;L;004E 0331;;;;N;;;;1E49; +1E49;LATIN SMALL LETTER N WITH LINE BELOW;Ll;0;L;006E 0331;;;;N;;;1E48;;1E48 +1E4A;LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW;Lu;0;L;004E 032D;;;;N;;;;1E4B; +1E4B;LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW;Ll;0;L;006E 032D;;;;N;;;1E4A;;1E4A +1E4C;LATIN CAPITAL LETTER O WITH TILDE AND ACUTE;Lu;0;L;00D5 0301;;;;N;;;;1E4D; +1E4D;LATIN SMALL LETTER O WITH TILDE AND ACUTE;Ll;0;L;00F5 0301;;;;N;;;1E4C;;1E4C +1E4E;LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS;Lu;0;L;00D5 0308;;;;N;;;;1E4F; +1E4F;LATIN SMALL LETTER O WITH TILDE AND DIAERESIS;Ll;0;L;00F5 0308;;;;N;;;1E4E;;1E4E +1E50;LATIN CAPITAL LETTER O WITH MACRON AND GRAVE;Lu;0;L;014C 0300;;;;N;;;;1E51; +1E51;LATIN SMALL LETTER O WITH MACRON AND GRAVE;Ll;0;L;014D 0300;;;;N;;;1E50;;1E50 +1E52;LATIN CAPITAL LETTER O WITH MACRON AND ACUTE;Lu;0;L;014C 0301;;;;N;;;;1E53; +1E53;LATIN SMALL LETTER O WITH MACRON AND ACUTE;Ll;0;L;014D 0301;;;;N;;;1E52;;1E52 +1E54;LATIN CAPITAL LETTER P WITH ACUTE;Lu;0;L;0050 0301;;;;N;;;;1E55; +1E55;LATIN SMALL LETTER P WITH ACUTE;Ll;0;L;0070 0301;;;;N;;;1E54;;1E54 +1E56;LATIN CAPITAL LETTER P WITH DOT ABOVE;Lu;0;L;0050 0307;;;;N;;;;1E57; +1E57;LATIN SMALL LETTER P WITH DOT ABOVE;Ll;0;L;0070 0307;;;;N;;;1E56;;1E56 +1E58;LATIN CAPITAL LETTER R WITH DOT ABOVE;Lu;0;L;0052 0307;;;;N;;;;1E59; +1E59;LATIN SMALL LETTER R WITH DOT ABOVE;Ll;0;L;0072 0307;;;;N;;;1E58;;1E58 +1E5A;LATIN CAPITAL LETTER R WITH DOT BELOW;Lu;0;L;0052 0323;;;;N;;;;1E5B; +1E5B;LATIN SMALL LETTER R WITH DOT BELOW;Ll;0;L;0072 0323;;;;N;;;1E5A;;1E5A +1E5C;LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON;Lu;0;L;1E5A 0304;;;;N;;;;1E5D; +1E5D;LATIN SMALL LETTER R WITH DOT BELOW AND MACRON;Ll;0;L;1E5B 0304;;;;N;;;1E5C;;1E5C +1E5E;LATIN CAPITAL LETTER R WITH LINE BELOW;Lu;0;L;0052 0331;;;;N;;;;1E5F; +1E5F;LATIN SMALL LETTER R WITH LINE BELOW;Ll;0;L;0072 0331;;;;N;;;1E5E;;1E5E +1E60;LATIN CAPITAL LETTER S WITH DOT ABOVE;Lu;0;L;0053 0307;;;;N;;;;1E61; +1E61;LATIN SMALL LETTER S WITH DOT ABOVE;Ll;0;L;0073 0307;;;;N;;;1E60;;1E60 +1E62;LATIN CAPITAL LETTER S WITH DOT BELOW;Lu;0;L;0053 0323;;;;N;;;;1E63; +1E63;LATIN SMALL LETTER S WITH DOT BELOW;Ll;0;L;0073 0323;;;;N;;;1E62;;1E62 +1E64;LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE;Lu;0;L;015A 0307;;;;N;;;;1E65; +1E65;LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE;Ll;0;L;015B 0307;;;;N;;;1E64;;1E64 +1E66;LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE;Lu;0;L;0160 0307;;;;N;;;;1E67; +1E67;LATIN SMALL LETTER S WITH CARON AND DOT ABOVE;Ll;0;L;0161 0307;;;;N;;;1E66;;1E66 +1E68;LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE;Lu;0;L;1E62 0307;;;;N;;;;1E69; +1E69;LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE;Ll;0;L;1E63 0307;;;;N;;;1E68;;1E68 +1E6A;LATIN CAPITAL LETTER T WITH DOT ABOVE;Lu;0;L;0054 0307;;;;N;;;;1E6B; +1E6B;LATIN SMALL LETTER T WITH DOT ABOVE;Ll;0;L;0074 0307;;;;N;;;1E6A;;1E6A +1E6C;LATIN CAPITAL LETTER T WITH DOT BELOW;Lu;0;L;0054 0323;;;;N;;;;1E6D; +1E6D;LATIN SMALL LETTER T WITH DOT BELOW;Ll;0;L;0074 0323;;;;N;;;1E6C;;1E6C +1E6E;LATIN CAPITAL LETTER T WITH LINE BELOW;Lu;0;L;0054 0331;;;;N;;;;1E6F; +1E6F;LATIN SMALL LETTER T WITH LINE BELOW;Ll;0;L;0074 0331;;;;N;;;1E6E;;1E6E +1E70;LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW;Lu;0;L;0054 032D;;;;N;;;;1E71; +1E71;LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW;Ll;0;L;0074 032D;;;;N;;;1E70;;1E70 +1E72;LATIN CAPITAL LETTER U WITH DIAERESIS BELOW;Lu;0;L;0055 0324;;;;N;;;;1E73; +1E73;LATIN SMALL LETTER U WITH DIAERESIS BELOW;Ll;0;L;0075 0324;;;;N;;;1E72;;1E72 +1E74;LATIN CAPITAL LETTER U WITH TILDE BELOW;Lu;0;L;0055 0330;;;;N;;;;1E75; +1E75;LATIN SMALL LETTER U WITH TILDE BELOW;Ll;0;L;0075 0330;;;;N;;;1E74;;1E74 +1E76;LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW;Lu;0;L;0055 032D;;;;N;;;;1E77; +1E77;LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW;Ll;0;L;0075 032D;;;;N;;;1E76;;1E76 +1E78;LATIN CAPITAL LETTER U WITH TILDE AND ACUTE;Lu;0;L;0168 0301;;;;N;;;;1E79; +1E79;LATIN SMALL LETTER U WITH TILDE AND ACUTE;Ll;0;L;0169 0301;;;;N;;;1E78;;1E78 +1E7A;LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS;Lu;0;L;016A 0308;;;;N;;;;1E7B; +1E7B;LATIN SMALL LETTER U WITH MACRON AND DIAERESIS;Ll;0;L;016B 0308;;;;N;;;1E7A;;1E7A +1E7C;LATIN CAPITAL LETTER V WITH TILDE;Lu;0;L;0056 0303;;;;N;;;;1E7D; +1E7D;LATIN SMALL LETTER V WITH TILDE;Ll;0;L;0076 0303;;;;N;;;1E7C;;1E7C +1E7E;LATIN CAPITAL LETTER V WITH DOT BELOW;Lu;0;L;0056 0323;;;;N;;;;1E7F; +1E7F;LATIN SMALL LETTER V WITH DOT BELOW;Ll;0;L;0076 0323;;;;N;;;1E7E;;1E7E +1E80;LATIN CAPITAL LETTER W WITH GRAVE;Lu;0;L;0057 0300;;;;N;;;;1E81; +1E81;LATIN SMALL LETTER W WITH GRAVE;Ll;0;L;0077 0300;;;;N;;;1E80;;1E80 +1E82;LATIN CAPITAL LETTER W WITH ACUTE;Lu;0;L;0057 0301;;;;N;;;;1E83; +1E83;LATIN SMALL LETTER W WITH ACUTE;Ll;0;L;0077 0301;;;;N;;;1E82;;1E82 +1E84;LATIN CAPITAL LETTER W WITH DIAERESIS;Lu;0;L;0057 0308;;;;N;;;;1E85; +1E85;LATIN SMALL LETTER W WITH DIAERESIS;Ll;0;L;0077 0308;;;;N;;;1E84;;1E84 +1E86;LATIN CAPITAL LETTER W WITH DOT ABOVE;Lu;0;L;0057 0307;;;;N;;;;1E87; +1E87;LATIN SMALL LETTER W WITH DOT ABOVE;Ll;0;L;0077 0307;;;;N;;;1E86;;1E86 +1E88;LATIN CAPITAL LETTER W WITH DOT BELOW;Lu;0;L;0057 0323;;;;N;;;;1E89; +1E89;LATIN SMALL LETTER W WITH DOT BELOW;Ll;0;L;0077 0323;;;;N;;;1E88;;1E88 +1E8A;LATIN CAPITAL LETTER X WITH DOT ABOVE;Lu;0;L;0058 0307;;;;N;;;;1E8B; +1E8B;LATIN SMALL LETTER X WITH DOT ABOVE;Ll;0;L;0078 0307;;;;N;;;1E8A;;1E8A +1E8C;LATIN CAPITAL LETTER X WITH DIAERESIS;Lu;0;L;0058 0308;;;;N;;;;1E8D; +1E8D;LATIN SMALL LETTER X WITH DIAERESIS;Ll;0;L;0078 0308;;;;N;;;1E8C;;1E8C +1E8E;LATIN CAPITAL LETTER Y WITH DOT ABOVE;Lu;0;L;0059 0307;;;;N;;;;1E8F; +1E8F;LATIN SMALL LETTER Y WITH DOT ABOVE;Ll;0;L;0079 0307;;;;N;;;1E8E;;1E8E +1E90;LATIN CAPITAL LETTER Z WITH CIRCUMFLEX;Lu;0;L;005A 0302;;;;N;;;;1E91; +1E91;LATIN SMALL LETTER Z WITH CIRCUMFLEX;Ll;0;L;007A 0302;;;;N;;;1E90;;1E90 +1E92;LATIN CAPITAL LETTER Z WITH DOT BELOW;Lu;0;L;005A 0323;;;;N;;;;1E93; +1E93;LATIN SMALL LETTER Z WITH DOT BELOW;Ll;0;L;007A 0323;;;;N;;;1E92;;1E92 +1E94;LATIN CAPITAL LETTER Z WITH LINE BELOW;Lu;0;L;005A 0331;;;;N;;;;1E95; +1E95;LATIN SMALL LETTER Z WITH LINE BELOW;Ll;0;L;007A 0331;;;;N;;;1E94;;1E94 +1E96;LATIN SMALL LETTER H WITH LINE BELOW;Ll;0;L;0068 0331;;;;N;;;;; +1E97;LATIN SMALL LETTER T WITH DIAERESIS;Ll;0;L;0074 0308;;;;N;;;;; +1E98;LATIN SMALL LETTER W WITH RING ABOVE;Ll;0;L;0077 030A;;;;N;;;;; +1E99;LATIN SMALL LETTER Y WITH RING ABOVE;Ll;0;L;0079 030A;;;;N;;;;; +1E9A;LATIN SMALL LETTER A WITH RIGHT HALF RING;Ll;0;L;<compat> 0061 02BE;;;;N;;;;; +1E9B;LATIN SMALL LETTER LONG S WITH DOT ABOVE;Ll;0;L;017F 0307;;;;N;;;1E60;;1E60 +1E9C;LATIN SMALL LETTER LONG S WITH DIAGONAL STROKE;Ll;0;L;;;;;N;;;;; +1E9D;LATIN SMALL LETTER LONG S WITH HIGH STROKE;Ll;0;L;;;;;N;;;;; +1E9E;LATIN CAPITAL LETTER SHARP S;Lu;0;L;;;;;N;;;;00DF; +1E9F;LATIN SMALL LETTER DELTA;Ll;0;L;;;;;N;;;;; +1EA0;LATIN CAPITAL LETTER A WITH DOT BELOW;Lu;0;L;0041 0323;;;;N;;;;1EA1; +1EA1;LATIN SMALL LETTER A WITH DOT BELOW;Ll;0;L;0061 0323;;;;N;;;1EA0;;1EA0 +1EA2;LATIN CAPITAL LETTER A WITH HOOK ABOVE;Lu;0;L;0041 0309;;;;N;;;;1EA3; +1EA3;LATIN SMALL LETTER A WITH HOOK ABOVE;Ll;0;L;0061 0309;;;;N;;;1EA2;;1EA2 +1EA4;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE;Lu;0;L;00C2 0301;;;;N;;;;1EA5; +1EA5;LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE;Ll;0;L;00E2 0301;;;;N;;;1EA4;;1EA4 +1EA6;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE;Lu;0;L;00C2 0300;;;;N;;;;1EA7; +1EA7;LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE;Ll;0;L;00E2 0300;;;;N;;;1EA6;;1EA6 +1EA8;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE;Lu;0;L;00C2 0309;;;;N;;;;1EA9; +1EA9;LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE;Ll;0;L;00E2 0309;;;;N;;;1EA8;;1EA8 +1EAA;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE;Lu;0;L;00C2 0303;;;;N;;;;1EAB; +1EAB;LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE;Ll;0;L;00E2 0303;;;;N;;;1EAA;;1EAA +1EAC;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW;Lu;0;L;1EA0 0302;;;;N;;;;1EAD; +1EAD;LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW;Ll;0;L;1EA1 0302;;;;N;;;1EAC;;1EAC +1EAE;LATIN CAPITAL LETTER A WITH BREVE AND ACUTE;Lu;0;L;0102 0301;;;;N;;;;1EAF; +1EAF;LATIN SMALL LETTER A WITH BREVE AND ACUTE;Ll;0;L;0103 0301;;;;N;;;1EAE;;1EAE +1EB0;LATIN CAPITAL LETTER A WITH BREVE AND GRAVE;Lu;0;L;0102 0300;;;;N;;;;1EB1; +1EB1;LATIN SMALL LETTER A WITH BREVE AND GRAVE;Ll;0;L;0103 0300;;;;N;;;1EB0;;1EB0 +1EB2;LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE;Lu;0;L;0102 0309;;;;N;;;;1EB3; +1EB3;LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE;Ll;0;L;0103 0309;;;;N;;;1EB2;;1EB2 +1EB4;LATIN CAPITAL LETTER A WITH BREVE AND TILDE;Lu;0;L;0102 0303;;;;N;;;;1EB5; +1EB5;LATIN SMALL LETTER A WITH BREVE AND TILDE;Ll;0;L;0103 0303;;;;N;;;1EB4;;1EB4 +1EB6;LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW;Lu;0;L;1EA0 0306;;;;N;;;;1EB7; +1EB7;LATIN SMALL LETTER A WITH BREVE AND DOT BELOW;Ll;0;L;1EA1 0306;;;;N;;;1EB6;;1EB6 +1EB8;LATIN CAPITAL LETTER E WITH DOT BELOW;Lu;0;L;0045 0323;;;;N;;;;1EB9; +1EB9;LATIN SMALL LETTER E WITH DOT BELOW;Ll;0;L;0065 0323;;;;N;;;1EB8;;1EB8 +1EBA;LATIN CAPITAL LETTER E WITH HOOK ABOVE;Lu;0;L;0045 0309;;;;N;;;;1EBB; +1EBB;LATIN SMALL LETTER E WITH HOOK ABOVE;Ll;0;L;0065 0309;;;;N;;;1EBA;;1EBA +1EBC;LATIN CAPITAL LETTER E WITH TILDE;Lu;0;L;0045 0303;;;;N;;;;1EBD; +1EBD;LATIN SMALL LETTER E WITH TILDE;Ll;0;L;0065 0303;;;;N;;;1EBC;;1EBC +1EBE;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE;Lu;0;L;00CA 0301;;;;N;;;;1EBF; +1EBF;LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE;Ll;0;L;00EA 0301;;;;N;;;1EBE;;1EBE +1EC0;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE;Lu;0;L;00CA 0300;;;;N;;;;1EC1; +1EC1;LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE;Ll;0;L;00EA 0300;;;;N;;;1EC0;;1EC0 +1EC2;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE;Lu;0;L;00CA 0309;;;;N;;;;1EC3; +1EC3;LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE;Ll;0;L;00EA 0309;;;;N;;;1EC2;;1EC2 +1EC4;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE;Lu;0;L;00CA 0303;;;;N;;;;1EC5; +1EC5;LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE;Ll;0;L;00EA 0303;;;;N;;;1EC4;;1EC4 +1EC6;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW;Lu;0;L;1EB8 0302;;;;N;;;;1EC7; +1EC7;LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW;Ll;0;L;1EB9 0302;;;;N;;;1EC6;;1EC6 +1EC8;LATIN CAPITAL LETTER I WITH HOOK ABOVE;Lu;0;L;0049 0309;;;;N;;;;1EC9; +1EC9;LATIN SMALL LETTER I WITH HOOK ABOVE;Ll;0;L;0069 0309;;;;N;;;1EC8;;1EC8 +1ECA;LATIN CAPITAL LETTER I WITH DOT BELOW;Lu;0;L;0049 0323;;;;N;;;;1ECB; +1ECB;LATIN SMALL LETTER I WITH DOT BELOW;Ll;0;L;0069 0323;;;;N;;;1ECA;;1ECA +1ECC;LATIN CAPITAL LETTER O WITH DOT BELOW;Lu;0;L;004F 0323;;;;N;;;;1ECD; +1ECD;LATIN SMALL LETTER O WITH DOT BELOW;Ll;0;L;006F 0323;;;;N;;;1ECC;;1ECC +1ECE;LATIN CAPITAL LETTER O WITH HOOK ABOVE;Lu;0;L;004F 0309;;;;N;;;;1ECF; +1ECF;LATIN SMALL LETTER O WITH HOOK ABOVE;Ll;0;L;006F 0309;;;;N;;;1ECE;;1ECE +1ED0;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE;Lu;0;L;00D4 0301;;;;N;;;;1ED1; +1ED1;LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE;Ll;0;L;00F4 0301;;;;N;;;1ED0;;1ED0 +1ED2;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE;Lu;0;L;00D4 0300;;;;N;;;;1ED3; +1ED3;LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE;Ll;0;L;00F4 0300;;;;N;;;1ED2;;1ED2 +1ED4;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE;Lu;0;L;00D4 0309;;;;N;;;;1ED5; +1ED5;LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE;Ll;0;L;00F4 0309;;;;N;;;1ED4;;1ED4 +1ED6;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE;Lu;0;L;00D4 0303;;;;N;;;;1ED7; +1ED7;LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE;Ll;0;L;00F4 0303;;;;N;;;1ED6;;1ED6 +1ED8;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW;Lu;0;L;1ECC 0302;;;;N;;;;1ED9; +1ED9;LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW;Ll;0;L;1ECD 0302;;;;N;;;1ED8;;1ED8 +1EDA;LATIN CAPITAL LETTER O WITH HORN AND ACUTE;Lu;0;L;01A0 0301;;;;N;;;;1EDB; +1EDB;LATIN SMALL LETTER O WITH HORN AND ACUTE;Ll;0;L;01A1 0301;;;;N;;;1EDA;;1EDA +1EDC;LATIN CAPITAL LETTER O WITH HORN AND GRAVE;Lu;0;L;01A0 0300;;;;N;;;;1EDD; +1EDD;LATIN SMALL LETTER O WITH HORN AND GRAVE;Ll;0;L;01A1 0300;;;;N;;;1EDC;;1EDC +1EDE;LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE;Lu;0;L;01A0 0309;;;;N;;;;1EDF; +1EDF;LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE;Ll;0;L;01A1 0309;;;;N;;;1EDE;;1EDE +1EE0;LATIN CAPITAL LETTER O WITH HORN AND TILDE;Lu;0;L;01A0 0303;;;;N;;;;1EE1; +1EE1;LATIN SMALL LETTER O WITH HORN AND TILDE;Ll;0;L;01A1 0303;;;;N;;;1EE0;;1EE0 +1EE2;LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW;Lu;0;L;01A0 0323;;;;N;;;;1EE3; +1EE3;LATIN SMALL LETTER O WITH HORN AND DOT BELOW;Ll;0;L;01A1 0323;;;;N;;;1EE2;;1EE2 +1EE4;LATIN CAPITAL LETTER U WITH DOT BELOW;Lu;0;L;0055 0323;;;;N;;;;1EE5; +1EE5;LATIN SMALL LETTER U WITH DOT BELOW;Ll;0;L;0075 0323;;;;N;;;1EE4;;1EE4 +1EE6;LATIN CAPITAL LETTER U WITH HOOK ABOVE;Lu;0;L;0055 0309;;;;N;;;;1EE7; +1EE7;LATIN SMALL LETTER U WITH HOOK ABOVE;Ll;0;L;0075 0309;;;;N;;;1EE6;;1EE6 +1EE8;LATIN CAPITAL LETTER U WITH HORN AND ACUTE;Lu;0;L;01AF 0301;;;;N;;;;1EE9; +1EE9;LATIN SMALL LETTER U WITH HORN AND ACUTE;Ll;0;L;01B0 0301;;;;N;;;1EE8;;1EE8 +1EEA;LATIN CAPITAL LETTER U WITH HORN AND GRAVE;Lu;0;L;01AF 0300;;;;N;;;;1EEB; +1EEB;LATIN SMALL LETTER U WITH HORN AND GRAVE;Ll;0;L;01B0 0300;;;;N;;;1EEA;;1EEA +1EEC;LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE;Lu;0;L;01AF 0309;;;;N;;;;1EED; +1EED;LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE;Ll;0;L;01B0 0309;;;;N;;;1EEC;;1EEC +1EEE;LATIN CAPITAL LETTER U WITH HORN AND TILDE;Lu;0;L;01AF 0303;;;;N;;;;1EEF; +1EEF;LATIN SMALL LETTER U WITH HORN AND TILDE;Ll;0;L;01B0 0303;;;;N;;;1EEE;;1EEE +1EF0;LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW;Lu;0;L;01AF 0323;;;;N;;;;1EF1; +1EF1;LATIN SMALL LETTER U WITH HORN AND DOT BELOW;Ll;0;L;01B0 0323;;;;N;;;1EF0;;1EF0 +1EF2;LATIN CAPITAL LETTER Y WITH GRAVE;Lu;0;L;0059 0300;;;;N;;;;1EF3; +1EF3;LATIN SMALL LETTER Y WITH GRAVE;Ll;0;L;0079 0300;;;;N;;;1EF2;;1EF2 +1EF4;LATIN CAPITAL LETTER Y WITH DOT BELOW;Lu;0;L;0059 0323;;;;N;;;;1EF5; +1EF5;LATIN SMALL LETTER Y WITH DOT BELOW;Ll;0;L;0079 0323;;;;N;;;1EF4;;1EF4 +1EF6;LATIN CAPITAL LETTER Y WITH HOOK ABOVE;Lu;0;L;0059 0309;;;;N;;;;1EF7; +1EF7;LATIN SMALL LETTER Y WITH HOOK ABOVE;Ll;0;L;0079 0309;;;;N;;;1EF6;;1EF6 +1EF8;LATIN CAPITAL LETTER Y WITH TILDE;Lu;0;L;0059 0303;;;;N;;;;1EF9; +1EF9;LATIN SMALL LETTER Y WITH TILDE;Ll;0;L;0079 0303;;;;N;;;1EF8;;1EF8 +1EFA;LATIN CAPITAL LETTER MIDDLE-WELSH LL;Lu;0;L;;;;;N;;;;1EFB; +1EFB;LATIN SMALL LETTER MIDDLE-WELSH LL;Ll;0;L;;;;;N;;;1EFA;;1EFA +1EFC;LATIN CAPITAL LETTER MIDDLE-WELSH V;Lu;0;L;;;;;N;;;;1EFD; +1EFD;LATIN SMALL LETTER MIDDLE-WELSH V;Ll;0;L;;;;;N;;;1EFC;;1EFC +1EFE;LATIN CAPITAL LETTER Y WITH LOOP;Lu;0;L;;;;;N;;;;1EFF; +1EFF;LATIN SMALL LETTER Y WITH LOOP;Ll;0;L;;;;;N;;;1EFE;;1EFE +1F00;GREEK SMALL LETTER ALPHA WITH PSILI;Ll;0;L;03B1 0313;;;;N;;;1F08;;1F08 +1F01;GREEK SMALL LETTER ALPHA WITH DASIA;Ll;0;L;03B1 0314;;;;N;;;1F09;;1F09 +1F02;GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA;Ll;0;L;1F00 0300;;;;N;;;1F0A;;1F0A +1F03;GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA;Ll;0;L;1F01 0300;;;;N;;;1F0B;;1F0B +1F04;GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA;Ll;0;L;1F00 0301;;;;N;;;1F0C;;1F0C +1F05;GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA;Ll;0;L;1F01 0301;;;;N;;;1F0D;;1F0D +1F06;GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI;Ll;0;L;1F00 0342;;;;N;;;1F0E;;1F0E +1F07;GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI;Ll;0;L;1F01 0342;;;;N;;;1F0F;;1F0F +1F08;GREEK CAPITAL LETTER ALPHA WITH PSILI;Lu;0;L;0391 0313;;;;N;;;;1F00; +1F09;GREEK CAPITAL LETTER ALPHA WITH DASIA;Lu;0;L;0391 0314;;;;N;;;;1F01; +1F0A;GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA;Lu;0;L;1F08 0300;;;;N;;;;1F02; +1F0B;GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA;Lu;0;L;1F09 0300;;;;N;;;;1F03; +1F0C;GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA;Lu;0;L;1F08 0301;;;;N;;;;1F04; +1F0D;GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA;Lu;0;L;1F09 0301;;;;N;;;;1F05; +1F0E;GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI;Lu;0;L;1F08 0342;;;;N;;;;1F06; +1F0F;GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI;Lu;0;L;1F09 0342;;;;N;;;;1F07; +1F10;GREEK SMALL LETTER EPSILON WITH PSILI;Ll;0;L;03B5 0313;;;;N;;;1F18;;1F18 +1F11;GREEK SMALL LETTER EPSILON WITH DASIA;Ll;0;L;03B5 0314;;;;N;;;1F19;;1F19 +1F12;GREEK SMALL LETTER EPSILON WITH PSILI AND VARIA;Ll;0;L;1F10 0300;;;;N;;;1F1A;;1F1A +1F13;GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA;Ll;0;L;1F11 0300;;;;N;;;1F1B;;1F1B +1F14;GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA;Ll;0;L;1F10 0301;;;;N;;;1F1C;;1F1C +1F15;GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA;Ll;0;L;1F11 0301;;;;N;;;1F1D;;1F1D +1F18;GREEK CAPITAL LETTER EPSILON WITH PSILI;Lu;0;L;0395 0313;;;;N;;;;1F10; +1F19;GREEK CAPITAL LETTER EPSILON WITH DASIA;Lu;0;L;0395 0314;;;;N;;;;1F11; +1F1A;GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA;Lu;0;L;1F18 0300;;;;N;;;;1F12; +1F1B;GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA;Lu;0;L;1F19 0300;;;;N;;;;1F13; +1F1C;GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA;Lu;0;L;1F18 0301;;;;N;;;;1F14; +1F1D;GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA;Lu;0;L;1F19 0301;;;;N;;;;1F15; +1F20;GREEK SMALL LETTER ETA WITH PSILI;Ll;0;L;03B7 0313;;;;N;;;1F28;;1F28 +1F21;GREEK SMALL LETTER ETA WITH DASIA;Ll;0;L;03B7 0314;;;;N;;;1F29;;1F29 +1F22;GREEK SMALL LETTER ETA WITH PSILI AND VARIA;Ll;0;L;1F20 0300;;;;N;;;1F2A;;1F2A +1F23;GREEK SMALL LETTER ETA WITH DASIA AND VARIA;Ll;0;L;1F21 0300;;;;N;;;1F2B;;1F2B +1F24;GREEK SMALL LETTER ETA WITH PSILI AND OXIA;Ll;0;L;1F20 0301;;;;N;;;1F2C;;1F2C +1F25;GREEK SMALL LETTER ETA WITH DASIA AND OXIA;Ll;0;L;1F21 0301;;;;N;;;1F2D;;1F2D +1F26;GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI;Ll;0;L;1F20 0342;;;;N;;;1F2E;;1F2E +1F27;GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI;Ll;0;L;1F21 0342;;;;N;;;1F2F;;1F2F +1F28;GREEK CAPITAL LETTER ETA WITH PSILI;Lu;0;L;0397 0313;;;;N;;;;1F20; +1F29;GREEK CAPITAL LETTER ETA WITH DASIA;Lu;0;L;0397 0314;;;;N;;;;1F21; +1F2A;GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA;Lu;0;L;1F28 0300;;;;N;;;;1F22; +1F2B;GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA;Lu;0;L;1F29 0300;;;;N;;;;1F23; +1F2C;GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA;Lu;0;L;1F28 0301;;;;N;;;;1F24; +1F2D;GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA;Lu;0;L;1F29 0301;;;;N;;;;1F25; +1F2E;GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI;Lu;0;L;1F28 0342;;;;N;;;;1F26; +1F2F;GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI;Lu;0;L;1F29 0342;;;;N;;;;1F27; +1F30;GREEK SMALL LETTER IOTA WITH PSILI;Ll;0;L;03B9 0313;;;;N;;;1F38;;1F38 +1F31;GREEK SMALL LETTER IOTA WITH DASIA;Ll;0;L;03B9 0314;;;;N;;;1F39;;1F39 +1F32;GREEK SMALL LETTER IOTA WITH PSILI AND VARIA;Ll;0;L;1F30 0300;;;;N;;;1F3A;;1F3A +1F33;GREEK SMALL LETTER IOTA WITH DASIA AND VARIA;Ll;0;L;1F31 0300;;;;N;;;1F3B;;1F3B +1F34;GREEK SMALL LETTER IOTA WITH PSILI AND OXIA;Ll;0;L;1F30 0301;;;;N;;;1F3C;;1F3C +1F35;GREEK SMALL LETTER IOTA WITH DASIA AND OXIA;Ll;0;L;1F31 0301;;;;N;;;1F3D;;1F3D +1F36;GREEK SMALL LETTER IOTA WITH PSILI AND PERISPOMENI;Ll;0;L;1F30 0342;;;;N;;;1F3E;;1F3E +1F37;GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI;Ll;0;L;1F31 0342;;;;N;;;1F3F;;1F3F +1F38;GREEK CAPITAL LETTER IOTA WITH PSILI;Lu;0;L;0399 0313;;;;N;;;;1F30; +1F39;GREEK CAPITAL LETTER IOTA WITH DASIA;Lu;0;L;0399 0314;;;;N;;;;1F31; +1F3A;GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA;Lu;0;L;1F38 0300;;;;N;;;;1F32; +1F3B;GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA;Lu;0;L;1F39 0300;;;;N;;;;1F33; +1F3C;GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA;Lu;0;L;1F38 0301;;;;N;;;;1F34; +1F3D;GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA;Lu;0;L;1F39 0301;;;;N;;;;1F35; +1F3E;GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI;Lu;0;L;1F38 0342;;;;N;;;;1F36; +1F3F;GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI;Lu;0;L;1F39 0342;;;;N;;;;1F37; +1F40;GREEK SMALL LETTER OMICRON WITH PSILI;Ll;0;L;03BF 0313;;;;N;;;1F48;;1F48 +1F41;GREEK SMALL LETTER OMICRON WITH DASIA;Ll;0;L;03BF 0314;;;;N;;;1F49;;1F49 +1F42;GREEK SMALL LETTER OMICRON WITH PSILI AND VARIA;Ll;0;L;1F40 0300;;;;N;;;1F4A;;1F4A +1F43;GREEK SMALL LETTER OMICRON WITH DASIA AND VARIA;Ll;0;L;1F41 0300;;;;N;;;1F4B;;1F4B +1F44;GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA;Ll;0;L;1F40 0301;;;;N;;;1F4C;;1F4C +1F45;GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA;Ll;0;L;1F41 0301;;;;N;;;1F4D;;1F4D +1F48;GREEK CAPITAL LETTER OMICRON WITH PSILI;Lu;0;L;039F 0313;;;;N;;;;1F40; +1F49;GREEK CAPITAL LETTER OMICRON WITH DASIA;Lu;0;L;039F 0314;;;;N;;;;1F41; +1F4A;GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA;Lu;0;L;1F48 0300;;;;N;;;;1F42; +1F4B;GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA;Lu;0;L;1F49 0300;;;;N;;;;1F43; +1F4C;GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA;Lu;0;L;1F48 0301;;;;N;;;;1F44; +1F4D;GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA;Lu;0;L;1F49 0301;;;;N;;;;1F45; +1F50;GREEK SMALL LETTER UPSILON WITH PSILI;Ll;0;L;03C5 0313;;;;N;;;;; +1F51;GREEK SMALL LETTER UPSILON WITH DASIA;Ll;0;L;03C5 0314;;;;N;;;1F59;;1F59 +1F52;GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA;Ll;0;L;1F50 0300;;;;N;;;;; +1F53;GREEK SMALL LETTER UPSILON WITH DASIA AND VARIA;Ll;0;L;1F51 0300;;;;N;;;1F5B;;1F5B +1F54;GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA;Ll;0;L;1F50 0301;;;;N;;;;; +1F55;GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA;Ll;0;L;1F51 0301;;;;N;;;1F5D;;1F5D +1F56;GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI;Ll;0;L;1F50 0342;;;;N;;;;; +1F57;GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI;Ll;0;L;1F51 0342;;;;N;;;1F5F;;1F5F +1F59;GREEK CAPITAL LETTER UPSILON WITH DASIA;Lu;0;L;03A5 0314;;;;N;;;;1F51; +1F5B;GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA;Lu;0;L;1F59 0300;;;;N;;;;1F53; +1F5D;GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA;Lu;0;L;1F59 0301;;;;N;;;;1F55; +1F5F;GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI;Lu;0;L;1F59 0342;;;;N;;;;1F57; +1F60;GREEK SMALL LETTER OMEGA WITH PSILI;Ll;0;L;03C9 0313;;;;N;;;1F68;;1F68 +1F61;GREEK SMALL LETTER OMEGA WITH DASIA;Ll;0;L;03C9 0314;;;;N;;;1F69;;1F69 +1F62;GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA;Ll;0;L;1F60 0300;;;;N;;;1F6A;;1F6A +1F63;GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA;Ll;0;L;1F61 0300;;;;N;;;1F6B;;1F6B +1F64;GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA;Ll;0;L;1F60 0301;;;;N;;;1F6C;;1F6C +1F65;GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA;Ll;0;L;1F61 0301;;;;N;;;1F6D;;1F6D +1F66;GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI;Ll;0;L;1F60 0342;;;;N;;;1F6E;;1F6E +1F67;GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI;Ll;0;L;1F61 0342;;;;N;;;1F6F;;1F6F +1F68;GREEK CAPITAL LETTER OMEGA WITH PSILI;Lu;0;L;03A9 0313;;;;N;;;;1F60; +1F69;GREEK CAPITAL LETTER OMEGA WITH DASIA;Lu;0;L;03A9 0314;;;;N;;;;1F61; +1F6A;GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA;Lu;0;L;1F68 0300;;;;N;;;;1F62; +1F6B;GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA;Lu;0;L;1F69 0300;;;;N;;;;1F63; +1F6C;GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA;Lu;0;L;1F68 0301;;;;N;;;;1F64; +1F6D;GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA;Lu;0;L;1F69 0301;;;;N;;;;1F65; +1F6E;GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI;Lu;0;L;1F68 0342;;;;N;;;;1F66; +1F6F;GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI;Lu;0;L;1F69 0342;;;;N;;;;1F67; +1F70;GREEK SMALL LETTER ALPHA WITH VARIA;Ll;0;L;03B1 0300;;;;N;;;1FBA;;1FBA +1F71;GREEK SMALL LETTER ALPHA WITH OXIA;Ll;0;L;03AC;;;;N;;;1FBB;;1FBB +1F72;GREEK SMALL LETTER EPSILON WITH VARIA;Ll;0;L;03B5 0300;;;;N;;;1FC8;;1FC8 +1F73;GREEK SMALL LETTER EPSILON WITH OXIA;Ll;0;L;03AD;;;;N;;;1FC9;;1FC9 +1F74;GREEK SMALL LETTER ETA WITH VARIA;Ll;0;L;03B7 0300;;;;N;;;1FCA;;1FCA +1F75;GREEK SMALL LETTER ETA WITH OXIA;Ll;0;L;03AE;;;;N;;;1FCB;;1FCB +1F76;GREEK SMALL LETTER IOTA WITH VARIA;Ll;0;L;03B9 0300;;;;N;;;1FDA;;1FDA +1F77;GREEK SMALL LETTER IOTA WITH OXIA;Ll;0;L;03AF;;;;N;;;1FDB;;1FDB +1F78;GREEK SMALL LETTER OMICRON WITH VARIA;Ll;0;L;03BF 0300;;;;N;;;1FF8;;1FF8 +1F79;GREEK SMALL LETTER OMICRON WITH OXIA;Ll;0;L;03CC;;;;N;;;1FF9;;1FF9 +1F7A;GREEK SMALL LETTER UPSILON WITH VARIA;Ll;0;L;03C5 0300;;;;N;;;1FEA;;1FEA +1F7B;GREEK SMALL LETTER UPSILON WITH OXIA;Ll;0;L;03CD;;;;N;;;1FEB;;1FEB +1F7C;GREEK SMALL LETTER OMEGA WITH VARIA;Ll;0;L;03C9 0300;;;;N;;;1FFA;;1FFA +1F7D;GREEK SMALL LETTER OMEGA WITH OXIA;Ll;0;L;03CE;;;;N;;;1FFB;;1FFB +1F80;GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI;Ll;0;L;1F00 0345;;;;N;;;1F88;;1F88 +1F81;GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI;Ll;0;L;1F01 0345;;;;N;;;1F89;;1F89 +1F82;GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F02 0345;;;;N;;;1F8A;;1F8A +1F83;GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F03 0345;;;;N;;;1F8B;;1F8B +1F84;GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F04 0345;;;;N;;;1F8C;;1F8C +1F85;GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F05 0345;;;;N;;;1F8D;;1F8D +1F86;GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F06 0345;;;;N;;;1F8E;;1F8E +1F87;GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F07 0345;;;;N;;;1F8F;;1F8F +1F88;GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI;Lt;0;L;1F08 0345;;;;N;;;;1F80; +1F89;GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI;Lt;0;L;1F09 0345;;;;N;;;;1F81; +1F8A;GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F0A 0345;;;;N;;;;1F82; +1F8B;GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F0B 0345;;;;N;;;;1F83; +1F8C;GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F0C 0345;;;;N;;;;1F84; +1F8D;GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F0D 0345;;;;N;;;;1F85; +1F8E;GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F0E 0345;;;;N;;;;1F86; +1F8F;GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F0F 0345;;;;N;;;;1F87; +1F90;GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI;Ll;0;L;1F20 0345;;;;N;;;1F98;;1F98 +1F91;GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI;Ll;0;L;1F21 0345;;;;N;;;1F99;;1F99 +1F92;GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F22 0345;;;;N;;;1F9A;;1F9A +1F93;GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F23 0345;;;;N;;;1F9B;;1F9B +1F94;GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F24 0345;;;;N;;;1F9C;;1F9C +1F95;GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F25 0345;;;;N;;;1F9D;;1F9D +1F96;GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F26 0345;;;;N;;;1F9E;;1F9E +1F97;GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F27 0345;;;;N;;;1F9F;;1F9F +1F98;GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI;Lt;0;L;1F28 0345;;;;N;;;;1F90; +1F99;GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI;Lt;0;L;1F29 0345;;;;N;;;;1F91; +1F9A;GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F2A 0345;;;;N;;;;1F92; +1F9B;GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F2B 0345;;;;N;;;;1F93; +1F9C;GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F2C 0345;;;;N;;;;1F94; +1F9D;GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F2D 0345;;;;N;;;;1F95; +1F9E;GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F2E 0345;;;;N;;;;1F96; +1F9F;GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F2F 0345;;;;N;;;;1F97; +1FA0;GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI;Ll;0;L;1F60 0345;;;;N;;;1FA8;;1FA8 +1FA1;GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI;Ll;0;L;1F61 0345;;;;N;;;1FA9;;1FA9 +1FA2;GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F62 0345;;;;N;;;1FAA;;1FAA +1FA3;GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F63 0345;;;;N;;;1FAB;;1FAB +1FA4;GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F64 0345;;;;N;;;1FAC;;1FAC +1FA5;GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F65 0345;;;;N;;;1FAD;;1FAD +1FA6;GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F66 0345;;;;N;;;1FAE;;1FAE +1FA7;GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F67 0345;;;;N;;;1FAF;;1FAF +1FA8;GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI;Lt;0;L;1F68 0345;;;;N;;;;1FA0; +1FA9;GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI;Lt;0;L;1F69 0345;;;;N;;;;1FA1; +1FAA;GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F6A 0345;;;;N;;;;1FA2; +1FAB;GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F6B 0345;;;;N;;;;1FA3; +1FAC;GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F6C 0345;;;;N;;;;1FA4; +1FAD;GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F6D 0345;;;;N;;;;1FA5; +1FAE;GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F6E 0345;;;;N;;;;1FA6; +1FAF;GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F6F 0345;;;;N;;;;1FA7; +1FB0;GREEK SMALL LETTER ALPHA WITH VRACHY;Ll;0;L;03B1 0306;;;;N;;;1FB8;;1FB8 +1FB1;GREEK SMALL LETTER ALPHA WITH MACRON;Ll;0;L;03B1 0304;;;;N;;;1FB9;;1FB9 +1FB2;GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI;Ll;0;L;1F70 0345;;;;N;;;;; +1FB3;GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI;Ll;0;L;03B1 0345;;;;N;;;1FBC;;1FBC +1FB4;GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI;Ll;0;L;03AC 0345;;;;N;;;;; +1FB6;GREEK SMALL LETTER ALPHA WITH PERISPOMENI;Ll;0;L;03B1 0342;;;;N;;;;; +1FB7;GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1FB6 0345;;;;N;;;;; +1FB8;GREEK CAPITAL LETTER ALPHA WITH VRACHY;Lu;0;L;0391 0306;;;;N;;;;1FB0; +1FB9;GREEK CAPITAL LETTER ALPHA WITH MACRON;Lu;0;L;0391 0304;;;;N;;;;1FB1; +1FBA;GREEK CAPITAL LETTER ALPHA WITH VARIA;Lu;0;L;0391 0300;;;;N;;;;1F70; +1FBB;GREEK CAPITAL LETTER ALPHA WITH OXIA;Lu;0;L;0386;;;;N;;;;1F71; +1FBC;GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI;Lt;0;L;0391 0345;;;;N;;;;1FB3; +1FBD;GREEK KORONIS;Sk;0;ON;<compat> 0020 0313;;;;N;;;;; +1FBE;GREEK PROSGEGRAMMENI;Ll;0;L;03B9;;;;N;;;0399;;0399 +1FBF;GREEK PSILI;Sk;0;ON;<compat> 0020 0313;;;;N;;;;; +1FC0;GREEK PERISPOMENI;Sk;0;ON;<compat> 0020 0342;;;;N;;;;; +1FC1;GREEK DIALYTIKA AND PERISPOMENI;Sk;0;ON;00A8 0342;;;;N;;;;; +1FC2;GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI;Ll;0;L;1F74 0345;;;;N;;;;; +1FC3;GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI;Ll;0;L;03B7 0345;;;;N;;;1FCC;;1FCC +1FC4;GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI;Ll;0;L;03AE 0345;;;;N;;;;; +1FC6;GREEK SMALL LETTER ETA WITH PERISPOMENI;Ll;0;L;03B7 0342;;;;N;;;;; +1FC7;GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1FC6 0345;;;;N;;;;; +1FC8;GREEK CAPITAL LETTER EPSILON WITH VARIA;Lu;0;L;0395 0300;;;;N;;;;1F72; +1FC9;GREEK CAPITAL LETTER EPSILON WITH OXIA;Lu;0;L;0388;;;;N;;;;1F73; +1FCA;GREEK CAPITAL LETTER ETA WITH VARIA;Lu;0;L;0397 0300;;;;N;;;;1F74; +1FCB;GREEK CAPITAL LETTER ETA WITH OXIA;Lu;0;L;0389;;;;N;;;;1F75; +1FCC;GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI;Lt;0;L;0397 0345;;;;N;;;;1FC3; +1FCD;GREEK PSILI AND VARIA;Sk;0;ON;1FBF 0300;;;;N;;;;; +1FCE;GREEK PSILI AND OXIA;Sk;0;ON;1FBF 0301;;;;N;;;;; +1FCF;GREEK PSILI AND PERISPOMENI;Sk;0;ON;1FBF 0342;;;;N;;;;; +1FD0;GREEK SMALL LETTER IOTA WITH VRACHY;Ll;0;L;03B9 0306;;;;N;;;1FD8;;1FD8 +1FD1;GREEK SMALL LETTER IOTA WITH MACRON;Ll;0;L;03B9 0304;;;;N;;;1FD9;;1FD9 +1FD2;GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA;Ll;0;L;03CA 0300;;;;N;;;;; +1FD3;GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA;Ll;0;L;0390;;;;N;;;;; +1FD6;GREEK SMALL LETTER IOTA WITH PERISPOMENI;Ll;0;L;03B9 0342;;;;N;;;;; +1FD7;GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI;Ll;0;L;03CA 0342;;;;N;;;;; +1FD8;GREEK CAPITAL LETTER IOTA WITH VRACHY;Lu;0;L;0399 0306;;;;N;;;;1FD0; +1FD9;GREEK CAPITAL LETTER IOTA WITH MACRON;Lu;0;L;0399 0304;;;;N;;;;1FD1; +1FDA;GREEK CAPITAL LETTER IOTA WITH VARIA;Lu;0;L;0399 0300;;;;N;;;;1F76; +1FDB;GREEK CAPITAL LETTER IOTA WITH OXIA;Lu;0;L;038A;;;;N;;;;1F77; +1FDD;GREEK DASIA AND VARIA;Sk;0;ON;1FFE 0300;;;;N;;;;; +1FDE;GREEK DASIA AND OXIA;Sk;0;ON;1FFE 0301;;;;N;;;;; +1FDF;GREEK DASIA AND PERISPOMENI;Sk;0;ON;1FFE 0342;;;;N;;;;; +1FE0;GREEK SMALL LETTER UPSILON WITH VRACHY;Ll;0;L;03C5 0306;;;;N;;;1FE8;;1FE8 +1FE1;GREEK SMALL LETTER UPSILON WITH MACRON;Ll;0;L;03C5 0304;;;;N;;;1FE9;;1FE9 +1FE2;GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA;Ll;0;L;03CB 0300;;;;N;;;;; +1FE3;GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA;Ll;0;L;03B0;;;;N;;;;; +1FE4;GREEK SMALL LETTER RHO WITH PSILI;Ll;0;L;03C1 0313;;;;N;;;;; +1FE5;GREEK SMALL LETTER RHO WITH DASIA;Ll;0;L;03C1 0314;;;;N;;;1FEC;;1FEC +1FE6;GREEK SMALL LETTER UPSILON WITH PERISPOMENI;Ll;0;L;03C5 0342;;;;N;;;;; +1FE7;GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI;Ll;0;L;03CB 0342;;;;N;;;;; +1FE8;GREEK CAPITAL LETTER UPSILON WITH VRACHY;Lu;0;L;03A5 0306;;;;N;;;;1FE0; +1FE9;GREEK CAPITAL LETTER UPSILON WITH MACRON;Lu;0;L;03A5 0304;;;;N;;;;1FE1; +1FEA;GREEK CAPITAL LETTER UPSILON WITH VARIA;Lu;0;L;03A5 0300;;;;N;;;;1F7A; +1FEB;GREEK CAPITAL LETTER UPSILON WITH OXIA;Lu;0;L;038E;;;;N;;;;1F7B; +1FEC;GREEK CAPITAL LETTER RHO WITH DASIA;Lu;0;L;03A1 0314;;;;N;;;;1FE5; +1FED;GREEK DIALYTIKA AND VARIA;Sk;0;ON;00A8 0300;;;;N;;;;; +1FEE;GREEK DIALYTIKA AND OXIA;Sk;0;ON;0385;;;;N;;;;; +1FEF;GREEK VARIA;Sk;0;ON;0060;;;;N;;;;; +1FF2;GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI;Ll;0;L;1F7C 0345;;;;N;;;;; +1FF3;GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI;Ll;0;L;03C9 0345;;;;N;;;1FFC;;1FFC +1FF4;GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI;Ll;0;L;03CE 0345;;;;N;;;;; +1FF6;GREEK SMALL LETTER OMEGA WITH PERISPOMENI;Ll;0;L;03C9 0342;;;;N;;;;; +1FF7;GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1FF6 0345;;;;N;;;;; +1FF8;GREEK CAPITAL LETTER OMICRON WITH VARIA;Lu;0;L;039F 0300;;;;N;;;;1F78; +1FF9;GREEK CAPITAL LETTER OMICRON WITH OXIA;Lu;0;L;038C;;;;N;;;;1F79; +1FFA;GREEK CAPITAL LETTER OMEGA WITH VARIA;Lu;0;L;03A9 0300;;;;N;;;;1F7C; +1FFB;GREEK CAPITAL LETTER OMEGA WITH OXIA;Lu;0;L;038F;;;;N;;;;1F7D; +1FFC;GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI;Lt;0;L;03A9 0345;;;;N;;;;1FF3; +1FFD;GREEK OXIA;Sk;0;ON;00B4;;;;N;;;;; +1FFE;GREEK DASIA;Sk;0;ON;<compat> 0020 0314;;;;N;;;;; +2000;EN QUAD;Zs;0;WS;2002;;;;N;;;;; +2001;EM QUAD;Zs;0;WS;2003;;;;N;;;;; +2002;EN SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;; +2003;EM SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;; +2004;THREE-PER-EM SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;; +2005;FOUR-PER-EM SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;; +2006;SIX-PER-EM SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;; +2007;FIGURE SPACE;Zs;0;WS;<noBreak> 0020;;;;N;;;;; +2008;PUNCTUATION SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;; +2009;THIN SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;; +200A;HAIR SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;; +200B;ZERO WIDTH SPACE;Cf;0;BN;;;;;N;;;;; +200C;ZERO WIDTH NON-JOINER;Cf;0;BN;;;;;N;;;;; +200D;ZERO WIDTH JOINER;Cf;0;BN;;;;;N;;;;; +200E;LEFT-TO-RIGHT MARK;Cf;0;L;;;;;N;;;;; +200F;RIGHT-TO-LEFT MARK;Cf;0;R;;;;;N;;;;; +2010;HYPHEN;Pd;0;ON;;;;;N;;;;; +2011;NON-BREAKING HYPHEN;Pd;0;ON;<noBreak> 2010;;;;N;;;;; +2012;FIGURE DASH;Pd;0;ON;;;;;N;;;;; +2013;EN DASH;Pd;0;ON;;;;;N;;;;; +2014;EM DASH;Pd;0;ON;;;;;N;;;;; +2015;HORIZONTAL BAR;Pd;0;ON;;;;;N;QUOTATION DASH;;;; +2016;DOUBLE VERTICAL LINE;Po;0;ON;;;;;N;DOUBLE VERTICAL BAR;;;; +2017;DOUBLE LOW LINE;Po;0;ON;<compat> 0020 0333;;;;N;SPACING DOUBLE UNDERSCORE;;;; +2018;LEFT SINGLE QUOTATION MARK;Pi;0;ON;;;;;N;SINGLE TURNED COMMA QUOTATION MARK;;;; +2019;RIGHT SINGLE QUOTATION MARK;Pf;0;ON;;;;;N;SINGLE COMMA QUOTATION MARK;;;; +201A;SINGLE LOW-9 QUOTATION MARK;Ps;0;ON;;;;;N;LOW SINGLE COMMA QUOTATION MARK;;;; +201B;SINGLE HIGH-REVERSED-9 QUOTATION MARK;Pi;0;ON;;;;;N;SINGLE REVERSED COMMA QUOTATION MARK;;;; +201C;LEFT DOUBLE QUOTATION MARK;Pi;0;ON;;;;;N;DOUBLE TURNED COMMA QUOTATION MARK;;;; +201D;RIGHT DOUBLE QUOTATION MARK;Pf;0;ON;;;;;N;DOUBLE COMMA QUOTATION MARK;;;; +201E;DOUBLE LOW-9 QUOTATION MARK;Ps;0;ON;;;;;N;LOW DOUBLE COMMA QUOTATION MARK;;;; +201F;DOUBLE HIGH-REVERSED-9 QUOTATION MARK;Pi;0;ON;;;;;N;DOUBLE REVERSED COMMA QUOTATION MARK;;;; +2020;DAGGER;Po;0;ON;;;;;N;;;;; +2021;DOUBLE DAGGER;Po;0;ON;;;;;N;;;;; +2022;BULLET;Po;0;ON;;;;;N;;;;; +2023;TRIANGULAR BULLET;Po;0;ON;;;;;N;;;;; +2024;ONE DOT LEADER;Po;0;ON;<compat> 002E;;;;N;;;;; +2025;TWO DOT LEADER;Po;0;ON;<compat> 002E 002E;;;;N;;;;; +2026;HORIZONTAL ELLIPSIS;Po;0;ON;<compat> 002E 002E 002E;;;;N;;;;; +2027;HYPHENATION POINT;Po;0;ON;;;;;N;;;;; +2028;LINE SEPARATOR;Zl;0;WS;;;;;N;;;;; +2029;PARAGRAPH SEPARATOR;Zp;0;B;;;;;N;;;;; +202A;LEFT-TO-RIGHT EMBEDDING;Cf;0;LRE;;;;;N;;;;; +202B;RIGHT-TO-LEFT EMBEDDING;Cf;0;RLE;;;;;N;;;;; +202C;POP DIRECTIONAL FORMATTING;Cf;0;PDF;;;;;N;;;;; +202D;LEFT-TO-RIGHT OVERRIDE;Cf;0;LRO;;;;;N;;;;; +202E;RIGHT-TO-LEFT OVERRIDE;Cf;0;RLO;;;;;N;;;;; +202F;NARROW NO-BREAK SPACE;Zs;0;CS;<noBreak> 0020;;;;N;;;;; +2030;PER MILLE SIGN;Po;0;ET;;;;;N;;;;; +2031;PER TEN THOUSAND SIGN;Po;0;ET;;;;;N;;;;; +2032;PRIME;Po;0;ET;;;;;N;;;;; +2033;DOUBLE PRIME;Po;0;ET;<compat> 2032 2032;;;;N;;;;; +2034;TRIPLE PRIME;Po;0;ET;<compat> 2032 2032 2032;;;;N;;;;; +2035;REVERSED PRIME;Po;0;ON;;;;;N;;;;; +2036;REVERSED DOUBLE PRIME;Po;0;ON;<compat> 2035 2035;;;;N;;;;; +2037;REVERSED TRIPLE PRIME;Po;0;ON;<compat> 2035 2035 2035;;;;N;;;;; +2038;CARET;Po;0;ON;;;;;N;;;;; +2039;SINGLE LEFT-POINTING ANGLE QUOTATION MARK;Pi;0;ON;;;;;Y;LEFT POINTING SINGLE GUILLEMET;;;; +203A;SINGLE RIGHT-POINTING ANGLE QUOTATION MARK;Pf;0;ON;;;;;Y;RIGHT POINTING SINGLE GUILLEMET;;;; +203B;REFERENCE MARK;Po;0;ON;;;;;N;;;;; +203C;DOUBLE EXCLAMATION MARK;Po;0;ON;<compat> 0021 0021;;;;N;;;;; +203D;INTERROBANG;Po;0;ON;;;;;N;;;;; +203E;OVERLINE;Po;0;ON;<compat> 0020 0305;;;;N;SPACING OVERSCORE;;;; +203F;UNDERTIE;Pc;0;ON;;;;;N;;;;; +2040;CHARACTER TIE;Pc;0;ON;;;;;N;;;;; +2041;CARET INSERTION POINT;Po;0;ON;;;;;N;;;;; +2042;ASTERISM;Po;0;ON;;;;;N;;;;; +2043;HYPHEN BULLET;Po;0;ON;;;;;N;;;;; +2044;FRACTION SLASH;Sm;0;CS;;;;;N;;;;; +2045;LEFT SQUARE BRACKET WITH QUILL;Ps;0;ON;;;;;Y;;;;; +2046;RIGHT SQUARE BRACKET WITH QUILL;Pe;0;ON;;;;;Y;;;;; +2047;DOUBLE QUESTION MARK;Po;0;ON;<compat> 003F 003F;;;;N;;;;; +2048;QUESTION EXCLAMATION MARK;Po;0;ON;<compat> 003F 0021;;;;N;;;;; +2049;EXCLAMATION QUESTION MARK;Po;0;ON;<compat> 0021 003F;;;;N;;;;; +204A;TIRONIAN SIGN ET;Po;0;ON;;;;;N;;;;; +204B;REVERSED PILCROW SIGN;Po;0;ON;;;;;N;;;;; +204C;BLACK LEFTWARDS BULLET;Po;0;ON;;;;;N;;;;; +204D;BLACK RIGHTWARDS BULLET;Po;0;ON;;;;;N;;;;; +204E;LOW ASTERISK;Po;0;ON;;;;;N;;;;; +204F;REVERSED SEMICOLON;Po;0;ON;;;;;N;;;;; +2050;CLOSE UP;Po;0;ON;;;;;N;;;;; +2051;TWO ASTERISKS ALIGNED VERTICALLY;Po;0;ON;;;;;N;;;;; +2052;COMMERCIAL MINUS SIGN;Sm;0;ON;;;;;N;;;;; +2053;SWUNG DASH;Po;0;ON;;;;;N;;;;; +2054;INVERTED UNDERTIE;Pc;0;ON;;;;;N;;;;; +2055;FLOWER PUNCTUATION MARK;Po;0;ON;;;;;N;;;;; +2056;THREE DOT PUNCTUATION;Po;0;ON;;;;;N;;;;; +2057;QUADRUPLE PRIME;Po;0;ON;<compat> 2032 2032 2032 2032;;;;N;;;;; +2058;FOUR DOT PUNCTUATION;Po;0;ON;;;;;N;;;;; +2059;FIVE DOT PUNCTUATION;Po;0;ON;;;;;N;;;;; +205A;TWO DOT PUNCTUATION;Po;0;ON;;;;;N;;;;; +205B;FOUR DOT MARK;Po;0;ON;;;;;N;;;;; +205C;DOTTED CROSS;Po;0;ON;;;;;N;;;;; +205D;TRICOLON;Po;0;ON;;;;;N;;;;; +205E;VERTICAL FOUR DOTS;Po;0;ON;;;;;N;;;;; +205F;MEDIUM MATHEMATICAL SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;; +2060;WORD JOINER;Cf;0;BN;;;;;N;;;;; +2061;FUNCTION APPLICATION;Cf;0;BN;;;;;N;;;;; +2062;INVISIBLE TIMES;Cf;0;BN;;;;;N;;;;; +2063;INVISIBLE SEPARATOR;Cf;0;BN;;;;;N;;;;; +2064;INVISIBLE PLUS;Cf;0;BN;;;;;N;;;;; +2066;LEFT-TO-RIGHT ISOLATE;Cf;0;LRI;;;;;N;;;;; +2067;RIGHT-TO-LEFT ISOLATE;Cf;0;RLI;;;;;N;;;;; +2068;FIRST STRONG ISOLATE;Cf;0;FSI;;;;;N;;;;; +2069;POP DIRECTIONAL ISOLATE;Cf;0;PDI;;;;;N;;;;; +206A;INHIBIT SYMMETRIC SWAPPING;Cf;0;BN;;;;;N;;;;; +206B;ACTIVATE SYMMETRIC SWAPPING;Cf;0;BN;;;;;N;;;;; +206C;INHIBIT ARABIC FORM SHAPING;Cf;0;BN;;;;;N;;;;; +206D;ACTIVATE ARABIC FORM SHAPING;Cf;0;BN;;;;;N;;;;; +206E;NATIONAL DIGIT SHAPES;Cf;0;BN;;;;;N;;;;; +206F;NOMINAL DIGIT SHAPES;Cf;0;BN;;;;;N;;;;; +2070;SUPERSCRIPT ZERO;No;0;EN;<super> 0030;;0;0;N;SUPERSCRIPT DIGIT ZERO;;;; +2071;SUPERSCRIPT LATIN SMALL LETTER I;Lm;0;L;<super> 0069;;;;N;;;;; +2074;SUPERSCRIPT FOUR;No;0;EN;<super> 0034;;4;4;N;SUPERSCRIPT DIGIT FOUR;;;; +2075;SUPERSCRIPT FIVE;No;0;EN;<super> 0035;;5;5;N;SUPERSCRIPT DIGIT FIVE;;;; +2076;SUPERSCRIPT SIX;No;0;EN;<super> 0036;;6;6;N;SUPERSCRIPT DIGIT SIX;;;; +2077;SUPERSCRIPT SEVEN;No;0;EN;<super> 0037;;7;7;N;SUPERSCRIPT DIGIT SEVEN;;;; +2078;SUPERSCRIPT EIGHT;No;0;EN;<super> 0038;;8;8;N;SUPERSCRIPT DIGIT EIGHT;;;; +2079;SUPERSCRIPT NINE;No;0;EN;<super> 0039;;9;9;N;SUPERSCRIPT DIGIT NINE;;;; +207A;SUPERSCRIPT PLUS SIGN;Sm;0;ES;<super> 002B;;;;N;;;;; +207B;SUPERSCRIPT MINUS;Sm;0;ES;<super> 2212;;;;N;SUPERSCRIPT HYPHEN-MINUS;;;; +207C;SUPERSCRIPT EQUALS SIGN;Sm;0;ON;<super> 003D;;;;N;;;;; +207D;SUPERSCRIPT LEFT PARENTHESIS;Ps;0;ON;<super> 0028;;;;Y;SUPERSCRIPT OPENING PARENTHESIS;;;; +207E;SUPERSCRIPT RIGHT PARENTHESIS;Pe;0;ON;<super> 0029;;;;Y;SUPERSCRIPT CLOSING PARENTHESIS;;;; +207F;SUPERSCRIPT LATIN SMALL LETTER N;Lm;0;L;<super> 006E;;;;N;;;;; +2080;SUBSCRIPT ZERO;No;0;EN;<sub> 0030;;0;0;N;SUBSCRIPT DIGIT ZERO;;;; +2081;SUBSCRIPT ONE;No;0;EN;<sub> 0031;;1;1;N;SUBSCRIPT DIGIT ONE;;;; +2082;SUBSCRIPT TWO;No;0;EN;<sub> 0032;;2;2;N;SUBSCRIPT DIGIT TWO;;;; +2083;SUBSCRIPT THREE;No;0;EN;<sub> 0033;;3;3;N;SUBSCRIPT DIGIT THREE;;;; +2084;SUBSCRIPT FOUR;No;0;EN;<sub> 0034;;4;4;N;SUBSCRIPT DIGIT FOUR;;;; +2085;SUBSCRIPT FIVE;No;0;EN;<sub> 0035;;5;5;N;SUBSCRIPT DIGIT FIVE;;;; +2086;SUBSCRIPT SIX;No;0;EN;<sub> 0036;;6;6;N;SUBSCRIPT DIGIT SIX;;;; +2087;SUBSCRIPT SEVEN;No;0;EN;<sub> 0037;;7;7;N;SUBSCRIPT DIGIT SEVEN;;;; +2088;SUBSCRIPT EIGHT;No;0;EN;<sub> 0038;;8;8;N;SUBSCRIPT DIGIT EIGHT;;;; +2089;SUBSCRIPT NINE;No;0;EN;<sub> 0039;;9;9;N;SUBSCRIPT DIGIT NINE;;;; +208A;SUBSCRIPT PLUS SIGN;Sm;0;ES;<sub> 002B;;;;N;;;;; +208B;SUBSCRIPT MINUS;Sm;0;ES;<sub> 2212;;;;N;SUBSCRIPT HYPHEN-MINUS;;;; +208C;SUBSCRIPT EQUALS SIGN;Sm;0;ON;<sub> 003D;;;;N;;;;; +208D;SUBSCRIPT LEFT PARENTHESIS;Ps;0;ON;<sub> 0028;;;;Y;SUBSCRIPT OPENING PARENTHESIS;;;; +208E;SUBSCRIPT RIGHT PARENTHESIS;Pe;0;ON;<sub> 0029;;;;Y;SUBSCRIPT CLOSING PARENTHESIS;;;; +2090;LATIN SUBSCRIPT SMALL LETTER A;Lm;0;L;<sub> 0061;;;;N;;;;; +2091;LATIN SUBSCRIPT SMALL LETTER E;Lm;0;L;<sub> 0065;;;;N;;;;; +2092;LATIN SUBSCRIPT SMALL LETTER O;Lm;0;L;<sub> 006F;;;;N;;;;; +2093;LATIN SUBSCRIPT SMALL LETTER X;Lm;0;L;<sub> 0078;;;;N;;;;; +2094;LATIN SUBSCRIPT SMALL LETTER SCHWA;Lm;0;L;<sub> 0259;;;;N;;;;; +2095;LATIN SUBSCRIPT SMALL LETTER H;Lm;0;L;<sub> 0068;;;;N;;;;; +2096;LATIN SUBSCRIPT SMALL LETTER K;Lm;0;L;<sub> 006B;;;;N;;;;; +2097;LATIN SUBSCRIPT SMALL LETTER L;Lm;0;L;<sub> 006C;;;;N;;;;; +2098;LATIN SUBSCRIPT SMALL LETTER M;Lm;0;L;<sub> 006D;;;;N;;;;; +2099;LATIN SUBSCRIPT SMALL LETTER N;Lm;0;L;<sub> 006E;;;;N;;;;; +209A;LATIN SUBSCRIPT SMALL LETTER P;Lm;0;L;<sub> 0070;;;;N;;;;; +209B;LATIN SUBSCRIPT SMALL LETTER S;Lm;0;L;<sub> 0073;;;;N;;;;; +209C;LATIN SUBSCRIPT SMALL LETTER T;Lm;0;L;<sub> 0074;;;;N;;;;; +20A0;EURO-CURRENCY SIGN;Sc;0;ET;;;;;N;;;;; +20A1;COLON SIGN;Sc;0;ET;;;;;N;;;;; +20A2;CRUZEIRO SIGN;Sc;0;ET;;;;;N;;;;; +20A3;FRENCH FRANC SIGN;Sc;0;ET;;;;;N;;;;; +20A4;LIRA SIGN;Sc;0;ET;;;;;N;;;;; +20A5;MILL SIGN;Sc;0;ET;;;;;N;;;;; +20A6;NAIRA SIGN;Sc;0;ET;;;;;N;;;;; +20A7;PESETA SIGN;Sc;0;ET;;;;;N;;;;; +20A8;RUPEE SIGN;Sc;0;ET;<compat> 0052 0073;;;;N;;;;; +20A9;WON SIGN;Sc;0;ET;;;;;N;;;;; +20AA;NEW SHEQEL SIGN;Sc;0;ET;;;;;N;;;;; +20AB;DONG SIGN;Sc;0;ET;;;;;N;;;;; +20AC;EURO SIGN;Sc;0;ET;;;;;N;;;;; +20AD;KIP SIGN;Sc;0;ET;;;;;N;;;;; +20AE;TUGRIK SIGN;Sc;0;ET;;;;;N;;;;; +20AF;DRACHMA SIGN;Sc;0;ET;;;;;N;;;;; +20B0;GERMAN PENNY SIGN;Sc;0;ET;;;;;N;;;;; +20B1;PESO SIGN;Sc;0;ET;;;;;N;;;;; +20B2;GUARANI SIGN;Sc;0;ET;;;;;N;;;;; +20B3;AUSTRAL SIGN;Sc;0;ET;;;;;N;;;;; +20B4;HRYVNIA SIGN;Sc;0;ET;;;;;N;;;;; +20B5;CEDI SIGN;Sc;0;ET;;;;;N;;;;; +20B6;LIVRE TOURNOIS SIGN;Sc;0;ET;;;;;N;;;;; +20B7;SPESMILO SIGN;Sc;0;ET;;;;;N;;;;; +20B8;TENGE SIGN;Sc;0;ET;;;;;N;;;;; +20B9;INDIAN RUPEE SIGN;Sc;0;ET;;;;;N;;;;; +20BA;TURKISH LIRA SIGN;Sc;0;ET;;;;;N;;;;; +20BB;NORDIC MARK SIGN;Sc;0;ET;;;;;N;;;;; +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;;;; +20D3;COMBINING SHORT VERTICAL LINE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING SHORT VERTICAL BAR OVERLAY;;;; +20D4;COMBINING ANTICLOCKWISE ARROW ABOVE;Mn;230;NSM;;;;;N;NON-SPACING ANTICLOCKWISE ARROW ABOVE;;;; +20D5;COMBINING CLOCKWISE ARROW ABOVE;Mn;230;NSM;;;;;N;NON-SPACING CLOCKWISE ARROW ABOVE;;;; +20D6;COMBINING LEFT ARROW ABOVE;Mn;230;NSM;;;;;N;NON-SPACING LEFT ARROW ABOVE;;;; +20D7;COMBINING RIGHT ARROW ABOVE;Mn;230;NSM;;;;;N;NON-SPACING RIGHT ARROW ABOVE;;;; +20D8;COMBINING RING OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING RING OVERLAY;;;; +20D9;COMBINING CLOCKWISE RING OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING CLOCKWISE RING OVERLAY;;;; +20DA;COMBINING ANTICLOCKWISE RING OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING ANTICLOCKWISE RING OVERLAY;;;; +20DB;COMBINING THREE DOTS ABOVE;Mn;230;NSM;;;;;N;NON-SPACING THREE DOTS ABOVE;;;; +20DC;COMBINING FOUR DOTS ABOVE;Mn;230;NSM;;;;;N;NON-SPACING FOUR DOTS ABOVE;;;; +20DD;COMBINING ENCLOSING CIRCLE;Me;0;NSM;;;;;N;ENCLOSING CIRCLE;;;; +20DE;COMBINING ENCLOSING SQUARE;Me;0;NSM;;;;;N;ENCLOSING SQUARE;;;; +20DF;COMBINING ENCLOSING DIAMOND;Me;0;NSM;;;;;N;ENCLOSING DIAMOND;;;; +20E0;COMBINING ENCLOSING CIRCLE BACKSLASH;Me;0;NSM;;;;;N;ENCLOSING CIRCLE SLASH;;;; +20E1;COMBINING LEFT RIGHT ARROW ABOVE;Mn;230;NSM;;;;;N;NON-SPACING LEFT RIGHT ARROW ABOVE;;;; +20E2;COMBINING ENCLOSING SCREEN;Me;0;NSM;;;;;N;;;;; +20E3;COMBINING ENCLOSING KEYCAP;Me;0;NSM;;;;;N;;;;; +20E4;COMBINING ENCLOSING UPWARD POINTING TRIANGLE;Me;0;NSM;;;;;N;;;;; +20E5;COMBINING REVERSE SOLIDUS OVERLAY;Mn;1;NSM;;;;;N;;;;; +20E6;COMBINING DOUBLE VERTICAL STROKE OVERLAY;Mn;1;NSM;;;;;N;;;;; +20E7;COMBINING ANNUITY SYMBOL;Mn;230;NSM;;;;;N;;;;; +20E8;COMBINING TRIPLE UNDERDOT;Mn;220;NSM;;;;;N;;;;; +20E9;COMBINING WIDE BRIDGE ABOVE;Mn;230;NSM;;;;;N;;;;; +20EA;COMBINING LEFTWARDS ARROW OVERLAY;Mn;1;NSM;;;;;N;;;;; +20EB;COMBINING LONG DOUBLE SOLIDUS OVERLAY;Mn;1;NSM;;;;;N;;;;; +20EC;COMBINING RIGHTWARDS HARPOON WITH BARB DOWNWARDS;Mn;220;NSM;;;;;N;;;;; +20ED;COMBINING LEFTWARDS HARPOON WITH BARB DOWNWARDS;Mn;220;NSM;;;;;N;;;;; +20EE;COMBINING LEFT ARROW BELOW;Mn;220;NSM;;;;;N;;;;; +20EF;COMBINING RIGHT ARROW BELOW;Mn;220;NSM;;;;;N;;;;; +20F0;COMBINING ASTERISK ABOVE;Mn;230;NSM;;;;;N;;;;; +2100;ACCOUNT OF;So;0;ON;<compat> 0061 002F 0063;;;;N;;;;; +2101;ADDRESSED TO THE SUBJECT;So;0;ON;<compat> 0061 002F 0073;;;;N;;;;; +2102;DOUBLE-STRUCK CAPITAL C;Lu;0;L;<font> 0043;;;;N;DOUBLE-STRUCK C;;;; +2103;DEGREE CELSIUS;So;0;ON;<compat> 00B0 0043;;;;N;DEGREES CENTIGRADE;;;; +2104;CENTRE LINE SYMBOL;So;0;ON;;;;;N;C L SYMBOL;;;; +2105;CARE OF;So;0;ON;<compat> 0063 002F 006F;;;;N;;;;; +2106;CADA UNA;So;0;ON;<compat> 0063 002F 0075;;;;N;;;;; +2107;EULER CONSTANT;Lu;0;L;<compat> 0190;;;;N;EULERS;;;; +2108;SCRUPLE;So;0;ON;;;;;N;;;;; +2109;DEGREE FAHRENHEIT;So;0;ON;<compat> 00B0 0046;;;;N;DEGREES FAHRENHEIT;;;; +210A;SCRIPT SMALL G;Ll;0;L;<font> 0067;;;;N;;;;; +210B;SCRIPT CAPITAL H;Lu;0;L;<font> 0048;;;;N;SCRIPT H;;;; +210C;BLACK-LETTER CAPITAL H;Lu;0;L;<font> 0048;;;;N;BLACK-LETTER H;;;; +210D;DOUBLE-STRUCK CAPITAL H;Lu;0;L;<font> 0048;;;;N;DOUBLE-STRUCK H;;;; +210E;PLANCK CONSTANT;Ll;0;L;<font> 0068;;;;N;;;;; +210F;PLANCK CONSTANT OVER TWO PI;Ll;0;L;<font> 0127;;;;N;PLANCK CONSTANT OVER 2 PI;;;; +2110;SCRIPT CAPITAL I;Lu;0;L;<font> 0049;;;;N;SCRIPT I;;;; +2111;BLACK-LETTER CAPITAL I;Lu;0;L;<font> 0049;;;;N;BLACK-LETTER I;;;; +2112;SCRIPT CAPITAL L;Lu;0;L;<font> 004C;;;;N;SCRIPT L;;;; +2113;SCRIPT SMALL L;Ll;0;L;<font> 006C;;;;N;;;;; +2114;L B BAR SYMBOL;So;0;ON;;;;;N;;;;; +2115;DOUBLE-STRUCK CAPITAL N;Lu;0;L;<font> 004E;;;;N;DOUBLE-STRUCK N;;;; +2116;NUMERO SIGN;So;0;ON;<compat> 004E 006F;;;;N;NUMERO;;;; +2117;SOUND RECORDING COPYRIGHT;So;0;ON;;;;;N;;;;; +2118;SCRIPT CAPITAL P;Sm;0;ON;;;;;N;SCRIPT P;;;; +2119;DOUBLE-STRUCK CAPITAL P;Lu;0;L;<font> 0050;;;;N;DOUBLE-STRUCK P;;;; +211A;DOUBLE-STRUCK CAPITAL Q;Lu;0;L;<font> 0051;;;;N;DOUBLE-STRUCK Q;;;; +211B;SCRIPT CAPITAL R;Lu;0;L;<font> 0052;;;;N;SCRIPT R;;;; +211C;BLACK-LETTER CAPITAL R;Lu;0;L;<font> 0052;;;;N;BLACK-LETTER R;;;; +211D;DOUBLE-STRUCK CAPITAL R;Lu;0;L;<font> 0052;;;;N;DOUBLE-STRUCK R;;;; +211E;PRESCRIPTION TAKE;So;0;ON;;;;;N;;;;; +211F;RESPONSE;So;0;ON;;;;;N;;;;; +2120;SERVICE MARK;So;0;ON;<super> 0053 004D;;;;N;;;;; +2121;TELEPHONE SIGN;So;0;ON;<compat> 0054 0045 004C;;;;N;T E L SYMBOL;;;; +2122;TRADE MARK SIGN;So;0;ON;<super> 0054 004D;;;;N;TRADEMARK;;;; +2123;VERSICLE;So;0;ON;;;;;N;;;;; +2124;DOUBLE-STRUCK CAPITAL Z;Lu;0;L;<font> 005A;;;;N;DOUBLE-STRUCK Z;;;; +2125;OUNCE SIGN;So;0;ON;;;;;N;OUNCE;;;; +2126;OHM SIGN;Lu;0;L;03A9;;;;N;OHM;;;03C9; +2127;INVERTED OHM SIGN;So;0;ON;;;;;N;MHO;;;; +2128;BLACK-LETTER CAPITAL Z;Lu;0;L;<font> 005A;;;;N;BLACK-LETTER Z;;;; +2129;TURNED GREEK SMALL LETTER IOTA;So;0;ON;;;;;N;;;;; +212A;KELVIN SIGN;Lu;0;L;004B;;;;N;DEGREES KELVIN;;;006B; +212B;ANGSTROM SIGN;Lu;0;L;00C5;;;;N;ANGSTROM UNIT;;;00E5; +212C;SCRIPT CAPITAL B;Lu;0;L;<font> 0042;;;;N;SCRIPT B;;;; +212D;BLACK-LETTER CAPITAL C;Lu;0;L;<font> 0043;;;;N;BLACK-LETTER C;;;; +212E;ESTIMATED SYMBOL;So;0;ET;;;;;N;;;;; +212F;SCRIPT SMALL E;Ll;0;L;<font> 0065;;;;N;;;;; +2130;SCRIPT CAPITAL E;Lu;0;L;<font> 0045;;;;N;SCRIPT E;;;; +2131;SCRIPT CAPITAL F;Lu;0;L;<font> 0046;;;;N;SCRIPT F;;;; +2132;TURNED CAPITAL F;Lu;0;L;;;;;N;TURNED F;;;214E; +2133;SCRIPT CAPITAL M;Lu;0;L;<font> 004D;;;;N;SCRIPT M;;;; +2134;SCRIPT SMALL O;Ll;0;L;<font> 006F;;;;N;;;;; +2135;ALEF SYMBOL;Lo;0;L;<compat> 05D0;;;;N;FIRST TRANSFINITE CARDINAL;;;; +2136;BET SYMBOL;Lo;0;L;<compat> 05D1;;;;N;SECOND TRANSFINITE CARDINAL;;;; +2137;GIMEL SYMBOL;Lo;0;L;<compat> 05D2;;;;N;THIRD TRANSFINITE CARDINAL;;;; +2138;DALET SYMBOL;Lo;0;L;<compat> 05D3;;;;N;FOURTH TRANSFINITE CARDINAL;;;; +2139;INFORMATION SOURCE;Ll;0;L;<font> 0069;;;;N;;;;; +213A;ROTATED CAPITAL Q;So;0;ON;;;;;N;;;;; +213B;FACSIMILE SIGN;So;0;ON;<compat> 0046 0041 0058;;;;N;;;;; +213C;DOUBLE-STRUCK SMALL PI;Ll;0;L;<font> 03C0;;;;N;;;;; +213D;DOUBLE-STRUCK SMALL GAMMA;Ll;0;L;<font> 03B3;;;;N;;;;; +213E;DOUBLE-STRUCK CAPITAL GAMMA;Lu;0;L;<font> 0393;;;;N;;;;; +213F;DOUBLE-STRUCK CAPITAL PI;Lu;0;L;<font> 03A0;;;;N;;;;; +2140;DOUBLE-STRUCK N-ARY SUMMATION;Sm;0;ON;<font> 2211;;;;Y;;;;; +2141;TURNED SANS-SERIF CAPITAL G;Sm;0;ON;;;;;N;;;;; +2142;TURNED SANS-SERIF CAPITAL L;Sm;0;ON;;;;;N;;;;; +2143;REVERSED SANS-SERIF CAPITAL L;Sm;0;ON;;;;;N;;;;; +2144;TURNED SANS-SERIF CAPITAL Y;Sm;0;ON;;;;;N;;;;; +2145;DOUBLE-STRUCK ITALIC CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;; +2146;DOUBLE-STRUCK ITALIC SMALL D;Ll;0;L;<font> 0064;;;;N;;;;; +2147;DOUBLE-STRUCK ITALIC SMALL E;Ll;0;L;<font> 0065;;;;N;;;;; +2148;DOUBLE-STRUCK ITALIC SMALL I;Ll;0;L;<font> 0069;;;;N;;;;; +2149;DOUBLE-STRUCK ITALIC SMALL J;Ll;0;L;<font> 006A;;;;N;;;;; +214A;PROPERTY LINE;So;0;ON;;;;;N;;;;; +214B;TURNED AMPERSAND;Sm;0;ON;;;;;N;;;;; +214C;PER SIGN;So;0;ON;;;;;N;;;;; +214D;AKTIESELSKAB;So;0;ON;;;;;N;;;;; +214E;TURNED SMALL F;Ll;0;L;;;;;N;;;2132;;2132 +214F;SYMBOL FOR SAMARITAN SOURCE;So;0;L;;;;;N;;;;; +2150;VULGAR FRACTION ONE SEVENTH;No;0;ON;<fraction> 0031 2044 0037;;;1/7;N;;;;; +2151;VULGAR FRACTION ONE NINTH;No;0;ON;<fraction> 0031 2044 0039;;;1/9;N;;;;; +2152;VULGAR FRACTION ONE TENTH;No;0;ON;<fraction> 0031 2044 0031 0030;;;1/10;N;;;;; +2153;VULGAR FRACTION ONE THIRD;No;0;ON;<fraction> 0031 2044 0033;;;1/3;N;FRACTION ONE THIRD;;;; +2154;VULGAR FRACTION TWO THIRDS;No;0;ON;<fraction> 0032 2044 0033;;;2/3;N;FRACTION TWO THIRDS;;;; +2155;VULGAR FRACTION ONE FIFTH;No;0;ON;<fraction> 0031 2044 0035;;;1/5;N;FRACTION ONE FIFTH;;;; +2156;VULGAR FRACTION TWO FIFTHS;No;0;ON;<fraction> 0032 2044 0035;;;2/5;N;FRACTION TWO FIFTHS;;;; +2157;VULGAR FRACTION THREE FIFTHS;No;0;ON;<fraction> 0033 2044 0035;;;3/5;N;FRACTION THREE FIFTHS;;;; +2158;VULGAR FRACTION FOUR FIFTHS;No;0;ON;<fraction> 0034 2044 0035;;;4/5;N;FRACTION FOUR FIFTHS;;;; +2159;VULGAR FRACTION ONE SIXTH;No;0;ON;<fraction> 0031 2044 0036;;;1/6;N;FRACTION ONE SIXTH;;;; +215A;VULGAR FRACTION FIVE SIXTHS;No;0;ON;<fraction> 0035 2044 0036;;;5/6;N;FRACTION FIVE SIXTHS;;;; +215B;VULGAR FRACTION ONE EIGHTH;No;0;ON;<fraction> 0031 2044 0038;;;1/8;N;FRACTION ONE EIGHTH;;;; +215C;VULGAR FRACTION THREE EIGHTHS;No;0;ON;<fraction> 0033 2044 0038;;;3/8;N;FRACTION THREE EIGHTHS;;;; +215D;VULGAR FRACTION FIVE EIGHTHS;No;0;ON;<fraction> 0035 2044 0038;;;5/8;N;FRACTION FIVE EIGHTHS;;;; +215E;VULGAR FRACTION SEVEN EIGHTHS;No;0;ON;<fraction> 0037 2044 0038;;;7/8;N;FRACTION SEVEN EIGHTHS;;;; +215F;FRACTION NUMERATOR ONE;No;0;ON;<fraction> 0031 2044;;;1;N;;;;; +2160;ROMAN NUMERAL ONE;Nl;0;L;<compat> 0049;;;1;N;;;;2170; +2161;ROMAN NUMERAL TWO;Nl;0;L;<compat> 0049 0049;;;2;N;;;;2171; +2162;ROMAN NUMERAL THREE;Nl;0;L;<compat> 0049 0049 0049;;;3;N;;;;2172; +2163;ROMAN NUMERAL FOUR;Nl;0;L;<compat> 0049 0056;;;4;N;;;;2173; +2164;ROMAN NUMERAL FIVE;Nl;0;L;<compat> 0056;;;5;N;;;;2174; +2165;ROMAN NUMERAL SIX;Nl;0;L;<compat> 0056 0049;;;6;N;;;;2175; +2166;ROMAN NUMERAL SEVEN;Nl;0;L;<compat> 0056 0049 0049;;;7;N;;;;2176; +2167;ROMAN NUMERAL EIGHT;Nl;0;L;<compat> 0056 0049 0049 0049;;;8;N;;;;2177; +2168;ROMAN NUMERAL NINE;Nl;0;L;<compat> 0049 0058;;;9;N;;;;2178; +2169;ROMAN NUMERAL TEN;Nl;0;L;<compat> 0058;;;10;N;;;;2179; +216A;ROMAN NUMERAL ELEVEN;Nl;0;L;<compat> 0058 0049;;;11;N;;;;217A; +216B;ROMAN NUMERAL TWELVE;Nl;0;L;<compat> 0058 0049 0049;;;12;N;;;;217B; +216C;ROMAN NUMERAL FIFTY;Nl;0;L;<compat> 004C;;;50;N;;;;217C; +216D;ROMAN NUMERAL ONE HUNDRED;Nl;0;L;<compat> 0043;;;100;N;;;;217D; +216E;ROMAN NUMERAL FIVE HUNDRED;Nl;0;L;<compat> 0044;;;500;N;;;;217E; +216F;ROMAN NUMERAL ONE THOUSAND;Nl;0;L;<compat> 004D;;;1000;N;;;;217F; +2170;SMALL ROMAN NUMERAL ONE;Nl;0;L;<compat> 0069;;;1;N;;;2160;;2160 +2171;SMALL ROMAN NUMERAL TWO;Nl;0;L;<compat> 0069 0069;;;2;N;;;2161;;2161 +2172;SMALL ROMAN NUMERAL THREE;Nl;0;L;<compat> 0069 0069 0069;;;3;N;;;2162;;2162 +2173;SMALL ROMAN NUMERAL FOUR;Nl;0;L;<compat> 0069 0076;;;4;N;;;2163;;2163 +2174;SMALL ROMAN NUMERAL FIVE;Nl;0;L;<compat> 0076;;;5;N;;;2164;;2164 +2175;SMALL ROMAN NUMERAL SIX;Nl;0;L;<compat> 0076 0069;;;6;N;;;2165;;2165 +2176;SMALL ROMAN NUMERAL SEVEN;Nl;0;L;<compat> 0076 0069 0069;;;7;N;;;2166;;2166 +2177;SMALL ROMAN NUMERAL EIGHT;Nl;0;L;<compat> 0076 0069 0069 0069;;;8;N;;;2167;;2167 +2178;SMALL ROMAN NUMERAL NINE;Nl;0;L;<compat> 0069 0078;;;9;N;;;2168;;2168 +2179;SMALL ROMAN NUMERAL TEN;Nl;0;L;<compat> 0078;;;10;N;;;2169;;2169 +217A;SMALL ROMAN NUMERAL ELEVEN;Nl;0;L;<compat> 0078 0069;;;11;N;;;216A;;216A +217B;SMALL ROMAN NUMERAL TWELVE;Nl;0;L;<compat> 0078 0069 0069;;;12;N;;;216B;;216B +217C;SMALL ROMAN NUMERAL FIFTY;Nl;0;L;<compat> 006C;;;50;N;;;216C;;216C +217D;SMALL ROMAN NUMERAL ONE HUNDRED;Nl;0;L;<compat> 0063;;;100;N;;;216D;;216D +217E;SMALL ROMAN NUMERAL FIVE HUNDRED;Nl;0;L;<compat> 0064;;;500;N;;;216E;;216E +217F;SMALL ROMAN NUMERAL ONE THOUSAND;Nl;0;L;<compat> 006D;;;1000;N;;;216F;;216F +2180;ROMAN NUMERAL ONE THOUSAND C D;Nl;0;L;;;;1000;N;;;;; +2181;ROMAN NUMERAL FIVE THOUSAND;Nl;0;L;;;;5000;N;;;;; +2182;ROMAN NUMERAL TEN THOUSAND;Nl;0;L;;;;10000;N;;;;; +2183;ROMAN NUMERAL REVERSED ONE HUNDRED;Lu;0;L;;;;;N;;;;2184; +2184;LATIN SMALL LETTER REVERSED C;Ll;0;L;;;;;N;;;2183;;2183 +2185;ROMAN NUMERAL SIX LATE FORM;Nl;0;L;;;;6;N;;;;; +2186;ROMAN NUMERAL FIFTY EARLY FORM;Nl;0;L;;;;50;N;;;;; +2187;ROMAN NUMERAL FIFTY THOUSAND;Nl;0;L;;;;50000;N;;;;; +2188;ROMAN NUMERAL ONE HUNDRED THOUSAND;Nl;0;L;;;;100000;N;;;;; +2189;VULGAR FRACTION ZERO THIRDS;No;0;ON;<fraction> 0030 2044 0033;;;0;N;;;;; +218A;TURNED DIGIT TWO;So;0;ON;;;;;N;;;;; +218B;TURNED DIGIT THREE;So;0;ON;;;;;N;;;;; +2190;LEFTWARDS ARROW;Sm;0;ON;;;;;N;LEFT ARROW;;;; +2191;UPWARDS ARROW;Sm;0;ON;;;;;N;UP ARROW;;;; +2192;RIGHTWARDS ARROW;Sm;0;ON;;;;;N;RIGHT ARROW;;;; +2193;DOWNWARDS ARROW;Sm;0;ON;;;;;N;DOWN ARROW;;;; +2194;LEFT RIGHT ARROW;Sm;0;ON;;;;;N;;;;; +2195;UP DOWN ARROW;So;0;ON;;;;;N;;;;; +2196;NORTH WEST ARROW;So;0;ON;;;;;N;UPPER LEFT ARROW;;;; +2197;NORTH EAST ARROW;So;0;ON;;;;;N;UPPER RIGHT ARROW;;;; +2198;SOUTH EAST ARROW;So;0;ON;;;;;N;LOWER RIGHT ARROW;;;; +2199;SOUTH WEST ARROW;So;0;ON;;;;;N;LOWER LEFT ARROW;;;; +219A;LEFTWARDS ARROW WITH STROKE;Sm;0;ON;2190 0338;;;;N;LEFT ARROW WITH STROKE;;;; +219B;RIGHTWARDS ARROW WITH STROKE;Sm;0;ON;2192 0338;;;;N;RIGHT ARROW WITH STROKE;;;; +219C;LEFTWARDS WAVE ARROW;So;0;ON;;;;;N;LEFT WAVE ARROW;;;; +219D;RIGHTWARDS WAVE ARROW;So;0;ON;;;;;N;RIGHT WAVE ARROW;;;; +219E;LEFTWARDS TWO HEADED ARROW;So;0;ON;;;;;N;LEFT TWO HEADED ARROW;;;; +219F;UPWARDS TWO HEADED ARROW;So;0;ON;;;;;N;UP TWO HEADED ARROW;;;; +21A0;RIGHTWARDS TWO HEADED ARROW;Sm;0;ON;;;;;N;RIGHT TWO HEADED ARROW;;;; +21A1;DOWNWARDS TWO HEADED ARROW;So;0;ON;;;;;N;DOWN TWO HEADED ARROW;;;; +21A2;LEFTWARDS ARROW WITH TAIL;So;0;ON;;;;;N;LEFT ARROW WITH TAIL;;;; +21A3;RIGHTWARDS ARROW WITH TAIL;Sm;0;ON;;;;;N;RIGHT ARROW WITH TAIL;;;; +21A4;LEFTWARDS ARROW FROM BAR;So;0;ON;;;;;N;LEFT ARROW FROM BAR;;;; +21A5;UPWARDS ARROW FROM BAR;So;0;ON;;;;;N;UP ARROW FROM BAR;;;; +21A6;RIGHTWARDS ARROW FROM BAR;Sm;0;ON;;;;;N;RIGHT ARROW FROM BAR;;;; +21A7;DOWNWARDS ARROW FROM BAR;So;0;ON;;;;;N;DOWN ARROW FROM BAR;;;; +21A8;UP DOWN ARROW WITH BASE;So;0;ON;;;;;N;;;;; +21A9;LEFTWARDS ARROW WITH HOOK;So;0;ON;;;;;N;LEFT ARROW WITH HOOK;;;; +21AA;RIGHTWARDS ARROW WITH HOOK;So;0;ON;;;;;N;RIGHT ARROW WITH HOOK;;;; +21AB;LEFTWARDS ARROW WITH LOOP;So;0;ON;;;;;N;LEFT ARROW WITH LOOP;;;; +21AC;RIGHTWARDS ARROW WITH LOOP;So;0;ON;;;;;N;RIGHT ARROW WITH LOOP;;;; +21AD;LEFT RIGHT WAVE ARROW;So;0;ON;;;;;N;;;;; +21AE;LEFT RIGHT ARROW WITH STROKE;Sm;0;ON;2194 0338;;;;N;;;;; +21AF;DOWNWARDS ZIGZAG ARROW;So;0;ON;;;;;N;DOWN ZIGZAG ARROW;;;; +21B0;UPWARDS ARROW WITH TIP LEFTWARDS;So;0;ON;;;;;N;UP ARROW WITH TIP LEFT;;;; +21B1;UPWARDS ARROW WITH TIP RIGHTWARDS;So;0;ON;;;;;N;UP ARROW WITH TIP RIGHT;;;; +21B2;DOWNWARDS ARROW WITH TIP LEFTWARDS;So;0;ON;;;;;N;DOWN ARROW WITH TIP LEFT;;;; +21B3;DOWNWARDS ARROW WITH TIP RIGHTWARDS;So;0;ON;;;;;N;DOWN ARROW WITH TIP RIGHT;;;; +21B4;RIGHTWARDS ARROW WITH CORNER DOWNWARDS;So;0;ON;;;;;N;RIGHT ARROW WITH CORNER DOWN;;;; +21B5;DOWNWARDS ARROW WITH CORNER LEFTWARDS;So;0;ON;;;;;N;DOWN ARROW WITH CORNER LEFT;;;; +21B6;ANTICLOCKWISE TOP SEMICIRCLE ARROW;So;0;ON;;;;;N;;;;; +21B7;CLOCKWISE TOP SEMICIRCLE ARROW;So;0;ON;;;;;N;;;;; +21B8;NORTH WEST ARROW TO LONG BAR;So;0;ON;;;;;N;UPPER LEFT ARROW TO LONG BAR;;;; +21B9;LEFTWARDS ARROW TO BAR OVER RIGHTWARDS ARROW TO BAR;So;0;ON;;;;;N;LEFT ARROW TO BAR OVER RIGHT ARROW TO BAR;;;; +21BA;ANTICLOCKWISE OPEN CIRCLE ARROW;So;0;ON;;;;;N;;;;; +21BB;CLOCKWISE OPEN CIRCLE ARROW;So;0;ON;;;;;N;;;;; +21BC;LEFTWARDS HARPOON WITH BARB UPWARDS;So;0;ON;;;;;N;LEFT HARPOON WITH BARB UP;;;; +21BD;LEFTWARDS HARPOON WITH BARB DOWNWARDS;So;0;ON;;;;;N;LEFT HARPOON WITH BARB DOWN;;;; +21BE;UPWARDS HARPOON WITH BARB RIGHTWARDS;So;0;ON;;;;;N;UP HARPOON WITH BARB RIGHT;;;; +21BF;UPWARDS HARPOON WITH BARB LEFTWARDS;So;0;ON;;;;;N;UP HARPOON WITH BARB LEFT;;;; +21C0;RIGHTWARDS HARPOON WITH BARB UPWARDS;So;0;ON;;;;;N;RIGHT HARPOON WITH BARB UP;;;; +21C1;RIGHTWARDS HARPOON WITH BARB DOWNWARDS;So;0;ON;;;;;N;RIGHT HARPOON WITH BARB DOWN;;;; +21C2;DOWNWARDS HARPOON WITH BARB RIGHTWARDS;So;0;ON;;;;;N;DOWN HARPOON WITH BARB RIGHT;;;; +21C3;DOWNWARDS HARPOON WITH BARB LEFTWARDS;So;0;ON;;;;;N;DOWN HARPOON WITH BARB LEFT;;;; +21C4;RIGHTWARDS ARROW OVER LEFTWARDS ARROW;So;0;ON;;;;;N;RIGHT ARROW OVER LEFT ARROW;;;; +21C5;UPWARDS ARROW LEFTWARDS OF DOWNWARDS ARROW;So;0;ON;;;;;N;UP ARROW LEFT OF DOWN ARROW;;;; +21C6;LEFTWARDS ARROW OVER RIGHTWARDS ARROW;So;0;ON;;;;;N;LEFT ARROW OVER RIGHT ARROW;;;; +21C7;LEFTWARDS PAIRED ARROWS;So;0;ON;;;;;N;LEFT PAIRED ARROWS;;;; +21C8;UPWARDS PAIRED ARROWS;So;0;ON;;;;;N;UP PAIRED ARROWS;;;; +21C9;RIGHTWARDS PAIRED ARROWS;So;0;ON;;;;;N;RIGHT PAIRED ARROWS;;;; +21CA;DOWNWARDS PAIRED ARROWS;So;0;ON;;;;;N;DOWN PAIRED ARROWS;;;; +21CB;LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON;So;0;ON;;;;;N;LEFT HARPOON OVER RIGHT HARPOON;;;; +21CC;RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON;So;0;ON;;;;;N;RIGHT HARPOON OVER LEFT HARPOON;;;; +21CD;LEFTWARDS DOUBLE ARROW WITH STROKE;So;0;ON;21D0 0338;;;;N;LEFT DOUBLE ARROW WITH STROKE;;;; +21CE;LEFT RIGHT DOUBLE ARROW WITH STROKE;Sm;0;ON;21D4 0338;;;;N;;;;; +21CF;RIGHTWARDS DOUBLE ARROW WITH STROKE;Sm;0;ON;21D2 0338;;;;N;RIGHT DOUBLE ARROW WITH STROKE;;;; +21D0;LEFTWARDS DOUBLE ARROW;So;0;ON;;;;;N;LEFT DOUBLE ARROW;;;; +21D1;UPWARDS DOUBLE ARROW;So;0;ON;;;;;N;UP DOUBLE ARROW;;;; +21D2;RIGHTWARDS DOUBLE ARROW;Sm;0;ON;;;;;N;RIGHT DOUBLE ARROW;;;; +21D3;DOWNWARDS DOUBLE ARROW;So;0;ON;;;;;N;DOWN DOUBLE ARROW;;;; +21D4;LEFT RIGHT DOUBLE ARROW;Sm;0;ON;;;;;N;;;;; +21D5;UP DOWN DOUBLE ARROW;So;0;ON;;;;;N;;;;; +21D6;NORTH WEST DOUBLE ARROW;So;0;ON;;;;;N;UPPER LEFT DOUBLE ARROW;;;; +21D7;NORTH EAST DOUBLE ARROW;So;0;ON;;;;;N;UPPER RIGHT DOUBLE ARROW;;;; +21D8;SOUTH EAST DOUBLE ARROW;So;0;ON;;;;;N;LOWER RIGHT DOUBLE ARROW;;;; +21D9;SOUTH WEST DOUBLE ARROW;So;0;ON;;;;;N;LOWER LEFT DOUBLE ARROW;;;; +21DA;LEFTWARDS TRIPLE ARROW;So;0;ON;;;;;N;LEFT TRIPLE ARROW;;;; +21DB;RIGHTWARDS TRIPLE ARROW;So;0;ON;;;;;N;RIGHT TRIPLE ARROW;;;; +21DC;LEFTWARDS SQUIGGLE ARROW;So;0;ON;;;;;N;LEFT SQUIGGLE ARROW;;;; +21DD;RIGHTWARDS SQUIGGLE ARROW;So;0;ON;;;;;N;RIGHT SQUIGGLE ARROW;;;; +21DE;UPWARDS ARROW WITH DOUBLE STROKE;So;0;ON;;;;;N;UP ARROW WITH DOUBLE STROKE;;;; +21DF;DOWNWARDS ARROW WITH DOUBLE STROKE;So;0;ON;;;;;N;DOWN ARROW WITH DOUBLE STROKE;;;; +21E0;LEFTWARDS DASHED ARROW;So;0;ON;;;;;N;LEFT DASHED ARROW;;;; +21E1;UPWARDS DASHED ARROW;So;0;ON;;;;;N;UP DASHED ARROW;;;; +21E2;RIGHTWARDS DASHED ARROW;So;0;ON;;;;;N;RIGHT DASHED ARROW;;;; +21E3;DOWNWARDS DASHED ARROW;So;0;ON;;;;;N;DOWN DASHED ARROW;;;; +21E4;LEFTWARDS ARROW TO BAR;So;0;ON;;;;;N;LEFT ARROW TO BAR;;;; +21E5;RIGHTWARDS ARROW TO BAR;So;0;ON;;;;;N;RIGHT ARROW TO BAR;;;; +21E6;LEFTWARDS WHITE ARROW;So;0;ON;;;;;N;WHITE LEFT ARROW;;;; +21E7;UPWARDS WHITE ARROW;So;0;ON;;;;;N;WHITE UP ARROW;;;; +21E8;RIGHTWARDS WHITE ARROW;So;0;ON;;;;;N;WHITE RIGHT ARROW;;;; +21E9;DOWNWARDS WHITE ARROW;So;0;ON;;;;;N;WHITE DOWN ARROW;;;; +21EA;UPWARDS WHITE ARROW FROM BAR;So;0;ON;;;;;N;WHITE UP ARROW FROM BAR;;;; +21EB;UPWARDS WHITE ARROW ON PEDESTAL;So;0;ON;;;;;N;;;;; +21EC;UPWARDS WHITE ARROW ON PEDESTAL WITH HORIZONTAL BAR;So;0;ON;;;;;N;;;;; +21ED;UPWARDS WHITE ARROW ON PEDESTAL WITH VERTICAL BAR;So;0;ON;;;;;N;;;;; +21EE;UPWARDS WHITE DOUBLE ARROW;So;0;ON;;;;;N;;;;; +21EF;UPWARDS WHITE DOUBLE ARROW ON PEDESTAL;So;0;ON;;;;;N;;;;; +21F0;RIGHTWARDS WHITE ARROW FROM WALL;So;0;ON;;;;;N;;;;; +21F1;NORTH WEST ARROW TO CORNER;So;0;ON;;;;;N;;;;; +21F2;SOUTH EAST ARROW TO CORNER;So;0;ON;;;;;N;;;;; +21F3;UP DOWN WHITE ARROW;So;0;ON;;;;;N;;;;; +21F4;RIGHT ARROW WITH SMALL CIRCLE;Sm;0;ON;;;;;N;;;;; +21F5;DOWNWARDS ARROW LEFTWARDS OF UPWARDS ARROW;Sm;0;ON;;;;;N;;;;; +21F6;THREE RIGHTWARDS ARROWS;Sm;0;ON;;;;;N;;;;; +21F7;LEFTWARDS ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +21F8;RIGHTWARDS ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +21F9;LEFT RIGHT ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +21FA;LEFTWARDS ARROW WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +21FB;RIGHTWARDS ARROW WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +21FC;LEFT RIGHT ARROW WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +21FD;LEFTWARDS OPEN-HEADED ARROW;Sm;0;ON;;;;;N;;;;; +21FE;RIGHTWARDS OPEN-HEADED ARROW;Sm;0;ON;;;;;N;;;;; +21FF;LEFT RIGHT OPEN-HEADED ARROW;Sm;0;ON;;;;;N;;;;; +2200;FOR ALL;Sm;0;ON;;;;;N;;;;; +2201;COMPLEMENT;Sm;0;ON;;;;;Y;;;;; +2202;PARTIAL DIFFERENTIAL;Sm;0;ON;;;;;Y;;;;; +2203;THERE EXISTS;Sm;0;ON;;;;;Y;;;;; +2204;THERE DOES NOT EXIST;Sm;0;ON;2203 0338;;;;Y;;;;; +2205;EMPTY SET;Sm;0;ON;;;;;N;;;;; +2206;INCREMENT;Sm;0;ON;;;;;N;;;;; +2207;NABLA;Sm;0;ON;;;;;N;;;;; +2208;ELEMENT OF;Sm;0;ON;;;;;Y;;;;; +2209;NOT AN ELEMENT OF;Sm;0;ON;2208 0338;;;;Y;;;;; +220A;SMALL ELEMENT OF;Sm;0;ON;;;;;Y;;;;; +220B;CONTAINS AS MEMBER;Sm;0;ON;;;;;Y;;;;; +220C;DOES NOT CONTAIN AS MEMBER;Sm;0;ON;220B 0338;;;;Y;;;;; +220D;SMALL CONTAINS AS MEMBER;Sm;0;ON;;;;;Y;;;;; +220E;END OF PROOF;Sm;0;ON;;;;;N;;;;; +220F;N-ARY PRODUCT;Sm;0;ON;;;;;N;;;;; +2210;N-ARY COPRODUCT;Sm;0;ON;;;;;N;;;;; +2211;N-ARY SUMMATION;Sm;0;ON;;;;;Y;;;;; +2212;MINUS SIGN;Sm;0;ES;;;;;N;;;;; +2213;MINUS-OR-PLUS SIGN;Sm;0;ET;;;;;N;;;;; +2214;DOT PLUS;Sm;0;ON;;;;;N;;;;; +2215;DIVISION SLASH;Sm;0;ON;;;;;Y;;;;; +2216;SET MINUS;Sm;0;ON;;;;;Y;;;;; +2217;ASTERISK OPERATOR;Sm;0;ON;;;;;N;;;;; +2218;RING OPERATOR;Sm;0;ON;;;;;N;;;;; +2219;BULLET OPERATOR;Sm;0;ON;;;;;N;;;;; +221A;SQUARE ROOT;Sm;0;ON;;;;;Y;;;;; +221B;CUBE ROOT;Sm;0;ON;;;;;Y;;;;; +221C;FOURTH ROOT;Sm;0;ON;;;;;Y;;;;; +221D;PROPORTIONAL TO;Sm;0;ON;;;;;Y;;;;; +221E;INFINITY;Sm;0;ON;;;;;N;;;;; +221F;RIGHT ANGLE;Sm;0;ON;;;;;Y;;;;; +2220;ANGLE;Sm;0;ON;;;;;Y;;;;; +2221;MEASURED ANGLE;Sm;0;ON;;;;;Y;;;;; +2222;SPHERICAL ANGLE;Sm;0;ON;;;;;Y;;;;; +2223;DIVIDES;Sm;0;ON;;;;;N;;;;; +2224;DOES NOT DIVIDE;Sm;0;ON;2223 0338;;;;Y;;;;; +2225;PARALLEL TO;Sm;0;ON;;;;;N;;;;; +2226;NOT PARALLEL TO;Sm;0;ON;2225 0338;;;;Y;;;;; +2227;LOGICAL AND;Sm;0;ON;;;;;N;;;;; +2228;LOGICAL OR;Sm;0;ON;;;;;N;;;;; +2229;INTERSECTION;Sm;0;ON;;;;;N;;;;; +222A;UNION;Sm;0;ON;;;;;N;;;;; +222B;INTEGRAL;Sm;0;ON;;;;;Y;;;;; +222C;DOUBLE INTEGRAL;Sm;0;ON;<compat> 222B 222B;;;;Y;;;;; +222D;TRIPLE INTEGRAL;Sm;0;ON;<compat> 222B 222B 222B;;;;Y;;;;; +222E;CONTOUR INTEGRAL;Sm;0;ON;;;;;Y;;;;; +222F;SURFACE INTEGRAL;Sm;0;ON;<compat> 222E 222E;;;;Y;;;;; +2230;VOLUME INTEGRAL;Sm;0;ON;<compat> 222E 222E 222E;;;;Y;;;;; +2231;CLOCKWISE INTEGRAL;Sm;0;ON;;;;;Y;;;;; +2232;CLOCKWISE CONTOUR INTEGRAL;Sm;0;ON;;;;;Y;;;;; +2233;ANTICLOCKWISE CONTOUR INTEGRAL;Sm;0;ON;;;;;Y;;;;; +2234;THEREFORE;Sm;0;ON;;;;;N;;;;; +2235;BECAUSE;Sm;0;ON;;;;;N;;;;; +2236;RATIO;Sm;0;ON;;;;;N;;;;; +2237;PROPORTION;Sm;0;ON;;;;;N;;;;; +2238;DOT MINUS;Sm;0;ON;;;;;N;;;;; +2239;EXCESS;Sm;0;ON;;;;;Y;;;;; +223A;GEOMETRIC PROPORTION;Sm;0;ON;;;;;N;;;;; +223B;HOMOTHETIC;Sm;0;ON;;;;;Y;;;;; +223C;TILDE OPERATOR;Sm;0;ON;;;;;Y;;;;; +223D;REVERSED TILDE;Sm;0;ON;;;;;Y;;;;; +223E;INVERTED LAZY S;Sm;0;ON;;;;;Y;;;;; +223F;SINE WAVE;Sm;0;ON;;;;;Y;;;;; +2240;WREATH PRODUCT;Sm;0;ON;;;;;Y;;;;; +2241;NOT TILDE;Sm;0;ON;223C 0338;;;;Y;;;;; +2242;MINUS TILDE;Sm;0;ON;;;;;Y;;;;; +2243;ASYMPTOTICALLY EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2244;NOT ASYMPTOTICALLY EQUAL TO;Sm;0;ON;2243 0338;;;;Y;;;;; +2245;APPROXIMATELY EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2246;APPROXIMATELY BUT NOT ACTUALLY EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2247;NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO;Sm;0;ON;2245 0338;;;;Y;;;;; +2248;ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2249;NOT ALMOST EQUAL TO;Sm;0;ON;2248 0338;;;;Y;;;;; +224A;ALMOST EQUAL OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +224B;TRIPLE TILDE;Sm;0;ON;;;;;Y;;;;; +224C;ALL EQUAL TO;Sm;0;ON;;;;;Y;;;;; +224D;EQUIVALENT TO;Sm;0;ON;;;;;N;;;;; +224E;GEOMETRICALLY EQUIVALENT TO;Sm;0;ON;;;;;N;;;;; +224F;DIFFERENCE BETWEEN;Sm;0;ON;;;;;N;;;;; +2250;APPROACHES THE LIMIT;Sm;0;ON;;;;;N;;;;; +2251;GEOMETRICALLY EQUAL TO;Sm;0;ON;;;;;N;;;;; +2252;APPROXIMATELY EQUAL TO OR THE IMAGE OF;Sm;0;ON;;;;;Y;;;;; +2253;IMAGE OF OR APPROXIMATELY EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2254;COLON EQUALS;Sm;0;ON;;;;;Y;COLON EQUAL;;;; +2255;EQUALS COLON;Sm;0;ON;;;;;Y;EQUAL COLON;;;; +2256;RING IN EQUAL TO;Sm;0;ON;;;;;N;;;;; +2257;RING EQUAL TO;Sm;0;ON;;;;;N;;;;; +2258;CORRESPONDS TO;Sm;0;ON;;;;;N;;;;; +2259;ESTIMATES;Sm;0;ON;;;;;N;;;;; +225A;EQUIANGULAR TO;Sm;0;ON;;;;;N;;;;; +225B;STAR EQUALS;Sm;0;ON;;;;;N;;;;; +225C;DELTA EQUAL TO;Sm;0;ON;;;;;N;;;;; +225D;EQUAL TO BY DEFINITION;Sm;0;ON;;;;;N;;;;; +225E;MEASURED BY;Sm;0;ON;;;;;N;;;;; +225F;QUESTIONED EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2260;NOT EQUAL TO;Sm;0;ON;003D 0338;;;;Y;;;;; +2261;IDENTICAL TO;Sm;0;ON;;;;;N;;;;; +2262;NOT IDENTICAL TO;Sm;0;ON;2261 0338;;;;Y;;;;; +2263;STRICTLY EQUIVALENT TO;Sm;0;ON;;;;;N;;;;; +2264;LESS-THAN OR EQUAL TO;Sm;0;ON;;;;;Y;LESS THAN OR EQUAL TO;;;; +2265;GREATER-THAN OR EQUAL TO;Sm;0;ON;;;;;Y;GREATER THAN OR EQUAL TO;;;; +2266;LESS-THAN OVER EQUAL TO;Sm;0;ON;;;;;Y;LESS THAN OVER EQUAL TO;;;; +2267;GREATER-THAN OVER EQUAL TO;Sm;0;ON;;;;;Y;GREATER THAN OVER EQUAL TO;;;; +2268;LESS-THAN BUT NOT EQUAL TO;Sm;0;ON;;;;;Y;LESS THAN BUT NOT EQUAL TO;;;; +2269;GREATER-THAN BUT NOT EQUAL TO;Sm;0;ON;;;;;Y;GREATER THAN BUT NOT EQUAL TO;;;; +226A;MUCH LESS-THAN;Sm;0;ON;;;;;Y;MUCH LESS THAN;;;; +226B;MUCH GREATER-THAN;Sm;0;ON;;;;;Y;MUCH GREATER THAN;;;; +226C;BETWEEN;Sm;0;ON;;;;;N;;;;; +226D;NOT EQUIVALENT TO;Sm;0;ON;224D 0338;;;;N;;;;; +226E;NOT LESS-THAN;Sm;0;ON;003C 0338;;;;Y;NOT LESS THAN;;;; +226F;NOT GREATER-THAN;Sm;0;ON;003E 0338;;;;Y;NOT GREATER THAN;;;; +2270;NEITHER LESS-THAN NOR EQUAL TO;Sm;0;ON;2264 0338;;;;Y;NEITHER LESS THAN NOR EQUAL TO;;;; +2271;NEITHER GREATER-THAN NOR EQUAL TO;Sm;0;ON;2265 0338;;;;Y;NEITHER GREATER THAN NOR EQUAL TO;;;; +2272;LESS-THAN OR EQUIVALENT TO;Sm;0;ON;;;;;Y;LESS THAN OR EQUIVALENT TO;;;; +2273;GREATER-THAN OR EQUIVALENT TO;Sm;0;ON;;;;;Y;GREATER THAN OR EQUIVALENT TO;;;; +2274;NEITHER LESS-THAN NOR EQUIVALENT TO;Sm;0;ON;2272 0338;;;;Y;NEITHER LESS THAN NOR EQUIVALENT TO;;;; +2275;NEITHER GREATER-THAN NOR EQUIVALENT TO;Sm;0;ON;2273 0338;;;;Y;NEITHER GREATER THAN NOR EQUIVALENT TO;;;; +2276;LESS-THAN OR GREATER-THAN;Sm;0;ON;;;;;Y;LESS THAN OR GREATER THAN;;;; +2277;GREATER-THAN OR LESS-THAN;Sm;0;ON;;;;;Y;GREATER THAN OR LESS THAN;;;; +2278;NEITHER LESS-THAN NOR GREATER-THAN;Sm;0;ON;2276 0338;;;;Y;NEITHER LESS THAN NOR GREATER THAN;;;; +2279;NEITHER GREATER-THAN NOR LESS-THAN;Sm;0;ON;2277 0338;;;;Y;NEITHER GREATER THAN NOR LESS THAN;;;; +227A;PRECEDES;Sm;0;ON;;;;;Y;;;;; +227B;SUCCEEDS;Sm;0;ON;;;;;Y;;;;; +227C;PRECEDES OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +227D;SUCCEEDS OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +227E;PRECEDES OR EQUIVALENT TO;Sm;0;ON;;;;;Y;;;;; +227F;SUCCEEDS OR EQUIVALENT TO;Sm;0;ON;;;;;Y;;;;; +2280;DOES NOT PRECEDE;Sm;0;ON;227A 0338;;;;Y;;;;; +2281;DOES NOT SUCCEED;Sm;0;ON;227B 0338;;;;Y;;;;; +2282;SUBSET OF;Sm;0;ON;;;;;Y;;;;; +2283;SUPERSET OF;Sm;0;ON;;;;;Y;;;;; +2284;NOT A SUBSET OF;Sm;0;ON;2282 0338;;;;Y;;;;; +2285;NOT A SUPERSET OF;Sm;0;ON;2283 0338;;;;Y;;;;; +2286;SUBSET OF OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2287;SUPERSET OF OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2288;NEITHER A SUBSET OF NOR EQUAL TO;Sm;0;ON;2286 0338;;;;Y;;;;; +2289;NEITHER A SUPERSET OF NOR EQUAL TO;Sm;0;ON;2287 0338;;;;Y;;;;; +228A;SUBSET OF WITH NOT EQUAL TO;Sm;0;ON;;;;;Y;SUBSET OF OR NOT EQUAL TO;;;; +228B;SUPERSET OF WITH NOT EQUAL TO;Sm;0;ON;;;;;Y;SUPERSET OF OR NOT EQUAL TO;;;; +228C;MULTISET;Sm;0;ON;;;;;Y;;;;; +228D;MULTISET MULTIPLICATION;Sm;0;ON;;;;;N;;;;; +228E;MULTISET UNION;Sm;0;ON;;;;;N;;;;; +228F;SQUARE IMAGE OF;Sm;0;ON;;;;;Y;;;;; +2290;SQUARE ORIGINAL OF;Sm;0;ON;;;;;Y;;;;; +2291;SQUARE IMAGE OF OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2292;SQUARE ORIGINAL OF OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2293;SQUARE CAP;Sm;0;ON;;;;;N;;;;; +2294;SQUARE CUP;Sm;0;ON;;;;;N;;;;; +2295;CIRCLED PLUS;Sm;0;ON;;;;;N;;;;; +2296;CIRCLED MINUS;Sm;0;ON;;;;;N;;;;; +2297;CIRCLED TIMES;Sm;0;ON;;;;;N;;;;; +2298;CIRCLED DIVISION SLASH;Sm;0;ON;;;;;Y;;;;; +2299;CIRCLED DOT OPERATOR;Sm;0;ON;;;;;N;;;;; +229A;CIRCLED RING OPERATOR;Sm;0;ON;;;;;N;;;;; +229B;CIRCLED ASTERISK OPERATOR;Sm;0;ON;;;;;N;;;;; +229C;CIRCLED EQUALS;Sm;0;ON;;;;;N;;;;; +229D;CIRCLED DASH;Sm;0;ON;;;;;N;;;;; +229E;SQUARED PLUS;Sm;0;ON;;;;;N;;;;; +229F;SQUARED MINUS;Sm;0;ON;;;;;N;;;;; +22A0;SQUARED TIMES;Sm;0;ON;;;;;N;;;;; +22A1;SQUARED DOT OPERATOR;Sm;0;ON;;;;;N;;;;; +22A2;RIGHT TACK;Sm;0;ON;;;;;Y;;;;; +22A3;LEFT TACK;Sm;0;ON;;;;;Y;;;;; +22A4;DOWN TACK;Sm;0;ON;;;;;N;;;;; +22A5;UP TACK;Sm;0;ON;;;;;N;;;;; +22A6;ASSERTION;Sm;0;ON;;;;;Y;;;;; +22A7;MODELS;Sm;0;ON;;;;;Y;;;;; +22A8;TRUE;Sm;0;ON;;;;;Y;;;;; +22A9;FORCES;Sm;0;ON;;;;;Y;;;;; +22AA;TRIPLE VERTICAL BAR RIGHT TURNSTILE;Sm;0;ON;;;;;Y;;;;; +22AB;DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE;Sm;0;ON;;;;;Y;;;;; +22AC;DOES NOT PROVE;Sm;0;ON;22A2 0338;;;;Y;;;;; +22AD;NOT TRUE;Sm;0;ON;22A8 0338;;;;Y;;;;; +22AE;DOES NOT FORCE;Sm;0;ON;22A9 0338;;;;Y;;;;; +22AF;NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE;Sm;0;ON;22AB 0338;;;;Y;;;;; +22B0;PRECEDES UNDER RELATION;Sm;0;ON;;;;;Y;;;;; +22B1;SUCCEEDS UNDER RELATION;Sm;0;ON;;;;;Y;;;;; +22B2;NORMAL SUBGROUP OF;Sm;0;ON;;;;;Y;;;;; +22B3;CONTAINS AS NORMAL SUBGROUP;Sm;0;ON;;;;;Y;;;;; +22B4;NORMAL SUBGROUP OF OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +22B5;CONTAINS AS NORMAL SUBGROUP OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +22B6;ORIGINAL OF;Sm;0;ON;;;;;Y;;;;; +22B7;IMAGE OF;Sm;0;ON;;;;;Y;;;;; +22B8;MULTIMAP;Sm;0;ON;;;;;Y;;;;; +22B9;HERMITIAN CONJUGATE MATRIX;Sm;0;ON;;;;;N;;;;; +22BA;INTERCALATE;Sm;0;ON;;;;;N;;;;; +22BB;XOR;Sm;0;ON;;;;;N;;;;; +22BC;NAND;Sm;0;ON;;;;;N;;;;; +22BD;NOR;Sm;0;ON;;;;;N;;;;; +22BE;RIGHT ANGLE WITH ARC;Sm;0;ON;;;;;Y;;;;; +22BF;RIGHT TRIANGLE;Sm;0;ON;;;;;Y;;;;; +22C0;N-ARY LOGICAL AND;Sm;0;ON;;;;;N;;;;; +22C1;N-ARY LOGICAL OR;Sm;0;ON;;;;;N;;;;; +22C2;N-ARY INTERSECTION;Sm;0;ON;;;;;N;;;;; +22C3;N-ARY UNION;Sm;0;ON;;;;;N;;;;; +22C4;DIAMOND OPERATOR;Sm;0;ON;;;;;N;;;;; +22C5;DOT OPERATOR;Sm;0;ON;;;;;N;;;;; +22C6;STAR OPERATOR;Sm;0;ON;;;;;N;;;;; +22C7;DIVISION TIMES;Sm;0;ON;;;;;N;;;;; +22C8;BOWTIE;Sm;0;ON;;;;;N;;;;; +22C9;LEFT NORMAL FACTOR SEMIDIRECT PRODUCT;Sm;0;ON;;;;;Y;;;;; +22CA;RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT;Sm;0;ON;;;;;Y;;;;; +22CB;LEFT SEMIDIRECT PRODUCT;Sm;0;ON;;;;;Y;;;;; +22CC;RIGHT SEMIDIRECT PRODUCT;Sm;0;ON;;;;;Y;;;;; +22CD;REVERSED TILDE EQUALS;Sm;0;ON;;;;;Y;;;;; +22CE;CURLY LOGICAL OR;Sm;0;ON;;;;;N;;;;; +22CF;CURLY LOGICAL AND;Sm;0;ON;;;;;N;;;;; +22D0;DOUBLE SUBSET;Sm;0;ON;;;;;Y;;;;; +22D1;DOUBLE SUPERSET;Sm;0;ON;;;;;Y;;;;; +22D2;DOUBLE INTERSECTION;Sm;0;ON;;;;;N;;;;; +22D3;DOUBLE UNION;Sm;0;ON;;;;;N;;;;; +22D4;PITCHFORK;Sm;0;ON;;;;;N;;;;; +22D5;EQUAL AND PARALLEL TO;Sm;0;ON;;;;;N;;;;; +22D6;LESS-THAN WITH DOT;Sm;0;ON;;;;;Y;LESS THAN WITH DOT;;;; +22D7;GREATER-THAN WITH DOT;Sm;0;ON;;;;;Y;GREATER THAN WITH DOT;;;; +22D8;VERY MUCH LESS-THAN;Sm;0;ON;;;;;Y;VERY MUCH LESS THAN;;;; +22D9;VERY MUCH GREATER-THAN;Sm;0;ON;;;;;Y;VERY MUCH GREATER THAN;;;; +22DA;LESS-THAN EQUAL TO OR GREATER-THAN;Sm;0;ON;;;;;Y;LESS THAN EQUAL TO OR GREATER THAN;;;; +22DB;GREATER-THAN EQUAL TO OR LESS-THAN;Sm;0;ON;;;;;Y;GREATER THAN EQUAL TO OR LESS THAN;;;; +22DC;EQUAL TO OR LESS-THAN;Sm;0;ON;;;;;Y;EQUAL TO OR LESS THAN;;;; +22DD;EQUAL TO OR GREATER-THAN;Sm;0;ON;;;;;Y;EQUAL TO OR GREATER THAN;;;; +22DE;EQUAL TO OR PRECEDES;Sm;0;ON;;;;;Y;;;;; +22DF;EQUAL TO OR SUCCEEDS;Sm;0;ON;;;;;Y;;;;; +22E0;DOES NOT PRECEDE OR EQUAL;Sm;0;ON;227C 0338;;;;Y;;;;; +22E1;DOES NOT SUCCEED OR EQUAL;Sm;0;ON;227D 0338;;;;Y;;;;; +22E2;NOT SQUARE IMAGE OF OR EQUAL TO;Sm;0;ON;2291 0338;;;;Y;;;;; +22E3;NOT SQUARE ORIGINAL OF OR EQUAL TO;Sm;0;ON;2292 0338;;;;Y;;;;; +22E4;SQUARE IMAGE OF OR NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;; +22E5;SQUARE ORIGINAL OF OR NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;; +22E6;LESS-THAN BUT NOT EQUIVALENT TO;Sm;0;ON;;;;;Y;LESS THAN BUT NOT EQUIVALENT TO;;;; +22E7;GREATER-THAN BUT NOT EQUIVALENT TO;Sm;0;ON;;;;;Y;GREATER THAN BUT NOT EQUIVALENT TO;;;; +22E8;PRECEDES BUT NOT EQUIVALENT TO;Sm;0;ON;;;;;Y;;;;; +22E9;SUCCEEDS BUT NOT EQUIVALENT TO;Sm;0;ON;;;;;Y;;;;; +22EA;NOT NORMAL SUBGROUP OF;Sm;0;ON;22B2 0338;;;;Y;;;;; +22EB;DOES NOT CONTAIN AS NORMAL SUBGROUP;Sm;0;ON;22B3 0338;;;;Y;;;;; +22EC;NOT NORMAL SUBGROUP OF OR EQUAL TO;Sm;0;ON;22B4 0338;;;;Y;;;;; +22ED;DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL;Sm;0;ON;22B5 0338;;;;Y;;;;; +22EE;VERTICAL ELLIPSIS;Sm;0;ON;;;;;N;;;;; +22EF;MIDLINE HORIZONTAL ELLIPSIS;Sm;0;ON;;;;;N;;;;; +22F0;UP RIGHT DIAGONAL ELLIPSIS;Sm;0;ON;;;;;Y;;;;; +22F1;DOWN RIGHT DIAGONAL ELLIPSIS;Sm;0;ON;;;;;Y;;;;; +22F2;ELEMENT OF WITH LONG HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;; +22F3;ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;; +22F4;SMALL ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;; +22F5;ELEMENT OF WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;; +22F6;ELEMENT OF WITH OVERBAR;Sm;0;ON;;;;;Y;;;;; +22F7;SMALL ELEMENT OF WITH OVERBAR;Sm;0;ON;;;;;Y;;;;; +22F8;ELEMENT OF WITH UNDERBAR;Sm;0;ON;;;;;Y;;;;; +22F9;ELEMENT OF WITH TWO HORIZONTAL STROKES;Sm;0;ON;;;;;Y;;;;; +22FA;CONTAINS WITH LONG HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;; +22FB;CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;; +22FC;SMALL CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;; +22FD;CONTAINS WITH OVERBAR;Sm;0;ON;;;;;Y;;;;; +22FE;SMALL CONTAINS WITH OVERBAR;Sm;0;ON;;;;;Y;;;;; +22FF;Z NOTATION BAG MEMBERSHIP;Sm;0;ON;;;;;Y;;;;; +2300;DIAMETER SIGN;So;0;ON;;;;;N;;;;; +2301;ELECTRIC ARROW;So;0;ON;;;;;N;;;;; +2302;HOUSE;So;0;ON;;;;;N;;;;; +2303;UP ARROWHEAD;So;0;ON;;;;;N;;;;; +2304;DOWN ARROWHEAD;So;0;ON;;;;;N;;;;; +2305;PROJECTIVE;So;0;ON;;;;;N;;;;; +2306;PERSPECTIVE;So;0;ON;;;;;N;;;;; +2307;WAVY LINE;So;0;ON;;;;;N;;;;; +2308;LEFT CEILING;Ps;0;ON;;;;;Y;;;;; +2309;RIGHT CEILING;Pe;0;ON;;;;;Y;;;;; +230A;LEFT FLOOR;Ps;0;ON;;;;;Y;;;;; +230B;RIGHT FLOOR;Pe;0;ON;;;;;Y;;;;; +230C;BOTTOM RIGHT CROP;So;0;ON;;;;;N;;;;; +230D;BOTTOM LEFT CROP;So;0;ON;;;;;N;;;;; +230E;TOP RIGHT CROP;So;0;ON;;;;;N;;;;; +230F;TOP LEFT CROP;So;0;ON;;;;;N;;;;; +2310;REVERSED NOT SIGN;So;0;ON;;;;;N;;;;; +2311;SQUARE LOZENGE;So;0;ON;;;;;N;;;;; +2312;ARC;So;0;ON;;;;;N;;;;; +2313;SEGMENT;So;0;ON;;;;;N;;;;; +2314;SECTOR;So;0;ON;;;;;N;;;;; +2315;TELEPHONE RECORDER;So;0;ON;;;;;N;;;;; +2316;POSITION INDICATOR;So;0;ON;;;;;N;;;;; +2317;VIEWDATA SQUARE;So;0;ON;;;;;N;;;;; +2318;PLACE OF INTEREST SIGN;So;0;ON;;;;;N;COMMAND KEY;;;; +2319;TURNED NOT SIGN;So;0;ON;;;;;N;;;;; +231A;WATCH;So;0;ON;;;;;N;;;;; +231B;HOURGLASS;So;0;ON;;;;;N;;;;; +231C;TOP LEFT CORNER;So;0;ON;;;;;N;;;;; +231D;TOP RIGHT CORNER;So;0;ON;;;;;N;;;;; +231E;BOTTOM LEFT CORNER;So;0;ON;;;;;N;;;;; +231F;BOTTOM RIGHT CORNER;So;0;ON;;;;;N;;;;; +2320;TOP HALF INTEGRAL;Sm;0;ON;;;;;Y;;;;; +2321;BOTTOM HALF INTEGRAL;Sm;0;ON;;;;;Y;;;;; +2322;FROWN;So;0;ON;;;;;N;;;;; +2323;SMILE;So;0;ON;;;;;N;;;;; +2324;UP ARROWHEAD BETWEEN TWO HORIZONTAL BARS;So;0;ON;;;;;N;ENTER KEY;;;; +2325;OPTION KEY;So;0;ON;;;;;N;;;;; +2326;ERASE TO THE RIGHT;So;0;ON;;;;;N;DELETE TO THE RIGHT KEY;;;; +2327;X IN A RECTANGLE BOX;So;0;ON;;;;;N;CLEAR KEY;;;; +2328;KEYBOARD;So;0;ON;;;;;N;;;;; +2329;LEFT-POINTING ANGLE BRACKET;Ps;0;ON;3008;;;;Y;BRA;;;; +232A;RIGHT-POINTING ANGLE BRACKET;Pe;0;ON;3009;;;;Y;KET;;;; +232B;ERASE TO THE LEFT;So;0;ON;;;;;N;DELETE TO THE LEFT KEY;;;; +232C;BENZENE RING;So;0;ON;;;;;N;;;;; +232D;CYLINDRICITY;So;0;ON;;;;;N;;;;; +232E;ALL AROUND-PROFILE;So;0;ON;;;;;N;;;;; +232F;SYMMETRY;So;0;ON;;;;;N;;;;; +2330;TOTAL RUNOUT;So;0;ON;;;;;N;;;;; +2331;DIMENSION ORIGIN;So;0;ON;;;;;N;;;;; +2332;CONICAL TAPER;So;0;ON;;;;;N;;;;; +2333;SLOPE;So;0;ON;;;;;N;;;;; +2334;COUNTERBORE;So;0;ON;;;;;N;;;;; +2335;COUNTERSINK;So;0;ON;;;;;N;;;;; +2336;APL FUNCTIONAL SYMBOL I-BEAM;So;0;L;;;;;N;;;;; +2337;APL FUNCTIONAL SYMBOL SQUISH QUAD;So;0;L;;;;;N;;;;; +2338;APL FUNCTIONAL SYMBOL QUAD EQUAL;So;0;L;;;;;N;;;;; +2339;APL FUNCTIONAL SYMBOL QUAD DIVIDE;So;0;L;;;;;N;;;;; +233A;APL FUNCTIONAL SYMBOL QUAD DIAMOND;So;0;L;;;;;N;;;;; +233B;APL FUNCTIONAL SYMBOL QUAD JOT;So;0;L;;;;;N;;;;; +233C;APL FUNCTIONAL SYMBOL QUAD CIRCLE;So;0;L;;;;;N;;;;; +233D;APL FUNCTIONAL SYMBOL CIRCLE STILE;So;0;L;;;;;N;;;;; +233E;APL FUNCTIONAL SYMBOL CIRCLE JOT;So;0;L;;;;;N;;;;; +233F;APL FUNCTIONAL SYMBOL SLASH BAR;So;0;L;;;;;N;;;;; +2340;APL FUNCTIONAL SYMBOL BACKSLASH BAR;So;0;L;;;;;N;;;;; +2341;APL FUNCTIONAL SYMBOL QUAD SLASH;So;0;L;;;;;N;;;;; +2342;APL FUNCTIONAL SYMBOL QUAD BACKSLASH;So;0;L;;;;;N;;;;; +2343;APL FUNCTIONAL SYMBOL QUAD LESS-THAN;So;0;L;;;;;N;;;;; +2344;APL FUNCTIONAL SYMBOL QUAD GREATER-THAN;So;0;L;;;;;N;;;;; +2345;APL FUNCTIONAL SYMBOL LEFTWARDS VANE;So;0;L;;;;;N;;;;; +2346;APL FUNCTIONAL SYMBOL RIGHTWARDS VANE;So;0;L;;;;;N;;;;; +2347;APL FUNCTIONAL SYMBOL QUAD LEFTWARDS ARROW;So;0;L;;;;;N;;;;; +2348;APL FUNCTIONAL SYMBOL QUAD RIGHTWARDS ARROW;So;0;L;;;;;N;;;;; +2349;APL FUNCTIONAL SYMBOL CIRCLE BACKSLASH;So;0;L;;;;;N;;;;; +234A;APL FUNCTIONAL SYMBOL DOWN TACK UNDERBAR;So;0;L;;;;;N;;;;; +234B;APL FUNCTIONAL SYMBOL DELTA STILE;So;0;L;;;;;N;;;;; +234C;APL FUNCTIONAL SYMBOL QUAD DOWN CARET;So;0;L;;;;;N;;;;; +234D;APL FUNCTIONAL SYMBOL QUAD DELTA;So;0;L;;;;;N;;;;; +234E;APL FUNCTIONAL SYMBOL DOWN TACK JOT;So;0;L;;;;;N;;;;; +234F;APL FUNCTIONAL SYMBOL UPWARDS VANE;So;0;L;;;;;N;;;;; +2350;APL FUNCTIONAL SYMBOL QUAD UPWARDS ARROW;So;0;L;;;;;N;;;;; +2351;APL FUNCTIONAL SYMBOL UP TACK OVERBAR;So;0;L;;;;;N;;;;; +2352;APL FUNCTIONAL SYMBOL DEL STILE;So;0;L;;;;;N;;;;; +2353;APL FUNCTIONAL SYMBOL QUAD UP CARET;So;0;L;;;;;N;;;;; +2354;APL FUNCTIONAL SYMBOL QUAD DEL;So;0;L;;;;;N;;;;; +2355;APL FUNCTIONAL SYMBOL UP TACK JOT;So;0;L;;;;;N;;;;; +2356;APL FUNCTIONAL SYMBOL DOWNWARDS VANE;So;0;L;;;;;N;;;;; +2357;APL FUNCTIONAL SYMBOL QUAD DOWNWARDS ARROW;So;0;L;;;;;N;;;;; +2358;APL FUNCTIONAL SYMBOL QUOTE UNDERBAR;So;0;L;;;;;N;;;;; +2359;APL FUNCTIONAL SYMBOL DELTA UNDERBAR;So;0;L;;;;;N;;;;; +235A;APL FUNCTIONAL SYMBOL DIAMOND UNDERBAR;So;0;L;;;;;N;;;;; +235B;APL FUNCTIONAL SYMBOL JOT UNDERBAR;So;0;L;;;;;N;;;;; +235C;APL FUNCTIONAL SYMBOL CIRCLE UNDERBAR;So;0;L;;;;;N;;;;; +235D;APL FUNCTIONAL SYMBOL UP SHOE JOT;So;0;L;;;;;N;;;;; +235E;APL FUNCTIONAL SYMBOL QUOTE QUAD;So;0;L;;;;;N;;;;; +235F;APL FUNCTIONAL SYMBOL CIRCLE STAR;So;0;L;;;;;N;;;;; +2360;APL FUNCTIONAL SYMBOL QUAD COLON;So;0;L;;;;;N;;;;; +2361;APL FUNCTIONAL SYMBOL UP TACK DIAERESIS;So;0;L;;;;;N;;;;; +2362;APL FUNCTIONAL SYMBOL DEL DIAERESIS;So;0;L;;;;;N;;;;; +2363;APL FUNCTIONAL SYMBOL STAR DIAERESIS;So;0;L;;;;;N;;;;; +2364;APL FUNCTIONAL SYMBOL JOT DIAERESIS;So;0;L;;;;;N;;;;; +2365;APL FUNCTIONAL SYMBOL CIRCLE DIAERESIS;So;0;L;;;;;N;;;;; +2366;APL FUNCTIONAL SYMBOL DOWN SHOE STILE;So;0;L;;;;;N;;;;; +2367;APL FUNCTIONAL SYMBOL LEFT SHOE STILE;So;0;L;;;;;N;;;;; +2368;APL FUNCTIONAL SYMBOL TILDE DIAERESIS;So;0;L;;;;;N;;;;; +2369;APL FUNCTIONAL SYMBOL GREATER-THAN DIAERESIS;So;0;L;;;;;N;;;;; +236A;APL FUNCTIONAL SYMBOL COMMA BAR;So;0;L;;;;;N;;;;; +236B;APL FUNCTIONAL SYMBOL DEL TILDE;So;0;L;;;;;N;;;;; +236C;APL FUNCTIONAL SYMBOL ZILDE;So;0;L;;;;;N;;;;; +236D;APL FUNCTIONAL SYMBOL STILE TILDE;So;0;L;;;;;N;;;;; +236E;APL FUNCTIONAL SYMBOL SEMICOLON UNDERBAR;So;0;L;;;;;N;;;;; +236F;APL FUNCTIONAL SYMBOL QUAD NOT EQUAL;So;0;L;;;;;N;;;;; +2370;APL FUNCTIONAL SYMBOL QUAD QUESTION;So;0;L;;;;;N;;;;; +2371;APL FUNCTIONAL SYMBOL DOWN CARET TILDE;So;0;L;;;;;N;;;;; +2372;APL FUNCTIONAL SYMBOL UP CARET TILDE;So;0;L;;;;;N;;;;; +2373;APL FUNCTIONAL SYMBOL IOTA;So;0;L;;;;;N;;;;; +2374;APL FUNCTIONAL SYMBOL RHO;So;0;L;;;;;N;;;;; +2375;APL FUNCTIONAL SYMBOL OMEGA;So;0;L;;;;;N;;;;; +2376;APL FUNCTIONAL SYMBOL ALPHA UNDERBAR;So;0;L;;;;;N;;;;; +2377;APL FUNCTIONAL SYMBOL EPSILON UNDERBAR;So;0;L;;;;;N;;;;; +2378;APL FUNCTIONAL SYMBOL IOTA UNDERBAR;So;0;L;;;;;N;;;;; +2379;APL FUNCTIONAL SYMBOL OMEGA UNDERBAR;So;0;L;;;;;N;;;;; +237A;APL FUNCTIONAL SYMBOL ALPHA;So;0;L;;;;;N;;;;; +237B;NOT CHECK MARK;So;0;ON;;;;;N;;;;; +237C;RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW;Sm;0;ON;;;;;N;;;;; +237D;SHOULDERED OPEN BOX;So;0;ON;;;;;N;;;;; +237E;BELL SYMBOL;So;0;ON;;;;;N;;;;; +237F;VERTICAL LINE WITH MIDDLE DOT;So;0;ON;;;;;N;;;;; +2380;INSERTION SYMBOL;So;0;ON;;;;;N;;;;; +2381;CONTINUOUS UNDERLINE SYMBOL;So;0;ON;;;;;N;;;;; +2382;DISCONTINUOUS UNDERLINE SYMBOL;So;0;ON;;;;;N;;;;; +2383;EMPHASIS SYMBOL;So;0;ON;;;;;N;;;;; +2384;COMPOSITION SYMBOL;So;0;ON;;;;;N;;;;; +2385;WHITE SQUARE WITH CENTRE VERTICAL LINE;So;0;ON;;;;;N;;;;; +2386;ENTER SYMBOL;So;0;ON;;;;;N;;;;; +2387;ALTERNATIVE KEY SYMBOL;So;0;ON;;;;;N;;;;; +2388;HELM SYMBOL;So;0;ON;;;;;N;;;;; +2389;CIRCLED HORIZONTAL BAR WITH NOTCH;So;0;ON;;;;;N;;;;; +238A;CIRCLED TRIANGLE DOWN;So;0;ON;;;;;N;;;;; +238B;BROKEN CIRCLE WITH NORTHWEST ARROW;So;0;ON;;;;;N;;;;; +238C;UNDO SYMBOL;So;0;ON;;;;;N;;;;; +238D;MONOSTABLE SYMBOL;So;0;ON;;;;;N;;;;; +238E;HYSTERESIS SYMBOL;So;0;ON;;;;;N;;;;; +238F;OPEN-CIRCUIT-OUTPUT H-TYPE SYMBOL;So;0;ON;;;;;N;;;;; +2390;OPEN-CIRCUIT-OUTPUT L-TYPE SYMBOL;So;0;ON;;;;;N;;;;; +2391;PASSIVE-PULL-DOWN-OUTPUT SYMBOL;So;0;ON;;;;;N;;;;; +2392;PASSIVE-PULL-UP-OUTPUT SYMBOL;So;0;ON;;;;;N;;;;; +2393;DIRECT CURRENT SYMBOL FORM TWO;So;0;ON;;;;;N;;;;; +2394;SOFTWARE-FUNCTION SYMBOL;So;0;ON;;;;;N;;;;; +2395;APL FUNCTIONAL SYMBOL QUAD;So;0;L;;;;;N;;;;; +2396;DECIMAL SEPARATOR KEY SYMBOL;So;0;ON;;;;;N;;;;; +2397;PREVIOUS PAGE;So;0;ON;;;;;N;;;;; +2398;NEXT PAGE;So;0;ON;;;;;N;;;;; +2399;PRINT SCREEN SYMBOL;So;0;ON;;;;;N;;;;; +239A;CLEAR SCREEN SYMBOL;So;0;ON;;;;;N;;;;; +239B;LEFT PARENTHESIS UPPER HOOK;Sm;0;ON;;;;;N;;;;; +239C;LEFT PARENTHESIS EXTENSION;Sm;0;ON;;;;;N;;;;; +239D;LEFT PARENTHESIS LOWER HOOK;Sm;0;ON;;;;;N;;;;; +239E;RIGHT PARENTHESIS UPPER HOOK;Sm;0;ON;;;;;N;;;;; +239F;RIGHT PARENTHESIS EXTENSION;Sm;0;ON;;;;;N;;;;; +23A0;RIGHT PARENTHESIS LOWER HOOK;Sm;0;ON;;;;;N;;;;; +23A1;LEFT SQUARE BRACKET UPPER CORNER;Sm;0;ON;;;;;N;;;;; +23A2;LEFT SQUARE BRACKET EXTENSION;Sm;0;ON;;;;;N;;;;; +23A3;LEFT SQUARE BRACKET LOWER CORNER;Sm;0;ON;;;;;N;;;;; +23A4;RIGHT SQUARE BRACKET UPPER CORNER;Sm;0;ON;;;;;N;;;;; +23A5;RIGHT SQUARE BRACKET EXTENSION;Sm;0;ON;;;;;N;;;;; +23A6;RIGHT SQUARE BRACKET LOWER CORNER;Sm;0;ON;;;;;N;;;;; +23A7;LEFT CURLY BRACKET UPPER HOOK;Sm;0;ON;;;;;N;;;;; +23A8;LEFT CURLY BRACKET MIDDLE PIECE;Sm;0;ON;;;;;N;;;;; +23A9;LEFT CURLY BRACKET LOWER HOOK;Sm;0;ON;;;;;N;;;;; +23AA;CURLY BRACKET EXTENSION;Sm;0;ON;;;;;N;;;;; +23AB;RIGHT CURLY BRACKET UPPER HOOK;Sm;0;ON;;;;;N;;;;; +23AC;RIGHT CURLY BRACKET MIDDLE PIECE;Sm;0;ON;;;;;N;;;;; +23AD;RIGHT CURLY BRACKET LOWER HOOK;Sm;0;ON;;;;;N;;;;; +23AE;INTEGRAL EXTENSION;Sm;0;ON;;;;;N;;;;; +23AF;HORIZONTAL LINE EXTENSION;Sm;0;ON;;;;;N;;;;; +23B0;UPPER LEFT OR LOWER RIGHT CURLY BRACKET SECTION;Sm;0;ON;;;;;N;;;;; +23B1;UPPER RIGHT OR LOWER LEFT CURLY BRACKET SECTION;Sm;0;ON;;;;;N;;;;; +23B2;SUMMATION TOP;Sm;0;ON;;;;;N;;;;; +23B3;SUMMATION BOTTOM;Sm;0;ON;;;;;N;;;;; +23B4;TOP SQUARE BRACKET;So;0;ON;;;;;N;;;;; +23B5;BOTTOM SQUARE BRACKET;So;0;ON;;;;;N;;;;; +23B6;BOTTOM SQUARE BRACKET OVER TOP SQUARE BRACKET;So;0;ON;;;;;N;;;;; +23B7;RADICAL SYMBOL BOTTOM;So;0;ON;;;;;N;;;;; +23B8;LEFT VERTICAL BOX LINE;So;0;ON;;;;;N;;;;; +23B9;RIGHT VERTICAL BOX LINE;So;0;ON;;;;;N;;;;; +23BA;HORIZONTAL SCAN LINE-1;So;0;ON;;;;;N;;;;; +23BB;HORIZONTAL SCAN LINE-3;So;0;ON;;;;;N;;;;; +23BC;HORIZONTAL SCAN LINE-7;So;0;ON;;;;;N;;;;; +23BD;HORIZONTAL SCAN LINE-9;So;0;ON;;;;;N;;;;; +23BE;DENTISTRY SYMBOL LIGHT VERTICAL AND TOP RIGHT;So;0;ON;;;;;N;;;;; +23BF;DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM RIGHT;So;0;ON;;;;;N;;;;; +23C0;DENTISTRY SYMBOL LIGHT VERTICAL WITH CIRCLE;So;0;ON;;;;;N;;;;; +23C1;DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH CIRCLE;So;0;ON;;;;;N;;;;; +23C2;DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH CIRCLE;So;0;ON;;;;;N;;;;; +23C3;DENTISTRY SYMBOL LIGHT VERTICAL WITH TRIANGLE;So;0;ON;;;;;N;;;;; +23C4;DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH TRIANGLE;So;0;ON;;;;;N;;;;; +23C5;DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH TRIANGLE;So;0;ON;;;;;N;;;;; +23C6;DENTISTRY SYMBOL LIGHT VERTICAL AND WAVE;So;0;ON;;;;;N;;;;; +23C7;DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH WAVE;So;0;ON;;;;;N;;;;; +23C8;DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH WAVE;So;0;ON;;;;;N;;;;; +23C9;DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL;So;0;ON;;;;;N;;;;; +23CA;DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL;So;0;ON;;;;;N;;;;; +23CB;DENTISTRY SYMBOL LIGHT VERTICAL AND TOP LEFT;So;0;ON;;;;;N;;;;; +23CC;DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM LEFT;So;0;ON;;;;;N;;;;; +23CD;SQUARE FOOT;So;0;ON;;;;;N;;;;; +23CE;RETURN SYMBOL;So;0;ON;;;;;N;;;;; +23CF;EJECT SYMBOL;So;0;ON;;;;;N;;;;; +23D0;VERTICAL LINE EXTENSION;So;0;ON;;;;;N;;;;; +23D1;METRICAL BREVE;So;0;ON;;;;;N;;;;; +23D2;METRICAL LONG OVER SHORT;So;0;ON;;;;;N;;;;; +23D3;METRICAL SHORT OVER LONG;So;0;ON;;;;;N;;;;; +23D4;METRICAL LONG OVER TWO SHORTS;So;0;ON;;;;;N;;;;; +23D5;METRICAL TWO SHORTS OVER LONG;So;0;ON;;;;;N;;;;; +23D6;METRICAL TWO SHORTS JOINED;So;0;ON;;;;;N;;;;; +23D7;METRICAL TRISEME;So;0;ON;;;;;N;;;;; +23D8;METRICAL TETRASEME;So;0;ON;;;;;N;;;;; +23D9;METRICAL PENTASEME;So;0;ON;;;;;N;;;;; +23DA;EARTH GROUND;So;0;ON;;;;;N;;;;; +23DB;FUSE;So;0;ON;;;;;N;;;;; +23DC;TOP PARENTHESIS;Sm;0;ON;;;;;N;;;;; +23DD;BOTTOM PARENTHESIS;Sm;0;ON;;;;;N;;;;; +23DE;TOP CURLY BRACKET;Sm;0;ON;;;;;N;;;;; +23DF;BOTTOM CURLY BRACKET;Sm;0;ON;;;;;N;;;;; +23E0;TOP TORTOISE SHELL BRACKET;Sm;0;ON;;;;;N;;;;; +23E1;BOTTOM TORTOISE SHELL BRACKET;Sm;0;ON;;;;;N;;;;; +23E2;WHITE TRAPEZIUM;So;0;ON;;;;;N;;;;; +23E3;BENZENE RING WITH CIRCLE;So;0;ON;;;;;N;;;;; +23E4;STRAIGHTNESS;So;0;ON;;;;;N;;;;; +23E5;FLATNESS;So;0;ON;;;;;N;;;;; +23E6;AC CURRENT;So;0;ON;;;;;N;;;;; +23E7;ELECTRICAL INTERSECTION;So;0;ON;;;;;N;;;;; +23E8;DECIMAL EXPONENT SYMBOL;So;0;ON;;;;;N;;;;; +23E9;BLACK RIGHT-POINTING DOUBLE TRIANGLE;So;0;ON;;;;;N;;;;; +23EA;BLACK LEFT-POINTING DOUBLE TRIANGLE;So;0;ON;;;;;N;;;;; +23EB;BLACK UP-POINTING DOUBLE TRIANGLE;So;0;ON;;;;;N;;;;; +23EC;BLACK DOWN-POINTING DOUBLE TRIANGLE;So;0;ON;;;;;N;;;;; +23ED;BLACK RIGHT-POINTING DOUBLE TRIANGLE WITH VERTICAL BAR;So;0;ON;;;;;N;;;;; +23EE;BLACK LEFT-POINTING DOUBLE TRIANGLE WITH VERTICAL BAR;So;0;ON;;;;;N;;;;; +23EF;BLACK RIGHT-POINTING TRIANGLE WITH DOUBLE VERTICAL BAR;So;0;ON;;;;;N;;;;; +23F0;ALARM CLOCK;So;0;ON;;;;;N;;;;; +23F1;STOPWATCH;So;0;ON;;;;;N;;;;; +23F2;TIMER CLOCK;So;0;ON;;;;;N;;;;; +23F3;HOURGLASS WITH FLOWING SAND;So;0;ON;;;;;N;;;;; +23F4;BLACK MEDIUM LEFT-POINTING TRIANGLE;So;0;ON;;;;;N;;;;; +23F5;BLACK MEDIUM RIGHT-POINTING TRIANGLE;So;0;ON;;;;;N;;;;; +23F6;BLACK MEDIUM UP-POINTING TRIANGLE;So;0;ON;;;;;N;;;;; +23F7;BLACK MEDIUM DOWN-POINTING TRIANGLE;So;0;ON;;;;;N;;;;; +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;;;;; +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;;;; +2403;SYMBOL FOR END OF TEXT;So;0;ON;;;;;N;GRAPHIC FOR END OF TEXT;;;; +2404;SYMBOL FOR END OF TRANSMISSION;So;0;ON;;;;;N;GRAPHIC FOR END OF TRANSMISSION;;;; +2405;SYMBOL FOR ENQUIRY;So;0;ON;;;;;N;GRAPHIC FOR ENQUIRY;;;; +2406;SYMBOL FOR ACKNOWLEDGE;So;0;ON;;;;;N;GRAPHIC FOR ACKNOWLEDGE;;;; +2407;SYMBOL FOR BELL;So;0;ON;;;;;N;GRAPHIC FOR BELL;;;; +2408;SYMBOL FOR BACKSPACE;So;0;ON;;;;;N;GRAPHIC FOR BACKSPACE;;;; +2409;SYMBOL FOR HORIZONTAL TABULATION;So;0;ON;;;;;N;GRAPHIC FOR HORIZONTAL TABULATION;;;; +240A;SYMBOL FOR LINE FEED;So;0;ON;;;;;N;GRAPHIC FOR LINE FEED;;;; +240B;SYMBOL FOR VERTICAL TABULATION;So;0;ON;;;;;N;GRAPHIC FOR VERTICAL TABULATION;;;; +240C;SYMBOL FOR FORM FEED;So;0;ON;;;;;N;GRAPHIC FOR FORM FEED;;;; +240D;SYMBOL FOR CARRIAGE RETURN;So;0;ON;;;;;N;GRAPHIC FOR CARRIAGE RETURN;;;; +240E;SYMBOL FOR SHIFT OUT;So;0;ON;;;;;N;GRAPHIC FOR SHIFT OUT;;;; +240F;SYMBOL FOR SHIFT IN;So;0;ON;;;;;N;GRAPHIC FOR SHIFT IN;;;; +2410;SYMBOL FOR DATA LINK ESCAPE;So;0;ON;;;;;N;GRAPHIC FOR DATA LINK ESCAPE;;;; +2411;SYMBOL FOR DEVICE CONTROL ONE;So;0;ON;;;;;N;GRAPHIC FOR DEVICE CONTROL ONE;;;; +2412;SYMBOL FOR DEVICE CONTROL TWO;So;0;ON;;;;;N;GRAPHIC FOR DEVICE CONTROL TWO;;;; +2413;SYMBOL FOR DEVICE CONTROL THREE;So;0;ON;;;;;N;GRAPHIC FOR DEVICE CONTROL THREE;;;; +2414;SYMBOL FOR DEVICE CONTROL FOUR;So;0;ON;;;;;N;GRAPHIC FOR DEVICE CONTROL FOUR;;;; +2415;SYMBOL FOR NEGATIVE ACKNOWLEDGE;So;0;ON;;;;;N;GRAPHIC FOR NEGATIVE ACKNOWLEDGE;;;; +2416;SYMBOL FOR SYNCHRONOUS IDLE;So;0;ON;;;;;N;GRAPHIC FOR SYNCHRONOUS IDLE;;;; +2417;SYMBOL FOR END OF TRANSMISSION BLOCK;So;0;ON;;;;;N;GRAPHIC FOR END OF TRANSMISSION BLOCK;;;; +2418;SYMBOL FOR CANCEL;So;0;ON;;;;;N;GRAPHIC FOR CANCEL;;;; +2419;SYMBOL FOR END OF MEDIUM;So;0;ON;;;;;N;GRAPHIC FOR END OF MEDIUM;;;; +241A;SYMBOL FOR SUBSTITUTE;So;0;ON;;;;;N;GRAPHIC FOR SUBSTITUTE;;;; +241B;SYMBOL FOR ESCAPE;So;0;ON;;;;;N;GRAPHIC FOR ESCAPE;;;; +241C;SYMBOL FOR FILE SEPARATOR;So;0;ON;;;;;N;GRAPHIC FOR FILE SEPARATOR;;;; +241D;SYMBOL FOR GROUP SEPARATOR;So;0;ON;;;;;N;GRAPHIC FOR GROUP SEPARATOR;;;; +241E;SYMBOL FOR RECORD SEPARATOR;So;0;ON;;;;;N;GRAPHIC FOR RECORD SEPARATOR;;;; +241F;SYMBOL FOR UNIT SEPARATOR;So;0;ON;;;;;N;GRAPHIC FOR UNIT SEPARATOR;;;; +2420;SYMBOL FOR SPACE;So;0;ON;;;;;N;GRAPHIC FOR SPACE;;;; +2421;SYMBOL FOR DELETE;So;0;ON;;;;;N;GRAPHIC FOR DELETE;;;; +2422;BLANK SYMBOL;So;0;ON;;;;;N;BLANK;;;; +2423;OPEN BOX;So;0;ON;;;;;N;;;;; +2424;SYMBOL FOR NEWLINE;So;0;ON;;;;;N;GRAPHIC FOR NEWLINE;;;; +2425;SYMBOL FOR DELETE FORM TWO;So;0;ON;;;;;N;;;;; +2426;SYMBOL FOR SUBSTITUTE FORM TWO;So;0;ON;;;;;N;;;;; +2440;OCR HOOK;So;0;ON;;;;;N;;;;; +2441;OCR CHAIR;So;0;ON;;;;;N;;;;; +2442;OCR FORK;So;0;ON;;;;;N;;;;; +2443;OCR INVERTED FORK;So;0;ON;;;;;N;;;;; +2444;OCR BELT BUCKLE;So;0;ON;;;;;N;;;;; +2445;OCR BOW TIE;So;0;ON;;;;;N;;;;; +2446;OCR BRANCH BANK IDENTIFICATION;So;0;ON;;;;;N;;;;; +2447;OCR AMOUNT OF CHECK;So;0;ON;;;;;N;;;;; +2448;OCR DASH;So;0;ON;;;;;N;;;;; +2449;OCR CUSTOMER ACCOUNT NUMBER;So;0;ON;;;;;N;;;;; +244A;OCR DOUBLE BACKSLASH;So;0;ON;;;;;N;;;;; +2460;CIRCLED DIGIT ONE;No;0;ON;<circle> 0031;;1;1;N;;;;; +2461;CIRCLED DIGIT TWO;No;0;ON;<circle> 0032;;2;2;N;;;;; +2462;CIRCLED DIGIT THREE;No;0;ON;<circle> 0033;;3;3;N;;;;; +2463;CIRCLED DIGIT FOUR;No;0;ON;<circle> 0034;;4;4;N;;;;; +2464;CIRCLED DIGIT FIVE;No;0;ON;<circle> 0035;;5;5;N;;;;; +2465;CIRCLED DIGIT SIX;No;0;ON;<circle> 0036;;6;6;N;;;;; +2466;CIRCLED DIGIT SEVEN;No;0;ON;<circle> 0037;;7;7;N;;;;; +2467;CIRCLED DIGIT EIGHT;No;0;ON;<circle> 0038;;8;8;N;;;;; +2468;CIRCLED DIGIT NINE;No;0;ON;<circle> 0039;;9;9;N;;;;; +2469;CIRCLED NUMBER TEN;No;0;ON;<circle> 0031 0030;;;10;N;;;;; +246A;CIRCLED NUMBER ELEVEN;No;0;ON;<circle> 0031 0031;;;11;N;;;;; +246B;CIRCLED NUMBER TWELVE;No;0;ON;<circle> 0031 0032;;;12;N;;;;; +246C;CIRCLED NUMBER THIRTEEN;No;0;ON;<circle> 0031 0033;;;13;N;;;;; +246D;CIRCLED NUMBER FOURTEEN;No;0;ON;<circle> 0031 0034;;;14;N;;;;; +246E;CIRCLED NUMBER FIFTEEN;No;0;ON;<circle> 0031 0035;;;15;N;;;;; +246F;CIRCLED NUMBER SIXTEEN;No;0;ON;<circle> 0031 0036;;;16;N;;;;; +2470;CIRCLED NUMBER SEVENTEEN;No;0;ON;<circle> 0031 0037;;;17;N;;;;; +2471;CIRCLED NUMBER EIGHTEEN;No;0;ON;<circle> 0031 0038;;;18;N;;;;; +2472;CIRCLED NUMBER NINETEEN;No;0;ON;<circle> 0031 0039;;;19;N;;;;; +2473;CIRCLED NUMBER TWENTY;No;0;ON;<circle> 0032 0030;;;20;N;;;;; +2474;PARENTHESIZED DIGIT ONE;No;0;ON;<compat> 0028 0031 0029;;1;1;N;;;;; +2475;PARENTHESIZED DIGIT TWO;No;0;ON;<compat> 0028 0032 0029;;2;2;N;;;;; +2476;PARENTHESIZED DIGIT THREE;No;0;ON;<compat> 0028 0033 0029;;3;3;N;;;;; +2477;PARENTHESIZED DIGIT FOUR;No;0;ON;<compat> 0028 0034 0029;;4;4;N;;;;; +2478;PARENTHESIZED DIGIT FIVE;No;0;ON;<compat> 0028 0035 0029;;5;5;N;;;;; +2479;PARENTHESIZED DIGIT SIX;No;0;ON;<compat> 0028 0036 0029;;6;6;N;;;;; +247A;PARENTHESIZED DIGIT SEVEN;No;0;ON;<compat> 0028 0037 0029;;7;7;N;;;;; +247B;PARENTHESIZED DIGIT EIGHT;No;0;ON;<compat> 0028 0038 0029;;8;8;N;;;;; +247C;PARENTHESIZED DIGIT NINE;No;0;ON;<compat> 0028 0039 0029;;9;9;N;;;;; +247D;PARENTHESIZED NUMBER TEN;No;0;ON;<compat> 0028 0031 0030 0029;;;10;N;;;;; +247E;PARENTHESIZED NUMBER ELEVEN;No;0;ON;<compat> 0028 0031 0031 0029;;;11;N;;;;; +247F;PARENTHESIZED NUMBER TWELVE;No;0;ON;<compat> 0028 0031 0032 0029;;;12;N;;;;; +2480;PARENTHESIZED NUMBER THIRTEEN;No;0;ON;<compat> 0028 0031 0033 0029;;;13;N;;;;; +2481;PARENTHESIZED NUMBER FOURTEEN;No;0;ON;<compat> 0028 0031 0034 0029;;;14;N;;;;; +2482;PARENTHESIZED NUMBER FIFTEEN;No;0;ON;<compat> 0028 0031 0035 0029;;;15;N;;;;; +2483;PARENTHESIZED NUMBER SIXTEEN;No;0;ON;<compat> 0028 0031 0036 0029;;;16;N;;;;; +2484;PARENTHESIZED NUMBER SEVENTEEN;No;0;ON;<compat> 0028 0031 0037 0029;;;17;N;;;;; +2485;PARENTHESIZED NUMBER EIGHTEEN;No;0;ON;<compat> 0028 0031 0038 0029;;;18;N;;;;; +2486;PARENTHESIZED NUMBER NINETEEN;No;0;ON;<compat> 0028 0031 0039 0029;;;19;N;;;;; +2487;PARENTHESIZED NUMBER TWENTY;No;0;ON;<compat> 0028 0032 0030 0029;;;20;N;;;;; +2488;DIGIT ONE FULL STOP;No;0;EN;<compat> 0031 002E;;1;1;N;DIGIT ONE PERIOD;;;; +2489;DIGIT TWO FULL STOP;No;0;EN;<compat> 0032 002E;;2;2;N;DIGIT TWO PERIOD;;;; +248A;DIGIT THREE FULL STOP;No;0;EN;<compat> 0033 002E;;3;3;N;DIGIT THREE PERIOD;;;; +248B;DIGIT FOUR FULL STOP;No;0;EN;<compat> 0034 002E;;4;4;N;DIGIT FOUR PERIOD;;;; +248C;DIGIT FIVE FULL STOP;No;0;EN;<compat> 0035 002E;;5;5;N;DIGIT FIVE PERIOD;;;; +248D;DIGIT SIX FULL STOP;No;0;EN;<compat> 0036 002E;;6;6;N;DIGIT SIX PERIOD;;;; +248E;DIGIT SEVEN FULL STOP;No;0;EN;<compat> 0037 002E;;7;7;N;DIGIT SEVEN PERIOD;;;; +248F;DIGIT EIGHT FULL STOP;No;0;EN;<compat> 0038 002E;;8;8;N;DIGIT EIGHT PERIOD;;;; +2490;DIGIT NINE FULL STOP;No;0;EN;<compat> 0039 002E;;9;9;N;DIGIT NINE PERIOD;;;; +2491;NUMBER TEN FULL STOP;No;0;EN;<compat> 0031 0030 002E;;;10;N;NUMBER TEN PERIOD;;;; +2492;NUMBER ELEVEN FULL STOP;No;0;EN;<compat> 0031 0031 002E;;;11;N;NUMBER ELEVEN PERIOD;;;; +2493;NUMBER TWELVE FULL STOP;No;0;EN;<compat> 0031 0032 002E;;;12;N;NUMBER TWELVE PERIOD;;;; +2494;NUMBER THIRTEEN FULL STOP;No;0;EN;<compat> 0031 0033 002E;;;13;N;NUMBER THIRTEEN PERIOD;;;; +2495;NUMBER FOURTEEN FULL STOP;No;0;EN;<compat> 0031 0034 002E;;;14;N;NUMBER FOURTEEN PERIOD;;;; +2496;NUMBER FIFTEEN FULL STOP;No;0;EN;<compat> 0031 0035 002E;;;15;N;NUMBER FIFTEEN PERIOD;;;; +2497;NUMBER SIXTEEN FULL STOP;No;0;EN;<compat> 0031 0036 002E;;;16;N;NUMBER SIXTEEN PERIOD;;;; +2498;NUMBER SEVENTEEN FULL STOP;No;0;EN;<compat> 0031 0037 002E;;;17;N;NUMBER SEVENTEEN PERIOD;;;; +2499;NUMBER EIGHTEEN FULL STOP;No;0;EN;<compat> 0031 0038 002E;;;18;N;NUMBER EIGHTEEN PERIOD;;;; +249A;NUMBER NINETEEN FULL STOP;No;0;EN;<compat> 0031 0039 002E;;;19;N;NUMBER NINETEEN PERIOD;;;; +249B;NUMBER TWENTY FULL STOP;No;0;EN;<compat> 0032 0030 002E;;;20;N;NUMBER TWENTY PERIOD;;;; +249C;PARENTHESIZED LATIN SMALL LETTER A;So;0;L;<compat> 0028 0061 0029;;;;N;;;;; +249D;PARENTHESIZED LATIN SMALL LETTER B;So;0;L;<compat> 0028 0062 0029;;;;N;;;;; +249E;PARENTHESIZED LATIN SMALL LETTER C;So;0;L;<compat> 0028 0063 0029;;;;N;;;;; +249F;PARENTHESIZED LATIN SMALL LETTER D;So;0;L;<compat> 0028 0064 0029;;;;N;;;;; +24A0;PARENTHESIZED LATIN SMALL LETTER E;So;0;L;<compat> 0028 0065 0029;;;;N;;;;; +24A1;PARENTHESIZED LATIN SMALL LETTER F;So;0;L;<compat> 0028 0066 0029;;;;N;;;;; +24A2;PARENTHESIZED LATIN SMALL LETTER G;So;0;L;<compat> 0028 0067 0029;;;;N;;;;; +24A3;PARENTHESIZED LATIN SMALL LETTER H;So;0;L;<compat> 0028 0068 0029;;;;N;;;;; +24A4;PARENTHESIZED LATIN SMALL LETTER I;So;0;L;<compat> 0028 0069 0029;;;;N;;;;; +24A5;PARENTHESIZED LATIN SMALL LETTER J;So;0;L;<compat> 0028 006A 0029;;;;N;;;;; +24A6;PARENTHESIZED LATIN SMALL LETTER K;So;0;L;<compat> 0028 006B 0029;;;;N;;;;; +24A7;PARENTHESIZED LATIN SMALL LETTER L;So;0;L;<compat> 0028 006C 0029;;;;N;;;;; +24A8;PARENTHESIZED LATIN SMALL LETTER M;So;0;L;<compat> 0028 006D 0029;;;;N;;;;; +24A9;PARENTHESIZED LATIN SMALL LETTER N;So;0;L;<compat> 0028 006E 0029;;;;N;;;;; +24AA;PARENTHESIZED LATIN SMALL LETTER O;So;0;L;<compat> 0028 006F 0029;;;;N;;;;; +24AB;PARENTHESIZED LATIN SMALL LETTER P;So;0;L;<compat> 0028 0070 0029;;;;N;;;;; +24AC;PARENTHESIZED LATIN SMALL LETTER Q;So;0;L;<compat> 0028 0071 0029;;;;N;;;;; +24AD;PARENTHESIZED LATIN SMALL LETTER R;So;0;L;<compat> 0028 0072 0029;;;;N;;;;; +24AE;PARENTHESIZED LATIN SMALL LETTER S;So;0;L;<compat> 0028 0073 0029;;;;N;;;;; +24AF;PARENTHESIZED LATIN SMALL LETTER T;So;0;L;<compat> 0028 0074 0029;;;;N;;;;; +24B0;PARENTHESIZED LATIN SMALL LETTER U;So;0;L;<compat> 0028 0075 0029;;;;N;;;;; +24B1;PARENTHESIZED LATIN SMALL LETTER V;So;0;L;<compat> 0028 0076 0029;;;;N;;;;; +24B2;PARENTHESIZED LATIN SMALL LETTER W;So;0;L;<compat> 0028 0077 0029;;;;N;;;;; +24B3;PARENTHESIZED LATIN SMALL LETTER X;So;0;L;<compat> 0028 0078 0029;;;;N;;;;; +24B4;PARENTHESIZED LATIN SMALL LETTER Y;So;0;L;<compat> 0028 0079 0029;;;;N;;;;; +24B5;PARENTHESIZED LATIN SMALL LETTER Z;So;0;L;<compat> 0028 007A 0029;;;;N;;;;; +24B6;CIRCLED LATIN CAPITAL LETTER A;So;0;L;<circle> 0041;;;;N;;;;24D0; +24B7;CIRCLED LATIN CAPITAL LETTER B;So;0;L;<circle> 0042;;;;N;;;;24D1; +24B8;CIRCLED LATIN CAPITAL LETTER C;So;0;L;<circle> 0043;;;;N;;;;24D2; +24B9;CIRCLED LATIN CAPITAL LETTER D;So;0;L;<circle> 0044;;;;N;;;;24D3; +24BA;CIRCLED LATIN CAPITAL LETTER E;So;0;L;<circle> 0045;;;;N;;;;24D4; +24BB;CIRCLED LATIN CAPITAL LETTER F;So;0;L;<circle> 0046;;;;N;;;;24D5; +24BC;CIRCLED LATIN CAPITAL LETTER G;So;0;L;<circle> 0047;;;;N;;;;24D6; +24BD;CIRCLED LATIN CAPITAL LETTER H;So;0;L;<circle> 0048;;;;N;;;;24D7; +24BE;CIRCLED LATIN CAPITAL LETTER I;So;0;L;<circle> 0049;;;;N;;;;24D8; +24BF;CIRCLED LATIN CAPITAL LETTER J;So;0;L;<circle> 004A;;;;N;;;;24D9; +24C0;CIRCLED LATIN CAPITAL LETTER K;So;0;L;<circle> 004B;;;;N;;;;24DA; +24C1;CIRCLED LATIN CAPITAL LETTER L;So;0;L;<circle> 004C;;;;N;;;;24DB; +24C2;CIRCLED LATIN CAPITAL LETTER M;So;0;L;<circle> 004D;;;;N;;;;24DC; +24C3;CIRCLED LATIN CAPITAL LETTER N;So;0;L;<circle> 004E;;;;N;;;;24DD; +24C4;CIRCLED LATIN CAPITAL LETTER O;So;0;L;<circle> 004F;;;;N;;;;24DE; +24C5;CIRCLED LATIN CAPITAL LETTER P;So;0;L;<circle> 0050;;;;N;;;;24DF; +24C6;CIRCLED LATIN CAPITAL LETTER Q;So;0;L;<circle> 0051;;;;N;;;;24E0; +24C7;CIRCLED LATIN CAPITAL LETTER R;So;0;L;<circle> 0052;;;;N;;;;24E1; +24C8;CIRCLED LATIN CAPITAL LETTER S;So;0;L;<circle> 0053;;;;N;;;;24E2; +24C9;CIRCLED LATIN CAPITAL LETTER T;So;0;L;<circle> 0054;;;;N;;;;24E3; +24CA;CIRCLED LATIN CAPITAL LETTER U;So;0;L;<circle> 0055;;;;N;;;;24E4; +24CB;CIRCLED LATIN CAPITAL LETTER V;So;0;L;<circle> 0056;;;;N;;;;24E5; +24CC;CIRCLED LATIN CAPITAL LETTER W;So;0;L;<circle> 0057;;;;N;;;;24E6; +24CD;CIRCLED LATIN CAPITAL LETTER X;So;0;L;<circle> 0058;;;;N;;;;24E7; +24CE;CIRCLED LATIN CAPITAL LETTER Y;So;0;L;<circle> 0059;;;;N;;;;24E8; +24CF;CIRCLED LATIN CAPITAL LETTER Z;So;0;L;<circle> 005A;;;;N;;;;24E9; +24D0;CIRCLED LATIN SMALL LETTER A;So;0;L;<circle> 0061;;;;N;;;24B6;;24B6 +24D1;CIRCLED LATIN SMALL LETTER B;So;0;L;<circle> 0062;;;;N;;;24B7;;24B7 +24D2;CIRCLED LATIN SMALL LETTER C;So;0;L;<circle> 0063;;;;N;;;24B8;;24B8 +24D3;CIRCLED LATIN SMALL LETTER D;So;0;L;<circle> 0064;;;;N;;;24B9;;24B9 +24D4;CIRCLED LATIN SMALL LETTER E;So;0;L;<circle> 0065;;;;N;;;24BA;;24BA +24D5;CIRCLED LATIN SMALL LETTER F;So;0;L;<circle> 0066;;;;N;;;24BB;;24BB +24D6;CIRCLED LATIN SMALL LETTER G;So;0;L;<circle> 0067;;;;N;;;24BC;;24BC +24D7;CIRCLED LATIN SMALL LETTER H;So;0;L;<circle> 0068;;;;N;;;24BD;;24BD +24D8;CIRCLED LATIN SMALL LETTER I;So;0;L;<circle> 0069;;;;N;;;24BE;;24BE +24D9;CIRCLED LATIN SMALL LETTER J;So;0;L;<circle> 006A;;;;N;;;24BF;;24BF +24DA;CIRCLED LATIN SMALL LETTER K;So;0;L;<circle> 006B;;;;N;;;24C0;;24C0 +24DB;CIRCLED LATIN SMALL LETTER L;So;0;L;<circle> 006C;;;;N;;;24C1;;24C1 +24DC;CIRCLED LATIN SMALL LETTER M;So;0;L;<circle> 006D;;;;N;;;24C2;;24C2 +24DD;CIRCLED LATIN SMALL LETTER N;So;0;L;<circle> 006E;;;;N;;;24C3;;24C3 +24DE;CIRCLED LATIN SMALL LETTER O;So;0;L;<circle> 006F;;;;N;;;24C4;;24C4 +24DF;CIRCLED LATIN SMALL LETTER P;So;0;L;<circle> 0070;;;;N;;;24C5;;24C5 +24E0;CIRCLED LATIN SMALL LETTER Q;So;0;L;<circle> 0071;;;;N;;;24C6;;24C6 +24E1;CIRCLED LATIN SMALL LETTER R;So;0;L;<circle> 0072;;;;N;;;24C7;;24C7 +24E2;CIRCLED LATIN SMALL LETTER S;So;0;L;<circle> 0073;;;;N;;;24C8;;24C8 +24E3;CIRCLED LATIN SMALL LETTER T;So;0;L;<circle> 0074;;;;N;;;24C9;;24C9 +24E4;CIRCLED LATIN SMALL LETTER U;So;0;L;<circle> 0075;;;;N;;;24CA;;24CA +24E5;CIRCLED LATIN SMALL LETTER V;So;0;L;<circle> 0076;;;;N;;;24CB;;24CB +24E6;CIRCLED LATIN SMALL LETTER W;So;0;L;<circle> 0077;;;;N;;;24CC;;24CC +24E7;CIRCLED LATIN SMALL LETTER X;So;0;L;<circle> 0078;;;;N;;;24CD;;24CD +24E8;CIRCLED LATIN SMALL LETTER Y;So;0;L;<circle> 0079;;;;N;;;24CE;;24CE +24E9;CIRCLED LATIN SMALL LETTER Z;So;0;L;<circle> 007A;;;;N;;;24CF;;24CF +24EA;CIRCLED DIGIT ZERO;No;0;ON;<circle> 0030;;0;0;N;;;;; +24EB;NEGATIVE CIRCLED NUMBER ELEVEN;No;0;ON;;;;11;N;;;;; +24EC;NEGATIVE CIRCLED NUMBER TWELVE;No;0;ON;;;;12;N;;;;; +24ED;NEGATIVE CIRCLED NUMBER THIRTEEN;No;0;ON;;;;13;N;;;;; +24EE;NEGATIVE CIRCLED NUMBER FOURTEEN;No;0;ON;;;;14;N;;;;; +24EF;NEGATIVE CIRCLED NUMBER FIFTEEN;No;0;ON;;;;15;N;;;;; +24F0;NEGATIVE CIRCLED NUMBER SIXTEEN;No;0;ON;;;;16;N;;;;; +24F1;NEGATIVE CIRCLED NUMBER SEVENTEEN;No;0;ON;;;;17;N;;;;; +24F2;NEGATIVE CIRCLED NUMBER EIGHTEEN;No;0;ON;;;;18;N;;;;; +24F3;NEGATIVE CIRCLED NUMBER NINETEEN;No;0;ON;;;;19;N;;;;; +24F4;NEGATIVE CIRCLED NUMBER TWENTY;No;0;ON;;;;20;N;;;;; +24F5;DOUBLE CIRCLED DIGIT ONE;No;0;ON;;;1;1;N;;;;; +24F6;DOUBLE CIRCLED DIGIT TWO;No;0;ON;;;2;2;N;;;;; +24F7;DOUBLE CIRCLED DIGIT THREE;No;0;ON;;;3;3;N;;;;; +24F8;DOUBLE CIRCLED DIGIT FOUR;No;0;ON;;;4;4;N;;;;; +24F9;DOUBLE CIRCLED DIGIT FIVE;No;0;ON;;;5;5;N;;;;; +24FA;DOUBLE CIRCLED DIGIT SIX;No;0;ON;;;6;6;N;;;;; +24FB;DOUBLE CIRCLED DIGIT SEVEN;No;0;ON;;;7;7;N;;;;; +24FC;DOUBLE CIRCLED DIGIT EIGHT;No;0;ON;;;8;8;N;;;;; +24FD;DOUBLE CIRCLED DIGIT NINE;No;0;ON;;;9;9;N;;;;; +24FE;DOUBLE CIRCLED NUMBER TEN;No;0;ON;;;;10;N;;;;; +24FF;NEGATIVE CIRCLED DIGIT ZERO;No;0;ON;;;0;0;N;;;;; +2500;BOX DRAWINGS LIGHT HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT HORIZONTAL;;;; +2501;BOX DRAWINGS HEAVY HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY HORIZONTAL;;;; +2502;BOX DRAWINGS LIGHT VERTICAL;So;0;ON;;;;;N;FORMS LIGHT VERTICAL;;;; +2503;BOX DRAWINGS HEAVY VERTICAL;So;0;ON;;;;;N;FORMS HEAVY VERTICAL;;;; +2504;BOX DRAWINGS LIGHT TRIPLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT TRIPLE DASH HORIZONTAL;;;; +2505;BOX DRAWINGS HEAVY TRIPLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY TRIPLE DASH HORIZONTAL;;;; +2506;BOX DRAWINGS LIGHT TRIPLE DASH VERTICAL;So;0;ON;;;;;N;FORMS LIGHT TRIPLE DASH VERTICAL;;;; +2507;BOX DRAWINGS HEAVY TRIPLE DASH VERTICAL;So;0;ON;;;;;N;FORMS HEAVY TRIPLE DASH VERTICAL;;;; +2508;BOX DRAWINGS LIGHT QUADRUPLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT QUADRUPLE DASH HORIZONTAL;;;; +2509;BOX DRAWINGS HEAVY QUADRUPLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY QUADRUPLE DASH HORIZONTAL;;;; +250A;BOX DRAWINGS LIGHT QUADRUPLE DASH VERTICAL;So;0;ON;;;;;N;FORMS LIGHT QUADRUPLE DASH VERTICAL;;;; +250B;BOX DRAWINGS HEAVY QUADRUPLE DASH VERTICAL;So;0;ON;;;;;N;FORMS HEAVY QUADRUPLE DASH VERTICAL;;;; +250C;BOX DRAWINGS LIGHT DOWN AND RIGHT;So;0;ON;;;;;N;FORMS LIGHT DOWN AND RIGHT;;;; +250D;BOX DRAWINGS DOWN LIGHT AND RIGHT HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND RIGHT HEAVY;;;; +250E;BOX DRAWINGS DOWN HEAVY AND RIGHT LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND RIGHT LIGHT;;;; +250F;BOX DRAWINGS HEAVY DOWN AND RIGHT;So;0;ON;;;;;N;FORMS HEAVY DOWN AND RIGHT;;;; +2510;BOX DRAWINGS LIGHT DOWN AND LEFT;So;0;ON;;;;;N;FORMS LIGHT DOWN AND LEFT;;;; +2511;BOX DRAWINGS DOWN LIGHT AND LEFT HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND LEFT HEAVY;;;; +2512;BOX DRAWINGS DOWN HEAVY AND LEFT LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND LEFT LIGHT;;;; +2513;BOX DRAWINGS HEAVY DOWN AND LEFT;So;0;ON;;;;;N;FORMS HEAVY DOWN AND LEFT;;;; +2514;BOX DRAWINGS LIGHT UP AND RIGHT;So;0;ON;;;;;N;FORMS LIGHT UP AND RIGHT;;;; +2515;BOX DRAWINGS UP LIGHT AND RIGHT HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND RIGHT HEAVY;;;; +2516;BOX DRAWINGS UP HEAVY AND RIGHT LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND RIGHT LIGHT;;;; +2517;BOX DRAWINGS HEAVY UP AND RIGHT;So;0;ON;;;;;N;FORMS HEAVY UP AND RIGHT;;;; +2518;BOX DRAWINGS LIGHT UP AND LEFT;So;0;ON;;;;;N;FORMS LIGHT UP AND LEFT;;;; +2519;BOX DRAWINGS UP LIGHT AND LEFT HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND LEFT HEAVY;;;; +251A;BOX DRAWINGS UP HEAVY AND LEFT LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND LEFT LIGHT;;;; +251B;BOX DRAWINGS HEAVY UP AND LEFT;So;0;ON;;;;;N;FORMS HEAVY UP AND LEFT;;;; +251C;BOX DRAWINGS LIGHT VERTICAL AND RIGHT;So;0;ON;;;;;N;FORMS LIGHT VERTICAL AND RIGHT;;;; +251D;BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY;So;0;ON;;;;;N;FORMS VERTICAL LIGHT AND RIGHT HEAVY;;;; +251E;BOX DRAWINGS UP HEAVY AND RIGHT DOWN LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND RIGHT DOWN LIGHT;;;; +251F;BOX DRAWINGS DOWN HEAVY AND RIGHT UP LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND RIGHT UP LIGHT;;;; +2520;BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT;So;0;ON;;;;;N;FORMS VERTICAL HEAVY AND RIGHT LIGHT;;;; +2521;BOX DRAWINGS DOWN LIGHT AND RIGHT UP HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND RIGHT UP HEAVY;;;; +2522;BOX DRAWINGS UP LIGHT AND RIGHT DOWN HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND RIGHT DOWN HEAVY;;;; +2523;BOX DRAWINGS HEAVY VERTICAL AND RIGHT;So;0;ON;;;;;N;FORMS HEAVY VERTICAL AND RIGHT;;;; +2524;BOX DRAWINGS LIGHT VERTICAL AND LEFT;So;0;ON;;;;;N;FORMS LIGHT VERTICAL AND LEFT;;;; +2525;BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY;So;0;ON;;;;;N;FORMS VERTICAL LIGHT AND LEFT HEAVY;;;; +2526;BOX DRAWINGS UP HEAVY AND LEFT DOWN LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND LEFT DOWN LIGHT;;;; +2527;BOX DRAWINGS DOWN HEAVY AND LEFT UP LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND LEFT UP LIGHT;;;; +2528;BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT;So;0;ON;;;;;N;FORMS VERTICAL HEAVY AND LEFT LIGHT;;;; +2529;BOX DRAWINGS DOWN LIGHT AND LEFT UP HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND LEFT UP HEAVY;;;; +252A;BOX DRAWINGS UP LIGHT AND LEFT DOWN HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND LEFT DOWN HEAVY;;;; +252B;BOX DRAWINGS HEAVY VERTICAL AND LEFT;So;0;ON;;;;;N;FORMS HEAVY VERTICAL AND LEFT;;;; +252C;BOX DRAWINGS LIGHT DOWN AND HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT DOWN AND HORIZONTAL;;;; +252D;BOX DRAWINGS LEFT HEAVY AND RIGHT DOWN LIGHT;So;0;ON;;;;;N;FORMS LEFT HEAVY AND RIGHT DOWN LIGHT;;;; +252E;BOX DRAWINGS RIGHT HEAVY AND LEFT DOWN LIGHT;So;0;ON;;;;;N;FORMS RIGHT HEAVY AND LEFT DOWN LIGHT;;;; +252F;BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND HORIZONTAL HEAVY;;;; +2530;BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND HORIZONTAL LIGHT;;;; +2531;BOX DRAWINGS RIGHT LIGHT AND LEFT DOWN HEAVY;So;0;ON;;;;;N;FORMS RIGHT LIGHT AND LEFT DOWN HEAVY;;;; +2532;BOX DRAWINGS LEFT LIGHT AND RIGHT DOWN HEAVY;So;0;ON;;;;;N;FORMS LEFT LIGHT AND RIGHT DOWN HEAVY;;;; +2533;BOX DRAWINGS HEAVY DOWN AND HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY DOWN AND HORIZONTAL;;;; +2534;BOX DRAWINGS LIGHT UP AND HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT UP AND HORIZONTAL;;;; +2535;BOX DRAWINGS LEFT HEAVY AND RIGHT UP LIGHT;So;0;ON;;;;;N;FORMS LEFT HEAVY AND RIGHT UP LIGHT;;;; +2536;BOX DRAWINGS RIGHT HEAVY AND LEFT UP LIGHT;So;0;ON;;;;;N;FORMS RIGHT HEAVY AND LEFT UP LIGHT;;;; +2537;BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND HORIZONTAL HEAVY;;;; +2538;BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND HORIZONTAL LIGHT;;;; +2539;BOX DRAWINGS RIGHT LIGHT AND LEFT UP HEAVY;So;0;ON;;;;;N;FORMS RIGHT LIGHT AND LEFT UP HEAVY;;;; +253A;BOX DRAWINGS LEFT LIGHT AND RIGHT UP HEAVY;So;0;ON;;;;;N;FORMS LEFT LIGHT AND RIGHT UP HEAVY;;;; +253B;BOX DRAWINGS HEAVY UP AND HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY UP AND HORIZONTAL;;;; +253C;BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT VERTICAL AND HORIZONTAL;;;; +253D;BOX DRAWINGS LEFT HEAVY AND RIGHT VERTICAL LIGHT;So;0;ON;;;;;N;FORMS LEFT HEAVY AND RIGHT VERTICAL LIGHT;;;; +253E;BOX DRAWINGS RIGHT HEAVY AND LEFT VERTICAL LIGHT;So;0;ON;;;;;N;FORMS RIGHT HEAVY AND LEFT VERTICAL LIGHT;;;; +253F;BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY;So;0;ON;;;;;N;FORMS VERTICAL LIGHT AND HORIZONTAL HEAVY;;;; +2540;BOX DRAWINGS UP HEAVY AND DOWN HORIZONTAL LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND DOWN HORIZONTAL LIGHT;;;; +2541;BOX DRAWINGS DOWN HEAVY AND UP HORIZONTAL LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND UP HORIZONTAL LIGHT;;;; +2542;BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT;So;0;ON;;;;;N;FORMS VERTICAL HEAVY AND HORIZONTAL LIGHT;;;; +2543;BOX DRAWINGS LEFT UP HEAVY AND RIGHT DOWN LIGHT;So;0;ON;;;;;N;FORMS LEFT UP HEAVY AND RIGHT DOWN LIGHT;;;; +2544;BOX DRAWINGS RIGHT UP HEAVY AND LEFT DOWN LIGHT;So;0;ON;;;;;N;FORMS RIGHT UP HEAVY AND LEFT DOWN LIGHT;;;; +2545;BOX DRAWINGS LEFT DOWN HEAVY AND RIGHT UP LIGHT;So;0;ON;;;;;N;FORMS LEFT DOWN HEAVY AND RIGHT UP LIGHT;;;; +2546;BOX DRAWINGS RIGHT DOWN HEAVY AND LEFT UP LIGHT;So;0;ON;;;;;N;FORMS RIGHT DOWN HEAVY AND LEFT UP LIGHT;;;; +2547;BOX DRAWINGS DOWN LIGHT AND UP HORIZONTAL HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND UP HORIZONTAL HEAVY;;;; +2548;BOX DRAWINGS UP LIGHT AND DOWN HORIZONTAL HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND DOWN HORIZONTAL HEAVY;;;; +2549;BOX DRAWINGS RIGHT LIGHT AND LEFT VERTICAL HEAVY;So;0;ON;;;;;N;FORMS RIGHT LIGHT AND LEFT VERTICAL HEAVY;;;; +254A;BOX DRAWINGS LEFT LIGHT AND RIGHT VERTICAL HEAVY;So;0;ON;;;;;N;FORMS LEFT LIGHT AND RIGHT VERTICAL HEAVY;;;; +254B;BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY VERTICAL AND HORIZONTAL;;;; +254C;BOX DRAWINGS LIGHT DOUBLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT DOUBLE DASH HORIZONTAL;;;; +254D;BOX DRAWINGS HEAVY DOUBLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY DOUBLE DASH HORIZONTAL;;;; +254E;BOX DRAWINGS LIGHT DOUBLE DASH VERTICAL;So;0;ON;;;;;N;FORMS LIGHT DOUBLE DASH VERTICAL;;;; +254F;BOX DRAWINGS HEAVY DOUBLE DASH VERTICAL;So;0;ON;;;;;N;FORMS HEAVY DOUBLE DASH VERTICAL;;;; +2550;BOX DRAWINGS DOUBLE HORIZONTAL;So;0;ON;;;;;N;FORMS DOUBLE HORIZONTAL;;;; +2551;BOX DRAWINGS DOUBLE VERTICAL;So;0;ON;;;;;N;FORMS DOUBLE VERTICAL;;;; +2552;BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE;So;0;ON;;;;;N;FORMS DOWN SINGLE AND RIGHT DOUBLE;;;; +2553;BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE;So;0;ON;;;;;N;FORMS DOWN DOUBLE AND RIGHT SINGLE;;;; +2554;BOX DRAWINGS DOUBLE DOWN AND RIGHT;So;0;ON;;;;;N;FORMS DOUBLE DOWN AND RIGHT;;;; +2555;BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE;So;0;ON;;;;;N;FORMS DOWN SINGLE AND LEFT DOUBLE;;;; +2556;BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE;So;0;ON;;;;;N;FORMS DOWN DOUBLE AND LEFT SINGLE;;;; +2557;BOX DRAWINGS DOUBLE DOWN AND LEFT;So;0;ON;;;;;N;FORMS DOUBLE DOWN AND LEFT;;;; +2558;BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE;So;0;ON;;;;;N;FORMS UP SINGLE AND RIGHT DOUBLE;;;; +2559;BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE;So;0;ON;;;;;N;FORMS UP DOUBLE AND RIGHT SINGLE;;;; +255A;BOX DRAWINGS DOUBLE UP AND RIGHT;So;0;ON;;;;;N;FORMS DOUBLE UP AND RIGHT;;;; +255B;BOX DRAWINGS UP SINGLE AND LEFT DOUBLE;So;0;ON;;;;;N;FORMS UP SINGLE AND LEFT DOUBLE;;;; +255C;BOX DRAWINGS UP DOUBLE AND LEFT SINGLE;So;0;ON;;;;;N;FORMS UP DOUBLE AND LEFT SINGLE;;;; +255D;BOX DRAWINGS DOUBLE UP AND LEFT;So;0;ON;;;;;N;FORMS DOUBLE UP AND LEFT;;;; +255E;BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE;So;0;ON;;;;;N;FORMS VERTICAL SINGLE AND RIGHT DOUBLE;;;; +255F;BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE;So;0;ON;;;;;N;FORMS VERTICAL DOUBLE AND RIGHT SINGLE;;;; +2560;BOX DRAWINGS DOUBLE VERTICAL AND RIGHT;So;0;ON;;;;;N;FORMS DOUBLE VERTICAL AND RIGHT;;;; +2561;BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE;So;0;ON;;;;;N;FORMS VERTICAL SINGLE AND LEFT DOUBLE;;;; +2562;BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE;So;0;ON;;;;;N;FORMS VERTICAL DOUBLE AND LEFT SINGLE;;;; +2563;BOX DRAWINGS DOUBLE VERTICAL AND LEFT;So;0;ON;;;;;N;FORMS DOUBLE VERTICAL AND LEFT;;;; +2564;BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE;So;0;ON;;;;;N;FORMS DOWN SINGLE AND HORIZONTAL DOUBLE;;;; +2565;BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE;So;0;ON;;;;;N;FORMS DOWN DOUBLE AND HORIZONTAL SINGLE;;;; +2566;BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL;So;0;ON;;;;;N;FORMS DOUBLE DOWN AND HORIZONTAL;;;; +2567;BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE;So;0;ON;;;;;N;FORMS UP SINGLE AND HORIZONTAL DOUBLE;;;; +2568;BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE;So;0;ON;;;;;N;FORMS UP DOUBLE AND HORIZONTAL SINGLE;;;; +2569;BOX DRAWINGS DOUBLE UP AND HORIZONTAL;So;0;ON;;;;;N;FORMS DOUBLE UP AND HORIZONTAL;;;; +256A;BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE;So;0;ON;;;;;N;FORMS VERTICAL SINGLE AND HORIZONTAL DOUBLE;;;; +256B;BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE;So;0;ON;;;;;N;FORMS VERTICAL DOUBLE AND HORIZONTAL SINGLE;;;; +256C;BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL;So;0;ON;;;;;N;FORMS DOUBLE VERTICAL AND HORIZONTAL;;;; +256D;BOX DRAWINGS LIGHT ARC DOWN AND RIGHT;So;0;ON;;;;;N;FORMS LIGHT ARC DOWN AND RIGHT;;;; +256E;BOX DRAWINGS LIGHT ARC DOWN AND LEFT;So;0;ON;;;;;N;FORMS LIGHT ARC DOWN AND LEFT;;;; +256F;BOX DRAWINGS LIGHT ARC UP AND LEFT;So;0;ON;;;;;N;FORMS LIGHT ARC UP AND LEFT;;;; +2570;BOX DRAWINGS LIGHT ARC UP AND RIGHT;So;0;ON;;;;;N;FORMS LIGHT ARC UP AND RIGHT;;;; +2571;BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT;So;0;ON;;;;;N;FORMS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT;;;; +2572;BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT;So;0;ON;;;;;N;FORMS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT;;;; +2573;BOX DRAWINGS LIGHT DIAGONAL CROSS;So;0;ON;;;;;N;FORMS LIGHT DIAGONAL CROSS;;;; +2574;BOX DRAWINGS LIGHT LEFT;So;0;ON;;;;;N;FORMS LIGHT LEFT;;;; +2575;BOX DRAWINGS LIGHT UP;So;0;ON;;;;;N;FORMS LIGHT UP;;;; +2576;BOX DRAWINGS LIGHT RIGHT;So;0;ON;;;;;N;FORMS LIGHT RIGHT;;;; +2577;BOX DRAWINGS LIGHT DOWN;So;0;ON;;;;;N;FORMS LIGHT DOWN;;;; +2578;BOX DRAWINGS HEAVY LEFT;So;0;ON;;;;;N;FORMS HEAVY LEFT;;;; +2579;BOX DRAWINGS HEAVY UP;So;0;ON;;;;;N;FORMS HEAVY UP;;;; +257A;BOX DRAWINGS HEAVY RIGHT;So;0;ON;;;;;N;FORMS HEAVY RIGHT;;;; +257B;BOX DRAWINGS HEAVY DOWN;So;0;ON;;;;;N;FORMS HEAVY DOWN;;;; +257C;BOX DRAWINGS LIGHT LEFT AND HEAVY RIGHT;So;0;ON;;;;;N;FORMS LIGHT LEFT AND HEAVY RIGHT;;;; +257D;BOX DRAWINGS LIGHT UP AND HEAVY DOWN;So;0;ON;;;;;N;FORMS LIGHT UP AND HEAVY DOWN;;;; +257E;BOX DRAWINGS HEAVY LEFT AND LIGHT RIGHT;So;0;ON;;;;;N;FORMS HEAVY LEFT AND LIGHT RIGHT;;;; +257F;BOX DRAWINGS HEAVY UP AND LIGHT DOWN;So;0;ON;;;;;N;FORMS HEAVY UP AND LIGHT DOWN;;;; +2580;UPPER HALF BLOCK;So;0;ON;;;;;N;;;;; +2581;LOWER ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;; +2582;LOWER ONE QUARTER BLOCK;So;0;ON;;;;;N;;;;; +2583;LOWER THREE EIGHTHS BLOCK;So;0;ON;;;;;N;;;;; +2584;LOWER HALF BLOCK;So;0;ON;;;;;N;;;;; +2585;LOWER FIVE EIGHTHS BLOCK;So;0;ON;;;;;N;;;;; +2586;LOWER THREE QUARTERS BLOCK;So;0;ON;;;;;N;LOWER THREE QUARTER BLOCK;;;; +2587;LOWER SEVEN EIGHTHS BLOCK;So;0;ON;;;;;N;;;;; +2588;FULL BLOCK;So;0;ON;;;;;N;;;;; +2589;LEFT SEVEN EIGHTHS BLOCK;So;0;ON;;;;;N;;;;; +258A;LEFT THREE QUARTERS BLOCK;So;0;ON;;;;;N;LEFT THREE QUARTER BLOCK;;;; +258B;LEFT FIVE EIGHTHS BLOCK;So;0;ON;;;;;N;;;;; +258C;LEFT HALF BLOCK;So;0;ON;;;;;N;;;;; +258D;LEFT THREE EIGHTHS BLOCK;So;0;ON;;;;;N;;;;; +258E;LEFT ONE QUARTER BLOCK;So;0;ON;;;;;N;;;;; +258F;LEFT ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;; +2590;RIGHT HALF BLOCK;So;0;ON;;;;;N;;;;; +2591;LIGHT SHADE;So;0;ON;;;;;N;;;;; +2592;MEDIUM SHADE;So;0;ON;;;;;N;;;;; +2593;DARK SHADE;So;0;ON;;;;;N;;;;; +2594;UPPER ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;; +2595;RIGHT ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;; +2596;QUADRANT LOWER LEFT;So;0;ON;;;;;N;;;;; +2597;QUADRANT LOWER RIGHT;So;0;ON;;;;;N;;;;; +2598;QUADRANT UPPER LEFT;So;0;ON;;;;;N;;;;; +2599;QUADRANT UPPER LEFT AND LOWER LEFT AND LOWER RIGHT;So;0;ON;;;;;N;;;;; +259A;QUADRANT UPPER LEFT AND LOWER RIGHT;So;0;ON;;;;;N;;;;; +259B;QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER LEFT;So;0;ON;;;;;N;;;;; +259C;QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER RIGHT;So;0;ON;;;;;N;;;;; +259D;QUADRANT UPPER RIGHT;So;0;ON;;;;;N;;;;; +259E;QUADRANT UPPER RIGHT AND LOWER LEFT;So;0;ON;;;;;N;;;;; +259F;QUADRANT UPPER RIGHT AND LOWER LEFT AND LOWER RIGHT;So;0;ON;;;;;N;;;;; +25A0;BLACK SQUARE;So;0;ON;;;;;N;;;;; +25A1;WHITE SQUARE;So;0;ON;;;;;N;;;;; +25A2;WHITE SQUARE WITH ROUNDED CORNERS;So;0;ON;;;;;N;;;;; +25A3;WHITE SQUARE CONTAINING BLACK SMALL SQUARE;So;0;ON;;;;;N;;;;; +25A4;SQUARE WITH HORIZONTAL FILL;So;0;ON;;;;;N;;;;; +25A5;SQUARE WITH VERTICAL FILL;So;0;ON;;;;;N;;;;; +25A6;SQUARE WITH ORTHOGONAL CROSSHATCH FILL;So;0;ON;;;;;N;;;;; +25A7;SQUARE WITH UPPER LEFT TO LOWER RIGHT FILL;So;0;ON;;;;;N;;;;; +25A8;SQUARE WITH UPPER RIGHT TO LOWER LEFT FILL;So;0;ON;;;;;N;;;;; +25A9;SQUARE WITH DIAGONAL CROSSHATCH FILL;So;0;ON;;;;;N;;;;; +25AA;BLACK SMALL SQUARE;So;0;ON;;;;;N;;;;; +25AB;WHITE SMALL SQUARE;So;0;ON;;;;;N;;;;; +25AC;BLACK RECTANGLE;So;0;ON;;;;;N;;;;; +25AD;WHITE RECTANGLE;So;0;ON;;;;;N;;;;; +25AE;BLACK VERTICAL RECTANGLE;So;0;ON;;;;;N;;;;; +25AF;WHITE VERTICAL RECTANGLE;So;0;ON;;;;;N;;;;; +25B0;BLACK PARALLELOGRAM;So;0;ON;;;;;N;;;;; +25B1;WHITE PARALLELOGRAM;So;0;ON;;;;;N;;;;; +25B2;BLACK UP-POINTING TRIANGLE;So;0;ON;;;;;N;BLACK UP POINTING TRIANGLE;;;; +25B3;WHITE UP-POINTING TRIANGLE;So;0;ON;;;;;N;WHITE UP POINTING TRIANGLE;;;; +25B4;BLACK UP-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;BLACK UP POINTING SMALL TRIANGLE;;;; +25B5;WHITE UP-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;WHITE UP POINTING SMALL TRIANGLE;;;; +25B6;BLACK RIGHT-POINTING TRIANGLE;So;0;ON;;;;;N;BLACK RIGHT POINTING TRIANGLE;;;; +25B7;WHITE RIGHT-POINTING TRIANGLE;Sm;0;ON;;;;;N;WHITE RIGHT POINTING TRIANGLE;;;; +25B8;BLACK RIGHT-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;BLACK RIGHT POINTING SMALL TRIANGLE;;;; +25B9;WHITE RIGHT-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;WHITE RIGHT POINTING SMALL TRIANGLE;;;; +25BA;BLACK RIGHT-POINTING POINTER;So;0;ON;;;;;N;BLACK RIGHT POINTING POINTER;;;; +25BB;WHITE RIGHT-POINTING POINTER;So;0;ON;;;;;N;WHITE RIGHT POINTING POINTER;;;; +25BC;BLACK DOWN-POINTING TRIANGLE;So;0;ON;;;;;N;BLACK DOWN POINTING TRIANGLE;;;; +25BD;WHITE DOWN-POINTING TRIANGLE;So;0;ON;;;;;N;WHITE DOWN POINTING TRIANGLE;;;; +25BE;BLACK DOWN-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;BLACK DOWN POINTING SMALL TRIANGLE;;;; +25BF;WHITE DOWN-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;WHITE DOWN POINTING SMALL TRIANGLE;;;; +25C0;BLACK LEFT-POINTING TRIANGLE;So;0;ON;;;;;N;BLACK LEFT POINTING TRIANGLE;;;; +25C1;WHITE LEFT-POINTING TRIANGLE;Sm;0;ON;;;;;N;WHITE LEFT POINTING TRIANGLE;;;; +25C2;BLACK LEFT-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;BLACK LEFT POINTING SMALL TRIANGLE;;;; +25C3;WHITE LEFT-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;WHITE LEFT POINTING SMALL TRIANGLE;;;; +25C4;BLACK LEFT-POINTING POINTER;So;0;ON;;;;;N;BLACK LEFT POINTING POINTER;;;; +25C5;WHITE LEFT-POINTING POINTER;So;0;ON;;;;;N;WHITE LEFT POINTING POINTER;;;; +25C6;BLACK DIAMOND;So;0;ON;;;;;N;;;;; +25C7;WHITE DIAMOND;So;0;ON;;;;;N;;;;; +25C8;WHITE DIAMOND CONTAINING BLACK SMALL DIAMOND;So;0;ON;;;;;N;;;;; +25C9;FISHEYE;So;0;ON;;;;;N;;;;; +25CA;LOZENGE;So;0;ON;;;;;N;;;;; +25CB;WHITE CIRCLE;So;0;ON;;;;;N;;;;; +25CC;DOTTED CIRCLE;So;0;ON;;;;;N;;;;; +25CD;CIRCLE WITH VERTICAL FILL;So;0;ON;;;;;N;;;;; +25CE;BULLSEYE;So;0;ON;;;;;N;;;;; +25CF;BLACK CIRCLE;So;0;ON;;;;;N;;;;; +25D0;CIRCLE WITH LEFT HALF BLACK;So;0;ON;;;;;N;;;;; +25D1;CIRCLE WITH RIGHT HALF BLACK;So;0;ON;;;;;N;;;;; +25D2;CIRCLE WITH LOWER HALF BLACK;So;0;ON;;;;;N;;;;; +25D3;CIRCLE WITH UPPER HALF BLACK;So;0;ON;;;;;N;;;;; +25D4;CIRCLE WITH UPPER RIGHT QUADRANT BLACK;So;0;ON;;;;;N;;;;; +25D5;CIRCLE WITH ALL BUT UPPER LEFT QUADRANT BLACK;So;0;ON;;;;;N;;;;; +25D6;LEFT HALF BLACK CIRCLE;So;0;ON;;;;;N;;;;; +25D7;RIGHT HALF BLACK CIRCLE;So;0;ON;;;;;N;;;;; +25D8;INVERSE BULLET;So;0;ON;;;;;N;;;;; +25D9;INVERSE WHITE CIRCLE;So;0;ON;;;;;N;;;;; +25DA;UPPER HALF INVERSE WHITE CIRCLE;So;0;ON;;;;;N;;;;; +25DB;LOWER HALF INVERSE WHITE CIRCLE;So;0;ON;;;;;N;;;;; +25DC;UPPER LEFT QUADRANT CIRCULAR ARC;So;0;ON;;;;;N;;;;; +25DD;UPPER RIGHT QUADRANT CIRCULAR ARC;So;0;ON;;;;;N;;;;; +25DE;LOWER RIGHT QUADRANT CIRCULAR ARC;So;0;ON;;;;;N;;;;; +25DF;LOWER LEFT QUADRANT CIRCULAR ARC;So;0;ON;;;;;N;;;;; +25E0;UPPER HALF CIRCLE;So;0;ON;;;;;N;;;;; +25E1;LOWER HALF CIRCLE;So;0;ON;;;;;N;;;;; +25E2;BLACK LOWER RIGHT TRIANGLE;So;0;ON;;;;;N;;;;; +25E3;BLACK LOWER LEFT TRIANGLE;So;0;ON;;;;;N;;;;; +25E4;BLACK UPPER LEFT TRIANGLE;So;0;ON;;;;;N;;;;; +25E5;BLACK UPPER RIGHT TRIANGLE;So;0;ON;;;;;N;;;;; +25E6;WHITE BULLET;So;0;ON;;;;;N;;;;; +25E7;SQUARE WITH LEFT HALF BLACK;So;0;ON;;;;;N;;;;; +25E8;SQUARE WITH RIGHT HALF BLACK;So;0;ON;;;;;N;;;;; +25E9;SQUARE WITH UPPER LEFT DIAGONAL HALF BLACK;So;0;ON;;;;;N;;;;; +25EA;SQUARE WITH LOWER RIGHT DIAGONAL HALF BLACK;So;0;ON;;;;;N;;;;; +25EB;WHITE SQUARE WITH VERTICAL BISECTING LINE;So;0;ON;;;;;N;;;;; +25EC;WHITE UP-POINTING TRIANGLE WITH DOT;So;0;ON;;;;;N;WHITE UP POINTING TRIANGLE WITH DOT;;;; +25ED;UP-POINTING TRIANGLE WITH LEFT HALF BLACK;So;0;ON;;;;;N;UP POINTING TRIANGLE WITH LEFT HALF BLACK;;;; +25EE;UP-POINTING TRIANGLE WITH RIGHT HALF BLACK;So;0;ON;;;;;N;UP POINTING TRIANGLE WITH RIGHT HALF BLACK;;;; +25EF;LARGE CIRCLE;So;0;ON;;;;;N;;;;; +25F0;WHITE SQUARE WITH UPPER LEFT QUADRANT;So;0;ON;;;;;N;;;;; +25F1;WHITE SQUARE WITH LOWER LEFT QUADRANT;So;0;ON;;;;;N;;;;; +25F2;WHITE SQUARE WITH LOWER RIGHT QUADRANT;So;0;ON;;;;;N;;;;; +25F3;WHITE SQUARE WITH UPPER RIGHT QUADRANT;So;0;ON;;;;;N;;;;; +25F4;WHITE CIRCLE WITH UPPER LEFT QUADRANT;So;0;ON;;;;;N;;;;; +25F5;WHITE CIRCLE WITH LOWER LEFT QUADRANT;So;0;ON;;;;;N;;;;; +25F6;WHITE CIRCLE WITH LOWER RIGHT QUADRANT;So;0;ON;;;;;N;;;;; +25F7;WHITE CIRCLE WITH UPPER RIGHT QUADRANT;So;0;ON;;;;;N;;;;; +25F8;UPPER LEFT TRIANGLE;Sm;0;ON;;;;;N;;;;; +25F9;UPPER RIGHT TRIANGLE;Sm;0;ON;;;;;N;;;;; +25FA;LOWER LEFT TRIANGLE;Sm;0;ON;;;;;N;;;;; +25FB;WHITE MEDIUM SQUARE;Sm;0;ON;;;;;N;;;;; +25FC;BLACK MEDIUM SQUARE;Sm;0;ON;;;;;N;;;;; +25FD;WHITE MEDIUM SMALL SQUARE;Sm;0;ON;;;;;N;;;;; +25FE;BLACK MEDIUM SMALL SQUARE;Sm;0;ON;;;;;N;;;;; +25FF;LOWER RIGHT TRIANGLE;Sm;0;ON;;;;;N;;;;; +2600;BLACK SUN WITH RAYS;So;0;ON;;;;;N;;;;; +2601;CLOUD;So;0;ON;;;;;N;;;;; +2602;UMBRELLA;So;0;ON;;;;;N;;;;; +2603;SNOWMAN;So;0;ON;;;;;N;;;;; +2604;COMET;So;0;ON;;;;;N;;;;; +2605;BLACK STAR;So;0;ON;;;;;N;;;;; +2606;WHITE STAR;So;0;ON;;;;;N;;;;; +2607;LIGHTNING;So;0;ON;;;;;N;;;;; +2608;THUNDERSTORM;So;0;ON;;;;;N;;;;; +2609;SUN;So;0;ON;;;;;N;;;;; +260A;ASCENDING NODE;So;0;ON;;;;;N;;;;; +260B;DESCENDING NODE;So;0;ON;;;;;N;;;;; +260C;CONJUNCTION;So;0;ON;;;;;N;;;;; +260D;OPPOSITION;So;0;ON;;;;;N;;;;; +260E;BLACK TELEPHONE;So;0;ON;;;;;N;;;;; +260F;WHITE TELEPHONE;So;0;ON;;;;;N;;;;; +2610;BALLOT BOX;So;0;ON;;;;;N;;;;; +2611;BALLOT BOX WITH CHECK;So;0;ON;;;;;N;;;;; +2612;BALLOT BOX WITH X;So;0;ON;;;;;N;;;;; +2613;SALTIRE;So;0;ON;;;;;N;;;;; +2614;UMBRELLA WITH RAIN DROPS;So;0;ON;;;;;N;;;;; +2615;HOT BEVERAGE;So;0;ON;;;;;N;;;;; +2616;WHITE SHOGI PIECE;So;0;ON;;;;;N;;;;; +2617;BLACK SHOGI PIECE;So;0;ON;;;;;N;;;;; +2618;SHAMROCK;So;0;ON;;;;;N;;;;; +2619;REVERSED ROTATED FLORAL HEART BULLET;So;0;ON;;;;;N;;;;; +261A;BLACK LEFT POINTING INDEX;So;0;ON;;;;;N;;;;; +261B;BLACK RIGHT POINTING INDEX;So;0;ON;;;;;N;;;;; +261C;WHITE LEFT POINTING INDEX;So;0;ON;;;;;N;;;;; +261D;WHITE UP POINTING INDEX;So;0;ON;;;;;N;;;;; +261E;WHITE RIGHT POINTING INDEX;So;0;ON;;;;;N;;;;; +261F;WHITE DOWN POINTING INDEX;So;0;ON;;;;;N;;;;; +2620;SKULL AND CROSSBONES;So;0;ON;;;;;N;;;;; +2621;CAUTION SIGN;So;0;ON;;;;;N;;;;; +2622;RADIOACTIVE SIGN;So;0;ON;;;;;N;;;;; +2623;BIOHAZARD SIGN;So;0;ON;;;;;N;;;;; +2624;CADUCEUS;So;0;ON;;;;;N;;;;; +2625;ANKH;So;0;ON;;;;;N;;;;; +2626;ORTHODOX CROSS;So;0;ON;;;;;N;;;;; +2627;CHI RHO;So;0;ON;;;;;N;;;;; +2628;CROSS OF LORRAINE;So;0;ON;;;;;N;;;;; +2629;CROSS OF JERUSALEM;So;0;ON;;;;;N;;;;; +262A;STAR AND CRESCENT;So;0;ON;;;;;N;;;;; +262B;FARSI SYMBOL;So;0;ON;;;;;N;SYMBOL OF IRAN;;;; +262C;ADI SHAKTI;So;0;ON;;;;;N;;;;; +262D;HAMMER AND SICKLE;So;0;ON;;;;;N;;;;; +262E;PEACE SYMBOL;So;0;ON;;;;;N;;;;; +262F;YIN YANG;So;0;ON;;;;;N;;;;; +2630;TRIGRAM FOR HEAVEN;So;0;ON;;;;;N;;;;; +2631;TRIGRAM FOR LAKE;So;0;ON;;;;;N;;;;; +2632;TRIGRAM FOR FIRE;So;0;ON;;;;;N;;;;; +2633;TRIGRAM FOR THUNDER;So;0;ON;;;;;N;;;;; +2634;TRIGRAM FOR WIND;So;0;ON;;;;;N;;;;; +2635;TRIGRAM FOR WATER;So;0;ON;;;;;N;;;;; +2636;TRIGRAM FOR MOUNTAIN;So;0;ON;;;;;N;;;;; +2637;TRIGRAM FOR EARTH;So;0;ON;;;;;N;;;;; +2638;WHEEL OF DHARMA;So;0;ON;;;;;N;;;;; +2639;WHITE FROWNING FACE;So;0;ON;;;;;N;;;;; +263A;WHITE SMILING FACE;So;0;ON;;;;;N;;;;; +263B;BLACK SMILING FACE;So;0;ON;;;;;N;;;;; +263C;WHITE SUN WITH RAYS;So;0;ON;;;;;N;;;;; +263D;FIRST QUARTER MOON;So;0;ON;;;;;N;;;;; +263E;LAST QUARTER MOON;So;0;ON;;;;;N;;;;; +263F;MERCURY;So;0;ON;;;;;N;;;;; +2640;FEMALE SIGN;So;0;ON;;;;;N;;;;; +2641;EARTH;So;0;ON;;;;;N;;;;; +2642;MALE SIGN;So;0;ON;;;;;N;;;;; +2643;JUPITER;So;0;ON;;;;;N;;;;; +2644;SATURN;So;0;ON;;;;;N;;;;; +2645;URANUS;So;0;ON;;;;;N;;;;; +2646;NEPTUNE;So;0;ON;;;;;N;;;;; +2647;PLUTO;So;0;ON;;;;;N;;;;; +2648;ARIES;So;0;ON;;;;;N;;;;; +2649;TAURUS;So;0;ON;;;;;N;;;;; +264A;GEMINI;So;0;ON;;;;;N;;;;; +264B;CANCER;So;0;ON;;;;;N;;;;; +264C;LEO;So;0;ON;;;;;N;;;;; +264D;VIRGO;So;0;ON;;;;;N;;;;; +264E;LIBRA;So;0;ON;;;;;N;;;;; +264F;SCORPIUS;So;0;ON;;;;;N;;;;; +2650;SAGITTARIUS;So;0;ON;;;;;N;;;;; +2651;CAPRICORN;So;0;ON;;;;;N;;;;; +2652;AQUARIUS;So;0;ON;;;;;N;;;;; +2653;PISCES;So;0;ON;;;;;N;;;;; +2654;WHITE CHESS KING;So;0;ON;;;;;N;;;;; +2655;WHITE CHESS QUEEN;So;0;ON;;;;;N;;;;; +2656;WHITE CHESS ROOK;So;0;ON;;;;;N;;;;; +2657;WHITE CHESS BISHOP;So;0;ON;;;;;N;;;;; +2658;WHITE CHESS KNIGHT;So;0;ON;;;;;N;;;;; +2659;WHITE CHESS PAWN;So;0;ON;;;;;N;;;;; +265A;BLACK CHESS KING;So;0;ON;;;;;N;;;;; +265B;BLACK CHESS QUEEN;So;0;ON;;;;;N;;;;; +265C;BLACK CHESS ROOK;So;0;ON;;;;;N;;;;; +265D;BLACK CHESS BISHOP;So;0;ON;;;;;N;;;;; +265E;BLACK CHESS KNIGHT;So;0;ON;;;;;N;;;;; +265F;BLACK CHESS PAWN;So;0;ON;;;;;N;;;;; +2660;BLACK SPADE SUIT;So;0;ON;;;;;N;;;;; +2661;WHITE HEART SUIT;So;0;ON;;;;;N;;;;; +2662;WHITE DIAMOND SUIT;So;0;ON;;;;;N;;;;; +2663;BLACK CLUB SUIT;So;0;ON;;;;;N;;;;; +2664;WHITE SPADE SUIT;So;0;ON;;;;;N;;;;; +2665;BLACK HEART SUIT;So;0;ON;;;;;N;;;;; +2666;BLACK DIAMOND SUIT;So;0;ON;;;;;N;;;;; +2667;WHITE CLUB SUIT;So;0;ON;;;;;N;;;;; +2668;HOT SPRINGS;So;0;ON;;;;;N;;;;; +2669;QUARTER NOTE;So;0;ON;;;;;N;;;;; +266A;EIGHTH NOTE;So;0;ON;;;;;N;;;;; +266B;BEAMED EIGHTH NOTES;So;0;ON;;;;;N;BARRED EIGHTH NOTES;;;; +266C;BEAMED SIXTEENTH NOTES;So;0;ON;;;;;N;BARRED SIXTEENTH NOTES;;;; +266D;MUSIC FLAT SIGN;So;0;ON;;;;;N;FLAT;;;; +266E;MUSIC NATURAL SIGN;So;0;ON;;;;;N;NATURAL;;;; +266F;MUSIC SHARP SIGN;Sm;0;ON;;;;;N;SHARP;;;; +2670;WEST SYRIAC CROSS;So;0;ON;;;;;N;;;;; +2671;EAST SYRIAC CROSS;So;0;ON;;;;;N;;;;; +2672;UNIVERSAL RECYCLING SYMBOL;So;0;ON;;;;;N;;;;; +2673;RECYCLING SYMBOL FOR TYPE-1 PLASTICS;So;0;ON;;;;;N;;;;; +2674;RECYCLING SYMBOL FOR TYPE-2 PLASTICS;So;0;ON;;;;;N;;;;; +2675;RECYCLING SYMBOL FOR TYPE-3 PLASTICS;So;0;ON;;;;;N;;;;; +2676;RECYCLING SYMBOL FOR TYPE-4 PLASTICS;So;0;ON;;;;;N;;;;; +2677;RECYCLING SYMBOL FOR TYPE-5 PLASTICS;So;0;ON;;;;;N;;;;; +2678;RECYCLING SYMBOL FOR TYPE-6 PLASTICS;So;0;ON;;;;;N;;;;; +2679;RECYCLING SYMBOL FOR TYPE-7 PLASTICS;So;0;ON;;;;;N;;;;; +267A;RECYCLING SYMBOL FOR GENERIC MATERIALS;So;0;ON;;;;;N;;;;; +267B;BLACK UNIVERSAL RECYCLING SYMBOL;So;0;ON;;;;;N;;;;; +267C;RECYCLED PAPER SYMBOL;So;0;ON;;;;;N;;;;; +267D;PARTIALLY-RECYCLED PAPER SYMBOL;So;0;ON;;;;;N;;;;; +267E;PERMANENT PAPER SIGN;So;0;ON;;;;;N;;;;; +267F;WHEELCHAIR SYMBOL;So;0;ON;;;;;N;;;;; +2680;DIE FACE-1;So;0;ON;;;;;N;;;;; +2681;DIE FACE-2;So;0;ON;;;;;N;;;;; +2682;DIE FACE-3;So;0;ON;;;;;N;;;;; +2683;DIE FACE-4;So;0;ON;;;;;N;;;;; +2684;DIE FACE-5;So;0;ON;;;;;N;;;;; +2685;DIE FACE-6;So;0;ON;;;;;N;;;;; +2686;WHITE CIRCLE WITH DOT RIGHT;So;0;ON;;;;;N;;;;; +2687;WHITE CIRCLE WITH TWO DOTS;So;0;ON;;;;;N;;;;; +2688;BLACK CIRCLE WITH WHITE DOT RIGHT;So;0;ON;;;;;N;;;;; +2689;BLACK CIRCLE WITH TWO WHITE DOTS;So;0;ON;;;;;N;;;;; +268A;MONOGRAM FOR YANG;So;0;ON;;;;;N;;;;; +268B;MONOGRAM FOR YIN;So;0;ON;;;;;N;;;;; +268C;DIGRAM FOR GREATER YANG;So;0;ON;;;;;N;;;;; +268D;DIGRAM FOR LESSER YIN;So;0;ON;;;;;N;;;;; +268E;DIGRAM FOR LESSER YANG;So;0;ON;;;;;N;;;;; +268F;DIGRAM FOR GREATER YIN;So;0;ON;;;;;N;;;;; +2690;WHITE FLAG;So;0;ON;;;;;N;;;;; +2691;BLACK FLAG;So;0;ON;;;;;N;;;;; +2692;HAMMER AND PICK;So;0;ON;;;;;N;;;;; +2693;ANCHOR;So;0;ON;;;;;N;;;;; +2694;CROSSED SWORDS;So;0;ON;;;;;N;;;;; +2695;STAFF OF AESCULAPIUS;So;0;ON;;;;;N;;;;; +2696;SCALES;So;0;ON;;;;;N;;;;; +2697;ALEMBIC;So;0;ON;;;;;N;;;;; +2698;FLOWER;So;0;ON;;;;;N;;;;; +2699;GEAR;So;0;ON;;;;;N;;;;; +269A;STAFF OF HERMES;So;0;ON;;;;;N;;;;; +269B;ATOM SYMBOL;So;0;ON;;;;;N;;;;; +269C;FLEUR-DE-LIS;So;0;ON;;;;;N;;;;; +269D;OUTLINED WHITE STAR;So;0;ON;;;;;N;;;;; +269E;THREE LINES CONVERGING RIGHT;So;0;ON;;;;;N;;;;; +269F;THREE LINES CONVERGING LEFT;So;0;ON;;;;;N;;;;; +26A0;WARNING SIGN;So;0;ON;;;;;N;;;;; +26A1;HIGH VOLTAGE SIGN;So;0;ON;;;;;N;;;;; +26A2;DOUBLED FEMALE SIGN;So;0;ON;;;;;N;;;;; +26A3;DOUBLED MALE SIGN;So;0;ON;;;;;N;;;;; +26A4;INTERLOCKED FEMALE AND MALE SIGN;So;0;ON;;;;;N;;;;; +26A5;MALE AND FEMALE SIGN;So;0;ON;;;;;N;;;;; +26A6;MALE WITH STROKE SIGN;So;0;ON;;;;;N;;;;; +26A7;MALE WITH STROKE AND MALE AND FEMALE SIGN;So;0;ON;;;;;N;;;;; +26A8;VERTICAL MALE WITH STROKE SIGN;So;0;ON;;;;;N;;;;; +26A9;HORIZONTAL MALE WITH STROKE SIGN;So;0;ON;;;;;N;;;;; +26AA;MEDIUM WHITE CIRCLE;So;0;ON;;;;;N;;;;; +26AB;MEDIUM BLACK CIRCLE;So;0;ON;;;;;N;;;;; +26AC;MEDIUM SMALL WHITE CIRCLE;So;0;L;;;;;N;;;;; +26AD;MARRIAGE SYMBOL;So;0;ON;;;;;N;;;;; +26AE;DIVORCE SYMBOL;So;0;ON;;;;;N;;;;; +26AF;UNMARRIED PARTNERSHIP SYMBOL;So;0;ON;;;;;N;;;;; +26B0;COFFIN;So;0;ON;;;;;N;;;;; +26B1;FUNERAL URN;So;0;ON;;;;;N;;;;; +26B2;NEUTER;So;0;ON;;;;;N;;;;; +26B3;CERES;So;0;ON;;;;;N;;;;; +26B4;PALLAS;So;0;ON;;;;;N;;;;; +26B5;JUNO;So;0;ON;;;;;N;;;;; +26B6;VESTA;So;0;ON;;;;;N;;;;; +26B7;CHIRON;So;0;ON;;;;;N;;;;; +26B8;BLACK MOON LILITH;So;0;ON;;;;;N;;;;; +26B9;SEXTILE;So;0;ON;;;;;N;;;;; +26BA;SEMISEXTILE;So;0;ON;;;;;N;;;;; +26BB;QUINCUNX;So;0;ON;;;;;N;;;;; +26BC;SESQUIQUADRATE;So;0;ON;;;;;N;;;;; +26BD;SOCCER BALL;So;0;ON;;;;;N;;;;; +26BE;BASEBALL;So;0;ON;;;;;N;;;;; +26BF;SQUARED KEY;So;0;ON;;;;;N;;;;; +26C0;WHITE DRAUGHTS MAN;So;0;ON;;;;;N;;;;; +26C1;WHITE DRAUGHTS KING;So;0;ON;;;;;N;;;;; +26C2;BLACK DRAUGHTS MAN;So;0;ON;;;;;N;;;;; +26C3;BLACK DRAUGHTS KING;So;0;ON;;;;;N;;;;; +26C4;SNOWMAN WITHOUT SNOW;So;0;ON;;;;;N;;;;; +26C5;SUN BEHIND CLOUD;So;0;ON;;;;;N;;;;; +26C6;RAIN;So;0;ON;;;;;N;;;;; +26C7;BLACK SNOWMAN;So;0;ON;;;;;N;;;;; +26C8;THUNDER CLOUD AND RAIN;So;0;ON;;;;;N;;;;; +26C9;TURNED WHITE SHOGI PIECE;So;0;ON;;;;;N;;;;; +26CA;TURNED BLACK SHOGI PIECE;So;0;ON;;;;;N;;;;; +26CB;WHITE DIAMOND IN SQUARE;So;0;ON;;;;;N;;;;; +26CC;CROSSING LANES;So;0;ON;;;;;N;;;;; +26CD;DISABLED CAR;So;0;ON;;;;;N;;;;; +26CE;OPHIUCHUS;So;0;ON;;;;;N;;;;; +26CF;PICK;So;0;ON;;;;;N;;;;; +26D0;CAR SLIDING;So;0;ON;;;;;N;;;;; +26D1;HELMET WITH WHITE CROSS;So;0;ON;;;;;N;;;;; +26D2;CIRCLED CROSSING LANES;So;0;ON;;;;;N;;;;; +26D3;CHAINS;So;0;ON;;;;;N;;;;; +26D4;NO ENTRY;So;0;ON;;;;;N;;;;; +26D5;ALTERNATE ONE-WAY LEFT WAY TRAFFIC;So;0;ON;;;;;N;;;;; +26D6;BLACK TWO-WAY LEFT WAY TRAFFIC;So;0;ON;;;;;N;;;;; +26D7;WHITE TWO-WAY LEFT WAY TRAFFIC;So;0;ON;;;;;N;;;;; +26D8;BLACK LEFT LANE MERGE;So;0;ON;;;;;N;;;;; +26D9;WHITE LEFT LANE MERGE;So;0;ON;;;;;N;;;;; +26DA;DRIVE SLOW SIGN;So;0;ON;;;;;N;;;;; +26DB;HEAVY WHITE DOWN-POINTING TRIANGLE;So;0;ON;;;;;N;;;;; +26DC;LEFT CLOSED ENTRY;So;0;ON;;;;;N;;;;; +26DD;SQUARED SALTIRE;So;0;ON;;;;;N;;;;; +26DE;FALLING DIAGONAL IN WHITE CIRCLE IN BLACK SQUARE;So;0;ON;;;;;N;;;;; +26DF;BLACK TRUCK;So;0;ON;;;;;N;;;;; +26E0;RESTRICTED LEFT ENTRY-1;So;0;ON;;;;;N;;;;; +26E1;RESTRICTED LEFT ENTRY-2;So;0;ON;;;;;N;;;;; +26E2;ASTRONOMICAL SYMBOL FOR URANUS;So;0;ON;;;;;N;;;;; +26E3;HEAVY CIRCLE WITH STROKE AND TWO DOTS ABOVE;So;0;ON;;;;;N;;;;; +26E4;PENTAGRAM;So;0;ON;;;;;N;;;;; +26E5;RIGHT-HANDED INTERLACED PENTAGRAM;So;0;ON;;;;;N;;;;; +26E6;LEFT-HANDED INTERLACED PENTAGRAM;So;0;ON;;;;;N;;;;; +26E7;INVERTED PENTAGRAM;So;0;ON;;;;;N;;;;; +26E8;BLACK CROSS ON SHIELD;So;0;ON;;;;;N;;;;; +26E9;SHINTO SHRINE;So;0;ON;;;;;N;;;;; +26EA;CHURCH;So;0;ON;;;;;N;;;;; +26EB;CASTLE;So;0;ON;;;;;N;;;;; +26EC;HISTORIC SITE;So;0;ON;;;;;N;;;;; +26ED;GEAR WITHOUT HUB;So;0;ON;;;;;N;;;;; +26EE;GEAR WITH HANDLES;So;0;ON;;;;;N;;;;; +26EF;MAP SYMBOL FOR LIGHTHOUSE;So;0;ON;;;;;N;;;;; +26F0;MOUNTAIN;So;0;ON;;;;;N;;;;; +26F1;UMBRELLA ON GROUND;So;0;ON;;;;;N;;;;; +26F2;FOUNTAIN;So;0;ON;;;;;N;;;;; +26F3;FLAG IN HOLE;So;0;ON;;;;;N;;;;; +26F4;FERRY;So;0;ON;;;;;N;;;;; +26F5;SAILBOAT;So;0;ON;;;;;N;;;;; +26F6;SQUARE FOUR CORNERS;So;0;ON;;;;;N;;;;; +26F7;SKIER;So;0;ON;;;;;N;;;;; +26F8;ICE SKATE;So;0;ON;;;;;N;;;;; +26F9;PERSON WITH BALL;So;0;ON;;;;;N;;;;; +26FA;TENT;So;0;ON;;;;;N;;;;; +26FB;JAPANESE BANK SYMBOL;So;0;ON;;;;;N;;;;; +26FC;HEADSTONE GRAVEYARD SYMBOL;So;0;ON;;;;;N;;;;; +26FD;FUEL PUMP;So;0;ON;;;;;N;;;;; +26FE;CUP ON BLACK SQUARE;So;0;ON;;;;;N;;;;; +26FF;WHITE FLAG WITH HORIZONTAL MIDDLE BLACK STRIPE;So;0;ON;;;;;N;;;;; +2700;BLACK SAFETY SCISSORS;So;0;ON;;;;;N;;;;; +2701;UPPER BLADE SCISSORS;So;0;ON;;;;;N;;;;; +2702;BLACK SCISSORS;So;0;ON;;;;;N;;;;; +2703;LOWER BLADE SCISSORS;So;0;ON;;;;;N;;;;; +2704;WHITE SCISSORS;So;0;ON;;;;;N;;;;; +2705;WHITE HEAVY CHECK MARK;So;0;ON;;;;;N;;;;; +2706;TELEPHONE LOCATION SIGN;So;0;ON;;;;;N;;;;; +2707;TAPE DRIVE;So;0;ON;;;;;N;;;;; +2708;AIRPLANE;So;0;ON;;;;;N;;;;; +2709;ENVELOPE;So;0;ON;;;;;N;;;;; +270A;RAISED FIST;So;0;ON;;;;;N;;;;; +270B;RAISED HAND;So;0;ON;;;;;N;;;;; +270C;VICTORY HAND;So;0;ON;;;;;N;;;;; +270D;WRITING HAND;So;0;ON;;;;;N;;;;; +270E;LOWER RIGHT PENCIL;So;0;ON;;;;;N;;;;; +270F;PENCIL;So;0;ON;;;;;N;;;;; +2710;UPPER RIGHT PENCIL;So;0;ON;;;;;N;;;;; +2711;WHITE NIB;So;0;ON;;;;;N;;;;; +2712;BLACK NIB;So;0;ON;;;;;N;;;;; +2713;CHECK MARK;So;0;ON;;;;;N;;;;; +2714;HEAVY CHECK MARK;So;0;ON;;;;;N;;;;; +2715;MULTIPLICATION X;So;0;ON;;;;;N;;;;; +2716;HEAVY MULTIPLICATION X;So;0;ON;;;;;N;;;;; +2717;BALLOT X;So;0;ON;;;;;N;;;;; +2718;HEAVY BALLOT X;So;0;ON;;;;;N;;;;; +2719;OUTLINED GREEK CROSS;So;0;ON;;;;;N;;;;; +271A;HEAVY GREEK CROSS;So;0;ON;;;;;N;;;;; +271B;OPEN CENTRE CROSS;So;0;ON;;;;;N;OPEN CENTER CROSS;;;; +271C;HEAVY OPEN CENTRE CROSS;So;0;ON;;;;;N;HEAVY OPEN CENTER CROSS;;;; +271D;LATIN CROSS;So;0;ON;;;;;N;;;;; +271E;SHADOWED WHITE LATIN CROSS;So;0;ON;;;;;N;;;;; +271F;OUTLINED LATIN CROSS;So;0;ON;;;;;N;;;;; +2720;MALTESE CROSS;So;0;ON;;;;;N;;;;; +2721;STAR OF DAVID;So;0;ON;;;;;N;;;;; +2722;FOUR TEARDROP-SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +2723;FOUR BALLOON-SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +2724;HEAVY FOUR BALLOON-SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +2725;FOUR CLUB-SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +2726;BLACK FOUR POINTED STAR;So;0;ON;;;;;N;;;;; +2727;WHITE FOUR POINTED STAR;So;0;ON;;;;;N;;;;; +2728;SPARKLES;So;0;ON;;;;;N;;;;; +2729;STRESS OUTLINED WHITE STAR;So;0;ON;;;;;N;;;;; +272A;CIRCLED WHITE STAR;So;0;ON;;;;;N;;;;; +272B;OPEN CENTRE BLACK STAR;So;0;ON;;;;;N;OPEN CENTER BLACK STAR;;;; +272C;BLACK CENTRE WHITE STAR;So;0;ON;;;;;N;BLACK CENTER WHITE STAR;;;; +272D;OUTLINED BLACK STAR;So;0;ON;;;;;N;;;;; +272E;HEAVY OUTLINED BLACK STAR;So;0;ON;;;;;N;;;;; +272F;PINWHEEL STAR;So;0;ON;;;;;N;;;;; +2730;SHADOWED WHITE STAR;So;0;ON;;;;;N;;;;; +2731;HEAVY ASTERISK;So;0;ON;;;;;N;;;;; +2732;OPEN CENTRE ASTERISK;So;0;ON;;;;;N;OPEN CENTER ASTERISK;;;; +2733;EIGHT SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +2734;EIGHT POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +2735;EIGHT POINTED PINWHEEL STAR;So;0;ON;;;;;N;;;;; +2736;SIX POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +2737;EIGHT POINTED RECTILINEAR BLACK STAR;So;0;ON;;;;;N;;;;; +2738;HEAVY EIGHT POINTED RECTILINEAR BLACK STAR;So;0;ON;;;;;N;;;;; +2739;TWELVE POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +273A;SIXTEEN POINTED ASTERISK;So;0;ON;;;;;N;;;;; +273B;TEARDROP-SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +273C;OPEN CENTRE TEARDROP-SPOKED ASTERISK;So;0;ON;;;;;N;OPEN CENTER TEARDROP-SPOKED ASTERISK;;;; +273D;HEAVY TEARDROP-SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +273E;SIX PETALLED BLACK AND WHITE FLORETTE;So;0;ON;;;;;N;;;;; +273F;BLACK FLORETTE;So;0;ON;;;;;N;;;;; +2740;WHITE FLORETTE;So;0;ON;;;;;N;;;;; +2741;EIGHT PETALLED OUTLINED BLACK FLORETTE;So;0;ON;;;;;N;;;;; +2742;CIRCLED OPEN CENTRE EIGHT POINTED STAR;So;0;ON;;;;;N;CIRCLED OPEN CENTER EIGHT POINTED STAR;;;; +2743;HEAVY TEARDROP-SPOKED PINWHEEL ASTERISK;So;0;ON;;;;;N;;;;; +2744;SNOWFLAKE;So;0;ON;;;;;N;;;;; +2745;TIGHT TRIFOLIATE SNOWFLAKE;So;0;ON;;;;;N;;;;; +2746;HEAVY CHEVRON SNOWFLAKE;So;0;ON;;;;;N;;;;; +2747;SPARKLE;So;0;ON;;;;;N;;;;; +2748;HEAVY SPARKLE;So;0;ON;;;;;N;;;;; +2749;BALLOON-SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +274A;EIGHT TEARDROP-SPOKED PROPELLER ASTERISK;So;0;ON;;;;;N;;;;; +274B;HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK;So;0;ON;;;;;N;;;;; +274C;CROSS MARK;So;0;ON;;;;;N;;;;; +274D;SHADOWED WHITE CIRCLE;So;0;ON;;;;;N;;;;; +274E;NEGATIVE SQUARED CROSS MARK;So;0;ON;;;;;N;;;;; +274F;LOWER RIGHT DROP-SHADOWED WHITE SQUARE;So;0;ON;;;;;N;;;;; +2750;UPPER RIGHT DROP-SHADOWED WHITE SQUARE;So;0;ON;;;;;N;;;;; +2751;LOWER RIGHT SHADOWED WHITE SQUARE;So;0;ON;;;;;N;;;;; +2752;UPPER RIGHT SHADOWED WHITE SQUARE;So;0;ON;;;;;N;;;;; +2753;BLACK QUESTION MARK ORNAMENT;So;0;ON;;;;;N;;;;; +2754;WHITE QUESTION MARK ORNAMENT;So;0;ON;;;;;N;;;;; +2755;WHITE EXCLAMATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; +2756;BLACK DIAMOND MINUS WHITE X;So;0;ON;;;;;N;;;;; +2757;HEAVY EXCLAMATION MARK SYMBOL;So;0;ON;;;;;N;;;;; +2758;LIGHT VERTICAL BAR;So;0;ON;;;;;N;;;;; +2759;MEDIUM VERTICAL BAR;So;0;ON;;;;;N;;;;; +275A;HEAVY VERTICAL BAR;So;0;ON;;;;;N;;;;; +275B;HEAVY SINGLE TURNED COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; +275C;HEAVY SINGLE COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; +275D;HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; +275E;HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; +275F;HEAVY LOW SINGLE COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; +2760;HEAVY LOW DOUBLE COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; +2761;CURVED STEM PARAGRAPH SIGN ORNAMENT;So;0;ON;;;;;N;;;;; +2762;HEAVY EXCLAMATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; +2763;HEAVY HEART EXCLAMATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; +2764;HEAVY BLACK HEART;So;0;ON;;;;;N;;;;; +2765;ROTATED HEAVY BLACK HEART BULLET;So;0;ON;;;;;N;;;;; +2766;FLORAL HEART;So;0;ON;;;;;N;;;;; +2767;ROTATED FLORAL HEART BULLET;So;0;ON;;;;;N;;;;; +2768;MEDIUM LEFT PARENTHESIS ORNAMENT;Ps;0;ON;;;;;Y;;;;; +2769;MEDIUM RIGHT PARENTHESIS ORNAMENT;Pe;0;ON;;;;;Y;;;;; +276A;MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT;Ps;0;ON;;;;;Y;;;;; +276B;MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT;Pe;0;ON;;;;;Y;;;;; +276C;MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT;Ps;0;ON;;;;;Y;;;;; +276D;MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT;Pe;0;ON;;;;;Y;;;;; +276E;HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT;Ps;0;ON;;;;;Y;;;;; +276F;HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT;Pe;0;ON;;;;;Y;;;;; +2770;HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT;Ps;0;ON;;;;;Y;;;;; +2771;HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT;Pe;0;ON;;;;;Y;;;;; +2772;LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT;Ps;0;ON;;;;;Y;;;;; +2773;LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT;Pe;0;ON;;;;;Y;;;;; +2774;MEDIUM LEFT CURLY BRACKET ORNAMENT;Ps;0;ON;;;;;Y;;;;; +2775;MEDIUM RIGHT CURLY BRACKET ORNAMENT;Pe;0;ON;;;;;Y;;;;; +2776;DINGBAT NEGATIVE CIRCLED DIGIT ONE;No;0;ON;;;1;1;N;INVERSE CIRCLED DIGIT ONE;;;; +2777;DINGBAT NEGATIVE CIRCLED DIGIT TWO;No;0;ON;;;2;2;N;INVERSE CIRCLED DIGIT TWO;;;; +2778;DINGBAT NEGATIVE CIRCLED DIGIT THREE;No;0;ON;;;3;3;N;INVERSE CIRCLED DIGIT THREE;;;; +2779;DINGBAT NEGATIVE CIRCLED DIGIT FOUR;No;0;ON;;;4;4;N;INVERSE CIRCLED DIGIT FOUR;;;; +277A;DINGBAT NEGATIVE CIRCLED DIGIT FIVE;No;0;ON;;;5;5;N;INVERSE CIRCLED DIGIT FIVE;;;; +277B;DINGBAT NEGATIVE CIRCLED DIGIT SIX;No;0;ON;;;6;6;N;INVERSE CIRCLED DIGIT SIX;;;; +277C;DINGBAT NEGATIVE CIRCLED DIGIT SEVEN;No;0;ON;;;7;7;N;INVERSE CIRCLED DIGIT SEVEN;;;; +277D;DINGBAT NEGATIVE CIRCLED DIGIT EIGHT;No;0;ON;;;8;8;N;INVERSE CIRCLED DIGIT EIGHT;;;; +277E;DINGBAT NEGATIVE CIRCLED DIGIT NINE;No;0;ON;;;9;9;N;INVERSE CIRCLED DIGIT NINE;;;; +277F;DINGBAT NEGATIVE CIRCLED NUMBER TEN;No;0;ON;;;;10;N;INVERSE CIRCLED NUMBER TEN;;;; +2780;DINGBAT CIRCLED SANS-SERIF DIGIT ONE;No;0;ON;;;1;1;N;CIRCLED SANS-SERIF DIGIT ONE;;;; +2781;DINGBAT CIRCLED SANS-SERIF DIGIT TWO;No;0;ON;;;2;2;N;CIRCLED SANS-SERIF DIGIT TWO;;;; +2782;DINGBAT CIRCLED SANS-SERIF DIGIT THREE;No;0;ON;;;3;3;N;CIRCLED SANS-SERIF DIGIT THREE;;;; +2783;DINGBAT CIRCLED SANS-SERIF DIGIT FOUR;No;0;ON;;;4;4;N;CIRCLED SANS-SERIF DIGIT FOUR;;;; +2784;DINGBAT CIRCLED SANS-SERIF DIGIT FIVE;No;0;ON;;;5;5;N;CIRCLED SANS-SERIF DIGIT FIVE;;;; +2785;DINGBAT CIRCLED SANS-SERIF DIGIT SIX;No;0;ON;;;6;6;N;CIRCLED SANS-SERIF DIGIT SIX;;;; +2786;DINGBAT CIRCLED SANS-SERIF DIGIT SEVEN;No;0;ON;;;7;7;N;CIRCLED SANS-SERIF DIGIT SEVEN;;;; +2787;DINGBAT CIRCLED SANS-SERIF DIGIT EIGHT;No;0;ON;;;8;8;N;CIRCLED SANS-SERIF DIGIT EIGHT;;;; +2788;DINGBAT CIRCLED SANS-SERIF DIGIT NINE;No;0;ON;;;9;9;N;CIRCLED SANS-SERIF DIGIT NINE;;;; +2789;DINGBAT CIRCLED SANS-SERIF NUMBER TEN;No;0;ON;;;;10;N;CIRCLED SANS-SERIF NUMBER TEN;;;; +278A;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ONE;No;0;ON;;;1;1;N;INVERSE CIRCLED SANS-SERIF DIGIT ONE;;;; +278B;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT TWO;No;0;ON;;;2;2;N;INVERSE CIRCLED SANS-SERIF DIGIT TWO;;;; +278C;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT THREE;No;0;ON;;;3;3;N;INVERSE CIRCLED SANS-SERIF DIGIT THREE;;;; +278D;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FOUR;No;0;ON;;;4;4;N;INVERSE CIRCLED SANS-SERIF DIGIT FOUR;;;; +278E;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FIVE;No;0;ON;;;5;5;N;INVERSE CIRCLED SANS-SERIF DIGIT FIVE;;;; +278F;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SIX;No;0;ON;;;6;6;N;INVERSE CIRCLED SANS-SERIF DIGIT SIX;;;; +2790;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SEVEN;No;0;ON;;;7;7;N;INVERSE CIRCLED SANS-SERIF DIGIT SEVEN;;;; +2791;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT EIGHT;No;0;ON;;;8;8;N;INVERSE CIRCLED SANS-SERIF DIGIT EIGHT;;;; +2792;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT NINE;No;0;ON;;;9;9;N;INVERSE CIRCLED SANS-SERIF DIGIT NINE;;;; +2793;DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN;No;0;ON;;;;10;N;INVERSE CIRCLED SANS-SERIF NUMBER TEN;;;; +2794;HEAVY WIDE-HEADED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY WIDE-HEADED RIGHT ARROW;;;; +2795;HEAVY PLUS SIGN;So;0;ON;;;;;N;;;;; +2796;HEAVY MINUS SIGN;So;0;ON;;;;;N;;;;; +2797;HEAVY DIVISION SIGN;So;0;ON;;;;;N;;;;; +2798;HEAVY SOUTH EAST ARROW;So;0;ON;;;;;N;HEAVY LOWER RIGHT ARROW;;;; +2799;HEAVY RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY RIGHT ARROW;;;; +279A;HEAVY NORTH EAST ARROW;So;0;ON;;;;;N;HEAVY UPPER RIGHT ARROW;;;; +279B;DRAFTING POINT RIGHTWARDS ARROW;So;0;ON;;;;;N;DRAFTING POINT RIGHT ARROW;;;; +279C;HEAVY ROUND-TIPPED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY ROUND-TIPPED RIGHT ARROW;;;; +279D;TRIANGLE-HEADED RIGHTWARDS ARROW;So;0;ON;;;;;N;TRIANGLE-HEADED RIGHT ARROW;;;; +279E;HEAVY TRIANGLE-HEADED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY TRIANGLE-HEADED RIGHT ARROW;;;; +279F;DASHED TRIANGLE-HEADED RIGHTWARDS ARROW;So;0;ON;;;;;N;DASHED TRIANGLE-HEADED RIGHT ARROW;;;; +27A0;HEAVY DASHED TRIANGLE-HEADED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY DASHED TRIANGLE-HEADED RIGHT ARROW;;;; +27A1;BLACK RIGHTWARDS ARROW;So;0;ON;;;;;N;BLACK RIGHT ARROW;;;; +27A2;THREE-D TOP-LIGHTED RIGHTWARDS ARROWHEAD;So;0;ON;;;;;N;THREE-D TOP-LIGHTED RIGHT ARROWHEAD;;;; +27A3;THREE-D BOTTOM-LIGHTED RIGHTWARDS ARROWHEAD;So;0;ON;;;;;N;THREE-D BOTTOM-LIGHTED RIGHT ARROWHEAD;;;; +27A4;BLACK RIGHTWARDS ARROWHEAD;So;0;ON;;;;;N;BLACK RIGHT ARROWHEAD;;;; +27A5;HEAVY BLACK CURVED DOWNWARDS AND RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY BLACK CURVED DOWN AND RIGHT ARROW;;;; +27A6;HEAVY BLACK CURVED UPWARDS AND RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY BLACK CURVED UP AND RIGHT ARROW;;;; +27A7;SQUAT BLACK RIGHTWARDS ARROW;So;0;ON;;;;;N;SQUAT BLACK RIGHT ARROW;;;; +27A8;HEAVY CONCAVE-POINTED BLACK RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY CONCAVE-POINTED BLACK RIGHT ARROW;;;; +27A9;RIGHT-SHADED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;RIGHT-SHADED WHITE RIGHT ARROW;;;; +27AA;LEFT-SHADED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;LEFT-SHADED WHITE RIGHT ARROW;;;; +27AB;BACK-TILTED SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;BACK-TILTED SHADOWED WHITE RIGHT ARROW;;;; +27AC;FRONT-TILTED SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;FRONT-TILTED SHADOWED WHITE RIGHT ARROW;;;; +27AD;HEAVY LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY LOWER RIGHT-SHADOWED WHITE RIGHT ARROW;;;; +27AE;HEAVY UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY UPPER RIGHT-SHADOWED WHITE RIGHT ARROW;;;; +27AF;NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHT ARROW;;;; +27B0;CURLY LOOP;So;0;ON;;;;;N;;;;; +27B1;NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHT ARROW;;;; +27B2;CIRCLED HEAVY WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;CIRCLED HEAVY WHITE RIGHT ARROW;;;; +27B3;WHITE-FEATHERED RIGHTWARDS ARROW;So;0;ON;;;;;N;WHITE-FEATHERED RIGHT ARROW;;;; +27B4;BLACK-FEATHERED SOUTH EAST ARROW;So;0;ON;;;;;N;BLACK-FEATHERED LOWER RIGHT ARROW;;;; +27B5;BLACK-FEATHERED RIGHTWARDS ARROW;So;0;ON;;;;;N;BLACK-FEATHERED RIGHT ARROW;;;; +27B6;BLACK-FEATHERED NORTH EAST ARROW;So;0;ON;;;;;N;BLACK-FEATHERED UPPER RIGHT ARROW;;;; +27B7;HEAVY BLACK-FEATHERED SOUTH EAST ARROW;So;0;ON;;;;;N;HEAVY BLACK-FEATHERED LOWER RIGHT ARROW;;;; +27B8;HEAVY BLACK-FEATHERED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY BLACK-FEATHERED RIGHT ARROW;;;; +27B9;HEAVY BLACK-FEATHERED NORTH EAST ARROW;So;0;ON;;;;;N;HEAVY BLACK-FEATHERED UPPER RIGHT ARROW;;;; +27BA;TEARDROP-BARBED RIGHTWARDS ARROW;So;0;ON;;;;;N;TEARDROP-BARBED RIGHT ARROW;;;; +27BB;HEAVY TEARDROP-SHANKED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY TEARDROP-SHANKED RIGHT ARROW;;;; +27BC;WEDGE-TAILED RIGHTWARDS ARROW;So;0;ON;;;;;N;WEDGE-TAILED RIGHT ARROW;;;; +27BD;HEAVY WEDGE-TAILED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY WEDGE-TAILED RIGHT ARROW;;;; +27BE;OPEN-OUTLINED RIGHTWARDS ARROW;So;0;ON;;;;;N;OPEN-OUTLINED RIGHT ARROW;;;; +27BF;DOUBLE CURLY LOOP;So;0;ON;;;;;N;;;;; +27C0;THREE DIMENSIONAL ANGLE;Sm;0;ON;;;;;Y;;;;; +27C1;WHITE TRIANGLE CONTAINING SMALL WHITE TRIANGLE;Sm;0;ON;;;;;N;;;;; +27C2;PERPENDICULAR;Sm;0;ON;;;;;N;;;;; +27C3;OPEN SUBSET;Sm;0;ON;;;;;Y;;;;; +27C4;OPEN SUPERSET;Sm;0;ON;;;;;Y;;;;; +27C5;LEFT S-SHAPED BAG DELIMITER;Ps;0;ON;;;;;Y;;;;; +27C6;RIGHT S-SHAPED BAG DELIMITER;Pe;0;ON;;;;;Y;;;;; +27C7;OR WITH DOT INSIDE;Sm;0;ON;;;;;N;;;;; +27C8;REVERSE SOLIDUS PRECEDING SUBSET;Sm;0;ON;;;;;Y;;;;; +27C9;SUPERSET PRECEDING SOLIDUS;Sm;0;ON;;;;;Y;;;;; +27CA;VERTICAL BAR WITH HORIZONTAL STROKE;Sm;0;ON;;;;;N;;;;; +27CB;MATHEMATICAL RISING DIAGONAL;Sm;0;ON;;;;;Y;;;;; +27CC;LONG DIVISION;Sm;0;ON;;;;;Y;;;;; +27CD;MATHEMATICAL FALLING DIAGONAL;Sm;0;ON;;;;;Y;;;;; +27CE;SQUARED LOGICAL AND;Sm;0;ON;;;;;N;;;;; +27CF;SQUARED LOGICAL OR;Sm;0;ON;;;;;N;;;;; +27D0;WHITE DIAMOND WITH CENTRED DOT;Sm;0;ON;;;;;N;;;;; +27D1;AND WITH DOT;Sm;0;ON;;;;;N;;;;; +27D2;ELEMENT OF OPENING UPWARDS;Sm;0;ON;;;;;N;;;;; +27D3;LOWER RIGHT CORNER WITH DOT;Sm;0;ON;;;;;Y;;;;; +27D4;UPPER LEFT CORNER WITH DOT;Sm;0;ON;;;;;Y;;;;; +27D5;LEFT OUTER JOIN;Sm;0;ON;;;;;Y;;;;; +27D6;RIGHT OUTER JOIN;Sm;0;ON;;;;;Y;;;;; +27D7;FULL OUTER JOIN;Sm;0;ON;;;;;N;;;;; +27D8;LARGE UP TACK;Sm;0;ON;;;;;N;;;;; +27D9;LARGE DOWN TACK;Sm;0;ON;;;;;N;;;;; +27DA;LEFT AND RIGHT DOUBLE TURNSTILE;Sm;0;ON;;;;;N;;;;; +27DB;LEFT AND RIGHT TACK;Sm;0;ON;;;;;N;;;;; +27DC;LEFT MULTIMAP;Sm;0;ON;;;;;Y;;;;; +27DD;LONG RIGHT TACK;Sm;0;ON;;;;;Y;;;;; +27DE;LONG LEFT TACK;Sm;0;ON;;;;;Y;;;;; +27DF;UP TACK WITH CIRCLE ABOVE;Sm;0;ON;;;;;N;;;;; +27E0;LOZENGE DIVIDED BY HORIZONTAL RULE;Sm;0;ON;;;;;N;;;;; +27E1;WHITE CONCAVE-SIDED DIAMOND;Sm;0;ON;;;;;N;;;;; +27E2;WHITE CONCAVE-SIDED DIAMOND WITH LEFTWARDS TICK;Sm;0;ON;;;;;Y;;;;; +27E3;WHITE CONCAVE-SIDED DIAMOND WITH RIGHTWARDS TICK;Sm;0;ON;;;;;Y;;;;; +27E4;WHITE SQUARE WITH LEFTWARDS TICK;Sm;0;ON;;;;;Y;;;;; +27E5;WHITE SQUARE WITH RIGHTWARDS TICK;Sm;0;ON;;;;;Y;;;;; +27E6;MATHEMATICAL LEFT WHITE SQUARE BRACKET;Ps;0;ON;;;;;Y;;;;; +27E7;MATHEMATICAL RIGHT WHITE SQUARE BRACKET;Pe;0;ON;;;;;Y;;;;; +27E8;MATHEMATICAL LEFT ANGLE BRACKET;Ps;0;ON;;;;;Y;;;;; +27E9;MATHEMATICAL RIGHT ANGLE BRACKET;Pe;0;ON;;;;;Y;;;;; +27EA;MATHEMATICAL LEFT DOUBLE ANGLE BRACKET;Ps;0;ON;;;;;Y;;;;; +27EB;MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET;Pe;0;ON;;;;;Y;;;;; +27EC;MATHEMATICAL LEFT WHITE TORTOISE SHELL BRACKET;Ps;0;ON;;;;;Y;;;;; +27ED;MATHEMATICAL RIGHT WHITE TORTOISE SHELL BRACKET;Pe;0;ON;;;;;Y;;;;; +27EE;MATHEMATICAL LEFT FLATTENED PARENTHESIS;Ps;0;ON;;;;;Y;;;;; +27EF;MATHEMATICAL RIGHT FLATTENED PARENTHESIS;Pe;0;ON;;;;;Y;;;;; +27F0;UPWARDS QUADRUPLE ARROW;Sm;0;ON;;;;;N;;;;; +27F1;DOWNWARDS QUADRUPLE ARROW;Sm;0;ON;;;;;N;;;;; +27F2;ANTICLOCKWISE GAPPED CIRCLE ARROW;Sm;0;ON;;;;;N;;;;; +27F3;CLOCKWISE GAPPED CIRCLE ARROW;Sm;0;ON;;;;;N;;;;; +27F4;RIGHT ARROW WITH CIRCLED PLUS;Sm;0;ON;;;;;N;;;;; +27F5;LONG LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +27F6;LONG RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +27F7;LONG LEFT RIGHT ARROW;Sm;0;ON;;;;;N;;;;; +27F8;LONG LEFTWARDS DOUBLE ARROW;Sm;0;ON;;;;;N;;;;; +27F9;LONG RIGHTWARDS DOUBLE ARROW;Sm;0;ON;;;;;N;;;;; +27FA;LONG LEFT RIGHT DOUBLE ARROW;Sm;0;ON;;;;;N;;;;; +27FB;LONG LEFTWARDS ARROW FROM BAR;Sm;0;ON;;;;;N;;;;; +27FC;LONG RIGHTWARDS ARROW FROM BAR;Sm;0;ON;;;;;N;;;;; +27FD;LONG LEFTWARDS DOUBLE ARROW FROM BAR;Sm;0;ON;;;;;N;;;;; +27FE;LONG RIGHTWARDS DOUBLE ARROW FROM BAR;Sm;0;ON;;;;;N;;;;; +27FF;LONG RIGHTWARDS SQUIGGLE ARROW;Sm;0;ON;;;;;N;;;;; +2800;BRAILLE PATTERN BLANK;So;0;L;;;;;N;;;;; +2801;BRAILLE PATTERN DOTS-1;So;0;L;;;;;N;;;;; +2802;BRAILLE PATTERN DOTS-2;So;0;L;;;;;N;;;;; +2803;BRAILLE PATTERN DOTS-12;So;0;L;;;;;N;;;;; +2804;BRAILLE PATTERN DOTS-3;So;0;L;;;;;N;;;;; +2805;BRAILLE PATTERN DOTS-13;So;0;L;;;;;N;;;;; +2806;BRAILLE PATTERN DOTS-23;So;0;L;;;;;N;;;;; +2807;BRAILLE PATTERN DOTS-123;So;0;L;;;;;N;;;;; +2808;BRAILLE PATTERN DOTS-4;So;0;L;;;;;N;;;;; +2809;BRAILLE PATTERN DOTS-14;So;0;L;;;;;N;;;;; +280A;BRAILLE PATTERN DOTS-24;So;0;L;;;;;N;;;;; +280B;BRAILLE PATTERN DOTS-124;So;0;L;;;;;N;;;;; +280C;BRAILLE PATTERN DOTS-34;So;0;L;;;;;N;;;;; +280D;BRAILLE PATTERN DOTS-134;So;0;L;;;;;N;;;;; +280E;BRAILLE PATTERN DOTS-234;So;0;L;;;;;N;;;;; +280F;BRAILLE PATTERN DOTS-1234;So;0;L;;;;;N;;;;; +2810;BRAILLE PATTERN DOTS-5;So;0;L;;;;;N;;;;; +2811;BRAILLE PATTERN DOTS-15;So;0;L;;;;;N;;;;; +2812;BRAILLE PATTERN DOTS-25;So;0;L;;;;;N;;;;; +2813;BRAILLE PATTERN DOTS-125;So;0;L;;;;;N;;;;; +2814;BRAILLE PATTERN DOTS-35;So;0;L;;;;;N;;;;; +2815;BRAILLE PATTERN DOTS-135;So;0;L;;;;;N;;;;; +2816;BRAILLE PATTERN DOTS-235;So;0;L;;;;;N;;;;; +2817;BRAILLE PATTERN DOTS-1235;So;0;L;;;;;N;;;;; +2818;BRAILLE PATTERN DOTS-45;So;0;L;;;;;N;;;;; +2819;BRAILLE PATTERN DOTS-145;So;0;L;;;;;N;;;;; +281A;BRAILLE PATTERN DOTS-245;So;0;L;;;;;N;;;;; +281B;BRAILLE PATTERN DOTS-1245;So;0;L;;;;;N;;;;; +281C;BRAILLE PATTERN DOTS-345;So;0;L;;;;;N;;;;; +281D;BRAILLE PATTERN DOTS-1345;So;0;L;;;;;N;;;;; +281E;BRAILLE PATTERN DOTS-2345;So;0;L;;;;;N;;;;; +281F;BRAILLE PATTERN DOTS-12345;So;0;L;;;;;N;;;;; +2820;BRAILLE PATTERN DOTS-6;So;0;L;;;;;N;;;;; +2821;BRAILLE PATTERN DOTS-16;So;0;L;;;;;N;;;;; +2822;BRAILLE PATTERN DOTS-26;So;0;L;;;;;N;;;;; +2823;BRAILLE PATTERN DOTS-126;So;0;L;;;;;N;;;;; +2824;BRAILLE PATTERN DOTS-36;So;0;L;;;;;N;;;;; +2825;BRAILLE PATTERN DOTS-136;So;0;L;;;;;N;;;;; +2826;BRAILLE PATTERN DOTS-236;So;0;L;;;;;N;;;;; +2827;BRAILLE PATTERN DOTS-1236;So;0;L;;;;;N;;;;; +2828;BRAILLE PATTERN DOTS-46;So;0;L;;;;;N;;;;; +2829;BRAILLE PATTERN DOTS-146;So;0;L;;;;;N;;;;; +282A;BRAILLE PATTERN DOTS-246;So;0;L;;;;;N;;;;; +282B;BRAILLE PATTERN DOTS-1246;So;0;L;;;;;N;;;;; +282C;BRAILLE PATTERN DOTS-346;So;0;L;;;;;N;;;;; +282D;BRAILLE PATTERN DOTS-1346;So;0;L;;;;;N;;;;; +282E;BRAILLE PATTERN DOTS-2346;So;0;L;;;;;N;;;;; +282F;BRAILLE PATTERN DOTS-12346;So;0;L;;;;;N;;;;; +2830;BRAILLE PATTERN DOTS-56;So;0;L;;;;;N;;;;; +2831;BRAILLE PATTERN DOTS-156;So;0;L;;;;;N;;;;; +2832;BRAILLE PATTERN DOTS-256;So;0;L;;;;;N;;;;; +2833;BRAILLE PATTERN DOTS-1256;So;0;L;;;;;N;;;;; +2834;BRAILLE PATTERN DOTS-356;So;0;L;;;;;N;;;;; +2835;BRAILLE PATTERN DOTS-1356;So;0;L;;;;;N;;;;; +2836;BRAILLE PATTERN DOTS-2356;So;0;L;;;;;N;;;;; +2837;BRAILLE PATTERN DOTS-12356;So;0;L;;;;;N;;;;; +2838;BRAILLE PATTERN DOTS-456;So;0;L;;;;;N;;;;; +2839;BRAILLE PATTERN DOTS-1456;So;0;L;;;;;N;;;;; +283A;BRAILLE PATTERN DOTS-2456;So;0;L;;;;;N;;;;; +283B;BRAILLE PATTERN DOTS-12456;So;0;L;;;;;N;;;;; +283C;BRAILLE PATTERN DOTS-3456;So;0;L;;;;;N;;;;; +283D;BRAILLE PATTERN DOTS-13456;So;0;L;;;;;N;;;;; +283E;BRAILLE PATTERN DOTS-23456;So;0;L;;;;;N;;;;; +283F;BRAILLE PATTERN DOTS-123456;So;0;L;;;;;N;;;;; +2840;BRAILLE PATTERN DOTS-7;So;0;L;;;;;N;;;;; +2841;BRAILLE PATTERN DOTS-17;So;0;L;;;;;N;;;;; +2842;BRAILLE PATTERN DOTS-27;So;0;L;;;;;N;;;;; +2843;BRAILLE PATTERN DOTS-127;So;0;L;;;;;N;;;;; +2844;BRAILLE PATTERN DOTS-37;So;0;L;;;;;N;;;;; +2845;BRAILLE PATTERN DOTS-137;So;0;L;;;;;N;;;;; +2846;BRAILLE PATTERN DOTS-237;So;0;L;;;;;N;;;;; +2847;BRAILLE PATTERN DOTS-1237;So;0;L;;;;;N;;;;; +2848;BRAILLE PATTERN DOTS-47;So;0;L;;;;;N;;;;; +2849;BRAILLE PATTERN DOTS-147;So;0;L;;;;;N;;;;; +284A;BRAILLE PATTERN DOTS-247;So;0;L;;;;;N;;;;; +284B;BRAILLE PATTERN DOTS-1247;So;0;L;;;;;N;;;;; +284C;BRAILLE PATTERN DOTS-347;So;0;L;;;;;N;;;;; +284D;BRAILLE PATTERN DOTS-1347;So;0;L;;;;;N;;;;; +284E;BRAILLE PATTERN DOTS-2347;So;0;L;;;;;N;;;;; +284F;BRAILLE PATTERN DOTS-12347;So;0;L;;;;;N;;;;; +2850;BRAILLE PATTERN DOTS-57;So;0;L;;;;;N;;;;; +2851;BRAILLE PATTERN DOTS-157;So;0;L;;;;;N;;;;; +2852;BRAILLE PATTERN DOTS-257;So;0;L;;;;;N;;;;; +2853;BRAILLE PATTERN DOTS-1257;So;0;L;;;;;N;;;;; +2854;BRAILLE PATTERN DOTS-357;So;0;L;;;;;N;;;;; +2855;BRAILLE PATTERN DOTS-1357;So;0;L;;;;;N;;;;; +2856;BRAILLE PATTERN DOTS-2357;So;0;L;;;;;N;;;;; +2857;BRAILLE PATTERN DOTS-12357;So;0;L;;;;;N;;;;; +2858;BRAILLE PATTERN DOTS-457;So;0;L;;;;;N;;;;; +2859;BRAILLE PATTERN DOTS-1457;So;0;L;;;;;N;;;;; +285A;BRAILLE PATTERN DOTS-2457;So;0;L;;;;;N;;;;; +285B;BRAILLE PATTERN DOTS-12457;So;0;L;;;;;N;;;;; +285C;BRAILLE PATTERN DOTS-3457;So;0;L;;;;;N;;;;; +285D;BRAILLE PATTERN DOTS-13457;So;0;L;;;;;N;;;;; +285E;BRAILLE PATTERN DOTS-23457;So;0;L;;;;;N;;;;; +285F;BRAILLE PATTERN DOTS-123457;So;0;L;;;;;N;;;;; +2860;BRAILLE PATTERN DOTS-67;So;0;L;;;;;N;;;;; +2861;BRAILLE PATTERN DOTS-167;So;0;L;;;;;N;;;;; +2862;BRAILLE PATTERN DOTS-267;So;0;L;;;;;N;;;;; +2863;BRAILLE PATTERN DOTS-1267;So;0;L;;;;;N;;;;; +2864;BRAILLE PATTERN DOTS-367;So;0;L;;;;;N;;;;; +2865;BRAILLE PATTERN DOTS-1367;So;0;L;;;;;N;;;;; +2866;BRAILLE PATTERN DOTS-2367;So;0;L;;;;;N;;;;; +2867;BRAILLE PATTERN DOTS-12367;So;0;L;;;;;N;;;;; +2868;BRAILLE PATTERN DOTS-467;So;0;L;;;;;N;;;;; +2869;BRAILLE PATTERN DOTS-1467;So;0;L;;;;;N;;;;; +286A;BRAILLE PATTERN DOTS-2467;So;0;L;;;;;N;;;;; +286B;BRAILLE PATTERN DOTS-12467;So;0;L;;;;;N;;;;; +286C;BRAILLE PATTERN DOTS-3467;So;0;L;;;;;N;;;;; +286D;BRAILLE PATTERN DOTS-13467;So;0;L;;;;;N;;;;; +286E;BRAILLE PATTERN DOTS-23467;So;0;L;;;;;N;;;;; +286F;BRAILLE PATTERN DOTS-123467;So;0;L;;;;;N;;;;; +2870;BRAILLE PATTERN DOTS-567;So;0;L;;;;;N;;;;; +2871;BRAILLE PATTERN DOTS-1567;So;0;L;;;;;N;;;;; +2872;BRAILLE PATTERN DOTS-2567;So;0;L;;;;;N;;;;; +2873;BRAILLE PATTERN DOTS-12567;So;0;L;;;;;N;;;;; +2874;BRAILLE PATTERN DOTS-3567;So;0;L;;;;;N;;;;; +2875;BRAILLE PATTERN DOTS-13567;So;0;L;;;;;N;;;;; +2876;BRAILLE PATTERN DOTS-23567;So;0;L;;;;;N;;;;; +2877;BRAILLE PATTERN DOTS-123567;So;0;L;;;;;N;;;;; +2878;BRAILLE PATTERN DOTS-4567;So;0;L;;;;;N;;;;; +2879;BRAILLE PATTERN DOTS-14567;So;0;L;;;;;N;;;;; +287A;BRAILLE PATTERN DOTS-24567;So;0;L;;;;;N;;;;; +287B;BRAILLE PATTERN DOTS-124567;So;0;L;;;;;N;;;;; +287C;BRAILLE PATTERN DOTS-34567;So;0;L;;;;;N;;;;; +287D;BRAILLE PATTERN DOTS-134567;So;0;L;;;;;N;;;;; +287E;BRAILLE PATTERN DOTS-234567;So;0;L;;;;;N;;;;; +287F;BRAILLE PATTERN DOTS-1234567;So;0;L;;;;;N;;;;; +2880;BRAILLE PATTERN DOTS-8;So;0;L;;;;;N;;;;; +2881;BRAILLE PATTERN DOTS-18;So;0;L;;;;;N;;;;; +2882;BRAILLE PATTERN DOTS-28;So;0;L;;;;;N;;;;; +2883;BRAILLE PATTERN DOTS-128;So;0;L;;;;;N;;;;; +2884;BRAILLE PATTERN DOTS-38;So;0;L;;;;;N;;;;; +2885;BRAILLE PATTERN DOTS-138;So;0;L;;;;;N;;;;; +2886;BRAILLE PATTERN DOTS-238;So;0;L;;;;;N;;;;; +2887;BRAILLE PATTERN DOTS-1238;So;0;L;;;;;N;;;;; +2888;BRAILLE PATTERN DOTS-48;So;0;L;;;;;N;;;;; +2889;BRAILLE PATTERN DOTS-148;So;0;L;;;;;N;;;;; +288A;BRAILLE PATTERN DOTS-248;So;0;L;;;;;N;;;;; +288B;BRAILLE PATTERN DOTS-1248;So;0;L;;;;;N;;;;; +288C;BRAILLE PATTERN DOTS-348;So;0;L;;;;;N;;;;; +288D;BRAILLE PATTERN DOTS-1348;So;0;L;;;;;N;;;;; +288E;BRAILLE PATTERN DOTS-2348;So;0;L;;;;;N;;;;; +288F;BRAILLE PATTERN DOTS-12348;So;0;L;;;;;N;;;;; +2890;BRAILLE PATTERN DOTS-58;So;0;L;;;;;N;;;;; +2891;BRAILLE PATTERN DOTS-158;So;0;L;;;;;N;;;;; +2892;BRAILLE PATTERN DOTS-258;So;0;L;;;;;N;;;;; +2893;BRAILLE PATTERN DOTS-1258;So;0;L;;;;;N;;;;; +2894;BRAILLE PATTERN DOTS-358;So;0;L;;;;;N;;;;; +2895;BRAILLE PATTERN DOTS-1358;So;0;L;;;;;N;;;;; +2896;BRAILLE PATTERN DOTS-2358;So;0;L;;;;;N;;;;; +2897;BRAILLE PATTERN DOTS-12358;So;0;L;;;;;N;;;;; +2898;BRAILLE PATTERN DOTS-458;So;0;L;;;;;N;;;;; +2899;BRAILLE PATTERN DOTS-1458;So;0;L;;;;;N;;;;; +289A;BRAILLE PATTERN DOTS-2458;So;0;L;;;;;N;;;;; +289B;BRAILLE PATTERN DOTS-12458;So;0;L;;;;;N;;;;; +289C;BRAILLE PATTERN DOTS-3458;So;0;L;;;;;N;;;;; +289D;BRAILLE PATTERN DOTS-13458;So;0;L;;;;;N;;;;; +289E;BRAILLE PATTERN DOTS-23458;So;0;L;;;;;N;;;;; +289F;BRAILLE PATTERN DOTS-123458;So;0;L;;;;;N;;;;; +28A0;BRAILLE PATTERN DOTS-68;So;0;L;;;;;N;;;;; +28A1;BRAILLE PATTERN DOTS-168;So;0;L;;;;;N;;;;; +28A2;BRAILLE PATTERN DOTS-268;So;0;L;;;;;N;;;;; +28A3;BRAILLE PATTERN DOTS-1268;So;0;L;;;;;N;;;;; +28A4;BRAILLE PATTERN DOTS-368;So;0;L;;;;;N;;;;; +28A5;BRAILLE PATTERN DOTS-1368;So;0;L;;;;;N;;;;; +28A6;BRAILLE PATTERN DOTS-2368;So;0;L;;;;;N;;;;; +28A7;BRAILLE PATTERN DOTS-12368;So;0;L;;;;;N;;;;; +28A8;BRAILLE PATTERN DOTS-468;So;0;L;;;;;N;;;;; +28A9;BRAILLE PATTERN DOTS-1468;So;0;L;;;;;N;;;;; +28AA;BRAILLE PATTERN DOTS-2468;So;0;L;;;;;N;;;;; +28AB;BRAILLE PATTERN DOTS-12468;So;0;L;;;;;N;;;;; +28AC;BRAILLE PATTERN DOTS-3468;So;0;L;;;;;N;;;;; +28AD;BRAILLE PATTERN DOTS-13468;So;0;L;;;;;N;;;;; +28AE;BRAILLE PATTERN DOTS-23468;So;0;L;;;;;N;;;;; +28AF;BRAILLE PATTERN DOTS-123468;So;0;L;;;;;N;;;;; +28B0;BRAILLE PATTERN DOTS-568;So;0;L;;;;;N;;;;; +28B1;BRAILLE PATTERN DOTS-1568;So;0;L;;;;;N;;;;; +28B2;BRAILLE PATTERN DOTS-2568;So;0;L;;;;;N;;;;; +28B3;BRAILLE PATTERN DOTS-12568;So;0;L;;;;;N;;;;; +28B4;BRAILLE PATTERN DOTS-3568;So;0;L;;;;;N;;;;; +28B5;BRAILLE PATTERN DOTS-13568;So;0;L;;;;;N;;;;; +28B6;BRAILLE PATTERN DOTS-23568;So;0;L;;;;;N;;;;; +28B7;BRAILLE PATTERN DOTS-123568;So;0;L;;;;;N;;;;; +28B8;BRAILLE PATTERN DOTS-4568;So;0;L;;;;;N;;;;; +28B9;BRAILLE PATTERN DOTS-14568;So;0;L;;;;;N;;;;; +28BA;BRAILLE PATTERN DOTS-24568;So;0;L;;;;;N;;;;; +28BB;BRAILLE PATTERN DOTS-124568;So;0;L;;;;;N;;;;; +28BC;BRAILLE PATTERN DOTS-34568;So;0;L;;;;;N;;;;; +28BD;BRAILLE PATTERN DOTS-134568;So;0;L;;;;;N;;;;; +28BE;BRAILLE PATTERN DOTS-234568;So;0;L;;;;;N;;;;; +28BF;BRAILLE PATTERN DOTS-1234568;So;0;L;;;;;N;;;;; +28C0;BRAILLE PATTERN DOTS-78;So;0;L;;;;;N;;;;; +28C1;BRAILLE PATTERN DOTS-178;So;0;L;;;;;N;;;;; +28C2;BRAILLE PATTERN DOTS-278;So;0;L;;;;;N;;;;; +28C3;BRAILLE PATTERN DOTS-1278;So;0;L;;;;;N;;;;; +28C4;BRAILLE PATTERN DOTS-378;So;0;L;;;;;N;;;;; +28C5;BRAILLE PATTERN DOTS-1378;So;0;L;;;;;N;;;;; +28C6;BRAILLE PATTERN DOTS-2378;So;0;L;;;;;N;;;;; +28C7;BRAILLE PATTERN DOTS-12378;So;0;L;;;;;N;;;;; +28C8;BRAILLE PATTERN DOTS-478;So;0;L;;;;;N;;;;; +28C9;BRAILLE PATTERN DOTS-1478;So;0;L;;;;;N;;;;; +28CA;BRAILLE PATTERN DOTS-2478;So;0;L;;;;;N;;;;; +28CB;BRAILLE PATTERN DOTS-12478;So;0;L;;;;;N;;;;; +28CC;BRAILLE PATTERN DOTS-3478;So;0;L;;;;;N;;;;; +28CD;BRAILLE PATTERN DOTS-13478;So;0;L;;;;;N;;;;; +28CE;BRAILLE PATTERN DOTS-23478;So;0;L;;;;;N;;;;; +28CF;BRAILLE PATTERN DOTS-123478;So;0;L;;;;;N;;;;; +28D0;BRAILLE PATTERN DOTS-578;So;0;L;;;;;N;;;;; +28D1;BRAILLE PATTERN DOTS-1578;So;0;L;;;;;N;;;;; +28D2;BRAILLE PATTERN DOTS-2578;So;0;L;;;;;N;;;;; +28D3;BRAILLE PATTERN DOTS-12578;So;0;L;;;;;N;;;;; +28D4;BRAILLE PATTERN DOTS-3578;So;0;L;;;;;N;;;;; +28D5;BRAILLE PATTERN DOTS-13578;So;0;L;;;;;N;;;;; +28D6;BRAILLE PATTERN DOTS-23578;So;0;L;;;;;N;;;;; +28D7;BRAILLE PATTERN DOTS-123578;So;0;L;;;;;N;;;;; +28D8;BRAILLE PATTERN DOTS-4578;So;0;L;;;;;N;;;;; +28D9;BRAILLE PATTERN DOTS-14578;So;0;L;;;;;N;;;;; +28DA;BRAILLE PATTERN DOTS-24578;So;0;L;;;;;N;;;;; +28DB;BRAILLE PATTERN DOTS-124578;So;0;L;;;;;N;;;;; +28DC;BRAILLE PATTERN DOTS-34578;So;0;L;;;;;N;;;;; +28DD;BRAILLE PATTERN DOTS-134578;So;0;L;;;;;N;;;;; +28DE;BRAILLE PATTERN DOTS-234578;So;0;L;;;;;N;;;;; +28DF;BRAILLE PATTERN DOTS-1234578;So;0;L;;;;;N;;;;; +28E0;BRAILLE PATTERN DOTS-678;So;0;L;;;;;N;;;;; +28E1;BRAILLE PATTERN DOTS-1678;So;0;L;;;;;N;;;;; +28E2;BRAILLE PATTERN DOTS-2678;So;0;L;;;;;N;;;;; +28E3;BRAILLE PATTERN DOTS-12678;So;0;L;;;;;N;;;;; +28E4;BRAILLE PATTERN DOTS-3678;So;0;L;;;;;N;;;;; +28E5;BRAILLE PATTERN DOTS-13678;So;0;L;;;;;N;;;;; +28E6;BRAILLE PATTERN DOTS-23678;So;0;L;;;;;N;;;;; +28E7;BRAILLE PATTERN DOTS-123678;So;0;L;;;;;N;;;;; +28E8;BRAILLE PATTERN DOTS-4678;So;0;L;;;;;N;;;;; +28E9;BRAILLE PATTERN DOTS-14678;So;0;L;;;;;N;;;;; +28EA;BRAILLE PATTERN DOTS-24678;So;0;L;;;;;N;;;;; +28EB;BRAILLE PATTERN DOTS-124678;So;0;L;;;;;N;;;;; +28EC;BRAILLE PATTERN DOTS-34678;So;0;L;;;;;N;;;;; +28ED;BRAILLE PATTERN DOTS-134678;So;0;L;;;;;N;;;;; +28EE;BRAILLE PATTERN DOTS-234678;So;0;L;;;;;N;;;;; +28EF;BRAILLE PATTERN DOTS-1234678;So;0;L;;;;;N;;;;; +28F0;BRAILLE PATTERN DOTS-5678;So;0;L;;;;;N;;;;; +28F1;BRAILLE PATTERN DOTS-15678;So;0;L;;;;;N;;;;; +28F2;BRAILLE PATTERN DOTS-25678;So;0;L;;;;;N;;;;; +28F3;BRAILLE PATTERN DOTS-125678;So;0;L;;;;;N;;;;; +28F4;BRAILLE PATTERN DOTS-35678;So;0;L;;;;;N;;;;; +28F5;BRAILLE PATTERN DOTS-135678;So;0;L;;;;;N;;;;; +28F6;BRAILLE PATTERN DOTS-235678;So;0;L;;;;;N;;;;; +28F7;BRAILLE PATTERN DOTS-1235678;So;0;L;;;;;N;;;;; +28F8;BRAILLE PATTERN DOTS-45678;So;0;L;;;;;N;;;;; +28F9;BRAILLE PATTERN DOTS-145678;So;0;L;;;;;N;;;;; +28FA;BRAILLE PATTERN DOTS-245678;So;0;L;;;;;N;;;;; +28FB;BRAILLE PATTERN DOTS-1245678;So;0;L;;;;;N;;;;; +28FC;BRAILLE PATTERN DOTS-345678;So;0;L;;;;;N;;;;; +28FD;BRAILLE PATTERN DOTS-1345678;So;0;L;;;;;N;;;;; +28FE;BRAILLE PATTERN DOTS-2345678;So;0;L;;;;;N;;;;; +28FF;BRAILLE PATTERN DOTS-12345678;So;0;L;;;;;N;;;;; +2900;RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2901;RIGHTWARDS TWO-HEADED ARROW WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2902;LEFTWARDS DOUBLE ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2903;RIGHTWARDS DOUBLE ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2904;LEFT RIGHT DOUBLE ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2905;RIGHTWARDS TWO-HEADED ARROW FROM BAR;Sm;0;ON;;;;;N;;;;; +2906;LEFTWARDS DOUBLE ARROW FROM BAR;Sm;0;ON;;;;;N;;;;; +2907;RIGHTWARDS DOUBLE ARROW FROM BAR;Sm;0;ON;;;;;N;;;;; +2908;DOWNWARDS ARROW WITH HORIZONTAL STROKE;Sm;0;ON;;;;;N;;;;; +2909;UPWARDS ARROW WITH HORIZONTAL STROKE;Sm;0;ON;;;;;N;;;;; +290A;UPWARDS TRIPLE ARROW;Sm;0;ON;;;;;N;;;;; +290B;DOWNWARDS TRIPLE ARROW;Sm;0;ON;;;;;N;;;;; +290C;LEFTWARDS DOUBLE DASH ARROW;Sm;0;ON;;;;;N;;;;; +290D;RIGHTWARDS DOUBLE DASH ARROW;Sm;0;ON;;;;;N;;;;; +290E;LEFTWARDS TRIPLE DASH ARROW;Sm;0;ON;;;;;N;;;;; +290F;RIGHTWARDS TRIPLE DASH ARROW;Sm;0;ON;;;;;N;;;;; +2910;RIGHTWARDS TWO-HEADED TRIPLE DASH ARROW;Sm;0;ON;;;;;N;;;;; +2911;RIGHTWARDS ARROW WITH DOTTED STEM;Sm;0;ON;;;;;N;;;;; +2912;UPWARDS ARROW TO BAR;Sm;0;ON;;;;;N;;;;; +2913;DOWNWARDS ARROW TO BAR;Sm;0;ON;;;;;N;;;;; +2914;RIGHTWARDS ARROW WITH TAIL WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2915;RIGHTWARDS ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2916;RIGHTWARDS TWO-HEADED ARROW WITH TAIL;Sm;0;ON;;;;;N;;;;; +2917;RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2918;RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2919;LEFTWARDS ARROW-TAIL;Sm;0;ON;;;;;N;;;;; +291A;RIGHTWARDS ARROW-TAIL;Sm;0;ON;;;;;N;;;;; +291B;LEFTWARDS DOUBLE ARROW-TAIL;Sm;0;ON;;;;;N;;;;; +291C;RIGHTWARDS DOUBLE ARROW-TAIL;Sm;0;ON;;;;;N;;;;; +291D;LEFTWARDS ARROW TO BLACK DIAMOND;Sm;0;ON;;;;;N;;;;; +291E;RIGHTWARDS ARROW TO BLACK DIAMOND;Sm;0;ON;;;;;N;;;;; +291F;LEFTWARDS ARROW FROM BAR TO BLACK DIAMOND;Sm;0;ON;;;;;N;;;;; +2920;RIGHTWARDS ARROW FROM BAR TO BLACK DIAMOND;Sm;0;ON;;;;;N;;;;; +2921;NORTH WEST AND SOUTH EAST ARROW;Sm;0;ON;;;;;N;;;;; +2922;NORTH EAST AND SOUTH WEST ARROW;Sm;0;ON;;;;;N;;;;; +2923;NORTH WEST ARROW WITH HOOK;Sm;0;ON;;;;;N;;;;; +2924;NORTH EAST ARROW WITH HOOK;Sm;0;ON;;;;;N;;;;; +2925;SOUTH EAST ARROW WITH HOOK;Sm;0;ON;;;;;N;;;;; +2926;SOUTH WEST ARROW WITH HOOK;Sm;0;ON;;;;;N;;;;; +2927;NORTH WEST ARROW AND NORTH EAST ARROW;Sm;0;ON;;;;;N;;;;; +2928;NORTH EAST ARROW AND SOUTH EAST ARROW;Sm;0;ON;;;;;N;;;;; +2929;SOUTH EAST ARROW AND SOUTH WEST ARROW;Sm;0;ON;;;;;N;;;;; +292A;SOUTH WEST ARROW AND NORTH WEST ARROW;Sm;0;ON;;;;;N;;;;; +292B;RISING DIAGONAL CROSSING FALLING DIAGONAL;Sm;0;ON;;;;;N;;;;; +292C;FALLING DIAGONAL CROSSING RISING DIAGONAL;Sm;0;ON;;;;;N;;;;; +292D;SOUTH EAST ARROW CROSSING NORTH EAST ARROW;Sm;0;ON;;;;;N;;;;; +292E;NORTH EAST ARROW CROSSING SOUTH EAST ARROW;Sm;0;ON;;;;;N;;;;; +292F;FALLING DIAGONAL CROSSING NORTH EAST ARROW;Sm;0;ON;;;;;N;;;;; +2930;RISING DIAGONAL CROSSING SOUTH EAST ARROW;Sm;0;ON;;;;;N;;;;; +2931;NORTH EAST ARROW CROSSING NORTH WEST ARROW;Sm;0;ON;;;;;N;;;;; +2932;NORTH WEST ARROW CROSSING NORTH EAST ARROW;Sm;0;ON;;;;;N;;;;; +2933;WAVE ARROW POINTING DIRECTLY RIGHT;Sm;0;ON;;;;;N;;;;; +2934;ARROW POINTING RIGHTWARDS THEN CURVING UPWARDS;Sm;0;ON;;;;;N;;;;; +2935;ARROW POINTING RIGHTWARDS THEN CURVING DOWNWARDS;Sm;0;ON;;;;;N;;;;; +2936;ARROW POINTING DOWNWARDS THEN CURVING LEFTWARDS;Sm;0;ON;;;;;N;;;;; +2937;ARROW POINTING DOWNWARDS THEN CURVING RIGHTWARDS;Sm;0;ON;;;;;N;;;;; +2938;RIGHT-SIDE ARC CLOCKWISE ARROW;Sm;0;ON;;;;;N;;;;; +2939;LEFT-SIDE ARC ANTICLOCKWISE ARROW;Sm;0;ON;;;;;N;;;;; +293A;TOP ARC ANTICLOCKWISE ARROW;Sm;0;ON;;;;;N;;;;; +293B;BOTTOM ARC ANTICLOCKWISE ARROW;Sm;0;ON;;;;;N;;;;; +293C;TOP ARC CLOCKWISE ARROW WITH MINUS;Sm;0;ON;;;;;N;;;;; +293D;TOP ARC ANTICLOCKWISE ARROW WITH PLUS;Sm;0;ON;;;;;N;;;;; +293E;LOWER RIGHT SEMICIRCULAR CLOCKWISE ARROW;Sm;0;ON;;;;;N;;;;; +293F;LOWER LEFT SEMICIRCULAR ANTICLOCKWISE ARROW;Sm;0;ON;;;;;N;;;;; +2940;ANTICLOCKWISE CLOSED CIRCLE ARROW;Sm;0;ON;;;;;N;;;;; +2941;CLOCKWISE CLOSED CIRCLE ARROW;Sm;0;ON;;;;;N;;;;; +2942;RIGHTWARDS ARROW ABOVE SHORT LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +2943;LEFTWARDS ARROW ABOVE SHORT RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +2944;SHORT RIGHTWARDS ARROW ABOVE LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +2945;RIGHTWARDS ARROW WITH PLUS BELOW;Sm;0;ON;;;;;N;;;;; +2946;LEFTWARDS ARROW WITH PLUS BELOW;Sm;0;ON;;;;;N;;;;; +2947;RIGHTWARDS ARROW THROUGH X;Sm;0;ON;;;;;N;;;;; +2948;LEFT RIGHT ARROW THROUGH SMALL CIRCLE;Sm;0;ON;;;;;N;;;;; +2949;UPWARDS TWO-HEADED ARROW FROM SMALL CIRCLE;Sm;0;ON;;;;;N;;;;; +294A;LEFT BARB UP RIGHT BARB DOWN HARPOON;Sm;0;ON;;;;;N;;;;; +294B;LEFT BARB DOWN RIGHT BARB UP HARPOON;Sm;0;ON;;;;;N;;;;; +294C;UP BARB RIGHT DOWN BARB LEFT HARPOON;Sm;0;ON;;;;;N;;;;; +294D;UP BARB LEFT DOWN BARB RIGHT HARPOON;Sm;0;ON;;;;;N;;;;; +294E;LEFT BARB UP RIGHT BARB UP HARPOON;Sm;0;ON;;;;;N;;;;; +294F;UP BARB RIGHT DOWN BARB RIGHT HARPOON;Sm;0;ON;;;;;N;;;;; +2950;LEFT BARB DOWN RIGHT BARB DOWN HARPOON;Sm;0;ON;;;;;N;;;;; +2951;UP BARB LEFT DOWN BARB LEFT HARPOON;Sm;0;ON;;;;;N;;;;; +2952;LEFTWARDS HARPOON WITH BARB UP TO BAR;Sm;0;ON;;;;;N;;;;; +2953;RIGHTWARDS HARPOON WITH BARB UP TO BAR;Sm;0;ON;;;;;N;;;;; +2954;UPWARDS HARPOON WITH BARB RIGHT TO BAR;Sm;0;ON;;;;;N;;;;; +2955;DOWNWARDS HARPOON WITH BARB RIGHT TO BAR;Sm;0;ON;;;;;N;;;;; +2956;LEFTWARDS HARPOON WITH BARB DOWN TO BAR;Sm;0;ON;;;;;N;;;;; +2957;RIGHTWARDS HARPOON WITH BARB DOWN TO BAR;Sm;0;ON;;;;;N;;;;; +2958;UPWARDS HARPOON WITH BARB LEFT TO BAR;Sm;0;ON;;;;;N;;;;; +2959;DOWNWARDS HARPOON WITH BARB LEFT TO BAR;Sm;0;ON;;;;;N;;;;; +295A;LEFTWARDS HARPOON WITH BARB UP FROM BAR;Sm;0;ON;;;;;N;;;;; +295B;RIGHTWARDS HARPOON WITH BARB UP FROM BAR;Sm;0;ON;;;;;N;;;;; +295C;UPWARDS HARPOON WITH BARB RIGHT FROM BAR;Sm;0;ON;;;;;N;;;;; +295D;DOWNWARDS HARPOON WITH BARB RIGHT FROM BAR;Sm;0;ON;;;;;N;;;;; +295E;LEFTWARDS HARPOON WITH BARB DOWN FROM BAR;Sm;0;ON;;;;;N;;;;; +295F;RIGHTWARDS HARPOON WITH BARB DOWN FROM BAR;Sm;0;ON;;;;;N;;;;; +2960;UPWARDS HARPOON WITH BARB LEFT FROM BAR;Sm;0;ON;;;;;N;;;;; +2961;DOWNWARDS HARPOON WITH BARB LEFT FROM BAR;Sm;0;ON;;;;;N;;;;; +2962;LEFTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB DOWN;Sm;0;ON;;;;;N;;;;; +2963;UPWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT;Sm;0;ON;;;;;N;;;;; +2964;RIGHTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB DOWN;Sm;0;ON;;;;;N;;;;; +2965;DOWNWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT;Sm;0;ON;;;;;N;;;;; +2966;LEFTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB UP;Sm;0;ON;;;;;N;;;;; +2967;LEFTWARDS HARPOON WITH BARB DOWN ABOVE RIGHTWARDS HARPOON WITH BARB DOWN;Sm;0;ON;;;;;N;;;;; +2968;RIGHTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB UP;Sm;0;ON;;;;;N;;;;; +2969;RIGHTWARDS HARPOON WITH BARB DOWN ABOVE LEFTWARDS HARPOON WITH BARB DOWN;Sm;0;ON;;;;;N;;;;; +296A;LEFTWARDS HARPOON WITH BARB UP ABOVE LONG DASH;Sm;0;ON;;;;;N;;;;; +296B;LEFTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH;Sm;0;ON;;;;;N;;;;; +296C;RIGHTWARDS HARPOON WITH BARB UP ABOVE LONG DASH;Sm;0;ON;;;;;N;;;;; +296D;RIGHTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH;Sm;0;ON;;;;;N;;;;; +296E;UPWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT;Sm;0;ON;;;;;N;;;;; +296F;DOWNWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT;Sm;0;ON;;;;;N;;;;; +2970;RIGHT DOUBLE ARROW WITH ROUNDED HEAD;Sm;0;ON;;;;;N;;;;; +2971;EQUALS SIGN ABOVE RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +2972;TILDE OPERATOR ABOVE RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +2973;LEFTWARDS ARROW ABOVE TILDE OPERATOR;Sm;0;ON;;;;;N;;;;; +2974;RIGHTWARDS ARROW ABOVE TILDE OPERATOR;Sm;0;ON;;;;;N;;;;; +2975;RIGHTWARDS ARROW ABOVE ALMOST EQUAL TO;Sm;0;ON;;;;;N;;;;; +2976;LESS-THAN ABOVE LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +2977;LEFTWARDS ARROW THROUGH LESS-THAN;Sm;0;ON;;;;;N;;;;; +2978;GREATER-THAN ABOVE RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +2979;SUBSET ABOVE RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +297A;LEFTWARDS ARROW THROUGH SUBSET;Sm;0;ON;;;;;N;;;;; +297B;SUPERSET ABOVE LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +297C;LEFT FISH TAIL;Sm;0;ON;;;;;N;;;;; +297D;RIGHT FISH TAIL;Sm;0;ON;;;;;N;;;;; +297E;UP FISH TAIL;Sm;0;ON;;;;;N;;;;; +297F;DOWN FISH TAIL;Sm;0;ON;;;;;N;;;;; +2980;TRIPLE VERTICAL BAR DELIMITER;Sm;0;ON;;;;;N;;;;; +2981;Z NOTATION SPOT;Sm;0;ON;;;;;N;;;;; +2982;Z NOTATION TYPE COLON;Sm;0;ON;;;;;N;;;;; +2983;LEFT WHITE CURLY BRACKET;Ps;0;ON;;;;;Y;;;;; +2984;RIGHT WHITE CURLY BRACKET;Pe;0;ON;;;;;Y;;;;; +2985;LEFT WHITE PARENTHESIS;Ps;0;ON;;;;;Y;;;;; +2986;RIGHT WHITE PARENTHESIS;Pe;0;ON;;;;;Y;;;;; +2987;Z NOTATION LEFT IMAGE BRACKET;Ps;0;ON;;;;;Y;;;;; +2988;Z NOTATION RIGHT IMAGE BRACKET;Pe;0;ON;;;;;Y;;;;; +2989;Z NOTATION LEFT BINDING BRACKET;Ps;0;ON;;;;;Y;;;;; +298A;Z NOTATION RIGHT BINDING BRACKET;Pe;0;ON;;;;;Y;;;;; +298B;LEFT SQUARE BRACKET WITH UNDERBAR;Ps;0;ON;;;;;Y;;;;; +298C;RIGHT SQUARE BRACKET WITH UNDERBAR;Pe;0;ON;;;;;Y;;;;; +298D;LEFT SQUARE BRACKET WITH TICK IN TOP CORNER;Ps;0;ON;;;;;Y;;;;; +298E;RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER;Pe;0;ON;;;;;Y;;;;; +298F;LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER;Ps;0;ON;;;;;Y;;;;; +2990;RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER;Pe;0;ON;;;;;Y;;;;; +2991;LEFT ANGLE BRACKET WITH DOT;Ps;0;ON;;;;;Y;;;;; +2992;RIGHT ANGLE BRACKET WITH DOT;Pe;0;ON;;;;;Y;;;;; +2993;LEFT ARC LESS-THAN BRACKET;Ps;0;ON;;;;;Y;;;;; +2994;RIGHT ARC GREATER-THAN BRACKET;Pe;0;ON;;;;;Y;;;;; +2995;DOUBLE LEFT ARC GREATER-THAN BRACKET;Ps;0;ON;;;;;Y;;;;; +2996;DOUBLE RIGHT ARC LESS-THAN BRACKET;Pe;0;ON;;;;;Y;;;;; +2997;LEFT BLACK TORTOISE SHELL BRACKET;Ps;0;ON;;;;;Y;;;;; +2998;RIGHT BLACK TORTOISE SHELL BRACKET;Pe;0;ON;;;;;Y;;;;; +2999;DOTTED FENCE;Sm;0;ON;;;;;N;;;;; +299A;VERTICAL ZIGZAG LINE;Sm;0;ON;;;;;N;;;;; +299B;MEASURED ANGLE OPENING LEFT;Sm;0;ON;;;;;Y;;;;; +299C;RIGHT ANGLE VARIANT WITH SQUARE;Sm;0;ON;;;;;Y;;;;; +299D;MEASURED RIGHT ANGLE WITH DOT;Sm;0;ON;;;;;Y;;;;; +299E;ANGLE WITH S INSIDE;Sm;0;ON;;;;;Y;;;;; +299F;ACUTE ANGLE;Sm;0;ON;;;;;Y;;;;; +29A0;SPHERICAL ANGLE OPENING LEFT;Sm;0;ON;;;;;Y;;;;; +29A1;SPHERICAL ANGLE OPENING UP;Sm;0;ON;;;;;N;;;;; +29A2;TURNED ANGLE;Sm;0;ON;;;;;Y;;;;; +29A3;REVERSED ANGLE;Sm;0;ON;;;;;Y;;;;; +29A4;ANGLE WITH UNDERBAR;Sm;0;ON;;;;;Y;;;;; +29A5;REVERSED ANGLE WITH UNDERBAR;Sm;0;ON;;;;;Y;;;;; +29A6;OBLIQUE ANGLE OPENING UP;Sm;0;ON;;;;;Y;;;;; +29A7;OBLIQUE ANGLE OPENING DOWN;Sm;0;ON;;;;;Y;;;;; +29A8;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND RIGHT;Sm;0;ON;;;;;Y;;;;; +29A9;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND LEFT;Sm;0;ON;;;;;Y;;;;; +29AA;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND RIGHT;Sm;0;ON;;;;;Y;;;;; +29AB;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND LEFT;Sm;0;ON;;;;;Y;;;;; +29AC;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND UP;Sm;0;ON;;;;;Y;;;;; +29AD;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND UP;Sm;0;ON;;;;;Y;;;;; +29AE;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND DOWN;Sm;0;ON;;;;;Y;;;;; +29AF;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND DOWN;Sm;0;ON;;;;;Y;;;;; +29B0;REVERSED EMPTY SET;Sm;0;ON;;;;;N;;;;; +29B1;EMPTY SET WITH OVERBAR;Sm;0;ON;;;;;N;;;;; +29B2;EMPTY SET WITH SMALL CIRCLE ABOVE;Sm;0;ON;;;;;N;;;;; +29B3;EMPTY SET WITH RIGHT ARROW ABOVE;Sm;0;ON;;;;;N;;;;; +29B4;EMPTY SET WITH LEFT ARROW ABOVE;Sm;0;ON;;;;;N;;;;; +29B5;CIRCLE WITH HORIZONTAL BAR;Sm;0;ON;;;;;N;;;;; +29B6;CIRCLED VERTICAL BAR;Sm;0;ON;;;;;N;;;;; +29B7;CIRCLED PARALLEL;Sm;0;ON;;;;;N;;;;; +29B8;CIRCLED REVERSE SOLIDUS;Sm;0;ON;;;;;Y;;;;; +29B9;CIRCLED PERPENDICULAR;Sm;0;ON;;;;;N;;;;; +29BA;CIRCLE DIVIDED BY HORIZONTAL BAR AND TOP HALF DIVIDED BY VERTICAL BAR;Sm;0;ON;;;;;N;;;;; +29BB;CIRCLE WITH SUPERIMPOSED X;Sm;0;ON;;;;;N;;;;; +29BC;CIRCLED ANTICLOCKWISE-ROTATED DIVISION SIGN;Sm;0;ON;;;;;N;;;;; +29BD;UP ARROW THROUGH CIRCLE;Sm;0;ON;;;;;N;;;;; +29BE;CIRCLED WHITE BULLET;Sm;0;ON;;;;;N;;;;; +29BF;CIRCLED BULLET;Sm;0;ON;;;;;N;;;;; +29C0;CIRCLED LESS-THAN;Sm;0;ON;;;;;Y;;;;; +29C1;CIRCLED GREATER-THAN;Sm;0;ON;;;;;Y;;;;; +29C2;CIRCLE WITH SMALL CIRCLE TO THE RIGHT;Sm;0;ON;;;;;Y;;;;; +29C3;CIRCLE WITH TWO HORIZONTAL STROKES TO THE RIGHT;Sm;0;ON;;;;;Y;;;;; +29C4;SQUARED RISING DIAGONAL SLASH;Sm;0;ON;;;;;Y;;;;; +29C5;SQUARED FALLING DIAGONAL SLASH;Sm;0;ON;;;;;Y;;;;; +29C6;SQUARED ASTERISK;Sm;0;ON;;;;;N;;;;; +29C7;SQUARED SMALL CIRCLE;Sm;0;ON;;;;;N;;;;; +29C8;SQUARED SQUARE;Sm;0;ON;;;;;N;;;;; +29C9;TWO JOINED SQUARES;Sm;0;ON;;;;;Y;;;;; +29CA;TRIANGLE WITH DOT ABOVE;Sm;0;ON;;;;;N;;;;; +29CB;TRIANGLE WITH UNDERBAR;Sm;0;ON;;;;;N;;;;; +29CC;S IN TRIANGLE;Sm;0;ON;;;;;N;;;;; +29CD;TRIANGLE WITH SERIFS AT BOTTOM;Sm;0;ON;;;;;N;;;;; +29CE;RIGHT TRIANGLE ABOVE LEFT TRIANGLE;Sm;0;ON;;;;;Y;;;;; +29CF;LEFT TRIANGLE BESIDE VERTICAL BAR;Sm;0;ON;;;;;Y;;;;; +29D0;VERTICAL BAR BESIDE RIGHT TRIANGLE;Sm;0;ON;;;;;Y;;;;; +29D1;BOWTIE WITH LEFT HALF BLACK;Sm;0;ON;;;;;Y;;;;; +29D2;BOWTIE WITH RIGHT HALF BLACK;Sm;0;ON;;;;;Y;;;;; +29D3;BLACK BOWTIE;Sm;0;ON;;;;;N;;;;; +29D4;TIMES WITH LEFT HALF BLACK;Sm;0;ON;;;;;Y;;;;; +29D5;TIMES WITH RIGHT HALF BLACK;Sm;0;ON;;;;;Y;;;;; +29D6;WHITE HOURGLASS;Sm;0;ON;;;;;N;;;;; +29D7;BLACK HOURGLASS;Sm;0;ON;;;;;N;;;;; +29D8;LEFT WIGGLY FENCE;Ps;0;ON;;;;;Y;;;;; +29D9;RIGHT WIGGLY FENCE;Pe;0;ON;;;;;Y;;;;; +29DA;LEFT DOUBLE WIGGLY FENCE;Ps;0;ON;;;;;Y;;;;; +29DB;RIGHT DOUBLE WIGGLY FENCE;Pe;0;ON;;;;;Y;;;;; +29DC;INCOMPLETE INFINITY;Sm;0;ON;;;;;Y;;;;; +29DD;TIE OVER INFINITY;Sm;0;ON;;;;;N;;;;; +29DE;INFINITY NEGATED WITH VERTICAL BAR;Sm;0;ON;;;;;N;;;;; +29DF;DOUBLE-ENDED MULTIMAP;Sm;0;ON;;;;;N;;;;; +29E0;SQUARE WITH CONTOURED OUTLINE;Sm;0;ON;;;;;N;;;;; +29E1;INCREASES AS;Sm;0;ON;;;;;Y;;;;; +29E2;SHUFFLE PRODUCT;Sm;0;ON;;;;;N;;;;; +29E3;EQUALS SIGN AND SLANTED PARALLEL;Sm;0;ON;;;;;Y;;;;; +29E4;EQUALS SIGN AND SLANTED PARALLEL WITH TILDE ABOVE;Sm;0;ON;;;;;Y;;;;; +29E5;IDENTICAL TO AND SLANTED PARALLEL;Sm;0;ON;;;;;Y;;;;; +29E6;GLEICH STARK;Sm;0;ON;;;;;N;;;;; +29E7;THERMODYNAMIC;Sm;0;ON;;;;;N;;;;; +29E8;DOWN-POINTING TRIANGLE WITH LEFT HALF BLACK;Sm;0;ON;;;;;Y;;;;; +29E9;DOWN-POINTING TRIANGLE WITH RIGHT HALF BLACK;Sm;0;ON;;;;;Y;;;;; +29EA;BLACK DIAMOND WITH DOWN ARROW;Sm;0;ON;;;;;N;;;;; +29EB;BLACK LOZENGE;Sm;0;ON;;;;;N;;;;; +29EC;WHITE CIRCLE WITH DOWN ARROW;Sm;0;ON;;;;;N;;;;; +29ED;BLACK CIRCLE WITH DOWN ARROW;Sm;0;ON;;;;;N;;;;; +29EE;ERROR-BARRED WHITE SQUARE;Sm;0;ON;;;;;N;;;;; +29EF;ERROR-BARRED BLACK SQUARE;Sm;0;ON;;;;;N;;;;; +29F0;ERROR-BARRED WHITE DIAMOND;Sm;0;ON;;;;;N;;;;; +29F1;ERROR-BARRED BLACK DIAMOND;Sm;0;ON;;;;;N;;;;; +29F2;ERROR-BARRED WHITE CIRCLE;Sm;0;ON;;;;;N;;;;; +29F3;ERROR-BARRED BLACK CIRCLE;Sm;0;ON;;;;;N;;;;; +29F4;RULE-DELAYED;Sm;0;ON;;;;;Y;;;;; +29F5;REVERSE SOLIDUS OPERATOR;Sm;0;ON;;;;;Y;;;;; +29F6;SOLIDUS WITH OVERBAR;Sm;0;ON;;;;;Y;;;;; +29F7;REVERSE SOLIDUS WITH HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;; +29F8;BIG SOLIDUS;Sm;0;ON;;;;;Y;;;;; +29F9;BIG REVERSE SOLIDUS;Sm;0;ON;;;;;Y;;;;; +29FA;DOUBLE PLUS;Sm;0;ON;;;;;N;;;;; +29FB;TRIPLE PLUS;Sm;0;ON;;;;;N;;;;; +29FC;LEFT-POINTING CURVED ANGLE BRACKET;Ps;0;ON;;;;;Y;;;;; +29FD;RIGHT-POINTING CURVED ANGLE BRACKET;Pe;0;ON;;;;;Y;;;;; +29FE;TINY;Sm;0;ON;;;;;N;;;;; +29FF;MINY;Sm;0;ON;;;;;N;;;;; +2A00;N-ARY CIRCLED DOT OPERATOR;Sm;0;ON;;;;;N;;;;; +2A01;N-ARY CIRCLED PLUS OPERATOR;Sm;0;ON;;;;;N;;;;; +2A02;N-ARY CIRCLED TIMES OPERATOR;Sm;0;ON;;;;;N;;;;; +2A03;N-ARY UNION OPERATOR WITH DOT;Sm;0;ON;;;;;N;;;;; +2A04;N-ARY UNION OPERATOR WITH PLUS;Sm;0;ON;;;;;N;;;;; +2A05;N-ARY SQUARE INTERSECTION OPERATOR;Sm;0;ON;;;;;N;;;;; +2A06;N-ARY SQUARE UNION OPERATOR;Sm;0;ON;;;;;N;;;;; +2A07;TWO LOGICAL AND OPERATOR;Sm;0;ON;;;;;N;;;;; +2A08;TWO LOGICAL OR OPERATOR;Sm;0;ON;;;;;N;;;;; +2A09;N-ARY TIMES OPERATOR;Sm;0;ON;;;;;N;;;;; +2A0A;MODULO TWO SUM;Sm;0;ON;;;;;Y;;;;; +2A0B;SUMMATION WITH INTEGRAL;Sm;0;ON;;;;;Y;;;;; +2A0C;QUADRUPLE INTEGRAL OPERATOR;Sm;0;ON;<compat> 222B 222B 222B 222B;;;;Y;;;;; +2A0D;FINITE PART INTEGRAL;Sm;0;ON;;;;;Y;;;;; +2A0E;INTEGRAL WITH DOUBLE STROKE;Sm;0;ON;;;;;Y;;;;; +2A0F;INTEGRAL AVERAGE WITH SLASH;Sm;0;ON;;;;;Y;;;;; +2A10;CIRCULATION FUNCTION;Sm;0;ON;;;;;Y;;;;; +2A11;ANTICLOCKWISE INTEGRATION;Sm;0;ON;;;;;Y;;;;; +2A12;LINE INTEGRATION WITH RECTANGULAR PATH AROUND POLE;Sm;0;ON;;;;;Y;;;;; +2A13;LINE INTEGRATION WITH SEMICIRCULAR PATH AROUND POLE;Sm;0;ON;;;;;Y;;;;; +2A14;LINE INTEGRATION NOT INCLUDING THE POLE;Sm;0;ON;;;;;Y;;;;; +2A15;INTEGRAL AROUND A POINT OPERATOR;Sm;0;ON;;;;;Y;;;;; +2A16;QUATERNION INTEGRAL OPERATOR;Sm;0;ON;;;;;Y;;;;; +2A17;INTEGRAL WITH LEFTWARDS ARROW WITH HOOK;Sm;0;ON;;;;;Y;;;;; +2A18;INTEGRAL WITH TIMES SIGN;Sm;0;ON;;;;;Y;;;;; +2A19;INTEGRAL WITH INTERSECTION;Sm;0;ON;;;;;Y;;;;; +2A1A;INTEGRAL WITH UNION;Sm;0;ON;;;;;Y;;;;; +2A1B;INTEGRAL WITH OVERBAR;Sm;0;ON;;;;;Y;;;;; +2A1C;INTEGRAL WITH UNDERBAR;Sm;0;ON;;;;;Y;;;;; +2A1D;JOIN;Sm;0;ON;;;;;N;;;;; +2A1E;LARGE LEFT TRIANGLE OPERATOR;Sm;0;ON;;;;;Y;;;;; +2A1F;Z NOTATION SCHEMA COMPOSITION;Sm;0;ON;;;;;Y;;;;; +2A20;Z NOTATION SCHEMA PIPING;Sm;0;ON;;;;;Y;;;;; +2A21;Z NOTATION SCHEMA PROJECTION;Sm;0;ON;;;;;Y;;;;; +2A22;PLUS SIGN WITH SMALL CIRCLE ABOVE;Sm;0;ON;;;;;N;;;;; +2A23;PLUS SIGN WITH CIRCUMFLEX ACCENT ABOVE;Sm;0;ON;;;;;N;;;;; +2A24;PLUS SIGN WITH TILDE ABOVE;Sm;0;ON;;;;;Y;;;;; +2A25;PLUS SIGN WITH DOT BELOW;Sm;0;ON;;;;;N;;;;; +2A26;PLUS SIGN WITH TILDE BELOW;Sm;0;ON;;;;;Y;;;;; +2A27;PLUS SIGN WITH SUBSCRIPT TWO;Sm;0;ON;;;;;N;;;;; +2A28;PLUS SIGN WITH BLACK TRIANGLE;Sm;0;ON;;;;;N;;;;; +2A29;MINUS SIGN WITH COMMA ABOVE;Sm;0;ON;;;;;Y;;;;; +2A2A;MINUS SIGN WITH DOT BELOW;Sm;0;ON;;;;;N;;;;; +2A2B;MINUS SIGN WITH FALLING DOTS;Sm;0;ON;;;;;Y;;;;; +2A2C;MINUS SIGN WITH RISING DOTS;Sm;0;ON;;;;;Y;;;;; +2A2D;PLUS SIGN IN LEFT HALF CIRCLE;Sm;0;ON;;;;;Y;;;;; +2A2E;PLUS SIGN IN RIGHT HALF CIRCLE;Sm;0;ON;;;;;Y;;;;; +2A2F;VECTOR OR CROSS PRODUCT;Sm;0;ON;;;;;N;;;;; +2A30;MULTIPLICATION SIGN WITH DOT ABOVE;Sm;0;ON;;;;;N;;;;; +2A31;MULTIPLICATION SIGN WITH UNDERBAR;Sm;0;ON;;;;;N;;;;; +2A32;SEMIDIRECT PRODUCT WITH BOTTOM CLOSED;Sm;0;ON;;;;;N;;;;; +2A33;SMASH PRODUCT;Sm;0;ON;;;;;N;;;;; +2A34;MULTIPLICATION SIGN IN LEFT HALF CIRCLE;Sm;0;ON;;;;;Y;;;;; +2A35;MULTIPLICATION SIGN IN RIGHT HALF CIRCLE;Sm;0;ON;;;;;Y;;;;; +2A36;CIRCLED MULTIPLICATION SIGN WITH CIRCUMFLEX ACCENT;Sm;0;ON;;;;;N;;;;; +2A37;MULTIPLICATION SIGN IN DOUBLE CIRCLE;Sm;0;ON;;;;;N;;;;; +2A38;CIRCLED DIVISION SIGN;Sm;0;ON;;;;;N;;;;; +2A39;PLUS SIGN IN TRIANGLE;Sm;0;ON;;;;;N;;;;; +2A3A;MINUS SIGN IN TRIANGLE;Sm;0;ON;;;;;N;;;;; +2A3B;MULTIPLICATION SIGN IN TRIANGLE;Sm;0;ON;;;;;N;;;;; +2A3C;INTERIOR PRODUCT;Sm;0;ON;;;;;Y;;;;; +2A3D;RIGHTHAND INTERIOR PRODUCT;Sm;0;ON;;;;;Y;;;;; +2A3E;Z NOTATION RELATIONAL COMPOSITION;Sm;0;ON;;;;;Y;;;;; +2A3F;AMALGAMATION OR COPRODUCT;Sm;0;ON;;;;;N;;;;; +2A40;INTERSECTION WITH DOT;Sm;0;ON;;;;;N;;;;; +2A41;UNION WITH MINUS SIGN;Sm;0;ON;;;;;N;;;;; +2A42;UNION WITH OVERBAR;Sm;0;ON;;;;;N;;;;; +2A43;INTERSECTION WITH OVERBAR;Sm;0;ON;;;;;N;;;;; +2A44;INTERSECTION WITH LOGICAL AND;Sm;0;ON;;;;;N;;;;; +2A45;UNION WITH LOGICAL OR;Sm;0;ON;;;;;N;;;;; +2A46;UNION ABOVE INTERSECTION;Sm;0;ON;;;;;N;;;;; +2A47;INTERSECTION ABOVE UNION;Sm;0;ON;;;;;N;;;;; +2A48;UNION ABOVE BAR ABOVE INTERSECTION;Sm;0;ON;;;;;N;;;;; +2A49;INTERSECTION ABOVE BAR ABOVE UNION;Sm;0;ON;;;;;N;;;;; +2A4A;UNION BESIDE AND JOINED WITH UNION;Sm;0;ON;;;;;N;;;;; +2A4B;INTERSECTION BESIDE AND JOINED WITH INTERSECTION;Sm;0;ON;;;;;N;;;;; +2A4C;CLOSED UNION WITH SERIFS;Sm;0;ON;;;;;N;;;;; +2A4D;CLOSED INTERSECTION WITH SERIFS;Sm;0;ON;;;;;N;;;;; +2A4E;DOUBLE SQUARE INTERSECTION;Sm;0;ON;;;;;N;;;;; +2A4F;DOUBLE SQUARE UNION;Sm;0;ON;;;;;N;;;;; +2A50;CLOSED UNION WITH SERIFS AND SMASH PRODUCT;Sm;0;ON;;;;;N;;;;; +2A51;LOGICAL AND WITH DOT ABOVE;Sm;0;ON;;;;;N;;;;; +2A52;LOGICAL OR WITH DOT ABOVE;Sm;0;ON;;;;;N;;;;; +2A53;DOUBLE LOGICAL AND;Sm;0;ON;;;;;N;;;;; +2A54;DOUBLE LOGICAL OR;Sm;0;ON;;;;;N;;;;; +2A55;TWO INTERSECTING LOGICAL AND;Sm;0;ON;;;;;N;;;;; +2A56;TWO INTERSECTING LOGICAL OR;Sm;0;ON;;;;;N;;;;; +2A57;SLOPING LARGE OR;Sm;0;ON;;;;;Y;;;;; +2A58;SLOPING LARGE AND;Sm;0;ON;;;;;Y;;;;; +2A59;LOGICAL OR OVERLAPPING LOGICAL AND;Sm;0;ON;;;;;N;;;;; +2A5A;LOGICAL AND WITH MIDDLE STEM;Sm;0;ON;;;;;N;;;;; +2A5B;LOGICAL OR WITH MIDDLE STEM;Sm;0;ON;;;;;N;;;;; +2A5C;LOGICAL AND WITH HORIZONTAL DASH;Sm;0;ON;;;;;N;;;;; +2A5D;LOGICAL OR WITH HORIZONTAL DASH;Sm;0;ON;;;;;N;;;;; +2A5E;LOGICAL AND WITH DOUBLE OVERBAR;Sm;0;ON;;;;;N;;;;; +2A5F;LOGICAL AND WITH UNDERBAR;Sm;0;ON;;;;;N;;;;; +2A60;LOGICAL AND WITH DOUBLE UNDERBAR;Sm;0;ON;;;;;N;;;;; +2A61;SMALL VEE WITH UNDERBAR;Sm;0;ON;;;;;N;;;;; +2A62;LOGICAL OR WITH DOUBLE OVERBAR;Sm;0;ON;;;;;N;;;;; +2A63;LOGICAL OR WITH DOUBLE UNDERBAR;Sm;0;ON;;;;;N;;;;; +2A64;Z NOTATION DOMAIN ANTIRESTRICTION;Sm;0;ON;;;;;Y;;;;; +2A65;Z NOTATION RANGE ANTIRESTRICTION;Sm;0;ON;;;;;Y;;;;; +2A66;EQUALS SIGN WITH DOT BELOW;Sm;0;ON;;;;;N;;;;; +2A67;IDENTICAL WITH DOT ABOVE;Sm;0;ON;;;;;N;;;;; +2A68;TRIPLE HORIZONTAL BAR WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2A69;TRIPLE HORIZONTAL BAR WITH TRIPLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2A6A;TILDE OPERATOR WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;; +2A6B;TILDE OPERATOR WITH RISING DOTS;Sm;0;ON;;;;;Y;;;;; +2A6C;SIMILAR MINUS SIMILAR;Sm;0;ON;;;;;Y;;;;; +2A6D;CONGRUENT WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;; +2A6E;EQUALS WITH ASTERISK;Sm;0;ON;;;;;N;;;;; +2A6F;ALMOST EQUAL TO WITH CIRCUMFLEX ACCENT;Sm;0;ON;;;;;Y;;;;; +2A70;APPROXIMATELY EQUAL OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2A71;EQUALS SIGN ABOVE PLUS SIGN;Sm;0;ON;;;;;N;;;;; +2A72;PLUS SIGN ABOVE EQUALS SIGN;Sm;0;ON;;;;;N;;;;; +2A73;EQUALS SIGN ABOVE TILDE OPERATOR;Sm;0;ON;;;;;Y;;;;; +2A74;DOUBLE COLON EQUAL;Sm;0;ON;<compat> 003A 003A 003D;;;;Y;;;;; +2A75;TWO CONSECUTIVE EQUALS SIGNS;Sm;0;ON;<compat> 003D 003D;;;;N;;;;; +2A76;THREE CONSECUTIVE EQUALS SIGNS;Sm;0;ON;<compat> 003D 003D 003D;;;;N;;;;; +2A77;EQUALS SIGN WITH TWO DOTS ABOVE AND TWO DOTS BELOW;Sm;0;ON;;;;;N;;;;; +2A78;EQUIVALENT WITH FOUR DOTS ABOVE;Sm;0;ON;;;;;N;;;;; +2A79;LESS-THAN WITH CIRCLE INSIDE;Sm;0;ON;;;;;Y;;;;; +2A7A;GREATER-THAN WITH CIRCLE INSIDE;Sm;0;ON;;;;;Y;;;;; +2A7B;LESS-THAN WITH QUESTION MARK ABOVE;Sm;0;ON;;;;;Y;;;;; +2A7C;GREATER-THAN WITH QUESTION MARK ABOVE;Sm;0;ON;;;;;Y;;;;; +2A7D;LESS-THAN OR SLANTED EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2A7E;GREATER-THAN OR SLANTED EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2A7F;LESS-THAN OR SLANTED EQUAL TO WITH DOT INSIDE;Sm;0;ON;;;;;Y;;;;; +2A80;GREATER-THAN OR SLANTED EQUAL TO WITH DOT INSIDE;Sm;0;ON;;;;;Y;;;;; +2A81;LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;; +2A82;GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;; +2A83;LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE RIGHT;Sm;0;ON;;;;;Y;;;;; +2A84;GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE LEFT;Sm;0;ON;;;;;Y;;;;; +2A85;LESS-THAN OR APPROXIMATE;Sm;0;ON;;;;;Y;;;;; +2A86;GREATER-THAN OR APPROXIMATE;Sm;0;ON;;;;;Y;;;;; +2A87;LESS-THAN AND SINGLE-LINE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2A88;GREATER-THAN AND SINGLE-LINE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2A89;LESS-THAN AND NOT APPROXIMATE;Sm;0;ON;;;;;Y;;;;; +2A8A;GREATER-THAN AND NOT APPROXIMATE;Sm;0;ON;;;;;Y;;;;; +2A8B;LESS-THAN ABOVE DOUBLE-LINE EQUAL ABOVE GREATER-THAN;Sm;0;ON;;;;;Y;;;;; +2A8C;GREATER-THAN ABOVE DOUBLE-LINE EQUAL ABOVE LESS-THAN;Sm;0;ON;;;;;Y;;;;; +2A8D;LESS-THAN ABOVE SIMILAR OR EQUAL;Sm;0;ON;;;;;Y;;;;; +2A8E;GREATER-THAN ABOVE SIMILAR OR EQUAL;Sm;0;ON;;;;;Y;;;;; +2A8F;LESS-THAN ABOVE SIMILAR ABOVE GREATER-THAN;Sm;0;ON;;;;;Y;;;;; +2A90;GREATER-THAN ABOVE SIMILAR ABOVE LESS-THAN;Sm;0;ON;;;;;Y;;;;; +2A91;LESS-THAN ABOVE GREATER-THAN ABOVE DOUBLE-LINE EQUAL;Sm;0;ON;;;;;Y;;;;; +2A92;GREATER-THAN ABOVE LESS-THAN ABOVE DOUBLE-LINE EQUAL;Sm;0;ON;;;;;Y;;;;; +2A93;LESS-THAN ABOVE SLANTED EQUAL ABOVE GREATER-THAN ABOVE SLANTED EQUAL;Sm;0;ON;;;;;Y;;;;; +2A94;GREATER-THAN ABOVE SLANTED EQUAL ABOVE LESS-THAN ABOVE SLANTED EQUAL;Sm;0;ON;;;;;Y;;;;; +2A95;SLANTED EQUAL TO OR LESS-THAN;Sm;0;ON;;;;;Y;;;;; +2A96;SLANTED EQUAL TO OR GREATER-THAN;Sm;0;ON;;;;;Y;;;;; +2A97;SLANTED EQUAL TO OR LESS-THAN WITH DOT INSIDE;Sm;0;ON;;;;;Y;;;;; +2A98;SLANTED EQUAL TO OR GREATER-THAN WITH DOT INSIDE;Sm;0;ON;;;;;Y;;;;; +2A99;DOUBLE-LINE EQUAL TO OR LESS-THAN;Sm;0;ON;;;;;Y;;;;; +2A9A;DOUBLE-LINE EQUAL TO OR GREATER-THAN;Sm;0;ON;;;;;Y;;;;; +2A9B;DOUBLE-LINE SLANTED EQUAL TO OR LESS-THAN;Sm;0;ON;;;;;Y;;;;; +2A9C;DOUBLE-LINE SLANTED EQUAL TO OR GREATER-THAN;Sm;0;ON;;;;;Y;;;;; +2A9D;SIMILAR OR LESS-THAN;Sm;0;ON;;;;;Y;;;;; +2A9E;SIMILAR OR GREATER-THAN;Sm;0;ON;;;;;Y;;;;; +2A9F;SIMILAR ABOVE LESS-THAN ABOVE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;; +2AA0;SIMILAR ABOVE GREATER-THAN ABOVE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;; +2AA1;DOUBLE NESTED LESS-THAN;Sm;0;ON;;;;;Y;;;;; +2AA2;DOUBLE NESTED GREATER-THAN;Sm;0;ON;;;;;Y;;;;; +2AA3;DOUBLE NESTED LESS-THAN WITH UNDERBAR;Sm;0;ON;;;;;Y;;;;; +2AA4;GREATER-THAN OVERLAPPING LESS-THAN;Sm;0;ON;;;;;N;;;;; +2AA5;GREATER-THAN BESIDE LESS-THAN;Sm;0;ON;;;;;N;;;;; +2AA6;LESS-THAN CLOSED BY CURVE;Sm;0;ON;;;;;Y;;;;; +2AA7;GREATER-THAN CLOSED BY CURVE;Sm;0;ON;;;;;Y;;;;; +2AA8;LESS-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL;Sm;0;ON;;;;;Y;;;;; +2AA9;GREATER-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL;Sm;0;ON;;;;;Y;;;;; +2AAA;SMALLER THAN;Sm;0;ON;;;;;Y;;;;; +2AAB;LARGER THAN;Sm;0;ON;;;;;Y;;;;; +2AAC;SMALLER THAN OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2AAD;LARGER THAN OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2AAE;EQUALS SIGN WITH BUMPY ABOVE;Sm;0;ON;;;;;N;;;;; +2AAF;PRECEDES ABOVE SINGLE-LINE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;; +2AB0;SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;; +2AB1;PRECEDES ABOVE SINGLE-LINE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2AB2;SUCCEEDS ABOVE SINGLE-LINE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2AB3;PRECEDES ABOVE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;; +2AB4;SUCCEEDS ABOVE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;; +2AB5;PRECEDES ABOVE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2AB6;SUCCEEDS ABOVE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2AB7;PRECEDES ABOVE ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2AB8;SUCCEEDS ABOVE ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2AB9;PRECEDES ABOVE NOT ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2ABA;SUCCEEDS ABOVE NOT ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2ABB;DOUBLE PRECEDES;Sm;0;ON;;;;;Y;;;;; +2ABC;DOUBLE SUCCEEDS;Sm;0;ON;;;;;Y;;;;; +2ABD;SUBSET WITH DOT;Sm;0;ON;;;;;Y;;;;; +2ABE;SUPERSET WITH DOT;Sm;0;ON;;;;;Y;;;;; +2ABF;SUBSET WITH PLUS SIGN BELOW;Sm;0;ON;;;;;Y;;;;; +2AC0;SUPERSET WITH PLUS SIGN BELOW;Sm;0;ON;;;;;Y;;;;; +2AC1;SUBSET WITH MULTIPLICATION SIGN BELOW;Sm;0;ON;;;;;Y;;;;; +2AC2;SUPERSET WITH MULTIPLICATION SIGN BELOW;Sm;0;ON;;;;;Y;;;;; +2AC3;SUBSET OF OR EQUAL TO WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;; +2AC4;SUPERSET OF OR EQUAL TO WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;; +2AC5;SUBSET OF ABOVE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;; +2AC6;SUPERSET OF ABOVE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;; +2AC7;SUBSET OF ABOVE TILDE OPERATOR;Sm;0;ON;;;;;Y;;;;; +2AC8;SUPERSET OF ABOVE TILDE OPERATOR;Sm;0;ON;;;;;Y;;;;; +2AC9;SUBSET OF ABOVE ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2ACA;SUPERSET OF ABOVE ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2ACB;SUBSET OF ABOVE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2ACC;SUPERSET OF ABOVE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2ACD;SQUARE LEFT OPEN BOX OPERATOR;Sm;0;ON;;;;;Y;;;;; +2ACE;SQUARE RIGHT OPEN BOX OPERATOR;Sm;0;ON;;;;;Y;;;;; +2ACF;CLOSED SUBSET;Sm;0;ON;;;;;Y;;;;; +2AD0;CLOSED SUPERSET;Sm;0;ON;;;;;Y;;;;; +2AD1;CLOSED SUBSET OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2AD2;CLOSED SUPERSET OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2AD3;SUBSET ABOVE SUPERSET;Sm;0;ON;;;;;Y;;;;; +2AD4;SUPERSET ABOVE SUBSET;Sm;0;ON;;;;;Y;;;;; +2AD5;SUBSET ABOVE SUBSET;Sm;0;ON;;;;;Y;;;;; +2AD6;SUPERSET ABOVE SUPERSET;Sm;0;ON;;;;;Y;;;;; +2AD7;SUPERSET BESIDE SUBSET;Sm;0;ON;;;;;N;;;;; +2AD8;SUPERSET BESIDE AND JOINED BY DASH WITH SUBSET;Sm;0;ON;;;;;N;;;;; +2AD9;ELEMENT OF OPENING DOWNWARDS;Sm;0;ON;;;;;N;;;;; +2ADA;PITCHFORK WITH TEE TOP;Sm;0;ON;;;;;N;;;;; +2ADB;TRANSVERSAL INTERSECTION;Sm;0;ON;;;;;N;;;;; +2ADC;FORKING;Sm;0;ON;2ADD 0338;;;;Y;;;;; +2ADD;NONFORKING;Sm;0;ON;;;;;N;;;;; +2ADE;SHORT LEFT TACK;Sm;0;ON;;;;;Y;;;;; +2ADF;SHORT DOWN TACK;Sm;0;ON;;;;;N;;;;; +2AE0;SHORT UP TACK;Sm;0;ON;;;;;N;;;;; +2AE1;PERPENDICULAR WITH S;Sm;0;ON;;;;;N;;;;; +2AE2;VERTICAL BAR TRIPLE RIGHT TURNSTILE;Sm;0;ON;;;;;Y;;;;; +2AE3;DOUBLE VERTICAL BAR LEFT TURNSTILE;Sm;0;ON;;;;;Y;;;;; +2AE4;VERTICAL BAR DOUBLE LEFT TURNSTILE;Sm;0;ON;;;;;Y;;;;; +2AE5;DOUBLE VERTICAL BAR DOUBLE LEFT TURNSTILE;Sm;0;ON;;;;;Y;;;;; +2AE6;LONG DASH FROM LEFT MEMBER OF DOUBLE VERTICAL;Sm;0;ON;;;;;Y;;;;; +2AE7;SHORT DOWN TACK WITH OVERBAR;Sm;0;ON;;;;;N;;;;; +2AE8;SHORT UP TACK WITH UNDERBAR;Sm;0;ON;;;;;N;;;;; +2AE9;SHORT UP TACK ABOVE SHORT DOWN TACK;Sm;0;ON;;;;;N;;;;; +2AEA;DOUBLE DOWN TACK;Sm;0;ON;;;;;N;;;;; +2AEB;DOUBLE UP TACK;Sm;0;ON;;;;;N;;;;; +2AEC;DOUBLE STROKE NOT SIGN;Sm;0;ON;;;;;Y;;;;; +2AED;REVERSED DOUBLE STROKE NOT SIGN;Sm;0;ON;;;;;Y;;;;; +2AEE;DOES NOT DIVIDE WITH REVERSED NEGATION SLASH;Sm;0;ON;;;;;Y;;;;; +2AEF;VERTICAL LINE WITH CIRCLE ABOVE;Sm;0;ON;;;;;N;;;;; +2AF0;VERTICAL LINE WITH CIRCLE BELOW;Sm;0;ON;;;;;N;;;;; +2AF1;DOWN TACK WITH CIRCLE BELOW;Sm;0;ON;;;;;N;;;;; +2AF2;PARALLEL WITH HORIZONTAL STROKE;Sm;0;ON;;;;;N;;;;; +2AF3;PARALLEL WITH TILDE OPERATOR;Sm;0;ON;;;;;Y;;;;; +2AF4;TRIPLE VERTICAL BAR BINARY RELATION;Sm;0;ON;;;;;N;;;;; +2AF5;TRIPLE VERTICAL BAR WITH HORIZONTAL STROKE;Sm;0;ON;;;;;N;;;;; +2AF6;TRIPLE COLON OPERATOR;Sm;0;ON;;;;;N;;;;; +2AF7;TRIPLE NESTED LESS-THAN;Sm;0;ON;;;;;Y;;;;; +2AF8;TRIPLE NESTED GREATER-THAN;Sm;0;ON;;;;;Y;;;;; +2AF9;DOUBLE-LINE SLANTED LESS-THAN OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2AFA;DOUBLE-LINE SLANTED GREATER-THAN OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2AFB;TRIPLE SOLIDUS BINARY RELATION;Sm;0;ON;;;;;Y;;;;; +2AFC;LARGE TRIPLE VERTICAL BAR OPERATOR;Sm;0;ON;;;;;N;;;;; +2AFD;DOUBLE SOLIDUS OPERATOR;Sm;0;ON;;;;;Y;;;;; +2AFE;WHITE VERTICAL BAR;Sm;0;ON;;;;;N;;;;; +2AFF;N-ARY WHITE VERTICAL BAR;Sm;0;ON;;;;;N;;;;; +2B00;NORTH EAST WHITE ARROW;So;0;ON;;;;;N;;;;; +2B01;NORTH WEST WHITE ARROW;So;0;ON;;;;;N;;;;; +2B02;SOUTH EAST WHITE ARROW;So;0;ON;;;;;N;;;;; +2B03;SOUTH WEST WHITE ARROW;So;0;ON;;;;;N;;;;; +2B04;LEFT RIGHT WHITE ARROW;So;0;ON;;;;;N;;;;; +2B05;LEFTWARDS BLACK ARROW;So;0;ON;;;;;N;;;;; +2B06;UPWARDS BLACK ARROW;So;0;ON;;;;;N;;;;; +2B07;DOWNWARDS BLACK ARROW;So;0;ON;;;;;N;;;;; +2B08;NORTH EAST BLACK ARROW;So;0;ON;;;;;N;;;;; +2B09;NORTH WEST BLACK ARROW;So;0;ON;;;;;N;;;;; +2B0A;SOUTH EAST BLACK ARROW;So;0;ON;;;;;N;;;;; +2B0B;SOUTH WEST BLACK ARROW;So;0;ON;;;;;N;;;;; +2B0C;LEFT RIGHT BLACK ARROW;So;0;ON;;;;;N;;;;; +2B0D;UP DOWN BLACK ARROW;So;0;ON;;;;;N;;;;; +2B0E;RIGHTWARDS ARROW WITH TIP DOWNWARDS;So;0;ON;;;;;N;;;;; +2B0F;RIGHTWARDS ARROW WITH TIP UPWARDS;So;0;ON;;;;;N;;;;; +2B10;LEFTWARDS ARROW WITH TIP DOWNWARDS;So;0;ON;;;;;N;;;;; +2B11;LEFTWARDS ARROW WITH TIP UPWARDS;So;0;ON;;;;;N;;;;; +2B12;SQUARE WITH TOP HALF BLACK;So;0;ON;;;;;N;;;;; +2B13;SQUARE WITH BOTTOM HALF BLACK;So;0;ON;;;;;N;;;;; +2B14;SQUARE WITH UPPER RIGHT DIAGONAL HALF BLACK;So;0;ON;;;;;N;;;;; +2B15;SQUARE WITH LOWER LEFT DIAGONAL HALF BLACK;So;0;ON;;;;;N;;;;; +2B16;DIAMOND WITH LEFT HALF BLACK;So;0;ON;;;;;N;;;;; +2B17;DIAMOND WITH RIGHT HALF BLACK;So;0;ON;;;;;N;;;;; +2B18;DIAMOND WITH TOP HALF BLACK;So;0;ON;;;;;N;;;;; +2B19;DIAMOND WITH BOTTOM HALF BLACK;So;0;ON;;;;;N;;;;; +2B1A;DOTTED SQUARE;So;0;ON;;;;;N;;;;; +2B1B;BLACK LARGE SQUARE;So;0;ON;;;;;N;;;;; +2B1C;WHITE LARGE SQUARE;So;0;ON;;;;;N;;;;; +2B1D;BLACK VERY SMALL SQUARE;So;0;ON;;;;;N;;;;; +2B1E;WHITE VERY SMALL SQUARE;So;0;ON;;;;;N;;;;; +2B1F;BLACK PENTAGON;So;0;ON;;;;;N;;;;; +2B20;WHITE PENTAGON;So;0;ON;;;;;N;;;;; +2B21;WHITE HEXAGON;So;0;ON;;;;;N;;;;; +2B22;BLACK HEXAGON;So;0;ON;;;;;N;;;;; +2B23;HORIZONTAL BLACK HEXAGON;So;0;ON;;;;;N;;;;; +2B24;BLACK LARGE CIRCLE;So;0;ON;;;;;N;;;;; +2B25;BLACK MEDIUM DIAMOND;So;0;ON;;;;;N;;;;; +2B26;WHITE MEDIUM DIAMOND;So;0;ON;;;;;N;;;;; +2B27;BLACK MEDIUM LOZENGE;So;0;ON;;;;;N;;;;; +2B28;WHITE MEDIUM LOZENGE;So;0;ON;;;;;N;;;;; +2B29;BLACK SMALL DIAMOND;So;0;ON;;;;;N;;;;; +2B2A;BLACK SMALL LOZENGE;So;0;ON;;;;;N;;;;; +2B2B;WHITE SMALL LOZENGE;So;0;ON;;;;;N;;;;; +2B2C;BLACK HORIZONTAL ELLIPSE;So;0;ON;;;;;N;;;;; +2B2D;WHITE HORIZONTAL ELLIPSE;So;0;ON;;;;;N;;;;; +2B2E;BLACK VERTICAL ELLIPSE;So;0;ON;;;;;N;;;;; +2B2F;WHITE VERTICAL ELLIPSE;So;0;ON;;;;;N;;;;; +2B30;LEFT ARROW WITH SMALL CIRCLE;Sm;0;ON;;;;;N;;;;; +2B31;THREE LEFTWARDS ARROWS;Sm;0;ON;;;;;N;;;;; +2B32;LEFT ARROW WITH CIRCLED PLUS;Sm;0;ON;;;;;N;;;;; +2B33;LONG LEFTWARDS SQUIGGLE ARROW;Sm;0;ON;;;;;N;;;;; +2B34;LEFTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2B35;LEFTWARDS TWO-HEADED ARROW WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2B36;LEFTWARDS TWO-HEADED ARROW FROM BAR;Sm;0;ON;;;;;N;;;;; +2B37;LEFTWARDS TWO-HEADED TRIPLE DASH ARROW;Sm;0;ON;;;;;N;;;;; +2B38;LEFTWARDS ARROW WITH DOTTED STEM;Sm;0;ON;;;;;N;;;;; +2B39;LEFTWARDS ARROW WITH TAIL WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2B3A;LEFTWARDS ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2B3B;LEFTWARDS TWO-HEADED ARROW WITH TAIL;Sm;0;ON;;;;;N;;;;; +2B3C;LEFTWARDS TWO-HEADED ARROW WITH TAIL WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2B3D;LEFTWARDS TWO-HEADED ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2B3E;LEFTWARDS ARROW THROUGH X;Sm;0;ON;;;;;N;;;;; +2B3F;WAVE ARROW POINTING DIRECTLY LEFT;Sm;0;ON;;;;;N;;;;; +2B40;EQUALS SIGN ABOVE LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +2B41;REVERSE TILDE OPERATOR ABOVE LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +2B42;LEFTWARDS ARROW ABOVE REVERSE ALMOST EQUAL TO;Sm;0;ON;;;;;N;;;;; +2B43;RIGHTWARDS ARROW THROUGH GREATER-THAN;Sm;0;ON;;;;;N;;;;; +2B44;RIGHTWARDS ARROW THROUGH SUPERSET;Sm;0;ON;;;;;N;;;;; +2B45;LEFTWARDS QUADRUPLE ARROW;So;0;ON;;;;;N;;;;; +2B46;RIGHTWARDS QUADRUPLE ARROW;So;0;ON;;;;;N;;;;; +2B47;REVERSE TILDE OPERATOR ABOVE RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +2B48;RIGHTWARDS ARROW ABOVE REVERSE ALMOST EQUAL TO;Sm;0;ON;;;;;N;;;;; +2B49;TILDE OPERATOR ABOVE LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +2B4A;LEFTWARDS ARROW ABOVE ALMOST EQUAL TO;Sm;0;ON;;;;;N;;;;; +2B4B;LEFTWARDS ARROW ABOVE REVERSE TILDE OPERATOR;Sm;0;ON;;;;;N;;;;; +2B4C;RIGHTWARDS ARROW ABOVE REVERSE TILDE OPERATOR;Sm;0;ON;;;;;N;;;;; +2B4D;DOWNWARDS TRIANGLE-HEADED ZIGZAG ARROW;So;0;ON;;;;;N;;;;; +2B4E;SHORT SLANTED NORTH ARROW;So;0;ON;;;;;N;;;;; +2B4F;SHORT BACKSLANTED SOUTH ARROW;So;0;ON;;;;;N;;;;; +2B50;WHITE MEDIUM STAR;So;0;ON;;;;;N;;;;; +2B51;BLACK SMALL STAR;So;0;ON;;;;;N;;;;; +2B52;WHITE SMALL STAR;So;0;ON;;;;;N;;;;; +2B53;BLACK RIGHT-POINTING PENTAGON;So;0;ON;;;;;N;;;;; +2B54;WHITE RIGHT-POINTING PENTAGON;So;0;ON;;;;;N;;;;; +2B55;HEAVY LARGE CIRCLE;So;0;ON;;;;;N;;;;; +2B56;HEAVY OVAL WITH OVAL INSIDE;So;0;ON;;;;;N;;;;; +2B57;HEAVY CIRCLE WITH CIRCLE INSIDE;So;0;ON;;;;;N;;;;; +2B58;HEAVY CIRCLE;So;0;ON;;;;;N;;;;; +2B59;HEAVY CIRCLED SALTIRE;So;0;ON;;;;;N;;;;; +2B5A;SLANTED NORTH ARROW WITH HOOKED HEAD;So;0;ON;;;;;N;;;;; +2B5B;BACKSLANTED SOUTH ARROW WITH HOOKED TAIL;So;0;ON;;;;;N;;;;; +2B5C;SLANTED NORTH ARROW WITH HORIZONTAL TAIL;So;0;ON;;;;;N;;;;; +2B5D;BACKSLANTED SOUTH ARROW WITH HORIZONTAL TAIL;So;0;ON;;;;;N;;;;; +2B5E;BENT ARROW POINTING DOWNWARDS THEN NORTH EAST;So;0;ON;;;;;N;;;;; +2B5F;SHORT BENT ARROW POINTING DOWNWARDS THEN NORTH EAST;So;0;ON;;;;;N;;;;; +2B60;LEFTWARDS TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; +2B61;UPWARDS TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; +2B62;RIGHTWARDS TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; +2B63;DOWNWARDS TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; +2B64;LEFT RIGHT TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; +2B65;UP DOWN TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; +2B66;NORTH WEST TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; +2B67;NORTH EAST TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; +2B68;SOUTH EAST TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; +2B69;SOUTH WEST TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; +2B6A;LEFTWARDS TRIANGLE-HEADED DASHED ARROW;So;0;ON;;;;;N;;;;; +2B6B;UPWARDS TRIANGLE-HEADED DASHED ARROW;So;0;ON;;;;;N;;;;; +2B6C;RIGHTWARDS TRIANGLE-HEADED DASHED ARROW;So;0;ON;;;;;N;;;;; +2B6D;DOWNWARDS TRIANGLE-HEADED DASHED ARROW;So;0;ON;;;;;N;;;;; +2B6E;CLOCKWISE TRIANGLE-HEADED OPEN CIRCLE ARROW;So;0;ON;;;;;N;;;;; +2B6F;ANTICLOCKWISE TRIANGLE-HEADED OPEN CIRCLE ARROW;So;0;ON;;;;;N;;;;; +2B70;LEFTWARDS TRIANGLE-HEADED ARROW TO BAR;So;0;ON;;;;;N;;;;; +2B71;UPWARDS TRIANGLE-HEADED ARROW TO BAR;So;0;ON;;;;;N;;;;; +2B72;RIGHTWARDS TRIANGLE-HEADED ARROW TO BAR;So;0;ON;;;;;N;;;;; +2B73;DOWNWARDS TRIANGLE-HEADED ARROW TO BAR;So;0;ON;;;;;N;;;;; +2B76;NORTH WEST TRIANGLE-HEADED ARROW TO BAR;So;0;ON;;;;;N;;;;; +2B77;NORTH EAST TRIANGLE-HEADED ARROW TO BAR;So;0;ON;;;;;N;;;;; +2B78;SOUTH EAST TRIANGLE-HEADED ARROW TO BAR;So;0;ON;;;;;N;;;;; +2B79;SOUTH WEST TRIANGLE-HEADED ARROW TO BAR;So;0;ON;;;;;N;;;;; +2B7A;LEFTWARDS TRIANGLE-HEADED ARROW WITH DOUBLE HORIZONTAL STROKE;So;0;ON;;;;;N;;;;; +2B7B;UPWARDS TRIANGLE-HEADED ARROW WITH DOUBLE HORIZONTAL STROKE;So;0;ON;;;;;N;;;;; +2B7C;RIGHTWARDS TRIANGLE-HEADED ARROW WITH DOUBLE HORIZONTAL STROKE;So;0;ON;;;;;N;;;;; +2B7D;DOWNWARDS TRIANGLE-HEADED ARROW WITH DOUBLE HORIZONTAL STROKE;So;0;ON;;;;;N;;;;; +2B7E;HORIZONTAL TAB KEY;So;0;ON;;;;;N;;;;; +2B7F;VERTICAL TAB KEY;So;0;ON;;;;;N;;;;; +2B80;LEFTWARDS TRIANGLE-HEADED ARROW OVER RIGHTWARDS TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; +2B81;UPWARDS TRIANGLE-HEADED ARROW LEFTWARDS OF DOWNWARDS TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; +2B82;RIGHTWARDS TRIANGLE-HEADED ARROW OVER LEFTWARDS TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; +2B83;DOWNWARDS TRIANGLE-HEADED ARROW LEFTWARDS OF UPWARDS TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; +2B84;LEFTWARDS TRIANGLE-HEADED PAIRED ARROWS;So;0;ON;;;;;N;;;;; +2B85;UPWARDS TRIANGLE-HEADED PAIRED ARROWS;So;0;ON;;;;;N;;;;; +2B86;RIGHTWARDS TRIANGLE-HEADED PAIRED ARROWS;So;0;ON;;;;;N;;;;; +2B87;DOWNWARDS TRIANGLE-HEADED PAIRED ARROWS;So;0;ON;;;;;N;;;;; +2B88;LEFTWARDS BLACK CIRCLED WHITE ARROW;So;0;ON;;;;;N;;;;; +2B89;UPWARDS BLACK CIRCLED WHITE ARROW;So;0;ON;;;;;N;;;;; +2B8A;RIGHTWARDS BLACK CIRCLED WHITE ARROW;So;0;ON;;;;;N;;;;; +2B8B;DOWNWARDS BLACK CIRCLED WHITE ARROW;So;0;ON;;;;;N;;;;; +2B8C;ANTICLOCKWISE TRIANGLE-HEADED RIGHT U-SHAPED ARROW;So;0;ON;;;;;N;;;;; +2B8D;ANTICLOCKWISE TRIANGLE-HEADED BOTTOM U-SHAPED ARROW;So;0;ON;;;;;N;;;;; +2B8E;ANTICLOCKWISE TRIANGLE-HEADED LEFT U-SHAPED ARROW;So;0;ON;;;;;N;;;;; +2B8F;ANTICLOCKWISE TRIANGLE-HEADED TOP U-SHAPED ARROW;So;0;ON;;;;;N;;;;; +2B90;RETURN LEFT;So;0;ON;;;;;N;;;;; +2B91;RETURN RIGHT;So;0;ON;;;;;N;;;;; +2B92;NEWLINE LEFT;So;0;ON;;;;;N;;;;; +2B93;NEWLINE RIGHT;So;0;ON;;;;;N;;;;; +2B94;FOUR CORNER ARROWS CIRCLING ANTICLOCKWISE;So;0;ON;;;;;N;;;;; +2B95;RIGHTWARDS BLACK ARROW;So;0;ON;;;;;N;;;;; +2B98;THREE-D TOP-LIGHTED LEFTWARDS EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +2B99;THREE-D RIGHT-LIGHTED UPWARDS EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +2B9A;THREE-D TOP-LIGHTED RIGHTWARDS EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +2B9B;THREE-D LEFT-LIGHTED DOWNWARDS EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +2B9C;BLACK LEFTWARDS EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +2B9D;BLACK UPWARDS EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +2B9E;BLACK RIGHTWARDS EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +2B9F;BLACK DOWNWARDS EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +2BA0;DOWNWARDS TRIANGLE-HEADED ARROW WITH LONG TIP LEFTWARDS;So;0;ON;;;;;N;;;;; +2BA1;DOWNWARDS TRIANGLE-HEADED ARROW WITH LONG TIP RIGHTWARDS;So;0;ON;;;;;N;;;;; +2BA2;UPWARDS TRIANGLE-HEADED ARROW WITH LONG TIP LEFTWARDS;So;0;ON;;;;;N;;;;; +2BA3;UPWARDS TRIANGLE-HEADED ARROW WITH LONG TIP RIGHTWARDS;So;0;ON;;;;;N;;;;; +2BA4;LEFTWARDS TRIANGLE-HEADED ARROW WITH LONG TIP UPWARDS;So;0;ON;;;;;N;;;;; +2BA5;RIGHTWARDS TRIANGLE-HEADED ARROW WITH LONG TIP UPWARDS;So;0;ON;;;;;N;;;;; +2BA6;LEFTWARDS TRIANGLE-HEADED ARROW WITH LONG TIP DOWNWARDS;So;0;ON;;;;;N;;;;; +2BA7;RIGHTWARDS TRIANGLE-HEADED ARROW WITH LONG TIP DOWNWARDS;So;0;ON;;;;;N;;;;; +2BA8;BLACK CURVED DOWNWARDS AND LEFTWARDS ARROW;So;0;ON;;;;;N;;;;; +2BA9;BLACK CURVED DOWNWARDS AND RIGHTWARDS ARROW;So;0;ON;;;;;N;;;;; +2BAA;BLACK CURVED UPWARDS AND LEFTWARDS ARROW;So;0;ON;;;;;N;;;;; +2BAB;BLACK CURVED UPWARDS AND RIGHTWARDS ARROW;So;0;ON;;;;;N;;;;; +2BAC;BLACK CURVED LEFTWARDS AND UPWARDS ARROW;So;0;ON;;;;;N;;;;; +2BAD;BLACK CURVED RIGHTWARDS AND UPWARDS ARROW;So;0;ON;;;;;N;;;;; +2BAE;BLACK CURVED LEFTWARDS AND DOWNWARDS ARROW;So;0;ON;;;;;N;;;;; +2BAF;BLACK CURVED RIGHTWARDS AND DOWNWARDS ARROW;So;0;ON;;;;;N;;;;; +2BB0;RIBBON ARROW DOWN LEFT;So;0;ON;;;;;N;;;;; +2BB1;RIBBON ARROW DOWN RIGHT;So;0;ON;;;;;N;;;;; +2BB2;RIBBON ARROW UP LEFT;So;0;ON;;;;;N;;;;; +2BB3;RIBBON ARROW UP RIGHT;So;0;ON;;;;;N;;;;; +2BB4;RIBBON ARROW LEFT UP;So;0;ON;;;;;N;;;;; +2BB5;RIBBON ARROW RIGHT UP;So;0;ON;;;;;N;;;;; +2BB6;RIBBON ARROW LEFT DOWN;So;0;ON;;;;;N;;;;; +2BB7;RIBBON ARROW RIGHT DOWN;So;0;ON;;;;;N;;;;; +2BB8;UPWARDS WHITE ARROW FROM BAR WITH HORIZONTAL BAR;So;0;ON;;;;;N;;;;; +2BB9;UP ARROWHEAD IN A RECTANGLE BOX;So;0;ON;;;;;N;;;;; +2BBA;OVERLAPPING WHITE SQUARES;So;0;ON;;;;;N;;;;; +2BBB;OVERLAPPING WHITE AND BLACK SQUARES;So;0;ON;;;;;N;;;;; +2BBC;OVERLAPPING BLACK SQUARES;So;0;ON;;;;;N;;;;; +2BBD;BALLOT BOX WITH LIGHT X;So;0;ON;;;;;N;;;;; +2BBE;CIRCLED X;So;0;ON;;;;;N;;;;; +2BBF;CIRCLED BOLD X;So;0;ON;;;;;N;;;;; +2BC0;BLACK SQUARE CENTRED;So;0;ON;;;;;N;;;;; +2BC1;BLACK DIAMOND CENTRED;So;0;ON;;;;;N;;;;; +2BC2;TURNED BLACK PENTAGON;So;0;ON;;;;;N;;;;; +2BC3;HORIZONTAL BLACK OCTAGON;So;0;ON;;;;;N;;;;; +2BC4;BLACK OCTAGON;So;0;ON;;;;;N;;;;; +2BC5;BLACK MEDIUM UP-POINTING TRIANGLE CENTRED;So;0;ON;;;;;N;;;;; +2BC6;BLACK MEDIUM DOWN-POINTING TRIANGLE CENTRED;So;0;ON;;;;;N;;;;; +2BC7;BLACK MEDIUM LEFT-POINTING TRIANGLE CENTRED;So;0;ON;;;;;N;;;;; +2BC8;BLACK MEDIUM RIGHT-POINTING TRIANGLE CENTRED;So;0;ON;;;;;N;;;;; +2BCA;TOP HALF BLACK CIRCLE;So;0;ON;;;;;N;;;;; +2BCB;BOTTOM HALF BLACK CIRCLE;So;0;ON;;;;;N;;;;; +2BCC;LIGHT FOUR POINTED BLACK CUSP;So;0;ON;;;;;N;;;;; +2BCD;ROTATED LIGHT FOUR POINTED BLACK CUSP;So;0;ON;;;;;N;;;;; +2BCE;WHITE FOUR POINTED CUSP;So;0;ON;;;;;N;;;;; +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;;;;; +2BD3;PLUTO FORM TWO;So;0;ON;;;;;N;;;;; +2BD4;PLUTO FORM THREE;So;0;ON;;;;;N;;;;; +2BD5;PLUTO FORM FOUR;So;0;ON;;;;;N;;;;; +2BD6;PLUTO FORM FIVE;So;0;ON;;;;;N;;;;; +2BD7;TRANSPLUTO;So;0;ON;;;;;N;;;;; +2BD8;PROSERPINA;So;0;ON;;;;;N;;;;; +2BD9;ASTRAEA;So;0;ON;;;;;N;;;;; +2BDA;HYGIEA;So;0;ON;;;;;N;;;;; +2BDB;PHOLUS;So;0;ON;;;;;N;;;;; +2BDC;NESSUS;So;0;ON;;;;;N;;;;; +2BDD;WHITE MOON SELENA;So;0;ON;;;;;N;;;;; +2BDE;BLACK DIAMOND ON CROSS;So;0;ON;;;;;N;;;;; +2BDF;TRUE LIGHT MOON ARTA;So;0;ON;;;;;N;;;;; +2BE0;CUPIDO;So;0;ON;;;;;N;;;;; +2BE1;HADES;So;0;ON;;;;;N;;;;; +2BE2;ZEUS;So;0;ON;;;;;N;;;;; +2BE3;KRONOS;So;0;ON;;;;;N;;;;; +2BE4;APOLLON;So;0;ON;;;;;N;;;;; +2BE5;ADMETOS;So;0;ON;;;;;N;;;;; +2BE6;VULCANUS;So;0;ON;;;;;N;;;;; +2BE7;POSEIDON;So;0;ON;;;;;N;;;;; +2BE8;LEFT HALF BLACK STAR;So;0;ON;;;;;N;;;;; +2BE9;RIGHT HALF BLACK STAR;So;0;ON;;;;;N;;;;; +2BEA;STAR WITH LEFT HALF BLACK;So;0;ON;;;;;N;;;;; +2BEB;STAR WITH RIGHT HALF BLACK;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;;;;; +2BEF;DOWNWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS;So;0;ON;;;;;N;;;;; +2BF0;ERIS FORM ONE;So;0;ON;;;;;N;;;;; +2BF1;ERIS FORM TWO;So;0;ON;;;;;N;;;;; +2BF2;SEDNA;So;0;ON;;;;;N;;;;; +2BF3;RUSSIAN ASTROLOGICAL SYMBOL VIGINTILE;So;0;ON;;;;;N;;;;; +2BF4;RUSSIAN ASTROLOGICAL SYMBOL NOVILE;So;0;ON;;;;;N;;;;; +2BF5;RUSSIAN ASTROLOGICAL SYMBOL QUINTILE;So;0;ON;;;;;N;;;;; +2BF6;RUSSIAN ASTROLOGICAL SYMBOL BINOVILE;So;0;ON;;;;;N;;;;; +2BF7;RUSSIAN ASTROLOGICAL SYMBOL SENTAGON;So;0;ON;;;;;N;;;;; +2BF8;RUSSIAN ASTROLOGICAL SYMBOL TREDECILE;So;0;ON;;;;;N;;;;; +2BF9;EQUALS SIGN WITH INFINITY BELOW;So;0;ON;;;;;N;;;;; +2BFA;UNITED SYMBOL;So;0;ON;;;;;N;;;;; +2BFB;SEPARATED SYMBOL;So;0;ON;;;;;N;;;;; +2BFC;DOUBLED SYMBOL;So;0;ON;;;;;N;;;;; +2BFD;PASSED SYMBOL;So;0;ON;;;;;N;;;;; +2BFE;REVERSED RIGHT ANGLE;So;0;ON;;;;;Y;;;;; +2C00;GLAGOLITIC CAPITAL LETTER AZU;Lu;0;L;;;;;N;;;;2C30; +2C01;GLAGOLITIC CAPITAL LETTER BUKY;Lu;0;L;;;;;N;;;;2C31; +2C02;GLAGOLITIC CAPITAL LETTER VEDE;Lu;0;L;;;;;N;;;;2C32; +2C03;GLAGOLITIC CAPITAL LETTER GLAGOLI;Lu;0;L;;;;;N;;;;2C33; +2C04;GLAGOLITIC CAPITAL LETTER DOBRO;Lu;0;L;;;;;N;;;;2C34; +2C05;GLAGOLITIC CAPITAL LETTER YESTU;Lu;0;L;;;;;N;;;;2C35; +2C06;GLAGOLITIC CAPITAL LETTER ZHIVETE;Lu;0;L;;;;;N;;;;2C36; +2C07;GLAGOLITIC CAPITAL LETTER DZELO;Lu;0;L;;;;;N;;;;2C37; +2C08;GLAGOLITIC CAPITAL LETTER ZEMLJA;Lu;0;L;;;;;N;;;;2C38; +2C09;GLAGOLITIC CAPITAL LETTER IZHE;Lu;0;L;;;;;N;;;;2C39; +2C0A;GLAGOLITIC CAPITAL LETTER INITIAL IZHE;Lu;0;L;;;;;N;;;;2C3A; +2C0B;GLAGOLITIC CAPITAL LETTER I;Lu;0;L;;;;;N;;;;2C3B; +2C0C;GLAGOLITIC CAPITAL LETTER DJERVI;Lu;0;L;;;;;N;;;;2C3C; +2C0D;GLAGOLITIC CAPITAL LETTER KAKO;Lu;0;L;;;;;N;;;;2C3D; +2C0E;GLAGOLITIC CAPITAL LETTER LJUDIJE;Lu;0;L;;;;;N;;;;2C3E; +2C0F;GLAGOLITIC CAPITAL LETTER MYSLITE;Lu;0;L;;;;;N;;;;2C3F; +2C10;GLAGOLITIC CAPITAL LETTER NASHI;Lu;0;L;;;;;N;;;;2C40; +2C11;GLAGOLITIC CAPITAL LETTER ONU;Lu;0;L;;;;;N;;;;2C41; +2C12;GLAGOLITIC CAPITAL LETTER POKOJI;Lu;0;L;;;;;N;;;;2C42; +2C13;GLAGOLITIC CAPITAL LETTER RITSI;Lu;0;L;;;;;N;;;;2C43; +2C14;GLAGOLITIC CAPITAL LETTER SLOVO;Lu;0;L;;;;;N;;;;2C44; +2C15;GLAGOLITIC CAPITAL LETTER TVRIDO;Lu;0;L;;;;;N;;;;2C45; +2C16;GLAGOLITIC CAPITAL LETTER UKU;Lu;0;L;;;;;N;;;;2C46; +2C17;GLAGOLITIC CAPITAL LETTER FRITU;Lu;0;L;;;;;N;;;;2C47; +2C18;GLAGOLITIC CAPITAL LETTER HERU;Lu;0;L;;;;;N;;;;2C48; +2C19;GLAGOLITIC CAPITAL LETTER OTU;Lu;0;L;;;;;N;;;;2C49; +2C1A;GLAGOLITIC CAPITAL LETTER PE;Lu;0;L;;;;;N;;;;2C4A; +2C1B;GLAGOLITIC CAPITAL LETTER SHTA;Lu;0;L;;;;;N;;;;2C4B; +2C1C;GLAGOLITIC CAPITAL LETTER TSI;Lu;0;L;;;;;N;;;;2C4C; +2C1D;GLAGOLITIC CAPITAL LETTER CHRIVI;Lu;0;L;;;;;N;;;;2C4D; +2C1E;GLAGOLITIC CAPITAL LETTER SHA;Lu;0;L;;;;;N;;;;2C4E; +2C1F;GLAGOLITIC CAPITAL LETTER YERU;Lu;0;L;;;;;N;;;;2C4F; +2C20;GLAGOLITIC CAPITAL LETTER YERI;Lu;0;L;;;;;N;;;;2C50; +2C21;GLAGOLITIC CAPITAL LETTER YATI;Lu;0;L;;;;;N;;;;2C51; +2C22;GLAGOLITIC CAPITAL LETTER SPIDERY HA;Lu;0;L;;;;;N;;;;2C52; +2C23;GLAGOLITIC CAPITAL LETTER YU;Lu;0;L;;;;;N;;;;2C53; +2C24;GLAGOLITIC CAPITAL LETTER SMALL YUS;Lu;0;L;;;;;N;;;;2C54; +2C25;GLAGOLITIC CAPITAL LETTER SMALL YUS WITH TAIL;Lu;0;L;;;;;N;;;;2C55; +2C26;GLAGOLITIC CAPITAL LETTER YO;Lu;0;L;;;;;N;;;;2C56; +2C27;GLAGOLITIC CAPITAL LETTER IOTATED SMALL YUS;Lu;0;L;;;;;N;;;;2C57; +2C28;GLAGOLITIC CAPITAL LETTER BIG YUS;Lu;0;L;;;;;N;;;;2C58; +2C29;GLAGOLITIC CAPITAL LETTER IOTATED BIG YUS;Lu;0;L;;;;;N;;;;2C59; +2C2A;GLAGOLITIC CAPITAL LETTER FITA;Lu;0;L;;;;;N;;;;2C5A; +2C2B;GLAGOLITIC CAPITAL LETTER IZHITSA;Lu;0;L;;;;;N;;;;2C5B; +2C2C;GLAGOLITIC CAPITAL LETTER SHTAPIC;Lu;0;L;;;;;N;;;;2C5C; +2C2D;GLAGOLITIC CAPITAL LETTER TROKUTASTI A;Lu;0;L;;;;;N;;;;2C5D; +2C2E;GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE;Lu;0;L;;;;;N;;;;2C5E; +2C30;GLAGOLITIC SMALL LETTER AZU;Ll;0;L;;;;;N;;;2C00;;2C00 +2C31;GLAGOLITIC SMALL LETTER BUKY;Ll;0;L;;;;;N;;;2C01;;2C01 +2C32;GLAGOLITIC SMALL LETTER VEDE;Ll;0;L;;;;;N;;;2C02;;2C02 +2C33;GLAGOLITIC SMALL LETTER GLAGOLI;Ll;0;L;;;;;N;;;2C03;;2C03 +2C34;GLAGOLITIC SMALL LETTER DOBRO;Ll;0;L;;;;;N;;;2C04;;2C04 +2C35;GLAGOLITIC SMALL LETTER YESTU;Ll;0;L;;;;;N;;;2C05;;2C05 +2C36;GLAGOLITIC SMALL LETTER ZHIVETE;Ll;0;L;;;;;N;;;2C06;;2C06 +2C37;GLAGOLITIC SMALL LETTER DZELO;Ll;0;L;;;;;N;;;2C07;;2C07 +2C38;GLAGOLITIC SMALL LETTER ZEMLJA;Ll;0;L;;;;;N;;;2C08;;2C08 +2C39;GLAGOLITIC SMALL LETTER IZHE;Ll;0;L;;;;;N;;;2C09;;2C09 +2C3A;GLAGOLITIC SMALL LETTER INITIAL IZHE;Ll;0;L;;;;;N;;;2C0A;;2C0A +2C3B;GLAGOLITIC SMALL LETTER I;Ll;0;L;;;;;N;;;2C0B;;2C0B +2C3C;GLAGOLITIC SMALL LETTER DJERVI;Ll;0;L;;;;;N;;;2C0C;;2C0C +2C3D;GLAGOLITIC SMALL LETTER KAKO;Ll;0;L;;;;;N;;;2C0D;;2C0D +2C3E;GLAGOLITIC SMALL LETTER LJUDIJE;Ll;0;L;;;;;N;;;2C0E;;2C0E +2C3F;GLAGOLITIC SMALL LETTER MYSLITE;Ll;0;L;;;;;N;;;2C0F;;2C0F +2C40;GLAGOLITIC SMALL LETTER NASHI;Ll;0;L;;;;;N;;;2C10;;2C10 +2C41;GLAGOLITIC SMALL LETTER ONU;Ll;0;L;;;;;N;;;2C11;;2C11 +2C42;GLAGOLITIC SMALL LETTER POKOJI;Ll;0;L;;;;;N;;;2C12;;2C12 +2C43;GLAGOLITIC SMALL LETTER RITSI;Ll;0;L;;;;;N;;;2C13;;2C13 +2C44;GLAGOLITIC SMALL LETTER SLOVO;Ll;0;L;;;;;N;;;2C14;;2C14 +2C45;GLAGOLITIC SMALL LETTER TVRIDO;Ll;0;L;;;;;N;;;2C15;;2C15 +2C46;GLAGOLITIC SMALL LETTER UKU;Ll;0;L;;;;;N;;;2C16;;2C16 +2C47;GLAGOLITIC SMALL LETTER FRITU;Ll;0;L;;;;;N;;;2C17;;2C17 +2C48;GLAGOLITIC SMALL LETTER HERU;Ll;0;L;;;;;N;;;2C18;;2C18 +2C49;GLAGOLITIC SMALL LETTER OTU;Ll;0;L;;;;;N;;;2C19;;2C19 +2C4A;GLAGOLITIC SMALL LETTER PE;Ll;0;L;;;;;N;;;2C1A;;2C1A +2C4B;GLAGOLITIC SMALL LETTER SHTA;Ll;0;L;;;;;N;;;2C1B;;2C1B +2C4C;GLAGOLITIC SMALL LETTER TSI;Ll;0;L;;;;;N;;;2C1C;;2C1C +2C4D;GLAGOLITIC SMALL LETTER CHRIVI;Ll;0;L;;;;;N;;;2C1D;;2C1D +2C4E;GLAGOLITIC SMALL LETTER SHA;Ll;0;L;;;;;N;;;2C1E;;2C1E +2C4F;GLAGOLITIC SMALL LETTER YERU;Ll;0;L;;;;;N;;;2C1F;;2C1F +2C50;GLAGOLITIC SMALL LETTER YERI;Ll;0;L;;;;;N;;;2C20;;2C20 +2C51;GLAGOLITIC SMALL LETTER YATI;Ll;0;L;;;;;N;;;2C21;;2C21 +2C52;GLAGOLITIC SMALL LETTER SPIDERY HA;Ll;0;L;;;;;N;;;2C22;;2C22 +2C53;GLAGOLITIC SMALL LETTER YU;Ll;0;L;;;;;N;;;2C23;;2C23 +2C54;GLAGOLITIC SMALL LETTER SMALL YUS;Ll;0;L;;;;;N;;;2C24;;2C24 +2C55;GLAGOLITIC SMALL LETTER SMALL YUS WITH TAIL;Ll;0;L;;;;;N;;;2C25;;2C25 +2C56;GLAGOLITIC SMALL LETTER YO;Ll;0;L;;;;;N;;;2C26;;2C26 +2C57;GLAGOLITIC SMALL LETTER IOTATED SMALL YUS;Ll;0;L;;;;;N;;;2C27;;2C27 +2C58;GLAGOLITIC SMALL LETTER BIG YUS;Ll;0;L;;;;;N;;;2C28;;2C28 +2C59;GLAGOLITIC SMALL LETTER IOTATED BIG YUS;Ll;0;L;;;;;N;;;2C29;;2C29 +2C5A;GLAGOLITIC SMALL LETTER FITA;Ll;0;L;;;;;N;;;2C2A;;2C2A +2C5B;GLAGOLITIC SMALL LETTER IZHITSA;Ll;0;L;;;;;N;;;2C2B;;2C2B +2C5C;GLAGOLITIC SMALL LETTER SHTAPIC;Ll;0;L;;;;;N;;;2C2C;;2C2C +2C5D;GLAGOLITIC SMALL LETTER TROKUTASTI A;Ll;0;L;;;;;N;;;2C2D;;2C2D +2C5E;GLAGOLITIC SMALL LETTER LATINATE MYSLITE;Ll;0;L;;;;;N;;;2C2E;;2C2E +2C60;LATIN CAPITAL LETTER L WITH DOUBLE BAR;Lu;0;L;;;;;N;;;;2C61; +2C61;LATIN SMALL LETTER L WITH DOUBLE BAR;Ll;0;L;;;;;N;;;2C60;;2C60 +2C62;LATIN CAPITAL LETTER L WITH MIDDLE TILDE;Lu;0;L;;;;;N;;;;026B; +2C63;LATIN CAPITAL LETTER P WITH STROKE;Lu;0;L;;;;;N;;;;1D7D; +2C64;LATIN CAPITAL LETTER R WITH TAIL;Lu;0;L;;;;;N;;;;027D; +2C65;LATIN SMALL LETTER A WITH STROKE;Ll;0;L;;;;;N;;;023A;;023A +2C66;LATIN SMALL LETTER T WITH DIAGONAL STROKE;Ll;0;L;;;;;N;;;023E;;023E +2C67;LATIN CAPITAL LETTER H WITH DESCENDER;Lu;0;L;;;;;N;;;;2C68; +2C68;LATIN SMALL LETTER H WITH DESCENDER;Ll;0;L;;;;;N;;;2C67;;2C67 +2C69;LATIN CAPITAL LETTER K WITH DESCENDER;Lu;0;L;;;;;N;;;;2C6A; +2C6A;LATIN SMALL LETTER K WITH DESCENDER;Ll;0;L;;;;;N;;;2C69;;2C69 +2C6B;LATIN CAPITAL LETTER Z WITH DESCENDER;Lu;0;L;;;;;N;;;;2C6C; +2C6C;LATIN SMALL LETTER Z WITH DESCENDER;Ll;0;L;;;;;N;;;2C6B;;2C6B +2C6D;LATIN CAPITAL LETTER ALPHA;Lu;0;L;;;;;N;;;;0251; +2C6E;LATIN CAPITAL LETTER M WITH HOOK;Lu;0;L;;;;;N;;;;0271; +2C6F;LATIN CAPITAL LETTER TURNED A;Lu;0;L;;;;;N;;;;0250; +2C70;LATIN CAPITAL LETTER TURNED ALPHA;Lu;0;L;;;;;N;;;;0252; +2C71;LATIN SMALL LETTER V WITH RIGHT HOOK;Ll;0;L;;;;;N;;;;; +2C72;LATIN CAPITAL LETTER W WITH HOOK;Lu;0;L;;;;;N;;;;2C73; +2C73;LATIN SMALL LETTER W WITH HOOK;Ll;0;L;;;;;N;;;2C72;;2C72 +2C74;LATIN SMALL LETTER V WITH CURL;Ll;0;L;;;;;N;;;;; +2C75;LATIN CAPITAL LETTER HALF H;Lu;0;L;;;;;N;;;;2C76; +2C76;LATIN SMALL LETTER HALF H;Ll;0;L;;;;;N;;;2C75;;2C75 +2C77;LATIN SMALL LETTER TAILLESS PHI;Ll;0;L;;;;;N;;;;; +2C78;LATIN SMALL LETTER E WITH NOTCH;Ll;0;L;;;;;N;;;;; +2C79;LATIN SMALL LETTER TURNED R WITH TAIL;Ll;0;L;;;;;N;;;;; +2C7A;LATIN SMALL LETTER O WITH LOW RING INSIDE;Ll;0;L;;;;;N;;;;; +2C7B;LATIN LETTER SMALL CAPITAL TURNED E;Ll;0;L;;;;;N;;;;; +2C7C;LATIN SUBSCRIPT SMALL LETTER J;Lm;0;L;<sub> 006A;;;;N;;;;; +2C7D;MODIFIER LETTER CAPITAL V;Lm;0;L;<super> 0056;;;;N;;;;; +2C7E;LATIN CAPITAL LETTER S WITH SWASH TAIL;Lu;0;L;;;;;N;;;;023F; +2C7F;LATIN CAPITAL LETTER Z WITH SWASH TAIL;Lu;0;L;;;;;N;;;;0240; +2C80;COPTIC CAPITAL LETTER ALFA;Lu;0;L;;;;;N;;;;2C81; +2C81;COPTIC SMALL LETTER ALFA;Ll;0;L;;;;;N;;;2C80;;2C80 +2C82;COPTIC CAPITAL LETTER VIDA;Lu;0;L;;;;;N;;;;2C83; +2C83;COPTIC SMALL LETTER VIDA;Ll;0;L;;;;;N;;;2C82;;2C82 +2C84;COPTIC CAPITAL LETTER GAMMA;Lu;0;L;;;;;N;;;;2C85; +2C85;COPTIC SMALL LETTER GAMMA;Ll;0;L;;;;;N;;;2C84;;2C84 +2C86;COPTIC CAPITAL LETTER DALDA;Lu;0;L;;;;;N;;;;2C87; +2C87;COPTIC SMALL LETTER DALDA;Ll;0;L;;;;;N;;;2C86;;2C86 +2C88;COPTIC CAPITAL LETTER EIE;Lu;0;L;;;;;N;;;;2C89; +2C89;COPTIC SMALL LETTER EIE;Ll;0;L;;;;;N;;;2C88;;2C88 +2C8A;COPTIC CAPITAL LETTER SOU;Lu;0;L;;;;;N;;;;2C8B; +2C8B;COPTIC SMALL LETTER SOU;Ll;0;L;;;;;N;;;2C8A;;2C8A +2C8C;COPTIC CAPITAL LETTER ZATA;Lu;0;L;;;;;N;;;;2C8D; +2C8D;COPTIC SMALL LETTER ZATA;Ll;0;L;;;;;N;;;2C8C;;2C8C +2C8E;COPTIC CAPITAL LETTER HATE;Lu;0;L;;;;;N;;;;2C8F; +2C8F;COPTIC SMALL LETTER HATE;Ll;0;L;;;;;N;;;2C8E;;2C8E +2C90;COPTIC CAPITAL LETTER THETHE;Lu;0;L;;;;;N;;;;2C91; +2C91;COPTIC SMALL LETTER THETHE;Ll;0;L;;;;;N;;;2C90;;2C90 +2C92;COPTIC CAPITAL LETTER IAUDA;Lu;0;L;;;;;N;;;;2C93; +2C93;COPTIC SMALL LETTER IAUDA;Ll;0;L;;;;;N;;;2C92;;2C92 +2C94;COPTIC CAPITAL LETTER KAPA;Lu;0;L;;;;;N;;;;2C95; +2C95;COPTIC SMALL LETTER KAPA;Ll;0;L;;;;;N;;;2C94;;2C94 +2C96;COPTIC CAPITAL LETTER LAULA;Lu;0;L;;;;;N;;;;2C97; +2C97;COPTIC SMALL LETTER LAULA;Ll;0;L;;;;;N;;;2C96;;2C96 +2C98;COPTIC CAPITAL LETTER MI;Lu;0;L;;;;;N;;;;2C99; +2C99;COPTIC SMALL LETTER MI;Ll;0;L;;;;;N;;;2C98;;2C98 +2C9A;COPTIC CAPITAL LETTER NI;Lu;0;L;;;;;N;;;;2C9B; +2C9B;COPTIC SMALL LETTER NI;Ll;0;L;;;;;N;;;2C9A;;2C9A +2C9C;COPTIC CAPITAL LETTER KSI;Lu;0;L;;;;;N;;;;2C9D; +2C9D;COPTIC SMALL LETTER KSI;Ll;0;L;;;;;N;;;2C9C;;2C9C +2C9E;COPTIC CAPITAL LETTER O;Lu;0;L;;;;;N;;;;2C9F; +2C9F;COPTIC SMALL LETTER O;Ll;0;L;;;;;N;;;2C9E;;2C9E +2CA0;COPTIC CAPITAL LETTER PI;Lu;0;L;;;;;N;;;;2CA1; +2CA1;COPTIC SMALL LETTER PI;Ll;0;L;;;;;N;;;2CA0;;2CA0 +2CA2;COPTIC CAPITAL LETTER RO;Lu;0;L;;;;;N;;;;2CA3; +2CA3;COPTIC SMALL LETTER RO;Ll;0;L;;;;;N;;;2CA2;;2CA2 +2CA4;COPTIC CAPITAL LETTER SIMA;Lu;0;L;;;;;N;;;;2CA5; +2CA5;COPTIC SMALL LETTER SIMA;Ll;0;L;;;;;N;;;2CA4;;2CA4 +2CA6;COPTIC CAPITAL LETTER TAU;Lu;0;L;;;;;N;;;;2CA7; +2CA7;COPTIC SMALL LETTER TAU;Ll;0;L;;;;;N;;;2CA6;;2CA6 +2CA8;COPTIC CAPITAL LETTER UA;Lu;0;L;;;;;N;;;;2CA9; +2CA9;COPTIC SMALL LETTER UA;Ll;0;L;;;;;N;;;2CA8;;2CA8 +2CAA;COPTIC CAPITAL LETTER FI;Lu;0;L;;;;;N;;;;2CAB; +2CAB;COPTIC SMALL LETTER FI;Ll;0;L;;;;;N;;;2CAA;;2CAA +2CAC;COPTIC CAPITAL LETTER KHI;Lu;0;L;;;;;N;;;;2CAD; +2CAD;COPTIC SMALL LETTER KHI;Ll;0;L;;;;;N;;;2CAC;;2CAC +2CAE;COPTIC CAPITAL LETTER PSI;Lu;0;L;;;;;N;;;;2CAF; +2CAF;COPTIC SMALL LETTER PSI;Ll;0;L;;;;;N;;;2CAE;;2CAE +2CB0;COPTIC CAPITAL LETTER OOU;Lu;0;L;;;;;N;;;;2CB1; +2CB1;COPTIC SMALL LETTER OOU;Ll;0;L;;;;;N;;;2CB0;;2CB0 +2CB2;COPTIC CAPITAL LETTER DIALECT-P ALEF;Lu;0;L;;;;;N;;;;2CB3; +2CB3;COPTIC SMALL LETTER DIALECT-P ALEF;Ll;0;L;;;;;N;;;2CB2;;2CB2 +2CB4;COPTIC CAPITAL LETTER OLD COPTIC AIN;Lu;0;L;;;;;N;;;;2CB5; +2CB5;COPTIC SMALL LETTER OLD COPTIC AIN;Ll;0;L;;;;;N;;;2CB4;;2CB4 +2CB6;COPTIC CAPITAL LETTER CRYPTOGRAMMIC EIE;Lu;0;L;;;;;N;;;;2CB7; +2CB7;COPTIC SMALL LETTER CRYPTOGRAMMIC EIE;Ll;0;L;;;;;N;;;2CB6;;2CB6 +2CB8;COPTIC CAPITAL LETTER DIALECT-P KAPA;Lu;0;L;;;;;N;;;;2CB9; +2CB9;COPTIC SMALL LETTER DIALECT-P KAPA;Ll;0;L;;;;;N;;;2CB8;;2CB8 +2CBA;COPTIC CAPITAL LETTER DIALECT-P NI;Lu;0;L;;;;;N;;;;2CBB; +2CBB;COPTIC SMALL LETTER DIALECT-P NI;Ll;0;L;;;;;N;;;2CBA;;2CBA +2CBC;COPTIC CAPITAL LETTER CRYPTOGRAMMIC NI;Lu;0;L;;;;;N;;;;2CBD; +2CBD;COPTIC SMALL LETTER CRYPTOGRAMMIC NI;Ll;0;L;;;;;N;;;2CBC;;2CBC +2CBE;COPTIC CAPITAL LETTER OLD COPTIC OOU;Lu;0;L;;;;;N;;;;2CBF; +2CBF;COPTIC SMALL LETTER OLD COPTIC OOU;Ll;0;L;;;;;N;;;2CBE;;2CBE +2CC0;COPTIC CAPITAL LETTER SAMPI;Lu;0;L;;;;;N;;;;2CC1; +2CC1;COPTIC SMALL LETTER SAMPI;Ll;0;L;;;;;N;;;2CC0;;2CC0 +2CC2;COPTIC CAPITAL LETTER CROSSED SHEI;Lu;0;L;;;;;N;;;;2CC3; +2CC3;COPTIC SMALL LETTER CROSSED SHEI;Ll;0;L;;;;;N;;;2CC2;;2CC2 +2CC4;COPTIC CAPITAL LETTER OLD COPTIC SHEI;Lu;0;L;;;;;N;;;;2CC5; +2CC5;COPTIC SMALL LETTER OLD COPTIC SHEI;Ll;0;L;;;;;N;;;2CC4;;2CC4 +2CC6;COPTIC CAPITAL LETTER OLD COPTIC ESH;Lu;0;L;;;;;N;;;;2CC7; +2CC7;COPTIC SMALL LETTER OLD COPTIC ESH;Ll;0;L;;;;;N;;;2CC6;;2CC6 +2CC8;COPTIC CAPITAL LETTER AKHMIMIC KHEI;Lu;0;L;;;;;N;;;;2CC9; +2CC9;COPTIC SMALL LETTER AKHMIMIC KHEI;Ll;0;L;;;;;N;;;2CC8;;2CC8 +2CCA;COPTIC CAPITAL LETTER DIALECT-P HORI;Lu;0;L;;;;;N;;;;2CCB; +2CCB;COPTIC SMALL LETTER DIALECT-P HORI;Ll;0;L;;;;;N;;;2CCA;;2CCA +2CCC;COPTIC CAPITAL LETTER OLD COPTIC HORI;Lu;0;L;;;;;N;;;;2CCD; +2CCD;COPTIC SMALL LETTER OLD COPTIC HORI;Ll;0;L;;;;;N;;;2CCC;;2CCC +2CCE;COPTIC CAPITAL LETTER OLD COPTIC HA;Lu;0;L;;;;;N;;;;2CCF; +2CCF;COPTIC SMALL LETTER OLD COPTIC HA;Ll;0;L;;;;;N;;;2CCE;;2CCE +2CD0;COPTIC CAPITAL LETTER L-SHAPED HA;Lu;0;L;;;;;N;;;;2CD1; +2CD1;COPTIC SMALL LETTER L-SHAPED HA;Ll;0;L;;;;;N;;;2CD0;;2CD0 +2CD2;COPTIC CAPITAL LETTER OLD COPTIC HEI;Lu;0;L;;;;;N;;;;2CD3; +2CD3;COPTIC SMALL LETTER OLD COPTIC HEI;Ll;0;L;;;;;N;;;2CD2;;2CD2 +2CD4;COPTIC CAPITAL LETTER OLD COPTIC HAT;Lu;0;L;;;;;N;;;;2CD5; +2CD5;COPTIC SMALL LETTER OLD COPTIC HAT;Ll;0;L;;;;;N;;;2CD4;;2CD4 +2CD6;COPTIC CAPITAL LETTER OLD COPTIC GANGIA;Lu;0;L;;;;;N;;;;2CD7; +2CD7;COPTIC SMALL LETTER OLD COPTIC GANGIA;Ll;0;L;;;;;N;;;2CD6;;2CD6 +2CD8;COPTIC CAPITAL LETTER OLD COPTIC DJA;Lu;0;L;;;;;N;;;;2CD9; +2CD9;COPTIC SMALL LETTER OLD COPTIC DJA;Ll;0;L;;;;;N;;;2CD8;;2CD8 +2CDA;COPTIC CAPITAL LETTER OLD COPTIC SHIMA;Lu;0;L;;;;;N;;;;2CDB; +2CDB;COPTIC SMALL LETTER OLD COPTIC SHIMA;Ll;0;L;;;;;N;;;2CDA;;2CDA +2CDC;COPTIC CAPITAL LETTER OLD NUBIAN SHIMA;Lu;0;L;;;;;N;;;;2CDD; +2CDD;COPTIC SMALL LETTER OLD NUBIAN SHIMA;Ll;0;L;;;;;N;;;2CDC;;2CDC +2CDE;COPTIC CAPITAL LETTER OLD NUBIAN NGI;Lu;0;L;;;;;N;;;;2CDF; +2CDF;COPTIC SMALL LETTER OLD NUBIAN NGI;Ll;0;L;;;;;N;;;2CDE;;2CDE +2CE0;COPTIC CAPITAL LETTER OLD NUBIAN NYI;Lu;0;L;;;;;N;;;;2CE1; +2CE1;COPTIC SMALL LETTER OLD NUBIAN NYI;Ll;0;L;;;;;N;;;2CE0;;2CE0 +2CE2;COPTIC CAPITAL LETTER OLD NUBIAN WAU;Lu;0;L;;;;;N;;;;2CE3; +2CE3;COPTIC SMALL LETTER OLD NUBIAN WAU;Ll;0;L;;;;;N;;;2CE2;;2CE2 +2CE4;COPTIC SYMBOL KAI;Ll;0;L;;;;;N;;;;; +2CE5;COPTIC SYMBOL MI RO;So;0;ON;;;;;N;;;;; +2CE6;COPTIC SYMBOL PI RO;So;0;ON;;;;;N;;;;; +2CE7;COPTIC SYMBOL STAUROS;So;0;ON;;;;;N;;;;; +2CE8;COPTIC SYMBOL TAU RO;So;0;ON;;;;;N;;;;; +2CE9;COPTIC SYMBOL KHI RO;So;0;ON;;;;;N;;;;; +2CEA;COPTIC SYMBOL SHIMA SIMA;So;0;ON;;;;;N;;;;; +2CEB;COPTIC CAPITAL LETTER CRYPTOGRAMMIC SHEI;Lu;0;L;;;;;N;;;;2CEC; +2CEC;COPTIC SMALL LETTER CRYPTOGRAMMIC SHEI;Ll;0;L;;;;;N;;;2CEB;;2CEB +2CED;COPTIC CAPITAL LETTER CRYPTOGRAMMIC GANGIA;Lu;0;L;;;;;N;;;;2CEE; +2CEE;COPTIC SMALL LETTER CRYPTOGRAMMIC GANGIA;Ll;0;L;;;;;N;;;2CED;;2CED +2CEF;COPTIC COMBINING NI ABOVE;Mn;230;NSM;;;;;N;;;;; +2CF0;COPTIC COMBINING SPIRITUS ASPER;Mn;230;NSM;;;;;N;;;;; +2CF1;COPTIC COMBINING SPIRITUS LENIS;Mn;230;NSM;;;;;N;;;;; +2CF2;COPTIC CAPITAL LETTER BOHAIRIC KHEI;Lu;0;L;;;;;N;;;;2CF3; +2CF3;COPTIC SMALL LETTER BOHAIRIC KHEI;Ll;0;L;;;;;N;;;2CF2;;2CF2 +2CF9;COPTIC OLD NUBIAN FULL STOP;Po;0;ON;;;;;N;;;;; +2CFA;COPTIC OLD NUBIAN DIRECT QUESTION MARK;Po;0;ON;;;;;N;;;;; +2CFB;COPTIC OLD NUBIAN INDIRECT QUESTION MARK;Po;0;ON;;;;;N;;;;; +2CFC;COPTIC OLD NUBIAN VERSE DIVIDER;Po;0;ON;;;;;N;;;;; +2CFD;COPTIC FRACTION ONE HALF;No;0;ON;;;;1/2;N;;;;; +2CFE;COPTIC FULL STOP;Po;0;ON;;;;;N;;;;; +2CFF;COPTIC MORPHOLOGICAL DIVIDER;Po;0;ON;;;;;N;;;;; +2D00;GEORGIAN SMALL LETTER AN;Ll;0;L;;;;;N;;;10A0;;10A0 +2D01;GEORGIAN SMALL LETTER BAN;Ll;0;L;;;;;N;;;10A1;;10A1 +2D02;GEORGIAN SMALL LETTER GAN;Ll;0;L;;;;;N;;;10A2;;10A2 +2D03;GEORGIAN SMALL LETTER DON;Ll;0;L;;;;;N;;;10A3;;10A3 +2D04;GEORGIAN SMALL LETTER EN;Ll;0;L;;;;;N;;;10A4;;10A4 +2D05;GEORGIAN SMALL LETTER VIN;Ll;0;L;;;;;N;;;10A5;;10A5 +2D06;GEORGIAN SMALL LETTER ZEN;Ll;0;L;;;;;N;;;10A6;;10A6 +2D07;GEORGIAN SMALL LETTER TAN;Ll;0;L;;;;;N;;;10A7;;10A7 +2D08;GEORGIAN SMALL LETTER IN;Ll;0;L;;;;;N;;;10A8;;10A8 +2D09;GEORGIAN SMALL LETTER KAN;Ll;0;L;;;;;N;;;10A9;;10A9 +2D0A;GEORGIAN SMALL LETTER LAS;Ll;0;L;;;;;N;;;10AA;;10AA +2D0B;GEORGIAN SMALL LETTER MAN;Ll;0;L;;;;;N;;;10AB;;10AB +2D0C;GEORGIAN SMALL LETTER NAR;Ll;0;L;;;;;N;;;10AC;;10AC +2D0D;GEORGIAN SMALL LETTER ON;Ll;0;L;;;;;N;;;10AD;;10AD +2D0E;GEORGIAN SMALL LETTER PAR;Ll;0;L;;;;;N;;;10AE;;10AE +2D0F;GEORGIAN SMALL LETTER ZHAR;Ll;0;L;;;;;N;;;10AF;;10AF +2D10;GEORGIAN SMALL LETTER RAE;Ll;0;L;;;;;N;;;10B0;;10B0 +2D11;GEORGIAN SMALL LETTER SAN;Ll;0;L;;;;;N;;;10B1;;10B1 +2D12;GEORGIAN SMALL LETTER TAR;Ll;0;L;;;;;N;;;10B2;;10B2 +2D13;GEORGIAN SMALL LETTER UN;Ll;0;L;;;;;N;;;10B3;;10B3 +2D14;GEORGIAN SMALL LETTER PHAR;Ll;0;L;;;;;N;;;10B4;;10B4 +2D15;GEORGIAN SMALL LETTER KHAR;Ll;0;L;;;;;N;;;10B5;;10B5 +2D16;GEORGIAN SMALL LETTER GHAN;Ll;0;L;;;;;N;;;10B6;;10B6 +2D17;GEORGIAN SMALL LETTER QAR;Ll;0;L;;;;;N;;;10B7;;10B7 +2D18;GEORGIAN SMALL LETTER SHIN;Ll;0;L;;;;;N;;;10B8;;10B8 +2D19;GEORGIAN SMALL LETTER CHIN;Ll;0;L;;;;;N;;;10B9;;10B9 +2D1A;GEORGIAN SMALL LETTER CAN;Ll;0;L;;;;;N;;;10BA;;10BA +2D1B;GEORGIAN SMALL LETTER JIL;Ll;0;L;;;;;N;;;10BB;;10BB +2D1C;GEORGIAN SMALL LETTER CIL;Ll;0;L;;;;;N;;;10BC;;10BC +2D1D;GEORGIAN SMALL LETTER CHAR;Ll;0;L;;;;;N;;;10BD;;10BD +2D1E;GEORGIAN SMALL LETTER XAN;Ll;0;L;;;;;N;;;10BE;;10BE +2D1F;GEORGIAN SMALL LETTER JHAN;Ll;0;L;;;;;N;;;10BF;;10BF +2D20;GEORGIAN SMALL LETTER HAE;Ll;0;L;;;;;N;;;10C0;;10C0 +2D21;GEORGIAN SMALL LETTER HE;Ll;0;L;;;;;N;;;10C1;;10C1 +2D22;GEORGIAN SMALL LETTER HIE;Ll;0;L;;;;;N;;;10C2;;10C2 +2D23;GEORGIAN SMALL LETTER WE;Ll;0;L;;;;;N;;;10C3;;10C3 +2D24;GEORGIAN SMALL LETTER HAR;Ll;0;L;;;;;N;;;10C4;;10C4 +2D25;GEORGIAN SMALL LETTER HOE;Ll;0;L;;;;;N;;;10C5;;10C5 +2D27;GEORGIAN SMALL LETTER YN;Ll;0;L;;;;;N;;;10C7;;10C7 +2D2D;GEORGIAN SMALL LETTER AEN;Ll;0;L;;;;;N;;;10CD;;10CD +2D30;TIFINAGH LETTER YA;Lo;0;L;;;;;N;;;;; +2D31;TIFINAGH LETTER YAB;Lo;0;L;;;;;N;;;;; +2D32;TIFINAGH LETTER YABH;Lo;0;L;;;;;N;;;;; +2D33;TIFINAGH LETTER YAG;Lo;0;L;;;;;N;;;;; +2D34;TIFINAGH LETTER YAGHH;Lo;0;L;;;;;N;;;;; +2D35;TIFINAGH LETTER BERBER ACADEMY YAJ;Lo;0;L;;;;;N;;;;; +2D36;TIFINAGH LETTER YAJ;Lo;0;L;;;;;N;;;;; +2D37;TIFINAGH LETTER YAD;Lo;0;L;;;;;N;;;;; +2D38;TIFINAGH LETTER YADH;Lo;0;L;;;;;N;;;;; +2D39;TIFINAGH LETTER YADD;Lo;0;L;;;;;N;;;;; +2D3A;TIFINAGH LETTER YADDH;Lo;0;L;;;;;N;;;;; +2D3B;TIFINAGH LETTER YEY;Lo;0;L;;;;;N;;;;; +2D3C;TIFINAGH LETTER YAF;Lo;0;L;;;;;N;;;;; +2D3D;TIFINAGH LETTER YAK;Lo;0;L;;;;;N;;;;; +2D3E;TIFINAGH LETTER TUAREG YAK;Lo;0;L;;;;;N;;;;; +2D3F;TIFINAGH LETTER YAKHH;Lo;0;L;;;;;N;;;;; +2D40;TIFINAGH LETTER YAH;Lo;0;L;;;;;N;;;;; +2D41;TIFINAGH LETTER BERBER ACADEMY YAH;Lo;0;L;;;;;N;;;;; +2D42;TIFINAGH LETTER TUAREG YAH;Lo;0;L;;;;;N;;;;; +2D43;TIFINAGH LETTER YAHH;Lo;0;L;;;;;N;;;;; +2D44;TIFINAGH LETTER YAA;Lo;0;L;;;;;N;;;;; +2D45;TIFINAGH LETTER YAKH;Lo;0;L;;;;;N;;;;; +2D46;TIFINAGH LETTER TUAREG YAKH;Lo;0;L;;;;;N;;;;; +2D47;TIFINAGH LETTER YAQ;Lo;0;L;;;;;N;;;;; +2D48;TIFINAGH LETTER TUAREG YAQ;Lo;0;L;;;;;N;;;;; +2D49;TIFINAGH LETTER YI;Lo;0;L;;;;;N;;;;; +2D4A;TIFINAGH LETTER YAZH;Lo;0;L;;;;;N;;;;; +2D4B;TIFINAGH LETTER AHAGGAR YAZH;Lo;0;L;;;;;N;;;;; +2D4C;TIFINAGH LETTER TUAREG YAZH;Lo;0;L;;;;;N;;;;; +2D4D;TIFINAGH LETTER YAL;Lo;0;L;;;;;N;;;;; +2D4E;TIFINAGH LETTER YAM;Lo;0;L;;;;;N;;;;; +2D4F;TIFINAGH LETTER YAN;Lo;0;L;;;;;N;;;;; +2D50;TIFINAGH LETTER TUAREG YAGN;Lo;0;L;;;;;N;;;;; +2D51;TIFINAGH LETTER TUAREG YANG;Lo;0;L;;;;;N;;;;; +2D52;TIFINAGH LETTER YAP;Lo;0;L;;;;;N;;;;; +2D53;TIFINAGH LETTER YU;Lo;0;L;;;;;N;;;;; +2D54;TIFINAGH LETTER YAR;Lo;0;L;;;;;N;;;;; +2D55;TIFINAGH LETTER YARR;Lo;0;L;;;;;N;;;;; +2D56;TIFINAGH LETTER YAGH;Lo;0;L;;;;;N;;;;; +2D57;TIFINAGH LETTER TUAREG YAGH;Lo;0;L;;;;;N;;;;; +2D58;TIFINAGH LETTER AYER YAGH;Lo;0;L;;;;;N;;;;; +2D59;TIFINAGH LETTER YAS;Lo;0;L;;;;;N;;;;; +2D5A;TIFINAGH LETTER YASS;Lo;0;L;;;;;N;;;;; +2D5B;TIFINAGH LETTER YASH;Lo;0;L;;;;;N;;;;; +2D5C;TIFINAGH LETTER YAT;Lo;0;L;;;;;N;;;;; +2D5D;TIFINAGH LETTER YATH;Lo;0;L;;;;;N;;;;; +2D5E;TIFINAGH LETTER YACH;Lo;0;L;;;;;N;;;;; +2D5F;TIFINAGH LETTER YATT;Lo;0;L;;;;;N;;;;; +2D60;TIFINAGH LETTER YAV;Lo;0;L;;;;;N;;;;; +2D61;TIFINAGH LETTER YAW;Lo;0;L;;;;;N;;;;; +2D62;TIFINAGH LETTER YAY;Lo;0;L;;;;;N;;;;; +2D63;TIFINAGH LETTER YAZ;Lo;0;L;;;;;N;;;;; +2D64;TIFINAGH LETTER TAWELLEMET YAZ;Lo;0;L;;;;;N;;;;; +2D65;TIFINAGH LETTER YAZZ;Lo;0;L;;;;;N;;;;; +2D66;TIFINAGH LETTER YE;Lo;0;L;;;;;N;;;;; +2D67;TIFINAGH LETTER YO;Lo;0;L;;;;;N;;;;; +2D6F;TIFINAGH MODIFIER LETTER LABIALIZATION MARK;Lm;0;L;<super> 2D61;;;;N;;;;; +2D70;TIFINAGH SEPARATOR MARK;Po;0;L;;;;;N;;;;; +2D7F;TIFINAGH CONSONANT JOINER;Mn;9;NSM;;;;;N;;;;; +2D80;ETHIOPIC SYLLABLE LOA;Lo;0;L;;;;;N;;;;; +2D81;ETHIOPIC SYLLABLE MOA;Lo;0;L;;;;;N;;;;; +2D82;ETHIOPIC SYLLABLE ROA;Lo;0;L;;;;;N;;;;; +2D83;ETHIOPIC SYLLABLE SOA;Lo;0;L;;;;;N;;;;; +2D84;ETHIOPIC SYLLABLE SHOA;Lo;0;L;;;;;N;;;;; +2D85;ETHIOPIC SYLLABLE BOA;Lo;0;L;;;;;N;;;;; +2D86;ETHIOPIC SYLLABLE TOA;Lo;0;L;;;;;N;;;;; +2D87;ETHIOPIC SYLLABLE COA;Lo;0;L;;;;;N;;;;; +2D88;ETHIOPIC SYLLABLE NOA;Lo;0;L;;;;;N;;;;; +2D89;ETHIOPIC SYLLABLE NYOA;Lo;0;L;;;;;N;;;;; +2D8A;ETHIOPIC SYLLABLE GLOTTAL OA;Lo;0;L;;;;;N;;;;; +2D8B;ETHIOPIC SYLLABLE ZOA;Lo;0;L;;;;;N;;;;; +2D8C;ETHIOPIC SYLLABLE DOA;Lo;0;L;;;;;N;;;;; +2D8D;ETHIOPIC SYLLABLE DDOA;Lo;0;L;;;;;N;;;;; +2D8E;ETHIOPIC SYLLABLE JOA;Lo;0;L;;;;;N;;;;; +2D8F;ETHIOPIC SYLLABLE THOA;Lo;0;L;;;;;N;;;;; +2D90;ETHIOPIC SYLLABLE CHOA;Lo;0;L;;;;;N;;;;; +2D91;ETHIOPIC SYLLABLE PHOA;Lo;0;L;;;;;N;;;;; +2D92;ETHIOPIC SYLLABLE POA;Lo;0;L;;;;;N;;;;; +2D93;ETHIOPIC SYLLABLE GGWA;Lo;0;L;;;;;N;;;;; +2D94;ETHIOPIC SYLLABLE GGWI;Lo;0;L;;;;;N;;;;; +2D95;ETHIOPIC SYLLABLE GGWEE;Lo;0;L;;;;;N;;;;; +2D96;ETHIOPIC SYLLABLE GGWE;Lo;0;L;;;;;N;;;;; +2DA0;ETHIOPIC SYLLABLE SSA;Lo;0;L;;;;;N;;;;; +2DA1;ETHIOPIC SYLLABLE SSU;Lo;0;L;;;;;N;;;;; +2DA2;ETHIOPIC SYLLABLE SSI;Lo;0;L;;;;;N;;;;; +2DA3;ETHIOPIC SYLLABLE SSAA;Lo;0;L;;;;;N;;;;; +2DA4;ETHIOPIC SYLLABLE SSEE;Lo;0;L;;;;;N;;;;; +2DA5;ETHIOPIC SYLLABLE SSE;Lo;0;L;;;;;N;;;;; +2DA6;ETHIOPIC SYLLABLE SSO;Lo;0;L;;;;;N;;;;; +2DA8;ETHIOPIC SYLLABLE CCA;Lo;0;L;;;;;N;;;;; +2DA9;ETHIOPIC SYLLABLE CCU;Lo;0;L;;;;;N;;;;; +2DAA;ETHIOPIC SYLLABLE CCI;Lo;0;L;;;;;N;;;;; +2DAB;ETHIOPIC SYLLABLE CCAA;Lo;0;L;;;;;N;;;;; +2DAC;ETHIOPIC SYLLABLE CCEE;Lo;0;L;;;;;N;;;;; +2DAD;ETHIOPIC SYLLABLE CCE;Lo;0;L;;;;;N;;;;; +2DAE;ETHIOPIC SYLLABLE CCO;Lo;0;L;;;;;N;;;;; +2DB0;ETHIOPIC SYLLABLE ZZA;Lo;0;L;;;;;N;;;;; +2DB1;ETHIOPIC SYLLABLE ZZU;Lo;0;L;;;;;N;;;;; +2DB2;ETHIOPIC SYLLABLE ZZI;Lo;0;L;;;;;N;;;;; +2DB3;ETHIOPIC SYLLABLE ZZAA;Lo;0;L;;;;;N;;;;; +2DB4;ETHIOPIC SYLLABLE ZZEE;Lo;0;L;;;;;N;;;;; +2DB5;ETHIOPIC SYLLABLE ZZE;Lo;0;L;;;;;N;;;;; +2DB6;ETHIOPIC SYLLABLE ZZO;Lo;0;L;;;;;N;;;;; +2DB8;ETHIOPIC SYLLABLE CCHA;Lo;0;L;;;;;N;;;;; +2DB9;ETHIOPIC SYLLABLE CCHU;Lo;0;L;;;;;N;;;;; +2DBA;ETHIOPIC SYLLABLE CCHI;Lo;0;L;;;;;N;;;;; +2DBB;ETHIOPIC SYLLABLE CCHAA;Lo;0;L;;;;;N;;;;; +2DBC;ETHIOPIC SYLLABLE CCHEE;Lo;0;L;;;;;N;;;;; +2DBD;ETHIOPIC SYLLABLE CCHE;Lo;0;L;;;;;N;;;;; +2DBE;ETHIOPIC SYLLABLE CCHO;Lo;0;L;;;;;N;;;;; +2DC0;ETHIOPIC SYLLABLE QYA;Lo;0;L;;;;;N;;;;; +2DC1;ETHIOPIC SYLLABLE QYU;Lo;0;L;;;;;N;;;;; +2DC2;ETHIOPIC SYLLABLE QYI;Lo;0;L;;;;;N;;;;; +2DC3;ETHIOPIC SYLLABLE QYAA;Lo;0;L;;;;;N;;;;; +2DC4;ETHIOPIC SYLLABLE QYEE;Lo;0;L;;;;;N;;;;; +2DC5;ETHIOPIC SYLLABLE QYE;Lo;0;L;;;;;N;;;;; +2DC6;ETHIOPIC SYLLABLE QYO;Lo;0;L;;;;;N;;;;; +2DC8;ETHIOPIC SYLLABLE KYA;Lo;0;L;;;;;N;;;;; +2DC9;ETHIOPIC SYLLABLE KYU;Lo;0;L;;;;;N;;;;; +2DCA;ETHIOPIC SYLLABLE KYI;Lo;0;L;;;;;N;;;;; +2DCB;ETHIOPIC SYLLABLE KYAA;Lo;0;L;;;;;N;;;;; +2DCC;ETHIOPIC SYLLABLE KYEE;Lo;0;L;;;;;N;;;;; +2DCD;ETHIOPIC SYLLABLE KYE;Lo;0;L;;;;;N;;;;; +2DCE;ETHIOPIC SYLLABLE KYO;Lo;0;L;;;;;N;;;;; +2DD0;ETHIOPIC SYLLABLE XYA;Lo;0;L;;;;;N;;;;; +2DD1;ETHIOPIC SYLLABLE XYU;Lo;0;L;;;;;N;;;;; +2DD2;ETHIOPIC SYLLABLE XYI;Lo;0;L;;;;;N;;;;; +2DD3;ETHIOPIC SYLLABLE XYAA;Lo;0;L;;;;;N;;;;; +2DD4;ETHIOPIC SYLLABLE XYEE;Lo;0;L;;;;;N;;;;; +2DD5;ETHIOPIC SYLLABLE XYE;Lo;0;L;;;;;N;;;;; +2DD6;ETHIOPIC SYLLABLE XYO;Lo;0;L;;;;;N;;;;; +2DD8;ETHIOPIC SYLLABLE GYA;Lo;0;L;;;;;N;;;;; +2DD9;ETHIOPIC SYLLABLE GYU;Lo;0;L;;;;;N;;;;; +2DDA;ETHIOPIC SYLLABLE GYI;Lo;0;L;;;;;N;;;;; +2DDB;ETHIOPIC SYLLABLE GYAA;Lo;0;L;;;;;N;;;;; +2DDC;ETHIOPIC SYLLABLE GYEE;Lo;0;L;;;;;N;;;;; +2DDD;ETHIOPIC SYLLABLE GYE;Lo;0;L;;;;;N;;;;; +2DDE;ETHIOPIC SYLLABLE GYO;Lo;0;L;;;;;N;;;;; +2DE0;COMBINING CYRILLIC LETTER BE;Mn;230;NSM;;;;;N;;;;; +2DE1;COMBINING CYRILLIC LETTER VE;Mn;230;NSM;;;;;N;;;;; +2DE2;COMBINING CYRILLIC LETTER GHE;Mn;230;NSM;;;;;N;;;;; +2DE3;COMBINING CYRILLIC LETTER DE;Mn;230;NSM;;;;;N;;;;; +2DE4;COMBINING CYRILLIC LETTER ZHE;Mn;230;NSM;;;;;N;;;;; +2DE5;COMBINING CYRILLIC LETTER ZE;Mn;230;NSM;;;;;N;;;;; +2DE6;COMBINING CYRILLIC LETTER KA;Mn;230;NSM;;;;;N;;;;; +2DE7;COMBINING CYRILLIC LETTER EL;Mn;230;NSM;;;;;N;;;;; +2DE8;COMBINING CYRILLIC LETTER EM;Mn;230;NSM;;;;;N;;;;; +2DE9;COMBINING CYRILLIC LETTER EN;Mn;230;NSM;;;;;N;;;;; +2DEA;COMBINING CYRILLIC LETTER O;Mn;230;NSM;;;;;N;;;;; +2DEB;COMBINING CYRILLIC LETTER PE;Mn;230;NSM;;;;;N;;;;; +2DEC;COMBINING CYRILLIC LETTER ER;Mn;230;NSM;;;;;N;;;;; +2DED;COMBINING CYRILLIC LETTER ES;Mn;230;NSM;;;;;N;;;;; +2DEE;COMBINING CYRILLIC LETTER TE;Mn;230;NSM;;;;;N;;;;; +2DEF;COMBINING CYRILLIC LETTER HA;Mn;230;NSM;;;;;N;;;;; +2DF0;COMBINING CYRILLIC LETTER TSE;Mn;230;NSM;;;;;N;;;;; +2DF1;COMBINING CYRILLIC LETTER CHE;Mn;230;NSM;;;;;N;;;;; +2DF2;COMBINING CYRILLIC LETTER SHA;Mn;230;NSM;;;;;N;;;;; +2DF3;COMBINING CYRILLIC LETTER SHCHA;Mn;230;NSM;;;;;N;;;;; +2DF4;COMBINING CYRILLIC LETTER FITA;Mn;230;NSM;;;;;N;;;;; +2DF5;COMBINING CYRILLIC LETTER ES-TE;Mn;230;NSM;;;;;N;;;;; +2DF6;COMBINING CYRILLIC LETTER A;Mn;230;NSM;;;;;N;;;;; +2DF7;COMBINING CYRILLIC LETTER IE;Mn;230;NSM;;;;;N;;;;; +2DF8;COMBINING CYRILLIC LETTER DJERV;Mn;230;NSM;;;;;N;;;;; +2DF9;COMBINING CYRILLIC LETTER MONOGRAPH UK;Mn;230;NSM;;;;;N;;;;; +2DFA;COMBINING CYRILLIC LETTER YAT;Mn;230;NSM;;;;;N;;;;; +2DFB;COMBINING CYRILLIC LETTER YU;Mn;230;NSM;;;;;N;;;;; +2DFC;COMBINING CYRILLIC LETTER IOTIFIED A;Mn;230;NSM;;;;;N;;;;; +2DFD;COMBINING CYRILLIC LETTER LITTLE YUS;Mn;230;NSM;;;;;N;;;;; +2DFE;COMBINING CYRILLIC LETTER BIG YUS;Mn;230;NSM;;;;;N;;;;; +2DFF;COMBINING CYRILLIC LETTER IOTIFIED BIG YUS;Mn;230;NSM;;;;;N;;;;; +2E00;RIGHT ANGLE SUBSTITUTION MARKER;Po;0;ON;;;;;N;;;;; +2E01;RIGHT ANGLE DOTTED SUBSTITUTION MARKER;Po;0;ON;;;;;N;;;;; +2E02;LEFT SUBSTITUTION BRACKET;Pi;0;ON;;;;;Y;;;;; +2E03;RIGHT SUBSTITUTION BRACKET;Pf;0;ON;;;;;Y;;;;; +2E04;LEFT DOTTED SUBSTITUTION BRACKET;Pi;0;ON;;;;;Y;;;;; +2E05;RIGHT DOTTED SUBSTITUTION BRACKET;Pf;0;ON;;;;;Y;;;;; +2E06;RAISED INTERPOLATION MARKER;Po;0;ON;;;;;N;;;;; +2E07;RAISED DOTTED INTERPOLATION MARKER;Po;0;ON;;;;;N;;;;; +2E08;DOTTED TRANSPOSITION MARKER;Po;0;ON;;;;;N;;;;; +2E09;LEFT TRANSPOSITION BRACKET;Pi;0;ON;;;;;Y;;;;; +2E0A;RIGHT TRANSPOSITION BRACKET;Pf;0;ON;;;;;Y;;;;; +2E0B;RAISED SQUARE;Po;0;ON;;;;;N;;;;; +2E0C;LEFT RAISED OMISSION BRACKET;Pi;0;ON;;;;;Y;;;;; +2E0D;RIGHT RAISED OMISSION BRACKET;Pf;0;ON;;;;;Y;;;;; +2E0E;EDITORIAL CORONIS;Po;0;ON;;;;;N;;;;; +2E0F;PARAGRAPHOS;Po;0;ON;;;;;N;;;;; +2E10;FORKED PARAGRAPHOS;Po;0;ON;;;;;N;;;;; +2E11;REVERSED FORKED PARAGRAPHOS;Po;0;ON;;;;;N;;;;; +2E12;HYPODIASTOLE;Po;0;ON;;;;;N;;;;; +2E13;DOTTED OBELOS;Po;0;ON;;;;;N;;;;; +2E14;DOWNWARDS ANCORA;Po;0;ON;;;;;N;;;;; +2E15;UPWARDS ANCORA;Po;0;ON;;;;;N;;;;; +2E16;DOTTED RIGHT-POINTING ANGLE;Po;0;ON;;;;;N;;;;; +2E17;DOUBLE OBLIQUE HYPHEN;Pd;0;ON;;;;;N;;;;; +2E18;INVERTED INTERROBANG;Po;0;ON;;;;;N;;;;; +2E19;PALM BRANCH;Po;0;ON;;;;;N;;;;; +2E1A;HYPHEN WITH DIAERESIS;Pd;0;ON;;;;;N;;;;; +2E1B;TILDE WITH RING ABOVE;Po;0;ON;;;;;N;;;;; +2E1C;LEFT LOW PARAPHRASE BRACKET;Pi;0;ON;;;;;Y;;;;; +2E1D;RIGHT LOW PARAPHRASE BRACKET;Pf;0;ON;;;;;Y;;;;; +2E1E;TILDE WITH DOT ABOVE;Po;0;ON;;;;;N;;;;; +2E1F;TILDE WITH DOT BELOW;Po;0;ON;;;;;N;;;;; +2E20;LEFT VERTICAL BAR WITH QUILL;Pi;0;ON;;;;;Y;;;;; +2E21;RIGHT VERTICAL BAR WITH QUILL;Pf;0;ON;;;;;Y;;;;; +2E22;TOP LEFT HALF BRACKET;Ps;0;ON;;;;;Y;;;;; +2E23;TOP RIGHT HALF BRACKET;Pe;0;ON;;;;;Y;;;;; +2E24;BOTTOM LEFT HALF BRACKET;Ps;0;ON;;;;;Y;;;;; +2E25;BOTTOM RIGHT HALF BRACKET;Pe;0;ON;;;;;Y;;;;; +2E26;LEFT SIDEWAYS U BRACKET;Ps;0;ON;;;;;Y;;;;; +2E27;RIGHT SIDEWAYS U BRACKET;Pe;0;ON;;;;;Y;;;;; +2E28;LEFT DOUBLE PARENTHESIS;Ps;0;ON;;;;;Y;;;;; +2E29;RIGHT DOUBLE PARENTHESIS;Pe;0;ON;;;;;Y;;;;; +2E2A;TWO DOTS OVER ONE DOT PUNCTUATION;Po;0;ON;;;;;N;;;;; +2E2B;ONE DOT OVER TWO DOTS PUNCTUATION;Po;0;ON;;;;;N;;;;; +2E2C;SQUARED FOUR DOT PUNCTUATION;Po;0;ON;;;;;N;;;;; +2E2D;FIVE DOT MARK;Po;0;ON;;;;;N;;;;; +2E2E;REVERSED QUESTION MARK;Po;0;ON;;;;;N;;;;; +2E2F;VERTICAL TILDE;Lm;0;ON;;;;;N;;;;; +2E30;RING POINT;Po;0;ON;;;;;N;;;;; +2E31;WORD SEPARATOR MIDDLE DOT;Po;0;ON;;;;;N;;;;; +2E32;TURNED COMMA;Po;0;ON;;;;;N;;;;; +2E33;RAISED DOT;Po;0;ON;;;;;N;;;;; +2E34;RAISED COMMA;Po;0;ON;;;;;N;;;;; +2E35;TURNED SEMICOLON;Po;0;ON;;;;;N;;;;; +2E36;DAGGER WITH LEFT GUARD;Po;0;ON;;;;;N;;;;; +2E37;DAGGER WITH RIGHT GUARD;Po;0;ON;;;;;N;;;;; +2E38;TURNED DAGGER;Po;0;ON;;;;;N;;;;; +2E39;TOP HALF SECTION SIGN;Po;0;ON;;;;;N;;;;; +2E3A;TWO-EM DASH;Pd;0;ON;;;;;N;;;;; +2E3B;THREE-EM DASH;Pd;0;ON;;;;;N;;;;; +2E3C;STENOGRAPHIC FULL STOP;Po;0;ON;;;;;N;;;;; +2E3D;VERTICAL SIX DOTS;Po;0;ON;;;;;N;;;;; +2E3E;WIGGLY VERTICAL LINE;Po;0;ON;;;;;N;;;;; +2E3F;CAPITULUM;Po;0;ON;;;;;N;;;;; +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;;;;; +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;;;;; +2E4A;DOTTED SOLIDUS;Po;0;ON;;;;;N;;;;; +2E4B;TRIPLE DAGGER;Po;0;ON;;;;;N;;;;; +2E4C;MEDIEVAL COMMA;Po;0;ON;;;;;N;;;;; +2E4D;PARAGRAPHUS MARK;Po;0;ON;;;;;N;;;;; +2E4E;PUNCTUS ELEVATUS 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;;;;; +2E83;CJK RADICAL SECOND TWO;So;0;ON;;;;;N;;;;; +2E84;CJK RADICAL SECOND THREE;So;0;ON;;;;;N;;;;; +2E85;CJK RADICAL PERSON;So;0;ON;;;;;N;;;;; +2E86;CJK RADICAL BOX;So;0;ON;;;;;N;;;;; +2E87;CJK RADICAL TABLE;So;0;ON;;;;;N;;;;; +2E88;CJK RADICAL KNIFE ONE;So;0;ON;;;;;N;;;;; +2E89;CJK RADICAL KNIFE TWO;So;0;ON;;;;;N;;;;; +2E8A;CJK RADICAL DIVINATION;So;0;ON;;;;;N;;;;; +2E8B;CJK RADICAL SEAL;So;0;ON;;;;;N;;;;; +2E8C;CJK RADICAL SMALL ONE;So;0;ON;;;;;N;;;;; +2E8D;CJK RADICAL SMALL TWO;So;0;ON;;;;;N;;;;; +2E8E;CJK RADICAL LAME ONE;So;0;ON;;;;;N;;;;; +2E8F;CJK RADICAL LAME TWO;So;0;ON;;;;;N;;;;; +2E90;CJK RADICAL LAME THREE;So;0;ON;;;;;N;;;;; +2E91;CJK RADICAL LAME FOUR;So;0;ON;;;;;N;;;;; +2E92;CJK RADICAL SNAKE;So;0;ON;;;;;N;;;;; +2E93;CJK RADICAL THREAD;So;0;ON;;;;;N;;;;; +2E94;CJK RADICAL SNOUT ONE;So;0;ON;;;;;N;;;;; +2E95;CJK RADICAL SNOUT TWO;So;0;ON;;;;;N;;;;; +2E96;CJK RADICAL HEART ONE;So;0;ON;;;;;N;;;;; +2E97;CJK RADICAL HEART TWO;So;0;ON;;;;;N;;;;; +2E98;CJK RADICAL HAND;So;0;ON;;;;;N;;;;; +2E99;CJK RADICAL RAP;So;0;ON;;;;;N;;;;; +2E9B;CJK RADICAL CHOKE;So;0;ON;;;;;N;;;;; +2E9C;CJK RADICAL SUN;So;0;ON;;;;;N;;;;; +2E9D;CJK RADICAL MOON;So;0;ON;;;;;N;;;;; +2E9E;CJK RADICAL DEATH;So;0;ON;;;;;N;;;;; +2E9F;CJK RADICAL MOTHER;So;0;ON;<compat> 6BCD;;;;N;;;;; +2EA0;CJK RADICAL CIVILIAN;So;0;ON;;;;;N;;;;; +2EA1;CJK RADICAL WATER ONE;So;0;ON;;;;;N;;;;; +2EA2;CJK RADICAL WATER TWO;So;0;ON;;;;;N;;;;; +2EA3;CJK RADICAL FIRE;So;0;ON;;;;;N;;;;; +2EA4;CJK RADICAL PAW ONE;So;0;ON;;;;;N;;;;; +2EA5;CJK RADICAL PAW TWO;So;0;ON;;;;;N;;;;; +2EA6;CJK RADICAL SIMPLIFIED HALF TREE TRUNK;So;0;ON;;;;;N;;;;; +2EA7;CJK RADICAL COW;So;0;ON;;;;;N;;;;; +2EA8;CJK RADICAL DOG;So;0;ON;;;;;N;;;;; +2EA9;CJK RADICAL JADE;So;0;ON;;;;;N;;;;; +2EAA;CJK RADICAL BOLT OF CLOTH;So;0;ON;;;;;N;;;;; +2EAB;CJK RADICAL EYE;So;0;ON;;;;;N;;;;; +2EAC;CJK RADICAL SPIRIT ONE;So;0;ON;;;;;N;;;;; +2EAD;CJK RADICAL SPIRIT TWO;So;0;ON;;;;;N;;;;; +2EAE;CJK RADICAL BAMBOO;So;0;ON;;;;;N;;;;; +2EAF;CJK RADICAL SILK;So;0;ON;;;;;N;;;;; +2EB0;CJK RADICAL C-SIMPLIFIED SILK;So;0;ON;;;;;N;;;;; +2EB1;CJK RADICAL NET ONE;So;0;ON;;;;;N;;;;; +2EB2;CJK RADICAL NET TWO;So;0;ON;;;;;N;;;;; +2EB3;CJK RADICAL NET THREE;So;0;ON;;;;;N;;;;; +2EB4;CJK RADICAL NET FOUR;So;0;ON;;;;;N;;;;; +2EB5;CJK RADICAL MESH;So;0;ON;;;;;N;;;;; +2EB6;CJK RADICAL SHEEP;So;0;ON;;;;;N;;;;; +2EB7;CJK RADICAL RAM;So;0;ON;;;;;N;;;;; +2EB8;CJK RADICAL EWE;So;0;ON;;;;;N;;;;; +2EB9;CJK RADICAL OLD;So;0;ON;;;;;N;;;;; +2EBA;CJK RADICAL BRUSH ONE;So;0;ON;;;;;N;;;;; +2EBB;CJK RADICAL BRUSH TWO;So;0;ON;;;;;N;;;;; +2EBC;CJK RADICAL MEAT;So;0;ON;;;;;N;;;;; +2EBD;CJK RADICAL MORTAR;So;0;ON;;;;;N;;;;; +2EBE;CJK RADICAL GRASS ONE;So;0;ON;;;;;N;;;;; +2EBF;CJK RADICAL GRASS TWO;So;0;ON;;;;;N;;;;; +2EC0;CJK RADICAL GRASS THREE;So;0;ON;;;;;N;;;;; +2EC1;CJK RADICAL TIGER;So;0;ON;;;;;N;;;;; +2EC2;CJK RADICAL CLOTHES;So;0;ON;;;;;N;;;;; +2EC3;CJK RADICAL WEST ONE;So;0;ON;;;;;N;;;;; +2EC4;CJK RADICAL WEST TWO;So;0;ON;;;;;N;;;;; +2EC5;CJK RADICAL C-SIMPLIFIED SEE;So;0;ON;;;;;N;;;;; +2EC6;CJK RADICAL SIMPLIFIED HORN;So;0;ON;;;;;N;;;;; +2EC7;CJK RADICAL HORN;So;0;ON;;;;;N;;;;; +2EC8;CJK RADICAL C-SIMPLIFIED SPEECH;So;0;ON;;;;;N;;;;; +2EC9;CJK RADICAL C-SIMPLIFIED SHELL;So;0;ON;;;;;N;;;;; +2ECA;CJK RADICAL FOOT;So;0;ON;;;;;N;;;;; +2ECB;CJK RADICAL C-SIMPLIFIED CART;So;0;ON;;;;;N;;;;; +2ECC;CJK RADICAL SIMPLIFIED WALK;So;0;ON;;;;;N;;;;; +2ECD;CJK RADICAL WALK ONE;So;0;ON;;;;;N;;;;; +2ECE;CJK RADICAL WALK TWO;So;0;ON;;;;;N;;;;; +2ECF;CJK RADICAL CITY;So;0;ON;;;;;N;;;;; +2ED0;CJK RADICAL C-SIMPLIFIED GOLD;So;0;ON;;;;;N;;;;; +2ED1;CJK RADICAL LONG ONE;So;0;ON;;;;;N;;;;; +2ED2;CJK RADICAL LONG TWO;So;0;ON;;;;;N;;;;; +2ED3;CJK RADICAL C-SIMPLIFIED LONG;So;0;ON;;;;;N;;;;; +2ED4;CJK RADICAL C-SIMPLIFIED GATE;So;0;ON;;;;;N;;;;; +2ED5;CJK RADICAL MOUND ONE;So;0;ON;;;;;N;;;;; +2ED6;CJK RADICAL MOUND TWO;So;0;ON;;;;;N;;;;; +2ED7;CJK RADICAL RAIN;So;0;ON;;;;;N;;;;; +2ED8;CJK RADICAL BLUE;So;0;ON;;;;;N;;;;; +2ED9;CJK RADICAL C-SIMPLIFIED TANNED LEATHER;So;0;ON;;;;;N;;;;; +2EDA;CJK RADICAL C-SIMPLIFIED LEAF;So;0;ON;;;;;N;;;;; +2EDB;CJK RADICAL C-SIMPLIFIED WIND;So;0;ON;;;;;N;;;;; +2EDC;CJK RADICAL C-SIMPLIFIED FLY;So;0;ON;;;;;N;;;;; +2EDD;CJK RADICAL EAT ONE;So;0;ON;;;;;N;;;;; +2EDE;CJK RADICAL EAT TWO;So;0;ON;;;;;N;;;;; +2EDF;CJK RADICAL EAT THREE;So;0;ON;;;;;N;;;;; +2EE0;CJK RADICAL C-SIMPLIFIED EAT;So;0;ON;;;;;N;;;;; +2EE1;CJK RADICAL HEAD;So;0;ON;;;;;N;;;;; +2EE2;CJK RADICAL C-SIMPLIFIED HORSE;So;0;ON;;;;;N;;;;; +2EE3;CJK RADICAL BONE;So;0;ON;;;;;N;;;;; +2EE4;CJK RADICAL GHOST;So;0;ON;;;;;N;;;;; +2EE5;CJK RADICAL C-SIMPLIFIED FISH;So;0;ON;;;;;N;;;;; +2EE6;CJK RADICAL C-SIMPLIFIED BIRD;So;0;ON;;;;;N;;;;; +2EE7;CJK RADICAL C-SIMPLIFIED SALT;So;0;ON;;;;;N;;;;; +2EE8;CJK RADICAL SIMPLIFIED WHEAT;So;0;ON;;;;;N;;;;; +2EE9;CJK RADICAL SIMPLIFIED YELLOW;So;0;ON;;;;;N;;;;; +2EEA;CJK RADICAL C-SIMPLIFIED FROG;So;0;ON;;;;;N;;;;; +2EEB;CJK RADICAL J-SIMPLIFIED EVEN;So;0;ON;;;;;N;;;;; +2EEC;CJK RADICAL C-SIMPLIFIED EVEN;So;0;ON;;;;;N;;;;; +2EED;CJK RADICAL J-SIMPLIFIED TOOTH;So;0;ON;;;;;N;;;;; +2EEE;CJK RADICAL C-SIMPLIFIED TOOTH;So;0;ON;;;;;N;;;;; +2EEF;CJK RADICAL J-SIMPLIFIED DRAGON;So;0;ON;;;;;N;;;;; +2EF0;CJK RADICAL C-SIMPLIFIED DRAGON;So;0;ON;;;;;N;;;;; +2EF1;CJK RADICAL TURTLE;So;0;ON;;;;;N;;;;; +2EF2;CJK RADICAL J-SIMPLIFIED TURTLE;So;0;ON;;;;;N;;;;; +2EF3;CJK RADICAL C-SIMPLIFIED TURTLE;So;0;ON;<compat> 9F9F;;;;N;;;;; +2F00;KANGXI RADICAL ONE;So;0;ON;<compat> 4E00;;;;N;;;;; +2F01;KANGXI RADICAL LINE;So;0;ON;<compat> 4E28;;;;N;;;;; +2F02;KANGXI RADICAL DOT;So;0;ON;<compat> 4E36;;;;N;;;;; +2F03;KANGXI RADICAL SLASH;So;0;ON;<compat> 4E3F;;;;N;;;;; +2F04;KANGXI RADICAL SECOND;So;0;ON;<compat> 4E59;;;;N;;;;; +2F05;KANGXI RADICAL HOOK;So;0;ON;<compat> 4E85;;;;N;;;;; +2F06;KANGXI RADICAL TWO;So;0;ON;<compat> 4E8C;;;;N;;;;; +2F07;KANGXI RADICAL LID;So;0;ON;<compat> 4EA0;;;;N;;;;; +2F08;KANGXI RADICAL MAN;So;0;ON;<compat> 4EBA;;;;N;;;;; +2F09;KANGXI RADICAL LEGS;So;0;ON;<compat> 513F;;;;N;;;;; +2F0A;KANGXI RADICAL ENTER;So;0;ON;<compat> 5165;;;;N;;;;; +2F0B;KANGXI RADICAL EIGHT;So;0;ON;<compat> 516B;;;;N;;;;; +2F0C;KANGXI RADICAL DOWN BOX;So;0;ON;<compat> 5182;;;;N;;;;; +2F0D;KANGXI RADICAL COVER;So;0;ON;<compat> 5196;;;;N;;;;; +2F0E;KANGXI RADICAL ICE;So;0;ON;<compat> 51AB;;;;N;;;;; +2F0F;KANGXI RADICAL TABLE;So;0;ON;<compat> 51E0;;;;N;;;;; +2F10;KANGXI RADICAL OPEN BOX;So;0;ON;<compat> 51F5;;;;N;;;;; +2F11;KANGXI RADICAL KNIFE;So;0;ON;<compat> 5200;;;;N;;;;; +2F12;KANGXI RADICAL POWER;So;0;ON;<compat> 529B;;;;N;;;;; +2F13;KANGXI RADICAL WRAP;So;0;ON;<compat> 52F9;;;;N;;;;; +2F14;KANGXI RADICAL SPOON;So;0;ON;<compat> 5315;;;;N;;;;; +2F15;KANGXI RADICAL RIGHT OPEN BOX;So;0;ON;<compat> 531A;;;;N;;;;; +2F16;KANGXI RADICAL HIDING ENCLOSURE;So;0;ON;<compat> 5338;;;;N;;;;; +2F17;KANGXI RADICAL TEN;So;0;ON;<compat> 5341;;;;N;;;;; +2F18;KANGXI RADICAL DIVINATION;So;0;ON;<compat> 535C;;;;N;;;;; +2F19;KANGXI RADICAL SEAL;So;0;ON;<compat> 5369;;;;N;;;;; +2F1A;KANGXI RADICAL CLIFF;So;0;ON;<compat> 5382;;;;N;;;;; +2F1B;KANGXI RADICAL PRIVATE;So;0;ON;<compat> 53B6;;;;N;;;;; +2F1C;KANGXI RADICAL AGAIN;So;0;ON;<compat> 53C8;;;;N;;;;; +2F1D;KANGXI RADICAL MOUTH;So;0;ON;<compat> 53E3;;;;N;;;;; +2F1E;KANGXI RADICAL ENCLOSURE;So;0;ON;<compat> 56D7;;;;N;;;;; +2F1F;KANGXI RADICAL EARTH;So;0;ON;<compat> 571F;;;;N;;;;; +2F20;KANGXI RADICAL SCHOLAR;So;0;ON;<compat> 58EB;;;;N;;;;; +2F21;KANGXI RADICAL GO;So;0;ON;<compat> 5902;;;;N;;;;; +2F22;KANGXI RADICAL GO SLOWLY;So;0;ON;<compat> 590A;;;;N;;;;; +2F23;KANGXI RADICAL EVENING;So;0;ON;<compat> 5915;;;;N;;;;; +2F24;KANGXI RADICAL BIG;So;0;ON;<compat> 5927;;;;N;;;;; +2F25;KANGXI RADICAL WOMAN;So;0;ON;<compat> 5973;;;;N;;;;; +2F26;KANGXI RADICAL CHILD;So;0;ON;<compat> 5B50;;;;N;;;;; +2F27;KANGXI RADICAL ROOF;So;0;ON;<compat> 5B80;;;;N;;;;; +2F28;KANGXI RADICAL INCH;So;0;ON;<compat> 5BF8;;;;N;;;;; +2F29;KANGXI RADICAL SMALL;So;0;ON;<compat> 5C0F;;;;N;;;;; +2F2A;KANGXI RADICAL LAME;So;0;ON;<compat> 5C22;;;;N;;;;; +2F2B;KANGXI RADICAL CORPSE;So;0;ON;<compat> 5C38;;;;N;;;;; +2F2C;KANGXI RADICAL SPROUT;So;0;ON;<compat> 5C6E;;;;N;;;;; +2F2D;KANGXI RADICAL MOUNTAIN;So;0;ON;<compat> 5C71;;;;N;;;;; +2F2E;KANGXI RADICAL RIVER;So;0;ON;<compat> 5DDB;;;;N;;;;; +2F2F;KANGXI RADICAL WORK;So;0;ON;<compat> 5DE5;;;;N;;;;; +2F30;KANGXI RADICAL ONESELF;So;0;ON;<compat> 5DF1;;;;N;;;;; +2F31;KANGXI RADICAL TURBAN;So;0;ON;<compat> 5DFE;;;;N;;;;; +2F32;KANGXI RADICAL DRY;So;0;ON;<compat> 5E72;;;;N;;;;; +2F33;KANGXI RADICAL SHORT THREAD;So;0;ON;<compat> 5E7A;;;;N;;;;; +2F34;KANGXI RADICAL DOTTED CLIFF;So;0;ON;<compat> 5E7F;;;;N;;;;; +2F35;KANGXI RADICAL LONG STRIDE;So;0;ON;<compat> 5EF4;;;;N;;;;; +2F36;KANGXI RADICAL TWO HANDS;So;0;ON;<compat> 5EFE;;;;N;;;;; +2F37;KANGXI RADICAL SHOOT;So;0;ON;<compat> 5F0B;;;;N;;;;; +2F38;KANGXI RADICAL BOW;So;0;ON;<compat> 5F13;;;;N;;;;; +2F39;KANGXI RADICAL SNOUT;So;0;ON;<compat> 5F50;;;;N;;;;; +2F3A;KANGXI RADICAL BRISTLE;So;0;ON;<compat> 5F61;;;;N;;;;; +2F3B;KANGXI RADICAL STEP;So;0;ON;<compat> 5F73;;;;N;;;;; +2F3C;KANGXI RADICAL HEART;So;0;ON;<compat> 5FC3;;;;N;;;;; +2F3D;KANGXI RADICAL HALBERD;So;0;ON;<compat> 6208;;;;N;;;;; +2F3E;KANGXI RADICAL DOOR;So;0;ON;<compat> 6236;;;;N;;;;; +2F3F;KANGXI RADICAL HAND;So;0;ON;<compat> 624B;;;;N;;;;; +2F40;KANGXI RADICAL BRANCH;So;0;ON;<compat> 652F;;;;N;;;;; +2F41;KANGXI RADICAL RAP;So;0;ON;<compat> 6534;;;;N;;;;; +2F42;KANGXI RADICAL SCRIPT;So;0;ON;<compat> 6587;;;;N;;;;; +2F43;KANGXI RADICAL DIPPER;So;0;ON;<compat> 6597;;;;N;;;;; +2F44;KANGXI RADICAL AXE;So;0;ON;<compat> 65A4;;;;N;;;;; +2F45;KANGXI RADICAL SQUARE;So;0;ON;<compat> 65B9;;;;N;;;;; +2F46;KANGXI RADICAL NOT;So;0;ON;<compat> 65E0;;;;N;;;;; +2F47;KANGXI RADICAL SUN;So;0;ON;<compat> 65E5;;;;N;;;;; +2F48;KANGXI RADICAL SAY;So;0;ON;<compat> 66F0;;;;N;;;;; +2F49;KANGXI RADICAL MOON;So;0;ON;<compat> 6708;;;;N;;;;; +2F4A;KANGXI RADICAL TREE;So;0;ON;<compat> 6728;;;;N;;;;; +2F4B;KANGXI RADICAL LACK;So;0;ON;<compat> 6B20;;;;N;;;;; +2F4C;KANGXI RADICAL STOP;So;0;ON;<compat> 6B62;;;;N;;;;; +2F4D;KANGXI RADICAL DEATH;So;0;ON;<compat> 6B79;;;;N;;;;; +2F4E;KANGXI RADICAL WEAPON;So;0;ON;<compat> 6BB3;;;;N;;;;; +2F4F;KANGXI RADICAL DO NOT;So;0;ON;<compat> 6BCB;;;;N;;;;; +2F50;KANGXI RADICAL COMPARE;So;0;ON;<compat> 6BD4;;;;N;;;;; +2F51;KANGXI RADICAL FUR;So;0;ON;<compat> 6BDB;;;;N;;;;; +2F52;KANGXI RADICAL CLAN;So;0;ON;<compat> 6C0F;;;;N;;;;; +2F53;KANGXI RADICAL STEAM;So;0;ON;<compat> 6C14;;;;N;;;;; +2F54;KANGXI RADICAL WATER;So;0;ON;<compat> 6C34;;;;N;;;;; +2F55;KANGXI RADICAL FIRE;So;0;ON;<compat> 706B;;;;N;;;;; +2F56;KANGXI RADICAL CLAW;So;0;ON;<compat> 722A;;;;N;;;;; +2F57;KANGXI RADICAL FATHER;So;0;ON;<compat> 7236;;;;N;;;;; +2F58;KANGXI RADICAL DOUBLE X;So;0;ON;<compat> 723B;;;;N;;;;; +2F59;KANGXI RADICAL HALF TREE TRUNK;So;0;ON;<compat> 723F;;;;N;;;;; +2F5A;KANGXI RADICAL SLICE;So;0;ON;<compat> 7247;;;;N;;;;; +2F5B;KANGXI RADICAL FANG;So;0;ON;<compat> 7259;;;;N;;;;; +2F5C;KANGXI RADICAL COW;So;0;ON;<compat> 725B;;;;N;;;;; +2F5D;KANGXI RADICAL DOG;So;0;ON;<compat> 72AC;;;;N;;;;; +2F5E;KANGXI RADICAL PROFOUND;So;0;ON;<compat> 7384;;;;N;;;;; +2F5F;KANGXI RADICAL JADE;So;0;ON;<compat> 7389;;;;N;;;;; +2F60;KANGXI RADICAL MELON;So;0;ON;<compat> 74DC;;;;N;;;;; +2F61;KANGXI RADICAL TILE;So;0;ON;<compat> 74E6;;;;N;;;;; +2F62;KANGXI RADICAL SWEET;So;0;ON;<compat> 7518;;;;N;;;;; +2F63;KANGXI RADICAL LIFE;So;0;ON;<compat> 751F;;;;N;;;;; +2F64;KANGXI RADICAL USE;So;0;ON;<compat> 7528;;;;N;;;;; +2F65;KANGXI RADICAL FIELD;So;0;ON;<compat> 7530;;;;N;;;;; +2F66;KANGXI RADICAL BOLT OF CLOTH;So;0;ON;<compat> 758B;;;;N;;;;; +2F67;KANGXI RADICAL SICKNESS;So;0;ON;<compat> 7592;;;;N;;;;; +2F68;KANGXI RADICAL DOTTED TENT;So;0;ON;<compat> 7676;;;;N;;;;; +2F69;KANGXI RADICAL WHITE;So;0;ON;<compat> 767D;;;;N;;;;; +2F6A;KANGXI RADICAL SKIN;So;0;ON;<compat> 76AE;;;;N;;;;; +2F6B;KANGXI RADICAL DISH;So;0;ON;<compat> 76BF;;;;N;;;;; +2F6C;KANGXI RADICAL EYE;So;0;ON;<compat> 76EE;;;;N;;;;; +2F6D;KANGXI RADICAL SPEAR;So;0;ON;<compat> 77DB;;;;N;;;;; +2F6E;KANGXI RADICAL ARROW;So;0;ON;<compat> 77E2;;;;N;;;;; +2F6F;KANGXI RADICAL STONE;So;0;ON;<compat> 77F3;;;;N;;;;; +2F70;KANGXI RADICAL SPIRIT;So;0;ON;<compat> 793A;;;;N;;;;; +2F71;KANGXI RADICAL TRACK;So;0;ON;<compat> 79B8;;;;N;;;;; +2F72;KANGXI RADICAL GRAIN;So;0;ON;<compat> 79BE;;;;N;;;;; +2F73;KANGXI RADICAL CAVE;So;0;ON;<compat> 7A74;;;;N;;;;; +2F74;KANGXI RADICAL STAND;So;0;ON;<compat> 7ACB;;;;N;;;;; +2F75;KANGXI RADICAL BAMBOO;So;0;ON;<compat> 7AF9;;;;N;;;;; +2F76;KANGXI RADICAL RICE;So;0;ON;<compat> 7C73;;;;N;;;;; +2F77;KANGXI RADICAL SILK;So;0;ON;<compat> 7CF8;;;;N;;;;; +2F78;KANGXI RADICAL JAR;So;0;ON;<compat> 7F36;;;;N;;;;; +2F79;KANGXI RADICAL NET;So;0;ON;<compat> 7F51;;;;N;;;;; +2F7A;KANGXI RADICAL SHEEP;So;0;ON;<compat> 7F8A;;;;N;;;;; +2F7B;KANGXI RADICAL FEATHER;So;0;ON;<compat> 7FBD;;;;N;;;;; +2F7C;KANGXI RADICAL OLD;So;0;ON;<compat> 8001;;;;N;;;;; +2F7D;KANGXI RADICAL AND;So;0;ON;<compat> 800C;;;;N;;;;; +2F7E;KANGXI RADICAL PLOW;So;0;ON;<compat> 8012;;;;N;;;;; +2F7F;KANGXI RADICAL EAR;So;0;ON;<compat> 8033;;;;N;;;;; +2F80;KANGXI RADICAL BRUSH;So;0;ON;<compat> 807F;;;;N;;;;; +2F81;KANGXI RADICAL MEAT;So;0;ON;<compat> 8089;;;;N;;;;; +2F82;KANGXI RADICAL MINISTER;So;0;ON;<compat> 81E3;;;;N;;;;; +2F83;KANGXI RADICAL SELF;So;0;ON;<compat> 81EA;;;;N;;;;; +2F84;KANGXI RADICAL ARRIVE;So;0;ON;<compat> 81F3;;;;N;;;;; +2F85;KANGXI RADICAL MORTAR;So;0;ON;<compat> 81FC;;;;N;;;;; +2F86;KANGXI RADICAL TONGUE;So;0;ON;<compat> 820C;;;;N;;;;; +2F87;KANGXI RADICAL OPPOSE;So;0;ON;<compat> 821B;;;;N;;;;; +2F88;KANGXI RADICAL BOAT;So;0;ON;<compat> 821F;;;;N;;;;; +2F89;KANGXI RADICAL STOPPING;So;0;ON;<compat> 826E;;;;N;;;;; +2F8A;KANGXI RADICAL COLOR;So;0;ON;<compat> 8272;;;;N;;;;; +2F8B;KANGXI RADICAL GRASS;So;0;ON;<compat> 8278;;;;N;;;;; +2F8C;KANGXI RADICAL TIGER;So;0;ON;<compat> 864D;;;;N;;;;; +2F8D;KANGXI RADICAL INSECT;So;0;ON;<compat> 866B;;;;N;;;;; +2F8E;KANGXI RADICAL BLOOD;So;0;ON;<compat> 8840;;;;N;;;;; +2F8F;KANGXI RADICAL WALK ENCLOSURE;So;0;ON;<compat> 884C;;;;N;;;;; +2F90;KANGXI RADICAL CLOTHES;So;0;ON;<compat> 8863;;;;N;;;;; +2F91;KANGXI RADICAL WEST;So;0;ON;<compat> 897E;;;;N;;;;; +2F92;KANGXI RADICAL SEE;So;0;ON;<compat> 898B;;;;N;;;;; +2F93;KANGXI RADICAL HORN;So;0;ON;<compat> 89D2;;;;N;;;;; +2F94;KANGXI RADICAL SPEECH;So;0;ON;<compat> 8A00;;;;N;;;;; +2F95;KANGXI RADICAL VALLEY;So;0;ON;<compat> 8C37;;;;N;;;;; +2F96;KANGXI RADICAL BEAN;So;0;ON;<compat> 8C46;;;;N;;;;; +2F97;KANGXI RADICAL PIG;So;0;ON;<compat> 8C55;;;;N;;;;; +2F98;KANGXI RADICAL BADGER;So;0;ON;<compat> 8C78;;;;N;;;;; +2F99;KANGXI RADICAL SHELL;So;0;ON;<compat> 8C9D;;;;N;;;;; +2F9A;KANGXI RADICAL RED;So;0;ON;<compat> 8D64;;;;N;;;;; +2F9B;KANGXI RADICAL RUN;So;0;ON;<compat> 8D70;;;;N;;;;; +2F9C;KANGXI RADICAL FOOT;So;0;ON;<compat> 8DB3;;;;N;;;;; +2F9D;KANGXI RADICAL BODY;So;0;ON;<compat> 8EAB;;;;N;;;;; +2F9E;KANGXI RADICAL CART;So;0;ON;<compat> 8ECA;;;;N;;;;; +2F9F;KANGXI RADICAL BITTER;So;0;ON;<compat> 8F9B;;;;N;;;;; +2FA0;KANGXI RADICAL MORNING;So;0;ON;<compat> 8FB0;;;;N;;;;; +2FA1;KANGXI RADICAL WALK;So;0;ON;<compat> 8FB5;;;;N;;;;; +2FA2;KANGXI RADICAL CITY;So;0;ON;<compat> 9091;;;;N;;;;; +2FA3;KANGXI RADICAL WINE;So;0;ON;<compat> 9149;;;;N;;;;; +2FA4;KANGXI RADICAL DISTINGUISH;So;0;ON;<compat> 91C6;;;;N;;;;; +2FA5;KANGXI RADICAL VILLAGE;So;0;ON;<compat> 91CC;;;;N;;;;; +2FA6;KANGXI RADICAL GOLD;So;0;ON;<compat> 91D1;;;;N;;;;; +2FA7;KANGXI RADICAL LONG;So;0;ON;<compat> 9577;;;;N;;;;; +2FA8;KANGXI RADICAL GATE;So;0;ON;<compat> 9580;;;;N;;;;; +2FA9;KANGXI RADICAL MOUND;So;0;ON;<compat> 961C;;;;N;;;;; +2FAA;KANGXI RADICAL SLAVE;So;0;ON;<compat> 96B6;;;;N;;;;; +2FAB;KANGXI RADICAL SHORT TAILED BIRD;So;0;ON;<compat> 96B9;;;;N;;;;; +2FAC;KANGXI RADICAL RAIN;So;0;ON;<compat> 96E8;;;;N;;;;; +2FAD;KANGXI RADICAL BLUE;So;0;ON;<compat> 9751;;;;N;;;;; +2FAE;KANGXI RADICAL WRONG;So;0;ON;<compat> 975E;;;;N;;;;; +2FAF;KANGXI RADICAL FACE;So;0;ON;<compat> 9762;;;;N;;;;; +2FB0;KANGXI RADICAL LEATHER;So;0;ON;<compat> 9769;;;;N;;;;; +2FB1;KANGXI RADICAL TANNED LEATHER;So;0;ON;<compat> 97CB;;;;N;;;;; +2FB2;KANGXI RADICAL LEEK;So;0;ON;<compat> 97ED;;;;N;;;;; +2FB3;KANGXI RADICAL SOUND;So;0;ON;<compat> 97F3;;;;N;;;;; +2FB4;KANGXI RADICAL LEAF;So;0;ON;<compat> 9801;;;;N;;;;; +2FB5;KANGXI RADICAL WIND;So;0;ON;<compat> 98A8;;;;N;;;;; +2FB6;KANGXI RADICAL FLY;So;0;ON;<compat> 98DB;;;;N;;;;; +2FB7;KANGXI RADICAL EAT;So;0;ON;<compat> 98DF;;;;N;;;;; +2FB8;KANGXI RADICAL HEAD;So;0;ON;<compat> 9996;;;;N;;;;; +2FB9;KANGXI RADICAL FRAGRANT;So;0;ON;<compat> 9999;;;;N;;;;; +2FBA;KANGXI RADICAL HORSE;So;0;ON;<compat> 99AC;;;;N;;;;; +2FBB;KANGXI RADICAL BONE;So;0;ON;<compat> 9AA8;;;;N;;;;; +2FBC;KANGXI RADICAL TALL;So;0;ON;<compat> 9AD8;;;;N;;;;; +2FBD;KANGXI RADICAL HAIR;So;0;ON;<compat> 9ADF;;;;N;;;;; +2FBE;KANGXI RADICAL FIGHT;So;0;ON;<compat> 9B25;;;;N;;;;; +2FBF;KANGXI RADICAL SACRIFICIAL WINE;So;0;ON;<compat> 9B2F;;;;N;;;;; +2FC0;KANGXI RADICAL CAULDRON;So;0;ON;<compat> 9B32;;;;N;;;;; +2FC1;KANGXI RADICAL GHOST;So;0;ON;<compat> 9B3C;;;;N;;;;; +2FC2;KANGXI RADICAL FISH;So;0;ON;<compat> 9B5A;;;;N;;;;; +2FC3;KANGXI RADICAL BIRD;So;0;ON;<compat> 9CE5;;;;N;;;;; +2FC4;KANGXI RADICAL SALT;So;0;ON;<compat> 9E75;;;;N;;;;; +2FC5;KANGXI RADICAL DEER;So;0;ON;<compat> 9E7F;;;;N;;;;; +2FC6;KANGXI RADICAL WHEAT;So;0;ON;<compat> 9EA5;;;;N;;;;; +2FC7;KANGXI RADICAL HEMP;So;0;ON;<compat> 9EBB;;;;N;;;;; +2FC8;KANGXI RADICAL YELLOW;So;0;ON;<compat> 9EC3;;;;N;;;;; +2FC9;KANGXI RADICAL MILLET;So;0;ON;<compat> 9ECD;;;;N;;;;; +2FCA;KANGXI RADICAL BLACK;So;0;ON;<compat> 9ED1;;;;N;;;;; +2FCB;KANGXI RADICAL EMBROIDERY;So;0;ON;<compat> 9EF9;;;;N;;;;; +2FCC;KANGXI RADICAL FROG;So;0;ON;<compat> 9EFD;;;;N;;;;; +2FCD;KANGXI RADICAL TRIPOD;So;0;ON;<compat> 9F0E;;;;N;;;;; +2FCE;KANGXI RADICAL DRUM;So;0;ON;<compat> 9F13;;;;N;;;;; +2FCF;KANGXI RADICAL RAT;So;0;ON;<compat> 9F20;;;;N;;;;; +2FD0;KANGXI RADICAL NOSE;So;0;ON;<compat> 9F3B;;;;N;;;;; +2FD1;KANGXI RADICAL EVEN;So;0;ON;<compat> 9F4A;;;;N;;;;; +2FD2;KANGXI RADICAL TOOTH;So;0;ON;<compat> 9F52;;;;N;;;;; +2FD3;KANGXI RADICAL DRAGON;So;0;ON;<compat> 9F8D;;;;N;;;;; +2FD4;KANGXI RADICAL TURTLE;So;0;ON;<compat> 9F9C;;;;N;;;;; +2FD5;KANGXI RADICAL FLUTE;So;0;ON;<compat> 9FA0;;;;N;;;;; +2FF0;IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT;So;0;ON;;;;;N;;;;; +2FF1;IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO BELOW;So;0;ON;;;;;N;;;;; +2FF2;IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO MIDDLE AND RIGHT;So;0;ON;;;;;N;;;;; +2FF3;IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO MIDDLE AND BELOW;So;0;ON;;;;;N;;;;; +2FF4;IDEOGRAPHIC DESCRIPTION CHARACTER FULL SURROUND;So;0;ON;;;;;N;;;;; +2FF5;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM ABOVE;So;0;ON;;;;;N;;;;; +2FF6;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM BELOW;So;0;ON;;;;;N;;;;; +2FF7;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LEFT;So;0;ON;;;;;N;;;;; +2FF8;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER LEFT;So;0;ON;;;;;N;;;;; +2FF9;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER RIGHT;So;0;ON;;;;;N;;;;; +2FFA;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LOWER LEFT;So;0;ON;;;;;N;;;;; +2FFB;IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID;So;0;ON;;;;;N;;;;; +3000;IDEOGRAPHIC SPACE;Zs;0;WS;<wide> 0020;;;;N;;;;; +3001;IDEOGRAPHIC COMMA;Po;0;ON;;;;;N;;;;; +3002;IDEOGRAPHIC FULL STOP;Po;0;ON;;;;;N;IDEOGRAPHIC PERIOD;;;; +3003;DITTO MARK;Po;0;ON;;;;;N;;;;; +3004;JAPANESE INDUSTRIAL STANDARD SYMBOL;So;0;ON;;;;;N;;;;; +3005;IDEOGRAPHIC ITERATION MARK;Lm;0;L;;;;;N;;;;; +3006;IDEOGRAPHIC CLOSING MARK;Lo;0;L;;;;;N;;;;; +3007;IDEOGRAPHIC NUMBER ZERO;Nl;0;L;;;;0;N;;;;; +3008;LEFT ANGLE BRACKET;Ps;0;ON;;;;;Y;OPENING ANGLE BRACKET;;;; +3009;RIGHT ANGLE BRACKET;Pe;0;ON;;;;;Y;CLOSING ANGLE BRACKET;;;; +300A;LEFT DOUBLE ANGLE BRACKET;Ps;0;ON;;;;;Y;OPENING DOUBLE ANGLE BRACKET;;;; +300B;RIGHT DOUBLE ANGLE BRACKET;Pe;0;ON;;;;;Y;CLOSING DOUBLE ANGLE BRACKET;;;; +300C;LEFT CORNER BRACKET;Ps;0;ON;;;;;Y;OPENING CORNER BRACKET;;;; +300D;RIGHT CORNER BRACKET;Pe;0;ON;;;;;Y;CLOSING CORNER BRACKET;;;; +300E;LEFT WHITE CORNER BRACKET;Ps;0;ON;;;;;Y;OPENING WHITE CORNER BRACKET;;;; +300F;RIGHT WHITE CORNER BRACKET;Pe;0;ON;;;;;Y;CLOSING WHITE CORNER BRACKET;;;; +3010;LEFT BLACK LENTICULAR BRACKET;Ps;0;ON;;;;;Y;OPENING BLACK LENTICULAR BRACKET;;;; +3011;RIGHT BLACK LENTICULAR BRACKET;Pe;0;ON;;;;;Y;CLOSING BLACK LENTICULAR BRACKET;;;; +3012;POSTAL MARK;So;0;ON;;;;;N;;;;; +3013;GETA MARK;So;0;ON;;;;;N;;;;; +3014;LEFT TORTOISE SHELL BRACKET;Ps;0;ON;;;;;Y;OPENING TORTOISE SHELL BRACKET;;;; +3015;RIGHT TORTOISE SHELL BRACKET;Pe;0;ON;;;;;Y;CLOSING TORTOISE SHELL BRACKET;;;; +3016;LEFT WHITE LENTICULAR BRACKET;Ps;0;ON;;;;;Y;OPENING WHITE LENTICULAR BRACKET;;;; +3017;RIGHT WHITE LENTICULAR BRACKET;Pe;0;ON;;;;;Y;CLOSING WHITE LENTICULAR BRACKET;;;; +3018;LEFT WHITE TORTOISE SHELL BRACKET;Ps;0;ON;;;;;Y;OPENING WHITE TORTOISE SHELL BRACKET;;;; +3019;RIGHT WHITE TORTOISE SHELL BRACKET;Pe;0;ON;;;;;Y;CLOSING WHITE TORTOISE SHELL BRACKET;;;; +301A;LEFT WHITE SQUARE BRACKET;Ps;0;ON;;;;;Y;OPENING WHITE SQUARE BRACKET;;;; +301B;RIGHT WHITE SQUARE BRACKET;Pe;0;ON;;;;;Y;CLOSING WHITE SQUARE BRACKET;;;; +301C;WAVE DASH;Pd;0;ON;;;;;N;;;;; +301D;REVERSED DOUBLE PRIME QUOTATION MARK;Ps;0;ON;;;;;N;;;;; +301E;DOUBLE PRIME QUOTATION MARK;Pe;0;ON;;;;;N;;;;; +301F;LOW DOUBLE PRIME QUOTATION MARK;Pe;0;ON;;;;;N;;;;; +3020;POSTAL MARK FACE;So;0;ON;;;;;N;;;;; +3021;HANGZHOU NUMERAL ONE;Nl;0;L;;;;1;N;;;;; +3022;HANGZHOU NUMERAL TWO;Nl;0;L;;;;2;N;;;;; +3023;HANGZHOU NUMERAL THREE;Nl;0;L;;;;3;N;;;;; +3024;HANGZHOU NUMERAL FOUR;Nl;0;L;;;;4;N;;;;; +3025;HANGZHOU NUMERAL FIVE;Nl;0;L;;;;5;N;;;;; +3026;HANGZHOU NUMERAL SIX;Nl;0;L;;;;6;N;;;;; +3027;HANGZHOU NUMERAL SEVEN;Nl;0;L;;;;7;N;;;;; +3028;HANGZHOU NUMERAL EIGHT;Nl;0;L;;;;8;N;;;;; +3029;HANGZHOU NUMERAL NINE;Nl;0;L;;;;9;N;;;;; +302A;IDEOGRAPHIC LEVEL TONE MARK;Mn;218;NSM;;;;;N;;;;; +302B;IDEOGRAPHIC RISING TONE MARK;Mn;228;NSM;;;;;N;;;;; +302C;IDEOGRAPHIC DEPARTING TONE MARK;Mn;232;NSM;;;;;N;;;;; +302D;IDEOGRAPHIC ENTERING TONE MARK;Mn;222;NSM;;;;;N;;;;; +302E;HANGUL SINGLE DOT TONE MARK;Mc;224;L;;;;;N;;;;; +302F;HANGUL DOUBLE DOT TONE MARK;Mc;224;L;;;;;N;;;;; +3030;WAVY DASH;Pd;0;ON;;;;;N;;;;; +3031;VERTICAL KANA REPEAT MARK;Lm;0;L;;;;;N;;;;; +3032;VERTICAL KANA REPEAT WITH VOICED SOUND MARK;Lm;0;L;;;;;N;;;;; +3033;VERTICAL KANA REPEAT MARK UPPER HALF;Lm;0;L;;;;;N;;;;; +3034;VERTICAL KANA REPEAT WITH VOICED SOUND MARK UPPER HALF;Lm;0;L;;;;;N;;;;; +3035;VERTICAL KANA REPEAT MARK LOWER HALF;Lm;0;L;;;;;N;;;;; +3036;CIRCLED POSTAL MARK;So;0;ON;<compat> 3012;;;;N;;;;; +3037;IDEOGRAPHIC TELEGRAPH LINE FEED SEPARATOR SYMBOL;So;0;ON;;;;;N;;;;; +3038;HANGZHOU NUMERAL TEN;Nl;0;L;<compat> 5341;;;10;N;;;;; +3039;HANGZHOU NUMERAL TWENTY;Nl;0;L;<compat> 5344;;;20;N;;;;; +303A;HANGZHOU NUMERAL THIRTY;Nl;0;L;<compat> 5345;;;30;N;;;;; +303B;VERTICAL IDEOGRAPHIC ITERATION MARK;Lm;0;L;;;;;N;;;;; +303C;MASU MARK;Lo;0;L;;;;;N;;;;; +303D;PART ALTERNATION MARK;Po;0;ON;;;;;N;;;;; +303E;IDEOGRAPHIC VARIATION INDICATOR;So;0;ON;;;;;N;;;;; +303F;IDEOGRAPHIC HALF FILL SPACE;So;0;ON;;;;;N;;;;; +3041;HIRAGANA LETTER SMALL A;Lo;0;L;;;;;N;;;;; +3042;HIRAGANA LETTER A;Lo;0;L;;;;;N;;;;; +3043;HIRAGANA LETTER SMALL I;Lo;0;L;;;;;N;;;;; +3044;HIRAGANA LETTER I;Lo;0;L;;;;;N;;;;; +3045;HIRAGANA LETTER SMALL U;Lo;0;L;;;;;N;;;;; +3046;HIRAGANA LETTER U;Lo;0;L;;;;;N;;;;; +3047;HIRAGANA LETTER SMALL E;Lo;0;L;;;;;N;;;;; +3048;HIRAGANA LETTER E;Lo;0;L;;;;;N;;;;; +3049;HIRAGANA LETTER SMALL O;Lo;0;L;;;;;N;;;;; +304A;HIRAGANA LETTER O;Lo;0;L;;;;;N;;;;; +304B;HIRAGANA LETTER KA;Lo;0;L;;;;;N;;;;; +304C;HIRAGANA LETTER GA;Lo;0;L;304B 3099;;;;N;;;;; +304D;HIRAGANA LETTER KI;Lo;0;L;;;;;N;;;;; +304E;HIRAGANA LETTER GI;Lo;0;L;304D 3099;;;;N;;;;; +304F;HIRAGANA LETTER KU;Lo;0;L;;;;;N;;;;; +3050;HIRAGANA LETTER GU;Lo;0;L;304F 3099;;;;N;;;;; +3051;HIRAGANA LETTER KE;Lo;0;L;;;;;N;;;;; +3052;HIRAGANA LETTER GE;Lo;0;L;3051 3099;;;;N;;;;; +3053;HIRAGANA LETTER KO;Lo;0;L;;;;;N;;;;; +3054;HIRAGANA LETTER GO;Lo;0;L;3053 3099;;;;N;;;;; +3055;HIRAGANA LETTER SA;Lo;0;L;;;;;N;;;;; +3056;HIRAGANA LETTER ZA;Lo;0;L;3055 3099;;;;N;;;;; +3057;HIRAGANA LETTER SI;Lo;0;L;;;;;N;;;;; +3058;HIRAGANA LETTER ZI;Lo;0;L;3057 3099;;;;N;;;;; +3059;HIRAGANA LETTER SU;Lo;0;L;;;;;N;;;;; +305A;HIRAGANA LETTER ZU;Lo;0;L;3059 3099;;;;N;;;;; +305B;HIRAGANA LETTER SE;Lo;0;L;;;;;N;;;;; +305C;HIRAGANA LETTER ZE;Lo;0;L;305B 3099;;;;N;;;;; +305D;HIRAGANA LETTER SO;Lo;0;L;;;;;N;;;;; +305E;HIRAGANA LETTER ZO;Lo;0;L;305D 3099;;;;N;;;;; +305F;HIRAGANA LETTER TA;Lo;0;L;;;;;N;;;;; +3060;HIRAGANA LETTER DA;Lo;0;L;305F 3099;;;;N;;;;; +3061;HIRAGANA LETTER TI;Lo;0;L;;;;;N;;;;; +3062;HIRAGANA LETTER DI;Lo;0;L;3061 3099;;;;N;;;;; +3063;HIRAGANA LETTER SMALL TU;Lo;0;L;;;;;N;;;;; +3064;HIRAGANA LETTER TU;Lo;0;L;;;;;N;;;;; +3065;HIRAGANA LETTER DU;Lo;0;L;3064 3099;;;;N;;;;; +3066;HIRAGANA LETTER TE;Lo;0;L;;;;;N;;;;; +3067;HIRAGANA LETTER DE;Lo;0;L;3066 3099;;;;N;;;;; +3068;HIRAGANA LETTER TO;Lo;0;L;;;;;N;;;;; +3069;HIRAGANA LETTER DO;Lo;0;L;3068 3099;;;;N;;;;; +306A;HIRAGANA LETTER NA;Lo;0;L;;;;;N;;;;; +306B;HIRAGANA LETTER NI;Lo;0;L;;;;;N;;;;; +306C;HIRAGANA LETTER NU;Lo;0;L;;;;;N;;;;; +306D;HIRAGANA LETTER NE;Lo;0;L;;;;;N;;;;; +306E;HIRAGANA LETTER NO;Lo;0;L;;;;;N;;;;; +306F;HIRAGANA LETTER HA;Lo;0;L;;;;;N;;;;; +3070;HIRAGANA LETTER BA;Lo;0;L;306F 3099;;;;N;;;;; +3071;HIRAGANA LETTER PA;Lo;0;L;306F 309A;;;;N;;;;; +3072;HIRAGANA LETTER HI;Lo;0;L;;;;;N;;;;; +3073;HIRAGANA LETTER BI;Lo;0;L;3072 3099;;;;N;;;;; +3074;HIRAGANA LETTER PI;Lo;0;L;3072 309A;;;;N;;;;; +3075;HIRAGANA LETTER HU;Lo;0;L;;;;;N;;;;; +3076;HIRAGANA LETTER BU;Lo;0;L;3075 3099;;;;N;;;;; +3077;HIRAGANA LETTER PU;Lo;0;L;3075 309A;;;;N;;;;; +3078;HIRAGANA LETTER HE;Lo;0;L;;;;;N;;;;; +3079;HIRAGANA LETTER BE;Lo;0;L;3078 3099;;;;N;;;;; +307A;HIRAGANA LETTER PE;Lo;0;L;3078 309A;;;;N;;;;; +307B;HIRAGANA LETTER HO;Lo;0;L;;;;;N;;;;; +307C;HIRAGANA LETTER BO;Lo;0;L;307B 3099;;;;N;;;;; +307D;HIRAGANA LETTER PO;Lo;0;L;307B 309A;;;;N;;;;; +307E;HIRAGANA LETTER MA;Lo;0;L;;;;;N;;;;; +307F;HIRAGANA LETTER MI;Lo;0;L;;;;;N;;;;; +3080;HIRAGANA LETTER MU;Lo;0;L;;;;;N;;;;; +3081;HIRAGANA LETTER ME;Lo;0;L;;;;;N;;;;; +3082;HIRAGANA LETTER MO;Lo;0;L;;;;;N;;;;; +3083;HIRAGANA LETTER SMALL YA;Lo;0;L;;;;;N;;;;; +3084;HIRAGANA LETTER YA;Lo;0;L;;;;;N;;;;; +3085;HIRAGANA LETTER SMALL YU;Lo;0;L;;;;;N;;;;; +3086;HIRAGANA LETTER YU;Lo;0;L;;;;;N;;;;; +3087;HIRAGANA LETTER SMALL YO;Lo;0;L;;;;;N;;;;; +3088;HIRAGANA LETTER YO;Lo;0;L;;;;;N;;;;; +3089;HIRAGANA LETTER RA;Lo;0;L;;;;;N;;;;; +308A;HIRAGANA LETTER RI;Lo;0;L;;;;;N;;;;; +308B;HIRAGANA LETTER RU;Lo;0;L;;;;;N;;;;; +308C;HIRAGANA LETTER RE;Lo;0;L;;;;;N;;;;; +308D;HIRAGANA LETTER RO;Lo;0;L;;;;;N;;;;; +308E;HIRAGANA LETTER SMALL WA;Lo;0;L;;;;;N;;;;; +308F;HIRAGANA LETTER WA;Lo;0;L;;;;;N;;;;; +3090;HIRAGANA LETTER WI;Lo;0;L;;;;;N;;;;; +3091;HIRAGANA LETTER WE;Lo;0;L;;;;;N;;;;; +3092;HIRAGANA LETTER WO;Lo;0;L;;;;;N;;;;; +3093;HIRAGANA LETTER N;Lo;0;L;;;;;N;;;;; +3094;HIRAGANA LETTER VU;Lo;0;L;3046 3099;;;;N;;;;; +3095;HIRAGANA LETTER SMALL KA;Lo;0;L;;;;;N;;;;; +3096;HIRAGANA LETTER SMALL KE;Lo;0;L;;;;;N;;;;; +3099;COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK;Mn;8;NSM;;;;;N;NON-SPACING KATAKANA-HIRAGANA VOICED SOUND MARK;;;; +309A;COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK;Mn;8;NSM;;;;;N;NON-SPACING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK;;;; +309B;KATAKANA-HIRAGANA VOICED SOUND MARK;Sk;0;ON;<compat> 0020 3099;;;;N;;;;; +309C;KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK;Sk;0;ON;<compat> 0020 309A;;;;N;;;;; +309D;HIRAGANA ITERATION MARK;Lm;0;L;;;;;N;;;;; +309E;HIRAGANA VOICED ITERATION MARK;Lm;0;L;309D 3099;;;;N;;;;; +309F;HIRAGANA DIGRAPH YORI;Lo;0;L;<vertical> 3088 308A;;;;N;;;;; +30A0;KATAKANA-HIRAGANA DOUBLE HYPHEN;Pd;0;ON;;;;;N;;;;; +30A1;KATAKANA LETTER SMALL A;Lo;0;L;;;;;N;;;;; +30A2;KATAKANA LETTER A;Lo;0;L;;;;;N;;;;; +30A3;KATAKANA LETTER SMALL I;Lo;0;L;;;;;N;;;;; +30A4;KATAKANA LETTER I;Lo;0;L;;;;;N;;;;; +30A5;KATAKANA LETTER SMALL U;Lo;0;L;;;;;N;;;;; +30A6;KATAKANA LETTER U;Lo;0;L;;;;;N;;;;; +30A7;KATAKANA LETTER SMALL E;Lo;0;L;;;;;N;;;;; +30A8;KATAKANA LETTER E;Lo;0;L;;;;;N;;;;; +30A9;KATAKANA LETTER SMALL O;Lo;0;L;;;;;N;;;;; +30AA;KATAKANA LETTER O;Lo;0;L;;;;;N;;;;; +30AB;KATAKANA LETTER KA;Lo;0;L;;;;;N;;;;; +30AC;KATAKANA LETTER GA;Lo;0;L;30AB 3099;;;;N;;;;; +30AD;KATAKANA LETTER KI;Lo;0;L;;;;;N;;;;; +30AE;KATAKANA LETTER GI;Lo;0;L;30AD 3099;;;;N;;;;; +30AF;KATAKANA LETTER KU;Lo;0;L;;;;;N;;;;; +30B0;KATAKANA LETTER GU;Lo;0;L;30AF 3099;;;;N;;;;; +30B1;KATAKANA LETTER KE;Lo;0;L;;;;;N;;;;; +30B2;KATAKANA LETTER GE;Lo;0;L;30B1 3099;;;;N;;;;; +30B3;KATAKANA LETTER KO;Lo;0;L;;;;;N;;;;; +30B4;KATAKANA LETTER GO;Lo;0;L;30B3 3099;;;;N;;;;; +30B5;KATAKANA LETTER SA;Lo;0;L;;;;;N;;;;; +30B6;KATAKANA LETTER ZA;Lo;0;L;30B5 3099;;;;N;;;;; +30B7;KATAKANA LETTER SI;Lo;0;L;;;;;N;;;;; +30B8;KATAKANA LETTER ZI;Lo;0;L;30B7 3099;;;;N;;;;; +30B9;KATAKANA LETTER SU;Lo;0;L;;;;;N;;;;; +30BA;KATAKANA LETTER ZU;Lo;0;L;30B9 3099;;;;N;;;;; +30BB;KATAKANA LETTER SE;Lo;0;L;;;;;N;;;;; +30BC;KATAKANA LETTER ZE;Lo;0;L;30BB 3099;;;;N;;;;; +30BD;KATAKANA LETTER SO;Lo;0;L;;;;;N;;;;; +30BE;KATAKANA LETTER ZO;Lo;0;L;30BD 3099;;;;N;;;;; +30BF;KATAKANA LETTER TA;Lo;0;L;;;;;N;;;;; +30C0;KATAKANA LETTER DA;Lo;0;L;30BF 3099;;;;N;;;;; +30C1;KATAKANA LETTER TI;Lo;0;L;;;;;N;;;;; +30C2;KATAKANA LETTER DI;Lo;0;L;30C1 3099;;;;N;;;;; +30C3;KATAKANA LETTER SMALL TU;Lo;0;L;;;;;N;;;;; +30C4;KATAKANA LETTER TU;Lo;0;L;;;;;N;;;;; +30C5;KATAKANA LETTER DU;Lo;0;L;30C4 3099;;;;N;;;;; +30C6;KATAKANA LETTER TE;Lo;0;L;;;;;N;;;;; +30C7;KATAKANA LETTER DE;Lo;0;L;30C6 3099;;;;N;;;;; +30C8;KATAKANA LETTER TO;Lo;0;L;;;;;N;;;;; +30C9;KATAKANA LETTER DO;Lo;0;L;30C8 3099;;;;N;;;;; +30CA;KATAKANA LETTER NA;Lo;0;L;;;;;N;;;;; +30CB;KATAKANA LETTER NI;Lo;0;L;;;;;N;;;;; +30CC;KATAKANA LETTER NU;Lo;0;L;;;;;N;;;;; +30CD;KATAKANA LETTER NE;Lo;0;L;;;;;N;;;;; +30CE;KATAKANA LETTER NO;Lo;0;L;;;;;N;;;;; +30CF;KATAKANA LETTER HA;Lo;0;L;;;;;N;;;;; +30D0;KATAKANA LETTER BA;Lo;0;L;30CF 3099;;;;N;;;;; +30D1;KATAKANA LETTER PA;Lo;0;L;30CF 309A;;;;N;;;;; +30D2;KATAKANA LETTER HI;Lo;0;L;;;;;N;;;;; +30D3;KATAKANA LETTER BI;Lo;0;L;30D2 3099;;;;N;;;;; +30D4;KATAKANA LETTER PI;Lo;0;L;30D2 309A;;;;N;;;;; +30D5;KATAKANA LETTER HU;Lo;0;L;;;;;N;;;;; +30D6;KATAKANA LETTER BU;Lo;0;L;30D5 3099;;;;N;;;;; +30D7;KATAKANA LETTER PU;Lo;0;L;30D5 309A;;;;N;;;;; +30D8;KATAKANA LETTER HE;Lo;0;L;;;;;N;;;;; +30D9;KATAKANA LETTER BE;Lo;0;L;30D8 3099;;;;N;;;;; +30DA;KATAKANA LETTER PE;Lo;0;L;30D8 309A;;;;N;;;;; +30DB;KATAKANA LETTER HO;Lo;0;L;;;;;N;;;;; +30DC;KATAKANA LETTER BO;Lo;0;L;30DB 3099;;;;N;;;;; +30DD;KATAKANA LETTER PO;Lo;0;L;30DB 309A;;;;N;;;;; +30DE;KATAKANA LETTER MA;Lo;0;L;;;;;N;;;;; +30DF;KATAKANA LETTER MI;Lo;0;L;;;;;N;;;;; +30E0;KATAKANA LETTER MU;Lo;0;L;;;;;N;;;;; +30E1;KATAKANA LETTER ME;Lo;0;L;;;;;N;;;;; +30E2;KATAKANA LETTER MO;Lo;0;L;;;;;N;;;;; +30E3;KATAKANA LETTER SMALL YA;Lo;0;L;;;;;N;;;;; +30E4;KATAKANA LETTER YA;Lo;0;L;;;;;N;;;;; +30E5;KATAKANA LETTER SMALL YU;Lo;0;L;;;;;N;;;;; +30E6;KATAKANA LETTER YU;Lo;0;L;;;;;N;;;;; +30E7;KATAKANA LETTER SMALL YO;Lo;0;L;;;;;N;;;;; +30E8;KATAKANA LETTER YO;Lo;0;L;;;;;N;;;;; +30E9;KATAKANA LETTER RA;Lo;0;L;;;;;N;;;;; +30EA;KATAKANA LETTER RI;Lo;0;L;;;;;N;;;;; +30EB;KATAKANA LETTER RU;Lo;0;L;;;;;N;;;;; +30EC;KATAKANA LETTER RE;Lo;0;L;;;;;N;;;;; +30ED;KATAKANA LETTER RO;Lo;0;L;;;;;N;;;;; +30EE;KATAKANA LETTER SMALL WA;Lo;0;L;;;;;N;;;;; +30EF;KATAKANA LETTER WA;Lo;0;L;;;;;N;;;;; +30F0;KATAKANA LETTER WI;Lo;0;L;;;;;N;;;;; +30F1;KATAKANA LETTER WE;Lo;0;L;;;;;N;;;;; +30F2;KATAKANA LETTER WO;Lo;0;L;;;;;N;;;;; +30F3;KATAKANA LETTER N;Lo;0;L;;;;;N;;;;; +30F4;KATAKANA LETTER VU;Lo;0;L;30A6 3099;;;;N;;;;; +30F5;KATAKANA LETTER SMALL KA;Lo;0;L;;;;;N;;;;; +30F6;KATAKANA LETTER SMALL KE;Lo;0;L;;;;;N;;;;; +30F7;KATAKANA LETTER VA;Lo;0;L;30EF 3099;;;;N;;;;; +30F8;KATAKANA LETTER VI;Lo;0;L;30F0 3099;;;;N;;;;; +30F9;KATAKANA LETTER VE;Lo;0;L;30F1 3099;;;;N;;;;; +30FA;KATAKANA LETTER VO;Lo;0;L;30F2 3099;;;;N;;;;; +30FB;KATAKANA MIDDLE DOT;Po;0;ON;;;;;N;;;;; +30FC;KATAKANA-HIRAGANA PROLONGED SOUND MARK;Lm;0;L;;;;;N;;;;; +30FD;KATAKANA ITERATION MARK;Lm;0;L;;;;;N;;;;; +30FE;KATAKANA VOICED ITERATION MARK;Lm;0;L;30FD 3099;;;;N;;;;; +30FF;KATAKANA DIGRAPH KOTO;Lo;0;L;<vertical> 30B3 30C8;;;;N;;;;; +3105;BOPOMOFO LETTER B;Lo;0;L;;;;;N;;;;; +3106;BOPOMOFO LETTER P;Lo;0;L;;;;;N;;;;; +3107;BOPOMOFO LETTER M;Lo;0;L;;;;;N;;;;; +3108;BOPOMOFO LETTER F;Lo;0;L;;;;;N;;;;; +3109;BOPOMOFO LETTER D;Lo;0;L;;;;;N;;;;; +310A;BOPOMOFO LETTER T;Lo;0;L;;;;;N;;;;; +310B;BOPOMOFO LETTER N;Lo;0;L;;;;;N;;;;; +310C;BOPOMOFO LETTER L;Lo;0;L;;;;;N;;;;; +310D;BOPOMOFO LETTER G;Lo;0;L;;;;;N;;;;; +310E;BOPOMOFO LETTER K;Lo;0;L;;;;;N;;;;; +310F;BOPOMOFO LETTER H;Lo;0;L;;;;;N;;;;; +3110;BOPOMOFO LETTER J;Lo;0;L;;;;;N;;;;; +3111;BOPOMOFO LETTER Q;Lo;0;L;;;;;N;;;;; +3112;BOPOMOFO LETTER X;Lo;0;L;;;;;N;;;;; +3113;BOPOMOFO LETTER ZH;Lo;0;L;;;;;N;;;;; +3114;BOPOMOFO LETTER CH;Lo;0;L;;;;;N;;;;; +3115;BOPOMOFO LETTER SH;Lo;0;L;;;;;N;;;;; +3116;BOPOMOFO LETTER R;Lo;0;L;;;;;N;;;;; +3117;BOPOMOFO LETTER Z;Lo;0;L;;;;;N;;;;; +3118;BOPOMOFO LETTER C;Lo;0;L;;;;;N;;;;; +3119;BOPOMOFO LETTER S;Lo;0;L;;;;;N;;;;; +311A;BOPOMOFO LETTER A;Lo;0;L;;;;;N;;;;; +311B;BOPOMOFO LETTER O;Lo;0;L;;;;;N;;;;; +311C;BOPOMOFO LETTER E;Lo;0;L;;;;;N;;;;; +311D;BOPOMOFO LETTER EH;Lo;0;L;;;;;N;;;;; +311E;BOPOMOFO LETTER AI;Lo;0;L;;;;;N;;;;; +311F;BOPOMOFO LETTER EI;Lo;0;L;;;;;N;;;;; +3120;BOPOMOFO LETTER AU;Lo;0;L;;;;;N;;;;; +3121;BOPOMOFO LETTER OU;Lo;0;L;;;;;N;;;;; +3122;BOPOMOFO LETTER AN;Lo;0;L;;;;;N;;;;; +3123;BOPOMOFO LETTER EN;Lo;0;L;;;;;N;;;;; +3124;BOPOMOFO LETTER ANG;Lo;0;L;;;;;N;;;;; +3125;BOPOMOFO LETTER ENG;Lo;0;L;;;;;N;;;;; +3126;BOPOMOFO LETTER ER;Lo;0;L;;;;;N;;;;; +3127;BOPOMOFO LETTER I;Lo;0;L;;;;;N;;;;; +3128;BOPOMOFO LETTER U;Lo;0;L;;;;;N;;;;; +3129;BOPOMOFO LETTER IU;Lo;0;L;;;;;N;;;;; +312A;BOPOMOFO LETTER V;Lo;0;L;;;;;N;;;;; +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;;;;; +312F;BOPOMOFO LETTER NN;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;;;; +3134;HANGUL LETTER NIEUN;Lo;0;L;<compat> 1102;;;;N;;;;; +3135;HANGUL LETTER NIEUN-CIEUC;Lo;0;L;<compat> 11AC;;;;N;HANGUL LETTER NIEUN JIEUJ;;;; +3136;HANGUL LETTER NIEUN-HIEUH;Lo;0;L;<compat> 11AD;;;;N;HANGUL LETTER NIEUN HIEUH;;;; +3137;HANGUL LETTER TIKEUT;Lo;0;L;<compat> 1103;;;;N;HANGUL LETTER DIGEUD;;;; +3138;HANGUL LETTER SSANGTIKEUT;Lo;0;L;<compat> 1104;;;;N;HANGUL LETTER SSANG DIGEUD;;;; +3139;HANGUL LETTER RIEUL;Lo;0;L;<compat> 1105;;;;N;HANGUL LETTER LIEUL;;;; +313A;HANGUL LETTER RIEUL-KIYEOK;Lo;0;L;<compat> 11B0;;;;N;HANGUL LETTER LIEUL GIYEOG;;;; +313B;HANGUL LETTER RIEUL-MIEUM;Lo;0;L;<compat> 11B1;;;;N;HANGUL LETTER LIEUL MIEUM;;;; +313C;HANGUL LETTER RIEUL-PIEUP;Lo;0;L;<compat> 11B2;;;;N;HANGUL LETTER LIEUL BIEUB;;;; +313D;HANGUL LETTER RIEUL-SIOS;Lo;0;L;<compat> 11B3;;;;N;HANGUL LETTER LIEUL SIOS;;;; +313E;HANGUL LETTER RIEUL-THIEUTH;Lo;0;L;<compat> 11B4;;;;N;HANGUL LETTER LIEUL TIEUT;;;; +313F;HANGUL LETTER RIEUL-PHIEUPH;Lo;0;L;<compat> 11B5;;;;N;HANGUL LETTER LIEUL PIEUP;;;; +3140;HANGUL LETTER RIEUL-HIEUH;Lo;0;L;<compat> 111A;;;;N;HANGUL LETTER LIEUL HIEUH;;;; +3141;HANGUL LETTER MIEUM;Lo;0;L;<compat> 1106;;;;N;;;;; +3142;HANGUL LETTER PIEUP;Lo;0;L;<compat> 1107;;;;N;HANGUL LETTER BIEUB;;;; +3143;HANGUL LETTER SSANGPIEUP;Lo;0;L;<compat> 1108;;;;N;HANGUL LETTER SSANG BIEUB;;;; +3144;HANGUL LETTER PIEUP-SIOS;Lo;0;L;<compat> 1121;;;;N;HANGUL LETTER BIEUB SIOS;;;; +3145;HANGUL LETTER SIOS;Lo;0;L;<compat> 1109;;;;N;;;;; +3146;HANGUL LETTER SSANGSIOS;Lo;0;L;<compat> 110A;;;;N;HANGUL LETTER SSANG SIOS;;;; +3147;HANGUL LETTER IEUNG;Lo;0;L;<compat> 110B;;;;N;;;;; +3148;HANGUL LETTER CIEUC;Lo;0;L;<compat> 110C;;;;N;HANGUL LETTER JIEUJ;;;; +3149;HANGUL LETTER SSANGCIEUC;Lo;0;L;<compat> 110D;;;;N;HANGUL LETTER SSANG JIEUJ;;;; +314A;HANGUL LETTER CHIEUCH;Lo;0;L;<compat> 110E;;;;N;HANGUL LETTER CIEUC;;;; +314B;HANGUL LETTER KHIEUKH;Lo;0;L;<compat> 110F;;;;N;HANGUL LETTER KIYEOK;;;; +314C;HANGUL LETTER THIEUTH;Lo;0;L;<compat> 1110;;;;N;HANGUL LETTER TIEUT;;;; +314D;HANGUL LETTER PHIEUPH;Lo;0;L;<compat> 1111;;;;N;HANGUL LETTER PIEUP;;;; +314E;HANGUL LETTER HIEUH;Lo;0;L;<compat> 1112;;;;N;;;;; +314F;HANGUL LETTER A;Lo;0;L;<compat> 1161;;;;N;;;;; +3150;HANGUL LETTER AE;Lo;0;L;<compat> 1162;;;;N;;;;; +3151;HANGUL LETTER YA;Lo;0;L;<compat> 1163;;;;N;;;;; +3152;HANGUL LETTER YAE;Lo;0;L;<compat> 1164;;;;N;;;;; +3153;HANGUL LETTER EO;Lo;0;L;<compat> 1165;;;;N;;;;; +3154;HANGUL LETTER E;Lo;0;L;<compat> 1166;;;;N;;;;; +3155;HANGUL LETTER YEO;Lo;0;L;<compat> 1167;;;;N;;;;; +3156;HANGUL LETTER YE;Lo;0;L;<compat> 1168;;;;N;;;;; +3157;HANGUL LETTER O;Lo;0;L;<compat> 1169;;;;N;;;;; +3158;HANGUL LETTER WA;Lo;0;L;<compat> 116A;;;;N;;;;; +3159;HANGUL LETTER WAE;Lo;0;L;<compat> 116B;;;;N;;;;; +315A;HANGUL LETTER OE;Lo;0;L;<compat> 116C;;;;N;;;;; +315B;HANGUL LETTER YO;Lo;0;L;<compat> 116D;;;;N;;;;; +315C;HANGUL LETTER U;Lo;0;L;<compat> 116E;;;;N;;;;; +315D;HANGUL LETTER WEO;Lo;0;L;<compat> 116F;;;;N;;;;; +315E;HANGUL LETTER WE;Lo;0;L;<compat> 1170;;;;N;;;;; +315F;HANGUL LETTER WI;Lo;0;L;<compat> 1171;;;;N;;;;; +3160;HANGUL LETTER YU;Lo;0;L;<compat> 1172;;;;N;;;;; +3161;HANGUL LETTER EU;Lo;0;L;<compat> 1173;;;;N;;;;; +3162;HANGUL LETTER YI;Lo;0;L;<compat> 1174;;;;N;;;;; +3163;HANGUL LETTER I;Lo;0;L;<compat> 1175;;;;N;;;;; +3164;HANGUL FILLER;Lo;0;L;<compat> 1160;;;;N;HANGUL CAE OM;;;; +3165;HANGUL LETTER SSANGNIEUN;Lo;0;L;<compat> 1114;;;;N;HANGUL LETTER SSANG NIEUN;;;; +3166;HANGUL LETTER NIEUN-TIKEUT;Lo;0;L;<compat> 1115;;;;N;HANGUL LETTER NIEUN DIGEUD;;;; +3167;HANGUL LETTER NIEUN-SIOS;Lo;0;L;<compat> 11C7;;;;N;HANGUL LETTER NIEUN SIOS;;;; +3168;HANGUL LETTER NIEUN-PANSIOS;Lo;0;L;<compat> 11C8;;;;N;HANGUL LETTER NIEUN BAN CHI EUM;;;; +3169;HANGUL LETTER RIEUL-KIYEOK-SIOS;Lo;0;L;<compat> 11CC;;;;N;HANGUL LETTER LIEUL GIYEOG SIOS;;;; +316A;HANGUL LETTER RIEUL-TIKEUT;Lo;0;L;<compat> 11CE;;;;N;HANGUL LETTER LIEUL DIGEUD;;;; +316B;HANGUL LETTER RIEUL-PIEUP-SIOS;Lo;0;L;<compat> 11D3;;;;N;HANGUL LETTER LIEUL BIEUB SIOS;;;; +316C;HANGUL LETTER RIEUL-PANSIOS;Lo;0;L;<compat> 11D7;;;;N;HANGUL LETTER LIEUL BAN CHI EUM;;;; +316D;HANGUL LETTER RIEUL-YEORINHIEUH;Lo;0;L;<compat> 11D9;;;;N;HANGUL LETTER LIEUL YEOLIN HIEUH;;;; +316E;HANGUL LETTER MIEUM-PIEUP;Lo;0;L;<compat> 111C;;;;N;HANGUL LETTER MIEUM BIEUB;;;; +316F;HANGUL LETTER MIEUM-SIOS;Lo;0;L;<compat> 11DD;;;;N;HANGUL LETTER MIEUM SIOS;;;; +3170;HANGUL LETTER MIEUM-PANSIOS;Lo;0;L;<compat> 11DF;;;;N;HANGUL LETTER BIEUB BAN CHI EUM;;;; +3171;HANGUL LETTER KAPYEOUNMIEUM;Lo;0;L;<compat> 111D;;;;N;HANGUL LETTER MIEUM SUN GYEONG EUM;;;; +3172;HANGUL LETTER PIEUP-KIYEOK;Lo;0;L;<compat> 111E;;;;N;HANGUL LETTER BIEUB GIYEOG;;;; +3173;HANGUL LETTER PIEUP-TIKEUT;Lo;0;L;<compat> 1120;;;;N;HANGUL LETTER BIEUB DIGEUD;;;; +3174;HANGUL LETTER PIEUP-SIOS-KIYEOK;Lo;0;L;<compat> 1122;;;;N;HANGUL LETTER BIEUB SIOS GIYEOG;;;; +3175;HANGUL LETTER PIEUP-SIOS-TIKEUT;Lo;0;L;<compat> 1123;;;;N;HANGUL LETTER BIEUB SIOS DIGEUD;;;; +3176;HANGUL LETTER PIEUP-CIEUC;Lo;0;L;<compat> 1127;;;;N;HANGUL LETTER BIEUB JIEUJ;;;; +3177;HANGUL LETTER PIEUP-THIEUTH;Lo;0;L;<compat> 1129;;;;N;HANGUL LETTER BIEUB TIEUT;;;; +3178;HANGUL LETTER KAPYEOUNPIEUP;Lo;0;L;<compat> 112B;;;;N;HANGUL LETTER BIEUB SUN GYEONG EUM;;;; +3179;HANGUL LETTER KAPYEOUNSSANGPIEUP;Lo;0;L;<compat> 112C;;;;N;HANGUL LETTER SSANG BIEUB SUN GYEONG EUM;;;; +317A;HANGUL LETTER SIOS-KIYEOK;Lo;0;L;<compat> 112D;;;;N;HANGUL LETTER SIOS GIYEOG;;;; +317B;HANGUL LETTER SIOS-NIEUN;Lo;0;L;<compat> 112E;;;;N;HANGUL LETTER SIOS NIEUN;;;; +317C;HANGUL LETTER SIOS-TIKEUT;Lo;0;L;<compat> 112F;;;;N;HANGUL LETTER SIOS DIGEUD;;;; +317D;HANGUL LETTER SIOS-PIEUP;Lo;0;L;<compat> 1132;;;;N;HANGUL LETTER SIOS BIEUB;;;; +317E;HANGUL LETTER SIOS-CIEUC;Lo;0;L;<compat> 1136;;;;N;HANGUL LETTER SIOS JIEUJ;;;; +317F;HANGUL LETTER PANSIOS;Lo;0;L;<compat> 1140;;;;N;HANGUL LETTER BAN CHI EUM;;;; +3180;HANGUL LETTER SSANGIEUNG;Lo;0;L;<compat> 1147;;;;N;HANGUL LETTER SSANG IEUNG;;;; +3181;HANGUL LETTER YESIEUNG;Lo;0;L;<compat> 114C;;;;N;HANGUL LETTER NGIEUNG;;;; +3182;HANGUL LETTER YESIEUNG-SIOS;Lo;0;L;<compat> 11F1;;;;N;HANGUL LETTER NGIEUNG SIOS;;;; +3183;HANGUL LETTER YESIEUNG-PANSIOS;Lo;0;L;<compat> 11F2;;;;N;HANGUL LETTER NGIEUNG BAN CHI EUM;;;; +3184;HANGUL LETTER KAPYEOUNPHIEUPH;Lo;0;L;<compat> 1157;;;;N;HANGUL LETTER PIEUP SUN GYEONG EUM;;;; +3185;HANGUL LETTER SSANGHIEUH;Lo;0;L;<compat> 1158;;;;N;HANGUL LETTER SSANG HIEUH;;;; +3186;HANGUL LETTER YEORINHIEUH;Lo;0;L;<compat> 1159;;;;N;HANGUL LETTER YEOLIN HIEUH;;;; +3187;HANGUL LETTER YO-YA;Lo;0;L;<compat> 1184;;;;N;HANGUL LETTER YOYA;;;; +3188;HANGUL LETTER YO-YAE;Lo;0;L;<compat> 1185;;;;N;HANGUL LETTER YOYAE;;;; +3189;HANGUL LETTER YO-I;Lo;0;L;<compat> 1188;;;;N;HANGUL LETTER YOI;;;; +318A;HANGUL LETTER YU-YEO;Lo;0;L;<compat> 1191;;;;N;HANGUL LETTER YUYEO;;;; +318B;HANGUL LETTER YU-YE;Lo;0;L;<compat> 1192;;;;N;HANGUL LETTER YUYE;;;; +318C;HANGUL LETTER YU-I;Lo;0;L;<compat> 1194;;;;N;HANGUL LETTER YUI;;;; +318D;HANGUL LETTER ARAEA;Lo;0;L;<compat> 119E;;;;N;HANGUL LETTER ALAE A;;;; +318E;HANGUL LETTER ARAEAE;Lo;0;L;<compat> 11A1;;;;N;HANGUL LETTER ALAE AE;;;; +3190;IDEOGRAPHIC ANNOTATION LINKING MARK;So;0;L;;;;;N;KANBUN TATETEN;;;; +3191;IDEOGRAPHIC ANNOTATION REVERSE MARK;So;0;L;;;;;N;KAERITEN RE;;;; +3192;IDEOGRAPHIC ANNOTATION ONE MARK;No;0;L;<super> 4E00;;;1;N;KAERITEN ITI;;;; +3193;IDEOGRAPHIC ANNOTATION TWO MARK;No;0;L;<super> 4E8C;;;2;N;KAERITEN NI;;;; +3194;IDEOGRAPHIC ANNOTATION THREE MARK;No;0;L;<super> 4E09;;;3;N;KAERITEN SAN;;;; +3195;IDEOGRAPHIC ANNOTATION FOUR MARK;No;0;L;<super> 56DB;;;4;N;KAERITEN SI;;;; +3196;IDEOGRAPHIC ANNOTATION TOP MARK;So;0;L;<super> 4E0A;;;;N;KAERITEN ZYOU;;;; +3197;IDEOGRAPHIC ANNOTATION MIDDLE MARK;So;0;L;<super> 4E2D;;;;N;KAERITEN TYUU;;;; +3198;IDEOGRAPHIC ANNOTATION BOTTOM MARK;So;0;L;<super> 4E0B;;;;N;KAERITEN GE;;;; +3199;IDEOGRAPHIC ANNOTATION FIRST MARK;So;0;L;<super> 7532;;;;N;KAERITEN KOU;;;; +319A;IDEOGRAPHIC ANNOTATION SECOND MARK;So;0;L;<super> 4E59;;;;N;KAERITEN OTU;;;; +319B;IDEOGRAPHIC ANNOTATION THIRD MARK;So;0;L;<super> 4E19;;;;N;KAERITEN HEI;;;; +319C;IDEOGRAPHIC ANNOTATION FOURTH MARK;So;0;L;<super> 4E01;;;;N;KAERITEN TEI;;;; +319D;IDEOGRAPHIC ANNOTATION HEAVEN MARK;So;0;L;<super> 5929;;;;N;KAERITEN TEN;;;; +319E;IDEOGRAPHIC ANNOTATION EARTH MARK;So;0;L;<super> 5730;;;;N;KAERITEN TI;;;; +319F;IDEOGRAPHIC ANNOTATION MAN MARK;So;0;L;<super> 4EBA;;;;N;KAERITEN ZIN;;;; +31A0;BOPOMOFO LETTER BU;Lo;0;L;;;;;N;;;;; +31A1;BOPOMOFO LETTER ZI;Lo;0;L;;;;;N;;;;; +31A2;BOPOMOFO LETTER JI;Lo;0;L;;;;;N;;;;; +31A3;BOPOMOFO LETTER GU;Lo;0;L;;;;;N;;;;; +31A4;BOPOMOFO LETTER EE;Lo;0;L;;;;;N;;;;; +31A5;BOPOMOFO LETTER ENN;Lo;0;L;;;;;N;;;;; +31A6;BOPOMOFO LETTER OO;Lo;0;L;;;;;N;;;;; +31A7;BOPOMOFO LETTER ONN;Lo;0;L;;;;;N;;;;; +31A8;BOPOMOFO LETTER IR;Lo;0;L;;;;;N;;;;; +31A9;BOPOMOFO LETTER ANN;Lo;0;L;;;;;N;;;;; +31AA;BOPOMOFO LETTER INN;Lo;0;L;;;;;N;;;;; +31AB;BOPOMOFO LETTER UNN;Lo;0;L;;;;;N;;;;; +31AC;BOPOMOFO LETTER IM;Lo;0;L;;;;;N;;;;; +31AD;BOPOMOFO LETTER NGG;Lo;0;L;;;;;N;;;;; +31AE;BOPOMOFO LETTER AINN;Lo;0;L;;;;;N;;;;; +31AF;BOPOMOFO LETTER AUNN;Lo;0;L;;;;;N;;;;; +31B0;BOPOMOFO LETTER AM;Lo;0;L;;;;;N;;;;; +31B1;BOPOMOFO LETTER OM;Lo;0;L;;;;;N;;;;; +31B2;BOPOMOFO LETTER ONG;Lo;0;L;;;;;N;;;;; +31B3;BOPOMOFO LETTER INNN;Lo;0;L;;;;;N;;;;; +31B4;BOPOMOFO FINAL LETTER P;Lo;0;L;;;;;N;;;;; +31B5;BOPOMOFO FINAL LETTER T;Lo;0;L;;;;;N;;;;; +31B6;BOPOMOFO FINAL LETTER K;Lo;0;L;;;;;N;;;;; +31B7;BOPOMOFO FINAL LETTER H;Lo;0;L;;;;;N;;;;; +31B8;BOPOMOFO LETTER GH;Lo;0;L;;;;;N;;;;; +31B9;BOPOMOFO LETTER LH;Lo;0;L;;;;;N;;;;; +31BA;BOPOMOFO LETTER ZY;Lo;0;L;;;;;N;;;;; +31C0;CJK STROKE T;So;0;ON;;;;;N;;;;; +31C1;CJK STROKE WG;So;0;ON;;;;;N;;;;; +31C2;CJK STROKE XG;So;0;ON;;;;;N;;;;; +31C3;CJK STROKE BXG;So;0;ON;;;;;N;;;;; +31C4;CJK STROKE SW;So;0;ON;;;;;N;;;;; +31C5;CJK STROKE HZZ;So;0;ON;;;;;N;;;;; +31C6;CJK STROKE HZG;So;0;ON;;;;;N;;;;; +31C7;CJK STROKE HP;So;0;ON;;;;;N;;;;; +31C8;CJK STROKE HZWG;So;0;ON;;;;;N;;;;; +31C9;CJK STROKE SZWG;So;0;ON;;;;;N;;;;; +31CA;CJK STROKE HZT;So;0;ON;;;;;N;;;;; +31CB;CJK STROKE HZZP;So;0;ON;;;;;N;;;;; +31CC;CJK STROKE HPWG;So;0;ON;;;;;N;;;;; +31CD;CJK STROKE HZW;So;0;ON;;;;;N;;;;; +31CE;CJK STROKE HZZZ;So;0;ON;;;;;N;;;;; +31CF;CJK STROKE N;So;0;ON;;;;;N;;;;; +31D0;CJK STROKE H;So;0;ON;;;;;N;;;;; +31D1;CJK STROKE S;So;0;ON;;;;;N;;;;; +31D2;CJK STROKE P;So;0;ON;;;;;N;;;;; +31D3;CJK STROKE SP;So;0;ON;;;;;N;;;;; +31D4;CJK STROKE D;So;0;ON;;;;;N;;;;; +31D5;CJK STROKE HZ;So;0;ON;;;;;N;;;;; +31D6;CJK STROKE HG;So;0;ON;;;;;N;;;;; +31D7;CJK STROKE SZ;So;0;ON;;;;;N;;;;; +31D8;CJK STROKE SWZ;So;0;ON;;;;;N;;;;; +31D9;CJK STROKE ST;So;0;ON;;;;;N;;;;; +31DA;CJK STROKE SG;So;0;ON;;;;;N;;;;; +31DB;CJK STROKE PD;So;0;ON;;;;;N;;;;; +31DC;CJK STROKE PZ;So;0;ON;;;;;N;;;;; +31DD;CJK STROKE TN;So;0;ON;;;;;N;;;;; +31DE;CJK STROKE SZZ;So;0;ON;;;;;N;;;;; +31DF;CJK STROKE SWG;So;0;ON;;;;;N;;;;; +31E0;CJK STROKE HXWG;So;0;ON;;;;;N;;;;; +31E1;CJK STROKE HZZZG;So;0;ON;;;;;N;;;;; +31E2;CJK STROKE PG;So;0;ON;;;;;N;;;;; +31E3;CJK STROKE Q;So;0;ON;;;;;N;;;;; +31F0;KATAKANA LETTER SMALL KU;Lo;0;L;;;;;N;;;;; +31F1;KATAKANA LETTER SMALL SI;Lo;0;L;;;;;N;;;;; +31F2;KATAKANA LETTER SMALL SU;Lo;0;L;;;;;N;;;;; +31F3;KATAKANA LETTER SMALL TO;Lo;0;L;;;;;N;;;;; +31F4;KATAKANA LETTER SMALL NU;Lo;0;L;;;;;N;;;;; +31F5;KATAKANA LETTER SMALL HA;Lo;0;L;;;;;N;;;;; +31F6;KATAKANA LETTER SMALL HI;Lo;0;L;;;;;N;;;;; +31F7;KATAKANA LETTER SMALL HU;Lo;0;L;;;;;N;;;;; +31F8;KATAKANA LETTER SMALL HE;Lo;0;L;;;;;N;;;;; +31F9;KATAKANA LETTER SMALL HO;Lo;0;L;;;;;N;;;;; +31FA;KATAKANA LETTER SMALL MU;Lo;0;L;;;;;N;;;;; +31FB;KATAKANA LETTER SMALL RA;Lo;0;L;;;;;N;;;;; +31FC;KATAKANA LETTER SMALL RI;Lo;0;L;;;;;N;;;;; +31FD;KATAKANA LETTER SMALL RU;Lo;0;L;;;;;N;;;;; +31FE;KATAKANA LETTER SMALL RE;Lo;0;L;;;;;N;;;;; +31FF;KATAKANA LETTER SMALL RO;Lo;0;L;;;;;N;;;;; +3200;PARENTHESIZED HANGUL KIYEOK;So;0;L;<compat> 0028 1100 0029;;;;N;PARENTHESIZED HANGUL GIYEOG;;;; +3201;PARENTHESIZED HANGUL NIEUN;So;0;L;<compat> 0028 1102 0029;;;;N;;;;; +3202;PARENTHESIZED HANGUL TIKEUT;So;0;L;<compat> 0028 1103 0029;;;;N;PARENTHESIZED HANGUL DIGEUD;;;; +3203;PARENTHESIZED HANGUL RIEUL;So;0;L;<compat> 0028 1105 0029;;;;N;PARENTHESIZED HANGUL LIEUL;;;; +3204;PARENTHESIZED HANGUL MIEUM;So;0;L;<compat> 0028 1106 0029;;;;N;;;;; +3205;PARENTHESIZED HANGUL PIEUP;So;0;L;<compat> 0028 1107 0029;;;;N;PARENTHESIZED HANGUL BIEUB;;;; +3206;PARENTHESIZED HANGUL SIOS;So;0;L;<compat> 0028 1109 0029;;;;N;;;;; +3207;PARENTHESIZED HANGUL IEUNG;So;0;L;<compat> 0028 110B 0029;;;;N;;;;; +3208;PARENTHESIZED HANGUL CIEUC;So;0;L;<compat> 0028 110C 0029;;;;N;PARENTHESIZED HANGUL JIEUJ;;;; +3209;PARENTHESIZED HANGUL CHIEUCH;So;0;L;<compat> 0028 110E 0029;;;;N;PARENTHESIZED HANGUL CIEUC;;;; +320A;PARENTHESIZED HANGUL KHIEUKH;So;0;L;<compat> 0028 110F 0029;;;;N;PARENTHESIZED HANGUL KIYEOK;;;; +320B;PARENTHESIZED HANGUL THIEUTH;So;0;L;<compat> 0028 1110 0029;;;;N;PARENTHESIZED HANGUL TIEUT;;;; +320C;PARENTHESIZED HANGUL PHIEUPH;So;0;L;<compat> 0028 1111 0029;;;;N;PARENTHESIZED HANGUL PIEUP;;;; +320D;PARENTHESIZED HANGUL HIEUH;So;0;L;<compat> 0028 1112 0029;;;;N;;;;; +320E;PARENTHESIZED HANGUL KIYEOK A;So;0;L;<compat> 0028 1100 1161 0029;;;;N;PARENTHESIZED HANGUL GA;;;; +320F;PARENTHESIZED HANGUL NIEUN A;So;0;L;<compat> 0028 1102 1161 0029;;;;N;PARENTHESIZED HANGUL NA;;;; +3210;PARENTHESIZED HANGUL TIKEUT A;So;0;L;<compat> 0028 1103 1161 0029;;;;N;PARENTHESIZED HANGUL DA;;;; +3211;PARENTHESIZED HANGUL RIEUL A;So;0;L;<compat> 0028 1105 1161 0029;;;;N;PARENTHESIZED HANGUL LA;;;; +3212;PARENTHESIZED HANGUL MIEUM A;So;0;L;<compat> 0028 1106 1161 0029;;;;N;PARENTHESIZED HANGUL MA;;;; +3213;PARENTHESIZED HANGUL PIEUP A;So;0;L;<compat> 0028 1107 1161 0029;;;;N;PARENTHESIZED HANGUL BA;;;; +3214;PARENTHESIZED HANGUL SIOS A;So;0;L;<compat> 0028 1109 1161 0029;;;;N;PARENTHESIZED HANGUL SA;;;; +3215;PARENTHESIZED HANGUL IEUNG A;So;0;L;<compat> 0028 110B 1161 0029;;;;N;PARENTHESIZED HANGUL A;;;; +3216;PARENTHESIZED HANGUL CIEUC A;So;0;L;<compat> 0028 110C 1161 0029;;;;N;PARENTHESIZED HANGUL JA;;;; +3217;PARENTHESIZED HANGUL CHIEUCH A;So;0;L;<compat> 0028 110E 1161 0029;;;;N;PARENTHESIZED HANGUL CA;;;; +3218;PARENTHESIZED HANGUL KHIEUKH A;So;0;L;<compat> 0028 110F 1161 0029;;;;N;PARENTHESIZED HANGUL KA;;;; +3219;PARENTHESIZED HANGUL THIEUTH A;So;0;L;<compat> 0028 1110 1161 0029;;;;N;PARENTHESIZED HANGUL TA;;;; +321A;PARENTHESIZED HANGUL PHIEUPH A;So;0;L;<compat> 0028 1111 1161 0029;;;;N;PARENTHESIZED HANGUL PA;;;; +321B;PARENTHESIZED HANGUL HIEUH A;So;0;L;<compat> 0028 1112 1161 0029;;;;N;PARENTHESIZED HANGUL HA;;;; +321C;PARENTHESIZED HANGUL CIEUC U;So;0;L;<compat> 0028 110C 116E 0029;;;;N;PARENTHESIZED HANGUL JU;;;; +321D;PARENTHESIZED KOREAN CHARACTER OJEON;So;0;ON;<compat> 0028 110B 1169 110C 1165 11AB 0029;;;;N;;;;; +321E;PARENTHESIZED KOREAN CHARACTER O HU;So;0;ON;<compat> 0028 110B 1169 1112 116E 0029;;;;N;;;;; +3220;PARENTHESIZED IDEOGRAPH ONE;No;0;L;<compat> 0028 4E00 0029;;;1;N;;;;; +3221;PARENTHESIZED IDEOGRAPH TWO;No;0;L;<compat> 0028 4E8C 0029;;;2;N;;;;; +3222;PARENTHESIZED IDEOGRAPH THREE;No;0;L;<compat> 0028 4E09 0029;;;3;N;;;;; +3223;PARENTHESIZED IDEOGRAPH FOUR;No;0;L;<compat> 0028 56DB 0029;;;4;N;;;;; +3224;PARENTHESIZED IDEOGRAPH FIVE;No;0;L;<compat> 0028 4E94 0029;;;5;N;;;;; +3225;PARENTHESIZED IDEOGRAPH SIX;No;0;L;<compat> 0028 516D 0029;;;6;N;;;;; +3226;PARENTHESIZED IDEOGRAPH SEVEN;No;0;L;<compat> 0028 4E03 0029;;;7;N;;;;; +3227;PARENTHESIZED IDEOGRAPH EIGHT;No;0;L;<compat> 0028 516B 0029;;;8;N;;;;; +3228;PARENTHESIZED IDEOGRAPH NINE;No;0;L;<compat> 0028 4E5D 0029;;;9;N;;;;; +3229;PARENTHESIZED IDEOGRAPH TEN;No;0;L;<compat> 0028 5341 0029;;;10;N;;;;; +322A;PARENTHESIZED IDEOGRAPH MOON;So;0;L;<compat> 0028 6708 0029;;;;N;;;;; +322B;PARENTHESIZED IDEOGRAPH FIRE;So;0;L;<compat> 0028 706B 0029;;;;N;;;;; +322C;PARENTHESIZED IDEOGRAPH WATER;So;0;L;<compat> 0028 6C34 0029;;;;N;;;;; +322D;PARENTHESIZED IDEOGRAPH WOOD;So;0;L;<compat> 0028 6728 0029;;;;N;;;;; +322E;PARENTHESIZED IDEOGRAPH METAL;So;0;L;<compat> 0028 91D1 0029;;;;N;;;;; +322F;PARENTHESIZED IDEOGRAPH EARTH;So;0;L;<compat> 0028 571F 0029;;;;N;;;;; +3230;PARENTHESIZED IDEOGRAPH SUN;So;0;L;<compat> 0028 65E5 0029;;;;N;;;;; +3231;PARENTHESIZED IDEOGRAPH STOCK;So;0;L;<compat> 0028 682A 0029;;;;N;;;;; +3232;PARENTHESIZED IDEOGRAPH HAVE;So;0;L;<compat> 0028 6709 0029;;;;N;;;;; +3233;PARENTHESIZED IDEOGRAPH SOCIETY;So;0;L;<compat> 0028 793E 0029;;;;N;;;;; +3234;PARENTHESIZED IDEOGRAPH NAME;So;0;L;<compat> 0028 540D 0029;;;;N;;;;; +3235;PARENTHESIZED IDEOGRAPH SPECIAL;So;0;L;<compat> 0028 7279 0029;;;;N;;;;; +3236;PARENTHESIZED IDEOGRAPH FINANCIAL;So;0;L;<compat> 0028 8CA1 0029;;;;N;;;;; +3237;PARENTHESIZED IDEOGRAPH CONGRATULATION;So;0;L;<compat> 0028 795D 0029;;;;N;;;;; +3238;PARENTHESIZED IDEOGRAPH LABOR;So;0;L;<compat> 0028 52B4 0029;;;;N;;;;; +3239;PARENTHESIZED IDEOGRAPH REPRESENT;So;0;L;<compat> 0028 4EE3 0029;;;;N;;;;; +323A;PARENTHESIZED IDEOGRAPH CALL;So;0;L;<compat> 0028 547C 0029;;;;N;;;;; +323B;PARENTHESIZED IDEOGRAPH STUDY;So;0;L;<compat> 0028 5B66 0029;;;;N;;;;; +323C;PARENTHESIZED IDEOGRAPH SUPERVISE;So;0;L;<compat> 0028 76E3 0029;;;;N;;;;; +323D;PARENTHESIZED IDEOGRAPH ENTERPRISE;So;0;L;<compat> 0028 4F01 0029;;;;N;;;;; +323E;PARENTHESIZED IDEOGRAPH RESOURCE;So;0;L;<compat> 0028 8CC7 0029;;;;N;;;;; +323F;PARENTHESIZED IDEOGRAPH ALLIANCE;So;0;L;<compat> 0028 5354 0029;;;;N;;;;; +3240;PARENTHESIZED IDEOGRAPH FESTIVAL;So;0;L;<compat> 0028 796D 0029;;;;N;;;;; +3241;PARENTHESIZED IDEOGRAPH REST;So;0;L;<compat> 0028 4F11 0029;;;;N;;;;; +3242;PARENTHESIZED IDEOGRAPH SELF;So;0;L;<compat> 0028 81EA 0029;;;;N;;;;; +3243;PARENTHESIZED IDEOGRAPH REACH;So;0;L;<compat> 0028 81F3 0029;;;;N;;;;; +3244;CIRCLED IDEOGRAPH QUESTION;So;0;L;<circle> 554F;;;;N;;;;; +3245;CIRCLED IDEOGRAPH KINDERGARTEN;So;0;L;<circle> 5E7C;;;;N;;;;; +3246;CIRCLED IDEOGRAPH SCHOOL;So;0;L;<circle> 6587;;;;N;;;;; +3247;CIRCLED IDEOGRAPH KOTO;So;0;L;<circle> 7B8F;;;;N;;;;; +3248;CIRCLED NUMBER TEN ON BLACK SQUARE;No;0;L;;;;10;N;;;;; +3249;CIRCLED NUMBER TWENTY ON BLACK SQUARE;No;0;L;;;;20;N;;;;; +324A;CIRCLED NUMBER THIRTY ON BLACK SQUARE;No;0;L;;;;30;N;;;;; +324B;CIRCLED NUMBER FORTY ON BLACK SQUARE;No;0;L;;;;40;N;;;;; +324C;CIRCLED NUMBER FIFTY ON BLACK SQUARE;No;0;L;;;;50;N;;;;; +324D;CIRCLED NUMBER SIXTY ON BLACK SQUARE;No;0;L;;;;60;N;;;;; +324E;CIRCLED NUMBER SEVENTY ON BLACK SQUARE;No;0;L;;;;70;N;;;;; +324F;CIRCLED NUMBER EIGHTY ON BLACK SQUARE;No;0;L;;;;80;N;;;;; +3250;PARTNERSHIP SIGN;So;0;ON;<square> 0050 0054 0045;;;;N;;;;; +3251;CIRCLED NUMBER TWENTY ONE;No;0;ON;<circle> 0032 0031;;;21;N;;;;; +3252;CIRCLED NUMBER TWENTY TWO;No;0;ON;<circle> 0032 0032;;;22;N;;;;; +3253;CIRCLED NUMBER TWENTY THREE;No;0;ON;<circle> 0032 0033;;;23;N;;;;; +3254;CIRCLED NUMBER TWENTY FOUR;No;0;ON;<circle> 0032 0034;;;24;N;;;;; +3255;CIRCLED NUMBER TWENTY FIVE;No;0;ON;<circle> 0032 0035;;;25;N;;;;; +3256;CIRCLED NUMBER TWENTY SIX;No;0;ON;<circle> 0032 0036;;;26;N;;;;; +3257;CIRCLED NUMBER TWENTY SEVEN;No;0;ON;<circle> 0032 0037;;;27;N;;;;; +3258;CIRCLED NUMBER TWENTY EIGHT;No;0;ON;<circle> 0032 0038;;;28;N;;;;; +3259;CIRCLED NUMBER TWENTY NINE;No;0;ON;<circle> 0032 0039;;;29;N;;;;; +325A;CIRCLED NUMBER THIRTY;No;0;ON;<circle> 0033 0030;;;30;N;;;;; +325B;CIRCLED NUMBER THIRTY ONE;No;0;ON;<circle> 0033 0031;;;31;N;;;;; +325C;CIRCLED NUMBER THIRTY TWO;No;0;ON;<circle> 0033 0032;;;32;N;;;;; +325D;CIRCLED NUMBER THIRTY THREE;No;0;ON;<circle> 0033 0033;;;33;N;;;;; +325E;CIRCLED NUMBER THIRTY FOUR;No;0;ON;<circle> 0033 0034;;;34;N;;;;; +325F;CIRCLED NUMBER THIRTY FIVE;No;0;ON;<circle> 0033 0035;;;35;N;;;;; +3260;CIRCLED HANGUL KIYEOK;So;0;L;<circle> 1100;;;;N;CIRCLED HANGUL GIYEOG;;;; +3261;CIRCLED HANGUL NIEUN;So;0;L;<circle> 1102;;;;N;;;;; +3262;CIRCLED HANGUL TIKEUT;So;0;L;<circle> 1103;;;;N;CIRCLED HANGUL DIGEUD;;;; +3263;CIRCLED HANGUL RIEUL;So;0;L;<circle> 1105;;;;N;CIRCLED HANGUL LIEUL;;;; +3264;CIRCLED HANGUL MIEUM;So;0;L;<circle> 1106;;;;N;;;;; +3265;CIRCLED HANGUL PIEUP;So;0;L;<circle> 1107;;;;N;CIRCLED HANGUL BIEUB;;;; +3266;CIRCLED HANGUL SIOS;So;0;L;<circle> 1109;;;;N;;;;; +3267;CIRCLED HANGUL IEUNG;So;0;L;<circle> 110B;;;;N;;;;; +3268;CIRCLED HANGUL CIEUC;So;0;L;<circle> 110C;;;;N;CIRCLED HANGUL JIEUJ;;;; +3269;CIRCLED HANGUL CHIEUCH;So;0;L;<circle> 110E;;;;N;CIRCLED HANGUL CIEUC;;;; +326A;CIRCLED HANGUL KHIEUKH;So;0;L;<circle> 110F;;;;N;CIRCLED HANGUL KIYEOK;;;; +326B;CIRCLED HANGUL THIEUTH;So;0;L;<circle> 1110;;;;N;CIRCLED HANGUL TIEUT;;;; +326C;CIRCLED HANGUL PHIEUPH;So;0;L;<circle> 1111;;;;N;CIRCLED HANGUL PIEUP;;;; +326D;CIRCLED HANGUL HIEUH;So;0;L;<circle> 1112;;;;N;;;;; +326E;CIRCLED HANGUL KIYEOK A;So;0;L;<circle> 1100 1161;;;;N;CIRCLED HANGUL GA;;;; +326F;CIRCLED HANGUL NIEUN A;So;0;L;<circle> 1102 1161;;;;N;CIRCLED HANGUL NA;;;; +3270;CIRCLED HANGUL TIKEUT A;So;0;L;<circle> 1103 1161;;;;N;CIRCLED HANGUL DA;;;; +3271;CIRCLED HANGUL RIEUL A;So;0;L;<circle> 1105 1161;;;;N;CIRCLED HANGUL LA;;;; +3272;CIRCLED HANGUL MIEUM A;So;0;L;<circle> 1106 1161;;;;N;CIRCLED HANGUL MA;;;; +3273;CIRCLED HANGUL PIEUP A;So;0;L;<circle> 1107 1161;;;;N;CIRCLED HANGUL BA;;;; +3274;CIRCLED HANGUL SIOS A;So;0;L;<circle> 1109 1161;;;;N;CIRCLED HANGUL SA;;;; +3275;CIRCLED HANGUL IEUNG A;So;0;L;<circle> 110B 1161;;;;N;CIRCLED HANGUL A;;;; +3276;CIRCLED HANGUL CIEUC A;So;0;L;<circle> 110C 1161;;;;N;CIRCLED HANGUL JA;;;; +3277;CIRCLED HANGUL CHIEUCH A;So;0;L;<circle> 110E 1161;;;;N;CIRCLED HANGUL CA;;;; +3278;CIRCLED HANGUL KHIEUKH A;So;0;L;<circle> 110F 1161;;;;N;CIRCLED HANGUL KA;;;; +3279;CIRCLED HANGUL THIEUTH A;So;0;L;<circle> 1110 1161;;;;N;CIRCLED HANGUL TA;;;; +327A;CIRCLED HANGUL PHIEUPH A;So;0;L;<circle> 1111 1161;;;;N;CIRCLED HANGUL PA;;;; +327B;CIRCLED HANGUL HIEUH A;So;0;L;<circle> 1112 1161;;;;N;CIRCLED HANGUL HA;;;; +327C;CIRCLED KOREAN CHARACTER CHAMKO;So;0;ON;<circle> 110E 1161 11B7 1100 1169;;;;N;;;;; +327D;CIRCLED KOREAN CHARACTER JUEUI;So;0;ON;<circle> 110C 116E 110B 1174;;;;N;;;;; +327E;CIRCLED HANGUL IEUNG U;So;0;ON;<circle> 110B 116E;;;;N;;;;; +327F;KOREAN STANDARD SYMBOL;So;0;L;;;;;N;;;;; +3280;CIRCLED IDEOGRAPH ONE;No;0;L;<circle> 4E00;;;1;N;;;;; +3281;CIRCLED IDEOGRAPH TWO;No;0;L;<circle> 4E8C;;;2;N;;;;; +3282;CIRCLED IDEOGRAPH THREE;No;0;L;<circle> 4E09;;;3;N;;;;; +3283;CIRCLED IDEOGRAPH FOUR;No;0;L;<circle> 56DB;;;4;N;;;;; +3284;CIRCLED IDEOGRAPH FIVE;No;0;L;<circle> 4E94;;;5;N;;;;; +3285;CIRCLED IDEOGRAPH SIX;No;0;L;<circle> 516D;;;6;N;;;;; +3286;CIRCLED IDEOGRAPH SEVEN;No;0;L;<circle> 4E03;;;7;N;;;;; +3287;CIRCLED IDEOGRAPH EIGHT;No;0;L;<circle> 516B;;;8;N;;;;; +3288;CIRCLED IDEOGRAPH NINE;No;0;L;<circle> 4E5D;;;9;N;;;;; +3289;CIRCLED IDEOGRAPH TEN;No;0;L;<circle> 5341;;;10;N;;;;; +328A;CIRCLED IDEOGRAPH MOON;So;0;L;<circle> 6708;;;;N;;;;; +328B;CIRCLED IDEOGRAPH FIRE;So;0;L;<circle> 706B;;;;N;;;;; +328C;CIRCLED IDEOGRAPH WATER;So;0;L;<circle> 6C34;;;;N;;;;; +328D;CIRCLED IDEOGRAPH WOOD;So;0;L;<circle> 6728;;;;N;;;;; +328E;CIRCLED IDEOGRAPH METAL;So;0;L;<circle> 91D1;;;;N;;;;; +328F;CIRCLED IDEOGRAPH EARTH;So;0;L;<circle> 571F;;;;N;;;;; +3290;CIRCLED IDEOGRAPH SUN;So;0;L;<circle> 65E5;;;;N;;;;; +3291;CIRCLED IDEOGRAPH STOCK;So;0;L;<circle> 682A;;;;N;;;;; +3292;CIRCLED IDEOGRAPH HAVE;So;0;L;<circle> 6709;;;;N;;;;; +3293;CIRCLED IDEOGRAPH SOCIETY;So;0;L;<circle> 793E;;;;N;;;;; +3294;CIRCLED IDEOGRAPH NAME;So;0;L;<circle> 540D;;;;N;;;;; +3295;CIRCLED IDEOGRAPH SPECIAL;So;0;L;<circle> 7279;;;;N;;;;; +3296;CIRCLED IDEOGRAPH FINANCIAL;So;0;L;<circle> 8CA1;;;;N;;;;; +3297;CIRCLED IDEOGRAPH CONGRATULATION;So;0;L;<circle> 795D;;;;N;;;;; +3298;CIRCLED IDEOGRAPH LABOR;So;0;L;<circle> 52B4;;;;N;;;;; +3299;CIRCLED IDEOGRAPH SECRET;So;0;L;<circle> 79D8;;;;N;;;;; +329A;CIRCLED IDEOGRAPH MALE;So;0;L;<circle> 7537;;;;N;;;;; +329B;CIRCLED IDEOGRAPH FEMALE;So;0;L;<circle> 5973;;;;N;;;;; +329C;CIRCLED IDEOGRAPH SUITABLE;So;0;L;<circle> 9069;;;;N;;;;; +329D;CIRCLED IDEOGRAPH EXCELLENT;So;0;L;<circle> 512A;;;;N;;;;; +329E;CIRCLED IDEOGRAPH PRINT;So;0;L;<circle> 5370;;;;N;;;;; +329F;CIRCLED IDEOGRAPH ATTENTION;So;0;L;<circle> 6CE8;;;;N;;;;; +32A0;CIRCLED IDEOGRAPH ITEM;So;0;L;<circle> 9805;;;;N;;;;; +32A1;CIRCLED IDEOGRAPH REST;So;0;L;<circle> 4F11;;;;N;;;;; +32A2;CIRCLED IDEOGRAPH COPY;So;0;L;<circle> 5199;;;;N;;;;; +32A3;CIRCLED IDEOGRAPH CORRECT;So;0;L;<circle> 6B63;;;;N;;;;; +32A4;CIRCLED IDEOGRAPH HIGH;So;0;L;<circle> 4E0A;;;;N;;;;; +32A5;CIRCLED IDEOGRAPH CENTRE;So;0;L;<circle> 4E2D;;;;N;CIRCLED IDEOGRAPH CENTER;;;; +32A6;CIRCLED IDEOGRAPH LOW;So;0;L;<circle> 4E0B;;;;N;;;;; +32A7;CIRCLED IDEOGRAPH LEFT;So;0;L;<circle> 5DE6;;;;N;;;;; +32A8;CIRCLED IDEOGRAPH RIGHT;So;0;L;<circle> 53F3;;;;N;;;;; +32A9;CIRCLED IDEOGRAPH MEDICINE;So;0;L;<circle> 533B;;;;N;;;;; +32AA;CIRCLED IDEOGRAPH RELIGION;So;0;L;<circle> 5B97;;;;N;;;;; +32AB;CIRCLED IDEOGRAPH STUDY;So;0;L;<circle> 5B66;;;;N;;;;; +32AC;CIRCLED IDEOGRAPH SUPERVISE;So;0;L;<circle> 76E3;;;;N;;;;; +32AD;CIRCLED IDEOGRAPH ENTERPRISE;So;0;L;<circle> 4F01;;;;N;;;;; +32AE;CIRCLED IDEOGRAPH RESOURCE;So;0;L;<circle> 8CC7;;;;N;;;;; +32AF;CIRCLED IDEOGRAPH ALLIANCE;So;0;L;<circle> 5354;;;;N;;;;; +32B0;CIRCLED IDEOGRAPH NIGHT;So;0;L;<circle> 591C;;;;N;;;;; +32B1;CIRCLED NUMBER THIRTY SIX;No;0;ON;<circle> 0033 0036;;;36;N;;;;; +32B2;CIRCLED NUMBER THIRTY SEVEN;No;0;ON;<circle> 0033 0037;;;37;N;;;;; +32B3;CIRCLED NUMBER THIRTY EIGHT;No;0;ON;<circle> 0033 0038;;;38;N;;;;; +32B4;CIRCLED NUMBER THIRTY NINE;No;0;ON;<circle> 0033 0039;;;39;N;;;;; +32B5;CIRCLED NUMBER FORTY;No;0;ON;<circle> 0034 0030;;;40;N;;;;; +32B6;CIRCLED NUMBER FORTY ONE;No;0;ON;<circle> 0034 0031;;;41;N;;;;; +32B7;CIRCLED NUMBER FORTY TWO;No;0;ON;<circle> 0034 0032;;;42;N;;;;; +32B8;CIRCLED NUMBER FORTY THREE;No;0;ON;<circle> 0034 0033;;;43;N;;;;; +32B9;CIRCLED NUMBER FORTY FOUR;No;0;ON;<circle> 0034 0034;;;44;N;;;;; +32BA;CIRCLED NUMBER FORTY FIVE;No;0;ON;<circle> 0034 0035;;;45;N;;;;; +32BB;CIRCLED NUMBER FORTY SIX;No;0;ON;<circle> 0034 0036;;;46;N;;;;; +32BC;CIRCLED NUMBER FORTY SEVEN;No;0;ON;<circle> 0034 0037;;;47;N;;;;; +32BD;CIRCLED NUMBER FORTY EIGHT;No;0;ON;<circle> 0034 0038;;;48;N;;;;; +32BE;CIRCLED NUMBER FORTY NINE;No;0;ON;<circle> 0034 0039;;;49;N;;;;; +32BF;CIRCLED NUMBER FIFTY;No;0;ON;<circle> 0035 0030;;;50;N;;;;; +32C0;IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY;So;0;L;<compat> 0031 6708;;;;N;;;;; +32C1;IDEOGRAPHIC TELEGRAPH SYMBOL FOR FEBRUARY;So;0;L;<compat> 0032 6708;;;;N;;;;; +32C2;IDEOGRAPHIC TELEGRAPH SYMBOL FOR MARCH;So;0;L;<compat> 0033 6708;;;;N;;;;; +32C3;IDEOGRAPHIC TELEGRAPH SYMBOL FOR APRIL;So;0;L;<compat> 0034 6708;;;;N;;;;; +32C4;IDEOGRAPHIC TELEGRAPH SYMBOL FOR MAY;So;0;L;<compat> 0035 6708;;;;N;;;;; +32C5;IDEOGRAPHIC TELEGRAPH SYMBOL FOR JUNE;So;0;L;<compat> 0036 6708;;;;N;;;;; +32C6;IDEOGRAPHIC TELEGRAPH SYMBOL FOR JULY;So;0;L;<compat> 0037 6708;;;;N;;;;; +32C7;IDEOGRAPHIC TELEGRAPH SYMBOL FOR AUGUST;So;0;L;<compat> 0038 6708;;;;N;;;;; +32C8;IDEOGRAPHIC TELEGRAPH SYMBOL FOR SEPTEMBER;So;0;L;<compat> 0039 6708;;;;N;;;;; +32C9;IDEOGRAPHIC TELEGRAPH SYMBOL FOR OCTOBER;So;0;L;<compat> 0031 0030 6708;;;;N;;;;; +32CA;IDEOGRAPHIC TELEGRAPH SYMBOL FOR NOVEMBER;So;0;L;<compat> 0031 0031 6708;;;;N;;;;; +32CB;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DECEMBER;So;0;L;<compat> 0031 0032 6708;;;;N;;;;; +32CC;SQUARE HG;So;0;ON;<square> 0048 0067;;;;N;;;;; +32CD;SQUARE ERG;So;0;ON;<square> 0065 0072 0067;;;;N;;;;; +32CE;SQUARE EV;So;0;ON;<square> 0065 0056;;;;N;;;;; +32CF;LIMITED LIABILITY SIGN;So;0;ON;<square> 004C 0054 0044;;;;N;;;;; +32D0;CIRCLED KATAKANA A;So;0;L;<circle> 30A2;;;;N;;;;; +32D1;CIRCLED KATAKANA I;So;0;L;<circle> 30A4;;;;N;;;;; +32D2;CIRCLED KATAKANA U;So;0;L;<circle> 30A6;;;;N;;;;; +32D3;CIRCLED KATAKANA E;So;0;L;<circle> 30A8;;;;N;;;;; +32D4;CIRCLED KATAKANA O;So;0;L;<circle> 30AA;;;;N;;;;; +32D5;CIRCLED KATAKANA KA;So;0;L;<circle> 30AB;;;;N;;;;; +32D6;CIRCLED KATAKANA KI;So;0;L;<circle> 30AD;;;;N;;;;; +32D7;CIRCLED KATAKANA KU;So;0;L;<circle> 30AF;;;;N;;;;; +32D8;CIRCLED KATAKANA KE;So;0;L;<circle> 30B1;;;;N;;;;; +32D9;CIRCLED KATAKANA KO;So;0;L;<circle> 30B3;;;;N;;;;; +32DA;CIRCLED KATAKANA SA;So;0;L;<circle> 30B5;;;;N;;;;; +32DB;CIRCLED KATAKANA SI;So;0;L;<circle> 30B7;;;;N;;;;; +32DC;CIRCLED KATAKANA SU;So;0;L;<circle> 30B9;;;;N;;;;; +32DD;CIRCLED KATAKANA SE;So;0;L;<circle> 30BB;;;;N;;;;; +32DE;CIRCLED KATAKANA SO;So;0;L;<circle> 30BD;;;;N;;;;; +32DF;CIRCLED KATAKANA TA;So;0;L;<circle> 30BF;;;;N;;;;; +32E0;CIRCLED KATAKANA TI;So;0;L;<circle> 30C1;;;;N;;;;; +32E1;CIRCLED KATAKANA TU;So;0;L;<circle> 30C4;;;;N;;;;; +32E2;CIRCLED KATAKANA TE;So;0;L;<circle> 30C6;;;;N;;;;; +32E3;CIRCLED KATAKANA TO;So;0;L;<circle> 30C8;;;;N;;;;; +32E4;CIRCLED KATAKANA NA;So;0;L;<circle> 30CA;;;;N;;;;; +32E5;CIRCLED KATAKANA NI;So;0;L;<circle> 30CB;;;;N;;;;; +32E6;CIRCLED KATAKANA NU;So;0;L;<circle> 30CC;;;;N;;;;; +32E7;CIRCLED KATAKANA NE;So;0;L;<circle> 30CD;;;;N;;;;; +32E8;CIRCLED KATAKANA NO;So;0;L;<circle> 30CE;;;;N;;;;; +32E9;CIRCLED KATAKANA HA;So;0;L;<circle> 30CF;;;;N;;;;; +32EA;CIRCLED KATAKANA HI;So;0;L;<circle> 30D2;;;;N;;;;; +32EB;CIRCLED KATAKANA HU;So;0;L;<circle> 30D5;;;;N;;;;; +32EC;CIRCLED KATAKANA HE;So;0;L;<circle> 30D8;;;;N;;;;; +32ED;CIRCLED KATAKANA HO;So;0;L;<circle> 30DB;;;;N;;;;; +32EE;CIRCLED KATAKANA MA;So;0;L;<circle> 30DE;;;;N;;;;; +32EF;CIRCLED KATAKANA MI;So;0;L;<circle> 30DF;;;;N;;;;; +32F0;CIRCLED KATAKANA MU;So;0;L;<circle> 30E0;;;;N;;;;; +32F1;CIRCLED KATAKANA ME;So;0;L;<circle> 30E1;;;;N;;;;; +32F2;CIRCLED KATAKANA MO;So;0;L;<circle> 30E2;;;;N;;;;; +32F3;CIRCLED KATAKANA YA;So;0;L;<circle> 30E4;;;;N;;;;; +32F4;CIRCLED KATAKANA YU;So;0;L;<circle> 30E6;;;;N;;;;; +32F5;CIRCLED KATAKANA YO;So;0;L;<circle> 30E8;;;;N;;;;; +32F6;CIRCLED KATAKANA RA;So;0;L;<circle> 30E9;;;;N;;;;; +32F7;CIRCLED KATAKANA RI;So;0;L;<circle> 30EA;;;;N;;;;; +32F8;CIRCLED KATAKANA RU;So;0;L;<circle> 30EB;;;;N;;;;; +32F9;CIRCLED KATAKANA RE;So;0;L;<circle> 30EC;;;;N;;;;; +32FA;CIRCLED KATAKANA RO;So;0;L;<circle> 30ED;;;;N;;;;; +32FB;CIRCLED KATAKANA WA;So;0;L;<circle> 30EF;;;;N;;;;; +32FC;CIRCLED KATAKANA WI;So;0;L;<circle> 30F0;;;;N;;;;; +32FD;CIRCLED KATAKANA WE;So;0;L;<circle> 30F1;;;;N;;;;; +32FE;CIRCLED KATAKANA WO;So;0;L;<circle> 30F2;;;;N;;;;; +3300;SQUARE APAATO;So;0;L;<square> 30A2 30D1 30FC 30C8;;;;N;SQUARED APAATO;;;; +3301;SQUARE ARUHUA;So;0;L;<square> 30A2 30EB 30D5 30A1;;;;N;SQUARED ARUHUA;;;; +3302;SQUARE ANPEA;So;0;L;<square> 30A2 30F3 30DA 30A2;;;;N;SQUARED ANPEA;;;; +3303;SQUARE AARU;So;0;L;<square> 30A2 30FC 30EB;;;;N;SQUARED AARU;;;; +3304;SQUARE ININGU;So;0;L;<square> 30A4 30CB 30F3 30B0;;;;N;SQUARED ININGU;;;; +3305;SQUARE INTI;So;0;L;<square> 30A4 30F3 30C1;;;;N;SQUARED INTI;;;; +3306;SQUARE UON;So;0;L;<square> 30A6 30A9 30F3;;;;N;SQUARED UON;;;; +3307;SQUARE ESUKUUDO;So;0;L;<square> 30A8 30B9 30AF 30FC 30C9;;;;N;SQUARED ESUKUUDO;;;; +3308;SQUARE EEKAA;So;0;L;<square> 30A8 30FC 30AB 30FC;;;;N;SQUARED EEKAA;;;; +3309;SQUARE ONSU;So;0;L;<square> 30AA 30F3 30B9;;;;N;SQUARED ONSU;;;; +330A;SQUARE OOMU;So;0;L;<square> 30AA 30FC 30E0;;;;N;SQUARED OOMU;;;; +330B;SQUARE KAIRI;So;0;L;<square> 30AB 30A4 30EA;;;;N;SQUARED KAIRI;;;; +330C;SQUARE KARATTO;So;0;L;<square> 30AB 30E9 30C3 30C8;;;;N;SQUARED KARATTO;;;; +330D;SQUARE KARORII;So;0;L;<square> 30AB 30ED 30EA 30FC;;;;N;SQUARED KARORII;;;; +330E;SQUARE GARON;So;0;L;<square> 30AC 30ED 30F3;;;;N;SQUARED GARON;;;; +330F;SQUARE GANMA;So;0;L;<square> 30AC 30F3 30DE;;;;N;SQUARED GANMA;;;; +3310;SQUARE GIGA;So;0;L;<square> 30AE 30AC;;;;N;SQUARED GIGA;;;; +3311;SQUARE GINII;So;0;L;<square> 30AE 30CB 30FC;;;;N;SQUARED GINII;;;; +3312;SQUARE KYURII;So;0;L;<square> 30AD 30E5 30EA 30FC;;;;N;SQUARED KYURII;;;; +3313;SQUARE GIRUDAA;So;0;L;<square> 30AE 30EB 30C0 30FC;;;;N;SQUARED GIRUDAA;;;; +3314;SQUARE KIRO;So;0;L;<square> 30AD 30ED;;;;N;SQUARED KIRO;;;; +3315;SQUARE KIROGURAMU;So;0;L;<square> 30AD 30ED 30B0 30E9 30E0;;;;N;SQUARED KIROGURAMU;;;; +3316;SQUARE KIROMEETORU;So;0;L;<square> 30AD 30ED 30E1 30FC 30C8 30EB;;;;N;SQUARED KIROMEETORU;;;; +3317;SQUARE KIROWATTO;So;0;L;<square> 30AD 30ED 30EF 30C3 30C8;;;;N;SQUARED KIROWATTO;;;; +3318;SQUARE GURAMU;So;0;L;<square> 30B0 30E9 30E0;;;;N;SQUARED GURAMU;;;; +3319;SQUARE GURAMUTON;So;0;L;<square> 30B0 30E9 30E0 30C8 30F3;;;;N;SQUARED GURAMUTON;;;; +331A;SQUARE KURUZEIRO;So;0;L;<square> 30AF 30EB 30BC 30A4 30ED;;;;N;SQUARED KURUZEIRO;;;; +331B;SQUARE KUROONE;So;0;L;<square> 30AF 30ED 30FC 30CD;;;;N;SQUARED KUROONE;;;; +331C;SQUARE KEESU;So;0;L;<square> 30B1 30FC 30B9;;;;N;SQUARED KEESU;;;; +331D;SQUARE KORUNA;So;0;L;<square> 30B3 30EB 30CA;;;;N;SQUARED KORUNA;;;; +331E;SQUARE KOOPO;So;0;L;<square> 30B3 30FC 30DD;;;;N;SQUARED KOOPO;;;; +331F;SQUARE SAIKURU;So;0;L;<square> 30B5 30A4 30AF 30EB;;;;N;SQUARED SAIKURU;;;; +3320;SQUARE SANTIIMU;So;0;L;<square> 30B5 30F3 30C1 30FC 30E0;;;;N;SQUARED SANTIIMU;;;; +3321;SQUARE SIRINGU;So;0;L;<square> 30B7 30EA 30F3 30B0;;;;N;SQUARED SIRINGU;;;; +3322;SQUARE SENTI;So;0;L;<square> 30BB 30F3 30C1;;;;N;SQUARED SENTI;;;; +3323;SQUARE SENTO;So;0;L;<square> 30BB 30F3 30C8;;;;N;SQUARED SENTO;;;; +3324;SQUARE DAASU;So;0;L;<square> 30C0 30FC 30B9;;;;N;SQUARED DAASU;;;; +3325;SQUARE DESI;So;0;L;<square> 30C7 30B7;;;;N;SQUARED DESI;;;; +3326;SQUARE DORU;So;0;L;<square> 30C9 30EB;;;;N;SQUARED DORU;;;; +3327;SQUARE TON;So;0;L;<square> 30C8 30F3;;;;N;SQUARED TON;;;; +3328;SQUARE NANO;So;0;L;<square> 30CA 30CE;;;;N;SQUARED NANO;;;; +3329;SQUARE NOTTO;So;0;L;<square> 30CE 30C3 30C8;;;;N;SQUARED NOTTO;;;; +332A;SQUARE HAITU;So;0;L;<square> 30CF 30A4 30C4;;;;N;SQUARED HAITU;;;; +332B;SQUARE PAASENTO;So;0;L;<square> 30D1 30FC 30BB 30F3 30C8;;;;N;SQUARED PAASENTO;;;; +332C;SQUARE PAATU;So;0;L;<square> 30D1 30FC 30C4;;;;N;SQUARED PAATU;;;; +332D;SQUARE BAARERU;So;0;L;<square> 30D0 30FC 30EC 30EB;;;;N;SQUARED BAARERU;;;; +332E;SQUARE PIASUTORU;So;0;L;<square> 30D4 30A2 30B9 30C8 30EB;;;;N;SQUARED PIASUTORU;;;; +332F;SQUARE PIKURU;So;0;L;<square> 30D4 30AF 30EB;;;;N;SQUARED PIKURU;;;; +3330;SQUARE PIKO;So;0;L;<square> 30D4 30B3;;;;N;SQUARED PIKO;;;; +3331;SQUARE BIRU;So;0;L;<square> 30D3 30EB;;;;N;SQUARED BIRU;;;; +3332;SQUARE HUARADDO;So;0;L;<square> 30D5 30A1 30E9 30C3 30C9;;;;N;SQUARED HUARADDO;;;; +3333;SQUARE HUIITO;So;0;L;<square> 30D5 30A3 30FC 30C8;;;;N;SQUARED HUIITO;;;; +3334;SQUARE BUSSYERU;So;0;L;<square> 30D6 30C3 30B7 30A7 30EB;;;;N;SQUARED BUSSYERU;;;; +3335;SQUARE HURAN;So;0;L;<square> 30D5 30E9 30F3;;;;N;SQUARED HURAN;;;; +3336;SQUARE HEKUTAARU;So;0;L;<square> 30D8 30AF 30BF 30FC 30EB;;;;N;SQUARED HEKUTAARU;;;; +3337;SQUARE PESO;So;0;L;<square> 30DA 30BD;;;;N;SQUARED PESO;;;; +3338;SQUARE PENIHI;So;0;L;<square> 30DA 30CB 30D2;;;;N;SQUARED PENIHI;;;; +3339;SQUARE HERUTU;So;0;L;<square> 30D8 30EB 30C4;;;;N;SQUARED HERUTU;;;; +333A;SQUARE PENSU;So;0;L;<square> 30DA 30F3 30B9;;;;N;SQUARED PENSU;;;; +333B;SQUARE PEEZI;So;0;L;<square> 30DA 30FC 30B8;;;;N;SQUARED PEEZI;;;; +333C;SQUARE BEETA;So;0;L;<square> 30D9 30FC 30BF;;;;N;SQUARED BEETA;;;; +333D;SQUARE POINTO;So;0;L;<square> 30DD 30A4 30F3 30C8;;;;N;SQUARED POINTO;;;; +333E;SQUARE BORUTO;So;0;L;<square> 30DC 30EB 30C8;;;;N;SQUARED BORUTO;;;; +333F;SQUARE HON;So;0;L;<square> 30DB 30F3;;;;N;SQUARED HON;;;; +3340;SQUARE PONDO;So;0;L;<square> 30DD 30F3 30C9;;;;N;SQUARED PONDO;;;; +3341;SQUARE HOORU;So;0;L;<square> 30DB 30FC 30EB;;;;N;SQUARED HOORU;;;; +3342;SQUARE HOON;So;0;L;<square> 30DB 30FC 30F3;;;;N;SQUARED HOON;;;; +3343;SQUARE MAIKURO;So;0;L;<square> 30DE 30A4 30AF 30ED;;;;N;SQUARED MAIKURO;;;; +3344;SQUARE MAIRU;So;0;L;<square> 30DE 30A4 30EB;;;;N;SQUARED MAIRU;;;; +3345;SQUARE MAHHA;So;0;L;<square> 30DE 30C3 30CF;;;;N;SQUARED MAHHA;;;; +3346;SQUARE MARUKU;So;0;L;<square> 30DE 30EB 30AF;;;;N;SQUARED MARUKU;;;; +3347;SQUARE MANSYON;So;0;L;<square> 30DE 30F3 30B7 30E7 30F3;;;;N;SQUARED MANSYON;;;; +3348;SQUARE MIKURON;So;0;L;<square> 30DF 30AF 30ED 30F3;;;;N;SQUARED MIKURON;;;; +3349;SQUARE MIRI;So;0;L;<square> 30DF 30EA;;;;N;SQUARED MIRI;;;; +334A;SQUARE MIRIBAARU;So;0;L;<square> 30DF 30EA 30D0 30FC 30EB;;;;N;SQUARED MIRIBAARU;;;; +334B;SQUARE MEGA;So;0;L;<square> 30E1 30AC;;;;N;SQUARED MEGA;;;; +334C;SQUARE MEGATON;So;0;L;<square> 30E1 30AC 30C8 30F3;;;;N;SQUARED MEGATON;;;; +334D;SQUARE MEETORU;So;0;L;<square> 30E1 30FC 30C8 30EB;;;;N;SQUARED MEETORU;;;; +334E;SQUARE YAADO;So;0;L;<square> 30E4 30FC 30C9;;;;N;SQUARED YAADO;;;; +334F;SQUARE YAARU;So;0;L;<square> 30E4 30FC 30EB;;;;N;SQUARED YAARU;;;; +3350;SQUARE YUAN;So;0;L;<square> 30E6 30A2 30F3;;;;N;SQUARED YUAN;;;; +3351;SQUARE RITTORU;So;0;L;<square> 30EA 30C3 30C8 30EB;;;;N;SQUARED RITTORU;;;; +3352;SQUARE RIRA;So;0;L;<square> 30EA 30E9;;;;N;SQUARED RIRA;;;; +3353;SQUARE RUPII;So;0;L;<square> 30EB 30D4 30FC;;;;N;SQUARED RUPII;;;; +3354;SQUARE RUUBURU;So;0;L;<square> 30EB 30FC 30D6 30EB;;;;N;SQUARED RUUBURU;;;; +3355;SQUARE REMU;So;0;L;<square> 30EC 30E0;;;;N;SQUARED REMU;;;; +3356;SQUARE RENTOGEN;So;0;L;<square> 30EC 30F3 30C8 30B2 30F3;;;;N;SQUARED RENTOGEN;;;; +3357;SQUARE WATTO;So;0;L;<square> 30EF 30C3 30C8;;;;N;SQUARED WATTO;;;; +3358;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ZERO;So;0;L;<compat> 0030 70B9;;;;N;;;;; +3359;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ONE;So;0;L;<compat> 0031 70B9;;;;N;;;;; +335A;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWO;So;0;L;<compat> 0032 70B9;;;;N;;;;; +335B;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THREE;So;0;L;<compat> 0033 70B9;;;;N;;;;; +335C;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOUR;So;0;L;<compat> 0034 70B9;;;;N;;;;; +335D;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIVE;So;0;L;<compat> 0035 70B9;;;;N;;;;; +335E;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIX;So;0;L;<compat> 0036 70B9;;;;N;;;;; +335F;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVEN;So;0;L;<compat> 0037 70B9;;;;N;;;;; +3360;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHT;So;0;L;<compat> 0038 70B9;;;;N;;;;; +3361;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINE;So;0;L;<compat> 0039 70B9;;;;N;;;;; +3362;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TEN;So;0;L;<compat> 0031 0030 70B9;;;;N;;;;; +3363;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ELEVEN;So;0;L;<compat> 0031 0031 70B9;;;;N;;;;; +3364;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWELVE;So;0;L;<compat> 0031 0032 70B9;;;;N;;;;; +3365;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THIRTEEN;So;0;L;<compat> 0031 0033 70B9;;;;N;;;;; +3366;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOURTEEN;So;0;L;<compat> 0031 0034 70B9;;;;N;;;;; +3367;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIFTEEN;So;0;L;<compat> 0031 0035 70B9;;;;N;;;;; +3368;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIXTEEN;So;0;L;<compat> 0031 0036 70B9;;;;N;;;;; +3369;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVENTEEN;So;0;L;<compat> 0031 0037 70B9;;;;N;;;;; +336A;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHTEEN;So;0;L;<compat> 0031 0038 70B9;;;;N;;;;; +336B;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINETEEN;So;0;L;<compat> 0031 0039 70B9;;;;N;;;;; +336C;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY;So;0;L;<compat> 0032 0030 70B9;;;;N;;;;; +336D;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-ONE;So;0;L;<compat> 0032 0031 70B9;;;;N;;;;; +336E;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-TWO;So;0;L;<compat> 0032 0032 70B9;;;;N;;;;; +336F;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-THREE;So;0;L;<compat> 0032 0033 70B9;;;;N;;;;; +3370;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-FOUR;So;0;L;<compat> 0032 0034 70B9;;;;N;;;;; +3371;SQUARE HPA;So;0;L;<square> 0068 0050 0061;;;;N;;;;; +3372;SQUARE DA;So;0;L;<square> 0064 0061;;;;N;;;;; +3373;SQUARE AU;So;0;L;<square> 0041 0055;;;;N;;;;; +3374;SQUARE BAR;So;0;L;<square> 0062 0061 0072;;;;N;;;;; +3375;SQUARE OV;So;0;L;<square> 006F 0056;;;;N;;;;; +3376;SQUARE PC;So;0;L;<square> 0070 0063;;;;N;;;;; +3377;SQUARE DM;So;0;ON;<square> 0064 006D;;;;N;;;;; +3378;SQUARE DM SQUARED;So;0;ON;<square> 0064 006D 00B2;;;;N;;;;; +3379;SQUARE DM CUBED;So;0;ON;<square> 0064 006D 00B3;;;;N;;;;; +337A;SQUARE IU;So;0;ON;<square> 0049 0055;;;;N;;;;; +337B;SQUARE ERA NAME HEISEI;So;0;L;<square> 5E73 6210;;;;N;SQUARED TWO IDEOGRAPHS ERA NAME HEISEI;;;; +337C;SQUARE ERA NAME SYOUWA;So;0;L;<square> 662D 548C;;;;N;SQUARED TWO IDEOGRAPHS ERA NAME SYOUWA;;;; +337D;SQUARE ERA NAME TAISYOU;So;0;L;<square> 5927 6B63;;;;N;SQUARED TWO IDEOGRAPHS ERA NAME TAISYOU;;;; +337E;SQUARE ERA NAME MEIZI;So;0;L;<square> 660E 6CBB;;;;N;SQUARED TWO IDEOGRAPHS ERA NAME MEIZI;;;; +337F;SQUARE CORPORATION;So;0;L;<square> 682A 5F0F 4F1A 793E;;;;N;SQUARED FOUR IDEOGRAPHS CORPORATION;;;; +3380;SQUARE PA AMPS;So;0;L;<square> 0070 0041;;;;N;SQUARED PA AMPS;;;; +3381;SQUARE NA;So;0;L;<square> 006E 0041;;;;N;SQUARED NA;;;; +3382;SQUARE MU A;So;0;L;<square> 03BC 0041;;;;N;SQUARED MU A;;;; +3383;SQUARE MA;So;0;L;<square> 006D 0041;;;;N;SQUARED MA;;;; +3384;SQUARE KA;So;0;L;<square> 006B 0041;;;;N;SQUARED KA;;;; +3385;SQUARE KB;So;0;L;<square> 004B 0042;;;;N;SQUARED KB;;;; +3386;SQUARE MB;So;0;L;<square> 004D 0042;;;;N;SQUARED MB;;;; +3387;SQUARE GB;So;0;L;<square> 0047 0042;;;;N;SQUARED GB;;;; +3388;SQUARE CAL;So;0;L;<square> 0063 0061 006C;;;;N;SQUARED CAL;;;; +3389;SQUARE KCAL;So;0;L;<square> 006B 0063 0061 006C;;;;N;SQUARED KCAL;;;; +338A;SQUARE PF;So;0;L;<square> 0070 0046;;;;N;SQUARED PF;;;; +338B;SQUARE NF;So;0;L;<square> 006E 0046;;;;N;SQUARED NF;;;; +338C;SQUARE MU F;So;0;L;<square> 03BC 0046;;;;N;SQUARED MU F;;;; +338D;SQUARE MU G;So;0;L;<square> 03BC 0067;;;;N;SQUARED MU G;;;; +338E;SQUARE MG;So;0;L;<square> 006D 0067;;;;N;SQUARED MG;;;; +338F;SQUARE KG;So;0;L;<square> 006B 0067;;;;N;SQUARED KG;;;; +3390;SQUARE HZ;So;0;L;<square> 0048 007A;;;;N;SQUARED HZ;;;; +3391;SQUARE KHZ;So;0;L;<square> 006B 0048 007A;;;;N;SQUARED KHZ;;;; +3392;SQUARE MHZ;So;0;L;<square> 004D 0048 007A;;;;N;SQUARED MHZ;;;; +3393;SQUARE GHZ;So;0;L;<square> 0047 0048 007A;;;;N;SQUARED GHZ;;;; +3394;SQUARE THZ;So;0;L;<square> 0054 0048 007A;;;;N;SQUARED THZ;;;; +3395;SQUARE MU L;So;0;L;<square> 03BC 2113;;;;N;SQUARED MU L;;;; +3396;SQUARE ML;So;0;L;<square> 006D 2113;;;;N;SQUARED ML;;;; +3397;SQUARE DL;So;0;L;<square> 0064 2113;;;;N;SQUARED DL;;;; +3398;SQUARE KL;So;0;L;<square> 006B 2113;;;;N;SQUARED KL;;;; +3399;SQUARE FM;So;0;L;<square> 0066 006D;;;;N;SQUARED FM;;;; +339A;SQUARE NM;So;0;L;<square> 006E 006D;;;;N;SQUARED NM;;;; +339B;SQUARE MU M;So;0;L;<square> 03BC 006D;;;;N;SQUARED MU M;;;; +339C;SQUARE MM;So;0;L;<square> 006D 006D;;;;N;SQUARED MM;;;; +339D;SQUARE CM;So;0;L;<square> 0063 006D;;;;N;SQUARED CM;;;; +339E;SQUARE KM;So;0;L;<square> 006B 006D;;;;N;SQUARED KM;;;; +339F;SQUARE MM SQUARED;So;0;L;<square> 006D 006D 00B2;;;;N;SQUARED MM SQUARED;;;; +33A0;SQUARE CM SQUARED;So;0;L;<square> 0063 006D 00B2;;;;N;SQUARED CM SQUARED;;;; +33A1;SQUARE M SQUARED;So;0;L;<square> 006D 00B2;;;;N;SQUARED M SQUARED;;;; +33A2;SQUARE KM SQUARED;So;0;L;<square> 006B 006D 00B2;;;;N;SQUARED KM SQUARED;;;; +33A3;SQUARE MM CUBED;So;0;L;<square> 006D 006D 00B3;;;;N;SQUARED MM CUBED;;;; +33A4;SQUARE CM CUBED;So;0;L;<square> 0063 006D 00B3;;;;N;SQUARED CM CUBED;;;; +33A5;SQUARE M CUBED;So;0;L;<square> 006D 00B3;;;;N;SQUARED M CUBED;;;; +33A6;SQUARE KM CUBED;So;0;L;<square> 006B 006D 00B3;;;;N;SQUARED KM CUBED;;;; +33A7;SQUARE M OVER S;So;0;L;<square> 006D 2215 0073;;;;N;SQUARED M OVER S;;;; +33A8;SQUARE M OVER S SQUARED;So;0;L;<square> 006D 2215 0073 00B2;;;;N;SQUARED M OVER S SQUARED;;;; +33A9;SQUARE PA;So;0;L;<square> 0050 0061;;;;N;SQUARED PA;;;; +33AA;SQUARE KPA;So;0;L;<square> 006B 0050 0061;;;;N;SQUARED KPA;;;; +33AB;SQUARE MPA;So;0;L;<square> 004D 0050 0061;;;;N;SQUARED MPA;;;; +33AC;SQUARE GPA;So;0;L;<square> 0047 0050 0061;;;;N;SQUARED GPA;;;; +33AD;SQUARE RAD;So;0;L;<square> 0072 0061 0064;;;;N;SQUARED RAD;;;; +33AE;SQUARE RAD OVER S;So;0;L;<square> 0072 0061 0064 2215 0073;;;;N;SQUARED RAD OVER S;;;; +33AF;SQUARE RAD OVER S SQUARED;So;0;L;<square> 0072 0061 0064 2215 0073 00B2;;;;N;SQUARED RAD OVER S SQUARED;;;; +33B0;SQUARE PS;So;0;L;<square> 0070 0073;;;;N;SQUARED PS;;;; +33B1;SQUARE NS;So;0;L;<square> 006E 0073;;;;N;SQUARED NS;;;; +33B2;SQUARE MU S;So;0;L;<square> 03BC 0073;;;;N;SQUARED MU S;;;; +33B3;SQUARE MS;So;0;L;<square> 006D 0073;;;;N;SQUARED MS;;;; +33B4;SQUARE PV;So;0;L;<square> 0070 0056;;;;N;SQUARED PV;;;; +33B5;SQUARE NV;So;0;L;<square> 006E 0056;;;;N;SQUARED NV;;;; +33B6;SQUARE MU V;So;0;L;<square> 03BC 0056;;;;N;SQUARED MU V;;;; +33B7;SQUARE MV;So;0;L;<square> 006D 0056;;;;N;SQUARED MV;;;; +33B8;SQUARE KV;So;0;L;<square> 006B 0056;;;;N;SQUARED KV;;;; +33B9;SQUARE MV MEGA;So;0;L;<square> 004D 0056;;;;N;SQUARED MV MEGA;;;; +33BA;SQUARE PW;So;0;L;<square> 0070 0057;;;;N;SQUARED PW;;;; +33BB;SQUARE NW;So;0;L;<square> 006E 0057;;;;N;SQUARED NW;;;; +33BC;SQUARE MU W;So;0;L;<square> 03BC 0057;;;;N;SQUARED MU W;;;; +33BD;SQUARE MW;So;0;L;<square> 006D 0057;;;;N;SQUARED MW;;;; +33BE;SQUARE KW;So;0;L;<square> 006B 0057;;;;N;SQUARED KW;;;; +33BF;SQUARE MW MEGA;So;0;L;<square> 004D 0057;;;;N;SQUARED MW MEGA;;;; +33C0;SQUARE K OHM;So;0;L;<square> 006B 03A9;;;;N;SQUARED K OHM;;;; +33C1;SQUARE M OHM;So;0;L;<square> 004D 03A9;;;;N;SQUARED M OHM;;;; +33C2;SQUARE AM;So;0;L;<square> 0061 002E 006D 002E;;;;N;SQUARED AM;;;; +33C3;SQUARE BQ;So;0;L;<square> 0042 0071;;;;N;SQUARED BQ;;;; +33C4;SQUARE CC;So;0;L;<square> 0063 0063;;;;N;SQUARED CC;;;; +33C5;SQUARE CD;So;0;L;<square> 0063 0064;;;;N;SQUARED CD;;;; +33C6;SQUARE C OVER KG;So;0;L;<square> 0043 2215 006B 0067;;;;N;SQUARED C OVER KG;;;; +33C7;SQUARE CO;So;0;L;<square> 0043 006F 002E;;;;N;SQUARED CO;;;; +33C8;SQUARE DB;So;0;L;<square> 0064 0042;;;;N;SQUARED DB;;;; +33C9;SQUARE GY;So;0;L;<square> 0047 0079;;;;N;SQUARED GY;;;; +33CA;SQUARE HA;So;0;L;<square> 0068 0061;;;;N;SQUARED HA;;;; +33CB;SQUARE HP;So;0;L;<square> 0048 0050;;;;N;SQUARED HP;;;; +33CC;SQUARE IN;So;0;L;<square> 0069 006E;;;;N;SQUARED IN;;;; +33CD;SQUARE KK;So;0;L;<square> 004B 004B;;;;N;SQUARED KK;;;; +33CE;SQUARE KM CAPITAL;So;0;L;<square> 004B 004D;;;;N;SQUARED KM CAPITAL;;;; +33CF;SQUARE KT;So;0;L;<square> 006B 0074;;;;N;SQUARED KT;;;; +33D0;SQUARE LM;So;0;L;<square> 006C 006D;;;;N;SQUARED LM;;;; +33D1;SQUARE LN;So;0;L;<square> 006C 006E;;;;N;SQUARED LN;;;; +33D2;SQUARE LOG;So;0;L;<square> 006C 006F 0067;;;;N;SQUARED LOG;;;; +33D3;SQUARE LX;So;0;L;<square> 006C 0078;;;;N;SQUARED LX;;;; +33D4;SQUARE MB SMALL;So;0;L;<square> 006D 0062;;;;N;SQUARED MB SMALL;;;; +33D5;SQUARE MIL;So;0;L;<square> 006D 0069 006C;;;;N;SQUARED MIL;;;; +33D6;SQUARE MOL;So;0;L;<square> 006D 006F 006C;;;;N;SQUARED MOL;;;; +33D7;SQUARE PH;So;0;L;<square> 0050 0048;;;;N;SQUARED PH;;;; +33D8;SQUARE PM;So;0;L;<square> 0070 002E 006D 002E;;;;N;SQUARED PM;;;; +33D9;SQUARE PPM;So;0;L;<square> 0050 0050 004D;;;;N;SQUARED PPM;;;; +33DA;SQUARE PR;So;0;L;<square> 0050 0052;;;;N;SQUARED PR;;;; +33DB;SQUARE SR;So;0;L;<square> 0073 0072;;;;N;SQUARED SR;;;; +33DC;SQUARE SV;So;0;L;<square> 0053 0076;;;;N;SQUARED SV;;;; +33DD;SQUARE WB;So;0;L;<square> 0057 0062;;;;N;SQUARED WB;;;; +33DE;SQUARE V OVER M;So;0;ON;<square> 0056 2215 006D;;;;N;;;;; +33DF;SQUARE A OVER M;So;0;ON;<square> 0041 2215 006D;;;;N;;;;; +33E0;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ONE;So;0;L;<compat> 0031 65E5;;;;N;;;;; +33E1;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWO;So;0;L;<compat> 0032 65E5;;;;N;;;;; +33E2;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THREE;So;0;L;<compat> 0033 65E5;;;;N;;;;; +33E3;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOUR;So;0;L;<compat> 0034 65E5;;;;N;;;;; +33E4;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIVE;So;0;L;<compat> 0035 65E5;;;;N;;;;; +33E5;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIX;So;0;L;<compat> 0036 65E5;;;;N;;;;; +33E6;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVEN;So;0;L;<compat> 0037 65E5;;;;N;;;;; +33E7;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHT;So;0;L;<compat> 0038 65E5;;;;N;;;;; +33E8;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINE;So;0;L;<compat> 0039 65E5;;;;N;;;;; +33E9;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TEN;So;0;L;<compat> 0031 0030 65E5;;;;N;;;;; +33EA;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ELEVEN;So;0;L;<compat> 0031 0031 65E5;;;;N;;;;; +33EB;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWELVE;So;0;L;<compat> 0031 0032 65E5;;;;N;;;;; +33EC;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTEEN;So;0;L;<compat> 0031 0033 65E5;;;;N;;;;; +33ED;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOURTEEN;So;0;L;<compat> 0031 0034 65E5;;;;N;;;;; +33EE;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIFTEEN;So;0;L;<compat> 0031 0035 65E5;;;;N;;;;; +33EF;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIXTEEN;So;0;L;<compat> 0031 0036 65E5;;;;N;;;;; +33F0;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVENTEEN;So;0;L;<compat> 0031 0037 65E5;;;;N;;;;; +33F1;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHTEEN;So;0;L;<compat> 0031 0038 65E5;;;;N;;;;; +33F2;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINETEEN;So;0;L;<compat> 0031 0039 65E5;;;;N;;;;; +33F3;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY;So;0;L;<compat> 0032 0030 65E5;;;;N;;;;; +33F4;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-ONE;So;0;L;<compat> 0032 0031 65E5;;;;N;;;;; +33F5;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-TWO;So;0;L;<compat> 0032 0032 65E5;;;;N;;;;; +33F6;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-THREE;So;0;L;<compat> 0032 0033 65E5;;;;N;;;;; +33F7;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FOUR;So;0;L;<compat> 0032 0034 65E5;;;;N;;;;; +33F8;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FIVE;So;0;L;<compat> 0032 0035 65E5;;;;N;;;;; +33F9;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SIX;So;0;L;<compat> 0032 0036 65E5;;;;N;;;;; +33FA;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SEVEN;So;0;L;<compat> 0032 0037 65E5;;;;N;;;;; +33FB;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-EIGHT;So;0;L;<compat> 0032 0038 65E5;;;;N;;;;; +33FC;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-NINE;So;0;L;<compat> 0032 0039 65E5;;;;N;;;;; +33FD;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY;So;0;L;<compat> 0033 0030 65E5;;;;N;;;;; +33FE;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY-ONE;So;0;L;<compat> 0033 0031 65E5;;;;N;;;;; +33FF;SQUARE GAL;So;0;ON;<square> 0067 0061 006C;;;;N;;;;; +3400;<CJK Ideograph Extension A, First>;Lo;0;L;;;;;N;;;;; +4DB5;<CJK Ideograph Extension A, Last>;Lo;0;L;;;;;N;;;;; +4DC0;HEXAGRAM FOR THE CREATIVE HEAVEN;So;0;ON;;;;;N;;;;; +4DC1;HEXAGRAM FOR THE RECEPTIVE EARTH;So;0;ON;;;;;N;;;;; +4DC2;HEXAGRAM FOR DIFFICULTY AT THE BEGINNING;So;0;ON;;;;;N;;;;; +4DC3;HEXAGRAM FOR YOUTHFUL FOLLY;So;0;ON;;;;;N;;;;; +4DC4;HEXAGRAM FOR WAITING;So;0;ON;;;;;N;;;;; +4DC5;HEXAGRAM FOR CONFLICT;So;0;ON;;;;;N;;;;; +4DC6;HEXAGRAM FOR THE ARMY;So;0;ON;;;;;N;;;;; +4DC7;HEXAGRAM FOR HOLDING TOGETHER;So;0;ON;;;;;N;;;;; +4DC8;HEXAGRAM FOR SMALL TAMING;So;0;ON;;;;;N;;;;; +4DC9;HEXAGRAM FOR TREADING;So;0;ON;;;;;N;;;;; +4DCA;HEXAGRAM FOR PEACE;So;0;ON;;;;;N;;;;; +4DCB;HEXAGRAM FOR STANDSTILL;So;0;ON;;;;;N;;;;; +4DCC;HEXAGRAM FOR FELLOWSHIP;So;0;ON;;;;;N;;;;; +4DCD;HEXAGRAM FOR GREAT POSSESSION;So;0;ON;;;;;N;;;;; +4DCE;HEXAGRAM FOR MODESTY;So;0;ON;;;;;N;;;;; +4DCF;HEXAGRAM FOR ENTHUSIASM;So;0;ON;;;;;N;;;;; +4DD0;HEXAGRAM FOR FOLLOWING;So;0;ON;;;;;N;;;;; +4DD1;HEXAGRAM FOR WORK ON THE DECAYED;So;0;ON;;;;;N;;;;; +4DD2;HEXAGRAM FOR APPROACH;So;0;ON;;;;;N;;;;; +4DD3;HEXAGRAM FOR CONTEMPLATION;So;0;ON;;;;;N;;;;; +4DD4;HEXAGRAM FOR BITING THROUGH;So;0;ON;;;;;N;;;;; +4DD5;HEXAGRAM FOR GRACE;So;0;ON;;;;;N;;;;; +4DD6;HEXAGRAM FOR SPLITTING APART;So;0;ON;;;;;N;;;;; +4DD7;HEXAGRAM FOR RETURN;So;0;ON;;;;;N;;;;; +4DD8;HEXAGRAM FOR INNOCENCE;So;0;ON;;;;;N;;;;; +4DD9;HEXAGRAM FOR GREAT TAMING;So;0;ON;;;;;N;;;;; +4DDA;HEXAGRAM FOR MOUTH CORNERS;So;0;ON;;;;;N;;;;; +4DDB;HEXAGRAM FOR GREAT PREPONDERANCE;So;0;ON;;;;;N;;;;; +4DDC;HEXAGRAM FOR THE ABYSMAL WATER;So;0;ON;;;;;N;;;;; +4DDD;HEXAGRAM FOR THE CLINGING FIRE;So;0;ON;;;;;N;;;;; +4DDE;HEXAGRAM FOR INFLUENCE;So;0;ON;;;;;N;;;;; +4DDF;HEXAGRAM FOR DURATION;So;0;ON;;;;;N;;;;; +4DE0;HEXAGRAM FOR RETREAT;So;0;ON;;;;;N;;;;; +4DE1;HEXAGRAM FOR GREAT POWER;So;0;ON;;;;;N;;;;; +4DE2;HEXAGRAM FOR PROGRESS;So;0;ON;;;;;N;;;;; +4DE3;HEXAGRAM FOR DARKENING OF THE LIGHT;So;0;ON;;;;;N;;;;; +4DE4;HEXAGRAM FOR THE FAMILY;So;0;ON;;;;;N;;;;; +4DE5;HEXAGRAM FOR OPPOSITION;So;0;ON;;;;;N;;;;; +4DE6;HEXAGRAM FOR OBSTRUCTION;So;0;ON;;;;;N;;;;; +4DE7;HEXAGRAM FOR DELIVERANCE;So;0;ON;;;;;N;;;;; +4DE8;HEXAGRAM FOR DECREASE;So;0;ON;;;;;N;;;;; +4DE9;HEXAGRAM FOR INCREASE;So;0;ON;;;;;N;;;;; +4DEA;HEXAGRAM FOR BREAKTHROUGH;So;0;ON;;;;;N;;;;; +4DEB;HEXAGRAM FOR COMING TO MEET;So;0;ON;;;;;N;;;;; +4DEC;HEXAGRAM FOR GATHERING TOGETHER;So;0;ON;;;;;N;;;;; +4DED;HEXAGRAM FOR PUSHING UPWARD;So;0;ON;;;;;N;;;;; +4DEE;HEXAGRAM FOR OPPRESSION;So;0;ON;;;;;N;;;;; +4DEF;HEXAGRAM FOR THE WELL;So;0;ON;;;;;N;;;;; +4DF0;HEXAGRAM FOR REVOLUTION;So;0;ON;;;;;N;;;;; +4DF1;HEXAGRAM FOR THE CAULDRON;So;0;ON;;;;;N;;;;; +4DF2;HEXAGRAM FOR THE AROUSING THUNDER;So;0;ON;;;;;N;;;;; +4DF3;HEXAGRAM FOR THE KEEPING STILL MOUNTAIN;So;0;ON;;;;;N;;;;; +4DF4;HEXAGRAM FOR DEVELOPMENT;So;0;ON;;;;;N;;;;; +4DF5;HEXAGRAM FOR THE MARRYING MAIDEN;So;0;ON;;;;;N;;;;; +4DF6;HEXAGRAM FOR ABUNDANCE;So;0;ON;;;;;N;;;;; +4DF7;HEXAGRAM FOR THE WANDERER;So;0;ON;;;;;N;;;;; +4DF8;HEXAGRAM FOR THE GENTLE WIND;So;0;ON;;;;;N;;;;; +4DF9;HEXAGRAM FOR THE JOYOUS LAKE;So;0;ON;;;;;N;;;;; +4DFA;HEXAGRAM FOR DISPERSION;So;0;ON;;;;;N;;;;; +4DFB;HEXAGRAM FOR LIMITATION;So;0;ON;;;;;N;;;;; +4DFC;HEXAGRAM FOR INNER TRUTH;So;0;ON;;;;;N;;;;; +4DFD;HEXAGRAM FOR SMALL PREPONDERANCE;So;0;ON;;;;;N;;;;; +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;;;;; +9FEF;<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;;;;; +A003;YI SYLLABLE IP;Lo;0;L;;;;;N;;;;; +A004;YI SYLLABLE IET;Lo;0;L;;;;;N;;;;; +A005;YI SYLLABLE IEX;Lo;0;L;;;;;N;;;;; +A006;YI SYLLABLE IE;Lo;0;L;;;;;N;;;;; +A007;YI SYLLABLE IEP;Lo;0;L;;;;;N;;;;; +A008;YI SYLLABLE AT;Lo;0;L;;;;;N;;;;; +A009;YI SYLLABLE AX;Lo;0;L;;;;;N;;;;; +A00A;YI SYLLABLE A;Lo;0;L;;;;;N;;;;; +A00B;YI SYLLABLE AP;Lo;0;L;;;;;N;;;;; +A00C;YI SYLLABLE UOX;Lo;0;L;;;;;N;;;;; +A00D;YI SYLLABLE UO;Lo;0;L;;;;;N;;;;; +A00E;YI SYLLABLE UOP;Lo;0;L;;;;;N;;;;; +A00F;YI SYLLABLE OT;Lo;0;L;;;;;N;;;;; +A010;YI SYLLABLE OX;Lo;0;L;;;;;N;;;;; +A011;YI SYLLABLE O;Lo;0;L;;;;;N;;;;; +A012;YI SYLLABLE OP;Lo;0;L;;;;;N;;;;; +A013;YI SYLLABLE EX;Lo;0;L;;;;;N;;;;; +A014;YI SYLLABLE E;Lo;0;L;;;;;N;;;;; +A015;YI SYLLABLE WU;Lm;0;L;;;;;N;;;;; +A016;YI SYLLABLE BIT;Lo;0;L;;;;;N;;;;; +A017;YI SYLLABLE BIX;Lo;0;L;;;;;N;;;;; +A018;YI SYLLABLE BI;Lo;0;L;;;;;N;;;;; +A019;YI SYLLABLE BIP;Lo;0;L;;;;;N;;;;; +A01A;YI SYLLABLE BIET;Lo;0;L;;;;;N;;;;; +A01B;YI SYLLABLE BIEX;Lo;0;L;;;;;N;;;;; +A01C;YI SYLLABLE BIE;Lo;0;L;;;;;N;;;;; +A01D;YI SYLLABLE BIEP;Lo;0;L;;;;;N;;;;; +A01E;YI SYLLABLE BAT;Lo;0;L;;;;;N;;;;; +A01F;YI SYLLABLE BAX;Lo;0;L;;;;;N;;;;; +A020;YI SYLLABLE BA;Lo;0;L;;;;;N;;;;; +A021;YI SYLLABLE BAP;Lo;0;L;;;;;N;;;;; +A022;YI SYLLABLE BUOX;Lo;0;L;;;;;N;;;;; +A023;YI SYLLABLE BUO;Lo;0;L;;;;;N;;;;; +A024;YI SYLLABLE BUOP;Lo;0;L;;;;;N;;;;; +A025;YI SYLLABLE BOT;Lo;0;L;;;;;N;;;;; +A026;YI SYLLABLE BOX;Lo;0;L;;;;;N;;;;; +A027;YI SYLLABLE BO;Lo;0;L;;;;;N;;;;; +A028;YI SYLLABLE BOP;Lo;0;L;;;;;N;;;;; +A029;YI SYLLABLE BEX;Lo;0;L;;;;;N;;;;; +A02A;YI SYLLABLE BE;Lo;0;L;;;;;N;;;;; +A02B;YI SYLLABLE BEP;Lo;0;L;;;;;N;;;;; +A02C;YI SYLLABLE BUT;Lo;0;L;;;;;N;;;;; +A02D;YI SYLLABLE BUX;Lo;0;L;;;;;N;;;;; +A02E;YI SYLLABLE BU;Lo;0;L;;;;;N;;;;; +A02F;YI SYLLABLE BUP;Lo;0;L;;;;;N;;;;; +A030;YI SYLLABLE BURX;Lo;0;L;;;;;N;;;;; +A031;YI SYLLABLE BUR;Lo;0;L;;;;;N;;;;; +A032;YI SYLLABLE BYT;Lo;0;L;;;;;N;;;;; +A033;YI SYLLABLE BYX;Lo;0;L;;;;;N;;;;; +A034;YI SYLLABLE BY;Lo;0;L;;;;;N;;;;; +A035;YI SYLLABLE BYP;Lo;0;L;;;;;N;;;;; +A036;YI SYLLABLE BYRX;Lo;0;L;;;;;N;;;;; +A037;YI SYLLABLE BYR;Lo;0;L;;;;;N;;;;; +A038;YI SYLLABLE PIT;Lo;0;L;;;;;N;;;;; +A039;YI SYLLABLE PIX;Lo;0;L;;;;;N;;;;; +A03A;YI SYLLABLE PI;Lo;0;L;;;;;N;;;;; +A03B;YI SYLLABLE PIP;Lo;0;L;;;;;N;;;;; +A03C;YI SYLLABLE PIEX;Lo;0;L;;;;;N;;;;; +A03D;YI SYLLABLE PIE;Lo;0;L;;;;;N;;;;; +A03E;YI SYLLABLE PIEP;Lo;0;L;;;;;N;;;;; +A03F;YI SYLLABLE PAT;Lo;0;L;;;;;N;;;;; +A040;YI SYLLABLE PAX;Lo;0;L;;;;;N;;;;; +A041;YI SYLLABLE PA;Lo;0;L;;;;;N;;;;; +A042;YI SYLLABLE PAP;Lo;0;L;;;;;N;;;;; +A043;YI SYLLABLE PUOX;Lo;0;L;;;;;N;;;;; +A044;YI SYLLABLE PUO;Lo;0;L;;;;;N;;;;; +A045;YI SYLLABLE PUOP;Lo;0;L;;;;;N;;;;; +A046;YI SYLLABLE POT;Lo;0;L;;;;;N;;;;; +A047;YI SYLLABLE POX;Lo;0;L;;;;;N;;;;; +A048;YI SYLLABLE PO;Lo;0;L;;;;;N;;;;; +A049;YI SYLLABLE POP;Lo;0;L;;;;;N;;;;; +A04A;YI SYLLABLE PUT;Lo;0;L;;;;;N;;;;; +A04B;YI SYLLABLE PUX;Lo;0;L;;;;;N;;;;; +A04C;YI SYLLABLE PU;Lo;0;L;;;;;N;;;;; +A04D;YI SYLLABLE PUP;Lo;0;L;;;;;N;;;;; +A04E;YI SYLLABLE PURX;Lo;0;L;;;;;N;;;;; +A04F;YI SYLLABLE PUR;Lo;0;L;;;;;N;;;;; +A050;YI SYLLABLE PYT;Lo;0;L;;;;;N;;;;; +A051;YI SYLLABLE PYX;Lo;0;L;;;;;N;;;;; +A052;YI SYLLABLE PY;Lo;0;L;;;;;N;;;;; +A053;YI SYLLABLE PYP;Lo;0;L;;;;;N;;;;; +A054;YI SYLLABLE PYRX;Lo;0;L;;;;;N;;;;; +A055;YI SYLLABLE PYR;Lo;0;L;;;;;N;;;;; +A056;YI SYLLABLE BBIT;Lo;0;L;;;;;N;;;;; +A057;YI SYLLABLE BBIX;Lo;0;L;;;;;N;;;;; +A058;YI SYLLABLE BBI;Lo;0;L;;;;;N;;;;; +A059;YI SYLLABLE BBIP;Lo;0;L;;;;;N;;;;; +A05A;YI SYLLABLE BBIET;Lo;0;L;;;;;N;;;;; +A05B;YI SYLLABLE BBIEX;Lo;0;L;;;;;N;;;;; +A05C;YI SYLLABLE BBIE;Lo;0;L;;;;;N;;;;; +A05D;YI SYLLABLE BBIEP;Lo;0;L;;;;;N;;;;; +A05E;YI SYLLABLE BBAT;Lo;0;L;;;;;N;;;;; +A05F;YI SYLLABLE BBAX;Lo;0;L;;;;;N;;;;; +A060;YI SYLLABLE BBA;Lo;0;L;;;;;N;;;;; +A061;YI SYLLABLE BBAP;Lo;0;L;;;;;N;;;;; +A062;YI SYLLABLE BBUOX;Lo;0;L;;;;;N;;;;; +A063;YI SYLLABLE BBUO;Lo;0;L;;;;;N;;;;; +A064;YI SYLLABLE BBUOP;Lo;0;L;;;;;N;;;;; +A065;YI SYLLABLE BBOT;Lo;0;L;;;;;N;;;;; +A066;YI SYLLABLE BBOX;Lo;0;L;;;;;N;;;;; +A067;YI SYLLABLE BBO;Lo;0;L;;;;;N;;;;; +A068;YI SYLLABLE BBOP;Lo;0;L;;;;;N;;;;; +A069;YI SYLLABLE BBEX;Lo;0;L;;;;;N;;;;; +A06A;YI SYLLABLE BBE;Lo;0;L;;;;;N;;;;; +A06B;YI SYLLABLE BBEP;Lo;0;L;;;;;N;;;;; +A06C;YI SYLLABLE BBUT;Lo;0;L;;;;;N;;;;; +A06D;YI SYLLABLE BBUX;Lo;0;L;;;;;N;;;;; +A06E;YI SYLLABLE BBU;Lo;0;L;;;;;N;;;;; +A06F;YI SYLLABLE BBUP;Lo;0;L;;;;;N;;;;; +A070;YI SYLLABLE BBURX;Lo;0;L;;;;;N;;;;; +A071;YI SYLLABLE BBUR;Lo;0;L;;;;;N;;;;; +A072;YI SYLLABLE BBYT;Lo;0;L;;;;;N;;;;; +A073;YI SYLLABLE BBYX;Lo;0;L;;;;;N;;;;; +A074;YI SYLLABLE BBY;Lo;0;L;;;;;N;;;;; +A075;YI SYLLABLE BBYP;Lo;0;L;;;;;N;;;;; +A076;YI SYLLABLE NBIT;Lo;0;L;;;;;N;;;;; +A077;YI SYLLABLE NBIX;Lo;0;L;;;;;N;;;;; +A078;YI SYLLABLE NBI;Lo;0;L;;;;;N;;;;; +A079;YI SYLLABLE NBIP;Lo;0;L;;;;;N;;;;; +A07A;YI SYLLABLE NBIEX;Lo;0;L;;;;;N;;;;; +A07B;YI SYLLABLE NBIE;Lo;0;L;;;;;N;;;;; +A07C;YI SYLLABLE NBIEP;Lo;0;L;;;;;N;;;;; +A07D;YI SYLLABLE NBAT;Lo;0;L;;;;;N;;;;; +A07E;YI SYLLABLE NBAX;Lo;0;L;;;;;N;;;;; +A07F;YI SYLLABLE NBA;Lo;0;L;;;;;N;;;;; +A080;YI SYLLABLE NBAP;Lo;0;L;;;;;N;;;;; +A081;YI SYLLABLE NBOT;Lo;0;L;;;;;N;;;;; +A082;YI SYLLABLE NBOX;Lo;0;L;;;;;N;;;;; +A083;YI SYLLABLE NBO;Lo;0;L;;;;;N;;;;; +A084;YI SYLLABLE NBOP;Lo;0;L;;;;;N;;;;; +A085;YI SYLLABLE NBUT;Lo;0;L;;;;;N;;;;; +A086;YI SYLLABLE NBUX;Lo;0;L;;;;;N;;;;; +A087;YI SYLLABLE NBU;Lo;0;L;;;;;N;;;;; +A088;YI SYLLABLE NBUP;Lo;0;L;;;;;N;;;;; +A089;YI SYLLABLE NBURX;Lo;0;L;;;;;N;;;;; +A08A;YI SYLLABLE NBUR;Lo;0;L;;;;;N;;;;; +A08B;YI SYLLABLE NBYT;Lo;0;L;;;;;N;;;;; +A08C;YI SYLLABLE NBYX;Lo;0;L;;;;;N;;;;; +A08D;YI SYLLABLE NBY;Lo;0;L;;;;;N;;;;; +A08E;YI SYLLABLE NBYP;Lo;0;L;;;;;N;;;;; +A08F;YI SYLLABLE NBYRX;Lo;0;L;;;;;N;;;;; +A090;YI SYLLABLE NBYR;Lo;0;L;;;;;N;;;;; +A091;YI SYLLABLE HMIT;Lo;0;L;;;;;N;;;;; +A092;YI SYLLABLE HMIX;Lo;0;L;;;;;N;;;;; +A093;YI SYLLABLE HMI;Lo;0;L;;;;;N;;;;; +A094;YI SYLLABLE HMIP;Lo;0;L;;;;;N;;;;; +A095;YI SYLLABLE HMIEX;Lo;0;L;;;;;N;;;;; +A096;YI SYLLABLE HMIE;Lo;0;L;;;;;N;;;;; +A097;YI SYLLABLE HMIEP;Lo;0;L;;;;;N;;;;; +A098;YI SYLLABLE HMAT;Lo;0;L;;;;;N;;;;; +A099;YI SYLLABLE HMAX;Lo;0;L;;;;;N;;;;; +A09A;YI SYLLABLE HMA;Lo;0;L;;;;;N;;;;; +A09B;YI SYLLABLE HMAP;Lo;0;L;;;;;N;;;;; +A09C;YI SYLLABLE HMUOX;Lo;0;L;;;;;N;;;;; +A09D;YI SYLLABLE HMUO;Lo;0;L;;;;;N;;;;; +A09E;YI SYLLABLE HMUOP;Lo;0;L;;;;;N;;;;; +A09F;YI SYLLABLE HMOT;Lo;0;L;;;;;N;;;;; +A0A0;YI SYLLABLE HMOX;Lo;0;L;;;;;N;;;;; +A0A1;YI SYLLABLE HMO;Lo;0;L;;;;;N;;;;; +A0A2;YI SYLLABLE HMOP;Lo;0;L;;;;;N;;;;; +A0A3;YI SYLLABLE HMUT;Lo;0;L;;;;;N;;;;; +A0A4;YI SYLLABLE HMUX;Lo;0;L;;;;;N;;;;; +A0A5;YI SYLLABLE HMU;Lo;0;L;;;;;N;;;;; +A0A6;YI SYLLABLE HMUP;Lo;0;L;;;;;N;;;;; +A0A7;YI SYLLABLE HMURX;Lo;0;L;;;;;N;;;;; +A0A8;YI SYLLABLE HMUR;Lo;0;L;;;;;N;;;;; +A0A9;YI SYLLABLE HMYX;Lo;0;L;;;;;N;;;;; +A0AA;YI SYLLABLE HMY;Lo;0;L;;;;;N;;;;; +A0AB;YI SYLLABLE HMYP;Lo;0;L;;;;;N;;;;; +A0AC;YI SYLLABLE HMYRX;Lo;0;L;;;;;N;;;;; +A0AD;YI SYLLABLE HMYR;Lo;0;L;;;;;N;;;;; +A0AE;YI SYLLABLE MIT;Lo;0;L;;;;;N;;;;; +A0AF;YI SYLLABLE MIX;Lo;0;L;;;;;N;;;;; +A0B0;YI SYLLABLE MI;Lo;0;L;;;;;N;;;;; +A0B1;YI SYLLABLE MIP;Lo;0;L;;;;;N;;;;; +A0B2;YI SYLLABLE MIEX;Lo;0;L;;;;;N;;;;; +A0B3;YI SYLLABLE MIE;Lo;0;L;;;;;N;;;;; +A0B4;YI SYLLABLE MIEP;Lo;0;L;;;;;N;;;;; +A0B5;YI SYLLABLE MAT;Lo;0;L;;;;;N;;;;; +A0B6;YI SYLLABLE MAX;Lo;0;L;;;;;N;;;;; +A0B7;YI SYLLABLE MA;Lo;0;L;;;;;N;;;;; +A0B8;YI SYLLABLE MAP;Lo;0;L;;;;;N;;;;; +A0B9;YI SYLLABLE MUOT;Lo;0;L;;;;;N;;;;; +A0BA;YI SYLLABLE MUOX;Lo;0;L;;;;;N;;;;; +A0BB;YI SYLLABLE MUO;Lo;0;L;;;;;N;;;;; +A0BC;YI SYLLABLE MUOP;Lo;0;L;;;;;N;;;;; +A0BD;YI SYLLABLE MOT;Lo;0;L;;;;;N;;;;; +A0BE;YI SYLLABLE MOX;Lo;0;L;;;;;N;;;;; +A0BF;YI SYLLABLE MO;Lo;0;L;;;;;N;;;;; +A0C0;YI SYLLABLE MOP;Lo;0;L;;;;;N;;;;; +A0C1;YI SYLLABLE MEX;Lo;0;L;;;;;N;;;;; +A0C2;YI SYLLABLE ME;Lo;0;L;;;;;N;;;;; +A0C3;YI SYLLABLE MUT;Lo;0;L;;;;;N;;;;; +A0C4;YI SYLLABLE MUX;Lo;0;L;;;;;N;;;;; +A0C5;YI SYLLABLE MU;Lo;0;L;;;;;N;;;;; +A0C6;YI SYLLABLE MUP;Lo;0;L;;;;;N;;;;; +A0C7;YI SYLLABLE MURX;Lo;0;L;;;;;N;;;;; +A0C8;YI SYLLABLE MUR;Lo;0;L;;;;;N;;;;; +A0C9;YI SYLLABLE MYT;Lo;0;L;;;;;N;;;;; +A0CA;YI SYLLABLE MYX;Lo;0;L;;;;;N;;;;; +A0CB;YI SYLLABLE MY;Lo;0;L;;;;;N;;;;; +A0CC;YI SYLLABLE MYP;Lo;0;L;;;;;N;;;;; +A0CD;YI SYLLABLE FIT;Lo;0;L;;;;;N;;;;; +A0CE;YI SYLLABLE FIX;Lo;0;L;;;;;N;;;;; +A0CF;YI SYLLABLE FI;Lo;0;L;;;;;N;;;;; +A0D0;YI SYLLABLE FIP;Lo;0;L;;;;;N;;;;; +A0D1;YI SYLLABLE FAT;Lo;0;L;;;;;N;;;;; +A0D2;YI SYLLABLE FAX;Lo;0;L;;;;;N;;;;; +A0D3;YI SYLLABLE FA;Lo;0;L;;;;;N;;;;; +A0D4;YI SYLLABLE FAP;Lo;0;L;;;;;N;;;;; +A0D5;YI SYLLABLE FOX;Lo;0;L;;;;;N;;;;; +A0D6;YI SYLLABLE FO;Lo;0;L;;;;;N;;;;; +A0D7;YI SYLLABLE FOP;Lo;0;L;;;;;N;;;;; +A0D8;YI SYLLABLE FUT;Lo;0;L;;;;;N;;;;; +A0D9;YI SYLLABLE FUX;Lo;0;L;;;;;N;;;;; +A0DA;YI SYLLABLE FU;Lo;0;L;;;;;N;;;;; +A0DB;YI SYLLABLE FUP;Lo;0;L;;;;;N;;;;; +A0DC;YI SYLLABLE FURX;Lo;0;L;;;;;N;;;;; +A0DD;YI SYLLABLE FUR;Lo;0;L;;;;;N;;;;; +A0DE;YI SYLLABLE FYT;Lo;0;L;;;;;N;;;;; +A0DF;YI SYLLABLE FYX;Lo;0;L;;;;;N;;;;; +A0E0;YI SYLLABLE FY;Lo;0;L;;;;;N;;;;; +A0E1;YI SYLLABLE FYP;Lo;0;L;;;;;N;;;;; +A0E2;YI SYLLABLE VIT;Lo;0;L;;;;;N;;;;; +A0E3;YI SYLLABLE VIX;Lo;0;L;;;;;N;;;;; +A0E4;YI SYLLABLE VI;Lo;0;L;;;;;N;;;;; +A0E5;YI SYLLABLE VIP;Lo;0;L;;;;;N;;;;; +A0E6;YI SYLLABLE VIET;Lo;0;L;;;;;N;;;;; +A0E7;YI SYLLABLE VIEX;Lo;0;L;;;;;N;;;;; +A0E8;YI SYLLABLE VIE;Lo;0;L;;;;;N;;;;; +A0E9;YI SYLLABLE VIEP;Lo;0;L;;;;;N;;;;; +A0EA;YI SYLLABLE VAT;Lo;0;L;;;;;N;;;;; +A0EB;YI SYLLABLE VAX;Lo;0;L;;;;;N;;;;; +A0EC;YI SYLLABLE VA;Lo;0;L;;;;;N;;;;; +A0ED;YI SYLLABLE VAP;Lo;0;L;;;;;N;;;;; +A0EE;YI SYLLABLE VOT;Lo;0;L;;;;;N;;;;; +A0EF;YI SYLLABLE VOX;Lo;0;L;;;;;N;;;;; +A0F0;YI SYLLABLE VO;Lo;0;L;;;;;N;;;;; +A0F1;YI SYLLABLE VOP;Lo;0;L;;;;;N;;;;; +A0F2;YI SYLLABLE VEX;Lo;0;L;;;;;N;;;;; +A0F3;YI SYLLABLE VEP;Lo;0;L;;;;;N;;;;; +A0F4;YI SYLLABLE VUT;Lo;0;L;;;;;N;;;;; +A0F5;YI SYLLABLE VUX;Lo;0;L;;;;;N;;;;; +A0F6;YI SYLLABLE VU;Lo;0;L;;;;;N;;;;; +A0F7;YI SYLLABLE VUP;Lo;0;L;;;;;N;;;;; +A0F8;YI SYLLABLE VURX;Lo;0;L;;;;;N;;;;; +A0F9;YI SYLLABLE VUR;Lo;0;L;;;;;N;;;;; +A0FA;YI SYLLABLE VYT;Lo;0;L;;;;;N;;;;; +A0FB;YI SYLLABLE VYX;Lo;0;L;;;;;N;;;;; +A0FC;YI SYLLABLE VY;Lo;0;L;;;;;N;;;;; +A0FD;YI SYLLABLE VYP;Lo;0;L;;;;;N;;;;; +A0FE;YI SYLLABLE VYRX;Lo;0;L;;;;;N;;;;; +A0FF;YI SYLLABLE VYR;Lo;0;L;;;;;N;;;;; +A100;YI SYLLABLE DIT;Lo;0;L;;;;;N;;;;; +A101;YI SYLLABLE DIX;Lo;0;L;;;;;N;;;;; +A102;YI SYLLABLE DI;Lo;0;L;;;;;N;;;;; +A103;YI SYLLABLE DIP;Lo;0;L;;;;;N;;;;; +A104;YI SYLLABLE DIEX;Lo;0;L;;;;;N;;;;; +A105;YI SYLLABLE DIE;Lo;0;L;;;;;N;;;;; +A106;YI SYLLABLE DIEP;Lo;0;L;;;;;N;;;;; +A107;YI SYLLABLE DAT;Lo;0;L;;;;;N;;;;; +A108;YI SYLLABLE DAX;Lo;0;L;;;;;N;;;;; +A109;YI SYLLABLE DA;Lo;0;L;;;;;N;;;;; +A10A;YI SYLLABLE DAP;Lo;0;L;;;;;N;;;;; +A10B;YI SYLLABLE DUOX;Lo;0;L;;;;;N;;;;; +A10C;YI SYLLABLE DUO;Lo;0;L;;;;;N;;;;; +A10D;YI SYLLABLE DOT;Lo;0;L;;;;;N;;;;; +A10E;YI SYLLABLE DOX;Lo;0;L;;;;;N;;;;; +A10F;YI SYLLABLE DO;Lo;0;L;;;;;N;;;;; +A110;YI SYLLABLE DOP;Lo;0;L;;;;;N;;;;; +A111;YI SYLLABLE DEX;Lo;0;L;;;;;N;;;;; +A112;YI SYLLABLE DE;Lo;0;L;;;;;N;;;;; +A113;YI SYLLABLE DEP;Lo;0;L;;;;;N;;;;; +A114;YI SYLLABLE DUT;Lo;0;L;;;;;N;;;;; +A115;YI SYLLABLE DUX;Lo;0;L;;;;;N;;;;; +A116;YI SYLLABLE DU;Lo;0;L;;;;;N;;;;; +A117;YI SYLLABLE DUP;Lo;0;L;;;;;N;;;;; +A118;YI SYLLABLE DURX;Lo;0;L;;;;;N;;;;; +A119;YI SYLLABLE DUR;Lo;0;L;;;;;N;;;;; +A11A;YI SYLLABLE TIT;Lo;0;L;;;;;N;;;;; +A11B;YI SYLLABLE TIX;Lo;0;L;;;;;N;;;;; +A11C;YI SYLLABLE TI;Lo;0;L;;;;;N;;;;; +A11D;YI SYLLABLE TIP;Lo;0;L;;;;;N;;;;; +A11E;YI SYLLABLE TIEX;Lo;0;L;;;;;N;;;;; +A11F;YI SYLLABLE TIE;Lo;0;L;;;;;N;;;;; +A120;YI SYLLABLE TIEP;Lo;0;L;;;;;N;;;;; +A121;YI SYLLABLE TAT;Lo;0;L;;;;;N;;;;; +A122;YI SYLLABLE TAX;Lo;0;L;;;;;N;;;;; +A123;YI SYLLABLE TA;Lo;0;L;;;;;N;;;;; +A124;YI SYLLABLE TAP;Lo;0;L;;;;;N;;;;; +A125;YI SYLLABLE TUOT;Lo;0;L;;;;;N;;;;; +A126;YI SYLLABLE TUOX;Lo;0;L;;;;;N;;;;; +A127;YI SYLLABLE TUO;Lo;0;L;;;;;N;;;;; +A128;YI SYLLABLE TUOP;Lo;0;L;;;;;N;;;;; +A129;YI SYLLABLE TOT;Lo;0;L;;;;;N;;;;; +A12A;YI SYLLABLE TOX;Lo;0;L;;;;;N;;;;; +A12B;YI SYLLABLE TO;Lo;0;L;;;;;N;;;;; +A12C;YI SYLLABLE TOP;Lo;0;L;;;;;N;;;;; +A12D;YI SYLLABLE TEX;Lo;0;L;;;;;N;;;;; +A12E;YI SYLLABLE TE;Lo;0;L;;;;;N;;;;; +A12F;YI SYLLABLE TEP;Lo;0;L;;;;;N;;;;; +A130;YI SYLLABLE TUT;Lo;0;L;;;;;N;;;;; +A131;YI SYLLABLE TUX;Lo;0;L;;;;;N;;;;; +A132;YI SYLLABLE TU;Lo;0;L;;;;;N;;;;; +A133;YI SYLLABLE TUP;Lo;0;L;;;;;N;;;;; +A134;YI SYLLABLE TURX;Lo;0;L;;;;;N;;;;; +A135;YI SYLLABLE TUR;Lo;0;L;;;;;N;;;;; +A136;YI SYLLABLE DDIT;Lo;0;L;;;;;N;;;;; +A137;YI SYLLABLE DDIX;Lo;0;L;;;;;N;;;;; +A138;YI SYLLABLE DDI;Lo;0;L;;;;;N;;;;; +A139;YI SYLLABLE DDIP;Lo;0;L;;;;;N;;;;; +A13A;YI SYLLABLE DDIEX;Lo;0;L;;;;;N;;;;; +A13B;YI SYLLABLE DDIE;Lo;0;L;;;;;N;;;;; +A13C;YI SYLLABLE DDIEP;Lo;0;L;;;;;N;;;;; +A13D;YI SYLLABLE DDAT;Lo;0;L;;;;;N;;;;; +A13E;YI SYLLABLE DDAX;Lo;0;L;;;;;N;;;;; +A13F;YI SYLLABLE DDA;Lo;0;L;;;;;N;;;;; +A140;YI SYLLABLE DDAP;Lo;0;L;;;;;N;;;;; +A141;YI SYLLABLE DDUOX;Lo;0;L;;;;;N;;;;; +A142;YI SYLLABLE DDUO;Lo;0;L;;;;;N;;;;; +A143;YI SYLLABLE DDUOP;Lo;0;L;;;;;N;;;;; +A144;YI SYLLABLE DDOT;Lo;0;L;;;;;N;;;;; +A145;YI SYLLABLE DDOX;Lo;0;L;;;;;N;;;;; +A146;YI SYLLABLE DDO;Lo;0;L;;;;;N;;;;; +A147;YI SYLLABLE DDOP;Lo;0;L;;;;;N;;;;; +A148;YI SYLLABLE DDEX;Lo;0;L;;;;;N;;;;; +A149;YI SYLLABLE DDE;Lo;0;L;;;;;N;;;;; +A14A;YI SYLLABLE DDEP;Lo;0;L;;;;;N;;;;; +A14B;YI SYLLABLE DDUT;Lo;0;L;;;;;N;;;;; +A14C;YI SYLLABLE DDUX;Lo;0;L;;;;;N;;;;; +A14D;YI SYLLABLE DDU;Lo;0;L;;;;;N;;;;; +A14E;YI SYLLABLE DDUP;Lo;0;L;;;;;N;;;;; +A14F;YI SYLLABLE DDURX;Lo;0;L;;;;;N;;;;; +A150;YI SYLLABLE DDUR;Lo;0;L;;;;;N;;;;; +A151;YI SYLLABLE NDIT;Lo;0;L;;;;;N;;;;; +A152;YI SYLLABLE NDIX;Lo;0;L;;;;;N;;;;; +A153;YI SYLLABLE NDI;Lo;0;L;;;;;N;;;;; +A154;YI SYLLABLE NDIP;Lo;0;L;;;;;N;;;;; +A155;YI SYLLABLE NDIEX;Lo;0;L;;;;;N;;;;; +A156;YI SYLLABLE NDIE;Lo;0;L;;;;;N;;;;; +A157;YI SYLLABLE NDAT;Lo;0;L;;;;;N;;;;; +A158;YI SYLLABLE NDAX;Lo;0;L;;;;;N;;;;; +A159;YI SYLLABLE NDA;Lo;0;L;;;;;N;;;;; +A15A;YI SYLLABLE NDAP;Lo;0;L;;;;;N;;;;; +A15B;YI SYLLABLE NDOT;Lo;0;L;;;;;N;;;;; +A15C;YI SYLLABLE NDOX;Lo;0;L;;;;;N;;;;; +A15D;YI SYLLABLE NDO;Lo;0;L;;;;;N;;;;; +A15E;YI SYLLABLE NDOP;Lo;0;L;;;;;N;;;;; +A15F;YI SYLLABLE NDEX;Lo;0;L;;;;;N;;;;; +A160;YI SYLLABLE NDE;Lo;0;L;;;;;N;;;;; +A161;YI SYLLABLE NDEP;Lo;0;L;;;;;N;;;;; +A162;YI SYLLABLE NDUT;Lo;0;L;;;;;N;;;;; +A163;YI SYLLABLE NDUX;Lo;0;L;;;;;N;;;;; +A164;YI SYLLABLE NDU;Lo;0;L;;;;;N;;;;; +A165;YI SYLLABLE NDUP;Lo;0;L;;;;;N;;;;; +A166;YI SYLLABLE NDURX;Lo;0;L;;;;;N;;;;; +A167;YI SYLLABLE NDUR;Lo;0;L;;;;;N;;;;; +A168;YI SYLLABLE HNIT;Lo;0;L;;;;;N;;;;; +A169;YI SYLLABLE HNIX;Lo;0;L;;;;;N;;;;; +A16A;YI SYLLABLE HNI;Lo;0;L;;;;;N;;;;; +A16B;YI SYLLABLE HNIP;Lo;0;L;;;;;N;;;;; +A16C;YI SYLLABLE HNIET;Lo;0;L;;;;;N;;;;; +A16D;YI SYLLABLE HNIEX;Lo;0;L;;;;;N;;;;; +A16E;YI SYLLABLE HNIE;Lo;0;L;;;;;N;;;;; +A16F;YI SYLLABLE HNIEP;Lo;0;L;;;;;N;;;;; +A170;YI SYLLABLE HNAT;Lo;0;L;;;;;N;;;;; +A171;YI SYLLABLE HNAX;Lo;0;L;;;;;N;;;;; +A172;YI SYLLABLE HNA;Lo;0;L;;;;;N;;;;; +A173;YI SYLLABLE HNAP;Lo;0;L;;;;;N;;;;; +A174;YI SYLLABLE HNUOX;Lo;0;L;;;;;N;;;;; +A175;YI SYLLABLE HNUO;Lo;0;L;;;;;N;;;;; +A176;YI SYLLABLE HNOT;Lo;0;L;;;;;N;;;;; +A177;YI SYLLABLE HNOX;Lo;0;L;;;;;N;;;;; +A178;YI SYLLABLE HNOP;Lo;0;L;;;;;N;;;;; +A179;YI SYLLABLE HNEX;Lo;0;L;;;;;N;;;;; +A17A;YI SYLLABLE HNE;Lo;0;L;;;;;N;;;;; +A17B;YI SYLLABLE HNEP;Lo;0;L;;;;;N;;;;; +A17C;YI SYLLABLE HNUT;Lo;0;L;;;;;N;;;;; +A17D;YI SYLLABLE NIT;Lo;0;L;;;;;N;;;;; +A17E;YI SYLLABLE NIX;Lo;0;L;;;;;N;;;;; +A17F;YI SYLLABLE NI;Lo;0;L;;;;;N;;;;; +A180;YI SYLLABLE NIP;Lo;0;L;;;;;N;;;;; +A181;YI SYLLABLE NIEX;Lo;0;L;;;;;N;;;;; +A182;YI SYLLABLE NIE;Lo;0;L;;;;;N;;;;; +A183;YI SYLLABLE NIEP;Lo;0;L;;;;;N;;;;; +A184;YI SYLLABLE NAX;Lo;0;L;;;;;N;;;;; +A185;YI SYLLABLE NA;Lo;0;L;;;;;N;;;;; +A186;YI SYLLABLE NAP;Lo;0;L;;;;;N;;;;; +A187;YI SYLLABLE NUOX;Lo;0;L;;;;;N;;;;; +A188;YI SYLLABLE NUO;Lo;0;L;;;;;N;;;;; +A189;YI SYLLABLE NUOP;Lo;0;L;;;;;N;;;;; +A18A;YI SYLLABLE NOT;Lo;0;L;;;;;N;;;;; +A18B;YI SYLLABLE NOX;Lo;0;L;;;;;N;;;;; +A18C;YI SYLLABLE NO;Lo;0;L;;;;;N;;;;; +A18D;YI SYLLABLE NOP;Lo;0;L;;;;;N;;;;; +A18E;YI SYLLABLE NEX;Lo;0;L;;;;;N;;;;; +A18F;YI SYLLABLE NE;Lo;0;L;;;;;N;;;;; +A190;YI SYLLABLE NEP;Lo;0;L;;;;;N;;;;; +A191;YI SYLLABLE NUT;Lo;0;L;;;;;N;;;;; +A192;YI SYLLABLE NUX;Lo;0;L;;;;;N;;;;; +A193;YI SYLLABLE NU;Lo;0;L;;;;;N;;;;; +A194;YI SYLLABLE NUP;Lo;0;L;;;;;N;;;;; +A195;YI SYLLABLE NURX;Lo;0;L;;;;;N;;;;; +A196;YI SYLLABLE NUR;Lo;0;L;;;;;N;;;;; +A197;YI SYLLABLE HLIT;Lo;0;L;;;;;N;;;;; +A198;YI SYLLABLE HLIX;Lo;0;L;;;;;N;;;;; +A199;YI SYLLABLE HLI;Lo;0;L;;;;;N;;;;; +A19A;YI SYLLABLE HLIP;Lo;0;L;;;;;N;;;;; +A19B;YI SYLLABLE HLIEX;Lo;0;L;;;;;N;;;;; +A19C;YI SYLLABLE HLIE;Lo;0;L;;;;;N;;;;; +A19D;YI SYLLABLE HLIEP;Lo;0;L;;;;;N;;;;; +A19E;YI SYLLABLE HLAT;Lo;0;L;;;;;N;;;;; +A19F;YI SYLLABLE HLAX;Lo;0;L;;;;;N;;;;; +A1A0;YI SYLLABLE HLA;Lo;0;L;;;;;N;;;;; +A1A1;YI SYLLABLE HLAP;Lo;0;L;;;;;N;;;;; +A1A2;YI SYLLABLE HLUOX;Lo;0;L;;;;;N;;;;; +A1A3;YI SYLLABLE HLUO;Lo;0;L;;;;;N;;;;; +A1A4;YI SYLLABLE HLUOP;Lo;0;L;;;;;N;;;;; +A1A5;YI SYLLABLE HLOX;Lo;0;L;;;;;N;;;;; +A1A6;YI SYLLABLE HLO;Lo;0;L;;;;;N;;;;; +A1A7;YI SYLLABLE HLOP;Lo;0;L;;;;;N;;;;; +A1A8;YI SYLLABLE HLEX;Lo;0;L;;;;;N;;;;; +A1A9;YI SYLLABLE HLE;Lo;0;L;;;;;N;;;;; +A1AA;YI SYLLABLE HLEP;Lo;0;L;;;;;N;;;;; +A1AB;YI SYLLABLE HLUT;Lo;0;L;;;;;N;;;;; +A1AC;YI SYLLABLE HLUX;Lo;0;L;;;;;N;;;;; +A1AD;YI SYLLABLE HLU;Lo;0;L;;;;;N;;;;; +A1AE;YI SYLLABLE HLUP;Lo;0;L;;;;;N;;;;; +A1AF;YI SYLLABLE HLURX;Lo;0;L;;;;;N;;;;; +A1B0;YI SYLLABLE HLUR;Lo;0;L;;;;;N;;;;; +A1B1;YI SYLLABLE HLYT;Lo;0;L;;;;;N;;;;; +A1B2;YI SYLLABLE HLYX;Lo;0;L;;;;;N;;;;; +A1B3;YI SYLLABLE HLY;Lo;0;L;;;;;N;;;;; +A1B4;YI SYLLABLE HLYP;Lo;0;L;;;;;N;;;;; +A1B5;YI SYLLABLE HLYRX;Lo;0;L;;;;;N;;;;; +A1B6;YI SYLLABLE HLYR;Lo;0;L;;;;;N;;;;; +A1B7;YI SYLLABLE LIT;Lo;0;L;;;;;N;;;;; +A1B8;YI SYLLABLE LIX;Lo;0;L;;;;;N;;;;; +A1B9;YI SYLLABLE LI;Lo;0;L;;;;;N;;;;; +A1BA;YI SYLLABLE LIP;Lo;0;L;;;;;N;;;;; +A1BB;YI SYLLABLE LIET;Lo;0;L;;;;;N;;;;; +A1BC;YI SYLLABLE LIEX;Lo;0;L;;;;;N;;;;; +A1BD;YI SYLLABLE LIE;Lo;0;L;;;;;N;;;;; +A1BE;YI SYLLABLE LIEP;Lo;0;L;;;;;N;;;;; +A1BF;YI SYLLABLE LAT;Lo;0;L;;;;;N;;;;; +A1C0;YI SYLLABLE LAX;Lo;0;L;;;;;N;;;;; +A1C1;YI SYLLABLE LA;Lo;0;L;;;;;N;;;;; +A1C2;YI SYLLABLE LAP;Lo;0;L;;;;;N;;;;; +A1C3;YI SYLLABLE LUOT;Lo;0;L;;;;;N;;;;; +A1C4;YI SYLLABLE LUOX;Lo;0;L;;;;;N;;;;; +A1C5;YI SYLLABLE LUO;Lo;0;L;;;;;N;;;;; +A1C6;YI SYLLABLE LUOP;Lo;0;L;;;;;N;;;;; +A1C7;YI SYLLABLE LOT;Lo;0;L;;;;;N;;;;; +A1C8;YI SYLLABLE LOX;Lo;0;L;;;;;N;;;;; +A1C9;YI SYLLABLE LO;Lo;0;L;;;;;N;;;;; +A1CA;YI SYLLABLE LOP;Lo;0;L;;;;;N;;;;; +A1CB;YI SYLLABLE LEX;Lo;0;L;;;;;N;;;;; +A1CC;YI SYLLABLE LE;Lo;0;L;;;;;N;;;;; +A1CD;YI SYLLABLE LEP;Lo;0;L;;;;;N;;;;; +A1CE;YI SYLLABLE LUT;Lo;0;L;;;;;N;;;;; +A1CF;YI SYLLABLE LUX;Lo;0;L;;;;;N;;;;; +A1D0;YI SYLLABLE LU;Lo;0;L;;;;;N;;;;; +A1D1;YI SYLLABLE LUP;Lo;0;L;;;;;N;;;;; +A1D2;YI SYLLABLE LURX;Lo;0;L;;;;;N;;;;; +A1D3;YI SYLLABLE LUR;Lo;0;L;;;;;N;;;;; +A1D4;YI SYLLABLE LYT;Lo;0;L;;;;;N;;;;; +A1D5;YI SYLLABLE LYX;Lo;0;L;;;;;N;;;;; +A1D6;YI SYLLABLE LY;Lo;0;L;;;;;N;;;;; +A1D7;YI SYLLABLE LYP;Lo;0;L;;;;;N;;;;; +A1D8;YI SYLLABLE LYRX;Lo;0;L;;;;;N;;;;; +A1D9;YI SYLLABLE LYR;Lo;0;L;;;;;N;;;;; +A1DA;YI SYLLABLE GIT;Lo;0;L;;;;;N;;;;; +A1DB;YI SYLLABLE GIX;Lo;0;L;;;;;N;;;;; +A1DC;YI SYLLABLE GI;Lo;0;L;;;;;N;;;;; +A1DD;YI SYLLABLE GIP;Lo;0;L;;;;;N;;;;; +A1DE;YI SYLLABLE GIET;Lo;0;L;;;;;N;;;;; +A1DF;YI SYLLABLE GIEX;Lo;0;L;;;;;N;;;;; +A1E0;YI SYLLABLE GIE;Lo;0;L;;;;;N;;;;; +A1E1;YI SYLLABLE GIEP;Lo;0;L;;;;;N;;;;; +A1E2;YI SYLLABLE GAT;Lo;0;L;;;;;N;;;;; +A1E3;YI SYLLABLE GAX;Lo;0;L;;;;;N;;;;; +A1E4;YI SYLLABLE GA;Lo;0;L;;;;;N;;;;; +A1E5;YI SYLLABLE GAP;Lo;0;L;;;;;N;;;;; +A1E6;YI SYLLABLE GUOT;Lo;0;L;;;;;N;;;;; +A1E7;YI SYLLABLE GUOX;Lo;0;L;;;;;N;;;;; +A1E8;YI SYLLABLE GUO;Lo;0;L;;;;;N;;;;; +A1E9;YI SYLLABLE GUOP;Lo;0;L;;;;;N;;;;; +A1EA;YI SYLLABLE GOT;Lo;0;L;;;;;N;;;;; +A1EB;YI SYLLABLE GOX;Lo;0;L;;;;;N;;;;; +A1EC;YI SYLLABLE GO;Lo;0;L;;;;;N;;;;; +A1ED;YI SYLLABLE GOP;Lo;0;L;;;;;N;;;;; +A1EE;YI SYLLABLE GET;Lo;0;L;;;;;N;;;;; +A1EF;YI SYLLABLE GEX;Lo;0;L;;;;;N;;;;; +A1F0;YI SYLLABLE GE;Lo;0;L;;;;;N;;;;; +A1F1;YI SYLLABLE GEP;Lo;0;L;;;;;N;;;;; +A1F2;YI SYLLABLE GUT;Lo;0;L;;;;;N;;;;; +A1F3;YI SYLLABLE GUX;Lo;0;L;;;;;N;;;;; +A1F4;YI SYLLABLE GU;Lo;0;L;;;;;N;;;;; +A1F5;YI SYLLABLE GUP;Lo;0;L;;;;;N;;;;; +A1F6;YI SYLLABLE GURX;Lo;0;L;;;;;N;;;;; +A1F7;YI SYLLABLE GUR;Lo;0;L;;;;;N;;;;; +A1F8;YI SYLLABLE KIT;Lo;0;L;;;;;N;;;;; +A1F9;YI SYLLABLE KIX;Lo;0;L;;;;;N;;;;; +A1FA;YI SYLLABLE KI;Lo;0;L;;;;;N;;;;; +A1FB;YI SYLLABLE KIP;Lo;0;L;;;;;N;;;;; +A1FC;YI SYLLABLE KIEX;Lo;0;L;;;;;N;;;;; +A1FD;YI SYLLABLE KIE;Lo;0;L;;;;;N;;;;; +A1FE;YI SYLLABLE KIEP;Lo;0;L;;;;;N;;;;; +A1FF;YI SYLLABLE KAT;Lo;0;L;;;;;N;;;;; +A200;YI SYLLABLE KAX;Lo;0;L;;;;;N;;;;; +A201;YI SYLLABLE KA;Lo;0;L;;;;;N;;;;; +A202;YI SYLLABLE KAP;Lo;0;L;;;;;N;;;;; +A203;YI SYLLABLE KUOX;Lo;0;L;;;;;N;;;;; +A204;YI SYLLABLE KUO;Lo;0;L;;;;;N;;;;; +A205;YI SYLLABLE KUOP;Lo;0;L;;;;;N;;;;; +A206;YI SYLLABLE KOT;Lo;0;L;;;;;N;;;;; +A207;YI SYLLABLE KOX;Lo;0;L;;;;;N;;;;; +A208;YI SYLLABLE KO;Lo;0;L;;;;;N;;;;; +A209;YI SYLLABLE KOP;Lo;0;L;;;;;N;;;;; +A20A;YI SYLLABLE KET;Lo;0;L;;;;;N;;;;; +A20B;YI SYLLABLE KEX;Lo;0;L;;;;;N;;;;; +A20C;YI SYLLABLE KE;Lo;0;L;;;;;N;;;;; +A20D;YI SYLLABLE KEP;Lo;0;L;;;;;N;;;;; +A20E;YI SYLLABLE KUT;Lo;0;L;;;;;N;;;;; +A20F;YI SYLLABLE KUX;Lo;0;L;;;;;N;;;;; +A210;YI SYLLABLE KU;Lo;0;L;;;;;N;;;;; +A211;YI SYLLABLE KUP;Lo;0;L;;;;;N;;;;; +A212;YI SYLLABLE KURX;Lo;0;L;;;;;N;;;;; +A213;YI SYLLABLE KUR;Lo;0;L;;;;;N;;;;; +A214;YI SYLLABLE GGIT;Lo;0;L;;;;;N;;;;; +A215;YI SYLLABLE GGIX;Lo;0;L;;;;;N;;;;; +A216;YI SYLLABLE GGI;Lo;0;L;;;;;N;;;;; +A217;YI SYLLABLE GGIEX;Lo;0;L;;;;;N;;;;; +A218;YI SYLLABLE GGIE;Lo;0;L;;;;;N;;;;; +A219;YI SYLLABLE GGIEP;Lo;0;L;;;;;N;;;;; +A21A;YI SYLLABLE GGAT;Lo;0;L;;;;;N;;;;; +A21B;YI SYLLABLE GGAX;Lo;0;L;;;;;N;;;;; +A21C;YI SYLLABLE GGA;Lo;0;L;;;;;N;;;;; +A21D;YI SYLLABLE GGAP;Lo;0;L;;;;;N;;;;; +A21E;YI SYLLABLE GGUOT;Lo;0;L;;;;;N;;;;; +A21F;YI SYLLABLE GGUOX;Lo;0;L;;;;;N;;;;; +A220;YI SYLLABLE GGUO;Lo;0;L;;;;;N;;;;; +A221;YI SYLLABLE GGUOP;Lo;0;L;;;;;N;;;;; +A222;YI SYLLABLE GGOT;Lo;0;L;;;;;N;;;;; +A223;YI SYLLABLE GGOX;Lo;0;L;;;;;N;;;;; +A224;YI SYLLABLE GGO;Lo;0;L;;;;;N;;;;; +A225;YI SYLLABLE GGOP;Lo;0;L;;;;;N;;;;; +A226;YI SYLLABLE GGET;Lo;0;L;;;;;N;;;;; +A227;YI SYLLABLE GGEX;Lo;0;L;;;;;N;;;;; +A228;YI SYLLABLE GGE;Lo;0;L;;;;;N;;;;; +A229;YI SYLLABLE GGEP;Lo;0;L;;;;;N;;;;; +A22A;YI SYLLABLE GGUT;Lo;0;L;;;;;N;;;;; +A22B;YI SYLLABLE GGUX;Lo;0;L;;;;;N;;;;; +A22C;YI SYLLABLE GGU;Lo;0;L;;;;;N;;;;; +A22D;YI SYLLABLE GGUP;Lo;0;L;;;;;N;;;;; +A22E;YI SYLLABLE GGURX;Lo;0;L;;;;;N;;;;; +A22F;YI SYLLABLE GGUR;Lo;0;L;;;;;N;;;;; +A230;YI SYLLABLE MGIEX;Lo;0;L;;;;;N;;;;; +A231;YI SYLLABLE MGIE;Lo;0;L;;;;;N;;;;; +A232;YI SYLLABLE MGAT;Lo;0;L;;;;;N;;;;; +A233;YI SYLLABLE MGAX;Lo;0;L;;;;;N;;;;; +A234;YI SYLLABLE MGA;Lo;0;L;;;;;N;;;;; +A235;YI SYLLABLE MGAP;Lo;0;L;;;;;N;;;;; +A236;YI SYLLABLE MGUOX;Lo;0;L;;;;;N;;;;; +A237;YI SYLLABLE MGUO;Lo;0;L;;;;;N;;;;; +A238;YI SYLLABLE MGUOP;Lo;0;L;;;;;N;;;;; +A239;YI SYLLABLE MGOT;Lo;0;L;;;;;N;;;;; +A23A;YI SYLLABLE MGOX;Lo;0;L;;;;;N;;;;; +A23B;YI SYLLABLE MGO;Lo;0;L;;;;;N;;;;; +A23C;YI SYLLABLE MGOP;Lo;0;L;;;;;N;;;;; +A23D;YI SYLLABLE MGEX;Lo;0;L;;;;;N;;;;; +A23E;YI SYLLABLE MGE;Lo;0;L;;;;;N;;;;; +A23F;YI SYLLABLE MGEP;Lo;0;L;;;;;N;;;;; +A240;YI SYLLABLE MGUT;Lo;0;L;;;;;N;;;;; +A241;YI SYLLABLE MGUX;Lo;0;L;;;;;N;;;;; +A242;YI SYLLABLE MGU;Lo;0;L;;;;;N;;;;; +A243;YI SYLLABLE MGUP;Lo;0;L;;;;;N;;;;; +A244;YI SYLLABLE MGURX;Lo;0;L;;;;;N;;;;; +A245;YI SYLLABLE MGUR;Lo;0;L;;;;;N;;;;; +A246;YI SYLLABLE HXIT;Lo;0;L;;;;;N;;;;; +A247;YI SYLLABLE HXIX;Lo;0;L;;;;;N;;;;; +A248;YI SYLLABLE HXI;Lo;0;L;;;;;N;;;;; +A249;YI SYLLABLE HXIP;Lo;0;L;;;;;N;;;;; +A24A;YI SYLLABLE HXIET;Lo;0;L;;;;;N;;;;; +A24B;YI SYLLABLE HXIEX;Lo;0;L;;;;;N;;;;; +A24C;YI SYLLABLE HXIE;Lo;0;L;;;;;N;;;;; +A24D;YI SYLLABLE HXIEP;Lo;0;L;;;;;N;;;;; +A24E;YI SYLLABLE HXAT;Lo;0;L;;;;;N;;;;; +A24F;YI SYLLABLE HXAX;Lo;0;L;;;;;N;;;;; +A250;YI SYLLABLE HXA;Lo;0;L;;;;;N;;;;; +A251;YI SYLLABLE HXAP;Lo;0;L;;;;;N;;;;; +A252;YI SYLLABLE HXUOT;Lo;0;L;;;;;N;;;;; +A253;YI SYLLABLE HXUOX;Lo;0;L;;;;;N;;;;; +A254;YI SYLLABLE HXUO;Lo;0;L;;;;;N;;;;; +A255;YI SYLLABLE HXUOP;Lo;0;L;;;;;N;;;;; +A256;YI SYLLABLE HXOT;Lo;0;L;;;;;N;;;;; +A257;YI SYLLABLE HXOX;Lo;0;L;;;;;N;;;;; +A258;YI SYLLABLE HXO;Lo;0;L;;;;;N;;;;; +A259;YI SYLLABLE HXOP;Lo;0;L;;;;;N;;;;; +A25A;YI SYLLABLE HXEX;Lo;0;L;;;;;N;;;;; +A25B;YI SYLLABLE HXE;Lo;0;L;;;;;N;;;;; +A25C;YI SYLLABLE HXEP;Lo;0;L;;;;;N;;;;; +A25D;YI SYLLABLE NGIEX;Lo;0;L;;;;;N;;;;; +A25E;YI SYLLABLE NGIE;Lo;0;L;;;;;N;;;;; +A25F;YI SYLLABLE NGIEP;Lo;0;L;;;;;N;;;;; +A260;YI SYLLABLE NGAT;Lo;0;L;;;;;N;;;;; +A261;YI SYLLABLE NGAX;Lo;0;L;;;;;N;;;;; +A262;YI SYLLABLE NGA;Lo;0;L;;;;;N;;;;; +A263;YI SYLLABLE NGAP;Lo;0;L;;;;;N;;;;; +A264;YI SYLLABLE NGUOT;Lo;0;L;;;;;N;;;;; +A265;YI SYLLABLE NGUOX;Lo;0;L;;;;;N;;;;; +A266;YI SYLLABLE NGUO;Lo;0;L;;;;;N;;;;; +A267;YI SYLLABLE NGOT;Lo;0;L;;;;;N;;;;; +A268;YI SYLLABLE NGOX;Lo;0;L;;;;;N;;;;; +A269;YI SYLLABLE NGO;Lo;0;L;;;;;N;;;;; +A26A;YI SYLLABLE NGOP;Lo;0;L;;;;;N;;;;; +A26B;YI SYLLABLE NGEX;Lo;0;L;;;;;N;;;;; +A26C;YI SYLLABLE NGE;Lo;0;L;;;;;N;;;;; +A26D;YI SYLLABLE NGEP;Lo;0;L;;;;;N;;;;; +A26E;YI SYLLABLE HIT;Lo;0;L;;;;;N;;;;; +A26F;YI SYLLABLE HIEX;Lo;0;L;;;;;N;;;;; +A270;YI SYLLABLE HIE;Lo;0;L;;;;;N;;;;; +A271;YI SYLLABLE HAT;Lo;0;L;;;;;N;;;;; +A272;YI SYLLABLE HAX;Lo;0;L;;;;;N;;;;; +A273;YI SYLLABLE HA;Lo;0;L;;;;;N;;;;; +A274;YI SYLLABLE HAP;Lo;0;L;;;;;N;;;;; +A275;YI SYLLABLE HUOT;Lo;0;L;;;;;N;;;;; +A276;YI SYLLABLE HUOX;Lo;0;L;;;;;N;;;;; +A277;YI SYLLABLE HUO;Lo;0;L;;;;;N;;;;; +A278;YI SYLLABLE HUOP;Lo;0;L;;;;;N;;;;; +A279;YI SYLLABLE HOT;Lo;0;L;;;;;N;;;;; +A27A;YI SYLLABLE HOX;Lo;0;L;;;;;N;;;;; +A27B;YI SYLLABLE HO;Lo;0;L;;;;;N;;;;; +A27C;YI SYLLABLE HOP;Lo;0;L;;;;;N;;;;; +A27D;YI SYLLABLE HEX;Lo;0;L;;;;;N;;;;; +A27E;YI SYLLABLE HE;Lo;0;L;;;;;N;;;;; +A27F;YI SYLLABLE HEP;Lo;0;L;;;;;N;;;;; +A280;YI SYLLABLE WAT;Lo;0;L;;;;;N;;;;; +A281;YI SYLLABLE WAX;Lo;0;L;;;;;N;;;;; +A282;YI SYLLABLE WA;Lo;0;L;;;;;N;;;;; +A283;YI SYLLABLE WAP;Lo;0;L;;;;;N;;;;; +A284;YI SYLLABLE WUOX;Lo;0;L;;;;;N;;;;; +A285;YI SYLLABLE WUO;Lo;0;L;;;;;N;;;;; +A286;YI SYLLABLE WUOP;Lo;0;L;;;;;N;;;;; +A287;YI SYLLABLE WOX;Lo;0;L;;;;;N;;;;; +A288;YI SYLLABLE WO;Lo;0;L;;;;;N;;;;; +A289;YI SYLLABLE WOP;Lo;0;L;;;;;N;;;;; +A28A;YI SYLLABLE WEX;Lo;0;L;;;;;N;;;;; +A28B;YI SYLLABLE WE;Lo;0;L;;;;;N;;;;; +A28C;YI SYLLABLE WEP;Lo;0;L;;;;;N;;;;; +A28D;YI SYLLABLE ZIT;Lo;0;L;;;;;N;;;;; +A28E;YI SYLLABLE ZIX;Lo;0;L;;;;;N;;;;; +A28F;YI SYLLABLE ZI;Lo;0;L;;;;;N;;;;; +A290;YI SYLLABLE ZIP;Lo;0;L;;;;;N;;;;; +A291;YI SYLLABLE ZIEX;Lo;0;L;;;;;N;;;;; +A292;YI SYLLABLE ZIE;Lo;0;L;;;;;N;;;;; +A293;YI SYLLABLE ZIEP;Lo;0;L;;;;;N;;;;; +A294;YI SYLLABLE ZAT;Lo;0;L;;;;;N;;;;; +A295;YI SYLLABLE ZAX;Lo;0;L;;;;;N;;;;; +A296;YI SYLLABLE ZA;Lo;0;L;;;;;N;;;;; +A297;YI SYLLABLE ZAP;Lo;0;L;;;;;N;;;;; +A298;YI SYLLABLE ZUOX;Lo;0;L;;;;;N;;;;; +A299;YI SYLLABLE ZUO;Lo;0;L;;;;;N;;;;; +A29A;YI SYLLABLE ZUOP;Lo;0;L;;;;;N;;;;; +A29B;YI SYLLABLE ZOT;Lo;0;L;;;;;N;;;;; +A29C;YI SYLLABLE ZOX;Lo;0;L;;;;;N;;;;; +A29D;YI SYLLABLE ZO;Lo;0;L;;;;;N;;;;; +A29E;YI SYLLABLE ZOP;Lo;0;L;;;;;N;;;;; +A29F;YI SYLLABLE ZEX;Lo;0;L;;;;;N;;;;; +A2A0;YI SYLLABLE ZE;Lo;0;L;;;;;N;;;;; +A2A1;YI SYLLABLE ZEP;Lo;0;L;;;;;N;;;;; +A2A2;YI SYLLABLE ZUT;Lo;0;L;;;;;N;;;;; +A2A3;YI SYLLABLE ZUX;Lo;0;L;;;;;N;;;;; +A2A4;YI SYLLABLE ZU;Lo;0;L;;;;;N;;;;; +A2A5;YI SYLLABLE ZUP;Lo;0;L;;;;;N;;;;; +A2A6;YI SYLLABLE ZURX;Lo;0;L;;;;;N;;;;; +A2A7;YI SYLLABLE ZUR;Lo;0;L;;;;;N;;;;; +A2A8;YI SYLLABLE ZYT;Lo;0;L;;;;;N;;;;; +A2A9;YI SYLLABLE ZYX;Lo;0;L;;;;;N;;;;; +A2AA;YI SYLLABLE ZY;Lo;0;L;;;;;N;;;;; +A2AB;YI SYLLABLE ZYP;Lo;0;L;;;;;N;;;;; +A2AC;YI SYLLABLE ZYRX;Lo;0;L;;;;;N;;;;; +A2AD;YI SYLLABLE ZYR;Lo;0;L;;;;;N;;;;; +A2AE;YI SYLLABLE CIT;Lo;0;L;;;;;N;;;;; +A2AF;YI SYLLABLE CIX;Lo;0;L;;;;;N;;;;; +A2B0;YI SYLLABLE CI;Lo;0;L;;;;;N;;;;; +A2B1;YI SYLLABLE CIP;Lo;0;L;;;;;N;;;;; +A2B2;YI SYLLABLE CIET;Lo;0;L;;;;;N;;;;; +A2B3;YI SYLLABLE CIEX;Lo;0;L;;;;;N;;;;; +A2B4;YI SYLLABLE CIE;Lo;0;L;;;;;N;;;;; +A2B5;YI SYLLABLE CIEP;Lo;0;L;;;;;N;;;;; +A2B6;YI SYLLABLE CAT;Lo;0;L;;;;;N;;;;; +A2B7;YI SYLLABLE CAX;Lo;0;L;;;;;N;;;;; +A2B8;YI SYLLABLE CA;Lo;0;L;;;;;N;;;;; +A2B9;YI SYLLABLE CAP;Lo;0;L;;;;;N;;;;; +A2BA;YI SYLLABLE CUOX;Lo;0;L;;;;;N;;;;; +A2BB;YI SYLLABLE CUO;Lo;0;L;;;;;N;;;;; +A2BC;YI SYLLABLE CUOP;Lo;0;L;;;;;N;;;;; +A2BD;YI SYLLABLE COT;Lo;0;L;;;;;N;;;;; +A2BE;YI SYLLABLE COX;Lo;0;L;;;;;N;;;;; +A2BF;YI SYLLABLE CO;Lo;0;L;;;;;N;;;;; +A2C0;YI SYLLABLE COP;Lo;0;L;;;;;N;;;;; +A2C1;YI SYLLABLE CEX;Lo;0;L;;;;;N;;;;; +A2C2;YI SYLLABLE CE;Lo;0;L;;;;;N;;;;; +A2C3;YI SYLLABLE CEP;Lo;0;L;;;;;N;;;;; +A2C4;YI SYLLABLE CUT;Lo;0;L;;;;;N;;;;; +A2C5;YI SYLLABLE CUX;Lo;0;L;;;;;N;;;;; +A2C6;YI SYLLABLE CU;Lo;0;L;;;;;N;;;;; +A2C7;YI SYLLABLE CUP;Lo;0;L;;;;;N;;;;; +A2C8;YI SYLLABLE CURX;Lo;0;L;;;;;N;;;;; +A2C9;YI SYLLABLE CUR;Lo;0;L;;;;;N;;;;; +A2CA;YI SYLLABLE CYT;Lo;0;L;;;;;N;;;;; +A2CB;YI SYLLABLE CYX;Lo;0;L;;;;;N;;;;; +A2CC;YI SYLLABLE CY;Lo;0;L;;;;;N;;;;; +A2CD;YI SYLLABLE CYP;Lo;0;L;;;;;N;;;;; +A2CE;YI SYLLABLE CYRX;Lo;0;L;;;;;N;;;;; +A2CF;YI SYLLABLE CYR;Lo;0;L;;;;;N;;;;; +A2D0;YI SYLLABLE ZZIT;Lo;0;L;;;;;N;;;;; +A2D1;YI SYLLABLE ZZIX;Lo;0;L;;;;;N;;;;; +A2D2;YI SYLLABLE ZZI;Lo;0;L;;;;;N;;;;; +A2D3;YI SYLLABLE ZZIP;Lo;0;L;;;;;N;;;;; +A2D4;YI SYLLABLE ZZIET;Lo;0;L;;;;;N;;;;; +A2D5;YI SYLLABLE ZZIEX;Lo;0;L;;;;;N;;;;; +A2D6;YI SYLLABLE ZZIE;Lo;0;L;;;;;N;;;;; +A2D7;YI SYLLABLE ZZIEP;Lo;0;L;;;;;N;;;;; +A2D8;YI SYLLABLE ZZAT;Lo;0;L;;;;;N;;;;; +A2D9;YI SYLLABLE ZZAX;Lo;0;L;;;;;N;;;;; +A2DA;YI SYLLABLE ZZA;Lo;0;L;;;;;N;;;;; +A2DB;YI SYLLABLE ZZAP;Lo;0;L;;;;;N;;;;; +A2DC;YI SYLLABLE ZZOX;Lo;0;L;;;;;N;;;;; +A2DD;YI SYLLABLE ZZO;Lo;0;L;;;;;N;;;;; +A2DE;YI SYLLABLE ZZOP;Lo;0;L;;;;;N;;;;; +A2DF;YI SYLLABLE ZZEX;Lo;0;L;;;;;N;;;;; +A2E0;YI SYLLABLE ZZE;Lo;0;L;;;;;N;;;;; +A2E1;YI SYLLABLE ZZEP;Lo;0;L;;;;;N;;;;; +A2E2;YI SYLLABLE ZZUX;Lo;0;L;;;;;N;;;;; +A2E3;YI SYLLABLE ZZU;Lo;0;L;;;;;N;;;;; +A2E4;YI SYLLABLE ZZUP;Lo;0;L;;;;;N;;;;; +A2E5;YI SYLLABLE ZZURX;Lo;0;L;;;;;N;;;;; +A2E6;YI SYLLABLE ZZUR;Lo;0;L;;;;;N;;;;; +A2E7;YI SYLLABLE ZZYT;Lo;0;L;;;;;N;;;;; +A2E8;YI SYLLABLE ZZYX;Lo;0;L;;;;;N;;;;; +A2E9;YI SYLLABLE ZZY;Lo;0;L;;;;;N;;;;; +A2EA;YI SYLLABLE ZZYP;Lo;0;L;;;;;N;;;;; +A2EB;YI SYLLABLE ZZYRX;Lo;0;L;;;;;N;;;;; +A2EC;YI SYLLABLE ZZYR;Lo;0;L;;;;;N;;;;; +A2ED;YI SYLLABLE NZIT;Lo;0;L;;;;;N;;;;; +A2EE;YI SYLLABLE NZIX;Lo;0;L;;;;;N;;;;; +A2EF;YI SYLLABLE NZI;Lo;0;L;;;;;N;;;;; +A2F0;YI SYLLABLE NZIP;Lo;0;L;;;;;N;;;;; +A2F1;YI SYLLABLE NZIEX;Lo;0;L;;;;;N;;;;; +A2F2;YI SYLLABLE NZIE;Lo;0;L;;;;;N;;;;; +A2F3;YI SYLLABLE NZIEP;Lo;0;L;;;;;N;;;;; +A2F4;YI SYLLABLE NZAT;Lo;0;L;;;;;N;;;;; +A2F5;YI SYLLABLE NZAX;Lo;0;L;;;;;N;;;;; +A2F6;YI SYLLABLE NZA;Lo;0;L;;;;;N;;;;; +A2F7;YI SYLLABLE NZAP;Lo;0;L;;;;;N;;;;; +A2F8;YI SYLLABLE NZUOX;Lo;0;L;;;;;N;;;;; +A2F9;YI SYLLABLE NZUO;Lo;0;L;;;;;N;;;;; +A2FA;YI SYLLABLE NZOX;Lo;0;L;;;;;N;;;;; +A2FB;YI SYLLABLE NZOP;Lo;0;L;;;;;N;;;;; +A2FC;YI SYLLABLE NZEX;Lo;0;L;;;;;N;;;;; +A2FD;YI SYLLABLE NZE;Lo;0;L;;;;;N;;;;; +A2FE;YI SYLLABLE NZUX;Lo;0;L;;;;;N;;;;; +A2FF;YI SYLLABLE NZU;Lo;0;L;;;;;N;;;;; +A300;YI SYLLABLE NZUP;Lo;0;L;;;;;N;;;;; +A301;YI SYLLABLE NZURX;Lo;0;L;;;;;N;;;;; +A302;YI SYLLABLE NZUR;Lo;0;L;;;;;N;;;;; +A303;YI SYLLABLE NZYT;Lo;0;L;;;;;N;;;;; +A304;YI SYLLABLE NZYX;Lo;0;L;;;;;N;;;;; +A305;YI SYLLABLE NZY;Lo;0;L;;;;;N;;;;; +A306;YI SYLLABLE NZYP;Lo;0;L;;;;;N;;;;; +A307;YI SYLLABLE NZYRX;Lo;0;L;;;;;N;;;;; +A308;YI SYLLABLE NZYR;Lo;0;L;;;;;N;;;;; +A309;YI SYLLABLE SIT;Lo;0;L;;;;;N;;;;; +A30A;YI SYLLABLE SIX;Lo;0;L;;;;;N;;;;; +A30B;YI SYLLABLE SI;Lo;0;L;;;;;N;;;;; +A30C;YI SYLLABLE SIP;Lo;0;L;;;;;N;;;;; +A30D;YI SYLLABLE SIEX;Lo;0;L;;;;;N;;;;; +A30E;YI SYLLABLE SIE;Lo;0;L;;;;;N;;;;; +A30F;YI SYLLABLE SIEP;Lo;0;L;;;;;N;;;;; +A310;YI SYLLABLE SAT;Lo;0;L;;;;;N;;;;; +A311;YI SYLLABLE SAX;Lo;0;L;;;;;N;;;;; +A312;YI SYLLABLE SA;Lo;0;L;;;;;N;;;;; +A313;YI SYLLABLE SAP;Lo;0;L;;;;;N;;;;; +A314;YI SYLLABLE SUOX;Lo;0;L;;;;;N;;;;; +A315;YI SYLLABLE SUO;Lo;0;L;;;;;N;;;;; +A316;YI SYLLABLE SUOP;Lo;0;L;;;;;N;;;;; +A317;YI SYLLABLE SOT;Lo;0;L;;;;;N;;;;; +A318;YI SYLLABLE SOX;Lo;0;L;;;;;N;;;;; +A319;YI SYLLABLE SO;Lo;0;L;;;;;N;;;;; +A31A;YI SYLLABLE SOP;Lo;0;L;;;;;N;;;;; +A31B;YI SYLLABLE SEX;Lo;0;L;;;;;N;;;;; +A31C;YI SYLLABLE SE;Lo;0;L;;;;;N;;;;; +A31D;YI SYLLABLE SEP;Lo;0;L;;;;;N;;;;; +A31E;YI SYLLABLE SUT;Lo;0;L;;;;;N;;;;; +A31F;YI SYLLABLE SUX;Lo;0;L;;;;;N;;;;; +A320;YI SYLLABLE SU;Lo;0;L;;;;;N;;;;; +A321;YI SYLLABLE SUP;Lo;0;L;;;;;N;;;;; +A322;YI SYLLABLE SURX;Lo;0;L;;;;;N;;;;; +A323;YI SYLLABLE SUR;Lo;0;L;;;;;N;;;;; +A324;YI SYLLABLE SYT;Lo;0;L;;;;;N;;;;; +A325;YI SYLLABLE SYX;Lo;0;L;;;;;N;;;;; +A326;YI SYLLABLE SY;Lo;0;L;;;;;N;;;;; +A327;YI SYLLABLE SYP;Lo;0;L;;;;;N;;;;; +A328;YI SYLLABLE SYRX;Lo;0;L;;;;;N;;;;; +A329;YI SYLLABLE SYR;Lo;0;L;;;;;N;;;;; +A32A;YI SYLLABLE SSIT;Lo;0;L;;;;;N;;;;; +A32B;YI SYLLABLE SSIX;Lo;0;L;;;;;N;;;;; +A32C;YI SYLLABLE SSI;Lo;0;L;;;;;N;;;;; +A32D;YI SYLLABLE SSIP;Lo;0;L;;;;;N;;;;; +A32E;YI SYLLABLE SSIEX;Lo;0;L;;;;;N;;;;; +A32F;YI SYLLABLE SSIE;Lo;0;L;;;;;N;;;;; +A330;YI SYLLABLE SSIEP;Lo;0;L;;;;;N;;;;; +A331;YI SYLLABLE SSAT;Lo;0;L;;;;;N;;;;; +A332;YI SYLLABLE SSAX;Lo;0;L;;;;;N;;;;; +A333;YI SYLLABLE SSA;Lo;0;L;;;;;N;;;;; +A334;YI SYLLABLE SSAP;Lo;0;L;;;;;N;;;;; +A335;YI SYLLABLE SSOT;Lo;0;L;;;;;N;;;;; +A336;YI SYLLABLE SSOX;Lo;0;L;;;;;N;;;;; +A337;YI SYLLABLE SSO;Lo;0;L;;;;;N;;;;; +A338;YI SYLLABLE SSOP;Lo;0;L;;;;;N;;;;; +A339;YI SYLLABLE SSEX;Lo;0;L;;;;;N;;;;; +A33A;YI SYLLABLE SSE;Lo;0;L;;;;;N;;;;; +A33B;YI SYLLABLE SSEP;Lo;0;L;;;;;N;;;;; +A33C;YI SYLLABLE SSUT;Lo;0;L;;;;;N;;;;; +A33D;YI SYLLABLE SSUX;Lo;0;L;;;;;N;;;;; +A33E;YI SYLLABLE SSU;Lo;0;L;;;;;N;;;;; +A33F;YI SYLLABLE SSUP;Lo;0;L;;;;;N;;;;; +A340;YI SYLLABLE SSYT;Lo;0;L;;;;;N;;;;; +A341;YI SYLLABLE SSYX;Lo;0;L;;;;;N;;;;; +A342;YI SYLLABLE SSY;Lo;0;L;;;;;N;;;;; +A343;YI SYLLABLE SSYP;Lo;0;L;;;;;N;;;;; +A344;YI SYLLABLE SSYRX;Lo;0;L;;;;;N;;;;; +A345;YI SYLLABLE SSYR;Lo;0;L;;;;;N;;;;; +A346;YI SYLLABLE ZHAT;Lo;0;L;;;;;N;;;;; +A347;YI SYLLABLE ZHAX;Lo;0;L;;;;;N;;;;; +A348;YI SYLLABLE ZHA;Lo;0;L;;;;;N;;;;; +A349;YI SYLLABLE ZHAP;Lo;0;L;;;;;N;;;;; +A34A;YI SYLLABLE ZHUOX;Lo;0;L;;;;;N;;;;; +A34B;YI SYLLABLE ZHUO;Lo;0;L;;;;;N;;;;; +A34C;YI SYLLABLE ZHUOP;Lo;0;L;;;;;N;;;;; +A34D;YI SYLLABLE ZHOT;Lo;0;L;;;;;N;;;;; +A34E;YI SYLLABLE ZHOX;Lo;0;L;;;;;N;;;;; +A34F;YI SYLLABLE ZHO;Lo;0;L;;;;;N;;;;; +A350;YI SYLLABLE ZHOP;Lo;0;L;;;;;N;;;;; +A351;YI SYLLABLE ZHET;Lo;0;L;;;;;N;;;;; +A352;YI SYLLABLE ZHEX;Lo;0;L;;;;;N;;;;; +A353;YI SYLLABLE ZHE;Lo;0;L;;;;;N;;;;; +A354;YI SYLLABLE ZHEP;Lo;0;L;;;;;N;;;;; +A355;YI SYLLABLE ZHUT;Lo;0;L;;;;;N;;;;; +A356;YI SYLLABLE ZHUX;Lo;0;L;;;;;N;;;;; +A357;YI SYLLABLE ZHU;Lo;0;L;;;;;N;;;;; +A358;YI SYLLABLE ZHUP;Lo;0;L;;;;;N;;;;; +A359;YI SYLLABLE ZHURX;Lo;0;L;;;;;N;;;;; +A35A;YI SYLLABLE ZHUR;Lo;0;L;;;;;N;;;;; +A35B;YI SYLLABLE ZHYT;Lo;0;L;;;;;N;;;;; +A35C;YI SYLLABLE ZHYX;Lo;0;L;;;;;N;;;;; +A35D;YI SYLLABLE ZHY;Lo;0;L;;;;;N;;;;; +A35E;YI SYLLABLE ZHYP;Lo;0;L;;;;;N;;;;; +A35F;YI SYLLABLE ZHYRX;Lo;0;L;;;;;N;;;;; +A360;YI SYLLABLE ZHYR;Lo;0;L;;;;;N;;;;; +A361;YI SYLLABLE CHAT;Lo;0;L;;;;;N;;;;; +A362;YI SYLLABLE CHAX;Lo;0;L;;;;;N;;;;; +A363;YI SYLLABLE CHA;Lo;0;L;;;;;N;;;;; +A364;YI SYLLABLE CHAP;Lo;0;L;;;;;N;;;;; +A365;YI SYLLABLE CHUOT;Lo;0;L;;;;;N;;;;; +A366;YI SYLLABLE CHUOX;Lo;0;L;;;;;N;;;;; +A367;YI SYLLABLE CHUO;Lo;0;L;;;;;N;;;;; +A368;YI SYLLABLE CHUOP;Lo;0;L;;;;;N;;;;; +A369;YI SYLLABLE CHOT;Lo;0;L;;;;;N;;;;; +A36A;YI SYLLABLE CHOX;Lo;0;L;;;;;N;;;;; +A36B;YI SYLLABLE CHO;Lo;0;L;;;;;N;;;;; +A36C;YI SYLLABLE CHOP;Lo;0;L;;;;;N;;;;; +A36D;YI SYLLABLE CHET;Lo;0;L;;;;;N;;;;; +A36E;YI SYLLABLE CHEX;Lo;0;L;;;;;N;;;;; +A36F;YI SYLLABLE CHE;Lo;0;L;;;;;N;;;;; +A370;YI SYLLABLE CHEP;Lo;0;L;;;;;N;;;;; +A371;YI SYLLABLE CHUX;Lo;0;L;;;;;N;;;;; +A372;YI SYLLABLE CHU;Lo;0;L;;;;;N;;;;; +A373;YI SYLLABLE CHUP;Lo;0;L;;;;;N;;;;; +A374;YI SYLLABLE CHURX;Lo;0;L;;;;;N;;;;; +A375;YI SYLLABLE CHUR;Lo;0;L;;;;;N;;;;; +A376;YI SYLLABLE CHYT;Lo;0;L;;;;;N;;;;; +A377;YI SYLLABLE CHYX;Lo;0;L;;;;;N;;;;; +A378;YI SYLLABLE CHY;Lo;0;L;;;;;N;;;;; +A379;YI SYLLABLE CHYP;Lo;0;L;;;;;N;;;;; +A37A;YI SYLLABLE CHYRX;Lo;0;L;;;;;N;;;;; +A37B;YI SYLLABLE CHYR;Lo;0;L;;;;;N;;;;; +A37C;YI SYLLABLE RRAX;Lo;0;L;;;;;N;;;;; +A37D;YI SYLLABLE RRA;Lo;0;L;;;;;N;;;;; +A37E;YI SYLLABLE RRUOX;Lo;0;L;;;;;N;;;;; +A37F;YI SYLLABLE RRUO;Lo;0;L;;;;;N;;;;; +A380;YI SYLLABLE RROT;Lo;0;L;;;;;N;;;;; +A381;YI SYLLABLE RROX;Lo;0;L;;;;;N;;;;; +A382;YI SYLLABLE RRO;Lo;0;L;;;;;N;;;;; +A383;YI SYLLABLE RROP;Lo;0;L;;;;;N;;;;; +A384;YI SYLLABLE RRET;Lo;0;L;;;;;N;;;;; +A385;YI SYLLABLE RREX;Lo;0;L;;;;;N;;;;; +A386;YI SYLLABLE RRE;Lo;0;L;;;;;N;;;;; +A387;YI SYLLABLE RREP;Lo;0;L;;;;;N;;;;; +A388;YI SYLLABLE RRUT;Lo;0;L;;;;;N;;;;; +A389;YI SYLLABLE RRUX;Lo;0;L;;;;;N;;;;; +A38A;YI SYLLABLE RRU;Lo;0;L;;;;;N;;;;; +A38B;YI SYLLABLE RRUP;Lo;0;L;;;;;N;;;;; +A38C;YI SYLLABLE RRURX;Lo;0;L;;;;;N;;;;; +A38D;YI SYLLABLE RRUR;Lo;0;L;;;;;N;;;;; +A38E;YI SYLLABLE RRYT;Lo;0;L;;;;;N;;;;; +A38F;YI SYLLABLE RRYX;Lo;0;L;;;;;N;;;;; +A390;YI SYLLABLE RRY;Lo;0;L;;;;;N;;;;; +A391;YI SYLLABLE RRYP;Lo;0;L;;;;;N;;;;; +A392;YI SYLLABLE RRYRX;Lo;0;L;;;;;N;;;;; +A393;YI SYLLABLE RRYR;Lo;0;L;;;;;N;;;;; +A394;YI SYLLABLE NRAT;Lo;0;L;;;;;N;;;;; +A395;YI SYLLABLE NRAX;Lo;0;L;;;;;N;;;;; +A396;YI SYLLABLE NRA;Lo;0;L;;;;;N;;;;; +A397;YI SYLLABLE NRAP;Lo;0;L;;;;;N;;;;; +A398;YI SYLLABLE NROX;Lo;0;L;;;;;N;;;;; +A399;YI SYLLABLE NRO;Lo;0;L;;;;;N;;;;; +A39A;YI SYLLABLE NROP;Lo;0;L;;;;;N;;;;; +A39B;YI SYLLABLE NRET;Lo;0;L;;;;;N;;;;; +A39C;YI SYLLABLE NREX;Lo;0;L;;;;;N;;;;; +A39D;YI SYLLABLE NRE;Lo;0;L;;;;;N;;;;; +A39E;YI SYLLABLE NREP;Lo;0;L;;;;;N;;;;; +A39F;YI SYLLABLE NRUT;Lo;0;L;;;;;N;;;;; +A3A0;YI SYLLABLE NRUX;Lo;0;L;;;;;N;;;;; +A3A1;YI SYLLABLE NRU;Lo;0;L;;;;;N;;;;; +A3A2;YI SYLLABLE NRUP;Lo;0;L;;;;;N;;;;; +A3A3;YI SYLLABLE NRURX;Lo;0;L;;;;;N;;;;; +A3A4;YI SYLLABLE NRUR;Lo;0;L;;;;;N;;;;; +A3A5;YI SYLLABLE NRYT;Lo;0;L;;;;;N;;;;; +A3A6;YI SYLLABLE NRYX;Lo;0;L;;;;;N;;;;; +A3A7;YI SYLLABLE NRY;Lo;0;L;;;;;N;;;;; +A3A8;YI SYLLABLE NRYP;Lo;0;L;;;;;N;;;;; +A3A9;YI SYLLABLE NRYRX;Lo;0;L;;;;;N;;;;; +A3AA;YI SYLLABLE NRYR;Lo;0;L;;;;;N;;;;; +A3AB;YI SYLLABLE SHAT;Lo;0;L;;;;;N;;;;; +A3AC;YI SYLLABLE SHAX;Lo;0;L;;;;;N;;;;; +A3AD;YI SYLLABLE SHA;Lo;0;L;;;;;N;;;;; +A3AE;YI SYLLABLE SHAP;Lo;0;L;;;;;N;;;;; +A3AF;YI SYLLABLE SHUOX;Lo;0;L;;;;;N;;;;; +A3B0;YI SYLLABLE SHUO;Lo;0;L;;;;;N;;;;; +A3B1;YI SYLLABLE SHUOP;Lo;0;L;;;;;N;;;;; +A3B2;YI SYLLABLE SHOT;Lo;0;L;;;;;N;;;;; +A3B3;YI SYLLABLE SHOX;Lo;0;L;;;;;N;;;;; +A3B4;YI SYLLABLE SHO;Lo;0;L;;;;;N;;;;; +A3B5;YI SYLLABLE SHOP;Lo;0;L;;;;;N;;;;; +A3B6;YI SYLLABLE SHET;Lo;0;L;;;;;N;;;;; +A3B7;YI SYLLABLE SHEX;Lo;0;L;;;;;N;;;;; +A3B8;YI SYLLABLE SHE;Lo;0;L;;;;;N;;;;; +A3B9;YI SYLLABLE SHEP;Lo;0;L;;;;;N;;;;; +A3BA;YI SYLLABLE SHUT;Lo;0;L;;;;;N;;;;; +A3BB;YI SYLLABLE SHUX;Lo;0;L;;;;;N;;;;; +A3BC;YI SYLLABLE SHU;Lo;0;L;;;;;N;;;;; +A3BD;YI SYLLABLE SHUP;Lo;0;L;;;;;N;;;;; +A3BE;YI SYLLABLE SHURX;Lo;0;L;;;;;N;;;;; +A3BF;YI SYLLABLE SHUR;Lo;0;L;;;;;N;;;;; +A3C0;YI SYLLABLE SHYT;Lo;0;L;;;;;N;;;;; +A3C1;YI SYLLABLE SHYX;Lo;0;L;;;;;N;;;;; +A3C2;YI SYLLABLE SHY;Lo;0;L;;;;;N;;;;; +A3C3;YI SYLLABLE SHYP;Lo;0;L;;;;;N;;;;; +A3C4;YI SYLLABLE SHYRX;Lo;0;L;;;;;N;;;;; +A3C5;YI SYLLABLE SHYR;Lo;0;L;;;;;N;;;;; +A3C6;YI SYLLABLE RAT;Lo;0;L;;;;;N;;;;; +A3C7;YI SYLLABLE RAX;Lo;0;L;;;;;N;;;;; +A3C8;YI SYLLABLE RA;Lo;0;L;;;;;N;;;;; +A3C9;YI SYLLABLE RAP;Lo;0;L;;;;;N;;;;; +A3CA;YI SYLLABLE RUOX;Lo;0;L;;;;;N;;;;; +A3CB;YI SYLLABLE RUO;Lo;0;L;;;;;N;;;;; +A3CC;YI SYLLABLE RUOP;Lo;0;L;;;;;N;;;;; +A3CD;YI SYLLABLE ROT;Lo;0;L;;;;;N;;;;; +A3CE;YI SYLLABLE ROX;Lo;0;L;;;;;N;;;;; +A3CF;YI SYLLABLE RO;Lo;0;L;;;;;N;;;;; +A3D0;YI SYLLABLE ROP;Lo;0;L;;;;;N;;;;; +A3D1;YI SYLLABLE REX;Lo;0;L;;;;;N;;;;; +A3D2;YI SYLLABLE RE;Lo;0;L;;;;;N;;;;; +A3D3;YI SYLLABLE REP;Lo;0;L;;;;;N;;;;; +A3D4;YI SYLLABLE RUT;Lo;0;L;;;;;N;;;;; +A3D5;YI SYLLABLE RUX;Lo;0;L;;;;;N;;;;; +A3D6;YI SYLLABLE RU;Lo;0;L;;;;;N;;;;; +A3D7;YI SYLLABLE RUP;Lo;0;L;;;;;N;;;;; +A3D8;YI SYLLABLE RURX;Lo;0;L;;;;;N;;;;; +A3D9;YI SYLLABLE RUR;Lo;0;L;;;;;N;;;;; +A3DA;YI SYLLABLE RYT;Lo;0;L;;;;;N;;;;; +A3DB;YI SYLLABLE RYX;Lo;0;L;;;;;N;;;;; +A3DC;YI SYLLABLE RY;Lo;0;L;;;;;N;;;;; +A3DD;YI SYLLABLE RYP;Lo;0;L;;;;;N;;;;; +A3DE;YI SYLLABLE RYRX;Lo;0;L;;;;;N;;;;; +A3DF;YI SYLLABLE RYR;Lo;0;L;;;;;N;;;;; +A3E0;YI SYLLABLE JIT;Lo;0;L;;;;;N;;;;; +A3E1;YI SYLLABLE JIX;Lo;0;L;;;;;N;;;;; +A3E2;YI SYLLABLE JI;Lo;0;L;;;;;N;;;;; +A3E3;YI SYLLABLE JIP;Lo;0;L;;;;;N;;;;; +A3E4;YI SYLLABLE JIET;Lo;0;L;;;;;N;;;;; +A3E5;YI SYLLABLE JIEX;Lo;0;L;;;;;N;;;;; +A3E6;YI SYLLABLE JIE;Lo;0;L;;;;;N;;;;; +A3E7;YI SYLLABLE JIEP;Lo;0;L;;;;;N;;;;; +A3E8;YI SYLLABLE JUOT;Lo;0;L;;;;;N;;;;; +A3E9;YI SYLLABLE JUOX;Lo;0;L;;;;;N;;;;; +A3EA;YI SYLLABLE JUO;Lo;0;L;;;;;N;;;;; +A3EB;YI SYLLABLE JUOP;Lo;0;L;;;;;N;;;;; +A3EC;YI SYLLABLE JOT;Lo;0;L;;;;;N;;;;; +A3ED;YI SYLLABLE JOX;Lo;0;L;;;;;N;;;;; +A3EE;YI SYLLABLE JO;Lo;0;L;;;;;N;;;;; +A3EF;YI SYLLABLE JOP;Lo;0;L;;;;;N;;;;; +A3F0;YI SYLLABLE JUT;Lo;0;L;;;;;N;;;;; +A3F1;YI SYLLABLE JUX;Lo;0;L;;;;;N;;;;; +A3F2;YI SYLLABLE JU;Lo;0;L;;;;;N;;;;; +A3F3;YI SYLLABLE JUP;Lo;0;L;;;;;N;;;;; +A3F4;YI SYLLABLE JURX;Lo;0;L;;;;;N;;;;; +A3F5;YI SYLLABLE JUR;Lo;0;L;;;;;N;;;;; +A3F6;YI SYLLABLE JYT;Lo;0;L;;;;;N;;;;; +A3F7;YI SYLLABLE JYX;Lo;0;L;;;;;N;;;;; +A3F8;YI SYLLABLE JY;Lo;0;L;;;;;N;;;;; +A3F9;YI SYLLABLE JYP;Lo;0;L;;;;;N;;;;; +A3FA;YI SYLLABLE JYRX;Lo;0;L;;;;;N;;;;; +A3FB;YI SYLLABLE JYR;Lo;0;L;;;;;N;;;;; +A3FC;YI SYLLABLE QIT;Lo;0;L;;;;;N;;;;; +A3FD;YI SYLLABLE QIX;Lo;0;L;;;;;N;;;;; +A3FE;YI SYLLABLE QI;Lo;0;L;;;;;N;;;;; +A3FF;YI SYLLABLE QIP;Lo;0;L;;;;;N;;;;; +A400;YI SYLLABLE QIET;Lo;0;L;;;;;N;;;;; +A401;YI SYLLABLE QIEX;Lo;0;L;;;;;N;;;;; +A402;YI SYLLABLE QIE;Lo;0;L;;;;;N;;;;; +A403;YI SYLLABLE QIEP;Lo;0;L;;;;;N;;;;; +A404;YI SYLLABLE QUOT;Lo;0;L;;;;;N;;;;; +A405;YI SYLLABLE QUOX;Lo;0;L;;;;;N;;;;; +A406;YI SYLLABLE QUO;Lo;0;L;;;;;N;;;;; +A407;YI SYLLABLE QUOP;Lo;0;L;;;;;N;;;;; +A408;YI SYLLABLE QOT;Lo;0;L;;;;;N;;;;; +A409;YI SYLLABLE QOX;Lo;0;L;;;;;N;;;;; +A40A;YI SYLLABLE QO;Lo;0;L;;;;;N;;;;; +A40B;YI SYLLABLE QOP;Lo;0;L;;;;;N;;;;; +A40C;YI SYLLABLE QUT;Lo;0;L;;;;;N;;;;; +A40D;YI SYLLABLE QUX;Lo;0;L;;;;;N;;;;; +A40E;YI SYLLABLE QU;Lo;0;L;;;;;N;;;;; +A40F;YI SYLLABLE QUP;Lo;0;L;;;;;N;;;;; +A410;YI SYLLABLE QURX;Lo;0;L;;;;;N;;;;; +A411;YI SYLLABLE QUR;Lo;0;L;;;;;N;;;;; +A412;YI SYLLABLE QYT;Lo;0;L;;;;;N;;;;; +A413;YI SYLLABLE QYX;Lo;0;L;;;;;N;;;;; +A414;YI SYLLABLE QY;Lo;0;L;;;;;N;;;;; +A415;YI SYLLABLE QYP;Lo;0;L;;;;;N;;;;; +A416;YI SYLLABLE QYRX;Lo;0;L;;;;;N;;;;; +A417;YI SYLLABLE QYR;Lo;0;L;;;;;N;;;;; +A418;YI SYLLABLE JJIT;Lo;0;L;;;;;N;;;;; +A419;YI SYLLABLE JJIX;Lo;0;L;;;;;N;;;;; +A41A;YI SYLLABLE JJI;Lo;0;L;;;;;N;;;;; +A41B;YI SYLLABLE JJIP;Lo;0;L;;;;;N;;;;; +A41C;YI SYLLABLE JJIET;Lo;0;L;;;;;N;;;;; +A41D;YI SYLLABLE JJIEX;Lo;0;L;;;;;N;;;;; +A41E;YI SYLLABLE JJIE;Lo;0;L;;;;;N;;;;; +A41F;YI SYLLABLE JJIEP;Lo;0;L;;;;;N;;;;; +A420;YI SYLLABLE JJUOX;Lo;0;L;;;;;N;;;;; +A421;YI SYLLABLE JJUO;Lo;0;L;;;;;N;;;;; +A422;YI SYLLABLE JJUOP;Lo;0;L;;;;;N;;;;; +A423;YI SYLLABLE JJOT;Lo;0;L;;;;;N;;;;; +A424;YI SYLLABLE JJOX;Lo;0;L;;;;;N;;;;; +A425;YI SYLLABLE JJO;Lo;0;L;;;;;N;;;;; +A426;YI SYLLABLE JJOP;Lo;0;L;;;;;N;;;;; +A427;YI SYLLABLE JJUT;Lo;0;L;;;;;N;;;;; +A428;YI SYLLABLE JJUX;Lo;0;L;;;;;N;;;;; +A429;YI SYLLABLE JJU;Lo;0;L;;;;;N;;;;; +A42A;YI SYLLABLE JJUP;Lo;0;L;;;;;N;;;;; +A42B;YI SYLLABLE JJURX;Lo;0;L;;;;;N;;;;; +A42C;YI SYLLABLE JJUR;Lo;0;L;;;;;N;;;;; +A42D;YI SYLLABLE JJYT;Lo;0;L;;;;;N;;;;; +A42E;YI SYLLABLE JJYX;Lo;0;L;;;;;N;;;;; +A42F;YI SYLLABLE JJY;Lo;0;L;;;;;N;;;;; +A430;YI SYLLABLE JJYP;Lo;0;L;;;;;N;;;;; +A431;YI SYLLABLE NJIT;Lo;0;L;;;;;N;;;;; +A432;YI SYLLABLE NJIX;Lo;0;L;;;;;N;;;;; +A433;YI SYLLABLE NJI;Lo;0;L;;;;;N;;;;; +A434;YI SYLLABLE NJIP;Lo;0;L;;;;;N;;;;; +A435;YI SYLLABLE NJIET;Lo;0;L;;;;;N;;;;; +A436;YI SYLLABLE NJIEX;Lo;0;L;;;;;N;;;;; +A437;YI SYLLABLE NJIE;Lo;0;L;;;;;N;;;;; +A438;YI SYLLABLE NJIEP;Lo;0;L;;;;;N;;;;; +A439;YI SYLLABLE NJUOX;Lo;0;L;;;;;N;;;;; +A43A;YI SYLLABLE NJUO;Lo;0;L;;;;;N;;;;; +A43B;YI SYLLABLE NJOT;Lo;0;L;;;;;N;;;;; +A43C;YI SYLLABLE NJOX;Lo;0;L;;;;;N;;;;; +A43D;YI SYLLABLE NJO;Lo;0;L;;;;;N;;;;; +A43E;YI SYLLABLE NJOP;Lo;0;L;;;;;N;;;;; +A43F;YI SYLLABLE NJUX;Lo;0;L;;;;;N;;;;; +A440;YI SYLLABLE NJU;Lo;0;L;;;;;N;;;;; +A441;YI SYLLABLE NJUP;Lo;0;L;;;;;N;;;;; +A442;YI SYLLABLE NJURX;Lo;0;L;;;;;N;;;;; +A443;YI SYLLABLE NJUR;Lo;0;L;;;;;N;;;;; +A444;YI SYLLABLE NJYT;Lo;0;L;;;;;N;;;;; +A445;YI SYLLABLE NJYX;Lo;0;L;;;;;N;;;;; +A446;YI SYLLABLE NJY;Lo;0;L;;;;;N;;;;; +A447;YI SYLLABLE NJYP;Lo;0;L;;;;;N;;;;; +A448;YI SYLLABLE NJYRX;Lo;0;L;;;;;N;;;;; +A449;YI SYLLABLE NJYR;Lo;0;L;;;;;N;;;;; +A44A;YI SYLLABLE NYIT;Lo;0;L;;;;;N;;;;; +A44B;YI SYLLABLE NYIX;Lo;0;L;;;;;N;;;;; +A44C;YI SYLLABLE NYI;Lo;0;L;;;;;N;;;;; +A44D;YI SYLLABLE NYIP;Lo;0;L;;;;;N;;;;; +A44E;YI SYLLABLE NYIET;Lo;0;L;;;;;N;;;;; +A44F;YI SYLLABLE NYIEX;Lo;0;L;;;;;N;;;;; +A450;YI SYLLABLE NYIE;Lo;0;L;;;;;N;;;;; +A451;YI SYLLABLE NYIEP;Lo;0;L;;;;;N;;;;; +A452;YI SYLLABLE NYUOX;Lo;0;L;;;;;N;;;;; +A453;YI SYLLABLE NYUO;Lo;0;L;;;;;N;;;;; +A454;YI SYLLABLE NYUOP;Lo;0;L;;;;;N;;;;; +A455;YI SYLLABLE NYOT;Lo;0;L;;;;;N;;;;; +A456;YI SYLLABLE NYOX;Lo;0;L;;;;;N;;;;; +A457;YI SYLLABLE NYO;Lo;0;L;;;;;N;;;;; +A458;YI SYLLABLE NYOP;Lo;0;L;;;;;N;;;;; +A459;YI SYLLABLE NYUT;Lo;0;L;;;;;N;;;;; +A45A;YI SYLLABLE NYUX;Lo;0;L;;;;;N;;;;; +A45B;YI SYLLABLE NYU;Lo;0;L;;;;;N;;;;; +A45C;YI SYLLABLE NYUP;Lo;0;L;;;;;N;;;;; +A45D;YI SYLLABLE XIT;Lo;0;L;;;;;N;;;;; +A45E;YI SYLLABLE XIX;Lo;0;L;;;;;N;;;;; +A45F;YI SYLLABLE XI;Lo;0;L;;;;;N;;;;; +A460;YI SYLLABLE XIP;Lo;0;L;;;;;N;;;;; +A461;YI SYLLABLE XIET;Lo;0;L;;;;;N;;;;; +A462;YI SYLLABLE XIEX;Lo;0;L;;;;;N;;;;; +A463;YI SYLLABLE XIE;Lo;0;L;;;;;N;;;;; +A464;YI SYLLABLE XIEP;Lo;0;L;;;;;N;;;;; +A465;YI SYLLABLE XUOX;Lo;0;L;;;;;N;;;;; +A466;YI SYLLABLE XUO;Lo;0;L;;;;;N;;;;; +A467;YI SYLLABLE XOT;Lo;0;L;;;;;N;;;;; +A468;YI SYLLABLE XOX;Lo;0;L;;;;;N;;;;; +A469;YI SYLLABLE XO;Lo;0;L;;;;;N;;;;; +A46A;YI SYLLABLE XOP;Lo;0;L;;;;;N;;;;; +A46B;YI SYLLABLE XYT;Lo;0;L;;;;;N;;;;; +A46C;YI SYLLABLE XYX;Lo;0;L;;;;;N;;;;; +A46D;YI SYLLABLE XY;Lo;0;L;;;;;N;;;;; +A46E;YI SYLLABLE XYP;Lo;0;L;;;;;N;;;;; +A46F;YI SYLLABLE XYRX;Lo;0;L;;;;;N;;;;; +A470;YI SYLLABLE XYR;Lo;0;L;;;;;N;;;;; +A471;YI SYLLABLE YIT;Lo;0;L;;;;;N;;;;; +A472;YI SYLLABLE YIX;Lo;0;L;;;;;N;;;;; +A473;YI SYLLABLE YI;Lo;0;L;;;;;N;;;;; +A474;YI SYLLABLE YIP;Lo;0;L;;;;;N;;;;; +A475;YI SYLLABLE YIET;Lo;0;L;;;;;N;;;;; +A476;YI SYLLABLE YIEX;Lo;0;L;;;;;N;;;;; +A477;YI SYLLABLE YIE;Lo;0;L;;;;;N;;;;; +A478;YI SYLLABLE YIEP;Lo;0;L;;;;;N;;;;; +A479;YI SYLLABLE YUOT;Lo;0;L;;;;;N;;;;; +A47A;YI SYLLABLE YUOX;Lo;0;L;;;;;N;;;;; +A47B;YI SYLLABLE YUO;Lo;0;L;;;;;N;;;;; +A47C;YI SYLLABLE YUOP;Lo;0;L;;;;;N;;;;; +A47D;YI SYLLABLE YOT;Lo;0;L;;;;;N;;;;; +A47E;YI SYLLABLE YOX;Lo;0;L;;;;;N;;;;; +A47F;YI SYLLABLE YO;Lo;0;L;;;;;N;;;;; +A480;YI SYLLABLE YOP;Lo;0;L;;;;;N;;;;; +A481;YI SYLLABLE YUT;Lo;0;L;;;;;N;;;;; +A482;YI SYLLABLE YUX;Lo;0;L;;;;;N;;;;; +A483;YI SYLLABLE YU;Lo;0;L;;;;;N;;;;; +A484;YI SYLLABLE YUP;Lo;0;L;;;;;N;;;;; +A485;YI SYLLABLE YURX;Lo;0;L;;;;;N;;;;; +A486;YI SYLLABLE YUR;Lo;0;L;;;;;N;;;;; +A487;YI SYLLABLE YYT;Lo;0;L;;;;;N;;;;; +A488;YI SYLLABLE YYX;Lo;0;L;;;;;N;;;;; +A489;YI SYLLABLE YY;Lo;0;L;;;;;N;;;;; +A48A;YI SYLLABLE YYP;Lo;0;L;;;;;N;;;;; +A48B;YI SYLLABLE YYRX;Lo;0;L;;;;;N;;;;; +A48C;YI SYLLABLE YYR;Lo;0;L;;;;;N;;;;; +A490;YI RADICAL QOT;So;0;ON;;;;;N;;;;; +A491;YI RADICAL LI;So;0;ON;;;;;N;;;;; +A492;YI RADICAL KIT;So;0;ON;;;;;N;;;;; +A493;YI RADICAL NYIP;So;0;ON;;;;;N;;;;; +A494;YI RADICAL CYP;So;0;ON;;;;;N;;;;; +A495;YI RADICAL SSI;So;0;ON;;;;;N;;;;; +A496;YI RADICAL GGOP;So;0;ON;;;;;N;;;;; +A497;YI RADICAL GEP;So;0;ON;;;;;N;;;;; +A498;YI RADICAL MI;So;0;ON;;;;;N;;;;; +A499;YI RADICAL HXIT;So;0;ON;;;;;N;;;;; +A49A;YI RADICAL LYR;So;0;ON;;;;;N;;;;; +A49B;YI RADICAL BBUT;So;0;ON;;;;;N;;;;; +A49C;YI RADICAL MOP;So;0;ON;;;;;N;;;;; +A49D;YI RADICAL YO;So;0;ON;;;;;N;;;;; +A49E;YI RADICAL PUT;So;0;ON;;;;;N;;;;; +A49F;YI RADICAL HXUO;So;0;ON;;;;;N;;;;; +A4A0;YI RADICAL TAT;So;0;ON;;;;;N;;;;; +A4A1;YI RADICAL GA;So;0;ON;;;;;N;;;;; +A4A2;YI RADICAL ZUP;So;0;ON;;;;;N;;;;; +A4A3;YI RADICAL CYT;So;0;ON;;;;;N;;;;; +A4A4;YI RADICAL DDUR;So;0;ON;;;;;N;;;;; +A4A5;YI RADICAL BUR;So;0;ON;;;;;N;;;;; +A4A6;YI RADICAL GGUO;So;0;ON;;;;;N;;;;; +A4A7;YI RADICAL NYOP;So;0;ON;;;;;N;;;;; +A4A8;YI RADICAL TU;So;0;ON;;;;;N;;;;; +A4A9;YI RADICAL OP;So;0;ON;;;;;N;;;;; +A4AA;YI RADICAL JJUT;So;0;ON;;;;;N;;;;; +A4AB;YI RADICAL ZOT;So;0;ON;;;;;N;;;;; +A4AC;YI RADICAL PYT;So;0;ON;;;;;N;;;;; +A4AD;YI RADICAL HMO;So;0;ON;;;;;N;;;;; +A4AE;YI RADICAL YIT;So;0;ON;;;;;N;;;;; +A4AF;YI RADICAL VUR;So;0;ON;;;;;N;;;;; +A4B0;YI RADICAL SHY;So;0;ON;;;;;N;;;;; +A4B1;YI RADICAL VEP;So;0;ON;;;;;N;;;;; +A4B2;YI RADICAL ZA;So;0;ON;;;;;N;;;;; +A4B3;YI RADICAL JO;So;0;ON;;;;;N;;;;; +A4B4;YI RADICAL NZUP;So;0;ON;;;;;N;;;;; +A4B5;YI RADICAL JJY;So;0;ON;;;;;N;;;;; +A4B6;YI RADICAL GOT;So;0;ON;;;;;N;;;;; +A4B7;YI RADICAL JJIE;So;0;ON;;;;;N;;;;; +A4B8;YI RADICAL WO;So;0;ON;;;;;N;;;;; +A4B9;YI RADICAL DU;So;0;ON;;;;;N;;;;; +A4BA;YI RADICAL SHUR;So;0;ON;;;;;N;;;;; +A4BB;YI RADICAL LIE;So;0;ON;;;;;N;;;;; +A4BC;YI RADICAL CY;So;0;ON;;;;;N;;;;; +A4BD;YI RADICAL CUOP;So;0;ON;;;;;N;;;;; +A4BE;YI RADICAL CIP;So;0;ON;;;;;N;;;;; +A4BF;YI RADICAL HXOP;So;0;ON;;;;;N;;;;; +A4C0;YI RADICAL SHAT;So;0;ON;;;;;N;;;;; +A4C1;YI RADICAL ZUR;So;0;ON;;;;;N;;;;; +A4C2;YI RADICAL SHOP;So;0;ON;;;;;N;;;;; +A4C3;YI RADICAL CHE;So;0;ON;;;;;N;;;;; +A4C4;YI RADICAL ZZIET;So;0;ON;;;;;N;;;;; +A4C5;YI RADICAL NBIE;So;0;ON;;;;;N;;;;; +A4C6;YI RADICAL KE;So;0;ON;;;;;N;;;;; +A4D0;LISU LETTER BA;Lo;0;L;;;;;N;;;;; +A4D1;LISU LETTER PA;Lo;0;L;;;;;N;;;;; +A4D2;LISU LETTER PHA;Lo;0;L;;;;;N;;;;; +A4D3;LISU LETTER DA;Lo;0;L;;;;;N;;;;; +A4D4;LISU LETTER TA;Lo;0;L;;;;;N;;;;; +A4D5;LISU LETTER THA;Lo;0;L;;;;;N;;;;; +A4D6;LISU LETTER GA;Lo;0;L;;;;;N;;;;; +A4D7;LISU LETTER KA;Lo;0;L;;;;;N;;;;; +A4D8;LISU LETTER KHA;Lo;0;L;;;;;N;;;;; +A4D9;LISU LETTER JA;Lo;0;L;;;;;N;;;;; +A4DA;LISU LETTER CA;Lo;0;L;;;;;N;;;;; +A4DB;LISU LETTER CHA;Lo;0;L;;;;;N;;;;; +A4DC;LISU LETTER DZA;Lo;0;L;;;;;N;;;;; +A4DD;LISU LETTER TSA;Lo;0;L;;;;;N;;;;; +A4DE;LISU LETTER TSHA;Lo;0;L;;;;;N;;;;; +A4DF;LISU LETTER MA;Lo;0;L;;;;;N;;;;; +A4E0;LISU LETTER NA;Lo;0;L;;;;;N;;;;; +A4E1;LISU LETTER LA;Lo;0;L;;;;;N;;;;; +A4E2;LISU LETTER SA;Lo;0;L;;;;;N;;;;; +A4E3;LISU LETTER ZHA;Lo;0;L;;;;;N;;;;; +A4E4;LISU LETTER ZA;Lo;0;L;;;;;N;;;;; +A4E5;LISU LETTER NGA;Lo;0;L;;;;;N;;;;; +A4E6;LISU LETTER HA;Lo;0;L;;;;;N;;;;; +A4E7;LISU LETTER XA;Lo;0;L;;;;;N;;;;; +A4E8;LISU LETTER HHA;Lo;0;L;;;;;N;;;;; +A4E9;LISU LETTER FA;Lo;0;L;;;;;N;;;;; +A4EA;LISU LETTER WA;Lo;0;L;;;;;N;;;;; +A4EB;LISU LETTER SHA;Lo;0;L;;;;;N;;;;; +A4EC;LISU LETTER YA;Lo;0;L;;;;;N;;;;; +A4ED;LISU LETTER GHA;Lo;0;L;;;;;N;;;;; +A4EE;LISU LETTER A;Lo;0;L;;;;;N;;;;; +A4EF;LISU LETTER AE;Lo;0;L;;;;;N;;;;; +A4F0;LISU LETTER E;Lo;0;L;;;;;N;;;;; +A4F1;LISU LETTER EU;Lo;0;L;;;;;N;;;;; +A4F2;LISU LETTER I;Lo;0;L;;;;;N;;;;; +A4F3;LISU LETTER O;Lo;0;L;;;;;N;;;;; +A4F4;LISU LETTER U;Lo;0;L;;;;;N;;;;; +A4F5;LISU LETTER UE;Lo;0;L;;;;;N;;;;; +A4F6;LISU LETTER UH;Lo;0;L;;;;;N;;;;; +A4F7;LISU LETTER OE;Lo;0;L;;;;;N;;;;; +A4F8;LISU LETTER TONE MYA TI;Lm;0;L;;;;;N;;;;; +A4F9;LISU LETTER TONE NA PO;Lm;0;L;;;;;N;;;;; +A4FA;LISU LETTER TONE MYA CYA;Lm;0;L;;;;;N;;;;; +A4FB;LISU LETTER TONE MYA BO;Lm;0;L;;;;;N;;;;; +A4FC;LISU LETTER TONE MYA NA;Lm;0;L;;;;;N;;;;; +A4FD;LISU LETTER TONE MYA JEU;Lm;0;L;;;;;N;;;;; +A4FE;LISU PUNCTUATION COMMA;Po;0;L;;;;;N;;;;; +A4FF;LISU PUNCTUATION FULL STOP;Po;0;L;;;;;N;;;;; +A500;VAI SYLLABLE EE;Lo;0;L;;;;;N;;;;; +A501;VAI SYLLABLE EEN;Lo;0;L;;;;;N;;;;; +A502;VAI SYLLABLE HEE;Lo;0;L;;;;;N;;;;; +A503;VAI SYLLABLE WEE;Lo;0;L;;;;;N;;;;; +A504;VAI SYLLABLE WEEN;Lo;0;L;;;;;N;;;;; +A505;VAI SYLLABLE PEE;Lo;0;L;;;;;N;;;;; +A506;VAI SYLLABLE BHEE;Lo;0;L;;;;;N;;;;; +A507;VAI SYLLABLE BEE;Lo;0;L;;;;;N;;;;; +A508;VAI SYLLABLE MBEE;Lo;0;L;;;;;N;;;;; +A509;VAI SYLLABLE KPEE;Lo;0;L;;;;;N;;;;; +A50A;VAI SYLLABLE MGBEE;Lo;0;L;;;;;N;;;;; +A50B;VAI SYLLABLE GBEE;Lo;0;L;;;;;N;;;;; +A50C;VAI SYLLABLE FEE;Lo;0;L;;;;;N;;;;; +A50D;VAI SYLLABLE VEE;Lo;0;L;;;;;N;;;;; +A50E;VAI SYLLABLE TEE;Lo;0;L;;;;;N;;;;; +A50F;VAI SYLLABLE THEE;Lo;0;L;;;;;N;;;;; +A510;VAI SYLLABLE DHEE;Lo;0;L;;;;;N;;;;; +A511;VAI SYLLABLE DHHEE;Lo;0;L;;;;;N;;;;; +A512;VAI SYLLABLE LEE;Lo;0;L;;;;;N;;;;; +A513;VAI SYLLABLE REE;Lo;0;L;;;;;N;;;;; +A514;VAI SYLLABLE DEE;Lo;0;L;;;;;N;;;;; +A515;VAI SYLLABLE NDEE;Lo;0;L;;;;;N;;;;; +A516;VAI SYLLABLE SEE;Lo;0;L;;;;;N;;;;; +A517;VAI SYLLABLE SHEE;Lo;0;L;;;;;N;;;;; +A518;VAI SYLLABLE ZEE;Lo;0;L;;;;;N;;;;; +A519;VAI SYLLABLE ZHEE;Lo;0;L;;;;;N;;;;; +A51A;VAI SYLLABLE CEE;Lo;0;L;;;;;N;;;;; +A51B;VAI SYLLABLE JEE;Lo;0;L;;;;;N;;;;; +A51C;VAI SYLLABLE NJEE;Lo;0;L;;;;;N;;;;; +A51D;VAI SYLLABLE YEE;Lo;0;L;;;;;N;;;;; +A51E;VAI SYLLABLE KEE;Lo;0;L;;;;;N;;;;; +A51F;VAI SYLLABLE NGGEE;Lo;0;L;;;;;N;;;;; +A520;VAI SYLLABLE GEE;Lo;0;L;;;;;N;;;;; +A521;VAI SYLLABLE MEE;Lo;0;L;;;;;N;;;;; +A522;VAI SYLLABLE NEE;Lo;0;L;;;;;N;;;;; +A523;VAI SYLLABLE NYEE;Lo;0;L;;;;;N;;;;; +A524;VAI SYLLABLE I;Lo;0;L;;;;;N;;;;; +A525;VAI SYLLABLE IN;Lo;0;L;;;;;N;;;;; +A526;VAI SYLLABLE HI;Lo;0;L;;;;;N;;;;; +A527;VAI SYLLABLE HIN;Lo;0;L;;;;;N;;;;; +A528;VAI SYLLABLE WI;Lo;0;L;;;;;N;;;;; +A529;VAI SYLLABLE WIN;Lo;0;L;;;;;N;;;;; +A52A;VAI SYLLABLE PI;Lo;0;L;;;;;N;;;;; +A52B;VAI SYLLABLE BHI;Lo;0;L;;;;;N;;;;; +A52C;VAI SYLLABLE BI;Lo;0;L;;;;;N;;;;; +A52D;VAI SYLLABLE MBI;Lo;0;L;;;;;N;;;;; +A52E;VAI SYLLABLE KPI;Lo;0;L;;;;;N;;;;; +A52F;VAI SYLLABLE MGBI;Lo;0;L;;;;;N;;;;; +A530;VAI SYLLABLE GBI;Lo;0;L;;;;;N;;;;; +A531;VAI SYLLABLE FI;Lo;0;L;;;;;N;;;;; +A532;VAI SYLLABLE VI;Lo;0;L;;;;;N;;;;; +A533;VAI SYLLABLE TI;Lo;0;L;;;;;N;;;;; +A534;VAI SYLLABLE THI;Lo;0;L;;;;;N;;;;; +A535;VAI SYLLABLE DHI;Lo;0;L;;;;;N;;;;; +A536;VAI SYLLABLE DHHI;Lo;0;L;;;;;N;;;;; +A537;VAI SYLLABLE LI;Lo;0;L;;;;;N;;;;; +A538;VAI SYLLABLE RI;Lo;0;L;;;;;N;;;;; +A539;VAI SYLLABLE DI;Lo;0;L;;;;;N;;;;; +A53A;VAI SYLLABLE NDI;Lo;0;L;;;;;N;;;;; +A53B;VAI SYLLABLE SI;Lo;0;L;;;;;N;;;;; +A53C;VAI SYLLABLE SHI;Lo;0;L;;;;;N;;;;; +A53D;VAI SYLLABLE ZI;Lo;0;L;;;;;N;;;;; +A53E;VAI SYLLABLE ZHI;Lo;0;L;;;;;N;;;;; +A53F;VAI SYLLABLE CI;Lo;0;L;;;;;N;;;;; +A540;VAI SYLLABLE JI;Lo;0;L;;;;;N;;;;; +A541;VAI SYLLABLE NJI;Lo;0;L;;;;;N;;;;; +A542;VAI SYLLABLE YI;Lo;0;L;;;;;N;;;;; +A543;VAI SYLLABLE KI;Lo;0;L;;;;;N;;;;; +A544;VAI SYLLABLE NGGI;Lo;0;L;;;;;N;;;;; +A545;VAI SYLLABLE GI;Lo;0;L;;;;;N;;;;; +A546;VAI SYLLABLE MI;Lo;0;L;;;;;N;;;;; +A547;VAI SYLLABLE NI;Lo;0;L;;;;;N;;;;; +A548;VAI SYLLABLE NYI;Lo;0;L;;;;;N;;;;; +A549;VAI SYLLABLE A;Lo;0;L;;;;;N;;;;; +A54A;VAI SYLLABLE AN;Lo;0;L;;;;;N;;;;; +A54B;VAI SYLLABLE NGAN;Lo;0;L;;;;;N;;;;; +A54C;VAI SYLLABLE HA;Lo;0;L;;;;;N;;;;; +A54D;VAI SYLLABLE HAN;Lo;0;L;;;;;N;;;;; +A54E;VAI SYLLABLE WA;Lo;0;L;;;;;N;;;;; +A54F;VAI SYLLABLE WAN;Lo;0;L;;;;;N;;;;; +A550;VAI SYLLABLE PA;Lo;0;L;;;;;N;;;;; +A551;VAI SYLLABLE BHA;Lo;0;L;;;;;N;;;;; +A552;VAI SYLLABLE BA;Lo;0;L;;;;;N;;;;; +A553;VAI SYLLABLE MBA;Lo;0;L;;;;;N;;;;; +A554;VAI SYLLABLE KPA;Lo;0;L;;;;;N;;;;; +A555;VAI SYLLABLE KPAN;Lo;0;L;;;;;N;;;;; +A556;VAI SYLLABLE MGBA;Lo;0;L;;;;;N;;;;; +A557;VAI SYLLABLE GBA;Lo;0;L;;;;;N;;;;; +A558;VAI SYLLABLE FA;Lo;0;L;;;;;N;;;;; +A559;VAI SYLLABLE VA;Lo;0;L;;;;;N;;;;; +A55A;VAI SYLLABLE TA;Lo;0;L;;;;;N;;;;; +A55B;VAI SYLLABLE THA;Lo;0;L;;;;;N;;;;; +A55C;VAI SYLLABLE DHA;Lo;0;L;;;;;N;;;;; +A55D;VAI SYLLABLE DHHA;Lo;0;L;;;;;N;;;;; +A55E;VAI SYLLABLE LA;Lo;0;L;;;;;N;;;;; +A55F;VAI SYLLABLE RA;Lo;0;L;;;;;N;;;;; +A560;VAI SYLLABLE DA;Lo;0;L;;;;;N;;;;; +A561;VAI SYLLABLE NDA;Lo;0;L;;;;;N;;;;; +A562;VAI SYLLABLE SA;Lo;0;L;;;;;N;;;;; +A563;VAI SYLLABLE SHA;Lo;0;L;;;;;N;;;;; +A564;VAI SYLLABLE ZA;Lo;0;L;;;;;N;;;;; +A565;VAI SYLLABLE ZHA;Lo;0;L;;;;;N;;;;; +A566;VAI SYLLABLE CA;Lo;0;L;;;;;N;;;;; +A567;VAI SYLLABLE JA;Lo;0;L;;;;;N;;;;; +A568;VAI SYLLABLE NJA;Lo;0;L;;;;;N;;;;; +A569;VAI SYLLABLE YA;Lo;0;L;;;;;N;;;;; +A56A;VAI SYLLABLE KA;Lo;0;L;;;;;N;;;;; +A56B;VAI SYLLABLE KAN;Lo;0;L;;;;;N;;;;; +A56C;VAI SYLLABLE NGGA;Lo;0;L;;;;;N;;;;; +A56D;VAI SYLLABLE GA;Lo;0;L;;;;;N;;;;; +A56E;VAI SYLLABLE MA;Lo;0;L;;;;;N;;;;; +A56F;VAI SYLLABLE NA;Lo;0;L;;;;;N;;;;; +A570;VAI SYLLABLE NYA;Lo;0;L;;;;;N;;;;; +A571;VAI SYLLABLE OO;Lo;0;L;;;;;N;;;;; +A572;VAI SYLLABLE OON;Lo;0;L;;;;;N;;;;; +A573;VAI SYLLABLE HOO;Lo;0;L;;;;;N;;;;; +A574;VAI SYLLABLE WOO;Lo;0;L;;;;;N;;;;; +A575;VAI SYLLABLE WOON;Lo;0;L;;;;;N;;;;; +A576;VAI SYLLABLE POO;Lo;0;L;;;;;N;;;;; +A577;VAI SYLLABLE BHOO;Lo;0;L;;;;;N;;;;; +A578;VAI SYLLABLE BOO;Lo;0;L;;;;;N;;;;; +A579;VAI SYLLABLE MBOO;Lo;0;L;;;;;N;;;;; +A57A;VAI SYLLABLE KPOO;Lo;0;L;;;;;N;;;;; +A57B;VAI SYLLABLE MGBOO;Lo;0;L;;;;;N;;;;; +A57C;VAI SYLLABLE GBOO;Lo;0;L;;;;;N;;;;; +A57D;VAI SYLLABLE FOO;Lo;0;L;;;;;N;;;;; +A57E;VAI SYLLABLE VOO;Lo;0;L;;;;;N;;;;; +A57F;VAI SYLLABLE TOO;Lo;0;L;;;;;N;;;;; +A580;VAI SYLLABLE THOO;Lo;0;L;;;;;N;;;;; +A581;VAI SYLLABLE DHOO;Lo;0;L;;;;;N;;;;; +A582;VAI SYLLABLE DHHOO;Lo;0;L;;;;;N;;;;; +A583;VAI SYLLABLE LOO;Lo;0;L;;;;;N;;;;; +A584;VAI SYLLABLE ROO;Lo;0;L;;;;;N;;;;; +A585;VAI SYLLABLE DOO;Lo;0;L;;;;;N;;;;; +A586;VAI SYLLABLE NDOO;Lo;0;L;;;;;N;;;;; +A587;VAI SYLLABLE SOO;Lo;0;L;;;;;N;;;;; +A588;VAI SYLLABLE SHOO;Lo;0;L;;;;;N;;;;; +A589;VAI SYLLABLE ZOO;Lo;0;L;;;;;N;;;;; +A58A;VAI SYLLABLE ZHOO;Lo;0;L;;;;;N;;;;; +A58B;VAI SYLLABLE COO;Lo;0;L;;;;;N;;;;; +A58C;VAI SYLLABLE JOO;Lo;0;L;;;;;N;;;;; +A58D;VAI SYLLABLE NJOO;Lo;0;L;;;;;N;;;;; +A58E;VAI SYLLABLE YOO;Lo;0;L;;;;;N;;;;; +A58F;VAI SYLLABLE KOO;Lo;0;L;;;;;N;;;;; +A590;VAI SYLLABLE NGGOO;Lo;0;L;;;;;N;;;;; +A591;VAI SYLLABLE GOO;Lo;0;L;;;;;N;;;;; +A592;VAI SYLLABLE MOO;Lo;0;L;;;;;N;;;;; +A593;VAI SYLLABLE NOO;Lo;0;L;;;;;N;;;;; +A594;VAI SYLLABLE NYOO;Lo;0;L;;;;;N;;;;; +A595;VAI SYLLABLE U;Lo;0;L;;;;;N;;;;; +A596;VAI SYLLABLE UN;Lo;0;L;;;;;N;;;;; +A597;VAI SYLLABLE HU;Lo;0;L;;;;;N;;;;; +A598;VAI SYLLABLE HUN;Lo;0;L;;;;;N;;;;; +A599;VAI SYLLABLE WU;Lo;0;L;;;;;N;;;;; +A59A;VAI SYLLABLE WUN;Lo;0;L;;;;;N;;;;; +A59B;VAI SYLLABLE PU;Lo;0;L;;;;;N;;;;; +A59C;VAI SYLLABLE BHU;Lo;0;L;;;;;N;;;;; +A59D;VAI SYLLABLE BU;Lo;0;L;;;;;N;;;;; +A59E;VAI SYLLABLE MBU;Lo;0;L;;;;;N;;;;; +A59F;VAI SYLLABLE KPU;Lo;0;L;;;;;N;;;;; +A5A0;VAI SYLLABLE MGBU;Lo;0;L;;;;;N;;;;; +A5A1;VAI SYLLABLE GBU;Lo;0;L;;;;;N;;;;; +A5A2;VAI SYLLABLE FU;Lo;0;L;;;;;N;;;;; +A5A3;VAI SYLLABLE VU;Lo;0;L;;;;;N;;;;; +A5A4;VAI SYLLABLE TU;Lo;0;L;;;;;N;;;;; +A5A5;VAI SYLLABLE THU;Lo;0;L;;;;;N;;;;; +A5A6;VAI SYLLABLE DHU;Lo;0;L;;;;;N;;;;; +A5A7;VAI SYLLABLE DHHU;Lo;0;L;;;;;N;;;;; +A5A8;VAI SYLLABLE LU;Lo;0;L;;;;;N;;;;; +A5A9;VAI SYLLABLE RU;Lo;0;L;;;;;N;;;;; +A5AA;VAI SYLLABLE DU;Lo;0;L;;;;;N;;;;; +A5AB;VAI SYLLABLE NDU;Lo;0;L;;;;;N;;;;; +A5AC;VAI SYLLABLE SU;Lo;0;L;;;;;N;;;;; +A5AD;VAI SYLLABLE SHU;Lo;0;L;;;;;N;;;;; +A5AE;VAI SYLLABLE ZU;Lo;0;L;;;;;N;;;;; +A5AF;VAI SYLLABLE ZHU;Lo;0;L;;;;;N;;;;; +A5B0;VAI SYLLABLE CU;Lo;0;L;;;;;N;;;;; +A5B1;VAI SYLLABLE JU;Lo;0;L;;;;;N;;;;; +A5B2;VAI SYLLABLE NJU;Lo;0;L;;;;;N;;;;; +A5B3;VAI SYLLABLE YU;Lo;0;L;;;;;N;;;;; +A5B4;VAI SYLLABLE KU;Lo;0;L;;;;;N;;;;; +A5B5;VAI SYLLABLE NGGU;Lo;0;L;;;;;N;;;;; +A5B6;VAI SYLLABLE GU;Lo;0;L;;;;;N;;;;; +A5B7;VAI SYLLABLE MU;Lo;0;L;;;;;N;;;;; +A5B8;VAI SYLLABLE NU;Lo;0;L;;;;;N;;;;; +A5B9;VAI SYLLABLE NYU;Lo;0;L;;;;;N;;;;; +A5BA;VAI SYLLABLE O;Lo;0;L;;;;;N;;;;; +A5BB;VAI SYLLABLE ON;Lo;0;L;;;;;N;;;;; +A5BC;VAI SYLLABLE NGON;Lo;0;L;;;;;N;;;;; +A5BD;VAI SYLLABLE HO;Lo;0;L;;;;;N;;;;; +A5BE;VAI SYLLABLE HON;Lo;0;L;;;;;N;;;;; +A5BF;VAI SYLLABLE WO;Lo;0;L;;;;;N;;;;; +A5C0;VAI SYLLABLE WON;Lo;0;L;;;;;N;;;;; +A5C1;VAI SYLLABLE PO;Lo;0;L;;;;;N;;;;; +A5C2;VAI SYLLABLE BHO;Lo;0;L;;;;;N;;;;; +A5C3;VAI SYLLABLE BO;Lo;0;L;;;;;N;;;;; +A5C4;VAI SYLLABLE MBO;Lo;0;L;;;;;N;;;;; +A5C5;VAI SYLLABLE KPO;Lo;0;L;;;;;N;;;;; +A5C6;VAI SYLLABLE MGBO;Lo;0;L;;;;;N;;;;; +A5C7;VAI SYLLABLE GBO;Lo;0;L;;;;;N;;;;; +A5C8;VAI SYLLABLE GBON;Lo;0;L;;;;;N;;;;; +A5C9;VAI SYLLABLE FO;Lo;0;L;;;;;N;;;;; +A5CA;VAI SYLLABLE VO;Lo;0;L;;;;;N;;;;; +A5CB;VAI SYLLABLE TO;Lo;0;L;;;;;N;;;;; +A5CC;VAI SYLLABLE THO;Lo;0;L;;;;;N;;;;; +A5CD;VAI SYLLABLE DHO;Lo;0;L;;;;;N;;;;; +A5CE;VAI SYLLABLE DHHO;Lo;0;L;;;;;N;;;;; +A5CF;VAI SYLLABLE LO;Lo;0;L;;;;;N;;;;; +A5D0;VAI SYLLABLE RO;Lo;0;L;;;;;N;;;;; +A5D1;VAI SYLLABLE DO;Lo;0;L;;;;;N;;;;; +A5D2;VAI SYLLABLE NDO;Lo;0;L;;;;;N;;;;; +A5D3;VAI SYLLABLE SO;Lo;0;L;;;;;N;;;;; +A5D4;VAI SYLLABLE SHO;Lo;0;L;;;;;N;;;;; +A5D5;VAI SYLLABLE ZO;Lo;0;L;;;;;N;;;;; +A5D6;VAI SYLLABLE ZHO;Lo;0;L;;;;;N;;;;; +A5D7;VAI SYLLABLE CO;Lo;0;L;;;;;N;;;;; +A5D8;VAI SYLLABLE JO;Lo;0;L;;;;;N;;;;; +A5D9;VAI SYLLABLE NJO;Lo;0;L;;;;;N;;;;; +A5DA;VAI SYLLABLE YO;Lo;0;L;;;;;N;;;;; +A5DB;VAI SYLLABLE KO;Lo;0;L;;;;;N;;;;; +A5DC;VAI SYLLABLE NGGO;Lo;0;L;;;;;N;;;;; +A5DD;VAI SYLLABLE GO;Lo;0;L;;;;;N;;;;; +A5DE;VAI SYLLABLE MO;Lo;0;L;;;;;N;;;;; +A5DF;VAI SYLLABLE NO;Lo;0;L;;;;;N;;;;; +A5E0;VAI SYLLABLE NYO;Lo;0;L;;;;;N;;;;; +A5E1;VAI SYLLABLE E;Lo;0;L;;;;;N;;;;; +A5E2;VAI SYLLABLE EN;Lo;0;L;;;;;N;;;;; +A5E3;VAI SYLLABLE NGEN;Lo;0;L;;;;;N;;;;; +A5E4;VAI SYLLABLE HE;Lo;0;L;;;;;N;;;;; +A5E5;VAI SYLLABLE HEN;Lo;0;L;;;;;N;;;;; +A5E6;VAI SYLLABLE WE;Lo;0;L;;;;;N;;;;; +A5E7;VAI SYLLABLE WEN;Lo;0;L;;;;;N;;;;; +A5E8;VAI SYLLABLE PE;Lo;0;L;;;;;N;;;;; +A5E9;VAI SYLLABLE BHE;Lo;0;L;;;;;N;;;;; +A5EA;VAI SYLLABLE BE;Lo;0;L;;;;;N;;;;; +A5EB;VAI SYLLABLE MBE;Lo;0;L;;;;;N;;;;; +A5EC;VAI SYLLABLE KPE;Lo;0;L;;;;;N;;;;; +A5ED;VAI SYLLABLE KPEN;Lo;0;L;;;;;N;;;;; +A5EE;VAI SYLLABLE MGBE;Lo;0;L;;;;;N;;;;; +A5EF;VAI SYLLABLE GBE;Lo;0;L;;;;;N;;;;; +A5F0;VAI SYLLABLE GBEN;Lo;0;L;;;;;N;;;;; +A5F1;VAI SYLLABLE FE;Lo;0;L;;;;;N;;;;; +A5F2;VAI SYLLABLE VE;Lo;0;L;;;;;N;;;;; +A5F3;VAI SYLLABLE TE;Lo;0;L;;;;;N;;;;; +A5F4;VAI SYLLABLE THE;Lo;0;L;;;;;N;;;;; +A5F5;VAI SYLLABLE DHE;Lo;0;L;;;;;N;;;;; +A5F6;VAI SYLLABLE DHHE;Lo;0;L;;;;;N;;;;; +A5F7;VAI SYLLABLE LE;Lo;0;L;;;;;N;;;;; +A5F8;VAI SYLLABLE RE;Lo;0;L;;;;;N;;;;; +A5F9;VAI SYLLABLE DE;Lo;0;L;;;;;N;;;;; +A5FA;VAI SYLLABLE NDE;Lo;0;L;;;;;N;;;;; +A5FB;VAI SYLLABLE SE;Lo;0;L;;;;;N;;;;; +A5FC;VAI SYLLABLE SHE;Lo;0;L;;;;;N;;;;; +A5FD;VAI SYLLABLE ZE;Lo;0;L;;;;;N;;;;; +A5FE;VAI SYLLABLE ZHE;Lo;0;L;;;;;N;;;;; +A5FF;VAI SYLLABLE CE;Lo;0;L;;;;;N;;;;; +A600;VAI SYLLABLE JE;Lo;0;L;;;;;N;;;;; +A601;VAI SYLLABLE NJE;Lo;0;L;;;;;N;;;;; +A602;VAI SYLLABLE YE;Lo;0;L;;;;;N;;;;; +A603;VAI SYLLABLE KE;Lo;0;L;;;;;N;;;;; +A604;VAI SYLLABLE NGGE;Lo;0;L;;;;;N;;;;; +A605;VAI SYLLABLE NGGEN;Lo;0;L;;;;;N;;;;; +A606;VAI SYLLABLE GE;Lo;0;L;;;;;N;;;;; +A607;VAI SYLLABLE GEN;Lo;0;L;;;;;N;;;;; +A608;VAI SYLLABLE ME;Lo;0;L;;;;;N;;;;; +A609;VAI SYLLABLE NE;Lo;0;L;;;;;N;;;;; +A60A;VAI SYLLABLE NYE;Lo;0;L;;;;;N;;;;; +A60B;VAI SYLLABLE NG;Lo;0;L;;;;;N;;;;; +A60C;VAI SYLLABLE LENGTHENER;Lm;0;L;;;;;N;;;;; +A60D;VAI COMMA;Po;0;ON;;;;;N;;;;; +A60E;VAI FULL STOP;Po;0;ON;;;;;N;;;;; +A60F;VAI QUESTION MARK;Po;0;ON;;;;;N;;;;; +A610;VAI SYLLABLE NDOLE FA;Lo;0;L;;;;;N;;;;; +A611;VAI SYLLABLE NDOLE KA;Lo;0;L;;;;;N;;;;; +A612;VAI SYLLABLE NDOLE SOO;Lo;0;L;;;;;N;;;;; +A613;VAI SYMBOL FEENG;Lo;0;L;;;;;N;;;;; +A614;VAI SYMBOL KEENG;Lo;0;L;;;;;N;;;;; +A615;VAI SYMBOL TING;Lo;0;L;;;;;N;;;;; +A616;VAI SYMBOL NII;Lo;0;L;;;;;N;;;;; +A617;VAI SYMBOL BANG;Lo;0;L;;;;;N;;;;; +A618;VAI SYMBOL FAA;Lo;0;L;;;;;N;;;;; +A619;VAI SYMBOL TAA;Lo;0;L;;;;;N;;;;; +A61A;VAI SYMBOL DANG;Lo;0;L;;;;;N;;;;; +A61B;VAI SYMBOL DOONG;Lo;0;L;;;;;N;;;;; +A61C;VAI SYMBOL KUNG;Lo;0;L;;;;;N;;;;; +A61D;VAI SYMBOL TONG;Lo;0;L;;;;;N;;;;; +A61E;VAI SYMBOL DO-O;Lo;0;L;;;;;N;;;;; +A61F;VAI SYMBOL JONG;Lo;0;L;;;;;N;;;;; +A620;VAI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +A621;VAI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +A622;VAI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +A623;VAI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +A624;VAI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +A625;VAI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +A626;VAI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +A627;VAI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +A628;VAI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +A629;VAI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +A62A;VAI SYLLABLE NDOLE MA;Lo;0;L;;;;;N;;;;; +A62B;VAI SYLLABLE NDOLE DO;Lo;0;L;;;;;N;;;;; +A640;CYRILLIC CAPITAL LETTER ZEMLYA;Lu;0;L;;;;;N;;;;A641; +A641;CYRILLIC SMALL LETTER ZEMLYA;Ll;0;L;;;;;N;;;A640;;A640 +A642;CYRILLIC CAPITAL LETTER DZELO;Lu;0;L;;;;;N;;;;A643; +A643;CYRILLIC SMALL LETTER DZELO;Ll;0;L;;;;;N;;;A642;;A642 +A644;CYRILLIC CAPITAL LETTER REVERSED DZE;Lu;0;L;;;;;N;;;;A645; +A645;CYRILLIC SMALL LETTER REVERSED DZE;Ll;0;L;;;;;N;;;A644;;A644 +A646;CYRILLIC CAPITAL LETTER IOTA;Lu;0;L;;;;;N;;;;A647; +A647;CYRILLIC SMALL LETTER IOTA;Ll;0;L;;;;;N;;;A646;;A646 +A648;CYRILLIC CAPITAL LETTER DJERV;Lu;0;L;;;;;N;;;;A649; +A649;CYRILLIC SMALL LETTER DJERV;Ll;0;L;;;;;N;;;A648;;A648 +A64A;CYRILLIC CAPITAL LETTER MONOGRAPH UK;Lu;0;L;;;;;N;;;;A64B; +A64B;CYRILLIC SMALL LETTER MONOGRAPH UK;Ll;0;L;;;;;N;;;A64A;;A64A +A64C;CYRILLIC CAPITAL LETTER BROAD OMEGA;Lu;0;L;;;;;N;;;;A64D; +A64D;CYRILLIC SMALL LETTER BROAD OMEGA;Ll;0;L;;;;;N;;;A64C;;A64C +A64E;CYRILLIC CAPITAL LETTER NEUTRAL YER;Lu;0;L;;;;;N;;;;A64F; +A64F;CYRILLIC SMALL LETTER NEUTRAL YER;Ll;0;L;;;;;N;;;A64E;;A64E +A650;CYRILLIC CAPITAL LETTER YERU WITH BACK YER;Lu;0;L;;;;;N;;;;A651; +A651;CYRILLIC SMALL LETTER YERU WITH BACK YER;Ll;0;L;;;;;N;;;A650;;A650 +A652;CYRILLIC CAPITAL LETTER IOTIFIED YAT;Lu;0;L;;;;;N;;;;A653; +A653;CYRILLIC SMALL LETTER IOTIFIED YAT;Ll;0;L;;;;;N;;;A652;;A652 +A654;CYRILLIC CAPITAL LETTER REVERSED YU;Lu;0;L;;;;;N;;;;A655; +A655;CYRILLIC SMALL LETTER REVERSED YU;Ll;0;L;;;;;N;;;A654;;A654 +A656;CYRILLIC CAPITAL LETTER IOTIFIED A;Lu;0;L;;;;;N;;;;A657; +A657;CYRILLIC SMALL LETTER IOTIFIED A;Ll;0;L;;;;;N;;;A656;;A656 +A658;CYRILLIC CAPITAL LETTER CLOSED LITTLE YUS;Lu;0;L;;;;;N;;;;A659; +A659;CYRILLIC SMALL LETTER CLOSED LITTLE YUS;Ll;0;L;;;;;N;;;A658;;A658 +A65A;CYRILLIC CAPITAL LETTER BLENDED YUS;Lu;0;L;;;;;N;;;;A65B; +A65B;CYRILLIC SMALL LETTER BLENDED YUS;Ll;0;L;;;;;N;;;A65A;;A65A +A65C;CYRILLIC CAPITAL LETTER IOTIFIED CLOSED LITTLE YUS;Lu;0;L;;;;;N;;;;A65D; +A65D;CYRILLIC SMALL LETTER IOTIFIED CLOSED LITTLE YUS;Ll;0;L;;;;;N;;;A65C;;A65C +A65E;CYRILLIC CAPITAL LETTER YN;Lu;0;L;;;;;N;;;;A65F; +A65F;CYRILLIC SMALL LETTER YN;Ll;0;L;;;;;N;;;A65E;;A65E +A660;CYRILLIC CAPITAL LETTER REVERSED TSE;Lu;0;L;;;;;N;;;;A661; +A661;CYRILLIC SMALL LETTER REVERSED TSE;Ll;0;L;;;;;N;;;A660;;A660 +A662;CYRILLIC CAPITAL LETTER SOFT DE;Lu;0;L;;;;;N;;;;A663; +A663;CYRILLIC SMALL LETTER SOFT DE;Ll;0;L;;;;;N;;;A662;;A662 +A664;CYRILLIC CAPITAL LETTER SOFT EL;Lu;0;L;;;;;N;;;;A665; +A665;CYRILLIC SMALL LETTER SOFT EL;Ll;0;L;;;;;N;;;A664;;A664 +A666;CYRILLIC CAPITAL LETTER SOFT EM;Lu;0;L;;;;;N;;;;A667; +A667;CYRILLIC SMALL LETTER SOFT EM;Ll;0;L;;;;;N;;;A666;;A666 +A668;CYRILLIC CAPITAL LETTER MONOCULAR O;Lu;0;L;;;;;N;;;;A669; +A669;CYRILLIC SMALL LETTER MONOCULAR O;Ll;0;L;;;;;N;;;A668;;A668 +A66A;CYRILLIC CAPITAL LETTER BINOCULAR O;Lu;0;L;;;;;N;;;;A66B; +A66B;CYRILLIC SMALL LETTER BINOCULAR O;Ll;0;L;;;;;N;;;A66A;;A66A +A66C;CYRILLIC CAPITAL LETTER DOUBLE MONOCULAR O;Lu;0;L;;;;;N;;;;A66D; +A66D;CYRILLIC SMALL LETTER DOUBLE MONOCULAR O;Ll;0;L;;;;;N;;;A66C;;A66C +A66E;CYRILLIC LETTER MULTIOCULAR O;Lo;0;L;;;;;N;;;;; +A66F;COMBINING CYRILLIC VZMET;Mn;230;NSM;;;;;N;;;;; +A670;COMBINING CYRILLIC TEN MILLIONS SIGN;Me;0;NSM;;;;;N;;;;; +A671;COMBINING CYRILLIC HUNDRED MILLIONS SIGN;Me;0;NSM;;;;;N;;;;; +A672;COMBINING CYRILLIC THOUSAND MILLIONS SIGN;Me;0;NSM;;;;;N;;;;; +A673;SLAVONIC ASTERISK;Po;0;ON;;;;;N;;;;; +A674;COMBINING CYRILLIC LETTER UKRAINIAN IE;Mn;230;NSM;;;;;N;;;;; +A675;COMBINING CYRILLIC LETTER I;Mn;230;NSM;;;;;N;;;;; +A676;COMBINING CYRILLIC LETTER YI;Mn;230;NSM;;;;;N;;;;; +A677;COMBINING CYRILLIC LETTER U;Mn;230;NSM;;;;;N;;;;; +A678;COMBINING CYRILLIC LETTER HARD SIGN;Mn;230;NSM;;;;;N;;;;; +A679;COMBINING CYRILLIC LETTER YERU;Mn;230;NSM;;;;;N;;;;; +A67A;COMBINING CYRILLIC LETTER SOFT SIGN;Mn;230;NSM;;;;;N;;;;; +A67B;COMBINING CYRILLIC LETTER OMEGA;Mn;230;NSM;;;;;N;;;;; +A67C;COMBINING CYRILLIC KAVYKA;Mn;230;NSM;;;;;N;;;;; +A67D;COMBINING CYRILLIC PAYEROK;Mn;230;NSM;;;;;N;;;;; +A67E;CYRILLIC KAVYKA;Po;0;ON;;;;;N;;;;; +A67F;CYRILLIC PAYEROK;Lm;0;ON;;;;;N;;;;; +A680;CYRILLIC CAPITAL LETTER DWE;Lu;0;L;;;;;N;;;;A681; +A681;CYRILLIC SMALL LETTER DWE;Ll;0;L;;;;;N;;;A680;;A680 +A682;CYRILLIC CAPITAL LETTER DZWE;Lu;0;L;;;;;N;;;;A683; +A683;CYRILLIC SMALL LETTER DZWE;Ll;0;L;;;;;N;;;A682;;A682 +A684;CYRILLIC CAPITAL LETTER ZHWE;Lu;0;L;;;;;N;;;;A685; +A685;CYRILLIC SMALL LETTER ZHWE;Ll;0;L;;;;;N;;;A684;;A684 +A686;CYRILLIC CAPITAL LETTER CCHE;Lu;0;L;;;;;N;;;;A687; +A687;CYRILLIC SMALL LETTER CCHE;Ll;0;L;;;;;N;;;A686;;A686 +A688;CYRILLIC CAPITAL LETTER DZZE;Lu;0;L;;;;;N;;;;A689; +A689;CYRILLIC SMALL LETTER DZZE;Ll;0;L;;;;;N;;;A688;;A688 +A68A;CYRILLIC CAPITAL LETTER TE WITH MIDDLE HOOK;Lu;0;L;;;;;N;;;;A68B; +A68B;CYRILLIC SMALL LETTER TE WITH MIDDLE HOOK;Ll;0;L;;;;;N;;;A68A;;A68A +A68C;CYRILLIC CAPITAL LETTER TWE;Lu;0;L;;;;;N;;;;A68D; +A68D;CYRILLIC SMALL LETTER TWE;Ll;0;L;;;;;N;;;A68C;;A68C +A68E;CYRILLIC CAPITAL LETTER TSWE;Lu;0;L;;;;;N;;;;A68F; +A68F;CYRILLIC SMALL LETTER TSWE;Ll;0;L;;;;;N;;;A68E;;A68E +A690;CYRILLIC CAPITAL LETTER TSSE;Lu;0;L;;;;;N;;;;A691; +A691;CYRILLIC SMALL LETTER TSSE;Ll;0;L;;;;;N;;;A690;;A690 +A692;CYRILLIC CAPITAL LETTER TCHE;Lu;0;L;;;;;N;;;;A693; +A693;CYRILLIC SMALL LETTER TCHE;Ll;0;L;;;;;N;;;A692;;A692 +A694;CYRILLIC CAPITAL LETTER HWE;Lu;0;L;;;;;N;;;;A695; +A695;CYRILLIC SMALL LETTER HWE;Ll;0;L;;;;;N;;;A694;;A694 +A696;CYRILLIC CAPITAL LETTER SHWE;Lu;0;L;;;;;N;;;;A697; +A697;CYRILLIC SMALL LETTER SHWE;Ll;0;L;;;;;N;;;A696;;A696 +A698;CYRILLIC CAPITAL LETTER DOUBLE O;Lu;0;L;;;;;N;;;;A699; +A699;CYRILLIC SMALL LETTER DOUBLE O;Ll;0;L;;;;;N;;;A698;;A698 +A69A;CYRILLIC CAPITAL LETTER CROSSED O;Lu;0;L;;;;;N;;;;A69B; +A69B;CYRILLIC SMALL LETTER CROSSED O;Ll;0;L;;;;;N;;;A69A;;A69A +A69C;MODIFIER LETTER CYRILLIC HARD SIGN;Lm;0;L;<super> 044A;;;;N;;;;; +A69D;MODIFIER LETTER CYRILLIC SOFT SIGN;Lm;0;L;<super> 044C;;;;N;;;;; +A69E;COMBINING CYRILLIC LETTER EF;Mn;230;NSM;;;;;N;;;;; +A69F;COMBINING CYRILLIC LETTER IOTIFIED E;Mn;230;NSM;;;;;N;;;;; +A6A0;BAMUM LETTER A;Lo;0;L;;;;;N;;;;; +A6A1;BAMUM LETTER KA;Lo;0;L;;;;;N;;;;; +A6A2;BAMUM LETTER U;Lo;0;L;;;;;N;;;;; +A6A3;BAMUM LETTER KU;Lo;0;L;;;;;N;;;;; +A6A4;BAMUM LETTER EE;Lo;0;L;;;;;N;;;;; +A6A5;BAMUM LETTER REE;Lo;0;L;;;;;N;;;;; +A6A6;BAMUM LETTER TAE;Lo;0;L;;;;;N;;;;; +A6A7;BAMUM LETTER O;Lo;0;L;;;;;N;;;;; +A6A8;BAMUM LETTER NYI;Lo;0;L;;;;;N;;;;; +A6A9;BAMUM LETTER I;Lo;0;L;;;;;N;;;;; +A6AA;BAMUM LETTER LA;Lo;0;L;;;;;N;;;;; +A6AB;BAMUM LETTER PA;Lo;0;L;;;;;N;;;;; +A6AC;BAMUM LETTER RII;Lo;0;L;;;;;N;;;;; +A6AD;BAMUM LETTER RIEE;Lo;0;L;;;;;N;;;;; +A6AE;BAMUM LETTER LEEEE;Lo;0;L;;;;;N;;;;; +A6AF;BAMUM LETTER MEEEE;Lo;0;L;;;;;N;;;;; +A6B0;BAMUM LETTER TAA;Lo;0;L;;;;;N;;;;; +A6B1;BAMUM LETTER NDAA;Lo;0;L;;;;;N;;;;; +A6B2;BAMUM LETTER NJAEM;Lo;0;L;;;;;N;;;;; +A6B3;BAMUM LETTER M;Lo;0;L;;;;;N;;;;; +A6B4;BAMUM LETTER SUU;Lo;0;L;;;;;N;;;;; +A6B5;BAMUM LETTER MU;Lo;0;L;;;;;N;;;;; +A6B6;BAMUM LETTER SHII;Lo;0;L;;;;;N;;;;; +A6B7;BAMUM LETTER SI;Lo;0;L;;;;;N;;;;; +A6B8;BAMUM LETTER SHEUX;Lo;0;L;;;;;N;;;;; +A6B9;BAMUM LETTER SEUX;Lo;0;L;;;;;N;;;;; +A6BA;BAMUM LETTER KYEE;Lo;0;L;;;;;N;;;;; +A6BB;BAMUM LETTER KET;Lo;0;L;;;;;N;;;;; +A6BC;BAMUM LETTER NUAE;Lo;0;L;;;;;N;;;;; +A6BD;BAMUM LETTER NU;Lo;0;L;;;;;N;;;;; +A6BE;BAMUM LETTER NJUAE;Lo;0;L;;;;;N;;;;; +A6BF;BAMUM LETTER YOQ;Lo;0;L;;;;;N;;;;; +A6C0;BAMUM LETTER SHU;Lo;0;L;;;;;N;;;;; +A6C1;BAMUM LETTER YUQ;Lo;0;L;;;;;N;;;;; +A6C2;BAMUM LETTER YA;Lo;0;L;;;;;N;;;;; +A6C3;BAMUM LETTER NSHA;Lo;0;L;;;;;N;;;;; +A6C4;BAMUM LETTER KEUX;Lo;0;L;;;;;N;;;;; +A6C5;BAMUM LETTER PEUX;Lo;0;L;;;;;N;;;;; +A6C6;BAMUM LETTER NJEE;Lo;0;L;;;;;N;;;;; +A6C7;BAMUM LETTER NTEE;Lo;0;L;;;;;N;;;;; +A6C8;BAMUM LETTER PUE;Lo;0;L;;;;;N;;;;; +A6C9;BAMUM LETTER WUE;Lo;0;L;;;;;N;;;;; +A6CA;BAMUM LETTER PEE;Lo;0;L;;;;;N;;;;; +A6CB;BAMUM LETTER FEE;Lo;0;L;;;;;N;;;;; +A6CC;BAMUM LETTER RU;Lo;0;L;;;;;N;;;;; +A6CD;BAMUM LETTER LU;Lo;0;L;;;;;N;;;;; +A6CE;BAMUM LETTER MI;Lo;0;L;;;;;N;;;;; +A6CF;BAMUM LETTER NI;Lo;0;L;;;;;N;;;;; +A6D0;BAMUM LETTER REUX;Lo;0;L;;;;;N;;;;; +A6D1;BAMUM LETTER RAE;Lo;0;L;;;;;N;;;;; +A6D2;BAMUM LETTER KEN;Lo;0;L;;;;;N;;;;; +A6D3;BAMUM LETTER NGKWAEN;Lo;0;L;;;;;N;;;;; +A6D4;BAMUM LETTER NGGA;Lo;0;L;;;;;N;;;;; +A6D5;BAMUM LETTER NGA;Lo;0;L;;;;;N;;;;; +A6D6;BAMUM LETTER SHO;Lo;0;L;;;;;N;;;;; +A6D7;BAMUM LETTER PUAE;Lo;0;L;;;;;N;;;;; +A6D8;BAMUM LETTER FU;Lo;0;L;;;;;N;;;;; +A6D9;BAMUM LETTER FOM;Lo;0;L;;;;;N;;;;; +A6DA;BAMUM LETTER WA;Lo;0;L;;;;;N;;;;; +A6DB;BAMUM LETTER NA;Lo;0;L;;;;;N;;;;; +A6DC;BAMUM LETTER LI;Lo;0;L;;;;;N;;;;; +A6DD;BAMUM LETTER PI;Lo;0;L;;;;;N;;;;; +A6DE;BAMUM LETTER LOQ;Lo;0;L;;;;;N;;;;; +A6DF;BAMUM LETTER KO;Lo;0;L;;;;;N;;;;; +A6E0;BAMUM LETTER MBEN;Lo;0;L;;;;;N;;;;; +A6E1;BAMUM LETTER REN;Lo;0;L;;;;;N;;;;; +A6E2;BAMUM LETTER MEN;Lo;0;L;;;;;N;;;;; +A6E3;BAMUM LETTER MA;Lo;0;L;;;;;N;;;;; +A6E4;BAMUM LETTER TI;Lo;0;L;;;;;N;;;;; +A6E5;BAMUM LETTER KI;Lo;0;L;;;;;N;;;;; +A6E6;BAMUM LETTER MO;Nl;0;L;;;;1;N;;;;; +A6E7;BAMUM LETTER MBAA;Nl;0;L;;;;2;N;;;;; +A6E8;BAMUM LETTER TET;Nl;0;L;;;;3;N;;;;; +A6E9;BAMUM LETTER KPA;Nl;0;L;;;;4;N;;;;; +A6EA;BAMUM LETTER TEN;Nl;0;L;;;;5;N;;;;; +A6EB;BAMUM LETTER NTUU;Nl;0;L;;;;6;N;;;;; +A6EC;BAMUM LETTER SAMBA;Nl;0;L;;;;7;N;;;;; +A6ED;BAMUM LETTER FAAMAE;Nl;0;L;;;;8;N;;;;; +A6EE;BAMUM LETTER KOVUU;Nl;0;L;;;;9;N;;;;; +A6EF;BAMUM LETTER KOGHOM;Nl;0;L;;;;0;N;;;;; +A6F0;BAMUM COMBINING MARK KOQNDON;Mn;230;NSM;;;;;N;;;;; +A6F1;BAMUM COMBINING MARK TUKWENTIS;Mn;230;NSM;;;;;N;;;;; +A6F2;BAMUM NJAEMLI;Po;0;L;;;;;N;;;;; +A6F3;BAMUM FULL STOP;Po;0;L;;;;;N;;;;; +A6F4;BAMUM COLON;Po;0;L;;;;;N;;;;; +A6F5;BAMUM COMMA;Po;0;L;;;;;N;;;;; +A6F6;BAMUM SEMICOLON;Po;0;L;;;;;N;;;;; +A6F7;BAMUM QUESTION MARK;Po;0;L;;;;;N;;;;; +A700;MODIFIER LETTER CHINESE TONE YIN PING;Sk;0;ON;;;;;N;;;;; +A701;MODIFIER LETTER CHINESE TONE YANG PING;Sk;0;ON;;;;;N;;;;; +A702;MODIFIER LETTER CHINESE TONE YIN SHANG;Sk;0;ON;;;;;N;;;;; +A703;MODIFIER LETTER CHINESE TONE YANG SHANG;Sk;0;ON;;;;;N;;;;; +A704;MODIFIER LETTER CHINESE TONE YIN QU;Sk;0;ON;;;;;N;;;;; +A705;MODIFIER LETTER CHINESE TONE YANG QU;Sk;0;ON;;;;;N;;;;; +A706;MODIFIER LETTER CHINESE TONE YIN RU;Sk;0;ON;;;;;N;;;;; +A707;MODIFIER LETTER CHINESE TONE YANG RU;Sk;0;ON;;;;;N;;;;; +A708;MODIFIER LETTER EXTRA-HIGH DOTTED TONE BAR;Sk;0;ON;;;;;N;;;;; +A709;MODIFIER LETTER HIGH DOTTED TONE BAR;Sk;0;ON;;;;;N;;;;; +A70A;MODIFIER LETTER MID DOTTED TONE BAR;Sk;0;ON;;;;;N;;;;; +A70B;MODIFIER LETTER LOW DOTTED TONE BAR;Sk;0;ON;;;;;N;;;;; +A70C;MODIFIER LETTER EXTRA-LOW DOTTED TONE BAR;Sk;0;ON;;;;;N;;;;; +A70D;MODIFIER LETTER EXTRA-HIGH DOTTED LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; +A70E;MODIFIER LETTER HIGH DOTTED LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; +A70F;MODIFIER LETTER MID DOTTED LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; +A710;MODIFIER LETTER LOW DOTTED LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; +A711;MODIFIER LETTER EXTRA-LOW DOTTED LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; +A712;MODIFIER LETTER EXTRA-HIGH LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; +A713;MODIFIER LETTER HIGH LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; +A714;MODIFIER LETTER MID LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; +A715;MODIFIER LETTER LOW LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; +A716;MODIFIER LETTER EXTRA-LOW LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; +A717;MODIFIER LETTER DOT VERTICAL BAR;Lm;0;ON;;;;;N;;;;; +A718;MODIFIER LETTER DOT SLASH;Lm;0;ON;;;;;N;;;;; +A719;MODIFIER LETTER DOT HORIZONTAL BAR;Lm;0;ON;;;;;N;;;;; +A71A;MODIFIER LETTER LOWER RIGHT CORNER ANGLE;Lm;0;ON;;;;;N;;;;; +A71B;MODIFIER LETTER RAISED UP ARROW;Lm;0;ON;;;;;N;;;;; +A71C;MODIFIER LETTER RAISED DOWN ARROW;Lm;0;ON;;;;;N;;;;; +A71D;MODIFIER LETTER RAISED EXCLAMATION MARK;Lm;0;ON;;;;;N;;;;; +A71E;MODIFIER LETTER RAISED INVERTED EXCLAMATION MARK;Lm;0;ON;;;;;N;;;;; +A71F;MODIFIER LETTER LOW INVERTED EXCLAMATION MARK;Lm;0;ON;;;;;N;;;;; +A720;MODIFIER LETTER STRESS AND HIGH TONE;Sk;0;ON;;;;;N;;;;; +A721;MODIFIER LETTER STRESS AND LOW TONE;Sk;0;ON;;;;;N;;;;; +A722;LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF;Lu;0;L;;;;;N;;;;A723; +A723;LATIN SMALL LETTER EGYPTOLOGICAL ALEF;Ll;0;L;;;;;N;;;A722;;A722 +A724;LATIN CAPITAL LETTER EGYPTOLOGICAL AIN;Lu;0;L;;;;;N;;;;A725; +A725;LATIN SMALL LETTER EGYPTOLOGICAL AIN;Ll;0;L;;;;;N;;;A724;;A724 +A726;LATIN CAPITAL LETTER HENG;Lu;0;L;;;;;N;;;;A727; +A727;LATIN SMALL LETTER HENG;Ll;0;L;;;;;N;;;A726;;A726 +A728;LATIN CAPITAL LETTER TZ;Lu;0;L;;;;;N;;;;A729; +A729;LATIN SMALL LETTER TZ;Ll;0;L;;;;;N;;;A728;;A728 +A72A;LATIN CAPITAL LETTER TRESILLO;Lu;0;L;;;;;N;;;;A72B; +A72B;LATIN SMALL LETTER TRESILLO;Ll;0;L;;;;;N;;;A72A;;A72A +A72C;LATIN CAPITAL LETTER CUATRILLO;Lu;0;L;;;;;N;;;;A72D; +A72D;LATIN SMALL LETTER CUATRILLO;Ll;0;L;;;;;N;;;A72C;;A72C +A72E;LATIN CAPITAL LETTER CUATRILLO WITH COMMA;Lu;0;L;;;;;N;;;;A72F; +A72F;LATIN SMALL LETTER CUATRILLO WITH COMMA;Ll;0;L;;;;;N;;;A72E;;A72E +A730;LATIN LETTER SMALL CAPITAL F;Ll;0;L;;;;;N;;;;; +A731;LATIN LETTER SMALL CAPITAL S;Ll;0;L;;;;;N;;;;; +A732;LATIN CAPITAL LETTER AA;Lu;0;L;;;;;N;;;;A733; +A733;LATIN SMALL LETTER AA;Ll;0;L;;;;;N;;;A732;;A732 +A734;LATIN CAPITAL LETTER AO;Lu;0;L;;;;;N;;;;A735; +A735;LATIN SMALL LETTER AO;Ll;0;L;;;;;N;;;A734;;A734 +A736;LATIN CAPITAL LETTER AU;Lu;0;L;;;;;N;;;;A737; +A737;LATIN SMALL LETTER AU;Ll;0;L;;;;;N;;;A736;;A736 +A738;LATIN CAPITAL LETTER AV;Lu;0;L;;;;;N;;;;A739; +A739;LATIN SMALL LETTER AV;Ll;0;L;;;;;N;;;A738;;A738 +A73A;LATIN CAPITAL LETTER AV WITH HORIZONTAL BAR;Lu;0;L;;;;;N;;;;A73B; +A73B;LATIN SMALL LETTER AV WITH HORIZONTAL BAR;Ll;0;L;;;;;N;;;A73A;;A73A +A73C;LATIN CAPITAL LETTER AY;Lu;0;L;;;;;N;;;;A73D; +A73D;LATIN SMALL LETTER AY;Ll;0;L;;;;;N;;;A73C;;A73C +A73E;LATIN CAPITAL LETTER REVERSED C WITH DOT;Lu;0;L;;;;;N;;;;A73F; +A73F;LATIN SMALL LETTER REVERSED C WITH DOT;Ll;0;L;;;;;N;;;A73E;;A73E +A740;LATIN CAPITAL LETTER K WITH STROKE;Lu;0;L;;;;;N;;;;A741; +A741;LATIN SMALL LETTER K WITH STROKE;Ll;0;L;;;;;N;;;A740;;A740 +A742;LATIN CAPITAL LETTER K WITH DIAGONAL STROKE;Lu;0;L;;;;;N;;;;A743; +A743;LATIN SMALL LETTER K WITH DIAGONAL STROKE;Ll;0;L;;;;;N;;;A742;;A742 +A744;LATIN CAPITAL LETTER K WITH STROKE AND DIAGONAL STROKE;Lu;0;L;;;;;N;;;;A745; +A745;LATIN SMALL LETTER K WITH STROKE AND DIAGONAL STROKE;Ll;0;L;;;;;N;;;A744;;A744 +A746;LATIN CAPITAL LETTER BROKEN L;Lu;0;L;;;;;N;;;;A747; +A747;LATIN SMALL LETTER BROKEN L;Ll;0;L;;;;;N;;;A746;;A746 +A748;LATIN CAPITAL LETTER L WITH HIGH STROKE;Lu;0;L;;;;;N;;;;A749; +A749;LATIN SMALL LETTER L WITH HIGH STROKE;Ll;0;L;;;;;N;;;A748;;A748 +A74A;LATIN CAPITAL LETTER O WITH LONG STROKE OVERLAY;Lu;0;L;;;;;N;;;;A74B; +A74B;LATIN SMALL LETTER O WITH LONG STROKE OVERLAY;Ll;0;L;;;;;N;;;A74A;;A74A +A74C;LATIN CAPITAL LETTER O WITH LOOP;Lu;0;L;;;;;N;;;;A74D; +A74D;LATIN SMALL LETTER O WITH LOOP;Ll;0;L;;;;;N;;;A74C;;A74C +A74E;LATIN CAPITAL LETTER OO;Lu;0;L;;;;;N;;;;A74F; +A74F;LATIN SMALL LETTER OO;Ll;0;L;;;;;N;;;A74E;;A74E +A750;LATIN CAPITAL LETTER P WITH STROKE THROUGH DESCENDER;Lu;0;L;;;;;N;;;;A751; +A751;LATIN SMALL LETTER P WITH STROKE THROUGH DESCENDER;Ll;0;L;;;;;N;;;A750;;A750 +A752;LATIN CAPITAL LETTER P WITH FLOURISH;Lu;0;L;;;;;N;;;;A753; +A753;LATIN SMALL LETTER P WITH FLOURISH;Ll;0;L;;;;;N;;;A752;;A752 +A754;LATIN CAPITAL LETTER P WITH SQUIRREL TAIL;Lu;0;L;;;;;N;;;;A755; +A755;LATIN SMALL LETTER P WITH SQUIRREL TAIL;Ll;0;L;;;;;N;;;A754;;A754 +A756;LATIN CAPITAL LETTER Q WITH STROKE THROUGH DESCENDER;Lu;0;L;;;;;N;;;;A757; +A757;LATIN SMALL LETTER Q WITH STROKE THROUGH DESCENDER;Ll;0;L;;;;;N;;;A756;;A756 +A758;LATIN CAPITAL LETTER Q WITH DIAGONAL STROKE;Lu;0;L;;;;;N;;;;A759; +A759;LATIN SMALL LETTER Q WITH DIAGONAL STROKE;Ll;0;L;;;;;N;;;A758;;A758 +A75A;LATIN CAPITAL LETTER R ROTUNDA;Lu;0;L;;;;;N;;;;A75B; +A75B;LATIN SMALL LETTER R ROTUNDA;Ll;0;L;;;;;N;;;A75A;;A75A +A75C;LATIN CAPITAL LETTER RUM ROTUNDA;Lu;0;L;;;;;N;;;;A75D; +A75D;LATIN SMALL LETTER RUM ROTUNDA;Ll;0;L;;;;;N;;;A75C;;A75C +A75E;LATIN CAPITAL LETTER V WITH DIAGONAL STROKE;Lu;0;L;;;;;N;;;;A75F; +A75F;LATIN SMALL LETTER V WITH DIAGONAL STROKE;Ll;0;L;;;;;N;;;A75E;;A75E +A760;LATIN CAPITAL LETTER VY;Lu;0;L;;;;;N;;;;A761; +A761;LATIN SMALL LETTER VY;Ll;0;L;;;;;N;;;A760;;A760 +A762;LATIN CAPITAL LETTER VISIGOTHIC Z;Lu;0;L;;;;;N;;;;A763; +A763;LATIN SMALL LETTER VISIGOTHIC Z;Ll;0;L;;;;;N;;;A762;;A762 +A764;LATIN CAPITAL LETTER THORN WITH STROKE;Lu;0;L;;;;;N;;;;A765; +A765;LATIN SMALL LETTER THORN WITH STROKE;Ll;0;L;;;;;N;;;A764;;A764 +A766;LATIN CAPITAL LETTER THORN WITH STROKE THROUGH DESCENDER;Lu;0;L;;;;;N;;;;A767; +A767;LATIN SMALL LETTER THORN WITH STROKE THROUGH DESCENDER;Ll;0;L;;;;;N;;;A766;;A766 +A768;LATIN CAPITAL LETTER VEND;Lu;0;L;;;;;N;;;;A769; +A769;LATIN SMALL LETTER VEND;Ll;0;L;;;;;N;;;A768;;A768 +A76A;LATIN CAPITAL LETTER ET;Lu;0;L;;;;;N;;;;A76B; +A76B;LATIN SMALL LETTER ET;Ll;0;L;;;;;N;;;A76A;;A76A +A76C;LATIN CAPITAL LETTER IS;Lu;0;L;;;;;N;;;;A76D; +A76D;LATIN SMALL LETTER IS;Ll;0;L;;;;;N;;;A76C;;A76C +A76E;LATIN CAPITAL LETTER CON;Lu;0;L;;;;;N;;;;A76F; +A76F;LATIN SMALL LETTER CON;Ll;0;L;;;;;N;;;A76E;;A76E +A770;MODIFIER LETTER US;Lm;0;L;<super> A76F;;;;N;;;;; +A771;LATIN SMALL LETTER DUM;Ll;0;L;;;;;N;;;;; +A772;LATIN SMALL LETTER LUM;Ll;0;L;;;;;N;;;;; +A773;LATIN SMALL LETTER MUM;Ll;0;L;;;;;N;;;;; +A774;LATIN SMALL LETTER NUM;Ll;0;L;;;;;N;;;;; +A775;LATIN SMALL LETTER RUM;Ll;0;L;;;;;N;;;;; +A776;LATIN LETTER SMALL CAPITAL RUM;Ll;0;L;;;;;N;;;;; +A777;LATIN SMALL LETTER TUM;Ll;0;L;;;;;N;;;;; +A778;LATIN SMALL LETTER UM;Ll;0;L;;;;;N;;;;; +A779;LATIN CAPITAL LETTER INSULAR D;Lu;0;L;;;;;N;;;;A77A; +A77A;LATIN SMALL LETTER INSULAR D;Ll;0;L;;;;;N;;;A779;;A779 +A77B;LATIN CAPITAL LETTER INSULAR F;Lu;0;L;;;;;N;;;;A77C; +A77C;LATIN SMALL LETTER INSULAR F;Ll;0;L;;;;;N;;;A77B;;A77B +A77D;LATIN CAPITAL LETTER INSULAR G;Lu;0;L;;;;;N;;;;1D79; +A77E;LATIN CAPITAL LETTER TURNED INSULAR G;Lu;0;L;;;;;N;;;;A77F; +A77F;LATIN SMALL LETTER TURNED INSULAR G;Ll;0;L;;;;;N;;;A77E;;A77E +A780;LATIN CAPITAL LETTER TURNED L;Lu;0;L;;;;;N;;;;A781; +A781;LATIN SMALL LETTER TURNED L;Ll;0;L;;;;;N;;;A780;;A780 +A782;LATIN CAPITAL LETTER INSULAR R;Lu;0;L;;;;;N;;;;A783; +A783;LATIN SMALL LETTER INSULAR R;Ll;0;L;;;;;N;;;A782;;A782 +A784;LATIN CAPITAL LETTER INSULAR S;Lu;0;L;;;;;N;;;;A785; +A785;LATIN SMALL LETTER INSULAR S;Ll;0;L;;;;;N;;;A784;;A784 +A786;LATIN CAPITAL LETTER INSULAR T;Lu;0;L;;;;;N;;;;A787; +A787;LATIN SMALL LETTER INSULAR T;Ll;0;L;;;;;N;;;A786;;A786 +A788;MODIFIER LETTER LOW CIRCUMFLEX ACCENT;Lm;0;ON;;;;;N;;;;; +A789;MODIFIER LETTER COLON;Sk;0;L;;;;;N;;;;; +A78A;MODIFIER LETTER SHORT EQUALS SIGN;Sk;0;L;;;;;N;;;;; +A78B;LATIN CAPITAL LETTER SALTILLO;Lu;0;L;;;;;N;;;;A78C; +A78C;LATIN SMALL LETTER SALTILLO;Ll;0;L;;;;;N;;;A78B;;A78B +A78D;LATIN CAPITAL LETTER TURNED H;Lu;0;L;;;;;N;;;;0265; +A78E;LATIN SMALL LETTER L WITH RETROFLEX HOOK AND BELT;Ll;0;L;;;;;N;;;;; +A78F;LATIN LETTER SINOLOGICAL DOT;Lo;0;L;;;;;N;;;;; +A790;LATIN CAPITAL LETTER N WITH DESCENDER;Lu;0;L;;;;;N;;;;A791; +A791;LATIN SMALL LETTER N WITH DESCENDER;Ll;0;L;;;;;N;;;A790;;A790 +A792;LATIN CAPITAL LETTER C WITH BAR;Lu;0;L;;;;;N;;;;A793; +A793;LATIN SMALL LETTER C WITH BAR;Ll;0;L;;;;;N;;;A792;;A792 +A794;LATIN SMALL LETTER C WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +A795;LATIN SMALL LETTER H WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +A796;LATIN CAPITAL LETTER B WITH FLOURISH;Lu;0;L;;;;;N;;;;A797; +A797;LATIN SMALL LETTER B WITH FLOURISH;Ll;0;L;;;;;N;;;A796;;A796 +A798;LATIN CAPITAL LETTER F WITH STROKE;Lu;0;L;;;;;N;;;;A799; +A799;LATIN SMALL LETTER F WITH STROKE;Ll;0;L;;;;;N;;;A798;;A798 +A79A;LATIN CAPITAL LETTER VOLAPUK AE;Lu;0;L;;;;;N;;;;A79B; +A79B;LATIN SMALL LETTER VOLAPUK AE;Ll;0;L;;;;;N;;;A79A;;A79A +A79C;LATIN CAPITAL LETTER VOLAPUK OE;Lu;0;L;;;;;N;;;;A79D; +A79D;LATIN SMALL LETTER VOLAPUK OE;Ll;0;L;;;;;N;;;A79C;;A79C +A79E;LATIN CAPITAL LETTER VOLAPUK UE;Lu;0;L;;;;;N;;;;A79F; +A79F;LATIN SMALL LETTER VOLAPUK UE;Ll;0;L;;;;;N;;;A79E;;A79E +A7A0;LATIN CAPITAL LETTER G WITH OBLIQUE STROKE;Lu;0;L;;;;;N;;;;A7A1; +A7A1;LATIN SMALL LETTER G WITH OBLIQUE STROKE;Ll;0;L;;;;;N;;;A7A0;;A7A0 +A7A2;LATIN CAPITAL LETTER K WITH OBLIQUE STROKE;Lu;0;L;;;;;N;;;;A7A3; +A7A3;LATIN SMALL LETTER K WITH OBLIQUE STROKE;Ll;0;L;;;;;N;;;A7A2;;A7A2 +A7A4;LATIN CAPITAL LETTER N WITH OBLIQUE STROKE;Lu;0;L;;;;;N;;;;A7A5; +A7A5;LATIN SMALL LETTER N WITH OBLIQUE STROKE;Ll;0;L;;;;;N;;;A7A4;;A7A4 +A7A6;LATIN CAPITAL LETTER R WITH OBLIQUE STROKE;Lu;0;L;;;;;N;;;;A7A7; +A7A7;LATIN SMALL LETTER R WITH OBLIQUE STROKE;Ll;0;L;;;;;N;;;A7A6;;A7A6 +A7A8;LATIN CAPITAL LETTER S WITH OBLIQUE STROKE;Lu;0;L;;;;;N;;;;A7A9; +A7A9;LATIN SMALL LETTER S WITH OBLIQUE STROKE;Ll;0;L;;;;;N;;;A7A8;;A7A8 +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; +A7AF;LATIN LETTER SMALL CAPITAL Q;Ll;0;L;;;;;N;;;;; +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; +A7B3;LATIN CAPITAL LETTER CHI;Lu;0;L;;;;;N;;;;AB53; +A7B4;LATIN CAPITAL LETTER BETA;Lu;0;L;;;;;N;;;;A7B5; +A7B5;LATIN SMALL LETTER BETA;Ll;0;L;;;;;N;;;A7B4;;A7B4 +A7B6;LATIN CAPITAL LETTER OMEGA;Lu;0;L;;;;;N;;;;A7B7; +A7B7;LATIN SMALL LETTER OMEGA;Ll;0;L;;;;;N;;;A7B6;;A7B6 +A7B8;LATIN CAPITAL LETTER U WITH STROKE;Lu;0;L;;;;;N;;;;A7B9; +A7B9;LATIN SMALL LETTER U WITH STROKE;Ll;0;L;;;;;N;;;A7B8;;A7B8 +A7F7;LATIN EPIGRAPHIC LETTER SIDEWAYS I;Lo;0;L;;;;;N;;;;; +A7F8;MODIFIER LETTER CAPITAL H WITH STROKE;Lm;0;L;<super> 0126;;;;N;;;;; +A7F9;MODIFIER LETTER SMALL LIGATURE OE;Lm;0;L;<super> 0153;;;;N;;;;; +A7FA;LATIN LETTER SMALL CAPITAL TURNED M;Ll;0;L;;;;;N;;;;; +A7FB;LATIN EPIGRAPHIC LETTER REVERSED F;Lo;0;L;;;;;N;;;;; +A7FC;LATIN EPIGRAPHIC LETTER REVERSED P;Lo;0;L;;;;;N;;;;; +A7FD;LATIN EPIGRAPHIC LETTER INVERTED M;Lo;0;L;;;;;N;;;;; +A7FE;LATIN EPIGRAPHIC LETTER I LONGA;Lo;0;L;;;;;N;;;;; +A7FF;LATIN EPIGRAPHIC LETTER ARCHAIC M;Lo;0;L;;;;;N;;;;; +A800;SYLOTI NAGRI LETTER A;Lo;0;L;;;;;N;;;;; +A801;SYLOTI NAGRI LETTER I;Lo;0;L;;;;;N;;;;; +A802;SYLOTI NAGRI SIGN DVISVARA;Mn;0;NSM;;;;;N;;;;; +A803;SYLOTI NAGRI LETTER U;Lo;0;L;;;;;N;;;;; +A804;SYLOTI NAGRI LETTER E;Lo;0;L;;;;;N;;;;; +A805;SYLOTI NAGRI LETTER O;Lo;0;L;;;;;N;;;;; +A806;SYLOTI NAGRI SIGN HASANTA;Mn;9;NSM;;;;;N;;;;; +A807;SYLOTI NAGRI LETTER KO;Lo;0;L;;;;;N;;;;; +A808;SYLOTI NAGRI LETTER KHO;Lo;0;L;;;;;N;;;;; +A809;SYLOTI NAGRI LETTER GO;Lo;0;L;;;;;N;;;;; +A80A;SYLOTI NAGRI LETTER GHO;Lo;0;L;;;;;N;;;;; +A80B;SYLOTI NAGRI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +A80C;SYLOTI NAGRI LETTER CO;Lo;0;L;;;;;N;;;;; +A80D;SYLOTI NAGRI LETTER CHO;Lo;0;L;;;;;N;;;;; +A80E;SYLOTI NAGRI LETTER JO;Lo;0;L;;;;;N;;;;; +A80F;SYLOTI NAGRI LETTER JHO;Lo;0;L;;;;;N;;;;; +A810;SYLOTI NAGRI LETTER TTO;Lo;0;L;;;;;N;;;;; +A811;SYLOTI NAGRI LETTER TTHO;Lo;0;L;;;;;N;;;;; +A812;SYLOTI NAGRI LETTER DDO;Lo;0;L;;;;;N;;;;; +A813;SYLOTI NAGRI LETTER DDHO;Lo;0;L;;;;;N;;;;; +A814;SYLOTI NAGRI LETTER TO;Lo;0;L;;;;;N;;;;; +A815;SYLOTI NAGRI LETTER THO;Lo;0;L;;;;;N;;;;; +A816;SYLOTI NAGRI LETTER DO;Lo;0;L;;;;;N;;;;; +A817;SYLOTI NAGRI LETTER DHO;Lo;0;L;;;;;N;;;;; +A818;SYLOTI NAGRI LETTER NO;Lo;0;L;;;;;N;;;;; +A819;SYLOTI NAGRI LETTER PO;Lo;0;L;;;;;N;;;;; +A81A;SYLOTI NAGRI LETTER PHO;Lo;0;L;;;;;N;;;;; +A81B;SYLOTI NAGRI LETTER BO;Lo;0;L;;;;;N;;;;; +A81C;SYLOTI NAGRI LETTER BHO;Lo;0;L;;;;;N;;;;; +A81D;SYLOTI NAGRI LETTER MO;Lo;0;L;;;;;N;;;;; +A81E;SYLOTI NAGRI LETTER RO;Lo;0;L;;;;;N;;;;; +A81F;SYLOTI NAGRI LETTER LO;Lo;0;L;;;;;N;;;;; +A820;SYLOTI NAGRI LETTER RRO;Lo;0;L;;;;;N;;;;; +A821;SYLOTI NAGRI LETTER SO;Lo;0;L;;;;;N;;;;; +A822;SYLOTI NAGRI LETTER HO;Lo;0;L;;;;;N;;;;; +A823;SYLOTI NAGRI VOWEL SIGN A;Mc;0;L;;;;;N;;;;; +A824;SYLOTI NAGRI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +A825;SYLOTI NAGRI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +A826;SYLOTI NAGRI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +A827;SYLOTI NAGRI VOWEL SIGN OO;Mc;0;L;;;;;N;;;;; +A828;SYLOTI NAGRI POETRY MARK-1;So;0;ON;;;;;N;;;;; +A829;SYLOTI NAGRI POETRY MARK-2;So;0;ON;;;;;N;;;;; +A82A;SYLOTI NAGRI POETRY MARK-3;So;0;ON;;;;;N;;;;; +A82B;SYLOTI NAGRI POETRY MARK-4;So;0;ON;;;;;N;;;;; +A830;NORTH INDIC FRACTION ONE QUARTER;No;0;L;;;;1/4;N;;;;; +A831;NORTH INDIC FRACTION ONE HALF;No;0;L;;;;1/2;N;;;;; +A832;NORTH INDIC FRACTION THREE QUARTERS;No;0;L;;;;3/4;N;;;;; +A833;NORTH INDIC FRACTION ONE SIXTEENTH;No;0;L;;;;1/16;N;;;;; +A834;NORTH INDIC FRACTION ONE EIGHTH;No;0;L;;;;1/8;N;;;;; +A835;NORTH INDIC FRACTION THREE SIXTEENTHS;No;0;L;;;;3/16;N;;;;; +A836;NORTH INDIC QUARTER MARK;So;0;L;;;;;N;;;;; +A837;NORTH INDIC PLACEHOLDER MARK;So;0;L;;;;;N;;;;; +A838;NORTH INDIC RUPEE MARK;Sc;0;ET;;;;;N;;;;; +A839;NORTH INDIC QUANTITY MARK;So;0;ET;;;;;N;;;;; +A840;PHAGS-PA LETTER KA;Lo;0;L;;;;;N;;;;; +A841;PHAGS-PA LETTER KHA;Lo;0;L;;;;;N;;;;; +A842;PHAGS-PA LETTER GA;Lo;0;L;;;;;N;;;;; +A843;PHAGS-PA LETTER NGA;Lo;0;L;;;;;N;;;;; +A844;PHAGS-PA LETTER CA;Lo;0;L;;;;;N;;;;; +A845;PHAGS-PA LETTER CHA;Lo;0;L;;;;;N;;;;; +A846;PHAGS-PA LETTER JA;Lo;0;L;;;;;N;;;;; +A847;PHAGS-PA LETTER NYA;Lo;0;L;;;;;N;;;;; +A848;PHAGS-PA LETTER TA;Lo;0;L;;;;;N;;;;; +A849;PHAGS-PA LETTER THA;Lo;0;L;;;;;N;;;;; +A84A;PHAGS-PA LETTER DA;Lo;0;L;;;;;N;;;;; +A84B;PHAGS-PA LETTER NA;Lo;0;L;;;;;N;;;;; +A84C;PHAGS-PA LETTER PA;Lo;0;L;;;;;N;;;;; +A84D;PHAGS-PA LETTER PHA;Lo;0;L;;;;;N;;;;; +A84E;PHAGS-PA LETTER BA;Lo;0;L;;;;;N;;;;; +A84F;PHAGS-PA LETTER MA;Lo;0;L;;;;;N;;;;; +A850;PHAGS-PA LETTER TSA;Lo;0;L;;;;;N;;;;; +A851;PHAGS-PA LETTER TSHA;Lo;0;L;;;;;N;;;;; +A852;PHAGS-PA LETTER DZA;Lo;0;L;;;;;N;;;;; +A853;PHAGS-PA LETTER WA;Lo;0;L;;;;;N;;;;; +A854;PHAGS-PA LETTER ZHA;Lo;0;L;;;;;N;;;;; +A855;PHAGS-PA LETTER ZA;Lo;0;L;;;;;N;;;;; +A856;PHAGS-PA LETTER SMALL A;Lo;0;L;;;;;N;;;;; +A857;PHAGS-PA LETTER YA;Lo;0;L;;;;;N;;;;; +A858;PHAGS-PA LETTER RA;Lo;0;L;;;;;N;;;;; +A859;PHAGS-PA LETTER LA;Lo;0;L;;;;;N;;;;; +A85A;PHAGS-PA LETTER SHA;Lo;0;L;;;;;N;;;;; +A85B;PHAGS-PA LETTER SA;Lo;0;L;;;;;N;;;;; +A85C;PHAGS-PA LETTER HA;Lo;0;L;;;;;N;;;;; +A85D;PHAGS-PA LETTER A;Lo;0;L;;;;;N;;;;; +A85E;PHAGS-PA LETTER I;Lo;0;L;;;;;N;;;;; +A85F;PHAGS-PA LETTER U;Lo;0;L;;;;;N;;;;; +A860;PHAGS-PA LETTER E;Lo;0;L;;;;;N;;;;; +A861;PHAGS-PA LETTER O;Lo;0;L;;;;;N;;;;; +A862;PHAGS-PA LETTER QA;Lo;0;L;;;;;N;;;;; +A863;PHAGS-PA LETTER XA;Lo;0;L;;;;;N;;;;; +A864;PHAGS-PA LETTER FA;Lo;0;L;;;;;N;;;;; +A865;PHAGS-PA LETTER GGA;Lo;0;L;;;;;N;;;;; +A866;PHAGS-PA LETTER EE;Lo;0;L;;;;;N;;;;; +A867;PHAGS-PA SUBJOINED LETTER WA;Lo;0;L;;;;;N;;;;; +A868;PHAGS-PA SUBJOINED LETTER YA;Lo;0;L;;;;;N;;;;; +A869;PHAGS-PA LETTER TTA;Lo;0;L;;;;;N;;;;; +A86A;PHAGS-PA LETTER TTHA;Lo;0;L;;;;;N;;;;; +A86B;PHAGS-PA LETTER DDA;Lo;0;L;;;;;N;;;;; +A86C;PHAGS-PA LETTER NNA;Lo;0;L;;;;;N;;;;; +A86D;PHAGS-PA LETTER ALTERNATE YA;Lo;0;L;;;;;N;;;;; +A86E;PHAGS-PA LETTER VOICELESS SHA;Lo;0;L;;;;;N;;;;; +A86F;PHAGS-PA LETTER VOICED HA;Lo;0;L;;;;;N;;;;; +A870;PHAGS-PA LETTER ASPIRATED FA;Lo;0;L;;;;;N;;;;; +A871;PHAGS-PA SUBJOINED LETTER RA;Lo;0;L;;;;;N;;;;; +A872;PHAGS-PA SUPERFIXED LETTER RA;Lo;0;L;;;;;N;;;;; +A873;PHAGS-PA LETTER CANDRABINDU;Lo;0;L;;;;;N;;;;; +A874;PHAGS-PA SINGLE HEAD MARK;Po;0;ON;;;;;N;;;;; +A875;PHAGS-PA DOUBLE HEAD MARK;Po;0;ON;;;;;N;;;;; +A876;PHAGS-PA MARK SHAD;Po;0;ON;;;;;N;;;;; +A877;PHAGS-PA MARK DOUBLE SHAD;Po;0;ON;;;;;N;;;;; +A880;SAURASHTRA SIGN ANUSVARA;Mc;0;L;;;;;N;;;;; +A881;SAURASHTRA SIGN VISARGA;Mc;0;L;;;;;N;;;;; +A882;SAURASHTRA LETTER A;Lo;0;L;;;;;N;;;;; +A883;SAURASHTRA LETTER AA;Lo;0;L;;;;;N;;;;; +A884;SAURASHTRA LETTER I;Lo;0;L;;;;;N;;;;; +A885;SAURASHTRA LETTER II;Lo;0;L;;;;;N;;;;; +A886;SAURASHTRA LETTER U;Lo;0;L;;;;;N;;;;; +A887;SAURASHTRA LETTER UU;Lo;0;L;;;;;N;;;;; +A888;SAURASHTRA LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +A889;SAURASHTRA LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +A88A;SAURASHTRA LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +A88B;SAURASHTRA LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +A88C;SAURASHTRA LETTER E;Lo;0;L;;;;;N;;;;; +A88D;SAURASHTRA LETTER EE;Lo;0;L;;;;;N;;;;; +A88E;SAURASHTRA LETTER AI;Lo;0;L;;;;;N;;;;; +A88F;SAURASHTRA LETTER O;Lo;0;L;;;;;N;;;;; +A890;SAURASHTRA LETTER OO;Lo;0;L;;;;;N;;;;; +A891;SAURASHTRA LETTER AU;Lo;0;L;;;;;N;;;;; +A892;SAURASHTRA LETTER KA;Lo;0;L;;;;;N;;;;; +A893;SAURASHTRA LETTER KHA;Lo;0;L;;;;;N;;;;; +A894;SAURASHTRA LETTER GA;Lo;0;L;;;;;N;;;;; +A895;SAURASHTRA LETTER GHA;Lo;0;L;;;;;N;;;;; +A896;SAURASHTRA LETTER NGA;Lo;0;L;;;;;N;;;;; +A897;SAURASHTRA LETTER CA;Lo;0;L;;;;;N;;;;; +A898;SAURASHTRA LETTER CHA;Lo;0;L;;;;;N;;;;; +A899;SAURASHTRA LETTER JA;Lo;0;L;;;;;N;;;;; +A89A;SAURASHTRA LETTER JHA;Lo;0;L;;;;;N;;;;; +A89B;SAURASHTRA LETTER NYA;Lo;0;L;;;;;N;;;;; +A89C;SAURASHTRA LETTER TTA;Lo;0;L;;;;;N;;;;; +A89D;SAURASHTRA LETTER TTHA;Lo;0;L;;;;;N;;;;; +A89E;SAURASHTRA LETTER DDA;Lo;0;L;;;;;N;;;;; +A89F;SAURASHTRA LETTER DDHA;Lo;0;L;;;;;N;;;;; +A8A0;SAURASHTRA LETTER NNA;Lo;0;L;;;;;N;;;;; +A8A1;SAURASHTRA LETTER TA;Lo;0;L;;;;;N;;;;; +A8A2;SAURASHTRA LETTER THA;Lo;0;L;;;;;N;;;;; +A8A3;SAURASHTRA LETTER DA;Lo;0;L;;;;;N;;;;; +A8A4;SAURASHTRA LETTER DHA;Lo;0;L;;;;;N;;;;; +A8A5;SAURASHTRA LETTER NA;Lo;0;L;;;;;N;;;;; +A8A6;SAURASHTRA LETTER PA;Lo;0;L;;;;;N;;;;; +A8A7;SAURASHTRA LETTER PHA;Lo;0;L;;;;;N;;;;; +A8A8;SAURASHTRA LETTER BA;Lo;0;L;;;;;N;;;;; +A8A9;SAURASHTRA LETTER BHA;Lo;0;L;;;;;N;;;;; +A8AA;SAURASHTRA LETTER MA;Lo;0;L;;;;;N;;;;; +A8AB;SAURASHTRA LETTER YA;Lo;0;L;;;;;N;;;;; +A8AC;SAURASHTRA LETTER RA;Lo;0;L;;;;;N;;;;; +A8AD;SAURASHTRA LETTER LA;Lo;0;L;;;;;N;;;;; +A8AE;SAURASHTRA LETTER VA;Lo;0;L;;;;;N;;;;; +A8AF;SAURASHTRA LETTER SHA;Lo;0;L;;;;;N;;;;; +A8B0;SAURASHTRA LETTER SSA;Lo;0;L;;;;;N;;;;; +A8B1;SAURASHTRA LETTER SA;Lo;0;L;;;;;N;;;;; +A8B2;SAURASHTRA LETTER HA;Lo;0;L;;;;;N;;;;; +A8B3;SAURASHTRA LETTER LLA;Lo;0;L;;;;;N;;;;; +A8B4;SAURASHTRA CONSONANT SIGN HAARU;Mc;0;L;;;;;N;;;;; +A8B5;SAURASHTRA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +A8B6;SAURASHTRA VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +A8B7;SAURASHTRA VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +A8B8;SAURASHTRA VOWEL SIGN U;Mc;0;L;;;;;N;;;;; +A8B9;SAURASHTRA VOWEL SIGN UU;Mc;0;L;;;;;N;;;;; +A8BA;SAURASHTRA VOWEL SIGN VOCALIC R;Mc;0;L;;;;;N;;;;; +A8BB;SAURASHTRA VOWEL SIGN VOCALIC RR;Mc;0;L;;;;;N;;;;; +A8BC;SAURASHTRA VOWEL SIGN VOCALIC L;Mc;0;L;;;;;N;;;;; +A8BD;SAURASHTRA VOWEL SIGN VOCALIC LL;Mc;0;L;;;;;N;;;;; +A8BE;SAURASHTRA VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +A8BF;SAURASHTRA VOWEL SIGN EE;Mc;0;L;;;;;N;;;;; +A8C0;SAURASHTRA VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; +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;;;;; +A8D1;SAURASHTRA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +A8D2;SAURASHTRA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +A8D3;SAURASHTRA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +A8D4;SAURASHTRA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +A8D5;SAURASHTRA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +A8D6;SAURASHTRA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +A8D7;SAURASHTRA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +A8D8;SAURASHTRA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +A8D9;SAURASHTRA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +A8E0;COMBINING DEVANAGARI DIGIT ZERO;Mn;230;NSM;;;;;N;;;;; +A8E1;COMBINING DEVANAGARI DIGIT ONE;Mn;230;NSM;;;;;N;;;;; +A8E2;COMBINING DEVANAGARI DIGIT TWO;Mn;230;NSM;;;;;N;;;;; +A8E3;COMBINING DEVANAGARI DIGIT THREE;Mn;230;NSM;;;;;N;;;;; +A8E4;COMBINING DEVANAGARI DIGIT FOUR;Mn;230;NSM;;;;;N;;;;; +A8E5;COMBINING DEVANAGARI DIGIT FIVE;Mn;230;NSM;;;;;N;;;;; +A8E6;COMBINING DEVANAGARI DIGIT SIX;Mn;230;NSM;;;;;N;;;;; +A8E7;COMBINING DEVANAGARI DIGIT SEVEN;Mn;230;NSM;;;;;N;;;;; +A8E8;COMBINING DEVANAGARI DIGIT EIGHT;Mn;230;NSM;;;;;N;;;;; +A8E9;COMBINING DEVANAGARI DIGIT NINE;Mn;230;NSM;;;;;N;;;;; +A8EA;COMBINING DEVANAGARI LETTER A;Mn;230;NSM;;;;;N;;;;; +A8EB;COMBINING DEVANAGARI LETTER U;Mn;230;NSM;;;;;N;;;;; +A8EC;COMBINING DEVANAGARI LETTER KA;Mn;230;NSM;;;;;N;;;;; +A8ED;COMBINING DEVANAGARI LETTER NA;Mn;230;NSM;;;;;N;;;;; +A8EE;COMBINING DEVANAGARI LETTER PA;Mn;230;NSM;;;;;N;;;;; +A8EF;COMBINING DEVANAGARI LETTER RA;Mn;230;NSM;;;;;N;;;;; +A8F0;COMBINING DEVANAGARI LETTER VI;Mn;230;NSM;;;;;N;;;;; +A8F1;COMBINING DEVANAGARI SIGN AVAGRAHA;Mn;230;NSM;;;;;N;;;;; +A8F2;DEVANAGARI SIGN SPACING CANDRABINDU;Lo;0;L;;;;;N;;;;; +A8F3;DEVANAGARI SIGN CANDRABINDU VIRAMA;Lo;0;L;;;;;N;;;;; +A8F4;DEVANAGARI SIGN DOUBLE CANDRABINDU VIRAMA;Lo;0;L;;;;;N;;;;; +A8F5;DEVANAGARI SIGN CANDRABINDU TWO;Lo;0;L;;;;;N;;;;; +A8F6;DEVANAGARI SIGN CANDRABINDU THREE;Lo;0;L;;;;;N;;;;; +A8F7;DEVANAGARI SIGN CANDRABINDU AVAGRAHA;Lo;0;L;;;;;N;;;;; +A8F8;DEVANAGARI SIGN PUSHPIKA;Po;0;L;;;;;N;;;;; +A8F9;DEVANAGARI GAP FILLER;Po;0;L;;;;;N;;;;; +A8FA;DEVANAGARI CARET;Po;0;L;;;;;N;;;;; +A8FB;DEVANAGARI HEADSTROKE;Lo;0;L;;;;;N;;;;; +A8FC;DEVANAGARI SIGN SIDDHAM;Po;0;L;;;;;N;;;;; +A8FD;DEVANAGARI JAIN OM;Lo;0;L;;;;;N;;;;; +A8FE;DEVANAGARI LETTER AY;Lo;0;L;;;;;N;;;;; +A8FF;DEVANAGARI VOWEL SIGN AY;Mn;0;NSM;;;;;N;;;;; +A900;KAYAH LI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +A901;KAYAH LI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +A902;KAYAH LI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +A903;KAYAH LI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +A904;KAYAH LI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +A905;KAYAH LI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +A906;KAYAH LI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +A907;KAYAH LI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +A908;KAYAH LI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +A909;KAYAH LI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +A90A;KAYAH LI LETTER KA;Lo;0;L;;;;;N;;;;; +A90B;KAYAH LI LETTER KHA;Lo;0;L;;;;;N;;;;; +A90C;KAYAH LI LETTER GA;Lo;0;L;;;;;N;;;;; +A90D;KAYAH LI LETTER NGA;Lo;0;L;;;;;N;;;;; +A90E;KAYAH LI LETTER SA;Lo;0;L;;;;;N;;;;; +A90F;KAYAH LI LETTER SHA;Lo;0;L;;;;;N;;;;; +A910;KAYAH LI LETTER ZA;Lo;0;L;;;;;N;;;;; +A911;KAYAH LI LETTER NYA;Lo;0;L;;;;;N;;;;; +A912;KAYAH LI LETTER TA;Lo;0;L;;;;;N;;;;; +A913;KAYAH LI LETTER HTA;Lo;0;L;;;;;N;;;;; +A914;KAYAH LI LETTER NA;Lo;0;L;;;;;N;;;;; +A915;KAYAH LI LETTER PA;Lo;0;L;;;;;N;;;;; +A916;KAYAH LI LETTER PHA;Lo;0;L;;;;;N;;;;; +A917;KAYAH LI LETTER MA;Lo;0;L;;;;;N;;;;; +A918;KAYAH LI LETTER DA;Lo;0;L;;;;;N;;;;; +A919;KAYAH LI LETTER BA;Lo;0;L;;;;;N;;;;; +A91A;KAYAH LI LETTER RA;Lo;0;L;;;;;N;;;;; +A91B;KAYAH LI LETTER YA;Lo;0;L;;;;;N;;;;; +A91C;KAYAH LI LETTER LA;Lo;0;L;;;;;N;;;;; +A91D;KAYAH LI LETTER WA;Lo;0;L;;;;;N;;;;; +A91E;KAYAH LI LETTER THA;Lo;0;L;;;;;N;;;;; +A91F;KAYAH LI LETTER HA;Lo;0;L;;;;;N;;;;; +A920;KAYAH LI LETTER VA;Lo;0;L;;;;;N;;;;; +A921;KAYAH LI LETTER CA;Lo;0;L;;;;;N;;;;; +A922;KAYAH LI LETTER A;Lo;0;L;;;;;N;;;;; +A923;KAYAH LI LETTER OE;Lo;0;L;;;;;N;;;;; +A924;KAYAH LI LETTER I;Lo;0;L;;;;;N;;;;; +A925;KAYAH LI LETTER OO;Lo;0;L;;;;;N;;;;; +A926;KAYAH LI VOWEL UE;Mn;0;NSM;;;;;N;;;;; +A927;KAYAH LI VOWEL E;Mn;0;NSM;;;;;N;;;;; +A928;KAYAH LI VOWEL U;Mn;0;NSM;;;;;N;;;;; +A929;KAYAH LI VOWEL EE;Mn;0;NSM;;;;;N;;;;; +A92A;KAYAH LI VOWEL O;Mn;0;NSM;;;;;N;;;;; +A92B;KAYAH LI TONE PLOPHU;Mn;220;NSM;;;;;N;;;;; +A92C;KAYAH LI TONE CALYA;Mn;220;NSM;;;;;N;;;;; +A92D;KAYAH LI TONE CALYA PLOPHU;Mn;220;NSM;;;;;N;;;;; +A92E;KAYAH LI SIGN CWI;Po;0;L;;;;;N;;;;; +A92F;KAYAH LI SIGN SHYA;Po;0;L;;;;;N;;;;; +A930;REJANG LETTER KA;Lo;0;L;;;;;N;;;;; +A931;REJANG LETTER GA;Lo;0;L;;;;;N;;;;; +A932;REJANG LETTER NGA;Lo;0;L;;;;;N;;;;; +A933;REJANG LETTER TA;Lo;0;L;;;;;N;;;;; +A934;REJANG LETTER DA;Lo;0;L;;;;;N;;;;; +A935;REJANG LETTER NA;Lo;0;L;;;;;N;;;;; +A936;REJANG LETTER PA;Lo;0;L;;;;;N;;;;; +A937;REJANG LETTER BA;Lo;0;L;;;;;N;;;;; +A938;REJANG LETTER MA;Lo;0;L;;;;;N;;;;; +A939;REJANG LETTER CA;Lo;0;L;;;;;N;;;;; +A93A;REJANG LETTER JA;Lo;0;L;;;;;N;;;;; +A93B;REJANG LETTER NYA;Lo;0;L;;;;;N;;;;; +A93C;REJANG LETTER SA;Lo;0;L;;;;;N;;;;; +A93D;REJANG LETTER RA;Lo;0;L;;;;;N;;;;; +A93E;REJANG LETTER LA;Lo;0;L;;;;;N;;;;; +A93F;REJANG LETTER YA;Lo;0;L;;;;;N;;;;; +A940;REJANG LETTER WA;Lo;0;L;;;;;N;;;;; +A941;REJANG LETTER HA;Lo;0;L;;;;;N;;;;; +A942;REJANG LETTER MBA;Lo;0;L;;;;;N;;;;; +A943;REJANG LETTER NGGA;Lo;0;L;;;;;N;;;;; +A944;REJANG LETTER NDA;Lo;0;L;;;;;N;;;;; +A945;REJANG LETTER NYJA;Lo;0;L;;;;;N;;;;; +A946;REJANG LETTER A;Lo;0;L;;;;;N;;;;; +A947;REJANG VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +A948;REJANG VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +A949;REJANG VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +A94A;REJANG VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +A94B;REJANG VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; +A94C;REJANG VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;; +A94D;REJANG VOWEL SIGN EU;Mn;0;NSM;;;;;N;;;;; +A94E;REJANG VOWEL SIGN EA;Mn;0;NSM;;;;;N;;;;; +A94F;REJANG CONSONANT SIGN NG;Mn;0;NSM;;;;;N;;;;; +A950;REJANG CONSONANT SIGN N;Mn;0;NSM;;;;;N;;;;; +A951;REJANG CONSONANT SIGN R;Mn;0;NSM;;;;;N;;;;; +A952;REJANG CONSONANT SIGN H;Mc;0;L;;;;;N;;;;; +A953;REJANG VIRAMA;Mc;9;L;;;;;N;;;;; +A95F;REJANG SECTION MARK;Po;0;L;;;;;N;;;;; +A960;HANGUL CHOSEONG TIKEUT-MIEUM;Lo;0;L;;;;;N;;;;; +A961;HANGUL CHOSEONG TIKEUT-PIEUP;Lo;0;L;;;;;N;;;;; +A962;HANGUL CHOSEONG TIKEUT-SIOS;Lo;0;L;;;;;N;;;;; +A963;HANGUL CHOSEONG TIKEUT-CIEUC;Lo;0;L;;;;;N;;;;; +A964;HANGUL CHOSEONG RIEUL-KIYEOK;Lo;0;L;;;;;N;;;;; +A965;HANGUL CHOSEONG RIEUL-SSANGKIYEOK;Lo;0;L;;;;;N;;;;; +A966;HANGUL CHOSEONG RIEUL-TIKEUT;Lo;0;L;;;;;N;;;;; +A967;HANGUL CHOSEONG RIEUL-SSANGTIKEUT;Lo;0;L;;;;;N;;;;; +A968;HANGUL CHOSEONG RIEUL-MIEUM;Lo;0;L;;;;;N;;;;; +A969;HANGUL CHOSEONG RIEUL-PIEUP;Lo;0;L;;;;;N;;;;; +A96A;HANGUL CHOSEONG RIEUL-SSANGPIEUP;Lo;0;L;;;;;N;;;;; +A96B;HANGUL CHOSEONG RIEUL-KAPYEOUNPIEUP;Lo;0;L;;;;;N;;;;; +A96C;HANGUL CHOSEONG RIEUL-SIOS;Lo;0;L;;;;;N;;;;; +A96D;HANGUL CHOSEONG RIEUL-CIEUC;Lo;0;L;;;;;N;;;;; +A96E;HANGUL CHOSEONG RIEUL-KHIEUKH;Lo;0;L;;;;;N;;;;; +A96F;HANGUL CHOSEONG MIEUM-KIYEOK;Lo;0;L;;;;;N;;;;; +A970;HANGUL CHOSEONG MIEUM-TIKEUT;Lo;0;L;;;;;N;;;;; +A971;HANGUL CHOSEONG MIEUM-SIOS;Lo;0;L;;;;;N;;;;; +A972;HANGUL CHOSEONG PIEUP-SIOS-THIEUTH;Lo;0;L;;;;;N;;;;; +A973;HANGUL CHOSEONG PIEUP-KHIEUKH;Lo;0;L;;;;;N;;;;; +A974;HANGUL CHOSEONG PIEUP-HIEUH;Lo;0;L;;;;;N;;;;; +A975;HANGUL CHOSEONG SSANGSIOS-PIEUP;Lo;0;L;;;;;N;;;;; +A976;HANGUL CHOSEONG IEUNG-RIEUL;Lo;0;L;;;;;N;;;;; +A977;HANGUL CHOSEONG IEUNG-HIEUH;Lo;0;L;;;;;N;;;;; +A978;HANGUL CHOSEONG SSANGCIEUC-HIEUH;Lo;0;L;;;;;N;;;;; +A979;HANGUL CHOSEONG SSANGTHIEUTH;Lo;0;L;;;;;N;;;;; +A97A;HANGUL CHOSEONG PHIEUPH-HIEUH;Lo;0;L;;;;;N;;;;; +A97B;HANGUL CHOSEONG HIEUH-SIOS;Lo;0;L;;;;;N;;;;; +A97C;HANGUL CHOSEONG SSANGYEORINHIEUH;Lo;0;L;;;;;N;;;;; +A980;JAVANESE SIGN PANYANGGA;Mn;0;NSM;;;;;N;;;;; +A981;JAVANESE SIGN CECAK;Mn;0;NSM;;;;;N;;;;; +A982;JAVANESE SIGN LAYAR;Mn;0;NSM;;;;;N;;;;; +A983;JAVANESE SIGN WIGNYAN;Mc;0;L;;;;;N;;;;; +A984;JAVANESE LETTER A;Lo;0;L;;;;;N;;;;; +A985;JAVANESE LETTER I KAWI;Lo;0;L;;;;;N;;;;; +A986;JAVANESE LETTER I;Lo;0;L;;;;;N;;;;; +A987;JAVANESE LETTER II;Lo;0;L;;;;;N;;;;; +A988;JAVANESE LETTER U;Lo;0;L;;;;;N;;;;; +A989;JAVANESE LETTER PA CEREK;Lo;0;L;;;;;N;;;;; +A98A;JAVANESE LETTER NGA LELET;Lo;0;L;;;;;N;;;;; +A98B;JAVANESE LETTER NGA LELET RASWADI;Lo;0;L;;;;;N;;;;; +A98C;JAVANESE LETTER E;Lo;0;L;;;;;N;;;;; +A98D;JAVANESE LETTER AI;Lo;0;L;;;;;N;;;;; +A98E;JAVANESE LETTER O;Lo;0;L;;;;;N;;;;; +A98F;JAVANESE LETTER KA;Lo;0;L;;;;;N;;;;; +A990;JAVANESE LETTER KA SASAK;Lo;0;L;;;;;N;;;;; +A991;JAVANESE LETTER KA MURDA;Lo;0;L;;;;;N;;;;; +A992;JAVANESE LETTER GA;Lo;0;L;;;;;N;;;;; +A993;JAVANESE LETTER GA MURDA;Lo;0;L;;;;;N;;;;; +A994;JAVANESE LETTER NGA;Lo;0;L;;;;;N;;;;; +A995;JAVANESE LETTER CA;Lo;0;L;;;;;N;;;;; +A996;JAVANESE LETTER CA MURDA;Lo;0;L;;;;;N;;;;; +A997;JAVANESE LETTER JA;Lo;0;L;;;;;N;;;;; +A998;JAVANESE LETTER NYA MURDA;Lo;0;L;;;;;N;;;;; +A999;JAVANESE LETTER JA MAHAPRANA;Lo;0;L;;;;;N;;;;; +A99A;JAVANESE LETTER NYA;Lo;0;L;;;;;N;;;;; +A99B;JAVANESE LETTER TTA;Lo;0;L;;;;;N;;;;; +A99C;JAVANESE LETTER TTA MAHAPRANA;Lo;0;L;;;;;N;;;;; +A99D;JAVANESE LETTER DDA;Lo;0;L;;;;;N;;;;; +A99E;JAVANESE LETTER DDA MAHAPRANA;Lo;0;L;;;;;N;;;;; +A99F;JAVANESE LETTER NA MURDA;Lo;0;L;;;;;N;;;;; +A9A0;JAVANESE LETTER TA;Lo;0;L;;;;;N;;;;; +A9A1;JAVANESE LETTER TA MURDA;Lo;0;L;;;;;N;;;;; +A9A2;JAVANESE LETTER DA;Lo;0;L;;;;;N;;;;; +A9A3;JAVANESE LETTER DA MAHAPRANA;Lo;0;L;;;;;N;;;;; +A9A4;JAVANESE LETTER NA;Lo;0;L;;;;;N;;;;; +A9A5;JAVANESE LETTER PA;Lo;0;L;;;;;N;;;;; +A9A6;JAVANESE LETTER PA MURDA;Lo;0;L;;;;;N;;;;; +A9A7;JAVANESE LETTER BA;Lo;0;L;;;;;N;;;;; +A9A8;JAVANESE LETTER BA MURDA;Lo;0;L;;;;;N;;;;; +A9A9;JAVANESE LETTER MA;Lo;0;L;;;;;N;;;;; +A9AA;JAVANESE LETTER YA;Lo;0;L;;;;;N;;;;; +A9AB;JAVANESE LETTER RA;Lo;0;L;;;;;N;;;;; +A9AC;JAVANESE LETTER RA AGUNG;Lo;0;L;;;;;N;;;;; +A9AD;JAVANESE LETTER LA;Lo;0;L;;;;;N;;;;; +A9AE;JAVANESE LETTER WA;Lo;0;L;;;;;N;;;;; +A9AF;JAVANESE LETTER SA MURDA;Lo;0;L;;;;;N;;;;; +A9B0;JAVANESE LETTER SA MAHAPRANA;Lo;0;L;;;;;N;;;;; +A9B1;JAVANESE LETTER SA;Lo;0;L;;;;;N;;;;; +A9B2;JAVANESE LETTER HA;Lo;0;L;;;;;N;;;;; +A9B3;JAVANESE SIGN CECAK TELU;Mn;7;NSM;;;;;N;;;;; +A9B4;JAVANESE VOWEL SIGN TARUNG;Mc;0;L;;;;;N;;;;; +A9B5;JAVANESE VOWEL SIGN TOLONG;Mc;0;L;;;;;N;;;;; +A9B6;JAVANESE VOWEL SIGN WULU;Mn;0;NSM;;;;;N;;;;; +A9B7;JAVANESE VOWEL SIGN WULU MELIK;Mn;0;NSM;;;;;N;;;;; +A9B8;JAVANESE VOWEL SIGN SUKU;Mn;0;NSM;;;;;N;;;;; +A9B9;JAVANESE VOWEL SIGN SUKU MENDUT;Mn;0;NSM;;;;;N;;;;; +A9BA;JAVANESE VOWEL SIGN TALING;Mc;0;L;;;;;N;;;;; +A9BB;JAVANESE VOWEL SIGN DIRGA MURE;Mc;0;L;;;;;N;;;;; +A9BC;JAVANESE VOWEL SIGN PEPET;Mn;0;NSM;;;;;N;;;;; +A9BD;JAVANESE CONSONANT SIGN KERET;Mc;0;L;;;;;N;;;;; +A9BE;JAVANESE CONSONANT SIGN PENGKAL;Mc;0;L;;;;;N;;;;; +A9BF;JAVANESE CONSONANT SIGN CAKRA;Mc;0;L;;;;;N;;;;; +A9C0;JAVANESE PANGKON;Mc;9;L;;;;;N;;;;; +A9C1;JAVANESE LEFT RERENGGAN;Po;0;L;;;;;N;;;;; +A9C2;JAVANESE RIGHT RERENGGAN;Po;0;L;;;;;N;;;;; +A9C3;JAVANESE PADA ANDAP;Po;0;L;;;;;N;;;;; +A9C4;JAVANESE PADA MADYA;Po;0;L;;;;;N;;;;; +A9C5;JAVANESE PADA LUHUR;Po;0;L;;;;;N;;;;; +A9C6;JAVANESE PADA WINDU;Po;0;L;;;;;N;;;;; +A9C7;JAVANESE PADA PANGKAT;Po;0;L;;;;;N;;;;; +A9C8;JAVANESE PADA LINGSA;Po;0;L;;;;;N;;;;; +A9C9;JAVANESE PADA LUNGSI;Po;0;L;;;;;N;;;;; +A9CA;JAVANESE PADA ADEG;Po;0;L;;;;;N;;;;; +A9CB;JAVANESE PADA ADEG ADEG;Po;0;L;;;;;N;;;;; +A9CC;JAVANESE PADA PISELEH;Po;0;L;;;;;N;;;;; +A9CD;JAVANESE TURNED PADA PISELEH;Po;0;L;;;;;N;;;;; +A9CF;JAVANESE PANGRANGKEP;Lm;0;L;;;;;N;;;;; +A9D0;JAVANESE DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +A9D1;JAVANESE DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +A9D2;JAVANESE DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +A9D3;JAVANESE DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +A9D4;JAVANESE DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +A9D5;JAVANESE DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +A9D6;JAVANESE DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +A9D7;JAVANESE DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +A9D8;JAVANESE DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +A9D9;JAVANESE DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +A9DE;JAVANESE PADA TIRTA TUMETES;Po;0;L;;;;;N;;;;; +A9DF;JAVANESE PADA ISEN-ISEN;Po;0;L;;;;;N;;;;; +A9E0;MYANMAR LETTER SHAN GHA;Lo;0;L;;;;;N;;;;; +A9E1;MYANMAR LETTER SHAN CHA;Lo;0;L;;;;;N;;;;; +A9E2;MYANMAR LETTER SHAN JHA;Lo;0;L;;;;;N;;;;; +A9E3;MYANMAR LETTER SHAN NNA;Lo;0;L;;;;;N;;;;; +A9E4;MYANMAR LETTER SHAN BHA;Lo;0;L;;;;;N;;;;; +A9E5;MYANMAR SIGN SHAN SAW;Mn;0;NSM;;;;;N;;;;; +A9E6;MYANMAR MODIFIER LETTER SHAN REDUPLICATION;Lm;0;L;;;;;N;;;;; +A9E7;MYANMAR LETTER TAI LAING NYA;Lo;0;L;;;;;N;;;;; +A9E8;MYANMAR LETTER TAI LAING FA;Lo;0;L;;;;;N;;;;; +A9E9;MYANMAR LETTER TAI LAING GA;Lo;0;L;;;;;N;;;;; +A9EA;MYANMAR LETTER TAI LAING GHA;Lo;0;L;;;;;N;;;;; +A9EB;MYANMAR LETTER TAI LAING JA;Lo;0;L;;;;;N;;;;; +A9EC;MYANMAR LETTER TAI LAING JHA;Lo;0;L;;;;;N;;;;; +A9ED;MYANMAR LETTER TAI LAING DDA;Lo;0;L;;;;;N;;;;; +A9EE;MYANMAR LETTER TAI LAING DDHA;Lo;0;L;;;;;N;;;;; +A9EF;MYANMAR LETTER TAI LAING NNA;Lo;0;L;;;;;N;;;;; +A9F0;MYANMAR TAI LAING DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +A9F1;MYANMAR TAI LAING DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +A9F2;MYANMAR TAI LAING DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +A9F3;MYANMAR TAI LAING DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +A9F4;MYANMAR TAI LAING DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +A9F5;MYANMAR TAI LAING DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +A9F6;MYANMAR TAI LAING DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +A9F7;MYANMAR TAI LAING DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +A9F8;MYANMAR TAI LAING DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +A9F9;MYANMAR TAI LAING DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +A9FA;MYANMAR LETTER TAI LAING LLA;Lo;0;L;;;;;N;;;;; +A9FB;MYANMAR LETTER TAI LAING DA;Lo;0;L;;;;;N;;;;; +A9FC;MYANMAR LETTER TAI LAING DHA;Lo;0;L;;;;;N;;;;; +A9FD;MYANMAR LETTER TAI LAING BA;Lo;0;L;;;;;N;;;;; +A9FE;MYANMAR LETTER TAI LAING BHA;Lo;0;L;;;;;N;;;;; +AA00;CHAM LETTER A;Lo;0;L;;;;;N;;;;; +AA01;CHAM LETTER I;Lo;0;L;;;;;N;;;;; +AA02;CHAM LETTER U;Lo;0;L;;;;;N;;;;; +AA03;CHAM LETTER E;Lo;0;L;;;;;N;;;;; +AA04;CHAM LETTER AI;Lo;0;L;;;;;N;;;;; +AA05;CHAM LETTER O;Lo;0;L;;;;;N;;;;; +AA06;CHAM LETTER KA;Lo;0;L;;;;;N;;;;; +AA07;CHAM LETTER KHA;Lo;0;L;;;;;N;;;;; +AA08;CHAM LETTER GA;Lo;0;L;;;;;N;;;;; +AA09;CHAM LETTER GHA;Lo;0;L;;;;;N;;;;; +AA0A;CHAM LETTER NGUE;Lo;0;L;;;;;N;;;;; +AA0B;CHAM LETTER NGA;Lo;0;L;;;;;N;;;;; +AA0C;CHAM LETTER CHA;Lo;0;L;;;;;N;;;;; +AA0D;CHAM LETTER CHHA;Lo;0;L;;;;;N;;;;; +AA0E;CHAM LETTER JA;Lo;0;L;;;;;N;;;;; +AA0F;CHAM LETTER JHA;Lo;0;L;;;;;N;;;;; +AA10;CHAM LETTER NHUE;Lo;0;L;;;;;N;;;;; +AA11;CHAM LETTER NHA;Lo;0;L;;;;;N;;;;; +AA12;CHAM LETTER NHJA;Lo;0;L;;;;;N;;;;; +AA13;CHAM LETTER TA;Lo;0;L;;;;;N;;;;; +AA14;CHAM LETTER THA;Lo;0;L;;;;;N;;;;; +AA15;CHAM LETTER DA;Lo;0;L;;;;;N;;;;; +AA16;CHAM LETTER DHA;Lo;0;L;;;;;N;;;;; +AA17;CHAM LETTER NUE;Lo;0;L;;;;;N;;;;; +AA18;CHAM LETTER NA;Lo;0;L;;;;;N;;;;; +AA19;CHAM LETTER DDA;Lo;0;L;;;;;N;;;;; +AA1A;CHAM LETTER PA;Lo;0;L;;;;;N;;;;; +AA1B;CHAM LETTER PPA;Lo;0;L;;;;;N;;;;; +AA1C;CHAM LETTER PHA;Lo;0;L;;;;;N;;;;; +AA1D;CHAM LETTER BA;Lo;0;L;;;;;N;;;;; +AA1E;CHAM LETTER BHA;Lo;0;L;;;;;N;;;;; +AA1F;CHAM LETTER MUE;Lo;0;L;;;;;N;;;;; +AA20;CHAM LETTER MA;Lo;0;L;;;;;N;;;;; +AA21;CHAM LETTER BBA;Lo;0;L;;;;;N;;;;; +AA22;CHAM LETTER YA;Lo;0;L;;;;;N;;;;; +AA23;CHAM LETTER RA;Lo;0;L;;;;;N;;;;; +AA24;CHAM LETTER LA;Lo;0;L;;;;;N;;;;; +AA25;CHAM LETTER VA;Lo;0;L;;;;;N;;;;; +AA26;CHAM LETTER SSA;Lo;0;L;;;;;N;;;;; +AA27;CHAM LETTER SA;Lo;0;L;;;;;N;;;;; +AA28;CHAM LETTER HA;Lo;0;L;;;;;N;;;;; +AA29;CHAM VOWEL SIGN AA;Mn;0;NSM;;;;;N;;;;; +AA2A;CHAM VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +AA2B;CHAM VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; +AA2C;CHAM VOWEL SIGN EI;Mn;0;NSM;;;;;N;;;;; +AA2D;CHAM VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +AA2E;CHAM VOWEL SIGN OE;Mn;0;NSM;;;;;N;;;;; +AA2F;CHAM VOWEL SIGN O;Mc;0;L;;;;;N;;;;; +AA30;CHAM VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; +AA31;CHAM VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;; +AA32;CHAM VOWEL SIGN UE;Mn;0;NSM;;;;;N;;;;; +AA33;CHAM CONSONANT SIGN YA;Mc;0;L;;;;;N;;;;; +AA34;CHAM CONSONANT SIGN RA;Mc;0;L;;;;;N;;;;; +AA35;CHAM CONSONANT SIGN LA;Mn;0;NSM;;;;;N;;;;; +AA36;CHAM CONSONANT SIGN WA;Mn;0;NSM;;;;;N;;;;; +AA40;CHAM LETTER FINAL K;Lo;0;L;;;;;N;;;;; +AA41;CHAM LETTER FINAL G;Lo;0;L;;;;;N;;;;; +AA42;CHAM LETTER FINAL NG;Lo;0;L;;;;;N;;;;; +AA43;CHAM CONSONANT SIGN FINAL NG;Mn;0;NSM;;;;;N;;;;; +AA44;CHAM LETTER FINAL CH;Lo;0;L;;;;;N;;;;; +AA45;CHAM LETTER FINAL T;Lo;0;L;;;;;N;;;;; +AA46;CHAM LETTER FINAL N;Lo;0;L;;;;;N;;;;; +AA47;CHAM LETTER FINAL P;Lo;0;L;;;;;N;;;;; +AA48;CHAM LETTER FINAL Y;Lo;0;L;;;;;N;;;;; +AA49;CHAM LETTER FINAL R;Lo;0;L;;;;;N;;;;; +AA4A;CHAM LETTER FINAL L;Lo;0;L;;;;;N;;;;; +AA4B;CHAM LETTER FINAL SS;Lo;0;L;;;;;N;;;;; +AA4C;CHAM CONSONANT SIGN FINAL M;Mn;0;NSM;;;;;N;;;;; +AA4D;CHAM CONSONANT SIGN FINAL H;Mc;0;L;;;;;N;;;;; +AA50;CHAM DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +AA51;CHAM DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +AA52;CHAM DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +AA53;CHAM DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +AA54;CHAM DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +AA55;CHAM DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +AA56;CHAM DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +AA57;CHAM DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +AA58;CHAM DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +AA59;CHAM DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +AA5C;CHAM PUNCTUATION SPIRAL;Po;0;L;;;;;N;;;;; +AA5D;CHAM PUNCTUATION DANDA;Po;0;L;;;;;N;;;;; +AA5E;CHAM PUNCTUATION DOUBLE DANDA;Po;0;L;;;;;N;;;;; +AA5F;CHAM PUNCTUATION TRIPLE DANDA;Po;0;L;;;;;N;;;;; +AA60;MYANMAR LETTER KHAMTI GA;Lo;0;L;;;;;N;;;;; +AA61;MYANMAR LETTER KHAMTI CA;Lo;0;L;;;;;N;;;;; +AA62;MYANMAR LETTER KHAMTI CHA;Lo;0;L;;;;;N;;;;; +AA63;MYANMAR LETTER KHAMTI JA;Lo;0;L;;;;;N;;;;; +AA64;MYANMAR LETTER KHAMTI JHA;Lo;0;L;;;;;N;;;;; +AA65;MYANMAR LETTER KHAMTI NYA;Lo;0;L;;;;;N;;;;; +AA66;MYANMAR LETTER KHAMTI TTA;Lo;0;L;;;;;N;;;;; +AA67;MYANMAR LETTER KHAMTI TTHA;Lo;0;L;;;;;N;;;;; +AA68;MYANMAR LETTER KHAMTI DDA;Lo;0;L;;;;;N;;;;; +AA69;MYANMAR LETTER KHAMTI DDHA;Lo;0;L;;;;;N;;;;; +AA6A;MYANMAR LETTER KHAMTI DHA;Lo;0;L;;;;;N;;;;; +AA6B;MYANMAR LETTER KHAMTI NA;Lo;0;L;;;;;N;;;;; +AA6C;MYANMAR LETTER KHAMTI SA;Lo;0;L;;;;;N;;;;; +AA6D;MYANMAR LETTER KHAMTI HA;Lo;0;L;;;;;N;;;;; +AA6E;MYANMAR LETTER KHAMTI HHA;Lo;0;L;;;;;N;;;;; +AA6F;MYANMAR LETTER KHAMTI FA;Lo;0;L;;;;;N;;;;; +AA70;MYANMAR MODIFIER LETTER KHAMTI REDUPLICATION;Lm;0;L;;;;;N;;;;; +AA71;MYANMAR LETTER KHAMTI XA;Lo;0;L;;;;;N;;;;; +AA72;MYANMAR LETTER KHAMTI ZA;Lo;0;L;;;;;N;;;;; +AA73;MYANMAR LETTER KHAMTI RA;Lo;0;L;;;;;N;;;;; +AA74;MYANMAR LOGOGRAM KHAMTI OAY;Lo;0;L;;;;;N;;;;; +AA75;MYANMAR LOGOGRAM KHAMTI QN;Lo;0;L;;;;;N;;;;; +AA76;MYANMAR LOGOGRAM KHAMTI HM;Lo;0;L;;;;;N;;;;; +AA77;MYANMAR SYMBOL AITON EXCLAMATION;So;0;L;;;;;N;;;;; +AA78;MYANMAR SYMBOL AITON ONE;So;0;L;;;;;N;;;;; +AA79;MYANMAR SYMBOL AITON TWO;So;0;L;;;;;N;;;;; +AA7A;MYANMAR LETTER AITON RA;Lo;0;L;;;;;N;;;;; +AA7B;MYANMAR SIGN PAO KAREN TONE;Mc;0;L;;;;;N;;;;; +AA7C;MYANMAR SIGN TAI LAING TONE-2;Mn;0;NSM;;;;;N;;;;; +AA7D;MYANMAR SIGN TAI LAING TONE-5;Mc;0;L;;;;;N;;;;; +AA7E;MYANMAR LETTER SHWE PALAUNG CHA;Lo;0;L;;;;;N;;;;; +AA7F;MYANMAR LETTER SHWE PALAUNG SHA;Lo;0;L;;;;;N;;;;; +AA80;TAI VIET LETTER LOW KO;Lo;0;L;;;;;N;;;;; +AA81;TAI VIET LETTER HIGH KO;Lo;0;L;;;;;N;;;;; +AA82;TAI VIET LETTER LOW KHO;Lo;0;L;;;;;N;;;;; +AA83;TAI VIET LETTER HIGH KHO;Lo;0;L;;;;;N;;;;; +AA84;TAI VIET LETTER LOW KHHO;Lo;0;L;;;;;N;;;;; +AA85;TAI VIET LETTER HIGH KHHO;Lo;0;L;;;;;N;;;;; +AA86;TAI VIET LETTER LOW GO;Lo;0;L;;;;;N;;;;; +AA87;TAI VIET LETTER HIGH GO;Lo;0;L;;;;;N;;;;; +AA88;TAI VIET LETTER LOW NGO;Lo;0;L;;;;;N;;;;; +AA89;TAI VIET LETTER HIGH NGO;Lo;0;L;;;;;N;;;;; +AA8A;TAI VIET LETTER LOW CO;Lo;0;L;;;;;N;;;;; +AA8B;TAI VIET LETTER HIGH CO;Lo;0;L;;;;;N;;;;; +AA8C;TAI VIET LETTER LOW CHO;Lo;0;L;;;;;N;;;;; +AA8D;TAI VIET LETTER HIGH CHO;Lo;0;L;;;;;N;;;;; +AA8E;TAI VIET LETTER LOW SO;Lo;0;L;;;;;N;;;;; +AA8F;TAI VIET LETTER HIGH SO;Lo;0;L;;;;;N;;;;; +AA90;TAI VIET LETTER LOW NYO;Lo;0;L;;;;;N;;;;; +AA91;TAI VIET LETTER HIGH NYO;Lo;0;L;;;;;N;;;;; +AA92;TAI VIET LETTER LOW DO;Lo;0;L;;;;;N;;;;; +AA93;TAI VIET LETTER HIGH DO;Lo;0;L;;;;;N;;;;; +AA94;TAI VIET LETTER LOW TO;Lo;0;L;;;;;N;;;;; +AA95;TAI VIET LETTER HIGH TO;Lo;0;L;;;;;N;;;;; +AA96;TAI VIET LETTER LOW THO;Lo;0;L;;;;;N;;;;; +AA97;TAI VIET LETTER HIGH THO;Lo;0;L;;;;;N;;;;; +AA98;TAI VIET LETTER LOW NO;Lo;0;L;;;;;N;;;;; +AA99;TAI VIET LETTER HIGH NO;Lo;0;L;;;;;N;;;;; +AA9A;TAI VIET LETTER LOW BO;Lo;0;L;;;;;N;;;;; +AA9B;TAI VIET LETTER HIGH BO;Lo;0;L;;;;;N;;;;; +AA9C;TAI VIET LETTER LOW PO;Lo;0;L;;;;;N;;;;; +AA9D;TAI VIET LETTER HIGH PO;Lo;0;L;;;;;N;;;;; +AA9E;TAI VIET LETTER LOW PHO;Lo;0;L;;;;;N;;;;; +AA9F;TAI VIET LETTER HIGH PHO;Lo;0;L;;;;;N;;;;; +AAA0;TAI VIET LETTER LOW FO;Lo;0;L;;;;;N;;;;; +AAA1;TAI VIET LETTER HIGH FO;Lo;0;L;;;;;N;;;;; +AAA2;TAI VIET LETTER LOW MO;Lo;0;L;;;;;N;;;;; +AAA3;TAI VIET LETTER HIGH MO;Lo;0;L;;;;;N;;;;; +AAA4;TAI VIET LETTER LOW YO;Lo;0;L;;;;;N;;;;; +AAA5;TAI VIET LETTER HIGH YO;Lo;0;L;;;;;N;;;;; +AAA6;TAI VIET LETTER LOW RO;Lo;0;L;;;;;N;;;;; +AAA7;TAI VIET LETTER HIGH RO;Lo;0;L;;;;;N;;;;; +AAA8;TAI VIET LETTER LOW LO;Lo;0;L;;;;;N;;;;; +AAA9;TAI VIET LETTER HIGH LO;Lo;0;L;;;;;N;;;;; +AAAA;TAI VIET LETTER LOW VO;Lo;0;L;;;;;N;;;;; +AAAB;TAI VIET LETTER HIGH VO;Lo;0;L;;;;;N;;;;; +AAAC;TAI VIET LETTER LOW HO;Lo;0;L;;;;;N;;;;; +AAAD;TAI VIET LETTER HIGH HO;Lo;0;L;;;;;N;;;;; +AAAE;TAI VIET LETTER LOW O;Lo;0;L;;;;;N;;;;; +AAAF;TAI VIET LETTER HIGH O;Lo;0;L;;;;;N;;;;; +AAB0;TAI VIET MAI KANG;Mn;230;NSM;;;;;N;;;;; +AAB1;TAI VIET VOWEL AA;Lo;0;L;;;;;N;;;;; +AAB2;TAI VIET VOWEL I;Mn;230;NSM;;;;;N;;;;; +AAB3;TAI VIET VOWEL UE;Mn;230;NSM;;;;;N;;;;; +AAB4;TAI VIET VOWEL U;Mn;220;NSM;;;;;N;;;;; +AAB5;TAI VIET VOWEL E;Lo;0;L;;;;;N;;;;; +AAB6;TAI VIET VOWEL O;Lo;0;L;;;;;N;;;;; +AAB7;TAI VIET MAI KHIT;Mn;230;NSM;;;;;N;;;;; +AAB8;TAI VIET VOWEL IA;Mn;230;NSM;;;;;N;;;;; +AAB9;TAI VIET VOWEL UEA;Lo;0;L;;;;;N;;;;; +AABA;TAI VIET VOWEL UA;Lo;0;L;;;;;N;;;;; +AABB;TAI VIET VOWEL AUE;Lo;0;L;;;;;N;;;;; +AABC;TAI VIET VOWEL AY;Lo;0;L;;;;;N;;;;; +AABD;TAI VIET VOWEL AN;Lo;0;L;;;;;N;;;;; +AABE;TAI VIET VOWEL AM;Mn;230;NSM;;;;;N;;;;; +AABF;TAI VIET TONE MAI EK;Mn;230;NSM;;;;;N;;;;; +AAC0;TAI VIET TONE MAI NUENG;Lo;0;L;;;;;N;;;;; +AAC1;TAI VIET TONE MAI THO;Mn;230;NSM;;;;;N;;;;; +AAC2;TAI VIET TONE MAI SONG;Lo;0;L;;;;;N;;;;; +AADB;TAI VIET SYMBOL KON;Lo;0;L;;;;;N;;;;; +AADC;TAI VIET SYMBOL NUENG;Lo;0;L;;;;;N;;;;; +AADD;TAI VIET SYMBOL SAM;Lm;0;L;;;;;N;;;;; +AADE;TAI VIET SYMBOL HO HOI;Po;0;L;;;;;N;;;;; +AADF;TAI VIET SYMBOL KOI KOI;Po;0;L;;;;;N;;;;; +AAE0;MEETEI MAYEK LETTER E;Lo;0;L;;;;;N;;;;; +AAE1;MEETEI MAYEK LETTER O;Lo;0;L;;;;;N;;;;; +AAE2;MEETEI MAYEK LETTER CHA;Lo;0;L;;;;;N;;;;; +AAE3;MEETEI MAYEK LETTER NYA;Lo;0;L;;;;;N;;;;; +AAE4;MEETEI MAYEK LETTER TTA;Lo;0;L;;;;;N;;;;; +AAE5;MEETEI MAYEK LETTER TTHA;Lo;0;L;;;;;N;;;;; +AAE6;MEETEI MAYEK LETTER DDA;Lo;0;L;;;;;N;;;;; +AAE7;MEETEI MAYEK LETTER DDHA;Lo;0;L;;;;;N;;;;; +AAE8;MEETEI MAYEK LETTER NNA;Lo;0;L;;;;;N;;;;; +AAE9;MEETEI MAYEK LETTER SHA;Lo;0;L;;;;;N;;;;; +AAEA;MEETEI MAYEK LETTER SSA;Lo;0;L;;;;;N;;;;; +AAEB;MEETEI MAYEK VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +AAEC;MEETEI MAYEK VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +AAED;MEETEI MAYEK VOWEL SIGN AAI;Mn;0;NSM;;;;;N;;;;; +AAEE;MEETEI MAYEK VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; +AAEF;MEETEI MAYEK VOWEL SIGN AAU;Mc;0;L;;;;;N;;;;; +AAF0;MEETEI MAYEK CHEIKHAN;Po;0;L;;;;;N;;;;; +AAF1;MEETEI MAYEK AHANG KHUDAM;Po;0;L;;;;;N;;;;; +AAF2;MEETEI MAYEK ANJI;Lo;0;L;;;;;N;;;;; +AAF3;MEETEI MAYEK SYLLABLE REPETITION MARK;Lm;0;L;;;;;N;;;;; +AAF4;MEETEI MAYEK WORD REPETITION MARK;Lm;0;L;;;;;N;;;;; +AAF5;MEETEI MAYEK VOWEL SIGN VISARGA;Mc;0;L;;;;;N;;;;; +AAF6;MEETEI MAYEK VIRAMA;Mn;9;NSM;;;;;N;;;;; +AB01;ETHIOPIC SYLLABLE TTHU;Lo;0;L;;;;;N;;;;; +AB02;ETHIOPIC SYLLABLE TTHI;Lo;0;L;;;;;N;;;;; +AB03;ETHIOPIC SYLLABLE TTHAA;Lo;0;L;;;;;N;;;;; +AB04;ETHIOPIC SYLLABLE TTHEE;Lo;0;L;;;;;N;;;;; +AB05;ETHIOPIC SYLLABLE TTHE;Lo;0;L;;;;;N;;;;; +AB06;ETHIOPIC SYLLABLE TTHO;Lo;0;L;;;;;N;;;;; +AB09;ETHIOPIC SYLLABLE DDHU;Lo;0;L;;;;;N;;;;; +AB0A;ETHIOPIC SYLLABLE DDHI;Lo;0;L;;;;;N;;;;; +AB0B;ETHIOPIC SYLLABLE DDHAA;Lo;0;L;;;;;N;;;;; +AB0C;ETHIOPIC SYLLABLE DDHEE;Lo;0;L;;;;;N;;;;; +AB0D;ETHIOPIC SYLLABLE DDHE;Lo;0;L;;;;;N;;;;; +AB0E;ETHIOPIC SYLLABLE DDHO;Lo;0;L;;;;;N;;;;; +AB11;ETHIOPIC SYLLABLE DZU;Lo;0;L;;;;;N;;;;; +AB12;ETHIOPIC SYLLABLE DZI;Lo;0;L;;;;;N;;;;; +AB13;ETHIOPIC SYLLABLE DZAA;Lo;0;L;;;;;N;;;;; +AB14;ETHIOPIC SYLLABLE DZEE;Lo;0;L;;;;;N;;;;; +AB15;ETHIOPIC SYLLABLE DZE;Lo;0;L;;;;;N;;;;; +AB16;ETHIOPIC SYLLABLE DZO;Lo;0;L;;;;;N;;;;; +AB20;ETHIOPIC SYLLABLE CCHHA;Lo;0;L;;;;;N;;;;; +AB21;ETHIOPIC SYLLABLE CCHHU;Lo;0;L;;;;;N;;;;; +AB22;ETHIOPIC SYLLABLE CCHHI;Lo;0;L;;;;;N;;;;; +AB23;ETHIOPIC SYLLABLE CCHHAA;Lo;0;L;;;;;N;;;;; +AB24;ETHIOPIC SYLLABLE CCHHEE;Lo;0;L;;;;;N;;;;; +AB25;ETHIOPIC SYLLABLE CCHHE;Lo;0;L;;;;;N;;;;; +AB26;ETHIOPIC SYLLABLE CCHHO;Lo;0;L;;;;;N;;;;; +AB28;ETHIOPIC SYLLABLE BBA;Lo;0;L;;;;;N;;;;; +AB29;ETHIOPIC SYLLABLE BBU;Lo;0;L;;;;;N;;;;; +AB2A;ETHIOPIC SYLLABLE BBI;Lo;0;L;;;;;N;;;;; +AB2B;ETHIOPIC SYLLABLE BBAA;Lo;0;L;;;;;N;;;;; +AB2C;ETHIOPIC SYLLABLE BBEE;Lo;0;L;;;;;N;;;;; +AB2D;ETHIOPIC SYLLABLE BBE;Lo;0;L;;;;;N;;;;; +AB2E;ETHIOPIC SYLLABLE BBO;Lo;0;L;;;;;N;;;;; +AB30;LATIN SMALL LETTER BARRED ALPHA;Ll;0;L;;;;;N;;;;; +AB31;LATIN SMALL LETTER A REVERSED-SCHWA;Ll;0;L;;;;;N;;;;; +AB32;LATIN SMALL LETTER BLACKLETTER E;Ll;0;L;;;;;N;;;;; +AB33;LATIN SMALL LETTER BARRED E;Ll;0;L;;;;;N;;;;; +AB34;LATIN SMALL LETTER E WITH FLOURISH;Ll;0;L;;;;;N;;;;; +AB35;LATIN SMALL LETTER LENIS F;Ll;0;L;;;;;N;;;;; +AB36;LATIN SMALL LETTER SCRIPT G WITH CROSSED-TAIL;Ll;0;L;;;;;N;;;;; +AB37;LATIN SMALL LETTER L WITH INVERTED LAZY S;Ll;0;L;;;;;N;;;;; +AB38;LATIN SMALL LETTER L WITH DOUBLE MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +AB39;LATIN SMALL LETTER L WITH MIDDLE RING;Ll;0;L;;;;;N;;;;; +AB3A;LATIN SMALL LETTER M WITH CROSSED-TAIL;Ll;0;L;;;;;N;;;;; +AB3B;LATIN SMALL LETTER N WITH CROSSED-TAIL;Ll;0;L;;;;;N;;;;; +AB3C;LATIN SMALL LETTER ENG WITH CROSSED-TAIL;Ll;0;L;;;;;N;;;;; +AB3D;LATIN SMALL LETTER BLACKLETTER O;Ll;0;L;;;;;N;;;;; +AB3E;LATIN SMALL LETTER BLACKLETTER O WITH STROKE;Ll;0;L;;;;;N;;;;; +AB3F;LATIN SMALL LETTER OPEN O WITH STROKE;Ll;0;L;;;;;N;;;;; +AB40;LATIN SMALL LETTER INVERTED OE;Ll;0;L;;;;;N;;;;; +AB41;LATIN SMALL LETTER TURNED OE WITH STROKE;Ll;0;L;;;;;N;;;;; +AB42;LATIN SMALL LETTER TURNED OE WITH HORIZONTAL STROKE;Ll;0;L;;;;;N;;;;; +AB43;LATIN SMALL LETTER TURNED O OPEN-O;Ll;0;L;;;;;N;;;;; +AB44;LATIN SMALL LETTER TURNED O OPEN-O WITH STROKE;Ll;0;L;;;;;N;;;;; +AB45;LATIN SMALL LETTER STIRRUP R;Ll;0;L;;;;;N;;;;; +AB46;LATIN LETTER SMALL CAPITAL R WITH RIGHT LEG;Ll;0;L;;;;;N;;;;; +AB47;LATIN SMALL LETTER R WITHOUT HANDLE;Ll;0;L;;;;;N;;;;; +AB48;LATIN SMALL LETTER DOUBLE R;Ll;0;L;;;;;N;;;;; +AB49;LATIN SMALL LETTER R WITH CROSSED-TAIL;Ll;0;L;;;;;N;;;;; +AB4A;LATIN SMALL LETTER DOUBLE R WITH CROSSED-TAIL;Ll;0;L;;;;;N;;;;; +AB4B;LATIN SMALL LETTER SCRIPT R;Ll;0;L;;;;;N;;;;; +AB4C;LATIN SMALL LETTER SCRIPT R WITH RING;Ll;0;L;;;;;N;;;;; +AB4D;LATIN SMALL LETTER BASELINE ESH;Ll;0;L;;;;;N;;;;; +AB4E;LATIN SMALL LETTER U WITH SHORT RIGHT LEG;Ll;0;L;;;;;N;;;;; +AB4F;LATIN SMALL LETTER U BAR WITH SHORT RIGHT LEG;Ll;0;L;;;;;N;;;;; +AB50;LATIN SMALL LETTER UI;Ll;0;L;;;;;N;;;;; +AB51;LATIN SMALL LETTER TURNED UI;Ll;0;L;;;;;N;;;;; +AB52;LATIN SMALL LETTER U WITH LEFT HOOK;Ll;0;L;;;;;N;;;;; +AB53;LATIN SMALL LETTER CHI;Ll;0;L;;;;;N;;;A7B3;;A7B3 +AB54;LATIN SMALL LETTER CHI WITH LOW RIGHT RING;Ll;0;L;;;;;N;;;;; +AB55;LATIN SMALL LETTER CHI WITH LOW LEFT SERIF;Ll;0;L;;;;;N;;;;; +AB56;LATIN SMALL LETTER X WITH LOW RIGHT RING;Ll;0;L;;;;;N;;;;; +AB57;LATIN SMALL LETTER X WITH LONG LEFT LEG;Ll;0;L;;;;;N;;;;; +AB58;LATIN SMALL LETTER X WITH LONG LEFT LEG AND LOW RIGHT RING;Ll;0;L;;;;;N;;;;; +AB59;LATIN SMALL LETTER X WITH LONG LEFT LEG WITH SERIF;Ll;0;L;;;;;N;;;;; +AB5A;LATIN SMALL LETTER Y WITH SHORT RIGHT LEG;Ll;0;L;;;;;N;;;;; +AB5B;MODIFIER BREVE WITH INVERTED BREVE;Sk;0;L;;;;;N;;;;; +AB5C;MODIFIER LETTER SMALL HENG;Lm;0;L;<super> A727;;;;N;;;;; +AB5D;MODIFIER LETTER SMALL L WITH INVERTED LAZY S;Lm;0;L;<super> AB37;;;;N;;;;; +AB5E;MODIFIER LETTER SMALL L WITH MIDDLE TILDE;Lm;0;L;<super> 026B;;;;N;;;;; +AB5F;MODIFIER LETTER SMALL U WITH LEFT HOOK;Lm;0;L;<super> AB52;;;;N;;;;; +AB60;LATIN SMALL LETTER SAKHA YAT;Ll;0;L;;;;;N;;;;; +AB61;LATIN SMALL LETTER IOTIFIED E;Ll;0;L;;;;;N;;;;; +AB62;LATIN SMALL LETTER OPEN OE;Ll;0;L;;;;;N;;;;; +AB63;LATIN SMALL LETTER UO;Ll;0;L;;;;;N;;;;; +AB64;LATIN SMALL LETTER INVERTED ALPHA;Ll;0;L;;;;;N;;;;; +AB65;GREEK LETTER SMALL CAPITAL OMEGA;Ll;0;L;;;;;N;;;;; +AB70;CHEROKEE SMALL LETTER A;Ll;0;L;;;;;N;;;13A0;;13A0 +AB71;CHEROKEE SMALL LETTER E;Ll;0;L;;;;;N;;;13A1;;13A1 +AB72;CHEROKEE SMALL LETTER I;Ll;0;L;;;;;N;;;13A2;;13A2 +AB73;CHEROKEE SMALL LETTER O;Ll;0;L;;;;;N;;;13A3;;13A3 +AB74;CHEROKEE SMALL LETTER U;Ll;0;L;;;;;N;;;13A4;;13A4 +AB75;CHEROKEE SMALL LETTER V;Ll;0;L;;;;;N;;;13A5;;13A5 +AB76;CHEROKEE SMALL LETTER GA;Ll;0;L;;;;;N;;;13A6;;13A6 +AB77;CHEROKEE SMALL LETTER KA;Ll;0;L;;;;;N;;;13A7;;13A7 +AB78;CHEROKEE SMALL LETTER GE;Ll;0;L;;;;;N;;;13A8;;13A8 +AB79;CHEROKEE SMALL LETTER GI;Ll;0;L;;;;;N;;;13A9;;13A9 +AB7A;CHEROKEE SMALL LETTER GO;Ll;0;L;;;;;N;;;13AA;;13AA +AB7B;CHEROKEE SMALL LETTER GU;Ll;0;L;;;;;N;;;13AB;;13AB +AB7C;CHEROKEE SMALL LETTER GV;Ll;0;L;;;;;N;;;13AC;;13AC +AB7D;CHEROKEE SMALL LETTER HA;Ll;0;L;;;;;N;;;13AD;;13AD +AB7E;CHEROKEE SMALL LETTER HE;Ll;0;L;;;;;N;;;13AE;;13AE +AB7F;CHEROKEE SMALL LETTER HI;Ll;0;L;;;;;N;;;13AF;;13AF +AB80;CHEROKEE SMALL LETTER HO;Ll;0;L;;;;;N;;;13B0;;13B0 +AB81;CHEROKEE SMALL LETTER HU;Ll;0;L;;;;;N;;;13B1;;13B1 +AB82;CHEROKEE SMALL LETTER HV;Ll;0;L;;;;;N;;;13B2;;13B2 +AB83;CHEROKEE SMALL LETTER LA;Ll;0;L;;;;;N;;;13B3;;13B3 +AB84;CHEROKEE SMALL LETTER LE;Ll;0;L;;;;;N;;;13B4;;13B4 +AB85;CHEROKEE SMALL LETTER LI;Ll;0;L;;;;;N;;;13B5;;13B5 +AB86;CHEROKEE SMALL LETTER LO;Ll;0;L;;;;;N;;;13B6;;13B6 +AB87;CHEROKEE SMALL LETTER LU;Ll;0;L;;;;;N;;;13B7;;13B7 +AB88;CHEROKEE SMALL LETTER LV;Ll;0;L;;;;;N;;;13B8;;13B8 +AB89;CHEROKEE SMALL LETTER MA;Ll;0;L;;;;;N;;;13B9;;13B9 +AB8A;CHEROKEE SMALL LETTER ME;Ll;0;L;;;;;N;;;13BA;;13BA +AB8B;CHEROKEE SMALL LETTER MI;Ll;0;L;;;;;N;;;13BB;;13BB +AB8C;CHEROKEE SMALL LETTER MO;Ll;0;L;;;;;N;;;13BC;;13BC +AB8D;CHEROKEE SMALL LETTER MU;Ll;0;L;;;;;N;;;13BD;;13BD +AB8E;CHEROKEE SMALL LETTER NA;Ll;0;L;;;;;N;;;13BE;;13BE +AB8F;CHEROKEE SMALL LETTER HNA;Ll;0;L;;;;;N;;;13BF;;13BF +AB90;CHEROKEE SMALL LETTER NAH;Ll;0;L;;;;;N;;;13C0;;13C0 +AB91;CHEROKEE SMALL LETTER NE;Ll;0;L;;;;;N;;;13C1;;13C1 +AB92;CHEROKEE SMALL LETTER NI;Ll;0;L;;;;;N;;;13C2;;13C2 +AB93;CHEROKEE SMALL LETTER NO;Ll;0;L;;;;;N;;;13C3;;13C3 +AB94;CHEROKEE SMALL LETTER NU;Ll;0;L;;;;;N;;;13C4;;13C4 +AB95;CHEROKEE SMALL LETTER NV;Ll;0;L;;;;;N;;;13C5;;13C5 +AB96;CHEROKEE SMALL LETTER QUA;Ll;0;L;;;;;N;;;13C6;;13C6 +AB97;CHEROKEE SMALL LETTER QUE;Ll;0;L;;;;;N;;;13C7;;13C7 +AB98;CHEROKEE SMALL LETTER QUI;Ll;0;L;;;;;N;;;13C8;;13C8 +AB99;CHEROKEE SMALL LETTER QUO;Ll;0;L;;;;;N;;;13C9;;13C9 +AB9A;CHEROKEE SMALL LETTER QUU;Ll;0;L;;;;;N;;;13CA;;13CA +AB9B;CHEROKEE SMALL LETTER QUV;Ll;0;L;;;;;N;;;13CB;;13CB +AB9C;CHEROKEE SMALL LETTER SA;Ll;0;L;;;;;N;;;13CC;;13CC +AB9D;CHEROKEE SMALL LETTER S;Ll;0;L;;;;;N;;;13CD;;13CD +AB9E;CHEROKEE SMALL LETTER SE;Ll;0;L;;;;;N;;;13CE;;13CE +AB9F;CHEROKEE SMALL LETTER SI;Ll;0;L;;;;;N;;;13CF;;13CF +ABA0;CHEROKEE SMALL LETTER SO;Ll;0;L;;;;;N;;;13D0;;13D0 +ABA1;CHEROKEE SMALL LETTER SU;Ll;0;L;;;;;N;;;13D1;;13D1 +ABA2;CHEROKEE SMALL LETTER SV;Ll;0;L;;;;;N;;;13D2;;13D2 +ABA3;CHEROKEE SMALL LETTER DA;Ll;0;L;;;;;N;;;13D3;;13D3 +ABA4;CHEROKEE SMALL LETTER TA;Ll;0;L;;;;;N;;;13D4;;13D4 +ABA5;CHEROKEE SMALL LETTER DE;Ll;0;L;;;;;N;;;13D5;;13D5 +ABA6;CHEROKEE SMALL LETTER TE;Ll;0;L;;;;;N;;;13D6;;13D6 +ABA7;CHEROKEE SMALL LETTER DI;Ll;0;L;;;;;N;;;13D7;;13D7 +ABA8;CHEROKEE SMALL LETTER TI;Ll;0;L;;;;;N;;;13D8;;13D8 +ABA9;CHEROKEE SMALL LETTER DO;Ll;0;L;;;;;N;;;13D9;;13D9 +ABAA;CHEROKEE SMALL LETTER DU;Ll;0;L;;;;;N;;;13DA;;13DA +ABAB;CHEROKEE SMALL LETTER DV;Ll;0;L;;;;;N;;;13DB;;13DB +ABAC;CHEROKEE SMALL LETTER DLA;Ll;0;L;;;;;N;;;13DC;;13DC +ABAD;CHEROKEE SMALL LETTER TLA;Ll;0;L;;;;;N;;;13DD;;13DD +ABAE;CHEROKEE SMALL LETTER TLE;Ll;0;L;;;;;N;;;13DE;;13DE +ABAF;CHEROKEE SMALL LETTER TLI;Ll;0;L;;;;;N;;;13DF;;13DF +ABB0;CHEROKEE SMALL LETTER TLO;Ll;0;L;;;;;N;;;13E0;;13E0 +ABB1;CHEROKEE SMALL LETTER TLU;Ll;0;L;;;;;N;;;13E1;;13E1 +ABB2;CHEROKEE SMALL LETTER TLV;Ll;0;L;;;;;N;;;13E2;;13E2 +ABB3;CHEROKEE SMALL LETTER TSA;Ll;0;L;;;;;N;;;13E3;;13E3 +ABB4;CHEROKEE SMALL LETTER TSE;Ll;0;L;;;;;N;;;13E4;;13E4 +ABB5;CHEROKEE SMALL LETTER TSI;Ll;0;L;;;;;N;;;13E5;;13E5 +ABB6;CHEROKEE SMALL LETTER TSO;Ll;0;L;;;;;N;;;13E6;;13E6 +ABB7;CHEROKEE SMALL LETTER TSU;Ll;0;L;;;;;N;;;13E7;;13E7 +ABB8;CHEROKEE SMALL LETTER TSV;Ll;0;L;;;;;N;;;13E8;;13E8 +ABB9;CHEROKEE SMALL LETTER WA;Ll;0;L;;;;;N;;;13E9;;13E9 +ABBA;CHEROKEE SMALL LETTER WE;Ll;0;L;;;;;N;;;13EA;;13EA +ABBB;CHEROKEE SMALL LETTER WI;Ll;0;L;;;;;N;;;13EB;;13EB +ABBC;CHEROKEE SMALL LETTER WO;Ll;0;L;;;;;N;;;13EC;;13EC +ABBD;CHEROKEE SMALL LETTER WU;Ll;0;L;;;;;N;;;13ED;;13ED +ABBE;CHEROKEE SMALL LETTER WV;Ll;0;L;;;;;N;;;13EE;;13EE +ABBF;CHEROKEE SMALL LETTER YA;Ll;0;L;;;;;N;;;13EF;;13EF +ABC0;MEETEI MAYEK LETTER KOK;Lo;0;L;;;;;N;;;;; +ABC1;MEETEI MAYEK LETTER SAM;Lo;0;L;;;;;N;;;;; +ABC2;MEETEI MAYEK LETTER LAI;Lo;0;L;;;;;N;;;;; +ABC3;MEETEI MAYEK LETTER MIT;Lo;0;L;;;;;N;;;;; +ABC4;MEETEI MAYEK LETTER PA;Lo;0;L;;;;;N;;;;; +ABC5;MEETEI MAYEK LETTER NA;Lo;0;L;;;;;N;;;;; +ABC6;MEETEI MAYEK LETTER CHIL;Lo;0;L;;;;;N;;;;; +ABC7;MEETEI MAYEK LETTER TIL;Lo;0;L;;;;;N;;;;; +ABC8;MEETEI MAYEK LETTER KHOU;Lo;0;L;;;;;N;;;;; +ABC9;MEETEI MAYEK LETTER NGOU;Lo;0;L;;;;;N;;;;; +ABCA;MEETEI MAYEK LETTER THOU;Lo;0;L;;;;;N;;;;; +ABCB;MEETEI MAYEK LETTER WAI;Lo;0;L;;;;;N;;;;; +ABCC;MEETEI MAYEK LETTER YANG;Lo;0;L;;;;;N;;;;; +ABCD;MEETEI MAYEK LETTER HUK;Lo;0;L;;;;;N;;;;; +ABCE;MEETEI MAYEK LETTER UN;Lo;0;L;;;;;N;;;;; +ABCF;MEETEI MAYEK LETTER I;Lo;0;L;;;;;N;;;;; +ABD0;MEETEI MAYEK LETTER PHAM;Lo;0;L;;;;;N;;;;; +ABD1;MEETEI MAYEK LETTER ATIYA;Lo;0;L;;;;;N;;;;; +ABD2;MEETEI MAYEK LETTER GOK;Lo;0;L;;;;;N;;;;; +ABD3;MEETEI MAYEK LETTER JHAM;Lo;0;L;;;;;N;;;;; +ABD4;MEETEI MAYEK LETTER RAI;Lo;0;L;;;;;N;;;;; +ABD5;MEETEI MAYEK LETTER BA;Lo;0;L;;;;;N;;;;; +ABD6;MEETEI MAYEK LETTER JIL;Lo;0;L;;;;;N;;;;; +ABD7;MEETEI MAYEK LETTER DIL;Lo;0;L;;;;;N;;;;; +ABD8;MEETEI MAYEK LETTER GHOU;Lo;0;L;;;;;N;;;;; +ABD9;MEETEI MAYEK LETTER DHOU;Lo;0;L;;;;;N;;;;; +ABDA;MEETEI MAYEK LETTER BHAM;Lo;0;L;;;;;N;;;;; +ABDB;MEETEI MAYEK LETTER KOK LONSUM;Lo;0;L;;;;;N;;;;; +ABDC;MEETEI MAYEK LETTER LAI LONSUM;Lo;0;L;;;;;N;;;;; +ABDD;MEETEI MAYEK LETTER MIT LONSUM;Lo;0;L;;;;;N;;;;; +ABDE;MEETEI MAYEK LETTER PA LONSUM;Lo;0;L;;;;;N;;;;; +ABDF;MEETEI MAYEK LETTER NA LONSUM;Lo;0;L;;;;;N;;;;; +ABE0;MEETEI MAYEK LETTER TIL LONSUM;Lo;0;L;;;;;N;;;;; +ABE1;MEETEI MAYEK LETTER NGOU LONSUM;Lo;0;L;;;;;N;;;;; +ABE2;MEETEI MAYEK LETTER I LONSUM;Lo;0;L;;;;;N;;;;; +ABE3;MEETEI MAYEK VOWEL SIGN ONAP;Mc;0;L;;;;;N;;;;; +ABE4;MEETEI MAYEK VOWEL SIGN INAP;Mc;0;L;;;;;N;;;;; +ABE5;MEETEI MAYEK VOWEL SIGN ANAP;Mn;0;NSM;;;;;N;;;;; +ABE6;MEETEI MAYEK VOWEL SIGN YENAP;Mc;0;L;;;;;N;;;;; +ABE7;MEETEI MAYEK VOWEL SIGN SOUNAP;Mc;0;L;;;;;N;;;;; +ABE8;MEETEI MAYEK VOWEL SIGN UNAP;Mn;0;NSM;;;;;N;;;;; +ABE9;MEETEI MAYEK VOWEL SIGN CHEINAP;Mc;0;L;;;;;N;;;;; +ABEA;MEETEI MAYEK VOWEL SIGN NUNG;Mc;0;L;;;;;N;;;;; +ABEB;MEETEI MAYEK CHEIKHEI;Po;0;L;;;;;N;;;;; +ABEC;MEETEI MAYEK LUM IYEK;Mc;0;L;;;;;N;;;;; +ABED;MEETEI MAYEK APUN IYEK;Mn;9;NSM;;;;;N;;;;; +ABF0;MEETEI MAYEK DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +ABF1;MEETEI MAYEK DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +ABF2;MEETEI MAYEK DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +ABF3;MEETEI MAYEK DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +ABF4;MEETEI MAYEK DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +ABF5;MEETEI MAYEK DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +ABF6;MEETEI MAYEK DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +ABF7;MEETEI MAYEK DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +ABF8;MEETEI MAYEK DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +ABF9;MEETEI MAYEK DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +AC00;<Hangul Syllable, First>;Lo;0;L;;;;;N;;;;; +D7A3;<Hangul Syllable, Last>;Lo;0;L;;;;;N;;;;; +D7B0;HANGUL JUNGSEONG O-YEO;Lo;0;L;;;;;N;;;;; +D7B1;HANGUL JUNGSEONG O-O-I;Lo;0;L;;;;;N;;;;; +D7B2;HANGUL JUNGSEONG YO-A;Lo;0;L;;;;;N;;;;; +D7B3;HANGUL JUNGSEONG YO-AE;Lo;0;L;;;;;N;;;;; +D7B4;HANGUL JUNGSEONG YO-EO;Lo;0;L;;;;;N;;;;; +D7B5;HANGUL JUNGSEONG U-YEO;Lo;0;L;;;;;N;;;;; +D7B6;HANGUL JUNGSEONG U-I-I;Lo;0;L;;;;;N;;;;; +D7B7;HANGUL JUNGSEONG YU-AE;Lo;0;L;;;;;N;;;;; +D7B8;HANGUL JUNGSEONG YU-O;Lo;0;L;;;;;N;;;;; +D7B9;HANGUL JUNGSEONG EU-A;Lo;0;L;;;;;N;;;;; +D7BA;HANGUL JUNGSEONG EU-EO;Lo;0;L;;;;;N;;;;; +D7BB;HANGUL JUNGSEONG EU-E;Lo;0;L;;;;;N;;;;; +D7BC;HANGUL JUNGSEONG EU-O;Lo;0;L;;;;;N;;;;; +D7BD;HANGUL JUNGSEONG I-YA-O;Lo;0;L;;;;;N;;;;; +D7BE;HANGUL JUNGSEONG I-YAE;Lo;0;L;;;;;N;;;;; +D7BF;HANGUL JUNGSEONG I-YEO;Lo;0;L;;;;;N;;;;; +D7C0;HANGUL JUNGSEONG I-YE;Lo;0;L;;;;;N;;;;; +D7C1;HANGUL JUNGSEONG I-O-I;Lo;0;L;;;;;N;;;;; +D7C2;HANGUL JUNGSEONG I-YO;Lo;0;L;;;;;N;;;;; +D7C3;HANGUL JUNGSEONG I-YU;Lo;0;L;;;;;N;;;;; +D7C4;HANGUL JUNGSEONG I-I;Lo;0;L;;;;;N;;;;; +D7C5;HANGUL JUNGSEONG ARAEA-A;Lo;0;L;;;;;N;;;;; +D7C6;HANGUL JUNGSEONG ARAEA-E;Lo;0;L;;;;;N;;;;; +D7CB;HANGUL JONGSEONG NIEUN-RIEUL;Lo;0;L;;;;;N;;;;; +D7CC;HANGUL JONGSEONG NIEUN-CHIEUCH;Lo;0;L;;;;;N;;;;; +D7CD;HANGUL JONGSEONG SSANGTIKEUT;Lo;0;L;;;;;N;;;;; +D7CE;HANGUL JONGSEONG SSANGTIKEUT-PIEUP;Lo;0;L;;;;;N;;;;; +D7CF;HANGUL JONGSEONG TIKEUT-PIEUP;Lo;0;L;;;;;N;;;;; +D7D0;HANGUL JONGSEONG TIKEUT-SIOS;Lo;0;L;;;;;N;;;;; +D7D1;HANGUL JONGSEONG TIKEUT-SIOS-KIYEOK;Lo;0;L;;;;;N;;;;; +D7D2;HANGUL JONGSEONG TIKEUT-CIEUC;Lo;0;L;;;;;N;;;;; +D7D3;HANGUL JONGSEONG TIKEUT-CHIEUCH;Lo;0;L;;;;;N;;;;; +D7D4;HANGUL JONGSEONG TIKEUT-THIEUTH;Lo;0;L;;;;;N;;;;; +D7D5;HANGUL JONGSEONG RIEUL-SSANGKIYEOK;Lo;0;L;;;;;N;;;;; +D7D6;HANGUL JONGSEONG RIEUL-KIYEOK-HIEUH;Lo;0;L;;;;;N;;;;; +D7D7;HANGUL JONGSEONG SSANGRIEUL-KHIEUKH;Lo;0;L;;;;;N;;;;; +D7D8;HANGUL JONGSEONG RIEUL-MIEUM-HIEUH;Lo;0;L;;;;;N;;;;; +D7D9;HANGUL JONGSEONG RIEUL-PIEUP-TIKEUT;Lo;0;L;;;;;N;;;;; +D7DA;HANGUL JONGSEONG RIEUL-PIEUP-PHIEUPH;Lo;0;L;;;;;N;;;;; +D7DB;HANGUL JONGSEONG RIEUL-YESIEUNG;Lo;0;L;;;;;N;;;;; +D7DC;HANGUL JONGSEONG RIEUL-YEORINHIEUH-HIEUH;Lo;0;L;;;;;N;;;;; +D7DD;HANGUL JONGSEONG KAPYEOUNRIEUL;Lo;0;L;;;;;N;;;;; +D7DE;HANGUL JONGSEONG MIEUM-NIEUN;Lo;0;L;;;;;N;;;;; +D7DF;HANGUL JONGSEONG MIEUM-SSANGNIEUN;Lo;0;L;;;;;N;;;;; +D7E0;HANGUL JONGSEONG SSANGMIEUM;Lo;0;L;;;;;N;;;;; +D7E1;HANGUL JONGSEONG MIEUM-PIEUP-SIOS;Lo;0;L;;;;;N;;;;; +D7E2;HANGUL JONGSEONG MIEUM-CIEUC;Lo;0;L;;;;;N;;;;; +D7E3;HANGUL JONGSEONG PIEUP-TIKEUT;Lo;0;L;;;;;N;;;;; +D7E4;HANGUL JONGSEONG PIEUP-RIEUL-PHIEUPH;Lo;0;L;;;;;N;;;;; +D7E5;HANGUL JONGSEONG PIEUP-MIEUM;Lo;0;L;;;;;N;;;;; +D7E6;HANGUL JONGSEONG SSANGPIEUP;Lo;0;L;;;;;N;;;;; +D7E7;HANGUL JONGSEONG PIEUP-SIOS-TIKEUT;Lo;0;L;;;;;N;;;;; +D7E8;HANGUL JONGSEONG PIEUP-CIEUC;Lo;0;L;;;;;N;;;;; +D7E9;HANGUL JONGSEONG PIEUP-CHIEUCH;Lo;0;L;;;;;N;;;;; +D7EA;HANGUL JONGSEONG SIOS-MIEUM;Lo;0;L;;;;;N;;;;; +D7EB;HANGUL JONGSEONG SIOS-KAPYEOUNPIEUP;Lo;0;L;;;;;N;;;;; +D7EC;HANGUL JONGSEONG SSANGSIOS-KIYEOK;Lo;0;L;;;;;N;;;;; +D7ED;HANGUL JONGSEONG SSANGSIOS-TIKEUT;Lo;0;L;;;;;N;;;;; +D7EE;HANGUL JONGSEONG SIOS-PANSIOS;Lo;0;L;;;;;N;;;;; +D7EF;HANGUL JONGSEONG SIOS-CIEUC;Lo;0;L;;;;;N;;;;; +D7F0;HANGUL JONGSEONG SIOS-CHIEUCH;Lo;0;L;;;;;N;;;;; +D7F1;HANGUL JONGSEONG SIOS-THIEUTH;Lo;0;L;;;;;N;;;;; +D7F2;HANGUL JONGSEONG SIOS-HIEUH;Lo;0;L;;;;;N;;;;; +D7F3;HANGUL JONGSEONG PANSIOS-PIEUP;Lo;0;L;;;;;N;;;;; +D7F4;HANGUL JONGSEONG PANSIOS-KAPYEOUNPIEUP;Lo;0;L;;;;;N;;;;; +D7F5;HANGUL JONGSEONG YESIEUNG-MIEUM;Lo;0;L;;;;;N;;;;; +D7F6;HANGUL JONGSEONG YESIEUNG-HIEUH;Lo;0;L;;;;;N;;;;; +D7F7;HANGUL JONGSEONG CIEUC-PIEUP;Lo;0;L;;;;;N;;;;; +D7F8;HANGUL JONGSEONG CIEUC-SSANGPIEUP;Lo;0;L;;;;;N;;;;; +D7F9;HANGUL JONGSEONG SSANGCIEUC;Lo;0;L;;;;;N;;;;; +D7FA;HANGUL JONGSEONG PHIEUPH-SIOS;Lo;0;L;;;;;N;;;;; +D7FB;HANGUL JONGSEONG PHIEUPH-THIEUTH;Lo;0;L;;;;;N;;;;; +D800;<Non Private Use High Surrogate, First>;Cs;0;L;;;;;N;;;;; +DB7F;<Non Private Use High Surrogate, Last>;Cs;0;L;;;;;N;;;;; +DB80;<Private Use High Surrogate, First>;Cs;0;L;;;;;N;;;;; +DBFF;<Private Use High Surrogate, Last>;Cs;0;L;;;;;N;;;;; +DC00;<Low Surrogate, First>;Cs;0;L;;;;;N;;;;; +DFFF;<Low Surrogate, Last>;Cs;0;L;;;;;N;;;;; +E000;<Private Use, First>;Co;0;L;;;;;N;;;;; +F8FF;<Private Use, Last>;Co;0;L;;;;;N;;;;; +F900;CJK COMPATIBILITY IDEOGRAPH-F900;Lo;0;L;8C48;;;;N;;;;; +F901;CJK COMPATIBILITY IDEOGRAPH-F901;Lo;0;L;66F4;;;;N;;;;; +F902;CJK COMPATIBILITY IDEOGRAPH-F902;Lo;0;L;8ECA;;;;N;;;;; +F903;CJK COMPATIBILITY IDEOGRAPH-F903;Lo;0;L;8CC8;;;;N;;;;; +F904;CJK COMPATIBILITY IDEOGRAPH-F904;Lo;0;L;6ED1;;;;N;;;;; +F905;CJK COMPATIBILITY IDEOGRAPH-F905;Lo;0;L;4E32;;;;N;;;;; +F906;CJK COMPATIBILITY IDEOGRAPH-F906;Lo;0;L;53E5;;;;N;;;;; +F907;CJK COMPATIBILITY IDEOGRAPH-F907;Lo;0;L;9F9C;;;;N;;;;; +F908;CJK COMPATIBILITY IDEOGRAPH-F908;Lo;0;L;9F9C;;;;N;;;;; +F909;CJK COMPATIBILITY IDEOGRAPH-F909;Lo;0;L;5951;;;;N;;;;; +F90A;CJK COMPATIBILITY IDEOGRAPH-F90A;Lo;0;L;91D1;;;;N;;;;; +F90B;CJK COMPATIBILITY IDEOGRAPH-F90B;Lo;0;L;5587;;;;N;;;;; +F90C;CJK COMPATIBILITY IDEOGRAPH-F90C;Lo;0;L;5948;;;;N;;;;; +F90D;CJK COMPATIBILITY IDEOGRAPH-F90D;Lo;0;L;61F6;;;;N;;;;; +F90E;CJK COMPATIBILITY IDEOGRAPH-F90E;Lo;0;L;7669;;;;N;;;;; +F90F;CJK COMPATIBILITY IDEOGRAPH-F90F;Lo;0;L;7F85;;;;N;;;;; +F910;CJK COMPATIBILITY IDEOGRAPH-F910;Lo;0;L;863F;;;;N;;;;; +F911;CJK COMPATIBILITY IDEOGRAPH-F911;Lo;0;L;87BA;;;;N;;;;; +F912;CJK COMPATIBILITY IDEOGRAPH-F912;Lo;0;L;88F8;;;;N;;;;; +F913;CJK COMPATIBILITY IDEOGRAPH-F913;Lo;0;L;908F;;;;N;;;;; +F914;CJK COMPATIBILITY IDEOGRAPH-F914;Lo;0;L;6A02;;;;N;;;;; +F915;CJK COMPATIBILITY IDEOGRAPH-F915;Lo;0;L;6D1B;;;;N;;;;; +F916;CJK COMPATIBILITY IDEOGRAPH-F916;Lo;0;L;70D9;;;;N;;;;; +F917;CJK COMPATIBILITY IDEOGRAPH-F917;Lo;0;L;73DE;;;;N;;;;; +F918;CJK COMPATIBILITY IDEOGRAPH-F918;Lo;0;L;843D;;;;N;;;;; +F919;CJK COMPATIBILITY IDEOGRAPH-F919;Lo;0;L;916A;;;;N;;;;; +F91A;CJK COMPATIBILITY IDEOGRAPH-F91A;Lo;0;L;99F1;;;;N;;;;; +F91B;CJK COMPATIBILITY IDEOGRAPH-F91B;Lo;0;L;4E82;;;;N;;;;; +F91C;CJK COMPATIBILITY IDEOGRAPH-F91C;Lo;0;L;5375;;;;N;;;;; +F91D;CJK COMPATIBILITY IDEOGRAPH-F91D;Lo;0;L;6B04;;;;N;;;;; +F91E;CJK COMPATIBILITY IDEOGRAPH-F91E;Lo;0;L;721B;;;;N;;;;; +F91F;CJK COMPATIBILITY IDEOGRAPH-F91F;Lo;0;L;862D;;;;N;;;;; +F920;CJK COMPATIBILITY IDEOGRAPH-F920;Lo;0;L;9E1E;;;;N;;;;; +F921;CJK COMPATIBILITY IDEOGRAPH-F921;Lo;0;L;5D50;;;;N;;;;; +F922;CJK COMPATIBILITY IDEOGRAPH-F922;Lo;0;L;6FEB;;;;N;;;;; +F923;CJK COMPATIBILITY IDEOGRAPH-F923;Lo;0;L;85CD;;;;N;;;;; +F924;CJK COMPATIBILITY IDEOGRAPH-F924;Lo;0;L;8964;;;;N;;;;; +F925;CJK COMPATIBILITY IDEOGRAPH-F925;Lo;0;L;62C9;;;;N;;;;; +F926;CJK COMPATIBILITY IDEOGRAPH-F926;Lo;0;L;81D8;;;;N;;;;; +F927;CJK COMPATIBILITY IDEOGRAPH-F927;Lo;0;L;881F;;;;N;;;;; +F928;CJK COMPATIBILITY IDEOGRAPH-F928;Lo;0;L;5ECA;;;;N;;;;; +F929;CJK COMPATIBILITY IDEOGRAPH-F929;Lo;0;L;6717;;;;N;;;;; +F92A;CJK COMPATIBILITY IDEOGRAPH-F92A;Lo;0;L;6D6A;;;;N;;;;; +F92B;CJK COMPATIBILITY IDEOGRAPH-F92B;Lo;0;L;72FC;;;;N;;;;; +F92C;CJK COMPATIBILITY IDEOGRAPH-F92C;Lo;0;L;90CE;;;;N;;;;; +F92D;CJK COMPATIBILITY IDEOGRAPH-F92D;Lo;0;L;4F86;;;;N;;;;; +F92E;CJK COMPATIBILITY IDEOGRAPH-F92E;Lo;0;L;51B7;;;;N;;;;; +F92F;CJK COMPATIBILITY IDEOGRAPH-F92F;Lo;0;L;52DE;;;;N;;;;; +F930;CJK COMPATIBILITY IDEOGRAPH-F930;Lo;0;L;64C4;;;;N;;;;; +F931;CJK COMPATIBILITY IDEOGRAPH-F931;Lo;0;L;6AD3;;;;N;;;;; +F932;CJK COMPATIBILITY IDEOGRAPH-F932;Lo;0;L;7210;;;;N;;;;; +F933;CJK COMPATIBILITY IDEOGRAPH-F933;Lo;0;L;76E7;;;;N;;;;; +F934;CJK COMPATIBILITY IDEOGRAPH-F934;Lo;0;L;8001;;;;N;;;;; +F935;CJK COMPATIBILITY IDEOGRAPH-F935;Lo;0;L;8606;;;;N;;;;; +F936;CJK COMPATIBILITY IDEOGRAPH-F936;Lo;0;L;865C;;;;N;;;;; +F937;CJK COMPATIBILITY IDEOGRAPH-F937;Lo;0;L;8DEF;;;;N;;;;; +F938;CJK COMPATIBILITY IDEOGRAPH-F938;Lo;0;L;9732;;;;N;;;;; +F939;CJK COMPATIBILITY IDEOGRAPH-F939;Lo;0;L;9B6F;;;;N;;;;; +F93A;CJK COMPATIBILITY IDEOGRAPH-F93A;Lo;0;L;9DFA;;;;N;;;;; +F93B;CJK COMPATIBILITY IDEOGRAPH-F93B;Lo;0;L;788C;;;;N;;;;; +F93C;CJK COMPATIBILITY IDEOGRAPH-F93C;Lo;0;L;797F;;;;N;;;;; +F93D;CJK COMPATIBILITY IDEOGRAPH-F93D;Lo;0;L;7DA0;;;;N;;;;; +F93E;CJK COMPATIBILITY IDEOGRAPH-F93E;Lo;0;L;83C9;;;;N;;;;; +F93F;CJK COMPATIBILITY IDEOGRAPH-F93F;Lo;0;L;9304;;;;N;;;;; +F940;CJK COMPATIBILITY IDEOGRAPH-F940;Lo;0;L;9E7F;;;;N;;;;; +F941;CJK COMPATIBILITY IDEOGRAPH-F941;Lo;0;L;8AD6;;;;N;;;;; +F942;CJK COMPATIBILITY IDEOGRAPH-F942;Lo;0;L;58DF;;;;N;;;;; +F943;CJK COMPATIBILITY IDEOGRAPH-F943;Lo;0;L;5F04;;;;N;;;;; +F944;CJK COMPATIBILITY IDEOGRAPH-F944;Lo;0;L;7C60;;;;N;;;;; +F945;CJK COMPATIBILITY IDEOGRAPH-F945;Lo;0;L;807E;;;;N;;;;; +F946;CJK COMPATIBILITY IDEOGRAPH-F946;Lo;0;L;7262;;;;N;;;;; +F947;CJK COMPATIBILITY IDEOGRAPH-F947;Lo;0;L;78CA;;;;N;;;;; +F948;CJK COMPATIBILITY IDEOGRAPH-F948;Lo;0;L;8CC2;;;;N;;;;; +F949;CJK COMPATIBILITY IDEOGRAPH-F949;Lo;0;L;96F7;;;;N;;;;; +F94A;CJK COMPATIBILITY IDEOGRAPH-F94A;Lo;0;L;58D8;;;;N;;;;; +F94B;CJK COMPATIBILITY IDEOGRAPH-F94B;Lo;0;L;5C62;;;;N;;;;; +F94C;CJK COMPATIBILITY IDEOGRAPH-F94C;Lo;0;L;6A13;;;;N;;;;; +F94D;CJK COMPATIBILITY IDEOGRAPH-F94D;Lo;0;L;6DDA;;;;N;;;;; +F94E;CJK COMPATIBILITY IDEOGRAPH-F94E;Lo;0;L;6F0F;;;;N;;;;; +F94F;CJK COMPATIBILITY IDEOGRAPH-F94F;Lo;0;L;7D2F;;;;N;;;;; +F950;CJK COMPATIBILITY IDEOGRAPH-F950;Lo;0;L;7E37;;;;N;;;;; +F951;CJK COMPATIBILITY IDEOGRAPH-F951;Lo;0;L;964B;;;;N;;;;; +F952;CJK COMPATIBILITY IDEOGRAPH-F952;Lo;0;L;52D2;;;;N;;;;; +F953;CJK COMPATIBILITY IDEOGRAPH-F953;Lo;0;L;808B;;;;N;;;;; +F954;CJK COMPATIBILITY IDEOGRAPH-F954;Lo;0;L;51DC;;;;N;;;;; +F955;CJK COMPATIBILITY IDEOGRAPH-F955;Lo;0;L;51CC;;;;N;;;;; +F956;CJK COMPATIBILITY IDEOGRAPH-F956;Lo;0;L;7A1C;;;;N;;;;; +F957;CJK COMPATIBILITY IDEOGRAPH-F957;Lo;0;L;7DBE;;;;N;;;;; +F958;CJK COMPATIBILITY IDEOGRAPH-F958;Lo;0;L;83F1;;;;N;;;;; +F959;CJK COMPATIBILITY IDEOGRAPH-F959;Lo;0;L;9675;;;;N;;;;; +F95A;CJK COMPATIBILITY IDEOGRAPH-F95A;Lo;0;L;8B80;;;;N;;;;; +F95B;CJK COMPATIBILITY IDEOGRAPH-F95B;Lo;0;L;62CF;;;;N;;;;; +F95C;CJK COMPATIBILITY IDEOGRAPH-F95C;Lo;0;L;6A02;;;;N;;;;; +F95D;CJK COMPATIBILITY IDEOGRAPH-F95D;Lo;0;L;8AFE;;;;N;;;;; +F95E;CJK COMPATIBILITY IDEOGRAPH-F95E;Lo;0;L;4E39;;;;N;;;;; +F95F;CJK COMPATIBILITY IDEOGRAPH-F95F;Lo;0;L;5BE7;;;;N;;;;; +F960;CJK COMPATIBILITY IDEOGRAPH-F960;Lo;0;L;6012;;;;N;;;;; +F961;CJK COMPATIBILITY IDEOGRAPH-F961;Lo;0;L;7387;;;;N;;;;; +F962;CJK COMPATIBILITY IDEOGRAPH-F962;Lo;0;L;7570;;;;N;;;;; +F963;CJK COMPATIBILITY IDEOGRAPH-F963;Lo;0;L;5317;;;;N;;;;; +F964;CJK COMPATIBILITY IDEOGRAPH-F964;Lo;0;L;78FB;;;;N;;;;; +F965;CJK COMPATIBILITY IDEOGRAPH-F965;Lo;0;L;4FBF;;;;N;;;;; +F966;CJK COMPATIBILITY IDEOGRAPH-F966;Lo;0;L;5FA9;;;;N;;;;; +F967;CJK COMPATIBILITY IDEOGRAPH-F967;Lo;0;L;4E0D;;;;N;;;;; +F968;CJK COMPATIBILITY IDEOGRAPH-F968;Lo;0;L;6CCC;;;;N;;;;; +F969;CJK COMPATIBILITY IDEOGRAPH-F969;Lo;0;L;6578;;;;N;;;;; +F96A;CJK COMPATIBILITY IDEOGRAPH-F96A;Lo;0;L;7D22;;;;N;;;;; +F96B;CJK COMPATIBILITY IDEOGRAPH-F96B;Lo;0;L;53C3;;;3;N;;;;; +F96C;CJK COMPATIBILITY IDEOGRAPH-F96C;Lo;0;L;585E;;;;N;;;;; +F96D;CJK COMPATIBILITY IDEOGRAPH-F96D;Lo;0;L;7701;;;;N;;;;; +F96E;CJK COMPATIBILITY IDEOGRAPH-F96E;Lo;0;L;8449;;;;N;;;;; +F96F;CJK COMPATIBILITY IDEOGRAPH-F96F;Lo;0;L;8AAA;;;;N;;;;; +F970;CJK COMPATIBILITY IDEOGRAPH-F970;Lo;0;L;6BBA;;;;N;;;;; +F971;CJK COMPATIBILITY IDEOGRAPH-F971;Lo;0;L;8FB0;;;;N;;;;; +F972;CJK COMPATIBILITY IDEOGRAPH-F972;Lo;0;L;6C88;;;;N;;;;; +F973;CJK COMPATIBILITY IDEOGRAPH-F973;Lo;0;L;62FE;;;10;N;;;;; +F974;CJK COMPATIBILITY IDEOGRAPH-F974;Lo;0;L;82E5;;;;N;;;;; +F975;CJK COMPATIBILITY IDEOGRAPH-F975;Lo;0;L;63A0;;;;N;;;;; +F976;CJK COMPATIBILITY IDEOGRAPH-F976;Lo;0;L;7565;;;;N;;;;; +F977;CJK COMPATIBILITY IDEOGRAPH-F977;Lo;0;L;4EAE;;;;N;;;;; +F978;CJK COMPATIBILITY IDEOGRAPH-F978;Lo;0;L;5169;;;2;N;;;;; +F979;CJK COMPATIBILITY IDEOGRAPH-F979;Lo;0;L;51C9;;;;N;;;;; +F97A;CJK COMPATIBILITY IDEOGRAPH-F97A;Lo;0;L;6881;;;;N;;;;; +F97B;CJK COMPATIBILITY IDEOGRAPH-F97B;Lo;0;L;7CE7;;;;N;;;;; +F97C;CJK COMPATIBILITY IDEOGRAPH-F97C;Lo;0;L;826F;;;;N;;;;; +F97D;CJK COMPATIBILITY IDEOGRAPH-F97D;Lo;0;L;8AD2;;;;N;;;;; +F97E;CJK COMPATIBILITY IDEOGRAPH-F97E;Lo;0;L;91CF;;;;N;;;;; +F97F;CJK COMPATIBILITY IDEOGRAPH-F97F;Lo;0;L;52F5;;;;N;;;;; +F980;CJK COMPATIBILITY IDEOGRAPH-F980;Lo;0;L;5442;;;;N;;;;; +F981;CJK COMPATIBILITY IDEOGRAPH-F981;Lo;0;L;5973;;;;N;;;;; +F982;CJK COMPATIBILITY IDEOGRAPH-F982;Lo;0;L;5EEC;;;;N;;;;; +F983;CJK COMPATIBILITY IDEOGRAPH-F983;Lo;0;L;65C5;;;;N;;;;; +F984;CJK COMPATIBILITY IDEOGRAPH-F984;Lo;0;L;6FFE;;;;N;;;;; +F985;CJK COMPATIBILITY IDEOGRAPH-F985;Lo;0;L;792A;;;;N;;;;; +F986;CJK COMPATIBILITY IDEOGRAPH-F986;Lo;0;L;95AD;;;;N;;;;; +F987;CJK COMPATIBILITY IDEOGRAPH-F987;Lo;0;L;9A6A;;;;N;;;;; +F988;CJK COMPATIBILITY IDEOGRAPH-F988;Lo;0;L;9E97;;;;N;;;;; +F989;CJK COMPATIBILITY IDEOGRAPH-F989;Lo;0;L;9ECE;;;;N;;;;; +F98A;CJK COMPATIBILITY IDEOGRAPH-F98A;Lo;0;L;529B;;;;N;;;;; +F98B;CJK COMPATIBILITY IDEOGRAPH-F98B;Lo;0;L;66C6;;;;N;;;;; +F98C;CJK COMPATIBILITY IDEOGRAPH-F98C;Lo;0;L;6B77;;;;N;;;;; +F98D;CJK COMPATIBILITY IDEOGRAPH-F98D;Lo;0;L;8F62;;;;N;;;;; +F98E;CJK COMPATIBILITY IDEOGRAPH-F98E;Lo;0;L;5E74;;;;N;;;;; +F98F;CJK COMPATIBILITY IDEOGRAPH-F98F;Lo;0;L;6190;;;;N;;;;; +F990;CJK COMPATIBILITY IDEOGRAPH-F990;Lo;0;L;6200;;;;N;;;;; +F991;CJK COMPATIBILITY IDEOGRAPH-F991;Lo;0;L;649A;;;;N;;;;; +F992;CJK COMPATIBILITY IDEOGRAPH-F992;Lo;0;L;6F23;;;;N;;;;; +F993;CJK COMPATIBILITY IDEOGRAPH-F993;Lo;0;L;7149;;;;N;;;;; +F994;CJK COMPATIBILITY IDEOGRAPH-F994;Lo;0;L;7489;;;;N;;;;; +F995;CJK COMPATIBILITY IDEOGRAPH-F995;Lo;0;L;79CA;;;;N;;;;; +F996;CJK COMPATIBILITY IDEOGRAPH-F996;Lo;0;L;7DF4;;;;N;;;;; +F997;CJK COMPATIBILITY IDEOGRAPH-F997;Lo;0;L;806F;;;;N;;;;; +F998;CJK COMPATIBILITY IDEOGRAPH-F998;Lo;0;L;8F26;;;;N;;;;; +F999;CJK COMPATIBILITY IDEOGRAPH-F999;Lo;0;L;84EE;;;;N;;;;; +F99A;CJK COMPATIBILITY IDEOGRAPH-F99A;Lo;0;L;9023;;;;N;;;;; +F99B;CJK COMPATIBILITY IDEOGRAPH-F99B;Lo;0;L;934A;;;;N;;;;; +F99C;CJK COMPATIBILITY IDEOGRAPH-F99C;Lo;0;L;5217;;;;N;;;;; +F99D;CJK COMPATIBILITY IDEOGRAPH-F99D;Lo;0;L;52A3;;;;N;;;;; +F99E;CJK COMPATIBILITY IDEOGRAPH-F99E;Lo;0;L;54BD;;;;N;;;;; +F99F;CJK COMPATIBILITY IDEOGRAPH-F99F;Lo;0;L;70C8;;;;N;;;;; +F9A0;CJK COMPATIBILITY IDEOGRAPH-F9A0;Lo;0;L;88C2;;;;N;;;;; +F9A1;CJK COMPATIBILITY IDEOGRAPH-F9A1;Lo;0;L;8AAA;;;;N;;;;; +F9A2;CJK COMPATIBILITY IDEOGRAPH-F9A2;Lo;0;L;5EC9;;;;N;;;;; +F9A3;CJK COMPATIBILITY IDEOGRAPH-F9A3;Lo;0;L;5FF5;;;;N;;;;; +F9A4;CJK COMPATIBILITY IDEOGRAPH-F9A4;Lo;0;L;637B;;;;N;;;;; +F9A5;CJK COMPATIBILITY IDEOGRAPH-F9A5;Lo;0;L;6BAE;;;;N;;;;; +F9A6;CJK COMPATIBILITY IDEOGRAPH-F9A6;Lo;0;L;7C3E;;;;N;;;;; +F9A7;CJK COMPATIBILITY IDEOGRAPH-F9A7;Lo;0;L;7375;;;;N;;;;; +F9A8;CJK COMPATIBILITY IDEOGRAPH-F9A8;Lo;0;L;4EE4;;;;N;;;;; +F9A9;CJK COMPATIBILITY IDEOGRAPH-F9A9;Lo;0;L;56F9;;;;N;;;;; +F9AA;CJK COMPATIBILITY IDEOGRAPH-F9AA;Lo;0;L;5BE7;;;;N;;;;; +F9AB;CJK COMPATIBILITY IDEOGRAPH-F9AB;Lo;0;L;5DBA;;;;N;;;;; +F9AC;CJK COMPATIBILITY IDEOGRAPH-F9AC;Lo;0;L;601C;;;;N;;;;; +F9AD;CJK COMPATIBILITY IDEOGRAPH-F9AD;Lo;0;L;73B2;;;;N;;;;; +F9AE;CJK COMPATIBILITY IDEOGRAPH-F9AE;Lo;0;L;7469;;;;N;;;;; +F9AF;CJK COMPATIBILITY IDEOGRAPH-F9AF;Lo;0;L;7F9A;;;;N;;;;; +F9B0;CJK COMPATIBILITY IDEOGRAPH-F9B0;Lo;0;L;8046;;;;N;;;;; +F9B1;CJK COMPATIBILITY IDEOGRAPH-F9B1;Lo;0;L;9234;;;;N;;;;; +F9B2;CJK COMPATIBILITY IDEOGRAPH-F9B2;Lo;0;L;96F6;;;0;N;;;;; +F9B3;CJK COMPATIBILITY IDEOGRAPH-F9B3;Lo;0;L;9748;;;;N;;;;; +F9B4;CJK COMPATIBILITY IDEOGRAPH-F9B4;Lo;0;L;9818;;;;N;;;;; +F9B5;CJK COMPATIBILITY IDEOGRAPH-F9B5;Lo;0;L;4F8B;;;;N;;;;; +F9B6;CJK COMPATIBILITY IDEOGRAPH-F9B6;Lo;0;L;79AE;;;;N;;;;; +F9B7;CJK COMPATIBILITY IDEOGRAPH-F9B7;Lo;0;L;91B4;;;;N;;;;; +F9B8;CJK COMPATIBILITY IDEOGRAPH-F9B8;Lo;0;L;96B8;;;;N;;;;; +F9B9;CJK COMPATIBILITY IDEOGRAPH-F9B9;Lo;0;L;60E1;;;;N;;;;; +F9BA;CJK COMPATIBILITY IDEOGRAPH-F9BA;Lo;0;L;4E86;;;;N;;;;; +F9BB;CJK COMPATIBILITY IDEOGRAPH-F9BB;Lo;0;L;50DA;;;;N;;;;; +F9BC;CJK COMPATIBILITY IDEOGRAPH-F9BC;Lo;0;L;5BEE;;;;N;;;;; +F9BD;CJK COMPATIBILITY IDEOGRAPH-F9BD;Lo;0;L;5C3F;;;;N;;;;; +F9BE;CJK COMPATIBILITY IDEOGRAPH-F9BE;Lo;0;L;6599;;;;N;;;;; +F9BF;CJK COMPATIBILITY IDEOGRAPH-F9BF;Lo;0;L;6A02;;;;N;;;;; +F9C0;CJK COMPATIBILITY IDEOGRAPH-F9C0;Lo;0;L;71CE;;;;N;;;;; +F9C1;CJK COMPATIBILITY IDEOGRAPH-F9C1;Lo;0;L;7642;;;;N;;;;; +F9C2;CJK COMPATIBILITY IDEOGRAPH-F9C2;Lo;0;L;84FC;;;;N;;;;; +F9C3;CJK COMPATIBILITY IDEOGRAPH-F9C3;Lo;0;L;907C;;;;N;;;;; +F9C4;CJK COMPATIBILITY IDEOGRAPH-F9C4;Lo;0;L;9F8D;;;;N;;;;; +F9C5;CJK COMPATIBILITY IDEOGRAPH-F9C5;Lo;0;L;6688;;;;N;;;;; +F9C6;CJK COMPATIBILITY IDEOGRAPH-F9C6;Lo;0;L;962E;;;;N;;;;; +F9C7;CJK COMPATIBILITY IDEOGRAPH-F9C7;Lo;0;L;5289;;;;N;;;;; +F9C8;CJK COMPATIBILITY IDEOGRAPH-F9C8;Lo;0;L;677B;;;;N;;;;; +F9C9;CJK COMPATIBILITY IDEOGRAPH-F9C9;Lo;0;L;67F3;;;;N;;;;; +F9CA;CJK COMPATIBILITY IDEOGRAPH-F9CA;Lo;0;L;6D41;;;;N;;;;; +F9CB;CJK COMPATIBILITY IDEOGRAPH-F9CB;Lo;0;L;6E9C;;;;N;;;;; +F9CC;CJK COMPATIBILITY IDEOGRAPH-F9CC;Lo;0;L;7409;;;;N;;;;; +F9CD;CJK COMPATIBILITY IDEOGRAPH-F9CD;Lo;0;L;7559;;;;N;;;;; +F9CE;CJK COMPATIBILITY IDEOGRAPH-F9CE;Lo;0;L;786B;;;;N;;;;; +F9CF;CJK COMPATIBILITY IDEOGRAPH-F9CF;Lo;0;L;7D10;;;;N;;;;; +F9D0;CJK COMPATIBILITY IDEOGRAPH-F9D0;Lo;0;L;985E;;;;N;;;;; +F9D1;CJK COMPATIBILITY IDEOGRAPH-F9D1;Lo;0;L;516D;;;6;N;;;;; +F9D2;CJK COMPATIBILITY IDEOGRAPH-F9D2;Lo;0;L;622E;;;;N;;;;; +F9D3;CJK COMPATIBILITY IDEOGRAPH-F9D3;Lo;0;L;9678;;;6;N;;;;; +F9D4;CJK COMPATIBILITY IDEOGRAPH-F9D4;Lo;0;L;502B;;;;N;;;;; +F9D5;CJK COMPATIBILITY IDEOGRAPH-F9D5;Lo;0;L;5D19;;;;N;;;;; +F9D6;CJK COMPATIBILITY IDEOGRAPH-F9D6;Lo;0;L;6DEA;;;;N;;;;; +F9D7;CJK COMPATIBILITY IDEOGRAPH-F9D7;Lo;0;L;8F2A;;;;N;;;;; +F9D8;CJK COMPATIBILITY IDEOGRAPH-F9D8;Lo;0;L;5F8B;;;;N;;;;; +F9D9;CJK COMPATIBILITY IDEOGRAPH-F9D9;Lo;0;L;6144;;;;N;;;;; +F9DA;CJK COMPATIBILITY IDEOGRAPH-F9DA;Lo;0;L;6817;;;;N;;;;; +F9DB;CJK COMPATIBILITY IDEOGRAPH-F9DB;Lo;0;L;7387;;;;N;;;;; +F9DC;CJK COMPATIBILITY IDEOGRAPH-F9DC;Lo;0;L;9686;;;;N;;;;; +F9DD;CJK COMPATIBILITY IDEOGRAPH-F9DD;Lo;0;L;5229;;;;N;;;;; +F9DE;CJK COMPATIBILITY IDEOGRAPH-F9DE;Lo;0;L;540F;;;;N;;;;; +F9DF;CJK COMPATIBILITY IDEOGRAPH-F9DF;Lo;0;L;5C65;;;;N;;;;; +F9E0;CJK COMPATIBILITY IDEOGRAPH-F9E0;Lo;0;L;6613;;;;N;;;;; +F9E1;CJK COMPATIBILITY IDEOGRAPH-F9E1;Lo;0;L;674E;;;;N;;;;; +F9E2;CJK COMPATIBILITY IDEOGRAPH-F9E2;Lo;0;L;68A8;;;;N;;;;; +F9E3;CJK COMPATIBILITY IDEOGRAPH-F9E3;Lo;0;L;6CE5;;;;N;;;;; +F9E4;CJK COMPATIBILITY IDEOGRAPH-F9E4;Lo;0;L;7406;;;;N;;;;; +F9E5;CJK COMPATIBILITY IDEOGRAPH-F9E5;Lo;0;L;75E2;;;;N;;;;; +F9E6;CJK COMPATIBILITY IDEOGRAPH-F9E6;Lo;0;L;7F79;;;;N;;;;; +F9E7;CJK COMPATIBILITY IDEOGRAPH-F9E7;Lo;0;L;88CF;;;;N;;;;; +F9E8;CJK COMPATIBILITY IDEOGRAPH-F9E8;Lo;0;L;88E1;;;;N;;;;; +F9E9;CJK COMPATIBILITY IDEOGRAPH-F9E9;Lo;0;L;91CC;;;;N;;;;; +F9EA;CJK COMPATIBILITY IDEOGRAPH-F9EA;Lo;0;L;96E2;;;;N;;;;; +F9EB;CJK COMPATIBILITY IDEOGRAPH-F9EB;Lo;0;L;533F;;;;N;;;;; +F9EC;CJK COMPATIBILITY IDEOGRAPH-F9EC;Lo;0;L;6EBA;;;;N;;;;; +F9ED;CJK COMPATIBILITY IDEOGRAPH-F9ED;Lo;0;L;541D;;;;N;;;;; +F9EE;CJK COMPATIBILITY IDEOGRAPH-F9EE;Lo;0;L;71D0;;;;N;;;;; +F9EF;CJK COMPATIBILITY IDEOGRAPH-F9EF;Lo;0;L;7498;;;;N;;;;; +F9F0;CJK COMPATIBILITY IDEOGRAPH-F9F0;Lo;0;L;85FA;;;;N;;;;; +F9F1;CJK COMPATIBILITY IDEOGRAPH-F9F1;Lo;0;L;96A3;;;;N;;;;; +F9F2;CJK COMPATIBILITY IDEOGRAPH-F9F2;Lo;0;L;9C57;;;;N;;;;; +F9F3;CJK COMPATIBILITY IDEOGRAPH-F9F3;Lo;0;L;9E9F;;;;N;;;;; +F9F4;CJK COMPATIBILITY IDEOGRAPH-F9F4;Lo;0;L;6797;;;;N;;;;; +F9F5;CJK COMPATIBILITY IDEOGRAPH-F9F5;Lo;0;L;6DCB;;;;N;;;;; +F9F6;CJK COMPATIBILITY IDEOGRAPH-F9F6;Lo;0;L;81E8;;;;N;;;;; +F9F7;CJK COMPATIBILITY IDEOGRAPH-F9F7;Lo;0;L;7ACB;;;;N;;;;; +F9F8;CJK COMPATIBILITY IDEOGRAPH-F9F8;Lo;0;L;7B20;;;;N;;;;; +F9F9;CJK COMPATIBILITY IDEOGRAPH-F9F9;Lo;0;L;7C92;;;;N;;;;; +F9FA;CJK COMPATIBILITY IDEOGRAPH-F9FA;Lo;0;L;72C0;;;;N;;;;; +F9FB;CJK COMPATIBILITY IDEOGRAPH-F9FB;Lo;0;L;7099;;;;N;;;;; +F9FC;CJK COMPATIBILITY IDEOGRAPH-F9FC;Lo;0;L;8B58;;;;N;;;;; +F9FD;CJK COMPATIBILITY IDEOGRAPH-F9FD;Lo;0;L;4EC0;;;10;N;;;;; +F9FE;CJK COMPATIBILITY IDEOGRAPH-F9FE;Lo;0;L;8336;;;;N;;;;; +F9FF;CJK COMPATIBILITY IDEOGRAPH-F9FF;Lo;0;L;523A;;;;N;;;;; +FA00;CJK COMPATIBILITY IDEOGRAPH-FA00;Lo;0;L;5207;;;;N;;;;; +FA01;CJK COMPATIBILITY IDEOGRAPH-FA01;Lo;0;L;5EA6;;;;N;;;;; +FA02;CJK COMPATIBILITY IDEOGRAPH-FA02;Lo;0;L;62D3;;;;N;;;;; +FA03;CJK COMPATIBILITY IDEOGRAPH-FA03;Lo;0;L;7CD6;;;;N;;;;; +FA04;CJK COMPATIBILITY IDEOGRAPH-FA04;Lo;0;L;5B85;;;;N;;;;; +FA05;CJK COMPATIBILITY IDEOGRAPH-FA05;Lo;0;L;6D1E;;;;N;;;;; +FA06;CJK COMPATIBILITY IDEOGRAPH-FA06;Lo;0;L;66B4;;;;N;;;;; +FA07;CJK COMPATIBILITY IDEOGRAPH-FA07;Lo;0;L;8F3B;;;;N;;;;; +FA08;CJK COMPATIBILITY IDEOGRAPH-FA08;Lo;0;L;884C;;;;N;;;;; +FA09;CJK COMPATIBILITY IDEOGRAPH-FA09;Lo;0;L;964D;;;;N;;;;; +FA0A;CJK COMPATIBILITY IDEOGRAPH-FA0A;Lo;0;L;898B;;;;N;;;;; +FA0B;CJK COMPATIBILITY IDEOGRAPH-FA0B;Lo;0;L;5ED3;;;;N;;;;; +FA0C;CJK COMPATIBILITY IDEOGRAPH-FA0C;Lo;0;L;5140;;;;N;;;;; +FA0D;CJK COMPATIBILITY IDEOGRAPH-FA0D;Lo;0;L;55C0;;;;N;;;;; +FA0E;CJK COMPATIBILITY IDEOGRAPH-FA0E;Lo;0;L;;;;;N;;;;; +FA0F;CJK COMPATIBILITY IDEOGRAPH-FA0F;Lo;0;L;;;;;N;;;;; +FA10;CJK COMPATIBILITY IDEOGRAPH-FA10;Lo;0;L;585A;;;;N;;;;; +FA11;CJK COMPATIBILITY IDEOGRAPH-FA11;Lo;0;L;;;;;N;;;;; +FA12;CJK COMPATIBILITY IDEOGRAPH-FA12;Lo;0;L;6674;;;;N;;;;; +FA13;CJK COMPATIBILITY IDEOGRAPH-FA13;Lo;0;L;;;;;N;;;;; +FA14;CJK COMPATIBILITY IDEOGRAPH-FA14;Lo;0;L;;;;;N;;;;; +FA15;CJK COMPATIBILITY IDEOGRAPH-FA15;Lo;0;L;51DE;;;;N;;;;; +FA16;CJK COMPATIBILITY IDEOGRAPH-FA16;Lo;0;L;732A;;;;N;;;;; +FA17;CJK COMPATIBILITY IDEOGRAPH-FA17;Lo;0;L;76CA;;;;N;;;;; +FA18;CJK COMPATIBILITY IDEOGRAPH-FA18;Lo;0;L;793C;;;;N;;;;; +FA19;CJK COMPATIBILITY IDEOGRAPH-FA19;Lo;0;L;795E;;;;N;;;;; +FA1A;CJK COMPATIBILITY IDEOGRAPH-FA1A;Lo;0;L;7965;;;;N;;;;; +FA1B;CJK COMPATIBILITY IDEOGRAPH-FA1B;Lo;0;L;798F;;;;N;;;;; +FA1C;CJK COMPATIBILITY IDEOGRAPH-FA1C;Lo;0;L;9756;;;;N;;;;; +FA1D;CJK COMPATIBILITY IDEOGRAPH-FA1D;Lo;0;L;7CBE;;;;N;;;;; +FA1E;CJK COMPATIBILITY IDEOGRAPH-FA1E;Lo;0;L;7FBD;;;;N;;;;; +FA1F;CJK COMPATIBILITY IDEOGRAPH-FA1F;Lo;0;L;;;;;N;;;;; +FA20;CJK COMPATIBILITY IDEOGRAPH-FA20;Lo;0;L;8612;;;;N;;;;; +FA21;CJK COMPATIBILITY IDEOGRAPH-FA21;Lo;0;L;;;;;N;;;;; +FA22;CJK COMPATIBILITY IDEOGRAPH-FA22;Lo;0;L;8AF8;;;;N;;;;; +FA23;CJK COMPATIBILITY IDEOGRAPH-FA23;Lo;0;L;;;;;N;;;;; +FA24;CJK COMPATIBILITY IDEOGRAPH-FA24;Lo;0;L;;;;;N;;;;; +FA25;CJK COMPATIBILITY IDEOGRAPH-FA25;Lo;0;L;9038;;;;N;;;;; +FA26;CJK COMPATIBILITY IDEOGRAPH-FA26;Lo;0;L;90FD;;;;N;;;;; +FA27;CJK COMPATIBILITY IDEOGRAPH-FA27;Lo;0;L;;;;;N;;;;; +FA28;CJK COMPATIBILITY IDEOGRAPH-FA28;Lo;0;L;;;;;N;;;;; +FA29;CJK COMPATIBILITY IDEOGRAPH-FA29;Lo;0;L;;;;;N;;;;; +FA2A;CJK COMPATIBILITY IDEOGRAPH-FA2A;Lo;0;L;98EF;;;;N;;;;; +FA2B;CJK COMPATIBILITY IDEOGRAPH-FA2B;Lo;0;L;98FC;;;;N;;;;; +FA2C;CJK COMPATIBILITY IDEOGRAPH-FA2C;Lo;0;L;9928;;;;N;;;;; +FA2D;CJK COMPATIBILITY IDEOGRAPH-FA2D;Lo;0;L;9DB4;;;;N;;;;; +FA2E;CJK COMPATIBILITY IDEOGRAPH-FA2E;Lo;0;L;90DE;;;;N;;;;; +FA2F;CJK COMPATIBILITY IDEOGRAPH-FA2F;Lo;0;L;96B7;;;;N;;;;; +FA30;CJK COMPATIBILITY IDEOGRAPH-FA30;Lo;0;L;4FAE;;;;N;;;;; +FA31;CJK COMPATIBILITY IDEOGRAPH-FA31;Lo;0;L;50E7;;;;N;;;;; +FA32;CJK COMPATIBILITY IDEOGRAPH-FA32;Lo;0;L;514D;;;;N;;;;; +FA33;CJK COMPATIBILITY IDEOGRAPH-FA33;Lo;0;L;52C9;;;;N;;;;; +FA34;CJK COMPATIBILITY IDEOGRAPH-FA34;Lo;0;L;52E4;;;;N;;;;; +FA35;CJK COMPATIBILITY IDEOGRAPH-FA35;Lo;0;L;5351;;;;N;;;;; +FA36;CJK COMPATIBILITY IDEOGRAPH-FA36;Lo;0;L;559D;;;;N;;;;; +FA37;CJK COMPATIBILITY IDEOGRAPH-FA37;Lo;0;L;5606;;;;N;;;;; +FA38;CJK COMPATIBILITY IDEOGRAPH-FA38;Lo;0;L;5668;;;;N;;;;; +FA39;CJK COMPATIBILITY IDEOGRAPH-FA39;Lo;0;L;5840;;;;N;;;;; +FA3A;CJK COMPATIBILITY IDEOGRAPH-FA3A;Lo;0;L;58A8;;;;N;;;;; +FA3B;CJK COMPATIBILITY IDEOGRAPH-FA3B;Lo;0;L;5C64;;;;N;;;;; +FA3C;CJK COMPATIBILITY IDEOGRAPH-FA3C;Lo;0;L;5C6E;;;;N;;;;; +FA3D;CJK COMPATIBILITY IDEOGRAPH-FA3D;Lo;0;L;6094;;;;N;;;;; +FA3E;CJK COMPATIBILITY IDEOGRAPH-FA3E;Lo;0;L;6168;;;;N;;;;; +FA3F;CJK COMPATIBILITY IDEOGRAPH-FA3F;Lo;0;L;618E;;;;N;;;;; +FA40;CJK COMPATIBILITY IDEOGRAPH-FA40;Lo;0;L;61F2;;;;N;;;;; +FA41;CJK COMPATIBILITY IDEOGRAPH-FA41;Lo;0;L;654F;;;;N;;;;; +FA42;CJK COMPATIBILITY IDEOGRAPH-FA42;Lo;0;L;65E2;;;;N;;;;; +FA43;CJK COMPATIBILITY IDEOGRAPH-FA43;Lo;0;L;6691;;;;N;;;;; +FA44;CJK COMPATIBILITY IDEOGRAPH-FA44;Lo;0;L;6885;;;;N;;;;; +FA45;CJK COMPATIBILITY IDEOGRAPH-FA45;Lo;0;L;6D77;;;;N;;;;; +FA46;CJK COMPATIBILITY IDEOGRAPH-FA46;Lo;0;L;6E1A;;;;N;;;;; +FA47;CJK COMPATIBILITY IDEOGRAPH-FA47;Lo;0;L;6F22;;;;N;;;;; +FA48;CJK COMPATIBILITY IDEOGRAPH-FA48;Lo;0;L;716E;;;;N;;;;; +FA49;CJK COMPATIBILITY IDEOGRAPH-FA49;Lo;0;L;722B;;;;N;;;;; +FA4A;CJK COMPATIBILITY IDEOGRAPH-FA4A;Lo;0;L;7422;;;;N;;;;; +FA4B;CJK COMPATIBILITY IDEOGRAPH-FA4B;Lo;0;L;7891;;;;N;;;;; +FA4C;CJK COMPATIBILITY IDEOGRAPH-FA4C;Lo;0;L;793E;;;;N;;;;; +FA4D;CJK COMPATIBILITY IDEOGRAPH-FA4D;Lo;0;L;7949;;;;N;;;;; +FA4E;CJK COMPATIBILITY IDEOGRAPH-FA4E;Lo;0;L;7948;;;;N;;;;; +FA4F;CJK COMPATIBILITY IDEOGRAPH-FA4F;Lo;0;L;7950;;;;N;;;;; +FA50;CJK COMPATIBILITY IDEOGRAPH-FA50;Lo;0;L;7956;;;;N;;;;; +FA51;CJK COMPATIBILITY IDEOGRAPH-FA51;Lo;0;L;795D;;;;N;;;;; +FA52;CJK COMPATIBILITY IDEOGRAPH-FA52;Lo;0;L;798D;;;;N;;;;; +FA53;CJK COMPATIBILITY IDEOGRAPH-FA53;Lo;0;L;798E;;;;N;;;;; +FA54;CJK COMPATIBILITY IDEOGRAPH-FA54;Lo;0;L;7A40;;;;N;;;;; +FA55;CJK COMPATIBILITY IDEOGRAPH-FA55;Lo;0;L;7A81;;;;N;;;;; +FA56;CJK COMPATIBILITY IDEOGRAPH-FA56;Lo;0;L;7BC0;;;;N;;;;; +FA57;CJK COMPATIBILITY IDEOGRAPH-FA57;Lo;0;L;7DF4;;;;N;;;;; +FA58;CJK COMPATIBILITY IDEOGRAPH-FA58;Lo;0;L;7E09;;;;N;;;;; +FA59;CJK COMPATIBILITY IDEOGRAPH-FA59;Lo;0;L;7E41;;;;N;;;;; +FA5A;CJK COMPATIBILITY IDEOGRAPH-FA5A;Lo;0;L;7F72;;;;N;;;;; +FA5B;CJK COMPATIBILITY IDEOGRAPH-FA5B;Lo;0;L;8005;;;;N;;;;; +FA5C;CJK COMPATIBILITY IDEOGRAPH-FA5C;Lo;0;L;81ED;;;;N;;;;; +FA5D;CJK COMPATIBILITY IDEOGRAPH-FA5D;Lo;0;L;8279;;;;N;;;;; +FA5E;CJK COMPATIBILITY IDEOGRAPH-FA5E;Lo;0;L;8279;;;;N;;;;; +FA5F;CJK COMPATIBILITY IDEOGRAPH-FA5F;Lo;0;L;8457;;;;N;;;;; +FA60;CJK COMPATIBILITY IDEOGRAPH-FA60;Lo;0;L;8910;;;;N;;;;; +FA61;CJK COMPATIBILITY IDEOGRAPH-FA61;Lo;0;L;8996;;;;N;;;;; +FA62;CJK COMPATIBILITY IDEOGRAPH-FA62;Lo;0;L;8B01;;;;N;;;;; +FA63;CJK COMPATIBILITY IDEOGRAPH-FA63;Lo;0;L;8B39;;;;N;;;;; +FA64;CJK COMPATIBILITY IDEOGRAPH-FA64;Lo;0;L;8CD3;;;;N;;;;; +FA65;CJK COMPATIBILITY IDEOGRAPH-FA65;Lo;0;L;8D08;;;;N;;;;; +FA66;CJK COMPATIBILITY IDEOGRAPH-FA66;Lo;0;L;8FB6;;;;N;;;;; +FA67;CJK COMPATIBILITY IDEOGRAPH-FA67;Lo;0;L;9038;;;;N;;;;; +FA68;CJK COMPATIBILITY IDEOGRAPH-FA68;Lo;0;L;96E3;;;;N;;;;; +FA69;CJK COMPATIBILITY IDEOGRAPH-FA69;Lo;0;L;97FF;;;;N;;;;; +FA6A;CJK COMPATIBILITY IDEOGRAPH-FA6A;Lo;0;L;983B;;;;N;;;;; +FA6B;CJK COMPATIBILITY IDEOGRAPH-FA6B;Lo;0;L;6075;;;;N;;;;; +FA6C;CJK COMPATIBILITY IDEOGRAPH-FA6C;Lo;0;L;242EE;;;;N;;;;; +FA6D;CJK COMPATIBILITY IDEOGRAPH-FA6D;Lo;0;L;8218;;;;N;;;;; +FA70;CJK COMPATIBILITY IDEOGRAPH-FA70;Lo;0;L;4E26;;;;N;;;;; +FA71;CJK COMPATIBILITY IDEOGRAPH-FA71;Lo;0;L;51B5;;;;N;;;;; +FA72;CJK COMPATIBILITY IDEOGRAPH-FA72;Lo;0;L;5168;;;;N;;;;; +FA73;CJK COMPATIBILITY IDEOGRAPH-FA73;Lo;0;L;4F80;;;;N;;;;; +FA74;CJK COMPATIBILITY IDEOGRAPH-FA74;Lo;0;L;5145;;;;N;;;;; +FA75;CJK COMPATIBILITY IDEOGRAPH-FA75;Lo;0;L;5180;;;;N;;;;; +FA76;CJK COMPATIBILITY IDEOGRAPH-FA76;Lo;0;L;52C7;;;;N;;;;; +FA77;CJK COMPATIBILITY IDEOGRAPH-FA77;Lo;0;L;52FA;;;;N;;;;; +FA78;CJK COMPATIBILITY IDEOGRAPH-FA78;Lo;0;L;559D;;;;N;;;;; +FA79;CJK COMPATIBILITY IDEOGRAPH-FA79;Lo;0;L;5555;;;;N;;;;; +FA7A;CJK COMPATIBILITY IDEOGRAPH-FA7A;Lo;0;L;5599;;;;N;;;;; +FA7B;CJK COMPATIBILITY IDEOGRAPH-FA7B;Lo;0;L;55E2;;;;N;;;;; +FA7C;CJK COMPATIBILITY IDEOGRAPH-FA7C;Lo;0;L;585A;;;;N;;;;; +FA7D;CJK COMPATIBILITY IDEOGRAPH-FA7D;Lo;0;L;58B3;;;;N;;;;; +FA7E;CJK COMPATIBILITY IDEOGRAPH-FA7E;Lo;0;L;5944;;;;N;;;;; +FA7F;CJK COMPATIBILITY IDEOGRAPH-FA7F;Lo;0;L;5954;;;;N;;;;; +FA80;CJK COMPATIBILITY IDEOGRAPH-FA80;Lo;0;L;5A62;;;;N;;;;; +FA81;CJK COMPATIBILITY IDEOGRAPH-FA81;Lo;0;L;5B28;;;;N;;;;; +FA82;CJK COMPATIBILITY IDEOGRAPH-FA82;Lo;0;L;5ED2;;;;N;;;;; +FA83;CJK COMPATIBILITY IDEOGRAPH-FA83;Lo;0;L;5ED9;;;;N;;;;; +FA84;CJK COMPATIBILITY IDEOGRAPH-FA84;Lo;0;L;5F69;;;;N;;;;; +FA85;CJK COMPATIBILITY IDEOGRAPH-FA85;Lo;0;L;5FAD;;;;N;;;;; +FA86;CJK COMPATIBILITY IDEOGRAPH-FA86;Lo;0;L;60D8;;;;N;;;;; +FA87;CJK COMPATIBILITY IDEOGRAPH-FA87;Lo;0;L;614E;;;;N;;;;; +FA88;CJK COMPATIBILITY IDEOGRAPH-FA88;Lo;0;L;6108;;;;N;;;;; +FA89;CJK COMPATIBILITY IDEOGRAPH-FA89;Lo;0;L;618E;;;;N;;;;; +FA8A;CJK COMPATIBILITY IDEOGRAPH-FA8A;Lo;0;L;6160;;;;N;;;;; +FA8B;CJK COMPATIBILITY IDEOGRAPH-FA8B;Lo;0;L;61F2;;;;N;;;;; +FA8C;CJK COMPATIBILITY IDEOGRAPH-FA8C;Lo;0;L;6234;;;;N;;;;; +FA8D;CJK COMPATIBILITY IDEOGRAPH-FA8D;Lo;0;L;63C4;;;;N;;;;; +FA8E;CJK COMPATIBILITY IDEOGRAPH-FA8E;Lo;0;L;641C;;;;N;;;;; +FA8F;CJK COMPATIBILITY IDEOGRAPH-FA8F;Lo;0;L;6452;;;;N;;;;; +FA90;CJK COMPATIBILITY IDEOGRAPH-FA90;Lo;0;L;6556;;;;N;;;;; +FA91;CJK COMPATIBILITY IDEOGRAPH-FA91;Lo;0;L;6674;;;;N;;;;; +FA92;CJK COMPATIBILITY IDEOGRAPH-FA92;Lo;0;L;6717;;;;N;;;;; +FA93;CJK COMPATIBILITY IDEOGRAPH-FA93;Lo;0;L;671B;;;;N;;;;; +FA94;CJK COMPATIBILITY IDEOGRAPH-FA94;Lo;0;L;6756;;;;N;;;;; +FA95;CJK COMPATIBILITY IDEOGRAPH-FA95;Lo;0;L;6B79;;;;N;;;;; +FA96;CJK COMPATIBILITY IDEOGRAPH-FA96;Lo;0;L;6BBA;;;;N;;;;; +FA97;CJK COMPATIBILITY IDEOGRAPH-FA97;Lo;0;L;6D41;;;;N;;;;; +FA98;CJK COMPATIBILITY IDEOGRAPH-FA98;Lo;0;L;6EDB;;;;N;;;;; +FA99;CJK COMPATIBILITY IDEOGRAPH-FA99;Lo;0;L;6ECB;;;;N;;;;; +FA9A;CJK COMPATIBILITY IDEOGRAPH-FA9A;Lo;0;L;6F22;;;;N;;;;; +FA9B;CJK COMPATIBILITY IDEOGRAPH-FA9B;Lo;0;L;701E;;;;N;;;;; +FA9C;CJK COMPATIBILITY IDEOGRAPH-FA9C;Lo;0;L;716E;;;;N;;;;; +FA9D;CJK COMPATIBILITY IDEOGRAPH-FA9D;Lo;0;L;77A7;;;;N;;;;; +FA9E;CJK COMPATIBILITY IDEOGRAPH-FA9E;Lo;0;L;7235;;;;N;;;;; +FA9F;CJK COMPATIBILITY IDEOGRAPH-FA9F;Lo;0;L;72AF;;;;N;;;;; +FAA0;CJK COMPATIBILITY IDEOGRAPH-FAA0;Lo;0;L;732A;;;;N;;;;; +FAA1;CJK COMPATIBILITY IDEOGRAPH-FAA1;Lo;0;L;7471;;;;N;;;;; +FAA2;CJK COMPATIBILITY IDEOGRAPH-FAA2;Lo;0;L;7506;;;;N;;;;; +FAA3;CJK COMPATIBILITY IDEOGRAPH-FAA3;Lo;0;L;753B;;;;N;;;;; +FAA4;CJK COMPATIBILITY IDEOGRAPH-FAA4;Lo;0;L;761D;;;;N;;;;; +FAA5;CJK COMPATIBILITY IDEOGRAPH-FAA5;Lo;0;L;761F;;;;N;;;;; +FAA6;CJK COMPATIBILITY IDEOGRAPH-FAA6;Lo;0;L;76CA;;;;N;;;;; +FAA7;CJK COMPATIBILITY IDEOGRAPH-FAA7;Lo;0;L;76DB;;;;N;;;;; +FAA8;CJK COMPATIBILITY IDEOGRAPH-FAA8;Lo;0;L;76F4;;;;N;;;;; +FAA9;CJK COMPATIBILITY IDEOGRAPH-FAA9;Lo;0;L;774A;;;;N;;;;; +FAAA;CJK COMPATIBILITY IDEOGRAPH-FAAA;Lo;0;L;7740;;;;N;;;;; +FAAB;CJK COMPATIBILITY IDEOGRAPH-FAAB;Lo;0;L;78CC;;;;N;;;;; +FAAC;CJK COMPATIBILITY IDEOGRAPH-FAAC;Lo;0;L;7AB1;;;;N;;;;; +FAAD;CJK COMPATIBILITY IDEOGRAPH-FAAD;Lo;0;L;7BC0;;;;N;;;;; +FAAE;CJK COMPATIBILITY IDEOGRAPH-FAAE;Lo;0;L;7C7B;;;;N;;;;; +FAAF;CJK COMPATIBILITY IDEOGRAPH-FAAF;Lo;0;L;7D5B;;;;N;;;;; +FAB0;CJK COMPATIBILITY IDEOGRAPH-FAB0;Lo;0;L;7DF4;;;;N;;;;; +FAB1;CJK COMPATIBILITY IDEOGRAPH-FAB1;Lo;0;L;7F3E;;;;N;;;;; +FAB2;CJK COMPATIBILITY IDEOGRAPH-FAB2;Lo;0;L;8005;;;;N;;;;; +FAB3;CJK COMPATIBILITY IDEOGRAPH-FAB3;Lo;0;L;8352;;;;N;;;;; +FAB4;CJK COMPATIBILITY IDEOGRAPH-FAB4;Lo;0;L;83EF;;;;N;;;;; +FAB5;CJK COMPATIBILITY IDEOGRAPH-FAB5;Lo;0;L;8779;;;;N;;;;; +FAB6;CJK COMPATIBILITY IDEOGRAPH-FAB6;Lo;0;L;8941;;;;N;;;;; +FAB7;CJK COMPATIBILITY IDEOGRAPH-FAB7;Lo;0;L;8986;;;;N;;;;; +FAB8;CJK COMPATIBILITY IDEOGRAPH-FAB8;Lo;0;L;8996;;;;N;;;;; +FAB9;CJK COMPATIBILITY IDEOGRAPH-FAB9;Lo;0;L;8ABF;;;;N;;;;; +FABA;CJK COMPATIBILITY IDEOGRAPH-FABA;Lo;0;L;8AF8;;;;N;;;;; +FABB;CJK COMPATIBILITY IDEOGRAPH-FABB;Lo;0;L;8ACB;;;;N;;;;; +FABC;CJK COMPATIBILITY IDEOGRAPH-FABC;Lo;0;L;8B01;;;;N;;;;; +FABD;CJK COMPATIBILITY IDEOGRAPH-FABD;Lo;0;L;8AFE;;;;N;;;;; +FABE;CJK COMPATIBILITY IDEOGRAPH-FABE;Lo;0;L;8AED;;;;N;;;;; +FABF;CJK COMPATIBILITY IDEOGRAPH-FABF;Lo;0;L;8B39;;;;N;;;;; +FAC0;CJK COMPATIBILITY IDEOGRAPH-FAC0;Lo;0;L;8B8A;;;;N;;;;; +FAC1;CJK COMPATIBILITY IDEOGRAPH-FAC1;Lo;0;L;8D08;;;;N;;;;; +FAC2;CJK COMPATIBILITY IDEOGRAPH-FAC2;Lo;0;L;8F38;;;;N;;;;; +FAC3;CJK COMPATIBILITY IDEOGRAPH-FAC3;Lo;0;L;9072;;;;N;;;;; +FAC4;CJK COMPATIBILITY IDEOGRAPH-FAC4;Lo;0;L;9199;;;;N;;;;; +FAC5;CJK COMPATIBILITY IDEOGRAPH-FAC5;Lo;0;L;9276;;;;N;;;;; +FAC6;CJK COMPATIBILITY IDEOGRAPH-FAC6;Lo;0;L;967C;;;;N;;;;; +FAC7;CJK COMPATIBILITY IDEOGRAPH-FAC7;Lo;0;L;96E3;;;;N;;;;; +FAC8;CJK COMPATIBILITY IDEOGRAPH-FAC8;Lo;0;L;9756;;;;N;;;;; +FAC9;CJK COMPATIBILITY IDEOGRAPH-FAC9;Lo;0;L;97DB;;;;N;;;;; +FACA;CJK COMPATIBILITY IDEOGRAPH-FACA;Lo;0;L;97FF;;;;N;;;;; +FACB;CJK COMPATIBILITY IDEOGRAPH-FACB;Lo;0;L;980B;;;;N;;;;; +FACC;CJK COMPATIBILITY IDEOGRAPH-FACC;Lo;0;L;983B;;;;N;;;;; +FACD;CJK COMPATIBILITY IDEOGRAPH-FACD;Lo;0;L;9B12;;;;N;;;;; +FACE;CJK COMPATIBILITY IDEOGRAPH-FACE;Lo;0;L;9F9C;;;;N;;;;; +FACF;CJK COMPATIBILITY IDEOGRAPH-FACF;Lo;0;L;2284A;;;;N;;;;; +FAD0;CJK COMPATIBILITY IDEOGRAPH-FAD0;Lo;0;L;22844;;;;N;;;;; +FAD1;CJK COMPATIBILITY IDEOGRAPH-FAD1;Lo;0;L;233D5;;;;N;;;;; +FAD2;CJK COMPATIBILITY IDEOGRAPH-FAD2;Lo;0;L;3B9D;;;;N;;;;; +FAD3;CJK COMPATIBILITY IDEOGRAPH-FAD3;Lo;0;L;4018;;;;N;;;;; +FAD4;CJK COMPATIBILITY IDEOGRAPH-FAD4;Lo;0;L;4039;;;;N;;;;; +FAD5;CJK COMPATIBILITY IDEOGRAPH-FAD5;Lo;0;L;25249;;;;N;;;;; +FAD6;CJK COMPATIBILITY IDEOGRAPH-FAD6;Lo;0;L;25CD0;;;;N;;;;; +FAD7;CJK COMPATIBILITY IDEOGRAPH-FAD7;Lo;0;L;27ED3;;;;N;;;;; +FAD8;CJK COMPATIBILITY IDEOGRAPH-FAD8;Lo;0;L;9F43;;;;N;;;;; +FAD9;CJK COMPATIBILITY IDEOGRAPH-FAD9;Lo;0;L;9F8E;;;;N;;;;; +FB00;LATIN SMALL LIGATURE FF;Ll;0;L;<compat> 0066 0066;;;;N;;;;; +FB01;LATIN SMALL LIGATURE FI;Ll;0;L;<compat> 0066 0069;;;;N;;;;; +FB02;LATIN SMALL LIGATURE FL;Ll;0;L;<compat> 0066 006C;;;;N;;;;; +FB03;LATIN SMALL LIGATURE FFI;Ll;0;L;<compat> 0066 0066 0069;;;;N;;;;; +FB04;LATIN SMALL LIGATURE FFL;Ll;0;L;<compat> 0066 0066 006C;;;;N;;;;; +FB05;LATIN SMALL LIGATURE LONG S T;Ll;0;L;<compat> 017F 0074;;;;N;;;;; +FB06;LATIN SMALL LIGATURE ST;Ll;0;L;<compat> 0073 0074;;;;N;;;;; +FB13;ARMENIAN SMALL LIGATURE MEN NOW;Ll;0;L;<compat> 0574 0576;;;;N;;;;; +FB14;ARMENIAN SMALL LIGATURE MEN ECH;Ll;0;L;<compat> 0574 0565;;;;N;;;;; +FB15;ARMENIAN SMALL LIGATURE MEN INI;Ll;0;L;<compat> 0574 056B;;;;N;;;;; +FB16;ARMENIAN SMALL LIGATURE VEW NOW;Ll;0;L;<compat> 057E 0576;;;;N;;;;; +FB17;ARMENIAN SMALL LIGATURE MEN XEH;Ll;0;L;<compat> 0574 056D;;;;N;;;;; +FB1D;HEBREW LETTER YOD WITH HIRIQ;Lo;0;R;05D9 05B4;;;;N;;;;; +FB1E;HEBREW POINT JUDEO-SPANISH VARIKA;Mn;26;NSM;;;;;N;HEBREW POINT VARIKA;;;; +FB1F;HEBREW LIGATURE YIDDISH YOD YOD PATAH;Lo;0;R;05F2 05B7;;;;N;;;;; +FB20;HEBREW LETTER ALTERNATIVE AYIN;Lo;0;R;<font> 05E2;;;;N;;;;; +FB21;HEBREW LETTER WIDE ALEF;Lo;0;R;<font> 05D0;;;;N;;;;; +FB22;HEBREW LETTER WIDE DALET;Lo;0;R;<font> 05D3;;;;N;;;;; +FB23;HEBREW LETTER WIDE HE;Lo;0;R;<font> 05D4;;;;N;;;;; +FB24;HEBREW LETTER WIDE KAF;Lo;0;R;<font> 05DB;;;;N;;;;; +FB25;HEBREW LETTER WIDE LAMED;Lo;0;R;<font> 05DC;;;;N;;;;; +FB26;HEBREW LETTER WIDE FINAL MEM;Lo;0;R;<font> 05DD;;;;N;;;;; +FB27;HEBREW LETTER WIDE RESH;Lo;0;R;<font> 05E8;;;;N;;;;; +FB28;HEBREW LETTER WIDE TAV;Lo;0;R;<font> 05EA;;;;N;;;;; +FB29;HEBREW LETTER ALTERNATIVE PLUS SIGN;Sm;0;ES;<font> 002B;;;;N;;;;; +FB2A;HEBREW LETTER SHIN WITH SHIN DOT;Lo;0;R;05E9 05C1;;;;N;;;;; +FB2B;HEBREW LETTER SHIN WITH SIN DOT;Lo;0;R;05E9 05C2;;;;N;;;;; +FB2C;HEBREW LETTER SHIN WITH DAGESH AND SHIN DOT;Lo;0;R;FB49 05C1;;;;N;;;;; +FB2D;HEBREW LETTER SHIN WITH DAGESH AND SIN DOT;Lo;0;R;FB49 05C2;;;;N;;;;; +FB2E;HEBREW LETTER ALEF WITH PATAH;Lo;0;R;05D0 05B7;;;;N;;;;; +FB2F;HEBREW LETTER ALEF WITH QAMATS;Lo;0;R;05D0 05B8;;;;N;;;;; +FB30;HEBREW LETTER ALEF WITH MAPIQ;Lo;0;R;05D0 05BC;;;;N;;;;; +FB31;HEBREW LETTER BET WITH DAGESH;Lo;0;R;05D1 05BC;;;;N;;;;; +FB32;HEBREW LETTER GIMEL WITH DAGESH;Lo;0;R;05D2 05BC;;;;N;;;;; +FB33;HEBREW LETTER DALET WITH DAGESH;Lo;0;R;05D3 05BC;;;;N;;;;; +FB34;HEBREW LETTER HE WITH MAPIQ;Lo;0;R;05D4 05BC;;;;N;;;;; +FB35;HEBREW LETTER VAV WITH DAGESH;Lo;0;R;05D5 05BC;;;;N;;;;; +FB36;HEBREW LETTER ZAYIN WITH DAGESH;Lo;0;R;05D6 05BC;;;;N;;;;; +FB38;HEBREW LETTER TET WITH DAGESH;Lo;0;R;05D8 05BC;;;;N;;;;; +FB39;HEBREW LETTER YOD WITH DAGESH;Lo;0;R;05D9 05BC;;;;N;;;;; +FB3A;HEBREW LETTER FINAL KAF WITH DAGESH;Lo;0;R;05DA 05BC;;;;N;;;;; +FB3B;HEBREW LETTER KAF WITH DAGESH;Lo;0;R;05DB 05BC;;;;N;;;;; +FB3C;HEBREW LETTER LAMED WITH DAGESH;Lo;0;R;05DC 05BC;;;;N;;;;; +FB3E;HEBREW LETTER MEM WITH DAGESH;Lo;0;R;05DE 05BC;;;;N;;;;; +FB40;HEBREW LETTER NUN WITH DAGESH;Lo;0;R;05E0 05BC;;;;N;;;;; +FB41;HEBREW LETTER SAMEKH WITH DAGESH;Lo;0;R;05E1 05BC;;;;N;;;;; +FB43;HEBREW LETTER FINAL PE WITH DAGESH;Lo;0;R;05E3 05BC;;;;N;;;;; +FB44;HEBREW LETTER PE WITH DAGESH;Lo;0;R;05E4 05BC;;;;N;;;;; +FB46;HEBREW LETTER TSADI WITH DAGESH;Lo;0;R;05E6 05BC;;;;N;;;;; +FB47;HEBREW LETTER QOF WITH DAGESH;Lo;0;R;05E7 05BC;;;;N;;;;; +FB48;HEBREW LETTER RESH WITH DAGESH;Lo;0;R;05E8 05BC;;;;N;;;;; +FB49;HEBREW LETTER SHIN WITH DAGESH;Lo;0;R;05E9 05BC;;;;N;;;;; +FB4A;HEBREW LETTER TAV WITH DAGESH;Lo;0;R;05EA 05BC;;;;N;;;;; +FB4B;HEBREW LETTER VAV WITH HOLAM;Lo;0;R;05D5 05B9;;;;N;;;;; +FB4C;HEBREW LETTER BET WITH RAFE;Lo;0;R;05D1 05BF;;;;N;;;;; +FB4D;HEBREW LETTER KAF WITH RAFE;Lo;0;R;05DB 05BF;;;;N;;;;; +FB4E;HEBREW LETTER PE WITH RAFE;Lo;0;R;05E4 05BF;;;;N;;;;; +FB4F;HEBREW LIGATURE ALEF LAMED;Lo;0;R;<compat> 05D0 05DC;;;;N;;;;; +FB50;ARABIC LETTER ALEF WASLA ISOLATED FORM;Lo;0;AL;<isolated> 0671;;;;N;;;;; +FB51;ARABIC LETTER ALEF WASLA FINAL FORM;Lo;0;AL;<final> 0671;;;;N;;;;; +FB52;ARABIC LETTER BEEH ISOLATED FORM;Lo;0;AL;<isolated> 067B;;;;N;;;;; +FB53;ARABIC LETTER BEEH FINAL FORM;Lo;0;AL;<final> 067B;;;;N;;;;; +FB54;ARABIC LETTER BEEH INITIAL FORM;Lo;0;AL;<initial> 067B;;;;N;;;;; +FB55;ARABIC LETTER BEEH MEDIAL FORM;Lo;0;AL;<medial> 067B;;;;N;;;;; +FB56;ARABIC LETTER PEH ISOLATED FORM;Lo;0;AL;<isolated> 067E;;;;N;;;;; +FB57;ARABIC LETTER PEH FINAL FORM;Lo;0;AL;<final> 067E;;;;N;;;;; +FB58;ARABIC LETTER PEH INITIAL FORM;Lo;0;AL;<initial> 067E;;;;N;;;;; +FB59;ARABIC LETTER PEH MEDIAL FORM;Lo;0;AL;<medial> 067E;;;;N;;;;; +FB5A;ARABIC LETTER BEHEH ISOLATED FORM;Lo;0;AL;<isolated> 0680;;;;N;;;;; +FB5B;ARABIC LETTER BEHEH FINAL FORM;Lo;0;AL;<final> 0680;;;;N;;;;; +FB5C;ARABIC LETTER BEHEH INITIAL FORM;Lo;0;AL;<initial> 0680;;;;N;;;;; +FB5D;ARABIC LETTER BEHEH MEDIAL FORM;Lo;0;AL;<medial> 0680;;;;N;;;;; +FB5E;ARABIC LETTER TTEHEH ISOLATED FORM;Lo;0;AL;<isolated> 067A;;;;N;;;;; +FB5F;ARABIC LETTER TTEHEH FINAL FORM;Lo;0;AL;<final> 067A;;;;N;;;;; +FB60;ARABIC LETTER TTEHEH INITIAL FORM;Lo;0;AL;<initial> 067A;;;;N;;;;; +FB61;ARABIC LETTER TTEHEH MEDIAL FORM;Lo;0;AL;<medial> 067A;;;;N;;;;; +FB62;ARABIC LETTER TEHEH ISOLATED FORM;Lo;0;AL;<isolated> 067F;;;;N;;;;; +FB63;ARABIC LETTER TEHEH FINAL FORM;Lo;0;AL;<final> 067F;;;;N;;;;; +FB64;ARABIC LETTER TEHEH INITIAL FORM;Lo;0;AL;<initial> 067F;;;;N;;;;; +FB65;ARABIC LETTER TEHEH MEDIAL FORM;Lo;0;AL;<medial> 067F;;;;N;;;;; +FB66;ARABIC LETTER TTEH ISOLATED FORM;Lo;0;AL;<isolated> 0679;;;;N;;;;; +FB67;ARABIC LETTER TTEH FINAL FORM;Lo;0;AL;<final> 0679;;;;N;;;;; +FB68;ARABIC LETTER TTEH INITIAL FORM;Lo;0;AL;<initial> 0679;;;;N;;;;; +FB69;ARABIC LETTER TTEH MEDIAL FORM;Lo;0;AL;<medial> 0679;;;;N;;;;; +FB6A;ARABIC LETTER VEH ISOLATED FORM;Lo;0;AL;<isolated> 06A4;;;;N;;;;; +FB6B;ARABIC LETTER VEH FINAL FORM;Lo;0;AL;<final> 06A4;;;;N;;;;; +FB6C;ARABIC LETTER VEH INITIAL FORM;Lo;0;AL;<initial> 06A4;;;;N;;;;; +FB6D;ARABIC LETTER VEH MEDIAL FORM;Lo;0;AL;<medial> 06A4;;;;N;;;;; +FB6E;ARABIC LETTER PEHEH ISOLATED FORM;Lo;0;AL;<isolated> 06A6;;;;N;;;;; +FB6F;ARABIC LETTER PEHEH FINAL FORM;Lo;0;AL;<final> 06A6;;;;N;;;;; +FB70;ARABIC LETTER PEHEH INITIAL FORM;Lo;0;AL;<initial> 06A6;;;;N;;;;; +FB71;ARABIC LETTER PEHEH MEDIAL FORM;Lo;0;AL;<medial> 06A6;;;;N;;;;; +FB72;ARABIC LETTER DYEH ISOLATED FORM;Lo;0;AL;<isolated> 0684;;;;N;;;;; +FB73;ARABIC LETTER DYEH FINAL FORM;Lo;0;AL;<final> 0684;;;;N;;;;; +FB74;ARABIC LETTER DYEH INITIAL FORM;Lo;0;AL;<initial> 0684;;;;N;;;;; +FB75;ARABIC LETTER DYEH MEDIAL FORM;Lo;0;AL;<medial> 0684;;;;N;;;;; +FB76;ARABIC LETTER NYEH ISOLATED FORM;Lo;0;AL;<isolated> 0683;;;;N;;;;; +FB77;ARABIC LETTER NYEH FINAL FORM;Lo;0;AL;<final> 0683;;;;N;;;;; +FB78;ARABIC LETTER NYEH INITIAL FORM;Lo;0;AL;<initial> 0683;;;;N;;;;; +FB79;ARABIC LETTER NYEH MEDIAL FORM;Lo;0;AL;<medial> 0683;;;;N;;;;; +FB7A;ARABIC LETTER TCHEH ISOLATED FORM;Lo;0;AL;<isolated> 0686;;;;N;;;;; +FB7B;ARABIC LETTER TCHEH FINAL FORM;Lo;0;AL;<final> 0686;;;;N;;;;; +FB7C;ARABIC LETTER TCHEH INITIAL FORM;Lo;0;AL;<initial> 0686;;;;N;;;;; +FB7D;ARABIC LETTER TCHEH MEDIAL FORM;Lo;0;AL;<medial> 0686;;;;N;;;;; +FB7E;ARABIC LETTER TCHEHEH ISOLATED FORM;Lo;0;AL;<isolated> 0687;;;;N;;;;; +FB7F;ARABIC LETTER TCHEHEH FINAL FORM;Lo;0;AL;<final> 0687;;;;N;;;;; +FB80;ARABIC LETTER TCHEHEH INITIAL FORM;Lo;0;AL;<initial> 0687;;;;N;;;;; +FB81;ARABIC LETTER TCHEHEH MEDIAL FORM;Lo;0;AL;<medial> 0687;;;;N;;;;; +FB82;ARABIC LETTER DDAHAL ISOLATED FORM;Lo;0;AL;<isolated> 068D;;;;N;;;;; +FB83;ARABIC LETTER DDAHAL FINAL FORM;Lo;0;AL;<final> 068D;;;;N;;;;; +FB84;ARABIC LETTER DAHAL ISOLATED FORM;Lo;0;AL;<isolated> 068C;;;;N;;;;; +FB85;ARABIC LETTER DAHAL FINAL FORM;Lo;0;AL;<final> 068C;;;;N;;;;; +FB86;ARABIC LETTER DUL ISOLATED FORM;Lo;0;AL;<isolated> 068E;;;;N;;;;; +FB87;ARABIC LETTER DUL FINAL FORM;Lo;0;AL;<final> 068E;;;;N;;;;; +FB88;ARABIC LETTER DDAL ISOLATED FORM;Lo;0;AL;<isolated> 0688;;;;N;;;;; +FB89;ARABIC LETTER DDAL FINAL FORM;Lo;0;AL;<final> 0688;;;;N;;;;; +FB8A;ARABIC LETTER JEH ISOLATED FORM;Lo;0;AL;<isolated> 0698;;;;N;;;;; +FB8B;ARABIC LETTER JEH FINAL FORM;Lo;0;AL;<final> 0698;;;;N;;;;; +FB8C;ARABIC LETTER RREH ISOLATED FORM;Lo;0;AL;<isolated> 0691;;;;N;;;;; +FB8D;ARABIC LETTER RREH FINAL FORM;Lo;0;AL;<final> 0691;;;;N;;;;; +FB8E;ARABIC LETTER KEHEH ISOLATED FORM;Lo;0;AL;<isolated> 06A9;;;;N;;;;; +FB8F;ARABIC LETTER KEHEH FINAL FORM;Lo;0;AL;<final> 06A9;;;;N;;;;; +FB90;ARABIC LETTER KEHEH INITIAL FORM;Lo;0;AL;<initial> 06A9;;;;N;;;;; +FB91;ARABIC LETTER KEHEH MEDIAL FORM;Lo;0;AL;<medial> 06A9;;;;N;;;;; +FB92;ARABIC LETTER GAF ISOLATED FORM;Lo;0;AL;<isolated> 06AF;;;;N;;;;; +FB93;ARABIC LETTER GAF FINAL FORM;Lo;0;AL;<final> 06AF;;;;N;;;;; +FB94;ARABIC LETTER GAF INITIAL FORM;Lo;0;AL;<initial> 06AF;;;;N;;;;; +FB95;ARABIC LETTER GAF MEDIAL FORM;Lo;0;AL;<medial> 06AF;;;;N;;;;; +FB96;ARABIC LETTER GUEH ISOLATED FORM;Lo;0;AL;<isolated> 06B3;;;;N;;;;; +FB97;ARABIC LETTER GUEH FINAL FORM;Lo;0;AL;<final> 06B3;;;;N;;;;; +FB98;ARABIC LETTER GUEH INITIAL FORM;Lo;0;AL;<initial> 06B3;;;;N;;;;; +FB99;ARABIC LETTER GUEH MEDIAL FORM;Lo;0;AL;<medial> 06B3;;;;N;;;;; +FB9A;ARABIC LETTER NGOEH ISOLATED FORM;Lo;0;AL;<isolated> 06B1;;;;N;;;;; +FB9B;ARABIC LETTER NGOEH FINAL FORM;Lo;0;AL;<final> 06B1;;;;N;;;;; +FB9C;ARABIC LETTER NGOEH INITIAL FORM;Lo;0;AL;<initial> 06B1;;;;N;;;;; +FB9D;ARABIC LETTER NGOEH MEDIAL FORM;Lo;0;AL;<medial> 06B1;;;;N;;;;; +FB9E;ARABIC LETTER NOON GHUNNA ISOLATED FORM;Lo;0;AL;<isolated> 06BA;;;;N;;;;; +FB9F;ARABIC LETTER NOON GHUNNA FINAL FORM;Lo;0;AL;<final> 06BA;;;;N;;;;; +FBA0;ARABIC LETTER RNOON ISOLATED FORM;Lo;0;AL;<isolated> 06BB;;;;N;;;;; +FBA1;ARABIC LETTER RNOON FINAL FORM;Lo;0;AL;<final> 06BB;;;;N;;;;; +FBA2;ARABIC LETTER RNOON INITIAL FORM;Lo;0;AL;<initial> 06BB;;;;N;;;;; +FBA3;ARABIC LETTER RNOON MEDIAL FORM;Lo;0;AL;<medial> 06BB;;;;N;;;;; +FBA4;ARABIC LETTER HEH WITH YEH ABOVE ISOLATED FORM;Lo;0;AL;<isolated> 06C0;;;;N;;;;; +FBA5;ARABIC LETTER HEH WITH YEH ABOVE FINAL FORM;Lo;0;AL;<final> 06C0;;;;N;;;;; +FBA6;ARABIC LETTER HEH GOAL ISOLATED FORM;Lo;0;AL;<isolated> 06C1;;;;N;;;;; +FBA7;ARABIC LETTER HEH GOAL FINAL FORM;Lo;0;AL;<final> 06C1;;;;N;;;;; +FBA8;ARABIC LETTER HEH GOAL INITIAL FORM;Lo;0;AL;<initial> 06C1;;;;N;;;;; +FBA9;ARABIC LETTER HEH GOAL MEDIAL FORM;Lo;0;AL;<medial> 06C1;;;;N;;;;; +FBAA;ARABIC LETTER HEH DOACHASHMEE ISOLATED FORM;Lo;0;AL;<isolated> 06BE;;;;N;;;;; +FBAB;ARABIC LETTER HEH DOACHASHMEE FINAL FORM;Lo;0;AL;<final> 06BE;;;;N;;;;; +FBAC;ARABIC LETTER HEH DOACHASHMEE INITIAL FORM;Lo;0;AL;<initial> 06BE;;;;N;;;;; +FBAD;ARABIC LETTER HEH DOACHASHMEE MEDIAL FORM;Lo;0;AL;<medial> 06BE;;;;N;;;;; +FBAE;ARABIC LETTER YEH BARREE ISOLATED FORM;Lo;0;AL;<isolated> 06D2;;;;N;;;;; +FBAF;ARABIC LETTER YEH BARREE FINAL FORM;Lo;0;AL;<final> 06D2;;;;N;;;;; +FBB0;ARABIC LETTER YEH BARREE WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL;<isolated> 06D3;;;;N;;;;; +FBB1;ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM;Lo;0;AL;<final> 06D3;;;;N;;;;; +FBB2;ARABIC SYMBOL DOT ABOVE;Sk;0;AL;;;;;N;;;;; +FBB3;ARABIC SYMBOL DOT BELOW;Sk;0;AL;;;;;N;;;;; +FBB4;ARABIC SYMBOL TWO DOTS ABOVE;Sk;0;AL;;;;;N;;;;; +FBB5;ARABIC SYMBOL TWO DOTS BELOW;Sk;0;AL;;;;;N;;;;; +FBB6;ARABIC SYMBOL THREE DOTS ABOVE;Sk;0;AL;;;;;N;;;;; +FBB7;ARABIC SYMBOL THREE DOTS BELOW;Sk;0;AL;;;;;N;;;;; +FBB8;ARABIC SYMBOL THREE DOTS POINTING DOWNWARDS ABOVE;Sk;0;AL;;;;;N;;;;; +FBB9;ARABIC SYMBOL THREE DOTS POINTING DOWNWARDS BELOW;Sk;0;AL;;;;;N;;;;; +FBBA;ARABIC SYMBOL FOUR DOTS ABOVE;Sk;0;AL;;;;;N;;;;; +FBBB;ARABIC SYMBOL FOUR DOTS BELOW;Sk;0;AL;;;;;N;;;;; +FBBC;ARABIC SYMBOL DOUBLE VERTICAL BAR BELOW;Sk;0;AL;;;;;N;;;;; +FBBD;ARABIC SYMBOL TWO DOTS VERTICALLY ABOVE;Sk;0;AL;;;;;N;;;;; +FBBE;ARABIC SYMBOL TWO DOTS VERTICALLY BELOW;Sk;0;AL;;;;;N;;;;; +FBBF;ARABIC SYMBOL RING;Sk;0;AL;;;;;N;;;;; +FBC0;ARABIC SYMBOL SMALL TAH ABOVE;Sk;0;AL;;;;;N;;;;; +FBC1;ARABIC SYMBOL SMALL TAH BELOW;Sk;0;AL;;;;;N;;;;; +FBD3;ARABIC LETTER NG ISOLATED FORM;Lo;0;AL;<isolated> 06AD;;;;N;;;;; +FBD4;ARABIC LETTER NG FINAL FORM;Lo;0;AL;<final> 06AD;;;;N;;;;; +FBD5;ARABIC LETTER NG INITIAL FORM;Lo;0;AL;<initial> 06AD;;;;N;;;;; +FBD6;ARABIC LETTER NG MEDIAL FORM;Lo;0;AL;<medial> 06AD;;;;N;;;;; +FBD7;ARABIC LETTER U ISOLATED FORM;Lo;0;AL;<isolated> 06C7;;;;N;;;;; +FBD8;ARABIC LETTER U FINAL FORM;Lo;0;AL;<final> 06C7;;;;N;;;;; +FBD9;ARABIC LETTER OE ISOLATED FORM;Lo;0;AL;<isolated> 06C6;;;;N;;;;; +FBDA;ARABIC LETTER OE FINAL FORM;Lo;0;AL;<final> 06C6;;;;N;;;;; +FBDB;ARABIC LETTER YU ISOLATED FORM;Lo;0;AL;<isolated> 06C8;;;;N;;;;; +FBDC;ARABIC LETTER YU FINAL FORM;Lo;0;AL;<final> 06C8;;;;N;;;;; +FBDD;ARABIC LETTER U WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL;<isolated> 0677;;;;N;;;;; +FBDE;ARABIC LETTER VE ISOLATED FORM;Lo;0;AL;<isolated> 06CB;;;;N;;;;; +FBDF;ARABIC LETTER VE FINAL FORM;Lo;0;AL;<final> 06CB;;;;N;;;;; +FBE0;ARABIC LETTER KIRGHIZ OE ISOLATED FORM;Lo;0;AL;<isolated> 06C5;;;;N;;;;; +FBE1;ARABIC LETTER KIRGHIZ OE FINAL FORM;Lo;0;AL;<final> 06C5;;;;N;;;;; +FBE2;ARABIC LETTER KIRGHIZ YU ISOLATED FORM;Lo;0;AL;<isolated> 06C9;;;;N;;;;; +FBE3;ARABIC LETTER KIRGHIZ YU FINAL FORM;Lo;0;AL;<final> 06C9;;;;N;;;;; +FBE4;ARABIC LETTER E ISOLATED FORM;Lo;0;AL;<isolated> 06D0;;;;N;;;;; +FBE5;ARABIC LETTER E FINAL FORM;Lo;0;AL;<final> 06D0;;;;N;;;;; +FBE6;ARABIC LETTER E INITIAL FORM;Lo;0;AL;<initial> 06D0;;;;N;;;;; +FBE7;ARABIC LETTER E MEDIAL FORM;Lo;0;AL;<medial> 06D0;;;;N;;;;; +FBE8;ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA INITIAL FORM;Lo;0;AL;<initial> 0649;;;;N;;;;; +FBE9;ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA MEDIAL FORM;Lo;0;AL;<medial> 0649;;;;N;;;;; +FBEA;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF ISOLATED FORM;Lo;0;AL;<isolated> 0626 0627;;;;N;;;;; +FBEB;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF FINAL FORM;Lo;0;AL;<final> 0626 0627;;;;N;;;;; +FBEC;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE ISOLATED FORM;Lo;0;AL;<isolated> 0626 06D5;;;;N;;;;; +FBED;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE FINAL FORM;Lo;0;AL;<final> 0626 06D5;;;;N;;;;; +FBEE;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW ISOLATED FORM;Lo;0;AL;<isolated> 0626 0648;;;;N;;;;; +FBEF;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW FINAL FORM;Lo;0;AL;<final> 0626 0648;;;;N;;;;; +FBF0;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U ISOLATED FORM;Lo;0;AL;<isolated> 0626 06C7;;;;N;;;;; +FBF1;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U FINAL FORM;Lo;0;AL;<final> 0626 06C7;;;;N;;;;; +FBF2;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE ISOLATED FORM;Lo;0;AL;<isolated> 0626 06C6;;;;N;;;;; +FBF3;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE FINAL FORM;Lo;0;AL;<final> 0626 06C6;;;;N;;;;; +FBF4;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU ISOLATED FORM;Lo;0;AL;<isolated> 0626 06C8;;;;N;;;;; +FBF5;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU FINAL FORM;Lo;0;AL;<final> 0626 06C8;;;;N;;;;; +FBF6;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E ISOLATED FORM;Lo;0;AL;<isolated> 0626 06D0;;;;N;;;;; +FBF7;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E FINAL FORM;Lo;0;AL;<final> 0626 06D0;;;;N;;;;; +FBF8;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E INITIAL FORM;Lo;0;AL;<initial> 0626 06D0;;;;N;;;;; +FBF9;ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0626 0649;;;;N;;;;; +FBFA;ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0626 0649;;;;N;;;;; +FBFB;ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA INITIAL FORM;Lo;0;AL;<initial> 0626 0649;;;;N;;;;; +FBFC;ARABIC LETTER FARSI YEH ISOLATED FORM;Lo;0;AL;<isolated> 06CC;;;;N;;;;; +FBFD;ARABIC LETTER FARSI YEH FINAL FORM;Lo;0;AL;<final> 06CC;;;;N;;;;; +FBFE;ARABIC LETTER FARSI YEH INITIAL FORM;Lo;0;AL;<initial> 06CC;;;;N;;;;; +FBFF;ARABIC LETTER FARSI YEH MEDIAL FORM;Lo;0;AL;<medial> 06CC;;;;N;;;;; +FC00;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0626 062C;;;;N;;;;; +FC01;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0626 062D;;;;N;;;;; +FC02;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0626 0645;;;;N;;;;; +FC03;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0626 0649;;;;N;;;;; +FC04;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0626 064A;;;;N;;;;; +FC05;ARABIC LIGATURE BEH WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0628 062C;;;;N;;;;; +FC06;ARABIC LIGATURE BEH WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0628 062D;;;;N;;;;; +FC07;ARABIC LIGATURE BEH WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 0628 062E;;;;N;;;;; +FC08;ARABIC LIGATURE BEH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0628 0645;;;;N;;;;; +FC09;ARABIC LIGATURE BEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0628 0649;;;;N;;;;; +FC0A;ARABIC LIGATURE BEH WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0628 064A;;;;N;;;;; +FC0B;ARABIC LIGATURE TEH WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 062A 062C;;;;N;;;;; +FC0C;ARABIC LIGATURE TEH WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 062A 062D;;;;N;;;;; +FC0D;ARABIC LIGATURE TEH WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 062A 062E;;;;N;;;;; +FC0E;ARABIC LIGATURE TEH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 062A 0645;;;;N;;;;; +FC0F;ARABIC LIGATURE TEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 062A 0649;;;;N;;;;; +FC10;ARABIC LIGATURE TEH WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 062A 064A;;;;N;;;;; +FC11;ARABIC LIGATURE THEH WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 062B 062C;;;;N;;;;; +FC12;ARABIC LIGATURE THEH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 062B 0645;;;;N;;;;; +FC13;ARABIC LIGATURE THEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 062B 0649;;;;N;;;;; +FC14;ARABIC LIGATURE THEH WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 062B 064A;;;;N;;;;; +FC15;ARABIC LIGATURE JEEM WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 062C 062D;;;;N;;;;; +FC16;ARABIC LIGATURE JEEM WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 062C 0645;;;;N;;;;; +FC17;ARABIC LIGATURE HAH WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 062D 062C;;;;N;;;;; +FC18;ARABIC LIGATURE HAH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 062D 0645;;;;N;;;;; +FC19;ARABIC LIGATURE KHAH WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 062E 062C;;;;N;;;;; +FC1A;ARABIC LIGATURE KHAH WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 062E 062D;;;;N;;;;; +FC1B;ARABIC LIGATURE KHAH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 062E 0645;;;;N;;;;; +FC1C;ARABIC LIGATURE SEEN WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0633 062C;;;;N;;;;; +FC1D;ARABIC LIGATURE SEEN WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0633 062D;;;;N;;;;; +FC1E;ARABIC LIGATURE SEEN WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 0633 062E;;;;N;;;;; +FC1F;ARABIC LIGATURE SEEN WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0633 0645;;;;N;;;;; +FC20;ARABIC LIGATURE SAD WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0635 062D;;;;N;;;;; +FC21;ARABIC LIGATURE SAD WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0635 0645;;;;N;;;;; +FC22;ARABIC LIGATURE DAD WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0636 062C;;;;N;;;;; +FC23;ARABIC LIGATURE DAD WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0636 062D;;;;N;;;;; +FC24;ARABIC LIGATURE DAD WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 0636 062E;;;;N;;;;; +FC25;ARABIC LIGATURE DAD WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0636 0645;;;;N;;;;; +FC26;ARABIC LIGATURE TAH WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0637 062D;;;;N;;;;; +FC27;ARABIC LIGATURE TAH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0637 0645;;;;N;;;;; +FC28;ARABIC LIGATURE ZAH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0638 0645;;;;N;;;;; +FC29;ARABIC LIGATURE AIN WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0639 062C;;;;N;;;;; +FC2A;ARABIC LIGATURE AIN WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0639 0645;;;;N;;;;; +FC2B;ARABIC LIGATURE GHAIN WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 063A 062C;;;;N;;;;; +FC2C;ARABIC LIGATURE GHAIN WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 063A 0645;;;;N;;;;; +FC2D;ARABIC LIGATURE FEH WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0641 062C;;;;N;;;;; +FC2E;ARABIC LIGATURE FEH WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0641 062D;;;;N;;;;; +FC2F;ARABIC LIGATURE FEH WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 0641 062E;;;;N;;;;; +FC30;ARABIC LIGATURE FEH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0641 0645;;;;N;;;;; +FC31;ARABIC LIGATURE FEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0641 0649;;;;N;;;;; +FC32;ARABIC LIGATURE FEH WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0641 064A;;;;N;;;;; +FC33;ARABIC LIGATURE QAF WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0642 062D;;;;N;;;;; +FC34;ARABIC LIGATURE QAF WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0642 0645;;;;N;;;;; +FC35;ARABIC LIGATURE QAF WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0642 0649;;;;N;;;;; +FC36;ARABIC LIGATURE QAF WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0642 064A;;;;N;;;;; +FC37;ARABIC LIGATURE KAF WITH ALEF ISOLATED FORM;Lo;0;AL;<isolated> 0643 0627;;;;N;;;;; +FC38;ARABIC LIGATURE KAF WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0643 062C;;;;N;;;;; +FC39;ARABIC LIGATURE KAF WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0643 062D;;;;N;;;;; +FC3A;ARABIC LIGATURE KAF WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 0643 062E;;;;N;;;;; +FC3B;ARABIC LIGATURE KAF WITH LAM ISOLATED FORM;Lo;0;AL;<isolated> 0643 0644;;;;N;;;;; +FC3C;ARABIC LIGATURE KAF WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0643 0645;;;;N;;;;; +FC3D;ARABIC LIGATURE KAF WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0643 0649;;;;N;;;;; +FC3E;ARABIC LIGATURE KAF WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0643 064A;;;;N;;;;; +FC3F;ARABIC LIGATURE LAM WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0644 062C;;;;N;;;;; +FC40;ARABIC LIGATURE LAM WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0644 062D;;;;N;;;;; +FC41;ARABIC LIGATURE LAM WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 0644 062E;;;;N;;;;; +FC42;ARABIC LIGATURE LAM WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0644 0645;;;;N;;;;; +FC43;ARABIC LIGATURE LAM WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0644 0649;;;;N;;;;; +FC44;ARABIC LIGATURE LAM WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0644 064A;;;;N;;;;; +FC45;ARABIC LIGATURE MEEM WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0645 062C;;;;N;;;;; +FC46;ARABIC LIGATURE MEEM WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0645 062D;;;;N;;;;; +FC47;ARABIC LIGATURE MEEM WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 0645 062E;;;;N;;;;; +FC48;ARABIC LIGATURE MEEM WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0645 0645;;;;N;;;;; +FC49;ARABIC LIGATURE MEEM WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0645 0649;;;;N;;;;; +FC4A;ARABIC LIGATURE MEEM WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0645 064A;;;;N;;;;; +FC4B;ARABIC LIGATURE NOON WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0646 062C;;;;N;;;;; +FC4C;ARABIC LIGATURE NOON WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0646 062D;;;;N;;;;; +FC4D;ARABIC LIGATURE NOON WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 0646 062E;;;;N;;;;; +FC4E;ARABIC LIGATURE NOON WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0646 0645;;;;N;;;;; +FC4F;ARABIC LIGATURE NOON WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0646 0649;;;;N;;;;; +FC50;ARABIC LIGATURE NOON WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0646 064A;;;;N;;;;; +FC51;ARABIC LIGATURE HEH WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0647 062C;;;;N;;;;; +FC52;ARABIC LIGATURE HEH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0647 0645;;;;N;;;;; +FC53;ARABIC LIGATURE HEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0647 0649;;;;N;;;;; +FC54;ARABIC LIGATURE HEH WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0647 064A;;;;N;;;;; +FC55;ARABIC LIGATURE YEH WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 064A 062C;;;;N;;;;; +FC56;ARABIC LIGATURE YEH WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 064A 062D;;;;N;;;;; +FC57;ARABIC LIGATURE YEH WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 064A 062E;;;;N;;;;; +FC58;ARABIC LIGATURE YEH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 064A 0645;;;;N;;;;; +FC59;ARABIC LIGATURE YEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 064A 0649;;;;N;;;;; +FC5A;ARABIC LIGATURE YEH WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 064A 064A;;;;N;;;;; +FC5B;ARABIC LIGATURE THAL WITH SUPERSCRIPT ALEF ISOLATED FORM;Lo;0;AL;<isolated> 0630 0670;;;;N;;;;; +FC5C;ARABIC LIGATURE REH WITH SUPERSCRIPT ALEF ISOLATED FORM;Lo;0;AL;<isolated> 0631 0670;;;;N;;;;; +FC5D;ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF ISOLATED FORM;Lo;0;AL;<isolated> 0649 0670;;;;N;;;;; +FC5E;ARABIC LIGATURE SHADDA WITH DAMMATAN ISOLATED FORM;Lo;0;AL;<isolated> 0020 064C 0651;;;;N;;;;; +FC5F;ARABIC LIGATURE SHADDA WITH KASRATAN ISOLATED FORM;Lo;0;AL;<isolated> 0020 064D 0651;;;;N;;;;; +FC60;ARABIC LIGATURE SHADDA WITH FATHA ISOLATED FORM;Lo;0;AL;<isolated> 0020 064E 0651;;;;N;;;;; +FC61;ARABIC LIGATURE SHADDA WITH DAMMA ISOLATED FORM;Lo;0;AL;<isolated> 0020 064F 0651;;;;N;;;;; +FC62;ARABIC LIGATURE SHADDA WITH KASRA ISOLATED FORM;Lo;0;AL;<isolated> 0020 0650 0651;;;;N;;;;; +FC63;ARABIC LIGATURE SHADDA WITH SUPERSCRIPT ALEF ISOLATED FORM;Lo;0;AL;<isolated> 0020 0651 0670;;;;N;;;;; +FC64;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH REH FINAL FORM;Lo;0;AL;<final> 0626 0631;;;;N;;;;; +FC65;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ZAIN FINAL FORM;Lo;0;AL;<final> 0626 0632;;;;N;;;;; +FC66;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM FINAL FORM;Lo;0;AL;<final> 0626 0645;;;;N;;;;; +FC67;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH NOON FINAL FORM;Lo;0;AL;<final> 0626 0646;;;;N;;;;; +FC68;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0626 0649;;;;N;;;;; +FC69;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH FINAL FORM;Lo;0;AL;<final> 0626 064A;;;;N;;;;; +FC6A;ARABIC LIGATURE BEH WITH REH FINAL FORM;Lo;0;AL;<final> 0628 0631;;;;N;;;;; +FC6B;ARABIC LIGATURE BEH WITH ZAIN FINAL FORM;Lo;0;AL;<final> 0628 0632;;;;N;;;;; +FC6C;ARABIC LIGATURE BEH WITH MEEM FINAL FORM;Lo;0;AL;<final> 0628 0645;;;;N;;;;; +FC6D;ARABIC LIGATURE BEH WITH NOON FINAL FORM;Lo;0;AL;<final> 0628 0646;;;;N;;;;; +FC6E;ARABIC LIGATURE BEH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0628 0649;;;;N;;;;; +FC6F;ARABIC LIGATURE BEH WITH YEH FINAL FORM;Lo;0;AL;<final> 0628 064A;;;;N;;;;; +FC70;ARABIC LIGATURE TEH WITH REH FINAL FORM;Lo;0;AL;<final> 062A 0631;;;;N;;;;; +FC71;ARABIC LIGATURE TEH WITH ZAIN FINAL FORM;Lo;0;AL;<final> 062A 0632;;;;N;;;;; +FC72;ARABIC LIGATURE TEH WITH MEEM FINAL FORM;Lo;0;AL;<final> 062A 0645;;;;N;;;;; +FC73;ARABIC LIGATURE TEH WITH NOON FINAL FORM;Lo;0;AL;<final> 062A 0646;;;;N;;;;; +FC74;ARABIC LIGATURE TEH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062A 0649;;;;N;;;;; +FC75;ARABIC LIGATURE TEH WITH YEH FINAL FORM;Lo;0;AL;<final> 062A 064A;;;;N;;;;; +FC76;ARABIC LIGATURE THEH WITH REH FINAL FORM;Lo;0;AL;<final> 062B 0631;;;;N;;;;; +FC77;ARABIC LIGATURE THEH WITH ZAIN FINAL FORM;Lo;0;AL;<final> 062B 0632;;;;N;;;;; +FC78;ARABIC LIGATURE THEH WITH MEEM FINAL FORM;Lo;0;AL;<final> 062B 0645;;;;N;;;;; +FC79;ARABIC LIGATURE THEH WITH NOON FINAL FORM;Lo;0;AL;<final> 062B 0646;;;;N;;;;; +FC7A;ARABIC LIGATURE THEH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062B 0649;;;;N;;;;; +FC7B;ARABIC LIGATURE THEH WITH YEH FINAL FORM;Lo;0;AL;<final> 062B 064A;;;;N;;;;; +FC7C;ARABIC LIGATURE FEH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0641 0649;;;;N;;;;; +FC7D;ARABIC LIGATURE FEH WITH YEH FINAL FORM;Lo;0;AL;<final> 0641 064A;;;;N;;;;; +FC7E;ARABIC LIGATURE QAF WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0642 0649;;;;N;;;;; +FC7F;ARABIC LIGATURE QAF WITH YEH FINAL FORM;Lo;0;AL;<final> 0642 064A;;;;N;;;;; +FC80;ARABIC LIGATURE KAF WITH ALEF FINAL FORM;Lo;0;AL;<final> 0643 0627;;;;N;;;;; +FC81;ARABIC LIGATURE KAF WITH LAM FINAL FORM;Lo;0;AL;<final> 0643 0644;;;;N;;;;; +FC82;ARABIC LIGATURE KAF WITH MEEM FINAL FORM;Lo;0;AL;<final> 0643 0645;;;;N;;;;; +FC83;ARABIC LIGATURE KAF WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0643 0649;;;;N;;;;; +FC84;ARABIC LIGATURE KAF WITH YEH FINAL FORM;Lo;0;AL;<final> 0643 064A;;;;N;;;;; +FC85;ARABIC LIGATURE LAM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0644 0645;;;;N;;;;; +FC86;ARABIC LIGATURE LAM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0644 0649;;;;N;;;;; +FC87;ARABIC LIGATURE LAM WITH YEH FINAL FORM;Lo;0;AL;<final> 0644 064A;;;;N;;;;; +FC88;ARABIC LIGATURE MEEM WITH ALEF FINAL FORM;Lo;0;AL;<final> 0645 0627;;;;N;;;;; +FC89;ARABIC LIGATURE MEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0645 0645;;;;N;;;;; +FC8A;ARABIC LIGATURE NOON WITH REH FINAL FORM;Lo;0;AL;<final> 0646 0631;;;;N;;;;; +FC8B;ARABIC LIGATURE NOON WITH ZAIN FINAL FORM;Lo;0;AL;<final> 0646 0632;;;;N;;;;; +FC8C;ARABIC LIGATURE NOON WITH MEEM FINAL FORM;Lo;0;AL;<final> 0646 0645;;;;N;;;;; +FC8D;ARABIC LIGATURE NOON WITH NOON FINAL FORM;Lo;0;AL;<final> 0646 0646;;;;N;;;;; +FC8E;ARABIC LIGATURE NOON WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0646 0649;;;;N;;;;; +FC8F;ARABIC LIGATURE NOON WITH YEH FINAL FORM;Lo;0;AL;<final> 0646 064A;;;;N;;;;; +FC90;ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF FINAL FORM;Lo;0;AL;<final> 0649 0670;;;;N;;;;; +FC91;ARABIC LIGATURE YEH WITH REH FINAL FORM;Lo;0;AL;<final> 064A 0631;;;;N;;;;; +FC92;ARABIC LIGATURE YEH WITH ZAIN FINAL FORM;Lo;0;AL;<final> 064A 0632;;;;N;;;;; +FC93;ARABIC LIGATURE YEH WITH MEEM FINAL FORM;Lo;0;AL;<final> 064A 0645;;;;N;;;;; +FC94;ARABIC LIGATURE YEH WITH NOON FINAL FORM;Lo;0;AL;<final> 064A 0646;;;;N;;;;; +FC95;ARABIC LIGATURE YEH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 064A 0649;;;;N;;;;; +FC96;ARABIC LIGATURE YEH WITH YEH FINAL FORM;Lo;0;AL;<final> 064A 064A;;;;N;;;;; +FC97;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0626 062C;;;;N;;;;; +FC98;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0626 062D;;;;N;;;;; +FC99;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0626 062E;;;;N;;;;; +FC9A;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0626 0645;;;;N;;;;; +FC9B;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH INITIAL FORM;Lo;0;AL;<initial> 0626 0647;;;;N;;;;; +FC9C;ARABIC LIGATURE BEH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0628 062C;;;;N;;;;; +FC9D;ARABIC LIGATURE BEH WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0628 062D;;;;N;;;;; +FC9E;ARABIC LIGATURE BEH WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0628 062E;;;;N;;;;; +FC9F;ARABIC LIGATURE BEH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0628 0645;;;;N;;;;; +FCA0;ARABIC LIGATURE BEH WITH HEH INITIAL FORM;Lo;0;AL;<initial> 0628 0647;;;;N;;;;; +FCA1;ARABIC LIGATURE TEH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 062A 062C;;;;N;;;;; +FCA2;ARABIC LIGATURE TEH WITH HAH INITIAL FORM;Lo;0;AL;<initial> 062A 062D;;;;N;;;;; +FCA3;ARABIC LIGATURE TEH WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 062A 062E;;;;N;;;;; +FCA4;ARABIC LIGATURE TEH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 062A 0645;;;;N;;;;; +FCA5;ARABIC LIGATURE TEH WITH HEH INITIAL FORM;Lo;0;AL;<initial> 062A 0647;;;;N;;;;; +FCA6;ARABIC LIGATURE THEH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 062B 0645;;;;N;;;;; +FCA7;ARABIC LIGATURE JEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 062C 062D;;;;N;;;;; +FCA8;ARABIC LIGATURE JEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 062C 0645;;;;N;;;;; +FCA9;ARABIC LIGATURE HAH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 062D 062C;;;;N;;;;; +FCAA;ARABIC LIGATURE HAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 062D 0645;;;;N;;;;; +FCAB;ARABIC LIGATURE KHAH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 062E 062C;;;;N;;;;; +FCAC;ARABIC LIGATURE KHAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 062E 0645;;;;N;;;;; +FCAD;ARABIC LIGATURE SEEN WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0633 062C;;;;N;;;;; +FCAE;ARABIC LIGATURE SEEN WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0633 062D;;;;N;;;;; +FCAF;ARABIC LIGATURE SEEN WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0633 062E;;;;N;;;;; +FCB0;ARABIC LIGATURE SEEN WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0633 0645;;;;N;;;;; +FCB1;ARABIC LIGATURE SAD WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0635 062D;;;;N;;;;; +FCB2;ARABIC LIGATURE SAD WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0635 062E;;;;N;;;;; +FCB3;ARABIC LIGATURE SAD WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0635 0645;;;;N;;;;; +FCB4;ARABIC LIGATURE DAD WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0636 062C;;;;N;;;;; +FCB5;ARABIC LIGATURE DAD WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0636 062D;;;;N;;;;; +FCB6;ARABIC LIGATURE DAD WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0636 062E;;;;N;;;;; +FCB7;ARABIC LIGATURE DAD WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0636 0645;;;;N;;;;; +FCB8;ARABIC LIGATURE TAH WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0637 062D;;;;N;;;;; +FCB9;ARABIC LIGATURE ZAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0638 0645;;;;N;;;;; +FCBA;ARABIC LIGATURE AIN WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0639 062C;;;;N;;;;; +FCBB;ARABIC LIGATURE AIN WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0639 0645;;;;N;;;;; +FCBC;ARABIC LIGATURE GHAIN WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 063A 062C;;;;N;;;;; +FCBD;ARABIC LIGATURE GHAIN WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 063A 0645;;;;N;;;;; +FCBE;ARABIC LIGATURE FEH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0641 062C;;;;N;;;;; +FCBF;ARABIC LIGATURE FEH WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0641 062D;;;;N;;;;; +FCC0;ARABIC LIGATURE FEH WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0641 062E;;;;N;;;;; +FCC1;ARABIC LIGATURE FEH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0641 0645;;;;N;;;;; +FCC2;ARABIC LIGATURE QAF WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0642 062D;;;;N;;;;; +FCC3;ARABIC LIGATURE QAF WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0642 0645;;;;N;;;;; +FCC4;ARABIC LIGATURE KAF WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0643 062C;;;;N;;;;; +FCC5;ARABIC LIGATURE KAF WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0643 062D;;;;N;;;;; +FCC6;ARABIC LIGATURE KAF WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0643 062E;;;;N;;;;; +FCC7;ARABIC LIGATURE KAF WITH LAM INITIAL FORM;Lo;0;AL;<initial> 0643 0644;;;;N;;;;; +FCC8;ARABIC LIGATURE KAF WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0643 0645;;;;N;;;;; +FCC9;ARABIC LIGATURE LAM WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0644 062C;;;;N;;;;; +FCCA;ARABIC LIGATURE LAM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0644 062D;;;;N;;;;; +FCCB;ARABIC LIGATURE LAM WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0644 062E;;;;N;;;;; +FCCC;ARABIC LIGATURE LAM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0644 0645;;;;N;;;;; +FCCD;ARABIC LIGATURE LAM WITH HEH INITIAL FORM;Lo;0;AL;<initial> 0644 0647;;;;N;;;;; +FCCE;ARABIC LIGATURE MEEM WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0645 062C;;;;N;;;;; +FCCF;ARABIC LIGATURE MEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0645 062D;;;;N;;;;; +FCD0;ARABIC LIGATURE MEEM WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0645 062E;;;;N;;;;; +FCD1;ARABIC LIGATURE MEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0645 0645;;;;N;;;;; +FCD2;ARABIC LIGATURE NOON WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0646 062C;;;;N;;;;; +FCD3;ARABIC LIGATURE NOON WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0646 062D;;;;N;;;;; +FCD4;ARABIC LIGATURE NOON WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0646 062E;;;;N;;;;; +FCD5;ARABIC LIGATURE NOON WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0646 0645;;;;N;;;;; +FCD6;ARABIC LIGATURE NOON WITH HEH INITIAL FORM;Lo;0;AL;<initial> 0646 0647;;;;N;;;;; +FCD7;ARABIC LIGATURE HEH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0647 062C;;;;N;;;;; +FCD8;ARABIC LIGATURE HEH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0647 0645;;;;N;;;;; +FCD9;ARABIC LIGATURE HEH WITH SUPERSCRIPT ALEF INITIAL FORM;Lo;0;AL;<initial> 0647 0670;;;;N;;;;; +FCDA;ARABIC LIGATURE YEH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 064A 062C;;;;N;;;;; +FCDB;ARABIC LIGATURE YEH WITH HAH INITIAL FORM;Lo;0;AL;<initial> 064A 062D;;;;N;;;;; +FCDC;ARABIC LIGATURE YEH WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 064A 062E;;;;N;;;;; +FCDD;ARABIC LIGATURE YEH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 064A 0645;;;;N;;;;; +FCDE;ARABIC LIGATURE YEH WITH HEH INITIAL FORM;Lo;0;AL;<initial> 064A 0647;;;;N;;;;; +FCDF;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 0626 0645;;;;N;;;;; +FCE0;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH MEDIAL FORM;Lo;0;AL;<medial> 0626 0647;;;;N;;;;; +FCE1;ARABIC LIGATURE BEH WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 0628 0645;;;;N;;;;; +FCE2;ARABIC LIGATURE BEH WITH HEH MEDIAL FORM;Lo;0;AL;<medial> 0628 0647;;;;N;;;;; +FCE3;ARABIC LIGATURE TEH WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 062A 0645;;;;N;;;;; +FCE4;ARABIC LIGATURE TEH WITH HEH MEDIAL FORM;Lo;0;AL;<medial> 062A 0647;;;;N;;;;; +FCE5;ARABIC LIGATURE THEH WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 062B 0645;;;;N;;;;; +FCE6;ARABIC LIGATURE THEH WITH HEH MEDIAL FORM;Lo;0;AL;<medial> 062B 0647;;;;N;;;;; +FCE7;ARABIC LIGATURE SEEN WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 0633 0645;;;;N;;;;; +FCE8;ARABIC LIGATURE SEEN WITH HEH MEDIAL FORM;Lo;0;AL;<medial> 0633 0647;;;;N;;;;; +FCE9;ARABIC LIGATURE SHEEN WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 0634 0645;;;;N;;;;; +FCEA;ARABIC LIGATURE SHEEN WITH HEH MEDIAL FORM;Lo;0;AL;<medial> 0634 0647;;;;N;;;;; +FCEB;ARABIC LIGATURE KAF WITH LAM MEDIAL FORM;Lo;0;AL;<medial> 0643 0644;;;;N;;;;; +FCEC;ARABIC LIGATURE KAF WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 0643 0645;;;;N;;;;; +FCED;ARABIC LIGATURE LAM WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 0644 0645;;;;N;;;;; +FCEE;ARABIC LIGATURE NOON WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 0646 0645;;;;N;;;;; +FCEF;ARABIC LIGATURE NOON WITH HEH MEDIAL FORM;Lo;0;AL;<medial> 0646 0647;;;;N;;;;; +FCF0;ARABIC LIGATURE YEH WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 064A 0645;;;;N;;;;; +FCF1;ARABIC LIGATURE YEH WITH HEH MEDIAL FORM;Lo;0;AL;<medial> 064A 0647;;;;N;;;;; +FCF2;ARABIC LIGATURE SHADDA WITH FATHA MEDIAL FORM;Lo;0;AL;<medial> 0640 064E 0651;;;;N;;;;; +FCF3;ARABIC LIGATURE SHADDA WITH DAMMA MEDIAL FORM;Lo;0;AL;<medial> 0640 064F 0651;;;;N;;;;; +FCF4;ARABIC LIGATURE SHADDA WITH KASRA MEDIAL FORM;Lo;0;AL;<medial> 0640 0650 0651;;;;N;;;;; +FCF5;ARABIC LIGATURE TAH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0637 0649;;;;N;;;;; +FCF6;ARABIC LIGATURE TAH WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0637 064A;;;;N;;;;; +FCF7;ARABIC LIGATURE AIN WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0639 0649;;;;N;;;;; +FCF8;ARABIC LIGATURE AIN WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0639 064A;;;;N;;;;; +FCF9;ARABIC LIGATURE GHAIN WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 063A 0649;;;;N;;;;; +FCFA;ARABIC LIGATURE GHAIN WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 063A 064A;;;;N;;;;; +FCFB;ARABIC LIGATURE SEEN WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0633 0649;;;;N;;;;; +FCFC;ARABIC LIGATURE SEEN WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0633 064A;;;;N;;;;; +FCFD;ARABIC LIGATURE SHEEN WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0634 0649;;;;N;;;;; +FCFE;ARABIC LIGATURE SHEEN WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0634 064A;;;;N;;;;; +FCFF;ARABIC LIGATURE HAH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 062D 0649;;;;N;;;;; +FD00;ARABIC LIGATURE HAH WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 062D 064A;;;;N;;;;; +FD01;ARABIC LIGATURE JEEM WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 062C 0649;;;;N;;;;; +FD02;ARABIC LIGATURE JEEM WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 062C 064A;;;;N;;;;; +FD03;ARABIC LIGATURE KHAH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 062E 0649;;;;N;;;;; +FD04;ARABIC LIGATURE KHAH WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 062E 064A;;;;N;;;;; +FD05;ARABIC LIGATURE SAD WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0635 0649;;;;N;;;;; +FD06;ARABIC LIGATURE SAD WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0635 064A;;;;N;;;;; +FD07;ARABIC LIGATURE DAD WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0636 0649;;;;N;;;;; +FD08;ARABIC LIGATURE DAD WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0636 064A;;;;N;;;;; +FD09;ARABIC LIGATURE SHEEN WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0634 062C;;;;N;;;;; +FD0A;ARABIC LIGATURE SHEEN WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0634 062D;;;;N;;;;; +FD0B;ARABIC LIGATURE SHEEN WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 0634 062E;;;;N;;;;; +FD0C;ARABIC LIGATURE SHEEN WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0634 0645;;;;N;;;;; +FD0D;ARABIC LIGATURE SHEEN WITH REH ISOLATED FORM;Lo;0;AL;<isolated> 0634 0631;;;;N;;;;; +FD0E;ARABIC LIGATURE SEEN WITH REH ISOLATED FORM;Lo;0;AL;<isolated> 0633 0631;;;;N;;;;; +FD0F;ARABIC LIGATURE SAD WITH REH ISOLATED FORM;Lo;0;AL;<isolated> 0635 0631;;;;N;;;;; +FD10;ARABIC LIGATURE DAD WITH REH ISOLATED FORM;Lo;0;AL;<isolated> 0636 0631;;;;N;;;;; +FD11;ARABIC LIGATURE TAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0637 0649;;;;N;;;;; +FD12;ARABIC LIGATURE TAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0637 064A;;;;N;;;;; +FD13;ARABIC LIGATURE AIN WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0639 0649;;;;N;;;;; +FD14;ARABIC LIGATURE AIN WITH YEH FINAL FORM;Lo;0;AL;<final> 0639 064A;;;;N;;;;; +FD15;ARABIC LIGATURE GHAIN WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 063A 0649;;;;N;;;;; +FD16;ARABIC LIGATURE GHAIN WITH YEH FINAL FORM;Lo;0;AL;<final> 063A 064A;;;;N;;;;; +FD17;ARABIC LIGATURE SEEN WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0633 0649;;;;N;;;;; +FD18;ARABIC LIGATURE SEEN WITH YEH FINAL FORM;Lo;0;AL;<final> 0633 064A;;;;N;;;;; +FD19;ARABIC LIGATURE SHEEN WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0634 0649;;;;N;;;;; +FD1A;ARABIC LIGATURE SHEEN WITH YEH FINAL FORM;Lo;0;AL;<final> 0634 064A;;;;N;;;;; +FD1B;ARABIC LIGATURE HAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062D 0649;;;;N;;;;; +FD1C;ARABIC LIGATURE HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 062D 064A;;;;N;;;;; +FD1D;ARABIC LIGATURE JEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062C 0649;;;;N;;;;; +FD1E;ARABIC LIGATURE JEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 062C 064A;;;;N;;;;; +FD1F;ARABIC LIGATURE KHAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062E 0649;;;;N;;;;; +FD20;ARABIC LIGATURE KHAH WITH YEH FINAL FORM;Lo;0;AL;<final> 062E 064A;;;;N;;;;; +FD21;ARABIC LIGATURE SAD WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0635 0649;;;;N;;;;; +FD22;ARABIC LIGATURE SAD WITH YEH FINAL FORM;Lo;0;AL;<final> 0635 064A;;;;N;;;;; +FD23;ARABIC LIGATURE DAD WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0636 0649;;;;N;;;;; +FD24;ARABIC LIGATURE DAD WITH YEH FINAL FORM;Lo;0;AL;<final> 0636 064A;;;;N;;;;; +FD25;ARABIC LIGATURE SHEEN WITH JEEM FINAL FORM;Lo;0;AL;<final> 0634 062C;;;;N;;;;; +FD26;ARABIC LIGATURE SHEEN WITH HAH FINAL FORM;Lo;0;AL;<final> 0634 062D;;;;N;;;;; +FD27;ARABIC LIGATURE SHEEN WITH KHAH FINAL FORM;Lo;0;AL;<final> 0634 062E;;;;N;;;;; +FD28;ARABIC LIGATURE SHEEN WITH MEEM FINAL FORM;Lo;0;AL;<final> 0634 0645;;;;N;;;;; +FD29;ARABIC LIGATURE SHEEN WITH REH FINAL FORM;Lo;0;AL;<final> 0634 0631;;;;N;;;;; +FD2A;ARABIC LIGATURE SEEN WITH REH FINAL FORM;Lo;0;AL;<final> 0633 0631;;;;N;;;;; +FD2B;ARABIC LIGATURE SAD WITH REH FINAL FORM;Lo;0;AL;<final> 0635 0631;;;;N;;;;; +FD2C;ARABIC LIGATURE DAD WITH REH FINAL FORM;Lo;0;AL;<final> 0636 0631;;;;N;;;;; +FD2D;ARABIC LIGATURE SHEEN WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0634 062C;;;;N;;;;; +FD2E;ARABIC LIGATURE SHEEN WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0634 062D;;;;N;;;;; +FD2F;ARABIC LIGATURE SHEEN WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0634 062E;;;;N;;;;; +FD30;ARABIC LIGATURE SHEEN WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0634 0645;;;;N;;;;; +FD31;ARABIC LIGATURE SEEN WITH HEH INITIAL FORM;Lo;0;AL;<initial> 0633 0647;;;;N;;;;; +FD32;ARABIC LIGATURE SHEEN WITH HEH INITIAL FORM;Lo;0;AL;<initial> 0634 0647;;;;N;;;;; +FD33;ARABIC LIGATURE TAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0637 0645;;;;N;;;;; +FD34;ARABIC LIGATURE SEEN WITH JEEM MEDIAL FORM;Lo;0;AL;<medial> 0633 062C;;;;N;;;;; +FD35;ARABIC LIGATURE SEEN WITH HAH MEDIAL FORM;Lo;0;AL;<medial> 0633 062D;;;;N;;;;; +FD36;ARABIC LIGATURE SEEN WITH KHAH MEDIAL FORM;Lo;0;AL;<medial> 0633 062E;;;;N;;;;; +FD37;ARABIC LIGATURE SHEEN WITH JEEM MEDIAL FORM;Lo;0;AL;<medial> 0634 062C;;;;N;;;;; +FD38;ARABIC LIGATURE SHEEN WITH HAH MEDIAL FORM;Lo;0;AL;<medial> 0634 062D;;;;N;;;;; +FD39;ARABIC LIGATURE SHEEN WITH KHAH MEDIAL FORM;Lo;0;AL;<medial> 0634 062E;;;;N;;;;; +FD3A;ARABIC LIGATURE TAH WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 0637 0645;;;;N;;;;; +FD3B;ARABIC LIGATURE ZAH WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 0638 0645;;;;N;;;;; +FD3C;ARABIC LIGATURE ALEF WITH FATHATAN FINAL FORM;Lo;0;AL;<final> 0627 064B;;;;N;;;;; +FD3D;ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM;Lo;0;AL;<isolated> 0627 064B;;;;N;;;;; +FD3E;ORNATE LEFT PARENTHESIS;Pe;0;ON;;;;;N;;;;; +FD3F;ORNATE RIGHT PARENTHESIS;Ps;0;ON;;;;;N;;;;; +FD50;ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 062A 062C 0645;;;;N;;;;; +FD51;ARABIC LIGATURE TEH WITH HAH WITH JEEM FINAL FORM;Lo;0;AL;<final> 062A 062D 062C;;;;N;;;;; +FD52;ARABIC LIGATURE TEH WITH HAH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 062A 062D 062C;;;;N;;;;; +FD53;ARABIC LIGATURE TEH WITH HAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 062A 062D 0645;;;;N;;;;; +FD54;ARABIC LIGATURE TEH WITH KHAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 062A 062E 0645;;;;N;;;;; +FD55;ARABIC LIGATURE TEH WITH MEEM WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 062A 0645 062C;;;;N;;;;; +FD56;ARABIC LIGATURE TEH WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 062A 0645 062D;;;;N;;;;; +FD57;ARABIC LIGATURE TEH WITH MEEM WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 062A 0645 062E;;;;N;;;;; +FD58;ARABIC LIGATURE JEEM WITH MEEM WITH HAH FINAL FORM;Lo;0;AL;<final> 062C 0645 062D;;;;N;;;;; +FD59;ARABIC LIGATURE JEEM WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 062C 0645 062D;;;;N;;;;; +FD5A;ARABIC LIGATURE HAH WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 062D 0645 064A;;;;N;;;;; +FD5B;ARABIC LIGATURE HAH WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062D 0645 0649;;;;N;;;;; +FD5C;ARABIC LIGATURE SEEN WITH HAH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0633 062D 062C;;;;N;;;;; +FD5D;ARABIC LIGATURE SEEN WITH JEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0633 062C 062D;;;;N;;;;; +FD5E;ARABIC LIGATURE SEEN WITH JEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0633 062C 0649;;;;N;;;;; +FD5F;ARABIC LIGATURE SEEN WITH MEEM WITH HAH FINAL FORM;Lo;0;AL;<final> 0633 0645 062D;;;;N;;;;; +FD60;ARABIC LIGATURE SEEN WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0633 0645 062D;;;;N;;;;; +FD61;ARABIC LIGATURE SEEN WITH MEEM WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0633 0645 062C;;;;N;;;;; +FD62;ARABIC LIGATURE SEEN WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0633 0645 0645;;;;N;;;;; +FD63;ARABIC LIGATURE SEEN WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0633 0645 0645;;;;N;;;;; +FD64;ARABIC LIGATURE SAD WITH HAH WITH HAH FINAL FORM;Lo;0;AL;<final> 0635 062D 062D;;;;N;;;;; +FD65;ARABIC LIGATURE SAD WITH HAH WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0635 062D 062D;;;;N;;;;; +FD66;ARABIC LIGATURE SAD WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0635 0645 0645;;;;N;;;;; +FD67;ARABIC LIGATURE SHEEN WITH HAH WITH MEEM FINAL FORM;Lo;0;AL;<final> 0634 062D 0645;;;;N;;;;; +FD68;ARABIC LIGATURE SHEEN WITH HAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0634 062D 0645;;;;N;;;;; +FD69;ARABIC LIGATURE SHEEN WITH JEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0634 062C 064A;;;;N;;;;; +FD6A;ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH FINAL FORM;Lo;0;AL;<final> 0634 0645 062E;;;;N;;;;; +FD6B;ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0634 0645 062E;;;;N;;;;; +FD6C;ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0634 0645 0645;;;;N;;;;; +FD6D;ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0634 0645 0645;;;;N;;;;; +FD6E;ARABIC LIGATURE DAD WITH HAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0636 062D 0649;;;;N;;;;; +FD6F;ARABIC LIGATURE DAD WITH KHAH WITH MEEM FINAL FORM;Lo;0;AL;<final> 0636 062E 0645;;;;N;;;;; +FD70;ARABIC LIGATURE DAD WITH KHAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0636 062E 0645;;;;N;;;;; +FD71;ARABIC LIGATURE TAH WITH MEEM WITH HAH FINAL FORM;Lo;0;AL;<final> 0637 0645 062D;;;;N;;;;; +FD72;ARABIC LIGATURE TAH WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0637 0645 062D;;;;N;;;;; +FD73;ARABIC LIGATURE TAH WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0637 0645 0645;;;;N;;;;; +FD74;ARABIC LIGATURE TAH WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0637 0645 064A;;;;N;;;;; +FD75;ARABIC LIGATURE AIN WITH JEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0639 062C 0645;;;;N;;;;; +FD76;ARABIC LIGATURE AIN WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0639 0645 0645;;;;N;;;;; +FD77;ARABIC LIGATURE AIN WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0639 0645 0645;;;;N;;;;; +FD78;ARABIC LIGATURE AIN WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0639 0645 0649;;;;N;;;;; +FD79;ARABIC LIGATURE GHAIN WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 063A 0645 0645;;;;N;;;;; +FD7A;ARABIC LIGATURE GHAIN WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 063A 0645 064A;;;;N;;;;; +FD7B;ARABIC LIGATURE GHAIN WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 063A 0645 0649;;;;N;;;;; +FD7C;ARABIC LIGATURE FEH WITH KHAH WITH MEEM FINAL FORM;Lo;0;AL;<final> 0641 062E 0645;;;;N;;;;; +FD7D;ARABIC LIGATURE FEH WITH KHAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0641 062E 0645;;;;N;;;;; +FD7E;ARABIC LIGATURE QAF WITH MEEM WITH HAH FINAL FORM;Lo;0;AL;<final> 0642 0645 062D;;;;N;;;;; +FD7F;ARABIC LIGATURE QAF WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0642 0645 0645;;;;N;;;;; +FD80;ARABIC LIGATURE LAM WITH HAH WITH MEEM FINAL FORM;Lo;0;AL;<final> 0644 062D 0645;;;;N;;;;; +FD81;ARABIC LIGATURE LAM WITH HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0644 062D 064A;;;;N;;;;; +FD82;ARABIC LIGATURE LAM WITH HAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0644 062D 0649;;;;N;;;;; +FD83;ARABIC LIGATURE LAM WITH JEEM WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0644 062C 062C;;;;N;;;;; +FD84;ARABIC LIGATURE LAM WITH JEEM WITH JEEM FINAL FORM;Lo;0;AL;<final> 0644 062C 062C;;;;N;;;;; +FD85;ARABIC LIGATURE LAM WITH KHAH WITH MEEM FINAL FORM;Lo;0;AL;<final> 0644 062E 0645;;;;N;;;;; +FD86;ARABIC LIGATURE LAM WITH KHAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0644 062E 0645;;;;N;;;;; +FD87;ARABIC LIGATURE LAM WITH MEEM WITH HAH FINAL FORM;Lo;0;AL;<final> 0644 0645 062D;;;;N;;;;; +FD88;ARABIC LIGATURE LAM WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0644 0645 062D;;;;N;;;;; +FD89;ARABIC LIGATURE MEEM WITH HAH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0645 062D 062C;;;;N;;;;; +FD8A;ARABIC LIGATURE MEEM WITH HAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0645 062D 0645;;;;N;;;;; +FD8B;ARABIC LIGATURE MEEM WITH HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0645 062D 064A;;;;N;;;;; +FD8C;ARABIC LIGATURE MEEM WITH JEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0645 062C 062D;;;;N;;;;; +FD8D;ARABIC LIGATURE MEEM WITH JEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0645 062C 0645;;;;N;;;;; +FD8E;ARABIC LIGATURE MEEM WITH KHAH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0645 062E 062C;;;;N;;;;; +FD8F;ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0645 062E 0645;;;;N;;;;; +FD92;ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0645 062C 062E;;;;N;;;;; +FD93;ARABIC LIGATURE HEH WITH MEEM WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0647 0645 062C;;;;N;;;;; +FD94;ARABIC LIGATURE HEH WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0647 0645 0645;;;;N;;;;; +FD95;ARABIC LIGATURE NOON WITH HAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0646 062D 0645;;;;N;;;;; +FD96;ARABIC LIGATURE NOON WITH HAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0646 062D 0649;;;;N;;;;; +FD97;ARABIC LIGATURE NOON WITH JEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0646 062C 0645;;;;N;;;;; +FD98;ARABIC LIGATURE NOON WITH JEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0646 062C 0645;;;;N;;;;; +FD99;ARABIC LIGATURE NOON WITH JEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0646 062C 0649;;;;N;;;;; +FD9A;ARABIC LIGATURE NOON WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0646 0645 064A;;;;N;;;;; +FD9B;ARABIC LIGATURE NOON WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0646 0645 0649;;;;N;;;;; +FD9C;ARABIC LIGATURE YEH WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 064A 0645 0645;;;;N;;;;; +FD9D;ARABIC LIGATURE YEH WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 064A 0645 0645;;;;N;;;;; +FD9E;ARABIC LIGATURE BEH WITH KHAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0628 062E 064A;;;;N;;;;; +FD9F;ARABIC LIGATURE TEH WITH JEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 062A 062C 064A;;;;N;;;;; +FDA0;ARABIC LIGATURE TEH WITH JEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062A 062C 0649;;;;N;;;;; +FDA1;ARABIC LIGATURE TEH WITH KHAH WITH YEH FINAL FORM;Lo;0;AL;<final> 062A 062E 064A;;;;N;;;;; +FDA2;ARABIC LIGATURE TEH WITH KHAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062A 062E 0649;;;;N;;;;; +FDA3;ARABIC LIGATURE TEH WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 062A 0645 064A;;;;N;;;;; +FDA4;ARABIC LIGATURE TEH WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062A 0645 0649;;;;N;;;;; +FDA5;ARABIC LIGATURE JEEM WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 062C 0645 064A;;;;N;;;;; +FDA6;ARABIC LIGATURE JEEM WITH HAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062C 062D 0649;;;;N;;;;; +FDA7;ARABIC LIGATURE JEEM WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062C 0645 0649;;;;N;;;;; +FDA8;ARABIC LIGATURE SEEN WITH KHAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0633 062E 0649;;;;N;;;;; +FDA9;ARABIC LIGATURE SAD WITH HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0635 062D 064A;;;;N;;;;; +FDAA;ARABIC LIGATURE SHEEN WITH HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0634 062D 064A;;;;N;;;;; +FDAB;ARABIC LIGATURE DAD WITH HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0636 062D 064A;;;;N;;;;; +FDAC;ARABIC LIGATURE LAM WITH JEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0644 062C 064A;;;;N;;;;; +FDAD;ARABIC LIGATURE LAM WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0644 0645 064A;;;;N;;;;; +FDAE;ARABIC LIGATURE YEH WITH HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 064A 062D 064A;;;;N;;;;; +FDAF;ARABIC LIGATURE YEH WITH JEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 064A 062C 064A;;;;N;;;;; +FDB0;ARABIC LIGATURE YEH WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 064A 0645 064A;;;;N;;;;; +FDB1;ARABIC LIGATURE MEEM WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0645 0645 064A;;;;N;;;;; +FDB2;ARABIC LIGATURE QAF WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0642 0645 064A;;;;N;;;;; +FDB3;ARABIC LIGATURE NOON WITH HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0646 062D 064A;;;;N;;;;; +FDB4;ARABIC LIGATURE QAF WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0642 0645 062D;;;;N;;;;; +FDB5;ARABIC LIGATURE LAM WITH HAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0644 062D 0645;;;;N;;;;; +FDB6;ARABIC LIGATURE AIN WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0639 0645 064A;;;;N;;;;; +FDB7;ARABIC LIGATURE KAF WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0643 0645 064A;;;;N;;;;; +FDB8;ARABIC LIGATURE NOON WITH JEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0646 062C 062D;;;;N;;;;; +FDB9;ARABIC LIGATURE MEEM WITH KHAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0645 062E 064A;;;;N;;;;; +FDBA;ARABIC LIGATURE LAM WITH JEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0644 062C 0645;;;;N;;;;; +FDBB;ARABIC LIGATURE KAF WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0643 0645 0645;;;;N;;;;; +FDBC;ARABIC LIGATURE LAM WITH JEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0644 062C 0645;;;;N;;;;; +FDBD;ARABIC LIGATURE NOON WITH JEEM WITH HAH FINAL FORM;Lo;0;AL;<final> 0646 062C 062D;;;;N;;;;; +FDBE;ARABIC LIGATURE JEEM WITH HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 062C 062D 064A;;;;N;;;;; +FDBF;ARABIC LIGATURE HAH WITH JEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 062D 062C 064A;;;;N;;;;; +FDC0;ARABIC LIGATURE MEEM WITH JEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0645 062C 064A;;;;N;;;;; +FDC1;ARABIC LIGATURE FEH WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0641 0645 064A;;;;N;;;;; +FDC2;ARABIC LIGATURE BEH WITH HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0628 062D 064A;;;;N;;;;; +FDC3;ARABIC LIGATURE KAF WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0643 0645 0645;;;;N;;;;; +FDC4;ARABIC LIGATURE AIN WITH JEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0639 062C 0645;;;;N;;;;; +FDC5;ARABIC LIGATURE SAD WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0635 0645 0645;;;;N;;;;; +FDC6;ARABIC LIGATURE SEEN WITH KHAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0633 062E 064A;;;;N;;;;; +FDC7;ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0646 062C 064A;;;;N;;;;; +FDF0;ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM;Lo;0;AL;<isolated> 0635 0644 06D2;;;;N;;;;; +FDF1;ARABIC LIGATURE QALA USED AS KORANIC STOP SIGN ISOLATED FORM;Lo;0;AL;<isolated> 0642 0644 06D2;;;;N;;;;; +FDF2;ARABIC LIGATURE ALLAH ISOLATED FORM;Lo;0;AL;<isolated> 0627 0644 0644 0647;;;;N;;;;; +FDF3;ARABIC LIGATURE AKBAR ISOLATED FORM;Lo;0;AL;<isolated> 0627 0643 0628 0631;;;;N;;;;; +FDF4;ARABIC LIGATURE MOHAMMAD ISOLATED FORM;Lo;0;AL;<isolated> 0645 062D 0645 062F;;;;N;;;;; +FDF5;ARABIC LIGATURE SALAM ISOLATED FORM;Lo;0;AL;<isolated> 0635 0644 0639 0645;;;;N;;;;; +FDF6;ARABIC LIGATURE RASOUL ISOLATED FORM;Lo;0;AL;<isolated> 0631 0633 0648 0644;;;;N;;;;; +FDF7;ARABIC LIGATURE ALAYHE ISOLATED FORM;Lo;0;AL;<isolated> 0639 0644 064A 0647;;;;N;;;;; +FDF8;ARABIC LIGATURE WASALLAM ISOLATED FORM;Lo;0;AL;<isolated> 0648 0633 0644 0645;;;;N;;;;; +FDF9;ARABIC LIGATURE SALLA ISOLATED FORM;Lo;0;AL;<isolated> 0635 0644 0649;;;;N;;;;; +FDFA;ARABIC LIGATURE SALLALLAHOU ALAYHE WASALLAM;Lo;0;AL;<isolated> 0635 0644 0649 0020 0627 0644 0644 0647 0020 0639 0644 064A 0647 0020 0648 0633 0644 0645;;;;N;ARABIC LETTER SALLALLAHOU ALAYHE WASALLAM;;;; +FDFB;ARABIC LIGATURE JALLAJALALOUHOU;Lo;0;AL;<isolated> 062C 0644 0020 062C 0644 0627 0644 0647;;;;N;ARABIC LETTER JALLAJALALOUHOU;;;; +FDFC;RIAL SIGN;Sc;0;AL;<isolated> 0631 06CC 0627 0644;;;;N;;;;; +FDFD;ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM;So;0;ON;;;;;N;;;;; +FE00;VARIATION SELECTOR-1;Mn;0;NSM;;;;;N;;;;; +FE01;VARIATION SELECTOR-2;Mn;0;NSM;;;;;N;;;;; +FE02;VARIATION SELECTOR-3;Mn;0;NSM;;;;;N;;;;; +FE03;VARIATION SELECTOR-4;Mn;0;NSM;;;;;N;;;;; +FE04;VARIATION SELECTOR-5;Mn;0;NSM;;;;;N;;;;; +FE05;VARIATION SELECTOR-6;Mn;0;NSM;;;;;N;;;;; +FE06;VARIATION SELECTOR-7;Mn;0;NSM;;;;;N;;;;; +FE07;VARIATION SELECTOR-8;Mn;0;NSM;;;;;N;;;;; +FE08;VARIATION SELECTOR-9;Mn;0;NSM;;;;;N;;;;; +FE09;VARIATION SELECTOR-10;Mn;0;NSM;;;;;N;;;;; +FE0A;VARIATION SELECTOR-11;Mn;0;NSM;;;;;N;;;;; +FE0B;VARIATION SELECTOR-12;Mn;0;NSM;;;;;N;;;;; +FE0C;VARIATION SELECTOR-13;Mn;0;NSM;;;;;N;;;;; +FE0D;VARIATION SELECTOR-14;Mn;0;NSM;;;;;N;;;;; +FE0E;VARIATION SELECTOR-15;Mn;0;NSM;;;;;N;;;;; +FE0F;VARIATION SELECTOR-16;Mn;0;NSM;;;;;N;;;;; +FE10;PRESENTATION FORM FOR VERTICAL COMMA;Po;0;ON;<vertical> 002C;;;;N;;;;; +FE11;PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC COMMA;Po;0;ON;<vertical> 3001;;;;N;;;;; +FE12;PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC FULL STOP;Po;0;ON;<vertical> 3002;;;;N;;;;; +FE13;PRESENTATION FORM FOR VERTICAL COLON;Po;0;ON;<vertical> 003A;;;;N;;;;; +FE14;PRESENTATION FORM FOR VERTICAL SEMICOLON;Po;0;ON;<vertical> 003B;;;;N;;;;; +FE15;PRESENTATION FORM FOR VERTICAL EXCLAMATION MARK;Po;0;ON;<vertical> 0021;;;;N;;;;; +FE16;PRESENTATION FORM FOR VERTICAL QUESTION MARK;Po;0;ON;<vertical> 003F;;;;N;;;;; +FE17;PRESENTATION FORM FOR VERTICAL LEFT WHITE LENTICULAR BRACKET;Ps;0;ON;<vertical> 3016;;;;N;;;;; +FE18;PRESENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRAKCET;Pe;0;ON;<vertical> 3017;;;;N;;;;; +FE19;PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS;Po;0;ON;<vertical> 2026;;;;N;;;;; +FE20;COMBINING LIGATURE LEFT HALF;Mn;230;NSM;;;;;N;;;;; +FE21;COMBINING LIGATURE RIGHT HALF;Mn;230;NSM;;;;;N;;;;; +FE22;COMBINING DOUBLE TILDE LEFT HALF;Mn;230;NSM;;;;;N;;;;; +FE23;COMBINING DOUBLE TILDE RIGHT HALF;Mn;230;NSM;;;;;N;;;;; +FE24;COMBINING MACRON LEFT HALF;Mn;230;NSM;;;;;N;;;;; +FE25;COMBINING MACRON RIGHT HALF;Mn;230;NSM;;;;;N;;;;; +FE26;COMBINING CONJOINING MACRON;Mn;230;NSM;;;;;N;;;;; +FE27;COMBINING LIGATURE LEFT HALF BELOW;Mn;220;NSM;;;;;N;;;;; +FE28;COMBINING LIGATURE RIGHT HALF BELOW;Mn;220;NSM;;;;;N;;;;; +FE29;COMBINING TILDE LEFT HALF BELOW;Mn;220;NSM;;;;;N;;;;; +FE2A;COMBINING TILDE RIGHT HALF BELOW;Mn;220;NSM;;;;;N;;;;; +FE2B;COMBINING MACRON LEFT HALF BELOW;Mn;220;NSM;;;;;N;;;;; +FE2C;COMBINING MACRON RIGHT HALF BELOW;Mn;220;NSM;;;;;N;;;;; +FE2D;COMBINING CONJOINING MACRON BELOW;Mn;220;NSM;;;;;N;;;;; +FE2E;COMBINING CYRILLIC TITLO LEFT HALF;Mn;230;NSM;;;;;N;;;;; +FE2F;COMBINING CYRILLIC TITLO RIGHT HALF;Mn;230;NSM;;;;;N;;;;; +FE30;PRESENTATION FORM FOR VERTICAL TWO DOT LEADER;Po;0;ON;<vertical> 2025;;;;N;GLYPH FOR VERTICAL TWO DOT LEADER;;;; +FE31;PRESENTATION FORM FOR VERTICAL EM DASH;Pd;0;ON;<vertical> 2014;;;;N;GLYPH FOR VERTICAL EM DASH;;;; +FE32;PRESENTATION FORM FOR VERTICAL EN DASH;Pd;0;ON;<vertical> 2013;;;;N;GLYPH FOR VERTICAL EN DASH;;;; +FE33;PRESENTATION FORM FOR VERTICAL LOW LINE;Pc;0;ON;<vertical> 005F;;;;N;GLYPH FOR VERTICAL SPACING UNDERSCORE;;;; +FE34;PRESENTATION FORM FOR VERTICAL WAVY LOW LINE;Pc;0;ON;<vertical> 005F;;;;N;GLYPH FOR VERTICAL SPACING WAVY UNDERSCORE;;;; +FE35;PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS;Ps;0;ON;<vertical> 0028;;;;N;GLYPH FOR VERTICAL OPENING PARENTHESIS;;;; +FE36;PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS;Pe;0;ON;<vertical> 0029;;;;N;GLYPH FOR VERTICAL CLOSING PARENTHESIS;;;; +FE37;PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET;Ps;0;ON;<vertical> 007B;;;;N;GLYPH FOR VERTICAL OPENING CURLY BRACKET;;;; +FE38;PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET;Pe;0;ON;<vertical> 007D;;;;N;GLYPH FOR VERTICAL CLOSING CURLY BRACKET;;;; +FE39;PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET;Ps;0;ON;<vertical> 3014;;;;N;GLYPH FOR VERTICAL OPENING TORTOISE SHELL BRACKET;;;; +FE3A;PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET;Pe;0;ON;<vertical> 3015;;;;N;GLYPH FOR VERTICAL CLOSING TORTOISE SHELL BRACKET;;;; +FE3B;PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET;Ps;0;ON;<vertical> 3010;;;;N;GLYPH FOR VERTICAL OPENING BLACK LENTICULAR BRACKET;;;; +FE3C;PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET;Pe;0;ON;<vertical> 3011;;;;N;GLYPH FOR VERTICAL CLOSING BLACK LENTICULAR BRACKET;;;; +FE3D;PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET;Ps;0;ON;<vertical> 300A;;;;N;GLYPH FOR VERTICAL OPENING DOUBLE ANGLE BRACKET;;;; +FE3E;PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET;Pe;0;ON;<vertical> 300B;;;;N;GLYPH FOR VERTICAL CLOSING DOUBLE ANGLE BRACKET;;;; +FE3F;PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET;Ps;0;ON;<vertical> 3008;;;;N;GLYPH FOR VERTICAL OPENING ANGLE BRACKET;;;; +FE40;PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET;Pe;0;ON;<vertical> 3009;;;;N;GLYPH FOR VERTICAL CLOSING ANGLE BRACKET;;;; +FE41;PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET;Ps;0;ON;<vertical> 300C;;;;N;GLYPH FOR VERTICAL OPENING CORNER BRACKET;;;; +FE42;PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET;Pe;0;ON;<vertical> 300D;;;;N;GLYPH FOR VERTICAL CLOSING CORNER BRACKET;;;; +FE43;PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET;Ps;0;ON;<vertical> 300E;;;;N;GLYPH FOR VERTICAL OPENING WHITE CORNER BRACKET;;;; +FE44;PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET;Pe;0;ON;<vertical> 300F;;;;N;GLYPH FOR VERTICAL CLOSING WHITE CORNER BRACKET;;;; +FE45;SESAME DOT;Po;0;ON;;;;;N;;;;; +FE46;WHITE SESAME DOT;Po;0;ON;;;;;N;;;;; +FE47;PRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKET;Ps;0;ON;<vertical> 005B;;;;N;;;;; +FE48;PRESENTATION FORM FOR VERTICAL RIGHT SQUARE BRACKET;Pe;0;ON;<vertical> 005D;;;;N;;;;; +FE49;DASHED OVERLINE;Po;0;ON;<compat> 203E;;;;N;SPACING DASHED OVERSCORE;;;; +FE4A;CENTRELINE OVERLINE;Po;0;ON;<compat> 203E;;;;N;SPACING CENTERLINE OVERSCORE;;;; +FE4B;WAVY OVERLINE;Po;0;ON;<compat> 203E;;;;N;SPACING WAVY OVERSCORE;;;; +FE4C;DOUBLE WAVY OVERLINE;Po;0;ON;<compat> 203E;;;;N;SPACING DOUBLE WAVY OVERSCORE;;;; +FE4D;DASHED LOW LINE;Pc;0;ON;<compat> 005F;;;;N;SPACING DASHED UNDERSCORE;;;; +FE4E;CENTRELINE LOW LINE;Pc;0;ON;<compat> 005F;;;;N;SPACING CENTERLINE UNDERSCORE;;;; +FE4F;WAVY LOW LINE;Pc;0;ON;<compat> 005F;;;;N;SPACING WAVY UNDERSCORE;;;; +FE50;SMALL COMMA;Po;0;CS;<small> 002C;;;;N;;;;; +FE51;SMALL IDEOGRAPHIC COMMA;Po;0;ON;<small> 3001;;;;N;;;;; +FE52;SMALL FULL STOP;Po;0;CS;<small> 002E;;;;N;SMALL PERIOD;;;; +FE54;SMALL SEMICOLON;Po;0;ON;<small> 003B;;;;N;;;;; +FE55;SMALL COLON;Po;0;CS;<small> 003A;;;;N;;;;; +FE56;SMALL QUESTION MARK;Po;0;ON;<small> 003F;;;;N;;;;; +FE57;SMALL EXCLAMATION MARK;Po;0;ON;<small> 0021;;;;N;;;;; +FE58;SMALL EM DASH;Pd;0;ON;<small> 2014;;;;N;;;;; +FE59;SMALL LEFT PARENTHESIS;Ps;0;ON;<small> 0028;;;;Y;SMALL OPENING PARENTHESIS;;;; +FE5A;SMALL RIGHT PARENTHESIS;Pe;0;ON;<small> 0029;;;;Y;SMALL CLOSING PARENTHESIS;;;; +FE5B;SMALL LEFT CURLY BRACKET;Ps;0;ON;<small> 007B;;;;Y;SMALL OPENING CURLY BRACKET;;;; +FE5C;SMALL RIGHT CURLY BRACKET;Pe;0;ON;<small> 007D;;;;Y;SMALL CLOSING CURLY BRACKET;;;; +FE5D;SMALL LEFT TORTOISE SHELL BRACKET;Ps;0;ON;<small> 3014;;;;Y;SMALL OPENING TORTOISE SHELL BRACKET;;;; +FE5E;SMALL RIGHT TORTOISE SHELL BRACKET;Pe;0;ON;<small> 3015;;;;Y;SMALL CLOSING TORTOISE SHELL BRACKET;;;; +FE5F;SMALL NUMBER SIGN;Po;0;ET;<small> 0023;;;;N;;;;; +FE60;SMALL AMPERSAND;Po;0;ON;<small> 0026;;;;N;;;;; +FE61;SMALL ASTERISK;Po;0;ON;<small> 002A;;;;N;;;;; +FE62;SMALL PLUS SIGN;Sm;0;ES;<small> 002B;;;;N;;;;; +FE63;SMALL HYPHEN-MINUS;Pd;0;ES;<small> 002D;;;;N;;;;; +FE64;SMALL LESS-THAN SIGN;Sm;0;ON;<small> 003C;;;;Y;;;;; +FE65;SMALL GREATER-THAN SIGN;Sm;0;ON;<small> 003E;;;;Y;;;;; +FE66;SMALL EQUALS SIGN;Sm;0;ON;<small> 003D;;;;N;;;;; +FE68;SMALL REVERSE SOLIDUS;Po;0;ON;<small> 005C;;;;N;SMALL BACKSLASH;;;; +FE69;SMALL DOLLAR SIGN;Sc;0;ET;<small> 0024;;;;N;;;;; +FE6A;SMALL PERCENT SIGN;Po;0;ET;<small> 0025;;;;N;;;;; +FE6B;SMALL COMMERCIAL AT;Po;0;ON;<small> 0040;;;;N;;;;; +FE70;ARABIC FATHATAN ISOLATED FORM;Lo;0;AL;<isolated> 0020 064B;;;;N;ARABIC SPACING FATHATAN;;;; +FE71;ARABIC TATWEEL WITH FATHATAN ABOVE;Lo;0;AL;<medial> 0640 064B;;;;N;ARABIC FATHATAN ON TATWEEL;;;; +FE72;ARABIC DAMMATAN ISOLATED FORM;Lo;0;AL;<isolated> 0020 064C;;;;N;ARABIC SPACING DAMMATAN;;;; +FE73;ARABIC TAIL FRAGMENT;Lo;0;AL;;;;;N;;;;; +FE74;ARABIC KASRATAN ISOLATED FORM;Lo;0;AL;<isolated> 0020 064D;;;;N;ARABIC SPACING KASRATAN;;;; +FE76;ARABIC FATHA ISOLATED FORM;Lo;0;AL;<isolated> 0020 064E;;;;N;ARABIC SPACING FATHAH;;;; +FE77;ARABIC FATHA MEDIAL FORM;Lo;0;AL;<medial> 0640 064E;;;;N;ARABIC FATHAH ON TATWEEL;;;; +FE78;ARABIC DAMMA ISOLATED FORM;Lo;0;AL;<isolated> 0020 064F;;;;N;ARABIC SPACING DAMMAH;;;; +FE79;ARABIC DAMMA MEDIAL FORM;Lo;0;AL;<medial> 0640 064F;;;;N;ARABIC DAMMAH ON TATWEEL;;;; +FE7A;ARABIC KASRA ISOLATED FORM;Lo;0;AL;<isolated> 0020 0650;;;;N;ARABIC SPACING KASRAH;;;; +FE7B;ARABIC KASRA MEDIAL FORM;Lo;0;AL;<medial> 0640 0650;;;;N;ARABIC KASRAH ON TATWEEL;;;; +FE7C;ARABIC SHADDA ISOLATED FORM;Lo;0;AL;<isolated> 0020 0651;;;;N;ARABIC SPACING SHADDAH;;;; +FE7D;ARABIC SHADDA MEDIAL FORM;Lo;0;AL;<medial> 0640 0651;;;;N;ARABIC SHADDAH ON TATWEEL;;;; +FE7E;ARABIC SUKUN ISOLATED FORM;Lo;0;AL;<isolated> 0020 0652;;;;N;ARABIC SPACING SUKUN;;;; +FE7F;ARABIC SUKUN MEDIAL FORM;Lo;0;AL;<medial> 0640 0652;;;;N;ARABIC SUKUN ON TATWEEL;;;; +FE80;ARABIC LETTER HAMZA ISOLATED FORM;Lo;0;AL;<isolated> 0621;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH;;;; +FE81;ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM;Lo;0;AL;<isolated> 0622;;;;N;GLYPH FOR ISOLATE ARABIC MADDAH ON ALEF;;;; +FE82;ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM;Lo;0;AL;<final> 0622;;;;N;GLYPH FOR FINAL ARABIC MADDAH ON ALEF;;;; +FE83;ARABIC LETTER ALEF WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL;<isolated> 0623;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH ON ALEF;;;; +FE84;ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM;Lo;0;AL;<final> 0623;;;;N;GLYPH FOR FINAL ARABIC HAMZAH ON ALEF;;;; +FE85;ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL;<isolated> 0624;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH ON WAW;;;; +FE86;ARABIC LETTER WAW WITH HAMZA ABOVE FINAL FORM;Lo;0;AL;<final> 0624;;;;N;GLYPH FOR FINAL ARABIC HAMZAH ON WAW;;;; +FE87;ARABIC LETTER ALEF WITH HAMZA BELOW ISOLATED FORM;Lo;0;AL;<isolated> 0625;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH UNDER ALEF;;;; +FE88;ARABIC LETTER ALEF WITH HAMZA BELOW FINAL FORM;Lo;0;AL;<final> 0625;;;;N;GLYPH FOR FINAL ARABIC HAMZAH UNDER ALEF;;;; +FE89;ARABIC LETTER YEH WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL;<isolated> 0626;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH ON YA;;;; +FE8A;ARABIC LETTER YEH WITH HAMZA ABOVE FINAL FORM;Lo;0;AL;<final> 0626;;;;N;GLYPH FOR FINAL ARABIC HAMZAH ON YA;;;; +FE8B;ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM;Lo;0;AL;<initial> 0626;;;;N;GLYPH FOR INITIAL ARABIC HAMZAH ON YA;;;; +FE8C;ARABIC LETTER YEH WITH HAMZA ABOVE MEDIAL FORM;Lo;0;AL;<medial> 0626;;;;N;GLYPH FOR MEDIAL ARABIC HAMZAH ON YA;;;; +FE8D;ARABIC LETTER ALEF ISOLATED FORM;Lo;0;AL;<isolated> 0627;;;;N;GLYPH FOR ISOLATE ARABIC ALEF;;;; +FE8E;ARABIC LETTER ALEF FINAL FORM;Lo;0;AL;<final> 0627;;;;N;GLYPH FOR FINAL ARABIC ALEF;;;; +FE8F;ARABIC LETTER BEH ISOLATED FORM;Lo;0;AL;<isolated> 0628;;;;N;GLYPH FOR ISOLATE ARABIC BAA;;;; +FE90;ARABIC LETTER BEH FINAL FORM;Lo;0;AL;<final> 0628;;;;N;GLYPH FOR FINAL ARABIC BAA;;;; +FE91;ARABIC LETTER BEH INITIAL FORM;Lo;0;AL;<initial> 0628;;;;N;GLYPH FOR INITIAL ARABIC BAA;;;; +FE92;ARABIC LETTER BEH MEDIAL FORM;Lo;0;AL;<medial> 0628;;;;N;GLYPH FOR MEDIAL ARABIC BAA;;;; +FE93;ARABIC LETTER TEH MARBUTA ISOLATED FORM;Lo;0;AL;<isolated> 0629;;;;N;GLYPH FOR ISOLATE ARABIC TAA MARBUTAH;;;; +FE94;ARABIC LETTER TEH MARBUTA FINAL FORM;Lo;0;AL;<final> 0629;;;;N;GLYPH FOR FINAL ARABIC TAA MARBUTAH;;;; +FE95;ARABIC LETTER TEH ISOLATED FORM;Lo;0;AL;<isolated> 062A;;;;N;GLYPH FOR ISOLATE ARABIC TAA;;;; +FE96;ARABIC LETTER TEH FINAL FORM;Lo;0;AL;<final> 062A;;;;N;GLYPH FOR FINAL ARABIC TAA;;;; +FE97;ARABIC LETTER TEH INITIAL FORM;Lo;0;AL;<initial> 062A;;;;N;GLYPH FOR INITIAL ARABIC TAA;;;; +FE98;ARABIC LETTER TEH MEDIAL FORM;Lo;0;AL;<medial> 062A;;;;N;GLYPH FOR MEDIAL ARABIC TAA;;;; +FE99;ARABIC LETTER THEH ISOLATED FORM;Lo;0;AL;<isolated> 062B;;;;N;GLYPH FOR ISOLATE ARABIC THAA;;;; +FE9A;ARABIC LETTER THEH FINAL FORM;Lo;0;AL;<final> 062B;;;;N;GLYPH FOR FINAL ARABIC THAA;;;; +FE9B;ARABIC LETTER THEH INITIAL FORM;Lo;0;AL;<initial> 062B;;;;N;GLYPH FOR INITIAL ARABIC THAA;;;; +FE9C;ARABIC LETTER THEH MEDIAL FORM;Lo;0;AL;<medial> 062B;;;;N;GLYPH FOR MEDIAL ARABIC THAA;;;; +FE9D;ARABIC LETTER JEEM ISOLATED FORM;Lo;0;AL;<isolated> 062C;;;;N;GLYPH FOR ISOLATE ARABIC JEEM;;;; +FE9E;ARABIC LETTER JEEM FINAL FORM;Lo;0;AL;<final> 062C;;;;N;GLYPH FOR FINAL ARABIC JEEM;;;; +FE9F;ARABIC LETTER JEEM INITIAL FORM;Lo;0;AL;<initial> 062C;;;;N;GLYPH FOR INITIAL ARABIC JEEM;;;; +FEA0;ARABIC LETTER JEEM MEDIAL FORM;Lo;0;AL;<medial> 062C;;;;N;GLYPH FOR MEDIAL ARABIC JEEM;;;; +FEA1;ARABIC LETTER HAH ISOLATED FORM;Lo;0;AL;<isolated> 062D;;;;N;GLYPH FOR ISOLATE ARABIC HAA;;;; +FEA2;ARABIC LETTER HAH FINAL FORM;Lo;0;AL;<final> 062D;;;;N;GLYPH FOR FINAL ARABIC HAA;;;; +FEA3;ARABIC LETTER HAH INITIAL FORM;Lo;0;AL;<initial> 062D;;;;N;GLYPH FOR INITIAL ARABIC HAA;;;; +FEA4;ARABIC LETTER HAH MEDIAL FORM;Lo;0;AL;<medial> 062D;;;;N;GLYPH FOR MEDIAL ARABIC HAA;;;; +FEA5;ARABIC LETTER KHAH ISOLATED FORM;Lo;0;AL;<isolated> 062E;;;;N;GLYPH FOR ISOLATE ARABIC KHAA;;;; +FEA6;ARABIC LETTER KHAH FINAL FORM;Lo;0;AL;<final> 062E;;;;N;GLYPH FOR FINAL ARABIC KHAA;;;; +FEA7;ARABIC LETTER KHAH INITIAL FORM;Lo;0;AL;<initial> 062E;;;;N;GLYPH FOR INITIAL ARABIC KHAA;;;; +FEA8;ARABIC LETTER KHAH MEDIAL FORM;Lo;0;AL;<medial> 062E;;;;N;GLYPH FOR MEDIAL ARABIC KHAA;;;; +FEA9;ARABIC LETTER DAL ISOLATED FORM;Lo;0;AL;<isolated> 062F;;;;N;GLYPH FOR ISOLATE ARABIC DAL;;;; +FEAA;ARABIC LETTER DAL FINAL FORM;Lo;0;AL;<final> 062F;;;;N;GLYPH FOR FINAL ARABIC DAL;;;; +FEAB;ARABIC LETTER THAL ISOLATED FORM;Lo;0;AL;<isolated> 0630;;;;N;GLYPH FOR ISOLATE ARABIC THAL;;;; +FEAC;ARABIC LETTER THAL FINAL FORM;Lo;0;AL;<final> 0630;;;;N;GLYPH FOR FINAL ARABIC THAL;;;; +FEAD;ARABIC LETTER REH ISOLATED FORM;Lo;0;AL;<isolated> 0631;;;;N;GLYPH FOR ISOLATE ARABIC RA;;;; +FEAE;ARABIC LETTER REH FINAL FORM;Lo;0;AL;<final> 0631;;;;N;GLYPH FOR FINAL ARABIC RA;;;; +FEAF;ARABIC LETTER ZAIN ISOLATED FORM;Lo;0;AL;<isolated> 0632;;;;N;GLYPH FOR ISOLATE ARABIC ZAIN;;;; +FEB0;ARABIC LETTER ZAIN FINAL FORM;Lo;0;AL;<final> 0632;;;;N;GLYPH FOR FINAL ARABIC ZAIN;;;; +FEB1;ARABIC LETTER SEEN ISOLATED FORM;Lo;0;AL;<isolated> 0633;;;;N;GLYPH FOR ISOLATE ARABIC SEEN;;;; +FEB2;ARABIC LETTER SEEN FINAL FORM;Lo;0;AL;<final> 0633;;;;N;GLYPH FOR FINAL ARABIC SEEN;;;; +FEB3;ARABIC LETTER SEEN INITIAL FORM;Lo;0;AL;<initial> 0633;;;;N;GLYPH FOR INITIAL ARABIC SEEN;;;; +FEB4;ARABIC LETTER SEEN MEDIAL FORM;Lo;0;AL;<medial> 0633;;;;N;GLYPH FOR MEDIAL ARABIC SEEN;;;; +FEB5;ARABIC LETTER SHEEN ISOLATED FORM;Lo;0;AL;<isolated> 0634;;;;N;GLYPH FOR ISOLATE ARABIC SHEEN;;;; +FEB6;ARABIC LETTER SHEEN FINAL FORM;Lo;0;AL;<final> 0634;;;;N;GLYPH FOR FINAL ARABIC SHEEN;;;; +FEB7;ARABIC LETTER SHEEN INITIAL FORM;Lo;0;AL;<initial> 0634;;;;N;GLYPH FOR INITIAL ARABIC SHEEN;;;; +FEB8;ARABIC LETTER SHEEN MEDIAL FORM;Lo;0;AL;<medial> 0634;;;;N;GLYPH FOR MEDIAL ARABIC SHEEN;;;; +FEB9;ARABIC LETTER SAD ISOLATED FORM;Lo;0;AL;<isolated> 0635;;;;N;GLYPH FOR ISOLATE ARABIC SAD;;;; +FEBA;ARABIC LETTER SAD FINAL FORM;Lo;0;AL;<final> 0635;;;;N;GLYPH FOR FINAL ARABIC SAD;;;; +FEBB;ARABIC LETTER SAD INITIAL FORM;Lo;0;AL;<initial> 0635;;;;N;GLYPH FOR INITIAL ARABIC SAD;;;; +FEBC;ARABIC LETTER SAD MEDIAL FORM;Lo;0;AL;<medial> 0635;;;;N;GLYPH FOR MEDIAL ARABIC SAD;;;; +FEBD;ARABIC LETTER DAD ISOLATED FORM;Lo;0;AL;<isolated> 0636;;;;N;GLYPH FOR ISOLATE ARABIC DAD;;;; +FEBE;ARABIC LETTER DAD FINAL FORM;Lo;0;AL;<final> 0636;;;;N;GLYPH FOR FINAL ARABIC DAD;;;; +FEBF;ARABIC LETTER DAD INITIAL FORM;Lo;0;AL;<initial> 0636;;;;N;GLYPH FOR INITIAL ARABIC DAD;;;; +FEC0;ARABIC LETTER DAD MEDIAL FORM;Lo;0;AL;<medial> 0636;;;;N;GLYPH FOR MEDIAL ARABIC DAD;;;; +FEC1;ARABIC LETTER TAH ISOLATED FORM;Lo;0;AL;<isolated> 0637;;;;N;GLYPH FOR ISOLATE ARABIC TAH;;;; +FEC2;ARABIC LETTER TAH FINAL FORM;Lo;0;AL;<final> 0637;;;;N;GLYPH FOR FINAL ARABIC TAH;;;; +FEC3;ARABIC LETTER TAH INITIAL FORM;Lo;0;AL;<initial> 0637;;;;N;GLYPH FOR INITIAL ARABIC TAH;;;; +FEC4;ARABIC LETTER TAH MEDIAL FORM;Lo;0;AL;<medial> 0637;;;;N;GLYPH FOR MEDIAL ARABIC TAH;;;; +FEC5;ARABIC LETTER ZAH ISOLATED FORM;Lo;0;AL;<isolated> 0638;;;;N;GLYPH FOR ISOLATE ARABIC DHAH;;;; +FEC6;ARABIC LETTER ZAH FINAL FORM;Lo;0;AL;<final> 0638;;;;N;GLYPH FOR FINAL ARABIC DHAH;;;; +FEC7;ARABIC LETTER ZAH INITIAL FORM;Lo;0;AL;<initial> 0638;;;;N;GLYPH FOR INITIAL ARABIC DHAH;;;; +FEC8;ARABIC LETTER ZAH MEDIAL FORM;Lo;0;AL;<medial> 0638;;;;N;GLYPH FOR MEDIAL ARABIC DHAH;;;; +FEC9;ARABIC LETTER AIN ISOLATED FORM;Lo;0;AL;<isolated> 0639;;;;N;GLYPH FOR ISOLATE ARABIC AIN;;;; +FECA;ARABIC LETTER AIN FINAL FORM;Lo;0;AL;<final> 0639;;;;N;GLYPH FOR FINAL ARABIC AIN;;;; +FECB;ARABIC LETTER AIN INITIAL FORM;Lo;0;AL;<initial> 0639;;;;N;GLYPH FOR INITIAL ARABIC AIN;;;; +FECC;ARABIC LETTER AIN MEDIAL FORM;Lo;0;AL;<medial> 0639;;;;N;GLYPH FOR MEDIAL ARABIC AIN;;;; +FECD;ARABIC LETTER GHAIN ISOLATED FORM;Lo;0;AL;<isolated> 063A;;;;N;GLYPH FOR ISOLATE ARABIC GHAIN;;;; +FECE;ARABIC LETTER GHAIN FINAL FORM;Lo;0;AL;<final> 063A;;;;N;GLYPH FOR FINAL ARABIC GHAIN;;;; +FECF;ARABIC LETTER GHAIN INITIAL FORM;Lo;0;AL;<initial> 063A;;;;N;GLYPH FOR INITIAL ARABIC GHAIN;;;; +FED0;ARABIC LETTER GHAIN MEDIAL FORM;Lo;0;AL;<medial> 063A;;;;N;GLYPH FOR MEDIAL ARABIC GHAIN;;;; +FED1;ARABIC LETTER FEH ISOLATED FORM;Lo;0;AL;<isolated> 0641;;;;N;GLYPH FOR ISOLATE ARABIC FA;;;; +FED2;ARABIC LETTER FEH FINAL FORM;Lo;0;AL;<final> 0641;;;;N;GLYPH FOR FINAL ARABIC FA;;;; +FED3;ARABIC LETTER FEH INITIAL FORM;Lo;0;AL;<initial> 0641;;;;N;GLYPH FOR INITIAL ARABIC FA;;;; +FED4;ARABIC LETTER FEH MEDIAL FORM;Lo;0;AL;<medial> 0641;;;;N;GLYPH FOR MEDIAL ARABIC FA;;;; +FED5;ARABIC LETTER QAF ISOLATED FORM;Lo;0;AL;<isolated> 0642;;;;N;GLYPH FOR ISOLATE ARABIC QAF;;;; +FED6;ARABIC LETTER QAF FINAL FORM;Lo;0;AL;<final> 0642;;;;N;GLYPH FOR FINAL ARABIC QAF;;;; +FED7;ARABIC LETTER QAF INITIAL FORM;Lo;0;AL;<initial> 0642;;;;N;GLYPH FOR INITIAL ARABIC QAF;;;; +FED8;ARABIC LETTER QAF MEDIAL FORM;Lo;0;AL;<medial> 0642;;;;N;GLYPH FOR MEDIAL ARABIC QAF;;;; +FED9;ARABIC LETTER KAF ISOLATED FORM;Lo;0;AL;<isolated> 0643;;;;N;GLYPH FOR ISOLATE ARABIC CAF;;;; +FEDA;ARABIC LETTER KAF FINAL FORM;Lo;0;AL;<final> 0643;;;;N;GLYPH FOR FINAL ARABIC CAF;;;; +FEDB;ARABIC LETTER KAF INITIAL FORM;Lo;0;AL;<initial> 0643;;;;N;GLYPH FOR INITIAL ARABIC CAF;;;; +FEDC;ARABIC LETTER KAF MEDIAL FORM;Lo;0;AL;<medial> 0643;;;;N;GLYPH FOR MEDIAL ARABIC CAF;;;; +FEDD;ARABIC LETTER LAM ISOLATED FORM;Lo;0;AL;<isolated> 0644;;;;N;GLYPH FOR ISOLATE ARABIC LAM;;;; +FEDE;ARABIC LETTER LAM FINAL FORM;Lo;0;AL;<final> 0644;;;;N;GLYPH FOR FINAL ARABIC LAM;;;; +FEDF;ARABIC LETTER LAM INITIAL FORM;Lo;0;AL;<initial> 0644;;;;N;GLYPH FOR INITIAL ARABIC LAM;;;; +FEE0;ARABIC LETTER LAM MEDIAL FORM;Lo;0;AL;<medial> 0644;;;;N;GLYPH FOR MEDIAL ARABIC LAM;;;; +FEE1;ARABIC LETTER MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0645;;;;N;GLYPH FOR ISOLATE ARABIC MEEM;;;; +FEE2;ARABIC LETTER MEEM FINAL FORM;Lo;0;AL;<final> 0645;;;;N;GLYPH FOR FINAL ARABIC MEEM;;;; +FEE3;ARABIC LETTER MEEM INITIAL FORM;Lo;0;AL;<initial> 0645;;;;N;GLYPH FOR INITIAL ARABIC MEEM;;;; +FEE4;ARABIC LETTER MEEM MEDIAL FORM;Lo;0;AL;<medial> 0645;;;;N;GLYPH FOR MEDIAL ARABIC MEEM;;;; +FEE5;ARABIC LETTER NOON ISOLATED FORM;Lo;0;AL;<isolated> 0646;;;;N;GLYPH FOR ISOLATE ARABIC NOON;;;; +FEE6;ARABIC LETTER NOON FINAL FORM;Lo;0;AL;<final> 0646;;;;N;GLYPH FOR FINAL ARABIC NOON;;;; +FEE7;ARABIC LETTER NOON INITIAL FORM;Lo;0;AL;<initial> 0646;;;;N;GLYPH FOR INITIAL ARABIC NOON;;;; +FEE8;ARABIC LETTER NOON MEDIAL FORM;Lo;0;AL;<medial> 0646;;;;N;GLYPH FOR MEDIAL ARABIC NOON;;;; +FEE9;ARABIC LETTER HEH ISOLATED FORM;Lo;0;AL;<isolated> 0647;;;;N;GLYPH FOR ISOLATE ARABIC HA;;;; +FEEA;ARABIC LETTER HEH FINAL FORM;Lo;0;AL;<final> 0647;;;;N;GLYPH FOR FINAL ARABIC HA;;;; +FEEB;ARABIC LETTER HEH INITIAL FORM;Lo;0;AL;<initial> 0647;;;;N;GLYPH FOR INITIAL ARABIC HA;;;; +FEEC;ARABIC LETTER HEH MEDIAL FORM;Lo;0;AL;<medial> 0647;;;;N;GLYPH FOR MEDIAL ARABIC HA;;;; +FEED;ARABIC LETTER WAW ISOLATED FORM;Lo;0;AL;<isolated> 0648;;;;N;GLYPH FOR ISOLATE ARABIC WAW;;;; +FEEE;ARABIC LETTER WAW FINAL FORM;Lo;0;AL;<final> 0648;;;;N;GLYPH FOR FINAL ARABIC WAW;;;; +FEEF;ARABIC LETTER ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0649;;;;N;GLYPH FOR ISOLATE ARABIC ALEF MAQSURAH;;;; +FEF0;ARABIC LETTER ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0649;;;;N;GLYPH FOR FINAL ARABIC ALEF MAQSURAH;;;; +FEF1;ARABIC LETTER YEH ISOLATED FORM;Lo;0;AL;<isolated> 064A;;;;N;GLYPH FOR ISOLATE ARABIC YA;;;; +FEF2;ARABIC LETTER YEH FINAL FORM;Lo;0;AL;<final> 064A;;;;N;GLYPH FOR FINAL ARABIC YA;;;; +FEF3;ARABIC LETTER YEH INITIAL FORM;Lo;0;AL;<initial> 064A;;;;N;GLYPH FOR INITIAL ARABIC YA;;;; +FEF4;ARABIC LETTER YEH MEDIAL FORM;Lo;0;AL;<medial> 064A;;;;N;GLYPH FOR MEDIAL ARABIC YA;;;; +FEF5;ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM;Lo;0;AL;<isolated> 0644 0622;;;;N;GLYPH FOR ISOLATE ARABIC MADDAH ON LIGATURE LAM ALEF;;;; +FEF6;ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM;Lo;0;AL;<final> 0644 0622;;;;N;GLYPH FOR FINAL ARABIC MADDAH ON LIGATURE LAM ALEF;;;; +FEF7;ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL;<isolated> 0644 0623;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH ON LIGATURE LAM ALEF;;;; +FEF8;ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM;Lo;0;AL;<final> 0644 0623;;;;N;GLYPH FOR FINAL ARABIC HAMZAH ON LIGATURE LAM ALEF;;;; +FEF9;ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW ISOLATED FORM;Lo;0;AL;<isolated> 0644 0625;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH UNDER LIGATURE LAM ALEF;;;; +FEFA;ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW FINAL FORM;Lo;0;AL;<final> 0644 0625;;;;N;GLYPH FOR FINAL ARABIC HAMZAH UNDER LIGATURE LAM ALEF;;;; +FEFB;ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM;Lo;0;AL;<isolated> 0644 0627;;;;N;GLYPH FOR ISOLATE ARABIC LIGATURE LAM ALEF;;;; +FEFC;ARABIC LIGATURE LAM WITH ALEF FINAL FORM;Lo;0;AL;<final> 0644 0627;;;;N;GLYPH FOR FINAL ARABIC LIGATURE LAM ALEF;;;; +FEFF;ZERO WIDTH NO-BREAK SPACE;Cf;0;BN;;;;;N;BYTE ORDER MARK;;;; +FF01;FULLWIDTH EXCLAMATION MARK;Po;0;ON;<wide> 0021;;;;N;;;;; +FF02;FULLWIDTH QUOTATION MARK;Po;0;ON;<wide> 0022;;;;N;;;;; +FF03;FULLWIDTH NUMBER SIGN;Po;0;ET;<wide> 0023;;;;N;;;;; +FF04;FULLWIDTH DOLLAR SIGN;Sc;0;ET;<wide> 0024;;;;N;;;;; +FF05;FULLWIDTH PERCENT SIGN;Po;0;ET;<wide> 0025;;;;N;;;;; +FF06;FULLWIDTH AMPERSAND;Po;0;ON;<wide> 0026;;;;N;;;;; +FF07;FULLWIDTH APOSTROPHE;Po;0;ON;<wide> 0027;;;;N;;;;; +FF08;FULLWIDTH LEFT PARENTHESIS;Ps;0;ON;<wide> 0028;;;;Y;FULLWIDTH OPENING PARENTHESIS;;;; +FF09;FULLWIDTH RIGHT PARENTHESIS;Pe;0;ON;<wide> 0029;;;;Y;FULLWIDTH CLOSING PARENTHESIS;;;; +FF0A;FULLWIDTH ASTERISK;Po;0;ON;<wide> 002A;;;;N;;;;; +FF0B;FULLWIDTH PLUS SIGN;Sm;0;ES;<wide> 002B;;;;N;;;;; +FF0C;FULLWIDTH COMMA;Po;0;CS;<wide> 002C;;;;N;;;;; +FF0D;FULLWIDTH HYPHEN-MINUS;Pd;0;ES;<wide> 002D;;;;N;;;;; +FF0E;FULLWIDTH FULL STOP;Po;0;CS;<wide> 002E;;;;N;FULLWIDTH PERIOD;;;; +FF0F;FULLWIDTH SOLIDUS;Po;0;CS;<wide> 002F;;;;N;FULLWIDTH SLASH;;;; +FF10;FULLWIDTH DIGIT ZERO;Nd;0;EN;<wide> 0030;0;0;0;N;;;;; +FF11;FULLWIDTH DIGIT ONE;Nd;0;EN;<wide> 0031;1;1;1;N;;;;; +FF12;FULLWIDTH DIGIT TWO;Nd;0;EN;<wide> 0032;2;2;2;N;;;;; +FF13;FULLWIDTH DIGIT THREE;Nd;0;EN;<wide> 0033;3;3;3;N;;;;; +FF14;FULLWIDTH DIGIT FOUR;Nd;0;EN;<wide> 0034;4;4;4;N;;;;; +FF15;FULLWIDTH DIGIT FIVE;Nd;0;EN;<wide> 0035;5;5;5;N;;;;; +FF16;FULLWIDTH DIGIT SIX;Nd;0;EN;<wide> 0036;6;6;6;N;;;;; +FF17;FULLWIDTH DIGIT SEVEN;Nd;0;EN;<wide> 0037;7;7;7;N;;;;; +FF18;FULLWIDTH DIGIT EIGHT;Nd;0;EN;<wide> 0038;8;8;8;N;;;;; +FF19;FULLWIDTH DIGIT NINE;Nd;0;EN;<wide> 0039;9;9;9;N;;;;; +FF1A;FULLWIDTH COLON;Po;0;CS;<wide> 003A;;;;N;;;;; +FF1B;FULLWIDTH SEMICOLON;Po;0;ON;<wide> 003B;;;;N;;;;; +FF1C;FULLWIDTH LESS-THAN SIGN;Sm;0;ON;<wide> 003C;;;;Y;;;;; +FF1D;FULLWIDTH EQUALS SIGN;Sm;0;ON;<wide> 003D;;;;N;;;;; +FF1E;FULLWIDTH GREATER-THAN SIGN;Sm;0;ON;<wide> 003E;;;;Y;;;;; +FF1F;FULLWIDTH QUESTION MARK;Po;0;ON;<wide> 003F;;;;N;;;;; +FF20;FULLWIDTH COMMERCIAL AT;Po;0;ON;<wide> 0040;;;;N;;;;; +FF21;FULLWIDTH LATIN CAPITAL LETTER A;Lu;0;L;<wide> 0041;;;;N;;;;FF41; +FF22;FULLWIDTH LATIN CAPITAL LETTER B;Lu;0;L;<wide> 0042;;;;N;;;;FF42; +FF23;FULLWIDTH LATIN CAPITAL LETTER C;Lu;0;L;<wide> 0043;;;;N;;;;FF43; +FF24;FULLWIDTH LATIN CAPITAL LETTER D;Lu;0;L;<wide> 0044;;;;N;;;;FF44; +FF25;FULLWIDTH LATIN CAPITAL LETTER E;Lu;0;L;<wide> 0045;;;;N;;;;FF45; +FF26;FULLWIDTH LATIN CAPITAL LETTER F;Lu;0;L;<wide> 0046;;;;N;;;;FF46; +FF27;FULLWIDTH LATIN CAPITAL LETTER G;Lu;0;L;<wide> 0047;;;;N;;;;FF47; +FF28;FULLWIDTH LATIN CAPITAL LETTER H;Lu;0;L;<wide> 0048;;;;N;;;;FF48; +FF29;FULLWIDTH LATIN CAPITAL LETTER I;Lu;0;L;<wide> 0049;;;;N;;;;FF49; +FF2A;FULLWIDTH LATIN CAPITAL LETTER J;Lu;0;L;<wide> 004A;;;;N;;;;FF4A; +FF2B;FULLWIDTH LATIN CAPITAL LETTER K;Lu;0;L;<wide> 004B;;;;N;;;;FF4B; +FF2C;FULLWIDTH LATIN CAPITAL LETTER L;Lu;0;L;<wide> 004C;;;;N;;;;FF4C; +FF2D;FULLWIDTH LATIN CAPITAL LETTER M;Lu;0;L;<wide> 004D;;;;N;;;;FF4D; +FF2E;FULLWIDTH LATIN CAPITAL LETTER N;Lu;0;L;<wide> 004E;;;;N;;;;FF4E; +FF2F;FULLWIDTH LATIN CAPITAL LETTER O;Lu;0;L;<wide> 004F;;;;N;;;;FF4F; +FF30;FULLWIDTH LATIN CAPITAL LETTER P;Lu;0;L;<wide> 0050;;;;N;;;;FF50; +FF31;FULLWIDTH LATIN CAPITAL LETTER Q;Lu;0;L;<wide> 0051;;;;N;;;;FF51; +FF32;FULLWIDTH LATIN CAPITAL LETTER R;Lu;0;L;<wide> 0052;;;;N;;;;FF52; +FF33;FULLWIDTH LATIN CAPITAL LETTER S;Lu;0;L;<wide> 0053;;;;N;;;;FF53; +FF34;FULLWIDTH LATIN CAPITAL LETTER T;Lu;0;L;<wide> 0054;;;;N;;;;FF54; +FF35;FULLWIDTH LATIN CAPITAL LETTER U;Lu;0;L;<wide> 0055;;;;N;;;;FF55; +FF36;FULLWIDTH LATIN CAPITAL LETTER V;Lu;0;L;<wide> 0056;;;;N;;;;FF56; +FF37;FULLWIDTH LATIN CAPITAL LETTER W;Lu;0;L;<wide> 0057;;;;N;;;;FF57; +FF38;FULLWIDTH LATIN CAPITAL LETTER X;Lu;0;L;<wide> 0058;;;;N;;;;FF58; +FF39;FULLWIDTH LATIN CAPITAL LETTER Y;Lu;0;L;<wide> 0059;;;;N;;;;FF59; +FF3A;FULLWIDTH LATIN CAPITAL LETTER Z;Lu;0;L;<wide> 005A;;;;N;;;;FF5A; +FF3B;FULLWIDTH LEFT SQUARE BRACKET;Ps;0;ON;<wide> 005B;;;;Y;FULLWIDTH OPENING SQUARE BRACKET;;;; +FF3C;FULLWIDTH REVERSE SOLIDUS;Po;0;ON;<wide> 005C;;;;N;FULLWIDTH BACKSLASH;;;; +FF3D;FULLWIDTH RIGHT SQUARE BRACKET;Pe;0;ON;<wide> 005D;;;;Y;FULLWIDTH CLOSING SQUARE BRACKET;;;; +FF3E;FULLWIDTH CIRCUMFLEX ACCENT;Sk;0;ON;<wide> 005E;;;;N;FULLWIDTH SPACING CIRCUMFLEX;;;; +FF3F;FULLWIDTH LOW LINE;Pc;0;ON;<wide> 005F;;;;N;FULLWIDTH SPACING UNDERSCORE;;;; +FF40;FULLWIDTH GRAVE ACCENT;Sk;0;ON;<wide> 0060;;;;N;FULLWIDTH SPACING GRAVE;;;; +FF41;FULLWIDTH LATIN SMALL LETTER A;Ll;0;L;<wide> 0061;;;;N;;;FF21;;FF21 +FF42;FULLWIDTH LATIN SMALL LETTER B;Ll;0;L;<wide> 0062;;;;N;;;FF22;;FF22 +FF43;FULLWIDTH LATIN SMALL LETTER C;Ll;0;L;<wide> 0063;;;;N;;;FF23;;FF23 +FF44;FULLWIDTH LATIN SMALL LETTER D;Ll;0;L;<wide> 0064;;;;N;;;FF24;;FF24 +FF45;FULLWIDTH LATIN SMALL LETTER E;Ll;0;L;<wide> 0065;;;;N;;;FF25;;FF25 +FF46;FULLWIDTH LATIN SMALL LETTER F;Ll;0;L;<wide> 0066;;;;N;;;FF26;;FF26 +FF47;FULLWIDTH LATIN SMALL LETTER G;Ll;0;L;<wide> 0067;;;;N;;;FF27;;FF27 +FF48;FULLWIDTH LATIN SMALL LETTER H;Ll;0;L;<wide> 0068;;;;N;;;FF28;;FF28 +FF49;FULLWIDTH LATIN SMALL LETTER I;Ll;0;L;<wide> 0069;;;;N;;;FF29;;FF29 +FF4A;FULLWIDTH LATIN SMALL LETTER J;Ll;0;L;<wide> 006A;;;;N;;;FF2A;;FF2A +FF4B;FULLWIDTH LATIN SMALL LETTER K;Ll;0;L;<wide> 006B;;;;N;;;FF2B;;FF2B +FF4C;FULLWIDTH LATIN SMALL LETTER L;Ll;0;L;<wide> 006C;;;;N;;;FF2C;;FF2C +FF4D;FULLWIDTH LATIN SMALL LETTER M;Ll;0;L;<wide> 006D;;;;N;;;FF2D;;FF2D +FF4E;FULLWIDTH LATIN SMALL LETTER N;Ll;0;L;<wide> 006E;;;;N;;;FF2E;;FF2E +FF4F;FULLWIDTH LATIN SMALL LETTER O;Ll;0;L;<wide> 006F;;;;N;;;FF2F;;FF2F +FF50;FULLWIDTH LATIN SMALL LETTER P;Ll;0;L;<wide> 0070;;;;N;;;FF30;;FF30 +FF51;FULLWIDTH LATIN SMALL LETTER Q;Ll;0;L;<wide> 0071;;;;N;;;FF31;;FF31 +FF52;FULLWIDTH LATIN SMALL LETTER R;Ll;0;L;<wide> 0072;;;;N;;;FF32;;FF32 +FF53;FULLWIDTH LATIN SMALL LETTER S;Ll;0;L;<wide> 0073;;;;N;;;FF33;;FF33 +FF54;FULLWIDTH LATIN SMALL LETTER T;Ll;0;L;<wide> 0074;;;;N;;;FF34;;FF34 +FF55;FULLWIDTH LATIN SMALL LETTER U;Ll;0;L;<wide> 0075;;;;N;;;FF35;;FF35 +FF56;FULLWIDTH LATIN SMALL LETTER V;Ll;0;L;<wide> 0076;;;;N;;;FF36;;FF36 +FF57;FULLWIDTH LATIN SMALL LETTER W;Ll;0;L;<wide> 0077;;;;N;;;FF37;;FF37 +FF58;FULLWIDTH LATIN SMALL LETTER X;Ll;0;L;<wide> 0078;;;;N;;;FF38;;FF38 +FF59;FULLWIDTH LATIN SMALL LETTER Y;Ll;0;L;<wide> 0079;;;;N;;;FF39;;FF39 +FF5A;FULLWIDTH LATIN SMALL LETTER Z;Ll;0;L;<wide> 007A;;;;N;;;FF3A;;FF3A +FF5B;FULLWIDTH LEFT CURLY BRACKET;Ps;0;ON;<wide> 007B;;;;Y;FULLWIDTH OPENING CURLY BRACKET;;;; +FF5C;FULLWIDTH VERTICAL LINE;Sm;0;ON;<wide> 007C;;;;N;FULLWIDTH VERTICAL BAR;;;; +FF5D;FULLWIDTH RIGHT CURLY BRACKET;Pe;0;ON;<wide> 007D;;;;Y;FULLWIDTH CLOSING CURLY BRACKET;;;; +FF5E;FULLWIDTH TILDE;Sm;0;ON;<wide> 007E;;;;N;FULLWIDTH SPACING TILDE;;;; +FF5F;FULLWIDTH LEFT WHITE PARENTHESIS;Ps;0;ON;<wide> 2985;;;;Y;;;;; +FF60;FULLWIDTH RIGHT WHITE PARENTHESIS;Pe;0;ON;<wide> 2986;;;;Y;;;;; +FF61;HALFWIDTH IDEOGRAPHIC FULL STOP;Po;0;ON;<narrow> 3002;;;;N;HALFWIDTH IDEOGRAPHIC PERIOD;;;; +FF62;HALFWIDTH LEFT CORNER BRACKET;Ps;0;ON;<narrow> 300C;;;;Y;HALFWIDTH OPENING CORNER BRACKET;;;; +FF63;HALFWIDTH RIGHT CORNER BRACKET;Pe;0;ON;<narrow> 300D;;;;Y;HALFWIDTH CLOSING CORNER BRACKET;;;; +FF64;HALFWIDTH IDEOGRAPHIC COMMA;Po;0;ON;<narrow> 3001;;;;N;;;;; +FF65;HALFWIDTH KATAKANA MIDDLE DOT;Po;0;ON;<narrow> 30FB;;;;N;;;;; +FF66;HALFWIDTH KATAKANA LETTER WO;Lo;0;L;<narrow> 30F2;;;;N;;;;; +FF67;HALFWIDTH KATAKANA LETTER SMALL A;Lo;0;L;<narrow> 30A1;;;;N;;;;; +FF68;HALFWIDTH KATAKANA LETTER SMALL I;Lo;0;L;<narrow> 30A3;;;;N;;;;; +FF69;HALFWIDTH KATAKANA LETTER SMALL U;Lo;0;L;<narrow> 30A5;;;;N;;;;; +FF6A;HALFWIDTH KATAKANA LETTER SMALL E;Lo;0;L;<narrow> 30A7;;;;N;;;;; +FF6B;HALFWIDTH KATAKANA LETTER SMALL O;Lo;0;L;<narrow> 30A9;;;;N;;;;; +FF6C;HALFWIDTH KATAKANA LETTER SMALL YA;Lo;0;L;<narrow> 30E3;;;;N;;;;; +FF6D;HALFWIDTH KATAKANA LETTER SMALL YU;Lo;0;L;<narrow> 30E5;;;;N;;;;; +FF6E;HALFWIDTH KATAKANA LETTER SMALL YO;Lo;0;L;<narrow> 30E7;;;;N;;;;; +FF6F;HALFWIDTH KATAKANA LETTER SMALL TU;Lo;0;L;<narrow> 30C3;;;;N;;;;; +FF70;HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK;Lm;0;L;<narrow> 30FC;;;;N;;;;; +FF71;HALFWIDTH KATAKANA LETTER A;Lo;0;L;<narrow> 30A2;;;;N;;;;; +FF72;HALFWIDTH KATAKANA LETTER I;Lo;0;L;<narrow> 30A4;;;;N;;;;; +FF73;HALFWIDTH KATAKANA LETTER U;Lo;0;L;<narrow> 30A6;;;;N;;;;; +FF74;HALFWIDTH KATAKANA LETTER E;Lo;0;L;<narrow> 30A8;;;;N;;;;; +FF75;HALFWIDTH KATAKANA LETTER O;Lo;0;L;<narrow> 30AA;;;;N;;;;; +FF76;HALFWIDTH KATAKANA LETTER KA;Lo;0;L;<narrow> 30AB;;;;N;;;;; +FF77;HALFWIDTH KATAKANA LETTER KI;Lo;0;L;<narrow> 30AD;;;;N;;;;; +FF78;HALFWIDTH KATAKANA LETTER KU;Lo;0;L;<narrow> 30AF;;;;N;;;;; +FF79;HALFWIDTH KATAKANA LETTER KE;Lo;0;L;<narrow> 30B1;;;;N;;;;; +FF7A;HALFWIDTH KATAKANA LETTER KO;Lo;0;L;<narrow> 30B3;;;;N;;;;; +FF7B;HALFWIDTH KATAKANA LETTER SA;Lo;0;L;<narrow> 30B5;;;;N;;;;; +FF7C;HALFWIDTH KATAKANA LETTER SI;Lo;0;L;<narrow> 30B7;;;;N;;;;; +FF7D;HALFWIDTH KATAKANA LETTER SU;Lo;0;L;<narrow> 30B9;;;;N;;;;; +FF7E;HALFWIDTH KATAKANA LETTER SE;Lo;0;L;<narrow> 30BB;;;;N;;;;; +FF7F;HALFWIDTH KATAKANA LETTER SO;Lo;0;L;<narrow> 30BD;;;;N;;;;; +FF80;HALFWIDTH KATAKANA LETTER TA;Lo;0;L;<narrow> 30BF;;;;N;;;;; +FF81;HALFWIDTH KATAKANA LETTER TI;Lo;0;L;<narrow> 30C1;;;;N;;;;; +FF82;HALFWIDTH KATAKANA LETTER TU;Lo;0;L;<narrow> 30C4;;;;N;;;;; +FF83;HALFWIDTH KATAKANA LETTER TE;Lo;0;L;<narrow> 30C6;;;;N;;;;; +FF84;HALFWIDTH KATAKANA LETTER TO;Lo;0;L;<narrow> 30C8;;;;N;;;;; +FF85;HALFWIDTH KATAKANA LETTER NA;Lo;0;L;<narrow> 30CA;;;;N;;;;; +FF86;HALFWIDTH KATAKANA LETTER NI;Lo;0;L;<narrow> 30CB;;;;N;;;;; +FF87;HALFWIDTH KATAKANA LETTER NU;Lo;0;L;<narrow> 30CC;;;;N;;;;; +FF88;HALFWIDTH KATAKANA LETTER NE;Lo;0;L;<narrow> 30CD;;;;N;;;;; +FF89;HALFWIDTH KATAKANA LETTER NO;Lo;0;L;<narrow> 30CE;;;;N;;;;; +FF8A;HALFWIDTH KATAKANA LETTER HA;Lo;0;L;<narrow> 30CF;;;;N;;;;; +FF8B;HALFWIDTH KATAKANA LETTER HI;Lo;0;L;<narrow> 30D2;;;;N;;;;; +FF8C;HALFWIDTH KATAKANA LETTER HU;Lo;0;L;<narrow> 30D5;;;;N;;;;; +FF8D;HALFWIDTH KATAKANA LETTER HE;Lo;0;L;<narrow> 30D8;;;;N;;;;; +FF8E;HALFWIDTH KATAKANA LETTER HO;Lo;0;L;<narrow> 30DB;;;;N;;;;; +FF8F;HALFWIDTH KATAKANA LETTER MA;Lo;0;L;<narrow> 30DE;;;;N;;;;; +FF90;HALFWIDTH KATAKANA LETTER MI;Lo;0;L;<narrow> 30DF;;;;N;;;;; +FF91;HALFWIDTH KATAKANA LETTER MU;Lo;0;L;<narrow> 30E0;;;;N;;;;; +FF92;HALFWIDTH KATAKANA LETTER ME;Lo;0;L;<narrow> 30E1;;;;N;;;;; +FF93;HALFWIDTH KATAKANA LETTER MO;Lo;0;L;<narrow> 30E2;;;;N;;;;; +FF94;HALFWIDTH KATAKANA LETTER YA;Lo;0;L;<narrow> 30E4;;;;N;;;;; +FF95;HALFWIDTH KATAKANA LETTER YU;Lo;0;L;<narrow> 30E6;;;;N;;;;; +FF96;HALFWIDTH KATAKANA LETTER YO;Lo;0;L;<narrow> 30E8;;;;N;;;;; +FF97;HALFWIDTH KATAKANA LETTER RA;Lo;0;L;<narrow> 30E9;;;;N;;;;; +FF98;HALFWIDTH KATAKANA LETTER RI;Lo;0;L;<narrow> 30EA;;;;N;;;;; +FF99;HALFWIDTH KATAKANA LETTER RU;Lo;0;L;<narrow> 30EB;;;;N;;;;; +FF9A;HALFWIDTH KATAKANA LETTER RE;Lo;0;L;<narrow> 30EC;;;;N;;;;; +FF9B;HALFWIDTH KATAKANA LETTER RO;Lo;0;L;<narrow> 30ED;;;;N;;;;; +FF9C;HALFWIDTH KATAKANA LETTER WA;Lo;0;L;<narrow> 30EF;;;;N;;;;; +FF9D;HALFWIDTH KATAKANA LETTER N;Lo;0;L;<narrow> 30F3;;;;N;;;;; +FF9E;HALFWIDTH KATAKANA VOICED SOUND MARK;Lm;0;L;<narrow> 3099;;;;N;;;;; +FF9F;HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK;Lm;0;L;<narrow> 309A;;;;N;;;;; +FFA0;HALFWIDTH HANGUL FILLER;Lo;0;L;<narrow> 3164;;;;N;HALFWIDTH HANGUL CAE OM;;;; +FFA1;HALFWIDTH HANGUL LETTER KIYEOK;Lo;0;L;<narrow> 3131;;;;N;HALFWIDTH HANGUL LETTER GIYEOG;;;; +FFA2;HALFWIDTH HANGUL LETTER SSANGKIYEOK;Lo;0;L;<narrow> 3132;;;;N;HALFWIDTH HANGUL LETTER SSANG GIYEOG;;;; +FFA3;HALFWIDTH HANGUL LETTER KIYEOK-SIOS;Lo;0;L;<narrow> 3133;;;;N;HALFWIDTH HANGUL LETTER GIYEOG SIOS;;;; +FFA4;HALFWIDTH HANGUL LETTER NIEUN;Lo;0;L;<narrow> 3134;;;;N;;;;; +FFA5;HALFWIDTH HANGUL LETTER NIEUN-CIEUC;Lo;0;L;<narrow> 3135;;;;N;HALFWIDTH HANGUL LETTER NIEUN JIEUJ;;;; +FFA6;HALFWIDTH HANGUL LETTER NIEUN-HIEUH;Lo;0;L;<narrow> 3136;;;;N;HALFWIDTH HANGUL LETTER NIEUN HIEUH;;;; +FFA7;HALFWIDTH HANGUL LETTER TIKEUT;Lo;0;L;<narrow> 3137;;;;N;HALFWIDTH HANGUL LETTER DIGEUD;;;; +FFA8;HALFWIDTH HANGUL LETTER SSANGTIKEUT;Lo;0;L;<narrow> 3138;;;;N;HALFWIDTH HANGUL LETTER SSANG DIGEUD;;;; +FFA9;HALFWIDTH HANGUL LETTER RIEUL;Lo;0;L;<narrow> 3139;;;;N;HALFWIDTH HANGUL LETTER LIEUL;;;; +FFAA;HALFWIDTH HANGUL LETTER RIEUL-KIYEOK;Lo;0;L;<narrow> 313A;;;;N;HALFWIDTH HANGUL LETTER LIEUL GIYEOG;;;; +FFAB;HALFWIDTH HANGUL LETTER RIEUL-MIEUM;Lo;0;L;<narrow> 313B;;;;N;HALFWIDTH HANGUL LETTER LIEUL MIEUM;;;; +FFAC;HALFWIDTH HANGUL LETTER RIEUL-PIEUP;Lo;0;L;<narrow> 313C;;;;N;HALFWIDTH HANGUL LETTER LIEUL BIEUB;;;; +FFAD;HALFWIDTH HANGUL LETTER RIEUL-SIOS;Lo;0;L;<narrow> 313D;;;;N;HALFWIDTH HANGUL LETTER LIEUL SIOS;;;; +FFAE;HALFWIDTH HANGUL LETTER RIEUL-THIEUTH;Lo;0;L;<narrow> 313E;;;;N;HALFWIDTH HANGUL LETTER LIEUL TIEUT;;;; +FFAF;HALFWIDTH HANGUL LETTER RIEUL-PHIEUPH;Lo;0;L;<narrow> 313F;;;;N;HALFWIDTH HANGUL LETTER LIEUL PIEUP;;;; +FFB0;HALFWIDTH HANGUL LETTER RIEUL-HIEUH;Lo;0;L;<narrow> 3140;;;;N;HALFWIDTH HANGUL LETTER LIEUL HIEUH;;;; +FFB1;HALFWIDTH HANGUL LETTER MIEUM;Lo;0;L;<narrow> 3141;;;;N;;;;; +FFB2;HALFWIDTH HANGUL LETTER PIEUP;Lo;0;L;<narrow> 3142;;;;N;HALFWIDTH HANGUL LETTER BIEUB;;;; +FFB3;HALFWIDTH HANGUL LETTER SSANGPIEUP;Lo;0;L;<narrow> 3143;;;;N;HALFWIDTH HANGUL LETTER SSANG BIEUB;;;; +FFB4;HALFWIDTH HANGUL LETTER PIEUP-SIOS;Lo;0;L;<narrow> 3144;;;;N;HALFWIDTH HANGUL LETTER BIEUB SIOS;;;; +FFB5;HALFWIDTH HANGUL LETTER SIOS;Lo;0;L;<narrow> 3145;;;;N;;;;; +FFB6;HALFWIDTH HANGUL LETTER SSANGSIOS;Lo;0;L;<narrow> 3146;;;;N;HALFWIDTH HANGUL LETTER SSANG SIOS;;;; +FFB7;HALFWIDTH HANGUL LETTER IEUNG;Lo;0;L;<narrow> 3147;;;;N;;;;; +FFB8;HALFWIDTH HANGUL LETTER CIEUC;Lo;0;L;<narrow> 3148;;;;N;HALFWIDTH HANGUL LETTER JIEUJ;;;; +FFB9;HALFWIDTH HANGUL LETTER SSANGCIEUC;Lo;0;L;<narrow> 3149;;;;N;HALFWIDTH HANGUL LETTER SSANG JIEUJ;;;; +FFBA;HALFWIDTH HANGUL LETTER CHIEUCH;Lo;0;L;<narrow> 314A;;;;N;HALFWIDTH HANGUL LETTER CIEUC;;;; +FFBB;HALFWIDTH HANGUL LETTER KHIEUKH;Lo;0;L;<narrow> 314B;;;;N;HALFWIDTH HANGUL LETTER KIYEOK;;;; +FFBC;HALFWIDTH HANGUL LETTER THIEUTH;Lo;0;L;<narrow> 314C;;;;N;HALFWIDTH HANGUL LETTER TIEUT;;;; +FFBD;HALFWIDTH HANGUL LETTER PHIEUPH;Lo;0;L;<narrow> 314D;;;;N;HALFWIDTH HANGUL LETTER PIEUP;;;; +FFBE;HALFWIDTH HANGUL LETTER HIEUH;Lo;0;L;<narrow> 314E;;;;N;;;;; +FFC2;HALFWIDTH HANGUL LETTER A;Lo;0;L;<narrow> 314F;;;;N;;;;; +FFC3;HALFWIDTH HANGUL LETTER AE;Lo;0;L;<narrow> 3150;;;;N;;;;; +FFC4;HALFWIDTH HANGUL LETTER YA;Lo;0;L;<narrow> 3151;;;;N;;;;; +FFC5;HALFWIDTH HANGUL LETTER YAE;Lo;0;L;<narrow> 3152;;;;N;;;;; +FFC6;HALFWIDTH HANGUL LETTER EO;Lo;0;L;<narrow> 3153;;;;N;;;;; +FFC7;HALFWIDTH HANGUL LETTER E;Lo;0;L;<narrow> 3154;;;;N;;;;; +FFCA;HALFWIDTH HANGUL LETTER YEO;Lo;0;L;<narrow> 3155;;;;N;;;;; +FFCB;HALFWIDTH HANGUL LETTER YE;Lo;0;L;<narrow> 3156;;;;N;;;;; +FFCC;HALFWIDTH HANGUL LETTER O;Lo;0;L;<narrow> 3157;;;;N;;;;; +FFCD;HALFWIDTH HANGUL LETTER WA;Lo;0;L;<narrow> 3158;;;;N;;;;; +FFCE;HALFWIDTH HANGUL LETTER WAE;Lo;0;L;<narrow> 3159;;;;N;;;;; +FFCF;HALFWIDTH HANGUL LETTER OE;Lo;0;L;<narrow> 315A;;;;N;;;;; +FFD2;HALFWIDTH HANGUL LETTER YO;Lo;0;L;<narrow> 315B;;;;N;;;;; +FFD3;HALFWIDTH HANGUL LETTER U;Lo;0;L;<narrow> 315C;;;;N;;;;; +FFD4;HALFWIDTH HANGUL LETTER WEO;Lo;0;L;<narrow> 315D;;;;N;;;;; +FFD5;HALFWIDTH HANGUL LETTER WE;Lo;0;L;<narrow> 315E;;;;N;;;;; +FFD6;HALFWIDTH HANGUL LETTER WI;Lo;0;L;<narrow> 315F;;;;N;;;;; +FFD7;HALFWIDTH HANGUL LETTER YU;Lo;0;L;<narrow> 3160;;;;N;;;;; +FFDA;HALFWIDTH HANGUL LETTER EU;Lo;0;L;<narrow> 3161;;;;N;;;;; +FFDB;HALFWIDTH HANGUL LETTER YI;Lo;0;L;<narrow> 3162;;;;N;;;;; +FFDC;HALFWIDTH HANGUL LETTER I;Lo;0;L;<narrow> 3163;;;;N;;;;; +FFE0;FULLWIDTH CENT SIGN;Sc;0;ET;<wide> 00A2;;;;N;;;;; +FFE1;FULLWIDTH POUND SIGN;Sc;0;ET;<wide> 00A3;;;;N;;;;; +FFE2;FULLWIDTH NOT SIGN;Sm;0;ON;<wide> 00AC;;;;N;;;;; +FFE3;FULLWIDTH MACRON;Sk;0;ON;<wide> 00AF;;;;N;FULLWIDTH SPACING MACRON;;;; +FFE4;FULLWIDTH BROKEN BAR;So;0;ON;<wide> 00A6;;;;N;FULLWIDTH BROKEN VERTICAL BAR;;;; +FFE5;FULLWIDTH YEN SIGN;Sc;0;ET;<wide> 00A5;;;;N;;;;; +FFE6;FULLWIDTH WON SIGN;Sc;0;ET;<wide> 20A9;;;;N;;;;; +FFE8;HALFWIDTH FORMS LIGHT VERTICAL;So;0;ON;<narrow> 2502;;;;N;;;;; +FFE9;HALFWIDTH LEFTWARDS ARROW;Sm;0;ON;<narrow> 2190;;;;N;;;;; +FFEA;HALFWIDTH UPWARDS ARROW;Sm;0;ON;<narrow> 2191;;;;N;;;;; +FFEB;HALFWIDTH RIGHTWARDS ARROW;Sm;0;ON;<narrow> 2192;;;;N;;;;; +FFEC;HALFWIDTH DOWNWARDS ARROW;Sm;0;ON;<narrow> 2193;;;;N;;;;; +FFED;HALFWIDTH BLACK SQUARE;So;0;ON;<narrow> 25A0;;;;N;;;;; +FFEE;HALFWIDTH WHITE CIRCLE;So;0;ON;<narrow> 25CB;;;;N;;;;; +FFF9;INTERLINEAR ANNOTATION ANCHOR;Cf;0;ON;;;;;N;;;;; +FFFA;INTERLINEAR ANNOTATION SEPARATOR;Cf;0;ON;;;;;N;;;;; +FFFB;INTERLINEAR ANNOTATION TERMINATOR;Cf;0;ON;;;;;N;;;;; +FFFC;OBJECT REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; +FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; +10000;LINEAR B SYLLABLE B008 A;Lo;0;L;;;;;N;;;;; +10001;LINEAR B SYLLABLE B038 E;Lo;0;L;;;;;N;;;;; +10002;LINEAR B SYLLABLE B028 I;Lo;0;L;;;;;N;;;;; +10003;LINEAR B SYLLABLE B061 O;Lo;0;L;;;;;N;;;;; +10004;LINEAR B SYLLABLE B010 U;Lo;0;L;;;;;N;;;;; +10005;LINEAR B SYLLABLE B001 DA;Lo;0;L;;;;;N;;;;; +10006;LINEAR B SYLLABLE B045 DE;Lo;0;L;;;;;N;;;;; +10007;LINEAR B SYLLABLE B007 DI;Lo;0;L;;;;;N;;;;; +10008;LINEAR B SYLLABLE B014 DO;Lo;0;L;;;;;N;;;;; +10009;LINEAR B SYLLABLE B051 DU;Lo;0;L;;;;;N;;;;; +1000A;LINEAR B SYLLABLE B057 JA;Lo;0;L;;;;;N;;;;; +1000B;LINEAR B SYLLABLE B046 JE;Lo;0;L;;;;;N;;;;; +1000D;LINEAR B SYLLABLE B036 JO;Lo;0;L;;;;;N;;;;; +1000E;LINEAR B SYLLABLE B065 JU;Lo;0;L;;;;;N;;;;; +1000F;LINEAR B SYLLABLE B077 KA;Lo;0;L;;;;;N;;;;; +10010;LINEAR B SYLLABLE B044 KE;Lo;0;L;;;;;N;;;;; +10011;LINEAR B SYLLABLE B067 KI;Lo;0;L;;;;;N;;;;; +10012;LINEAR B SYLLABLE B070 KO;Lo;0;L;;;;;N;;;;; +10013;LINEAR B SYLLABLE B081 KU;Lo;0;L;;;;;N;;;;; +10014;LINEAR B SYLLABLE B080 MA;Lo;0;L;;;;;N;;;;; +10015;LINEAR B SYLLABLE B013 ME;Lo;0;L;;;;;N;;;;; +10016;LINEAR B SYLLABLE B073 MI;Lo;0;L;;;;;N;;;;; +10017;LINEAR B SYLLABLE B015 MO;Lo;0;L;;;;;N;;;;; +10018;LINEAR B SYLLABLE B023 MU;Lo;0;L;;;;;N;;;;; +10019;LINEAR B SYLLABLE B006 NA;Lo;0;L;;;;;N;;;;; +1001A;LINEAR B SYLLABLE B024 NE;Lo;0;L;;;;;N;;;;; +1001B;LINEAR B SYLLABLE B030 NI;Lo;0;L;;;;;N;;;;; +1001C;LINEAR B SYLLABLE B052 NO;Lo;0;L;;;;;N;;;;; +1001D;LINEAR B SYLLABLE B055 NU;Lo;0;L;;;;;N;;;;; +1001E;LINEAR B SYLLABLE B003 PA;Lo;0;L;;;;;N;;;;; +1001F;LINEAR B SYLLABLE B072 PE;Lo;0;L;;;;;N;;;;; +10020;LINEAR B SYLLABLE B039 PI;Lo;0;L;;;;;N;;;;; +10021;LINEAR B SYLLABLE B011 PO;Lo;0;L;;;;;N;;;;; +10022;LINEAR B SYLLABLE B050 PU;Lo;0;L;;;;;N;;;;; +10023;LINEAR B SYLLABLE B016 QA;Lo;0;L;;;;;N;;;;; +10024;LINEAR B SYLLABLE B078 QE;Lo;0;L;;;;;N;;;;; +10025;LINEAR B SYLLABLE B021 QI;Lo;0;L;;;;;N;;;;; +10026;LINEAR B SYLLABLE B032 QO;Lo;0;L;;;;;N;;;;; +10028;LINEAR B SYLLABLE B060 RA;Lo;0;L;;;;;N;;;;; +10029;LINEAR B SYLLABLE B027 RE;Lo;0;L;;;;;N;;;;; +1002A;LINEAR B SYLLABLE B053 RI;Lo;0;L;;;;;N;;;;; +1002B;LINEAR B SYLLABLE B002 RO;Lo;0;L;;;;;N;;;;; +1002C;LINEAR B SYLLABLE B026 RU;Lo;0;L;;;;;N;;;;; +1002D;LINEAR B SYLLABLE B031 SA;Lo;0;L;;;;;N;;;;; +1002E;LINEAR B SYLLABLE B009 SE;Lo;0;L;;;;;N;;;;; +1002F;LINEAR B SYLLABLE B041 SI;Lo;0;L;;;;;N;;;;; +10030;LINEAR B SYLLABLE B012 SO;Lo;0;L;;;;;N;;;;; +10031;LINEAR B SYLLABLE B058 SU;Lo;0;L;;;;;N;;;;; +10032;LINEAR B SYLLABLE B059 TA;Lo;0;L;;;;;N;;;;; +10033;LINEAR B SYLLABLE B004 TE;Lo;0;L;;;;;N;;;;; +10034;LINEAR B SYLLABLE B037 TI;Lo;0;L;;;;;N;;;;; +10035;LINEAR B SYLLABLE B005 TO;Lo;0;L;;;;;N;;;;; +10036;LINEAR B SYLLABLE B069 TU;Lo;0;L;;;;;N;;;;; +10037;LINEAR B SYLLABLE B054 WA;Lo;0;L;;;;;N;;;;; +10038;LINEAR B SYLLABLE B075 WE;Lo;0;L;;;;;N;;;;; +10039;LINEAR B SYLLABLE B040 WI;Lo;0;L;;;;;N;;;;; +1003A;LINEAR B SYLLABLE B042 WO;Lo;0;L;;;;;N;;;;; +1003C;LINEAR B SYLLABLE B017 ZA;Lo;0;L;;;;;N;;;;; +1003D;LINEAR B SYLLABLE B074 ZE;Lo;0;L;;;;;N;;;;; +1003F;LINEAR B SYLLABLE B020 ZO;Lo;0;L;;;;;N;;;;; +10040;LINEAR B SYLLABLE B025 A2;Lo;0;L;;;;;N;;;;; +10041;LINEAR B SYLLABLE B043 A3;Lo;0;L;;;;;N;;;;; +10042;LINEAR B SYLLABLE B085 AU;Lo;0;L;;;;;N;;;;; +10043;LINEAR B SYLLABLE B071 DWE;Lo;0;L;;;;;N;;;;; +10044;LINEAR B SYLLABLE B090 DWO;Lo;0;L;;;;;N;;;;; +10045;LINEAR B SYLLABLE B048 NWA;Lo;0;L;;;;;N;;;;; +10046;LINEAR B SYLLABLE B029 PU2;Lo;0;L;;;;;N;;;;; +10047;LINEAR B SYLLABLE B062 PTE;Lo;0;L;;;;;N;;;;; +10048;LINEAR B SYLLABLE B076 RA2;Lo;0;L;;;;;N;;;;; +10049;LINEAR B SYLLABLE B033 RA3;Lo;0;L;;;;;N;;;;; +1004A;LINEAR B SYLLABLE B068 RO2;Lo;0;L;;;;;N;;;;; +1004B;LINEAR B SYLLABLE B066 TA2;Lo;0;L;;;;;N;;;;; +1004C;LINEAR B SYLLABLE B087 TWE;Lo;0;L;;;;;N;;;;; +1004D;LINEAR B SYLLABLE B091 TWO;Lo;0;L;;;;;N;;;;; +10050;LINEAR B SYMBOL B018;Lo;0;L;;;;;N;;;;; +10051;LINEAR B SYMBOL B019;Lo;0;L;;;;;N;;;;; +10052;LINEAR B SYMBOL B022;Lo;0;L;;;;;N;;;;; +10053;LINEAR B SYMBOL B034;Lo;0;L;;;;;N;;;;; +10054;LINEAR B SYMBOL B047;Lo;0;L;;;;;N;;;;; +10055;LINEAR B SYMBOL B049;Lo;0;L;;;;;N;;;;; +10056;LINEAR B SYMBOL B056;Lo;0;L;;;;;N;;;;; +10057;LINEAR B SYMBOL B063;Lo;0;L;;;;;N;;;;; +10058;LINEAR B SYMBOL B064;Lo;0;L;;;;;N;;;;; +10059;LINEAR B SYMBOL B079;Lo;0;L;;;;;N;;;;; +1005A;LINEAR B SYMBOL B082;Lo;0;L;;;;;N;;;;; +1005B;LINEAR B SYMBOL B083;Lo;0;L;;;;;N;;;;; +1005C;LINEAR B SYMBOL B086;Lo;0;L;;;;;N;;;;; +1005D;LINEAR B SYMBOL B089;Lo;0;L;;;;;N;;;;; +10080;LINEAR B IDEOGRAM B100 MAN;Lo;0;L;;;;;N;;;;; +10081;LINEAR B IDEOGRAM B102 WOMAN;Lo;0;L;;;;;N;;;;; +10082;LINEAR B IDEOGRAM B104 DEER;Lo;0;L;;;;;N;;;;; +10083;LINEAR B IDEOGRAM B105 EQUID;Lo;0;L;;;;;N;;;;; +10084;LINEAR B IDEOGRAM B105F MARE;Lo;0;L;;;;;N;;;;; +10085;LINEAR B IDEOGRAM B105M STALLION;Lo;0;L;;;;;N;;;;; +10086;LINEAR B IDEOGRAM B106F EWE;Lo;0;L;;;;;N;;;;; +10087;LINEAR B IDEOGRAM B106M RAM;Lo;0;L;;;;;N;;;;; +10088;LINEAR B IDEOGRAM B107F SHE-GOAT;Lo;0;L;;;;;N;;;;; +10089;LINEAR B IDEOGRAM B107M HE-GOAT;Lo;0;L;;;;;N;;;;; +1008A;LINEAR B IDEOGRAM B108F SOW;Lo;0;L;;;;;N;;;;; +1008B;LINEAR B IDEOGRAM B108M BOAR;Lo;0;L;;;;;N;;;;; +1008C;LINEAR B IDEOGRAM B109F COW;Lo;0;L;;;;;N;;;;; +1008D;LINEAR B IDEOGRAM B109M BULL;Lo;0;L;;;;;N;;;;; +1008E;LINEAR B IDEOGRAM B120 WHEAT;Lo;0;L;;;;;N;;;;; +1008F;LINEAR B IDEOGRAM B121 BARLEY;Lo;0;L;;;;;N;;;;; +10090;LINEAR B IDEOGRAM B122 OLIVE;Lo;0;L;;;;;N;;;;; +10091;LINEAR B IDEOGRAM B123 SPICE;Lo;0;L;;;;;N;;;;; +10092;LINEAR B IDEOGRAM B125 CYPERUS;Lo;0;L;;;;;N;;;;; +10093;LINEAR B MONOGRAM B127 KAPO;Lo;0;L;;;;;N;;;;; +10094;LINEAR B MONOGRAM B128 KANAKO;Lo;0;L;;;;;N;;;;; +10095;LINEAR B IDEOGRAM B130 OIL;Lo;0;L;;;;;N;;;;; +10096;LINEAR B IDEOGRAM B131 WINE;Lo;0;L;;;;;N;;;;; +10097;LINEAR B IDEOGRAM B132;Lo;0;L;;;;;N;;;;; +10098;LINEAR B MONOGRAM B133 AREPA;Lo;0;L;;;;;N;;;;; +10099;LINEAR B MONOGRAM B135 MERI;Lo;0;L;;;;;N;;;;; +1009A;LINEAR B IDEOGRAM B140 BRONZE;Lo;0;L;;;;;N;;;;; +1009B;LINEAR B IDEOGRAM B141 GOLD;Lo;0;L;;;;;N;;;;; +1009C;LINEAR B IDEOGRAM B142;Lo;0;L;;;;;N;;;;; +1009D;LINEAR B IDEOGRAM B145 WOOL;Lo;0;L;;;;;N;;;;; +1009E;LINEAR B IDEOGRAM B146;Lo;0;L;;;;;N;;;;; +1009F;LINEAR B IDEOGRAM B150;Lo;0;L;;;;;N;;;;; +100A0;LINEAR B IDEOGRAM B151 HORN;Lo;0;L;;;;;N;;;;; +100A1;LINEAR B IDEOGRAM B152;Lo;0;L;;;;;N;;;;; +100A2;LINEAR B IDEOGRAM B153;Lo;0;L;;;;;N;;;;; +100A3;LINEAR B IDEOGRAM B154;Lo;0;L;;;;;N;;;;; +100A4;LINEAR B MONOGRAM B156 TURO2;Lo;0;L;;;;;N;;;;; +100A5;LINEAR B IDEOGRAM B157;Lo;0;L;;;;;N;;;;; +100A6;LINEAR B IDEOGRAM B158;Lo;0;L;;;;;N;;;;; +100A7;LINEAR B IDEOGRAM B159 CLOTH;Lo;0;L;;;;;N;;;;; +100A8;LINEAR B IDEOGRAM B160;Lo;0;L;;;;;N;;;;; +100A9;LINEAR B IDEOGRAM B161;Lo;0;L;;;;;N;;;;; +100AA;LINEAR B IDEOGRAM B162 GARMENT;Lo;0;L;;;;;N;;;;; +100AB;LINEAR B IDEOGRAM B163 ARMOUR;Lo;0;L;;;;;N;;;;; +100AC;LINEAR B IDEOGRAM B164;Lo;0;L;;;;;N;;;;; +100AD;LINEAR B IDEOGRAM B165;Lo;0;L;;;;;N;;;;; +100AE;LINEAR B IDEOGRAM B166;Lo;0;L;;;;;N;;;;; +100AF;LINEAR B IDEOGRAM B167;Lo;0;L;;;;;N;;;;; +100B0;LINEAR B IDEOGRAM B168;Lo;0;L;;;;;N;;;;; +100B1;LINEAR B IDEOGRAM B169;Lo;0;L;;;;;N;;;;; +100B2;LINEAR B IDEOGRAM B170;Lo;0;L;;;;;N;;;;; +100B3;LINEAR B IDEOGRAM B171;Lo;0;L;;;;;N;;;;; +100B4;LINEAR B IDEOGRAM B172;Lo;0;L;;;;;N;;;;; +100B5;LINEAR B IDEOGRAM B173 MONTH;Lo;0;L;;;;;N;;;;; +100B6;LINEAR B IDEOGRAM B174;Lo;0;L;;;;;N;;;;; +100B7;LINEAR B IDEOGRAM B176 TREE;Lo;0;L;;;;;N;;;;; +100B8;LINEAR B IDEOGRAM B177;Lo;0;L;;;;;N;;;;; +100B9;LINEAR B IDEOGRAM B178;Lo;0;L;;;;;N;;;;; +100BA;LINEAR B IDEOGRAM B179;Lo;0;L;;;;;N;;;;; +100BB;LINEAR B IDEOGRAM B180;Lo;0;L;;;;;N;;;;; +100BC;LINEAR B IDEOGRAM B181;Lo;0;L;;;;;N;;;;; +100BD;LINEAR B IDEOGRAM B182;Lo;0;L;;;;;N;;;;; +100BE;LINEAR B IDEOGRAM B183;Lo;0;L;;;;;N;;;;; +100BF;LINEAR B IDEOGRAM B184;Lo;0;L;;;;;N;;;;; +100C0;LINEAR B IDEOGRAM B185;Lo;0;L;;;;;N;;;;; +100C1;LINEAR B IDEOGRAM B189;Lo;0;L;;;;;N;;;;; +100C2;LINEAR B IDEOGRAM B190;Lo;0;L;;;;;N;;;;; +100C3;LINEAR B IDEOGRAM B191 HELMET;Lo;0;L;;;;;N;;;;; +100C4;LINEAR B IDEOGRAM B220 FOOTSTOOL;Lo;0;L;;;;;N;;;;; +100C5;LINEAR B IDEOGRAM B225 BATHTUB;Lo;0;L;;;;;N;;;;; +100C6;LINEAR B IDEOGRAM B230 SPEAR;Lo;0;L;;;;;N;;;;; +100C7;LINEAR B IDEOGRAM B231 ARROW;Lo;0;L;;;;;N;;;;; +100C8;LINEAR B IDEOGRAM B232;Lo;0;L;;;;;N;;;;; +100C9;LINEAR B IDEOGRAM B233 SWORD;Lo;0;L;;;;;N;;;;; +100CA;LINEAR B IDEOGRAM B234;Lo;0;L;;;;;N;;;;; +100CB;LINEAR B IDEOGRAM B236;Lo;0;L;;;;;N;;;;; +100CC;LINEAR B IDEOGRAM B240 WHEELED CHARIOT;Lo;0;L;;;;;N;;;;; +100CD;LINEAR B IDEOGRAM B241 CHARIOT;Lo;0;L;;;;;N;;;;; +100CE;LINEAR B IDEOGRAM B242 CHARIOT FRAME;Lo;0;L;;;;;N;;;;; +100CF;LINEAR B IDEOGRAM B243 WHEEL;Lo;0;L;;;;;N;;;;; +100D0;LINEAR B IDEOGRAM B245;Lo;0;L;;;;;N;;;;; +100D1;LINEAR B IDEOGRAM B246;Lo;0;L;;;;;N;;;;; +100D2;LINEAR B MONOGRAM B247 DIPTE;Lo;0;L;;;;;N;;;;; +100D3;LINEAR B IDEOGRAM B248;Lo;0;L;;;;;N;;;;; +100D4;LINEAR B IDEOGRAM B249;Lo;0;L;;;;;N;;;;; +100D5;LINEAR B IDEOGRAM B251;Lo;0;L;;;;;N;;;;; +100D6;LINEAR B IDEOGRAM B252;Lo;0;L;;;;;N;;;;; +100D7;LINEAR B IDEOGRAM B253;Lo;0;L;;;;;N;;;;; +100D8;LINEAR B IDEOGRAM B254 DART;Lo;0;L;;;;;N;;;;; +100D9;LINEAR B IDEOGRAM B255;Lo;0;L;;;;;N;;;;; +100DA;LINEAR B IDEOGRAM B256;Lo;0;L;;;;;N;;;;; +100DB;LINEAR B IDEOGRAM B257;Lo;0;L;;;;;N;;;;; +100DC;LINEAR B IDEOGRAM B258;Lo;0;L;;;;;N;;;;; +100DD;LINEAR B IDEOGRAM B259;Lo;0;L;;;;;N;;;;; +100DE;LINEAR B IDEOGRAM VESSEL B155;Lo;0;L;;;;;N;;;;; +100DF;LINEAR B IDEOGRAM VESSEL B200;Lo;0;L;;;;;N;;;;; +100E0;LINEAR B IDEOGRAM VESSEL B201;Lo;0;L;;;;;N;;;;; +100E1;LINEAR B IDEOGRAM VESSEL B202;Lo;0;L;;;;;N;;;;; +100E2;LINEAR B IDEOGRAM VESSEL B203;Lo;0;L;;;;;N;;;;; +100E3;LINEAR B IDEOGRAM VESSEL B204;Lo;0;L;;;;;N;;;;; +100E4;LINEAR B IDEOGRAM VESSEL B205;Lo;0;L;;;;;N;;;;; +100E5;LINEAR B IDEOGRAM VESSEL B206;Lo;0;L;;;;;N;;;;; +100E6;LINEAR B IDEOGRAM VESSEL B207;Lo;0;L;;;;;N;;;;; +100E7;LINEAR B IDEOGRAM VESSEL B208;Lo;0;L;;;;;N;;;;; +100E8;LINEAR B IDEOGRAM VESSEL B209;Lo;0;L;;;;;N;;;;; +100E9;LINEAR B IDEOGRAM VESSEL B210;Lo;0;L;;;;;N;;;;; +100EA;LINEAR B IDEOGRAM VESSEL B211;Lo;0;L;;;;;N;;;;; +100EB;LINEAR B IDEOGRAM VESSEL B212;Lo;0;L;;;;;N;;;;; +100EC;LINEAR B IDEOGRAM VESSEL B213;Lo;0;L;;;;;N;;;;; +100ED;LINEAR B IDEOGRAM VESSEL B214;Lo;0;L;;;;;N;;;;; +100EE;LINEAR B IDEOGRAM VESSEL B215;Lo;0;L;;;;;N;;;;; +100EF;LINEAR B IDEOGRAM VESSEL B216;Lo;0;L;;;;;N;;;;; +100F0;LINEAR B IDEOGRAM VESSEL B217;Lo;0;L;;;;;N;;;;; +100F1;LINEAR B IDEOGRAM VESSEL B218;Lo;0;L;;;;;N;;;;; +100F2;LINEAR B IDEOGRAM VESSEL B219;Lo;0;L;;;;;N;;;;; +100F3;LINEAR B IDEOGRAM VESSEL B221;Lo;0;L;;;;;N;;;;; +100F4;LINEAR B IDEOGRAM VESSEL B222;Lo;0;L;;;;;N;;;;; +100F5;LINEAR B IDEOGRAM VESSEL B226;Lo;0;L;;;;;N;;;;; +100F6;LINEAR B IDEOGRAM VESSEL B227;Lo;0;L;;;;;N;;;;; +100F7;LINEAR B IDEOGRAM VESSEL B228;Lo;0;L;;;;;N;;;;; +100F8;LINEAR B IDEOGRAM VESSEL B229;Lo;0;L;;;;;N;;;;; +100F9;LINEAR B IDEOGRAM VESSEL B250;Lo;0;L;;;;;N;;;;; +100FA;LINEAR B IDEOGRAM VESSEL B305;Lo;0;L;;;;;N;;;;; +10100;AEGEAN WORD SEPARATOR LINE;Po;0;L;;;;;N;;;;; +10101;AEGEAN WORD SEPARATOR DOT;Po;0;ON;;;;;N;;;;; +10102;AEGEAN CHECK MARK;Po;0;L;;;;;N;;;;; +10107;AEGEAN NUMBER ONE;No;0;L;;;;1;N;;;;; +10108;AEGEAN NUMBER TWO;No;0;L;;;;2;N;;;;; +10109;AEGEAN NUMBER THREE;No;0;L;;;;3;N;;;;; +1010A;AEGEAN NUMBER FOUR;No;0;L;;;;4;N;;;;; +1010B;AEGEAN NUMBER FIVE;No;0;L;;;;5;N;;;;; +1010C;AEGEAN NUMBER SIX;No;0;L;;;;6;N;;;;; +1010D;AEGEAN NUMBER SEVEN;No;0;L;;;;7;N;;;;; +1010E;AEGEAN NUMBER EIGHT;No;0;L;;;;8;N;;;;; +1010F;AEGEAN NUMBER NINE;No;0;L;;;;9;N;;;;; +10110;AEGEAN NUMBER TEN;No;0;L;;;;10;N;;;;; +10111;AEGEAN NUMBER TWENTY;No;0;L;;;;20;N;;;;; +10112;AEGEAN NUMBER THIRTY;No;0;L;;;;30;N;;;;; +10113;AEGEAN NUMBER FORTY;No;0;L;;;;40;N;;;;; +10114;AEGEAN NUMBER FIFTY;No;0;L;;;;50;N;;;;; +10115;AEGEAN NUMBER SIXTY;No;0;L;;;;60;N;;;;; +10116;AEGEAN NUMBER SEVENTY;No;0;L;;;;70;N;;;;; +10117;AEGEAN NUMBER EIGHTY;No;0;L;;;;80;N;;;;; +10118;AEGEAN NUMBER NINETY;No;0;L;;;;90;N;;;;; +10119;AEGEAN NUMBER ONE HUNDRED;No;0;L;;;;100;N;;;;; +1011A;AEGEAN NUMBER TWO HUNDRED;No;0;L;;;;200;N;;;;; +1011B;AEGEAN NUMBER THREE HUNDRED;No;0;L;;;;300;N;;;;; +1011C;AEGEAN NUMBER FOUR HUNDRED;No;0;L;;;;400;N;;;;; +1011D;AEGEAN NUMBER FIVE HUNDRED;No;0;L;;;;500;N;;;;; +1011E;AEGEAN NUMBER SIX HUNDRED;No;0;L;;;;600;N;;;;; +1011F;AEGEAN NUMBER SEVEN HUNDRED;No;0;L;;;;700;N;;;;; +10120;AEGEAN NUMBER EIGHT HUNDRED;No;0;L;;;;800;N;;;;; +10121;AEGEAN NUMBER NINE HUNDRED;No;0;L;;;;900;N;;;;; +10122;AEGEAN NUMBER ONE THOUSAND;No;0;L;;;;1000;N;;;;; +10123;AEGEAN NUMBER TWO THOUSAND;No;0;L;;;;2000;N;;;;; +10124;AEGEAN NUMBER THREE THOUSAND;No;0;L;;;;3000;N;;;;; +10125;AEGEAN NUMBER FOUR THOUSAND;No;0;L;;;;4000;N;;;;; +10126;AEGEAN NUMBER FIVE THOUSAND;No;0;L;;;;5000;N;;;;; +10127;AEGEAN NUMBER SIX THOUSAND;No;0;L;;;;6000;N;;;;; +10128;AEGEAN NUMBER SEVEN THOUSAND;No;0;L;;;;7000;N;;;;; +10129;AEGEAN NUMBER EIGHT THOUSAND;No;0;L;;;;8000;N;;;;; +1012A;AEGEAN NUMBER NINE THOUSAND;No;0;L;;;;9000;N;;;;; +1012B;AEGEAN NUMBER TEN THOUSAND;No;0;L;;;;10000;N;;;;; +1012C;AEGEAN NUMBER TWENTY THOUSAND;No;0;L;;;;20000;N;;;;; +1012D;AEGEAN NUMBER THIRTY THOUSAND;No;0;L;;;;30000;N;;;;; +1012E;AEGEAN NUMBER FORTY THOUSAND;No;0;L;;;;40000;N;;;;; +1012F;AEGEAN NUMBER FIFTY THOUSAND;No;0;L;;;;50000;N;;;;; +10130;AEGEAN NUMBER SIXTY THOUSAND;No;0;L;;;;60000;N;;;;; +10131;AEGEAN NUMBER SEVENTY THOUSAND;No;0;L;;;;70000;N;;;;; +10132;AEGEAN NUMBER EIGHTY THOUSAND;No;0;L;;;;80000;N;;;;; +10133;AEGEAN NUMBER NINETY THOUSAND;No;0;L;;;;90000;N;;;;; +10137;AEGEAN WEIGHT BASE UNIT;So;0;L;;;;;N;;;;; +10138;AEGEAN WEIGHT FIRST SUBUNIT;So;0;L;;;;;N;;;;; +10139;AEGEAN WEIGHT SECOND SUBUNIT;So;0;L;;;;;N;;;;; +1013A;AEGEAN WEIGHT THIRD SUBUNIT;So;0;L;;;;;N;;;;; +1013B;AEGEAN WEIGHT FOURTH SUBUNIT;So;0;L;;;;;N;;;;; +1013C;AEGEAN DRY MEASURE FIRST SUBUNIT;So;0;L;;;;;N;;;;; +1013D;AEGEAN LIQUID MEASURE FIRST SUBUNIT;So;0;L;;;;;N;;;;; +1013E;AEGEAN MEASURE SECOND SUBUNIT;So;0;L;;;;;N;;;;; +1013F;AEGEAN MEASURE THIRD SUBUNIT;So;0;L;;;;;N;;;;; +10140;GREEK ACROPHONIC ATTIC ONE QUARTER;Nl;0;ON;;;;1/4;N;;;;; +10141;GREEK ACROPHONIC ATTIC ONE HALF;Nl;0;ON;;;;1/2;N;;;;; +10142;GREEK ACROPHONIC ATTIC ONE DRACHMA;Nl;0;ON;;;;1;N;;;;; +10143;GREEK ACROPHONIC ATTIC FIVE;Nl;0;ON;;;;5;N;;;;; +10144;GREEK ACROPHONIC ATTIC FIFTY;Nl;0;ON;;;;50;N;;;;; +10145;GREEK ACROPHONIC ATTIC FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;; +10146;GREEK ACROPHONIC ATTIC FIVE THOUSAND;Nl;0;ON;;;;5000;N;;;;; +10147;GREEK ACROPHONIC ATTIC FIFTY THOUSAND;Nl;0;ON;;;;50000;N;;;;; +10148;GREEK ACROPHONIC ATTIC FIVE TALENTS;Nl;0;ON;;;;5;N;;;;; +10149;GREEK ACROPHONIC ATTIC TEN TALENTS;Nl;0;ON;;;;10;N;;;;; +1014A;GREEK ACROPHONIC ATTIC FIFTY TALENTS;Nl;0;ON;;;;50;N;;;;; +1014B;GREEK ACROPHONIC ATTIC ONE HUNDRED TALENTS;Nl;0;ON;;;;100;N;;;;; +1014C;GREEK ACROPHONIC ATTIC FIVE HUNDRED TALENTS;Nl;0;ON;;;;500;N;;;;; +1014D;GREEK ACROPHONIC ATTIC ONE THOUSAND TALENTS;Nl;0;ON;;;;1000;N;;;;; +1014E;GREEK ACROPHONIC ATTIC FIVE THOUSAND TALENTS;Nl;0;ON;;;;5000;N;;;;; +1014F;GREEK ACROPHONIC ATTIC FIVE STATERS;Nl;0;ON;;;;5;N;;;;; +10150;GREEK ACROPHONIC ATTIC TEN STATERS;Nl;0;ON;;;;10;N;;;;; +10151;GREEK ACROPHONIC ATTIC FIFTY STATERS;Nl;0;ON;;;;50;N;;;;; +10152;GREEK ACROPHONIC ATTIC ONE HUNDRED STATERS;Nl;0;ON;;;;100;N;;;;; +10153;GREEK ACROPHONIC ATTIC FIVE HUNDRED STATERS;Nl;0;ON;;;;500;N;;;;; +10154;GREEK ACROPHONIC ATTIC ONE THOUSAND STATERS;Nl;0;ON;;;;1000;N;;;;; +10155;GREEK ACROPHONIC ATTIC TEN THOUSAND STATERS;Nl;0;ON;;;;10000;N;;;;; +10156;GREEK ACROPHONIC ATTIC FIFTY THOUSAND STATERS;Nl;0;ON;;;;50000;N;;;;; +10157;GREEK ACROPHONIC ATTIC TEN MNAS;Nl;0;ON;;;;10;N;;;;; +10158;GREEK ACROPHONIC HERAEUM ONE PLETHRON;Nl;0;ON;;;;1;N;;;;; +10159;GREEK ACROPHONIC THESPIAN ONE;Nl;0;ON;;;;1;N;;;;; +1015A;GREEK ACROPHONIC HERMIONIAN ONE;Nl;0;ON;;;;1;N;;;;; +1015B;GREEK ACROPHONIC EPIDAUREAN TWO;Nl;0;ON;;;;2;N;;;;; +1015C;GREEK ACROPHONIC THESPIAN TWO;Nl;0;ON;;;;2;N;;;;; +1015D;GREEK ACROPHONIC CYRENAIC TWO DRACHMAS;Nl;0;ON;;;;2;N;;;;; +1015E;GREEK ACROPHONIC EPIDAUREAN TWO DRACHMAS;Nl;0;ON;;;;2;N;;;;; +1015F;GREEK ACROPHONIC TROEZENIAN FIVE;Nl;0;ON;;;;5;N;;;;; +10160;GREEK ACROPHONIC TROEZENIAN TEN;Nl;0;ON;;;;10;N;;;;; +10161;GREEK ACROPHONIC TROEZENIAN TEN ALTERNATE FORM;Nl;0;ON;;;;10;N;;;;; +10162;GREEK ACROPHONIC HERMIONIAN TEN;Nl;0;ON;;;;10;N;;;;; +10163;GREEK ACROPHONIC MESSENIAN TEN;Nl;0;ON;;;;10;N;;;;; +10164;GREEK ACROPHONIC THESPIAN TEN;Nl;0;ON;;;;10;N;;;;; +10165;GREEK ACROPHONIC THESPIAN THIRTY;Nl;0;ON;;;;30;N;;;;; +10166;GREEK ACROPHONIC TROEZENIAN FIFTY;Nl;0;ON;;;;50;N;;;;; +10167;GREEK ACROPHONIC TROEZENIAN FIFTY ALTERNATE FORM;Nl;0;ON;;;;50;N;;;;; +10168;GREEK ACROPHONIC HERMIONIAN FIFTY;Nl;0;ON;;;;50;N;;;;; +10169;GREEK ACROPHONIC THESPIAN FIFTY;Nl;0;ON;;;;50;N;;;;; +1016A;GREEK ACROPHONIC THESPIAN ONE HUNDRED;Nl;0;ON;;;;100;N;;;;; +1016B;GREEK ACROPHONIC THESPIAN THREE HUNDRED;Nl;0;ON;;;;300;N;;;;; +1016C;GREEK ACROPHONIC EPIDAUREAN FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;; +1016D;GREEK ACROPHONIC TROEZENIAN FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;; +1016E;GREEK ACROPHONIC THESPIAN FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;; +1016F;GREEK ACROPHONIC CARYSTIAN FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;; +10170;GREEK ACROPHONIC NAXIAN FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;; +10171;GREEK ACROPHONIC THESPIAN ONE THOUSAND;Nl;0;ON;;;;1000;N;;;;; +10172;GREEK ACROPHONIC THESPIAN FIVE THOUSAND;Nl;0;ON;;;;5000;N;;;;; +10173;GREEK ACROPHONIC DELPHIC FIVE MNAS;Nl;0;ON;;;;5;N;;;;; +10174;GREEK ACROPHONIC STRATIAN FIFTY MNAS;Nl;0;ON;;;;50;N;;;;; +10175;GREEK ONE HALF SIGN;No;0;ON;;;;1/2;N;;;;; +10176;GREEK ONE HALF SIGN ALTERNATE FORM;No;0;ON;;;;1/2;N;;;;; +10177;GREEK TWO THIRDS SIGN;No;0;ON;;;;2/3;N;;;;; +10178;GREEK THREE QUARTERS SIGN;No;0;ON;;;;3/4;N;;;;; +10179;GREEK YEAR SIGN;So;0;ON;;;;;N;;;;; +1017A;GREEK TALENT SIGN;So;0;ON;;;;;N;;;;; +1017B;GREEK DRACHMA SIGN;So;0;ON;;;;;N;;;;; +1017C;GREEK OBOL SIGN;So;0;ON;;;;;N;;;;; +1017D;GREEK TWO OBOLS SIGN;So;0;ON;;;;;N;;;;; +1017E;GREEK THREE OBOLS SIGN;So;0;ON;;;;;N;;;;; +1017F;GREEK FOUR OBOLS SIGN;So;0;ON;;;;;N;;;;; +10180;GREEK FIVE OBOLS SIGN;So;0;ON;;;;;N;;;;; +10181;GREEK METRETES SIGN;So;0;ON;;;;;N;;;;; +10182;GREEK KYATHOS BASE SIGN;So;0;ON;;;;;N;;;;; +10183;GREEK LITRA SIGN;So;0;ON;;;;;N;;;;; +10184;GREEK OUNKIA SIGN;So;0;ON;;;;;N;;;;; +10185;GREEK XESTES SIGN;So;0;ON;;;;;N;;;;; +10186;GREEK ARTABE SIGN;So;0;ON;;;;;N;;;;; +10187;GREEK AROURA SIGN;So;0;ON;;;;;N;;;;; +10188;GREEK GRAMMA SIGN;So;0;ON;;;;;N;;;;; +10189;GREEK TRYBLION BASE SIGN;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;;;;; +10193;ROMAN SEXTULA SIGN;So;0;ON;;;;;N;;;;; +10194;ROMAN DIMIDIA SEXTULA SIGN;So;0;ON;;;;;N;;;;; +10195;ROMAN SILIQUA SIGN;So;0;ON;;;;;N;;;;; +10196;ROMAN DENARIUS SIGN;So;0;ON;;;;;N;;;;; +10197;ROMAN QUINARIUS SIGN;So;0;ON;;;;;N;;;;; +10198;ROMAN SESTERTIUS SIGN;So;0;ON;;;;;N;;;;; +10199;ROMAN DUPONDIUS SIGN;So;0;ON;;;;;N;;;;; +1019A;ROMAN AS SIGN;So;0;ON;;;;;N;;;;; +1019B;ROMAN CENTURIAL SIGN;So;0;ON;;;;;N;;;;; +101A0;GREEK SYMBOL TAU RHO;So;0;ON;;;;;N;;;;; +101D0;PHAISTOS DISC SIGN PEDESTRIAN;So;0;L;;;;;N;;;;; +101D1;PHAISTOS DISC SIGN PLUMED HEAD;So;0;L;;;;;N;;;;; +101D2;PHAISTOS DISC SIGN TATTOOED HEAD;So;0;L;;;;;N;;;;; +101D3;PHAISTOS DISC SIGN CAPTIVE;So;0;L;;;;;N;;;;; +101D4;PHAISTOS DISC SIGN CHILD;So;0;L;;;;;N;;;;; +101D5;PHAISTOS DISC SIGN WOMAN;So;0;L;;;;;N;;;;; +101D6;PHAISTOS DISC SIGN HELMET;So;0;L;;;;;N;;;;; +101D7;PHAISTOS DISC SIGN GAUNTLET;So;0;L;;;;;N;;;;; +101D8;PHAISTOS DISC SIGN TIARA;So;0;L;;;;;N;;;;; +101D9;PHAISTOS DISC SIGN ARROW;So;0;L;;;;;N;;;;; +101DA;PHAISTOS DISC SIGN BOW;So;0;L;;;;;N;;;;; +101DB;PHAISTOS DISC SIGN SHIELD;So;0;L;;;;;N;;;;; +101DC;PHAISTOS DISC SIGN CLUB;So;0;L;;;;;N;;;;; +101DD;PHAISTOS DISC SIGN MANACLES;So;0;L;;;;;N;;;;; +101DE;PHAISTOS DISC SIGN MATTOCK;So;0;L;;;;;N;;;;; +101DF;PHAISTOS DISC SIGN SAW;So;0;L;;;;;N;;;;; +101E0;PHAISTOS DISC SIGN LID;So;0;L;;;;;N;;;;; +101E1;PHAISTOS DISC SIGN BOOMERANG;So;0;L;;;;;N;;;;; +101E2;PHAISTOS DISC SIGN CARPENTRY PLANE;So;0;L;;;;;N;;;;; +101E3;PHAISTOS DISC SIGN DOLIUM;So;0;L;;;;;N;;;;; +101E4;PHAISTOS DISC SIGN COMB;So;0;L;;;;;N;;;;; +101E5;PHAISTOS DISC SIGN SLING;So;0;L;;;;;N;;;;; +101E6;PHAISTOS DISC SIGN COLUMN;So;0;L;;;;;N;;;;; +101E7;PHAISTOS DISC SIGN BEEHIVE;So;0;L;;;;;N;;;;; +101E8;PHAISTOS DISC SIGN SHIP;So;0;L;;;;;N;;;;; +101E9;PHAISTOS DISC SIGN HORN;So;0;L;;;;;N;;;;; +101EA;PHAISTOS DISC SIGN HIDE;So;0;L;;;;;N;;;;; +101EB;PHAISTOS DISC SIGN BULLS LEG;So;0;L;;;;;N;;;;; +101EC;PHAISTOS DISC SIGN CAT;So;0;L;;;;;N;;;;; +101ED;PHAISTOS DISC SIGN RAM;So;0;L;;;;;N;;;;; +101EE;PHAISTOS DISC SIGN EAGLE;So;0;L;;;;;N;;;;; +101EF;PHAISTOS DISC SIGN DOVE;So;0;L;;;;;N;;;;; +101F0;PHAISTOS DISC SIGN TUNNY;So;0;L;;;;;N;;;;; +101F1;PHAISTOS DISC SIGN BEE;So;0;L;;;;;N;;;;; +101F2;PHAISTOS DISC SIGN PLANE TREE;So;0;L;;;;;N;;;;; +101F3;PHAISTOS DISC SIGN VINE;So;0;L;;;;;N;;;;; +101F4;PHAISTOS DISC SIGN PAPYRUS;So;0;L;;;;;N;;;;; +101F5;PHAISTOS DISC SIGN ROSETTE;So;0;L;;;;;N;;;;; +101F6;PHAISTOS DISC SIGN LILY;So;0;L;;;;;N;;;;; +101F7;PHAISTOS DISC SIGN OX BACK;So;0;L;;;;;N;;;;; +101F8;PHAISTOS DISC SIGN FLUTE;So;0;L;;;;;N;;;;; +101F9;PHAISTOS DISC SIGN GRATER;So;0;L;;;;;N;;;;; +101FA;PHAISTOS DISC SIGN STRAINER;So;0;L;;;;;N;;;;; +101FB;PHAISTOS DISC SIGN SMALL AXE;So;0;L;;;;;N;;;;; +101FC;PHAISTOS DISC SIGN WAVY BAND;So;0;L;;;;;N;;;;; +101FD;PHAISTOS DISC SIGN COMBINING OBLIQUE STROKE;Mn;220;NSM;;;;;N;;;;; +10280;LYCIAN LETTER A;Lo;0;L;;;;;N;;;;; +10281;LYCIAN LETTER E;Lo;0;L;;;;;N;;;;; +10282;LYCIAN LETTER B;Lo;0;L;;;;;N;;;;; +10283;LYCIAN LETTER BH;Lo;0;L;;;;;N;;;;; +10284;LYCIAN LETTER G;Lo;0;L;;;;;N;;;;; +10285;LYCIAN LETTER D;Lo;0;L;;;;;N;;;;; +10286;LYCIAN LETTER I;Lo;0;L;;;;;N;;;;; +10287;LYCIAN LETTER W;Lo;0;L;;;;;N;;;;; +10288;LYCIAN LETTER Z;Lo;0;L;;;;;N;;;;; +10289;LYCIAN LETTER TH;Lo;0;L;;;;;N;;;;; +1028A;LYCIAN LETTER J;Lo;0;L;;;;;N;;;;; +1028B;LYCIAN LETTER K;Lo;0;L;;;;;N;;;;; +1028C;LYCIAN LETTER Q;Lo;0;L;;;;;N;;;;; +1028D;LYCIAN LETTER L;Lo;0;L;;;;;N;;;;; +1028E;LYCIAN LETTER M;Lo;0;L;;;;;N;;;;; +1028F;LYCIAN LETTER N;Lo;0;L;;;;;N;;;;; +10290;LYCIAN LETTER MM;Lo;0;L;;;;;N;;;;; +10291;LYCIAN LETTER NN;Lo;0;L;;;;;N;;;;; +10292;LYCIAN LETTER U;Lo;0;L;;;;;N;;;;; +10293;LYCIAN LETTER P;Lo;0;L;;;;;N;;;;; +10294;LYCIAN LETTER KK;Lo;0;L;;;;;N;;;;; +10295;LYCIAN LETTER R;Lo;0;L;;;;;N;;;;; +10296;LYCIAN LETTER S;Lo;0;L;;;;;N;;;;; +10297;LYCIAN LETTER T;Lo;0;L;;;;;N;;;;; +10298;LYCIAN LETTER TT;Lo;0;L;;;;;N;;;;; +10299;LYCIAN LETTER AN;Lo;0;L;;;;;N;;;;; +1029A;LYCIAN LETTER EN;Lo;0;L;;;;;N;;;;; +1029B;LYCIAN LETTER H;Lo;0;L;;;;;N;;;;; +1029C;LYCIAN LETTER X;Lo;0;L;;;;;N;;;;; +102A0;CARIAN LETTER A;Lo;0;L;;;;;N;;;;; +102A1;CARIAN LETTER P2;Lo;0;L;;;;;N;;;;; +102A2;CARIAN LETTER D;Lo;0;L;;;;;N;;;;; +102A3;CARIAN LETTER L;Lo;0;L;;;;;N;;;;; +102A4;CARIAN LETTER UUU;Lo;0;L;;;;;N;;;;; +102A5;CARIAN LETTER R;Lo;0;L;;;;;N;;;;; +102A6;CARIAN LETTER LD;Lo;0;L;;;;;N;;;;; +102A7;CARIAN LETTER A2;Lo;0;L;;;;;N;;;;; +102A8;CARIAN LETTER Q;Lo;0;L;;;;;N;;;;; +102A9;CARIAN LETTER B;Lo;0;L;;;;;N;;;;; +102AA;CARIAN LETTER M;Lo;0;L;;;;;N;;;;; +102AB;CARIAN LETTER O;Lo;0;L;;;;;N;;;;; +102AC;CARIAN LETTER D2;Lo;0;L;;;;;N;;;;; +102AD;CARIAN LETTER T;Lo;0;L;;;;;N;;;;; +102AE;CARIAN LETTER SH;Lo;0;L;;;;;N;;;;; +102AF;CARIAN LETTER SH2;Lo;0;L;;;;;N;;;;; +102B0;CARIAN LETTER S;Lo;0;L;;;;;N;;;;; +102B1;CARIAN LETTER C-18;Lo;0;L;;;;;N;;;;; +102B2;CARIAN LETTER U;Lo;0;L;;;;;N;;;;; +102B3;CARIAN LETTER NN;Lo;0;L;;;;;N;;;;; +102B4;CARIAN LETTER X;Lo;0;L;;;;;N;;;;; +102B5;CARIAN LETTER N;Lo;0;L;;;;;N;;;;; +102B6;CARIAN LETTER TT2;Lo;0;L;;;;;N;;;;; +102B7;CARIAN LETTER P;Lo;0;L;;;;;N;;;;; +102B8;CARIAN LETTER SS;Lo;0;L;;;;;N;;;;; +102B9;CARIAN LETTER I;Lo;0;L;;;;;N;;;;; +102BA;CARIAN LETTER E;Lo;0;L;;;;;N;;;;; +102BB;CARIAN LETTER UUUU;Lo;0;L;;;;;N;;;;; +102BC;CARIAN LETTER K;Lo;0;L;;;;;N;;;;; +102BD;CARIAN LETTER K2;Lo;0;L;;;;;N;;;;; +102BE;CARIAN LETTER ND;Lo;0;L;;;;;N;;;;; +102BF;CARIAN LETTER UU;Lo;0;L;;;;;N;;;;; +102C0;CARIAN LETTER G;Lo;0;L;;;;;N;;;;; +102C1;CARIAN LETTER G2;Lo;0;L;;;;;N;;;;; +102C2;CARIAN LETTER ST;Lo;0;L;;;;;N;;;;; +102C3;CARIAN LETTER ST2;Lo;0;L;;;;;N;;;;; +102C4;CARIAN LETTER NG;Lo;0;L;;;;;N;;;;; +102C5;CARIAN LETTER II;Lo;0;L;;;;;N;;;;; +102C6;CARIAN LETTER C-39;Lo;0;L;;;;;N;;;;; +102C7;CARIAN LETTER TT;Lo;0;L;;;;;N;;;;; +102C8;CARIAN LETTER UUU2;Lo;0;L;;;;;N;;;;; +102C9;CARIAN LETTER RR;Lo;0;L;;;;;N;;;;; +102CA;CARIAN LETTER MB;Lo;0;L;;;;;N;;;;; +102CB;CARIAN LETTER MB2;Lo;0;L;;;;;N;;;;; +102CC;CARIAN LETTER MB3;Lo;0;L;;;;;N;;;;; +102CD;CARIAN LETTER MB4;Lo;0;L;;;;;N;;;;; +102CE;CARIAN LETTER LD2;Lo;0;L;;;;;N;;;;; +102CF;CARIAN LETTER E2;Lo;0;L;;;;;N;;;;; +102D0;CARIAN LETTER UUU3;Lo;0;L;;;;;N;;;;; +102E0;COPTIC EPACT THOUSANDS MARK;Mn;220;NSM;;;;;N;;;;; +102E1;COPTIC EPACT DIGIT ONE;No;0;EN;;;;1;N;;;;; +102E2;COPTIC EPACT DIGIT TWO;No;0;EN;;;;2;N;;;;; +102E3;COPTIC EPACT DIGIT THREE;No;0;EN;;;;3;N;;;;; +102E4;COPTIC EPACT DIGIT FOUR;No;0;EN;;;;4;N;;;;; +102E5;COPTIC EPACT DIGIT FIVE;No;0;EN;;;;5;N;;;;; +102E6;COPTIC EPACT DIGIT SIX;No;0;EN;;;;6;N;;;;; +102E7;COPTIC EPACT DIGIT SEVEN;No;0;EN;;;;7;N;;;;; +102E8;COPTIC EPACT DIGIT EIGHT;No;0;EN;;;;8;N;;;;; +102E9;COPTIC EPACT DIGIT NINE;No;0;EN;;;;9;N;;;;; +102EA;COPTIC EPACT NUMBER TEN;No;0;EN;;;;10;N;;;;; +102EB;COPTIC EPACT NUMBER TWENTY;No;0;EN;;;;20;N;;;;; +102EC;COPTIC EPACT NUMBER THIRTY;No;0;EN;;;;30;N;;;;; +102ED;COPTIC EPACT NUMBER FORTY;No;0;EN;;;;40;N;;;;; +102EE;COPTIC EPACT NUMBER FIFTY;No;0;EN;;;;50;N;;;;; +102EF;COPTIC EPACT NUMBER SIXTY;No;0;EN;;;;60;N;;;;; +102F0;COPTIC EPACT NUMBER SEVENTY;No;0;EN;;;;70;N;;;;; +102F1;COPTIC EPACT NUMBER EIGHTY;No;0;EN;;;;80;N;;;;; +102F2;COPTIC EPACT NUMBER NINETY;No;0;EN;;;;90;N;;;;; +102F3;COPTIC EPACT NUMBER ONE HUNDRED;No;0;EN;;;;100;N;;;;; +102F4;COPTIC EPACT NUMBER TWO HUNDRED;No;0;EN;;;;200;N;;;;; +102F5;COPTIC EPACT NUMBER THREE HUNDRED;No;0;EN;;;;300;N;;;;; +102F6;COPTIC EPACT NUMBER FOUR HUNDRED;No;0;EN;;;;400;N;;;;; +102F7;COPTIC EPACT NUMBER FIVE HUNDRED;No;0;EN;;;;500;N;;;;; +102F8;COPTIC EPACT NUMBER SIX HUNDRED;No;0;EN;;;;600;N;;;;; +102F9;COPTIC EPACT NUMBER SEVEN HUNDRED;No;0;EN;;;;700;N;;;;; +102FA;COPTIC EPACT NUMBER EIGHT HUNDRED;No;0;EN;;;;800;N;;;;; +102FB;COPTIC EPACT NUMBER NINE HUNDRED;No;0;EN;;;;900;N;;;;; +10300;OLD ITALIC LETTER A;Lo;0;L;;;;;N;;;;; +10301;OLD ITALIC LETTER BE;Lo;0;L;;;;;N;;;;; +10302;OLD ITALIC LETTER KE;Lo;0;L;;;;;N;;;;; +10303;OLD ITALIC LETTER DE;Lo;0;L;;;;;N;;;;; +10304;OLD ITALIC LETTER E;Lo;0;L;;;;;N;;;;; +10305;OLD ITALIC LETTER VE;Lo;0;L;;;;;N;;;;; +10306;OLD ITALIC LETTER ZE;Lo;0;L;;;;;N;;;;; +10307;OLD ITALIC LETTER HE;Lo;0;L;;;;;N;;;;; +10308;OLD ITALIC LETTER THE;Lo;0;L;;;;;N;;;;; +10309;OLD ITALIC LETTER I;Lo;0;L;;;;;N;;;;; +1030A;OLD ITALIC LETTER KA;Lo;0;L;;;;;N;;;;; +1030B;OLD ITALIC LETTER EL;Lo;0;L;;;;;N;;;;; +1030C;OLD ITALIC LETTER EM;Lo;0;L;;;;;N;;;;; +1030D;OLD ITALIC LETTER EN;Lo;0;L;;;;;N;;;;; +1030E;OLD ITALIC LETTER ESH;Lo;0;L;;;;;N;;;;; +1030F;OLD ITALIC LETTER O;Lo;0;L;;;;;N;;;;; +10310;OLD ITALIC LETTER PE;Lo;0;L;;;;;N;;;;; +10311;OLD ITALIC LETTER SHE;Lo;0;L;;;;;N;;;;; +10312;OLD ITALIC LETTER KU;Lo;0;L;;;;;N;;;;; +10313;OLD ITALIC LETTER ER;Lo;0;L;;;;;N;;;;; +10314;OLD ITALIC LETTER ES;Lo;0;L;;;;;N;;;;; +10315;OLD ITALIC LETTER TE;Lo;0;L;;;;;N;;;;; +10316;OLD ITALIC LETTER U;Lo;0;L;;;;;N;;;;; +10317;OLD ITALIC LETTER EKS;Lo;0;L;;;;;N;;;;; +10318;OLD ITALIC LETTER PHE;Lo;0;L;;;;;N;;;;; +10319;OLD ITALIC LETTER KHE;Lo;0;L;;;;;N;;;;; +1031A;OLD ITALIC LETTER EF;Lo;0;L;;;;;N;;;;; +1031B;OLD ITALIC LETTER ERS;Lo;0;L;;;;;N;;;;; +1031C;OLD ITALIC LETTER CHE;Lo;0;L;;;;;N;;;;; +1031D;OLD ITALIC LETTER II;Lo;0;L;;;;;N;;;;; +1031E;OLD ITALIC LETTER UU;Lo;0;L;;;;;N;;;;; +1031F;OLD ITALIC LETTER ESS;Lo;0;L;;;;;N;;;;; +10320;OLD ITALIC NUMERAL ONE;No;0;L;;;;1;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;;;;; +10333;GOTHIC LETTER DAGS;Lo;0;L;;;;;N;;;;; +10334;GOTHIC LETTER AIHVUS;Lo;0;L;;;;;N;;;;; +10335;GOTHIC LETTER QAIRTHRA;Lo;0;L;;;;;N;;;;; +10336;GOTHIC LETTER IUJA;Lo;0;L;;;;;N;;;;; +10337;GOTHIC LETTER HAGL;Lo;0;L;;;;;N;;;;; +10338;GOTHIC LETTER THIUTH;Lo;0;L;;;;;N;;;;; +10339;GOTHIC LETTER EIS;Lo;0;L;;;;;N;;;;; +1033A;GOTHIC LETTER KUSMA;Lo;0;L;;;;;N;;;;; +1033B;GOTHIC LETTER LAGUS;Lo;0;L;;;;;N;;;;; +1033C;GOTHIC LETTER MANNA;Lo;0;L;;;;;N;;;;; +1033D;GOTHIC LETTER NAUTHS;Lo;0;L;;;;;N;;;;; +1033E;GOTHIC LETTER JER;Lo;0;L;;;;;N;;;;; +1033F;GOTHIC LETTER URUS;Lo;0;L;;;;;N;;;;; +10340;GOTHIC LETTER PAIRTHRA;Lo;0;L;;;;;N;;;;; +10341;GOTHIC LETTER NINETY;Nl;0;L;;;;90;N;;;;; +10342;GOTHIC LETTER RAIDA;Lo;0;L;;;;;N;;;;; +10343;GOTHIC LETTER SAUIL;Lo;0;L;;;;;N;;;;; +10344;GOTHIC LETTER TEIWS;Lo;0;L;;;;;N;;;;; +10345;GOTHIC LETTER WINJA;Lo;0;L;;;;;N;;;;; +10346;GOTHIC LETTER FAIHU;Lo;0;L;;;;;N;;;;; +10347;GOTHIC LETTER IGGWS;Lo;0;L;;;;;N;;;;; +10348;GOTHIC LETTER HWAIR;Lo;0;L;;;;;N;;;;; +10349;GOTHIC LETTER OTHAL;Lo;0;L;;;;;N;;;;; +1034A;GOTHIC LETTER NINE HUNDRED;Nl;0;L;;;;900;N;;;;; +10350;OLD PERMIC LETTER AN;Lo;0;L;;;;;N;;;;; +10351;OLD PERMIC LETTER BUR;Lo;0;L;;;;;N;;;;; +10352;OLD PERMIC LETTER GAI;Lo;0;L;;;;;N;;;;; +10353;OLD PERMIC LETTER DOI;Lo;0;L;;;;;N;;;;; +10354;OLD PERMIC LETTER E;Lo;0;L;;;;;N;;;;; +10355;OLD PERMIC LETTER ZHOI;Lo;0;L;;;;;N;;;;; +10356;OLD PERMIC LETTER DZHOI;Lo;0;L;;;;;N;;;;; +10357;OLD PERMIC LETTER ZATA;Lo;0;L;;;;;N;;;;; +10358;OLD PERMIC LETTER DZITA;Lo;0;L;;;;;N;;;;; +10359;OLD PERMIC LETTER I;Lo;0;L;;;;;N;;;;; +1035A;OLD PERMIC LETTER KOKE;Lo;0;L;;;;;N;;;;; +1035B;OLD PERMIC LETTER LEI;Lo;0;L;;;;;N;;;;; +1035C;OLD PERMIC LETTER MENOE;Lo;0;L;;;;;N;;;;; +1035D;OLD PERMIC LETTER NENOE;Lo;0;L;;;;;N;;;;; +1035E;OLD PERMIC LETTER VOOI;Lo;0;L;;;;;N;;;;; +1035F;OLD PERMIC LETTER PEEI;Lo;0;L;;;;;N;;;;; +10360;OLD PERMIC LETTER REI;Lo;0;L;;;;;N;;;;; +10361;OLD PERMIC LETTER SII;Lo;0;L;;;;;N;;;;; +10362;OLD PERMIC LETTER TAI;Lo;0;L;;;;;N;;;;; +10363;OLD PERMIC LETTER U;Lo;0;L;;;;;N;;;;; +10364;OLD PERMIC LETTER CHERY;Lo;0;L;;;;;N;;;;; +10365;OLD PERMIC LETTER SHOOI;Lo;0;L;;;;;N;;;;; +10366;OLD PERMIC LETTER SHCHOOI;Lo;0;L;;;;;N;;;;; +10367;OLD PERMIC LETTER YRY;Lo;0;L;;;;;N;;;;; +10368;OLD PERMIC LETTER YERU;Lo;0;L;;;;;N;;;;; +10369;OLD PERMIC LETTER O;Lo;0;L;;;;;N;;;;; +1036A;OLD PERMIC LETTER OO;Lo;0;L;;;;;N;;;;; +1036B;OLD PERMIC LETTER EF;Lo;0;L;;;;;N;;;;; +1036C;OLD PERMIC LETTER HA;Lo;0;L;;;;;N;;;;; +1036D;OLD PERMIC LETTER TSIU;Lo;0;L;;;;;N;;;;; +1036E;OLD PERMIC LETTER VER;Lo;0;L;;;;;N;;;;; +1036F;OLD PERMIC LETTER YER;Lo;0;L;;;;;N;;;;; +10370;OLD PERMIC LETTER YERI;Lo;0;L;;;;;N;;;;; +10371;OLD PERMIC LETTER YAT;Lo;0;L;;;;;N;;;;; +10372;OLD PERMIC LETTER IE;Lo;0;L;;;;;N;;;;; +10373;OLD PERMIC LETTER YU;Lo;0;L;;;;;N;;;;; +10374;OLD PERMIC LETTER YA;Lo;0;L;;;;;N;;;;; +10375;OLD PERMIC LETTER IA;Lo;0;L;;;;;N;;;;; +10376;COMBINING OLD PERMIC LETTER AN;Mn;230;NSM;;;;;N;;;;; +10377;COMBINING OLD PERMIC LETTER DOI;Mn;230;NSM;;;;;N;;;;; +10378;COMBINING OLD PERMIC LETTER ZATA;Mn;230;NSM;;;;;N;;;;; +10379;COMBINING OLD PERMIC LETTER NENOE;Mn;230;NSM;;;;;N;;;;; +1037A;COMBINING OLD PERMIC LETTER SII;Mn;230;NSM;;;;;N;;;;; +10380;UGARITIC LETTER ALPA;Lo;0;L;;;;;N;;;;; +10381;UGARITIC LETTER BETA;Lo;0;L;;;;;N;;;;; +10382;UGARITIC LETTER GAMLA;Lo;0;L;;;;;N;;;;; +10383;UGARITIC LETTER KHA;Lo;0;L;;;;;N;;;;; +10384;UGARITIC LETTER DELTA;Lo;0;L;;;;;N;;;;; +10385;UGARITIC LETTER HO;Lo;0;L;;;;;N;;;;; +10386;UGARITIC LETTER WO;Lo;0;L;;;;;N;;;;; +10387;UGARITIC LETTER ZETA;Lo;0;L;;;;;N;;;;; +10388;UGARITIC LETTER HOTA;Lo;0;L;;;;;N;;;;; +10389;UGARITIC LETTER TET;Lo;0;L;;;;;N;;;;; +1038A;UGARITIC LETTER YOD;Lo;0;L;;;;;N;;;;; +1038B;UGARITIC LETTER KAF;Lo;0;L;;;;;N;;;;; +1038C;UGARITIC LETTER SHIN;Lo;0;L;;;;;N;;;;; +1038D;UGARITIC LETTER LAMDA;Lo;0;L;;;;;N;;;;; +1038E;UGARITIC LETTER MEM;Lo;0;L;;;;;N;;;;; +1038F;UGARITIC LETTER DHAL;Lo;0;L;;;;;N;;;;; +10390;UGARITIC LETTER NUN;Lo;0;L;;;;;N;;;;; +10391;UGARITIC LETTER ZU;Lo;0;L;;;;;N;;;;; +10392;UGARITIC LETTER SAMKA;Lo;0;L;;;;;N;;;;; +10393;UGARITIC LETTER AIN;Lo;0;L;;;;;N;;;;; +10394;UGARITIC LETTER PU;Lo;0;L;;;;;N;;;;; +10395;UGARITIC LETTER SADE;Lo;0;L;;;;;N;;;;; +10396;UGARITIC LETTER QOPA;Lo;0;L;;;;;N;;;;; +10397;UGARITIC LETTER RASHA;Lo;0;L;;;;;N;;;;; +10398;UGARITIC LETTER THANNA;Lo;0;L;;;;;N;;;;; +10399;UGARITIC LETTER GHAIN;Lo;0;L;;;;;N;;;;; +1039A;UGARITIC LETTER TO;Lo;0;L;;;;;N;;;;; +1039B;UGARITIC LETTER I;Lo;0;L;;;;;N;;;;; +1039C;UGARITIC LETTER U;Lo;0;L;;;;;N;;;;; +1039D;UGARITIC LETTER SSU;Lo;0;L;;;;;N;;;;; +1039F;UGARITIC WORD DIVIDER;Po;0;L;;;;;N;;;;; +103A0;OLD PERSIAN SIGN A;Lo;0;L;;;;;N;;;;; +103A1;OLD PERSIAN SIGN I;Lo;0;L;;;;;N;;;;; +103A2;OLD PERSIAN SIGN U;Lo;0;L;;;;;N;;;;; +103A3;OLD PERSIAN SIGN KA;Lo;0;L;;;;;N;;;;; +103A4;OLD PERSIAN SIGN KU;Lo;0;L;;;;;N;;;;; +103A5;OLD PERSIAN SIGN GA;Lo;0;L;;;;;N;;;;; +103A6;OLD PERSIAN SIGN GU;Lo;0;L;;;;;N;;;;; +103A7;OLD PERSIAN SIGN XA;Lo;0;L;;;;;N;;;;; +103A8;OLD PERSIAN SIGN CA;Lo;0;L;;;;;N;;;;; +103A9;OLD PERSIAN SIGN JA;Lo;0;L;;;;;N;;;;; +103AA;OLD PERSIAN SIGN JI;Lo;0;L;;;;;N;;;;; +103AB;OLD PERSIAN SIGN TA;Lo;0;L;;;;;N;;;;; +103AC;OLD PERSIAN SIGN TU;Lo;0;L;;;;;N;;;;; +103AD;OLD PERSIAN SIGN DA;Lo;0;L;;;;;N;;;;; +103AE;OLD PERSIAN SIGN DI;Lo;0;L;;;;;N;;;;; +103AF;OLD PERSIAN SIGN DU;Lo;0;L;;;;;N;;;;; +103B0;OLD PERSIAN SIGN THA;Lo;0;L;;;;;N;;;;; +103B1;OLD PERSIAN SIGN PA;Lo;0;L;;;;;N;;;;; +103B2;OLD PERSIAN SIGN BA;Lo;0;L;;;;;N;;;;; +103B3;OLD PERSIAN SIGN FA;Lo;0;L;;;;;N;;;;; +103B4;OLD PERSIAN SIGN NA;Lo;0;L;;;;;N;;;;; +103B5;OLD PERSIAN SIGN NU;Lo;0;L;;;;;N;;;;; +103B6;OLD PERSIAN SIGN MA;Lo;0;L;;;;;N;;;;; +103B7;OLD PERSIAN SIGN MI;Lo;0;L;;;;;N;;;;; +103B8;OLD PERSIAN SIGN MU;Lo;0;L;;;;;N;;;;; +103B9;OLD PERSIAN SIGN YA;Lo;0;L;;;;;N;;;;; +103BA;OLD PERSIAN SIGN VA;Lo;0;L;;;;;N;;;;; +103BB;OLD PERSIAN SIGN VI;Lo;0;L;;;;;N;;;;; +103BC;OLD PERSIAN SIGN RA;Lo;0;L;;;;;N;;;;; +103BD;OLD PERSIAN SIGN RU;Lo;0;L;;;;;N;;;;; +103BE;OLD PERSIAN SIGN LA;Lo;0;L;;;;;N;;;;; +103BF;OLD PERSIAN SIGN SA;Lo;0;L;;;;;N;;;;; +103C0;OLD PERSIAN SIGN ZA;Lo;0;L;;;;;N;;;;; +103C1;OLD PERSIAN SIGN SHA;Lo;0;L;;;;;N;;;;; +103C2;OLD PERSIAN SIGN SSA;Lo;0;L;;;;;N;;;;; +103C3;OLD PERSIAN SIGN HA;Lo;0;L;;;;;N;;;;; +103C8;OLD PERSIAN SIGN AURAMAZDAA;Lo;0;L;;;;;N;;;;; +103C9;OLD PERSIAN SIGN AURAMAZDAA-2;Lo;0;L;;;;;N;;;;; +103CA;OLD PERSIAN SIGN AURAMAZDAAHA;Lo;0;L;;;;;N;;;;; +103CB;OLD PERSIAN SIGN XSHAAYATHIYA;Lo;0;L;;;;;N;;;;; +103CC;OLD PERSIAN SIGN DAHYAAUSH;Lo;0;L;;;;;N;;;;; +103CD;OLD PERSIAN SIGN DAHYAAUSH-2;Lo;0;L;;;;;N;;;;; +103CE;OLD PERSIAN SIGN BAGA;Lo;0;L;;;;;N;;;;; +103CF;OLD PERSIAN SIGN BUUMISH;Lo;0;L;;;;;N;;;;; +103D0;OLD PERSIAN WORD DIVIDER;Po;0;L;;;;;N;;;;; +103D1;OLD PERSIAN NUMBER ONE;Nl;0;L;;;;1;N;;;;; +103D2;OLD PERSIAN NUMBER TWO;Nl;0;L;;;;2;N;;;;; +103D3;OLD PERSIAN NUMBER TEN;Nl;0;L;;;;10;N;;;;; +103D4;OLD PERSIAN NUMBER TWENTY;Nl;0;L;;;;20;N;;;;; +103D5;OLD PERSIAN NUMBER HUNDRED;Nl;0;L;;;;100;N;;;;; +10400;DESERET CAPITAL LETTER LONG I;Lu;0;L;;;;;N;;;;10428; +10401;DESERET CAPITAL LETTER LONG E;Lu;0;L;;;;;N;;;;10429; +10402;DESERET CAPITAL LETTER LONG A;Lu;0;L;;;;;N;;;;1042A; +10403;DESERET CAPITAL LETTER LONG AH;Lu;0;L;;;;;N;;;;1042B; +10404;DESERET CAPITAL LETTER LONG O;Lu;0;L;;;;;N;;;;1042C; +10405;DESERET CAPITAL LETTER LONG OO;Lu;0;L;;;;;N;;;;1042D; +10406;DESERET CAPITAL LETTER SHORT I;Lu;0;L;;;;;N;;;;1042E; +10407;DESERET CAPITAL LETTER SHORT E;Lu;0;L;;;;;N;;;;1042F; +10408;DESERET CAPITAL LETTER SHORT A;Lu;0;L;;;;;N;;;;10430; +10409;DESERET CAPITAL LETTER SHORT AH;Lu;0;L;;;;;N;;;;10431; +1040A;DESERET CAPITAL LETTER SHORT O;Lu;0;L;;;;;N;;;;10432; +1040B;DESERET CAPITAL LETTER SHORT OO;Lu;0;L;;;;;N;;;;10433; +1040C;DESERET CAPITAL LETTER AY;Lu;0;L;;;;;N;;;;10434; +1040D;DESERET CAPITAL LETTER OW;Lu;0;L;;;;;N;;;;10435; +1040E;DESERET CAPITAL LETTER WU;Lu;0;L;;;;;N;;;;10436; +1040F;DESERET CAPITAL LETTER YEE;Lu;0;L;;;;;N;;;;10437; +10410;DESERET CAPITAL LETTER H;Lu;0;L;;;;;N;;;;10438; +10411;DESERET CAPITAL LETTER PEE;Lu;0;L;;;;;N;;;;10439; +10412;DESERET CAPITAL LETTER BEE;Lu;0;L;;;;;N;;;;1043A; +10413;DESERET CAPITAL LETTER TEE;Lu;0;L;;;;;N;;;;1043B; +10414;DESERET CAPITAL LETTER DEE;Lu;0;L;;;;;N;;;;1043C; +10415;DESERET CAPITAL LETTER CHEE;Lu;0;L;;;;;N;;;;1043D; +10416;DESERET CAPITAL LETTER JEE;Lu;0;L;;;;;N;;;;1043E; +10417;DESERET CAPITAL LETTER KAY;Lu;0;L;;;;;N;;;;1043F; +10418;DESERET CAPITAL LETTER GAY;Lu;0;L;;;;;N;;;;10440; +10419;DESERET CAPITAL LETTER EF;Lu;0;L;;;;;N;;;;10441; +1041A;DESERET CAPITAL LETTER VEE;Lu;0;L;;;;;N;;;;10442; +1041B;DESERET CAPITAL LETTER ETH;Lu;0;L;;;;;N;;;;10443; +1041C;DESERET CAPITAL LETTER THEE;Lu;0;L;;;;;N;;;;10444; +1041D;DESERET CAPITAL LETTER ES;Lu;0;L;;;;;N;;;;10445; +1041E;DESERET CAPITAL LETTER ZEE;Lu;0;L;;;;;N;;;;10446; +1041F;DESERET CAPITAL LETTER ESH;Lu;0;L;;;;;N;;;;10447; +10420;DESERET CAPITAL LETTER ZHEE;Lu;0;L;;;;;N;;;;10448; +10421;DESERET CAPITAL LETTER ER;Lu;0;L;;;;;N;;;;10449; +10422;DESERET CAPITAL LETTER EL;Lu;0;L;;;;;N;;;;1044A; +10423;DESERET CAPITAL LETTER EM;Lu;0;L;;;;;N;;;;1044B; +10424;DESERET CAPITAL LETTER EN;Lu;0;L;;;;;N;;;;1044C; +10425;DESERET CAPITAL LETTER ENG;Lu;0;L;;;;;N;;;;1044D; +10426;DESERET CAPITAL LETTER OI;Lu;0;L;;;;;N;;;;1044E; +10427;DESERET CAPITAL LETTER EW;Lu;0;L;;;;;N;;;;1044F; +10428;DESERET SMALL LETTER LONG I;Ll;0;L;;;;;N;;;10400;;10400 +10429;DESERET SMALL LETTER LONG E;Ll;0;L;;;;;N;;;10401;;10401 +1042A;DESERET SMALL LETTER LONG A;Ll;0;L;;;;;N;;;10402;;10402 +1042B;DESERET SMALL LETTER LONG AH;Ll;0;L;;;;;N;;;10403;;10403 +1042C;DESERET SMALL LETTER LONG O;Ll;0;L;;;;;N;;;10404;;10404 +1042D;DESERET SMALL LETTER LONG OO;Ll;0;L;;;;;N;;;10405;;10405 +1042E;DESERET SMALL LETTER SHORT I;Ll;0;L;;;;;N;;;10406;;10406 +1042F;DESERET SMALL LETTER SHORT E;Ll;0;L;;;;;N;;;10407;;10407 +10430;DESERET SMALL LETTER SHORT A;Ll;0;L;;;;;N;;;10408;;10408 +10431;DESERET SMALL LETTER SHORT AH;Ll;0;L;;;;;N;;;10409;;10409 +10432;DESERET SMALL LETTER SHORT O;Ll;0;L;;;;;N;;;1040A;;1040A +10433;DESERET SMALL LETTER SHORT OO;Ll;0;L;;;;;N;;;1040B;;1040B +10434;DESERET SMALL LETTER AY;Ll;0;L;;;;;N;;;1040C;;1040C +10435;DESERET SMALL LETTER OW;Ll;0;L;;;;;N;;;1040D;;1040D +10436;DESERET SMALL LETTER WU;Ll;0;L;;;;;N;;;1040E;;1040E +10437;DESERET SMALL LETTER YEE;Ll;0;L;;;;;N;;;1040F;;1040F +10438;DESERET SMALL LETTER H;Ll;0;L;;;;;N;;;10410;;10410 +10439;DESERET SMALL LETTER PEE;Ll;0;L;;;;;N;;;10411;;10411 +1043A;DESERET SMALL LETTER BEE;Ll;0;L;;;;;N;;;10412;;10412 +1043B;DESERET SMALL LETTER TEE;Ll;0;L;;;;;N;;;10413;;10413 +1043C;DESERET SMALL LETTER DEE;Ll;0;L;;;;;N;;;10414;;10414 +1043D;DESERET SMALL LETTER CHEE;Ll;0;L;;;;;N;;;10415;;10415 +1043E;DESERET SMALL LETTER JEE;Ll;0;L;;;;;N;;;10416;;10416 +1043F;DESERET SMALL LETTER KAY;Ll;0;L;;;;;N;;;10417;;10417 +10440;DESERET SMALL LETTER GAY;Ll;0;L;;;;;N;;;10418;;10418 +10441;DESERET SMALL LETTER EF;Ll;0;L;;;;;N;;;10419;;10419 +10442;DESERET SMALL LETTER VEE;Ll;0;L;;;;;N;;;1041A;;1041A +10443;DESERET SMALL LETTER ETH;Ll;0;L;;;;;N;;;1041B;;1041B +10444;DESERET SMALL LETTER THEE;Ll;0;L;;;;;N;;;1041C;;1041C +10445;DESERET SMALL LETTER ES;Ll;0;L;;;;;N;;;1041D;;1041D +10446;DESERET SMALL LETTER ZEE;Ll;0;L;;;;;N;;;1041E;;1041E +10447;DESERET SMALL LETTER ESH;Ll;0;L;;;;;N;;;1041F;;1041F +10448;DESERET SMALL LETTER ZHEE;Ll;0;L;;;;;N;;;10420;;10420 +10449;DESERET SMALL LETTER ER;Ll;0;L;;;;;N;;;10421;;10421 +1044A;DESERET SMALL LETTER EL;Ll;0;L;;;;;N;;;10422;;10422 +1044B;DESERET SMALL LETTER EM;Ll;0;L;;;;;N;;;10423;;10423 +1044C;DESERET SMALL LETTER EN;Ll;0;L;;;;;N;;;10424;;10424 +1044D;DESERET SMALL LETTER ENG;Ll;0;L;;;;;N;;;10425;;10425 +1044E;DESERET SMALL LETTER OI;Ll;0;L;;;;;N;;;10426;;10426 +1044F;DESERET SMALL LETTER EW;Ll;0;L;;;;;N;;;10427;;10427 +10450;SHAVIAN LETTER PEEP;Lo;0;L;;;;;N;;;;; +10451;SHAVIAN LETTER TOT;Lo;0;L;;;;;N;;;;; +10452;SHAVIAN LETTER KICK;Lo;0;L;;;;;N;;;;; +10453;SHAVIAN LETTER FEE;Lo;0;L;;;;;N;;;;; +10454;SHAVIAN LETTER THIGH;Lo;0;L;;;;;N;;;;; +10455;SHAVIAN LETTER SO;Lo;0;L;;;;;N;;;;; +10456;SHAVIAN LETTER SURE;Lo;0;L;;;;;N;;;;; +10457;SHAVIAN LETTER CHURCH;Lo;0;L;;;;;N;;;;; +10458;SHAVIAN LETTER YEA;Lo;0;L;;;;;N;;;;; +10459;SHAVIAN LETTER HUNG;Lo;0;L;;;;;N;;;;; +1045A;SHAVIAN LETTER BIB;Lo;0;L;;;;;N;;;;; +1045B;SHAVIAN LETTER DEAD;Lo;0;L;;;;;N;;;;; +1045C;SHAVIAN LETTER GAG;Lo;0;L;;;;;N;;;;; +1045D;SHAVIAN LETTER VOW;Lo;0;L;;;;;N;;;;; +1045E;SHAVIAN LETTER THEY;Lo;0;L;;;;;N;;;;; +1045F;SHAVIAN LETTER ZOO;Lo;0;L;;;;;N;;;;; +10460;SHAVIAN LETTER MEASURE;Lo;0;L;;;;;N;;;;; +10461;SHAVIAN LETTER JUDGE;Lo;0;L;;;;;N;;;;; +10462;SHAVIAN LETTER WOE;Lo;0;L;;;;;N;;;;; +10463;SHAVIAN LETTER HA-HA;Lo;0;L;;;;;N;;;;; +10464;SHAVIAN LETTER LOLL;Lo;0;L;;;;;N;;;;; +10465;SHAVIAN LETTER MIME;Lo;0;L;;;;;N;;;;; +10466;SHAVIAN LETTER IF;Lo;0;L;;;;;N;;;;; +10467;SHAVIAN LETTER EGG;Lo;0;L;;;;;N;;;;; +10468;SHAVIAN LETTER ASH;Lo;0;L;;;;;N;;;;; +10469;SHAVIAN LETTER ADO;Lo;0;L;;;;;N;;;;; +1046A;SHAVIAN LETTER ON;Lo;0;L;;;;;N;;;;; +1046B;SHAVIAN LETTER WOOL;Lo;0;L;;;;;N;;;;; +1046C;SHAVIAN LETTER OUT;Lo;0;L;;;;;N;;;;; +1046D;SHAVIAN LETTER AH;Lo;0;L;;;;;N;;;;; +1046E;SHAVIAN LETTER ROAR;Lo;0;L;;;;;N;;;;; +1046F;SHAVIAN LETTER NUN;Lo;0;L;;;;;N;;;;; +10470;SHAVIAN LETTER EAT;Lo;0;L;;;;;N;;;;; +10471;SHAVIAN LETTER AGE;Lo;0;L;;;;;N;;;;; +10472;SHAVIAN LETTER ICE;Lo;0;L;;;;;N;;;;; +10473;SHAVIAN LETTER UP;Lo;0;L;;;;;N;;;;; +10474;SHAVIAN LETTER OAK;Lo;0;L;;;;;N;;;;; +10475;SHAVIAN LETTER OOZE;Lo;0;L;;;;;N;;;;; +10476;SHAVIAN LETTER OIL;Lo;0;L;;;;;N;;;;; +10477;SHAVIAN LETTER AWE;Lo;0;L;;;;;N;;;;; +10478;SHAVIAN LETTER ARE;Lo;0;L;;;;;N;;;;; +10479;SHAVIAN LETTER OR;Lo;0;L;;;;;N;;;;; +1047A;SHAVIAN LETTER AIR;Lo;0;L;;;;;N;;;;; +1047B;SHAVIAN LETTER ERR;Lo;0;L;;;;;N;;;;; +1047C;SHAVIAN LETTER ARRAY;Lo;0;L;;;;;N;;;;; +1047D;SHAVIAN LETTER EAR;Lo;0;L;;;;;N;;;;; +1047E;SHAVIAN LETTER IAN;Lo;0;L;;;;;N;;;;; +1047F;SHAVIAN LETTER YEW;Lo;0;L;;;;;N;;;;; +10480;OSMANYA LETTER ALEF;Lo;0;L;;;;;N;;;;; +10481;OSMANYA LETTER BA;Lo;0;L;;;;;N;;;;; +10482;OSMANYA LETTER TA;Lo;0;L;;;;;N;;;;; +10483;OSMANYA LETTER JA;Lo;0;L;;;;;N;;;;; +10484;OSMANYA LETTER XA;Lo;0;L;;;;;N;;;;; +10485;OSMANYA LETTER KHA;Lo;0;L;;;;;N;;;;; +10486;OSMANYA LETTER DEEL;Lo;0;L;;;;;N;;;;; +10487;OSMANYA LETTER RA;Lo;0;L;;;;;N;;;;; +10488;OSMANYA LETTER SA;Lo;0;L;;;;;N;;;;; +10489;OSMANYA LETTER SHIIN;Lo;0;L;;;;;N;;;;; +1048A;OSMANYA LETTER DHA;Lo;0;L;;;;;N;;;;; +1048B;OSMANYA LETTER CAYN;Lo;0;L;;;;;N;;;;; +1048C;OSMANYA LETTER GA;Lo;0;L;;;;;N;;;;; +1048D;OSMANYA LETTER FA;Lo;0;L;;;;;N;;;;; +1048E;OSMANYA LETTER QAAF;Lo;0;L;;;;;N;;;;; +1048F;OSMANYA LETTER KAAF;Lo;0;L;;;;;N;;;;; +10490;OSMANYA LETTER LAAN;Lo;0;L;;;;;N;;;;; +10491;OSMANYA LETTER MIIN;Lo;0;L;;;;;N;;;;; +10492;OSMANYA LETTER NUUN;Lo;0;L;;;;;N;;;;; +10493;OSMANYA LETTER WAW;Lo;0;L;;;;;N;;;;; +10494;OSMANYA LETTER HA;Lo;0;L;;;;;N;;;;; +10495;OSMANYA LETTER YA;Lo;0;L;;;;;N;;;;; +10496;OSMANYA LETTER A;Lo;0;L;;;;;N;;;;; +10497;OSMANYA LETTER E;Lo;0;L;;;;;N;;;;; +10498;OSMANYA LETTER I;Lo;0;L;;;;;N;;;;; +10499;OSMANYA LETTER O;Lo;0;L;;;;;N;;;;; +1049A;OSMANYA LETTER U;Lo;0;L;;;;;N;;;;; +1049B;OSMANYA LETTER AA;Lo;0;L;;;;;N;;;;; +1049C;OSMANYA LETTER EE;Lo;0;L;;;;;N;;;;; +1049D;OSMANYA LETTER OO;Lo;0;L;;;;;N;;;;; +104A0;OSMANYA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +104A1;OSMANYA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +104A2;OSMANYA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +104A3;OSMANYA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +104A4;OSMANYA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +104A5;OSMANYA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +104A6;OSMANYA DIGIT SIX;Nd;0;L;;6;6;6;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;;;;; +10503;ELBASAN LETTER CHE;Lo;0;L;;;;;N;;;;; +10504;ELBASAN LETTER DE;Lo;0;L;;;;;N;;;;; +10505;ELBASAN LETTER NDE;Lo;0;L;;;;;N;;;;; +10506;ELBASAN LETTER DHE;Lo;0;L;;;;;N;;;;; +10507;ELBASAN LETTER EI;Lo;0;L;;;;;N;;;;; +10508;ELBASAN LETTER E;Lo;0;L;;;;;N;;;;; +10509;ELBASAN LETTER FE;Lo;0;L;;;;;N;;;;; +1050A;ELBASAN LETTER GE;Lo;0;L;;;;;N;;;;; +1050B;ELBASAN LETTER GJE;Lo;0;L;;;;;N;;;;; +1050C;ELBASAN LETTER HE;Lo;0;L;;;;;N;;;;; +1050D;ELBASAN LETTER I;Lo;0;L;;;;;N;;;;; +1050E;ELBASAN LETTER JE;Lo;0;L;;;;;N;;;;; +1050F;ELBASAN LETTER KE;Lo;0;L;;;;;N;;;;; +10510;ELBASAN LETTER LE;Lo;0;L;;;;;N;;;;; +10511;ELBASAN LETTER LLE;Lo;0;L;;;;;N;;;;; +10512;ELBASAN LETTER ME;Lo;0;L;;;;;N;;;;; +10513;ELBASAN LETTER NE;Lo;0;L;;;;;N;;;;; +10514;ELBASAN LETTER NA;Lo;0;L;;;;;N;;;;; +10515;ELBASAN LETTER NJE;Lo;0;L;;;;;N;;;;; +10516;ELBASAN LETTER O;Lo;0;L;;;;;N;;;;; +10517;ELBASAN LETTER PE;Lo;0;L;;;;;N;;;;; +10518;ELBASAN LETTER QE;Lo;0;L;;;;;N;;;;; +10519;ELBASAN LETTER RE;Lo;0;L;;;;;N;;;;; +1051A;ELBASAN LETTER RRE;Lo;0;L;;;;;N;;;;; +1051B;ELBASAN LETTER SE;Lo;0;L;;;;;N;;;;; +1051C;ELBASAN LETTER SHE;Lo;0;L;;;;;N;;;;; +1051D;ELBASAN LETTER TE;Lo;0;L;;;;;N;;;;; +1051E;ELBASAN LETTER THE;Lo;0;L;;;;;N;;;;; +1051F;ELBASAN LETTER U;Lo;0;L;;;;;N;;;;; +10520;ELBASAN LETTER VE;Lo;0;L;;;;;N;;;;; +10521;ELBASAN LETTER XE;Lo;0;L;;;;;N;;;;; +10522;ELBASAN LETTER Y;Lo;0;L;;;;;N;;;;; +10523;ELBASAN LETTER ZE;Lo;0;L;;;;;N;;;;; +10524;ELBASAN LETTER ZHE;Lo;0;L;;;;;N;;;;; +10525;ELBASAN LETTER GHE;Lo;0;L;;;;;N;;;;; +10526;ELBASAN LETTER GHAMMA;Lo;0;L;;;;;N;;;;; +10527;ELBASAN LETTER KHE;Lo;0;L;;;;;N;;;;; +10530;CAUCASIAN ALBANIAN LETTER ALT;Lo;0;L;;;;;N;;;;; +10531;CAUCASIAN ALBANIAN LETTER BET;Lo;0;L;;;;;N;;;;; +10532;CAUCASIAN ALBANIAN LETTER GIM;Lo;0;L;;;;;N;;;;; +10533;CAUCASIAN ALBANIAN LETTER DAT;Lo;0;L;;;;;N;;;;; +10534;CAUCASIAN ALBANIAN LETTER EB;Lo;0;L;;;;;N;;;;; +10535;CAUCASIAN ALBANIAN LETTER ZARL;Lo;0;L;;;;;N;;;;; +10536;CAUCASIAN ALBANIAN LETTER EYN;Lo;0;L;;;;;N;;;;; +10537;CAUCASIAN ALBANIAN LETTER ZHIL;Lo;0;L;;;;;N;;;;; +10538;CAUCASIAN ALBANIAN LETTER TAS;Lo;0;L;;;;;N;;;;; +10539;CAUCASIAN ALBANIAN LETTER CHA;Lo;0;L;;;;;N;;;;; +1053A;CAUCASIAN ALBANIAN LETTER YOWD;Lo;0;L;;;;;N;;;;; +1053B;CAUCASIAN ALBANIAN LETTER ZHA;Lo;0;L;;;;;N;;;;; +1053C;CAUCASIAN ALBANIAN LETTER IRB;Lo;0;L;;;;;N;;;;; +1053D;CAUCASIAN ALBANIAN LETTER SHA;Lo;0;L;;;;;N;;;;; +1053E;CAUCASIAN ALBANIAN LETTER LAN;Lo;0;L;;;;;N;;;;; +1053F;CAUCASIAN ALBANIAN LETTER INYA;Lo;0;L;;;;;N;;;;; +10540;CAUCASIAN ALBANIAN LETTER XEYN;Lo;0;L;;;;;N;;;;; +10541;CAUCASIAN ALBANIAN LETTER DYAN;Lo;0;L;;;;;N;;;;; +10542;CAUCASIAN ALBANIAN LETTER CAR;Lo;0;L;;;;;N;;;;; +10543;CAUCASIAN ALBANIAN LETTER JHOX;Lo;0;L;;;;;N;;;;; +10544;CAUCASIAN ALBANIAN LETTER KAR;Lo;0;L;;;;;N;;;;; +10545;CAUCASIAN ALBANIAN LETTER LYIT;Lo;0;L;;;;;N;;;;; +10546;CAUCASIAN ALBANIAN LETTER HEYT;Lo;0;L;;;;;N;;;;; +10547;CAUCASIAN ALBANIAN LETTER QAY;Lo;0;L;;;;;N;;;;; +10548;CAUCASIAN ALBANIAN LETTER AOR;Lo;0;L;;;;;N;;;;; +10549;CAUCASIAN ALBANIAN LETTER CHOY;Lo;0;L;;;;;N;;;;; +1054A;CAUCASIAN ALBANIAN LETTER CHI;Lo;0;L;;;;;N;;;;; +1054B;CAUCASIAN ALBANIAN LETTER CYAY;Lo;0;L;;;;;N;;;;; +1054C;CAUCASIAN ALBANIAN LETTER MAQ;Lo;0;L;;;;;N;;;;; +1054D;CAUCASIAN ALBANIAN LETTER QAR;Lo;0;L;;;;;N;;;;; +1054E;CAUCASIAN ALBANIAN LETTER NOWC;Lo;0;L;;;;;N;;;;; +1054F;CAUCASIAN ALBANIAN LETTER DZYAY;Lo;0;L;;;;;N;;;;; +10550;CAUCASIAN ALBANIAN LETTER SHAK;Lo;0;L;;;;;N;;;;; +10551;CAUCASIAN ALBANIAN LETTER JAYN;Lo;0;L;;;;;N;;;;; +10552;CAUCASIAN ALBANIAN LETTER ON;Lo;0;L;;;;;N;;;;; +10553;CAUCASIAN ALBANIAN LETTER TYAY;Lo;0;L;;;;;N;;;;; +10554;CAUCASIAN ALBANIAN LETTER FAM;Lo;0;L;;;;;N;;;;; +10555;CAUCASIAN ALBANIAN LETTER DZAY;Lo;0;L;;;;;N;;;;; +10556;CAUCASIAN ALBANIAN LETTER CHAT;Lo;0;L;;;;;N;;;;; +10557;CAUCASIAN ALBANIAN LETTER PEN;Lo;0;L;;;;;N;;;;; +10558;CAUCASIAN ALBANIAN LETTER GHEYS;Lo;0;L;;;;;N;;;;; +10559;CAUCASIAN ALBANIAN LETTER RAT;Lo;0;L;;;;;N;;;;; +1055A;CAUCASIAN ALBANIAN LETTER SEYK;Lo;0;L;;;;;N;;;;; +1055B;CAUCASIAN ALBANIAN LETTER VEYZ;Lo;0;L;;;;;N;;;;; +1055C;CAUCASIAN ALBANIAN LETTER TIWR;Lo;0;L;;;;;N;;;;; +1055D;CAUCASIAN ALBANIAN LETTER SHOY;Lo;0;L;;;;;N;;;;; +1055E;CAUCASIAN ALBANIAN LETTER IWN;Lo;0;L;;;;;N;;;;; +1055F;CAUCASIAN ALBANIAN LETTER CYAW;Lo;0;L;;;;;N;;;;; +10560;CAUCASIAN ALBANIAN LETTER CAYN;Lo;0;L;;;;;N;;;;; +10561;CAUCASIAN ALBANIAN LETTER YAYD;Lo;0;L;;;;;N;;;;; +10562;CAUCASIAN ALBANIAN LETTER PIWR;Lo;0;L;;;;;N;;;;; +10563;CAUCASIAN ALBANIAN LETTER KIW;Lo;0;L;;;;;N;;;;; +1056F;CAUCASIAN ALBANIAN CITATION MARK;Po;0;L;;;;;N;;;;; +10600;LINEAR A SIGN AB001;Lo;0;L;;;;;N;;;;; +10601;LINEAR A SIGN AB002;Lo;0;L;;;;;N;;;;; +10602;LINEAR A SIGN AB003;Lo;0;L;;;;;N;;;;; +10603;LINEAR A SIGN AB004;Lo;0;L;;;;;N;;;;; +10604;LINEAR A SIGN AB005;Lo;0;L;;;;;N;;;;; +10605;LINEAR A SIGN AB006;Lo;0;L;;;;;N;;;;; +10606;LINEAR A SIGN AB007;Lo;0;L;;;;;N;;;;; +10607;LINEAR A SIGN AB008;Lo;0;L;;;;;N;;;;; +10608;LINEAR A SIGN AB009;Lo;0;L;;;;;N;;;;; +10609;LINEAR A SIGN AB010;Lo;0;L;;;;;N;;;;; +1060A;LINEAR A SIGN AB011;Lo;0;L;;;;;N;;;;; +1060B;LINEAR A SIGN AB013;Lo;0;L;;;;;N;;;;; +1060C;LINEAR A SIGN AB016;Lo;0;L;;;;;N;;;;; +1060D;LINEAR A SIGN AB017;Lo;0;L;;;;;N;;;;; +1060E;LINEAR A SIGN AB020;Lo;0;L;;;;;N;;;;; +1060F;LINEAR A SIGN AB021;Lo;0;L;;;;;N;;;;; +10610;LINEAR A SIGN AB021F;Lo;0;L;;;;;N;;;;; +10611;LINEAR A SIGN AB021M;Lo;0;L;;;;;N;;;;; +10612;LINEAR A SIGN AB022;Lo;0;L;;;;;N;;;;; +10613;LINEAR A SIGN AB022F;Lo;0;L;;;;;N;;;;; +10614;LINEAR A SIGN AB022M;Lo;0;L;;;;;N;;;;; +10615;LINEAR A SIGN AB023;Lo;0;L;;;;;N;;;;; +10616;LINEAR A SIGN AB023M;Lo;0;L;;;;;N;;;;; +10617;LINEAR A SIGN AB024;Lo;0;L;;;;;N;;;;; +10618;LINEAR A SIGN AB026;Lo;0;L;;;;;N;;;;; +10619;LINEAR A SIGN AB027;Lo;0;L;;;;;N;;;;; +1061A;LINEAR A SIGN AB028;Lo;0;L;;;;;N;;;;; +1061B;LINEAR A SIGN A028B;Lo;0;L;;;;;N;;;;; +1061C;LINEAR A SIGN AB029;Lo;0;L;;;;;N;;;;; +1061D;LINEAR A SIGN AB030;Lo;0;L;;;;;N;;;;; +1061E;LINEAR A SIGN AB031;Lo;0;L;;;;;N;;;;; +1061F;LINEAR A SIGN AB034;Lo;0;L;;;;;N;;;;; +10620;LINEAR A SIGN AB037;Lo;0;L;;;;;N;;;;; +10621;LINEAR A SIGN AB038;Lo;0;L;;;;;N;;;;; +10622;LINEAR A SIGN AB039;Lo;0;L;;;;;N;;;;; +10623;LINEAR A SIGN AB040;Lo;0;L;;;;;N;;;;; +10624;LINEAR A SIGN AB041;Lo;0;L;;;;;N;;;;; +10625;LINEAR A SIGN AB044;Lo;0;L;;;;;N;;;;; +10626;LINEAR A SIGN AB045;Lo;0;L;;;;;N;;;;; +10627;LINEAR A SIGN AB046;Lo;0;L;;;;;N;;;;; +10628;LINEAR A SIGN AB047;Lo;0;L;;;;;N;;;;; +10629;LINEAR A SIGN AB048;Lo;0;L;;;;;N;;;;; +1062A;LINEAR A SIGN AB049;Lo;0;L;;;;;N;;;;; +1062B;LINEAR A SIGN AB050;Lo;0;L;;;;;N;;;;; +1062C;LINEAR A SIGN AB051;Lo;0;L;;;;;N;;;;; +1062D;LINEAR A SIGN AB053;Lo;0;L;;;;;N;;;;; +1062E;LINEAR A SIGN AB054;Lo;0;L;;;;;N;;;;; +1062F;LINEAR A SIGN AB055;Lo;0;L;;;;;N;;;;; +10630;LINEAR A SIGN AB056;Lo;0;L;;;;;N;;;;; +10631;LINEAR A SIGN AB057;Lo;0;L;;;;;N;;;;; +10632;LINEAR A SIGN AB058;Lo;0;L;;;;;N;;;;; +10633;LINEAR A SIGN AB059;Lo;0;L;;;;;N;;;;; +10634;LINEAR A SIGN AB060;Lo;0;L;;;;;N;;;;; +10635;LINEAR A SIGN AB061;Lo;0;L;;;;;N;;;;; +10636;LINEAR A SIGN AB065;Lo;0;L;;;;;N;;;;; +10637;LINEAR A SIGN AB066;Lo;0;L;;;;;N;;;;; +10638;LINEAR A SIGN AB067;Lo;0;L;;;;;N;;;;; +10639;LINEAR A SIGN AB069;Lo;0;L;;;;;N;;;;; +1063A;LINEAR A SIGN AB070;Lo;0;L;;;;;N;;;;; +1063B;LINEAR A SIGN AB073;Lo;0;L;;;;;N;;;;; +1063C;LINEAR A SIGN AB074;Lo;0;L;;;;;N;;;;; +1063D;LINEAR A SIGN AB076;Lo;0;L;;;;;N;;;;; +1063E;LINEAR A SIGN AB077;Lo;0;L;;;;;N;;;;; +1063F;LINEAR A SIGN AB078;Lo;0;L;;;;;N;;;;; +10640;LINEAR A SIGN AB079;Lo;0;L;;;;;N;;;;; +10641;LINEAR A SIGN AB080;Lo;0;L;;;;;N;;;;; +10642;LINEAR A SIGN AB081;Lo;0;L;;;;;N;;;;; +10643;LINEAR A SIGN AB082;Lo;0;L;;;;;N;;;;; +10644;LINEAR A SIGN AB085;Lo;0;L;;;;;N;;;;; +10645;LINEAR A SIGN AB086;Lo;0;L;;;;;N;;;;; +10646;LINEAR A SIGN AB087;Lo;0;L;;;;;N;;;;; +10647;LINEAR A SIGN A100-102;Lo;0;L;;;;;N;;;;; +10648;LINEAR A SIGN AB118;Lo;0;L;;;;;N;;;;; +10649;LINEAR A SIGN AB120;Lo;0;L;;;;;N;;;;; +1064A;LINEAR A SIGN A120B;Lo;0;L;;;;;N;;;;; +1064B;LINEAR A SIGN AB122;Lo;0;L;;;;;N;;;;; +1064C;LINEAR A SIGN AB123;Lo;0;L;;;;;N;;;;; +1064D;LINEAR A SIGN AB131A;Lo;0;L;;;;;N;;;;; +1064E;LINEAR A SIGN AB131B;Lo;0;L;;;;;N;;;;; +1064F;LINEAR A SIGN A131C;Lo;0;L;;;;;N;;;;; +10650;LINEAR A SIGN AB164;Lo;0;L;;;;;N;;;;; +10651;LINEAR A SIGN AB171;Lo;0;L;;;;;N;;;;; +10652;LINEAR A SIGN AB180;Lo;0;L;;;;;N;;;;; +10653;LINEAR A SIGN AB188;Lo;0;L;;;;;N;;;;; +10654;LINEAR A SIGN AB191;Lo;0;L;;;;;N;;;;; +10655;LINEAR A SIGN A301;Lo;0;L;;;;;N;;;;; +10656;LINEAR A SIGN A302;Lo;0;L;;;;;N;;;;; +10657;LINEAR A SIGN A303;Lo;0;L;;;;;N;;;;; +10658;LINEAR A SIGN A304;Lo;0;L;;;;;N;;;;; +10659;LINEAR A SIGN A305;Lo;0;L;;;;;N;;;;; +1065A;LINEAR A SIGN A306;Lo;0;L;;;;;N;;;;; +1065B;LINEAR A SIGN A307;Lo;0;L;;;;;N;;;;; +1065C;LINEAR A SIGN A308;Lo;0;L;;;;;N;;;;; +1065D;LINEAR A SIGN A309A;Lo;0;L;;;;;N;;;;; +1065E;LINEAR A SIGN A309B;Lo;0;L;;;;;N;;;;; +1065F;LINEAR A SIGN A309C;Lo;0;L;;;;;N;;;;; +10660;LINEAR A SIGN A310;Lo;0;L;;;;;N;;;;; +10661;LINEAR A SIGN A311;Lo;0;L;;;;;N;;;;; +10662;LINEAR A SIGN A312;Lo;0;L;;;;;N;;;;; +10663;LINEAR A SIGN A313A;Lo;0;L;;;;;N;;;;; +10664;LINEAR A SIGN A313B;Lo;0;L;;;;;N;;;;; +10665;LINEAR A SIGN A313C;Lo;0;L;;;;;N;;;;; +10666;LINEAR A SIGN A314;Lo;0;L;;;;;N;;;;; +10667;LINEAR A SIGN A315;Lo;0;L;;;;;N;;;;; +10668;LINEAR A SIGN A316;Lo;0;L;;;;;N;;;;; +10669;LINEAR A SIGN A317;Lo;0;L;;;;;N;;;;; +1066A;LINEAR A SIGN A318;Lo;0;L;;;;;N;;;;; +1066B;LINEAR A SIGN A319;Lo;0;L;;;;;N;;;;; +1066C;LINEAR A SIGN A320;Lo;0;L;;;;;N;;;;; +1066D;LINEAR A SIGN A321;Lo;0;L;;;;;N;;;;; +1066E;LINEAR A SIGN A322;Lo;0;L;;;;;N;;;;; +1066F;LINEAR A SIGN A323;Lo;0;L;;;;;N;;;;; +10670;LINEAR A SIGN A324;Lo;0;L;;;;;N;;;;; +10671;LINEAR A SIGN A325;Lo;0;L;;;;;N;;;;; +10672;LINEAR A SIGN A326;Lo;0;L;;;;;N;;;;; +10673;LINEAR A SIGN A327;Lo;0;L;;;;;N;;;;; +10674;LINEAR A SIGN A328;Lo;0;L;;;;;N;;;;; +10675;LINEAR A SIGN A329;Lo;0;L;;;;;N;;;;; +10676;LINEAR A SIGN A330;Lo;0;L;;;;;N;;;;; +10677;LINEAR A SIGN A331;Lo;0;L;;;;;N;;;;; +10678;LINEAR A SIGN A332;Lo;0;L;;;;;N;;;;; +10679;LINEAR A SIGN A333;Lo;0;L;;;;;N;;;;; +1067A;LINEAR A SIGN A334;Lo;0;L;;;;;N;;;;; +1067B;LINEAR A SIGN A335;Lo;0;L;;;;;N;;;;; +1067C;LINEAR A SIGN A336;Lo;0;L;;;;;N;;;;; +1067D;LINEAR A SIGN A337;Lo;0;L;;;;;N;;;;; +1067E;LINEAR A SIGN A338;Lo;0;L;;;;;N;;;;; +1067F;LINEAR A SIGN A339;Lo;0;L;;;;;N;;;;; +10680;LINEAR A SIGN A340;Lo;0;L;;;;;N;;;;; +10681;LINEAR A SIGN A341;Lo;0;L;;;;;N;;;;; +10682;LINEAR A SIGN A342;Lo;0;L;;;;;N;;;;; +10683;LINEAR A SIGN A343;Lo;0;L;;;;;N;;;;; +10684;LINEAR A SIGN A344;Lo;0;L;;;;;N;;;;; +10685;LINEAR A SIGN A345;Lo;0;L;;;;;N;;;;; +10686;LINEAR A SIGN A346;Lo;0;L;;;;;N;;;;; +10687;LINEAR A SIGN A347;Lo;0;L;;;;;N;;;;; +10688;LINEAR A SIGN A348;Lo;0;L;;;;;N;;;;; +10689;LINEAR A SIGN A349;Lo;0;L;;;;;N;;;;; +1068A;LINEAR A SIGN A350;Lo;0;L;;;;;N;;;;; +1068B;LINEAR A SIGN A351;Lo;0;L;;;;;N;;;;; +1068C;LINEAR A SIGN A352;Lo;0;L;;;;;N;;;;; +1068D;LINEAR A SIGN A353;Lo;0;L;;;;;N;;;;; +1068E;LINEAR A SIGN A354;Lo;0;L;;;;;N;;;;; +1068F;LINEAR A SIGN A355;Lo;0;L;;;;;N;;;;; +10690;LINEAR A SIGN A356;Lo;0;L;;;;;N;;;;; +10691;LINEAR A SIGN A357;Lo;0;L;;;;;N;;;;; +10692;LINEAR A SIGN A358;Lo;0;L;;;;;N;;;;; +10693;LINEAR A SIGN A359;Lo;0;L;;;;;N;;;;; +10694;LINEAR A SIGN A360;Lo;0;L;;;;;N;;;;; +10695;LINEAR A SIGN A361;Lo;0;L;;;;;N;;;;; +10696;LINEAR A SIGN A362;Lo;0;L;;;;;N;;;;; +10697;LINEAR A SIGN A363;Lo;0;L;;;;;N;;;;; +10698;LINEAR A SIGN A364;Lo;0;L;;;;;N;;;;; +10699;LINEAR A SIGN A365;Lo;0;L;;;;;N;;;;; +1069A;LINEAR A SIGN A366;Lo;0;L;;;;;N;;;;; +1069B;LINEAR A SIGN A367;Lo;0;L;;;;;N;;;;; +1069C;LINEAR A SIGN A368;Lo;0;L;;;;;N;;;;; +1069D;LINEAR A SIGN A369;Lo;0;L;;;;;N;;;;; +1069E;LINEAR A SIGN A370;Lo;0;L;;;;;N;;;;; +1069F;LINEAR A SIGN A371;Lo;0;L;;;;;N;;;;; +106A0;LINEAR A SIGN A400-VAS;Lo;0;L;;;;;N;;;;; +106A1;LINEAR A SIGN A401-VAS;Lo;0;L;;;;;N;;;;; +106A2;LINEAR A SIGN A402-VAS;Lo;0;L;;;;;N;;;;; +106A3;LINEAR A SIGN A403-VAS;Lo;0;L;;;;;N;;;;; +106A4;LINEAR A SIGN A404-VAS;Lo;0;L;;;;;N;;;;; +106A5;LINEAR A SIGN A405-VAS;Lo;0;L;;;;;N;;;;; +106A6;LINEAR A SIGN A406-VAS;Lo;0;L;;;;;N;;;;; +106A7;LINEAR A SIGN A407-VAS;Lo;0;L;;;;;N;;;;; +106A8;LINEAR A SIGN A408-VAS;Lo;0;L;;;;;N;;;;; +106A9;LINEAR A SIGN A409-VAS;Lo;0;L;;;;;N;;;;; +106AA;LINEAR A SIGN A410-VAS;Lo;0;L;;;;;N;;;;; +106AB;LINEAR A SIGN A411-VAS;Lo;0;L;;;;;N;;;;; +106AC;LINEAR A SIGN A412-VAS;Lo;0;L;;;;;N;;;;; +106AD;LINEAR A SIGN A413-VAS;Lo;0;L;;;;;N;;;;; +106AE;LINEAR A SIGN A414-VAS;Lo;0;L;;;;;N;;;;; +106AF;LINEAR A SIGN A415-VAS;Lo;0;L;;;;;N;;;;; +106B0;LINEAR A SIGN A416-VAS;Lo;0;L;;;;;N;;;;; +106B1;LINEAR A SIGN A417-VAS;Lo;0;L;;;;;N;;;;; +106B2;LINEAR A SIGN A418-VAS;Lo;0;L;;;;;N;;;;; +106B3;LINEAR A SIGN A501;Lo;0;L;;;;;N;;;;; +106B4;LINEAR A SIGN A502;Lo;0;L;;;;;N;;;;; +106B5;LINEAR A SIGN A503;Lo;0;L;;;;;N;;;;; +106B6;LINEAR A SIGN A504;Lo;0;L;;;;;N;;;;; +106B7;LINEAR A SIGN A505;Lo;0;L;;;;;N;;;;; +106B8;LINEAR A SIGN A506;Lo;0;L;;;;;N;;;;; +106B9;LINEAR A SIGN A508;Lo;0;L;;;;;N;;;;; +106BA;LINEAR A SIGN A509;Lo;0;L;;;;;N;;;;; +106BB;LINEAR A SIGN A510;Lo;0;L;;;;;N;;;;; +106BC;LINEAR A SIGN A511;Lo;0;L;;;;;N;;;;; +106BD;LINEAR A SIGN A512;Lo;0;L;;;;;N;;;;; +106BE;LINEAR A SIGN A513;Lo;0;L;;;;;N;;;;; +106BF;LINEAR A SIGN A515;Lo;0;L;;;;;N;;;;; +106C0;LINEAR A SIGN A516;Lo;0;L;;;;;N;;;;; +106C1;LINEAR A SIGN A520;Lo;0;L;;;;;N;;;;; +106C2;LINEAR A SIGN A521;Lo;0;L;;;;;N;;;;; +106C3;LINEAR A SIGN A523;Lo;0;L;;;;;N;;;;; +106C4;LINEAR A SIGN A524;Lo;0;L;;;;;N;;;;; +106C5;LINEAR A SIGN A525;Lo;0;L;;;;;N;;;;; +106C6;LINEAR A SIGN A526;Lo;0;L;;;;;N;;;;; +106C7;LINEAR A SIGN A527;Lo;0;L;;;;;N;;;;; +106C8;LINEAR A SIGN A528;Lo;0;L;;;;;N;;;;; +106C9;LINEAR A SIGN A529;Lo;0;L;;;;;N;;;;; +106CA;LINEAR A SIGN A530;Lo;0;L;;;;;N;;;;; +106CB;LINEAR A SIGN A531;Lo;0;L;;;;;N;;;;; +106CC;LINEAR A SIGN A532;Lo;0;L;;;;;N;;;;; +106CD;LINEAR A SIGN A534;Lo;0;L;;;;;N;;;;; +106CE;LINEAR A SIGN A535;Lo;0;L;;;;;N;;;;; +106CF;LINEAR A SIGN A536;Lo;0;L;;;;;N;;;;; +106D0;LINEAR A SIGN A537;Lo;0;L;;;;;N;;;;; +106D1;LINEAR A SIGN A538;Lo;0;L;;;;;N;;;;; +106D2;LINEAR A SIGN A539;Lo;0;L;;;;;N;;;;; +106D3;LINEAR A SIGN A540;Lo;0;L;;;;;N;;;;; +106D4;LINEAR A SIGN A541;Lo;0;L;;;;;N;;;;; +106D5;LINEAR A SIGN A542;Lo;0;L;;;;;N;;;;; +106D6;LINEAR A SIGN A545;Lo;0;L;;;;;N;;;;; +106D7;LINEAR A SIGN A547;Lo;0;L;;;;;N;;;;; +106D8;LINEAR A SIGN A548;Lo;0;L;;;;;N;;;;; +106D9;LINEAR A SIGN A549;Lo;0;L;;;;;N;;;;; +106DA;LINEAR A SIGN A550;Lo;0;L;;;;;N;;;;; +106DB;LINEAR A SIGN A551;Lo;0;L;;;;;N;;;;; +106DC;LINEAR A SIGN A552;Lo;0;L;;;;;N;;;;; +106DD;LINEAR A SIGN A553;Lo;0;L;;;;;N;;;;; +106DE;LINEAR A SIGN A554;Lo;0;L;;;;;N;;;;; +106DF;LINEAR A SIGN A555;Lo;0;L;;;;;N;;;;; +106E0;LINEAR A SIGN A556;Lo;0;L;;;;;N;;;;; +106E1;LINEAR A SIGN A557;Lo;0;L;;;;;N;;;;; +106E2;LINEAR A SIGN A559;Lo;0;L;;;;;N;;;;; +106E3;LINEAR A SIGN A563;Lo;0;L;;;;;N;;;;; +106E4;LINEAR A SIGN A564;Lo;0;L;;;;;N;;;;; +106E5;LINEAR A SIGN A565;Lo;0;L;;;;;N;;;;; +106E6;LINEAR A SIGN A566;Lo;0;L;;;;;N;;;;; +106E7;LINEAR A SIGN A568;Lo;0;L;;;;;N;;;;; +106E8;LINEAR A SIGN A569;Lo;0;L;;;;;N;;;;; +106E9;LINEAR A SIGN A570;Lo;0;L;;;;;N;;;;; +106EA;LINEAR A SIGN A571;Lo;0;L;;;;;N;;;;; +106EB;LINEAR A SIGN A572;Lo;0;L;;;;;N;;;;; +106EC;LINEAR A SIGN A573;Lo;0;L;;;;;N;;;;; +106ED;LINEAR A SIGN A574;Lo;0;L;;;;;N;;;;; +106EE;LINEAR A SIGN A575;Lo;0;L;;;;;N;;;;; +106EF;LINEAR A SIGN A576;Lo;0;L;;;;;N;;;;; +106F0;LINEAR A SIGN A577;Lo;0;L;;;;;N;;;;; +106F1;LINEAR A SIGN A578;Lo;0;L;;;;;N;;;;; +106F2;LINEAR A SIGN A579;Lo;0;L;;;;;N;;;;; +106F3;LINEAR A SIGN A580;Lo;0;L;;;;;N;;;;; +106F4;LINEAR A SIGN A581;Lo;0;L;;;;;N;;;;; +106F5;LINEAR A SIGN A582;Lo;0;L;;;;;N;;;;; +106F6;LINEAR A SIGN A583;Lo;0;L;;;;;N;;;;; +106F7;LINEAR A SIGN A584;Lo;0;L;;;;;N;;;;; +106F8;LINEAR A SIGN A585;Lo;0;L;;;;;N;;;;; +106F9;LINEAR A SIGN A586;Lo;0;L;;;;;N;;;;; +106FA;LINEAR A SIGN A587;Lo;0;L;;;;;N;;;;; +106FB;LINEAR A SIGN A588;Lo;0;L;;;;;N;;;;; +106FC;LINEAR A SIGN A589;Lo;0;L;;;;;N;;;;; +106FD;LINEAR A SIGN A591;Lo;0;L;;;;;N;;;;; +106FE;LINEAR A SIGN A592;Lo;0;L;;;;;N;;;;; +106FF;LINEAR A SIGN A594;Lo;0;L;;;;;N;;;;; +10700;LINEAR A SIGN A595;Lo;0;L;;;;;N;;;;; +10701;LINEAR A SIGN A596;Lo;0;L;;;;;N;;;;; +10702;LINEAR A SIGN A598;Lo;0;L;;;;;N;;;;; +10703;LINEAR A SIGN A600;Lo;0;L;;;;;N;;;;; +10704;LINEAR A SIGN A601;Lo;0;L;;;;;N;;;;; +10705;LINEAR A SIGN A602;Lo;0;L;;;;;N;;;;; +10706;LINEAR A SIGN A603;Lo;0;L;;;;;N;;;;; +10707;LINEAR A SIGN A604;Lo;0;L;;;;;N;;;;; +10708;LINEAR A SIGN A606;Lo;0;L;;;;;N;;;;; +10709;LINEAR A SIGN A608;Lo;0;L;;;;;N;;;;; +1070A;LINEAR A SIGN A609;Lo;0;L;;;;;N;;;;; +1070B;LINEAR A SIGN A610;Lo;0;L;;;;;N;;;;; +1070C;LINEAR A SIGN A611;Lo;0;L;;;;;N;;;;; +1070D;LINEAR A SIGN A612;Lo;0;L;;;;;N;;;;; +1070E;LINEAR A SIGN A613;Lo;0;L;;;;;N;;;;; +1070F;LINEAR A SIGN A614;Lo;0;L;;;;;N;;;;; +10710;LINEAR A SIGN A615;Lo;0;L;;;;;N;;;;; +10711;LINEAR A SIGN A616;Lo;0;L;;;;;N;;;;; +10712;LINEAR A SIGN A617;Lo;0;L;;;;;N;;;;; +10713;LINEAR A SIGN A618;Lo;0;L;;;;;N;;;;; +10714;LINEAR A SIGN A619;Lo;0;L;;;;;N;;;;; +10715;LINEAR A SIGN A620;Lo;0;L;;;;;N;;;;; +10716;LINEAR A SIGN A621;Lo;0;L;;;;;N;;;;; +10717;LINEAR A SIGN A622;Lo;0;L;;;;;N;;;;; +10718;LINEAR A SIGN A623;Lo;0;L;;;;;N;;;;; +10719;LINEAR A SIGN A624;Lo;0;L;;;;;N;;;;; +1071A;LINEAR A SIGN A626;Lo;0;L;;;;;N;;;;; +1071B;LINEAR A SIGN A627;Lo;0;L;;;;;N;;;;; +1071C;LINEAR A SIGN A628;Lo;0;L;;;;;N;;;;; +1071D;LINEAR A SIGN A629;Lo;0;L;;;;;N;;;;; +1071E;LINEAR A SIGN A634;Lo;0;L;;;;;N;;;;; +1071F;LINEAR A SIGN A637;Lo;0;L;;;;;N;;;;; +10720;LINEAR A SIGN A638;Lo;0;L;;;;;N;;;;; +10721;LINEAR A SIGN A640;Lo;0;L;;;;;N;;;;; +10722;LINEAR A SIGN A642;Lo;0;L;;;;;N;;;;; +10723;LINEAR A SIGN A643;Lo;0;L;;;;;N;;;;; +10724;LINEAR A SIGN A644;Lo;0;L;;;;;N;;;;; +10725;LINEAR A SIGN A645;Lo;0;L;;;;;N;;;;; +10726;LINEAR A SIGN A646;Lo;0;L;;;;;N;;;;; +10727;LINEAR A SIGN A648;Lo;0;L;;;;;N;;;;; +10728;LINEAR A SIGN A649;Lo;0;L;;;;;N;;;;; +10729;LINEAR A SIGN A651;Lo;0;L;;;;;N;;;;; +1072A;LINEAR A SIGN A652;Lo;0;L;;;;;N;;;;; +1072B;LINEAR A SIGN A653;Lo;0;L;;;;;N;;;;; +1072C;LINEAR A SIGN A654;Lo;0;L;;;;;N;;;;; +1072D;LINEAR A SIGN A655;Lo;0;L;;;;;N;;;;; +1072E;LINEAR A SIGN A656;Lo;0;L;;;;;N;;;;; +1072F;LINEAR A SIGN A657;Lo;0;L;;;;;N;;;;; +10730;LINEAR A SIGN A658;Lo;0;L;;;;;N;;;;; +10731;LINEAR A SIGN A659;Lo;0;L;;;;;N;;;;; +10732;LINEAR A SIGN A660;Lo;0;L;;;;;N;;;;; +10733;LINEAR A SIGN A661;Lo;0;L;;;;;N;;;;; +10734;LINEAR A SIGN A662;Lo;0;L;;;;;N;;;;; +10735;LINEAR A SIGN A663;Lo;0;L;;;;;N;;;;; +10736;LINEAR A SIGN A664;Lo;0;L;;;;;N;;;;; +10740;LINEAR A SIGN A701 A;Lo;0;L;;;;;N;;;;; +10741;LINEAR A SIGN A702 B;Lo;0;L;;;;;N;;;;; +10742;LINEAR A SIGN A703 D;Lo;0;L;;;;;N;;;;; +10743;LINEAR A SIGN A704 E;Lo;0;L;;;;;N;;;;; +10744;LINEAR A SIGN A705 F;Lo;0;L;;;;;N;;;;; +10745;LINEAR A SIGN A706 H;Lo;0;L;;;;;N;;;;; +10746;LINEAR A SIGN A707 J;Lo;0;L;;;;;N;;;;; +10747;LINEAR A SIGN A708 K;Lo;0;L;;;;;N;;;;; +10748;LINEAR A SIGN A709 L;Lo;0;L;;;;;N;;;;; +10749;LINEAR A SIGN A709-2 L2;Lo;0;L;;;;;N;;;;; +1074A;LINEAR A SIGN A709-3 L3;Lo;0;L;;;;;N;;;;; +1074B;LINEAR A SIGN A709-4 L4;Lo;0;L;;;;;N;;;;; +1074C;LINEAR A SIGN A709-6 L6;Lo;0;L;;;;;N;;;;; +1074D;LINEAR A SIGN A710 W;Lo;0;L;;;;;N;;;;; +1074E;LINEAR A SIGN A711 X;Lo;0;L;;;;;N;;;;; +1074F;LINEAR A SIGN A712 Y;Lo;0;L;;;;;N;;;;; +10750;LINEAR A SIGN A713 OMEGA;Lo;0;L;;;;;N;;;;; +10751;LINEAR A SIGN A714 ABB;Lo;0;L;;;;;N;;;;; +10752;LINEAR A SIGN A715 BB;Lo;0;L;;;;;N;;;;; +10753;LINEAR A SIGN A717 DD;Lo;0;L;;;;;N;;;;; +10754;LINEAR A SIGN A726 EYYY;Lo;0;L;;;;;N;;;;; +10755;LINEAR A SIGN A732 JE;Lo;0;L;;;;;N;;;;; +10760;LINEAR A SIGN A800;Lo;0;L;;;;;N;;;;; +10761;LINEAR A SIGN A801;Lo;0;L;;;;;N;;;;; +10762;LINEAR A SIGN A802;Lo;0;L;;;;;N;;;;; +10763;LINEAR A SIGN A803;Lo;0;L;;;;;N;;;;; +10764;LINEAR A SIGN A804;Lo;0;L;;;;;N;;;;; +10765;LINEAR A SIGN A805;Lo;0;L;;;;;N;;;;; +10766;LINEAR A SIGN A806;Lo;0;L;;;;;N;;;;; +10767;LINEAR A SIGN A807;Lo;0;L;;;;;N;;;;; +10800;CYPRIOT SYLLABLE A;Lo;0;R;;;;;N;;;;; +10801;CYPRIOT SYLLABLE E;Lo;0;R;;;;;N;;;;; +10802;CYPRIOT SYLLABLE I;Lo;0;R;;;;;N;;;;; +10803;CYPRIOT SYLLABLE O;Lo;0;R;;;;;N;;;;; +10804;CYPRIOT SYLLABLE U;Lo;0;R;;;;;N;;;;; +10805;CYPRIOT SYLLABLE JA;Lo;0;R;;;;;N;;;;; +10808;CYPRIOT SYLLABLE JO;Lo;0;R;;;;;N;;;;; +1080A;CYPRIOT SYLLABLE KA;Lo;0;R;;;;;N;;;;; +1080B;CYPRIOT SYLLABLE KE;Lo;0;R;;;;;N;;;;; +1080C;CYPRIOT SYLLABLE KI;Lo;0;R;;;;;N;;;;; +1080D;CYPRIOT SYLLABLE KO;Lo;0;R;;;;;N;;;;; +1080E;CYPRIOT SYLLABLE KU;Lo;0;R;;;;;N;;;;; +1080F;CYPRIOT SYLLABLE LA;Lo;0;R;;;;;N;;;;; +10810;CYPRIOT SYLLABLE LE;Lo;0;R;;;;;N;;;;; +10811;CYPRIOT SYLLABLE LI;Lo;0;R;;;;;N;;;;; +10812;CYPRIOT SYLLABLE LO;Lo;0;R;;;;;N;;;;; +10813;CYPRIOT SYLLABLE LU;Lo;0;R;;;;;N;;;;; +10814;CYPRIOT SYLLABLE MA;Lo;0;R;;;;;N;;;;; +10815;CYPRIOT SYLLABLE ME;Lo;0;R;;;;;N;;;;; +10816;CYPRIOT SYLLABLE MI;Lo;0;R;;;;;N;;;;; +10817;CYPRIOT SYLLABLE MO;Lo;0;R;;;;;N;;;;; +10818;CYPRIOT SYLLABLE MU;Lo;0;R;;;;;N;;;;; +10819;CYPRIOT SYLLABLE NA;Lo;0;R;;;;;N;;;;; +1081A;CYPRIOT SYLLABLE NE;Lo;0;R;;;;;N;;;;; +1081B;CYPRIOT SYLLABLE NI;Lo;0;R;;;;;N;;;;; +1081C;CYPRIOT SYLLABLE NO;Lo;0;R;;;;;N;;;;; +1081D;CYPRIOT SYLLABLE NU;Lo;0;R;;;;;N;;;;; +1081E;CYPRIOT SYLLABLE PA;Lo;0;R;;;;;N;;;;; +1081F;CYPRIOT SYLLABLE PE;Lo;0;R;;;;;N;;;;; +10820;CYPRIOT SYLLABLE PI;Lo;0;R;;;;;N;;;;; +10821;CYPRIOT SYLLABLE PO;Lo;0;R;;;;;N;;;;; +10822;CYPRIOT SYLLABLE PU;Lo;0;R;;;;;N;;;;; +10823;CYPRIOT SYLLABLE RA;Lo;0;R;;;;;N;;;;; +10824;CYPRIOT SYLLABLE RE;Lo;0;R;;;;;N;;;;; +10825;CYPRIOT SYLLABLE RI;Lo;0;R;;;;;N;;;;; +10826;CYPRIOT SYLLABLE RO;Lo;0;R;;;;;N;;;;; +10827;CYPRIOT SYLLABLE RU;Lo;0;R;;;;;N;;;;; +10828;CYPRIOT SYLLABLE SA;Lo;0;R;;;;;N;;;;; +10829;CYPRIOT SYLLABLE SE;Lo;0;R;;;;;N;;;;; +1082A;CYPRIOT SYLLABLE SI;Lo;0;R;;;;;N;;;;; +1082B;CYPRIOT SYLLABLE SO;Lo;0;R;;;;;N;;;;; +1082C;CYPRIOT SYLLABLE SU;Lo;0;R;;;;;N;;;;; +1082D;CYPRIOT SYLLABLE TA;Lo;0;R;;;;;N;;;;; +1082E;CYPRIOT SYLLABLE TE;Lo;0;R;;;;;N;;;;; +1082F;CYPRIOT SYLLABLE TI;Lo;0;R;;;;;N;;;;; +10830;CYPRIOT SYLLABLE TO;Lo;0;R;;;;;N;;;;; +10831;CYPRIOT SYLLABLE TU;Lo;0;R;;;;;N;;;;; +10832;CYPRIOT SYLLABLE WA;Lo;0;R;;;;;N;;;;; +10833;CYPRIOT SYLLABLE WE;Lo;0;R;;;;;N;;;;; +10834;CYPRIOT SYLLABLE WI;Lo;0;R;;;;;N;;;;; +10835;CYPRIOT SYLLABLE WO;Lo;0;R;;;;;N;;;;; +10837;CYPRIOT SYLLABLE XA;Lo;0;R;;;;;N;;;;; +10838;CYPRIOT SYLLABLE XE;Lo;0;R;;;;;N;;;;; +1083C;CYPRIOT SYLLABLE ZA;Lo;0;R;;;;;N;;;;; +1083F;CYPRIOT SYLLABLE ZO;Lo;0;R;;;;;N;;;;; +10840;IMPERIAL ARAMAIC LETTER ALEPH;Lo;0;R;;;;;N;;;;; +10841;IMPERIAL ARAMAIC LETTER BETH;Lo;0;R;;;;;N;;;;; +10842;IMPERIAL ARAMAIC LETTER GIMEL;Lo;0;R;;;;;N;;;;; +10843;IMPERIAL ARAMAIC LETTER DALETH;Lo;0;R;;;;;N;;;;; +10844;IMPERIAL ARAMAIC LETTER HE;Lo;0;R;;;;;N;;;;; +10845;IMPERIAL ARAMAIC LETTER WAW;Lo;0;R;;;;;N;;;;; +10846;IMPERIAL ARAMAIC LETTER ZAYIN;Lo;0;R;;;;;N;;;;; +10847;IMPERIAL ARAMAIC LETTER HETH;Lo;0;R;;;;;N;;;;; +10848;IMPERIAL ARAMAIC LETTER TETH;Lo;0;R;;;;;N;;;;; +10849;IMPERIAL ARAMAIC LETTER YODH;Lo;0;R;;;;;N;;;;; +1084A;IMPERIAL ARAMAIC LETTER KAPH;Lo;0;R;;;;;N;;;;; +1084B;IMPERIAL ARAMAIC LETTER LAMEDH;Lo;0;R;;;;;N;;;;; +1084C;IMPERIAL ARAMAIC LETTER MEM;Lo;0;R;;;;;N;;;;; +1084D;IMPERIAL ARAMAIC LETTER NUN;Lo;0;R;;;;;N;;;;; +1084E;IMPERIAL ARAMAIC LETTER SAMEKH;Lo;0;R;;;;;N;;;;; +1084F;IMPERIAL ARAMAIC LETTER AYIN;Lo;0;R;;;;;N;;;;; +10850;IMPERIAL ARAMAIC LETTER PE;Lo;0;R;;;;;N;;;;; +10851;IMPERIAL ARAMAIC LETTER SADHE;Lo;0;R;;;;;N;;;;; +10852;IMPERIAL ARAMAIC LETTER QOPH;Lo;0;R;;;;;N;;;;; +10853;IMPERIAL ARAMAIC LETTER RESH;Lo;0;R;;;;;N;;;;; +10854;IMPERIAL ARAMAIC LETTER SHIN;Lo;0;R;;;;;N;;;;; +10855;IMPERIAL ARAMAIC LETTER TAW;Lo;0;R;;;;;N;;;;; +10857;IMPERIAL ARAMAIC SECTION SIGN;Po;0;R;;;;;N;;;;; +10858;IMPERIAL ARAMAIC NUMBER ONE;No;0;R;;;;1;N;;;;; +10859;IMPERIAL ARAMAIC NUMBER TWO;No;0;R;;;;2;N;;;;; +1085A;IMPERIAL ARAMAIC NUMBER THREE;No;0;R;;;;3;N;;;;; +1085B;IMPERIAL ARAMAIC NUMBER TEN;No;0;R;;;;10;N;;;;; +1085C;IMPERIAL ARAMAIC NUMBER TWENTY;No;0;R;;;;20;N;;;;; +1085D;IMPERIAL ARAMAIC NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; +1085E;IMPERIAL ARAMAIC NUMBER ONE THOUSAND;No;0;R;;;;1000;N;;;;; +1085F;IMPERIAL ARAMAIC NUMBER TEN THOUSAND;No;0;R;;;;10000;N;;;;; +10860;PALMYRENE LETTER ALEPH;Lo;0;R;;;;;N;;;;; +10861;PALMYRENE LETTER BETH;Lo;0;R;;;;;N;;;;; +10862;PALMYRENE LETTER GIMEL;Lo;0;R;;;;;N;;;;; +10863;PALMYRENE LETTER DALETH;Lo;0;R;;;;;N;;;;; +10864;PALMYRENE LETTER HE;Lo;0;R;;;;;N;;;;; +10865;PALMYRENE LETTER WAW;Lo;0;R;;;;;N;;;;; +10866;PALMYRENE LETTER ZAYIN;Lo;0;R;;;;;N;;;;; +10867;PALMYRENE LETTER HETH;Lo;0;R;;;;;N;;;;; +10868;PALMYRENE LETTER TETH;Lo;0;R;;;;;N;;;;; +10869;PALMYRENE LETTER YODH;Lo;0;R;;;;;N;;;;; +1086A;PALMYRENE LETTER KAPH;Lo;0;R;;;;;N;;;;; +1086B;PALMYRENE LETTER LAMEDH;Lo;0;R;;;;;N;;;;; +1086C;PALMYRENE LETTER MEM;Lo;0;R;;;;;N;;;;; +1086D;PALMYRENE LETTER FINAL NUN;Lo;0;R;;;;;N;;;;; +1086E;PALMYRENE LETTER NUN;Lo;0;R;;;;;N;;;;; +1086F;PALMYRENE LETTER SAMEKH;Lo;0;R;;;;;N;;;;; +10870;PALMYRENE LETTER AYIN;Lo;0;R;;;;;N;;;;; +10871;PALMYRENE LETTER PE;Lo;0;R;;;;;N;;;;; +10872;PALMYRENE LETTER SADHE;Lo;0;R;;;;;N;;;;; +10873;PALMYRENE LETTER QOPH;Lo;0;R;;;;;N;;;;; +10874;PALMYRENE LETTER RESH;Lo;0;R;;;;;N;;;;; +10875;PALMYRENE LETTER SHIN;Lo;0;R;;;;;N;;;;; +10876;PALMYRENE LETTER TAW;Lo;0;R;;;;;N;;;;; +10877;PALMYRENE LEFT-POINTING FLEURON;So;0;R;;;;;N;;;;; +10878;PALMYRENE RIGHT-POINTING FLEURON;So;0;R;;;;;N;;;;; +10879;PALMYRENE NUMBER ONE;No;0;R;;;;1;N;;;;; +1087A;PALMYRENE NUMBER TWO;No;0;R;;;;2;N;;;;; +1087B;PALMYRENE NUMBER THREE;No;0;R;;;;3;N;;;;; +1087C;PALMYRENE NUMBER FOUR;No;0;R;;;;4;N;;;;; +1087D;PALMYRENE NUMBER FIVE;No;0;R;;;;5;N;;;;; +1087E;PALMYRENE NUMBER TEN;No;0;R;;;;10;N;;;;; +1087F;PALMYRENE NUMBER TWENTY;No;0;R;;;;20;N;;;;; +10880;NABATAEAN LETTER FINAL ALEPH;Lo;0;R;;;;;N;;;;; +10881;NABATAEAN LETTER ALEPH;Lo;0;R;;;;;N;;;;; +10882;NABATAEAN LETTER FINAL BETH;Lo;0;R;;;;;N;;;;; +10883;NABATAEAN LETTER BETH;Lo;0;R;;;;;N;;;;; +10884;NABATAEAN LETTER GIMEL;Lo;0;R;;;;;N;;;;; +10885;NABATAEAN LETTER DALETH;Lo;0;R;;;;;N;;;;; +10886;NABATAEAN LETTER FINAL HE;Lo;0;R;;;;;N;;;;; +10887;NABATAEAN LETTER HE;Lo;0;R;;;;;N;;;;; +10888;NABATAEAN LETTER WAW;Lo;0;R;;;;;N;;;;; +10889;NABATAEAN LETTER ZAYIN;Lo;0;R;;;;;N;;;;; +1088A;NABATAEAN LETTER HETH;Lo;0;R;;;;;N;;;;; +1088B;NABATAEAN LETTER TETH;Lo;0;R;;;;;N;;;;; +1088C;NABATAEAN LETTER FINAL YODH;Lo;0;R;;;;;N;;;;; +1088D;NABATAEAN LETTER YODH;Lo;0;R;;;;;N;;;;; +1088E;NABATAEAN LETTER FINAL KAPH;Lo;0;R;;;;;N;;;;; +1088F;NABATAEAN LETTER KAPH;Lo;0;R;;;;;N;;;;; +10890;NABATAEAN LETTER FINAL LAMEDH;Lo;0;R;;;;;N;;;;; +10891;NABATAEAN LETTER LAMEDH;Lo;0;R;;;;;N;;;;; +10892;NABATAEAN LETTER FINAL MEM;Lo;0;R;;;;;N;;;;; +10893;NABATAEAN LETTER MEM;Lo;0;R;;;;;N;;;;; +10894;NABATAEAN LETTER FINAL NUN;Lo;0;R;;;;;N;;;;; +10895;NABATAEAN LETTER NUN;Lo;0;R;;;;;N;;;;; +10896;NABATAEAN LETTER SAMEKH;Lo;0;R;;;;;N;;;;; +10897;NABATAEAN LETTER AYIN;Lo;0;R;;;;;N;;;;; +10898;NABATAEAN LETTER PE;Lo;0;R;;;;;N;;;;; +10899;NABATAEAN LETTER SADHE;Lo;0;R;;;;;N;;;;; +1089A;NABATAEAN LETTER QOPH;Lo;0;R;;;;;N;;;;; +1089B;NABATAEAN LETTER RESH;Lo;0;R;;;;;N;;;;; +1089C;NABATAEAN LETTER FINAL SHIN;Lo;0;R;;;;;N;;;;; +1089D;NABATAEAN LETTER SHIN;Lo;0;R;;;;;N;;;;; +1089E;NABATAEAN LETTER TAW;Lo;0;R;;;;;N;;;;; +108A7;NABATAEAN NUMBER ONE;No;0;R;;;;1;N;;;;; +108A8;NABATAEAN NUMBER TWO;No;0;R;;;;2;N;;;;; +108A9;NABATAEAN NUMBER THREE;No;0;R;;;;3;N;;;;; +108AA;NABATAEAN NUMBER FOUR;No;0;R;;;;4;N;;;;; +108AB;NABATAEAN CRUCIFORM NUMBER FOUR;No;0;R;;;;4;N;;;;; +108AC;NABATAEAN NUMBER FIVE;No;0;R;;;;5;N;;;;; +108AD;NABATAEAN NUMBER TEN;No;0;R;;;;10;N;;;;; +108AE;NABATAEAN NUMBER TWENTY;No;0;R;;;;20;N;;;;; +108AF;NABATAEAN NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; +108E0;HATRAN LETTER ALEPH;Lo;0;R;;;;;N;;;;; +108E1;HATRAN LETTER BETH;Lo;0;R;;;;;N;;;;; +108E2;HATRAN LETTER GIMEL;Lo;0;R;;;;;N;;;;; +108E3;HATRAN LETTER DALETH-RESH;Lo;0;R;;;;;N;;;;; +108E4;HATRAN LETTER HE;Lo;0;R;;;;;N;;;;; +108E5;HATRAN LETTER WAW;Lo;0;R;;;;;N;;;;; +108E6;HATRAN LETTER ZAYN;Lo;0;R;;;;;N;;;;; +108E7;HATRAN LETTER HETH;Lo;0;R;;;;;N;;;;; +108E8;HATRAN LETTER TETH;Lo;0;R;;;;;N;;;;; +108E9;HATRAN LETTER YODH;Lo;0;R;;;;;N;;;;; +108EA;HATRAN LETTER KAPH;Lo;0;R;;;;;N;;;;; +108EB;HATRAN LETTER LAMEDH;Lo;0;R;;;;;N;;;;; +108EC;HATRAN LETTER MEM;Lo;0;R;;;;;N;;;;; +108ED;HATRAN LETTER NUN;Lo;0;R;;;;;N;;;;; +108EE;HATRAN LETTER SAMEKH;Lo;0;R;;;;;N;;;;; +108EF;HATRAN LETTER AYN;Lo;0;R;;;;;N;;;;; +108F0;HATRAN LETTER PE;Lo;0;R;;;;;N;;;;; +108F1;HATRAN LETTER SADHE;Lo;0;R;;;;;N;;;;; +108F2;HATRAN LETTER QOPH;Lo;0;R;;;;;N;;;;; +108F4;HATRAN LETTER SHIN;Lo;0;R;;;;;N;;;;; +108F5;HATRAN LETTER TAW;Lo;0;R;;;;;N;;;;; +108FB;HATRAN NUMBER ONE;No;0;R;;;;1;N;;;;; +108FC;HATRAN NUMBER FIVE;No;0;R;;;;5;N;;;;; +108FD;HATRAN NUMBER TEN;No;0;R;;;;10;N;;;;; +108FE;HATRAN NUMBER TWENTY;No;0;R;;;;20;N;;;;; +108FF;HATRAN NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; +10900;PHOENICIAN LETTER ALF;Lo;0;R;;;;;N;;;;; +10901;PHOENICIAN LETTER BET;Lo;0;R;;;;;N;;;;; +10902;PHOENICIAN LETTER GAML;Lo;0;R;;;;;N;;;;; +10903;PHOENICIAN LETTER DELT;Lo;0;R;;;;;N;;;;; +10904;PHOENICIAN LETTER HE;Lo;0;R;;;;;N;;;;; +10905;PHOENICIAN LETTER WAU;Lo;0;R;;;;;N;;;;; +10906;PHOENICIAN LETTER ZAI;Lo;0;R;;;;;N;;;;; +10907;PHOENICIAN LETTER HET;Lo;0;R;;;;;N;;;;; +10908;PHOENICIAN LETTER TET;Lo;0;R;;;;;N;;;;; +10909;PHOENICIAN LETTER YOD;Lo;0;R;;;;;N;;;;; +1090A;PHOENICIAN LETTER KAF;Lo;0;R;;;;;N;;;;; +1090B;PHOENICIAN LETTER LAMD;Lo;0;R;;;;;N;;;;; +1090C;PHOENICIAN LETTER MEM;Lo;0;R;;;;;N;;;;; +1090D;PHOENICIAN LETTER NUN;Lo;0;R;;;;;N;;;;; +1090E;PHOENICIAN LETTER SEMK;Lo;0;R;;;;;N;;;;; +1090F;PHOENICIAN LETTER AIN;Lo;0;R;;;;;N;;;;; +10910;PHOENICIAN LETTER PE;Lo;0;R;;;;;N;;;;; +10911;PHOENICIAN LETTER SADE;Lo;0;R;;;;;N;;;;; +10912;PHOENICIAN LETTER QOF;Lo;0;R;;;;;N;;;;; +10913;PHOENICIAN LETTER ROSH;Lo;0;R;;;;;N;;;;; +10914;PHOENICIAN LETTER SHIN;Lo;0;R;;;;;N;;;;; +10915;PHOENICIAN LETTER TAU;Lo;0;R;;;;;N;;;;; +10916;PHOENICIAN NUMBER ONE;No;0;R;;;;1;N;;;;; +10917;PHOENICIAN NUMBER TEN;No;0;R;;;;10;N;;;;; +10918;PHOENICIAN NUMBER TWENTY;No;0;R;;;;20;N;;;;; +10919;PHOENICIAN NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; +1091A;PHOENICIAN NUMBER TWO;No;0;R;;;;2;N;;;;; +1091B;PHOENICIAN NUMBER THREE;No;0;R;;;;3;N;;;;; +1091F;PHOENICIAN WORD SEPARATOR;Po;0;ON;;;;;N;;;;; +10920;LYDIAN LETTER A;Lo;0;R;;;;;N;;;;; +10921;LYDIAN LETTER B;Lo;0;R;;;;;N;;;;; +10922;LYDIAN LETTER G;Lo;0;R;;;;;N;;;;; +10923;LYDIAN LETTER D;Lo;0;R;;;;;N;;;;; +10924;LYDIAN LETTER E;Lo;0;R;;;;;N;;;;; +10925;LYDIAN LETTER V;Lo;0;R;;;;;N;;;;; +10926;LYDIAN LETTER I;Lo;0;R;;;;;N;;;;; +10927;LYDIAN LETTER Y;Lo;0;R;;;;;N;;;;; +10928;LYDIAN LETTER K;Lo;0;R;;;;;N;;;;; +10929;LYDIAN LETTER L;Lo;0;R;;;;;N;;;;; +1092A;LYDIAN LETTER M;Lo;0;R;;;;;N;;;;; +1092B;LYDIAN LETTER N;Lo;0;R;;;;;N;;;;; +1092C;LYDIAN LETTER O;Lo;0;R;;;;;N;;;;; +1092D;LYDIAN LETTER R;Lo;0;R;;;;;N;;;;; +1092E;LYDIAN LETTER SS;Lo;0;R;;;;;N;;;;; +1092F;LYDIAN LETTER T;Lo;0;R;;;;;N;;;;; +10930;LYDIAN LETTER U;Lo;0;R;;;;;N;;;;; +10931;LYDIAN LETTER F;Lo;0;R;;;;;N;;;;; +10932;LYDIAN LETTER Q;Lo;0;R;;;;;N;;;;; +10933;LYDIAN LETTER S;Lo;0;R;;;;;N;;;;; +10934;LYDIAN LETTER TT;Lo;0;R;;;;;N;;;;; +10935;LYDIAN LETTER AN;Lo;0;R;;;;;N;;;;; +10936;LYDIAN LETTER EN;Lo;0;R;;;;;N;;;;; +10937;LYDIAN LETTER LY;Lo;0;R;;;;;N;;;;; +10938;LYDIAN LETTER NN;Lo;0;R;;;;;N;;;;; +10939;LYDIAN LETTER C;Lo;0;R;;;;;N;;;;; +1093F;LYDIAN TRIANGULAR MARK;Po;0;R;;;;;N;;;;; +10980;MEROITIC HIEROGLYPHIC LETTER A;Lo;0;R;;;;;N;;;;; +10981;MEROITIC HIEROGLYPHIC LETTER E;Lo;0;R;;;;;N;;;;; +10982;MEROITIC HIEROGLYPHIC LETTER I;Lo;0;R;;;;;N;;;;; +10983;MEROITIC HIEROGLYPHIC LETTER O;Lo;0;R;;;;;N;;;;; +10984;MEROITIC HIEROGLYPHIC LETTER YA;Lo;0;R;;;;;N;;;;; +10985;MEROITIC HIEROGLYPHIC LETTER WA;Lo;0;R;;;;;N;;;;; +10986;MEROITIC HIEROGLYPHIC LETTER BA;Lo;0;R;;;;;N;;;;; +10987;MEROITIC HIEROGLYPHIC LETTER BA-2;Lo;0;R;;;;;N;;;;; +10988;MEROITIC HIEROGLYPHIC LETTER PA;Lo;0;R;;;;;N;;;;; +10989;MEROITIC HIEROGLYPHIC LETTER MA;Lo;0;R;;;;;N;;;;; +1098A;MEROITIC HIEROGLYPHIC LETTER NA;Lo;0;R;;;;;N;;;;; +1098B;MEROITIC HIEROGLYPHIC LETTER NA-2;Lo;0;R;;;;;N;;;;; +1098C;MEROITIC HIEROGLYPHIC LETTER NE;Lo;0;R;;;;;N;;;;; +1098D;MEROITIC HIEROGLYPHIC LETTER NE-2;Lo;0;R;;;;;N;;;;; +1098E;MEROITIC HIEROGLYPHIC LETTER RA;Lo;0;R;;;;;N;;;;; +1098F;MEROITIC HIEROGLYPHIC LETTER RA-2;Lo;0;R;;;;;N;;;;; +10990;MEROITIC HIEROGLYPHIC LETTER LA;Lo;0;R;;;;;N;;;;; +10991;MEROITIC HIEROGLYPHIC LETTER KHA;Lo;0;R;;;;;N;;;;; +10992;MEROITIC HIEROGLYPHIC LETTER HHA;Lo;0;R;;;;;N;;;;; +10993;MEROITIC HIEROGLYPHIC LETTER SA;Lo;0;R;;;;;N;;;;; +10994;MEROITIC HIEROGLYPHIC LETTER SA-2;Lo;0;R;;;;;N;;;;; +10995;MEROITIC HIEROGLYPHIC LETTER SE;Lo;0;R;;;;;N;;;;; +10996;MEROITIC HIEROGLYPHIC LETTER KA;Lo;0;R;;;;;N;;;;; +10997;MEROITIC HIEROGLYPHIC LETTER QA;Lo;0;R;;;;;N;;;;; +10998;MEROITIC HIEROGLYPHIC LETTER TA;Lo;0;R;;;;;N;;;;; +10999;MEROITIC HIEROGLYPHIC LETTER TA-2;Lo;0;R;;;;;N;;;;; +1099A;MEROITIC HIEROGLYPHIC LETTER TE;Lo;0;R;;;;;N;;;;; +1099B;MEROITIC HIEROGLYPHIC LETTER TE-2;Lo;0;R;;;;;N;;;;; +1099C;MEROITIC HIEROGLYPHIC LETTER TO;Lo;0;R;;;;;N;;;;; +1099D;MEROITIC HIEROGLYPHIC LETTER DA;Lo;0;R;;;;;N;;;;; +1099E;MEROITIC HIEROGLYPHIC SYMBOL VIDJ;Lo;0;R;;;;;N;;;;; +1099F;MEROITIC HIEROGLYPHIC SYMBOL VIDJ-2;Lo;0;R;;;;;N;;;;; +109A0;MEROITIC CURSIVE LETTER A;Lo;0;R;;;;;N;;;;; +109A1;MEROITIC CURSIVE LETTER E;Lo;0;R;;;;;N;;;;; +109A2;MEROITIC CURSIVE LETTER I;Lo;0;R;;;;;N;;;;; +109A3;MEROITIC CURSIVE LETTER O;Lo;0;R;;;;;N;;;;; +109A4;MEROITIC CURSIVE LETTER YA;Lo;0;R;;;;;N;;;;; +109A5;MEROITIC CURSIVE LETTER WA;Lo;0;R;;;;;N;;;;; +109A6;MEROITIC CURSIVE LETTER BA;Lo;0;R;;;;;N;;;;; +109A7;MEROITIC CURSIVE LETTER PA;Lo;0;R;;;;;N;;;;; +109A8;MEROITIC CURSIVE LETTER MA;Lo;0;R;;;;;N;;;;; +109A9;MEROITIC CURSIVE LETTER NA;Lo;0;R;;;;;N;;;;; +109AA;MEROITIC CURSIVE LETTER NE;Lo;0;R;;;;;N;;;;; +109AB;MEROITIC CURSIVE LETTER RA;Lo;0;R;;;;;N;;;;; +109AC;MEROITIC CURSIVE LETTER LA;Lo;0;R;;;;;N;;;;; +109AD;MEROITIC CURSIVE LETTER KHA;Lo;0;R;;;;;N;;;;; +109AE;MEROITIC CURSIVE LETTER HHA;Lo;0;R;;;;;N;;;;; +109AF;MEROITIC CURSIVE LETTER SA;Lo;0;R;;;;;N;;;;; +109B0;MEROITIC CURSIVE LETTER ARCHAIC SA;Lo;0;R;;;;;N;;;;; +109B1;MEROITIC CURSIVE LETTER SE;Lo;0;R;;;;;N;;;;; +109B2;MEROITIC CURSIVE LETTER KA;Lo;0;R;;;;;N;;;;; +109B3;MEROITIC CURSIVE LETTER QA;Lo;0;R;;;;;N;;;;; +109B4;MEROITIC CURSIVE LETTER TA;Lo;0;R;;;;;N;;;;; +109B5;MEROITIC CURSIVE LETTER TE;Lo;0;R;;;;;N;;;;; +109B6;MEROITIC CURSIVE LETTER TO;Lo;0;R;;;;;N;;;;; +109B7;MEROITIC CURSIVE LETTER DA;Lo;0;R;;;;;N;;;;; +109BC;MEROITIC CURSIVE FRACTION ELEVEN TWELFTHS;No;0;R;;;;11/12;N;;;;; +109BD;MEROITIC CURSIVE FRACTION ONE HALF;No;0;R;;;;1/2;N;;;;; +109BE;MEROITIC CURSIVE LOGOGRAM RMT;Lo;0;R;;;;;N;;;;; +109BF;MEROITIC CURSIVE LOGOGRAM IMN;Lo;0;R;;;;;N;;;;; +109C0;MEROITIC CURSIVE NUMBER ONE;No;0;R;;;;1;N;;;;; +109C1;MEROITIC CURSIVE NUMBER TWO;No;0;R;;;;2;N;;;;; +109C2;MEROITIC CURSIVE NUMBER THREE;No;0;R;;;;3;N;;;;; +109C3;MEROITIC CURSIVE NUMBER FOUR;No;0;R;;;;4;N;;;;; +109C4;MEROITIC CURSIVE NUMBER FIVE;No;0;R;;;;5;N;;;;; +109C5;MEROITIC CURSIVE NUMBER SIX;No;0;R;;;;6;N;;;;; +109C6;MEROITIC CURSIVE NUMBER SEVEN;No;0;R;;;;7;N;;;;; +109C7;MEROITIC CURSIVE NUMBER EIGHT;No;0;R;;;;8;N;;;;; +109C8;MEROITIC CURSIVE NUMBER NINE;No;0;R;;;;9;N;;;;; +109C9;MEROITIC CURSIVE NUMBER TEN;No;0;R;;;;10;N;;;;; +109CA;MEROITIC CURSIVE NUMBER TWENTY;No;0;R;;;;20;N;;;;; +109CB;MEROITIC CURSIVE NUMBER THIRTY;No;0;R;;;;30;N;;;;; +109CC;MEROITIC CURSIVE NUMBER FORTY;No;0;R;;;;40;N;;;;; +109CD;MEROITIC CURSIVE NUMBER FIFTY;No;0;R;;;;50;N;;;;; +109CE;MEROITIC CURSIVE NUMBER SIXTY;No;0;R;;;;60;N;;;;; +109CF;MEROITIC CURSIVE NUMBER SEVENTY;No;0;R;;;;70;N;;;;; +109D2;MEROITIC CURSIVE NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; +109D3;MEROITIC CURSIVE NUMBER TWO HUNDRED;No;0;R;;;;200;N;;;;; +109D4;MEROITIC CURSIVE NUMBER THREE HUNDRED;No;0;R;;;;300;N;;;;; +109D5;MEROITIC CURSIVE NUMBER FOUR HUNDRED;No;0;R;;;;400;N;;;;; +109D6;MEROITIC CURSIVE NUMBER FIVE HUNDRED;No;0;R;;;;500;N;;;;; +109D7;MEROITIC CURSIVE NUMBER SIX HUNDRED;No;0;R;;;;600;N;;;;; +109D8;MEROITIC CURSIVE NUMBER SEVEN HUNDRED;No;0;R;;;;700;N;;;;; +109D9;MEROITIC CURSIVE NUMBER EIGHT HUNDRED;No;0;R;;;;800;N;;;;; +109DA;MEROITIC CURSIVE NUMBER NINE HUNDRED;No;0;R;;;;900;N;;;;; +109DB;MEROITIC CURSIVE NUMBER ONE THOUSAND;No;0;R;;;;1000;N;;;;; +109DC;MEROITIC CURSIVE NUMBER TWO THOUSAND;No;0;R;;;;2000;N;;;;; +109DD;MEROITIC CURSIVE NUMBER THREE THOUSAND;No;0;R;;;;3000;N;;;;; +109DE;MEROITIC CURSIVE NUMBER FOUR THOUSAND;No;0;R;;;;4000;N;;;;; +109DF;MEROITIC CURSIVE NUMBER FIVE THOUSAND;No;0;R;;;;5000;N;;;;; +109E0;MEROITIC CURSIVE NUMBER SIX THOUSAND;No;0;R;;;;6000;N;;;;; +109E1;MEROITIC CURSIVE NUMBER SEVEN THOUSAND;No;0;R;;;;7000;N;;;;; +109E2;MEROITIC CURSIVE NUMBER EIGHT THOUSAND;No;0;R;;;;8000;N;;;;; +109E3;MEROITIC CURSIVE NUMBER NINE THOUSAND;No;0;R;;;;9000;N;;;;; +109E4;MEROITIC CURSIVE NUMBER TEN THOUSAND;No;0;R;;;;10000;N;;;;; +109E5;MEROITIC CURSIVE NUMBER TWENTY THOUSAND;No;0;R;;;;20000;N;;;;; +109E6;MEROITIC CURSIVE NUMBER THIRTY THOUSAND;No;0;R;;;;30000;N;;;;; +109E7;MEROITIC CURSIVE NUMBER FORTY THOUSAND;No;0;R;;;;40000;N;;;;; +109E8;MEROITIC CURSIVE NUMBER FIFTY THOUSAND;No;0;R;;;;50000;N;;;;; +109E9;MEROITIC CURSIVE NUMBER SIXTY THOUSAND;No;0;R;;;;60000;N;;;;; +109EA;MEROITIC CURSIVE NUMBER SEVENTY THOUSAND;No;0;R;;;;70000;N;;;;; +109EB;MEROITIC CURSIVE NUMBER EIGHTY THOUSAND;No;0;R;;;;80000;N;;;;; +109EC;MEROITIC CURSIVE NUMBER NINETY THOUSAND;No;0;R;;;;90000;N;;;;; +109ED;MEROITIC CURSIVE NUMBER ONE HUNDRED THOUSAND;No;0;R;;;;100000;N;;;;; +109EE;MEROITIC CURSIVE NUMBER TWO HUNDRED THOUSAND;No;0;R;;;;200000;N;;;;; +109EF;MEROITIC CURSIVE NUMBER THREE HUNDRED THOUSAND;No;0;R;;;;300000;N;;;;; +109F0;MEROITIC CURSIVE NUMBER FOUR HUNDRED THOUSAND;No;0;R;;;;400000;N;;;;; +109F1;MEROITIC CURSIVE NUMBER FIVE HUNDRED THOUSAND;No;0;R;;;;500000;N;;;;; +109F2;MEROITIC CURSIVE NUMBER SIX HUNDRED THOUSAND;No;0;R;;;;600000;N;;;;; +109F3;MEROITIC CURSIVE NUMBER SEVEN HUNDRED THOUSAND;No;0;R;;;;700000;N;;;;; +109F4;MEROITIC CURSIVE NUMBER EIGHT HUNDRED THOUSAND;No;0;R;;;;800000;N;;;;; +109F5;MEROITIC CURSIVE NUMBER NINE HUNDRED THOUSAND;No;0;R;;;;900000;N;;;;; +109F6;MEROITIC CURSIVE FRACTION ONE TWELFTH;No;0;R;;;;1/12;N;;;;; +109F7;MEROITIC CURSIVE FRACTION TWO TWELFTHS;No;0;R;;;;2/12;N;;;;; +109F8;MEROITIC CURSIVE FRACTION THREE TWELFTHS;No;0;R;;;;3/12;N;;;;; +109F9;MEROITIC CURSIVE FRACTION FOUR TWELFTHS;No;0;R;;;;4/12;N;;;;; +109FA;MEROITIC CURSIVE FRACTION FIVE TWELFTHS;No;0;R;;;;5/12;N;;;;; +109FB;MEROITIC CURSIVE FRACTION SIX TWELFTHS;No;0;R;;;;6/12;N;;;;; +109FC;MEROITIC CURSIVE FRACTION SEVEN TWELFTHS;No;0;R;;;;7/12;N;;;;; +109FD;MEROITIC CURSIVE FRACTION EIGHT TWELFTHS;No;0;R;;;;8/12;N;;;;; +109FE;MEROITIC CURSIVE FRACTION NINE TWELFTHS;No;0;R;;;;9/12;N;;;;; +109FF;MEROITIC CURSIVE FRACTION TEN TWELFTHS;No;0;R;;;;10/12;N;;;;; +10A00;KHAROSHTHI LETTER A;Lo;0;R;;;;;N;;;;; +10A01;KHAROSHTHI VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +10A02;KHAROSHTHI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +10A03;KHAROSHTHI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +10A05;KHAROSHTHI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +10A06;KHAROSHTHI VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; +10A0C;KHAROSHTHI VOWEL LENGTH MARK;Mn;0;NSM;;;;;N;;;;; +10A0D;KHAROSHTHI SIGN DOUBLE RING BELOW;Mn;220;NSM;;;;;N;;;;; +10A0E;KHAROSHTHI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +10A0F;KHAROSHTHI SIGN VISARGA;Mn;230;NSM;;;;;N;;;;; +10A10;KHAROSHTHI LETTER KA;Lo;0;R;;;;;N;;;;; +10A11;KHAROSHTHI LETTER KHA;Lo;0;R;;;;;N;;;;; +10A12;KHAROSHTHI LETTER GA;Lo;0;R;;;;;N;;;;; +10A13;KHAROSHTHI LETTER GHA;Lo;0;R;;;;;N;;;;; +10A15;KHAROSHTHI LETTER CA;Lo;0;R;;;;;N;;;;; +10A16;KHAROSHTHI LETTER CHA;Lo;0;R;;;;;N;;;;; +10A17;KHAROSHTHI LETTER JA;Lo;0;R;;;;;N;;;;; +10A19;KHAROSHTHI LETTER NYA;Lo;0;R;;;;;N;;;;; +10A1A;KHAROSHTHI LETTER TTA;Lo;0;R;;;;;N;;;;; +10A1B;KHAROSHTHI LETTER TTHA;Lo;0;R;;;;;N;;;;; +10A1C;KHAROSHTHI LETTER DDA;Lo;0;R;;;;;N;;;;; +10A1D;KHAROSHTHI LETTER DDHA;Lo;0;R;;;;;N;;;;; +10A1E;KHAROSHTHI LETTER NNA;Lo;0;R;;;;;N;;;;; +10A1F;KHAROSHTHI LETTER TA;Lo;0;R;;;;;N;;;;; +10A20;KHAROSHTHI LETTER THA;Lo;0;R;;;;;N;;;;; +10A21;KHAROSHTHI LETTER DA;Lo;0;R;;;;;N;;;;; +10A22;KHAROSHTHI LETTER DHA;Lo;0;R;;;;;N;;;;; +10A23;KHAROSHTHI LETTER NA;Lo;0;R;;;;;N;;;;; +10A24;KHAROSHTHI LETTER PA;Lo;0;R;;;;;N;;;;; +10A25;KHAROSHTHI LETTER PHA;Lo;0;R;;;;;N;;;;; +10A26;KHAROSHTHI LETTER BA;Lo;0;R;;;;;N;;;;; +10A27;KHAROSHTHI LETTER BHA;Lo;0;R;;;;;N;;;;; +10A28;KHAROSHTHI LETTER MA;Lo;0;R;;;;;N;;;;; +10A29;KHAROSHTHI LETTER YA;Lo;0;R;;;;;N;;;;; +10A2A;KHAROSHTHI LETTER RA;Lo;0;R;;;;;N;;;;; +10A2B;KHAROSHTHI LETTER LA;Lo;0;R;;;;;N;;;;; +10A2C;KHAROSHTHI LETTER VA;Lo;0;R;;;;;N;;;;; +10A2D;KHAROSHTHI LETTER SHA;Lo;0;R;;;;;N;;;;; +10A2E;KHAROSHTHI LETTER SSA;Lo;0;R;;;;;N;;;;; +10A2F;KHAROSHTHI LETTER SA;Lo;0;R;;;;;N;;;;; +10A30;KHAROSHTHI LETTER ZA;Lo;0;R;;;;;N;;;;; +10A31;KHAROSHTHI LETTER HA;Lo;0;R;;;;;N;;;;; +10A32;KHAROSHTHI LETTER KKA;Lo;0;R;;;;;N;;;;; +10A33;KHAROSHTHI LETTER TTTHA;Lo;0;R;;;;;N;;;;; +10A34;KHAROSHTHI LETTER TTTA;Lo;0;R;;;;;N;;;;; +10A35;KHAROSHTHI LETTER VHA;Lo;0;R;;;;;N;;;;; +10A38;KHAROSHTHI SIGN BAR ABOVE;Mn;230;NSM;;;;;N;;;;; +10A39;KHAROSHTHI SIGN CAUDA;Mn;1;NSM;;;;;N;;;;; +10A3A;KHAROSHTHI SIGN DOT BELOW;Mn;220;NSM;;;;;N;;;;; +10A3F;KHAROSHTHI VIRAMA;Mn;9;NSM;;;;;N;;;;; +10A40;KHAROSHTHI DIGIT ONE;No;0;R;;;1;1;N;;;;; +10A41;KHAROSHTHI DIGIT TWO;No;0;R;;;2;2;N;;;;; +10A42;KHAROSHTHI DIGIT THREE;No;0;R;;;3;3;N;;;;; +10A43;KHAROSHTHI DIGIT FOUR;No;0;R;;;4;4;N;;;;; +10A44;KHAROSHTHI NUMBER TEN;No;0;R;;;;10;N;;;;; +10A45;KHAROSHTHI NUMBER TWENTY;No;0;R;;;;20;N;;;;; +10A46;KHAROSHTHI NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; +10A47;KHAROSHTHI NUMBER ONE THOUSAND;No;0;R;;;;1000;N;;;;; +10A48;KHAROSHTHI FRACTION ONE HALF;No;0;R;;;;1/2;N;;;;; +10A50;KHAROSHTHI PUNCTUATION DOT;Po;0;R;;;;;N;;;;; +10A51;KHAROSHTHI PUNCTUATION SMALL CIRCLE;Po;0;R;;;;;N;;;;; +10A52;KHAROSHTHI PUNCTUATION CIRCLE;Po;0;R;;;;;N;;;;; +10A53;KHAROSHTHI PUNCTUATION CRESCENT BAR;Po;0;R;;;;;N;;;;; +10A54;KHAROSHTHI PUNCTUATION MANGALAM;Po;0;R;;;;;N;;;;; +10A55;KHAROSHTHI PUNCTUATION LOTUS;Po;0;R;;;;;N;;;;; +10A56;KHAROSHTHI PUNCTUATION DANDA;Po;0;R;;;;;N;;;;; +10A57;KHAROSHTHI PUNCTUATION DOUBLE DANDA;Po;0;R;;;;;N;;;;; +10A58;KHAROSHTHI PUNCTUATION LINES;Po;0;R;;;;;N;;;;; +10A60;OLD SOUTH ARABIAN LETTER HE;Lo;0;R;;;;;N;;;;; +10A61;OLD SOUTH ARABIAN LETTER LAMEDH;Lo;0;R;;;;;N;;;;; +10A62;OLD SOUTH ARABIAN LETTER HETH;Lo;0;R;;;;;N;;;;; +10A63;OLD SOUTH ARABIAN LETTER MEM;Lo;0;R;;;;;N;;;;; +10A64;OLD SOUTH ARABIAN LETTER QOPH;Lo;0;R;;;;;N;;;;; +10A65;OLD SOUTH ARABIAN LETTER WAW;Lo;0;R;;;;;N;;;;; +10A66;OLD SOUTH ARABIAN LETTER SHIN;Lo;0;R;;;;;N;;;;; +10A67;OLD SOUTH ARABIAN LETTER RESH;Lo;0;R;;;;;N;;;;; +10A68;OLD SOUTH ARABIAN LETTER BETH;Lo;0;R;;;;;N;;;;; +10A69;OLD SOUTH ARABIAN LETTER TAW;Lo;0;R;;;;;N;;;;; +10A6A;OLD SOUTH ARABIAN LETTER SAT;Lo;0;R;;;;;N;;;;; +10A6B;OLD SOUTH ARABIAN LETTER KAPH;Lo;0;R;;;;;N;;;;; +10A6C;OLD SOUTH ARABIAN LETTER NUN;Lo;0;R;;;;;N;;;;; +10A6D;OLD SOUTH ARABIAN LETTER KHETH;Lo;0;R;;;;;N;;;;; +10A6E;OLD SOUTH ARABIAN LETTER SADHE;Lo;0;R;;;;;N;;;;; +10A6F;OLD SOUTH ARABIAN LETTER SAMEKH;Lo;0;R;;;;;N;;;;; +10A70;OLD SOUTH ARABIAN LETTER FE;Lo;0;R;;;;;N;;;;; +10A71;OLD SOUTH ARABIAN LETTER ALEF;Lo;0;R;;;;;N;;;;; +10A72;OLD SOUTH ARABIAN LETTER AYN;Lo;0;R;;;;;N;;;;; +10A73;OLD SOUTH ARABIAN LETTER DHADHE;Lo;0;R;;;;;N;;;;; +10A74;OLD SOUTH ARABIAN LETTER GIMEL;Lo;0;R;;;;;N;;;;; +10A75;OLD SOUTH ARABIAN LETTER DALETH;Lo;0;R;;;;;N;;;;; +10A76;OLD SOUTH ARABIAN LETTER GHAYN;Lo;0;R;;;;;N;;;;; +10A77;OLD SOUTH ARABIAN LETTER TETH;Lo;0;R;;;;;N;;;;; +10A78;OLD SOUTH ARABIAN LETTER ZAYN;Lo;0;R;;;;;N;;;;; +10A79;OLD SOUTH ARABIAN LETTER DHALETH;Lo;0;R;;;;;N;;;;; +10A7A;OLD SOUTH ARABIAN LETTER YODH;Lo;0;R;;;;;N;;;;; +10A7B;OLD SOUTH ARABIAN LETTER THAW;Lo;0;R;;;;;N;;;;; +10A7C;OLD SOUTH ARABIAN LETTER THETH;Lo;0;R;;;;;N;;;;; +10A7D;OLD SOUTH ARABIAN NUMBER ONE;No;0;R;;;;1;N;;;;; +10A7E;OLD SOUTH ARABIAN NUMBER FIFTY;No;0;R;;;;50;N;;;;; +10A7F;OLD SOUTH ARABIAN NUMERIC INDICATOR;Po;0;R;;;;;N;;;;; +10A80;OLD NORTH ARABIAN LETTER HEH;Lo;0;R;;;;;N;;;;; +10A81;OLD NORTH ARABIAN LETTER LAM;Lo;0;R;;;;;N;;;;; +10A82;OLD NORTH ARABIAN LETTER HAH;Lo;0;R;;;;;N;;;;; +10A83;OLD NORTH ARABIAN LETTER MEEM;Lo;0;R;;;;;N;;;;; +10A84;OLD NORTH ARABIAN LETTER QAF;Lo;0;R;;;;;N;;;;; +10A85;OLD NORTH ARABIAN LETTER WAW;Lo;0;R;;;;;N;;;;; +10A86;OLD NORTH ARABIAN LETTER ES-2;Lo;0;R;;;;;N;;;;; +10A87;OLD NORTH ARABIAN LETTER REH;Lo;0;R;;;;;N;;;;; +10A88;OLD NORTH ARABIAN LETTER BEH;Lo;0;R;;;;;N;;;;; +10A89;OLD NORTH ARABIAN LETTER TEH;Lo;0;R;;;;;N;;;;; +10A8A;OLD NORTH ARABIAN LETTER ES-1;Lo;0;R;;;;;N;;;;; +10A8B;OLD NORTH ARABIAN LETTER KAF;Lo;0;R;;;;;N;;;;; +10A8C;OLD NORTH ARABIAN LETTER NOON;Lo;0;R;;;;;N;;;;; +10A8D;OLD NORTH ARABIAN LETTER KHAH;Lo;0;R;;;;;N;;;;; +10A8E;OLD NORTH ARABIAN LETTER SAD;Lo;0;R;;;;;N;;;;; +10A8F;OLD NORTH ARABIAN LETTER ES-3;Lo;0;R;;;;;N;;;;; +10A90;OLD NORTH ARABIAN LETTER FEH;Lo;0;R;;;;;N;;;;; +10A91;OLD NORTH ARABIAN LETTER ALEF;Lo;0;R;;;;;N;;;;; +10A92;OLD NORTH ARABIAN LETTER AIN;Lo;0;R;;;;;N;;;;; +10A93;OLD NORTH ARABIAN LETTER DAD;Lo;0;R;;;;;N;;;;; +10A94;OLD NORTH ARABIAN LETTER GEEM;Lo;0;R;;;;;N;;;;; +10A95;OLD NORTH ARABIAN LETTER DAL;Lo;0;R;;;;;N;;;;; +10A96;OLD NORTH ARABIAN LETTER GHAIN;Lo;0;R;;;;;N;;;;; +10A97;OLD NORTH ARABIAN LETTER TAH;Lo;0;R;;;;;N;;;;; +10A98;OLD NORTH ARABIAN LETTER ZAIN;Lo;0;R;;;;;N;;;;; +10A99;OLD NORTH ARABIAN LETTER THAL;Lo;0;R;;;;;N;;;;; +10A9A;OLD NORTH ARABIAN LETTER YEH;Lo;0;R;;;;;N;;;;; +10A9B;OLD NORTH ARABIAN LETTER THEH;Lo;0;R;;;;;N;;;;; +10A9C;OLD NORTH ARABIAN LETTER ZAH;Lo;0;R;;;;;N;;;;; +10A9D;OLD NORTH ARABIAN NUMBER ONE;No;0;R;;;;1;N;;;;; +10A9E;OLD NORTH ARABIAN NUMBER TEN;No;0;R;;;;10;N;;;;; +10A9F;OLD NORTH ARABIAN NUMBER TWENTY;No;0;R;;;;20;N;;;;; +10AC0;MANICHAEAN LETTER ALEPH;Lo;0;R;;;;;N;;;;; +10AC1;MANICHAEAN LETTER BETH;Lo;0;R;;;;;N;;;;; +10AC2;MANICHAEAN LETTER BHETH;Lo;0;R;;;;;N;;;;; +10AC3;MANICHAEAN LETTER GIMEL;Lo;0;R;;;;;N;;;;; +10AC4;MANICHAEAN LETTER GHIMEL;Lo;0;R;;;;;N;;;;; +10AC5;MANICHAEAN LETTER DALETH;Lo;0;R;;;;;N;;;;; +10AC6;MANICHAEAN LETTER HE;Lo;0;R;;;;;N;;;;; +10AC7;MANICHAEAN LETTER WAW;Lo;0;R;;;;;N;;;;; +10AC8;MANICHAEAN SIGN UD;So;0;R;;;;;N;;;;; +10AC9;MANICHAEAN LETTER ZAYIN;Lo;0;R;;;;;N;;;;; +10ACA;MANICHAEAN LETTER ZHAYIN;Lo;0;R;;;;;N;;;;; +10ACB;MANICHAEAN LETTER JAYIN;Lo;0;R;;;;;N;;;;; +10ACC;MANICHAEAN LETTER JHAYIN;Lo;0;R;;;;;N;;;;; +10ACD;MANICHAEAN LETTER HETH;Lo;0;R;;;;;N;;;;; +10ACE;MANICHAEAN LETTER TETH;Lo;0;R;;;;;N;;;;; +10ACF;MANICHAEAN LETTER YODH;Lo;0;R;;;;;N;;;;; +10AD0;MANICHAEAN LETTER KAPH;Lo;0;R;;;;;N;;;;; +10AD1;MANICHAEAN LETTER XAPH;Lo;0;R;;;;;N;;;;; +10AD2;MANICHAEAN LETTER KHAPH;Lo;0;R;;;;;N;;;;; +10AD3;MANICHAEAN LETTER LAMEDH;Lo;0;R;;;;;N;;;;; +10AD4;MANICHAEAN LETTER DHAMEDH;Lo;0;R;;;;;N;;;;; +10AD5;MANICHAEAN LETTER THAMEDH;Lo;0;R;;;;;N;;;;; +10AD6;MANICHAEAN LETTER MEM;Lo;0;R;;;;;N;;;;; +10AD7;MANICHAEAN LETTER NUN;Lo;0;R;;;;;N;;;;; +10AD8;MANICHAEAN LETTER SAMEKH;Lo;0;R;;;;;N;;;;; +10AD9;MANICHAEAN LETTER AYIN;Lo;0;R;;;;;N;;;;; +10ADA;MANICHAEAN LETTER AAYIN;Lo;0;R;;;;;N;;;;; +10ADB;MANICHAEAN LETTER PE;Lo;0;R;;;;;N;;;;; +10ADC;MANICHAEAN LETTER FE;Lo;0;R;;;;;N;;;;; +10ADD;MANICHAEAN LETTER SADHE;Lo;0;R;;;;;N;;;;; +10ADE;MANICHAEAN LETTER QOPH;Lo;0;R;;;;;N;;;;; +10ADF;MANICHAEAN LETTER XOPH;Lo;0;R;;;;;N;;;;; +10AE0;MANICHAEAN LETTER QHOPH;Lo;0;R;;;;;N;;;;; +10AE1;MANICHAEAN LETTER RESH;Lo;0;R;;;;;N;;;;; +10AE2;MANICHAEAN LETTER SHIN;Lo;0;R;;;;;N;;;;; +10AE3;MANICHAEAN LETTER SSHIN;Lo;0;R;;;;;N;;;;; +10AE4;MANICHAEAN LETTER TAW;Lo;0;R;;;;;N;;;;; +10AE5;MANICHAEAN ABBREVIATION MARK ABOVE;Mn;230;NSM;;;;;N;;;;; +10AE6;MANICHAEAN ABBREVIATION MARK BELOW;Mn;220;NSM;;;;;N;;;;; +10AEB;MANICHAEAN NUMBER ONE;No;0;R;;;;1;N;;;;; +10AEC;MANICHAEAN NUMBER FIVE;No;0;R;;;;5;N;;;;; +10AED;MANICHAEAN NUMBER TEN;No;0;R;;;;10;N;;;;; +10AEE;MANICHAEAN NUMBER TWENTY;No;0;R;;;;20;N;;;;; +10AEF;MANICHAEAN NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; +10AF0;MANICHAEAN PUNCTUATION STAR;Po;0;R;;;;;N;;;;; +10AF1;MANICHAEAN PUNCTUATION FLEURON;Po;0;R;;;;;N;;;;; +10AF2;MANICHAEAN PUNCTUATION DOUBLE DOT WITHIN DOT;Po;0;R;;;;;N;;;;; +10AF3;MANICHAEAN PUNCTUATION DOT WITHIN DOT;Po;0;R;;;;;N;;;;; +10AF4;MANICHAEAN PUNCTUATION DOT;Po;0;R;;;;;N;;;;; +10AF5;MANICHAEAN PUNCTUATION TWO DOTS;Po;0;R;;;;;N;;;;; +10AF6;MANICHAEAN PUNCTUATION LINE FILLER;Po;0;R;;;;;N;;;;; +10B00;AVESTAN LETTER A;Lo;0;R;;;;;N;;;;; +10B01;AVESTAN LETTER AA;Lo;0;R;;;;;N;;;;; +10B02;AVESTAN LETTER AO;Lo;0;R;;;;;N;;;;; +10B03;AVESTAN LETTER AAO;Lo;0;R;;;;;N;;;;; +10B04;AVESTAN LETTER AN;Lo;0;R;;;;;N;;;;; +10B05;AVESTAN LETTER AAN;Lo;0;R;;;;;N;;;;; +10B06;AVESTAN LETTER AE;Lo;0;R;;;;;N;;;;; +10B07;AVESTAN LETTER AEE;Lo;0;R;;;;;N;;;;; +10B08;AVESTAN LETTER E;Lo;0;R;;;;;N;;;;; +10B09;AVESTAN LETTER EE;Lo;0;R;;;;;N;;;;; +10B0A;AVESTAN LETTER O;Lo;0;R;;;;;N;;;;; +10B0B;AVESTAN LETTER OO;Lo;0;R;;;;;N;;;;; +10B0C;AVESTAN LETTER I;Lo;0;R;;;;;N;;;;; +10B0D;AVESTAN LETTER II;Lo;0;R;;;;;N;;;;; +10B0E;AVESTAN LETTER U;Lo;0;R;;;;;N;;;;; +10B0F;AVESTAN LETTER UU;Lo;0;R;;;;;N;;;;; +10B10;AVESTAN LETTER KE;Lo;0;R;;;;;N;;;;; +10B11;AVESTAN LETTER XE;Lo;0;R;;;;;N;;;;; +10B12;AVESTAN LETTER XYE;Lo;0;R;;;;;N;;;;; +10B13;AVESTAN LETTER XVE;Lo;0;R;;;;;N;;;;; +10B14;AVESTAN LETTER GE;Lo;0;R;;;;;N;;;;; +10B15;AVESTAN LETTER GGE;Lo;0;R;;;;;N;;;;; +10B16;AVESTAN LETTER GHE;Lo;0;R;;;;;N;;;;; +10B17;AVESTAN LETTER CE;Lo;0;R;;;;;N;;;;; +10B18;AVESTAN LETTER JE;Lo;0;R;;;;;N;;;;; +10B19;AVESTAN LETTER TE;Lo;0;R;;;;;N;;;;; +10B1A;AVESTAN LETTER THE;Lo;0;R;;;;;N;;;;; +10B1B;AVESTAN LETTER DE;Lo;0;R;;;;;N;;;;; +10B1C;AVESTAN LETTER DHE;Lo;0;R;;;;;N;;;;; +10B1D;AVESTAN LETTER TTE;Lo;0;R;;;;;N;;;;; +10B1E;AVESTAN LETTER PE;Lo;0;R;;;;;N;;;;; +10B1F;AVESTAN LETTER FE;Lo;0;R;;;;;N;;;;; +10B20;AVESTAN LETTER BE;Lo;0;R;;;;;N;;;;; +10B21;AVESTAN LETTER BHE;Lo;0;R;;;;;N;;;;; +10B22;AVESTAN LETTER NGE;Lo;0;R;;;;;N;;;;; +10B23;AVESTAN LETTER NGYE;Lo;0;R;;;;;N;;;;; +10B24;AVESTAN LETTER NGVE;Lo;0;R;;;;;N;;;;; +10B25;AVESTAN LETTER NE;Lo;0;R;;;;;N;;;;; +10B26;AVESTAN LETTER NYE;Lo;0;R;;;;;N;;;;; +10B27;AVESTAN LETTER NNE;Lo;0;R;;;;;N;;;;; +10B28;AVESTAN LETTER ME;Lo;0;R;;;;;N;;;;; +10B29;AVESTAN LETTER HME;Lo;0;R;;;;;N;;;;; +10B2A;AVESTAN LETTER YYE;Lo;0;R;;;;;N;;;;; +10B2B;AVESTAN LETTER YE;Lo;0;R;;;;;N;;;;; +10B2C;AVESTAN LETTER VE;Lo;0;R;;;;;N;;;;; +10B2D;AVESTAN LETTER RE;Lo;0;R;;;;;N;;;;; +10B2E;AVESTAN LETTER LE;Lo;0;R;;;;;N;;;;; +10B2F;AVESTAN LETTER SE;Lo;0;R;;;;;N;;;;; +10B30;AVESTAN LETTER ZE;Lo;0;R;;;;;N;;;;; +10B31;AVESTAN LETTER SHE;Lo;0;R;;;;;N;;;;; +10B32;AVESTAN LETTER ZHE;Lo;0;R;;;;;N;;;;; +10B33;AVESTAN LETTER SHYE;Lo;0;R;;;;;N;;;;; +10B34;AVESTAN LETTER SSHE;Lo;0;R;;;;;N;;;;; +10B35;AVESTAN LETTER HE;Lo;0;R;;;;;N;;;;; +10B39;AVESTAN ABBREVIATION MARK;Po;0;ON;;;;;N;;;;; +10B3A;TINY TWO DOTS OVER ONE DOT PUNCTUATION;Po;0;ON;;;;;N;;;;; +10B3B;SMALL TWO DOTS OVER ONE DOT PUNCTUATION;Po;0;ON;;;;;N;;;;; +10B3C;LARGE TWO DOTS OVER ONE DOT PUNCTUATION;Po;0;ON;;;;;N;;;;; +10B3D;LARGE ONE DOT OVER TWO DOTS PUNCTUATION;Po;0;ON;;;;;N;;;;; +10B3E;LARGE TWO RINGS OVER ONE RING PUNCTUATION;Po;0;ON;;;;;N;;;;; +10B3F;LARGE ONE RING OVER TWO RINGS PUNCTUATION;Po;0;ON;;;;;N;;;;; +10B40;INSCRIPTIONAL PARTHIAN LETTER ALEPH;Lo;0;R;;;;;N;;;;; +10B41;INSCRIPTIONAL PARTHIAN LETTER BETH;Lo;0;R;;;;;N;;;;; +10B42;INSCRIPTIONAL PARTHIAN LETTER GIMEL;Lo;0;R;;;;;N;;;;; +10B43;INSCRIPTIONAL PARTHIAN LETTER DALETH;Lo;0;R;;;;;N;;;;; +10B44;INSCRIPTIONAL PARTHIAN LETTER HE;Lo;0;R;;;;;N;;;;; +10B45;INSCRIPTIONAL PARTHIAN LETTER WAW;Lo;0;R;;;;;N;;;;; +10B46;INSCRIPTIONAL PARTHIAN LETTER ZAYIN;Lo;0;R;;;;;N;;;;; +10B47;INSCRIPTIONAL PARTHIAN LETTER HETH;Lo;0;R;;;;;N;;;;; +10B48;INSCRIPTIONAL PARTHIAN LETTER TETH;Lo;0;R;;;;;N;;;;; +10B49;INSCRIPTIONAL PARTHIAN LETTER YODH;Lo;0;R;;;;;N;;;;; +10B4A;INSCRIPTIONAL PARTHIAN LETTER KAPH;Lo;0;R;;;;;N;;;;; +10B4B;INSCRIPTIONAL PARTHIAN LETTER LAMEDH;Lo;0;R;;;;;N;;;;; +10B4C;INSCRIPTIONAL PARTHIAN LETTER MEM;Lo;0;R;;;;;N;;;;; +10B4D;INSCRIPTIONAL PARTHIAN LETTER NUN;Lo;0;R;;;;;N;;;;; +10B4E;INSCRIPTIONAL PARTHIAN LETTER SAMEKH;Lo;0;R;;;;;N;;;;; +10B4F;INSCRIPTIONAL PARTHIAN LETTER AYIN;Lo;0;R;;;;;N;;;;; +10B50;INSCRIPTIONAL PARTHIAN LETTER PE;Lo;0;R;;;;;N;;;;; +10B51;INSCRIPTIONAL PARTHIAN LETTER SADHE;Lo;0;R;;;;;N;;;;; +10B52;INSCRIPTIONAL PARTHIAN LETTER QOPH;Lo;0;R;;;;;N;;;;; +10B53;INSCRIPTIONAL PARTHIAN LETTER RESH;Lo;0;R;;;;;N;;;;; +10B54;INSCRIPTIONAL PARTHIAN LETTER SHIN;Lo;0;R;;;;;N;;;;; +10B55;INSCRIPTIONAL PARTHIAN LETTER TAW;Lo;0;R;;;;;N;;;;; +10B58;INSCRIPTIONAL PARTHIAN NUMBER ONE;No;0;R;;;;1;N;;;;; +10B59;INSCRIPTIONAL PARTHIAN NUMBER TWO;No;0;R;;;;2;N;;;;; +10B5A;INSCRIPTIONAL PARTHIAN NUMBER THREE;No;0;R;;;;3;N;;;;; +10B5B;INSCRIPTIONAL PARTHIAN NUMBER FOUR;No;0;R;;;;4;N;;;;; +10B5C;INSCRIPTIONAL PARTHIAN NUMBER TEN;No;0;R;;;;10;N;;;;; +10B5D;INSCRIPTIONAL PARTHIAN NUMBER TWENTY;No;0;R;;;;20;N;;;;; +10B5E;INSCRIPTIONAL PARTHIAN NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; +10B5F;INSCRIPTIONAL PARTHIAN NUMBER ONE THOUSAND;No;0;R;;;;1000;N;;;;; +10B60;INSCRIPTIONAL PAHLAVI LETTER ALEPH;Lo;0;R;;;;;N;;;;; +10B61;INSCRIPTIONAL PAHLAVI LETTER BETH;Lo;0;R;;;;;N;;;;; +10B62;INSCRIPTIONAL PAHLAVI LETTER GIMEL;Lo;0;R;;;;;N;;;;; +10B63;INSCRIPTIONAL PAHLAVI LETTER DALETH;Lo;0;R;;;;;N;;;;; +10B64;INSCRIPTIONAL PAHLAVI LETTER HE;Lo;0;R;;;;;N;;;;; +10B65;INSCRIPTIONAL PAHLAVI LETTER WAW-AYIN-RESH;Lo;0;R;;;;;N;;;;; +10B66;INSCRIPTIONAL PAHLAVI LETTER ZAYIN;Lo;0;R;;;;;N;;;;; +10B67;INSCRIPTIONAL PAHLAVI LETTER HETH;Lo;0;R;;;;;N;;;;; +10B68;INSCRIPTIONAL PAHLAVI LETTER TETH;Lo;0;R;;;;;N;;;;; +10B69;INSCRIPTIONAL PAHLAVI LETTER YODH;Lo;0;R;;;;;N;;;;; +10B6A;INSCRIPTIONAL PAHLAVI LETTER KAPH;Lo;0;R;;;;;N;;;;; +10B6B;INSCRIPTIONAL PAHLAVI LETTER LAMEDH;Lo;0;R;;;;;N;;;;; +10B6C;INSCRIPTIONAL PAHLAVI LETTER MEM-QOPH;Lo;0;R;;;;;N;;;;; +10B6D;INSCRIPTIONAL PAHLAVI LETTER NUN;Lo;0;R;;;;;N;;;;; +10B6E;INSCRIPTIONAL PAHLAVI LETTER SAMEKH;Lo;0;R;;;;;N;;;;; +10B6F;INSCRIPTIONAL PAHLAVI LETTER PE;Lo;0;R;;;;;N;;;;; +10B70;INSCRIPTIONAL PAHLAVI LETTER SADHE;Lo;0;R;;;;;N;;;;; +10B71;INSCRIPTIONAL PAHLAVI LETTER SHIN;Lo;0;R;;;;;N;;;;; +10B72;INSCRIPTIONAL PAHLAVI LETTER TAW;Lo;0;R;;;;;N;;;;; +10B78;INSCRIPTIONAL PAHLAVI NUMBER ONE;No;0;R;;;;1;N;;;;; +10B79;INSCRIPTIONAL PAHLAVI NUMBER TWO;No;0;R;;;;2;N;;;;; +10B7A;INSCRIPTIONAL PAHLAVI NUMBER THREE;No;0;R;;;;3;N;;;;; +10B7B;INSCRIPTIONAL PAHLAVI NUMBER FOUR;No;0;R;;;;4;N;;;;; +10B7C;INSCRIPTIONAL PAHLAVI NUMBER TEN;No;0;R;;;;10;N;;;;; +10B7D;INSCRIPTIONAL PAHLAVI NUMBER TWENTY;No;0;R;;;;20;N;;;;; +10B7E;INSCRIPTIONAL PAHLAVI NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; +10B7F;INSCRIPTIONAL PAHLAVI NUMBER ONE THOUSAND;No;0;R;;;;1000;N;;;;; +10B80;PSALTER PAHLAVI LETTER ALEPH;Lo;0;R;;;;;N;;;;; +10B81;PSALTER PAHLAVI LETTER BETH;Lo;0;R;;;;;N;;;;; +10B82;PSALTER PAHLAVI LETTER GIMEL;Lo;0;R;;;;;N;;;;; +10B83;PSALTER PAHLAVI LETTER DALETH;Lo;0;R;;;;;N;;;;; +10B84;PSALTER PAHLAVI LETTER HE;Lo;0;R;;;;;N;;;;; +10B85;PSALTER PAHLAVI LETTER WAW-AYIN-RESH;Lo;0;R;;;;;N;;;;; +10B86;PSALTER PAHLAVI LETTER ZAYIN;Lo;0;R;;;;;N;;;;; +10B87;PSALTER PAHLAVI LETTER HETH;Lo;0;R;;;;;N;;;;; +10B88;PSALTER PAHLAVI LETTER YODH;Lo;0;R;;;;;N;;;;; +10B89;PSALTER PAHLAVI LETTER KAPH;Lo;0;R;;;;;N;;;;; +10B8A;PSALTER PAHLAVI LETTER LAMEDH;Lo;0;R;;;;;N;;;;; +10B8B;PSALTER PAHLAVI LETTER MEM-QOPH;Lo;0;R;;;;;N;;;;; +10B8C;PSALTER PAHLAVI LETTER NUN;Lo;0;R;;;;;N;;;;; +10B8D;PSALTER PAHLAVI LETTER SAMEKH;Lo;0;R;;;;;N;;;;; +10B8E;PSALTER PAHLAVI LETTER PE;Lo;0;R;;;;;N;;;;; +10B8F;PSALTER PAHLAVI LETTER SADHE;Lo;0;R;;;;;N;;;;; +10B90;PSALTER PAHLAVI LETTER SHIN;Lo;0;R;;;;;N;;;;; +10B91;PSALTER PAHLAVI LETTER TAW;Lo;0;R;;;;;N;;;;; +10B99;PSALTER PAHLAVI SECTION MARK;Po;0;R;;;;;N;;;;; +10B9A;PSALTER PAHLAVI TURNED SECTION MARK;Po;0;R;;;;;N;;;;; +10B9B;PSALTER PAHLAVI FOUR DOTS WITH CROSS;Po;0;R;;;;;N;;;;; +10B9C;PSALTER PAHLAVI FOUR DOTS WITH DOT;Po;0;R;;;;;N;;;;; +10BA9;PSALTER PAHLAVI NUMBER ONE;No;0;R;;;;1;N;;;;; +10BAA;PSALTER PAHLAVI NUMBER TWO;No;0;R;;;;2;N;;;;; +10BAB;PSALTER PAHLAVI NUMBER THREE;No;0;R;;;;3;N;;;;; +10BAC;PSALTER PAHLAVI NUMBER FOUR;No;0;R;;;;4;N;;;;; +10BAD;PSALTER PAHLAVI NUMBER TEN;No;0;R;;;;10;N;;;;; +10BAE;PSALTER PAHLAVI NUMBER TWENTY;No;0;R;;;;20;N;;;;; +10BAF;PSALTER PAHLAVI NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; +10C00;OLD TURKIC LETTER ORKHON A;Lo;0;R;;;;;N;;;;; +10C01;OLD TURKIC LETTER YENISEI A;Lo;0;R;;;;;N;;;;; +10C02;OLD TURKIC LETTER YENISEI AE;Lo;0;R;;;;;N;;;;; +10C03;OLD TURKIC LETTER ORKHON I;Lo;0;R;;;;;N;;;;; +10C04;OLD TURKIC LETTER YENISEI I;Lo;0;R;;;;;N;;;;; +10C05;OLD TURKIC LETTER YENISEI E;Lo;0;R;;;;;N;;;;; +10C06;OLD TURKIC LETTER ORKHON O;Lo;0;R;;;;;N;;;;; +10C07;OLD TURKIC LETTER ORKHON OE;Lo;0;R;;;;;N;;;;; +10C08;OLD TURKIC LETTER YENISEI OE;Lo;0;R;;;;;N;;;;; +10C09;OLD TURKIC LETTER ORKHON AB;Lo;0;R;;;;;N;;;;; +10C0A;OLD TURKIC LETTER YENISEI AB;Lo;0;R;;;;;N;;;;; +10C0B;OLD TURKIC LETTER ORKHON AEB;Lo;0;R;;;;;N;;;;; +10C0C;OLD TURKIC LETTER YENISEI AEB;Lo;0;R;;;;;N;;;;; +10C0D;OLD TURKIC LETTER ORKHON AG;Lo;0;R;;;;;N;;;;; +10C0E;OLD TURKIC LETTER YENISEI AG;Lo;0;R;;;;;N;;;;; +10C0F;OLD TURKIC LETTER ORKHON AEG;Lo;0;R;;;;;N;;;;; +10C10;OLD TURKIC LETTER YENISEI AEG;Lo;0;R;;;;;N;;;;; +10C11;OLD TURKIC LETTER ORKHON AD;Lo;0;R;;;;;N;;;;; +10C12;OLD TURKIC LETTER YENISEI AD;Lo;0;R;;;;;N;;;;; +10C13;OLD TURKIC LETTER ORKHON AED;Lo;0;R;;;;;N;;;;; +10C14;OLD TURKIC LETTER ORKHON EZ;Lo;0;R;;;;;N;;;;; +10C15;OLD TURKIC LETTER YENISEI EZ;Lo;0;R;;;;;N;;;;; +10C16;OLD TURKIC LETTER ORKHON AY;Lo;0;R;;;;;N;;;;; +10C17;OLD TURKIC LETTER YENISEI AY;Lo;0;R;;;;;N;;;;; +10C18;OLD TURKIC LETTER ORKHON AEY;Lo;0;R;;;;;N;;;;; +10C19;OLD TURKIC LETTER YENISEI AEY;Lo;0;R;;;;;N;;;;; +10C1A;OLD TURKIC LETTER ORKHON AEK;Lo;0;R;;;;;N;;;;; +10C1B;OLD TURKIC LETTER YENISEI AEK;Lo;0;R;;;;;N;;;;; +10C1C;OLD TURKIC LETTER ORKHON OEK;Lo;0;R;;;;;N;;;;; +10C1D;OLD TURKIC LETTER YENISEI OEK;Lo;0;R;;;;;N;;;;; +10C1E;OLD TURKIC LETTER ORKHON AL;Lo;0;R;;;;;N;;;;; +10C1F;OLD TURKIC LETTER YENISEI AL;Lo;0;R;;;;;N;;;;; +10C20;OLD TURKIC LETTER ORKHON AEL;Lo;0;R;;;;;N;;;;; +10C21;OLD TURKIC LETTER ORKHON ELT;Lo;0;R;;;;;N;;;;; +10C22;OLD TURKIC LETTER ORKHON EM;Lo;0;R;;;;;N;;;;; +10C23;OLD TURKIC LETTER ORKHON AN;Lo;0;R;;;;;N;;;;; +10C24;OLD TURKIC LETTER ORKHON AEN;Lo;0;R;;;;;N;;;;; +10C25;OLD TURKIC LETTER YENISEI AEN;Lo;0;R;;;;;N;;;;; +10C26;OLD TURKIC LETTER ORKHON ENT;Lo;0;R;;;;;N;;;;; +10C27;OLD TURKIC LETTER YENISEI ENT;Lo;0;R;;;;;N;;;;; +10C28;OLD TURKIC LETTER ORKHON ENC;Lo;0;R;;;;;N;;;;; +10C29;OLD TURKIC LETTER YENISEI ENC;Lo;0;R;;;;;N;;;;; +10C2A;OLD TURKIC LETTER ORKHON ENY;Lo;0;R;;;;;N;;;;; +10C2B;OLD TURKIC LETTER YENISEI ENY;Lo;0;R;;;;;N;;;;; +10C2C;OLD TURKIC LETTER YENISEI ANG;Lo;0;R;;;;;N;;;;; +10C2D;OLD TURKIC LETTER ORKHON ENG;Lo;0;R;;;;;N;;;;; +10C2E;OLD TURKIC LETTER YENISEI AENG;Lo;0;R;;;;;N;;;;; +10C2F;OLD TURKIC LETTER ORKHON EP;Lo;0;R;;;;;N;;;;; +10C30;OLD TURKIC LETTER ORKHON OP;Lo;0;R;;;;;N;;;;; +10C31;OLD TURKIC LETTER ORKHON IC;Lo;0;R;;;;;N;;;;; +10C32;OLD TURKIC LETTER ORKHON EC;Lo;0;R;;;;;N;;;;; +10C33;OLD TURKIC LETTER YENISEI EC;Lo;0;R;;;;;N;;;;; +10C34;OLD TURKIC LETTER ORKHON AQ;Lo;0;R;;;;;N;;;;; +10C35;OLD TURKIC LETTER YENISEI AQ;Lo;0;R;;;;;N;;;;; +10C36;OLD TURKIC LETTER ORKHON IQ;Lo;0;R;;;;;N;;;;; +10C37;OLD TURKIC LETTER YENISEI IQ;Lo;0;R;;;;;N;;;;; +10C38;OLD TURKIC LETTER ORKHON OQ;Lo;0;R;;;;;N;;;;; +10C39;OLD TURKIC LETTER YENISEI OQ;Lo;0;R;;;;;N;;;;; +10C3A;OLD TURKIC LETTER ORKHON AR;Lo;0;R;;;;;N;;;;; +10C3B;OLD TURKIC LETTER YENISEI AR;Lo;0;R;;;;;N;;;;; +10C3C;OLD TURKIC LETTER ORKHON AER;Lo;0;R;;;;;N;;;;; +10C3D;OLD TURKIC LETTER ORKHON AS;Lo;0;R;;;;;N;;;;; +10C3E;OLD TURKIC LETTER ORKHON AES;Lo;0;R;;;;;N;;;;; +10C3F;OLD TURKIC LETTER ORKHON ASH;Lo;0;R;;;;;N;;;;; +10C40;OLD TURKIC LETTER YENISEI ASH;Lo;0;R;;;;;N;;;;; +10C41;OLD TURKIC LETTER ORKHON ESH;Lo;0;R;;;;;N;;;;; +10C42;OLD TURKIC LETTER YENISEI ESH;Lo;0;R;;;;;N;;;;; +10C43;OLD TURKIC LETTER ORKHON AT;Lo;0;R;;;;;N;;;;; +10C44;OLD TURKIC LETTER YENISEI AT;Lo;0;R;;;;;N;;;;; +10C45;OLD TURKIC LETTER ORKHON AET;Lo;0;R;;;;;N;;;;; +10C46;OLD TURKIC LETTER YENISEI AET;Lo;0;R;;;;;N;;;;; +10C47;OLD TURKIC LETTER ORKHON OT;Lo;0;R;;;;;N;;;;; +10C48;OLD TURKIC LETTER ORKHON BASH;Lo;0;R;;;;;N;;;;; +10C80;OLD HUNGARIAN CAPITAL LETTER A;Lu;0;R;;;;;N;;;;10CC0; +10C81;OLD HUNGARIAN CAPITAL LETTER AA;Lu;0;R;;;;;N;;;;10CC1; +10C82;OLD HUNGARIAN CAPITAL LETTER EB;Lu;0;R;;;;;N;;;;10CC2; +10C83;OLD HUNGARIAN CAPITAL LETTER AMB;Lu;0;R;;;;;N;;;;10CC3; +10C84;OLD HUNGARIAN CAPITAL LETTER EC;Lu;0;R;;;;;N;;;;10CC4; +10C85;OLD HUNGARIAN CAPITAL LETTER ENC;Lu;0;R;;;;;N;;;;10CC5; +10C86;OLD HUNGARIAN CAPITAL LETTER ECS;Lu;0;R;;;;;N;;;;10CC6; +10C87;OLD HUNGARIAN CAPITAL LETTER ED;Lu;0;R;;;;;N;;;;10CC7; +10C88;OLD HUNGARIAN CAPITAL LETTER AND;Lu;0;R;;;;;N;;;;10CC8; +10C89;OLD HUNGARIAN CAPITAL LETTER E;Lu;0;R;;;;;N;;;;10CC9; +10C8A;OLD HUNGARIAN CAPITAL LETTER CLOSE E;Lu;0;R;;;;;N;;;;10CCA; +10C8B;OLD HUNGARIAN CAPITAL LETTER EE;Lu;0;R;;;;;N;;;;10CCB; +10C8C;OLD HUNGARIAN CAPITAL LETTER EF;Lu;0;R;;;;;N;;;;10CCC; +10C8D;OLD HUNGARIAN CAPITAL LETTER EG;Lu;0;R;;;;;N;;;;10CCD; +10C8E;OLD HUNGARIAN CAPITAL LETTER EGY;Lu;0;R;;;;;N;;;;10CCE; +10C8F;OLD HUNGARIAN CAPITAL LETTER EH;Lu;0;R;;;;;N;;;;10CCF; +10C90;OLD HUNGARIAN CAPITAL LETTER I;Lu;0;R;;;;;N;;;;10CD0; +10C91;OLD HUNGARIAN CAPITAL LETTER II;Lu;0;R;;;;;N;;;;10CD1; +10C92;OLD HUNGARIAN CAPITAL LETTER EJ;Lu;0;R;;;;;N;;;;10CD2; +10C93;OLD HUNGARIAN CAPITAL LETTER EK;Lu;0;R;;;;;N;;;;10CD3; +10C94;OLD HUNGARIAN CAPITAL LETTER AK;Lu;0;R;;;;;N;;;;10CD4; +10C95;OLD HUNGARIAN CAPITAL LETTER UNK;Lu;0;R;;;;;N;;;;10CD5; +10C96;OLD HUNGARIAN CAPITAL LETTER EL;Lu;0;R;;;;;N;;;;10CD6; +10C97;OLD HUNGARIAN CAPITAL LETTER ELY;Lu;0;R;;;;;N;;;;10CD7; +10C98;OLD HUNGARIAN CAPITAL LETTER EM;Lu;0;R;;;;;N;;;;10CD8; +10C99;OLD HUNGARIAN CAPITAL LETTER EN;Lu;0;R;;;;;N;;;;10CD9; +10C9A;OLD HUNGARIAN CAPITAL LETTER ENY;Lu;0;R;;;;;N;;;;10CDA; +10C9B;OLD HUNGARIAN CAPITAL LETTER O;Lu;0;R;;;;;N;;;;10CDB; +10C9C;OLD HUNGARIAN CAPITAL LETTER OO;Lu;0;R;;;;;N;;;;10CDC; +10C9D;OLD HUNGARIAN CAPITAL LETTER NIKOLSBURG OE;Lu;0;R;;;;;N;;;;10CDD; +10C9E;OLD HUNGARIAN CAPITAL LETTER RUDIMENTA OE;Lu;0;R;;;;;N;;;;10CDE; +10C9F;OLD HUNGARIAN CAPITAL LETTER OEE;Lu;0;R;;;;;N;;;;10CDF; +10CA0;OLD HUNGARIAN CAPITAL LETTER EP;Lu;0;R;;;;;N;;;;10CE0; +10CA1;OLD HUNGARIAN CAPITAL LETTER EMP;Lu;0;R;;;;;N;;;;10CE1; +10CA2;OLD HUNGARIAN CAPITAL LETTER ER;Lu;0;R;;;;;N;;;;10CE2; +10CA3;OLD HUNGARIAN CAPITAL LETTER SHORT ER;Lu;0;R;;;;;N;;;;10CE3; +10CA4;OLD HUNGARIAN CAPITAL LETTER ES;Lu;0;R;;;;;N;;;;10CE4; +10CA5;OLD HUNGARIAN CAPITAL LETTER ESZ;Lu;0;R;;;;;N;;;;10CE5; +10CA6;OLD HUNGARIAN CAPITAL LETTER ET;Lu;0;R;;;;;N;;;;10CE6; +10CA7;OLD HUNGARIAN CAPITAL LETTER ENT;Lu;0;R;;;;;N;;;;10CE7; +10CA8;OLD HUNGARIAN CAPITAL LETTER ETY;Lu;0;R;;;;;N;;;;10CE8; +10CA9;OLD HUNGARIAN CAPITAL LETTER ECH;Lu;0;R;;;;;N;;;;10CE9; +10CAA;OLD HUNGARIAN CAPITAL LETTER U;Lu;0;R;;;;;N;;;;10CEA; +10CAB;OLD HUNGARIAN CAPITAL LETTER UU;Lu;0;R;;;;;N;;;;10CEB; +10CAC;OLD HUNGARIAN CAPITAL LETTER NIKOLSBURG UE;Lu;0;R;;;;;N;;;;10CEC; +10CAD;OLD HUNGARIAN CAPITAL LETTER RUDIMENTA UE;Lu;0;R;;;;;N;;;;10CED; +10CAE;OLD HUNGARIAN CAPITAL LETTER EV;Lu;0;R;;;;;N;;;;10CEE; +10CAF;OLD HUNGARIAN CAPITAL LETTER EZ;Lu;0;R;;;;;N;;;;10CEF; +10CB0;OLD HUNGARIAN CAPITAL LETTER EZS;Lu;0;R;;;;;N;;;;10CF0; +10CB1;OLD HUNGARIAN CAPITAL LETTER ENT-SHAPED SIGN;Lu;0;R;;;;;N;;;;10CF1; +10CB2;OLD HUNGARIAN CAPITAL LETTER US;Lu;0;R;;;;;N;;;;10CF2; +10CC0;OLD HUNGARIAN SMALL LETTER A;Ll;0;R;;;;;N;;;10C80;;10C80 +10CC1;OLD HUNGARIAN SMALL LETTER AA;Ll;0;R;;;;;N;;;10C81;;10C81 +10CC2;OLD HUNGARIAN SMALL LETTER EB;Ll;0;R;;;;;N;;;10C82;;10C82 +10CC3;OLD HUNGARIAN SMALL LETTER AMB;Ll;0;R;;;;;N;;;10C83;;10C83 +10CC4;OLD HUNGARIAN SMALL LETTER EC;Ll;0;R;;;;;N;;;10C84;;10C84 +10CC5;OLD HUNGARIAN SMALL LETTER ENC;Ll;0;R;;;;;N;;;10C85;;10C85 +10CC6;OLD HUNGARIAN SMALL LETTER ECS;Ll;0;R;;;;;N;;;10C86;;10C86 +10CC7;OLD HUNGARIAN SMALL LETTER ED;Ll;0;R;;;;;N;;;10C87;;10C87 +10CC8;OLD HUNGARIAN SMALL LETTER AND;Ll;0;R;;;;;N;;;10C88;;10C88 +10CC9;OLD HUNGARIAN SMALL LETTER E;Ll;0;R;;;;;N;;;10C89;;10C89 +10CCA;OLD HUNGARIAN SMALL LETTER CLOSE E;Ll;0;R;;;;;N;;;10C8A;;10C8A +10CCB;OLD HUNGARIAN SMALL LETTER EE;Ll;0;R;;;;;N;;;10C8B;;10C8B +10CCC;OLD HUNGARIAN SMALL LETTER EF;Ll;0;R;;;;;N;;;10C8C;;10C8C +10CCD;OLD HUNGARIAN SMALL LETTER EG;Ll;0;R;;;;;N;;;10C8D;;10C8D +10CCE;OLD HUNGARIAN SMALL LETTER EGY;Ll;0;R;;;;;N;;;10C8E;;10C8E +10CCF;OLD HUNGARIAN SMALL LETTER EH;Ll;0;R;;;;;N;;;10C8F;;10C8F +10CD0;OLD HUNGARIAN SMALL LETTER I;Ll;0;R;;;;;N;;;10C90;;10C90 +10CD1;OLD HUNGARIAN SMALL LETTER II;Ll;0;R;;;;;N;;;10C91;;10C91 +10CD2;OLD HUNGARIAN SMALL LETTER EJ;Ll;0;R;;;;;N;;;10C92;;10C92 +10CD3;OLD HUNGARIAN SMALL LETTER EK;Ll;0;R;;;;;N;;;10C93;;10C93 +10CD4;OLD HUNGARIAN SMALL LETTER AK;Ll;0;R;;;;;N;;;10C94;;10C94 +10CD5;OLD HUNGARIAN SMALL LETTER UNK;Ll;0;R;;;;;N;;;10C95;;10C95 +10CD6;OLD HUNGARIAN SMALL LETTER EL;Ll;0;R;;;;;N;;;10C96;;10C96 +10CD7;OLD HUNGARIAN SMALL LETTER ELY;Ll;0;R;;;;;N;;;10C97;;10C97 +10CD8;OLD HUNGARIAN SMALL LETTER EM;Ll;0;R;;;;;N;;;10C98;;10C98 +10CD9;OLD HUNGARIAN SMALL LETTER EN;Ll;0;R;;;;;N;;;10C99;;10C99 +10CDA;OLD HUNGARIAN SMALL LETTER ENY;Ll;0;R;;;;;N;;;10C9A;;10C9A +10CDB;OLD HUNGARIAN SMALL LETTER O;Ll;0;R;;;;;N;;;10C9B;;10C9B +10CDC;OLD HUNGARIAN SMALL LETTER OO;Ll;0;R;;;;;N;;;10C9C;;10C9C +10CDD;OLD HUNGARIAN SMALL LETTER NIKOLSBURG OE;Ll;0;R;;;;;N;;;10C9D;;10C9D +10CDE;OLD HUNGARIAN SMALL LETTER RUDIMENTA OE;Ll;0;R;;;;;N;;;10C9E;;10C9E +10CDF;OLD HUNGARIAN SMALL LETTER OEE;Ll;0;R;;;;;N;;;10C9F;;10C9F +10CE0;OLD HUNGARIAN SMALL LETTER EP;Ll;0;R;;;;;N;;;10CA0;;10CA0 +10CE1;OLD HUNGARIAN SMALL LETTER EMP;Ll;0;R;;;;;N;;;10CA1;;10CA1 +10CE2;OLD HUNGARIAN SMALL LETTER ER;Ll;0;R;;;;;N;;;10CA2;;10CA2 +10CE3;OLD HUNGARIAN SMALL LETTER SHORT ER;Ll;0;R;;;;;N;;;10CA3;;10CA3 +10CE4;OLD HUNGARIAN SMALL LETTER ES;Ll;0;R;;;;;N;;;10CA4;;10CA4 +10CE5;OLD HUNGARIAN SMALL LETTER ESZ;Ll;0;R;;;;;N;;;10CA5;;10CA5 +10CE6;OLD HUNGARIAN SMALL LETTER ET;Ll;0;R;;;;;N;;;10CA6;;10CA6 +10CE7;OLD HUNGARIAN SMALL LETTER ENT;Ll;0;R;;;;;N;;;10CA7;;10CA7 +10CE8;OLD HUNGARIAN SMALL LETTER ETY;Ll;0;R;;;;;N;;;10CA8;;10CA8 +10CE9;OLD HUNGARIAN SMALL LETTER ECH;Ll;0;R;;;;;N;;;10CA9;;10CA9 +10CEA;OLD HUNGARIAN SMALL LETTER U;Ll;0;R;;;;;N;;;10CAA;;10CAA +10CEB;OLD HUNGARIAN SMALL LETTER UU;Ll;0;R;;;;;N;;;10CAB;;10CAB +10CEC;OLD HUNGARIAN SMALL LETTER NIKOLSBURG UE;Ll;0;R;;;;;N;;;10CAC;;10CAC +10CED;OLD HUNGARIAN SMALL LETTER RUDIMENTA UE;Ll;0;R;;;;;N;;;10CAD;;10CAD +10CEE;OLD HUNGARIAN SMALL LETTER EV;Ll;0;R;;;;;N;;;10CAE;;10CAE +10CEF;OLD HUNGARIAN SMALL LETTER EZ;Ll;0;R;;;;;N;;;10CAF;;10CAF +10CF0;OLD HUNGARIAN SMALL LETTER EZS;Ll;0;R;;;;;N;;;10CB0;;10CB0 +10CF1;OLD HUNGARIAN SMALL LETTER ENT-SHAPED SIGN;Ll;0;R;;;;;N;;;10CB1;;10CB1 +10CF2;OLD HUNGARIAN SMALL LETTER US;Ll;0;R;;;;;N;;;10CB2;;10CB2 +10CFA;OLD HUNGARIAN NUMBER ONE;No;0;R;;;;1;N;;;;; +10CFB;OLD HUNGARIAN NUMBER FIVE;No;0;R;;;;5;N;;;;; +10CFC;OLD HUNGARIAN NUMBER TEN;No;0;R;;;;10;N;;;;; +10CFD;OLD HUNGARIAN NUMBER FIFTY;No;0;R;;;;50;N;;;;; +10CFE;OLD HUNGARIAN NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; +10CFF;OLD HUNGARIAN NUMBER ONE THOUSAND;No;0;R;;;;1000;N;;;;; +10D00;HANIFI ROHINGYA LETTER A;Lo;0;AL;;;;;N;;;;; +10D01;HANIFI ROHINGYA LETTER BA;Lo;0;AL;;;;;N;;;;; +10D02;HANIFI ROHINGYA LETTER PA;Lo;0;AL;;;;;N;;;;; +10D03;HANIFI ROHINGYA LETTER TA;Lo;0;AL;;;;;N;;;;; +10D04;HANIFI ROHINGYA LETTER TTA;Lo;0;AL;;;;;N;;;;; +10D05;HANIFI ROHINGYA LETTER JA;Lo;0;AL;;;;;N;;;;; +10D06;HANIFI ROHINGYA LETTER CA;Lo;0;AL;;;;;N;;;;; +10D07;HANIFI ROHINGYA LETTER HA;Lo;0;AL;;;;;N;;;;; +10D08;HANIFI ROHINGYA LETTER KHA;Lo;0;AL;;;;;N;;;;; +10D09;HANIFI ROHINGYA LETTER FA;Lo;0;AL;;;;;N;;;;; +10D0A;HANIFI ROHINGYA LETTER DA;Lo;0;AL;;;;;N;;;;; +10D0B;HANIFI ROHINGYA LETTER DDA;Lo;0;AL;;;;;N;;;;; +10D0C;HANIFI ROHINGYA LETTER RA;Lo;0;AL;;;;;N;;;;; +10D0D;HANIFI ROHINGYA LETTER RRA;Lo;0;AL;;;;;N;;;;; +10D0E;HANIFI ROHINGYA LETTER ZA;Lo;0;AL;;;;;N;;;;; +10D0F;HANIFI ROHINGYA LETTER SA;Lo;0;AL;;;;;N;;;;; +10D10;HANIFI ROHINGYA LETTER SHA;Lo;0;AL;;;;;N;;;;; +10D11;HANIFI ROHINGYA LETTER KA;Lo;0;AL;;;;;N;;;;; +10D12;HANIFI ROHINGYA LETTER GA;Lo;0;AL;;;;;N;;;;; +10D13;HANIFI ROHINGYA LETTER LA;Lo;0;AL;;;;;N;;;;; +10D14;HANIFI ROHINGYA LETTER MA;Lo;0;AL;;;;;N;;;;; +10D15;HANIFI ROHINGYA LETTER NA;Lo;0;AL;;;;;N;;;;; +10D16;HANIFI ROHINGYA LETTER WA;Lo;0;AL;;;;;N;;;;; +10D17;HANIFI ROHINGYA LETTER KINNA WA;Lo;0;AL;;;;;N;;;;; +10D18;HANIFI ROHINGYA LETTER YA;Lo;0;AL;;;;;N;;;;; +10D19;HANIFI ROHINGYA LETTER KINNA YA;Lo;0;AL;;;;;N;;;;; +10D1A;HANIFI ROHINGYA LETTER NGA;Lo;0;AL;;;;;N;;;;; +10D1B;HANIFI ROHINGYA LETTER NYA;Lo;0;AL;;;;;N;;;;; +10D1C;HANIFI ROHINGYA LETTER VA;Lo;0;AL;;;;;N;;;;; +10D1D;HANIFI ROHINGYA VOWEL A;Lo;0;AL;;;;;N;;;;; +10D1E;HANIFI ROHINGYA VOWEL I;Lo;0;AL;;;;;N;;;;; +10D1F;HANIFI ROHINGYA VOWEL U;Lo;0;AL;;;;;N;;;;; +10D20;HANIFI ROHINGYA VOWEL E;Lo;0;AL;;;;;N;;;;; +10D21;HANIFI ROHINGYA VOWEL O;Lo;0;AL;;;;;N;;;;; +10D22;HANIFI ROHINGYA MARK SAKIN;Lo;0;AL;;;;;N;;;;; +10D23;HANIFI ROHINGYA MARK NA KHONNA;Lo;0;AL;;;;;N;;;;; +10D24;HANIFI ROHINGYA SIGN HARBAHAY;Mn;230;NSM;;;;;N;;;;; +10D25;HANIFI ROHINGYA SIGN TAHALA;Mn;230;NSM;;;;;N;;;;; +10D26;HANIFI ROHINGYA SIGN TANA;Mn;230;NSM;;;;;N;;;;; +10D27;HANIFI ROHINGYA SIGN TASSI;Mn;230;NSM;;;;;N;;;;; +10D30;HANIFI ROHINGYA DIGIT ZERO;Nd;0;AN;;0;0;0;N;;;;; +10D31;HANIFI ROHINGYA DIGIT ONE;Nd;0;AN;;1;1;1;N;;;;; +10D32;HANIFI ROHINGYA DIGIT TWO;Nd;0;AN;;2;2;2;N;;;;; +10D33;HANIFI ROHINGYA DIGIT THREE;Nd;0;AN;;3;3;3;N;;;;; +10D34;HANIFI ROHINGYA DIGIT FOUR;Nd;0;AN;;4;4;4;N;;;;; +10D35;HANIFI ROHINGYA DIGIT FIVE;Nd;0;AN;;5;5;5;N;;;;; +10D36;HANIFI ROHINGYA DIGIT SIX;Nd;0;AN;;6;6;6;N;;;;; +10D37;HANIFI ROHINGYA DIGIT SEVEN;Nd;0;AN;;7;7;7;N;;;;; +10D38;HANIFI ROHINGYA DIGIT EIGHT;Nd;0;AN;;8;8;8;N;;;;; +10D39;HANIFI ROHINGYA DIGIT NINE;Nd;0;AN;;9;9;9;N;;;;; +10E60;RUMI DIGIT ONE;No;0;AN;;;1;1;N;;;;; +10E61;RUMI DIGIT TWO;No;0;AN;;;2;2;N;;;;; +10E62;RUMI DIGIT THREE;No;0;AN;;;3;3;N;;;;; +10E63;RUMI DIGIT FOUR;No;0;AN;;;4;4;N;;;;; +10E64;RUMI DIGIT FIVE;No;0;AN;;;5;5;N;;;;; +10E65;RUMI DIGIT SIX;No;0;AN;;;6;6;N;;;;; +10E66;RUMI DIGIT SEVEN;No;0;AN;;;7;7;N;;;;; +10E67;RUMI DIGIT EIGHT;No;0;AN;;;8;8;N;;;;; +10E68;RUMI DIGIT NINE;No;0;AN;;;9;9;N;;;;; +10E69;RUMI NUMBER TEN;No;0;AN;;;;10;N;;;;; +10E6A;RUMI NUMBER TWENTY;No;0;AN;;;;20;N;;;;; +10E6B;RUMI NUMBER THIRTY;No;0;AN;;;;30;N;;;;; +10E6C;RUMI NUMBER FORTY;No;0;AN;;;;40;N;;;;; +10E6D;RUMI NUMBER FIFTY;No;0;AN;;;;50;N;;;;; +10E6E;RUMI NUMBER SIXTY;No;0;AN;;;;60;N;;;;; +10E6F;RUMI NUMBER SEVENTY;No;0;AN;;;;70;N;;;;; +10E70;RUMI NUMBER EIGHTY;No;0;AN;;;;80;N;;;;; +10E71;RUMI NUMBER NINETY;No;0;AN;;;;90;N;;;;; +10E72;RUMI NUMBER ONE HUNDRED;No;0;AN;;;;100;N;;;;; +10E73;RUMI NUMBER TWO HUNDRED;No;0;AN;;;;200;N;;;;; +10E74;RUMI NUMBER THREE HUNDRED;No;0;AN;;;;300;N;;;;; +10E75;RUMI NUMBER FOUR HUNDRED;No;0;AN;;;;400;N;;;;; +10E76;RUMI NUMBER FIVE HUNDRED;No;0;AN;;;;500;N;;;;; +10E77;RUMI NUMBER SIX HUNDRED;No;0;AN;;;;600;N;;;;; +10E78;RUMI NUMBER SEVEN HUNDRED;No;0;AN;;;;700;N;;;;; +10E79;RUMI NUMBER EIGHT HUNDRED;No;0;AN;;;;800;N;;;;; +10E7A;RUMI NUMBER NINE HUNDRED;No;0;AN;;;;900;N;;;;; +10E7B;RUMI FRACTION ONE HALF;No;0;AN;;;;1/2;N;;;;; +10E7C;RUMI FRACTION ONE QUARTER;No;0;AN;;;;1/4;N;;;;; +10E7D;RUMI FRACTION ONE THIRD;No;0;AN;;;;1/3;N;;;;; +10E7E;RUMI FRACTION TWO THIRDS;No;0;AN;;;;2/3;N;;;;; +10F00;OLD SOGDIAN LETTER ALEPH;Lo;0;R;;;;;N;;;;; +10F01;OLD SOGDIAN LETTER FINAL ALEPH;Lo;0;R;;;;;N;;;;; +10F02;OLD SOGDIAN LETTER BETH;Lo;0;R;;;;;N;;;;; +10F03;OLD SOGDIAN LETTER FINAL BETH;Lo;0;R;;;;;N;;;;; +10F04;OLD SOGDIAN LETTER GIMEL;Lo;0;R;;;;;N;;;;; +10F05;OLD SOGDIAN LETTER HE;Lo;0;R;;;;;N;;;;; +10F06;OLD SOGDIAN LETTER FINAL HE;Lo;0;R;;;;;N;;;;; +10F07;OLD SOGDIAN LETTER WAW;Lo;0;R;;;;;N;;;;; +10F08;OLD SOGDIAN LETTER ZAYIN;Lo;0;R;;;;;N;;;;; +10F09;OLD SOGDIAN LETTER HETH;Lo;0;R;;;;;N;;;;; +10F0A;OLD SOGDIAN LETTER YODH;Lo;0;R;;;;;N;;;;; +10F0B;OLD SOGDIAN LETTER KAPH;Lo;0;R;;;;;N;;;;; +10F0C;OLD SOGDIAN LETTER LAMEDH;Lo;0;R;;;;;N;;;;; +10F0D;OLD SOGDIAN LETTER MEM;Lo;0;R;;;;;N;;;;; +10F0E;OLD SOGDIAN LETTER NUN;Lo;0;R;;;;;N;;;;; +10F0F;OLD SOGDIAN LETTER FINAL NUN;Lo;0;R;;;;;N;;;;; +10F10;OLD SOGDIAN LETTER FINAL NUN WITH VERTICAL TAIL;Lo;0;R;;;;;N;;;;; +10F11;OLD SOGDIAN LETTER SAMEKH;Lo;0;R;;;;;N;;;;; +10F12;OLD SOGDIAN LETTER AYIN;Lo;0;R;;;;;N;;;;; +10F13;OLD SOGDIAN LETTER ALTERNATE AYIN;Lo;0;R;;;;;N;;;;; +10F14;OLD SOGDIAN LETTER PE;Lo;0;R;;;;;N;;;;; +10F15;OLD SOGDIAN LETTER SADHE;Lo;0;R;;;;;N;;;;; +10F16;OLD SOGDIAN LETTER FINAL SADHE;Lo;0;R;;;;;N;;;;; +10F17;OLD SOGDIAN LETTER FINAL SADHE WITH VERTICAL TAIL;Lo;0;R;;;;;N;;;;; +10F18;OLD SOGDIAN LETTER RESH-AYIN-DALETH;Lo;0;R;;;;;N;;;;; +10F19;OLD SOGDIAN LETTER SHIN;Lo;0;R;;;;;N;;;;; +10F1A;OLD SOGDIAN LETTER TAW;Lo;0;R;;;;;N;;;;; +10F1B;OLD SOGDIAN LETTER FINAL TAW;Lo;0;R;;;;;N;;;;; +10F1C;OLD SOGDIAN LETTER FINAL TAW WITH VERTICAL TAIL;Lo;0;R;;;;;N;;;;; +10F1D;OLD SOGDIAN NUMBER ONE;No;0;R;;;;1;N;;;;; +10F1E;OLD SOGDIAN NUMBER TWO;No;0;R;;;;2;N;;;;; +10F1F;OLD SOGDIAN NUMBER THREE;No;0;R;;;;3;N;;;;; +10F20;OLD SOGDIAN NUMBER FOUR;No;0;R;;;;4;N;;;;; +10F21;OLD SOGDIAN NUMBER FIVE;No;0;R;;;;5;N;;;;; +10F22;OLD SOGDIAN NUMBER TEN;No;0;R;;;;10;N;;;;; +10F23;OLD SOGDIAN NUMBER TWENTY;No;0;R;;;;20;N;;;;; +10F24;OLD SOGDIAN NUMBER THIRTY;No;0;R;;;;30;N;;;;; +10F25;OLD SOGDIAN NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; +10F26;OLD SOGDIAN FRACTION ONE HALF;No;0;R;;;;1/2;N;;;;; +10F27;OLD SOGDIAN LIGATURE AYIN-DALETH;Lo;0;R;;;;;N;;;;; +10F30;SOGDIAN LETTER ALEPH;Lo;0;AL;;;;;N;;;;; +10F31;SOGDIAN LETTER BETH;Lo;0;AL;;;;;N;;;;; +10F32;SOGDIAN LETTER GIMEL;Lo;0;AL;;;;;N;;;;; +10F33;SOGDIAN LETTER HE;Lo;0;AL;;;;;N;;;;; +10F34;SOGDIAN LETTER WAW;Lo;0;AL;;;;;N;;;;; +10F35;SOGDIAN LETTER ZAYIN;Lo;0;AL;;;;;N;;;;; +10F36;SOGDIAN LETTER HETH;Lo;0;AL;;;;;N;;;;; +10F37;SOGDIAN LETTER YODH;Lo;0;AL;;;;;N;;;;; +10F38;SOGDIAN LETTER KAPH;Lo;0;AL;;;;;N;;;;; +10F39;SOGDIAN LETTER LAMEDH;Lo;0;AL;;;;;N;;;;; +10F3A;SOGDIAN LETTER MEM;Lo;0;AL;;;;;N;;;;; +10F3B;SOGDIAN LETTER NUN;Lo;0;AL;;;;;N;;;;; +10F3C;SOGDIAN LETTER SAMEKH;Lo;0;AL;;;;;N;;;;; +10F3D;SOGDIAN LETTER AYIN;Lo;0;AL;;;;;N;;;;; +10F3E;SOGDIAN LETTER PE;Lo;0;AL;;;;;N;;;;; +10F3F;SOGDIAN LETTER SADHE;Lo;0;AL;;;;;N;;;;; +10F40;SOGDIAN LETTER RESH-AYIN;Lo;0;AL;;;;;N;;;;; +10F41;SOGDIAN LETTER SHIN;Lo;0;AL;;;;;N;;;;; +10F42;SOGDIAN LETTER TAW;Lo;0;AL;;;;;N;;;;; +10F43;SOGDIAN LETTER FETH;Lo;0;AL;;;;;N;;;;; +10F44;SOGDIAN LETTER LESH;Lo;0;AL;;;;;N;;;;; +10F45;SOGDIAN INDEPENDENT SHIN;Lo;0;AL;;;;;N;;;;; +10F46;SOGDIAN COMBINING DOT BELOW;Mn;220;NSM;;;;;N;;;;; +10F47;SOGDIAN COMBINING TWO DOTS BELOW;Mn;220;NSM;;;;;N;;;;; +10F48;SOGDIAN COMBINING DOT ABOVE;Mn;230;NSM;;;;;N;;;;; +10F49;SOGDIAN COMBINING TWO DOTS ABOVE;Mn;230;NSM;;;;;N;;;;; +10F4A;SOGDIAN COMBINING CURVE ABOVE;Mn;230;NSM;;;;;N;;;;; +10F4B;SOGDIAN COMBINING CURVE BELOW;Mn;220;NSM;;;;;N;;;;; +10F4C;SOGDIAN COMBINING HOOK ABOVE;Mn;230;NSM;;;;;N;;;;; +10F4D;SOGDIAN COMBINING HOOK BELOW;Mn;220;NSM;;;;;N;;;;; +10F4E;SOGDIAN COMBINING LONG HOOK BELOW;Mn;220;NSM;;;;;N;;;;; +10F4F;SOGDIAN COMBINING RESH BELOW;Mn;220;NSM;;;;;N;;;;; +10F50;SOGDIAN COMBINING STROKE BELOW;Mn;220;NSM;;;;;N;;;;; +10F51;SOGDIAN NUMBER ONE;No;0;AL;;;;1;N;;;;; +10F52;SOGDIAN NUMBER TEN;No;0;AL;;;;10;N;;;;; +10F53;SOGDIAN NUMBER TWENTY;No;0;AL;;;;20;N;;;;; +10F54;SOGDIAN NUMBER ONE HUNDRED;No;0;AL;;;;100;N;;;;; +10F55;SOGDIAN PUNCTUATION TWO VERTICAL BARS;Po;0;AL;;;;;N;;;;; +10F56;SOGDIAN PUNCTUATION TWO VERTICAL BARS WITH DOTS;Po;0;AL;;;;;N;;;;; +10F57;SOGDIAN PUNCTUATION CIRCLE WITH DOT;Po;0;AL;;;;;N;;;;; +10F58;SOGDIAN PUNCTUATION TWO CIRCLES WITH DOTS;Po;0;AL;;;;;N;;;;; +10F59;SOGDIAN PUNCTUATION HALF CIRCLE WITH DOT;Po;0;AL;;;;;N;;;;; +11000;BRAHMI SIGN CANDRABINDU;Mc;0;L;;;;;N;;;;; +11001;BRAHMI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +11002;BRAHMI SIGN VISARGA;Mc;0;L;;;;;N;;;;; +11003;BRAHMI SIGN JIHVAMULIYA;Lo;0;L;;;;;N;;;;; +11004;BRAHMI SIGN UPADHMANIYA;Lo;0;L;;;;;N;;;;; +11005;BRAHMI LETTER A;Lo;0;L;;;;;N;;;;; +11006;BRAHMI LETTER AA;Lo;0;L;;;;;N;;;;; +11007;BRAHMI LETTER I;Lo;0;L;;;;;N;;;;; +11008;BRAHMI LETTER II;Lo;0;L;;;;;N;;;;; +11009;BRAHMI LETTER U;Lo;0;L;;;;;N;;;;; +1100A;BRAHMI LETTER UU;Lo;0;L;;;;;N;;;;; +1100B;BRAHMI LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +1100C;BRAHMI LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +1100D;BRAHMI LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +1100E;BRAHMI LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +1100F;BRAHMI LETTER E;Lo;0;L;;;;;N;;;;; +11010;BRAHMI LETTER AI;Lo;0;L;;;;;N;;;;; +11011;BRAHMI LETTER O;Lo;0;L;;;;;N;;;;; +11012;BRAHMI LETTER AU;Lo;0;L;;;;;N;;;;; +11013;BRAHMI LETTER KA;Lo;0;L;;;;;N;;;;; +11014;BRAHMI LETTER KHA;Lo;0;L;;;;;N;;;;; +11015;BRAHMI LETTER GA;Lo;0;L;;;;;N;;;;; +11016;BRAHMI LETTER GHA;Lo;0;L;;;;;N;;;;; +11017;BRAHMI LETTER NGA;Lo;0;L;;;;;N;;;;; +11018;BRAHMI LETTER CA;Lo;0;L;;;;;N;;;;; +11019;BRAHMI LETTER CHA;Lo;0;L;;;;;N;;;;; +1101A;BRAHMI LETTER JA;Lo;0;L;;;;;N;;;;; +1101B;BRAHMI LETTER JHA;Lo;0;L;;;;;N;;;;; +1101C;BRAHMI LETTER NYA;Lo;0;L;;;;;N;;;;; +1101D;BRAHMI LETTER TTA;Lo;0;L;;;;;N;;;;; +1101E;BRAHMI LETTER TTHA;Lo;0;L;;;;;N;;;;; +1101F;BRAHMI LETTER DDA;Lo;0;L;;;;;N;;;;; +11020;BRAHMI LETTER DDHA;Lo;0;L;;;;;N;;;;; +11021;BRAHMI LETTER NNA;Lo;0;L;;;;;N;;;;; +11022;BRAHMI LETTER TA;Lo;0;L;;;;;N;;;;; +11023;BRAHMI LETTER THA;Lo;0;L;;;;;N;;;;; +11024;BRAHMI LETTER DA;Lo;0;L;;;;;N;;;;; +11025;BRAHMI LETTER DHA;Lo;0;L;;;;;N;;;;; +11026;BRAHMI LETTER NA;Lo;0;L;;;;;N;;;;; +11027;BRAHMI LETTER PA;Lo;0;L;;;;;N;;;;; +11028;BRAHMI LETTER PHA;Lo;0;L;;;;;N;;;;; +11029;BRAHMI LETTER BA;Lo;0;L;;;;;N;;;;; +1102A;BRAHMI LETTER BHA;Lo;0;L;;;;;N;;;;; +1102B;BRAHMI LETTER MA;Lo;0;L;;;;;N;;;;; +1102C;BRAHMI LETTER YA;Lo;0;L;;;;;N;;;;; +1102D;BRAHMI LETTER RA;Lo;0;L;;;;;N;;;;; +1102E;BRAHMI LETTER LA;Lo;0;L;;;;;N;;;;; +1102F;BRAHMI LETTER VA;Lo;0;L;;;;;N;;;;; +11030;BRAHMI LETTER SHA;Lo;0;L;;;;;N;;;;; +11031;BRAHMI LETTER SSA;Lo;0;L;;;;;N;;;;; +11032;BRAHMI LETTER SA;Lo;0;L;;;;;N;;;;; +11033;BRAHMI LETTER HA;Lo;0;L;;;;;N;;;;; +11034;BRAHMI LETTER LLA;Lo;0;L;;;;;N;;;;; +11035;BRAHMI LETTER OLD TAMIL LLLA;Lo;0;L;;;;;N;;;;; +11036;BRAHMI LETTER OLD TAMIL RRA;Lo;0;L;;;;;N;;;;; +11037;BRAHMI LETTER OLD TAMIL NNNA;Lo;0;L;;;;;N;;;;; +11038;BRAHMI VOWEL SIGN AA;Mn;0;NSM;;;;;N;;;;; +11039;BRAHMI VOWEL SIGN BHATTIPROLU AA;Mn;0;NSM;;;;;N;;;;; +1103A;BRAHMI VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +1103B;BRAHMI VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; +1103C;BRAHMI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +1103D;BRAHMI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +1103E;BRAHMI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +1103F;BRAHMI VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; +11040;BRAHMI VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; +11041;BRAHMI VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; +11042;BRAHMI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +11043;BRAHMI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +11044;BRAHMI VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; +11045;BRAHMI VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;; +11046;BRAHMI VIRAMA;Mn;9;NSM;;;;;N;;;;; +11047;BRAHMI DANDA;Po;0;L;;;;;N;;;;; +11048;BRAHMI DOUBLE DANDA;Po;0;L;;;;;N;;;;; +11049;BRAHMI PUNCTUATION DOT;Po;0;L;;;;;N;;;;; +1104A;BRAHMI PUNCTUATION DOUBLE DOT;Po;0;L;;;;;N;;;;; +1104B;BRAHMI PUNCTUATION LINE;Po;0;L;;;;;N;;;;; +1104C;BRAHMI PUNCTUATION CRESCENT BAR;Po;0;L;;;;;N;;;;; +1104D;BRAHMI PUNCTUATION LOTUS;Po;0;L;;;;;N;;;;; +11052;BRAHMI NUMBER ONE;No;0;ON;;;1;1;N;;;;; +11053;BRAHMI NUMBER TWO;No;0;ON;;;2;2;N;;;;; +11054;BRAHMI NUMBER THREE;No;0;ON;;;3;3;N;;;;; +11055;BRAHMI NUMBER FOUR;No;0;ON;;;4;4;N;;;;; +11056;BRAHMI NUMBER FIVE;No;0;ON;;;5;5;N;;;;; +11057;BRAHMI NUMBER SIX;No;0;ON;;;6;6;N;;;;; +11058;BRAHMI NUMBER SEVEN;No;0;ON;;;7;7;N;;;;; +11059;BRAHMI NUMBER EIGHT;No;0;ON;;;8;8;N;;;;; +1105A;BRAHMI NUMBER NINE;No;0;ON;;;9;9;N;;;;; +1105B;BRAHMI NUMBER TEN;No;0;ON;;;;10;N;;;;; +1105C;BRAHMI NUMBER TWENTY;No;0;ON;;;;20;N;;;;; +1105D;BRAHMI NUMBER THIRTY;No;0;ON;;;;30;N;;;;; +1105E;BRAHMI NUMBER FORTY;No;0;ON;;;;40;N;;;;; +1105F;BRAHMI NUMBER FIFTY;No;0;ON;;;;50;N;;;;; +11060;BRAHMI NUMBER SIXTY;No;0;ON;;;;60;N;;;;; +11061;BRAHMI NUMBER SEVENTY;No;0;ON;;;;70;N;;;;; +11062;BRAHMI NUMBER EIGHTY;No;0;ON;;;;80;N;;;;; +11063;BRAHMI NUMBER NINETY;No;0;ON;;;;90;N;;;;; +11064;BRAHMI NUMBER ONE HUNDRED;No;0;ON;;;;100;N;;;;; +11065;BRAHMI NUMBER ONE THOUSAND;No;0;ON;;;;1000;N;;;;; +11066;BRAHMI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +11067;BRAHMI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +11068;BRAHMI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +11069;BRAHMI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +1106A;BRAHMI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +1106B;BRAHMI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +1106C;BRAHMI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +1106D;BRAHMI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +1106E;BRAHMI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +1106F;BRAHMI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +1107F;BRAHMI NUMBER JOINER;Mn;9;NSM;;;;;N;;;;; +11080;KAITHI SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; +11081;KAITHI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +11082;KAITHI SIGN VISARGA;Mc;0;L;;;;;N;;;;; +11083;KAITHI LETTER A;Lo;0;L;;;;;N;;;;; +11084;KAITHI LETTER AA;Lo;0;L;;;;;N;;;;; +11085;KAITHI LETTER I;Lo;0;L;;;;;N;;;;; +11086;KAITHI LETTER II;Lo;0;L;;;;;N;;;;; +11087;KAITHI LETTER U;Lo;0;L;;;;;N;;;;; +11088;KAITHI LETTER UU;Lo;0;L;;;;;N;;;;; +11089;KAITHI LETTER E;Lo;0;L;;;;;N;;;;; +1108A;KAITHI LETTER AI;Lo;0;L;;;;;N;;;;; +1108B;KAITHI LETTER O;Lo;0;L;;;;;N;;;;; +1108C;KAITHI LETTER AU;Lo;0;L;;;;;N;;;;; +1108D;KAITHI LETTER KA;Lo;0;L;;;;;N;;;;; +1108E;KAITHI LETTER KHA;Lo;0;L;;;;;N;;;;; +1108F;KAITHI LETTER GA;Lo;0;L;;;;;N;;;;; +11090;KAITHI LETTER GHA;Lo;0;L;;;;;N;;;;; +11091;KAITHI LETTER NGA;Lo;0;L;;;;;N;;;;; +11092;KAITHI LETTER CA;Lo;0;L;;;;;N;;;;; +11093;KAITHI LETTER CHA;Lo;0;L;;;;;N;;;;; +11094;KAITHI LETTER JA;Lo;0;L;;;;;N;;;;; +11095;KAITHI LETTER JHA;Lo;0;L;;;;;N;;;;; +11096;KAITHI LETTER NYA;Lo;0;L;;;;;N;;;;; +11097;KAITHI LETTER TTA;Lo;0;L;;;;;N;;;;; +11098;KAITHI LETTER TTHA;Lo;0;L;;;;;N;;;;; +11099;KAITHI LETTER DDA;Lo;0;L;;;;;N;;;;; +1109A;KAITHI LETTER DDDHA;Lo;0;L;11099 110BA;;;;N;;;;; +1109B;KAITHI LETTER DDHA;Lo;0;L;;;;;N;;;;; +1109C;KAITHI LETTER RHA;Lo;0;L;1109B 110BA;;;;N;;;;; +1109D;KAITHI LETTER NNA;Lo;0;L;;;;;N;;;;; +1109E;KAITHI LETTER TA;Lo;0;L;;;;;N;;;;; +1109F;KAITHI LETTER THA;Lo;0;L;;;;;N;;;;; +110A0;KAITHI LETTER DA;Lo;0;L;;;;;N;;;;; +110A1;KAITHI LETTER DHA;Lo;0;L;;;;;N;;;;; +110A2;KAITHI LETTER NA;Lo;0;L;;;;;N;;;;; +110A3;KAITHI LETTER PA;Lo;0;L;;;;;N;;;;; +110A4;KAITHI LETTER PHA;Lo;0;L;;;;;N;;;;; +110A5;KAITHI LETTER BA;Lo;0;L;;;;;N;;;;; +110A6;KAITHI LETTER BHA;Lo;0;L;;;;;N;;;;; +110A7;KAITHI LETTER MA;Lo;0;L;;;;;N;;;;; +110A8;KAITHI LETTER YA;Lo;0;L;;;;;N;;;;; +110A9;KAITHI LETTER RA;Lo;0;L;;;;;N;;;;; +110AA;KAITHI LETTER LA;Lo;0;L;;;;;N;;;;; +110AB;KAITHI LETTER VA;Lo;0;L;110A5 110BA;;;;N;;;;; +110AC;KAITHI LETTER SHA;Lo;0;L;;;;;N;;;;; +110AD;KAITHI LETTER SSA;Lo;0;L;;;;;N;;;;; +110AE;KAITHI LETTER SA;Lo;0;L;;;;;N;;;;; +110AF;KAITHI LETTER HA;Lo;0;L;;;;;N;;;;; +110B0;KAITHI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +110B1;KAITHI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +110B2;KAITHI VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +110B3;KAITHI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +110B4;KAITHI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +110B5;KAITHI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +110B6;KAITHI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +110B7;KAITHI VOWEL SIGN O;Mc;0;L;;;;;N;;;;; +110B8;KAITHI VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; +110B9;KAITHI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +110BA;KAITHI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +110BB;KAITHI ABBREVIATION SIGN;Po;0;L;;;;;N;;;;; +110BC;KAITHI ENUMERATION SIGN;Po;0;L;;;;;N;;;;; +110BD;KAITHI NUMBER SIGN;Cf;0;L;;;;;N;;;;; +110BE;KAITHI SECTION MARK;Po;0;L;;;;;N;;;;; +110BF;KAITHI DOUBLE SECTION MARK;Po;0;L;;;;;N;;;;; +110C0;KAITHI DANDA;Po;0;L;;;;;N;;;;; +110C1;KAITHI DOUBLE DANDA;Po;0;L;;;;;N;;;;; +110CD;KAITHI NUMBER SIGN ABOVE;Cf;0;L;;;;;N;;;;; +110D0;SORA SOMPENG LETTER SAH;Lo;0;L;;;;;N;;;;; +110D1;SORA SOMPENG LETTER TAH;Lo;0;L;;;;;N;;;;; +110D2;SORA SOMPENG LETTER BAH;Lo;0;L;;;;;N;;;;; +110D3;SORA SOMPENG LETTER CAH;Lo;0;L;;;;;N;;;;; +110D4;SORA SOMPENG LETTER DAH;Lo;0;L;;;;;N;;;;; +110D5;SORA SOMPENG LETTER GAH;Lo;0;L;;;;;N;;;;; +110D6;SORA SOMPENG LETTER MAH;Lo;0;L;;;;;N;;;;; +110D7;SORA SOMPENG LETTER NGAH;Lo;0;L;;;;;N;;;;; +110D8;SORA SOMPENG LETTER LAH;Lo;0;L;;;;;N;;;;; +110D9;SORA SOMPENG LETTER NAH;Lo;0;L;;;;;N;;;;; +110DA;SORA SOMPENG LETTER VAH;Lo;0;L;;;;;N;;;;; +110DB;SORA SOMPENG LETTER PAH;Lo;0;L;;;;;N;;;;; +110DC;SORA SOMPENG LETTER YAH;Lo;0;L;;;;;N;;;;; +110DD;SORA SOMPENG LETTER RAH;Lo;0;L;;;;;N;;;;; +110DE;SORA SOMPENG LETTER HAH;Lo;0;L;;;;;N;;;;; +110DF;SORA SOMPENG LETTER KAH;Lo;0;L;;;;;N;;;;; +110E0;SORA SOMPENG LETTER JAH;Lo;0;L;;;;;N;;;;; +110E1;SORA SOMPENG LETTER NYAH;Lo;0;L;;;;;N;;;;; +110E2;SORA SOMPENG LETTER AH;Lo;0;L;;;;;N;;;;; +110E3;SORA SOMPENG LETTER EEH;Lo;0;L;;;;;N;;;;; +110E4;SORA SOMPENG LETTER IH;Lo;0;L;;;;;N;;;;; +110E5;SORA SOMPENG LETTER UH;Lo;0;L;;;;;N;;;;; +110E6;SORA SOMPENG LETTER OH;Lo;0;L;;;;;N;;;;; +110E7;SORA SOMPENG LETTER EH;Lo;0;L;;;;;N;;;;; +110E8;SORA SOMPENG LETTER MAE;Lo;0;L;;;;;N;;;;; +110F0;SORA SOMPENG DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +110F1;SORA SOMPENG DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +110F2;SORA SOMPENG DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +110F3;SORA SOMPENG DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +110F4;SORA SOMPENG DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +110F5;SORA SOMPENG DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +110F6;SORA SOMPENG DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +110F7;SORA SOMPENG DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +110F8;SORA SOMPENG DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +110F9;SORA SOMPENG DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +11100;CHAKMA SIGN CANDRABINDU;Mn;230;NSM;;;;;N;;;;; +11101;CHAKMA SIGN ANUSVARA;Mn;230;NSM;;;;;N;;;;; +11102;CHAKMA SIGN VISARGA;Mn;230;NSM;;;;;N;;;;; +11103;CHAKMA LETTER AA;Lo;0;L;;;;;N;;;;; +11104;CHAKMA LETTER I;Lo;0;L;;;;;N;;;;; +11105;CHAKMA LETTER U;Lo;0;L;;;;;N;;;;; +11106;CHAKMA LETTER E;Lo;0;L;;;;;N;;;;; +11107;CHAKMA LETTER KAA;Lo;0;L;;;;;N;;;;; +11108;CHAKMA LETTER KHAA;Lo;0;L;;;;;N;;;;; +11109;CHAKMA LETTER GAA;Lo;0;L;;;;;N;;;;; +1110A;CHAKMA LETTER GHAA;Lo;0;L;;;;;N;;;;; +1110B;CHAKMA LETTER NGAA;Lo;0;L;;;;;N;;;;; +1110C;CHAKMA LETTER CAA;Lo;0;L;;;;;N;;;;; +1110D;CHAKMA LETTER CHAA;Lo;0;L;;;;;N;;;;; +1110E;CHAKMA LETTER JAA;Lo;0;L;;;;;N;;;;; +1110F;CHAKMA LETTER JHAA;Lo;0;L;;;;;N;;;;; +11110;CHAKMA LETTER NYAA;Lo;0;L;;;;;N;;;;; +11111;CHAKMA LETTER TTAA;Lo;0;L;;;;;N;;;;; +11112;CHAKMA LETTER TTHAA;Lo;0;L;;;;;N;;;;; +11113;CHAKMA LETTER DDAA;Lo;0;L;;;;;N;;;;; +11114;CHAKMA LETTER DDHAA;Lo;0;L;;;;;N;;;;; +11115;CHAKMA LETTER NNAA;Lo;0;L;;;;;N;;;;; +11116;CHAKMA LETTER TAA;Lo;0;L;;;;;N;;;;; +11117;CHAKMA LETTER THAA;Lo;0;L;;;;;N;;;;; +11118;CHAKMA LETTER DAA;Lo;0;L;;;;;N;;;;; +11119;CHAKMA LETTER DHAA;Lo;0;L;;;;;N;;;;; +1111A;CHAKMA LETTER NAA;Lo;0;L;;;;;N;;;;; +1111B;CHAKMA LETTER PAA;Lo;0;L;;;;;N;;;;; +1111C;CHAKMA LETTER PHAA;Lo;0;L;;;;;N;;;;; +1111D;CHAKMA LETTER BAA;Lo;0;L;;;;;N;;;;; +1111E;CHAKMA LETTER BHAA;Lo;0;L;;;;;N;;;;; +1111F;CHAKMA LETTER MAA;Lo;0;L;;;;;N;;;;; +11120;CHAKMA LETTER YYAA;Lo;0;L;;;;;N;;;;; +11121;CHAKMA LETTER YAA;Lo;0;L;;;;;N;;;;; +11122;CHAKMA LETTER RAA;Lo;0;L;;;;;N;;;;; +11123;CHAKMA LETTER LAA;Lo;0;L;;;;;N;;;;; +11124;CHAKMA LETTER WAA;Lo;0;L;;;;;N;;;;; +11125;CHAKMA LETTER SAA;Lo;0;L;;;;;N;;;;; +11126;CHAKMA LETTER HAA;Lo;0;L;;;;;N;;;;; +11127;CHAKMA VOWEL SIGN A;Mn;0;NSM;;;;;N;;;;; +11128;CHAKMA VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +11129;CHAKMA VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; +1112A;CHAKMA VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +1112B;CHAKMA VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +1112C;CHAKMA VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +1112D;CHAKMA VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +1112E;CHAKMA VOWEL SIGN O;Mn;0;NSM;11131 11127;;;;N;;;;; +1112F;CHAKMA VOWEL SIGN AU;Mn;0;NSM;11132 11127;;;;N;;;;; +11130;CHAKMA VOWEL SIGN OI;Mn;0;NSM;;;;;N;;;;; +11131;CHAKMA O MARK;Mn;0;NSM;;;;;N;;;;; +11132;CHAKMA AU MARK;Mn;0;NSM;;;;;N;;;;; +11133;CHAKMA VIRAMA;Mn;9;NSM;;;;;N;;;;; +11134;CHAKMA MAAYYAA;Mn;9;NSM;;;;;N;;;;; +11136;CHAKMA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +11137;CHAKMA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +11138;CHAKMA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +11139;CHAKMA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +1113A;CHAKMA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +1113B;CHAKMA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +1113C;CHAKMA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +1113D;CHAKMA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +1113E;CHAKMA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +1113F;CHAKMA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +11140;CHAKMA SECTION MARK;Po;0;L;;;;;N;;;;; +11141;CHAKMA DANDA;Po;0;L;;;;;N;;;;; +11142;CHAKMA DOUBLE DANDA;Po;0;L;;;;;N;;;;; +11143;CHAKMA QUESTION MARK;Po;0;L;;;;;N;;;;; +11144;CHAKMA LETTER LHAA;Lo;0;L;;;;;N;;;;; +11145;CHAKMA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +11146;CHAKMA VOWEL SIGN EI;Mc;0;L;;;;;N;;;;; +11150;MAHAJANI LETTER A;Lo;0;L;;;;;N;;;;; +11151;MAHAJANI LETTER I;Lo;0;L;;;;;N;;;;; +11152;MAHAJANI LETTER U;Lo;0;L;;;;;N;;;;; +11153;MAHAJANI LETTER E;Lo;0;L;;;;;N;;;;; +11154;MAHAJANI LETTER O;Lo;0;L;;;;;N;;;;; +11155;MAHAJANI LETTER KA;Lo;0;L;;;;;N;;;;; +11156;MAHAJANI LETTER KHA;Lo;0;L;;;;;N;;;;; +11157;MAHAJANI LETTER GA;Lo;0;L;;;;;N;;;;; +11158;MAHAJANI LETTER GHA;Lo;0;L;;;;;N;;;;; +11159;MAHAJANI LETTER CA;Lo;0;L;;;;;N;;;;; +1115A;MAHAJANI LETTER CHA;Lo;0;L;;;;;N;;;;; +1115B;MAHAJANI LETTER JA;Lo;0;L;;;;;N;;;;; +1115C;MAHAJANI LETTER JHA;Lo;0;L;;;;;N;;;;; +1115D;MAHAJANI LETTER NYA;Lo;0;L;;;;;N;;;;; +1115E;MAHAJANI LETTER TTA;Lo;0;L;;;;;N;;;;; +1115F;MAHAJANI LETTER TTHA;Lo;0;L;;;;;N;;;;; +11160;MAHAJANI LETTER DDA;Lo;0;L;;;;;N;;;;; +11161;MAHAJANI LETTER DDHA;Lo;0;L;;;;;N;;;;; +11162;MAHAJANI LETTER NNA;Lo;0;L;;;;;N;;;;; +11163;MAHAJANI LETTER TA;Lo;0;L;;;;;N;;;;; +11164;MAHAJANI LETTER THA;Lo;0;L;;;;;N;;;;; +11165;MAHAJANI LETTER DA;Lo;0;L;;;;;N;;;;; +11166;MAHAJANI LETTER DHA;Lo;0;L;;;;;N;;;;; +11167;MAHAJANI LETTER NA;Lo;0;L;;;;;N;;;;; +11168;MAHAJANI LETTER PA;Lo;0;L;;;;;N;;;;; +11169;MAHAJANI LETTER PHA;Lo;0;L;;;;;N;;;;; +1116A;MAHAJANI LETTER BA;Lo;0;L;;;;;N;;;;; +1116B;MAHAJANI LETTER BHA;Lo;0;L;;;;;N;;;;; +1116C;MAHAJANI LETTER MA;Lo;0;L;;;;;N;;;;; +1116D;MAHAJANI LETTER RA;Lo;0;L;;;;;N;;;;; +1116E;MAHAJANI LETTER LA;Lo;0;L;;;;;N;;;;; +1116F;MAHAJANI LETTER VA;Lo;0;L;;;;;N;;;;; +11170;MAHAJANI LETTER SA;Lo;0;L;;;;;N;;;;; +11171;MAHAJANI LETTER HA;Lo;0;L;;;;;N;;;;; +11172;MAHAJANI LETTER RRA;Lo;0;L;;;;;N;;;;; +11173;MAHAJANI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +11174;MAHAJANI ABBREVIATION SIGN;Po;0;L;;;;;N;;;;; +11175;MAHAJANI SECTION MARK;Po;0;L;;;;;N;;;;; +11176;MAHAJANI LIGATURE SHRI;Lo;0;L;;;;;N;;;;; +11180;SHARADA SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; +11181;SHARADA SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +11182;SHARADA SIGN VISARGA;Mc;0;L;;;;;N;;;;; +11183;SHARADA LETTER A;Lo;0;L;;;;;N;;;;; +11184;SHARADA LETTER AA;Lo;0;L;;;;;N;;;;; +11185;SHARADA LETTER I;Lo;0;L;;;;;N;;;;; +11186;SHARADA LETTER II;Lo;0;L;;;;;N;;;;; +11187;SHARADA LETTER U;Lo;0;L;;;;;N;;;;; +11188;SHARADA LETTER UU;Lo;0;L;;;;;N;;;;; +11189;SHARADA LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +1118A;SHARADA LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +1118B;SHARADA LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +1118C;SHARADA LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +1118D;SHARADA LETTER E;Lo;0;L;;;;;N;;;;; +1118E;SHARADA LETTER AI;Lo;0;L;;;;;N;;;;; +1118F;SHARADA LETTER O;Lo;0;L;;;;;N;;;;; +11190;SHARADA LETTER AU;Lo;0;L;;;;;N;;;;; +11191;SHARADA LETTER KA;Lo;0;L;;;;;N;;;;; +11192;SHARADA LETTER KHA;Lo;0;L;;;;;N;;;;; +11193;SHARADA LETTER GA;Lo;0;L;;;;;N;;;;; +11194;SHARADA LETTER GHA;Lo;0;L;;;;;N;;;;; +11195;SHARADA LETTER NGA;Lo;0;L;;;;;N;;;;; +11196;SHARADA LETTER CA;Lo;0;L;;;;;N;;;;; +11197;SHARADA LETTER CHA;Lo;0;L;;;;;N;;;;; +11198;SHARADA LETTER JA;Lo;0;L;;;;;N;;;;; +11199;SHARADA LETTER JHA;Lo;0;L;;;;;N;;;;; +1119A;SHARADA LETTER NYA;Lo;0;L;;;;;N;;;;; +1119B;SHARADA LETTER TTA;Lo;0;L;;;;;N;;;;; +1119C;SHARADA LETTER TTHA;Lo;0;L;;;;;N;;;;; +1119D;SHARADA LETTER DDA;Lo;0;L;;;;;N;;;;; +1119E;SHARADA LETTER DDHA;Lo;0;L;;;;;N;;;;; +1119F;SHARADA LETTER NNA;Lo;0;L;;;;;N;;;;; +111A0;SHARADA LETTER TA;Lo;0;L;;;;;N;;;;; +111A1;SHARADA LETTER THA;Lo;0;L;;;;;N;;;;; +111A2;SHARADA LETTER DA;Lo;0;L;;;;;N;;;;; +111A3;SHARADA LETTER DHA;Lo;0;L;;;;;N;;;;; +111A4;SHARADA LETTER NA;Lo;0;L;;;;;N;;;;; +111A5;SHARADA LETTER PA;Lo;0;L;;;;;N;;;;; +111A6;SHARADA LETTER PHA;Lo;0;L;;;;;N;;;;; +111A7;SHARADA LETTER BA;Lo;0;L;;;;;N;;;;; +111A8;SHARADA LETTER BHA;Lo;0;L;;;;;N;;;;; +111A9;SHARADA LETTER MA;Lo;0;L;;;;;N;;;;; +111AA;SHARADA LETTER YA;Lo;0;L;;;;;N;;;;; +111AB;SHARADA LETTER RA;Lo;0;L;;;;;N;;;;; +111AC;SHARADA LETTER LA;Lo;0;L;;;;;N;;;;; +111AD;SHARADA LETTER LLA;Lo;0;L;;;;;N;;;;; +111AE;SHARADA LETTER VA;Lo;0;L;;;;;N;;;;; +111AF;SHARADA LETTER SHA;Lo;0;L;;;;;N;;;;; +111B0;SHARADA LETTER SSA;Lo;0;L;;;;;N;;;;; +111B1;SHARADA LETTER SA;Lo;0;L;;;;;N;;;;; +111B2;SHARADA LETTER HA;Lo;0;L;;;;;N;;;;; +111B3;SHARADA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +111B4;SHARADA VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +111B5;SHARADA VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +111B6;SHARADA VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +111B7;SHARADA VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +111B8;SHARADA VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +111B9;SHARADA VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; +111BA;SHARADA VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; +111BB;SHARADA VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; +111BC;SHARADA VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +111BD;SHARADA VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +111BE;SHARADA VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; +111BF;SHARADA VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; +111C0;SHARADA SIGN VIRAMA;Mc;9;L;;;;;N;;;;; +111C1;SHARADA SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; +111C2;SHARADA SIGN JIHVAMULIYA;Lo;0;L;;;;;N;;;;; +111C3;SHARADA SIGN UPADHMANIYA;Lo;0;L;;;;;N;;;;; +111C4;SHARADA OM;Lo;0;L;;;;;N;;;;; +111C5;SHARADA DANDA;Po;0;L;;;;;N;;;;; +111C6;SHARADA DOUBLE DANDA;Po;0;L;;;;;N;;;;; +111C7;SHARADA ABBREVIATION SIGN;Po;0;L;;;;;N;;;;; +111C8;SHARADA SEPARATOR;Po;0;L;;;;;N;;;;; +111C9;SHARADA SANDHI MARK;Mn;0;NSM;;;;;N;;;;; +111CA;SHARADA SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +111CB;SHARADA VOWEL MODIFIER MARK;Mn;0;NSM;;;;;N;;;;; +111CC;SHARADA EXTRA SHORT VOWEL MARK;Mn;0;NSM;;;;;N;;;;; +111CD;SHARADA SUTRA MARK;Po;0;L;;;;;N;;;;; +111D0;SHARADA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +111D1;SHARADA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +111D2;SHARADA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +111D3;SHARADA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +111D4;SHARADA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +111D5;SHARADA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +111D6;SHARADA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +111D7;SHARADA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +111D8;SHARADA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +111D9;SHARADA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +111DA;SHARADA EKAM;Lo;0;L;;;;;N;;;;; +111DB;SHARADA SIGN SIDDHAM;Po;0;L;;;;;N;;;;; +111DC;SHARADA HEADSTROKE;Lo;0;L;;;;;N;;;;; +111DD;SHARADA CONTINUATION SIGN;Po;0;L;;;;;N;;;;; +111DE;SHARADA SECTION MARK-1;Po;0;L;;;;;N;;;;; +111DF;SHARADA SECTION MARK-2;Po;0;L;;;;;N;;;;; +111E1;SINHALA ARCHAIC DIGIT ONE;No;0;L;;;;1;N;;;;; +111E2;SINHALA ARCHAIC DIGIT TWO;No;0;L;;;;2;N;;;;; +111E3;SINHALA ARCHAIC DIGIT THREE;No;0;L;;;;3;N;;;;; +111E4;SINHALA ARCHAIC DIGIT FOUR;No;0;L;;;;4;N;;;;; +111E5;SINHALA ARCHAIC DIGIT FIVE;No;0;L;;;;5;N;;;;; +111E6;SINHALA ARCHAIC DIGIT SIX;No;0;L;;;;6;N;;;;; +111E7;SINHALA ARCHAIC DIGIT SEVEN;No;0;L;;;;7;N;;;;; +111E8;SINHALA ARCHAIC DIGIT EIGHT;No;0;L;;;;8;N;;;;; +111E9;SINHALA ARCHAIC DIGIT NINE;No;0;L;;;;9;N;;;;; +111EA;SINHALA ARCHAIC NUMBER TEN;No;0;L;;;;10;N;;;;; +111EB;SINHALA ARCHAIC NUMBER TWENTY;No;0;L;;;;20;N;;;;; +111EC;SINHALA ARCHAIC NUMBER THIRTY;No;0;L;;;;30;N;;;;; +111ED;SINHALA ARCHAIC NUMBER FORTY;No;0;L;;;;40;N;;;;; +111EE;SINHALA ARCHAIC NUMBER FIFTY;No;0;L;;;;50;N;;;;; +111EF;SINHALA ARCHAIC NUMBER SIXTY;No;0;L;;;;60;N;;;;; +111F0;SINHALA ARCHAIC NUMBER SEVENTY;No;0;L;;;;70;N;;;;; +111F1;SINHALA ARCHAIC NUMBER EIGHTY;No;0;L;;;;80;N;;;;; +111F2;SINHALA ARCHAIC NUMBER NINETY;No;0;L;;;;90;N;;;;; +111F3;SINHALA ARCHAIC NUMBER ONE HUNDRED;No;0;L;;;;100;N;;;;; +111F4;SINHALA ARCHAIC NUMBER ONE THOUSAND;No;0;L;;;;1000;N;;;;; +11200;KHOJKI LETTER A;Lo;0;L;;;;;N;;;;; +11201;KHOJKI LETTER AA;Lo;0;L;;;;;N;;;;; +11202;KHOJKI LETTER I;Lo;0;L;;;;;N;;;;; +11203;KHOJKI LETTER U;Lo;0;L;;;;;N;;;;; +11204;KHOJKI LETTER E;Lo;0;L;;;;;N;;;;; +11205;KHOJKI LETTER AI;Lo;0;L;;;;;N;;;;; +11206;KHOJKI LETTER O;Lo;0;L;;;;;N;;;;; +11207;KHOJKI LETTER AU;Lo;0;L;;;;;N;;;;; +11208;KHOJKI LETTER KA;Lo;0;L;;;;;N;;;;; +11209;KHOJKI LETTER KHA;Lo;0;L;;;;;N;;;;; +1120A;KHOJKI LETTER GA;Lo;0;L;;;;;N;;;;; +1120B;KHOJKI LETTER GGA;Lo;0;L;;;;;N;;;;; +1120C;KHOJKI LETTER GHA;Lo;0;L;;;;;N;;;;; +1120D;KHOJKI LETTER NGA;Lo;0;L;;;;;N;;;;; +1120E;KHOJKI LETTER CA;Lo;0;L;;;;;N;;;;; +1120F;KHOJKI LETTER CHA;Lo;0;L;;;;;N;;;;; +11210;KHOJKI LETTER JA;Lo;0;L;;;;;N;;;;; +11211;KHOJKI LETTER JJA;Lo;0;L;;;;;N;;;;; +11213;KHOJKI LETTER NYA;Lo;0;L;;;;;N;;;;; +11214;KHOJKI LETTER TTA;Lo;0;L;;;;;N;;;;; +11215;KHOJKI LETTER TTHA;Lo;0;L;;;;;N;;;;; +11216;KHOJKI LETTER DDA;Lo;0;L;;;;;N;;;;; +11217;KHOJKI LETTER DDHA;Lo;0;L;;;;;N;;;;; +11218;KHOJKI LETTER NNA;Lo;0;L;;;;;N;;;;; +11219;KHOJKI LETTER TA;Lo;0;L;;;;;N;;;;; +1121A;KHOJKI LETTER THA;Lo;0;L;;;;;N;;;;; +1121B;KHOJKI LETTER DA;Lo;0;L;;;;;N;;;;; +1121C;KHOJKI LETTER DDDA;Lo;0;L;;;;;N;;;;; +1121D;KHOJKI LETTER DHA;Lo;0;L;;;;;N;;;;; +1121E;KHOJKI LETTER NA;Lo;0;L;;;;;N;;;;; +1121F;KHOJKI LETTER PA;Lo;0;L;;;;;N;;;;; +11220;KHOJKI LETTER PHA;Lo;0;L;;;;;N;;;;; +11221;KHOJKI LETTER BA;Lo;0;L;;;;;N;;;;; +11222;KHOJKI LETTER BBA;Lo;0;L;;;;;N;;;;; +11223;KHOJKI LETTER BHA;Lo;0;L;;;;;N;;;;; +11224;KHOJKI LETTER MA;Lo;0;L;;;;;N;;;;; +11225;KHOJKI LETTER YA;Lo;0;L;;;;;N;;;;; +11226;KHOJKI LETTER RA;Lo;0;L;;;;;N;;;;; +11227;KHOJKI LETTER LA;Lo;0;L;;;;;N;;;;; +11228;KHOJKI LETTER VA;Lo;0;L;;;;;N;;;;; +11229;KHOJKI LETTER SA;Lo;0;L;;;;;N;;;;; +1122A;KHOJKI LETTER HA;Lo;0;L;;;;;N;;;;; +1122B;KHOJKI LETTER LLA;Lo;0;L;;;;;N;;;;; +1122C;KHOJKI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +1122D;KHOJKI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +1122E;KHOJKI VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +1122F;KHOJKI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +11230;KHOJKI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +11231;KHOJKI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +11232;KHOJKI VOWEL SIGN O;Mc;0;L;;;;;N;;;;; +11233;KHOJKI VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; +11234;KHOJKI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +11235;KHOJKI SIGN VIRAMA;Mc;9;L;;;;;N;;;;; +11236;KHOJKI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +11237;KHOJKI SIGN SHADDA;Mn;0;NSM;;;;;N;;;;; +11238;KHOJKI DANDA;Po;0;L;;;;;N;;;;; +11239;KHOJKI DOUBLE DANDA;Po;0;L;;;;;N;;;;; +1123A;KHOJKI WORD SEPARATOR;Po;0;L;;;;;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;;;;; +11283;MULTANI LETTER E;Lo;0;L;;;;;N;;;;; +11284;MULTANI LETTER KA;Lo;0;L;;;;;N;;;;; +11285;MULTANI LETTER KHA;Lo;0;L;;;;;N;;;;; +11286;MULTANI LETTER GA;Lo;0;L;;;;;N;;;;; +11288;MULTANI LETTER GHA;Lo;0;L;;;;;N;;;;; +1128A;MULTANI LETTER CA;Lo;0;L;;;;;N;;;;; +1128B;MULTANI LETTER CHA;Lo;0;L;;;;;N;;;;; +1128C;MULTANI LETTER JA;Lo;0;L;;;;;N;;;;; +1128D;MULTANI LETTER JJA;Lo;0;L;;;;;N;;;;; +1128F;MULTANI LETTER NYA;Lo;0;L;;;;;N;;;;; +11290;MULTANI LETTER TTA;Lo;0;L;;;;;N;;;;; +11291;MULTANI LETTER TTHA;Lo;0;L;;;;;N;;;;; +11292;MULTANI LETTER DDA;Lo;0;L;;;;;N;;;;; +11293;MULTANI LETTER DDDA;Lo;0;L;;;;;N;;;;; +11294;MULTANI LETTER DDHA;Lo;0;L;;;;;N;;;;; +11295;MULTANI LETTER NNA;Lo;0;L;;;;;N;;;;; +11296;MULTANI LETTER TA;Lo;0;L;;;;;N;;;;; +11297;MULTANI LETTER THA;Lo;0;L;;;;;N;;;;; +11298;MULTANI LETTER DA;Lo;0;L;;;;;N;;;;; +11299;MULTANI LETTER DHA;Lo;0;L;;;;;N;;;;; +1129A;MULTANI LETTER NA;Lo;0;L;;;;;N;;;;; +1129B;MULTANI LETTER PA;Lo;0;L;;;;;N;;;;; +1129C;MULTANI LETTER PHA;Lo;0;L;;;;;N;;;;; +1129D;MULTANI LETTER BA;Lo;0;L;;;;;N;;;;; +1129F;MULTANI LETTER BHA;Lo;0;L;;;;;N;;;;; +112A0;MULTANI LETTER MA;Lo;0;L;;;;;N;;;;; +112A1;MULTANI LETTER YA;Lo;0;L;;;;;N;;;;; +112A2;MULTANI LETTER RA;Lo;0;L;;;;;N;;;;; +112A3;MULTANI LETTER LA;Lo;0;L;;;;;N;;;;; +112A4;MULTANI LETTER VA;Lo;0;L;;;;;N;;;;; +112A5;MULTANI LETTER SA;Lo;0;L;;;;;N;;;;; +112A6;MULTANI LETTER HA;Lo;0;L;;;;;N;;;;; +112A7;MULTANI LETTER RRA;Lo;0;L;;;;;N;;;;; +112A8;MULTANI LETTER RHA;Lo;0;L;;;;;N;;;;; +112A9;MULTANI SECTION MARK;Po;0;L;;;;;N;;;;; +112B0;KHUDAWADI LETTER A;Lo;0;L;;;;;N;;;;; +112B1;KHUDAWADI LETTER AA;Lo;0;L;;;;;N;;;;; +112B2;KHUDAWADI LETTER I;Lo;0;L;;;;;N;;;;; +112B3;KHUDAWADI LETTER II;Lo;0;L;;;;;N;;;;; +112B4;KHUDAWADI LETTER U;Lo;0;L;;;;;N;;;;; +112B5;KHUDAWADI LETTER UU;Lo;0;L;;;;;N;;;;; +112B6;KHUDAWADI LETTER E;Lo;0;L;;;;;N;;;;; +112B7;KHUDAWADI LETTER AI;Lo;0;L;;;;;N;;;;; +112B8;KHUDAWADI LETTER O;Lo;0;L;;;;;N;;;;; +112B9;KHUDAWADI LETTER AU;Lo;0;L;;;;;N;;;;; +112BA;KHUDAWADI LETTER KA;Lo;0;L;;;;;N;;;;; +112BB;KHUDAWADI LETTER KHA;Lo;0;L;;;;;N;;;;; +112BC;KHUDAWADI LETTER GA;Lo;0;L;;;;;N;;;;; +112BD;KHUDAWADI LETTER GGA;Lo;0;L;;;;;N;;;;; +112BE;KHUDAWADI LETTER GHA;Lo;0;L;;;;;N;;;;; +112BF;KHUDAWADI LETTER NGA;Lo;0;L;;;;;N;;;;; +112C0;KHUDAWADI LETTER CA;Lo;0;L;;;;;N;;;;; +112C1;KHUDAWADI LETTER CHA;Lo;0;L;;;;;N;;;;; +112C2;KHUDAWADI LETTER JA;Lo;0;L;;;;;N;;;;; +112C3;KHUDAWADI LETTER JJA;Lo;0;L;;;;;N;;;;; +112C4;KHUDAWADI LETTER JHA;Lo;0;L;;;;;N;;;;; +112C5;KHUDAWADI LETTER NYA;Lo;0;L;;;;;N;;;;; +112C6;KHUDAWADI LETTER TTA;Lo;0;L;;;;;N;;;;; +112C7;KHUDAWADI LETTER TTHA;Lo;0;L;;;;;N;;;;; +112C8;KHUDAWADI LETTER DDA;Lo;0;L;;;;;N;;;;; +112C9;KHUDAWADI LETTER DDDA;Lo;0;L;;;;;N;;;;; +112CA;KHUDAWADI LETTER RRA;Lo;0;L;;;;;N;;;;; +112CB;KHUDAWADI LETTER DDHA;Lo;0;L;;;;;N;;;;; +112CC;KHUDAWADI LETTER NNA;Lo;0;L;;;;;N;;;;; +112CD;KHUDAWADI LETTER TA;Lo;0;L;;;;;N;;;;; +112CE;KHUDAWADI LETTER THA;Lo;0;L;;;;;N;;;;; +112CF;KHUDAWADI LETTER DA;Lo;0;L;;;;;N;;;;; +112D0;KHUDAWADI LETTER DHA;Lo;0;L;;;;;N;;;;; +112D1;KHUDAWADI LETTER NA;Lo;0;L;;;;;N;;;;; +112D2;KHUDAWADI LETTER PA;Lo;0;L;;;;;N;;;;; +112D3;KHUDAWADI LETTER PHA;Lo;0;L;;;;;N;;;;; +112D4;KHUDAWADI LETTER BA;Lo;0;L;;;;;N;;;;; +112D5;KHUDAWADI LETTER BBA;Lo;0;L;;;;;N;;;;; +112D6;KHUDAWADI LETTER BHA;Lo;0;L;;;;;N;;;;; +112D7;KHUDAWADI LETTER MA;Lo;0;L;;;;;N;;;;; +112D8;KHUDAWADI LETTER YA;Lo;0;L;;;;;N;;;;; +112D9;KHUDAWADI LETTER RA;Lo;0;L;;;;;N;;;;; +112DA;KHUDAWADI LETTER LA;Lo;0;L;;;;;N;;;;; +112DB;KHUDAWADI LETTER VA;Lo;0;L;;;;;N;;;;; +112DC;KHUDAWADI LETTER SHA;Lo;0;L;;;;;N;;;;; +112DD;KHUDAWADI LETTER SA;Lo;0;L;;;;;N;;;;; +112DE;KHUDAWADI LETTER HA;Lo;0;L;;;;;N;;;;; +112DF;KHUDAWADI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +112E0;KHUDAWADI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +112E1;KHUDAWADI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +112E2;KHUDAWADI VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +112E3;KHUDAWADI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +112E4;KHUDAWADI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +112E5;KHUDAWADI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +112E6;KHUDAWADI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +112E7;KHUDAWADI VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; +112E8;KHUDAWADI VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;; +112E9;KHUDAWADI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +112EA;KHUDAWADI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +112F0;KHUDAWADI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +112F1;KHUDAWADI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +112F2;KHUDAWADI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +112F3;KHUDAWADI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +112F4;KHUDAWADI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +112F5;KHUDAWADI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +112F6;KHUDAWADI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +112F7;KHUDAWADI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +112F8;KHUDAWADI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +112F9;KHUDAWADI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +11300;GRANTHA SIGN COMBINING ANUSVARA ABOVE;Mn;0;NSM;;;;;N;;;;; +11301;GRANTHA SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; +11302;GRANTHA SIGN ANUSVARA;Mc;0;L;;;;;N;;;;; +11303;GRANTHA SIGN VISARGA;Mc;0;L;;;;;N;;;;; +11305;GRANTHA LETTER A;Lo;0;L;;;;;N;;;;; +11306;GRANTHA LETTER AA;Lo;0;L;;;;;N;;;;; +11307;GRANTHA LETTER I;Lo;0;L;;;;;N;;;;; +11308;GRANTHA LETTER II;Lo;0;L;;;;;N;;;;; +11309;GRANTHA LETTER U;Lo;0;L;;;;;N;;;;; +1130A;GRANTHA LETTER UU;Lo;0;L;;;;;N;;;;; +1130B;GRANTHA LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +1130C;GRANTHA LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +1130F;GRANTHA LETTER EE;Lo;0;L;;;;;N;;;;; +11310;GRANTHA LETTER AI;Lo;0;L;;;;;N;;;;; +11313;GRANTHA LETTER OO;Lo;0;L;;;;;N;;;;; +11314;GRANTHA LETTER AU;Lo;0;L;;;;;N;;;;; +11315;GRANTHA LETTER KA;Lo;0;L;;;;;N;;;;; +11316;GRANTHA LETTER KHA;Lo;0;L;;;;;N;;;;; +11317;GRANTHA LETTER GA;Lo;0;L;;;;;N;;;;; +11318;GRANTHA LETTER GHA;Lo;0;L;;;;;N;;;;; +11319;GRANTHA LETTER NGA;Lo;0;L;;;;;N;;;;; +1131A;GRANTHA LETTER CA;Lo;0;L;;;;;N;;;;; +1131B;GRANTHA LETTER CHA;Lo;0;L;;;;;N;;;;; +1131C;GRANTHA LETTER JA;Lo;0;L;;;;;N;;;;; +1131D;GRANTHA LETTER JHA;Lo;0;L;;;;;N;;;;; +1131E;GRANTHA LETTER NYA;Lo;0;L;;;;;N;;;;; +1131F;GRANTHA LETTER TTA;Lo;0;L;;;;;N;;;;; +11320;GRANTHA LETTER TTHA;Lo;0;L;;;;;N;;;;; +11321;GRANTHA LETTER DDA;Lo;0;L;;;;;N;;;;; +11322;GRANTHA LETTER DDHA;Lo;0;L;;;;;N;;;;; +11323;GRANTHA LETTER NNA;Lo;0;L;;;;;N;;;;; +11324;GRANTHA LETTER TA;Lo;0;L;;;;;N;;;;; +11325;GRANTHA LETTER THA;Lo;0;L;;;;;N;;;;; +11326;GRANTHA LETTER DA;Lo;0;L;;;;;N;;;;; +11327;GRANTHA LETTER DHA;Lo;0;L;;;;;N;;;;; +11328;GRANTHA LETTER NA;Lo;0;L;;;;;N;;;;; +1132A;GRANTHA LETTER PA;Lo;0;L;;;;;N;;;;; +1132B;GRANTHA LETTER PHA;Lo;0;L;;;;;N;;;;; +1132C;GRANTHA LETTER BA;Lo;0;L;;;;;N;;;;; +1132D;GRANTHA LETTER BHA;Lo;0;L;;;;;N;;;;; +1132E;GRANTHA LETTER MA;Lo;0;L;;;;;N;;;;; +1132F;GRANTHA LETTER YA;Lo;0;L;;;;;N;;;;; +11330;GRANTHA LETTER RA;Lo;0;L;;;;;N;;;;; +11332;GRANTHA LETTER LA;Lo;0;L;;;;;N;;;;; +11333;GRANTHA LETTER LLA;Lo;0;L;;;;;N;;;;; +11335;GRANTHA LETTER VA;Lo;0;L;;;;;N;;;;; +11336;GRANTHA LETTER SHA;Lo;0;L;;;;;N;;;;; +11337;GRANTHA LETTER SSA;Lo;0;L;;;;;N;;;;; +11338;GRANTHA LETTER SA;Lo;0;L;;;;;N;;;;; +11339;GRANTHA LETTER HA;Lo;0;L;;;;;N;;;;; +1133B;COMBINING BINDU BELOW;Mn;7;NSM;;;;;N;;;;; +1133C;GRANTHA SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +1133D;GRANTHA SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; +1133E;GRANTHA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +1133F;GRANTHA VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +11340;GRANTHA VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; +11341;GRANTHA VOWEL SIGN U;Mc;0;L;;;;;N;;;;; +11342;GRANTHA VOWEL SIGN UU;Mc;0;L;;;;;N;;;;; +11343;GRANTHA VOWEL SIGN VOCALIC R;Mc;0;L;;;;;N;;;;; +11344;GRANTHA VOWEL SIGN VOCALIC RR;Mc;0;L;;;;;N;;;;; +11347;GRANTHA VOWEL SIGN EE;Mc;0;L;;;;;N;;;;; +11348;GRANTHA VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; +1134B;GRANTHA VOWEL SIGN OO;Mc;0;L;11347 1133E;;;;N;;;;; +1134C;GRANTHA VOWEL SIGN AU;Mc;0;L;11347 11357;;;;N;;;;; +1134D;GRANTHA SIGN VIRAMA;Mc;9;L;;;;;N;;;;; +11350;GRANTHA OM;Lo;0;L;;;;;N;;;;; +11357;GRANTHA AU LENGTH MARK;Mc;0;L;;;;;N;;;;; +1135D;GRANTHA SIGN PLUTA;Lo;0;L;;;;;N;;;;; +1135E;GRANTHA LETTER VEDIC ANUSVARA;Lo;0;L;;;;;N;;;;; +1135F;GRANTHA LETTER VEDIC DOUBLE ANUSVARA;Lo;0;L;;;;;N;;;;; +11360;GRANTHA LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +11361;GRANTHA LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +11362;GRANTHA VOWEL SIGN VOCALIC L;Mc;0;L;;;;;N;;;;; +11363;GRANTHA VOWEL SIGN VOCALIC LL;Mc;0;L;;;;;N;;;;; +11366;COMBINING GRANTHA DIGIT ZERO;Mn;230;NSM;;;;;N;;;;; +11367;COMBINING GRANTHA DIGIT ONE;Mn;230;NSM;;;;;N;;;;; +11368;COMBINING GRANTHA DIGIT TWO;Mn;230;NSM;;;;;N;;;;; +11369;COMBINING GRANTHA DIGIT THREE;Mn;230;NSM;;;;;N;;;;; +1136A;COMBINING GRANTHA DIGIT FOUR;Mn;230;NSM;;;;;N;;;;; +1136B;COMBINING GRANTHA DIGIT FIVE;Mn;230;NSM;;;;;N;;;;; +1136C;COMBINING GRANTHA DIGIT SIX;Mn;230;NSM;;;;;N;;;;; +11370;COMBINING GRANTHA LETTER A;Mn;230;NSM;;;;;N;;;;; +11371;COMBINING GRANTHA LETTER KA;Mn;230;NSM;;;;;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;;;;; +1145E;NEWA SANDHI MARK;Mn;230;NSM;;;;;N;;;;; +11480;TIRHUTA ANJI;Lo;0;L;;;;;N;;;;; +11481;TIRHUTA LETTER A;Lo;0;L;;;;;N;;;;; +11482;TIRHUTA LETTER AA;Lo;0;L;;;;;N;;;;; +11483;TIRHUTA LETTER I;Lo;0;L;;;;;N;;;;; +11484;TIRHUTA LETTER II;Lo;0;L;;;;;N;;;;; +11485;TIRHUTA LETTER U;Lo;0;L;;;;;N;;;;; +11486;TIRHUTA LETTER UU;Lo;0;L;;;;;N;;;;; +11487;TIRHUTA LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +11488;TIRHUTA LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +11489;TIRHUTA LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +1148A;TIRHUTA LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +1148B;TIRHUTA LETTER E;Lo;0;L;;;;;N;;;;; +1148C;TIRHUTA LETTER AI;Lo;0;L;;;;;N;;;;; +1148D;TIRHUTA LETTER O;Lo;0;L;;;;;N;;;;; +1148E;TIRHUTA LETTER AU;Lo;0;L;;;;;N;;;;; +1148F;TIRHUTA LETTER KA;Lo;0;L;;;;;N;;;;; +11490;TIRHUTA LETTER KHA;Lo;0;L;;;;;N;;;;; +11491;TIRHUTA LETTER GA;Lo;0;L;;;;;N;;;;; +11492;TIRHUTA LETTER GHA;Lo;0;L;;;;;N;;;;; +11493;TIRHUTA LETTER NGA;Lo;0;L;;;;;N;;;;; +11494;TIRHUTA LETTER CA;Lo;0;L;;;;;N;;;;; +11495;TIRHUTA LETTER CHA;Lo;0;L;;;;;N;;;;; +11496;TIRHUTA LETTER JA;Lo;0;L;;;;;N;;;;; +11497;TIRHUTA LETTER JHA;Lo;0;L;;;;;N;;;;; +11498;TIRHUTA LETTER NYA;Lo;0;L;;;;;N;;;;; +11499;TIRHUTA LETTER TTA;Lo;0;L;;;;;N;;;;; +1149A;TIRHUTA LETTER TTHA;Lo;0;L;;;;;N;;;;; +1149B;TIRHUTA LETTER DDA;Lo;0;L;;;;;N;;;;; +1149C;TIRHUTA LETTER DDHA;Lo;0;L;;;;;N;;;;; +1149D;TIRHUTA LETTER NNA;Lo;0;L;;;;;N;;;;; +1149E;TIRHUTA LETTER TA;Lo;0;L;;;;;N;;;;; +1149F;TIRHUTA LETTER THA;Lo;0;L;;;;;N;;;;; +114A0;TIRHUTA LETTER DA;Lo;0;L;;;;;N;;;;; +114A1;TIRHUTA LETTER DHA;Lo;0;L;;;;;N;;;;; +114A2;TIRHUTA LETTER NA;Lo;0;L;;;;;N;;;;; +114A3;TIRHUTA LETTER PA;Lo;0;L;;;;;N;;;;; +114A4;TIRHUTA LETTER PHA;Lo;0;L;;;;;N;;;;; +114A5;TIRHUTA LETTER BA;Lo;0;L;;;;;N;;;;; +114A6;TIRHUTA LETTER BHA;Lo;0;L;;;;;N;;;;; +114A7;TIRHUTA LETTER MA;Lo;0;L;;;;;N;;;;; +114A8;TIRHUTA LETTER YA;Lo;0;L;;;;;N;;;;; +114A9;TIRHUTA LETTER RA;Lo;0;L;;;;;N;;;;; +114AA;TIRHUTA LETTER LA;Lo;0;L;;;;;N;;;;; +114AB;TIRHUTA LETTER VA;Lo;0;L;;;;;N;;;;; +114AC;TIRHUTA LETTER SHA;Lo;0;L;;;;;N;;;;; +114AD;TIRHUTA LETTER SSA;Lo;0;L;;;;;N;;;;; +114AE;TIRHUTA LETTER SA;Lo;0;L;;;;;N;;;;; +114AF;TIRHUTA LETTER HA;Lo;0;L;;;;;N;;;;; +114B0;TIRHUTA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +114B1;TIRHUTA VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +114B2;TIRHUTA VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +114B3;TIRHUTA VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +114B4;TIRHUTA VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +114B5;TIRHUTA VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +114B6;TIRHUTA VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; +114B7;TIRHUTA VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; +114B8;TIRHUTA VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; +114B9;TIRHUTA VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +114BA;TIRHUTA VOWEL SIGN SHORT E;Mn;0;NSM;;;;;N;;;;; +114BB;TIRHUTA VOWEL SIGN AI;Mc;0;L;114B9 114BA;;;;N;;;;; +114BC;TIRHUTA VOWEL SIGN O;Mc;0;L;114B9 114B0;;;;N;;;;; +114BD;TIRHUTA VOWEL SIGN SHORT O;Mc;0;L;;;;;N;;;;; +114BE;TIRHUTA VOWEL SIGN AU;Mc;0;L;114B9 114BD;;;;N;;;;; +114BF;TIRHUTA SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; +114C0;TIRHUTA SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +114C1;TIRHUTA SIGN VISARGA;Mc;0;L;;;;;N;;;;; +114C2;TIRHUTA SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +114C3;TIRHUTA SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +114C4;TIRHUTA SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; +114C5;TIRHUTA GVANG;Lo;0;L;;;;;N;;;;; +114C6;TIRHUTA ABBREVIATION SIGN;Po;0;L;;;;;N;;;;; +114C7;TIRHUTA OM;Lo;0;L;;;;;N;;;;; +114D0;TIRHUTA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +114D1;TIRHUTA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +114D2;TIRHUTA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +114D3;TIRHUTA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +114D4;TIRHUTA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +114D5;TIRHUTA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +114D6;TIRHUTA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +114D7;TIRHUTA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +114D8;TIRHUTA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +114D9;TIRHUTA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +11580;SIDDHAM LETTER A;Lo;0;L;;;;;N;;;;; +11581;SIDDHAM LETTER AA;Lo;0;L;;;;;N;;;;; +11582;SIDDHAM LETTER I;Lo;0;L;;;;;N;;;;; +11583;SIDDHAM LETTER II;Lo;0;L;;;;;N;;;;; +11584;SIDDHAM LETTER U;Lo;0;L;;;;;N;;;;; +11585;SIDDHAM LETTER UU;Lo;0;L;;;;;N;;;;; +11586;SIDDHAM LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +11587;SIDDHAM LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +11588;SIDDHAM LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +11589;SIDDHAM LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +1158A;SIDDHAM LETTER E;Lo;0;L;;;;;N;;;;; +1158B;SIDDHAM LETTER AI;Lo;0;L;;;;;N;;;;; +1158C;SIDDHAM LETTER O;Lo;0;L;;;;;N;;;;; +1158D;SIDDHAM LETTER AU;Lo;0;L;;;;;N;;;;; +1158E;SIDDHAM LETTER KA;Lo;0;L;;;;;N;;;;; +1158F;SIDDHAM LETTER KHA;Lo;0;L;;;;;N;;;;; +11590;SIDDHAM LETTER GA;Lo;0;L;;;;;N;;;;; +11591;SIDDHAM LETTER GHA;Lo;0;L;;;;;N;;;;; +11592;SIDDHAM LETTER NGA;Lo;0;L;;;;;N;;;;; +11593;SIDDHAM LETTER CA;Lo;0;L;;;;;N;;;;; +11594;SIDDHAM LETTER CHA;Lo;0;L;;;;;N;;;;; +11595;SIDDHAM LETTER JA;Lo;0;L;;;;;N;;;;; +11596;SIDDHAM LETTER JHA;Lo;0;L;;;;;N;;;;; +11597;SIDDHAM LETTER NYA;Lo;0;L;;;;;N;;;;; +11598;SIDDHAM LETTER TTA;Lo;0;L;;;;;N;;;;; +11599;SIDDHAM LETTER TTHA;Lo;0;L;;;;;N;;;;; +1159A;SIDDHAM LETTER DDA;Lo;0;L;;;;;N;;;;; +1159B;SIDDHAM LETTER DDHA;Lo;0;L;;;;;N;;;;; +1159C;SIDDHAM LETTER NNA;Lo;0;L;;;;;N;;;;; +1159D;SIDDHAM LETTER TA;Lo;0;L;;;;;N;;;;; +1159E;SIDDHAM LETTER THA;Lo;0;L;;;;;N;;;;; +1159F;SIDDHAM LETTER DA;Lo;0;L;;;;;N;;;;; +115A0;SIDDHAM LETTER DHA;Lo;0;L;;;;;N;;;;; +115A1;SIDDHAM LETTER NA;Lo;0;L;;;;;N;;;;; +115A2;SIDDHAM LETTER PA;Lo;0;L;;;;;N;;;;; +115A3;SIDDHAM LETTER PHA;Lo;0;L;;;;;N;;;;; +115A4;SIDDHAM LETTER BA;Lo;0;L;;;;;N;;;;; +115A5;SIDDHAM LETTER BHA;Lo;0;L;;;;;N;;;;; +115A6;SIDDHAM LETTER MA;Lo;0;L;;;;;N;;;;; +115A7;SIDDHAM LETTER YA;Lo;0;L;;;;;N;;;;; +115A8;SIDDHAM LETTER RA;Lo;0;L;;;;;N;;;;; +115A9;SIDDHAM LETTER LA;Lo;0;L;;;;;N;;;;; +115AA;SIDDHAM LETTER VA;Lo;0;L;;;;;N;;;;; +115AB;SIDDHAM LETTER SHA;Lo;0;L;;;;;N;;;;; +115AC;SIDDHAM LETTER SSA;Lo;0;L;;;;;N;;;;; +115AD;SIDDHAM LETTER SA;Lo;0;L;;;;;N;;;;; +115AE;SIDDHAM LETTER HA;Lo;0;L;;;;;N;;;;; +115AF;SIDDHAM VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +115B0;SIDDHAM VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +115B1;SIDDHAM VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +115B2;SIDDHAM VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +115B3;SIDDHAM VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +115B4;SIDDHAM VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +115B5;SIDDHAM VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; +115B8;SIDDHAM VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +115B9;SIDDHAM VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; +115BA;SIDDHAM VOWEL SIGN O;Mc;0;L;115B8 115AF;;;;N;;;;; +115BB;SIDDHAM VOWEL SIGN AU;Mc;0;L;115B9 115AF;;;;N;;;;; +115BC;SIDDHAM SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; +115BD;SIDDHAM SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +115BE;SIDDHAM SIGN VISARGA;Mc;0;L;;;;;N;;;;; +115BF;SIDDHAM SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +115C0;SIDDHAM SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +115C1;SIDDHAM SIGN SIDDHAM;Po;0;L;;;;;N;;;;; +115C2;SIDDHAM DANDA;Po;0;L;;;;;N;;;;; +115C3;SIDDHAM DOUBLE DANDA;Po;0;L;;;;;N;;;;; +115C4;SIDDHAM SEPARATOR DOT;Po;0;L;;;;;N;;;;; +115C5;SIDDHAM SEPARATOR BAR;Po;0;L;;;;;N;;;;; +115C6;SIDDHAM REPETITION MARK-1;Po;0;L;;;;;N;;;;; +115C7;SIDDHAM REPETITION MARK-2;Po;0;L;;;;;N;;;;; +115C8;SIDDHAM REPETITION MARK-3;Po;0;L;;;;;N;;;;; +115C9;SIDDHAM END OF TEXT MARK;Po;0;L;;;;;N;;;;; +115CA;SIDDHAM SECTION MARK WITH TRIDENT AND U-SHAPED ORNAMENTS;Po;0;L;;;;;N;;;;; +115CB;SIDDHAM SECTION MARK WITH TRIDENT AND DOTTED CRESCENTS;Po;0;L;;;;;N;;;;; +115CC;SIDDHAM SECTION MARK WITH RAYS AND DOTTED CRESCENTS;Po;0;L;;;;;N;;;;; +115CD;SIDDHAM SECTION MARK WITH RAYS AND DOTTED DOUBLE CRESCENTS;Po;0;L;;;;;N;;;;; +115CE;SIDDHAM SECTION MARK WITH RAYS AND DOTTED TRIPLE CRESCENTS;Po;0;L;;;;;N;;;;; +115CF;SIDDHAM SECTION MARK DOUBLE RING;Po;0;L;;;;;N;;;;; +115D0;SIDDHAM SECTION MARK DOUBLE RING WITH RAYS;Po;0;L;;;;;N;;;;; +115D1;SIDDHAM SECTION MARK WITH DOUBLE CRESCENTS;Po;0;L;;;;;N;;;;; +115D2;SIDDHAM SECTION MARK WITH TRIPLE CRESCENTS;Po;0;L;;;;;N;;;;; +115D3;SIDDHAM SECTION MARK WITH QUADRUPLE CRESCENTS;Po;0;L;;;;;N;;;;; +115D4;SIDDHAM SECTION MARK WITH SEPTUPLE CRESCENTS;Po;0;L;;;;;N;;;;; +115D5;SIDDHAM SECTION MARK WITH CIRCLES AND RAYS;Po;0;L;;;;;N;;;;; +115D6;SIDDHAM SECTION MARK WITH CIRCLES AND TWO ENCLOSURES;Po;0;L;;;;;N;;;;; +115D7;SIDDHAM SECTION MARK WITH CIRCLES AND FOUR ENCLOSURES;Po;0;L;;;;;N;;;;; +115D8;SIDDHAM LETTER THREE-CIRCLE ALTERNATE I;Lo;0;L;;;;;N;;;;; +115D9;SIDDHAM LETTER TWO-CIRCLE ALTERNATE I;Lo;0;L;;;;;N;;;;; +115DA;SIDDHAM LETTER TWO-CIRCLE ALTERNATE II;Lo;0;L;;;;;N;;;;; +115DB;SIDDHAM LETTER ALTERNATE U;Lo;0;L;;;;;N;;;;; +115DC;SIDDHAM VOWEL SIGN ALTERNATE U;Mn;0;NSM;;;;;N;;;;; +115DD;SIDDHAM VOWEL SIGN ALTERNATE UU;Mn;0;NSM;;;;;N;;;;; +11600;MODI LETTER A;Lo;0;L;;;;;N;;;;; +11601;MODI LETTER AA;Lo;0;L;;;;;N;;;;; +11602;MODI LETTER I;Lo;0;L;;;;;N;;;;; +11603;MODI LETTER II;Lo;0;L;;;;;N;;;;; +11604;MODI LETTER U;Lo;0;L;;;;;N;;;;; +11605;MODI LETTER UU;Lo;0;L;;;;;N;;;;; +11606;MODI LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +11607;MODI LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +11608;MODI LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +11609;MODI LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +1160A;MODI LETTER E;Lo;0;L;;;;;N;;;;; +1160B;MODI LETTER AI;Lo;0;L;;;;;N;;;;; +1160C;MODI LETTER O;Lo;0;L;;;;;N;;;;; +1160D;MODI LETTER AU;Lo;0;L;;;;;N;;;;; +1160E;MODI LETTER KA;Lo;0;L;;;;;N;;;;; +1160F;MODI LETTER KHA;Lo;0;L;;;;;N;;;;; +11610;MODI LETTER GA;Lo;0;L;;;;;N;;;;; +11611;MODI LETTER GHA;Lo;0;L;;;;;N;;;;; +11612;MODI LETTER NGA;Lo;0;L;;;;;N;;;;; +11613;MODI LETTER CA;Lo;0;L;;;;;N;;;;; +11614;MODI LETTER CHA;Lo;0;L;;;;;N;;;;; +11615;MODI LETTER JA;Lo;0;L;;;;;N;;;;; +11616;MODI LETTER JHA;Lo;0;L;;;;;N;;;;; +11617;MODI LETTER NYA;Lo;0;L;;;;;N;;;;; +11618;MODI LETTER TTA;Lo;0;L;;;;;N;;;;; +11619;MODI LETTER TTHA;Lo;0;L;;;;;N;;;;; +1161A;MODI LETTER DDA;Lo;0;L;;;;;N;;;;; +1161B;MODI LETTER DDHA;Lo;0;L;;;;;N;;;;; +1161C;MODI LETTER NNA;Lo;0;L;;;;;N;;;;; +1161D;MODI LETTER TA;Lo;0;L;;;;;N;;;;; +1161E;MODI LETTER THA;Lo;0;L;;;;;N;;;;; +1161F;MODI LETTER DA;Lo;0;L;;;;;N;;;;; +11620;MODI LETTER DHA;Lo;0;L;;;;;N;;;;; +11621;MODI LETTER NA;Lo;0;L;;;;;N;;;;; +11622;MODI LETTER PA;Lo;0;L;;;;;N;;;;; +11623;MODI LETTER PHA;Lo;0;L;;;;;N;;;;; +11624;MODI LETTER BA;Lo;0;L;;;;;N;;;;; +11625;MODI LETTER BHA;Lo;0;L;;;;;N;;;;; +11626;MODI LETTER MA;Lo;0;L;;;;;N;;;;; +11627;MODI LETTER YA;Lo;0;L;;;;;N;;;;; +11628;MODI LETTER RA;Lo;0;L;;;;;N;;;;; +11629;MODI LETTER LA;Lo;0;L;;;;;N;;;;; +1162A;MODI LETTER VA;Lo;0;L;;;;;N;;;;; +1162B;MODI LETTER SHA;Lo;0;L;;;;;N;;;;; +1162C;MODI LETTER SSA;Lo;0;L;;;;;N;;;;; +1162D;MODI LETTER SA;Lo;0;L;;;;;N;;;;; +1162E;MODI LETTER HA;Lo;0;L;;;;;N;;;;; +1162F;MODI LETTER LLA;Lo;0;L;;;;;N;;;;; +11630;MODI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +11631;MODI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +11632;MODI VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +11633;MODI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +11634;MODI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +11635;MODI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +11636;MODI VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; +11637;MODI VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; +11638;MODI VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; +11639;MODI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +1163A;MODI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +1163B;MODI VOWEL SIGN O;Mc;0;L;;;;;N;;;;; +1163C;MODI VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; +1163D;MODI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +1163E;MODI SIGN VISARGA;Mc;0;L;;;;;N;;;;; +1163F;MODI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +11640;MODI SIGN ARDHACANDRA;Mn;0;NSM;;;;;N;;;;; +11641;MODI DANDA;Po;0;L;;;;;N;;;;; +11642;MODI DOUBLE DANDA;Po;0;L;;;;;N;;;;; +11643;MODI ABBREVIATION SIGN;Po;0;L;;;;;N;;;;; +11644;MODI SIGN HUVA;Lo;0;L;;;;;N;;;;; +11650;MODI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +11651;MODI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +11652;MODI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +11653;MODI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +11654;MODI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +11655;MODI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +11656;MODI DIGIT SIX;Nd;0;L;;6;6;6;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;;;;; +11683;TAKRI LETTER II;Lo;0;L;;;;;N;;;;; +11684;TAKRI LETTER U;Lo;0;L;;;;;N;;;;; +11685;TAKRI LETTER UU;Lo;0;L;;;;;N;;;;; +11686;TAKRI LETTER E;Lo;0;L;;;;;N;;;;; +11687;TAKRI LETTER AI;Lo;0;L;;;;;N;;;;; +11688;TAKRI LETTER O;Lo;0;L;;;;;N;;;;; +11689;TAKRI LETTER AU;Lo;0;L;;;;;N;;;;; +1168A;TAKRI LETTER KA;Lo;0;L;;;;;N;;;;; +1168B;TAKRI LETTER KHA;Lo;0;L;;;;;N;;;;; +1168C;TAKRI LETTER GA;Lo;0;L;;;;;N;;;;; +1168D;TAKRI LETTER GHA;Lo;0;L;;;;;N;;;;; +1168E;TAKRI LETTER NGA;Lo;0;L;;;;;N;;;;; +1168F;TAKRI LETTER CA;Lo;0;L;;;;;N;;;;; +11690;TAKRI LETTER CHA;Lo;0;L;;;;;N;;;;; +11691;TAKRI LETTER JA;Lo;0;L;;;;;N;;;;; +11692;TAKRI LETTER JHA;Lo;0;L;;;;;N;;;;; +11693;TAKRI LETTER NYA;Lo;0;L;;;;;N;;;;; +11694;TAKRI LETTER TTA;Lo;0;L;;;;;N;;;;; +11695;TAKRI LETTER TTHA;Lo;0;L;;;;;N;;;;; +11696;TAKRI LETTER DDA;Lo;0;L;;;;;N;;;;; +11697;TAKRI LETTER DDHA;Lo;0;L;;;;;N;;;;; +11698;TAKRI LETTER NNA;Lo;0;L;;;;;N;;;;; +11699;TAKRI LETTER TA;Lo;0;L;;;;;N;;;;; +1169A;TAKRI LETTER THA;Lo;0;L;;;;;N;;;;; +1169B;TAKRI LETTER DA;Lo;0;L;;;;;N;;;;; +1169C;TAKRI LETTER DHA;Lo;0;L;;;;;N;;;;; +1169D;TAKRI LETTER NA;Lo;0;L;;;;;N;;;;; +1169E;TAKRI LETTER PA;Lo;0;L;;;;;N;;;;; +1169F;TAKRI LETTER PHA;Lo;0;L;;;;;N;;;;; +116A0;TAKRI LETTER BA;Lo;0;L;;;;;N;;;;; +116A1;TAKRI LETTER BHA;Lo;0;L;;;;;N;;;;; +116A2;TAKRI LETTER MA;Lo;0;L;;;;;N;;;;; +116A3;TAKRI LETTER YA;Lo;0;L;;;;;N;;;;; +116A4;TAKRI LETTER RA;Lo;0;L;;;;;N;;;;; +116A5;TAKRI LETTER LA;Lo;0;L;;;;;N;;;;; +116A6;TAKRI LETTER VA;Lo;0;L;;;;;N;;;;; +116A7;TAKRI LETTER SHA;Lo;0;L;;;;;N;;;;; +116A8;TAKRI LETTER SA;Lo;0;L;;;;;N;;;;; +116A9;TAKRI LETTER HA;Lo;0;L;;;;;N;;;;; +116AA;TAKRI LETTER RRA;Lo;0;L;;;;;N;;;;; +116AB;TAKRI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +116AC;TAKRI SIGN VISARGA;Mc;0;L;;;;;N;;;;; +116AD;TAKRI VOWEL SIGN AA;Mn;0;NSM;;;;;N;;;;; +116AE;TAKRI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +116AF;TAKRI VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +116B0;TAKRI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +116B1;TAKRI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +116B2;TAKRI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +116B3;TAKRI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +116B4;TAKRI VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; +116B5;TAKRI VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;; +116B6;TAKRI SIGN VIRAMA;Mc;9;L;;;;;N;;;;; +116B7;TAKRI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +116C0;TAKRI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +116C1;TAKRI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +116C2;TAKRI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +116C3;TAKRI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +116C4;TAKRI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +116C5;TAKRI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +116C6;TAKRI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +116C7;TAKRI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +116C8;TAKRI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +116C9;TAKRI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +11700;AHOM LETTER KA;Lo;0;L;;;;;N;;;;; +11701;AHOM LETTER KHA;Lo;0;L;;;;;N;;;;; +11702;AHOM LETTER NGA;Lo;0;L;;;;;N;;;;; +11703;AHOM LETTER NA;Lo;0;L;;;;;N;;;;; +11704;AHOM LETTER TA;Lo;0;L;;;;;N;;;;; +11705;AHOM LETTER ALTERNATE TA;Lo;0;L;;;;;N;;;;; +11706;AHOM LETTER PA;Lo;0;L;;;;;N;;;;; +11707;AHOM LETTER PHA;Lo;0;L;;;;;N;;;;; +11708;AHOM LETTER BA;Lo;0;L;;;;;N;;;;; +11709;AHOM LETTER MA;Lo;0;L;;;;;N;;;;; +1170A;AHOM LETTER JA;Lo;0;L;;;;;N;;;;; +1170B;AHOM LETTER CHA;Lo;0;L;;;;;N;;;;; +1170C;AHOM LETTER THA;Lo;0;L;;;;;N;;;;; +1170D;AHOM LETTER RA;Lo;0;L;;;;;N;;;;; +1170E;AHOM LETTER LA;Lo;0;L;;;;;N;;;;; +1170F;AHOM LETTER SA;Lo;0;L;;;;;N;;;;; +11710;AHOM LETTER NYA;Lo;0;L;;;;;N;;;;; +11711;AHOM LETTER HA;Lo;0;L;;;;;N;;;;; +11712;AHOM LETTER A;Lo;0;L;;;;;N;;;;; +11713;AHOM LETTER DA;Lo;0;L;;;;;N;;;;; +11714;AHOM LETTER DHA;Lo;0;L;;;;;N;;;;; +11715;AHOM LETTER GA;Lo;0;L;;;;;N;;;;; +11716;AHOM LETTER ALTERNATE GA;Lo;0;L;;;;;N;;;;; +11717;AHOM LETTER GHA;Lo;0;L;;;;;N;;;;; +11718;AHOM LETTER BHA;Lo;0;L;;;;;N;;;;; +11719;AHOM LETTER JHA;Lo;0;L;;;;;N;;;;; +1171A;AHOM LETTER ALTERNATE BA;Lo;0;L;;;;;N;;;;; +1171D;AHOM CONSONANT SIGN MEDIAL LA;Mn;0;NSM;;;;;N;;;;; +1171E;AHOM CONSONANT SIGN MEDIAL RA;Mn;0;NSM;;;;;N;;;;; +1171F;AHOM CONSONANT SIGN MEDIAL LIGATING RA;Mn;0;NSM;;;;;N;;;;; +11720;AHOM VOWEL SIGN A;Mc;0;L;;;;;N;;;;; +11721;AHOM VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +11722;AHOM VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +11723;AHOM VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; +11724;AHOM VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +11725;AHOM VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +11726;AHOM VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +11727;AHOM VOWEL SIGN AW;Mn;0;NSM;;;;;N;;;;; +11728;AHOM VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; +11729;AHOM VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +1172A;AHOM VOWEL SIGN AM;Mn;0;NSM;;;;;N;;;;; +1172B;AHOM SIGN KILLER;Mn;9;NSM;;;;;N;;;;; +11730;AHOM DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +11731;AHOM DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +11732;AHOM DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +11733;AHOM DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +11734;AHOM DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +11735;AHOM DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +11736;AHOM DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +11737;AHOM DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +11738;AHOM DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +11739;AHOM DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +1173A;AHOM NUMBER TEN;No;0;L;;;;10;N;;;;; +1173B;AHOM NUMBER TWENTY;No;0;L;;;;20;N;;;;; +1173C;AHOM SIGN SMALL SECTION;Po;0;L;;;;;N;;;;; +1173D;AHOM SIGN SECTION;Po;0;L;;;;;N;;;;; +1173E;AHOM SIGN RULAI;Po;0;L;;;;;N;;;;; +1173F;AHOM SYMBOL VI;So;0;L;;;;;N;;;;; +11800;DOGRA LETTER A;Lo;0;L;;;;;N;;;;; +11801;DOGRA LETTER AA;Lo;0;L;;;;;N;;;;; +11802;DOGRA LETTER I;Lo;0;L;;;;;N;;;;; +11803;DOGRA LETTER II;Lo;0;L;;;;;N;;;;; +11804;DOGRA LETTER U;Lo;0;L;;;;;N;;;;; +11805;DOGRA LETTER UU;Lo;0;L;;;;;N;;;;; +11806;DOGRA LETTER E;Lo;0;L;;;;;N;;;;; +11807;DOGRA LETTER AI;Lo;0;L;;;;;N;;;;; +11808;DOGRA LETTER O;Lo;0;L;;;;;N;;;;; +11809;DOGRA LETTER AU;Lo;0;L;;;;;N;;;;; +1180A;DOGRA LETTER KA;Lo;0;L;;;;;N;;;;; +1180B;DOGRA LETTER KHA;Lo;0;L;;;;;N;;;;; +1180C;DOGRA LETTER GA;Lo;0;L;;;;;N;;;;; +1180D;DOGRA LETTER GHA;Lo;0;L;;;;;N;;;;; +1180E;DOGRA LETTER NGA;Lo;0;L;;;;;N;;;;; +1180F;DOGRA LETTER CA;Lo;0;L;;;;;N;;;;; +11810;DOGRA LETTER CHA;Lo;0;L;;;;;N;;;;; +11811;DOGRA LETTER JA;Lo;0;L;;;;;N;;;;; +11812;DOGRA LETTER JHA;Lo;0;L;;;;;N;;;;; +11813;DOGRA LETTER NYA;Lo;0;L;;;;;N;;;;; +11814;DOGRA LETTER TTA;Lo;0;L;;;;;N;;;;; +11815;DOGRA LETTER TTHA;Lo;0;L;;;;;N;;;;; +11816;DOGRA LETTER DDA;Lo;0;L;;;;;N;;;;; +11817;DOGRA LETTER DDHA;Lo;0;L;;;;;N;;;;; +11818;DOGRA LETTER NNA;Lo;0;L;;;;;N;;;;; +11819;DOGRA LETTER TA;Lo;0;L;;;;;N;;;;; +1181A;DOGRA LETTER THA;Lo;0;L;;;;;N;;;;; +1181B;DOGRA LETTER DA;Lo;0;L;;;;;N;;;;; +1181C;DOGRA LETTER DHA;Lo;0;L;;;;;N;;;;; +1181D;DOGRA LETTER NA;Lo;0;L;;;;;N;;;;; +1181E;DOGRA LETTER PA;Lo;0;L;;;;;N;;;;; +1181F;DOGRA LETTER PHA;Lo;0;L;;;;;N;;;;; +11820;DOGRA LETTER BA;Lo;0;L;;;;;N;;;;; +11821;DOGRA LETTER BHA;Lo;0;L;;;;;N;;;;; +11822;DOGRA LETTER MA;Lo;0;L;;;;;N;;;;; +11823;DOGRA LETTER YA;Lo;0;L;;;;;N;;;;; +11824;DOGRA LETTER RA;Lo;0;L;;;;;N;;;;; +11825;DOGRA LETTER LA;Lo;0;L;;;;;N;;;;; +11826;DOGRA LETTER VA;Lo;0;L;;;;;N;;;;; +11827;DOGRA LETTER SHA;Lo;0;L;;;;;N;;;;; +11828;DOGRA LETTER SSA;Lo;0;L;;;;;N;;;;; +11829;DOGRA LETTER SA;Lo;0;L;;;;;N;;;;; +1182A;DOGRA LETTER HA;Lo;0;L;;;;;N;;;;; +1182B;DOGRA LETTER RRA;Lo;0;L;;;;;N;;;;; +1182C;DOGRA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +1182D;DOGRA VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +1182E;DOGRA VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +1182F;DOGRA VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +11830;DOGRA VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +11831;DOGRA VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +11832;DOGRA VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; +11833;DOGRA VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +11834;DOGRA VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +11835;DOGRA VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; +11836;DOGRA VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;; +11837;DOGRA SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +11838;DOGRA SIGN VISARGA;Mc;0;L;;;;;N;;;;; +11839;DOGRA SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +1183A;DOGRA SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +1183B;DOGRA ABBREVIATION SIGN;Po;0;L;;;;;N;;;;; +118A0;WARANG CITI CAPITAL LETTER NGAA;Lu;0;L;;;;;N;;;;118C0; +118A1;WARANG CITI CAPITAL LETTER A;Lu;0;L;;;;;N;;;;118C1; +118A2;WARANG CITI CAPITAL LETTER WI;Lu;0;L;;;;;N;;;;118C2; +118A3;WARANG CITI CAPITAL LETTER YU;Lu;0;L;;;;;N;;;;118C3; +118A4;WARANG CITI CAPITAL LETTER YA;Lu;0;L;;;;;N;;;;118C4; +118A5;WARANG CITI CAPITAL LETTER YO;Lu;0;L;;;;;N;;;;118C5; +118A6;WARANG CITI CAPITAL LETTER II;Lu;0;L;;;;;N;;;;118C6; +118A7;WARANG CITI CAPITAL LETTER UU;Lu;0;L;;;;;N;;;;118C7; +118A8;WARANG CITI CAPITAL LETTER E;Lu;0;L;;;;;N;;;;118C8; +118A9;WARANG CITI CAPITAL LETTER O;Lu;0;L;;;;;N;;;;118C9; +118AA;WARANG CITI CAPITAL LETTER ANG;Lu;0;L;;;;;N;;;;118CA; +118AB;WARANG CITI CAPITAL LETTER GA;Lu;0;L;;;;;N;;;;118CB; +118AC;WARANG CITI CAPITAL LETTER KO;Lu;0;L;;;;;N;;;;118CC; +118AD;WARANG CITI CAPITAL LETTER ENY;Lu;0;L;;;;;N;;;;118CD; +118AE;WARANG CITI CAPITAL LETTER YUJ;Lu;0;L;;;;;N;;;;118CE; +118AF;WARANG CITI CAPITAL LETTER UC;Lu;0;L;;;;;N;;;;118CF; +118B0;WARANG CITI CAPITAL LETTER ENN;Lu;0;L;;;;;N;;;;118D0; +118B1;WARANG CITI CAPITAL LETTER ODD;Lu;0;L;;;;;N;;;;118D1; +118B2;WARANG CITI CAPITAL LETTER TTE;Lu;0;L;;;;;N;;;;118D2; +118B3;WARANG CITI CAPITAL LETTER NUNG;Lu;0;L;;;;;N;;;;118D3; +118B4;WARANG CITI CAPITAL LETTER DA;Lu;0;L;;;;;N;;;;118D4; +118B5;WARANG CITI CAPITAL LETTER AT;Lu;0;L;;;;;N;;;;118D5; +118B6;WARANG CITI CAPITAL LETTER AM;Lu;0;L;;;;;N;;;;118D6; +118B7;WARANG CITI CAPITAL LETTER BU;Lu;0;L;;;;;N;;;;118D7; +118B8;WARANG CITI CAPITAL LETTER PU;Lu;0;L;;;;;N;;;;118D8; +118B9;WARANG CITI CAPITAL LETTER HIYO;Lu;0;L;;;;;N;;;;118D9; +118BA;WARANG CITI CAPITAL LETTER HOLO;Lu;0;L;;;;;N;;;;118DA; +118BB;WARANG CITI CAPITAL LETTER HORR;Lu;0;L;;;;;N;;;;118DB; +118BC;WARANG CITI CAPITAL LETTER HAR;Lu;0;L;;;;;N;;;;118DC; +118BD;WARANG CITI CAPITAL LETTER SSUU;Lu;0;L;;;;;N;;;;118DD; +118BE;WARANG CITI CAPITAL LETTER SII;Lu;0;L;;;;;N;;;;118DE; +118BF;WARANG CITI CAPITAL LETTER VIYO;Lu;0;L;;;;;N;;;;118DF; +118C0;WARANG CITI SMALL LETTER NGAA;Ll;0;L;;;;;N;;;118A0;;118A0 +118C1;WARANG CITI SMALL LETTER A;Ll;0;L;;;;;N;;;118A1;;118A1 +118C2;WARANG CITI SMALL LETTER WI;Ll;0;L;;;;;N;;;118A2;;118A2 +118C3;WARANG CITI SMALL LETTER YU;Ll;0;L;;;;;N;;;118A3;;118A3 +118C4;WARANG CITI SMALL LETTER YA;Ll;0;L;;;;;N;;;118A4;;118A4 +118C5;WARANG CITI SMALL LETTER YO;Ll;0;L;;;;;N;;;118A5;;118A5 +118C6;WARANG CITI SMALL LETTER II;Ll;0;L;;;;;N;;;118A6;;118A6 +118C7;WARANG CITI SMALL LETTER UU;Ll;0;L;;;;;N;;;118A7;;118A7 +118C8;WARANG CITI SMALL LETTER E;Ll;0;L;;;;;N;;;118A8;;118A8 +118C9;WARANG CITI SMALL LETTER O;Ll;0;L;;;;;N;;;118A9;;118A9 +118CA;WARANG CITI SMALL LETTER ANG;Ll;0;L;;;;;N;;;118AA;;118AA +118CB;WARANG CITI SMALL LETTER GA;Ll;0;L;;;;;N;;;118AB;;118AB +118CC;WARANG CITI SMALL LETTER KO;Ll;0;L;;;;;N;;;118AC;;118AC +118CD;WARANG CITI SMALL LETTER ENY;Ll;0;L;;;;;N;;;118AD;;118AD +118CE;WARANG CITI SMALL LETTER YUJ;Ll;0;L;;;;;N;;;118AE;;118AE +118CF;WARANG CITI SMALL LETTER UC;Ll;0;L;;;;;N;;;118AF;;118AF +118D0;WARANG CITI SMALL LETTER ENN;Ll;0;L;;;;;N;;;118B0;;118B0 +118D1;WARANG CITI SMALL LETTER ODD;Ll;0;L;;;;;N;;;118B1;;118B1 +118D2;WARANG CITI SMALL LETTER TTE;Ll;0;L;;;;;N;;;118B2;;118B2 +118D3;WARANG CITI SMALL LETTER NUNG;Ll;0;L;;;;;N;;;118B3;;118B3 +118D4;WARANG CITI SMALL LETTER DA;Ll;0;L;;;;;N;;;118B4;;118B4 +118D5;WARANG CITI SMALL LETTER AT;Ll;0;L;;;;;N;;;118B5;;118B5 +118D6;WARANG CITI SMALL LETTER AM;Ll;0;L;;;;;N;;;118B6;;118B6 +118D7;WARANG CITI SMALL LETTER BU;Ll;0;L;;;;;N;;;118B7;;118B7 +118D8;WARANG CITI SMALL LETTER PU;Ll;0;L;;;;;N;;;118B8;;118B8 +118D9;WARANG CITI SMALL LETTER HIYO;Ll;0;L;;;;;N;;;118B9;;118B9 +118DA;WARANG CITI SMALL LETTER HOLO;Ll;0;L;;;;;N;;;118BA;;118BA +118DB;WARANG CITI SMALL LETTER HORR;Ll;0;L;;;;;N;;;118BB;;118BB +118DC;WARANG CITI SMALL LETTER HAR;Ll;0;L;;;;;N;;;118BC;;118BC +118DD;WARANG CITI SMALL LETTER SSUU;Ll;0;L;;;;;N;;;118BD;;118BD +118DE;WARANG CITI SMALL LETTER SII;Ll;0;L;;;;;N;;;118BE;;118BE +118DF;WARANG CITI SMALL LETTER VIYO;Ll;0;L;;;;;N;;;118BF;;118BF +118E0;WARANG CITI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +118E1;WARANG CITI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +118E2;WARANG CITI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +118E3;WARANG CITI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +118E4;WARANG CITI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +118E5;WARANG CITI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +118E6;WARANG CITI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +118E7;WARANG CITI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +118E8;WARANG CITI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +118E9;WARANG CITI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +118EA;WARANG CITI NUMBER TEN;No;0;L;;;;10;N;;;;; +118EB;WARANG CITI NUMBER TWENTY;No;0;L;;;;20;N;;;;; +118EC;WARANG CITI NUMBER THIRTY;No;0;L;;;;30;N;;;;; +118ED;WARANG CITI NUMBER FORTY;No;0;L;;;;40;N;;;;; +118EE;WARANG CITI NUMBER FIFTY;No;0;L;;;;50;N;;;;; +118EF;WARANG CITI NUMBER SIXTY;No;0;L;;;;60;N;;;;; +118F0;WARANG CITI NUMBER SEVENTY;No;0;L;;;;70;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;Mn;0;L;;;;;N;;;;; +11A08;ZANABAZAR SQUARE VOWEL SIGN AU;Mn;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;;;;; +11A9D;SOYOMBO MARK PLUTA;Lo;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;;;;; +11AC3;PAU CIN HAU LETTER MA;Lo;0;L;;;;;N;;;;; +11AC4;PAU CIN HAU LETTER DA;Lo;0;L;;;;;N;;;;; +11AC5;PAU CIN HAU LETTER ZA;Lo;0;L;;;;;N;;;;; +11AC6;PAU CIN HAU LETTER VA;Lo;0;L;;;;;N;;;;; +11AC7;PAU CIN HAU LETTER NGA;Lo;0;L;;;;;N;;;;; +11AC8;PAU CIN HAU LETTER HA;Lo;0;L;;;;;N;;;;; +11AC9;PAU CIN HAU LETTER GA;Lo;0;L;;;;;N;;;;; +11ACA;PAU CIN HAU LETTER KHA;Lo;0;L;;;;;N;;;;; +11ACB;PAU CIN HAU LETTER SA;Lo;0;L;;;;;N;;;;; +11ACC;PAU CIN HAU LETTER BA;Lo;0;L;;;;;N;;;;; +11ACD;PAU CIN HAU LETTER CA;Lo;0;L;;;;;N;;;;; +11ACE;PAU CIN HAU LETTER TA;Lo;0;L;;;;;N;;;;; +11ACF;PAU CIN HAU LETTER THA;Lo;0;L;;;;;N;;;;; +11AD0;PAU CIN HAU LETTER NA;Lo;0;L;;;;;N;;;;; +11AD1;PAU CIN HAU LETTER PHA;Lo;0;L;;;;;N;;;;; +11AD2;PAU CIN HAU LETTER RA;Lo;0;L;;;;;N;;;;; +11AD3;PAU CIN HAU LETTER FA;Lo;0;L;;;;;N;;;;; +11AD4;PAU CIN HAU LETTER CHA;Lo;0;L;;;;;N;;;;; +11AD5;PAU CIN HAU LETTER A;Lo;0;L;;;;;N;;;;; +11AD6;PAU CIN HAU LETTER E;Lo;0;L;;;;;N;;;;; +11AD7;PAU CIN HAU LETTER I;Lo;0;L;;;;;N;;;;; +11AD8;PAU CIN HAU LETTER O;Lo;0;L;;;;;N;;;;; +11AD9;PAU CIN HAU LETTER U;Lo;0;L;;;;;N;;;;; +11ADA;PAU CIN HAU LETTER UA;Lo;0;L;;;;;N;;;;; +11ADB;PAU CIN HAU LETTER IA;Lo;0;L;;;;;N;;;;; +11ADC;PAU CIN HAU LETTER FINAL P;Lo;0;L;;;;;N;;;;; +11ADD;PAU CIN HAU LETTER FINAL K;Lo;0;L;;;;;N;;;;; +11ADE;PAU CIN HAU LETTER FINAL T;Lo;0;L;;;;;N;;;;; +11ADF;PAU CIN HAU LETTER FINAL M;Lo;0;L;;;;;N;;;;; +11AE0;PAU CIN HAU LETTER FINAL N;Lo;0;L;;;;;N;;;;; +11AE1;PAU CIN HAU LETTER FINAL L;Lo;0;L;;;;;N;;;;; +11AE2;PAU CIN HAU LETTER FINAL W;Lo;0;L;;;;;N;;;;; +11AE3;PAU CIN HAU LETTER FINAL NG;Lo;0;L;;;;;N;;;;; +11AE4;PAU CIN HAU LETTER FINAL Y;Lo;0;L;;;;;N;;;;; +11AE5;PAU CIN HAU RISING TONE LONG;Lo;0;L;;;;;N;;;;; +11AE6;PAU CIN HAU RISING TONE;Lo;0;L;;;;;N;;;;; +11AE7;PAU CIN HAU SANDHI GLOTTAL STOP;Lo;0;L;;;;;N;;;;; +11AE8;PAU CIN HAU RISING TONE LONG FINAL;Lo;0;L;;;;;N;;;;; +11AE9;PAU CIN HAU RISING TONE FINAL;Lo;0;L;;;;;N;;;;; +11AEA;PAU CIN HAU SANDHI GLOTTAL STOP FINAL;Lo;0;L;;;;;N;;;;; +11AEB;PAU CIN HAU SANDHI TONE LONG;Lo;0;L;;;;;N;;;;; +11AEC;PAU CIN HAU SANDHI TONE;Lo;0;L;;;;;N;;;;; +11AED;PAU CIN HAU SANDHI TONE LONG FINAL;Lo;0;L;;;;;N;;;;; +11AEE;PAU CIN HAU SANDHI TONE FINAL;Lo;0;L;;;;;N;;;;; +11AEF;PAU CIN HAU MID-LEVEL TONE;Lo;0;L;;;;;N;;;;; +11AF0;PAU CIN HAU GLOTTAL STOP VARIANT;Lo;0;L;;;;;N;;;;; +11AF1;PAU CIN HAU MID-LEVEL TONE LONG FINAL;Lo;0;L;;;;;N;;;;; +11AF2;PAU CIN HAU MID-LEVEL TONE FINAL;Lo;0;L;;;;;N;;;;; +11AF3;PAU CIN HAU LOW-FALLING TONE LONG;Lo;0;L;;;;;N;;;;; +11AF4;PAU CIN HAU LOW-FALLING TONE;Lo;0;L;;;;;N;;;;; +11AF5;PAU CIN HAU GLOTTAL STOP;Lo;0;L;;;;;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;;;;; +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;;;;; +11D60;GUNJALA GONDI LETTER A;Lo;0;L;;;;;N;;;;; +11D61;GUNJALA GONDI LETTER AA;Lo;0;L;;;;;N;;;;; +11D62;GUNJALA GONDI LETTER I;Lo;0;L;;;;;N;;;;; +11D63;GUNJALA GONDI LETTER II;Lo;0;L;;;;;N;;;;; +11D64;GUNJALA GONDI LETTER U;Lo;0;L;;;;;N;;;;; +11D65;GUNJALA GONDI LETTER UU;Lo;0;L;;;;;N;;;;; +11D67;GUNJALA GONDI LETTER EE;Lo;0;L;;;;;N;;;;; +11D68;GUNJALA GONDI LETTER AI;Lo;0;L;;;;;N;;;;; +11D6A;GUNJALA GONDI LETTER OO;Lo;0;L;;;;;N;;;;; +11D6B;GUNJALA GONDI LETTER AU;Lo;0;L;;;;;N;;;;; +11D6C;GUNJALA GONDI LETTER YA;Lo;0;L;;;;;N;;;;; +11D6D;GUNJALA GONDI LETTER VA;Lo;0;L;;;;;N;;;;; +11D6E;GUNJALA GONDI LETTER BA;Lo;0;L;;;;;N;;;;; +11D6F;GUNJALA GONDI LETTER BHA;Lo;0;L;;;;;N;;;;; +11D70;GUNJALA GONDI LETTER MA;Lo;0;L;;;;;N;;;;; +11D71;GUNJALA GONDI LETTER KA;Lo;0;L;;;;;N;;;;; +11D72;GUNJALA GONDI LETTER KHA;Lo;0;L;;;;;N;;;;; +11D73;GUNJALA GONDI LETTER TA;Lo;0;L;;;;;N;;;;; +11D74;GUNJALA GONDI LETTER THA;Lo;0;L;;;;;N;;;;; +11D75;GUNJALA GONDI LETTER LA;Lo;0;L;;;;;N;;;;; +11D76;GUNJALA GONDI LETTER GA;Lo;0;L;;;;;N;;;;; +11D77;GUNJALA GONDI LETTER GHA;Lo;0;L;;;;;N;;;;; +11D78;GUNJALA GONDI LETTER DA;Lo;0;L;;;;;N;;;;; +11D79;GUNJALA GONDI LETTER DHA;Lo;0;L;;;;;N;;;;; +11D7A;GUNJALA GONDI LETTER NA;Lo;0;L;;;;;N;;;;; +11D7B;GUNJALA GONDI LETTER CA;Lo;0;L;;;;;N;;;;; +11D7C;GUNJALA GONDI LETTER CHA;Lo;0;L;;;;;N;;;;; +11D7D;GUNJALA GONDI LETTER TTA;Lo;0;L;;;;;N;;;;; +11D7E;GUNJALA GONDI LETTER TTHA;Lo;0;L;;;;;N;;;;; +11D7F;GUNJALA GONDI LETTER LLA;Lo;0;L;;;;;N;;;;; +11D80;GUNJALA GONDI LETTER JA;Lo;0;L;;;;;N;;;;; +11D81;GUNJALA GONDI LETTER JHA;Lo;0;L;;;;;N;;;;; +11D82;GUNJALA GONDI LETTER DDA;Lo;0;L;;;;;N;;;;; +11D83;GUNJALA GONDI LETTER DDHA;Lo;0;L;;;;;N;;;;; +11D84;GUNJALA GONDI LETTER NGA;Lo;0;L;;;;;N;;;;; +11D85;GUNJALA GONDI LETTER PA;Lo;0;L;;;;;N;;;;; +11D86;GUNJALA GONDI LETTER PHA;Lo;0;L;;;;;N;;;;; +11D87;GUNJALA GONDI LETTER HA;Lo;0;L;;;;;N;;;;; +11D88;GUNJALA GONDI LETTER RA;Lo;0;L;;;;;N;;;;; +11D89;GUNJALA GONDI LETTER SA;Lo;0;L;;;;;N;;;;; +11D8A;GUNJALA GONDI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +11D8B;GUNJALA GONDI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +11D8C;GUNJALA GONDI VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +11D8D;GUNJALA GONDI VOWEL SIGN U;Mc;0;L;;;;;N;;;;; +11D8E;GUNJALA GONDI VOWEL SIGN UU;Mc;0;L;;;;;N;;;;; +11D90;GUNJALA GONDI VOWEL SIGN EE;Mn;0;NSM;;;;;N;;;;; +11D91;GUNJALA GONDI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +11D93;GUNJALA GONDI VOWEL SIGN OO;Mc;0;L;;;;;N;;;;; +11D94;GUNJALA GONDI VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; +11D95;GUNJALA GONDI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +11D96;GUNJALA GONDI SIGN VISARGA;Mc;0;L;;;;;N;;;;; +11D97;GUNJALA GONDI VIRAMA;Mn;9;NSM;;;;;N;;;;; +11D98;GUNJALA GONDI OM;Lo;0;L;;;;;N;;;;; +11DA0;GUNJALA GONDI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +11DA1;GUNJALA GONDI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +11DA2;GUNJALA GONDI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +11DA3;GUNJALA GONDI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +11DA4;GUNJALA GONDI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +11DA5;GUNJALA GONDI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +11DA6;GUNJALA GONDI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +11DA7;GUNJALA GONDI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +11DA8;GUNJALA GONDI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +11DA9;GUNJALA GONDI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +11EE0;MAKASAR LETTER KA;Lo;0;L;;;;;N;;;;; +11EE1;MAKASAR LETTER GA;Lo;0;L;;;;;N;;;;; +11EE2;MAKASAR LETTER NGA;Lo;0;L;;;;;N;;;;; +11EE3;MAKASAR LETTER PA;Lo;0;L;;;;;N;;;;; +11EE4;MAKASAR LETTER BA;Lo;0;L;;;;;N;;;;; +11EE5;MAKASAR LETTER MA;Lo;0;L;;;;;N;;;;; +11EE6;MAKASAR LETTER TA;Lo;0;L;;;;;N;;;;; +11EE7;MAKASAR LETTER DA;Lo;0;L;;;;;N;;;;; +11EE8;MAKASAR LETTER NA;Lo;0;L;;;;;N;;;;; +11EE9;MAKASAR LETTER CA;Lo;0;L;;;;;N;;;;; +11EEA;MAKASAR LETTER JA;Lo;0;L;;;;;N;;;;; +11EEB;MAKASAR LETTER NYA;Lo;0;L;;;;;N;;;;; +11EEC;MAKASAR LETTER YA;Lo;0;L;;;;;N;;;;; +11EED;MAKASAR LETTER RA;Lo;0;L;;;;;N;;;;; +11EEE;MAKASAR LETTER LA;Lo;0;L;;;;;N;;;;; +11EEF;MAKASAR LETTER VA;Lo;0;L;;;;;N;;;;; +11EF0;MAKASAR LETTER SA;Lo;0;L;;;;;N;;;;; +11EF1;MAKASAR LETTER A;Lo;0;L;;;;;N;;;;; +11EF2;MAKASAR ANGKA;Lo;0;L;;;;;N;;;;; +11EF3;MAKASAR VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +11EF4;MAKASAR VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +11EF5;MAKASAR VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +11EF6;MAKASAR VOWEL SIGN O;Mc;0;L;;;;;N;;;;; +11EF7;MAKASAR PASSIMBANG;Po;0;L;;;;;N;;;;; +11EF8;MAKASAR END OF SECTION;Po;0;L;;;;;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;;;;; +12003;CUNEIFORM SIGN A TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; +12004;CUNEIFORM SIGN A TIMES HA;Lo;0;L;;;;;N;;;;; +12005;CUNEIFORM SIGN A TIMES IGI;Lo;0;L;;;;;N;;;;; +12006;CUNEIFORM SIGN A TIMES LAGAR GUNU;Lo;0;L;;;;;N;;;;; +12007;CUNEIFORM SIGN A TIMES MUSH;Lo;0;L;;;;;N;;;;; +12008;CUNEIFORM SIGN A TIMES SAG;Lo;0;L;;;;;N;;;;; +12009;CUNEIFORM SIGN A2;Lo;0;L;;;;;N;;;;; +1200A;CUNEIFORM SIGN AB;Lo;0;L;;;;;N;;;;; +1200B;CUNEIFORM SIGN AB TIMES ASH2;Lo;0;L;;;;;N;;;;; +1200C;CUNEIFORM SIGN AB TIMES DUN3 GUNU;Lo;0;L;;;;;N;;;;; +1200D;CUNEIFORM SIGN AB TIMES GAL;Lo;0;L;;;;;N;;;;; +1200E;CUNEIFORM SIGN AB TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; +1200F;CUNEIFORM SIGN AB TIMES HA;Lo;0;L;;;;;N;;;;; +12010;CUNEIFORM SIGN AB TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +12011;CUNEIFORM SIGN AB TIMES IMIN;Lo;0;L;;;;;N;;;;; +12012;CUNEIFORM SIGN AB TIMES LAGAB;Lo;0;L;;;;;N;;;;; +12013;CUNEIFORM SIGN AB TIMES SHESH;Lo;0;L;;;;;N;;;;; +12014;CUNEIFORM SIGN AB TIMES U PLUS U PLUS U;Lo;0;L;;;;;N;;;;; +12015;CUNEIFORM SIGN AB GUNU;Lo;0;L;;;;;N;;;;; +12016;CUNEIFORM SIGN AB2;Lo;0;L;;;;;N;;;;; +12017;CUNEIFORM SIGN AB2 TIMES BALAG;Lo;0;L;;;;;N;;;;; +12018;CUNEIFORM SIGN AB2 TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; +12019;CUNEIFORM SIGN AB2 TIMES ME PLUS EN;Lo;0;L;;;;;N;;;;; +1201A;CUNEIFORM SIGN AB2 TIMES SHA3;Lo;0;L;;;;;N;;;;; +1201B;CUNEIFORM SIGN AB2 TIMES TAK4;Lo;0;L;;;;;N;;;;; +1201C;CUNEIFORM SIGN AD;Lo;0;L;;;;;N;;;;; +1201D;CUNEIFORM SIGN AK;Lo;0;L;;;;;N;;;;; +1201E;CUNEIFORM SIGN AK TIMES ERIN2;Lo;0;L;;;;;N;;;;; +1201F;CUNEIFORM SIGN AK TIMES SHITA PLUS GISH;Lo;0;L;;;;;N;;;;; +12020;CUNEIFORM SIGN AL;Lo;0;L;;;;;N;;;;; +12021;CUNEIFORM SIGN AL TIMES AL;Lo;0;L;;;;;N;;;;; +12022;CUNEIFORM SIGN AL TIMES DIM2;Lo;0;L;;;;;N;;;;; +12023;CUNEIFORM SIGN AL TIMES GISH;Lo;0;L;;;;;N;;;;; +12024;CUNEIFORM SIGN AL TIMES HA;Lo;0;L;;;;;N;;;;; +12025;CUNEIFORM SIGN AL TIMES KAD3;Lo;0;L;;;;;N;;;;; +12026;CUNEIFORM SIGN AL TIMES KI;Lo;0;L;;;;;N;;;;; +12027;CUNEIFORM SIGN AL TIMES SHE;Lo;0;L;;;;;N;;;;; +12028;CUNEIFORM SIGN AL TIMES USH;Lo;0;L;;;;;N;;;;; +12029;CUNEIFORM SIGN ALAN;Lo;0;L;;;;;N;;;;; +1202A;CUNEIFORM SIGN ALEPH;Lo;0;L;;;;;N;;;;; +1202B;CUNEIFORM SIGN AMAR;Lo;0;L;;;;;N;;;;; +1202C;CUNEIFORM SIGN AMAR TIMES SHE;Lo;0;L;;;;;N;;;;; +1202D;CUNEIFORM SIGN AN;Lo;0;L;;;;;N;;;;; +1202E;CUNEIFORM SIGN AN OVER AN;Lo;0;L;;;;;N;;;;; +1202F;CUNEIFORM SIGN AN THREE TIMES;Lo;0;L;;;;;N;;;;; +12030;CUNEIFORM SIGN AN PLUS NAGA OPPOSING AN PLUS NAGA;Lo;0;L;;;;;N;;;;; +12031;CUNEIFORM SIGN AN PLUS NAGA SQUARED;Lo;0;L;;;;;N;;;;; +12032;CUNEIFORM SIGN ANSHE;Lo;0;L;;;;;N;;;;; +12033;CUNEIFORM SIGN APIN;Lo;0;L;;;;;N;;;;; +12034;CUNEIFORM SIGN ARAD;Lo;0;L;;;;;N;;;;; +12035;CUNEIFORM SIGN ARAD TIMES KUR;Lo;0;L;;;;;N;;;;; +12036;CUNEIFORM SIGN ARKAB;Lo;0;L;;;;;N;;;;; +12037;CUNEIFORM SIGN ASAL2;Lo;0;L;;;;;N;;;;; +12038;CUNEIFORM SIGN ASH;Lo;0;L;;;;;N;;;;; +12039;CUNEIFORM SIGN ASH ZIDA TENU;Lo;0;L;;;;;N;;;;; +1203A;CUNEIFORM SIGN ASH KABA TENU;Lo;0;L;;;;;N;;;;; +1203B;CUNEIFORM SIGN ASH OVER ASH TUG2 OVER TUG2 TUG2 OVER TUG2 PAP;Lo;0;L;;;;;N;;;;; +1203C;CUNEIFORM SIGN ASH OVER ASH OVER ASH;Lo;0;L;;;;;N;;;;; +1203D;CUNEIFORM SIGN ASH OVER ASH OVER ASH CROSSING ASH OVER ASH OVER ASH;Lo;0;L;;;;;N;;;;; +1203E;CUNEIFORM SIGN ASH2;Lo;0;L;;;;;N;;;;; +1203F;CUNEIFORM SIGN ASHGAB;Lo;0;L;;;;;N;;;;; +12040;CUNEIFORM SIGN BA;Lo;0;L;;;;;N;;;;; +12041;CUNEIFORM SIGN BAD;Lo;0;L;;;;;N;;;;; +12042;CUNEIFORM SIGN BAG3;Lo;0;L;;;;;N;;;;; +12043;CUNEIFORM SIGN BAHAR2;Lo;0;L;;;;;N;;;;; +12044;CUNEIFORM SIGN BAL;Lo;0;L;;;;;N;;;;; +12045;CUNEIFORM SIGN BAL OVER BAL;Lo;0;L;;;;;N;;;;; +12046;CUNEIFORM SIGN BALAG;Lo;0;L;;;;;N;;;;; +12047;CUNEIFORM SIGN BAR;Lo;0;L;;;;;N;;;;; +12048;CUNEIFORM SIGN BARA2;Lo;0;L;;;;;N;;;;; +12049;CUNEIFORM SIGN BI;Lo;0;L;;;;;N;;;;; +1204A;CUNEIFORM SIGN BI TIMES A;Lo;0;L;;;;;N;;;;; +1204B;CUNEIFORM SIGN BI TIMES GAR;Lo;0;L;;;;;N;;;;; +1204C;CUNEIFORM SIGN BI TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +1204D;CUNEIFORM SIGN BU;Lo;0;L;;;;;N;;;;; +1204E;CUNEIFORM SIGN BU OVER BU AB;Lo;0;L;;;;;N;;;;; +1204F;CUNEIFORM SIGN BU OVER BU UN;Lo;0;L;;;;;N;;;;; +12050;CUNEIFORM SIGN BU CROSSING BU;Lo;0;L;;;;;N;;;;; +12051;CUNEIFORM SIGN BULUG;Lo;0;L;;;;;N;;;;; +12052;CUNEIFORM SIGN BULUG OVER BULUG;Lo;0;L;;;;;N;;;;; +12053;CUNEIFORM SIGN BUR;Lo;0;L;;;;;N;;;;; +12054;CUNEIFORM SIGN BUR2;Lo;0;L;;;;;N;;;;; +12055;CUNEIFORM SIGN DA;Lo;0;L;;;;;N;;;;; +12056;CUNEIFORM SIGN DAG;Lo;0;L;;;;;N;;;;; +12057;CUNEIFORM SIGN DAG KISIM5 TIMES A PLUS MASH;Lo;0;L;;;;;N;;;;; +12058;CUNEIFORM SIGN DAG KISIM5 TIMES AMAR;Lo;0;L;;;;;N;;;;; +12059;CUNEIFORM SIGN DAG KISIM5 TIMES BALAG;Lo;0;L;;;;;N;;;;; +1205A;CUNEIFORM SIGN DAG KISIM5 TIMES BI;Lo;0;L;;;;;N;;;;; +1205B;CUNEIFORM SIGN DAG KISIM5 TIMES GA;Lo;0;L;;;;;N;;;;; +1205C;CUNEIFORM SIGN DAG KISIM5 TIMES GA PLUS MASH;Lo;0;L;;;;;N;;;;; +1205D;CUNEIFORM SIGN DAG KISIM5 TIMES GI;Lo;0;L;;;;;N;;;;; +1205E;CUNEIFORM SIGN DAG KISIM5 TIMES GIR2;Lo;0;L;;;;;N;;;;; +1205F;CUNEIFORM SIGN DAG KISIM5 TIMES GUD;Lo;0;L;;;;;N;;;;; +12060;CUNEIFORM SIGN DAG KISIM5 TIMES HA;Lo;0;L;;;;;N;;;;; +12061;CUNEIFORM SIGN DAG KISIM5 TIMES IR;Lo;0;L;;;;;N;;;;; +12062;CUNEIFORM SIGN DAG KISIM5 TIMES IR PLUS LU;Lo;0;L;;;;;N;;;;; +12063;CUNEIFORM SIGN DAG KISIM5 TIMES KAK;Lo;0;L;;;;;N;;;;; +12064;CUNEIFORM SIGN DAG KISIM5 TIMES LA;Lo;0;L;;;;;N;;;;; +12065;CUNEIFORM SIGN DAG KISIM5 TIMES LU;Lo;0;L;;;;;N;;;;; +12066;CUNEIFORM SIGN DAG KISIM5 TIMES LU PLUS MASH2;Lo;0;L;;;;;N;;;;; +12067;CUNEIFORM SIGN DAG KISIM5 TIMES LUM;Lo;0;L;;;;;N;;;;; +12068;CUNEIFORM SIGN DAG KISIM5 TIMES NE;Lo;0;L;;;;;N;;;;; +12069;CUNEIFORM SIGN DAG KISIM5 TIMES PAP PLUS PAP;Lo;0;L;;;;;N;;;;; +1206A;CUNEIFORM SIGN DAG KISIM5 TIMES SI;Lo;0;L;;;;;N;;;;; +1206B;CUNEIFORM SIGN DAG KISIM5 TIMES TAK4;Lo;0;L;;;;;N;;;;; +1206C;CUNEIFORM SIGN DAG KISIM5 TIMES U2 PLUS GIR2;Lo;0;L;;;;;N;;;;; +1206D;CUNEIFORM SIGN DAG KISIM5 TIMES USH;Lo;0;L;;;;;N;;;;; +1206E;CUNEIFORM SIGN DAM;Lo;0;L;;;;;N;;;;; +1206F;CUNEIFORM SIGN DAR;Lo;0;L;;;;;N;;;;; +12070;CUNEIFORM SIGN DARA3;Lo;0;L;;;;;N;;;;; +12071;CUNEIFORM SIGN DARA4;Lo;0;L;;;;;N;;;;; +12072;CUNEIFORM SIGN DI;Lo;0;L;;;;;N;;;;; +12073;CUNEIFORM SIGN DIB;Lo;0;L;;;;;N;;;;; +12074;CUNEIFORM SIGN DIM;Lo;0;L;;;;;N;;;;; +12075;CUNEIFORM SIGN DIM TIMES SHE;Lo;0;L;;;;;N;;;;; +12076;CUNEIFORM SIGN DIM2;Lo;0;L;;;;;N;;;;; +12077;CUNEIFORM SIGN DIN;Lo;0;L;;;;;N;;;;; +12078;CUNEIFORM SIGN DIN KASKAL U GUNU DISH;Lo;0;L;;;;;N;;;;; +12079;CUNEIFORM SIGN DISH;Lo;0;L;;;;;N;;;;; +1207A;CUNEIFORM SIGN DU;Lo;0;L;;;;;N;;;;; +1207B;CUNEIFORM SIGN DU OVER DU;Lo;0;L;;;;;N;;;;; +1207C;CUNEIFORM SIGN DU GUNU;Lo;0;L;;;;;N;;;;; +1207D;CUNEIFORM SIGN DU SHESHIG;Lo;0;L;;;;;N;;;;; +1207E;CUNEIFORM SIGN DUB;Lo;0;L;;;;;N;;;;; +1207F;CUNEIFORM SIGN DUB TIMES ESH2;Lo;0;L;;;;;N;;;;; +12080;CUNEIFORM SIGN DUB2;Lo;0;L;;;;;N;;;;; +12081;CUNEIFORM SIGN DUG;Lo;0;L;;;;;N;;;;; +12082;CUNEIFORM SIGN DUGUD;Lo;0;L;;;;;N;;;;; +12083;CUNEIFORM SIGN DUH;Lo;0;L;;;;;N;;;;; +12084;CUNEIFORM SIGN DUN;Lo;0;L;;;;;N;;;;; +12085;CUNEIFORM SIGN DUN3;Lo;0;L;;;;;N;;;;; +12086;CUNEIFORM SIGN DUN3 GUNU;Lo;0;L;;;;;N;;;;; +12087;CUNEIFORM SIGN DUN3 GUNU GUNU;Lo;0;L;;;;;N;;;;; +12088;CUNEIFORM SIGN DUN4;Lo;0;L;;;;;N;;;;; +12089;CUNEIFORM SIGN DUR2;Lo;0;L;;;;;N;;;;; +1208A;CUNEIFORM SIGN E;Lo;0;L;;;;;N;;;;; +1208B;CUNEIFORM SIGN E TIMES PAP;Lo;0;L;;;;;N;;;;; +1208C;CUNEIFORM SIGN E OVER E NUN OVER NUN;Lo;0;L;;;;;N;;;;; +1208D;CUNEIFORM SIGN E2;Lo;0;L;;;;;N;;;;; +1208E;CUNEIFORM SIGN E2 TIMES A PLUS HA PLUS DA;Lo;0;L;;;;;N;;;;; +1208F;CUNEIFORM SIGN E2 TIMES GAR;Lo;0;L;;;;;N;;;;; +12090;CUNEIFORM SIGN E2 TIMES MI;Lo;0;L;;;;;N;;;;; +12091;CUNEIFORM SIGN E2 TIMES SAL;Lo;0;L;;;;;N;;;;; +12092;CUNEIFORM SIGN E2 TIMES SHE;Lo;0;L;;;;;N;;;;; +12093;CUNEIFORM SIGN E2 TIMES U;Lo;0;L;;;;;N;;;;; +12094;CUNEIFORM SIGN EDIN;Lo;0;L;;;;;N;;;;; +12095;CUNEIFORM SIGN EGIR;Lo;0;L;;;;;N;;;;; +12096;CUNEIFORM SIGN EL;Lo;0;L;;;;;N;;;;; +12097;CUNEIFORM SIGN EN;Lo;0;L;;;;;N;;;;; +12098;CUNEIFORM SIGN EN TIMES GAN2;Lo;0;L;;;;;N;;;;; +12099;CUNEIFORM SIGN EN TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; +1209A;CUNEIFORM SIGN EN TIMES ME;Lo;0;L;;;;;N;;;;; +1209B;CUNEIFORM SIGN EN CROSSING EN;Lo;0;L;;;;;N;;;;; +1209C;CUNEIFORM SIGN EN OPPOSING EN;Lo;0;L;;;;;N;;;;; +1209D;CUNEIFORM SIGN EN SQUARED;Lo;0;L;;;;;N;;;;; +1209E;CUNEIFORM SIGN EREN;Lo;0;L;;;;;N;;;;; +1209F;CUNEIFORM SIGN ERIN2;Lo;0;L;;;;;N;;;;; +120A0;CUNEIFORM SIGN ESH2;Lo;0;L;;;;;N;;;;; +120A1;CUNEIFORM SIGN EZEN;Lo;0;L;;;;;N;;;;; +120A2;CUNEIFORM SIGN EZEN TIMES A;Lo;0;L;;;;;N;;;;; +120A3;CUNEIFORM SIGN EZEN TIMES A PLUS LAL;Lo;0;L;;;;;N;;;;; +120A4;CUNEIFORM SIGN EZEN TIMES A PLUS LAL TIMES LAL;Lo;0;L;;;;;N;;;;; +120A5;CUNEIFORM SIGN EZEN TIMES AN;Lo;0;L;;;;;N;;;;; +120A6;CUNEIFORM SIGN EZEN TIMES BAD;Lo;0;L;;;;;N;;;;; +120A7;CUNEIFORM SIGN EZEN TIMES DUN3 GUNU;Lo;0;L;;;;;N;;;;; +120A8;CUNEIFORM SIGN EZEN TIMES DUN3 GUNU GUNU;Lo;0;L;;;;;N;;;;; +120A9;CUNEIFORM SIGN EZEN TIMES HA;Lo;0;L;;;;;N;;;;; +120AA;CUNEIFORM SIGN EZEN TIMES HA GUNU;Lo;0;L;;;;;N;;;;; +120AB;CUNEIFORM SIGN EZEN TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +120AC;CUNEIFORM SIGN EZEN TIMES KASKAL;Lo;0;L;;;;;N;;;;; +120AD;CUNEIFORM SIGN EZEN TIMES KASKAL SQUARED;Lo;0;L;;;;;N;;;;; +120AE;CUNEIFORM SIGN EZEN TIMES KU3;Lo;0;L;;;;;N;;;;; +120AF;CUNEIFORM SIGN EZEN TIMES LA;Lo;0;L;;;;;N;;;;; +120B0;CUNEIFORM SIGN EZEN TIMES LAL TIMES LAL;Lo;0;L;;;;;N;;;;; +120B1;CUNEIFORM SIGN EZEN TIMES LI;Lo;0;L;;;;;N;;;;; +120B2;CUNEIFORM SIGN EZEN TIMES LU;Lo;0;L;;;;;N;;;;; +120B3;CUNEIFORM SIGN EZEN TIMES U2;Lo;0;L;;;;;N;;;;; +120B4;CUNEIFORM SIGN EZEN TIMES UD;Lo;0;L;;;;;N;;;;; +120B5;CUNEIFORM SIGN GA;Lo;0;L;;;;;N;;;;; +120B6;CUNEIFORM SIGN GA GUNU;Lo;0;L;;;;;N;;;;; +120B7;CUNEIFORM SIGN GA2;Lo;0;L;;;;;N;;;;; +120B8;CUNEIFORM SIGN GA2 TIMES A PLUS DA PLUS HA;Lo;0;L;;;;;N;;;;; +120B9;CUNEIFORM SIGN GA2 TIMES A PLUS HA;Lo;0;L;;;;;N;;;;; +120BA;CUNEIFORM SIGN GA2 TIMES A PLUS IGI;Lo;0;L;;;;;N;;;;; +120BB;CUNEIFORM SIGN GA2 TIMES AB2 TENU PLUS TAB;Lo;0;L;;;;;N;;;;; +120BC;CUNEIFORM SIGN GA2 TIMES AN;Lo;0;L;;;;;N;;;;; +120BD;CUNEIFORM SIGN GA2 TIMES ASH;Lo;0;L;;;;;N;;;;; +120BE;CUNEIFORM SIGN GA2 TIMES ASH2 PLUS GAL;Lo;0;L;;;;;N;;;;; +120BF;CUNEIFORM SIGN GA2 TIMES BAD;Lo;0;L;;;;;N;;;;; +120C0;CUNEIFORM SIGN GA2 TIMES BAR PLUS RA;Lo;0;L;;;;;N;;;;; +120C1;CUNEIFORM SIGN GA2 TIMES BUR;Lo;0;L;;;;;N;;;;; +120C2;CUNEIFORM SIGN GA2 TIMES BUR PLUS RA;Lo;0;L;;;;;N;;;;; +120C3;CUNEIFORM SIGN GA2 TIMES DA;Lo;0;L;;;;;N;;;;; +120C4;CUNEIFORM SIGN GA2 TIMES DI;Lo;0;L;;;;;N;;;;; +120C5;CUNEIFORM SIGN GA2 TIMES DIM TIMES SHE;Lo;0;L;;;;;N;;;;; +120C6;CUNEIFORM SIGN GA2 TIMES DUB;Lo;0;L;;;;;N;;;;; +120C7;CUNEIFORM SIGN GA2 TIMES EL;Lo;0;L;;;;;N;;;;; +120C8;CUNEIFORM SIGN GA2 TIMES EL PLUS LA;Lo;0;L;;;;;N;;;;; +120C9;CUNEIFORM SIGN GA2 TIMES EN;Lo;0;L;;;;;N;;;;; +120CA;CUNEIFORM SIGN GA2 TIMES EN TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; +120CB;CUNEIFORM SIGN GA2 TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; +120CC;CUNEIFORM SIGN GA2 TIMES GAR;Lo;0;L;;;;;N;;;;; +120CD;CUNEIFORM SIGN GA2 TIMES GI;Lo;0;L;;;;;N;;;;; +120CE;CUNEIFORM SIGN GA2 TIMES GI4;Lo;0;L;;;;;N;;;;; +120CF;CUNEIFORM SIGN GA2 TIMES GI4 PLUS A;Lo;0;L;;;;;N;;;;; +120D0;CUNEIFORM SIGN GA2 TIMES GIR2 PLUS SU;Lo;0;L;;;;;N;;;;; +120D1;CUNEIFORM SIGN GA2 TIMES HA PLUS LU PLUS ESH2;Lo;0;L;;;;;N;;;;; +120D2;CUNEIFORM SIGN GA2 TIMES HAL;Lo;0;L;;;;;N;;;;; +120D3;CUNEIFORM SIGN GA2 TIMES HAL PLUS LA;Lo;0;L;;;;;N;;;;; +120D4;CUNEIFORM SIGN GA2 TIMES HI PLUS LI;Lo;0;L;;;;;N;;;;; +120D5;CUNEIFORM SIGN GA2 TIMES HUB2;Lo;0;L;;;;;N;;;;; +120D6;CUNEIFORM SIGN GA2 TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +120D7;CUNEIFORM SIGN GA2 TIMES ISH PLUS HU PLUS ASH;Lo;0;L;;;;;N;;;;; +120D8;CUNEIFORM SIGN GA2 TIMES KAK;Lo;0;L;;;;;N;;;;; +120D9;CUNEIFORM SIGN GA2 TIMES KASKAL;Lo;0;L;;;;;N;;;;; +120DA;CUNEIFORM SIGN GA2 TIMES KID;Lo;0;L;;;;;N;;;;; +120DB;CUNEIFORM SIGN GA2 TIMES KID PLUS LAL;Lo;0;L;;;;;N;;;;; +120DC;CUNEIFORM SIGN GA2 TIMES KU3 PLUS AN;Lo;0;L;;;;;N;;;;; +120DD;CUNEIFORM SIGN GA2 TIMES LA;Lo;0;L;;;;;N;;;;; +120DE;CUNEIFORM SIGN GA2 TIMES ME PLUS EN;Lo;0;L;;;;;N;;;;; +120DF;CUNEIFORM SIGN GA2 TIMES MI;Lo;0;L;;;;;N;;;;; +120E0;CUNEIFORM SIGN GA2 TIMES NUN;Lo;0;L;;;;;N;;;;; +120E1;CUNEIFORM SIGN GA2 TIMES NUN OVER NUN;Lo;0;L;;;;;N;;;;; +120E2;CUNEIFORM SIGN GA2 TIMES PA;Lo;0;L;;;;;N;;;;; +120E3;CUNEIFORM SIGN GA2 TIMES SAL;Lo;0;L;;;;;N;;;;; +120E4;CUNEIFORM SIGN GA2 TIMES SAR;Lo;0;L;;;;;N;;;;; +120E5;CUNEIFORM SIGN GA2 TIMES SHE;Lo;0;L;;;;;N;;;;; +120E6;CUNEIFORM SIGN GA2 TIMES SHE PLUS TUR;Lo;0;L;;;;;N;;;;; +120E7;CUNEIFORM SIGN GA2 TIMES SHID;Lo;0;L;;;;;N;;;;; +120E8;CUNEIFORM SIGN GA2 TIMES SUM;Lo;0;L;;;;;N;;;;; +120E9;CUNEIFORM SIGN GA2 TIMES TAK4;Lo;0;L;;;;;N;;;;; +120EA;CUNEIFORM SIGN GA2 TIMES U;Lo;0;L;;;;;N;;;;; +120EB;CUNEIFORM SIGN GA2 TIMES UD;Lo;0;L;;;;;N;;;;; +120EC;CUNEIFORM SIGN GA2 TIMES UD PLUS DU;Lo;0;L;;;;;N;;;;; +120ED;CUNEIFORM SIGN GA2 OVER GA2;Lo;0;L;;;;;N;;;;; +120EE;CUNEIFORM SIGN GABA;Lo;0;L;;;;;N;;;;; +120EF;CUNEIFORM SIGN GABA CROSSING GABA;Lo;0;L;;;;;N;;;;; +120F0;CUNEIFORM SIGN GAD;Lo;0;L;;;;;N;;;;; +120F1;CUNEIFORM SIGN GAD OVER GAD GAR OVER GAR;Lo;0;L;;;;;N;;;;; +120F2;CUNEIFORM SIGN GAL;Lo;0;L;;;;;N;;;;; +120F3;CUNEIFORM SIGN GAL GAD OVER GAD GAR OVER GAR;Lo;0;L;;;;;N;;;;; +120F4;CUNEIFORM SIGN GALAM;Lo;0;L;;;;;N;;;;; +120F5;CUNEIFORM SIGN GAM;Lo;0;L;;;;;N;;;;; +120F6;CUNEIFORM SIGN GAN;Lo;0;L;;;;;N;;;;; +120F7;CUNEIFORM SIGN GAN2;Lo;0;L;;;;;N;;;;; +120F8;CUNEIFORM SIGN GAN2 TENU;Lo;0;L;;;;;N;;;;; +120F9;CUNEIFORM SIGN GAN2 OVER GAN2;Lo;0;L;;;;;N;;;;; +120FA;CUNEIFORM SIGN GAN2 CROSSING GAN2;Lo;0;L;;;;;N;;;;; +120FB;CUNEIFORM SIGN GAR;Lo;0;L;;;;;N;;;;; +120FC;CUNEIFORM SIGN GAR3;Lo;0;L;;;;;N;;;;; +120FD;CUNEIFORM SIGN GASHAN;Lo;0;L;;;;;N;;;;; +120FE;CUNEIFORM SIGN GESHTIN;Lo;0;L;;;;;N;;;;; +120FF;CUNEIFORM SIGN GESHTIN TIMES KUR;Lo;0;L;;;;;N;;;;; +12100;CUNEIFORM SIGN GI;Lo;0;L;;;;;N;;;;; +12101;CUNEIFORM SIGN GI TIMES E;Lo;0;L;;;;;N;;;;; +12102;CUNEIFORM SIGN GI TIMES U;Lo;0;L;;;;;N;;;;; +12103;CUNEIFORM SIGN GI CROSSING GI;Lo;0;L;;;;;N;;;;; +12104;CUNEIFORM SIGN GI4;Lo;0;L;;;;;N;;;;; +12105;CUNEIFORM SIGN GI4 OVER GI4;Lo;0;L;;;;;N;;;;; +12106;CUNEIFORM SIGN GI4 CROSSING GI4;Lo;0;L;;;;;N;;;;; +12107;CUNEIFORM SIGN GIDIM;Lo;0;L;;;;;N;;;;; +12108;CUNEIFORM SIGN GIR2;Lo;0;L;;;;;N;;;;; +12109;CUNEIFORM SIGN GIR2 GUNU;Lo;0;L;;;;;N;;;;; +1210A;CUNEIFORM SIGN GIR3;Lo;0;L;;;;;N;;;;; +1210B;CUNEIFORM SIGN GIR3 TIMES A PLUS IGI;Lo;0;L;;;;;N;;;;; +1210C;CUNEIFORM SIGN GIR3 TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; +1210D;CUNEIFORM SIGN GIR3 TIMES IGI;Lo;0;L;;;;;N;;;;; +1210E;CUNEIFORM SIGN GIR3 TIMES LU PLUS IGI;Lo;0;L;;;;;N;;;;; +1210F;CUNEIFORM SIGN GIR3 TIMES PA;Lo;0;L;;;;;N;;;;; +12110;CUNEIFORM SIGN GISAL;Lo;0;L;;;;;N;;;;; +12111;CUNEIFORM SIGN GISH;Lo;0;L;;;;;N;;;;; +12112;CUNEIFORM SIGN GISH CROSSING GISH;Lo;0;L;;;;;N;;;;; +12113;CUNEIFORM SIGN GISH TIMES BAD;Lo;0;L;;;;;N;;;;; +12114;CUNEIFORM SIGN GISH TIMES TAK4;Lo;0;L;;;;;N;;;;; +12115;CUNEIFORM SIGN GISH TENU;Lo;0;L;;;;;N;;;;; +12116;CUNEIFORM SIGN GU;Lo;0;L;;;;;N;;;;; +12117;CUNEIFORM SIGN GU CROSSING GU;Lo;0;L;;;;;N;;;;; +12118;CUNEIFORM SIGN GU2;Lo;0;L;;;;;N;;;;; +12119;CUNEIFORM SIGN GU2 TIMES KAK;Lo;0;L;;;;;N;;;;; +1211A;CUNEIFORM SIGN GU2 TIMES KAK TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +1211B;CUNEIFORM SIGN GU2 TIMES NUN;Lo;0;L;;;;;N;;;;; +1211C;CUNEIFORM SIGN GU2 TIMES SAL PLUS TUG2;Lo;0;L;;;;;N;;;;; +1211D;CUNEIFORM SIGN GU2 GUNU;Lo;0;L;;;;;N;;;;; +1211E;CUNEIFORM SIGN GUD;Lo;0;L;;;;;N;;;;; +1211F;CUNEIFORM SIGN GUD TIMES A PLUS KUR;Lo;0;L;;;;;N;;;;; +12120;CUNEIFORM SIGN GUD TIMES KUR;Lo;0;L;;;;;N;;;;; +12121;CUNEIFORM SIGN GUD OVER GUD LUGAL;Lo;0;L;;;;;N;;;;; +12122;CUNEIFORM SIGN GUL;Lo;0;L;;;;;N;;;;; +12123;CUNEIFORM SIGN GUM;Lo;0;L;;;;;N;;;;; +12124;CUNEIFORM SIGN GUM TIMES SHE;Lo;0;L;;;;;N;;;;; +12125;CUNEIFORM SIGN GUR;Lo;0;L;;;;;N;;;;; +12126;CUNEIFORM SIGN GUR7;Lo;0;L;;;;;N;;;;; +12127;CUNEIFORM SIGN GURUN;Lo;0;L;;;;;N;;;;; +12128;CUNEIFORM SIGN GURUSH;Lo;0;L;;;;;N;;;;; +12129;CUNEIFORM SIGN HA;Lo;0;L;;;;;N;;;;; +1212A;CUNEIFORM SIGN HA TENU;Lo;0;L;;;;;N;;;;; +1212B;CUNEIFORM SIGN HA GUNU;Lo;0;L;;;;;N;;;;; +1212C;CUNEIFORM SIGN HAL;Lo;0;L;;;;;N;;;;; +1212D;CUNEIFORM SIGN HI;Lo;0;L;;;;;N;;;;; +1212E;CUNEIFORM SIGN HI TIMES ASH;Lo;0;L;;;;;N;;;;; +1212F;CUNEIFORM SIGN HI TIMES ASH2;Lo;0;L;;;;;N;;;;; +12130;CUNEIFORM SIGN HI TIMES BAD;Lo;0;L;;;;;N;;;;; +12131;CUNEIFORM SIGN HI TIMES DISH;Lo;0;L;;;;;N;;;;; +12132;CUNEIFORM SIGN HI TIMES GAD;Lo;0;L;;;;;N;;;;; +12133;CUNEIFORM SIGN HI TIMES KIN;Lo;0;L;;;;;N;;;;; +12134;CUNEIFORM SIGN HI TIMES NUN;Lo;0;L;;;;;N;;;;; +12135;CUNEIFORM SIGN HI TIMES SHE;Lo;0;L;;;;;N;;;;; +12136;CUNEIFORM SIGN HI TIMES U;Lo;0;L;;;;;N;;;;; +12137;CUNEIFORM SIGN HU;Lo;0;L;;;;;N;;;;; +12138;CUNEIFORM SIGN HUB2;Lo;0;L;;;;;N;;;;; +12139;CUNEIFORM SIGN HUB2 TIMES AN;Lo;0;L;;;;;N;;;;; +1213A;CUNEIFORM SIGN HUB2 TIMES HAL;Lo;0;L;;;;;N;;;;; +1213B;CUNEIFORM SIGN HUB2 TIMES KASKAL;Lo;0;L;;;;;N;;;;; +1213C;CUNEIFORM SIGN HUB2 TIMES LISH;Lo;0;L;;;;;N;;;;; +1213D;CUNEIFORM SIGN HUB2 TIMES UD;Lo;0;L;;;;;N;;;;; +1213E;CUNEIFORM SIGN HUL2;Lo;0;L;;;;;N;;;;; +1213F;CUNEIFORM SIGN I;Lo;0;L;;;;;N;;;;; +12140;CUNEIFORM SIGN I A;Lo;0;L;;;;;N;;;;; +12141;CUNEIFORM SIGN IB;Lo;0;L;;;;;N;;;;; +12142;CUNEIFORM SIGN IDIM;Lo;0;L;;;;;N;;;;; +12143;CUNEIFORM SIGN IDIM OVER IDIM BUR;Lo;0;L;;;;;N;;;;; +12144;CUNEIFORM SIGN IDIM OVER IDIM SQUARED;Lo;0;L;;;;;N;;;;; +12145;CUNEIFORM SIGN IG;Lo;0;L;;;;;N;;;;; +12146;CUNEIFORM SIGN IGI;Lo;0;L;;;;;N;;;;; +12147;CUNEIFORM SIGN IGI DIB;Lo;0;L;;;;;N;;;;; +12148;CUNEIFORM SIGN IGI RI;Lo;0;L;;;;;N;;;;; +12149;CUNEIFORM SIGN IGI OVER IGI SHIR OVER SHIR UD OVER UD;Lo;0;L;;;;;N;;;;; +1214A;CUNEIFORM SIGN IGI GUNU;Lo;0;L;;;;;N;;;;; +1214B;CUNEIFORM SIGN IL;Lo;0;L;;;;;N;;;;; +1214C;CUNEIFORM SIGN IL TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; +1214D;CUNEIFORM SIGN IL2;Lo;0;L;;;;;N;;;;; +1214E;CUNEIFORM SIGN IM;Lo;0;L;;;;;N;;;;; +1214F;CUNEIFORM SIGN IM TIMES TAK4;Lo;0;L;;;;;N;;;;; +12150;CUNEIFORM SIGN IM CROSSING IM;Lo;0;L;;;;;N;;;;; +12151;CUNEIFORM SIGN IM OPPOSING IM;Lo;0;L;;;;;N;;;;; +12152;CUNEIFORM SIGN IM SQUARED;Lo;0;L;;;;;N;;;;; +12153;CUNEIFORM SIGN IMIN;Lo;0;L;;;;;N;;;;; +12154;CUNEIFORM SIGN IN;Lo;0;L;;;;;N;;;;; +12155;CUNEIFORM SIGN IR;Lo;0;L;;;;;N;;;;; +12156;CUNEIFORM SIGN ISH;Lo;0;L;;;;;N;;;;; +12157;CUNEIFORM SIGN KA;Lo;0;L;;;;;N;;;;; +12158;CUNEIFORM SIGN KA TIMES A;Lo;0;L;;;;;N;;;;; +12159;CUNEIFORM SIGN KA TIMES AD;Lo;0;L;;;;;N;;;;; +1215A;CUNEIFORM SIGN KA TIMES AD PLUS KU3;Lo;0;L;;;;;N;;;;; +1215B;CUNEIFORM SIGN KA TIMES ASH2;Lo;0;L;;;;;N;;;;; +1215C;CUNEIFORM SIGN KA TIMES BAD;Lo;0;L;;;;;N;;;;; +1215D;CUNEIFORM SIGN KA TIMES BALAG;Lo;0;L;;;;;N;;;;; +1215E;CUNEIFORM SIGN KA TIMES BAR;Lo;0;L;;;;;N;;;;; +1215F;CUNEIFORM SIGN KA TIMES BI;Lo;0;L;;;;;N;;;;; +12160;CUNEIFORM SIGN KA TIMES ERIN2;Lo;0;L;;;;;N;;;;; +12161;CUNEIFORM SIGN KA TIMES ESH2;Lo;0;L;;;;;N;;;;; +12162;CUNEIFORM SIGN KA TIMES GA;Lo;0;L;;;;;N;;;;; +12163;CUNEIFORM SIGN KA TIMES GAL;Lo;0;L;;;;;N;;;;; +12164;CUNEIFORM SIGN KA TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; +12165;CUNEIFORM SIGN KA TIMES GAR;Lo;0;L;;;;;N;;;;; +12166;CUNEIFORM SIGN KA TIMES GAR PLUS SHA3 PLUS A;Lo;0;L;;;;;N;;;;; +12167;CUNEIFORM SIGN KA TIMES GI;Lo;0;L;;;;;N;;;;; +12168;CUNEIFORM SIGN KA TIMES GIR2;Lo;0;L;;;;;N;;;;; +12169;CUNEIFORM SIGN KA TIMES GISH PLUS SAR;Lo;0;L;;;;;N;;;;; +1216A;CUNEIFORM SIGN KA TIMES GISH CROSSING GISH;Lo;0;L;;;;;N;;;;; +1216B;CUNEIFORM SIGN KA TIMES GU;Lo;0;L;;;;;N;;;;; +1216C;CUNEIFORM SIGN KA TIMES GUR7;Lo;0;L;;;;;N;;;;; +1216D;CUNEIFORM SIGN KA TIMES IGI;Lo;0;L;;;;;N;;;;; +1216E;CUNEIFORM SIGN KA TIMES IM;Lo;0;L;;;;;N;;;;; +1216F;CUNEIFORM SIGN KA TIMES KAK;Lo;0;L;;;;;N;;;;; +12170;CUNEIFORM SIGN KA TIMES KI;Lo;0;L;;;;;N;;;;; +12171;CUNEIFORM SIGN KA TIMES KID;Lo;0;L;;;;;N;;;;; +12172;CUNEIFORM SIGN KA TIMES LI;Lo;0;L;;;;;N;;;;; +12173;CUNEIFORM SIGN KA TIMES LU;Lo;0;L;;;;;N;;;;; +12174;CUNEIFORM SIGN KA TIMES ME;Lo;0;L;;;;;N;;;;; +12175;CUNEIFORM SIGN KA TIMES ME PLUS DU;Lo;0;L;;;;;N;;;;; +12176;CUNEIFORM SIGN KA TIMES ME PLUS GI;Lo;0;L;;;;;N;;;;; +12177;CUNEIFORM SIGN KA TIMES ME PLUS TE;Lo;0;L;;;;;N;;;;; +12178;CUNEIFORM SIGN KA TIMES MI;Lo;0;L;;;;;N;;;;; +12179;CUNEIFORM SIGN KA TIMES MI PLUS NUNUZ;Lo;0;L;;;;;N;;;;; +1217A;CUNEIFORM SIGN KA TIMES NE;Lo;0;L;;;;;N;;;;; +1217B;CUNEIFORM SIGN KA TIMES NUN;Lo;0;L;;;;;N;;;;; +1217C;CUNEIFORM SIGN KA TIMES PI;Lo;0;L;;;;;N;;;;; +1217D;CUNEIFORM SIGN KA TIMES RU;Lo;0;L;;;;;N;;;;; +1217E;CUNEIFORM SIGN KA TIMES SA;Lo;0;L;;;;;N;;;;; +1217F;CUNEIFORM SIGN KA TIMES SAR;Lo;0;L;;;;;N;;;;; +12180;CUNEIFORM SIGN KA TIMES SHA;Lo;0;L;;;;;N;;;;; +12181;CUNEIFORM SIGN KA TIMES SHE;Lo;0;L;;;;;N;;;;; +12182;CUNEIFORM SIGN KA TIMES SHID;Lo;0;L;;;;;N;;;;; +12183;CUNEIFORM SIGN KA TIMES SHU;Lo;0;L;;;;;N;;;;; +12184;CUNEIFORM SIGN KA TIMES SIG;Lo;0;L;;;;;N;;;;; +12185;CUNEIFORM SIGN KA TIMES SUHUR;Lo;0;L;;;;;N;;;;; +12186;CUNEIFORM SIGN KA TIMES TAR;Lo;0;L;;;;;N;;;;; +12187;CUNEIFORM SIGN KA TIMES U;Lo;0;L;;;;;N;;;;; +12188;CUNEIFORM SIGN KA TIMES U2;Lo;0;L;;;;;N;;;;; +12189;CUNEIFORM SIGN KA TIMES UD;Lo;0;L;;;;;N;;;;; +1218A;CUNEIFORM SIGN KA TIMES UMUM TIMES PA;Lo;0;L;;;;;N;;;;; +1218B;CUNEIFORM SIGN KA TIMES USH;Lo;0;L;;;;;N;;;;; +1218C;CUNEIFORM SIGN KA TIMES ZI;Lo;0;L;;;;;N;;;;; +1218D;CUNEIFORM SIGN KA2;Lo;0;L;;;;;N;;;;; +1218E;CUNEIFORM SIGN KA2 CROSSING KA2;Lo;0;L;;;;;N;;;;; +1218F;CUNEIFORM SIGN KAB;Lo;0;L;;;;;N;;;;; +12190;CUNEIFORM SIGN KAD2;Lo;0;L;;;;;N;;;;; +12191;CUNEIFORM SIGN KAD3;Lo;0;L;;;;;N;;;;; +12192;CUNEIFORM SIGN KAD4;Lo;0;L;;;;;N;;;;; +12193;CUNEIFORM SIGN KAD5;Lo;0;L;;;;;N;;;;; +12194;CUNEIFORM SIGN KAD5 OVER KAD5;Lo;0;L;;;;;N;;;;; +12195;CUNEIFORM SIGN KAK;Lo;0;L;;;;;N;;;;; +12196;CUNEIFORM SIGN KAK TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +12197;CUNEIFORM SIGN KAL;Lo;0;L;;;;;N;;;;; +12198;CUNEIFORM SIGN KAL TIMES BAD;Lo;0;L;;;;;N;;;;; +12199;CUNEIFORM SIGN KAL CROSSING KAL;Lo;0;L;;;;;N;;;;; +1219A;CUNEIFORM SIGN KAM2;Lo;0;L;;;;;N;;;;; +1219B;CUNEIFORM SIGN KAM4;Lo;0;L;;;;;N;;;;; +1219C;CUNEIFORM SIGN KASKAL;Lo;0;L;;;;;N;;;;; +1219D;CUNEIFORM SIGN KASKAL LAGAB TIMES U OVER LAGAB TIMES U;Lo;0;L;;;;;N;;;;; +1219E;CUNEIFORM SIGN KASKAL OVER KASKAL LAGAB TIMES U OVER LAGAB TIMES U;Lo;0;L;;;;;N;;;;; +1219F;CUNEIFORM SIGN KESH2;Lo;0;L;;;;;N;;;;; +121A0;CUNEIFORM SIGN KI;Lo;0;L;;;;;N;;;;; +121A1;CUNEIFORM SIGN KI TIMES BAD;Lo;0;L;;;;;N;;;;; +121A2;CUNEIFORM SIGN KI TIMES U;Lo;0;L;;;;;N;;;;; +121A3;CUNEIFORM SIGN KI TIMES UD;Lo;0;L;;;;;N;;;;; +121A4;CUNEIFORM SIGN KID;Lo;0;L;;;;;N;;;;; +121A5;CUNEIFORM SIGN KIN;Lo;0;L;;;;;N;;;;; +121A6;CUNEIFORM SIGN KISAL;Lo;0;L;;;;;N;;;;; +121A7;CUNEIFORM SIGN KISH;Lo;0;L;;;;;N;;;;; +121A8;CUNEIFORM SIGN KISIM5;Lo;0;L;;;;;N;;;;; +121A9;CUNEIFORM SIGN KISIM5 OVER KISIM5;Lo;0;L;;;;;N;;;;; +121AA;CUNEIFORM SIGN KU;Lo;0;L;;;;;N;;;;; +121AB;CUNEIFORM SIGN KU OVER HI TIMES ASH2 KU OVER HI TIMES ASH2;Lo;0;L;;;;;N;;;;; +121AC;CUNEIFORM SIGN KU3;Lo;0;L;;;;;N;;;;; +121AD;CUNEIFORM SIGN KU4;Lo;0;L;;;;;N;;;;; +121AE;CUNEIFORM SIGN KU4 VARIANT FORM;Lo;0;L;;;;;N;;;;; +121AF;CUNEIFORM SIGN KU7;Lo;0;L;;;;;N;;;;; +121B0;CUNEIFORM SIGN KUL;Lo;0;L;;;;;N;;;;; +121B1;CUNEIFORM SIGN KUL GUNU;Lo;0;L;;;;;N;;;;; +121B2;CUNEIFORM SIGN KUN;Lo;0;L;;;;;N;;;;; +121B3;CUNEIFORM SIGN KUR;Lo;0;L;;;;;N;;;;; +121B4;CUNEIFORM SIGN KUR OPPOSING KUR;Lo;0;L;;;;;N;;;;; +121B5;CUNEIFORM SIGN KUSHU2;Lo;0;L;;;;;N;;;;; +121B6;CUNEIFORM SIGN KWU318;Lo;0;L;;;;;N;;;;; +121B7;CUNEIFORM SIGN LA;Lo;0;L;;;;;N;;;;; +121B8;CUNEIFORM SIGN LAGAB;Lo;0;L;;;;;N;;;;; +121B9;CUNEIFORM SIGN LAGAB TIMES A;Lo;0;L;;;;;N;;;;; +121BA;CUNEIFORM SIGN LAGAB TIMES A PLUS DA PLUS HA;Lo;0;L;;;;;N;;;;; +121BB;CUNEIFORM SIGN LAGAB TIMES A PLUS GAR;Lo;0;L;;;;;N;;;;; +121BC;CUNEIFORM SIGN LAGAB TIMES A PLUS LAL;Lo;0;L;;;;;N;;;;; +121BD;CUNEIFORM SIGN LAGAB TIMES AL;Lo;0;L;;;;;N;;;;; +121BE;CUNEIFORM SIGN LAGAB TIMES AN;Lo;0;L;;;;;N;;;;; +121BF;CUNEIFORM SIGN LAGAB TIMES ASH ZIDA TENU;Lo;0;L;;;;;N;;;;; +121C0;CUNEIFORM SIGN LAGAB TIMES BAD;Lo;0;L;;;;;N;;;;; +121C1;CUNEIFORM SIGN LAGAB TIMES BI;Lo;0;L;;;;;N;;;;; +121C2;CUNEIFORM SIGN LAGAB TIMES DAR;Lo;0;L;;;;;N;;;;; +121C3;CUNEIFORM SIGN LAGAB TIMES EN;Lo;0;L;;;;;N;;;;; +121C4;CUNEIFORM SIGN LAGAB TIMES GA;Lo;0;L;;;;;N;;;;; +121C5;CUNEIFORM SIGN LAGAB TIMES GAR;Lo;0;L;;;;;N;;;;; +121C6;CUNEIFORM SIGN LAGAB TIMES GUD;Lo;0;L;;;;;N;;;;; +121C7;CUNEIFORM SIGN LAGAB TIMES GUD PLUS GUD;Lo;0;L;;;;;N;;;;; +121C8;CUNEIFORM SIGN LAGAB TIMES HA;Lo;0;L;;;;;N;;;;; +121C9;CUNEIFORM SIGN LAGAB TIMES HAL;Lo;0;L;;;;;N;;;;; +121CA;CUNEIFORM SIGN LAGAB TIMES HI TIMES NUN;Lo;0;L;;;;;N;;;;; +121CB;CUNEIFORM SIGN LAGAB TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +121CC;CUNEIFORM SIGN LAGAB TIMES IM;Lo;0;L;;;;;N;;;;; +121CD;CUNEIFORM SIGN LAGAB TIMES IM PLUS HA;Lo;0;L;;;;;N;;;;; +121CE;CUNEIFORM SIGN LAGAB TIMES IM PLUS LU;Lo;0;L;;;;;N;;;;; +121CF;CUNEIFORM SIGN LAGAB TIMES KI;Lo;0;L;;;;;N;;;;; +121D0;CUNEIFORM SIGN LAGAB TIMES KIN;Lo;0;L;;;;;N;;;;; +121D1;CUNEIFORM SIGN LAGAB TIMES KU3;Lo;0;L;;;;;N;;;;; +121D2;CUNEIFORM SIGN LAGAB TIMES KUL;Lo;0;L;;;;;N;;;;; +121D3;CUNEIFORM SIGN LAGAB TIMES KUL PLUS HI PLUS A;Lo;0;L;;;;;N;;;;; +121D4;CUNEIFORM SIGN LAGAB TIMES LAGAB;Lo;0;L;;;;;N;;;;; +121D5;CUNEIFORM SIGN LAGAB TIMES LISH;Lo;0;L;;;;;N;;;;; +121D6;CUNEIFORM SIGN LAGAB TIMES LU;Lo;0;L;;;;;N;;;;; +121D7;CUNEIFORM SIGN LAGAB TIMES LUL;Lo;0;L;;;;;N;;;;; +121D8;CUNEIFORM SIGN LAGAB TIMES ME;Lo;0;L;;;;;N;;;;; +121D9;CUNEIFORM SIGN LAGAB TIMES ME PLUS EN;Lo;0;L;;;;;N;;;;; +121DA;CUNEIFORM SIGN LAGAB TIMES MUSH;Lo;0;L;;;;;N;;;;; +121DB;CUNEIFORM SIGN LAGAB TIMES NE;Lo;0;L;;;;;N;;;;; +121DC;CUNEIFORM SIGN LAGAB TIMES SHE PLUS SUM;Lo;0;L;;;;;N;;;;; +121DD;CUNEIFORM SIGN LAGAB TIMES SHITA PLUS GISH PLUS ERIN2;Lo;0;L;;;;;N;;;;; +121DE;CUNEIFORM SIGN LAGAB TIMES SHITA PLUS GISH TENU;Lo;0;L;;;;;N;;;;; +121DF;CUNEIFORM SIGN LAGAB TIMES SHU2;Lo;0;L;;;;;N;;;;; +121E0;CUNEIFORM SIGN LAGAB TIMES SHU2 PLUS SHU2;Lo;0;L;;;;;N;;;;; +121E1;CUNEIFORM SIGN LAGAB TIMES SUM;Lo;0;L;;;;;N;;;;; +121E2;CUNEIFORM SIGN LAGAB TIMES TAG;Lo;0;L;;;;;N;;;;; +121E3;CUNEIFORM SIGN LAGAB TIMES TAK4;Lo;0;L;;;;;N;;;;; +121E4;CUNEIFORM SIGN LAGAB TIMES TE PLUS A PLUS SU PLUS NA;Lo;0;L;;;;;N;;;;; +121E5;CUNEIFORM SIGN LAGAB TIMES U;Lo;0;L;;;;;N;;;;; +121E6;CUNEIFORM SIGN LAGAB TIMES U PLUS A;Lo;0;L;;;;;N;;;;; +121E7;CUNEIFORM SIGN LAGAB TIMES U PLUS U PLUS U;Lo;0;L;;;;;N;;;;; +121E8;CUNEIFORM SIGN LAGAB TIMES U2 PLUS ASH;Lo;0;L;;;;;N;;;;; +121E9;CUNEIFORM SIGN LAGAB TIMES UD;Lo;0;L;;;;;N;;;;; +121EA;CUNEIFORM SIGN LAGAB TIMES USH;Lo;0;L;;;;;N;;;;; +121EB;CUNEIFORM SIGN LAGAB SQUARED;Lo;0;L;;;;;N;;;;; +121EC;CUNEIFORM SIGN LAGAR;Lo;0;L;;;;;N;;;;; +121ED;CUNEIFORM SIGN LAGAR TIMES SHE;Lo;0;L;;;;;N;;;;; +121EE;CUNEIFORM SIGN LAGAR TIMES SHE PLUS SUM;Lo;0;L;;;;;N;;;;; +121EF;CUNEIFORM SIGN LAGAR GUNU;Lo;0;L;;;;;N;;;;; +121F0;CUNEIFORM SIGN LAGAR GUNU OVER LAGAR GUNU SHE;Lo;0;L;;;;;N;;;;; +121F1;CUNEIFORM SIGN LAHSHU;Lo;0;L;;;;;N;;;;; +121F2;CUNEIFORM SIGN LAL;Lo;0;L;;;;;N;;;;; +121F3;CUNEIFORM SIGN LAL TIMES LAL;Lo;0;L;;;;;N;;;;; +121F4;CUNEIFORM SIGN LAM;Lo;0;L;;;;;N;;;;; +121F5;CUNEIFORM SIGN LAM TIMES KUR;Lo;0;L;;;;;N;;;;; +121F6;CUNEIFORM SIGN LAM TIMES KUR PLUS RU;Lo;0;L;;;;;N;;;;; +121F7;CUNEIFORM SIGN LI;Lo;0;L;;;;;N;;;;; +121F8;CUNEIFORM SIGN LIL;Lo;0;L;;;;;N;;;;; +121F9;CUNEIFORM SIGN LIMMU2;Lo;0;L;;;;;N;;;;; +121FA;CUNEIFORM SIGN LISH;Lo;0;L;;;;;N;;;;; +121FB;CUNEIFORM SIGN LU;Lo;0;L;;;;;N;;;;; +121FC;CUNEIFORM SIGN LU TIMES BAD;Lo;0;L;;;;;N;;;;; +121FD;CUNEIFORM SIGN LU2;Lo;0;L;;;;;N;;;;; +121FE;CUNEIFORM SIGN LU2 TIMES AL;Lo;0;L;;;;;N;;;;; +121FF;CUNEIFORM SIGN LU2 TIMES BAD;Lo;0;L;;;;;N;;;;; +12200;CUNEIFORM SIGN LU2 TIMES ESH2;Lo;0;L;;;;;N;;;;; +12201;CUNEIFORM SIGN LU2 TIMES ESH2 TENU;Lo;0;L;;;;;N;;;;; +12202;CUNEIFORM SIGN LU2 TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; +12203;CUNEIFORM SIGN LU2 TIMES HI TIMES BAD;Lo;0;L;;;;;N;;;;; +12204;CUNEIFORM SIGN LU2 TIMES IM;Lo;0;L;;;;;N;;;;; +12205;CUNEIFORM SIGN LU2 TIMES KAD2;Lo;0;L;;;;;N;;;;; +12206;CUNEIFORM SIGN LU2 TIMES KAD3;Lo;0;L;;;;;N;;;;; +12207;CUNEIFORM SIGN LU2 TIMES KAD3 PLUS ASH;Lo;0;L;;;;;N;;;;; +12208;CUNEIFORM SIGN LU2 TIMES KI;Lo;0;L;;;;;N;;;;; +12209;CUNEIFORM SIGN LU2 TIMES LA PLUS ASH;Lo;0;L;;;;;N;;;;; +1220A;CUNEIFORM SIGN LU2 TIMES LAGAB;Lo;0;L;;;;;N;;;;; +1220B;CUNEIFORM SIGN LU2 TIMES ME PLUS EN;Lo;0;L;;;;;N;;;;; +1220C;CUNEIFORM SIGN LU2 TIMES NE;Lo;0;L;;;;;N;;;;; +1220D;CUNEIFORM SIGN LU2 TIMES NU;Lo;0;L;;;;;N;;;;; +1220E;CUNEIFORM SIGN LU2 TIMES SI PLUS ASH;Lo;0;L;;;;;N;;;;; +1220F;CUNEIFORM SIGN LU2 TIMES SIK2 PLUS BU;Lo;0;L;;;;;N;;;;; +12210;CUNEIFORM SIGN LU2 TIMES TUG2;Lo;0;L;;;;;N;;;;; +12211;CUNEIFORM SIGN LU2 TENU;Lo;0;L;;;;;N;;;;; +12212;CUNEIFORM SIGN LU2 CROSSING LU2;Lo;0;L;;;;;N;;;;; +12213;CUNEIFORM SIGN LU2 OPPOSING LU2;Lo;0;L;;;;;N;;;;; +12214;CUNEIFORM SIGN LU2 SQUARED;Lo;0;L;;;;;N;;;;; +12215;CUNEIFORM SIGN LU2 SHESHIG;Lo;0;L;;;;;N;;;;; +12216;CUNEIFORM SIGN LU3;Lo;0;L;;;;;N;;;;; +12217;CUNEIFORM SIGN LUGAL;Lo;0;L;;;;;N;;;;; +12218;CUNEIFORM SIGN LUGAL OVER LUGAL;Lo;0;L;;;;;N;;;;; +12219;CUNEIFORM SIGN LUGAL OPPOSING LUGAL;Lo;0;L;;;;;N;;;;; +1221A;CUNEIFORM SIGN LUGAL SHESHIG;Lo;0;L;;;;;N;;;;; +1221B;CUNEIFORM SIGN LUH;Lo;0;L;;;;;N;;;;; +1221C;CUNEIFORM SIGN LUL;Lo;0;L;;;;;N;;;;; +1221D;CUNEIFORM SIGN LUM;Lo;0;L;;;;;N;;;;; +1221E;CUNEIFORM SIGN LUM OVER LUM;Lo;0;L;;;;;N;;;;; +1221F;CUNEIFORM SIGN LUM OVER LUM GAR OVER GAR;Lo;0;L;;;;;N;;;;; +12220;CUNEIFORM SIGN MA;Lo;0;L;;;;;N;;;;; +12221;CUNEIFORM SIGN MA TIMES TAK4;Lo;0;L;;;;;N;;;;; +12222;CUNEIFORM SIGN MA GUNU;Lo;0;L;;;;;N;;;;; +12223;CUNEIFORM SIGN MA2;Lo;0;L;;;;;N;;;;; +12224;CUNEIFORM SIGN MAH;Lo;0;L;;;;;N;;;;; +12225;CUNEIFORM SIGN MAR;Lo;0;L;;;;;N;;;;; +12226;CUNEIFORM SIGN MASH;Lo;0;L;;;;;N;;;;; +12227;CUNEIFORM SIGN MASH2;Lo;0;L;;;;;N;;;;; +12228;CUNEIFORM SIGN ME;Lo;0;L;;;;;N;;;;; +12229;CUNEIFORM SIGN MES;Lo;0;L;;;;;N;;;;; +1222A;CUNEIFORM SIGN MI;Lo;0;L;;;;;N;;;;; +1222B;CUNEIFORM SIGN MIN;Lo;0;L;;;;;N;;;;; +1222C;CUNEIFORM SIGN MU;Lo;0;L;;;;;N;;;;; +1222D;CUNEIFORM SIGN MU OVER MU;Lo;0;L;;;;;N;;;;; +1222E;CUNEIFORM SIGN MUG;Lo;0;L;;;;;N;;;;; +1222F;CUNEIFORM SIGN MUG GUNU;Lo;0;L;;;;;N;;;;; +12230;CUNEIFORM SIGN MUNSUB;Lo;0;L;;;;;N;;;;; +12231;CUNEIFORM SIGN MURGU2;Lo;0;L;;;;;N;;;;; +12232;CUNEIFORM SIGN MUSH;Lo;0;L;;;;;N;;;;; +12233;CUNEIFORM SIGN MUSH TIMES A;Lo;0;L;;;;;N;;;;; +12234;CUNEIFORM SIGN MUSH TIMES KUR;Lo;0;L;;;;;N;;;;; +12235;CUNEIFORM SIGN MUSH TIMES ZA;Lo;0;L;;;;;N;;;;; +12236;CUNEIFORM SIGN MUSH OVER MUSH;Lo;0;L;;;;;N;;;;; +12237;CUNEIFORM SIGN MUSH OVER MUSH TIMES A PLUS NA;Lo;0;L;;;;;N;;;;; +12238;CUNEIFORM SIGN MUSH CROSSING MUSH;Lo;0;L;;;;;N;;;;; +12239;CUNEIFORM SIGN MUSH3;Lo;0;L;;;;;N;;;;; +1223A;CUNEIFORM SIGN MUSH3 TIMES A;Lo;0;L;;;;;N;;;;; +1223B;CUNEIFORM SIGN MUSH3 TIMES A PLUS DI;Lo;0;L;;;;;N;;;;; +1223C;CUNEIFORM SIGN MUSH3 TIMES DI;Lo;0;L;;;;;N;;;;; +1223D;CUNEIFORM SIGN MUSH3 GUNU;Lo;0;L;;;;;N;;;;; +1223E;CUNEIFORM SIGN NA;Lo;0;L;;;;;N;;;;; +1223F;CUNEIFORM SIGN NA2;Lo;0;L;;;;;N;;;;; +12240;CUNEIFORM SIGN NAGA;Lo;0;L;;;;;N;;;;; +12241;CUNEIFORM SIGN NAGA INVERTED;Lo;0;L;;;;;N;;;;; +12242;CUNEIFORM SIGN NAGA TIMES SHU TENU;Lo;0;L;;;;;N;;;;; +12243;CUNEIFORM SIGN NAGA OPPOSING NAGA;Lo;0;L;;;;;N;;;;; +12244;CUNEIFORM SIGN NAGAR;Lo;0;L;;;;;N;;;;; +12245;CUNEIFORM SIGN NAM NUTILLU;Lo;0;L;;;;;N;;;;; +12246;CUNEIFORM SIGN NAM;Lo;0;L;;;;;N;;;;; +12247;CUNEIFORM SIGN NAM2;Lo;0;L;;;;;N;;;;; +12248;CUNEIFORM SIGN NE;Lo;0;L;;;;;N;;;;; +12249;CUNEIFORM SIGN NE TIMES A;Lo;0;L;;;;;N;;;;; +1224A;CUNEIFORM SIGN NE TIMES UD;Lo;0;L;;;;;N;;;;; +1224B;CUNEIFORM SIGN NE SHESHIG;Lo;0;L;;;;;N;;;;; +1224C;CUNEIFORM SIGN NI;Lo;0;L;;;;;N;;;;; +1224D;CUNEIFORM SIGN NI TIMES E;Lo;0;L;;;;;N;;;;; +1224E;CUNEIFORM SIGN NI2;Lo;0;L;;;;;N;;;;; +1224F;CUNEIFORM SIGN NIM;Lo;0;L;;;;;N;;;;; +12250;CUNEIFORM SIGN NIM TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; +12251;CUNEIFORM SIGN NIM TIMES GAR PLUS GAN2 TENU;Lo;0;L;;;;;N;;;;; +12252;CUNEIFORM SIGN NINDA2;Lo;0;L;;;;;N;;;;; +12253;CUNEIFORM SIGN NINDA2 TIMES AN;Lo;0;L;;;;;N;;;;; +12254;CUNEIFORM SIGN NINDA2 TIMES ASH;Lo;0;L;;;;;N;;;;; +12255;CUNEIFORM SIGN NINDA2 TIMES ASH PLUS ASH;Lo;0;L;;;;;N;;;;; +12256;CUNEIFORM SIGN NINDA2 TIMES GUD;Lo;0;L;;;;;N;;;;; +12257;CUNEIFORM SIGN NINDA2 TIMES ME PLUS GAN2 TENU;Lo;0;L;;;;;N;;;;; +12258;CUNEIFORM SIGN NINDA2 TIMES NE;Lo;0;L;;;;;N;;;;; +12259;CUNEIFORM SIGN NINDA2 TIMES NUN;Lo;0;L;;;;;N;;;;; +1225A;CUNEIFORM SIGN NINDA2 TIMES SHE;Lo;0;L;;;;;N;;;;; +1225B;CUNEIFORM SIGN NINDA2 TIMES SHE PLUS A AN;Lo;0;L;;;;;N;;;;; +1225C;CUNEIFORM SIGN NINDA2 TIMES SHE PLUS ASH;Lo;0;L;;;;;N;;;;; +1225D;CUNEIFORM SIGN NINDA2 TIMES SHE PLUS ASH PLUS ASH;Lo;0;L;;;;;N;;;;; +1225E;CUNEIFORM SIGN NINDA2 TIMES U2 PLUS ASH;Lo;0;L;;;;;N;;;;; +1225F;CUNEIFORM SIGN NINDA2 TIMES USH;Lo;0;L;;;;;N;;;;; +12260;CUNEIFORM SIGN NISAG;Lo;0;L;;;;;N;;;;; +12261;CUNEIFORM SIGN NU;Lo;0;L;;;;;N;;;;; +12262;CUNEIFORM SIGN NU11;Lo;0;L;;;;;N;;;;; +12263;CUNEIFORM SIGN NUN;Lo;0;L;;;;;N;;;;; +12264;CUNEIFORM SIGN NUN LAGAR TIMES GAR;Lo;0;L;;;;;N;;;;; +12265;CUNEIFORM SIGN NUN LAGAR TIMES MASH;Lo;0;L;;;;;N;;;;; +12266;CUNEIFORM SIGN NUN LAGAR TIMES SAL;Lo;0;L;;;;;N;;;;; +12267;CUNEIFORM SIGN NUN LAGAR TIMES SAL OVER NUN LAGAR TIMES SAL;Lo;0;L;;;;;N;;;;; +12268;CUNEIFORM SIGN NUN LAGAR TIMES USH;Lo;0;L;;;;;N;;;;; +12269;CUNEIFORM SIGN NUN TENU;Lo;0;L;;;;;N;;;;; +1226A;CUNEIFORM SIGN NUN OVER NUN;Lo;0;L;;;;;N;;;;; +1226B;CUNEIFORM SIGN NUN CROSSING NUN;Lo;0;L;;;;;N;;;;; +1226C;CUNEIFORM SIGN NUN CROSSING NUN LAGAR OVER LAGAR;Lo;0;L;;;;;N;;;;; +1226D;CUNEIFORM SIGN NUNUZ;Lo;0;L;;;;;N;;;;; +1226E;CUNEIFORM SIGN NUNUZ AB2 TIMES ASHGAB;Lo;0;L;;;;;N;;;;; +1226F;CUNEIFORM SIGN NUNUZ AB2 TIMES BI;Lo;0;L;;;;;N;;;;; +12270;CUNEIFORM SIGN NUNUZ AB2 TIMES DUG;Lo;0;L;;;;;N;;;;; +12271;CUNEIFORM SIGN NUNUZ AB2 TIMES GUD;Lo;0;L;;;;;N;;;;; +12272;CUNEIFORM SIGN NUNUZ AB2 TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +12273;CUNEIFORM SIGN NUNUZ AB2 TIMES KAD3;Lo;0;L;;;;;N;;;;; +12274;CUNEIFORM SIGN NUNUZ AB2 TIMES LA;Lo;0;L;;;;;N;;;;; +12275;CUNEIFORM SIGN NUNUZ AB2 TIMES NE;Lo;0;L;;;;;N;;;;; +12276;CUNEIFORM SIGN NUNUZ AB2 TIMES SILA3;Lo;0;L;;;;;N;;;;; +12277;CUNEIFORM SIGN NUNUZ AB2 TIMES U2;Lo;0;L;;;;;N;;;;; +12278;CUNEIFORM SIGN NUNUZ KISIM5 TIMES BI;Lo;0;L;;;;;N;;;;; +12279;CUNEIFORM SIGN NUNUZ KISIM5 TIMES BI U;Lo;0;L;;;;;N;;;;; +1227A;CUNEIFORM SIGN PA;Lo;0;L;;;;;N;;;;; +1227B;CUNEIFORM SIGN PAD;Lo;0;L;;;;;N;;;;; +1227C;CUNEIFORM SIGN PAN;Lo;0;L;;;;;N;;;;; +1227D;CUNEIFORM SIGN PAP;Lo;0;L;;;;;N;;;;; +1227E;CUNEIFORM SIGN PESH2;Lo;0;L;;;;;N;;;;; +1227F;CUNEIFORM SIGN PI;Lo;0;L;;;;;N;;;;; +12280;CUNEIFORM SIGN PI TIMES A;Lo;0;L;;;;;N;;;;; +12281;CUNEIFORM SIGN PI TIMES AB;Lo;0;L;;;;;N;;;;; +12282;CUNEIFORM SIGN PI TIMES BI;Lo;0;L;;;;;N;;;;; +12283;CUNEIFORM SIGN PI TIMES BU;Lo;0;L;;;;;N;;;;; +12284;CUNEIFORM SIGN PI TIMES E;Lo;0;L;;;;;N;;;;; +12285;CUNEIFORM SIGN PI TIMES I;Lo;0;L;;;;;N;;;;; +12286;CUNEIFORM SIGN PI TIMES IB;Lo;0;L;;;;;N;;;;; +12287;CUNEIFORM SIGN PI TIMES U;Lo;0;L;;;;;N;;;;; +12288;CUNEIFORM SIGN PI TIMES U2;Lo;0;L;;;;;N;;;;; +12289;CUNEIFORM SIGN PI CROSSING PI;Lo;0;L;;;;;N;;;;; +1228A;CUNEIFORM SIGN PIRIG;Lo;0;L;;;;;N;;;;; +1228B;CUNEIFORM SIGN PIRIG TIMES KAL;Lo;0;L;;;;;N;;;;; +1228C;CUNEIFORM SIGN PIRIG TIMES UD;Lo;0;L;;;;;N;;;;; +1228D;CUNEIFORM SIGN PIRIG TIMES ZA;Lo;0;L;;;;;N;;;;; +1228E;CUNEIFORM SIGN PIRIG OPPOSING PIRIG;Lo;0;L;;;;;N;;;;; +1228F;CUNEIFORM SIGN RA;Lo;0;L;;;;;N;;;;; +12290;CUNEIFORM SIGN RAB;Lo;0;L;;;;;N;;;;; +12291;CUNEIFORM SIGN RI;Lo;0;L;;;;;N;;;;; +12292;CUNEIFORM SIGN RU;Lo;0;L;;;;;N;;;;; +12293;CUNEIFORM SIGN SA;Lo;0;L;;;;;N;;;;; +12294;CUNEIFORM SIGN SAG NUTILLU;Lo;0;L;;;;;N;;;;; +12295;CUNEIFORM SIGN SAG;Lo;0;L;;;;;N;;;;; +12296;CUNEIFORM SIGN SAG TIMES A;Lo;0;L;;;;;N;;;;; +12297;CUNEIFORM SIGN SAG TIMES DU;Lo;0;L;;;;;N;;;;; +12298;CUNEIFORM SIGN SAG TIMES DUB;Lo;0;L;;;;;N;;;;; +12299;CUNEIFORM SIGN SAG TIMES HA;Lo;0;L;;;;;N;;;;; +1229A;CUNEIFORM SIGN SAG TIMES KAK;Lo;0;L;;;;;N;;;;; +1229B;CUNEIFORM SIGN SAG TIMES KUR;Lo;0;L;;;;;N;;;;; +1229C;CUNEIFORM SIGN SAG TIMES LUM;Lo;0;L;;;;;N;;;;; +1229D;CUNEIFORM SIGN SAG TIMES MI;Lo;0;L;;;;;N;;;;; +1229E;CUNEIFORM SIGN SAG TIMES NUN;Lo;0;L;;;;;N;;;;; +1229F;CUNEIFORM SIGN SAG TIMES SAL;Lo;0;L;;;;;N;;;;; +122A0;CUNEIFORM SIGN SAG TIMES SHID;Lo;0;L;;;;;N;;;;; +122A1;CUNEIFORM SIGN SAG TIMES TAB;Lo;0;L;;;;;N;;;;; +122A2;CUNEIFORM SIGN SAG TIMES U2;Lo;0;L;;;;;N;;;;; +122A3;CUNEIFORM SIGN SAG TIMES UB;Lo;0;L;;;;;N;;;;; +122A4;CUNEIFORM SIGN SAG TIMES UM;Lo;0;L;;;;;N;;;;; +122A5;CUNEIFORM SIGN SAG TIMES UR;Lo;0;L;;;;;N;;;;; +122A6;CUNEIFORM SIGN SAG TIMES USH;Lo;0;L;;;;;N;;;;; +122A7;CUNEIFORM SIGN SAG OVER SAG;Lo;0;L;;;;;N;;;;; +122A8;CUNEIFORM SIGN SAG GUNU;Lo;0;L;;;;;N;;;;; +122A9;CUNEIFORM SIGN SAL;Lo;0;L;;;;;N;;;;; +122AA;CUNEIFORM SIGN SAL LAGAB TIMES ASH2;Lo;0;L;;;;;N;;;;; +122AB;CUNEIFORM SIGN SANGA2;Lo;0;L;;;;;N;;;;; +122AC;CUNEIFORM SIGN SAR;Lo;0;L;;;;;N;;;;; +122AD;CUNEIFORM SIGN SHA;Lo;0;L;;;;;N;;;;; +122AE;CUNEIFORM SIGN SHA3;Lo;0;L;;;;;N;;;;; +122AF;CUNEIFORM SIGN SHA3 TIMES A;Lo;0;L;;;;;N;;;;; +122B0;CUNEIFORM SIGN SHA3 TIMES BAD;Lo;0;L;;;;;N;;;;; +122B1;CUNEIFORM SIGN SHA3 TIMES GISH;Lo;0;L;;;;;N;;;;; +122B2;CUNEIFORM SIGN SHA3 TIMES NE;Lo;0;L;;;;;N;;;;; +122B3;CUNEIFORM SIGN SHA3 TIMES SHU2;Lo;0;L;;;;;N;;;;; +122B4;CUNEIFORM SIGN SHA3 TIMES TUR;Lo;0;L;;;;;N;;;;; +122B5;CUNEIFORM SIGN SHA3 TIMES U;Lo;0;L;;;;;N;;;;; +122B6;CUNEIFORM SIGN SHA3 TIMES U PLUS A;Lo;0;L;;;;;N;;;;; +122B7;CUNEIFORM SIGN SHA6;Lo;0;L;;;;;N;;;;; +122B8;CUNEIFORM SIGN SHAB6;Lo;0;L;;;;;N;;;;; +122B9;CUNEIFORM SIGN SHAR2;Lo;0;L;;;;;N;;;;; +122BA;CUNEIFORM SIGN SHE;Lo;0;L;;;;;N;;;;; +122BB;CUNEIFORM SIGN SHE HU;Lo;0;L;;;;;N;;;;; +122BC;CUNEIFORM SIGN SHE OVER SHE GAD OVER GAD GAR OVER GAR;Lo;0;L;;;;;N;;;;; +122BD;CUNEIFORM SIGN SHE OVER SHE TAB OVER TAB GAR OVER GAR;Lo;0;L;;;;;N;;;;; +122BE;CUNEIFORM SIGN SHEG9;Lo;0;L;;;;;N;;;;; +122BF;CUNEIFORM SIGN SHEN;Lo;0;L;;;;;N;;;;; +122C0;CUNEIFORM SIGN SHESH;Lo;0;L;;;;;N;;;;; +122C1;CUNEIFORM SIGN SHESH2;Lo;0;L;;;;;N;;;;; +122C2;CUNEIFORM SIGN SHESHLAM;Lo;0;L;;;;;N;;;;; +122C3;CUNEIFORM SIGN SHID;Lo;0;L;;;;;N;;;;; +122C4;CUNEIFORM SIGN SHID TIMES A;Lo;0;L;;;;;N;;;;; +122C5;CUNEIFORM SIGN SHID TIMES IM;Lo;0;L;;;;;N;;;;; +122C6;CUNEIFORM SIGN SHIM;Lo;0;L;;;;;N;;;;; +122C7;CUNEIFORM SIGN SHIM TIMES A;Lo;0;L;;;;;N;;;;; +122C8;CUNEIFORM SIGN SHIM TIMES BAL;Lo;0;L;;;;;N;;;;; +122C9;CUNEIFORM SIGN SHIM TIMES BULUG;Lo;0;L;;;;;N;;;;; +122CA;CUNEIFORM SIGN SHIM TIMES DIN;Lo;0;L;;;;;N;;;;; +122CB;CUNEIFORM SIGN SHIM TIMES GAR;Lo;0;L;;;;;N;;;;; +122CC;CUNEIFORM SIGN SHIM TIMES IGI;Lo;0;L;;;;;N;;;;; +122CD;CUNEIFORM SIGN SHIM TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +122CE;CUNEIFORM SIGN SHIM TIMES KUSHU2;Lo;0;L;;;;;N;;;;; +122CF;CUNEIFORM SIGN SHIM TIMES LUL;Lo;0;L;;;;;N;;;;; +122D0;CUNEIFORM SIGN SHIM TIMES MUG;Lo;0;L;;;;;N;;;;; +122D1;CUNEIFORM SIGN SHIM TIMES SAL;Lo;0;L;;;;;N;;;;; +122D2;CUNEIFORM SIGN SHINIG;Lo;0;L;;;;;N;;;;; +122D3;CUNEIFORM SIGN SHIR;Lo;0;L;;;;;N;;;;; +122D4;CUNEIFORM SIGN SHIR TENU;Lo;0;L;;;;;N;;;;; +122D5;CUNEIFORM SIGN SHIR OVER SHIR BUR OVER BUR;Lo;0;L;;;;;N;;;;; +122D6;CUNEIFORM SIGN SHITA;Lo;0;L;;;;;N;;;;; +122D7;CUNEIFORM SIGN SHU;Lo;0;L;;;;;N;;;;; +122D8;CUNEIFORM SIGN SHU OVER INVERTED SHU;Lo;0;L;;;;;N;;;;; +122D9;CUNEIFORM SIGN SHU2;Lo;0;L;;;;;N;;;;; +122DA;CUNEIFORM SIGN SHUBUR;Lo;0;L;;;;;N;;;;; +122DB;CUNEIFORM SIGN SI;Lo;0;L;;;;;N;;;;; +122DC;CUNEIFORM SIGN SI GUNU;Lo;0;L;;;;;N;;;;; +122DD;CUNEIFORM SIGN SIG;Lo;0;L;;;;;N;;;;; +122DE;CUNEIFORM SIGN SIG4;Lo;0;L;;;;;N;;;;; +122DF;CUNEIFORM SIGN SIG4 OVER SIG4 SHU2;Lo;0;L;;;;;N;;;;; +122E0;CUNEIFORM SIGN SIK2;Lo;0;L;;;;;N;;;;; +122E1;CUNEIFORM SIGN SILA3;Lo;0;L;;;;;N;;;;; +122E2;CUNEIFORM SIGN SU;Lo;0;L;;;;;N;;;;; +122E3;CUNEIFORM SIGN SU OVER SU;Lo;0;L;;;;;N;;;;; +122E4;CUNEIFORM SIGN SUD;Lo;0;L;;;;;N;;;;; +122E5;CUNEIFORM SIGN SUD2;Lo;0;L;;;;;N;;;;; +122E6;CUNEIFORM SIGN SUHUR;Lo;0;L;;;;;N;;;;; +122E7;CUNEIFORM SIGN SUM;Lo;0;L;;;;;N;;;;; +122E8;CUNEIFORM SIGN SUMASH;Lo;0;L;;;;;N;;;;; +122E9;CUNEIFORM SIGN SUR;Lo;0;L;;;;;N;;;;; +122EA;CUNEIFORM SIGN SUR9;Lo;0;L;;;;;N;;;;; +122EB;CUNEIFORM SIGN TA;Lo;0;L;;;;;N;;;;; +122EC;CUNEIFORM SIGN TA ASTERISK;Lo;0;L;;;;;N;;;;; +122ED;CUNEIFORM SIGN TA TIMES HI;Lo;0;L;;;;;N;;;;; +122EE;CUNEIFORM SIGN TA TIMES MI;Lo;0;L;;;;;N;;;;; +122EF;CUNEIFORM SIGN TA GUNU;Lo;0;L;;;;;N;;;;; +122F0;CUNEIFORM SIGN TAB;Lo;0;L;;;;;N;;;;; +122F1;CUNEIFORM SIGN TAB OVER TAB NI OVER NI DISH OVER DISH;Lo;0;L;;;;;N;;;;; +122F2;CUNEIFORM SIGN TAB SQUARED;Lo;0;L;;;;;N;;;;; +122F3;CUNEIFORM SIGN TAG;Lo;0;L;;;;;N;;;;; +122F4;CUNEIFORM SIGN TAG TIMES BI;Lo;0;L;;;;;N;;;;; +122F5;CUNEIFORM SIGN TAG TIMES GUD;Lo;0;L;;;;;N;;;;; +122F6;CUNEIFORM SIGN TAG TIMES SHE;Lo;0;L;;;;;N;;;;; +122F7;CUNEIFORM SIGN TAG TIMES SHU;Lo;0;L;;;;;N;;;;; +122F8;CUNEIFORM SIGN TAG TIMES TUG2;Lo;0;L;;;;;N;;;;; +122F9;CUNEIFORM SIGN TAG TIMES UD;Lo;0;L;;;;;N;;;;; +122FA;CUNEIFORM SIGN TAK4;Lo;0;L;;;;;N;;;;; +122FB;CUNEIFORM SIGN TAR;Lo;0;L;;;;;N;;;;; +122FC;CUNEIFORM SIGN TE;Lo;0;L;;;;;N;;;;; +122FD;CUNEIFORM SIGN TE GUNU;Lo;0;L;;;;;N;;;;; +122FE;CUNEIFORM SIGN TI;Lo;0;L;;;;;N;;;;; +122FF;CUNEIFORM SIGN TI TENU;Lo;0;L;;;;;N;;;;; +12300;CUNEIFORM SIGN TIL;Lo;0;L;;;;;N;;;;; +12301;CUNEIFORM SIGN TIR;Lo;0;L;;;;;N;;;;; +12302;CUNEIFORM SIGN TIR TIMES TAK4;Lo;0;L;;;;;N;;;;; +12303;CUNEIFORM SIGN TIR OVER TIR;Lo;0;L;;;;;N;;;;; +12304;CUNEIFORM SIGN TIR OVER TIR GAD OVER GAD GAR OVER GAR;Lo;0;L;;;;;N;;;;; +12305;CUNEIFORM SIGN TU;Lo;0;L;;;;;N;;;;; +12306;CUNEIFORM SIGN TUG2;Lo;0;L;;;;;N;;;;; +12307;CUNEIFORM SIGN TUK;Lo;0;L;;;;;N;;;;; +12308;CUNEIFORM SIGN TUM;Lo;0;L;;;;;N;;;;; +12309;CUNEIFORM SIGN TUR;Lo;0;L;;;;;N;;;;; +1230A;CUNEIFORM SIGN TUR OVER TUR ZA OVER ZA;Lo;0;L;;;;;N;;;;; +1230B;CUNEIFORM SIGN U;Lo;0;L;;;;;N;;;;; +1230C;CUNEIFORM SIGN U GUD;Lo;0;L;;;;;N;;;;; +1230D;CUNEIFORM SIGN U U U;Lo;0;L;;;;;N;;;;; +1230E;CUNEIFORM SIGN U OVER U PA OVER PA GAR OVER GAR;Lo;0;L;;;;;N;;;;; +1230F;CUNEIFORM SIGN U OVER U SUR OVER SUR;Lo;0;L;;;;;N;;;;; +12310;CUNEIFORM SIGN U OVER U U REVERSED OVER U REVERSED;Lo;0;L;;;;;N;;;;; +12311;CUNEIFORM SIGN U2;Lo;0;L;;;;;N;;;;; +12312;CUNEIFORM SIGN UB;Lo;0;L;;;;;N;;;;; +12313;CUNEIFORM SIGN UD;Lo;0;L;;;;;N;;;;; +12314;CUNEIFORM SIGN UD KUSHU2;Lo;0;L;;;;;N;;;;; +12315;CUNEIFORM SIGN UD TIMES BAD;Lo;0;L;;;;;N;;;;; +12316;CUNEIFORM SIGN UD TIMES MI;Lo;0;L;;;;;N;;;;; +12317;CUNEIFORM SIGN UD TIMES U PLUS U PLUS U;Lo;0;L;;;;;N;;;;; +12318;CUNEIFORM SIGN UD TIMES U PLUS U PLUS U GUNU;Lo;0;L;;;;;N;;;;; +12319;CUNEIFORM SIGN UD GUNU;Lo;0;L;;;;;N;;;;; +1231A;CUNEIFORM SIGN UD SHESHIG;Lo;0;L;;;;;N;;;;; +1231B;CUNEIFORM SIGN UD SHESHIG TIMES BAD;Lo;0;L;;;;;N;;;;; +1231C;CUNEIFORM SIGN UDUG;Lo;0;L;;;;;N;;;;; +1231D;CUNEIFORM SIGN UM;Lo;0;L;;;;;N;;;;; +1231E;CUNEIFORM SIGN UM TIMES LAGAB;Lo;0;L;;;;;N;;;;; +1231F;CUNEIFORM SIGN UM TIMES ME PLUS DA;Lo;0;L;;;;;N;;;;; +12320;CUNEIFORM SIGN UM TIMES SHA3;Lo;0;L;;;;;N;;;;; +12321;CUNEIFORM SIGN UM TIMES U;Lo;0;L;;;;;N;;;;; +12322;CUNEIFORM SIGN UMBIN;Lo;0;L;;;;;N;;;;; +12323;CUNEIFORM SIGN UMUM;Lo;0;L;;;;;N;;;;; +12324;CUNEIFORM SIGN UMUM TIMES KASKAL;Lo;0;L;;;;;N;;;;; +12325;CUNEIFORM SIGN UMUM TIMES PA;Lo;0;L;;;;;N;;;;; +12326;CUNEIFORM SIGN UN;Lo;0;L;;;;;N;;;;; +12327;CUNEIFORM SIGN UN GUNU;Lo;0;L;;;;;N;;;;; +12328;CUNEIFORM SIGN UR;Lo;0;L;;;;;N;;;;; +12329;CUNEIFORM SIGN UR CROSSING UR;Lo;0;L;;;;;N;;;;; +1232A;CUNEIFORM SIGN UR SHESHIG;Lo;0;L;;;;;N;;;;; +1232B;CUNEIFORM SIGN UR2;Lo;0;L;;;;;N;;;;; +1232C;CUNEIFORM SIGN UR2 TIMES A PLUS HA;Lo;0;L;;;;;N;;;;; +1232D;CUNEIFORM SIGN UR2 TIMES A PLUS NA;Lo;0;L;;;;;N;;;;; +1232E;CUNEIFORM SIGN UR2 TIMES AL;Lo;0;L;;;;;N;;;;; +1232F;CUNEIFORM SIGN UR2 TIMES HA;Lo;0;L;;;;;N;;;;; +12330;CUNEIFORM SIGN UR2 TIMES NUN;Lo;0;L;;;;;N;;;;; +12331;CUNEIFORM SIGN UR2 TIMES U2;Lo;0;L;;;;;N;;;;; +12332;CUNEIFORM SIGN UR2 TIMES U2 PLUS ASH;Lo;0;L;;;;;N;;;;; +12333;CUNEIFORM SIGN UR2 TIMES U2 PLUS BI;Lo;0;L;;;;;N;;;;; +12334;CUNEIFORM SIGN UR4;Lo;0;L;;;;;N;;;;; +12335;CUNEIFORM SIGN URI;Lo;0;L;;;;;N;;;;; +12336;CUNEIFORM SIGN URI3;Lo;0;L;;;;;N;;;;; +12337;CUNEIFORM SIGN URU;Lo;0;L;;;;;N;;;;; +12338;CUNEIFORM SIGN URU TIMES A;Lo;0;L;;;;;N;;;;; +12339;CUNEIFORM SIGN URU TIMES ASHGAB;Lo;0;L;;;;;N;;;;; +1233A;CUNEIFORM SIGN URU TIMES BAR;Lo;0;L;;;;;N;;;;; +1233B;CUNEIFORM SIGN URU TIMES DUN;Lo;0;L;;;;;N;;;;; +1233C;CUNEIFORM SIGN URU TIMES GA;Lo;0;L;;;;;N;;;;; +1233D;CUNEIFORM SIGN URU TIMES GAL;Lo;0;L;;;;;N;;;;; +1233E;CUNEIFORM SIGN URU TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; +1233F;CUNEIFORM SIGN URU TIMES GAR;Lo;0;L;;;;;N;;;;; +12340;CUNEIFORM SIGN URU TIMES GU;Lo;0;L;;;;;N;;;;; +12341;CUNEIFORM SIGN URU TIMES HA;Lo;0;L;;;;;N;;;;; +12342;CUNEIFORM SIGN URU TIMES IGI;Lo;0;L;;;;;N;;;;; +12343;CUNEIFORM SIGN URU TIMES IM;Lo;0;L;;;;;N;;;;; +12344;CUNEIFORM SIGN URU TIMES ISH;Lo;0;L;;;;;N;;;;; +12345;CUNEIFORM SIGN URU TIMES KI;Lo;0;L;;;;;N;;;;; +12346;CUNEIFORM SIGN URU TIMES LUM;Lo;0;L;;;;;N;;;;; +12347;CUNEIFORM SIGN URU TIMES MIN;Lo;0;L;;;;;N;;;;; +12348;CUNEIFORM SIGN URU TIMES PA;Lo;0;L;;;;;N;;;;; +12349;CUNEIFORM SIGN URU TIMES SHE;Lo;0;L;;;;;N;;;;; +1234A;CUNEIFORM SIGN URU TIMES SIG4;Lo;0;L;;;;;N;;;;; +1234B;CUNEIFORM SIGN URU TIMES TU;Lo;0;L;;;;;N;;;;; +1234C;CUNEIFORM SIGN URU TIMES U PLUS GUD;Lo;0;L;;;;;N;;;;; +1234D;CUNEIFORM SIGN URU TIMES UD;Lo;0;L;;;;;N;;;;; +1234E;CUNEIFORM SIGN URU TIMES URUDA;Lo;0;L;;;;;N;;;;; +1234F;CUNEIFORM SIGN URUDA;Lo;0;L;;;;;N;;;;; +12350;CUNEIFORM SIGN URUDA TIMES U;Lo;0;L;;;;;N;;;;; +12351;CUNEIFORM SIGN USH;Lo;0;L;;;;;N;;;;; +12352;CUNEIFORM SIGN USH TIMES A;Lo;0;L;;;;;N;;;;; +12353;CUNEIFORM SIGN USH TIMES KU;Lo;0;L;;;;;N;;;;; +12354;CUNEIFORM SIGN USH TIMES KUR;Lo;0;L;;;;;N;;;;; +12355;CUNEIFORM SIGN USH TIMES TAK4;Lo;0;L;;;;;N;;;;; +12356;CUNEIFORM SIGN USHX;Lo;0;L;;;;;N;;;;; +12357;CUNEIFORM SIGN USH2;Lo;0;L;;;;;N;;;;; +12358;CUNEIFORM SIGN USHUMX;Lo;0;L;;;;;N;;;;; +12359;CUNEIFORM SIGN UTUKI;Lo;0;L;;;;;N;;;;; +1235A;CUNEIFORM SIGN UZ3;Lo;0;L;;;;;N;;;;; +1235B;CUNEIFORM SIGN UZ3 TIMES KASKAL;Lo;0;L;;;;;N;;;;; +1235C;CUNEIFORM SIGN UZU;Lo;0;L;;;;;N;;;;; +1235D;CUNEIFORM SIGN ZA;Lo;0;L;;;;;N;;;;; +1235E;CUNEIFORM SIGN ZA TENU;Lo;0;L;;;;;N;;;;; +1235F;CUNEIFORM SIGN ZA SQUARED TIMES KUR;Lo;0;L;;;;;N;;;;; +12360;CUNEIFORM SIGN ZAG;Lo;0;L;;;;;N;;;;; +12361;CUNEIFORM SIGN ZAMX;Lo;0;L;;;;;N;;;;; +12362;CUNEIFORM SIGN ZE2;Lo;0;L;;;;;N;;;;; +12363;CUNEIFORM SIGN ZI;Lo;0;L;;;;;N;;;;; +12364;CUNEIFORM SIGN ZI OVER ZI;Lo;0;L;;;;;N;;;;; +12365;CUNEIFORM SIGN ZI3;Lo;0;L;;;;;N;;;;; +12366;CUNEIFORM SIGN ZIB;Lo;0;L;;;;;N;;;;; +12367;CUNEIFORM SIGN ZIB KABA TENU;Lo;0;L;;;;;N;;;;; +12368;CUNEIFORM SIGN ZIG;Lo;0;L;;;;;N;;;;; +12369;CUNEIFORM SIGN ZIZ2;Lo;0;L;;;;;N;;;;; +1236A;CUNEIFORM SIGN ZU;Lo;0;L;;;;;N;;;;; +1236B;CUNEIFORM SIGN ZU5;Lo;0;L;;;;;N;;;;; +1236C;CUNEIFORM SIGN ZU5 TIMES A;Lo;0;L;;;;;N;;;;; +1236D;CUNEIFORM SIGN ZUBUR;Lo;0;L;;;;;N;;;;; +1236E;CUNEIFORM SIGN ZUM;Lo;0;L;;;;;N;;;;; +1236F;CUNEIFORM SIGN KAP ELAMITE;Lo;0;L;;;;;N;;;;; +12370;CUNEIFORM SIGN AB TIMES NUN;Lo;0;L;;;;;N;;;;; +12371;CUNEIFORM SIGN AB2 TIMES A;Lo;0;L;;;;;N;;;;; +12372;CUNEIFORM SIGN AMAR TIMES KUG;Lo;0;L;;;;;N;;;;; +12373;CUNEIFORM SIGN DAG KISIM5 TIMES U2 PLUS MASH;Lo;0;L;;;;;N;;;;; +12374;CUNEIFORM SIGN DAG3;Lo;0;L;;;;;N;;;;; +12375;CUNEIFORM SIGN DISH PLUS SHU;Lo;0;L;;;;;N;;;;; +12376;CUNEIFORM SIGN DUB TIMES SHE;Lo;0;L;;;;;N;;;;; +12377;CUNEIFORM SIGN EZEN TIMES GUD;Lo;0;L;;;;;N;;;;; +12378;CUNEIFORM SIGN EZEN TIMES SHE;Lo;0;L;;;;;N;;;;; +12379;CUNEIFORM SIGN GA2 TIMES AN PLUS KAK PLUS A;Lo;0;L;;;;;N;;;;; +1237A;CUNEIFORM SIGN GA2 TIMES ASH2;Lo;0;L;;;;;N;;;;; +1237B;CUNEIFORM SIGN GE22;Lo;0;L;;;;;N;;;;; +1237C;CUNEIFORM SIGN GIG;Lo;0;L;;;;;N;;;;; +1237D;CUNEIFORM SIGN HUSH;Lo;0;L;;;;;N;;;;; +1237E;CUNEIFORM SIGN KA TIMES ANSHE;Lo;0;L;;;;;N;;;;; +1237F;CUNEIFORM SIGN KA TIMES ASH3;Lo;0;L;;;;;N;;;;; +12380;CUNEIFORM SIGN KA TIMES GISH;Lo;0;L;;;;;N;;;;; +12381;CUNEIFORM SIGN KA TIMES GUD;Lo;0;L;;;;;N;;;;; +12382;CUNEIFORM SIGN KA TIMES HI TIMES ASH2;Lo;0;L;;;;;N;;;;; +12383;CUNEIFORM SIGN KA TIMES LUM;Lo;0;L;;;;;N;;;;; +12384;CUNEIFORM SIGN KA TIMES PA;Lo;0;L;;;;;N;;;;; +12385;CUNEIFORM SIGN KA TIMES SHUL;Lo;0;L;;;;;N;;;;; +12386;CUNEIFORM SIGN KA TIMES TU;Lo;0;L;;;;;N;;;;; +12387;CUNEIFORM SIGN KA TIMES UR2;Lo;0;L;;;;;N;;;;; +12388;CUNEIFORM SIGN LAGAB TIMES GI;Lo;0;L;;;;;N;;;;; +12389;CUNEIFORM SIGN LU2 SHESHIG TIMES BAD;Lo;0;L;;;;;N;;;;; +1238A;CUNEIFORM SIGN LU2 TIMES ESH2 PLUS LAL;Lo;0;L;;;;;N;;;;; +1238B;CUNEIFORM SIGN LU2 TIMES SHU;Lo;0;L;;;;;N;;;;; +1238C;CUNEIFORM SIGN MESH;Lo;0;L;;;;;N;;;;; +1238D;CUNEIFORM SIGN MUSH3 TIMES ZA;Lo;0;L;;;;;N;;;;; +1238E;CUNEIFORM SIGN NA4;Lo;0;L;;;;;N;;;;; +1238F;CUNEIFORM SIGN NIN;Lo;0;L;;;;;N;;;;; +12390;CUNEIFORM SIGN NIN9;Lo;0;L;;;;;N;;;;; +12391;CUNEIFORM SIGN NINDA2 TIMES BAL;Lo;0;L;;;;;N;;;;; +12392;CUNEIFORM SIGN NINDA2 TIMES GI;Lo;0;L;;;;;N;;;;; +12393;CUNEIFORM SIGN NU11 ROTATED NINETY DEGREES;Lo;0;L;;;;;N;;;;; +12394;CUNEIFORM SIGN PESH2 ASTERISK;Lo;0;L;;;;;N;;;;; +12395;CUNEIFORM SIGN PIR2;Lo;0;L;;;;;N;;;;; +12396;CUNEIFORM SIGN SAG TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +12397;CUNEIFORM SIGN TI2;Lo;0;L;;;;;N;;;;; +12398;CUNEIFORM SIGN UM TIMES ME;Lo;0;L;;;;;N;;;;; +12399;CUNEIFORM SIGN U U;Lo;0;L;;;;;N;;;;; +12400;CUNEIFORM NUMERIC SIGN TWO ASH;Nl;0;L;;;;2;N;;;;; +12401;CUNEIFORM NUMERIC SIGN THREE ASH;Nl;0;L;;;;3;N;;;;; +12402;CUNEIFORM NUMERIC SIGN FOUR ASH;Nl;0;L;;;;4;N;;;;; +12403;CUNEIFORM NUMERIC SIGN FIVE ASH;Nl;0;L;;;;5;N;;;;; +12404;CUNEIFORM NUMERIC SIGN SIX ASH;Nl;0;L;;;;6;N;;;;; +12405;CUNEIFORM NUMERIC SIGN SEVEN ASH;Nl;0;L;;;;7;N;;;;; +12406;CUNEIFORM NUMERIC SIGN EIGHT ASH;Nl;0;L;;;;8;N;;;;; +12407;CUNEIFORM NUMERIC SIGN NINE ASH;Nl;0;L;;;;9;N;;;;; +12408;CUNEIFORM NUMERIC SIGN THREE DISH;Nl;0;L;;;;3;N;;;;; +12409;CUNEIFORM NUMERIC SIGN FOUR DISH;Nl;0;L;;;;4;N;;;;; +1240A;CUNEIFORM NUMERIC SIGN FIVE DISH;Nl;0;L;;;;5;N;;;;; +1240B;CUNEIFORM NUMERIC SIGN SIX DISH;Nl;0;L;;;;6;N;;;;; +1240C;CUNEIFORM NUMERIC SIGN SEVEN DISH;Nl;0;L;;;;7;N;;;;; +1240D;CUNEIFORM NUMERIC SIGN EIGHT DISH;Nl;0;L;;;;8;N;;;;; +1240E;CUNEIFORM NUMERIC SIGN NINE DISH;Nl;0;L;;;;9;N;;;;; +1240F;CUNEIFORM NUMERIC SIGN FOUR U;Nl;0;L;;;;4;N;;;;; +12410;CUNEIFORM NUMERIC SIGN FIVE U;Nl;0;L;;;;5;N;;;;; +12411;CUNEIFORM NUMERIC SIGN SIX U;Nl;0;L;;;;6;N;;;;; +12412;CUNEIFORM NUMERIC SIGN SEVEN U;Nl;0;L;;;;7;N;;;;; +12413;CUNEIFORM NUMERIC SIGN EIGHT U;Nl;0;L;;;;8;N;;;;; +12414;CUNEIFORM NUMERIC SIGN NINE U;Nl;0;L;;;;9;N;;;;; +12415;CUNEIFORM NUMERIC SIGN ONE GESH2;Nl;0;L;;;;1;N;;;;; +12416;CUNEIFORM NUMERIC SIGN TWO GESH2;Nl;0;L;;;;2;N;;;;; +12417;CUNEIFORM NUMERIC SIGN THREE GESH2;Nl;0;L;;;;3;N;;;;; +12418;CUNEIFORM NUMERIC SIGN FOUR GESH2;Nl;0;L;;;;4;N;;;;; +12419;CUNEIFORM NUMERIC SIGN FIVE GESH2;Nl;0;L;;;;5;N;;;;; +1241A;CUNEIFORM NUMERIC SIGN SIX GESH2;Nl;0;L;;;;6;N;;;;; +1241B;CUNEIFORM NUMERIC SIGN SEVEN GESH2;Nl;0;L;;;;7;N;;;;; +1241C;CUNEIFORM NUMERIC SIGN EIGHT GESH2;Nl;0;L;;;;8;N;;;;; +1241D;CUNEIFORM NUMERIC SIGN NINE GESH2;Nl;0;L;;;;9;N;;;;; +1241E;CUNEIFORM NUMERIC SIGN ONE GESHU;Nl;0;L;;;;1;N;;;;; +1241F;CUNEIFORM NUMERIC SIGN TWO GESHU;Nl;0;L;;;;2;N;;;;; +12420;CUNEIFORM NUMERIC SIGN THREE GESHU;Nl;0;L;;;;3;N;;;;; +12421;CUNEIFORM NUMERIC SIGN FOUR GESHU;Nl;0;L;;;;4;N;;;;; +12422;CUNEIFORM NUMERIC SIGN FIVE GESHU;Nl;0;L;;;;5;N;;;;; +12423;CUNEIFORM NUMERIC SIGN TWO SHAR2;Nl;0;L;;;;2;N;;;;; +12424;CUNEIFORM NUMERIC SIGN THREE SHAR2;Nl;0;L;;;;3;N;;;;; +12425;CUNEIFORM NUMERIC SIGN THREE SHAR2 VARIANT FORM;Nl;0;L;;;;3;N;;;;; +12426;CUNEIFORM NUMERIC SIGN FOUR SHAR2;Nl;0;L;;;;4;N;;;;; +12427;CUNEIFORM NUMERIC SIGN FIVE SHAR2;Nl;0;L;;;;5;N;;;;; +12428;CUNEIFORM NUMERIC SIGN SIX SHAR2;Nl;0;L;;;;6;N;;;;; +12429;CUNEIFORM NUMERIC SIGN SEVEN SHAR2;Nl;0;L;;;;7;N;;;;; +1242A;CUNEIFORM NUMERIC SIGN EIGHT SHAR2;Nl;0;L;;;;8;N;;;;; +1242B;CUNEIFORM NUMERIC SIGN NINE SHAR2;Nl;0;L;;;;9;N;;;;; +1242C;CUNEIFORM NUMERIC SIGN ONE SHARU;Nl;0;L;;;;1;N;;;;; +1242D;CUNEIFORM NUMERIC SIGN TWO SHARU;Nl;0;L;;;;2;N;;;;; +1242E;CUNEIFORM NUMERIC SIGN THREE SHARU;Nl;0;L;;;;3;N;;;;; +1242F;CUNEIFORM NUMERIC SIGN THREE SHARU VARIANT FORM;Nl;0;L;;;;3;N;;;;; +12430;CUNEIFORM NUMERIC SIGN FOUR SHARU;Nl;0;L;;;;4;N;;;;; +12431;CUNEIFORM NUMERIC SIGN FIVE SHARU;Nl;0;L;;;;5;N;;;;; +12432;CUNEIFORM NUMERIC SIGN SHAR2 TIMES GAL PLUS DISH;Nl;0;L;;;;216000;N;;;;; +12433;CUNEIFORM NUMERIC SIGN SHAR2 TIMES GAL PLUS MIN;Nl;0;L;;;;432000;N;;;;; +12434;CUNEIFORM NUMERIC SIGN ONE BURU;Nl;0;L;;;;1;N;;;;; +12435;CUNEIFORM NUMERIC SIGN TWO BURU;Nl;0;L;;;;2;N;;;;; +12436;CUNEIFORM NUMERIC SIGN THREE BURU;Nl;0;L;;;;3;N;;;;; +12437;CUNEIFORM NUMERIC SIGN THREE BURU VARIANT FORM;Nl;0;L;;;;3;N;;;;; +12438;CUNEIFORM NUMERIC SIGN FOUR BURU;Nl;0;L;;;;4;N;;;;; +12439;CUNEIFORM NUMERIC SIGN FIVE BURU;Nl;0;L;;;;5;N;;;;; +1243A;CUNEIFORM NUMERIC SIGN THREE VARIANT FORM ESH16;Nl;0;L;;;;3;N;;;;; +1243B;CUNEIFORM NUMERIC SIGN THREE VARIANT FORM ESH21;Nl;0;L;;;;3;N;;;;; +1243C;CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU;Nl;0;L;;;;4;N;;;;; +1243D;CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU4;Nl;0;L;;;;4;N;;;;; +1243E;CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU A;Nl;0;L;;;;4;N;;;;; +1243F;CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU B;Nl;0;L;;;;4;N;;;;; +12440;CUNEIFORM NUMERIC SIGN SIX VARIANT FORM ASH9;Nl;0;L;;;;6;N;;;;; +12441;CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN3;Nl;0;L;;;;7;N;;;;; +12442;CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN A;Nl;0;L;;;;7;N;;;;; +12443;CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN B;Nl;0;L;;;;7;N;;;;; +12444;CUNEIFORM NUMERIC SIGN EIGHT VARIANT FORM USSU;Nl;0;L;;;;8;N;;;;; +12445;CUNEIFORM NUMERIC SIGN EIGHT VARIANT FORM USSU3;Nl;0;L;;;;8;N;;;;; +12446;CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU;Nl;0;L;;;;9;N;;;;; +12447;CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU3;Nl;0;L;;;;9;N;;;;; +12448;CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU4;Nl;0;L;;;;9;N;;;;; +12449;CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU A;Nl;0;L;;;;9;N;;;;; +1244A;CUNEIFORM NUMERIC SIGN TWO ASH TENU;Nl;0;L;;;;2;N;;;;; +1244B;CUNEIFORM NUMERIC SIGN THREE ASH TENU;Nl;0;L;;;;3;N;;;;; +1244C;CUNEIFORM NUMERIC SIGN FOUR ASH TENU;Nl;0;L;;;;4;N;;;;; +1244D;CUNEIFORM NUMERIC SIGN FIVE ASH TENU;Nl;0;L;;;;5;N;;;;; +1244E;CUNEIFORM NUMERIC SIGN SIX ASH TENU;Nl;0;L;;;;6;N;;;;; +1244F;CUNEIFORM NUMERIC SIGN ONE BAN2;Nl;0;L;;;;1;N;;;;; +12450;CUNEIFORM NUMERIC SIGN TWO BAN2;Nl;0;L;;;;2;N;;;;; +12451;CUNEIFORM NUMERIC SIGN THREE BAN2;Nl;0;L;;;;3;N;;;;; +12452;CUNEIFORM NUMERIC SIGN FOUR BAN2;Nl;0;L;;;;4;N;;;;; +12453;CUNEIFORM NUMERIC SIGN FOUR BAN2 VARIANT FORM;Nl;0;L;;;;4;N;;;;; +12454;CUNEIFORM NUMERIC SIGN FIVE BAN2;Nl;0;L;;;;5;N;;;;; +12455;CUNEIFORM NUMERIC SIGN FIVE BAN2 VARIANT FORM;Nl;0;L;;;;5;N;;;;; +12456;CUNEIFORM NUMERIC SIGN NIGIDAMIN;Nl;0;L;;;;2;N;;;;; +12457;CUNEIFORM NUMERIC SIGN NIGIDAESH;Nl;0;L;;;;3;N;;;;; +12458;CUNEIFORM NUMERIC SIGN ONE ESHE3;Nl;0;L;;;;1;N;;;;; +12459;CUNEIFORM NUMERIC SIGN TWO ESHE3;Nl;0;L;;;;2;N;;;;; +1245A;CUNEIFORM NUMERIC SIGN ONE THIRD DISH;Nl;0;L;;;;1/3;N;;;;; +1245B;CUNEIFORM NUMERIC SIGN TWO THIRDS DISH;Nl;0;L;;;;2/3;N;;;;; +1245C;CUNEIFORM NUMERIC SIGN FIVE SIXTHS DISH;Nl;0;L;;;;5/6;N;;;;; +1245D;CUNEIFORM NUMERIC SIGN ONE THIRD VARIANT FORM A;Nl;0;L;;;;1/3;N;;;;; +1245E;CUNEIFORM NUMERIC SIGN TWO THIRDS VARIANT FORM A;Nl;0;L;;;;2/3;N;;;;; +1245F;CUNEIFORM NUMERIC SIGN ONE EIGHTH ASH;Nl;0;L;;;;1/8;N;;;;; +12460;CUNEIFORM NUMERIC SIGN ONE QUARTER ASH;Nl;0;L;;;;1/4;N;;;;; +12461;CUNEIFORM NUMERIC SIGN OLD ASSYRIAN ONE SIXTH;Nl;0;L;;;;1/6;N;;;;; +12462;CUNEIFORM NUMERIC SIGN OLD ASSYRIAN ONE QUARTER;Nl;0;L;;;;1/4;N;;;;; +12463;CUNEIFORM NUMERIC SIGN ONE QUARTER GUR;Nl;0;L;;;;1/4;N;;;;; +12464;CUNEIFORM NUMERIC SIGN ONE HALF GUR;Nl;0;L;;;;1/2;N;;;;; +12465;CUNEIFORM NUMERIC SIGN ELAMITE ONE THIRD;Nl;0;L;;;;1/3;N;;;;; +12466;CUNEIFORM NUMERIC SIGN ELAMITE TWO THIRDS;Nl;0;L;;;;2/3;N;;;;; +12467;CUNEIFORM NUMERIC SIGN ELAMITE FORTY;Nl;0;L;;;;40;N;;;;; +12468;CUNEIFORM NUMERIC SIGN ELAMITE FIFTY;Nl;0;L;;;;50;N;;;;; +12469;CUNEIFORM NUMERIC SIGN FOUR U VARIANT FORM;Nl;0;L;;;;4;N;;;;; +1246A;CUNEIFORM NUMERIC SIGN FIVE U VARIANT FORM;Nl;0;L;;;;5;N;;;;; +1246B;CUNEIFORM NUMERIC SIGN SIX U VARIANT FORM;Nl;0;L;;;;6;N;;;;; +1246C;CUNEIFORM NUMERIC SIGN SEVEN U VARIANT FORM;Nl;0;L;;;;7;N;;;;; +1246D;CUNEIFORM NUMERIC SIGN EIGHT U VARIANT FORM;Nl;0;L;;;;8;N;;;;; +1246E;CUNEIFORM NUMERIC SIGN NINE U VARIANT FORM;Nl;0;L;;;;9;N;;;;; +12470;CUNEIFORM PUNCTUATION SIGN OLD ASSYRIAN WORD DIVIDER;Po;0;L;;;;;N;;;;; +12471;CUNEIFORM PUNCTUATION SIGN VERTICAL COLON;Po;0;L;;;;;N;;;;; +12472;CUNEIFORM PUNCTUATION SIGN DIAGONAL COLON;Po;0;L;;;;;N;;;;; +12473;CUNEIFORM PUNCTUATION SIGN DIAGONAL TRICOLON;Po;0;L;;;;;N;;;;; +12474;CUNEIFORM PUNCTUATION SIGN DIAGONAL QUADCOLON;Po;0;L;;;;;N;;;;; +12480;CUNEIFORM SIGN AB TIMES NUN TENU;Lo;0;L;;;;;N;;;;; +12481;CUNEIFORM SIGN AB TIMES SHU2;Lo;0;L;;;;;N;;;;; +12482;CUNEIFORM SIGN AD TIMES ESH2;Lo;0;L;;;;;N;;;;; +12483;CUNEIFORM SIGN BAD TIMES DISH TENU;Lo;0;L;;;;;N;;;;; +12484;CUNEIFORM SIGN BAHAR2 TIMES AB2;Lo;0;L;;;;;N;;;;; +12485;CUNEIFORM SIGN BAHAR2 TIMES NI;Lo;0;L;;;;;N;;;;; +12486;CUNEIFORM SIGN BAHAR2 TIMES ZA;Lo;0;L;;;;;N;;;;; +12487;CUNEIFORM SIGN BU OVER BU TIMES NA2;Lo;0;L;;;;;N;;;;; +12488;CUNEIFORM SIGN DA TIMES TAK4;Lo;0;L;;;;;N;;;;; +12489;CUNEIFORM SIGN DAG TIMES KUR;Lo;0;L;;;;;N;;;;; +1248A;CUNEIFORM SIGN DIM TIMES IGI;Lo;0;L;;;;;N;;;;; +1248B;CUNEIFORM SIGN DIM TIMES U U U;Lo;0;L;;;;;N;;;;; +1248C;CUNEIFORM SIGN DIM2 TIMES UD;Lo;0;L;;;;;N;;;;; +1248D;CUNEIFORM SIGN DUG TIMES ANSHE;Lo;0;L;;;;;N;;;;; +1248E;CUNEIFORM SIGN DUG TIMES ASH;Lo;0;L;;;;;N;;;;; +1248F;CUNEIFORM SIGN DUG TIMES ASH AT LEFT;Lo;0;L;;;;;N;;;;; +12490;CUNEIFORM SIGN DUG TIMES DIN;Lo;0;L;;;;;N;;;;; +12491;CUNEIFORM SIGN DUG TIMES DUN;Lo;0;L;;;;;N;;;;; +12492;CUNEIFORM SIGN DUG TIMES ERIN2;Lo;0;L;;;;;N;;;;; +12493;CUNEIFORM SIGN DUG TIMES GA;Lo;0;L;;;;;N;;;;; +12494;CUNEIFORM SIGN DUG TIMES GI;Lo;0;L;;;;;N;;;;; +12495;CUNEIFORM SIGN DUG TIMES GIR2 GUNU;Lo;0;L;;;;;N;;;;; +12496;CUNEIFORM SIGN DUG TIMES GISH;Lo;0;L;;;;;N;;;;; +12497;CUNEIFORM SIGN DUG TIMES HA;Lo;0;L;;;;;N;;;;; +12498;CUNEIFORM SIGN DUG TIMES HI;Lo;0;L;;;;;N;;;;; +12499;CUNEIFORM SIGN DUG TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +1249A;CUNEIFORM SIGN DUG TIMES KASKAL;Lo;0;L;;;;;N;;;;; +1249B;CUNEIFORM SIGN DUG TIMES KUR;Lo;0;L;;;;;N;;;;; +1249C;CUNEIFORM SIGN DUG TIMES KUSHU2;Lo;0;L;;;;;N;;;;; +1249D;CUNEIFORM SIGN DUG TIMES KUSHU2 PLUS KASKAL;Lo;0;L;;;;;N;;;;; +1249E;CUNEIFORM SIGN DUG TIMES LAK-020;Lo;0;L;;;;;N;;;;; +1249F;CUNEIFORM SIGN DUG TIMES LAM;Lo;0;L;;;;;N;;;;; +124A0;CUNEIFORM SIGN DUG TIMES LAM TIMES KUR;Lo;0;L;;;;;N;;;;; +124A1;CUNEIFORM SIGN DUG TIMES LUH PLUS GISH;Lo;0;L;;;;;N;;;;; +124A2;CUNEIFORM SIGN DUG TIMES MASH;Lo;0;L;;;;;N;;;;; +124A3;CUNEIFORM SIGN DUG TIMES MES;Lo;0;L;;;;;N;;;;; +124A4;CUNEIFORM SIGN DUG TIMES MI;Lo;0;L;;;;;N;;;;; +124A5;CUNEIFORM SIGN DUG TIMES NI;Lo;0;L;;;;;N;;;;; +124A6;CUNEIFORM SIGN DUG TIMES PI;Lo;0;L;;;;;N;;;;; +124A7;CUNEIFORM SIGN DUG TIMES SHE;Lo;0;L;;;;;N;;;;; +124A8;CUNEIFORM SIGN DUG TIMES SI GUNU;Lo;0;L;;;;;N;;;;; +124A9;CUNEIFORM SIGN E2 TIMES KUR;Lo;0;L;;;;;N;;;;; +124AA;CUNEIFORM SIGN E2 TIMES PAP;Lo;0;L;;;;;N;;;;; +124AB;CUNEIFORM SIGN ERIN2 X;Lo;0;L;;;;;N;;;;; +124AC;CUNEIFORM SIGN ESH2 CROSSING ESH2;Lo;0;L;;;;;N;;;;; +124AD;CUNEIFORM SIGN EZEN SHESHIG TIMES ASH;Lo;0;L;;;;;N;;;;; +124AE;CUNEIFORM SIGN EZEN SHESHIG TIMES HI;Lo;0;L;;;;;N;;;;; +124AF;CUNEIFORM SIGN EZEN SHESHIG TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +124B0;CUNEIFORM SIGN EZEN SHESHIG TIMES LA;Lo;0;L;;;;;N;;;;; +124B1;CUNEIFORM SIGN EZEN SHESHIG TIMES LAL;Lo;0;L;;;;;N;;;;; +124B2;CUNEIFORM SIGN EZEN SHESHIG TIMES ME;Lo;0;L;;;;;N;;;;; +124B3;CUNEIFORM SIGN EZEN SHESHIG TIMES MES;Lo;0;L;;;;;N;;;;; +124B4;CUNEIFORM SIGN EZEN SHESHIG TIMES SU;Lo;0;L;;;;;N;;;;; +124B5;CUNEIFORM SIGN EZEN TIMES SU;Lo;0;L;;;;;N;;;;; +124B6;CUNEIFORM SIGN GA2 TIMES BAHAR2;Lo;0;L;;;;;N;;;;; +124B7;CUNEIFORM SIGN GA2 TIMES DIM GUNU;Lo;0;L;;;;;N;;;;; +124B8;CUNEIFORM SIGN GA2 TIMES DUG TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +124B9;CUNEIFORM SIGN GA2 TIMES DUG TIMES KASKAL;Lo;0;L;;;;;N;;;;; +124BA;CUNEIFORM SIGN GA2 TIMES EREN;Lo;0;L;;;;;N;;;;; +124BB;CUNEIFORM SIGN GA2 TIMES GA;Lo;0;L;;;;;N;;;;; +124BC;CUNEIFORM SIGN GA2 TIMES GAR PLUS DI;Lo;0;L;;;;;N;;;;; +124BD;CUNEIFORM SIGN GA2 TIMES GAR PLUS NE;Lo;0;L;;;;;N;;;;; +124BE;CUNEIFORM SIGN GA2 TIMES HA PLUS A;Lo;0;L;;;;;N;;;;; +124BF;CUNEIFORM SIGN GA2 TIMES KUSHU2 PLUS KASKAL;Lo;0;L;;;;;N;;;;; +124C0;CUNEIFORM SIGN GA2 TIMES LAM;Lo;0;L;;;;;N;;;;; +124C1;CUNEIFORM SIGN GA2 TIMES LAM TIMES KUR;Lo;0;L;;;;;N;;;;; +124C2;CUNEIFORM SIGN GA2 TIMES LUH;Lo;0;L;;;;;N;;;;; +124C3;CUNEIFORM SIGN GA2 TIMES MUSH;Lo;0;L;;;;;N;;;;; +124C4;CUNEIFORM SIGN GA2 TIMES NE;Lo;0;L;;;;;N;;;;; +124C5;CUNEIFORM SIGN GA2 TIMES NE PLUS E2;Lo;0;L;;;;;N;;;;; +124C6;CUNEIFORM SIGN GA2 TIMES NE PLUS GI;Lo;0;L;;;;;N;;;;; +124C7;CUNEIFORM SIGN GA2 TIMES SHIM;Lo;0;L;;;;;N;;;;; +124C8;CUNEIFORM SIGN GA2 TIMES ZIZ2;Lo;0;L;;;;;N;;;;; +124C9;CUNEIFORM SIGN GABA ROTATED NINETY DEGREES;Lo;0;L;;;;;N;;;;; +124CA;CUNEIFORM SIGN GESHTIN TIMES U;Lo;0;L;;;;;N;;;;; +124CB;CUNEIFORM SIGN GISH TIMES GISH CROSSING GISH;Lo;0;L;;;;;N;;;;; +124CC;CUNEIFORM SIGN GU2 TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +124CD;CUNEIFORM SIGN GUD PLUS GISH TIMES TAK4;Lo;0;L;;;;;N;;;;; +124CE;CUNEIFORM SIGN HA TENU GUNU;Lo;0;L;;;;;N;;;;; +124CF;CUNEIFORM SIGN HI TIMES ASH OVER HI TIMES ASH;Lo;0;L;;;;;N;;;;; +124D0;CUNEIFORM SIGN KA TIMES BU;Lo;0;L;;;;;N;;;;; +124D1;CUNEIFORM SIGN KA TIMES KA;Lo;0;L;;;;;N;;;;; +124D2;CUNEIFORM SIGN KA TIMES U U U;Lo;0;L;;;;;N;;;;; +124D3;CUNEIFORM SIGN KA TIMES UR;Lo;0;L;;;;;N;;;;; +124D4;CUNEIFORM SIGN LAGAB TIMES ZU OVER ZU;Lo;0;L;;;;;N;;;;; +124D5;CUNEIFORM SIGN LAK-003;Lo;0;L;;;;;N;;;;; +124D6;CUNEIFORM SIGN LAK-021;Lo;0;L;;;;;N;;;;; +124D7;CUNEIFORM SIGN LAK-025;Lo;0;L;;;;;N;;;;; +124D8;CUNEIFORM SIGN LAK-030;Lo;0;L;;;;;N;;;;; +124D9;CUNEIFORM SIGN LAK-050;Lo;0;L;;;;;N;;;;; +124DA;CUNEIFORM SIGN LAK-051;Lo;0;L;;;;;N;;;;; +124DB;CUNEIFORM SIGN LAK-062;Lo;0;L;;;;;N;;;;; +124DC;CUNEIFORM SIGN LAK-079 OVER LAK-079 GUNU;Lo;0;L;;;;;N;;;;; +124DD;CUNEIFORM SIGN LAK-080;Lo;0;L;;;;;N;;;;; +124DE;CUNEIFORM SIGN LAK-081 OVER LAK-081;Lo;0;L;;;;;N;;;;; +124DF;CUNEIFORM SIGN LAK-092;Lo;0;L;;;;;N;;;;; +124E0;CUNEIFORM SIGN LAK-130;Lo;0;L;;;;;N;;;;; +124E1;CUNEIFORM SIGN LAK-142;Lo;0;L;;;;;N;;;;; +124E2;CUNEIFORM SIGN LAK-210;Lo;0;L;;;;;N;;;;; +124E3;CUNEIFORM SIGN LAK-219;Lo;0;L;;;;;N;;;;; +124E4;CUNEIFORM SIGN LAK-220;Lo;0;L;;;;;N;;;;; +124E5;CUNEIFORM SIGN LAK-225;Lo;0;L;;;;;N;;;;; +124E6;CUNEIFORM SIGN LAK-228;Lo;0;L;;;;;N;;;;; +124E7;CUNEIFORM SIGN LAK-238;Lo;0;L;;;;;N;;;;; +124E8;CUNEIFORM SIGN LAK-265;Lo;0;L;;;;;N;;;;; +124E9;CUNEIFORM SIGN LAK-266;Lo;0;L;;;;;N;;;;; +124EA;CUNEIFORM SIGN LAK-343;Lo;0;L;;;;;N;;;;; +124EB;CUNEIFORM SIGN LAK-347;Lo;0;L;;;;;N;;;;; +124EC;CUNEIFORM SIGN LAK-348;Lo;0;L;;;;;N;;;;; +124ED;CUNEIFORM SIGN LAK-383;Lo;0;L;;;;;N;;;;; +124EE;CUNEIFORM SIGN LAK-384;Lo;0;L;;;;;N;;;;; +124EF;CUNEIFORM SIGN LAK-390;Lo;0;L;;;;;N;;;;; +124F0;CUNEIFORM SIGN LAK-441;Lo;0;L;;;;;N;;;;; +124F1;CUNEIFORM SIGN LAK-449;Lo;0;L;;;;;N;;;;; +124F2;CUNEIFORM SIGN LAK-449 TIMES GU;Lo;0;L;;;;;N;;;;; +124F3;CUNEIFORM SIGN LAK-449 TIMES IGI;Lo;0;L;;;;;N;;;;; +124F4;CUNEIFORM SIGN LAK-449 TIMES PAP PLUS LU3;Lo;0;L;;;;;N;;;;; +124F5;CUNEIFORM SIGN LAK-449 TIMES PAP PLUS PAP PLUS LU3;Lo;0;L;;;;;N;;;;; +124F6;CUNEIFORM SIGN LAK-449 TIMES U2 PLUS BA;Lo;0;L;;;;;N;;;;; +124F7;CUNEIFORM SIGN LAK-450;Lo;0;L;;;;;N;;;;; +124F8;CUNEIFORM SIGN LAK-457;Lo;0;L;;;;;N;;;;; +124F9;CUNEIFORM SIGN LAK-470;Lo;0;L;;;;;N;;;;; +124FA;CUNEIFORM SIGN LAK-483;Lo;0;L;;;;;N;;;;; +124FB;CUNEIFORM SIGN LAK-490;Lo;0;L;;;;;N;;;;; +124FC;CUNEIFORM SIGN LAK-492;Lo;0;L;;;;;N;;;;; +124FD;CUNEIFORM SIGN LAK-493;Lo;0;L;;;;;N;;;;; +124FE;CUNEIFORM SIGN LAK-495;Lo;0;L;;;;;N;;;;; +124FF;CUNEIFORM SIGN LAK-550;Lo;0;L;;;;;N;;;;; +12500;CUNEIFORM SIGN LAK-608;Lo;0;L;;;;;N;;;;; +12501;CUNEIFORM SIGN LAK-617;Lo;0;L;;;;;N;;;;; +12502;CUNEIFORM SIGN LAK-617 TIMES ASH;Lo;0;L;;;;;N;;;;; +12503;CUNEIFORM SIGN LAK-617 TIMES BAD;Lo;0;L;;;;;N;;;;; +12504;CUNEIFORM SIGN LAK-617 TIMES DUN3 GUNU GUNU;Lo;0;L;;;;;N;;;;; +12505;CUNEIFORM SIGN LAK-617 TIMES KU3;Lo;0;L;;;;;N;;;;; +12506;CUNEIFORM SIGN LAK-617 TIMES LA;Lo;0;L;;;;;N;;;;; +12507;CUNEIFORM SIGN LAK-617 TIMES TAR;Lo;0;L;;;;;N;;;;; +12508;CUNEIFORM SIGN LAK-617 TIMES TE;Lo;0;L;;;;;N;;;;; +12509;CUNEIFORM SIGN LAK-617 TIMES U2;Lo;0;L;;;;;N;;;;; +1250A;CUNEIFORM SIGN LAK-617 TIMES UD;Lo;0;L;;;;;N;;;;; +1250B;CUNEIFORM SIGN LAK-617 TIMES URUDA;Lo;0;L;;;;;N;;;;; +1250C;CUNEIFORM SIGN LAK-636;Lo;0;L;;;;;N;;;;; +1250D;CUNEIFORM SIGN LAK-648;Lo;0;L;;;;;N;;;;; +1250E;CUNEIFORM SIGN LAK-648 TIMES DUB;Lo;0;L;;;;;N;;;;; +1250F;CUNEIFORM SIGN LAK-648 TIMES GA;Lo;0;L;;;;;N;;;;; +12510;CUNEIFORM SIGN LAK-648 TIMES IGI;Lo;0;L;;;;;N;;;;; +12511;CUNEIFORM SIGN LAK-648 TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +12512;CUNEIFORM SIGN LAK-648 TIMES NI;Lo;0;L;;;;;N;;;;; +12513;CUNEIFORM SIGN LAK-648 TIMES PAP PLUS PAP PLUS LU3;Lo;0;L;;;;;N;;;;; +12514;CUNEIFORM SIGN LAK-648 TIMES SHESH PLUS KI;Lo;0;L;;;;;N;;;;; +12515;CUNEIFORM SIGN LAK-648 TIMES UD;Lo;0;L;;;;;N;;;;; +12516;CUNEIFORM SIGN LAK-648 TIMES URUDA;Lo;0;L;;;;;N;;;;; +12517;CUNEIFORM SIGN LAK-724;Lo;0;L;;;;;N;;;;; +12518;CUNEIFORM SIGN LAK-749;Lo;0;L;;;;;N;;;;; +12519;CUNEIFORM SIGN LU2 GUNU TIMES ASH;Lo;0;L;;;;;N;;;;; +1251A;CUNEIFORM SIGN LU2 TIMES DISH;Lo;0;L;;;;;N;;;;; +1251B;CUNEIFORM SIGN LU2 TIMES HAL;Lo;0;L;;;;;N;;;;; +1251C;CUNEIFORM SIGN LU2 TIMES PAP;Lo;0;L;;;;;N;;;;; +1251D;CUNEIFORM SIGN LU2 TIMES PAP PLUS PAP PLUS LU3;Lo;0;L;;;;;N;;;;; +1251E;CUNEIFORM SIGN LU2 TIMES TAK4;Lo;0;L;;;;;N;;;;; +1251F;CUNEIFORM SIGN MI PLUS ZA7;Lo;0;L;;;;;N;;;;; +12520;CUNEIFORM SIGN MUSH OVER MUSH TIMES GA;Lo;0;L;;;;;N;;;;; +12521;CUNEIFORM SIGN MUSH OVER MUSH TIMES KAK;Lo;0;L;;;;;N;;;;; +12522;CUNEIFORM SIGN NINDA2 TIMES DIM GUNU;Lo;0;L;;;;;N;;;;; +12523;CUNEIFORM SIGN NINDA2 TIMES GISH;Lo;0;L;;;;;N;;;;; +12524;CUNEIFORM SIGN NINDA2 TIMES GUL;Lo;0;L;;;;;N;;;;; +12525;CUNEIFORM SIGN NINDA2 TIMES HI;Lo;0;L;;;;;N;;;;; +12526;CUNEIFORM SIGN NINDA2 TIMES KESH2;Lo;0;L;;;;;N;;;;; +12527;CUNEIFORM SIGN NINDA2 TIMES LAK-050;Lo;0;L;;;;;N;;;;; +12528;CUNEIFORM SIGN NINDA2 TIMES MASH;Lo;0;L;;;;;N;;;;; +12529;CUNEIFORM SIGN NINDA2 TIMES PAP PLUS PAP;Lo;0;L;;;;;N;;;;; +1252A;CUNEIFORM SIGN NINDA2 TIMES U;Lo;0;L;;;;;N;;;;; +1252B;CUNEIFORM SIGN NINDA2 TIMES U PLUS U;Lo;0;L;;;;;N;;;;; +1252C;CUNEIFORM SIGN NINDA2 TIMES URUDA;Lo;0;L;;;;;N;;;;; +1252D;CUNEIFORM SIGN SAG GUNU TIMES HA;Lo;0;L;;;;;N;;;;; +1252E;CUNEIFORM SIGN SAG TIMES EN;Lo;0;L;;;;;N;;;;; +1252F;CUNEIFORM SIGN SAG TIMES SHE AT LEFT;Lo;0;L;;;;;N;;;;; +12530;CUNEIFORM SIGN SAG TIMES TAK4;Lo;0;L;;;;;N;;;;; +12531;CUNEIFORM SIGN SHA6 TENU;Lo;0;L;;;;;N;;;;; +12532;CUNEIFORM SIGN SHE OVER SHE;Lo;0;L;;;;;N;;;;; +12533;CUNEIFORM SIGN SHE PLUS HUB2;Lo;0;L;;;;;N;;;;; +12534;CUNEIFORM SIGN SHE PLUS NAM2;Lo;0;L;;;;;N;;;;; +12535;CUNEIFORM SIGN SHE PLUS SAR;Lo;0;L;;;;;N;;;;; +12536;CUNEIFORM SIGN SHU2 PLUS DUG TIMES NI;Lo;0;L;;;;;N;;;;; +12537;CUNEIFORM SIGN SHU2 PLUS E2 TIMES AN;Lo;0;L;;;;;N;;;;; +12538;CUNEIFORM SIGN SI TIMES TAK4;Lo;0;L;;;;;N;;;;; +12539;CUNEIFORM SIGN TAK4 PLUS SAG;Lo;0;L;;;;;N;;;;; +1253A;CUNEIFORM SIGN TUM TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; +1253B;CUNEIFORM SIGN TUM TIMES THREE DISH;Lo;0;L;;;;;N;;;;; +1253C;CUNEIFORM SIGN UR2 INVERTED;Lo;0;L;;;;;N;;;;; +1253D;CUNEIFORM SIGN UR2 TIMES UD;Lo;0;L;;;;;N;;;;; +1253E;CUNEIFORM SIGN URU TIMES DARA3;Lo;0;L;;;;;N;;;;; +1253F;CUNEIFORM SIGN URU TIMES LAK-668;Lo;0;L;;;;;N;;;;; +12540;CUNEIFORM SIGN URU TIMES LU3;Lo;0;L;;;;;N;;;;; +12541;CUNEIFORM SIGN ZA7;Lo;0;L;;;;;N;;;;; +12542;CUNEIFORM SIGN ZU OVER ZU PLUS SAR;Lo;0;L;;;;;N;;;;; +12543;CUNEIFORM SIGN ZU5 TIMES THREE DISH TENU;Lo;0;L;;;;;N;;;;; +13000;EGYPTIAN HIEROGLYPH A001;Lo;0;L;;;;;N;;;;; +13001;EGYPTIAN HIEROGLYPH A002;Lo;0;L;;;;;N;;;;; +13002;EGYPTIAN HIEROGLYPH A003;Lo;0;L;;;;;N;;;;; +13003;EGYPTIAN HIEROGLYPH A004;Lo;0;L;;;;;N;;;;; +13004;EGYPTIAN HIEROGLYPH A005;Lo;0;L;;;;;N;;;;; +13005;EGYPTIAN HIEROGLYPH A005A;Lo;0;L;;;;;N;;;;; +13006;EGYPTIAN HIEROGLYPH A006;Lo;0;L;;;;;N;;;;; +13007;EGYPTIAN HIEROGLYPH A006A;Lo;0;L;;;;;N;;;;; +13008;EGYPTIAN HIEROGLYPH A006B;Lo;0;L;;;;;N;;;;; +13009;EGYPTIAN HIEROGLYPH A007;Lo;0;L;;;;;N;;;;; +1300A;EGYPTIAN HIEROGLYPH A008;Lo;0;L;;;;;N;;;;; +1300B;EGYPTIAN HIEROGLYPH A009;Lo;0;L;;;;;N;;;;; +1300C;EGYPTIAN HIEROGLYPH A010;Lo;0;L;;;;;N;;;;; +1300D;EGYPTIAN HIEROGLYPH A011;Lo;0;L;;;;;N;;;;; +1300E;EGYPTIAN HIEROGLYPH A012;Lo;0;L;;;;;N;;;;; +1300F;EGYPTIAN HIEROGLYPH A013;Lo;0;L;;;;;N;;;;; +13010;EGYPTIAN HIEROGLYPH A014;Lo;0;L;;;;;N;;;;; +13011;EGYPTIAN HIEROGLYPH A014A;Lo;0;L;;;;;N;;;;; +13012;EGYPTIAN HIEROGLYPH A015;Lo;0;L;;;;;N;;;;; +13013;EGYPTIAN HIEROGLYPH A016;Lo;0;L;;;;;N;;;;; +13014;EGYPTIAN HIEROGLYPH A017;Lo;0;L;;;;;N;;;;; +13015;EGYPTIAN HIEROGLYPH A017A;Lo;0;L;;;;;N;;;;; +13016;EGYPTIAN HIEROGLYPH A018;Lo;0;L;;;;;N;;;;; +13017;EGYPTIAN HIEROGLYPH A019;Lo;0;L;;;;;N;;;;; +13018;EGYPTIAN HIEROGLYPH A020;Lo;0;L;;;;;N;;;;; +13019;EGYPTIAN HIEROGLYPH A021;Lo;0;L;;;;;N;;;;; +1301A;EGYPTIAN HIEROGLYPH A022;Lo;0;L;;;;;N;;;;; +1301B;EGYPTIAN HIEROGLYPH A023;Lo;0;L;;;;;N;;;;; +1301C;EGYPTIAN HIEROGLYPH A024;Lo;0;L;;;;;N;;;;; +1301D;EGYPTIAN HIEROGLYPH A025;Lo;0;L;;;;;N;;;;; +1301E;EGYPTIAN HIEROGLYPH A026;Lo;0;L;;;;;N;;;;; +1301F;EGYPTIAN HIEROGLYPH A027;Lo;0;L;;;;;N;;;;; +13020;EGYPTIAN HIEROGLYPH A028;Lo;0;L;;;;;N;;;;; +13021;EGYPTIAN HIEROGLYPH A029;Lo;0;L;;;;;N;;;;; +13022;EGYPTIAN HIEROGLYPH A030;Lo;0;L;;;;;N;;;;; +13023;EGYPTIAN HIEROGLYPH A031;Lo;0;L;;;;;N;;;;; +13024;EGYPTIAN HIEROGLYPH A032;Lo;0;L;;;;;N;;;;; +13025;EGYPTIAN HIEROGLYPH A032A;Lo;0;L;;;;;N;;;;; +13026;EGYPTIAN HIEROGLYPH A033;Lo;0;L;;;;;N;;;;; +13027;EGYPTIAN HIEROGLYPH A034;Lo;0;L;;;;;N;;;;; +13028;EGYPTIAN HIEROGLYPH A035;Lo;0;L;;;;;N;;;;; +13029;EGYPTIAN HIEROGLYPH A036;Lo;0;L;;;;;N;;;;; +1302A;EGYPTIAN HIEROGLYPH A037;Lo;0;L;;;;;N;;;;; +1302B;EGYPTIAN HIEROGLYPH A038;Lo;0;L;;;;;N;;;;; +1302C;EGYPTIAN HIEROGLYPH A039;Lo;0;L;;;;;N;;;;; +1302D;EGYPTIAN HIEROGLYPH A040;Lo;0;L;;;;;N;;;;; +1302E;EGYPTIAN HIEROGLYPH A040A;Lo;0;L;;;;;N;;;;; +1302F;EGYPTIAN HIEROGLYPH A041;Lo;0;L;;;;;N;;;;; +13030;EGYPTIAN HIEROGLYPH A042;Lo;0;L;;;;;N;;;;; +13031;EGYPTIAN HIEROGLYPH A042A;Lo;0;L;;;;;N;;;;; +13032;EGYPTIAN HIEROGLYPH A043;Lo;0;L;;;;;N;;;;; +13033;EGYPTIAN HIEROGLYPH A043A;Lo;0;L;;;;;N;;;;; +13034;EGYPTIAN HIEROGLYPH A044;Lo;0;L;;;;;N;;;;; +13035;EGYPTIAN HIEROGLYPH A045;Lo;0;L;;;;;N;;;;; +13036;EGYPTIAN HIEROGLYPH A045A;Lo;0;L;;;;;N;;;;; +13037;EGYPTIAN HIEROGLYPH A046;Lo;0;L;;;;;N;;;;; +13038;EGYPTIAN HIEROGLYPH A047;Lo;0;L;;;;;N;;;;; +13039;EGYPTIAN HIEROGLYPH A048;Lo;0;L;;;;;N;;;;; +1303A;EGYPTIAN HIEROGLYPH A049;Lo;0;L;;;;;N;;;;; +1303B;EGYPTIAN HIEROGLYPH A050;Lo;0;L;;;;;N;;;;; +1303C;EGYPTIAN HIEROGLYPH A051;Lo;0;L;;;;;N;;;;; +1303D;EGYPTIAN HIEROGLYPH A052;Lo;0;L;;;;;N;;;;; +1303E;EGYPTIAN HIEROGLYPH A053;Lo;0;L;;;;;N;;;;; +1303F;EGYPTIAN HIEROGLYPH A054;Lo;0;L;;;;;N;;;;; +13040;EGYPTIAN HIEROGLYPH A055;Lo;0;L;;;;;N;;;;; +13041;EGYPTIAN HIEROGLYPH A056;Lo;0;L;;;;;N;;;;; +13042;EGYPTIAN HIEROGLYPH A057;Lo;0;L;;;;;N;;;;; +13043;EGYPTIAN HIEROGLYPH A058;Lo;0;L;;;;;N;;;;; +13044;EGYPTIAN HIEROGLYPH A059;Lo;0;L;;;;;N;;;;; +13045;EGYPTIAN HIEROGLYPH A060;Lo;0;L;;;;;N;;;;; +13046;EGYPTIAN HIEROGLYPH A061;Lo;0;L;;;;;N;;;;; +13047;EGYPTIAN HIEROGLYPH A062;Lo;0;L;;;;;N;;;;; +13048;EGYPTIAN HIEROGLYPH A063;Lo;0;L;;;;;N;;;;; +13049;EGYPTIAN HIEROGLYPH A064;Lo;0;L;;;;;N;;;;; +1304A;EGYPTIAN HIEROGLYPH A065;Lo;0;L;;;;;N;;;;; +1304B;EGYPTIAN HIEROGLYPH A066;Lo;0;L;;;;;N;;;;; +1304C;EGYPTIAN HIEROGLYPH A067;Lo;0;L;;;;;N;;;;; +1304D;EGYPTIAN HIEROGLYPH A068;Lo;0;L;;;;;N;;;;; +1304E;EGYPTIAN HIEROGLYPH A069;Lo;0;L;;;;;N;;;;; +1304F;EGYPTIAN HIEROGLYPH A070;Lo;0;L;;;;;N;;;;; +13050;EGYPTIAN HIEROGLYPH B001;Lo;0;L;;;;;N;;;;; +13051;EGYPTIAN HIEROGLYPH B002;Lo;0;L;;;;;N;;;;; +13052;EGYPTIAN HIEROGLYPH B003;Lo;0;L;;;;;N;;;;; +13053;EGYPTIAN HIEROGLYPH B004;Lo;0;L;;;;;N;;;;; +13054;EGYPTIAN HIEROGLYPH B005;Lo;0;L;;;;;N;;;;; +13055;EGYPTIAN HIEROGLYPH B005A;Lo;0;L;;;;;N;;;;; +13056;EGYPTIAN HIEROGLYPH B006;Lo;0;L;;;;;N;;;;; +13057;EGYPTIAN HIEROGLYPH B007;Lo;0;L;;;;;N;;;;; +13058;EGYPTIAN HIEROGLYPH B008;Lo;0;L;;;;;N;;;;; +13059;EGYPTIAN HIEROGLYPH B009;Lo;0;L;;;;;N;;;;; +1305A;EGYPTIAN HIEROGLYPH C001;Lo;0;L;;;;;N;;;;; +1305B;EGYPTIAN HIEROGLYPH C002;Lo;0;L;;;;;N;;;;; +1305C;EGYPTIAN HIEROGLYPH C002A;Lo;0;L;;;;;N;;;;; +1305D;EGYPTIAN HIEROGLYPH C002B;Lo;0;L;;;;;N;;;;; +1305E;EGYPTIAN HIEROGLYPH C002C;Lo;0;L;;;;;N;;;;; +1305F;EGYPTIAN HIEROGLYPH C003;Lo;0;L;;;;;N;;;;; +13060;EGYPTIAN HIEROGLYPH C004;Lo;0;L;;;;;N;;;;; +13061;EGYPTIAN HIEROGLYPH C005;Lo;0;L;;;;;N;;;;; +13062;EGYPTIAN HIEROGLYPH C006;Lo;0;L;;;;;N;;;;; +13063;EGYPTIAN HIEROGLYPH C007;Lo;0;L;;;;;N;;;;; +13064;EGYPTIAN HIEROGLYPH C008;Lo;0;L;;;;;N;;;;; +13065;EGYPTIAN HIEROGLYPH C009;Lo;0;L;;;;;N;;;;; +13066;EGYPTIAN HIEROGLYPH C010;Lo;0;L;;;;;N;;;;; +13067;EGYPTIAN HIEROGLYPH C010A;Lo;0;L;;;;;N;;;;; +13068;EGYPTIAN HIEROGLYPH C011;Lo;0;L;;;;;N;;;;; +13069;EGYPTIAN HIEROGLYPH C012;Lo;0;L;;;;;N;;;;; +1306A;EGYPTIAN HIEROGLYPH C013;Lo;0;L;;;;;N;;;;; +1306B;EGYPTIAN HIEROGLYPH C014;Lo;0;L;;;;;N;;;;; +1306C;EGYPTIAN HIEROGLYPH C015;Lo;0;L;;;;;N;;;;; +1306D;EGYPTIAN HIEROGLYPH C016;Lo;0;L;;;;;N;;;;; +1306E;EGYPTIAN HIEROGLYPH C017;Lo;0;L;;;;;N;;;;; +1306F;EGYPTIAN HIEROGLYPH C018;Lo;0;L;;;;;N;;;;; +13070;EGYPTIAN HIEROGLYPH C019;Lo;0;L;;;;;N;;;;; +13071;EGYPTIAN HIEROGLYPH C020;Lo;0;L;;;;;N;;;;; +13072;EGYPTIAN HIEROGLYPH C021;Lo;0;L;;;;;N;;;;; +13073;EGYPTIAN HIEROGLYPH C022;Lo;0;L;;;;;N;;;;; +13074;EGYPTIAN HIEROGLYPH C023;Lo;0;L;;;;;N;;;;; +13075;EGYPTIAN HIEROGLYPH C024;Lo;0;L;;;;;N;;;;; +13076;EGYPTIAN HIEROGLYPH D001;Lo;0;L;;;;;N;;;;; +13077;EGYPTIAN HIEROGLYPH D002;Lo;0;L;;;;;N;;;;; +13078;EGYPTIAN HIEROGLYPH D003;Lo;0;L;;;;;N;;;;; +13079;EGYPTIAN HIEROGLYPH D004;Lo;0;L;;;;;N;;;;; +1307A;EGYPTIAN HIEROGLYPH D005;Lo;0;L;;;;;N;;;;; +1307B;EGYPTIAN HIEROGLYPH D006;Lo;0;L;;;;;N;;;;; +1307C;EGYPTIAN HIEROGLYPH D007;Lo;0;L;;;;;N;;;;; +1307D;EGYPTIAN HIEROGLYPH D008;Lo;0;L;;;;;N;;;;; +1307E;EGYPTIAN HIEROGLYPH D008A;Lo;0;L;;;;;N;;;;; +1307F;EGYPTIAN HIEROGLYPH D009;Lo;0;L;;;;;N;;;;; +13080;EGYPTIAN HIEROGLYPH D010;Lo;0;L;;;;;N;;;;; +13081;EGYPTIAN HIEROGLYPH D011;Lo;0;L;;;;;N;;;;; +13082;EGYPTIAN HIEROGLYPH D012;Lo;0;L;;;;;N;;;;; +13083;EGYPTIAN HIEROGLYPH D013;Lo;0;L;;;;;N;;;;; +13084;EGYPTIAN HIEROGLYPH D014;Lo;0;L;;;;;N;;;;; +13085;EGYPTIAN HIEROGLYPH D015;Lo;0;L;;;;;N;;;;; +13086;EGYPTIAN HIEROGLYPH D016;Lo;0;L;;;;;N;;;;; +13087;EGYPTIAN HIEROGLYPH D017;Lo;0;L;;;;;N;;;;; +13088;EGYPTIAN HIEROGLYPH D018;Lo;0;L;;;;;N;;;;; +13089;EGYPTIAN HIEROGLYPH D019;Lo;0;L;;;;;N;;;;; +1308A;EGYPTIAN HIEROGLYPH D020;Lo;0;L;;;;;N;;;;; +1308B;EGYPTIAN HIEROGLYPH D021;Lo;0;L;;;;;N;;;;; +1308C;EGYPTIAN HIEROGLYPH D022;Lo;0;L;;;;;N;;;;; +1308D;EGYPTIAN HIEROGLYPH D023;Lo;0;L;;;;;N;;;;; +1308E;EGYPTIAN HIEROGLYPH D024;Lo;0;L;;;;;N;;;;; +1308F;EGYPTIAN HIEROGLYPH D025;Lo;0;L;;;;;N;;;;; +13090;EGYPTIAN HIEROGLYPH D026;Lo;0;L;;;;;N;;;;; +13091;EGYPTIAN HIEROGLYPH D027;Lo;0;L;;;;;N;;;;; +13092;EGYPTIAN HIEROGLYPH D027A;Lo;0;L;;;;;N;;;;; +13093;EGYPTIAN HIEROGLYPH D028;Lo;0;L;;;;;N;;;;; +13094;EGYPTIAN HIEROGLYPH D029;Lo;0;L;;;;;N;;;;; +13095;EGYPTIAN HIEROGLYPH D030;Lo;0;L;;;;;N;;;;; +13096;EGYPTIAN HIEROGLYPH D031;Lo;0;L;;;;;N;;;;; +13097;EGYPTIAN HIEROGLYPH D031A;Lo;0;L;;;;;N;;;;; +13098;EGYPTIAN HIEROGLYPH D032;Lo;0;L;;;;;N;;;;; +13099;EGYPTIAN HIEROGLYPH D033;Lo;0;L;;;;;N;;;;; +1309A;EGYPTIAN HIEROGLYPH D034;Lo;0;L;;;;;N;;;;; +1309B;EGYPTIAN HIEROGLYPH D034A;Lo;0;L;;;;;N;;;;; +1309C;EGYPTIAN HIEROGLYPH D035;Lo;0;L;;;;;N;;;;; +1309D;EGYPTIAN HIEROGLYPH D036;Lo;0;L;;;;;N;;;;; +1309E;EGYPTIAN HIEROGLYPH D037;Lo;0;L;;;;;N;;;;; +1309F;EGYPTIAN HIEROGLYPH D038;Lo;0;L;;;;;N;;;;; +130A0;EGYPTIAN HIEROGLYPH D039;Lo;0;L;;;;;N;;;;; +130A1;EGYPTIAN HIEROGLYPH D040;Lo;0;L;;;;;N;;;;; +130A2;EGYPTIAN HIEROGLYPH D041;Lo;0;L;;;;;N;;;;; +130A3;EGYPTIAN HIEROGLYPH D042;Lo;0;L;;;;;N;;;;; +130A4;EGYPTIAN HIEROGLYPH D043;Lo;0;L;;;;;N;;;;; +130A5;EGYPTIAN HIEROGLYPH D044;Lo;0;L;;;;;N;;;;; +130A6;EGYPTIAN HIEROGLYPH D045;Lo;0;L;;;;;N;;;;; +130A7;EGYPTIAN HIEROGLYPH D046;Lo;0;L;;;;;N;;;;; +130A8;EGYPTIAN HIEROGLYPH D046A;Lo;0;L;;;;;N;;;;; +130A9;EGYPTIAN HIEROGLYPH D047;Lo;0;L;;;;;N;;;;; +130AA;EGYPTIAN HIEROGLYPH D048;Lo;0;L;;;;;N;;;;; +130AB;EGYPTIAN HIEROGLYPH D048A;Lo;0;L;;;;;N;;;;; +130AC;EGYPTIAN HIEROGLYPH D049;Lo;0;L;;;;;N;;;;; +130AD;EGYPTIAN HIEROGLYPH D050;Lo;0;L;;;;;N;;;;; +130AE;EGYPTIAN HIEROGLYPH D050A;Lo;0;L;;;;;N;;;;; +130AF;EGYPTIAN HIEROGLYPH D050B;Lo;0;L;;;;;N;;;;; +130B0;EGYPTIAN HIEROGLYPH D050C;Lo;0;L;;;;;N;;;;; +130B1;EGYPTIAN HIEROGLYPH D050D;Lo;0;L;;;;;N;;;;; +130B2;EGYPTIAN HIEROGLYPH D050E;Lo;0;L;;;;;N;;;;; +130B3;EGYPTIAN HIEROGLYPH D050F;Lo;0;L;;;;;N;;;;; +130B4;EGYPTIAN HIEROGLYPH D050G;Lo;0;L;;;;;N;;;;; +130B5;EGYPTIAN HIEROGLYPH D050H;Lo;0;L;;;;;N;;;;; +130B6;EGYPTIAN HIEROGLYPH D050I;Lo;0;L;;;;;N;;;;; +130B7;EGYPTIAN HIEROGLYPH D051;Lo;0;L;;;;;N;;;;; +130B8;EGYPTIAN HIEROGLYPH D052;Lo;0;L;;;;;N;;;;; +130B9;EGYPTIAN HIEROGLYPH D052A;Lo;0;L;;;;;N;;;;; +130BA;EGYPTIAN HIEROGLYPH D053;Lo;0;L;;;;;N;;;;; +130BB;EGYPTIAN HIEROGLYPH D054;Lo;0;L;;;;;N;;;;; +130BC;EGYPTIAN HIEROGLYPH D054A;Lo;0;L;;;;;N;;;;; +130BD;EGYPTIAN HIEROGLYPH D055;Lo;0;L;;;;;N;;;;; +130BE;EGYPTIAN HIEROGLYPH D056;Lo;0;L;;;;;N;;;;; +130BF;EGYPTIAN HIEROGLYPH D057;Lo;0;L;;;;;N;;;;; +130C0;EGYPTIAN HIEROGLYPH D058;Lo;0;L;;;;;N;;;;; +130C1;EGYPTIAN HIEROGLYPH D059;Lo;0;L;;;;;N;;;;; +130C2;EGYPTIAN HIEROGLYPH D060;Lo;0;L;;;;;N;;;;; +130C3;EGYPTIAN HIEROGLYPH D061;Lo;0;L;;;;;N;;;;; +130C4;EGYPTIAN HIEROGLYPH D062;Lo;0;L;;;;;N;;;;; +130C5;EGYPTIAN HIEROGLYPH D063;Lo;0;L;;;;;N;;;;; +130C6;EGYPTIAN HIEROGLYPH D064;Lo;0;L;;;;;N;;;;; +130C7;EGYPTIAN HIEROGLYPH D065;Lo;0;L;;;;;N;;;;; +130C8;EGYPTIAN HIEROGLYPH D066;Lo;0;L;;;;;N;;;;; +130C9;EGYPTIAN HIEROGLYPH D067;Lo;0;L;;;;;N;;;;; +130CA;EGYPTIAN HIEROGLYPH D067A;Lo;0;L;;;;;N;;;;; +130CB;EGYPTIAN HIEROGLYPH D067B;Lo;0;L;;;;;N;;;;; +130CC;EGYPTIAN HIEROGLYPH D067C;Lo;0;L;;;;;N;;;;; +130CD;EGYPTIAN HIEROGLYPH D067D;Lo;0;L;;;;;N;;;;; +130CE;EGYPTIAN HIEROGLYPH D067E;Lo;0;L;;;;;N;;;;; +130CF;EGYPTIAN HIEROGLYPH D067F;Lo;0;L;;;;;N;;;;; +130D0;EGYPTIAN HIEROGLYPH D067G;Lo;0;L;;;;;N;;;;; +130D1;EGYPTIAN HIEROGLYPH D067H;Lo;0;L;;;;;N;;;;; +130D2;EGYPTIAN HIEROGLYPH E001;Lo;0;L;;;;;N;;;;; +130D3;EGYPTIAN HIEROGLYPH E002;Lo;0;L;;;;;N;;;;; +130D4;EGYPTIAN HIEROGLYPH E003;Lo;0;L;;;;;N;;;;; +130D5;EGYPTIAN HIEROGLYPH E004;Lo;0;L;;;;;N;;;;; +130D6;EGYPTIAN HIEROGLYPH E005;Lo;0;L;;;;;N;;;;; +130D7;EGYPTIAN HIEROGLYPH E006;Lo;0;L;;;;;N;;;;; +130D8;EGYPTIAN HIEROGLYPH E007;Lo;0;L;;;;;N;;;;; +130D9;EGYPTIAN HIEROGLYPH E008;Lo;0;L;;;;;N;;;;; +130DA;EGYPTIAN HIEROGLYPH E008A;Lo;0;L;;;;;N;;;;; +130DB;EGYPTIAN HIEROGLYPH E009;Lo;0;L;;;;;N;;;;; +130DC;EGYPTIAN HIEROGLYPH E009A;Lo;0;L;;;;;N;;;;; +130DD;EGYPTIAN HIEROGLYPH E010;Lo;0;L;;;;;N;;;;; +130DE;EGYPTIAN HIEROGLYPH E011;Lo;0;L;;;;;N;;;;; +130DF;EGYPTIAN HIEROGLYPH E012;Lo;0;L;;;;;N;;;;; +130E0;EGYPTIAN HIEROGLYPH E013;Lo;0;L;;;;;N;;;;; +130E1;EGYPTIAN HIEROGLYPH E014;Lo;0;L;;;;;N;;;;; +130E2;EGYPTIAN HIEROGLYPH E015;Lo;0;L;;;;;N;;;;; +130E3;EGYPTIAN HIEROGLYPH E016;Lo;0;L;;;;;N;;;;; +130E4;EGYPTIAN HIEROGLYPH E016A;Lo;0;L;;;;;N;;;;; +130E5;EGYPTIAN HIEROGLYPH E017;Lo;0;L;;;;;N;;;;; +130E6;EGYPTIAN HIEROGLYPH E017A;Lo;0;L;;;;;N;;;;; +130E7;EGYPTIAN HIEROGLYPH E018;Lo;0;L;;;;;N;;;;; +130E8;EGYPTIAN HIEROGLYPH E019;Lo;0;L;;;;;N;;;;; +130E9;EGYPTIAN HIEROGLYPH E020;Lo;0;L;;;;;N;;;;; +130EA;EGYPTIAN HIEROGLYPH E020A;Lo;0;L;;;;;N;;;;; +130EB;EGYPTIAN HIEROGLYPH E021;Lo;0;L;;;;;N;;;;; +130EC;EGYPTIAN HIEROGLYPH E022;Lo;0;L;;;;;N;;;;; +130ED;EGYPTIAN HIEROGLYPH E023;Lo;0;L;;;;;N;;;;; +130EE;EGYPTIAN HIEROGLYPH E024;Lo;0;L;;;;;N;;;;; +130EF;EGYPTIAN HIEROGLYPH E025;Lo;0;L;;;;;N;;;;; +130F0;EGYPTIAN HIEROGLYPH E026;Lo;0;L;;;;;N;;;;; +130F1;EGYPTIAN HIEROGLYPH E027;Lo;0;L;;;;;N;;;;; +130F2;EGYPTIAN HIEROGLYPH E028;Lo;0;L;;;;;N;;;;; +130F3;EGYPTIAN HIEROGLYPH E028A;Lo;0;L;;;;;N;;;;; +130F4;EGYPTIAN HIEROGLYPH E029;Lo;0;L;;;;;N;;;;; +130F5;EGYPTIAN HIEROGLYPH E030;Lo;0;L;;;;;N;;;;; +130F6;EGYPTIAN HIEROGLYPH E031;Lo;0;L;;;;;N;;;;; +130F7;EGYPTIAN HIEROGLYPH E032;Lo;0;L;;;;;N;;;;; +130F8;EGYPTIAN HIEROGLYPH E033;Lo;0;L;;;;;N;;;;; +130F9;EGYPTIAN HIEROGLYPH E034;Lo;0;L;;;;;N;;;;; +130FA;EGYPTIAN HIEROGLYPH E034A;Lo;0;L;;;;;N;;;;; +130FB;EGYPTIAN HIEROGLYPH E036;Lo;0;L;;;;;N;;;;; +130FC;EGYPTIAN HIEROGLYPH E037;Lo;0;L;;;;;N;;;;; +130FD;EGYPTIAN HIEROGLYPH E038;Lo;0;L;;;;;N;;;;; +130FE;EGYPTIAN HIEROGLYPH F001;Lo;0;L;;;;;N;;;;; +130FF;EGYPTIAN HIEROGLYPH F001A;Lo;0;L;;;;;N;;;;; +13100;EGYPTIAN HIEROGLYPH F002;Lo;0;L;;;;;N;;;;; +13101;EGYPTIAN HIEROGLYPH F003;Lo;0;L;;;;;N;;;;; +13102;EGYPTIAN HIEROGLYPH F004;Lo;0;L;;;;;N;;;;; +13103;EGYPTIAN HIEROGLYPH F005;Lo;0;L;;;;;N;;;;; +13104;EGYPTIAN HIEROGLYPH F006;Lo;0;L;;;;;N;;;;; +13105;EGYPTIAN HIEROGLYPH F007;Lo;0;L;;;;;N;;;;; +13106;EGYPTIAN HIEROGLYPH F008;Lo;0;L;;;;;N;;;;; +13107;EGYPTIAN HIEROGLYPH F009;Lo;0;L;;;;;N;;;;; +13108;EGYPTIAN HIEROGLYPH F010;Lo;0;L;;;;;N;;;;; +13109;EGYPTIAN HIEROGLYPH F011;Lo;0;L;;;;;N;;;;; +1310A;EGYPTIAN HIEROGLYPH F012;Lo;0;L;;;;;N;;;;; +1310B;EGYPTIAN HIEROGLYPH F013;Lo;0;L;;;;;N;;;;; +1310C;EGYPTIAN HIEROGLYPH F013A;Lo;0;L;;;;;N;;;;; +1310D;EGYPTIAN HIEROGLYPH F014;Lo;0;L;;;;;N;;;;; +1310E;EGYPTIAN HIEROGLYPH F015;Lo;0;L;;;;;N;;;;; +1310F;EGYPTIAN HIEROGLYPH F016;Lo;0;L;;;;;N;;;;; +13110;EGYPTIAN HIEROGLYPH F017;Lo;0;L;;;;;N;;;;; +13111;EGYPTIAN HIEROGLYPH F018;Lo;0;L;;;;;N;;;;; +13112;EGYPTIAN HIEROGLYPH F019;Lo;0;L;;;;;N;;;;; +13113;EGYPTIAN HIEROGLYPH F020;Lo;0;L;;;;;N;;;;; +13114;EGYPTIAN HIEROGLYPH F021;Lo;0;L;;;;;N;;;;; +13115;EGYPTIAN HIEROGLYPH F021A;Lo;0;L;;;;;N;;;;; +13116;EGYPTIAN HIEROGLYPH F022;Lo;0;L;;;;;N;;;;; +13117;EGYPTIAN HIEROGLYPH F023;Lo;0;L;;;;;N;;;;; +13118;EGYPTIAN HIEROGLYPH F024;Lo;0;L;;;;;N;;;;; +13119;EGYPTIAN HIEROGLYPH F025;Lo;0;L;;;;;N;;;;; +1311A;EGYPTIAN HIEROGLYPH F026;Lo;0;L;;;;;N;;;;; +1311B;EGYPTIAN HIEROGLYPH F027;Lo;0;L;;;;;N;;;;; +1311C;EGYPTIAN HIEROGLYPH F028;Lo;0;L;;;;;N;;;;; +1311D;EGYPTIAN HIEROGLYPH F029;Lo;0;L;;;;;N;;;;; +1311E;EGYPTIAN HIEROGLYPH F030;Lo;0;L;;;;;N;;;;; +1311F;EGYPTIAN HIEROGLYPH F031;Lo;0;L;;;;;N;;;;; +13120;EGYPTIAN HIEROGLYPH F031A;Lo;0;L;;;;;N;;;;; +13121;EGYPTIAN HIEROGLYPH F032;Lo;0;L;;;;;N;;;;; +13122;EGYPTIAN HIEROGLYPH F033;Lo;0;L;;;;;N;;;;; +13123;EGYPTIAN HIEROGLYPH F034;Lo;0;L;;;;;N;;;;; +13124;EGYPTIAN HIEROGLYPH F035;Lo;0;L;;;;;N;;;;; +13125;EGYPTIAN HIEROGLYPH F036;Lo;0;L;;;;;N;;;;; +13126;EGYPTIAN HIEROGLYPH F037;Lo;0;L;;;;;N;;;;; +13127;EGYPTIAN HIEROGLYPH F037A;Lo;0;L;;;;;N;;;;; +13128;EGYPTIAN HIEROGLYPH F038;Lo;0;L;;;;;N;;;;; +13129;EGYPTIAN HIEROGLYPH F038A;Lo;0;L;;;;;N;;;;; +1312A;EGYPTIAN HIEROGLYPH F039;Lo;0;L;;;;;N;;;;; +1312B;EGYPTIAN HIEROGLYPH F040;Lo;0;L;;;;;N;;;;; +1312C;EGYPTIAN HIEROGLYPH F041;Lo;0;L;;;;;N;;;;; +1312D;EGYPTIAN HIEROGLYPH F042;Lo;0;L;;;;;N;;;;; +1312E;EGYPTIAN HIEROGLYPH F043;Lo;0;L;;;;;N;;;;; +1312F;EGYPTIAN HIEROGLYPH F044;Lo;0;L;;;;;N;;;;; +13130;EGYPTIAN HIEROGLYPH F045;Lo;0;L;;;;;N;;;;; +13131;EGYPTIAN HIEROGLYPH F045A;Lo;0;L;;;;;N;;;;; +13132;EGYPTIAN HIEROGLYPH F046;Lo;0;L;;;;;N;;;;; +13133;EGYPTIAN HIEROGLYPH F046A;Lo;0;L;;;;;N;;;;; +13134;EGYPTIAN HIEROGLYPH F047;Lo;0;L;;;;;N;;;;; +13135;EGYPTIAN HIEROGLYPH F047A;Lo;0;L;;;;;N;;;;; +13136;EGYPTIAN HIEROGLYPH F048;Lo;0;L;;;;;N;;;;; +13137;EGYPTIAN HIEROGLYPH F049;Lo;0;L;;;;;N;;;;; +13138;EGYPTIAN HIEROGLYPH F050;Lo;0;L;;;;;N;;;;; +13139;EGYPTIAN HIEROGLYPH F051;Lo;0;L;;;;;N;;;;; +1313A;EGYPTIAN HIEROGLYPH F051A;Lo;0;L;;;;;N;;;;; +1313B;EGYPTIAN HIEROGLYPH F051B;Lo;0;L;;;;;N;;;;; +1313C;EGYPTIAN HIEROGLYPH F051C;Lo;0;L;;;;;N;;;;; +1313D;EGYPTIAN HIEROGLYPH F052;Lo;0;L;;;;;N;;;;; +1313E;EGYPTIAN HIEROGLYPH F053;Lo;0;L;;;;;N;;;;; +1313F;EGYPTIAN HIEROGLYPH G001;Lo;0;L;;;;;N;;;;; +13140;EGYPTIAN HIEROGLYPH G002;Lo;0;L;;;;;N;;;;; +13141;EGYPTIAN HIEROGLYPH G003;Lo;0;L;;;;;N;;;;; +13142;EGYPTIAN HIEROGLYPH G004;Lo;0;L;;;;;N;;;;; +13143;EGYPTIAN HIEROGLYPH G005;Lo;0;L;;;;;N;;;;; +13144;EGYPTIAN HIEROGLYPH G006;Lo;0;L;;;;;N;;;;; +13145;EGYPTIAN HIEROGLYPH G006A;Lo;0;L;;;;;N;;;;; +13146;EGYPTIAN HIEROGLYPH G007;Lo;0;L;;;;;N;;;;; +13147;EGYPTIAN HIEROGLYPH G007A;Lo;0;L;;;;;N;;;;; +13148;EGYPTIAN HIEROGLYPH G007B;Lo;0;L;;;;;N;;;;; +13149;EGYPTIAN HIEROGLYPH G008;Lo;0;L;;;;;N;;;;; +1314A;EGYPTIAN HIEROGLYPH G009;Lo;0;L;;;;;N;;;;; +1314B;EGYPTIAN HIEROGLYPH G010;Lo;0;L;;;;;N;;;;; +1314C;EGYPTIAN HIEROGLYPH G011;Lo;0;L;;;;;N;;;;; +1314D;EGYPTIAN HIEROGLYPH G011A;Lo;0;L;;;;;N;;;;; +1314E;EGYPTIAN HIEROGLYPH G012;Lo;0;L;;;;;N;;;;; +1314F;EGYPTIAN HIEROGLYPH G013;Lo;0;L;;;;;N;;;;; +13150;EGYPTIAN HIEROGLYPH G014;Lo;0;L;;;;;N;;;;; +13151;EGYPTIAN HIEROGLYPH G015;Lo;0;L;;;;;N;;;;; +13152;EGYPTIAN HIEROGLYPH G016;Lo;0;L;;;;;N;;;;; +13153;EGYPTIAN HIEROGLYPH G017;Lo;0;L;;;;;N;;;;; +13154;EGYPTIAN HIEROGLYPH G018;Lo;0;L;;;;;N;;;;; +13155;EGYPTIAN HIEROGLYPH G019;Lo;0;L;;;;;N;;;;; +13156;EGYPTIAN HIEROGLYPH G020;Lo;0;L;;;;;N;;;;; +13157;EGYPTIAN HIEROGLYPH G020A;Lo;0;L;;;;;N;;;;; +13158;EGYPTIAN HIEROGLYPH G021;Lo;0;L;;;;;N;;;;; +13159;EGYPTIAN HIEROGLYPH G022;Lo;0;L;;;;;N;;;;; +1315A;EGYPTIAN HIEROGLYPH G023;Lo;0;L;;;;;N;;;;; +1315B;EGYPTIAN HIEROGLYPH G024;Lo;0;L;;;;;N;;;;; +1315C;EGYPTIAN HIEROGLYPH G025;Lo;0;L;;;;;N;;;;; +1315D;EGYPTIAN HIEROGLYPH G026;Lo;0;L;;;;;N;;;;; +1315E;EGYPTIAN HIEROGLYPH G026A;Lo;0;L;;;;;N;;;;; +1315F;EGYPTIAN HIEROGLYPH G027;Lo;0;L;;;;;N;;;;; +13160;EGYPTIAN HIEROGLYPH G028;Lo;0;L;;;;;N;;;;; +13161;EGYPTIAN HIEROGLYPH G029;Lo;0;L;;;;;N;;;;; +13162;EGYPTIAN HIEROGLYPH G030;Lo;0;L;;;;;N;;;;; +13163;EGYPTIAN HIEROGLYPH G031;Lo;0;L;;;;;N;;;;; +13164;EGYPTIAN HIEROGLYPH G032;Lo;0;L;;;;;N;;;;; +13165;EGYPTIAN HIEROGLYPH G033;Lo;0;L;;;;;N;;;;; +13166;EGYPTIAN HIEROGLYPH G034;Lo;0;L;;;;;N;;;;; +13167;EGYPTIAN HIEROGLYPH G035;Lo;0;L;;;;;N;;;;; +13168;EGYPTIAN HIEROGLYPH G036;Lo;0;L;;;;;N;;;;; +13169;EGYPTIAN HIEROGLYPH G036A;Lo;0;L;;;;;N;;;;; +1316A;EGYPTIAN HIEROGLYPH G037;Lo;0;L;;;;;N;;;;; +1316B;EGYPTIAN HIEROGLYPH G037A;Lo;0;L;;;;;N;;;;; +1316C;EGYPTIAN HIEROGLYPH G038;Lo;0;L;;;;;N;;;;; +1316D;EGYPTIAN HIEROGLYPH G039;Lo;0;L;;;;;N;;;;; +1316E;EGYPTIAN HIEROGLYPH G040;Lo;0;L;;;;;N;;;;; +1316F;EGYPTIAN HIEROGLYPH G041;Lo;0;L;;;;;N;;;;; +13170;EGYPTIAN HIEROGLYPH G042;Lo;0;L;;;;;N;;;;; +13171;EGYPTIAN HIEROGLYPH G043;Lo;0;L;;;;;N;;;;; +13172;EGYPTIAN HIEROGLYPH G043A;Lo;0;L;;;;;N;;;;; +13173;EGYPTIAN HIEROGLYPH G044;Lo;0;L;;;;;N;;;;; +13174;EGYPTIAN HIEROGLYPH G045;Lo;0;L;;;;;N;;;;; +13175;EGYPTIAN HIEROGLYPH G045A;Lo;0;L;;;;;N;;;;; +13176;EGYPTIAN HIEROGLYPH G046;Lo;0;L;;;;;N;;;;; +13177;EGYPTIAN HIEROGLYPH G047;Lo;0;L;;;;;N;;;;; +13178;EGYPTIAN HIEROGLYPH G048;Lo;0;L;;;;;N;;;;; +13179;EGYPTIAN HIEROGLYPH G049;Lo;0;L;;;;;N;;;;; +1317A;EGYPTIAN HIEROGLYPH G050;Lo;0;L;;;;;N;;;;; +1317B;EGYPTIAN HIEROGLYPH G051;Lo;0;L;;;;;N;;;;; +1317C;EGYPTIAN HIEROGLYPH G052;Lo;0;L;;;;;N;;;;; +1317D;EGYPTIAN HIEROGLYPH G053;Lo;0;L;;;;;N;;;;; +1317E;EGYPTIAN HIEROGLYPH G054;Lo;0;L;;;;;N;;;;; +1317F;EGYPTIAN HIEROGLYPH H001;Lo;0;L;;;;;N;;;;; +13180;EGYPTIAN HIEROGLYPH H002;Lo;0;L;;;;;N;;;;; +13181;EGYPTIAN HIEROGLYPH H003;Lo;0;L;;;;;N;;;;; +13182;EGYPTIAN HIEROGLYPH H004;Lo;0;L;;;;;N;;;;; +13183;EGYPTIAN HIEROGLYPH H005;Lo;0;L;;;;;N;;;;; +13184;EGYPTIAN HIEROGLYPH H006;Lo;0;L;;;;;N;;;;; +13185;EGYPTIAN HIEROGLYPH H006A;Lo;0;L;;;;;N;;;;; +13186;EGYPTIAN HIEROGLYPH H007;Lo;0;L;;;;;N;;;;; +13187;EGYPTIAN HIEROGLYPH H008;Lo;0;L;;;;;N;;;;; +13188;EGYPTIAN HIEROGLYPH I001;Lo;0;L;;;;;N;;;;; +13189;EGYPTIAN HIEROGLYPH I002;Lo;0;L;;;;;N;;;;; +1318A;EGYPTIAN HIEROGLYPH I003;Lo;0;L;;;;;N;;;;; +1318B;EGYPTIAN HIEROGLYPH I004;Lo;0;L;;;;;N;;;;; +1318C;EGYPTIAN HIEROGLYPH I005;Lo;0;L;;;;;N;;;;; +1318D;EGYPTIAN HIEROGLYPH I005A;Lo;0;L;;;;;N;;;;; +1318E;EGYPTIAN HIEROGLYPH I006;Lo;0;L;;;;;N;;;;; +1318F;EGYPTIAN HIEROGLYPH I007;Lo;0;L;;;;;N;;;;; +13190;EGYPTIAN HIEROGLYPH I008;Lo;0;L;;;;;N;;;;; +13191;EGYPTIAN HIEROGLYPH I009;Lo;0;L;;;;;N;;;;; +13192;EGYPTIAN HIEROGLYPH I009A;Lo;0;L;;;;;N;;;;; +13193;EGYPTIAN HIEROGLYPH I010;Lo;0;L;;;;;N;;;;; +13194;EGYPTIAN HIEROGLYPH I010A;Lo;0;L;;;;;N;;;;; +13195;EGYPTIAN HIEROGLYPH I011;Lo;0;L;;;;;N;;;;; +13196;EGYPTIAN HIEROGLYPH I011A;Lo;0;L;;;;;N;;;;; +13197;EGYPTIAN HIEROGLYPH I012;Lo;0;L;;;;;N;;;;; +13198;EGYPTIAN HIEROGLYPH I013;Lo;0;L;;;;;N;;;;; +13199;EGYPTIAN HIEROGLYPH I014;Lo;0;L;;;;;N;;;;; +1319A;EGYPTIAN HIEROGLYPH I015;Lo;0;L;;;;;N;;;;; +1319B;EGYPTIAN HIEROGLYPH K001;Lo;0;L;;;;;N;;;;; +1319C;EGYPTIAN HIEROGLYPH K002;Lo;0;L;;;;;N;;;;; +1319D;EGYPTIAN HIEROGLYPH K003;Lo;0;L;;;;;N;;;;; +1319E;EGYPTIAN HIEROGLYPH K004;Lo;0;L;;;;;N;;;;; +1319F;EGYPTIAN HIEROGLYPH K005;Lo;0;L;;;;;N;;;;; +131A0;EGYPTIAN HIEROGLYPH K006;Lo;0;L;;;;;N;;;;; +131A1;EGYPTIAN HIEROGLYPH K007;Lo;0;L;;;;;N;;;;; +131A2;EGYPTIAN HIEROGLYPH K008;Lo;0;L;;;;;N;;;;; +131A3;EGYPTIAN HIEROGLYPH L001;Lo;0;L;;;;;N;;;;; +131A4;EGYPTIAN HIEROGLYPH L002;Lo;0;L;;;;;N;;;;; +131A5;EGYPTIAN HIEROGLYPH L002A;Lo;0;L;;;;;N;;;;; +131A6;EGYPTIAN HIEROGLYPH L003;Lo;0;L;;;;;N;;;;; +131A7;EGYPTIAN HIEROGLYPH L004;Lo;0;L;;;;;N;;;;; +131A8;EGYPTIAN HIEROGLYPH L005;Lo;0;L;;;;;N;;;;; +131A9;EGYPTIAN HIEROGLYPH L006;Lo;0;L;;;;;N;;;;; +131AA;EGYPTIAN HIEROGLYPH L006A;Lo;0;L;;;;;N;;;;; +131AB;EGYPTIAN HIEROGLYPH L007;Lo;0;L;;;;;N;;;;; +131AC;EGYPTIAN HIEROGLYPH L008;Lo;0;L;;;;;N;;;;; +131AD;EGYPTIAN HIEROGLYPH M001;Lo;0;L;;;;;N;;;;; +131AE;EGYPTIAN HIEROGLYPH M001A;Lo;0;L;;;;;N;;;;; +131AF;EGYPTIAN HIEROGLYPH M001B;Lo;0;L;;;;;N;;;;; +131B0;EGYPTIAN HIEROGLYPH M002;Lo;0;L;;;;;N;;;;; +131B1;EGYPTIAN HIEROGLYPH M003;Lo;0;L;;;;;N;;;;; +131B2;EGYPTIAN HIEROGLYPH M003A;Lo;0;L;;;;;N;;;;; +131B3;EGYPTIAN HIEROGLYPH M004;Lo;0;L;;;;;N;;;;; +131B4;EGYPTIAN HIEROGLYPH M005;Lo;0;L;;;;;N;;;;; +131B5;EGYPTIAN HIEROGLYPH M006;Lo;0;L;;;;;N;;;;; +131B6;EGYPTIAN HIEROGLYPH M007;Lo;0;L;;;;;N;;;;; +131B7;EGYPTIAN HIEROGLYPH M008;Lo;0;L;;;;;N;;;;; +131B8;EGYPTIAN HIEROGLYPH M009;Lo;0;L;;;;;N;;;;; +131B9;EGYPTIAN HIEROGLYPH M010;Lo;0;L;;;;;N;;;;; +131BA;EGYPTIAN HIEROGLYPH M010A;Lo;0;L;;;;;N;;;;; +131BB;EGYPTIAN HIEROGLYPH M011;Lo;0;L;;;;;N;;;;; +131BC;EGYPTIAN HIEROGLYPH M012;Lo;0;L;;;;;N;;;;; +131BD;EGYPTIAN HIEROGLYPH M012A;Lo;0;L;;;;;N;;;;; +131BE;EGYPTIAN HIEROGLYPH M012B;Lo;0;L;;;;;N;;;;; +131BF;EGYPTIAN HIEROGLYPH M012C;Lo;0;L;;;;;N;;;;; +131C0;EGYPTIAN HIEROGLYPH M012D;Lo;0;L;;;;;N;;;;; +131C1;EGYPTIAN HIEROGLYPH M012E;Lo;0;L;;;;;N;;;;; +131C2;EGYPTIAN HIEROGLYPH M012F;Lo;0;L;;;;;N;;;;; +131C3;EGYPTIAN HIEROGLYPH M012G;Lo;0;L;;;;;N;;;;; +131C4;EGYPTIAN HIEROGLYPH M012H;Lo;0;L;;;;;N;;;;; +131C5;EGYPTIAN HIEROGLYPH M013;Lo;0;L;;;;;N;;;;; +131C6;EGYPTIAN HIEROGLYPH M014;Lo;0;L;;;;;N;;;;; +131C7;EGYPTIAN HIEROGLYPH M015;Lo;0;L;;;;;N;;;;; +131C8;EGYPTIAN HIEROGLYPH M015A;Lo;0;L;;;;;N;;;;; +131C9;EGYPTIAN HIEROGLYPH M016;Lo;0;L;;;;;N;;;;; +131CA;EGYPTIAN HIEROGLYPH M016A;Lo;0;L;;;;;N;;;;; +131CB;EGYPTIAN HIEROGLYPH M017;Lo;0;L;;;;;N;;;;; +131CC;EGYPTIAN HIEROGLYPH M017A;Lo;0;L;;;;;N;;;;; +131CD;EGYPTIAN HIEROGLYPH M018;Lo;0;L;;;;;N;;;;; +131CE;EGYPTIAN HIEROGLYPH M019;Lo;0;L;;;;;N;;;;; +131CF;EGYPTIAN HIEROGLYPH M020;Lo;0;L;;;;;N;;;;; +131D0;EGYPTIAN HIEROGLYPH M021;Lo;0;L;;;;;N;;;;; +131D1;EGYPTIAN HIEROGLYPH M022;Lo;0;L;;;;;N;;;;; +131D2;EGYPTIAN HIEROGLYPH M022A;Lo;0;L;;;;;N;;;;; +131D3;EGYPTIAN HIEROGLYPH M023;Lo;0;L;;;;;N;;;;; +131D4;EGYPTIAN HIEROGLYPH M024;Lo;0;L;;;;;N;;;;; +131D5;EGYPTIAN HIEROGLYPH M024A;Lo;0;L;;;;;N;;;;; +131D6;EGYPTIAN HIEROGLYPH M025;Lo;0;L;;;;;N;;;;; +131D7;EGYPTIAN HIEROGLYPH M026;Lo;0;L;;;;;N;;;;; +131D8;EGYPTIAN HIEROGLYPH M027;Lo;0;L;;;;;N;;;;; +131D9;EGYPTIAN HIEROGLYPH M028;Lo;0;L;;;;;N;;;;; +131DA;EGYPTIAN HIEROGLYPH M028A;Lo;0;L;;;;;N;;;;; +131DB;EGYPTIAN HIEROGLYPH M029;Lo;0;L;;;;;N;;;;; +131DC;EGYPTIAN HIEROGLYPH M030;Lo;0;L;;;;;N;;;;; +131DD;EGYPTIAN HIEROGLYPH M031;Lo;0;L;;;;;N;;;;; +131DE;EGYPTIAN HIEROGLYPH M031A;Lo;0;L;;;;;N;;;;; +131DF;EGYPTIAN HIEROGLYPH M032;Lo;0;L;;;;;N;;;;; +131E0;EGYPTIAN HIEROGLYPH M033;Lo;0;L;;;;;N;;;;; +131E1;EGYPTIAN HIEROGLYPH M033A;Lo;0;L;;;;;N;;;;; +131E2;EGYPTIAN HIEROGLYPH M033B;Lo;0;L;;;;;N;;;;; +131E3;EGYPTIAN HIEROGLYPH M034;Lo;0;L;;;;;N;;;;; +131E4;EGYPTIAN HIEROGLYPH M035;Lo;0;L;;;;;N;;;;; +131E5;EGYPTIAN HIEROGLYPH M036;Lo;0;L;;;;;N;;;;; +131E6;EGYPTIAN HIEROGLYPH M037;Lo;0;L;;;;;N;;;;; +131E7;EGYPTIAN HIEROGLYPH M038;Lo;0;L;;;;;N;;;;; +131E8;EGYPTIAN HIEROGLYPH M039;Lo;0;L;;;;;N;;;;; +131E9;EGYPTIAN HIEROGLYPH M040;Lo;0;L;;;;;N;;;;; +131EA;EGYPTIAN HIEROGLYPH M040A;Lo;0;L;;;;;N;;;;; +131EB;EGYPTIAN HIEROGLYPH M041;Lo;0;L;;;;;N;;;;; +131EC;EGYPTIAN HIEROGLYPH M042;Lo;0;L;;;;;N;;;;; +131ED;EGYPTIAN HIEROGLYPH M043;Lo;0;L;;;;;N;;;;; +131EE;EGYPTIAN HIEROGLYPH M044;Lo;0;L;;;;;N;;;;; +131EF;EGYPTIAN HIEROGLYPH N001;Lo;0;L;;;;;N;;;;; +131F0;EGYPTIAN HIEROGLYPH N002;Lo;0;L;;;;;N;;;;; +131F1;EGYPTIAN HIEROGLYPH N003;Lo;0;L;;;;;N;;;;; +131F2;EGYPTIAN HIEROGLYPH N004;Lo;0;L;;;;;N;;;;; +131F3;EGYPTIAN HIEROGLYPH N005;Lo;0;L;;;;;N;;;;; +131F4;EGYPTIAN HIEROGLYPH N006;Lo;0;L;;;;;N;;;;; +131F5;EGYPTIAN HIEROGLYPH N007;Lo;0;L;;;;;N;;;;; +131F6;EGYPTIAN HIEROGLYPH N008;Lo;0;L;;;;;N;;;;; +131F7;EGYPTIAN HIEROGLYPH N009;Lo;0;L;;;;;N;;;;; +131F8;EGYPTIAN HIEROGLYPH N010;Lo;0;L;;;;;N;;;;; +131F9;EGYPTIAN HIEROGLYPH N011;Lo;0;L;;;;;N;;;;; +131FA;EGYPTIAN HIEROGLYPH N012;Lo;0;L;;;;;N;;;;; +131FB;EGYPTIAN HIEROGLYPH N013;Lo;0;L;;;;;N;;;;; +131FC;EGYPTIAN HIEROGLYPH N014;Lo;0;L;;;;;N;;;;; +131FD;EGYPTIAN HIEROGLYPH N015;Lo;0;L;;;;;N;;;;; +131FE;EGYPTIAN HIEROGLYPH N016;Lo;0;L;;;;;N;;;;; +131FF;EGYPTIAN HIEROGLYPH N017;Lo;0;L;;;;;N;;;;; +13200;EGYPTIAN HIEROGLYPH N018;Lo;0;L;;;;;N;;;;; +13201;EGYPTIAN HIEROGLYPH N018A;Lo;0;L;;;;;N;;;;; +13202;EGYPTIAN HIEROGLYPH N018B;Lo;0;L;;;;;N;;;;; +13203;EGYPTIAN HIEROGLYPH N019;Lo;0;L;;;;;N;;;;; +13204;EGYPTIAN HIEROGLYPH N020;Lo;0;L;;;;;N;;;;; +13205;EGYPTIAN HIEROGLYPH N021;Lo;0;L;;;;;N;;;;; +13206;EGYPTIAN HIEROGLYPH N022;Lo;0;L;;;;;N;;;;; +13207;EGYPTIAN HIEROGLYPH N023;Lo;0;L;;;;;N;;;;; +13208;EGYPTIAN HIEROGLYPH N024;Lo;0;L;;;;;N;;;;; +13209;EGYPTIAN HIEROGLYPH N025;Lo;0;L;;;;;N;;;;; +1320A;EGYPTIAN HIEROGLYPH N025A;Lo;0;L;;;;;N;;;;; +1320B;EGYPTIAN HIEROGLYPH N026;Lo;0;L;;;;;N;;;;; +1320C;EGYPTIAN HIEROGLYPH N027;Lo;0;L;;;;;N;;;;; +1320D;EGYPTIAN HIEROGLYPH N028;Lo;0;L;;;;;N;;;;; +1320E;EGYPTIAN HIEROGLYPH N029;Lo;0;L;;;;;N;;;;; +1320F;EGYPTIAN HIEROGLYPH N030;Lo;0;L;;;;;N;;;;; +13210;EGYPTIAN HIEROGLYPH N031;Lo;0;L;;;;;N;;;;; +13211;EGYPTIAN HIEROGLYPH N032;Lo;0;L;;;;;N;;;;; +13212;EGYPTIAN HIEROGLYPH N033;Lo;0;L;;;;;N;;;;; +13213;EGYPTIAN HIEROGLYPH N033A;Lo;0;L;;;;;N;;;;; +13214;EGYPTIAN HIEROGLYPH N034;Lo;0;L;;;;;N;;;;; +13215;EGYPTIAN HIEROGLYPH N034A;Lo;0;L;;;;;N;;;;; +13216;EGYPTIAN HIEROGLYPH N035;Lo;0;L;;;;;N;;;;; +13217;EGYPTIAN HIEROGLYPH N035A;Lo;0;L;;;;;N;;;;; +13218;EGYPTIAN HIEROGLYPH N036;Lo;0;L;;;;;N;;;;; +13219;EGYPTIAN HIEROGLYPH N037;Lo;0;L;;;;;N;;;;; +1321A;EGYPTIAN HIEROGLYPH N037A;Lo;0;L;;;;;N;;;;; +1321B;EGYPTIAN HIEROGLYPH N038;Lo;0;L;;;;;N;;;;; +1321C;EGYPTIAN HIEROGLYPH N039;Lo;0;L;;;;;N;;;;; +1321D;EGYPTIAN HIEROGLYPH N040;Lo;0;L;;;;;N;;;;; +1321E;EGYPTIAN HIEROGLYPH N041;Lo;0;L;;;;;N;;;;; +1321F;EGYPTIAN HIEROGLYPH N042;Lo;0;L;;;;;N;;;;; +13220;EGYPTIAN HIEROGLYPH NL001;Lo;0;L;;;;;N;;;;; +13221;EGYPTIAN HIEROGLYPH NL002;Lo;0;L;;;;;N;;;;; +13222;EGYPTIAN HIEROGLYPH NL003;Lo;0;L;;;;;N;;;;; +13223;EGYPTIAN HIEROGLYPH NL004;Lo;0;L;;;;;N;;;;; +13224;EGYPTIAN HIEROGLYPH NL005;Lo;0;L;;;;;N;;;;; +13225;EGYPTIAN HIEROGLYPH NL005A;Lo;0;L;;;;;N;;;;; +13226;EGYPTIAN HIEROGLYPH NL006;Lo;0;L;;;;;N;;;;; +13227;EGYPTIAN HIEROGLYPH NL007;Lo;0;L;;;;;N;;;;; +13228;EGYPTIAN HIEROGLYPH NL008;Lo;0;L;;;;;N;;;;; +13229;EGYPTIAN HIEROGLYPH NL009;Lo;0;L;;;;;N;;;;; +1322A;EGYPTIAN HIEROGLYPH NL010;Lo;0;L;;;;;N;;;;; +1322B;EGYPTIAN HIEROGLYPH NL011;Lo;0;L;;;;;N;;;;; +1322C;EGYPTIAN HIEROGLYPH NL012;Lo;0;L;;;;;N;;;;; +1322D;EGYPTIAN HIEROGLYPH NL013;Lo;0;L;;;;;N;;;;; +1322E;EGYPTIAN HIEROGLYPH NL014;Lo;0;L;;;;;N;;;;; +1322F;EGYPTIAN HIEROGLYPH NL015;Lo;0;L;;;;;N;;;;; +13230;EGYPTIAN HIEROGLYPH NL016;Lo;0;L;;;;;N;;;;; +13231;EGYPTIAN HIEROGLYPH NL017;Lo;0;L;;;;;N;;;;; +13232;EGYPTIAN HIEROGLYPH NL017A;Lo;0;L;;;;;N;;;;; +13233;EGYPTIAN HIEROGLYPH NL018;Lo;0;L;;;;;N;;;;; +13234;EGYPTIAN HIEROGLYPH NL019;Lo;0;L;;;;;N;;;;; +13235;EGYPTIAN HIEROGLYPH NL020;Lo;0;L;;;;;N;;;;; +13236;EGYPTIAN HIEROGLYPH NU001;Lo;0;L;;;;;N;;;;; +13237;EGYPTIAN HIEROGLYPH NU002;Lo;0;L;;;;;N;;;;; +13238;EGYPTIAN HIEROGLYPH NU003;Lo;0;L;;;;;N;;;;; +13239;EGYPTIAN HIEROGLYPH NU004;Lo;0;L;;;;;N;;;;; +1323A;EGYPTIAN HIEROGLYPH NU005;Lo;0;L;;;;;N;;;;; +1323B;EGYPTIAN HIEROGLYPH NU006;Lo;0;L;;;;;N;;;;; +1323C;EGYPTIAN HIEROGLYPH NU007;Lo;0;L;;;;;N;;;;; +1323D;EGYPTIAN HIEROGLYPH NU008;Lo;0;L;;;;;N;;;;; +1323E;EGYPTIAN HIEROGLYPH NU009;Lo;0;L;;;;;N;;;;; +1323F;EGYPTIAN HIEROGLYPH NU010;Lo;0;L;;;;;N;;;;; +13240;EGYPTIAN HIEROGLYPH NU010A;Lo;0;L;;;;;N;;;;; +13241;EGYPTIAN HIEROGLYPH NU011;Lo;0;L;;;;;N;;;;; +13242;EGYPTIAN HIEROGLYPH NU011A;Lo;0;L;;;;;N;;;;; +13243;EGYPTIAN HIEROGLYPH NU012;Lo;0;L;;;;;N;;;;; +13244;EGYPTIAN HIEROGLYPH NU013;Lo;0;L;;;;;N;;;;; +13245;EGYPTIAN HIEROGLYPH NU014;Lo;0;L;;;;;N;;;;; +13246;EGYPTIAN HIEROGLYPH NU015;Lo;0;L;;;;;N;;;;; +13247;EGYPTIAN HIEROGLYPH NU016;Lo;0;L;;;;;N;;;;; +13248;EGYPTIAN HIEROGLYPH NU017;Lo;0;L;;;;;N;;;;; +13249;EGYPTIAN HIEROGLYPH NU018;Lo;0;L;;;;;N;;;;; +1324A;EGYPTIAN HIEROGLYPH NU018A;Lo;0;L;;;;;N;;;;; +1324B;EGYPTIAN HIEROGLYPH NU019;Lo;0;L;;;;;N;;;;; +1324C;EGYPTIAN HIEROGLYPH NU020;Lo;0;L;;;;;N;;;;; +1324D;EGYPTIAN HIEROGLYPH NU021;Lo;0;L;;;;;N;;;;; +1324E;EGYPTIAN HIEROGLYPH NU022;Lo;0;L;;;;;N;;;;; +1324F;EGYPTIAN HIEROGLYPH NU022A;Lo;0;L;;;;;N;;;;; +13250;EGYPTIAN HIEROGLYPH O001;Lo;0;L;;;;;N;;;;; +13251;EGYPTIAN HIEROGLYPH O001A;Lo;0;L;;;;;N;;;;; +13252;EGYPTIAN HIEROGLYPH O002;Lo;0;L;;;;;N;;;;; +13253;EGYPTIAN HIEROGLYPH O003;Lo;0;L;;;;;N;;;;; +13254;EGYPTIAN HIEROGLYPH O004;Lo;0;L;;;;;N;;;;; +13255;EGYPTIAN HIEROGLYPH O005;Lo;0;L;;;;;N;;;;; +13256;EGYPTIAN HIEROGLYPH O005A;Lo;0;L;;;;;N;;;;; +13257;EGYPTIAN HIEROGLYPH O006;Lo;0;L;;;;;N;;;;; +13258;EGYPTIAN HIEROGLYPH O006A;Lo;0;L;;;;;N;;;;; +13259;EGYPTIAN HIEROGLYPH O006B;Lo;0;L;;;;;N;;;;; +1325A;EGYPTIAN HIEROGLYPH O006C;Lo;0;L;;;;;N;;;;; +1325B;EGYPTIAN HIEROGLYPH O006D;Lo;0;L;;;;;N;;;;; +1325C;EGYPTIAN HIEROGLYPH O006E;Lo;0;L;;;;;N;;;;; +1325D;EGYPTIAN HIEROGLYPH O006F;Lo;0;L;;;;;N;;;;; +1325E;EGYPTIAN HIEROGLYPH O007;Lo;0;L;;;;;N;;;;; +1325F;EGYPTIAN HIEROGLYPH O008;Lo;0;L;;;;;N;;;;; +13260;EGYPTIAN HIEROGLYPH O009;Lo;0;L;;;;;N;;;;; +13261;EGYPTIAN HIEROGLYPH O010;Lo;0;L;;;;;N;;;;; +13262;EGYPTIAN HIEROGLYPH O010A;Lo;0;L;;;;;N;;;;; +13263;EGYPTIAN HIEROGLYPH O010B;Lo;0;L;;;;;N;;;;; +13264;EGYPTIAN HIEROGLYPH O010C;Lo;0;L;;;;;N;;;;; +13265;EGYPTIAN HIEROGLYPH O011;Lo;0;L;;;;;N;;;;; +13266;EGYPTIAN HIEROGLYPH O012;Lo;0;L;;;;;N;;;;; +13267;EGYPTIAN HIEROGLYPH O013;Lo;0;L;;;;;N;;;;; +13268;EGYPTIAN HIEROGLYPH O014;Lo;0;L;;;;;N;;;;; +13269;EGYPTIAN HIEROGLYPH O015;Lo;0;L;;;;;N;;;;; +1326A;EGYPTIAN HIEROGLYPH O016;Lo;0;L;;;;;N;;;;; +1326B;EGYPTIAN HIEROGLYPH O017;Lo;0;L;;;;;N;;;;; +1326C;EGYPTIAN HIEROGLYPH O018;Lo;0;L;;;;;N;;;;; +1326D;EGYPTIAN HIEROGLYPH O019;Lo;0;L;;;;;N;;;;; +1326E;EGYPTIAN HIEROGLYPH O019A;Lo;0;L;;;;;N;;;;; +1326F;EGYPTIAN HIEROGLYPH O020;Lo;0;L;;;;;N;;;;; +13270;EGYPTIAN HIEROGLYPH O020A;Lo;0;L;;;;;N;;;;; +13271;EGYPTIAN HIEROGLYPH O021;Lo;0;L;;;;;N;;;;; +13272;EGYPTIAN HIEROGLYPH O022;Lo;0;L;;;;;N;;;;; +13273;EGYPTIAN HIEROGLYPH O023;Lo;0;L;;;;;N;;;;; +13274;EGYPTIAN HIEROGLYPH O024;Lo;0;L;;;;;N;;;;; +13275;EGYPTIAN HIEROGLYPH O024A;Lo;0;L;;;;;N;;;;; +13276;EGYPTIAN HIEROGLYPH O025;Lo;0;L;;;;;N;;;;; +13277;EGYPTIAN HIEROGLYPH O025A;Lo;0;L;;;;;N;;;;; +13278;EGYPTIAN HIEROGLYPH O026;Lo;0;L;;;;;N;;;;; +13279;EGYPTIAN HIEROGLYPH O027;Lo;0;L;;;;;N;;;;; +1327A;EGYPTIAN HIEROGLYPH O028;Lo;0;L;;;;;N;;;;; +1327B;EGYPTIAN HIEROGLYPH O029;Lo;0;L;;;;;N;;;;; +1327C;EGYPTIAN HIEROGLYPH O029A;Lo;0;L;;;;;N;;;;; +1327D;EGYPTIAN HIEROGLYPH O030;Lo;0;L;;;;;N;;;;; +1327E;EGYPTIAN HIEROGLYPH O030A;Lo;0;L;;;;;N;;;;; +1327F;EGYPTIAN HIEROGLYPH O031;Lo;0;L;;;;;N;;;;; +13280;EGYPTIAN HIEROGLYPH O032;Lo;0;L;;;;;N;;;;; +13281;EGYPTIAN HIEROGLYPH O033;Lo;0;L;;;;;N;;;;; +13282;EGYPTIAN HIEROGLYPH O033A;Lo;0;L;;;;;N;;;;; +13283;EGYPTIAN HIEROGLYPH O034;Lo;0;L;;;;;N;;;;; +13284;EGYPTIAN HIEROGLYPH O035;Lo;0;L;;;;;N;;;;; +13285;EGYPTIAN HIEROGLYPH O036;Lo;0;L;;;;;N;;;;; +13286;EGYPTIAN HIEROGLYPH O036A;Lo;0;L;;;;;N;;;;; +13287;EGYPTIAN HIEROGLYPH O036B;Lo;0;L;;;;;N;;;;; +13288;EGYPTIAN HIEROGLYPH O036C;Lo;0;L;;;;;N;;;;; +13289;EGYPTIAN HIEROGLYPH O036D;Lo;0;L;;;;;N;;;;; +1328A;EGYPTIAN HIEROGLYPH O037;Lo;0;L;;;;;N;;;;; +1328B;EGYPTIAN HIEROGLYPH O038;Lo;0;L;;;;;N;;;;; +1328C;EGYPTIAN HIEROGLYPH O039;Lo;0;L;;;;;N;;;;; +1328D;EGYPTIAN HIEROGLYPH O040;Lo;0;L;;;;;N;;;;; +1328E;EGYPTIAN HIEROGLYPH O041;Lo;0;L;;;;;N;;;;; +1328F;EGYPTIAN HIEROGLYPH O042;Lo;0;L;;;;;N;;;;; +13290;EGYPTIAN HIEROGLYPH O043;Lo;0;L;;;;;N;;;;; +13291;EGYPTIAN HIEROGLYPH O044;Lo;0;L;;;;;N;;;;; +13292;EGYPTIAN HIEROGLYPH O045;Lo;0;L;;;;;N;;;;; +13293;EGYPTIAN HIEROGLYPH O046;Lo;0;L;;;;;N;;;;; +13294;EGYPTIAN HIEROGLYPH O047;Lo;0;L;;;;;N;;;;; +13295;EGYPTIAN HIEROGLYPH O048;Lo;0;L;;;;;N;;;;; +13296;EGYPTIAN HIEROGLYPH O049;Lo;0;L;;;;;N;;;;; +13297;EGYPTIAN HIEROGLYPH O050;Lo;0;L;;;;;N;;;;; +13298;EGYPTIAN HIEROGLYPH O050A;Lo;0;L;;;;;N;;;;; +13299;EGYPTIAN HIEROGLYPH O050B;Lo;0;L;;;;;N;;;;; +1329A;EGYPTIAN HIEROGLYPH O051;Lo;0;L;;;;;N;;;;; +1329B;EGYPTIAN HIEROGLYPH P001;Lo;0;L;;;;;N;;;;; +1329C;EGYPTIAN HIEROGLYPH P001A;Lo;0;L;;;;;N;;;;; +1329D;EGYPTIAN HIEROGLYPH P002;Lo;0;L;;;;;N;;;;; +1329E;EGYPTIAN HIEROGLYPH P003;Lo;0;L;;;;;N;;;;; +1329F;EGYPTIAN HIEROGLYPH P003A;Lo;0;L;;;;;N;;;;; +132A0;EGYPTIAN HIEROGLYPH P004;Lo;0;L;;;;;N;;;;; +132A1;EGYPTIAN HIEROGLYPH P005;Lo;0;L;;;;;N;;;;; +132A2;EGYPTIAN HIEROGLYPH P006;Lo;0;L;;;;;N;;;;; +132A3;EGYPTIAN HIEROGLYPH P007;Lo;0;L;;;;;N;;;;; +132A4;EGYPTIAN HIEROGLYPH P008;Lo;0;L;;;;;N;;;;; +132A5;EGYPTIAN HIEROGLYPH P009;Lo;0;L;;;;;N;;;;; +132A6;EGYPTIAN HIEROGLYPH P010;Lo;0;L;;;;;N;;;;; +132A7;EGYPTIAN HIEROGLYPH P011;Lo;0;L;;;;;N;;;;; +132A8;EGYPTIAN HIEROGLYPH Q001;Lo;0;L;;;;;N;;;;; +132A9;EGYPTIAN HIEROGLYPH Q002;Lo;0;L;;;;;N;;;;; +132AA;EGYPTIAN HIEROGLYPH Q003;Lo;0;L;;;;;N;;;;; +132AB;EGYPTIAN HIEROGLYPH Q004;Lo;0;L;;;;;N;;;;; +132AC;EGYPTIAN HIEROGLYPH Q005;Lo;0;L;;;;;N;;;;; +132AD;EGYPTIAN HIEROGLYPH Q006;Lo;0;L;;;;;N;;;;; +132AE;EGYPTIAN HIEROGLYPH Q007;Lo;0;L;;;;;N;;;;; +132AF;EGYPTIAN HIEROGLYPH R001;Lo;0;L;;;;;N;;;;; +132B0;EGYPTIAN HIEROGLYPH R002;Lo;0;L;;;;;N;;;;; +132B1;EGYPTIAN HIEROGLYPH R002A;Lo;0;L;;;;;N;;;;; +132B2;EGYPTIAN HIEROGLYPH R003;Lo;0;L;;;;;N;;;;; +132B3;EGYPTIAN HIEROGLYPH R003A;Lo;0;L;;;;;N;;;;; +132B4;EGYPTIAN HIEROGLYPH R003B;Lo;0;L;;;;;N;;;;; +132B5;EGYPTIAN HIEROGLYPH R004;Lo;0;L;;;;;N;;;;; +132B6;EGYPTIAN HIEROGLYPH R005;Lo;0;L;;;;;N;;;;; +132B7;EGYPTIAN HIEROGLYPH R006;Lo;0;L;;;;;N;;;;; +132B8;EGYPTIAN HIEROGLYPH R007;Lo;0;L;;;;;N;;;;; +132B9;EGYPTIAN HIEROGLYPH R008;Lo;0;L;;;;;N;;;;; +132BA;EGYPTIAN HIEROGLYPH R009;Lo;0;L;;;;;N;;;;; +132BB;EGYPTIAN HIEROGLYPH R010;Lo;0;L;;;;;N;;;;; +132BC;EGYPTIAN HIEROGLYPH R010A;Lo;0;L;;;;;N;;;;; +132BD;EGYPTIAN HIEROGLYPH R011;Lo;0;L;;;;;N;;;;; +132BE;EGYPTIAN HIEROGLYPH R012;Lo;0;L;;;;;N;;;;; +132BF;EGYPTIAN HIEROGLYPH R013;Lo;0;L;;;;;N;;;;; +132C0;EGYPTIAN HIEROGLYPH R014;Lo;0;L;;;;;N;;;;; +132C1;EGYPTIAN HIEROGLYPH R015;Lo;0;L;;;;;N;;;;; +132C2;EGYPTIAN HIEROGLYPH R016;Lo;0;L;;;;;N;;;;; +132C3;EGYPTIAN HIEROGLYPH R016A;Lo;0;L;;;;;N;;;;; +132C4;EGYPTIAN HIEROGLYPH R017;Lo;0;L;;;;;N;;;;; +132C5;EGYPTIAN HIEROGLYPH R018;Lo;0;L;;;;;N;;;;; +132C6;EGYPTIAN HIEROGLYPH R019;Lo;0;L;;;;;N;;;;; +132C7;EGYPTIAN HIEROGLYPH R020;Lo;0;L;;;;;N;;;;; +132C8;EGYPTIAN HIEROGLYPH R021;Lo;0;L;;;;;N;;;;; +132C9;EGYPTIAN HIEROGLYPH R022;Lo;0;L;;;;;N;;;;; +132CA;EGYPTIAN HIEROGLYPH R023;Lo;0;L;;;;;N;;;;; +132CB;EGYPTIAN HIEROGLYPH R024;Lo;0;L;;;;;N;;;;; +132CC;EGYPTIAN HIEROGLYPH R025;Lo;0;L;;;;;N;;;;; +132CD;EGYPTIAN HIEROGLYPH R026;Lo;0;L;;;;;N;;;;; +132CE;EGYPTIAN HIEROGLYPH R027;Lo;0;L;;;;;N;;;;; +132CF;EGYPTIAN HIEROGLYPH R028;Lo;0;L;;;;;N;;;;; +132D0;EGYPTIAN HIEROGLYPH R029;Lo;0;L;;;;;N;;;;; +132D1;EGYPTIAN HIEROGLYPH S001;Lo;0;L;;;;;N;;;;; +132D2;EGYPTIAN HIEROGLYPH S002;Lo;0;L;;;;;N;;;;; +132D3;EGYPTIAN HIEROGLYPH S002A;Lo;0;L;;;;;N;;;;; +132D4;EGYPTIAN HIEROGLYPH S003;Lo;0;L;;;;;N;;;;; +132D5;EGYPTIAN HIEROGLYPH S004;Lo;0;L;;;;;N;;;;; +132D6;EGYPTIAN HIEROGLYPH S005;Lo;0;L;;;;;N;;;;; +132D7;EGYPTIAN HIEROGLYPH S006;Lo;0;L;;;;;N;;;;; +132D8;EGYPTIAN HIEROGLYPH S006A;Lo;0;L;;;;;N;;;;; +132D9;EGYPTIAN HIEROGLYPH S007;Lo;0;L;;;;;N;;;;; +132DA;EGYPTIAN HIEROGLYPH S008;Lo;0;L;;;;;N;;;;; +132DB;EGYPTIAN HIEROGLYPH S009;Lo;0;L;;;;;N;;;;; +132DC;EGYPTIAN HIEROGLYPH S010;Lo;0;L;;;;;N;;;;; +132DD;EGYPTIAN HIEROGLYPH S011;Lo;0;L;;;;;N;;;;; +132DE;EGYPTIAN HIEROGLYPH S012;Lo;0;L;;;;;N;;;;; +132DF;EGYPTIAN HIEROGLYPH S013;Lo;0;L;;;;;N;;;;; +132E0;EGYPTIAN HIEROGLYPH S014;Lo;0;L;;;;;N;;;;; +132E1;EGYPTIAN HIEROGLYPH S014A;Lo;0;L;;;;;N;;;;; +132E2;EGYPTIAN HIEROGLYPH S014B;Lo;0;L;;;;;N;;;;; +132E3;EGYPTIAN HIEROGLYPH S015;Lo;0;L;;;;;N;;;;; +132E4;EGYPTIAN HIEROGLYPH S016;Lo;0;L;;;;;N;;;;; +132E5;EGYPTIAN HIEROGLYPH S017;Lo;0;L;;;;;N;;;;; +132E6;EGYPTIAN HIEROGLYPH S017A;Lo;0;L;;;;;N;;;;; +132E7;EGYPTIAN HIEROGLYPH S018;Lo;0;L;;;;;N;;;;; +132E8;EGYPTIAN HIEROGLYPH S019;Lo;0;L;;;;;N;;;;; +132E9;EGYPTIAN HIEROGLYPH S020;Lo;0;L;;;;;N;;;;; +132EA;EGYPTIAN HIEROGLYPH S021;Lo;0;L;;;;;N;;;;; +132EB;EGYPTIAN HIEROGLYPH S022;Lo;0;L;;;;;N;;;;; +132EC;EGYPTIAN HIEROGLYPH S023;Lo;0;L;;;;;N;;;;; +132ED;EGYPTIAN HIEROGLYPH S024;Lo;0;L;;;;;N;;;;; +132EE;EGYPTIAN HIEROGLYPH S025;Lo;0;L;;;;;N;;;;; +132EF;EGYPTIAN HIEROGLYPH S026;Lo;0;L;;;;;N;;;;; +132F0;EGYPTIAN HIEROGLYPH S026A;Lo;0;L;;;;;N;;;;; +132F1;EGYPTIAN HIEROGLYPH S026B;Lo;0;L;;;;;N;;;;; +132F2;EGYPTIAN HIEROGLYPH S027;Lo;0;L;;;;;N;;;;; +132F3;EGYPTIAN HIEROGLYPH S028;Lo;0;L;;;;;N;;;;; +132F4;EGYPTIAN HIEROGLYPH S029;Lo;0;L;;;;;N;;;;; +132F5;EGYPTIAN HIEROGLYPH S030;Lo;0;L;;;;;N;;;;; +132F6;EGYPTIAN HIEROGLYPH S031;Lo;0;L;;;;;N;;;;; +132F7;EGYPTIAN HIEROGLYPH S032;Lo;0;L;;;;;N;;;;; +132F8;EGYPTIAN HIEROGLYPH S033;Lo;0;L;;;;;N;;;;; +132F9;EGYPTIAN HIEROGLYPH S034;Lo;0;L;;;;;N;;;;; +132FA;EGYPTIAN HIEROGLYPH S035;Lo;0;L;;;;;N;;;;; +132FB;EGYPTIAN HIEROGLYPH S035A;Lo;0;L;;;;;N;;;;; +132FC;EGYPTIAN HIEROGLYPH S036;Lo;0;L;;;;;N;;;;; +132FD;EGYPTIAN HIEROGLYPH S037;Lo;0;L;;;;;N;;;;; +132FE;EGYPTIAN HIEROGLYPH S038;Lo;0;L;;;;;N;;;;; +132FF;EGYPTIAN HIEROGLYPH S039;Lo;0;L;;;;;N;;;;; +13300;EGYPTIAN HIEROGLYPH S040;Lo;0;L;;;;;N;;;;; +13301;EGYPTIAN HIEROGLYPH S041;Lo;0;L;;;;;N;;;;; +13302;EGYPTIAN HIEROGLYPH S042;Lo;0;L;;;;;N;;;;; +13303;EGYPTIAN HIEROGLYPH S043;Lo;0;L;;;;;N;;;;; +13304;EGYPTIAN HIEROGLYPH S044;Lo;0;L;;;;;N;;;;; +13305;EGYPTIAN HIEROGLYPH S045;Lo;0;L;;;;;N;;;;; +13306;EGYPTIAN HIEROGLYPH S046;Lo;0;L;;;;;N;;;;; +13307;EGYPTIAN HIEROGLYPH T001;Lo;0;L;;;;;N;;;;; +13308;EGYPTIAN HIEROGLYPH T002;Lo;0;L;;;;;N;;;;; +13309;EGYPTIAN HIEROGLYPH T003;Lo;0;L;;;;;N;;;;; +1330A;EGYPTIAN HIEROGLYPH T003A;Lo;0;L;;;;;N;;;;; +1330B;EGYPTIAN HIEROGLYPH T004;Lo;0;L;;;;;N;;;;; +1330C;EGYPTIAN HIEROGLYPH T005;Lo;0;L;;;;;N;;;;; +1330D;EGYPTIAN HIEROGLYPH T006;Lo;0;L;;;;;N;;;;; +1330E;EGYPTIAN HIEROGLYPH T007;Lo;0;L;;;;;N;;;;; +1330F;EGYPTIAN HIEROGLYPH T007A;Lo;0;L;;;;;N;;;;; +13310;EGYPTIAN HIEROGLYPH T008;Lo;0;L;;;;;N;;;;; +13311;EGYPTIAN HIEROGLYPH T008A;Lo;0;L;;;;;N;;;;; +13312;EGYPTIAN HIEROGLYPH T009;Lo;0;L;;;;;N;;;;; +13313;EGYPTIAN HIEROGLYPH T009A;Lo;0;L;;;;;N;;;;; +13314;EGYPTIAN HIEROGLYPH T010;Lo;0;L;;;;;N;;;;; +13315;EGYPTIAN HIEROGLYPH T011;Lo;0;L;;;;;N;;;;; +13316;EGYPTIAN HIEROGLYPH T011A;Lo;0;L;;;;;N;;;;; +13317;EGYPTIAN HIEROGLYPH T012;Lo;0;L;;;;;N;;;;; +13318;EGYPTIAN HIEROGLYPH T013;Lo;0;L;;;;;N;;;;; +13319;EGYPTIAN HIEROGLYPH T014;Lo;0;L;;;;;N;;;;; +1331A;EGYPTIAN HIEROGLYPH T015;Lo;0;L;;;;;N;;;;; +1331B;EGYPTIAN HIEROGLYPH T016;Lo;0;L;;;;;N;;;;; +1331C;EGYPTIAN HIEROGLYPH T016A;Lo;0;L;;;;;N;;;;; +1331D;EGYPTIAN HIEROGLYPH T017;Lo;0;L;;;;;N;;;;; +1331E;EGYPTIAN HIEROGLYPH T018;Lo;0;L;;;;;N;;;;; +1331F;EGYPTIAN HIEROGLYPH T019;Lo;0;L;;;;;N;;;;; +13320;EGYPTIAN HIEROGLYPH T020;Lo;0;L;;;;;N;;;;; +13321;EGYPTIAN HIEROGLYPH T021;Lo;0;L;;;;;N;;;;; +13322;EGYPTIAN HIEROGLYPH T022;Lo;0;L;;;;;N;;;;; +13323;EGYPTIAN HIEROGLYPH T023;Lo;0;L;;;;;N;;;;; +13324;EGYPTIAN HIEROGLYPH T024;Lo;0;L;;;;;N;;;;; +13325;EGYPTIAN HIEROGLYPH T025;Lo;0;L;;;;;N;;;;; +13326;EGYPTIAN HIEROGLYPH T026;Lo;0;L;;;;;N;;;;; +13327;EGYPTIAN HIEROGLYPH T027;Lo;0;L;;;;;N;;;;; +13328;EGYPTIAN HIEROGLYPH T028;Lo;0;L;;;;;N;;;;; +13329;EGYPTIAN HIEROGLYPH T029;Lo;0;L;;;;;N;;;;; +1332A;EGYPTIAN HIEROGLYPH T030;Lo;0;L;;;;;N;;;;; +1332B;EGYPTIAN HIEROGLYPH T031;Lo;0;L;;;;;N;;;;; +1332C;EGYPTIAN HIEROGLYPH T032;Lo;0;L;;;;;N;;;;; +1332D;EGYPTIAN HIEROGLYPH T032A;Lo;0;L;;;;;N;;;;; +1332E;EGYPTIAN HIEROGLYPH T033;Lo;0;L;;;;;N;;;;; +1332F;EGYPTIAN HIEROGLYPH T033A;Lo;0;L;;;;;N;;;;; +13330;EGYPTIAN HIEROGLYPH T034;Lo;0;L;;;;;N;;;;; +13331;EGYPTIAN HIEROGLYPH T035;Lo;0;L;;;;;N;;;;; +13332;EGYPTIAN HIEROGLYPH T036;Lo;0;L;;;;;N;;;;; +13333;EGYPTIAN HIEROGLYPH U001;Lo;0;L;;;;;N;;;;; +13334;EGYPTIAN HIEROGLYPH U002;Lo;0;L;;;;;N;;;;; +13335;EGYPTIAN HIEROGLYPH U003;Lo;0;L;;;;;N;;;;; +13336;EGYPTIAN HIEROGLYPH U004;Lo;0;L;;;;;N;;;;; +13337;EGYPTIAN HIEROGLYPH U005;Lo;0;L;;;;;N;;;;; +13338;EGYPTIAN HIEROGLYPH U006;Lo;0;L;;;;;N;;;;; +13339;EGYPTIAN HIEROGLYPH U006A;Lo;0;L;;;;;N;;;;; +1333A;EGYPTIAN HIEROGLYPH U006B;Lo;0;L;;;;;N;;;;; +1333B;EGYPTIAN HIEROGLYPH U007;Lo;0;L;;;;;N;;;;; +1333C;EGYPTIAN HIEROGLYPH U008;Lo;0;L;;;;;N;;;;; +1333D;EGYPTIAN HIEROGLYPH U009;Lo;0;L;;;;;N;;;;; +1333E;EGYPTIAN HIEROGLYPH U010;Lo;0;L;;;;;N;;;;; +1333F;EGYPTIAN HIEROGLYPH U011;Lo;0;L;;;;;N;;;;; +13340;EGYPTIAN HIEROGLYPH U012;Lo;0;L;;;;;N;;;;; +13341;EGYPTIAN HIEROGLYPH U013;Lo;0;L;;;;;N;;;;; +13342;EGYPTIAN HIEROGLYPH U014;Lo;0;L;;;;;N;;;;; +13343;EGYPTIAN HIEROGLYPH U015;Lo;0;L;;;;;N;;;;; +13344;EGYPTIAN HIEROGLYPH U016;Lo;0;L;;;;;N;;;;; +13345;EGYPTIAN HIEROGLYPH U017;Lo;0;L;;;;;N;;;;; +13346;EGYPTIAN HIEROGLYPH U018;Lo;0;L;;;;;N;;;;; +13347;EGYPTIAN HIEROGLYPH U019;Lo;0;L;;;;;N;;;;; +13348;EGYPTIAN HIEROGLYPH U020;Lo;0;L;;;;;N;;;;; +13349;EGYPTIAN HIEROGLYPH U021;Lo;0;L;;;;;N;;;;; +1334A;EGYPTIAN HIEROGLYPH U022;Lo;0;L;;;;;N;;;;; +1334B;EGYPTIAN HIEROGLYPH U023;Lo;0;L;;;;;N;;;;; +1334C;EGYPTIAN HIEROGLYPH U023A;Lo;0;L;;;;;N;;;;; +1334D;EGYPTIAN HIEROGLYPH U024;Lo;0;L;;;;;N;;;;; +1334E;EGYPTIAN HIEROGLYPH U025;Lo;0;L;;;;;N;;;;; +1334F;EGYPTIAN HIEROGLYPH U026;Lo;0;L;;;;;N;;;;; +13350;EGYPTIAN HIEROGLYPH U027;Lo;0;L;;;;;N;;;;; +13351;EGYPTIAN HIEROGLYPH U028;Lo;0;L;;;;;N;;;;; +13352;EGYPTIAN HIEROGLYPH U029;Lo;0;L;;;;;N;;;;; +13353;EGYPTIAN HIEROGLYPH U029A;Lo;0;L;;;;;N;;;;; +13354;EGYPTIAN HIEROGLYPH U030;Lo;0;L;;;;;N;;;;; +13355;EGYPTIAN HIEROGLYPH U031;Lo;0;L;;;;;N;;;;; +13356;EGYPTIAN HIEROGLYPH U032;Lo;0;L;;;;;N;;;;; +13357;EGYPTIAN HIEROGLYPH U032A;Lo;0;L;;;;;N;;;;; +13358;EGYPTIAN HIEROGLYPH U033;Lo;0;L;;;;;N;;;;; +13359;EGYPTIAN HIEROGLYPH U034;Lo;0;L;;;;;N;;;;; +1335A;EGYPTIAN HIEROGLYPH U035;Lo;0;L;;;;;N;;;;; +1335B;EGYPTIAN HIEROGLYPH U036;Lo;0;L;;;;;N;;;;; +1335C;EGYPTIAN HIEROGLYPH U037;Lo;0;L;;;;;N;;;;; +1335D;EGYPTIAN HIEROGLYPH U038;Lo;0;L;;;;;N;;;;; +1335E;EGYPTIAN HIEROGLYPH U039;Lo;0;L;;;;;N;;;;; +1335F;EGYPTIAN HIEROGLYPH U040;Lo;0;L;;;;;N;;;;; +13360;EGYPTIAN HIEROGLYPH U041;Lo;0;L;;;;;N;;;;; +13361;EGYPTIAN HIEROGLYPH U042;Lo;0;L;;;;;N;;;;; +13362;EGYPTIAN HIEROGLYPH V001;Lo;0;L;;;;;N;;;;; +13363;EGYPTIAN HIEROGLYPH V001A;Lo;0;L;;;;;N;;;;; +13364;EGYPTIAN HIEROGLYPH V001B;Lo;0;L;;;;;N;;;;; +13365;EGYPTIAN HIEROGLYPH V001C;Lo;0;L;;;;;N;;;;; +13366;EGYPTIAN HIEROGLYPH V001D;Lo;0;L;;;;;N;;;;; +13367;EGYPTIAN HIEROGLYPH V001E;Lo;0;L;;;;;N;;;;; +13368;EGYPTIAN HIEROGLYPH V001F;Lo;0;L;;;;;N;;;;; +13369;EGYPTIAN HIEROGLYPH V001G;Lo;0;L;;;;;N;;;;; +1336A;EGYPTIAN HIEROGLYPH V001H;Lo;0;L;;;;;N;;;;; +1336B;EGYPTIAN HIEROGLYPH V001I;Lo;0;L;;;;;N;;;;; +1336C;EGYPTIAN HIEROGLYPH V002;Lo;0;L;;;;;N;;;;; +1336D;EGYPTIAN HIEROGLYPH V002A;Lo;0;L;;;;;N;;;;; +1336E;EGYPTIAN HIEROGLYPH V003;Lo;0;L;;;;;N;;;;; +1336F;EGYPTIAN HIEROGLYPH V004;Lo;0;L;;;;;N;;;;; +13370;EGYPTIAN HIEROGLYPH V005;Lo;0;L;;;;;N;;;;; +13371;EGYPTIAN HIEROGLYPH V006;Lo;0;L;;;;;N;;;;; +13372;EGYPTIAN HIEROGLYPH V007;Lo;0;L;;;;;N;;;;; +13373;EGYPTIAN HIEROGLYPH V007A;Lo;0;L;;;;;N;;;;; +13374;EGYPTIAN HIEROGLYPH V007B;Lo;0;L;;;;;N;;;;; +13375;EGYPTIAN HIEROGLYPH V008;Lo;0;L;;;;;N;;;;; +13376;EGYPTIAN HIEROGLYPH V009;Lo;0;L;;;;;N;;;;; +13377;EGYPTIAN HIEROGLYPH V010;Lo;0;L;;;;;N;;;;; +13378;EGYPTIAN HIEROGLYPH V011;Lo;0;L;;;;;N;;;;; +13379;EGYPTIAN HIEROGLYPH V011A;Lo;0;L;;;;;N;;;;; +1337A;EGYPTIAN HIEROGLYPH V011B;Lo;0;L;;;;;N;;;;; +1337B;EGYPTIAN HIEROGLYPH V011C;Lo;0;L;;;;;N;;;;; +1337C;EGYPTIAN HIEROGLYPH V012;Lo;0;L;;;;;N;;;;; +1337D;EGYPTIAN HIEROGLYPH V012A;Lo;0;L;;;;;N;;;;; +1337E;EGYPTIAN HIEROGLYPH V012B;Lo;0;L;;;;;N;;;;; +1337F;EGYPTIAN HIEROGLYPH V013;Lo;0;L;;;;;N;;;;; +13380;EGYPTIAN HIEROGLYPH V014;Lo;0;L;;;;;N;;;;; +13381;EGYPTIAN HIEROGLYPH V015;Lo;0;L;;;;;N;;;;; +13382;EGYPTIAN HIEROGLYPH V016;Lo;0;L;;;;;N;;;;; +13383;EGYPTIAN HIEROGLYPH V017;Lo;0;L;;;;;N;;;;; +13384;EGYPTIAN HIEROGLYPH V018;Lo;0;L;;;;;N;;;;; +13385;EGYPTIAN HIEROGLYPH V019;Lo;0;L;;;;;N;;;;; +13386;EGYPTIAN HIEROGLYPH V020;Lo;0;L;;;;;N;;;;; +13387;EGYPTIAN HIEROGLYPH V020A;Lo;0;L;;;;;N;;;;; +13388;EGYPTIAN HIEROGLYPH V020B;Lo;0;L;;;;;N;;;;; +13389;EGYPTIAN HIEROGLYPH V020C;Lo;0;L;;;;;N;;;;; +1338A;EGYPTIAN HIEROGLYPH V020D;Lo;0;L;;;;;N;;;;; +1338B;EGYPTIAN HIEROGLYPH V020E;Lo;0;L;;;;;N;;;;; +1338C;EGYPTIAN HIEROGLYPH V020F;Lo;0;L;;;;;N;;;;; +1338D;EGYPTIAN HIEROGLYPH V020G;Lo;0;L;;;;;N;;;;; +1338E;EGYPTIAN HIEROGLYPH V020H;Lo;0;L;;;;;N;;;;; +1338F;EGYPTIAN HIEROGLYPH V020I;Lo;0;L;;;;;N;;;;; +13390;EGYPTIAN HIEROGLYPH V020J;Lo;0;L;;;;;N;;;;; +13391;EGYPTIAN HIEROGLYPH V020K;Lo;0;L;;;;;N;;;;; +13392;EGYPTIAN HIEROGLYPH V020L;Lo;0;L;;;;;N;;;;; +13393;EGYPTIAN HIEROGLYPH V021;Lo;0;L;;;;;N;;;;; +13394;EGYPTIAN HIEROGLYPH V022;Lo;0;L;;;;;N;;;;; +13395;EGYPTIAN HIEROGLYPH V023;Lo;0;L;;;;;N;;;;; +13396;EGYPTIAN HIEROGLYPH V023A;Lo;0;L;;;;;N;;;;; +13397;EGYPTIAN HIEROGLYPH V024;Lo;0;L;;;;;N;;;;; +13398;EGYPTIAN HIEROGLYPH V025;Lo;0;L;;;;;N;;;;; +13399;EGYPTIAN HIEROGLYPH V026;Lo;0;L;;;;;N;;;;; +1339A;EGYPTIAN HIEROGLYPH V027;Lo;0;L;;;;;N;;;;; +1339B;EGYPTIAN HIEROGLYPH V028;Lo;0;L;;;;;N;;;;; +1339C;EGYPTIAN HIEROGLYPH V028A;Lo;0;L;;;;;N;;;;; +1339D;EGYPTIAN HIEROGLYPH V029;Lo;0;L;;;;;N;;;;; +1339E;EGYPTIAN HIEROGLYPH V029A;Lo;0;L;;;;;N;;;;; +1339F;EGYPTIAN HIEROGLYPH V030;Lo;0;L;;;;;N;;;;; +133A0;EGYPTIAN HIEROGLYPH V030A;Lo;0;L;;;;;N;;;;; +133A1;EGYPTIAN HIEROGLYPH V031;Lo;0;L;;;;;N;;;;; +133A2;EGYPTIAN HIEROGLYPH V031A;Lo;0;L;;;;;N;;;;; +133A3;EGYPTIAN HIEROGLYPH V032;Lo;0;L;;;;;N;;;;; +133A4;EGYPTIAN HIEROGLYPH V033;Lo;0;L;;;;;N;;;;; +133A5;EGYPTIAN HIEROGLYPH V033A;Lo;0;L;;;;;N;;;;; +133A6;EGYPTIAN HIEROGLYPH V034;Lo;0;L;;;;;N;;;;; +133A7;EGYPTIAN HIEROGLYPH V035;Lo;0;L;;;;;N;;;;; +133A8;EGYPTIAN HIEROGLYPH V036;Lo;0;L;;;;;N;;;;; +133A9;EGYPTIAN HIEROGLYPH V037;Lo;0;L;;;;;N;;;;; +133AA;EGYPTIAN HIEROGLYPH V037A;Lo;0;L;;;;;N;;;;; +133AB;EGYPTIAN HIEROGLYPH V038;Lo;0;L;;;;;N;;;;; +133AC;EGYPTIAN HIEROGLYPH V039;Lo;0;L;;;;;N;;;;; +133AD;EGYPTIAN HIEROGLYPH V040;Lo;0;L;;;;;N;;;;; +133AE;EGYPTIAN HIEROGLYPH V040A;Lo;0;L;;;;;N;;;;; +133AF;EGYPTIAN HIEROGLYPH W001;Lo;0;L;;;;;N;;;;; +133B0;EGYPTIAN HIEROGLYPH W002;Lo;0;L;;;;;N;;;;; +133B1;EGYPTIAN HIEROGLYPH W003;Lo;0;L;;;;;N;;;;; +133B2;EGYPTIAN HIEROGLYPH W003A;Lo;0;L;;;;;N;;;;; +133B3;EGYPTIAN HIEROGLYPH W004;Lo;0;L;;;;;N;;;;; +133B4;EGYPTIAN HIEROGLYPH W005;Lo;0;L;;;;;N;;;;; +133B5;EGYPTIAN HIEROGLYPH W006;Lo;0;L;;;;;N;;;;; +133B6;EGYPTIAN HIEROGLYPH W007;Lo;0;L;;;;;N;;;;; +133B7;EGYPTIAN HIEROGLYPH W008;Lo;0;L;;;;;N;;;;; +133B8;EGYPTIAN HIEROGLYPH W009;Lo;0;L;;;;;N;;;;; +133B9;EGYPTIAN HIEROGLYPH W009A;Lo;0;L;;;;;N;;;;; +133BA;EGYPTIAN HIEROGLYPH W010;Lo;0;L;;;;;N;;;;; +133BB;EGYPTIAN HIEROGLYPH W010A;Lo;0;L;;;;;N;;;;; +133BC;EGYPTIAN HIEROGLYPH W011;Lo;0;L;;;;;N;;;;; +133BD;EGYPTIAN HIEROGLYPH W012;Lo;0;L;;;;;N;;;;; +133BE;EGYPTIAN HIEROGLYPH W013;Lo;0;L;;;;;N;;;;; +133BF;EGYPTIAN HIEROGLYPH W014;Lo;0;L;;;;;N;;;;; +133C0;EGYPTIAN HIEROGLYPH W014A;Lo;0;L;;;;;N;;;;; +133C1;EGYPTIAN HIEROGLYPH W015;Lo;0;L;;;;;N;;;;; +133C2;EGYPTIAN HIEROGLYPH W016;Lo;0;L;;;;;N;;;;; +133C3;EGYPTIAN HIEROGLYPH W017;Lo;0;L;;;;;N;;;;; +133C4;EGYPTIAN HIEROGLYPH W017A;Lo;0;L;;;;;N;;;;; +133C5;EGYPTIAN HIEROGLYPH W018;Lo;0;L;;;;;N;;;;; +133C6;EGYPTIAN HIEROGLYPH W018A;Lo;0;L;;;;;N;;;;; +133C7;EGYPTIAN HIEROGLYPH W019;Lo;0;L;;;;;N;;;;; +133C8;EGYPTIAN HIEROGLYPH W020;Lo;0;L;;;;;N;;;;; +133C9;EGYPTIAN HIEROGLYPH W021;Lo;0;L;;;;;N;;;;; +133CA;EGYPTIAN HIEROGLYPH W022;Lo;0;L;;;;;N;;;;; +133CB;EGYPTIAN HIEROGLYPH W023;Lo;0;L;;;;;N;;;;; +133CC;EGYPTIAN HIEROGLYPH W024;Lo;0;L;;;;;N;;;;; +133CD;EGYPTIAN HIEROGLYPH W024A;Lo;0;L;;;;;N;;;;; +133CE;EGYPTIAN HIEROGLYPH W025;Lo;0;L;;;;;N;;;;; +133CF;EGYPTIAN HIEROGLYPH X001;Lo;0;L;;;;;N;;;;; +133D0;EGYPTIAN HIEROGLYPH X002;Lo;0;L;;;;;N;;;;; +133D1;EGYPTIAN HIEROGLYPH X003;Lo;0;L;;;;;N;;;;; +133D2;EGYPTIAN HIEROGLYPH X004;Lo;0;L;;;;;N;;;;; +133D3;EGYPTIAN HIEROGLYPH X004A;Lo;0;L;;;;;N;;;;; +133D4;EGYPTIAN HIEROGLYPH X004B;Lo;0;L;;;;;N;;;;; +133D5;EGYPTIAN HIEROGLYPH X005;Lo;0;L;;;;;N;;;;; +133D6;EGYPTIAN HIEROGLYPH X006;Lo;0;L;;;;;N;;;;; +133D7;EGYPTIAN HIEROGLYPH X006A;Lo;0;L;;;;;N;;;;; +133D8;EGYPTIAN HIEROGLYPH X007;Lo;0;L;;;;;N;;;;; +133D9;EGYPTIAN HIEROGLYPH X008;Lo;0;L;;;;;N;;;;; +133DA;EGYPTIAN HIEROGLYPH X008A;Lo;0;L;;;;;N;;;;; +133DB;EGYPTIAN HIEROGLYPH Y001;Lo;0;L;;;;;N;;;;; +133DC;EGYPTIAN HIEROGLYPH Y001A;Lo;0;L;;;;;N;;;;; +133DD;EGYPTIAN HIEROGLYPH Y002;Lo;0;L;;;;;N;;;;; +133DE;EGYPTIAN HIEROGLYPH Y003;Lo;0;L;;;;;N;;;;; +133DF;EGYPTIAN HIEROGLYPH Y004;Lo;0;L;;;;;N;;;;; +133E0;EGYPTIAN HIEROGLYPH Y005;Lo;0;L;;;;;N;;;;; +133E1;EGYPTIAN HIEROGLYPH Y006;Lo;0;L;;;;;N;;;;; +133E2;EGYPTIAN HIEROGLYPH Y007;Lo;0;L;;;;;N;;;;; +133E3;EGYPTIAN HIEROGLYPH Y008;Lo;0;L;;;;;N;;;;; +133E4;EGYPTIAN HIEROGLYPH Z001;Lo;0;L;;;;;N;;;;; +133E5;EGYPTIAN HIEROGLYPH Z002;Lo;0;L;;;;;N;;;;; +133E6;EGYPTIAN HIEROGLYPH Z002A;Lo;0;L;;;;;N;;;;; +133E7;EGYPTIAN HIEROGLYPH Z002B;Lo;0;L;;;;;N;;;;; +133E8;EGYPTIAN HIEROGLYPH Z002C;Lo;0;L;;;;;N;;;;; +133E9;EGYPTIAN HIEROGLYPH Z002D;Lo;0;L;;;;;N;;;;; +133EA;EGYPTIAN HIEROGLYPH Z003;Lo;0;L;;;;;N;;;;; +133EB;EGYPTIAN HIEROGLYPH Z003A;Lo;0;L;;;;;N;;;;; +133EC;EGYPTIAN HIEROGLYPH Z003B;Lo;0;L;;;;;N;;;;; +133ED;EGYPTIAN HIEROGLYPH Z004;Lo;0;L;;;;;N;;;;; +133EE;EGYPTIAN HIEROGLYPH Z004A;Lo;0;L;;;;;N;;;;; +133EF;EGYPTIAN HIEROGLYPH Z005;Lo;0;L;;;;;N;;;;; +133F0;EGYPTIAN HIEROGLYPH Z005A;Lo;0;L;;;;;N;;;;; +133F1;EGYPTIAN HIEROGLYPH Z006;Lo;0;L;;;;;N;;;;; +133F2;EGYPTIAN HIEROGLYPH Z007;Lo;0;L;;;;;N;;;;; +133F3;EGYPTIAN HIEROGLYPH Z008;Lo;0;L;;;;;N;;;;; +133F4;EGYPTIAN HIEROGLYPH Z009;Lo;0;L;;;;;N;;;;; +133F5;EGYPTIAN HIEROGLYPH Z010;Lo;0;L;;;;;N;;;;; +133F6;EGYPTIAN HIEROGLYPH Z011;Lo;0;L;;;;;N;;;;; +133F7;EGYPTIAN HIEROGLYPH Z012;Lo;0;L;;;;;N;;;;; +133F8;EGYPTIAN HIEROGLYPH Z013;Lo;0;L;;;;;N;;;;; +133F9;EGYPTIAN HIEROGLYPH Z014;Lo;0;L;;;;;N;;;;; +133FA;EGYPTIAN HIEROGLYPH Z015;Lo;0;L;;;;;N;;;;; +133FB;EGYPTIAN HIEROGLYPH Z015A;Lo;0;L;;;;;N;;;;; +133FC;EGYPTIAN HIEROGLYPH Z015B;Lo;0;L;;;;;N;;;;; +133FD;EGYPTIAN HIEROGLYPH Z015C;Lo;0;L;;;;;N;;;;; +133FE;EGYPTIAN HIEROGLYPH Z015D;Lo;0;L;;;;;N;;;;; +133FF;EGYPTIAN HIEROGLYPH Z015E;Lo;0;L;;;;;N;;;;; +13400;EGYPTIAN HIEROGLYPH Z015F;Lo;0;L;;;;;N;;;;; +13401;EGYPTIAN HIEROGLYPH Z015G;Lo;0;L;;;;;N;;;;; +13402;EGYPTIAN HIEROGLYPH Z015H;Lo;0;L;;;;;N;;;;; +13403;EGYPTIAN HIEROGLYPH Z015I;Lo;0;L;;;;;N;;;;; +13404;EGYPTIAN HIEROGLYPH Z016;Lo;0;L;;;;;N;;;;; +13405;EGYPTIAN HIEROGLYPH Z016A;Lo;0;L;;;;;N;;;;; +13406;EGYPTIAN HIEROGLYPH Z016B;Lo;0;L;;;;;N;;;;; +13407;EGYPTIAN HIEROGLYPH Z016C;Lo;0;L;;;;;N;;;;; +13408;EGYPTIAN HIEROGLYPH Z016D;Lo;0;L;;;;;N;;;;; +13409;EGYPTIAN HIEROGLYPH Z016E;Lo;0;L;;;;;N;;;;; +1340A;EGYPTIAN HIEROGLYPH Z016F;Lo;0;L;;;;;N;;;;; +1340B;EGYPTIAN HIEROGLYPH Z016G;Lo;0;L;;;;;N;;;;; +1340C;EGYPTIAN HIEROGLYPH Z016H;Lo;0;L;;;;;N;;;;; +1340D;EGYPTIAN HIEROGLYPH AA001;Lo;0;L;;;;;N;;;;; +1340E;EGYPTIAN HIEROGLYPH AA002;Lo;0;L;;;;;N;;;;; +1340F;EGYPTIAN HIEROGLYPH AA003;Lo;0;L;;;;;N;;;;; +13410;EGYPTIAN HIEROGLYPH AA004;Lo;0;L;;;;;N;;;;; +13411;EGYPTIAN HIEROGLYPH AA005;Lo;0;L;;;;;N;;;;; +13412;EGYPTIAN HIEROGLYPH AA006;Lo;0;L;;;;;N;;;;; +13413;EGYPTIAN HIEROGLYPH AA007;Lo;0;L;;;;;N;;;;; +13414;EGYPTIAN HIEROGLYPH AA007A;Lo;0;L;;;;;N;;;;; +13415;EGYPTIAN HIEROGLYPH AA007B;Lo;0;L;;;;;N;;;;; +13416;EGYPTIAN HIEROGLYPH AA008;Lo;0;L;;;;;N;;;;; +13417;EGYPTIAN HIEROGLYPH AA009;Lo;0;L;;;;;N;;;;; +13418;EGYPTIAN HIEROGLYPH AA010;Lo;0;L;;;;;N;;;;; +13419;EGYPTIAN HIEROGLYPH AA011;Lo;0;L;;;;;N;;;;; +1341A;EGYPTIAN HIEROGLYPH AA012;Lo;0;L;;;;;N;;;;; +1341B;EGYPTIAN HIEROGLYPH AA013;Lo;0;L;;;;;N;;;;; +1341C;EGYPTIAN HIEROGLYPH AA014;Lo;0;L;;;;;N;;;;; +1341D;EGYPTIAN HIEROGLYPH AA015;Lo;0;L;;;;;N;;;;; +1341E;EGYPTIAN HIEROGLYPH AA016;Lo;0;L;;;;;N;;;;; +1341F;EGYPTIAN HIEROGLYPH AA017;Lo;0;L;;;;;N;;;;; +13420;EGYPTIAN HIEROGLYPH AA018;Lo;0;L;;;;;N;;;;; +13421;EGYPTIAN HIEROGLYPH AA019;Lo;0;L;;;;;N;;;;; +13422;EGYPTIAN HIEROGLYPH AA020;Lo;0;L;;;;;N;;;;; +13423;EGYPTIAN HIEROGLYPH AA021;Lo;0;L;;;;;N;;;;; +13424;EGYPTIAN HIEROGLYPH AA022;Lo;0;L;;;;;N;;;;; +13425;EGYPTIAN HIEROGLYPH AA023;Lo;0;L;;;;;N;;;;; +13426;EGYPTIAN HIEROGLYPH AA024;Lo;0;L;;;;;N;;;;; +13427;EGYPTIAN HIEROGLYPH AA025;Lo;0;L;;;;;N;;;;; +13428;EGYPTIAN HIEROGLYPH AA026;Lo;0;L;;;;;N;;;;; +13429;EGYPTIAN HIEROGLYPH AA027;Lo;0;L;;;;;N;;;;; +1342A;EGYPTIAN HIEROGLYPH AA028;Lo;0;L;;;;;N;;;;; +1342B;EGYPTIAN HIEROGLYPH AA029;Lo;0;L;;;;;N;;;;; +1342C;EGYPTIAN HIEROGLYPH AA030;Lo;0;L;;;;;N;;;;; +1342D;EGYPTIAN HIEROGLYPH AA031;Lo;0;L;;;;;N;;;;; +1342E;EGYPTIAN HIEROGLYPH AA032;Lo;0;L;;;;;N;;;;; +14400;ANATOLIAN HIEROGLYPH A001;Lo;0;L;;;;;N;;;;; +14401;ANATOLIAN HIEROGLYPH A002;Lo;0;L;;;;;N;;;;; +14402;ANATOLIAN HIEROGLYPH A003;Lo;0;L;;;;;N;;;;; +14403;ANATOLIAN HIEROGLYPH A004;Lo;0;L;;;;;N;;;;; +14404;ANATOLIAN HIEROGLYPH A005;Lo;0;L;;;;;N;;;;; +14405;ANATOLIAN HIEROGLYPH A006;Lo;0;L;;;;;N;;;;; +14406;ANATOLIAN HIEROGLYPH A007;Lo;0;L;;;;;N;;;;; +14407;ANATOLIAN HIEROGLYPH A008;Lo;0;L;;;;;N;;;;; +14408;ANATOLIAN HIEROGLYPH A009;Lo;0;L;;;;;N;;;;; +14409;ANATOLIAN HIEROGLYPH A010;Lo;0;L;;;;;N;;;;; +1440A;ANATOLIAN HIEROGLYPH A010A;Lo;0;L;;;;;N;;;;; +1440B;ANATOLIAN HIEROGLYPH A011;Lo;0;L;;;;;N;;;;; +1440C;ANATOLIAN HIEROGLYPH A012;Lo;0;L;;;;;N;;;;; +1440D;ANATOLIAN HIEROGLYPH A013;Lo;0;L;;;;;N;;;;; +1440E;ANATOLIAN HIEROGLYPH A014;Lo;0;L;;;;;N;;;;; +1440F;ANATOLIAN HIEROGLYPH A015;Lo;0;L;;;;;N;;;;; +14410;ANATOLIAN HIEROGLYPH A016;Lo;0;L;;;;;N;;;;; +14411;ANATOLIAN HIEROGLYPH A017;Lo;0;L;;;;;N;;;;; +14412;ANATOLIAN HIEROGLYPH A018;Lo;0;L;;;;;N;;;;; +14413;ANATOLIAN HIEROGLYPH A019;Lo;0;L;;;;;N;;;;; +14414;ANATOLIAN HIEROGLYPH A020;Lo;0;L;;;;;N;;;;; +14415;ANATOLIAN HIEROGLYPH A021;Lo;0;L;;;;;N;;;;; +14416;ANATOLIAN HIEROGLYPH A022;Lo;0;L;;;;;N;;;;; +14417;ANATOLIAN HIEROGLYPH A023;Lo;0;L;;;;;N;;;;; +14418;ANATOLIAN HIEROGLYPH A024;Lo;0;L;;;;;N;;;;; +14419;ANATOLIAN HIEROGLYPH A025;Lo;0;L;;;;;N;;;;; +1441A;ANATOLIAN HIEROGLYPH A026;Lo;0;L;;;;;N;;;;; +1441B;ANATOLIAN HIEROGLYPH A026A;Lo;0;L;;;;;N;;;;; +1441C;ANATOLIAN HIEROGLYPH A027;Lo;0;L;;;;;N;;;;; +1441D;ANATOLIAN HIEROGLYPH A028;Lo;0;L;;;;;N;;;;; +1441E;ANATOLIAN HIEROGLYPH A029;Lo;0;L;;;;;N;;;;; +1441F;ANATOLIAN HIEROGLYPH A030;Lo;0;L;;;;;N;;;;; +14420;ANATOLIAN HIEROGLYPH A031;Lo;0;L;;;;;N;;;;; +14421;ANATOLIAN HIEROGLYPH A032;Lo;0;L;;;;;N;;;;; +14422;ANATOLIAN HIEROGLYPH A033;Lo;0;L;;;;;N;;;;; +14423;ANATOLIAN HIEROGLYPH A034;Lo;0;L;;;;;N;;;;; +14424;ANATOLIAN HIEROGLYPH A035;Lo;0;L;;;;;N;;;;; +14425;ANATOLIAN HIEROGLYPH A036;Lo;0;L;;;;;N;;;;; +14426;ANATOLIAN HIEROGLYPH A037;Lo;0;L;;;;;N;;;;; +14427;ANATOLIAN HIEROGLYPH A038;Lo;0;L;;;;;N;;;;; +14428;ANATOLIAN HIEROGLYPH A039;Lo;0;L;;;;;N;;;;; +14429;ANATOLIAN HIEROGLYPH A039A;Lo;0;L;;;;;N;;;;; +1442A;ANATOLIAN HIEROGLYPH A040;Lo;0;L;;;;;N;;;;; +1442B;ANATOLIAN HIEROGLYPH A041;Lo;0;L;;;;;N;;;;; +1442C;ANATOLIAN HIEROGLYPH A041A;Lo;0;L;;;;;N;;;;; +1442D;ANATOLIAN HIEROGLYPH A042;Lo;0;L;;;;;N;;;;; +1442E;ANATOLIAN HIEROGLYPH A043;Lo;0;L;;;;;N;;;;; +1442F;ANATOLIAN HIEROGLYPH A044;Lo;0;L;;;;;N;;;;; +14430;ANATOLIAN HIEROGLYPH A045;Lo;0;L;;;;;N;;;;; +14431;ANATOLIAN HIEROGLYPH A045A;Lo;0;L;;;;;N;;;;; +14432;ANATOLIAN HIEROGLYPH A046;Lo;0;L;;;;;N;;;;; +14433;ANATOLIAN HIEROGLYPH A046A;Lo;0;L;;;;;N;;;;; +14434;ANATOLIAN HIEROGLYPH A046B;Lo;0;L;;;;;N;;;;; +14435;ANATOLIAN HIEROGLYPH A047;Lo;0;L;;;;;N;;;;; +14436;ANATOLIAN HIEROGLYPH A048;Lo;0;L;;;;;N;;;;; +14437;ANATOLIAN HIEROGLYPH A049;Lo;0;L;;;;;N;;;;; +14438;ANATOLIAN HIEROGLYPH A050;Lo;0;L;;;;;N;;;;; +14439;ANATOLIAN HIEROGLYPH A051;Lo;0;L;;;;;N;;;;; +1443A;ANATOLIAN HIEROGLYPH A052;Lo;0;L;;;;;N;;;;; +1443B;ANATOLIAN HIEROGLYPH A053;Lo;0;L;;;;;N;;;;; +1443C;ANATOLIAN HIEROGLYPH A054;Lo;0;L;;;;;N;;;;; +1443D;ANATOLIAN HIEROGLYPH A055;Lo;0;L;;;;;N;;;;; +1443E;ANATOLIAN HIEROGLYPH A056;Lo;0;L;;;;;N;;;;; +1443F;ANATOLIAN HIEROGLYPH A057;Lo;0;L;;;;;N;;;;; +14440;ANATOLIAN HIEROGLYPH A058;Lo;0;L;;;;;N;;;;; +14441;ANATOLIAN HIEROGLYPH A059;Lo;0;L;;;;;N;;;;; +14442;ANATOLIAN HIEROGLYPH A060;Lo;0;L;;;;;N;;;;; +14443;ANATOLIAN HIEROGLYPH A061;Lo;0;L;;;;;N;;;;; +14444;ANATOLIAN HIEROGLYPH A062;Lo;0;L;;;;;N;;;;; +14445;ANATOLIAN HIEROGLYPH A063;Lo;0;L;;;;;N;;;;; +14446;ANATOLIAN HIEROGLYPH A064;Lo;0;L;;;;;N;;;;; +14447;ANATOLIAN HIEROGLYPH A065;Lo;0;L;;;;;N;;;;; +14448;ANATOLIAN HIEROGLYPH A066;Lo;0;L;;;;;N;;;;; +14449;ANATOLIAN HIEROGLYPH A066A;Lo;0;L;;;;;N;;;;; +1444A;ANATOLIAN HIEROGLYPH A066B;Lo;0;L;;;;;N;;;;; +1444B;ANATOLIAN HIEROGLYPH A066C;Lo;0;L;;;;;N;;;;; +1444C;ANATOLIAN HIEROGLYPH A067;Lo;0;L;;;;;N;;;;; +1444D;ANATOLIAN HIEROGLYPH A068;Lo;0;L;;;;;N;;;;; +1444E;ANATOLIAN HIEROGLYPH A069;Lo;0;L;;;;;N;;;;; +1444F;ANATOLIAN HIEROGLYPH A070;Lo;0;L;;;;;N;;;;; +14450;ANATOLIAN HIEROGLYPH A071;Lo;0;L;;;;;N;;;;; +14451;ANATOLIAN HIEROGLYPH A072;Lo;0;L;;;;;N;;;;; +14452;ANATOLIAN HIEROGLYPH A073;Lo;0;L;;;;;N;;;;; +14453;ANATOLIAN HIEROGLYPH A074;Lo;0;L;;;;;N;;;;; +14454;ANATOLIAN HIEROGLYPH A075;Lo;0;L;;;;;N;;;;; +14455;ANATOLIAN HIEROGLYPH A076;Lo;0;L;;;;;N;;;;; +14456;ANATOLIAN HIEROGLYPH A077;Lo;0;L;;;;;N;;;;; +14457;ANATOLIAN HIEROGLYPH A078;Lo;0;L;;;;;N;;;;; +14458;ANATOLIAN HIEROGLYPH A079;Lo;0;L;;;;;N;;;;; +14459;ANATOLIAN HIEROGLYPH A080;Lo;0;L;;;;;N;;;;; +1445A;ANATOLIAN HIEROGLYPH A081;Lo;0;L;;;;;N;;;;; +1445B;ANATOLIAN HIEROGLYPH A082;Lo;0;L;;;;;N;;;;; +1445C;ANATOLIAN HIEROGLYPH A083;Lo;0;L;;;;;N;;;;; +1445D;ANATOLIAN HIEROGLYPH A084;Lo;0;L;;;;;N;;;;; +1445E;ANATOLIAN HIEROGLYPH A085;Lo;0;L;;;;;N;;;;; +1445F;ANATOLIAN HIEROGLYPH A086;Lo;0;L;;;;;N;;;;; +14460;ANATOLIAN HIEROGLYPH A087;Lo;0;L;;;;;N;;;;; +14461;ANATOLIAN HIEROGLYPH A088;Lo;0;L;;;;;N;;;;; +14462;ANATOLIAN HIEROGLYPH A089;Lo;0;L;;;;;N;;;;; +14463;ANATOLIAN HIEROGLYPH A090;Lo;0;L;;;;;N;;;;; +14464;ANATOLIAN HIEROGLYPH A091;Lo;0;L;;;;;N;;;;; +14465;ANATOLIAN HIEROGLYPH A092;Lo;0;L;;;;;N;;;;; +14466;ANATOLIAN HIEROGLYPH A093;Lo;0;L;;;;;N;;;;; +14467;ANATOLIAN HIEROGLYPH A094;Lo;0;L;;;;;N;;;;; +14468;ANATOLIAN HIEROGLYPH A095;Lo;0;L;;;;;N;;;;; +14469;ANATOLIAN HIEROGLYPH A096;Lo;0;L;;;;;N;;;;; +1446A;ANATOLIAN HIEROGLYPH A097;Lo;0;L;;;;;N;;;;; +1446B;ANATOLIAN HIEROGLYPH A097A;Lo;0;L;;;;;N;;;;; +1446C;ANATOLIAN HIEROGLYPH A098;Lo;0;L;;;;;N;;;;; +1446D;ANATOLIAN HIEROGLYPH A098A;Lo;0;L;;;;;N;;;;; +1446E;ANATOLIAN HIEROGLYPH A099;Lo;0;L;;;;;N;;;;; +1446F;ANATOLIAN HIEROGLYPH A100;Lo;0;L;;;;;N;;;;; +14470;ANATOLIAN HIEROGLYPH A100A;Lo;0;L;;;;;N;;;;; +14471;ANATOLIAN HIEROGLYPH A101;Lo;0;L;;;;;N;;;;; +14472;ANATOLIAN HIEROGLYPH A101A;Lo;0;L;;;;;N;;;;; +14473;ANATOLIAN HIEROGLYPH A102;Lo;0;L;;;;;N;;;;; +14474;ANATOLIAN HIEROGLYPH A102A;Lo;0;L;;;;;N;;;;; +14475;ANATOLIAN HIEROGLYPH A103;Lo;0;L;;;;;N;;;;; +14476;ANATOLIAN HIEROGLYPH A104;Lo;0;L;;;;;N;;;;; +14477;ANATOLIAN HIEROGLYPH A104A;Lo;0;L;;;;;N;;;;; +14478;ANATOLIAN HIEROGLYPH A104B;Lo;0;L;;;;;N;;;;; +14479;ANATOLIAN HIEROGLYPH A104C;Lo;0;L;;;;;N;;;;; +1447A;ANATOLIAN HIEROGLYPH A105;Lo;0;L;;;;;N;;;;; +1447B;ANATOLIAN HIEROGLYPH A105A;Lo;0;L;;;;;N;;;;; +1447C;ANATOLIAN HIEROGLYPH A105B;Lo;0;L;;;;;N;;;;; +1447D;ANATOLIAN HIEROGLYPH A106;Lo;0;L;;;;;N;;;;; +1447E;ANATOLIAN HIEROGLYPH A107;Lo;0;L;;;;;N;;;;; +1447F;ANATOLIAN HIEROGLYPH A107A;Lo;0;L;;;;;N;;;;; +14480;ANATOLIAN HIEROGLYPH A107B;Lo;0;L;;;;;N;;;;; +14481;ANATOLIAN HIEROGLYPH A107C;Lo;0;L;;;;;N;;;;; +14482;ANATOLIAN HIEROGLYPH A108;Lo;0;L;;;;;N;;;;; +14483;ANATOLIAN HIEROGLYPH A109;Lo;0;L;;;;;N;;;;; +14484;ANATOLIAN HIEROGLYPH A110;Lo;0;L;;;;;N;;;;; +14485;ANATOLIAN HIEROGLYPH A110A;Lo;0;L;;;;;N;;;;; +14486;ANATOLIAN HIEROGLYPH A110B;Lo;0;L;;;;;N;;;;; +14487;ANATOLIAN HIEROGLYPH A111;Lo;0;L;;;;;N;;;;; +14488;ANATOLIAN HIEROGLYPH A112;Lo;0;L;;;;;N;;;;; +14489;ANATOLIAN HIEROGLYPH A113;Lo;0;L;;;;;N;;;;; +1448A;ANATOLIAN HIEROGLYPH A114;Lo;0;L;;;;;N;;;;; +1448B;ANATOLIAN HIEROGLYPH A115;Lo;0;L;;;;;N;;;;; +1448C;ANATOLIAN HIEROGLYPH A115A;Lo;0;L;;;;;N;;;;; +1448D;ANATOLIAN HIEROGLYPH A116;Lo;0;L;;;;;N;;;;; +1448E;ANATOLIAN HIEROGLYPH A117;Lo;0;L;;;;;N;;;;; +1448F;ANATOLIAN HIEROGLYPH A118;Lo;0;L;;;;;N;;;;; +14490;ANATOLIAN HIEROGLYPH A119;Lo;0;L;;;;;N;;;;; +14491;ANATOLIAN HIEROGLYPH A120;Lo;0;L;;;;;N;;;;; +14492;ANATOLIAN HIEROGLYPH A121;Lo;0;L;;;;;N;;;;; +14493;ANATOLIAN HIEROGLYPH A122;Lo;0;L;;;;;N;;;;; +14494;ANATOLIAN HIEROGLYPH A123;Lo;0;L;;;;;N;;;;; +14495;ANATOLIAN HIEROGLYPH A124;Lo;0;L;;;;;N;;;;; +14496;ANATOLIAN HIEROGLYPH A125;Lo;0;L;;;;;N;;;;; +14497;ANATOLIAN HIEROGLYPH A125A;Lo;0;L;;;;;N;;;;; +14498;ANATOLIAN HIEROGLYPH A126;Lo;0;L;;;;;N;;;;; +14499;ANATOLIAN HIEROGLYPH A127;Lo;0;L;;;;;N;;;;; +1449A;ANATOLIAN HIEROGLYPH A128;Lo;0;L;;;;;N;;;;; +1449B;ANATOLIAN HIEROGLYPH A129;Lo;0;L;;;;;N;;;;; +1449C;ANATOLIAN HIEROGLYPH A130;Lo;0;L;;;;;N;;;;; +1449D;ANATOLIAN HIEROGLYPH A131;Lo;0;L;;;;;N;;;;; +1449E;ANATOLIAN HIEROGLYPH A132;Lo;0;L;;;;;N;;;;; +1449F;ANATOLIAN HIEROGLYPH A133;Lo;0;L;;;;;N;;;;; +144A0;ANATOLIAN HIEROGLYPH A134;Lo;0;L;;;;;N;;;;; +144A1;ANATOLIAN HIEROGLYPH A135;Lo;0;L;;;;;N;;;;; +144A2;ANATOLIAN HIEROGLYPH A135A;Lo;0;L;;;;;N;;;;; +144A3;ANATOLIAN HIEROGLYPH A136;Lo;0;L;;;;;N;;;;; +144A4;ANATOLIAN HIEROGLYPH A137;Lo;0;L;;;;;N;;;;; +144A5;ANATOLIAN HIEROGLYPH A138;Lo;0;L;;;;;N;;;;; +144A6;ANATOLIAN HIEROGLYPH A139;Lo;0;L;;;;;N;;;;; +144A7;ANATOLIAN HIEROGLYPH A140;Lo;0;L;;;;;N;;;;; +144A8;ANATOLIAN HIEROGLYPH A141;Lo;0;L;;;;;N;;;;; +144A9;ANATOLIAN HIEROGLYPH A142;Lo;0;L;;;;;N;;;;; +144AA;ANATOLIAN HIEROGLYPH A143;Lo;0;L;;;;;N;;;;; +144AB;ANATOLIAN HIEROGLYPH A144;Lo;0;L;;;;;N;;;;; +144AC;ANATOLIAN HIEROGLYPH A145;Lo;0;L;;;;;N;;;;; +144AD;ANATOLIAN HIEROGLYPH A146;Lo;0;L;;;;;N;;;;; +144AE;ANATOLIAN HIEROGLYPH A147;Lo;0;L;;;;;N;;;;; +144AF;ANATOLIAN HIEROGLYPH A148;Lo;0;L;;;;;N;;;;; +144B0;ANATOLIAN HIEROGLYPH A149;Lo;0;L;;;;;N;;;;; +144B1;ANATOLIAN HIEROGLYPH A150;Lo;0;L;;;;;N;;;;; +144B2;ANATOLIAN HIEROGLYPH A151;Lo;0;L;;;;;N;;;;; +144B3;ANATOLIAN HIEROGLYPH A152;Lo;0;L;;;;;N;;;;; +144B4;ANATOLIAN HIEROGLYPH A153;Lo;0;L;;;;;N;;;;; +144B5;ANATOLIAN HIEROGLYPH A154;Lo;0;L;;;;;N;;;;; +144B6;ANATOLIAN HIEROGLYPH A155;Lo;0;L;;;;;N;;;;; +144B7;ANATOLIAN HIEROGLYPH A156;Lo;0;L;;;;;N;;;;; +144B8;ANATOLIAN HIEROGLYPH A157;Lo;0;L;;;;;N;;;;; +144B9;ANATOLIAN HIEROGLYPH A158;Lo;0;L;;;;;N;;;;; +144BA;ANATOLIAN HIEROGLYPH A159;Lo;0;L;;;;;N;;;;; +144BB;ANATOLIAN HIEROGLYPH A160;Lo;0;L;;;;;N;;;;; +144BC;ANATOLIAN HIEROGLYPH A161;Lo;0;L;;;;;N;;;;; +144BD;ANATOLIAN HIEROGLYPH A162;Lo;0;L;;;;;N;;;;; +144BE;ANATOLIAN HIEROGLYPH A163;Lo;0;L;;;;;N;;;;; +144BF;ANATOLIAN HIEROGLYPH A164;Lo;0;L;;;;;N;;;;; +144C0;ANATOLIAN HIEROGLYPH A165;Lo;0;L;;;;;N;;;;; +144C1;ANATOLIAN HIEROGLYPH A166;Lo;0;L;;;;;N;;;;; +144C2;ANATOLIAN HIEROGLYPH A167;Lo;0;L;;;;;N;;;;; +144C3;ANATOLIAN HIEROGLYPH A168;Lo;0;L;;;;;N;;;;; +144C4;ANATOLIAN HIEROGLYPH A169;Lo;0;L;;;;;N;;;;; +144C5;ANATOLIAN HIEROGLYPH A170;Lo;0;L;;;;;N;;;;; +144C6;ANATOLIAN HIEROGLYPH A171;Lo;0;L;;;;;N;;;;; +144C7;ANATOLIAN HIEROGLYPH A172;Lo;0;L;;;;;N;;;;; +144C8;ANATOLIAN HIEROGLYPH A173;Lo;0;L;;;;;N;;;;; +144C9;ANATOLIAN HIEROGLYPH A174;Lo;0;L;;;;;N;;;;; +144CA;ANATOLIAN HIEROGLYPH A175;Lo;0;L;;;;;N;;;;; +144CB;ANATOLIAN HIEROGLYPH A176;Lo;0;L;;;;;N;;;;; +144CC;ANATOLIAN HIEROGLYPH A177;Lo;0;L;;;;;N;;;;; +144CD;ANATOLIAN HIEROGLYPH A178;Lo;0;L;;;;;N;;;;; +144CE;ANATOLIAN HIEROGLYPH A179;Lo;0;L;;;;;N;;;;; +144CF;ANATOLIAN HIEROGLYPH A180;Lo;0;L;;;;;N;;;;; +144D0;ANATOLIAN HIEROGLYPH A181;Lo;0;L;;;;;N;;;;; +144D1;ANATOLIAN HIEROGLYPH A182;Lo;0;L;;;;;N;;;;; +144D2;ANATOLIAN HIEROGLYPH A183;Lo;0;L;;;;;N;;;;; +144D3;ANATOLIAN HIEROGLYPH A184;Lo;0;L;;;;;N;;;;; +144D4;ANATOLIAN HIEROGLYPH A185;Lo;0;L;;;;;N;;;;; +144D5;ANATOLIAN HIEROGLYPH A186;Lo;0;L;;;;;N;;;;; +144D6;ANATOLIAN HIEROGLYPH A187;Lo;0;L;;;;;N;;;;; +144D7;ANATOLIAN HIEROGLYPH A188;Lo;0;L;;;;;N;;;;; +144D8;ANATOLIAN HIEROGLYPH A189;Lo;0;L;;;;;N;;;;; +144D9;ANATOLIAN HIEROGLYPH A190;Lo;0;L;;;;;N;;;;; +144DA;ANATOLIAN HIEROGLYPH A191;Lo;0;L;;;;;N;;;;; +144DB;ANATOLIAN HIEROGLYPH A192;Lo;0;L;;;;;N;;;;; +144DC;ANATOLIAN HIEROGLYPH A193;Lo;0;L;;;;;N;;;;; +144DD;ANATOLIAN HIEROGLYPH A194;Lo;0;L;;;;;N;;;;; +144DE;ANATOLIAN HIEROGLYPH A195;Lo;0;L;;;;;N;;;;; +144DF;ANATOLIAN HIEROGLYPH A196;Lo;0;L;;;;;N;;;;; +144E0;ANATOLIAN HIEROGLYPH A197;Lo;0;L;;;;;N;;;;; +144E1;ANATOLIAN HIEROGLYPH A198;Lo;0;L;;;;;N;;;;; +144E2;ANATOLIAN HIEROGLYPH A199;Lo;0;L;;;;;N;;;;; +144E3;ANATOLIAN HIEROGLYPH A200;Lo;0;L;;;;;N;;;;; +144E4;ANATOLIAN HIEROGLYPH A201;Lo;0;L;;;;;N;;;;; +144E5;ANATOLIAN HIEROGLYPH A202;Lo;0;L;;;;;N;;;;; +144E6;ANATOLIAN HIEROGLYPH A202A;Lo;0;L;;;;;N;;;;; +144E7;ANATOLIAN HIEROGLYPH A202B;Lo;0;L;;;;;N;;;;; +144E8;ANATOLIAN HIEROGLYPH A203;Lo;0;L;;;;;N;;;;; +144E9;ANATOLIAN HIEROGLYPH A204;Lo;0;L;;;;;N;;;;; +144EA;ANATOLIAN HIEROGLYPH A205;Lo;0;L;;;;;N;;;;; +144EB;ANATOLIAN HIEROGLYPH A206;Lo;0;L;;;;;N;;;;; +144EC;ANATOLIAN HIEROGLYPH A207;Lo;0;L;;;;;N;;;;; +144ED;ANATOLIAN HIEROGLYPH A207A;Lo;0;L;;;;;N;;;;; +144EE;ANATOLIAN HIEROGLYPH A208;Lo;0;L;;;;;N;;;;; +144EF;ANATOLIAN HIEROGLYPH A209;Lo;0;L;;;;;N;;;;; +144F0;ANATOLIAN HIEROGLYPH A209A;Lo;0;L;;;;;N;;;;; +144F1;ANATOLIAN HIEROGLYPH A210;Lo;0;L;;;;;N;;;;; +144F2;ANATOLIAN HIEROGLYPH A211;Lo;0;L;;;;;N;;;;; +144F3;ANATOLIAN HIEROGLYPH A212;Lo;0;L;;;;;N;;;;; +144F4;ANATOLIAN HIEROGLYPH A213;Lo;0;L;;;;;N;;;;; +144F5;ANATOLIAN HIEROGLYPH A214;Lo;0;L;;;;;N;;;;; +144F6;ANATOLIAN HIEROGLYPH A215;Lo;0;L;;;;;N;;;;; +144F7;ANATOLIAN HIEROGLYPH A215A;Lo;0;L;;;;;N;;;;; +144F8;ANATOLIAN HIEROGLYPH A216;Lo;0;L;;;;;N;;;;; +144F9;ANATOLIAN HIEROGLYPH A216A;Lo;0;L;;;;;N;;;;; +144FA;ANATOLIAN HIEROGLYPH A217;Lo;0;L;;;;;N;;;;; +144FB;ANATOLIAN HIEROGLYPH A218;Lo;0;L;;;;;N;;;;; +144FC;ANATOLIAN HIEROGLYPH A219;Lo;0;L;;;;;N;;;;; +144FD;ANATOLIAN HIEROGLYPH A220;Lo;0;L;;;;;N;;;;; +144FE;ANATOLIAN HIEROGLYPH A221;Lo;0;L;;;;;N;;;;; +144FF;ANATOLIAN HIEROGLYPH A222;Lo;0;L;;;;;N;;;;; +14500;ANATOLIAN HIEROGLYPH A223;Lo;0;L;;;;;N;;;;; +14501;ANATOLIAN HIEROGLYPH A224;Lo;0;L;;;;;N;;;;; +14502;ANATOLIAN HIEROGLYPH A225;Lo;0;L;;;;;N;;;;; +14503;ANATOLIAN HIEROGLYPH A226;Lo;0;L;;;;;N;;;;; +14504;ANATOLIAN HIEROGLYPH A227;Lo;0;L;;;;;N;;;;; +14505;ANATOLIAN HIEROGLYPH A227A;Lo;0;L;;;;;N;;;;; +14506;ANATOLIAN HIEROGLYPH A228;Lo;0;L;;;;;N;;;;; +14507;ANATOLIAN HIEROGLYPH A229;Lo;0;L;;;;;N;;;;; +14508;ANATOLIAN HIEROGLYPH A230;Lo;0;L;;;;;N;;;;; +14509;ANATOLIAN HIEROGLYPH A231;Lo;0;L;;;;;N;;;;; +1450A;ANATOLIAN HIEROGLYPH A232;Lo;0;L;;;;;N;;;;; +1450B;ANATOLIAN HIEROGLYPH A233;Lo;0;L;;;;;N;;;;; +1450C;ANATOLIAN HIEROGLYPH A234;Lo;0;L;;;;;N;;;;; +1450D;ANATOLIAN HIEROGLYPH A235;Lo;0;L;;;;;N;;;;; +1450E;ANATOLIAN HIEROGLYPH A236;Lo;0;L;;;;;N;;;;; +1450F;ANATOLIAN HIEROGLYPH A237;Lo;0;L;;;;;N;;;;; +14510;ANATOLIAN HIEROGLYPH A238;Lo;0;L;;;;;N;;;;; +14511;ANATOLIAN HIEROGLYPH A239;Lo;0;L;;;;;N;;;;; +14512;ANATOLIAN HIEROGLYPH A240;Lo;0;L;;;;;N;;;;; +14513;ANATOLIAN HIEROGLYPH A241;Lo;0;L;;;;;N;;;;; +14514;ANATOLIAN HIEROGLYPH A242;Lo;0;L;;;;;N;;;;; +14515;ANATOLIAN HIEROGLYPH A243;Lo;0;L;;;;;N;;;;; +14516;ANATOLIAN HIEROGLYPH A244;Lo;0;L;;;;;N;;;;; +14517;ANATOLIAN HIEROGLYPH A245;Lo;0;L;;;;;N;;;;; +14518;ANATOLIAN HIEROGLYPH A246;Lo;0;L;;;;;N;;;;; +14519;ANATOLIAN HIEROGLYPH A247;Lo;0;L;;;;;N;;;;; +1451A;ANATOLIAN HIEROGLYPH A248;Lo;0;L;;;;;N;;;;; +1451B;ANATOLIAN HIEROGLYPH A249;Lo;0;L;;;;;N;;;;; +1451C;ANATOLIAN HIEROGLYPH A250;Lo;0;L;;;;;N;;;;; +1451D;ANATOLIAN HIEROGLYPH A251;Lo;0;L;;;;;N;;;;; +1451E;ANATOLIAN HIEROGLYPH A252;Lo;0;L;;;;;N;;;;; +1451F;ANATOLIAN HIEROGLYPH A253;Lo;0;L;;;;;N;;;;; +14520;ANATOLIAN HIEROGLYPH A254;Lo;0;L;;;;;N;;;;; +14521;ANATOLIAN HIEROGLYPH A255;Lo;0;L;;;;;N;;;;; +14522;ANATOLIAN HIEROGLYPH A256;Lo;0;L;;;;;N;;;;; +14523;ANATOLIAN HIEROGLYPH A257;Lo;0;L;;;;;N;;;;; +14524;ANATOLIAN HIEROGLYPH A258;Lo;0;L;;;;;N;;;;; +14525;ANATOLIAN HIEROGLYPH A259;Lo;0;L;;;;;N;;;;; +14526;ANATOLIAN HIEROGLYPH A260;Lo;0;L;;;;;N;;;;; +14527;ANATOLIAN HIEROGLYPH A261;Lo;0;L;;;;;N;;;;; +14528;ANATOLIAN HIEROGLYPH A262;Lo;0;L;;;;;N;;;;; +14529;ANATOLIAN HIEROGLYPH A263;Lo;0;L;;;;;N;;;;; +1452A;ANATOLIAN HIEROGLYPH A264;Lo;0;L;;;;;N;;;;; +1452B;ANATOLIAN HIEROGLYPH A265;Lo;0;L;;;;;N;;;;; +1452C;ANATOLIAN HIEROGLYPH A266;Lo;0;L;;;;;N;;;;; +1452D;ANATOLIAN HIEROGLYPH A267;Lo;0;L;;;;;N;;;;; +1452E;ANATOLIAN HIEROGLYPH A267A;Lo;0;L;;;;;N;;;;; +1452F;ANATOLIAN HIEROGLYPH A268;Lo;0;L;;;;;N;;;;; +14530;ANATOLIAN HIEROGLYPH A269;Lo;0;L;;;;;N;;;;; +14531;ANATOLIAN HIEROGLYPH A270;Lo;0;L;;;;;N;;;;; +14532;ANATOLIAN HIEROGLYPH A271;Lo;0;L;;;;;N;;;;; +14533;ANATOLIAN HIEROGLYPH A272;Lo;0;L;;;;;N;;;;; +14534;ANATOLIAN HIEROGLYPH A273;Lo;0;L;;;;;N;;;;; +14535;ANATOLIAN HIEROGLYPH A274;Lo;0;L;;;;;N;;;;; +14536;ANATOLIAN HIEROGLYPH A275;Lo;0;L;;;;;N;;;;; +14537;ANATOLIAN HIEROGLYPH A276;Lo;0;L;;;;;N;;;;; +14538;ANATOLIAN HIEROGLYPH A277;Lo;0;L;;;;;N;;;;; +14539;ANATOLIAN HIEROGLYPH A278;Lo;0;L;;;;;N;;;;; +1453A;ANATOLIAN HIEROGLYPH A279;Lo;0;L;;;;;N;;;;; +1453B;ANATOLIAN HIEROGLYPH A280;Lo;0;L;;;;;N;;;;; +1453C;ANATOLIAN HIEROGLYPH A281;Lo;0;L;;;;;N;;;;; +1453D;ANATOLIAN HIEROGLYPH A282;Lo;0;L;;;;;N;;;;; +1453E;ANATOLIAN HIEROGLYPH A283;Lo;0;L;;;;;N;;;;; +1453F;ANATOLIAN HIEROGLYPH A284;Lo;0;L;;;;;N;;;;; +14540;ANATOLIAN HIEROGLYPH A285;Lo;0;L;;;;;N;;;;; +14541;ANATOLIAN HIEROGLYPH A286;Lo;0;L;;;;;N;;;;; +14542;ANATOLIAN HIEROGLYPH A287;Lo;0;L;;;;;N;;;;; +14543;ANATOLIAN HIEROGLYPH A288;Lo;0;L;;;;;N;;;;; +14544;ANATOLIAN HIEROGLYPH A289;Lo;0;L;;;;;N;;;;; +14545;ANATOLIAN HIEROGLYPH A289A;Lo;0;L;;;;;N;;;;; +14546;ANATOLIAN HIEROGLYPH A290;Lo;0;L;;;;;N;;;;; +14547;ANATOLIAN HIEROGLYPH A291;Lo;0;L;;;;;N;;;;; +14548;ANATOLIAN HIEROGLYPH A292;Lo;0;L;;;;;N;;;;; +14549;ANATOLIAN HIEROGLYPH A293;Lo;0;L;;;;;N;;;;; +1454A;ANATOLIAN HIEROGLYPH A294;Lo;0;L;;;;;N;;;;; +1454B;ANATOLIAN HIEROGLYPH A294A;Lo;0;L;;;;;N;;;;; +1454C;ANATOLIAN HIEROGLYPH A295;Lo;0;L;;;;;N;;;;; +1454D;ANATOLIAN HIEROGLYPH A296;Lo;0;L;;;;;N;;;;; +1454E;ANATOLIAN HIEROGLYPH A297;Lo;0;L;;;;;N;;;;; +1454F;ANATOLIAN HIEROGLYPH A298;Lo;0;L;;;;;N;;;;; +14550;ANATOLIAN HIEROGLYPH A299;Lo;0;L;;;;;N;;;;; +14551;ANATOLIAN HIEROGLYPH A299A;Lo;0;L;;;;;N;;;;; +14552;ANATOLIAN HIEROGLYPH A300;Lo;0;L;;;;;N;;;;; +14553;ANATOLIAN HIEROGLYPH A301;Lo;0;L;;;;;N;;;;; +14554;ANATOLIAN HIEROGLYPH A302;Lo;0;L;;;;;N;;;;; +14555;ANATOLIAN HIEROGLYPH A303;Lo;0;L;;;;;N;;;;; +14556;ANATOLIAN HIEROGLYPH A304;Lo;0;L;;;;;N;;;;; +14557;ANATOLIAN HIEROGLYPH A305;Lo;0;L;;;;;N;;;;; +14558;ANATOLIAN HIEROGLYPH A306;Lo;0;L;;;;;N;;;;; +14559;ANATOLIAN HIEROGLYPH A307;Lo;0;L;;;;;N;;;;; +1455A;ANATOLIAN HIEROGLYPH A308;Lo;0;L;;;;;N;;;;; +1455B;ANATOLIAN HIEROGLYPH A309;Lo;0;L;;;;;N;;;;; +1455C;ANATOLIAN HIEROGLYPH A309A;Lo;0;L;;;;;N;;;;; +1455D;ANATOLIAN HIEROGLYPH A310;Lo;0;L;;;;;N;;;;; +1455E;ANATOLIAN HIEROGLYPH A311;Lo;0;L;;;;;N;;;;; +1455F;ANATOLIAN HIEROGLYPH A312;Lo;0;L;;;;;N;;;;; +14560;ANATOLIAN HIEROGLYPH A313;Lo;0;L;;;;;N;;;;; +14561;ANATOLIAN HIEROGLYPH A314;Lo;0;L;;;;;N;;;;; +14562;ANATOLIAN HIEROGLYPH A315;Lo;0;L;;;;;N;;;;; +14563;ANATOLIAN HIEROGLYPH A316;Lo;0;L;;;;;N;;;;; +14564;ANATOLIAN HIEROGLYPH A317;Lo;0;L;;;;;N;;;;; +14565;ANATOLIAN HIEROGLYPH A318;Lo;0;L;;;;;N;;;;; +14566;ANATOLIAN HIEROGLYPH A319;Lo;0;L;;;;;N;;;;; +14567;ANATOLIAN HIEROGLYPH A320;Lo;0;L;;;;;N;;;;; +14568;ANATOLIAN HIEROGLYPH A321;Lo;0;L;;;;;N;;;;; +14569;ANATOLIAN HIEROGLYPH A322;Lo;0;L;;;;;N;;;;; +1456A;ANATOLIAN HIEROGLYPH A323;Lo;0;L;;;;;N;;;;; +1456B;ANATOLIAN HIEROGLYPH A324;Lo;0;L;;;;;N;;;;; +1456C;ANATOLIAN HIEROGLYPH A325;Lo;0;L;;;;;N;;;;; +1456D;ANATOLIAN HIEROGLYPH A326;Lo;0;L;;;;;N;;;;; +1456E;ANATOLIAN HIEROGLYPH A327;Lo;0;L;;;;;N;;;;; +1456F;ANATOLIAN HIEROGLYPH A328;Lo;0;L;;;;;N;;;;; +14570;ANATOLIAN HIEROGLYPH A329;Lo;0;L;;;;;N;;;;; +14571;ANATOLIAN HIEROGLYPH A329A;Lo;0;L;;;;;N;;;;; +14572;ANATOLIAN HIEROGLYPH A330;Lo;0;L;;;;;N;;;;; +14573;ANATOLIAN HIEROGLYPH A331;Lo;0;L;;;;;N;;;;; +14574;ANATOLIAN HIEROGLYPH A332A;Lo;0;L;;;;;N;;;;; +14575;ANATOLIAN HIEROGLYPH A332B;Lo;0;L;;;;;N;;;;; +14576;ANATOLIAN HIEROGLYPH A332C;Lo;0;L;;;;;N;;;;; +14577;ANATOLIAN HIEROGLYPH A333;Lo;0;L;;;;;N;;;;; +14578;ANATOLIAN HIEROGLYPH A334;Lo;0;L;;;;;N;;;;; +14579;ANATOLIAN HIEROGLYPH A335;Lo;0;L;;;;;N;;;;; +1457A;ANATOLIAN HIEROGLYPH A336;Lo;0;L;;;;;N;;;;; +1457B;ANATOLIAN HIEROGLYPH A336A;Lo;0;L;;;;;N;;;;; +1457C;ANATOLIAN HIEROGLYPH A336B;Lo;0;L;;;;;N;;;;; +1457D;ANATOLIAN HIEROGLYPH A336C;Lo;0;L;;;;;N;;;;; +1457E;ANATOLIAN HIEROGLYPH A337;Lo;0;L;;;;;N;;;;; +1457F;ANATOLIAN HIEROGLYPH A338;Lo;0;L;;;;;N;;;;; +14580;ANATOLIAN HIEROGLYPH A339;Lo;0;L;;;;;N;;;;; +14581;ANATOLIAN HIEROGLYPH A340;Lo;0;L;;;;;N;;;;; +14582;ANATOLIAN HIEROGLYPH A341;Lo;0;L;;;;;N;;;;; +14583;ANATOLIAN HIEROGLYPH A342;Lo;0;L;;;;;N;;;;; +14584;ANATOLIAN HIEROGLYPH A343;Lo;0;L;;;;;N;;;;; +14585;ANATOLIAN HIEROGLYPH A344;Lo;0;L;;;;;N;;;;; +14586;ANATOLIAN HIEROGLYPH A345;Lo;0;L;;;;;N;;;;; +14587;ANATOLIAN HIEROGLYPH A346;Lo;0;L;;;;;N;;;;; +14588;ANATOLIAN HIEROGLYPH A347;Lo;0;L;;;;;N;;;;; +14589;ANATOLIAN HIEROGLYPH A348;Lo;0;L;;;;;N;;;;; +1458A;ANATOLIAN HIEROGLYPH A349;Lo;0;L;;;;;N;;;;; +1458B;ANATOLIAN HIEROGLYPH A350;Lo;0;L;;;;;N;;;;; +1458C;ANATOLIAN HIEROGLYPH A351;Lo;0;L;;;;;N;;;;; +1458D;ANATOLIAN HIEROGLYPH A352;Lo;0;L;;;;;N;;;;; +1458E;ANATOLIAN HIEROGLYPH A353;Lo;0;L;;;;;N;;;;; +1458F;ANATOLIAN HIEROGLYPH A354;Lo;0;L;;;;;N;;;;; +14590;ANATOLIAN HIEROGLYPH A355;Lo;0;L;;;;;N;;;;; +14591;ANATOLIAN HIEROGLYPH A356;Lo;0;L;;;;;N;;;;; +14592;ANATOLIAN HIEROGLYPH A357;Lo;0;L;;;;;N;;;;; +14593;ANATOLIAN HIEROGLYPH A358;Lo;0;L;;;;;N;;;;; +14594;ANATOLIAN HIEROGLYPH A359;Lo;0;L;;;;;N;;;;; +14595;ANATOLIAN HIEROGLYPH A359A;Lo;0;L;;;;;N;;;;; +14596;ANATOLIAN HIEROGLYPH A360;Lo;0;L;;;;;N;;;;; +14597;ANATOLIAN HIEROGLYPH A361;Lo;0;L;;;;;N;;;;; +14598;ANATOLIAN HIEROGLYPH A362;Lo;0;L;;;;;N;;;;; +14599;ANATOLIAN HIEROGLYPH A363;Lo;0;L;;;;;N;;;;; +1459A;ANATOLIAN HIEROGLYPH A364;Lo;0;L;;;;;N;;;;; +1459B;ANATOLIAN HIEROGLYPH A364A;Lo;0;L;;;;;N;;;;; +1459C;ANATOLIAN HIEROGLYPH A365;Lo;0;L;;;;;N;;;;; +1459D;ANATOLIAN HIEROGLYPH A366;Lo;0;L;;;;;N;;;;; +1459E;ANATOLIAN HIEROGLYPH A367;Lo;0;L;;;;;N;;;;; +1459F;ANATOLIAN HIEROGLYPH A368;Lo;0;L;;;;;N;;;;; +145A0;ANATOLIAN HIEROGLYPH A368A;Lo;0;L;;;;;N;;;;; +145A1;ANATOLIAN HIEROGLYPH A369;Lo;0;L;;;;;N;;;;; +145A2;ANATOLIAN HIEROGLYPH A370;Lo;0;L;;;;;N;;;;; +145A3;ANATOLIAN HIEROGLYPH A371;Lo;0;L;;;;;N;;;;; +145A4;ANATOLIAN HIEROGLYPH A371A;Lo;0;L;;;;;N;;;;; +145A5;ANATOLIAN HIEROGLYPH A372;Lo;0;L;;;;;N;;;;; +145A6;ANATOLIAN HIEROGLYPH A373;Lo;0;L;;;;;N;;;;; +145A7;ANATOLIAN HIEROGLYPH A374;Lo;0;L;;;;;N;;;;; +145A8;ANATOLIAN HIEROGLYPH A375;Lo;0;L;;;;;N;;;;; +145A9;ANATOLIAN HIEROGLYPH A376;Lo;0;L;;;;;N;;;;; +145AA;ANATOLIAN HIEROGLYPH A377;Lo;0;L;;;;;N;;;;; +145AB;ANATOLIAN HIEROGLYPH A378;Lo;0;L;;;;;N;;;;; +145AC;ANATOLIAN HIEROGLYPH A379;Lo;0;L;;;;;N;;;;; +145AD;ANATOLIAN HIEROGLYPH A380;Lo;0;L;;;;;N;;;;; +145AE;ANATOLIAN HIEROGLYPH A381;Lo;0;L;;;;;N;;;;; +145AF;ANATOLIAN HIEROGLYPH A381A;Lo;0;L;;;;;N;;;;; +145B0;ANATOLIAN HIEROGLYPH A382;Lo;0;L;;;;;N;;;;; +145B1;ANATOLIAN HIEROGLYPH A383 RA OR RI;Lo;0;L;;;;;N;;;;; +145B2;ANATOLIAN HIEROGLYPH A383A;Lo;0;L;;;;;N;;;;; +145B3;ANATOLIAN HIEROGLYPH A384;Lo;0;L;;;;;N;;;;; +145B4;ANATOLIAN HIEROGLYPH A385;Lo;0;L;;;;;N;;;;; +145B5;ANATOLIAN HIEROGLYPH A386;Lo;0;L;;;;;N;;;;; +145B6;ANATOLIAN HIEROGLYPH A386A;Lo;0;L;;;;;N;;;;; +145B7;ANATOLIAN HIEROGLYPH A387;Lo;0;L;;;;;N;;;;; +145B8;ANATOLIAN HIEROGLYPH A388;Lo;0;L;;;;;N;;;;; +145B9;ANATOLIAN HIEROGLYPH A389;Lo;0;L;;;;;N;;;;; +145BA;ANATOLIAN HIEROGLYPH A390;Lo;0;L;;;;;N;;;;; +145BB;ANATOLIAN HIEROGLYPH A391;Lo;0;L;;;;;N;;;;; +145BC;ANATOLIAN HIEROGLYPH A392;Lo;0;L;;;;;N;;;;; +145BD;ANATOLIAN HIEROGLYPH A393 EIGHT;Lo;0;L;;;;;N;;;;; +145BE;ANATOLIAN HIEROGLYPH A394;Lo;0;L;;;;;N;;;;; +145BF;ANATOLIAN HIEROGLYPH A395;Lo;0;L;;;;;N;;;;; +145C0;ANATOLIAN HIEROGLYPH A396;Lo;0;L;;;;;N;;;;; +145C1;ANATOLIAN HIEROGLYPH A397;Lo;0;L;;;;;N;;;;; +145C2;ANATOLIAN HIEROGLYPH A398;Lo;0;L;;;;;N;;;;; +145C3;ANATOLIAN HIEROGLYPH A399;Lo;0;L;;;;;N;;;;; +145C4;ANATOLIAN HIEROGLYPH A400;Lo;0;L;;;;;N;;;;; +145C5;ANATOLIAN HIEROGLYPH A401;Lo;0;L;;;;;N;;;;; +145C6;ANATOLIAN HIEROGLYPH A402;Lo;0;L;;;;;N;;;;; +145C7;ANATOLIAN HIEROGLYPH A403;Lo;0;L;;;;;N;;;;; +145C8;ANATOLIAN HIEROGLYPH A404;Lo;0;L;;;;;N;;;;; +145C9;ANATOLIAN HIEROGLYPH A405;Lo;0;L;;;;;N;;;;; +145CA;ANATOLIAN HIEROGLYPH A406;Lo;0;L;;;;;N;;;;; +145CB;ANATOLIAN HIEROGLYPH A407;Lo;0;L;;;;;N;;;;; +145CC;ANATOLIAN HIEROGLYPH A408;Lo;0;L;;;;;N;;;;; +145CD;ANATOLIAN HIEROGLYPH A409;Lo;0;L;;;;;N;;;;; +145CE;ANATOLIAN HIEROGLYPH A410 BEGIN LOGOGRAM MARK;Lo;0;L;;;;;N;;;;; +145CF;ANATOLIAN HIEROGLYPH A410A END LOGOGRAM MARK;Lo;0;L;;;;;N;;;;; +145D0;ANATOLIAN HIEROGLYPH A411;Lo;0;L;;;;;N;;;;; +145D1;ANATOLIAN HIEROGLYPH A412;Lo;0;L;;;;;N;;;;; +145D2;ANATOLIAN HIEROGLYPH A413;Lo;0;L;;;;;N;;;;; +145D3;ANATOLIAN HIEROGLYPH A414;Lo;0;L;;;;;N;;;;; +145D4;ANATOLIAN HIEROGLYPH A415;Lo;0;L;;;;;N;;;;; +145D5;ANATOLIAN HIEROGLYPH A416;Lo;0;L;;;;;N;;;;; +145D6;ANATOLIAN HIEROGLYPH A417;Lo;0;L;;;;;N;;;;; +145D7;ANATOLIAN HIEROGLYPH A418;Lo;0;L;;;;;N;;;;; +145D8;ANATOLIAN HIEROGLYPH A419;Lo;0;L;;;;;N;;;;; +145D9;ANATOLIAN HIEROGLYPH A420;Lo;0;L;;;;;N;;;;; +145DA;ANATOLIAN HIEROGLYPH A421;Lo;0;L;;;;;N;;;;; +145DB;ANATOLIAN HIEROGLYPH A422;Lo;0;L;;;;;N;;;;; +145DC;ANATOLIAN HIEROGLYPH A423;Lo;0;L;;;;;N;;;;; +145DD;ANATOLIAN HIEROGLYPH A424;Lo;0;L;;;;;N;;;;; +145DE;ANATOLIAN HIEROGLYPH A425;Lo;0;L;;;;;N;;;;; +145DF;ANATOLIAN HIEROGLYPH A426;Lo;0;L;;;;;N;;;;; +145E0;ANATOLIAN HIEROGLYPH A427;Lo;0;L;;;;;N;;;;; +145E1;ANATOLIAN HIEROGLYPH A428;Lo;0;L;;;;;N;;;;; +145E2;ANATOLIAN HIEROGLYPH A429;Lo;0;L;;;;;N;;;;; +145E3;ANATOLIAN HIEROGLYPH A430;Lo;0;L;;;;;N;;;;; +145E4;ANATOLIAN HIEROGLYPH A431;Lo;0;L;;;;;N;;;;; +145E5;ANATOLIAN HIEROGLYPH A432;Lo;0;L;;;;;N;;;;; +145E6;ANATOLIAN HIEROGLYPH A433;Lo;0;L;;;;;N;;;;; +145E7;ANATOLIAN HIEROGLYPH A434;Lo;0;L;;;;;N;;;;; +145E8;ANATOLIAN HIEROGLYPH A435;Lo;0;L;;;;;N;;;;; +145E9;ANATOLIAN HIEROGLYPH A436;Lo;0;L;;;;;N;;;;; +145EA;ANATOLIAN HIEROGLYPH A437;Lo;0;L;;;;;N;;;;; +145EB;ANATOLIAN HIEROGLYPH A438;Lo;0;L;;;;;N;;;;; +145EC;ANATOLIAN HIEROGLYPH A439;Lo;0;L;;;;;N;;;;; +145ED;ANATOLIAN HIEROGLYPH A440;Lo;0;L;;;;;N;;;;; +145EE;ANATOLIAN HIEROGLYPH A441;Lo;0;L;;;;;N;;;;; +145EF;ANATOLIAN HIEROGLYPH A442;Lo;0;L;;;;;N;;;;; +145F0;ANATOLIAN HIEROGLYPH A443;Lo;0;L;;;;;N;;;;; +145F1;ANATOLIAN HIEROGLYPH A444;Lo;0;L;;;;;N;;;;; +145F2;ANATOLIAN HIEROGLYPH A445;Lo;0;L;;;;;N;;;;; +145F3;ANATOLIAN HIEROGLYPH A446;Lo;0;L;;;;;N;;;;; +145F4;ANATOLIAN HIEROGLYPH A447;Lo;0;L;;;;;N;;;;; +145F5;ANATOLIAN HIEROGLYPH A448;Lo;0;L;;;;;N;;;;; +145F6;ANATOLIAN HIEROGLYPH A449;Lo;0;L;;;;;N;;;;; +145F7;ANATOLIAN HIEROGLYPH A450;Lo;0;L;;;;;N;;;;; +145F8;ANATOLIAN HIEROGLYPH A450A;Lo;0;L;;;;;N;;;;; +145F9;ANATOLIAN HIEROGLYPH A451;Lo;0;L;;;;;N;;;;; +145FA;ANATOLIAN HIEROGLYPH A452;Lo;0;L;;;;;N;;;;; +145FB;ANATOLIAN HIEROGLYPH A453;Lo;0;L;;;;;N;;;;; +145FC;ANATOLIAN HIEROGLYPH A454;Lo;0;L;;;;;N;;;;; +145FD;ANATOLIAN HIEROGLYPH A455;Lo;0;L;;;;;N;;;;; +145FE;ANATOLIAN HIEROGLYPH A456;Lo;0;L;;;;;N;;;;; +145FF;ANATOLIAN HIEROGLYPH A457;Lo;0;L;;;;;N;;;;; +14600;ANATOLIAN HIEROGLYPH A457A;Lo;0;L;;;;;N;;;;; +14601;ANATOLIAN HIEROGLYPH A458;Lo;0;L;;;;;N;;;;; +14602;ANATOLIAN HIEROGLYPH A459;Lo;0;L;;;;;N;;;;; +14603;ANATOLIAN HIEROGLYPH A460;Lo;0;L;;;;;N;;;;; +14604;ANATOLIAN HIEROGLYPH A461;Lo;0;L;;;;;N;;;;; +14605;ANATOLIAN HIEROGLYPH A462;Lo;0;L;;;;;N;;;;; +14606;ANATOLIAN HIEROGLYPH A463;Lo;0;L;;;;;N;;;;; +14607;ANATOLIAN HIEROGLYPH A464;Lo;0;L;;;;;N;;;;; +14608;ANATOLIAN HIEROGLYPH A465;Lo;0;L;;;;;N;;;;; +14609;ANATOLIAN HIEROGLYPH A466;Lo;0;L;;;;;N;;;;; +1460A;ANATOLIAN HIEROGLYPH A467;Lo;0;L;;;;;N;;;;; +1460B;ANATOLIAN HIEROGLYPH A468;Lo;0;L;;;;;N;;;;; +1460C;ANATOLIAN HIEROGLYPH A469;Lo;0;L;;;;;N;;;;; +1460D;ANATOLIAN HIEROGLYPH A470;Lo;0;L;;;;;N;;;;; +1460E;ANATOLIAN HIEROGLYPH A471;Lo;0;L;;;;;N;;;;; +1460F;ANATOLIAN HIEROGLYPH A472;Lo;0;L;;;;;N;;;;; +14610;ANATOLIAN HIEROGLYPH A473;Lo;0;L;;;;;N;;;;; +14611;ANATOLIAN HIEROGLYPH A474;Lo;0;L;;;;;N;;;;; +14612;ANATOLIAN HIEROGLYPH A475;Lo;0;L;;;;;N;;;;; +14613;ANATOLIAN HIEROGLYPH A476;Lo;0;L;;;;;N;;;;; +14614;ANATOLIAN HIEROGLYPH A477;Lo;0;L;;;;;N;;;;; +14615;ANATOLIAN HIEROGLYPH A478;Lo;0;L;;;;;N;;;;; +14616;ANATOLIAN HIEROGLYPH A479;Lo;0;L;;;;;N;;;;; +14617;ANATOLIAN HIEROGLYPH A480;Lo;0;L;;;;;N;;;;; +14618;ANATOLIAN HIEROGLYPH A481;Lo;0;L;;;;;N;;;;; +14619;ANATOLIAN HIEROGLYPH A482;Lo;0;L;;;;;N;;;;; +1461A;ANATOLIAN HIEROGLYPH A483;Lo;0;L;;;;;N;;;;; +1461B;ANATOLIAN HIEROGLYPH A484;Lo;0;L;;;;;N;;;;; +1461C;ANATOLIAN HIEROGLYPH A485;Lo;0;L;;;;;N;;;;; +1461D;ANATOLIAN HIEROGLYPH A486;Lo;0;L;;;;;N;;;;; +1461E;ANATOLIAN HIEROGLYPH A487;Lo;0;L;;;;;N;;;;; +1461F;ANATOLIAN HIEROGLYPH A488;Lo;0;L;;;;;N;;;;; +14620;ANATOLIAN HIEROGLYPH A489;Lo;0;L;;;;;N;;;;; +14621;ANATOLIAN HIEROGLYPH A490;Lo;0;L;;;;;N;;;;; +14622;ANATOLIAN HIEROGLYPH A491;Lo;0;L;;;;;N;;;;; +14623;ANATOLIAN HIEROGLYPH A492;Lo;0;L;;;;;N;;;;; +14624;ANATOLIAN HIEROGLYPH A493;Lo;0;L;;;;;N;;;;; +14625;ANATOLIAN HIEROGLYPH A494;Lo;0;L;;;;;N;;;;; +14626;ANATOLIAN HIEROGLYPH A495;Lo;0;L;;;;;N;;;;; +14627;ANATOLIAN HIEROGLYPH A496;Lo;0;L;;;;;N;;;;; +14628;ANATOLIAN HIEROGLYPH A497;Lo;0;L;;;;;N;;;;; +14629;ANATOLIAN HIEROGLYPH A501;Lo;0;L;;;;;N;;;;; +1462A;ANATOLIAN HIEROGLYPH A502;Lo;0;L;;;;;N;;;;; +1462B;ANATOLIAN HIEROGLYPH A503;Lo;0;L;;;;;N;;;;; +1462C;ANATOLIAN HIEROGLYPH A504;Lo;0;L;;;;;N;;;;; +1462D;ANATOLIAN HIEROGLYPH A505;Lo;0;L;;;;;N;;;;; +1462E;ANATOLIAN HIEROGLYPH A506;Lo;0;L;;;;;N;;;;; +1462F;ANATOLIAN HIEROGLYPH A507;Lo;0;L;;;;;N;;;;; +14630;ANATOLIAN HIEROGLYPH A508;Lo;0;L;;;;;N;;;;; +14631;ANATOLIAN HIEROGLYPH A509;Lo;0;L;;;;;N;;;;; +14632;ANATOLIAN HIEROGLYPH A510;Lo;0;L;;;;;N;;;;; +14633;ANATOLIAN HIEROGLYPH A511;Lo;0;L;;;;;N;;;;; +14634;ANATOLIAN HIEROGLYPH A512;Lo;0;L;;;;;N;;;;; +14635;ANATOLIAN HIEROGLYPH A513;Lo;0;L;;;;;N;;;;; +14636;ANATOLIAN HIEROGLYPH A514;Lo;0;L;;;;;N;;;;; +14637;ANATOLIAN HIEROGLYPH A515;Lo;0;L;;;;;N;;;;; +14638;ANATOLIAN HIEROGLYPH A516;Lo;0;L;;;;;N;;;;; +14639;ANATOLIAN HIEROGLYPH A517;Lo;0;L;;;;;N;;;;; +1463A;ANATOLIAN HIEROGLYPH A518;Lo;0;L;;;;;N;;;;; +1463B;ANATOLIAN HIEROGLYPH A519;Lo;0;L;;;;;N;;;;; +1463C;ANATOLIAN HIEROGLYPH A520;Lo;0;L;;;;;N;;;;; +1463D;ANATOLIAN HIEROGLYPH A521;Lo;0;L;;;;;N;;;;; +1463E;ANATOLIAN HIEROGLYPH A522;Lo;0;L;;;;;N;;;;; +1463F;ANATOLIAN HIEROGLYPH A523;Lo;0;L;;;;;N;;;;; +14640;ANATOLIAN HIEROGLYPH A524;Lo;0;L;;;;;N;;;;; +14641;ANATOLIAN HIEROGLYPH A525;Lo;0;L;;;;;N;;;;; +14642;ANATOLIAN HIEROGLYPH A526;Lo;0;L;;;;;N;;;;; +14643;ANATOLIAN HIEROGLYPH A527;Lo;0;L;;;;;N;;;;; +14644;ANATOLIAN HIEROGLYPH A528;Lo;0;L;;;;;N;;;;; +14645;ANATOLIAN HIEROGLYPH A529;Lo;0;L;;;;;N;;;;; +14646;ANATOLIAN HIEROGLYPH A530;Lo;0;L;;;;;N;;;;; +16800;BAMUM LETTER PHASE-A NGKUE MFON;Lo;0;L;;;;;N;;;;; +16801;BAMUM LETTER PHASE-A GBIEE FON;Lo;0;L;;;;;N;;;;; +16802;BAMUM LETTER PHASE-A PON MFON PIPAEMGBIEE;Lo;0;L;;;;;N;;;;; +16803;BAMUM LETTER PHASE-A PON MFON PIPAEMBA;Lo;0;L;;;;;N;;;;; +16804;BAMUM LETTER PHASE-A NAA MFON;Lo;0;L;;;;;N;;;;; +16805;BAMUM LETTER PHASE-A SHUENSHUET;Lo;0;L;;;;;N;;;;; +16806;BAMUM LETTER PHASE-A TITA MFON;Lo;0;L;;;;;N;;;;; +16807;BAMUM LETTER PHASE-A NZA MFON;Lo;0;L;;;;;N;;;;; +16808;BAMUM LETTER PHASE-A SHINDA PA NJI;Lo;0;L;;;;;N;;;;; +16809;BAMUM LETTER PHASE-A PON PA NJI PIPAEMGBIEE;Lo;0;L;;;;;N;;;;; +1680A;BAMUM LETTER PHASE-A PON PA NJI PIPAEMBA;Lo;0;L;;;;;N;;;;; +1680B;BAMUM LETTER PHASE-A MAEMBGBIEE;Lo;0;L;;;;;N;;;;; +1680C;BAMUM LETTER PHASE-A TU MAEMBA;Lo;0;L;;;;;N;;;;; +1680D;BAMUM LETTER PHASE-A NGANGU;Lo;0;L;;;;;N;;;;; +1680E;BAMUM LETTER PHASE-A MAEMVEUX;Lo;0;L;;;;;N;;;;; +1680F;BAMUM LETTER PHASE-A MANSUAE;Lo;0;L;;;;;N;;;;; +16810;BAMUM LETTER PHASE-A MVEUAENGAM;Lo;0;L;;;;;N;;;;; +16811;BAMUM LETTER PHASE-A SEUNYAM;Lo;0;L;;;;;N;;;;; +16812;BAMUM LETTER PHASE-A NTOQPEN;Lo;0;L;;;;;N;;;;; +16813;BAMUM LETTER PHASE-A KEUKEUTNDA;Lo;0;L;;;;;N;;;;; +16814;BAMUM LETTER PHASE-A NKINDI;Lo;0;L;;;;;N;;;;; +16815;BAMUM LETTER PHASE-A SUU;Lo;0;L;;;;;N;;;;; +16816;BAMUM LETTER PHASE-A NGKUENZEUM;Lo;0;L;;;;;N;;;;; +16817;BAMUM LETTER PHASE-A LAPAQ;Lo;0;L;;;;;N;;;;; +16818;BAMUM LETTER PHASE-A LET KUT;Lo;0;L;;;;;N;;;;; +16819;BAMUM LETTER PHASE-A NTAP MFAA;Lo;0;L;;;;;N;;;;; +1681A;BAMUM LETTER PHASE-A MAEKEUP;Lo;0;L;;;;;N;;;;; +1681B;BAMUM LETTER PHASE-A PASHAE;Lo;0;L;;;;;N;;;;; +1681C;BAMUM LETTER PHASE-A GHEUAERAE;Lo;0;L;;;;;N;;;;; +1681D;BAMUM LETTER PHASE-A PAMSHAE;Lo;0;L;;;;;N;;;;; +1681E;BAMUM LETTER PHASE-A MON NGGEUAET;Lo;0;L;;;;;N;;;;; +1681F;BAMUM LETTER PHASE-A NZUN MEUT;Lo;0;L;;;;;N;;;;; +16820;BAMUM LETTER PHASE-A U YUQ NAE;Lo;0;L;;;;;N;;;;; +16821;BAMUM LETTER PHASE-A GHEUAEGHEUAE;Lo;0;L;;;;;N;;;;; +16822;BAMUM LETTER PHASE-A NTAP NTAA;Lo;0;L;;;;;N;;;;; +16823;BAMUM LETTER PHASE-A SISA;Lo;0;L;;;;;N;;;;; +16824;BAMUM LETTER PHASE-A MGBASA;Lo;0;L;;;;;N;;;;; +16825;BAMUM LETTER PHASE-A MEUNJOMNDEUQ;Lo;0;L;;;;;N;;;;; +16826;BAMUM LETTER PHASE-A MOOMPUQ;Lo;0;L;;;;;N;;;;; +16827;BAMUM LETTER PHASE-A KAFA;Lo;0;L;;;;;N;;;;; +16828;BAMUM LETTER PHASE-A PA LEERAEWA;Lo;0;L;;;;;N;;;;; +16829;BAMUM LETTER PHASE-A NDA LEERAEWA;Lo;0;L;;;;;N;;;;; +1682A;BAMUM LETTER PHASE-A PET;Lo;0;L;;;;;N;;;;; +1682B;BAMUM LETTER PHASE-A MAEMKPEN;Lo;0;L;;;;;N;;;;; +1682C;BAMUM LETTER PHASE-A NIKA;Lo;0;L;;;;;N;;;;; +1682D;BAMUM LETTER PHASE-A PUP;Lo;0;L;;;;;N;;;;; +1682E;BAMUM LETTER PHASE-A TUAEP;Lo;0;L;;;;;N;;;;; +1682F;BAMUM LETTER PHASE-A LUAEP;Lo;0;L;;;;;N;;;;; +16830;BAMUM LETTER PHASE-A SONJAM;Lo;0;L;;;;;N;;;;; +16831;BAMUM LETTER PHASE-A TEUTEUWEN;Lo;0;L;;;;;N;;;;; +16832;BAMUM LETTER PHASE-A MAENYI;Lo;0;L;;;;;N;;;;; +16833;BAMUM LETTER PHASE-A KET;Lo;0;L;;;;;N;;;;; +16834;BAMUM LETTER PHASE-A NDAANGGEUAET;Lo;0;L;;;;;N;;;;; +16835;BAMUM LETTER PHASE-A KUOQ;Lo;0;L;;;;;N;;;;; +16836;BAMUM LETTER PHASE-A MOOMEUT;Lo;0;L;;;;;N;;;;; +16837;BAMUM LETTER PHASE-A SHUM;Lo;0;L;;;;;N;;;;; +16838;BAMUM LETTER PHASE-A LOMMAE;Lo;0;L;;;;;N;;;;; +16839;BAMUM LETTER PHASE-A FIRI;Lo;0;L;;;;;N;;;;; +1683A;BAMUM LETTER PHASE-A ROM;Lo;0;L;;;;;N;;;;; +1683B;BAMUM LETTER PHASE-A KPOQ;Lo;0;L;;;;;N;;;;; +1683C;BAMUM LETTER PHASE-A SOQ;Lo;0;L;;;;;N;;;;; +1683D;BAMUM LETTER PHASE-A MAP PIEET;Lo;0;L;;;;;N;;;;; +1683E;BAMUM LETTER PHASE-A SHIRAE;Lo;0;L;;;;;N;;;;; +1683F;BAMUM LETTER PHASE-A NTAP;Lo;0;L;;;;;N;;;;; +16840;BAMUM LETTER PHASE-A SHOQ NSHUT YUM;Lo;0;L;;;;;N;;;;; +16841;BAMUM LETTER PHASE-A NYIT MONGKEUAEQ;Lo;0;L;;;;;N;;;;; +16842;BAMUM LETTER PHASE-A PAARAE;Lo;0;L;;;;;N;;;;; +16843;BAMUM LETTER PHASE-A NKAARAE;Lo;0;L;;;;;N;;;;; +16844;BAMUM LETTER PHASE-A UNKNOWN;Lo;0;L;;;;;N;;;;; +16845;BAMUM LETTER PHASE-A NGGEN;Lo;0;L;;;;;N;;;;; +16846;BAMUM LETTER PHASE-A MAESI;Lo;0;L;;;;;N;;;;; +16847;BAMUM LETTER PHASE-A NJAM;Lo;0;L;;;;;N;;;;; +16848;BAMUM LETTER PHASE-A MBANYI;Lo;0;L;;;;;N;;;;; +16849;BAMUM LETTER PHASE-A NYET;Lo;0;L;;;;;N;;;;; +1684A;BAMUM LETTER PHASE-A TEUAEN;Lo;0;L;;;;;N;;;;; +1684B;BAMUM LETTER PHASE-A SOT;Lo;0;L;;;;;N;;;;; +1684C;BAMUM LETTER PHASE-A PAAM;Lo;0;L;;;;;N;;;;; +1684D;BAMUM LETTER PHASE-A NSHIEE;Lo;0;L;;;;;N;;;;; +1684E;BAMUM LETTER PHASE-A MAEM;Lo;0;L;;;;;N;;;;; +1684F;BAMUM LETTER PHASE-A NYI;Lo;0;L;;;;;N;;;;; +16850;BAMUM LETTER PHASE-A KAQ;Lo;0;L;;;;;N;;;;; +16851;BAMUM LETTER PHASE-A NSHA;Lo;0;L;;;;;N;;;;; +16852;BAMUM LETTER PHASE-A VEE;Lo;0;L;;;;;N;;;;; +16853;BAMUM LETTER PHASE-A LU;Lo;0;L;;;;;N;;;;; +16854;BAMUM LETTER PHASE-A NEN;Lo;0;L;;;;;N;;;;; +16855;BAMUM LETTER PHASE-A NAQ;Lo;0;L;;;;;N;;;;; +16856;BAMUM LETTER PHASE-A MBAQ;Lo;0;L;;;;;N;;;;; +16857;BAMUM LETTER PHASE-B NSHUET;Lo;0;L;;;;;N;;;;; +16858;BAMUM LETTER PHASE-B TU MAEMGBIEE;Lo;0;L;;;;;N;;;;; +16859;BAMUM LETTER PHASE-B SIEE;Lo;0;L;;;;;N;;;;; +1685A;BAMUM LETTER PHASE-B SET TU;Lo;0;L;;;;;N;;;;; +1685B;BAMUM LETTER PHASE-B LOM NTEUM;Lo;0;L;;;;;N;;;;; +1685C;BAMUM LETTER PHASE-B MBA MAELEE;Lo;0;L;;;;;N;;;;; +1685D;BAMUM LETTER PHASE-B KIEEM;Lo;0;L;;;;;N;;;;; +1685E;BAMUM LETTER PHASE-B YEURAE;Lo;0;L;;;;;N;;;;; +1685F;BAMUM LETTER PHASE-B MBAARAE;Lo;0;L;;;;;N;;;;; +16860;BAMUM LETTER PHASE-B KAM;Lo;0;L;;;;;N;;;;; +16861;BAMUM LETTER PHASE-B PEESHI;Lo;0;L;;;;;N;;;;; +16862;BAMUM LETTER PHASE-B YAFU LEERAEWA;Lo;0;L;;;;;N;;;;; +16863;BAMUM LETTER PHASE-B LAM NSHUT NYAM;Lo;0;L;;;;;N;;;;; +16864;BAMUM LETTER PHASE-B NTIEE SHEUOQ;Lo;0;L;;;;;N;;;;; +16865;BAMUM LETTER PHASE-B NDU NJAA;Lo;0;L;;;;;N;;;;; +16866;BAMUM LETTER PHASE-B GHEUGHEUAEM;Lo;0;L;;;;;N;;;;; +16867;BAMUM LETTER PHASE-B PIT;Lo;0;L;;;;;N;;;;; +16868;BAMUM LETTER PHASE-B TU NSIEE;Lo;0;L;;;;;N;;;;; +16869;BAMUM LETTER PHASE-B SHET NJAQ;Lo;0;L;;;;;N;;;;; +1686A;BAMUM LETTER PHASE-B SHEUAEQTU;Lo;0;L;;;;;N;;;;; +1686B;BAMUM LETTER PHASE-B MFON TEUAEQ;Lo;0;L;;;;;N;;;;; +1686C;BAMUM LETTER PHASE-B MBIT MBAAKET;Lo;0;L;;;;;N;;;;; +1686D;BAMUM LETTER PHASE-B NYI NTEUM;Lo;0;L;;;;;N;;;;; +1686E;BAMUM LETTER PHASE-B KEUPUQ;Lo;0;L;;;;;N;;;;; +1686F;BAMUM LETTER PHASE-B GHEUGHEN;Lo;0;L;;;;;N;;;;; +16870;BAMUM LETTER PHASE-B KEUYEUX;Lo;0;L;;;;;N;;;;; +16871;BAMUM LETTER PHASE-B LAANAE;Lo;0;L;;;;;N;;;;; +16872;BAMUM LETTER PHASE-B PARUM;Lo;0;L;;;;;N;;;;; +16873;BAMUM LETTER PHASE-B VEUM;Lo;0;L;;;;;N;;;;; +16874;BAMUM LETTER PHASE-B NGKINDI MVOP;Lo;0;L;;;;;N;;;;; +16875;BAMUM LETTER PHASE-B NGGEU MBU;Lo;0;L;;;;;N;;;;; +16876;BAMUM LETTER PHASE-B WUAET;Lo;0;L;;;;;N;;;;; +16877;BAMUM LETTER PHASE-B SAKEUAE;Lo;0;L;;;;;N;;;;; +16878;BAMUM LETTER PHASE-B TAAM;Lo;0;L;;;;;N;;;;; +16879;BAMUM LETTER PHASE-B MEUQ;Lo;0;L;;;;;N;;;;; +1687A;BAMUM LETTER PHASE-B NGGUOQ;Lo;0;L;;;;;N;;;;; +1687B;BAMUM LETTER PHASE-B NGGUOQ LARGE;Lo;0;L;;;;;N;;;;; +1687C;BAMUM LETTER PHASE-B MFIYAQ;Lo;0;L;;;;;N;;;;; +1687D;BAMUM LETTER PHASE-B SUE;Lo;0;L;;;;;N;;;;; +1687E;BAMUM LETTER PHASE-B MBEURI;Lo;0;L;;;;;N;;;;; +1687F;BAMUM LETTER PHASE-B MONTIEEN;Lo;0;L;;;;;N;;;;; +16880;BAMUM LETTER PHASE-B NYAEMAE;Lo;0;L;;;;;N;;;;; +16881;BAMUM LETTER PHASE-B PUNGAAM;Lo;0;L;;;;;N;;;;; +16882;BAMUM LETTER PHASE-B MEUT NGGEET;Lo;0;L;;;;;N;;;;; +16883;BAMUM LETTER PHASE-B FEUX;Lo;0;L;;;;;N;;;;; +16884;BAMUM LETTER PHASE-B MBUOQ;Lo;0;L;;;;;N;;;;; +16885;BAMUM LETTER PHASE-B FEE;Lo;0;L;;;;;N;;;;; +16886;BAMUM LETTER PHASE-B KEUAEM;Lo;0;L;;;;;N;;;;; +16887;BAMUM LETTER PHASE-B MA NJEUAENA;Lo;0;L;;;;;N;;;;; +16888;BAMUM LETTER PHASE-B MA NJUQA;Lo;0;L;;;;;N;;;;; +16889;BAMUM LETTER PHASE-B LET;Lo;0;L;;;;;N;;;;; +1688A;BAMUM LETTER PHASE-B NGGAAM;Lo;0;L;;;;;N;;;;; +1688B;BAMUM LETTER PHASE-B NSEN;Lo;0;L;;;;;N;;;;; +1688C;BAMUM LETTER PHASE-B MA;Lo;0;L;;;;;N;;;;; +1688D;BAMUM LETTER PHASE-B KIQ;Lo;0;L;;;;;N;;;;; +1688E;BAMUM LETTER PHASE-B NGOM;Lo;0;L;;;;;N;;;;; +1688F;BAMUM LETTER PHASE-C NGKUE MAEMBA;Lo;0;L;;;;;N;;;;; +16890;BAMUM LETTER PHASE-C NZA;Lo;0;L;;;;;N;;;;; +16891;BAMUM LETTER PHASE-C YUM;Lo;0;L;;;;;N;;;;; +16892;BAMUM LETTER PHASE-C WANGKUOQ;Lo;0;L;;;;;N;;;;; +16893;BAMUM LETTER PHASE-C NGGEN;Lo;0;L;;;;;N;;;;; +16894;BAMUM LETTER PHASE-C NDEUAEREE;Lo;0;L;;;;;N;;;;; +16895;BAMUM LETTER PHASE-C NGKAQ;Lo;0;L;;;;;N;;;;; +16896;BAMUM LETTER PHASE-C GHARAE;Lo;0;L;;;;;N;;;;; +16897;BAMUM LETTER PHASE-C MBEEKEET;Lo;0;L;;;;;N;;;;; +16898;BAMUM LETTER PHASE-C GBAYI;Lo;0;L;;;;;N;;;;; +16899;BAMUM LETTER PHASE-C NYIR MKPARAQ MEUN;Lo;0;L;;;;;N;;;;; +1689A;BAMUM LETTER PHASE-C NTU MBIT;Lo;0;L;;;;;N;;;;; +1689B;BAMUM LETTER PHASE-C MBEUM;Lo;0;L;;;;;N;;;;; +1689C;BAMUM LETTER PHASE-C PIRIEEN;Lo;0;L;;;;;N;;;;; +1689D;BAMUM LETTER PHASE-C NDOMBU;Lo;0;L;;;;;N;;;;; +1689E;BAMUM LETTER PHASE-C MBAA CABBAGE-TREE;Lo;0;L;;;;;N;;;;; +1689F;BAMUM LETTER PHASE-C KEUSHEUAEP;Lo;0;L;;;;;N;;;;; +168A0;BAMUM LETTER PHASE-C GHAP;Lo;0;L;;;;;N;;;;; +168A1;BAMUM LETTER PHASE-C KEUKAQ;Lo;0;L;;;;;N;;;;; +168A2;BAMUM LETTER PHASE-C YU MUOMAE;Lo;0;L;;;;;N;;;;; +168A3;BAMUM LETTER PHASE-C NZEUM;Lo;0;L;;;;;N;;;;; +168A4;BAMUM LETTER PHASE-C MBUE;Lo;0;L;;;;;N;;;;; +168A5;BAMUM LETTER PHASE-C NSEUAEN;Lo;0;L;;;;;N;;;;; +168A6;BAMUM LETTER PHASE-C MBIT;Lo;0;L;;;;;N;;;;; +168A7;BAMUM LETTER PHASE-C YEUQ;Lo;0;L;;;;;N;;;;; +168A8;BAMUM LETTER PHASE-C KPARAQ;Lo;0;L;;;;;N;;;;; +168A9;BAMUM LETTER PHASE-C KAA;Lo;0;L;;;;;N;;;;; +168AA;BAMUM LETTER PHASE-C SEUX;Lo;0;L;;;;;N;;;;; +168AB;BAMUM LETTER PHASE-C NDIDA;Lo;0;L;;;;;N;;;;; +168AC;BAMUM LETTER PHASE-C TAASHAE;Lo;0;L;;;;;N;;;;; +168AD;BAMUM LETTER PHASE-C NJUEQ;Lo;0;L;;;;;N;;;;; +168AE;BAMUM LETTER PHASE-C TITA YUE;Lo;0;L;;;;;N;;;;; +168AF;BAMUM LETTER PHASE-C SUAET;Lo;0;L;;;;;N;;;;; +168B0;BAMUM LETTER PHASE-C NGGUAEN NYAM;Lo;0;L;;;;;N;;;;; +168B1;BAMUM LETTER PHASE-C VEUX;Lo;0;L;;;;;N;;;;; +168B2;BAMUM LETTER PHASE-C NANSANAQ;Lo;0;L;;;;;N;;;;; +168B3;BAMUM LETTER PHASE-C MA KEUAERI;Lo;0;L;;;;;N;;;;; +168B4;BAMUM LETTER PHASE-C NTAA;Lo;0;L;;;;;N;;;;; +168B5;BAMUM LETTER PHASE-C NGGUON;Lo;0;L;;;;;N;;;;; +168B6;BAMUM LETTER PHASE-C LAP;Lo;0;L;;;;;N;;;;; +168B7;BAMUM LETTER PHASE-C MBIRIEEN;Lo;0;L;;;;;N;;;;; +168B8;BAMUM LETTER PHASE-C MGBASAQ;Lo;0;L;;;;;N;;;;; +168B9;BAMUM LETTER PHASE-C NTEUNGBA;Lo;0;L;;;;;N;;;;; +168BA;BAMUM LETTER PHASE-C TEUTEUX;Lo;0;L;;;;;N;;;;; +168BB;BAMUM LETTER PHASE-C NGGUM;Lo;0;L;;;;;N;;;;; +168BC;BAMUM LETTER PHASE-C FUE;Lo;0;L;;;;;N;;;;; +168BD;BAMUM LETTER PHASE-C NDEUT;Lo;0;L;;;;;N;;;;; +168BE;BAMUM LETTER PHASE-C NSA;Lo;0;L;;;;;N;;;;; +168BF;BAMUM LETTER PHASE-C NSHAQ;Lo;0;L;;;;;N;;;;; +168C0;BAMUM LETTER PHASE-C BUNG;Lo;0;L;;;;;N;;;;; +168C1;BAMUM LETTER PHASE-C VEUAEPEN;Lo;0;L;;;;;N;;;;; +168C2;BAMUM LETTER PHASE-C MBERAE;Lo;0;L;;;;;N;;;;; +168C3;BAMUM LETTER PHASE-C RU;Lo;0;L;;;;;N;;;;; +168C4;BAMUM LETTER PHASE-C NJAEM;Lo;0;L;;;;;N;;;;; +168C5;BAMUM LETTER PHASE-C LAM;Lo;0;L;;;;;N;;;;; +168C6;BAMUM LETTER PHASE-C TITUAEP;Lo;0;L;;;;;N;;;;; +168C7;BAMUM LETTER PHASE-C NSUOT NGOM;Lo;0;L;;;;;N;;;;; +168C8;BAMUM LETTER PHASE-C NJEEEE;Lo;0;L;;;;;N;;;;; +168C9;BAMUM LETTER PHASE-C KET;Lo;0;L;;;;;N;;;;; +168CA;BAMUM LETTER PHASE-C NGGU;Lo;0;L;;;;;N;;;;; +168CB;BAMUM LETTER PHASE-C MAESI;Lo;0;L;;;;;N;;;;; +168CC;BAMUM LETTER PHASE-C MBUAEM;Lo;0;L;;;;;N;;;;; +168CD;BAMUM LETTER PHASE-C LU;Lo;0;L;;;;;N;;;;; +168CE;BAMUM LETTER PHASE-C KUT;Lo;0;L;;;;;N;;;;; +168CF;BAMUM LETTER PHASE-C NJAM;Lo;0;L;;;;;N;;;;; +168D0;BAMUM LETTER PHASE-C NGOM;Lo;0;L;;;;;N;;;;; +168D1;BAMUM LETTER PHASE-C WUP;Lo;0;L;;;;;N;;;;; +168D2;BAMUM LETTER PHASE-C NGGUEET;Lo;0;L;;;;;N;;;;; +168D3;BAMUM LETTER PHASE-C NSOM;Lo;0;L;;;;;N;;;;; +168D4;BAMUM LETTER PHASE-C NTEN;Lo;0;L;;;;;N;;;;; +168D5;BAMUM LETTER PHASE-C KUOP NKAARAE;Lo;0;L;;;;;N;;;;; +168D6;BAMUM LETTER PHASE-C NSUN;Lo;0;L;;;;;N;;;;; +168D7;BAMUM LETTER PHASE-C NDAM;Lo;0;L;;;;;N;;;;; +168D8;BAMUM LETTER PHASE-C MA NSIEE;Lo;0;L;;;;;N;;;;; +168D9;BAMUM LETTER PHASE-C YAA;Lo;0;L;;;;;N;;;;; +168DA;BAMUM LETTER PHASE-C NDAP;Lo;0;L;;;;;N;;;;; +168DB;BAMUM LETTER PHASE-C SHUEQ;Lo;0;L;;;;;N;;;;; +168DC;BAMUM LETTER PHASE-C SETFON;Lo;0;L;;;;;N;;;;; +168DD;BAMUM LETTER PHASE-C MBI;Lo;0;L;;;;;N;;;;; +168DE;BAMUM LETTER PHASE-C MAEMBA;Lo;0;L;;;;;N;;;;; +168DF;BAMUM LETTER PHASE-C MBANYI;Lo;0;L;;;;;N;;;;; +168E0;BAMUM LETTER PHASE-C KEUSEUX;Lo;0;L;;;;;N;;;;; +168E1;BAMUM LETTER PHASE-C MBEUX;Lo;0;L;;;;;N;;;;; +168E2;BAMUM LETTER PHASE-C KEUM;Lo;0;L;;;;;N;;;;; +168E3;BAMUM LETTER PHASE-C MBAA PICKET;Lo;0;L;;;;;N;;;;; +168E4;BAMUM LETTER PHASE-C YUWOQ;Lo;0;L;;;;;N;;;;; +168E5;BAMUM LETTER PHASE-C NJEUX;Lo;0;L;;;;;N;;;;; +168E6;BAMUM LETTER PHASE-C MIEE;Lo;0;L;;;;;N;;;;; +168E7;BAMUM LETTER PHASE-C MUAE;Lo;0;L;;;;;N;;;;; +168E8;BAMUM LETTER PHASE-C SHIQ;Lo;0;L;;;;;N;;;;; +168E9;BAMUM LETTER PHASE-C KEN LAW;Lo;0;L;;;;;N;;;;; +168EA;BAMUM LETTER PHASE-C KEN FATIGUE;Lo;0;L;;;;;N;;;;; +168EB;BAMUM LETTER PHASE-C NGAQ;Lo;0;L;;;;;N;;;;; +168EC;BAMUM LETTER PHASE-C NAQ;Lo;0;L;;;;;N;;;;; +168ED;BAMUM LETTER PHASE-C LIQ;Lo;0;L;;;;;N;;;;; +168EE;BAMUM LETTER PHASE-C PIN;Lo;0;L;;;;;N;;;;; +168EF;BAMUM LETTER PHASE-C PEN;Lo;0;L;;;;;N;;;;; +168F0;BAMUM LETTER PHASE-C TET;Lo;0;L;;;;;N;;;;; +168F1;BAMUM LETTER PHASE-D MBUO;Lo;0;L;;;;;N;;;;; +168F2;BAMUM LETTER PHASE-D WAP;Lo;0;L;;;;;N;;;;; +168F3;BAMUM LETTER PHASE-D NJI;Lo;0;L;;;;;N;;;;; +168F4;BAMUM LETTER PHASE-D MFON;Lo;0;L;;;;;N;;;;; +168F5;BAMUM LETTER PHASE-D NJIEE;Lo;0;L;;;;;N;;;;; +168F6;BAMUM LETTER PHASE-D LIEE;Lo;0;L;;;;;N;;;;; +168F7;BAMUM LETTER PHASE-D NJEUT;Lo;0;L;;;;;N;;;;; +168F8;BAMUM LETTER PHASE-D NSHEE;Lo;0;L;;;;;N;;;;; +168F9;BAMUM LETTER PHASE-D NGGAAMAE;Lo;0;L;;;;;N;;;;; +168FA;BAMUM LETTER PHASE-D NYAM;Lo;0;L;;;;;N;;;;; +168FB;BAMUM LETTER PHASE-D WUAEN;Lo;0;L;;;;;N;;;;; +168FC;BAMUM LETTER PHASE-D NGKUN;Lo;0;L;;;;;N;;;;; +168FD;BAMUM LETTER PHASE-D SHEE;Lo;0;L;;;;;N;;;;; +168FE;BAMUM LETTER PHASE-D NGKAP;Lo;0;L;;;;;N;;;;; +168FF;BAMUM LETTER PHASE-D KEUAETMEUN;Lo;0;L;;;;;N;;;;; +16900;BAMUM LETTER PHASE-D TEUT;Lo;0;L;;;;;N;;;;; +16901;BAMUM LETTER PHASE-D SHEUAE;Lo;0;L;;;;;N;;;;; +16902;BAMUM LETTER PHASE-D NJAP;Lo;0;L;;;;;N;;;;; +16903;BAMUM LETTER PHASE-D SUE;Lo;0;L;;;;;N;;;;; +16904;BAMUM LETTER PHASE-D KET;Lo;0;L;;;;;N;;;;; +16905;BAMUM LETTER PHASE-D YAEMMAE;Lo;0;L;;;;;N;;;;; +16906;BAMUM LETTER PHASE-D KUOM;Lo;0;L;;;;;N;;;;; +16907;BAMUM LETTER PHASE-D SAP;Lo;0;L;;;;;N;;;;; +16908;BAMUM LETTER PHASE-D MFEUT;Lo;0;L;;;;;N;;;;; +16909;BAMUM LETTER PHASE-D NDEUX;Lo;0;L;;;;;N;;;;; +1690A;BAMUM LETTER PHASE-D MALEERI;Lo;0;L;;;;;N;;;;; +1690B;BAMUM LETTER PHASE-D MEUT;Lo;0;L;;;;;N;;;;; +1690C;BAMUM LETTER PHASE-D SEUAEQ;Lo;0;L;;;;;N;;;;; +1690D;BAMUM LETTER PHASE-D YEN;Lo;0;L;;;;;N;;;;; +1690E;BAMUM LETTER PHASE-D NJEUAEM;Lo;0;L;;;;;N;;;;; +1690F;BAMUM LETTER PHASE-D KEUOT MBUAE;Lo;0;L;;;;;N;;;;; +16910;BAMUM LETTER PHASE-D NGKEURI;Lo;0;L;;;;;N;;;;; +16911;BAMUM LETTER PHASE-D TU;Lo;0;L;;;;;N;;;;; +16912;BAMUM LETTER PHASE-D GHAA;Lo;0;L;;;;;N;;;;; +16913;BAMUM LETTER PHASE-D NGKYEE;Lo;0;L;;;;;N;;;;; +16914;BAMUM LETTER PHASE-D FEUFEUAET;Lo;0;L;;;;;N;;;;; +16915;BAMUM LETTER PHASE-D NDEE;Lo;0;L;;;;;N;;;;; +16916;BAMUM LETTER PHASE-D MGBOFUM;Lo;0;L;;;;;N;;;;; +16917;BAMUM LETTER PHASE-D LEUAEP;Lo;0;L;;;;;N;;;;; +16918;BAMUM LETTER PHASE-D NDON;Lo;0;L;;;;;N;;;;; +16919;BAMUM LETTER PHASE-D MONI;Lo;0;L;;;;;N;;;;; +1691A;BAMUM LETTER PHASE-D MGBEUN;Lo;0;L;;;;;N;;;;; +1691B;BAMUM LETTER PHASE-D PUUT;Lo;0;L;;;;;N;;;;; +1691C;BAMUM LETTER PHASE-D MGBIEE;Lo;0;L;;;;;N;;;;; +1691D;BAMUM LETTER PHASE-D MFO;Lo;0;L;;;;;N;;;;; +1691E;BAMUM LETTER PHASE-D LUM;Lo;0;L;;;;;N;;;;; +1691F;BAMUM LETTER PHASE-D NSIEEP;Lo;0;L;;;;;N;;;;; +16920;BAMUM LETTER PHASE-D MBAA;Lo;0;L;;;;;N;;;;; +16921;BAMUM LETTER PHASE-D KWAET;Lo;0;L;;;;;N;;;;; +16922;BAMUM LETTER PHASE-D NYET;Lo;0;L;;;;;N;;;;; +16923;BAMUM LETTER PHASE-D TEUAEN;Lo;0;L;;;;;N;;;;; +16924;BAMUM LETTER PHASE-D SOT;Lo;0;L;;;;;N;;;;; +16925;BAMUM LETTER PHASE-D YUWOQ;Lo;0;L;;;;;N;;;;; +16926;BAMUM LETTER PHASE-D KEUM;Lo;0;L;;;;;N;;;;; +16927;BAMUM LETTER PHASE-D RAEM;Lo;0;L;;;;;N;;;;; +16928;BAMUM LETTER PHASE-D TEEEE;Lo;0;L;;;;;N;;;;; +16929;BAMUM LETTER PHASE-D NGKEUAEQ;Lo;0;L;;;;;N;;;;; +1692A;BAMUM LETTER PHASE-D MFEUAE;Lo;0;L;;;;;N;;;;; +1692B;BAMUM LETTER PHASE-D NSIEET;Lo;0;L;;;;;N;;;;; +1692C;BAMUM LETTER PHASE-D KEUP;Lo;0;L;;;;;N;;;;; +1692D;BAMUM LETTER PHASE-D PIP;Lo;0;L;;;;;N;;;;; +1692E;BAMUM LETTER PHASE-D PEUTAE;Lo;0;L;;;;;N;;;;; +1692F;BAMUM LETTER PHASE-D NYUE;Lo;0;L;;;;;N;;;;; +16930;BAMUM LETTER PHASE-D LET;Lo;0;L;;;;;N;;;;; +16931;BAMUM LETTER PHASE-D NGGAAM;Lo;0;L;;;;;N;;;;; +16932;BAMUM LETTER PHASE-D MFIEE;Lo;0;L;;;;;N;;;;; +16933;BAMUM LETTER PHASE-D NGGWAEN;Lo;0;L;;;;;N;;;;; +16934;BAMUM LETTER PHASE-D YUOM;Lo;0;L;;;;;N;;;;; +16935;BAMUM LETTER PHASE-D PAP;Lo;0;L;;;;;N;;;;; +16936;BAMUM LETTER PHASE-D YUOP;Lo;0;L;;;;;N;;;;; +16937;BAMUM LETTER PHASE-D NDAM;Lo;0;L;;;;;N;;;;; +16938;BAMUM LETTER PHASE-D NTEUM;Lo;0;L;;;;;N;;;;; +16939;BAMUM LETTER PHASE-D SUAE;Lo;0;L;;;;;N;;;;; +1693A;BAMUM LETTER PHASE-D KUN;Lo;0;L;;;;;N;;;;; +1693B;BAMUM LETTER PHASE-D NGGEUX;Lo;0;L;;;;;N;;;;; +1693C;BAMUM LETTER PHASE-D NGKIEE;Lo;0;L;;;;;N;;;;; +1693D;BAMUM LETTER PHASE-D TUOT;Lo;0;L;;;;;N;;;;; +1693E;BAMUM LETTER PHASE-D MEUN;Lo;0;L;;;;;N;;;;; +1693F;BAMUM LETTER PHASE-D KUQ;Lo;0;L;;;;;N;;;;; +16940;BAMUM LETTER PHASE-D NSUM;Lo;0;L;;;;;N;;;;; +16941;BAMUM LETTER PHASE-D TEUN;Lo;0;L;;;;;N;;;;; +16942;BAMUM LETTER PHASE-D MAENJET;Lo;0;L;;;;;N;;;;; +16943;BAMUM LETTER PHASE-D NGGAP;Lo;0;L;;;;;N;;;;; +16944;BAMUM LETTER PHASE-D LEUM;Lo;0;L;;;;;N;;;;; +16945;BAMUM LETTER PHASE-D NGGUOM;Lo;0;L;;;;;N;;;;; +16946;BAMUM LETTER PHASE-D NSHUT;Lo;0;L;;;;;N;;;;; +16947;BAMUM LETTER PHASE-D NJUEQ;Lo;0;L;;;;;N;;;;; +16948;BAMUM LETTER PHASE-D GHEUAE;Lo;0;L;;;;;N;;;;; +16949;BAMUM LETTER PHASE-D KU;Lo;0;L;;;;;N;;;;; +1694A;BAMUM LETTER PHASE-D REN OLD;Lo;0;L;;;;;N;;;;; +1694B;BAMUM LETTER PHASE-D TAE;Lo;0;L;;;;;N;;;;; +1694C;BAMUM LETTER PHASE-D TOQ;Lo;0;L;;;;;N;;;;; +1694D;BAMUM LETTER PHASE-D NYI;Lo;0;L;;;;;N;;;;; +1694E;BAMUM LETTER PHASE-D RII;Lo;0;L;;;;;N;;;;; +1694F;BAMUM LETTER PHASE-D LEEEE;Lo;0;L;;;;;N;;;;; +16950;BAMUM LETTER PHASE-D MEEEE;Lo;0;L;;;;;N;;;;; +16951;BAMUM LETTER PHASE-D M;Lo;0;L;;;;;N;;;;; +16952;BAMUM LETTER PHASE-D SUU;Lo;0;L;;;;;N;;;;; +16953;BAMUM LETTER PHASE-D MU;Lo;0;L;;;;;N;;;;; +16954;BAMUM LETTER PHASE-D SHII;Lo;0;L;;;;;N;;;;; +16955;BAMUM LETTER PHASE-D SHEUX;Lo;0;L;;;;;N;;;;; +16956;BAMUM LETTER PHASE-D KYEE;Lo;0;L;;;;;N;;;;; +16957;BAMUM LETTER PHASE-D NU;Lo;0;L;;;;;N;;;;; +16958;BAMUM LETTER PHASE-D SHU;Lo;0;L;;;;;N;;;;; +16959;BAMUM LETTER PHASE-D NTEE;Lo;0;L;;;;;N;;;;; +1695A;BAMUM LETTER PHASE-D PEE;Lo;0;L;;;;;N;;;;; +1695B;BAMUM LETTER PHASE-D NI;Lo;0;L;;;;;N;;;;; +1695C;BAMUM LETTER PHASE-D SHOQ;Lo;0;L;;;;;N;;;;; +1695D;BAMUM LETTER PHASE-D PUQ;Lo;0;L;;;;;N;;;;; +1695E;BAMUM LETTER PHASE-D MVOP;Lo;0;L;;;;;N;;;;; +1695F;BAMUM LETTER PHASE-D LOQ;Lo;0;L;;;;;N;;;;; +16960;BAMUM LETTER PHASE-D REN MUCH;Lo;0;L;;;;;N;;;;; +16961;BAMUM LETTER PHASE-D TI;Lo;0;L;;;;;N;;;;; +16962;BAMUM LETTER PHASE-D NTUU;Lo;0;L;;;;;N;;;;; +16963;BAMUM LETTER PHASE-D MBAA SEVEN;Lo;0;L;;;;;N;;;;; +16964;BAMUM LETTER PHASE-D SAQ;Lo;0;L;;;;;N;;;;; +16965;BAMUM LETTER PHASE-D FAA;Lo;0;L;;;;;N;;;;; +16966;BAMUM LETTER PHASE-E NDAP;Lo;0;L;;;;;N;;;;; +16967;BAMUM LETTER PHASE-E TOON;Lo;0;L;;;;;N;;;;; +16968;BAMUM LETTER PHASE-E MBEUM;Lo;0;L;;;;;N;;;;; +16969;BAMUM LETTER PHASE-E LAP;Lo;0;L;;;;;N;;;;; +1696A;BAMUM LETTER PHASE-E VOM;Lo;0;L;;;;;N;;;;; +1696B;BAMUM LETTER PHASE-E LOON;Lo;0;L;;;;;N;;;;; +1696C;BAMUM LETTER PHASE-E PAA;Lo;0;L;;;;;N;;;;; +1696D;BAMUM LETTER PHASE-E SOM;Lo;0;L;;;;;N;;;;; +1696E;BAMUM LETTER PHASE-E RAQ;Lo;0;L;;;;;N;;;;; +1696F;BAMUM LETTER PHASE-E NSHUOP;Lo;0;L;;;;;N;;;;; +16970;BAMUM LETTER PHASE-E NDUN;Lo;0;L;;;;;N;;;;; +16971;BAMUM LETTER PHASE-E PUAE;Lo;0;L;;;;;N;;;;; +16972;BAMUM LETTER PHASE-E TAM;Lo;0;L;;;;;N;;;;; +16973;BAMUM LETTER PHASE-E NGKA;Lo;0;L;;;;;N;;;;; +16974;BAMUM LETTER PHASE-E KPEUX;Lo;0;L;;;;;N;;;;; +16975;BAMUM LETTER PHASE-E WUO;Lo;0;L;;;;;N;;;;; +16976;BAMUM LETTER PHASE-E SEE;Lo;0;L;;;;;N;;;;; +16977;BAMUM LETTER PHASE-E NGGEUAET;Lo;0;L;;;;;N;;;;; +16978;BAMUM LETTER PHASE-E PAAM;Lo;0;L;;;;;N;;;;; +16979;BAMUM LETTER PHASE-E TOO;Lo;0;L;;;;;N;;;;; +1697A;BAMUM LETTER PHASE-E KUOP;Lo;0;L;;;;;N;;;;; +1697B;BAMUM LETTER PHASE-E LOM;Lo;0;L;;;;;N;;;;; +1697C;BAMUM LETTER PHASE-E NSHIEE;Lo;0;L;;;;;N;;;;; +1697D;BAMUM LETTER PHASE-E NGOP;Lo;0;L;;;;;N;;;;; +1697E;BAMUM LETTER PHASE-E MAEM;Lo;0;L;;;;;N;;;;; +1697F;BAMUM LETTER PHASE-E NGKEUX;Lo;0;L;;;;;N;;;;; +16980;BAMUM LETTER PHASE-E NGOQ;Lo;0;L;;;;;N;;;;; +16981;BAMUM LETTER PHASE-E NSHUE;Lo;0;L;;;;;N;;;;; +16982;BAMUM LETTER PHASE-E RIMGBA;Lo;0;L;;;;;N;;;;; +16983;BAMUM LETTER PHASE-E NJEUX;Lo;0;L;;;;;N;;;;; +16984;BAMUM LETTER PHASE-E PEEM;Lo;0;L;;;;;N;;;;; +16985;BAMUM LETTER PHASE-E SAA;Lo;0;L;;;;;N;;;;; +16986;BAMUM LETTER PHASE-E NGGURAE;Lo;0;L;;;;;N;;;;; +16987;BAMUM LETTER PHASE-E MGBA;Lo;0;L;;;;;N;;;;; +16988;BAMUM LETTER PHASE-E GHEUX;Lo;0;L;;;;;N;;;;; +16989;BAMUM LETTER PHASE-E NGKEUAEM;Lo;0;L;;;;;N;;;;; +1698A;BAMUM LETTER PHASE-E NJAEMLI;Lo;0;L;;;;;N;;;;; +1698B;BAMUM LETTER PHASE-E MAP;Lo;0;L;;;;;N;;;;; +1698C;BAMUM LETTER PHASE-E LOOT;Lo;0;L;;;;;N;;;;; +1698D;BAMUM LETTER PHASE-E NGGEEEE;Lo;0;L;;;;;N;;;;; +1698E;BAMUM LETTER PHASE-E NDIQ;Lo;0;L;;;;;N;;;;; +1698F;BAMUM LETTER PHASE-E TAEN NTEUM;Lo;0;L;;;;;N;;;;; +16990;BAMUM LETTER PHASE-E SET;Lo;0;L;;;;;N;;;;; +16991;BAMUM LETTER PHASE-E PUM;Lo;0;L;;;;;N;;;;; +16992;BAMUM LETTER PHASE-E NDAA SOFTNESS;Lo;0;L;;;;;N;;;;; +16993;BAMUM LETTER PHASE-E NGGUAESHAE NYAM;Lo;0;L;;;;;N;;;;; +16994;BAMUM LETTER PHASE-E YIEE;Lo;0;L;;;;;N;;;;; +16995;BAMUM LETTER PHASE-E GHEUN;Lo;0;L;;;;;N;;;;; +16996;BAMUM LETTER PHASE-E TUAE;Lo;0;L;;;;;N;;;;; +16997;BAMUM LETTER PHASE-E YEUAE;Lo;0;L;;;;;N;;;;; +16998;BAMUM LETTER PHASE-E PO;Lo;0;L;;;;;N;;;;; +16999;BAMUM LETTER PHASE-E TUMAE;Lo;0;L;;;;;N;;;;; +1699A;BAMUM LETTER PHASE-E KEUAE;Lo;0;L;;;;;N;;;;; +1699B;BAMUM LETTER PHASE-E SUAEN;Lo;0;L;;;;;N;;;;; +1699C;BAMUM LETTER PHASE-E TEUAEQ;Lo;0;L;;;;;N;;;;; +1699D;BAMUM LETTER PHASE-E VEUAE;Lo;0;L;;;;;N;;;;; +1699E;BAMUM LETTER PHASE-E WEUX;Lo;0;L;;;;;N;;;;; +1699F;BAMUM LETTER PHASE-E LAAM;Lo;0;L;;;;;N;;;;; +169A0;BAMUM LETTER PHASE-E PU;Lo;0;L;;;;;N;;;;; +169A1;BAMUM LETTER PHASE-E TAAQ;Lo;0;L;;;;;N;;;;; +169A2;BAMUM LETTER PHASE-E GHAAMAE;Lo;0;L;;;;;N;;;;; +169A3;BAMUM LETTER PHASE-E NGEUREUT;Lo;0;L;;;;;N;;;;; +169A4;BAMUM LETTER PHASE-E SHEUAEQ;Lo;0;L;;;;;N;;;;; +169A5;BAMUM LETTER PHASE-E MGBEN;Lo;0;L;;;;;N;;;;; +169A6;BAMUM LETTER PHASE-E MBEE;Lo;0;L;;;;;N;;;;; +169A7;BAMUM LETTER PHASE-E NZAQ;Lo;0;L;;;;;N;;;;; +169A8;BAMUM LETTER PHASE-E NKOM;Lo;0;L;;;;;N;;;;; +169A9;BAMUM LETTER PHASE-E GBET;Lo;0;L;;;;;N;;;;; +169AA;BAMUM LETTER PHASE-E TUM;Lo;0;L;;;;;N;;;;; +169AB;BAMUM LETTER PHASE-E KUET;Lo;0;L;;;;;N;;;;; +169AC;BAMUM LETTER PHASE-E YAP;Lo;0;L;;;;;N;;;;; +169AD;BAMUM LETTER PHASE-E NYI CLEAVER;Lo;0;L;;;;;N;;;;; +169AE;BAMUM LETTER PHASE-E YIT;Lo;0;L;;;;;N;;;;; +169AF;BAMUM LETTER PHASE-E MFEUQ;Lo;0;L;;;;;N;;;;; +169B0;BAMUM LETTER PHASE-E NDIAQ;Lo;0;L;;;;;N;;;;; +169B1;BAMUM LETTER PHASE-E PIEEQ;Lo;0;L;;;;;N;;;;; +169B2;BAMUM LETTER PHASE-E YUEQ;Lo;0;L;;;;;N;;;;; +169B3;BAMUM LETTER PHASE-E LEUAEM;Lo;0;L;;;;;N;;;;; +169B4;BAMUM LETTER PHASE-E FUE;Lo;0;L;;;;;N;;;;; +169B5;BAMUM LETTER PHASE-E GBEUX;Lo;0;L;;;;;N;;;;; +169B6;BAMUM LETTER PHASE-E NGKUP;Lo;0;L;;;;;N;;;;; +169B7;BAMUM LETTER PHASE-E KET;Lo;0;L;;;;;N;;;;; +169B8;BAMUM LETTER PHASE-E MAE;Lo;0;L;;;;;N;;;;; +169B9;BAMUM LETTER PHASE-E NGKAAMI;Lo;0;L;;;;;N;;;;; +169BA;BAMUM LETTER PHASE-E GHET;Lo;0;L;;;;;N;;;;; +169BB;BAMUM LETTER PHASE-E FA;Lo;0;L;;;;;N;;;;; +169BC;BAMUM LETTER PHASE-E NTUM;Lo;0;L;;;;;N;;;;; +169BD;BAMUM LETTER PHASE-E PEUT;Lo;0;L;;;;;N;;;;; +169BE;BAMUM LETTER PHASE-E YEUM;Lo;0;L;;;;;N;;;;; +169BF;BAMUM LETTER PHASE-E NGGEUAE;Lo;0;L;;;;;N;;;;; +169C0;BAMUM LETTER PHASE-E NYI BETWEEN;Lo;0;L;;;;;N;;;;; +169C1;BAMUM LETTER PHASE-E NZUQ;Lo;0;L;;;;;N;;;;; +169C2;BAMUM LETTER PHASE-E POON;Lo;0;L;;;;;N;;;;; +169C3;BAMUM LETTER PHASE-E MIEE;Lo;0;L;;;;;N;;;;; +169C4;BAMUM LETTER PHASE-E FUET;Lo;0;L;;;;;N;;;;; +169C5;BAMUM LETTER PHASE-E NAE;Lo;0;L;;;;;N;;;;; +169C6;BAMUM LETTER PHASE-E MUAE;Lo;0;L;;;;;N;;;;; +169C7;BAMUM LETTER PHASE-E GHEUAE;Lo;0;L;;;;;N;;;;; +169C8;BAMUM LETTER PHASE-E FU I;Lo;0;L;;;;;N;;;;; +169C9;BAMUM LETTER PHASE-E MVI;Lo;0;L;;;;;N;;;;; +169CA;BAMUM LETTER PHASE-E PUAQ;Lo;0;L;;;;;N;;;;; +169CB;BAMUM LETTER PHASE-E NGKUM;Lo;0;L;;;;;N;;;;; +169CC;BAMUM LETTER PHASE-E KUT;Lo;0;L;;;;;N;;;;; +169CD;BAMUM LETTER PHASE-E PIET;Lo;0;L;;;;;N;;;;; +169CE;BAMUM LETTER PHASE-E NTAP;Lo;0;L;;;;;N;;;;; +169CF;BAMUM LETTER PHASE-E YEUAET;Lo;0;L;;;;;N;;;;; +169D0;BAMUM LETTER PHASE-E NGGUP;Lo;0;L;;;;;N;;;;; +169D1;BAMUM LETTER PHASE-E PA PEOPLE;Lo;0;L;;;;;N;;;;; +169D2;BAMUM LETTER PHASE-E FU CALL;Lo;0;L;;;;;N;;;;; +169D3;BAMUM LETTER PHASE-E FOM;Lo;0;L;;;;;N;;;;; +169D4;BAMUM LETTER PHASE-E NJEE;Lo;0;L;;;;;N;;;;; +169D5;BAMUM LETTER PHASE-E A;Lo;0;L;;;;;N;;;;; +169D6;BAMUM LETTER PHASE-E TOQ;Lo;0;L;;;;;N;;;;; +169D7;BAMUM LETTER PHASE-E O;Lo;0;L;;;;;N;;;;; +169D8;BAMUM LETTER PHASE-E I;Lo;0;L;;;;;N;;;;; +169D9;BAMUM LETTER PHASE-E LAQ;Lo;0;L;;;;;N;;;;; +169DA;BAMUM LETTER PHASE-E PA PLURAL;Lo;0;L;;;;;N;;;;; +169DB;BAMUM LETTER PHASE-E TAA;Lo;0;L;;;;;N;;;;; +169DC;BAMUM LETTER PHASE-E TAQ;Lo;0;L;;;;;N;;;;; +169DD;BAMUM LETTER PHASE-E NDAA MY HOUSE;Lo;0;L;;;;;N;;;;; +169DE;BAMUM LETTER PHASE-E SHIQ;Lo;0;L;;;;;N;;;;; +169DF;BAMUM LETTER PHASE-E YEUX;Lo;0;L;;;;;N;;;;; +169E0;BAMUM LETTER PHASE-E NGUAE;Lo;0;L;;;;;N;;;;; +169E1;BAMUM LETTER PHASE-E YUAEN;Lo;0;L;;;;;N;;;;; +169E2;BAMUM LETTER PHASE-E YOQ SWIMMING;Lo;0;L;;;;;N;;;;; +169E3;BAMUM LETTER PHASE-E YOQ COVER;Lo;0;L;;;;;N;;;;; +169E4;BAMUM LETTER PHASE-E YUQ;Lo;0;L;;;;;N;;;;; +169E5;BAMUM LETTER PHASE-E YUN;Lo;0;L;;;;;N;;;;; +169E6;BAMUM LETTER PHASE-E KEUX;Lo;0;L;;;;;N;;;;; +169E7;BAMUM LETTER PHASE-E PEUX;Lo;0;L;;;;;N;;;;; +169E8;BAMUM LETTER PHASE-E NJEE EPOCH;Lo;0;L;;;;;N;;;;; +169E9;BAMUM LETTER PHASE-E PUE;Lo;0;L;;;;;N;;;;; +169EA;BAMUM LETTER PHASE-E WUE;Lo;0;L;;;;;N;;;;; +169EB;BAMUM LETTER PHASE-E FEE;Lo;0;L;;;;;N;;;;; +169EC;BAMUM LETTER PHASE-E VEE;Lo;0;L;;;;;N;;;;; +169ED;BAMUM LETTER PHASE-E LU;Lo;0;L;;;;;N;;;;; +169EE;BAMUM LETTER PHASE-E MI;Lo;0;L;;;;;N;;;;; +169EF;BAMUM LETTER PHASE-E REUX;Lo;0;L;;;;;N;;;;; +169F0;BAMUM LETTER PHASE-E RAE;Lo;0;L;;;;;N;;;;; +169F1;BAMUM LETTER PHASE-E NGUAET;Lo;0;L;;;;;N;;;;; +169F2;BAMUM LETTER PHASE-E NGA;Lo;0;L;;;;;N;;;;; +169F3;BAMUM LETTER PHASE-E SHO;Lo;0;L;;;;;N;;;;; +169F4;BAMUM LETTER PHASE-E SHOQ;Lo;0;L;;;;;N;;;;; +169F5;BAMUM LETTER PHASE-E FU REMEDY;Lo;0;L;;;;;N;;;;; +169F6;BAMUM LETTER PHASE-E NA;Lo;0;L;;;;;N;;;;; +169F7;BAMUM LETTER PHASE-E PI;Lo;0;L;;;;;N;;;;; +169F8;BAMUM LETTER PHASE-E LOQ;Lo;0;L;;;;;N;;;;; +169F9;BAMUM LETTER PHASE-E KO;Lo;0;L;;;;;N;;;;; +169FA;BAMUM LETTER PHASE-E MEN;Lo;0;L;;;;;N;;;;; +169FB;BAMUM LETTER PHASE-E MA;Lo;0;L;;;;;N;;;;; +169FC;BAMUM LETTER PHASE-E MAQ;Lo;0;L;;;;;N;;;;; +169FD;BAMUM LETTER PHASE-E TEU;Lo;0;L;;;;;N;;;;; +169FE;BAMUM LETTER PHASE-E KI;Lo;0;L;;;;;N;;;;; +169FF;BAMUM LETTER PHASE-E MON;Lo;0;L;;;;;N;;;;; +16A00;BAMUM LETTER PHASE-E TEN;Lo;0;L;;;;;N;;;;; +16A01;BAMUM LETTER PHASE-E FAQ;Lo;0;L;;;;;N;;;;; +16A02;BAMUM LETTER PHASE-E GHOM;Lo;0;L;;;;;N;;;;; +16A03;BAMUM LETTER PHASE-F KA;Lo;0;L;;;;;N;;;;; +16A04;BAMUM LETTER PHASE-F U;Lo;0;L;;;;;N;;;;; +16A05;BAMUM LETTER PHASE-F KU;Lo;0;L;;;;;N;;;;; +16A06;BAMUM LETTER PHASE-F EE;Lo;0;L;;;;;N;;;;; +16A07;BAMUM LETTER PHASE-F REE;Lo;0;L;;;;;N;;;;; +16A08;BAMUM LETTER PHASE-F TAE;Lo;0;L;;;;;N;;;;; +16A09;BAMUM LETTER PHASE-F NYI;Lo;0;L;;;;;N;;;;; +16A0A;BAMUM LETTER PHASE-F LA;Lo;0;L;;;;;N;;;;; +16A0B;BAMUM LETTER PHASE-F RII;Lo;0;L;;;;;N;;;;; +16A0C;BAMUM LETTER PHASE-F RIEE;Lo;0;L;;;;;N;;;;; +16A0D;BAMUM LETTER PHASE-F MEEEE;Lo;0;L;;;;;N;;;;; +16A0E;BAMUM LETTER PHASE-F TAA;Lo;0;L;;;;;N;;;;; +16A0F;BAMUM LETTER PHASE-F NDAA;Lo;0;L;;;;;N;;;;; +16A10;BAMUM LETTER PHASE-F NJAEM;Lo;0;L;;;;;N;;;;; +16A11;BAMUM LETTER PHASE-F M;Lo;0;L;;;;;N;;;;; +16A12;BAMUM LETTER PHASE-F SUU;Lo;0;L;;;;;N;;;;; +16A13;BAMUM LETTER PHASE-F SHII;Lo;0;L;;;;;N;;;;; +16A14;BAMUM LETTER PHASE-F SI;Lo;0;L;;;;;N;;;;; +16A15;BAMUM LETTER PHASE-F SEUX;Lo;0;L;;;;;N;;;;; +16A16;BAMUM LETTER PHASE-F KYEE;Lo;0;L;;;;;N;;;;; +16A17;BAMUM LETTER PHASE-F KET;Lo;0;L;;;;;N;;;;; +16A18;BAMUM LETTER PHASE-F NUAE;Lo;0;L;;;;;N;;;;; +16A19;BAMUM LETTER PHASE-F NU;Lo;0;L;;;;;N;;;;; +16A1A;BAMUM LETTER PHASE-F NJUAE;Lo;0;L;;;;;N;;;;; +16A1B;BAMUM LETTER PHASE-F YOQ;Lo;0;L;;;;;N;;;;; +16A1C;BAMUM LETTER PHASE-F SHU;Lo;0;L;;;;;N;;;;; +16A1D;BAMUM LETTER PHASE-F YA;Lo;0;L;;;;;N;;;;; +16A1E;BAMUM LETTER PHASE-F NSHA;Lo;0;L;;;;;N;;;;; +16A1F;BAMUM LETTER PHASE-F PEUX;Lo;0;L;;;;;N;;;;; +16A20;BAMUM LETTER PHASE-F NTEE;Lo;0;L;;;;;N;;;;; +16A21;BAMUM LETTER PHASE-F WUE;Lo;0;L;;;;;N;;;;; +16A22;BAMUM LETTER PHASE-F PEE;Lo;0;L;;;;;N;;;;; +16A23;BAMUM LETTER PHASE-F RU;Lo;0;L;;;;;N;;;;; +16A24;BAMUM LETTER PHASE-F NI;Lo;0;L;;;;;N;;;;; +16A25;BAMUM LETTER PHASE-F REUX;Lo;0;L;;;;;N;;;;; +16A26;BAMUM LETTER PHASE-F KEN;Lo;0;L;;;;;N;;;;; +16A27;BAMUM LETTER PHASE-F NGKWAEN;Lo;0;L;;;;;N;;;;; +16A28;BAMUM LETTER PHASE-F NGGA;Lo;0;L;;;;;N;;;;; +16A29;BAMUM LETTER PHASE-F SHO;Lo;0;L;;;;;N;;;;; +16A2A;BAMUM LETTER PHASE-F PUAE;Lo;0;L;;;;;N;;;;; +16A2B;BAMUM LETTER PHASE-F FOM;Lo;0;L;;;;;N;;;;; +16A2C;BAMUM LETTER PHASE-F WA;Lo;0;L;;;;;N;;;;; +16A2D;BAMUM LETTER PHASE-F LI;Lo;0;L;;;;;N;;;;; +16A2E;BAMUM LETTER PHASE-F LOQ;Lo;0;L;;;;;N;;;;; +16A2F;BAMUM LETTER PHASE-F KO;Lo;0;L;;;;;N;;;;; +16A30;BAMUM LETTER PHASE-F MBEN;Lo;0;L;;;;;N;;;;; +16A31;BAMUM LETTER PHASE-F REN;Lo;0;L;;;;;N;;;;; +16A32;BAMUM LETTER PHASE-F MA;Lo;0;L;;;;;N;;;;; +16A33;BAMUM LETTER PHASE-F MO;Lo;0;L;;;;;N;;;;; +16A34;BAMUM LETTER PHASE-F MBAA;Lo;0;L;;;;;N;;;;; +16A35;BAMUM LETTER PHASE-F TET;Lo;0;L;;;;;N;;;;; +16A36;BAMUM LETTER PHASE-F KPA;Lo;0;L;;;;;N;;;;; +16A37;BAMUM LETTER PHASE-F SAMBA;Lo;0;L;;;;;N;;;;; +16A38;BAMUM LETTER PHASE-F VUEQ;Lo;0;L;;;;;N;;;;; +16A40;MRO LETTER TA;Lo;0;L;;;;;N;;;;; +16A41;MRO LETTER NGI;Lo;0;L;;;;;N;;;;; +16A42;MRO LETTER YO;Lo;0;L;;;;;N;;;;; +16A43;MRO LETTER MIM;Lo;0;L;;;;;N;;;;; +16A44;MRO LETTER BA;Lo;0;L;;;;;N;;;;; +16A45;MRO LETTER DA;Lo;0;L;;;;;N;;;;; +16A46;MRO LETTER A;Lo;0;L;;;;;N;;;;; +16A47;MRO LETTER PHI;Lo;0;L;;;;;N;;;;; +16A48;MRO LETTER KHAI;Lo;0;L;;;;;N;;;;; +16A49;MRO LETTER HAO;Lo;0;L;;;;;N;;;;; +16A4A;MRO LETTER DAI;Lo;0;L;;;;;N;;;;; +16A4B;MRO LETTER CHU;Lo;0;L;;;;;N;;;;; +16A4C;MRO LETTER KEAAE;Lo;0;L;;;;;N;;;;; +16A4D;MRO LETTER OL;Lo;0;L;;;;;N;;;;; +16A4E;MRO LETTER MAEM;Lo;0;L;;;;;N;;;;; +16A4F;MRO LETTER NIN;Lo;0;L;;;;;N;;;;; +16A50;MRO LETTER PA;Lo;0;L;;;;;N;;;;; +16A51;MRO LETTER OO;Lo;0;L;;;;;N;;;;; +16A52;MRO LETTER O;Lo;0;L;;;;;N;;;;; +16A53;MRO LETTER RO;Lo;0;L;;;;;N;;;;; +16A54;MRO LETTER SHI;Lo;0;L;;;;;N;;;;; +16A55;MRO LETTER THEA;Lo;0;L;;;;;N;;;;; +16A56;MRO LETTER EA;Lo;0;L;;;;;N;;;;; +16A57;MRO LETTER WA;Lo;0;L;;;;;N;;;;; +16A58;MRO LETTER E;Lo;0;L;;;;;N;;;;; +16A59;MRO LETTER KO;Lo;0;L;;;;;N;;;;; +16A5A;MRO LETTER LAN;Lo;0;L;;;;;N;;;;; +16A5B;MRO LETTER LA;Lo;0;L;;;;;N;;;;; +16A5C;MRO LETTER HAI;Lo;0;L;;;;;N;;;;; +16A5D;MRO LETTER RI;Lo;0;L;;;;;N;;;;; +16A5E;MRO LETTER TEK;Lo;0;L;;;;;N;;;;; +16A60;MRO DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +16A61;MRO DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +16A62;MRO DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +16A63;MRO DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +16A64;MRO DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +16A65;MRO DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +16A66;MRO DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +16A67;MRO DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +16A68;MRO DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +16A69;MRO DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +16A6E;MRO DANDA;Po;0;L;;;;;N;;;;; +16A6F;MRO DOUBLE DANDA;Po;0;L;;;;;N;;;;; +16AD0;BASSA VAH LETTER ENNI;Lo;0;L;;;;;N;;;;; +16AD1;BASSA VAH LETTER KA;Lo;0;L;;;;;N;;;;; +16AD2;BASSA VAH LETTER SE;Lo;0;L;;;;;N;;;;; +16AD3;BASSA VAH LETTER FA;Lo;0;L;;;;;N;;;;; +16AD4;BASSA VAH LETTER MBE;Lo;0;L;;;;;N;;;;; +16AD5;BASSA VAH LETTER YIE;Lo;0;L;;;;;N;;;;; +16AD6;BASSA VAH LETTER GAH;Lo;0;L;;;;;N;;;;; +16AD7;BASSA VAH LETTER DHII;Lo;0;L;;;;;N;;;;; +16AD8;BASSA VAH LETTER KPAH;Lo;0;L;;;;;N;;;;; +16AD9;BASSA VAH LETTER JO;Lo;0;L;;;;;N;;;;; +16ADA;BASSA VAH LETTER HWAH;Lo;0;L;;;;;N;;;;; +16ADB;BASSA VAH LETTER WA;Lo;0;L;;;;;N;;;;; +16ADC;BASSA VAH LETTER ZO;Lo;0;L;;;;;N;;;;; +16ADD;BASSA VAH LETTER GBU;Lo;0;L;;;;;N;;;;; +16ADE;BASSA VAH LETTER DO;Lo;0;L;;;;;N;;;;; +16ADF;BASSA VAH LETTER CE;Lo;0;L;;;;;N;;;;; +16AE0;BASSA VAH LETTER UWU;Lo;0;L;;;;;N;;;;; +16AE1;BASSA VAH LETTER TO;Lo;0;L;;;;;N;;;;; +16AE2;BASSA VAH LETTER BA;Lo;0;L;;;;;N;;;;; +16AE3;BASSA VAH LETTER VU;Lo;0;L;;;;;N;;;;; +16AE4;BASSA VAH LETTER YEIN;Lo;0;L;;;;;N;;;;; +16AE5;BASSA VAH LETTER PA;Lo;0;L;;;;;N;;;;; +16AE6;BASSA VAH LETTER WADDA;Lo;0;L;;;;;N;;;;; +16AE7;BASSA VAH LETTER A;Lo;0;L;;;;;N;;;;; +16AE8;BASSA VAH LETTER O;Lo;0;L;;;;;N;;;;; +16AE9;BASSA VAH LETTER OO;Lo;0;L;;;;;N;;;;; +16AEA;BASSA VAH LETTER U;Lo;0;L;;;;;N;;;;; +16AEB;BASSA VAH LETTER EE;Lo;0;L;;;;;N;;;;; +16AEC;BASSA VAH LETTER E;Lo;0;L;;;;;N;;;;; +16AED;BASSA VAH LETTER I;Lo;0;L;;;;;N;;;;; +16AF0;BASSA VAH COMBINING HIGH TONE;Mn;1;NSM;;;;;N;;;;; +16AF1;BASSA VAH COMBINING LOW TONE;Mn;1;NSM;;;;;N;;;;; +16AF2;BASSA VAH COMBINING MID TONE;Mn;1;NSM;;;;;N;;;;; +16AF3;BASSA VAH COMBINING LOW-MID TONE;Mn;1;NSM;;;;;N;;;;; +16AF4;BASSA VAH COMBINING HIGH-LOW TONE;Mn;1;NSM;;;;;N;;;;; +16AF5;BASSA VAH FULL STOP;Po;0;L;;;;;N;;;;; +16B00;PAHAWH HMONG VOWEL KEEB;Lo;0;L;;;;;N;;;;; +16B01;PAHAWH HMONG VOWEL KEEV;Lo;0;L;;;;;N;;;;; +16B02;PAHAWH HMONG VOWEL KIB;Lo;0;L;;;;;N;;;;; +16B03;PAHAWH HMONG VOWEL KIV;Lo;0;L;;;;;N;;;;; +16B04;PAHAWH HMONG VOWEL KAUB;Lo;0;L;;;;;N;;;;; +16B05;PAHAWH HMONG VOWEL KAUV;Lo;0;L;;;;;N;;;;; +16B06;PAHAWH HMONG VOWEL KUB;Lo;0;L;;;;;N;;;;; +16B07;PAHAWH HMONG VOWEL KUV;Lo;0;L;;;;;N;;;;; +16B08;PAHAWH HMONG VOWEL KEB;Lo;0;L;;;;;N;;;;; +16B09;PAHAWH HMONG VOWEL KEV;Lo;0;L;;;;;N;;;;; +16B0A;PAHAWH HMONG VOWEL KAIB;Lo;0;L;;;;;N;;;;; +16B0B;PAHAWH HMONG VOWEL KAIV;Lo;0;L;;;;;N;;;;; +16B0C;PAHAWH HMONG VOWEL KOOB;Lo;0;L;;;;;N;;;;; +16B0D;PAHAWH HMONG VOWEL KOOV;Lo;0;L;;;;;N;;;;; +16B0E;PAHAWH HMONG VOWEL KAWB;Lo;0;L;;;;;N;;;;; +16B0F;PAHAWH HMONG VOWEL KAWV;Lo;0;L;;;;;N;;;;; +16B10;PAHAWH HMONG VOWEL KUAB;Lo;0;L;;;;;N;;;;; +16B11;PAHAWH HMONG VOWEL KUAV;Lo;0;L;;;;;N;;;;; +16B12;PAHAWH HMONG VOWEL KOB;Lo;0;L;;;;;N;;;;; +16B13;PAHAWH HMONG VOWEL KOV;Lo;0;L;;;;;N;;;;; +16B14;PAHAWH HMONG VOWEL KIAB;Lo;0;L;;;;;N;;;;; +16B15;PAHAWH HMONG VOWEL KIAV;Lo;0;L;;;;;N;;;;; +16B16;PAHAWH HMONG VOWEL KAB;Lo;0;L;;;;;N;;;;; +16B17;PAHAWH HMONG VOWEL KAV;Lo;0;L;;;;;N;;;;; +16B18;PAHAWH HMONG VOWEL KWB;Lo;0;L;;;;;N;;;;; +16B19;PAHAWH HMONG VOWEL KWV;Lo;0;L;;;;;N;;;;; +16B1A;PAHAWH HMONG VOWEL KAAB;Lo;0;L;;;;;N;;;;; +16B1B;PAHAWH HMONG VOWEL KAAV;Lo;0;L;;;;;N;;;;; +16B1C;PAHAWH HMONG CONSONANT VAU;Lo;0;L;;;;;N;;;;; +16B1D;PAHAWH HMONG CONSONANT NTSAU;Lo;0;L;;;;;N;;;;; +16B1E;PAHAWH HMONG CONSONANT LAU;Lo;0;L;;;;;N;;;;; +16B1F;PAHAWH HMONG CONSONANT HAU;Lo;0;L;;;;;N;;;;; +16B20;PAHAWH HMONG CONSONANT NLAU;Lo;0;L;;;;;N;;;;; +16B21;PAHAWH HMONG CONSONANT RAU;Lo;0;L;;;;;N;;;;; +16B22;PAHAWH HMONG CONSONANT NKAU;Lo;0;L;;;;;N;;;;; +16B23;PAHAWH HMONG CONSONANT QHAU;Lo;0;L;;;;;N;;;;; +16B24;PAHAWH HMONG CONSONANT YAU;Lo;0;L;;;;;N;;;;; +16B25;PAHAWH HMONG CONSONANT HLAU;Lo;0;L;;;;;N;;;;; +16B26;PAHAWH HMONG CONSONANT MAU;Lo;0;L;;;;;N;;;;; +16B27;PAHAWH HMONG CONSONANT CHAU;Lo;0;L;;;;;N;;;;; +16B28;PAHAWH HMONG CONSONANT NCHAU;Lo;0;L;;;;;N;;;;; +16B29;PAHAWH HMONG CONSONANT HNAU;Lo;0;L;;;;;N;;;;; +16B2A;PAHAWH HMONG CONSONANT PLHAU;Lo;0;L;;;;;N;;;;; +16B2B;PAHAWH HMONG CONSONANT NTHAU;Lo;0;L;;;;;N;;;;; +16B2C;PAHAWH HMONG CONSONANT NAU;Lo;0;L;;;;;N;;;;; +16B2D;PAHAWH HMONG CONSONANT AU;Lo;0;L;;;;;N;;;;; +16B2E;PAHAWH HMONG CONSONANT XAU;Lo;0;L;;;;;N;;;;; +16B2F;PAHAWH HMONG CONSONANT CAU;Lo;0;L;;;;;N;;;;; +16B30;PAHAWH HMONG MARK CIM TUB;Mn;230;NSM;;;;;N;;;;; +16B31;PAHAWH HMONG MARK CIM SO;Mn;230;NSM;;;;;N;;;;; +16B32;PAHAWH HMONG MARK CIM KES;Mn;230;NSM;;;;;N;;;;; +16B33;PAHAWH HMONG MARK CIM KHAV;Mn;230;NSM;;;;;N;;;;; +16B34;PAHAWH HMONG MARK CIM SUAM;Mn;230;NSM;;;;;N;;;;; +16B35;PAHAWH HMONG MARK CIM HOM;Mn;230;NSM;;;;;N;;;;; +16B36;PAHAWH HMONG MARK CIM TAUM;Mn;230;NSM;;;;;N;;;;; +16B37;PAHAWH HMONG SIGN VOS THOM;Po;0;L;;;;;N;;;;; +16B38;PAHAWH HMONG SIGN VOS TSHAB CEEB;Po;0;L;;;;;N;;;;; +16B39;PAHAWH HMONG SIGN CIM CHEEM;Po;0;L;;;;;N;;;;; +16B3A;PAHAWH HMONG SIGN VOS THIAB;Po;0;L;;;;;N;;;;; +16B3B;PAHAWH HMONG SIGN VOS FEEM;Po;0;L;;;;;N;;;;; +16B3C;PAHAWH HMONG SIGN XYEEM NTXIV;So;0;L;;;;;N;;;;; +16B3D;PAHAWH HMONG SIGN XYEEM RHO;So;0;L;;;;;N;;;;; +16B3E;PAHAWH HMONG SIGN XYEEM TOV;So;0;L;;;;;N;;;;; +16B3F;PAHAWH HMONG SIGN XYEEM FAIB;So;0;L;;;;;N;;;;; +16B40;PAHAWH HMONG SIGN VOS SEEV;Lm;0;L;;;;;N;;;;; +16B41;PAHAWH HMONG SIGN MEEJ SUAB;Lm;0;L;;;;;N;;;;; +16B42;PAHAWH HMONG SIGN VOS NRUA;Lm;0;L;;;;;N;;;;; +16B43;PAHAWH HMONG SIGN IB YAM;Lm;0;L;;;;;N;;;;; +16B44;PAHAWH HMONG SIGN XAUS;Po;0;L;;;;;N;;;;; +16B45;PAHAWH HMONG SIGN CIM TSOV ROG;So;0;L;;;;;N;;;;; +16B50;PAHAWH HMONG DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +16B51;PAHAWH HMONG DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +16B52;PAHAWH HMONG DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +16B53;PAHAWH HMONG DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +16B54;PAHAWH HMONG DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +16B55;PAHAWH HMONG DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +16B56;PAHAWH HMONG DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +16B57;PAHAWH HMONG DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +16B58;PAHAWH HMONG DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +16B59;PAHAWH HMONG DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +16B5B;PAHAWH HMONG NUMBER TENS;No;0;L;;;;10;N;;;;; +16B5C;PAHAWH HMONG NUMBER HUNDREDS;No;0;L;;;;100;N;;;;; +16B5D;PAHAWH HMONG NUMBER TEN THOUSANDS;No;0;L;;;;10000;N;;;;; +16B5E;PAHAWH HMONG NUMBER MILLIONS;No;0;L;;;;1000000;N;;;;; +16B5F;PAHAWH HMONG NUMBER HUNDRED MILLIONS;No;0;L;;;;100000000;N;;;;; +16B60;PAHAWH HMONG NUMBER TEN BILLIONS;No;0;L;;;;10000000000;N;;;;; +16B61;PAHAWH HMONG NUMBER TRILLIONS;No;0;L;;;;1000000000000;N;;;;; +16B63;PAHAWH HMONG SIGN VOS LUB;Lo;0;L;;;;;N;;;;; +16B64;PAHAWH HMONG SIGN XYOO;Lo;0;L;;;;;N;;;;; +16B65;PAHAWH HMONG SIGN HLI;Lo;0;L;;;;;N;;;;; +16B66;PAHAWH HMONG SIGN THIRD-STAGE HLI;Lo;0;L;;;;;N;;;;; +16B67;PAHAWH HMONG SIGN ZWJ THAJ;Lo;0;L;;;;;N;;;;; +16B68;PAHAWH HMONG SIGN HNUB;Lo;0;L;;;;;N;;;;; +16B69;PAHAWH HMONG SIGN NQIG;Lo;0;L;;;;;N;;;;; +16B6A;PAHAWH HMONG SIGN XIAB;Lo;0;L;;;;;N;;;;; +16B6B;PAHAWH HMONG SIGN NTUJ;Lo;0;L;;;;;N;;;;; +16B6C;PAHAWH HMONG SIGN AV;Lo;0;L;;;;;N;;;;; +16B6D;PAHAWH HMONG SIGN TXHEEJ CEEV;Lo;0;L;;;;;N;;;;; +16B6E;PAHAWH HMONG SIGN MEEJ TSEEB;Lo;0;L;;;;;N;;;;; +16B6F;PAHAWH HMONG SIGN TAU;Lo;0;L;;;;;N;;;;; +16B70;PAHAWH HMONG SIGN LOS;Lo;0;L;;;;;N;;;;; +16B71;PAHAWH HMONG SIGN MUS;Lo;0;L;;;;;N;;;;; +16B72;PAHAWH HMONG SIGN CIM HAIS LUS NTOG NTOG;Lo;0;L;;;;;N;;;;; +16B73;PAHAWH HMONG SIGN CIM CUAM TSHOOJ;Lo;0;L;;;;;N;;;;; +16B74;PAHAWH HMONG SIGN CIM TXWV;Lo;0;L;;;;;N;;;;; +16B75;PAHAWH HMONG SIGN CIM TXWV CHWV;Lo;0;L;;;;;N;;;;; +16B76;PAHAWH HMONG SIGN CIM PUB DAWB;Lo;0;L;;;;;N;;;;; +16B77;PAHAWH HMONG SIGN CIM NRES TOS;Lo;0;L;;;;;N;;;;; +16B7D;PAHAWH HMONG CLAN SIGN TSHEEJ;Lo;0;L;;;;;N;;;;; +16B7E;PAHAWH HMONG CLAN SIGN YEEG;Lo;0;L;;;;;N;;;;; +16B7F;PAHAWH HMONG CLAN SIGN LIS;Lo;0;L;;;;;N;;;;; +16B80;PAHAWH HMONG CLAN SIGN LAUJ;Lo;0;L;;;;;N;;;;; +16B81;PAHAWH HMONG CLAN SIGN XYOOJ;Lo;0;L;;;;;N;;;;; +16B82;PAHAWH HMONG CLAN SIGN KOO;Lo;0;L;;;;;N;;;;; +16B83;PAHAWH HMONG CLAN SIGN HAWJ;Lo;0;L;;;;;N;;;;; +16B84;PAHAWH HMONG CLAN SIGN MUAS;Lo;0;L;;;;;N;;;;; +16B85;PAHAWH HMONG CLAN SIGN THOJ;Lo;0;L;;;;;N;;;;; +16B86;PAHAWH HMONG CLAN SIGN TSAB;Lo;0;L;;;;;N;;;;; +16B87;PAHAWH HMONG CLAN SIGN PHAB;Lo;0;L;;;;;N;;;;; +16B88;PAHAWH HMONG CLAN SIGN KHAB;Lo;0;L;;;;;N;;;;; +16B89;PAHAWH HMONG CLAN SIGN HAM;Lo;0;L;;;;;N;;;;; +16B8A;PAHAWH HMONG CLAN SIGN VAJ;Lo;0;L;;;;;N;;;;; +16B8B;PAHAWH HMONG CLAN SIGN FAJ;Lo;0;L;;;;;N;;;;; +16B8C;PAHAWH HMONG CLAN SIGN YAJ;Lo;0;L;;;;;N;;;;; +16B8D;PAHAWH HMONG CLAN SIGN TSWB;Lo;0;L;;;;;N;;;;; +16B8E;PAHAWH HMONG CLAN SIGN KWM;Lo;0;L;;;;;N;;;;; +16B8F;PAHAWH HMONG CLAN SIGN VWJ;Lo;0;L;;;;;N;;;;; +16E40;MEDEFAIDRIN CAPITAL LETTER M;Lu;0;L;;;;;N;;;;16E60; +16E41;MEDEFAIDRIN CAPITAL LETTER S;Lu;0;L;;;;;N;;;;16E61; +16E42;MEDEFAIDRIN CAPITAL LETTER V;Lu;0;L;;;;;N;;;;16E62; +16E43;MEDEFAIDRIN CAPITAL LETTER W;Lu;0;L;;;;;N;;;;16E63; +16E44;MEDEFAIDRIN CAPITAL LETTER ATIU;Lu;0;L;;;;;N;;;;16E64; +16E45;MEDEFAIDRIN CAPITAL LETTER Z;Lu;0;L;;;;;N;;;;16E65; +16E46;MEDEFAIDRIN CAPITAL LETTER KP;Lu;0;L;;;;;N;;;;16E66; +16E47;MEDEFAIDRIN CAPITAL LETTER P;Lu;0;L;;;;;N;;;;16E67; +16E48;MEDEFAIDRIN CAPITAL LETTER T;Lu;0;L;;;;;N;;;;16E68; +16E49;MEDEFAIDRIN CAPITAL LETTER G;Lu;0;L;;;;;N;;;;16E69; +16E4A;MEDEFAIDRIN CAPITAL LETTER F;Lu;0;L;;;;;N;;;;16E6A; +16E4B;MEDEFAIDRIN CAPITAL LETTER I;Lu;0;L;;;;;N;;;;16E6B; +16E4C;MEDEFAIDRIN CAPITAL LETTER K;Lu;0;L;;;;;N;;;;16E6C; +16E4D;MEDEFAIDRIN CAPITAL LETTER A;Lu;0;L;;;;;N;;;;16E6D; +16E4E;MEDEFAIDRIN CAPITAL LETTER J;Lu;0;L;;;;;N;;;;16E6E; +16E4F;MEDEFAIDRIN CAPITAL LETTER E;Lu;0;L;;;;;N;;;;16E6F; +16E50;MEDEFAIDRIN CAPITAL LETTER B;Lu;0;L;;;;;N;;;;16E70; +16E51;MEDEFAIDRIN CAPITAL LETTER C;Lu;0;L;;;;;N;;;;16E71; +16E52;MEDEFAIDRIN CAPITAL LETTER U;Lu;0;L;;;;;N;;;;16E72; +16E53;MEDEFAIDRIN CAPITAL LETTER YU;Lu;0;L;;;;;N;;;;16E73; +16E54;MEDEFAIDRIN CAPITAL LETTER L;Lu;0;L;;;;;N;;;;16E74; +16E55;MEDEFAIDRIN CAPITAL LETTER Q;Lu;0;L;;;;;N;;;;16E75; +16E56;MEDEFAIDRIN CAPITAL LETTER HP;Lu;0;L;;;;;N;;;;16E76; +16E57;MEDEFAIDRIN CAPITAL LETTER NY;Lu;0;L;;;;;N;;;;16E77; +16E58;MEDEFAIDRIN CAPITAL LETTER X;Lu;0;L;;;;;N;;;;16E78; +16E59;MEDEFAIDRIN CAPITAL LETTER D;Lu;0;L;;;;;N;;;;16E79; +16E5A;MEDEFAIDRIN CAPITAL LETTER OE;Lu;0;L;;;;;N;;;;16E7A; +16E5B;MEDEFAIDRIN CAPITAL LETTER N;Lu;0;L;;;;;N;;;;16E7B; +16E5C;MEDEFAIDRIN CAPITAL LETTER R;Lu;0;L;;;;;N;;;;16E7C; +16E5D;MEDEFAIDRIN CAPITAL LETTER O;Lu;0;L;;;;;N;;;;16E7D; +16E5E;MEDEFAIDRIN CAPITAL LETTER AI;Lu;0;L;;;;;N;;;;16E7E; +16E5F;MEDEFAIDRIN CAPITAL LETTER Y;Lu;0;L;;;;;N;;;;16E7F; +16E60;MEDEFAIDRIN SMALL LETTER M;Ll;0;L;;;;;N;;;16E40;;16E40 +16E61;MEDEFAIDRIN SMALL LETTER S;Ll;0;L;;;;;N;;;16E41;;16E41 +16E62;MEDEFAIDRIN SMALL LETTER V;Ll;0;L;;;;;N;;;16E42;;16E42 +16E63;MEDEFAIDRIN SMALL LETTER W;Ll;0;L;;;;;N;;;16E43;;16E43 +16E64;MEDEFAIDRIN SMALL LETTER ATIU;Ll;0;L;;;;;N;;;16E44;;16E44 +16E65;MEDEFAIDRIN SMALL LETTER Z;Ll;0;L;;;;;N;;;16E45;;16E45 +16E66;MEDEFAIDRIN SMALL LETTER KP;Ll;0;L;;;;;N;;;16E46;;16E46 +16E67;MEDEFAIDRIN SMALL LETTER P;Ll;0;L;;;;;N;;;16E47;;16E47 +16E68;MEDEFAIDRIN SMALL LETTER T;Ll;0;L;;;;;N;;;16E48;;16E48 +16E69;MEDEFAIDRIN SMALL LETTER G;Ll;0;L;;;;;N;;;16E49;;16E49 +16E6A;MEDEFAIDRIN SMALL LETTER F;Ll;0;L;;;;;N;;;16E4A;;16E4A +16E6B;MEDEFAIDRIN SMALL LETTER I;Ll;0;L;;;;;N;;;16E4B;;16E4B +16E6C;MEDEFAIDRIN SMALL LETTER K;Ll;0;L;;;;;N;;;16E4C;;16E4C +16E6D;MEDEFAIDRIN SMALL LETTER A;Ll;0;L;;;;;N;;;16E4D;;16E4D +16E6E;MEDEFAIDRIN SMALL LETTER J;Ll;0;L;;;;;N;;;16E4E;;16E4E +16E6F;MEDEFAIDRIN SMALL LETTER E;Ll;0;L;;;;;N;;;16E4F;;16E4F +16E70;MEDEFAIDRIN SMALL LETTER B;Ll;0;L;;;;;N;;;16E50;;16E50 +16E71;MEDEFAIDRIN SMALL LETTER C;Ll;0;L;;;;;N;;;16E51;;16E51 +16E72;MEDEFAIDRIN SMALL LETTER U;Ll;0;L;;;;;N;;;16E52;;16E52 +16E73;MEDEFAIDRIN SMALL LETTER YU;Ll;0;L;;;;;N;;;16E53;;16E53 +16E74;MEDEFAIDRIN SMALL LETTER L;Ll;0;L;;;;;N;;;16E54;;16E54 +16E75;MEDEFAIDRIN SMALL LETTER Q;Ll;0;L;;;;;N;;;16E55;;16E55 +16E76;MEDEFAIDRIN SMALL LETTER HP;Ll;0;L;;;;;N;;;16E56;;16E56 +16E77;MEDEFAIDRIN SMALL LETTER NY;Ll;0;L;;;;;N;;;16E57;;16E57 +16E78;MEDEFAIDRIN SMALL LETTER X;Ll;0;L;;;;;N;;;16E58;;16E58 +16E79;MEDEFAIDRIN SMALL LETTER D;Ll;0;L;;;;;N;;;16E59;;16E59 +16E7A;MEDEFAIDRIN SMALL LETTER OE;Ll;0;L;;;;;N;;;16E5A;;16E5A +16E7B;MEDEFAIDRIN SMALL LETTER N;Ll;0;L;;;;;N;;;16E5B;;16E5B +16E7C;MEDEFAIDRIN SMALL LETTER R;Ll;0;L;;;;;N;;;16E5C;;16E5C +16E7D;MEDEFAIDRIN SMALL LETTER O;Ll;0;L;;;;;N;;;16E5D;;16E5D +16E7E;MEDEFAIDRIN SMALL LETTER AI;Ll;0;L;;;;;N;;;16E5E;;16E5E +16E7F;MEDEFAIDRIN SMALL LETTER Y;Ll;0;L;;;;;N;;;16E5F;;16E5F +16E80;MEDEFAIDRIN DIGIT ZERO;No;0;L;;;;0;N;;;;; +16E81;MEDEFAIDRIN DIGIT ONE;No;0;L;;;;1;N;;;;; +16E82;MEDEFAIDRIN DIGIT TWO;No;0;L;;;;2;N;;;;; +16E83;MEDEFAIDRIN DIGIT THREE;No;0;L;;;;3;N;;;;; +16E84;MEDEFAIDRIN DIGIT FOUR;No;0;L;;;;4;N;;;;; +16E85;MEDEFAIDRIN DIGIT FIVE;No;0;L;;;;5;N;;;;; +16E86;MEDEFAIDRIN DIGIT SIX;No;0;L;;;;6;N;;;;; +16E87;MEDEFAIDRIN DIGIT SEVEN;No;0;L;;;;7;N;;;;; +16E88;MEDEFAIDRIN DIGIT EIGHT;No;0;L;;;;8;N;;;;; +16E89;MEDEFAIDRIN DIGIT NINE;No;0;L;;;;9;N;;;;; +16E8A;MEDEFAIDRIN NUMBER TEN;No;0;L;;;;10;N;;;;; +16E8B;MEDEFAIDRIN NUMBER ELEVEN;No;0;L;;;;11;N;;;;; +16E8C;MEDEFAIDRIN NUMBER TWELVE;No;0;L;;;;12;N;;;;; +16E8D;MEDEFAIDRIN NUMBER THIRTEEN;No;0;L;;;;13;N;;;;; +16E8E;MEDEFAIDRIN NUMBER FOURTEEN;No;0;L;;;;14;N;;;;; +16E8F;MEDEFAIDRIN NUMBER FIFTEEN;No;0;L;;;;15;N;;;;; +16E90;MEDEFAIDRIN NUMBER SIXTEEN;No;0;L;;;;16;N;;;;; +16E91;MEDEFAIDRIN NUMBER SEVENTEEN;No;0;L;;;;17;N;;;;; +16E92;MEDEFAIDRIN NUMBER EIGHTEEN;No;0;L;;;;18;N;;;;; +16E93;MEDEFAIDRIN NUMBER NINETEEN;No;0;L;;;;19;N;;;;; +16E94;MEDEFAIDRIN DIGIT ONE ALTERNATE FORM;No;0;L;;;;1;N;;;;; +16E95;MEDEFAIDRIN DIGIT TWO ALTERNATE FORM;No;0;L;;;;2;N;;;;; +16E96;MEDEFAIDRIN DIGIT THREE ALTERNATE FORM;No;0;L;;;;3;N;;;;; +16E97;MEDEFAIDRIN COMMA;Po;0;L;;;;;N;;;;; +16E98;MEDEFAIDRIN FULL STOP;Po;0;L;;;;;N;;;;; +16E99;MEDEFAIDRIN SYMBOL AIVA;Po;0;L;;;;;N;;;;; +16E9A;MEDEFAIDRIN EXCLAMATION OH;Po;0;L;;;;;N;;;;; +16F00;MIAO LETTER PA;Lo;0;L;;;;;N;;;;; +16F01;MIAO LETTER BA;Lo;0;L;;;;;N;;;;; +16F02;MIAO LETTER YI PA;Lo;0;L;;;;;N;;;;; +16F03;MIAO LETTER PLA;Lo;0;L;;;;;N;;;;; +16F04;MIAO LETTER MA;Lo;0;L;;;;;N;;;;; +16F05;MIAO LETTER MHA;Lo;0;L;;;;;N;;;;; +16F06;MIAO LETTER ARCHAIC MA;Lo;0;L;;;;;N;;;;; +16F07;MIAO LETTER FA;Lo;0;L;;;;;N;;;;; +16F08;MIAO LETTER VA;Lo;0;L;;;;;N;;;;; +16F09;MIAO LETTER VFA;Lo;0;L;;;;;N;;;;; +16F0A;MIAO LETTER TA;Lo;0;L;;;;;N;;;;; +16F0B;MIAO LETTER DA;Lo;0;L;;;;;N;;;;; +16F0C;MIAO LETTER YI TTA;Lo;0;L;;;;;N;;;;; +16F0D;MIAO LETTER YI TA;Lo;0;L;;;;;N;;;;; +16F0E;MIAO LETTER TTA;Lo;0;L;;;;;N;;;;; +16F0F;MIAO LETTER DDA;Lo;0;L;;;;;N;;;;; +16F10;MIAO LETTER NA;Lo;0;L;;;;;N;;;;; +16F11;MIAO LETTER NHA;Lo;0;L;;;;;N;;;;; +16F12;MIAO LETTER YI NNA;Lo;0;L;;;;;N;;;;; +16F13;MIAO LETTER ARCHAIC NA;Lo;0;L;;;;;N;;;;; +16F14;MIAO LETTER NNA;Lo;0;L;;;;;N;;;;; +16F15;MIAO LETTER NNHA;Lo;0;L;;;;;N;;;;; +16F16;MIAO LETTER LA;Lo;0;L;;;;;N;;;;; +16F17;MIAO LETTER LYA;Lo;0;L;;;;;N;;;;; +16F18;MIAO LETTER LHA;Lo;0;L;;;;;N;;;;; +16F19;MIAO LETTER LHYA;Lo;0;L;;;;;N;;;;; +16F1A;MIAO LETTER TLHA;Lo;0;L;;;;;N;;;;; +16F1B;MIAO LETTER DLHA;Lo;0;L;;;;;N;;;;; +16F1C;MIAO LETTER TLHYA;Lo;0;L;;;;;N;;;;; +16F1D;MIAO LETTER DLHYA;Lo;0;L;;;;;N;;;;; +16F1E;MIAO LETTER KA;Lo;0;L;;;;;N;;;;; +16F1F;MIAO LETTER GA;Lo;0;L;;;;;N;;;;; +16F20;MIAO LETTER YI KA;Lo;0;L;;;;;N;;;;; +16F21;MIAO LETTER QA;Lo;0;L;;;;;N;;;;; +16F22;MIAO LETTER QGA;Lo;0;L;;;;;N;;;;; +16F23;MIAO LETTER NGA;Lo;0;L;;;;;N;;;;; +16F24;MIAO LETTER NGHA;Lo;0;L;;;;;N;;;;; +16F25;MIAO LETTER ARCHAIC NGA;Lo;0;L;;;;;N;;;;; +16F26;MIAO LETTER HA;Lo;0;L;;;;;N;;;;; +16F27;MIAO LETTER XA;Lo;0;L;;;;;N;;;;; +16F28;MIAO LETTER GHA;Lo;0;L;;;;;N;;;;; +16F29;MIAO LETTER GHHA;Lo;0;L;;;;;N;;;;; +16F2A;MIAO LETTER TSSA;Lo;0;L;;;;;N;;;;; +16F2B;MIAO LETTER DZZA;Lo;0;L;;;;;N;;;;; +16F2C;MIAO LETTER NYA;Lo;0;L;;;;;N;;;;; +16F2D;MIAO LETTER NYHA;Lo;0;L;;;;;N;;;;; +16F2E;MIAO LETTER TSHA;Lo;0;L;;;;;N;;;;; +16F2F;MIAO LETTER DZHA;Lo;0;L;;;;;N;;;;; +16F30;MIAO LETTER YI TSHA;Lo;0;L;;;;;N;;;;; +16F31;MIAO LETTER YI DZHA;Lo;0;L;;;;;N;;;;; +16F32;MIAO LETTER REFORMED TSHA;Lo;0;L;;;;;N;;;;; +16F33;MIAO LETTER SHA;Lo;0;L;;;;;N;;;;; +16F34;MIAO LETTER SSA;Lo;0;L;;;;;N;;;;; +16F35;MIAO LETTER ZHA;Lo;0;L;;;;;N;;;;; +16F36;MIAO LETTER ZSHA;Lo;0;L;;;;;N;;;;; +16F37;MIAO LETTER TSA;Lo;0;L;;;;;N;;;;; +16F38;MIAO LETTER DZA;Lo;0;L;;;;;N;;;;; +16F39;MIAO LETTER YI TSA;Lo;0;L;;;;;N;;;;; +16F3A;MIAO LETTER SA;Lo;0;L;;;;;N;;;;; +16F3B;MIAO LETTER ZA;Lo;0;L;;;;;N;;;;; +16F3C;MIAO LETTER ZSA;Lo;0;L;;;;;N;;;;; +16F3D;MIAO LETTER ZZA;Lo;0;L;;;;;N;;;;; +16F3E;MIAO LETTER ZZSA;Lo;0;L;;;;;N;;;;; +16F3F;MIAO LETTER ARCHAIC ZZA;Lo;0;L;;;;;N;;;;; +16F40;MIAO LETTER ZZYA;Lo;0;L;;;;;N;;;;; +16F41;MIAO LETTER ZZSYA;Lo;0;L;;;;;N;;;;; +16F42;MIAO LETTER WA;Lo;0;L;;;;;N;;;;; +16F43;MIAO LETTER AH;Lo;0;L;;;;;N;;;;; +16F44;MIAO LETTER HHA;Lo;0;L;;;;;N;;;;; +16F50;MIAO LETTER NASALIZATION;Lo;0;L;;;;;N;;;;; +16F51;MIAO SIGN ASPIRATION;Mc;0;L;;;;;N;;;;; +16F52;MIAO SIGN REFORMED VOICING;Mc;0;L;;;;;N;;;;; +16F53;MIAO SIGN REFORMED ASPIRATION;Mc;0;L;;;;;N;;;;; +16F54;MIAO VOWEL SIGN A;Mc;0;L;;;;;N;;;;; +16F55;MIAO VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +16F56;MIAO VOWEL SIGN AHH;Mc;0;L;;;;;N;;;;; +16F57;MIAO VOWEL SIGN AN;Mc;0;L;;;;;N;;;;; +16F58;MIAO VOWEL SIGN ANG;Mc;0;L;;;;;N;;;;; +16F59;MIAO VOWEL SIGN O;Mc;0;L;;;;;N;;;;; +16F5A;MIAO VOWEL SIGN OO;Mc;0;L;;;;;N;;;;; +16F5B;MIAO VOWEL SIGN WO;Mc;0;L;;;;;N;;;;; +16F5C;MIAO VOWEL SIGN W;Mc;0;L;;;;;N;;;;; +16F5D;MIAO VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +16F5E;MIAO VOWEL SIGN EN;Mc;0;L;;;;;N;;;;; +16F5F;MIAO VOWEL SIGN ENG;Mc;0;L;;;;;N;;;;; +16F60;MIAO VOWEL SIGN OEY;Mc;0;L;;;;;N;;;;; +16F61;MIAO VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +16F62;MIAO VOWEL SIGN IA;Mc;0;L;;;;;N;;;;; +16F63;MIAO VOWEL SIGN IAN;Mc;0;L;;;;;N;;;;; +16F64;MIAO VOWEL SIGN IANG;Mc;0;L;;;;;N;;;;; +16F65;MIAO VOWEL SIGN IO;Mc;0;L;;;;;N;;;;; +16F66;MIAO VOWEL SIGN IE;Mc;0;L;;;;;N;;;;; +16F67;MIAO VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +16F68;MIAO VOWEL SIGN IU;Mc;0;L;;;;;N;;;;; +16F69;MIAO VOWEL SIGN ING;Mc;0;L;;;;;N;;;;; +16F6A;MIAO VOWEL SIGN U;Mc;0;L;;;;;N;;;;; +16F6B;MIAO VOWEL SIGN UA;Mc;0;L;;;;;N;;;;; +16F6C;MIAO VOWEL SIGN UAN;Mc;0;L;;;;;N;;;;; +16F6D;MIAO VOWEL SIGN UANG;Mc;0;L;;;;;N;;;;; +16F6E;MIAO VOWEL SIGN UU;Mc;0;L;;;;;N;;;;; +16F6F;MIAO VOWEL SIGN UEI;Mc;0;L;;;;;N;;;;; +16F70;MIAO VOWEL SIGN UNG;Mc;0;L;;;;;N;;;;; +16F71;MIAO VOWEL SIGN Y;Mc;0;L;;;;;N;;;;; +16F72;MIAO VOWEL SIGN YI;Mc;0;L;;;;;N;;;;; +16F73;MIAO VOWEL SIGN AE;Mc;0;L;;;;;N;;;;; +16F74;MIAO VOWEL SIGN AEE;Mc;0;L;;;;;N;;;;; +16F75;MIAO VOWEL SIGN ERR;Mc;0;L;;;;;N;;;;; +16F76;MIAO VOWEL SIGN ROUNDED ERR;Mc;0;L;;;;;N;;;;; +16F77;MIAO VOWEL SIGN ER;Mc;0;L;;;;;N;;;;; +16F78;MIAO VOWEL SIGN ROUNDED ER;Mc;0;L;;;;;N;;;;; +16F79;MIAO VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; +16F7A;MIAO VOWEL SIGN EI;Mc;0;L;;;;;N;;;;; +16F7B;MIAO VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; +16F7C;MIAO VOWEL SIGN OU;Mc;0;L;;;;;N;;;;; +16F7D;MIAO VOWEL SIGN N;Mc;0;L;;;;;N;;;;; +16F7E;MIAO VOWEL SIGN NG;Mc;0;L;;;;;N;;;;; +16F8F;MIAO TONE RIGHT;Mn;0;NSM;;;;;N;;;;; +16F90;MIAO TONE TOP RIGHT;Mn;0;NSM;;;;;N;;;;; +16F91;MIAO TONE ABOVE;Mn;0;NSM;;;;;N;;;;; +16F92;MIAO TONE BELOW;Mn;0;NSM;;;;;N;;;;; +16F93;MIAO LETTER TONE-2;Lm;0;L;;;;;N;;;;; +16F94;MIAO LETTER TONE-3;Lm;0;L;;;;;N;;;;; +16F95;MIAO LETTER TONE-4;Lm;0;L;;;;;N;;;;; +16F96;MIAO LETTER TONE-5;Lm;0;L;;;;;N;;;;; +16F97;MIAO LETTER TONE-6;Lm;0;L;;;;;N;;;;; +16F98;MIAO LETTER TONE-7;Lm;0;L;;;;;N;;;;; +16F99;MIAO LETTER TONE-8;Lm;0;L;;;;;N;;;;; +16F9A;MIAO LETTER REFORMED TONE-1;Lm;0;L;;;;;N;;;;; +16F9B;MIAO LETTER REFORMED TONE-2;Lm;0;L;;;;;N;;;;; +16F9C;MIAO LETTER REFORMED TONE-4;Lm;0;L;;;;;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;;;;; +16FE1;NUSHU ITERATION MARK;Lm;0;L;;;;;N;;;;; +17000;<Tangut Ideograph, First>;Lo;0;L;;;;;N;;;;; +187F1;<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;;;;; +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;;;;; +1BC03;DUPLOYAN LETTER T;Lo;0;L;;;;;N;;;;; +1BC04;DUPLOYAN LETTER F;Lo;0;L;;;;;N;;;;; +1BC05;DUPLOYAN LETTER K;Lo;0;L;;;;;N;;;;; +1BC06;DUPLOYAN LETTER L;Lo;0;L;;;;;N;;;;; +1BC07;DUPLOYAN LETTER B;Lo;0;L;;;;;N;;;;; +1BC08;DUPLOYAN LETTER D;Lo;0;L;;;;;N;;;;; +1BC09;DUPLOYAN LETTER V;Lo;0;L;;;;;N;;;;; +1BC0A;DUPLOYAN LETTER G;Lo;0;L;;;;;N;;;;; +1BC0B;DUPLOYAN LETTER R;Lo;0;L;;;;;N;;;;; +1BC0C;DUPLOYAN LETTER P N;Lo;0;L;;;;;N;;;;; +1BC0D;DUPLOYAN LETTER D S;Lo;0;L;;;;;N;;;;; +1BC0E;DUPLOYAN LETTER F N;Lo;0;L;;;;;N;;;;; +1BC0F;DUPLOYAN LETTER K M;Lo;0;L;;;;;N;;;;; +1BC10;DUPLOYAN LETTER R S;Lo;0;L;;;;;N;;;;; +1BC11;DUPLOYAN LETTER TH;Lo;0;L;;;;;N;;;;; +1BC12;DUPLOYAN LETTER SLOAN DH;Lo;0;L;;;;;N;;;;; +1BC13;DUPLOYAN LETTER DH;Lo;0;L;;;;;N;;;;; +1BC14;DUPLOYAN LETTER KK;Lo;0;L;;;;;N;;;;; +1BC15;DUPLOYAN LETTER SLOAN J;Lo;0;L;;;;;N;;;;; +1BC16;DUPLOYAN LETTER HL;Lo;0;L;;;;;N;;;;; +1BC17;DUPLOYAN LETTER LH;Lo;0;L;;;;;N;;;;; +1BC18;DUPLOYAN LETTER RH;Lo;0;L;;;;;N;;;;; +1BC19;DUPLOYAN LETTER M;Lo;0;L;;;;;N;;;;; +1BC1A;DUPLOYAN LETTER N;Lo;0;L;;;;;N;;;;; +1BC1B;DUPLOYAN LETTER J;Lo;0;L;;;;;N;;;;; +1BC1C;DUPLOYAN LETTER S;Lo;0;L;;;;;N;;;;; +1BC1D;DUPLOYAN LETTER M N;Lo;0;L;;;;;N;;;;; +1BC1E;DUPLOYAN LETTER N M;Lo;0;L;;;;;N;;;;; +1BC1F;DUPLOYAN LETTER J M;Lo;0;L;;;;;N;;;;; +1BC20;DUPLOYAN LETTER S J;Lo;0;L;;;;;N;;;;; +1BC21;DUPLOYAN LETTER M WITH DOT;Lo;0;L;;;;;N;;;;; +1BC22;DUPLOYAN LETTER N WITH DOT;Lo;0;L;;;;;N;;;;; +1BC23;DUPLOYAN LETTER J WITH DOT;Lo;0;L;;;;;N;;;;; +1BC24;DUPLOYAN LETTER J WITH DOTS INSIDE AND ABOVE;Lo;0;L;;;;;N;;;;; +1BC25;DUPLOYAN LETTER S WITH DOT;Lo;0;L;;;;;N;;;;; +1BC26;DUPLOYAN LETTER S WITH DOT BELOW;Lo;0;L;;;;;N;;;;; +1BC27;DUPLOYAN LETTER M S;Lo;0;L;;;;;N;;;;; +1BC28;DUPLOYAN LETTER N S;Lo;0;L;;;;;N;;;;; +1BC29;DUPLOYAN LETTER J S;Lo;0;L;;;;;N;;;;; +1BC2A;DUPLOYAN LETTER S S;Lo;0;L;;;;;N;;;;; +1BC2B;DUPLOYAN LETTER M N S;Lo;0;L;;;;;N;;;;; +1BC2C;DUPLOYAN LETTER N M S;Lo;0;L;;;;;N;;;;; +1BC2D;DUPLOYAN LETTER J M S;Lo;0;L;;;;;N;;;;; +1BC2E;DUPLOYAN LETTER S J S;Lo;0;L;;;;;N;;;;; +1BC2F;DUPLOYAN LETTER J S WITH DOT;Lo;0;L;;;;;N;;;;; +1BC30;DUPLOYAN LETTER J N;Lo;0;L;;;;;N;;;;; +1BC31;DUPLOYAN LETTER J N S;Lo;0;L;;;;;N;;;;; +1BC32;DUPLOYAN LETTER S T;Lo;0;L;;;;;N;;;;; +1BC33;DUPLOYAN LETTER S T R;Lo;0;L;;;;;N;;;;; +1BC34;DUPLOYAN LETTER S P;Lo;0;L;;;;;N;;;;; +1BC35;DUPLOYAN LETTER S P R;Lo;0;L;;;;;N;;;;; +1BC36;DUPLOYAN LETTER T S;Lo;0;L;;;;;N;;;;; +1BC37;DUPLOYAN LETTER T R S;Lo;0;L;;;;;N;;;;; +1BC38;DUPLOYAN LETTER W;Lo;0;L;;;;;N;;;;; +1BC39;DUPLOYAN LETTER WH;Lo;0;L;;;;;N;;;;; +1BC3A;DUPLOYAN LETTER W R;Lo;0;L;;;;;N;;;;; +1BC3B;DUPLOYAN LETTER S N;Lo;0;L;;;;;N;;;;; +1BC3C;DUPLOYAN LETTER S M;Lo;0;L;;;;;N;;;;; +1BC3D;DUPLOYAN LETTER K R S;Lo;0;L;;;;;N;;;;; +1BC3E;DUPLOYAN LETTER G R S;Lo;0;L;;;;;N;;;;; +1BC3F;DUPLOYAN LETTER S K;Lo;0;L;;;;;N;;;;; +1BC40;DUPLOYAN LETTER S K R;Lo;0;L;;;;;N;;;;; +1BC41;DUPLOYAN LETTER A;Lo;0;L;;;;;N;;;;; +1BC42;DUPLOYAN LETTER SLOAN OW;Lo;0;L;;;;;N;;;;; +1BC43;DUPLOYAN LETTER OA;Lo;0;L;;;;;N;;;;; +1BC44;DUPLOYAN LETTER O;Lo;0;L;;;;;N;;;;; +1BC45;DUPLOYAN LETTER AOU;Lo;0;L;;;;;N;;;;; +1BC46;DUPLOYAN LETTER I;Lo;0;L;;;;;N;;;;; +1BC47;DUPLOYAN LETTER E;Lo;0;L;;;;;N;;;;; +1BC48;DUPLOYAN LETTER IE;Lo;0;L;;;;;N;;;;; +1BC49;DUPLOYAN LETTER SHORT I;Lo;0;L;;;;;N;;;;; +1BC4A;DUPLOYAN LETTER UI;Lo;0;L;;;;;N;;;;; +1BC4B;DUPLOYAN LETTER EE;Lo;0;L;;;;;N;;;;; +1BC4C;DUPLOYAN LETTER SLOAN EH;Lo;0;L;;;;;N;;;;; +1BC4D;DUPLOYAN LETTER ROMANIAN I;Lo;0;L;;;;;N;;;;; +1BC4E;DUPLOYAN LETTER SLOAN EE;Lo;0;L;;;;;N;;;;; +1BC4F;DUPLOYAN LETTER LONG I;Lo;0;L;;;;;N;;;;; +1BC50;DUPLOYAN LETTER YE;Lo;0;L;;;;;N;;;;; +1BC51;DUPLOYAN LETTER U;Lo;0;L;;;;;N;;;;; +1BC52;DUPLOYAN LETTER EU;Lo;0;L;;;;;N;;;;; +1BC53;DUPLOYAN LETTER XW;Lo;0;L;;;;;N;;;;; +1BC54;DUPLOYAN LETTER U N;Lo;0;L;;;;;N;;;;; +1BC55;DUPLOYAN LETTER LONG U;Lo;0;L;;;;;N;;;;; +1BC56;DUPLOYAN LETTER ROMANIAN U;Lo;0;L;;;;;N;;;;; +1BC57;DUPLOYAN LETTER UH;Lo;0;L;;;;;N;;;;; +1BC58;DUPLOYAN LETTER SLOAN U;Lo;0;L;;;;;N;;;;; +1BC59;DUPLOYAN LETTER OOH;Lo;0;L;;;;;N;;;;; +1BC5A;DUPLOYAN LETTER OW;Lo;0;L;;;;;N;;;;; +1BC5B;DUPLOYAN LETTER OU;Lo;0;L;;;;;N;;;;; +1BC5C;DUPLOYAN LETTER WA;Lo;0;L;;;;;N;;;;; +1BC5D;DUPLOYAN LETTER WO;Lo;0;L;;;;;N;;;;; +1BC5E;DUPLOYAN LETTER WI;Lo;0;L;;;;;N;;;;; +1BC5F;DUPLOYAN LETTER WEI;Lo;0;L;;;;;N;;;;; +1BC60;DUPLOYAN LETTER WOW;Lo;0;L;;;;;N;;;;; +1BC61;DUPLOYAN LETTER NASAL U;Lo;0;L;;;;;N;;;;; +1BC62;DUPLOYAN LETTER NASAL O;Lo;0;L;;;;;N;;;;; +1BC63;DUPLOYAN LETTER NASAL I;Lo;0;L;;;;;N;;;;; +1BC64;DUPLOYAN LETTER NASAL A;Lo;0;L;;;;;N;;;;; +1BC65;DUPLOYAN LETTER PERNIN AN;Lo;0;L;;;;;N;;;;; +1BC66;DUPLOYAN LETTER PERNIN AM;Lo;0;L;;;;;N;;;;; +1BC67;DUPLOYAN LETTER SLOAN EN;Lo;0;L;;;;;N;;;;; +1BC68;DUPLOYAN LETTER SLOAN AN;Lo;0;L;;;;;N;;;;; +1BC69;DUPLOYAN LETTER SLOAN ON;Lo;0;L;;;;;N;;;;; +1BC6A;DUPLOYAN LETTER VOCALIC M;Lo;0;L;;;;;N;;;;; +1BC70;DUPLOYAN AFFIX LEFT HORIZONTAL SECANT;Lo;0;L;;;;;N;;;;; +1BC71;DUPLOYAN AFFIX MID HORIZONTAL SECANT;Lo;0;L;;;;;N;;;;; +1BC72;DUPLOYAN AFFIX RIGHT HORIZONTAL SECANT;Lo;0;L;;;;;N;;;;; +1BC73;DUPLOYAN AFFIX LOW VERTICAL SECANT;Lo;0;L;;;;;N;;;;; +1BC74;DUPLOYAN AFFIX MID VERTICAL SECANT;Lo;0;L;;;;;N;;;;; +1BC75;DUPLOYAN AFFIX HIGH VERTICAL SECANT;Lo;0;L;;;;;N;;;;; +1BC76;DUPLOYAN AFFIX ATTACHED SECANT;Lo;0;L;;;;;N;;;;; +1BC77;DUPLOYAN AFFIX ATTACHED LEFT-TO-RIGHT SECANT;Lo;0;L;;;;;N;;;;; +1BC78;DUPLOYAN AFFIX ATTACHED TANGENT;Lo;0;L;;;;;N;;;;; +1BC79;DUPLOYAN AFFIX ATTACHED TAIL;Lo;0;L;;;;;N;;;;; +1BC7A;DUPLOYAN AFFIX ATTACHED E HOOK;Lo;0;L;;;;;N;;;;; +1BC7B;DUPLOYAN AFFIX ATTACHED I HOOK;Lo;0;L;;;;;N;;;;; +1BC7C;DUPLOYAN AFFIX ATTACHED TANGENT HOOK;Lo;0;L;;;;;N;;;;; +1BC80;DUPLOYAN AFFIX HIGH ACUTE;Lo;0;L;;;;;N;;;;; +1BC81;DUPLOYAN AFFIX HIGH TIGHT ACUTE;Lo;0;L;;;;;N;;;;; +1BC82;DUPLOYAN AFFIX HIGH GRAVE;Lo;0;L;;;;;N;;;;; +1BC83;DUPLOYAN AFFIX HIGH LONG GRAVE;Lo;0;L;;;;;N;;;;; +1BC84;DUPLOYAN AFFIX HIGH DOT;Lo;0;L;;;;;N;;;;; +1BC85;DUPLOYAN AFFIX HIGH CIRCLE;Lo;0;L;;;;;N;;;;; +1BC86;DUPLOYAN AFFIX HIGH LINE;Lo;0;L;;;;;N;;;;; +1BC87;DUPLOYAN AFFIX HIGH WAVE;Lo;0;L;;;;;N;;;;; +1BC88;DUPLOYAN AFFIX HIGH VERTICAL;Lo;0;L;;;;;N;;;;; +1BC90;DUPLOYAN AFFIX LOW ACUTE;Lo;0;L;;;;;N;;;;; +1BC91;DUPLOYAN AFFIX LOW TIGHT ACUTE;Lo;0;L;;;;;N;;;;; +1BC92;DUPLOYAN AFFIX LOW GRAVE;Lo;0;L;;;;;N;;;;; +1BC93;DUPLOYAN AFFIX LOW LONG GRAVE;Lo;0;L;;;;;N;;;;; +1BC94;DUPLOYAN AFFIX LOW DOT;Lo;0;L;;;;;N;;;;; +1BC95;DUPLOYAN AFFIX LOW CIRCLE;Lo;0;L;;;;;N;;;;; +1BC96;DUPLOYAN AFFIX LOW LINE;Lo;0;L;;;;;N;;;;; +1BC97;DUPLOYAN AFFIX LOW WAVE;Lo;0;L;;;;;N;;;;; +1BC98;DUPLOYAN AFFIX LOW VERTICAL;Lo;0;L;;;;;N;;;;; +1BC99;DUPLOYAN AFFIX LOW ARROW;Lo;0;L;;;;;N;;;;; +1BC9C;DUPLOYAN SIGN O WITH CROSS;So;0;L;;;;;N;;;;; +1BC9D;DUPLOYAN THICK LETTER SELECTOR;Mn;0;NSM;;;;;N;;;;; +1BC9E;DUPLOYAN DOUBLE MARK;Mn;1;NSM;;;;;N;;;;; +1BC9F;DUPLOYAN PUNCTUATION CHINOOK FULL STOP;Po;0;L;;;;;N;;;;; +1BCA0;SHORTHAND FORMAT LETTER OVERLAP;Cf;0;BN;;;;;N;;;;; +1BCA1;SHORTHAND FORMAT CONTINUING OVERLAP;Cf;0;BN;;;;;N;;;;; +1BCA2;SHORTHAND FORMAT DOWN STEP;Cf;0;BN;;;;;N;;;;; +1BCA3;SHORTHAND FORMAT UP STEP;Cf;0;BN;;;;;N;;;;; +1D000;BYZANTINE MUSICAL SYMBOL PSILI;So;0;L;;;;;N;;;;; +1D001;BYZANTINE MUSICAL SYMBOL DASEIA;So;0;L;;;;;N;;;;; +1D002;BYZANTINE MUSICAL SYMBOL PERISPOMENI;So;0;L;;;;;N;;;;; +1D003;BYZANTINE MUSICAL SYMBOL OXEIA EKFONITIKON;So;0;L;;;;;N;;;;; +1D004;BYZANTINE MUSICAL SYMBOL OXEIA DIPLI;So;0;L;;;;;N;;;;; +1D005;BYZANTINE MUSICAL SYMBOL VAREIA EKFONITIKON;So;0;L;;;;;N;;;;; +1D006;BYZANTINE MUSICAL SYMBOL VAREIA DIPLI;So;0;L;;;;;N;;;;; +1D007;BYZANTINE MUSICAL SYMBOL KATHISTI;So;0;L;;;;;N;;;;; +1D008;BYZANTINE MUSICAL SYMBOL SYRMATIKI;So;0;L;;;;;N;;;;; +1D009;BYZANTINE MUSICAL SYMBOL PARAKLITIKI;So;0;L;;;;;N;;;;; +1D00A;BYZANTINE MUSICAL SYMBOL YPOKRISIS;So;0;L;;;;;N;;;;; +1D00B;BYZANTINE MUSICAL SYMBOL YPOKRISIS DIPLI;So;0;L;;;;;N;;;;; +1D00C;BYZANTINE MUSICAL SYMBOL KREMASTI;So;0;L;;;;;N;;;;; +1D00D;BYZANTINE MUSICAL SYMBOL APESO EKFONITIKON;So;0;L;;;;;N;;;;; +1D00E;BYZANTINE MUSICAL SYMBOL EXO EKFONITIKON;So;0;L;;;;;N;;;;; +1D00F;BYZANTINE MUSICAL SYMBOL TELEIA;So;0;L;;;;;N;;;;; +1D010;BYZANTINE MUSICAL SYMBOL KENTIMATA;So;0;L;;;;;N;;;;; +1D011;BYZANTINE MUSICAL SYMBOL APOSTROFOS;So;0;L;;;;;N;;;;; +1D012;BYZANTINE MUSICAL SYMBOL APOSTROFOS DIPLI;So;0;L;;;;;N;;;;; +1D013;BYZANTINE MUSICAL SYMBOL SYNEVMA;So;0;L;;;;;N;;;;; +1D014;BYZANTINE MUSICAL SYMBOL THITA;So;0;L;;;;;N;;;;; +1D015;BYZANTINE MUSICAL SYMBOL OLIGON ARCHAION;So;0;L;;;;;N;;;;; +1D016;BYZANTINE MUSICAL SYMBOL GORGON ARCHAION;So;0;L;;;;;N;;;;; +1D017;BYZANTINE MUSICAL SYMBOL PSILON;So;0;L;;;;;N;;;;; +1D018;BYZANTINE MUSICAL SYMBOL CHAMILON;So;0;L;;;;;N;;;;; +1D019;BYZANTINE MUSICAL SYMBOL VATHY;So;0;L;;;;;N;;;;; +1D01A;BYZANTINE MUSICAL SYMBOL ISON ARCHAION;So;0;L;;;;;N;;;;; +1D01B;BYZANTINE MUSICAL SYMBOL KENTIMA ARCHAION;So;0;L;;;;;N;;;;; +1D01C;BYZANTINE MUSICAL SYMBOL KENTIMATA ARCHAION;So;0;L;;;;;N;;;;; +1D01D;BYZANTINE MUSICAL SYMBOL SAXIMATA;So;0;L;;;;;N;;;;; +1D01E;BYZANTINE MUSICAL SYMBOL PARICHON;So;0;L;;;;;N;;;;; +1D01F;BYZANTINE MUSICAL SYMBOL STAVROS APODEXIA;So;0;L;;;;;N;;;;; +1D020;BYZANTINE MUSICAL SYMBOL OXEIAI ARCHAION;So;0;L;;;;;N;;;;; +1D021;BYZANTINE MUSICAL SYMBOL VAREIAI ARCHAION;So;0;L;;;;;N;;;;; +1D022;BYZANTINE MUSICAL SYMBOL APODERMA ARCHAION;So;0;L;;;;;N;;;;; +1D023;BYZANTINE MUSICAL SYMBOL APOTHEMA;So;0;L;;;;;N;;;;; +1D024;BYZANTINE MUSICAL SYMBOL KLASMA;So;0;L;;;;;N;;;;; +1D025;BYZANTINE MUSICAL SYMBOL REVMA;So;0;L;;;;;N;;;;; +1D026;BYZANTINE MUSICAL SYMBOL PIASMA ARCHAION;So;0;L;;;;;N;;;;; +1D027;BYZANTINE MUSICAL SYMBOL TINAGMA;So;0;L;;;;;N;;;;; +1D028;BYZANTINE MUSICAL SYMBOL ANATRICHISMA;So;0;L;;;;;N;;;;; +1D029;BYZANTINE MUSICAL SYMBOL SEISMA;So;0;L;;;;;N;;;;; +1D02A;BYZANTINE MUSICAL SYMBOL SYNAGMA ARCHAION;So;0;L;;;;;N;;;;; +1D02B;BYZANTINE MUSICAL SYMBOL SYNAGMA META STAVROU;So;0;L;;;;;N;;;;; +1D02C;BYZANTINE MUSICAL SYMBOL OYRANISMA ARCHAION;So;0;L;;;;;N;;;;; +1D02D;BYZANTINE MUSICAL SYMBOL THEMA;So;0;L;;;;;N;;;;; +1D02E;BYZANTINE MUSICAL SYMBOL LEMOI;So;0;L;;;;;N;;;;; +1D02F;BYZANTINE MUSICAL SYMBOL DYO;So;0;L;;;;;N;;;;; +1D030;BYZANTINE MUSICAL SYMBOL TRIA;So;0;L;;;;;N;;;;; +1D031;BYZANTINE MUSICAL SYMBOL TESSERA;So;0;L;;;;;N;;;;; +1D032;BYZANTINE MUSICAL SYMBOL KRATIMATA;So;0;L;;;;;N;;;;; +1D033;BYZANTINE MUSICAL SYMBOL APESO EXO NEO;So;0;L;;;;;N;;;;; +1D034;BYZANTINE MUSICAL SYMBOL FTHORA ARCHAION;So;0;L;;;;;N;;;;; +1D035;BYZANTINE MUSICAL SYMBOL IMIFTHORA;So;0;L;;;;;N;;;;; +1D036;BYZANTINE MUSICAL SYMBOL TROMIKON ARCHAION;So;0;L;;;;;N;;;;; +1D037;BYZANTINE MUSICAL SYMBOL KATAVA TROMIKON;So;0;L;;;;;N;;;;; +1D038;BYZANTINE MUSICAL SYMBOL PELASTON;So;0;L;;;;;N;;;;; +1D039;BYZANTINE MUSICAL SYMBOL PSIFISTON;So;0;L;;;;;N;;;;; +1D03A;BYZANTINE MUSICAL SYMBOL KONTEVMA;So;0;L;;;;;N;;;;; +1D03B;BYZANTINE MUSICAL SYMBOL CHOREVMA ARCHAION;So;0;L;;;;;N;;;;; +1D03C;BYZANTINE MUSICAL SYMBOL RAPISMA;So;0;L;;;;;N;;;;; +1D03D;BYZANTINE MUSICAL SYMBOL PARAKALESMA ARCHAION;So;0;L;;;;;N;;;;; +1D03E;BYZANTINE MUSICAL SYMBOL PARAKLITIKI ARCHAION;So;0;L;;;;;N;;;;; +1D03F;BYZANTINE MUSICAL SYMBOL ICHADIN;So;0;L;;;;;N;;;;; +1D040;BYZANTINE MUSICAL SYMBOL NANA;So;0;L;;;;;N;;;;; +1D041;BYZANTINE MUSICAL SYMBOL PETASMA;So;0;L;;;;;N;;;;; +1D042;BYZANTINE MUSICAL SYMBOL KONTEVMA ALLO;So;0;L;;;;;N;;;;; +1D043;BYZANTINE MUSICAL SYMBOL TROMIKON ALLO;So;0;L;;;;;N;;;;; +1D044;BYZANTINE MUSICAL SYMBOL STRAGGISMATA;So;0;L;;;;;N;;;;; +1D045;BYZANTINE MUSICAL SYMBOL GRONTHISMATA;So;0;L;;;;;N;;;;; +1D046;BYZANTINE MUSICAL SYMBOL ISON NEO;So;0;L;;;;;N;;;;; +1D047;BYZANTINE MUSICAL SYMBOL OLIGON NEO;So;0;L;;;;;N;;;;; +1D048;BYZANTINE MUSICAL SYMBOL OXEIA NEO;So;0;L;;;;;N;;;;; +1D049;BYZANTINE MUSICAL SYMBOL PETASTI;So;0;L;;;;;N;;;;; +1D04A;BYZANTINE MUSICAL SYMBOL KOUFISMA;So;0;L;;;;;N;;;;; +1D04B;BYZANTINE MUSICAL SYMBOL PETASTOKOUFISMA;So;0;L;;;;;N;;;;; +1D04C;BYZANTINE MUSICAL SYMBOL KRATIMOKOUFISMA;So;0;L;;;;;N;;;;; +1D04D;BYZANTINE MUSICAL SYMBOL PELASTON NEO;So;0;L;;;;;N;;;;; +1D04E;BYZANTINE MUSICAL SYMBOL KENTIMATA NEO ANO;So;0;L;;;;;N;;;;; +1D04F;BYZANTINE MUSICAL SYMBOL KENTIMA NEO ANO;So;0;L;;;;;N;;;;; +1D050;BYZANTINE MUSICAL SYMBOL YPSILI;So;0;L;;;;;N;;;;; +1D051;BYZANTINE MUSICAL SYMBOL APOSTROFOS NEO;So;0;L;;;;;N;;;;; +1D052;BYZANTINE MUSICAL SYMBOL APOSTROFOI SYNDESMOS NEO;So;0;L;;;;;N;;;;; +1D053;BYZANTINE MUSICAL SYMBOL YPORROI;So;0;L;;;;;N;;;;; +1D054;BYZANTINE MUSICAL SYMBOL KRATIMOYPORROON;So;0;L;;;;;N;;;;; +1D055;BYZANTINE MUSICAL SYMBOL ELAFRON;So;0;L;;;;;N;;;;; +1D056;BYZANTINE MUSICAL SYMBOL CHAMILI;So;0;L;;;;;N;;;;; +1D057;BYZANTINE MUSICAL SYMBOL MIKRON ISON;So;0;L;;;;;N;;;;; +1D058;BYZANTINE MUSICAL SYMBOL VAREIA NEO;So;0;L;;;;;N;;;;; +1D059;BYZANTINE MUSICAL SYMBOL PIASMA NEO;So;0;L;;;;;N;;;;; +1D05A;BYZANTINE MUSICAL SYMBOL PSIFISTON NEO;So;0;L;;;;;N;;;;; +1D05B;BYZANTINE MUSICAL SYMBOL OMALON;So;0;L;;;;;N;;;;; +1D05C;BYZANTINE MUSICAL SYMBOL ANTIKENOMA;So;0;L;;;;;N;;;;; +1D05D;BYZANTINE MUSICAL SYMBOL LYGISMA;So;0;L;;;;;N;;;;; +1D05E;BYZANTINE MUSICAL SYMBOL PARAKLITIKI NEO;So;0;L;;;;;N;;;;; +1D05F;BYZANTINE MUSICAL SYMBOL PARAKALESMA NEO;So;0;L;;;;;N;;;;; +1D060;BYZANTINE MUSICAL SYMBOL ETERON PARAKALESMA;So;0;L;;;;;N;;;;; +1D061;BYZANTINE MUSICAL SYMBOL KYLISMA;So;0;L;;;;;N;;;;; +1D062;BYZANTINE MUSICAL SYMBOL ANTIKENOKYLISMA;So;0;L;;;;;N;;;;; +1D063;BYZANTINE MUSICAL SYMBOL TROMIKON NEO;So;0;L;;;;;N;;;;; +1D064;BYZANTINE MUSICAL SYMBOL EKSTREPTON;So;0;L;;;;;N;;;;; +1D065;BYZANTINE MUSICAL SYMBOL SYNAGMA NEO;So;0;L;;;;;N;;;;; +1D066;BYZANTINE MUSICAL SYMBOL SYRMA;So;0;L;;;;;N;;;;; +1D067;BYZANTINE MUSICAL SYMBOL CHOREVMA NEO;So;0;L;;;;;N;;;;; +1D068;BYZANTINE MUSICAL SYMBOL EPEGERMA;So;0;L;;;;;N;;;;; +1D069;BYZANTINE MUSICAL SYMBOL SEISMA NEO;So;0;L;;;;;N;;;;; +1D06A;BYZANTINE MUSICAL SYMBOL XIRON KLASMA;So;0;L;;;;;N;;;;; +1D06B;BYZANTINE MUSICAL SYMBOL TROMIKOPSIFISTON;So;0;L;;;;;N;;;;; +1D06C;BYZANTINE MUSICAL SYMBOL PSIFISTOLYGISMA;So;0;L;;;;;N;;;;; +1D06D;BYZANTINE MUSICAL SYMBOL TROMIKOLYGISMA;So;0;L;;;;;N;;;;; +1D06E;BYZANTINE MUSICAL SYMBOL TROMIKOPARAKALESMA;So;0;L;;;;;N;;;;; +1D06F;BYZANTINE MUSICAL SYMBOL PSIFISTOPARAKALESMA;So;0;L;;;;;N;;;;; +1D070;BYZANTINE MUSICAL SYMBOL TROMIKOSYNAGMA;So;0;L;;;;;N;;;;; +1D071;BYZANTINE MUSICAL SYMBOL PSIFISTOSYNAGMA;So;0;L;;;;;N;;;;; +1D072;BYZANTINE MUSICAL SYMBOL GORGOSYNTHETON;So;0;L;;;;;N;;;;; +1D073;BYZANTINE MUSICAL SYMBOL ARGOSYNTHETON;So;0;L;;;;;N;;;;; +1D074;BYZANTINE MUSICAL SYMBOL ETERON ARGOSYNTHETON;So;0;L;;;;;N;;;;; +1D075;BYZANTINE MUSICAL SYMBOL OYRANISMA NEO;So;0;L;;;;;N;;;;; +1D076;BYZANTINE MUSICAL SYMBOL THEMATISMOS ESO;So;0;L;;;;;N;;;;; +1D077;BYZANTINE MUSICAL SYMBOL THEMATISMOS EXO;So;0;L;;;;;N;;;;; +1D078;BYZANTINE MUSICAL SYMBOL THEMA APLOUN;So;0;L;;;;;N;;;;; +1D079;BYZANTINE MUSICAL SYMBOL THES KAI APOTHES;So;0;L;;;;;N;;;;; +1D07A;BYZANTINE MUSICAL SYMBOL KATAVASMA;So;0;L;;;;;N;;;;; +1D07B;BYZANTINE MUSICAL SYMBOL ENDOFONON;So;0;L;;;;;N;;;;; +1D07C;BYZANTINE MUSICAL SYMBOL YFEN KATO;So;0;L;;;;;N;;;;; +1D07D;BYZANTINE MUSICAL SYMBOL YFEN ANO;So;0;L;;;;;N;;;;; +1D07E;BYZANTINE MUSICAL SYMBOL STAVROS;So;0;L;;;;;N;;;;; +1D07F;BYZANTINE MUSICAL SYMBOL KLASMA ANO;So;0;L;;;;;N;;;;; +1D080;BYZANTINE MUSICAL SYMBOL DIPLI ARCHAION;So;0;L;;;;;N;;;;; +1D081;BYZANTINE MUSICAL SYMBOL KRATIMA ARCHAION;So;0;L;;;;;N;;;;; +1D082;BYZANTINE MUSICAL SYMBOL KRATIMA ALLO;So;0;L;;;;;N;;;;; +1D083;BYZANTINE MUSICAL SYMBOL KRATIMA NEO;So;0;L;;;;;N;;;;; +1D084;BYZANTINE MUSICAL SYMBOL APODERMA NEO;So;0;L;;;;;N;;;;; +1D085;BYZANTINE MUSICAL SYMBOL APLI;So;0;L;;;;;N;;;;; +1D086;BYZANTINE MUSICAL SYMBOL DIPLI;So;0;L;;;;;N;;;;; +1D087;BYZANTINE MUSICAL SYMBOL TRIPLI;So;0;L;;;;;N;;;;; +1D088;BYZANTINE MUSICAL SYMBOL TETRAPLI;So;0;L;;;;;N;;;;; +1D089;BYZANTINE MUSICAL SYMBOL KORONIS;So;0;L;;;;;N;;;;; +1D08A;BYZANTINE MUSICAL SYMBOL LEIMMA ENOS CHRONOU;So;0;L;;;;;N;;;;; +1D08B;BYZANTINE MUSICAL SYMBOL LEIMMA DYO CHRONON;So;0;L;;;;;N;;;;; +1D08C;BYZANTINE MUSICAL SYMBOL LEIMMA TRION CHRONON;So;0;L;;;;;N;;;;; +1D08D;BYZANTINE MUSICAL SYMBOL LEIMMA TESSARON CHRONON;So;0;L;;;;;N;;;;; +1D08E;BYZANTINE MUSICAL SYMBOL LEIMMA IMISEOS CHRONOU;So;0;L;;;;;N;;;;; +1D08F;BYZANTINE MUSICAL SYMBOL GORGON NEO ANO;So;0;L;;;;;N;;;;; +1D090;BYZANTINE MUSICAL SYMBOL GORGON PARESTIGMENON ARISTERA;So;0;L;;;;;N;;;;; +1D091;BYZANTINE MUSICAL SYMBOL GORGON PARESTIGMENON DEXIA;So;0;L;;;;;N;;;;; +1D092;BYZANTINE MUSICAL SYMBOL DIGORGON;So;0;L;;;;;N;;;;; +1D093;BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON ARISTERA KATO;So;0;L;;;;;N;;;;; +1D094;BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON ARISTERA ANO;So;0;L;;;;;N;;;;; +1D095;BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON DEXIA;So;0;L;;;;;N;;;;; +1D096;BYZANTINE MUSICAL SYMBOL TRIGORGON;So;0;L;;;;;N;;;;; +1D097;BYZANTINE MUSICAL SYMBOL ARGON;So;0;L;;;;;N;;;;; +1D098;BYZANTINE MUSICAL SYMBOL IMIDIARGON;So;0;L;;;;;N;;;;; +1D099;BYZANTINE MUSICAL SYMBOL DIARGON;So;0;L;;;;;N;;;;; +1D09A;BYZANTINE MUSICAL SYMBOL AGOGI POLI ARGI;So;0;L;;;;;N;;;;; +1D09B;BYZANTINE MUSICAL SYMBOL AGOGI ARGOTERI;So;0;L;;;;;N;;;;; +1D09C;BYZANTINE MUSICAL SYMBOL AGOGI ARGI;So;0;L;;;;;N;;;;; +1D09D;BYZANTINE MUSICAL SYMBOL AGOGI METRIA;So;0;L;;;;;N;;;;; +1D09E;BYZANTINE MUSICAL SYMBOL AGOGI MESI;So;0;L;;;;;N;;;;; +1D09F;BYZANTINE MUSICAL SYMBOL AGOGI GORGI;So;0;L;;;;;N;;;;; +1D0A0;BYZANTINE MUSICAL SYMBOL AGOGI GORGOTERI;So;0;L;;;;;N;;;;; +1D0A1;BYZANTINE MUSICAL SYMBOL AGOGI POLI GORGI;So;0;L;;;;;N;;;;; +1D0A2;BYZANTINE MUSICAL SYMBOL MARTYRIA PROTOS ICHOS;So;0;L;;;;;N;;;;; +1D0A3;BYZANTINE MUSICAL SYMBOL MARTYRIA ALLI PROTOS ICHOS;So;0;L;;;;;N;;;;; +1D0A4;BYZANTINE MUSICAL SYMBOL MARTYRIA DEYTEROS ICHOS;So;0;L;;;;;N;;;;; +1D0A5;BYZANTINE MUSICAL SYMBOL MARTYRIA ALLI DEYTEROS ICHOS;So;0;L;;;;;N;;;;; +1D0A6;BYZANTINE MUSICAL SYMBOL MARTYRIA TRITOS ICHOS;So;0;L;;;;;N;;;;; +1D0A7;BYZANTINE MUSICAL SYMBOL MARTYRIA TRIFONIAS;So;0;L;;;;;N;;;;; +1D0A8;BYZANTINE MUSICAL SYMBOL MARTYRIA TETARTOS ICHOS;So;0;L;;;;;N;;;;; +1D0A9;BYZANTINE MUSICAL SYMBOL MARTYRIA TETARTOS LEGETOS ICHOS;So;0;L;;;;;N;;;;; +1D0AA;BYZANTINE MUSICAL SYMBOL MARTYRIA LEGETOS ICHOS;So;0;L;;;;;N;;;;; +1D0AB;BYZANTINE MUSICAL SYMBOL MARTYRIA PLAGIOS ICHOS;So;0;L;;;;;N;;;;; +1D0AC;BYZANTINE MUSICAL SYMBOL ISAKIA TELOUS ICHIMATOS;So;0;L;;;;;N;;;;; +1D0AD;BYZANTINE MUSICAL SYMBOL APOSTROFOI TELOUS ICHIMATOS;So;0;L;;;;;N;;;;; +1D0AE;BYZANTINE MUSICAL SYMBOL FANEROSIS TETRAFONIAS;So;0;L;;;;;N;;;;; +1D0AF;BYZANTINE MUSICAL SYMBOL FANEROSIS MONOFONIAS;So;0;L;;;;;N;;;;; +1D0B0;BYZANTINE MUSICAL SYMBOL FANEROSIS DIFONIAS;So;0;L;;;;;N;;;;; +1D0B1;BYZANTINE MUSICAL SYMBOL MARTYRIA VARYS ICHOS;So;0;L;;;;;N;;;;; +1D0B2;BYZANTINE MUSICAL SYMBOL MARTYRIA PROTOVARYS ICHOS;So;0;L;;;;;N;;;;; +1D0B3;BYZANTINE MUSICAL SYMBOL MARTYRIA PLAGIOS TETARTOS ICHOS;So;0;L;;;;;N;;;;; +1D0B4;BYZANTINE MUSICAL SYMBOL GORTHMIKON N APLOUN;So;0;L;;;;;N;;;;; +1D0B5;BYZANTINE MUSICAL SYMBOL GORTHMIKON N DIPLOUN;So;0;L;;;;;N;;;;; +1D0B6;BYZANTINE MUSICAL SYMBOL ENARXIS KAI FTHORA VOU;So;0;L;;;;;N;;;;; +1D0B7;BYZANTINE MUSICAL SYMBOL IMIFONON;So;0;L;;;;;N;;;;; +1D0B8;BYZANTINE MUSICAL SYMBOL IMIFTHORON;So;0;L;;;;;N;;;;; +1D0B9;BYZANTINE MUSICAL SYMBOL FTHORA ARCHAION DEYTEROU ICHOU;So;0;L;;;;;N;;;;; +1D0BA;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI PA;So;0;L;;;;;N;;;;; +1D0BB;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NANA;So;0;L;;;;;N;;;;; +1D0BC;BYZANTINE MUSICAL SYMBOL FTHORA NAOS ICHOS;So;0;L;;;;;N;;;;; +1D0BD;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI DI;So;0;L;;;;;N;;;;; +1D0BE;BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON DIATONON DI;So;0;L;;;;;N;;;;; +1D0BF;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI KE;So;0;L;;;;;N;;;;; +1D0C0;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI ZO;So;0;L;;;;;N;;;;; +1D0C1;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NI KATO;So;0;L;;;;;N;;;;; +1D0C2;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NI ANO;So;0;L;;;;;N;;;;; +1D0C3;BYZANTINE MUSICAL SYMBOL FTHORA MALAKON CHROMA DIFONIAS;So;0;L;;;;;N;;;;; +1D0C4;BYZANTINE MUSICAL SYMBOL FTHORA MALAKON CHROMA MONOFONIAS;So;0;L;;;;;N;;;;; +1D0C5;BYZANTINE MUSICAL SYMBOL FHTORA SKLIRON CHROMA VASIS;So;0;L;;;;;N;;;;; +1D0C6;BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON CHROMA SYNAFI;So;0;L;;;;;N;;;;; +1D0C7;BYZANTINE MUSICAL SYMBOL FTHORA NENANO;So;0;L;;;;;N;;;;; +1D0C8;BYZANTINE MUSICAL SYMBOL CHROA ZYGOS;So;0;L;;;;;N;;;;; +1D0C9;BYZANTINE MUSICAL SYMBOL CHROA KLITON;So;0;L;;;;;N;;;;; +1D0CA;BYZANTINE MUSICAL SYMBOL CHROA SPATHI;So;0;L;;;;;N;;;;; +1D0CB;BYZANTINE MUSICAL SYMBOL FTHORA I YFESIS TETARTIMORION;So;0;L;;;;;N;;;;; +1D0CC;BYZANTINE MUSICAL SYMBOL FTHORA ENARMONIOS ANTIFONIA;So;0;L;;;;;N;;;;; +1D0CD;BYZANTINE MUSICAL SYMBOL YFESIS TRITIMORION;So;0;L;;;;;N;;;;; +1D0CE;BYZANTINE MUSICAL SYMBOL DIESIS TRITIMORION;So;0;L;;;;;N;;;;; +1D0CF;BYZANTINE MUSICAL SYMBOL DIESIS TETARTIMORION;So;0;L;;;;;N;;;;; +1D0D0;BYZANTINE MUSICAL SYMBOL DIESIS APLI DYO DODEKATA;So;0;L;;;;;N;;;;; +1D0D1;BYZANTINE MUSICAL SYMBOL DIESIS MONOGRAMMOS TESSERA DODEKATA;So;0;L;;;;;N;;;;; +1D0D2;BYZANTINE MUSICAL SYMBOL DIESIS DIGRAMMOS EX DODEKATA;So;0;L;;;;;N;;;;; +1D0D3;BYZANTINE MUSICAL SYMBOL DIESIS TRIGRAMMOS OKTO DODEKATA;So;0;L;;;;;N;;;;; +1D0D4;BYZANTINE MUSICAL SYMBOL YFESIS APLI DYO DODEKATA;So;0;L;;;;;N;;;;; +1D0D5;BYZANTINE MUSICAL SYMBOL YFESIS MONOGRAMMOS TESSERA DODEKATA;So;0;L;;;;;N;;;;; +1D0D6;BYZANTINE MUSICAL SYMBOL YFESIS DIGRAMMOS EX DODEKATA;So;0;L;;;;;N;;;;; +1D0D7;BYZANTINE MUSICAL SYMBOL YFESIS TRIGRAMMOS OKTO DODEKATA;So;0;L;;;;;N;;;;; +1D0D8;BYZANTINE MUSICAL SYMBOL GENIKI DIESIS;So;0;L;;;;;N;;;;; +1D0D9;BYZANTINE MUSICAL SYMBOL GENIKI YFESIS;So;0;L;;;;;N;;;;; +1D0DA;BYZANTINE MUSICAL SYMBOL DIASTOLI APLI MIKRI;So;0;L;;;;;N;;;;; +1D0DB;BYZANTINE MUSICAL SYMBOL DIASTOLI APLI MEGALI;So;0;L;;;;;N;;;;; +1D0DC;BYZANTINE MUSICAL SYMBOL DIASTOLI DIPLI;So;0;L;;;;;N;;;;; +1D0DD;BYZANTINE MUSICAL SYMBOL DIASTOLI THESEOS;So;0;L;;;;;N;;;;; +1D0DE;BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS;So;0;L;;;;;N;;;;; +1D0DF;BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS DISIMOU;So;0;L;;;;;N;;;;; +1D0E0;BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS TRISIMOU;So;0;L;;;;;N;;;;; +1D0E1;BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS TETRASIMOU;So;0;L;;;;;N;;;;; +1D0E2;BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS;So;0;L;;;;;N;;;;; +1D0E3;BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS DISIMOU;So;0;L;;;;;N;;;;; +1D0E4;BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS TRISIMOU;So;0;L;;;;;N;;;;; +1D0E5;BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS TETRASIMOU;So;0;L;;;;;N;;;;; +1D0E6;BYZANTINE MUSICAL SYMBOL DIGRAMMA GG;So;0;L;;;;;N;;;;; +1D0E7;BYZANTINE MUSICAL SYMBOL DIFTOGGOS OU;So;0;L;;;;;N;;;;; +1D0E8;BYZANTINE MUSICAL SYMBOL STIGMA;So;0;L;;;;;N;;;;; +1D0E9;BYZANTINE MUSICAL SYMBOL ARKTIKO PA;So;0;L;;;;;N;;;;; +1D0EA;BYZANTINE MUSICAL SYMBOL ARKTIKO VOU;So;0;L;;;;;N;;;;; +1D0EB;BYZANTINE MUSICAL SYMBOL ARKTIKO GA;So;0;L;;;;;N;;;;; +1D0EC;BYZANTINE MUSICAL SYMBOL ARKTIKO DI;So;0;L;;;;;N;;;;; +1D0ED;BYZANTINE MUSICAL SYMBOL ARKTIKO KE;So;0;L;;;;;N;;;;; +1D0EE;BYZANTINE MUSICAL SYMBOL ARKTIKO ZO;So;0;L;;;;;N;;;;; +1D0EF;BYZANTINE MUSICAL SYMBOL ARKTIKO NI;So;0;L;;;;;N;;;;; +1D0F0;BYZANTINE MUSICAL SYMBOL KENTIMATA NEO MESO;So;0;L;;;;;N;;;;; +1D0F1;BYZANTINE MUSICAL SYMBOL KENTIMA NEO MESO;So;0;L;;;;;N;;;;; +1D0F2;BYZANTINE MUSICAL SYMBOL KENTIMATA NEO KATO;So;0;L;;;;;N;;;;; +1D0F3;BYZANTINE MUSICAL SYMBOL KENTIMA NEO KATO;So;0;L;;;;;N;;;;; +1D0F4;BYZANTINE MUSICAL SYMBOL KLASMA KATO;So;0;L;;;;;N;;;;; +1D0F5;BYZANTINE MUSICAL SYMBOL GORGON NEO KATO;So;0;L;;;;;N;;;;; +1D100;MUSICAL SYMBOL SINGLE BARLINE;So;0;L;;;;;N;;;;; +1D101;MUSICAL SYMBOL DOUBLE BARLINE;So;0;L;;;;;N;;;;; +1D102;MUSICAL SYMBOL FINAL BARLINE;So;0;L;;;;;N;;;;; +1D103;MUSICAL SYMBOL REVERSE FINAL BARLINE;So;0;L;;;;;N;;;;; +1D104;MUSICAL SYMBOL DASHED BARLINE;So;0;L;;;;;N;;;;; +1D105;MUSICAL SYMBOL SHORT BARLINE;So;0;L;;;;;N;;;;; +1D106;MUSICAL SYMBOL LEFT REPEAT SIGN;So;0;L;;;;;N;;;;; +1D107;MUSICAL SYMBOL RIGHT REPEAT SIGN;So;0;L;;;;;N;;;;; +1D108;MUSICAL SYMBOL REPEAT DOTS;So;0;L;;;;;N;;;;; +1D109;MUSICAL SYMBOL DAL SEGNO;So;0;L;;;;;N;;;;; +1D10A;MUSICAL SYMBOL DA CAPO;So;0;L;;;;;N;;;;; +1D10B;MUSICAL SYMBOL SEGNO;So;0;L;;;;;N;;;;; +1D10C;MUSICAL SYMBOL CODA;So;0;L;;;;;N;;;;; +1D10D;MUSICAL SYMBOL REPEATED FIGURE-1;So;0;L;;;;;N;;;;; +1D10E;MUSICAL SYMBOL REPEATED FIGURE-2;So;0;L;;;;;N;;;;; +1D10F;MUSICAL SYMBOL REPEATED FIGURE-3;So;0;L;;;;;N;;;;; +1D110;MUSICAL SYMBOL FERMATA;So;0;L;;;;;N;;;;; +1D111;MUSICAL SYMBOL FERMATA BELOW;So;0;L;;;;;N;;;;; +1D112;MUSICAL SYMBOL BREATH MARK;So;0;L;;;;;N;;;;; +1D113;MUSICAL SYMBOL CAESURA;So;0;L;;;;;N;;;;; +1D114;MUSICAL SYMBOL BRACE;So;0;L;;;;;N;;;;; +1D115;MUSICAL SYMBOL BRACKET;So;0;L;;;;;N;;;;; +1D116;MUSICAL SYMBOL ONE-LINE STAFF;So;0;L;;;;;N;;;;; +1D117;MUSICAL SYMBOL TWO-LINE STAFF;So;0;L;;;;;N;;;;; +1D118;MUSICAL SYMBOL THREE-LINE STAFF;So;0;L;;;;;N;;;;; +1D119;MUSICAL SYMBOL FOUR-LINE STAFF;So;0;L;;;;;N;;;;; +1D11A;MUSICAL SYMBOL FIVE-LINE STAFF;So;0;L;;;;;N;;;;; +1D11B;MUSICAL SYMBOL SIX-LINE STAFF;So;0;L;;;;;N;;;;; +1D11C;MUSICAL SYMBOL SIX-STRING FRETBOARD;So;0;L;;;;;N;;;;; +1D11D;MUSICAL SYMBOL FOUR-STRING FRETBOARD;So;0;L;;;;;N;;;;; +1D11E;MUSICAL SYMBOL G CLEF;So;0;L;;;;;N;;;;; +1D11F;MUSICAL SYMBOL G CLEF OTTAVA ALTA;So;0;L;;;;;N;;;;; +1D120;MUSICAL SYMBOL G CLEF OTTAVA BASSA;So;0;L;;;;;N;;;;; +1D121;MUSICAL SYMBOL C CLEF;So;0;L;;;;;N;;;;; +1D122;MUSICAL SYMBOL F CLEF;So;0;L;;;;;N;;;;; +1D123;MUSICAL SYMBOL F CLEF OTTAVA ALTA;So;0;L;;;;;N;;;;; +1D124;MUSICAL SYMBOL F CLEF OTTAVA BASSA;So;0;L;;;;;N;;;;; +1D125;MUSICAL SYMBOL DRUM CLEF-1;So;0;L;;;;;N;;;;; +1D126;MUSICAL SYMBOL DRUM CLEF-2;So;0;L;;;;;N;;;;; +1D129;MUSICAL SYMBOL MULTIPLE MEASURE REST;So;0;L;;;;;N;;;;; +1D12A;MUSICAL SYMBOL DOUBLE SHARP;So;0;L;;;;;N;;;;; +1D12B;MUSICAL SYMBOL DOUBLE FLAT;So;0;L;;;;;N;;;;; +1D12C;MUSICAL SYMBOL FLAT UP;So;0;L;;;;;N;;;;; +1D12D;MUSICAL SYMBOL FLAT DOWN;So;0;L;;;;;N;;;;; +1D12E;MUSICAL SYMBOL NATURAL UP;So;0;L;;;;;N;;;;; +1D12F;MUSICAL SYMBOL NATURAL DOWN;So;0;L;;;;;N;;;;; +1D130;MUSICAL SYMBOL SHARP UP;So;0;L;;;;;N;;;;; +1D131;MUSICAL SYMBOL SHARP DOWN;So;0;L;;;;;N;;;;; +1D132;MUSICAL SYMBOL QUARTER TONE SHARP;So;0;L;;;;;N;;;;; +1D133;MUSICAL SYMBOL QUARTER TONE FLAT;So;0;L;;;;;N;;;;; +1D134;MUSICAL SYMBOL COMMON TIME;So;0;L;;;;;N;;;;; +1D135;MUSICAL SYMBOL CUT TIME;So;0;L;;;;;N;;;;; +1D136;MUSICAL SYMBOL OTTAVA ALTA;So;0;L;;;;;N;;;;; +1D137;MUSICAL SYMBOL OTTAVA BASSA;So;0;L;;;;;N;;;;; +1D138;MUSICAL SYMBOL QUINDICESIMA ALTA;So;0;L;;;;;N;;;;; +1D139;MUSICAL SYMBOL QUINDICESIMA BASSA;So;0;L;;;;;N;;;;; +1D13A;MUSICAL SYMBOL MULTI REST;So;0;L;;;;;N;;;;; +1D13B;MUSICAL SYMBOL WHOLE REST;So;0;L;;;;;N;;;;; +1D13C;MUSICAL SYMBOL HALF REST;So;0;L;;;;;N;;;;; +1D13D;MUSICAL SYMBOL QUARTER REST;So;0;L;;;;;N;;;;; +1D13E;MUSICAL SYMBOL EIGHTH REST;So;0;L;;;;;N;;;;; +1D13F;MUSICAL SYMBOL SIXTEENTH REST;So;0;L;;;;;N;;;;; +1D140;MUSICAL SYMBOL THIRTY-SECOND REST;So;0;L;;;;;N;;;;; +1D141;MUSICAL SYMBOL SIXTY-FOURTH REST;So;0;L;;;;;N;;;;; +1D142;MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH REST;So;0;L;;;;;N;;;;; +1D143;MUSICAL SYMBOL X NOTEHEAD;So;0;L;;;;;N;;;;; +1D144;MUSICAL SYMBOL PLUS NOTEHEAD;So;0;L;;;;;N;;;;; +1D145;MUSICAL SYMBOL CIRCLE X NOTEHEAD;So;0;L;;;;;N;;;;; +1D146;MUSICAL SYMBOL SQUARE NOTEHEAD WHITE;So;0;L;;;;;N;;;;; +1D147;MUSICAL SYMBOL SQUARE NOTEHEAD BLACK;So;0;L;;;;;N;;;;; +1D148;MUSICAL SYMBOL TRIANGLE NOTEHEAD UP WHITE;So;0;L;;;;;N;;;;; +1D149;MUSICAL SYMBOL TRIANGLE NOTEHEAD UP BLACK;So;0;L;;;;;N;;;;; +1D14A;MUSICAL SYMBOL TRIANGLE NOTEHEAD LEFT WHITE;So;0;L;;;;;N;;;;; +1D14B;MUSICAL SYMBOL TRIANGLE NOTEHEAD LEFT BLACK;So;0;L;;;;;N;;;;; +1D14C;MUSICAL SYMBOL TRIANGLE NOTEHEAD RIGHT WHITE;So;0;L;;;;;N;;;;; +1D14D;MUSICAL SYMBOL TRIANGLE NOTEHEAD RIGHT BLACK;So;0;L;;;;;N;;;;; +1D14E;MUSICAL SYMBOL TRIANGLE NOTEHEAD DOWN WHITE;So;0;L;;;;;N;;;;; +1D14F;MUSICAL SYMBOL TRIANGLE NOTEHEAD DOWN BLACK;So;0;L;;;;;N;;;;; +1D150;MUSICAL SYMBOL TRIANGLE NOTEHEAD UP RIGHT WHITE;So;0;L;;;;;N;;;;; +1D151;MUSICAL SYMBOL TRIANGLE NOTEHEAD UP RIGHT BLACK;So;0;L;;;;;N;;;;; +1D152;MUSICAL SYMBOL MOON NOTEHEAD WHITE;So;0;L;;;;;N;;;;; +1D153;MUSICAL SYMBOL MOON NOTEHEAD BLACK;So;0;L;;;;;N;;;;; +1D154;MUSICAL SYMBOL TRIANGLE-ROUND NOTEHEAD DOWN WHITE;So;0;L;;;;;N;;;;; +1D155;MUSICAL SYMBOL TRIANGLE-ROUND NOTEHEAD DOWN BLACK;So;0;L;;;;;N;;;;; +1D156;MUSICAL SYMBOL PARENTHESIS NOTEHEAD;So;0;L;;;;;N;;;;; +1D157;MUSICAL SYMBOL VOID NOTEHEAD;So;0;L;;;;;N;;;;; +1D158;MUSICAL SYMBOL NOTEHEAD BLACK;So;0;L;;;;;N;;;;; +1D159;MUSICAL SYMBOL NULL NOTEHEAD;So;0;L;;;;;N;;;;; +1D15A;MUSICAL SYMBOL CLUSTER NOTEHEAD WHITE;So;0;L;;;;;N;;;;; +1D15B;MUSICAL SYMBOL CLUSTER NOTEHEAD BLACK;So;0;L;;;;;N;;;;; +1D15C;MUSICAL SYMBOL BREVE;So;0;L;;;;;N;;;;; +1D15D;MUSICAL SYMBOL WHOLE NOTE;So;0;L;;;;;N;;;;; +1D15E;MUSICAL SYMBOL HALF NOTE;So;0;L;1D157 1D165;;;;N;;;;; +1D15F;MUSICAL SYMBOL QUARTER NOTE;So;0;L;1D158 1D165;;;;N;;;;; +1D160;MUSICAL SYMBOL EIGHTH NOTE;So;0;L;1D15F 1D16E;;;;N;;;;; +1D161;MUSICAL SYMBOL SIXTEENTH NOTE;So;0;L;1D15F 1D16F;;;;N;;;;; +1D162;MUSICAL SYMBOL THIRTY-SECOND NOTE;So;0;L;1D15F 1D170;;;;N;;;;; +1D163;MUSICAL SYMBOL SIXTY-FOURTH NOTE;So;0;L;1D15F 1D171;;;;N;;;;; +1D164;MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH NOTE;So;0;L;1D15F 1D172;;;;N;;;;; +1D165;MUSICAL SYMBOL COMBINING STEM;Mc;216;L;;;;;N;;;;; +1D166;MUSICAL SYMBOL COMBINING SPRECHGESANG STEM;Mc;216;L;;;;;N;;;;; +1D167;MUSICAL SYMBOL COMBINING TREMOLO-1;Mn;1;NSM;;;;;N;;;;; +1D168;MUSICAL SYMBOL COMBINING TREMOLO-2;Mn;1;NSM;;;;;N;;;;; +1D169;MUSICAL SYMBOL COMBINING TREMOLO-3;Mn;1;NSM;;;;;N;;;;; +1D16A;MUSICAL SYMBOL FINGERED TREMOLO-1;So;0;L;;;;;N;;;;; +1D16B;MUSICAL SYMBOL FINGERED TREMOLO-2;So;0;L;;;;;N;;;;; +1D16C;MUSICAL SYMBOL FINGERED TREMOLO-3;So;0;L;;;;;N;;;;; +1D16D;MUSICAL SYMBOL COMBINING AUGMENTATION DOT;Mc;226;L;;;;;N;;;;; +1D16E;MUSICAL SYMBOL COMBINING FLAG-1;Mc;216;L;;;;;N;;;;; +1D16F;MUSICAL SYMBOL COMBINING FLAG-2;Mc;216;L;;;;;N;;;;; +1D170;MUSICAL SYMBOL COMBINING FLAG-3;Mc;216;L;;;;;N;;;;; +1D171;MUSICAL SYMBOL COMBINING FLAG-4;Mc;216;L;;;;;N;;;;; +1D172;MUSICAL SYMBOL COMBINING FLAG-5;Mc;216;L;;;;;N;;;;; +1D173;MUSICAL SYMBOL BEGIN BEAM;Cf;0;BN;;;;;N;;;;; +1D174;MUSICAL SYMBOL END BEAM;Cf;0;BN;;;;;N;;;;; +1D175;MUSICAL SYMBOL BEGIN TIE;Cf;0;BN;;;;;N;;;;; +1D176;MUSICAL SYMBOL END TIE;Cf;0;BN;;;;;N;;;;; +1D177;MUSICAL SYMBOL BEGIN SLUR;Cf;0;BN;;;;;N;;;;; +1D178;MUSICAL SYMBOL END SLUR;Cf;0;BN;;;;;N;;;;; +1D179;MUSICAL SYMBOL BEGIN PHRASE;Cf;0;BN;;;;;N;;;;; +1D17A;MUSICAL SYMBOL END PHRASE;Cf;0;BN;;;;;N;;;;; +1D17B;MUSICAL SYMBOL COMBINING ACCENT;Mn;220;NSM;;;;;N;;;;; +1D17C;MUSICAL SYMBOL COMBINING STACCATO;Mn;220;NSM;;;;;N;;;;; +1D17D;MUSICAL SYMBOL COMBINING TENUTO;Mn;220;NSM;;;;;N;;;;; +1D17E;MUSICAL SYMBOL COMBINING STACCATISSIMO;Mn;220;NSM;;;;;N;;;;; +1D17F;MUSICAL SYMBOL COMBINING MARCATO;Mn;220;NSM;;;;;N;;;;; +1D180;MUSICAL SYMBOL COMBINING MARCATO-STACCATO;Mn;220;NSM;;;;;N;;;;; +1D181;MUSICAL SYMBOL COMBINING ACCENT-STACCATO;Mn;220;NSM;;;;;N;;;;; +1D182;MUSICAL SYMBOL COMBINING LOURE;Mn;220;NSM;;;;;N;;;;; +1D183;MUSICAL SYMBOL ARPEGGIATO UP;So;0;L;;;;;N;;;;; +1D184;MUSICAL SYMBOL ARPEGGIATO DOWN;So;0;L;;;;;N;;;;; +1D185;MUSICAL SYMBOL COMBINING DOIT;Mn;230;NSM;;;;;N;;;;; +1D186;MUSICAL SYMBOL COMBINING RIP;Mn;230;NSM;;;;;N;;;;; +1D187;MUSICAL SYMBOL COMBINING FLIP;Mn;230;NSM;;;;;N;;;;; +1D188;MUSICAL SYMBOL COMBINING SMEAR;Mn;230;NSM;;;;;N;;;;; +1D189;MUSICAL SYMBOL COMBINING BEND;Mn;230;NSM;;;;;N;;;;; +1D18A;MUSICAL SYMBOL COMBINING DOUBLE TONGUE;Mn;220;NSM;;;;;N;;;;; +1D18B;MUSICAL SYMBOL COMBINING TRIPLE TONGUE;Mn;220;NSM;;;;;N;;;;; +1D18C;MUSICAL SYMBOL RINFORZANDO;So;0;L;;;;;N;;;;; +1D18D;MUSICAL SYMBOL SUBITO;So;0;L;;;;;N;;;;; +1D18E;MUSICAL SYMBOL Z;So;0;L;;;;;N;;;;; +1D18F;MUSICAL SYMBOL PIANO;So;0;L;;;;;N;;;;; +1D190;MUSICAL SYMBOL MEZZO;So;0;L;;;;;N;;;;; +1D191;MUSICAL SYMBOL FORTE;So;0;L;;;;;N;;;;; +1D192;MUSICAL SYMBOL CRESCENDO;So;0;L;;;;;N;;;;; +1D193;MUSICAL SYMBOL DECRESCENDO;So;0;L;;;;;N;;;;; +1D194;MUSICAL SYMBOL GRACE NOTE SLASH;So;0;L;;;;;N;;;;; +1D195;MUSICAL SYMBOL GRACE NOTE NO SLASH;So;0;L;;;;;N;;;;; +1D196;MUSICAL SYMBOL TR;So;0;L;;;;;N;;;;; +1D197;MUSICAL SYMBOL TURN;So;0;L;;;;;N;;;;; +1D198;MUSICAL SYMBOL INVERTED TURN;So;0;L;;;;;N;;;;; +1D199;MUSICAL SYMBOL TURN SLASH;So;0;L;;;;;N;;;;; +1D19A;MUSICAL SYMBOL TURN UP;So;0;L;;;;;N;;;;; +1D19B;MUSICAL SYMBOL ORNAMENT STROKE-1;So;0;L;;;;;N;;;;; +1D19C;MUSICAL SYMBOL ORNAMENT STROKE-2;So;0;L;;;;;N;;;;; +1D19D;MUSICAL SYMBOL ORNAMENT STROKE-3;So;0;L;;;;;N;;;;; +1D19E;MUSICAL SYMBOL ORNAMENT STROKE-4;So;0;L;;;;;N;;;;; +1D19F;MUSICAL SYMBOL ORNAMENT STROKE-5;So;0;L;;;;;N;;;;; +1D1A0;MUSICAL SYMBOL ORNAMENT STROKE-6;So;0;L;;;;;N;;;;; +1D1A1;MUSICAL SYMBOL ORNAMENT STROKE-7;So;0;L;;;;;N;;;;; +1D1A2;MUSICAL SYMBOL ORNAMENT STROKE-8;So;0;L;;;;;N;;;;; +1D1A3;MUSICAL SYMBOL ORNAMENT STROKE-9;So;0;L;;;;;N;;;;; +1D1A4;MUSICAL SYMBOL ORNAMENT STROKE-10;So;0;L;;;;;N;;;;; +1D1A5;MUSICAL SYMBOL ORNAMENT STROKE-11;So;0;L;;;;;N;;;;; +1D1A6;MUSICAL SYMBOL HAUPTSTIMME;So;0;L;;;;;N;;;;; +1D1A7;MUSICAL SYMBOL NEBENSTIMME;So;0;L;;;;;N;;;;; +1D1A8;MUSICAL SYMBOL END OF STIMME;So;0;L;;;;;N;;;;; +1D1A9;MUSICAL SYMBOL DEGREE SLASH;So;0;L;;;;;N;;;;; +1D1AA;MUSICAL SYMBOL COMBINING DOWN BOW;Mn;230;NSM;;;;;N;;;;; +1D1AB;MUSICAL SYMBOL COMBINING UP BOW;Mn;230;NSM;;;;;N;;;;; +1D1AC;MUSICAL SYMBOL COMBINING HARMONIC;Mn;230;NSM;;;;;N;;;;; +1D1AD;MUSICAL SYMBOL COMBINING SNAP PIZZICATO;Mn;230;NSM;;;;;N;;;;; +1D1AE;MUSICAL SYMBOL PEDAL MARK;So;0;L;;;;;N;;;;; +1D1AF;MUSICAL SYMBOL PEDAL UP MARK;So;0;L;;;;;N;;;;; +1D1B0;MUSICAL SYMBOL HALF PEDAL MARK;So;0;L;;;;;N;;;;; +1D1B1;MUSICAL SYMBOL GLISSANDO UP;So;0;L;;;;;N;;;;; +1D1B2;MUSICAL SYMBOL GLISSANDO DOWN;So;0;L;;;;;N;;;;; +1D1B3;MUSICAL SYMBOL WITH FINGERNAILS;So;0;L;;;;;N;;;;; +1D1B4;MUSICAL SYMBOL DAMP;So;0;L;;;;;N;;;;; +1D1B5;MUSICAL SYMBOL DAMP ALL;So;0;L;;;;;N;;;;; +1D1B6;MUSICAL SYMBOL MAXIMA;So;0;L;;;;;N;;;;; +1D1B7;MUSICAL SYMBOL LONGA;So;0;L;;;;;N;;;;; +1D1B8;MUSICAL SYMBOL BREVIS;So;0;L;;;;;N;;;;; +1D1B9;MUSICAL SYMBOL SEMIBREVIS WHITE;So;0;L;;;;;N;;;;; +1D1BA;MUSICAL SYMBOL SEMIBREVIS BLACK;So;0;L;;;;;N;;;;; +1D1BB;MUSICAL SYMBOL MINIMA;So;0;L;1D1B9 1D165;;;;N;;;;; +1D1BC;MUSICAL SYMBOL MINIMA BLACK;So;0;L;1D1BA 1D165;;;;N;;;;; +1D1BD;MUSICAL SYMBOL SEMIMINIMA WHITE;So;0;L;1D1BB 1D16E;;;;N;;;;; +1D1BE;MUSICAL SYMBOL SEMIMINIMA BLACK;So;0;L;1D1BC 1D16E;;;;N;;;;; +1D1BF;MUSICAL SYMBOL FUSA WHITE;So;0;L;1D1BB 1D16F;;;;N;;;;; +1D1C0;MUSICAL SYMBOL FUSA BLACK;So;0;L;1D1BC 1D16F;;;;N;;;;; +1D1C1;MUSICAL SYMBOL LONGA PERFECTA REST;So;0;L;;;;;N;;;;; +1D1C2;MUSICAL SYMBOL LONGA IMPERFECTA REST;So;0;L;;;;;N;;;;; +1D1C3;MUSICAL SYMBOL BREVIS REST;So;0;L;;;;;N;;;;; +1D1C4;MUSICAL SYMBOL SEMIBREVIS REST;So;0;L;;;;;N;;;;; +1D1C5;MUSICAL SYMBOL MINIMA REST;So;0;L;;;;;N;;;;; +1D1C6;MUSICAL SYMBOL SEMIMINIMA REST;So;0;L;;;;;N;;;;; +1D1C7;MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE PERFECTA;So;0;L;;;;;N;;;;; +1D1C8;MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE IMPERFECTA;So;0;L;;;;;N;;;;; +1D1C9;MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE PERFECTA DIMINUTION-1;So;0;L;;;;;N;;;;; +1D1CA;MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE PERFECTA;So;0;L;;;;;N;;;;; +1D1CB;MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA;So;0;L;;;;;N;;;;; +1D1CC;MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-1;So;0;L;;;;;N;;;;; +1D1CD;MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-2;So;0;L;;;;;N;;;;; +1D1CE;MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-3;So;0;L;;;;;N;;;;; +1D1CF;MUSICAL SYMBOL CROIX;So;0;L;;;;;N;;;;; +1D1D0;MUSICAL SYMBOL GREGORIAN C CLEF;So;0;L;;;;;N;;;;; +1D1D1;MUSICAL SYMBOL GREGORIAN F CLEF;So;0;L;;;;;N;;;;; +1D1D2;MUSICAL SYMBOL SQUARE B;So;0;L;;;;;N;;;;; +1D1D3;MUSICAL SYMBOL VIRGA;So;0;L;;;;;N;;;;; +1D1D4;MUSICAL SYMBOL PODATUS;So;0;L;;;;;N;;;;; +1D1D5;MUSICAL SYMBOL CLIVIS;So;0;L;;;;;N;;;;; +1D1D6;MUSICAL SYMBOL SCANDICUS;So;0;L;;;;;N;;;;; +1D1D7;MUSICAL SYMBOL CLIMACUS;So;0;L;;;;;N;;;;; +1D1D8;MUSICAL SYMBOL TORCULUS;So;0;L;;;;;N;;;;; +1D1D9;MUSICAL SYMBOL PORRECTUS;So;0;L;;;;;N;;;;; +1D1DA;MUSICAL SYMBOL PORRECTUS FLEXUS;So;0;L;;;;;N;;;;; +1D1DB;MUSICAL SYMBOL SCANDICUS FLEXUS;So;0;L;;;;;N;;;;; +1D1DC;MUSICAL SYMBOL TORCULUS RESUPINUS;So;0;L;;;;;N;;;;; +1D1DD;MUSICAL SYMBOL PES SUBPUNCTIS;So;0;L;;;;;N;;;;; +1D1DE;MUSICAL SYMBOL KIEVAN C CLEF;So;0;L;;;;;N;;;;; +1D1DF;MUSICAL SYMBOL KIEVAN END OF PIECE;So;0;L;;;;;N;;;;; +1D1E0;MUSICAL SYMBOL KIEVAN FINAL NOTE;So;0;L;;;;;N;;;;; +1D1E1;MUSICAL SYMBOL KIEVAN RECITATIVE MARK;So;0;L;;;;;N;;;;; +1D1E2;MUSICAL SYMBOL KIEVAN WHOLE NOTE;So;0;L;;;;;N;;;;; +1D1E3;MUSICAL SYMBOL KIEVAN HALF NOTE;So;0;L;;;;;N;;;;; +1D1E4;MUSICAL SYMBOL KIEVAN QUARTER NOTE STEM DOWN;So;0;L;;;;;N;;;;; +1D1E5;MUSICAL SYMBOL KIEVAN QUARTER NOTE STEM UP;So;0;L;;;;;N;;;;; +1D1E6;MUSICAL SYMBOL KIEVAN EIGHTH NOTE STEM DOWN;So;0;L;;;;;N;;;;; +1D1E7;MUSICAL SYMBOL KIEVAN EIGHTH NOTE STEM UP;So;0;L;;;;;N;;;;; +1D1E8;MUSICAL SYMBOL KIEVAN FLAT SIGN;So;0;L;;;;;N;;;;; +1D200;GREEK VOCAL NOTATION SYMBOL-1;So;0;ON;;;;;N;;;;; +1D201;GREEK VOCAL NOTATION SYMBOL-2;So;0;ON;;;;;N;;;;; +1D202;GREEK VOCAL NOTATION SYMBOL-3;So;0;ON;;;;;N;;;;; +1D203;GREEK VOCAL NOTATION SYMBOL-4;So;0;ON;;;;;N;;;;; +1D204;GREEK VOCAL NOTATION SYMBOL-5;So;0;ON;;;;;N;;;;; +1D205;GREEK VOCAL NOTATION SYMBOL-6;So;0;ON;;;;;N;;;;; +1D206;GREEK VOCAL NOTATION SYMBOL-7;So;0;ON;;;;;N;;;;; +1D207;GREEK VOCAL NOTATION SYMBOL-8;So;0;ON;;;;;N;;;;; +1D208;GREEK VOCAL NOTATION SYMBOL-9;So;0;ON;;;;;N;;;;; +1D209;GREEK VOCAL NOTATION SYMBOL-10;So;0;ON;;;;;N;;;;; +1D20A;GREEK VOCAL NOTATION SYMBOL-11;So;0;ON;;;;;N;;;;; +1D20B;GREEK VOCAL NOTATION SYMBOL-12;So;0;ON;;;;;N;;;;; +1D20C;GREEK VOCAL NOTATION SYMBOL-13;So;0;ON;;;;;N;;;;; +1D20D;GREEK VOCAL NOTATION SYMBOL-14;So;0;ON;;;;;N;;;;; +1D20E;GREEK VOCAL NOTATION SYMBOL-15;So;0;ON;;;;;N;;;;; +1D20F;GREEK VOCAL NOTATION SYMBOL-16;So;0;ON;;;;;N;;;;; +1D210;GREEK VOCAL NOTATION SYMBOL-17;So;0;ON;;;;;N;;;;; +1D211;GREEK VOCAL NOTATION SYMBOL-18;So;0;ON;;;;;N;;;;; +1D212;GREEK VOCAL NOTATION SYMBOL-19;So;0;ON;;;;;N;;;;; +1D213;GREEK VOCAL NOTATION SYMBOL-20;So;0;ON;;;;;N;;;;; +1D214;GREEK VOCAL NOTATION SYMBOL-21;So;0;ON;;;;;N;;;;; +1D215;GREEK VOCAL NOTATION SYMBOL-22;So;0;ON;;;;;N;;;;; +1D216;GREEK VOCAL NOTATION SYMBOL-23;So;0;ON;;;;;N;;;;; +1D217;GREEK VOCAL NOTATION SYMBOL-24;So;0;ON;;;;;N;;;;; +1D218;GREEK VOCAL NOTATION SYMBOL-50;So;0;ON;;;;;N;;;;; +1D219;GREEK VOCAL NOTATION SYMBOL-51;So;0;ON;;;;;N;;;;; +1D21A;GREEK VOCAL NOTATION SYMBOL-52;So;0;ON;;;;;N;;;;; +1D21B;GREEK VOCAL NOTATION SYMBOL-53;So;0;ON;;;;;N;;;;; +1D21C;GREEK VOCAL NOTATION SYMBOL-54;So;0;ON;;;;;N;;;;; +1D21D;GREEK INSTRUMENTAL NOTATION SYMBOL-1;So;0;ON;;;;;N;;;;; +1D21E;GREEK INSTRUMENTAL NOTATION SYMBOL-2;So;0;ON;;;;;N;;;;; +1D21F;GREEK INSTRUMENTAL NOTATION SYMBOL-4;So;0;ON;;;;;N;;;;; +1D220;GREEK INSTRUMENTAL NOTATION SYMBOL-5;So;0;ON;;;;;N;;;;; +1D221;GREEK INSTRUMENTAL NOTATION SYMBOL-7;So;0;ON;;;;;N;;;;; +1D222;GREEK INSTRUMENTAL NOTATION SYMBOL-8;So;0;ON;;;;;N;;;;; +1D223;GREEK INSTRUMENTAL NOTATION SYMBOL-11;So;0;ON;;;;;N;;;;; +1D224;GREEK INSTRUMENTAL NOTATION SYMBOL-12;So;0;ON;;;;;N;;;;; +1D225;GREEK INSTRUMENTAL NOTATION SYMBOL-13;So;0;ON;;;;;N;;;;; +1D226;GREEK INSTRUMENTAL NOTATION SYMBOL-14;So;0;ON;;;;;N;;;;; +1D227;GREEK INSTRUMENTAL NOTATION SYMBOL-17;So;0;ON;;;;;N;;;;; +1D228;GREEK INSTRUMENTAL NOTATION SYMBOL-18;So;0;ON;;;;;N;;;;; +1D229;GREEK INSTRUMENTAL NOTATION SYMBOL-19;So;0;ON;;;;;N;;;;; +1D22A;GREEK INSTRUMENTAL NOTATION SYMBOL-23;So;0;ON;;;;;N;;;;; +1D22B;GREEK INSTRUMENTAL NOTATION SYMBOL-24;So;0;ON;;;;;N;;;;; +1D22C;GREEK INSTRUMENTAL NOTATION SYMBOL-25;So;0;ON;;;;;N;;;;; +1D22D;GREEK INSTRUMENTAL NOTATION SYMBOL-26;So;0;ON;;;;;N;;;;; +1D22E;GREEK INSTRUMENTAL NOTATION SYMBOL-27;So;0;ON;;;;;N;;;;; +1D22F;GREEK INSTRUMENTAL NOTATION SYMBOL-29;So;0;ON;;;;;N;;;;; +1D230;GREEK INSTRUMENTAL NOTATION SYMBOL-30;So;0;ON;;;;;N;;;;; +1D231;GREEK INSTRUMENTAL NOTATION SYMBOL-32;So;0;ON;;;;;N;;;;; +1D232;GREEK INSTRUMENTAL NOTATION SYMBOL-36;So;0;ON;;;;;N;;;;; +1D233;GREEK INSTRUMENTAL NOTATION SYMBOL-37;So;0;ON;;;;;N;;;;; +1D234;GREEK INSTRUMENTAL NOTATION SYMBOL-38;So;0;ON;;;;;N;;;;; +1D235;GREEK INSTRUMENTAL NOTATION SYMBOL-39;So;0;ON;;;;;N;;;;; +1D236;GREEK INSTRUMENTAL NOTATION SYMBOL-40;So;0;ON;;;;;N;;;;; +1D237;GREEK INSTRUMENTAL NOTATION SYMBOL-42;So;0;ON;;;;;N;;;;; +1D238;GREEK INSTRUMENTAL NOTATION SYMBOL-43;So;0;ON;;;;;N;;;;; +1D239;GREEK INSTRUMENTAL NOTATION SYMBOL-45;So;0;ON;;;;;N;;;;; +1D23A;GREEK INSTRUMENTAL NOTATION SYMBOL-47;So;0;ON;;;;;N;;;;; +1D23B;GREEK INSTRUMENTAL NOTATION SYMBOL-48;So;0;ON;;;;;N;;;;; +1D23C;GREEK INSTRUMENTAL NOTATION SYMBOL-49;So;0;ON;;;;;N;;;;; +1D23D;GREEK INSTRUMENTAL NOTATION SYMBOL-50;So;0;ON;;;;;N;;;;; +1D23E;GREEK INSTRUMENTAL NOTATION SYMBOL-51;So;0;ON;;;;;N;;;;; +1D23F;GREEK INSTRUMENTAL NOTATION SYMBOL-52;So;0;ON;;;;;N;;;;; +1D240;GREEK INSTRUMENTAL NOTATION SYMBOL-53;So;0;ON;;;;;N;;;;; +1D241;GREEK INSTRUMENTAL NOTATION SYMBOL-54;So;0;ON;;;;;N;;;;; +1D242;COMBINING GREEK MUSICAL TRISEME;Mn;230;NSM;;;;;N;;;;; +1D243;COMBINING GREEK MUSICAL TETRASEME;Mn;230;NSM;;;;;N;;;;; +1D244;COMBINING GREEK MUSICAL PENTASEME;Mn;230;NSM;;;;;N;;;;; +1D245;GREEK MUSICAL LEIMMA;So;0;ON;;;;;N;;;;; +1D2E0;MAYAN NUMERAL ZERO;No;0;L;;;;0;N;;;;; +1D2E1;MAYAN NUMERAL ONE;No;0;L;;;;1;N;;;;; +1D2E2;MAYAN NUMERAL TWO;No;0;L;;;;2;N;;;;; +1D2E3;MAYAN NUMERAL THREE;No;0;L;;;;3;N;;;;; +1D2E4;MAYAN NUMERAL FOUR;No;0;L;;;;4;N;;;;; +1D2E5;MAYAN NUMERAL FIVE;No;0;L;;;;5;N;;;;; +1D2E6;MAYAN NUMERAL SIX;No;0;L;;;;6;N;;;;; +1D2E7;MAYAN NUMERAL SEVEN;No;0;L;;;;7;N;;;;; +1D2E8;MAYAN NUMERAL EIGHT;No;0;L;;;;8;N;;;;; +1D2E9;MAYAN NUMERAL NINE;No;0;L;;;;9;N;;;;; +1D2EA;MAYAN NUMERAL TEN;No;0;L;;;;10;N;;;;; +1D2EB;MAYAN NUMERAL ELEVEN;No;0;L;;;;11;N;;;;; +1D2EC;MAYAN NUMERAL TWELVE;No;0;L;;;;12;N;;;;; +1D2ED;MAYAN NUMERAL THIRTEEN;No;0;L;;;;13;N;;;;; +1D2EE;MAYAN NUMERAL FOURTEEN;No;0;L;;;;14;N;;;;; +1D2EF;MAYAN NUMERAL FIFTEEN;No;0;L;;;;15;N;;;;; +1D2F0;MAYAN NUMERAL SIXTEEN;No;0;L;;;;16;N;;;;; +1D2F1;MAYAN NUMERAL SEVENTEEN;No;0;L;;;;17;N;;;;; +1D2F2;MAYAN NUMERAL EIGHTEEN;No;0;L;;;;18;N;;;;; +1D2F3;MAYAN NUMERAL NINETEEN;No;0;L;;;;19;N;;;;; +1D300;MONOGRAM FOR EARTH;So;0;ON;;;;;N;;;;; +1D301;DIGRAM FOR HEAVENLY EARTH;So;0;ON;;;;;N;;;;; +1D302;DIGRAM FOR HUMAN EARTH;So;0;ON;;;;;N;;;;; +1D303;DIGRAM FOR EARTHLY HEAVEN;So;0;ON;;;;;N;;;;; +1D304;DIGRAM FOR EARTHLY HUMAN;So;0;ON;;;;;N;;;;; +1D305;DIGRAM FOR EARTH;So;0;ON;;;;;N;;;;; +1D306;TETRAGRAM FOR CENTRE;So;0;ON;;;;;N;;;;; +1D307;TETRAGRAM FOR FULL CIRCLE;So;0;ON;;;;;N;;;;; +1D308;TETRAGRAM FOR MIRED;So;0;ON;;;;;N;;;;; +1D309;TETRAGRAM FOR BARRIER;So;0;ON;;;;;N;;;;; +1D30A;TETRAGRAM FOR KEEPING SMALL;So;0;ON;;;;;N;;;;; +1D30B;TETRAGRAM FOR CONTRARIETY;So;0;ON;;;;;N;;;;; +1D30C;TETRAGRAM FOR ASCENT;So;0;ON;;;;;N;;;;; +1D30D;TETRAGRAM FOR OPPOSITION;So;0;ON;;;;;N;;;;; +1D30E;TETRAGRAM FOR BRANCHING OUT;So;0;ON;;;;;N;;;;; +1D30F;TETRAGRAM FOR DEFECTIVENESS OR DISTORTION;So;0;ON;;;;;N;;;;; +1D310;TETRAGRAM FOR DIVERGENCE;So;0;ON;;;;;N;;;;; +1D311;TETRAGRAM FOR YOUTHFULNESS;So;0;ON;;;;;N;;;;; +1D312;TETRAGRAM FOR INCREASE;So;0;ON;;;;;N;;;;; +1D313;TETRAGRAM FOR PENETRATION;So;0;ON;;;;;N;;;;; +1D314;TETRAGRAM FOR REACH;So;0;ON;;;;;N;;;;; +1D315;TETRAGRAM FOR CONTACT;So;0;ON;;;;;N;;;;; +1D316;TETRAGRAM FOR HOLDING BACK;So;0;ON;;;;;N;;;;; +1D317;TETRAGRAM FOR WAITING;So;0;ON;;;;;N;;;;; +1D318;TETRAGRAM FOR FOLLOWING;So;0;ON;;;;;N;;;;; +1D319;TETRAGRAM FOR ADVANCE;So;0;ON;;;;;N;;;;; +1D31A;TETRAGRAM FOR RELEASE;So;0;ON;;;;;N;;;;; +1D31B;TETRAGRAM FOR RESISTANCE;So;0;ON;;;;;N;;;;; +1D31C;TETRAGRAM FOR EASE;So;0;ON;;;;;N;;;;; +1D31D;TETRAGRAM FOR JOY;So;0;ON;;;;;N;;;;; +1D31E;TETRAGRAM FOR CONTENTION;So;0;ON;;;;;N;;;;; +1D31F;TETRAGRAM FOR ENDEAVOUR;So;0;ON;;;;;N;;;;; +1D320;TETRAGRAM FOR DUTIES;So;0;ON;;;;;N;;;;; +1D321;TETRAGRAM FOR CHANGE;So;0;ON;;;;;N;;;;; +1D322;TETRAGRAM FOR DECISIVENESS;So;0;ON;;;;;N;;;;; +1D323;TETRAGRAM FOR BOLD RESOLUTION;So;0;ON;;;;;N;;;;; +1D324;TETRAGRAM FOR PACKING;So;0;ON;;;;;N;;;;; +1D325;TETRAGRAM FOR LEGION;So;0;ON;;;;;N;;;;; +1D326;TETRAGRAM FOR CLOSENESS;So;0;ON;;;;;N;;;;; +1D327;TETRAGRAM FOR KINSHIP;So;0;ON;;;;;N;;;;; +1D328;TETRAGRAM FOR GATHERING;So;0;ON;;;;;N;;;;; +1D329;TETRAGRAM FOR STRENGTH;So;0;ON;;;;;N;;;;; +1D32A;TETRAGRAM FOR PURITY;So;0;ON;;;;;N;;;;; +1D32B;TETRAGRAM FOR FULLNESS;So;0;ON;;;;;N;;;;; +1D32C;TETRAGRAM FOR RESIDENCE;So;0;ON;;;;;N;;;;; +1D32D;TETRAGRAM FOR LAW OR MODEL;So;0;ON;;;;;N;;;;; +1D32E;TETRAGRAM FOR RESPONSE;So;0;ON;;;;;N;;;;; +1D32F;TETRAGRAM FOR GOING TO MEET;So;0;ON;;;;;N;;;;; +1D330;TETRAGRAM FOR ENCOUNTERS;So;0;ON;;;;;N;;;;; +1D331;TETRAGRAM FOR STOVE;So;0;ON;;;;;N;;;;; +1D332;TETRAGRAM FOR GREATNESS;So;0;ON;;;;;N;;;;; +1D333;TETRAGRAM FOR ENLARGEMENT;So;0;ON;;;;;N;;;;; +1D334;TETRAGRAM FOR PATTERN;So;0;ON;;;;;N;;;;; +1D335;TETRAGRAM FOR RITUAL;So;0;ON;;;;;N;;;;; +1D336;TETRAGRAM FOR FLIGHT;So;0;ON;;;;;N;;;;; +1D337;TETRAGRAM FOR VASTNESS OR WASTING;So;0;ON;;;;;N;;;;; +1D338;TETRAGRAM FOR CONSTANCY;So;0;ON;;;;;N;;;;; +1D339;TETRAGRAM FOR MEASURE;So;0;ON;;;;;N;;;;; +1D33A;TETRAGRAM FOR ETERNITY;So;0;ON;;;;;N;;;;; +1D33B;TETRAGRAM FOR UNITY;So;0;ON;;;;;N;;;;; +1D33C;TETRAGRAM FOR DIMINISHMENT;So;0;ON;;;;;N;;;;; +1D33D;TETRAGRAM FOR CLOSED MOUTH;So;0;ON;;;;;N;;;;; +1D33E;TETRAGRAM FOR GUARDEDNESS;So;0;ON;;;;;N;;;;; +1D33F;TETRAGRAM FOR GATHERING IN;So;0;ON;;;;;N;;;;; +1D340;TETRAGRAM FOR MASSING;So;0;ON;;;;;N;;;;; +1D341;TETRAGRAM FOR ACCUMULATION;So;0;ON;;;;;N;;;;; +1D342;TETRAGRAM FOR EMBELLISHMENT;So;0;ON;;;;;N;;;;; +1D343;TETRAGRAM FOR DOUBT;So;0;ON;;;;;N;;;;; +1D344;TETRAGRAM FOR WATCH;So;0;ON;;;;;N;;;;; +1D345;TETRAGRAM FOR SINKING;So;0;ON;;;;;N;;;;; +1D346;TETRAGRAM FOR INNER;So;0;ON;;;;;N;;;;; +1D347;TETRAGRAM FOR DEPARTURE;So;0;ON;;;;;N;;;;; +1D348;TETRAGRAM FOR DARKENING;So;0;ON;;;;;N;;;;; +1D349;TETRAGRAM FOR DIMMING;So;0;ON;;;;;N;;;;; +1D34A;TETRAGRAM FOR EXHAUSTION;So;0;ON;;;;;N;;;;; +1D34B;TETRAGRAM FOR SEVERANCE;So;0;ON;;;;;N;;;;; +1D34C;TETRAGRAM FOR STOPPAGE;So;0;ON;;;;;N;;;;; +1D34D;TETRAGRAM FOR HARDNESS;So;0;ON;;;;;N;;;;; +1D34E;TETRAGRAM FOR COMPLETION;So;0;ON;;;;;N;;;;; +1D34F;TETRAGRAM FOR CLOSURE;So;0;ON;;;;;N;;;;; +1D350;TETRAGRAM FOR FAILURE;So;0;ON;;;;;N;;;;; +1D351;TETRAGRAM FOR AGGRAVATION;So;0;ON;;;;;N;;;;; +1D352;TETRAGRAM FOR COMPLIANCE;So;0;ON;;;;;N;;;;; +1D353;TETRAGRAM FOR ON THE VERGE;So;0;ON;;;;;N;;;;; +1D354;TETRAGRAM FOR DIFFICULTIES;So;0;ON;;;;;N;;;;; +1D355;TETRAGRAM FOR LABOURING;So;0;ON;;;;;N;;;;; +1D356;TETRAGRAM FOR FOSTERING;So;0;ON;;;;;N;;;;; +1D360;COUNTING ROD UNIT DIGIT ONE;No;0;L;;;;1;N;;;;; +1D361;COUNTING ROD UNIT DIGIT TWO;No;0;L;;;;2;N;;;;; +1D362;COUNTING ROD UNIT DIGIT THREE;No;0;L;;;;3;N;;;;; +1D363;COUNTING ROD UNIT DIGIT FOUR;No;0;L;;;;4;N;;;;; +1D364;COUNTING ROD UNIT DIGIT FIVE;No;0;L;;;;5;N;;;;; +1D365;COUNTING ROD UNIT DIGIT SIX;No;0;L;;;;6;N;;;;; +1D366;COUNTING ROD UNIT DIGIT SEVEN;No;0;L;;;;7;N;;;;; +1D367;COUNTING ROD UNIT DIGIT EIGHT;No;0;L;;;;8;N;;;;; +1D368;COUNTING ROD UNIT DIGIT NINE;No;0;L;;;;9;N;;;;; +1D369;COUNTING ROD TENS DIGIT ONE;No;0;L;;;;10;N;;;;; +1D36A;COUNTING ROD TENS DIGIT TWO;No;0;L;;;;20;N;;;;; +1D36B;COUNTING ROD TENS DIGIT THREE;No;0;L;;;;30;N;;;;; +1D36C;COUNTING ROD TENS DIGIT FOUR;No;0;L;;;;40;N;;;;; +1D36D;COUNTING ROD TENS DIGIT FIVE;No;0;L;;;;50;N;;;;; +1D36E;COUNTING ROD TENS DIGIT SIX;No;0;L;;;;60;N;;;;; +1D36F;COUNTING ROD TENS DIGIT SEVEN;No;0;L;;;;70;N;;;;; +1D370;COUNTING ROD TENS DIGIT EIGHT;No;0;L;;;;80;N;;;;; +1D371;COUNTING ROD TENS DIGIT NINE;No;0;L;;;;90;N;;;;; +1D372;IDEOGRAPHIC TALLY MARK ONE;No;0;L;;;;1;N;;;;; +1D373;IDEOGRAPHIC TALLY MARK TWO;No;0;L;;;;2;N;;;;; +1D374;IDEOGRAPHIC TALLY MARK THREE;No;0;L;;;;3;N;;;;; +1D375;IDEOGRAPHIC TALLY MARK FOUR;No;0;L;;;;4;N;;;;; +1D376;IDEOGRAPHIC TALLY MARK FIVE;No;0;L;;;;5;N;;;;; +1D377;TALLY MARK ONE;No;0;L;;;;1;N;;;;; +1D378;TALLY MARK FIVE;No;0;L;;;;5;N;;;;; +1D400;MATHEMATICAL BOLD CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;; +1D401;MATHEMATICAL BOLD CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;; +1D402;MATHEMATICAL BOLD CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;; +1D403;MATHEMATICAL BOLD CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;; +1D404;MATHEMATICAL BOLD CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;; +1D405;MATHEMATICAL BOLD CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;; +1D406;MATHEMATICAL BOLD CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;; +1D407;MATHEMATICAL BOLD CAPITAL H;Lu;0;L;<font> 0048;;;;N;;;;; +1D408;MATHEMATICAL BOLD CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;; +1D409;MATHEMATICAL BOLD CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;; +1D40A;MATHEMATICAL BOLD CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;; +1D40B;MATHEMATICAL BOLD CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;; +1D40C;MATHEMATICAL BOLD CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;; +1D40D;MATHEMATICAL BOLD CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;; +1D40E;MATHEMATICAL BOLD CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;; +1D40F;MATHEMATICAL BOLD CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;; +1D410;MATHEMATICAL BOLD CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;; +1D411;MATHEMATICAL BOLD CAPITAL R;Lu;0;L;<font> 0052;;;;N;;;;; +1D412;MATHEMATICAL BOLD CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;; +1D413;MATHEMATICAL BOLD CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;; +1D414;MATHEMATICAL BOLD CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;; +1D415;MATHEMATICAL BOLD CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;; +1D416;MATHEMATICAL BOLD CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;; +1D417;MATHEMATICAL BOLD CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;; +1D418;MATHEMATICAL BOLD CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;; +1D419;MATHEMATICAL BOLD CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;; +1D41A;MATHEMATICAL BOLD SMALL A;Ll;0;L;<font> 0061;;;;N;;;;; +1D41B;MATHEMATICAL BOLD SMALL B;Ll;0;L;<font> 0062;;;;N;;;;; +1D41C;MATHEMATICAL BOLD SMALL C;Ll;0;L;<font> 0063;;;;N;;;;; +1D41D;MATHEMATICAL BOLD SMALL D;Ll;0;L;<font> 0064;;;;N;;;;; +1D41E;MATHEMATICAL BOLD SMALL E;Ll;0;L;<font> 0065;;;;N;;;;; +1D41F;MATHEMATICAL BOLD SMALL F;Ll;0;L;<font> 0066;;;;N;;;;; +1D420;MATHEMATICAL BOLD SMALL G;Ll;0;L;<font> 0067;;;;N;;;;; +1D421;MATHEMATICAL BOLD SMALL H;Ll;0;L;<font> 0068;;;;N;;;;; +1D422;MATHEMATICAL BOLD SMALL I;Ll;0;L;<font> 0069;;;;N;;;;; +1D423;MATHEMATICAL BOLD SMALL J;Ll;0;L;<font> 006A;;;;N;;;;; +1D424;MATHEMATICAL BOLD SMALL K;Ll;0;L;<font> 006B;;;;N;;;;; +1D425;MATHEMATICAL BOLD SMALL L;Ll;0;L;<font> 006C;;;;N;;;;; +1D426;MATHEMATICAL BOLD SMALL M;Ll;0;L;<font> 006D;;;;N;;;;; +1D427;MATHEMATICAL BOLD SMALL N;Ll;0;L;<font> 006E;;;;N;;;;; +1D428;MATHEMATICAL BOLD SMALL O;Ll;0;L;<font> 006F;;;;N;;;;; +1D429;MATHEMATICAL BOLD SMALL P;Ll;0;L;<font> 0070;;;;N;;;;; +1D42A;MATHEMATICAL BOLD SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;; +1D42B;MATHEMATICAL BOLD SMALL R;Ll;0;L;<font> 0072;;;;N;;;;; +1D42C;MATHEMATICAL BOLD SMALL S;Ll;0;L;<font> 0073;;;;N;;;;; +1D42D;MATHEMATICAL BOLD SMALL T;Ll;0;L;<font> 0074;;;;N;;;;; +1D42E;MATHEMATICAL BOLD SMALL U;Ll;0;L;<font> 0075;;;;N;;;;; +1D42F;MATHEMATICAL BOLD SMALL V;Ll;0;L;<font> 0076;;;;N;;;;; +1D430;MATHEMATICAL BOLD SMALL W;Ll;0;L;<font> 0077;;;;N;;;;; +1D431;MATHEMATICAL BOLD SMALL X;Ll;0;L;<font> 0078;;;;N;;;;; +1D432;MATHEMATICAL BOLD SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;; +1D433;MATHEMATICAL BOLD SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;; +1D434;MATHEMATICAL ITALIC CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;; +1D435;MATHEMATICAL ITALIC CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;; +1D436;MATHEMATICAL ITALIC CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;; +1D437;MATHEMATICAL ITALIC CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;; +1D438;MATHEMATICAL ITALIC CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;; +1D439;MATHEMATICAL ITALIC CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;; +1D43A;MATHEMATICAL ITALIC CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;; +1D43B;MATHEMATICAL ITALIC CAPITAL H;Lu;0;L;<font> 0048;;;;N;;;;; +1D43C;MATHEMATICAL ITALIC CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;; +1D43D;MATHEMATICAL ITALIC CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;; +1D43E;MATHEMATICAL ITALIC CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;; +1D43F;MATHEMATICAL ITALIC CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;; +1D440;MATHEMATICAL ITALIC CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;; +1D441;MATHEMATICAL ITALIC CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;; +1D442;MATHEMATICAL ITALIC CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;; +1D443;MATHEMATICAL ITALIC CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;; +1D444;MATHEMATICAL ITALIC CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;; +1D445;MATHEMATICAL ITALIC CAPITAL R;Lu;0;L;<font> 0052;;;;N;;;;; +1D446;MATHEMATICAL ITALIC CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;; +1D447;MATHEMATICAL ITALIC CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;; +1D448;MATHEMATICAL ITALIC CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;; +1D449;MATHEMATICAL ITALIC CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;; +1D44A;MATHEMATICAL ITALIC CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;; +1D44B;MATHEMATICAL ITALIC CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;; +1D44C;MATHEMATICAL ITALIC CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;; +1D44D;MATHEMATICAL ITALIC CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;; +1D44E;MATHEMATICAL ITALIC SMALL A;Ll;0;L;<font> 0061;;;;N;;;;; +1D44F;MATHEMATICAL ITALIC SMALL B;Ll;0;L;<font> 0062;;;;N;;;;; +1D450;MATHEMATICAL ITALIC SMALL C;Ll;0;L;<font> 0063;;;;N;;;;; +1D451;MATHEMATICAL ITALIC SMALL D;Ll;0;L;<font> 0064;;;;N;;;;; +1D452;MATHEMATICAL ITALIC SMALL E;Ll;0;L;<font> 0065;;;;N;;;;; +1D453;MATHEMATICAL ITALIC SMALL F;Ll;0;L;<font> 0066;;;;N;;;;; +1D454;MATHEMATICAL ITALIC SMALL G;Ll;0;L;<font> 0067;;;;N;;;;; +1D456;MATHEMATICAL ITALIC SMALL I;Ll;0;L;<font> 0069;;;;N;;;;; +1D457;MATHEMATICAL ITALIC SMALL J;Ll;0;L;<font> 006A;;;;N;;;;; +1D458;MATHEMATICAL ITALIC SMALL K;Ll;0;L;<font> 006B;;;;N;;;;; +1D459;MATHEMATICAL ITALIC SMALL L;Ll;0;L;<font> 006C;;;;N;;;;; +1D45A;MATHEMATICAL ITALIC SMALL M;Ll;0;L;<font> 006D;;;;N;;;;; +1D45B;MATHEMATICAL ITALIC SMALL N;Ll;0;L;<font> 006E;;;;N;;;;; +1D45C;MATHEMATICAL ITALIC SMALL O;Ll;0;L;<font> 006F;;;;N;;;;; +1D45D;MATHEMATICAL ITALIC SMALL P;Ll;0;L;<font> 0070;;;;N;;;;; +1D45E;MATHEMATICAL ITALIC SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;; +1D45F;MATHEMATICAL ITALIC SMALL R;Ll;0;L;<font> 0072;;;;N;;;;; +1D460;MATHEMATICAL ITALIC SMALL S;Ll;0;L;<font> 0073;;;;N;;;;; +1D461;MATHEMATICAL ITALIC SMALL T;Ll;0;L;<font> 0074;;;;N;;;;; +1D462;MATHEMATICAL ITALIC SMALL U;Ll;0;L;<font> 0075;;;;N;;;;; +1D463;MATHEMATICAL ITALIC SMALL V;Ll;0;L;<font> 0076;;;;N;;;;; +1D464;MATHEMATICAL ITALIC SMALL W;Ll;0;L;<font> 0077;;;;N;;;;; +1D465;MATHEMATICAL ITALIC SMALL X;Ll;0;L;<font> 0078;;;;N;;;;; +1D466;MATHEMATICAL ITALIC SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;; +1D467;MATHEMATICAL ITALIC SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;; +1D468;MATHEMATICAL BOLD ITALIC CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;; +1D469;MATHEMATICAL BOLD ITALIC CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;; +1D46A;MATHEMATICAL BOLD ITALIC CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;; +1D46B;MATHEMATICAL BOLD ITALIC CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;; +1D46C;MATHEMATICAL BOLD ITALIC CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;; +1D46D;MATHEMATICAL BOLD ITALIC CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;; +1D46E;MATHEMATICAL BOLD ITALIC CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;; +1D46F;MATHEMATICAL BOLD ITALIC CAPITAL H;Lu;0;L;<font> 0048;;;;N;;;;; +1D470;MATHEMATICAL BOLD ITALIC CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;; +1D471;MATHEMATICAL BOLD ITALIC CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;; +1D472;MATHEMATICAL BOLD ITALIC CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;; +1D473;MATHEMATICAL BOLD ITALIC CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;; +1D474;MATHEMATICAL BOLD ITALIC CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;; +1D475;MATHEMATICAL BOLD ITALIC CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;; +1D476;MATHEMATICAL BOLD ITALIC CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;; +1D477;MATHEMATICAL BOLD ITALIC CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;; +1D478;MATHEMATICAL BOLD ITALIC CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;; +1D479;MATHEMATICAL BOLD ITALIC CAPITAL R;Lu;0;L;<font> 0052;;;;N;;;;; +1D47A;MATHEMATICAL BOLD ITALIC CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;; +1D47B;MATHEMATICAL BOLD ITALIC CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;; +1D47C;MATHEMATICAL BOLD ITALIC CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;; +1D47D;MATHEMATICAL BOLD ITALIC CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;; +1D47E;MATHEMATICAL BOLD ITALIC CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;; +1D47F;MATHEMATICAL BOLD ITALIC CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;; +1D480;MATHEMATICAL BOLD ITALIC CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;; +1D481;MATHEMATICAL BOLD ITALIC CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;; +1D482;MATHEMATICAL BOLD ITALIC SMALL A;Ll;0;L;<font> 0061;;;;N;;;;; +1D483;MATHEMATICAL BOLD ITALIC SMALL B;Ll;0;L;<font> 0062;;;;N;;;;; +1D484;MATHEMATICAL BOLD ITALIC SMALL C;Ll;0;L;<font> 0063;;;;N;;;;; +1D485;MATHEMATICAL BOLD ITALIC SMALL D;Ll;0;L;<font> 0064;;;;N;;;;; +1D486;MATHEMATICAL BOLD ITALIC SMALL E;Ll;0;L;<font> 0065;;;;N;;;;; +1D487;MATHEMATICAL BOLD ITALIC SMALL F;Ll;0;L;<font> 0066;;;;N;;;;; +1D488;MATHEMATICAL BOLD ITALIC SMALL G;Ll;0;L;<font> 0067;;;;N;;;;; +1D489;MATHEMATICAL BOLD ITALIC SMALL H;Ll;0;L;<font> 0068;;;;N;;;;; +1D48A;MATHEMATICAL BOLD ITALIC SMALL I;Ll;0;L;<font> 0069;;;;N;;;;; +1D48B;MATHEMATICAL BOLD ITALIC SMALL J;Ll;0;L;<font> 006A;;;;N;;;;; +1D48C;MATHEMATICAL BOLD ITALIC SMALL K;Ll;0;L;<font> 006B;;;;N;;;;; +1D48D;MATHEMATICAL BOLD ITALIC SMALL L;Ll;0;L;<font> 006C;;;;N;;;;; +1D48E;MATHEMATICAL BOLD ITALIC SMALL M;Ll;0;L;<font> 006D;;;;N;;;;; +1D48F;MATHEMATICAL BOLD ITALIC SMALL N;Ll;0;L;<font> 006E;;;;N;;;;; +1D490;MATHEMATICAL BOLD ITALIC SMALL O;Ll;0;L;<font> 006F;;;;N;;;;; +1D491;MATHEMATICAL BOLD ITALIC SMALL P;Ll;0;L;<font> 0070;;;;N;;;;; +1D492;MATHEMATICAL BOLD ITALIC SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;; +1D493;MATHEMATICAL BOLD ITALIC SMALL R;Ll;0;L;<font> 0072;;;;N;;;;; +1D494;MATHEMATICAL BOLD ITALIC SMALL S;Ll;0;L;<font> 0073;;;;N;;;;; +1D495;MATHEMATICAL BOLD ITALIC SMALL T;Ll;0;L;<font> 0074;;;;N;;;;; +1D496;MATHEMATICAL BOLD ITALIC SMALL U;Ll;0;L;<font> 0075;;;;N;;;;; +1D497;MATHEMATICAL BOLD ITALIC SMALL V;Ll;0;L;<font> 0076;;;;N;;;;; +1D498;MATHEMATICAL BOLD ITALIC SMALL W;Ll;0;L;<font> 0077;;;;N;;;;; +1D499;MATHEMATICAL BOLD ITALIC SMALL X;Ll;0;L;<font> 0078;;;;N;;;;; +1D49A;MATHEMATICAL BOLD ITALIC SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;; +1D49B;MATHEMATICAL BOLD ITALIC SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;; +1D49C;MATHEMATICAL SCRIPT CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;; +1D49E;MATHEMATICAL SCRIPT CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;; +1D49F;MATHEMATICAL SCRIPT CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;; +1D4A2;MATHEMATICAL SCRIPT CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;; +1D4A5;MATHEMATICAL SCRIPT CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;; +1D4A6;MATHEMATICAL SCRIPT CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;; +1D4A9;MATHEMATICAL SCRIPT CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;; +1D4AA;MATHEMATICAL SCRIPT CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;; +1D4AB;MATHEMATICAL SCRIPT CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;; +1D4AC;MATHEMATICAL SCRIPT CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;; +1D4AE;MATHEMATICAL SCRIPT CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;; +1D4AF;MATHEMATICAL SCRIPT CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;; +1D4B0;MATHEMATICAL SCRIPT CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;; +1D4B1;MATHEMATICAL SCRIPT CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;; +1D4B2;MATHEMATICAL SCRIPT CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;; +1D4B3;MATHEMATICAL SCRIPT CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;; +1D4B4;MATHEMATICAL SCRIPT CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;; +1D4B5;MATHEMATICAL SCRIPT CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;; +1D4B6;MATHEMATICAL SCRIPT SMALL A;Ll;0;L;<font> 0061;;;;N;;;;; +1D4B7;MATHEMATICAL SCRIPT SMALL B;Ll;0;L;<font> 0062;;;;N;;;;; +1D4B8;MATHEMATICAL SCRIPT SMALL C;Ll;0;L;<font> 0063;;;;N;;;;; +1D4B9;MATHEMATICAL SCRIPT SMALL D;Ll;0;L;<font> 0064;;;;N;;;;; +1D4BB;MATHEMATICAL SCRIPT SMALL F;Ll;0;L;<font> 0066;;;;N;;;;; +1D4BD;MATHEMATICAL SCRIPT SMALL H;Ll;0;L;<font> 0068;;;;N;;;;; +1D4BE;MATHEMATICAL SCRIPT SMALL I;Ll;0;L;<font> 0069;;;;N;;;;; +1D4BF;MATHEMATICAL SCRIPT SMALL J;Ll;0;L;<font> 006A;;;;N;;;;; +1D4C0;MATHEMATICAL SCRIPT SMALL K;Ll;0;L;<font> 006B;;;;N;;;;; +1D4C1;MATHEMATICAL SCRIPT SMALL L;Ll;0;L;<font> 006C;;;;N;;;;; +1D4C2;MATHEMATICAL SCRIPT SMALL M;Ll;0;L;<font> 006D;;;;N;;;;; +1D4C3;MATHEMATICAL SCRIPT SMALL N;Ll;0;L;<font> 006E;;;;N;;;;; +1D4C5;MATHEMATICAL SCRIPT SMALL P;Ll;0;L;<font> 0070;;;;N;;;;; +1D4C6;MATHEMATICAL SCRIPT SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;; +1D4C7;MATHEMATICAL SCRIPT SMALL R;Ll;0;L;<font> 0072;;;;N;;;;; +1D4C8;MATHEMATICAL SCRIPT SMALL S;Ll;0;L;<font> 0073;;;;N;;;;; +1D4C9;MATHEMATICAL SCRIPT SMALL T;Ll;0;L;<font> 0074;;;;N;;;;; +1D4CA;MATHEMATICAL SCRIPT SMALL U;Ll;0;L;<font> 0075;;;;N;;;;; +1D4CB;MATHEMATICAL SCRIPT SMALL V;Ll;0;L;<font> 0076;;;;N;;;;; +1D4CC;MATHEMATICAL SCRIPT SMALL W;Ll;0;L;<font> 0077;;;;N;;;;; +1D4CD;MATHEMATICAL SCRIPT SMALL X;Ll;0;L;<font> 0078;;;;N;;;;; +1D4CE;MATHEMATICAL SCRIPT SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;; +1D4CF;MATHEMATICAL SCRIPT SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;; +1D4D0;MATHEMATICAL BOLD SCRIPT CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;; +1D4D1;MATHEMATICAL BOLD SCRIPT CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;; +1D4D2;MATHEMATICAL BOLD SCRIPT CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;; +1D4D3;MATHEMATICAL BOLD SCRIPT CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;; +1D4D4;MATHEMATICAL BOLD SCRIPT CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;; +1D4D5;MATHEMATICAL BOLD SCRIPT CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;; +1D4D6;MATHEMATICAL BOLD SCRIPT CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;; +1D4D7;MATHEMATICAL BOLD SCRIPT CAPITAL H;Lu;0;L;<font> 0048;;;;N;;;;; +1D4D8;MATHEMATICAL BOLD SCRIPT CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;; +1D4D9;MATHEMATICAL BOLD SCRIPT CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;; +1D4DA;MATHEMATICAL BOLD SCRIPT CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;; +1D4DB;MATHEMATICAL BOLD SCRIPT CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;; +1D4DC;MATHEMATICAL BOLD SCRIPT CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;; +1D4DD;MATHEMATICAL BOLD SCRIPT CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;; +1D4DE;MATHEMATICAL BOLD SCRIPT CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;; +1D4DF;MATHEMATICAL BOLD SCRIPT CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;; +1D4E0;MATHEMATICAL BOLD SCRIPT CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;; +1D4E1;MATHEMATICAL BOLD SCRIPT CAPITAL R;Lu;0;L;<font> 0052;;;;N;;;;; +1D4E2;MATHEMATICAL BOLD SCRIPT CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;; +1D4E3;MATHEMATICAL BOLD SCRIPT CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;; +1D4E4;MATHEMATICAL BOLD SCRIPT CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;; +1D4E5;MATHEMATICAL BOLD SCRIPT CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;; +1D4E6;MATHEMATICAL BOLD SCRIPT CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;; +1D4E7;MATHEMATICAL BOLD SCRIPT CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;; +1D4E8;MATHEMATICAL BOLD SCRIPT CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;; +1D4E9;MATHEMATICAL BOLD SCRIPT CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;; +1D4EA;MATHEMATICAL BOLD SCRIPT SMALL A;Ll;0;L;<font> 0061;;;;N;;;;; +1D4EB;MATHEMATICAL BOLD SCRIPT SMALL B;Ll;0;L;<font> 0062;;;;N;;;;; +1D4EC;MATHEMATICAL BOLD SCRIPT SMALL C;Ll;0;L;<font> 0063;;;;N;;;;; +1D4ED;MATHEMATICAL BOLD SCRIPT SMALL D;Ll;0;L;<font> 0064;;;;N;;;;; +1D4EE;MATHEMATICAL BOLD SCRIPT SMALL E;Ll;0;L;<font> 0065;;;;N;;;;; +1D4EF;MATHEMATICAL BOLD SCRIPT SMALL F;Ll;0;L;<font> 0066;;;;N;;;;; +1D4F0;MATHEMATICAL BOLD SCRIPT SMALL G;Ll;0;L;<font> 0067;;;;N;;;;; +1D4F1;MATHEMATICAL BOLD SCRIPT SMALL H;Ll;0;L;<font> 0068;;;;N;;;;; +1D4F2;MATHEMATICAL BOLD SCRIPT SMALL I;Ll;0;L;<font> 0069;;;;N;;;;; +1D4F3;MATHEMATICAL BOLD SCRIPT SMALL J;Ll;0;L;<font> 006A;;;;N;;;;; +1D4F4;MATHEMATICAL BOLD SCRIPT SMALL K;Ll;0;L;<font> 006B;;;;N;;;;; +1D4F5;MATHEMATICAL BOLD SCRIPT SMALL L;Ll;0;L;<font> 006C;;;;N;;;;; +1D4F6;MATHEMATICAL BOLD SCRIPT SMALL M;Ll;0;L;<font> 006D;;;;N;;;;; +1D4F7;MATHEMATICAL BOLD SCRIPT SMALL N;Ll;0;L;<font> 006E;;;;N;;;;; +1D4F8;MATHEMATICAL BOLD SCRIPT SMALL O;Ll;0;L;<font> 006F;;;;N;;;;; +1D4F9;MATHEMATICAL BOLD SCRIPT SMALL P;Ll;0;L;<font> 0070;;;;N;;;;; +1D4FA;MATHEMATICAL BOLD SCRIPT SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;; +1D4FB;MATHEMATICAL BOLD SCRIPT SMALL R;Ll;0;L;<font> 0072;;;;N;;;;; +1D4FC;MATHEMATICAL BOLD SCRIPT SMALL S;Ll;0;L;<font> 0073;;;;N;;;;; +1D4FD;MATHEMATICAL BOLD SCRIPT SMALL T;Ll;0;L;<font> 0074;;;;N;;;;; +1D4FE;MATHEMATICAL BOLD SCRIPT SMALL U;Ll;0;L;<font> 0075;;;;N;;;;; +1D4FF;MATHEMATICAL BOLD SCRIPT SMALL V;Ll;0;L;<font> 0076;;;;N;;;;; +1D500;MATHEMATICAL BOLD SCRIPT SMALL W;Ll;0;L;<font> 0077;;;;N;;;;; +1D501;MATHEMATICAL BOLD SCRIPT SMALL X;Ll;0;L;<font> 0078;;;;N;;;;; +1D502;MATHEMATICAL BOLD SCRIPT SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;; +1D503;MATHEMATICAL BOLD SCRIPT SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;; +1D504;MATHEMATICAL FRAKTUR CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;; +1D505;MATHEMATICAL FRAKTUR CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;; +1D507;MATHEMATICAL FRAKTUR CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;; +1D508;MATHEMATICAL FRAKTUR CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;; +1D509;MATHEMATICAL FRAKTUR CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;; +1D50A;MATHEMATICAL FRAKTUR CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;; +1D50D;MATHEMATICAL FRAKTUR CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;; +1D50E;MATHEMATICAL FRAKTUR CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;; +1D50F;MATHEMATICAL FRAKTUR CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;; +1D510;MATHEMATICAL FRAKTUR CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;; +1D511;MATHEMATICAL FRAKTUR CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;; +1D512;MATHEMATICAL FRAKTUR CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;; +1D513;MATHEMATICAL FRAKTUR CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;; +1D514;MATHEMATICAL FRAKTUR CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;; +1D516;MATHEMATICAL FRAKTUR CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;; +1D517;MATHEMATICAL FRAKTUR CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;; +1D518;MATHEMATICAL FRAKTUR CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;; +1D519;MATHEMATICAL FRAKTUR CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;; +1D51A;MATHEMATICAL FRAKTUR CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;; +1D51B;MATHEMATICAL FRAKTUR CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;; +1D51C;MATHEMATICAL FRAKTUR CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;; +1D51E;MATHEMATICAL FRAKTUR SMALL A;Ll;0;L;<font> 0061;;;;N;;;;; +1D51F;MATHEMATICAL FRAKTUR SMALL B;Ll;0;L;<font> 0062;;;;N;;;;; +1D520;MATHEMATICAL FRAKTUR SMALL C;Ll;0;L;<font> 0063;;;;N;;;;; +1D521;MATHEMATICAL FRAKTUR SMALL D;Ll;0;L;<font> 0064;;;;N;;;;; +1D522;MATHEMATICAL FRAKTUR SMALL E;Ll;0;L;<font> 0065;;;;N;;;;; +1D523;MATHEMATICAL FRAKTUR SMALL F;Ll;0;L;<font> 0066;;;;N;;;;; +1D524;MATHEMATICAL FRAKTUR SMALL G;Ll;0;L;<font> 0067;;;;N;;;;; +1D525;MATHEMATICAL FRAKTUR SMALL H;Ll;0;L;<font> 0068;;;;N;;;;; +1D526;MATHEMATICAL FRAKTUR SMALL I;Ll;0;L;<font> 0069;;;;N;;;;; +1D527;MATHEMATICAL FRAKTUR SMALL J;Ll;0;L;<font> 006A;;;;N;;;;; +1D528;MATHEMATICAL FRAKTUR SMALL K;Ll;0;L;<font> 006B;;;;N;;;;; +1D529;MATHEMATICAL FRAKTUR SMALL L;Ll;0;L;<font> 006C;;;;N;;;;; +1D52A;MATHEMATICAL FRAKTUR SMALL M;Ll;0;L;<font> 006D;;;;N;;;;; +1D52B;MATHEMATICAL FRAKTUR SMALL N;Ll;0;L;<font> 006E;;;;N;;;;; +1D52C;MATHEMATICAL FRAKTUR SMALL O;Ll;0;L;<font> 006F;;;;N;;;;; +1D52D;MATHEMATICAL FRAKTUR SMALL P;Ll;0;L;<font> 0070;;;;N;;;;; +1D52E;MATHEMATICAL FRAKTUR SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;; +1D52F;MATHEMATICAL FRAKTUR SMALL R;Ll;0;L;<font> 0072;;;;N;;;;; +1D530;MATHEMATICAL FRAKTUR SMALL S;Ll;0;L;<font> 0073;;;;N;;;;; +1D531;MATHEMATICAL FRAKTUR SMALL T;Ll;0;L;<font> 0074;;;;N;;;;; +1D532;MATHEMATICAL FRAKTUR SMALL U;Ll;0;L;<font> 0075;;;;N;;;;; +1D533;MATHEMATICAL FRAKTUR SMALL V;Ll;0;L;<font> 0076;;;;N;;;;; +1D534;MATHEMATICAL FRAKTUR SMALL W;Ll;0;L;<font> 0077;;;;N;;;;; +1D535;MATHEMATICAL FRAKTUR SMALL X;Ll;0;L;<font> 0078;;;;N;;;;; +1D536;MATHEMATICAL FRAKTUR SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;; +1D537;MATHEMATICAL FRAKTUR SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;; +1D538;MATHEMATICAL DOUBLE-STRUCK CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;; +1D539;MATHEMATICAL DOUBLE-STRUCK CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;; +1D53B;MATHEMATICAL DOUBLE-STRUCK CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;; +1D53C;MATHEMATICAL DOUBLE-STRUCK CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;; +1D53D;MATHEMATICAL DOUBLE-STRUCK CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;; +1D53E;MATHEMATICAL DOUBLE-STRUCK CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;; +1D540;MATHEMATICAL DOUBLE-STRUCK CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;; +1D541;MATHEMATICAL DOUBLE-STRUCK CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;; +1D542;MATHEMATICAL DOUBLE-STRUCK CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;; +1D543;MATHEMATICAL DOUBLE-STRUCK CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;; +1D544;MATHEMATICAL DOUBLE-STRUCK CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;; +1D546;MATHEMATICAL DOUBLE-STRUCK CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;; +1D54A;MATHEMATICAL DOUBLE-STRUCK CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;; +1D54B;MATHEMATICAL DOUBLE-STRUCK CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;; +1D54C;MATHEMATICAL DOUBLE-STRUCK CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;; +1D54D;MATHEMATICAL DOUBLE-STRUCK CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;; +1D54E;MATHEMATICAL DOUBLE-STRUCK CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;; +1D54F;MATHEMATICAL DOUBLE-STRUCK CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;; +1D550;MATHEMATICAL DOUBLE-STRUCK CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;; +1D552;MATHEMATICAL DOUBLE-STRUCK SMALL A;Ll;0;L;<font> 0061;;;;N;;;;; +1D553;MATHEMATICAL DOUBLE-STRUCK SMALL B;Ll;0;L;<font> 0062;;;;N;;;;; +1D554;MATHEMATICAL DOUBLE-STRUCK SMALL C;Ll;0;L;<font> 0063;;;;N;;;;; +1D555;MATHEMATICAL DOUBLE-STRUCK SMALL D;Ll;0;L;<font> 0064;;;;N;;;;; +1D556;MATHEMATICAL DOUBLE-STRUCK SMALL E;Ll;0;L;<font> 0065;;;;N;;;;; +1D557;MATHEMATICAL DOUBLE-STRUCK SMALL F;Ll;0;L;<font> 0066;;;;N;;;;; +1D558;MATHEMATICAL DOUBLE-STRUCK SMALL G;Ll;0;L;<font> 0067;;;;N;;;;; +1D559;MATHEMATICAL DOUBLE-STRUCK SMALL H;Ll;0;L;<font> 0068;;;;N;;;;; +1D55A;MATHEMATICAL DOUBLE-STRUCK SMALL I;Ll;0;L;<font> 0069;;;;N;;;;; +1D55B;MATHEMATICAL DOUBLE-STRUCK SMALL J;Ll;0;L;<font> 006A;;;;N;;;;; +1D55C;MATHEMATICAL DOUBLE-STRUCK SMALL K;Ll;0;L;<font> 006B;;;;N;;;;; +1D55D;MATHEMATICAL DOUBLE-STRUCK SMALL L;Ll;0;L;<font> 006C;;;;N;;;;; +1D55E;MATHEMATICAL DOUBLE-STRUCK SMALL M;Ll;0;L;<font> 006D;;;;N;;;;; +1D55F;MATHEMATICAL DOUBLE-STRUCK SMALL N;Ll;0;L;<font> 006E;;;;N;;;;; +1D560;MATHEMATICAL DOUBLE-STRUCK SMALL O;Ll;0;L;<font> 006F;;;;N;;;;; +1D561;MATHEMATICAL DOUBLE-STRUCK SMALL P;Ll;0;L;<font> 0070;;;;N;;;;; +1D562;MATHEMATICAL DOUBLE-STRUCK SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;; +1D563;MATHEMATICAL DOUBLE-STRUCK SMALL R;Ll;0;L;<font> 0072;;;;N;;;;; +1D564;MATHEMATICAL DOUBLE-STRUCK SMALL S;Ll;0;L;<font> 0073;;;;N;;;;; +1D565;MATHEMATICAL DOUBLE-STRUCK SMALL T;Ll;0;L;<font> 0074;;;;N;;;;; +1D566;MATHEMATICAL DOUBLE-STRUCK SMALL U;Ll;0;L;<font> 0075;;;;N;;;;; +1D567;MATHEMATICAL DOUBLE-STRUCK SMALL V;Ll;0;L;<font> 0076;;;;N;;;;; +1D568;MATHEMATICAL DOUBLE-STRUCK SMALL W;Ll;0;L;<font> 0077;;;;N;;;;; +1D569;MATHEMATICAL DOUBLE-STRUCK SMALL X;Ll;0;L;<font> 0078;;;;N;;;;; +1D56A;MATHEMATICAL DOUBLE-STRUCK SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;; +1D56B;MATHEMATICAL DOUBLE-STRUCK SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;; +1D56C;MATHEMATICAL BOLD FRAKTUR CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;; +1D56D;MATHEMATICAL BOLD FRAKTUR CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;; +1D56E;MATHEMATICAL BOLD FRAKTUR CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;; +1D56F;MATHEMATICAL BOLD FRAKTUR CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;; +1D570;MATHEMATICAL BOLD FRAKTUR CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;; +1D571;MATHEMATICAL BOLD FRAKTUR CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;; +1D572;MATHEMATICAL BOLD FRAKTUR CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;; +1D573;MATHEMATICAL BOLD FRAKTUR CAPITAL H;Lu;0;L;<font> 0048;;;;N;;;;; +1D574;MATHEMATICAL BOLD FRAKTUR CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;; +1D575;MATHEMATICAL BOLD FRAKTUR CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;; +1D576;MATHEMATICAL BOLD FRAKTUR CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;; +1D577;MATHEMATICAL BOLD FRAKTUR CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;; +1D578;MATHEMATICAL BOLD FRAKTUR CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;; +1D579;MATHEMATICAL BOLD FRAKTUR CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;; +1D57A;MATHEMATICAL BOLD FRAKTUR CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;; +1D57B;MATHEMATICAL BOLD FRAKTUR CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;; +1D57C;MATHEMATICAL BOLD FRAKTUR CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;; +1D57D;MATHEMATICAL BOLD FRAKTUR CAPITAL R;Lu;0;L;<font> 0052;;;;N;;;;; +1D57E;MATHEMATICAL BOLD FRAKTUR CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;; +1D57F;MATHEMATICAL BOLD FRAKTUR CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;; +1D580;MATHEMATICAL BOLD FRAKTUR CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;; +1D581;MATHEMATICAL BOLD FRAKTUR CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;; +1D582;MATHEMATICAL BOLD FRAKTUR CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;; +1D583;MATHEMATICAL BOLD FRAKTUR CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;; +1D584;MATHEMATICAL BOLD FRAKTUR CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;; +1D585;MATHEMATICAL BOLD FRAKTUR CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;; +1D586;MATHEMATICAL BOLD FRAKTUR SMALL A;Ll;0;L;<font> 0061;;;;N;;;;; +1D587;MATHEMATICAL BOLD FRAKTUR SMALL B;Ll;0;L;<font> 0062;;;;N;;;;; +1D588;MATHEMATICAL BOLD FRAKTUR SMALL C;Ll;0;L;<font> 0063;;;;N;;;;; +1D589;MATHEMATICAL BOLD FRAKTUR SMALL D;Ll;0;L;<font> 0064;;;;N;;;;; +1D58A;MATHEMATICAL BOLD FRAKTUR SMALL E;Ll;0;L;<font> 0065;;;;N;;;;; +1D58B;MATHEMATICAL BOLD FRAKTUR SMALL F;Ll;0;L;<font> 0066;;;;N;;;;; +1D58C;MATHEMATICAL BOLD FRAKTUR SMALL G;Ll;0;L;<font> 0067;;;;N;;;;; +1D58D;MATHEMATICAL BOLD FRAKTUR SMALL H;Ll;0;L;<font> 0068;;;;N;;;;; +1D58E;MATHEMATICAL BOLD FRAKTUR SMALL I;Ll;0;L;<font> 0069;;;;N;;;;; +1D58F;MATHEMATICAL BOLD FRAKTUR SMALL J;Ll;0;L;<font> 006A;;;;N;;;;; +1D590;MATHEMATICAL BOLD FRAKTUR SMALL K;Ll;0;L;<font> 006B;;;;N;;;;; +1D591;MATHEMATICAL BOLD FRAKTUR SMALL L;Ll;0;L;<font> 006C;;;;N;;;;; +1D592;MATHEMATICAL BOLD FRAKTUR SMALL M;Ll;0;L;<font> 006D;;;;N;;;;; +1D593;MATHEMATICAL BOLD FRAKTUR SMALL N;Ll;0;L;<font> 006E;;;;N;;;;; +1D594;MATHEMATICAL BOLD FRAKTUR SMALL O;Ll;0;L;<font> 006F;;;;N;;;;; +1D595;MATHEMATICAL BOLD FRAKTUR SMALL P;Ll;0;L;<font> 0070;;;;N;;;;; +1D596;MATHEMATICAL BOLD FRAKTUR SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;; +1D597;MATHEMATICAL BOLD FRAKTUR SMALL R;Ll;0;L;<font> 0072;;;;N;;;;; +1D598;MATHEMATICAL BOLD FRAKTUR SMALL S;Ll;0;L;<font> 0073;;;;N;;;;; +1D599;MATHEMATICAL BOLD FRAKTUR SMALL T;Ll;0;L;<font> 0074;;;;N;;;;; +1D59A;MATHEMATICAL BOLD FRAKTUR SMALL U;Ll;0;L;<font> 0075;;;;N;;;;; +1D59B;MATHEMATICAL BOLD FRAKTUR SMALL V;Ll;0;L;<font> 0076;;;;N;;;;; +1D59C;MATHEMATICAL BOLD FRAKTUR SMALL W;Ll;0;L;<font> 0077;;;;N;;;;; +1D59D;MATHEMATICAL BOLD FRAKTUR SMALL X;Ll;0;L;<font> 0078;;;;N;;;;; +1D59E;MATHEMATICAL BOLD FRAKTUR SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;; +1D59F;MATHEMATICAL BOLD FRAKTUR SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;; +1D5A0;MATHEMATICAL SANS-SERIF CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;; +1D5A1;MATHEMATICAL SANS-SERIF CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;; +1D5A2;MATHEMATICAL SANS-SERIF CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;; +1D5A3;MATHEMATICAL SANS-SERIF CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;; +1D5A4;MATHEMATICAL SANS-SERIF CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;; +1D5A5;MATHEMATICAL SANS-SERIF CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;; +1D5A6;MATHEMATICAL SANS-SERIF CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;; +1D5A7;MATHEMATICAL SANS-SERIF CAPITAL H;Lu;0;L;<font> 0048;;;;N;;;;; +1D5A8;MATHEMATICAL SANS-SERIF CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;; +1D5A9;MATHEMATICAL SANS-SERIF CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;; +1D5AA;MATHEMATICAL SANS-SERIF CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;; +1D5AB;MATHEMATICAL SANS-SERIF CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;; +1D5AC;MATHEMATICAL SANS-SERIF CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;; +1D5AD;MATHEMATICAL SANS-SERIF CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;; +1D5AE;MATHEMATICAL SANS-SERIF CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;; +1D5AF;MATHEMATICAL SANS-SERIF CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;; +1D5B0;MATHEMATICAL SANS-SERIF CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;; +1D5B1;MATHEMATICAL SANS-SERIF CAPITAL R;Lu;0;L;<font> 0052;;;;N;;;;; +1D5B2;MATHEMATICAL SANS-SERIF CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;; +1D5B3;MATHEMATICAL SANS-SERIF CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;; +1D5B4;MATHEMATICAL SANS-SERIF CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;; +1D5B5;MATHEMATICAL SANS-SERIF CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;; +1D5B6;MATHEMATICAL SANS-SERIF CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;; +1D5B7;MATHEMATICAL SANS-SERIF CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;; +1D5B8;MATHEMATICAL SANS-SERIF CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;; +1D5B9;MATHEMATICAL SANS-SERIF CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;; +1D5BA;MATHEMATICAL SANS-SERIF SMALL A;Ll;0;L;<font> 0061;;;;N;;;;; +1D5BB;MATHEMATICAL SANS-SERIF SMALL B;Ll;0;L;<font> 0062;;;;N;;;;; +1D5BC;MATHEMATICAL SANS-SERIF SMALL C;Ll;0;L;<font> 0063;;;;N;;;;; +1D5BD;MATHEMATICAL SANS-SERIF SMALL D;Ll;0;L;<font> 0064;;;;N;;;;; +1D5BE;MATHEMATICAL SANS-SERIF SMALL E;Ll;0;L;<font> 0065;;;;N;;;;; +1D5BF;MATHEMATICAL SANS-SERIF SMALL F;Ll;0;L;<font> 0066;;;;N;;;;; +1D5C0;MATHEMATICAL SANS-SERIF SMALL G;Ll;0;L;<font> 0067;;;;N;;;;; +1D5C1;MATHEMATICAL SANS-SERIF SMALL H;Ll;0;L;<font> 0068;;;;N;;;;; +1D5C2;MATHEMATICAL SANS-SERIF SMALL I;Ll;0;L;<font> 0069;;;;N;;;;; +1D5C3;MATHEMATICAL SANS-SERIF SMALL J;Ll;0;L;<font> 006A;;;;N;;;;; +1D5C4;MATHEMATICAL SANS-SERIF SMALL K;Ll;0;L;<font> 006B;;;;N;;;;; +1D5C5;MATHEMATICAL SANS-SERIF SMALL L;Ll;0;L;<font> 006C;;;;N;;;;; +1D5C6;MATHEMATICAL SANS-SERIF SMALL M;Ll;0;L;<font> 006D;;;;N;;;;; +1D5C7;MATHEMATICAL SANS-SERIF SMALL N;Ll;0;L;<font> 006E;;;;N;;;;; +1D5C8;MATHEMATICAL SANS-SERIF SMALL O;Ll;0;L;<font> 006F;;;;N;;;;; +1D5C9;MATHEMATICAL SANS-SERIF SMALL P;Ll;0;L;<font> 0070;;;;N;;;;; +1D5CA;MATHEMATICAL SANS-SERIF SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;; +1D5CB;MATHEMATICAL SANS-SERIF SMALL R;Ll;0;L;<font> 0072;;;;N;;;;; +1D5CC;MATHEMATICAL SANS-SERIF SMALL S;Ll;0;L;<font> 0073;;;;N;;;;; +1D5CD;MATHEMATICAL SANS-SERIF SMALL T;Ll;0;L;<font> 0074;;;;N;;;;; +1D5CE;MATHEMATICAL SANS-SERIF SMALL U;Ll;0;L;<font> 0075;;;;N;;;;; +1D5CF;MATHEMATICAL SANS-SERIF SMALL V;Ll;0;L;<font> 0076;;;;N;;;;; +1D5D0;MATHEMATICAL SANS-SERIF SMALL W;Ll;0;L;<font> 0077;;;;N;;;;; +1D5D1;MATHEMATICAL SANS-SERIF SMALL X;Ll;0;L;<font> 0078;;;;N;;;;; +1D5D2;MATHEMATICAL SANS-SERIF SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;; +1D5D3;MATHEMATICAL SANS-SERIF SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;; +1D5D4;MATHEMATICAL SANS-SERIF BOLD CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;; +1D5D5;MATHEMATICAL SANS-SERIF BOLD CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;; +1D5D6;MATHEMATICAL SANS-SERIF BOLD CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;; +1D5D7;MATHEMATICAL SANS-SERIF BOLD CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;; +1D5D8;MATHEMATICAL SANS-SERIF BOLD CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;; +1D5D9;MATHEMATICAL SANS-SERIF BOLD CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;; +1D5DA;MATHEMATICAL SANS-SERIF BOLD CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;; +1D5DB;MATHEMATICAL SANS-SERIF BOLD CAPITAL H;Lu;0;L;<font> 0048;;;;N;;;;; +1D5DC;MATHEMATICAL SANS-SERIF BOLD CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;; +1D5DD;MATHEMATICAL SANS-SERIF BOLD CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;; +1D5DE;MATHEMATICAL SANS-SERIF BOLD CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;; +1D5DF;MATHEMATICAL SANS-SERIF BOLD CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;; +1D5E0;MATHEMATICAL SANS-SERIF BOLD CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;; +1D5E1;MATHEMATICAL SANS-SERIF BOLD CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;; +1D5E2;MATHEMATICAL SANS-SERIF BOLD CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;; +1D5E3;MATHEMATICAL SANS-SERIF BOLD CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;; +1D5E4;MATHEMATICAL SANS-SERIF BOLD CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;; +1D5E5;MATHEMATICAL SANS-SERIF BOLD CAPITAL R;Lu;0;L;<font> 0052;;;;N;;;;; +1D5E6;MATHEMATICAL SANS-SERIF BOLD CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;; +1D5E7;MATHEMATICAL SANS-SERIF BOLD CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;; +1D5E8;MATHEMATICAL SANS-SERIF BOLD CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;; +1D5E9;MATHEMATICAL SANS-SERIF BOLD CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;; +1D5EA;MATHEMATICAL SANS-SERIF BOLD CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;; +1D5EB;MATHEMATICAL SANS-SERIF BOLD CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;; +1D5EC;MATHEMATICAL SANS-SERIF BOLD CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;; +1D5ED;MATHEMATICAL SANS-SERIF BOLD CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;; +1D5EE;MATHEMATICAL SANS-SERIF BOLD SMALL A;Ll;0;L;<font> 0061;;;;N;;;;; +1D5EF;MATHEMATICAL SANS-SERIF BOLD SMALL B;Ll;0;L;<font> 0062;;;;N;;;;; +1D5F0;MATHEMATICAL SANS-SERIF BOLD SMALL C;Ll;0;L;<font> 0063;;;;N;;;;; +1D5F1;MATHEMATICAL SANS-SERIF BOLD SMALL D;Ll;0;L;<font> 0064;;;;N;;;;; +1D5F2;MATHEMATICAL SANS-SERIF BOLD SMALL E;Ll;0;L;<font> 0065;;;;N;;;;; +1D5F3;MATHEMATICAL SANS-SERIF BOLD SMALL F;Ll;0;L;<font> 0066;;;;N;;;;; +1D5F4;MATHEMATICAL SANS-SERIF BOLD SMALL G;Ll;0;L;<font> 0067;;;;N;;;;; +1D5F5;MATHEMATICAL SANS-SERIF BOLD SMALL H;Ll;0;L;<font> 0068;;;;N;;;;; +1D5F6;MATHEMATICAL SANS-SERIF BOLD SMALL I;Ll;0;L;<font> 0069;;;;N;;;;; +1D5F7;MATHEMATICAL SANS-SERIF BOLD SMALL J;Ll;0;L;<font> 006A;;;;N;;;;; +1D5F8;MATHEMATICAL SANS-SERIF BOLD SMALL K;Ll;0;L;<font> 006B;;;;N;;;;; +1D5F9;MATHEMATICAL SANS-SERIF BOLD SMALL L;Ll;0;L;<font> 006C;;;;N;;;;; +1D5FA;MATHEMATICAL SANS-SERIF BOLD SMALL M;Ll;0;L;<font> 006D;;;;N;;;;; +1D5FB;MATHEMATICAL SANS-SERIF BOLD SMALL N;Ll;0;L;<font> 006E;;;;N;;;;; +1D5FC;MATHEMATICAL SANS-SERIF BOLD SMALL O;Ll;0;L;<font> 006F;;;;N;;;;; +1D5FD;MATHEMATICAL SANS-SERIF BOLD SMALL P;Ll;0;L;<font> 0070;;;;N;;;;; +1D5FE;MATHEMATICAL SANS-SERIF BOLD SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;; +1D5FF;MATHEMATICAL SANS-SERIF BOLD SMALL R;Ll;0;L;<font> 0072;;;;N;;;;; +1D600;MATHEMATICAL SANS-SERIF BOLD SMALL S;Ll;0;L;<font> 0073;;;;N;;;;; +1D601;MATHEMATICAL SANS-SERIF BOLD SMALL T;Ll;0;L;<font> 0074;;;;N;;;;; +1D602;MATHEMATICAL SANS-SERIF BOLD SMALL U;Ll;0;L;<font> 0075;;;;N;;;;; +1D603;MATHEMATICAL SANS-SERIF BOLD SMALL V;Ll;0;L;<font> 0076;;;;N;;;;; +1D604;MATHEMATICAL SANS-SERIF BOLD SMALL W;Ll;0;L;<font> 0077;;;;N;;;;; +1D605;MATHEMATICAL SANS-SERIF BOLD SMALL X;Ll;0;L;<font> 0078;;;;N;;;;; +1D606;MATHEMATICAL SANS-SERIF BOLD SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;; +1D607;MATHEMATICAL SANS-SERIF BOLD SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;; +1D608;MATHEMATICAL SANS-SERIF ITALIC CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;; +1D609;MATHEMATICAL SANS-SERIF ITALIC CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;; +1D60A;MATHEMATICAL SANS-SERIF ITALIC CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;; +1D60B;MATHEMATICAL SANS-SERIF ITALIC CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;; +1D60C;MATHEMATICAL SANS-SERIF ITALIC CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;; +1D60D;MATHEMATICAL SANS-SERIF ITALIC CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;; +1D60E;MATHEMATICAL SANS-SERIF ITALIC CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;; +1D60F;MATHEMATICAL SANS-SERIF ITALIC CAPITAL H;Lu;0;L;<font> 0048;;;;N;;;;; +1D610;MATHEMATICAL SANS-SERIF ITALIC CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;; +1D611;MATHEMATICAL SANS-SERIF ITALIC CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;; +1D612;MATHEMATICAL SANS-SERIF ITALIC CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;; +1D613;MATHEMATICAL SANS-SERIF ITALIC CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;; +1D614;MATHEMATICAL SANS-SERIF ITALIC CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;; +1D615;MATHEMATICAL SANS-SERIF ITALIC CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;; +1D616;MATHEMATICAL SANS-SERIF ITALIC CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;; +1D617;MATHEMATICAL SANS-SERIF ITALIC CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;; +1D618;MATHEMATICAL SANS-SERIF ITALIC CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;; +1D619;MATHEMATICAL SANS-SERIF ITALIC CAPITAL R;Lu;0;L;<font> 0052;;;;N;;;;; +1D61A;MATHEMATICAL SANS-SERIF ITALIC CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;; +1D61B;MATHEMATICAL SANS-SERIF ITALIC CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;; +1D61C;MATHEMATICAL SANS-SERIF ITALIC CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;; +1D61D;MATHEMATICAL SANS-SERIF ITALIC CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;; +1D61E;MATHEMATICAL SANS-SERIF ITALIC CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;; +1D61F;MATHEMATICAL SANS-SERIF ITALIC CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;; +1D620;MATHEMATICAL SANS-SERIF ITALIC CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;; +1D621;MATHEMATICAL SANS-SERIF ITALIC CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;; +1D622;MATHEMATICAL SANS-SERIF ITALIC SMALL A;Ll;0;L;<font> 0061;;;;N;;;;; +1D623;MATHEMATICAL SANS-SERIF ITALIC SMALL B;Ll;0;L;<font> 0062;;;;N;;;;; +1D624;MATHEMATICAL SANS-SERIF ITALIC SMALL C;Ll;0;L;<font> 0063;;;;N;;;;; +1D625;MATHEMATICAL SANS-SERIF ITALIC SMALL D;Ll;0;L;<font> 0064;;;;N;;;;; +1D626;MATHEMATICAL SANS-SERIF ITALIC SMALL E;Ll;0;L;<font> 0065;;;;N;;;;; +1D627;MATHEMATICAL SANS-SERIF ITALIC SMALL F;Ll;0;L;<font> 0066;;;;N;;;;; +1D628;MATHEMATICAL SANS-SERIF ITALIC SMALL G;Ll;0;L;<font> 0067;;;;N;;;;; +1D629;MATHEMATICAL SANS-SERIF ITALIC SMALL H;Ll;0;L;<font> 0068;;;;N;;;;; +1D62A;MATHEMATICAL SANS-SERIF ITALIC SMALL I;Ll;0;L;<font> 0069;;;;N;;;;; +1D62B;MATHEMATICAL SANS-SERIF ITALIC SMALL J;Ll;0;L;<font> 006A;;;;N;;;;; +1D62C;MATHEMATICAL SANS-SERIF ITALIC SMALL K;Ll;0;L;<font> 006B;;;;N;;;;; +1D62D;MATHEMATICAL SANS-SERIF ITALIC SMALL L;Ll;0;L;<font> 006C;;;;N;;;;; +1D62E;MATHEMATICAL SANS-SERIF ITALIC SMALL M;Ll;0;L;<font> 006D;;;;N;;;;; +1D62F;MATHEMATICAL SANS-SERIF ITALIC SMALL N;Ll;0;L;<font> 006E;;;;N;;;;; +1D630;MATHEMATICAL SANS-SERIF ITALIC SMALL O;Ll;0;L;<font> 006F;;;;N;;;;; +1D631;MATHEMATICAL SANS-SERIF ITALIC SMALL P;Ll;0;L;<font> 0070;;;;N;;;;; +1D632;MATHEMATICAL SANS-SERIF ITALIC SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;; +1D633;MATHEMATICAL SANS-SERIF ITALIC SMALL R;Ll;0;L;<font> 0072;;;;N;;;;; +1D634;MATHEMATICAL SANS-SERIF ITALIC SMALL S;Ll;0;L;<font> 0073;;;;N;;;;; +1D635;MATHEMATICAL SANS-SERIF ITALIC SMALL T;Ll;0;L;<font> 0074;;;;N;;;;; +1D636;MATHEMATICAL SANS-SERIF ITALIC SMALL U;Ll;0;L;<font> 0075;;;;N;;;;; +1D637;MATHEMATICAL SANS-SERIF ITALIC SMALL V;Ll;0;L;<font> 0076;;;;N;;;;; +1D638;MATHEMATICAL SANS-SERIF ITALIC SMALL W;Ll;0;L;<font> 0077;;;;N;;;;; +1D639;MATHEMATICAL SANS-SERIF ITALIC SMALL X;Ll;0;L;<font> 0078;;;;N;;;;; +1D63A;MATHEMATICAL SANS-SERIF ITALIC SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;; +1D63B;MATHEMATICAL SANS-SERIF ITALIC SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;; +1D63C;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;; +1D63D;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;; +1D63E;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;; +1D63F;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;; +1D640;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;; +1D641;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;; +1D642;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;; +1D643;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL H;Lu;0;L;<font> 0048;;;;N;;;;; +1D644;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;; +1D645;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;; +1D646;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;; +1D647;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;; +1D648;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;; +1D649;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;; +1D64A;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;; +1D64B;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;; +1D64C;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;; +1D64D;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL R;Lu;0;L;<font> 0052;;;;N;;;;; +1D64E;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;; +1D64F;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;; +1D650;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;; +1D651;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;; +1D652;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;; +1D653;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;; +1D654;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;; +1D655;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;; +1D656;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL A;Ll;0;L;<font> 0061;;;;N;;;;; +1D657;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL B;Ll;0;L;<font> 0062;;;;N;;;;; +1D658;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL C;Ll;0;L;<font> 0063;;;;N;;;;; +1D659;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL D;Ll;0;L;<font> 0064;;;;N;;;;; +1D65A;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL E;Ll;0;L;<font> 0065;;;;N;;;;; +1D65B;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL F;Ll;0;L;<font> 0066;;;;N;;;;; +1D65C;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL G;Ll;0;L;<font> 0067;;;;N;;;;; +1D65D;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL H;Ll;0;L;<font> 0068;;;;N;;;;; +1D65E;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL I;Ll;0;L;<font> 0069;;;;N;;;;; +1D65F;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL J;Ll;0;L;<font> 006A;;;;N;;;;; +1D660;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL K;Ll;0;L;<font> 006B;;;;N;;;;; +1D661;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL L;Ll;0;L;<font> 006C;;;;N;;;;; +1D662;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL M;Ll;0;L;<font> 006D;;;;N;;;;; +1D663;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL N;Ll;0;L;<font> 006E;;;;N;;;;; +1D664;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL O;Ll;0;L;<font> 006F;;;;N;;;;; +1D665;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL P;Ll;0;L;<font> 0070;;;;N;;;;; +1D666;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;; +1D667;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL R;Ll;0;L;<font> 0072;;;;N;;;;; +1D668;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL S;Ll;0;L;<font> 0073;;;;N;;;;; +1D669;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL T;Ll;0;L;<font> 0074;;;;N;;;;; +1D66A;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL U;Ll;0;L;<font> 0075;;;;N;;;;; +1D66B;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL V;Ll;0;L;<font> 0076;;;;N;;;;; +1D66C;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL W;Ll;0;L;<font> 0077;;;;N;;;;; +1D66D;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL X;Ll;0;L;<font> 0078;;;;N;;;;; +1D66E;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;; +1D66F;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;; +1D670;MATHEMATICAL MONOSPACE CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;; +1D671;MATHEMATICAL MONOSPACE CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;; +1D672;MATHEMATICAL MONOSPACE CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;; +1D673;MATHEMATICAL MONOSPACE CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;; +1D674;MATHEMATICAL MONOSPACE CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;; +1D675;MATHEMATICAL MONOSPACE CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;; +1D676;MATHEMATICAL MONOSPACE CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;; +1D677;MATHEMATICAL MONOSPACE CAPITAL H;Lu;0;L;<font> 0048;;;;N;;;;; +1D678;MATHEMATICAL MONOSPACE CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;; +1D679;MATHEMATICAL MONOSPACE CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;; +1D67A;MATHEMATICAL MONOSPACE CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;; +1D67B;MATHEMATICAL MONOSPACE CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;; +1D67C;MATHEMATICAL MONOSPACE CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;; +1D67D;MATHEMATICAL MONOSPACE CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;; +1D67E;MATHEMATICAL MONOSPACE CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;; +1D67F;MATHEMATICAL MONOSPACE CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;; +1D680;MATHEMATICAL MONOSPACE CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;; +1D681;MATHEMATICAL MONOSPACE CAPITAL R;Lu;0;L;<font> 0052;;;;N;;;;; +1D682;MATHEMATICAL MONOSPACE CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;; +1D683;MATHEMATICAL MONOSPACE CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;; +1D684;MATHEMATICAL MONOSPACE CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;; +1D685;MATHEMATICAL MONOSPACE CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;; +1D686;MATHEMATICAL MONOSPACE CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;; +1D687;MATHEMATICAL MONOSPACE CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;; +1D688;MATHEMATICAL MONOSPACE CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;; +1D689;MATHEMATICAL MONOSPACE CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;; +1D68A;MATHEMATICAL MONOSPACE SMALL A;Ll;0;L;<font> 0061;;;;N;;;;; +1D68B;MATHEMATICAL MONOSPACE SMALL B;Ll;0;L;<font> 0062;;;;N;;;;; +1D68C;MATHEMATICAL MONOSPACE SMALL C;Ll;0;L;<font> 0063;;;;N;;;;; +1D68D;MATHEMATICAL MONOSPACE SMALL D;Ll;0;L;<font> 0064;;;;N;;;;; +1D68E;MATHEMATICAL MONOSPACE SMALL E;Ll;0;L;<font> 0065;;;;N;;;;; +1D68F;MATHEMATICAL MONOSPACE SMALL F;Ll;0;L;<font> 0066;;;;N;;;;; +1D690;MATHEMATICAL MONOSPACE SMALL G;Ll;0;L;<font> 0067;;;;N;;;;; +1D691;MATHEMATICAL MONOSPACE SMALL H;Ll;0;L;<font> 0068;;;;N;;;;; +1D692;MATHEMATICAL MONOSPACE SMALL I;Ll;0;L;<font> 0069;;;;N;;;;; +1D693;MATHEMATICAL MONOSPACE SMALL J;Ll;0;L;<font> 006A;;;;N;;;;; +1D694;MATHEMATICAL MONOSPACE SMALL K;Ll;0;L;<font> 006B;;;;N;;;;; +1D695;MATHEMATICAL MONOSPACE SMALL L;Ll;0;L;<font> 006C;;;;N;;;;; +1D696;MATHEMATICAL MONOSPACE SMALL M;Ll;0;L;<font> 006D;;;;N;;;;; +1D697;MATHEMATICAL MONOSPACE SMALL N;Ll;0;L;<font> 006E;;;;N;;;;; +1D698;MATHEMATICAL MONOSPACE SMALL O;Ll;0;L;<font> 006F;;;;N;;;;; +1D699;MATHEMATICAL MONOSPACE SMALL P;Ll;0;L;<font> 0070;;;;N;;;;; +1D69A;MATHEMATICAL MONOSPACE SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;; +1D69B;MATHEMATICAL MONOSPACE SMALL R;Ll;0;L;<font> 0072;;;;N;;;;; +1D69C;MATHEMATICAL MONOSPACE SMALL S;Ll;0;L;<font> 0073;;;;N;;;;; +1D69D;MATHEMATICAL MONOSPACE SMALL T;Ll;0;L;<font> 0074;;;;N;;;;; +1D69E;MATHEMATICAL MONOSPACE SMALL U;Ll;0;L;<font> 0075;;;;N;;;;; +1D69F;MATHEMATICAL MONOSPACE SMALL V;Ll;0;L;<font> 0076;;;;N;;;;; +1D6A0;MATHEMATICAL MONOSPACE SMALL W;Ll;0;L;<font> 0077;;;;N;;;;; +1D6A1;MATHEMATICAL MONOSPACE SMALL X;Ll;0;L;<font> 0078;;;;N;;;;; +1D6A2;MATHEMATICAL MONOSPACE SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;; +1D6A3;MATHEMATICAL MONOSPACE SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;; +1D6A4;MATHEMATICAL ITALIC SMALL DOTLESS I;Ll;0;L;<font> 0131;;;;N;;;;; +1D6A5;MATHEMATICAL ITALIC SMALL DOTLESS J;Ll;0;L;<font> 0237;;;;N;;;;; +1D6A8;MATHEMATICAL BOLD CAPITAL ALPHA;Lu;0;L;<font> 0391;;;;N;;;;; +1D6A9;MATHEMATICAL BOLD CAPITAL BETA;Lu;0;L;<font> 0392;;;;N;;;;; +1D6AA;MATHEMATICAL BOLD CAPITAL GAMMA;Lu;0;L;<font> 0393;;;;N;;;;; +1D6AB;MATHEMATICAL BOLD CAPITAL DELTA;Lu;0;L;<font> 0394;;;;N;;;;; +1D6AC;MATHEMATICAL BOLD CAPITAL EPSILON;Lu;0;L;<font> 0395;;;;N;;;;; +1D6AD;MATHEMATICAL BOLD CAPITAL ZETA;Lu;0;L;<font> 0396;;;;N;;;;; +1D6AE;MATHEMATICAL BOLD CAPITAL ETA;Lu;0;L;<font> 0397;;;;N;;;;; +1D6AF;MATHEMATICAL BOLD CAPITAL THETA;Lu;0;L;<font> 0398;;;;N;;;;; +1D6B0;MATHEMATICAL BOLD CAPITAL IOTA;Lu;0;L;<font> 0399;;;;N;;;;; +1D6B1;MATHEMATICAL BOLD CAPITAL KAPPA;Lu;0;L;<font> 039A;;;;N;;;;; +1D6B2;MATHEMATICAL BOLD CAPITAL LAMDA;Lu;0;L;<font> 039B;;;;N;;;;; +1D6B3;MATHEMATICAL BOLD CAPITAL MU;Lu;0;L;<font> 039C;;;;N;;;;; +1D6B4;MATHEMATICAL BOLD CAPITAL NU;Lu;0;L;<font> 039D;;;;N;;;;; +1D6B5;MATHEMATICAL BOLD CAPITAL XI;Lu;0;L;<font> 039E;;;;N;;;;; +1D6B6;MATHEMATICAL BOLD CAPITAL OMICRON;Lu;0;L;<font> 039F;;;;N;;;;; +1D6B7;MATHEMATICAL BOLD CAPITAL PI;Lu;0;L;<font> 03A0;;;;N;;;;; +1D6B8;MATHEMATICAL BOLD CAPITAL RHO;Lu;0;L;<font> 03A1;;;;N;;;;; +1D6B9;MATHEMATICAL BOLD CAPITAL THETA SYMBOL;Lu;0;L;<font> 03F4;;;;N;;;;; +1D6BA;MATHEMATICAL BOLD CAPITAL SIGMA;Lu;0;L;<font> 03A3;;;;N;;;;; +1D6BB;MATHEMATICAL BOLD CAPITAL TAU;Lu;0;L;<font> 03A4;;;;N;;;;; +1D6BC;MATHEMATICAL BOLD CAPITAL UPSILON;Lu;0;L;<font> 03A5;;;;N;;;;; +1D6BD;MATHEMATICAL BOLD CAPITAL PHI;Lu;0;L;<font> 03A6;;;;N;;;;; +1D6BE;MATHEMATICAL BOLD CAPITAL CHI;Lu;0;L;<font> 03A7;;;;N;;;;; +1D6BF;MATHEMATICAL BOLD CAPITAL PSI;Lu;0;L;<font> 03A8;;;;N;;;;; +1D6C0;MATHEMATICAL BOLD CAPITAL OMEGA;Lu;0;L;<font> 03A9;;;;N;;;;; +1D6C1;MATHEMATICAL BOLD NABLA;Sm;0;L;<font> 2207;;;;N;;;;; +1D6C2;MATHEMATICAL BOLD SMALL ALPHA;Ll;0;L;<font> 03B1;;;;N;;;;; +1D6C3;MATHEMATICAL BOLD SMALL BETA;Ll;0;L;<font> 03B2;;;;N;;;;; +1D6C4;MATHEMATICAL BOLD SMALL GAMMA;Ll;0;L;<font> 03B3;;;;N;;;;; +1D6C5;MATHEMATICAL BOLD SMALL DELTA;Ll;0;L;<font> 03B4;;;;N;;;;; +1D6C6;MATHEMATICAL BOLD SMALL EPSILON;Ll;0;L;<font> 03B5;;;;N;;;;; +1D6C7;MATHEMATICAL BOLD SMALL ZETA;Ll;0;L;<font> 03B6;;;;N;;;;; +1D6C8;MATHEMATICAL BOLD SMALL ETA;Ll;0;L;<font> 03B7;;;;N;;;;; +1D6C9;MATHEMATICAL BOLD SMALL THETA;Ll;0;L;<font> 03B8;;;;N;;;;; +1D6CA;MATHEMATICAL BOLD SMALL IOTA;Ll;0;L;<font> 03B9;;;;N;;;;; +1D6CB;MATHEMATICAL BOLD SMALL KAPPA;Ll;0;L;<font> 03BA;;;;N;;;;; +1D6CC;MATHEMATICAL BOLD SMALL LAMDA;Ll;0;L;<font> 03BB;;;;N;;;;; +1D6CD;MATHEMATICAL BOLD SMALL MU;Ll;0;L;<font> 03BC;;;;N;;;;; +1D6CE;MATHEMATICAL BOLD SMALL NU;Ll;0;L;<font> 03BD;;;;N;;;;; +1D6CF;MATHEMATICAL BOLD SMALL XI;Ll;0;L;<font> 03BE;;;;N;;;;; +1D6D0;MATHEMATICAL BOLD SMALL OMICRON;Ll;0;L;<font> 03BF;;;;N;;;;; +1D6D1;MATHEMATICAL BOLD SMALL PI;Ll;0;L;<font> 03C0;;;;N;;;;; +1D6D2;MATHEMATICAL BOLD SMALL RHO;Ll;0;L;<font> 03C1;;;;N;;;;; +1D6D3;MATHEMATICAL BOLD SMALL FINAL SIGMA;Ll;0;L;<font> 03C2;;;;N;;;;; +1D6D4;MATHEMATICAL BOLD SMALL SIGMA;Ll;0;L;<font> 03C3;;;;N;;;;; +1D6D5;MATHEMATICAL BOLD SMALL TAU;Ll;0;L;<font> 03C4;;;;N;;;;; +1D6D6;MATHEMATICAL BOLD SMALL UPSILON;Ll;0;L;<font> 03C5;;;;N;;;;; +1D6D7;MATHEMATICAL BOLD SMALL PHI;Ll;0;L;<font> 03C6;;;;N;;;;; +1D6D8;MATHEMATICAL BOLD SMALL CHI;Ll;0;L;<font> 03C7;;;;N;;;;; +1D6D9;MATHEMATICAL BOLD SMALL PSI;Ll;0;L;<font> 03C8;;;;N;;;;; +1D6DA;MATHEMATICAL BOLD SMALL OMEGA;Ll;0;L;<font> 03C9;;;;N;;;;; +1D6DB;MATHEMATICAL BOLD PARTIAL DIFFERENTIAL;Sm;0;ON;<font> 2202;;;;Y;;;;; +1D6DC;MATHEMATICAL BOLD EPSILON SYMBOL;Ll;0;L;<font> 03F5;;;;N;;;;; +1D6DD;MATHEMATICAL BOLD THETA SYMBOL;Ll;0;L;<font> 03D1;;;;N;;;;; +1D6DE;MATHEMATICAL BOLD KAPPA SYMBOL;Ll;0;L;<font> 03F0;;;;N;;;;; +1D6DF;MATHEMATICAL BOLD PHI SYMBOL;Ll;0;L;<font> 03D5;;;;N;;;;; +1D6E0;MATHEMATICAL BOLD RHO SYMBOL;Ll;0;L;<font> 03F1;;;;N;;;;; +1D6E1;MATHEMATICAL BOLD PI SYMBOL;Ll;0;L;<font> 03D6;;;;N;;;;; +1D6E2;MATHEMATICAL ITALIC CAPITAL ALPHA;Lu;0;L;<font> 0391;;;;N;;;;; +1D6E3;MATHEMATICAL ITALIC CAPITAL BETA;Lu;0;L;<font> 0392;;;;N;;;;; +1D6E4;MATHEMATICAL ITALIC CAPITAL GAMMA;Lu;0;L;<font> 0393;;;;N;;;;; +1D6E5;MATHEMATICAL ITALIC CAPITAL DELTA;Lu;0;L;<font> 0394;;;;N;;;;; +1D6E6;MATHEMATICAL ITALIC CAPITAL EPSILON;Lu;0;L;<font> 0395;;;;N;;;;; +1D6E7;MATHEMATICAL ITALIC CAPITAL ZETA;Lu;0;L;<font> 0396;;;;N;;;;; +1D6E8;MATHEMATICAL ITALIC CAPITAL ETA;Lu;0;L;<font> 0397;;;;N;;;;; +1D6E9;MATHEMATICAL ITALIC CAPITAL THETA;Lu;0;L;<font> 0398;;;;N;;;;; +1D6EA;MATHEMATICAL ITALIC CAPITAL IOTA;Lu;0;L;<font> 0399;;;;N;;;;; +1D6EB;MATHEMATICAL ITALIC CAPITAL KAPPA;Lu;0;L;<font> 039A;;;;N;;;;; +1D6EC;MATHEMATICAL ITALIC CAPITAL LAMDA;Lu;0;L;<font> 039B;;;;N;;;;; +1D6ED;MATHEMATICAL ITALIC CAPITAL MU;Lu;0;L;<font> 039C;;;;N;;;;; +1D6EE;MATHEMATICAL ITALIC CAPITAL NU;Lu;0;L;<font> 039D;;;;N;;;;; +1D6EF;MATHEMATICAL ITALIC CAPITAL XI;Lu;0;L;<font> 039E;;;;N;;;;; +1D6F0;MATHEMATICAL ITALIC CAPITAL OMICRON;Lu;0;L;<font> 039F;;;;N;;;;; +1D6F1;MATHEMATICAL ITALIC CAPITAL PI;Lu;0;L;<font> 03A0;;;;N;;;;; +1D6F2;MATHEMATICAL ITALIC CAPITAL RHO;Lu;0;L;<font> 03A1;;;;N;;;;; +1D6F3;MATHEMATICAL ITALIC CAPITAL THETA SYMBOL;Lu;0;L;<font> 03F4;;;;N;;;;; +1D6F4;MATHEMATICAL ITALIC CAPITAL SIGMA;Lu;0;L;<font> 03A3;;;;N;;;;; +1D6F5;MATHEMATICAL ITALIC CAPITAL TAU;Lu;0;L;<font> 03A4;;;;N;;;;; +1D6F6;MATHEMATICAL ITALIC CAPITAL UPSILON;Lu;0;L;<font> 03A5;;;;N;;;;; +1D6F7;MATHEMATICAL ITALIC CAPITAL PHI;Lu;0;L;<font> 03A6;;;;N;;;;; +1D6F8;MATHEMATICAL ITALIC CAPITAL CHI;Lu;0;L;<font> 03A7;;;;N;;;;; +1D6F9;MATHEMATICAL ITALIC CAPITAL PSI;Lu;0;L;<font> 03A8;;;;N;;;;; +1D6FA;MATHEMATICAL ITALIC CAPITAL OMEGA;Lu;0;L;<font> 03A9;;;;N;;;;; +1D6FB;MATHEMATICAL ITALIC NABLA;Sm;0;L;<font> 2207;;;;N;;;;; +1D6FC;MATHEMATICAL ITALIC SMALL ALPHA;Ll;0;L;<font> 03B1;;;;N;;;;; +1D6FD;MATHEMATICAL ITALIC SMALL BETA;Ll;0;L;<font> 03B2;;;;N;;;;; +1D6FE;MATHEMATICAL ITALIC SMALL GAMMA;Ll;0;L;<font> 03B3;;;;N;;;;; +1D6FF;MATHEMATICAL ITALIC SMALL DELTA;Ll;0;L;<font> 03B4;;;;N;;;;; +1D700;MATHEMATICAL ITALIC SMALL EPSILON;Ll;0;L;<font> 03B5;;;;N;;;;; +1D701;MATHEMATICAL ITALIC SMALL ZETA;Ll;0;L;<font> 03B6;;;;N;;;;; +1D702;MATHEMATICAL ITALIC SMALL ETA;Ll;0;L;<font> 03B7;;;;N;;;;; +1D703;MATHEMATICAL ITALIC SMALL THETA;Ll;0;L;<font> 03B8;;;;N;;;;; +1D704;MATHEMATICAL ITALIC SMALL IOTA;Ll;0;L;<font> 03B9;;;;N;;;;; +1D705;MATHEMATICAL ITALIC SMALL KAPPA;Ll;0;L;<font> 03BA;;;;N;;;;; +1D706;MATHEMATICAL ITALIC SMALL LAMDA;Ll;0;L;<font> 03BB;;;;N;;;;; +1D707;MATHEMATICAL ITALIC SMALL MU;Ll;0;L;<font> 03BC;;;;N;;;;; +1D708;MATHEMATICAL ITALIC SMALL NU;Ll;0;L;<font> 03BD;;;;N;;;;; +1D709;MATHEMATICAL ITALIC SMALL XI;Ll;0;L;<font> 03BE;;;;N;;;;; +1D70A;MATHEMATICAL ITALIC SMALL OMICRON;Ll;0;L;<font> 03BF;;;;N;;;;; +1D70B;MATHEMATICAL ITALIC SMALL PI;Ll;0;L;<font> 03C0;;;;N;;;;; +1D70C;MATHEMATICAL ITALIC SMALL RHO;Ll;0;L;<font> 03C1;;;;N;;;;; +1D70D;MATHEMATICAL ITALIC SMALL FINAL SIGMA;Ll;0;L;<font> 03C2;;;;N;;;;; +1D70E;MATHEMATICAL ITALIC SMALL SIGMA;Ll;0;L;<font> 03C3;;;;N;;;;; +1D70F;MATHEMATICAL ITALIC SMALL TAU;Ll;0;L;<font> 03C4;;;;N;;;;; +1D710;MATHEMATICAL ITALIC SMALL UPSILON;Ll;0;L;<font> 03C5;;;;N;;;;; +1D711;MATHEMATICAL ITALIC SMALL PHI;Ll;0;L;<font> 03C6;;;;N;;;;; +1D712;MATHEMATICAL ITALIC SMALL CHI;Ll;0;L;<font> 03C7;;;;N;;;;; +1D713;MATHEMATICAL ITALIC SMALL PSI;Ll;0;L;<font> 03C8;;;;N;;;;; +1D714;MATHEMATICAL ITALIC SMALL OMEGA;Ll;0;L;<font> 03C9;;;;N;;;;; +1D715;MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL;Sm;0;ON;<font> 2202;;;;Y;;;;; +1D716;MATHEMATICAL ITALIC EPSILON SYMBOL;Ll;0;L;<font> 03F5;;;;N;;;;; +1D717;MATHEMATICAL ITALIC THETA SYMBOL;Ll;0;L;<font> 03D1;;;;N;;;;; +1D718;MATHEMATICAL ITALIC KAPPA SYMBOL;Ll;0;L;<font> 03F0;;;;N;;;;; +1D719;MATHEMATICAL ITALIC PHI SYMBOL;Ll;0;L;<font> 03D5;;;;N;;;;; +1D71A;MATHEMATICAL ITALIC RHO SYMBOL;Ll;0;L;<font> 03F1;;;;N;;;;; +1D71B;MATHEMATICAL ITALIC PI SYMBOL;Ll;0;L;<font> 03D6;;;;N;;;;; +1D71C;MATHEMATICAL BOLD ITALIC CAPITAL ALPHA;Lu;0;L;<font> 0391;;;;N;;;;; +1D71D;MATHEMATICAL BOLD ITALIC CAPITAL BETA;Lu;0;L;<font> 0392;;;;N;;;;; +1D71E;MATHEMATICAL BOLD ITALIC CAPITAL GAMMA;Lu;0;L;<font> 0393;;;;N;;;;; +1D71F;MATHEMATICAL BOLD ITALIC CAPITAL DELTA;Lu;0;L;<font> 0394;;;;N;;;;; +1D720;MATHEMATICAL BOLD ITALIC CAPITAL EPSILON;Lu;0;L;<font> 0395;;;;N;;;;; +1D721;MATHEMATICAL BOLD ITALIC CAPITAL ZETA;Lu;0;L;<font> 0396;;;;N;;;;; +1D722;MATHEMATICAL BOLD ITALIC CAPITAL ETA;Lu;0;L;<font> 0397;;;;N;;;;; +1D723;MATHEMATICAL BOLD ITALIC CAPITAL THETA;Lu;0;L;<font> 0398;;;;N;;;;; +1D724;MATHEMATICAL BOLD ITALIC CAPITAL IOTA;Lu;0;L;<font> 0399;;;;N;;;;; +1D725;MATHEMATICAL BOLD ITALIC CAPITAL KAPPA;Lu;0;L;<font> 039A;;;;N;;;;; +1D726;MATHEMATICAL BOLD ITALIC CAPITAL LAMDA;Lu;0;L;<font> 039B;;;;N;;;;; +1D727;MATHEMATICAL BOLD ITALIC CAPITAL MU;Lu;0;L;<font> 039C;;;;N;;;;; +1D728;MATHEMATICAL BOLD ITALIC CAPITAL NU;Lu;0;L;<font> 039D;;;;N;;;;; +1D729;MATHEMATICAL BOLD ITALIC CAPITAL XI;Lu;0;L;<font> 039E;;;;N;;;;; +1D72A;MATHEMATICAL BOLD ITALIC CAPITAL OMICRON;Lu;0;L;<font> 039F;;;;N;;;;; +1D72B;MATHEMATICAL BOLD ITALIC CAPITAL PI;Lu;0;L;<font> 03A0;;;;N;;;;; +1D72C;MATHEMATICAL BOLD ITALIC CAPITAL RHO;Lu;0;L;<font> 03A1;;;;N;;;;; +1D72D;MATHEMATICAL BOLD ITALIC CAPITAL THETA SYMBOL;Lu;0;L;<font> 03F4;;;;N;;;;; +1D72E;MATHEMATICAL BOLD ITALIC CAPITAL SIGMA;Lu;0;L;<font> 03A3;;;;N;;;;; +1D72F;MATHEMATICAL BOLD ITALIC CAPITAL TAU;Lu;0;L;<font> 03A4;;;;N;;;;; +1D730;MATHEMATICAL BOLD ITALIC CAPITAL UPSILON;Lu;0;L;<font> 03A5;;;;N;;;;; +1D731;MATHEMATICAL BOLD ITALIC CAPITAL PHI;Lu;0;L;<font> 03A6;;;;N;;;;; +1D732;MATHEMATICAL BOLD ITALIC CAPITAL CHI;Lu;0;L;<font> 03A7;;;;N;;;;; +1D733;MATHEMATICAL BOLD ITALIC CAPITAL PSI;Lu;0;L;<font> 03A8;;;;N;;;;; +1D734;MATHEMATICAL BOLD ITALIC CAPITAL OMEGA;Lu;0;L;<font> 03A9;;;;N;;;;; +1D735;MATHEMATICAL BOLD ITALIC NABLA;Sm;0;L;<font> 2207;;;;N;;;;; +1D736;MATHEMATICAL BOLD ITALIC SMALL ALPHA;Ll;0;L;<font> 03B1;;;;N;;;;; +1D737;MATHEMATICAL BOLD ITALIC SMALL BETA;Ll;0;L;<font> 03B2;;;;N;;;;; +1D738;MATHEMATICAL BOLD ITALIC SMALL GAMMA;Ll;0;L;<font> 03B3;;;;N;;;;; +1D739;MATHEMATICAL BOLD ITALIC SMALL DELTA;Ll;0;L;<font> 03B4;;;;N;;;;; +1D73A;MATHEMATICAL BOLD ITALIC SMALL EPSILON;Ll;0;L;<font> 03B5;;;;N;;;;; +1D73B;MATHEMATICAL BOLD ITALIC SMALL ZETA;Ll;0;L;<font> 03B6;;;;N;;;;; +1D73C;MATHEMATICAL BOLD ITALIC SMALL ETA;Ll;0;L;<font> 03B7;;;;N;;;;; +1D73D;MATHEMATICAL BOLD ITALIC SMALL THETA;Ll;0;L;<font> 03B8;;;;N;;;;; +1D73E;MATHEMATICAL BOLD ITALIC SMALL IOTA;Ll;0;L;<font> 03B9;;;;N;;;;; +1D73F;MATHEMATICAL BOLD ITALIC SMALL KAPPA;Ll;0;L;<font> 03BA;;;;N;;;;; +1D740;MATHEMATICAL BOLD ITALIC SMALL LAMDA;Ll;0;L;<font> 03BB;;;;N;;;;; +1D741;MATHEMATICAL BOLD ITALIC SMALL MU;Ll;0;L;<font> 03BC;;;;N;;;;; +1D742;MATHEMATICAL BOLD ITALIC SMALL NU;Ll;0;L;<font> 03BD;;;;N;;;;; +1D743;MATHEMATICAL BOLD ITALIC SMALL XI;Ll;0;L;<font> 03BE;;;;N;;;;; +1D744;MATHEMATICAL BOLD ITALIC SMALL OMICRON;Ll;0;L;<font> 03BF;;;;N;;;;; +1D745;MATHEMATICAL BOLD ITALIC SMALL PI;Ll;0;L;<font> 03C0;;;;N;;;;; +1D746;MATHEMATICAL BOLD ITALIC SMALL RHO;Ll;0;L;<font> 03C1;;;;N;;;;; +1D747;MATHEMATICAL BOLD ITALIC SMALL FINAL SIGMA;Ll;0;L;<font> 03C2;;;;N;;;;; +1D748;MATHEMATICAL BOLD ITALIC SMALL SIGMA;Ll;0;L;<font> 03C3;;;;N;;;;; +1D749;MATHEMATICAL BOLD ITALIC SMALL TAU;Ll;0;L;<font> 03C4;;;;N;;;;; +1D74A;MATHEMATICAL BOLD ITALIC SMALL UPSILON;Ll;0;L;<font> 03C5;;;;N;;;;; +1D74B;MATHEMATICAL BOLD ITALIC SMALL PHI;Ll;0;L;<font> 03C6;;;;N;;;;; +1D74C;MATHEMATICAL BOLD ITALIC SMALL CHI;Ll;0;L;<font> 03C7;;;;N;;;;; +1D74D;MATHEMATICAL BOLD ITALIC SMALL PSI;Ll;0;L;<font> 03C8;;;;N;;;;; +1D74E;MATHEMATICAL BOLD ITALIC SMALL OMEGA;Ll;0;L;<font> 03C9;;;;N;;;;; +1D74F;MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL;Sm;0;ON;<font> 2202;;;;Y;;;;; +1D750;MATHEMATICAL BOLD ITALIC EPSILON SYMBOL;Ll;0;L;<font> 03F5;;;;N;;;;; +1D751;MATHEMATICAL BOLD ITALIC THETA SYMBOL;Ll;0;L;<font> 03D1;;;;N;;;;; +1D752;MATHEMATICAL BOLD ITALIC KAPPA SYMBOL;Ll;0;L;<font> 03F0;;;;N;;;;; +1D753;MATHEMATICAL BOLD ITALIC PHI SYMBOL;Ll;0;L;<font> 03D5;;;;N;;;;; +1D754;MATHEMATICAL BOLD ITALIC RHO SYMBOL;Ll;0;L;<font> 03F1;;;;N;;;;; +1D755;MATHEMATICAL BOLD ITALIC PI SYMBOL;Ll;0;L;<font> 03D6;;;;N;;;;; +1D756;MATHEMATICAL SANS-SERIF BOLD CAPITAL ALPHA;Lu;0;L;<font> 0391;;;;N;;;;; +1D757;MATHEMATICAL SANS-SERIF BOLD CAPITAL BETA;Lu;0;L;<font> 0392;;;;N;;;;; +1D758;MATHEMATICAL SANS-SERIF BOLD CAPITAL GAMMA;Lu;0;L;<font> 0393;;;;N;;;;; +1D759;MATHEMATICAL SANS-SERIF BOLD CAPITAL DELTA;Lu;0;L;<font> 0394;;;;N;;;;; +1D75A;MATHEMATICAL SANS-SERIF BOLD CAPITAL EPSILON;Lu;0;L;<font> 0395;;;;N;;;;; +1D75B;MATHEMATICAL SANS-SERIF BOLD CAPITAL ZETA;Lu;0;L;<font> 0396;;;;N;;;;; +1D75C;MATHEMATICAL SANS-SERIF BOLD CAPITAL ETA;Lu;0;L;<font> 0397;;;;N;;;;; +1D75D;MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA;Lu;0;L;<font> 0398;;;;N;;;;; +1D75E;MATHEMATICAL SANS-SERIF BOLD CAPITAL IOTA;Lu;0;L;<font> 0399;;;;N;;;;; +1D75F;MATHEMATICAL SANS-SERIF BOLD CAPITAL KAPPA;Lu;0;L;<font> 039A;;;;N;;;;; +1D760;MATHEMATICAL SANS-SERIF BOLD CAPITAL LAMDA;Lu;0;L;<font> 039B;;;;N;;;;; +1D761;MATHEMATICAL SANS-SERIF BOLD CAPITAL MU;Lu;0;L;<font> 039C;;;;N;;;;; +1D762;MATHEMATICAL SANS-SERIF BOLD CAPITAL NU;Lu;0;L;<font> 039D;;;;N;;;;; +1D763;MATHEMATICAL SANS-SERIF BOLD CAPITAL XI;Lu;0;L;<font> 039E;;;;N;;;;; +1D764;MATHEMATICAL SANS-SERIF BOLD CAPITAL OMICRON;Lu;0;L;<font> 039F;;;;N;;;;; +1D765;MATHEMATICAL SANS-SERIF BOLD CAPITAL PI;Lu;0;L;<font> 03A0;;;;N;;;;; +1D766;MATHEMATICAL SANS-SERIF BOLD CAPITAL RHO;Lu;0;L;<font> 03A1;;;;N;;;;; +1D767;MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA SYMBOL;Lu;0;L;<font> 03F4;;;;N;;;;; +1D768;MATHEMATICAL SANS-SERIF BOLD CAPITAL SIGMA;Lu;0;L;<font> 03A3;;;;N;;;;; +1D769;MATHEMATICAL SANS-SERIF BOLD CAPITAL TAU;Lu;0;L;<font> 03A4;;;;N;;;;; +1D76A;MATHEMATICAL SANS-SERIF BOLD CAPITAL UPSILON;Lu;0;L;<font> 03A5;;;;N;;;;; +1D76B;MATHEMATICAL SANS-SERIF BOLD CAPITAL PHI;Lu;0;L;<font> 03A6;;;;N;;;;; +1D76C;MATHEMATICAL SANS-SERIF BOLD CAPITAL CHI;Lu;0;L;<font> 03A7;;;;N;;;;; +1D76D;MATHEMATICAL SANS-SERIF BOLD CAPITAL PSI;Lu;0;L;<font> 03A8;;;;N;;;;; +1D76E;MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA;Lu;0;L;<font> 03A9;;;;N;;;;; +1D76F;MATHEMATICAL SANS-SERIF BOLD NABLA;Sm;0;L;<font> 2207;;;;N;;;;; +1D770;MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA;Ll;0;L;<font> 03B1;;;;N;;;;; +1D771;MATHEMATICAL SANS-SERIF BOLD SMALL BETA;Ll;0;L;<font> 03B2;;;;N;;;;; +1D772;MATHEMATICAL SANS-SERIF BOLD SMALL GAMMA;Ll;0;L;<font> 03B3;;;;N;;;;; +1D773;MATHEMATICAL SANS-SERIF BOLD SMALL DELTA;Ll;0;L;<font> 03B4;;;;N;;;;; +1D774;MATHEMATICAL SANS-SERIF BOLD SMALL EPSILON;Ll;0;L;<font> 03B5;;;;N;;;;; +1D775;MATHEMATICAL SANS-SERIF BOLD SMALL ZETA;Ll;0;L;<font> 03B6;;;;N;;;;; +1D776;MATHEMATICAL SANS-SERIF BOLD SMALL ETA;Ll;0;L;<font> 03B7;;;;N;;;;; +1D777;MATHEMATICAL SANS-SERIF BOLD SMALL THETA;Ll;0;L;<font> 03B8;;;;N;;;;; +1D778;MATHEMATICAL SANS-SERIF BOLD SMALL IOTA;Ll;0;L;<font> 03B9;;;;N;;;;; +1D779;MATHEMATICAL SANS-SERIF BOLD SMALL KAPPA;Ll;0;L;<font> 03BA;;;;N;;;;; +1D77A;MATHEMATICAL SANS-SERIF BOLD SMALL LAMDA;Ll;0;L;<font> 03BB;;;;N;;;;; +1D77B;MATHEMATICAL SANS-SERIF BOLD SMALL MU;Ll;0;L;<font> 03BC;;;;N;;;;; +1D77C;MATHEMATICAL SANS-SERIF BOLD SMALL NU;Ll;0;L;<font> 03BD;;;;N;;;;; +1D77D;MATHEMATICAL SANS-SERIF BOLD SMALL XI;Ll;0;L;<font> 03BE;;;;N;;;;; +1D77E;MATHEMATICAL SANS-SERIF BOLD SMALL OMICRON;Ll;0;L;<font> 03BF;;;;N;;;;; +1D77F;MATHEMATICAL SANS-SERIF BOLD SMALL PI;Ll;0;L;<font> 03C0;;;;N;;;;; +1D780;MATHEMATICAL SANS-SERIF BOLD SMALL RHO;Ll;0;L;<font> 03C1;;;;N;;;;; +1D781;MATHEMATICAL SANS-SERIF BOLD SMALL FINAL SIGMA;Ll;0;L;<font> 03C2;;;;N;;;;; +1D782;MATHEMATICAL SANS-SERIF BOLD SMALL SIGMA;Ll;0;L;<font> 03C3;;;;N;;;;; +1D783;MATHEMATICAL SANS-SERIF BOLD SMALL TAU;Ll;0;L;<font> 03C4;;;;N;;;;; +1D784;MATHEMATICAL SANS-SERIF BOLD SMALL UPSILON;Ll;0;L;<font> 03C5;;;;N;;;;; +1D785;MATHEMATICAL SANS-SERIF BOLD SMALL PHI;Ll;0;L;<font> 03C6;;;;N;;;;; +1D786;MATHEMATICAL SANS-SERIF BOLD SMALL CHI;Ll;0;L;<font> 03C7;;;;N;;;;; +1D787;MATHEMATICAL SANS-SERIF BOLD SMALL PSI;Ll;0;L;<font> 03C8;;;;N;;;;; +1D788;MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA;Ll;0;L;<font> 03C9;;;;N;;;;; +1D789;MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL;Sm;0;ON;<font> 2202;;;;Y;;;;; +1D78A;MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL;Ll;0;L;<font> 03F5;;;;N;;;;; +1D78B;MATHEMATICAL SANS-SERIF BOLD THETA SYMBOL;Ll;0;L;<font> 03D1;;;;N;;;;; +1D78C;MATHEMATICAL SANS-SERIF BOLD KAPPA SYMBOL;Ll;0;L;<font> 03F0;;;;N;;;;; +1D78D;MATHEMATICAL SANS-SERIF BOLD PHI SYMBOL;Ll;0;L;<font> 03D5;;;;N;;;;; +1D78E;MATHEMATICAL SANS-SERIF BOLD RHO SYMBOL;Ll;0;L;<font> 03F1;;;;N;;;;; +1D78F;MATHEMATICAL SANS-SERIF BOLD PI SYMBOL;Ll;0;L;<font> 03D6;;;;N;;;;; +1D790;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ALPHA;Lu;0;L;<font> 0391;;;;N;;;;; +1D791;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL BETA;Lu;0;L;<font> 0392;;;;N;;;;; +1D792;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL GAMMA;Lu;0;L;<font> 0393;;;;N;;;;; +1D793;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL DELTA;Lu;0;L;<font> 0394;;;;N;;;;; +1D794;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL EPSILON;Lu;0;L;<font> 0395;;;;N;;;;; +1D795;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ZETA;Lu;0;L;<font> 0396;;;;N;;;;; +1D796;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ETA;Lu;0;L;<font> 0397;;;;N;;;;; +1D797;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA;Lu;0;L;<font> 0398;;;;N;;;;; +1D798;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL IOTA;Lu;0;L;<font> 0399;;;;N;;;;; +1D799;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL KAPPA;Lu;0;L;<font> 039A;;;;N;;;;; +1D79A;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL LAMDA;Lu;0;L;<font> 039B;;;;N;;;;; +1D79B;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL MU;Lu;0;L;<font> 039C;;;;N;;;;; +1D79C;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL NU;Lu;0;L;<font> 039D;;;;N;;;;; +1D79D;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL XI;Lu;0;L;<font> 039E;;;;N;;;;; +1D79E;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMICRON;Lu;0;L;<font> 039F;;;;N;;;;; +1D79F;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PI;Lu;0;L;<font> 03A0;;;;N;;;;; +1D7A0;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL RHO;Lu;0;L;<font> 03A1;;;;N;;;;; +1D7A1;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA SYMBOL;Lu;0;L;<font> 03F4;;;;N;;;;; +1D7A2;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL SIGMA;Lu;0;L;<font> 03A3;;;;N;;;;; +1D7A3;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL TAU;Lu;0;L;<font> 03A4;;;;N;;;;; +1D7A4;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL UPSILON;Lu;0;L;<font> 03A5;;;;N;;;;; +1D7A5;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PHI;Lu;0;L;<font> 03A6;;;;N;;;;; +1D7A6;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL CHI;Lu;0;L;<font> 03A7;;;;N;;;;; +1D7A7;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PSI;Lu;0;L;<font> 03A8;;;;N;;;;; +1D7A8;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA;Lu;0;L;<font> 03A9;;;;N;;;;; +1D7A9;MATHEMATICAL SANS-SERIF BOLD ITALIC NABLA;Sm;0;L;<font> 2207;;;;N;;;;; +1D7AA;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA;Ll;0;L;<font> 03B1;;;;N;;;;; +1D7AB;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL BETA;Ll;0;L;<font> 03B2;;;;N;;;;; +1D7AC;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL GAMMA;Ll;0;L;<font> 03B3;;;;N;;;;; +1D7AD;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL DELTA;Ll;0;L;<font> 03B4;;;;N;;;;; +1D7AE;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL EPSILON;Ll;0;L;<font> 03B5;;;;N;;;;; +1D7AF;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ZETA;Ll;0;L;<font> 03B6;;;;N;;;;; +1D7B0;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ETA;Ll;0;L;<font> 03B7;;;;N;;;;; +1D7B1;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL THETA;Ll;0;L;<font> 03B8;;;;N;;;;; +1D7B2;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL IOTA;Ll;0;L;<font> 03B9;;;;N;;;;; +1D7B3;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL KAPPA;Ll;0;L;<font> 03BA;;;;N;;;;; +1D7B4;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL LAMDA;Ll;0;L;<font> 03BB;;;;N;;;;; +1D7B5;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL MU;Ll;0;L;<font> 03BC;;;;N;;;;; +1D7B6;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL NU;Ll;0;L;<font> 03BD;;;;N;;;;; +1D7B7;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL XI;Ll;0;L;<font> 03BE;;;;N;;;;; +1D7B8;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMICRON;Ll;0;L;<font> 03BF;;;;N;;;;; +1D7B9;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PI;Ll;0;L;<font> 03C0;;;;N;;;;; +1D7BA;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL RHO;Ll;0;L;<font> 03C1;;;;N;;;;; +1D7BB;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL FINAL SIGMA;Ll;0;L;<font> 03C2;;;;N;;;;; +1D7BC;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL SIGMA;Ll;0;L;<font> 03C3;;;;N;;;;; +1D7BD;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL TAU;Ll;0;L;<font> 03C4;;;;N;;;;; +1D7BE;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL UPSILON;Ll;0;L;<font> 03C5;;;;N;;;;; +1D7BF;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PHI;Ll;0;L;<font> 03C6;;;;N;;;;; +1D7C0;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL CHI;Ll;0;L;<font> 03C7;;;;N;;;;; +1D7C1;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PSI;Ll;0;L;<font> 03C8;;;;N;;;;; +1D7C2;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA;Ll;0;L;<font> 03C9;;;;N;;;;; +1D7C3;MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL;Sm;0;ON;<font> 2202;;;;Y;;;;; +1D7C4;MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL;Ll;0;L;<font> 03F5;;;;N;;;;; +1D7C5;MATHEMATICAL SANS-SERIF BOLD ITALIC THETA SYMBOL;Ll;0;L;<font> 03D1;;;;N;;;;; +1D7C6;MATHEMATICAL SANS-SERIF BOLD ITALIC KAPPA SYMBOL;Ll;0;L;<font> 03F0;;;;N;;;;; +1D7C7;MATHEMATICAL SANS-SERIF BOLD ITALIC PHI SYMBOL;Ll;0;L;<font> 03D5;;;;N;;;;; +1D7C8;MATHEMATICAL SANS-SERIF BOLD ITALIC RHO SYMBOL;Ll;0;L;<font> 03F1;;;;N;;;;; +1D7C9;MATHEMATICAL SANS-SERIF BOLD ITALIC PI SYMBOL;Ll;0;L;<font> 03D6;;;;N;;;;; +1D7CA;MATHEMATICAL BOLD CAPITAL DIGAMMA;Lu;0;L;<font> 03DC;;;;N;;;;; +1D7CB;MATHEMATICAL BOLD SMALL DIGAMMA;Ll;0;L;<font> 03DD;;;;N;;;;; +1D7CE;MATHEMATICAL BOLD DIGIT ZERO;Nd;0;EN;<font> 0030;0;0;0;N;;;;; +1D7CF;MATHEMATICAL BOLD DIGIT ONE;Nd;0;EN;<font> 0031;1;1;1;N;;;;; +1D7D0;MATHEMATICAL BOLD DIGIT TWO;Nd;0;EN;<font> 0032;2;2;2;N;;;;; +1D7D1;MATHEMATICAL BOLD DIGIT THREE;Nd;0;EN;<font> 0033;3;3;3;N;;;;; +1D7D2;MATHEMATICAL BOLD DIGIT FOUR;Nd;0;EN;<font> 0034;4;4;4;N;;;;; +1D7D3;MATHEMATICAL BOLD DIGIT FIVE;Nd;0;EN;<font> 0035;5;5;5;N;;;;; +1D7D4;MATHEMATICAL BOLD DIGIT SIX;Nd;0;EN;<font> 0036;6;6;6;N;;;;; +1D7D5;MATHEMATICAL BOLD DIGIT SEVEN;Nd;0;EN;<font> 0037;7;7;7;N;;;;; +1D7D6;MATHEMATICAL BOLD DIGIT EIGHT;Nd;0;EN;<font> 0038;8;8;8;N;;;;; +1D7D7;MATHEMATICAL BOLD DIGIT NINE;Nd;0;EN;<font> 0039;9;9;9;N;;;;; +1D7D8;MATHEMATICAL DOUBLE-STRUCK DIGIT ZERO;Nd;0;EN;<font> 0030;0;0;0;N;;;;; +1D7D9;MATHEMATICAL DOUBLE-STRUCK DIGIT ONE;Nd;0;EN;<font> 0031;1;1;1;N;;;;; +1D7DA;MATHEMATICAL DOUBLE-STRUCK DIGIT TWO;Nd;0;EN;<font> 0032;2;2;2;N;;;;; +1D7DB;MATHEMATICAL DOUBLE-STRUCK DIGIT THREE;Nd;0;EN;<font> 0033;3;3;3;N;;;;; +1D7DC;MATHEMATICAL DOUBLE-STRUCK DIGIT FOUR;Nd;0;EN;<font> 0034;4;4;4;N;;;;; +1D7DD;MATHEMATICAL DOUBLE-STRUCK DIGIT FIVE;Nd;0;EN;<font> 0035;5;5;5;N;;;;; +1D7DE;MATHEMATICAL DOUBLE-STRUCK DIGIT SIX;Nd;0;EN;<font> 0036;6;6;6;N;;;;; +1D7DF;MATHEMATICAL DOUBLE-STRUCK DIGIT SEVEN;Nd;0;EN;<font> 0037;7;7;7;N;;;;; +1D7E0;MATHEMATICAL DOUBLE-STRUCK DIGIT EIGHT;Nd;0;EN;<font> 0038;8;8;8;N;;;;; +1D7E1;MATHEMATICAL DOUBLE-STRUCK DIGIT NINE;Nd;0;EN;<font> 0039;9;9;9;N;;;;; +1D7E2;MATHEMATICAL SANS-SERIF DIGIT ZERO;Nd;0;EN;<font> 0030;0;0;0;N;;;;; +1D7E3;MATHEMATICAL SANS-SERIF DIGIT ONE;Nd;0;EN;<font> 0031;1;1;1;N;;;;; +1D7E4;MATHEMATICAL SANS-SERIF DIGIT TWO;Nd;0;EN;<font> 0032;2;2;2;N;;;;; +1D7E5;MATHEMATICAL SANS-SERIF DIGIT THREE;Nd;0;EN;<font> 0033;3;3;3;N;;;;; +1D7E6;MATHEMATICAL SANS-SERIF DIGIT FOUR;Nd;0;EN;<font> 0034;4;4;4;N;;;;; +1D7E7;MATHEMATICAL SANS-SERIF DIGIT FIVE;Nd;0;EN;<font> 0035;5;5;5;N;;;;; +1D7E8;MATHEMATICAL SANS-SERIF DIGIT SIX;Nd;0;EN;<font> 0036;6;6;6;N;;;;; +1D7E9;MATHEMATICAL SANS-SERIF DIGIT SEVEN;Nd;0;EN;<font> 0037;7;7;7;N;;;;; +1D7EA;MATHEMATICAL SANS-SERIF DIGIT EIGHT;Nd;0;EN;<font> 0038;8;8;8;N;;;;; +1D7EB;MATHEMATICAL SANS-SERIF DIGIT NINE;Nd;0;EN;<font> 0039;9;9;9;N;;;;; +1D7EC;MATHEMATICAL SANS-SERIF BOLD DIGIT ZERO;Nd;0;EN;<font> 0030;0;0;0;N;;;;; +1D7ED;MATHEMATICAL SANS-SERIF BOLD DIGIT ONE;Nd;0;EN;<font> 0031;1;1;1;N;;;;; +1D7EE;MATHEMATICAL SANS-SERIF BOLD DIGIT TWO;Nd;0;EN;<font> 0032;2;2;2;N;;;;; +1D7EF;MATHEMATICAL SANS-SERIF BOLD DIGIT THREE;Nd;0;EN;<font> 0033;3;3;3;N;;;;; +1D7F0;MATHEMATICAL SANS-SERIF BOLD DIGIT FOUR;Nd;0;EN;<font> 0034;4;4;4;N;;;;; +1D7F1;MATHEMATICAL SANS-SERIF BOLD DIGIT FIVE;Nd;0;EN;<font> 0035;5;5;5;N;;;;; +1D7F2;MATHEMATICAL SANS-SERIF BOLD DIGIT SIX;Nd;0;EN;<font> 0036;6;6;6;N;;;;; +1D7F3;MATHEMATICAL SANS-SERIF BOLD DIGIT SEVEN;Nd;0;EN;<font> 0037;7;7;7;N;;;;; +1D7F4;MATHEMATICAL SANS-SERIF BOLD DIGIT EIGHT;Nd;0;EN;<font> 0038;8;8;8;N;;;;; +1D7F5;MATHEMATICAL SANS-SERIF BOLD DIGIT NINE;Nd;0;EN;<font> 0039;9;9;9;N;;;;; +1D7F6;MATHEMATICAL MONOSPACE DIGIT ZERO;Nd;0;EN;<font> 0030;0;0;0;N;;;;; +1D7F7;MATHEMATICAL MONOSPACE DIGIT ONE;Nd;0;EN;<font> 0031;1;1;1;N;;;;; +1D7F8;MATHEMATICAL MONOSPACE DIGIT TWO;Nd;0;EN;<font> 0032;2;2;2;N;;;;; +1D7F9;MATHEMATICAL MONOSPACE DIGIT THREE;Nd;0;EN;<font> 0033;3;3;3;N;;;;; +1D7FA;MATHEMATICAL MONOSPACE DIGIT FOUR;Nd;0;EN;<font> 0034;4;4;4;N;;;;; +1D7FB;MATHEMATICAL MONOSPACE DIGIT FIVE;Nd;0;EN;<font> 0035;5;5;5;N;;;;; +1D7FC;MATHEMATICAL MONOSPACE DIGIT SIX;Nd;0;EN;<font> 0036;6;6;6;N;;;;; +1D7FD;MATHEMATICAL MONOSPACE DIGIT SEVEN;Nd;0;EN;<font> 0037;7;7;7;N;;;;; +1D7FE;MATHEMATICAL MONOSPACE DIGIT EIGHT;Nd;0;EN;<font> 0038;8;8;8;N;;;;; +1D7FF;MATHEMATICAL MONOSPACE DIGIT NINE;Nd;0;EN;<font> 0039;9;9;9;N;;;;; +1D800;SIGNWRITING HAND-FIST INDEX;So;0;L;;;;;N;;;;; +1D801;SIGNWRITING HAND-CIRCLE INDEX;So;0;L;;;;;N;;;;; +1D802;SIGNWRITING HAND-CUP INDEX;So;0;L;;;;;N;;;;; +1D803;SIGNWRITING HAND-OVAL INDEX;So;0;L;;;;;N;;;;; +1D804;SIGNWRITING HAND-HINGE INDEX;So;0;L;;;;;N;;;;; +1D805;SIGNWRITING HAND-ANGLE INDEX;So;0;L;;;;;N;;;;; +1D806;SIGNWRITING HAND-FIST INDEX BENT;So;0;L;;;;;N;;;;; +1D807;SIGNWRITING HAND-CIRCLE INDEX BENT;So;0;L;;;;;N;;;;; +1D808;SIGNWRITING HAND-FIST THUMB UNDER INDEX BENT;So;0;L;;;;;N;;;;; +1D809;SIGNWRITING HAND-FIST INDEX RAISED KNUCKLE;So;0;L;;;;;N;;;;; +1D80A;SIGNWRITING HAND-FIST INDEX CUPPED;So;0;L;;;;;N;;;;; +1D80B;SIGNWRITING HAND-FIST INDEX HINGED;So;0;L;;;;;N;;;;; +1D80C;SIGNWRITING HAND-FIST INDEX HINGED LOW;So;0;L;;;;;N;;;;; +1D80D;SIGNWRITING HAND-CIRCLE INDEX HINGE;So;0;L;;;;;N;;;;; +1D80E;SIGNWRITING HAND-FIST INDEX MIDDLE;So;0;L;;;;;N;;;;; +1D80F;SIGNWRITING HAND-CIRCLE INDEX MIDDLE;So;0;L;;;;;N;;;;; +1D810;SIGNWRITING HAND-FIST INDEX MIDDLE BENT;So;0;L;;;;;N;;;;; +1D811;SIGNWRITING HAND-FIST INDEX MIDDLE RAISED KNUCKLES;So;0;L;;;;;N;;;;; +1D812;SIGNWRITING HAND-FIST INDEX MIDDLE HINGED;So;0;L;;;;;N;;;;; +1D813;SIGNWRITING HAND-FIST INDEX UP MIDDLE HINGED;So;0;L;;;;;N;;;;; +1D814;SIGNWRITING HAND-FIST INDEX HINGED MIDDLE UP;So;0;L;;;;;N;;;;; +1D815;SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED;So;0;L;;;;;N;;;;; +1D816;SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED INDEX BENT;So;0;L;;;;;N;;;;; +1D817;SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED MIDDLE BENT;So;0;L;;;;;N;;;;; +1D818;SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED CUPPED;So;0;L;;;;;N;;;;; +1D819;SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED HINGED;So;0;L;;;;;N;;;;; +1D81A;SIGNWRITING HAND-FIST INDEX MIDDLE CROSSED;So;0;L;;;;;N;;;;; +1D81B;SIGNWRITING HAND-CIRCLE INDEX MIDDLE CROSSED;So;0;L;;;;;N;;;;; +1D81C;SIGNWRITING HAND-FIST MIDDLE BENT OVER INDEX;So;0;L;;;;;N;;;;; +1D81D;SIGNWRITING HAND-FIST INDEX BENT OVER MIDDLE;So;0;L;;;;;N;;;;; +1D81E;SIGNWRITING HAND-FIST INDEX MIDDLE THUMB;So;0;L;;;;;N;;;;; +1D81F;SIGNWRITING HAND-CIRCLE INDEX MIDDLE THUMB;So;0;L;;;;;N;;;;; +1D820;SIGNWRITING HAND-FIST INDEX MIDDLE STRAIGHT THUMB BENT;So;0;L;;;;;N;;;;; +1D821;SIGNWRITING HAND-FIST INDEX MIDDLE BENT THUMB STRAIGHT;So;0;L;;;;;N;;;;; +1D822;SIGNWRITING HAND-FIST INDEX MIDDLE THUMB BENT;So;0;L;;;;;N;;;;; +1D823;SIGNWRITING HAND-FIST INDEX MIDDLE HINGED SPREAD THUMB SIDE;So;0;L;;;;;N;;;;; +1D824;SIGNWRITING HAND-FIST INDEX UP MIDDLE HINGED THUMB SIDE;So;0;L;;;;;N;;;;; +1D825;SIGNWRITING HAND-FIST INDEX UP MIDDLE HINGED THUMB CONJOINED;So;0;L;;;;;N;;;;; +1D826;SIGNWRITING HAND-FIST INDEX HINGED MIDDLE UP THUMB SIDE;So;0;L;;;;;N;;;;; +1D827;SIGNWRITING HAND-FIST INDEX MIDDLE UP SPREAD THUMB FORWARD;So;0;L;;;;;N;;;;; +1D828;SIGNWRITING HAND-FIST INDEX MIDDLE THUMB CUPPED;So;0;L;;;;;N;;;;; +1D829;SIGNWRITING HAND-FIST INDEX MIDDLE THUMB CIRCLED;So;0;L;;;;;N;;;;; +1D82A;SIGNWRITING HAND-FIST INDEX MIDDLE THUMB HOOKED;So;0;L;;;;;N;;;;; +1D82B;SIGNWRITING HAND-FIST INDEX MIDDLE THUMB HINGED;So;0;L;;;;;N;;;;; +1D82C;SIGNWRITING HAND-FIST THUMB BETWEEN INDEX MIDDLE STRAIGHT;So;0;L;;;;;N;;;;; +1D82D;SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED THUMB SIDE;So;0;L;;;;;N;;;;; +1D82E;SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED THUMB SIDE CONJOINED;So;0;L;;;;;N;;;;; +1D82F;SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED THUMB SIDE BENT;So;0;L;;;;;N;;;;; +1D830;SIGNWRITING HAND-FIST MIDDLE THUMB HOOKED INDEX UP;So;0;L;;;;;N;;;;; +1D831;SIGNWRITING HAND-FIST INDEX THUMB HOOKED MIDDLE UP;So;0;L;;;;;N;;;;; +1D832;SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED HINGED THUMB SIDE;So;0;L;;;;;N;;;;; +1D833;SIGNWRITING HAND-FIST INDEX MIDDLE CROSSED THUMB SIDE;So;0;L;;;;;N;;;;; +1D834;SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED THUMB FORWARD;So;0;L;;;;;N;;;;; +1D835;SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED CUPPED THUMB FORWARD;So;0;L;;;;;N;;;;; +1D836;SIGNWRITING HAND-FIST MIDDLE THUMB CUPPED INDEX UP;So;0;L;;;;;N;;;;; +1D837;SIGNWRITING HAND-FIST INDEX THUMB CUPPED MIDDLE UP;So;0;L;;;;;N;;;;; +1D838;SIGNWRITING HAND-FIST MIDDLE THUMB CIRCLED INDEX UP;So;0;L;;;;;N;;;;; +1D839;SIGNWRITING HAND-FIST MIDDLE THUMB CIRCLED INDEX HINGED;So;0;L;;;;;N;;;;; +1D83A;SIGNWRITING HAND-FIST INDEX THUMB ANGLED OUT MIDDLE UP;So;0;L;;;;;N;;;;; +1D83B;SIGNWRITING HAND-FIST INDEX THUMB ANGLED IN MIDDLE UP;So;0;L;;;;;N;;;;; +1D83C;SIGNWRITING HAND-FIST INDEX THUMB CIRCLED MIDDLE UP;So;0;L;;;;;N;;;;; +1D83D;SIGNWRITING HAND-FIST INDEX MIDDLE THUMB CONJOINED HINGED;So;0;L;;;;;N;;;;; +1D83E;SIGNWRITING HAND-FIST INDEX MIDDLE THUMB ANGLED OUT;So;0;L;;;;;N;;;;; +1D83F;SIGNWRITING HAND-FIST INDEX MIDDLE THUMB ANGLED;So;0;L;;;;;N;;;;; +1D840;SIGNWRITING HAND-FIST MIDDLE THUMB ANGLED OUT INDEX UP;So;0;L;;;;;N;;;;; +1D841;SIGNWRITING HAND-FIST MIDDLE THUMB ANGLED OUT INDEX CROSSED;So;0;L;;;;;N;;;;; +1D842;SIGNWRITING HAND-FIST MIDDLE THUMB ANGLED INDEX UP;So;0;L;;;;;N;;;;; +1D843;SIGNWRITING HAND-FIST INDEX THUMB HOOKED MIDDLE HINGED;So;0;L;;;;;N;;;;; +1D844;SIGNWRITING HAND-FLAT FOUR FINGERS;So;0;L;;;;;N;;;;; +1D845;SIGNWRITING HAND-FLAT FOUR FINGERS BENT;So;0;L;;;;;N;;;;; +1D846;SIGNWRITING HAND-FLAT FOUR FINGERS HINGED;So;0;L;;;;;N;;;;; +1D847;SIGNWRITING HAND-FLAT FOUR FINGERS CONJOINED;So;0;L;;;;;N;;;;; +1D848;SIGNWRITING HAND-FLAT FOUR FINGERS CONJOINED SPLIT;So;0;L;;;;;N;;;;; +1D849;SIGNWRITING HAND-CLAW FOUR FINGERS CONJOINED;So;0;L;;;;;N;;;;; +1D84A;SIGNWRITING HAND-FIST FOUR FINGERS CONJOINED BENT;So;0;L;;;;;N;;;;; +1D84B;SIGNWRITING HAND-HINGE FOUR FINGERS CONJOINED;So;0;L;;;;;N;;;;; +1D84C;SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD;So;0;L;;;;;N;;;;; +1D84D;SIGNWRITING HAND-FLAT HEEL FIVE FINGERS SPREAD;So;0;L;;;;;N;;;;; +1D84E;SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD FOUR BENT;So;0;L;;;;;N;;;;; +1D84F;SIGNWRITING HAND-FLAT HEEL FIVE FINGERS SPREAD FOUR BENT;So;0;L;;;;;N;;;;; +1D850;SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD BENT;So;0;L;;;;;N;;;;; +1D851;SIGNWRITING HAND-FLAT HEEL FIVE FINGERS SPREAD BENT;So;0;L;;;;;N;;;;; +1D852;SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD THUMB FORWARD;So;0;L;;;;;N;;;;; +1D853;SIGNWRITING HAND-CUP FIVE FINGERS SPREAD;So;0;L;;;;;N;;;;; +1D854;SIGNWRITING HAND-CUP FIVE FINGERS SPREAD OPEN;So;0;L;;;;;N;;;;; +1D855;SIGNWRITING HAND-HINGE FIVE FINGERS SPREAD OPEN;So;0;L;;;;;N;;;;; +1D856;SIGNWRITING HAND-OVAL FIVE FINGERS SPREAD;So;0;L;;;;;N;;;;; +1D857;SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD HINGED;So;0;L;;;;;N;;;;; +1D858;SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD HINGED THUMB SIDE;So;0;L;;;;;N;;;;; +1D859;SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD HINGED NO THUMB;So;0;L;;;;;N;;;;; +1D85A;SIGNWRITING HAND-FLAT;So;0;L;;;;;N;;;;; +1D85B;SIGNWRITING HAND-FLAT BETWEEN PALM FACINGS;So;0;L;;;;;N;;;;; +1D85C;SIGNWRITING HAND-FLAT HEEL;So;0;L;;;;;N;;;;; +1D85D;SIGNWRITING HAND-FLAT THUMB SIDE;So;0;L;;;;;N;;;;; +1D85E;SIGNWRITING HAND-FLAT HEEL THUMB SIDE;So;0;L;;;;;N;;;;; +1D85F;SIGNWRITING HAND-FLAT THUMB BENT;So;0;L;;;;;N;;;;; +1D860;SIGNWRITING HAND-FLAT THUMB FORWARD;So;0;L;;;;;N;;;;; +1D861;SIGNWRITING HAND-FLAT SPLIT INDEX THUMB SIDE;So;0;L;;;;;N;;;;; +1D862;SIGNWRITING HAND-FLAT SPLIT CENTRE;So;0;L;;;;;N;;;;; +1D863;SIGNWRITING HAND-FLAT SPLIT CENTRE THUMB SIDE;So;0;L;;;;;N;;;;; +1D864;SIGNWRITING HAND-FLAT SPLIT CENTRE THUMB SIDE BENT;So;0;L;;;;;N;;;;; +1D865;SIGNWRITING HAND-FLAT SPLIT LITTLE;So;0;L;;;;;N;;;;; +1D866;SIGNWRITING HAND-CLAW;So;0;L;;;;;N;;;;; +1D867;SIGNWRITING HAND-CLAW THUMB SIDE;So;0;L;;;;;N;;;;; +1D868;SIGNWRITING HAND-CLAW NO THUMB;So;0;L;;;;;N;;;;; +1D869;SIGNWRITING HAND-CLAW THUMB FORWARD;So;0;L;;;;;N;;;;; +1D86A;SIGNWRITING HAND-HOOK CURLICUE;So;0;L;;;;;N;;;;; +1D86B;SIGNWRITING HAND-HOOK;So;0;L;;;;;N;;;;; +1D86C;SIGNWRITING HAND-CUP OPEN;So;0;L;;;;;N;;;;; +1D86D;SIGNWRITING HAND-CUP;So;0;L;;;;;N;;;;; +1D86E;SIGNWRITING HAND-CUP OPEN THUMB SIDE;So;0;L;;;;;N;;;;; +1D86F;SIGNWRITING HAND-CUP THUMB SIDE;So;0;L;;;;;N;;;;; +1D870;SIGNWRITING HAND-CUP OPEN NO THUMB;So;0;L;;;;;N;;;;; +1D871;SIGNWRITING HAND-CUP NO THUMB;So;0;L;;;;;N;;;;; +1D872;SIGNWRITING HAND-CUP OPEN THUMB FORWARD;So;0;L;;;;;N;;;;; +1D873;SIGNWRITING HAND-CUP THUMB FORWARD;So;0;L;;;;;N;;;;; +1D874;SIGNWRITING HAND-CURLICUE OPEN;So;0;L;;;;;N;;;;; +1D875;SIGNWRITING HAND-CURLICUE;So;0;L;;;;;N;;;;; +1D876;SIGNWRITING HAND-CIRCLE;So;0;L;;;;;N;;;;; +1D877;SIGNWRITING HAND-OVAL;So;0;L;;;;;N;;;;; +1D878;SIGNWRITING HAND-OVAL THUMB SIDE;So;0;L;;;;;N;;;;; +1D879;SIGNWRITING HAND-OVAL NO THUMB;So;0;L;;;;;N;;;;; +1D87A;SIGNWRITING HAND-OVAL THUMB FORWARD;So;0;L;;;;;N;;;;; +1D87B;SIGNWRITING HAND-HINGE OPEN;So;0;L;;;;;N;;;;; +1D87C;SIGNWRITING HAND-HINGE OPEN THUMB FORWARD;So;0;L;;;;;N;;;;; +1D87D;SIGNWRITING HAND-HINGE;So;0;L;;;;;N;;;;; +1D87E;SIGNWRITING HAND-HINGE SMALL;So;0;L;;;;;N;;;;; +1D87F;SIGNWRITING HAND-HINGE OPEN THUMB SIDE;So;0;L;;;;;N;;;;; +1D880;SIGNWRITING HAND-HINGE THUMB SIDE;So;0;L;;;;;N;;;;; +1D881;SIGNWRITING HAND-HINGE OPEN NO THUMB;So;0;L;;;;;N;;;;; +1D882;SIGNWRITING HAND-HINGE NO THUMB;So;0;L;;;;;N;;;;; +1D883;SIGNWRITING HAND-HINGE THUMB SIDE TOUCHING INDEX;So;0;L;;;;;N;;;;; +1D884;SIGNWRITING HAND-HINGE THUMB BETWEEN MIDDLE RING;So;0;L;;;;;N;;;;; +1D885;SIGNWRITING HAND-ANGLE;So;0;L;;;;;N;;;;; +1D886;SIGNWRITING HAND-FIST INDEX MIDDLE RING;So;0;L;;;;;N;;;;; +1D887;SIGNWRITING HAND-CIRCLE INDEX MIDDLE RING;So;0;L;;;;;N;;;;; +1D888;SIGNWRITING HAND-HINGE INDEX MIDDLE RING;So;0;L;;;;;N;;;;; +1D889;SIGNWRITING HAND-ANGLE INDEX MIDDLE RING;So;0;L;;;;;N;;;;; +1D88A;SIGNWRITING HAND-HINGE LITTLE;So;0;L;;;;;N;;;;; +1D88B;SIGNWRITING HAND-FIST INDEX MIDDLE RING BENT;So;0;L;;;;;N;;;;; +1D88C;SIGNWRITING HAND-FIST INDEX MIDDLE RING CONJOINED;So;0;L;;;;;N;;;;; +1D88D;SIGNWRITING HAND-HINGE INDEX MIDDLE RING CONJOINED;So;0;L;;;;;N;;;;; +1D88E;SIGNWRITING HAND-FIST LITTLE DOWN;So;0;L;;;;;N;;;;; +1D88F;SIGNWRITING HAND-FIST LITTLE DOWN RIPPLE STRAIGHT;So;0;L;;;;;N;;;;; +1D890;SIGNWRITING HAND-FIST LITTLE DOWN RIPPLE CURVED;So;0;L;;;;;N;;;;; +1D891;SIGNWRITING HAND-FIST LITTLE DOWN OTHERS CIRCLED;So;0;L;;;;;N;;;;; +1D892;SIGNWRITING HAND-FIST LITTLE UP;So;0;L;;;;;N;;;;; +1D893;SIGNWRITING HAND-FIST THUMB UNDER LITTLE UP;So;0;L;;;;;N;;;;; +1D894;SIGNWRITING HAND-CIRCLE LITTLE UP;So;0;L;;;;;N;;;;; +1D895;SIGNWRITING HAND-OVAL LITTLE UP;So;0;L;;;;;N;;;;; +1D896;SIGNWRITING HAND-ANGLE LITTLE UP;So;0;L;;;;;N;;;;; +1D897;SIGNWRITING HAND-FIST LITTLE RAISED KNUCKLE;So;0;L;;;;;N;;;;; +1D898;SIGNWRITING HAND-FIST LITTLE BENT;So;0;L;;;;;N;;;;; +1D899;SIGNWRITING HAND-FIST LITTLE TOUCHES THUMB;So;0;L;;;;;N;;;;; +1D89A;SIGNWRITING HAND-FIST LITTLE THUMB;So;0;L;;;;;N;;;;; +1D89B;SIGNWRITING HAND-HINGE LITTLE THUMB;So;0;L;;;;;N;;;;; +1D89C;SIGNWRITING HAND-FIST LITTLE INDEX THUMB;So;0;L;;;;;N;;;;; +1D89D;SIGNWRITING HAND-HINGE LITTLE INDEX THUMB;So;0;L;;;;;N;;;;; +1D89E;SIGNWRITING HAND-ANGLE LITTLE INDEX THUMB INDEX THUMB OUT;So;0;L;;;;;N;;;;; +1D89F;SIGNWRITING HAND-ANGLE LITTLE INDEX THUMB INDEX THUMB;So;0;L;;;;;N;;;;; +1D8A0;SIGNWRITING HAND-FIST LITTLE INDEX;So;0;L;;;;;N;;;;; +1D8A1;SIGNWRITING HAND-CIRCLE LITTLE INDEX;So;0;L;;;;;N;;;;; +1D8A2;SIGNWRITING HAND-HINGE LITTLE INDEX;So;0;L;;;;;N;;;;; +1D8A3;SIGNWRITING HAND-ANGLE LITTLE INDEX;So;0;L;;;;;N;;;;; +1D8A4;SIGNWRITING HAND-FIST INDEX MIDDLE LITTLE;So;0;L;;;;;N;;;;; +1D8A5;SIGNWRITING HAND-CIRCLE INDEX MIDDLE LITTLE;So;0;L;;;;;N;;;;; +1D8A6;SIGNWRITING HAND-HINGE INDEX MIDDLE LITTLE;So;0;L;;;;;N;;;;; +1D8A7;SIGNWRITING HAND-HINGE RING;So;0;L;;;;;N;;;;; +1D8A8;SIGNWRITING HAND-ANGLE INDEX MIDDLE LITTLE;So;0;L;;;;;N;;;;; +1D8A9;SIGNWRITING HAND-FIST INDEX MIDDLE CROSS LITTLE;So;0;L;;;;;N;;;;; +1D8AA;SIGNWRITING HAND-CIRCLE INDEX MIDDLE CROSS LITTLE;So;0;L;;;;;N;;;;; +1D8AB;SIGNWRITING HAND-FIST RING DOWN;So;0;L;;;;;N;;;;; +1D8AC;SIGNWRITING HAND-HINGE RING DOWN INDEX THUMB HOOK MIDDLE;So;0;L;;;;;N;;;;; +1D8AD;SIGNWRITING HAND-ANGLE RING DOWN MIDDLE THUMB INDEX CROSS;So;0;L;;;;;N;;;;; +1D8AE;SIGNWRITING HAND-FIST RING UP;So;0;L;;;;;N;;;;; +1D8AF;SIGNWRITING HAND-FIST RING RAISED KNUCKLE;So;0;L;;;;;N;;;;; +1D8B0;SIGNWRITING HAND-FIST RING LITTLE;So;0;L;;;;;N;;;;; +1D8B1;SIGNWRITING HAND-CIRCLE RING LITTLE;So;0;L;;;;;N;;;;; +1D8B2;SIGNWRITING HAND-OVAL RING LITTLE;So;0;L;;;;;N;;;;; +1D8B3;SIGNWRITING HAND-ANGLE RING LITTLE;So;0;L;;;;;N;;;;; +1D8B4;SIGNWRITING HAND-FIST RING MIDDLE;So;0;L;;;;;N;;;;; +1D8B5;SIGNWRITING HAND-FIST RING MIDDLE CONJOINED;So;0;L;;;;;N;;;;; +1D8B6;SIGNWRITING HAND-FIST RING MIDDLE RAISED KNUCKLES;So;0;L;;;;;N;;;;; +1D8B7;SIGNWRITING HAND-FIST RING INDEX;So;0;L;;;;;N;;;;; +1D8B8;SIGNWRITING HAND-FIST RING THUMB;So;0;L;;;;;N;;;;; +1D8B9;SIGNWRITING HAND-HOOK RING THUMB;So;0;L;;;;;N;;;;; +1D8BA;SIGNWRITING HAND-FIST INDEX RING LITTLE;So;0;L;;;;;N;;;;; +1D8BB;SIGNWRITING HAND-CIRCLE INDEX RING LITTLE;So;0;L;;;;;N;;;;; +1D8BC;SIGNWRITING HAND-CURLICUE INDEX RING LITTLE ON;So;0;L;;;;;N;;;;; +1D8BD;SIGNWRITING HAND-HOOK INDEX RING LITTLE OUT;So;0;L;;;;;N;;;;; +1D8BE;SIGNWRITING HAND-HOOK INDEX RING LITTLE IN;So;0;L;;;;;N;;;;; +1D8BF;SIGNWRITING HAND-HOOK INDEX RING LITTLE UNDER;So;0;L;;;;;N;;;;; +1D8C0;SIGNWRITING HAND-CUP INDEX RING LITTLE;So;0;L;;;;;N;;;;; +1D8C1;SIGNWRITING HAND-HINGE INDEX RING LITTLE;So;0;L;;;;;N;;;;; +1D8C2;SIGNWRITING HAND-ANGLE INDEX RING LITTLE OUT;So;0;L;;;;;N;;;;; +1D8C3;SIGNWRITING HAND-ANGLE INDEX RING LITTLE;So;0;L;;;;;N;;;;; +1D8C4;SIGNWRITING HAND-FIST MIDDLE DOWN;So;0;L;;;;;N;;;;; +1D8C5;SIGNWRITING HAND-HINGE MIDDLE;So;0;L;;;;;N;;;;; +1D8C6;SIGNWRITING HAND-FIST MIDDLE UP;So;0;L;;;;;N;;;;; +1D8C7;SIGNWRITING HAND-CIRCLE MIDDLE UP;So;0;L;;;;;N;;;;; +1D8C8;SIGNWRITING HAND-FIST MIDDLE RAISED KNUCKLE;So;0;L;;;;;N;;;;; +1D8C9;SIGNWRITING HAND-FIST MIDDLE UP THUMB SIDE;So;0;L;;;;;N;;;;; +1D8CA;SIGNWRITING HAND-HOOK MIDDLE THUMB;So;0;L;;;;;N;;;;; +1D8CB;SIGNWRITING HAND-FIST MIDDLE THUMB LITTLE;So;0;L;;;;;N;;;;; +1D8CC;SIGNWRITING HAND-FIST MIDDLE LITTLE;So;0;L;;;;;N;;;;; +1D8CD;SIGNWRITING HAND-FIST MIDDLE RING LITTLE;So;0;L;;;;;N;;;;; +1D8CE;SIGNWRITING HAND-CIRCLE MIDDLE RING LITTLE;So;0;L;;;;;N;;;;; +1D8CF;SIGNWRITING HAND-CURLICUE MIDDLE RING LITTLE ON;So;0;L;;;;;N;;;;; +1D8D0;SIGNWRITING HAND-CUP MIDDLE RING LITTLE;So;0;L;;;;;N;;;;; +1D8D1;SIGNWRITING HAND-HINGE MIDDLE RING LITTLE;So;0;L;;;;;N;;;;; +1D8D2;SIGNWRITING HAND-ANGLE MIDDLE RING LITTLE OUT;So;0;L;;;;;N;;;;; +1D8D3;SIGNWRITING HAND-ANGLE MIDDLE RING LITTLE IN;So;0;L;;;;;N;;;;; +1D8D4;SIGNWRITING HAND-ANGLE MIDDLE RING LITTLE;So;0;L;;;;;N;;;;; +1D8D5;SIGNWRITING HAND-CIRCLE MIDDLE RING LITTLE BENT;So;0;L;;;;;N;;;;; +1D8D6;SIGNWRITING HAND-CLAW MIDDLE RING LITTLE CONJOINED;So;0;L;;;;;N;;;;; +1D8D7;SIGNWRITING HAND-CLAW MIDDLE RING LITTLE CONJOINED SIDE;So;0;L;;;;;N;;;;; +1D8D8;SIGNWRITING HAND-HOOK MIDDLE RING LITTLE CONJOINED OUT;So;0;L;;;;;N;;;;; +1D8D9;SIGNWRITING HAND-HOOK MIDDLE RING LITTLE CONJOINED IN;So;0;L;;;;;N;;;;; +1D8DA;SIGNWRITING HAND-HOOK MIDDLE RING LITTLE CONJOINED;So;0;L;;;;;N;;;;; +1D8DB;SIGNWRITING HAND-HINGE INDEX HINGED;So;0;L;;;;;N;;;;; +1D8DC;SIGNWRITING HAND-FIST INDEX THUMB SIDE;So;0;L;;;;;N;;;;; +1D8DD;SIGNWRITING HAND-HINGE INDEX THUMB SIDE;So;0;L;;;;;N;;;;; +1D8DE;SIGNWRITING HAND-FIST INDEX THUMB SIDE THUMB DIAGONAL;So;0;L;;;;;N;;;;; +1D8DF;SIGNWRITING HAND-FIST INDEX THUMB SIDE THUMB CONJOINED;So;0;L;;;;;N;;;;; +1D8E0;SIGNWRITING HAND-FIST INDEX THUMB SIDE THUMB BENT;So;0;L;;;;;N;;;;; +1D8E1;SIGNWRITING HAND-FIST INDEX THUMB SIDE INDEX BENT;So;0;L;;;;;N;;;;; +1D8E2;SIGNWRITING HAND-FIST INDEX THUMB SIDE BOTH BENT;So;0;L;;;;;N;;;;; +1D8E3;SIGNWRITING HAND-FIST INDEX THUMB SIDE INDEX HINGE;So;0;L;;;;;N;;;;; +1D8E4;SIGNWRITING HAND-FIST INDEX THUMB FORWARD INDEX STRAIGHT;So;0;L;;;;;N;;;;; +1D8E5;SIGNWRITING HAND-FIST INDEX THUMB FORWARD INDEX BENT;So;0;L;;;;;N;;;;; +1D8E6;SIGNWRITING HAND-FIST INDEX THUMB HOOK;So;0;L;;;;;N;;;;; +1D8E7;SIGNWRITING HAND-FIST INDEX THUMB CURLICUE;So;0;L;;;;;N;;;;; +1D8E8;SIGNWRITING HAND-FIST INDEX THUMB CURVE THUMB INSIDE;So;0;L;;;;;N;;;;; +1D8E9;SIGNWRITING HAND-CLAW INDEX THUMB CURVE THUMB INSIDE;So;0;L;;;;;N;;;;; +1D8EA;SIGNWRITING HAND-FIST INDEX THUMB CURVE THUMB UNDER;So;0;L;;;;;N;;;;; +1D8EB;SIGNWRITING HAND-FIST INDEX THUMB CIRCLE;So;0;L;;;;;N;;;;; +1D8EC;SIGNWRITING HAND-CUP INDEX THUMB;So;0;L;;;;;N;;;;; +1D8ED;SIGNWRITING HAND-CUP INDEX THUMB OPEN;So;0;L;;;;;N;;;;; +1D8EE;SIGNWRITING HAND-HINGE INDEX THUMB OPEN;So;0;L;;;;;N;;;;; +1D8EF;SIGNWRITING HAND-HINGE INDEX THUMB LARGE;So;0;L;;;;;N;;;;; +1D8F0;SIGNWRITING HAND-HINGE INDEX THUMB;So;0;L;;;;;N;;;;; +1D8F1;SIGNWRITING HAND-HINGE INDEX THUMB SMALL;So;0;L;;;;;N;;;;; +1D8F2;SIGNWRITING HAND-ANGLE INDEX THUMB OUT;So;0;L;;;;;N;;;;; +1D8F3;SIGNWRITING HAND-ANGLE INDEX THUMB IN;So;0;L;;;;;N;;;;; +1D8F4;SIGNWRITING HAND-ANGLE INDEX THUMB;So;0;L;;;;;N;;;;; +1D8F5;SIGNWRITING HAND-FIST THUMB;So;0;L;;;;;N;;;;; +1D8F6;SIGNWRITING HAND-FIST THUMB HEEL;So;0;L;;;;;N;;;;; +1D8F7;SIGNWRITING HAND-FIST THUMB SIDE DIAGONAL;So;0;L;;;;;N;;;;; +1D8F8;SIGNWRITING HAND-FIST THUMB SIDE CONJOINED;So;0;L;;;;;N;;;;; +1D8F9;SIGNWRITING HAND-FIST THUMB SIDE BENT;So;0;L;;;;;N;;;;; +1D8FA;SIGNWRITING HAND-FIST THUMB FORWARD;So;0;L;;;;;N;;;;; +1D8FB;SIGNWRITING HAND-FIST THUMB BETWEEN INDEX MIDDLE;So;0;L;;;;;N;;;;; +1D8FC;SIGNWRITING HAND-FIST THUMB BETWEEN MIDDLE RING;So;0;L;;;;;N;;;;; +1D8FD;SIGNWRITING HAND-FIST THUMB BETWEEN RING LITTLE;So;0;L;;;;;N;;;;; +1D8FE;SIGNWRITING HAND-FIST THUMB UNDER TWO FINGERS;So;0;L;;;;;N;;;;; +1D8FF;SIGNWRITING HAND-FIST THUMB OVER TWO FINGERS;So;0;L;;;;;N;;;;; +1D900;SIGNWRITING HAND-FIST THUMB UNDER THREE FINGERS;So;0;L;;;;;N;;;;; +1D901;SIGNWRITING HAND-FIST THUMB UNDER FOUR FINGERS;So;0;L;;;;;N;;;;; +1D902;SIGNWRITING HAND-FIST THUMB OVER FOUR RAISED KNUCKLES;So;0;L;;;;;N;;;;; +1D903;SIGNWRITING HAND-FIST;So;0;L;;;;;N;;;;; +1D904;SIGNWRITING HAND-FIST HEEL;So;0;L;;;;;N;;;;; +1D905;SIGNWRITING TOUCH SINGLE;So;0;L;;;;;N;;;;; +1D906;SIGNWRITING TOUCH MULTIPLE;So;0;L;;;;;N;;;;; +1D907;SIGNWRITING TOUCH BETWEEN;So;0;L;;;;;N;;;;; +1D908;SIGNWRITING GRASP SINGLE;So;0;L;;;;;N;;;;; +1D909;SIGNWRITING GRASP MULTIPLE;So;0;L;;;;;N;;;;; +1D90A;SIGNWRITING GRASP BETWEEN;So;0;L;;;;;N;;;;; +1D90B;SIGNWRITING STRIKE SINGLE;So;0;L;;;;;N;;;;; +1D90C;SIGNWRITING STRIKE MULTIPLE;So;0;L;;;;;N;;;;; +1D90D;SIGNWRITING STRIKE BETWEEN;So;0;L;;;;;N;;;;; +1D90E;SIGNWRITING BRUSH SINGLE;So;0;L;;;;;N;;;;; +1D90F;SIGNWRITING BRUSH MULTIPLE;So;0;L;;;;;N;;;;; +1D910;SIGNWRITING BRUSH BETWEEN;So;0;L;;;;;N;;;;; +1D911;SIGNWRITING RUB SINGLE;So;0;L;;;;;N;;;;; +1D912;SIGNWRITING RUB MULTIPLE;So;0;L;;;;;N;;;;; +1D913;SIGNWRITING RUB BETWEEN;So;0;L;;;;;N;;;;; +1D914;SIGNWRITING SURFACE SYMBOLS;So;0;L;;;;;N;;;;; +1D915;SIGNWRITING SURFACE BETWEEN;So;0;L;;;;;N;;;;; +1D916;SIGNWRITING SQUEEZE LARGE SINGLE;So;0;L;;;;;N;;;;; +1D917;SIGNWRITING SQUEEZE SMALL SINGLE;So;0;L;;;;;N;;;;; +1D918;SIGNWRITING SQUEEZE LARGE MULTIPLE;So;0;L;;;;;N;;;;; +1D919;SIGNWRITING SQUEEZE SMALL MULTIPLE;So;0;L;;;;;N;;;;; +1D91A;SIGNWRITING SQUEEZE SEQUENTIAL;So;0;L;;;;;N;;;;; +1D91B;SIGNWRITING FLICK LARGE SINGLE;So;0;L;;;;;N;;;;; +1D91C;SIGNWRITING FLICK SMALL SINGLE;So;0;L;;;;;N;;;;; +1D91D;SIGNWRITING FLICK LARGE MULTIPLE;So;0;L;;;;;N;;;;; +1D91E;SIGNWRITING FLICK SMALL MULTIPLE;So;0;L;;;;;N;;;;; +1D91F;SIGNWRITING FLICK SEQUENTIAL;So;0;L;;;;;N;;;;; +1D920;SIGNWRITING SQUEEZE FLICK ALTERNATING;So;0;L;;;;;N;;;;; +1D921;SIGNWRITING MOVEMENT-HINGE UP DOWN LARGE;So;0;L;;;;;N;;;;; +1D922;SIGNWRITING MOVEMENT-HINGE UP DOWN SMALL;So;0;L;;;;;N;;;;; +1D923;SIGNWRITING MOVEMENT-HINGE UP SEQUENTIAL;So;0;L;;;;;N;;;;; +1D924;SIGNWRITING MOVEMENT-HINGE DOWN SEQUENTIAL;So;0;L;;;;;N;;;;; +1D925;SIGNWRITING MOVEMENT-HINGE UP DOWN ALTERNATING LARGE;So;0;L;;;;;N;;;;; +1D926;SIGNWRITING MOVEMENT-HINGE UP DOWN ALTERNATING SMALL;So;0;L;;;;;N;;;;; +1D927;SIGNWRITING MOVEMENT-HINGE SIDE TO SIDE SCISSORS;So;0;L;;;;;N;;;;; +1D928;SIGNWRITING MOVEMENT-WALLPLANE FINGER CONTACT;So;0;L;;;;;N;;;;; +1D929;SIGNWRITING MOVEMENT-FLOORPLANE FINGER CONTACT;So;0;L;;;;;N;;;;; +1D92A;SIGNWRITING MOVEMENT-WALLPLANE SINGLE STRAIGHT SMALL;So;0;L;;;;;N;;;;; +1D92B;SIGNWRITING MOVEMENT-WALLPLANE SINGLE STRAIGHT MEDIUM;So;0;L;;;;;N;;;;; +1D92C;SIGNWRITING MOVEMENT-WALLPLANE SINGLE STRAIGHT LARGE;So;0;L;;;;;N;;;;; +1D92D;SIGNWRITING MOVEMENT-WALLPLANE SINGLE STRAIGHT LARGEST;So;0;L;;;;;N;;;;; +1D92E;SIGNWRITING MOVEMENT-WALLPLANE SINGLE WRIST FLEX;So;0;L;;;;;N;;;;; +1D92F;SIGNWRITING MOVEMENT-WALLPLANE DOUBLE STRAIGHT;So;0;L;;;;;N;;;;; +1D930;SIGNWRITING MOVEMENT-WALLPLANE DOUBLE WRIST FLEX;So;0;L;;;;;N;;;;; +1D931;SIGNWRITING MOVEMENT-WALLPLANE DOUBLE ALTERNATING;So;0;L;;;;;N;;;;; +1D932;SIGNWRITING MOVEMENT-WALLPLANE DOUBLE ALTERNATING WRIST FLEX;So;0;L;;;;;N;;;;; +1D933;SIGNWRITING MOVEMENT-WALLPLANE CROSS;So;0;L;;;;;N;;;;; +1D934;SIGNWRITING MOVEMENT-WALLPLANE TRIPLE STRAIGHT MOVEMENT;So;0;L;;;;;N;;;;; +1D935;SIGNWRITING MOVEMENT-WALLPLANE TRIPLE WRIST FLEX;So;0;L;;;;;N;;;;; +1D936;SIGNWRITING MOVEMENT-WALLPLANE TRIPLE ALTERNATING;So;0;L;;;;;N;;;;; +1D937;SIGNWRITING MOVEMENT-WALLPLANE TRIPLE ALTERNATING WRIST FLEX;So;0;L;;;;;N;;;;; +1D938;SIGNWRITING MOVEMENT-WALLPLANE BEND SMALL;So;0;L;;;;;N;;;;; +1D939;SIGNWRITING MOVEMENT-WALLPLANE BEND MEDIUM;So;0;L;;;;;N;;;;; +1D93A;SIGNWRITING MOVEMENT-WALLPLANE BEND LARGE;So;0;L;;;;;N;;;;; +1D93B;SIGNWRITING MOVEMENT-WALLPLANE CORNER SMALL;So;0;L;;;;;N;;;;; +1D93C;SIGNWRITING MOVEMENT-WALLPLANE CORNER MEDIUM;So;0;L;;;;;N;;;;; +1D93D;SIGNWRITING MOVEMENT-WALLPLANE CORNER LARGE;So;0;L;;;;;N;;;;; +1D93E;SIGNWRITING MOVEMENT-WALLPLANE CORNER ROTATION;So;0;L;;;;;N;;;;; +1D93F;SIGNWRITING MOVEMENT-WALLPLANE CHECK SMALL;So;0;L;;;;;N;;;;; +1D940;SIGNWRITING MOVEMENT-WALLPLANE CHECK MEDIUM;So;0;L;;;;;N;;;;; +1D941;SIGNWRITING MOVEMENT-WALLPLANE CHECK LARGE;So;0;L;;;;;N;;;;; +1D942;SIGNWRITING MOVEMENT-WALLPLANE BOX SMALL;So;0;L;;;;;N;;;;; +1D943;SIGNWRITING MOVEMENT-WALLPLANE BOX MEDIUM;So;0;L;;;;;N;;;;; +1D944;SIGNWRITING MOVEMENT-WALLPLANE BOX LARGE;So;0;L;;;;;N;;;;; +1D945;SIGNWRITING MOVEMENT-WALLPLANE ZIGZAG SMALL;So;0;L;;;;;N;;;;; +1D946;SIGNWRITING MOVEMENT-WALLPLANE ZIGZAG MEDIUM;So;0;L;;;;;N;;;;; +1D947;SIGNWRITING MOVEMENT-WALLPLANE ZIGZAG LARGE;So;0;L;;;;;N;;;;; +1D948;SIGNWRITING MOVEMENT-WALLPLANE PEAKS SMALL;So;0;L;;;;;N;;;;; +1D949;SIGNWRITING MOVEMENT-WALLPLANE PEAKS MEDIUM;So;0;L;;;;;N;;;;; +1D94A;SIGNWRITING MOVEMENT-WALLPLANE PEAKS LARGE;So;0;L;;;;;N;;;;; +1D94B;SIGNWRITING TRAVEL-WALLPLANE ROTATION-WALLPLANE SINGLE;So;0;L;;;;;N;;;;; +1D94C;SIGNWRITING TRAVEL-WALLPLANE ROTATION-WALLPLANE DOUBLE;So;0;L;;;;;N;;;;; +1D94D;SIGNWRITING TRAVEL-WALLPLANE ROTATION-WALLPLANE ALTERNATING;So;0;L;;;;;N;;;;; +1D94E;SIGNWRITING TRAVEL-WALLPLANE ROTATION-FLOORPLANE SINGLE;So;0;L;;;;;N;;;;; +1D94F;SIGNWRITING TRAVEL-WALLPLANE ROTATION-FLOORPLANE DOUBLE;So;0;L;;;;;N;;;;; +1D950;SIGNWRITING TRAVEL-WALLPLANE ROTATION-FLOORPLANE ALTERNATING;So;0;L;;;;;N;;;;; +1D951;SIGNWRITING TRAVEL-WALLPLANE SHAKING;So;0;L;;;;;N;;;;; +1D952;SIGNWRITING TRAVEL-WALLPLANE ARM SPIRAL SINGLE;So;0;L;;;;;N;;;;; +1D953;SIGNWRITING TRAVEL-WALLPLANE ARM SPIRAL DOUBLE;So;0;L;;;;;N;;;;; +1D954;SIGNWRITING TRAVEL-WALLPLANE ARM SPIRAL TRIPLE;So;0;L;;;;;N;;;;; +1D955;SIGNWRITING MOVEMENT-DIAGONAL AWAY SMALL;So;0;L;;;;;N;;;;; +1D956;SIGNWRITING MOVEMENT-DIAGONAL AWAY MEDIUM;So;0;L;;;;;N;;;;; +1D957;SIGNWRITING MOVEMENT-DIAGONAL AWAY LARGE;So;0;L;;;;;N;;;;; +1D958;SIGNWRITING MOVEMENT-DIAGONAL AWAY LARGEST;So;0;L;;;;;N;;;;; +1D959;SIGNWRITING MOVEMENT-DIAGONAL TOWARDS SMALL;So;0;L;;;;;N;;;;; +1D95A;SIGNWRITING MOVEMENT-DIAGONAL TOWARDS MEDIUM;So;0;L;;;;;N;;;;; +1D95B;SIGNWRITING MOVEMENT-DIAGONAL TOWARDS LARGE;So;0;L;;;;;N;;;;; +1D95C;SIGNWRITING MOVEMENT-DIAGONAL TOWARDS LARGEST;So;0;L;;;;;N;;;;; +1D95D;SIGNWRITING MOVEMENT-DIAGONAL BETWEEN AWAY SMALL;So;0;L;;;;;N;;;;; +1D95E;SIGNWRITING MOVEMENT-DIAGONAL BETWEEN AWAY MEDIUM;So;0;L;;;;;N;;;;; +1D95F;SIGNWRITING MOVEMENT-DIAGONAL BETWEEN AWAY LARGE;So;0;L;;;;;N;;;;; +1D960;SIGNWRITING MOVEMENT-DIAGONAL BETWEEN AWAY LARGEST;So;0;L;;;;;N;;;;; +1D961;SIGNWRITING MOVEMENT-DIAGONAL BETWEEN TOWARDS SMALL;So;0;L;;;;;N;;;;; +1D962;SIGNWRITING MOVEMENT-DIAGONAL BETWEEN TOWARDS MEDIUM;So;0;L;;;;;N;;;;; +1D963;SIGNWRITING MOVEMENT-DIAGONAL BETWEEN TOWARDS LARGE;So;0;L;;;;;N;;;;; +1D964;SIGNWRITING MOVEMENT-DIAGONAL BETWEEN TOWARDS LARGEST;So;0;L;;;;;N;;;;; +1D965;SIGNWRITING MOVEMENT-FLOORPLANE SINGLE STRAIGHT SMALL;So;0;L;;;;;N;;;;; +1D966;SIGNWRITING MOVEMENT-FLOORPLANE SINGLE STRAIGHT MEDIUM;So;0;L;;;;;N;;;;; +1D967;SIGNWRITING MOVEMENT-FLOORPLANE SINGLE STRAIGHT LARGE;So;0;L;;;;;N;;;;; +1D968;SIGNWRITING MOVEMENT-FLOORPLANE SINGLE STRAIGHT LARGEST;So;0;L;;;;;N;;;;; +1D969;SIGNWRITING MOVEMENT-FLOORPLANE SINGLE WRIST FLEX;So;0;L;;;;;N;;;;; +1D96A;SIGNWRITING MOVEMENT-FLOORPLANE DOUBLE STRAIGHT;So;0;L;;;;;N;;;;; +1D96B;SIGNWRITING MOVEMENT-FLOORPLANE DOUBLE WRIST FLEX;So;0;L;;;;;N;;;;; +1D96C;SIGNWRITING MOVEMENT-FLOORPLANE DOUBLE ALTERNATING;So;0;L;;;;;N;;;;; +1D96D;SIGNWRITING MOVEMENT-FLOORPLANE DOUBLE ALTERNATING WRIST FLEX;So;0;L;;;;;N;;;;; +1D96E;SIGNWRITING MOVEMENT-FLOORPLANE CROSS;So;0;L;;;;;N;;;;; +1D96F;SIGNWRITING MOVEMENT-FLOORPLANE TRIPLE STRAIGHT MOVEMENT;So;0;L;;;;;N;;;;; +1D970;SIGNWRITING MOVEMENT-FLOORPLANE TRIPLE WRIST FLEX;So;0;L;;;;;N;;;;; +1D971;SIGNWRITING MOVEMENT-FLOORPLANE TRIPLE ALTERNATING MOVEMENT;So;0;L;;;;;N;;;;; +1D972;SIGNWRITING MOVEMENT-FLOORPLANE TRIPLE ALTERNATING WRIST FLEX;So;0;L;;;;;N;;;;; +1D973;SIGNWRITING MOVEMENT-FLOORPLANE BEND;So;0;L;;;;;N;;;;; +1D974;SIGNWRITING MOVEMENT-FLOORPLANE CORNER SMALL;So;0;L;;;;;N;;;;; +1D975;SIGNWRITING MOVEMENT-FLOORPLANE CORNER MEDIUM;So;0;L;;;;;N;;;;; +1D976;SIGNWRITING MOVEMENT-FLOORPLANE CORNER LARGE;So;0;L;;;;;N;;;;; +1D977;SIGNWRITING MOVEMENT-FLOORPLANE CHECK;So;0;L;;;;;N;;;;; +1D978;SIGNWRITING MOVEMENT-FLOORPLANE BOX SMALL;So;0;L;;;;;N;;;;; +1D979;SIGNWRITING MOVEMENT-FLOORPLANE BOX MEDIUM;So;0;L;;;;;N;;;;; +1D97A;SIGNWRITING MOVEMENT-FLOORPLANE BOX LARGE;So;0;L;;;;;N;;;;; +1D97B;SIGNWRITING MOVEMENT-FLOORPLANE ZIGZAG SMALL;So;0;L;;;;;N;;;;; +1D97C;SIGNWRITING MOVEMENT-FLOORPLANE ZIGZAG MEDIUM;So;0;L;;;;;N;;;;; +1D97D;SIGNWRITING MOVEMENT-FLOORPLANE ZIGZAG LARGE;So;0;L;;;;;N;;;;; +1D97E;SIGNWRITING MOVEMENT-FLOORPLANE PEAKS SMALL;So;0;L;;;;;N;;;;; +1D97F;SIGNWRITING MOVEMENT-FLOORPLANE PEAKS MEDIUM;So;0;L;;;;;N;;;;; +1D980;SIGNWRITING MOVEMENT-FLOORPLANE PEAKS LARGE;So;0;L;;;;;N;;;;; +1D981;SIGNWRITING TRAVEL-FLOORPLANE ROTATION-FLOORPLANE SINGLE;So;0;L;;;;;N;;;;; +1D982;SIGNWRITING TRAVEL-FLOORPLANE ROTATION-FLOORPLANE DOUBLE;So;0;L;;;;;N;;;;; +1D983;SIGNWRITING TRAVEL-FLOORPLANE ROTATION-FLOORPLANE ALTERNATING;So;0;L;;;;;N;;;;; +1D984;SIGNWRITING TRAVEL-FLOORPLANE ROTATION-WALLPLANE SINGLE;So;0;L;;;;;N;;;;; +1D985;SIGNWRITING TRAVEL-FLOORPLANE ROTATION-WALLPLANE DOUBLE;So;0;L;;;;;N;;;;; +1D986;SIGNWRITING TRAVEL-FLOORPLANE ROTATION-WALLPLANE ALTERNATING;So;0;L;;;;;N;;;;; +1D987;SIGNWRITING TRAVEL-FLOORPLANE SHAKING;So;0;L;;;;;N;;;;; +1D988;SIGNWRITING MOVEMENT-WALLPLANE CURVE QUARTER SMALL;So;0;L;;;;;N;;;;; +1D989;SIGNWRITING MOVEMENT-WALLPLANE CURVE QUARTER MEDIUM;So;0;L;;;;;N;;;;; +1D98A;SIGNWRITING MOVEMENT-WALLPLANE CURVE QUARTER LARGE;So;0;L;;;;;N;;;;; +1D98B;SIGNWRITING MOVEMENT-WALLPLANE CURVE QUARTER LARGEST;So;0;L;;;;;N;;;;; +1D98C;SIGNWRITING MOVEMENT-WALLPLANE CURVE HALF-CIRCLE SMALL;So;0;L;;;;;N;;;;; +1D98D;SIGNWRITING MOVEMENT-WALLPLANE CURVE HALF-CIRCLE MEDIUM;So;0;L;;;;;N;;;;; +1D98E;SIGNWRITING MOVEMENT-WALLPLANE CURVE HALF-CIRCLE LARGE;So;0;L;;;;;N;;;;; +1D98F;SIGNWRITING MOVEMENT-WALLPLANE CURVE HALF-CIRCLE LARGEST;So;0;L;;;;;N;;;;; +1D990;SIGNWRITING MOVEMENT-WALLPLANE CURVE THREE-QUARTER CIRCLE SMALL;So;0;L;;;;;N;;;;; +1D991;SIGNWRITING MOVEMENT-WALLPLANE CURVE THREE-QUARTER CIRCLE MEDIUM;So;0;L;;;;;N;;;;; +1D992;SIGNWRITING MOVEMENT-WALLPLANE HUMP SMALL;So;0;L;;;;;N;;;;; +1D993;SIGNWRITING MOVEMENT-WALLPLANE HUMP MEDIUM;So;0;L;;;;;N;;;;; +1D994;SIGNWRITING MOVEMENT-WALLPLANE HUMP LARGE;So;0;L;;;;;N;;;;; +1D995;SIGNWRITING MOVEMENT-WALLPLANE LOOP SMALL;So;0;L;;;;;N;;;;; +1D996;SIGNWRITING MOVEMENT-WALLPLANE LOOP MEDIUM;So;0;L;;;;;N;;;;; +1D997;SIGNWRITING MOVEMENT-WALLPLANE LOOP LARGE;So;0;L;;;;;N;;;;; +1D998;SIGNWRITING MOVEMENT-WALLPLANE LOOP SMALL DOUBLE;So;0;L;;;;;N;;;;; +1D999;SIGNWRITING MOVEMENT-WALLPLANE WAVE CURVE DOUBLE SMALL;So;0;L;;;;;N;;;;; +1D99A;SIGNWRITING MOVEMENT-WALLPLANE WAVE CURVE DOUBLE MEDIUM;So;0;L;;;;;N;;;;; +1D99B;SIGNWRITING MOVEMENT-WALLPLANE WAVE CURVE DOUBLE LARGE;So;0;L;;;;;N;;;;; +1D99C;SIGNWRITING MOVEMENT-WALLPLANE WAVE CURVE TRIPLE SMALL;So;0;L;;;;;N;;;;; +1D99D;SIGNWRITING MOVEMENT-WALLPLANE WAVE CURVE TRIPLE MEDIUM;So;0;L;;;;;N;;;;; +1D99E;SIGNWRITING MOVEMENT-WALLPLANE WAVE CURVE TRIPLE LARGE;So;0;L;;;;;N;;;;; +1D99F;SIGNWRITING MOVEMENT-WALLPLANE CURVE THEN STRAIGHT;So;0;L;;;;;N;;;;; +1D9A0;SIGNWRITING MOVEMENT-WALLPLANE CURVED CROSS SMALL;So;0;L;;;;;N;;;;; +1D9A1;SIGNWRITING MOVEMENT-WALLPLANE CURVED CROSS MEDIUM;So;0;L;;;;;N;;;;; +1D9A2;SIGNWRITING ROTATION-WALLPLANE SINGLE;So;0;L;;;;;N;;;;; +1D9A3;SIGNWRITING ROTATION-WALLPLANE DOUBLE;So;0;L;;;;;N;;;;; +1D9A4;SIGNWRITING ROTATION-WALLPLANE ALTERNATE;So;0;L;;;;;N;;;;; +1D9A5;SIGNWRITING MOVEMENT-WALLPLANE SHAKING;So;0;L;;;;;N;;;;; +1D9A6;SIGNWRITING MOVEMENT-WALLPLANE CURVE HITTING FRONT WALL;So;0;L;;;;;N;;;;; +1D9A7;SIGNWRITING MOVEMENT-WALLPLANE HUMP HITTING FRONT WALL;So;0;L;;;;;N;;;;; +1D9A8;SIGNWRITING MOVEMENT-WALLPLANE LOOP HITTING FRONT WALL;So;0;L;;;;;N;;;;; +1D9A9;SIGNWRITING MOVEMENT-WALLPLANE WAVE HITTING FRONT WALL;So;0;L;;;;;N;;;;; +1D9AA;SIGNWRITING ROTATION-WALLPLANE SINGLE HITTING FRONT WALL;So;0;L;;;;;N;;;;; +1D9AB;SIGNWRITING ROTATION-WALLPLANE DOUBLE HITTING FRONT WALL;So;0;L;;;;;N;;;;; +1D9AC;SIGNWRITING ROTATION-WALLPLANE ALTERNATING HITTING FRONT WALL;So;0;L;;;;;N;;;;; +1D9AD;SIGNWRITING MOVEMENT-WALLPLANE CURVE HITTING CHEST;So;0;L;;;;;N;;;;; +1D9AE;SIGNWRITING MOVEMENT-WALLPLANE HUMP HITTING CHEST;So;0;L;;;;;N;;;;; +1D9AF;SIGNWRITING MOVEMENT-WALLPLANE LOOP HITTING CHEST;So;0;L;;;;;N;;;;; +1D9B0;SIGNWRITING MOVEMENT-WALLPLANE WAVE HITTING CHEST;So;0;L;;;;;N;;;;; +1D9B1;SIGNWRITING ROTATION-WALLPLANE SINGLE HITTING CHEST;So;0;L;;;;;N;;;;; +1D9B2;SIGNWRITING ROTATION-WALLPLANE DOUBLE HITTING CHEST;So;0;L;;;;;N;;;;; +1D9B3;SIGNWRITING ROTATION-WALLPLANE ALTERNATING HITTING CHEST;So;0;L;;;;;N;;;;; +1D9B4;SIGNWRITING MOVEMENT-WALLPLANE WAVE DIAGONAL PATH SMALL;So;0;L;;;;;N;;;;; +1D9B5;SIGNWRITING MOVEMENT-WALLPLANE WAVE DIAGONAL PATH MEDIUM;So;0;L;;;;;N;;;;; +1D9B6;SIGNWRITING MOVEMENT-WALLPLANE WAVE DIAGONAL PATH LARGE;So;0;L;;;;;N;;;;; +1D9B7;SIGNWRITING MOVEMENT-FLOORPLANE CURVE HITTING CEILING SMALL;So;0;L;;;;;N;;;;; +1D9B8;SIGNWRITING MOVEMENT-FLOORPLANE CURVE HITTING CEILING LARGE;So;0;L;;;;;N;;;;; +1D9B9;SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING CEILING SMALL DOUBLE;So;0;L;;;;;N;;;;; +1D9BA;SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING CEILING LARGE DOUBLE;So;0;L;;;;;N;;;;; +1D9BB;SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING CEILING SMALL TRIPLE;So;0;L;;;;;N;;;;; +1D9BC;SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING CEILING LARGE TRIPLE;So;0;L;;;;;N;;;;; +1D9BD;SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING CEILING SMALL SINGLE;So;0;L;;;;;N;;;;; +1D9BE;SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING CEILING LARGE SINGLE;So;0;L;;;;;N;;;;; +1D9BF;SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING CEILING SMALL DOUBLE;So;0;L;;;;;N;;;;; +1D9C0;SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING CEILING LARGE DOUBLE;So;0;L;;;;;N;;;;; +1D9C1;SIGNWRITING MOVEMENT-FLOORPLANE WAVE HITTING CEILING SMALL;So;0;L;;;;;N;;;;; +1D9C2;SIGNWRITING MOVEMENT-FLOORPLANE WAVE HITTING CEILING LARGE;So;0;L;;;;;N;;;;; +1D9C3;SIGNWRITING ROTATION-FLOORPLANE SINGLE HITTING CEILING;So;0;L;;;;;N;;;;; +1D9C4;SIGNWRITING ROTATION-FLOORPLANE DOUBLE HITTING CEILING;So;0;L;;;;;N;;;;; +1D9C5;SIGNWRITING ROTATION-FLOORPLANE ALTERNATING HITTING CEILING;So;0;L;;;;;N;;;;; +1D9C6;SIGNWRITING MOVEMENT-FLOORPLANE CURVE HITTING FLOOR SMALL;So;0;L;;;;;N;;;;; +1D9C7;SIGNWRITING MOVEMENT-FLOORPLANE CURVE HITTING FLOOR LARGE;So;0;L;;;;;N;;;;; +1D9C8;SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING FLOOR SMALL DOUBLE;So;0;L;;;;;N;;;;; +1D9C9;SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING FLOOR LARGE DOUBLE;So;0;L;;;;;N;;;;; +1D9CA;SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING FLOOR TRIPLE SMALL TRIPLE;So;0;L;;;;;N;;;;; +1D9CB;SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING FLOOR TRIPLE LARGE TRIPLE;So;0;L;;;;;N;;;;; +1D9CC;SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING FLOOR SMALL SINGLE;So;0;L;;;;;N;;;;; +1D9CD;SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING FLOOR LARGE SINGLE;So;0;L;;;;;N;;;;; +1D9CE;SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING FLOOR SMALL DOUBLE;So;0;L;;;;;N;;;;; +1D9CF;SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING FLOOR LARGE DOUBLE;So;0;L;;;;;N;;;;; +1D9D0;SIGNWRITING MOVEMENT-FLOORPLANE WAVE HITTING FLOOR SMALL;So;0;L;;;;;N;;;;; +1D9D1;SIGNWRITING MOVEMENT-FLOORPLANE WAVE HITTING FLOOR LARGE;So;0;L;;;;;N;;;;; +1D9D2;SIGNWRITING ROTATION-FLOORPLANE SINGLE HITTING FLOOR;So;0;L;;;;;N;;;;; +1D9D3;SIGNWRITING ROTATION-FLOORPLANE DOUBLE HITTING FLOOR;So;0;L;;;;;N;;;;; +1D9D4;SIGNWRITING ROTATION-FLOORPLANE ALTERNATING HITTING FLOOR;So;0;L;;;;;N;;;;; +1D9D5;SIGNWRITING MOVEMENT-FLOORPLANE CURVE SMALL;So;0;L;;;;;N;;;;; +1D9D6;SIGNWRITING MOVEMENT-FLOORPLANE CURVE MEDIUM;So;0;L;;;;;N;;;;; +1D9D7;SIGNWRITING MOVEMENT-FLOORPLANE CURVE LARGE;So;0;L;;;;;N;;;;; +1D9D8;SIGNWRITING MOVEMENT-FLOORPLANE CURVE LARGEST;So;0;L;;;;;N;;;;; +1D9D9;SIGNWRITING MOVEMENT-FLOORPLANE CURVE COMBINED;So;0;L;;;;;N;;;;; +1D9DA;SIGNWRITING MOVEMENT-FLOORPLANE HUMP SMALL;So;0;L;;;;;N;;;;; +1D9DB;SIGNWRITING MOVEMENT-FLOORPLANE LOOP SMALL;So;0;L;;;;;N;;;;; +1D9DC;SIGNWRITING MOVEMENT-FLOORPLANE WAVE SNAKE;So;0;L;;;;;N;;;;; +1D9DD;SIGNWRITING MOVEMENT-FLOORPLANE WAVE SMALL;So;0;L;;;;;N;;;;; +1D9DE;SIGNWRITING MOVEMENT-FLOORPLANE WAVE LARGE;So;0;L;;;;;N;;;;; +1D9DF;SIGNWRITING ROTATION-FLOORPLANE SINGLE;So;0;L;;;;;N;;;;; +1D9E0;SIGNWRITING ROTATION-FLOORPLANE DOUBLE;So;0;L;;;;;N;;;;; +1D9E1;SIGNWRITING ROTATION-FLOORPLANE ALTERNATING;So;0;L;;;;;N;;;;; +1D9E2;SIGNWRITING MOVEMENT-FLOORPLANE SHAKING PARALLEL;So;0;L;;;;;N;;;;; +1D9E3;SIGNWRITING MOVEMENT-WALLPLANE ARM CIRCLE SMALL SINGLE;So;0;L;;;;;N;;;;; +1D9E4;SIGNWRITING MOVEMENT-WALLPLANE ARM CIRCLE MEDIUM SINGLE;So;0;L;;;;;N;;;;; +1D9E5;SIGNWRITING MOVEMENT-WALLPLANE ARM CIRCLE SMALL DOUBLE;So;0;L;;;;;N;;;;; +1D9E6;SIGNWRITING MOVEMENT-WALLPLANE ARM CIRCLE MEDIUM DOUBLE;So;0;L;;;;;N;;;;; +1D9E7;SIGNWRITING MOVEMENT-FLOORPLANE ARM CIRCLE HITTING WALL SMALL SINGLE;So;0;L;;;;;N;;;;; +1D9E8;SIGNWRITING MOVEMENT-FLOORPLANE ARM CIRCLE HITTING WALL MEDIUM SINGLE;So;0;L;;;;;N;;;;; +1D9E9;SIGNWRITING MOVEMENT-FLOORPLANE ARM CIRCLE HITTING WALL LARGE SINGLE;So;0;L;;;;;N;;;;; +1D9EA;SIGNWRITING MOVEMENT-FLOORPLANE ARM CIRCLE HITTING WALL SMALL DOUBLE;So;0;L;;;;;N;;;;; +1D9EB;SIGNWRITING MOVEMENT-FLOORPLANE ARM CIRCLE HITTING WALL MEDIUM DOUBLE;So;0;L;;;;;N;;;;; +1D9EC;SIGNWRITING MOVEMENT-FLOORPLANE ARM CIRCLE HITTING WALL LARGE DOUBLE;So;0;L;;;;;N;;;;; +1D9ED;SIGNWRITING MOVEMENT-WALLPLANE WRIST CIRCLE FRONT SINGLE;So;0;L;;;;;N;;;;; +1D9EE;SIGNWRITING MOVEMENT-WALLPLANE WRIST CIRCLE FRONT DOUBLE;So;0;L;;;;;N;;;;; +1D9EF;SIGNWRITING MOVEMENT-FLOORPLANE WRIST CIRCLE HITTING WALL SINGLE;So;0;L;;;;;N;;;;; +1D9F0;SIGNWRITING MOVEMENT-FLOORPLANE WRIST CIRCLE HITTING WALL DOUBLE;So;0;L;;;;;N;;;;; +1D9F1;SIGNWRITING MOVEMENT-WALLPLANE FINGER CIRCLES SINGLE;So;0;L;;;;;N;;;;; +1D9F2;SIGNWRITING MOVEMENT-WALLPLANE FINGER CIRCLES DOUBLE;So;0;L;;;;;N;;;;; +1D9F3;SIGNWRITING MOVEMENT-FLOORPLANE FINGER CIRCLES HITTING WALL SINGLE;So;0;L;;;;;N;;;;; +1D9F4;SIGNWRITING MOVEMENT-FLOORPLANE FINGER CIRCLES HITTING WALL DOUBLE;So;0;L;;;;;N;;;;; +1D9F5;SIGNWRITING DYNAMIC ARROWHEAD SMALL;So;0;L;;;;;N;;;;; +1D9F6;SIGNWRITING DYNAMIC ARROWHEAD LARGE;So;0;L;;;;;N;;;;; +1D9F7;SIGNWRITING DYNAMIC FAST;So;0;L;;;;;N;;;;; +1D9F8;SIGNWRITING DYNAMIC SLOW;So;0;L;;;;;N;;;;; +1D9F9;SIGNWRITING DYNAMIC TENSE;So;0;L;;;;;N;;;;; +1D9FA;SIGNWRITING DYNAMIC RELAXED;So;0;L;;;;;N;;;;; +1D9FB;SIGNWRITING DYNAMIC SIMULTANEOUS;So;0;L;;;;;N;;;;; +1D9FC;SIGNWRITING DYNAMIC SIMULTANEOUS ALTERNATING;So;0;L;;;;;N;;;;; +1D9FD;SIGNWRITING DYNAMIC EVERY OTHER TIME;So;0;L;;;;;N;;;;; +1D9FE;SIGNWRITING DYNAMIC GRADUAL;So;0;L;;;;;N;;;;; +1D9FF;SIGNWRITING HEAD;So;0;L;;;;;N;;;;; +1DA00;SIGNWRITING HEAD RIM;Mn;0;NSM;;;;;N;;;;; +1DA01;SIGNWRITING HEAD MOVEMENT-WALLPLANE STRAIGHT;Mn;0;NSM;;;;;N;;;;; +1DA02;SIGNWRITING HEAD MOVEMENT-WALLPLANE TILT;Mn;0;NSM;;;;;N;;;;; +1DA03;SIGNWRITING HEAD MOVEMENT-FLOORPLANE STRAIGHT;Mn;0;NSM;;;;;N;;;;; +1DA04;SIGNWRITING HEAD MOVEMENT-WALLPLANE CURVE;Mn;0;NSM;;;;;N;;;;; +1DA05;SIGNWRITING HEAD MOVEMENT-FLOORPLANE CURVE;Mn;0;NSM;;;;;N;;;;; +1DA06;SIGNWRITING HEAD MOVEMENT CIRCLE;Mn;0;NSM;;;;;N;;;;; +1DA07;SIGNWRITING FACE DIRECTION POSITION NOSE FORWARD TILTING;Mn;0;NSM;;;;;N;;;;; +1DA08;SIGNWRITING FACE DIRECTION POSITION NOSE UP OR DOWN;Mn;0;NSM;;;;;N;;;;; +1DA09;SIGNWRITING FACE DIRECTION POSITION NOSE UP OR DOWN TILTING;Mn;0;NSM;;;;;N;;;;; +1DA0A;SIGNWRITING EYEBROWS STRAIGHT UP;Mn;0;NSM;;;;;N;;;;; +1DA0B;SIGNWRITING EYEBROWS STRAIGHT NEUTRAL;Mn;0;NSM;;;;;N;;;;; +1DA0C;SIGNWRITING EYEBROWS STRAIGHT DOWN;Mn;0;NSM;;;;;N;;;;; +1DA0D;SIGNWRITING DREAMY EYEBROWS NEUTRAL DOWN;Mn;0;NSM;;;;;N;;;;; +1DA0E;SIGNWRITING DREAMY EYEBROWS DOWN NEUTRAL;Mn;0;NSM;;;;;N;;;;; +1DA0F;SIGNWRITING DREAMY EYEBROWS UP NEUTRAL;Mn;0;NSM;;;;;N;;;;; +1DA10;SIGNWRITING DREAMY EYEBROWS NEUTRAL UP;Mn;0;NSM;;;;;N;;;;; +1DA11;SIGNWRITING FOREHEAD NEUTRAL;Mn;0;NSM;;;;;N;;;;; +1DA12;SIGNWRITING FOREHEAD CONTACT;Mn;0;NSM;;;;;N;;;;; +1DA13;SIGNWRITING FOREHEAD WRINKLED;Mn;0;NSM;;;;;N;;;;; +1DA14;SIGNWRITING EYES OPEN;Mn;0;NSM;;;;;N;;;;; +1DA15;SIGNWRITING EYES SQUEEZED;Mn;0;NSM;;;;;N;;;;; +1DA16;SIGNWRITING EYES CLOSED;Mn;0;NSM;;;;;N;;;;; +1DA17;SIGNWRITING EYE BLINK SINGLE;Mn;0;NSM;;;;;N;;;;; +1DA18;SIGNWRITING EYE BLINK MULTIPLE;Mn;0;NSM;;;;;N;;;;; +1DA19;SIGNWRITING EYES HALF OPEN;Mn;0;NSM;;;;;N;;;;; +1DA1A;SIGNWRITING EYES WIDE OPEN;Mn;0;NSM;;;;;N;;;;; +1DA1B;SIGNWRITING EYES HALF CLOSED;Mn;0;NSM;;;;;N;;;;; +1DA1C;SIGNWRITING EYES WIDENING MOVEMENT;Mn;0;NSM;;;;;N;;;;; +1DA1D;SIGNWRITING EYE WINK;Mn;0;NSM;;;;;N;;;;; +1DA1E;SIGNWRITING EYELASHES UP;Mn;0;NSM;;;;;N;;;;; +1DA1F;SIGNWRITING EYELASHES DOWN;Mn;0;NSM;;;;;N;;;;; +1DA20;SIGNWRITING EYELASHES FLUTTERING;Mn;0;NSM;;;;;N;;;;; +1DA21;SIGNWRITING EYEGAZE-WALLPLANE STRAIGHT;Mn;0;NSM;;;;;N;;;;; +1DA22;SIGNWRITING EYEGAZE-WALLPLANE STRAIGHT DOUBLE;Mn;0;NSM;;;;;N;;;;; +1DA23;SIGNWRITING EYEGAZE-WALLPLANE STRAIGHT ALTERNATING;Mn;0;NSM;;;;;N;;;;; +1DA24;SIGNWRITING EYEGAZE-FLOORPLANE STRAIGHT;Mn;0;NSM;;;;;N;;;;; +1DA25;SIGNWRITING EYEGAZE-FLOORPLANE STRAIGHT DOUBLE;Mn;0;NSM;;;;;N;;;;; +1DA26;SIGNWRITING EYEGAZE-FLOORPLANE STRAIGHT ALTERNATING;Mn;0;NSM;;;;;N;;;;; +1DA27;SIGNWRITING EYEGAZE-WALLPLANE CURVED;Mn;0;NSM;;;;;N;;;;; +1DA28;SIGNWRITING EYEGAZE-FLOORPLANE CURVED;Mn;0;NSM;;;;;N;;;;; +1DA29;SIGNWRITING EYEGAZE-WALLPLANE CIRCLING;Mn;0;NSM;;;;;N;;;;; +1DA2A;SIGNWRITING CHEEKS PUFFED;Mn;0;NSM;;;;;N;;;;; +1DA2B;SIGNWRITING CHEEKS NEUTRAL;Mn;0;NSM;;;;;N;;;;; +1DA2C;SIGNWRITING CHEEKS SUCKED;Mn;0;NSM;;;;;N;;;;; +1DA2D;SIGNWRITING TENSE CHEEKS HIGH;Mn;0;NSM;;;;;N;;;;; +1DA2E;SIGNWRITING TENSE CHEEKS MIDDLE;Mn;0;NSM;;;;;N;;;;; +1DA2F;SIGNWRITING TENSE CHEEKS LOW;Mn;0;NSM;;;;;N;;;;; +1DA30;SIGNWRITING EARS;Mn;0;NSM;;;;;N;;;;; +1DA31;SIGNWRITING NOSE NEUTRAL;Mn;0;NSM;;;;;N;;;;; +1DA32;SIGNWRITING NOSE CONTACT;Mn;0;NSM;;;;;N;;;;; +1DA33;SIGNWRITING NOSE WRINKLES;Mn;0;NSM;;;;;N;;;;; +1DA34;SIGNWRITING NOSE WIGGLES;Mn;0;NSM;;;;;N;;;;; +1DA35;SIGNWRITING AIR BLOWING OUT;Mn;0;NSM;;;;;N;;;;; +1DA36;SIGNWRITING AIR SUCKING IN;Mn;0;NSM;;;;;N;;;;; +1DA37;SIGNWRITING AIR BLOW SMALL ROTATIONS;So;0;L;;;;;N;;;;; +1DA38;SIGNWRITING AIR SUCK SMALL ROTATIONS;So;0;L;;;;;N;;;;; +1DA39;SIGNWRITING BREATH INHALE;So;0;L;;;;;N;;;;; +1DA3A;SIGNWRITING BREATH EXHALE;So;0;L;;;;;N;;;;; +1DA3B;SIGNWRITING MOUTH CLOSED NEUTRAL;Mn;0;NSM;;;;;N;;;;; +1DA3C;SIGNWRITING MOUTH CLOSED FORWARD;Mn;0;NSM;;;;;N;;;;; +1DA3D;SIGNWRITING MOUTH CLOSED CONTACT;Mn;0;NSM;;;;;N;;;;; +1DA3E;SIGNWRITING MOUTH SMILE;Mn;0;NSM;;;;;N;;;;; +1DA3F;SIGNWRITING MOUTH SMILE WRINKLED;Mn;0;NSM;;;;;N;;;;; +1DA40;SIGNWRITING MOUTH SMILE OPEN;Mn;0;NSM;;;;;N;;;;; +1DA41;SIGNWRITING MOUTH FROWN;Mn;0;NSM;;;;;N;;;;; +1DA42;SIGNWRITING MOUTH FROWN WRINKLED;Mn;0;NSM;;;;;N;;;;; +1DA43;SIGNWRITING MOUTH FROWN OPEN;Mn;0;NSM;;;;;N;;;;; +1DA44;SIGNWRITING MOUTH OPEN CIRCLE;Mn;0;NSM;;;;;N;;;;; +1DA45;SIGNWRITING MOUTH OPEN FORWARD;Mn;0;NSM;;;;;N;;;;; +1DA46;SIGNWRITING MOUTH OPEN WRINKLED;Mn;0;NSM;;;;;N;;;;; +1DA47;SIGNWRITING MOUTH OPEN OVAL;Mn;0;NSM;;;;;N;;;;; +1DA48;SIGNWRITING MOUTH OPEN OVAL WRINKLED;Mn;0;NSM;;;;;N;;;;; +1DA49;SIGNWRITING MOUTH OPEN OVAL YAWN;Mn;0;NSM;;;;;N;;;;; +1DA4A;SIGNWRITING MOUTH OPEN RECTANGLE;Mn;0;NSM;;;;;N;;;;; +1DA4B;SIGNWRITING MOUTH OPEN RECTANGLE WRINKLED;Mn;0;NSM;;;;;N;;;;; +1DA4C;SIGNWRITING MOUTH OPEN RECTANGLE YAWN;Mn;0;NSM;;;;;N;;;;; +1DA4D;SIGNWRITING MOUTH KISS;Mn;0;NSM;;;;;N;;;;; +1DA4E;SIGNWRITING MOUTH KISS FORWARD;Mn;0;NSM;;;;;N;;;;; +1DA4F;SIGNWRITING MOUTH KISS WRINKLED;Mn;0;NSM;;;;;N;;;;; +1DA50;SIGNWRITING MOUTH TENSE;Mn;0;NSM;;;;;N;;;;; +1DA51;SIGNWRITING MOUTH TENSE FORWARD;Mn;0;NSM;;;;;N;;;;; +1DA52;SIGNWRITING MOUTH TENSE SUCKED;Mn;0;NSM;;;;;N;;;;; +1DA53;SIGNWRITING LIPS PRESSED TOGETHER;Mn;0;NSM;;;;;N;;;;; +1DA54;SIGNWRITING LIP LOWER OVER UPPER;Mn;0;NSM;;;;;N;;;;; +1DA55;SIGNWRITING LIP UPPER OVER LOWER;Mn;0;NSM;;;;;N;;;;; +1DA56;SIGNWRITING MOUTH CORNERS;Mn;0;NSM;;;;;N;;;;; +1DA57;SIGNWRITING MOUTH WRINKLES SINGLE;Mn;0;NSM;;;;;N;;;;; +1DA58;SIGNWRITING MOUTH WRINKLES DOUBLE;Mn;0;NSM;;;;;N;;;;; +1DA59;SIGNWRITING TONGUE STICKING OUT FAR;Mn;0;NSM;;;;;N;;;;; +1DA5A;SIGNWRITING TONGUE LICKING LIPS;Mn;0;NSM;;;;;N;;;;; +1DA5B;SIGNWRITING TONGUE TIP BETWEEN LIPS;Mn;0;NSM;;;;;N;;;;; +1DA5C;SIGNWRITING TONGUE TIP TOUCHING INSIDE MOUTH;Mn;0;NSM;;;;;N;;;;; +1DA5D;SIGNWRITING TONGUE INSIDE MOUTH RELAXED;Mn;0;NSM;;;;;N;;;;; +1DA5E;SIGNWRITING TONGUE MOVES AGAINST CHEEK;Mn;0;NSM;;;;;N;;;;; +1DA5F;SIGNWRITING TONGUE CENTRE STICKING OUT;Mn;0;NSM;;;;;N;;;;; +1DA60;SIGNWRITING TONGUE CENTRE INSIDE MOUTH;Mn;0;NSM;;;;;N;;;;; +1DA61;SIGNWRITING TEETH;Mn;0;NSM;;;;;N;;;;; +1DA62;SIGNWRITING TEETH MOVEMENT;Mn;0;NSM;;;;;N;;;;; +1DA63;SIGNWRITING TEETH ON TONGUE;Mn;0;NSM;;;;;N;;;;; +1DA64;SIGNWRITING TEETH ON TONGUE MOVEMENT;Mn;0;NSM;;;;;N;;;;; +1DA65;SIGNWRITING TEETH ON LIPS;Mn;0;NSM;;;;;N;;;;; +1DA66;SIGNWRITING TEETH ON LIPS MOVEMENT;Mn;0;NSM;;;;;N;;;;; +1DA67;SIGNWRITING TEETH BITE LIPS;Mn;0;NSM;;;;;N;;;;; +1DA68;SIGNWRITING MOVEMENT-WALLPLANE JAW;Mn;0;NSM;;;;;N;;;;; +1DA69;SIGNWRITING MOVEMENT-FLOORPLANE JAW;Mn;0;NSM;;;;;N;;;;; +1DA6A;SIGNWRITING NECK;Mn;0;NSM;;;;;N;;;;; +1DA6B;SIGNWRITING HAIR;Mn;0;NSM;;;;;N;;;;; +1DA6C;SIGNWRITING EXCITEMENT;Mn;0;NSM;;;;;N;;;;; +1DA6D;SIGNWRITING SHOULDER HIP SPINE;So;0;L;;;;;N;;;;; +1DA6E;SIGNWRITING SHOULDER HIP POSITIONS;So;0;L;;;;;N;;;;; +1DA6F;SIGNWRITING WALLPLANE SHOULDER HIP MOVE;So;0;L;;;;;N;;;;; +1DA70;SIGNWRITING FLOORPLANE SHOULDER HIP MOVE;So;0;L;;;;;N;;;;; +1DA71;SIGNWRITING SHOULDER TILTING FROM WAIST;So;0;L;;;;;N;;;;; +1DA72;SIGNWRITING TORSO-WALLPLANE STRAIGHT STRETCH;So;0;L;;;;;N;;;;; +1DA73;SIGNWRITING TORSO-WALLPLANE CURVED BEND;So;0;L;;;;;N;;;;; +1DA74;SIGNWRITING TORSO-FLOORPLANE TWISTING;So;0;L;;;;;N;;;;; +1DA75;SIGNWRITING UPPER BODY TILTING FROM HIP JOINTS;Mn;0;NSM;;;;;N;;;;; +1DA76;SIGNWRITING LIMB COMBINATION;So;0;L;;;;;N;;;;; +1DA77;SIGNWRITING LIMB LENGTH-1;So;0;L;;;;;N;;;;; +1DA78;SIGNWRITING LIMB LENGTH-2;So;0;L;;;;;N;;;;; +1DA79;SIGNWRITING LIMB LENGTH-3;So;0;L;;;;;N;;;;; +1DA7A;SIGNWRITING LIMB LENGTH-4;So;0;L;;;;;N;;;;; +1DA7B;SIGNWRITING LIMB LENGTH-5;So;0;L;;;;;N;;;;; +1DA7C;SIGNWRITING LIMB LENGTH-6;So;0;L;;;;;N;;;;; +1DA7D;SIGNWRITING LIMB LENGTH-7;So;0;L;;;;;N;;;;; +1DA7E;SIGNWRITING FINGER;So;0;L;;;;;N;;;;; +1DA7F;SIGNWRITING LOCATION-WALLPLANE SPACE;So;0;L;;;;;N;;;;; +1DA80;SIGNWRITING LOCATION-FLOORPLANE SPACE;So;0;L;;;;;N;;;;; +1DA81;SIGNWRITING LOCATION HEIGHT;So;0;L;;;;;N;;;;; +1DA82;SIGNWRITING LOCATION WIDTH;So;0;L;;;;;N;;;;; +1DA83;SIGNWRITING LOCATION DEPTH;So;0;L;;;;;N;;;;; +1DA84;SIGNWRITING LOCATION HEAD NECK;Mn;0;NSM;;;;;N;;;;; +1DA85;SIGNWRITING LOCATION TORSO;So;0;L;;;;;N;;;;; +1DA86;SIGNWRITING LOCATION LIMBS DIGITS;So;0;L;;;;;N;;;;; +1DA87;SIGNWRITING COMMA;Po;0;L;;;;;N;;;;; +1DA88;SIGNWRITING FULL STOP;Po;0;L;;;;;N;;;;; +1DA89;SIGNWRITING SEMICOLON;Po;0;L;;;;;N;;;;; +1DA8A;SIGNWRITING COLON;Po;0;L;;;;;N;;;;; +1DA8B;SIGNWRITING PARENTHESIS;Po;0;L;;;;;N;;;;; +1DA9B;SIGNWRITING FILL MODIFIER-2;Mn;0;NSM;;;;;N;;;;; +1DA9C;SIGNWRITING FILL MODIFIER-3;Mn;0;NSM;;;;;N;;;;; +1DA9D;SIGNWRITING FILL MODIFIER-4;Mn;0;NSM;;;;;N;;;;; +1DA9E;SIGNWRITING FILL MODIFIER-5;Mn;0;NSM;;;;;N;;;;; +1DA9F;SIGNWRITING FILL MODIFIER-6;Mn;0;NSM;;;;;N;;;;; +1DAA1;SIGNWRITING ROTATION MODIFIER-2;Mn;0;NSM;;;;;N;;;;; +1DAA2;SIGNWRITING ROTATION MODIFIER-3;Mn;0;NSM;;;;;N;;;;; +1DAA3;SIGNWRITING ROTATION MODIFIER-4;Mn;0;NSM;;;;;N;;;;; +1DAA4;SIGNWRITING ROTATION MODIFIER-5;Mn;0;NSM;;;;;N;;;;; +1DAA5;SIGNWRITING ROTATION MODIFIER-6;Mn;0;NSM;;;;;N;;;;; +1DAA6;SIGNWRITING ROTATION MODIFIER-7;Mn;0;NSM;;;;;N;;;;; +1DAA7;SIGNWRITING ROTATION MODIFIER-8;Mn;0;NSM;;;;;N;;;;; +1DAA8;SIGNWRITING ROTATION MODIFIER-9;Mn;0;NSM;;;;;N;;;;; +1DAA9;SIGNWRITING ROTATION MODIFIER-10;Mn;0;NSM;;;;;N;;;;; +1DAAA;SIGNWRITING ROTATION MODIFIER-11;Mn;0;NSM;;;;;N;;;;; +1DAAB;SIGNWRITING ROTATION MODIFIER-12;Mn;0;NSM;;;;;N;;;;; +1DAAC;SIGNWRITING ROTATION MODIFIER-13;Mn;0;NSM;;;;;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;;;;; +1E803;MENDE KIKAKUI SYLLABLE M065 KEE;Lo;0;R;;;;;N;;;;; +1E804;MENDE KIKAKUI SYLLABLE M095 KE;Lo;0;R;;;;;N;;;;; +1E805;MENDE KIKAKUI SYLLABLE M076 KOO;Lo;0;R;;;;;N;;;;; +1E806;MENDE KIKAKUI SYLLABLE M048 KO;Lo;0;R;;;;;N;;;;; +1E807;MENDE KIKAKUI SYLLABLE M179 KUA;Lo;0;R;;;;;N;;;;; +1E808;MENDE KIKAKUI SYLLABLE M004 WI;Lo;0;R;;;;;N;;;;; +1E809;MENDE KIKAKUI SYLLABLE M005 WA;Lo;0;R;;;;;N;;;;; +1E80A;MENDE KIKAKUI SYLLABLE M006 WU;Lo;0;R;;;;;N;;;;; +1E80B;MENDE KIKAKUI SYLLABLE M126 WEE;Lo;0;R;;;;;N;;;;; +1E80C;MENDE KIKAKUI SYLLABLE M118 WE;Lo;0;R;;;;;N;;;;; +1E80D;MENDE KIKAKUI SYLLABLE M114 WOO;Lo;0;R;;;;;N;;;;; +1E80E;MENDE KIKAKUI SYLLABLE M045 WO;Lo;0;R;;;;;N;;;;; +1E80F;MENDE KIKAKUI SYLLABLE M194 WUI;Lo;0;R;;;;;N;;;;; +1E810;MENDE KIKAKUI SYLLABLE M143 WEI;Lo;0;R;;;;;N;;;;; +1E811;MENDE KIKAKUI SYLLABLE M061 WVI;Lo;0;R;;;;;N;;;;; +1E812;MENDE KIKAKUI SYLLABLE M049 WVA;Lo;0;R;;;;;N;;;;; +1E813;MENDE KIKAKUI SYLLABLE M139 WVE;Lo;0;R;;;;;N;;;;; +1E814;MENDE KIKAKUI SYLLABLE M007 MIN;Lo;0;R;;;;;N;;;;; +1E815;MENDE KIKAKUI SYLLABLE M008 MAN;Lo;0;R;;;;;N;;;;; +1E816;MENDE KIKAKUI SYLLABLE M009 MUN;Lo;0;R;;;;;N;;;;; +1E817;MENDE KIKAKUI SYLLABLE M059 MEN;Lo;0;R;;;;;N;;;;; +1E818;MENDE KIKAKUI SYLLABLE M094 MON;Lo;0;R;;;;;N;;;;; +1E819;MENDE KIKAKUI SYLLABLE M154 MUAN;Lo;0;R;;;;;N;;;;; +1E81A;MENDE KIKAKUI SYLLABLE M189 MUEN;Lo;0;R;;;;;N;;;;; +1E81B;MENDE KIKAKUI SYLLABLE M010 BI;Lo;0;R;;;;;N;;;;; +1E81C;MENDE KIKAKUI SYLLABLE M011 BA;Lo;0;R;;;;;N;;;;; +1E81D;MENDE KIKAKUI SYLLABLE M012 BU;Lo;0;R;;;;;N;;;;; +1E81E;MENDE KIKAKUI SYLLABLE M150 BEE;Lo;0;R;;;;;N;;;;; +1E81F;MENDE KIKAKUI SYLLABLE M097 BE;Lo;0;R;;;;;N;;;;; +1E820;MENDE KIKAKUI SYLLABLE M103 BOO;Lo;0;R;;;;;N;;;;; +1E821;MENDE KIKAKUI SYLLABLE M138 BO;Lo;0;R;;;;;N;;;;; +1E822;MENDE KIKAKUI SYLLABLE M013 I;Lo;0;R;;;;;N;;;;; +1E823;MENDE KIKAKUI SYLLABLE M014 A;Lo;0;R;;;;;N;;;;; +1E824;MENDE KIKAKUI SYLLABLE M015 U;Lo;0;R;;;;;N;;;;; +1E825;MENDE KIKAKUI SYLLABLE M163 EE;Lo;0;R;;;;;N;;;;; +1E826;MENDE KIKAKUI SYLLABLE M100 E;Lo;0;R;;;;;N;;;;; +1E827;MENDE KIKAKUI SYLLABLE M165 OO;Lo;0;R;;;;;N;;;;; +1E828;MENDE KIKAKUI SYLLABLE M147 O;Lo;0;R;;;;;N;;;;; +1E829;MENDE KIKAKUI SYLLABLE M137 EI;Lo;0;R;;;;;N;;;;; +1E82A;MENDE KIKAKUI SYLLABLE M131 IN;Lo;0;R;;;;;N;;;;; +1E82B;MENDE KIKAKUI SYLLABLE M135 IN;Lo;0;R;;;;;N;;;;; +1E82C;MENDE KIKAKUI SYLLABLE M195 AN;Lo;0;R;;;;;N;;;;; +1E82D;MENDE KIKAKUI SYLLABLE M178 EN;Lo;0;R;;;;;N;;;;; +1E82E;MENDE KIKAKUI SYLLABLE M019 SI;Lo;0;R;;;;;N;;;;; +1E82F;MENDE KIKAKUI SYLLABLE M020 SA;Lo;0;R;;;;;N;;;;; +1E830;MENDE KIKAKUI SYLLABLE M021 SU;Lo;0;R;;;;;N;;;;; +1E831;MENDE KIKAKUI SYLLABLE M162 SEE;Lo;0;R;;;;;N;;;;; +1E832;MENDE KIKAKUI SYLLABLE M116 SE;Lo;0;R;;;;;N;;;;; +1E833;MENDE KIKAKUI SYLLABLE M136 SOO;Lo;0;R;;;;;N;;;;; +1E834;MENDE KIKAKUI SYLLABLE M079 SO;Lo;0;R;;;;;N;;;;; +1E835;MENDE KIKAKUI SYLLABLE M196 SIA;Lo;0;R;;;;;N;;;;; +1E836;MENDE KIKAKUI SYLLABLE M025 LI;Lo;0;R;;;;;N;;;;; +1E837;MENDE KIKAKUI SYLLABLE M026 LA;Lo;0;R;;;;;N;;;;; +1E838;MENDE KIKAKUI SYLLABLE M027 LU;Lo;0;R;;;;;N;;;;; +1E839;MENDE KIKAKUI SYLLABLE M084 LEE;Lo;0;R;;;;;N;;;;; +1E83A;MENDE KIKAKUI SYLLABLE M073 LE;Lo;0;R;;;;;N;;;;; +1E83B;MENDE KIKAKUI SYLLABLE M054 LOO;Lo;0;R;;;;;N;;;;; +1E83C;MENDE KIKAKUI SYLLABLE M153 LO;Lo;0;R;;;;;N;;;;; +1E83D;MENDE KIKAKUI SYLLABLE M110 LONG LE;Lo;0;R;;;;;N;;;;; +1E83E;MENDE KIKAKUI SYLLABLE M016 DI;Lo;0;R;;;;;N;;;;; +1E83F;MENDE KIKAKUI SYLLABLE M017 DA;Lo;0;R;;;;;N;;;;; +1E840;MENDE KIKAKUI SYLLABLE M018 DU;Lo;0;R;;;;;N;;;;; +1E841;MENDE KIKAKUI SYLLABLE M089 DEE;Lo;0;R;;;;;N;;;;; +1E842;MENDE KIKAKUI SYLLABLE M180 DOO;Lo;0;R;;;;;N;;;;; +1E843;MENDE KIKAKUI SYLLABLE M181 DO;Lo;0;R;;;;;N;;;;; +1E844;MENDE KIKAKUI SYLLABLE M022 TI;Lo;0;R;;;;;N;;;;; +1E845;MENDE KIKAKUI SYLLABLE M023 TA;Lo;0;R;;;;;N;;;;; +1E846;MENDE KIKAKUI SYLLABLE M024 TU;Lo;0;R;;;;;N;;;;; +1E847;MENDE KIKAKUI SYLLABLE M091 TEE;Lo;0;R;;;;;N;;;;; +1E848;MENDE KIKAKUI SYLLABLE M055 TE;Lo;0;R;;;;;N;;;;; +1E849;MENDE KIKAKUI SYLLABLE M104 TOO;Lo;0;R;;;;;N;;;;; +1E84A;MENDE KIKAKUI SYLLABLE M069 TO;Lo;0;R;;;;;N;;;;; +1E84B;MENDE KIKAKUI SYLLABLE M028 JI;Lo;0;R;;;;;N;;;;; +1E84C;MENDE KIKAKUI SYLLABLE M029 JA;Lo;0;R;;;;;N;;;;; +1E84D;MENDE KIKAKUI SYLLABLE M030 JU;Lo;0;R;;;;;N;;;;; +1E84E;MENDE KIKAKUI SYLLABLE M157 JEE;Lo;0;R;;;;;N;;;;; +1E84F;MENDE KIKAKUI SYLLABLE M113 JE;Lo;0;R;;;;;N;;;;; +1E850;MENDE KIKAKUI SYLLABLE M160 JOO;Lo;0;R;;;;;N;;;;; +1E851;MENDE KIKAKUI SYLLABLE M063 JO;Lo;0;R;;;;;N;;;;; +1E852;MENDE KIKAKUI SYLLABLE M175 LONG JO;Lo;0;R;;;;;N;;;;; +1E853;MENDE KIKAKUI SYLLABLE M031 YI;Lo;0;R;;;;;N;;;;; +1E854;MENDE KIKAKUI SYLLABLE M032 YA;Lo;0;R;;;;;N;;;;; +1E855;MENDE KIKAKUI SYLLABLE M033 YU;Lo;0;R;;;;;N;;;;; +1E856;MENDE KIKAKUI SYLLABLE M109 YEE;Lo;0;R;;;;;N;;;;; +1E857;MENDE KIKAKUI SYLLABLE M080 YE;Lo;0;R;;;;;N;;;;; +1E858;MENDE KIKAKUI SYLLABLE M141 YOO;Lo;0;R;;;;;N;;;;; +1E859;MENDE KIKAKUI SYLLABLE M121 YO;Lo;0;R;;;;;N;;;;; +1E85A;MENDE KIKAKUI SYLLABLE M034 FI;Lo;0;R;;;;;N;;;;; +1E85B;MENDE KIKAKUI SYLLABLE M035 FA;Lo;0;R;;;;;N;;;;; +1E85C;MENDE KIKAKUI SYLLABLE M036 FU;Lo;0;R;;;;;N;;;;; +1E85D;MENDE KIKAKUI SYLLABLE M078 FEE;Lo;0;R;;;;;N;;;;; +1E85E;MENDE KIKAKUI SYLLABLE M075 FE;Lo;0;R;;;;;N;;;;; +1E85F;MENDE KIKAKUI SYLLABLE M133 FOO;Lo;0;R;;;;;N;;;;; +1E860;MENDE KIKAKUI SYLLABLE M088 FO;Lo;0;R;;;;;N;;;;; +1E861;MENDE KIKAKUI SYLLABLE M197 FUA;Lo;0;R;;;;;N;;;;; +1E862;MENDE KIKAKUI SYLLABLE M101 FAN;Lo;0;R;;;;;N;;;;; +1E863;MENDE KIKAKUI SYLLABLE M037 NIN;Lo;0;R;;;;;N;;;;; +1E864;MENDE KIKAKUI SYLLABLE M038 NAN;Lo;0;R;;;;;N;;;;; +1E865;MENDE KIKAKUI SYLLABLE M039 NUN;Lo;0;R;;;;;N;;;;; +1E866;MENDE KIKAKUI SYLLABLE M117 NEN;Lo;0;R;;;;;N;;;;; +1E867;MENDE KIKAKUI SYLLABLE M169 NON;Lo;0;R;;;;;N;;;;; +1E868;MENDE KIKAKUI SYLLABLE M176 HI;Lo;0;R;;;;;N;;;;; +1E869;MENDE KIKAKUI SYLLABLE M041 HA;Lo;0;R;;;;;N;;;;; +1E86A;MENDE KIKAKUI SYLLABLE M186 HU;Lo;0;R;;;;;N;;;;; +1E86B;MENDE KIKAKUI SYLLABLE M040 HEE;Lo;0;R;;;;;N;;;;; +1E86C;MENDE KIKAKUI SYLLABLE M096 HE;Lo;0;R;;;;;N;;;;; +1E86D;MENDE KIKAKUI SYLLABLE M042 HOO;Lo;0;R;;;;;N;;;;; +1E86E;MENDE KIKAKUI SYLLABLE M140 HO;Lo;0;R;;;;;N;;;;; +1E86F;MENDE KIKAKUI SYLLABLE M083 HEEI;Lo;0;R;;;;;N;;;;; +1E870;MENDE KIKAKUI SYLLABLE M128 HOOU;Lo;0;R;;;;;N;;;;; +1E871;MENDE KIKAKUI SYLLABLE M053 HIN;Lo;0;R;;;;;N;;;;; +1E872;MENDE KIKAKUI SYLLABLE M130 HAN;Lo;0;R;;;;;N;;;;; +1E873;MENDE KIKAKUI SYLLABLE M087 HUN;Lo;0;R;;;;;N;;;;; +1E874;MENDE KIKAKUI SYLLABLE M052 HEN;Lo;0;R;;;;;N;;;;; +1E875;MENDE KIKAKUI SYLLABLE M193 HON;Lo;0;R;;;;;N;;;;; +1E876;MENDE KIKAKUI SYLLABLE M046 HUAN;Lo;0;R;;;;;N;;;;; +1E877;MENDE KIKAKUI SYLLABLE M090 NGGI;Lo;0;R;;;;;N;;;;; +1E878;MENDE KIKAKUI SYLLABLE M043 NGGA;Lo;0;R;;;;;N;;;;; +1E879;MENDE KIKAKUI SYLLABLE M082 NGGU;Lo;0;R;;;;;N;;;;; +1E87A;MENDE KIKAKUI SYLLABLE M115 NGGEE;Lo;0;R;;;;;N;;;;; +1E87B;MENDE KIKAKUI SYLLABLE M146 NGGE;Lo;0;R;;;;;N;;;;; +1E87C;MENDE KIKAKUI SYLLABLE M156 NGGOO;Lo;0;R;;;;;N;;;;; +1E87D;MENDE KIKAKUI SYLLABLE M120 NGGO;Lo;0;R;;;;;N;;;;; +1E87E;MENDE KIKAKUI SYLLABLE M159 NGGAA;Lo;0;R;;;;;N;;;;; +1E87F;MENDE KIKAKUI SYLLABLE M127 NGGUA;Lo;0;R;;;;;N;;;;; +1E880;MENDE KIKAKUI SYLLABLE M086 LONG NGGE;Lo;0;R;;;;;N;;;;; +1E881;MENDE KIKAKUI SYLLABLE M106 LONG NGGOO;Lo;0;R;;;;;N;;;;; +1E882;MENDE KIKAKUI SYLLABLE M183 LONG NGGO;Lo;0;R;;;;;N;;;;; +1E883;MENDE KIKAKUI SYLLABLE M155 GI;Lo;0;R;;;;;N;;;;; +1E884;MENDE KIKAKUI SYLLABLE M111 GA;Lo;0;R;;;;;N;;;;; +1E885;MENDE KIKAKUI SYLLABLE M168 GU;Lo;0;R;;;;;N;;;;; +1E886;MENDE KIKAKUI SYLLABLE M190 GEE;Lo;0;R;;;;;N;;;;; +1E887;MENDE KIKAKUI SYLLABLE M166 GUEI;Lo;0;R;;;;;N;;;;; +1E888;MENDE KIKAKUI SYLLABLE M167 GUAN;Lo;0;R;;;;;N;;;;; +1E889;MENDE KIKAKUI SYLLABLE M184 NGEN;Lo;0;R;;;;;N;;;;; +1E88A;MENDE KIKAKUI SYLLABLE M057 NGON;Lo;0;R;;;;;N;;;;; +1E88B;MENDE KIKAKUI SYLLABLE M177 NGUAN;Lo;0;R;;;;;N;;;;; +1E88C;MENDE KIKAKUI SYLLABLE M068 PI;Lo;0;R;;;;;N;;;;; +1E88D;MENDE KIKAKUI SYLLABLE M099 PA;Lo;0;R;;;;;N;;;;; +1E88E;MENDE KIKAKUI SYLLABLE M050 PU;Lo;0;R;;;;;N;;;;; +1E88F;MENDE KIKAKUI SYLLABLE M081 PEE;Lo;0;R;;;;;N;;;;; +1E890;MENDE KIKAKUI SYLLABLE M051 PE;Lo;0;R;;;;;N;;;;; +1E891;MENDE KIKAKUI SYLLABLE M102 POO;Lo;0;R;;;;;N;;;;; +1E892;MENDE KIKAKUI SYLLABLE M066 PO;Lo;0;R;;;;;N;;;;; +1E893;MENDE KIKAKUI SYLLABLE M145 MBI;Lo;0;R;;;;;N;;;;; +1E894;MENDE KIKAKUI SYLLABLE M062 MBA;Lo;0;R;;;;;N;;;;; +1E895;MENDE KIKAKUI SYLLABLE M122 MBU;Lo;0;R;;;;;N;;;;; +1E896;MENDE KIKAKUI SYLLABLE M047 MBEE;Lo;0;R;;;;;N;;;;; +1E897;MENDE KIKAKUI SYLLABLE M188 MBEE;Lo;0;R;;;;;N;;;;; +1E898;MENDE KIKAKUI SYLLABLE M072 MBE;Lo;0;R;;;;;N;;;;; +1E899;MENDE KIKAKUI SYLLABLE M172 MBOO;Lo;0;R;;;;;N;;;;; +1E89A;MENDE KIKAKUI SYLLABLE M174 MBO;Lo;0;R;;;;;N;;;;; +1E89B;MENDE KIKAKUI SYLLABLE M187 MBUU;Lo;0;R;;;;;N;;;;; +1E89C;MENDE KIKAKUI SYLLABLE M161 LONG MBE;Lo;0;R;;;;;N;;;;; +1E89D;MENDE KIKAKUI SYLLABLE M105 LONG MBOO;Lo;0;R;;;;;N;;;;; +1E89E;MENDE KIKAKUI SYLLABLE M142 LONG MBO;Lo;0;R;;;;;N;;;;; +1E89F;MENDE KIKAKUI SYLLABLE M132 KPI;Lo;0;R;;;;;N;;;;; +1E8A0;MENDE KIKAKUI SYLLABLE M092 KPA;Lo;0;R;;;;;N;;;;; +1E8A1;MENDE KIKAKUI SYLLABLE M074 KPU;Lo;0;R;;;;;N;;;;; +1E8A2;MENDE KIKAKUI SYLLABLE M044 KPEE;Lo;0;R;;;;;N;;;;; +1E8A3;MENDE KIKAKUI SYLLABLE M108 KPE;Lo;0;R;;;;;N;;;;; +1E8A4;MENDE KIKAKUI SYLLABLE M112 KPOO;Lo;0;R;;;;;N;;;;; +1E8A5;MENDE KIKAKUI SYLLABLE M158 KPO;Lo;0;R;;;;;N;;;;; +1E8A6;MENDE KIKAKUI SYLLABLE M124 GBI;Lo;0;R;;;;;N;;;;; +1E8A7;MENDE KIKAKUI SYLLABLE M056 GBA;Lo;0;R;;;;;N;;;;; +1E8A8;MENDE KIKAKUI SYLLABLE M148 GBU;Lo;0;R;;;;;N;;;;; +1E8A9;MENDE KIKAKUI SYLLABLE M093 GBEE;Lo;0;R;;;;;N;;;;; +1E8AA;MENDE KIKAKUI SYLLABLE M107 GBE;Lo;0;R;;;;;N;;;;; +1E8AB;MENDE KIKAKUI SYLLABLE M071 GBOO;Lo;0;R;;;;;N;;;;; +1E8AC;MENDE KIKAKUI SYLLABLE M070 GBO;Lo;0;R;;;;;N;;;;; +1E8AD;MENDE KIKAKUI SYLLABLE M171 RA;Lo;0;R;;;;;N;;;;; +1E8AE;MENDE KIKAKUI SYLLABLE M123 NDI;Lo;0;R;;;;;N;;;;; +1E8AF;MENDE KIKAKUI SYLLABLE M129 NDA;Lo;0;R;;;;;N;;;;; +1E8B0;MENDE KIKAKUI SYLLABLE M125 NDU;Lo;0;R;;;;;N;;;;; +1E8B1;MENDE KIKAKUI SYLLABLE M191 NDEE;Lo;0;R;;;;;N;;;;; +1E8B2;MENDE KIKAKUI SYLLABLE M119 NDE;Lo;0;R;;;;;N;;;;; +1E8B3;MENDE KIKAKUI SYLLABLE M067 NDOO;Lo;0;R;;;;;N;;;;; +1E8B4;MENDE KIKAKUI SYLLABLE M064 NDO;Lo;0;R;;;;;N;;;;; +1E8B5;MENDE KIKAKUI SYLLABLE M152 NJA;Lo;0;R;;;;;N;;;;; +1E8B6;MENDE KIKAKUI SYLLABLE M192 NJU;Lo;0;R;;;;;N;;;;; +1E8B7;MENDE KIKAKUI SYLLABLE M149 NJEE;Lo;0;R;;;;;N;;;;; +1E8B8;MENDE KIKAKUI SYLLABLE M134 NJOO;Lo;0;R;;;;;N;;;;; +1E8B9;MENDE KIKAKUI SYLLABLE M182 VI;Lo;0;R;;;;;N;;;;; +1E8BA;MENDE KIKAKUI SYLLABLE M185 VA;Lo;0;R;;;;;N;;;;; +1E8BB;MENDE KIKAKUI SYLLABLE M151 VU;Lo;0;R;;;;;N;;;;; +1E8BC;MENDE KIKAKUI SYLLABLE M173 VEE;Lo;0;R;;;;;N;;;;; +1E8BD;MENDE KIKAKUI SYLLABLE M085 VE;Lo;0;R;;;;;N;;;;; +1E8BE;MENDE KIKAKUI SYLLABLE M144 VOO;Lo;0;R;;;;;N;;;;; +1E8BF;MENDE KIKAKUI SYLLABLE M077 VO;Lo;0;R;;;;;N;;;;; +1E8C0;MENDE KIKAKUI SYLLABLE M164 NYIN;Lo;0;R;;;;;N;;;;; +1E8C1;MENDE KIKAKUI SYLLABLE M058 NYAN;Lo;0;R;;;;;N;;;;; +1E8C2;MENDE KIKAKUI SYLLABLE M170 NYUN;Lo;0;R;;;;;N;;;;; +1E8C3;MENDE KIKAKUI SYLLABLE M098 NYEN;Lo;0;R;;;;;N;;;;; +1E8C4;MENDE KIKAKUI SYLLABLE M060 NYON;Lo;0;R;;;;;N;;;;; +1E8C7;MENDE KIKAKUI DIGIT ONE;No;0;R;;;;1;N;;;;; +1E8C8;MENDE KIKAKUI DIGIT TWO;No;0;R;;;;2;N;;;;; +1E8C9;MENDE KIKAKUI DIGIT THREE;No;0;R;;;;3;N;;;;; +1E8CA;MENDE KIKAKUI DIGIT FOUR;No;0;R;;;;4;N;;;;; +1E8CB;MENDE KIKAKUI DIGIT FIVE;No;0;R;;;;5;N;;;;; +1E8CC;MENDE KIKAKUI DIGIT SIX;No;0;R;;;;6;N;;;;; +1E8CD;MENDE KIKAKUI DIGIT SEVEN;No;0;R;;;;7;N;;;;; +1E8CE;MENDE KIKAKUI DIGIT EIGHT;No;0;R;;;;8;N;;;;; +1E8CF;MENDE KIKAKUI DIGIT NINE;No;0;R;;;;9;N;;;;; +1E8D0;MENDE KIKAKUI COMBINING NUMBER TEENS;Mn;220;NSM;;;;;N;;;;; +1E8D1;MENDE KIKAKUI COMBINING NUMBER TENS;Mn;220;NSM;;;;;N;;;;; +1E8D2;MENDE KIKAKUI COMBINING NUMBER HUNDREDS;Mn;220;NSM;;;;;N;;;;; +1E8D3;MENDE KIKAKUI COMBINING NUMBER THOUSANDS;Mn;220;NSM;;;;;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;;;;; +1EC71;INDIC SIYAQ NUMBER ONE;No;0;AL;;;;1;N;;;;; +1EC72;INDIC SIYAQ NUMBER TWO;No;0;AL;;;;2;N;;;;; +1EC73;INDIC SIYAQ NUMBER THREE;No;0;AL;;;;3;N;;;;; +1EC74;INDIC SIYAQ NUMBER FOUR;No;0;AL;;;;4;N;;;;; +1EC75;INDIC SIYAQ NUMBER FIVE;No;0;AL;;;;5;N;;;;; +1EC76;INDIC SIYAQ NUMBER SIX;No;0;AL;;;;6;N;;;;; +1EC77;INDIC SIYAQ NUMBER SEVEN;No;0;AL;;;;7;N;;;;; +1EC78;INDIC SIYAQ NUMBER EIGHT;No;0;AL;;;;8;N;;;;; +1EC79;INDIC SIYAQ NUMBER NINE;No;0;AL;;;;9;N;;;;; +1EC7A;INDIC SIYAQ NUMBER TEN;No;0;AL;;;;10;N;;;;; +1EC7B;INDIC SIYAQ NUMBER TWENTY;No;0;AL;;;;20;N;;;;; +1EC7C;INDIC SIYAQ NUMBER THIRTY;No;0;AL;;;;30;N;;;;; +1EC7D;INDIC SIYAQ NUMBER FORTY;No;0;AL;;;;40;N;;;;; +1EC7E;INDIC SIYAQ NUMBER FIFTY;No;0;AL;;;;50;N;;;;; +1EC7F;INDIC SIYAQ NUMBER SIXTY;No;0;AL;;;;60;N;;;;; +1EC80;INDIC SIYAQ NUMBER SEVENTY;No;0;AL;;;;70;N;;;;; +1EC81;INDIC SIYAQ NUMBER EIGHTY;No;0;AL;;;;80;N;;;;; +1EC82;INDIC SIYAQ NUMBER NINETY;No;0;AL;;;;90;N;;;;; +1EC83;INDIC SIYAQ NUMBER ONE HUNDRED;No;0;AL;;;;100;N;;;;; +1EC84;INDIC SIYAQ NUMBER TWO HUNDRED;No;0;AL;;;;200;N;;;;; +1EC85;INDIC SIYAQ NUMBER THREE HUNDRED;No;0;AL;;;;300;N;;;;; +1EC86;INDIC SIYAQ NUMBER FOUR HUNDRED;No;0;AL;;;;400;N;;;;; +1EC87;INDIC SIYAQ NUMBER FIVE HUNDRED;No;0;AL;;;;500;N;;;;; +1EC88;INDIC SIYAQ NUMBER SIX HUNDRED;No;0;AL;;;;600;N;;;;; +1EC89;INDIC SIYAQ NUMBER SEVEN HUNDRED;No;0;AL;;;;700;N;;;;; +1EC8A;INDIC SIYAQ NUMBER EIGHT HUNDRED;No;0;AL;;;;800;N;;;;; +1EC8B;INDIC SIYAQ NUMBER NINE HUNDRED;No;0;AL;;;;900;N;;;;; +1EC8C;INDIC SIYAQ NUMBER ONE THOUSAND;No;0;AL;;;;1000;N;;;;; +1EC8D;INDIC SIYAQ NUMBER TWO THOUSAND;No;0;AL;;;;2000;N;;;;; +1EC8E;INDIC SIYAQ NUMBER THREE THOUSAND;No;0;AL;;;;3000;N;;;;; +1EC8F;INDIC SIYAQ NUMBER FOUR THOUSAND;No;0;AL;;;;4000;N;;;;; +1EC90;INDIC SIYAQ NUMBER FIVE THOUSAND;No;0;AL;;;;5000;N;;;;; +1EC91;INDIC SIYAQ NUMBER SIX THOUSAND;No;0;AL;;;;6000;N;;;;; +1EC92;INDIC SIYAQ NUMBER SEVEN THOUSAND;No;0;AL;;;;7000;N;;;;; +1EC93;INDIC SIYAQ NUMBER EIGHT THOUSAND;No;0;AL;;;;8000;N;;;;; +1EC94;INDIC SIYAQ NUMBER NINE THOUSAND;No;0;AL;;;;9000;N;;;;; +1EC95;INDIC SIYAQ NUMBER TEN THOUSAND;No;0;AL;;;;10000;N;;;;; +1EC96;INDIC SIYAQ NUMBER TWENTY THOUSAND;No;0;AL;;;;20000;N;;;;; +1EC97;INDIC SIYAQ NUMBER THIRTY THOUSAND;No;0;AL;;;;30000;N;;;;; +1EC98;INDIC SIYAQ NUMBER FORTY THOUSAND;No;0;AL;;;;40000;N;;;;; +1EC99;INDIC SIYAQ NUMBER FIFTY THOUSAND;No;0;AL;;;;50000;N;;;;; +1EC9A;INDIC SIYAQ NUMBER SIXTY THOUSAND;No;0;AL;;;;60000;N;;;;; +1EC9B;INDIC SIYAQ NUMBER SEVENTY THOUSAND;No;0;AL;;;;70000;N;;;;; +1EC9C;INDIC SIYAQ NUMBER EIGHTY THOUSAND;No;0;AL;;;;80000;N;;;;; +1EC9D;INDIC SIYAQ NUMBER NINETY THOUSAND;No;0;AL;;;;90000;N;;;;; +1EC9E;INDIC SIYAQ NUMBER LAKH;No;0;AL;;;;100000;N;;;;; +1EC9F;INDIC SIYAQ NUMBER LAKHAN;No;0;AL;;;;200000;N;;;;; +1ECA0;INDIC SIYAQ LAKH MARK;No;0;AL;;;;100000;N;;;;; +1ECA1;INDIC SIYAQ NUMBER KAROR;No;0;AL;;;;10000000;N;;;;; +1ECA2;INDIC SIYAQ NUMBER KARORAN;No;0;AL;;;;20000000;N;;;;; +1ECA3;INDIC SIYAQ NUMBER PREFIXED ONE;No;0;AL;;;;1;N;;;;; +1ECA4;INDIC SIYAQ NUMBER PREFIXED TWO;No;0;AL;;;;2;N;;;;; +1ECA5;INDIC SIYAQ NUMBER PREFIXED THREE;No;0;AL;;;;3;N;;;;; +1ECA6;INDIC SIYAQ NUMBER PREFIXED FOUR;No;0;AL;;;;4;N;;;;; +1ECA7;INDIC SIYAQ NUMBER PREFIXED FIVE;No;0;AL;;;;5;N;;;;; +1ECA8;INDIC SIYAQ NUMBER PREFIXED SIX;No;0;AL;;;;6;N;;;;; +1ECA9;INDIC SIYAQ NUMBER PREFIXED SEVEN;No;0;AL;;;;7;N;;;;; +1ECAA;INDIC SIYAQ NUMBER PREFIXED EIGHT;No;0;AL;;;;8;N;;;;; +1ECAB;INDIC SIYAQ NUMBER PREFIXED NINE;No;0;AL;;;;9;N;;;;; +1ECAC;INDIC SIYAQ PLACEHOLDER;So;0;AL;;;;;N;;;;; +1ECAD;INDIC SIYAQ FRACTION ONE QUARTER;No;0;AL;;;;1/4;N;;;;; +1ECAE;INDIC SIYAQ FRACTION ONE HALF;No;0;AL;;;;1/2;N;;;;; +1ECAF;INDIC SIYAQ FRACTION THREE QUARTERS;No;0;AL;;;;3/4;N;;;;; +1ECB0;INDIC SIYAQ RUPEE MARK;Sc;0;AL;;;;;N;;;;; +1ECB1;INDIC SIYAQ NUMBER ALTERNATE ONE;No;0;AL;;;;1;N;;;;; +1ECB2;INDIC SIYAQ NUMBER ALTERNATE TWO;No;0;AL;;;;2;N;;;;; +1ECB3;INDIC SIYAQ NUMBER ALTERNATE TEN THOUSAND;No;0;AL;;;;10000;N;;;;; +1ECB4;INDIC SIYAQ ALTERNATE LAKH MARK;No;0;AL;;;;100000;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;;;;; +1EE03;ARABIC MATHEMATICAL DAL;Lo;0;AL;<font> 062F;;;;N;;;;; +1EE05;ARABIC MATHEMATICAL WAW;Lo;0;AL;<font> 0648;;;;N;;;;; +1EE06;ARABIC MATHEMATICAL ZAIN;Lo;0;AL;<font> 0632;;;;N;;;;; +1EE07;ARABIC MATHEMATICAL HAH;Lo;0;AL;<font> 062D;;;;N;;;;; +1EE08;ARABIC MATHEMATICAL TAH;Lo;0;AL;<font> 0637;;;;N;;;;; +1EE09;ARABIC MATHEMATICAL YEH;Lo;0;AL;<font> 064A;;;;N;;;;; +1EE0A;ARABIC MATHEMATICAL KAF;Lo;0;AL;<font> 0643;;;;N;;;;; +1EE0B;ARABIC MATHEMATICAL LAM;Lo;0;AL;<font> 0644;;;;N;;;;; +1EE0C;ARABIC MATHEMATICAL MEEM;Lo;0;AL;<font> 0645;;;;N;;;;; +1EE0D;ARABIC MATHEMATICAL NOON;Lo;0;AL;<font> 0646;;;;N;;;;; +1EE0E;ARABIC MATHEMATICAL SEEN;Lo;0;AL;<font> 0633;;;;N;;;;; +1EE0F;ARABIC MATHEMATICAL AIN;Lo;0;AL;<font> 0639;;;;N;;;;; +1EE10;ARABIC MATHEMATICAL FEH;Lo;0;AL;<font> 0641;;;;N;;;;; +1EE11;ARABIC MATHEMATICAL SAD;Lo;0;AL;<font> 0635;;;;N;;;;; +1EE12;ARABIC MATHEMATICAL QAF;Lo;0;AL;<font> 0642;;;;N;;;;; +1EE13;ARABIC MATHEMATICAL REH;Lo;0;AL;<font> 0631;;;;N;;;;; +1EE14;ARABIC MATHEMATICAL SHEEN;Lo;0;AL;<font> 0634;;;;N;;;;; +1EE15;ARABIC MATHEMATICAL TEH;Lo;0;AL;<font> 062A;;;;N;;;;; +1EE16;ARABIC MATHEMATICAL THEH;Lo;0;AL;<font> 062B;;;;N;;;;; +1EE17;ARABIC MATHEMATICAL KHAH;Lo;0;AL;<font> 062E;;;;N;;;;; +1EE18;ARABIC MATHEMATICAL THAL;Lo;0;AL;<font> 0630;;;;N;;;;; +1EE19;ARABIC MATHEMATICAL DAD;Lo;0;AL;<font> 0636;;;;N;;;;; +1EE1A;ARABIC MATHEMATICAL ZAH;Lo;0;AL;<font> 0638;;;;N;;;;; +1EE1B;ARABIC MATHEMATICAL GHAIN;Lo;0;AL;<font> 063A;;;;N;;;;; +1EE1C;ARABIC MATHEMATICAL DOTLESS BEH;Lo;0;AL;<font> 066E;;;;N;;;;; +1EE1D;ARABIC MATHEMATICAL DOTLESS NOON;Lo;0;AL;<font> 06BA;;;;N;;;;; +1EE1E;ARABIC MATHEMATICAL DOTLESS FEH;Lo;0;AL;<font> 06A1;;;;N;;;;; +1EE1F;ARABIC MATHEMATICAL DOTLESS QAF;Lo;0;AL;<font> 066F;;;;N;;;;; +1EE21;ARABIC MATHEMATICAL INITIAL BEH;Lo;0;AL;<font> 0628;;;;N;;;;; +1EE22;ARABIC MATHEMATICAL INITIAL JEEM;Lo;0;AL;<font> 062C;;;;N;;;;; +1EE24;ARABIC MATHEMATICAL INITIAL HEH;Lo;0;AL;<font> 0647;;;;N;;;;; +1EE27;ARABIC MATHEMATICAL INITIAL HAH;Lo;0;AL;<font> 062D;;;;N;;;;; +1EE29;ARABIC MATHEMATICAL INITIAL YEH;Lo;0;AL;<font> 064A;;;;N;;;;; +1EE2A;ARABIC MATHEMATICAL INITIAL KAF;Lo;0;AL;<font> 0643;;;;N;;;;; +1EE2B;ARABIC MATHEMATICAL INITIAL LAM;Lo;0;AL;<font> 0644;;;;N;;;;; +1EE2C;ARABIC MATHEMATICAL INITIAL MEEM;Lo;0;AL;<font> 0645;;;;N;;;;; +1EE2D;ARABIC MATHEMATICAL INITIAL NOON;Lo;0;AL;<font> 0646;;;;N;;;;; +1EE2E;ARABIC MATHEMATICAL INITIAL SEEN;Lo;0;AL;<font> 0633;;;;N;;;;; +1EE2F;ARABIC MATHEMATICAL INITIAL AIN;Lo;0;AL;<font> 0639;;;;N;;;;; +1EE30;ARABIC MATHEMATICAL INITIAL FEH;Lo;0;AL;<font> 0641;;;;N;;;;; +1EE31;ARABIC MATHEMATICAL INITIAL SAD;Lo;0;AL;<font> 0635;;;;N;;;;; +1EE32;ARABIC MATHEMATICAL INITIAL QAF;Lo;0;AL;<font> 0642;;;;N;;;;; +1EE34;ARABIC MATHEMATICAL INITIAL SHEEN;Lo;0;AL;<font> 0634;;;;N;;;;; +1EE35;ARABIC MATHEMATICAL INITIAL TEH;Lo;0;AL;<font> 062A;;;;N;;;;; +1EE36;ARABIC MATHEMATICAL INITIAL THEH;Lo;0;AL;<font> 062B;;;;N;;;;; +1EE37;ARABIC MATHEMATICAL INITIAL KHAH;Lo;0;AL;<font> 062E;;;;N;;;;; +1EE39;ARABIC MATHEMATICAL INITIAL DAD;Lo;0;AL;<font> 0636;;;;N;;;;; +1EE3B;ARABIC MATHEMATICAL INITIAL GHAIN;Lo;0;AL;<font> 063A;;;;N;;;;; +1EE42;ARABIC MATHEMATICAL TAILED JEEM;Lo;0;AL;<font> 062C;;;;N;;;;; +1EE47;ARABIC MATHEMATICAL TAILED HAH;Lo;0;AL;<font> 062D;;;;N;;;;; +1EE49;ARABIC MATHEMATICAL TAILED YEH;Lo;0;AL;<font> 064A;;;;N;;;;; +1EE4B;ARABIC MATHEMATICAL TAILED LAM;Lo;0;AL;<font> 0644;;;;N;;;;; +1EE4D;ARABIC MATHEMATICAL TAILED NOON;Lo;0;AL;<font> 0646;;;;N;;;;; +1EE4E;ARABIC MATHEMATICAL TAILED SEEN;Lo;0;AL;<font> 0633;;;;N;;;;; +1EE4F;ARABIC MATHEMATICAL TAILED AIN;Lo;0;AL;<font> 0639;;;;N;;;;; +1EE51;ARABIC MATHEMATICAL TAILED SAD;Lo;0;AL;<font> 0635;;;;N;;;;; +1EE52;ARABIC MATHEMATICAL TAILED QAF;Lo;0;AL;<font> 0642;;;;N;;;;; +1EE54;ARABIC MATHEMATICAL TAILED SHEEN;Lo;0;AL;<font> 0634;;;;N;;;;; +1EE57;ARABIC MATHEMATICAL TAILED KHAH;Lo;0;AL;<font> 062E;;;;N;;;;; +1EE59;ARABIC MATHEMATICAL TAILED DAD;Lo;0;AL;<font> 0636;;;;N;;;;; +1EE5B;ARABIC MATHEMATICAL TAILED GHAIN;Lo;0;AL;<font> 063A;;;;N;;;;; +1EE5D;ARABIC MATHEMATICAL TAILED DOTLESS NOON;Lo;0;AL;<font> 06BA;;;;N;;;;; +1EE5F;ARABIC MATHEMATICAL TAILED DOTLESS QAF;Lo;0;AL;<font> 066F;;;;N;;;;; +1EE61;ARABIC MATHEMATICAL STRETCHED BEH;Lo;0;AL;<font> 0628;;;;N;;;;; +1EE62;ARABIC MATHEMATICAL STRETCHED JEEM;Lo;0;AL;<font> 062C;;;;N;;;;; +1EE64;ARABIC MATHEMATICAL STRETCHED HEH;Lo;0;AL;<font> 0647;;;;N;;;;; +1EE67;ARABIC MATHEMATICAL STRETCHED HAH;Lo;0;AL;<font> 062D;;;;N;;;;; +1EE68;ARABIC MATHEMATICAL STRETCHED TAH;Lo;0;AL;<font> 0637;;;;N;;;;; +1EE69;ARABIC MATHEMATICAL STRETCHED YEH;Lo;0;AL;<font> 064A;;;;N;;;;; +1EE6A;ARABIC MATHEMATICAL STRETCHED KAF;Lo;0;AL;<font> 0643;;;;N;;;;; +1EE6C;ARABIC MATHEMATICAL STRETCHED MEEM;Lo;0;AL;<font> 0645;;;;N;;;;; +1EE6D;ARABIC MATHEMATICAL STRETCHED NOON;Lo;0;AL;<font> 0646;;;;N;;;;; +1EE6E;ARABIC MATHEMATICAL STRETCHED SEEN;Lo;0;AL;<font> 0633;;;;N;;;;; +1EE6F;ARABIC MATHEMATICAL STRETCHED AIN;Lo;0;AL;<font> 0639;;;;N;;;;; +1EE70;ARABIC MATHEMATICAL STRETCHED FEH;Lo;0;AL;<font> 0641;;;;N;;;;; +1EE71;ARABIC MATHEMATICAL STRETCHED SAD;Lo;0;AL;<font> 0635;;;;N;;;;; +1EE72;ARABIC MATHEMATICAL STRETCHED QAF;Lo;0;AL;<font> 0642;;;;N;;;;; +1EE74;ARABIC MATHEMATICAL STRETCHED SHEEN;Lo;0;AL;<font> 0634;;;;N;;;;; +1EE75;ARABIC MATHEMATICAL STRETCHED TEH;Lo;0;AL;<font> 062A;;;;N;;;;; +1EE76;ARABIC MATHEMATICAL STRETCHED THEH;Lo;0;AL;<font> 062B;;;;N;;;;; +1EE77;ARABIC MATHEMATICAL STRETCHED KHAH;Lo;0;AL;<font> 062E;;;;N;;;;; +1EE79;ARABIC MATHEMATICAL STRETCHED DAD;Lo;0;AL;<font> 0636;;;;N;;;;; +1EE7A;ARABIC MATHEMATICAL STRETCHED ZAH;Lo;0;AL;<font> 0638;;;;N;;;;; +1EE7B;ARABIC MATHEMATICAL STRETCHED GHAIN;Lo;0;AL;<font> 063A;;;;N;;;;; +1EE7C;ARABIC MATHEMATICAL STRETCHED DOTLESS BEH;Lo;0;AL;<font> 066E;;;;N;;;;; +1EE7E;ARABIC MATHEMATICAL STRETCHED DOTLESS FEH;Lo;0;AL;<font> 06A1;;;;N;;;;; +1EE80;ARABIC MATHEMATICAL LOOPED ALEF;Lo;0;AL;<font> 0627;;;;N;;;;; +1EE81;ARABIC MATHEMATICAL LOOPED BEH;Lo;0;AL;<font> 0628;;;;N;;;;; +1EE82;ARABIC MATHEMATICAL LOOPED JEEM;Lo;0;AL;<font> 062C;;;;N;;;;; +1EE83;ARABIC MATHEMATICAL LOOPED DAL;Lo;0;AL;<font> 062F;;;;N;;;;; +1EE84;ARABIC MATHEMATICAL LOOPED HEH;Lo;0;AL;<font> 0647;;;;N;;;;; +1EE85;ARABIC MATHEMATICAL LOOPED WAW;Lo;0;AL;<font> 0648;;;;N;;;;; +1EE86;ARABIC MATHEMATICAL LOOPED ZAIN;Lo;0;AL;<font> 0632;;;;N;;;;; +1EE87;ARABIC MATHEMATICAL LOOPED HAH;Lo;0;AL;<font> 062D;;;;N;;;;; +1EE88;ARABIC MATHEMATICAL LOOPED TAH;Lo;0;AL;<font> 0637;;;;N;;;;; +1EE89;ARABIC MATHEMATICAL LOOPED YEH;Lo;0;AL;<font> 064A;;;;N;;;;; +1EE8B;ARABIC MATHEMATICAL LOOPED LAM;Lo;0;AL;<font> 0644;;;;N;;;;; +1EE8C;ARABIC MATHEMATICAL LOOPED MEEM;Lo;0;AL;<font> 0645;;;;N;;;;; +1EE8D;ARABIC MATHEMATICAL LOOPED NOON;Lo;0;AL;<font> 0646;;;;N;;;;; +1EE8E;ARABIC MATHEMATICAL LOOPED SEEN;Lo;0;AL;<font> 0633;;;;N;;;;; +1EE8F;ARABIC MATHEMATICAL LOOPED AIN;Lo;0;AL;<font> 0639;;;;N;;;;; +1EE90;ARABIC MATHEMATICAL LOOPED FEH;Lo;0;AL;<font> 0641;;;;N;;;;; +1EE91;ARABIC MATHEMATICAL LOOPED SAD;Lo;0;AL;<font> 0635;;;;N;;;;; +1EE92;ARABIC MATHEMATICAL LOOPED QAF;Lo;0;AL;<font> 0642;;;;N;;;;; +1EE93;ARABIC MATHEMATICAL LOOPED REH;Lo;0;AL;<font> 0631;;;;N;;;;; +1EE94;ARABIC MATHEMATICAL LOOPED SHEEN;Lo;0;AL;<font> 0634;;;;N;;;;; +1EE95;ARABIC MATHEMATICAL LOOPED TEH;Lo;0;AL;<font> 062A;;;;N;;;;; +1EE96;ARABIC MATHEMATICAL LOOPED THEH;Lo;0;AL;<font> 062B;;;;N;;;;; +1EE97;ARABIC MATHEMATICAL LOOPED KHAH;Lo;0;AL;<font> 062E;;;;N;;;;; +1EE98;ARABIC MATHEMATICAL LOOPED THAL;Lo;0;AL;<font> 0630;;;;N;;;;; +1EE99;ARABIC MATHEMATICAL LOOPED DAD;Lo;0;AL;<font> 0636;;;;N;;;;; +1EE9A;ARABIC MATHEMATICAL LOOPED ZAH;Lo;0;AL;<font> 0638;;;;N;;;;; +1EE9B;ARABIC MATHEMATICAL LOOPED GHAIN;Lo;0;AL;<font> 063A;;;;N;;;;; +1EEA1;ARABIC MATHEMATICAL DOUBLE-STRUCK BEH;Lo;0;AL;<font> 0628;;;;N;;;;; +1EEA2;ARABIC MATHEMATICAL DOUBLE-STRUCK JEEM;Lo;0;AL;<font> 062C;;;;N;;;;; +1EEA3;ARABIC MATHEMATICAL DOUBLE-STRUCK DAL;Lo;0;AL;<font> 062F;;;;N;;;;; +1EEA5;ARABIC MATHEMATICAL DOUBLE-STRUCK WAW;Lo;0;AL;<font> 0648;;;;N;;;;; +1EEA6;ARABIC MATHEMATICAL DOUBLE-STRUCK ZAIN;Lo;0;AL;<font> 0632;;;;N;;;;; +1EEA7;ARABIC MATHEMATICAL DOUBLE-STRUCK HAH;Lo;0;AL;<font> 062D;;;;N;;;;; +1EEA8;ARABIC MATHEMATICAL DOUBLE-STRUCK TAH;Lo;0;AL;<font> 0637;;;;N;;;;; +1EEA9;ARABIC MATHEMATICAL DOUBLE-STRUCK YEH;Lo;0;AL;<font> 064A;;;;N;;;;; +1EEAB;ARABIC MATHEMATICAL DOUBLE-STRUCK LAM;Lo;0;AL;<font> 0644;;;;N;;;;; +1EEAC;ARABIC MATHEMATICAL DOUBLE-STRUCK MEEM;Lo;0;AL;<font> 0645;;;;N;;;;; +1EEAD;ARABIC MATHEMATICAL DOUBLE-STRUCK NOON;Lo;0;AL;<font> 0646;;;;N;;;;; +1EEAE;ARABIC MATHEMATICAL DOUBLE-STRUCK SEEN;Lo;0;AL;<font> 0633;;;;N;;;;; +1EEAF;ARABIC MATHEMATICAL DOUBLE-STRUCK AIN;Lo;0;AL;<font> 0639;;;;N;;;;; +1EEB0;ARABIC MATHEMATICAL DOUBLE-STRUCK FEH;Lo;0;AL;<font> 0641;;;;N;;;;; +1EEB1;ARABIC MATHEMATICAL DOUBLE-STRUCK SAD;Lo;0;AL;<font> 0635;;;;N;;;;; +1EEB2;ARABIC MATHEMATICAL DOUBLE-STRUCK QAF;Lo;0;AL;<font> 0642;;;;N;;;;; +1EEB3;ARABIC MATHEMATICAL DOUBLE-STRUCK REH;Lo;0;AL;<font> 0631;;;;N;;;;; +1EEB4;ARABIC MATHEMATICAL DOUBLE-STRUCK SHEEN;Lo;0;AL;<font> 0634;;;;N;;;;; +1EEB5;ARABIC MATHEMATICAL DOUBLE-STRUCK TEH;Lo;0;AL;<font> 062A;;;;N;;;;; +1EEB6;ARABIC MATHEMATICAL DOUBLE-STRUCK THEH;Lo;0;AL;<font> 062B;;;;N;;;;; +1EEB7;ARABIC MATHEMATICAL DOUBLE-STRUCK KHAH;Lo;0;AL;<font> 062E;;;;N;;;;; +1EEB8;ARABIC MATHEMATICAL DOUBLE-STRUCK THAL;Lo;0;AL;<font> 0630;;;;N;;;;; +1EEB9;ARABIC MATHEMATICAL DOUBLE-STRUCK DAD;Lo;0;AL;<font> 0636;;;;N;;;;; +1EEBA;ARABIC MATHEMATICAL DOUBLE-STRUCK ZAH;Lo;0;AL;<font> 0638;;;;N;;;;; +1EEBB;ARABIC MATHEMATICAL DOUBLE-STRUCK GHAIN;Lo;0;AL;<font> 063A;;;;N;;;;; +1EEF0;ARABIC MATHEMATICAL OPERATOR MEEM WITH HAH WITH TATWEEL;Sm;0;ON;;;;;N;;;;; +1EEF1;ARABIC MATHEMATICAL OPERATOR HAH WITH DAL;Sm;0;ON;;;;;N;;;;; +1F000;MAHJONG TILE EAST WIND;So;0;ON;;;;;N;;;;; +1F001;MAHJONG TILE SOUTH WIND;So;0;ON;;;;;N;;;;; +1F002;MAHJONG TILE WEST WIND;So;0;ON;;;;;N;;;;; +1F003;MAHJONG TILE NORTH WIND;So;0;ON;;;;;N;;;;; +1F004;MAHJONG TILE RED DRAGON;So;0;ON;;;;;N;;;;; +1F005;MAHJONG TILE GREEN DRAGON;So;0;ON;;;;;N;;;;; +1F006;MAHJONG TILE WHITE DRAGON;So;0;ON;;;;;N;;;;; +1F007;MAHJONG TILE ONE OF CHARACTERS;So;0;ON;;;;;N;;;;; +1F008;MAHJONG TILE TWO OF CHARACTERS;So;0;ON;;;;;N;;;;; +1F009;MAHJONG TILE THREE OF CHARACTERS;So;0;ON;;;;;N;;;;; +1F00A;MAHJONG TILE FOUR OF CHARACTERS;So;0;ON;;;;;N;;;;; +1F00B;MAHJONG TILE FIVE OF CHARACTERS;So;0;ON;;;;;N;;;;; +1F00C;MAHJONG TILE SIX OF CHARACTERS;So;0;ON;;;;;N;;;;; +1F00D;MAHJONG TILE SEVEN OF CHARACTERS;So;0;ON;;;;;N;;;;; +1F00E;MAHJONG TILE EIGHT OF CHARACTERS;So;0;ON;;;;;N;;;;; +1F00F;MAHJONG TILE NINE OF CHARACTERS;So;0;ON;;;;;N;;;;; +1F010;MAHJONG TILE ONE OF BAMBOOS;So;0;ON;;;;;N;;;;; +1F011;MAHJONG TILE TWO OF BAMBOOS;So;0;ON;;;;;N;;;;; +1F012;MAHJONG TILE THREE OF BAMBOOS;So;0;ON;;;;;N;;;;; +1F013;MAHJONG TILE FOUR OF BAMBOOS;So;0;ON;;;;;N;;;;; +1F014;MAHJONG TILE FIVE OF BAMBOOS;So;0;ON;;;;;N;;;;; +1F015;MAHJONG TILE SIX OF BAMBOOS;So;0;ON;;;;;N;;;;; +1F016;MAHJONG TILE SEVEN OF BAMBOOS;So;0;ON;;;;;N;;;;; +1F017;MAHJONG TILE EIGHT OF BAMBOOS;So;0;ON;;;;;N;;;;; +1F018;MAHJONG TILE NINE OF BAMBOOS;So;0;ON;;;;;N;;;;; +1F019;MAHJONG TILE ONE OF CIRCLES;So;0;ON;;;;;N;;;;; +1F01A;MAHJONG TILE TWO OF CIRCLES;So;0;ON;;;;;N;;;;; +1F01B;MAHJONG TILE THREE OF CIRCLES;So;0;ON;;;;;N;;;;; +1F01C;MAHJONG TILE FOUR OF CIRCLES;So;0;ON;;;;;N;;;;; +1F01D;MAHJONG TILE FIVE OF CIRCLES;So;0;ON;;;;;N;;;;; +1F01E;MAHJONG TILE SIX OF CIRCLES;So;0;ON;;;;;N;;;;; +1F01F;MAHJONG TILE SEVEN OF CIRCLES;So;0;ON;;;;;N;;;;; +1F020;MAHJONG TILE EIGHT OF CIRCLES;So;0;ON;;;;;N;;;;; +1F021;MAHJONG TILE NINE OF CIRCLES;So;0;ON;;;;;N;;;;; +1F022;MAHJONG TILE PLUM;So;0;ON;;;;;N;;;;; +1F023;MAHJONG TILE ORCHID;So;0;ON;;;;;N;;;;; +1F024;MAHJONG TILE BAMBOO;So;0;ON;;;;;N;;;;; +1F025;MAHJONG TILE CHRYSANTHEMUM;So;0;ON;;;;;N;;;;; +1F026;MAHJONG TILE SPRING;So;0;ON;;;;;N;;;;; +1F027;MAHJONG TILE SUMMER;So;0;ON;;;;;N;;;;; +1F028;MAHJONG TILE AUTUMN;So;0;ON;;;;;N;;;;; +1F029;MAHJONG TILE WINTER;So;0;ON;;;;;N;;;;; +1F02A;MAHJONG TILE JOKER;So;0;ON;;;;;N;;;;; +1F02B;MAHJONG TILE BACK;So;0;ON;;;;;N;;;;; +1F030;DOMINO TILE HORIZONTAL BACK;So;0;ON;;;;;N;;;;; +1F031;DOMINO TILE HORIZONTAL-00-00;So;0;ON;;;;;N;;;;; +1F032;DOMINO TILE HORIZONTAL-00-01;So;0;ON;;;;;N;;;;; +1F033;DOMINO TILE HORIZONTAL-00-02;So;0;ON;;;;;N;;;;; +1F034;DOMINO TILE HORIZONTAL-00-03;So;0;ON;;;;;N;;;;; +1F035;DOMINO TILE HORIZONTAL-00-04;So;0;ON;;;;;N;;;;; +1F036;DOMINO TILE HORIZONTAL-00-05;So;0;ON;;;;;N;;;;; +1F037;DOMINO TILE HORIZONTAL-00-06;So;0;ON;;;;;N;;;;; +1F038;DOMINO TILE HORIZONTAL-01-00;So;0;ON;;;;;N;;;;; +1F039;DOMINO TILE HORIZONTAL-01-01;So;0;ON;;;;;N;;;;; +1F03A;DOMINO TILE HORIZONTAL-01-02;So;0;ON;;;;;N;;;;; +1F03B;DOMINO TILE HORIZONTAL-01-03;So;0;ON;;;;;N;;;;; +1F03C;DOMINO TILE HORIZONTAL-01-04;So;0;ON;;;;;N;;;;; +1F03D;DOMINO TILE HORIZONTAL-01-05;So;0;ON;;;;;N;;;;; +1F03E;DOMINO TILE HORIZONTAL-01-06;So;0;ON;;;;;N;;;;; +1F03F;DOMINO TILE HORIZONTAL-02-00;So;0;ON;;;;;N;;;;; +1F040;DOMINO TILE HORIZONTAL-02-01;So;0;ON;;;;;N;;;;; +1F041;DOMINO TILE HORIZONTAL-02-02;So;0;ON;;;;;N;;;;; +1F042;DOMINO TILE HORIZONTAL-02-03;So;0;ON;;;;;N;;;;; +1F043;DOMINO TILE HORIZONTAL-02-04;So;0;ON;;;;;N;;;;; +1F044;DOMINO TILE HORIZONTAL-02-05;So;0;ON;;;;;N;;;;; +1F045;DOMINO TILE HORIZONTAL-02-06;So;0;ON;;;;;N;;;;; +1F046;DOMINO TILE HORIZONTAL-03-00;So;0;ON;;;;;N;;;;; +1F047;DOMINO TILE HORIZONTAL-03-01;So;0;ON;;;;;N;;;;; +1F048;DOMINO TILE HORIZONTAL-03-02;So;0;ON;;;;;N;;;;; +1F049;DOMINO TILE HORIZONTAL-03-03;So;0;ON;;;;;N;;;;; +1F04A;DOMINO TILE HORIZONTAL-03-04;So;0;ON;;;;;N;;;;; +1F04B;DOMINO TILE HORIZONTAL-03-05;So;0;ON;;;;;N;;;;; +1F04C;DOMINO TILE HORIZONTAL-03-06;So;0;ON;;;;;N;;;;; +1F04D;DOMINO TILE HORIZONTAL-04-00;So;0;ON;;;;;N;;;;; +1F04E;DOMINO TILE HORIZONTAL-04-01;So;0;ON;;;;;N;;;;; +1F04F;DOMINO TILE HORIZONTAL-04-02;So;0;ON;;;;;N;;;;; +1F050;DOMINO TILE HORIZONTAL-04-03;So;0;ON;;;;;N;;;;; +1F051;DOMINO TILE HORIZONTAL-04-04;So;0;ON;;;;;N;;;;; +1F052;DOMINO TILE HORIZONTAL-04-05;So;0;ON;;;;;N;;;;; +1F053;DOMINO TILE HORIZONTAL-04-06;So;0;ON;;;;;N;;;;; +1F054;DOMINO TILE HORIZONTAL-05-00;So;0;ON;;;;;N;;;;; +1F055;DOMINO TILE HORIZONTAL-05-01;So;0;ON;;;;;N;;;;; +1F056;DOMINO TILE HORIZONTAL-05-02;So;0;ON;;;;;N;;;;; +1F057;DOMINO TILE HORIZONTAL-05-03;So;0;ON;;;;;N;;;;; +1F058;DOMINO TILE HORIZONTAL-05-04;So;0;ON;;;;;N;;;;; +1F059;DOMINO TILE HORIZONTAL-05-05;So;0;ON;;;;;N;;;;; +1F05A;DOMINO TILE HORIZONTAL-05-06;So;0;ON;;;;;N;;;;; +1F05B;DOMINO TILE HORIZONTAL-06-00;So;0;ON;;;;;N;;;;; +1F05C;DOMINO TILE HORIZONTAL-06-01;So;0;ON;;;;;N;;;;; +1F05D;DOMINO TILE HORIZONTAL-06-02;So;0;ON;;;;;N;;;;; +1F05E;DOMINO TILE HORIZONTAL-06-03;So;0;ON;;;;;N;;;;; +1F05F;DOMINO TILE HORIZONTAL-06-04;So;0;ON;;;;;N;;;;; +1F060;DOMINO TILE HORIZONTAL-06-05;So;0;ON;;;;;N;;;;; +1F061;DOMINO TILE HORIZONTAL-06-06;So;0;ON;;;;;N;;;;; +1F062;DOMINO TILE VERTICAL BACK;So;0;ON;;;;;N;;;;; +1F063;DOMINO TILE VERTICAL-00-00;So;0;ON;;;;;N;;;;; +1F064;DOMINO TILE VERTICAL-00-01;So;0;ON;;;;;N;;;;; +1F065;DOMINO TILE VERTICAL-00-02;So;0;ON;;;;;N;;;;; +1F066;DOMINO TILE VERTICAL-00-03;So;0;ON;;;;;N;;;;; +1F067;DOMINO TILE VERTICAL-00-04;So;0;ON;;;;;N;;;;; +1F068;DOMINO TILE VERTICAL-00-05;So;0;ON;;;;;N;;;;; +1F069;DOMINO TILE VERTICAL-00-06;So;0;ON;;;;;N;;;;; +1F06A;DOMINO TILE VERTICAL-01-00;So;0;ON;;;;;N;;;;; +1F06B;DOMINO TILE VERTICAL-01-01;So;0;ON;;;;;N;;;;; +1F06C;DOMINO TILE VERTICAL-01-02;So;0;ON;;;;;N;;;;; +1F06D;DOMINO TILE VERTICAL-01-03;So;0;ON;;;;;N;;;;; +1F06E;DOMINO TILE VERTICAL-01-04;So;0;ON;;;;;N;;;;; +1F06F;DOMINO TILE VERTICAL-01-05;So;0;ON;;;;;N;;;;; +1F070;DOMINO TILE VERTICAL-01-06;So;0;ON;;;;;N;;;;; +1F071;DOMINO TILE VERTICAL-02-00;So;0;ON;;;;;N;;;;; +1F072;DOMINO TILE VERTICAL-02-01;So;0;ON;;;;;N;;;;; +1F073;DOMINO TILE VERTICAL-02-02;So;0;ON;;;;;N;;;;; +1F074;DOMINO TILE VERTICAL-02-03;So;0;ON;;;;;N;;;;; +1F075;DOMINO TILE VERTICAL-02-04;So;0;ON;;;;;N;;;;; +1F076;DOMINO TILE VERTICAL-02-05;So;0;ON;;;;;N;;;;; +1F077;DOMINO TILE VERTICAL-02-06;So;0;ON;;;;;N;;;;; +1F078;DOMINO TILE VERTICAL-03-00;So;0;ON;;;;;N;;;;; +1F079;DOMINO TILE VERTICAL-03-01;So;0;ON;;;;;N;;;;; +1F07A;DOMINO TILE VERTICAL-03-02;So;0;ON;;;;;N;;;;; +1F07B;DOMINO TILE VERTICAL-03-03;So;0;ON;;;;;N;;;;; +1F07C;DOMINO TILE VERTICAL-03-04;So;0;ON;;;;;N;;;;; +1F07D;DOMINO TILE VERTICAL-03-05;So;0;ON;;;;;N;;;;; +1F07E;DOMINO TILE VERTICAL-03-06;So;0;ON;;;;;N;;;;; +1F07F;DOMINO TILE VERTICAL-04-00;So;0;ON;;;;;N;;;;; +1F080;DOMINO TILE VERTICAL-04-01;So;0;ON;;;;;N;;;;; +1F081;DOMINO TILE VERTICAL-04-02;So;0;ON;;;;;N;;;;; +1F082;DOMINO TILE VERTICAL-04-03;So;0;ON;;;;;N;;;;; +1F083;DOMINO TILE VERTICAL-04-04;So;0;ON;;;;;N;;;;; +1F084;DOMINO TILE VERTICAL-04-05;So;0;ON;;;;;N;;;;; +1F085;DOMINO TILE VERTICAL-04-06;So;0;ON;;;;;N;;;;; +1F086;DOMINO TILE VERTICAL-05-00;So;0;ON;;;;;N;;;;; +1F087;DOMINO TILE VERTICAL-05-01;So;0;ON;;;;;N;;;;; +1F088;DOMINO TILE VERTICAL-05-02;So;0;ON;;;;;N;;;;; +1F089;DOMINO TILE VERTICAL-05-03;So;0;ON;;;;;N;;;;; +1F08A;DOMINO TILE VERTICAL-05-04;So;0;ON;;;;;N;;;;; +1F08B;DOMINO TILE VERTICAL-05-05;So;0;ON;;;;;N;;;;; +1F08C;DOMINO TILE VERTICAL-05-06;So;0;ON;;;;;N;;;;; +1F08D;DOMINO TILE VERTICAL-06-00;So;0;ON;;;;;N;;;;; +1F08E;DOMINO TILE VERTICAL-06-01;So;0;ON;;;;;N;;;;; +1F08F;DOMINO TILE VERTICAL-06-02;So;0;ON;;;;;N;;;;; +1F090;DOMINO TILE VERTICAL-06-03;So;0;ON;;;;;N;;;;; +1F091;DOMINO TILE VERTICAL-06-04;So;0;ON;;;;;N;;;;; +1F092;DOMINO TILE VERTICAL-06-05;So;0;ON;;;;;N;;;;; +1F093;DOMINO TILE VERTICAL-06-06;So;0;ON;;;;;N;;;;; +1F0A0;PLAYING CARD BACK;So;0;ON;;;;;N;;;;; +1F0A1;PLAYING CARD ACE OF SPADES;So;0;ON;;;;;N;;;;; +1F0A2;PLAYING CARD TWO OF SPADES;So;0;ON;;;;;N;;;;; +1F0A3;PLAYING CARD THREE OF SPADES;So;0;ON;;;;;N;;;;; +1F0A4;PLAYING CARD FOUR OF SPADES;So;0;ON;;;;;N;;;;; +1F0A5;PLAYING CARD FIVE OF SPADES;So;0;ON;;;;;N;;;;; +1F0A6;PLAYING CARD SIX OF SPADES;So;0;ON;;;;;N;;;;; +1F0A7;PLAYING CARD SEVEN OF SPADES;So;0;ON;;;;;N;;;;; +1F0A8;PLAYING CARD EIGHT OF SPADES;So;0;ON;;;;;N;;;;; +1F0A9;PLAYING CARD NINE OF SPADES;So;0;ON;;;;;N;;;;; +1F0AA;PLAYING CARD TEN OF SPADES;So;0;ON;;;;;N;;;;; +1F0AB;PLAYING CARD JACK OF SPADES;So;0;ON;;;;;N;;;;; +1F0AC;PLAYING CARD KNIGHT OF SPADES;So;0;ON;;;;;N;;;;; +1F0AD;PLAYING CARD QUEEN OF SPADES;So;0;ON;;;;;N;;;;; +1F0AE;PLAYING CARD KING OF SPADES;So;0;ON;;;;;N;;;;; +1F0B1;PLAYING CARD ACE OF HEARTS;So;0;ON;;;;;N;;;;; +1F0B2;PLAYING CARD TWO OF HEARTS;So;0;ON;;;;;N;;;;; +1F0B3;PLAYING CARD THREE OF HEARTS;So;0;ON;;;;;N;;;;; +1F0B4;PLAYING CARD FOUR OF HEARTS;So;0;ON;;;;;N;;;;; +1F0B5;PLAYING CARD FIVE OF HEARTS;So;0;ON;;;;;N;;;;; +1F0B6;PLAYING CARD SIX OF HEARTS;So;0;ON;;;;;N;;;;; +1F0B7;PLAYING CARD SEVEN OF HEARTS;So;0;ON;;;;;N;;;;; +1F0B8;PLAYING CARD EIGHT OF HEARTS;So;0;ON;;;;;N;;;;; +1F0B9;PLAYING CARD NINE OF HEARTS;So;0;ON;;;;;N;;;;; +1F0BA;PLAYING CARD TEN OF HEARTS;So;0;ON;;;;;N;;;;; +1F0BB;PLAYING CARD JACK OF HEARTS;So;0;ON;;;;;N;;;;; +1F0BC;PLAYING CARD KNIGHT OF HEARTS;So;0;ON;;;;;N;;;;; +1F0BD;PLAYING CARD QUEEN OF HEARTS;So;0;ON;;;;;N;;;;; +1F0BE;PLAYING CARD KING OF HEARTS;So;0;ON;;;;;N;;;;; +1F0BF;PLAYING CARD RED JOKER;So;0;ON;;;;;N;;;;; +1F0C1;PLAYING CARD ACE OF DIAMONDS;So;0;ON;;;;;N;;;;; +1F0C2;PLAYING CARD TWO OF DIAMONDS;So;0;ON;;;;;N;;;;; +1F0C3;PLAYING CARD THREE OF DIAMONDS;So;0;ON;;;;;N;;;;; +1F0C4;PLAYING CARD FOUR OF DIAMONDS;So;0;ON;;;;;N;;;;; +1F0C5;PLAYING CARD FIVE OF DIAMONDS;So;0;ON;;;;;N;;;;; +1F0C6;PLAYING CARD SIX OF DIAMONDS;So;0;ON;;;;;N;;;;; +1F0C7;PLAYING CARD SEVEN OF DIAMONDS;So;0;ON;;;;;N;;;;; +1F0C8;PLAYING CARD EIGHT OF DIAMONDS;So;0;ON;;;;;N;;;;; +1F0C9;PLAYING CARD NINE OF DIAMONDS;So;0;ON;;;;;N;;;;; +1F0CA;PLAYING CARD TEN OF DIAMONDS;So;0;ON;;;;;N;;;;; +1F0CB;PLAYING CARD JACK OF DIAMONDS;So;0;ON;;;;;N;;;;; +1F0CC;PLAYING CARD KNIGHT OF DIAMONDS;So;0;ON;;;;;N;;;;; +1F0CD;PLAYING CARD QUEEN OF DIAMONDS;So;0;ON;;;;;N;;;;; +1F0CE;PLAYING CARD KING OF DIAMONDS;So;0;ON;;;;;N;;;;; +1F0CF;PLAYING CARD BLACK JOKER;So;0;ON;;;;;N;;;;; +1F0D1;PLAYING CARD ACE OF CLUBS;So;0;ON;;;;;N;;;;; +1F0D2;PLAYING CARD TWO OF CLUBS;So;0;ON;;;;;N;;;;; +1F0D3;PLAYING CARD THREE OF CLUBS;So;0;ON;;;;;N;;;;; +1F0D4;PLAYING CARD FOUR OF CLUBS;So;0;ON;;;;;N;;;;; +1F0D5;PLAYING CARD FIVE OF CLUBS;So;0;ON;;;;;N;;;;; +1F0D6;PLAYING CARD SIX OF CLUBS;So;0;ON;;;;;N;;;;; +1F0D7;PLAYING CARD SEVEN OF CLUBS;So;0;ON;;;;;N;;;;; +1F0D8;PLAYING CARD EIGHT OF CLUBS;So;0;ON;;;;;N;;;;; +1F0D9;PLAYING CARD NINE OF CLUBS;So;0;ON;;;;;N;;;;; +1F0DA;PLAYING CARD TEN OF CLUBS;So;0;ON;;;;;N;;;;; +1F0DB;PLAYING CARD JACK OF CLUBS;So;0;ON;;;;;N;;;;; +1F0DC;PLAYING CARD KNIGHT OF CLUBS;So;0;ON;;;;;N;;;;; +1F0DD;PLAYING CARD QUEEN OF CLUBS;So;0;ON;;;;;N;;;;; +1F0DE;PLAYING CARD KING OF CLUBS;So;0;ON;;;;;N;;;;; +1F0DF;PLAYING CARD WHITE JOKER;So;0;ON;;;;;N;;;;; +1F0E0;PLAYING CARD FOOL;So;0;ON;;;;;N;;;;; +1F0E1;PLAYING CARD TRUMP-1;So;0;ON;;;;;N;;;;; +1F0E2;PLAYING CARD TRUMP-2;So;0;ON;;;;;N;;;;; +1F0E3;PLAYING CARD TRUMP-3;So;0;ON;;;;;N;;;;; +1F0E4;PLAYING CARD TRUMP-4;So;0;ON;;;;;N;;;;; +1F0E5;PLAYING CARD TRUMP-5;So;0;ON;;;;;N;;;;; +1F0E6;PLAYING CARD TRUMP-6;So;0;ON;;;;;N;;;;; +1F0E7;PLAYING CARD TRUMP-7;So;0;ON;;;;;N;;;;; +1F0E8;PLAYING CARD TRUMP-8;So;0;ON;;;;;N;;;;; +1F0E9;PLAYING CARD TRUMP-9;So;0;ON;;;;;N;;;;; +1F0EA;PLAYING CARD TRUMP-10;So;0;ON;;;;;N;;;;; +1F0EB;PLAYING CARD TRUMP-11;So;0;ON;;;;;N;;;;; +1F0EC;PLAYING CARD TRUMP-12;So;0;ON;;;;;N;;;;; +1F0ED;PLAYING CARD TRUMP-13;So;0;ON;;;;;N;;;;; +1F0EE;PLAYING CARD TRUMP-14;So;0;ON;;;;;N;;;;; +1F0EF;PLAYING CARD TRUMP-15;So;0;ON;;;;;N;;;;; +1F0F0;PLAYING CARD TRUMP-16;So;0;ON;;;;;N;;;;; +1F0F1;PLAYING CARD TRUMP-17;So;0;ON;;;;;N;;;;; +1F0F2;PLAYING CARD TRUMP-18;So;0;ON;;;;;N;;;;; +1F0F3;PLAYING CARD TRUMP-19;So;0;ON;;;;;N;;;;; +1F0F4;PLAYING CARD TRUMP-20;So;0;ON;;;;;N;;;;; +1F0F5;PLAYING CARD TRUMP-21;So;0;ON;;;;;N;;;;; +1F100;DIGIT ZERO FULL STOP;No;0;EN;<compat> 0030 002E;;0;0;N;;;;; +1F101;DIGIT ZERO COMMA;No;0;EN;<compat> 0030 002C;;0;0;N;;;;; +1F102;DIGIT ONE COMMA;No;0;EN;<compat> 0031 002C;;1;1;N;;;;; +1F103;DIGIT TWO COMMA;No;0;EN;<compat> 0032 002C;;2;2;N;;;;; +1F104;DIGIT THREE COMMA;No;0;EN;<compat> 0033 002C;;3;3;N;;;;; +1F105;DIGIT FOUR COMMA;No;0;EN;<compat> 0034 002C;;4;4;N;;;;; +1F106;DIGIT FIVE COMMA;No;0;EN;<compat> 0035 002C;;5;5;N;;;;; +1F107;DIGIT SIX COMMA;No;0;EN;<compat> 0036 002C;;6;6;N;;;;; +1F108;DIGIT SEVEN COMMA;No;0;EN;<compat> 0037 002C;;7;7;N;;;;; +1F109;DIGIT EIGHT COMMA;No;0;EN;<compat> 0038 002C;;8;8;N;;;;; +1F10A;DIGIT NINE COMMA;No;0;EN;<compat> 0039 002C;;9;9;N;;;;; +1F10B;DINGBAT CIRCLED SANS-SERIF DIGIT ZERO;No;0;ON;;;;0;N;;;;; +1F10C;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ZERO;No;0;ON;;;;0;N;;;;; +1F110;PARENTHESIZED LATIN CAPITAL LETTER A;So;0;L;<compat> 0028 0041 0029;;;;N;;;;; +1F111;PARENTHESIZED LATIN CAPITAL LETTER B;So;0;L;<compat> 0028 0042 0029;;;;N;;;;; +1F112;PARENTHESIZED LATIN CAPITAL LETTER C;So;0;L;<compat> 0028 0043 0029;;;;N;;;;; +1F113;PARENTHESIZED LATIN CAPITAL LETTER D;So;0;L;<compat> 0028 0044 0029;;;;N;;;;; +1F114;PARENTHESIZED LATIN CAPITAL LETTER E;So;0;L;<compat> 0028 0045 0029;;;;N;;;;; +1F115;PARENTHESIZED LATIN CAPITAL LETTER F;So;0;L;<compat> 0028 0046 0029;;;;N;;;;; +1F116;PARENTHESIZED LATIN CAPITAL LETTER G;So;0;L;<compat> 0028 0047 0029;;;;N;;;;; +1F117;PARENTHESIZED LATIN CAPITAL LETTER H;So;0;L;<compat> 0028 0048 0029;;;;N;;;;; +1F118;PARENTHESIZED LATIN CAPITAL LETTER I;So;0;L;<compat> 0028 0049 0029;;;;N;;;;; +1F119;PARENTHESIZED LATIN CAPITAL LETTER J;So;0;L;<compat> 0028 004A 0029;;;;N;;;;; +1F11A;PARENTHESIZED LATIN CAPITAL LETTER K;So;0;L;<compat> 0028 004B 0029;;;;N;;;;; +1F11B;PARENTHESIZED LATIN CAPITAL LETTER L;So;0;L;<compat> 0028 004C 0029;;;;N;;;;; +1F11C;PARENTHESIZED LATIN CAPITAL LETTER M;So;0;L;<compat> 0028 004D 0029;;;;N;;;;; +1F11D;PARENTHESIZED LATIN CAPITAL LETTER N;So;0;L;<compat> 0028 004E 0029;;;;N;;;;; +1F11E;PARENTHESIZED LATIN CAPITAL LETTER O;So;0;L;<compat> 0028 004F 0029;;;;N;;;;; +1F11F;PARENTHESIZED LATIN CAPITAL LETTER P;So;0;L;<compat> 0028 0050 0029;;;;N;;;;; +1F120;PARENTHESIZED LATIN CAPITAL LETTER Q;So;0;L;<compat> 0028 0051 0029;;;;N;;;;; +1F121;PARENTHESIZED LATIN CAPITAL LETTER R;So;0;L;<compat> 0028 0052 0029;;;;N;;;;; +1F122;PARENTHESIZED LATIN CAPITAL LETTER S;So;0;L;<compat> 0028 0053 0029;;;;N;;;;; +1F123;PARENTHESIZED LATIN CAPITAL LETTER T;So;0;L;<compat> 0028 0054 0029;;;;N;;;;; +1F124;PARENTHESIZED LATIN CAPITAL LETTER U;So;0;L;<compat> 0028 0055 0029;;;;N;;;;; +1F125;PARENTHESIZED LATIN CAPITAL LETTER V;So;0;L;<compat> 0028 0056 0029;;;;N;;;;; +1F126;PARENTHESIZED LATIN CAPITAL LETTER W;So;0;L;<compat> 0028 0057 0029;;;;N;;;;; +1F127;PARENTHESIZED LATIN CAPITAL LETTER X;So;0;L;<compat> 0028 0058 0029;;;;N;;;;; +1F128;PARENTHESIZED LATIN CAPITAL LETTER Y;So;0;L;<compat> 0028 0059 0029;;;;N;;;;; +1F129;PARENTHESIZED LATIN CAPITAL LETTER Z;So;0;L;<compat> 0028 005A 0029;;;;N;;;;; +1F12A;TORTOISE SHELL BRACKETED LATIN CAPITAL LETTER S;So;0;L;<compat> 3014 0053 3015;;;;N;;;;; +1F12B;CIRCLED ITALIC LATIN CAPITAL LETTER C;So;0;L;<circle> 0043;;;;N;;;;; +1F12C;CIRCLED ITALIC LATIN CAPITAL LETTER R;So;0;L;<circle> 0052;;;;N;;;;; +1F12D;CIRCLED CD;So;0;L;<circle> 0043 0044;;;;N;;;;; +1F12E;CIRCLED WZ;So;0;L;<circle> 0057 005A;;;;N;;;;; +1F12F;COPYLEFT SYMBOL;So;0;ON;;;;;N;;;;; +1F130;SQUARED LATIN CAPITAL LETTER A;So;0;L;<square> 0041;;;;N;;;;; +1F131;SQUARED LATIN CAPITAL LETTER B;So;0;L;<square> 0042;;;;N;;;;; +1F132;SQUARED LATIN CAPITAL LETTER C;So;0;L;<square> 0043;;;;N;;;;; +1F133;SQUARED LATIN CAPITAL LETTER D;So;0;L;<square> 0044;;;;N;;;;; +1F134;SQUARED LATIN CAPITAL LETTER E;So;0;L;<square> 0045;;;;N;;;;; +1F135;SQUARED LATIN CAPITAL LETTER F;So;0;L;<square> 0046;;;;N;;;;; +1F136;SQUARED LATIN CAPITAL LETTER G;So;0;L;<square> 0047;;;;N;;;;; +1F137;SQUARED LATIN CAPITAL LETTER H;So;0;L;<square> 0048;;;;N;;;;; +1F138;SQUARED LATIN CAPITAL LETTER I;So;0;L;<square> 0049;;;;N;;;;; +1F139;SQUARED LATIN CAPITAL LETTER J;So;0;L;<square> 004A;;;;N;;;;; +1F13A;SQUARED LATIN CAPITAL LETTER K;So;0;L;<square> 004B;;;;N;;;;; +1F13B;SQUARED LATIN CAPITAL LETTER L;So;0;L;<square> 004C;;;;N;;;;; +1F13C;SQUARED LATIN CAPITAL LETTER M;So;0;L;<square> 004D;;;;N;;;;; +1F13D;SQUARED LATIN CAPITAL LETTER N;So;0;L;<square> 004E;;;;N;;;;; +1F13E;SQUARED LATIN CAPITAL LETTER O;So;0;L;<square> 004F;;;;N;;;;; +1F13F;SQUARED LATIN CAPITAL LETTER P;So;0;L;<square> 0050;;;;N;;;;; +1F140;SQUARED LATIN CAPITAL LETTER Q;So;0;L;<square> 0051;;;;N;;;;; +1F141;SQUARED LATIN CAPITAL LETTER R;So;0;L;<square> 0052;;;;N;;;;; +1F142;SQUARED LATIN CAPITAL LETTER S;So;0;L;<square> 0053;;;;N;;;;; +1F143;SQUARED LATIN CAPITAL LETTER T;So;0;L;<square> 0054;;;;N;;;;; +1F144;SQUARED LATIN CAPITAL LETTER U;So;0;L;<square> 0055;;;;N;;;;; +1F145;SQUARED LATIN CAPITAL LETTER V;So;0;L;<square> 0056;;;;N;;;;; +1F146;SQUARED LATIN CAPITAL LETTER W;So;0;L;<square> 0057;;;;N;;;;; +1F147;SQUARED LATIN CAPITAL LETTER X;So;0;L;<square> 0058;;;;N;;;;; +1F148;SQUARED LATIN CAPITAL LETTER Y;So;0;L;<square> 0059;;;;N;;;;; +1F149;SQUARED LATIN CAPITAL LETTER Z;So;0;L;<square> 005A;;;;N;;;;; +1F14A;SQUARED HV;So;0;L;<square> 0048 0056;;;;N;;;;; +1F14B;SQUARED MV;So;0;L;<square> 004D 0056;;;;N;;;;; +1F14C;SQUARED SD;So;0;L;<square> 0053 0044;;;;N;;;;; +1F14D;SQUARED SS;So;0;L;<square> 0053 0053;;;;N;;;;; +1F14E;SQUARED PPV;So;0;L;<square> 0050 0050 0056;;;;N;;;;; +1F14F;SQUARED WC;So;0;L;<square> 0057 0043;;;;N;;;;; +1F150;NEGATIVE CIRCLED LATIN CAPITAL LETTER A;So;0;L;;;;;N;;;;; +1F151;NEGATIVE CIRCLED LATIN CAPITAL LETTER B;So;0;L;;;;;N;;;;; +1F152;NEGATIVE CIRCLED LATIN CAPITAL LETTER C;So;0;L;;;;;N;;;;; +1F153;NEGATIVE CIRCLED LATIN CAPITAL LETTER D;So;0;L;;;;;N;;;;; +1F154;NEGATIVE CIRCLED LATIN CAPITAL LETTER E;So;0;L;;;;;N;;;;; +1F155;NEGATIVE CIRCLED LATIN CAPITAL LETTER F;So;0;L;;;;;N;;;;; +1F156;NEGATIVE CIRCLED LATIN CAPITAL LETTER G;So;0;L;;;;;N;;;;; +1F157;NEGATIVE CIRCLED LATIN CAPITAL LETTER H;So;0;L;;;;;N;;;;; +1F158;NEGATIVE CIRCLED LATIN CAPITAL LETTER I;So;0;L;;;;;N;;;;; +1F159;NEGATIVE CIRCLED LATIN CAPITAL LETTER J;So;0;L;;;;;N;;;;; +1F15A;NEGATIVE CIRCLED LATIN CAPITAL LETTER K;So;0;L;;;;;N;;;;; +1F15B;NEGATIVE CIRCLED LATIN CAPITAL LETTER L;So;0;L;;;;;N;;;;; +1F15C;NEGATIVE CIRCLED LATIN CAPITAL LETTER M;So;0;L;;;;;N;;;;; +1F15D;NEGATIVE CIRCLED LATIN CAPITAL LETTER N;So;0;L;;;;;N;;;;; +1F15E;NEGATIVE CIRCLED LATIN CAPITAL LETTER O;So;0;L;;;;;N;;;;; +1F15F;NEGATIVE CIRCLED LATIN CAPITAL LETTER P;So;0;L;;;;;N;;;;; +1F160;NEGATIVE CIRCLED LATIN CAPITAL LETTER Q;So;0;L;;;;;N;;;;; +1F161;NEGATIVE CIRCLED LATIN CAPITAL LETTER R;So;0;L;;;;;N;;;;; +1F162;NEGATIVE CIRCLED LATIN CAPITAL LETTER S;So;0;L;;;;;N;;;;; +1F163;NEGATIVE CIRCLED LATIN CAPITAL LETTER T;So;0;L;;;;;N;;;;; +1F164;NEGATIVE CIRCLED LATIN CAPITAL LETTER U;So;0;L;;;;;N;;;;; +1F165;NEGATIVE CIRCLED LATIN CAPITAL LETTER V;So;0;L;;;;;N;;;;; +1F166;NEGATIVE CIRCLED LATIN CAPITAL LETTER W;So;0;L;;;;;N;;;;; +1F167;NEGATIVE CIRCLED LATIN CAPITAL LETTER X;So;0;L;;;;;N;;;;; +1F168;NEGATIVE CIRCLED LATIN CAPITAL LETTER Y;So;0;L;;;;;N;;;;; +1F169;NEGATIVE CIRCLED LATIN CAPITAL LETTER Z;So;0;L;;;;;N;;;;; +1F16A;RAISED MC SIGN;So;0;ON;<super> 004D 0043;;;;N;;;;; +1F16B;RAISED MD SIGN;So;0;ON;<super> 004D 0044;;;;N;;;;; +1F170;NEGATIVE SQUARED LATIN CAPITAL LETTER A;So;0;L;;;;;N;;;;; +1F171;NEGATIVE SQUARED LATIN CAPITAL LETTER B;So;0;L;;;;;N;;;;; +1F172;NEGATIVE SQUARED LATIN CAPITAL LETTER C;So;0;L;;;;;N;;;;; +1F173;NEGATIVE SQUARED LATIN CAPITAL LETTER D;So;0;L;;;;;N;;;;; +1F174;NEGATIVE SQUARED LATIN CAPITAL LETTER E;So;0;L;;;;;N;;;;; +1F175;NEGATIVE SQUARED LATIN CAPITAL LETTER F;So;0;L;;;;;N;;;;; +1F176;NEGATIVE SQUARED LATIN CAPITAL LETTER G;So;0;L;;;;;N;;;;; +1F177;NEGATIVE SQUARED LATIN CAPITAL LETTER H;So;0;L;;;;;N;;;;; +1F178;NEGATIVE SQUARED LATIN CAPITAL LETTER I;So;0;L;;;;;N;;;;; +1F179;NEGATIVE SQUARED LATIN CAPITAL LETTER J;So;0;L;;;;;N;;;;; +1F17A;NEGATIVE SQUARED LATIN CAPITAL LETTER K;So;0;L;;;;;N;;;;; +1F17B;NEGATIVE SQUARED LATIN CAPITAL LETTER L;So;0;L;;;;;N;;;;; +1F17C;NEGATIVE SQUARED LATIN CAPITAL LETTER M;So;0;L;;;;;N;;;;; +1F17D;NEGATIVE SQUARED LATIN CAPITAL LETTER N;So;0;L;;;;;N;;;;; +1F17E;NEGATIVE SQUARED LATIN CAPITAL LETTER O;So;0;L;;;;;N;;;;; +1F17F;NEGATIVE SQUARED LATIN CAPITAL LETTER P;So;0;L;;;;;N;;;;; +1F180;NEGATIVE SQUARED LATIN CAPITAL LETTER Q;So;0;L;;;;;N;;;;; +1F181;NEGATIVE SQUARED LATIN CAPITAL LETTER R;So;0;L;;;;;N;;;;; +1F182;NEGATIVE SQUARED LATIN CAPITAL LETTER S;So;0;L;;;;;N;;;;; +1F183;NEGATIVE SQUARED LATIN CAPITAL LETTER T;So;0;L;;;;;N;;;;; +1F184;NEGATIVE SQUARED LATIN CAPITAL LETTER U;So;0;L;;;;;N;;;;; +1F185;NEGATIVE SQUARED LATIN CAPITAL LETTER V;So;0;L;;;;;N;;;;; +1F186;NEGATIVE SQUARED LATIN CAPITAL LETTER W;So;0;L;;;;;N;;;;; +1F187;NEGATIVE SQUARED LATIN CAPITAL LETTER X;So;0;L;;;;;N;;;;; +1F188;NEGATIVE SQUARED LATIN CAPITAL LETTER Y;So;0;L;;;;;N;;;;; +1F189;NEGATIVE SQUARED LATIN CAPITAL LETTER Z;So;0;L;;;;;N;;;;; +1F18A;CROSSED NEGATIVE SQUARED LATIN CAPITAL LETTER P;So;0;L;;;;;N;;;;; +1F18B;NEGATIVE SQUARED IC;So;0;L;;;;;N;;;;; +1F18C;NEGATIVE SQUARED PA;So;0;L;;;;;N;;;;; +1F18D;NEGATIVE SQUARED SA;So;0;L;;;;;N;;;;; +1F18E;NEGATIVE SQUARED AB;So;0;L;;;;;N;;;;; +1F18F;NEGATIVE SQUARED WC;So;0;L;;;;;N;;;;; +1F190;SQUARE DJ;So;0;L;<square> 0044 004A;;;;N;;;;; +1F191;SQUARED CL;So;0;L;;;;;N;;;;; +1F192;SQUARED COOL;So;0;L;;;;;N;;;;; +1F193;SQUARED FREE;So;0;L;;;;;N;;;;; +1F194;SQUARED ID;So;0;L;;;;;N;;;;; +1F195;SQUARED NEW;So;0;L;;;;;N;;;;; +1F196;SQUARED NG;So;0;L;;;;;N;;;;; +1F197;SQUARED OK;So;0;L;;;;;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;;;;; +1F1E9;REGIONAL INDICATOR SYMBOL LETTER D;So;0;L;;;;;N;;;;; +1F1EA;REGIONAL INDICATOR SYMBOL LETTER E;So;0;L;;;;;N;;;;; +1F1EB;REGIONAL INDICATOR SYMBOL LETTER F;So;0;L;;;;;N;;;;; +1F1EC;REGIONAL INDICATOR SYMBOL LETTER G;So;0;L;;;;;N;;;;; +1F1ED;REGIONAL INDICATOR SYMBOL LETTER H;So;0;L;;;;;N;;;;; +1F1EE;REGIONAL INDICATOR SYMBOL LETTER I;So;0;L;;;;;N;;;;; +1F1EF;REGIONAL INDICATOR SYMBOL LETTER J;So;0;L;;;;;N;;;;; +1F1F0;REGIONAL INDICATOR SYMBOL LETTER K;So;0;L;;;;;N;;;;; +1F1F1;REGIONAL INDICATOR SYMBOL LETTER L;So;0;L;;;;;N;;;;; +1F1F2;REGIONAL INDICATOR SYMBOL LETTER M;So;0;L;;;;;N;;;;; +1F1F3;REGIONAL INDICATOR SYMBOL LETTER N;So;0;L;;;;;N;;;;; +1F1F4;REGIONAL INDICATOR SYMBOL LETTER O;So;0;L;;;;;N;;;;; +1F1F5;REGIONAL INDICATOR SYMBOL LETTER P;So;0;L;;;;;N;;;;; +1F1F6;REGIONAL INDICATOR SYMBOL LETTER Q;So;0;L;;;;;N;;;;; +1F1F7;REGIONAL INDICATOR SYMBOL LETTER R;So;0;L;;;;;N;;;;; +1F1F8;REGIONAL INDICATOR SYMBOL LETTER S;So;0;L;;;;;N;;;;; +1F1F9;REGIONAL INDICATOR SYMBOL LETTER T;So;0;L;;;;;N;;;;; +1F1FA;REGIONAL INDICATOR SYMBOL LETTER U;So;0;L;;;;;N;;;;; +1F1FB;REGIONAL INDICATOR SYMBOL LETTER V;So;0;L;;;;;N;;;;; +1F1FC;REGIONAL INDICATOR SYMBOL LETTER W;So;0;L;;;;;N;;;;; +1F1FD;REGIONAL INDICATOR SYMBOL LETTER X;So;0;L;;;;;N;;;;; +1F1FE;REGIONAL INDICATOR SYMBOL LETTER Y;So;0;L;;;;;N;;;;; +1F1FF;REGIONAL INDICATOR SYMBOL LETTER Z;So;0;L;;;;;N;;;;; +1F200;SQUARE HIRAGANA HOKA;So;0;L;<square> 307B 304B;;;;N;;;;; +1F201;SQUARED KATAKANA KOKO;So;0;L;<square> 30B3 30B3;;;;N;;;;; +1F202;SQUARED KATAKANA SA;So;0;L;<square> 30B5;;;;N;;;;; +1F210;SQUARED CJK UNIFIED IDEOGRAPH-624B;So;0;L;<square> 624B;;;;N;;;;; +1F211;SQUARED CJK UNIFIED IDEOGRAPH-5B57;So;0;L;<square> 5B57;;;;N;;;;; +1F212;SQUARED CJK UNIFIED IDEOGRAPH-53CC;So;0;L;<square> 53CC;;;;N;;;;; +1F213;SQUARED KATAKANA DE;So;0;L;<square> 30C7;;;;N;;;;; +1F214;SQUARED CJK UNIFIED IDEOGRAPH-4E8C;So;0;L;<square> 4E8C;;;;N;;;;; +1F215;SQUARED CJK UNIFIED IDEOGRAPH-591A;So;0;L;<square> 591A;;;;N;;;;; +1F216;SQUARED CJK UNIFIED IDEOGRAPH-89E3;So;0;L;<square> 89E3;;;;N;;;;; +1F217;SQUARED CJK UNIFIED IDEOGRAPH-5929;So;0;L;<square> 5929;;;;N;;;;; +1F218;SQUARED CJK UNIFIED IDEOGRAPH-4EA4;So;0;L;<square> 4EA4;;;;N;;;;; +1F219;SQUARED CJK UNIFIED IDEOGRAPH-6620;So;0;L;<square> 6620;;;;N;;;;; +1F21A;SQUARED CJK UNIFIED IDEOGRAPH-7121;So;0;L;<square> 7121;;;;N;;;;; +1F21B;SQUARED CJK UNIFIED IDEOGRAPH-6599;So;0;L;<square> 6599;;;;N;;;;; +1F21C;SQUARED CJK UNIFIED IDEOGRAPH-524D;So;0;L;<square> 524D;;;;N;;;;; +1F21D;SQUARED CJK UNIFIED IDEOGRAPH-5F8C;So;0;L;<square> 5F8C;;;;N;;;;; +1F21E;SQUARED CJK UNIFIED IDEOGRAPH-518D;So;0;L;<square> 518D;;;;N;;;;; +1F21F;SQUARED CJK UNIFIED IDEOGRAPH-65B0;So;0;L;<square> 65B0;;;;N;;;;; +1F220;SQUARED CJK UNIFIED IDEOGRAPH-521D;So;0;L;<square> 521D;;;;N;;;;; +1F221;SQUARED CJK UNIFIED IDEOGRAPH-7D42;So;0;L;<square> 7D42;;;;N;;;;; +1F222;SQUARED CJK UNIFIED IDEOGRAPH-751F;So;0;L;<square> 751F;;;;N;;;;; +1F223;SQUARED CJK UNIFIED IDEOGRAPH-8CA9;So;0;L;<square> 8CA9;;;;N;;;;; +1F224;SQUARED CJK UNIFIED IDEOGRAPH-58F0;So;0;L;<square> 58F0;;;;N;;;;; +1F225;SQUARED CJK UNIFIED IDEOGRAPH-5439;So;0;L;<square> 5439;;;;N;;;;; +1F226;SQUARED CJK UNIFIED IDEOGRAPH-6F14;So;0;L;<square> 6F14;;;;N;;;;; +1F227;SQUARED CJK UNIFIED IDEOGRAPH-6295;So;0;L;<square> 6295;;;;N;;;;; +1F228;SQUARED CJK UNIFIED IDEOGRAPH-6355;So;0;L;<square> 6355;;;;N;;;;; +1F229;SQUARED CJK UNIFIED IDEOGRAPH-4E00;So;0;L;<square> 4E00;;;;N;;;;; +1F22A;SQUARED CJK UNIFIED IDEOGRAPH-4E09;So;0;L;<square> 4E09;;;;N;;;;; +1F22B;SQUARED CJK UNIFIED IDEOGRAPH-904A;So;0;L;<square> 904A;;;;N;;;;; +1F22C;SQUARED CJK UNIFIED IDEOGRAPH-5DE6;So;0;L;<square> 5DE6;;;;N;;;;; +1F22D;SQUARED CJK UNIFIED IDEOGRAPH-4E2D;So;0;L;<square> 4E2D;;;;N;;;;; +1F22E;SQUARED CJK UNIFIED IDEOGRAPH-53F3;So;0;L;<square> 53F3;;;;N;;;;; +1F22F;SQUARED CJK UNIFIED IDEOGRAPH-6307;So;0;L;<square> 6307;;;;N;;;;; +1F230;SQUARED CJK UNIFIED IDEOGRAPH-8D70;So;0;L;<square> 8D70;;;;N;;;;; +1F231;SQUARED CJK UNIFIED IDEOGRAPH-6253;So;0;L;<square> 6253;;;;N;;;;; +1F232;SQUARED CJK UNIFIED IDEOGRAPH-7981;So;0;L;<square> 7981;;;;N;;;;; +1F233;SQUARED CJK UNIFIED IDEOGRAPH-7A7A;So;0;L;<square> 7A7A;;;;N;;;;; +1F234;SQUARED CJK UNIFIED IDEOGRAPH-5408;So;0;L;<square> 5408;;;;N;;;;; +1F235;SQUARED CJK UNIFIED IDEOGRAPH-6E80;So;0;L;<square> 6E80;;;;N;;;;; +1F236;SQUARED CJK UNIFIED IDEOGRAPH-6709;So;0;L;<square> 6709;;;;N;;;;; +1F237;SQUARED CJK UNIFIED IDEOGRAPH-6708;So;0;L;<square> 6708;;;;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;;;;; +1F243;TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-5B89;So;0;L;<compat> 3014 5B89 3015;;;;N;;;;; +1F244;TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-70B9;So;0;L;<compat> 3014 70B9 3015;;;;N;;;;; +1F245;TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-6253;So;0;L;<compat> 3014 6253 3015;;;;N;;;;; +1F246;TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-76D7;So;0;L;<compat> 3014 76D7 3015;;;;N;;;;; +1F247;TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-52DD;So;0;L;<compat> 3014 52DD 3015;;;;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;;;;; +1F303;NIGHT WITH STARS;So;0;ON;;;;;N;;;;; +1F304;SUNRISE OVER MOUNTAINS;So;0;ON;;;;;N;;;;; +1F305;SUNRISE;So;0;ON;;;;;N;;;;; +1F306;CITYSCAPE AT DUSK;So;0;ON;;;;;N;;;;; +1F307;SUNSET OVER BUILDINGS;So;0;ON;;;;;N;;;;; +1F308;RAINBOW;So;0;ON;;;;;N;;;;; +1F309;BRIDGE AT NIGHT;So;0;ON;;;;;N;;;;; +1F30A;WATER WAVE;So;0;ON;;;;;N;;;;; +1F30B;VOLCANO;So;0;ON;;;;;N;;;;; +1F30C;MILKY WAY;So;0;ON;;;;;N;;;;; +1F30D;EARTH GLOBE EUROPE-AFRICA;So;0;ON;;;;;N;;;;; +1F30E;EARTH GLOBE AMERICAS;So;0;ON;;;;;N;;;;; +1F30F;EARTH GLOBE ASIA-AUSTRALIA;So;0;ON;;;;;N;;;;; +1F310;GLOBE WITH MERIDIANS;So;0;ON;;;;;N;;;;; +1F311;NEW MOON SYMBOL;So;0;ON;;;;;N;;;;; +1F312;WAXING CRESCENT MOON SYMBOL;So;0;ON;;;;;N;;;;; +1F313;FIRST QUARTER MOON SYMBOL;So;0;ON;;;;;N;;;;; +1F314;WAXING GIBBOUS MOON SYMBOL;So;0;ON;;;;;N;;;;; +1F315;FULL MOON SYMBOL;So;0;ON;;;;;N;;;;; +1F316;WANING GIBBOUS MOON SYMBOL;So;0;ON;;;;;N;;;;; +1F317;LAST QUARTER MOON SYMBOL;So;0;ON;;;;;N;;;;; +1F318;WANING CRESCENT MOON SYMBOL;So;0;ON;;;;;N;;;;; +1F319;CRESCENT MOON;So;0;ON;;;;;N;;;;; +1F31A;NEW MOON WITH FACE;So;0;ON;;;;;N;;;;; +1F31B;FIRST QUARTER MOON WITH FACE;So;0;ON;;;;;N;;;;; +1F31C;LAST QUARTER MOON WITH FACE;So;0;ON;;;;;N;;;;; +1F31D;FULL MOON WITH FACE;So;0;ON;;;;;N;;;;; +1F31E;SUN WITH FACE;So;0;ON;;;;;N;;;;; +1F31F;GLOWING STAR;So;0;ON;;;;;N;;;;; +1F320;SHOOTING STAR;So;0;ON;;;;;N;;;;; +1F321;THERMOMETER;So;0;ON;;;;;N;;;;; +1F322;BLACK DROPLET;So;0;ON;;;;;N;;;;; +1F323;WHITE SUN;So;0;ON;;;;;N;;;;; +1F324;WHITE SUN WITH SMALL CLOUD;So;0;ON;;;;;N;;;;; +1F325;WHITE SUN BEHIND CLOUD;So;0;ON;;;;;N;;;;; +1F326;WHITE SUN BEHIND CLOUD WITH RAIN;So;0;ON;;;;;N;;;;; +1F327;CLOUD WITH RAIN;So;0;ON;;;;;N;;;;; +1F328;CLOUD WITH SNOW;So;0;ON;;;;;N;;;;; +1F329;CLOUD WITH LIGHTNING;So;0;ON;;;;;N;;;;; +1F32A;CLOUD WITH TORNADO;So;0;ON;;;;;N;;;;; +1F32B;FOG;So;0;ON;;;;;N;;;;; +1F32C;WIND BLOWING FACE;So;0;ON;;;;;N;;;;; +1F32D;HOT DOG;So;0;ON;;;;;N;;;;; +1F32E;TACO;So;0;ON;;;;;N;;;;; +1F32F;BURRITO;So;0;ON;;;;;N;;;;; +1F330;CHESTNUT;So;0;ON;;;;;N;;;;; +1F331;SEEDLING;So;0;ON;;;;;N;;;;; +1F332;EVERGREEN TREE;So;0;ON;;;;;N;;;;; +1F333;DECIDUOUS TREE;So;0;ON;;;;;N;;;;; +1F334;PALM TREE;So;0;ON;;;;;N;;;;; +1F335;CACTUS;So;0;ON;;;;;N;;;;; +1F336;HOT PEPPER;So;0;ON;;;;;N;;;;; +1F337;TULIP;So;0;ON;;;;;N;;;;; +1F338;CHERRY BLOSSOM;So;0;ON;;;;;N;;;;; +1F339;ROSE;So;0;ON;;;;;N;;;;; +1F33A;HIBISCUS;So;0;ON;;;;;N;;;;; +1F33B;SUNFLOWER;So;0;ON;;;;;N;;;;; +1F33C;BLOSSOM;So;0;ON;;;;;N;;;;; +1F33D;EAR OF MAIZE;So;0;ON;;;;;N;;;;; +1F33E;EAR OF RICE;So;0;ON;;;;;N;;;;; +1F33F;HERB;So;0;ON;;;;;N;;;;; +1F340;FOUR LEAF CLOVER;So;0;ON;;;;;N;;;;; +1F341;MAPLE LEAF;So;0;ON;;;;;N;;;;; +1F342;FALLEN LEAF;So;0;ON;;;;;N;;;;; +1F343;LEAF FLUTTERING IN WIND;So;0;ON;;;;;N;;;;; +1F344;MUSHROOM;So;0;ON;;;;;N;;;;; +1F345;TOMATO;So;0;ON;;;;;N;;;;; +1F346;AUBERGINE;So;0;ON;;;;;N;;;;; +1F347;GRAPES;So;0;ON;;;;;N;;;;; +1F348;MELON;So;0;ON;;;;;N;;;;; +1F349;WATERMELON;So;0;ON;;;;;N;;;;; +1F34A;TANGERINE;So;0;ON;;;;;N;;;;; +1F34B;LEMON;So;0;ON;;;;;N;;;;; +1F34C;BANANA;So;0;ON;;;;;N;;;;; +1F34D;PINEAPPLE;So;0;ON;;;;;N;;;;; +1F34E;RED APPLE;So;0;ON;;;;;N;;;;; +1F34F;GREEN APPLE;So;0;ON;;;;;N;;;;; +1F350;PEAR;So;0;ON;;;;;N;;;;; +1F351;PEACH;So;0;ON;;;;;N;;;;; +1F352;CHERRIES;So;0;ON;;;;;N;;;;; +1F353;STRAWBERRY;So;0;ON;;;;;N;;;;; +1F354;HAMBURGER;So;0;ON;;;;;N;;;;; +1F355;SLICE OF PIZZA;So;0;ON;;;;;N;;;;; +1F356;MEAT ON BONE;So;0;ON;;;;;N;;;;; +1F357;POULTRY LEG;So;0;ON;;;;;N;;;;; +1F358;RICE CRACKER;So;0;ON;;;;;N;;;;; +1F359;RICE BALL;So;0;ON;;;;;N;;;;; +1F35A;COOKED RICE;So;0;ON;;;;;N;;;;; +1F35B;CURRY AND RICE;So;0;ON;;;;;N;;;;; +1F35C;STEAMING BOWL;So;0;ON;;;;;N;;;;; +1F35D;SPAGHETTI;So;0;ON;;;;;N;;;;; +1F35E;BREAD;So;0;ON;;;;;N;;;;; +1F35F;FRENCH FRIES;So;0;ON;;;;;N;;;;; +1F360;ROASTED SWEET POTATO;So;0;ON;;;;;N;;;;; +1F361;DANGO;So;0;ON;;;;;N;;;;; +1F362;ODEN;So;0;ON;;;;;N;;;;; +1F363;SUSHI;So;0;ON;;;;;N;;;;; +1F364;FRIED SHRIMP;So;0;ON;;;;;N;;;;; +1F365;FISH CAKE WITH SWIRL DESIGN;So;0;ON;;;;;N;;;;; +1F366;SOFT ICE CREAM;So;0;ON;;;;;N;;;;; +1F367;SHAVED ICE;So;0;ON;;;;;N;;;;; +1F368;ICE CREAM;So;0;ON;;;;;N;;;;; +1F369;DOUGHNUT;So;0;ON;;;;;N;;;;; +1F36A;COOKIE;So;0;ON;;;;;N;;;;; +1F36B;CHOCOLATE BAR;So;0;ON;;;;;N;;;;; +1F36C;CANDY;So;0;ON;;;;;N;;;;; +1F36D;LOLLIPOP;So;0;ON;;;;;N;;;;; +1F36E;CUSTARD;So;0;ON;;;;;N;;;;; +1F36F;HONEY POT;So;0;ON;;;;;N;;;;; +1F370;SHORTCAKE;So;0;ON;;;;;N;;;;; +1F371;BENTO BOX;So;0;ON;;;;;N;;;;; +1F372;POT OF FOOD;So;0;ON;;;;;N;;;;; +1F373;COOKING;So;0;ON;;;;;N;;;;; +1F374;FORK AND KNIFE;So;0;ON;;;;;N;;;;; +1F375;TEACUP WITHOUT HANDLE;So;0;ON;;;;;N;;;;; +1F376;SAKE BOTTLE AND CUP;So;0;ON;;;;;N;;;;; +1F377;WINE GLASS;So;0;ON;;;;;N;;;;; +1F378;COCKTAIL GLASS;So;0;ON;;;;;N;;;;; +1F379;TROPICAL DRINK;So;0;ON;;;;;N;;;;; +1F37A;BEER MUG;So;0;ON;;;;;N;;;;; +1F37B;CLINKING BEER MUGS;So;0;ON;;;;;N;;;;; +1F37C;BABY BOTTLE;So;0;ON;;;;;N;;;;; +1F37D;FORK AND KNIFE WITH PLATE;So;0;ON;;;;;N;;;;; +1F37E;BOTTLE WITH POPPING CORK;So;0;ON;;;;;N;;;;; +1F37F;POPCORN;So;0;ON;;;;;N;;;;; +1F380;RIBBON;So;0;ON;;;;;N;;;;; +1F381;WRAPPED PRESENT;So;0;ON;;;;;N;;;;; +1F382;BIRTHDAY CAKE;So;0;ON;;;;;N;;;;; +1F383;JACK-O-LANTERN;So;0;ON;;;;;N;;;;; +1F384;CHRISTMAS TREE;So;0;ON;;;;;N;;;;; +1F385;FATHER CHRISTMAS;So;0;ON;;;;;N;;;;; +1F386;FIREWORKS;So;0;ON;;;;;N;;;;; +1F387;FIREWORK SPARKLER;So;0;ON;;;;;N;;;;; +1F388;BALLOON;So;0;ON;;;;;N;;;;; +1F389;PARTY POPPER;So;0;ON;;;;;N;;;;; +1F38A;CONFETTI BALL;So;0;ON;;;;;N;;;;; +1F38B;TANABATA TREE;So;0;ON;;;;;N;;;;; +1F38C;CROSSED FLAGS;So;0;ON;;;;;N;;;;; +1F38D;PINE DECORATION;So;0;ON;;;;;N;;;;; +1F38E;JAPANESE DOLLS;So;0;ON;;;;;N;;;;; +1F38F;CARP STREAMER;So;0;ON;;;;;N;;;;; +1F390;WIND CHIME;So;0;ON;;;;;N;;;;; +1F391;MOON VIEWING CEREMONY;So;0;ON;;;;;N;;;;; +1F392;SCHOOL SATCHEL;So;0;ON;;;;;N;;;;; +1F393;GRADUATION CAP;So;0;ON;;;;;N;;;;; +1F394;HEART WITH TIP ON THE LEFT;So;0;ON;;;;;N;;;;; +1F395;BOUQUET OF FLOWERS;So;0;ON;;;;;N;;;;; +1F396;MILITARY MEDAL;So;0;ON;;;;;N;;;;; +1F397;REMINDER RIBBON;So;0;ON;;;;;N;;;;; +1F398;MUSICAL KEYBOARD WITH JACKS;So;0;ON;;;;;N;;;;; +1F399;STUDIO MICROPHONE;So;0;ON;;;;;N;;;;; +1F39A;LEVEL SLIDER;So;0;ON;;;;;N;;;;; +1F39B;CONTROL KNOBS;So;0;ON;;;;;N;;;;; +1F39C;BEAMED ASCENDING MUSICAL NOTES;So;0;ON;;;;;N;;;;; +1F39D;BEAMED DESCENDING MUSICAL NOTES;So;0;ON;;;;;N;;;;; +1F39E;FILM FRAMES;So;0;ON;;;;;N;;;;; +1F39F;ADMISSION TICKETS;So;0;ON;;;;;N;;;;; +1F3A0;CAROUSEL HORSE;So;0;ON;;;;;N;;;;; +1F3A1;FERRIS WHEEL;So;0;ON;;;;;N;;;;; +1F3A2;ROLLER COASTER;So;0;ON;;;;;N;;;;; +1F3A3;FISHING POLE AND FISH;So;0;ON;;;;;N;;;;; +1F3A4;MICROPHONE;So;0;ON;;;;;N;;;;; +1F3A5;MOVIE CAMERA;So;0;ON;;;;;N;;;;; +1F3A6;CINEMA;So;0;ON;;;;;N;;;;; +1F3A7;HEADPHONE;So;0;ON;;;;;N;;;;; +1F3A8;ARTIST PALETTE;So;0;ON;;;;;N;;;;; +1F3A9;TOP HAT;So;0;ON;;;;;N;;;;; +1F3AA;CIRCUS TENT;So;0;ON;;;;;N;;;;; +1F3AB;TICKET;So;0;ON;;;;;N;;;;; +1F3AC;CLAPPER BOARD;So;0;ON;;;;;N;;;;; +1F3AD;PERFORMING ARTS;So;0;ON;;;;;N;;;;; +1F3AE;VIDEO GAME;So;0;ON;;;;;N;;;;; +1F3AF;DIRECT HIT;So;0;ON;;;;;N;;;;; +1F3B0;SLOT MACHINE;So;0;ON;;;;;N;;;;; +1F3B1;BILLIARDS;So;0;ON;;;;;N;;;;; +1F3B2;GAME DIE;So;0;ON;;;;;N;;;;; +1F3B3;BOWLING;So;0;ON;;;;;N;;;;; +1F3B4;FLOWER PLAYING CARDS;So;0;ON;;;;;N;;;;; +1F3B5;MUSICAL NOTE;So;0;ON;;;;;N;;;;; +1F3B6;MULTIPLE MUSICAL NOTES;So;0;ON;;;;;N;;;;; +1F3B7;SAXOPHONE;So;0;ON;;;;;N;;;;; +1F3B8;GUITAR;So;0;ON;;;;;N;;;;; +1F3B9;MUSICAL KEYBOARD;So;0;ON;;;;;N;;;;; +1F3BA;TRUMPET;So;0;ON;;;;;N;;;;; +1F3BB;VIOLIN;So;0;ON;;;;;N;;;;; +1F3BC;MUSICAL SCORE;So;0;ON;;;;;N;;;;; +1F3BD;RUNNING SHIRT WITH SASH;So;0;ON;;;;;N;;;;; +1F3BE;TENNIS RACQUET AND BALL;So;0;ON;;;;;N;;;;; +1F3BF;SKI AND SKI BOOT;So;0;ON;;;;;N;;;;; +1F3C0;BASKETBALL AND HOOP;So;0;ON;;;;;N;;;;; +1F3C1;CHEQUERED FLAG;So;0;ON;;;;;N;;;;; +1F3C2;SNOWBOARDER;So;0;ON;;;;;N;;;;; +1F3C3;RUNNER;So;0;ON;;;;;N;;;;; +1F3C4;SURFER;So;0;ON;;;;;N;;;;; +1F3C5;SPORTS MEDAL;So;0;ON;;;;;N;;;;; +1F3C6;TROPHY;So;0;ON;;;;;N;;;;; +1F3C7;HORSE RACING;So;0;ON;;;;;N;;;;; +1F3C8;AMERICAN FOOTBALL;So;0;ON;;;;;N;;;;; +1F3C9;RUGBY FOOTBALL;So;0;ON;;;;;N;;;;; +1F3CA;SWIMMER;So;0;ON;;;;;N;;;;; +1F3CB;WEIGHT LIFTER;So;0;ON;;;;;N;;;;; +1F3CC;GOLFER;So;0;ON;;;;;N;;;;; +1F3CD;RACING MOTORCYCLE;So;0;ON;;;;;N;;;;; +1F3CE;RACING CAR;So;0;ON;;;;;N;;;;; +1F3CF;CRICKET BAT AND BALL;So;0;ON;;;;;N;;;;; +1F3D0;VOLLEYBALL;So;0;ON;;;;;N;;;;; +1F3D1;FIELD HOCKEY STICK AND BALL;So;0;ON;;;;;N;;;;; +1F3D2;ICE HOCKEY STICK AND PUCK;So;0;ON;;;;;N;;;;; +1F3D3;TABLE TENNIS PADDLE AND BALL;So;0;ON;;;;;N;;;;; +1F3D4;SNOW CAPPED MOUNTAIN;So;0;ON;;;;;N;;;;; +1F3D5;CAMPING;So;0;ON;;;;;N;;;;; +1F3D6;BEACH WITH UMBRELLA;So;0;ON;;;;;N;;;;; +1F3D7;BUILDING CONSTRUCTION;So;0;ON;;;;;N;;;;; +1F3D8;HOUSE BUILDINGS;So;0;ON;;;;;N;;;;; +1F3D9;CITYSCAPE;So;0;ON;;;;;N;;;;; +1F3DA;DERELICT HOUSE BUILDING;So;0;ON;;;;;N;;;;; +1F3DB;CLASSICAL BUILDING;So;0;ON;;;;;N;;;;; +1F3DC;DESERT;So;0;ON;;;;;N;;;;; +1F3DD;DESERT ISLAND;So;0;ON;;;;;N;;;;; +1F3DE;NATIONAL PARK;So;0;ON;;;;;N;;;;; +1F3DF;STADIUM;So;0;ON;;;;;N;;;;; +1F3E0;HOUSE BUILDING;So;0;ON;;;;;N;;;;; +1F3E1;HOUSE WITH GARDEN;So;0;ON;;;;;N;;;;; +1F3E2;OFFICE BUILDING;So;0;ON;;;;;N;;;;; +1F3E3;JAPANESE POST OFFICE;So;0;ON;;;;;N;;;;; +1F3E4;EUROPEAN POST OFFICE;So;0;ON;;;;;N;;;;; +1F3E5;HOSPITAL;So;0;ON;;;;;N;;;;; +1F3E6;BANK;So;0;ON;;;;;N;;;;; +1F3E7;AUTOMATED TELLER MACHINE;So;0;ON;;;;;N;;;;; +1F3E8;HOTEL;So;0;ON;;;;;N;;;;; +1F3E9;LOVE HOTEL;So;0;ON;;;;;N;;;;; +1F3EA;CONVENIENCE STORE;So;0;ON;;;;;N;;;;; +1F3EB;SCHOOL;So;0;ON;;;;;N;;;;; +1F3EC;DEPARTMENT STORE;So;0;ON;;;;;N;;;;; +1F3ED;FACTORY;So;0;ON;;;;;N;;;;; +1F3EE;IZAKAYA LANTERN;So;0;ON;;;;;N;;;;; +1F3EF;JAPANESE CASTLE;So;0;ON;;;;;N;;;;; +1F3F0;EUROPEAN CASTLE;So;0;ON;;;;;N;;;;; +1F3F1;WHITE PENNANT;So;0;ON;;;;;N;;;;; +1F3F2;BLACK PENNANT;So;0;ON;;;;;N;;;;; +1F3F3;WAVING WHITE FLAG;So;0;ON;;;;;N;;;;; +1F3F4;WAVING BLACK FLAG;So;0;ON;;;;;N;;;;; +1F3F5;ROSETTE;So;0;ON;;;;;N;;;;; +1F3F6;BLACK ROSETTE;So;0;ON;;;;;N;;;;; +1F3F7;LABEL;So;0;ON;;;;;N;;;;; +1F3F8;BADMINTON RACQUET AND SHUTTLECOCK;So;0;ON;;;;;N;;;;; +1F3F9;BOW AND ARROW;So;0;ON;;;;;N;;;;; +1F3FA;AMPHORA;So;0;ON;;;;;N;;;;; +1F3FB;EMOJI MODIFIER FITZPATRICK TYPE-1-2;Sk;0;ON;;;;;N;;;;; +1F3FC;EMOJI MODIFIER FITZPATRICK TYPE-3;Sk;0;ON;;;;;N;;;;; +1F3FD;EMOJI MODIFIER FITZPATRICK TYPE-4;Sk;0;ON;;;;;N;;;;; +1F3FE;EMOJI MODIFIER FITZPATRICK TYPE-5;Sk;0;ON;;;;;N;;;;; +1F3FF;EMOJI MODIFIER FITZPATRICK TYPE-6;Sk;0;ON;;;;;N;;;;; +1F400;RAT;So;0;ON;;;;;N;;;;; +1F401;MOUSE;So;0;ON;;;;;N;;;;; +1F402;OX;So;0;ON;;;;;N;;;;; +1F403;WATER BUFFALO;So;0;ON;;;;;N;;;;; +1F404;COW;So;0;ON;;;;;N;;;;; +1F405;TIGER;So;0;ON;;;;;N;;;;; +1F406;LEOPARD;So;0;ON;;;;;N;;;;; +1F407;RABBIT;So;0;ON;;;;;N;;;;; +1F408;CAT;So;0;ON;;;;;N;;;;; +1F409;DRAGON;So;0;ON;;;;;N;;;;; +1F40A;CROCODILE;So;0;ON;;;;;N;;;;; +1F40B;WHALE;So;0;ON;;;;;N;;;;; +1F40C;SNAIL;So;0;ON;;;;;N;;;;; +1F40D;SNAKE;So;0;ON;;;;;N;;;;; +1F40E;HORSE;So;0;ON;;;;;N;;;;; +1F40F;RAM;So;0;ON;;;;;N;;;;; +1F410;GOAT;So;0;ON;;;;;N;;;;; +1F411;SHEEP;So;0;ON;;;;;N;;;;; +1F412;MONKEY;So;0;ON;;;;;N;;;;; +1F413;ROOSTER;So;0;ON;;;;;N;;;;; +1F414;CHICKEN;So;0;ON;;;;;N;;;;; +1F415;DOG;So;0;ON;;;;;N;;;;; +1F416;PIG;So;0;ON;;;;;N;;;;; +1F417;BOAR;So;0;ON;;;;;N;;;;; +1F418;ELEPHANT;So;0;ON;;;;;N;;;;; +1F419;OCTOPUS;So;0;ON;;;;;N;;;;; +1F41A;SPIRAL SHELL;So;0;ON;;;;;N;;;;; +1F41B;BUG;So;0;ON;;;;;N;;;;; +1F41C;ANT;So;0;ON;;;;;N;;;;; +1F41D;HONEYBEE;So;0;ON;;;;;N;;;;; +1F41E;LADY BEETLE;So;0;ON;;;;;N;;;;; +1F41F;FISH;So;0;ON;;;;;N;;;;; +1F420;TROPICAL FISH;So;0;ON;;;;;N;;;;; +1F421;BLOWFISH;So;0;ON;;;;;N;;;;; +1F422;TURTLE;So;0;ON;;;;;N;;;;; +1F423;HATCHING CHICK;So;0;ON;;;;;N;;;;; +1F424;BABY CHICK;So;0;ON;;;;;N;;;;; +1F425;FRONT-FACING BABY CHICK;So;0;ON;;;;;N;;;;; +1F426;BIRD;So;0;ON;;;;;N;;;;; +1F427;PENGUIN;So;0;ON;;;;;N;;;;; +1F428;KOALA;So;0;ON;;;;;N;;;;; +1F429;POODLE;So;0;ON;;;;;N;;;;; +1F42A;DROMEDARY CAMEL;So;0;ON;;;;;N;;;;; +1F42B;BACTRIAN CAMEL;So;0;ON;;;;;N;;;;; +1F42C;DOLPHIN;So;0;ON;;;;;N;;;;; +1F42D;MOUSE FACE;So;0;ON;;;;;N;;;;; +1F42E;COW FACE;So;0;ON;;;;;N;;;;; +1F42F;TIGER FACE;So;0;ON;;;;;N;;;;; +1F430;RABBIT FACE;So;0;ON;;;;;N;;;;; +1F431;CAT FACE;So;0;ON;;;;;N;;;;; +1F432;DRAGON FACE;So;0;ON;;;;;N;;;;; +1F433;SPOUTING WHALE;So;0;ON;;;;;N;;;;; +1F434;HORSE FACE;So;0;ON;;;;;N;;;;; +1F435;MONKEY FACE;So;0;ON;;;;;N;;;;; +1F436;DOG FACE;So;0;ON;;;;;N;;;;; +1F437;PIG FACE;So;0;ON;;;;;N;;;;; +1F438;FROG FACE;So;0;ON;;;;;N;;;;; +1F439;HAMSTER FACE;So;0;ON;;;;;N;;;;; +1F43A;WOLF FACE;So;0;ON;;;;;N;;;;; +1F43B;BEAR FACE;So;0;ON;;;;;N;;;;; +1F43C;PANDA FACE;So;0;ON;;;;;N;;;;; +1F43D;PIG NOSE;So;0;ON;;;;;N;;;;; +1F43E;PAW PRINTS;So;0;ON;;;;;N;;;;; +1F43F;CHIPMUNK;So;0;ON;;;;;N;;;;; +1F440;EYES;So;0;ON;;;;;N;;;;; +1F441;EYE;So;0;ON;;;;;N;;;;; +1F442;EAR;So;0;ON;;;;;N;;;;; +1F443;NOSE;So;0;ON;;;;;N;;;;; +1F444;MOUTH;So;0;ON;;;;;N;;;;; +1F445;TONGUE;So;0;ON;;;;;N;;;;; +1F446;WHITE UP POINTING BACKHAND INDEX;So;0;ON;;;;;N;;;;; +1F447;WHITE DOWN POINTING BACKHAND INDEX;So;0;ON;;;;;N;;;;; +1F448;WHITE LEFT POINTING BACKHAND INDEX;So;0;ON;;;;;N;;;;; +1F449;WHITE RIGHT POINTING BACKHAND INDEX;So;0;ON;;;;;N;;;;; +1F44A;FISTED HAND SIGN;So;0;ON;;;;;N;;;;; +1F44B;WAVING HAND SIGN;So;0;ON;;;;;N;;;;; +1F44C;OK HAND SIGN;So;0;ON;;;;;N;;;;; +1F44D;THUMBS UP SIGN;So;0;ON;;;;;N;;;;; +1F44E;THUMBS DOWN SIGN;So;0;ON;;;;;N;;;;; +1F44F;CLAPPING HANDS SIGN;So;0;ON;;;;;N;;;;; +1F450;OPEN HANDS SIGN;So;0;ON;;;;;N;;;;; +1F451;CROWN;So;0;ON;;;;;N;;;;; +1F452;WOMANS HAT;So;0;ON;;;;;N;;;;; +1F453;EYEGLASSES;So;0;ON;;;;;N;;;;; +1F454;NECKTIE;So;0;ON;;;;;N;;;;; +1F455;T-SHIRT;So;0;ON;;;;;N;;;;; +1F456;JEANS;So;0;ON;;;;;N;;;;; +1F457;DRESS;So;0;ON;;;;;N;;;;; +1F458;KIMONO;So;0;ON;;;;;N;;;;; +1F459;BIKINI;So;0;ON;;;;;N;;;;; +1F45A;WOMANS CLOTHES;So;0;ON;;;;;N;;;;; +1F45B;PURSE;So;0;ON;;;;;N;;;;; +1F45C;HANDBAG;So;0;ON;;;;;N;;;;; +1F45D;POUCH;So;0;ON;;;;;N;;;;; +1F45E;MANS SHOE;So;0;ON;;;;;N;;;;; +1F45F;ATHLETIC SHOE;So;0;ON;;;;;N;;;;; +1F460;HIGH-HEELED SHOE;So;0;ON;;;;;N;;;;; +1F461;WOMANS SANDAL;So;0;ON;;;;;N;;;;; +1F462;WOMANS BOOTS;So;0;ON;;;;;N;;;;; +1F463;FOOTPRINTS;So;0;ON;;;;;N;;;;; +1F464;BUST IN SILHOUETTE;So;0;ON;;;;;N;;;;; +1F465;BUSTS IN SILHOUETTE;So;0;ON;;;;;N;;;;; +1F466;BOY;So;0;ON;;;;;N;;;;; +1F467;GIRL;So;0;ON;;;;;N;;;;; +1F468;MAN;So;0;ON;;;;;N;;;;; +1F469;WOMAN;So;0;ON;;;;;N;;;;; +1F46A;FAMILY;So;0;ON;;;;;N;;;;; +1F46B;MAN AND WOMAN HOLDING HANDS;So;0;ON;;;;;N;;;;; +1F46C;TWO MEN HOLDING HANDS;So;0;ON;;;;;N;;;;; +1F46D;TWO WOMEN HOLDING HANDS;So;0;ON;;;;;N;;;;; +1F46E;POLICE OFFICER;So;0;ON;;;;;N;;;;; +1F46F;WOMAN WITH BUNNY EARS;So;0;ON;;;;;N;;;;; +1F470;BRIDE WITH VEIL;So;0;ON;;;;;N;;;;; +1F471;PERSON WITH BLOND HAIR;So;0;ON;;;;;N;;;;; +1F472;MAN WITH GUA PI MAO;So;0;ON;;;;;N;;;;; +1F473;MAN WITH TURBAN;So;0;ON;;;;;N;;;;; +1F474;OLDER MAN;So;0;ON;;;;;N;;;;; +1F475;OLDER WOMAN;So;0;ON;;;;;N;;;;; +1F476;BABY;So;0;ON;;;;;N;;;;; +1F477;CONSTRUCTION WORKER;So;0;ON;;;;;N;;;;; +1F478;PRINCESS;So;0;ON;;;;;N;;;;; +1F479;JAPANESE OGRE;So;0;ON;;;;;N;;;;; +1F47A;JAPANESE GOBLIN;So;0;ON;;;;;N;;;;; +1F47B;GHOST;So;0;ON;;;;;N;;;;; +1F47C;BABY ANGEL;So;0;ON;;;;;N;;;;; +1F47D;EXTRATERRESTRIAL ALIEN;So;0;ON;;;;;N;;;;; +1F47E;ALIEN MONSTER;So;0;ON;;;;;N;;;;; +1F47F;IMP;So;0;ON;;;;;N;;;;; +1F480;SKULL;So;0;ON;;;;;N;;;;; +1F481;INFORMATION DESK PERSON;So;0;ON;;;;;N;;;;; +1F482;GUARDSMAN;So;0;ON;;;;;N;;;;; +1F483;DANCER;So;0;ON;;;;;N;;;;; +1F484;LIPSTICK;So;0;ON;;;;;N;;;;; +1F485;NAIL POLISH;So;0;ON;;;;;N;;;;; +1F486;FACE MASSAGE;So;0;ON;;;;;N;;;;; +1F487;HAIRCUT;So;0;ON;;;;;N;;;;; +1F488;BARBER POLE;So;0;ON;;;;;N;;;;; +1F489;SYRINGE;So;0;ON;;;;;N;;;;; +1F48A;PILL;So;0;ON;;;;;N;;;;; +1F48B;KISS MARK;So;0;ON;;;;;N;;;;; +1F48C;LOVE LETTER;So;0;ON;;;;;N;;;;; +1F48D;RING;So;0;ON;;;;;N;;;;; +1F48E;GEM STONE;So;0;ON;;;;;N;;;;; +1F48F;KISS;So;0;ON;;;;;N;;;;; +1F490;BOUQUET;So;0;ON;;;;;N;;;;; +1F491;COUPLE WITH HEART;So;0;ON;;;;;N;;;;; +1F492;WEDDING;So;0;ON;;;;;N;;;;; +1F493;BEATING HEART;So;0;ON;;;;;N;;;;; +1F494;BROKEN HEART;So;0;ON;;;;;N;;;;; +1F495;TWO HEARTS;So;0;ON;;;;;N;;;;; +1F496;SPARKLING HEART;So;0;ON;;;;;N;;;;; +1F497;GROWING HEART;So;0;ON;;;;;N;;;;; +1F498;HEART WITH ARROW;So;0;ON;;;;;N;;;;; +1F499;BLUE HEART;So;0;ON;;;;;N;;;;; +1F49A;GREEN HEART;So;0;ON;;;;;N;;;;; +1F49B;YELLOW HEART;So;0;ON;;;;;N;;;;; +1F49C;PURPLE HEART;So;0;ON;;;;;N;;;;; +1F49D;HEART WITH RIBBON;So;0;ON;;;;;N;;;;; +1F49E;REVOLVING HEARTS;So;0;ON;;;;;N;;;;; +1F49F;HEART DECORATION;So;0;ON;;;;;N;;;;; +1F4A0;DIAMOND SHAPE WITH A DOT INSIDE;So;0;ON;;;;;N;;;;; +1F4A1;ELECTRIC LIGHT BULB;So;0;ON;;;;;N;;;;; +1F4A2;ANGER SYMBOL;So;0;ON;;;;;N;;;;; +1F4A3;BOMB;So;0;ON;;;;;N;;;;; +1F4A4;SLEEPING SYMBOL;So;0;ON;;;;;N;;;;; +1F4A5;COLLISION SYMBOL;So;0;ON;;;;;N;;;;; +1F4A6;SPLASHING SWEAT SYMBOL;So;0;ON;;;;;N;;;;; +1F4A7;DROPLET;So;0;ON;;;;;N;;;;; +1F4A8;DASH SYMBOL;So;0;ON;;;;;N;;;;; +1F4A9;PILE OF POO;So;0;ON;;;;;N;;;;; +1F4AA;FLEXED BICEPS;So;0;ON;;;;;N;;;;; +1F4AB;DIZZY SYMBOL;So;0;ON;;;;;N;;;;; +1F4AC;SPEECH BALLOON;So;0;ON;;;;;N;;;;; +1F4AD;THOUGHT BALLOON;So;0;ON;;;;;N;;;;; +1F4AE;WHITE FLOWER;So;0;ON;;;;;N;;;;; +1F4AF;HUNDRED POINTS SYMBOL;So;0;ON;;;;;N;;;;; +1F4B0;MONEY BAG;So;0;ON;;;;;N;;;;; +1F4B1;CURRENCY EXCHANGE;So;0;ON;;;;;N;;;;; +1F4B2;HEAVY DOLLAR SIGN;So;0;ON;;;;;N;;;;; +1F4B3;CREDIT CARD;So;0;ON;;;;;N;;;;; +1F4B4;BANKNOTE WITH YEN SIGN;So;0;ON;;;;;N;;;;; +1F4B5;BANKNOTE WITH DOLLAR SIGN;So;0;ON;;;;;N;;;;; +1F4B6;BANKNOTE WITH EURO SIGN;So;0;ON;;;;;N;;;;; +1F4B7;BANKNOTE WITH POUND SIGN;So;0;ON;;;;;N;;;;; +1F4B8;MONEY WITH WINGS;So;0;ON;;;;;N;;;;; +1F4B9;CHART WITH UPWARDS TREND AND YEN SIGN;So;0;ON;;;;;N;;;;; +1F4BA;SEAT;So;0;ON;;;;;N;;;;; +1F4BB;PERSONAL COMPUTER;So;0;ON;;;;;N;;;;; +1F4BC;BRIEFCASE;So;0;ON;;;;;N;;;;; +1F4BD;MINIDISC;So;0;ON;;;;;N;;;;; +1F4BE;FLOPPY DISK;So;0;ON;;;;;N;;;;; +1F4BF;OPTICAL DISC;So;0;ON;;;;;N;;;;; +1F4C0;DVD;So;0;ON;;;;;N;;;;; +1F4C1;FILE FOLDER;So;0;ON;;;;;N;;;;; +1F4C2;OPEN FILE FOLDER;So;0;ON;;;;;N;;;;; +1F4C3;PAGE WITH CURL;So;0;ON;;;;;N;;;;; +1F4C4;PAGE FACING UP;So;0;ON;;;;;N;;;;; +1F4C5;CALENDAR;So;0;ON;;;;;N;;;;; +1F4C6;TEAR-OFF CALENDAR;So;0;ON;;;;;N;;;;; +1F4C7;CARD INDEX;So;0;ON;;;;;N;;;;; +1F4C8;CHART WITH UPWARDS TREND;So;0;ON;;;;;N;;;;; +1F4C9;CHART WITH DOWNWARDS TREND;So;0;ON;;;;;N;;;;; +1F4CA;BAR CHART;So;0;ON;;;;;N;;;;; +1F4CB;CLIPBOARD;So;0;ON;;;;;N;;;;; +1F4CC;PUSHPIN;So;0;ON;;;;;N;;;;; +1F4CD;ROUND PUSHPIN;So;0;ON;;;;;N;;;;; +1F4CE;PAPERCLIP;So;0;ON;;;;;N;;;;; +1F4CF;STRAIGHT RULER;So;0;ON;;;;;N;;;;; +1F4D0;TRIANGULAR RULER;So;0;ON;;;;;N;;;;; +1F4D1;BOOKMARK TABS;So;0;ON;;;;;N;;;;; +1F4D2;LEDGER;So;0;ON;;;;;N;;;;; +1F4D3;NOTEBOOK;So;0;ON;;;;;N;;;;; +1F4D4;NOTEBOOK WITH DECORATIVE COVER;So;0;ON;;;;;N;;;;; +1F4D5;CLOSED BOOK;So;0;ON;;;;;N;;;;; +1F4D6;OPEN BOOK;So;0;ON;;;;;N;;;;; +1F4D7;GREEN BOOK;So;0;ON;;;;;N;;;;; +1F4D8;BLUE BOOK;So;0;ON;;;;;N;;;;; +1F4D9;ORANGE BOOK;So;0;ON;;;;;N;;;;; +1F4DA;BOOKS;So;0;ON;;;;;N;;;;; +1F4DB;NAME BADGE;So;0;ON;;;;;N;;;;; +1F4DC;SCROLL;So;0;ON;;;;;N;;;;; +1F4DD;MEMO;So;0;ON;;;;;N;;;;; +1F4DE;TELEPHONE RECEIVER;So;0;ON;;;;;N;;;;; +1F4DF;PAGER;So;0;ON;;;;;N;;;;; +1F4E0;FAX MACHINE;So;0;ON;;;;;N;;;;; +1F4E1;SATELLITE ANTENNA;So;0;ON;;;;;N;;;;; +1F4E2;PUBLIC ADDRESS LOUDSPEAKER;So;0;ON;;;;;N;;;;; +1F4E3;CHEERING MEGAPHONE;So;0;ON;;;;;N;;;;; +1F4E4;OUTBOX TRAY;So;0;ON;;;;;N;;;;; +1F4E5;INBOX TRAY;So;0;ON;;;;;N;;;;; +1F4E6;PACKAGE;So;0;ON;;;;;N;;;;; +1F4E7;E-MAIL SYMBOL;So;0;ON;;;;;N;;;;; +1F4E8;INCOMING ENVELOPE;So;0;ON;;;;;N;;;;; +1F4E9;ENVELOPE WITH DOWNWARDS ARROW ABOVE;So;0;ON;;;;;N;;;;; +1F4EA;CLOSED MAILBOX WITH LOWERED FLAG;So;0;ON;;;;;N;;;;; +1F4EB;CLOSED MAILBOX WITH RAISED FLAG;So;0;ON;;;;;N;;;;; +1F4EC;OPEN MAILBOX WITH RAISED FLAG;So;0;ON;;;;;N;;;;; +1F4ED;OPEN MAILBOX WITH LOWERED FLAG;So;0;ON;;;;;N;;;;; +1F4EE;POSTBOX;So;0;ON;;;;;N;;;;; +1F4EF;POSTAL HORN;So;0;ON;;;;;N;;;;; +1F4F0;NEWSPAPER;So;0;ON;;;;;N;;;;; +1F4F1;MOBILE PHONE;So;0;ON;;;;;N;;;;; +1F4F2;MOBILE PHONE WITH RIGHTWARDS ARROW AT LEFT;So;0;ON;;;;;N;;;;; +1F4F3;VIBRATION MODE;So;0;ON;;;;;N;;;;; +1F4F4;MOBILE PHONE OFF;So;0;ON;;;;;N;;;;; +1F4F5;NO MOBILE PHONES;So;0;ON;;;;;N;;;;; +1F4F6;ANTENNA WITH BARS;So;0;ON;;;;;N;;;;; +1F4F7;CAMERA;So;0;ON;;;;;N;;;;; +1F4F8;CAMERA WITH FLASH;So;0;ON;;;;;N;;;;; +1F4F9;VIDEO CAMERA;So;0;ON;;;;;N;;;;; +1F4FA;TELEVISION;So;0;ON;;;;;N;;;;; +1F4FB;RADIO;So;0;ON;;;;;N;;;;; +1F4FC;VIDEOCASSETTE;So;0;ON;;;;;N;;;;; +1F4FD;FILM PROJECTOR;So;0;ON;;;;;N;;;;; +1F4FE;PORTABLE STEREO;So;0;ON;;;;;N;;;;; +1F4FF;PRAYER BEADS;So;0;ON;;;;;N;;;;; +1F500;TWISTED RIGHTWARDS ARROWS;So;0;ON;;;;;N;;;;; +1F501;CLOCKWISE RIGHTWARDS AND LEFTWARDS OPEN CIRCLE ARROWS;So;0;ON;;;;;N;;;;; +1F502;CLOCKWISE RIGHTWARDS AND LEFTWARDS OPEN CIRCLE ARROWS WITH CIRCLED ONE OVERLAY;So;0;ON;;;;;N;;;;; +1F503;CLOCKWISE DOWNWARDS AND UPWARDS OPEN CIRCLE ARROWS;So;0;ON;;;;;N;;;;; +1F504;ANTICLOCKWISE DOWNWARDS AND UPWARDS OPEN CIRCLE ARROWS;So;0;ON;;;;;N;;;;; +1F505;LOW BRIGHTNESS SYMBOL;So;0;ON;;;;;N;;;;; +1F506;HIGH BRIGHTNESS SYMBOL;So;0;ON;;;;;N;;;;; +1F507;SPEAKER WITH CANCELLATION STROKE;So;0;ON;;;;;N;;;;; +1F508;SPEAKER;So;0;ON;;;;;N;;;;; +1F509;SPEAKER WITH ONE SOUND WAVE;So;0;ON;;;;;N;;;;; +1F50A;SPEAKER WITH THREE SOUND WAVES;So;0;ON;;;;;N;;;;; +1F50B;BATTERY;So;0;ON;;;;;N;;;;; +1F50C;ELECTRIC PLUG;So;0;ON;;;;;N;;;;; +1F50D;LEFT-POINTING MAGNIFYING GLASS;So;0;ON;;;;;N;;;;; +1F50E;RIGHT-POINTING MAGNIFYING GLASS;So;0;ON;;;;;N;;;;; +1F50F;LOCK WITH INK PEN;So;0;ON;;;;;N;;;;; +1F510;CLOSED LOCK WITH KEY;So;0;ON;;;;;N;;;;; +1F511;KEY;So;0;ON;;;;;N;;;;; +1F512;LOCK;So;0;ON;;;;;N;;;;; +1F513;OPEN LOCK;So;0;ON;;;;;N;;;;; +1F514;BELL;So;0;ON;;;;;N;;;;; +1F515;BELL WITH CANCELLATION STROKE;So;0;ON;;;;;N;;;;; +1F516;BOOKMARK;So;0;ON;;;;;N;;;;; +1F517;LINK SYMBOL;So;0;ON;;;;;N;;;;; +1F518;RADIO BUTTON;So;0;ON;;;;;N;;;;; +1F519;BACK WITH LEFTWARDS ARROW ABOVE;So;0;ON;;;;;N;;;;; +1F51A;END WITH LEFTWARDS ARROW ABOVE;So;0;ON;;;;;N;;;;; +1F51B;ON WITH EXCLAMATION MARK WITH LEFT RIGHT ARROW ABOVE;So;0;ON;;;;;N;;;;; +1F51C;SOON WITH RIGHTWARDS ARROW ABOVE;So;0;ON;;;;;N;;;;; +1F51D;TOP WITH UPWARDS ARROW ABOVE;So;0;ON;;;;;N;;;;; +1F51E;NO ONE UNDER EIGHTEEN SYMBOL;So;0;ON;;;;;N;;;;; +1F51F;KEYCAP TEN;So;0;ON;;;;;N;;;;; +1F520;INPUT SYMBOL FOR LATIN CAPITAL LETTERS;So;0;ON;;;;;N;;;;; +1F521;INPUT SYMBOL FOR LATIN SMALL LETTERS;So;0;ON;;;;;N;;;;; +1F522;INPUT SYMBOL FOR NUMBERS;So;0;ON;;;;;N;;;;; +1F523;INPUT SYMBOL FOR SYMBOLS;So;0;ON;;;;;N;;;;; +1F524;INPUT SYMBOL FOR LATIN LETTERS;So;0;ON;;;;;N;;;;; +1F525;FIRE;So;0;ON;;;;;N;;;;; +1F526;ELECTRIC TORCH;So;0;ON;;;;;N;;;;; +1F527;WRENCH;So;0;ON;;;;;N;;;;; +1F528;HAMMER;So;0;ON;;;;;N;;;;; +1F529;NUT AND BOLT;So;0;ON;;;;;N;;;;; +1F52A;HOCHO;So;0;ON;;;;;N;;;;; +1F52B;PISTOL;So;0;ON;;;;;N;;;;; +1F52C;MICROSCOPE;So;0;ON;;;;;N;;;;; +1F52D;TELESCOPE;So;0;ON;;;;;N;;;;; +1F52E;CRYSTAL BALL;So;0;ON;;;;;N;;;;; +1F52F;SIX POINTED STAR WITH MIDDLE DOT;So;0;ON;;;;;N;;;;; +1F530;JAPANESE SYMBOL FOR BEGINNER;So;0;ON;;;;;N;;;;; +1F531;TRIDENT EMBLEM;So;0;ON;;;;;N;;;;; +1F532;BLACK SQUARE BUTTON;So;0;ON;;;;;N;;;;; +1F533;WHITE SQUARE BUTTON;So;0;ON;;;;;N;;;;; +1F534;LARGE RED CIRCLE;So;0;ON;;;;;N;;;;; +1F535;LARGE BLUE CIRCLE;So;0;ON;;;;;N;;;;; +1F536;LARGE ORANGE DIAMOND;So;0;ON;;;;;N;;;;; +1F537;LARGE BLUE DIAMOND;So;0;ON;;;;;N;;;;; +1F538;SMALL ORANGE DIAMOND;So;0;ON;;;;;N;;;;; +1F539;SMALL BLUE DIAMOND;So;0;ON;;;;;N;;;;; +1F53A;UP-POINTING RED TRIANGLE;So;0;ON;;;;;N;;;;; +1F53B;DOWN-POINTING RED TRIANGLE;So;0;ON;;;;;N;;;;; +1F53C;UP-POINTING SMALL RED TRIANGLE;So;0;ON;;;;;N;;;;; +1F53D;DOWN-POINTING SMALL RED TRIANGLE;So;0;ON;;;;;N;;;;; +1F53E;LOWER RIGHT SHADOWED WHITE CIRCLE;So;0;ON;;;;;N;;;;; +1F53F;UPPER RIGHT SHADOWED WHITE CIRCLE;So;0;ON;;;;;N;;;;; +1F540;CIRCLED CROSS POMMEE;So;0;ON;;;;;N;;;;; +1F541;CROSS POMMEE WITH HALF-CIRCLE BELOW;So;0;ON;;;;;N;;;;; +1F542;CROSS POMMEE;So;0;ON;;;;;N;;;;; +1F543;NOTCHED LEFT SEMICIRCLE WITH THREE DOTS;So;0;ON;;;;;N;;;;; +1F544;NOTCHED RIGHT SEMICIRCLE WITH THREE DOTS;So;0;ON;;;;;N;;;;; +1F545;SYMBOL FOR MARKS CHAPTER;So;0;ON;;;;;N;;;;; +1F546;WHITE LATIN CROSS;So;0;ON;;;;;N;;;;; +1F547;HEAVY LATIN CROSS;So;0;ON;;;;;N;;;;; +1F548;CELTIC CROSS;So;0;ON;;;;;N;;;;; +1F549;OM SYMBOL;So;0;ON;;;;;N;;;;; +1F54A;DOVE OF PEACE;So;0;ON;;;;;N;;;;; +1F54B;KAABA;So;0;ON;;;;;N;;;;; +1F54C;MOSQUE;So;0;ON;;;;;N;;;;; +1F54D;SYNAGOGUE;So;0;ON;;;;;N;;;;; +1F54E;MENORAH WITH NINE BRANCHES;So;0;ON;;;;;N;;;;; +1F54F;BOWL OF HYGIEIA;So;0;ON;;;;;N;;;;; +1F550;CLOCK FACE ONE OCLOCK;So;0;ON;;;;;N;;;;; +1F551;CLOCK FACE TWO OCLOCK;So;0;ON;;;;;N;;;;; +1F552;CLOCK FACE THREE OCLOCK;So;0;ON;;;;;N;;;;; +1F553;CLOCK FACE FOUR OCLOCK;So;0;ON;;;;;N;;;;; +1F554;CLOCK FACE FIVE OCLOCK;So;0;ON;;;;;N;;;;; +1F555;CLOCK FACE SIX OCLOCK;So;0;ON;;;;;N;;;;; +1F556;CLOCK FACE SEVEN OCLOCK;So;0;ON;;;;;N;;;;; +1F557;CLOCK FACE EIGHT OCLOCK;So;0;ON;;;;;N;;;;; +1F558;CLOCK FACE NINE OCLOCK;So;0;ON;;;;;N;;;;; +1F559;CLOCK FACE TEN OCLOCK;So;0;ON;;;;;N;;;;; +1F55A;CLOCK FACE ELEVEN OCLOCK;So;0;ON;;;;;N;;;;; +1F55B;CLOCK FACE TWELVE OCLOCK;So;0;ON;;;;;N;;;;; +1F55C;CLOCK FACE ONE-THIRTY;So;0;ON;;;;;N;;;;; +1F55D;CLOCK FACE TWO-THIRTY;So;0;ON;;;;;N;;;;; +1F55E;CLOCK FACE THREE-THIRTY;So;0;ON;;;;;N;;;;; +1F55F;CLOCK FACE FOUR-THIRTY;So;0;ON;;;;;N;;;;; +1F560;CLOCK FACE FIVE-THIRTY;So;0;ON;;;;;N;;;;; +1F561;CLOCK FACE SIX-THIRTY;So;0;ON;;;;;N;;;;; +1F562;CLOCK FACE SEVEN-THIRTY;So;0;ON;;;;;N;;;;; +1F563;CLOCK FACE EIGHT-THIRTY;So;0;ON;;;;;N;;;;; +1F564;CLOCK FACE NINE-THIRTY;So;0;ON;;;;;N;;;;; +1F565;CLOCK FACE TEN-THIRTY;So;0;ON;;;;;N;;;;; +1F566;CLOCK FACE ELEVEN-THIRTY;So;0;ON;;;;;N;;;;; +1F567;CLOCK FACE TWELVE-THIRTY;So;0;ON;;;;;N;;;;; +1F568;RIGHT SPEAKER;So;0;ON;;;;;N;;;;; +1F569;RIGHT SPEAKER WITH ONE SOUND WAVE;So;0;ON;;;;;N;;;;; +1F56A;RIGHT SPEAKER WITH THREE SOUND WAVES;So;0;ON;;;;;N;;;;; +1F56B;BULLHORN;So;0;ON;;;;;N;;;;; +1F56C;BULLHORN WITH SOUND WAVES;So;0;ON;;;;;N;;;;; +1F56D;RINGING BELL;So;0;ON;;;;;N;;;;; +1F56E;BOOK;So;0;ON;;;;;N;;;;; +1F56F;CANDLE;So;0;ON;;;;;N;;;;; +1F570;MANTELPIECE CLOCK;So;0;ON;;;;;N;;;;; +1F571;BLACK SKULL AND CROSSBONES;So;0;ON;;;;;N;;;;; +1F572;NO PIRACY;So;0;ON;;;;;N;;;;; +1F573;HOLE;So;0;ON;;;;;N;;;;; +1F574;MAN IN BUSINESS SUIT LEVITATING;So;0;ON;;;;;N;;;;; +1F575;SLEUTH OR SPY;So;0;ON;;;;;N;;;;; +1F576;DARK SUNGLASSES;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;;;;; +1F57E;WHITE TOUCHTONE TELEPHONE;So;0;ON;;;;;N;;;;; +1F57F;BLACK TOUCHTONE TELEPHONE;So;0;ON;;;;;N;;;;; +1F580;TELEPHONE ON TOP OF MODEM;So;0;ON;;;;;N;;;;; +1F581;CLAMSHELL MOBILE PHONE;So;0;ON;;;;;N;;;;; +1F582;BACK OF ENVELOPE;So;0;ON;;;;;N;;;;; +1F583;STAMPED ENVELOPE;So;0;ON;;;;;N;;;;; +1F584;ENVELOPE WITH LIGHTNING;So;0;ON;;;;;N;;;;; +1F585;FLYING ENVELOPE;So;0;ON;;;;;N;;;;; +1F586;PEN OVER STAMPED ENVELOPE;So;0;ON;;;;;N;;;;; +1F587;LINKED PAPERCLIPS;So;0;ON;;;;;N;;;;; +1F588;BLACK PUSHPIN;So;0;ON;;;;;N;;;;; +1F589;LOWER LEFT PENCIL;So;0;ON;;;;;N;;;;; +1F58A;LOWER LEFT BALLPOINT PEN;So;0;ON;;;;;N;;;;; +1F58B;LOWER LEFT FOUNTAIN PEN;So;0;ON;;;;;N;;;;; +1F58C;LOWER LEFT PAINTBRUSH;So;0;ON;;;;;N;;;;; +1F58D;LOWER LEFT CRAYON;So;0;ON;;;;;N;;;;; +1F58E;LEFT WRITING HAND;So;0;ON;;;;;N;;;;; +1F58F;TURNED OK HAND SIGN;So;0;ON;;;;;N;;;;; +1F590;RAISED HAND WITH FINGERS SPLAYED;So;0;ON;;;;;N;;;;; +1F591;REVERSED RAISED HAND WITH FINGERS SPLAYED;So;0;ON;;;;;N;;;;; +1F592;REVERSED THUMBS UP SIGN;So;0;ON;;;;;N;;;;; +1F593;REVERSED THUMBS DOWN SIGN;So;0;ON;;;;;N;;;;; +1F594;REVERSED VICTORY HAND;So;0;ON;;;;;N;;;;; +1F595;REVERSED HAND WITH MIDDLE FINGER EXTENDED;So;0;ON;;;;;N;;;;; +1F596;RAISED HAND WITH PART BETWEEN MIDDLE AND RING FINGERS;So;0;ON;;;;;N;;;;; +1F597;WHITE DOWN POINTING LEFT HAND INDEX;So;0;ON;;;;;N;;;;; +1F598;SIDEWAYS WHITE LEFT POINTING INDEX;So;0;ON;;;;;N;;;;; +1F599;SIDEWAYS WHITE RIGHT POINTING INDEX;So;0;ON;;;;;N;;;;; +1F59A;SIDEWAYS BLACK LEFT POINTING INDEX;So;0;ON;;;;;N;;;;; +1F59B;SIDEWAYS BLACK RIGHT POINTING INDEX;So;0;ON;;;;;N;;;;; +1F59C;BLACK LEFT POINTING BACKHAND INDEX;So;0;ON;;;;;N;;;;; +1F59D;BLACK RIGHT POINTING BACKHAND INDEX;So;0;ON;;;;;N;;;;; +1F59E;SIDEWAYS WHITE UP POINTING INDEX;So;0;ON;;;;;N;;;;; +1F59F;SIDEWAYS WHITE DOWN POINTING INDEX;So;0;ON;;;;;N;;;;; +1F5A0;SIDEWAYS BLACK UP POINTING INDEX;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;;;;; +1F5A8;PRINTER;So;0;ON;;;;;N;;;;; +1F5A9;POCKET CALCULATOR;So;0;ON;;;;;N;;;;; +1F5AA;BLACK HARD SHELL FLOPPY DISK;So;0;ON;;;;;N;;;;; +1F5AB;WHITE HARD SHELL FLOPPY DISK;So;0;ON;;;;;N;;;;; +1F5AC;SOFT SHELL FLOPPY DISK;So;0;ON;;;;;N;;;;; +1F5AD;TAPE CARTRIDGE;So;0;ON;;;;;N;;;;; +1F5AE;WIRED KEYBOARD;So;0;ON;;;;;N;;;;; +1F5AF;ONE BUTTON MOUSE;So;0;ON;;;;;N;;;;; +1F5B0;TWO BUTTON MOUSE;So;0;ON;;;;;N;;;;; +1F5B1;THREE BUTTON MOUSE;So;0;ON;;;;;N;;;;; +1F5B2;TRACKBALL;So;0;ON;;;;;N;;;;; +1F5B3;OLD PERSONAL COMPUTER;So;0;ON;;;;;N;;;;; +1F5B4;HARD DISK;So;0;ON;;;;;N;;;;; +1F5B5;SCREEN;So;0;ON;;;;;N;;;;; +1F5B6;PRINTER ICON;So;0;ON;;;;;N;;;;; +1F5B7;FAX ICON;So;0;ON;;;;;N;;;;; +1F5B8;OPTICAL DISC ICON;So;0;ON;;;;;N;;;;; +1F5B9;DOCUMENT WITH TEXT;So;0;ON;;;;;N;;;;; +1F5BA;DOCUMENT WITH TEXT AND PICTURE;So;0;ON;;;;;N;;;;; +1F5BB;DOCUMENT WITH PICTURE;So;0;ON;;;;;N;;;;; +1F5BC;FRAME WITH PICTURE;So;0;ON;;;;;N;;;;; +1F5BD;FRAME WITH TILES;So;0;ON;;;;;N;;;;; +1F5BE;FRAME WITH AN X;So;0;ON;;;;;N;;;;; +1F5BF;BLACK FOLDER;So;0;ON;;;;;N;;;;; +1F5C0;FOLDER;So;0;ON;;;;;N;;;;; +1F5C1;OPEN FOLDER;So;0;ON;;;;;N;;;;; +1F5C2;CARD INDEX DIVIDERS;So;0;ON;;;;;N;;;;; +1F5C3;CARD FILE BOX;So;0;ON;;;;;N;;;;; +1F5C4;FILE CABINET;So;0;ON;;;;;N;;;;; +1F5C5;EMPTY NOTE;So;0;ON;;;;;N;;;;; +1F5C6;EMPTY NOTE PAGE;So;0;ON;;;;;N;;;;; +1F5C7;EMPTY NOTE PAD;So;0;ON;;;;;N;;;;; +1F5C8;NOTE;So;0;ON;;;;;N;;;;; +1F5C9;NOTE PAGE;So;0;ON;;;;;N;;;;; +1F5CA;NOTE PAD;So;0;ON;;;;;N;;;;; +1F5CB;EMPTY DOCUMENT;So;0;ON;;;;;N;;;;; +1F5CC;EMPTY PAGE;So;0;ON;;;;;N;;;;; +1F5CD;EMPTY PAGES;So;0;ON;;;;;N;;;;; +1F5CE;DOCUMENT;So;0;ON;;;;;N;;;;; +1F5CF;PAGE;So;0;ON;;;;;N;;;;; +1F5D0;PAGES;So;0;ON;;;;;N;;;;; +1F5D1;WASTEBASKET;So;0;ON;;;;;N;;;;; +1F5D2;SPIRAL NOTE PAD;So;0;ON;;;;;N;;;;; +1F5D3;SPIRAL CALENDAR PAD;So;0;ON;;;;;N;;;;; +1F5D4;DESKTOP WINDOW;So;0;ON;;;;;N;;;;; +1F5D5;MINIMIZE;So;0;ON;;;;;N;;;;; +1F5D6;MAXIMIZE;So;0;ON;;;;;N;;;;; +1F5D7;OVERLAP;So;0;ON;;;;;N;;;;; +1F5D8;CLOCKWISE RIGHT AND LEFT SEMICIRCLE ARROWS;So;0;ON;;;;;N;;;;; +1F5D9;CANCELLATION X;So;0;ON;;;;;N;;;;; +1F5DA;INCREASE FONT SIZE SYMBOL;So;0;ON;;;;;N;;;;; +1F5DB;DECREASE FONT SIZE SYMBOL;So;0;ON;;;;;N;;;;; +1F5DC;COMPRESSION;So;0;ON;;;;;N;;;;; +1F5DD;OLD KEY;So;0;ON;;;;;N;;;;; +1F5DE;ROLLED-UP NEWSPAPER;So;0;ON;;;;;N;;;;; +1F5DF;PAGE WITH CIRCLED TEXT;So;0;ON;;;;;N;;;;; +1F5E0;STOCK CHART;So;0;ON;;;;;N;;;;; +1F5E1;DAGGER KNIFE;So;0;ON;;;;;N;;;;; +1F5E2;LIPS;So;0;ON;;;;;N;;;;; +1F5E3;SPEAKING HEAD IN SILHOUETTE;So;0;ON;;;;;N;;;;; +1F5E4;THREE RAYS ABOVE;So;0;ON;;;;;N;;;;; +1F5E5;THREE RAYS BELOW;So;0;ON;;;;;N;;;;; +1F5E6;THREE RAYS LEFT;So;0;ON;;;;;N;;;;; +1F5E7;THREE RAYS RIGHT;So;0;ON;;;;;N;;;;; +1F5E8;LEFT SPEECH BUBBLE;So;0;ON;;;;;N;;;;; +1F5E9;RIGHT SPEECH BUBBLE;So;0;ON;;;;;N;;;;; +1F5EA;TWO SPEECH BUBBLES;So;0;ON;;;;;N;;;;; +1F5EB;THREE SPEECH BUBBLES;So;0;ON;;;;;N;;;;; +1F5EC;LEFT THOUGHT BUBBLE;So;0;ON;;;;;N;;;;; +1F5ED;RIGHT THOUGHT BUBBLE;So;0;ON;;;;;N;;;;; +1F5EE;LEFT ANGER BUBBLE;So;0;ON;;;;;N;;;;; +1F5EF;RIGHT ANGER BUBBLE;So;0;ON;;;;;N;;;;; +1F5F0;MOOD BUBBLE;So;0;ON;;;;;N;;;;; +1F5F1;LIGHTNING MOOD BUBBLE;So;0;ON;;;;;N;;;;; +1F5F2;LIGHTNING MOOD;So;0;ON;;;;;N;;;;; +1F5F3;BALLOT BOX WITH BALLOT;So;0;ON;;;;;N;;;;; +1F5F4;BALLOT SCRIPT X;So;0;ON;;;;;N;;;;; +1F5F5;BALLOT BOX WITH SCRIPT X;So;0;ON;;;;;N;;;;; +1F5F6;BALLOT BOLD SCRIPT X;So;0;ON;;;;;N;;;;; +1F5F7;BALLOT BOX WITH BOLD SCRIPT X;So;0;ON;;;;;N;;;;; +1F5F8;LIGHT CHECK MARK;So;0;ON;;;;;N;;;;; +1F5F9;BALLOT BOX WITH BOLD CHECK;So;0;ON;;;;;N;;;;; +1F5FA;WORLD MAP;So;0;ON;;;;;N;;;;; +1F5FB;MOUNT FUJI;So;0;ON;;;;;N;;;;; +1F5FC;TOKYO TOWER;So;0;ON;;;;;N;;;;; +1F5FD;STATUE OF LIBERTY;So;0;ON;;;;;N;;;;; +1F5FE;SILHOUETTE OF JAPAN;So;0;ON;;;;;N;;;;; +1F5FF;MOYAI;So;0;ON;;;;;N;;;;; +1F600;GRINNING FACE;So;0;ON;;;;;N;;;;; +1F601;GRINNING FACE WITH SMILING EYES;So;0;ON;;;;;N;;;;; +1F602;FACE WITH TEARS OF JOY;So;0;ON;;;;;N;;;;; +1F603;SMILING FACE WITH OPEN MOUTH;So;0;ON;;;;;N;;;;; +1F604;SMILING FACE WITH OPEN MOUTH AND SMILING EYES;So;0;ON;;;;;N;;;;; +1F605;SMILING FACE WITH OPEN MOUTH AND COLD SWEAT;So;0;ON;;;;;N;;;;; +1F606;SMILING FACE WITH OPEN MOUTH AND TIGHTLY-CLOSED EYES;So;0;ON;;;;;N;;;;; +1F607;SMILING FACE WITH HALO;So;0;ON;;;;;N;;;;; +1F608;SMILING FACE WITH HORNS;So;0;ON;;;;;N;;;;; +1F609;WINKING FACE;So;0;ON;;;;;N;;;;; +1F60A;SMILING FACE WITH SMILING EYES;So;0;ON;;;;;N;;;;; +1F60B;FACE SAVOURING DELICIOUS FOOD;So;0;ON;;;;;N;;;;; +1F60C;RELIEVED FACE;So;0;ON;;;;;N;;;;; +1F60D;SMILING FACE WITH HEART-SHAPED EYES;So;0;ON;;;;;N;;;;; +1F60E;SMILING FACE WITH SUNGLASSES;So;0;ON;;;;;N;;;;; +1F60F;SMIRKING FACE;So;0;ON;;;;;N;;;;; +1F610;NEUTRAL FACE;So;0;ON;;;;;N;;;;; +1F611;EXPRESSIONLESS FACE;So;0;ON;;;;;N;;;;; +1F612;UNAMUSED FACE;So;0;ON;;;;;N;;;;; +1F613;FACE WITH COLD SWEAT;So;0;ON;;;;;N;;;;; +1F614;PENSIVE FACE;So;0;ON;;;;;N;;;;; +1F615;CONFUSED FACE;So;0;ON;;;;;N;;;;; +1F616;CONFOUNDED FACE;So;0;ON;;;;;N;;;;; +1F617;KISSING FACE;So;0;ON;;;;;N;;;;; +1F618;FACE THROWING A KISS;So;0;ON;;;;;N;;;;; +1F619;KISSING FACE WITH SMILING EYES;So;0;ON;;;;;N;;;;; +1F61A;KISSING FACE WITH CLOSED EYES;So;0;ON;;;;;N;;;;; +1F61B;FACE WITH STUCK-OUT TONGUE;So;0;ON;;;;;N;;;;; +1F61C;FACE WITH STUCK-OUT TONGUE AND WINKING EYE;So;0;ON;;;;;N;;;;; +1F61D;FACE WITH STUCK-OUT TONGUE AND TIGHTLY-CLOSED EYES;So;0;ON;;;;;N;;;;; +1F61E;DISAPPOINTED FACE;So;0;ON;;;;;N;;;;; +1F61F;WORRIED FACE;So;0;ON;;;;;N;;;;; +1F620;ANGRY FACE;So;0;ON;;;;;N;;;;; +1F621;POUTING FACE;So;0;ON;;;;;N;;;;; +1F622;CRYING FACE;So;0;ON;;;;;N;;;;; +1F623;PERSEVERING FACE;So;0;ON;;;;;N;;;;; +1F624;FACE WITH LOOK OF TRIUMPH;So;0;ON;;;;;N;;;;; +1F625;DISAPPOINTED BUT RELIEVED FACE;So;0;ON;;;;;N;;;;; +1F626;FROWNING FACE WITH OPEN MOUTH;So;0;ON;;;;;N;;;;; +1F627;ANGUISHED FACE;So;0;ON;;;;;N;;;;; +1F628;FEARFUL FACE;So;0;ON;;;;;N;;;;; +1F629;WEARY FACE;So;0;ON;;;;;N;;;;; +1F62A;SLEEPY FACE;So;0;ON;;;;;N;;;;; +1F62B;TIRED FACE;So;0;ON;;;;;N;;;;; +1F62C;GRIMACING FACE;So;0;ON;;;;;N;;;;; +1F62D;LOUDLY CRYING FACE;So;0;ON;;;;;N;;;;; +1F62E;FACE WITH OPEN MOUTH;So;0;ON;;;;;N;;;;; +1F62F;HUSHED FACE;So;0;ON;;;;;N;;;;; +1F630;FACE WITH OPEN MOUTH AND COLD SWEAT;So;0;ON;;;;;N;;;;; +1F631;FACE SCREAMING IN FEAR;So;0;ON;;;;;N;;;;; +1F632;ASTONISHED FACE;So;0;ON;;;;;N;;;;; +1F633;FLUSHED FACE;So;0;ON;;;;;N;;;;; +1F634;SLEEPING FACE;So;0;ON;;;;;N;;;;; +1F635;DIZZY FACE;So;0;ON;;;;;N;;;;; +1F636;FACE WITHOUT MOUTH;So;0;ON;;;;;N;;;;; +1F637;FACE WITH MEDICAL MASK;So;0;ON;;;;;N;;;;; +1F638;GRINNING CAT FACE WITH SMILING EYES;So;0;ON;;;;;N;;;;; +1F639;CAT FACE WITH TEARS OF JOY;So;0;ON;;;;;N;;;;; +1F63A;SMILING CAT FACE WITH OPEN MOUTH;So;0;ON;;;;;N;;;;; +1F63B;SMILING CAT FACE WITH HEART-SHAPED EYES;So;0;ON;;;;;N;;;;; +1F63C;CAT FACE WITH WRY SMILE;So;0;ON;;;;;N;;;;; +1F63D;KISSING CAT FACE WITH CLOSED EYES;So;0;ON;;;;;N;;;;; +1F63E;POUTING CAT FACE;So;0;ON;;;;;N;;;;; +1F63F;CRYING CAT FACE;So;0;ON;;;;;N;;;;; +1F640;WEARY CAT FACE;So;0;ON;;;;;N;;;;; +1F641;SLIGHTLY FROWNING FACE;So;0;ON;;;;;N;;;;; +1F642;SLIGHTLY SMILING FACE;So;0;ON;;;;;N;;;;; +1F643;UPSIDE-DOWN FACE;So;0;ON;;;;;N;;;;; +1F644;FACE WITH ROLLING EYES;So;0;ON;;;;;N;;;;; +1F645;FACE WITH NO GOOD GESTURE;So;0;ON;;;;;N;;;;; +1F646;FACE WITH OK GESTURE;So;0;ON;;;;;N;;;;; +1F647;PERSON BOWING DEEPLY;So;0;ON;;;;;N;;;;; +1F648;SEE-NO-EVIL MONKEY;So;0;ON;;;;;N;;;;; +1F649;HEAR-NO-EVIL MONKEY;So;0;ON;;;;;N;;;;; +1F64A;SPEAK-NO-EVIL MONKEY;So;0;ON;;;;;N;;;;; +1F64B;HAPPY PERSON RAISING ONE HAND;So;0;ON;;;;;N;;;;; +1F64C;PERSON RAISING BOTH HANDS IN CELEBRATION;So;0;ON;;;;;N;;;;; +1F64D;PERSON FROWNING;So;0;ON;;;;;N;;;;; +1F64E;PERSON WITH POUTING FACE;So;0;ON;;;;;N;;;;; +1F64F;PERSON WITH FOLDED HANDS;So;0;ON;;;;;N;;;;; +1F650;NORTH WEST POINTING LEAF;So;0;ON;;;;;N;;;;; +1F651;SOUTH WEST POINTING LEAF;So;0;ON;;;;;N;;;;; +1F652;NORTH EAST POINTING LEAF;So;0;ON;;;;;N;;;;; +1F653;SOUTH EAST POINTING LEAF;So;0;ON;;;;;N;;;;; +1F654;TURNED NORTH WEST POINTING LEAF;So;0;ON;;;;;N;;;;; +1F655;TURNED SOUTH WEST POINTING LEAF;So;0;ON;;;;;N;;;;; +1F656;TURNED NORTH EAST POINTING LEAF;So;0;ON;;;;;N;;;;; +1F657;TURNED SOUTH EAST POINTING LEAF;So;0;ON;;;;;N;;;;; +1F658;NORTH WEST POINTING VINE LEAF;So;0;ON;;;;;N;;;;; +1F659;SOUTH WEST POINTING VINE LEAF;So;0;ON;;;;;N;;;;; +1F65A;NORTH EAST POINTING VINE LEAF;So;0;ON;;;;;N;;;;; +1F65B;SOUTH EAST POINTING VINE LEAF;So;0;ON;;;;;N;;;;; +1F65C;HEAVY NORTH WEST POINTING VINE LEAF;So;0;ON;;;;;N;;;;; +1F65D;HEAVY SOUTH WEST POINTING VINE LEAF;So;0;ON;;;;;N;;;;; +1F65E;HEAVY NORTH EAST POINTING VINE LEAF;So;0;ON;;;;;N;;;;; +1F65F;HEAVY SOUTH EAST POINTING VINE LEAF;So;0;ON;;;;;N;;;;; +1F660;NORTH WEST POINTING BUD;So;0;ON;;;;;N;;;;; +1F661;SOUTH WEST POINTING BUD;So;0;ON;;;;;N;;;;; +1F662;NORTH EAST POINTING BUD;So;0;ON;;;;;N;;;;; +1F663;SOUTH EAST POINTING BUD;So;0;ON;;;;;N;;;;; +1F664;HEAVY NORTH WEST POINTING BUD;So;0;ON;;;;;N;;;;; +1F665;HEAVY SOUTH WEST POINTING BUD;So;0;ON;;;;;N;;;;; +1F666;HEAVY NORTH EAST POINTING BUD;So;0;ON;;;;;N;;;;; +1F667;HEAVY SOUTH EAST POINTING BUD;So;0;ON;;;;;N;;;;; +1F668;HOLLOW QUILT SQUARE ORNAMENT;So;0;ON;;;;;N;;;;; +1F669;HOLLOW QUILT SQUARE ORNAMENT IN BLACK SQUARE;So;0;ON;;;;;N;;;;; +1F66A;SOLID QUILT SQUARE ORNAMENT;So;0;ON;;;;;N;;;;; +1F66B;SOLID QUILT SQUARE ORNAMENT IN BLACK SQUARE;So;0;ON;;;;;N;;;;; +1F66C;LEFTWARDS ROCKET;So;0;ON;;;;;N;;;;; +1F66D;UPWARDS ROCKET;So;0;ON;;;;;N;;;;; +1F66E;RIGHTWARDS ROCKET;So;0;ON;;;;;N;;;;; +1F66F;DOWNWARDS ROCKET;So;0;ON;;;;;N;;;;; +1F670;SCRIPT LIGATURE ET ORNAMENT;So;0;ON;;;;;N;;;;; +1F671;HEAVY SCRIPT LIGATURE ET ORNAMENT;So;0;ON;;;;;N;;;;; +1F672;LIGATURE OPEN ET ORNAMENT;So;0;ON;;;;;N;;;;; +1F673;HEAVY LIGATURE OPEN ET ORNAMENT;So;0;ON;;;;;N;;;;; +1F674;HEAVY AMPERSAND ORNAMENT;So;0;ON;;;;;N;;;;; +1F675;SWASH AMPERSAND ORNAMENT;So;0;ON;;;;;N;;;;; +1F676;SANS-SERIF HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; +1F677;SANS-SERIF HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; +1F678;SANS-SERIF HEAVY LOW DOUBLE COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; +1F679;HEAVY INTERROBANG ORNAMENT;So;0;ON;;;;;N;;;;; +1F67A;SANS-SERIF INTERROBANG ORNAMENT;So;0;ON;;;;;N;;;;; +1F67B;HEAVY SANS-SERIF INTERROBANG ORNAMENT;So;0;ON;;;;;N;;;;; +1F67C;VERY HEAVY SOLIDUS;So;0;ON;;;;;N;;;;; +1F67D;VERY HEAVY REVERSE SOLIDUS;So;0;ON;;;;;N;;;;; +1F67E;CHECKER BOARD;So;0;ON;;;;;N;;;;; +1F67F;REVERSE CHECKER BOARD;So;0;ON;;;;;N;;;;; +1F680;ROCKET;So;0;ON;;;;;N;;;;; +1F681;HELICOPTER;So;0;ON;;;;;N;;;;; +1F682;STEAM LOCOMOTIVE;So;0;ON;;;;;N;;;;; +1F683;RAILWAY CAR;So;0;ON;;;;;N;;;;; +1F684;HIGH-SPEED TRAIN;So;0;ON;;;;;N;;;;; +1F685;HIGH-SPEED TRAIN WITH BULLET NOSE;So;0;ON;;;;;N;;;;; +1F686;TRAIN;So;0;ON;;;;;N;;;;; +1F687;METRO;So;0;ON;;;;;N;;;;; +1F688;LIGHT RAIL;So;0;ON;;;;;N;;;;; +1F689;STATION;So;0;ON;;;;;N;;;;; +1F68A;TRAM;So;0;ON;;;;;N;;;;; +1F68B;TRAM CAR;So;0;ON;;;;;N;;;;; +1F68C;BUS;So;0;ON;;;;;N;;;;; +1F68D;ONCOMING BUS;So;0;ON;;;;;N;;;;; +1F68E;TROLLEYBUS;So;0;ON;;;;;N;;;;; +1F68F;BUS STOP;So;0;ON;;;;;N;;;;; +1F690;MINIBUS;So;0;ON;;;;;N;;;;; +1F691;AMBULANCE;So;0;ON;;;;;N;;;;; +1F692;FIRE ENGINE;So;0;ON;;;;;N;;;;; +1F693;POLICE CAR;So;0;ON;;;;;N;;;;; +1F694;ONCOMING POLICE CAR;So;0;ON;;;;;N;;;;; +1F695;TAXI;So;0;ON;;;;;N;;;;; +1F696;ONCOMING TAXI;So;0;ON;;;;;N;;;;; +1F697;AUTOMOBILE;So;0;ON;;;;;N;;;;; +1F698;ONCOMING AUTOMOBILE;So;0;ON;;;;;N;;;;; +1F699;RECREATIONAL VEHICLE;So;0;ON;;;;;N;;;;; +1F69A;DELIVERY TRUCK;So;0;ON;;;;;N;;;;; +1F69B;ARTICULATED LORRY;So;0;ON;;;;;N;;;;; +1F69C;TRACTOR;So;0;ON;;;;;N;;;;; +1F69D;MONORAIL;So;0;ON;;;;;N;;;;; +1F69E;MOUNTAIN RAILWAY;So;0;ON;;;;;N;;;;; +1F69F;SUSPENSION RAILWAY;So;0;ON;;;;;N;;;;; +1F6A0;MOUNTAIN CABLEWAY;So;0;ON;;;;;N;;;;; +1F6A1;AERIAL TRAMWAY;So;0;ON;;;;;N;;;;; +1F6A2;SHIP;So;0;ON;;;;;N;;;;; +1F6A3;ROWBOAT;So;0;ON;;;;;N;;;;; +1F6A4;SPEEDBOAT;So;0;ON;;;;;N;;;;; +1F6A5;HORIZONTAL TRAFFIC LIGHT;So;0;ON;;;;;N;;;;; +1F6A6;VERTICAL TRAFFIC LIGHT;So;0;ON;;;;;N;;;;; +1F6A7;CONSTRUCTION SIGN;So;0;ON;;;;;N;;;;; +1F6A8;POLICE CARS REVOLVING LIGHT;So;0;ON;;;;;N;;;;; +1F6A9;TRIANGULAR FLAG ON POST;So;0;ON;;;;;N;;;;; +1F6AA;DOOR;So;0;ON;;;;;N;;;;; +1F6AB;NO ENTRY SIGN;So;0;ON;;;;;N;;;;; +1F6AC;SMOKING SYMBOL;So;0;ON;;;;;N;;;;; +1F6AD;NO SMOKING SYMBOL;So;0;ON;;;;;N;;;;; +1F6AE;PUT LITTER IN ITS PLACE SYMBOL;So;0;ON;;;;;N;;;;; +1F6AF;DO NOT LITTER SYMBOL;So;0;ON;;;;;N;;;;; +1F6B0;POTABLE WATER SYMBOL;So;0;ON;;;;;N;;;;; +1F6B1;NON-POTABLE WATER SYMBOL;So;0;ON;;;;;N;;;;; +1F6B2;BICYCLE;So;0;ON;;;;;N;;;;; +1F6B3;NO BICYCLES;So;0;ON;;;;;N;;;;; +1F6B4;BICYCLIST;So;0;ON;;;;;N;;;;; +1F6B5;MOUNTAIN BICYCLIST;So;0;ON;;;;;N;;;;; +1F6B6;PEDESTRIAN;So;0;ON;;;;;N;;;;; +1F6B7;NO PEDESTRIANS;So;0;ON;;;;;N;;;;; +1F6B8;CHILDREN CROSSING;So;0;ON;;;;;N;;;;; +1F6B9;MENS SYMBOL;So;0;ON;;;;;N;;;;; +1F6BA;WOMENS SYMBOL;So;0;ON;;;;;N;;;;; +1F6BB;RESTROOM;So;0;ON;;;;;N;;;;; +1F6BC;BABY SYMBOL;So;0;ON;;;;;N;;;;; +1F6BD;TOILET;So;0;ON;;;;;N;;;;; +1F6BE;WATER CLOSET;So;0;ON;;;;;N;;;;; +1F6BF;SHOWER;So;0;ON;;;;;N;;;;; +1F6C0;BATH;So;0;ON;;;;;N;;;;; +1F6C1;BATHTUB;So;0;ON;;;;;N;;;;; +1F6C2;PASSPORT CONTROL;So;0;ON;;;;;N;;;;; +1F6C3;CUSTOMS;So;0;ON;;;;;N;;;;; +1F6C4;BAGGAGE CLAIM;So;0;ON;;;;;N;;;;; +1F6C5;LEFT LUGGAGE;So;0;ON;;;;;N;;;;; +1F6C6;TRIANGLE WITH ROUNDED CORNERS;So;0;ON;;;;;N;;;;; +1F6C7;PROHIBITED SIGN;So;0;ON;;;;;N;;;;; +1F6C8;CIRCLED INFORMATION SOURCE;So;0;ON;;;;;N;;;;; +1F6C9;BOYS SYMBOL;So;0;ON;;;;;N;;;;; +1F6CA;GIRLS SYMBOL;So;0;ON;;;;;N;;;;; +1F6CB;COUCH AND LAMP;So;0;ON;;;;;N;;;;; +1F6CC;SLEEPING ACCOMMODATION;So;0;ON;;;;;N;;;;; +1F6CD;SHOPPING BAGS;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;;;;; +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;;;;; +1F6E3;MOTORWAY;So;0;ON;;;;;N;;;;; +1F6E4;RAILWAY TRACK;So;0;ON;;;;;N;;;;; +1F6E5;MOTOR BOAT;So;0;ON;;;;;N;;;;; +1F6E6;UP-POINTING MILITARY AIRPLANE;So;0;ON;;;;;N;;;;; +1F6E7;UP-POINTING AIRPLANE;So;0;ON;;;;;N;;;;; +1F6E8;UP-POINTING SMALL AIRPLANE;So;0;ON;;;;;N;;;;; +1F6E9;SMALL AIRPLANE;So;0;ON;;;;;N;;;;; +1F6EA;NORTHEAST-POINTING AIRPLANE;So;0;ON;;;;;N;;;;; +1F6EB;AIRPLANE DEPARTURE;So;0;ON;;;;;N;;;;; +1F6EC;AIRPLANE ARRIVING;So;0;ON;;;;;N;;;;; +1F6F0;SATELLITE;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;;;;; +1F6F7;SLED;So;0;ON;;;;;N;;;;; +1F6F8;FLYING SAUCER;So;0;ON;;;;;N;;;;; +1F6F9;SKATEBOARD;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;;;;; +1F703;ALCHEMICAL SYMBOL FOR EARTH;So;0;ON;;;;;N;;;;; +1F704;ALCHEMICAL SYMBOL FOR WATER;So;0;ON;;;;;N;;;;; +1F705;ALCHEMICAL SYMBOL FOR AQUAFORTIS;So;0;ON;;;;;N;;;;; +1F706;ALCHEMICAL SYMBOL FOR AQUA REGIA;So;0;ON;;;;;N;;;;; +1F707;ALCHEMICAL SYMBOL FOR AQUA REGIA-2;So;0;ON;;;;;N;;;;; +1F708;ALCHEMICAL SYMBOL FOR AQUA VITAE;So;0;ON;;;;;N;;;;; +1F709;ALCHEMICAL SYMBOL FOR AQUA VITAE-2;So;0;ON;;;;;N;;;;; +1F70A;ALCHEMICAL SYMBOL FOR VINEGAR;So;0;ON;;;;;N;;;;; +1F70B;ALCHEMICAL SYMBOL FOR VINEGAR-2;So;0;ON;;;;;N;;;;; +1F70C;ALCHEMICAL SYMBOL FOR VINEGAR-3;So;0;ON;;;;;N;;;;; +1F70D;ALCHEMICAL SYMBOL FOR SULFUR;So;0;ON;;;;;N;;;;; +1F70E;ALCHEMICAL SYMBOL FOR PHILOSOPHERS SULFUR;So;0;ON;;;;;N;;;;; +1F70F;ALCHEMICAL SYMBOL FOR BLACK SULFUR;So;0;ON;;;;;N;;;;; +1F710;ALCHEMICAL SYMBOL FOR MERCURY SUBLIMATE;So;0;ON;;;;;N;;;;; +1F711;ALCHEMICAL SYMBOL FOR MERCURY SUBLIMATE-2;So;0;ON;;;;;N;;;;; +1F712;ALCHEMICAL SYMBOL FOR MERCURY SUBLIMATE-3;So;0;ON;;;;;N;;;;; +1F713;ALCHEMICAL SYMBOL FOR CINNABAR;So;0;ON;;;;;N;;;;; +1F714;ALCHEMICAL SYMBOL FOR SALT;So;0;ON;;;;;N;;;;; +1F715;ALCHEMICAL SYMBOL FOR NITRE;So;0;ON;;;;;N;;;;; +1F716;ALCHEMICAL SYMBOL FOR VITRIOL;So;0;ON;;;;;N;;;;; +1F717;ALCHEMICAL SYMBOL FOR VITRIOL-2;So;0;ON;;;;;N;;;;; +1F718;ALCHEMICAL SYMBOL FOR ROCK SALT;So;0;ON;;;;;N;;;;; +1F719;ALCHEMICAL SYMBOL FOR ROCK SALT-2;So;0;ON;;;;;N;;;;; +1F71A;ALCHEMICAL SYMBOL FOR GOLD;So;0;ON;;;;;N;;;;; +1F71B;ALCHEMICAL SYMBOL FOR SILVER;So;0;ON;;;;;N;;;;; +1F71C;ALCHEMICAL SYMBOL FOR IRON ORE;So;0;ON;;;;;N;;;;; +1F71D;ALCHEMICAL SYMBOL FOR IRON ORE-2;So;0;ON;;;;;N;;;;; +1F71E;ALCHEMICAL SYMBOL FOR CROCUS OF IRON;So;0;ON;;;;;N;;;;; +1F71F;ALCHEMICAL SYMBOL FOR REGULUS OF IRON;So;0;ON;;;;;N;;;;; +1F720;ALCHEMICAL SYMBOL FOR COPPER ORE;So;0;ON;;;;;N;;;;; +1F721;ALCHEMICAL SYMBOL FOR IRON-COPPER ORE;So;0;ON;;;;;N;;;;; +1F722;ALCHEMICAL SYMBOL FOR SUBLIMATE OF COPPER;So;0;ON;;;;;N;;;;; +1F723;ALCHEMICAL SYMBOL FOR CROCUS OF COPPER;So;0;ON;;;;;N;;;;; +1F724;ALCHEMICAL SYMBOL FOR CROCUS OF COPPER-2;So;0;ON;;;;;N;;;;; +1F725;ALCHEMICAL SYMBOL FOR COPPER ANTIMONIATE;So;0;ON;;;;;N;;;;; +1F726;ALCHEMICAL SYMBOL FOR SALT OF COPPER ANTIMONIATE;So;0;ON;;;;;N;;;;; +1F727;ALCHEMICAL SYMBOL FOR SUBLIMATE OF SALT OF COPPER;So;0;ON;;;;;N;;;;; +1F728;ALCHEMICAL SYMBOL FOR VERDIGRIS;So;0;ON;;;;;N;;;;; +1F729;ALCHEMICAL SYMBOL FOR TIN ORE;So;0;ON;;;;;N;;;;; +1F72A;ALCHEMICAL SYMBOL FOR LEAD ORE;So;0;ON;;;;;N;;;;; +1F72B;ALCHEMICAL SYMBOL FOR ANTIMONY ORE;So;0;ON;;;;;N;;;;; +1F72C;ALCHEMICAL SYMBOL FOR SUBLIMATE OF ANTIMONY;So;0;ON;;;;;N;;;;; +1F72D;ALCHEMICAL SYMBOL FOR SALT OF ANTIMONY;So;0;ON;;;;;N;;;;; +1F72E;ALCHEMICAL SYMBOL FOR SUBLIMATE OF SALT OF ANTIMONY;So;0;ON;;;;;N;;;;; +1F72F;ALCHEMICAL SYMBOL FOR VINEGAR OF ANTIMONY;So;0;ON;;;;;N;;;;; +1F730;ALCHEMICAL SYMBOL FOR REGULUS OF ANTIMONY;So;0;ON;;;;;N;;;;; +1F731;ALCHEMICAL SYMBOL FOR REGULUS OF ANTIMONY-2;So;0;ON;;;;;N;;;;; +1F732;ALCHEMICAL SYMBOL FOR REGULUS;So;0;ON;;;;;N;;;;; +1F733;ALCHEMICAL SYMBOL FOR REGULUS-2;So;0;ON;;;;;N;;;;; +1F734;ALCHEMICAL SYMBOL FOR REGULUS-3;So;0;ON;;;;;N;;;;; +1F735;ALCHEMICAL SYMBOL FOR REGULUS-4;So;0;ON;;;;;N;;;;; +1F736;ALCHEMICAL SYMBOL FOR ALKALI;So;0;ON;;;;;N;;;;; +1F737;ALCHEMICAL SYMBOL FOR ALKALI-2;So;0;ON;;;;;N;;;;; +1F738;ALCHEMICAL SYMBOL FOR MARCASITE;So;0;ON;;;;;N;;;;; +1F739;ALCHEMICAL SYMBOL FOR SAL-AMMONIAC;So;0;ON;;;;;N;;;;; +1F73A;ALCHEMICAL SYMBOL FOR ARSENIC;So;0;ON;;;;;N;;;;; +1F73B;ALCHEMICAL SYMBOL FOR REALGAR;So;0;ON;;;;;N;;;;; +1F73C;ALCHEMICAL SYMBOL FOR REALGAR-2;So;0;ON;;;;;N;;;;; +1F73D;ALCHEMICAL SYMBOL FOR AURIPIGMENT;So;0;ON;;;;;N;;;;; +1F73E;ALCHEMICAL SYMBOL FOR BISMUTH ORE;So;0;ON;;;;;N;;;;; +1F73F;ALCHEMICAL SYMBOL FOR TARTAR;So;0;ON;;;;;N;;;;; +1F740;ALCHEMICAL SYMBOL FOR TARTAR-2;So;0;ON;;;;;N;;;;; +1F741;ALCHEMICAL SYMBOL FOR QUICK LIME;So;0;ON;;;;;N;;;;; +1F742;ALCHEMICAL SYMBOL FOR BORAX;So;0;ON;;;;;N;;;;; +1F743;ALCHEMICAL SYMBOL FOR BORAX-2;So;0;ON;;;;;N;;;;; +1F744;ALCHEMICAL SYMBOL FOR BORAX-3;So;0;ON;;;;;N;;;;; +1F745;ALCHEMICAL SYMBOL FOR ALUM;So;0;ON;;;;;N;;;;; +1F746;ALCHEMICAL SYMBOL FOR OIL;So;0;ON;;;;;N;;;;; +1F747;ALCHEMICAL SYMBOL FOR SPIRIT;So;0;ON;;;;;N;;;;; +1F748;ALCHEMICAL SYMBOL FOR TINCTURE;So;0;ON;;;;;N;;;;; +1F749;ALCHEMICAL SYMBOL FOR GUM;So;0;ON;;;;;N;;;;; +1F74A;ALCHEMICAL SYMBOL FOR WAX;So;0;ON;;;;;N;;;;; +1F74B;ALCHEMICAL SYMBOL FOR POWDER;So;0;ON;;;;;N;;;;; +1F74C;ALCHEMICAL SYMBOL FOR CALX;So;0;ON;;;;;N;;;;; +1F74D;ALCHEMICAL SYMBOL FOR TUTTY;So;0;ON;;;;;N;;;;; +1F74E;ALCHEMICAL SYMBOL FOR CAPUT MORTUUM;So;0;ON;;;;;N;;;;; +1F74F;ALCHEMICAL SYMBOL FOR SCEPTER OF JOVE;So;0;ON;;;;;N;;;;; +1F750;ALCHEMICAL SYMBOL FOR CADUCEUS;So;0;ON;;;;;N;;;;; +1F751;ALCHEMICAL SYMBOL FOR TRIDENT;So;0;ON;;;;;N;;;;; +1F752;ALCHEMICAL SYMBOL FOR STARRED TRIDENT;So;0;ON;;;;;N;;;;; +1F753;ALCHEMICAL SYMBOL FOR LODESTONE;So;0;ON;;;;;N;;;;; +1F754;ALCHEMICAL SYMBOL FOR SOAP;So;0;ON;;;;;N;;;;; +1F755;ALCHEMICAL SYMBOL FOR URINE;So;0;ON;;;;;N;;;;; +1F756;ALCHEMICAL SYMBOL FOR HORSE DUNG;So;0;ON;;;;;N;;;;; +1F757;ALCHEMICAL SYMBOL FOR ASHES;So;0;ON;;;;;N;;;;; +1F758;ALCHEMICAL SYMBOL FOR POT ASHES;So;0;ON;;;;;N;;;;; +1F759;ALCHEMICAL SYMBOL FOR BRICK;So;0;ON;;;;;N;;;;; +1F75A;ALCHEMICAL SYMBOL FOR POWDERED BRICK;So;0;ON;;;;;N;;;;; +1F75B;ALCHEMICAL SYMBOL FOR AMALGAM;So;0;ON;;;;;N;;;;; +1F75C;ALCHEMICAL SYMBOL FOR STRATUM SUPER STRATUM;So;0;ON;;;;;N;;;;; +1F75D;ALCHEMICAL SYMBOL FOR STRATUM SUPER STRATUM-2;So;0;ON;;;;;N;;;;; +1F75E;ALCHEMICAL SYMBOL FOR SUBLIMATION;So;0;ON;;;;;N;;;;; +1F75F;ALCHEMICAL SYMBOL FOR PRECIPITATE;So;0;ON;;;;;N;;;;; +1F760;ALCHEMICAL SYMBOL FOR DISTILL;So;0;ON;;;;;N;;;;; +1F761;ALCHEMICAL SYMBOL FOR DISSOLVE;So;0;ON;;;;;N;;;;; +1F762;ALCHEMICAL SYMBOL FOR DISSOLVE-2;So;0;ON;;;;;N;;;;; +1F763;ALCHEMICAL SYMBOL FOR PURIFY;So;0;ON;;;;;N;;;;; +1F764;ALCHEMICAL SYMBOL FOR PUTREFACTION;So;0;ON;;;;;N;;;;; +1F765;ALCHEMICAL SYMBOL FOR CRUCIBLE;So;0;ON;;;;;N;;;;; +1F766;ALCHEMICAL SYMBOL FOR CRUCIBLE-2;So;0;ON;;;;;N;;;;; +1F767;ALCHEMICAL SYMBOL FOR CRUCIBLE-3;So;0;ON;;;;;N;;;;; +1F768;ALCHEMICAL SYMBOL FOR CRUCIBLE-4;So;0;ON;;;;;N;;;;; +1F769;ALCHEMICAL SYMBOL FOR CRUCIBLE-5;So;0;ON;;;;;N;;;;; +1F76A;ALCHEMICAL SYMBOL FOR ALEMBIC;So;0;ON;;;;;N;;;;; +1F76B;ALCHEMICAL SYMBOL FOR BATH OF MARY;So;0;ON;;;;;N;;;;; +1F76C;ALCHEMICAL SYMBOL FOR BATH OF VAPOURS;So;0;ON;;;;;N;;;;; +1F76D;ALCHEMICAL SYMBOL FOR RETORT;So;0;ON;;;;;N;;;;; +1F76E;ALCHEMICAL SYMBOL FOR HOUR;So;0;ON;;;;;N;;;;; +1F76F;ALCHEMICAL SYMBOL FOR NIGHT;So;0;ON;;;;;N;;;;; +1F770;ALCHEMICAL SYMBOL FOR DAY-NIGHT;So;0;ON;;;;;N;;;;; +1F771;ALCHEMICAL SYMBOL FOR MONTH;So;0;ON;;;;;N;;;;; +1F772;ALCHEMICAL SYMBOL FOR HALF DRAM;So;0;ON;;;;;N;;;;; +1F773;ALCHEMICAL SYMBOL FOR HALF OUNCE;So;0;ON;;;;;N;;;;; +1F780;BLACK LEFT-POINTING ISOSCELES RIGHT TRIANGLE;So;0;ON;;;;;N;;;;; +1F781;BLACK UP-POINTING ISOSCELES RIGHT TRIANGLE;So;0;ON;;;;;N;;;;; +1F782;BLACK RIGHT-POINTING ISOSCELES RIGHT TRIANGLE;So;0;ON;;;;;N;;;;; +1F783;BLACK DOWN-POINTING ISOSCELES RIGHT TRIANGLE;So;0;ON;;;;;N;;;;; +1F784;BLACK SLIGHTLY SMALL CIRCLE;So;0;ON;;;;;N;;;;; +1F785;MEDIUM BOLD WHITE CIRCLE;So;0;ON;;;;;N;;;;; +1F786;BOLD WHITE CIRCLE;So;0;ON;;;;;N;;;;; +1F787;HEAVY WHITE CIRCLE;So;0;ON;;;;;N;;;;; +1F788;VERY HEAVY WHITE CIRCLE;So;0;ON;;;;;N;;;;; +1F789;EXTREMELY HEAVY WHITE CIRCLE;So;0;ON;;;;;N;;;;; +1F78A;WHITE CIRCLE CONTAINING BLACK SMALL CIRCLE;So;0;ON;;;;;N;;;;; +1F78B;ROUND TARGET;So;0;ON;;;;;N;;;;; +1F78C;BLACK TINY SQUARE;So;0;ON;;;;;N;;;;; +1F78D;BLACK SLIGHTLY SMALL SQUARE;So;0;ON;;;;;N;;;;; +1F78E;LIGHT WHITE SQUARE;So;0;ON;;;;;N;;;;; +1F78F;MEDIUM WHITE SQUARE;So;0;ON;;;;;N;;;;; +1F790;BOLD WHITE SQUARE;So;0;ON;;;;;N;;;;; +1F791;HEAVY WHITE SQUARE;So;0;ON;;;;;N;;;;; +1F792;VERY HEAVY WHITE SQUARE;So;0;ON;;;;;N;;;;; +1F793;EXTREMELY HEAVY WHITE SQUARE;So;0;ON;;;;;N;;;;; +1F794;WHITE SQUARE CONTAINING BLACK VERY SMALL SQUARE;So;0;ON;;;;;N;;;;; +1F795;WHITE SQUARE CONTAINING BLACK MEDIUM SQUARE;So;0;ON;;;;;N;;;;; +1F796;SQUARE TARGET;So;0;ON;;;;;N;;;;; +1F797;BLACK TINY DIAMOND;So;0;ON;;;;;N;;;;; +1F798;BLACK VERY SMALL DIAMOND;So;0;ON;;;;;N;;;;; +1F799;BLACK MEDIUM SMALL DIAMOND;So;0;ON;;;;;N;;;;; +1F79A;WHITE DIAMOND CONTAINING BLACK VERY SMALL DIAMOND;So;0;ON;;;;;N;;;;; +1F79B;WHITE DIAMOND CONTAINING BLACK MEDIUM DIAMOND;So;0;ON;;;;;N;;;;; +1F79C;DIAMOND TARGET;So;0;ON;;;;;N;;;;; +1F79D;BLACK TINY LOZENGE;So;0;ON;;;;;N;;;;; +1F79E;BLACK VERY SMALL LOZENGE;So;0;ON;;;;;N;;;;; +1F79F;BLACK MEDIUM SMALL LOZENGE;So;0;ON;;;;;N;;;;; +1F7A0;WHITE LOZENGE CONTAINING BLACK SMALL LOZENGE;So;0;ON;;;;;N;;;;; +1F7A1;THIN GREEK CROSS;So;0;ON;;;;;N;;;;; +1F7A2;LIGHT GREEK CROSS;So;0;ON;;;;;N;;;;; +1F7A3;MEDIUM GREEK CROSS;So;0;ON;;;;;N;;;;; +1F7A4;BOLD GREEK CROSS;So;0;ON;;;;;N;;;;; +1F7A5;VERY BOLD GREEK CROSS;So;0;ON;;;;;N;;;;; +1F7A6;VERY HEAVY GREEK CROSS;So;0;ON;;;;;N;;;;; +1F7A7;EXTREMELY HEAVY GREEK CROSS;So;0;ON;;;;;N;;;;; +1F7A8;THIN SALTIRE;So;0;ON;;;;;N;;;;; +1F7A9;LIGHT SALTIRE;So;0;ON;;;;;N;;;;; +1F7AA;MEDIUM SALTIRE;So;0;ON;;;;;N;;;;; +1F7AB;BOLD SALTIRE;So;0;ON;;;;;N;;;;; +1F7AC;HEAVY SALTIRE;So;0;ON;;;;;N;;;;; +1F7AD;VERY HEAVY SALTIRE;So;0;ON;;;;;N;;;;; +1F7AE;EXTREMELY HEAVY SALTIRE;So;0;ON;;;;;N;;;;; +1F7AF;LIGHT FIVE SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +1F7B0;MEDIUM FIVE SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +1F7B1;BOLD FIVE SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +1F7B2;HEAVY FIVE SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +1F7B3;VERY HEAVY FIVE SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +1F7B4;EXTREMELY HEAVY FIVE SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +1F7B5;LIGHT SIX SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +1F7B6;MEDIUM SIX SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +1F7B7;BOLD SIX SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +1F7B8;HEAVY SIX SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +1F7B9;VERY HEAVY SIX SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +1F7BA;EXTREMELY HEAVY SIX SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +1F7BB;LIGHT EIGHT SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +1F7BC;MEDIUM EIGHT SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +1F7BD;BOLD EIGHT SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +1F7BE;HEAVY EIGHT SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +1F7BF;VERY HEAVY EIGHT SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +1F7C0;LIGHT THREE POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +1F7C1;MEDIUM THREE POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +1F7C2;THREE POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +1F7C3;MEDIUM THREE POINTED PINWHEEL STAR;So;0;ON;;;;;N;;;;; +1F7C4;LIGHT FOUR POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +1F7C5;MEDIUM FOUR POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +1F7C6;FOUR POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +1F7C7;MEDIUM FOUR POINTED PINWHEEL STAR;So;0;ON;;;;;N;;;;; +1F7C8;REVERSE LIGHT FOUR POINTED PINWHEEL STAR;So;0;ON;;;;;N;;;;; +1F7C9;LIGHT FIVE POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +1F7CA;HEAVY FIVE POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +1F7CB;MEDIUM SIX POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +1F7CC;HEAVY SIX POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +1F7CD;SIX POINTED PINWHEEL STAR;So;0;ON;;;;;N;;;;; +1F7CE;MEDIUM EIGHT POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +1F7CF;HEAVY EIGHT POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +1F7D0;VERY HEAVY EIGHT POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +1F7D1;HEAVY EIGHT POINTED PINWHEEL STAR;So;0;ON;;;;;N;;;;; +1F7D2;LIGHT TWELVE POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +1F7D3;HEAVY TWELVE POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +1F7D4;HEAVY TWELVE POINTED PINWHEEL STAR;So;0;ON;;;;;N;;;;; +1F7D5;CIRCLED TRIANGLE;So;0;ON;;;;;N;;;;; +1F7D6;NEGATIVE CIRCLED TRIANGLE;So;0;ON;;;;;N;;;;; +1F7D7;CIRCLED SQUARE;So;0;ON;;;;;N;;;;; +1F7D8;NEGATIVE CIRCLED SQUARE;So;0;ON;;;;;N;;;;; +1F800;LEFTWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F801;UPWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F802;RIGHTWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F803;DOWNWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F804;LEFTWARDS ARROW WITH MEDIUM TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F805;UPWARDS ARROW WITH MEDIUM TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F806;RIGHTWARDS ARROW WITH MEDIUM TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F807;DOWNWARDS ARROW WITH MEDIUM TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F808;LEFTWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F809;UPWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F80A;RIGHTWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F80B;DOWNWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F810;LEFTWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +1F811;UPWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +1F812;RIGHTWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +1F813;DOWNWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +1F814;LEFTWARDS ARROW WITH EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +1F815;UPWARDS ARROW WITH EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +1F816;RIGHTWARDS ARROW WITH EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +1F817;DOWNWARDS ARROW WITH EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +1F818;HEAVY LEFTWARDS ARROW WITH EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +1F819;HEAVY UPWARDS ARROW WITH EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +1F81A;HEAVY RIGHTWARDS ARROW WITH EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +1F81B;HEAVY DOWNWARDS ARROW WITH EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +1F81C;HEAVY LEFTWARDS ARROW WITH LARGE EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +1F81D;HEAVY UPWARDS ARROW WITH LARGE EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +1F81E;HEAVY RIGHTWARDS ARROW WITH LARGE EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +1F81F;HEAVY DOWNWARDS ARROW WITH LARGE EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +1F820;LEFTWARDS TRIANGLE-HEADED ARROW WITH NARROW SHAFT;So;0;ON;;;;;N;;;;; +1F821;UPWARDS TRIANGLE-HEADED ARROW WITH NARROW SHAFT;So;0;ON;;;;;N;;;;; +1F822;RIGHTWARDS TRIANGLE-HEADED ARROW WITH NARROW SHAFT;So;0;ON;;;;;N;;;;; +1F823;DOWNWARDS TRIANGLE-HEADED ARROW WITH NARROW SHAFT;So;0;ON;;;;;N;;;;; +1F824;LEFTWARDS TRIANGLE-HEADED ARROW WITH MEDIUM SHAFT;So;0;ON;;;;;N;;;;; +1F825;UPWARDS TRIANGLE-HEADED ARROW WITH MEDIUM SHAFT;So;0;ON;;;;;N;;;;; +1F826;RIGHTWARDS TRIANGLE-HEADED ARROW WITH MEDIUM SHAFT;So;0;ON;;;;;N;;;;; +1F827;DOWNWARDS TRIANGLE-HEADED ARROW WITH MEDIUM SHAFT;So;0;ON;;;;;N;;;;; +1F828;LEFTWARDS TRIANGLE-HEADED ARROW WITH BOLD SHAFT;So;0;ON;;;;;N;;;;; +1F829;UPWARDS TRIANGLE-HEADED ARROW WITH BOLD SHAFT;So;0;ON;;;;;N;;;;; +1F82A;RIGHTWARDS TRIANGLE-HEADED ARROW WITH BOLD SHAFT;So;0;ON;;;;;N;;;;; +1F82B;DOWNWARDS TRIANGLE-HEADED ARROW WITH BOLD SHAFT;So;0;ON;;;;;N;;;;; +1F82C;LEFTWARDS TRIANGLE-HEADED ARROW WITH HEAVY SHAFT;So;0;ON;;;;;N;;;;; +1F82D;UPWARDS TRIANGLE-HEADED ARROW WITH HEAVY SHAFT;So;0;ON;;;;;N;;;;; +1F82E;RIGHTWARDS TRIANGLE-HEADED ARROW WITH HEAVY SHAFT;So;0;ON;;;;;N;;;;; +1F82F;DOWNWARDS TRIANGLE-HEADED ARROW WITH HEAVY SHAFT;So;0;ON;;;;;N;;;;; +1F830;LEFTWARDS TRIANGLE-HEADED ARROW WITH VERY HEAVY SHAFT;So;0;ON;;;;;N;;;;; +1F831;UPWARDS TRIANGLE-HEADED ARROW WITH VERY HEAVY SHAFT;So;0;ON;;;;;N;;;;; +1F832;RIGHTWARDS TRIANGLE-HEADED ARROW WITH VERY HEAVY SHAFT;So;0;ON;;;;;N;;;;; +1F833;DOWNWARDS TRIANGLE-HEADED ARROW WITH VERY HEAVY SHAFT;So;0;ON;;;;;N;;;;; +1F834;LEFTWARDS FINGER-POST ARROW;So;0;ON;;;;;N;;;;; +1F835;UPWARDS FINGER-POST ARROW;So;0;ON;;;;;N;;;;; +1F836;RIGHTWARDS FINGER-POST ARROW;So;0;ON;;;;;N;;;;; +1F837;DOWNWARDS FINGER-POST ARROW;So;0;ON;;;;;N;;;;; +1F838;LEFTWARDS SQUARED ARROW;So;0;ON;;;;;N;;;;; +1F839;UPWARDS SQUARED ARROW;So;0;ON;;;;;N;;;;; +1F83A;RIGHTWARDS SQUARED ARROW;So;0;ON;;;;;N;;;;; +1F83B;DOWNWARDS SQUARED ARROW;So;0;ON;;;;;N;;;;; +1F83C;LEFTWARDS COMPRESSED ARROW;So;0;ON;;;;;N;;;;; +1F83D;UPWARDS COMPRESSED ARROW;So;0;ON;;;;;N;;;;; +1F83E;RIGHTWARDS COMPRESSED ARROW;So;0;ON;;;;;N;;;;; +1F83F;DOWNWARDS COMPRESSED ARROW;So;0;ON;;;;;N;;;;; +1F840;LEFTWARDS HEAVY COMPRESSED ARROW;So;0;ON;;;;;N;;;;; +1F841;UPWARDS HEAVY COMPRESSED ARROW;So;0;ON;;;;;N;;;;; +1F842;RIGHTWARDS HEAVY COMPRESSED ARROW;So;0;ON;;;;;N;;;;; +1F843;DOWNWARDS HEAVY COMPRESSED ARROW;So;0;ON;;;;;N;;;;; +1F844;LEFTWARDS HEAVY ARROW;So;0;ON;;;;;N;;;;; +1F845;UPWARDS HEAVY ARROW;So;0;ON;;;;;N;;;;; +1F846;RIGHTWARDS HEAVY ARROW;So;0;ON;;;;;N;;;;; +1F847;DOWNWARDS HEAVY ARROW;So;0;ON;;;;;N;;;;; +1F850;LEFTWARDS SANS-SERIF ARROW;So;0;ON;;;;;N;;;;; +1F851;UPWARDS SANS-SERIF ARROW;So;0;ON;;;;;N;;;;; +1F852;RIGHTWARDS SANS-SERIF ARROW;So;0;ON;;;;;N;;;;; +1F853;DOWNWARDS SANS-SERIF ARROW;So;0;ON;;;;;N;;;;; +1F854;NORTH WEST SANS-SERIF ARROW;So;0;ON;;;;;N;;;;; +1F855;NORTH EAST SANS-SERIF ARROW;So;0;ON;;;;;N;;;;; +1F856;SOUTH EAST SANS-SERIF ARROW;So;0;ON;;;;;N;;;;; +1F857;SOUTH WEST SANS-SERIF ARROW;So;0;ON;;;;;N;;;;; +1F858;LEFT RIGHT SANS-SERIF ARROW;So;0;ON;;;;;N;;;;; +1F859;UP DOWN SANS-SERIF ARROW;So;0;ON;;;;;N;;;;; +1F860;WIDE-HEADED LEFTWARDS LIGHT BARB ARROW;So;0;ON;;;;;N;;;;; +1F861;WIDE-HEADED UPWARDS LIGHT BARB ARROW;So;0;ON;;;;;N;;;;; +1F862;WIDE-HEADED RIGHTWARDS LIGHT BARB ARROW;So;0;ON;;;;;N;;;;; +1F863;WIDE-HEADED DOWNWARDS LIGHT BARB ARROW;So;0;ON;;;;;N;;;;; +1F864;WIDE-HEADED NORTH WEST LIGHT BARB ARROW;So;0;ON;;;;;N;;;;; +1F865;WIDE-HEADED NORTH EAST LIGHT BARB ARROW;So;0;ON;;;;;N;;;;; +1F866;WIDE-HEADED SOUTH EAST LIGHT BARB ARROW;So;0;ON;;;;;N;;;;; +1F867;WIDE-HEADED SOUTH WEST LIGHT BARB ARROW;So;0;ON;;;;;N;;;;; +1F868;WIDE-HEADED LEFTWARDS BARB ARROW;So;0;ON;;;;;N;;;;; +1F869;WIDE-HEADED UPWARDS BARB ARROW;So;0;ON;;;;;N;;;;; +1F86A;WIDE-HEADED RIGHTWARDS BARB ARROW;So;0;ON;;;;;N;;;;; +1F86B;WIDE-HEADED DOWNWARDS BARB ARROW;So;0;ON;;;;;N;;;;; +1F86C;WIDE-HEADED NORTH WEST BARB ARROW;So;0;ON;;;;;N;;;;; +1F86D;WIDE-HEADED NORTH EAST BARB ARROW;So;0;ON;;;;;N;;;;; +1F86E;WIDE-HEADED SOUTH EAST BARB ARROW;So;0;ON;;;;;N;;;;; +1F86F;WIDE-HEADED SOUTH WEST BARB ARROW;So;0;ON;;;;;N;;;;; +1F870;WIDE-HEADED LEFTWARDS MEDIUM BARB ARROW;So;0;ON;;;;;N;;;;; +1F871;WIDE-HEADED UPWARDS MEDIUM BARB ARROW;So;0;ON;;;;;N;;;;; +1F872;WIDE-HEADED RIGHTWARDS MEDIUM BARB ARROW;So;0;ON;;;;;N;;;;; +1F873;WIDE-HEADED DOWNWARDS MEDIUM BARB ARROW;So;0;ON;;;;;N;;;;; +1F874;WIDE-HEADED NORTH WEST MEDIUM BARB ARROW;So;0;ON;;;;;N;;;;; +1F875;WIDE-HEADED NORTH EAST MEDIUM BARB ARROW;So;0;ON;;;;;N;;;;; +1F876;WIDE-HEADED SOUTH EAST MEDIUM BARB ARROW;So;0;ON;;;;;N;;;;; +1F877;WIDE-HEADED SOUTH WEST MEDIUM BARB ARROW;So;0;ON;;;;;N;;;;; +1F878;WIDE-HEADED LEFTWARDS HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; +1F879;WIDE-HEADED UPWARDS HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; +1F87A;WIDE-HEADED RIGHTWARDS HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; +1F87B;WIDE-HEADED DOWNWARDS HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; +1F87C;WIDE-HEADED NORTH WEST HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; +1F87D;WIDE-HEADED NORTH EAST HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; +1F87E;WIDE-HEADED SOUTH EAST HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; +1F87F;WIDE-HEADED SOUTH WEST HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; +1F880;WIDE-HEADED LEFTWARDS VERY HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; +1F881;WIDE-HEADED UPWARDS VERY HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; +1F882;WIDE-HEADED RIGHTWARDS VERY HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; +1F883;WIDE-HEADED DOWNWARDS VERY HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; +1F884;WIDE-HEADED NORTH WEST VERY HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; +1F885;WIDE-HEADED NORTH EAST VERY HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; +1F886;WIDE-HEADED SOUTH EAST VERY HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; +1F887;WIDE-HEADED SOUTH WEST VERY HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; +1F890;LEFTWARDS TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F891;UPWARDS TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F892;RIGHTWARDS TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F893;DOWNWARDS TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F894;LEFTWARDS WHITE ARROW WITHIN TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F895;UPWARDS WHITE ARROW WITHIN TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F896;RIGHTWARDS WHITE ARROW WITHIN TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F897;DOWNWARDS WHITE ARROW WITHIN TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F898;LEFTWARDS ARROW WITH NOTCHED TAIL;So;0;ON;;;;;N;;;;; +1F899;UPWARDS ARROW WITH NOTCHED TAIL;So;0;ON;;;;;N;;;;; +1F89A;RIGHTWARDS ARROW WITH NOTCHED TAIL;So;0;ON;;;;;N;;;;; +1F89B;DOWNWARDS ARROW WITH NOTCHED TAIL;So;0;ON;;;;;N;;;;; +1F89C;HEAVY ARROW SHAFT WIDTH ONE;So;0;ON;;;;;N;;;;; +1F89D;HEAVY ARROW SHAFT WIDTH TWO THIRDS;So;0;ON;;;;;N;;;;; +1F89E;HEAVY ARROW SHAFT WIDTH ONE HALF;So;0;ON;;;;;N;;;;; +1F89F;HEAVY ARROW SHAFT WIDTH ONE THIRD;So;0;ON;;;;;N;;;;; +1F8A0;LEFTWARDS BOTTOM-SHADED WHITE ARROW;So;0;ON;;;;;N;;;;; +1F8A1;RIGHTWARDS BOTTOM SHADED WHITE ARROW;So;0;ON;;;;;N;;;;; +1F8A2;LEFTWARDS TOP SHADED WHITE ARROW;So;0;ON;;;;;N;;;;; +1F8A3;RIGHTWARDS TOP SHADED WHITE ARROW;So;0;ON;;;;;N;;;;; +1F8A4;LEFTWARDS LEFT-SHADED WHITE ARROW;So;0;ON;;;;;N;;;;; +1F8A5;RIGHTWARDS RIGHT-SHADED WHITE ARROW;So;0;ON;;;;;N;;;;; +1F8A6;LEFTWARDS RIGHT-SHADED WHITE ARROW;So;0;ON;;;;;N;;;;; +1F8A7;RIGHTWARDS LEFT-SHADED WHITE ARROW;So;0;ON;;;;;N;;;;; +1F8A8;LEFTWARDS BACK-TILTED SHADOWED WHITE ARROW;So;0;ON;;;;;N;;;;; +1F8A9;RIGHTWARDS BACK-TILTED SHADOWED WHITE ARROW;So;0;ON;;;;;N;;;;; +1F8AA;LEFTWARDS FRONT-TILTED SHADOWED WHITE ARROW;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;;;;; +1F913;NERD FACE;So;0;ON;;;;;N;;;;; +1F914;THINKING FACE;So;0;ON;;;;;N;;;;; +1F915;FACE WITH HEAD-BANDAGE;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;;;;; +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;;;;; +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;;;;; +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;;;;; +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;;;;; +1F94C;CURLING STONE;So;0;ON;;;;;N;;;;; +1F94D;LACROSSE STICK AND BALL;So;0;ON;;;;;N;;;;; +1F94E;SOFTBALL;So;0;ON;;;;;N;;;;; +1F94F;FLYING DISC;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;;;;; +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;;;;; +1F96C;LEAFY GREEN;So;0;ON;;;;;N;;;;; +1F96D;MANGO;So;0;ON;;;;;N;;;;; +1F96E;MOON CAKE;So;0;ON;;;;;N;;;;; +1F96F;BAGEL;So;0;ON;;;;;N;;;;; +1F970;SMILING FACE WITH SMILING EYES AND THREE HEARTS;So;0;ON;;;;;N;;;;; +1F973;FACE WITH PARTY HORN AND PARTY HAT;So;0;ON;;;;;N;;;;; +1F974;FACE WITH UNEVEN EYES AND WAVY MOUTH;So;0;ON;;;;;N;;;;; +1F975;OVERHEATED FACE;So;0;ON;;;;;N;;;;; +1F976;FREEZING FACE;So;0;ON;;;;;N;;;;; +1F97A;FACE WITH PLEADING EYES;So;0;ON;;;;;N;;;;; +1F97C;LAB COAT;So;0;ON;;;;;N;;;;; +1F97D;GOGGLES;So;0;ON;;;;;N;;;;; +1F97E;HIKING BOOT;So;0;ON;;;;;N;;;;; +1F97F;FLAT SHOE;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;;;;; +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;;;;; +1F998;KANGAROO;So;0;ON;;;;;N;;;;; +1F999;LLAMA;So;0;ON;;;;;N;;;;; +1F99A;PEACOCK;So;0;ON;;;;;N;;;;; +1F99B;HIPPOPOTAMUS;So;0;ON;;;;;N;;;;; +1F99C;PARROT;So;0;ON;;;;;N;;;;; +1F99D;RACCOON;So;0;ON;;;;;N;;;;; +1F99E;LOBSTER;So;0;ON;;;;;N;;;;; +1F99F;MOSQUITO;So;0;ON;;;;;N;;;;; +1F9A0;MICROBE;So;0;ON;;;;;N;;;;; +1F9A1;BADGER;So;0;ON;;;;;N;;;;; +1F9A2;SWAN;So;0;ON;;;;;N;;;;; +1F9B0;EMOJI COMPONENT RED HAIR;So;0;ON;;;;;N;;;;; +1F9B1;EMOJI COMPONENT CURLY HAIR;So;0;ON;;;;;N;;;;; +1F9B2;EMOJI COMPONENT BALD;So;0;ON;;;;;N;;;;; +1F9B3;EMOJI COMPONENT WHITE HAIR;So;0;ON;;;;;N;;;;; +1F9B4;BONE;So;0;ON;;;;;N;;;;; +1F9B5;LEG;So;0;ON;;;;;N;;;;; +1F9B6;FOOT;So;0;ON;;;;;N;;;;; +1F9B7;TOOTH;So;0;ON;;;;;N;;;;; +1F9B8;SUPERHERO;So;0;ON;;;;;N;;;;; +1F9B9;SUPERVILLAIN;So;0;ON;;;;;N;;;;; +1F9C0;CHEESE WEDGE;So;0;ON;;;;;N;;;;; +1F9C1;CUPCAKE;So;0;ON;;;;;N;;;;; +1F9C2;SALT SHAKER;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;;;;; +1F9E7;RED GIFT ENVELOPE;So;0;ON;;;;;N;;;;; +1F9E8;FIRECRACKER;So;0;ON;;;;;N;;;;; +1F9E9;JIGSAW PUZZLE PIECE;So;0;ON;;;;;N;;;;; +1F9EA;TEST TUBE;So;0;ON;;;;;N;;;;; +1F9EB;PETRI DISH;So;0;ON;;;;;N;;;;; +1F9EC;DNA DOUBLE HELIX;So;0;ON;;;;;N;;;;; +1F9ED;COMPASS;So;0;ON;;;;;N;;;;; +1F9EE;ABACUS;So;0;ON;;;;;N;;;;; +1F9EF;FIRE EXTINGUISHER;So;0;ON;;;;;N;;;;; +1F9F0;TOOLBOX;So;0;ON;;;;;N;;;;; +1F9F1;BRICK;So;0;ON;;;;;N;;;;; +1F9F2;MAGNET;So;0;ON;;;;;N;;;;; +1F9F3;LUGGAGE;So;0;ON;;;;;N;;;;; +1F9F4;LOTION BOTTLE;So;0;ON;;;;;N;;;;; +1F9F5;SPOOL OF THREAD;So;0;ON;;;;;N;;;;; +1F9F6;BALL OF YARN;So;0;ON;;;;;N;;;;; +1F9F7;SAFETY PIN;So;0;ON;;;;;N;;;;; +1F9F8;TEDDY BEAR;So;0;ON;;;;;N;;;;; +1F9F9;BROOM;So;0;ON;;;;;N;;;;; +1F9FA;BASKET;So;0;ON;;;;;N;;;;; +1F9FB;ROLL OF PAPER;So;0;ON;;;;;N;;;;; +1F9FC;BAR OF SOAP;So;0;ON;;;;;N;;;;; +1F9FD;SPONGE;So;0;ON;;;;;N;;;;; +1F9FE;RECEIPT;So;0;ON;;;;;N;;;;; +1F9FF;NAZAR AMULET;So;0;ON;;;;;N;;;;; +1FA60;XIANGQI RED GENERAL;So;0;ON;;;;;N;;;;; +1FA61;XIANGQI RED MANDARIN;So;0;ON;;;;;N;;;;; +1FA62;XIANGQI RED ELEPHANT;So;0;ON;;;;;N;;;;; +1FA63;XIANGQI RED HORSE;So;0;ON;;;;;N;;;;; +1FA64;XIANGQI RED CHARIOT;So;0;ON;;;;;N;;;;; +1FA65;XIANGQI RED CANNON;So;0;ON;;;;;N;;;;; +1FA66;XIANGQI RED SOLDIER;So;0;ON;;;;;N;;;;; +1FA67;XIANGQI BLACK GENERAL;So;0;ON;;;;;N;;;;; +1FA68;XIANGQI BLACK MANDARIN;So;0;ON;;;;;N;;;;; +1FA69;XIANGQI BLACK ELEPHANT;So;0;ON;;;;;N;;;;; +1FA6A;XIANGQI BLACK HORSE;So;0;ON;;;;;N;;;;; +1FA6B;XIANGQI BLACK CHARIOT;So;0;ON;;;;;N;;;;; +1FA6C;XIANGQI BLACK CANNON;So;0;ON;;;;;N;;;;; +1FA6D;XIANGQI BLACK SOLDIER;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;;;;; +2B734;<CJK Ideograph Extension C, Last>;Lo;0;L;;;;;N;;;;; +2B740;<CJK Ideograph Extension D, First>;Lo;0;L;;;;;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;;;;; +2F803;CJK COMPATIBILITY IDEOGRAPH-2F803;Lo;0;L;20122;;;;N;;;;; +2F804;CJK COMPATIBILITY IDEOGRAPH-2F804;Lo;0;L;4F60;;;;N;;;;; +2F805;CJK COMPATIBILITY IDEOGRAPH-2F805;Lo;0;L;4FAE;;;;N;;;;; +2F806;CJK COMPATIBILITY IDEOGRAPH-2F806;Lo;0;L;4FBB;;;;N;;;;; +2F807;CJK COMPATIBILITY IDEOGRAPH-2F807;Lo;0;L;5002;;;;N;;;;; +2F808;CJK COMPATIBILITY IDEOGRAPH-2F808;Lo;0;L;507A;;;;N;;;;; +2F809;CJK COMPATIBILITY IDEOGRAPH-2F809;Lo;0;L;5099;;;;N;;;;; +2F80A;CJK COMPATIBILITY IDEOGRAPH-2F80A;Lo;0;L;50E7;;;;N;;;;; +2F80B;CJK COMPATIBILITY IDEOGRAPH-2F80B;Lo;0;L;50CF;;;;N;;;;; +2F80C;CJK COMPATIBILITY IDEOGRAPH-2F80C;Lo;0;L;349E;;;;N;;;;; +2F80D;CJK COMPATIBILITY IDEOGRAPH-2F80D;Lo;0;L;2063A;;;;N;;;;; +2F80E;CJK COMPATIBILITY IDEOGRAPH-2F80E;Lo;0;L;514D;;;;N;;;;; +2F80F;CJK COMPATIBILITY IDEOGRAPH-2F80F;Lo;0;L;5154;;;;N;;;;; +2F810;CJK COMPATIBILITY IDEOGRAPH-2F810;Lo;0;L;5164;;;;N;;;;; +2F811;CJK COMPATIBILITY IDEOGRAPH-2F811;Lo;0;L;5177;;;;N;;;;; +2F812;CJK COMPATIBILITY IDEOGRAPH-2F812;Lo;0;L;2051C;;;;N;;;;; +2F813;CJK COMPATIBILITY IDEOGRAPH-2F813;Lo;0;L;34B9;;;;N;;;;; +2F814;CJK COMPATIBILITY IDEOGRAPH-2F814;Lo;0;L;5167;;;;N;;;;; +2F815;CJK COMPATIBILITY IDEOGRAPH-2F815;Lo;0;L;518D;;;;N;;;;; +2F816;CJK COMPATIBILITY IDEOGRAPH-2F816;Lo;0;L;2054B;;;;N;;;;; +2F817;CJK COMPATIBILITY IDEOGRAPH-2F817;Lo;0;L;5197;;;;N;;;;; +2F818;CJK COMPATIBILITY IDEOGRAPH-2F818;Lo;0;L;51A4;;;;N;;;;; +2F819;CJK COMPATIBILITY IDEOGRAPH-2F819;Lo;0;L;4ECC;;;;N;;;;; +2F81A;CJK COMPATIBILITY IDEOGRAPH-2F81A;Lo;0;L;51AC;;;;N;;;;; +2F81B;CJK COMPATIBILITY IDEOGRAPH-2F81B;Lo;0;L;51B5;;;;N;;;;; +2F81C;CJK COMPATIBILITY IDEOGRAPH-2F81C;Lo;0;L;291DF;;;;N;;;;; +2F81D;CJK COMPATIBILITY IDEOGRAPH-2F81D;Lo;0;L;51F5;;;;N;;;;; +2F81E;CJK COMPATIBILITY IDEOGRAPH-2F81E;Lo;0;L;5203;;;;N;;;;; +2F81F;CJK COMPATIBILITY IDEOGRAPH-2F81F;Lo;0;L;34DF;;;;N;;;;; +2F820;CJK COMPATIBILITY IDEOGRAPH-2F820;Lo;0;L;523B;;;;N;;;;; +2F821;CJK COMPATIBILITY IDEOGRAPH-2F821;Lo;0;L;5246;;;;N;;;;; +2F822;CJK COMPATIBILITY IDEOGRAPH-2F822;Lo;0;L;5272;;;;N;;;;; +2F823;CJK COMPATIBILITY IDEOGRAPH-2F823;Lo;0;L;5277;;;;N;;;;; +2F824;CJK COMPATIBILITY IDEOGRAPH-2F824;Lo;0;L;3515;;;;N;;;;; +2F825;CJK COMPATIBILITY IDEOGRAPH-2F825;Lo;0;L;52C7;;;;N;;;;; +2F826;CJK COMPATIBILITY IDEOGRAPH-2F826;Lo;0;L;52C9;;;;N;;;;; +2F827;CJK COMPATIBILITY IDEOGRAPH-2F827;Lo;0;L;52E4;;;;N;;;;; +2F828;CJK COMPATIBILITY IDEOGRAPH-2F828;Lo;0;L;52FA;;;;N;;;;; +2F829;CJK COMPATIBILITY IDEOGRAPH-2F829;Lo;0;L;5305;;;;N;;;;; +2F82A;CJK COMPATIBILITY IDEOGRAPH-2F82A;Lo;0;L;5306;;;;N;;;;; +2F82B;CJK COMPATIBILITY IDEOGRAPH-2F82B;Lo;0;L;5317;;;;N;;;;; +2F82C;CJK COMPATIBILITY IDEOGRAPH-2F82C;Lo;0;L;5349;;;;N;;;;; +2F82D;CJK COMPATIBILITY IDEOGRAPH-2F82D;Lo;0;L;5351;;;;N;;;;; +2F82E;CJK COMPATIBILITY IDEOGRAPH-2F82E;Lo;0;L;535A;;;;N;;;;; +2F82F;CJK COMPATIBILITY IDEOGRAPH-2F82F;Lo;0;L;5373;;;;N;;;;; +2F830;CJK COMPATIBILITY IDEOGRAPH-2F830;Lo;0;L;537D;;;;N;;;;; +2F831;CJK COMPATIBILITY IDEOGRAPH-2F831;Lo;0;L;537F;;;;N;;;;; +2F832;CJK COMPATIBILITY IDEOGRAPH-2F832;Lo;0;L;537F;;;;N;;;;; +2F833;CJK COMPATIBILITY IDEOGRAPH-2F833;Lo;0;L;537F;;;;N;;;;; +2F834;CJK COMPATIBILITY IDEOGRAPH-2F834;Lo;0;L;20A2C;;;;N;;;;; +2F835;CJK COMPATIBILITY IDEOGRAPH-2F835;Lo;0;L;7070;;;;N;;;;; +2F836;CJK COMPATIBILITY IDEOGRAPH-2F836;Lo;0;L;53CA;;;;N;;;;; +2F837;CJK COMPATIBILITY IDEOGRAPH-2F837;Lo;0;L;53DF;;;;N;;;;; +2F838;CJK COMPATIBILITY IDEOGRAPH-2F838;Lo;0;L;20B63;;;;N;;;;; +2F839;CJK COMPATIBILITY IDEOGRAPH-2F839;Lo;0;L;53EB;;;;N;;;;; +2F83A;CJK COMPATIBILITY IDEOGRAPH-2F83A;Lo;0;L;53F1;;;;N;;;;; +2F83B;CJK COMPATIBILITY IDEOGRAPH-2F83B;Lo;0;L;5406;;;;N;;;;; +2F83C;CJK COMPATIBILITY IDEOGRAPH-2F83C;Lo;0;L;549E;;;;N;;;;; +2F83D;CJK COMPATIBILITY IDEOGRAPH-2F83D;Lo;0;L;5438;;;;N;;;;; +2F83E;CJK COMPATIBILITY IDEOGRAPH-2F83E;Lo;0;L;5448;;;;N;;;;; +2F83F;CJK COMPATIBILITY IDEOGRAPH-2F83F;Lo;0;L;5468;;;;N;;;;; +2F840;CJK COMPATIBILITY IDEOGRAPH-2F840;Lo;0;L;54A2;;;;N;;;;; +2F841;CJK COMPATIBILITY IDEOGRAPH-2F841;Lo;0;L;54F6;;;;N;;;;; +2F842;CJK COMPATIBILITY IDEOGRAPH-2F842;Lo;0;L;5510;;;;N;;;;; +2F843;CJK COMPATIBILITY IDEOGRAPH-2F843;Lo;0;L;5553;;;;N;;;;; +2F844;CJK COMPATIBILITY IDEOGRAPH-2F844;Lo;0;L;5563;;;;N;;;;; +2F845;CJK COMPATIBILITY IDEOGRAPH-2F845;Lo;0;L;5584;;;;N;;;;; +2F846;CJK COMPATIBILITY IDEOGRAPH-2F846;Lo;0;L;5584;;;;N;;;;; +2F847;CJK COMPATIBILITY IDEOGRAPH-2F847;Lo;0;L;5599;;;;N;;;;; +2F848;CJK COMPATIBILITY IDEOGRAPH-2F848;Lo;0;L;55AB;;;;N;;;;; +2F849;CJK COMPATIBILITY IDEOGRAPH-2F849;Lo;0;L;55B3;;;;N;;;;; +2F84A;CJK COMPATIBILITY IDEOGRAPH-2F84A;Lo;0;L;55C2;;;;N;;;;; +2F84B;CJK COMPATIBILITY IDEOGRAPH-2F84B;Lo;0;L;5716;;;;N;;;;; +2F84C;CJK COMPATIBILITY IDEOGRAPH-2F84C;Lo;0;L;5606;;;;N;;;;; +2F84D;CJK COMPATIBILITY IDEOGRAPH-2F84D;Lo;0;L;5717;;;;N;;;;; +2F84E;CJK COMPATIBILITY IDEOGRAPH-2F84E;Lo;0;L;5651;;;;N;;;;; +2F84F;CJK COMPATIBILITY IDEOGRAPH-2F84F;Lo;0;L;5674;;;;N;;;;; +2F850;CJK COMPATIBILITY IDEOGRAPH-2F850;Lo;0;L;5207;;;;N;;;;; +2F851;CJK COMPATIBILITY IDEOGRAPH-2F851;Lo;0;L;58EE;;;;N;;;;; +2F852;CJK COMPATIBILITY IDEOGRAPH-2F852;Lo;0;L;57CE;;;;N;;;;; +2F853;CJK COMPATIBILITY IDEOGRAPH-2F853;Lo;0;L;57F4;;;;N;;;;; +2F854;CJK COMPATIBILITY IDEOGRAPH-2F854;Lo;0;L;580D;;;;N;;;;; +2F855;CJK COMPATIBILITY IDEOGRAPH-2F855;Lo;0;L;578B;;;;N;;;;; +2F856;CJK COMPATIBILITY IDEOGRAPH-2F856;Lo;0;L;5832;;;;N;;;;; +2F857;CJK COMPATIBILITY IDEOGRAPH-2F857;Lo;0;L;5831;;;;N;;;;; +2F858;CJK COMPATIBILITY IDEOGRAPH-2F858;Lo;0;L;58AC;;;;N;;;;; +2F859;CJK COMPATIBILITY IDEOGRAPH-2F859;Lo;0;L;214E4;;;;N;;;;; +2F85A;CJK COMPATIBILITY IDEOGRAPH-2F85A;Lo;0;L;58F2;;;;N;;;;; +2F85B;CJK COMPATIBILITY IDEOGRAPH-2F85B;Lo;0;L;58F7;;;;N;;;;; +2F85C;CJK COMPATIBILITY IDEOGRAPH-2F85C;Lo;0;L;5906;;;;N;;;;; +2F85D;CJK COMPATIBILITY IDEOGRAPH-2F85D;Lo;0;L;591A;;;;N;;;;; +2F85E;CJK COMPATIBILITY IDEOGRAPH-2F85E;Lo;0;L;5922;;;;N;;;;; +2F85F;CJK COMPATIBILITY IDEOGRAPH-2F85F;Lo;0;L;5962;;;;N;;;;; +2F860;CJK COMPATIBILITY IDEOGRAPH-2F860;Lo;0;L;216A8;;;;N;;;;; +2F861;CJK COMPATIBILITY IDEOGRAPH-2F861;Lo;0;L;216EA;;;;N;;;;; +2F862;CJK COMPATIBILITY IDEOGRAPH-2F862;Lo;0;L;59EC;;;;N;;;;; +2F863;CJK COMPATIBILITY IDEOGRAPH-2F863;Lo;0;L;5A1B;;;;N;;;;; +2F864;CJK COMPATIBILITY IDEOGRAPH-2F864;Lo;0;L;5A27;;;;N;;;;; +2F865;CJK COMPATIBILITY IDEOGRAPH-2F865;Lo;0;L;59D8;;;;N;;;;; +2F866;CJK COMPATIBILITY IDEOGRAPH-2F866;Lo;0;L;5A66;;;;N;;;;; +2F867;CJK COMPATIBILITY IDEOGRAPH-2F867;Lo;0;L;36EE;;;;N;;;;; +2F868;CJK COMPATIBILITY IDEOGRAPH-2F868;Lo;0;L;36FC;;;;N;;;;; +2F869;CJK COMPATIBILITY IDEOGRAPH-2F869;Lo;0;L;5B08;;;;N;;;;; +2F86A;CJK COMPATIBILITY IDEOGRAPH-2F86A;Lo;0;L;5B3E;;;;N;;;;; +2F86B;CJK COMPATIBILITY IDEOGRAPH-2F86B;Lo;0;L;5B3E;;;;N;;;;; +2F86C;CJK COMPATIBILITY IDEOGRAPH-2F86C;Lo;0;L;219C8;;;;N;;;;; +2F86D;CJK COMPATIBILITY IDEOGRAPH-2F86D;Lo;0;L;5BC3;;;;N;;;;; +2F86E;CJK COMPATIBILITY IDEOGRAPH-2F86E;Lo;0;L;5BD8;;;;N;;;;; +2F86F;CJK COMPATIBILITY IDEOGRAPH-2F86F;Lo;0;L;5BE7;;;;N;;;;; +2F870;CJK COMPATIBILITY IDEOGRAPH-2F870;Lo;0;L;5BF3;;;;N;;;;; +2F871;CJK COMPATIBILITY IDEOGRAPH-2F871;Lo;0;L;21B18;;;;N;;;;; +2F872;CJK COMPATIBILITY IDEOGRAPH-2F872;Lo;0;L;5BFF;;;;N;;;;; +2F873;CJK COMPATIBILITY IDEOGRAPH-2F873;Lo;0;L;5C06;;;;N;;;;; +2F874;CJK COMPATIBILITY IDEOGRAPH-2F874;Lo;0;L;5F53;;;;N;;;;; +2F875;CJK COMPATIBILITY IDEOGRAPH-2F875;Lo;0;L;5C22;;;;N;;;;; +2F876;CJK COMPATIBILITY IDEOGRAPH-2F876;Lo;0;L;3781;;;;N;;;;; +2F877;CJK COMPATIBILITY IDEOGRAPH-2F877;Lo;0;L;5C60;;;;N;;;;; +2F878;CJK COMPATIBILITY IDEOGRAPH-2F878;Lo;0;L;5C6E;;;;N;;;;; +2F879;CJK COMPATIBILITY IDEOGRAPH-2F879;Lo;0;L;5CC0;;;;N;;;;; +2F87A;CJK COMPATIBILITY IDEOGRAPH-2F87A;Lo;0;L;5C8D;;;;N;;;;; +2F87B;CJK COMPATIBILITY IDEOGRAPH-2F87B;Lo;0;L;21DE4;;;;N;;;;; +2F87C;CJK COMPATIBILITY IDEOGRAPH-2F87C;Lo;0;L;5D43;;;;N;;;;; +2F87D;CJK COMPATIBILITY IDEOGRAPH-2F87D;Lo;0;L;21DE6;;;;N;;;;; +2F87E;CJK COMPATIBILITY IDEOGRAPH-2F87E;Lo;0;L;5D6E;;;;N;;;;; +2F87F;CJK COMPATIBILITY IDEOGRAPH-2F87F;Lo;0;L;5D6B;;;;N;;;;; +2F880;CJK COMPATIBILITY IDEOGRAPH-2F880;Lo;0;L;5D7C;;;;N;;;;; +2F881;CJK COMPATIBILITY IDEOGRAPH-2F881;Lo;0;L;5DE1;;;;N;;;;; +2F882;CJK COMPATIBILITY IDEOGRAPH-2F882;Lo;0;L;5DE2;;;;N;;;;; +2F883;CJK COMPATIBILITY IDEOGRAPH-2F883;Lo;0;L;382F;;;;N;;;;; +2F884;CJK COMPATIBILITY IDEOGRAPH-2F884;Lo;0;L;5DFD;;;;N;;;;; +2F885;CJK COMPATIBILITY IDEOGRAPH-2F885;Lo;0;L;5E28;;;;N;;;;; +2F886;CJK COMPATIBILITY IDEOGRAPH-2F886;Lo;0;L;5E3D;;;;N;;;;; +2F887;CJK COMPATIBILITY IDEOGRAPH-2F887;Lo;0;L;5E69;;;;N;;;;; +2F888;CJK COMPATIBILITY IDEOGRAPH-2F888;Lo;0;L;3862;;;;N;;;;; +2F889;CJK COMPATIBILITY IDEOGRAPH-2F889;Lo;0;L;22183;;;;N;;;;; +2F88A;CJK COMPATIBILITY IDEOGRAPH-2F88A;Lo;0;L;387C;;;;N;;;;; +2F88B;CJK COMPATIBILITY IDEOGRAPH-2F88B;Lo;0;L;5EB0;;;;N;;;;; +2F88C;CJK COMPATIBILITY IDEOGRAPH-2F88C;Lo;0;L;5EB3;;;;N;;;;; +2F88D;CJK COMPATIBILITY IDEOGRAPH-2F88D;Lo;0;L;5EB6;;;;N;;;;; +2F88E;CJK COMPATIBILITY IDEOGRAPH-2F88E;Lo;0;L;5ECA;;;;N;;;;; +2F88F;CJK COMPATIBILITY IDEOGRAPH-2F88F;Lo;0;L;2A392;;;;N;;;;; +2F890;CJK COMPATIBILITY IDEOGRAPH-2F890;Lo;0;L;5EFE;;;9;N;;;;; +2F891;CJK COMPATIBILITY IDEOGRAPH-2F891;Lo;0;L;22331;;;;N;;;;; +2F892;CJK COMPATIBILITY IDEOGRAPH-2F892;Lo;0;L;22331;;;;N;;;;; +2F893;CJK COMPATIBILITY IDEOGRAPH-2F893;Lo;0;L;8201;;;;N;;;;; +2F894;CJK COMPATIBILITY IDEOGRAPH-2F894;Lo;0;L;5F22;;;;N;;;;; +2F895;CJK COMPATIBILITY IDEOGRAPH-2F895;Lo;0;L;5F22;;;;N;;;;; +2F896;CJK COMPATIBILITY IDEOGRAPH-2F896;Lo;0;L;38C7;;;;N;;;;; +2F897;CJK COMPATIBILITY IDEOGRAPH-2F897;Lo;0;L;232B8;;;;N;;;;; +2F898;CJK COMPATIBILITY IDEOGRAPH-2F898;Lo;0;L;261DA;;;;N;;;;; +2F899;CJK COMPATIBILITY IDEOGRAPH-2F899;Lo;0;L;5F62;;;;N;;;;; +2F89A;CJK COMPATIBILITY IDEOGRAPH-2F89A;Lo;0;L;5F6B;;;;N;;;;; +2F89B;CJK COMPATIBILITY IDEOGRAPH-2F89B;Lo;0;L;38E3;;;;N;;;;; +2F89C;CJK COMPATIBILITY IDEOGRAPH-2F89C;Lo;0;L;5F9A;;;;N;;;;; +2F89D;CJK COMPATIBILITY IDEOGRAPH-2F89D;Lo;0;L;5FCD;;;;N;;;;; +2F89E;CJK COMPATIBILITY IDEOGRAPH-2F89E;Lo;0;L;5FD7;;;;N;;;;; +2F89F;CJK COMPATIBILITY IDEOGRAPH-2F89F;Lo;0;L;5FF9;;;;N;;;;; +2F8A0;CJK COMPATIBILITY IDEOGRAPH-2F8A0;Lo;0;L;6081;;;;N;;;;; +2F8A1;CJK COMPATIBILITY IDEOGRAPH-2F8A1;Lo;0;L;393A;;;;N;;;;; +2F8A2;CJK COMPATIBILITY IDEOGRAPH-2F8A2;Lo;0;L;391C;;;;N;;;;; +2F8A3;CJK COMPATIBILITY IDEOGRAPH-2F8A3;Lo;0;L;6094;;;;N;;;;; +2F8A4;CJK COMPATIBILITY IDEOGRAPH-2F8A4;Lo;0;L;226D4;;;;N;;;;; +2F8A5;CJK COMPATIBILITY IDEOGRAPH-2F8A5;Lo;0;L;60C7;;;;N;;;;; +2F8A6;CJK COMPATIBILITY IDEOGRAPH-2F8A6;Lo;0;L;6148;;;;N;;;;; +2F8A7;CJK COMPATIBILITY IDEOGRAPH-2F8A7;Lo;0;L;614C;;;;N;;;;; +2F8A8;CJK COMPATIBILITY IDEOGRAPH-2F8A8;Lo;0;L;614E;;;;N;;;;; +2F8A9;CJK COMPATIBILITY IDEOGRAPH-2F8A9;Lo;0;L;614C;;;;N;;;;; +2F8AA;CJK COMPATIBILITY IDEOGRAPH-2F8AA;Lo;0;L;617A;;;;N;;;;; +2F8AB;CJK COMPATIBILITY IDEOGRAPH-2F8AB;Lo;0;L;618E;;;;N;;;;; +2F8AC;CJK COMPATIBILITY IDEOGRAPH-2F8AC;Lo;0;L;61B2;;;;N;;;;; +2F8AD;CJK COMPATIBILITY IDEOGRAPH-2F8AD;Lo;0;L;61A4;;;;N;;;;; +2F8AE;CJK COMPATIBILITY IDEOGRAPH-2F8AE;Lo;0;L;61AF;;;;N;;;;; +2F8AF;CJK COMPATIBILITY IDEOGRAPH-2F8AF;Lo;0;L;61DE;;;;N;;;;; +2F8B0;CJK COMPATIBILITY IDEOGRAPH-2F8B0;Lo;0;L;61F2;;;;N;;;;; +2F8B1;CJK COMPATIBILITY IDEOGRAPH-2F8B1;Lo;0;L;61F6;;;;N;;;;; +2F8B2;CJK COMPATIBILITY IDEOGRAPH-2F8B2;Lo;0;L;6210;;;;N;;;;; +2F8B3;CJK COMPATIBILITY IDEOGRAPH-2F8B3;Lo;0;L;621B;;;;N;;;;; +2F8B4;CJK COMPATIBILITY IDEOGRAPH-2F8B4;Lo;0;L;625D;;;;N;;;;; +2F8B5;CJK COMPATIBILITY IDEOGRAPH-2F8B5;Lo;0;L;62B1;;;;N;;;;; +2F8B6;CJK COMPATIBILITY IDEOGRAPH-2F8B6;Lo;0;L;62D4;;;;N;;;;; +2F8B7;CJK COMPATIBILITY IDEOGRAPH-2F8B7;Lo;0;L;6350;;;;N;;;;; +2F8B8;CJK COMPATIBILITY IDEOGRAPH-2F8B8;Lo;0;L;22B0C;;;;N;;;;; +2F8B9;CJK COMPATIBILITY IDEOGRAPH-2F8B9;Lo;0;L;633D;;;;N;;;;; +2F8BA;CJK COMPATIBILITY IDEOGRAPH-2F8BA;Lo;0;L;62FC;;;;N;;;;; +2F8BB;CJK COMPATIBILITY IDEOGRAPH-2F8BB;Lo;0;L;6368;;;;N;;;;; +2F8BC;CJK COMPATIBILITY IDEOGRAPH-2F8BC;Lo;0;L;6383;;;;N;;;;; +2F8BD;CJK COMPATIBILITY IDEOGRAPH-2F8BD;Lo;0;L;63E4;;;;N;;;;; +2F8BE;CJK COMPATIBILITY IDEOGRAPH-2F8BE;Lo;0;L;22BF1;;;;N;;;;; +2F8BF;CJK COMPATIBILITY IDEOGRAPH-2F8BF;Lo;0;L;6422;;;;N;;;;; +2F8C0;CJK COMPATIBILITY IDEOGRAPH-2F8C0;Lo;0;L;63C5;;;;N;;;;; +2F8C1;CJK COMPATIBILITY IDEOGRAPH-2F8C1;Lo;0;L;63A9;;;;N;;;;; +2F8C2;CJK COMPATIBILITY IDEOGRAPH-2F8C2;Lo;0;L;3A2E;;;;N;;;;; +2F8C3;CJK COMPATIBILITY IDEOGRAPH-2F8C3;Lo;0;L;6469;;;;N;;;;; +2F8C4;CJK COMPATIBILITY IDEOGRAPH-2F8C4;Lo;0;L;647E;;;;N;;;;; +2F8C5;CJK COMPATIBILITY IDEOGRAPH-2F8C5;Lo;0;L;649D;;;;N;;;;; +2F8C6;CJK COMPATIBILITY IDEOGRAPH-2F8C6;Lo;0;L;6477;;;;N;;;;; +2F8C7;CJK COMPATIBILITY IDEOGRAPH-2F8C7;Lo;0;L;3A6C;;;;N;;;;; +2F8C8;CJK COMPATIBILITY IDEOGRAPH-2F8C8;Lo;0;L;654F;;;;N;;;;; +2F8C9;CJK COMPATIBILITY IDEOGRAPH-2F8C9;Lo;0;L;656C;;;;N;;;;; +2F8CA;CJK COMPATIBILITY IDEOGRAPH-2F8CA;Lo;0;L;2300A;;;;N;;;;; +2F8CB;CJK COMPATIBILITY IDEOGRAPH-2F8CB;Lo;0;L;65E3;;;;N;;;;; +2F8CC;CJK COMPATIBILITY IDEOGRAPH-2F8CC;Lo;0;L;66F8;;;;N;;;;; +2F8CD;CJK COMPATIBILITY IDEOGRAPH-2F8CD;Lo;0;L;6649;;;;N;;;;; +2F8CE;CJK COMPATIBILITY IDEOGRAPH-2F8CE;Lo;0;L;3B19;;;;N;;;;; +2F8CF;CJK COMPATIBILITY IDEOGRAPH-2F8CF;Lo;0;L;6691;;;;N;;;;; +2F8D0;CJK COMPATIBILITY IDEOGRAPH-2F8D0;Lo;0;L;3B08;;;;N;;;;; +2F8D1;CJK COMPATIBILITY IDEOGRAPH-2F8D1;Lo;0;L;3AE4;;;;N;;;;; +2F8D2;CJK COMPATIBILITY IDEOGRAPH-2F8D2;Lo;0;L;5192;;;;N;;;;; +2F8D3;CJK COMPATIBILITY IDEOGRAPH-2F8D3;Lo;0;L;5195;;;;N;;;;; +2F8D4;CJK COMPATIBILITY IDEOGRAPH-2F8D4;Lo;0;L;6700;;;;N;;;;; +2F8D5;CJK COMPATIBILITY IDEOGRAPH-2F8D5;Lo;0;L;669C;;;;N;;;;; +2F8D6;CJK COMPATIBILITY IDEOGRAPH-2F8D6;Lo;0;L;80AD;;;;N;;;;; +2F8D7;CJK COMPATIBILITY IDEOGRAPH-2F8D7;Lo;0;L;43D9;;;;N;;;;; +2F8D8;CJK COMPATIBILITY IDEOGRAPH-2F8D8;Lo;0;L;6717;;;;N;;;;; +2F8D9;CJK COMPATIBILITY IDEOGRAPH-2F8D9;Lo;0;L;671B;;;;N;;;;; +2F8DA;CJK COMPATIBILITY IDEOGRAPH-2F8DA;Lo;0;L;6721;;;;N;;;;; +2F8DB;CJK COMPATIBILITY IDEOGRAPH-2F8DB;Lo;0;L;675E;;;;N;;;;; +2F8DC;CJK COMPATIBILITY IDEOGRAPH-2F8DC;Lo;0;L;6753;;;;N;;;;; +2F8DD;CJK COMPATIBILITY IDEOGRAPH-2F8DD;Lo;0;L;233C3;;;;N;;;;; +2F8DE;CJK COMPATIBILITY IDEOGRAPH-2F8DE;Lo;0;L;3B49;;;;N;;;;; +2F8DF;CJK COMPATIBILITY IDEOGRAPH-2F8DF;Lo;0;L;67FA;;;;N;;;;; +2F8E0;CJK COMPATIBILITY IDEOGRAPH-2F8E0;Lo;0;L;6785;;;;N;;;;; +2F8E1;CJK COMPATIBILITY IDEOGRAPH-2F8E1;Lo;0;L;6852;;;;N;;;;; +2F8E2;CJK COMPATIBILITY IDEOGRAPH-2F8E2;Lo;0;L;6885;;;;N;;;;; +2F8E3;CJK COMPATIBILITY IDEOGRAPH-2F8E3;Lo;0;L;2346D;;;;N;;;;; +2F8E4;CJK COMPATIBILITY IDEOGRAPH-2F8E4;Lo;0;L;688E;;;;N;;;;; +2F8E5;CJK COMPATIBILITY IDEOGRAPH-2F8E5;Lo;0;L;681F;;;;N;;;;; +2F8E6;CJK COMPATIBILITY IDEOGRAPH-2F8E6;Lo;0;L;6914;;;;N;;;;; +2F8E7;CJK COMPATIBILITY IDEOGRAPH-2F8E7;Lo;0;L;3B9D;;;;N;;;;; +2F8E8;CJK COMPATIBILITY IDEOGRAPH-2F8E8;Lo;0;L;6942;;;;N;;;;; +2F8E9;CJK COMPATIBILITY IDEOGRAPH-2F8E9;Lo;0;L;69A3;;;;N;;;;; +2F8EA;CJK COMPATIBILITY IDEOGRAPH-2F8EA;Lo;0;L;69EA;;;;N;;;;; +2F8EB;CJK COMPATIBILITY IDEOGRAPH-2F8EB;Lo;0;L;6AA8;;;;N;;;;; +2F8EC;CJK COMPATIBILITY IDEOGRAPH-2F8EC;Lo;0;L;236A3;;;;N;;;;; +2F8ED;CJK COMPATIBILITY IDEOGRAPH-2F8ED;Lo;0;L;6ADB;;;;N;;;;; +2F8EE;CJK COMPATIBILITY IDEOGRAPH-2F8EE;Lo;0;L;3C18;;;;N;;;;; +2F8EF;CJK COMPATIBILITY IDEOGRAPH-2F8EF;Lo;0;L;6B21;;;;N;;;;; +2F8F0;CJK COMPATIBILITY IDEOGRAPH-2F8F0;Lo;0;L;238A7;;;;N;;;;; +2F8F1;CJK COMPATIBILITY IDEOGRAPH-2F8F1;Lo;0;L;6B54;;;;N;;;;; +2F8F2;CJK COMPATIBILITY IDEOGRAPH-2F8F2;Lo;0;L;3C4E;;;;N;;;;; +2F8F3;CJK COMPATIBILITY IDEOGRAPH-2F8F3;Lo;0;L;6B72;;;;N;;;;; +2F8F4;CJK COMPATIBILITY IDEOGRAPH-2F8F4;Lo;0;L;6B9F;;;;N;;;;; +2F8F5;CJK COMPATIBILITY IDEOGRAPH-2F8F5;Lo;0;L;6BBA;;;;N;;;;; +2F8F6;CJK COMPATIBILITY IDEOGRAPH-2F8F6;Lo;0;L;6BBB;;;;N;;;;; +2F8F7;CJK COMPATIBILITY IDEOGRAPH-2F8F7;Lo;0;L;23A8D;;;;N;;;;; +2F8F8;CJK COMPATIBILITY IDEOGRAPH-2F8F8;Lo;0;L;21D0B;;;;N;;;;; +2F8F9;CJK COMPATIBILITY IDEOGRAPH-2F8F9;Lo;0;L;23AFA;;;;N;;;;; +2F8FA;CJK COMPATIBILITY IDEOGRAPH-2F8FA;Lo;0;L;6C4E;;;;N;;;;; +2F8FB;CJK COMPATIBILITY IDEOGRAPH-2F8FB;Lo;0;L;23CBC;;;;N;;;;; +2F8FC;CJK COMPATIBILITY IDEOGRAPH-2F8FC;Lo;0;L;6CBF;;;;N;;;;; +2F8FD;CJK COMPATIBILITY IDEOGRAPH-2F8FD;Lo;0;L;6CCD;;;;N;;;;; +2F8FE;CJK COMPATIBILITY IDEOGRAPH-2F8FE;Lo;0;L;6C67;;;;N;;;;; +2F8FF;CJK COMPATIBILITY IDEOGRAPH-2F8FF;Lo;0;L;6D16;;;;N;;;;; +2F900;CJK COMPATIBILITY IDEOGRAPH-2F900;Lo;0;L;6D3E;;;;N;;;;; +2F901;CJK COMPATIBILITY IDEOGRAPH-2F901;Lo;0;L;6D77;;;;N;;;;; +2F902;CJK COMPATIBILITY IDEOGRAPH-2F902;Lo;0;L;6D41;;;;N;;;;; +2F903;CJK COMPATIBILITY IDEOGRAPH-2F903;Lo;0;L;6D69;;;;N;;;;; +2F904;CJK COMPATIBILITY IDEOGRAPH-2F904;Lo;0;L;6D78;;;;N;;;;; +2F905;CJK COMPATIBILITY IDEOGRAPH-2F905;Lo;0;L;6D85;;;;N;;;;; +2F906;CJK COMPATIBILITY IDEOGRAPH-2F906;Lo;0;L;23D1E;;;;N;;;;; +2F907;CJK COMPATIBILITY IDEOGRAPH-2F907;Lo;0;L;6D34;;;;N;;;;; +2F908;CJK COMPATIBILITY IDEOGRAPH-2F908;Lo;0;L;6E2F;;;;N;;;;; +2F909;CJK COMPATIBILITY IDEOGRAPH-2F909;Lo;0;L;6E6E;;;;N;;;;; +2F90A;CJK COMPATIBILITY IDEOGRAPH-2F90A;Lo;0;L;3D33;;;;N;;;;; +2F90B;CJK COMPATIBILITY IDEOGRAPH-2F90B;Lo;0;L;6ECB;;;;N;;;;; +2F90C;CJK COMPATIBILITY IDEOGRAPH-2F90C;Lo;0;L;6EC7;;;;N;;;;; +2F90D;CJK COMPATIBILITY IDEOGRAPH-2F90D;Lo;0;L;23ED1;;;;N;;;;; +2F90E;CJK COMPATIBILITY IDEOGRAPH-2F90E;Lo;0;L;6DF9;;;;N;;;;; +2F90F;CJK COMPATIBILITY IDEOGRAPH-2F90F;Lo;0;L;6F6E;;;;N;;;;; +2F910;CJK COMPATIBILITY IDEOGRAPH-2F910;Lo;0;L;23F5E;;;;N;;;;; +2F911;CJK COMPATIBILITY IDEOGRAPH-2F911;Lo;0;L;23F8E;;;;N;;;;; +2F912;CJK COMPATIBILITY IDEOGRAPH-2F912;Lo;0;L;6FC6;;;;N;;;;; +2F913;CJK COMPATIBILITY IDEOGRAPH-2F913;Lo;0;L;7039;;;;N;;;;; +2F914;CJK COMPATIBILITY IDEOGRAPH-2F914;Lo;0;L;701E;;;;N;;;;; +2F915;CJK COMPATIBILITY IDEOGRAPH-2F915;Lo;0;L;701B;;;;N;;;;; +2F916;CJK COMPATIBILITY IDEOGRAPH-2F916;Lo;0;L;3D96;;;;N;;;;; +2F917;CJK COMPATIBILITY IDEOGRAPH-2F917;Lo;0;L;704A;;;;N;;;;; +2F918;CJK COMPATIBILITY IDEOGRAPH-2F918;Lo;0;L;707D;;;;N;;;;; +2F919;CJK COMPATIBILITY IDEOGRAPH-2F919;Lo;0;L;7077;;;;N;;;;; +2F91A;CJK COMPATIBILITY IDEOGRAPH-2F91A;Lo;0;L;70AD;;;;N;;;;; +2F91B;CJK COMPATIBILITY IDEOGRAPH-2F91B;Lo;0;L;20525;;;;N;;;;; +2F91C;CJK COMPATIBILITY IDEOGRAPH-2F91C;Lo;0;L;7145;;;;N;;;;; +2F91D;CJK COMPATIBILITY IDEOGRAPH-2F91D;Lo;0;L;24263;;;;N;;;;; +2F91E;CJK COMPATIBILITY IDEOGRAPH-2F91E;Lo;0;L;719C;;;;N;;;;; +2F91F;CJK COMPATIBILITY IDEOGRAPH-2F91F;Lo;0;L;243AB;;;;N;;;;; +2F920;CJK COMPATIBILITY IDEOGRAPH-2F920;Lo;0;L;7228;;;;N;;;;; +2F921;CJK COMPATIBILITY IDEOGRAPH-2F921;Lo;0;L;7235;;;;N;;;;; +2F922;CJK COMPATIBILITY IDEOGRAPH-2F922;Lo;0;L;7250;;;;N;;;;; +2F923;CJK COMPATIBILITY IDEOGRAPH-2F923;Lo;0;L;24608;;;;N;;;;; +2F924;CJK COMPATIBILITY IDEOGRAPH-2F924;Lo;0;L;7280;;;;N;;;;; +2F925;CJK COMPATIBILITY IDEOGRAPH-2F925;Lo;0;L;7295;;;;N;;;;; +2F926;CJK COMPATIBILITY IDEOGRAPH-2F926;Lo;0;L;24735;;;;N;;;;; +2F927;CJK COMPATIBILITY IDEOGRAPH-2F927;Lo;0;L;24814;;;;N;;;;; +2F928;CJK COMPATIBILITY IDEOGRAPH-2F928;Lo;0;L;737A;;;;N;;;;; +2F929;CJK COMPATIBILITY IDEOGRAPH-2F929;Lo;0;L;738B;;;;N;;;;; +2F92A;CJK COMPATIBILITY IDEOGRAPH-2F92A;Lo;0;L;3EAC;;;;N;;;;; +2F92B;CJK COMPATIBILITY IDEOGRAPH-2F92B;Lo;0;L;73A5;;;;N;;;;; +2F92C;CJK COMPATIBILITY IDEOGRAPH-2F92C;Lo;0;L;3EB8;;;;N;;;;; +2F92D;CJK COMPATIBILITY IDEOGRAPH-2F92D;Lo;0;L;3EB8;;;;N;;;;; +2F92E;CJK COMPATIBILITY IDEOGRAPH-2F92E;Lo;0;L;7447;;;;N;;;;; +2F92F;CJK COMPATIBILITY IDEOGRAPH-2F92F;Lo;0;L;745C;;;;N;;;;; +2F930;CJK COMPATIBILITY IDEOGRAPH-2F930;Lo;0;L;7471;;;;N;;;;; +2F931;CJK COMPATIBILITY IDEOGRAPH-2F931;Lo;0;L;7485;;;;N;;;;; +2F932;CJK COMPATIBILITY IDEOGRAPH-2F932;Lo;0;L;74CA;;;;N;;;;; +2F933;CJK COMPATIBILITY IDEOGRAPH-2F933;Lo;0;L;3F1B;;;;N;;;;; +2F934;CJK COMPATIBILITY IDEOGRAPH-2F934;Lo;0;L;7524;;;;N;;;;; +2F935;CJK COMPATIBILITY IDEOGRAPH-2F935;Lo;0;L;24C36;;;;N;;;;; +2F936;CJK COMPATIBILITY IDEOGRAPH-2F936;Lo;0;L;753E;;;;N;;;;; +2F937;CJK COMPATIBILITY IDEOGRAPH-2F937;Lo;0;L;24C92;;;;N;;;;; +2F938;CJK COMPATIBILITY IDEOGRAPH-2F938;Lo;0;L;7570;;;;N;;;;; +2F939;CJK COMPATIBILITY IDEOGRAPH-2F939;Lo;0;L;2219F;;;;N;;;;; +2F93A;CJK COMPATIBILITY IDEOGRAPH-2F93A;Lo;0;L;7610;;;;N;;;;; +2F93B;CJK COMPATIBILITY IDEOGRAPH-2F93B;Lo;0;L;24FA1;;;;N;;;;; +2F93C;CJK COMPATIBILITY IDEOGRAPH-2F93C;Lo;0;L;24FB8;;;;N;;;;; +2F93D;CJK COMPATIBILITY IDEOGRAPH-2F93D;Lo;0;L;25044;;;;N;;;;; +2F93E;CJK COMPATIBILITY IDEOGRAPH-2F93E;Lo;0;L;3FFC;;;;N;;;;; +2F93F;CJK COMPATIBILITY IDEOGRAPH-2F93F;Lo;0;L;4008;;;;N;;;;; +2F940;CJK COMPATIBILITY IDEOGRAPH-2F940;Lo;0;L;76F4;;;;N;;;;; +2F941;CJK COMPATIBILITY IDEOGRAPH-2F941;Lo;0;L;250F3;;;;N;;;;; +2F942;CJK COMPATIBILITY IDEOGRAPH-2F942;Lo;0;L;250F2;;;;N;;;;; +2F943;CJK COMPATIBILITY IDEOGRAPH-2F943;Lo;0;L;25119;;;;N;;;;; +2F944;CJK COMPATIBILITY IDEOGRAPH-2F944;Lo;0;L;25133;;;;N;;;;; +2F945;CJK COMPATIBILITY IDEOGRAPH-2F945;Lo;0;L;771E;;;;N;;;;; +2F946;CJK COMPATIBILITY IDEOGRAPH-2F946;Lo;0;L;771F;;;;N;;;;; +2F947;CJK COMPATIBILITY IDEOGRAPH-2F947;Lo;0;L;771F;;;;N;;;;; +2F948;CJK COMPATIBILITY IDEOGRAPH-2F948;Lo;0;L;774A;;;;N;;;;; +2F949;CJK COMPATIBILITY IDEOGRAPH-2F949;Lo;0;L;4039;;;;N;;;;; +2F94A;CJK COMPATIBILITY IDEOGRAPH-2F94A;Lo;0;L;778B;;;;N;;;;; +2F94B;CJK COMPATIBILITY IDEOGRAPH-2F94B;Lo;0;L;4046;;;;N;;;;; +2F94C;CJK COMPATIBILITY IDEOGRAPH-2F94C;Lo;0;L;4096;;;;N;;;;; +2F94D;CJK COMPATIBILITY IDEOGRAPH-2F94D;Lo;0;L;2541D;;;;N;;;;; +2F94E;CJK COMPATIBILITY IDEOGRAPH-2F94E;Lo;0;L;784E;;;;N;;;;; +2F94F;CJK COMPATIBILITY IDEOGRAPH-2F94F;Lo;0;L;788C;;;;N;;;;; +2F950;CJK COMPATIBILITY IDEOGRAPH-2F950;Lo;0;L;78CC;;;;N;;;;; +2F951;CJK COMPATIBILITY IDEOGRAPH-2F951;Lo;0;L;40E3;;;;N;;;;; +2F952;CJK COMPATIBILITY IDEOGRAPH-2F952;Lo;0;L;25626;;;;N;;;;; +2F953;CJK COMPATIBILITY IDEOGRAPH-2F953;Lo;0;L;7956;;;;N;;;;; +2F954;CJK COMPATIBILITY IDEOGRAPH-2F954;Lo;0;L;2569A;;;;N;;;;; +2F955;CJK COMPATIBILITY IDEOGRAPH-2F955;Lo;0;L;256C5;;;;N;;;;; +2F956;CJK COMPATIBILITY IDEOGRAPH-2F956;Lo;0;L;798F;;;;N;;;;; +2F957;CJK COMPATIBILITY IDEOGRAPH-2F957;Lo;0;L;79EB;;;;N;;;;; +2F958;CJK COMPATIBILITY IDEOGRAPH-2F958;Lo;0;L;412F;;;;N;;;;; +2F959;CJK COMPATIBILITY IDEOGRAPH-2F959;Lo;0;L;7A40;;;;N;;;;; +2F95A;CJK COMPATIBILITY IDEOGRAPH-2F95A;Lo;0;L;7A4A;;;;N;;;;; +2F95B;CJK COMPATIBILITY IDEOGRAPH-2F95B;Lo;0;L;7A4F;;;;N;;;;; +2F95C;CJK COMPATIBILITY IDEOGRAPH-2F95C;Lo;0;L;2597C;;;;N;;;;; +2F95D;CJK COMPATIBILITY IDEOGRAPH-2F95D;Lo;0;L;25AA7;;;;N;;;;; +2F95E;CJK COMPATIBILITY IDEOGRAPH-2F95E;Lo;0;L;25AA7;;;;N;;;;; +2F95F;CJK COMPATIBILITY IDEOGRAPH-2F95F;Lo;0;L;7AEE;;;;N;;;;; +2F960;CJK COMPATIBILITY IDEOGRAPH-2F960;Lo;0;L;4202;;;;N;;;;; +2F961;CJK COMPATIBILITY IDEOGRAPH-2F961;Lo;0;L;25BAB;;;;N;;;;; +2F962;CJK COMPATIBILITY IDEOGRAPH-2F962;Lo;0;L;7BC6;;;;N;;;;; +2F963;CJK COMPATIBILITY IDEOGRAPH-2F963;Lo;0;L;7BC9;;;;N;;;;; +2F964;CJK COMPATIBILITY IDEOGRAPH-2F964;Lo;0;L;4227;;;;N;;;;; +2F965;CJK COMPATIBILITY IDEOGRAPH-2F965;Lo;0;L;25C80;;;;N;;;;; +2F966;CJK COMPATIBILITY IDEOGRAPH-2F966;Lo;0;L;7CD2;;;;N;;;;; +2F967;CJK COMPATIBILITY IDEOGRAPH-2F967;Lo;0;L;42A0;;;;N;;;;; +2F968;CJK COMPATIBILITY IDEOGRAPH-2F968;Lo;0;L;7CE8;;;;N;;;;; +2F969;CJK COMPATIBILITY IDEOGRAPH-2F969;Lo;0;L;7CE3;;;;N;;;;; +2F96A;CJK COMPATIBILITY IDEOGRAPH-2F96A;Lo;0;L;7D00;;;;N;;;;; +2F96B;CJK COMPATIBILITY IDEOGRAPH-2F96B;Lo;0;L;25F86;;;;N;;;;; +2F96C;CJK COMPATIBILITY IDEOGRAPH-2F96C;Lo;0;L;7D63;;;;N;;;;; +2F96D;CJK COMPATIBILITY IDEOGRAPH-2F96D;Lo;0;L;4301;;;;N;;;;; +2F96E;CJK COMPATIBILITY IDEOGRAPH-2F96E;Lo;0;L;7DC7;;;;N;;;;; +2F96F;CJK COMPATIBILITY IDEOGRAPH-2F96F;Lo;0;L;7E02;;;;N;;;;; +2F970;CJK COMPATIBILITY IDEOGRAPH-2F970;Lo;0;L;7E45;;;;N;;;;; +2F971;CJK COMPATIBILITY IDEOGRAPH-2F971;Lo;0;L;4334;;;;N;;;;; +2F972;CJK COMPATIBILITY IDEOGRAPH-2F972;Lo;0;L;26228;;;;N;;;;; +2F973;CJK COMPATIBILITY IDEOGRAPH-2F973;Lo;0;L;26247;;;;N;;;;; +2F974;CJK COMPATIBILITY IDEOGRAPH-2F974;Lo;0;L;4359;;;;N;;;;; +2F975;CJK COMPATIBILITY IDEOGRAPH-2F975;Lo;0;L;262D9;;;;N;;;;; +2F976;CJK COMPATIBILITY IDEOGRAPH-2F976;Lo;0;L;7F7A;;;;N;;;;; +2F977;CJK COMPATIBILITY IDEOGRAPH-2F977;Lo;0;L;2633E;;;;N;;;;; +2F978;CJK COMPATIBILITY IDEOGRAPH-2F978;Lo;0;L;7F95;;;;N;;;;; +2F979;CJK COMPATIBILITY IDEOGRAPH-2F979;Lo;0;L;7FFA;;;;N;;;;; +2F97A;CJK COMPATIBILITY IDEOGRAPH-2F97A;Lo;0;L;8005;;;;N;;;;; +2F97B;CJK COMPATIBILITY IDEOGRAPH-2F97B;Lo;0;L;264DA;;;;N;;;;; +2F97C;CJK COMPATIBILITY IDEOGRAPH-2F97C;Lo;0;L;26523;;;;N;;;;; +2F97D;CJK COMPATIBILITY IDEOGRAPH-2F97D;Lo;0;L;8060;;;;N;;;;; +2F97E;CJK COMPATIBILITY IDEOGRAPH-2F97E;Lo;0;L;265A8;;;;N;;;;; +2F97F;CJK COMPATIBILITY IDEOGRAPH-2F97F;Lo;0;L;8070;;;;N;;;;; +2F980;CJK COMPATIBILITY IDEOGRAPH-2F980;Lo;0;L;2335F;;;;N;;;;; +2F981;CJK COMPATIBILITY IDEOGRAPH-2F981;Lo;0;L;43D5;;;;N;;;;; +2F982;CJK COMPATIBILITY IDEOGRAPH-2F982;Lo;0;L;80B2;;;;N;;;;; +2F983;CJK COMPATIBILITY IDEOGRAPH-2F983;Lo;0;L;8103;;;;N;;;;; +2F984;CJK COMPATIBILITY IDEOGRAPH-2F984;Lo;0;L;440B;;;;N;;;;; +2F985;CJK COMPATIBILITY IDEOGRAPH-2F985;Lo;0;L;813E;;;;N;;;;; +2F986;CJK COMPATIBILITY IDEOGRAPH-2F986;Lo;0;L;5AB5;;;;N;;;;; +2F987;CJK COMPATIBILITY IDEOGRAPH-2F987;Lo;0;L;267A7;;;;N;;;;; +2F988;CJK COMPATIBILITY IDEOGRAPH-2F988;Lo;0;L;267B5;;;;N;;;;; +2F989;CJK COMPATIBILITY IDEOGRAPH-2F989;Lo;0;L;23393;;;;N;;;;; +2F98A;CJK COMPATIBILITY IDEOGRAPH-2F98A;Lo;0;L;2339C;;;;N;;;;; +2F98B;CJK COMPATIBILITY IDEOGRAPH-2F98B;Lo;0;L;8201;;;;N;;;;; +2F98C;CJK COMPATIBILITY IDEOGRAPH-2F98C;Lo;0;L;8204;;;;N;;;;; +2F98D;CJK COMPATIBILITY IDEOGRAPH-2F98D;Lo;0;L;8F9E;;;;N;;;;; +2F98E;CJK COMPATIBILITY IDEOGRAPH-2F98E;Lo;0;L;446B;;;;N;;;;; +2F98F;CJK COMPATIBILITY IDEOGRAPH-2F98F;Lo;0;L;8291;;;;N;;;;; +2F990;CJK COMPATIBILITY IDEOGRAPH-2F990;Lo;0;L;828B;;;;N;;;;; +2F991;CJK COMPATIBILITY IDEOGRAPH-2F991;Lo;0;L;829D;;;;N;;;;; +2F992;CJK COMPATIBILITY IDEOGRAPH-2F992;Lo;0;L;52B3;;;;N;;;;; +2F993;CJK COMPATIBILITY IDEOGRAPH-2F993;Lo;0;L;82B1;;;;N;;;;; +2F994;CJK COMPATIBILITY IDEOGRAPH-2F994;Lo;0;L;82B3;;;;N;;;;; +2F995;CJK COMPATIBILITY IDEOGRAPH-2F995;Lo;0;L;82BD;;;;N;;;;; +2F996;CJK COMPATIBILITY IDEOGRAPH-2F996;Lo;0;L;82E6;;;;N;;;;; +2F997;CJK COMPATIBILITY IDEOGRAPH-2F997;Lo;0;L;26B3C;;;;N;;;;; +2F998;CJK COMPATIBILITY IDEOGRAPH-2F998;Lo;0;L;82E5;;;;N;;;;; +2F999;CJK COMPATIBILITY IDEOGRAPH-2F999;Lo;0;L;831D;;;;N;;;;; +2F99A;CJK COMPATIBILITY IDEOGRAPH-2F99A;Lo;0;L;8363;;;;N;;;;; +2F99B;CJK COMPATIBILITY IDEOGRAPH-2F99B;Lo;0;L;83AD;;;;N;;;;; +2F99C;CJK COMPATIBILITY IDEOGRAPH-2F99C;Lo;0;L;8323;;;;N;;;;; +2F99D;CJK COMPATIBILITY IDEOGRAPH-2F99D;Lo;0;L;83BD;;;;N;;;;; +2F99E;CJK COMPATIBILITY IDEOGRAPH-2F99E;Lo;0;L;83E7;;;;N;;;;; +2F99F;CJK COMPATIBILITY IDEOGRAPH-2F99F;Lo;0;L;8457;;;;N;;;;; +2F9A0;CJK COMPATIBILITY IDEOGRAPH-2F9A0;Lo;0;L;8353;;;;N;;;;; +2F9A1;CJK COMPATIBILITY IDEOGRAPH-2F9A1;Lo;0;L;83CA;;;;N;;;;; +2F9A2;CJK COMPATIBILITY IDEOGRAPH-2F9A2;Lo;0;L;83CC;;;;N;;;;; +2F9A3;CJK COMPATIBILITY IDEOGRAPH-2F9A3;Lo;0;L;83DC;;;;N;;;;; +2F9A4;CJK COMPATIBILITY IDEOGRAPH-2F9A4;Lo;0;L;26C36;;;;N;;;;; +2F9A5;CJK COMPATIBILITY IDEOGRAPH-2F9A5;Lo;0;L;26D6B;;;;N;;;;; +2F9A6;CJK COMPATIBILITY IDEOGRAPH-2F9A6;Lo;0;L;26CD5;;;;N;;;;; +2F9A7;CJK COMPATIBILITY IDEOGRAPH-2F9A7;Lo;0;L;452B;;;;N;;;;; +2F9A8;CJK COMPATIBILITY IDEOGRAPH-2F9A8;Lo;0;L;84F1;;;;N;;;;; +2F9A9;CJK COMPATIBILITY IDEOGRAPH-2F9A9;Lo;0;L;84F3;;;;N;;;;; +2F9AA;CJK COMPATIBILITY IDEOGRAPH-2F9AA;Lo;0;L;8516;;;;N;;;;; +2F9AB;CJK COMPATIBILITY IDEOGRAPH-2F9AB;Lo;0;L;273CA;;;;N;;;;; +2F9AC;CJK COMPATIBILITY IDEOGRAPH-2F9AC;Lo;0;L;8564;;;;N;;;;; +2F9AD;CJK COMPATIBILITY IDEOGRAPH-2F9AD;Lo;0;L;26F2C;;;;N;;;;; +2F9AE;CJK COMPATIBILITY IDEOGRAPH-2F9AE;Lo;0;L;455D;;;;N;;;;; +2F9AF;CJK COMPATIBILITY IDEOGRAPH-2F9AF;Lo;0;L;4561;;;;N;;;;; +2F9B0;CJK COMPATIBILITY IDEOGRAPH-2F9B0;Lo;0;L;26FB1;;;;N;;;;; +2F9B1;CJK COMPATIBILITY IDEOGRAPH-2F9B1;Lo;0;L;270D2;;;;N;;;;; +2F9B2;CJK COMPATIBILITY IDEOGRAPH-2F9B2;Lo;0;L;456B;;;;N;;;;; +2F9B3;CJK COMPATIBILITY IDEOGRAPH-2F9B3;Lo;0;L;8650;;;;N;;;;; +2F9B4;CJK COMPATIBILITY IDEOGRAPH-2F9B4;Lo;0;L;865C;;;;N;;;;; +2F9B5;CJK COMPATIBILITY IDEOGRAPH-2F9B5;Lo;0;L;8667;;;;N;;;;; +2F9B6;CJK COMPATIBILITY IDEOGRAPH-2F9B6;Lo;0;L;8669;;;;N;;;;; +2F9B7;CJK COMPATIBILITY IDEOGRAPH-2F9B7;Lo;0;L;86A9;;;;N;;;;; +2F9B8;CJK COMPATIBILITY IDEOGRAPH-2F9B8;Lo;0;L;8688;;;;N;;;;; +2F9B9;CJK COMPATIBILITY IDEOGRAPH-2F9B9;Lo;0;L;870E;;;;N;;;;; +2F9BA;CJK COMPATIBILITY IDEOGRAPH-2F9BA;Lo;0;L;86E2;;;;N;;;;; +2F9BB;CJK COMPATIBILITY IDEOGRAPH-2F9BB;Lo;0;L;8779;;;;N;;;;; +2F9BC;CJK COMPATIBILITY IDEOGRAPH-2F9BC;Lo;0;L;8728;;;;N;;;;; +2F9BD;CJK COMPATIBILITY IDEOGRAPH-2F9BD;Lo;0;L;876B;;;;N;;;;; +2F9BE;CJK COMPATIBILITY IDEOGRAPH-2F9BE;Lo;0;L;8786;;;;N;;;;; +2F9BF;CJK COMPATIBILITY IDEOGRAPH-2F9BF;Lo;0;L;45D7;;;;N;;;;; +2F9C0;CJK COMPATIBILITY IDEOGRAPH-2F9C0;Lo;0;L;87E1;;;;N;;;;; +2F9C1;CJK COMPATIBILITY IDEOGRAPH-2F9C1;Lo;0;L;8801;;;;N;;;;; +2F9C2;CJK COMPATIBILITY IDEOGRAPH-2F9C2;Lo;0;L;45F9;;;;N;;;;; +2F9C3;CJK COMPATIBILITY IDEOGRAPH-2F9C3;Lo;0;L;8860;;;;N;;;;; +2F9C4;CJK COMPATIBILITY IDEOGRAPH-2F9C4;Lo;0;L;8863;;;;N;;;;; +2F9C5;CJK COMPATIBILITY IDEOGRAPH-2F9C5;Lo;0;L;27667;;;;N;;;;; +2F9C6;CJK COMPATIBILITY IDEOGRAPH-2F9C6;Lo;0;L;88D7;;;;N;;;;; +2F9C7;CJK COMPATIBILITY IDEOGRAPH-2F9C7;Lo;0;L;88DE;;;;N;;;;; +2F9C8;CJK COMPATIBILITY IDEOGRAPH-2F9C8;Lo;0;L;4635;;;;N;;;;; +2F9C9;CJK COMPATIBILITY IDEOGRAPH-2F9C9;Lo;0;L;88FA;;;;N;;;;; +2F9CA;CJK COMPATIBILITY IDEOGRAPH-2F9CA;Lo;0;L;34BB;;;;N;;;;; +2F9CB;CJK COMPATIBILITY IDEOGRAPH-2F9CB;Lo;0;L;278AE;;;;N;;;;; +2F9CC;CJK COMPATIBILITY IDEOGRAPH-2F9CC;Lo;0;L;27966;;;;N;;;;; +2F9CD;CJK COMPATIBILITY IDEOGRAPH-2F9CD;Lo;0;L;46BE;;;;N;;;;; +2F9CE;CJK COMPATIBILITY IDEOGRAPH-2F9CE;Lo;0;L;46C7;;;;N;;;;; +2F9CF;CJK COMPATIBILITY IDEOGRAPH-2F9CF;Lo;0;L;8AA0;;;;N;;;;; +2F9D0;CJK COMPATIBILITY IDEOGRAPH-2F9D0;Lo;0;L;8AED;;;;N;;;;; +2F9D1;CJK COMPATIBILITY IDEOGRAPH-2F9D1;Lo;0;L;8B8A;;;;N;;;;; +2F9D2;CJK COMPATIBILITY IDEOGRAPH-2F9D2;Lo;0;L;8C55;;;;N;;;;; +2F9D3;CJK COMPATIBILITY IDEOGRAPH-2F9D3;Lo;0;L;27CA8;;;;N;;;;; +2F9D4;CJK COMPATIBILITY IDEOGRAPH-2F9D4;Lo;0;L;8CAB;;;;N;;;;; +2F9D5;CJK COMPATIBILITY IDEOGRAPH-2F9D5;Lo;0;L;8CC1;;;;N;;;;; +2F9D6;CJK COMPATIBILITY IDEOGRAPH-2F9D6;Lo;0;L;8D1B;;;;N;;;;; +2F9D7;CJK COMPATIBILITY IDEOGRAPH-2F9D7;Lo;0;L;8D77;;;;N;;;;; +2F9D8;CJK COMPATIBILITY IDEOGRAPH-2F9D8;Lo;0;L;27F2F;;;;N;;;;; +2F9D9;CJK COMPATIBILITY IDEOGRAPH-2F9D9;Lo;0;L;20804;;;;N;;;;; +2F9DA;CJK COMPATIBILITY IDEOGRAPH-2F9DA;Lo;0;L;8DCB;;;;N;;;;; +2F9DB;CJK COMPATIBILITY IDEOGRAPH-2F9DB;Lo;0;L;8DBC;;;;N;;;;; +2F9DC;CJK COMPATIBILITY IDEOGRAPH-2F9DC;Lo;0;L;8DF0;;;;N;;;;; +2F9DD;CJK COMPATIBILITY IDEOGRAPH-2F9DD;Lo;0;L;208DE;;;;N;;;;; +2F9DE;CJK COMPATIBILITY IDEOGRAPH-2F9DE;Lo;0;L;8ED4;;;;N;;;;; +2F9DF;CJK COMPATIBILITY IDEOGRAPH-2F9DF;Lo;0;L;8F38;;;;N;;;;; +2F9E0;CJK COMPATIBILITY IDEOGRAPH-2F9E0;Lo;0;L;285D2;;;;N;;;;; +2F9E1;CJK COMPATIBILITY IDEOGRAPH-2F9E1;Lo;0;L;285ED;;;;N;;;;; +2F9E2;CJK COMPATIBILITY IDEOGRAPH-2F9E2;Lo;0;L;9094;;;;N;;;;; +2F9E3;CJK COMPATIBILITY IDEOGRAPH-2F9E3;Lo;0;L;90F1;;;;N;;;;; +2F9E4;CJK COMPATIBILITY IDEOGRAPH-2F9E4;Lo;0;L;9111;;;;N;;;;; +2F9E5;CJK COMPATIBILITY IDEOGRAPH-2F9E5;Lo;0;L;2872E;;;;N;;;;; +2F9E6;CJK COMPATIBILITY IDEOGRAPH-2F9E6;Lo;0;L;911B;;;;N;;;;; +2F9E7;CJK COMPATIBILITY IDEOGRAPH-2F9E7;Lo;0;L;9238;;;;N;;;;; +2F9E8;CJK COMPATIBILITY IDEOGRAPH-2F9E8;Lo;0;L;92D7;;;;N;;;;; +2F9E9;CJK COMPATIBILITY IDEOGRAPH-2F9E9;Lo;0;L;92D8;;;;N;;;;; +2F9EA;CJK COMPATIBILITY IDEOGRAPH-2F9EA;Lo;0;L;927C;;;;N;;;;; +2F9EB;CJK COMPATIBILITY IDEOGRAPH-2F9EB;Lo;0;L;93F9;;;;N;;;;; +2F9EC;CJK COMPATIBILITY IDEOGRAPH-2F9EC;Lo;0;L;9415;;;;N;;;;; +2F9ED;CJK COMPATIBILITY IDEOGRAPH-2F9ED;Lo;0;L;28BFA;;;;N;;;;; +2F9EE;CJK COMPATIBILITY IDEOGRAPH-2F9EE;Lo;0;L;958B;;;;N;;;;; +2F9EF;CJK COMPATIBILITY IDEOGRAPH-2F9EF;Lo;0;L;4995;;;;N;;;;; +2F9F0;CJK COMPATIBILITY IDEOGRAPH-2F9F0;Lo;0;L;95B7;;;;N;;;;; +2F9F1;CJK COMPATIBILITY IDEOGRAPH-2F9F1;Lo;0;L;28D77;;;;N;;;;; +2F9F2;CJK COMPATIBILITY IDEOGRAPH-2F9F2;Lo;0;L;49E6;;;;N;;;;; +2F9F3;CJK COMPATIBILITY IDEOGRAPH-2F9F3;Lo;0;L;96C3;;;;N;;;;; +2F9F4;CJK COMPATIBILITY IDEOGRAPH-2F9F4;Lo;0;L;5DB2;;;;N;;;;; +2F9F5;CJK COMPATIBILITY IDEOGRAPH-2F9F5;Lo;0;L;9723;;;;N;;;;; +2F9F6;CJK COMPATIBILITY IDEOGRAPH-2F9F6;Lo;0;L;29145;;;;N;;;;; +2F9F7;CJK COMPATIBILITY IDEOGRAPH-2F9F7;Lo;0;L;2921A;;;;N;;;;; +2F9F8;CJK COMPATIBILITY IDEOGRAPH-2F9F8;Lo;0;L;4A6E;;;;N;;;;; +2F9F9;CJK COMPATIBILITY IDEOGRAPH-2F9F9;Lo;0;L;4A76;;;;N;;;;; +2F9FA;CJK COMPATIBILITY IDEOGRAPH-2F9FA;Lo;0;L;97E0;;;;N;;;;; +2F9FB;CJK COMPATIBILITY IDEOGRAPH-2F9FB;Lo;0;L;2940A;;;;N;;;;; +2F9FC;CJK COMPATIBILITY IDEOGRAPH-2F9FC;Lo;0;L;4AB2;;;;N;;;;; +2F9FD;CJK COMPATIBILITY IDEOGRAPH-2F9FD;Lo;0;L;29496;;;;N;;;;; +2F9FE;CJK COMPATIBILITY IDEOGRAPH-2F9FE;Lo;0;L;980B;;;;N;;;;; +2F9FF;CJK COMPATIBILITY IDEOGRAPH-2F9FF;Lo;0;L;980B;;;;N;;;;; +2FA00;CJK COMPATIBILITY IDEOGRAPH-2FA00;Lo;0;L;9829;;;;N;;;;; +2FA01;CJK COMPATIBILITY IDEOGRAPH-2FA01;Lo;0;L;295B6;;;;N;;;;; +2FA02;CJK COMPATIBILITY IDEOGRAPH-2FA02;Lo;0;L;98E2;;;;N;;;;; +2FA03;CJK COMPATIBILITY IDEOGRAPH-2FA03;Lo;0;L;4B33;;;;N;;;;; +2FA04;CJK COMPATIBILITY IDEOGRAPH-2FA04;Lo;0;L;9929;;;;N;;;;; +2FA05;CJK COMPATIBILITY IDEOGRAPH-2FA05;Lo;0;L;99A7;;;;N;;;;; +2FA06;CJK COMPATIBILITY IDEOGRAPH-2FA06;Lo;0;L;99C2;;;;N;;;;; +2FA07;CJK COMPATIBILITY IDEOGRAPH-2FA07;Lo;0;L;99FE;;;;N;;;;; +2FA08;CJK COMPATIBILITY IDEOGRAPH-2FA08;Lo;0;L;4BCE;;;;N;;;;; +2FA09;CJK COMPATIBILITY IDEOGRAPH-2FA09;Lo;0;L;29B30;;;;N;;;;; +2FA0A;CJK COMPATIBILITY IDEOGRAPH-2FA0A;Lo;0;L;9B12;;;;N;;;;; +2FA0B;CJK COMPATIBILITY IDEOGRAPH-2FA0B;Lo;0;L;9C40;;;;N;;;;; +2FA0C;CJK COMPATIBILITY IDEOGRAPH-2FA0C;Lo;0;L;9CFD;;;;N;;;;; +2FA0D;CJK COMPATIBILITY IDEOGRAPH-2FA0D;Lo;0;L;4CCE;;;;N;;;;; +2FA0E;CJK COMPATIBILITY IDEOGRAPH-2FA0E;Lo;0;L;4CED;;;;N;;;;; +2FA0F;CJK COMPATIBILITY IDEOGRAPH-2FA0F;Lo;0;L;9D67;;;;N;;;;; +2FA10;CJK COMPATIBILITY IDEOGRAPH-2FA10;Lo;0;L;2A0CE;;;;N;;;;; +2FA11;CJK COMPATIBILITY IDEOGRAPH-2FA11;Lo;0;L;4CF8;;;;N;;;;; +2FA12;CJK COMPATIBILITY IDEOGRAPH-2FA12;Lo;0;L;2A105;;;;N;;;;; +2FA13;CJK COMPATIBILITY IDEOGRAPH-2FA13;Lo;0;L;2A20E;;;;N;;;;; +2FA14;CJK COMPATIBILITY IDEOGRAPH-2FA14;Lo;0;L;2A291;;;;N;;;;; +2FA15;CJK COMPATIBILITY IDEOGRAPH-2FA15;Lo;0;L;9EBB;;;;N;;;;; +2FA16;CJK COMPATIBILITY IDEOGRAPH-2FA16;Lo;0;L;4D56;;;;N;;;;; +2FA17;CJK COMPATIBILITY IDEOGRAPH-2FA17;Lo;0;L;9EF9;;;;N;;;;; +2FA18;CJK COMPATIBILITY IDEOGRAPH-2FA18;Lo;0;L;9EFE;;;;N;;;;; +2FA19;CJK COMPATIBILITY IDEOGRAPH-2FA19;Lo;0;L;9F05;;;;N;;;;; +2FA1A;CJK COMPATIBILITY IDEOGRAPH-2FA1A;Lo;0;L;9F0F;;;;N;;;;; +2FA1B;CJK COMPATIBILITY IDEOGRAPH-2FA1B;Lo;0;L;9F16;;;;N;;;;; +2FA1C;CJK COMPATIBILITY IDEOGRAPH-2FA1C;Lo;0;L;9F3B;;;;N;;;;; +2FA1D;CJK COMPATIBILITY IDEOGRAPH-2FA1D;Lo;0;L;2A600;;;;N;;;;; +E0001;LANGUAGE TAG;Cf;0;BN;;;;;N;;;;; +E0020;TAG SPACE;Cf;0;BN;;;;;N;;;;; +E0021;TAG EXCLAMATION MARK;Cf;0;BN;;;;;N;;;;; +E0022;TAG QUOTATION MARK;Cf;0;BN;;;;;N;;;;; +E0023;TAG NUMBER SIGN;Cf;0;BN;;;;;N;;;;; +E0024;TAG DOLLAR SIGN;Cf;0;BN;;;;;N;;;;; +E0025;TAG PERCENT SIGN;Cf;0;BN;;;;;N;;;;; +E0026;TAG AMPERSAND;Cf;0;BN;;;;;N;;;;; +E0027;TAG APOSTROPHE;Cf;0;BN;;;;;N;;;;; +E0028;TAG LEFT PARENTHESIS;Cf;0;BN;;;;;N;;;;; +E0029;TAG RIGHT PARENTHESIS;Cf;0;BN;;;;;N;;;;; +E002A;TAG ASTERISK;Cf;0;BN;;;;;N;;;;; +E002B;TAG PLUS SIGN;Cf;0;BN;;;;;N;;;;; +E002C;TAG COMMA;Cf;0;BN;;;;;N;;;;; +E002D;TAG HYPHEN-MINUS;Cf;0;BN;;;;;N;;;;; +E002E;TAG FULL STOP;Cf;0;BN;;;;;N;;;;; +E002F;TAG SOLIDUS;Cf;0;BN;;;;;N;;;;; +E0030;TAG DIGIT ZERO;Cf;0;BN;;;;;N;;;;; +E0031;TAG DIGIT ONE;Cf;0;BN;;;;;N;;;;; +E0032;TAG DIGIT TWO;Cf;0;BN;;;;;N;;;;; +E0033;TAG DIGIT THREE;Cf;0;BN;;;;;N;;;;; +E0034;TAG DIGIT FOUR;Cf;0;BN;;;;;N;;;;; +E0035;TAG DIGIT FIVE;Cf;0;BN;;;;;N;;;;; +E0036;TAG DIGIT SIX;Cf;0;BN;;;;;N;;;;; +E0037;TAG DIGIT SEVEN;Cf;0;BN;;;;;N;;;;; +E0038;TAG DIGIT EIGHT;Cf;0;BN;;;;;N;;;;; +E0039;TAG DIGIT NINE;Cf;0;BN;;;;;N;;;;; +E003A;TAG COLON;Cf;0;BN;;;;;N;;;;; +E003B;TAG SEMICOLON;Cf;0;BN;;;;;N;;;;; +E003C;TAG LESS-THAN SIGN;Cf;0;BN;;;;;N;;;;; +E003D;TAG EQUALS SIGN;Cf;0;BN;;;;;N;;;;; +E003E;TAG GREATER-THAN SIGN;Cf;0;BN;;;;;N;;;;; +E003F;TAG QUESTION MARK;Cf;0;BN;;;;;N;;;;; +E0040;TAG COMMERCIAL AT;Cf;0;BN;;;;;N;;;;; +E0041;TAG LATIN CAPITAL LETTER A;Cf;0;BN;;;;;N;;;;; +E0042;TAG LATIN CAPITAL LETTER B;Cf;0;BN;;;;;N;;;;; +E0043;TAG LATIN CAPITAL LETTER C;Cf;0;BN;;;;;N;;;;; +E0044;TAG LATIN CAPITAL LETTER D;Cf;0;BN;;;;;N;;;;; +E0045;TAG LATIN CAPITAL LETTER E;Cf;0;BN;;;;;N;;;;; +E0046;TAG LATIN CAPITAL LETTER F;Cf;0;BN;;;;;N;;;;; +E0047;TAG LATIN CAPITAL LETTER G;Cf;0;BN;;;;;N;;;;; +E0048;TAG LATIN CAPITAL LETTER H;Cf;0;BN;;;;;N;;;;; +E0049;TAG LATIN CAPITAL LETTER I;Cf;0;BN;;;;;N;;;;; +E004A;TAG LATIN CAPITAL LETTER J;Cf;0;BN;;;;;N;;;;; +E004B;TAG LATIN CAPITAL LETTER K;Cf;0;BN;;;;;N;;;;; +E004C;TAG LATIN CAPITAL LETTER L;Cf;0;BN;;;;;N;;;;; +E004D;TAG LATIN CAPITAL LETTER M;Cf;0;BN;;;;;N;;;;; +E004E;TAG LATIN CAPITAL LETTER N;Cf;0;BN;;;;;N;;;;; +E004F;TAG LATIN CAPITAL LETTER O;Cf;0;BN;;;;;N;;;;; +E0050;TAG LATIN CAPITAL LETTER P;Cf;0;BN;;;;;N;;;;; +E0051;TAG LATIN CAPITAL LETTER Q;Cf;0;BN;;;;;N;;;;; +E0052;TAG LATIN CAPITAL LETTER R;Cf;0;BN;;;;;N;;;;; +E0053;TAG LATIN CAPITAL LETTER S;Cf;0;BN;;;;;N;;;;; +E0054;TAG LATIN CAPITAL LETTER T;Cf;0;BN;;;;;N;;;;; +E0055;TAG LATIN CAPITAL LETTER U;Cf;0;BN;;;;;N;;;;; +E0056;TAG LATIN CAPITAL LETTER V;Cf;0;BN;;;;;N;;;;; +E0057;TAG LATIN CAPITAL LETTER W;Cf;0;BN;;;;;N;;;;; +E0058;TAG LATIN CAPITAL LETTER X;Cf;0;BN;;;;;N;;;;; +E0059;TAG LATIN CAPITAL LETTER Y;Cf;0;BN;;;;;N;;;;; +E005A;TAG LATIN CAPITAL LETTER Z;Cf;0;BN;;;;;N;;;;; +E005B;TAG LEFT SQUARE BRACKET;Cf;0;BN;;;;;N;;;;; +E005C;TAG REVERSE SOLIDUS;Cf;0;BN;;;;;N;;;;; +E005D;TAG RIGHT SQUARE BRACKET;Cf;0;BN;;;;;N;;;;; +E005E;TAG CIRCUMFLEX ACCENT;Cf;0;BN;;;;;N;;;;; +E005F;TAG LOW LINE;Cf;0;BN;;;;;N;;;;; +E0060;TAG GRAVE ACCENT;Cf;0;BN;;;;;N;;;;; +E0061;TAG LATIN SMALL LETTER A;Cf;0;BN;;;;;N;;;;; +E0062;TAG LATIN SMALL LETTER B;Cf;0;BN;;;;;N;;;;; +E0063;TAG LATIN SMALL LETTER C;Cf;0;BN;;;;;N;;;;; +E0064;TAG LATIN SMALL LETTER D;Cf;0;BN;;;;;N;;;;; +E0065;TAG LATIN SMALL LETTER E;Cf;0;BN;;;;;N;;;;; +E0066;TAG LATIN SMALL LETTER F;Cf;0;BN;;;;;N;;;;; +E0067;TAG LATIN SMALL LETTER G;Cf;0;BN;;;;;N;;;;; +E0068;TAG LATIN SMALL LETTER H;Cf;0;BN;;;;;N;;;;; +E0069;TAG LATIN SMALL LETTER I;Cf;0;BN;;;;;N;;;;; +E006A;TAG LATIN SMALL LETTER J;Cf;0;BN;;;;;N;;;;; +E006B;TAG LATIN SMALL LETTER K;Cf;0;BN;;;;;N;;;;; +E006C;TAG LATIN SMALL LETTER L;Cf;0;BN;;;;;N;;;;; +E006D;TAG LATIN SMALL LETTER M;Cf;0;BN;;;;;N;;;;; +E006E;TAG LATIN SMALL LETTER N;Cf;0;BN;;;;;N;;;;; +E006F;TAG LATIN SMALL LETTER O;Cf;0;BN;;;;;N;;;;; +E0070;TAG LATIN SMALL LETTER P;Cf;0;BN;;;;;N;;;;; +E0071;TAG LATIN SMALL LETTER Q;Cf;0;BN;;;;;N;;;;; +E0072;TAG LATIN SMALL LETTER R;Cf;0;BN;;;;;N;;;;; +E0073;TAG LATIN SMALL LETTER S;Cf;0;BN;;;;;N;;;;; +E0074;TAG LATIN SMALL LETTER T;Cf;0;BN;;;;;N;;;;; +E0075;TAG LATIN SMALL LETTER U;Cf;0;BN;;;;;N;;;;; +E0076;TAG LATIN SMALL LETTER V;Cf;0;BN;;;;;N;;;;; +E0077;TAG LATIN SMALL LETTER W;Cf;0;BN;;;;;N;;;;; +E0078;TAG LATIN SMALL LETTER X;Cf;0;BN;;;;;N;;;;; +E0079;TAG LATIN SMALL LETTER Y;Cf;0;BN;;;;;N;;;;; +E007A;TAG LATIN SMALL LETTER Z;Cf;0;BN;;;;;N;;;;; +E007B;TAG LEFT CURLY BRACKET;Cf;0;BN;;;;;N;;;;; +E007C;TAG VERTICAL LINE;Cf;0;BN;;;;;N;;;;; +E007D;TAG RIGHT CURLY BRACKET;Cf;0;BN;;;;;N;;;;; +E007E;TAG TILDE;Cf;0;BN;;;;;N;;;;; +E007F;CANCEL TAG;Cf;0;BN;;;;;N;;;;; +E0100;VARIATION SELECTOR-17;Mn;0;NSM;;;;;N;;;;; +E0101;VARIATION SELECTOR-18;Mn;0;NSM;;;;;N;;;;; +E0102;VARIATION SELECTOR-19;Mn;0;NSM;;;;;N;;;;; +E0103;VARIATION SELECTOR-20;Mn;0;NSM;;;;;N;;;;; +E0104;VARIATION SELECTOR-21;Mn;0;NSM;;;;;N;;;;; +E0105;VARIATION SELECTOR-22;Mn;0;NSM;;;;;N;;;;; +E0106;VARIATION SELECTOR-23;Mn;0;NSM;;;;;N;;;;; +E0107;VARIATION SELECTOR-24;Mn;0;NSM;;;;;N;;;;; +E0108;VARIATION SELECTOR-25;Mn;0;NSM;;;;;N;;;;; +E0109;VARIATION SELECTOR-26;Mn;0;NSM;;;;;N;;;;; +E010A;VARIATION SELECTOR-27;Mn;0;NSM;;;;;N;;;;; +E010B;VARIATION SELECTOR-28;Mn;0;NSM;;;;;N;;;;; +E010C;VARIATION SELECTOR-29;Mn;0;NSM;;;;;N;;;;; +E010D;VARIATION SELECTOR-30;Mn;0;NSM;;;;;N;;;;; +E010E;VARIATION SELECTOR-31;Mn;0;NSM;;;;;N;;;;; +E010F;VARIATION SELECTOR-32;Mn;0;NSM;;;;;N;;;;; +E0110;VARIATION SELECTOR-33;Mn;0;NSM;;;;;N;;;;; +E0111;VARIATION SELECTOR-34;Mn;0;NSM;;;;;N;;;;; +E0112;VARIATION SELECTOR-35;Mn;0;NSM;;;;;N;;;;; +E0113;VARIATION SELECTOR-36;Mn;0;NSM;;;;;N;;;;; +E0114;VARIATION SELECTOR-37;Mn;0;NSM;;;;;N;;;;; +E0115;VARIATION SELECTOR-38;Mn;0;NSM;;;;;N;;;;; +E0116;VARIATION SELECTOR-39;Mn;0;NSM;;;;;N;;;;; +E0117;VARIATION SELECTOR-40;Mn;0;NSM;;;;;N;;;;; +E0118;VARIATION SELECTOR-41;Mn;0;NSM;;;;;N;;;;; +E0119;VARIATION SELECTOR-42;Mn;0;NSM;;;;;N;;;;; +E011A;VARIATION SELECTOR-43;Mn;0;NSM;;;;;N;;;;; +E011B;VARIATION SELECTOR-44;Mn;0;NSM;;;;;N;;;;; +E011C;VARIATION SELECTOR-45;Mn;0;NSM;;;;;N;;;;; +E011D;VARIATION SELECTOR-46;Mn;0;NSM;;;;;N;;;;; +E011E;VARIATION SELECTOR-47;Mn;0;NSM;;;;;N;;;;; +E011F;VARIATION SELECTOR-48;Mn;0;NSM;;;;;N;;;;; +E0120;VARIATION SELECTOR-49;Mn;0;NSM;;;;;N;;;;; +E0121;VARIATION SELECTOR-50;Mn;0;NSM;;;;;N;;;;; +E0122;VARIATION SELECTOR-51;Mn;0;NSM;;;;;N;;;;; +E0123;VARIATION SELECTOR-52;Mn;0;NSM;;;;;N;;;;; +E0124;VARIATION SELECTOR-53;Mn;0;NSM;;;;;N;;;;; +E0125;VARIATION SELECTOR-54;Mn;0;NSM;;;;;N;;;;; +E0126;VARIATION SELECTOR-55;Mn;0;NSM;;;;;N;;;;; +E0127;VARIATION SELECTOR-56;Mn;0;NSM;;;;;N;;;;; +E0128;VARIATION SELECTOR-57;Mn;0;NSM;;;;;N;;;;; +E0129;VARIATION SELECTOR-58;Mn;0;NSM;;;;;N;;;;; +E012A;VARIATION SELECTOR-59;Mn;0;NSM;;;;;N;;;;; +E012B;VARIATION SELECTOR-60;Mn;0;NSM;;;;;N;;;;; +E012C;VARIATION SELECTOR-61;Mn;0;NSM;;;;;N;;;;; +E012D;VARIATION SELECTOR-62;Mn;0;NSM;;;;;N;;;;; +E012E;VARIATION SELECTOR-63;Mn;0;NSM;;;;;N;;;;; +E012F;VARIATION SELECTOR-64;Mn;0;NSM;;;;;N;;;;; +E0130;VARIATION SELECTOR-65;Mn;0;NSM;;;;;N;;;;; +E0131;VARIATION SELECTOR-66;Mn;0;NSM;;;;;N;;;;; +E0132;VARIATION SELECTOR-67;Mn;0;NSM;;;;;N;;;;; +E0133;VARIATION SELECTOR-68;Mn;0;NSM;;;;;N;;;;; +E0134;VARIATION SELECTOR-69;Mn;0;NSM;;;;;N;;;;; +E0135;VARIATION SELECTOR-70;Mn;0;NSM;;;;;N;;;;; +E0136;VARIATION SELECTOR-71;Mn;0;NSM;;;;;N;;;;; +E0137;VARIATION SELECTOR-72;Mn;0;NSM;;;;;N;;;;; +E0138;VARIATION SELECTOR-73;Mn;0;NSM;;;;;N;;;;; +E0139;VARIATION SELECTOR-74;Mn;0;NSM;;;;;N;;;;; +E013A;VARIATION SELECTOR-75;Mn;0;NSM;;;;;N;;;;; +E013B;VARIATION SELECTOR-76;Mn;0;NSM;;;;;N;;;;; +E013C;VARIATION SELECTOR-77;Mn;0;NSM;;;;;N;;;;; +E013D;VARIATION SELECTOR-78;Mn;0;NSM;;;;;N;;;;; +E013E;VARIATION SELECTOR-79;Mn;0;NSM;;;;;N;;;;; +E013F;VARIATION SELECTOR-80;Mn;0;NSM;;;;;N;;;;; +E0140;VARIATION SELECTOR-81;Mn;0;NSM;;;;;N;;;;; +E0141;VARIATION SELECTOR-82;Mn;0;NSM;;;;;N;;;;; +E0142;VARIATION SELECTOR-83;Mn;0;NSM;;;;;N;;;;; +E0143;VARIATION SELECTOR-84;Mn;0;NSM;;;;;N;;;;; +E0144;VARIATION SELECTOR-85;Mn;0;NSM;;;;;N;;;;; +E0145;VARIATION SELECTOR-86;Mn;0;NSM;;;;;N;;;;; +E0146;VARIATION SELECTOR-87;Mn;0;NSM;;;;;N;;;;; +E0147;VARIATION SELECTOR-88;Mn;0;NSM;;;;;N;;;;; +E0148;VARIATION SELECTOR-89;Mn;0;NSM;;;;;N;;;;; +E0149;VARIATION SELECTOR-90;Mn;0;NSM;;;;;N;;;;; +E014A;VARIATION SELECTOR-91;Mn;0;NSM;;;;;N;;;;; +E014B;VARIATION SELECTOR-92;Mn;0;NSM;;;;;N;;;;; +E014C;VARIATION SELECTOR-93;Mn;0;NSM;;;;;N;;;;; +E014D;VARIATION SELECTOR-94;Mn;0;NSM;;;;;N;;;;; +E014E;VARIATION SELECTOR-95;Mn;0;NSM;;;;;N;;;;; +E014F;VARIATION SELECTOR-96;Mn;0;NSM;;;;;N;;;;; +E0150;VARIATION SELECTOR-97;Mn;0;NSM;;;;;N;;;;; +E0151;VARIATION SELECTOR-98;Mn;0;NSM;;;;;N;;;;; +E0152;VARIATION SELECTOR-99;Mn;0;NSM;;;;;N;;;;; +E0153;VARIATION SELECTOR-100;Mn;0;NSM;;;;;N;;;;; +E0154;VARIATION SELECTOR-101;Mn;0;NSM;;;;;N;;;;; +E0155;VARIATION SELECTOR-102;Mn;0;NSM;;;;;N;;;;; +E0156;VARIATION SELECTOR-103;Mn;0;NSM;;;;;N;;;;; +E0157;VARIATION SELECTOR-104;Mn;0;NSM;;;;;N;;;;; +E0158;VARIATION SELECTOR-105;Mn;0;NSM;;;;;N;;;;; +E0159;VARIATION SELECTOR-106;Mn;0;NSM;;;;;N;;;;; +E015A;VARIATION SELECTOR-107;Mn;0;NSM;;;;;N;;;;; +E015B;VARIATION SELECTOR-108;Mn;0;NSM;;;;;N;;;;; +E015C;VARIATION SELECTOR-109;Mn;0;NSM;;;;;N;;;;; +E015D;VARIATION SELECTOR-110;Mn;0;NSM;;;;;N;;;;; +E015E;VARIATION SELECTOR-111;Mn;0;NSM;;;;;N;;;;; +E015F;VARIATION SELECTOR-112;Mn;0;NSM;;;;;N;;;;; +E0160;VARIATION SELECTOR-113;Mn;0;NSM;;;;;N;;;;; +E0161;VARIATION SELECTOR-114;Mn;0;NSM;;;;;N;;;;; +E0162;VARIATION SELECTOR-115;Mn;0;NSM;;;;;N;;;;; +E0163;VARIATION SELECTOR-116;Mn;0;NSM;;;;;N;;;;; +E0164;VARIATION SELECTOR-117;Mn;0;NSM;;;;;N;;;;; +E0165;VARIATION SELECTOR-118;Mn;0;NSM;;;;;N;;;;; +E0166;VARIATION SELECTOR-119;Mn;0;NSM;;;;;N;;;;; +E0167;VARIATION SELECTOR-120;Mn;0;NSM;;;;;N;;;;; +E0168;VARIATION SELECTOR-121;Mn;0;NSM;;;;;N;;;;; +E0169;VARIATION SELECTOR-122;Mn;0;NSM;;;;;N;;;;; +E016A;VARIATION SELECTOR-123;Mn;0;NSM;;;;;N;;;;; +E016B;VARIATION SELECTOR-124;Mn;0;NSM;;;;;N;;;;; +E016C;VARIATION SELECTOR-125;Mn;0;NSM;;;;;N;;;;; +E016D;VARIATION SELECTOR-126;Mn;0;NSM;;;;;N;;;;; +E016E;VARIATION SELECTOR-127;Mn;0;NSM;;;;;N;;;;; +E016F;VARIATION SELECTOR-128;Mn;0;NSM;;;;;N;;;;; +E0170;VARIATION SELECTOR-129;Mn;0;NSM;;;;;N;;;;; +E0171;VARIATION SELECTOR-130;Mn;0;NSM;;;;;N;;;;; +E0172;VARIATION SELECTOR-131;Mn;0;NSM;;;;;N;;;;; +E0173;VARIATION SELECTOR-132;Mn;0;NSM;;;;;N;;;;; +E0174;VARIATION SELECTOR-133;Mn;0;NSM;;;;;N;;;;; +E0175;VARIATION SELECTOR-134;Mn;0;NSM;;;;;N;;;;; +E0176;VARIATION SELECTOR-135;Mn;0;NSM;;;;;N;;;;; +E0177;VARIATION SELECTOR-136;Mn;0;NSM;;;;;N;;;;; +E0178;VARIATION SELECTOR-137;Mn;0;NSM;;;;;N;;;;; +E0179;VARIATION SELECTOR-138;Mn;0;NSM;;;;;N;;;;; +E017A;VARIATION SELECTOR-139;Mn;0;NSM;;;;;N;;;;; +E017B;VARIATION SELECTOR-140;Mn;0;NSM;;;;;N;;;;; +E017C;VARIATION SELECTOR-141;Mn;0;NSM;;;;;N;;;;; +E017D;VARIATION SELECTOR-142;Mn;0;NSM;;;;;N;;;;; +E017E;VARIATION SELECTOR-143;Mn;0;NSM;;;;;N;;;;; +E017F;VARIATION SELECTOR-144;Mn;0;NSM;;;;;N;;;;; +E0180;VARIATION SELECTOR-145;Mn;0;NSM;;;;;N;;;;; +E0181;VARIATION SELECTOR-146;Mn;0;NSM;;;;;N;;;;; +E0182;VARIATION SELECTOR-147;Mn;0;NSM;;;;;N;;;;; +E0183;VARIATION SELECTOR-148;Mn;0;NSM;;;;;N;;;;; +E0184;VARIATION SELECTOR-149;Mn;0;NSM;;;;;N;;;;; +E0185;VARIATION SELECTOR-150;Mn;0;NSM;;;;;N;;;;; +E0186;VARIATION SELECTOR-151;Mn;0;NSM;;;;;N;;;;; +E0187;VARIATION SELECTOR-152;Mn;0;NSM;;;;;N;;;;; +E0188;VARIATION SELECTOR-153;Mn;0;NSM;;;;;N;;;;; +E0189;VARIATION SELECTOR-154;Mn;0;NSM;;;;;N;;;;; +E018A;VARIATION SELECTOR-155;Mn;0;NSM;;;;;N;;;;; +E018B;VARIATION SELECTOR-156;Mn;0;NSM;;;;;N;;;;; +E018C;VARIATION SELECTOR-157;Mn;0;NSM;;;;;N;;;;; +E018D;VARIATION SELECTOR-158;Mn;0;NSM;;;;;N;;;;; +E018E;VARIATION SELECTOR-159;Mn;0;NSM;;;;;N;;;;; +E018F;VARIATION SELECTOR-160;Mn;0;NSM;;;;;N;;;;; +E0190;VARIATION SELECTOR-161;Mn;0;NSM;;;;;N;;;;; +E0191;VARIATION SELECTOR-162;Mn;0;NSM;;;;;N;;;;; +E0192;VARIATION SELECTOR-163;Mn;0;NSM;;;;;N;;;;; +E0193;VARIATION SELECTOR-164;Mn;0;NSM;;;;;N;;;;; +E0194;VARIATION SELECTOR-165;Mn;0;NSM;;;;;N;;;;; +E0195;VARIATION SELECTOR-166;Mn;0;NSM;;;;;N;;;;; +E0196;VARIATION SELECTOR-167;Mn;0;NSM;;;;;N;;;;; +E0197;VARIATION SELECTOR-168;Mn;0;NSM;;;;;N;;;;; +E0198;VARIATION SELECTOR-169;Mn;0;NSM;;;;;N;;;;; +E0199;VARIATION SELECTOR-170;Mn;0;NSM;;;;;N;;;;; +E019A;VARIATION SELECTOR-171;Mn;0;NSM;;;;;N;;;;; +E019B;VARIATION SELECTOR-172;Mn;0;NSM;;;;;N;;;;; +E019C;VARIATION SELECTOR-173;Mn;0;NSM;;;;;N;;;;; +E019D;VARIATION SELECTOR-174;Mn;0;NSM;;;;;N;;;;; +E019E;VARIATION SELECTOR-175;Mn;0;NSM;;;;;N;;;;; +E019F;VARIATION SELECTOR-176;Mn;0;NSM;;;;;N;;;;; +E01A0;VARIATION SELECTOR-177;Mn;0;NSM;;;;;N;;;;; +E01A1;VARIATION SELECTOR-178;Mn;0;NSM;;;;;N;;;;; +E01A2;VARIATION SELECTOR-179;Mn;0;NSM;;;;;N;;;;; +E01A3;VARIATION SELECTOR-180;Mn;0;NSM;;;;;N;;;;; +E01A4;VARIATION SELECTOR-181;Mn;0;NSM;;;;;N;;;;; +E01A5;VARIATION SELECTOR-182;Mn;0;NSM;;;;;N;;;;; +E01A6;VARIATION SELECTOR-183;Mn;0;NSM;;;;;N;;;;; +E01A7;VARIATION SELECTOR-184;Mn;0;NSM;;;;;N;;;;; +E01A8;VARIATION SELECTOR-185;Mn;0;NSM;;;;;N;;;;; +E01A9;VARIATION SELECTOR-186;Mn;0;NSM;;;;;N;;;;; +E01AA;VARIATION SELECTOR-187;Mn;0;NSM;;;;;N;;;;; +E01AB;VARIATION SELECTOR-188;Mn;0;NSM;;;;;N;;;;; +E01AC;VARIATION SELECTOR-189;Mn;0;NSM;;;;;N;;;;; +E01AD;VARIATION SELECTOR-190;Mn;0;NSM;;;;;N;;;;; +E01AE;VARIATION SELECTOR-191;Mn;0;NSM;;;;;N;;;;; +E01AF;VARIATION SELECTOR-192;Mn;0;NSM;;;;;N;;;;; +E01B0;VARIATION SELECTOR-193;Mn;0;NSM;;;;;N;;;;; +E01B1;VARIATION SELECTOR-194;Mn;0;NSM;;;;;N;;;;; +E01B2;VARIATION SELECTOR-195;Mn;0;NSM;;;;;N;;;;; +E01B3;VARIATION SELECTOR-196;Mn;0;NSM;;;;;N;;;;; +E01B4;VARIATION SELECTOR-197;Mn;0;NSM;;;;;N;;;;; +E01B5;VARIATION SELECTOR-198;Mn;0;NSM;;;;;N;;;;; +E01B6;VARIATION SELECTOR-199;Mn;0;NSM;;;;;N;;;;; +E01B7;VARIATION SELECTOR-200;Mn;0;NSM;;;;;N;;;;; +E01B8;VARIATION SELECTOR-201;Mn;0;NSM;;;;;N;;;;; +E01B9;VARIATION SELECTOR-202;Mn;0;NSM;;;;;N;;;;; +E01BA;VARIATION SELECTOR-203;Mn;0;NSM;;;;;N;;;;; +E01BB;VARIATION SELECTOR-204;Mn;0;NSM;;;;;N;;;;; +E01BC;VARIATION SELECTOR-205;Mn;0;NSM;;;;;N;;;;; +E01BD;VARIATION SELECTOR-206;Mn;0;NSM;;;;;N;;;;; +E01BE;VARIATION SELECTOR-207;Mn;0;NSM;;;;;N;;;;; +E01BF;VARIATION SELECTOR-208;Mn;0;NSM;;;;;N;;;;; +E01C0;VARIATION SELECTOR-209;Mn;0;NSM;;;;;N;;;;; +E01C1;VARIATION SELECTOR-210;Mn;0;NSM;;;;;N;;;;; +E01C2;VARIATION SELECTOR-211;Mn;0;NSM;;;;;N;;;;; +E01C3;VARIATION SELECTOR-212;Mn;0;NSM;;;;;N;;;;; +E01C4;VARIATION SELECTOR-213;Mn;0;NSM;;;;;N;;;;; +E01C5;VARIATION SELECTOR-214;Mn;0;NSM;;;;;N;;;;; +E01C6;VARIATION SELECTOR-215;Mn;0;NSM;;;;;N;;;;; +E01C7;VARIATION SELECTOR-216;Mn;0;NSM;;;;;N;;;;; +E01C8;VARIATION SELECTOR-217;Mn;0;NSM;;;;;N;;;;; +E01C9;VARIATION SELECTOR-218;Mn;0;NSM;;;;;N;;;;; +E01CA;VARIATION SELECTOR-219;Mn;0;NSM;;;;;N;;;;; +E01CB;VARIATION SELECTOR-220;Mn;0;NSM;;;;;N;;;;; +E01CC;VARIATION SELECTOR-221;Mn;0;NSM;;;;;N;;;;; +E01CD;VARIATION SELECTOR-222;Mn;0;NSM;;;;;N;;;;; +E01CE;VARIATION SELECTOR-223;Mn;0;NSM;;;;;N;;;;; +E01CF;VARIATION SELECTOR-224;Mn;0;NSM;;;;;N;;;;; +E01D0;VARIATION SELECTOR-225;Mn;0;NSM;;;;;N;;;;; +E01D1;VARIATION SELECTOR-226;Mn;0;NSM;;;;;N;;;;; +E01D2;VARIATION SELECTOR-227;Mn;0;NSM;;;;;N;;;;; +E01D3;VARIATION SELECTOR-228;Mn;0;NSM;;;;;N;;;;; +E01D4;VARIATION SELECTOR-229;Mn;0;NSM;;;;;N;;;;; +E01D5;VARIATION SELECTOR-230;Mn;0;NSM;;;;;N;;;;; +E01D6;VARIATION SELECTOR-231;Mn;0;NSM;;;;;N;;;;; +E01D7;VARIATION SELECTOR-232;Mn;0;NSM;;;;;N;;;;; +E01D8;VARIATION SELECTOR-233;Mn;0;NSM;;;;;N;;;;; +E01D9;VARIATION SELECTOR-234;Mn;0;NSM;;;;;N;;;;; +E01DA;VARIATION SELECTOR-235;Mn;0;NSM;;;;;N;;;;; +E01DB;VARIATION SELECTOR-236;Mn;0;NSM;;;;;N;;;;; +E01DC;VARIATION SELECTOR-237;Mn;0;NSM;;;;;N;;;;; +E01DD;VARIATION SELECTOR-238;Mn;0;NSM;;;;;N;;;;; +E01DE;VARIATION SELECTOR-239;Mn;0;NSM;;;;;N;;;;; +E01DF;VARIATION SELECTOR-240;Mn;0;NSM;;;;;N;;;;; +E01E0;VARIATION SELECTOR-241;Mn;0;NSM;;;;;N;;;;; +E01E1;VARIATION SELECTOR-242;Mn;0;NSM;;;;;N;;;;; +E01E2;VARIATION SELECTOR-243;Mn;0;NSM;;;;;N;;;;; +E01E3;VARIATION SELECTOR-244;Mn;0;NSM;;;;;N;;;;; +E01E4;VARIATION SELECTOR-245;Mn;0;NSM;;;;;N;;;;; +E01E5;VARIATION SELECTOR-246;Mn;0;NSM;;;;;N;;;;; +E01E6;VARIATION SELECTOR-247;Mn;0;NSM;;;;;N;;;;; +E01E7;VARIATION SELECTOR-248;Mn;0;NSM;;;;;N;;;;; +E01E8;VARIATION SELECTOR-249;Mn;0;NSM;;;;;N;;;;; +E01E9;VARIATION SELECTOR-250;Mn;0;NSM;;;;;N;;;;; +E01EA;VARIATION SELECTOR-251;Mn;0;NSM;;;;;N;;;;; +E01EB;VARIATION SELECTOR-252;Mn;0;NSM;;;;;N;;;;; +E01EC;VARIATION SELECTOR-253;Mn;0;NSM;;;;;N;;;;; +E01ED;VARIATION SELECTOR-254;Mn;0;NSM;;;;;N;;;;; +E01EE;VARIATION SELECTOR-255;Mn;0;NSM;;;;;N;;;;; +E01EF;VARIATION SELECTOR-256;Mn;0;NSM;;;;;N;;;;; +F0000;<Plane 15 Private Use, First>;Co;0;L;;;;;N;;;;; +FFFFD;<Plane 15 Private Use, Last>;Co;0;L;;;;;N;;;;; +100000;<Plane 16 Private Use, First>;Co;0;L;;;;;N;;;;; +10FFFD;<Plane 16 Private Use, Last>;Co;0;L;;;;;N;;;;; diff -Nru pypy-7.1.1+dfsg/rpython/rlib/unicodedata/unicodedb_11_0_0.py pypy-7.3.1+dfsg/rpython/rlib/unicodedata/unicodedb_11_0_0.py --- pypy-7.1.1+dfsg/rpython/rlib/unicodedata/unicodedb_11_0_0.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/rlib/unicodedata/unicodedb_11_0_0.py 2020-04-10 19:28:41.000000000 +0000 @@ -0,0 +1,67349 @@ +# UNICODE CHARACTER DATABASE +# This file was generated with the command: +# generate_unicodedb.py --base=unicodedb_5_2_0 --output=unicodedb_11_0_0 --unidata_version=11.0.0 + +from rpython.rlib.rarithmetic import r_longlong + + +import unicodedb_5_2_0 as base_mod +version = '11.0.0' + +#____________________________________________________________ +# output from build_compression_tree + +def trie_lookup(name): + charnode = 0 + while 0 <= charnode < 0xffff: # 16bit number, 0xffff = None + charnode *= 3 + leftright = _charnodes[charnode] + parentstr = _charnodes[charnode + 1] + codepoint = _charnodes[charnode + 2] + + if leftright < 0: + # XXX assumes msb is sign + left = 0x8000 | ((leftright & 0x7fffffff) >> 16) + else: + left = (leftright & 0x7fffffff) >> 16 + right = leftright & 0xffff + + if parentstr < 0: + # XXX assumes msb is sign + parent = 0x8000 | ((parentstr & 0x7fffffff) >> 16) + else: + parent = (parentstr & 0x7fffffff) >> 16 + stridx = parentstr & ((1 << 16) - 1) + + strlen = ord(_stringtable[stridx]) + substring = _stringtable[stridx+1:stridx+1+strlen] + + if codepoint != -1 and name == substring: + return int(codepoint) + if name.startswith(substring): + name = name[strlen:] + charnode = left + else: + charnode = right + raise KeyError, name + +def name_of_node(charnode): + res = [] + prevnode = -1 + while 0 <= charnode < 0xffff: # 16bit number, 0xffff = None + charnode *= 3 + leftright = _charnodes[charnode] + parentstr = _charnodes[charnode + 1] + codepoint = _charnodes[charnode + 2] + + if leftright < 0: + # XXX assumes msg is sign + left = 0x8000 | ((leftright & 0x7fffffff) >> 16) + else: + left = (leftright & 0x7fffffff) >> 16 + right = leftright & 0xffff + + if parentstr < 0: + # XXX assumes msb is sign + parent = 0x8000 | ((parentstr & 0x7fffffff) >> 16) + else: + parent = (parentstr & 0x7fffffff) >> 16 + + if prevnode < 0 or prevnode == left: + stridx = parentstr & ((1<<16)-1) + strlen = ord(_stringtable[stridx]) + substring = _stringtable[stridx+1:stridx+1+strlen] + res.append(substring) + + prevnode = charnode // 3 + charnode = parent + + res.reverse() + return ''.join(res) + + +_stringtable = ( +'\x01 ' +'\x0f ALTERNATE FORM' +'\x0c ALTERNATING' +'\x05 AND ' +'\n AND ARROW' +'\x1b AND LEFT SEMICIRCLE ARROWS' +'\x0c AND PICTURE' +'\x0b AND WRENCH' +'\r AND YEN SIGN' +'\x08 ANTENNA' +'\x07 ARROW ' +') ARROW POINTING DOWNWARDS THEN NORTH EAST' +'\n ARROWHEAD' +'\x08 AT DUSK' +'\x08 AT LEFT' +'\r BAT AND BALL' +'\x14 BEGIN LOGOGRAM MARK' +'\x06 BELOW' +'\x05 BENT' +'\x06 BLOCK' +'\x07 BUBBLE' +'\x07 BUTTON' +'\x17 CAKE WITH SWIRL DESIGN' +'\x10 CAPPED MOUNTAIN' +'\x04 CAR' +'\x08 CENTRED' +'\n CHARACTER' +'\x05 CHWV' +'\x07 CIRCLE' +'\x05 COAT' +'\n CONJOINED' +'\x0b DECORATION' +'\x14 DIRECTIONAL ISOLATE' +'\t DIVIDERS' +'\x07 DOUBLE' +'\x1d DOWN INDEX THUMB HOOK MIDDLE' +'\x02 E' +'\x06 EPOCH' +'\x05 FACE' +'\x06 FACE ' +'\x08 FACING ' +'\x06 FINAL' +'\x13 FLUTTERING IN WIND' +'\x12 FOR SIMALUNGUN SA' +'\x05 FUJI' +'\x05 GUNU' +'\t HITTING ' +'\x05 HOOK' +'\x08 HUNDRED' +'\x05 ICON' +'\x10 IN BLACK SQUARE' +'\x0e IN SILHOUETTE' +'\x07 ISLAND' +'\x04 KEY' +'\x02 L' +'\x06 LARGE' +'\t LEERAEWA' +'\x07 LITTLE' +'\x0b LOCOMOTIVE' +'\x13 LOVE YOU HAND SIGN' +'\x07 MAELEE' +'\x07 MAEMBA' +'\x08 MAKSURA' +'\x05 MARK' +'\x05 MFON' +'\t MILLIONS' +'\n MODIFIER-' +'\t MOVEMENT' +'\x07 MUOMAE' +'\x02 N' +'\x03 NJ' +'\x12 NOT LITTER SYMBOL' +'\x07 OCLOCK' +'\x04 OF ' +'\x0c OF ANTIMONY' +'\x0b OF FLOWERS' +'\x08 OF FOOD' +'\t OF PAPER' +'\r OF THE HORNS' +'\x08 OF YARN' +'\x05 OPEN' +'\x07 OPEN-O' +'\x04 ORE' +'\x04 OUT' +'\x0c OVER MIDDLE' +'\x0f OVER MOUNTAINS' +'\x11 OVER MUSH TIMES ' +'\x16 OVER STAMPED ENVELOPE' +'\x11 OVER ZU PLUS SAR' +'\x02 P' +'\x03 PA' +'\x06 PLUS ' +'\x0c PLUS KASKAL' +'\x12 PLUS PAP PLUS LU3' +'\x07 PLUS U' +'\x18 POINTING BACKHAND INDEX' +'\x04 POT' +'\x02 R' +'\x04 R S' +'\t RA OR RI' +'\x0c RING LITTLE' +'\x02 S' +'\x08 SATCHEL' +'\x07 SECANT' +'\n SEPARATOR' +'\x04 SET' +'\x06 SEVEN' +'\x05 SIDE' +'\x10 SMALL ROTATIONS' +'\t SPARKLER' +'\x06 SPLIT' +'\x12 SPREAD THUMB SIDE' +'\x05 STOP' +'\t STRAIGHT' +'\x07 SYMBOL' +'\x05 TABS' +'\x05 TENU' +'\t THOUSAND' +'\n THOUSANDS' +'\x06 THUMB' +'\x07 THUMB ' +'\x0e THUMB FORWARD' +'\x12 THUMB INDEX THUMB' +'\x0b THUMB SIDE' +'\x0f THUMB STRAIGHT' +'\x08 TILTING' +'\x07 TIMES ' +'\n TIMES KUR' +'\x0b TIMES TAK4' +'\x07 TO BAR' +'\x05 TONE' +'\x0f TOUCHING INDEX' +'\x05 TREE' +'\x02 U' +'\x04 U U' +'\x04 WEB' +'\x06 WITH ' +'\t WITH BAR' +'\x11 WITH BULLET NOSE' +'\x10 WITH BUNNY EARS' +'\x19 WITH CANCELLATION STROKE' +'\x19 WITH CIRCLED ONE OVERLAY' +'\x12 WITH CROSSED-TAIL' +'\x16 WITH DECORATIVE COVER' +'\x0f WITH DIAERESIS' +'\t WITH DOT' +'\n WITH DOTS' +'\x15 WITH DOUBLE ORNAMENT' +'2 WITH EXCLAMATION MARK WITH LEFT RIGHT ARROW ABOVE' +'\n WITH FACE' +'\x0b WITH FLASH' +'\x0e WITH FLOURISH' +'\x17 WITH HALF-CIRCLE BELOW' +'& WITH INDEX AND MIDDLE FINGERS CROSSED' +'\r WITH INK PEN' +'\x0b WITH JACKS' +'\x12 WITH KAVYKA ABOVE' +'\n WITH LOW ' +'\x14 WITH OBLIQUE STROKE' +'\x0e WITH ORNAMENT' +'\n WITH PAGE' +'\x12 WITH PALATAL HOOK' +'\x0b WITH PLATE' +'\n WITH RAIN' +'\n WITH RAYS' +'\n WITH RING' +'\x11 WITH SOUND WAVES' +'\x0b WITH STRAW' +'\x0c WITH STROKE' +'\x12 WITH VERTICAL BAR' +'\x19 WITH VERTICAL LINE BELOW' +'\x13 WITH VERTICAL TAIL' +'\x0b WITHIN DOT' +'\x0b WRIST FLEX' +'\x08 YUQ NAE' +'\x01-' +'\x02-2' +'\x02-A' +'\t-AMMONIAC' +'\x0b-COPPER ORE' +'\x08-EM DASH' +'\x08-HEADED ' +'\t-LOW TONE' +'\x0c-MAIL SYMBOL' +'\t-MID TONE' +'\x0b-MOUTH FACE' +'\x07-MU-MO-' +'\x0f-NO-EVIL MONKEY' +'\x0b-OFF SYMBOL' +'\n-POINTING ' +'\x0c-SHAPED SIGN' +'\x07-SHIFT-' +'\x07-THIRTY' +'\x010' +'\x050 BEE' +'\x040 BI' +'\x050 DOO' +'\x030 E' +'\x050 GBO' +'\x050 GEE' +'\x050 HAN' +'\x050 HEE' +'\x040 HO' +'\x050 JOO' +'\x040 JU' +'\t0 LONG LE' +'\x060 NGGI' +'\x060 NGGO' +'\x060 NYON' +'\x060 NYUN' +'\x040 PU' +'\x040 SA' +'\x030 W' +'\x040 YE' +'\x050-VAS' +'\x0600-102' +'\x04028B' +'\x0203' +'\x0208' +'\x011' +'\x031 A' +'\x041 BA' +'\x041 DO' +'\x051 FAN' +'\x041 GA' +'\x061 GBOO' +'\x041 HA' +'\x041 IN' +'\x041 KI' +'\n1 LONG MBE' +'\x061 NDEE' +'\x0e1 OVER LAK-081' +'\x041 PE' +'\x051 PEE' +'\x041 RA' +'\x041 SU' +'\x051 TEE' +'\x041 VU' +'\x051 WVI' +'\x031 X' +'\x041 YI' +'\x041 YO' +'\x051 YOO' +'\x031-2' +'\x051-VAS' +'\x0217' +'\x0218' +'\x012' +'\x022 ' +'\x032 B' +'\x042 BU' +'\x052 HEN' +'\x052 HOO' +'\x042 KA' +'\x052 KPA' +'\x052 KPI' +'\x062 KPOO' +'\x042 L2' +'\n2 LONG MBO' +'\x052 MBA' +'\x052 MBE' +'\x062 MBOO' +'\x052 MBU' +'\x062 NGGU' +'\x052 NJA' +'\x052 NJU' +'\x052 POO' +'\x052 SEE' +'\x042 TI' +'\x082 TIMES ' +'\t2 TIMES A' +'\x102 TIMES IGI GUNU' +'\n2 TIMES UD' +'\x042 VI' +'\x032 Y' +'\x042 YA' +'\x052-VAS' +'\x0320B' +'\x0222' +'\x0224' +'\x0726 EYYY' +'\x03272' +'\x013' +'\x053 BOO' +'\x033 D' +'\x043 EE' +'\x073 EIGHT' +'\x053 FOO' +'\x063 GBEE' +'\x063 HEEI' +'\x053 HIN' +'\x053 HON' +'\x033 I' +'\x043 JE' +'\x043 JO' +'\x043 KU' +'\x043 L3' +'\x043 LE' +'\x043 LO' +'\x0b3 LONG NGGO' +'\x053 NDI' +'\x063 NGGA' +'\x073 OMEGA' +'\x043 TA' +'\n3 TIMES ZA' +'\x053 VEE' +'\x053 WEI' +'\x043 YU' +'\x053-VAS' +'\x0230' +'\x0231' +'\x0331C' +'\x0532 JE' +'\x0236' +'\x0238' +'\x014' +'\x034 A' +'\x054 ABB' +'\x034 E' +'\x044 FI' +'\x054 GBI' +'\x064 KPEE' +'\x054 KPU' +'\x044 L4' +'\x054 LEE' +'\x054 LOO' +'\x054 MBO' +'\x054 MON' +'\x064 MUAN' +'\x054 NDO' +'\x064 NGEN' +'\x064 NJOO' +'\x064 NYIN' +'\x054 TOO' +'\x044 TU' +'\x054 VOO' +'\x044 WI' +'\x054 WOO' +'\x054 WUI' +'\x054-VAS' +'\x03408' +'\x0242' +'\x0248' +'\x0249' +'\x015' +'\x045 AN' +'\x045 BB' +'\x035 F' +'\x045 FA' +'\x045 FE' +'\x045 GI' +'\x045 IN' +'\x045 KE' +'\x055 KEE' +'\x045 LI' +'\t5 LONG JO' +'\x0b5 LONG MBOO' +'\x055 MBI' +'\x055 NDU' +'\x075 NGGEE' +'\x045 OO' +'\x045 TE' +'\x175 TIMES THREE DISH TENU' +'\x035 U' +'\x045 VA' +'\x045 VE' +'\x045 WA' +'\x045 WO' +'\x055-VAS' +'\x03533' +'\x03550' +'\x035B6' +'\x016' +'\x046 DI' +'\x046 FU' +'\x056 GBA' +'\x066 GUEI' +'\x036 H' +'\x046 HE' +'\x046 HI' +'\x046 HU' +'\x066 HUAN' +'\x056 KOO' +'\x046 L6' +'\x046 LA' +'\x0b6 LONG NGGE' +'\x0c6 LONG NGGOO' +'\x066 NGGE' +'\x076 NGGOO' +'\x046 PO' +'\x046 SE' +'\x056 SIA' +'\x056 SOO' +'\x056 WEE' +'\x046 WU' +'\x056-VAS' +'\x0262' +'\x0264' +'\x017' +'\x047 BE' +'\x047 DA' +'\x047 DD' +'\x047 EI' +'\x057 FUA' +'\x057 GBE' +'\x067 GUAN' +'\x057 HUN' +'\x037 J' +'\x057 JEE' +'\x047 LU' +'\x067 MBEE' +'\x067 MBUU' +'\x057 MIN' +'\x067 NDOO' +'\x057 NEN' +'\x077 NGGUA' +'\x067 NGON' +'\x077 NGUAN' +'\x057 NIN' +'\x037 O' +'\x047 VO' +'\x057-VAS' +'\x0270' +'\x0271' +'\x1479 OVER LAK-079 GUNU' +'\x018' +'\x048 BO' +'\x048 DU' +'\x048 EN' +'\x058 FEE' +'\x048 FO' +'\x058 GBU' +'\x048 GU' +'\x068 HOOU' +'\x048 JI' +'\x038 K' +'\x048 KO' +'\x058 KPE' +'\x058 KPO' +'\x058 MAN' +'\x068 MBEE' +'\x058 NAN' +'\x068 NYAN' +'\x068 NYEN' +'\x048 PI' +'\x048 WE' +'\x058-VAS' +'\x0280' +'\x0283' +'\x019' +'\x059 DEE' +'\x049 JA' +'\x059 KUA' +'\x059 MEN' +'\x069 MUEN' +'\x059 MUN' +'\x059 NDA' +'\x059 NDE' +'\x079 NGGAA' +'\x069 NJEE' +'\x059 NON' +'\x059 NUN' +'\x049 PA' +'\x049 SI' +'\x049 SO' +'\x049 TO' +'\x059 WVA' +'\x059 WVE' +'\x059 YEE' +'\x059-VAS' +'\x0290' +'\x0291' +'\x04914D' +'\x0292' +'\x03981' +'\x01A' +'\x02A ' +'\x13A END LOGOGRAM MARK' +'\x06A MFON' +'\x0bA TENU GUNU' +'\x07A WITH ' +'\x05A YUE' +'\x02A-' +'\x06A-KARA' +'\x02A4' +'\x07A6 TENU' +'\x02A7' +'\x03A7A' +'\x02AA' +'\x04AALI' +'\x03AAM' +'\x05AAMAE' +'\x05AARAE' +'\x06AASHAE' +'\x02AB' +'\x03AB2' +'\x03ABA' +'\nABATA TREE' +'\x12ABBREVIATION MARK ' +'\x11ABBREVIATION SIGN' +'\x05ABIC ' +'\x05ABOVE' +'\x03AC ' +'\rACCOMMODATION' +'\x1cACE DIRECTION POSITION NOSE ' +'\x07ACE OF ' +'\x03ACK' +'\x04ACK ' +'\x1fACK-TILTED SHADOWED WHITE ARROW' +'\x0bACKNOWLEDGE' +'\x16ACKSLANTED SOUTH ARROW' +'\x10ACTER TABULATION' +'\x05ACUTE' +'\x02AD' +'\x07AD NECK' +'\x18AD WITH THREE DOTS BELOW' +'\x04ADA ' +'\x05ADULT' +'\x02AE' +'\x03AEA' +'\x03AEM' +'\x05AEMAE' +'\x05AEMLI' +'\x06AEMMAE' +'\x03AEN' +'\x08AEN NYAM' +'\x03AEP' +'\x05AEPEN' +'\x03AEQ' +'\x05AEREE' +'\x0bAESHAE NYAM' +'\x07AETMEUN' +'\x02AF' +'\x0eAFETY SCISSORS' +'\tAFFE FACE' +'\x06AFFIX ' +'\x10AFFRICATION MARK' +'\x0cAFU LEERAEWA' +'\x03AG ' +'\x04AGE ' +'\x05AGGER' +'\x06AGOGUE' +'\x04AGON' +'\x0bAGONAL SIGN' +'\rAGRAPHUS MARK' +'\x02AH' +'\x16AH WITH TWO DOTS ABOVE' +'\x02AI' +'\x03AIN' +'\x04AIN ' +'\tAINTBRUSH' +'\x04AIR ' +'\x08AIRPLANE' +'\x1fAISED HAND WITH FINGERS SPLAYED' +'\rAISED KNUCKLE' +'\x0eAISED KNUCKLES' +'\x02AJ' +'\x02AK' +'\x03AK ' +'\x06AK-668' +'\x0cAK4 PLUS SAG' +'\x0cAKAARAANSAYA' +'\x04AKER' +'\x06AKEUAE' +'\x08AKHA YAT' +'\x02AL' +'\x0bAL COMPUTER' +'\x07AL HORN' +'\x03ALE' +'\x05ALEPH' +'\x05ALETH' +'\x04ALF ' +'\x0bALF-CIRCLE ' +'\x05ALGAR' +'\x04ALIF' +'\x0fALIF LENGTHENER' +'\x04ALL ' +'\x05ALLOT' +'\x03ALO' +'\x05ALPHA' +'\x08ALTERNAT' +'\nALTERNATE ' +'\x13ALTERNATE LAKH MARK' +'\x0bALTERNATING' +'\x0cALTERNATING ' +'\x06ALTIRE' +'\x02AM' +'\x12AM WITH DOUBLE BAR' +'\x04AMBA' +'\x07AME DIE' +'\tAME WITH ' +'\x05AMEDH' +'\x03AMI' +'\x04AMMA' +'\rAMMA WITH DOT' +'\x06AMOND ' +'\x06AMPIRE' +'\x0bAMUSED FACE' +'\x02AN' +'\x03AN ' +'\rAN RUPEE SIGN' +'\x04AN X' +'\x03ANA' +'\x10ANABAZAR SQUARE ' +'\x04ANAE' +'\x08ANAGARI ' +'\x03AND' +'\x11AND BLACK SQUARES' +'\x0eAND COLD SWEAT' +'\x12AND LOW RIGHT RING' +'\x17AND WOMAN HOLDING HANDS' +'\x04ANDA' +'\nANDHI MARK' +'\nANDRABINDU' +'\x03ANG' +'\x05ANGE ' +'\x05ANGEL' +'\x0cANGER BUBBLE' +'\tANGGEUAET' +'\x05ANGKA' +'\x07ANGKUOQ' +'\x05ANGLE' +'\x06ANGLED' +'\x07ANGLED ' +'\x07ANGLONG' +'\x07ANGOLAT' +'\x04ANGU' +'\x04ANI ' +'\x05ANNON' +'\x0fANS-SERIF ARROW' +'\tANTAYALAN' +'\x19ANTED NORTH ARROW WITH HO' +'\x0bANTIMONIATE' +'\x08ANTIMONY' +'\x08ANUSVARA' +'\x0eANUSVARA ABOVE' +'\x03AO ' +'\x02AP' +'\x04APAQ' +'\x03APE' +'\x03APH' +'\x14APITAL H WITH STROKE' +'\x0eAPITAL LETTER ' +'\rAPPED PRESENT' +'\x05APPLE' +'\x02AQ' +'\x02AR' +'\x0bAR A SIGN A' +'\x04ARAE' +'\x08ARCASITE' +'\x08ARCHAIC ' +'\nARCHAIC II' +'\nARCHAIC YE' +'\x03ARD' +'\x15ARD SHELL FLOPPY DISK' +'\x07ARDSMAN' +'\x03ARE' +'\x03ARF' +'\nARFUL FACE' +'\x03ARK' +'\x03ARL' +'\x0bARM CIRCLE ' +'\x18ARM CIRCLE HITTING WALL ' +'\tARM CLOCK' +'\x0bARM SPIRAL ' +'\x16ARMENIAN ETERNITY SIGN' +'\tAROSHTHI ' +'\rARRED TRIDENT' +'\x08ARRIVING' +'\x05ARROW' +'\x12ARROW SHAFT WIDTH ' +'\x0bARROW WITH ' +'\nARROWHEAD ' +'\x1cARROWHEAD IN A RECTANGLE BOX' +'\x03ARS' +'\x05ARTAR' +'\x17ARTY HORN AND PARTY HAT' +'\x04ARUM' +'\x04ARY ' +'\x02AS' +'\x05ASAL ' +'\x17ASCENDING MUSICAL NOTES' +'\x03ASH' +'\x17ASHTRA SIGN CANDRABINDU' +'\x05ASKAL' +'\nASPIRATION' +'\x03ASS' +'\x0bASS OF MILK' +'\x12ASTED SWEET POTATO' +'\x08ASTERISK' +'\x02AT' +'\nAT ON BONE' +'\x07AT SHOE' +'\x07AT SIGN' +'\x03ATA' +'\x08ATEBOARD' +'\x13ATED TELLER MACHINE' +'\x12ATERRESTRIAL ALIEN' +'\x07ATH OF ' +'\x03ATI' +'\x08ATIKRAMA' +'\x05ATIN ' +'\nATIN CROSS' +'\x12ATIN SMALL LETTER ' +'\x14ATOLIAN HIEROGLYPH A' +'\tATTACHED ' +'\x06ATURE ' +'\x16ATURE OPEN ET ORNAMENT' +'\x02AU' +'\x0eAU LENGTH MARK' +'\x07AU MARK' +'\x03AUJ' +'\x03AUM' +'\x03AUS' +'\nAUTOMOBILE' +'\x02AV' +'\x08AVAGRAHA' +'\x04AVE ' +'\x17AVOURING DELICIOUS FOOD' +'\x02AW' +'\x05AWAY ' +'\x02AY' +'\x08AY-NIGHT' +'\x03AYD' +'\nAYER BEADS' +'\x04AYIN' +'\x03AYN' +'\x03AZU' +'\x01B' +'\x02B ' +'\x0bB TIMES SHE' +'\x02BA' +'\x19BA ROTATED NINETY DEGREES' +'\nBA SATANGA' +'\x0cBACK OF HAND' +'\x0eBACKHAND INDEX' +'\x08BACKWARD' +'\x05BACUS' +'\x03BAD' +'\x03BAG' +'\x04BAGS' +'\x03BAH' +'\x06BAHAR2' +'\x03BAL' +'\x04BALD' +'\x04BALL' +'\rBALL AND HOOP' +'\rBALLPOINT PEN' +'\x03BAN' +'\x03BAR' +'\x18BAR WITH SHORT RIGHT LEG' +'\nBARB ARROW' +'\rBASAN LETTER ' +'\x08BATAEAN ' +'\x04BAYI' +'\x02BB' +'\x04BBIT' +'\x04BBON' +'\x10BBREVIATION SIGN' +'\x02BE' +'\x11BE WITH MERIDIANS' +'\x03BEE' +'\tBEER MUGS' +'\x03BEH' +'\tBEH WITH ' +'\x0cBEHIND CLOUD' +'\x05BELOW' +'\x04BELT' +'\x04BENT' +'\x0fBENT OVER INDEX' +'\x08BER POLE' +'\x07BERGINE' +'\x03BET' +'\x06BETAN ' +'\x04BETH' +'\x07BETWEEN' +'\x08BETWEEN ' +'\x0cBETWEEN LIPS' +'\x13BETWEEN MIDDLE RING' +'\x14BETWEEN PALM FACINGS' +'\x06BGBIEE' +'\x03BHA' +'\x0eBHATTIPROLU AA' +'\tBIAL SIGN' +'\tBICYCLIST' +'\x0bBIDAKUON NG' +'\x08BIEE FON' +'\x07BIG YUS' +'\nBILE PHONE' +'\x08BILLIONS' +'\x05BINDU' +'\x0bBINDU BELOW' +'\x07BINING ' +'\x08BINOVILE' +'\x0bBIRGA WITH ' +'\x06BISCUS' +'\tBITE LIPS' +'\x16BKA- SHOG GI MGO RGYAN' +'\x06BLACK ' +'\x0cBLACK CIRCLE' +'\x19BLACK CIRCLED WHITE ARROW' +'\nBLACK FLAG' +'\rBLACK OCTAGON' +'\x0eBLACK PENTAGON' +'\rBLACK SQUARES' +'\nBLACK STAR' +'\x03BLE' +'\x08BLE SIGN' +'\x10BLE WATER SYMBOL' +'\x18BLIC ADDRESS LOUDSPEAKER' +'\x06BLIMAT' +'\x06BLINK ' +'\nBLOND HAIR' +'\x04BLOW' +'\x0cBLOWING FACE' +'\x05BLUE ' +'\x0cBLUE DIAMOND' +'\x02BO' +'\x0fBOARD AND MOUSE' +'\x07BOARDER' +'\x04BOAT' +'\x10BOLD GREEK CROSS' +'\nBOLD SHAFT' +'\x11BOLD WHITE CIRCLE' +'\x06BOLD X' +'\x04BOOK' +'\x05BOOTS' +'\x08BOT FACE' +'\tBOTH BENT' +'\x06BOTTLE' +'\x15BOTTOM U-SHAPED ARROW' +'\rBOWING DEEPLY' +'\x03BOX' +'\x08BOX TRAY' +'\x02BR' +'\x03BRA' +'\x08BRA FACE' +'\x0cBRATION MODE' +'\x19BREVE WITH INVERTED BREVE' +'\x11BREW YOD TRIANGLE' +'\x11BRIGHTNESS SYMBOL' +'\x0fBROWS STRAIGHT ' +'\x12BSERVER EYE SYMBOL' +'\x03BSP' +'\x05BSTER' +'\x02BU' +'\x03BUD' +'\x07BUFFALO' +'\x08BUILDING' +'\x07BULANCE' +'\x04BUNG' +'\x03BUR' +'\x06BURGER' +'\x03BUS' +'\x18BUSINESS SUIT LEVITATING' +'\x11BUT RELIEVED FACE' +'\x06BUTTON' +'\x0cBUTTON MOUSE' +'\x02BY' +'\x01C' +'\x02C ' +'\x06C CLEF' +'\x06C SIGN' +'\x08C SIYAQ ' +'\x02CA' +'\x0cCABBAGE-TREE' +'\x07CABINET' +'\x08CABLEWAY' +'\x03CAH' +'\x03CAI' +'\x04CAKE' +'\x05CAKES' +'\x05CAKRA' +'\x0cCALENDAR PAD' +'\x04CALL' +'\x06CAMERA' +'\x13CANCELLATION STROKE' +'\x06CANDRA' +'\x0cCANDRA ABOVE' +'\x0bCANDRABINDU' +'\x11CANDRABINDU ABOVE' +'\x04CANO' +'\x04CAP ' +'\x0fCAPITAL LETTER ' +'\x1cCAPITAL LETTER BOHAIRIC KHEI' +'\x12CAPITAL LETTER YOT' +'\x0fCAPITAL LETTERS' +'\x03CAR' +'\x05CARON' +'\x08CASSETTE' +'\x06CASTLE' +'\x08CAT FACE' +'\x0eCAT FACE WITH ' +'\x19CAT FACE WITH CLOSED EYES' +'\x1aCAT FACE WITH SMILING EYES' +'\x05CCEPT' +'\x04CCHH' +'\x05CCOLI' +'\x02CE' +'\x03CE ' +'\x0bCE OF PIZZA' +'\rCE OF WORSHIP' +'\x07CEILING' +'\x08CEILING ' +'\x03CEL' +'\x06CENTRE' +'\x07CENTRE ' +'\x07CENTRED' +'\x0eCEPTER OF JOVE' +'\x03CER' +'\x0eCERTAINTY SIGN' +'\x02CH' +'\x0bCH AND LAMP' +'\nCH BALLOON' +'\x10CH WITH UMBRELLA' +'\x03CHA' +'\x14CHARACTER INTRODUCER' +'\x0cCHARACTER-1B' +'\x05CHART' +'\x04CHAU' +'\x03CHE' +'\x05CHECK' +'\nCHECK MARK' +'\rCHECKER BOARD' +'\x05CHED ' +'\x08CHEIKHAN' +'\x14CHEMICAL SYMBOL FOR ' +'\x05CHEN ' +'\x05CHERY' +'\x05CHEST' +'\x03CHI' +'\x05CHICK' +'\x07CHILLU ' +'\x05CHIME' +'\x0bCHING CHICK' +'\x03CHO' +'\x05CHOOI' +'\x06CHRIVI' +'\rCHRONOUS IDLE' +'\x03CHU' +'\x04CIM ' +'\x06CIRCLE' +'$CIRCLE CONTAINING BLACK SMALL CIRCLE' +'\x12CIRCLE NUKTA ABOVE' +'\x0fCIRCLE WITH DOT' +'\x08CIRCLED ' +'\x1dCIRCLED SANS-SERIF DIGIT ZERO' +'\x13CIRCLED WHITE ARROW' +'\x0cCIRCLES AND ' +'\x11CIRCLES WITH DOTS' +'\x0fCIRCUMFLEX AND ' +'\rCITATION MARK' +'\x02CK' +'\x08CK CHART' +'\x07CK LIME' +'\x0cCK-O-LANTERN' +'\x05CKAGE' +'\x1dCKED FACE WITH EXPLODING HEAD' +'\x04CKEN' +'\nCKER BOARD' +'\x04CKET' +'\x0fCKET CALCULATOR' +'\x03CKS' +'\x05CKTIE' +'\x02CL' +'\x07CLEAVER' +'\x08CLIMBING' +'\x05CLONE' +'\x07CLOSE E' +'\x06CLOSED' +'\x0bCLOSED EYES' +'\x06CLOSET' +'\x07CLOTHES' +'\x05CLUBS' +'\x17CLUSTER-INITIAL LETTER ' +'\x02CO' +'\x06CODILE' +'\x08COENG QA' +'\nCOLATE BAR' +'\nCOLD SWEAT' +'\x0bCOMBINATION' +'\x08COMBINED' +'\nCOMBINING ' +'\x11COMBINING NUMBER ' +'\x07COMING ' +'\x05COMMA' +'\x1dCOMMA QUOTATION MARK ORNAMENT' +'\nCOMPONENT ' +'\nCOMPONENT-' +'\x10COMPRESSED ARROW' +'\x08COMPUTER' +'\x10COND PLACE MEDAL' +'\x0bCOND SCREEN' +'\tCONJOINED' +'\nCONSONANT ' +'\x10CONSONANT JOINER' +'\x0fCONSONANT SIGN ' +'\x15CONSONANT SIGN COENG ' +'\x16CONSONANT SIGN MEDIAL ' +'\x18CONSONANT SIGN PASANGAN ' +'\x07CONTACT' +'\x11CONTAINING BLACK ' +'\x11CONTINUATION SIGN' +'\x12CONTINUING OVERLAP' +'\x04COON' +'\x06COPPER' +'\x12COPPER ANTIMONIATE' +'\x04CORE' +'\x04CORN' +'\tCORN FACE' +'$CORNER ARROWS CIRCLING ANTICLOCKWISE' +'\x05COVER' +'\x02CR' +'\x07CRACKER' +'\x06CRAYON' +'\x05CREAM' +'\x10CREAMING IN FEAR' +'\x0cCRESCENT BAR' +'\x14CRESCENT MOON SYMBOL' +'\tCRESCENTS' +'\x07CRIPT G' +'\x1aCRIPT LIGATURE ET ORNAMENT' +'\x05CROSS' +'\x06CROSS ' +'\nCROSS MARK' +'\x15CROSSE STICK AND BALL' +'\x07CROSSED' +'\tCROSSED O' +'\x0cCROSSED-TAIL' +'\x15CRUCIFORM NUMBER FOUR' +'\x02CT' +'\x0bCTION MARK ' +'\x0bCTION MARK-' +'\x06CTRIC ' +'\x05CTURE' +'\x04CTUS' +'\rCULATED LORRY' +'\x06CUMBER' +'\x06CUMENT' +'\x12CUP WITHOUT HANDLE' +'\x06CUPPED' +'\x08CURLICUE' +'\x06CURLY ' +'\nCURLY HAIR' +'\nCURLY LOOP' +'\x08CURSIVE ' +'\x05CURVE' +'\x06CURVE ' +'\x06CURVED' +'\x0bCURVED BEND' +'\x04CUSP' +'\x04CUTE' +'\nCY MESSAGE' +'\x04CYCL' +'\x01D' +'\x02D ' +'\x08D BUBBLE' +'\x13D CIRCUMFLEX ACCENT' +'\x08D CROSS ' +'\x0bD MIDDLE UP' +'\x16D PLUS GISH TIMES TAK4' +'\x06D SIGN' +'\x08D SYMBOL' +'\x11D TIMES DISH TENU' +'\x0cD TIMES ESH2' +'\x0eD-UP NEWSPAPER' +'\x02DA' +'\x07DA FACE' +'\nDA SATANGA' +'\nDA2 TIMES ' +'\x03DAA' +'\x03DAD' +'\x03DAH' +'\x05DAIC ' +'\x19DAL WITH THREE DOTS BELOW' +'\x06DALETH' +'\x0bDALETH-RESH' +'\x05DAMMA' +'\x08DAMMATAN' +'\x07DANCING' +'\x05DANDA' +'\x07DANESE ' +'\x05DARA3' +'\x0bDASH SYMBOL' +'\x0cDASHED ARROW' +'\x05DBOAT' +'\x02DD' +'\x03DDA' +'\x04DDHI' +'\x05DDING' +'\x08DDY BEAR' +'\x02DE' +'\x18DE INVERTED BRIDGE BELOW' +'\x0bDE KIKAKUI ' +'\nDE-HEADED ' +'\nDECORATION' +'\nDED PERSON' +'\x03DEN' +'\tDENT AND ' +'\x0bDENT EMBLEM' +'\x03DEO' +'\nDEOGRAPH A' +'\x16DEOGRAPHIC TALLY MARK ' +'\tDEPARTURE' +'\x05DEPTH' +'\x03DER' +'\x03DES' +'\tDESCENDER' +'\x18DESCENDING MUSICAL NOTES' +'\x0bDESK PERSON' +'\x08DESTRIAN' +'\x06DGEHOG' +'\x04DGER' +'\x02DH' +'\x03DHA' +'\x05DHAM ' +'\x03DHE' +'\x02DI' +'\tDIAERESIS' +'\x08DIAGONAL' +'\tDIAGONAL ' +'\x0eDIAGONAL PATH ' +'\x07DIAMOND' +'\x08DIAMONDS' +'\x04DIC ' +'\rDIC MARK SIGN' +'\x06DIGIT ' +'\x08DIM GUNU' +'\x0eDING CHARACTER' +'\x03DIO' +'\x0eDIO MICROPHONE' +'\x04DISC' +'\x04DISH' +'\x08DIT CARD' +'\x04DIUM' +'\x05DLING' +'\x03DNA' +'\x02DO' +'\x08DOCUMENT' +'\x03DOG' +'\x03DOI' +'\x0fDOING CARTWHEEL' +'\x0bDOLLAR SIGN' +'\x05DOLLS' +'\x03DON' +'\x03DOT' +'\x04DOT ' +'\tDOT ABOVE' +'\x0eDOT ABOVE AND ' +'\x08DOT REPH' +'\x10DOTTED CRESCENTS' +'\x06DOUBLE' +'\x07DOUBLE ' +'\x0fDOUBLE ANUSVARA' +'\x1aDOUBLE BIRGA WITH ORNAMENT' +'$DOUBLE COMMA QUOTATION MARK ORNAMENT' +'\x10DOUBLE CRESCENTS' +'\x18DOUBLE HORIZONTAL STROKE' +'\x0bDOUBLE MARK' +'\x13DOUBLE MIDDLE TILDE' +'\x0fDOUBLE ORNAMENT' +'\x08DOUBLE R' +'\x0bDOUBLE RING' +'\x11DOUBLE RING ABOVE' +'\x0bDOUBLE SHAD' +'\x0fDOUBLE TRIANGLE' +'\x16DOUBLE-LINED HEAD MARK' +'\x04DOWN' +'\x05DOWN ' +'\x1dDOWN MIDDLE THUMB INDEX CROSS' +'\x0cDOWN NEUTRAL' +'\x13DOWN POINTING INDEX' +'\x0fDOWN SEQUENTIAL' +'\tDOWN SIGN' +'\tDOWN STEP' +'\x16DOWN-POINTING TRIANGLE' +'\tDOWNWARDS' +'\nDOWNWARDS ' +'\x0eDOWNWARDS AND ' +'(DOWNWARDS AND UPWARDS OPEN CIRCLE ARROWS' +'\x0fDOWNWARDS ARROW' +'\x15DOWNWARDS ARROW ABOVE' +'\x0fDOWNWARDS TREND' +'\x06DPHONE' +'\x02DR' +'\x04DRAM' +'\tDRAM SIGN' +'\x05DRINK' +'\x07DU NJAA' +'\x0bDUATION CAP' +'\x03DUB' +'\x06DUCEUS' +'\x0cDUG TIMES NI' +'\x0eDUN3 GUNU GUNU' +'\x08DUSHENNA' +'\x08DVANTAGE' +'\x05DWICH' +'\tDY BEETLE' +'\x04DZHA' +'\x01E' +'\x02E ' +'\x0eE BUTTON MOUSE' +'\x14E CONSONANT MODIFIER' +'\x07E GLASS' +'\x06E HOOK' +'\x11E LIGHT MOON ARTA' +'\x05E OF ' +'\x08E OF POO' +'\x07E WITH ' +'\x0cE WITH GRAVE' +'\x0bE WITH VEIL' +'\x02E-' +'\x02E2' +'\x0bE2 TIMES AN' +'\x03E80' +'\x02EA' +'\x04EAAE' +'\x03EAD' +'\x07EAD ORE' +'\x04EANS' +'\x0bEARS OF JOY' +'\x04EART' +'\x10EART-SHAPED EYES' +'\x05EARTH' +'\x05EAST ' +'\x0eEAST POINTING ' +'\x12EAST POINTING LEAF' +'\x16EAST-POINTING AIRPLANE' +'\x05EATH ' +'\x0fEAVY CHECK MARK' +'\nECH BUBBLE' +'\x03ECK' +'\x06ECTION' +'\x0bECTION MARK' +'\x02ED' +'\x08ED BRICK' +'\x06ED CAP' +'\x07ED FACE' +'\x08ED FLAGS' +'\nED MIDDLE ' +'\rED PAPERCLIPS' +'\x07ED RICE' +'\tED SYMBOL' +'\x0eED SYMBOL FOR ' +'\nEDESTRIANS' +'\x05EDIC ' +'\x0bEDICAL MASK' +'\x02EE' +'\x03EEE' +'\x04EEEE' +'\x03EEG' +'\x04EEJ ' +'\x03EEM' +'\x04EEM ' +'\x19EEM WITH THREE DOTS ABOVE' +'\x03EEN' +'\x03EEP' +'\x05EESHI' +'\x03EET' +'\x0bEEZING FACE' +'\x02EF' +'\tEFAIDRIN ' +'\x06EFCASE' +'\x15EFT HORIZONTAL SECANT' +'\x1bEFT POINTING BACKHAND INDEX' +'\x14EFTWARDS ARROW WITH ' +'\x02EH' +'\x08EH WITH ' +'\x17EH WITH SMALL TEH ABOVE' +'\x02EI' +'\x05EIDON' +'\x05EIGHT' +'\x06EIGHT ' +'\x07EIGHT K' +'\tEIGHT OF ' +'\x15EIGHT SPOKED ASTERISK' +'\x06EIGHTH' +'\nEIGHTIETHS' +'\x06EIGHTY' +'\x03EIN' +'\x04EIPT' +'\x02EK' +'\x05EKEET' +'\x02EL' +'\x03ELD' +'\x19ELD HOCKEY STICK AND BALL' +'\x0cELECTED AREA' +'\x08ELEPHANT' +'\x0cELETION MARK' +'\x0bELLOW HEART' +'\x0bELTIC CROSS' +'\x04ELVE' +'\x02EM' +'\x07EM DASH' +'\x05EMBIC' +'\x0cEMELY HEAVY ' +'\x08EMICOLON' +'\x05EMLJA' +'\x02EN' +'\x03EN ' +'\x08EN NTEUM' +'\x06EN OF ' +'\x0bEN STRAIGHT' +'\x0bEN THOUSAND' +'\x0bEN TWELFTHS' +'\x05ENCIL' +'\rENCY EXCHANGE' +'\x03END' +'\x04END ' +'\x0eEND OF SECTION' +'\x10END OF TEXT MARK' +'\x05ENDAR' +'\x06ENIS F' +'\x05ENJET' +'\x0eENNA WITH BARS' +'\x06ENNANT' +'\x03ENS' +'\nENS SYMBOL' +'\x07ENSHUET' +',ENT ARROW POINTING DOWNWARDS THEN NORTH EAST' +'\x04ENTH' +'\nENTRY SIGN' +'\x04ENTY' +'\x12ENTY-TWO POINT TWO' +'\x08ENVELOPE' +'\x05EOPLE' +'\x08EOUT BOX' +'\x02EP' +'\x06EPACT ' +'\x05EPAYA' +'\x03EPH' +'\x04EPHA' +'\x1cEPIGRAPHIC LETTER SIDEWAYS I' +'\x02EQ' +'\x08EQUENCE ' +'\tEQUENTIAL' +'\x15EQUILATERAL ARROWHEAD' +'\x02ER' +'\x03ER ' +'\x08ER BOARD' +'\x06ER MUG' +'\tER SYMBOL' +'\x03ERA' +'\x10ERCURY SUBLIMATE' +'\x08ERDIGRIS' +'\x04EREN' +'\rERIAL TRAMWAY' +'\x0fERICAN FOOTBALL' +'\x05ERIN2' +'\x05ERINE' +'\tERMOMETER' +'\x0eERN PENTATHLON' +'\x07ERNIN A' +'\x04ERSE' +'\x1aERSTRASS ELLIPTIC FUNCTION' +'\x03ERT' +'\x03ERU' +'\x02ES' +'\x03ES-' +'\x03ESC' +'\x0fESEL LOCOMOTIVE' +'\x03ESH' +'\rESH2 ASTERISK' +'\rESH2 PLUS LAL' +'\x03ESS' +'\x02ET' +'\x06ET KUT' +'\x05ET TU' +'\x03ETA' +'\x03ETE' +'\x0bETEI MAYEK ' +'\x03ETH' +'\x04ETOS' +'\x06ETTER ' +'\tETTI BALL' +'\x02EU' +'\x06EU MBU' +'\x04EUAE' +'\x05EUAEM' +'\x05EUAEN' +'\x06EUAENA' +'\x05EUAEQ' +'\x08EUFEUAET' +'\x03EUM' +'\x03EUN' +'\x0bEUNJOMNDEUQ' +'\x06EUNYAM' +'\x03EUQ' +'\x05EURAE' +'\x06EUREUT' +'\x04EURI' +'\tEURO SIGN' +'\rEUROPE-AFRICA' +'\x03EUT' +'\x03EUX' +'\nEVAL COMMA' +'\x04EVEN' +'\x08EVEN OF ' +'\rEVEN TWELFTHS' +'\x13EVEN U VARIANT FORM' +'\x08EVENTEEN' +'\x06EVENTY' +'\x0cEVERING FACE' +'\x0eEVERSED OPEN E' +'\x0bEVERSED TSE' +'\x10EVERY OTHER TIME' +'\x02EW' +'\x06EWAYS ' +'\x02EX' +'\x10EXCLAMATION MARK' +'\x19EXCLAMATION MARK ORNAMENT' +'\x0eEXCLAMATION OH' +'\x0bEXED BICEPS' +'\x06EXHALE' +'\x03EXT' +'\x06EXTRA-' +'\x02EY' +'\x03EYK' +'\nEZING FACE' +'\x01F' +'\x02F ' +'\x10F WITH DOT BELOW' +'\rF WITH STROKE' +'\x02FA' +'\x04FACE' +'\nFACE WITH ' +'\x07FACING ' +'\tFACING UP' +'\x04FAIB' +'\x03FAJ' +'\x10FALLING DIAGONAL' +'\x03FAM' +'\x04FAST' +'\x05FATHA' +'\x0bFATHA WITH ' +'\x08FATHATAN' +'\x07FATIGUE' +'\x02FE' +'\x04FEED' +'\x04FEEM' +'\x03FEH' +"'FEH WITH DOT BELOW AND THREE DOTS ABOVE" +'\x04FETH' +'\x08FETY PIN' +'\x04FEUQ' +'\x0eFFED FLATBREAD' +'\x0eFFICE BUILDING' +'\x02FI' +'\x05FIER ' +'\x08FILE BOX' +'\x07FINAGH ' +'\x05FINAL' +'\x06FINAL ' +'\x0eFINAL ANUSVARA' +'\x14FINAL CONSONANT MARK' +'\x15FINAL CONSONANT SIGN ' +'\rFINAL LETTER ' +'\tFINAL NUN' +'\x08FINGER C' +'\x1bFINGER COVERING CLOSED LIPS' +'\x11FINGER-POST ARROW' +'\x0fFINGERS SPLAYED' +'\x04FIRE' +'\x0bFIRE ENGINE' +'\x04FIRI' +'\x04FISH' +'\x04FIST' +'\x04FIVE' +'\x05FIVE ' +'\x13FIVE FINGERS SPREAD' +'\x14FIVE SPOKED ASTERISK' +'\x0cFLAG ON POST' +'\x05FLAME' +'\x03FLE' +'\x07FLEURON' +'\x11FLICK ALTERNATING' +'\x05FLOOR' +'\x06FLOOR ' +'\x0bFLOORPLANE ' +'\x10FLOORPLANE SPACE' +'\x13FLOORPLANE TWISTING' +'\x08FLOURISH' +'\x06FLOWER' +'\nFLUTTERING' +'\x04FO F' +'\x0cFOLDED HANDS' +'\x06FOLDER' +'\x03FOM' +'\x0fFOOTNOTE MARKER' +'\x08FOR STOP' +'\nFORMATION ' +'\x06FORMEE' +'\x0cFORMING ARTS' +'\x06FORTIS' +'\x07FORWARD' +'\x0eFORWARD INDEX ' +'\x0fFORWARD TILTING' +'\x0cFOUNTAIN PEN' +'\x04FOUR' +'\tFOUR BENT' +'\tFOUR DOTS' +'\nFOUR DOTS ' +'\x0fFOUR DOTS WITH ' +'\x0fFOUR ENCLOSURES' +'\x0cFOUR FINGERS' +'\x16FOUR FINGERS CONJOINED' +'\x1bFOUR FINGERS CONJOINED BENT' +'\x14FOUR RAISED KNUCKLES' +'\tFRACTION ' +'\x11FRACTION ONE HALF' +'\x06FRAMES' +'\x0eFRANKS CASKET ' +'\x07FRICAN ' +'\x1cFROM BAR WITH HORIZONTAL BAR' +'\nFRONT WALL' +'\x05FROWN' +'\x08FROWNING' +'\rFROWNING FACE' +'\x02FT' +'\x03FT ' +'\rFT ARROWHEAD ' +'\x13FT-POINTING FLEURON' +'\x05FTEEN' +'\x03FTY' +'\x02FU' +'\x03FUE' +'\tFULL STOP' +'\x01G' +'\x06G FACE' +'\x08G TIMES ' +'\x13G WITH CROSSED-TAIL' +'\x12G WITH TILDE ABOVE' +'\x02GA' +'\x03GAA' +'\nGAB TIMES ' +'\x18GAF WITH INVERTED STROKE' +'\nGAGE CLAIM' +'\x03GAH' +'\x03GAI' +'\x05GALI ' +'\x04GAME' +'\tGAN2 TENU' +'\nGAP FILLER' +'\x0bGAP FILLER-' +'\x05GAROO' +'\x07GATIVE ' +'\x05GAZE-' +'\x02GB' +'\x05GBASA' +'\x06GBASAQ' +'\x05GBIEE' +'\x0cGBY FOOTBALL' +'\x02GC' +'\x06GDIAN ' +'\x02GE' +'\x03GE ' +'\x0bGE AT NIGHT' +'\x07GEMINAT' +' GEMINATION AND VOWEL LENGTH MARK' +'\x0fGEMINATION MARK' +'\x03GEN' +'\x07GENERAL' +'\x03GER' +'\x02GG' +'\x05GGER ' +'\nGGING FACE' +'\x05GGLES' +'\x0fGGLY LINE BELOW' +'\x12GGLY VERTICAL LINE' +'\x02GH' +'\x03GHA' +'\x05GHAIN' +'\x06GHETTI' +'\x06GHEUAE' +'\x07GHEUGHE' +'\x05GHNUT' +'\x03GHT' +'\x1eGHT FOUR POINTED PINWHEEL STAR' +'\nGHT LIFTER' +'\x06GHTLY ' +'\x02GI' +'\x13GIBBOUS MOON SYMBOL' +'\x06GICAL ' +'\rGIFT ENVELOPE' +'\x05GIMEL' +'\x1fGIONAL INDICATOR SYMBOL LETTER ' +'\x02GJ' +'\x07GLAGOLI' +'\x07GLASSES' +'\x03GLE' +'\x0cGLOTTAL STOP' +'\x02GN' +'\x03GN ' +'\x0bGNANT WOMAN' +'\x02GO' +'\x06GOBLIN' +'\x05GOLAT' +'\x07GOLIAN ' +'\x07GRADUAL' +'\x1cGRAPHIC CHARACTER INTRODUCER' +'\x06GRASP ' +'\x05GRAVE' +'\x0bGREEK CROSS' +'\x02GU' +'\nGUA PI MAO' +'\x0cGUARDED AREA' +'\x03GUD' +'\x04GUIN' +'\x0eGUL JONGSEONG ' +'\x05GULUS' +'\x0eGUNU TIMES ASH' +'\rGUNU TIMES HA' +'\x05GVANG' +'\x02GY' +'\x04GYAN' +'\x01H' +'\x0bH WITH HOOK' +'\x02HA' +'\tHA PLUS A' +'\x03HAA' +'\x03HAB' +'\x05HADDA' +'\x03HAH' +'\x0cHAH WITH DAL' +'\x03HAI' +'\tHAIKSUKI ' +'\x04HAIN' +'\x12HAIS LUS NTOG NTOG' +'\x07HAJANI ' +'\x06HAKING' +'\x0fHAKING PARALLEL' +'\x03HAL' +'\x04HALA' +'\x05HALA ' +'\x07HALANTA' +'\x04HALF' +'\x05HALF ' +'\x14HALF CIRCLE WITH DOT' +'\x08HALF GUR' +'\tHALF NOTE' +'\x05HALQA' +'\x06HAMEDH' +'\x05HAMZA' +'\x0bHAMZA ABOVE' +'\x03HAN' +'\x04HAND' +'\x13HAND COVERING MOUTH' +'\x0cHAND FORMAT ' +'\tHAND SIGN' +' HAND WITH MIDDLE FINGER EXTENDED' +'\x1bHANDED INTERLACED PENTAGRAM' +'\nHANDS SIGN' +'\x0bHANG KHUDAM' +'\x04HAPH' +'\x03HAQ' +'\x03HAR' +'\x0bHAR2 TIMES ' +'\x08HARBAHAY' +'\tHARD SIGN' +'\x06HARIOT' +'\x03HAT' +'\x03HAU' +'\x03HAV' +'\x0bHAWH HMONG ' +'\x05HAYIN' +'\x02HD' +'\x02HE' +'\x03HEA' +'\tHEAD MARK' +'\x1bHEAD MARK WITH MOON AND SUN' +'\x0cHEAD-BANDAGE' +'\x07HEADING' +'\tHEADSCARF' +'\nHEADSTROKE' +'\x05HEART' +'\x11HEART-SHAPED EYES' +'\x06HEARTS' +'\x0bHEATED FACE' +'\x06HEAVY ' +'\x10HEAVY BARB ARROW' +'\x0bHEAVY SHAFT' +'\x04HECK' +'\x05HECK ' +'\x04HEEJ' +'\x06HEEKS ' +'\x04HEEL' +'\x0bHEELED SHOE' +'\x04HEEM' +'\x04HEEN' +'\x03HEH' +'\x04HENG' +'\rHER CHRISTMAS' +'\nHERMOMETER' +'\x04HERO' +'\x04HERU' +'\x04HETH' +'\x05HEUAE' +'\x06HEUAEP' +'\x04HEYS' +'\x04HEYT' +'\x02HH' +'\x03HHA' +'\x02HI' +'\rHI TIMES ASH2' +'\x0cHIBITED SIGN' +'\rHIEROGLYPHIC ' +'\x06HIEUKH' +'\x04HIGH' +'\x05HIGH ' +'\x1fHIGH EXTRA-LOW CONTOUR TONE BAR' +'\x03HII' +'\x12HILOSOPHERS SULFUR' +'\x05HIMEL' +'\x03HIN' +'\x05HINGE' +'\x06HINGE ' +'\x06HINGED' +'\tHINOCEROS' +'\x07HIOPIC ' +'\x04HIP ' +'\x0eHIRD-STAGE HLI' +'\x07HIRTEEN' +'\x05HIRTY' +'\x08HITTING ' +'\x07HIUCHUS' +'\x06HIVETE' +'\x04HMI ' +'\x15HOCKEY STICK AND PUCK' +'\x03HOI' +'\x03HOJ' +'\x05HOLUS' +'\x03HOM' +'\x04HOM ' +'\x04HOOK' +'\x05HOOK ' +'\x0fHOOKED INDEX UP' +'\x04HOOL' +'\x08HOP BELL' +'\x04HOPH' +'\x11HORIZONTAL SECANT' +'\x11HORIZONTAL STROKE' +'\x05HORSE' +'\x06HORT I' +'\x0eHORT RIGHT LEG' +'\x04HOST' +'\x05HOTEL' +'\x08HOULDER ' +'\x08HOUSANDS' +'\x03HOX' +'\x04HREE' +'\x06HREE D' +'\tHREE DOTS' +'\nHREE DOTS ' +'\x0cHREE FINGERS' +'\x08HREE OF ' +'\x17HREE POINTED BLACK STAR' +'\rHREE TWELFTHS' +'\x14HREE-DOT NUKTA ABOVE' +'\x0eHREE-LEGGED TE' +'\x05HROOM' +'\x02HT' +'\x1eHT CENTRALIZATION STROKE BELOW' +'\x04HUB2' +'\x04HUET' +'\x04HUMB' +'\x05HUMP ' +'\x07HUNDRED' +'\x12HUNDREDS UNIT MARK' +'\nHUNGARIAN ' +'\x05HUTA ' +'\x04HUVA' +'\x02HV' +'\tHWA WITH ' +'\x04HWAH' +'\x02HY' +'\x06HYPHEN' +'\x01I' +'\x0eI AND SKI BOOT' +'\x06I GUNU' +'\x06I HOOK' +'\x07I NTEUM' +'\nI PLUS ZA7' +'\x06I SIGN' +'\x19I SYLLABLE ITERATION MARK' +'\x1dI TIMES ASH OVER HI TIMES ASH' +'\x0cI TIMES TAK4' +'\x07I WITH ' +'\x02I-' +'\x05I-RES' +'\x02I2' +'\x03IAB' +'\rIAERESIS-RING' +'\x0bIAGE RETURN' +'\tIAL LINE ' +'\x07IAMOND ' +'\x18IAMOND CONTAINING BLACK ' +'\x05IARDS' +'\x06IB YAM' +'\nIC LETTER ' +'\x05ICAL ' +'\x0cICE CONTROL ' +'\tICE CREAM' +'\x08ICHAEAN ' +'\x04ICK ' +'\x05ICKET' +'\x0bICLOCKWISE ' +'\x04ICON' +'\x07ICYCLES' +'\x02ID' +'\x03IDA' +'\x06IDDHAM' +'\x03IDE' +'\x03IDO' +'\x0bIDUOUS TREE' +'\x02IE' +'\nIED SHRIMP' +'\x03IEE' +'\x0bIEN MONSTER' +'\x03IES' +'\rIFI ROHINGYA ' +'\x06IFTEEN' +'\x04IFTH' +'\x04IFTY' +'\x02IG' +'\x06IG YUS' +'\nIGATING RA' +'\x13IGATURE AYIN-DALETH' +'\nIGATURE OE' +'\x18IGATURE OPEN ET ORNAMENT' +'\x0cIGATURE SHRI' +'\x06IGGLES' +'\x04IGHT' +'\nIGHT ANGLE' +'\nIGHT RULER' +'\rIGHT TWELFTHS' +'\x13IGHT U VARIANT FORM' +'\x0fIGHT WITH STARS' +'\x17IGHT-SHADED WHITE ARROW' +'\x07IGHTEEN' +'\x10IGHTH NOTE STEM ' +'\x03IGI' +'\x08IGI GUNU' +'\x05IGIT ' +'\x06IGIT T' +'\x04IGN ' +'\x15IGN INVERTED MCHU CAN' +'\tIGN NUKTA' +'\tIGN SAFHA' +'\nIGN SAMVAT' +'\tIGN TOMPI' +'\x12IGSAW PUZZLE PIECE' +'\x02IH' +'\x02II' +'\x03IKA' +'\x02IL' +'\x07IL DRUM' +'\tIL POLISH' +'\x05ILDE ' +'\x13ILDING CONSTRUCTION' +'\nILE FOLDER' +'\x05ILED ' +'\x04ILET' +'\x05ILVER' +'\x02IM' +'\x07IM GUNU' +'\nIMALUNGUN ' +'\x04IMEL' +'\x05IMGBA' +'\x05IMMER' +'\x03IMN' +'\x03IMP' +'\x0bIMULTANEOUS' +'\x02IN' +'\x03IN ' +'\x0cIN MIDDLE UP' +'\x18IN WITH THREE DOTS BELOW' +'\x05INAL ' +'\tINAL NOTE' +'\tINARBORAS' +'\x10INDEPENDENT SHIN' +'\x1dINDEPENDENT VOWEL SIGN COENG ' +'\x05INDEX' +'\x06INDEX ' +'\nINDEX BENT' +'\x0cINDEX MIDDLE' +'\x12INDEX RING LITTLE ' +'\x14INDEX RING LITTLE ON' +'\x1eINDEX THUMB CURVE THUMB INSIDE' +'\x10INDEX THUMB SIDE' +'\x08INDEX UP' +'\x04INDI' +'\x0eINDICTION SIGN' +'\x03INE' +'\x08INFINITY' +'\x03ING' +'\x04ING ' +'\x08ING BELL' +'\x08ING BOWL' +'\x0eING HANDS SIGN' +'\x16ING HEAD IN SILHOUETTE' +'\tING HEART' +'\x0cING HITTING ' +'\x06ING IN' +'\nING LITTLE' +'\x07ING OF ' +'\x19ING ON THE FLOOR LAUGHING' +'\x07ING OUT' +'\x11ING POLE AND FISH' +'\x13ING SHIRT WITH SASH' +'\tING STONE' +'\x0eING TERMINATOR' +'\nING-SHIFT ' +'\x04INGE' +'\x05INGED' +'\x10INGER-POST ARROW' +'\x06INGLE ' +'\x06INHALE' +'\x08INITIAL ' +'\x11INITIAL LETTER RA' +'\x05INNA ' +'\x07INNABAR' +'\tINNYIIYHE' +'\x0eINOLOGICAL DOT' +'\x0eINSERTION SIGN' +'\x06INSIDE' +'\x0cINSIDE MOUTH' +'\x14INSIDE MOUTH RELAXED' +'\x14INTERROBANG ORNAMENT' +'\x04INU ' +'\x0cINUSOID SIGN' +'\x08INVERTED' +'\x0eINVERTED BIRGA' +'\x14INVERTED BREVE BELOW' +'\x0fINVERTED LAZY S' +'\x11INVERTED MCHU CAN' +'\x04INY ' +'\x03ION' +'\x08ION MARK' +'\x02IP' +'\x12IPLE MUSICAL NOTES' +'\x10IPPER-MOUTH FACE' +'\x18IPT LIGATURE ET ORNAMENT' +'\x02IQ' +'\x02IR' +'\x03IR2' +'\x05IRACY' +'\x05IRAMA' +'\x05IRCLE' +'\x10IRCLE FOR RECORD' +'\x06IRCLED' +'\rIRCLED INDEX ' +'\x0bIRCLED TEXT' +'\x07IRCLES ' +'\x14IRCLES HITTING WALL ' +'\x07IRCLING' +'\x0eIRCULAR VIRAMA' +'\x05IRCUT' +'\x04IRON' +'\x08IRPLANE ' +'\x06IRTEEN' +'\x04IRTY' +'\x03IRY' +'\x02IS' +'\x03ISA' +'\x03ISH' +'\rISH LIRA SIGN' +'\nISMUTH ORE' +'\x18ISOSCELES RIGHT TRIANGLE' +'\x13ISPUTED END OF AYAH' +'\x06ISSANT' +'\x0eISSION TICKETS' +'\x03IST' +'\x17ISTED RIGHTWARDS ARROWS' +'\x02IT' +'\nIT MBAAKET' +'\x03ITA' +'\x08ITA MFON' +'\x0eITALIC LETTER ' +'\x04ITAR' +'\x0bITARY MEDAL' +'\x04ITE ' +'\x0eITERATION MARK' +'\x16ITHI NUMBER SIGN ABOVE' +'\x03ITO' +'\x07ITTING ' +'\x03IVE' +'\x04IVE ' +'\x12IVE FINGERS SPREAD' +'\x17IVE FINGERS SPREAD OPEN' +'\x07IVE OF ' +'\rIVE POINT ONE' +'\x13IVE SPOKED ASTERISK' +'\x0cIVE TWELFTHS' +'\x12IVE U VARIANT FORM' +'\x0bIVERY TRUCK' +'\x0cIVISION SIGN' +'\x02IW' +'\x03IWR' +'\x02IX' +'\x03IX ' +'\x06IX OF ' +'\x12IX SPOKED ASTERISK' +'\x0bIX TWELFTHS' +'\x11IX U VARIANT FORM' +'\x06IXTEEN' +'\x04IXTY' +'\x06IXTY P' +'\rIYA FRACTION ' +'\x04IYAQ' +'\x05IYEOK' +'\x03IYO' +'\x08IZONTAL ' +'\x01J' +'\x07J WITH ' +'\x1aJ WITH DOT ABOVE AND TILDE' +'\x02JA' +'\x08JACK OF ' +'\x03JAH' +'\x07JAIN OM' +'\x03JAM' +'\x07JARATI ' +'\x03JAW' +'\x02JE' +'\x04JEEM' +'\x18JEEM WITH TWO DOTS ABOVE' +'\x05JERVI' +'\x03JHA' +'\x0bJIHVAMULIYA' +'\x04JIIM' +'\x1eJK COMPATIBILITY IDEOGRAPH-FA2' +'\x15JK UNIFIED IDEOGRAPH-' +'\x02JO' +'\x06JOINER' +'\x05JUDUL' +'\x01K' +'\x02K ' +'\x0bK AND KNIFE' +'\tK GESTURE' +'\x0bK HAND SIGN' +'\x10K PERMITTED HERE' +'\x15K WITH OBLIQUE STROKE' +'\x02K-' +'\x05K-020' +'\x02KA' +'\nKA SATANGA' +'\x03KAD' +'\x03KAH' +'\x03KAK' +'\x04KAKO' +'\x04KALI' +'\x03KAM' +'\x04KAPH' +'\x03KAQ' +'\x05KARO ' +'\x07KARO BA' +'\x05KAROR' +'\x06KASAR ' +'\x06KASKAL' +'\x05KASRA' +'\x14KASRA WITH DOT BELOW' +'\x08KASRATAN' +'\tKATAKANA ' +'\x03KAU' +'\x06KAVYKA' +'\rKAVYKA ABOVE ' +'\x05KBALL' +'\x02KE' +'\x11KE BOTTLE AND CUP' +'\tKEN HEART' +'\x05KESH2' +'\x03KET' +'\x07KEUAERI' +'\x04KEUP' +'\x03KEY' +'\x08KEYBOARD' +'\x04KHAH' +'\x06KHINYA' +'\x05KHMU ' +'\x02KI' +'\x06KILLER' +'\nKINDI MVOP' +'\tKING BOOT' +'\tKING FACE' +'\x04KINI' +'\x19KISIM5 TIMES U2 PLUS MASH' +'\x04KISS' +'\x04KMA ' +'\x05KNIFE' +'\x05KNOBS' +'\x02KO' +'\x03KO ' +'\x04KOKE' +'\x04KOKO' +'\x03KOM' +'\x07KPAK WA' +'\x04KPEN' +'\x0bKRAINIAN IE' +'\x0bKTAIL GLASS' +'\x05KTOP ' +'\x03KU3' +'\x03KUE' +'\x13KULL AND CROSSBONES' +'\x03KUR' +'\x12KUSHU2 PLUS KASKAL' +'\x05KWAEN' +'\x06KY WAY' +'\tKYO TOWER' +'\x01L' +'\tL ME HAND' +'\x05L NET' +'\x0bL OF THREAD' +'\x07L WITH ' +'\x10L WITH DESCENDER' +'\x1aL WITH DOUBLE MIDDLE TILDE' +'\x02LA' +'\x04LAAM' +'\x0bLABIAL SIGN' +'\x05LACK ' +'\x18LACK CIRCLED WHITE ARROW' +'\nLACK JOKER' +'\x0bLACK SULFUR' +'\x0bLACKLETTER ' +'\x11LAGOLITIC LETTER ' +'\x03LAH' +'\x07LAK-050' +'\x04LAKH' +'\tLAKH MARK' +'\x03LAM' +'\x04LAM ' +'\x04LAMA' +'\x06LAMEDH' +'\x07LAMITE ' +'\tLAN SIGN ' +'\x1aLANTED SOUTH ARROW WITH HO' +'\x03LAP' +'\x05LARGE' +'\x06LARGE ' +'\x0cLARGE DOUBLE' +'\x1bLARGE EQUILATERAL ARROWHEAD' +'\x18LARGE TRIANGLE ARROWHEAD' +'\x0cLARGE TRIPLE' +'\x07LASHES ' +'\x14LASHING SWEAT SYMBOL' +'\x03LAT' +'\x08LAT SIGN' +'\x06LATIN ' +'\x15LATIN CAPITAL LETTER ' +'\x08LATION X' +'\x03LAU' +'\x03LAW' +'\x08LAYALAM ' +'\x04LBOX' +'\x0bLCE TSA CAN' +'\x02LD' +'\x03LD ' +'\x06LD MAP' +'\x11LD PERMIC LETTER ' +'\x0bLD SCRIPT X' +'\x08LD SWEAT' +'\tLD TAMIL ' +'\x04LDER' +'\x02LE' +'\x19LE TENNIS PADDLE AND BALL' +'\x14LE WITH POPPING CORK' +'\x17LE WITH ROUNDED CORNERS' +'\x0cLEADING EYES' +'\x13LEADING MCHAN RTAGS' +'\x04LEAF' +'\x0bLEAF CLOVER' +'\x04LED ' +'\x0bLEEP SYMBOL' +'\x05LEERI' +'\x03LEF' +'\x04LEFT' +'\x05LEFT ' +'\nLEFT GUARD' +'\tLEFT HALF' +'\x0fLEFT HALF BELOW' +'\x0fLEFT HALF BLACK' +'\x0fLEFT HAND INDEX' +'\tLEFT HOOK' +'\x13LEFT POINTING INDEX' +'\x1fLEFT SEMICIRCLE WITH THREE DOTS' +'\nLEFT SERIF' +'\x13LEFT U-SHAPED ARROW' +',LEFT-LIGHTED DOWNWARDS EQUILATERAL ARROWHEAD' +'\x16LEFT-POINTING TRIANGLE' +'\x17LEFT-SHADED WHITE ARROW' +'\x14LEFT-TO-RIGHT SECANT' +'\tLEFTWARDS' +'\nLEFTWARDS ' +'\x0eLEFTWARDS AND ' +'\x0fLEFTWARDS ARROW' +'\x1fLEFTWARDS EQUILATERAL ARROWHEAD' +',LEFTWARDS OF DOWNWARDS TRIANGLE-HEADED ARROW' +'*LEFTWARDS OF UPWARDS TRIANGLE-HEADED ARROW' +'\x03LEI' +'\x0bLENGTH MARK' +'\x07LENGTH-' +'\x04LEPH' +'\x06LETTER' +'\x07LETTER ' +'\x18LETTER CHA WITH TWO DOTS' +'\x0bLETTER LLLA' +'\x11LETTER MALAYALAM ' +'\tLETTER MV' +'\x0eLETTER OVERLAP' +'\x08LETTER S' +'\x1aLETTER SMALL CAPITAL OMEGA' +'\x08LETTER Y' +'\nLETTER ZHA' +'\x07LETTERS' +'\x03LEU' +'\x0bLEU SATANGA' +'\x05LEVEN' +'\x0eLEVEN TWELFTHS' +'\x07LEYBALL' +'\x03LF ' +'\rLF BLACK STAR' +'\x07LF FACE' +'\x04LFER' +'\x04LFIE' +'\x04LFUR' +'\x02LH' +'\x11LHOUETTE OF JAPAN' +'\x02LI' +'\x05LICE ' +'\x0cLICKING LIPS' +'\x08LICOPTER' +'\x05LICUE' +'\x19LID QUILT SQUARE ORNAMENT' +'\x0bLIEVED FACE' +'\x04LIFI' +'\x10LIGHT BARB ARROW' +'\nLIGHT BULB' +'\x1bLIGHT CENTRALIZATION STROKE' +'\x1dLIGHT FOUR POINTED BLACK CUSP' +'\x07LIGHT X' +'\x0eLIGHTLY SMALL ' +'\tLIGHTNING' +'\x0cLIMBS DIGITS' +'\x04LINE' +'\x05LINE ' +'\x0bLINE FILLER' +'\x05LING ' +'\x03LIP' +'\x04LIPS' +'\x0bLITH DIGIT ' +'\x06LITTLE' +'\x07LITTLE ' +'\tLITTLE UP' +'\x07LJUDIJE' +'\x02LL' +'\x0cLL MODIFIER-' +'\x03LLA' +'\tLLAR SIGN' +'\tLLEN LEAF' +'\x07LLEYBUS' +'\x06LLHORN' +'\x06LLIPOP' +'\x0eLLISION SYMBOL' +'\x03LLL' +'\x04LLLA' +'\x10LLOW PAN OF FOOD' +'\tLLY MARK ' +'\x02LM' +'\x02LO' +'\x05LOAN ' +'\x04LOCK' +'\rLOCK WITH KEY' +'\x03LON' +'\x04LONG' +'\nLONG FINAL' +'\x0fLONG HOOK BELOW' +'\tLONG TIP ' +'\nLONG TSHEG' +'\x0eLONG-LEGGED DE' +'\x0fLOOK OF TRIUMPH' +'\x04LOOP' +'\x05LOOP ' +'\x03LOS' +'\x06LOSED ' +'\x0eLOTUS POSITION' +'\x04LOVO' +'\x03LOW' +'\x04LOW ' +'(LOW DOUBLE COMMA QUOTATION MARK ORNAMENT' +'\x1fLOW EXTRA-HIGH CONTOUR TONE BAR' +'\nLOW KAVYKA' +'\x19LOW QUILT SQUARE ORNAMENT' +'\x1dLOW-REVERSED-9 QUOTATION MARK' +'\x05LOWER' +'\x10LOWER OVER UPPER' +'\x0cLOWERED FLAG' +'\x07LOZENGE' +'\x04LPHA' +'\x05LPHIN' +'\x02LT' +'\tLT SHAKER' +'\x0bLTED FLOWER' +'\tLTERNATE ' +'\nLTERNATE U' +'\x05LTIRE' +'\x08LTRY LEG' +'\x02LU' +'\x03LU3' +'\x03LUB' +'\x07LUGGAGE' +'\x03LUM' +'\x05LURAL' +'\x05LWAY ' +'\x02LX' +'\x01M' +'\x02M ' +'\x06M FEED' +'\x0cM NSHUT NYAM' +'\x07M STONE' +'\x08M SYMBOL' +'\nM TIMES ME' +'\x07M WITH ' +'\x0cM WITH TILDE' +'\x02MA' +'\x03MAA' +'\x07MAAYYAA' +'\x07MACHINE' +'\x0bMACING FACE' +'\x06MACRON' +'\x07MACRON ' +'\x0bMACRON AND ' +'\x10MACRON AND GRAVE' +'\x06MADDAH' +'\tMAEMGBIEE' +'\rMAILBOX WITH ' +'\x05MAIZE' +'\x06MALGAM' +'\x04MALL' +'\x05MALL ' +'\rMALL CAPITAL ' +'\x0eMALL CAPITAL I' +'\x0cMALL LETTER ' +'\x0cMALL SECTION' +'\x08MALL YUS' +'\x03MAN' +'\x08MANDARIN' +'\x03MAQ' +'\rMAR TIMES KUG' +'\x04MARK' +'\x05MARK ' +'\tMARK CIM ' +'\tMARK SHAD' +'\x0bMARWARI DDA' +'\x04MARY' +'\x04MASH' +'\x07MASSAGE' +'\x04MATO' +'\x03MAU' +'\x02MB' +'\x03MB ' +'\x03MBA' +'\x03MBE' +'\x0bMBLER GLASS' +'\x16MBOL FOR MARKS CHAPTER' +'\x0bMBU LETTER ' +'\x08MCHU CAN' +'\x02ME' +'\x08ME BADGE' +'\x04MED ' +'\x0cMEDARY CAMEL' +'\x06MEDIUM' +'\x07MEDIUM ' +'\x11MEDIUM BARB ARROW' +'\x0eMEDIUM DIAMOND' +'\x0cMEDIUM SHAFT' +'\rMEDIUM SQUARE' +'\x19MEDIUM TRIANGLE ARROWHEAD' +'\x04MEEM' +'\nMEEM ABOVE' +'\x1aMEEM WITH HAH WITH TATWEEL' +'\x04MEGA' +'\x04MEKH' +'\x05MELON' +'\x03MEM' +'\x08MEM-QOPH' +'\x11MEN HOLDING HANDS' +'\x07MENIAN ' +'\x05MENOE' +'\x03MER' +'\x04MER ' +'\tMER CLOCK' +'\x07MERICAS' +'\x04MFAA' +'\x0bMFON PIPAEM' +'\x0bMIC LETTER ' +'\x04MID ' +'\x08MID TONE' +'\x0eMID-LEVEL TONE' +'\x06MIDDLE' +'\x07MIDDLE ' +'\x0bMIDDLE BENT' +'\x0bMIDDLE RING' +'\x12MIDDLE RING LITTLE' +'\x1cMIDDLE RING LITTLE CONJOINED' +'\x15MIDDLE RING LITTLE ON' +'\x0cMIDDLE TILDE' +'\tMIDDLE UP' +'\x04MIIM' +'\x04MIL ' +'\x0bMILING EYES' +'\x11MILITARY AIRPLANE' +'\x08MILLIONS' +'\x04MILY' +'\rMINDER RIBBON' +'\x1eMINTON RACQUET AND SHUTTLECOCK' +'\nMINUS SIGN' +'\nMISMA SIGN' +'\x04MIZE' +'\x03MMA' +'\x02MO' +'\rMOBILE PHONES' +'\x1aMODIFIER FITZPATRICK TYPE-' +'"MODIFIER LETTER SHAN REDUPLICATION' +'\rMODIFIER MARK' +'\x03MON' +'\x04MONO' +'\x05MOON ' +'\x0bMOON SELENA' +'\nMOTORCYCLE' +'\x08MOVEMENT' +'\x13MOVES AGAINST CHEEK' +'\x02MP' +'\rMPED ENVELOPE' +'\x11MPERSAND ORNAMENT' +'\x04MPET' +'\x06MPLING' +'\x05MSHAE' +'\x13MSHELL MOBILE PHONE' +'\x03MSP' +'\x18MTAVRULI CAPITAL LETTER ' +'\x04MUAS' +'\x04MUCH' +'\x08MULTIPLE' +'\x11MUM LETTER PHASE-' +'\x04MUSH' +'\x08MY HOUSE' +'\x07MYSLITE' +'\x01N' +'\x02N ' +'\nN NGGEUAET' +'\x11N PLUS KAK PLUS A' +'\x07N WITH ' +'\x10N WITH LEFT HOOK' +'\x06N-NISF' +'\x16N-POTABLE WATER SYMBOL' +'\x02NA' +'\x0fNA DOUBLE HELIX' +'\tNA KHONNA' +'\x08NA METEK' +'\x03NAA' +'\x05NADA ' +'\x04NAKE' +'\x04NAM2' +'\x03NAR' +'\x08NARROW O' +'\x0cNARROW SHAFT' +'\x05NASHI' +'\x03NAU' +'\x04NBOW' +'\x04NBSP' +'\x04NCER' +'\x03NCH' +'\tNCH FRIES' +'\x13NCTUS ELEVATUS MARK' +'\x02ND' +'\x0bND OF PIECE' +'\x15ND TELEPHONE RECEIVER' +'\x03ND-' +'\nNDA PA NJI' +'\tNDAILING ' +'\x13NDRED POINTS SYMBOL' +'\x02NE' +'\x11NE EYEBROW RAISED' +'\x07NE FEED' +'\x13NE HUNDRED TWENTY P' +'\x04NED ' +'\x08NED FOOD' +'\x05NEGAR' +'&NEGATIVE CIRCLED SANS-SERIF DIGIT ZERO' +'\x08NEIFORM ' +'\x04NEMA' +'\x05NENOE' +'\x03NET' +'\x13NETWORKED COMPUTERS' +'\x07NEUTRAL' +'\x08NEUTRAL ' +'\x03NEY' +'\x11NFORMATION SOURCE' +'\x02NG' +'\x0bNG LEFT LEG' +'\x14NG WITH CROSSED-TAIL' +'\x06NGBAT ' +'\x03NGE' +'\x05NGENT' +'\x04NGER' +'\tNGER SHIP' +'\x05NGINE' +'\x04NGUE' +'\x05NGUE ' +'\x02NI' +'\x03NIE' +'\tNIGHT OF ' +'\x0bNIKOLSBURG ' +'\x04NINE' +'\x08NINE OF ' +'\rNINE TWELFTHS' +'\x13NINE U VARIANT FORM' +'\x08NINETEEN' +'\x06NINETY' +'\x05NING ' +'\tNING MOOD' +'\rNING MOVEMENT' +'\x0bNITIAL IZHE' +'\x0cNJALA GONDI ' +'\x04NJAM' +'\x03NJI' +'\x02NK' +'\x06NKING ' +'\x06NKNOWN' +'\x02NN' +'\x03NNA' +'\x03NNI' +'\x06NNING ' +'\x15NNIS RACQUET AND BALL' +'\x04NNNA' +'\x0fNO GOOD GESTURE' +'\x08NO THUMB' +'\x13NOGRAPHIC FULL STOP' +'\x04NOON' +'\x0fNOON WITH KASRA' +'\x0fNOON WITH KEHEH' +'\x06NORTH ' +'\x0eNORTH ARABIAN ' +'\x0cNORTHERN TSE' +'\x04NOSE' +'\x0cNOTCHED HOOK' +'\x0cNOTCHED TAIL' +'\x04NOTE' +'\x08NOTE PAD' +'\nNOTE WITH ' +'\x06NOVILE' +'\x04NOWC' +'\x08NOWLEDGE' +'\x08NRES TOS' +'\x04NRUA' +'\x1dNS-SERIF INTERROBANG ORNAMENT' +'\x06NSANAQ' +'\x0bNSE CHEEKS ' +'\x04NSHE' +'\x05NSIEE' +'\x07NSPLUTO' +'\x05NSUAE' +'\x02NT' +'\x14NT-FACING BABY CHICK' +'\x04NTAA' +'\x10NTAIGANA LETTER ' +'\tNTESSENCE' +'\x05NTHA ' +'\x0bNTIMONY ORE' +'\x05NTXIV' +'\x03NUB' +'\x05NUKTA' +'\x07NUMBER ' +'\x11NUMBER MARK ABOVE' +'\x0bNUMBER SIGN' +'\x08NUMBER T' +'\x07NUMBERS' +'\rNUMERIC SIGN ' +'\x03NUN' +'\x07NUSVARA' +'\x04NUTS' +'\x08NVERTED ' +'\x03NYA' +'\x03NYI' +'\x03NYO' +'\x05NZEUM' +'\x01O' +'\x05O BOX' +'\tO HUNDRED' +'\x03O K' +'\tO LETTER ' +'\x06O MARK' +'\x07O WITH ' +'\x10O WITH DOT ABOVE' +'\x02O-' +'\x04OALA' +'\x03OAP' +'\x05OBILE' +'\x0eOBLIQUE STROKE' +'\x04OBRO' +'\x07OCALIC ' +'\x08OCALIC M' +'\x07OCATION' +'\x03OCK' +'\x08OCK SALT' +'\x05OCKET' +'\x07OCTAGON' +'\x0cOCTET PRESET' +'\x08OCUS OF ' +'\x02OD' +'\x03ODA' +'\x08ODESTONE' +'\x04ODLE' +'\x02OE' +'\x03OF ' +'\x0bOF ENVELOPE' +'\nOF HYGIEIA' +'\x07OF SOAP' +'\x03OFF' +'\x07OFFICER' +'\x04OFUM' +'\x08OGOGRAM ' +'\x0bOGONEK AND ' +'\x19OGONEK AND DOT ABOVE AND ' +'\x04OGRE' +'\x02OH' +'\x0bOHINGYA YEH' +'\x02OI' +'\x03OIL' +'\x06OITIC ' +'\x04OJI ' +'\x05OJKI ' +'\x02OK' +'\x0cOK HAND SIGN' +'\tOKED HEAD' +'\tOKED TAIL' +'\x05OKEE ' +'\x0cOKING SYMBOL' +'\x02OL' +'\x03OLD' +'\x04OLD ' +'\x05OLDER' +'\x06OLIDUS' +'\x04OLIN' +'\nOLING FACE' +'\x03OLL' +'\x05OLLON' +'\rOLVING HEARTS' +'\x02OM' +'\x14OM HALF BLACK CIRCLE' +'\x08OM NTEUM' +'\x08OMANIAN ' +'\x05OMBIE' +'\x17OMBINING ANUSVARA ABOVE' +'\x04OMBU' +'\x05OMEGA' +'\x0eOMING ENVELOPE' +'\x04OMMA' +'\x05OMMAE' +'\x03OMS' +'\x02ON' +'\x03ON ' +'\x08ON CROSS' +'\x07ON FACE' +'\tON TEUAEQ' +'\x0fON TOP OF MODEM' +'\x0cON US SYMBOL' +'\x1eON WITH RIGHTWARDS ARROW ABOVE' +'\x03ONE' +'\x04ONE ' +'\x08ONE DOT ' +'\x0bONE HUNDRED' +'\x1bONE LARGE AND ONE SMALL EYE' +'\x10ONE QUARTER SIGN' +'\x0eONE SOUND WAVE' +'\tONE THIRD' +'\x19ONE UNDER EIGHTEEN SYMBOL' +'\x04ONE-' +'\x18ONE-HUNDRED-AND-SIXTIETH' +'\x04ONG ' +'\tONG GRAVE' +'\x07ONGONAN' +'\x03ONI' +'\x0cONISHED FACE' +'\x08ONJOINED' +'\x0fONJOINED HINGED' +'\x16ONJOINING MACRON BELOW' +'\x06ONOCLE' +'\x1aONOMICAL SYMBOL FOR URANUS' +'\tONSONANT ' +'\x11ONSONANT MODIFIER' +'\x06ONTACT' +'\x04ONTH' +'\x07ONTIEEN' +'\x03ONU' +'\x04ONUT' +'\x02OO' +'\x03OOI' +'\x03OOK' +'\x05OOKED' +'\x11OOKED SCHWA WITH ' +'\x03OOL' +'\x06OOPED ' +'\x1aOORPLANE SHOULDER HIP MOVE' +'\x02OP' +'\nOP NKAARAE' +'\x15OP SHADED WHITE ARROW' +'\x05OPARD' +'\x04OPEN' +'\x05OPEN ' +'\x11OPEN CIRCLE ARROW' +'\x0fOPEN MARK BELOW' +'\nOPEN MOUTH' +'\tOPERATOR ' +'\x03OPH' +'\x04OPOD' +'\x06OPPER ' +'\x04OPUS' +'\x02OQ' +'\x03OQ ' +'\x0cOQ NSHUT YUM' +'\x05OQPEN' +'\x02OR' +'\x17ORAH WITH NINE BRANCHES' +'\x05ORAIL' +'\x0eORANGE DIAMOND' +'\x04ORAX' +'\x04ORD ' +'\rORD SEPARATOR' +'\x03ORE' +'\x08OREHEAD ' +'\x07ORGIAN ' +'\x08ORNAMENT' +'\x06ORNER ' +'\x06ORNERS' +'\x04ORNS' +'\nOROME SIGN' +'\nORTHERN TA' +'\x07ORTIETH' +'\x04ORTY' +'\x02OS' +'\x04OSE ' +'\x06OSETTE' +'\x06OSING ' +'\x05OSTER' +'\x02OT' +'\nOT MACHINE' +'\x08OT MBUAE' +'\x07OT NGOM' +'\x07OTATED ' +'\x07OTATION' +'\x04OTER' +'\x0eOTHERS CIRCLED' +'\tOTIFIED E' +'\nOTING STAR' +'\x07OTLESS ' +'\x18OTTOM SHADED WHITE ARROW' +'\x18OTTOM-SHADED WHITE ARROW' +'\x04OTUS' +'\x02OU' +'\x06OUBLE ' +'\x0bOUBLE DANDA' +'\x07OUBLE O' +'\x1bOUBLE RIGHT ARROWHEAD ABOVE' +'\x0cOUCHES THUMB' +'\x12OUCHTONE TELEPHONE' +'\rOUGHT BALLOON' +'\x05OUNCE' +'\x0bOUNDED FACE' +'\tOUNDED VE' +'\x03OUR' +'\x0bOUR FINGERS' +'\x15OUR FINGERS CONJOINED' +'\x05OUR K' +'\x0cOUR POINTED ' +'\x12OUR POINTED BLACK ' +'\x10OUR POINTED CUSP' +'\x0cOUR TWELFTHS' +'\x12OUR U VARIANT FORM' +'\x07OURTEEN' +'\x0bOUSEL HORSE' +'\x03OUT' +'\nOUT HANDLE' +'\nOUT INDEX ' +'\rOUT MIDDLE UP' +'\tOUT MOUTH' +'\x05OUTH ' +'\nOUTHERN TA' +'\x04OVAL' +'\x05OVER ' +'$OVER LEFTWARDS TRIANGLE-HEADED ARROW' +'\x16OVER NU11 BUR OVER BUR' +'%OVER RIGHTWARDS TRIANGLE-HEADED ARROW' +'\x08OVER SHE' +'\x07OVERLAY' +'\x02OW' +'\x03OW ' +'\x07OW ALEF' +'\x0fOW-FALLING TONE' +'\x03OWD' +'\nOWEL SIGN ' +'\x03OWN' +'\rOWN POINTING ' +'\x03OX ' +'\x02OY' +'\x07OYSTICK' +'%OZENGE CONTAINING BLACK SMALL LOZENGE' +'\x01P' +'\x02P ' +'\tP ELAMITE' +'\x07P PIEET' +'\nP STREAMER' +'\x17P WITH EXCLAMATION MARK' +'\x02PA' +'\rPA NJI PIPAEM' +'\x04PACE' +'\x12PACING CANDRABINDU' +'\x04PAGE' +'\x03PAH' +'\rPAIRED ARROWS' +'\x08PAKPAK E' +'\x0cPALATAL HOOK' +'\x04PALM' +'\x03PAN' +'\x07PANESE ' +'\x03PAP' +'\tPAP PLUS ' +'\x0cPAP PLUS LU3' +'\x0cPAP PLUS PAP' +'\x15PAP PLUS PAP PLUS LU3' +'\x04PARA' +'\x05PARAQ' +'\x0ePARATED SYMBOL' +'\x07PARATOR' +'\x08PARATOR ' +'\x0cPARENTHESES ' +'\x11PARENTHESES ABOVE' +'\x0bPARENTHESIS' +'$PART BETWEEN MIDDLE AND RING FINGERS' +'\x0ePARTMENT STORE' +'\nPASSIMBANG' +'\x06PBOARD' +'\x02PE' +'\x0cPE CARTRIDGE' +'\x06PEAKS ' +'\x04PEEI' +'\x19PEH WITH SMALL MEEM ABOVE' +'\x0ePEN MARK BELOW' +'\tPEN MOUTH' +'\x05PEN O' +'\x07PENNANT' +'\x0fPENSION RAILWAY' +'\tPENTAGRAM' +'\x06PEPPER' +'\x03PER' +'\x1fPER RIGHT SHADOWED WHITE CIRCLE' +'\x07PERCLIP' +'\x06PERSON' +'\x03PES' +'\x04PEUX' +'\x02PH' +'\x04PHAB' +'\x05PHANT' +'\x05PHONE' +'\x06PHONE ' +'\x05PHORA' +'\x02PI' +'\x06PICKET' +'\x07PICTURE' +'\x04PING' +'\x05PING ' +'\rPINWHEEL STAR' +'\x05PIRIT' +'\x07PITULUM' +'\x0bPLACE MEDAL' +'\x0bPLACEHOLDER' +'\x10PLACEHOLDER MARK' +'\rPLE CRESCENTS' +'\nPLE DAGGER' +'\tPLE HEART' +'\x08PLE LEAF' +'\x0ePLE WITH HEART' +'\x04PLET' +'\x05PLHAU' +'\x19PLICATION PROGRAM COMMAND' +'\x07PLOYAN ' +'\x04PLUG' +'\x05PLUS ' +'\tPLUS SIGN' +'\x05PLUTA' +'\x05PMUNK' +'\x02PO' +'\x08POINTED ' +'\x12POINTED BLACK STAR' +'\tPOINTING ' +'\x13POINTING DOWNWARDS ' +'\x19POINTING MAGNIFYING GLASS' +'\x06POKOJI' +'\nPOLICE CAR' +'\x04POLO' +'\x06POMMEE' +'\x0ePOMOFO LETTER ' +'\x03POQ' +'\x0cPORT CONTROL' +'\x12POSITION INDICATOR' +'\tPOSITIONS' +'\x0bPOST OFFICE' +'\nPOUND SIGN' +'\x0cPOUTING FACE' +'\x02PP' +'\x0ePPED MIDDLE UP' +'\x06PPING ' +'\nPPOPOTAMUS' +'\x08PPY DISK' +'\x1bPPY PERSON RAISING ONE HAND' +'\tPREFIXED ' +'\x11PRESSIONLESS FACE' +'\x06PRINTS' +'\tPROJECTOR' +'\x0ePROTECTED AREA' +'\x02PS' +'\x07PSTICKS' +'\x04PTY ' +'\x02PU' +'\x08PUB DAWB' +'\x06PUFFED' +'\x0bPUNCTUATION' +'\x0cPUNCTUATION ' +'\x12PUNCTUATION BINDU ' +'\x1dPUNCTUATION CHINOOK FULL STOP' +'#PUNCTUATION SIGN DIAGONAL QUADCOLON' +'\x03PUQ' +'\x07PUSHPIN' +'\x0bPUT MORTUUM' +'\x0fPUT SYMBOL FOR ' +'\x06PWATCH' +'\x01Q' +'\x02QA' +'\x04QAAF' +'\x03QAF' +'\x12QAF WITH DOT BELOW' +'\x03QAR' +'\x02QE' +'\x04QHAU' +'\x03QIF' +'\x03QIG' +'\x04QOPH' +'\x02QU' +'\x03QUA' +'\x13QUADRUPLE CRESCENTS' +'\x1eQUALS SIGN WITH INFINITY BELOW' +'\x06QUARE ' +'\x0cQUARED ARROW' +'\x07QUARTER' +'\x08QUARTER ' +'\x0bQUARTER GUR' +'\rQUARTER MOON ' +'\x12QUARTER NOTE STEM ' +'\x08QUARTERS' +'\tQUEEN OF ' +'\x07QUEEZE ' +'\x0bQUERED FLAG' +'\rQUESTION MARK' +'\x16QUESTION MARK ORNAMENT' +'\x03QUI' +'\x08QUINTILE' +'\x01R' +'\tR COASTER' +'\x07R PLUS ' +'\x03R S' +'\x06R WITH' +'\x10R WITH RIGHT LEG' +'\x0eR-OFF CALENDAR' +'\x05R-RUB' +'\x07R2 GUNU' +'\x02RA' +'\x03RA ' +'\x0bRA SOMPENG ' +'\x03RAA' +'\x06RACING' +'\x03RAE' +'\x0cRAFFIC LIGHT' +'\x0eRAGANA LETTER ' +'\x03RAH' +'\x04RAIL' +'\x07RAILWAY' +'\x04RAIN' +'\x0bRAISED FLAG' +'\x0eRAISED KNUCKLE' +'\x0fRAISED KNUCKLES' +'!RAISING BOTH HANDS IN CELEBRATION' +'\x04RAL ' +'\x04RAMA' +'\x04RAN ' +'\nRANG CITI ' +'\x0bRANSMISSION' +'\x07RANTHA ' +'\x03RAT' +'\x15RATING SYSTEM COMMAND' +'\x13RATUM SUPER STRATUM' +'\x03RAU' +'\x06RAVEL-' +'\x04RAYS' +'\x05RAYS ' +'\x10RAYS AND DOTTED ' +'\x02RB' +'\x02RC' +'\x07RCHAIC ' +'\x08RCHAIC E' +'\tRCHAIC SA' +'\x07RD DISK' +'\x07RD FACE' +'\x0eRD PLACE MEDAL' +'\nRDHACANDRA' +'\x02RE' +'\tREAK HERE' +'\x0fREAMY EYEBROWS ' +'\x16REASE FONT SIZE SYMBOL' +'\x11REATIONAL VEHICLE' +'\x08RECEIVER' +'\nRECIPITATE' +'\x0fRECITATIVE MARK' +'\x08RECT HIT' +'\tRECTANGLE' +'\x04RED ' +'\nRED CIRCLE' +'\x08RED HAIR' +'\tRED JOKER' +'\x0cRED KEYBOARD' +'\x0cRED TRIANGLE' +'\x03REE' +'\x0bREE HUNDRED' +'\x16REE-CIRCLE ALTERNATE I' +'\x13REE-QUARTER CIRCLE ' +'\tREFORMED ' +'\nREFORMED T' +'\x05REGIA' +'\x03REH' +'\x03REI' +'\x07RELAXED' +'\x15RELICT HOUSE BUILDING' +'\x06REMEDY' +'\x0cREN CROSSING' +'\x10REPETITION MARK-' +'\x04RESH' +'\nRESH BELOW' +'\tRESH-AYIN' +'\x10RESH-AYIN-DALETH' +'\x07RESSION' +'\x17RETROFLEX HOOK AND BELT' +'\x03REU' +'\x0fREVERSE SOLIDUS' +'\nREVERSED I' +'\x0cREVERSED TSE' +'\x0eREVERSED-SCHWA' +'\x03REX' +'\x04RFER' +'\x18RGLASS WITH FLOWING SAND' +'\x03RHO' +'\x02RI' +'\x03RI ' +'\x07RIANGLE' +'\x06RIBBON' +'\x04RICE' +'\x04RICK' +'\x06RIDENT' +'\tRIED FACE' +'\x05RIEEN' +'\x04RIFY' +'\x05RIGHT' +'\x06RIGHT ' +'\x10RIGHT ARROWHEAD ' +'\x0bRIGHT GUARD' +'\nRIGHT HALF' +'\x10RIGHT HALF BELOW' +'\x10RIGHT HALF BLACK' +'\x17RIGHT HORIZONTAL SECANT' +'\x1dRIGHT POINTING BACKHAND INDEX' +'\x14RIGHT POINTING INDEX' +'\nRIGHT RING' +' RIGHT SEMICIRCLE WITH THREE DOTS' +'\x1bRIGHT SHADOWED WHITE CIRCLE' +'\x14RIGHT U-SHAPED ARROW' +'+RIGHT-LIGHTED UPWARDS EQUILATERAL ARROWHEAD' +'\x16RIGHT-POINTING FLEURON' +'\x17RIGHT-POINTING TRIANGLE' +'\nRIGHTWARDS' +'\x0bRIGHTWARDS ' +'\x0fRIGHTWARDS AND ' +'\x10RIGHTWARDS ARROW' +'\x16RIGHTWARDS ARROW WITH ' +' RIGHTWARDS EQUILATERAL ARROWHEAD' +'\x03RII' +'\x05RILLA' +'\x07RILLIC ' +'\x08RILLIONS' +'\x03RIM' +'\x06RIN2 X' +'\x04RING' +'\x05RING ' +'\nRING ABOVE' +'\x0bRING LITTLE' +'\x15RING LITTLE CONJOINED' +'\x0eRING MEGAPHONE' +'\nRING THUMB' +'\x07RINKLES' +'&RIOUS FACE WITH SYMBOLS COVERING MOUTH' +'\x19RIPLE BIRGA WITH ORNAMENT' +'\tRIPLE DOT' +'\x07RIPPLE ' +'\x05RIPT ' +'\tRIS FORM ' +'\x04RISE' +'\x0fRISING DIAGONAL' +'\x0bRISING TONE' +'\x12RIST CIRCLE FRONT ' +'\x19RIST CIRCLE HITTING WALL ' +'\x0cRISTMAS TREE' +'\x05RITSI' +'\x04RITU' +'\rRIZONTAL TAIL' +'\x17RK SIDEWAYS NOON GHUNNA' +'\rRK SUNGLASSES' +'\nRKING FACE' +'\x03RKL' +'\x06RLICUE' +'\x03RMT' +'\x18RMUKHI ABBREVIATION SIGN' +'\x02RO' +'\x03RO ' +'\x06ROCKET' +'\x0cROLLING EYES' +'\x03ROM' +'\x05RONOS' +' RONT-TILTED SHADOWED WHITE ARROW' +'\x06ROPLET' +'\x04ROSS' +'\x03ROT' +'\x14ROTATED ARDHAVISARGA' +'\rROTATED BIRGA' +'\x16ROTATED NINETY DEGREES' +'\x08ROTATION' +'\tROTATION-' +'\nROUNDED ER' +'\x05RPION' +'\x02RR' +'\x03RRA' +'\x05RRED ' +'\nRRIS WHEEL' +'\x05RRITO' +'\x04RROW' +'\x11RROW SHAFT WIDTH ' +'\x04RRRA' +'\x08RSE DUNG' +'\x06RSENIC' +'\x04RSO-' +'\x02RT' +'\rRTABLE STEREO' +'\tRTS MEDAL' +'\x03RTY' +'\x02RU' +'\x04RUDA' +'\nRUDIMENTA ' +'\x05RULAI' +'\x05RULER' +'\x05RUMP-' +'\nRUPEE MARK' +'\x02RY' +'\x07RY FACE' +'\x01S' +'\x02S ' +'\x0fS IN SILHOUETTE' +'\x12S INSIDE AND ABOVE' +'\x12S PRESSED TOGETHER' +'\x11S REVOLVING LIGHT' +'\x06S SHOE' +'\x08S SYMBOL' +'\rS UP TOGETHER' +'\x07S-SAJDA' +'\x08S-SERIF ' +'\x02SA' +'\x07SA VAH ' +'\x03SAA' +'\x03SAD' +'\x05SADHE' +'\x03SAH' +'\x05SAKIN' +'\x05SAKTA' +'\x05SALAD' +'\nSALIZATION' +'\x08SALT OF ' +'\x0fSALTER PAHLAVI ' +'\x07SALTIRE' +'\x06SANDAL' +'\x07SANDHI ' +'\x0bSANDHI MARK' +'\x10SANS-SERIF ARROW' +'\x0bSAPPOINTED ' +'\x03SAR' +'\x0cSARAM GONDI ' +'\x05SARGA' +'\x03SAU' +'\x06SAUCER' +'\nSCENT MOON' +'\x05SCHWA' +'\x07SCOOTER' +'\x05SCOPE' +'\x08SCRIPT X' +'\x02SE' +'\x03SE ' +'\x08SE WEDGE' +'\x06SECANT' +'\x0cSECTION MARK' +'\x0cSECTION SIGN' +'\x04SED ' +'\x04SEEV' +'\rSELECTED AREA' +'\nSELINE ESH' +'\x08SENTAGON' +':SENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRACKET' +'\tSEPARATOR' +'\nSEPARATOR ' +'\x0eSEPARATOR MARK' +'\x12SEPTUPLE CRESCENTS' +'\x13SEQUENCE INTRODUCER' +'\nSEQUENTIAL' +'\x07SERPINA' +'\x03SET' +'\x12SET OVER BUILDINGS' +'\x02SH' +'\x03SH ' +'\x15SH AMPERSAND ORNAMENT' +'\x0bSH PLUS SHU' +'\x1bSH TIMES GISH CROSSING GISH' +'\x03SH2' +'\x11SH2 CROSSING ESH2' +'\x03SH3' +'\x03SHA' +'\tSHAB CEEB' +'\x04SHAD' +'\x04SHAE' +'\x05SHAKE' +'\x07SHAKING' +'\x08SHAN SAW' +'\x17SHAPE WITH A DOT INSIDE' +'\x0bSHE AT LEFT' +'\tSHED FACE' +'\x05SHELL' +'\x11SHELL FLOPPY DISK' +'\x04SHES' +'\rSHESH PLUS KI' +'\x0eSHESHIG TIMES ' +'\x11SHESHIG TIMES BAD' +'\x13SHHA WITH DESCENDER' +'\x03SHI' +'\x07SHIFT T' +'\x04SHIM' +'\x04SHIN' +'\x05SHIRT' +'\nSHMIRI YEH' +'\x06SHORT ' +'\x08SHORT ER' +'\x05SHPIN' +'\rSHTIN TIMES U' +'\x03SHU' +'\x04SHU ' +'\x04SHU2' +'\x04SHUL' +'\x02SI' +'\rSIA-AUSTRALIA' +'\x07SIDDHAM' +'\x04SIDE' +'\x05SIDE ' +'\x15SIDE TO SIDE SCISSORS' +'\x0eSIDE-DOWN FACE' +'\x04SIGN' +'\x05SIGN ' +'\x0fSIGN COMBINING ' +'\x11SIGN O WITH CROSS' +'\x0cSIGN SIDDHAM' +'\x07SIGN UD' +'\x0bSIGN VIRAMA' +'\x03SII' +'\x06SINGLE' +'$SINGLE COMMA QUOTATION MARK ORNAMENT' +'\x03SIU' +'\tSIVE FACE' +'\x03SIX' +'\x08SIX DOTS' +'\tSIXTEENTH' +'\nSIXTEENTHS' +'\x13SLANTED NORTH ARROW' +'\x05SMALL' +'\x06SMALL ' +'\x0cSMALL DOUBLE' +'\rSMALL LETTER ' +'\x1aSMALL LETTER BOHAIRIC KHEI' +'\x0eSMALL LETTER D' +'\rSMALL LETTERS' +'\x10SMALL NOON ABOVE' +'\x12SMALL RED TRIANGLE' +'\nSMALL TAH ' +'\x0cSMALL TRIPLE' +'\tSMALL YUS' +'\x05SMILE' +'\x0cSMILING EYES' +'\x0cSMILING FACE' +'\x0eSMOKING SYMBOL' +'\x04SNOW' +'\tSOFT SIGN' +'\x08SOFTNESS' +'\x08SOGDIAN ' +'\x07SOLDIER' +'\x05SOLVE' +'\x0eSONAL COMPUTER' +'\x06SOUTH ' +'\x0cSOUTHERN TSE' +'\x07SOV ROG' +'\x02SP' +'\x06SPADES' +'\x06SPAPER' +'\x03SPE' +'\rSPEECH BUBBLE' +'\x0eSPEECH BUBBLES' +'\x0bSPEED TRAIN' +'\x05SPINE' +'\x06SPITAL' +'\x06SPLIT ' +'\x0fSPOKED ASTERISK' +'\x03SQU' +'\x06SQUARE' +'\x08SQUARED ' +'\x07SQUARES' +'\x08SQUEEZED' +'\x02SS' +'\x03SSA' +'\rSSAGE WAITING' +'\x0bSSANGKIYEOK' +'\rSSANGYESIEUNG' +'\x03SSI' +'\x1aSSIAN ASTROLOGICAL SYMBOL ' +'\x0fSSICAL BUILDING' +'\x06SSLESS' +'\x04SSOM' +'\x04SSUS' +'\x02ST' +'\x03ST ' +'\nST PALETTE' +'\x10ST QUARTER MOON ' +'\x07ST TUBE' +'\nST-FEEDING' +'\tSTAL BALL' +'\x04STAR' +'\x14STAR WITH MIDDLE DOT' +'\x0bSTEAMY ROOM' +'\tSTEBASKET' +'\tSTER FACE' +'\x0cSTICKING OUT' +'\x10STICKING OUT FAR' +'\x07STITUTE' +'\x06STLERS' +'\x05STNUT' +'\x04STOL' +'\x08STRAIGHT' +'\tSTRAIGHT ' +'\x11STRAIGHT MOVEMENT' +'\x10STRAIGHT STRETCH' +'\x13STRAIGHT THUMB BENT' +'\x06STRING' +'\x06STROKE' +'\x0cSTROKE BELOW' +'"STRONG CENTRALIZATION STROKE BELOW' +'\x0eSTRONG ISOLATE' +'\x06STROOM' +'\nSTRUCTION ' +'\x03STU' +'\x10STUCK-OUT TONGUE' +'\x02SU' +'\x04SUAB' +'\x1bSUBLINEAR COLON SKEWED LEFT' +'\x04SUCK' +'\x06SUCKED' +'\x05SURYA' +'\x03SUU' +'\x08SWIMMING' +'\x0bSWIRL BIRGA' +'\tSYLLABLE ' +'\nSYLLABLE M' +'\x18SYLLABLE REPETITION MARK' +'\x06SYMBOL' +'\x13SYMBOL FOR BEGINNER' +'\x0bSYMBOL VIDJ' +'\x07SYMBOLS' +'\x01T' +'\x02T ' +'\x0cT ABOVE LEFT' +'\nT AND BOLT' +'\x07T ASHES' +'\x1cT LITTER IN ITS PLACE SYMBOL' +'\x0cT MONGKEUAEQ' +'\x08T NGGEET' +'\x06T NJAQ' +'\x05T OF ' +'\tT OF MEAT' +'\x10T TRANSMIT STATE' +'\x07T WITH ' +'\x02TA' +'\x0eTA LINK ESCAPE' +'\nTABULATION' +'\x0cTACKED COMMA' +'\x06TAGRAM' +'\x03TAH' +'\nTAI LAING ' +'\x10TAI LAING DIGIT ' +'\x0fTAI LAING TONE-' +'\x04TAK4' +'\x0eTAKANA LETTER ' +'\nTAMAN SIGN' +'\x03TAN' +'\x08TAR EYES' +'\x06TARGET' +'\x06TATED ' +'\x03TAW' +'\x04TAXI' +'\nTCOIN SIGN' +'\x02TE' +'\rTE ORDER MARK' +'\x06TE USE' +'\x0cTEARS OF JOY' +'\rTED HAND SIGN' +'\x03TEE' +'\x04TEEN' +'\x07TELLITE' +'\x0eTELPIECE CLOCK' +'\x03TEN' +'\x05TENSE' +'\x04TENU' +'\x03TER' +'\x0eTERMINAL MARK-' +'\x0cTERNATE AYIN' +'\x04TERY' +'\x06TEUWEN' +'\x04TEXT' +'\x04TFON' +'\x02TH' +'\tTH GLOBE ' +'\x0bTH-THALATHA' +'\nTHDAY CAKE' +'\x0bTHEMATICAL ' +'\x0eTHER CHRISTMAS' +'\x15THICK LETTER SELECTOR' +'\x05THIRD' +'\x0cTHLETIC SHOE' +'\x0eTHOUGHT BUBBLE' +'\x08THOUSAND' +'\tTHOUSANDS' +'\x0eTHOUSANDS MARK' +'\x06THREE ' +'\nTHREE DISH' +'\x0cTHREE HEARTS' +'\x0eTHREE POINTED ' +'\x0eTHREE QUARTERS' +'\x11THREE SOUND WAVES' +'\x0fTHROWING A KISS' +'\x05THUMB' +'\x06THUMB ' +'\rTHUMB FORWARD' +'\nTHUMB SIDE' +'\x07THUMBS ' +'\x02TI' +'\x11TIAL ARTS UNIFORM' +'\x04TIC ' +'\x06TICAL ' +'\nTICAL DISC' +'\x04TICK' +'\x0bTIEE SHEUOQ' +'\x0bTIGHT ACUTE' +'\x13TIGHTLY-CLOSED EYES' +'\x05TILDE' +'\x05TILES' +'\x04TILL' +'\x04TILT' +'\x12TILTING FROM WAIST' +'\x06TIMES ' +'\tTIMES KUR' +'\x08TIMES UD' +'\x04TIN ' +'\x05TING ' +'\nTING HEART' +'\x0bTION BOTTLE' +'\x0bTIONAL PARK' +'\x04TIP ' +'\x0fTIP ON THE LEFT' +'\x08TIRRUP R' +'\x06TITLO ' +'\x03TIU' +'\x03TLE' +'\x06TLESS ' +'\x02TO' +'\x06TO BAR' +'\x08TO FORM ' +'\x0fTO-LEFT ISOLATE' +'\x10TO-RIGHT ISOLATE' +'\x03TOM' +'\x04TONE' +'\x05TONE ' +'\x06TONGUE' +'\tTOP RIGHT' +'\x12TOP U-SHAPED ARROW' +'\x0cTOP-LIGHTED ' +'\x03TOR' +'\x05TORCH' +'\x07TORNADO' +'\x05TORSO' +'\x04TORT' +'\x04TORY' +'\x15TOUCHING INSIDE MOUTH' +'\x13TOUCHTONE TELEPHONE' +'\x03TOV' +'\x08TOWARDS ' +'\x02TR' +'\x03TRA' +'\x05TRACK' +'\x0bTRAIGHT WAW' +'\x14TRAILING MCHAN RTAGS' +'\x03TRE' +'\tTREDECILE' +'\nTREFACTION' +'\tTRETCHED ' +'\x03TRI' +'\x08TRI DISH' +'\x0bTRIAN CAMEL' +'\x08TRIANGLE' +'\x12TRIANGLE ARROWHEAD' +'!TRIANGLE WITH DOUBLE VERTICAL BAR' +'\x10TRIANGLE-HEADED ' +'\x15TRIANGLE-HEADED ARROW' +'!TRIANGLE-HEADED OPEN CIRCLE ARROW' +'\x06TRIKE ' +'\x05TRING' +'\x05TRIOL' +'\x06TRIPLE' +'\x07TRIPLE ' +'\x10TRIPLE CRESCENTS' +'\x0cTRIPLE FLAME' +'\x03TRO' +'\x05TROKE' +'\x05TROL ' +'\x07TROLLEY' +'\x05TSEEB' +'\x05TSHEG' +'\x02TT' +'\x03TTA' +'\x03TTE' +'\x0cTTED SOLIDUS' +'\x05TTER ' +'\x07TTERFLY' +'\x03TTH' +'\x04TTTA' +'\x02TU' +'\x03TUB' +'\x03TUJ' +'\x0bTUNE COOKIE' +'\x06TURBAN' +'\x05TURN ' +'\x07TURNED ' +'\nTURNED AYB' +'$TURNED COMMA QUOTATION MARK ORNAMENT' +'\x08TURNED M' +'\x13TURNED SECTION MARK' +'\x06TUXEDO' +'\x07TWELFTH' +'\x0fTWELVE POINTED ' +'\nTWENTIETHS' +'\x03TWO' +'\x04TWO ' +'\x08TWO DOTS' +'\tTWO DOTS ' +'\x0eTWO ENCLOSURES' +'\x0bTWO FINGERS' +'\nTWO THIRDS' +'\x02TY' +'\x0bTY THOUSAND' +'\x07TYSCAPE' +'\x04TZEL' +'\x01U' +'\x02U ' +'\nU CIN HAU ' +'\x06U MBIT' +'\x13U OVER BU TIMES NA2' +'\x08U TIMES ' +'\x05U U U' +'\x07U WITH ' +'\x10U WITH LEFT HOOK' +'\x02U-' +'\x07U-BRJGU' +'\x12U-SHAPED ORNAMENTS' +'\x04U11 ' +'\x03U2 ' +'\x08U2 PLUS ' +'\nU2 PLUS BA' +'\x02U3' +'\x03UAE' +'\x04UAEM' +'\x04UAEN' +'\x04UAEP' +'\x06UAEQTU' +'\x04UAET' +'\x03UAM' +'\nUAM TSHOOJ' +'\x06UANGXI' +'\x02UB' +'\x03UB ' +'\x10UBJOINED LETTER ' +'\x0eUBJOINED SIGN ' +'\x08UBJOINER' +'\x04UBLE' +'\x08UBLE DOT' +'\x13UBLE DOT WITHIN DOT' +'\x17UBLE VERTICAL BAR BELOW' +'\x0cUBLE-STRUCK ' +'\x16UBSCRIPT SMALL LETTER ' +'\x11UCASIAN ALBANIAN ' +'\x04UCH ' +'\x06UCIBLE' +'\x02UD' +'\x08UD WITH ' +'\x08UDAWADI ' +'\x10UDLY CRYING FACE' +'\x02UE' +'\x03UE ' +'\tUE MAEMBA' +'\rUE OF LIBERTY' +'\x03UEQ' +'\x0bUETTE BREAD' +'\x02UG' +'\tUG TIMES ' +'\x06UGGAGE' +'\x07UGGLING' +'\x04UGU ' +'\x02UH' +'\x0cUH PLUS GISH' +'\x02UI' +'\x04UIRY' +'\x0bUISHED FACE' +'\x08UKEUTNDA' +'\x03UKU' +'\x04UKUN' +'\x03UKY' +'\x02UL' +'\x05ULAR ' +'\x07ULATION' +'\x07ULCANUS' +'\x03ULL' +'\tULL MOON ' +'\x08ULL STOP' +'\x03ULT' +'\x02UM' +'\x03UM ' +'\tUM TIMES ' +'\x12UM WITH DRUMSTICKS' +'\x08UMBRELLA' +'\x05UMBS ' +'\x02UN' +'\x07UN MEUT' +'\x0cUNBLENDED UK' +'\x03UND' +'\x05UNDER' +'\x06UNDER ' +'\x1aUNEVEN EYES AND WAVY MOUTH' +'\x03UNG' +'\x06UNGAAM' +'\x05UNGBA' +'\tUNGLASSES' +'\x02UO' +'\x03UOM' +'\x03UOQ' +'\x02UP' +'\x03UP ' +'\x10UP MIDDLE HINGED' +'\nUP NEUTRAL' +'\nUP OR DOWN' +'\x1aUP POINTING BACKHAND INDEX' +'\x11UP POINTING INDEX' +'\x07UP SIGN' +'\x17UP SPREAD THUMB FORWARD' +'\x07UP STEP' +'\rUP TACK ABOVE' +'\x14UP-POINTING TRIANGLE' +'\x0bUPADHMANIYA' +'\x05UPPED' +'\x0eUPPED INDEX UP' +'"UPPER BODY TILTING FROM HIP JOINTS' +'\x10UPPER OVER LOWER' +'\x07UPWARDS' +'\x08UPWARDS ' +'\x0cUPWARDS AND ' +'\rUPWARDS ARROW' +'\x13UPWARDS ARROW WITH ' +'\rUPWARDS TREND' +'\x02UQ' +'\x03UQA' +'\x05UQUET' +'\x02UR' +'\x03UR ' +'\nUR HUNDRED' +'\x06UR OF ' +'\x07URFACE ' +'\x05URINE' +'\nURIPIGMENT' +'\x03URL' +'\x06URNAMA' +'\x11URNED DAMMA BELOW' +'\tURNED GAN' +'&URNED SWIRL BIRGA WITH DOUBLE ORNAMENT' +'\x08UROPEAN ' +'\x04URVE' +'\x05URVE ' +'\x05URVED' +'\x06URVED ' +'\x02US' +'\x07US TENT' +'\x0cUSEATED FACE' +'\tUSED FACE' +'\x03USH' +'\x04USH ' +'\nUSHED FACE' +'\x07USHENNA' +'\x06USHPIN' +'\x0eUSPENSION MARK' +'\x06USTER-' +'\x02UT' +'\x03UT ' +'\x04UTAE' +'\nUTBOX TRAY' +'\x05UTEUX' +'\x04UTH ' +'\nUTH OR SPY' +'\x0bUTING WHALE' +'\tUTRA MARK' +'\nUTRAL FACE' +'\x04UTTY' +'\x02UU' +'\x02UX' +'\x01V' +'\x07V BELOW' +'\x07V WITH ' +'\x02VA' +'\x07VAGRAHA' +'\x03VAH' +'\x07VAPOURS' +'\x07VARIANT' +'\x03VAU' +'\x02VD' +'\x02VE' +'\x03VE ' +'\nVE HUNDRED' +'\x0bVE OF PEACE' +'\tVE THUMB ' +'\x07VED ICE' +'\x04VEDE' +'\x0eVEDIC ANUSVARA' +'\x03VEE' +'\nVEL SLIDER' +'\x0cVELOPE WITH ' +'\x07VEMENT-' +'\rVEN POINT ONE' +'\x0eVENIENCE STORE' +'\x03VER' +'\rVERGREEN TREE' +'\x07VERTED ' +'\x08VERTICAL' +'\x0cVERTICAL BAR' +'\x13VERTICAL BAR VIRAMA' +'\rVERTICAL BARS' +'\x13VERTICAL LINE BELOW' +'\x0fVERTICAL SECANT' +'\x0fVERTICAL STROKE' +'\x0bVERTICALLY ' +'\x15VERY HEAVY BARB ARROW' +'\x10VERY HEAVY SHAFT' +'\x0bVERY SMALL ' +'\x12VERY SMALL DIAMOND' +'\x11VERY SMALL SQUARE' +'\x03VES' +'\x03VEU' +'\tVEUAENGAM' +'\x04VEUM' +'\x04VEUX' +'\x04VEYZ' +'\x03VHA' +'\x02VI' +'\x0cVICTORY HAND' +'\nVIE CAMERA' +'\x10VIEWING CEREMONY' +'\tVIGINTILE' +'\x07VILLAIN' +'\x03VIN' +'\tVINE LEAF' +'\x05VING ' +'\x06VIRAMA' +'\x07VISARGA' +'\x06VISION' +'\x05VITAE' +'\x04VIYO' +'\x02VO' +'\x06VOCADO' +'\x08VOCALIC ' +'\tVOCALIC R' +'\x11VOCALIZATION MARK' +'\x07VOICING' +'\x08VOLAPUK ' +'\x08VOMITING' +'\x03VOP' +'\x04VOS ' +'\x06VOWEL ' +'\x07VOWEL K' +'\x11VOWEL LENGTH MARK' +'\x10VOWEL LENGTHENER' +'\x0bVOWEL SIGN ' +'\x05VRIDO' +'\x02VS' +'\x02VU' +'\x04VUEQ' +'\x03VY ' +'\x01W' +'\x08W PRINTS' +'\x0cW RIGHT RING' +'\x02WA' +'\x03WAA' +'\x04WAEN' +'\x04WAET' +'\nWALLPLANE ' +'\x1bWALLPLANE SHOULDER HIP MOVE' +'\x0fWALLPLANE SPACE' +'\x05WAQFA' +'\x04WARD' +'\x06WARDS ' +'&WARDS AND LEFTWARDS OPEN CIRCLE ARROWS' +'\x1bWARDS EQUILATERAL ARROWHEAD' +'\x04WAVE' +'\x10WAVY HAMZA BELOW' +'\x03WAW' +'\x13WAW WITH DOT WITHIN' +'\rWAW-AYIN-RESH' +'\x03WAY' +'\x02WB' +'\x06WBERRY' +'\x05WBOAT' +'\x08WBOY HAT' +'\x02WC' +'\x04WDER' +'\x02WE' +'\x0bWE PALAUNG ' +'\x05WELVE' +'\x18WELVE POINTED BLACK STAR' +'\x08WENTIETH' +'\x05WENTY' +'\x03WER' +'\x04WER ' +'\x11WER PLAYING CARDS' +'\x05WEST ' +'\x0eWEST POINTING ' +'\x12WEST POINTING LEAF' +'\x05WFISH' +'\x06WHITE ' +'\x0cWHITE ARROW ' +'%WHITE ARROW WITHIN TRIANGLE ARROWHEAD' +'\nWHITE FLAG' +'\x17WHITE FOUR POINTED CUSP' +'\nWHITE HAIR' +'\x0bWHITE JOKER' +'\x0cWHITE SQUARE' +'\nWHOLE NOTE' +'\x02WI' +'\x04WIDE' +'\x07WIDE ES' +'\x05WIDTH' +'\x07WIFRUIT' +'\x06WINDOW' +'\nWING HEART' +'\tWING STAR' +'\x04WINK' +'\x0bWINKING EYE' +'\x05WISE ' +'\x04WITH' +'\x05WITH ' +'\x06WITH C' +'\x08WITH DOT' +'\tWITH FACE' +'\x0bWITH GARDEN' +'\x12WITH JUSTIFICATION' +'\x10WITH LEFT UPTURN' +'\x1aWITH LEFTWARDS ARROW ABOVE' +'\x1dWITH RIGHTWARDS ARROW AT LEFT' +'\nWITH SERIF' +'\x10WITH SMALL CLOUD' +'\nWITH SPOON' +'\x18WITH UPWARDS ARROW ABOVE' +'\nWITH WINGS' +'\x19WITHIN TRIANGLE ARROWHEAD' +'\x02WJ' +'\x02WL' +'\x02WM' +'\x02WN' +'\x07WN FACE' +'\x1aWNING FACE WITH OPEN MOUTH' +'\rWNWARDS ARROW' +'\x13WNWARDS ARROW WITH ' +'\x02WO' +'\x07WO DOTS' +'\x08WO DOTS ' +'\nWO FINGERS' +'\x06WO OF ' +'\x0bWO TWELFTHS' +'\x15WO-CIRCLE ALTERNATE I' +'\x15WO-CIRCLE NUKTA ABOVE' +'(WO-HEADED ARROW WITH TRIANGLE ARROWHEADS' +'\x05WOMAN' +'\x13WOMEN HOLDING HANDS' +'\x03WOQ' +'\x14WORD REPETITION MARK' +'\x0eWORD SEPARATOR' +'\x04WORK' +'\x06WORKER' +'\x08WRINKLED' +'\tWRINKLES ' +'\nWRIST FLEX' +'\x08WRITING ' +'\x0cWRITING HAND' +'\tWRY SMILE' +'\x02WU' +'\x05WUAET' +'\x01X' +'\x02X ' +'\x06X FACE' +'\nX POINTED ' +'\x07X WITH ' +'\tX WITH LO' +'\tX-X BELOW' +'\x02XA' +'\x03XAN' +'\x03XAU' +'\tXCITEMENT' +'\x02XE' +'\x04XEYN' +'\nXHEEJ CEEV' +'\x02XI' +'\x08XIANGQI ' +'\x06XIMIZE' +'\x05XING ' +'\nXING GLOVE' +'\x07XOPHONE' +'\x07XT LINE' +'\x0bXTINGUISHER' +'\x15XTRA SHORT VOWEL MARK' +'\x03XWV' +'\x05XYOOJ' +'\x01Y' +'\x02Y ' +'\nY AND RICE' +'\tY BLOSSOM' +'\x06Y FACE' +'\x07Y GREEN' +'\x06Y LOOP' +'\x08Y POPPER' +'\nY THOUSAND' +'\x16Y WITH SHORT RIGHT LEG' +'\x02YA' +'\x03YAA' +'\x03YAH' +'\x03YAI' +'\x03YAN' +'\x0cYAN NUMERAL ' +'\x07YANMAR ' +'\x07YANSAYA' +'\x03YAT' +'\x03YAU' +'\x04YAWN' +'\x03YAY' +'\x02YE' +'\x03YEE' +'\x03YEH' +'\x1aYEH WITH HAMZA ABOVE WITH ' +'\x1cYEH WITH TWO DOTS BELOW AND ' +'\x08YEN SIGN' +'\tYESIEUNG-' +'\x04YEUX' +'\x05YGIEA' +'\x02YI' +'\x03YI ' +'\x0eYI WITH STROKE' +'\x03YIN' +'\x05YING ' +'\nYING CARD ' +'\tYING FACE' +'\x10YIR MKPARAQ MEUN' +'\x03YIT' +'\x0cYLEFT SYMBOL' +'\x05YMBOL' +'\x06YMBOL ' +'\nYMBOL AIVA' +'\x0cYMBOL BINDU ' +'\rYMBOL KIEVAN ' +'\rYMBOL TAU RHO' +'\x08YMBOL VI' +'\x02YN' +'\x07YNAMIC ' +'\x02YO' +'\x04YODH' +'\x06YOMBO ' +'\x06YRENE ' +'\x08YRILLIC ' +'\x02YU' +'\x01Z' +'\x02ZA' +'\x03ZAH' +'\x1aZAIN WITH INVERTED V ABOVE' +'\x0eZAKAYA LANTERN' +'\x03ZAL' +'2ZANTINE MUSICAL SYMBOL FTHORA SKLIRON CHROMA VASIS' +'\nZAR AMULET' +'\x04ZARD' +'\x04ZATA' +'\x05ZAYIN' +'\x04ZAYN' +'\x04ZEN ' +'\x04ZERO' +'\x03ZHE' +'\x07ZIGZAG ' +'\x0cZIGZAG ARROW' +'\x04ZIZ2' +'\x02ZO' +'\nZU OVER ZU' +'\x08ZWJ THAJ' +'\x02ZY' +'\x03ZZA' +'\x04ZZHE' +'\x04ZZY ' +) +_charnodes =[67466, + -34782, + -1, + 132262, + 16477, + 983080, + 197597, + 80378, + -1, + 263132, + 169417, + -1, + 328058, + 211655, + -1, + 393581, + 266001, + -1, + 459116, + 351332, + -1, + 524501, + 406310, + -1, + 590001, + 477265, + 121091, + 720895, + 524288, + -1, + 721000, + 607315, + 120832, + 851967, + 655360, + -1, + 852026, + 743696, + 120846, + 983039, + 786432, + -1, + 983073, + 859447, + -1, + 1048605, + 943048, + 120853, + 1179647, + 983040, + -1, + 1179671, + 1082395, + -1, + 1245206, + 1145883, + 120877, + 1376255, + 1179648, + -1, + -65515, + 1254047, + 120878, + -1, + 1317239, + 120879, + -1, + 1193497, + 120884, + 1572889, + 1130046, + 120857, + -1, + 1508623, + 120882, + 1703963, + 1516783, + 120856, + -1, + 1639661, + 120885, + -65508, + 1661215, + 120855, + -1, + 1786976, + 120854, + 2031615, + 1013522, + -1, + 2031648, + 1911975, + 120858, + -1, + 1967375, + 120883, + -1, + 1966718, + 121001, + 2228269, + 951317, + 120862, + 2359295, + 2162688, + -1, + 2359335, + 2235703, + -1, + -65499, + 2329660, + 120872, + -65498, + 2384849, + 120893, + -1, + 2443121, + 120873, + 2621482, + 2308807, + -1, + -65495, + 2581598, + 120874, + -1, + 2639325, + 120875, + 2818092, + 2561041, + 120895, + -1, + 2753391, + 120894, + -1, + 2759031, + 120866, + 3014707, + 2191180, + -1, + 3080242, + 2966778, + 120966, + 3211263, + 3014656, + -1, + -65487, + 3089055, + 120972, + -1, + 3152247, + 120971, + -1, + 3019211, + 120849, + 3407925, + 2965054, + 120850, + -1, + 3343506, + 120867, + 3538999, + 3348855, + 120848, + -1, + 3474715, + 120865, + -65480, + 3509229, + 120871, + -65479, + 3637274, + 120864, + -1, + 3691442, + 120996, + 3866713, + 820251, + -1, + 3932229, + 3832859, + 121052, + 4063231, + 3866624, + -1, + 4063297, + 3965979, + -1, + -65473, + 4007859, + 121054, + -65472, + 4072095, + 121055, + -1, + 4135287, + 121056, + 4325444, + 4015193, + -1, + -65469, + 4275761, + 121059, + -1, + 4331895, + 121057, + -1, + 4266999, + 121058, + 4587599, + 3874103, + -1, + 4653133, + 4556951, + -1, + 4718668, + 4616012, + -1, + 4784203, + 4689547, + -1, + -65462, + 4754236, + 121066, + -1, + 4802131, + 121064, + -1, + 4739787, + 121063, + -1, + 4680939, + 120887, + 5177343, + 4605786, + 121067, + -1, + 5055882, + 120892, + 5242963, + 4538051, + 121062, + 5373951, + 5188811, + -1, + -65454, + 5278602, + 120881, + -1, + 5324350, + 120899, + 5505110, + 5191201, + -1, + -65451, + 5472228, + 121060, + -1, + 5511543, + 121061, + 5767167, + 5444632, + -1, + -65448, + 5662645, + 120890, + -1, + 5719012, + 120891, + 5898334, + 3817022, + 120843, + 6029311, + 5832704, + -1, + 6029405, + 5921162, + 120852, + -1, + 5965071, + 120870, + -1, + 5985509, + 120844, + 6226018, + 5868433, + 120851, + 6356991, + 6161637, + -1, + -65439, + 6257691, + 120868, + -1, + 6300319, + 120869, + 6488165, + 6188876, + -1, + -65436, + 6440281, + 121018, + -1, + 6492605, + 120841, + 6684775, + 6429047, + 120838, + -1, + 6620020, + 120861, + -1, + 6628591, + 120842, + 6881407, + 689173, + 121077, + 7012351, + 6815744, + -1, + 7012465, + 6916930, + -1, + 7077998, + 6979918, + -1, + -65427, + 7050474, + 121086, + -1, + 7094131, + 121088, + -65425, + 7033793, + 120979, + -65424, + 7226464, + 120840, + -1, + 7288465, + 121089, + 7471222, + 6953397, + -1, + 7536756, + 7423083, + 121083, + -1, + 7472299, + 120876, + -65419, + 7501137, + 121085, + -1, + 7625003, + 121084, + 7798906, + 7437344, + -1, + -65416, + 7743411, + 121079, + -65415, + 7807647, + 121080, + -1, + 7870839, + 121081, + 8061053, + 7759843, + -1, + -65412, + 8030308, + 121087, + -1, + 8074961, + 121090, + -65410, + 8011080, + 121078, + -1, + 8205849, + 121082, + 8388757, + 6838551, + -1, + 8454285, + 8356891, + -1, + 8519814, + 8396087, + -1, + 8585349, + 8472440, + -1, + -65404, + 8555402, + 120888, + -1, + 8601150, + 120889, + -1, + 8555586, + 120886, + 8847499, + 8459288, + -1, + 8913034, + 8808362, + -1, + -65399, + 8883082, + 120896, + -1, + 8922206, + 120897, + -1, + 8864976, + 120898, + -65396, + 8803250, + 121035, + -1, + 9125582, + 120880, + 9306255, + 8424330, + 121030, + -1, + 9241871, + 121033, + 9437330, + 9269068, + -1, + -65391, + 9389401, + 121037, + -1, + 9441725, + 121032, + -65389, + 9393074, + 121036, + -65388, + 9578966, + 121028, + -1, + 9640316, + 120860, + 9830564, + 8344505, + -1, + 9896092, + 9775574, + 120974, + 10027007, + 9830400, + -1, + 10027163, + 9926112, + -1, + -65382, + 9994212, + 120975, + -1, + 10036530, + 120976, + -1, + 9987619, + 120977, + 10289311, + 9863502, + -1, + -65378, + 10249920, + 120985, + -1, + 10305541, + 120986, + 10485921, + 10241107, + 120992, + -1, + 10421470, + 120988, + -65374, + 10455946, + 120978, + -65373, + 10579961, + 120983, + -1, + 10623351, + 120984, + 10813615, + 9794880, + -1, + 10879145, + 10770704, + 121012, + 11010047, + 10813440, + -1, + -65368, + 10907656, + 121014, + -1, + 10953375, + 121013, + -65366, + 10849162, + 121006, + -65365, + 11109397, + 121016, + -65364, + 11169785, + 121007, + -65363, + 11228082, + 121008, + -65362, + 11289683, + 121015, + -1, + 11348438, + 121003, + -65360, + 10763592, + 121092, + -1, + 11482805, + 120906, + 11730943, + 544395, + 120922, + 11796479, + 11599872, + -1, + 11796675, + 11678502, + -1, + 11862205, + 11749608, + 120908, + 11993087, + 11796480, + -1, + 11993274, + 11877950, + 120919, + 12124159, + 11927552, + -1, + -65351, + 12026928, + 120920, + -1, + 12082832, + 120921, + -65349, + 11961378, + 120914, + -65348, + 12203602, + 120910, + -1, + 12261751, + 120912, + 12517375, + 11822862, + 120900, + 12582911, + 12386304, + -1, + 12583105, + 12460703, + 120903, + -1, + 12518539, + 120904, + -65342, + 12533310, + 120902, + -1, + 12654967, + 120901, + 12845257, + 11763335, + -1, + 12910791, + 12787444, + 120930, + 13041663, + 12846351, + 120931, + -1, + 12910837, + 120932, + -65336, + 12866482, + 120933, + -1, + 13059263, + 120929, + 13238480, + 12795208, + 120924, + 13369343, + 13172736, + -1, + 13369551, + 13251850, + 120909, + 13500415, + 13303808, + -1, + -65330, + 13383250, + 120911, + -1, + 13441399, + 120913, + -1, + 13337648, + 120926, + 13697236, + 13206555, + -1, + -65326, + 13663259, + 120925, + -65325, + 13710873, + 120928, + -1, + 13769079, + 120927, + -1, + 13638111, + 120923, + 14024977, + 466231, + -1, + 14090480, + 13994135, + -1, + 14156011, + 14051537, + 120941, + 14286847, + 14090240, + -1, + 14287071, + 14181574, + 120940, + 14417919, + 14221312, + -1, + 14418142, + 14320667, + -1, + -65315, + 14384155, + 120942, + -1, + 14431769, + 120946, + -1, + 14376592, + 120944, + 14680292, + 14238803, + 120834, + 14811135, + 14614528, + -1, + 14811363, + 14713877, + 121068, + -1, + 14746460, + 121069, + -1, + 14775633, + 121024, + 15007975, + 14648347, + -1, + -65306, + 14973979, + 120943, + -1, + 15021593, + 120947, + 15204585, + 14955786, + 120915, + -1, + 15139676, + 120916, + -65302, + 15163024, + 120945, + -1, + 15292727, + 121040, + 15532031, + 14120609, + 120949, + 15597567, + 15400960, + -1, + -65298, + 15492294, + 120948, + -65297, + 15554919, + 121039, + -1, + 15615115, + 121020, + 15794439, + 14042970, + 120950, + 15925247, + 15728640, + -1, + 15925503, + 15811667, + 120833, + 16056319, + 15859712, + -1, + 16056572, + 15948048, + 120847, + 16187391, + 15990784, + -1, + 16187641, + 16065584, + -1, + -65288, + 16133287, + 120859, + -1, + 16188030, + 121002, + -65286, + 16155669, + 120863, + -65285, + 16348475, + 120967, + -1, + 16405426, + 120997, + -65283, + 16020817, + 121019, + -65282, + 16530993, + 120845, + -1, + 16587127, + 120839, + 16777475, + 15882519, + -1, + 16843010, + 16741713, + 121038, + -1, + 16777461, + 121045, + -1, + 16812938, + 121031, + 17039622, + 16733113, + -1, + -65275, + 17009546, + 120980, + -1, + 17056851, + 120993, + -1, + 17003857, + 121009, + 17367039, + 15748802, + 120934, + 17432575, + 17235968, + -1, + 17432844, + 17335323, + -1, + -65269, + 17398811, + 120935, + -1, + 17446425, + 120937, + 17629454, + 17389898, + 121046, + -1, + 17564778, + 121047, + -65265, + 17587856, + 120936, + -65264, + 17712288, + 121065, + -1, + 17774238, + 120905, + 17957193, + 13974215, + -1, + 18022715, + 17909208, + 120957, + 18153471, + 17956864, + -1, + 18153763, + 18039891, + 120836, + 18284543, + 18087936, + -1, + 18284829, + 18187285, + 121072, + 18415615, + 18219008, + -1, + 18415899, + 18315298, + -1, + -65254, + 18372313, + 121073, + -1, + 18432424, + 121053, + -65252, + 18375878, + 121070, + -1, + 18566674, + 121071, + 18743585, + 18241815, + -1, + 18809120, + 18707771, + 120968, + -1, + 18743656, + 120973, + -1, + 18764722, + 120998, + -65246, + 18707793, + 121025, + -1, + 18955838, + 121051, + 19136809, + 18113734, + 120955, + 19267583, + 19070976, + -1, + 19267880, + 19170331, + -1, + -65241, + 19233819, + 120959, + -1, + 19281433, + 120956, + -1, + 19226256, + 120961, + 19530030, + 19092402, + 120970, + 19660799, + 19464192, + -1, + 19661101, + 19547219, + 120994, + -1, + 19596510, + 120989, + -1, + 19629077, + 120987, + 19857714, + 19498011, + -1, + 19923249, + 19823643, + 120960, + -1, + 19858785, + 120963, + -1, + 19864011, + 120964, + 20119860, + 19821883, + 120999, + -1, + 20054438, + 121004, + 20250934, + 20076816, + 121029, + -1, + 20186162, + 121041, + 20382009, + 20198182, + -1, + -65224, + 20342554, + 120907, + -1, + 20400379, + 120917, + -65222, + 20348173, + 120958, + -1, + 20536976, + 120962, + 20774911, + 17982554, + 120939, + 20840447, + 20643840, + -1, + 20840771, + 20732183, + -1, + 20906306, + 20804957, + 121050, + 21037055, + 20840448, + -1, + -65215, + 20932507, + 121048, + -1, + 20988893, + 121049, + -1, + 20874261, + 121034, + 21233991, + 20792440, + -1, + -65211, + 21203772, + 121023, + -65210, + 21260187, + 121021, + -1, + 21316573, + 121022, + -65208, + 21198210, + 121017, + -1, + 21439734, + 120938, + 21627234, + 17896459, + 120965, + 21757951, + 21561344, + -1, + 21758294, + 21644371, + 120837, + 21889023, + 21692416, + -1, + 21889361, + 21791765, + 121076, + 22020095, + 21823488, + -1, + -65200, + 21915547, + 121074, + -1, + 21971933, + 121075, + 22151507, + 21853521, + 121027, + -1, + 22086511, + 121026, + 22347775, + 22108439, + -1, + -65195, + 22246715, + 120969, + -1, + 22303666, + 121000, + 22479195, + 21713849, + -1, + 22544730, + 22430803, + 120995, + 22675455, + 22480124, + 120991, + -1, + 22545263, + 120990, + -1, + 22514570, + 120982, + 22806879, + 22436151, + 121044, + 22937599, + 22740992, + -1, + -65186, + 22833051, + 121042, + -1, + 22889437, + 121043, + 23134207, + 22771008, + -1, + -65183, + 23024562, + 121011, + -1, + 23079393, + 121005, + 23330815, + 21587934, + 120951, + 23396351, + 23199744, + -1, + 23396711, + 23299099, + -1, + -65178, + 23362587, + 120952, + -1, + 23410201, + 120954, + -65176, + 23360849, + 121010, + -65175, + 23551632, + 120953, + -65174, + 23614401, + 120981, + -65173, + 23675987, + 120835, + -1, + 23737610, + 120918, + -1, + 411463, + 121451, + 24051711, + 338935, + 121343, + 24117247, + 23920640, + -1, + 24117625, + 24009369, + -1, + 24183160, + 24053789, + -1, + 24248693, + 24154434, + -1, + -65165, + 24216753, + 121346, + -65164, + 24281060, + 121345, + -1, + 24323365, + 121348, + 24575999, + 24196465, + -1, + -65161, + 24477668, + 121347, + -1, + 24519973, + 121349, + -1, + 24117594, + 121350, + -1, + 24081712, + 121344, + 24838836, + 285206, + -1, + 24904334, + 24809165, + -1, + 24969717, + 24875330, + -1, + 25035168, + 24911159, + -1, + 25100694, + 25005417, + -1, + 25166227, + 25034752, + -1, + 25231753, + 25115335, + -1, + 25297286, + 25170502, + -1, + 25362820, + 25251346, + 121230, + -1, + 25329458, + 121231, + -65147, + 25328909, + 121228, + -1, + 25450478, + 121229, + 25690111, + 25250007, + -1, + -65144, + 25573181, + 121254, + -1, + 25632732, + 121261, + 25821582, + 25194173, + -1, + 25887116, + 25775634, + 121226, + -1, + 25853746, + 121227, + -65139, + 25853197, + 121224, + -1, + 25974766, + 121225, + 26214399, + 25789213, + -1, + 26214802, + 26112489, + -1, + -65135, + 26180877, + 121232, + -1, + 26236910, + 121233, + -1, + 26160901, + 121247, + 26542079, + 25109889, + -1, + -65131, + 26443021, + 121248, + -1, + 26499054, + 121249, + 26673563, + 25060765, + -1, + -65128, + 26639629, + 121147, + -65127, + 26703701, + 121150, + -65126, + 26761198, + 121148, + -1, + 26824210, + 121149, + 27001247, + 26623286, + -1, + -65123, + 26967309, + 121151, + -65122, + 27023342, + 121152, + -1, + 27086354, + 121153, + -1, + 26965778, + 121139, + 27328949, + 25006361, + -1, + 27394482, + 27269076, + -1, + 27460011, + 27338027, + -1, + 27525543, + 27428637, + -1, + -65115, + 27491597, + 121244, + -65114, + 27547630, + 121245, + -1, + 27610642, + 121246, + 27852799, + 27470026, + -1, + -65111, + 27753741, + 121241, + -65110, + 27809774, + 121242, + -1, + 27872786, + 121243, + 28049839, + 27404230, + -1, + -65107, + 28015885, + 121268, + -65106, + 28071918, + 121269, + -1, + 28134930, + 121270, + 28377087, + 27999865, + -1, + -65103, + 28260157, + 121257, + -1, + 28319708, + 121264, + 28573695, + 27358745, + -1, + -65100, + 28474525, + 121325, + -1, + 28518595, + 121326, + 28705214, + 27293730, + -1, + 28770749, + 28657140, + -1, + 28836284, + 28737517, + -1, + 28901818, + 28790290, + 121132, + -1, + 28868402, + 121133, + -65093, + 28867853, + 121130, + -1, + 28989422, + 121131, + -1, + 28808638, + 121134, + -1, + 28719919, + 121253, + 29295046, + 28660928, + -1, + 29360577, + 29261069, + 121237, + -1, + 29295006, + 121240, + 29491652, + 29310585, + -1, + -65085, + 29439805, + 121256, + -1, + 29499356, + 121263, + -65083, + 29448174, + 121238, + -1, + 29642258, + 121239, + 29819343, + 29235234, + -1, + 29884875, + 29780124, + -1, + -65079, + 29850893, + 121154, + -65078, + 29906926, + 121155, + -1, + 29969938, + 121156, + 30212095, + 29830977, + -1, + -65075, + 30113037, + 121144, + -65074, + 30169070, + 121145, + -1, + 30232082, + 121146, + 30409174, + 29769738, + -1, + 30474707, + 30359161, + -1, + -65070, + 30422845, + 121255, + -1, + 30482396, + 121262, + -65068, + 30440717, + 121234, + -65067, + 30627822, + 121235, + -1, + 30690834, + 121236, + 30867931, + 30377757, + -1, + 30933465, + 30806698, + 121142, + -1, + 30869512, + 121143, + -65062, + 30905790, + 121141, + -1, + 31031287, + 121140, + 31195616, + 30812362, + -1, + 31261150, + 31134378, + 121137, + -1, + 31197192, + 121138, + -65057, + 31233470, + 121136, + -1, + 31358948, + 121135, + 31523303, + 31135081, + -1, + 31588836, + 31489299, + -1, + -65053, + 31554717, + 121315, + -1, + 31598787, + 121317, + 31850495, + 31545333, + -1, + -65050, + 31751325, + 121316, + -1, + 31795395, + 121318, + 31982059, + 31496464, + -1, + -65047, + 31948045, + 121157, + -65046, + 32004078, + 121158, + -1, + 32067090, + 121159, + 32244207, + 31943260, + -1, + -65043, + 32210189, + 121160, + -65042, + 32266222, + 121161, + -1, + 32329234, + 121162, + 32506356, + 32191640, + -1, + 32571891, + 32458642, + -1, + -65038, + 32537757, + 121329, + -1, + 32581827, + 121330, + -1, + 32531510, + 121128, + -1, + 32459326, + 121448, + 32899693, + 24917361, + -1, + 32965130, + 32841015, + -1, + 33030660, + 32935278, + -1, + 33096191, + 32980601, + -1, + 33161724, + 33043818, + -1, + -65029, + 33127693, + 121286, + -1, + 33181202, + 121287, + 33423359, + 33103591, + -1, + -65026, + 33324301, + 121271, + -1, + 33377810, + 121272, + 33554945, + 33050130, + 121303, + -1, + 33521458, + 121304, + -65022, + 33520909, + 121301, + -65021, + 33642478, + 121302, + -1, + 33694208, + 121305, + 33882632, + 32990621, + -1, + -65018, + 33848589, + 121204, + -65017, + 33904622, + 121205, + -1, + 33967634, + 121206, + -65015, + 33847058, + 121198, + -1, + 34094385, + 121207, + 34275866, + 32936217, + -1, + 34341399, + 34215892, + -1, + 34406931, + 34291321, + -1, + 34472464, + 34354538, + -1, + -65009, + 34438413, + 121296, + -1, + 34491922, + 121297, + 34734079, + 34414311, + -1, + -65006, + 34635021, + 121281, + -1, + 34688530, + 121282, + 34865686, + 34371618, + -1, + -65003, + 34823136, + 121308, + -1, + 34887385, + 121309, + -1, + 34819602, + 121310, + 35192831, + 34305580, + -1, + -64999, + 35093661, + 121327, + -1, + 35137731, + 121328, + 35324459, + 34231488, + -1, + 35389994, + 35274361, + -1, + 35455523, + 35337578, + -1, + 35521056, + 35421459, + -1, + -64993, + 35486877, + 121292, + -1, + 35530947, + 121294, + 35782655, + 35474968, + -1, + -64990, + 35683485, + 121293, + -1, + 35727555, + 121295, + 35979263, + 35397351, + -1, + 35979815, + 35880211, + -1, + -64986, + 35945629, + 121277, + -1, + 35989699, + 121279, + 36241407, + 35933720, + -1, + -64983, + 36142237, + 121278, + -1, + 36186307, + 121280, + -1, + 35355917, + 121307, + 36438587, + 35274762, + -1, + 36504122, + 36388473, + -1, + 36569651, + 36451690, + -1, + 36635185, + 36538141, + -1, + -64976, + 36601244, + 121290, + -1, + 36654689, + 121291, + -64974, + 36601114, + 121288, + -1, + 36785695, + 121289, + 37027839, + 36511463, + -1, + 37028407, + 36928787, + -1, + -64970, + 36996886, + 121275, + -1, + 37038275, + 121273, + 37289983, + 36982296, + -1, + -64967, + 37193494, + 121276, + -1, + 37234883, + 121274, + -1, + 36470029, + 121306, + 37487172, + 36403234, + -1, + 37552707, + 37438964, + -1, + 37618242, + 37519341, + -1, + 37683776, + 37572114, + 121191, + -1, + 37650226, + 121192, + -64959, + 37649677, + 121189, + -1, + 37771246, + 121190, + -1, + 37590462, + 121193, + -1, + 37501750, + 121314, + 38077006, + 37426549, + -1, + 38142536, + 38042899, + -1, + -64953, + 38108317, + 121319, + -1, + 38152387, + 121322, + 38339147, + 38098933, + -1, + -64950, + 38304925, + 121320, + -1, + 38348995, + 121323, + 38600703, + 38293016, + -1, + -64947, + 38501533, + 121321, + -1, + 38545603, + 121324, + 38732372, + 38045469, + -1, + 38797906, + 38671030, + -1, + -64943, + 38770110, + 121202, + -1, + 38820505, + 121201, + -64941, + 38770110, + 121200, + -1, + 38961143, + 121199, + 39125593, + 38676682, + -1, + 39191127, + 39064234, + 121196, + -1, + 39127048, + 121197, + -64936, + 39163326, + 121195, + -1, + 39288804, + 121194, + 39453279, + 39065634, + -1, + 39518814, + 39413916, + -1, + -64932, + 39484685, + 121208, + -64931, + 39540718, + 121209, + -1, + 39603730, + 121210, + -1, + 39464765, + 121203, + 39846499, + 39426320, + -1, + -64927, + 39812365, + 121211, + -64926, + 39868398, + 121212, + -1, + 39931410, + 121213, + 40108647, + 39807580, + -1, + -64923, + 40074509, + 121214, + -64922, + 40130542, + 121215, + -1, + 40193554, + 121216, + 40370796, + 40055960, + -1, + 40436331, + 40322970, + -1, + -64918, + 40402077, + 121331, + -1, + 40446147, + 121332, + -1, + 40395830, + 121129, + -1, + 40323646, + 121449, + 40764035, + 32843708, + -1, + 40829561, + 40704437, + -1, + 40895092, + 40797705, + -1, + 40960626, + 40848914, + 121187, + -1, + 40927026, + 121188, + -64909, + 40926477, + 121185, + -1, + 41048046, + 121186, + 41287679, + 40835060, + -1, + 41288311, + 41176594, + 121183, + -1, + 41254706, + 121184, + -64904, + 41254157, + 121181, + -1, + 41375726, + 121182, + 41550462, + 40797705, + -1, + 41615996, + 41504274, + 121179, + -1, + 41582386, + 121180, + -64899, + 41581837, + 121177, + -1, + 41703406, + 121178, + 41943039, + 41490420, + -1, + 41943681, + 41831954, + 121175, + -1, + 41910066, + 121176, + -64894, + 41909517, + 121173, + -1, + 42031086, + 121174, + 42270719, + 40713783, + -1, + 42271372, + 42175373, + -1, + 42336907, + 42215899, + -1, + 42402441, + 42275510, + -1, + -64888, + 42368269, + 121126, + -1, + 42421778, + 121125, + -64886, + 42368269, + 121122, + -1, + 42552850, + 121121, + -1, + 42302046, + 121123, + -64883, + 42236966, + 121127, + -1, + 42740256, + 121124, + 42991615, + 24874489, + -1, + 42992283, + 42886347, + -1, + 43057812, + 42955131, + 121418, + 43188223, + 42991616, + -1, + -64877, + 43095872, + 121420, + -1, + 43161003, + 121419, + 43319960, + 43018206, + 121415, + 43450367, + 43253760, + -1, + -64873, + 43358016, + 121417, + -1, + 43423147, + 121416, + -64871, + 43292075, + 121414, + -64870, + 43529753, + 121413, + -1, + 43589678, + 121412, + 43778721, + 42933559, + -1, + 43844256, + 43734218, + -1, + -64866, + 43801897, + 121403, + -64865, + 43857433, + 121404, + -1, + 43918107, + 121405, + -1, + 43804068, + 121430, + 44171941, + 43746012, + 121424, + 44302335, + 44105728, + -1, + -64860, + 44204235, + 121426, + -1, + 44250649, + 121425, + 44434089, + 44137907, + 121406, + 44564479, + 44367872, + -1, + -64856, + 44471723, + 121407, + -1, + 44524742, + 121408, + 44696237, + 44387415, + 121421, + 44826623, + 44630016, + -1, + -64852, + 44733867, + 121423, + -1, + 44774937, + 121422, + 44958385, + 44644168, + 121409, + 45088767, + 44892160, + -1, + -64848, + 44996011, + 121410, + -1, + 45049030, + 121411, + 45285375, + 44930484, + -1, + -64845, + 45186205, + 121431, + -1, + 45230275, + 121432, + 45417203, + 24805710, + -1, + 45482704, + 45379738, + -1, + 45548229, + 45453634, + -1, + 45613760, + 45512542, + -1, + 45679292, + 45584706, + -1, + -64838, + 45644957, + 121163, + -64837, + 45689027, + 121164, + -1, + 45748906, + 121165, + 46006271, + 45626737, + -1, + -64834, + 45907101, + 121166, + -64833, + 45951171, + 121167, + -1, + 46011050, + 121168, + 46203588, + 45553048, + -1, + -64830, + 46171926, + 121172, + -64829, + 46234781, + 121170, + -1, + 46278851, + 121171, + -1, + 46168837, + 121169, + 46596095, + 45495665, + -1, + 46596815, + 46495582, + -1, + 46662347, + 46567746, + -1, + -64823, + 46627997, + 121220, + -64822, + 46672067, + 121221, + -1, + 46731946, + 121222, + 46989311, + 46609777, + -1, + -64819, + 46890141, + 121217, + -64818, + 46934211, + 121218, + -1, + 46994090, + 121219, + -1, + 46562053, + 121223, + 47252197, + 45441125, + -1, + 47317724, + 47209887, + -1, + 47383253, + 47285521, + -1, + -64812, + 47351259, + 121436, + -1, + 47389118, + 121435, + 47579864, + 47324923, + -1, + -64809, + 47546284, + 121439, + -1, + 47597146, + 121440, + -64807, + 47546297, + 121433, + -64806, + 47733410, + 121438, + -64805, + 47796917, + 121434, + -1, + 47859303, + 121437, + 48038624, + 47286781, + -1, + -64802, + 48004253, + 121093, + -64801, + 48061222, + 121094, + -1, + 48109997, + 121095, + 48365567, + 48003011, + -1, + 48366308, + 48271682, + -1, + -64797, + 48332809, + 121458, + -1, + 48375097, + 121459, + -1, + 48313742, + 121460, + 48693247, + 47197023, + -1, + 48693999, + 48574863, + 121441, + 48824319, + 48627712, + -1, + 48825069, + 48718505, + -1, + 48890603, + 48792968, + 121443, + -1, + 48825056, + 121444, + 49086463, + 48845729, + 121445, + -1, + 48956128, + 121446, + -64786, + 48781977, + 121442, + -1, + 49093257, + 121447, + 49348607, + 48652149, + -1, + -64783, + 49240336, + 121390, + -64782, + 49304805, + 121391, + -1, + 49364453, + 121389, + 49546022, + 45379404, + -1, + 49611554, + 49505814, + -1, + 49677073, + 49547293, + -1, + 49742596, + 49647938, + -1, + 49808123, + 49708189, + 121250, + 49938431, + 49742366, + -1, + -64774, + 49821501, + 121258, + -1, + 49881052, + 121265, + 50070271, + 49752259, + 121251, + 50200575, + 50004510, + -1, + -64770, + 50083645, + 121259, + -1, + 50143196, + 121266, + 50397183, + 50008706, + -1, + 50397955, + 50283845, + -1, + -64766, + 50345789, + 121260, + -1, + 50405340, + 121267, + -1, + 50342751, + 121252, + 50724863, + 49689969, + -1, + 50725641, + 50625693, + 121311, + 50855935, + 50659870, + -1, + -64760, + 50738532, + 121298, + -1, + 50798303, + 121283, + 50987789, + 50669763, + 121312, + 51118079, + 50922014, + -1, + -64756, + 51000676, + 121299, + -1, + 51060447, + 121284, + 51314687, + 50926250, + 121313, + 51380223, + 51184158, + -1, + -64752, + 51262820, + 121300, + -1, + 51322591, + 121285, + 51576831, + 49611477, + -1, + 51577626, + 51448150, + -1, + -64748, + 51514569, + 121519, + -64747, + 51579935, + 121518, + -64746, + 51645315, + 121517, + -64745, + 51710666, + 121516, + -64744, + 51775986, + 121515, + -64743, + 51841366, + 121514, + -1, + 51906758, + 121513, + -64741, + 51515014, + 121512, + -64740, + 52039175, + 121511, + -64739, + 52104545, + 121510, + -64738, + 52169929, + 121509, + -64737, + 52235295, + 121508, + -64736, + 52300675, + 121507, + -64735, + 52366026, + 121506, + -1, + 52431346, + 121505, + 52690943, + 49580384, + -1, + -64732, + 52591773, + 121105, + -64731, + 52648742, + 121106, + -1, + 52697517, + 121107, + 52888400, + 49490783, + -1, + 52953934, + 52860745, + -1, + 53019447, + 52901978, + -1, + 53084977, + 52990274, + -1, + 53150510, + 53051364, + 121377, + 53280767, + 53084160, + -1, + -64723, + 53160131, + 121378, + -1, + 53220010, + 121379, + 53477375, + 53091639, + -1, + -64720, + 53382516, + 121383, + -1, + 53430191, + 121385, + 53673983, + 53032305, + -1, + 53674806, + 53575652, + 121380, + 53805055, + 53608448, + -1, + -64715, + 53684419, + 121381, + -1, + 53744298, + 121382, + -1, + 53617970, + 121384, + 54002497, + 52983844, + -1, + 54068027, + 53973828, + -1, + -64710, + 54025746, + 121372, + -1, + 54068060, + 121370, + 54264638, + 54016866, + -1, + -64707, + 54224070, + 121369, + -1, + 54272395, + 121371, + -64705, + 54230714, + 121365, + -64704, + 54420678, + 121364, + -1, + 54469003, + 121366, + 54657861, + 53956206, + -1, + -64701, + 54627210, + 121374, + -64700, + 54670770, + 121376, + -1, + 54733270, + 121375, + 54920009, + 54598804, + -1, + -64697, + 54889354, + 121354, + -64696, + 54943017, + 121355, + -1, + 54995414, + 121356, + 55246847, + 54853632, + -1, + 55247693, + 55122775, + -1, + -64692, + 55213213, + 121367, + -1, + 55270182, + 121368, + -1, + 55219067, + 121373, + -64689, + 52926000, + 121452, + -1, + 55449129, + 121392, + 55640941, + 52841719, + -1, + 55706465, + 55591005, + -1, + 55771996, + 55662476, + -1, + 55837531, + 55726485, + -1, + -64683, + 55774561, + 121469, + -64682, + 55839945, + 121468, + -64681, + 55905311, + 121467, + -64680, + 55970691, + 121466, + -64679, + 56036042, + 121465, + -64678, + 56101362, + 121464, + -1, + 56166742, + 121463, + -1, + 55779828, + 121462, + 56492031, + 55732433, + -1, + 56492896, + 56360960, + -1, + -64673, + 56462452, + 121429, + -1, + 56513920, + 121428, + -1, + 56457290, + 121427, + 56819711, + 55664860, + -1, + 56820586, + 56688640, + -1, + 56886118, + 56769675, + -1, + -64667, + 56836702, + 121473, + -1, + 56889450, + 121476, + -64665, + 56857425, + 121474, + -64664, + 57050571, + 121477, + -64663, + 57103219, + 121478, + -1, + 57157443, + 121475, + 57409535, + 56756253, + -1, + -64660, + 57315689, + 121471, + -1, + 57357693, + 121472, + 57541514, + 55587622, + -1, + 57607033, + 57494775, + -1, + 57672568, + 57557366, + -1, + 57738101, + 57636898, + -1, + 57803636, + 57693918, + -1, + -64653, + 57769117, + 121116, + -1, + 57826086, + 121118, + -1, + 57749589, + 121119, + 58130431, + 57691672, + -1, + -64649, + 58031261, + 121115, + -1, + 58088230, + 121117, + -1, + 57631873, + 121456, + 58327937, + 57557085, + -1, + 58393472, + 58282966, + -1, + -64644, + 58330313, + 121503, + -64643, + 58395679, + 121502, + -64642, + 58461059, + 121501, + -64641, + 58526410, + 121500, + -1, + 58591730, + 121499, + -1, + 58350981, + 121470, + 58852229, + 58287491, + -1, + -64637, + 58824107, + 121363, + -64636, + 58875177, + 121361, + -1, + 58925851, + 121362, + 59114377, + 58789855, + -1, + 59179912, + 59083693, + 121352, + -1, + 59114795, + 121353, + -1, + 59127344, + 121351, + -1, + 59083488, + 121480, + 59442082, + 57505826, + -1, + 59507605, + 59404038, + -1, + 59573137, + 59471906, + -1, + 59638672, + 59528926, + -1, + -64625, + 59604125, + 121111, + -1, + 59661094, + 121113, + -1, + 59584597, + 121114, + 59900820, + 59526680, + -1, + -64621, + 59866269, + 121110, + -1, + 59923238, + 121112, + -1, + 59848018, + 121120, + 60162969, + 59475715, + -1, + -64617, + 60128413, + 121099, + -64616, + 60185382, + 121100, + -1, + 60234157, + 121101, + 60425118, + 60112700, + -1, + 60490653, + 60374615, + -1, + -64612, + 60456570, + 121453, + -1, + 60517562, + 121454, + -1, + 60458166, + 121457, + 60752801, + 60394745, + -1, + -64608, + 60719430, + 121108, + -1, + 60758445, + 121109, + -1, + 60698335, + 121481, + 61014966, + 59385183, + -1, + 61080496, + 60987470, + -1, + 61146024, + 61044770, + -1, + 61211559, + 61096913, + 121339, + -1, + 61145106, + 121340, + -1, + 61166821, + 121336, + 61408171, + 61085185, + -1, + -64598, + 61373709, + 121333, + -1, + 61427218, + 121334, + -64596, + 61375196, + 121337, + -64595, + 61567520, + 121338, + -64594, + 61618725, + 121342, + -64593, + 61682573, + 121335, + -1, + 61747870, + 121341, + 61997055, + 61042965, + -1, + 61998004, + 61889841, + -1, + -64589, + 61967242, + 121360, + -1, + 62007766, + 121357, + -64587, + 61967266, + 121359, + -1, + 62138879, + 121358, + 62325694, + 60971863, + -1, + 62391229, + 62285270, + -1, + 62456763, + 62361881, + -1, + -64582, + 62420365, + 121395, + -1, + 62472791, + 121396, + -64580, + 62414121, + 121393, + -1, + 62595867, + 121394, + -1, + 62336144, + 121450, + 62849990, + 62266679, + -1, + 62915523, + 62799169, + -1, + -64575, + 62881995, + 121388, + -64574, + 62942601, + 121386, + -1, + 63003945, + 121387, + 63242239, + 62873701, + -1, + -64571, + 63134226, + 121479, + -1, + 63198307, + 121482, + 63374286, + 62790713, + -1, + 63439819, + 63344039, + -1, + -64567, + 63405213, + 121102, + -64566, + 63462182, + 121103, + -1, + 63510957, + 121104, + 63766527, + 63384687, + -1, + -64563, + 63653371, + 121401, + -1, + 63714050, + 121402, + 63898581, + 63312271, + -1, + 63964114, + 63865030, + -1, + -64559, + 63915346, + 121398, + -1, + 63964272, + 121400, + 64225279, + 63904617, + -1, + -64556, + 64112006, + 121397, + -1, + 64160880, + 121399, + 64357337, + 63846986, + -1, + -64553, + 64322717, + 121096, + -64552, + 64379686, + 121097, + -1, + 64428461, + 121098, + -64550, + 64328013, + 121455, + -64549, + 64588881, + 121461, + -1, + 64645626, + 121483, + -1, + 197445, + 129304, + 64881765, + 140639, + -1, + 64947290, + 64825244, + -1, + 65012770, + 64901545, + -1, + 65078250, + 64979278, + -1, + 65143779, + 65049864, + 71129, + -1, + 65093725, + 71130, + 65274854, + 65110350, + -1, + -64539, + 65223381, + 71065, + -1, + 65277713, + 71064, + 65471465, + 65223367, + -1, + -64536, + 65434066, + 71128, + -1, + 65474321, + 71070, + -1, + 65408785, + 71069, + 65733617, + 65048117, + -1, + 65799152, + 65691851, + -1, + 65864686, + 65761100, + 71046, + -1, + 65826636, + 71047, + 66060287, + 65817847, + 71048, + -1, + 65948919, + 71049, + -1, + 65736465, + 71082, + 66192374, + 65670929, + 71040, + -64525, + 66160791, + 71053, + -64524, + 66213332, + 71131, + -64523, + 66273373, + 71051, + -1, + 66326289, + 71041, + 66520059, + 66149207, + -1, + -64520, + 66492168, + 71063, + -64519, + 66542512, + 71068, + -64518, + 66598882, + 71058, + -1, + 66653969, + 71073, + 66847745, + 66463071, + -1, + 66913279, + 66790751, + -1, + -64514, + 66861781, + 71067, + -1, + 66916113, + 71066, + -64512, + 66861781, + 71072, + -1, + 67047185, + 71071, + 67240965, + 66811938, + -1, + -64509, + 67205278, + 71084, + -64508, + 67254997, + 71083, + -1, + 67309329, + 71085, + 67503111, + 67209367, + 71044, + -1, + 67471511, + 71045, + 67634186, + 67463377, + -1, + -64503, + 67582677, + 71075, + -1, + 67637009, + 71074, + 67830797, + 67586755, + -1, + -64500, + 67779285, + 71055, + -1, + 67833617, + 71054, + 68027408, + 67783157, + -1, + -64497, + 67975893, + 71062, + -1, + 68030225, + 71061, + 68224018, + 67977309, + 71042, + -1, + 68173917, + 71043, + 68355093, + 68171689, + -1, + -64492, + 68303573, + 71057, + -1, + 68357905, + 71056, + 68551704, + 68295991, + -1, + -64489, + 68500181, + 71060, + -1, + 68554513, + 71059, + 68748315, + 68491298, + -1, + -64486, + 68696789, + 71077, + -1, + 68751121, + 71076, + -64484, + 68720392, + 71079, + -64483, + 68906905, + 71080, + -64482, + 68968549, + 71052, + -64481, + 69031518, + 71078, + -64480, + 69094729, + 71081, + -64479, + 69155541, + 71086, + -1, + 69217119, + 71050, + 69403715, + 64976930, + -1, + 69469243, + 69348191, + -1, + 69534776, + 69411990, + -1, + 69600310, + 69505943, + -1, + 69665835, + 69568099, + -1, + 69731370, + 69609213, + -1, + -64471, + 69699829, + 71114, + -1, + 69740722, + 71115, + -1, + 69692297, + 71122, + 69993519, + 69628076, + -1, + -64467, + 69961509, + 71118, + -64466, + 70002978, + 71117, + -1, + 70067203, + 71116, + 70255667, + 69935288, + -1, + -64463, + 70223957, + 71126, + -64462, + 70283425, + 71125, + -1, + 70334081, + 71127, + -64460, + 70220343, + 71124, + -64459, + 70479470, + 71123, + -1, + 70527266, + 71121, + 70778879, + 69544325, + 71119, + -1, + 70649722, + 71120, + 70909951, + 69495250, + -1, + -64454, + 70789255, + 71108, + -1, + 70850764, + 71109, + 71106559, + 69419766, + -1, + 71107647, + 71012353, + -1, + -64450, + 71072066, + 71102, + -1, + 71135295, + 71103, + -64448, + 71072787, + 71105, + -64447, + 71262190, + 71104, + -64446, + 71310798, + 71100, + -1, + 71373961, + 71101, + 71566418, + 69374200, + -1, + 71631946, + 71503633, + -1, + 71697479, + 71587284, + 71132, + -1, + 71665815, + 71133, + -64440, + 71665815, + 71099, + -64439, + 71778397, + 71097, + -1, + 71831313, + 71087, + 72025164, + 71602311, + 71092, + -1, + 71987020, + 71093, + 72156238, + 71993495, + 71090, + -1, + 72124567, + 71091, + 72287312, + 72106077, + 71088, + -1, + 72237149, + 71089, + -64431, + 72245349, + 71098, + -1, + 72362847, + 71096, + 72549462, + 71529042, + -1, + -64428, + 72485578, + 71112, + -64427, + 72550898, + 71111, + -1, + 72616278, + 71110, + 72811609, + 72492383, + -1, + -64424, + 72771216, + 71107, + -1, + 72815547, + 71106, + -1, + 72757077, + 71113, + 73138175, + 64893618, + -1, + 73139296, + 73044661, + -1, + -64419, + 73108435, + 128414, + -64418, + 73167832, + 128409, + -64417, + 73224213, + 128408, + -1, + 73280012, + 128415, + 73531391, + 73079466, + -1, + -64414, + 73436115, + 128416, + -64413, + 73495512, + 128411, + -64412, + 73551893, + 128410, + -1, + 73607692, + 128417, + 73794722, + 64838487, + -1, + 73860248, + 73743183, + -1, + 73925765, + 73798925, + -1, + 73991288, + 73883636, + -1, + 74056813, + 73957710, + -1, + -64405, + 74027622, + 70123, + -64404, + 74071667, + 70124, + -1, + 74133230, + 70122, + 74318960, + 74020898, + -1, + -64401, + 74271171, + 70127, + -1, + 74330735, + 70128, + 74515571, + 74277640, + -1, + -64398, + 74482580, + 70132, + -1, + 74530832, + 70131, + 74712182, + 74461990, + -1, + -64395, + 74671566, + 70125, + -1, + 74727928, + 70126, + -64393, + 74669563, + 70130, + -1, + 74853959, + 70129, + 75104255, + 73934841, + -1, + 75105404, + 75006286, + -1, + -64389, + 75076822, + 70114, + -1, + 75120466, + 70115, + 75302015, + 75069474, + -1, + -64386, + 75254141, + 70118, + -1, + 75313718, + 70119, + 75498626, + 75248422, + -1, + -64383, + 75458314, + 70116, + -1, + 75516127, + 70117, + -64381, + 75457284, + 70113, + -64380, + 75652546, + 70121, + -1, + 75705856, + 70120, + 75891859, + 73880486, + -1, + 75957385, + 75858254, + -1, + -64376, + 75928790, + 3560, + -1, + 75972434, + 3561, + 76153996, + 75921442, + -1, + -64373, + 76106109, + 3564, + -1, + 76165686, + 3565, + 76350607, + 76100390, + -1, + -64370, + 76310282, + 3562, + -1, + 76368095, + 3563, + -64368, + 76323079, + 3558, + -64367, + 76505860, + 3559, + -64366, + 76570050, + 3567, + -1, + 76623360, + 3566, + 76873727, + 75834053, + -1, + 76874903, + 76771148, + -1, + -64362, + 76820509, + 983935, + -1, + 76878328, + 983934, + -1, + 76846896, + 983933, + 77201407, + 73808361, + -1, + 77202591, + 77070336, + -1, + 77268125, + 77167528, + -1, + -64356, + 77239510, + 983154, + -1, + 77283154, + 983157, + -64354, + 77216301, + 983182, + -1, + 77406044, + 983184, + 77660159, + 77138102, + -1, + -64351, + 77531850, + 983158, + -1, + 77597170, + 983155, + 77792421, + 73766398, + -1, + -64348, + 77758327, + 128303, + -1, + 77818692, + 128973, + -1, + 77746842, + 128510, + 78054805, + 90213, + 983077, + 78120212, + 78026846, + -1, + 78185696, + 78074281, + -1, + 78251186, + 78152014, + -1, + 78316717, + 78217550, + -1, + -64340, + 78265045, + 72295, + -1, + 78319377, + 72294, + 78513328, + 78280738, + -1, + -64337, + 78461653, + 72310, + -1, + 78515985, + 72309, + -64335, + 78461653, + 72300, + -1, + 78647057, + 72299, + 78841017, + 78194015, + -1, + 78906550, + 78783839, + -1, + -64331, + 78854869, + 72297, + -1, + 78909201, + 72296, + -64329, + 78878842, + 72311, + -64328, + 79051477, + 72302, + -1, + 79105809, + 72301, + 79299774, + 78797655, + -1, + -64325, + 79271688, + 72293, + -64324, + 79322032, + 72298, + -64323, + 79378402, + 72288, + -1, + 79433489, + 72303, + 79627458, + 79263778, + -1, + -64320, + 79591582, + 72320, + -64319, + 79641301, + 72319, + -1, + 79695633, + 72321, + 79889606, + 79579843, + -1, + -64316, + 79855302, + 72323, + -64315, + 79903445, + 72285, + -1, + 79957777, + 72284, + 80151753, + 79861880, + -1, + -64312, + 80100053, + 72312, + -1, + 80154385, + 72313, + 80348364, + 80111825, + -1, + -64309, + 80296661, + 72305, + -1, + 80350993, + 72304, + 80544975, + 80300533, + -1, + -64306, + 80493269, + 72292, + -1, + 80547601, + 72291, + 80741586, + 80492457, + -1, + -64303, + 80689877, + 72287, + -1, + 80744209, + 72286, + 80938197, + 80682295, + -1, + -64300, + 80886485, + 72290, + -1, + 80940817, + 72289, + 81134808, + 80877602, + -1, + -64297, + 81083093, + 72307, + -1, + 81137425, + 72306, + -64295, + 81106696, + 72315, + -64294, + 81301063, + 72318, + -64293, + 81358745, + 72316, + -64292, + 81417822, + 72308, + -64291, + 81481033, + 72317, + -64290, + 81541845, + 72322, + -64289, + 81596177, + 72272, + -1, + 81659938, + 72314, + 81855725, + 78132330, + -1, + 81921251, + 81819682, + 72340, + -1, + 81869511, + 72339, + 82052325, + 81877847, + 72334, + -1, + 81999785, + 72332, + -64282, + 82014028, + 72337, + -64281, + 82138644, + 72336, + -64280, + 82201847, + 72338, + -64279, + 82266819, + 72331, + -64278, + 82327465, + 72330, + -64277, + 82388319, + 72333, + -64276, + 82450466, + 72335, + -1, + 82511906, + 72341, + 82707708, + 81825990, + -1, + 82773243, + 82672720, + -1, + 82838770, + 82743422, + -1, + -64271, + 82800460, + 72281, + -1, + 82857207, + 72282, + 83035380, + 82806935, + 72275, + -1, + 82979679, + 72274, + 83166454, + 82993253, + 72277, + -1, + 83110751, + 72278, + 83297529, + 83103505, + -1, + -64264, + 83265687, + 72280, + -1, + 83312733, + 72279, + -64262, + 83247197, + 72273, + -1, + 83438431, + 72276, + -1, + 82727305, + 72283, + 83690753, + 82663240, + -1, + -64258, + 83658593, + 72346, + -64257, + 83720949, + 72347, + -64256, + 83782662, + 72349, + -1, + 83831203, + 72348, + 84018439, + 83632563, + -1, + 84083973, + 83982370, + -1, + -64252, + 84032213, + 72328, + -1, + 84086545, + 72329, + -64250, + 84045721, + 72326, + -1, + 84233545, + 72327, + 84411660, + 83982370, + -1, + 84477195, + 84361974, + -1, + -64246, + 84447322, + 72343, + -1, + 84481161, + 72342, + -1, + 84445572, + 72345, + 84739344, + 84360348, + 72352, + 84869119, + 84672543, + -1, + -64241, + 84772662, + 72350, + -1, + 84817216, + 72351, + 85001491, + 84706027, + -1, + -64238, + 84937202, + 72354, + -1, + 85002582, + 72353, + -1, + 84949193, + 72344, + 85263693, + 78067846, + -1, + 85329199, + 85217705, + -1, + 85394715, + 85293090, + -1, + 85460250, + 85331729, + -1, + -64231, + 85416067, + 69436, + -1, + 85469090, + 69439, + -1, + 85409325, + 69441, + 85722398, + 85347575, + -1, + -64227, + 85668167, + 69444, + -1, + 85725943, + 69433, + 85919008, + 85671051, + 69427, + -1, + 85885725, + 69430, + 86050083, + 85856017, + -1, + -64222, + 86022080, + 69437, + -1, + 86069661, + 69424, + -64220, + 86022391, + 69429, + -64219, + 86218841, + 69431, + -64218, + 86282724, + 69428, + -64217, + 86344305, + 69442, + -64216, + 86405747, + 69440, + -64215, + 86469196, + 69438, + -64214, + 86532153, + 69435, + -64213, + 86595726, + 69434, + -64212, + 86657858, + 69432, + -64211, + 86718896, + 69426, + -64210, + 86782958, + 69443, + -1, + 86841768, + 69425, + 87033151, + 85271049, + -1, + 87098675, + 87001163, + -1, + -64206, + 87038316, + 69447, + -1, + 87101383, + 69449, + 87295286, + 87047880, + -1, + -64203, + 87234924, + 69453, + -1, + 87297991, + 69452, + 87491897, + 87238795, + -1, + -64200, + 87431532, + 69446, + -1, + 87494599, + 69448, + 87688508, + 87434539, + -1, + -64197, + 87628140, + 69451, + -1, + 87691207, + 69450, + -64195, + 87654460, + 69456, + -64194, + 87847528, + 69455, + -1, + 87905399, + 69454, + 88081734, + 86994332, + -1, + 88147268, + 88049725, + -1, + 88212803, + 88117046, + 69461, + -1, + 88147504, + 69462, + -1, + 88154309, + 69464, + -64187, + 88095592, + 69465, + -1, + 88350829, + 69463, + 88540492, + 88039412, + -1, + 88606026, + 88506702, + -1, + -64183, + 88576614, + 69459, + -1, + 88616686, + 69458, + 88866815, + 88564484, + 69457, + -1, + 88736302, + 69460, + -1, + 88491044, + 69445, + 88999289, + 85225376, + -1, + 89064811, + 88953257, + -1, + 89130323, + 89021271, + -1, + -64175, + 89102095, + 69857, + -64174, + 89143320, + 69847, + -1, + 89198943, + 69849, + 89392470, + 89085534, + -1, + -64171, + 89340615, + 69846, + -1, + 89402207, + 69864, + 89589081, + 89336671, + -1, + -64168, + 89537223, + 69863, + -1, + 89599443, + 69859, + -64166, + 89560847, + 69852, + -64165, + 89755218, + 69850, + -64164, + 89819775, + 69861, + -64163, + 89883143, + 69841, + -64162, + 89946295, + 69840, + -64161, + 90009559, + 69853, + -64160, + 90073401, + 69851, + -64159, + 90136981, + 69862, + -64158, + 90197425, + 69848, + -64157, + 90262316, + 69855, + -64156, + 90327590, + 69856, + -64155, + 90391373, + 69860, + -64154, + 90454768, + 69854, + -64153, + 90519576, + 69845, + -64152, + 90580500, + 69844, + -64151, + 90643828, + 69843, + -64150, + 90708115, + 69842, + -1, + 90771807, + 69858, + 91029503, + 89008121, + -1, + 91030895, + 90931534, + -1, + -64146, + 91002070, + 69874, + -1, + 91045714, + 69875, + 91227506, + 90994722, + -1, + -64143, + 91179389, + 69878, + -1, + 91238966, + 69879, + 91424117, + 91173670, + -1, + -64140, + 91383562, + 69876, + -1, + 91441375, + 69877, + -64138, + 91396359, + 69872, + -64137, + 91579140, + 69873, + -64136, + 91643330, + 69881, + -1, + 91696640, + 69880, + 91882890, + 88968697, + -1, + 91948418, + 91853447, + -1, + 92013951, + 91909169, + -1, + -64131, + 91983939, + 128601, + -64130, + 92032911, + 128593, + -1, + 92085444, + 128609, + 92276097, + 91981515, + 11113, + -1, + 92210515, + 11129, + -1, + 92240148, + 129111, + 92536831, + 91892784, + -1, + 92538247, + 92433457, + -1, + -64123, + 92508227, + 128603, + -64122, + 92557199, + 128595, + -1, + 92609732, + 128611, + 92800393, + 92505803, + 11112, + -1, + 92734803, + 11128, + -1, + 92764436, + 129110, + 92997007, + 91830117, + -1, + 93062542, + 92930048, + -1, + -64115, + 93027146, + 128428, + -1, + 93077859, + 127846, + -1, + 93001895, + 129358, + 93324689, + 92951249, + 128618, + -1, + 93258301, + 128619, + -64110, + 93288482, + 983181, + -64109, + 93414117, + 128284, + -64108, + 93469383, + 983043, + -1, + 93528415, + 129510, + 93718072, + 78002887, + -1, + 93783578, + 93654801, + -1, + 93849112, + 93744972, + -1, + 93914647, + 93786251, + -1, + 93980121, + 93868457, + -1, + 94045601, + 93949493, + -1, + 94111136, + 94003403, + -1, + 94176670, + 94072652, + 70025, + -1, + 94138188, + 70026, + 94371839, + 94129399, + 70027, + -1, + 94260471, + 70028, + -1, + 94048017, + 70062, + 94504359, + 94011726, + -1, + 94569893, + 94470478, + -1, + -64092, + 94517973, + 70044, + -1, + 94572305, + 70043, + -64090, + 94517973, + 70049, + -1, + 94703377, + 70048, + 94897580, + 94460759, + -1, + -64087, + 94869256, + 70042, + -64086, + 94919600, + 70047, + -64085, + 94975970, + 70037, + -1, + 95031057, + 70052, + 95225266, + 94840159, + -1, + 95290800, + 95167839, + -1, + -64081, + 95238869, + 70046, + -1, + 95293201, + 70045, + -64079, + 95238869, + 70051, + -1, + 95424273, + 70050, + 95618486, + 95162129, + 70019, + -64076, + 95586455, + 70032, + -64075, + 95633501, + 70030, + -1, + 95686417, + 70020, + 95880634, + 95582242, + -1, + -64072, + 95844510, + 70064, + -64071, + 95894229, + 70063, + -1, + 95948561, + 70065, + 96142780, + 95848599, + 70023, + -1, + 96110743, + 70024, + 96273855, + 96102609, + -1, + -64066, + 96221909, + 70054, + -1, + 96276241, + 70053, + 96470466, + 96226551, + -1, + -64063, + 96423241, + 70061, + -1, + 96472849, + 70060, + 96667077, + 96422595, + -1, + -64060, + 96615125, + 70034, + -1, + 96669457, + 70033, + 96863688, + 96618997, + -1, + -64057, + 96811733, + 70041, + -1, + 96866065, + 70040, + 97060298, + 96813149, + 70021, + -1, + 97009757, + 70022, + 97191373, + 97007529, + -1, + -64052, + 97139413, + 70036, + -1, + 97193745, + 70035, + 97387984, + 97131831, + -1, + -64049, + 97336021, + 70039, + -1, + 97390353, + 70038, + 97584595, + 97327138, + -1, + -64046, + 97532629, + 70056, + -1, + 97586961, + 70055, + -64044, + 97556232, + 70058, + -64043, + 97742745, + 70059, + -64042, + 97804389, + 70031, + -64041, + 97867358, + 70057, + -64040, + 97925845, + 70066, + -1, + 97987423, + 70029, + 98174443, + 93950150, + -1, + 98239978, + 98139216, + -1, + 98305504, + 98209918, + -1, + 98371038, + 98266956, + 70072, + -1, + 98332492, + 70073, + 98566143, + 98323703, + 70074, + -1, + 98454775, + 70075, + 98633188, + 98242321, + -1, + -64030, + 98601111, + 70079, + -64029, + 98648157, + 70077, + -1, + 98701073, + 70067, + 98895334, + 98601111, + 70070, + -1, + 98863255, + 70071, + 99026408, + 98844765, + 70068, + -1, + 98975837, + 70069, + -64023, + 98984037, + 70078, + -1, + 99101535, + 70076, + -1, + 98196069, + 70091, + 99354111, + 98138146, + -1, + 99419640, + 99304182, + -1, + 99485168, + 99389441, + -1, + -64017, + 99449154, + 70018, + -1, + 99512383, + 70080, + 99681779, + 99421969, + -1, + -64014, + 99651146, + 70081, + -1, + 99704893, + 70017, + -64012, + 99650608, + 70083, + -64011, + 99843091, + 70107, + -64010, + 99901422, + 70090, + -64009, + 99961453, + 70082, + -1, + 100015566, + 70016, + 100206077, + 99363679, + -1, + 100271612, + 100148386, + -1, + -64005, + 100207090, + 70111, + -1, + 100272470, + 70110, + -1, + 100231626, + 70088, + -64002, + 100175381, + 70093, + -1, + 100471744, + 70089, + 100664848, + 99296607, + -1, + 100730382, + 100614889, + -1, + 100795908, + 100696398, + -1, + -63997, + 100766934, + 70098, + -1, + 100810578, + 70099, + 100992519, + 100759586, + -1, + -63994, + 100944253, + 70102, + -1, + 101003830, + 70103, + 101189130, + 100938534, + -1, + -63991, + 101148426, + 70100, + -1, + 101206239, + 70101, + -63989, + 101161223, + 70096, + -63988, + 101344004, + 70097, + -63987, + 101408194, + 70105, + -1, + 101461504, + 70104, + -63985, + 100689552, + 70086, + -1, + 101585851, + 70085, + 101778963, + 100608863, + -1, + -63982, + 101750413, + 70092, + -1, + 101796670, + 70106, + -63980, + 101737013, + 70084, + -63979, + 101924055, + 70108, + -63978, + 101983029, + 70109, + -1, + 102043567, + 70087, + -1, + 93866691, + 129416, + -63975, + 93818517, + 127847, + -1, + 102257705, + 129368, + 102434349, + 93741157, + -1, + 102499879, + 102397896, + -1, + 102565409, + 102448076, + -1, + -63970, + 102534149, + 113827, + -63969, + 102584818, + 113824, + -63968, + 102640186, + 113826, + -1, + 102703943, + 113825, + 102893094, + 102498304, + -1, + 102958629, + 102832162, + -1, + -63964, + 102903718, + 11103, + -1, + 102961209, + 11087, + -1, + 102923513, + 11086, + -1, + 102833532, + 127856, + 103286314, + 102460666, + -1, + -63959, + 103253843, + 128722, + -1, + 103291022, + 128717, + -63957, + 103256684, + 128703, + -63956, + 103441980, + 127776, + -1, + 103489820, + 129327, + 103679539, + 102383709, + -1, + 103745073, + 103626600, + -1, + -63952, + 103704475, + 983075, + -1, + 103760861, + 983078, + -63950, + 103704785, + 128674, + -1, + 103886435, + 128737, + 104072758, + 103640908, + -1, + -63947, + 104041054, + 129335, + -1, + 104088525, + 129424, + -63945, + 104044205, + 983197, + -1, + 104213854, + 128017, + 104400533, + 93679207, + -1, + 104466068, + 104338766, + -1, + 104531601, + 104408417, + -1, + 104597081, + 104484087, + -1, + 104662612, + 104535862, + -1, + 104728147, + 104603126, + -1, + -63937, + 104700024, + 127305, + -63936, + 104765101, + 127304, + -63935, + 104830450, + 127303, + -63934, + 104894005, + 127301, + -63933, + 104958103, + 127300, + -63932, + 105021774, + 127299, + -63931, + 105082700, + 127297, + -63930, + 105147949, + 127296, + -63929, + 105209957, + 127294, + -63928, + 105272852, + 127292, + -63927, + 105336055, + 127291, + -63926, + 105401027, + 127290, + -63925, + 105466357, + 127289, + -63924, + 105529437, + 127288, + -63923, + 105593543, + 127287, + -63922, + 105658281, + 127286, + -63921, + 105722662, + 127285, + -63920, + 105786207, + 127284, + -63919, + 105850207, + 127283, + -63918, + 105913655, + 127282, + -1, + 105975569, + 127280, + -1, + 104693072, + 127397, + 106299391, + 104620133, + -1, + 106301016, + 106183067, + -1, + -63913, + 106259767, + 10191, + -1, + 106304363, + 10190, + -1, + 106266401, + 127401, + 106563179, + 104537399, + -1, + 106628713, + 106515101, + -1, + 106694239, + 106564961, + -1, + -63907, + 106631011, + 127539, + -63906, + 106696461, + 127538, + -1, + 106761405, + 127544, + 106956388, + 106630345, + -1, + 107021923, + 106892780, + -1, + -63902, + 106958470, + 127542, + -1, + 107023879, + 127543, + -1, + 106965995, + 127541, + 107284072, + 106892319, + -1, + -63898, + 107220165, + 127546, + -63897, + 107285522, + 127540, + -1, + 107350726, + 127545, + -1, + 107220741, + 127547, + -63894, + 106587254, + 127378, + -1, + 107564279, + 127377, + 107742834, + 106526754, + -1, + 107808367, + 107686751, + -1, + -63890, + 107777749, + 127393, + -1, + 107815571, + 127388, + -63888, + 107767251, + 127384, + -63887, + 107956680, + 127395, + -1, + 108019777, + 127402, + 108201591, + 107708750, + -1, + 108267126, + 108171545, + -1, + -63883, + 108224631, + 127389, + -1, + 108277736, + 127394, + -1, + 108216151, + 127387, + 108529275, + 108149447, + -1, + -63879, + 108478694, + 127400, + -63878, + 108538597, + 127399, + -1, + 108600631, + 127398, + 108791423, + 108475174, + -1, + -63875, + 108753346, + 127379, + -63874, + 108816176, + 127390, + -1, + 108874011, + 127392, + 109053570, + 108760629, + -1, + -63871, + 109017122, + 127386, + -1, + 109076757, + 127404, + 109250181, + 109021335, + -1, + -63868, + 109209843, + 127385, + -1, + 109264008, + 127403, + 109446792, + 109207653, + -1, + -63865, + 109403310, + 127396, + -1, + 109464259, + 127383, + 109643403, + 109402967, + -1, + -63862, + 109590441, + 127382, + -1, + 109654703, + 127381, + 109840014, + 109595537, + -1, + -63859, + 109803678, + 127490, + -1, + 109857913, + 127489, + -63857, + 109810215, + 127311, + -63856, + 109986202, + 127380, + -1, + 110046733, + 127391, + 110297087, + 104464384, + -1, + -63853, + 110199395, + 128918, + -1, + 110259367, + 11216, + -1, + 104415642, + 129425, + 110495420, + 104368279, + -1, + 110560947, + 110451543, + -1, + 110626478, + 110503528, + -1, + 110692002, + 110587305, + -1, + 110757532, + 110651601, + -1, + -63845, + 110726422, + 7362, + -1, + 110760992, + 7361, + -63843, + 110723282, + 7360, + -63842, + 110907973, + 7364, + -63841, + 110971677, + 7365, + -63840, + 111027702, + 7366, + -63839, + 111091079, + 7363, + -1, + 111155280, + 7367, + 111347369, + 110645673, + -1, + 111412902, + 111293503, + -1, + -63835, + 111367700, + 7103, + -1, + 111430339, + 7102, + -63833, + 111375022, + 7099, + -63832, + 111563329, + 7100, + -1, + 111614459, + 7101, + 111806124, + 111289090, + -1, + -63829, + 111776049, + 7085, + -1, + 111826526, + 7084, + -63827, + 111770765, + 7083, + -1, + 111941579, + 7098, + 112133808, + 110589432, + 127749, + -1, + 112067457, + 127748, + -63823, + 112097909, + 127751, + -63822, + 112211371, + 127803, + -1, + 112264836, + 127774, + 112461494, + 110524450, + -1, + -63819, + 112421545, + 128671, + -1, + 112475570, + 127843, + 112658105, + 112421578, + -1, + -63816, + 112627767, + 129465, + -1, + 112672133, + 129464, + 112854715, + 112597026, + 983102, + -1, + 112820170, + 983101, + -1, + 112816877, + 127940, + 113051362, + 110461262, + 983189, + 113116879, + 112987921, + -1, + 113182410, + 113078092, + -1, + 113247943, + 113148333, + -1, + 113313475, + 113211426, + -1, + -63806, + 113280778, + 983180, + -1, + 113323649, + 983132, + -63804, + 113279763, + 983044, + -63803, + 113470814, + 983175, + -63802, + 113523909, + 983042, + -1, + 113588849, + 983174, + 113836031, + 113182084, + -1, + -63799, + 113734545, + 11243, + -1, + 113790955, + 11242, + 113968845, + 113148238, + -1, + -63796, + 113936960, + 128509, + -1, + 113985271, + 128649, + -63794, + 113924793, + 128387, + -1, + 114108478, + 127967, + 114296531, + 113084567, + -1, + -63791, + 114256139, + 128723, + -63790, + 114308097, + 129369, + -1, + 114370588, + 127897, + 114558680, + 114257740, + -1, + 114624215, + 114495249, + -1, + -63786, + 114594321, + 127827, + -1, + 114639470, + 128207, + -1, + 114574782, + 983188, + 114886365, + 114502495, + -1, + 114951900, + 114823882, + -1, + -63781, + 114902284, + 127836, + -1, + 114950790, + 128642, + -1, + 114908825, + 11836, + 115214048, + 114843749, + -1, + -63777, + 115174950, + 9201, + -1, + 115220728, + 128480, + -63775, + 115185138, + 983045, + -1, + 115374114, + 983169, + 115541763, + 113010897, + 983117, + 115607279, + 115485535, + -1, + 115672812, + 115544541, + -1, + 115738346, + 115617909, + 128264, + 115867647, + 115672452, + -1, + -63768, + 115770355, + 128266, + -63767, + 115827535, + 128265, + -1, + 115875238, + 128263, + -63765, + 115688740, + 128483, + -1, + 116000898, + 128586, + 116260863, + 115616607, + -1, + -63762, + 116139663, + 128676, + -1, + 116203324, + 128172, + 116393718, + 115564645, + -1, + 116459251, + 116351077, + -1, + -63758, + 116415319, + 129348, + -1, + 116477193, + 129525, + -63756, + 116428297, + 128051, + -63755, + 116619225, + 127941, + -1, + 116678011, + 129533, + 116852477, + 116342877, + -1, + 116918011, + 116813882, + -1, + -63751, + 116882244, + 128026, + -63750, + 116940569, + 128466, + -1, + 116989325, + 128467, + 117243903, + 116860745, + 128375, + -1, + 117114239, + 128376, + 117311234, + 116789009, + 983176, + 117376769, + 117274269, + -1, + -63744, + 117327163, + 128150, + -1, + 117387564, + 10024, + -1, + 117324083, + 127837, + -1, + 117263990, + 128166, + 117704479, + 115496468, + -1, + 117770010, + 117653597, + -1, + 117835545, + 117724055, + -1, + 117901078, + 117781330, + -1, + 117966605, + 117864482, + -1, + 118032140, + 117922206, + 128522, + 118161407, + 117964831, + -1, + -63733, + 118064072, + 129392, + -1, + 118111160, + 129325, + -1, + 118000501, + 128526, + 118359826, + 117925107, + 128515, + 118489087, + 118292511, + -1, + -63728, + 118391948, + 128518, + -63727, + 118455737, + 128516, + -1, + 118497769, + 128517, + 118751231, + 118307527, + -1, + -63724, + 118646187, + 128520, + -63723, + 118696985, + 128525, + -1, + 118755960, + 128519, + 119013375, + 117841513, + -1, + -63720, + 118908147, + 128570, + -1, + 118963432, + 128571, + -1, + 117798546, + 128527, + 119211806, + 117707373, + -1, + -63716, + 119170392, + 128312, + -63715, + 119217025, + 128313, + -1, + 119280020, + 128745, + -1, + 119169511, + 128684, + 119539511, + 117675693, + -1, + 119605043, + 119501583, + -1, + 119670578, + 119541709, + -1, + 119736113, + 119624150, + -1, + 119801641, + 119692119, + -1, + 119867175, + 119757655, + -1, + -63706, + 119823280, + 2149, + -1, + 119869201, + 2148, + -63704, + 119838472, + 2146, + -1, + 120010722, + 2144, + 120194860, + 119755731, + -1, + -63701, + 120147273, + 2153, + -1, + 120196881, + 2152, + -63699, + 120162154, + 2147, + -63698, + 120356550, + 2154, + -63697, + 120418201, + 2151, + -63696, + 120474138, + 2145, + -1, + 120527355, + 2150, + -1, + 119701674, + 983202, + -1, + 119627131, + 128137, + 120850230, + 119561047, + 983094, + -63691, + 120791063, + 983093, + -1, + 120852793, + 128333, + -1, + 120805284, + 128325, + 121112394, + 119475985, + -1, + 121177921, + 121068375, + -1, + 121243456, + 121141397, + -1, + 121308991, + 121191693, + -1, + 121374526, + 121252042, + -1, + -63683, + 121341901, + 128630, + -1, + 121381428, + 128631, + -1, + 121328878, + 128632, + -1, + 121259644, + 128634, + -1, + 121187146, + 129386, + 121767748, + 121146592, + -1, + -63677, + 121726220, + 129429, + -1, + 121771642, + 43205, + 121964358, + 121733825, + 128752, + -1, + 121897075, + 128225, + -63673, + 121935473, + 127927, + -63672, + 122049972, + 129474, + -63671, + 122112957, + 127862, + -1, + 122172403, + 129527, + 122357597, + 121064695, + -1, + 122423124, + 122301279, + -1, + 122488658, + 122368019, + -1, + 122554193, + 122438910, + -1, + -63665, + 122519839, + 128164, + -63664, + 122565453, + 128564, + -1, + 122621905, + 128716, + -1, + 122525383, + 128554, + -63661, + 122457598, + 128373, + -1, + 122824031, + 128759, + 123012953, + 122372189, + -1, + 123078488, + 122960253, + -1, + -63657, + 123043270, + 128578, + -1, + 123090775, + 128577, + -1, + 123018949, + 127829, + 123340636, + 122950746, + -1, + -63653, + 123303518, + 11100, + -1, + 123363789, + 11098, + -1, + 123299314, + 127920, + 123602792, + 122301279, + -1, + 123668321, + 123546463, + -1, + -63648, + 123611203, + 127793, + -1, + 123668610, + 128584, + -63646, + 123634109, + 983168, + -63645, + 123827605, + 129324, + -63644, + 123890107, + 11259, + -63643, + 123949709, + 129331, + -63642, + 124004425, + 11250, + -63641, + 124068482, + 129352, + -1, + 124131023, + 128186, + 124323700, + 123542839, + -1, + 124389229, + 124284748, + -1, + -63637, + 124346909, + 128220, + -63636, + 124405547, + 128624, + -1, + 124464474, + 128437, + 124651376, + 124346469, + -1, + -63633, + 124614515, + 129410, + -1, + 124675614, + 128756, + 124847986, + 124600030, + 127979, + -1, + 124781634, + 127890, + -63629, + 124797021, + 983185, + -1, + 124917074, + 129507, + 125110140, + 124279639, + -1, + 125175672, + 125069404, + -1, + -63625, + 125115297, + 127938, + -1, + 125174058, + 127956, + 125372283, + 125112081, + -1, + -63622, + 125324218, + 128013, + -1, + 125387607, + 128012, + -1, + 125316460, + 129319, + 125634433, + 125079833, + -1, + 125699968, + 125570833, + -1, + -63617, + 125663887, + 128629, + -1, + 125721431, + 129442, + -1, + 125649859, + 127946, + 125962117, + 125597730, + -1, + -63613, + 125898513, + 983133, + -63612, + 125962954, + 983159, + -1, + 126028274, + 983156, + 126224265, + 125913795, + -1, + -63609, + 126192338, + 128128, + -63608, + 126238815, + 127935, + -1, + 126293745, + 128761, + -1, + 126171267, + 983183, + 126553501, + 33102, + -1, + 126618769, + 126488337, + -1, + 126683866, + 126573399, + -1, + 126749401, + 126629801, + -1, + 126814936, + 126717407, + -1, + 126880471, + 126755421, + -1, + 126945279, + 126815433, + -1, + 127010716, + 126881414, + -1, + -63597, + 126946950, + 101050, + -63596, + 127012359, + 101049, + -63595, + 127077729, + 101048, + -63594, + 127143113, + 101047, + -63593, + 127208479, + 101046, + -63592, + 127273859, + 101045, + -63591, + 127339210, + 101044, + -63590, + 127404530, + 101043, + -63589, + 127469910, + 101042, + -1, + 127535302, + 101041, + 127731623, + 126946823, + -1, + -63586, + 127667846, + 101040, + -63585, + 127733255, + 101039, + -63584, + 127798625, + 101038, + -63583, + 127864009, + 101037, + -63582, + 127929375, + 101036, + -63581, + 127994755, + 101035, + -63580, + 128060106, + 101034, + -63579, + 128125426, + 101033, + -63578, + 128190806, + 101032, + -1, + 128256198, + 101031, + 128452530, + 127667553, + -1, + -63575, + 128388742, + 101030, + -63574, + 128454151, + 101029, + -63573, + 128519521, + 101028, + -63572, + 128584905, + 101027, + -63571, + 128650271, + 101026, + -63570, + 128715651, + 101025, + -63569, + 128781002, + 101024, + -63568, + 128846322, + 101023, + -63567, + 128911702, + 101022, + -1, + 128977094, + 101021, + 129173437, + 128388297, + -1, + -63564, + 129109638, + 101020, + -63563, + 129175047, + 101019, + -63562, + 129240417, + 101018, + -63561, + 129305801, + 101017, + -63560, + 129371167, + 101016, + -63559, + 129436547, + 101015, + -63558, + 129501898, + 101014, + -63557, + 129567218, + 101013, + -63556, + 129632598, + 101012, + -1, + 129697990, + 101011, + 129894344, + 129109023, + -1, + -63553, + 129830534, + 101010, + -63552, + 129895943, + 101009, + -63551, + 129961313, + 101008, + -63550, + 130026697, + 101007, + -63549, + 130092063, + 101006, + -63548, + 130157443, + 101005, + -63547, + 130222794, + 101004, + -63546, + 130288114, + 101003, + -63545, + 130353494, + 101002, + -1, + 130418886, + 101001, + 130615251, + 129829763, + -1, + -63542, + 130551430, + 101000, + -63541, + 130616839, + 100999, + -63540, + 130682209, + 100998, + -63539, + 130747593, + 100997, + -63538, + 130812959, + 100996, + -63537, + 130878339, + 100995, + -63536, + 130943690, + 100994, + -63535, + 131009010, + 100993, + -63534, + 131074390, + 100992, + -1, + 131139782, + 100991, + 131336158, + 130550474, + -1, + -63531, + 131272326, + 100990, + -63530, + 131337735, + 100989, + -63529, + 131403105, + 100988, + -63528, + 131468489, + 100987, + -63527, + 131533855, + 100986, + -63526, + 131599235, + 100985, + -63525, + 131664586, + 100984, + -63524, + 131729906, + 100983, + -63523, + 131795286, + 100982, + -1, + 131860678, + 100981, + 132057065, + 131271154, + -1, + -63520, + 131993222, + 100980, + -63519, + 132058631, + 100979, + -63518, + 132124001, + 100978, + -63517, + 132189385, + 100977, + -63516, + 132254751, + 100976, + -63515, + 132320131, + 100975, + -63514, + 132385482, + 100974, + -63513, + 132450802, + 100973, + -63512, + 132516182, + 100972, + -1, + 132581574, + 100971, + 132777972, + 131991894, + -1, + -63509, + 132714118, + 100970, + -63508, + 132779527, + 100969, + -63507, + 132844897, + 100968, + -63506, + 132910281, + 100967, + -63505, + 132975647, + 100966, + -63504, + 133041027, + 100965, + -63503, + 133106378, + 100964, + -63502, + 133171698, + 100963, + -63501, + 133237078, + 100962, + -1, + 133302470, + 100961, + 133562367, + 132712646, + -1, + -63498, + 133435014, + 100960, + -63497, + 133500423, + 100959, + -63496, + 133565793, + 100958, + -63495, + 133631177, + 100957, + -63494, + 133696543, + 100956, + -63493, + 133761923, + 100955, + -63492, + 133827274, + 100954, + -63491, + 133892594, + 100953, + -63490, + 133957974, + 100952, + -1, + 134023366, + 100951, + 134219886, + 126880799, + -1, + 134285323, + 134155910, + -1, + -63486, + 134221446, + 100950, + -63485, + 134286855, + 100949, + -63484, + 134352225, + 100948, + -63483, + 134417609, + 100947, + -63482, + 134482975, + 100946, + -63481, + 134548355, + 100945, + -63480, + 134613706, + 100944, + -63479, + 134679026, + 100943, + -63478, + 134744406, + 100942, + -1, + 134809798, + 100941, + 135006230, + 134221319, + -1, + -63475, + 134942342, + 100940, + -63474, + 135007751, + 100939, + -63473, + 135073121, + 100938, + -63472, + 135138505, + 100937, + -63471, + 135203871, + 100936, + -63470, + 135269251, + 100935, + -63469, + 135334602, + 100934, + -63468, + 135399922, + 100933, + -63467, + 135465302, + 100932, + -1, + 135530694, + 100931, + 135727137, + 134942049, + -1, + -63464, + 135663238, + 100930, + -63463, + 135728647, + 100929, + -63462, + 135794017, + 100928, + -63461, + 135859401, + 100927, + -63460, + 135924767, + 100926, + -63459, + 135990147, + 100925, + -63458, + 136055498, + 100924, + -63457, + 136120818, + 100923, + -63456, + 136186198, + 100922, + -1, + 136251590, + 100921, + 136448044, + 135662793, + -1, + -63453, + 136384134, + 100920, + -63452, + 136449543, + 100919, + -63451, + 136514913, + 100918, + -63450, + 136580297, + 100917, + -63449, + 136645663, + 100916, + -63448, + 136711043, + 100915, + -63447, + 136776394, + 100914, + -63446, + 136841714, + 100913, + -63445, + 136907094, + 100912, + -1, + 136972486, + 100911, + 137168951, + 136383519, + -1, + -63442, + 137105030, + 100910, + -63441, + 137170439, + 100909, + -63440, + 137235809, + 100908, + -63439, + 137301193, + 100907, + -63438, + 137366559, + 100906, + -63437, + 137431939, + 100905, + -63436, + 137497290, + 100904, + -63435, + 137562610, + 100903, + -63434, + 137627990, + 100902, + -1, + 137693382, + 100901, + 137889858, + 137104259, + -1, + -63431, + 137825926, + 100900, + -63430, + 137891335, + 100899, + -63429, + 137956705, + 100898, + -63428, + 138022089, + 100897, + -63427, + 138087455, + 100896, + -63426, + 138152835, + 100895, + -63425, + 138218186, + 100894, + -63424, + 138283506, + 100893, + -63423, + 138348886, + 100892, + -1, + 138414278, + 100891, + 138610765, + 137824970, + -1, + -63420, + 138546822, + 100890, + -63419, + 138612231, + 100889, + -63418, + 138677601, + 100888, + -63417, + 138742985, + 100887, + -63416, + 138808351, + 100886, + -63415, + 138873731, + 100885, + -63414, + 138939082, + 100884, + -63413, + 139004402, + 100883, + -63412, + 139069782, + 100882, + -1, + 139135174, + 100881, + 139331672, + 138545650, + -1, + -63409, + 139267718, + 100880, + -63408, + 139333127, + 100879, + -63407, + 139398497, + 100878, + -63406, + 139463881, + 100877, + -63405, + 139529247, + 100876, + -63404, + 139594627, + 100875, + -63403, + 139659978, + 100874, + -63402, + 139725298, + 100873, + -63401, + 139790678, + 100872, + -1, + 139856070, + 100871, + 140052579, + 139266390, + -1, + -63398, + 139988614, + 100870, + -63397, + 140054023, + 100869, + -63396, + 140119393, + 100868, + -63395, + 140184777, + 100867, + -63394, + 140250143, + 100866, + -63393, + 140315523, + 100865, + -63392, + 140380874, + 100864, + -63391, + 140446194, + 100863, + -63390, + 140511574, + 100862, + -1, + 140576966, + 100861, + 140836863, + 139987142, + -1, + -63387, + 140709510, + 100860, + -63386, + 140774919, + 100859, + -63385, + 140840289, + 100858, + -63384, + 140905673, + 100857, + -63383, + 140971039, + 100856, + -63382, + 141036419, + 100855, + -63381, + 141101770, + 100854, + -63380, + 141167090, + 100853, + -63379, + 141232470, + 100852, + -1, + 141297862, + 100851, + 141494493, + 134155139, + -1, + 141559930, + 141430406, + -1, + -63375, + 141495942, + 100850, + -63374, + 141561351, + 100849, + -63373, + 141626721, + 100848, + -63372, + 141692105, + 100847, + -63371, + 141757471, + 100846, + -63370, + 141822851, + 100845, + -63369, + 141888202, + 100844, + -63368, + 141953522, + 100843, + -63367, + 142018902, + 100842, + -1, + 142084294, + 100841, + 142280837, + 141495815, + -1, + -63364, + 142216838, + 100840, + -63363, + 142282247, + 100839, + -63362, + 142347617, + 100838, + -63361, + 142413001, + 100837, + -63360, + 142478367, + 100836, + -63359, + 142543747, + 100835, + -63358, + 142609098, + 100834, + -63357, + 142674418, + 100833, + -63356, + 142739798, + 100832, + -1, + 142805190, + 100831, + 143001744, + 142216545, + -1, + -63353, + 142937734, + 100830, + -63352, + 143003143, + 100829, + -63351, + 143068513, + 100828, + -63350, + 143133897, + 100827, + -63349, + 143199263, + 100826, + -63348, + 143264643, + 100825, + -63347, + 143329994, + 100824, + -63346, + 143395314, + 100823, + -63345, + 143460694, + 100822, + -1, + 143526086, + 100821, + 143722651, + 142937289, + -1, + -63342, + 143658630, + 100820, + -63341, + 143724039, + 100819, + -63340, + 143789409, + 100818, + -63339, + 143854793, + 100817, + -63338, + 143920159, + 100816, + -63337, + 143985539, + 100815, + -63336, + 144050890, + 100814, + -63335, + 144116210, + 100813, + -63334, + 144181590, + 100812, + -1, + 144246982, + 100811, + 144443558, + 143658015, + -1, + -63331, + 144379526, + 100810, + -63330, + 144444935, + 100809, + -63329, + 144510305, + 100808, + -63328, + 144575689, + 100807, + -63327, + 144641055, + 100806, + -63326, + 144706435, + 100805, + -63325, + 144771786, + 100804, + -63324, + 144837106, + 100803, + -63323, + 144902486, + 100802, + -1, + 144967878, + 100801, + 145164465, + 144378755, + -1, + -63320, + 145100422, + 100800, + -63319, + 145165831, + 100799, + -63318, + 145231201, + 100798, + -63317, + 145296585, + 100797, + -63316, + 145361951, + 100796, + -63315, + 145427331, + 100795, + -63314, + 145492682, + 100794, + -63313, + 145558002, + 100793, + -63312, + 145623382, + 100792, + -1, + 145688774, + 100791, + 145885372, + 145099466, + -1, + -63309, + 145821318, + 100790, + -63308, + 145886727, + 100789, + -63307, + 145952097, + 100788, + -63306, + 146017481, + 100787, + -63305, + 146082847, + 100786, + -63304, + 146148227, + 100785, + -63303, + 146213578, + 100784, + -63302, + 146278898, + 100783, + -63301, + 146344278, + 100782, + -1, + 146409670, + 100781, + 146606279, + 145820146, + -1, + -63298, + 146542214, + 100780, + -63297, + 146607623, + 100779, + -63296, + 146672993, + 100778, + -63295, + 146738377, + 100777, + -63294, + 146803743, + 100776, + -63293, + 146869123, + 100775, + -63292, + 146934474, + 100774, + -63291, + 146999794, + 100773, + -63290, + 147065174, + 100772, + -1, + 147130566, + 100771, + 147327186, + 146540886, + -1, + -63287, + 147263110, + 100770, + -63286, + 147328519, + 100769, + -63285, + 147393889, + 100768, + -63284, + 147459273, + 100767, + -63283, + 147524639, + 100766, + -63282, + 147590019, + 100765, + -63281, + 147655370, + 100764, + -63280, + 147720690, + 100763, + -63279, + 147786070, + 100762, + -1, + 147851462, + 100761, + 148111359, + 147261638, + -1, + -63276, + 147984006, + 100760, + -63275, + 148049415, + 100759, + -63274, + 148114785, + 100758, + -63273, + 148180169, + 100757, + -63272, + 148245535, + 100756, + -63271, + 148310915, + 100755, + -63270, + 148376266, + 100754, + -63269, + 148441586, + 100753, + -63268, + 148506966, + 100752, + -1, + 148572358, + 100751, + 148769100, + 141429450, + -1, + 148834537, + 148704902, + -1, + -63264, + 148770438, + 100750, + -63263, + 148835847, + 100749, + -63262, + 148901217, + 100748, + -63261, + 148966601, + 100747, + -63260, + 149031967, + 100746, + -63259, + 149097347, + 100745, + -63258, + 149162698, + 100744, + -63257, + 149228018, + 100743, + -63256, + 149293398, + 100742, + -1, + 149358790, + 100741, + 149555444, + 148770311, + -1, + -63253, + 149491334, + 100740, + -63252, + 149556743, + 100739, + -63251, + 149622113, + 100738, + -63250, + 149687497, + 100737, + -63249, + 149752863, + 100736, + -63248, + 149818243, + 100735, + -63247, + 149883594, + 100734, + -63246, + 149948914, + 100733, + -63245, + 150014294, + 100732, + -1, + 150079686, + 100731, + 150276351, + 149491041, + -1, + -63242, + 150212230, + 100730, + -63241, + 150277639, + 100729, + -63240, + 150343009, + 100728, + -63239, + 150408393, + 100727, + -63238, + 150473759, + 100726, + -63237, + 150539139, + 100725, + -63236, + 150604490, + 100724, + -63235, + 150669810, + 100723, + -63234, + 150735190, + 100722, + -1, + 150800582, + 100721, + 150997258, + 150211785, + -1, + -63231, + 150933126, + 100720, + -63230, + 150998535, + 100719, + -63229, + 151063905, + 100718, + -63228, + 151129289, + 100717, + -63227, + 151194655, + 100716, + -63226, + 151260035, + 100715, + -63225, + 151325386, + 100714, + -63224, + 151390706, + 100713, + -63223, + 151456086, + 100712, + -1, + 151521478, + 100711, + 151718165, + 150932511, + -1, + -63220, + 151654022, + 100710, + -63219, + 151719431, + 100709, + -63218, + 151784801, + 100708, + -63217, + 151850185, + 100707, + -63216, + 151915551, + 100706, + -63215, + 151980931, + 100705, + -63214, + 152046282, + 100704, + -63213, + 152111602, + 100703, + -63212, + 152176982, + 100702, + -1, + 152242374, + 100701, + 152439072, + 151653251, + -1, + -63209, + 152374918, + 100700, + -63208, + 152440327, + 100699, + -63207, + 152505697, + 100698, + -63206, + 152571081, + 100697, + -63205, + 152636447, + 100696, + -63204, + 152701827, + 100695, + -63203, + 152767178, + 100694, + -63202, + 152832498, + 100693, + -63201, + 152897878, + 100692, + -1, + 152963270, + 100691, + 153159979, + 152373962, + -1, + -63198, + 153095814, + 100690, + -63197, + 153161223, + 100689, + -63196, + 153226593, + 100688, + -63195, + 153291977, + 100687, + -63194, + 153357343, + 100686, + -63193, + 153422723, + 100685, + -63192, + 153488074, + 100684, + -63191, + 153553394, + 100683, + -63190, + 153618774, + 100682, + -1, + 153684166, + 100681, + 153880886, + 153094642, + -1, + -63187, + 153816710, + 100680, + -63186, + 153882119, + 100679, + -63185, + 153947489, + 100678, + -63184, + 154012873, + 100677, + -63183, + 154078239, + 100676, + -63182, + 154143619, + 100675, + -63181, + 154208970, + 100674, + -63180, + 154274290, + 100673, + -63179, + 154339670, + 100672, + -1, + 154405062, + 100671, + 154601793, + 153815382, + -1, + -63176, + 154537606, + 100670, + -63175, + 154603015, + 100669, + -63174, + 154668385, + 100668, + -63173, + 154733769, + 100667, + -63172, + 154799135, + 100666, + -63171, + 154864515, + 100665, + -63170, + 154929866, + 100664, + -63169, + 154995186, + 100663, + -63168, + 155060566, + 100662, + -1, + 155125958, + 100661, + 155385855, + 154536134, + -1, + -63165, + 155258502, + 100660, + -63164, + 155323911, + 100659, + -63163, + 155389281, + 100658, + -63162, + 155454665, + 100657, + -63161, + 155520031, + 100656, + -63160, + 155585411, + 100655, + -63159, + 155650762, + 100654, + -63158, + 155716082, + 100653, + -63157, + 155781462, + 100652, + -1, + 155846854, + 100651, + 156043707, + 148703730, + -1, + 156109144, + 155979398, + -1, + -63153, + 156044934, + 100650, + -63152, + 156110343, + 100649, + -63151, + 156175713, + 100648, + -63150, + 156241097, + 100647, + -63149, + 156306463, + 100646, + -63148, + 156371843, + 100645, + -63147, + 156437194, + 100644, + -63146, + 156502514, + 100643, + -63145, + 156567894, + 100642, + -1, + 156633286, + 100641, + 156830051, + 156044807, + -1, + -63142, + 156765830, + 100640, + -63141, + 156831239, + 100639, + -63140, + 156896609, + 100638, + -63139, + 156961993, + 100637, + -63138, + 157027359, + 100636, + -63137, + 157092739, + 100635, + -63136, + 157158090, + 100634, + -63135, + 157223410, + 100633, + -63134, + 157288790, + 100632, + -1, + 157354182, + 100631, + 157550958, + 156765537, + -1, + -63131, + 157486726, + 100630, + -63130, + 157552135, + 100629, + -63129, + 157617505, + 100628, + -63128, + 157682889, + 100627, + -63127, + 157748255, + 100626, + -63126, + 157813635, + 100625, + -63125, + 157878986, + 100624, + -63124, + 157944306, + 100623, + -63123, + 158009686, + 100622, + -1, + 158075078, + 100621, + 158271865, + 157486281, + -1, + -63120, + 158207622, + 100620, + -63119, + 158273031, + 100619, + -63118, + 158338401, + 100618, + -63117, + 158403785, + 100617, + -63116, + 158469151, + 100616, + -63115, + 158534531, + 100615, + -63114, + 158599882, + 100614, + -63113, + 158665202, + 100613, + -63112, + 158730582, + 100612, + -1, + 158795974, + 100611, + 158992772, + 158207007, + -1, + -63109, + 158928518, + 100610, + -63108, + 158993927, + 100609, + -63107, + 159059297, + 100608, + -63106, + 159124681, + 100607, + -63105, + 159190047, + 100606, + -63104, + 159255427, + 100605, + -63103, + 159320778, + 100604, + -63102, + 159386098, + 100603, + -63101, + 159451478, + 100602, + -1, + 159516870, + 100601, + 159713679, + 158927747, + -1, + -63098, + 159649414, + 100600, + -63097, + 159714823, + 100599, + -63096, + 159780193, + 100598, + -63095, + 159845577, + 100597, + -63094, + 159910943, + 100596, + -63093, + 159976323, + 100595, + -63092, + 160041674, + 100594, + -63091, + 160106994, + 100593, + -63090, + 160172374, + 100592, + -1, + 160237766, + 100591, + 160434586, + 159648458, + -1, + -63087, + 160370310, + 100590, + -63086, + 160435719, + 100589, + -63085, + 160501089, + 100588, + -63084, + 160566473, + 100587, + -63083, + 160631839, + 100586, + -63082, + 160697219, + 100585, + -63081, + 160762570, + 100584, + -63080, + 160827890, + 100583, + -63079, + 160893270, + 100582, + -1, + 160958662, + 100581, + 161155493, + 160369138, + -1, + -63076, + 161091206, + 100580, + -63075, + 161156615, + 100579, + -63074, + 161221985, + 100578, + -63073, + 161287369, + 100577, + -63072, + 161352735, + 100576, + -63071, + 161418115, + 100575, + -63070, + 161483466, + 100574, + -63069, + 161548786, + 100573, + -63068, + 161614166, + 100572, + -1, + 161679558, + 100571, + 161876400, + 161089878, + -1, + -63065, + 161812102, + 100570, + -63064, + 161877511, + 100569, + -63063, + 161942881, + 100568, + -63062, + 162008265, + 100567, + -63061, + 162073631, + 100566, + -63060, + 162139011, + 100565, + -63059, + 162204362, + 100564, + -63058, + 162269682, + 100563, + -63057, + 162335062, + 100562, + -1, + 162400454, + 100561, + 162660351, + 161810630, + -1, + -63054, + 162532998, + 100560, + -63053, + 162598407, + 100559, + -63052, + 162663777, + 100558, + -63051, + 162729161, + 100557, + -63050, + 162794527, + 100556, + -63049, + 162859907, + 100555, + -63048, + 162925258, + 100554, + -63047, + 162990578, + 100553, + -63046, + 163055958, + 100552, + -1, + 163121350, + 100551, + 163318314, + 155978070, + -1, + 163383751, + 163253894, + -1, + -63042, + 163319430, + 100550, + -63041, + 163384839, + 100549, + -63040, + 163450209, + 100548, + -63039, + 163515593, + 100547, + -63038, + 163580959, + 100546, + -63037, + 163646339, + 100545, + -63036, + 163711690, + 100544, + -63035, + 163777010, + 100543, + -63034, + 163842390, + 100542, + -1, + 163907782, + 100541, + 164104658, + 163319303, + -1, + -63031, + 164040326, + 100540, + -63030, + 164105735, + 100539, + -63029, + 164171105, + 100538, + -63028, + 164236489, + 100537, + -63027, + 164301855, + 100536, + -63026, + 164367235, + 100535, + -63025, + 164432586, + 100534, + -63024, + 164497906, + 100533, + -63023, + 164563286, + 100532, + -1, + 164628678, + 100531, + 164825565, + 164040033, + -1, + -63020, + 164761222, + 100530, + -63019, + 164826631, + 100529, + -63018, + 164892001, + 100528, + -63017, + 164957385, + 100527, + -63016, + 165022751, + 100526, + -63015, + 165088131, + 100525, + -63014, + 165153482, + 100524, + -63013, + 165218802, + 100523, + -63012, + 165284182, + 100522, + -1, + 165349574, + 100521, + 165546472, + 164760777, + -1, + -63009, + 165482118, + 100520, + -63008, + 165547527, + 100519, + -63007, + 165612897, + 100518, + -63006, + 165678281, + 100517, + -63005, + 165743647, + 100516, + -63004, + 165809027, + 100515, + -63003, + 165874378, + 100514, + -63002, + 165939698, + 100513, + -63001, + 166005078, + 100512, + -1, + 166070470, + 100511, + 166267379, + 165481503, + -1, + -62998, + 166203014, + 100510, + -62997, + 166268423, + 100509, + -62996, + 166333793, + 100508, + -62995, + 166399177, + 100507, + -62994, + 166464543, + 100506, + -62993, + 166529923, + 100505, + -62992, + 166595274, + 100504, + -62991, + 166660594, + 100503, + -62990, + 166725974, + 100502, + -1, + 166791366, + 100501, + 166988286, + 166202243, + -1, + -62987, + 166923910, + 100500, + -62986, + 166989319, + 100499, + -62985, + 167054689, + 100498, + -62984, + 167120073, + 100497, + -62983, + 167185439, + 100496, + -62982, + 167250819, + 100495, + -62981, + 167316170, + 100494, + -62980, + 167381490, + 100493, + -62979, + 167446870, + 100492, + -1, + 167512262, + 100491, + 167709193, + 166922954, + -1, + -62976, + 167644806, + 100490, + -62975, + 167710215, + 100489, + -62974, + 167775585, + 100488, + -62973, + 167840969, + 100487, + -62972, + 167906335, + 100486, + -62971, + 167971715, + 100485, + -62970, + 168037066, + 100484, + -62969, + 168102386, + 100483, + -62968, + 168167766, + 100482, + -1, + 168233158, + 100481, + 168430100, + 167643634, + -1, + -62965, + 168365702, + 100480, + -62964, + 168431111, + 100479, + -62963, + 168496481, + 100478, + -62962, + 168561865, + 100477, + -62961, + 168627231, + 100476, + -62960, + 168692611, + 100475, + -62959, + 168757962, + 100474, + -62958, + 168823282, + 100473, + -62957, + 168888662, + 100472, + -1, + 168954054, + 100471, + 169151007, + 168364374, + -1, + -62954, + 169086598, + 100470, + -62953, + 169152007, + 100469, + -62952, + 169217377, + 100468, + -62951, + 169282761, + 100467, + -62950, + 169348127, + 100466, + -62949, + 169413507, + 100465, + -62948, + 169478858, + 100464, + -62947, + 169544178, + 100463, + -62946, + 169609558, + 100462, + -1, + 169674950, + 100461, + 169934847, + 169085126, + -1, + -62943, + 169807494, + 100460, + -62942, + 169872903, + 100459, + -62941, + 169938273, + 100458, + -62940, + 170003657, + 100457, + -62939, + 170069023, + 100456, + -62938, + 170134403, + 100455, + -62937, + 170199754, + 100454, + -62936, + 170265074, + 100453, + -62935, + 170330454, + 100452, + -1, + 170395846, + 100451, + 170592920, + 163252422, + -1, + 170658358, + 170528390, + -1, + -62931, + 170593926, + 100450, + -62930, + 170659335, + 100449, + -62929, + 170724705, + 100448, + -62928, + 170790089, + 100447, + -62927, + 170855455, + 100446, + -62926, + 170920835, + 100445, + -62925, + 170986186, + 100444, + -62924, + 171051506, + 100443, + -62923, + 171116886, + 100442, + -1, + 171182278, + 100441, + 171379265, + 170593799, + -1, + -62920, + 171314822, + 100440, + -62919, + 171380231, + 100439, + -62918, + 171445601, + 100438, + -62917, + 171510985, + 100437, + -62916, + 171576351, + 100436, + -62915, + 171641731, + 100435, + -62914, + 171707082, + 100434, + -62913, + 171772402, + 100433, + -62912, + 171837782, + 100432, + -1, + 171903174, + 100431, + 172100172, + 171314529, + -1, + -62909, + 172035718, + 100430, + -62908, + 172101127, + 100429, + -62907, + 172166497, + 100428, + -62906, + 172231881, + 100427, + -62905, + 172297247, + 100426, + -62904, + 172362627, + 100425, + -62903, + 172427978, + 100424, + -62902, + 172493298, + 100423, + -62901, + 172558678, + 100422, + -1, + 172624070, + 100421, + 172821079, + 172035273, + -1, + -62898, + 172756614, + 100420, + -62897, + 172822023, + 100419, + -62896, + 172887393, + 100418, + -62895, + 172952777, + 100417, + -62894, + 173018143, + 100416, + -62893, + 173083523, + 100415, + -62892, + 173148874, + 100414, + -62891, + 173214194, + 100413, + -62890, + 173279574, + 100412, + -1, + 173344966, + 100411, + 173541986, + 172755999, + -1, + -62887, + 173477510, + 100410, + -62886, + 173542919, + 100409, + -62885, + 173608289, + 100408, + -62884, + 173673673, + 100407, + -62883, + 173739039, + 100406, + -62882, + 173804419, + 100405, + -62881, + 173869770, + 100404, + -62880, + 173935090, + 100403, + -62879, + 174000470, + 100402, + -1, + 174065862, + 100401, + 174262893, + 173476739, + -1, + -62876, + 174198406, + 100400, + -62875, + 174263815, + 100399, + -62874, + 174329185, + 100398, + -62873, + 174394569, + 100397, + -62872, + 174459935, + 100396, + -62871, + 174525315, + 100395, + -62870, + 174590666, + 100394, + -62869, + 174655986, + 100393, + -62868, + 174721366, + 100392, + -1, + 174786758, + 100391, + 174983800, + 174197450, + -1, + -62865, + 174919302, + 100390, + -62864, + 174984711, + 100389, + -62863, + 175050081, + 100388, + -62862, + 175115465, + 100387, + -62861, + 175180831, + 100386, + -62860, + 175246211, + 100385, + -62859, + 175311562, + 100384, + -62858, + 175376882, + 100383, + -62857, + 175442262, + 100382, + -1, + 175507654, + 100381, + 175704707, + 174918130, + -1, + -62854, + 175640198, + 100380, + -62853, + 175705607, + 100379, + -62852, + 175770977, + 100378, + -62851, + 175836361, + 100377, + -62850, + 175901727, + 100376, + -62849, + 175967107, + 100375, + -62848, + 176032458, + 100374, + -62847, + 176097778, + 100373, + -62846, + 176163158, + 100372, + -1, + 176228550, + 100371, + 176425614, + 175638870, + -1, + -62843, + 176361094, + 100370, + -62842, + 176426503, + 100369, + -62841, + 176491873, + 100368, + -62840, + 176557257, + 100367, + -62839, + 176622623, + 100366, + -62838, + 176688003, + 100365, + -62837, + 176753354, + 100364, + -62836, + 176818674, + 100363, + -62835, + 176884054, + 100362, + -1, + 176949446, + 100361, + 177209343, + 176359622, + -1, + -62832, + 177081990, + 100360, + -62831, + 177147399, + 100359, + -62830, + 177212769, + 100358, + -62829, + 177278153, + 100357, + -62828, + 177343519, + 100356, + -62827, + 177408899, + 100355, + -62826, + 177474250, + 100354, + -62825, + 177539570, + 100353, + -1, + 177604950, + 100352, + 177864703, + 170528097, + -1, + 177867428, + 177736579, + -1, + -62821, + 177802886, + 101100, + -62820, + 177868295, + 101099, + -62819, + 177933665, + 101098, + -62818, + 177999049, + 101097, + -62817, + 178064415, + 101096, + -62816, + 178129795, + 101095, + -62815, + 178195146, + 101094, + -62814, + 178260466, + 101093, + -62813, + 178325846, + 101092, + -1, + 178391238, + 101091, + 178588335, + 177801930, + -1, + -62810, + 178523782, + 101090, + -62809, + 178589191, + 101089, + -62808, + 178654561, + 101088, + -62807, + 178719945, + 101087, + -62806, + 178785311, + 101086, + -62805, + 178850691, + 101085, + -62804, + 178916042, + 101084, + -62803, + 178981362, + 101083, + -62802, + 179046742, + 101082, + -1, + 179112134, + 101081, + 179309242, + 178522610, + -1, + -62799, + 179244678, + 101080, + -62798, + 179310087, + 101079, + -62797, + 179375457, + 101078, + -62796, + 179440841, + 101077, + -62795, + 179506207, + 101076, + -62794, + 179571587, + 101075, + -62793, + 179636938, + 101074, + -62792, + 179702258, + 101073, + -62791, + 179767638, + 101072, + -1, + 179833030, + 101071, + 180030149, + 179243350, + -1, + -62788, + 179965574, + 101070, + -62787, + 180030983, + 101069, + -62786, + 180096353, + 101068, + -62785, + 180161737, + 101067, + -62784, + 180227103, + 101066, + -62783, + 180292483, + 101065, + -62782, + 180357834, + 101064, + -62781, + 180423154, + 101063, + -62780, + 180488534, + 101062, + -1, + 180553926, + 101061, + 180751056, + 179964102, + -1, + -62777, + 180686470, + 101060, + -62776, + 180751879, + 101059, + -62775, + 180817249, + 101058, + -62774, + 180882633, + 101057, + -62773, + 180947999, + 101056, + -62772, + 181013379, + 101055, + -62771, + 181078730, + 101054, + -62770, + 181144050, + 101053, + -62769, + 181209430, + 101052, + -1, + 181274822, + 101051, + 181534719, + 180685855, + -1, + -62766, + 181406751, + 101106, + -62765, + 181472131, + 101105, + -62764, + 181537482, + 101104, + -62763, + 181602802, + 101103, + -62762, + 181668182, + 101102, + -1, + 181733574, + 101101, + -1, + 126830765, + 94176, + -1, + 126759133, + 127818, + -1, + 126685073, + 127883, + 182127662, + 126638489, + -1, + 182193173, + 182092017, + -1, + 182258461, + 182147927, + -1, + 182323959, + 182213463, + -1, + 182389483, + 182278999, + -1, + 182455011, + 182325009, + -1, + -62751, + 182421655, + 983864, + -62750, + 182468701, + 983861, + -1, + 182521617, + 983854, + 182717157, + 182421655, + 983857, + -1, + 182683799, + 983858, + 182848231, + 182673509, + 983862, + -1, + 182804581, + 983863, + 182979305, + 182796381, + 983855, + -1, + 182927453, + 983856, + 183173119, + 182922079, + 983859, + -1, + 183053151, + 983860, + 183241455, + 182325009, + -1, + -62739, + 183208087, + 983732, + -62738, + 183255133, + 983729, + -1, + 183308049, + 983722, + 183503601, + 183208087, + 983725, + -1, + 183470231, + 983726, + 183634675, + 183459941, + 983730, + -1, + 183591013, + 983731, + 183765749, + 183582813, + 983723, + -1, + 183713885, + 983724, + 183959551, + 183708511, + 983727, + -1, + 183839583, + 983728, + 184027908, + 182294189, + -1, + 184093436, + 183963409, + -1, + -62726, + 184060055, + 983710, + -62725, + 184107101, + 983707, + -1, + 184160017, + 983700, + 184355582, + 184060055, + 983703, + -1, + 184322199, + 983704, + 184486656, + 184311909, + 983708, + -1, + 184442981, + 983709, + 184617730, + 184434781, + 983701, + -1, + 184565853, + 983702, + 184811519, + 184560479, + 983705, + -1, + 184691551, + 983706, + 184879889, + 183973801, + -1, + 184945417, + 184815377, + -1, + -62713, + 184912023, + 983688, + -62712, + 184959069, + 983685, + -1, + 185011985, + 983678, + 185207563, + 184912023, + 983681, + -1, + 185174167, + 983682, + 185338637, + 185163877, + 983686, + -1, + 185294949, + 983687, + 185469711, + 185286749, + 983679, + -1, + 185417821, + 983680, + 185663487, + 185412447, + 983683, + -1, + 185543519, + 983684, + 185731861, + 184815377, + -1, + -62701, + 185698455, + 983754, + -62700, + 185745501, + 983751, + -1, + 185798417, + 983744, + 185994007, + 185698455, + 983747, + -1, + 185960599, + 983748, + 186125081, + 185950309, + 983752, + -1, + 186081381, + 983753, + 186256155, + 186073181, + 983745, + -1, + 186204253, + 983746, + 186449919, + 186198879, + 983749, + -1, + 186329951, + 983750, + 186518341, + 182220834, + -1, + 186583852, + 186464967, + -1, + 186649379, + 186519313, + -1, + -62687, + 186615959, + 983886, + -62686, + 186663005, + 983883, + -1, + 186715921, + 983876, + 186911525, + 186615959, + 983879, + -1, + 186878103, + 983880, + 187042599, + 186867813, + 983884, + -1, + 186998885, + 983885, + 187173673, + 186990685, + 983877, + -1, + 187121757, + 983878, + 187304747, + 187116383, + 983881, + -1, + 187247455, + 983882, + -1, + 187266325, + 983932, + 187501369, + 186546210, + -1, + 187566897, + 187436817, + -1, + -62673, + 187533463, + 983897, + -62672, + 187580509, + 983894, + -1, + 187633425, + 983887, + 187829043, + 187533463, + 983890, + -1, + 187795607, + 983891, + 187960117, + 187785317, + 983895, + -1, + 187916389, + 983896, + 188091191, + 187908189, + 983888, + -1, + 188039261, + 983889, + 188284927, + 188033887, + 983892, + -1, + 188164959, + 983893, + 188353341, + 187436817, + -1, + -62661, + 188319895, + 983908, + -62660, + 188366941, + 983905, + -1, + 188419857, + 983898, + 188615487, + 188319895, + 983901, + -1, + 188582039, + 983902, + 188746561, + 188571749, + 983906, + -1, + 188702821, + 983907, + 188877635, + 188694621, + 983899, + -1, + 188825693, + 983900, + 189071359, + 188820319, + 983903, + -1, + 188951391, + 983904, + 189139820, + 186469623, + -1, + 189205344, + 189091063, + -1, + 189270868, + 189156599, + -1, + 189336396, + 189206289, + -1, + -62646, + 189302935, + 983831, + -62645, + 189349981, + 983828, + -1, + 189402897, + 983821, + 189598542, + 189302935, + 983824, + -1, + 189565079, + 983825, + 189729616, + 189554789, + 983829, + -1, + 189685861, + 983830, + 189860690, + 189677661, + 983822, + -1, + 189808733, + 983823, + 190054399, + 189803359, + 983826, + -1, + 189934431, + 983827, + 190122840, + 189206289, + -1, + -62634, + 190089367, + 983842, + -62633, + 190136413, + 983839, + -1, + 190189329, + 983832, + 190384986, + 190089367, + 983835, + -1, + 190351511, + 983836, + 190516060, + 190341221, + 983840, + -1, + 190472293, + 983841, + 190647134, + 190464093, + 983833, + -1, + 190595165, + 983834, + 190840831, + 190589791, + 983837, + -1, + 190720863, + 983838, + 190909284, + 189140753, + -1, + -62622, + 190875799, + 983809, + -62621, + 190922845, + 983806, + -1, + 190975761, + 983799, + 191171430, + 190875799, + 983802, + -1, + 191137943, + 983803, + 191302504, + 191127653, + 983807, + -1, + 191258725, + 983808, + 191433578, + 191250525, + 983800, + -1, + 191381597, + 983801, + 191627263, + 191376223, + 983804, + -1, + 191507295, + 983805, + 191695750, + 189090499, + -1, + 191761274, + 191659715, + -1, + 191826802, + 191696657, + 983920, + -62608, + 191793303, + 983931, + -62607, + 191840349, + 983928, + -1, + 191893265, + 983921, + 192088948, + 191793303, + 983924, + -1, + 192055447, + 983925, + 192220022, + 192045157, + 983929, + -1, + 192176229, + 983930, + 192351096, + 192168029, + 983922, + -1, + 192299101, + 983923, + 192544767, + 192293727, + 983926, + -1, + 192424799, + 983927, + 192613246, + 191696657, + -1, + -62596, + 192579735, + 983677, + -62595, + 192626781, + 983674, + -1, + 192679697, + 983667, + 192875392, + 192579735, + 983670, + -1, + 192841879, + 983671, + 193006466, + 192831589, + 983675, + -1, + 192962661, + 983676, + 193137540, + 192954461, + 983668, + -1, + 193085533, + 983669, + 193331199, + 193080159, + 983672, + -1, + 193211231, + 983673, + 193399712, + 191660366, + -1, + 193465236, + 193364302, + -1, + 193530764, + 193400593, + -1, + -62582, + 193497239, + 983721, + -62581, + 193544285, + 983718, + -1, + 193597201, + 983711, + 193792910, + 193497239, + 983714, + -1, + 193759383, + 983715, + 193923984, + 193749093, + 983719, + -1, + 193880165, + 983720, + 194055058, + 193871965, + 983712, + -1, + 194003037, + 983713, + 194248703, + 193997663, + 983716, + -1, + 194128735, + 983717, + 194317208, + 193400593, + -1, + -62570, + 194283671, + 983743, + -62569, + 194330717, + 983740, + -1, + 194383633, + 983733, + 194579354, + 194283671, + 983736, + -1, + 194545815, + 983737, + 194710428, + 194535525, + 983741, + -1, + 194666597, + 983742, + 194841502, + 194658397, + 983734, + -1, + 194789469, + 983735, + 195035135, + 194784095, + 983738, + -1, + 194915167, + 983739, + 195103674, + 193359692, + -1, + 195169198, + 195063628, + -1, + 195234726, + 195104529, + -1, + -62556, + 195201175, + 983853, + -62555, + 195248221, + 983850, + -1, + 195301137, + 983843, + 195496872, + 195201175, + 983846, + -1, + 195463319, + 983847, + 195627946, + 195453029, + 983851, + -1, + 195584101, + 983852, + 195759020, + 195575901, + 983844, + -1, + 195706973, + 983845, + 195952639, + 195701599, + 983848, + -1, + 195832671, + 983849, + 196021170, + 195104529, + -1, + -62544, + 195987607, + 983798, + -62543, + 196034653, + 983795, + -1, + 196087569, + 983788, + 196283316, + 195987607, + 983791, + -1, + 196249751, + 983792, + 196414390, + 196239461, + 983796, + -1, + 196370533, + 983797, + 196545464, + 196362333, + 983789, + -1, + 196493405, + 983790, + 196739071, + 196488031, + 983793, + -1, + 196619103, + 983794, + 196807623, + 195073709, + -1, + 196873151, + 196742929, + -1, + -62531, + 196839575, + 983787, + -62530, + 196886621, + 983784, + -1, + 196939537, + 983777, + 197135297, + 196839575, + 983780, + -1, + 197101719, + 983781, + 197266371, + 197091429, + 983785, + -1, + 197222501, + 983786, + 197397445, + 197214301, + 983778, + -1, + 197345373, + 983779, + 197591039, + 197339999, + 983782, + -1, + 197471071, + 983783, + 197659604, + 196775477, + -1, + 197725132, + 197594897, + -1, + -62518, + 197691543, + 983820, + -62517, + 197738589, + 983817, + -1, + 197791505, + 983810, + 197987278, + 197691543, + 983813, + -1, + 197953687, + 983814, + 198118352, + 197943397, + 983818, + -1, + 198074469, + 983819, + 198249426, + 198066269, + 983811, + -1, + 198197341, + 983812, + 198443007, + 198191967, + 983815, + -1, + 198323039, + 983816, + 198511585, + 197617873, + -1, + 198577113, + 198446865, + -1, + -62505, + 198543511, + 983765, + -62504, + 198590557, + 983762, + -1, + 198643473, + 983755, + 198839259, + 198543511, + 983758, + -1, + 198805655, + 983759, + 198970333, + 198795365, + 983763, + -1, + 198926437, + 983764, + 199101407, + 198918237, + 983756, + -1, + 199049309, + 983757, + 199294975, + 199043935, + 983760, + -1, + 199175007, + 983761, + 199363566, + 198465044, + -1, + 199429094, + 199298833, + -1, + -62492, + 199395479, + 983776, + -62491, + 199442525, + 983773, + -1, + 199495441, + 983766, + 199691240, + 199395479, + 983769, + -1, + 199657623, + 983770, + 199822314, + 199647333, + 983774, + -1, + 199778405, + 983775, + 199953388, + 199770205, + 983767, + -1, + 199901277, + 983768, + 200146943, + 199895903, + 983771, + -1, + 200026975, + 983772, + 200215547, + 199313909, + -1, + 200281075, + 200150801, + -1, + -62479, + 200247447, + 983875, + -62478, + 200294493, + 983872, + -1, + 200347409, + 983865, + 200543221, + 200247447, + 983868, + -1, + 200509591, + 983869, + 200674295, + 200499301, + 983873, + -1, + 200630373, + 983874, + 200805369, + 200622173, + 983866, + -1, + 200753245, + 983867, + 200998911, + 200747871, + 983870, + -1, + 200878943, + 983871, + 201067528, + 200161991, + -1, + 201133056, + 201002769, + -1, + -62466, + 201099415, + 983919, + -62465, + 201146461, + 983916, + -1, + 201199377, + 983909, + 201395202, + 201099415, + 983912, + -1, + 201361559, + 983913, + 201526276, + 201351269, + 983917, + -1, + 201482341, + 983918, + 201657350, + 201474141, + 983910, + -1, + 201605213, + 983911, + 201850879, + 201599839, + 983914, + -1, + 201730911, + 983915, + 201981951, + 201006391, + -1, + 201985037, + 201854737, + -1, + -62453, + 201951383, + 983699, + -62452, + 201998429, + 983696, + -1, + 202051345, + 983689, + 202247183, + 201951383, + 983692, + -1, + 202213527, + 983693, + 202378257, + 202203237, + 983697, + -1, + 202334309, + 983698, + 202509331, + 202326109, + 983690, + -1, + 202457181, + 983691, + 202702847, + 202451807, + 983694, + -1, + 202582879, + 983695, + 202833919, + 182133417, + -1, + 202837019, + 202726231, + 983650, + 202902553, + 202791767, + 983648, + -1, + 202857303, + 983660, + -62438, + 202872493, + 983646, + -1, + 202979241, + 983644, + 203164702, + 202799138, + 983664, + -62435, + 203126818, + 983663, + -1, + 203176647, + 983662, + 203361313, + 203115767, + 983655, + 203489279, + 203312375, + 983658, + -1, + 203377911, + 983657, + 203557923, + 203325774, + 983649, + -1, + 203522382, + 983647, + 203688997, + 203517772, + 983654, + -1, + 203648844, + 983659, + 203820071, + 203639491, + 983643, + -1, + 203783875, + 983666, + -62424, + 203789997, + 983653, + -62423, + 203918901, + 983656, + -62422, + 203974865, + 983651, + -62421, + 204035604, + 983652, + -62420, + 204098037, + 983661, + -62419, + 204159687, + 983665, + -1, + 204217655, + 983645, + 204409993, + 182078147, + -1, + 204475528, + 204370706, + -1, + 204541033, + 204427689, + -1, + 204606519, + 204505422, + -1, + 204672053, + 204570958, + -1, + -62412, + 204618453, + 71317, + -1, + 204672785, + 71316, + -62410, + 204618453, + 71322, + -1, + 204803857, + 71321, + 204999740, + 204561239, + -1, + -62407, + 204969736, + 71315, + -62406, + 205020080, + 71320, + -62405, + 205076450, + 71310, + -1, + 205131537, + 71325, + 205327426, + 204940639, + -1, + 205392960, + 205268319, + -1, + -62401, + 205339349, + 71319, + -1, + 205393681, + 71318, + -62399, + 205339349, + 71324, + -1, + 205524753, + 71323, + 205720646, + 205262609, + 71296, + -62396, + 205686935, + 71305, + -62395, + 205733981, + 71303, + -1, + 205786897, + 71297, + 205982792, + 205686935, + 71300, + -1, + 205949079, + 71301, + 206113867, + 205944866, + -1, + -62390, + 206060245, + 71335, + -1, + 206114577, + 71336, + 206310478, + 206073676, + -1, + -62387, + 206270361, + 71338, + -1, + 206311185, + 71332, + 206507089, + 206268625, + -1, + -62384, + 206453461, + 71327, + -1, + 206507793, + 71326, + 206703700, + 206457539, + -1, + -62381, + 206650069, + 71307, + -1, + 206704401, + 71306, + 206900311, + 206653941, + -1, + -62378, + 206846677, + 71314, + -1, + 206901009, + 71313, + 207096921, + 206848093, + 71298, + -1, + 207044701, + 71299, + 207227996, + 207042473, + -1, + -62373, + 207174357, + 71309, + -1, + 207228689, + 71308, + 207424607, + 207166775, + -1, + -62370, + 207370965, + 71312, + -1, + 207425297, + 71311, + 207621218, + 207362082, + -1, + -62367, + 207567573, + 71329, + -1, + 207621905, + 71328, + -62365, + 207591176, + 71331, + -62364, + 207785543, + 71334, + -62363, + 207839333, + 71304, + -62362, + 207902302, + 71330, + -62361, + 207965513, + 71333, + -62360, + 208026325, + 71337, + -1, + 208087903, + 71302, + 208276599, + 204482553, + -1, + 208342125, + 208240974, + -1, + -62356, + 208311510, + 71362, + -1, + 208355154, + 71363, + 208538736, + 208304162, + -1, + -62353, + 208488829, + 71366, + -1, + 208548406, + 71367, + 208735347, + 208483110, + -1, + -62350, + 208693002, + 71364, + -1, + 208750815, + 71365, + -62348, + 208705799, + 71360, + -62347, + 208888580, + 71361, + -62346, + 208952770, + 71369, + -1, + 209006080, + 71368, + 209194114, + 208244984, + -1, + 209259644, + 209129233, + -1, + -62342, + 209225879, + 71349, + -62341, + 209272925, + 71347, + -1, + 209325841, + 71341, + 209521790, + 209225879, + 71344, + -1, + 209488023, + 71345, + 209652864, + 209469533, + 71342, + -1, + 209600605, + 71343, + -62335, + 209608805, + 71348, + -1, + 209726303, + 71346, + 209977343, + 209157200, + -1, + 209980550, + 209883137, + -1, + -62331, + 209942850, + 71340, + -1, + 210006079, + 71350, + -62329, + 209936366, + 71351, + -1, + 210113673, + 71339, + -1, + 204419082, + 129377, + 210373772, + 204362810, + -1, + -62325, + 210330372, + 119671, + -1, + 210384127, + 119672, + 210570382, + 210311202, + 983061, + -1, + 210521895, + 127955, + -62321, + 210540109, + 128661, + -62320, + 210659919, + 128429, + -1, + 210706891, + 127790, + 210898199, + 126566493, + -1, + 210963714, + 210857804, + -1, + 211029249, + 210911286, + -1, + 211094738, + 210981289, + -1, + 211160220, + 211062325, + -1, + 211225755, + 211116235, + -1, + 211291289, + 211185484, + 70791, + -1, + 211251020, + 70792, + 211484671, + 211242231, + 70793, + -1, + 211373303, + 70794, + -1, + 211160849, + 70827, + 211618978, + 211124558, + -1, + 211684512, + 211583310, + -1, + -62305, + 211630805, + 70810, + -1, + 211685137, + 70809, + -62303, + 211630805, + 70815, + -1, + 211816209, + 70814, + 212012199, + 211573591, + -1, + -62300, + 211982088, + 70808, + -62299, + 212032432, + 70813, + -62298, + 212088802, + 70803, + -1, + 212143889, + 70818, + 212339885, + 211952991, + -1, + 212405419, + 212280671, + -1, + -62294, + 212351701, + 70812, + -1, + 212406033, + 70811, + -62292, + 212351701, + 70817, + -1, + 212537105, + 70816, + 212733105, + 212274961, + 70785, + -62289, + 212699287, + 70798, + -62288, + 212746333, + 70796, + -1, + 212799249, + 70786, + 212995253, + 212695074, + -1, + -62285, + 212957342, + 70829, + -62284, + 213007061, + 70828, + -1, + 213061393, + 70830, + 213257399, + 212961431, + 70789, + -1, + 213223575, + 70790, + 213388474, + 213215441, + -1, + -62279, + 213334741, + 70820, + -1, + 213389073, + 70819, + 213585085, + 213338819, + -1, + -62276, + 213531349, + 70800, + -1, + 213585681, + 70799, + 213781696, + 213535221, + -1, + -62273, + 213727957, + 70807, + -1, + 213782289, + 70806, + 213978306, + 213729373, + 70787, + -1, + 213925981, + 70788, + 214109381, + 213923753, + -1, + -62268, + 214055637, + 70802, + -1, + 214109969, + 70801, + 214305992, + 214048055, + -1, + -62265, + 214252245, + 70805, + -1, + 214306577, + 70804, + 214502603, + 214243362, + -1, + -62262, + 214448853, + 70822, + -1, + 214503185, + 70821, + -62260, + 214472456, + 70824, + -62259, + 214658969, + 70825, + -62258, + 214720613, + 70797, + -62257, + 214783582, + 70823, + -62256, + 214846793, + 70826, + -62255, + 214907605, + 70831, + -1, + 214969183, + 70795, + 215157989, + 211063032, + -1, + 215223512, + 215126142, + -1, + 215289046, + 215183180, + 70837, + -1, + 215248716, + 70838, + 215482367, + 215239927, + 70839, + -1, + 215370999, + 70840, + 215551196, + 215158545, + -1, + -62246, + 215517335, + 70846, + -62245, + 215564381, + 70843, + -1, + 215617297, + 70832, + 215813342, + 215517335, + 70835, + -1, + 215779479, + 70836, + 215944417, + 215776203, + -1, + -62240, + 215900261, + 70845, + -1, + 215952223, + 70842, + 216141027, + 215892061, + 70833, + -1, + 216088669, + 70834, + -62236, + 216096869, + 70844, + -1, + 216214367, + 70841, + 216403187, + 215099385, + -1, + 216468713, + 216367438, + -1, + -62232, + 216437974, + 70866, + -1, + 216481618, + 70867, + 216665324, + 216430626, + -1, + -62229, + 216615293, + 70870, + -1, + 216674870, + 70871, + 216861935, + 216609574, + -1, + -62226, + 216819466, + 70868, + -1, + 216877279, + 70869, + -62224, + 216832263, + 70864, + -62223, + 217015044, + 70865, + -62222, + 217079234, + 70873, + -1, + 217132544, + 70872, + 217320700, + 216366160, + -1, + 217386231, + 217288705, + -1, + -62218, + 217348418, + 70849, + -1, + 217411647, + 70850, + 217582842, + 217321233, + -1, + -62215, + 217550410, + 70852, + -1, + 217604157, + 70848, + -62213, + 217538542, + 70851, + -1, + 217718222, + 70847, + 217910527, + 217255697, + -1, + -62210, + 217865790, + 70784, + -1, + 217913629, + 70854, + -62208, + 217866805, + 70855, + -1, + 218053305, + 70853, + -1, + 210971834, + 128555, + 218303757, + 210901409, + -1, + 218369289, + 218265634, + -1, + 218434824, + 218335605, + -1, + -62202, + 218388423, + 3982, + -62201, + 218451668, + 3981, + -1, + 218515168, + 3983, + -1, + 218383099, + 3980, + 218824703, + 218322760, + -1, + -62197, + 218727979, + 4058, + -62196, + 218779515, + 4057, + -1, + 218831507, + 983208, + 219024659, + 218248241, + -1, + 219090193, + 218976805, + -1, + -62192, + 219045989, + 11623, + -1, + 219097951, + 11622, + -62190, + 219052584, + 11632, + -1, + 219226804, + 11647, + 219417877, + 218970341, + 128005, + -1, + 219349454, + 128047, + -62186, + 219371716, + 9202, + -1, + 219488586, + 127915, + 219680055, + 210844359, + -1, + 219745579, + 219640258, + -1, + 219811107, + 219676672, + -1, + 219876639, + 219771046, + -1, + -62180, + 219837259, + 128487, + -62179, + 219893691, + 128486, + -62178, + 219945324, + 128485, + -1, + 220008391, + 128484, + -62176, + 219840095, + 128491, + -62175, + 220163102, + 128962, + -62174, + 220224789, + 128423, + -1, + 220273959, + 128433, + 220528639, + 219744285, + -1, + 220532010, + 220407137, + -1, + 220597544, + 220497324, + -1, + -62169, + 220558580, + 11162, + -1, + 220614925, + 11160, + -62167, + 220558410, + 11161, + -1, + 220745832, + 11163, + -1, + 220475076, + 11835, + 220990770, + 219693149, + -1, + 221056305, + 220945239, + -1, + 221121840, + 220987392, + -1, + -62161, + 221083889, + 128936, + -1, + 221133399, + 128929, + -1, + 221072430, + 129300, + -1, + 221016302, + 129353, + 221449525, + 220957466, + -1, + -62156, + 221416421, + 128077, + -1, + 221456944, + 128078, + -62154, + 221406944, + 128173, + -1, + 221589731, + 127777, + 221777234, + 219639628, + -1, + 221842752, + 221712145, + -1, + 221908283, + 221795860, + 128650, + -1, + 221839675, + 128651, + 222039358, + 221846839, + -1, + -62147, + 222004665, + 128668, + -1, + 222055348, + 128434, + -62145, + 221994892, + 11223, + -1, + 222184413, + 128646, + 222367048, + 221790301, + -1, + 222432582, + 222303190, + -1, + 222498117, + 222399164, + -1, + -62140, + 222459904, + 128208, + -1, + 222508339, + 128681, + -1, + 222449494, + 128710, + -62137, + 222391191, + 11851, + -1, + 222701319, + 128305, + 222891343, + 222322789, + -1, + 222956878, + 222849233, + -1, + 223022413, + 222904656, + -1, + -62132, + 222967029, + 128032, + -1, + 223030007, + 127865, + -1, + 222969939, + 127942, + -1, + 222909435, + 128654, + 223412223, + 222857367, + -1, + -62127, + 223304409, + 127930, + -1, + 223357847, + 11231, + 223546731, + 221743255, + -1, + 223612265, + 223506252, + -1, + 223677797, + 223567042, + -1, + 223743322, + 223639586, + -1, + 223808857, + 223700941, + -1, + -62120, + 223777436, + 128597, + -1, + 223816773, + 128599, + -1, + 223751903, + 11829, + 224071007, + 223683935, + -1, + 224136542, + 224019183, + -1, + -62115, + 224105686, + 8586, + -1, + 224149330, + 8587, + -1, + 224071987, + 11832, + 224398690, + 224026322, + -1, + -62111, + 224367260, + 128596, + -1, + 224406597, + 128598, + -62109, + 224354752, + 128399, + -62108, + 224535086, + 11826, + -1, + 224598769, + 11202, + 224791912, + 223627971, + -1, + -62105, + 224741365, + 8378, + -1, + 224801556, + 129411, + -1, + 224757050, + 128034, + -62102, + 223565720, + 129347, + -1, + 225006493, + 127799, + 225185153, + 223488863, + -1, + 225250683, + 225135863, + -1, + 225316212, + 225192799, + -1, + 225381746, + 225274650, + -1, + 225447281, + 225341774, + 128222, + -1, + 225380165, + 128380, + -1, + 225403592, + 128384, + -62093, + 225349730, + 128250, + -1, + 225605996, + 128301, + 225837055, + 225282682, + -1, + 225840504, + 225737814, + -1, + -62089, + 225779162, + 3072, + -1, + 225842322, + 3076, + 226099199, + 225792425, + -1, + -62086, + 225998766, + 3162, + -1, + 226055204, + 3124, + 226233726, + 225185553, + -1, + -62083, + 226193276, + 128198, + -1, + 226239708, + 127861, + -62081, + 226197333, + 129514, + -62080, + 226385509, + 127934, + -1, + 226436775, + 129528, + 226626960, + 225140837, + -1, + 226692489, + 226584787, + -1, + 226758024, + 226638549, + -1, + 226823559, + 226710126, + -1, + -62074, + 226785695, + 11833, + -1, + 226826929, + 11210, + -1, + 226787662, + 127913, + -1, + 226726983, + 128285, + 227151244, + 226648165, + -1, + -62069, + 227115805, + 129463, + -1, + 227167951, + 129520, + -62067, + 227106202, + 128069, + -62066, + 227301248, + 127813, + -62065, + 227364077, + 128508, + -1, + 227427223, + 128701, + 227610010, + 226595097, + -1, + 227675545, + 227565669, + -1, + 227741080, + 227606528, + -1, + -62060, + 227710307, + 128109, + -62059, + 227769951, + 128490, + -62058, + 227825819, + 128108, + -62057, + 227884282, + 128149, + -1, + 227941671, + 128432, + -1, + 227674171, + 11834, + -1, + 227625045, + 128256, + 228327423, + 227543069, + -1, + -62052, + 228228026, + 128085, + -1, + 228291305, + 129430, + 228463597, + 126506516, + -1, + 228528101, + 228404063, + -1, + 228593304, + 228481879, + -1, + 228658838, + 228533964, + -1, + 228724349, + 228622587, + -1, + 228789776, + 228657350, + -1, + 228855214, + 228724358, + -1, + -62043, + 228789971, + 125069, + -62042, + 228855401, + 125123, + -62041, + 228920675, + 124959, + -62040, + 228986086, + 125036, + -62039, + 229051459, + 124932, + -62038, + 229116866, + 124952, + -62037, + 229182185, + 125097, + -62036, + 229247505, + 125088, + -62035, + 229312957, + 124999, + -1, + 229378319, + 125047, + 229576121, + 228789767, + -1, + -62032, + 229510792, + 124993, + -62031, + 229576222, + 125024, + -62030, + 229641610, + 125043, + -62029, + 229707020, + 125056, + -62028, + 229772456, + 125117, + -62027, + 229837744, + 124985, + -62026, + 229903088, + 125039, + -62025, + 229968461, + 125049, + -62024, + 230033837, + 125071, + -1, + 230099257, + 125015, + 230297028, + 229510497, + -1, + -62021, + 230231773, + 124980, + -62020, + 230297112, + 125021, + -62019, + 230362593, + 125119, + -62018, + 230427900, + 124933, + -62017, + 230493236, + 125022, + -62016, + 230558629, + 125089, + -62015, + 230624027, + 124986, + -62014, + 230689338, + 125080, + -62013, + 230754673, + 125099, + -1, + 230820061, + 125100, + 231017935, + 230231241, + -1, + -62010, + 230952674, + 125002, + -62009, + 231018096, + 125068, + -62008, + 231083443, + 125107, + -62007, + 231148852, + 125074, + -62006, + 231214152, + 124931, + -62005, + 231279567, + 125108, + -62004, + 231344908, + 125009, + -62003, + 231410228, + 125076, + -62002, + 231475656, + 124945, + -1, + 231541021, + 125124, + 231738842, + 230951967, + -1, + -61999, + 231673497, + 124951, + -61998, + 231738978, + 125121, + -61997, + 231804360, + 125066, + -61996, + 231869653, + 125095, + -61995, + 231935106, + 125000, + -61994, + 232000438, + 124987, + -61993, + 232065783, + 125041, + -61992, + 232131072, + 125044, + -61991, + 232196520, + 125072, + -1, + 232261931, + 125070, + 232459749, + 231672707, + -1, + -61988, + 232394471, + 124946, + -61987, + 232459838, + 124934, + -61986, + 232525215, + 125078, + -61985, + 232590581, + 125046, + -61984, + 232656050, + 124942, + -61983, + 232721310, + 125090, + -61982, + 232786743, + 125048, + -61981, + 232851974, + 125037, + -61980, + 232917368, + 125033, + -1, + 232982767, + 125035, + 233180656, + 232393418, + -1, + -61977, + 233115341, + 125029, + -61976, + 233180764, + 125028, + -61975, + 233246167, + 125027, + -61974, + 233311440, + 125020, + -61973, + 233376815, + 125019, + -61972, + 233442195, + 125018, + -61971, + 233507682, + 125013, + -61970, + 233573033, + 125012, + -61969, + 233638354, + 125011, + -1, + 233703680, + 125005, + 233901563, + 233114098, + -1, + -61966, + 233836174, + 125004, + -61965, + 233901621, + 125003, + -61964, + 233967002, + 124984, + -61963, + 234032391, + 124983, + -61962, + 234097742, + 124982, + -61961, + 234163184, + 124998, + -61960, + 234228550, + 124997, + -61959, + 234293868, + 124996, + -61958, + 234359224, + 124976, + -1, + 234424624, + 124975, + 234622470, + 233834838, + -1, + -61955, + 234557144, + 124974, + -61954, + 234622478, + 124992, + -61953, + 234687848, + 124991, + -61952, + 234753227, + 124990, + -61951, + 234818719, + 124964, + -61950, + 234883973, + 124963, + -61949, + 234949379, + 124962, + -61948, + 235014651, + 124957, + -61947, + 235080028, + 124956, + -1, + 235145422, + 124955, + 235405311, + 234555590, + -1, + -61944, + 235277990, + 124950, + -61943, + 235343439, + 124949, + -61942, + 235408813, + 124948, + -61941, + 235474256, + 124938, + -61940, + 235539629, + 124937, + -61939, + 235604987, + 124936, + -61938, + 235670289, + 124930, + -61937, + 235735564, + 124929, + -1, + 235800962, + 124928, + 236060671, + 228723030, + -1, + 236064284, + 235933191, + -1, + -61933, + 235998879, + 124954, + -61932, + 236064341, + 125079, + -61931, + 236129702, + 125083, + -61930, + 236195056, + 125034, + -61929, + 236260515, + 125114, + -61928, + 236325845, + 125065, + -61927, + 236391205, + 125058, + -61926, + 236456608, + 125113, + -61925, + 236521825, + 124995, + -1, + 236587219, + 124994, + 236785191, + 235998561, + -1, + -61922, + 236719763, + 124935, + -61921, + 236785171, + 124973, + -61920, + 236850639, + 125067, + -61919, + 236915947, + 125032, + -61918, + 236981331, + 125010, + -61917, + 237046716, + 125082, + -61916, + 237112150, + 125116, + -61915, + 237177408, + 125081, + -61914, + 237242803, + 125101, + -1, + 237308196, + 125122, + 237506098, + 236719305, + -1, + -61911, + 237440711, + 125031, + -61910, + 237506089, + 125061, + -61909, + 237571459, + 125064, + -61908, + 237636827, + 125063, + -61907, + 237702269, + 124967, + -61906, + 237767651, + 125120, + -61905, + 237832918, + 124965, + -61904, + 237898342, + 124977, + -61903, + 237963655, + 125084, + -1, + 238029050, + 125008, + 238227005, + 237440031, + -1, + -61900, + 238161592, + 125054, + -61899, + 238227017, + 125093, + -61898, + 238292372, + 125006, + -61897, + 238357804, + 125052, + -61896, + 238423097, + 125059, + -61895, + 238488520, + 124953, + -61894, + 238553888, + 124988, + -61893, + 238619220, + 125109, + -61892, + 238684611, + 125115, + -1, + 238749896, + 124958, + 238947912, + 238160771, + -1, + -61889, + 238882496, + 125111, + -61888, + 238947875, + 125096, + -61887, + 239013341, + 124968, + -61886, + 239078693, + 125051, + -61885, + 239144041, + 125075, + -61884, + 239209461, + 125118, + -61883, + 239274844, + 124944, + -61882, + 239340073, + 125086, + -61881, + 239405532, + 125016, + -1, + 239470837, + 125038, + 239668819, + 238881482, + -1, + -61878, + 239603437, + 124947, + -61877, + 239668745, + 124961, + -61876, + 239734130, + 124969, + -61875, + 239799620, + 124979, + -61874, + 239864894, + 124971, + -61873, + 239930332, + 125112, + -61872, + 239995619, + 125023, + -61871, + 240060951, + 125087, + -61870, + 240126333, + 124970, + -1, + 240191721, + 125042, + 240389726, + 239602162, + -1, + -61867, + 240324268, + 125103, + -61866, + 240389678, + 125040, + -61865, + 240455104, + 125055, + -61864, + 240520522, + 124939, + -61863, + 240585839, + 125104, + -61862, + 240651160, + 125094, + -61861, + 240716593, + 125102, + -61860, + 240781895, + 125077, + -61859, + 240847319, + 125017, + -1, + 240912662, + 125053, + 241110633, + 240322902, + -1, + -61856, + 241045170, + 125106, + -61855, + 241110645, + 124940, + -61854, + 241175994, + 125030, + -61853, + 241241401, + 124978, + -61852, + 241306741, + 125050, + -61851, + 241372160, + 124941, + -61850, + 241437447, + 125007, + -61849, + 241502749, + 125092, + -61848, + 241568108, + 125060, + -1, + 241633541, + 124989, + 241831540, + 241043654, + -1, + -61845, + 241766131, + 125014, + -61844, + 241831491, + 125091, + -61843, + 241896829, + 125098, + -61842, + 241962264, + 125057, + -61841, + 242027613, + 125085, + -61840, + 242093034, + 125001, + -61839, + 242158284, + 124960, + -61838, + 242223712, + 125073, + -61837, + 242288998, + 125026, + -1, + 242354393, + 124966, + 242614271, + 241766022, + -1, + -61834, + 242486647, + 125025, + -61833, + 242552126, + 124981, + -61832, + 242617377, + 124972, + -61831, + 242682886, + 124943, + -61830, + 242748157, + 125045, + -61829, + 242813530, + 125110, + -61828, + 242878866, + 125105, + -1, + 242944227, + 125062, + 243142282, + 228665337, + -1, + 243207809, + 243106126, + -1, + -61824, + 243176662, + 125128, + -1, + 243220306, + 125129, + 243404420, + 243169314, + -1, + -61821, + 243353981, + 125132, + -1, + 243413558, + 125133, + 243601031, + 243348262, + -1, + -61818, + 243558154, + 125130, + -1, + 243615967, + 125131, + -61816, + 243557124, + 125127, + -61815, + 243752386, + 125135, + -1, + 243805696, + 125134, + 244056063, + 243081748, + -1, + 244059794, + 243958094, + -1, + 244125329, + 244001631, + -1, + 244190864, + 244079447, + -1, + -61809, + 244152354, + 125137, + -1, + 244188371, + 125140, + -1, + 244133775, + 125136, + -1, + 244072261, + 125139, + 244518549, + 244006928, + -1, + -61804, + 244480034, + 125138, + -1, + 244516051, + 125141, + -1, + 244472252, + 125142, + -61801, + 228620406, + 128697, + -1, + 244737338, + 128334, + 244911930, + 228552524, + -1, + 244977465, + 244867499, + -1, + 245042963, + 244917532, + -1, + 245108448, + 244998132, + -1, + 245173935, + 245072206, + -1, + 245239461, + 245141785, + -1, + 245304995, + 245194853, + 68033, + 245432319, + 245235712, + -1, + 245436066, + 245317648, + 68051, + -1, + 245368009, + 68078, + -1, + 245400468, + 68060, + 245694463, + 245247971, + 68042, + -1, + 245564617, + 68069, + 245763757, + 245185223, + -1, + 245829291, + 245723586, + 68034, + 245956607, + 245760000, + -1, + 245960362, + 245841936, + 68052, + -1, + 245892297, + 68079, + -1, + 245924756, + 68061, + 246218751, + 245778401, + 68043, + -1, + 246088905, + 68070, + 246349823, + 245706478, + 68041, + -1, + 246219977, + 68068, + 246419134, + 245135394, + -1, + 246484663, + 246368637, + 68037, + 246550197, + 246415360, + -1, + 246615732, + 246497296, + 68055, + -1, + 246547657, + 68082, + -1, + 246580116, + 68064, + 246874111, + 246515835, + 68046, + -1, + 246744265, + 68073, + 247005183, + 246428214, + 68038, + 247008956, + 246874112, + -1, + 247074491, + 246956048, + 68056, + -1, + 247006409, + 68083, + -1, + 247038868, + 68065, + 247332863, + 246974587, + 68047, + -1, + 247203017, + 68074, + 247402191, + 246362918, + -1, + 247467719, + 247357541, + -1, + 247533253, + 247434464, + 68035, + 247660543, + 247463936, + -1, + 247664324, + 247545872, + 68053, + -1, + 247596233, + 68080, + -1, + 247628692, + 68062, + 247922687, + 247494627, + 68044, + -1, + 247792841, + 68071, + 248053759, + 247414877, + -1, + 248057549, + 247959149, + 68036, + 248184831, + 247988224, + -1, + 248188620, + 248070160, + 68054, + -1, + 248120521, + 68081, + -1, + 248152980, + 68063, + 248446975, + 248002452, + 68045, + -1, + 248317129, + 68072, + 248516309, + 247356866, + 68040, + 248581844, + 248446976, + -1, + 248647379, + 248528912, + 68058, + -1, + 248579273, + 68085, + -1, + 248611732, + 68067, + -1, + 248547454, + 68076, + 248909531, + 248458752, + 68039, + 248975066, + 248840192, + -1, + 249040601, + 248922128, + 68057, + -1, + 248972489, + 68084, + -1, + 249004948, + 68066, + -1, + 248944358, + 68075, + 249364479, + 248865540, + 68032, + 249430015, + 249233408, + -1, + 249433823, + 249315344, + 68050, + -1, + 249365705, + 68077, + -1, + 249398164, + 68059, + 249630465, + 245058807, + -1, + 249695998, + 249573784, + -1, + 249761510, + 249659726, + -1, + -61724, + 249716837, + 68022, + -61723, + 249768799, + 68021, + -1, + 249827089, + 68020, + 250023657, + 249722914, + -1, + -61720, + 249965407, + 68017, + -1, + 250023697, + 68015, + 250220268, + 249977687, + -1, + -61717, + 250162015, + 68010, + -1, + 250220305, + 68009, + 250416879, + 250170051, + -1, + -61714, + 250362581, + 68013, + -1, + 250416913, + 68018, + 250613489, + 250351377, + 68000, + -1, + 250573012, + 68016, + -61710, + 250582792, + 68004, + -61709, + 250712369, + 68005, + -61708, + 250769305, + 68011, + -61707, + 250834479, + 68019, + -61706, + 250898699, + 68007, + -61705, + 250962021, + 68003, + -61704, + 251024990, + 68008, + -61703, + 251088201, + 68012, + -61702, + 251150429, + 68002, + -61701, + 251215278, + 68014, + -61700, + 251276127, + 68001, + -61699, + 251340267, + 68023, + -1, + 251402291, + 68006, + 251658239, + 249651553, + -1, + -61696, + 251557544, + 68030, + -1, + 251610057, + 68031, + 251854847, + 249575142, + -1, + 251858694, + 251756878, + -1, + -61692, + 251827452, + 68087, + -61691, + 251871137, + 68088, + -1, + 251932445, + 68095, + 252120841, + 251820066, + -1, + -61688, + 252070302, + 68091, + -1, + 252129860, + 68092, + 252317452, + 252076808, + -1, + -61685, + 252282902, + 68086, + -1, + 252328797, + 68029, + 252514063, + 252261158, + -1, + -61682, + 252471143, + 68089, + -1, + 252528957, + 68090, + 252710674, + 252455775, + -1, + -61679, + 252662359, + 68028, + -1, + 252723833, + 68093, + -1, + 252665296, + 68094, + 253034495, + 244989392, + -1, + 253038391, + 252924329, + -1, + 253103899, + 253002062, + -1, + 253169432, + 253045599, + 67994, + -1, + 253102111, + 67995, + 253300506, + 253103889, + 67992, + -1, + 253233183, + 67993, + -1, + 253255781, + 67996, + 253497120, + 253057879, + -1, + 253562654, + 253438815, + 67980, + -1, + 253495327, + 67981, + 253755391, + 253497105, + 67978, + -1, + 253626399, + 67979, + 253824804, + 253458466, + -1, + 253890339, + 253759249, + 67987, + -1, + 253823007, + 67988, + -1, + 253832031, + 67989, + 254086950, + 253783961, + 67982, + -1, + 254019615, + 67983, + 254218025, + 254036675, + -1, + -61656, + 254163669, + 67985, + -1, + 254218001, + 67990, + 254414635, + 254154803, + 67974, + -1, + 254347295, + 67975, + -61652, + 254383880, + 67972, + -61651, + 254513457, + 67973, + -61650, + 254570031, + 67991, + -61649, + 254634251, + 67976, + -61648, + 254697573, + 67971, + -61647, + 254760542, + 67977, + -61646, + 254823753, + 67984, + -61645, + 254885981, + 67970, + -61644, + 254950830, + 67986, + -61643, + 255011679, + 67969, + -61642, + 255075819, + 67997, + -1, + 255135505, + 67968, + 255393791, + 253002042, + 67998, + -1, + 255264799, + 67999, + -1, + 244935414, + 129500, + 255528894, + 244852063, + -1, + 255594408, + 255470971, + -1, + 255659873, + 255555618, + -1, + 255725408, + 255612673, + -1, + 255790913, + 255679319, + 93819, + -61632, + 255760045, + 93815, + -1, + 255801257, + 983265, + 255987524, + 255725329, + 93805, + -61629, + 255952182, + 93796, + -1, + 256000093, + 93822, + 256184134, + 255956653, + 93823, + -1, + 256149655, + 93811, + 256315208, + 256139365, + 93821, + -1, + 256256863, + 93818, + 256446282, + 256264899, + 93804, + -1, + 256403665, + 93798, + 256577356, + 256391879, + 983264, + -1, + 256534737, + 93814, + -61619, + 256546936, + 93797, + -61618, + 256677362, + 93816, + -61617, + 256741657, + 93795, + -61616, + 256806453, + 93794, + -61615, + 256870551, + 93810, + -61614, + 256934222, + 93800, + -61613, + 256997410, + 93793, + -61612, + 257060684, + 93820, + -61611, + 257125933, + 93813, + -61610, + 257190097, + 93799, + -61609, + 257250836, + 93792, + -61608, + 257314039, + 93812, + -61607, + 257378805, + 93806, + -61606, + 257441885, + 93803, + -61605, + 257505193, + 93801, + -61604, + 257569574, + 93802, + -61603, + 257633119, + 93807, + -61602, + 257697119, + 93817, + -61601, + 257760567, + 93809, + -1, + 257824802, + 93808, + -1, + 255694862, + 93849, + 258084742, + 255597879, + -1, + 258150277, + 258020554, + -1, + 258215782, + 258104151, + 93787, + -61595, + 258184877, + 93783, + -1, + 258226089, + 983263, + 258412393, + 258150161, + 93773, + -61592, + 258377014, + 93764, + -1, + 258424925, + 93790, + 258609003, + 258381485, + 93791, + -1, + 258574487, + 93779, + 258740077, + 258564197, + 93789, + -1, + 258681695, + 93786, + 258871151, + 258689731, + 93772, + -1, + 258828497, + 93766, + 259002225, + 258816711, + 983262, + -1, + 258959569, + 93782, + -61582, + 258971768, + 93765, + -61581, + 259102194, + 93784, + -61580, + 259166489, + 93763, + -61579, + 259231285, + 93762, + -61578, + 259295383, + 93778, + -61577, + 259359054, + 93768, + -61576, + 259422242, + 93761, + -61575, + 259485516, + 93788, + -61574, + 259550765, + 93781, + -61573, + 259614929, + 93767, + -61572, + 259675668, + 93760, + -61571, + 259738871, + 93780, + -61570, + 259803637, + 93774, + -61569, + 259866717, + 93771, + -61568, + 259930025, + 93769, + -61567, + 259994406, + 93770, + -61566, + 260057951, + 93775, + -61565, + 260121951, + 93785, + -61564, + 260185399, + 93777, + -1, + 260249634, + 93776, + -1, + 258106007, + 93847, + 260509591, + 258025465, + -1, + 260575116, + 260473166, + -1, + 260640650, + 260543702, + 93826, + -1, + 260571138, + 93845, + 260833279, + 260587346, + 93827, + -1, + 260702210, + 93846, + 260902799, + 260536354, + -1, + -61554, + 260852093, + 93830, + -1, + 260911670, + 93831, + 261099409, + 260858628, + 93825, + -1, + 261029890, + 93844, + 261230484, + 261042982, + -1, + -61549, + 261187338, + 93828, + -1, + 261245151, + 93829, + -61547, + 261200135, + 93824, + -61546, + 261381570, + 93833, + -1, + 261434880, + 93832, + 261623718, + 260464628, + -1, + 261689244, + 261587278, + -1, + -61542, + 261657150, + 93836, + -61541, + 261701227, + 93837, + -1, + 261762798, + 93834, + 261951391, + 261650466, + -1, + -61538, + 261900732, + 93840, + -1, + 261960294, + 93841, + 262148002, + 261894950, + -1, + -61535, + 262104967, + 93838, + -1, + 262160876, + 93839, + 262344613, + 262089567, + -1, + -61532, + 262296145, + 93835, + -1, + 262357699, + 93842, + -1, + 262299122, + 93843, + -61529, + 261568415, + 93848, + -1, + 262550247, + 93850, + 262799359, + 255541341, + -1, + 262803389, + 262703856, + -1, + 262868911, + 262764578, + -1, + 262934446, + 262818176, + -1, + -61523, + 262897294, + 128950, + -1, + 262958110, + 128971, + -1, + 262869699, + 128938, + 263196596, + 262812454, + -1, + 263262131, + 263153462, + -1, + -61518, + 263220036, + 128967, + -1, + 263265038, + 128965, + -1, + 263211305, + 128944, + 263524279, + 263160789, + -1, + -61514, + 263482180, + 128963, + -1, + 263527182, + 128961, + 263720890, + 263466502, + -1, + -61511, + 263683726, + 128956, + -1, + 263744542, + 128974, + -61509, + 263689001, + 128911, + -61508, + 263862871, + 128931, + -1, + 263920586, + 128901, + -1, + 262746667, + 11852, + 264179680, + 255472003, + -1, + 264245199, + 264130985, + -1, + 264310723, + 264210279, + -1, + -61502, + 264256213, + 43749, + -1, + 264310545, + 43748, + 264507334, + 264271906, + -1, + -61499, + 264468638, + 43754, + -1, + 264518357, + 43753, + 264703945, + 264461143, + -1, + -61496, + 264673032, + 43747, + -1, + 264723376, + 43752, + 264900556, + 264644245, + -1, + -61493, + 264846037, + 43751, + -1, + 264900369, + 43750, + -61491, + 264855653, + 43745, + -61490, + 265038687, + 43744, + -1, + 265101144, + 43746, + 265293786, + 264212021, + -1, + 265359321, + 265250943, + -1, + 265424854, + 265293585, + -1, + 265490389, + 265359121, + -1, + -61484, + 265455767, + 43759, + -1, + 265502813, + 43757, + -1, + 265455767, + 43758, + -61481, + 265392218, + 43765, + -61480, + 265719343, + 43756, + -1, + 265765712, + 43755, + -1, + 265307988, + 43766, + 266014685, + 265228049, + -1, + -61476, + 265969214, + 43762, + -1, + 266026027, + 43761, + -61474, + 265983355, + 43764, + -61473, + 266174726, + 43763, + -1, + 266215346, + 43760, + -61471, + 264144707, + 128647, + -61470, + 266370762, + 983172, + -61469, + 266426902, + 128221, + -61468, + 266490979, + 127816, + -1, + 266540754, + 127830, + 266736052, + 228462353, + -1, + 266801243, + 266689367, + 128104, + 266866733, + 266748269, + -1, + 266932249, + 266817961, + -1, + 266997743, + 266893346, + -1, + 267063277, + 266931985, + -1, + -61460, + 267016323, + 68312, + -1, + 267069346, + 68317, + -61458, + 267025333, + 68323, + -1, + 267206189, + 68322, + 267390963, + 266961230, + -1, + -61455, + 267336598, + 68309, + -61454, + 267399567, + 68302, + -1, + 267458545, + 68324, + 267653111, + 267325201, + -1, + -61451, + 267622336, + 68313, + -61450, + 267669917, + 68288, + -1, + 267720725, + 68314, + 267915258, + 267622520, + -1, + -61447, + 267861122, + 68298, + -1, + 267917333, + 68297, + 268111869, + 267884018, + -1, + -61444, + 268068104, + 68319, + -1, + 268113073, + 68305, + 268308480, + 268070445, + -1, + -61441, + 268264712, + 68318, + -1, + 268320492, + 68320, + 268505091, + 268257987, + -1, + -61438, + 268450871, + 68306, + -1, + 268506289, + 68304, + 268701702, + 268454389, + -1, + -61435, + 268647554, + 68300, + -1, + 268703765, + 68299, + 268898312, + 268647563, + 68294, + -1, + 268862237, + 68301, + 269029387, + 268842921, + -1, + -61430, + 268977080, + 68291, + -1, + 269041191, + 68292, + 269225998, + 268969311, + -1, + -61427, + 269171606, + 68308, + -1, + 269226555, + 68293, + 269422609, + 269162530, + -1, + -61424, + 269368719, + 68290, + -1, + 269431183, + 68289, + -61422, + 269391961, + 68303, + -61421, + 269586916, + 68295, + -61420, + 269644387, + 68321, + -61419, + 269707852, + 68315, + -61418, + 269770809, + 68311, + -61417, + 269834382, + 68310, + -61416, + 269897178, + 68307, + -1, + 269956021, + 68316, + 270143522, + 266890652, + -1, + 270209054, + 270084173, + -1, + 270274589, + 270172494, + 68340, + -1, + 270206972, + 68339, + -1, + 270240155, + 68338, + -61409, + 270174274, + 68341, + -61408, + 270434162, + 68336, + -61407, + 270488459, + 68342, + -1, + 270546250, + 68337, + 270733353, + 270098420, + -1, + 270798886, + 270696782, + -1, + -61403, + 270766694, + 68334, + -1, + 270806766, + 68333, + 270995496, + 270754564, + 68331, + -1, + 270926382, + 68335, + -1, + 270939391, + 68332, + 271192108, + 270667676, + -1, + -61397, + 271128940, + 68326, + -1, + 271192007, + 68325, + -1, + 271154309, + 68296, + 271454286, + 266806808, + -1, + 271519818, + 271405481, + -1, + 271585347, + 271453969, + -1, + 271650867, + 271546402, + 2126, + -61390, + 271620216, + 2129, + -1, + 271661767, + 2132, + 271847477, + 271614286, + 2133, + -1, + 271810894, + 2120, + 271978551, + 271796931, + 2122, + -1, + 271939742, + 2121, + -61384, + 271947896, + 2118, + -61383, + 272068428, + 2131, + -61382, + 272133677, + 2130, + -61381, + 272197841, + 2128, + -61380, + 272259927, + 2125, + -61379, + 272324116, + 2124, + -61378, + 272387319, + 2123, + -61377, + 272450525, + 2136, + -61376, + 272513735, + 2116, + -61375, + 272578473, + 2114, + -61374, + 272639327, + 2115, + -1, + 272701474, + 2113, + 272896070, + 271532125, + -1, + -61371, + 272859470, + 2119, + -1, + 272915287, + 2127, + -61369, + 272862647, + 2117, + -61368, + 273042216, + 2135, + -61367, + 273103760, + 2112, + -1, + 273165112, + 2134, + -61365, + 271487121, + 2138, + -61364, + 273313168, + 2142, + -61363, + 273365193, + 2139, + -1, + 273420556, + 2137, + 273616983, + 271384576, + -1, + 273682514, + 273585047, + -1, + -61359, + 273647533, + 128115, + -1, + 273693286, + 128114, + 273879125, + 273630176, + -1, + -61356, + 273844239, + 129333, + -1, + 273882357, + 128372, + -61354, + 273819226, + 128378, + -1, + 274011043, + 128107, + -61352, + 273580745, + 128368, + -61351, + 274167919, + 128094, + -61350, + 274217485, + 129389, + -1, + 274274021, + 8380, + 274469054, + 266762549, + -1, + 274534553, + 274420137, + -1, + 274600036, + 274497870, + -1, + 274665569, + 274563406, + -1, + -61344, + 274610901, + 72983, + -1, + 274665233, + 72982, + -61342, + 274624409, + 73008, + -61341, + 274807509, + 72988, + -1, + 274861841, + 72987, + 275058793, + 274553687, + -1, + -61338, + 275027720, + 72981, + -61337, + 275078064, + 72986, + -61336, + 275134434, + 72976, + -1, + 275189521, + 72991, + 275386479, + 274998623, + -1, + 275452013, + 275326303, + -1, + -61332, + 275397333, + 72985, + -1, + 275451665, + 72984, + -61330, + 275397333, + 72990, + -1, + 275582737, + 72989, + 275779699, + 275320593, + 72960, + -61327, + 275744919, + 72971, + -61326, + 275791965, + 72968, + -1, + 275844881, + 72961, + 276041847, + 275740706, + -1, + -61323, + 276002974, + 73002, + -61322, + 276052693, + 73001, + -1, + 276107025, + 73003, + 276303995, + 275991235, + -1, + -61319, + 276266694, + 73006, + -61318, + 276314837, + 72973, + -1, + 276369169, + 72972, + 276566143, + 276253173, + -1, + -61315, + 276521043, + 73007, + -61314, + 276576981, + 72980, + -1, + 276631313, + 72979, + 276828289, + 276531351, + 72964, + -1, + 276793495, + 72965, + 276959364, + 276785361, + -1, + -61309, + 276904661, + 72993, + -1, + 276958993, + 72992, + 277155975, + 276909303, + -1, + -61306, + 277105993, + 73005, + -1, + 277155601, + 72999, + 277352585, + 277102685, + 72962, + -1, + 277299293, + 72963, + 277483660, + 277297065, + -1, + -61301, + 277428949, + 72975, + -1, + 277483281, + 72974, + 277680271, + 277421367, + -1, + -61298, + 277625557, + 72978, + -1, + 277679889, + 72977, + 277876882, + 277616674, + -1, + -61295, + 277822165, + 72995, + -1, + 277876497, + 72994, + -61293, + 277845768, + 72997, + -61292, + 278040135, + 73000, + -61291, + 278097817, + 72998, + -61290, + 278159461, + 72969, + -61289, + 278222430, + 72996, + -61288, + 278280917, + 73004, + -1, + 278342495, + 72966, + 278532263, + 274501173, + -1, + 278597798, + 278489215, + -1, + 278663327, + 278531857, + -1, + -61283, + 278628503, + 73023, + -61282, + 278675549, + 73020, + -1, + 278728465, + 73009, + 278925473, + 278628503, + 73012, + -1, + 278890647, + 73013, + 279056547, + 278872157, + 73010, + -1, + 279003229, + 73011, + -61276, + 279023751, + 73014, + -61275, + 279142501, + 73021, + -1, + 279194463, + 73018, + -1, + 278546260, + 73029, + 279449781, + 278472697, + -1, + 279515307, + 279413070, + -1, + -61270, + 279483606, + 73042, + -1, + 279527250, + 73043, + 279711918, + 279476258, + -1, + -61267, + 279660925, + 73046, + -1, + 279720502, + 73047, + 279908529, + 279655206, + -1, + -61264, + 279865098, + 73044, + -1, + 279922911, + 73045, + -61262, + 279877895, + 73040, + -61261, + 280060676, + 73041, + -61260, + 280124866, + 73049, + -1, + 280178176, + 73048, + 280367291, + 279411792, + -1, + -61257, + 280334426, + 73025, + -61256, + 280387566, + 73026, + -61255, + 280443733, + 73028, + -61254, + 280501690, + 73027, + -1, + 280564873, + 73024, + 280821759, + 280325964, + -1, + -61251, + 280703015, + 73030, + -1, + 280760142, + 73031, + 280957212, + 274427724, + -1, + 281022747, + 280895440, + -1, + 281088235, + 280983586, + -1, + 281153768, + 281053540, + -1, + 281219272, + 281117006, + -1, + 281284806, + 281180194, + -1, + -61243, + 281230037, + 72867, + -1, + 281284369, + 72866, + -61241, + 281230037, + 72859, + -1, + 281415441, + 72858, + 281612492, + 281172823, + -1, + -61238, + 281581320, + 72857, + -61237, + 281622498, + 72853, + -1, + 281677585, + 72861, + 281874639, + 281581688, + -1, + -61234, + 281819861, + 72870, + -1, + 281874193, + 72871, + 282071250, + 281835554, + -1, + -61231, + 282016469, + 72876, + -1, + 282070801, + 72877, + 282267861, + 282028241, + -1, + -61228, + 282213077, + 72863, + -1, + 282267409, + 72862, + 282464472, + 282217155, + -1, + -61225, + 282409685, + 72851, + -1, + 282464017, + 72850, + 282661083, + 282404191, + -1, + -61222, + 282630266, + 72868, + -1, + 282660625, + 72860, + 282857694, + 282598711, + -1, + -61219, + 282802901, + 72855, + -1, + 282857233, + 72854, + -61217, + 282826504, + 72873, + -61216, + 283021617, + 72869, + -61215, + 283078553, + 72874, + -61214, + 283137630, + 72865, + -61213, + 283200841, + 72875, + -61212, + 283265562, + 72856, + -61211, + 283327189, + 72878, + -61210, + 283391970, + 72852, + -61209, + 283449395, + 72864, + -1, + 283512593, + 72879, + 283770879, + 281101046, + -1, + -61206, + 283647438, + 72886, + -1, + 283710601, + 72885, + 283906323, + 281039273, + -1, + 283971826, + 283869518, + -1, + 284037360, + 283932706, + -1, + -61201, + 283982549, + 72835, + -1, + 284036881, + 72834, + -61199, + 283982549, + 72827, + -1, + 284167953, + 72826, + 284365046, + 283925335, + -1, + -61196, + 284333832, + 72825, + -61195, + 284375010, + 72821, + -1, + 284430097, + 72829, + 284627193, + 284334200, + -1, + -61192, + 284572373, + 72838, + -1, + 284626705, + 72839, + 284823804, + 284588066, + -1, + -61189, + 284768981, + 72844, + -1, + 284823313, + 72845, + 285020415, + 284780753, + -1, + -61186, + 284965589, + 72831, + -1, + 285019921, + 72830, + 285217026, + 284969667, + -1, + -61183, + 285162197, + 72819, + -1, + 285216529, + 72818, + 285413637, + 285156703, + -1, + -61180, + 285382778, + 72836, + -1, + 285413137, + 72828, + 285610248, + 285351223, + -1, + -61177, + 285555413, + 72823, + -1, + 285609745, + 72822, + -61175, + 285579016, + 72841, + -61174, + 285774129, + 72837, + -61173, + 285831065, + 72842, + -61172, + 285890142, + 72833, + -61171, + 285953353, + 72843, + -61170, + 286018074, + 72824, + -61169, + 286079701, + 72846, + -61168, + 286144482, + 72820, + -61167, + 286201907, + 72832, + -61166, + 286265105, + 72847, + -1, + 286328866, + 72840, + 286527769, + 283873528, + -1, + -61163, + 286492823, + 72882, + -61162, + 286548069, + 72884, + -61161, + 286605405, + 72881, + -61160, + 286665567, + 72883, + -1, + 286723943, + 72880, + -61158, + 286480216, + 72817, + -1, + 286866578, + 72816, + -1, + 280986694, + 129355, + 287117651, + 280902439, + -1, + 287183183, + 287067383, + -1, + 287248718, + 287125912, + -1, + 287314213, + 287211854, + -1, + 287379747, + 287277390, + -1, + -61150, + 287324885, + 69983, + -1, + 287379217, + 69982, + -61148, + 287324885, + 69988, + -1, + 287510289, + 69987, + 287707435, + 287253855, + -1, + 287772969, + 287647071, + -1, + -61144, + 287718101, + 69985, + -1, + 287772433, + 69984, + -61142, + 287718101, + 69990, + -1, + 287903505, + 69989, + 288100655, + 287660887, + -1, + -61139, + 288069384, + 69981, + -61138, + 288119728, + 69986, + -1, + 288165649, + 69991, + 288362802, + 288059212, + -1, + -61135, + 288321433, + 70002, + -1, + 288362257, + 69997, + 288559413, + 288319697, + -1, + -61132, + 288504533, + 69993, + -1, + 288558865, + 69992, + 288756024, + 288508611, + -1, + -61129, + 288701141, + 69974, + -1, + 288755473, + 69973, + 288952635, + 288705013, + -1, + -61126, + 288897749, + 69980, + -1, + 288952081, + 69979, + 289149246, + 288896937, + -1, + -61123, + 289094357, + 69976, + -1, + 289148689, + 69975, + 289345857, + 289086775, + -1, + -61120, + 289290965, + 69978, + -1, + 289345297, + 69977, + 289542468, + 289282082, + -1, + -61117, + 289487573, + 69995, + -1, + 289541905, + 69994, + -61115, + 289508935, + 69999, + -61114, + 289704087, + 69970, + -61113, + 289765534, + 70000, + -61112, + 289824869, + 69972, + -61111, + 289887838, + 69996, + -61110, + 289951049, + 69998, + -61109, + 290013277, + 69969, + -61108, + 290077397, + 70001, + -61107, + 290138975, + 69971, + -1, + 290197265, + 69968, + -1, + 287195722, + 70006, + 290459986, + 287143970, + -1, + -61103, + 290407185, + 70003, + -1, + 290466971, + 70005, + -1, + 290394031, + 70004, + 290722160, + 287066975, + -1, + 290787688, + 290673065, + -1, + 290853209, + 290741079, + -1, + -61097, + 290821896, + 73451, + -61096, + 290863074, + 73442, + -1, + 290918161, + 73448, + -61094, + 290821896, + 73452, + -61093, + 291081799, + 73455, + -61092, + 291144150, + 73446, + -61091, + 291207326, + 73456, + -61090, + 291270553, + 73453, + -61089, + 291334411, + 73443, + -61088, + 291395166, + 73445, + -61087, + 291458377, + 73454, + -61086, + 291523354, + 73440, + -61085, + 291588634, + 73450, + -61084, + 291649506, + 73441, + -61083, + 291710443, + 73447, + -61082, + 291773779, + 73449, + -61081, + 291838003, + 73444, + -1, + 291901201, + 73457, + 292098413, + 290754808, + -1, + -61078, + 292063383, + 73460, + -61077, + 292118629, + 73462, + -61076, + 292175965, + 73459, + -1, + 292236127, + 73461, + -61074, + 292055610, + 73463, + -61073, + 292368198, + 73464, + -1, + 292426749, + 73458, + 292622736, + 290672326, + -1, + 292688256, + 292566758, + -1, + 292753788, + 292643592, + -1, + 292819318, + 292716878, + -1, + -61067, + 292786781, + 3419, + -1, + 292827091, + 3420, + 293015929, + 292762406, + -1, + -61064, + 292971974, + 3417, + -1, + 293028339, + 3422, + -61062, + 292977892, + 3446, + -61061, + 293168007, + 3416, + -1, + 293219893, + 3447, + 293470207, + 292717494, + -1, + -61058, + 293373998, + 3421, + -61057, + 293436654, + 3448, + -1, + 293482044, + 3418, + 293671305, + 292639145, + -1, + 293736837, + 293609452, + -1, + -61053, + 293705389, + 3413, + -61052, + 293754388, + 3412, + -1, + 293819424, + 3414, + -61050, + 293701521, + 3386, + -61049, + 293953147, + 3369, + -61048, + 294004905, + 3406, + -1, + 294065430, + 3423, + 294322175, + 293633104, + -1, + 294326670, + 294198583, + -1, + -61044, + 294281829, + 3328, + -61043, + 294340535, + 3388, + -1, + 294392779, + 3329, + -61041, + 294293282, + 3387, + -1, + 294545840, + 3407, + 294719916, + 292591387, + -1, + 294785433, + 294682958, + -1, + 294850965, + 294752537, + -1, + -61036, + 294805605, + 119522, + -1, + 294858428, + 119532, + 295047576, + 294795975, + -1, + -61033, + 295006658, + 119523, + -1, + 295061466, + 119533, + -1, + 294989550, + 119530, + 295309726, + 294746146, + -1, + 295375260, + 295258493, + 119526, + -1, + 295338684, + 119536, + 295567359, + 295318070, + 119527, + -1, + 295469756, + 119537, + 295637412, + 295252774, + -1, + 295702945, + 295593738, + 119524, + -1, + 295666364, + 119534, + 295895039, + 295649373, + -1, + -61021, + 295800429, + 119525, + -1, + 295843726, + 119535, + 296030632, + 295578463, + -1, + 296096167, + 295977566, + 119528, + -1, + 296037722, + 119538, + -1, + 296047185, + 119531, + 296292778, + 295984578, + 119529, + -1, + 296256188, + 119539, + -61013, + 296261895, + 119520, + -1, + 296379140, + 119521, + 296554927, + 294683457, + -1, + -61010, + 296515069, + 10187, + -1, + 296563576, + 10189, + 296751538, + 296499113, + -1, + -61007, + 296705297, + 129522, + -1, + 296758111, + 129497, + -61005, + 296719961, + 128470, + -1, + 296905644, + 127809, + 297079408, + 266682461, + -1, + 297144929, + 297014433, + -1, + 297210411, + 297095593, + -1, + 297275849, + 297173326, + -1, + 297341376, + 297231234, + -1, + -60998, + 297274887, + 94105, + -60997, + 297340257, + 94104, + -60996, + 297405641, + 94103, + -60995, + 297471007, + 94102, + -60994, + 297536387, + 94101, + -60993, + 297601738, + 94100, + -1, + 297667058, + 94099, + 297865668, + 297302050, + -1, + -60990, + 297826462, + 93994, + -60989, + 297876181, + 93998, + -1, + 297930513, + 94007, + 298127815, + 297816727, + -1, + -60986, + 298096392, + 93980, + -1, + 298127121, + 93978, + -60984, + 298090966, + 93966, + -1, + 298258193, + 93962, + 298455510, + 297229143, + -1, + 298521037, + 298423981, + -1, + -60980, + 298466005, + 93997, + -1, + 298520337, + 93996, + 298717648, + 298474327, + -1, + -60977, + 298662613, + 93973, + -1, + 298716945, + 93972, + 298914259, + 298661801, + -1, + -60974, + 298859221, + 93988, + -1, + 298913553, + 93987, + 299110869, + 298848017, + 93968, + -1, + 299071693, + 94032, + -1, + 299055829, + 93969, + 299307490, + 298424440, + -1, + 299373021, + 299276408, + -1, + 299438555, + 299333666, + -1, + -60966, + 299407112, + 94017, + -1, + 299437841, + 94014, + -60964, + 299407112, + 94016, + -1, + 299568913, + 94013, + 299766240, + 299333666, + -1, + -60961, + 299711189, + 94006, + -1, + 299765521, + 94012, + -60959, + 299711189, + 94005, + -1, + 299896593, + 94011, + 300093933, + 299276205, + -1, + 300159465, + 300056910, + -1, + 300224999, + 300120098, + -1, + -60954, + 300169941, + 94000, + -1, + 300224273, + 94009, + -60952, + 300188118, + 93964, + -1, + 300355345, + 93965, + -60950, + 300116235, + 93954, + -60949, + 300506710, + 93970, + -60948, + 300567322, + 93984, + -1, + 300624730, + 94001, + 300814838, + 300052999, + -1, + 300880373, + 300770178, + -1, + -60944, + 300813831, + 94111, + -60943, + 300879049, + 94110, + -60942, + 300944415, + 94109, + -60941, + 301009795, + 94108, + -60940, + 301074930, + 94107, + -1, + 301140310, + 94106, + -1, + 300841703, + 94002, + 301404672, + 300754271, + -1, + 301470203, + 301373560, + -1, + -60935, + 301439098, + 93995, + -60934, + 301480661, + 93999, + -1, + 301534993, + 94008, + 301732350, + 301421207, + -1, + -60931, + 301700872, + 93981, + -1, + 301731601, + 93979, + -60929, + 301671915, + 93967, + -1, + 301862673, + 93963, + 302060040, + 301338385, + -1, + 302125575, + 302018755, + -1, + 302191109, + 302078807, + -1, + -60924, + 302135266, + 93989, + -1, + 302190353, + 93971, + -60922, + 302160196, + 94015, + -1, + 302339678, + 93958, + -1, + 302070471, + 94019, + 302584334, + 302009591, + -1, + 302649868, + 302529223, + -1, + -60917, + 302618376, + 93977, + -1, + 302649105, + 93976, + -60915, + 302618376, + 93975, + -1, + 302780177, + 93974, + 302977554, + 302544930, + -1, + -60912, + 302938270, + 94004, + -60911, + 302987989, + 94003, + -1, + 303042321, + 94010, + 303239703, + 302921641, + -1, + 303305238, + 303184583, + -1, + -60907, + 303250133, + 93993, + -1, + 303304465, + 93992, + -1, + 303238929, + 93983, + 303567386, + 303205941, + -1, + -60903, + 303510346, + 93961, + -1, + 303566609, + 93960, + 303763997, + 303525421, + -1, + -60900, + 303708130, + 93986, + -1, + 303763217, + 93985, + 303960608, + 303720657, + -1, + -60897, + 303910217, + 93955, + -1, + 303959825, + 93952, + 304157219, + 303912468, + -1, + -60894, + 304102101, + 93957, + -1, + 304156433, + 93956, + 304353830, + 304102087, + -1, + -60891, + 304298709, + 94020, + -1, + 304353041, + 93990, + -60889, + 304322085, + 93991, + -60888, + 304517425, + 94018, + -60887, + 304565018, + 93982, + -60886, + 304624458, + 93959, + -1, + 304683059, + 93953, + 304878167, + 297177336, + -1, + 304943669, + 304824413, + 94049, + 305009200, + 304877329, + 94050, + 305135615, + 304962391, + 94051, + -1, + 305018793, + 94052, + -60879, + 304973975, + 94056, + -60878, + 305160293, + 94053, + -60877, + 305225040, + 94057, + -60876, + 305283165, + 94055, + -1, + 305343327, + 94054, + 305533502, + 304877329, + 94036, + 305599032, + 305486679, + 94039, + -1, + 305543081, + 94040, + 305730106, + 305539935, + 94067, + -1, + 305671007, + 94068, + -60869, + 305694871, + 94075, + -60868, + 305807453, + 94073, + -60867, + 305872299, + 94038, + -1, + 305925905, + 94037, + 306123333, + 305498263, + 94058, + 306188866, + 306056977, + 94059, + 306315263, + 306142039, + 94060, + -1, + 306198441, + 94061, + -60861, + 306153623, + 94062, + -60860, + 306339152, + 94064, + -1, + 306392567, + 94063, + 306582091, + 306064223, + 94045, + 306647624, + 306540364, + 94071, + -1, + 306605900, + 94069, + 306778698, + 306600791, + 94046, + -1, + 306722729, + 94047, + -1, + 306724957, + 94074, + 306975311, + 306536549, + 94041, + -60851, + 306940055, + 94076, + -60850, + 306995301, + 94042, + -1, + 307049236, + 94048, + 307237457, + 306943661, + 94065, + -1, + 307183709, + 94066, + 307368531, + 307204377, + 94044, + -1, + 307322981, + 94043, + 307499605, + 307328872, + 94072, + -1, + 307457868, + 94070, + 307691519, + 307452759, + 94077, + -1, + 307574697, + 94078, + 307761756, + 304842114, + -1, + -60839, + 307725711, + 94096, + -60838, + 307786571, + 94095, + -60837, + 307829100, + 94098, + -1, + 307892167, + 94097, + 308150271, + 307723344, + -1, + 308154976, + 308048381, + -1, + -60833, + 308121763, + 94034, + -1, + 308156056, + 94035, + -1, + 308090520, + 94033, + 308417129, + 297083832, + -1, + 308482662, + 308371557, + -1, + -60828, + 308443500, + 128300, + -60827, + 308505364, + 127908, + -1, + 308549934, + 129440, + 308805631, + 308412416, + -1, + -60824, + 308699864, + 983235, + -1, + 308749942, + 983236, + 308941421, + 308370853, + -1, + -60821, + 308894221, + 128469, + -60820, + 308946987, + 128189, + -1, + 309009649, + 128656, + 309264383, + 308890871, + -1, + -60817, + 309152998, + 127756, + -1, + 309217436, + 127894, + 309400365, + 297033829, + -1, + 309465842, + 309339487, + -1, + 309531377, + 309411933, + -1, + 309596894, + 309460992, + -1, + 309662388, + 309547433, + -1, + 309727868, + 309628469, + -1, + 309793403, + 309682379, + -1, + 309858937, + 309751628, + 71174, + -1, + 309817164, + 71175, + 310050815, + 309808375, + 71176, + -1, + 309939447, + 71177, + -1, + 309726993, + 71210, + 310186626, + 309690702, + -1, + 310252160, + 310149454, + -1, + -60801, + 310196949, + 71193, + -1, + 310251281, + 71192, + -60799, + 310196949, + 71198, + -1, + 310382353, + 71197, + 310579847, + 310139735, + -1, + -60796, + 310548232, + 71191, + -60795, + 310598576, + 71196, + -60794, + 310654946, + 71186, + -1, + 310710033, + 71201, + 310907533, + 310519135, + -1, + 310973067, + 310846815, + -1, + -60790, + 310917845, + 71195, + -1, + 310972177, + 71194, + -60788, + 310917845, + 71200, + -1, + 311103249, + 71199, + 311300753, + 310841105, + 71168, + -60785, + 311265431, + 71181, + -60784, + 311312477, + 71179, + -1, + 311365393, + 71169, + 311562901, + 311261218, + -1, + -60781, + 311523486, + 71212, + -60780, + 311573205, + 71211, + -1, + 311627537, + 71213, + 311825047, + 311527575, + 71172, + -1, + 311789719, + 71173, + 311956122, + 311781585, + -1, + -60775, + 311900885, + 71203, + -1, + 311955217, + 71202, + 312152733, + 311905527, + -1, + -60772, + 312102217, + 71215, + -1, + 312151825, + 71209, + 312349344, + 312101571, + -1, + -60769, + 312294101, + 71183, + -1, + 312348433, + 71182, + 312545955, + 312297973, + -1, + -60766, + 312490709, + 71190, + -1, + 312545041, + 71189, + 312742565, + 312492125, + 71170, + -1, + 312688733, + 71171, + 312873640, + 312686505, + -1, + -60761, + 312818389, + 71185, + -1, + 312872721, + 71184, + 313070251, + 312810807, + -1, + -60758, + 313014997, + 71188, + -1, + 313069329, + 71187, + 313266862, + 313006114, + -1, + -60755, + 313211605, + 71205, + -1, + 313265937, + 71204, + -60753, + 313235208, + 71207, + -60752, + 313421721, + 71208, + -60751, + 313483365, + 71180, + -60750, + 313546334, + 71206, + -60749, + 313604821, + 71214, + -1, + 313666399, + 71178, + 313856708, + 309629176, + -1, + 313922234, + 313823358, + -1, + 313987768, + 313880396, + 71221, + -1, + 313945932, + 71222, + 314179583, + 313937143, + 71223, + -1, + 314068215, + 71224, + 314249918, + 313855761, + -1, + -60740, + 314214551, + 71228, + -60739, + 314261597, + 71226, + -1, + 314314513, + 71216, + 314512064, + 314214551, + 71219, + -1, + 314476695, + 71220, + 314643138, + 314458205, + 71217, + -1, + 314589277, + 71218, + -60733, + 314597477, + 71227, + -1, + 314714975, + 71225, + 314905301, + 313795935, + -1, + 314970835, + 314852073, + -1, + 315036361, + 314933582, + -1, + -60728, + 315004118, + 71250, + -1, + 315047762, + 71251, + 315232972, + 314996770, + -1, + -60725, + 315181437, + 71254, + -1, + 315241014, + 71255, + 315429583, + 315175718, + -1, + -60722, + 315385610, + 71252, + -1, + 315443423, + 71253, + -60720, + 315398407, + 71248, + -60719, + 315581188, + 71249, + -60718, + 315645378, + 71257, + -1, + 315698688, + 71256, + -60716, + 314926736, + 71234, + -1, + 315823035, + 71233, + 316019421, + 314866768, + -1, + 316084953, + 315985921, + -1, + -60712, + 316045634, + 71230, + -1, + 316108863, + 71231, + 316281564, + 316018449, + -1, + -60709, + 316240125, + 71232, + -1, + 316301373, + 71229, + -1, + 316227644, + 71236, + -1, + 315953071, + 71235, + 316669951, + 309539874, + -1, + 316674800, + 316559785, + -1, + 316740328, + 316636435, + -1, + 316805862, + 316689655, + -1, + 316871397, + 316736900, + -1, + -60700, + 316823933, + 43870, + -1, + 316884688, + 43869, + -1, + 316817958, + 43001, + -60697, + 316770521, + 43871, + -1, + 317078887, + 43868, + 317264621, + 316677431, + -1, + 317330156, + 317233260, + -1, + -60693, + 317292007, + 42653, + -1, + 317340761, + 42652, + -1, + 317265077, + 43000, + 317652991, + 317207309, + -1, + -60689, + 317543703, + 983993, + -1, + 317603312, + 983992, + -1, + 316611670, + 43867, + -1, + 309473517, + 129339, + 317920014, + 309418839, + -1, + 317985542, + 317864477, + -1, + 318051064, + 317948133, + 71273, + 318177279, + 317982084, + -1, + -60681, + 318072212, + 71274, + -1, + 318122348, + 71275, + 318313212, + 318011184, + 71265, + 318439423, + 318244228, + -1, + -60677, + 318334356, + 71269, + -1, + 318384492, + 71270, + 318575359, + 318275918, + -1, + -60674, + 318541113, + 71276, + -1, + 318600636, + 71267, + 318771969, + 318523052, + 71271, + -1, + 318703163, + 71272, + 318903044, + 318708342, + -1, + -60669, + 318858644, + 71264, + -1, + 318908780, + 71268, + -60667, + 318853553, + 6264, + -1, + 319039714, + 71266, + 319230731, + 317928212, + -1, + 319296266, + 319160320, + -1, + -60663, + 319263840, + 128184, + -1, + 319297674, + 128176, + -1, + 319228014, + 129297, + 319558413, + 319179760, + 128018, + -1, + 319488462, + 128053, + -1, + 319513938, + 128669, + 319755032, + 317884567, + -1, + 319820565, + 319709082, + -1, + 319886100, + 319754624, + -1, + -60654, + 319844320, + 128670, + -60653, + 319888747, + 128672, + -1, + 319953432, + 128693, + -1, + 319816210, + 128507, + 320213783, + 319781243, + 128001, + -1, + 320143822, + 128045, + -1, + 320176925, + 128068, + 320410399, + 319717710, + -1, + 320475934, + 320365879, + -1, + 320541469, + 320405504, + -1, + -60644, + 320502116, + 128757, + -1, + 320543657, + 128741, + -1, + 320508426, + 128739, + -1, + 320421228, + 129334, + 320869156, + 320364645, + -1, + 320934691, + 320822105, + -1, + -60638, + 320901148, + 127889, + -1, + 320937340, + 129390, + -1, + 320873828, + 128496, + 321196840, + 320805439, + 128241, + 321323007, + 321126400, + -1, + -60633, + 321229826, + 128242, + -1, + 321282384, + 128244, + 321458987, + 321158814, + -1, + -60630, + 321407187, + 129439, + -1, + 321465183, + 128332, + -60628, + 321427219, + 128511, + -1, + 321622033, + 127909, + 321786748, + 309364887, + -1, + 321852260, + 321738161, + -1, + 321917795, + 321786933, + -1, + 321983330, + 321868201, + -1, + 322048824, + 321922399, + -1, + 322114358, + 321987935, + -1, + -60620, + 322058965, + 70292, + -60619, + 322119147, + 70291, + -1, + 322178833, + 70290, + -60617, + 322058965, + 70297, + -1, + 322309905, + 70296, + 322507582, + 322011470, + -1, + 322573116, + 322470222, + -1, + -60613, + 322517717, + 70289, + -1, + 322572049, + 70288, + -60611, + 322517717, + 70295, + -1, + 322703121, + 70294, + 322900802, + 322465612, + -1, + -60608, + 322858905, + 70311, + -60607, + 322910933, + 70312, + -1, + 322965265, + 70306, + 323162950, + 322853719, + -1, + -60604, + 323131144, + 70287, + -60603, + 323181488, + 70293, + -1, + 323227409, + 70298, + 323425097, + 323119313, + -1, + -60600, + 323369685, + 70300, + -1, + 323424017, + 70299, + 323621708, + 323373763, + -1, + -60597, + 323566293, + 70277, + -1, + 323620625, + 70276, + 323818319, + 323570165, + -1, + -60594, + 323766810, + 70285, + -1, + 323817233, + 70284, + 324014930, + 323762089, + -1, + -60591, + 323959509, + 70280, + -1, + 324013841, + 70278, + 324211541, + 323951927, + -1, + -60588, + 324156117, + 70283, + -1, + 324210449, + 70282, + 324408152, + 324147234, + -1, + -60585, + 324352725, + 70303, + -1, + 324407057, + 70301, + -60583, + 324376328, + 70305, + -60582, + 324570695, + 70308, + -60581, + 324634775, + 70274, + -60580, + 324696222, + 70309, + -60579, + 324752990, + 70304, + -60578, + 324816201, + 70307, + -60577, + 324878429, + 70273, + -60576, + 324942549, + 70310, + -60575, + 325004127, + 70275, + -1, + 325062417, + 70272, + -1, + 321943954, + 70313, + -1, + 321865479, + 127926, + 325451775, + 321812514, + -1, + 325456763, + 325337424, + -1, + 325522296, + 325416994, + -1, + 325587831, + 325490726, + -1, + 325653357, + 325528415, + -1, + 325718892, + 325599947, + -1, + -60565, + 325684106, + 119271, + -1, + 325724630, + 119270, + -1, + 325672002, + 119263, + 325981040, + 325611232, + -1, + -60561, + 325946250, + 119269, + -1, + 325986774, + 119268, + 326177651, + 325923622, + -1, + -60558, + 326127247, + 119272, + -1, + 326190096, + 119264, + -60556, + 326144822, + 119266, + -60555, + 326332770, + 119265, + -60554, + 326384518, + 119267, + -1, + 326442300, + 119262, + -1, + 325526393, + 127932, + 326701946, + 325471220, + 127929, + -1, + 326633207, + 127896, + -1, + 326655764, + 127925, + -1, + 325402579, + 127812, + 326964149, + 321746632, + -1, + 327029668, + 326914473, + -1, + 327095170, + 326992206, + -1, + -60544, + 327040142, + 92757, + -60543, + 327102039, + 92766, + -1, + 327159569, + 92736, + 327357317, + 327049317, + 92754, + -60540, + 327311461, + 92753, + -1, + 327372023, + 92749, + 327553929, + 327305923, + -1, + -60537, + 327508069, + 92761, + -60536, + 327564033, + 92744, + -1, + 327625714, + 92748, + 327816076, + 327511884, + -1, + -60533, + 327770213, + 92755, + -1, + 327827549, + 92765, + 328012687, + 327772369, + -1, + -60530, + 327957938, + 92743, + -1, + 328011537, + 92752, + 328209298, + 327965527, + -1, + -60527, + 328156125, + 92751, + -1, + 328219012, + 92737, + 328405909, + 328160788, + -1, + -60524, + 328352674, + 92739, + -1, + 328405149, + 92750, + 328602519, + 328355145, + 92763, + -1, + 328555351, + 92762, + 328733594, + 328547029, + -1, + -60519, + 328687717, + 92745, + -1, + 328745053, + 92764, + 328930204, + 328674143, + 92760, + -1, + 328863505, + 92758, + 329061278, + 328869355, + 92741, + -1, + 329007197, + 92746, + -60513, + 329029718, + 92738, + -60512, + 329158961, + 92759, + -60511, + 329218980, + 92756, + -60510, + 329261093, + 92747, + -60509, + 329324595, + 92740, + -1, + 329387793, + 92742, + 329646079, + 326968671, + -1, + 329651123, + 329532137, + -1, + 329716649, + 329613646, + -1, + -60504, + 329684182, + 92770, + -1, + 329727826, + 92771, + 329913260, + 329676834, + -1, + -60501, + 329861501, + 92774, + -1, + 329921078, + 92775, + 330109871, + 329855782, + -1, + -60498, + 330065674, + 92772, + -1, + 330123487, + 92773, + -60496, + 330078471, + 92768, + -60495, + 330261252, + 92769, + -60494, + 330325442, + 92777, + -1, + 330378752, + 92776, + -60492, + 329606800, + 92783, + -1, + 330503099, + 92782, + 330699754, + 326932264, + -1, + 330765270, + 330650025, + -1, + 330830796, + 330727947, + -1, + 330896318, + 330769759, + -1, + 330961852, + 330835295, + -1, + -60485, + 330906325, + 43502, + -1, + 330960657, + 43501, + -60483, + 330906325, + 43516, + -1, + 331091729, + 43515, + 331289537, + 330849111, + -1, + -60480, + 331257608, + 43495, + -1, + 331307952, + 43503, + 331486148, + 331237877, + -1, + -60477, + 331430613, + 43500, + -1, + 331484945, + 43499, + 331682759, + 331429801, + -1, + -60474, + 331627221, + 43498, + -1, + 331681553, + 43497, + 331879370, + 331618338, + -1, + -60471, + 331823829, + 43518, + -1, + 331878161, + 43517, + -60469, + 331830243, + 43514, + -1, + 332018506, + 43496, + 332267519, + 330791560, + -1, + 332272595, + 332141361, + -1, + -60465, + 332226134, + 43491, + -60464, + 332286569, + 43490, + -60463, + 332347689, + 43488, + -60462, + 332406616, + 43489, + -1, + 332470779, + 43492, + 332726271, + 332239410, + -1, + -60459, + 332626663, + 43647, + -1, + 332668760, + 43646, + 332862436, + 330727958, + -1, + 332927962, + 332824910, + -1, + -60455, + 332895446, + 43506, + -1, + 332939090, + 43507, + 333124573, + 332888098, + -1, + -60452, + 333072765, + 43510, + -1, + 333132342, + 43511, + 333321184, + 333067046, + -1, + -60449, + 333276938, + 43508, + -1, + 333334751, + 43509, + -60447, + 333289735, + 43504, + -60446, + 333472516, + 43505, + -60445, + 333536706, + 43513, + -1, + 333590016, + 43512, + 333779945, + 332823632, + -1, + 333845480, + 333742631, + -1, + -60441, + 333777951, + 43645, + -1, + 333842930, + 43644, + -1, + 333806349, + 43493, + -1, + 333732418, + 43494, + -60437, + 330666265, + 983173, + -60436, + 334139658, + 983216, + -1, + 334191359, + 983228, + 334371174, + 228396817, + -1, + 334435971, + 334322519, + -1, + 334501493, + 334370650, + -1, + 334566511, + 334432598, + -1, + 334631943, + 334497990, + -1, + 334697462, + 334564705, + 83070, + -60428, + 334634295, + 83073, + -60427, + 334698530, + 83072, + -1, + 334761745, + 83071, + 334959610, + 334629763, + 83062, + -60424, + 334896439, + 83065, + -60423, + 334960674, + 83064, + -1, + 335023889, + 83063, + 335221757, + 334892063, + 83066, + -60420, + 335157282, + 83068, + -1, + 335220497, + 83067, + 335418367, + 335153650, + 83059, + -1, + 335351569, + 83060, + 335549441, + 335350102, + 83057, + -1, + 335482641, + 83058, + 335680515, + 335481030, + 83055, + -1, + 335613713, + 83056, + -60412, + 335613574, + 83075, + -60411, + 335744519, + 83074, + -60410, + 335809737, + 83069, + -1, + 335874762, + 83061, + 336073749, + 334563670, + -1, + 336139275, + 336005318, + 83076, + -60406, + 336074786, + 83078, + -1, + 336138001, + 83077, + 336335885, + 336071711, + 83083, + -1, + 336269073, + 83084, + -60402, + 336268934, + 83088, + -60401, + 336399879, + 83087, + -60400, + 336465249, + 83086, + -60399, + 336530633, + 83085, + -60398, + 336595843, + 83082, + -60397, + 336661194, + 83081, + -60396, + 336726514, + 83080, + -1, + 336791894, + 83079, + 336991265, + 336005834, + -1, + 337056792, + 336923679, + 83105, + -1, + 336989969, + 83106, + -60391, + 336989830, + 83110, + -60390, + 337120775, + 83109, + -60389, + 337186145, + 83108, + -60388, + 337251529, + 83107, + -60387, + 337316739, + 83104, + -60386, + 337382090, + 83103, + -60385, + 337447410, + 83102, + -60384, + 337512790, + 83101, + -1, + 337578182, + 83100, + 337777709, + 336923122, + -1, + 337843236, + 337710111, + 83094, + -1, + 337776401, + 83095, + -60379, + 337776262, + 83099, + -60378, + 337907207, + 83098, + -60377, + 337972577, + 83097, + -60376, + 338037961, + 83096, + -60375, + 338103171, + 83093, + -60374, + 338168522, + 83092, + -60373, + 338233842, + 83091, + -60372, + 338299222, + 83090, + -1, + 338364614, + 83089, + 338564152, + 337710726, + -1, + -60369, + 338497158, + 83170, + -60368, + 338562567, + 83169, + -60367, + 338627937, + 83168, + -60366, + 338693321, + 83167, + -60365, + 338758687, + 83166, + -60364, + 338824067, + 83165, + -60363, + 338889418, + 83164, + -60362, + 338954738, + 83163, + -60361, + 339020118, + 83162, + -1, + 339085510, + 83161, + 339285059, + 338497031, + -1, + -60358, + 339218054, + 83160, + -60357, + 339283463, + 83159, + -60356, + 339348833, + 83158, + -60355, + 339414217, + 83157, + -60354, + 339479583, + 83156, + -60353, + 339544963, + 83155, + -60352, + 339610314, + 83154, + -60351, + 339675634, + 83153, + -60350, + 339741014, + 83152, + -1, + 339806406, + 83151, + 340005966, + 339217761, + -1, + -60347, + 339938950, + 83150, + -60346, + 340004359, + 83149, + -60345, + 340069729, + 83148, + -60344, + 340135113, + 83147, + -60343, + 340200479, + 83146, + -60342, + 340265859, + 83145, + -60341, + 340331210, + 83144, + -60340, + 340396530, + 83143, + -60339, + 340461910, + 83142, + -1, + 340527302, + 83141, + 340726873, + 339938505, + -1, + -60336, + 340659846, + 83140, + -60335, + 340725255, + 83139, + -60334, + 340790625, + 83138, + -60333, + 340856009, + 83137, + -60332, + 340921375, + 83136, + -60331, + 340986755, + 83135, + -60330, + 341052106, + 83134, + -60329, + 341117426, + 83133, + -60328, + 341182806, + 83132, + -1, + 341248198, + 83131, + 341447780, + 340659231, + -1, + -60325, + 341380742, + 83130, + -60324, + 341446151, + 83129, + -60323, + 341511521, + 83128, + -60322, + 341576905, + 83127, + -60321, + 341642271, + 83126, + -60320, + 341707651, + 83125, + -60319, + 341773002, + 83124, + -60318, + 341838322, + 83123, + -60317, + 341903702, + 83122, + -1, + 341969094, + 83121, + 342228991, + 341379971, + -1, + -60314, + 342101638, + 83120, + -60313, + 342167047, + 83119, + -60312, + 342232417, + 83118, + -60311, + 342297801, + 83117, + -60310, + 342363167, + 83116, + -60309, + 342428547, + 83115, + -60308, + 342493898, + 83114, + -60307, + 342559218, + 83113, + -60306, + 342624598, + 83112, + -1, + 342689990, + 83111, + 342889710, + 334498506, + -1, + 342955137, + 342821578, + -1, + 343020661, + 342887625, + 83322, + -60301, + 342957367, + 83325, + -60300, + 343021602, + 83324, + -1, + 343084817, + 83323, + 343282809, + 342952434, + -1, + -60297, + 343219511, + 83318, + -60296, + 343283746, + 83317, + -1, + 343346961, + 83316, + -60294, + 343215750, + 83328, + -60293, + 343477767, + 83327, + -60292, + 343543137, + 83326, + -60291, + 343608351, + 83321, + -60290, + 343673731, + 83320, + -60289, + 343739082, + 83319, + -60288, + 343804246, + 83315, + -1, + 343869638, + 83314, + 344069264, + 342887943, + -1, + 344134788, + 344001737, + 83381, + -1, + 344067857, + 83382, + 344265863, + 344066762, + -1, + -60282, + 344198929, + 83378, + -1, + 344261672, + 83377, + 344462473, + 344197462, + 83374, + -1, + 344395537, + 83375, + -60278, + 344395398, + 83385, + -60277, + 344526343, + 83384, + -60276, + 344591713, + 83383, + -60275, + 344656927, + 83380, + -60274, + 344722307, + 83379, + -60273, + 344787442, + 83376, + -1, + 344852678, + 83373, + 345052317, + 344001737, + -1, + 345117843, + 344985095, + 83359, + -1, + 345050897, + 83360, + 345248917, + 345049987, + 83354, + -1, + 345181969, + 83355, + -60266, + 345181830, + 83361, + -60265, + 345312609, + 83358, + -60264, + 345377993, + 83357, + -60263, + 345443359, + 83356, + -60262, + 345508554, + 83353, + -60261, + 345573874, + 83352, + -60260, + 345639254, + 83351, + -1, + 345704646, + 83350, + 345904297, + 344984929, + -1, + 345969824, + 345835862, + 83363, + -1, + 345902865, + 83364, + -60255, + 345902726, + 83372, + -60254, + 346033671, + 83371, + -60253, + 346099041, + 83370, + -60252, + 346164425, + 83369, + -60251, + 346229791, + 83368, + -60250, + 346295171, + 83367, + -60249, + 346360522, + 83366, + -60248, + 346425842, + 83365, + -1, + 346491078, + 83362, + 346690741, + 345836575, + -1, + 346756268, + 346623622, + 83348, + -1, + 346689297, + 83349, + -60243, + 346689031, + 83347, + -60242, + 346819937, + 83346, + -60241, + 346885321, + 83345, + -60240, + 346950687, + 83344, + -60239, + 347016067, + 83343, + -60238, + 347081418, + 83342, + -60237, + 347146738, + 83341, + -60236, + 347212118, + 83340, + -1, + 347277510, + 83339, + 347477185, + 346622450, + -1, + 347542712, + 347410054, + 83312, + -1, + 347475729, + 83313, + -60231, + 347475463, + 83311, + -60230, + 347606369, + 83310, + -60229, + 347671753, + 83309, + -60228, + 347737119, + 83308, + -60227, + 347802499, + 83307, + -60226, + 347867850, + 83306, + -60225, + 347933170, + 83305, + -60224, + 347998550, + 83304, + -1, + 348063942, + 83303, + 348263629, + 347408582, + -1, + 348329156, + 348196486, + 83291, + -1, + 348262161, + 83292, + -60219, + 348261895, + 83290, + -60218, + 348392801, + 83289, + -60217, + 348458185, + 83288, + -60216, + 348523551, + 83287, + -60215, + 348588931, + 83286, + -60214, + 348654282, + 83285, + -60213, + 348719602, + 83284, + -60212, + 348784982, + 83283, + -1, + 348850374, + 83282, + 349050072, + 348196486, + -1, + -60209, + 348982918, + 83395, + -60208, + 349048327, + 83394, + -60207, + 349113697, + 83393, + -60206, + 349179081, + 83392, + -60205, + 349244447, + 83391, + -60204, + 349309827, + 83390, + -60203, + 349375195, + 83389, + -60202, + 349440498, + 83388, + -60201, + 349505878, + 83387, + -1, + 349571270, + 83386, + 349770979, + 348982147, + -1, + -60198, + 349703814, + 83338, + -60197, + 349769223, + 83337, + -60196, + 349834593, + 83336, + -60195, + 349899977, + 83335, + -60194, + 349965343, + 83334, + -60193, + 350030723, + 83333, + -60192, + 350096074, + 83332, + -60191, + 350161394, + 83331, + -60190, + 350226774, + 83330, + -1, + 350292166, + 83329, + 350552063, + 349702486, + -1, + -60187, + 350424710, + 83302, + -60186, + 350490119, + 83301, + -60185, + 350555489, + 83300, + -60184, + 350620873, + 83299, + -60183, + 350686239, + 83298, + -60182, + 350751619, + 83297, + -60181, + 350816970, + 83296, + -60180, + 350882290, + 83295, + -60179, + 350947670, + 83294, + -1, + 351013062, + 83293, + 351212904, + 342821362, + -1, + 351278334, + 351144134, + -1, + 351343859, + 351209970, + 83173, + -60174, + 351279138, + 83175, + -1, + 351342353, + 83174, + 351540469, + 351276678, + 83183, + -1, + 351473425, + 83184, + 351671543, + 351472993, + 83180, + -1, + 351604497, + 83181, + -60168, + 351604231, + 83182, + -60167, + 351734985, + 83179, + -60166, + 351800351, + 83178, + -60165, + 351865731, + 83177, + -60164, + 351931082, + 83176, + -60163, + 351996246, + 83172, + -1, + 352061638, + 83171, + 352261387, + 351211142, + -1, + 352326913, + 352194182, + 83280, + -1, + 352259857, + 83281, + 352457987, + 352258947, + 83274, + -1, + 352390929, + 83275, + -60156, + 352390663, + 83279, + -60155, + 352521569, + 83278, + -60154, + 352586953, + 83277, + -60153, + 352652319, + 83276, + -60152, + 352717514, + 83273, + -60151, + 352782834, + 83272, + -60150, + 352848214, + 83271, + -1, + 352913606, + 83270, + 353113368, + 352192854, + -1, + 353178894, + 353045705, + 83192, + -1, + 353111825, + 83193, + 353309968, + 353111071, + 83190, + -1, + 353242897, + 83191, + -60143, + 353242758, + 83196, + -60142, + 353373703, + 83195, + -60141, + 353439073, + 83194, + -60140, + 353504131, + 83189, + -60139, + 353569482, + 83188, + -60138, + 353634802, + 83187, + -60137, + 353700182, + 83186, + -1, + 353765574, + 83185, + 353965348, + 353046023, + -1, + 354030875, + 353898118, + 83268, + -1, + 353963793, + 83269, + -60132, + 353963527, + 83267, + -60131, + 354094433, + 83266, + -60130, + 354159817, + 83265, + -60129, + 354225183, + 83264, + -60128, + 354290563, + 83263, + -60127, + 354355914, + 83262, + -60126, + 354421234, + 83261, + -60125, + 354486614, + 83260, + -1, + 354552006, + 83259, + 354751792, + 353897673, + -1, + 354817319, + 354684257, + 83245, + -1, + 354750225, + 83246, + -60120, + 354750086, + 83248, + -60119, + 354881031, + 83247, + -60118, + 354946249, + 83244, + -60117, + 355011615, + 83243, + -60116, + 355076995, + 83242, + -60115, + 355142346, + 83241, + -60114, + 355207666, + 83240, + -60113, + 355273046, + 83239, + -1, + 355338438, + 83238, + 355538236, + 354683378, + -1, + 355603763, + 355470689, + 83204, + -1, + 355536657, + 83205, + -60108, + 355536518, + 83207, + -60107, + 355667463, + 83206, + -60106, + 355732681, + 83203, + -60105, + 355798047, + 83202, + -60104, + 355863427, + 83201, + -60103, + 355928778, + 83200, + -60102, + 355994098, + 83199, + -60101, + 356059478, + 83198, + -1, + 356124870, + 83197, + 356324679, + 355470689, + -1, + -60098, + 356257414, + 83258, + -60097, + 356322823, + 83257, + -60096, + 356388193, + 83256, + -60095, + 356453577, + 83255, + -60094, + 356518943, + 83254, + -60093, + 356584323, + 83253, + -60092, + 356649674, + 83252, + -60091, + 356714994, + 83251, + -60090, + 356780374, + 83250, + -1, + 356845766, + 83249, + 357045586, + 356256799, + -1, + -60087, + 356978310, + 83237, + -60086, + 357043719, + 83236, + -60085, + 357109089, + 83235, + -60084, + 357174473, + 83234, + -60083, + 357239839, + 83233, + -60082, + 357305219, + 83232, + -60081, + 357370570, + 83231, + -60080, + 357435890, + 83230, + -60079, + 357501270, + 83229, + -1, + 357566662, + 83228, + 357766493, + 356977539, + -1, + -60076, + 357699206, + 83227, + -60075, + 357764615, + 83226, + -60074, + 357829985, + 83225, + -60073, + 357895369, + 83224, + -60072, + 357960735, + 83223, + -60071, + 358026115, + 83222, + -60070, + 358091466, + 83221, + -60069, + 358156786, + 83220, + -60068, + 358222166, + 83219, + -1, + 358287558, + 83218, + 358547455, + 357698250, + -1, + -60065, + 358420102, + 83217, + -60064, + 358485511, + 83216, + -60063, + 358550881, + 83215, + -60062, + 358616265, + 83214, + -60061, + 358681631, + 83213, + -60060, + 358747011, + 83212, + -60059, + 358812362, + 83211, + -60058, + 358877682, + 83210, + -60057, + 358943062, + 83209, + -1, + 359008454, + 83208, + 359208418, + 351144134, + -1, + 359273848, + 359140227, + -1, + 359339373, + 359206089, + 82994, + -60052, + 359274530, + 82996, + -1, + 359337745, + 82995, + 359535983, + 359271455, + 82992, + -1, + 359468817, + 82993, + 359667057, + 359467350, + 82987, + -1, + 359599889, + 82988, + -60046, + 359599750, + 82999, + -60045, + 359730695, + 82998, + -60044, + 359796065, + 82997, + -60043, + 359861123, + 82991, + -60042, + 359926474, + 82990, + -60041, + 359991794, + 82989, + -1, + 360057030, + 82986, + 360256902, + 359206089, + -1, + 360322429, + 360189129, + 83016, + -60037, + 360258871, + 83019, + -60036, + 360323106, + 83018, + -1, + 360386321, + 83017, + -60034, + 360255110, + 83022, + -60033, + 360517127, + 83021, + -60032, + 360582497, + 83020, + -60031, + 360647711, + 83015, + -60030, + 360713091, + 83014, + -60029, + 360778442, + 83013, + -60028, + 360843762, + 83012, + -60027, + 360909142, + 83011, + -1, + 360974534, + 83010, + 361174419, + 360189574, + -1, + 361239945, + 361106951, + 83052, + -1, + 361172753, + 83053, + 361371019, + 361172321, + 83050, + -1, + 361303825, + 83051, + -60020, + 361303686, + 83054, + -60019, + 361434313, + 83049, + -60018, + 361499679, + 83048, + -60017, + 361565059, + 83047, + -60016, + 361630410, + 83046, + -60015, + 361695730, + 83045, + -60014, + 361761110, + 83044, + -1, + 361826502, + 83043, + 362026399, + 361106122, + -1, + 362091926, + 361959046, + 82984, + -1, + 362024721, + 82985, + -60009, + 362024455, + 82983, + -60008, + 362155361, + 82982, + -60007, + 362220745, + 82981, + -60006, + 362286111, + 82980, + -60005, + 362351491, + 82979, + -60004, + 362416842, + 82978, + -60003, + 362482162, + 82977, + -60002, + 362547542, + 82976, + -1, + 362612934, + 82975, + 362812843, + 361957874, + -1, + 362878370, + 362745033, + 82970, + -1, + 362811153, + 82971, + -59997, + 362811014, + 82974, + -59996, + 362941959, + 82973, + -59995, + 363007329, + 82972, + -59994, + 363072543, + 82969, + -59993, + 363137923, + 82968, + -59992, + 363203274, + 82967, + -59991, + 363268594, + 82966, + -59990, + 363333974, + 82965, + -1, + 363399366, + 82964, + 363599287, + 362744150, + -1, + 363664814, + 363530438, + 82953, + -1, + 363597585, + 82954, + -59985, + 363597446, + 82963, + -59984, + 363728391, + 82962, + -59983, + 363793761, + 82961, + -59982, + 363859145, + 82960, + -59981, + 363924511, + 82959, + -59980, + 363989891, + 82958, + -59979, + 364055242, + 82957, + -59978, + 364120562, + 82956, + -1, + 364185942, + 82955, + 364385730, + 363531783, + -1, + -59975, + 364318342, + 83042, + -59974, + 364383751, + 83041, + -59973, + 364449121, + 83040, + -59972, + 364514505, + 83039, + -59971, + 364579871, + 83038, + -59970, + 364645251, + 83037, + -59969, + 364710602, + 83036, + -59968, + 364775922, + 83035, + -59967, + 364841302, + 83034, + -1, + 364906694, + 83033, + 365106637, + 364318049, + -1, + -59964, + 365039238, + 83032, + -59963, + 365104647, + 83031, + -59962, + 365170017, + 83030, + -59961, + 365235401, + 83029, + -59960, + 365300767, + 83028, + -59959, + 365366147, + 83027, + -59958, + 365431498, + 83026, + -59957, + 365496818, + 83025, + -59956, + 365562198, + 83024, + -1, + 365627590, + 83023, + 365827544, + 365038623, + -1, + -59953, + 365760134, + 83009, + -59952, + 365825543, + 83008, + -59951, + 365890913, + 83007, + -59950, + 365956297, + 83006, + -59949, + 366021663, + 83005, + -59948, + 366087043, + 83004, + -59947, + 366152394, + 83003, + -59946, + 366217714, + 83002, + -59945, + 366283094, + 83001, + -1, + 366348486, + 83000, + 366608383, + 365758662, + -1, + -59942, + 366481030, + 82952, + -59941, + 366546439, + 82951, + -59940, + 366611809, + 82950, + -59939, + 366677193, + 82949, + -59938, + 366742559, + 82948, + -59937, + 366807939, + 82947, + -59936, + 366873290, + 82946, + -59935, + 366938610, + 82945, + -1, + 367003990, + 82944, + 367203923, + 359140227, + -1, + 367269360, + 367135775, + -1, + 367334886, + 367201633, + 83455, + -1, + 367267601, + 83456, + 367465960, + 367265990, + 83447, + -1, + 367398673, + 83448, + -59927, + 367398534, + 83458, + -59926, + 367529479, + 83457, + -59925, + 367594697, + 83454, + -59924, + 367660063, + 83453, + -59923, + 367725443, + 83452, + -59922, + 367790794, + 83451, + -59921, + 367856114, + 83450, + -1, + 367921494, + 83449, + 368121341, + 367200598, + -1, + 368186868, + 368052422, + -1, + -59917, + 368119574, + 83407, + -1, + 368181465, + 83406, + -59915, + 368119430, + 83416, + -59914, + 368315911, + 83415, + -59913, + 368381281, + 83414, + -59912, + 368446665, + 83413, + -59911, + 368512031, + 83412, + -59910, + 368577411, + 83411, + -59909, + 368642762, + 83410, + -59908, + 368708082, + 83409, + -1, + 368773462, + 83408, + 368973320, + 368053767, + -1, + -59905, + 368905862, + 83488, + -59904, + 368971271, + 83487, + -59903, + 369036641, + 83486, + -59902, + 369102025, + 83485, + -59901, + 369167391, + 83484, + -59900, + 369232771, + 83483, + -59899, + 369298122, + 83482, + -59898, + 369363442, + 83481, + -59897, + 369428822, + 83480, + -1, + 369494214, + 83479, + 369694227, + 368905569, + -1, + -59894, + 369626758, + 83478, + -59893, + 369692167, + 83477, + -59892, + 369757537, + 83476, + -59891, + 369822921, + 83475, + -59890, + 369888287, + 83474, + -59889, + 369953667, + 83473, + -59888, + 370019018, + 83472, + -59887, + 370084338, + 83471, + -59886, + 370149718, + 83470, + -1, + 370215110, + 83469, + 370415134, + 369626313, + -1, + -59883, + 370347654, + 83468, + -59882, + 370413063, + 83467, + -59881, + 370478433, + 83466, + -59880, + 370543817, + 83465, + -59879, + 370609183, + 83464, + -59878, + 370674563, + 83463, + -59877, + 370739914, + 83462, + -59876, + 370805234, + 83461, + -59875, + 370870614, + 83460, + -1, + 370936006, + 83459, + 371136041, + 370346883, + -1, + -59872, + 371068550, + 83446, + -59871, + 371133959, + 83445, + -59870, + 371199329, + 83444, + -59869, + 371264713, + 83443, + -59868, + 371330079, + 83442, + -59867, + 371395459, + 83441, + -59866, + 371460810, + 83440, + -59865, + 371526130, + 83439, + -59864, + 371591510, + 83438, + -1, + 371656902, + 83437, + 371856948, + 371067594, + -1, + -59861, + 371789446, + 83436, + -59860, + 371854855, + 83435, + -59859, + 371920225, + 83434, + -59858, + 371985609, + 83433, + -59857, + 372050975, + 83432, + -59856, + 372116355, + 83431, + -59855, + 372181706, + 83430, + -59854, + 372247026, + 83429, + -59853, + 372312406, + 83428, + -1, + 372377798, + 83427, + 372577855, + 371788274, + -1, + -59850, + 372510342, + 83426, + -59849, + 372575751, + 83425, + -59848, + 372641121, + 83424, + -59847, + 372706505, + 83423, + -59846, + 372771871, + 83422, + -59845, + 372837251, + 83421, + -59844, + 372902602, + 83420, + -59843, + 372967922, + 83419, + -59842, + 373033302, + 83418, + -1, + 373098694, + 83417, + 373298762, + 372508870, + -1, + -59839, + 373231238, + 83405, + -59838, + 373296647, + 83404, + -59837, + 373362017, + 83403, + -59836, + 373427401, + 83402, + -59835, + 373492767, + 83401, + -59834, + 373558147, + 83400, + -59833, + 373623498, + 83399, + -59832, + 373688818, + 83398, + -59831, + 373754198, + 83397, + -1, + 373819590, + 83396, + 374079487, + 373231238, + -1, + -59828, + 373951841, + 83496, + -59827, + 374017225, + 83495, + -59826, + 374082591, + 83494, + -59825, + 374147971, + 83493, + -59824, + 374213322, + 83492, + -59823, + 374278642, + 83491, + -59822, + 374344022, + 83490, + -1, + 374409414, + 83489, + 374669311, + 367135775, + -1, + 374675039, + 374540786, + -1, + -59818, + 374607494, + 83525, + -59817, + 374672903, + 83524, + -59816, + 374738273, + 83523, + -59815, + 374803657, + 83522, + -59814, + 374869023, + 83521, + -59813, + 374934403, + 83520, + -59812, + 374999754, + 83519, + -59811, + 375065074, + 83518, + -59810, + 375130454, + 83517, + -1, + 375195846, + 83516, + 375395946, + 374606166, + -1, + -59807, + 375328390, + 83515, + -59806, + 375393799, + 83514, + -59805, + 375459169, + 83513, + -59804, + 375524553, + 83512, + -59803, + 375589919, + 83511, + -59802, + 375655299, + 83510, + -59801, + 375720650, + 83509, + -59800, + 375785970, + 83508, + -59799, + 375851350, + 83507, + -1, + 375916742, + 83506, + 376116852, + 375326918, + -1, + -59796, + 376049286, + 83505, + -59795, + 376114695, + 83504, + -59794, + 376180065, + 83503, + -59793, + 376245449, + 83502, + -59792, + 376310815, + 83501, + -59791, + 376376195, + 83500, + -59790, + 376441546, + 83499, + -59789, + 376506866, + 83498, + -1, + 376572246, + 83497, + -1, + 376048493, + 83526, + 376837759, + 334463310, + 128028, + 376903294, + 376783233, + -1, + 376968829, + 376866490, + -1, + -59783, + 376931737, + 11151, + -59782, + 376992821, + 11148, + -59781, + 377054417, + 11119, + -59780, + 377114708, + 11150, + -1, + 377166856, + 11149, + -1, + 376908415, + 128260, + -1, + 376844153, + 128246, + 377552895, + 376780713, + -1, + -59775, + 377457303, + 128551, + -59774, + 377518106, + 128544, + -1, + 377565324, + 128162, + 377755615, + 334393164, + -1, + 377821143, + 377688001, + -1, + 377886530, + 377771614, + -1, + 377952065, + 377848641, + -1, + 378017456, + 377890143, + -1, + 378082989, + 377970789, + -1, + 378148520, + 378046919, + -1, + 378214032, + 378110286, + -1, + 378279566, + 378157767, + -1, + -59763, + 378219987, + 126646, + -1, + 378278426, + 126648, + -59761, + 378219987, + 126645, + -1, + 378409311, + 126632, + 378607252, + 378173474, + -1, + -59758, + 378551646, + 126644, + -59757, + 378613082, + 126638, + -1, + 378671207, + 126641, + 378869399, + 378574970, + -1, + -59754, + 378815453, + 126630, + -1, + 378878663, + 126650, + 379066010, + 378807787, + -1, + -59751, + 379014391, + 126627, + -1, + 379069791, + 126649, + -59749, + 379033424, + 126633, + -59748, + 379228644, + 126629, + -59747, + 379286040, + 126643, + -59746, + 379350583, + 126642, + -59745, + 379412141, + 126637, + -59744, + 379476051, + 126636, + -59743, + 379538892, + 126635, + -59742, + 379603965, + 126647, + -59741, + 379669061, + 126626, + -59740, + 379730672, + 126631, + -59739, + 379795757, + 126651, + -59738, + 379859906, + 126640, + -59737, + 379918673, + 126625, + -1, + 379982204, + 126639, + 380239871, + 378111294, + -1, + -59734, + 380137015, + 126495, + -59733, + 380198573, + 126493, + -59732, + 380253122, + 126494, + -1, + 380311889, + 126492, + 380567551, + 378015505, + -1, + -59729, + 380456183, + 126467, + -1, + 380511583, + 126489, + 380704469, + 377965815, + -1, + 380770004, + 380658810, + -1, + 380835512, + 380731726, + -1, + 380901046, + 380779207, + -1, + -59723, + 380841427, + 126614, + -1, + 380899866, + 126616, + -59721, + 380841427, + 126613, + -1, + 381030751, + 126600, + 381228732, + 380794914, + -1, + -59718, + 381173086, + 126612, + -59717, + 381234522, + 126606, + -1, + 381292647, + 126609, + 381490879, + 381196410, + -1, + -59714, + 381436893, + 126598, + -1, + 381500103, + 126618, + 381687490, + 381434567, + -1, + -59711, + 381627859, + 126596, + -1, + 381686111, + 126599, + 381884101, + 381625835, + -1, + -59708, + 381832439, + 126595, + -1, + 381887839, + 126617, + 382080712, + 381816593, + -1, + -59705, + 382029751, + 126592, + -1, + 382092253, + 126607, + -59703, + 382048080, + 126601, + -59702, + 382243300, + 126597, + -59701, + 382300696, + 126611, + -59700, + 382365239, + 126610, + -59699, + 382426797, + 126605, + -59698, + 382490707, + 126604, + -59697, + 382553548, + 126603, + -59696, + 382618621, + 126615, + -59695, + 382683717, + 126594, + -59694, + 382744877, + 126619, + -59693, + 382809026, + 126608, + -1, + 382867793, + 126593, + -1, + 380703434, + 126475, + 383129335, + 380663842, + -1, + 383194868, + 383092313, + -1, + 383260379, + 383156558, + -1, + -59687, + 383204707, + 126582, + -59686, + 383266259, + 126581, + -1, + 383324511, + 126568, + 383522527, + 383219746, + -1, + -59683, + 383466846, + 126580, + -59682, + 383528282, + 126574, + -1, + 383586407, + 126577, + 383784676, + 383460703, + -1, + 383850211, + 383739463, + -1, + -59678, + 383792066, + 126590, + -1, + 383850833, + 126588, + -1, + 383783015, + 126585, + 384112359, + 383732419, + -1, + -59674, + 384056048, + 126583, + -1, + 384110825, + 126570, + 384308970, + 384056007, + -1, + -59671, + 384249299, + 126564, + -1, + 384307551, + 126567, + -59669, + 384276605, + 126586, + -59668, + 384472912, + 126569, + -59667, + 384527927, + 126578, + -59666, + 384589485, + 126573, + -59665, + 384653395, + 126572, + -59664, + 384715333, + 126562, + -59663, + 384776493, + 126587, + -59662, + 384840642, + 126576, + -59661, + 384899409, + 126561, + -1, + 384962940, + 126575, + -59659, + 383139166, + 126484, + -59658, + 385101146, + 126478, + -1, + 385159271, + 126481, + 385357584, + 383075842, + -1, + 385423100, + 385316898, + -1, + -59654, + 385367390, + 126516, + -59653, + 385428826, + 126510, + -1, + 385486951, + 126513, + 385685247, + 385384782, + -1, + -59650, + 385629539, + 126518, + -1, + 385691091, + 126517, + 385881858, + 385632963, + -1, + -59647, + 385825520, + 126519, + -1, + 385880297, + 126506, + 386078469, + 385825479, + -1, + -59644, + 386018771, + 126500, + -1, + 386077023, + 126503, + -59642, + 386045776, + 126505, + -59641, + 386231863, + 126514, + -59640, + 386293421, + 126509, + -59639, + 386357331, + 126508, + -59638, + 386420172, + 126507, + -59637, + 386484805, + 126498, + -59636, + 386545965, + 126523, + -59635, + 386610114, + 126512, + -59634, + 386672144, + 126521, + -59633, + 386734417, + 126497, + -1, + 386797948, + 126511, + 386996010, + 385319246, + -1, + 387061542, + 386928401, + -1, + 387127077, + 387007377, + -1, + 387192599, + 387086370, + -1, + -59627, + 387136862, + 126548, + -59626, + 387198298, + 126542, + -1, + 387256423, + 126545, + 387454748, + 387130719, + -1, + 387520283, + 387409479, + -1, + -59622, + 387477047, + 126559, + -1, + 387538605, + 126557, + -1, + 387453031, + 126553, + -59619, + 387422032, + 126537, + -59618, + 387739191, + 126546, + -59617, + 387800749, + 126541, + -59616, + 387861964, + 126539, + -59615, + 387927037, + 126551, + -59614, + 387992133, + 126530, + -59613, + 388053744, + 126535, + -59612, + 388118829, + 126555, + -1, + 388174204, + 126543, + -1, + 387070663, + 126472, + 388437801, + 387005127, + -1, + -59608, + 388378067, + 126486, + -1, + 388436506, + 126488, + -1, + 388378067, + 126485, + 388699949, + 386963578, + -1, + -59604, + 388645853, + 126470, + -1, + 388709063, + 126490, + 388896560, + 388654334, + -1, + -59601, + 388847715, + 126704, + -1, + 388905716, + 126705, + 389093171, + 388844227, + -1, + -59598, + 389036784, + 126487, + -1, + 389091561, + 126474, + 389289782, + 389025553, + -1, + -59595, + 389238711, + 126464, + -1, + 389301213, + 126479, + -59593, + 389257040, + 126473, + -59592, + 389452260, + 126469, + -59591, + 389509656, + 126483, + -59590, + 389574199, + 126482, + -59589, + 389635757, + 126477, + -59588, + 389699667, + 126476, + -59587, + 389761605, + 126466, + -59586, + 389823216, + 126471, + -59585, + 389888301, + 126491, + -59584, + 389952450, + 126480, + -1, + 390011217, + 126465, + -1, + 377910892, + 2303, + 390272897, + 377845794, + -1, + 390338397, + 390240263, + -1, + 390403921, + 390299982, + -1, + 390469451, + 390370529, + -1, + 390534985, + 390434680, + -1, + -59576, + 390469996, + 64446, + -1, + 390533063, + 64445, + -59574, + 390469996, + 64437, + -1, + 390664135, + 64436, + 390922239, + 390414184, + -1, + 390928207, + 390818875, + -1, + -59570, + 390863212, + 64441, + -1, + 390926279, + 64440, + -59568, + 390863212, + 64439, + -1, + 391057351, + 64438, + 391255894, + 390342733, + -1, + 391321429, + 391217488, + -1, + -59564, + 391256428, + 64435, + -1, + 391319495, + 64434, + -1, + 391285167, + 64444, + 391583577, + 391216529, + -1, + -59560, + 391518572, + 64449, + -1, + 391581639, + 64448, + 391780188, + 391525990, + -1, + -59557, + 391715180, + 64443, + -1, + 391778247, + 64442, + -1, + 391738683, + 64447, + 392042356, + 390289118, + -1, + 392107889, + 391986666, + -1, + 392173418, + 392073497, + -1, + 392238953, + 392127852, + -1, + 392304486, + 392171281, + -1, + -59549, + 392266538, + 2266, + -59548, + 392329357, + 2267, + -59547, + 392392587, + 2260, + -1, + 392453010, + 2268, + -59545, + 392270201, + 2271, + -59544, + 392591553, + 2269, + -1, + 392654426, + 2270, + -1, + 392173553, + 2291, + 392894317, + 392132642, + -1, + -59540, + 392839963, + 2273, + -1, + 392892519, + 2261, + -59538, + 392850999, + 2263, + -59537, + 393043634, + 2264, + -59536, + 393098714, + 2272, + -1, + 393154940, + 2262, + 393412607, + 392058089, + -1, + -59533, + 393318884, + 2259, + -1, + 393371314, + 2265, + 393549696, + 391983180, + -1, + 393615231, + 393516884, + -1, + 393680762, + 393547537, + -1, + 393746297, + 393629623, + 983633, + -1, + 393675446, + 983635, + -1, + 393685855, + 983640, + -59525, + 393648245, + 983638, + -59524, + 393908708, + 983634, + -59523, + 393971863, + 983637, + -59522, + 394027306, + 983636, + -1, + 394079071, + 983639, + -1, + 393567938, + 983641, + -1, + 393495333, + 1540, + 394401713, + 390221604, + -1, + 394467246, + 394364799, + -1, + 394532745, + 394399505, + -1, + 394598280, + 394475288, + -1, + -59514, + 394554935, + 2236, + -59513, + 394616493, + 2237, + -1, + 394671042, + 2235, + -1, + 394544113, + 2227, + 394925965, + 394499951, + -1, + -59509, + 394886509, + 2234, + -59508, + 394935203, + 2216, + -1, + 394995856, + 2217, + 395188114, + 394882892, + -1, + 395253649, + 395128278, + -1, + -59504, + 395214189, + 2233, + -1, + 395269307, + 2218, + -1, + 395207064, + 2220, + 395515799, + 395123029, + -1, + 395581334, + 395476243, + -1, + -59499, + 395546167, + 2208, + -1, + 395597912, + 2230, + -1, + 395525027, + 2209, + 395843482, + 395477326, + -1, + -59495, + 395783647, + 2232, + -1, + 395841890, + 2211, + 396040093, + 395802658, + -1, + -59492, + 396002847, + 2225, + -1, + 396038258, + 2223, + 396236704, + 395990548, + -1, + -59489, + 396176704, + 2215, + -1, + 396236129, + 1564, + 396433315, + 396184823, + -1, + -59486, + 396388451, + 2221, + -1, + 396432077, + 2214, + 396629926, + 396380954, + -1, + -59483, + 396590016, + 1568, + -1, + 396636971, + 2228, + -59481, + 396597377, + 2226, + -59480, + 396792296, + 2219, + -59479, + 396848699, + 2213, + -59478, + 396913256, + 2231, + -59477, + 396970570, + 2210, + -59476, + 397031412, + 2224, + -59475, + 397095878, + 2212, + -1, + 397157918, + 2222, + 397410303, + 394409836, + -1, + -59472, + 397285740, + 2297, + -1, + 397348807, + 2295, + 397547453, + 394363214, + -1, + 397612988, + 397501192, + -1, + 397678518, + 397576267, + -1, + -59467, + 397613420, + 2286, + -1, + 397676487, + 2283, + 397875129, + 397632269, + -1, + -59464, + 397810028, + 2285, + -1, + 397873095, + 2282, + 398131199, + 397825216, + -1, + -59461, + 398006636, + 2287, + -1, + 398069703, + 2284, + -1, + 397577501, + 2275, + 398333892, + 397485311, + -1, + 398399424, + 398281581, + 2278, + -1, + 398361174, + 2281, + 398530498, + 398341010, + 2276, + -1, + 398492246, + 2279, + 398721023, + 398468683, + 2277, + -1, + 398623318, + 2280, + 398792649, + 398271839, + -1, + 398858183, + 398747300, + 2299, + -1, + 398788134, + 2300, + -59448, + 398805031, + 2274, + -1, + 398922502, + 2302, + 399120333, + 398750552, + -1, + 399185868, + 399052743, + 2296, + -1, + 399115814, + 2301, + -1, + 399120748, + 2298, + 399382481, + 399074507, + -1, + -59441, + 399330184, + 2290, + -59440, + 399389604, + 2288, + -1, + 399451729, + 2289, + 399644628, + 399324056, + -1, + -59437, + 399603003, + 2292, + -1, + 399648912, + 2293, + -59435, + 399610323, + 1631, + -59434, + 399794172, + 1541, + -1, + 399854451, + 2294, + 400037852, + 377772205, + -1, + 400103387, + 399998247, + -1, + -59430, + 400070577, + 1416, + -1, + 400132034, + 1376, + -1, + 400042733, + 1423, + 400424959, + 400000067, + -1, + -59426, + 400326457, + 127912, + -1, + 400368832, + 128667, + 400562311, + 377703671, + -1, + 400627843, + 400498619, + -1, + 400693242, + 400586786, + -1, + 400758764, + 400656535, + -1, + 400824299, + 400694096, + -1, + 400889834, + 400763817, + -1, + 400955368, + 400849112, + -1, + -59417, + 400892767, + 128807, + -1, + 400954496, + 128814, + -59415, + 400892767, + 128802, + -1, + 401085568, + 128812, + -1, + 400836343, + 128862, + -1, + 400773778, + 128781, + 401414130, + 400691738, + -1, + 401479665, + 401375566, + 128788, + 401604607, + 401408788, + -1, + -59408, + 401482598, + 128806, + -1, + 401544320, + 128813, + -1, + 401410085, + 128825, + 401807350, + 401375566, + -1, + 401872885, + 401764482, + 128860, + -1, + 401803295, + 128861, + -1, + 401806789, + 128850, + -59401, + 401763154, + 128839, + -59400, + 402022573, + 128852, + -59399, + 402080668, + 128795, + -1, + 402136843, + 128847, + 402331661, + 400625425, + -1, + 402397186, + 402288234, + -1, + 402462721, + 402325504, + -1, + 402528255, + 402428009, + 128776, + -1, + 402458655, + 128777, + 402718719, + 402485778, + 128774, + -1, + 402589727, + 128775, + -1, + 402404882, + 128773, + 402855943, + 402345207, + -1, + 402921477, + 402803513, + 128822, + -1, + 402851871, + 128823, + -59386, + 402885357, + 128837, + -1, + 402992844, + 128874, + -59384, + 402820359, + 128829, + -59383, + 403143516, + 128855, + -59382, + 403208124, + 128826, + -59381, + 403267544, + 128811, + -59380, + 403330770, + 128859, + -1, + 403392327, + 128769, + 403576865, + 402267447, + -1, + 403642393, + 403533644, + -1, + 403707925, + 403606018, + 128869, + 403832831, + 403638301, + -1, + -59374, + 403704863, + 128873, + -59373, + 403770243, + 128872, + -59372, + 403835594, + 128871, + -1, + 403900914, + 128870, + 404160511, + 403661068, + -1, + 404166680, + 404038495, + 128803, + -1, + 404097055, + 128804, + -1, + 404113356, + 128798, + 404363293, + 403574545, + -1, + -59365, + 404319754, + 128846, + -59364, + 404379153, + 128844, + -1, + 404433685, + 128848, + 404625440, + 404317457, + -1, + -59361, + 404579711, + 128800, + -1, + 404624500, + 128805, + -1, + 404571683, + 128787, + 404887601, + 403533644, + -1, + 404953135, + 404826975, + -1, + 405018668, + 404896406, + 128818, + 405084200, + 404949021, + -1, + -59354, + 405015427, + 128821, + -59353, + 405080778, + 128820, + -1, + 405146098, + 128819, + 405405695, + 405013268, + -1, + 405411883, + 405279872, + 128816, + -1, + 405342239, + 128817, + -1, + 405358540, + 128799, + 405608494, + 404951634, + 128827, + -1, + 405538847, + 128828, + -1, + 405571025, + 128877, + 405864447, + 404906216, + 128792, + -1, + 405735455, + 128793, + 405936188, + 404822050, + -1, + 406001718, + 405890407, + 128834, + 406126591, + 405932061, + -1, + -59339, + 405998282, + 128836, + -1, + 406063602, + 128835, + 406263865, + 405935905, + -1, + -59336, + 406228566, + 128876, + -1, + 406280046, + 128875, + -59334, + 406221610, + 128857, + -59333, + 406408583, + 128783, + -1, + 406472707, + 128830, + 406657094, + 405900853, + -1, + 406722629, + 406601821, + -1, + 406788163, + 406674640, + 128778, + 406853698, + 406718493, + -1, + -59327, + 406784714, + 128780, + -1, + 406850034, + 128779, + -1, + 406782745, + 128815, + 407175167, + 406750992, + 128790, + -1, + 407046175, + 128791, + -1, + 406663339, + 128808, + 407312464, + 406612177, + -1, + 407377995, + 407265381, + -1, + 407443530, + 407343658, + 128843, + -1, + 407383210, + 128858, + -1, + 407404907, + 128856, + 407640142, + 407341207, + -1, + -59315, + 407602766, + 128868, + -1, + 407663430, + 128867, + -59313, + 407597399, + 128863, + -1, + 407780884, + 128782, + 407967832, + 407273806, + -1, + 408033364, + 407913437, + -1, + -59309, + 407970997, + 128840, + -1, + 408028010, + 128809, + 408229974, + 407967277, + 128831, + -1, + 408160287, + 128832, + -59305, + 408194602, + 128845, + -1, + 408318767, + 128849, + 408492127, + 407918100, + -1, + 408557661, + 408432794, + 128784, + 408682495, + 408487965, + -1, + -59300, + 408554186, + 128786, + -1, + 408619506, + 128785, + -59298, + 408511549, + 128881, + -1, + 408753412, + 128824, + 408950886, + 408435399, + -1, + 409016419, + 408903781, + -1, + -59294, + 408980704, + 128878, + -1, + 409040819, + 128854, + 409272319, + 408949313, + -1, + -59291, + 409167598, + 128883, + -1, + 409217768, + 128882, + 409409644, + 408888671, + -1, + 409475179, + 409356266, + -1, + 409540714, + 409435659, + 128865, + -1, + 409471007, + 128866, + -1, + 409502892, + 128864, + -1, + 409409533, + 128880, + 409802864, + 409356236, + -1, + 409868399, + 409731946, + 128796, + -1, + 409798687, + 128797, + -1, + 409798703, + 128801, + 410065011, + 409768241, + -1, + -59278, + 410031602, + 128842, + -1, + 410092263, + 128772, + 410261622, + 410021695, + -1, + -59275, + 410214344, + 128768, + -1, + 410263809, + 128833, + 410458233, + 410213797, + -1, + -59272, + 410420800, + 128789, + -1, + 410466639, + 128879, + 410654844, + 410406135, + -1, + -59269, + 410607900, + 128851, + -1, + 410659835, + 128810, + 410851455, + 410597289, + -1, + -59266, + 410815213, + 128841, + -1, + 410870263, + 128794, + -59264, + 410815745, + 128853, + -59263, + 411001255, + 128838, + -59262, + 411055327, + 128770, + -1, + 411118634, + 128771, + -59260, + 400578068, + 983201, + -59259, + 411255246, + 128126, + -59258, + 411316516, + 983054, + -1, + 411374990, + 9200, + 411572475, + 400500063, + -1, + 411638007, + 411520464, + -1, + 411703477, + 411573559, + -1, + 411769012, + 411636938, + -1, + 411834511, + 411720535, + -1, + -59251, + 411801352, + 125209, + -59250, + 411863840, + 125200, + -1, + 411908821, + 125211, + 412096659, + 411781827, + -1, + -59247, + 412052498, + 125216, + -59246, + 412105429, + 125213, + -1, + 412160233, + 125201, + 412358806, + 412063405, + -1, + -59243, + 412302475, + 125198, + -1, + 412356369, + 125202, + 412555417, + 412317730, + -1, + -59240, + 412501547, + 125189, + -1, + 412564181, + 125217, + 412752028, + 412497833, + -1, + -59237, + 412686638, + 125214, + -1, + 412749585, + 125208, + 412948639, + 412689759, + -1, + -59234, + 412891861, + 125197, + -1, + 412946282, + 125185, + 413145250, + 412882978, + -1, + -59231, + 413088907, + 125191, + -1, + 413142801, + 125188, + -59229, + 413112491, + 125215, + -59228, + 413307364, + 125199, + -59227, + 413371975, + 125212, + -59226, + 413436055, + 125203, + -59225, + 413501334, + 125210, + -59224, + 413560729, + 125192, + -59223, + 413625906, + 125207, + -59222, + 413690444, + 125190, + -59221, + 413753445, + 125196, + -59220, + 413817236, + 125187, + -59219, + 413879628, + 125186, + -59218, + 413944441, + 125204, + -59217, + 414007389, + 125195, + -59216, + 414071509, + 125206, + -59215, + 414135114, + 125194, + -59214, + 414198623, + 125193, + -59213, + 414261218, + 125205, + -1, + 414323288, + 125184, + -1, + 411722788, + 125256, + 414587103, + 411663655, + -1, + 414652602, + 414538583, + -1, + -59208, + 414619400, + 125243, + -59207, + 414681888, + 125234, + -1, + 414726869, + 125245, + 414914750, + 414599875, + -1, + -59204, + 414870546, + 125250, + -59203, + 414923477, + 125247, + -1, + 414978281, + 125235, + 415176897, + 414881453, + -1, + -59200, + 415120523, + 125232, + -1, + 415174417, + 125236, + 415373508, + 415135778, + -1, + -59197, + 415319595, + 125223, + -1, + 415382229, + 125251, + 415570119, + 415315881, + -1, + -59194, + 415504686, + 125248, + -1, + 415567633, + 125242, + 415766730, + 415507807, + -1, + -59191, + 415709909, + 125231, + -1, + 415764330, + 125219, + 415963341, + 415701026, + -1, + -59188, + 415906955, + 125225, + -1, + 415960849, + 125222, + -59186, + 415930539, + 125249, + -59185, + 416125412, + 125233, + -59184, + 416190023, + 125246, + -59183, + 416254103, + 125237, + -59182, + 416319382, + 125244, + -59181, + 416378777, + 125226, + -59180, + 416443954, + 125241, + -59179, + 416508492, + 125224, + -59178, + 416571493, + 125230, + -59177, + 416635284, + 125221, + -59176, + 416697676, + 125220, + -59175, + 416762489, + 125238, + -59174, + 416825437, + 125229, + -59173, + 416889557, + 125240, + -59172, + 416953162, + 125228, + -59171, + 417016671, + 125227, + -59170, + 417079266, + 125239, + -1, + 417141336, + 125218, + 417339629, + 414525433, + -1, + 417405155, + 417300814, + -1, + -59166, + 417371350, + 125266, + -1, + 417414994, + 125267, + 417601766, + 417364002, + -1, + -59163, + 417548669, + 125270, + -1, + 417608246, + 125271, + 417798377, + 417542950, + -1, + -59160, + 417752842, + 125268, + -1, + 417810655, + 125269, + -59158, + 417765639, + 125264, + -59157, + 417948420, + 125265, + -59156, + 418012610, + 125273, + -1, + 418065920, + 125272, + 418257136, + 417285634, + -1, + -59153, + 418213658, + 125279, + -1, + 418263740, + 125278, + 418453747, + 418199712, + -1, + -59150, + 418399995, + 125254, + -1, + 418458483, + 125257, + -59148, + 418418919, + 125253, + -59147, + 418602990, + 125258, + -59146, + 418659229, + 125255, + -1, + 418714205, + 125252, + 418912506, + 411588116, + -1, + -59143, + 418859074, + 127903, + -1, + 418918803, + 11237, + -1, + 418876137, + 129489, + 419174731, + 411516606, + -1, + 419240225, + 419123625, + -1, + 419305730, + 419172113, + 71442, + 419430399, + 419255754, + -1, + -59136, + 419332566, + 71429, + -59135, + 419379170, + 71446, + -1, + 419436595, + 71450, + 419633414, + 419257175, + -1, + -59132, + 419600136, + 71440, + -59131, + 419641314, + 71426, + -1, + 419696401, + 71427, + 419895561, + 419594574, + -1, + -59128, + 419838677, + 71436, + -1, + 419893009, + 71428, + 420092172, + 419850449, + -1, + -59125, + 420035285, + 71431, + -1, + 420089617, + 71430, + 420288783, + 420039363, + -1, + -59122, + 420231893, + 71425, + -1, + 420286225, + 71424, + 420485394, + 420235765, + -1, + -59119, + 420428501, + 71449, + -1, + 420482833, + 71434, + 420682005, + 420427689, + -1, + -59116, + 420625109, + 71447, + -1, + 420679441, + 71445, + 420878616, + 420619615, + -1, + -59113, + 420821717, + 71444, + -1, + 420876049, + 71443, + 421075227, + 420812834, + -1, + -59110, + 421018325, + 71448, + -1, + 421072657, + 71432, + -59108, + 421034142, + 71439, + -59107, + 421228441, + 71437, + -59106, + 421287518, + 71433, + -59105, + 421350729, + 71438, + -59104, + 421411541, + 71441, + -1, + 421470040, + 71435, + 421665069, + 419205368, + -1, + 421730599, + 421596945, + 71456, + -59100, + 421695769, + 71463, + -59099, + 421746196, + 71466, + -59098, + 421806173, + 71465, + -1, + 421859089, + 71457, + 422058281, + 421693591, + 71460, + -1, + 422021271, + 71461, + 422189355, + 422002781, + 71458, + -1, + 422133853, + 71459, + -59092, + 422142053, + 71464, + -1, + 422259551, + 71462, + 422451515, + 421603321, + -1, + 422517041, + 422412622, + -1, + -59088, + 422483158, + 71474, + -1, + 422526802, + 71475, + 422713652, + 422475810, + -1, + -59085, + 422660477, + 71478, + -1, + 422720054, + 71479, + 422910263, + 422654758, + -1, + -59082, + 422864650, + 71476, + -1, + 422922463, + 71477, + -59080, + 422877447, + 71472, + -59079, + 423060228, + 71473, + -59078, + 423124418, + 71481, + -1, + 423177728, + 71480, + 423369027, + 422410274, + -1, + 423434562, + 423314166, + -1, + 423500096, + 423393314, + -1, + -59073, + 423450382, + 71484, + -1, + 423505044, + 71485, + -59071, + 423458810, + 71486, + -1, + 423644178, + 71467, + -1, + 423401538, + 71487, + 423893320, + 423305963, + -1, + 423958855, + 423841015, + -1, + -59066, + 423903751, + 71455, + -1, + 423956241, + 71453, + -1, + 423915417, + 71454, + 424280063, + 423845914, + -1, + -59062, + 424186470, + 71483, + -1, + 424226542, + 71482, + 424417616, + 419137687, + -1, + 424483151, + 424379769, + -1, + -59058, + 424435889, + 128663, + -1, + 424482554, + 127975, + -1, + 424417685, + 127814, + 424745301, + 424378162, + -1, + 424810836, + 424701772, + -1, + -59053, + 424764415, + 9954, + -1, + 424808601, + 11225, + -1, + 424764347, + 128562, + 425072985, + 424700113, + -1, + -59049, + 425028559, + 983194, + -59048, + 425091617, + 11236, + -1, + 425139511, + 983195, + 425335133, + 425022996, + -1, + -59045, + 425290529, + 127994, + -59044, + 425341127, + 127944, + -1, + 425401561, + 128657, + 425597280, + 425281489, + -1, + -59041, + 425535289, + 128747, + -1, + 425596371, + 128748, + 425793890, + 425533685, + 983053, + -1, + 425746233, + 983052, + -59037, + 425758839, + 129361, + -59036, + 425886584, + 128095, + -59035, + 425930937, + 128673, + -1, + 425990272, + 129518, + 426188599, + 334305314, + -1, + 426253642, + 426118929, + -1, + 426319002, + 426203951, + -1, + 426383944, + 426257249, + -1, + 426449318, + 426335063, + -1, + 426514821, + 426391465, + -1, + 426580341, + 426461891, + -1, + 426645872, + 426543255, + -1, + -59025, + 426600657, + 92598, + -1, + 426661396, + 92619, + 426842483, + 426586537, + -1, + -59022, + 426808818, + 92543, + -1, + 426840221, + 92553, + 427098111, + 426774289, + 92531, + -1, + 426971901, + 92601, + 427170174, + 426522537, + -1, + 427235706, + 427133079, + -1, + -59016, + 427192247, + 92550, + -59015, + 427256017, + 92624, + -1, + 427299029, + 92563, + 427556863, + 427174751, + -1, + 427563389, + 427460904, + 92607, + -1, + 427524430, + 92535, + -1, + 427502885, + 92557, + 427760000, + 427133224, + 92640, + -1, + 427721038, + 92657, + 427891075, + 427712613, + -1, + -59006, + 427847213, + 92544, + -1, + 427911377, + 92541, + -59004, + 427831807, + 92579, + -1, + 428019473, + 92658, + 428218767, + 426452319, + -1, + 428284299, + 428150545, + -1, + 428349834, + 428216083, + -1, + -58999, + 428310001, + 92562, + -1, + 428366662, + 92637, + -1, + 428304593, + 92518, + 428611982, + 428228701, + -1, + -58995, + 428568109, + 92558, + -1, + 428610797, + 92592, + -1, + 428575520, + 92528, + 428874133, + 428165621, + -1, + 428939668, + 428813151, + -1, + 429005203, + 428878687, + 92628, + -1, + 428933575, + 92648, + -1, + 428969522, + 92547, + -1, + 428871847, + 92554, + 429267354, + 428833416, + -1, + 429332889, + 429230231, + -1, + -58984, + 429286556, + 92527, + -1, + 429337439, + 92545, + -1, + 429277642, + 92540, + 429595037, + 429234296, + -1, + -58980, + 429558995, + 92609, + -1, + 429593837, + 92583, + 429791648, + 429561773, + -1, + -58977, + 429728108, + 92589, + -1, + 429791661, + 92608, + 429988259, + 429752654, + -1, + -58974, + 429951725, + 92604, + -1, + 429986981, + 92622, + 430184869, + 429920017, + 92662, + -1, + 430123871, + 92613, + -1, + 430132350, + 92584, + 430381502, + 426404049, + -1, + 430447021, + 430344343, + 92576, + 430512555, + 430378769, + -1, + -58966, + 430468653, + 92618, + -1, + 430517087, + 92529, + -58964, + 430462484, + 92561, + -1, + 430648159, + 92649, + 430840243, + 430378769, + -1, + 430905776, + 430771985, + 92524, + -1, + 430855700, + 92536, + 431095807, + 430834636, + -1, + -58958, + 430986757, + 92634, + -1, + 431042564, + 92625, + 431233463, + 430784605, + 92663, + 431357951, + 431172447, + -1, + -58954, + 431259982, + 92621, + -1, + 431304777, + 92593, + 431495612, + 431172447, + -1, + 431561147, + 431458455, + -1, + -58950, + 431527410, + 92647, + -1, + 431587662, + 92605, + -1, + 431500993, + 92548, + 431882239, + 431448165, + 92568, + -1, + 431776422, + 92610, + 431954385, + 430331412, + -1, + 432019908, + 431886097, + 92667, + 432085442, + 431958879, + 92600, + -1, + 432035348, + 92542, + -58941, + 432041517, + 92668, + -1, + 432171217, + 92555, + 432347590, + 431964253, + 92654, + -1, + 432287010, + 92611, + 432478665, + 432289888, + -1, + -58936, + 432418542, + 92581, + -1, + 432475921, + 92551, + 432675276, + 432412974, + -1, + -58933, + 432638701, + 92520, + -1, + 432679775, + 92582, + -58931, + 432640001, + 92617, + -58930, + 432834856, + 92614, + -58929, + 432890534, + 92671, + -58928, + 432944124, + 92591, + -1, + 433008366, + 92666, + 433199588, + 431915342, + -1, + 433265112, + 433131281, + -1, + 433330645, + 433196817, + 92635, + -1, + 433286701, + 92577, + -58922, + 433286701, + 92636, + -58921, + 433411604, + 92530, + -1, + 433467125, + 92559, + 433658332, + 433227927, + -1, + 433723867, + 433608212, + 92586, + -1, + 433655958, + 92569, + -1, + 433655958, + 92566, + 433920480, + 433610853, + -1, + 433986015, + 433872997, + 92537, + -1, + 433937239, + 92519, + -1, + 433942061, + 92630, + 434241535, + 433859423, + -1, + 434248163, + 434145431, + 92669, + -1, + 434180299, + 92572, + -1, + 434199383, + 92672, + 434444790, + 433165997, + -1, + 434510314, + 434407575, + -1, + -58905, + 434466349, + 92644, + -58904, + 434527063, + 92645, + -58903, + 434581577, + 92594, + -1, + 434639028, + 92641, + 434837999, + 434450857, + -1, + 434903533, + 434770070, + 92567, + -1, + 434864462, + 92623, + -58898, + 434869746, + 92639, + -1, + 434984468, + 92606, + 435165682, + 434791712, + -1, + -58895, + 435126492, + 92642, + -1, + 435168178, + 92643, + 435362293, + 435109981, + -1, + -58892, + 435323214, + 92590, + -1, + 435367202, + 92564, + -1, + 435295397, + 92588, + 435624450, + 434403362, + -1, + 435689980, + 435567303, + -1, + 435755514, + 435642469, + 92659, + -1, + 435711533, + 92660, + -58885, + 435701572, + 92638, + -1, + 435827147, + 92580, + 436017663, + 435628895, + -1, + -58882, + 435978574, + 92560, + -1, + 436022111, + 92534, + -58880, + 435980593, + 92571, + -58879, + 436167221, + 92525, + -1, + 436211559, + 92549, + 436410895, + 435571959, + -1, + 436476425, + 436363365, + -1, + 436541959, + 436428901, + -1, + -58874, + 436502862, + 92556, + -1, + 436558679, + 92523, + -58872, + 436497965, + 92664, + -1, + 436688404, + 92539, + 436869645, + 436408081, + -1, + -58869, + 436825645, + 92633, + -58868, + 436889809, + 92521, + -1, + 436933322, + 92575, + -58866, + 436832407, + 92653, + -1, + 437072312, + 92595, + 437262876, + 436357827, + -1, + 437328404, + 437225623, + -1, + -58862, + 437289294, + 92620, + -58861, + 437347484, + 92538, + -1, + 437399915, + 92587, + 437590553, + 437267295, + -1, + 437656088, + 437553303, + -1, + -58857, + 437622258, + 92646, + -1, + 437653654, + 92570, + -1, + 437616974, + 92599, + -58854, + 437545729, + 92532, + -58853, + 437870693, + 92665, + -1, + 437928029, + 92670, + 438114856, + 437203750, + -1, + 438180388, + 438077591, + -1, + 438245922, + 438108160, + -1, + -58848, + 438202942, + 92661, + -58847, + 438255709, + 92616, + -1, + 438312346, + 92626, + 438566911, + 438184799, + 92596, + -1, + 438468942, + 92612, + 438639142, + 438112017, + 92603, + -1, + 438595117, + 92673, + -58841, + 438592053, + 92627, + -1, + 438709538, + 92651, + 438901301, + 438056873, + -1, + 438966834, + 438844103, + -1, + 439032368, + 438905695, + -1, + 439097903, + 438995095, + -1, + -58835, + 439064050, + 92552, + -58834, + 439114583, + 92565, + -1, + 439160982, + 92615, + -1, + 439058766, + 92602, + -58831, + 438985269, + 92674, + -1, + 439357299, + 92578, + 439615487, + 438901038, + -1, + -58828, + 439520818, + 92597, + -1, + 439583054, + 92585, + 439753275, + 438857548, + -1, + 439818809, + 439684881, + -1, + -58824, + 439774765, + 92526, + -1, + 439823199, + 92656, + -58822, + 439763901, + 92546, + -1, + 439956007, + 92655, + 440146496, + 439718169, + -1, + 440212031, + 440109207, + -1, + -58818, + 440164453, + 92533, + -1, + 440216415, + 92650, + -1, + 440152615, + 92574, + 440474181, + 440110645, + -1, + 440539716, + 440413023, + -1, + -58813, + 440502568, + 92573, + -1, + 440544095, + 92652, + -1, + 440492597, + 92522, + -58810, + 440426597, + 92631, + -58809, + 440746077, + 92632, + -1, + 440798993, + 92629, + 440998639, + 426321249, + -1, + 441064061, + 440949591, + -1, + 441129563, + 441005993, + -1, + 441195091, + 441076419, + -1, + 441260623, + 441135529, + -1, + -58802, + 441217807, + 92432, + -1, + 441258187, + 92457, + -58800, + 441227084, + 92435, + -58799, + 441420576, + 92412, + -58798, + 441467338, + 92476, + -1, + 441521317, + 92414, + 441778175, + 441137065, + -1, + 441784920, + 441650961, + -1, + 441850455, + 441717450, + 92465, + -1, + 441782422, + 92409, + -1, + 441805009, + 92483, + -58791, + 441749816, + 92467, + -58790, + 442010498, + 92485, + -1, + 442053159, + 92475, + 442243683, + 441076213, + -1, + 442309214, + 442187869, + 92403, + -1, + 442248482, + 92405, + 442440289, + 442249641, + -1, + -58784, + 442401102, + 92407, + -1, + 442437789, + 92430, + -58782, + 442403406, + 92487, + -1, + 442569893, + 92418, + 442767979, + 442202146, + -1, + 442833511, + 442712522, + -1, + -58778, + 442794318, + 92459, + -1, + 442853585, + 92447, + 443030122, + 442776263, + -1, + -58775, + 442994140, + 92486, + -1, + 443034914, + 92408, + -1, + 442993389, + 92480, + 443292272, + 442734253, + -1, + -58771, + 443255343, + 92463, + -58770, + 443301981, + 92493, + -58769, + 443363691, + 92450, + -1, + 443421386, + 92410, + 443619958, + 443229535, + -1, + 443685492, + 443558751, + -1, + -58765, + 443649586, + 92425, + -1, + 443689823, + 92437, + -58763, + 443638438, + 92440, + -1, + 443814602, + 92471, + 444013179, + 443580750, + -1, + 444078714, + 443951967, + -1, + -58759, + 444041965, + 92472, + -1, + 444083039, + 92505, + -1, + 444042799, + 92514, + -58756, + 443975831, + 92503, + -1, + 444285021, + 92507, + 444471960, + 441013780, + 92497, + 444537477, + 444412710, + -1, + 444603009, + 444489829, + 92445, + -1, + 444554071, + 92404, + 444734084, + 444543401, + -1, + -58749, + 444694862, + 92424, + -1, + 444731542, + 92458, + -1, + 444678602, + 92466, + 444996233, + 444479584, + -1, + -58745, + 444948828, + 92438, + -58744, + 445006282, + 92444, + -1, + 445067742, + 92442, + 445258382, + 444935007, + -1, + 445323917, + 445221015, + -1, + -58740, + 445284686, + 92427, + -1, + 445340503, + 92478, + -1, + 445263141, + 92496, + 445586066, + 445192226, + -1, + 445651601, + 445517671, + 92448, + -1, + 445580387, + 92515, + -1, + 445614975, + 92401, + 445848213, + 445517585, + -1, + -58732, + 445796273, + 92426, + -1, + 445853555, + 92482, + -58730, + 445812925, + 92510, + -58729, + 446007447, + 92499, + -1, + 446063543, + 92441, + 446241451, + 444430370, + -1, + 446306978, + 446184135, + -1, + 446372511, + 446245727, + -1, + 446438046, + 446335127, + -1, + -58723, + 446404082, + 92501, + -1, + 446435478, + 92417, + -1, + 446376799, + 92413, + -58720, + 446335127, + 92504, + -58719, + 446653725, + 92508, + -1, + 446710608, + 92500, + 446896806, + 446269591, + -1, + -58716, + 446859415, + 92498, + -58715, + 446901087, + 92419, + -1, + 446959766, + 92473, + 447158953, + 446828305, + -1, + -58712, + 447114797, + 92516, + -1, + 447178961, + 92423, + -58710, + 447112687, + 92452, + -1, + 447295947, + 92428, + 447486649, + 446188227, + -1, + 447552179, + 447425375, + -1, + 447617714, + 447514775, + -1, + -58705, + 447572177, + 92460, + -58704, + 447636989, + 92431, + -58703, + 447698452, + 92454, + -1, + 447746273, + 92415, + -1, + 447578446, + 92420, + 448010935, + 447514775, + 92489, + -58699, + 447966765, + 92479, + -58698, + 448029237, + 92422, + -1, + 448093015, + 92474, + -58696, + 447977292, + 92502, + -1, + 448237885, + 92449, + 448404165, + 447447374, + -1, + 448469696, + 448342879, + -1, + 448535231, + 448432279, + -1, + -58691, + 448495950, + 92416, + -58690, + 448551767, + 92481, + -1, + 448598196, + 92451, + -1, + 448474405, + 92456, + 448862914, + 448432279, + 92433, + -1, + 448816623, + 92477, + -58685, + 448816413, + 92492, + -58684, + 448938077, + 92513, + -1, + 448991382, + 92491, + 449190607, + 448351479, + -1, + 449256140, + 449129311, + -1, + 449321674, + 449218711, + -1, + -58679, + 449271316, + 92484, + -1, + 449319105, + 92439, + -58677, + 449282382, + 92464, + -1, + 449457445, + 92495, + -58675, + 449219309, + 92446, + -58674, + 449602845, + 92511, + -1, + 449659338, + 92406, + 449845976, + 449145041, + -1, + 449911507, + 449808535, + -1, + -58670, + 449875420, + 92443, + -1, + 449932845, + 92509, + 450108118, + 449850207, + -1, + -58667, + 450072035, + 92462, + -1, + 450112351, + 92506, + -58665, + 450053892, + 92461, + -1, + 450237605, + 92469, + 450435808, + 449812141, + -1, + 450501342, + 450398359, + -1, + 450566877, + 450453605, + -1, + -58660, + 450521297, + 92470, + -1, + 450582036, + 92468, + -1, + 450532727, + 92453, + -58657, + 450440942, + 92429, + -1, + 450760877, + 92421, + 450960102, + 450391884, + -1, + 451025636, + 450899697, + -1, + -58653, + 450978295, + 92490, + -1, + 451042081, + 92512, + -58651, + 450970448, + 92494, + -1, + 451154077, + 92455, + 451353321, + 450924825, + -1, + -58648, + 451316017, + 92411, + -1, + 451351717, + 92402, + 451549932, + 451295526, + -1, + -58645, + 451490227, + 92488, + -1, + 451546983, + 92434, + 451805183, + 451490598, + -1, + -58642, + 451686865, + 92436, + -1, + 451743591, + 92517, + 451943298, + 440933689, + -1, + 452008740, + 451894103, + -1, + 452074238, + 451950505, + -1, + 452139769, + 452016041, + -1, + 452205304, + 452102295, + 92362, + -58635, + 452158118, + 92341, + -58634, + 452220436, + 92347, + -58633, + 452275560, + 92370, + -1, + 452333752, + 92336, + -1, + 452144878, + 92307, + 452598524, + 452086467, + -1, + -58629, + 452561462, + 92303, + -1, + 452596973, + 92309, + -58627, + 452551221, + 92368, + -1, + 452728045, + 92395, + 452926214, + 452032546, + -1, + 452991746, + 452888727, + -1, + -58623, + 452945414, + 92359, + -1, + 453008215, + 92374, + -58621, + 452944437, + 92371, + -58620, + 453131324, + 92351, + -58619, + 453194174, + 92325, + -1, + 453250833, + 92350, + 453450511, + 452863327, + -1, + 453516042, + 453390761, + -1, + -58615, + 453476686, + 92349, + -1, + 453513423, + 92308, + 453712653, + 453447441, + -1, + -58612, + 453667025, + 92378, + -1, + 453727764, + 92375, + -58610, + 453665405, + 92317, + -1, + 453853597, + 92331, + 454040343, + 453396981, + -1, + 454105875, + 453978975, + -1, + -58606, + 454069810, + 92389, + -1, + 454110501, + 92360, + 454302486, + 454037265, + -1, + -58603, + 454252052, + 92367, + -1, + 454307521, + 92356, + -1, + 454265422, + 92333, + 454564637, + 454000974, + -1, + 454630171, + 454503263, + -1, + -58598, + 454593391, + 92345, + -1, + 454646615, + 92372, + -58596, + 454592679, + 92314, + -1, + 454758247, + 92340, + 454957856, + 454531192, + -1, + -58593, + 454898138, + 92323, + -1, + 454954769, + 92304, + 455154467, + 454889233, + -1, + -58590, + 455110189, + 92396, + -1, + 455171950, + 92338, + -1, + 455120863, + 92313, + 455416641, + 451958292, + -1, + 455482167, + 455350306, + -1, + 455547692, + 455420767, + -1, + 455613226, + 455510167, + -1, + -58583, + 455579122, + 92385, + -1, + 455628308, + 92315, + -58581, + 455569335, + 92354, + -1, + 455749210, + 92311, + 455940911, + 455491677, + 92381, + -58578, + 455901518, + 92326, + -1, + 455963456, + 92343, + 456137524, + 455872273, + -1, + 456203059, + 456068883, + -1, + -58574, + 456157994, + 92387, + -1, + 456203606, + 92318, + -1, + 456155223, + 92383, + 456523775, + 456099991, + -1, + -58570, + 456403807, + 92324, + -1, + 456462493, + 92364, + 456661822, + 455413521, + -1, + 456727355, + 456600415, + -1, + -58566, + 456686594, + 92363, + -1, + 456742800, + 92382, + 456982527, + 456654848, + -1, + -58563, + 456875910, + 92376, + -1, + 456936419, + 92339, + -58561, + 456624424, + 92391, + -58560, + 457064906, + 92390, + -1, + 457128041, + 92344, + 457317202, + 455363267, + -1, + 457382733, + 457255775, + -1, + 457448265, + 457345175, + -1, + 457513799, + 457406498, + -1, + -58554, + 457457050, + 92319, + -1, + 457519655, + 92384, + -58552, + 457463316, + 92386, + -1, + 457657159, + 92321, + 457841484, + 457399129, + -1, + -58549, + 457789122, + 92393, + -1, + 457847725, + 92394, + -1, + 457802062, + 92361, + 458103632, + 457345175, + -1, + -58545, + 458064206, + 92366, + -1, + 458122399, + 92373, + -58543, + 458058165, + 92328, + -1, + 458231655, + 92329, + 458431321, + 457283245, + -1, + 458496855, + 458393751, + -1, + -58539, + 458462583, + 92388, + -58538, + 458511892, + 92305, + -1, + 458556138, + 92322, + -58536, + 458437109, + 92327, + -1, + 458690407, + 92377, + 458890081, + 458391886, + -1, + 458955613, + 458836077, + -1, + -58532, + 458918198, + 92358, + -1, + 458952517, + 92334, + 459152224, + 458894175, + -1, + -58529, + 459116019, + 92346, + -1, + 459178318, + 92400, + -1, + 459083647, + 92332, + 459414377, + 458848290, + -1, + 459479909, + 459356871, + -1, + -58524, + 459442766, + 92379, + -1, + 459491140, + 92392, + 459676520, + 459418463, + -1, + -58521, + 459640370, + 92330, + -1, + 459703064, + 92380, + -1, + 459639106, + 92335, + 459938671, + 459361527, + -1, + 460004205, + 459869969, + -1, + -58516, + 459958481, + 92342, + -1, + 460019220, + 92357, + -58514, + 459966615, + 92365, + -1, + 460146500, + 92397, + 460331892, + 459892945, + -1, + 460397427, + 460275805, + -1, + -58510, + 460354368, + 92316, + -1, + 460413783, + 92398, + -1, + 460336878, + 92399, + 460659577, + 460273577, + -1, + 460725112, + 460602069, + -1, + -58505, + 460681143, + 92310, + -1, + 460744913, + 92320, + -1, + 460658955, + 92312, + 460987260, + 460624153, + -1, + -58501, + 460950410, + 92369, + -1, + 460985347, + 92306, + 461183871, + 460951520, + -1, + -58498, + 461149682, + 92337, + -1, + 461181125, + 92353, + -58496, + 461141991, + 92355, + -58495, + 461322139, + 92348, + -1, + 461380833, + 92352, + 461577216, + 451874579, + -1, + 461642662, + 461527895, + -1, + 461708170, + 461603150, + -1, + 461773705, + 461640869, + 92223, + 461897727, + 461701120, + -1, + -58488, + 461791154, + 92194, + -1, + 461854934, + 92185, + -1, + 461727025, + 92178, + 462101392, + 461649833, + -1, + 462166926, + 462048433, + -1, + -58483, + 462119007, + 92182, + -1, + 462160581, + 92160, + -58481, + 462108889, + 92229, + -1, + 462296112, + 92173, + 462494612, + 462067373, + -1, + 462560147, + 462438493, + 92239, + -1, + 462520720, + 92225, + -1, + 462500203, + 92233, + 462756759, + 462461048, + -1, + -58474, + 462719779, + 92191, + -1, + 462753578, + 92167, + 462953370, + 462715528, + -1, + -58471, + 462897610, + 92237, + -1, + 462950161, + 92241, + 463149981, + 462899907, + -1, + -58468, + 463095001, + 92180, + -1, + 463146873, + 92227, + 463346592, + 463087083, + -1, + -58465, + 463279091, + 92212, + -1, + 463340148, + 92201, + 463543203, + 463277841, + -1, + -58462, + 463498797, + 92245, + -1, + 463540010, + 92164, + -58460, + 463489586, + 92231, + -58459, + 463684435, + 92204, + -1, + 463744750, + 92244, + 463936445, + 461592084, + -1, + 464001970, + 463867665, + -1, + 464067504, + 463940447, + -1, + 464133037, + 464016916, + 92238, + -58453, + 464097267, + 92174, + -58452, + 464145546, + 92203, + -1, + 464198132, + 92171, + -58450, + 464092162, + 92230, + -58449, + 464347223, + 92210, + -1, + 464407531, + 92186, + -58447, + 464021728, + 92221, + -1, + 464543636, + 92175, + 464722871, + 463954021, + -1, + 464788406, + 464675381, + -1, + -58443, + 464743934, + 92198, + -1, + 464794147, + 92214, + -1, + 464739164, + 92190, + 465050554, + 464656435, + -1, + -58439, + 465006125, + 92246, + -1, + 465068119, + 92232, + -58437, + 465014756, + 92176, + -58436, + 465188963, + 92196, + -1, + 465252834, + 92197, + 465443789, + 463894562, + -1, + 465509318, + 465386183, + -1, + 465574850, + 465471639, + -1, + -58431, + 465524244, + 92215, + -1, + 465579934, + 92165, + 465771461, + 465518685, + -1, + -58428, + 465727415, + 92222, + -1, + 465788008, + 92168, + -1, + 465724708, + 92224, + 466033610, + 465461349, + -1, + -58424, + 465994062, + 92235, + -58423, + 466054701, + 92220, + -1, + 466116153, + 92208, + -58421, + 465997359, + 92181, + -58420, + 466241517, + 92195, + -1, + 466301422, + 92177, + 466492382, + 465397969, + -1, + 466557909, + 466423569, + -1, + 466623442, + 466489105, + -1, + -58415, + 466579383, + 92226, + -1, + 466638356, + 92236, + -58413, + 466582266, + 92187, + -58412, + 466770661, + 92189, + -1, + 466813556, + 92200, + 467016668, + 466510505, + -1, + 467082201, + 466970894, + -1, + -58408, + 467023984, + 92169, + -1, + 467081267, + 92170, + 467337215, + 467032283, + -1, + -58405, + 467220592, + 92162, + -1, + 467277875, + 92163, + -58403, + 466979722, + 92205, + -1, + 467415403, + 92202, + 467606503, + 466438851, + -1, + 467672034, + 467544927, + -1, + -58399, + 467634851, + 92179, + -1, + 467697998, + 92211, + 467868645, + 467603217, + -1, + -58396, + 467824173, + 92240, + -1, + 467874634, + 92199, + -58394, + 467831686, + 92213, + -1, + 468020374, + 92219, + 468196335, + 467566926, + -1, + 468261867, + 468158615, + -1, + -58390, + 468193473, + 92206, + -1, + 468255406, + 92172, + 468458478, + 468201897, + -1, + -58387, + 468419340, + 92209, + -1, + 468455604, + 92234, + -1, + 468404351, + 92166, + 468720629, + 468143351, + -1, + 468786162, + 468682903, + 92243, + -1, + 468717761, + 92207, + -58381, + 468738716, + 92216, + -58380, + 468857198, + 92184, + -1, + 468915368, + 92183, + 469113850, + 468662185, + -1, + 469179385, + 469056916, + -1, + -58376, + 469135287, + 92188, + -1, + 469186874, + 92193, + -1, + 469113390, + 92161, + 469441533, + 469076119, + -1, + -58372, + 469392972, + 92228, + -1, + 469436436, + 92192, + -58370, + 469405361, + 92242, + -58369, + 469595872, + 92218, + -1, + 469644528, + 92217, + 469834833, + 461510692, + -1, + 469900308, + 469784084, + -1, + 469965833, + 469833762, + -1, + 470031366, + 469896977, + -1, + -58363, + 469964031, + 92255, + -1, + 470024870, + 92252, + -58361, + 469994374, + 92292, + -58360, + 470173808, + 92268, + -1, + 470233606, + 92286, + 470424589, + 469896977, + 92300, + 470548479, + 470352629, + -1, + -58356, + 470453462, + 92296, + -1, + 470495684, + 92295, + 470686736, + 470364966, + -1, + -58353, + 470639294, + 92267, + -1, + 470698461, + 92284, + 470883347, + 470626729, + -1, + -58350, + 470843805, + 92290, + -1, + 470904365, + 92281, + -1, + 470836290, + 92287, + 471145509, + 469850967, + -1, + 471211037, + 471087017, + -1, + 471276571, + 471152553, + -1, + 471342105, + 471239558, + 92282, + -1, + 471269997, + 92283, + -58342, + 471282092, + 92277, + -1, + 471404399, + 92298, + -58340, + 471228981, + 92302, + -1, + 471551001, + 92276, + 471735328, + 471176877, + -1, + -58337, + 471679100, + 92269, + -1, + 471732385, + 92288, + 471931939, + 471693346, + -1, + -58334, + 471875584, + 92247, + -1, + 471936750, + 92299, + -58332, + 471893108, + 92260, + -1, + 472066813, + 92261, + 472259629, + 471103522, + -1, + 472325161, + 472202379, + -1, + -58328, + 472287547, + 92266, + -1, + 472351142, + 92265, + -58326, + 472287791, + 92285, + -58325, + 472465866, + 92249, + -58324, + 472527221, + 92250, + -1, + 472584714, + 92279, + 472783926, + 472206019, + -1, + 472849458, + 472723881, + -1, + -58320, + 472815519, + 92272, + -58319, + 472870398, + 92270, + -1, + 472912029, + 92294, + 473111605, + 472793181, + -1, + -58316, + 473067053, + 92301, + -1, + 473115959, + 92253, + -1, + 473043658, + 92256, + 473373755, + 472738001, + -1, + -58312, + 473336680, + 92289, + -58311, + 473385069, + 92263, + -58310, + 473443682, + 92257, + -1, + 473503307, + 92274, + 473701441, + 473320695, + -1, + 473766975, + 473632529, + -1, + -58306, + 473716256, + 92259, + -1, + 473764701, + 92273, + -58304, + 473719373, + 92251, + -1, + 473903467, + 92297, + 474094662, + 473661774, + -1, + 474160197, + 474056857, + -1, + -58300, + 474111878, + 92264, + -1, + 474175156, + 92248, + -1, + 474091375, + 92280, + 474422345, + 474060461, + -1, + -58296, + 474362361, + 92254, + -1, + 474419485, + 92258, + 474618956, + 474364225, + -1, + -58293, + 474581292, + 92262, + -1, + 474635095, + 92271, + 474815567, + 474559413, + -1, + -58290, + 474779186, + 92291, + -1, + 474819423, + 92293, + -58288, + 474781164, + 92278, + -1, + 474976238, + 92275, + 475201535, + 469775144, + -1, + 475208800, + 475093847, + -1, + 475274325, + 475170967, + 92697, + -1, + 475205782, + 92696, + 475405400, + 475220469, + -1, + -58281, + 475367720, + 92698, + -1, + 475402397, + 92688, + 475602011, + 475346857, + -1, + -58278, + 475548896, + 92711, + -1, + 475609058, + 92712, + -58276, + 475568042, + 92681, + -58275, + 475759288, + 92704, + -58274, + 475822823, + 92702, + -58273, + 475873373, + 92708, + -1, + 475932172, + 92687, + 476126313, + 475166754, + -1, + 476191845, + 476068551, + -1, + -58269, + 476154007, + 92700, + -58268, + 476209253, + 92713, + -1, + 476267344, + 92691, + -58266, + 476155439, + 92690, + -58265, + 476397661, + 92692, + -58264, + 476459559, + 92693, + -1, + 476517088, + 92727, + 476716146, + 476072643, + -1, + 476781677, + 476654431, + -1, + -58260, + 476741966, + 92695, + -1, + 476797783, + 92710, + -58258, + 476747596, + 92694, + -58257, + 476940439, + 92677, + -58256, + 476997899, + 92726, + -58255, + 477061221, + 92719, + -1, + 477105937, + 92675, + 477305979, + 476671820, + -1, + 477371511, + 477244255, + -1, + -58251, + 477335090, + 92709, + -58250, + 477387607, + 92721, + -1, + 477440863, + 92679, + 477633658, + 477315165, + -1, + -58247, + 477577309, + 92683, + -1, + 477637922, + 92684, + -1, + 477595799, + 92707, + 477895810, + 477255188, + 92689, + 477961343, + 477829154, + -1, + -58242, + 477900526, + 92720, + -1, + 477957991, + 92724, + -58240, + 477913189, + 92723, + -58239, + 478096681, + 92685, + -1, + 478154513, + 92722, + 478354567, + 477856078, + -1, + 478420102, + 478285585, + -1, + -58235, + 478358367, + 92680, + -1, + 478416657, + 92686, + -1, + 478359915, + 92725, + 478682252, + 478308561, + -1, + 478747787, + 478620511, + -1, + -58230, + 478711346, + 92703, + -1, + 478751583, + 92706, + -1, + 478710056, + 92714, + 479009936, + 478629111, + -1, + -58226, + 478962973, + 92718, + -58225, + 479019101, + 92717, + -1, + 479072017, + 92682, + 479272083, + 478975661, + -1, + -58222, + 479225117, + 92699, + -1, + 479268625, + 92701, + 479468694, + 479236377, + -1, + -58219, + 479431215, + 92705, + -1, + 479465233, + 92716, + -58217, + 479432976, + 92728, + -58216, + 479627415, + 92676, + -58215, + 479671766, + 92715, + -1, + 479735074, + 92678, + 479927524, + 426279246, + 129415, + 479993057, + 479859168, + -1, + 480058568, + 479941033, + -1, + 480124075, + 480016418, + -1, + 480189609, + 480068525, + -1, + -58208, + 480155400, + 7132, + -58207, + 480219441, + 7116, + -58206, + 480278686, + 7129, + -58205, + 480341913, + 7123, + -58204, + 480405771, + 7112, + -58203, + 480466526, + 7125, + -58202, + 480529737, + 7135, + -58201, + 480590549, + 7107, + -58200, + 480655330, + 7119, + -1, + 480710417, + 7105, + -58198, + 480143315, + 7126, + -1, + 480841489, + 7128, + 481041585, + 480074583, + -1, + -58195, + 481007368, + 7136, + -58194, + 481060283, + 7127, + -58193, + 481114082, + 7133, + -58192, + 481175019, + 7138, + -1, + 481234705, + 7113, + 481434808, + 480990740, + -1, + 481500343, + 481365777, + 7124, + 481624063, + 481451123, + -1, + -58187, + 481523870, + 7130, + -58186, + 481582000, + 7114, + -1, + 481639125, + 7108, + -1, + 481433651, + 7139, + 481893562, + 481388811, + 7111, + -1, + 481840258, + 7117, + -58181, + 481859336, + 7131, + -58180, + 481988913, + 7115, + -58179, + 482052247, + 7141, + -58178, + 482111385, + 7122, + -58177, + 482168137, + 7134, + -58176, + 482233169, + 7110, + -58175, + 482298394, + 7120, + -58174, + 482361437, + 7140, + -58173, + 482425557, + 7106, + -58172, + 482490338, + 7118, + -58171, + 482551275, + 7121, + -58170, + 482614611, + 7137, + -58169, + 482678835, + 7109, + -1, + 482742033, + 7104, + 482942163, + 480022776, + -1, + 483007691, + 482904215, + 7150, + -1, + 482935295, + 7151, + 483138766, + 482954059, + -1, + -58163, + 483090533, + 7149, + -1, + 483147869, + 7147, + 483335376, + 483076959, + 7143, + -1, + 483273567, + 7145, + -58159, + 483289419, + 7144, + -58158, + 483418213, + 7148, + -1, + 483475549, + 7146, + 483663067, + 482900002, + -1, + 483728602, + 483629081, + -1, + 483794136, + 483682513, + -1, + -58153, + 483738650, + 7165, + -1, + 483791912, + 7167, + -58151, + 483744717, + 7164, + -1, + 483936957, + 7166, + -1, + 483672880, + 7142, + 484187358, + 483617126, + -1, + -58147, + 484139951, + 7155, + -1, + 484194839, + 7154, + 484442111, + 484123333, + -1, + -58144, + 484334928, + 7152, + -1, + 484391623, + 7153, + 484580579, + 479935175, + 128704, + -1, + 484542361, + 128705, + -1, + 484541191, + 128267, + 484777236, + 479885346, + -1, + 484842770, + 484735137, + -1, + 484908297, + 484790697, + -1, + 484973802, + 484846431, + 92908, + -58135, + 484925018, + 92880, + -1, + 484977503, + 92907, + 485170413, + 484939437, + -1, + -58132, + 485114300, + 92885, + -1, + 485174862, + 92900, + 485367023, + 485134641, + 92891, + -1, + 485303960, + 92902, + 485498097, + 485329047, + 92906, + -1, + 485463529, + 92896, + 485629171, + 485449829, + 92904, + -1, + 485580901, + 92905, + 485760246, + 485575363, + -1, + -58123, + 485714233, + 92888, + -1, + 485756689, + 92881, + 485956857, + 485701545, + -1, + -58120, + 485891265, + 92893, + -1, + 485953887, + 92886, + 486153468, + 485893471, + -1, + -58117, + 486105189, + 92894, + -1, + 486161936, + 92887, + -58115, + 486119722, + 92892, + -58114, + 486314253, + 92899, + -58113, + 486376773, + 92897, + -58112, + 486439291, + 92882, + -58111, + 486500619, + 92901, + -58110, + 486561684, + 92884, + -58109, + 486623923, + 92889, + -58108, + 486686813, + 92909, + -58107, + 486752334, + 92890, + -58106, + 486814538, + 92883, + -58105, + 486874814, + 92895, + -58104, + 486938675, + 92898, + -1, + 487001873, + 92903, + 487202065, + 484844041, + -1, + 487267597, + 487150821, + -1, + -58100, + 487196772, + 92915, + -1, + 487261531, + 92913, + 487464208, + 487210469, + -1, + -58097, + 487393357, + 92916, + -1, + 487458139, + 92912, + -1, + 487414008, + 92914, + -1, + 487143327, + 92917, + 487849983, + 484789215, + 129530, + -1, + 487725228, + 127936, + 487922980, + 484725715, + -1, + 487988515, + 487874661, + -1, + 488054050, + 487948624, + -1, + 488119585, + 487988110, + -1, + 488185120, + 488085001, + -1, + 488250654, + 488118306, + -1, + 488316189, + 488202747, + -1, + -58084, + 488274290, + 128503, + -1, + 488316813, + 128505, + -1, + 488247922, + 128499, + -58081, + 488208754, + 128501, + -1, + 488526674, + 11197, + -1, + 488132352, + 128502, + -1, + 488077682, + 128500, + -1, + 488006310, + 127880, + -1, + 487916371, + 129526, + 488971568, + 487857463, + -1, + 489037102, + 488917699, + -1, + 489102635, + 488994850, + -1, + 489168170, + 489049587, + -1, + -58071, + 489125470, + 11101, + -1, + 489185751, + 11099, + -1, + 489122076, + 983056, + 489488383, + 489029632, + -1, + -58067, + 489395175, + 128281, + -1, + 489447729, + 128386, + -58065, + 488998512, + 128043, + -1, + 489579174, + 129363, + 489758008, + 488921943, + -1, + 489823543, + 489704131, + 127974, + 489947135, + 489774882, + -1, + -58060, + 489854860, + 128180, + -58059, + 489909456, + 128183, + -58058, + 489959947, + 128182, + -1, + 490023025, + 128181, + -1, + 489755464, + 127820, + 490282302, + 489692468, + 128118, + 490405887, + 490209280, + -1, + -58053, + 490307871, + 128700, + -58052, + 490348518, + 128036, + -58051, + 490413057, + 127868, + -1, + 490476512, + 128124, + 490675523, + 490237772, + -1, + 490741058, + 490602496, + -1, + -58047, + 490692936, + 129532, + -1, + 490741630, + 128202, + -1, + 490674572, + 128136, + 491003207, + 490616745, + -1, + -58043, + 490965586, + 129366, + -58042, + 491010061, + 128708, + -1, + 491073120, + 129391, + 491323391, + 490939743, + -1, + -58039, + 491215320, + 127992, + -1, + 491272421, + 129441, + 491462128, + 426209100, + -1, + 491527650, + 491392785, + -1, + 491593185, + 491470481, + -1, + 491658641, + 491540905, + -1, + 491724117, + 491621941, + -1, + 491789652, + 491675851, + -1, + 491855186, + 491745100, + 69643, + -1, + 491810636, + 69644, + 492044287, + 491801847, + 69645, + -1, + 491932919, + 69646, + -1, + 491720465, + 69679, + 492182875, + 491684174, + -1, + 492248409, + 492142926, + -1, + -58024, + 492190421, + 69662, + -1, + 492244753, + 69661, + -58022, + 492190421, + 69667, + -1, + 492375825, + 69666, + 492576096, + 492134501, + 69649, + 492699647, + 492523285, + -1, + -58018, + 492599164, + 69686, + -58017, + 492658299, + 69687, + -1, + 492721188, + 69685, + 492903781, + 492526423, + -1, + -58014, + 492869384, + 69660, + -58013, + 492919728, + 69665, + -58012, + 492976098, + 69655, + -1, + 493031185, + 69670, + 493231467, + 492840287, + -1, + 493297001, + 493167967, + -1, + -58008, + 493238997, + 69664, + -1, + 493293329, + 69663, + -58006, + 493238997, + 69669, + -1, + 493424401, + 69668, + 493624687, + 493162257, + 69637, + -58003, + 493586583, + 69650, + -58002, + 493633629, + 69648, + -1, + 493686545, + 69638, + 493886835, + 493582370, + -1, + -57999, + 493844638, + 69681, + -57998, + 493894357, + 69680, + -1, + 493948689, + 69682, + 494148981, + 493848727, + 69641, + -1, + 494110871, + 69642, + 494280056, + 494102737, + -1, + -57993, + 494222037, + 69672, + -1, + 494276369, + 69671, + 494476667, + 494226679, + -1, + -57990, + 494423369, + 69684, + -1, + 494472977, + 69678, + 494673278, + 494422723, + -1, + -57987, + 494615253, + 69652, + -1, + 494669585, + 69651, + 494869889, + 494619125, + -1, + -57984, + 494811861, + 69659, + -1, + 494866193, + 69658, + 495066499, + 494813277, + 69639, + -1, + 495009885, + 69640, + 495197574, + 495007657, + -1, + -57979, + 495139541, + 69654, + -1, + 495193873, + 69653, + 495394185, + 495131959, + -1, + -57976, + 495336149, + 69657, + -1, + 495390481, + 69656, + 495590796, + 495327266, + -1, + -57973, + 495532757, + 69674, + -1, + 495587089, + 69673, + -57971, + 495556360, + 69676, + -57970, + 495742873, + 69677, + -57969, + 495801950, + 69675, + -57968, + 495860437, + 69683, + -1, + 495922015, + 69647, + 496115119, + 491610100, + -1, + 496180634, + 496075086, + -1, + 496246166, + 496144665, + -1, + -57963, + 496197733, + 69715, + -1, + 496250851, + 69724, + 496442777, + 496188103, + -1, + -57960, + 496398786, + 69716, + -1, + 496453601, + 69725, + -1, + 496381678, + 69723, + 496704927, + 496138274, + -1, + 496770461, + 496650621, + 69719, + -1, + 496732283, + 69728, + 496959487, + 496710198, + 69720, + -1, + 496863355, + 69729, + 497032614, + 496644902, + -1, + 497098147, + 496984165, + -1, + -57950, + 497061088, + 69717, + -1, + 497121251, + 69726, + 497352703, + 497041501, + -1, + -57947, + 497258093, + 69718, + -1, + 497301396, + 69727, + 497491370, + 496984836, + 69714, + 497614847, + 497418240, + -1, + -57943, + 497517460, + 69733, + -1, + 497565712, + 69732, + 497753516, + 497442242, + 69722, + -1, + 497715323, + 69731, + 497884590, + 497692160, + 69721, + -1, + 497850029, + 69730, + -1, + 497830582, + 69759, + 498081218, + 496078389, + -1, + 498146753, + 498034815, + -1, + 498212278, + 498110590, + -1, + 498277812, + 498167628, + 69694, + -1, + 498233164, + 69695, + 498466815, + 498224375, + 69696, + -1, + 498355447, + 69697, + 498539962, + 498142993, + -1, + -57928, + 498501783, + 69701, + -57927, + 498548829, + 69699, + -1, + 498601745, + 69688, + 498802108, + 498501783, + 69692, + -1, + 498763927, + 69693, + 498933182, + 498745437, + 69690, + -1, + 498876509, + 69691, + -57921, + 498884709, + 69700, + -57920, + 499002207, + 69698, + -1, + 499063295, + 69689, + -1, + 498091860, + 69702, + 499326419, + 498017631, + -1, + 499391953, + 499270377, + -1, + 499457479, + 499351886, + -1, + -57914, + 499422422, + 69736, + -1, + 499466066, + 69737, + 499654090, + 499415074, + -1, + -57911, + 499599741, + 69740, + -1, + 499659318, + 69741, + 499850701, + 499594022, + -1, + -57908, + 499803914, + 69738, + -1, + 499861727, + 69739, + -57906, + 499816711, + 69734, + -57905, + 499999492, + 69735, + -57904, + 500063682, + 69743, + -1, + 500116992, + 69742, + -57902, + 499345040, + 69704, + -1, + 500241339, + 69703, + 500440537, + 499285072, + -1, + -57899, + 500404314, + 69634, + -57898, + 500468784, + 69636, + -57897, + 500517485, + 69635, + -57896, + 500571598, + 69632, + -1, + 500634761, + 69633, + 500891647, + 500395420, + -1, + 500899293, + 500780279, + -1, + -57892, + 500852353, + 69709, + -1, + 500909293, + 69707, + 501095904, + 500836429, + -1, + -57889, + 501057938, + 69706, + -1, + 501121358, + 69705, + -1, + 501031905, + 69708, + -1, + 491537373, + 129504, + 501423592, + 491470941, + -1, + 501489126, + 501359967, + -1, + -57883, + 501430420, + 127753, + -1, + 501492685, + 128112, + -57881, + 501427589, + 128188, + -1, + 501620981, + 129521, + 501816812, + 501375077, + -1, + -57878, + 501768757, + 129529, + -57877, + 501828559, + 128148, + -1, + 501882552, + 129382, + 502136831, + 501754863, + -1, + -57874, + 502038365, + 129329, + -57873, + 502090474, + 983124, + -1, + 502146399, + 127838, + 502341237, + 491404037, + -1, + 502406702, + 502288809, + -1, + 502472184, + 502369845, + -1, + 502537719, + 502423755, + -1, + 502603254, + 502493004, + 72710, + -1, + 502558540, + 72711, + -1, + 502549751, + 72712, + -1, + 502468369, + 72746, + 502865406, + 502432078, + -1, + 502930940, + 502825294, + -1, + -57861, + 502872789, + 72729, + -1, + 502927121, + 72728, + -57859, + 502872789, + 72734, + -1, + 503058193, + 72733, + 503258627, + 502815575, + -1, + -57856, + 503224072, + 72727, + -57855, + 503274416, + 72732, + -57854, + 503330786, + 72722, + -1, + 503385873, + 72737, + 503586313, + 503194975, + -1, + 503651847, + 503522655, + -1, + -57850, + 503593685, + 72731, + -1, + 503648017, + 72730, + -57848, + 503593685, + 72736, + -1, + 503779089, + 72735, + 503979533, + 503516945, + 72704, + -57845, + 503941271, + 72717, + -57844, + 503988317, + 72715, + -1, + 504041233, + 72705, + 504241681, + 503937058, + -1, + -57841, + 504199326, + 72748, + -57840, + 504249045, + 72747, + -1, + 504303377, + 72749, + 504503827, + 504203415, + 72708, + -1, + 504465559, + 72709, + 504634902, + 504457425, + -1, + -57835, + 504576725, + 72739, + -1, + 504631057, + 72738, + 504831513, + 504580803, + -1, + -57832, + 504773333, + 72719, + -1, + 504827665, + 72718, + 505028124, + 504777205, + -1, + -57829, + 504969941, + 72726, + -1, + 505024273, + 72725, + 505224734, + 504971357, + 72706, + -1, + 505167965, + 72707, + 505355809, + 505165737, + -1, + -57824, + 505297621, + 72721, + -1, + 505351953, + 72720, + 505552420, + 505290039, + -1, + -57821, + 505494229, + 72724, + -1, + 505548561, + 72723, + 505749031, + 505485346, + -1, + -57818, + 505690837, + 72741, + -1, + 505745169, + 72740, + -57816, + 505714440, + 72743, + -57815, + 505900953, + 72744, + -57814, + 505962597, + 72716, + -57813, + 506025566, + 72742, + -57812, + 506088777, + 72745, + -57811, + 506149589, + 72750, + -1, + 506211167, + 72714, + 506404424, + 502358004, + -1, + 506469943, + 506364238, + -1, + 506535475, + 506433817, + -1, + -57806, + 506486885, + 72795, + -1, + 506540003, + 72804, + 506732086, + 506477255, + -1, + -57803, + 506687938, + 72796, + -1, + 506742753, + 72805, + -1, + 506670830, + 72803, + 506994236, + 506427426, + -1, + 507059770, + 506939773, + 72799, + -1, + 507021435, + 72808, + 507248639, + 506999350, + 72800, + -1, + 507152507, + 72809, + 507321923, + 506934054, + -1, + 507387456, + 507273317, + -1, + -57793, + 507350240, + 72797, + -1, + 507410403, + 72806, + 507641855, + 507330653, + -1, + -57790, + 507547245, + 72798, + -1, + 507590548, + 72807, + 507780677, + 507272642, + 72802, + -1, + 507742331, + 72811, + 507911751, + 507719168, + 72801, + -1, + 507877037, + 72810, + -1, + 507863812, + 72794, + 508108375, + 506368248, + -1, + 508173901, + 508072062, + -1, + 508239436, + 508129100, + 72756, + -1, + 508194636, + 72757, + -1, + 508185847, + 72758, + 508436049, + 508104465, + -1, + -57777, + 508397719, + 72763, + -57776, + 508444765, + 72761, + -1, + 508497681, + 72751, + 508698195, + 508397719, + 72754, + -1, + 508659863, + 72755, + 508829269, + 508641373, + 72752, + -1, + 508772445, + 72753, + -57770, + 508780645, + 72762, + -1, + 508898143, + 72760, + 509091432, + 508044639, + -1, + 509156966, + 509035241, + -1, + 509222492, + 509116750, + -1, + -57765, + 509187286, + 72786, + -1, + 509230930, + 72787, + 509419103, + 509179938, + -1, + -57762, + 509364605, + 72790, + -1, + 509424182, + 72791, + 509615714, + 509358886, + -1, + -57759, + 509568778, + 72788, + -1, + 509626591, + 72789, + -57757, + 509581575, + 72784, + -57756, + 509764356, + 72785, + -57755, + 509828546, + 72793, + -1, + 509881856, + 72792, + -57753, + 509109904, + 72770, + -1, + 510006203, + 72769, + 510205552, + 509049936, + -1, + 510271084, + 510169089, + -1, + -57749, + 510228802, + 72766, + -1, + 510292031, + 72767, + 510467695, + 510201617, + -1, + -57746, + 510430794, + 72768, + -1, + 510484541, + 72765, + -1, + 510401998, + 72764, + 510729843, + 510146624, + -1, + -57742, + 510659058, + 72773, + -1, + 510724438, + 72772, + -57740, + 510694800, + 72771, + -1, + 510869528, + 72812, + 511057622, + 502287607, + -1, + 511123152, + 510988296, + -1, + 511188611, + 511072245, + -1, + 511254138, + 511151131, + 9206, + -1, + 511181120, + 11205, + 511385213, + 511212819, + -1, + -57732, + 511333790, + 128927, + -1, + 511387605, + 128921, + 511581823, + 511341709, + 9205, + -1, + 511508800, + 11208, + 511712897, + 511529109, + 9204, + -1, + 511639872, + 11207, + 511901695, + 511650372, + 9207, + -1, + 511770944, + 11206, + 511975058, + 511122743, + -1, + 512040593, + 511937914, + -1, + 512106120, + 512003222, + -1, + -57721, + 512062668, + 11179, + -1, + 512119037, + 11178, + 512302731, + 512062652, + -1, + -57718, + 512265379, + 11181, + -1, + 512305832, + 11183, + 512499342, + 512250094, + -1, + -57715, + 512461987, + 11180, + -1, + 512502440, + 11182, + 512753663, + 512436848, + -1, + -57712, + 512652492, + 11177, + -1, + 512708861, + 11176, + -1, + 511985504, + 9210, + 512958108, + 511932450, + -1, + 513023639, + 512913057, + -1, + -57707, + 512964074, + 9209, + -57706, + 513023747, + 11200, + -1, + 513088800, + 128306, + 513285786, + 512971610, + -1, + -57703, + 513244834, + 128909, + -1, + 513286190, + 128900, + -57701, + 513232053, + 128369, + -1, + 513413356, + 9984, + 513613478, + 512913228, + -1, + 513679013, + 513557086, + -1, + 513744547, + 513607838, + -1, + 513810081, + 513681839, + 9193, + -1, + 513738683, + 9197, + -57694, + 513771160, + 9199, + -1, + 513886222, + 128898, + -57692, + 513708466, + 11166, + -1, + 513999874, + 128413, + -1, + 513631707, + 127990, + 514268849, + 513549663, + -1, + 514334381, + 514222218, + -1, + 514399915, + 514263198, + -1, + -57686, + 514344974, + 128899, + -1, + 514402735, + 9196, + -57684, + 514363826, + 11167, + -1, + 514524162, + 128419, + 514727600, + 514277655, + -1, + -57681, + 514679469, + 11230, + -1, + 514727683, + 11201, + -1, + 514684683, + 127778, + 514989752, + 514215867, + -1, + 515055286, + 514918558, + -1, + 515120821, + 514992559, + 9194, + -1, + 515049403, + 9198, + -1, + 515065870, + 128896, + -57673, + 515019186, + 11164, + -1, + 515245058, + 128412, + 515448510, + 514952074, + -1, + 515514044, + 515377310, + -1, + -57669, + 515459086, + 128897, + -1, + 515516847, + 9195, + -57667, + 515477938, + 11165, + -1, + 515638274, + 128418, + 515841732, + 515408206, + -1, + 515907267, + 515786482, + -1, + -57663, + 515866274, + 128908, + -57662, + 515921310, + 128925, + -1, + 515975125, + 128919, + -1, + 515860173, + 128383, + 516234951, + 515805099, + -1, + -57658, + 516183454, + 128926, + -1, + 516237269, + 128920, + 516431562, + 516188369, + -1, + -57655, + 516394431, + 128392, + -1, + 516435848, + 127986, + 516628173, + 516373191, + -1, + -57652, + 516566036, + 128420, + -1, + 516625712, + 128426, + -57650, + 516583208, + 10067, + -57649, + 516776183, + 11204, + -1, + 516830671, + 128447, + 517021395, + 511085106, + -1, + -57646, + 516963554, + 128153, + -1, + 517020643, + 128216, + 517275647, + 516972645, + -1, + -57643, + 517182127, + 128033, + -1, + 517242664, + 127804, + 517414654, + 511008869, + -1, + 517480161, + 517361379, + -1, + 517545691, + 517444277, + -1, + -57638, + 517504674, + 128912, + -1, + 517546030, + 128902, + 517742302, + 517503010, + -1, + -57635, + 517687691, + 128951, + -1, + 517739203, + 128939, + -57633, + 517683799, + 128932, + -57632, + 517879070, + 128945, + -1, + 517942815, + 128957, + 518135527, + 517434503, + -1, + -57629, + 518101313, + 12730, + -57628, + 518152340, + 12590, + -57627, + 518217299, + 12591, + -57626, + 518279831, + 12729, + -1, + 518338854, + 12728, + 518528750, + 518099225, + -1, + 518594285, + 518474999, + -1, + 518659820, + 518520832, + -1, + -57621, + 518624316, + 129379, + -1, + 518676797, + 128335, + -1, + 518604026, + 127923, + -1, + 518520869, + 127993, + 518987506, + 518480317, + 128366, + 519053041, + 518936387, + 128278, + -1, + 518980797, + 128209, + -1, + 519010338, + 128218, + 519249652, + 518952621, + 128102, + -1, + 519207030, + 128713, + 519380726, + 519212250, + 128144, + -1, + 519308070, + 127893, + 519511801, + 519341927, + -1, + -57608, + 519463480, + 11211, + -1, + 519524161, + 127870, + 519708411, + 519460372, + 983258, + -1, + 519641122, + 128163, + -57604, + 519673446, + 129354, + -57603, + 519789713, + 129460, + -1, + 519836912, + 128023, + 520036122, + 517352287, + -1, + 520101643, + 519986007, + -1, + 520167176, + 520042528, + -1, + 520232708, + 520114601, + -1, + -57597, + 520195746, + 2556, + -1, + 520244226, + 983642, + 520429319, + 520163089, + -1, + -57594, + 520379966, + 2432, + -1, + 520427805, + 2557, + -1, + 520386824, + 2558, + 520749055, + 520126798, + -1, + -57590, + 520642663, + 127857, + -1, + 520683652, + 11102, + 520888084, + 520032017, + -1, + 520953615, + 520843084, + -1, + -57586, + 520890094, + 129492, + -1, + 520946126, + 128059, + 521150226, + 520902620, + -1, + -57583, + 521086811, + 127901, + -1, + 521147998, + 127900, + -57581, + 521110766, + 128147, + -1, + 521281351, + 127958, + 521477912, + 520834295, + 983055, + 521601023, + 521424119, + 128276, + -57577, + 521486051, + 128718, + -1, + 521536952, + 128277, + -57575, + 521416837, + 127866, + -1, + 521676127, + 128719, + 521871142, + 519997591, + -1, + 521936672, + 521828386, + 128652, + 522002207, + 521896270, + -1, + -57570, + 521959463, + 128101, + -1, + 521994830, + 128100, + -1, + 521929893, + 128655, + 522264354, + 521884675, + 128363, + -1, + 522192784, + 128364, + -57565, + 522225541, + 129419, + -57564, + 522352529, + 127791, + -57563, + 522404722, + 127959, + -1, + 522467241, + 128027, + 522657586, + 521814109, + -1, + 522723114, + 522612556, + -1, + -57559, + 522683190, + 127874, + -1, + 522724703, + 128038, + 522919725, + 522671059, + -1, + -57556, + 522862904, + 127921, + -1, + 522923187, + 129506, + 523116336, + 522855770, + -1, + -57553, + 523061329, + 128692, + -1, + 523119455, + 128690, + -57551, + 523076218, + 8383, + -1, + 523258936, + 128089, + 523444021, + 522622637, + -1, + -57548, + 523409583, + 983267, + -1, + 523469448, + 983257, + -57546, + 523401250, + 983057, + -1, + 523594502, + 983125, + 523772824, + 426122551, + -1, + 523837624, + 523733143, + -1, + 523903144, + 523787517, + -1, + 523968660, + 523861072, + -1, + 524033961, + 523914487, + -1, + 524099486, + 523964177, + -1, + 524165019, + 524045073, + -1, + 524230491, + 524094665, + -1, + 524296013, + 524159468, + 75009, + 524419071, + 524223796, + -1, + 524427077, + 524322967, + -1, + -57533, + 524384234, + 75019, + -57532, + 524428639, + 75018, + -1, + 524487154, + 75017, + 524689224, + 524386638, + -1, + -57529, + 524626783, + 75016, + -1, + 524686576, + 75015, + -57527, + 524635465, + 75014, + -57526, + 524831917, + 75013, + -57525, + 524888873, + 75012, + -57524, + 524949638, + 75011, + -1, + 525014646, + 75010, + 525213529, + 524225561, + 75021, + 525336575, + 525141300, + -1, + 525344594, + 525240471, + -1, + -57519, + 525301738, + 75030, + -1, + 525346143, + 75029, + 525541204, + 525288156, + 75024, + -1, + 525468184, + 75025, + -57515, + 525499233, + 75028, + -57514, + 525625754, + 75027, + -57513, + 525688229, + 75026, + -57512, + 525744098, + 75023, + -1, + 525806353, + 75022, + -57510, + 525142909, + 75020, + -1, + 525928787, + 75008, + 526131056, + 524159875, + -1, + 526196582, + 526060419, + -1, + 526262117, + 526126726, + 74993, + 526385151, + 526189876, + -1, + 526393186, + 526281078, + -1, + -57503, + 526346624, + 74997, + -1, + 526407153, + 74996, + -57501, + 526354714, + 74998, + -57500, + 526533340, + 74995, + -1, + 526596707, + 74994, + -1, + 526190934, + 74992, + 526851947, + 526126726, + -1, + -57496, + 526781471, + 75006, + -57495, + 526846666, + 75005, + -57494, + 526911986, + 75004, + -1, + 526977222, + 75003, + 527179630, + 526781471, + -1, + -57491, + 527109473, + 75000, + -1, + 527173830, + 74999, + -57489, + 527109763, + 75002, + -1, + 527306220, + 75001, + 527507327, + 526059718, + -1, + 527572852, + 527437319, + -1, + -57485, + 527501721, + 74974, + -1, + 527567046, + 74973, + 527769463, + 527502367, + -1, + -57482, + 527698262, + 74970, + -1, + 527763654, + 74969, + 527966074, + 527698418, + -1, + -57479, + 527895583, + 74967, + -1, + 527960406, + 74966, + -57477, + 527896330, + 74975, + -57476, + 528092658, + 74972, + -57475, + 528158043, + 74971, + -57474, + 528223085, + 74968, + -1, + 528288080, + 74965, + 528490379, + 527436274, + -1, + 528555908, + 528419314, + -1, + -57470, + 528485895, + 74982, + -57469, + 528550943, + 74981, + -1, + 528615622, + 74980, + 528818055, + 528485577, + -1, + -57466, + 528747721, + 74985, + -1, + 528813087, + 74984, + 529014666, + 528746838, + -1, + -57463, + 528944774, + 74979, + -1, + 529008838, + 74978, + -1, + 528944000, + 74983, + 529276820, + 528419530, + -1, + 529342352, + 529206147, + -1, + -57458, + 529272327, + 74988, + -57457, + 529337697, + 74987, + -1, + 529402570, + 74986, + 529604499, + 529272327, + -1, + -57454, + 529533827, + 74990, + -1, + 529599178, + 74989, + -1, + 529534719, + 74991, + 529866647, + 529206625, + -1, + -57450, + 529796124, + 75032, + -1, + 529861307, + 75031, + 530063258, + 529795414, + -1, + -57447, + 529992726, + 74977, + -1, + 530058093, + 74976, + -1, + 529992897, + 75007, + 530382847, + 524105705, + -1, + -57443, + 530290989, + 74964, + -1, + 530332036, + 74632, + 530579455, + 524060941, + -1, + 530587559, + 530482377, + -1, + 530653090, + 530540914, + 75036, + -1, + 530580455, + 75037, + -57437, + 530612791, + 75038, + -57436, + 530742255, + 74635, + -57435, + 530791238, + 75035, + -57434, + 530854233, + 74634, + -1, + 530917424, + 75034, + -57432, + 530545534, + 74633, + -1, + 531053212, + 75033, + 531242977, + 523969887, + -1, + 531308499, + 531204247, + -1, + 531374034, + 531249074, + -1, + 531439538, + 531320055, + -1, + 531505073, + 531369745, + -1, + 531570608, + 531453460, + 74911, + -1, + 531498300, + 74912, + -1, + 531516180, + 74910, + -1, + 531466882, + 74913, + 531832760, + 531385027, + -1, + 531898295, + 531794071, + -1, + 531963830, + 531856376, + 74908, + -1, + 531891162, + 74909, + -1, + 531918668, + 74907, + -1, + 531830418, + 74906, + 532225981, + 531773353, + -1, + 532291516, + 532168797, + 74900, + -57413, + 532249224, + 74902, + -1, + 532311953, + 74901, + -1, + 532221713, + 74899, + 532553665, + 532174356, + -1, + -57409, + 532496477, + 74916, + -57408, + 532558124, + 74915, + -1, + 532616822, + 74914, + 532815813, + 532483857, + -1, + 532881348, + 532773512, + 74894, + -1, + 532807874, + 74895, + -1, + 532832129, + 74893, + 533077960, + 532772898, + -1, + -57401, + 533020782, + 74920, + -1, + 533085323, + 74919, + 533274571, + 533019335, + -1, + -57398, + 533217373, + 74904, + -1, + 533270289, + 74903, + 533471182, + 533210463, + -1, + -57395, + 533433120, + 74897, + -1, + 533480413, + 74896, + -57393, + 533424935, + 74918, + -57392, + 533618085, + 74917, + -57391, + 533676768, + 74905, + -1, + 533737687, + 74898, + -1, + 531306535, + 74614, + 533995482, + 531251293, + -1, + 534061017, + 533943828, + -1, + 534126552, + 533988660, + -1, + -57385, + 534087883, + 74891, + -1, + 534135516, + 74890, + -1, + 534055573, + 74892, + -1, + 534018725, + 74613, + 534511615, + 533925649, + -1, + 534519776, + 534394793, + -1, + 534585311, + 534446080, + -1, + -57378, + 534545616, + 74889, + -1, + 534596669, + 74611, + -1, + 534514378, + 74612, + -1, + 534447431, + 74888, + 534913033, + 531183529, + -1, + 534978560, + 534843153, + -1, + 535044095, + 534907505, + -1, + 535109608, + 534994065, + 74948, + 535232511, + 535036883, + -1, + -57369, + 535116164, + 74950, + -1, + 535178204, + 74949, + 535371756, + 535055607, + -1, + 535437291, + 535302858, + 74944, + -1, + 535364924, + 74945, + -1, + 535399039, + 74946, + 535633904, + 535312354, + 74939, + 535756799, + 535588696, + -1, + -57361, + 535649425, + 74941, + -1, + 535701414, + 74940, + 535896053, + 535569759, + -1, + 535961588, + 535857761, + -1, + -57357, + 535907174, + 74937, + -1, + 535970528, + 74936, + -1, + 535905189, + 74935, + 536223736, + 535826193, + -1, + -57353, + 536181453, + 74618, + -1, + 536238951, + 74617, + -57351, + 536189221, + 74952, + -57350, + 536378288, + 74951, + -57349, + 536435521, + 74947, + -57348, + 536497357, + 74943, + -57347, + 536558296, + 74942, + -57346, + 536621236, + 74938, + -1, + 536680599, + 74934, + -1, + 534976566, + 74953, + 536944643, + 534939799, + -1, + -57342, + 536880534, + 74957, + -1, + 536939140, + 74956, + 537141254, + 536887389, + -1, + -57339, + 537098929, + 74955, + -1, + 537147305, + 74620, + 537395199, + 537078623, + -1, + -57336, + 537295841, + 74954, + -1, + 537332408, + 74619, + 537534496, + 534862679, + -1, + 537600027, + 537478109, + 74639, + 537665562, + 537536001, + -1, + 537731087, + 537626775, + 75050, + -57330, + 537688042, + 75052, + -1, + 537723898, + 75051, + 537927699, + 537671593, + -1, + 537993234, + 537870429, + 74642, + -1, + 537950856, + 75043, + -1, + 537955001, + 75044, + -57324, + 537880973, + 75049, + -57323, + 538138483, + 75048, + -57322, + 538201525, + 75047, + -57321, + 538266585, + 75046, + -57320, + 538328498, + 75045, + -57319, + 538388480, + 75042, + -1, + 538450078, + 74641, + -1, + 537595526, + 74640, + 538714143, + 537561352, + -1, + -57315, + 538673890, + 983260, + -57314, + 538736446, + 74643, + -1, + 538798094, + 983261, + -1, + 538644309, + 74638, + 539041844, + 537479962, + -1, + 539107379, + 538969396, + -1, + 539172902, + 539068567, + -1, + 539238437, + 539127628, + 74963, + -1, + 539167218, + 74631, + -1, + 539166074, + 74962, + 539435049, + 539113385, + -1, + -57304, + 539396617, + 74625, + -1, + 539445233, + 74624, + 539631660, + 539365137, + -1, + -57301, + 539589347, + 74623, + -1, + 539647873, + 74622, + -57299, + 539592598, + 74630, + -57298, + 539786237, + 74629, + -57297, + 539846923, + 74628, + -57296, + 539907585, + 74627, + -57295, + 539970330, + 74961, + -57294, + 540032437, + 74626, + -1, + 540089537, + 74960, + -1, + 539060438, + 74607, + 540352585, + 538979167, + -1, + 540418116, + 540317954, + -1, + 540483647, + 540375919, + -1, + 540549177, + 540432336, + 74930, + -1, + 540506146, + 74931, + 540680251, + 540495177, + 74928, + -1, + 540626167, + 74929, + -57284, + 540639394, + 74932, + -57283, + 540754656, + 74927, + -57282, + 540818866, + 74926, + -1, + 540874358, + 74925, + 541130751, + 540443849, + -1, + 541139011, + 541030434, + -1, + -57278, + 541100183, + 74933, + -1, + 541146251, + 74616, + -1, + 541080190, + 74615, + 541401159, + 540346993, + -1, + -57274, + 541354354, + 74922, + -1, + 541412553, + 74921, + -57272, + 541358801, + 74924, + -1, + 541553972, + 74923, + 541728861, + 540309538, + -1, + 541794389, + 541670087, + -1, + 541859921, + 541731681, + -1, + 541925456, + 541813750, + -1, + -57266, + 541882673, + 75061, + -57265, + 541940709, + 75060, + -1, + 541999099, + 75059, + -1, + 541878347, + 75058, + 542253140, + 541821201, + -1, + -57261, + 542190559, + 75063, + -1, + 542255900, + 75062, + -1, + 542183256, + 75057, + 542515292, + 541724970, + -1, + 542580827, + 542475465, + -1, + -57256, + 542540343, + 75056, + -57255, + 542604078, + 75055, + -57254, + 542655200, + 74646, + -1, + 542715630, + 75054, + -1, + 542522027, + 75053, + -1, + 542458062, + 75064, + 543039593, + 541690007, + -1, + 543105127, + 542994252, + -1, + 543170660, + 543066306, + -1, + 543236195, + 543116535, + -1, + -57246, + 543197477, + 75072, + -1, + 543232484, + 75071, + -1, + 543172208, + 75070, + 543555583, + 543099380, + -1, + -57242, + 543458522, + 75069, + -1, + 543508131, + 75068, + -57240, + 543053374, + 74648, + -1, + 543622519, + 74649, + 543826034, + 542969617, + -1, + 543891568, + 543758370, + -1, + 543957103, + 543819060, + -1, + 544022638, + 543907897, + 74608, + -1, + 543950019, + 74880, + -1, + 543980536, + 74881, + -1, + 543885946, + 74609, + -57231, + 543840053, + 74610, + -1, + 544220623, + 74882, + 544415866, + 543774228, + -1, + 544481400, + 544378275, + -1, + 544546935, + 544408465, + -1, + -57226, + 544492336, + 75041, + -1, + 544552930, + 75040, + -1, + 544475979, + 74637, + -57223, + 544424068, + 75039, + -1, + 544747847, + 74636, + 544940162, + 544348194, + -1, + 545005697, + 544870161, + -1, + 545071232, + 544947268, + -1, + -57218, + 545036410, + 74886, + -57217, + 545086885, + 74885, + -1, + 545132425, + 74884, + -1, + 545007037, + 74883, + -1, + 544966830, + 74887, + 545464456, + 544899406, + -1, + 545529990, + 545426164, + -1, + -57211, + 545489853, + 75067, + -1, + 545536043, + 75066, + -57209, + 545472748, + 74647, + -1, + 545657323, + 75065, + 545857677, + 545429624, + -1, + 545923212, + 545818775, + -1, + -57205, + 545852551, + 75075, + -1, + 545915834, + 75074, + -1, + 545853280, + 75073, + 546185361, + 545798855, + -1, + -57201, + 546147747, + 74621, + -57200, + 546193584, + 74959, + -1, + 546246449, + 74958, + 546504703, + 546138321, + -1, + -57197, + 546391882, + 74645, + -1, + 546451787, + 74644, + 546644135, + 523919403, + -1, + 546709661, + 546581343, + -1, + 546775196, + 546655713, + -1, + 546840730, + 546714406, + -1, + -57191, + 546792910, + 74855, + -1, + 546849272, + 74856, + -57189, + 546801776, + 74854, + -1, + 546988894, + 74853, + -1, + 546718343, + 74861, + 547233952, + 546666530, + -1, + -57185, + 547178922, + 74859, + -1, + 547238482, + 74860, + 547430563, + 547185416, + -1, + -57182, + 547385030, + 74851, + -1, + 547437437, + 74852, + 547627174, + 547369766, + -1, + -57179, + 547579764, + 74857, + -1, + 547637578, + 74858, + -1, + 547577310, + 74862, + -1, + 546598362, + 74868, + 547954863, + 523857740, + -1, + 548020396, + 547909452, + -1, + -57173, + 547985074, + 127835, + -1, + 548024111, + 128177, + 548274175, + 547966199, + -1, + -57170, + 548181718, + 10160, + -1, + 548226484, + 129356, + 548413619, + 547907793, + -1, + -57167, + 548356524, + 11232, + -57166, + 548412796, + 129473, + -1, + 548472738, + 129380, + 548675766, + 548372274, + -1, + -57163, + 548627106, + 128707, + -1, + 548672812, + 127854, + -57161, + 548635059, + 129385, + -1, + 548807886, + 129362, + 549003674, + 523778759, + -1, + 549069097, + 548940639, + -1, + 549134627, + 549023564, + -1, + 549200160, + 549085665, + -1, + 549265695, + 549158183, + -1, + 549331151, + 549224782, + -1, + 549396677, + 549287970, + -1, + -57152, + 549359157, + 43960, + -57151, + 549423255, + 43959, + -57150, + 549478501, + 43958, + -57149, + 549535837, + 43957, + -57148, + 549595999, + 43956, + -1, + 549654289, + 43955, + 549855436, + 549342455, + -1, + -57145, + 549817909, + 43954, + -57144, + 549882007, + 43953, + -57143, + 549937253, + 43952, + -57142, + 549994589, + 43951, + -57141, + 550054751, + 43950, + -1, + 550113041, + 43949, + -57139, + 549797981, + 43944, + -57138, + 550251359, + 43942, + -1, + 550309649, + 43940, + 550510806, + 549287970, + 43933, + -57135, + 550473269, + 43938, + -57134, + 550537367, + 43937, + -57133, + 550592613, + 43936, + -57132, + 550649949, + 43935, + -57131, + 550710111, + 43934, + -1, + 550768401, + 43932, + 550969566, + 550460247, + -1, + 551035097, + 550899473, + 43918, + -1, + 550976199, + 43920, + -57126, + 550997557, + 43925, + -57125, + 551127191, + 43924, + -57124, + 551182437, + 43923, + -57123, + 551239773, + 43922, + -1, + 551299935, + 43921, + 551493862, + 550910663, + -1, + -57120, + 551456309, + 43906, + -57119, + 551520407, + 43905, + -57118, + 551575653, + 43904, + -57117, + 551639984, + 43919, + -57116, + 551698525, + 43903, + -57115, + 551758687, + 43902, + -1, + 551816977, + 43901, + 552018158, + 551429471, + -1, + -57112, + 551980597, + 43947, + -57111, + 552044695, + 43946, + -57110, + 552099941, + 43945, + -57109, + 552160585, + 43948, + -57108, + 552222813, + 43943, + -57107, + 552282975, + 43941, + -1, + 552341265, + 43939, + 552542453, + 551982765, + -1, + -57104, + 552504885, + 5116, + -57103, + 552568983, + 5115, + -57102, + 552624229, + 5114, + -57101, + 552681565, + 5113, + -57100, + 552741727, + 5112, + -1, + 552800017, + 43967, + 553001212, + 552505625, + -1, + -57097, + 552963637, + 43966, + -57096, + 553027735, + 43965, + -57095, + 553082981, + 43964, + -57094, + 553140317, + 43963, + -57093, + 553200479, + 43962, + -1, + 553258769, + 43961, + 553459971, + 552955495, + -1, + -57090, + 553422389, + 43931, + -57089, + 553486487, + 43930, + -57088, + 553541733, + 43929, + -57087, + 553599069, + 43928, + -57086, + 553659231, + 43927, + -1, + 553717521, + 43926, + 553918730, + 553408020, + -1, + -57083, + 553881141, + 5117, + -57082, + 553945239, + 43917, + -57081, + 554000485, + 43916, + -57080, + 554057821, + 43915, + -57079, + 554117983, + 43914, + -1, + 554176273, + 43913, + 554377489, + 553864439, + -1, + -57076, + 554339893, + 43912, + -57075, + 554403991, + 43911, + -57074, + 554459237, + 43910, + -57073, + 554516573, + 43909, + -57072, + 554576735, + 43908, + -1, + 554635025, + 43907, + 554836248, + 554317737, + -1, + -57069, + 554798645, + 43900, + -57068, + 554862743, + 43899, + -57067, + 554917989, + 43898, + -57066, + 554975325, + 43897, + -57065, + 555035487, + 43896, + -1, + 555093777, + 43894, + -57063, + 554798645, + 43893, + -57062, + 555255959, + 43892, + -57061, + 555311205, + 43891, + -57060, + 555371290, + 43895, + -57059, + 555434077, + 43890, + -57058, + 555494239, + 43889, + -1, + 555552529, + 43888, + -1, + 549212648, + 5109, + 555876351, + 549154636, + -1, + -57054, + 555783869, + 127800, + -1, + 555827674, + 127826, + 556015910, + 549071711, + -1, + -57051, + 555972994, + 129472, + -1, + 556037491, + 128227, + -57049, + 555974617, + 127792, + -57048, + 556166926, + 127937, + -1, + 556212543, + 128638, + 556409233, + 548998929, + -1, + 556474760, + 556354652, + -1, + 556540254, + 556421545, + -1, + 556605746, + 556499278, + -1, + 556671280, + 556564814, + -1, + -57041, + 556612322, + 69906, + -1, + 556666727, + 69905, + -57039, + 556612322, + 69911, + -1, + 556797799, + 69910, + 556998967, + 556555095, + -1, + -57036, + 556963595, + 69904, + -57035, + 557013974, + 69909, + -57034, + 557070309, + 69899, + -1, + 557125479, + 69914, + 557326653, + 556934495, + -1, + 557392187, + 557262175, + -1, + -57030, + 557333218, + 69908, + -1, + 557387623, + 69907, + -57028, + 557333218, + 69913, + -1, + 557518695, + 69912, + 557719872, + 557291181, + -1, + -57025, + 557684491, + 69920, + -1, + 557715303, + 69921, + 557916483, + 557672657, + -1, + -57022, + 557857506, + 69916, + -1, + 557911911, + 69915, + 558113094, + 557862135, + -1, + -57019, + 558054114, + 69956, + -1, + 558108519, + 69923, + 558309705, + 558058179, + -1, + -57016, + 558250722, + 69896, + -1, + 558305127, + 69895, + 558506316, + 558254581, + -1, + -57013, + 558447330, + 69903, + -1, + 558501735, + 69902, + 558702927, + 558446505, + -1, + -57010, + 558643938, + 69898, + -1, + 558698343, + 69897, + 558899538, + 558636343, + -1, + -57007, + 558840546, + 69901, + -1, + 558894951, + 69900, + 559096149, + 558831650, + -1, + -57004, + 559037154, + 69918, + -1, + 559091559, + 69917, + -57002, + 559059252, + 69924, + -57001, + 559253655, + 69893, + -57000, + 559315113, + 69925, + -56999, + 559378348, + 69922, + -56998, + 559437409, + 69919, + -56997, + 559497309, + 69892, + -56996, + 559561442, + 69926, + -56995, + 559623007, + 69894, + -1, + 559681383, + 69891, + 559882605, + 556502581, + -1, + 559948140, + 559835263, + -1, + 560013668, + 559877905, + 69927, + -56990, + 559974551, + 69935, + -56989, + 560021597, + 69933, + -1, + 560074513, + 69957, + 560275814, + 559974551, + 69930, + -1, + 560236695, + 69931, + 560406888, + 560226405, + 69934, + -1, + 560349277, + 69936, + 560537962, + 560349277, + 69928, + -1, + 560480349, + 69929, + 560726015, + 560474975, + 69932, + -1, + 560611421, + 69958, + -1, + 559892308, + 69939, + 560865662, + 559818079, + -1, + 560931196, + 560808681, + -1, + 560996722, + 560890190, + -1, + -56975, + 560960726, + 69944, + -1, + 561004370, + 69945, + 561193333, + 560953378, + -1, + -56972, + 561138045, + 69948, + -1, + 561197622, + 69949, + 561389944, + 561132326, + -1, + -56969, + 561342218, + 69946, + -1, + 561400031, + 69947, + -56967, + 561355015, + 69942, + -56966, + 561537796, + 69943, + -56965, + 561601986, + 69951, + -1, + 561655296, + 69950, + -56963, + 560883344, + 69954, + -1, + 561779643, + 69953, + 561979780, + 560822306, + -1, + 562045315, + 561922806, + -1, + -56959, + 562008154, + 69890, + -56958, + 562044366, + 69888, + -1, + 562107529, + 69889, + -1, + 561982619, + 69952, + -56955, + 561934106, + 69955, + -56954, + 562323589, + 69937, + -56953, + 562386533, + 69940, + -1, + 562436009, + 69938, + 562692095, + 556429132, + -1, + 562700685, + 562594254, + -1, + 562766220, + 562662597, + 128200, + -1, + 562692197, + 128185, + -1, + 562703054, + 128201, + 563019775, + 562630736, + 983058, + 563085311, + 562888704, + -1, + -56944, + 562992067, + 983139, + -1, + 563051121, + 983136, + 563224982, + 556351581, + -1, + 563290516, + 563171040, + 129490, + -1, + 563245637, + 128696, + -56939, + 563244044, + 128063, + -1, + 563355962, + 128020, + 563552665, + 563175525, + -1, + -56936, + 563506544, + 129378, + -1, + 563552734, + 127851, + -1, + 563508806, + 127876, + 563815046, + 548954213, + -1, + 563880505, + 563762708, + -1, + 563946038, + 563812965, + -1, + 564011489, + 563885993, + -1, + 564077008, + 563957151, + -1, + 564142504, + 564041389, + -1, + 564208037, + 564079455, + -1, + 564273572, + 564162380, + -1, + -56925, + 564234391, + 122911, + -1, + 564281437, + 122912, + -1, + 564232333, + 122885, + -56922, + 564168855, + 122915, + -56921, + 564486245, + 122918, + -1, + 564533033, + 122913, + 564732334, + 564084829, + 122891, + 564797868, + 564684302, + -1, + -56917, + 564755881, + 122919, + -1, + 564795959, + 122921, + -56915, + 564762892, + 122889, + -1, + 564944416, + 122890, + 565125556, + 564688930, + -1, + 565191090, + 565066439, + -1, + -56911, + 565150166, + 122907, + -1, + 565186321, + 122910, + -56909, + 565139227, + 122916, + -1, + 565335264, + 122900, + 565518775, + 565090424, + -1, + -56906, + 565460618, + 122886, + -1, + 565522152, + 122888, + 565715386, + 565477710, + -1, + -56903, + 565678340, + 122901, + -1, + 565738498, + 122908, + 565911997, + 565654310, + -1, + -56900, + 565868121, + 122903, + -1, + 565921915, + 122922, + 566108608, + 565847391, + -1, + -56897, + 566059206, + 122884, + -1, + 566119011, + 122892, + 566305219, + 566040610, + -1, + -56894, + 566266549, + 122881, + -1, + 566313472, + 122920, + -56892, + 566267549, + 122882, + -56891, + 566463148, + 122902, + -56890, + 566523475, + 122899, + -56889, + 566586473, + 122898, + -56888, + 566649930, + 122897, + -56887, + 566713348, + 122896, + -56886, + 566778703, + 122895, + -56885, + 566842315, + 122894, + -56884, + 566905652, + 122893, + -56883, + 566967690, + 122904, + -56882, + 567032281, + 122883, + -56881, + 567091216, + 122909, + -1, + 567154718, + 122880, + 567410687, + 564031584, + -1, + 567419355, + 567289849, + -1, + 567484885, + 567378254, + -1, + -56876, + 567448790, + 70504, + -1, + 567492434, + 70505, + 567681496, + 567423782, + -1, + -56873, + 567633674, + 70506, + -1, + 567691487, + 70507, + -56871, + 567646471, + 70502, + -56870, + 567835863, + 70508, + -1, + 567894788, + 70503, + 568131583, + 567366057, + -1, + -56867, + 568037377, + 70515, + -56866, + 568092939, + 70516, + -56865, + 568155056, + 70514, + -56864, + 568216346, + 70513, + -1, + 568266513, + 70512, + 568467961, + 563956983, + -1, + 568533492, + 568399687, + -1, + 568599014, + 568494289, + -1, + -56859, + 568546072, + 7664, + -1, + 568600489, + 7668, + 568795625, + 568549516, + -1, + -56856, + 568742680, + 7661, + -1, + 568797097, + 7667, + 568992235, + 568727586, + 7656, + -1, + 568930683, + 7657, + 569123310, + 568921873, + -1, + -56851, + 569071014, + 7655, + -1, + 569116182, + 7666, + -56849, + 569086233, + 7665, + -56848, + 569276766, + 7658, + -56847, + 569338065, + 7662, + -56846, + 569396526, + 7660, + -56845, + 569455398, + 7659, + -1, + 569520455, + 7663, + 569769983, + 568476157, + -1, + 569778680, + 569644921, + -1, + -56841, + 569734016, + 65064, + -1, + 569790427, + 65063, + -1, + 569720796, + 6841, + 570040843, + 568401207, + -1, + 570106378, + 570005612, + -1, + 570171911, + 570053033, + -1, + 570237439, + 570136237, + -1, + -56834, + 570179677, + 42614, + -1, + 570241320, + 42617, + 570434049, + 570198167, + 42615, + -1, + 570379407, + 42612, + 570565123, + 570376285, + 42613, + -1, + 570517042, + 42655, + -56828, + 570523111, + 42618, + -56827, + 570647170, + 42619, + -56826, + 570702937, + 42616, + -1, + 570764664, + 42654, + 571015167, + 570131759, + -1, + -56823, + 570913653, + 65071, + -1, + 570970065, + 65070, + -1, + 570057697, + 65069, + 571220503, + 569976159, + -1, + 571286037, + 571170917, + -1, + 571351571, + 571246989, + -1, + 571417106, + 571277312, + -1, + -56816, + 571369960, + 6844, + -56815, + 571434211, + 6840, + -1, + 571492027, + 7676, + -1, + 571352429, + 6832, + -56812, + 571315380, + 6835, + -1, + 571703635, + 7672, + -56810, + 571228403, + 6833, + -1, + 571813527, + 7675, + 572006943, + 571170917, + -1, + 572072478, + 571952878, + -1, + -56806, + 572037362, + 66424, + -56805, + 572095641, + 66426, + -56804, + 572153099, + 66425, + -56803, + 572205149, + 66423, + -1, + 572265262, + 66422, + -1, + 572025474, + 6839, + 572531236, + 571965774, + -1, + 572596771, + 572474220, + -1, + -56798, + 572552064, + 65066, + -1, + 572608475, + 65065, + -1, + 572552662, + 6836, + 572858920, + 572484059, + -1, + -56794, + 572811348, + 6846, + -56793, + 572856684, + 6845, + -1, + 572919751, + 6843, + 573121067, + 572822337, + -1, + -56790, + 573061379, + 6838, + -1, + 573122227, + 7673, + 573317678, + 573068936, + -1, + -56787, + 573272960, + 65068, + -1, + 573329371, + 65067, + 573514289, + 573262758, + -1, + -56784, + 573469515, + 7670, + -1, + 573525947, + 7671, + -56782, + 573478427, + 6837, + -56781, + 573672461, + 7669, + -56780, + 573734985, + 6842, + -56779, + 573785329, + 6834, + -1, + 573839961, + 70459, + 574095359, + 563898577, + -1, + -56776, + 573993614, + 128476, + -1, + 574035619, + 129517, + 574235243, + 563833041, + -1, + 574300778, + 574194776, + -1, + 574366312, + 574238742, + -1, + 574431834, + 574316532, + -1, + 574497349, + 574390606, + -1, + 574562881, + 574460185, + -1, + -56768, + 574513261, + 66292, + -1, + 574566371, + 66283, + 574759492, + 574503623, + -1, + -56765, + 574714310, + 66293, + -1, + 574769121, + 66284, + -1, + 574697198, + 66282, + 575021644, + 574453794, + -1, + 575087177, + 574966141, + -1, + -56760, + 575047803, + 66287, + -1, + 575078958, + 66296, + 575340543, + 575025718, + -1, + -56757, + 575244411, + 66288, + -1, + 575275566, + 66297, + 575480403, + 574960422, + -1, + 575545936, + 575430757, + -1, + -56753, + 575507687, + 66294, + -1, + 575567843, + 66285, + 575799295, + 575488093, + -1, + -56750, + 575704692, + 66295, + -1, + 575747988, + 66286, + 575939158, + 575430082, + -1, + -56747, + 575899771, + 66290, + -1, + 575930926, + 66299, + 576135769, + 575876608, + -1, + -56744, + 576100013, + 66289, + -1, + 576127534, + 66298, + -1, + 576086806, + 66291, + 576397927, + 574367737, + -1, + 576463454, + 576356686, + -1, + -56739, + 576427222, + 66274, + -1, + 576470866, + 66275, + 576660065, + 576419874, + -1, + -56736, + 576604541, + 66278, + -1, + 576664118, + 66279, + 576856676, + 576598822, + -1, + -56733, + 576808714, + 66276, + -1, + 576866527, + 66277, + -56731, + 576807684, + 66273, + -56730, + 577002946, + 66281, + -1, + 577056256, + 66280, + -1, + 576357287, + 66272, + -56727, + 574324021, + 11507, + -1, + 577248774, + 11506, + -1, + 574265332, + 127279, + 577512055, + 574184279, + -1, + 577577584, + 577450790, + -1, + -56722, + 577539481, + 128533, + -56721, + 577595124, + 128534, + -1, + 577647007, + 127882, + 577839731, + 577537869, + -1, + -56718, + 577796682, + 983186, + -1, + 577850471, + 127899, + 578036342, + 577798274, + -1, + -56715, + 578000292, + 128119, + -1, + 578059339, + 128679, + -1, + 577998563, + 127978, + 578298492, + 577462717, + -1, + 578364027, + 578240605, + -1, + -56710, + 578313552, + 127859, + -1, + 578366303, + 127850, + -1, + 578301156, + 127834, + 578626174, + 578261273, + 128004, + -1, + 578552270, + 128046, + 578757249, + 578586775, + -1, + -56704, + 578710453, + 128145, + -1, + 578756400, + 128715, + 578953860, + 578690359, + -1, + -56701, + 578905166, + 129381, + -1, + 578964635, + 127864, + -56699, + 578901009, + 128165, + -1, + 579081935, + 129509, + 579281652, + 563744529, + -1, + 579347155, + 579242475, + -1, + 579412690, + 579293609, + -1, + 579478165, + 579345719, + -1, + 579543695, + 579418823, + -1, + 579609229, + 579473169, + 66873, + -1, + 579567950, + 66902, + -56690, + 579561632, + 66889, + -1, + 579682397, + 66890, + 579871378, + 579507976, + -1, + -56687, + 579835565, + 66891, + -1, + 579899673, + 66911, + 580124671, + 579800849, + -1, + -56684, + 580032587, + 66912, + -1, + 580087628, + 66882, + 580264603, + 579434530, + -1, + 580330138, + 580205255, + -1, + 580395673, + 580259601, + 66877, + -1, + 580340419, + 66896, + -1, + 580348064, + 66909, + -1, + 580268823, + 66906, + 580657825, + 580199775, + -1, + 580723359, + 580622456, + -1, + -56674, + 580687685, + 66895, + -1, + 580720634, + 66901, + -56672, + 580687639, + 66881, + -1, + 580851407, + 66867, + 581051046, + 580622456, + -1, + 581116581, + 580991687, + -1, + -56668, + 581059415, + 66871, + -1, + 581111569, + 66875, + -1, + 581047653, + 66869, + 581378730, + 581009742, + -1, + -56664, + 581343045, + 66899, + -56663, + 581388665, + 66908, + -1, + 581441109, + 66872, + 581640878, + 581320797, + -1, + -56660, + 581604494, + 66910, + -56659, + 581660861, + 66876, + -1, + 581722195, + 66879, + 581903025, + 581605037, + -1, + -56656, + 581855355, + 66874, + -1, + 581900294, + 66913, + 582099636, + 581856815, + -1, + -56653, + 582063789, + 66887, + -1, + 582119244, + 66893, + 582296247, + 582052049, + -1, + -56650, + 582240633, + 66914, + -1, + 582299374, + 66903, + 582492858, + 582241527, + -1, + -56647, + 582457328, + 66885, + -1, + 582488878, + 66878, + 582689469, + 582437571, + -1, + -56644, + 582633846, + 66915, + -1, + 582685936, + 66884, + 582886080, + 582633973, + -1, + -56641, + 582827854, + 66883, + -1, + 582883354, + 66897, + 583082691, + 582825897, + -1, + -56638, + 583025570, + 66866, + -1, + 583089569, + 66904, + 583279302, + 583019359, + -1, + -56635, + 583243851, + 66870, + -1, + 583276578, + 66868, + 583475913, + 583208721, + -1, + -56632, + 583427383, + 66888, + -1, + 583488945, + 66864, + -56630, + 583439933, + 66880, + -56629, + 583634936, + 66907, + -56628, + 583692392, + 66905, + -56627, + 583754406, + 66898, + -56626, + 583819060, + 66894, + -56625, + 583882545, + 66892, + -56624, + 583941542, + 66886, + -56623, + 584004489, + 66900, + -1, + 584063389, + 66865, + -1, + 579346663, + 66927, + 584327900, + 579296087, + 983098, + 584393431, + 584261360, + 983097, + -56618, + 584339125, + 128473, + -1, + 584384841, + 983170, + 584590042, + 584328543, + -1, + -56615, + 584554157, + 127852, + -1, + 584601380, + 128367, + -56613, + 584540458, + 128758, + -1, + 584735943, + 129387, + 584917734, + 584281932, + -1, + 584983265, + 584852833, + -1, + 585048800, + 584926291, + 128199, + -1, + 584974740, + 128450, + -1, + 584987688, + 128451, + 585245412, + 584937292, + -1, + -56605, + 585197039, + 129365, + -1, + 585253121, + 983073, + -56603, + 585197800, + 127887, + -1, + 585394063, + 127904, + 585573099, + 584876366, + 128008, + 585695231, + 585499086, + 128049, + 585760767, + 585565572, + -1, + -56598, + 585668063, + 128572, + -1, + 585728669, + 128569, + 585900783, + 585520660, + -1, + 585966318, + 585838742, + 128247, + -1, + 585893519, + 128248, + -1, + 585919289, + 127957, + 586162930, + 585846007, + -1, + -56591, + 586108153, + 129305, + -1, + 586166118, + 128197, + -56589, + 586115928, + 11839, + -1, + 586294459, + 127797, + 586490688, + 579226871, + -1, + 586556213, + 586440805, + -1, + 586621736, + 586490101, + -1, + 586687265, + 586547668, + -1, + 586752774, + 586645838, + -1, + 586818304, + 586715417, + -1, + 586883837, + 586768485, + -1, + -56580, + 586811582, + 128349, + -1, + 586875660, + 128337, + 587137023, + 586821308, + -1, + -56577, + 587008190, + 128359, + -1, + 587072268, + 128347, + 587277059, + 586760018, + -1, + -56574, + 587204798, + 128350, + -1, + 587268876, + 128338, + 587530239, + 587214574, + -1, + -56571, + 587401406, + 128357, + -1, + 587465484, + 128345, + 587670285, + 586709026, + -1, + 587735818, + 587614589, + -1, + -56567, + 587663550, + 128353, + -1, + 587727628, + 128341, + 587988991, + 587674166, + -1, + -56564, + 587860158, + 128354, + -1, + 587924236, + 128342, + 588129044, + 587608870, + -1, + 588194577, + 588080906, + -1, + -56560, + 588122302, + 128351, + -1, + 588186380, + 128339, + 588447743, + 588138719, + -1, + -56557, + 588318910, + 128352, + -1, + 588382988, + 128340, + 588587803, + 588065631, + -1, + 588653336, + 588534353, + -1, + -56553, + 588581054, + 128358, + -1, + 588645132, + 128346, + 588906495, + 588595806, + -1, + -56550, + 588777662, + 128355, + -1, + 588841740, + 128343, + 589046558, + 588538628, + -1, + -56547, + 588974270, + 128348, + -1, + 589038348, + 128336, + 589299711, + 588996034, + -1, + -56544, + 589170878, + 128356, + -1, + 589234956, + 128344, + 589496319, + 586650508, + -1, + 589505318, + 589394763, + -1, + 589570853, + 589468043, + 128257, + -1, + 589497810, + 128258, + -1, + 589496368, + 128472, + -56537, + 589465313, + 11118, + -1, + 589703807, + 128259, + 589898543, + 586578348, + -1, + 589964076, + 589846206, + -1, + -56533, + 589918189, + 128235, + -1, + 589976977, + 128234, + -56531, + 589925137, + 127746, + -56530, + 590107733, + 128272, + -1, + 590158819, + 128213, + 590357300, + 589859340, + -1, + -56527, + 590316995, + 127786, + -56526, + 590380514, + 127784, + -56525, + 590442472, + 127783, + -1, + 590500713, + 127785, + -1, + 590320785, + 129313, + 590750523, + 586485521, + -1, + 590816057, + 590703848, + -1, + -56520, + 590759189, + 128079, + -1, + 590819452, + 127916, + -56518, + 590774033, + 127963, + -1, + 590961387, + 128385, + 591200255, + 590692445, + -1, + 591209279, + 591093317, + -1, + -56514, + 591149537, + 129346, + -1, + 591206727, + 127867, + -1, + 591161925, + 128203, + 591471461, + 586454701, + -1, + 591536996, + 591426847, + -1, + 591602521, + 591494439, + -1, + 591668041, + 591561038, + -1, + 591733576, + 591598189, + -1, + -56506, + 591697720, + 7303, + -56505, + 591757957, + 7300, + -1, + 591805529, + 7302, + -1, + 591675332, + 7301, + 592061261, + 591603039, + -1, + -56501, + 592025928, + 1323, + -56500, + 592078492, + 42649, + -1, + 592125833, + 1325, + 592323408, + 592015180, + -1, + -56497, + 592275200, + 7296, + -1, + 592327314, + 42593, + 592520019, + 592259935, + -1, + -56494, + 592468865, + 1321, + -1, + 592530717, + 1327, + -56492, + 592483145, + 7299, + -56491, + 592677675, + 7304, + -56490, + 592739216, + 1319, + -56489, + 592796654, + 7298, + -56488, + 592860316, + 7297, + -1, + 592913510, + 42651, + 593166335, + 591535606, + -1, + 593175390, + 593044831, + -1, + -56484, + 593140040, + 1322, + -56483, + 593192604, + 42648, + -1, + 593239945, + 1324, + 593437537, + 593111903, + -1, + -56480, + 593386369, + 1320, + -1, + 593448221, + 1326, + -56478, + 593394576, + 1318, + -56477, + 593588941, + 42592, + -1, + 593634406, + 42650, + -1, + 591470973, + 127744, + 593896315, + 591425356, + 983074, + 593961840, + 593846373, + -1, + 594027373, + 593919683, + -1, + 594092908, + 593952768, + -1, + 594158443, + 594046080, + 128322, + -1, + 594085546, + 128321, + -1, + 594106179, + 10060, + -1, + 594029762, + 127884, + -56466, + 593990798, + 128081, + -56465, + 594364475, + 129360, + -1, + 594420174, + 128010, + 594617205, + 593925805, + -1, + 594682740, + 594560254, + -1, + -56461, + 594621261, + 128546, + -1, + 594681440, + 128575, + -1, + 594640744, + 128302, + 594944887, + 594559355, + 129431, + -1, + 594870475, + 127951, + 595075962, + 594881375, + -1, + -56455, + 595032403, + 127769, + -1, + 595077173, + 128179, + -1, + 595005318, + 129408, + 595338129, + 593838173, + -1, + 595403662, + 595292352, + -1, + 595469197, + 595349408, + -1, + 595534724, + 595403830, + -1, + 595600259, + 595473918, + 129282, + 595722239, + 595527044, + -1, + -56446, + 595626050, + 129281, + -1, + 595670620, + 129280, + -1, + 595553408, + 128320, + 595927945, + 595476573, + -1, + 595993480, + 595863319, + -1, + -56441, + 595929921, + 127568, + -1, + 595992237, + 127569, + -1, + 595942718, + 128712, + -56438, + 595891698, + 11198, + -56437, + 596215420, + 128981, + -56436, + 596278946, + 128983, + -1, + 596319196, + 11199, + -1, + 595430788, + 127914, + 596583312, + 595363978, + 127961, + -1, + 596508857, + 127750, + -1, + 596532486, + 127910, + 596779924, + 595282558, + -1, + -56429, + 596718374, + 64047, + -1, + 596781919, + 64046, + -56427, + 596737026, + 983187, + -56426, + 596916694, + 983200, + -56425, + 596979376, + 128328, + -1, + 597040941, + 983171, + 597239531, + 523717879, + -1, + 597304655, + 597180509, + -1, + 597370160, + 597252951, + -1, + 597435693, + 597306207, + -1, + 597501225, + 597366003, + -1, + 597566461, + 597432354, + -1, + 597631982, + 597493958, + -1, + 597697454, + 597559794, + -1, + 597762979, + 597625330, + 67090, + -56414, + 597710356, + 67092, + -1, + 597766950, + 67091, + 597959590, + 597690710, + 67087, + -56411, + 597906964, + 67089, + -1, + 597963558, + 67088, + 598156200, + 597887690, + 67093, + -1, + 598103572, + 67094, + -56407, + 598085254, + 67100, + -56406, + 598216199, + 67098, + -56405, + 598281569, + 67097, + -56404, + 598346953, + 67096, + -56403, + 598412163, + 67095, + -1, + 598476998, + 67086, + 598680504, + 597625887, + -1, + -56400, + 598609542, + 67123, + -56399, + 598674951, + 67122, + -56398, + 598740321, + 67121, + -56397, + 598805705, + 67120, + -56396, + 598871071, + 67119, + -56395, + 598936451, + 67118, + -56394, + 599001802, + 67117, + -56393, + 599066966, + 67116, + -1, + 599132358, + 67115, + 599335874, + 598608070, + -1, + -56390, + 599264902, + 67080, + -56389, + 599330311, + 67079, + -56388, + 599395681, + 67078, + -56387, + 599461065, + 67077, + -56386, + 599526431, + 67076, + -56385, + 599591811, + 67075, + -56384, + 599657162, + 67074, + -56383, + 599722482, + 67073, + -1, + 599787862, + 67072, + 599991243, + 599264131, + -1, + -56380, + 599920262, + 67114, + -56379, + 599985671, + 67113, + -56378, + 600051041, + 67112, + -56377, + 600116425, + 67111, + -56376, + 600181791, + 67110, + -56375, + 600247171, + 67109, + -56374, + 600312150, + 67108, + -1, + 600377542, + 67107, + 600581075, + 599919969, + -1, + -56371, + 600510086, + 67136, + -56370, + 600575495, + 67135, + -56369, + 600640865, + 67134, + -56368, + 600706249, + 67133, + -56367, + 600771459, + 67132, + -56366, + 600836810, + 67131, + -1, + 600901830, + 67130, + 601105370, + 600509959, + -1, + -56363, + 601034081, + 67142, + -56362, + 601099465, + 67141, + -56361, + 601164831, + 67140, + -56360, + 601229810, + 67139, + -56359, + 601295190, + 67138, + -1, + 601360582, + 67137, + 601564129, + 601033929, + -1, + -56356, + 601493126, + 67129, + -56355, + 601558369, + 67128, + -56354, + 601623753, + 67127, + -56353, + 601689119, + 67126, + -56352, + 601753942, + 67125, + -1, + 601819334, + 67124, + 602022888, + 601492170, + -1, + -56349, + 601951878, + 67106, + -56348, + 602017287, + 67105, + -56347, + 602082657, + 67104, + -56346, + 602147715, + 67103, + -56345, + 602212694, + 67102, + -1, + 602278086, + 67101, + 602537983, + 601950550, + -1, + -56342, + 602410337, + 67085, + -56341, + 602475721, + 67084, + -56340, + 602540746, + 67083, + -56339, + 602605910, + 67082, + -1, + 602671302, + 67081, + 602931199, + 597559638, + -1, + 602940403, + 602802674, + -1, + -56335, + 602868426, + 67148, + -56334, + 602933746, + 67147, + -1, + 602998982, + 67145, + 603202550, + 602869255, + -1, + -56331, + 603131399, + 67155, + -1, + 603195590, + 67154, + 603399161, + 603130736, + -1, + -56328, + 603330594, + 67150, + -1, + 603393809, + 67149, + -56326, + 603328258, + 67156, + -56325, + 603524591, + 67153, + -56324, + 603589982, + 67152, + -1, + 603654639, + 67144, + 603858008, + 597494815, + -1, + 603923465, + 603786759, + -1, + -56320, + 603852422, + 67324, + -56319, + 603917831, + 67323, + -56318, + 603983201, + 67322, + -56317, + 604048585, + 67321, + -56316, + 604113951, + 67320, + -56315, + 604179331, + 67319, + -56314, + 604244682, + 67318, + -56313, + 604310002, + 67317, + -56312, + 604375382, + 67316, + -1, + 604440774, + 67315, + 604644372, + 603852129, + -1, + -56309, + 604573318, + 67314, + -56308, + 604638727, + 67313, + -56307, + 604704097, + 67312, + -56306, + 604769481, + 67311, + -56305, + 604834847, + 67310, + -56304, + 604900227, + 67309, + -56303, + 604965578, + 67308, + -56302, + 605030898, + 67307, + -56301, + 605096278, + 67306, + -1, + 605161670, + 67305, + 605365278, + 604572703, + -1, + -56298, + 605294214, + 67298, + -56297, + 605359457, + 67297, + -56296, + 605424841, + 67296, + -56295, + 605490207, + 67295, + -56294, + 605555587, + 67294, + -56293, + 605620938, + 67293, + -56292, + 605686258, + 67292, + -56291, + 605751638, + 67291, + -1, + 605817030, + 67290, + 606020648, + 605293258, + -1, + -56288, + 605949574, + 67282, + -56287, + 606014983, + 67281, + -56286, + 606080353, + 67280, + -56285, + 606145737, + 67279, + -56284, + 606211103, + 67278, + -56283, + 606276483, + 67277, + -56282, + 606341618, + 67276, + -56281, + 606406998, + 67275, + -1, + 606472390, + 67274, + 606676018, + 605948402, + -1, + -56278, + 606604934, + 67273, + -56277, + 606670343, + 67272, + -56276, + 606735713, + 67271, + -56275, + 606801097, + 67270, + -56274, + 606866463, + 67269, + -56273, + 606931843, + 67268, + -56272, + 606997194, + 67267, + -56271, + 607062358, + 67266, + -1, + 607127750, + 67265, + 607331387, + 606603462, + -1, + -56268, + 607260294, + 67258, + -56267, + 607325703, + 67257, + -56266, + 607390921, + 67256, + -56265, + 607456287, + 67255, + -56264, + 607521667, + 67254, + -56263, + 607587018, + 67253, + -56262, + 607652338, + 67252, + -1, + 607717718, + 67251, + 607921219, + 607259523, + -1, + -56259, + 607850118, + 67289, + -56258, + 607915527, + 67288, + -56257, + 607980897, + 67287, + -56256, + 608046111, + 67286, + -56255, + 608111090, + 67285, + -56254, + 608176470, + 67284, + -1, + 608241862, + 67283, + 608445514, + 607850118, + -1, + -56251, + 608374279, + 67330, + -56250, + 608439497, + 67329, + -56249, + 608504863, + 67328, + -56248, + 608570243, + 67327, + -56247, + 608635378, + 67326, + -1, + 608700758, + 67325, + 608904273, + 608373961, + -1, + -56244, + 608833158, + 67304, + -56243, + 608898567, + 67303, + -56242, + 608963785, + 67302, + -56241, + 609029151, + 67301, + -56240, + 609094531, + 67300, + -1, + 609159882, + 67299, + 609419263, + 608831830, + -1, + -56237, + 609291465, + 67264, + -56236, + 609356831, + 67263, + -56235, + 609422026, + 67262, + -56234, + 609487346, + 67261, + -56233, + 609552726, + 67260, + -1, + 609618118, + 67259, + 609821870, + 603785930, + -1, + 609887335, + 609749334, + -1, + 609952862, + 609815242, + -1, + -56228, + 609885495, + 67173, + -56227, + 609949730, + 67172, + -1, + 610012945, + 67171, + -56225, + 609881734, + 67179, + -56224, + 610143751, + 67178, + -56223, + 610209121, + 67177, + -56222, + 610274505, + 67176, + -56221, + 610339871, + 67175, + -56220, + 610405251, + 67174, + -56219, + 610470386, + 67170, + -56218, + 610535766, + 67169, + -1, + 610601158, + 67168, + 610804852, + 609814726, + -1, + 610870380, + 610733702, + -1, + -56214, + 610802999, + 67167, + -56213, + 610867234, + 67166, + -1, + 610930449, + 67165, + -56211, + 610799111, + 67164, + -56210, + 611061089, + 67163, + -56209, + 611126473, + 67162, + -56208, + 611191839, + 67161, + -56207, + 611257219, + 67160, + -56206, + 611322570, + 67159, + -56205, + 611387890, + 67158, + -1, + 611453270, + 67157, + 611656831, + 610733257, + -1, + -56202, + 611585670, + 67229, + -56201, + 611651079, + 67228, + -56200, + 611716449, + 67227, + -56199, + 611781833, + 67226, + -56198, + 611847199, + 67225, + -56197, + 611912579, + 67224, + -56196, + 611977930, + 67223, + -56195, + 612043250, + 67222, + -56194, + 612108630, + 67221, + -1, + 612174022, + 67220, + 612377738, + 611585055, + -1, + -56191, + 612306566, + 67219, + -56190, + 612371975, + 67218, + -56189, + 612437345, + 67217, + -56188, + 612502729, + 67216, + -56187, + 612568095, + 67215, + -56186, + 612633475, + 67214, + -56185, + 612698826, + 67213, + -56184, + 612764146, + 67212, + -56183, + 612829526, + 67211, + -1, + 612894918, + 67210, + 613098645, + 612305795, + -1, + -56180, + 613027462, + 67209, + -56179, + 613092871, + 67208, + -56178, + 613158241, + 67207, + -56177, + 613223625, + 67206, + -56176, + 613288991, + 67205, + -56175, + 613354371, + 67204, + -56174, + 613419722, + 67203, + -56173, + 613485042, + 67202, + -56172, + 613550422, + 67201, + -1, + 613615814, + 67200, + 613819552, + 613026506, + -1, + -56169, + 613748358, + 67199, + -56168, + 613813767, + 67198, + -56167, + 613879137, + 67197, + -56166, + 613944521, + 67196, + -56165, + 614009887, + 67195, + -56164, + 614075267, + 67194, + -56163, + 614140618, + 67193, + -56162, + 614205938, + 67192, + -56161, + 614271318, + 67191, + -1, + 614336710, + 67190, + 614540459, + 613747186, + -1, + -56158, + 614469254, + 67189, + -56157, + 614534663, + 67188, + -56156, + 614600033, + 67187, + -56155, + 614665417, + 67186, + -56154, + 614730783, + 67185, + -56153, + 614796163, + 67184, + -56152, + 614861514, + 67183, + -56151, + 614926834, + 67182, + -56150, + 614992214, + 67181, + -1, + 615057606, + 67180, + 615317503, + 614468961, + -1, + -56147, + 615188822, + 67231, + -1, + 615254214, + 67230, + 615458026, + 609750217, + -1, + 615523514, + 615385430, + -1, + -56143, + 615452294, + 67348, + -56142, + 615517703, + 67347, + -56141, + 615583073, + 67346, + -56140, + 615648457, + 67345, + -56139, + 615713823, + 67344, + -56138, + 615779203, + 67343, + -56137, + 615844554, + 67342, + -56136, + 615909874, + 67341, + -56135, + 615975254, + 67340, + -1, + 616040646, + 67339, + 616244420, + 615451679, + -1, + -56132, + 616173190, + 67377, + -56131, + 616238599, + 67376, + -56130, + 616303969, + 67375, + -56129, + 616369353, + 67374, + -56128, + 616434719, + 67373, + -56127, + 616500099, + 67372, + -56126, + 616565450, + 67371, + -56125, + 616630770, + 67370, + -1, + 616696150, + 67369, + 616899790, + 616172018, + -1, + -56122, + 616828550, + 67357, + -56121, + 616893959, + 67356, + -56120, + 616959329, + 67355, + -56119, + 617024713, + 67354, + -56118, + 617089923, + 67353, + -56117, + 617155274, + 67352, + -56116, + 617220594, + 67351, + -56115, + 617285974, + 67350, + -1, + 617351366, + 67349, + 617555159, + 616827779, + -1, + -56112, + 617483910, + 67368, + -56111, + 617549319, + 67367, + -56110, + 617614537, + 67366, + -56109, + 617679903, + 67365, + -56108, + 617745283, + 67364, + -56107, + 617810634, + 67363, + -56106, + 617875954, + 67362, + -1, + 617941190, + 67361, + 618144992, + 617482438, + -1, + -56103, + 618073734, + 67338, + -56102, + 618139143, + 67337, + -56101, + 618204361, + 67336, + -56100, + 618269571, + 67335, + -56099, + 618334922, + 67334, + -56098, + 618400242, + 67333, + -56097, + 618465622, + 67332, + -1, + 618531014, + 67331, + 618734822, + 618073289, + -1, + -56094, + 618662787, + 67382, + -56093, + 618728138, + 67381, + -56092, + 618793458, + 67380, + -56091, + 618858838, + 67379, + -1, + 618924230, + 67378, + 619184127, + 618662602, + -1, + -56088, + 619056647, + 67360, + -56087, + 619122017, + 67359, + -1, + 619187075, + 67358, + 619390213, + 615386465, + -1, + 619455739, + 619317446, + -1, + 619521267, + 619384454, + -1, + 619586802, + 619448349, + -1, + -56081, + 619515138, + 67404, + -56080, + 619580331, + 67403, + -56079, + 619645718, + 67402, + -1, + 619711012, + 67401, + -1, + 619512426, + 67400, + -56076, + 619449914, + 67399, + -56075, + 619908496, + 67398, + -56074, + 619973858, + 67397, + -56073, + 620039211, + 67396, + -56072, + 620104591, + 67395, + -56071, + 620169938, + 67394, + -56070, + 620235255, + 67393, + -1, + 620300632, + 67392, + 620504323, + 619383126, + -1, + -56067, + 620432749, + 67411, + -56066, + 620497958, + 67410, + -56065, + 620563337, + 67409, + -56064, + 620628798, + 67408, + -56063, + 620694181, + 67407, + -56062, + 620759502, + 67406, + -1, + 620824885, + 67405, + -56060, + 620432247, + 67413, + -1, + 620956350, + 67412, + 621159707, + 619318147, + -1, + 621225233, + 621086918, + -1, + -56056, + 621154041, + 67241, + -56055, + 621219450, + 67240, + -56054, + 621284838, + 67239, + -56053, + 621350229, + 67238, + -56052, + 621415607, + 67237, + -56051, + 621480972, + 67236, + -56050, + 621546343, + 67235, + -56049, + 621611694, + 67234, + -56048, + 621677030, + 67233, + -1, + 621742398, + 67232, + 622002175, + 621152598, + -1, + -56045, + 621874810, + 67250, + -56044, + 621940198, + 67249, + -56043, + 622005589, + 67248, + -56042, + 622070967, + 67247, + -56041, + 622136332, + 67246, + -56040, + 622201703, + 67245, + -56039, + 622267054, + 67244, + -56038, + 622332390, + 67243, + -1, + 622397758, + 67242, + 622601508, + 621088384, + -1, + -56035, + 622529889, + 67431, + -56034, + 622595273, + 67430, + -56033, + 622660639, + 67429, + -56032, + 622726019, + 67428, + -56031, + 622791370, + 67427, + -56030, + 622856690, + 67426, + -56029, + 622922070, + 67425, + -1, + 622987462, + 67424, + 623191336, + 622528854, + -1, + -56026, + 623119219, + 67151, + -56025, + 623184564, + 67146, + -1, + 623249732, + 67143, + -1, + 623118667, + 67099, + 623575039, + 597426176, + -1, + 623584556, + 623477224, + 983068, + -1, + 623510622, + 983142, + -1, + 623522744, + 983062, + 623837183, + 597379779, + -1, + -56017, + 623717590, + 128391, + -1, + 623772853, + 128279, + 623977800, + 597309353, + -1, + 624043335, + 623919065, + -1, + 624108869, + 623968256, + -1, + 624174394, + 624046886, + -1, + 624239927, + 624125763, + -1, + -56010, + 624197490, + 128964, + -1, + 624239941, + 11212, + 624492543, + 624183523, + -1, + -56007, + 624393870, + 128943, + -1, + 624454686, + 128969, + 624633149, + 624132430, + -1, + -56004, + 624595524, + 128978, + -1, + 624639881, + 128960, + 624829760, + 624588834, + -1, + -56001, + 624773515, + 128949, + -1, + 624825027, + 128937, + -55999, + 624792361, + 128910, + -55998, + 624979931, + 128648, + -55997, + 625031767, + 128930, + -55996, + 625094175, + 128955, + -1, + 625155987, + 128504, + 625410047, + 624057864, + 128498, + -1, + 625279234, + 128497, + -1, + 623974272, + 128626, + 625550666, + 623930733, + 128482, + -1, + 625509487, + 128132, + 625681741, + 625498043, + -1, + -55988, + 625640981, + 6430, + -1, + 625687234, + 6429, + -55986, + 625645805, + 129422, + -1, + 625828534, + 129409, + 626009710, + 597233425, + -1, + 626075221, + 625968355, + -1, + 626140669, + 626030626, + -1, + 626206196, + 626087681, + -1, + 626271588, + 626165911, + -1, + 626337122, + 626196480, + -1, + 626402657, + 626299799, + -1, + 626468186, + 626349712, + -1, + -55976, + 626427040, + 983623, + -55975, + 626473553, + 983589, + -1, + 626528353, + 983621, + 626730333, + 626423842, + -1, + -55972, + 626689863, + 42937, + -1, + 626736930, + 43854, + 626926944, + 626680170, + -1, + -55969, + 626885792, + 983619, + -1, + 626921569, + 983617, + -1, + 626872331, + 43858, + -1, + 626333904, + 43855, + -55965, + 626286693, + 43875, + -1, + 627195997, + 43856, + 627385717, + 626207583, + -1, + 627451252, + 627312004, + -1, + 627516778, + 627412804, + 983567, + 627638271, + 627441695, + -1, + -55959, + 627522129, + 983569, + -1, + 627576929, + 983571, + 627778925, + 627466602, + -1, + -55956, + 627737760, + 983597, + -1, + 627773537, + 983595, + 627975536, + 627714202, + -1, + -55953, + 627934368, + 983601, + -1, + 627970145, + 983599, + 628172147, + 627908823, + -1, + -55950, + 628119169, + 983573, + -1, + 628170314, + 983575, + -1, + 628110754, + 43828, + -1, + 627400031, + 43836, + 628499843, + 627341346, + -1, + 628565374, + 628432183, + -1, + 628630907, + 628520424, + -1, + 628696442, + 628584268, + 43851, + -1, + 628623237, + 43852, + -1, + 628635579, + 43830, + 628948991, + 628572228, + -1, + -55939, + 628832849, + 983629, + -1, + 628887649, + 983630, + 629089665, + 628491652, + -1, + -55936, + 629051204, + 983587, + -1, + 629104823, + 42921, + -55934, + 629048614, + 43845, + -1, + 629215761, + 43872, + 629417361, + 628441181, + -1, + 629482893, + 629343620, + -1, + 629548425, + 629418138, + -1, + -55929, + 629507232, + 983603, + -55928, + 629553745, + 983602, + -1, + 629608545, + 983578, + 629810572, + 629498230, + -1, + -55925, + 629769376, + 983607, + -1, + 629805153, + 983605, + -1, + 629757596, + 983577, + 630072720, + 629432394, + -1, + -55921, + 630022442, + 43840, + -1, + 630067836, + 43876, + -1, + 630023730, + 43873, + 630334877, + 629366885, + -1, + 630400408, + 630287003, + -1, + 630465943, + 630326660, + -1, + -55915, + 630423605, + 43839, + -55914, + 630471249, + 983625, + -1, + 630526049, + 983626, + -1, + 630401887, + 43874, + 630793628, + 630327246, + 983581, + 630915071, + 630718495, + -1, + -55909, + 630798929, + 983583, + -1, + 630853729, + 983585, + -1, + 630741118, + 42935, + 631121321, + 630265890, + -1, + 631186850, + 631066003, + -1, + 631252385, + 631136357, + 43837, + -1, + 631179182, + 43838, + -1, + 631188319, + 43826, + 631448999, + 631115537, + -1, + 631514534, + 631404416, + -1, + -55899, + 631450463, + 43827, + -1, + 631509628, + 43824, + -1, + 631470532, + 43853, + -55896, + 631386491, + 42933, + -1, + 631703195, + 42903, + 631907764, + 631080890, + -1, + 631973296, + 631857253, + -1, + 632038830, + 631909304, + -1, + -55891, + 631996469, + 43841, + -1, + 632045315, + 43842, + 632291327, + 631964514, + 43843, + -1, + 632162222, + 43844, + 632366515, + 631934527, + -1, + -55886, + 632306257, + 983627, + -1, + 632361057, + 983628, + -1, + 632326799, + 43857, + 632628668, + 631852279, + -1, + 632694203, + 632554884, + -1, + -55881, + 632652960, + 983611, + -55880, + 632713878, + 42894, + -55879, + 632772907, + 43833, + -55878, + 632833744, + 43831, + -1, + 632891736, + 43832, + -1, + 632631148, + 43829, + 633152964, + 632560951, + -1, + 633218497, + 633093554, + 43859, + 633339903, + 633145110, + -1, + -55872, + 633238509, + 43860, + -1, + 633294921, + 43861, + 633536511, + 633144708, + -1, + -55869, + 633432404, + 42900, + -1, + 633477324, + 42899, + 633677261, + 633081617, + -1, + 633742796, + 633602048, + -1, + 633808331, + 633705367, + -1, + 633873866, + 633758058, + -1, + -55863, + 633832608, + 983593, + -1, + 633868385, + 983591, + -1, + 633820828, + 983565, + -1, + 633762522, + 43825, + -1, + 633678784, + 983624, + 634267091, + 633640465, + -1, + 634332626, + 634215763, + 43863, + 634454015, + 634257408, + -1, + -55855, + 634360864, + 43865, + -1, + 634393488, + 43864, + -1, + 634294564, + 43862, + 634660313, + 634220388, + -1, + 634725848, + 634585088, + -1, + -55850, + 634684576, + 983615, + -55849, + 634740919, + 42919, + -1, + 634791024, + 43849, + -1, + 634677151, + 43847, + 635053535, + 634608471, + -1, + 635119070, + 634979716, + -1, + -55844, + 635068599, + 42917, + -55843, + 635119441, + 42897, + -1, + 635184240, + 43835, + -1, + 635058127, + 983579, + 635446755, + 635015339, + -1, + -55839, + 635406895, + 42911, + -55838, + 635461930, + 42909, + -1, + 635506838, + 42907, + 635708904, + 635386567, + -1, + 635774439, + 635659364, + -1, + -55834, + 635714129, + 983631, + -1, + 635768929, + 983632, + -1, + 635701072, + 42901, + 636036587, + 635655753, + -1, + -55830, + 635995296, + 983613, + -1, + 636036208, + 43834, + 636233198, + 635975593, + -1, + -55827, + 636173013, + 983199, + -1, + 636225313, + 42913, + 636429808, + 636168572, + 43848, + -1, + 636356076, + 43850, + -55823, + 636393201, + 43866, + -55822, + 636504827, + 42915, + -55821, + 636570111, + 983609, + -1, + 636629820, + 42905, + 636878847, + 626166228, + -1, + -55818, + 636780878, + 8348, + -55817, + 636844066, + 8347, + -55816, + 636905681, + 8346, + -55815, + 636967767, + 8345, + -55814, + 637031956, + 8344, + -55813, + 637095159, + 8343, + -55812, + 637160131, + 8342, + -1, + 637221575, + 8341, + 637412942, + 626073078, + -1, + 637478412, + 637348792, + -1, + 637543939, + 637439812, + 983566, + 637665279, + 637468703, + -1, + -55806, + 637549137, + 983568, + -1, + 637603937, + 983570, + 637806086, + 637493610, + -1, + -55803, + 637764768, + 983596, + -1, + 637800545, + 983594, + 638002697, + 637741210, + -1, + -55800, + 637961376, + 983600, + -1, + 637997153, + 983598, + 638255103, + 637935831, + -1, + -55797, + 638146177, + 983572, + -1, + 638197322, + 983574, + 638395925, + 637438161, + -1, + 638461457, + 638342800, + -1, + -55793, + 638420128, + 983622, + -55792, + 638466641, + 983588, + -1, + 638521441, + 983620, + 638723604, + 638411114, + -1, + -55789, + 638682272, + 983618, + -1, + 638718049, + 983616, + -1, + 638681141, + 42936, + 638985755, + 638351394, + -1, + 639051289, + 638911876, + -1, + -55784, + 639012676, + 983586, + -1, + 639066295, + 42920, + -55782, + 638998258, + 42926, + -1, + 639181837, + 42924, + 639378977, + 638935141, + -1, + 639444512, + 639305678, + 983580, + 639565823, + 639369247, + -1, + -55777, + 639449681, + 983582, + -1, + 639504481, + 983584, + -1, + 639391870, + 42934, + 639772197, + 639340715, + -1, + -55773, + 639732271, + 42910, + -55772, + 639787306, + 42908, + -1, + 639832214, + 42906, + 640034345, + 639731642, + -1, + -55769, + 639992142, + 42929, + -55768, + 640043715, + 42928, + -1, + 640105159, + 42893, + 640296494, + 639987532, + -1, + 640362029, + 640222596, + -1, + -55764, + 640320672, + 983614, + -1, + 640377015, + 42918, + -1, + 640299651, + 42923, + 640624179, + 640237787, + -1, + 640689714, + 640573802, + -1, + -55759, + 640648352, + 983606, + -1, + 640684129, + 983604, + -1, + 640636572, + 983576, + 640951864, + 640552765, + -1, + 641017399, + 640901482, + -1, + -55754, + 640976032, + 983592, + -1, + 641011809, + 983590, + -1, + 640964252, + 983564, + 641279547, + 640899961, + -1, + -55750, + 641228983, + 42916, + -1, + 641279825, + 42896, + 641476158, + 641223957, + -1, + -55747, + 641434784, + 983610, + -1, + 641472882, + 42925, + 641672769, + 641419767, + -1, + -55744, + 641631392, + 983608, + -1, + 641672304, + 42930, + 641869380, + 641611689, + -1, + -55741, + 641809109, + 983198, + -1, + 641861409, + 42912, + 642065991, + 641801527, + -1, + -55738, + 642006450, + 42931, + -1, + 642057611, + 42898, + 642262602, + 641996834, + -1, + -55735, + 642199931, + 42932, + -1, + 642254491, + 42902, + -55733, + 642209361, + 983612, + -55732, + 642403067, + 42914, + -55731, + 642464457, + 42922, + -1, + 642528060, + 42904, + 642721364, + 637358593, + -1, + 642786899, + 642668260, + -1, + -55727, + 642746354, + 43002, + -55726, + 642805611, + 43846, + -1, + 642870829, + 42927, + -1, + 642729525, + 42895, + -1, + 642658348, + 42999, + 643180126, + 626024571, + -1, + 643245657, + 643124233, + -1, + -55720, + 643194971, + 3807, + -1, + 643250701, + 3806, + 643442268, + 643184061, + -1, + -55717, + 643392166, + 983204, + -1, + 643438586, + 983205, + -55715, + 643397317, + 983206, + -1, + 643585095, + 983207, + 643769958, + 643133260, + -1, + 643835493, + 643709072, + -1, + 643901027, + 643767163, + -1, + -55710, + 643835861, + 128311, + -1, + 643899438, + 128309, + -55708, + 643854730, + 128308, + -1, + 644048216, + 128310, + -1, + 643776655, + 8382, + 644294249, + 643727172, + -1, + -55704, + 644256685, + 127772, + -1, + 644317471, + 127767, + 644490860, + 644225058, + -1, + -55701, + 644427360, + 127991, + -1, + 644481378, + 129404, + -55699, + 644426576, + 128030, + -1, + 644621384, + 129357, + 644818631, + 625945439, + -1, + 644884159, + 644757349, + -1, + 644949668, + 644845956, + -1, + 645015177, + 644907342, + -1, + 645080711, + 644969238, + -1, + 645146246, + 645007428, + -1, + 645211780, + 645076444, + 11104, + 645332991, + 645136384, + -1, + 645342850, + 645239703, + -1, + 645408378, + 645289095, + -1, + -55687, + 645368965, + 11172, + -1, + 645409371, + 11174, + 645604989, + 645343434, + -1, + -55684, + 645566312, + 983237, + -1, + 645611267, + 11130, + -55682, + 645566362, + 129072, + -55681, + 645749751, + 129056, + -55680, + 645814302, + 129060, + -55679, + 645872933, + 129068, + -1, + 645929919, + 129064, + -55677, + 645301576, + 11120, + -1, + 646080549, + 11136, + -55675, + 645163325, + 11140, + -1, + 646194818, + 11114, + -1, + 645071022, + 129168, + -55672, + 645043508, + 11244, + -1, + 646407338, + 129186, + 646588049, + 644945397, + -1, + 646653581, + 646544659, + -1, + -55668, + 646612613, + 129024, + -1, + 646656095, + 129040, + -55666, + 646602503, + 129176, + -55665, + 646797369, + 129028, + -55664, + 646860360, + 129032, + -1, + 646918239, + 129044, + 647112341, + 646518818, + -1, + -55661, + 647063144, + 129184, + -55660, + 647122275, + 11144, + -1, + 647172109, + 129192, + 647374488, + 647067682, + -1, + -55657, + 647327400, + 129080, + -1, + 647369792, + 129104, + 647571099, + 647327564, + -1, + -55654, + 647520497, + 128620, + -1, + 647578283, + 129190, + 647767710, + 647511309, + -1, + -55651, + 647701096, + 129088, + -1, + 647763420, + 129092, + 647964321, + 647705382, + -1, + -55648, + 647919338, + 129194, + -1, + 647972323, + 129076, + -55646, + 647926473, + 129172, + -55645, + 648106156, + 129188, + -1, + 648159848, + 129084, + 648357560, + 644874240, + -1, + 648423088, + 648297173, + -1, + 648488623, + 648368750, + -1, + 648554158, + 648421422, + 129287, + 648675327, + 648480132, + -1, + 648685228, + 648577358, + -1, + -55637, + 648647897, + 129285, + -1, + 648691550, + 129284, + -55635, + 648623708, + 129283, + -1, + 648816775, + 129286, + -1, + 648485646, + 11240, + -1, + 648436814, + 128379, + 649143987, + 648377169, + -1, + -55630, + 649103051, + 11108, + -1, + 649165076, + 129112, + -55628, + 649106898, + 128398, + -55627, + 649298821, + 128492, + -55626, + 649363025, + 128488, + -55625, + 649418233, + 128709, + -1, + 649466854, + 128494, + 649723903, + 648284189, + -1, + 649733820, + 649605981, + -1, + -55621, + 649671930, + 129307, + -1, + 649729444, + 1422, + -55619, + 649692520, + 8294, + -55618, + 649882703, + 128269, + -1, + 649935876, + 9958, + 650127042, + 644813033, + -1, + -55615, + 650090190, + 129388, + -1, + 650117611, + 127811, + -55613, + 650088117, + 127898, + -55612, + 650273984, + 128006, + -55611, + 650336883, + 127819, + -55610, + 650393513, + 129461, + -1, + 650454928, + 128210, + 650651362, + 644767845, + -1, + 650716886, + 650613017, + -1, + 650782418, + 650653816, + -1, + 650847953, + 650727360, + -1, + 650913486, + 650799313, + -1, + -55603, + 650850089, + 128393, + -1, + 650908037, + 128396, + -55601, + 650851904, + 128395, + -55600, + 651043779, + 128397, + -1, + 651106490, + 128394, + -1, + 650802201, + 128318, + 651427839, + 650706944, + -1, + 651437781, + 651316127, + 11847, + -1, + 651363878, + 11848, + -1, + 651369602, + 128261, + 651634395, + 650649845, + 128274, + 651699930, + 651576781, + -1, + -55591, + 651663623, + 983079, + -1, + 651715332, + 983076, + -1, + 651626217, + 128271, + 651962078, + 651595376, + -1, + -55587, + 651907490, + 128140, + -1, + 651968310, + 127977, + -55585, + 651921950, + 128557, + -55584, + 652117241, + 129524, + -55583, + 652170250, + 127853, + -1, + 652221627, + 129438, + 652420839, + 650604364, + -1, + -55580, + 652370021, + 983225, + -55579, + 652432916, + 983220, + -55578, + 652492893, + 983230, + -1, + 652553055, + 983222, + -55576, + 652384213, + 129317, + -55575, + 652708459, + 129523, + -55574, + 652758485, + 129433, + -1, + 652817190, + 983065, + 653011413, + 597187415, + -1, + 653076634, + 652970135, + -1, + 653142167, + 653032435, + -1, + 653207702, + 653074289, + -1, + 653273084, + 653134322, + -1, + 653338369, + 653208415, + -1, + -55566, + 653275942, + 111343, + -55565, + 653339487, + 111342, + -55564, + 653403487, + 111341, + -55563, + 653466935, + 111340, + -55562, + 653531170, + 111339, + -55561, + 653594385, + 111338, + -55560, + 653659782, + 111337, + -55559, + 653725191, + 111336, + -55558, + 653790561, + 111335, + -55557, + 653855945, + 111334, + -55556, + 653921311, + 111333, + -55555, + 653986691, + 111332, + -55554, + 654052042, + 111331, + -55553, + 654117362, + 111330, + -55552, + 654182742, + 111329, + -1, + 654248134, + 111328, + 654452498, + 653272415, + -1, + -55549, + 654390054, + 111327, + -55548, + 654453599, + 111326, + -55547, + 654517599, + 111325, + -55546, + 654581047, + 111324, + -55545, + 654645282, + 111323, + -55544, + 654708497, + 111322, + -55543, + 654773894, + 111321, + -55542, + 654839303, + 111320, + -55541, + 654904673, + 111319, + -55540, + 654970057, + 111318, + -55539, + 655035423, + 111317, + -55538, + 655100803, + 111316, + -55537, + 655166154, + 111315, + -55536, + 655231474, + 111314, + -55535, + 655296854, + 111313, + -1, + 655362246, + 111312, + 655566627, + 654384439, + -1, + -55532, + 655504166, + 111311, + -55531, + 655567711, + 111310, + -55530, + 655631711, + 111309, + -55529, + 655695159, + 111308, + -55528, + 655759394, + 111307, + -55527, + 655822609, + 111306, + -55526, + 655888006, + 111305, + -55525, + 655953415, + 111304, + -55524, + 656018785, + 111303, + -55523, + 656084169, + 111302, + -55522, + 656149535, + 111301, + -55521, + 656214915, + 111300, + -55520, + 656280266, + 111299, + -55519, + 656345586, + 111298, + -55518, + 656410966, + 111297, + -1, + 656476358, + 111296, + 656680756, + 655497250, + -1, + -55515, + 656618278, + 111295, + -55514, + 656681823, + 111294, + -55513, + 656745823, + 111293, + -55512, + 656809271, + 111292, + -55511, + 656873506, + 111291, + -55510, + 656936721, + 111290, + -55509, + 657002118, + 111289, + -55508, + 657067527, + 111288, + -55507, + 657132897, + 111287, + -55506, + 657198281, + 111286, + -55505, + 657263647, + 111285, + -55504, + 657329027, + 111284, + -55503, + 657394378, + 111283, + -55502, + 657459698, + 111282, + -55501, + 657525078, + 111281, + -1, + 657590470, + 111280, + 657794885, + 656609041, + -1, + -55498, + 657732390, + 111279, + -55497, + 657795935, + 111278, + -55496, + 657859935, + 111277, + -55495, + 657923383, + 111276, + -55494, + 657987618, + 111275, + -55493, + 658050833, + 111274, + -55492, + 658116230, + 111273, + -55491, + 658181639, + 111272, + -55490, + 658247009, + 111271, + -55489, + 658312393, + 111270, + -55488, + 658377759, + 111269, + -55487, + 658443139, + 111268, + -55486, + 658508490, + 111267, + -55485, + 658573810, + 111266, + -55484, + 658639190, + 111265, + -1, + 658704582, + 111264, + 658909014, + 657723014, + -1, + -55481, + 658846502, + 111263, + -55480, + 658910047, + 111262, + -55479, + 658974047, + 111261, + -55478, + 659037495, + 111260, + -55477, + 659101730, + 111259, + -55476, + 659164945, + 111258, + -55475, + 659230342, + 111257, + -55474, + 659295751, + 111256, + -55473, + 659361121, + 111255, + -55472, + 659426505, + 111254, + -55471, + 659491871, + 111253, + -55470, + 659557251, + 111252, + -55469, + 659622602, + 111251, + -55468, + 659687922, + 111250, + -55467, + 659753302, + 111249, + -1, + 659818694, + 111248, + 660023143, + 658836999, + -1, + -55464, + 659960614, + 111247, + -55463, + 660024159, + 111246, + -55462, + 660088159, + 111245, + -55461, + 660151607, + 111244, + -55460, + 660215842, + 111243, + -55459, + 660279057, + 111242, + -55458, + 660344454, + 111241, + -55457, + 660409863, + 111240, + -55456, + 660475233, + 111239, + -55455, + 660540617, + 111238, + -55454, + 660605983, + 111237, + -55453, + 660671363, + 111236, + -55452, + 660736714, + 111235, + -55451, + 660802034, + 111234, + -55450, + 660867414, + 111233, + -1, + 660932806, + 111232, + 661137272, + 659950945, + -1, + -55447, + 661074726, + 111231, + -55446, + 661138271, + 111230, + -55445, + 661202271, + 111229, + -55444, + 661265719, + 111228, + -55443, + 661329954, + 111227, + -55442, + 661393169, + 111226, + -55441, + 661458566, + 111225, + -55440, + 661523975, + 111224, + -55439, + 661589345, + 111223, + -55438, + 661654729, + 111222, + -55437, + 661720095, + 111221, + -55436, + 661785475, + 111220, + -55435, + 661850826, + 111219, + -55434, + 661916146, + 111218, + -55433, + 661981526, + 111217, + -1, + 662046918, + 111216, + 662251401, + 661064905, + -1, + -55430, + 662188838, + 111215, + -55429, + 662252383, + 111214, + -55428, + 662316383, + 111213, + -55427, + 662379831, + 111212, + -55426, + 662444066, + 111211, + -55425, + 662507281, + 111210, + -55424, + 662572678, + 111209, + -55423, + 662638087, + 111208, + -55422, + 662703457, + 111207, + -55421, + 662768841, + 111206, + -55420, + 662834207, + 111205, + -55419, + 662899587, + 111204, + -55418, + 662964938, + 111203, + -55417, + 663030258, + 111202, + -55416, + 663095638, + 111201, + -1, + 663161030, + 111200, + 663365530, + 662178847, + -1, + -55413, + 663302950, + 111199, + -55412, + 663366495, + 111198, + -55411, + 663430495, + 111197, + -55410, + 663493943, + 111196, + -55409, + 663558178, + 111195, + -55408, + 663621393, + 111194, + -55407, + 663686790, + 111193, + -55406, + 663752199, + 111192, + -55405, + 663817569, + 111191, + -55404, + 663882953, + 111190, + -55403, + 663948319, + 111189, + -55402, + 664013699, + 111188, + -55401, + 664079050, + 111187, + -55400, + 664144370, + 111186, + -55399, + 664209750, + 111185, + -1, + 664275142, + 111184, + 664479659, + 663292803, + -1, + -55396, + 664417062, + 111183, + -55395, + 664480607, + 111182, + -55394, + 664544607, + 111181, + -55393, + 664608055, + 111180, + -55392, + 664672290, + 111179, + -55391, + 664735505, + 111178, + -55390, + 664800902, + 111177, + -55389, + 664866311, + 111176, + -55388, + 664931681, + 111175, + -55387, + 664997065, + 111174, + -55386, + 665062431, + 111173, + -55385, + 665127811, + 111172, + -55384, + 665193162, + 111171, + -55383, + 665258482, + 111170, + -55382, + 665323862, + 111169, + -1, + 665389254, + 111168, + 665593788, + 664406730, + -1, + -55379, + 665531174, + 111167, + -55378, + 665594719, + 111166, + -55377, + 665658719, + 111165, + -55376, + 665722167, + 111164, + -55375, + 665786402, + 111163, + -55374, + 665849617, + 111162, + -55373, + 665915014, + 111161, + -55372, + 665980423, + 111160, + -55371, + 666045793, + 111159, + -55370, + 666111177, + 111158, + -55369, + 666176543, + 111157, + -55368, + 666241923, + 111156, + -55367, + 666307274, + 111155, + -55366, + 666372594, + 111154, + -55365, + 666437974, + 111153, + -1, + 666503366, + 111152, + 666707917, + 665520626, + -1, + -55362, + 666645286, + 111151, + -55361, + 666708831, + 111150, + -55360, + 666772831, + 111149, + -55359, + 666836279, + 111148, + -55358, + 666900514, + 111147, + -55357, + 666963729, + 111146, + -55356, + 667029126, + 111145, + -55355, + 667094535, + 111144, + -55354, + 667159905, + 111143, + -55353, + 667225289, + 111142, + -55352, + 667290655, + 111141, + -55351, + 667356035, + 111140, + -55350, + 667421386, + 111139, + -55349, + 667486706, + 111138, + -55348, + 667552086, + 111137, + -1, + 667617478, + 111136, + 667822046, + 666634582, + -1, + -55345, + 667759398, + 111135, + -55344, + 667822943, + 111134, + -55343, + 667886943, + 111133, + -55342, + 667950391, + 111132, + -55341, + 668014626, + 111131, + -55340, + 668077841, + 111130, + -55339, + 668143238, + 111129, + -55338, + 668208647, + 111128, + -55337, + 668274017, + 111127, + -55336, + 668339401, + 111126, + -55335, + 668404767, + 111125, + -55334, + 668470147, + 111124, + -55333, + 668535498, + 111123, + -55332, + 668600818, + 111122, + -55331, + 668666198, + 111121, + -1, + 668731590, + 111120, + 668936175, + 667748550, + -1, + -55328, + 668873510, + 111119, + -55327, + 668937055, + 111118, + -55326, + 669001055, + 111117, + -55325, + 669064503, + 111116, + -55324, + 669128738, + 111115, + -55323, + 669191953, + 111114, + -55322, + 669257350, + 111113, + -55321, + 669322759, + 111112, + -55320, + 669388129, + 111111, + -55319, + 669453513, + 111110, + -55318, + 669518879, + 111109, + -55317, + 669584259, + 111108, + -55316, + 669649610, + 111107, + -55315, + 669714930, + 111106, + -55314, + 669780310, + 111105, + -1, + 669845702, + 111104, + 670105599, + 668873510, + -1, + -55311, + 669980706, + 111355, + -55310, + 670043921, + 111354, + -55309, + 670109318, + 111353, + -55308, + 670174727, + 111352, + -55307, + 670240097, + 111351, + -55306, + 670305481, + 111350, + -55305, + 670370847, + 111349, + -55304, + 670436227, + 111348, + -55303, + 670501578, + 111347, + -55302, + 670566898, + 111346, + -55301, + 670632278, + 111345, + -1, + 670697670, + 111344, + 670957567, + 653199702, + -1, + 670967822, + 670839590, + -1, + -55297, + 670905126, + 111103, + -55296, + 670968671, + 111102, + -55295, + 671032671, + 111101, + -55294, + 671096119, + 111100, + -55293, + 671160354, + 111099, + -55292, + 671223569, + 111098, + -55291, + 671288966, + 111097, + -55290, + 671354375, + 111096, + -55289, + 671419745, + 111095, + -55288, + 671485129, + 111094, + -55287, + 671550495, + 111093, + -55286, + 671615875, + 111092, + -55285, + 671681226, + 111091, + -55284, + 671746546, + 111090, + -55283, + 671811926, + 111089, + -1, + 671877318, + 111088, + 672081951, + 670903135, + -1, + -55280, + 672019238, + 111087, + -55279, + 672082783, + 111086, + -55278, + 672146783, + 111085, + -55277, + 672210231, + 111084, + -55276, + 672274466, + 111083, + -55275, + 672337681, + 111082, + -55274, + 672403078, + 111081, + -55273, + 672468487, + 111080, + -55272, + 672533857, + 111079, + -55271, + 672599241, + 111078, + -55270, + 672664607, + 111077, + -55269, + 672729987, + 111076, + -55268, + 672795338, + 111075, + -55267, + 672860658, + 111074, + -55266, + 672926038, + 111073, + -1, + 672991430, + 111072, + 673196080, + 672015711, + -1, + -55263, + 673133350, + 111071, + -55262, + 673196895, + 111070, + -55261, + 673260895, + 111069, + -55260, + 673324343, + 111068, + -55259, + 673388578, + 111067, + -55258, + 673451793, + 111066, + -55257, + 673517190, + 111065, + -55256, + 673582599, + 111064, + -55255, + 673647969, + 111063, + -55254, + 673713353, + 111062, + -55253, + 673778719, + 111061, + -55252, + 673844099, + 111060, + -55251, + 673909450, + 111059, + -55250, + 673974770, + 111058, + -55249, + 674040150, + 111057, + -1, + 674105542, + 111056, + 674310209, + 673127735, + -1, + -55246, + 674247462, + 111055, + -55245, + 674311007, + 111054, + -55244, + 674375007, + 111053, + -55243, + 674438455, + 111052, + -55242, + 674502690, + 111051, + -55241, + 674565905, + 111050, + -55240, + 674631302, + 111049, + -55239, + 674696711, + 111048, + -55238, + 674762081, + 111047, + -55237, + 674827465, + 111046, + -55236, + 674892831, + 111045, + -55235, + 674958211, + 111044, + -55234, + 675023562, + 111043, + -55233, + 675088882, + 111042, + -55232, + 675154262, + 111041, + -1, + 675219654, + 111040, + 675424338, + 674240546, + -1, + -55229, + 675361574, + 111039, + -55228, + 675425119, + 111038, + -55227, + 675489119, + 111037, + -55226, + 675552567, + 111036, + -55225, + 675616802, + 111035, + -55224, + 675680017, + 111034, + -55223, + 675745414, + 111033, + -55222, + 675810823, + 111032, + -55221, + 675876193, + 111031, + -55220, + 675941577, + 111030, + -55219, + 676006943, + 111029, + -55218, + 676072323, + 111028, + -55217, + 676137674, + 111027, + -55216, + 676202994, + 111026, + -55215, + 676268374, + 111025, + -1, + 676333766, + 111024, + 676538467, + 675352337, + -1, + -55212, + 676475686, + 111023, + -55211, + 676539231, + 111022, + -55210, + 676603231, + 111021, + -55209, + 676666679, + 111020, + -55208, + 676730914, + 111019, + -55207, + 676794129, + 111018, + -55206, + 676859526, + 111017, + -55205, + 676924935, + 111016, + -55204, + 676990305, + 111015, + -55203, + 677055689, + 111014, + -55202, + 677121055, + 111013, + -55201, + 677186435, + 111012, + -55200, + 677251786, + 111011, + -55199, + 677317106, + 111010, + -55198, + 677382486, + 111009, + -1, + 677447878, + 111008, + 677652596, + 676466310, + -1, + -55195, + 677589798, + 111007, + -55194, + 677653343, + 111006, + -55193, + 677717343, + 111005, + -55192, + 677780791, + 111004, + -55191, + 677845026, + 111003, + -55190, + 677908241, + 111002, + -55189, + 677973638, + 111001, + -55188, + 678039047, + 111000, + -55187, + 678104417, + 110999, + -55186, + 678169801, + 110998, + -55185, + 678235167, + 110997, + -55184, + 678300547, + 110996, + -55183, + 678365898, + 110995, + -55182, + 678431218, + 110994, + -55181, + 678496598, + 110993, + -1, + 678561990, + 110992, + 678766725, + 677580295, + -1, + -55178, + 678703910, + 110991, + -55177, + 678767455, + 110990, + -55176, + 678831455, + 110989, + -55175, + 678894903, + 110988, + -55174, + 678959138, + 110987, + -55173, + 679022353, + 110986, + -55172, + 679087750, + 110985, + -55171, + 679153159, + 110984, + -55170, + 679218529, + 110983, + -55169, + 679283913, + 110982, + -55168, + 679349279, + 110981, + -55167, + 679414659, + 110980, + -55166, + 679480010, + 110979, + -55165, + 679545330, + 110978, + -55164, + 679610710, + 110977, + -1, + 679676102, + 110976, + 679935999, + 678694241, + -1, + -55161, + 679818022, + 110975, + -55160, + 679881567, + 110974, + -55159, + 679945567, + 110973, + -55158, + 680009015, + 110972, + -55157, + 680073250, + 110971, + -55156, + 680136465, + 110970, + -55155, + 680201862, + 110969, + -55154, + 680267271, + 110968, + -55153, + 680332641, + 110967, + -55152, + 680398025, + 110966, + -55151, + 680463391, + 110965, + -55150, + 680528771, + 110964, + -55149, + 680594122, + 110963, + -55148, + 680659442, + 110962, + -55147, + 680724822, + 110961, + -1, + 680790214, + 110960, + -1, + 653150381, + 94177, + 681060505, + 653085943, + 983041, + -1, + 681004279, + 983040, + -1, + 681017696, + 128297, + 681257314, + 653011807, + -1, + 681322787, + 681218329, + -1, + 681388314, + 681250579, + -1, + 681453797, + 681333161, + -1, + 681519272, + 681401175, + -1, + 681584802, + 681481901, + -1, + -55135, + 681523925, + 70681, + -1, + 681578257, + 70680, + 681781413, + 681523113, + -1, + -55132, + 681720533, + 70675, + -1, + 681774865, + 70674, + -55130, + 681728944, + 70686, + -55129, + 681917141, + 70692, + -1, + 681971473, + 70691, + 682174637, + 681480318, + -1, + 682240171, + 682127180, + 70662, + -1, + 682192716, + 70663, + 682426367, + 682183927, + 70664, + -1, + 682314999, + 70665, + 682502323, + 682131790, + -1, + 682567857, + 682459470, + -1, + -55120, + 682506965, + 70683, + -1, + 682561297, + 70682, + -55118, + 682506965, + 70688, + -1, + 682692369, + 70687, + 682895545, + 682435935, + -1, + 682961079, + 682829151, + -1, + -55114, + 682900181, + 70685, + -1, + 682954513, + 70684, + -55112, + 682900181, + 70690, + -1, + 683085585, + 70689, + 683288765, + 682823441, + 70656, + -55109, + 683247767, + 70669, + -55108, + 683294813, + 70667, + -1, + 683347729, + 70657, + 683550913, + 683243554, + -1, + -55105, + 683505822, + 70706, + -55104, + 683555541, + 70705, + -1, + 683609873, + 70707, + 683813059, + 683509911, + 70660, + -1, + 683772055, + 70661, + 683944134, + 683765580, + -1, + -55099, + 683883221, + 70701, + -1, + 683937553, + 70700, + 684140745, + 683894993, + -1, + -55096, + 684079829, + 70694, + -1, + 684134161, + 70693, + 684337356, + 684086804, + -1, + -55093, + 684276437, + 70698, + -1, + 684330769, + 70697, + 684533967, + 684281079, + -1, + -55090, + 684473045, + 70703, + -1, + 684527377, + 70702, + 684730578, + 684477123, + -1, + -55087, + 684669653, + 70671, + -1, + 684723985, + 70670, + 684927189, + 684673525, + -1, + -55084, + 684866261, + 70679, + -1, + 684920593, + 70678, + 685123799, + 684867677, + 70658, + -1, + 685064285, + 70659, + 685254874, + 685062057, + -1, + -55079, + 685193941, + 70673, + -1, + 685248273, + 70672, + 685451485, + 685186359, + -1, + -55076, + 685390549, + 70677, + -1, + 685444881, + 70676, + 685648096, + 685381666, + -1, + -55073, + 685587157, + 70696, + -1, + 685641489, + 70695, + -55071, + 685610760, + 70699, + -55070, + 685805873, + 70704, + -55069, + 685858917, + 70668, + -55068, + 685914837, + 70708, + -1, + 685976415, + 70666, + 686172405, + 681414904, + -1, + 686237931, + 686133374, + -1, + 686303465, + 686190412, + 70714, + -1, + 686255948, + 70715, + 686489599, + 686247159, + 70716, + -1, + 686378231, + 70717, + 686565615, + 686165777, + -1, + -55059, + 686524567, + 70721, + -55058, + 686571613, + 70719, + -1, + 686624529, + 70709, + 686827761, + 686524567, + 70712, + -1, + 686786711, + 70713, + 686958835, + 686768221, + 70710, + -1, + 686899293, + 70711, + -55052, + 686907493, + 70720, + -1, + 687024991, + 70718, + 687220998, + 686105951, + -1, + 687286532, + 687162089, + -1, + 687352058, + 687243598, + -1, + -55047, + 687314134, + 70738, + -1, + 687357778, + 70739, + 687548669, + 687306786, + -1, + -55044, + 687491453, + 70742, + -1, + 687551030, + 70743, + 687745280, + 687485734, + -1, + -55041, + 687695626, + 70740, + -1, + 687753439, + 70741, + -55039, + 687708423, + 70736, + -55038, + 687891204, + 70737, + -55037, + 687955394, + 70745, + -1, + 688008704, + 70744, + -55035, + 687236752, + 70732, + -1, + 688133051, + 70731, + 688335124, + 687175714, + -1, + 688400659, + 688275549, + -1, + 688466194, + 688339453, + -1, + 688531724, + 688427009, + -1, + -55029, + 688486722, + 70725, + -1, + 688549951, + 70722, + 688728335, + 688459537, + -1, + -55026, + 688688714, + 70727, + -1, + 688742461, + 70724, + -55024, + 688676846, + 70726, + -55023, + 688862278, + 70728, + -1, + 688922062, + 70723, + -1, + 688400028, + 70730, + -1, + 688329664, + 70750, + -55019, + 688286584, + 70747, + -55018, + 689201717, + 70729, + -55017, + 689260100, + 70749, + -55016, + 689322037, + 70734, + -55015, + 689381934, + 70733, + -1, + 689442735, + 70735, + 689645855, + 681312256, + -1, + 689711390, + 689592956, + -1, + -55011, + 689673133, + 127770, + -1, + 689733919, + 127761, + -1, + 689656704, + 983063, + 689973538, + 689591173, + -1, + -55007, + 689926987, + 11155, + -1, + 689983419, + 11154, + -1, + 689929798, + 128240, + 690235740, + 681261138, + -1, + 690301248, + 690167933, + -1, + 690366782, + 690245279, + -1, + -55001, + 690329720, + 127337, + -55000, + 690394797, + 127336, + -54999, + 690460146, + 127335, + -54998, + 690524441, + 127334, + -54997, + 690589237, + 127333, + -54996, + 690653335, + 127332, + -54995, + 690717006, + 127331, + -54994, + 690780194, + 127330, + -54993, + 690843468, + 127329, + -54992, + 690908717, + 127328, + -54991, + 690970725, + 127326, + -54990, + 691034967, + 127325, + -54989, + 691099156, + 127324, + -54988, + 691162359, + 127323, + -54987, + 691227331, + 127322, + -54986, + 691292661, + 127321, + -54985, + 691355741, + 127320, + -54984, + 691419049, + 127318, + -54983, + 691483430, + 127317, + -54982, + 691546975, + 127316, + -54981, + 691610975, + 127315, + -54980, + 691674423, + 127314, + -54979, + 691738658, + 127313, + -1, + 691801873, + 127312, + -54977, + 690325116, + 128982, + -1, + 691961506, + 128984, + 692136283, + 690257577, + -1, + 692201816, + 692080287, + -1, + -54973, + 692164728, + 127369, + -54972, + 692229805, + 127368, + -54971, + 692295154, + 127367, + -54970, + 692359449, + 127366, + -54969, + 692424245, + 127365, + -54968, + 692488343, + 127364, + -54967, + 692552014, + 127363, + -54966, + 692615202, + 127362, + -54965, + 692678476, + 127361, + -54964, + 692743725, + 127360, + -54963, + 692805733, + 127358, + -54962, + 692869975, + 127357, + -54961, + 692931267, + 127354, + -54960, + 692994141, + 127352, + -54959, + 693058247, + 127351, + -54958, + 693122985, + 127350, + -54957, + 693187366, + 127349, + -54956, + 693250911, + 127348, + -54955, + 693314911, + 127347, + -54954, + 693378359, + 127346, + -54953, + 693442594, + 127345, + -1, + 693505809, + 127344, + -54951, + 692163111, + 127375, + -54950, + 693642301, + 10062, + -1, + 693702534, + 127374, + -1, + 692064301, + 983091, + -54947, + 690198137, + 983130, + -54946, + 693931551, + 128528, + -54945, + 693993261, + 11228, + -54944, + 694055142, + 129299, + -54943, + 694111479, + 983131, + -1, + 694165859, + 128084, + 694364572, + 681185041, + -1, + 694430102, + 694294786, + -1, + 694495625, + 694374825, + -1, + 694561135, + 694432831, + -1, + -54937, + 694523993, + 67724, + -54936, + 694582197, + 67740, + -54935, + 694640697, + 67732, + -54934, + 694704270, + 67730, + -54933, + 694767066, + 67728, + -54932, + 694831938, + 67726, + -54931, + 694893707, + 67718, + -54930, + 694950312, + 67714, + -1, + 695013941, + 67712, + 695216500, + 694515746, + -1, + 695282035, + 695144209, + -1, + -54926, + 695228547, + 67734, + -1, + 695281570, + 67737, + -1, + 695221805, + 67741, + 695544183, + 695173454, + -1, + -54922, + 695480719, + 67723, + -1, + 695539697, + 67742, + 695740793, + 695483531, + 67719, + -1, + 695698205, + 67722, + 695871868, + 695668497, + -1, + -54917, + 695834560, + 67735, + -1, + 695882141, + 67713, + -54915, + 695834871, + 67721, + -54914, + 696031321, + 67725, + -54913, + 696095204, + 67720, + -54912, + 696152675, + 67739, + -54911, + 696217186, + 67738, + -54910, + 696281676, + 67736, + -54909, + 696344633, + 67733, + -54908, + 696408206, + 67731, + -54907, + 696471002, + 67729, + -54906, + 696535874, + 67727, + -54905, + 696596912, + 67716, + -54904, + 696657464, + 67717, + -1, + 696719784, + 67715, + 696920469, + 694444020, + -1, + 696986000, + 696877390, + -1, + 697051534, + 696946969, + -1, + -54899, + 697000037, + 67752, + -1, + 697053155, + 67758, + -54897, + 696991570, + 67753, + -1, + 697183982, + 67757, + 697379218, + 696935172, + 67751, + -1, + 697303598, + 67759, + 697565183, + 697316134, + -1, + -54892, + 697460490, + 67754, + -1, + 697518303, + 67756, + -1, + 696853629, + 67755, + -54889, + 694393058, + 129535, + -54888, + 697732492, + 129314, + -54887, + 697795845, + 127966, + -54886, + 697849811, + 128219, + -54885, + 697912003, + 983092, + -1, + 697975650, + 128133, + 698165706, + 694313061, + -1, + 698231218, + 698117964, + -1, + 698296753, + 698188573, + -1, + 698362288, + 698220544, + -1, + 698427816, + 698323591, + -1, + 698493349, + 698379313, + -1, + -54877, + 698454083, + 128600, + -54876, + 698503055, + 128592, + -1, + 698555588, + 128608, + 698755495, + 698451659, + 11110, + -1, + 698680659, + 11126, + -1, + 698710292, + 129108, + 699006975, + 698362928, + -1, + 699017645, + 698903601, + -1, + -54869, + 698978371, + 128602, + -54868, + 699027343, + 128594, + -1, + 699079876, + 128610, + 699279791, + 698975947, + 11111, + -1, + 699204947, + 11127, + -1, + 699234580, + 129109, + -1, + 698297432, + 128746, + -1, + 698230763, + 8379, + 699607485, + 698155008, + -1, + 699673014, + 699558097, + -1, + -54859, + 699615054, + 128370, + -1, + 699673861, + 128695, + 699869625, + 699602978, + -1, + -54856, + 699822347, + 983126, + -1, + 699875730, + 128691, + -54854, + 699825619, + 128685, + -54853, + 700015464, + 128286, + -54852, + 700078617, + 128245, + -1, + 700133336, + 128683, + 700328391, + 699564366, + -1, + 700393924, + 700263263, + 128456, + 700459457, + 700324835, + 128211, + -1, + 700384767, + 128212, + 700645375, + 700384207, + -1, + -54845, + 700528781, + 128457, + -1, + 700589407, + 128458, + 700841983, + 700325804, + -1, + -54842, + 700740600, + 128324, + -1, + 700796969, + 128323, + -54840, + 700283259, + 128067, + -54839, + 700930969, + 128689, + -1, + 700996098, + 65934, + 701180367, + 698109040, + -1, + 701245902, + 701113695, + -1, + -54835, + 701195696, + 2046, + -1, + 701240400, + 2045, + -1, + 701203019, + 2047, + 701508050, + 701110306, + -1, + -54831, + 701464124, + 983196, + -1, + 701512391, + 983127, + -54829, + 701455379, + 983227, + -54828, + 701648119, + 983066, + -1, + 701711003, + 127747, + 701901891, + 652950215, + -1, + 701967235, + 701836127, + -1, + 702032687, + 701915063, + -1, + 702097923, + 701975235, + -1, + 702163430, + 702025547, + -1, + 702228957, + 702089558, + 110615, + -54820, + 702155094, + 110625, + -1, + 702220486, + 110624, + -54818, + 702172090, + 110626, + -54817, + 702353030, + 110623, + -54816, + 702418439, + 110622, + -54815, + 702483809, + 110621, + -54814, + 702549193, + 110620, + -54813, + 702614559, + 110619, + -54812, + 702679939, + 110618, + -54811, + 702745290, + 110617, + -1, + 702810610, + 110616, + 703015407, + 702103779, + -1, + -54808, + 702942727, + 110634, + -54807, + 703008097, + 110633, + -54806, + 703073481, + 110632, + -54805, + 703138847, + 110631, + -54804, + 703204227, + 110630, + -54803, + 703269578, + 110629, + -54802, + 703334898, + 110628, + -1, + 703400278, + 110627, + 703605239, + 702974186, + -1, + -54799, + 703532385, + 110641, + -54798, + 703597769, + 110640, + -54797, + 703663135, + 110639, + -54796, + 703728515, + 110638, + -54795, + 703793866, + 110637, + -54794, + 703859186, + 110636, + -1, + 703924566, + 110635, + 704129534, + 703540185, + -1, + -54791, + 704056521, + 110647, + -54790, + 704121887, + 110646, + -54789, + 704187267, + 110645, + -54788, + 704252618, + 110644, + -54787, + 704317938, + 110643, + -1, + 704383318, + 110642, + 704643071, + 704077989, + -1, + -54784, + 704531471, + 110651, + -54783, + 704580298, + 110650, + -54782, + 704645618, + 110649, + -1, + 704710998, + 110648, + 704916013, + 702036679, + -1, + 704981520, + 704843595, + -1, + 705047048, + 704907606, + 110750, + -54777, + 704973142, + 110760, + -1, + 705038534, + 110759, + -54775, + 704974470, + 110758, + -54774, + 705170951, + 110757, + -54773, + 705236321, + 110756, + -54772, + 705301705, + 110755, + -54771, + 705367071, + 110754, + -54770, + 705432451, + 110753, + -54769, + 705497802, + 110752, + -1, + 705563122, + 110751, + 705767961, + 704929957, + -1, + -54766, + 705695239, + 110785, + -54765, + 705760609, + 110784, + -54764, + 705825993, + 110783, + -54763, + 705891359, + 110782, + -54762, + 705956739, + 110781, + -54761, + 706022090, + 110780, + -54760, + 706087410, + 110779, + -1, + 706152790, + 110778, + 706357793, + 705708259, + -1, + -54757, + 706284897, + 110767, + -54756, + 706350281, + 110766, + -54755, + 706415647, + 110765, + -54754, + 706481027, + 110764, + -54753, + 706546378, + 110763, + -54752, + 706611698, + 110762, + -1, + 706677078, + 110761, + 706882089, + 706292697, + -1, + -54749, + 706809185, + 110777, + -54748, + 706874569, + 110776, + -54747, + 706939935, + 110775, + -54746, + 707005315, + 110774, + -54745, + 707070666, + 110773, + -54744, + 707135986, + 110772, + -1, + 707201366, + 110771, + 707461119, + 706840810, + -1, + -54741, + 707332810, + 110770, + -54740, + 707398130, + 110769, + -1, + 707463510, + 110768, + 707668565, + 704870434, + -1, + 707734071, + 707627242, + -1, + -54736, + 707661319, + 110673, + -54735, + 707726689, + 110672, + -54734, + 707792073, + 110671, + -54733, + 707857439, + 110670, + -54732, + 707922819, + 110669, + -54731, + 707988170, + 110668, + -54730, + 708053490, + 110667, + -1, + 708118870, + 110666, + 708323904, + 707661643, + -1, + -54727, + 708251143, + 110659, + -54726, + 708316513, + 110658, + -54725, + 708381897, + 110657, + -54724, + 708447263, + 110656, + -54723, + 708512643, + 110655, + -54722, + 708577994, + 110654, + -54721, + 708643314, + 110653, + -1, + 708708694, + 110652, + 708913736, + 708272293, + -1, + -54718, + 708840801, + 110685, + -54717, + 708906185, + 110684, + -54716, + 708971551, + 110683, + -54715, + 709036931, + 110682, + -54714, + 709102282, + 110681, + -54713, + 709167602, + 110680, + -1, + 709232982, + 110679, + 709438031, + 708853987, + -1, + -54710, + 709364937, + 110665, + -54709, + 709430303, + 110664, + -54708, + 709495683, + 110663, + -54707, + 709561034, + 110662, + -54706, + 709626354, + 110661, + -1, + 709691734, + 110660, + 709951487, + 709372889, + -1, + -54703, + 709823519, + 110678, + -54702, + 709888899, + 110677, + -54701, + 709954250, + 110676, + -54700, + 710019570, + 110675, + -1, + 710084950, + 110674, + 710290046, + 707615575, + -1, + 710355552, + 710217547, + -1, + -54696, + 710282886, + 110726, + -54695, + 710348295, + 110725, + -54694, + 710413665, + 110724, + -54693, + 710479049, + 110723, + -54692, + 710544415, + 110722, + -54691, + 710609795, + 110721, + -54690, + 710675146, + 110720, + -54689, + 710740466, + 110719, + -1, + 710805846, + 110718, + 711010921, + 710295779, + -1, + -54686, + 710967941, + 110734, + -54685, + 711003489, + 110733, + -54684, + 711068873, + 110732, + -54683, + 711134239, + 110731, + -54682, + 711199619, + 110730, + -54681, + 711264970, + 110729, + -54680, + 711330290, + 110728, + -1, + 711395670, + 110727, + 711600753, + 710945753, + -1, + -54677, + 711543917, + 110744, + -54676, + 711593161, + 110743, + -54675, + 711658527, + 110742, + -54674, + 711723907, + 110741, + -54673, + 711789258, + 110740, + -54672, + 711854578, + 110739, + -1, + 711919958, + 110738, + 712125047, + 711549093, + -1, + -54669, + 712051743, + 110749, + -54668, + 712117123, + 110748, + -54667, + 712182474, + 110747, + -54666, + 712247794, + 110746, + -1, + 712313174, + 110745, + 712518267, + 712083690, + -1, + -54663, + 712444618, + 110737, + -54662, + 712509938, + 110736, + -1, + 712575318, + 110735, + 712835071, + 712444026, + -1, + -54659, + 712706546, + 110878, + -1, + 712771926, + 110877, + 712977060, + 710246734, + -1, + 713042569, + 712911833, + -1, + -54655, + 712969862, + 110710, + -54654, + 713035271, + 110709, + -54653, + 713100641, + 110708, + -54652, + 713166025, + 110707, + -54651, + 713231391, + 110706, + -54650, + 713296771, + 110705, + -54649, + 713362122, + 110704, + -54648, + 713427442, + 110703, + -1, + 713492822, + 110702, + 713697937, + 712990885, + -1, + -54645, + 713650073, + 110717, + -54644, + 713690313, + 110716, + -54643, + 713755679, + 110715, + -54642, + 713821059, + 110714, + -54641, + 713886410, + 110713, + -54640, + 713951730, + 110712, + -1, + 714017110, + 110711, + 714222233, + 713638115, + -1, + -54637, + 714149217, + 110696, + -54636, + 714214601, + 110695, + -54635, + 714279967, + 110694, + -54634, + 714345347, + 110693, + -54633, + 714410698, + 110692, + -54632, + 714476018, + 110691, + -1, + 714541398, + 110690, + 714746527, + 714180842, + -1, + -54629, + 714704197, + 110701, + -54628, + 714738563, + 110700, + -54627, + 714803914, + 110699, + -54626, + 714869234, + 110698, + -1, + 714934614, + 110697, + 715194367, + 714673995, + -1, + -54623, + 715066243, + 110689, + -54622, + 715131594, + 110688, + -54621, + 715196914, + 110687, + -1, + 715262294, + 110686, + 715467461, + 712929100, + -1, + 715532973, + 715407587, + -1, + -54617, + 715459937, + 110839, + -54616, + 715525321, + 110838, + -54615, + 715590687, + 110837, + -54614, + 715656067, + 110836, + -54613, + 715721418, + 110835, + -54612, + 715786738, + 110834, + -1, + 715852118, + 110833, + 716057268, + 715491562, + -1, + -54609, + 715984073, + 110845, + -54608, + 716049439, + 110844, + -54607, + 716114819, + 110843, + -54606, + 716180170, + 110842, + -54605, + 716245490, + 110841, + -1, + 716310870, + 110840, + 716516027, + 716005541, + -1, + -54602, + 716442825, + 110855, + -54601, + 716508191, + 110854, + -54600, + 716573571, + 110853, + -54599, + 716638922, + 110852, + -54598, + 716704242, + 110851, + -1, + 716769622, + 110850, + 716974784, + 716450777, + -1, + -54595, + 716901251, + 110849, + -54594, + 716966602, + 110848, + -54593, + 717031922, + 110847, + -1, + 717097302, + 110846, + 717357055, + 716902219, + -1, + -54590, + 717228931, + 110832, + -54589, + 717294282, + 110831, + -54588, + 717359602, + 110830, + -1, + 717424982, + 110829, + 717630182, + 715413012, + -1, + 717695694, + 717570275, + -1, + -54584, + 717622625, + 110799, + -54583, + 717688009, + 110798, + -54582, + 717753375, + 110797, + -54581, + 717818755, + 110796, + -54580, + 717884106, + 110795, + -54579, + 717949426, + 110794, + -1, + 718014806, + 110793, + 718219990, + 717623115, + -1, + -54576, + 718146913, + 110792, + -54575, + 718212297, + 110791, + -54574, + 718277663, + 110790, + -54573, + 718343043, + 110789, + -54572, + 718408394, + 110788, + -54571, + 718473714, + 110787, + -1, + 718539094, + 110786, + 718744285, + 718168229, + -1, + -54568, + 718671049, + 110812, + -54567, + 718736415, + 110811, + -54566, + 718801795, + 110810, + -54565, + 718867146, + 110809, + -54564, + 718932466, + 110808, + -1, + 718997846, + 110807, + 719203042, + 718702826, + -1, + -54561, + 719129475, + 110803, + -54560, + 719194826, + 110802, + -54559, + 719260146, + 110801, + -1, + 719325526, + 110800, + 719585279, + 719137753, + -1, + -54556, + 719476318, + 110806, + -54555, + 719522290, + 110805, + -1, + 719587670, + 110804, + 719792896, + 717590809, + -1, + 719858415, + 719741093, + -1, + -54551, + 719785313, + 110876, + -54550, + 719850697, + 110875, + -54549, + 719916063, + 110874, + -54548, + 719981443, + 110873, + -54547, + 720046794, + 110872, + -54546, + 720112114, + 110871, + -1, + 720177494, + 110870, + 720382709, + 719798499, + -1, + -54543, + 720309279, + 110865, + -54542, + 720374659, + 110864, + -54541, + 720440010, + 110863, + -54540, + 720505330, + 110862, + -1, + 720570710, + 110861, + 720775931, + 720310091, + -1, + -54537, + 720702495, + 110860, + -54536, + 720767875, + 110859, + -54535, + 720833226, + 110858, + -54534, + 720898546, + 110857, + -1, + 720963926, + 110856, + 721223679, + 720710617, + -1, + -54531, + 721095555, + 110869, + -54530, + 721160906, + 110868, + -54529, + 721226226, + 110867, + -1, + 721291606, + 110866, + 721496852, + 719754925, + -1, + 721562376, + 721445029, + -1, + -54525, + 721489097, + 110828, + -54524, + 721554463, + 110827, + -54523, + 721619843, + 110826, + -54522, + 721685194, + 110825, + -54521, + 721750514, + 110824, + -1, + 721815894, + 110823, + 722021135, + 721489739, + -1, + -54518, + 721983574, + 110818, + -54517, + 722013215, + 110817, + -54516, + 722078595, + 110816, + -54515, + 722143946, + 110815, + -54514, + 722209266, + 110814, + -1, + 722274646, + 110813, + 722534399, + 721979626, + -1, + -54511, + 722406275, + 110822, + -54510, + 722471626, + 110821, + -54509, + 722536946, + 110820, + -1, + 722602326, + 110819, + 722807579, + 721431513, + -1, + -54506, + 722734281, + 110611, + -54505, + 722799647, + 110610, + -54504, + 722865027, + 110609, + -54503, + 722930378, + 110608, + -54502, + 722995698, + 110607, + -1, + 723061078, + 983266, + 723266337, + 722766058, + -1, + -54499, + 723192863, + 110606, + -54498, + 723258243, + 110605, + -54497, + 723323594, + 110604, + -54496, + 723388914, + 110603, + -1, + 723454294, + 110602, + 723659558, + 723206371, + -1, + -54493, + 723585923, + 110601, + -54492, + 723651274, + 110600, + -54491, + 723716594, + 110599, + -1, + 723781974, + 110598, + 723987243, + 723586891, + -1, + -54488, + 723948758, + 110597, + -54487, + 723978954, + 110596, + -54486, + 724044274, + 110595, + -1, + 724109654, + 110594, + 724369407, + 723935397, + -1, + -54483, + 724241098, + 110614, + -54482, + 724306418, + 110613, + -1, + 724371798, + 110612, + 724577151, + 701959953, + -1, + 724642678, + 724537621, + -1, + 724708160, + 724596770, + -1, + 724773689, + 724658125, + -1, + 724839222, + 724734605, + -1, + -54475, + 724799555, + 128605, + -1, + 724835524, + 128613, + 725090303, + 724773942, + -1, + -54472, + 724996163, + 128607, + -1, + 725032132, + 128615, + 725232444, + 724715904, + -1, + -54469, + 725188238, + 128952, + -1, + 725249054, + 128972, + 725429055, + 725159697, + -1, + -54466, + 725376848, + 128635, + -1, + 725439967, + 128940, + -1, + 725361685, + 128625, + 725691209, + 724651255, + -1, + 725756740, + 725641311, + -1, + -54461, + 725712036, + 10079, + -1, + 725756157, + 10080, + 725953351, + 725691838, + -1, + -54458, + 725896748, + 129052, + -1, + 725954655, + 129048, + -54456, + 725893681, + 128627, + -1, + 726079292, + 128327, + 726281041, + 725618449, + -1, + 726346576, + 726235036, + -1, + 726412111, + 726295300, + 129180, + 726532095, + 726335488, + -1, + -54450, + 726434674, + 129183, + -1, + 726481757, + 129182, + -1, + 726370416, + 129181, + -1, + 726293191, + 128628, + 726805336, + 726228690, + -1, + 726870869, + 726766221, + -1, + -54444, + 726831171, + 128604, + -1, + 726867140, + 128612, + 727121919, + 726805558, + -1, + -54441, + 727027779, + 128606, + -1, + 727063748, + 128614, + 727264095, + 726738271, + -1, + 727329630, + 727212133, + -1, + 727395165, + 727291074, + -1, + -54436, + 727338540, + 129055, + -1, + 727396447, + 129051, + -1, + 727340007, + 128178, + -1, + 727271785, + 10135, + 727722852, + 727199238, + -1, + 727788387, + 727673877, + -1, + -54430, + 727739204, + 128977, + -1, + 727784206, + 128975, + -1, + 727744142, + 128958, + 728050535, + 727683765, + -1, + -54426, + 728006306, + 128913, + -1, + 728047662, + 128903, + 728247146, + 728009905, + -1, + -54423, + 728190508, + 129053, + -1, + 728248415, + 129049, + 728443757, + 728205342, + -1, + -54420, + 728394564, + 128980, + -1, + 728439566, + 128979, + 728640368, + 728397021, + -1, + -54417, + 728583724, + 129054, + -1, + 728641631, + 129050, + 728836979, + 728577284, + -1, + -54414, + 728792718, + 128946, + -1, + 728853534, + 128970, + -54412, + 728787964, + 10133, + -54411, + 728979959, + 10134, + -1, + 729040508, + 128633, + 729230206, + 724594508, + -1, + 729295741, + 729186640, + -1, + 729361276, + 729256855, + -1, + -54406, + 729318678, + 127892, + -54405, + 729379614, + 128157, + -1, + 729421276, + 128152, + -1, + 729294563, + 128159, + -1, + 729221250, + 128585, + -1, + 729164510, + 127911, + -54400, + 724529341, + 127807, + -54399, + 729764546, + 128641, + -54398, + 729819017, + 129428, + -1, + 729881712, + 1519, + 730082306, + 701894417, + -1, + 730147797, + 730028887, + -1, + 730213320, + 730087902, + -1, + 730278827, + 730157481, + -1, + 730344333, + 730221251, + -1, + 730409867, + 730285597, + -1, + -54390, + 730371848, + 68889, + -1, + 730435889, + 68887, + -54388, + 730348245, + 68872, + -1, + 730533649, + 68881, + 730737553, + 730291031, + -1, + -54385, + 730699528, + 68891, + -54384, + 730740706, + 68890, + -1, + 730795793, + 68885, + 730999700, + 730693966, + -1, + -54381, + 730956246, + 68868, + -1, + 730992401, + 68867, + 731196311, + 730953762, + -1, + -54378, + 731134677, + 68880, + -1, + 731189009, + 68879, + 731392922, + 731148108, + -1, + -54375, + 731344793, + 68877, + -1, + 731385617, + 68876, + 731589533, + 731325791, + -1, + -54372, + 731522539, + 68875, + -1, + 731582225, + 68874, + -54370, + 731551866, + 68878, + -54369, + 731748104, + 68888, + -54368, + 731812145, + 68886, + -54367, + 731876935, + 68892, + -54366, + 731932939, + 68866, + -54365, + 731993694, + 68884, + -54364, + 732056905, + 68883, + -54363, + 732121626, + 68869, + -54362, + 732183253, + 68871, + -54361, + 732248034, + 68882, + -54360, + 732312394, + 68873, + -54359, + 732372307, + 68870, + -54358, + 732436531, + 68865, + -1, + 732499729, + 68864, + 732703673, + 730212345, + -1, + 732769199, + 732660046, + -1, + -54354, + 732730582, + 68914, + -1, + 732774226, + 68915, + 732965810, + 732723234, + -1, + -54351, + 732907901, + 68918, + -1, + 732967478, + 68919, + 733162421, + 732902182, + -1, + -54348, + 733112074, + 68916, + -1, + 733169887, + 68917, + -54346, + 733124871, + 68912, + -54345, + 733307652, + 68913, + -54344, + 733371842, + 68921, + -1, + 733425152, + 68920, + 733621183, + 732664006, + -1, + -54341, + 733579415, + 68895, + -54340, + 733634661, + 68897, + -54339, + 733691997, + 68894, + -54338, + 733752159, + 68896, + -1, + 733810449, + 68893, + 734014405, + 733576272, + -1, + 734079940, + 733970902, + -1, + -54334, + 734035698, + 68903, + -54333, + 734092208, + 68902, + -1, + 734149450, + 68901, + -1, + 734018640, + 68900, + 734461951, + 733960008, + -1, + -54329, + 734361787, + 68898, + -1, + 734419907, + 68899, + 734604239, + 730151559, + -1, + 734669774, + 734566293, + -1, + 734735309, + 734612163, + -1, + -54324, + 734677474, + 983209, + -1, + 734739934, + 983212, + -1, + 734691032, + 983210, + -1, + 734625508, + 983211, + 735117311, + 734537055, + -1, + 735128531, + 734992435, + -1, + -54318, + 735073235, + 129342, + -1, + 735131561, + 128092, + -54316, + 735083263, + 129309, + -1, + 735250114, + 129310, + 735456249, + 730104142, + -1, + 735521784, + 735408196, + -1, + 735587313, + 735465897, + -1, + 735652829, + 735541282, + -1, + 735718364, + 735579921, + -1, + -54309, + 735664259, + 67822, + -1, + 735717282, + 67825, + -1, + 735657517, + 67828, + 735980512, + 735609166, + -1, + -54305, + 735916431, + 67816, + -1, + 735975409, + 67829, + 736177122, + 735919243, + 67812, + -1, + 736133917, + 67815, + 736308197, + 736104209, + -1, + -54300, + 736270411, + 67823, + -1, + 736317853, + 67808, + -54298, + 736270589, + 67814, + -54297, + 736467033, + 67817, + -54296, + 736530916, + 67813, + -54295, + 736587362, + 67826, + -54294, + 736651852, + 67824, + -54293, + 736714809, + 67821, + -54292, + 736778382, + 67820, + -54291, + 736841178, + 67819, + -54290, + 736906050, + 67818, + -54289, + 736967088, + 67810, + -54288, + 737027647, + 67811, + -1, + 737089960, + 67809, + 737345535, + 735535092, + -1, + 737356789, + 737247566, + -1, + -54284, + 737317478, + 67838, + -1, + 737357550, + 67837, + 737553399, + 737305348, + 67835, + -1, + 737477166, + 67839, + -1, + 737490175, + 67836, + -1, + 735453178, + 128035, + 737815550, + 735401492, + -1, + 737881084, + 737761467, + 128296, + -1, + 737804377, + 128736, + -54275, + 737836962, + 128057, + -1, + 737942762, + 127828, + -54273, + 737767646, + 128436, + -54272, + 738094357, + 128587, + -54271, + 738150342, + 128135, + -1, + 738207565, + 11233, + 738405415, + 730030181, + -1, + 738470930, + 738357068, + -1, + 738536462, + 738413036, + -1, + 738601997, + 738492750, + -1, + 738667532, + 738529158, + -1, + 738733067, + 738626242, + 983059, + 738852863, + 738656256, + -1, + -54262, + 738759619, + 983140, + -1, + 738818673, + 983137, + -1, + 738656869, + 11134, + -1, + 738619323, + 128677, + -1, + 738532067, + 11203, + 739246079, + 738490747, + 128014, + 739311615, + 739115008, + -1, + -54255, + 739209136, + 127943, + -1, + 739259213, + 128052, + 739453976, + 738429079, + -1, + 739519511, + 739408254, + -1, + 739585046, + 739450064, + 127968, + -1, + 739538978, + 127960, + -1, + 739546039, + 127969, + -1, + 739472114, + 9203, + 739847197, + 739410254, + -1, + 739912732, + 739770368, + -1, + -54245, + 739863235, + 127798, + -1, + 739911769, + 127789, + -1, + 739847776, + 127976, + 740174881, + 739790071, + -1, + 740240416, + 740119874, + 128616, + -1, + 740164157, + 128617, + -1, + 740174687, + 128371, + 740437028, + 740121914, + -1, + -54237, + 740366659, + 128029, + -1, + 740426779, + 127855, + -54235, + 740392576, + 127973, + -54234, + 740583633, + 983123, + -1, + 740630534, + 128298, + 740830267, + 738345053, + -1, + 740895792, + 740782024, + -1, + 740961327, + 740825634, + -1, + -54229, + 740919447, + 983980, + -54228, + 740974693, + 983982, + -54227, + 741032029, + 983979, + -54226, + 741092191, + 983981, + -1, + 741150481, + 983978, + -1, + 740889889, + 110593, + 741420088, + 740833574, + -1, + 741485621, + 741345309, + -1, + 741551156, + 741441134, + 128644, + -1, + 741475733, + 128645, + -1, + 741489997, + 128096, + 741801983, + 741408768, + -1, + -54217, + 741695743, + 983122, + -1, + 741743746, + 128262, + -54215, + 741371137, + 129435, + -54214, + 741887012, + 129406, + -1, + 741939842, + 127802, + 742140991, + 740788375, + -1, + -54211, + 742095674, + 128559, + -54210, + 742153341, + 128175, + -1, + 742209778, + 129303, + 742403138, + 742097230, + 983060, + -54207, + 742357026, + 983138, + -1, + 742410741, + 983141, + -1, + 742365092, + 11226, + 742665895, + 701851857, + -1, + 742731158, + 742592273, + -1, + 742796542, + 742669430, + -1, + 742861947, + 742726967, + -1, + 742927456, + 742810650, + -1, + 742992976, + 742873943, + -1, + 743058508, + 742949198, + -1, + -54197, + 743012680, + 92957, + -1, + 743062638, + 92971, + -54195, + 743001790, + 92960, + -54194, + 743197595, + 92962, + -54193, + 743251844, + 92968, + -1, + 743315351, + 92972, + 743517268, + 742931143, + -1, + -54190, + 743463946, + 92969, + -54189, + 743526078, + 92965, + -1, + 743577495, + 92959, + 743779415, + 743447863, + -1, + -54186, + 743717998, + 92967, + -1, + 743774103, + 92975, + -54184, + 743741244, + 92964, + -54183, + 743937580, + 92974, + -54182, + 744001126, + 92956, + -54181, + 744059030, + 92961, + -54180, + 744123989, + 92963, + -54179, + 744188873, + 92970, + -54178, + 744249221, + 92966, + -54177, + 744312510, + 92958, + -1, + 744363927, + 92973, + 744620031, + 742870505, + -1, + 744631399, + 744522062, + -1, + 744696934, + 744585250, + -1, + -54172, + 744657422, + 93069, + -54171, + 744701244, + 93053, + -1, + 744755078, + 93062, + -1, + 744636080, + 93061, + 745024619, + 744573635, + -1, + -54167, + 744985739, + 93070, + -54166, + 745038931, + 93058, + -1, + 745093862, + 93064, + 745286766, + 744986285, + -1, + -54163, + 745221422, + 93054, + -1, + 745279962, + 93068, + 745483377, + 745246261, + -1, + -54160, + 745444485, + 93071, + -1, + 745476570, + 93066, + 745679988, + 745426167, + -1, + -54157, + 745621482, + 93055, + -1, + 745674673, + 93056, + 745876599, + 745618133, + -1, + -54154, + 745837701, + 93059, + -1, + 745887252, + 93065, + -54152, + 745838247, + 93057, + -54151, + 746023689, + 93063, + -54150, + 746085148, + 93060, + -1, + 746140532, + 93067, + 746335406, + 742816848, + -1, + 746400903, + 746266665, + -1, + 746466433, + 746357070, + -1, + 746531968, + 746428067, + 93044, + -1, + 746455380, + 93045, + -1, + 746487348, + 92997, + 746728580, + 746396983, + -1, + -54141, + 746686795, + 93043, + -1, + 746732889, + 92985, + -54139, + 746679680, + 93046, + -54138, + 746872642, + 93047, + -1, + 746928916, + 93042, + 747121809, + 746362354, + -1, + 747187343, + 747083437, + -1, + 747252878, + 747121979, + -1, + -54133, + 747210245, + 92990, + -54132, + 747270923, + 92989, + -54131, + 747331556, + 92988, + -1, + 747385711, + 92991, + -1, + 747201619, + 93028, + -54128, + 747127023, + 93034, + -1, + 747575225, + 92996, + 747777179, + 747081921, + -1, + 747842711, + 747733326, + -1, + 747908246, + 747780807, + -1, + -54123, + 747856437, + 92983, + -1, + 747913455, + 92986, + -1, + 747862763, + 92984, + -54120, + 747796913, + 92992, + -54119, + 748117835, + 92994, + -54118, + 748180981, + 93027, + -1, + 748237757, + 92987, + 748432543, + 747733326, + -1, + -54115, + 748394050, + 93037, + -54114, + 748437084, + 93030, + -1, + 748492695, + 93039, + 748694692, + 748377620, + -1, + 748760227, + 748629298, + -1, + -54110, + 748717915, + 93038, + -1, + 748781733, + 92993, + -1, + 748719489, + 93041, + 749022375, + 748641111, + -1, + -54106, + 748980125, + 93035, + -1, + 749039198, + 93033, + 749218986, + 748960455, + -1, + -54103, + 749166570, + 93032, + -1, + 749228716, + 93029, + -54101, + 749181240, + 93031, + -54100, + 749360326, + 93040, + -54099, + 749420862, + 92995, + -1, + 749475784, + 93036, + 749677785, + 746295501, + -1, + 749743294, + 749604625, + -1, + 749808819, + 749703449, + -1, + -54094, + 749768245, + 92943, + -1, + 749803554, + 92942, + 750005430, + 749766807, + -1, + -54091, + 749964853, + 92933, + -1, + 750000162, + 92932, + 750202041, + 749944925, + -1, + -54088, + 750161461, + 92939, + -1, + 750196770, + 92938, + 750398652, + 750128913, + -1, + -54085, + 750358069, + 92955, + -1, + 750393378, + 92954, + -54083, + 750358069, + 92951, + -1, + 750524450, + 92950, + 750726340, + 749701271, + -1, + 750791874, + 750653201, + -1, + -54079, + 750751285, + 92945, + -1, + 750786594, + 92944, + -54077, + 750751285, + 92935, + -1, + 750917666, + 92934, + 751119562, + 750674021, + -1, + 751185096, + 751067237, + -1, + -54073, + 751144501, + 92941, + -1, + 751179810, + 92940, + -54071, + 751144501, + 92947, + -1, + 751310882, + 92946, + 751512784, + 751059037, + -1, + 751578318, + 751439633, + -1, + -54067, + 751537717, + 92949, + -1, + 751573026, + 92948, + -54065, + 751537717, + 92931, + -1, + 751704098, + 92930, + 751906006, + 751446879, + -1, + 751971540, + 751840095, + -1, + -54061, + 751930933, + 92929, + -1, + 751966242, + 92928, + -54059, + 751930933, + 92937, + -1, + 752097314, + 92936, + 752353279, + 751866137, + -1, + -54056, + 752258613, + 92953, + -1, + 752293922, + 92952, + 752495847, + 749611001, + -1, + 752561373, + 752451918, + -1, + -54052, + 752522454, + 93010, + -1, + 752566098, + 93011, + 752757984, + 752515106, + -1, + -54049, + 752699773, + 93014, + -1, + 752759350, + 93015, + 752954595, + 752694054, + -1, + -54046, + 752903946, + 93012, + -1, + 752961759, + 93013, + -54044, + 752916743, + 93008, + -54043, + 753099524, + 93009, + -54042, + 753163714, + 93017, + -1, + 753217024, + 93016, + 753413363, + 752443380, + -1, + 753478895, + 753369422, + -1, + 753544430, + 753413870, + -1, + 753609965, + 753467392, + -1, + -54036, + 753566621, + 93021, + -1, + 753605194, + 93024, + -1, + 753563682, + 93019, + -1, + 753497383, + 93025, + 753937650, + 753418256, + -1, + -54031, + 753891362, + 93020, + -1, + 753926859, + 93023, + -1, + 753883580, + 93022, + 754253823, + 753358670, + -1, + 754265335, + 754155854, + -1, + -54026, + 754223453, + 92976, + -1, + 754259893, + 92982, + 754461946, + 754219042, + -1, + -54023, + 754420039, + 92980, + -1, + 754475109, + 92977, + 754658557, + 754404035, + -1, + -54020, + 754596978, + 92979, + -1, + 754659628, + 92978, + -1, + 754597562, + 92981, + 754920775, + 742754460, + -1, + 754986290, + 754863351, + -1, + 755051821, + 754921880, + -1, + 755117325, + 754987814, + -1, + 755182860, + 755057674, + -1, + 755248389, + 755129175, + 72416, + -1, + 755185577, + 72419, + -54010, + 755209901, + 72420, + -54009, + 755339545, + 72418, + -54008, + 755401038, + 72414, + -54007, + 755460305, + 72412, + -54006, + 755521044, + 72415, + -54005, + 755584247, + 72417, + -1, + 755649219, + 72413, + -1, + 755109649, + 72403, + 755903759, + 755075223, + 72409, + -1, + 755830545, + 72410, + 756034834, + 755859790, + -1, + -53999, + 755972821, + 72399, + -1, + 756027153, + 72398, + 756231445, + 755984593, + -1, + -53996, + 756169429, + 72401, + -1, + 756223761, + 72384, + 756428056, + 756177751, + -1, + -53993, + 756365282, + 72391, + -1, + 756420369, + 72400, + 756624667, + 756370115, + -1, + -53990, + 756562645, + 72394, + -1, + 756616977, + 72385, + 756821277, + 756564061, + 72407, + -1, + 756748049, + 72411, + 756952352, + 756751671, + -1, + -53985, + 756890325, + 72404, + -1, + 756944657, + 72397, + -53983, + 756914298, + 72389, + -53982, + 757108295, + 72390, + -53981, + 757168286, + 72395, + -53980, + 757231513, + 72402, + -53979, + 757293157, + 72408, + -53978, + 757356126, + 72387, + -53977, + 757419337, + 72386, + -53976, + 757480149, + 72392, + -53975, + 757544930, + 72393, + -53974, + 757607263, + 72406, + -53973, + 757671403, + 72388, + -53972, + 757733427, + 72396, + -1, + 757796625, + 72405, + 758054911, + 755001451, + 72436, + 758120447, + 757923840, + -1, + 758132017, + 758010983, + 72435, + -1, + 758055396, + 72438, + -1, + 758068281, + 72439, + 758328634, + 754940160, + -1, + 758394168, + 758285693, + 72428, + 758513663, + 758317056, + -1, + 758525239, + 758404199, + 72427, + -1, + 758448612, + 72429, + -1, + 758461497, + 72430, + 758775807, + 758331885, + 72423, + -1, + 758645220, + 72426, + 758852927, + 758281741, + 72422, + 758972415, + 758775808, + -1, + 758983998, + 758862951, + 72421, + -1, + 758907364, + 72424, + -1, + 758920249, + 72425, + 759180611, + 758798593, + 72431, + 759300095, + 759103488, + -1, + -53950, + 759190636, + 72433, + -1, + 759247929, + 72434, + 759496703, + 759118317, + 72437, + 759562239, + 759365632, + -1, + -53946, + 759467614, + 72432, + -1, + 759510073, + 72440, + 759704949, + 754865220, + -1, + 759770483, + 759666789, + -1, + 759836007, + 759713572, + -1, + 759901542, + 759793535, + -1, + 759967056, + 759855138, + -1, + 760032591, + 759893777, + -1, + -53938, + 759978115, + 67695, + -1, + 760031138, + 67698, + -1, + 759971373, + 67701, + 760294739, + 759923022, + -1, + -53934, + 760230287, + 67688, + -1, + 760289265, + 67702, + 760491349, + 760233099, + 67684, + -1, + 760447773, + 67687, + 760622424, + 760418065, + -1, + -53929, + 760584128, + 67696, + -1, + 760631709, + 67680, + -53927, + 760584439, + 67686, + -53926, + 760780889, + 67689, + -53925, + 760844772, + 67685, + -53924, + 760902243, + 67700, + -53923, + 760966754, + 67699, + -53922, + 761031244, + 67697, + -53921, + 761094201, + 67694, + -53920, + 761157774, + 67692, + -53919, + 761220570, + 67691, + -53918, + 761285442, + 67690, + -53917, + 761346480, + 67682, + -53916, + 761410702, + 67693, + -53915, + 761472568, + 67683, + -1, + 761534888, + 67681, + -1, + 759838586, + 67703, + 761802098, + 759783412, + -1, + 761867630, + 761758030, + -1, + 761933164, + 761827609, + -1, + -53909, + 761880677, + 67706, + -1, + 761933795, + 67711, + -53907, + 761872210, + 67707, + -1, + 762064622, + 67710, + 762260849, + 761803558, + -1, + -53904, + 762210058, + 67708, + -1, + 762267871, + 67709, + -1, + 762209028, + 67705, + -1, + 761754742, + 67704, + -53900, + 759724159, + 129330, + -1, + 762512753, + 127796, + 762719615, + 759656268, + -1, + 762785149, + 762675534, + -1, + 762850684, + 762724621, + -1, + -53895, + 762809226, + 983149, + -53894, + 762852889, + 983145, + -53893, + 762915286, + 983146, + -1, + 762976375, + 983148, + -1, + 762812125, + 127881, + -53890, + 762738455, + 129436, + -1, + 763171153, + 11853, + 763374985, + 762656681, + -1, + 763440520, + 763308895, + 128463, + 763506054, + 763363328, + -1, + 763571589, + 763466653, + -1, + -53884, + 763530514, + 128195, + -1, + 763578246, + 128479, + -1, + 763507557, + 128196, + -53881, + 763459618, + 128464, + -1, + 763785036, + 128223, + -1, + 763388184, + 128724, + 764030350, + 763330243, + -1, + 764095885, + 763964255, + -1, + -53876, + 764042634, + 128755, + -1, + 764093876, + 11261, + -1, + 764046490, + 128706, + 764358033, + 763976535, + -1, + -53872, + 764290542, + 128060, + -1, + 764353921, + 129374, + 764554643, + 764290399, + 983121, + -1, + 764487689, + 983120, + -53868, + 764514587, + 128062, + -53867, + 764635886, + 128206, + -1, + 764682518, + 128230, + 764882442, + 742673655, + -1, + 764947969, + 764808977, + -1, + 765013504, + 764909514, + -1, + 765078975, + 764969294, + -1, + 765144496, + 765032454, + -1, + 765210022, + 765069654, + 127201, + -53859, + 765136518, + 127219, + -53858, + 765201927, + 127218, + -53857, + 765267297, + 127217, + -53856, + 765332681, + 127216, + -53855, + 765398047, + 127215, + -53854, + 765463427, + 127214, + -53853, + 765528778, + 127213, + -53852, + 765594098, + 127212, + -53851, + 765659478, + 127211, + -1, + 765724870, + 127210, + 765930921, + 765135346, + 127202, + -53848, + 765856086, + 127221, + -1, + 765921478, + 127220, + -53846, + 765857414, + 127209, + -53845, + 766053895, + 127208, + -53844, + 766119265, + 127207, + -53843, + 766184649, + 127206, + -53842, + 766250015, + 127205, + -53841, + 766315395, + 127204, + -1, + 766380746, + 127203, + 766586293, + 765105397, + -1, + -53838, + 766541375, + 127138, + -53837, + 766590202, + 127154, + -53836, + 766650333, + 127170, + -1, + 766714285, + 127186, + 766913978, + 766525312, + -1, + -53833, + 766869055, + 127139, + -53832, + 766917882, + 127155, + -53831, + 766978013, + 127171, + -1, + 767041965, + 127187, + 767295487, + 766848766, + -1, + -53828, + 767196735, + 127146, + -53827, + 767245562, + 127162, + -53826, + 767305693, + 127178, + -1, + 767369645, + 127194, + 767569356, + 765014822, + -1, + 767634887, + 767516773, + -1, + 767700422, + 767593714, + -1, + -53821, + 767655487, + 127140, + -53820, + 767704314, + 127156, + -53819, + 767764445, + 127172, + -1, + 767828397, + 127188, + -1, + 767648244, + 127200, + 768147455, + 767576339, + -1, + -53815, + 768048703, + 127141, + -53814, + 768097530, + 127157, + -53813, + 768157661, + 127173, + -1, + 768221613, + 127189, + 768421335, + 767522850, + -1, + 768486866, + 768362884, + -1, + -53809, + 768441919, + 127142, + -53808, + 768490746, + 127158, + -53807, + 768550877, + 127174, + -1, + 768614829, + 127190, + 768868351, + 768422459, + -1, + -53804, + 768769599, + 127143, + -53803, + 768818426, + 127159, + -53802, + 768878557, + 127175, + -1, + 768942509, + 127191, + 769142242, + 768363203, + -1, + 769207773, + 769088940, + -1, + -53798, + 769162815, + 127148, + -53797, + 769211642, + 127164, + -53796, + 769271773, + 127180, + -1, + 769335725, + 127196, + 769589247, + 769148260, + -1, + -53793, + 769490495, + 127150, + -53792, + 769539322, + 127166, + -53791, + 769599453, + 127182, + -1, + 769663405, + 127198, + 769863143, + 769093372, + -1, + -53788, + 769818175, + 127149, + -53787, + 769867002, + 127165, + -53786, + 769927133, + 127181, + -1, + 769991085, + 127197, + 770190828, + 769809863, + -1, + -53783, + 770145855, + 127145, + -53782, + 770194682, + 127161, + -53781, + 770254813, + 127177, + -1, + 770318765, + 127193, + 770518513, + 770132509, + -1, + -53778, + 770473535, + 127147, + -53777, + 770522362, + 127163, + -53776, + 770582493, + 127179, + -1, + 770646445, + 127195, + 770846198, + 770453013, + -1, + -53773, + 770801215, + 127144, + -53772, + 770850042, + 127160, + -53771, + 770910173, + 127176, + -1, + 770974125, + 127192, + 771173883, + 770772988, + -1, + -53768, + 771128895, + 127137, + -53767, + 771177722, + 127153, + -53766, + 771237853, + 127169, + -1, + 771301805, + 127185, + 771501566, + 771102754, + -1, + -53763, + 771444092, + 127183, + -1, + 771493892, + 127136, + -53761, + 771461917, + 127199, + -1, + 771649950, + 127167, + -1, + 764944081, + 128720, + 771894793, + 764905623, + 983150, + 772014079, + 771851599, + -1, + 772025862, + 771916110, + -1, + -53755, + 771986646, + 11219, + -1, + 772030290, + 11220, + 772276223, + 771961638, + -1, + -53752, + 772171530, + 11221, + -1, + 772229343, + 11222, + -1, + 771827039, + 983147, + 772484655, + 764836065, + -1, + 772550176, + 772428201, + -1, + 772615697, + 772503586, + -1, + 772681232, + 772542225, + -1, + -53745, + 772626563, + 68493, + -1, + 772679586, + 68495, + -1, + 772619821, + 68496, + 772943379, + 772553867, + 68484, + -1, + 772899613, + 68487, + -53740, + 772905207, + 68486, + -53739, + 773036121, + 68488, + -53738, + 773100028, + 68485, + -53737, + 773161585, + 68497, + -53736, + 773220940, + 68494, + -53735, + 773283897, + 68492, + -53734, + 773347474, + 68491, + -53733, + 773410266, + 68490, + -53732, + 773475138, + 68489, + -53731, + 773536176, + 68482, + -53730, + 773596728, + 68483, + -53729, + 773659048, + 68481, + -1, + 773722677, + 68480, + 773926442, + 772497396, + -1, + 773991975, + 773882190, + -1, + 774057509, + 773951769, + -1, + -53724, + 774004837, + 68522, + -1, + 774057955, + 68526, + -53722, + 773996370, + 68523, + -1, + 774188782, + 68525, + 774385193, + 773939972, + 68521, + -1, + 774308398, + 68527, + -1, + 774321741, + 68524, + 774581805, + 773863025, + -1, + -53716, + 774514823, + 68508, + -1, + 774579248, + 68507, + -53714, + 774539259, + 68506, + -1, + 774732178, + 68505, + 774909521, + 772418399, + -1, + 774975044, + 774860620, + -1, + 775040579, + 774928418, + -1, + 775106114, + 774988454, + -1, + 775171649, + 775028736, + -1, + 775237177, + 775132055, + -1, + -53706, + 775187675, + 128590, + -53705, + 775240909, + 129493, + -53704, + 775304642, + 128591, + -1, + 775363422, + 128113, + 775564860, + 775177184, + -1, + -53701, + 775520140, + 129494, + -1, + 775574737, + 129496, + -53699, + 775516184, + 128588, + -53698, + 775698254, + 128589, + -53697, + 775759969, + 129336, + -53696, + 775823732, + 129495, + -1, + 775887902, + 128583, + -1, + 775098909, + 128187, + -1, + 775041654, + 128547, + -1, + 774977029, + 127917, + 776285769, + 774921047, + -1, + -53690, + 776241664, + 9956, + -53689, + 776305869, + 128532, + -53688, + 776354434, + 128039, + -1, + 776405923, + 128390, + 776613455, + 776212241, + -1, + 776678989, + 776543543, + -1, + -53684, + 776626404, + 129434, + -1, + 776682183, + 127825, + -53682, + 776630092, + 127824, + -1, + 776822853, + 129372, + -53680, + 776570471, + 129515, + -1, + 776939392, + 128694, + 777137779, + 774856805, + -1, + 777203289, + 777097840, + -1, + 777268822, + 777156642, + -1, + -53675, + 777230337, + 9211, + -1, + 777277349, + 9214, + 777519103, + 777216678, + -1, + -53672, + 777390226, + 9212, + -1, + 777454773, + 9213, + 777662047, + 777160855, + -1, + 777727581, + 777618664, + -1, + -53668, + 777663309, + 128545, + -1, + 777723488, + 128574, + -53666, + 777672165, + 127831, + -1, + 777854765, + 128093, + 778055268, + 777617742, + -1, + 778120803, + 777981713, + -1, + -53662, + 778077509, + 129364, + -1, + 778115878, + 128688, + -1, + 778044210, + 127858, + 778382953, + 778008610, + -1, + 778448488, + 778338638, + -1, + -53657, + 778378284, + 128238, + -1, + 778441257, + 128239, + -1, + 778382842, + 11239, + 778710637, + 778326703, + -1, + 778776172, + 778640966, + 128659, + -1, + 778729565, + 128680, + -1, + 778723668, + 128110, + 778972784, + 778660049, + -1, + -53649, + 778904446, + 127871, + -1, + 778961279, + 8297, + -53647, + 778926027, + 128254, + -53646, + 779116837, + 128041, + -1, + 779166031, + 128425, + 779366027, + 777088844, + -1, + 779431555, + 779305053, + -1, + 779497086, + 779390535, + -1, + 779562621, + 779453078, + -1, + 779628154, + 779487261, + -1, + -53639, + 779553266, + 983166, + -1, + 779618646, + 983163, + 779878399, + 779550720, + -1, + -53636, + 779782201, + 983165, + -1, + 779838212, + 983162, + -1, + 779494735, + 983192, + 780140543, + 779443031, + -1, + 780152449, + 780042983, + 128424, + -1, + 780075575, + 128438, + 780337151, + 780082878, + 129332, + -1, + 780238531, + 128120, + 780414599, + 779365215, + -1, + -53627, + 780372114, + 129384, + -53626, + 780433880, + 983256, + -1, + 780483073, + 129328, + 780676746, + 780361829, + -1, + -53623, + 780630633, + 11224, + -1, + 780680643, + 128711, + -1, + 780605450, + 128255, + 780938904, + 779305053, + -1, + 781004432, + 780875689, + 128022, + 781123583, + 780926976, + -1, + -53617, + 781016821, + 128061, + -1, + 781071181, + 128055, + 781266579, + 780950673, + -1, + -53614, + 781194471, + 127821, + -1, + 781255027, + 127885, + 781463190, + 781208823, + -1, + -53611, + 781405431, + 128138, + -1, + 781462447, + 128169, + -53609, + 781418463, + 128299, + -1, + 781593439, + 129383, + 781790882, + 780896407, + -1, + 781856412, + 781741900, + -1, + -53605, + 781810043, + 128091, + -1, + 781872034, + 128156, + -53603, + 781812083, + 128686, + -53602, + 782007259, + 128204, + -53601, + 782064683, + 11854, + -53600, + 782113591, + 128226, + -53599, + 782174706, + 983167, + -1, + 782240086, + 983164, + 782446245, + 781722975, + -1, + -53596, + 782385245, + 983233, + -1, + 782447398, + 983224, + -53594, + 782390804, + 983193, + -1, + 782581428, + 11227, + 782774356, + 742613093, + -1, + 782839741, + 782716640, + -1, + 782905273, + 782761984, + -1, + 782970656, + 782843947, + -1, + 783036129, + 782925095, + -1, + 783101643, + 782969695, + 68809, + 783167154, + 783047511, + 68825, + 783232688, + 783122766, + 68839, + -1, + 783157417, + 68849, + -53583, + 783193773, + 68826, + -1, + 783293751, + 68805, + 783494837, + 783097143, + 68804, + -53580, + 783448098, + 68806, + -1, + 783497927, + 68841, + 783691447, + 783456376, + 68847, + -1, + 783644706, + 68848, + 783822521, + 783647054, + 68838, + -1, + 783783597, + 68840, + 783953595, + 783775778, + 68836, + -1, + 783915128, + 68837, + 784084669, + 783898132, + 68824, + -1, + 784034001, + 68833, + 784215743, + 784026871, + 68822, + -1, + 784176813, + 68823, + 784346817, + 784152489, + 68813, + -1, + 784307885, + 68814, + -53566, + 784305717, + 68846, + -53565, + 784428876, + 68834, + -53564, + 784492753, + 68832, + -53563, + 784550595, + 68819, + -53562, + 784615925, + 68818, + -53561, + 784677575, + 68815, + -53560, + 784741158, + 68812, + -53559, + 784804703, + 68811, + -53558, + 784868703, + 68807, + -1, + 784930850, + 68802, + 785133264, + 783027985, + 68800, + -53555, + 785079359, + 68808, + -53554, + 785143689, + 68803, + -53553, + 785205955, + 68820, + -1, + 785256209, + 68801, + 785460948, + 785090711, + 68842, + -53550, + 785418391, + 68843, + -53549, + 785479714, + 68850, + -1, + 785538626, + 68821, + 785723095, + 785408101, + 68827, + -53546, + 785670245, + 68828, + -1, + 785722658, + 68831, + 785919706, + 785676271, + -1, + -53543, + 785877551, + 68845, + -1, + 785932586, + 68830, + 786116317, + 785866166, + -1, + -53540, + 786074159, + 68844, + -1, + 786129194, + 68829, + 786312927, + 786055261, + 68816, + -1, + 786251869, + 68817, + -53536, + 786267090, + 68835, + -1, + 786375043, + 68810, + 786575127, + 782966262, + -1, + 786640641, + 786508639, + 68745, + 786706152, + 786586455, + 68761, + 786771686, + 786661710, + 68775, + -1, + 786696361, + 68785, + -53529, + 786732717, + 68762, + -1, + 786832695, + 68741, + 787033835, + 786636087, + 68740, + -53526, + 786987042, + 68742, + -1, + 787036871, + 68777, + 787230445, + 786995320, + 68783, + -1, + 787183650, + 68784, + 787361519, + 787185998, + 68774, + -1, + 787322541, + 68776, + 787492593, + 787314722, + 68772, + -1, + 787454072, + 68773, + 787623667, + 787437076, + 68760, + -1, + 787572945, + 68769, + 787754741, + 787565815, + 68758, + -1, + 787715757, + 68759, + 787885815, + 787691433, + 68749, + -1, + 787846829, + 68750, + -53512, + 787844661, + 68782, + -53511, + 787967820, + 68770, + -53510, + 788031697, + 68768, + -53509, + 788089539, + 68755, + -53508, + 788154869, + 68754, + -53507, + 788216519, + 68751, + -53506, + 788280102, + 68748, + -53505, + 788343647, + 68747, + -53504, + 788407647, + 68743, + -1, + 788469794, + 68738, + 788672262, + 786566929, + 68736, + -53501, + 788618303, + 68744, + -53500, + 788682633, + 68739, + -53499, + 788744899, + 68756, + -1, + 788795153, + 68737, + 788999946, + 788629655, + 68778, + -53496, + 788957335, + 68779, + -53495, + 789018658, + 68786, + -1, + 789077570, + 68757, + 789262093, + 788947045, + 68763, + -53492, + 789209189, + 68764, + -1, + 789261602, + 68767, + 789458704, + 789215215, + -1, + -53489, + 789416495, + 68781, + -1, + 789471530, + 68766, + 789655315, + 789405110, + -1, + -53486, + 789613103, + 68780, + -1, + 789668138, + 68765, + 789851925, + 789594205, + 68752, + -1, + 789790813, + 68753, + -53482, + 789806034, + 68771, + -1, + 789913987, + 68746, + 790167551, + 786522100, + -1, + 790179612, + 790061828, + 68858, + 790298623, + 790102016, + -1, + -53477, + 790201236, + 68863, + -1, + 790249488, + 68862, + 790441759, + 790115359, + -1, + -53474, + 790400621, + 68859, + -1, + 790443924, + 68861, + -1, + 790397656, + 68860, + 790703957, + 782925306, + -1, + 790769478, + 790646007, + -1, + 790835013, + 790704536, + -1, + 790900525, + 790770751, + -1, + 790966054, + 790856305, + 69403, + -1, + 790890472, + 69404, + 791097128, + 790919345, + 69398, + -1, + 791021544, + 69399, + 791228202, + 791044153, + 69391, + -1, + 791152616, + 69392, + -53461, + 791166091, + 69382, + -53460, + 791288232, + 69379, + -1, + 791351861, + 69377, + 791555890, + 790853666, + -1, + 791621425, + 791482129, + -1, + -53456, + 791566467, + 69393, + -1, + 791619490, + 69397, + -1, + 791559725, + 69401, + 791883575, + 791482129, + -1, + 791949110, + 791825655, + -1, + -53451, + 791905018, + 69395, + -1, + 791949347, + 69376, + -1, + 791910336, + 69394, + 792211257, + 791821451, + 69381, + -1, + 792167197, + 69385, + -53446, + 792172791, + 69384, + -53445, + 792303705, + 69386, + -53444, + 792367588, + 69383, + -53443, + 792429169, + 69402, + -53442, + 792490621, + 69400, + -53441, + 792554060, + 69396, + -53440, + 792617017, + 69390, + -53439, + 792680590, + 69389, + -53438, + 792743386, + 69388, + -53437, + 792808258, + 69387, + -53436, + 792869296, + 69380, + -1, + 792926632, + 69378, + -1, + 790774290, + 69415, + 793194324, + 790716404, + -1, + 793259855, + 793149774, + -1, + 793325387, + 793219353, + -1, + -53430, + 793272421, + 69406, + -1, + 793325539, + 69411, + 793521998, + 793262791, + -1, + -53427, + 793473474, + 69407, + -1, + 793528289, + 69412, + -1, + 793456366, + 69410, + 793784145, + 793207556, + 69405, + -1, + 793707054, + 69413, + 793968639, + 793719590, + -1, + -53421, + 793863946, + 69408, + -1, + 793921759, + 69409, + -1, + 793130736, + 69414, + 794177414, + 790653642, + -1, + 794242949, + 794122471, + -1, + 794308447, + 794203821, + -1, + 794373979, + 794243189, + 66415, + -53414, + 794331287, + 66408, + -1, + 794378333, + 66416, + 794570589, + 794300177, + 66420, + -1, + 794526030, + 66417, + -53410, + 794527895, + 66419, + -1, + 794654743, + 66407, + 794832740, + 794261538, + -1, + 794898275, + 794770119, + -1, + -53406, + 794846294, + 66405, + -1, + 794894346, + 66406, + -1, + 794837840, + 66401, + 795160423, + 794771549, + 66393, + -53402, + 795093855, + 66418, + -1, + 795152145, + 66421, + 795357036, + 795092319, + -1, + 795422571, + 795318392, + -1, + -53398, + 795363451, + 66392, + -1, + 795426476, + 66390, + -1, + 795369892, + 66387, + 795684719, + 795318392, + -1, + -53394, + 795623084, + 66389, + -1, + 795678445, + 66391, + 795881330, + 795643445, + -1, + -53391, + 795829334, + 66398, + -1, + 795881589, + 66414, + 796077941, + 795836750, + -1, + -53388, + 796032201, + 66413, + -1, + 796070265, + 66402, + 796274551, + 796024933, + 66409, + -1, + 796221541, + 66410, + 796405625, + 796207967, + 66388, + -1, + 796341030, + 66411, + -53382, + 796362903, + 66403, + -53381, + 796488220, + 66400, + -53380, + 796551779, + 66399, + -53379, + 796613899, + 66397, + -53378, + 796678325, + 66396, + -53377, + 796742021, + 66395, + -53376, + 796806260, + 66394, + -53375, + 796867285, + 66412, + -53374, + 796932124, + 66386, + -53373, + 796991446, + 66404, + -53372, + 797056230, + 66385, + -1, + 797119278, + 66384, + -1, + 794197521, + 128435, + 797388723, + 794123993, + -1, + 797454254, + 797331881, + -1, + 797519758, + 797409614, + -1, + 797585292, + 797457095, + -1, + -53365, + 797519315, + 68251, + -1, + 797577754, + 68249, + -53363, + 797519315, + 68233, + -1, + 797708639, + 68247, + 797912978, + 797454639, + -1, + -53360, + 797838026, + 68239, + -53359, + 797903346, + 68230, + -1, + 797968726, + 68234, + 798175125, + 797874298, + -1, + -53356, + 798114781, + 68248, + -1, + 798177991, + 68252, + 798371736, + 798116547, + -1, + -53353, + 798309104, + 68237, + -1, + 798363881, + 68235, + 798568347, + 798309063, + -1, + -53350, + 798502355, + 68224, + -1, + 798560607, + 68226, + 798764958, + 798504873, + -1, + -53347, + 798702351, + 68246, + -1, + 798764343, + 68244, + 798961569, + 798696939, + -1, + -53344, + 798903543, + 68245, + -1, + 798958943, + 68243, + 799158180, + 798887697, + -1, + -53341, + 799100855, + 68241, + -1, + 799163357, + 68242, + -53339, + 799119184, + 68250, + -53338, + 799314404, + 68229, + -53337, + 799373485, + 68238, + -53336, + 799437336, + 68231, + -53335, + 799501879, + 68228, + -53334, + 799563437, + 68236, + -53333, + 799627347, + 68227, + -53332, + 799690188, + 68225, + -53331, + 799749058, + 68240, + -1, + 799807825, + 68232, + 800063487, + 797401076, + -1, + 800075698, + 799965518, + -1, + -53327, + 800035430, + 68255, + -1, + 800075502, + 68254, + -1, + 800023300, + 68253, + 800337848, + 797329544, + -1, + -53323, + 800298825, + 66349, + -53322, + 800357927, + 66351, + -53321, + 800415464, + 66350, + -1, + 800469351, + 66335, + -1, + 800279536, + 128477, + 800784383, + 782839928, + -1, + -53317, + 800691549, + 128117, + -53316, + 800741156, + 128116, + -1, + 800788624, + 129491, + 800993306, + 782792738, + -1, + 801058841, + 800919854, + -1, + 801124332, + 801013031, + -1, + 801189833, + 801057631, + 66783, + 801255368, + 801127111, + -1, + 801320901, + 801210702, + -1, + -53308, + 801274014, + 66803, + -1, + 801312529, + 66801, + -53306, + 801270027, + 66797, + -53305, + 801458970, + 66789, + -1, + 801513304, + 66782, + -1, + 801194973, + 66784, + 801779661, + 801115921, + 66776, + 801845196, + 801718365, + 66777, + -1, + 801790807, + 66778, + -1, + 801782471, + 66779, + 802041810, + 801734990, + -1, + 802107345, + 801994786, + -1, + -53296, + 802044629, + 66804, + -1, + 802098961, + 66802, + -1, + 802033425, + 66800, + 802369494, + 801983171, + -1, + -53292, + 802330376, + 66790, + -53291, + 802372309, + 66808, + -1, + 802426641, + 66788, + 802631641, + 802330744, + -1, + -53288, + 802568917, + 66811, + -1, + 802623249, + 66810, + 802828252, + 802584610, + -1, + -53285, + 802765525, + 66799, + -1, + 802819857, + 66798, + 803024862, + 802775141, + 66794, + -1, + 802964445, + 66795, + 803155937, + 802962119, + -1, + -53280, + 803116808, + 66786, + -1, + 803147537, + 66785, + -53278, + 803115313, + 66807, + -53277, + 803309719, + 66806, + -53276, + 803367179, + 66796, + -53275, + 803429296, + 66793, + -53274, + 803493470, + 66792, + -53273, + 803556681, + 66791, + -53272, + 803618909, + 66787, + -53271, + 803682601, + 66809, + -53270, + 803743640, + 66805, + -53269, + 803807064, + 66781, + -1, + 803871804, + 66780, + 804126719, + 801054198, + -1, + 804138998, + 804006751, + 66743, + 804204533, + 804076231, + -1, + 804270066, + 804159822, + -1, + -53263, + 804223134, + 66763, + -1, + 804261649, + 66761, + -53261, + 804219147, + 66757, + -53260, + 804408090, + 66749, + -1, + 804462424, + 66742, + -1, + 804144093, + 66744, + 804728826, + 804065041, + 66736, + 804794361, + 804667485, + 66737, + -1, + 804739927, + 66738, + -1, + 804731591, + 66739, + 804990975, + 804684110, + -1, + 805056510, + 804943906, + -1, + -53251, + 804993749, + 66764, + -1, + 805048081, + 66762, + -1, + 804982545, + 66760, + 805318659, + 804932291, + -1, + -53247, + 805279496, + 66750, + -53246, + 805321429, + 66768, + -1, + 805375761, + 66748, + 805580806, + 805279864, + -1, + -53243, + 805518037, + 66771, + -1, + 805572369, + 66770, + 805777417, + 805533730, + -1, + -53240, + 805714645, + 66759, + -1, + 805768977, + 66758, + 805974027, + 805724261, + 66754, + -1, + 805913565, + 66755, + 806105102, + 805911239, + -1, + -53235, + 806065928, + 66746, + -1, + 806096657, + 66745, + -53233, + 806064433, + 66767, + -53232, + 806258839, + 66766, + -53231, + 806316299, + 66756, + -53230, + 806378416, + 66753, + -53229, + 806442590, + 66752, + -53228, + 806505801, + 66751, + -53227, + 806568029, + 66747, + -53226, + 806631721, + 66769, + -53225, + 806692760, + 66765, + -53224, + 806756184, + 66741, + -1, + 806820924, + 66740, + -1, + 800988471, + 983191, + 807088170, + 800942289, + -1, + 807153703, + 807021407, + -1, + 807219238, + 807099225, + -1, + 807284768, + 807163582, + -1, + -53217, + 807235565, + 128236, + -1, + 807294353, + 128237, + 807481379, + 807220006, + -1, + -53214, + 807428608, + 128449, + -1, + 807486342, + 128194, + -53212, + 807425104, + 128275, + -53211, + 807615520, + 128080, + -1, + 807672803, + 128214, + -1, + 807170156, + 983190, + 807940137, + 807109732, + 128191, + -1, + 807862839, + 128440, + -1, + 807878274, + 9934, + 808136759, + 807038796, + -1, + 808202292, + 808077775, + -1, + 808267825, + 808149768, + -1, + -53202, + 808221924, + 2933, + -53201, + 808283829, + 2930, + -53200, + 808336221, + 2931, + -1, + 808398389, + 2934, + 808648703, + 808223670, + -1, + -53197, + 808549614, + 2935, + -1, + 808611571, + 2932, + 808845311, + 808129498, + -1, + -53194, + 808729826, + 129505, + -1, + 808786915, + 128217, + 808988736, + 808082263, + -1, + 809054270, + 808919590, + -1, + -53190, + 809009781, + 128662, + -53189, + 809069680, + 128660, + -53188, + 809120996, + 128753, + -53187, + 809180401, + 128653, + -1, + 809244605, + 128664, + -53185, + 808987492, + 128431, + -1, + 809371217, + 128283, + 809578568, + 808947442, + -1, + 809644103, + 809520654, + 128471, + 809762815, + 809593662, + -1, + 809775174, + 809669301, + -1, + -53179, + 809729714, + 11194, + -1, + 809767791, + 11195, + -1, + 809704192, + 11196, + -1, + 809581825, + 129397, + 810102859, + 809510035, + -1, + -53174, + 810050840, + 128025, + -1, + 810094917, + 128721, + -53172, + 810063346, + 128002, + -53171, + 810259592, + 129417, + -53170, + 810323432, + 128228, + -53169, + 810374709, + 128329, + -53168, + 810437342, + 128076, + -53167, + 810500954, + 128738, + -53166, + 810562576, + 127970, + -53165, + 810624761, + 127842, + -1, + 810687652, + 9215, + 810889723, + 782706015, + -1, + 810955008, + 810846359, + -1, + 811020542, + 810904553, + -1, + 811086032, + 810963369, + -1, + 811151476, + 811038754, + 113692, + 811216999, + 811073536, + -1, + 811282524, + 811176868, + 113701, + -1, + 811204846, + 113702, + 811413598, + 811237710, + 113714, + -1, + 811336736, + 113715, + 811544672, + 811362513, + 113716, + -1, + 811467808, + 113717, + 811675746, + 811485891, + 113727, + -1, + 811598880, + 113728, + 811806820, + 811616757, + 113696, + -1, + 811729983, + 113710, + -53147, + 811759650, + 113706, + -53146, + 811883351, + 113723, + -1, + 811947540, + 113724, + 812134515, + 811160650, + -1, + 812200044, + 812067679, + -1, + -53142, + 812145495, + 113767, + -53141, + 812202695, + 113740, + -1, + 812264287, + 113742, + 812462191, + 812146789, + -1, + -53138, + 812421401, + 113730, + -1, + 812473175, + 113769, + -53136, + 812419223, + 113752, + -53135, + 812599797, + 113685, + -53134, + 812656533, + 113682, + -1, + 812716846, + 113768, + -1, + 812072731, + 113737, + 812986495, + 811096919, + 113690, + 813052026, + 812914264, + -1, + -53129, + 813009047, + 113761, + -53128, + 813064293, + 113762, + -53127, + 813121629, + 113763, + -1, + 813174545, + 113764, + 813432831, + 812974080, + -1, + 813445245, + 813323796, + 113694, + -1, + 813368383, + 113708, + -53122, + 813405092, + 113698, + -1, + 813529122, + 113704, + 813707401, + 812927477, + 113691, + 813826047, + 813629440, + -1, + 813838467, + 813732772, + 113699, + -1, + 813791287, + 113700, + 813969541, + 813791266, + 113705, + -1, + 813893158, + 113711, + 814100615, + 813914967, + 113712, + -1, + 814023743, + 113713, + 814284799, + 814044692, + 113695, + -1, + 814154815, + 113709, + 814362769, + 813666585, + 113720, + 814428300, + 814309477, + 113757, + -1, + 814387481, + 113760, + -53107, + 814366813, + 113758, + -53106, + 814496455, + 113721, + -53105, + 814558711, + 113759, + -53104, + 814616337, + 113756, + -1, + 814679072, + 113722, + 814887063, + 814313292, + 113675, + 814952597, + 814834262, + -1, + -53100, + 814909591, + 113750, + -1, + 814956637, + 113741, + -53098, + 814889671, + 113688, + -1, + 815072319, + 113680, + 815280284, + 814833765, + 113732, + -53095, + 815239449, + 113754, + -53094, + 815302807, + 113755, + -53093, + 815358357, + 113753, + -1, + 815402769, + 113731, + 815607970, + 815224340, + 113689, + 815726591, + 815529984, + -1, + 815739040, + 815618903, + 113693, + -1, + 815662143, + 113707, + -53087, + 815698852, + 113697, + -1, + 815822882, + 113703, + 816001190, + 815564951, + 113745, + -53084, + 815939677, + 113738, + -53083, + 816003783, + 113751, + -1, + 816055026, + 113748, + 816263339, + 815956302, + 113667, + 816328874, + 816185344, + -1, + -53079, + 816281634, + 113718, + -1, + 816344928, + 113719, + -1, + 816265927, + 113681, + 816591024, + 816212177, + 113666, + 816656559, + 816525564, + -1, + -53074, + 816601943, + 113765, + -1, + 816666132, + 113766, + -1, + 816579314, + 113676, + 816918709, + 816532727, + 113670, + 816984244, + 816866208, + -1, + -53069, + 816941207, + 113749, + -1, + 816988253, + 113743, + -1, + 816921287, + 113687, + 817246394, + 816859843, + 113669, + 817311929, + 817168384, + -1, + -53064, + 817262432, + 113725, + -1, + 817321492, + 113679, + -1, + 817253059, + 113684, + 817574077, + 817179487, + 113735, + -53060, + 817531031, + 113746, + -1, + 817572703, + 113739, + 817770688, + 817505631, + 113672, + -53057, + 817707719, + 113683, + -1, + 817759295, + 113677, + 817967298, + 817731058, + 113665, + -1, + 817926425, + 113747, + 818098372, + 817925685, + 113673, + -1, + 818045139, + 113770, + 818229446, + 818036829, + 113734, + -1, + 818162527, + 113736, + 818360520, + 818166471, + 113664, + -1, + 818302199, + 113686, + 818491594, + 818296745, + 113674, + -1, + 818414627, + 113726, + 818622668, + 818426662, + 113668, + -1, + 818545394, + 113678, + 818753742, + 818548497, + 113729, + -1, + 818701958, + 113733, + -53041, + 818714441, + 113744, + -1, + 818812962, + 113671, + 819015930, + 811012357, + -1, + 819081441, + 818957559, + -1, + 819146976, + 819030111, + -1, + 819212501, + 819105548, + 113816, + -1, + 819135563, + 113779, + 819343576, + 819154167, + -1, + -53033, + 819291045, + 113811, + -1, + 819348717, + 113814, + 819540187, + 819269393, + -1, + -53030, + 819492759, + 113817, + -1, + 819537226, + 113808, + -53028, + 819499470, + 113815, + -53027, + 819692672, + 113809, + -53026, + 819739217, + 113810, + -53025, + 819800199, + 113812, + -1, + 819863598, + 113813, + -1, + 819080588, + 113776, + 820130029, + 819019242, + -1, + 820195556, + 820088588, + 113800, + -1, + 820118603, + 113781, + 820326631, + 820137207, + -1, + -53018, + 820274085, + 113795, + -1, + 820331757, + 113798, + -53016, + 820285902, + 113799, + -53015, + 820479104, + 113793, + -53014, + 820525649, + 113794, + -53013, + 820586631, + 113796, + -53012, + 820650030, + 113797, + -1, + 820711521, + 113792, + 820916470, + 820057967, + -1, + 820982002, + 820871638, + -1, + 821047537, + 820927871, + 113784, + -1, + 820970024, + 113788, + -1, + 820986711, + 113785, + -53005, + 820935051, + 113782, + -53004, + 821186756, + 113783, + -53003, + 821248117, + 113787, + -1, + 821308304, + 113786, + 821506297, + 820861171, + -1, + -53000, + 821464920, + 113780, + -1, + 821509873, + 113777, + -1, + 821457826, + 113778, + -52997, + 818971484, + 113821, + -52996, + 821722214, + 113820, + -52995, + 821783996, + 113823, + -1, + 821832012, + 113822, + -52993, + 810965726, + 129375, + -1, + 821960949, + 129414, + 822161820, + 810901605, + -1, + 822227282, + 822097833, + 128021, + 822292817, + 822177692, + -1, + 822358333, + 822235561, + -1, + 822423818, + 822313294, + -1, + 822489352, + 822378830, + -1, + -52985, + 822426325, + 71701, + -1, + 822480657, + 71700, + -52983, + 822426325, + 71706, + -1, + 822611729, + 71705, + 822817039, + 822369111, + -1, + -52980, + 822777608, + 71699, + -52979, + 822827952, + 71704, + -52978, + 822884322, + 71694, + -1, + 822939409, + 71709, + 823144725, + 822748511, + -1, + 823210259, + 823076191, + -1, + -52974, + 823147221, + 71703, + -1, + 823201553, + 71702, + -52972, + 823147221, + 71708, + -1, + 823332625, + 71707, + 823537945, + 823070481, + 71680, + -52969, + 823494807, + 71689, + -52968, + 823541853, + 71687, + -1, + 823594769, + 71681, + 823800093, + 823490594, + -1, + -52965, + 823752862, + 71720, + -52964, + 823802581, + 71719, + -1, + 823856913, + 71721, + 824062239, + 823756951, + 71684, + -1, + 824019095, + 71685, + 824193314, + 824012620, + -1, + -52959, + 824143769, + 71723, + -1, + 824184593, + 71716, + 824389925, + 824142033, + -1, + -52956, + 824326869, + 71711, + -1, + 824381201, + 71710, + 824586536, + 824330947, + -1, + -52953, + 824523477, + 71691, + -1, + 824577809, + 71690, + 824783147, + 824527349, + -1, + -52950, + 824720085, + 71698, + -1, + 824774417, + 71697, + 824979757, + 824721501, + 71682, + -1, + 824918109, + 71683, + 825110832, + 824915881, + -1, + -52945, + 825047765, + 71693, + -1, + 825102097, + 71692, + 825307443, + 825040183, + -1, + -52942, + 825244373, + 71696, + -1, + 825298705, + 71695, + 825504054, + 825235490, + -1, + -52939, + 825440981, + 71713, + -1, + 825495313, + 71712, + -52937, + 825464584, + 71715, + -52936, + 825658951, + 71718, + -52935, + 825712741, + 71688, + -52934, + 825775710, + 71714, + -52933, + 825838921, + 71717, + -52932, + 825899733, + 71722, + -1, + 825961311, + 71686, + 826159434, + 822317304, + -1, + 826224962, + 826085137, + -1, + -52928, + 826181783, + 71734, + -52927, + 826228829, + 71732, + -1, + 826281745, + 71724, + 826487108, + 826183815, + 71729, + -1, + 826437452, + 71730, + 826618182, + 826443927, + 71727, + -1, + 826574999, + 71728, + 826749256, + 826556509, + 71725, + -1, + 826687581, + 71726, + -52919, + 826695781, + 71733, + -1, + 826813279, + 71731, + 827011408, + 826113104, + -1, + 827076942, + 826970113, + -1, + -52915, + 827029826, + 71736, + -1, + 827093055, + 71737, + -52913, + 827023342, + 71738, + -1, + 827200649, + 71735, + -1, + 826937263, + 71739, + -1, + 822215118, + 128054, + 827535750, + 822187150, + -1, + 827601283, + 827494783, + -1, + 827666814, + 827553828, + -1, + 827732331, + 827621710, + -1, + 827797866, + 827683606, + -1, + 827863401, + 827721796, + -1, + 827928934, + 827790812, + 11107, + 828047359, + 827850752, + -1, + 828060004, + 827954071, + -1, + 828125534, + 828003463, + -1, + -52899, + 828077221, + 11169, + -1, + 828133593, + 11168, + -52897, + 828084122, + 129075, + -52896, + 828267511, + 129059, + -52895, + 828332062, + 129063, + -52894, + 828390693, + 129071, + -52893, + 828451123, + 11133, + -1, + 828513215, + 129067, + -52891, + 828015944, + 11123, + -1, + 828658010, + 11139, + -52889, + 827889944, + 11085, + -52888, + 828795197, + 11143, + -1, + 828843650, + 11117, + -1, + 827785390, + 129171, + -1, + 827757876, + 11247, + 829174131, + 827659765, + -1, + 829239663, + 829127955, + -1, + -52882, + 829195909, + 129027, + -1, + 829239391, + 129043, + -52880, + 829185799, + 129179, + -52879, + 829380665, + 129031, + -52878, + 829443656, + 129035, + -1, + 829501535, + 129047, + 829698422, + 829126690, + -1, + -52875, + 829648552, + 129083, + -1, + 829690944, + 129107, + 829895033, + 829635853, + -1, + -52872, + 829825640, + 129091, + -1, + 829887964, + 129095, + -52870, + 829854409, + 129175, + -52869, + 830043852, + 128623, + -52868, + 830092477, + 129079, + -52867, + 830153320, + 129087, + -1, + 830216894, + 11147, + 830472191, + 827589083, + -1, + 830484865, + 830365434, + 129289, + -1, + 830408230, + 129291, + 830668799, + 830422723, + 129288, + -1, + 830539302, + 129290, + 830799871, + 827525278, + -1, + -52859, + 830700926, + 128317, + -1, + 830763445, + 128315, + 830943634, + 827492503, + -1, + 831009169, + 830872345, + -1, + 831074704, + 830930944, + -1, + 831140236, + 831027234, + -1, + -52853, + 831098310, + 11844, + -1, + 831160819, + 11849, + -52851, + 831098645, + 9208, + -52850, + 831280476, + 11842, + -52849, + 831340630, + 11840, + -1, + 831399185, + 10175, + -1, + 831006132, + 11260, + -1, + 830945609, + 127849, + 831730071, + 830874837, + 128462, + 831848447, + 831653252, + -1, + 831861142, + 831750931, + 128441, + -1, + 831782988, + 128442, + -1, + 831810353, + 128443, + -52840, + 831688319, + 128330, + -52839, + 832014194, + 11850, + -52838, + 832070967, + 128682, + -52837, + 832132523, + 128044, + -1, + 832176889, + 128687, + 832385484, + 822094687, + -1, + 832451005, + 832343605, + -1, + 832516534, + 832377698, + -1, + 832582058, + 832459177, + -1, + 832647587, + 832538775, + -1, + -52830, + 832604719, + 2423, + -1, + 832645983, + 2422, + 832844198, + 832594021, + -1, + -52827, + 832790826, + 2420, + -1, + 832842591, + 2419, + 833040809, + 832769809, + -1, + -52824, + 833001133, + 43262, + -1, + 833065241, + 2421, + -1, + 832984930, + 2424, + 833302964, + 832540920, + -1, + 833368494, + 833259671, + -1, + -52819, + 833325615, + 2391, + -1, + 833366879, + 2390, + 833565105, + 833314917, + -1, + -52816, + 833511722, + 2363, + -1, + 833563487, + 2362, + 833814527, + 833490705, + -1, + -52813, + 833722029, + 43263, + -1, + 833786137, + 2383, + -52811, + 833256568, + 43260, + -1, + 833899050, + 43261, + 834142207, + 832454998, + -1, + 834154938, + 834044238, + -1, + -52807, + 834114774, + 983085, + -1, + 834158418, + 983087, + -52805, + 834109486, + 983160, + -52804, + 834298628, + 983083, + -1, + 834352717, + 983089, + 834548163, + 832403490, + -1, + 834613697, + 834489511, + -1, + -52800, + 834573151, + 128468, + -1, + 834609785, + 128421, + 834863103, + 834548004, + 127964, + -1, + 834732637, + 127965, + 834941382, + 834489591, + 983119, + -52795, + 834881885, + 128666, + -1, + 834941311, + 983118, + 835137993, + 834870583, + -1, + -52792, + 835088677, + 128475, + -1, + 835142064, + 127795, + -52790, + 835088936, + 127962, + -52789, + 835283499, + 127980, + -1, + 835334261, + 129420, + 835531227, + 832323677, + -1, + 835596752, + 835492173, + -1, + -52785, + 835551519, + 128171, + -1, + 835597133, + 128565, + 835793363, + 835549477, + -1, + -52782, + 835728205, + 128542, + -1, + 835788046, + 128549, + 835989974, + 835738996, + -1, + -52779, + 835935446, + 127244, + -1, + 835985542, + 127243, + 836186585, + 835916564, + -1, + -52776, + 836141667, + 128924, + -1, + 836205334, + 128160, + -52774, + 836137330, + 127919, + -1, + 836317495, + 128754, + 836514281, + 835456785, + -1, + 836579809, + 836450540, + -1, + 836645344, + 836539287, + -1, + -52769, + 836596585, + 11831, + -1, + 836652998, + 11830, + -1, + 836586593, + 128481, + 836907492, + 836532875, + -1, + -52765, + 836867030, + 11843, + -1, + 836927775, + 128168, + 837104103, + 836852567, + -1, + -52762, + 837040653, + 127841, + -1, + 837099290, + 128131, + -52760, + 837059033, + 983081, + -1, + 837252740, + 128374, + 837431794, + 836464460, + -1, + 837497326, + 837378149, + -1, + -52756, + 837446596, + 128167, + -52755, + 837509650, + 129316, + -1, + 837572577, + 128042, + 837759472, + 837423424, + 128009, + -1, + 837681614, + 128050, + -52751, + 837716734, + 129345, + -1, + 837824871, + 128087, + 838021624, + 837360951, + -1, + -52748, + 837974050, + 983161, + -52747, + 838011779, + 983090, + -52746, + 838077130, + 983088, + -52745, + 838142450, + 983086, + -1, + 838207830, + 983084, + -52743, + 837979754, + 128192, + -52742, + 838359987, + 129516, + -1, + 838422308, + 983082, + 838611760, + 810847797, + -1, + 838677245, + 838563874, + -1, + 838742636, + 838601046, + 983240, + 838808073, + 838667910, + 983270, + -52736, + 838733446, + 983450, + -52735, + 838798855, + 983449, + -52734, + 838864225, + 983448, + -52733, + 838929609, + 983447, + -52732, + 838994975, + 983446, + -52731, + 839060355, + 983445, + -52730, + 839125706, + 983444, + -52729, + 839191026, + 983443, + -52728, + 839256406, + 983442, + -1, + 839321798, + 983441, + 839528980, + 838733319, + 983269, + -52725, + 839454342, + 983440, + -52724, + 839519751, + 983439, + -52723, + 839585121, + 983438, + -52722, + 839650505, + 983437, + -52721, + 839715871, + 983436, + -52720, + 839781251, + 983435, + -52719, + 839846602, + 983434, + -52718, + 839911922, + 983433, + -52717, + 839977302, + 983432, + -1, + 840042694, + 983431, + 840249887, + 839454049, + 983268, + -52714, + 840175238, + 983430, + -52713, + 840240647, + 983429, + -52712, + 840306017, + 983428, + -52711, + 840371401, + 983427, + -52710, + 840436767, + 983426, + -52709, + 840502147, + 983425, + -52708, + 840567498, + 983424, + -52707, + 840632818, + 983423, + -52706, + 840698198, + 983422, + -1, + 840763590, + 983421, + 840970794, + 840174793, + 983255, + -52703, + 840896134, + 983420, + -52702, + 840961543, + 983419, + -52701, + 841026913, + 983418, + -52700, + 841092297, + 983417, + -52699, + 841157663, + 983416, + -52698, + 841223043, + 983415, + -52697, + 841288394, + 983414, + -52696, + 841353714, + 983413, + -52695, + 841419094, + 983412, + -1, + 841484486, + 983411, + 841691701, + 840895519, + 983254, + -52692, + 841617030, + 983410, + -52691, + 841682439, + 983409, + -52690, + 841747809, + 983408, + -52689, + 841813193, + 983407, + -52688, + 841878559, + 983406, + -52687, + 841943939, + 983405, + -52686, + 842009290, + 983404, + -52685, + 842074610, + 983403, + -52684, + 842139990, + 983402, + -1, + 842205382, + 983401, + 842412608, + 841616259, + 983253, + -52681, + 842337926, + 983400, + -52680, + 842403335, + 983399, + -52679, + 842468705, + 983398, + -52678, + 842534089, + 983397, + -52677, + 842599455, + 983396, + -52676, + 842664835, + 983395, + -52675, + 842730186, + 983394, + -52674, + 842795506, + 983393, + -52673, + 842860886, + 983392, + -1, + 842926278, + 983391, + 843133515, + 842336970, + 983252, + -52670, + 843058822, + 983390, + -52669, + 843124231, + 983389, + -52668, + 843189601, + 983388, + -52667, + 843254985, + 983387, + -52666, + 843320351, + 983386, + -52665, + 843385731, + 983385, + -52664, + 843451082, + 983384, + -52663, + 843516402, + 983383, + -52662, + 843581782, + 983382, + -1, + 843647174, + 983381, + 843854422, + 843057650, + 983251, + -52659, + 843779718, + 983380, + -52658, + 843845127, + 983379, + -52657, + 843910497, + 983378, + -52656, + 843975881, + 983377, + -52655, + 844041247, + 983376, + -52654, + 844106627, + 983375, + -52653, + 844171978, + 983374, + -52652, + 844237298, + 983373, + -52651, + 844302678, + 983372, + -1, + 844368070, + 983371, + 844575329, + 843778390, + 983250, + -52648, + 844500614, + 983370, + -52647, + 844566023, + 983369, + -52646, + 844631393, + 983368, + -52645, + 844696777, + 983367, + -52644, + 844762143, + 983366, + -52643, + 844827523, + 983365, + -52642, + 844892874, + 983364, + -52641, + 844958194, + 983363, + -52640, + 845023574, + 983362, + -1, + 845088966, + 983361, + 845348863, + 844499142, + 983249, + -52637, + 845221510, + 983360, + -52636, + 845286919, + 983359, + -52635, + 845352289, + 983358, + -52634, + 845417673, + 983357, + -52633, + 845483039, + 983356, + -52632, + 845548419, + 983355, + -52631, + 845613770, + 983354, + -52630, + 845679090, + 983353, + -52629, + 845744470, + 983352, + -1, + 845809862, + 983351, + 846017200, + 838666738, + 983241, + 846082680, + 845941635, + 983275, + -52625, + 846007942, + 983500, + -52624, + 846073351, + 983499, + -52623, + 846138721, + 983498, + -52622, + 846204105, + 983497, + -52621, + 846269471, + 983496, + -52620, + 846334851, + 983495, + -52619, + 846400202, + 983494, + -52618, + 846465522, + 983493, + -52617, + 846530902, + 983492, + -1, + 846596294, + 983491, + 846803587, + 846006986, + 983274, + -52614, + 846728838, + 983490, + -52613, + 846794247, + 983489, + -52612, + 846859617, + 983488, + -52611, + 846925001, + 983487, + -52610, + 846990367, + 983486, + -52609, + 847055747, + 983485, + -52608, + 847121098, + 983484, + -52607, + 847186418, + 983483, + -52606, + 847251798, + 983482, + -1, + 847317190, + 983481, + 847524494, + 846727666, + 983273, + -52603, + 847449734, + 983480, + -52602, + 847515143, + 983479, + -52601, + 847580513, + 983478, + -52600, + 847645897, + 983477, + -52599, + 847711263, + 983476, + -52598, + 847776643, + 983475, + -52597, + 847841994, + 983474, + -52596, + 847907314, + 983473, + -52595, + 847972694, + 983472, + -1, + 848038086, + 983471, + 848245401, + 847448406, + 983272, + -52592, + 848170630, + 983470, + -52591, + 848236039, + 983469, + -52590, + 848301409, + 983468, + -52589, + 848366793, + 983467, + -52588, + 848432159, + 983466, + -52587, + 848497539, + 983465, + -52586, + 848562890, + 983464, + -52585, + 848628210, + 983463, + -52584, + 848693590, + 983462, + -1, + 848758982, + 983461, + 848966308, + 848169158, + 983271, + -52581, + 848891526, + 983460, + -52580, + 848956935, + 983459, + -52579, + 849022305, + 983458, + -52578, + 849087689, + 983457, + -52577, + 849153055, + 983456, + -52576, + 849218435, + 983455, + -52575, + 849283786, + 983454, + -52574, + 849349106, + 983453, + -52573, + 849414486, + 983452, + -1, + 849479878, + 983451, + 849687212, + 848890911, + 983276, + -52570, + 849611977, + 983507, + -52569, + 849677343, + 983506, + -52568, + 849742723, + 983505, + -52567, + 849808074, + 983504, + -52566, + 849873394, + 983503, + -52565, + 849938774, + 983502, + -1, + 850004166, + 983501, + -52563, + 849612422, + 983280, + -52562, + 850136583, + 983279, + -52561, + 850201953, + 983278, + -1, + 850267337, + 983277, + 850473659, + 845942406, + 983248, + -52558, + 850398854, + 983350, + -52557, + 850464263, + 983349, + -52556, + 850529633, + 983348, + -52555, + 850595017, + 983347, + -52554, + 850660383, + 983346, + -52553, + 850725763, + 983345, + -52552, + 850791114, + 983344, + -52551, + 850856434, + 983343, + -52550, + 850921814, + 983342, + -1, + 850987206, + 983341, + 851194566, + 850398727, + 983247, + -52547, + 851119750, + 983340, + -52546, + 851185159, + 983339, + -52545, + 851250529, + 983338, + -52544, + 851315913, + 983337, + -52543, + 851381279, + 983336, + -52542, + 851446659, + 983335, + -52541, + 851512010, + 983334, + -52540, + 851577330, + 983333, + -52539, + 851642710, + 983332, + -1, + 851708102, + 983331, + 851915473, + 851119457, + 983246, + -52536, + 851840646, + 983330, + -52535, + 851906055, + 983329, + -52534, + 851971425, + 983328, + -52533, + 852036809, + 983327, + -52532, + 852102175, + 983326, + -52531, + 852167555, + 983325, + -52530, + 852232906, + 983324, + -52529, + 852298226, + 983323, + -52528, + 852363606, + 983322, + -1, + 852428998, + 983321, + 852636380, + 851840201, + 983245, + -52525, + 852561542, + 983320, + -52524, + 852626951, + 983319, + -52523, + 852692321, + 983318, + -52522, + 852757705, + 983317, + -52521, + 852823071, + 983316, + -52520, + 852888451, + 983315, + -52519, + 852953802, + 983314, + -52518, + 853019122, + 983313, + -52517, + 853084502, + 983312, + -1, + 853149894, + 983311, + 853357287, + 852560927, + 983244, + -52514, + 853282438, + 983310, + -52513, + 853347847, + 983309, + -52512, + 853413217, + 983308, + -52511, + 853478601, + 983307, + -52510, + 853543967, + 983306, + -52509, + 853609347, + 983305, + -52508, + 853674698, + 983304, + -52507, + 853740018, + 983303, + -52506, + 853805398, + 983302, + -1, + 853870790, + 983301, + 854078194, + 853281667, + 983243, + -52503, + 854003334, + 983300, + -52502, + 854068743, + 983299, + -52501, + 854134113, + 983298, + -52500, + 854199497, + 983297, + -52499, + 854264863, + 983296, + -52498, + 854330243, + 983295, + -52497, + 854395594, + 983294, + -52496, + 854460914, + 983293, + -52495, + 854526294, + 983292, + -1, + 854591686, + 983291, + 854851583, + 854002378, + 983242, + -52492, + 854724230, + 983290, + -52491, + 854789639, + 983289, + -52490, + 854855009, + 983288, + -52489, + 854920393, + 983287, + -52488, + 854985759, + 983286, + -52487, + 855051139, + 983285, + -52486, + 855116490, + 983284, + -52485, + 855181810, + 983283, + -52484, + 855247190, + 983282, + -1, + 855312582, + 983281, + 855520033, + 838609759, + -1, + 855585559, + 855469900, + -1, + 855651087, + 855545519, + -1, + 855716622, + 855588109, + -1, + 855782149, + 855668770, + -1, + -52477, + 855728646, + 128636, + -52476, + 855787915, + 128953, + -1, + 855839427, + 128941, + 856044296, + 855741109, + -1, + -52473, + 855998114, + 128914, + -1, + 856039470, + 128904, + 856240907, + 855977478, + -1, + -52470, + 856194702, + 128959, + -1, + 856255518, + 128976, + -52468, + 856191666, + 128637, + -52467, + 856373847, + 128934, + -1, + 856438046, + 128947, + -1, + 855645102, + 128933, + 856752127, + 855606365, + -1, + 856765206, + 856654158, + -1, + 856830741, + 856690566, + -1, + 856896276, + 856787650, + 983069, + -1, + 856818782, + 983143, + -1, + 856818277, + 11135, + -1, + 856780731, + 128678, + -1, + 856718555, + 11837, + 857276415, + 855517158, + -1, + 857289501, + 857177168, + -1, + -52454, + 857246768, + 7414, + -52453, + 857306907, + 7411, + -52452, + 857361005, + 7413, + -1, + 857413421, + 7415, + 857669631, + 857245058, + -1, + -52449, + 857568582, + 7416, + -52448, + 857614737, + 7417, + -1, + 857677249, + 7412, + 857879337, + 855457885, + -1, + 857944871, + 857810707, + -1, + 858010406, + 857866240, + -1, + -52443, + 857946150, + 127918, + -1, + 858004895, + 128249, + -1, + 857939536, + 128252, + -52440, + 857891341, + 127931, + -1, + 858201161, + 128243, + 858403627, + 857833806, + 983070, + -1, + 858355746, + 983144, + 858534702, + 858350068, + -1, + -52435, + 858477158, + 127952, + -1, + 858529260, + 127755, + -52433, + 858491594, + 11238, + -1, + 858657563, + 129499, + 858862714, + 838547369, + -1, + 858928052, + 858812236, + -1, + 858993559, + 858853137, + -1, + 859059093, + 858939346, + -1, + 859124599, + 859001257, + -1, + 859190079, + 859082293, + -1, + 859255611, + 859136203, + -1, + 859321145, + 859205452, + 70411, + -1, + 859270988, + 70496, + 859504639, + 859262199, + 70412, + -1, + 859393271, + 70497, + 859583294, + 859188496, + -1, + -52419, + 859515090, + 70495, + -1, + 859575433, + 70494, + -1, + 859508497, + 70453, + 859845445, + 859144526, + -1, + 859910979, + 859799886, + -1, + -52414, + 859847381, + 70432, + -1, + 859901713, + 70431, + -52412, + 859847381, + 70437, + -1, + 860032785, + 70436, + 860238666, + 859790167, + -1, + -52409, + 860198664, + 70430, + -52408, + 860249008, + 70435, + -52407, + 860305378, + 70425, + -1, + 860360465, + 70440, + 860566352, + 860169567, + -1, + 860631886, + 860497247, + -1, + -52403, + 860568277, + 70434, + -1, + 860622609, + 70433, + -52401, + 860568277, + 70439, + -1, + 860753681, + 70438, + 860959572, + 860491537, + 70405, + -52398, + 860915863, + 70420, + -52397, + 860962909, + 70416, + -1, + 861015825, + 70406, + 861221720, + 860911650, + -1, + -52394, + 861173918, + 70455, + -52393, + 861223637, + 70454, + -1, + 861277969, + 70456, + 861483866, + 861178007, + 70409, + -1, + 861440151, + 70410, + 861614941, + 861432017, + -1, + -52388, + 861551317, + 70443, + -1, + 861605649, + 70442, + 861811552, + 861555959, + -1, + -52385, + 861752649, + 70451, + -1, + 861802257, + 70450, + 862008163, + 861752003, + -1, + -52382, + 861944533, + 70422, + -1, + 861998865, + 70421, + 862204774, + 861948405, + -1, + -52379, + 862141141, + 70429, + -1, + 862195473, + 70428, + 862401384, + 862142557, + 70407, + -1, + 862339165, + 70408, + 862532459, + 862336937, + -1, + -52374, + 862468821, + 70424, + -1, + 862523153, + 70423, + 862729070, + 862461239, + -1, + -52371, + 862665429, + 70427, + -1, + 862719761, + 70426, + 862925681, + 862656546, + -1, + -52368, + 862862037, + 70445, + -1, + 862916369, + 70444, + -52366, + 862885640, + 70447, + -52365, + 863072153, + 70448, + -52364, + 863134803, + 70419, + -52363, + 863196766, + 70446, + -52362, + 863255253, + 70457, + -1, + 863317282, + 70415, + 863515527, + 859083000, + -1, + 863581053, + 863473790, + -1, + 863646587, + 863530828, + 70467, + -1, + 863596364, + 70468, + 863830015, + 863587575, + 70498, + -1, + 863718647, + 70499, + 863908737, + 863506193, + -1, + -52353, + 863864983, + 70476, + -52352, + 863912029, + 70472, + -1, + 863964945, + 70462, + 864170883, + 863864983, + 70465, + -1, + 864127127, + 70466, + 864301957, + 864108637, + 70463, + -1, + 864239709, + 70464, + -52346, + 864248915, + 70475, + -1, + 864365858, + 70471, + 864564115, + 863468624, + -1, + 864629643, + 864522241, + -1, + -52342, + 864581954, + 70403, + -1, + 864645183, + 70477, + 864826254, + 864558391, + -1, + -52339, + 864772709, + 70400, + -1, + 864818123, + 70401, + 865022865, + 864751377, + -1, + -52336, + 864980554, + 70461, + -1, + 865034301, + 70402, + -52334, + 864971782, + 70493, + -1, + 865165294, + 70460, + -52332, + 864510517, + 70480, + -1, + 865277850, + 70487, + -52330, + 859007741, + 127815, + -1, + 865413893, + 127891, + 865612709, + 858926370, + -1, + 865678240, + 865553093, + -1, + 865743772, + 865630242, + -1, + -52325, + 865703988, + 65952, + -1, + 865748630, + 65932, + -52323, + 865690430, + 65931, + -52322, + 865882634, + 43877, + -52321, + 865944798, + 65933, + -1, + 866000419, + 895, + 866254847, + 865622873, + -1, + -52318, + 866154695, + 129367, + -52317, + 866204898, + 128154, + -52316, + 866261987, + 128215, + -1, + 866325735, + 127823, + 866530223, + 865550429, + -1, + 866595758, + 866475614, + -1, + 866661293, + 866530125, + 128512, + 866779135, + 866583940, + -1, + 866792364, + 866678818, + -1, + -52309, + 866746970, + 129321, + -1, + 866802078, + 128513, + -1, + 866738978, + 129322, + -1, + 866590354, + 128568, + -1, + 866539125, + 128556, + 867237887, + 866476133, + -1, + 867251123, + 867142541, + -1, + -52302, + 867203603, + 983109, + -1, + 867260227, + 11218, + -1, + 867210086, + 128151, + 867513369, + 858884247, + -1, + 867578890, + 867458604, + -1, + 867644395, + 867520937, + -1, + 867709885, + 867598670, + -1, + 867775419, + 867664206, + -1, + -52294, + 867711701, + 73086, + -1, + 867766033, + 73085, + -52292, + 867711701, + 73076, + -1, + 867897105, + 73075, + 868103107, + 867640671, + -1, + 868168641, + 868033887, + -1, + -52288, + 868104917, + 73091, + -1, + 868159249, + 73090, + -52286, + 868104917, + 73081, + -1, + 868290321, + 73080, + 868496327, + 868028177, + 73056, + -52283, + 868452503, + 73067, + -52282, + 868499549, + 73064, + -1, + 868552465, + 73057, + 868758473, + 868452503, + 73060, + -1, + 868714647, + 73061, + 868889548, + 868706513, + -1, + -52277, + 868825813, + 73094, + -1, + 868880145, + 73093, + 869086159, + 868834135, + -1, + -52274, + 869021666, + 73092, + -1, + 869076753, + 73082, + 869282770, + 869027063, + -1, + -52271, + 869223753, + 73087, + -1, + 869273361, + 73077, + 869479381, + 869223107, + -1, + -52268, + 869415637, + 73074, + -1, + 869469969, + 73073, + 869675992, + 869419509, + -1, + -52265, + 869612245, + 73089, + -1, + 869666577, + 73088, + 869872602, + 869613661, + 73058, + -1, + 869810269, + 73059, + 870003677, + 869808041, + -1, + -52260, + 869939925, + 73079, + -1, + 869994257, + 73078, + 870200288, + 869932343, + -1, + -52257, + 870136533, + 73084, + -1, + 870190865, + 73083, + 870396899, + 870127650, + -1, + -52254, + 870333141, + 73071, + -1, + 870387473, + 73070, + -52252, + 870356744, + 73068, + -52251, + 870551111, + 73069, + -52250, + 870611102, + 73097, + -52249, + 870674329, + 73096, + -52248, + 870736979, + 73066, + -52247, + 870798942, + 73072, + -52246, + 870857429, + 73095, + -1, + 870919458, + 73063, + 871117816, + 867601973, + -1, + 871183351, + 871065727, + -1, + 871248881, + 871108369, + -1, + -52241, + 871205015, + 73108, + -52240, + 871252061, + 73105, + -1, + 871304977, + 73098, + 871511027, + 871205015, + 73101, + -1, + 871467159, + 73102, + 871642101, + 871448669, + 73099, + -1, + 871579741, + 73100, + -52234, + 871588947, + 73107, + -1, + 871705890, + 73104, + -1, + 871122772, + 73111, + 871969798, + 871049209, + -1, + 872035324, + 871924046, + -1, + -52229, + 871994582, + 73122, + -1, + 872038226, + 73123, + 872231935, + 871987234, + -1, + -52226, + 872171901, + 73126, + -1, + 872231478, + 73127, + 872428546, + 872166182, + -1, + -52223, + 872376074, + 73124, + -1, + 872433887, + 73125, + -52221, + 872388871, + 73120, + -52220, + 872571652, + 73121, + -52219, + 872635842, + 73129, + -1, + 872689152, + 73128, + 872887305, + 871922768, + -1, + -52216, + 872845402, + 73110, + -1, + 872879241, + 73109, + -1, + 872833589, + 73112, + 873149462, + 867519030, + -1, + 873214996, + 873102416, + -1, + 873280527, + 873169230, + -1, + -52210, + 873239838, + 2815, + -1, + 873283503, + 2813, + 873477138, + 873232418, + -1, + -52207, + 873433776, + 2810, + -1, + 873478890, + 2811, + -52205, + 873420461, + 2812, + -1, + 873603162, + 2814, + -52203, + 873157166, + 2809, + -1, + 873729967, + 2800, + -52201, + 873100972, + 2678, + -52200, + 873875607, + 127928, + -1, + 873928006, + 128130, + 874132582, + 867445599, + -1, + 874198116, + 874079628, + -1, + 874263641, + 874142467, + -1, + 874329124, + 874199751, + -1, + 874394657, + 874254097, + -1, + 874460192, + 874344268, + 7348, + -1, + 874390957, + 7358, + -1, + 874392415, + 7344, + -52190, + 874340650, + 7349, + -52189, + 874594748, + 7346, + -1, + 874654559, + 7345, + 874853418, + 874257719, + -1, + 874918952, + 874789575, + -1, + -52185, + 874857437, + 7337, + -1, + 874910960, + 7341, + -52183, + 874857303, + 7340, + -1, + 875041582, + 7338, + 875246639, + 874807630, + -1, + 875312174, + 875171601, + -1, + -52179, + 875261772, + 7330, + -1, + 875322199, + 7319, + -1, + 875269423, + 7353, + 875574323, + 875171601, + -1, + -52175, + 875518807, + 7312, + -52174, + 875578333, + 7354, + -1, + 875638510, + 7357, + 875836470, + 875534456, + -1, + -52171, + 875772992, + 7327, + -1, + 875835118, + 7318, + 876033081, + 875788322, + -1, + -52168, + 875970093, + 7336, + -1, + 876024622, + 7329, + 876229692, + 875981009, + -1, + -52165, + 876166208, + 7332, + -1, + 876221680, + 7326, + 876426303, + 876170569, + -1, + -52162, + 876378146, + 7322, + -1, + 876419598, + 7359, + 876622914, + 876366531, + -1, + -52159, + 876559424, + 7333, + -1, + 876614446, + 7321, + 876819525, + 876562933, + -1, + -52156, + 876757847, + 7339, + -1, + 876821423, + 7343, + 877016136, + 876754857, + -1, + -52153, + 876952495, + 7334, + -1, + 877007662, + 7314, + 877212747, + 876948319, + -1, + -52150, + 877157207, + 7316, + -1, + 877220599, + 7352, + -52148, + 877172811, + 7351, + -52147, + 877368872, + 7342, + -52146, + 877433391, + 7347, + -52145, + 877498431, + 7317, + -52144, + 877562656, + 7331, + -52143, + 877621175, + 7328, + -52142, + 877686350, + 7335, + -52141, + 877748902, + 7325, + -52140, + 877812714, + 7324, + -52139, + 877877028, + 7323, + -52138, + 877937629, + 7320, + -52137, + 877999135, + 7350, + -52136, + 878061699, + 7315, + -1, + 878123208, + 7313, + 878326878, + 874205609, + -1, + -52133, + 878282989, + 983936, + -52132, + 878333265, + 4351, + -52131, + 878394457, + 4350, + -1, + 878448820, + 4349, + 878654561, + 878279975, + -1, + -52128, + 878614603, + 11559, + -1, + 878645428, + 11565, + 878903295, + 878583286, + -1, + -52125, + 878811211, + 4295, + -1, + 878842036, + 4301, + -52123, + 874143144, + 129502, + -1, + 878990893, + 128142, + 879178861, + 874078309, + -1, + 879244394, + 879103761, + -1, + -52119, + 879198542, + 128016, + -1, + 879250691, + 129349, + -52117, + 879195417, + 129421, + -52116, + 879383176, + 127948, + -1, + 879442173, + 129405, + 879637619, + 879119607, + -1, + 879703154, + 879583333, + -1, + -52112, + 879661937, + 127775, + -52111, + 879726556, + 129508, + -1, + 879761713, + 127760, + -1, + 879629991, + 129371, + 880030839, + 879576903, + -1, + 880096374, + 879971575, + 128103, + -1, + 880048246, + 128714, + -1, + 880021755, + 129426, + -52104, + 879982626, + 983110, + -52103, + 880230193, + 128123, + -1, + 880284389, + 127922, + 880489894, + 858802883, + -1, + 880555370, + 880425671, + -1, + 880620759, + 880511509, + -1, + 880686266, + 880562601, + -1, + 880751749, + 880616799, + -1, + 880817283, + 880682335, + -1, + -52095, + 880753365, + 70347, + -52094, + 880813547, + 70345, + -1, + 880873233, + 70344, + -52092, + 880753365, + 70352, + -1, + 881004305, + 70351, + 881210507, + 880705870, + -1, + 881276041, + 881164622, + -1, + -52088, + 881212117, + 70343, + -1, + 881266449, + 70342, + -52086, + 881212117, + 70350, + -1, + 881397521, + 70349, + 881603728, + 881154903, + -1, + -52083, + 881563400, + 70341, + -52082, + 881613744, + 70348, + -52081, + 881670114, + 70335, + -1, + 881725201, + 70353, + 881931412, + 881528593, + 70320, + -52078, + 881887383, + 70329, + -52077, + 881934429, + 70327, + -1, + 881987345, + 70321, + 882193560, + 881871349, + -1, + -52074, + 882133530, + 70339, + -52073, + 882195157, + 70340, + -1, + 882249489, + 70338, + 882455708, + 882128809, + -1, + -52070, + 882391765, + 70334, + -52069, + 882456546, + 70333, + -1, + 882511633, + 70332, + 882717856, + 882382882, + -1, + -52066, + 882653909, + 70358, + -52065, + 882710579, + 70357, + -1, + 882773777, + 70356, + 882980002, + 882673815, + 70324, + -1, + 882935959, + 70325, + 883111077, + 882931746, + -1, + -52060, + 883047125, + 70364, + -1, + 883101457, + 70365, + 883307688, + 883060556, + -1, + -52057, + 883257241, + 70346, + -1, + 883298065, + 70361, + 883504299, + 883255505, + -1, + -52054, + 883440341, + 70355, + -1, + 883494673, + 70354, + 883700910, + 883444419, + -1, + -52051, + 883636949, + 70331, + -1, + 883691281, + 70330, + 883897520, + 883638365, + 70322, + -1, + 883834973, + 70323, + 884028595, + 883825975, + -1, + -52046, + 883964629, + 70337, + -1, + 884018961, + 70336, + -52044, + 883988232, + 70360, + -52043, + 884182599, + 70363, + -52042, + 884236389, + 70328, + -52041, + 884299358, + 70359, + -52040, + 884362569, + 70362, + -52039, + 884423381, + 70366, + -1, + 884484959, + 70326, + 884683976, + 880617465, + -1, + 884749502, + 884638030, + -1, + -52035, + 884708566, + 70386, + -1, + 884752210, + 70387, + 884946113, + 884701218, + -1, + -52032, + 884885885, + 70390, + -1, + 884945462, + 70391, + 885142724, + 884880166, + -1, + -52029, + 885090058, + 70388, + -1, + 885147871, + 70389, + -52027, + 885102855, + 70384, + -52026, + 885285636, + 70385, + -52025, + 885349826, + 70393, + -1, + 885403136, + 70392, + 885601491, + 884642040, + -1, + 885667021, + 885526289, + -1, + -52021, + 885622935, + 70376, + -52020, + 885669981, + 70374, + -1, + 885722897, + 70368, + 885929167, + 885622935, + 70371, + -1, + 885885079, + 70372, + 886060241, + 885866589, + 70369, + -1, + 885997661, + 70370, + -52014, + 886005861, + 70375, + -1, + 886123359, + 70373, + 886374399, + 885554256, + -1, + -52011, + 886280275, + 70378, + -52010, + 886333422, + 70377, + -1, + 886379657, + 70367, + 886584618, + 880566711, + -1, + 886650128, + 886526377, + -1, + 886715616, + 886580575, + -1, + 886781150, + 886646111, + -1, + -52004, + 886717141, + 70167, + -52003, + 886777323, + 70172, + -1, + 886837009, + 70166, + -52001, + 886717141, + 70173, + -1, + 886968081, + 70171, + 887174374, + 886669646, + -1, + 887239908, + 887128398, + -1, + -51997, + 887175893, + 70165, + -1, + 887230225, + 70164, + -51995, + 887175893, + 70170, + -1, + 887361297, + 70169, + 887567595, + 887118679, + -1, + -51992, + 887527176, + 70163, + -51991, + 887577520, + 70168, + -51990, + 887633890, + 70157, + -1, + 887688977, + 70174, + 887895279, + 887492369, + 70144, + -51987, + 887851159, + 70151, + -51986, + 887898205, + 70149, + -1, + 887951121, + 70145, + 888157427, + 887830441, + -1, + -51983, + 888093397, + 70156, + -51982, + 888158178, + 70155, + -1, + 888213265, + 70154, + 888419575, + 888084514, + -1, + -51979, + 888355541, + 70179, + -51978, + 888412211, + 70178, + -1, + 888475409, + 70177, + 888681722, + 888367313, + -1, + -51975, + 888617685, + 70176, + -1, + 888672017, + 70175, + 888878333, + 888622327, + -1, + -51972, + 888819017, + 70187, + -1, + 888868625, + 70183, + 889074944, + 888818371, + -1, + -51969, + 889010901, + 70153, + -1, + 889065233, + 70152, + 889271555, + 889014773, + -1, + -51966, + 889211418, + 70161, + -1, + 889261841, + 70160, + 889468166, + 889199927, + -1, + -51963, + 889404117, + 70159, + -1, + 889458449, + 70158, + -51961, + 889427720, + 70181, + -51960, + 889622087, + 70184, + -51959, + 889686167, + 70147, + -51958, + 889747614, + 70185, + -51957, + 889810841, + 70182, + -51956, + 889872485, + 70150, + -51955, + 889935454, + 70180, + -51954, + 889995357, + 70146, + -51953, + 890059477, + 70186, + -1, + 890121055, + 70148, + 890320154, + 886608120, + -1, + 890385685, + 890244881, + -1, + -51949, + 890341527, + 70195, + -51948, + 890388573, + 70193, + -1, + 890441489, + 70188, + 890647831, + 890323037, + 70189, + -1, + 890585181, + 70190, + -51944, + 890603671, + 70191, + -51943, + 890724453, + 70194, + -1, + 890776415, + 70192, + 890975523, + 890271778, + -1, + 891041058, + 890913526, + -1, + 891106591, + 890992674, + -1, + -51938, + 891062960, + 70206, + -1, + 891108074, + 70199, + -51936, + 891064403, + 70197, + -51935, + 891248622, + 70198, + -1, + 891294857, + 70196, + -1, + 890973339, + 70203, + 891565352, + 890905951, + -1, + 891630887, + 891512457, + -1, + -51930, + 891582866, + 70204, + -1, + 891627106, + 70201, + -1, + 891556795, + 70200, + -51927, + 891524496, + 70202, + -1, + 891817903, + 70205, + 892024165, + 886528191, + -1, + 892089691, + 891953877, + -1, + 892155189, + 892043598, + -1, + 892220720, + 892109597, + -1, + -51921, + 892166245, + 983950, + -1, + 892210961, + 983948, + 892417331, + 892156615, + -1, + -51918, + 892362853, + 983955, + -1, + 892407569, + 983953, + -51916, + 892362853, + 983954, + -1, + 892538641, + 983952, + 892745018, + 892099415, + -1, + -51913, + 892704854, + 983946, + -51912, + 892756069, + 983956, + -51911, + 892811789, + 983941, + -1, + 892866321, + 983951, + 893072704, + 892684995, + -1, + 893138238, + 893008583, + -1, + -51907, + 893083749, + 983940, + -1, + 893128465, + 983938, + -51905, + 893083749, + 983939, + -1, + 893259537, + 983937, + 893465926, + 893001015, + -1, + 893531460, + 893401799, + -1, + -51901, + 893476965, + 983945, + -1, + 893521681, + 983943, + -51899, + 893476965, + 983944, + -1, + 893652753, + 983942, + 893859146, + 893417506, + -1, + -51896, + 893810846, + 983967, + -51895, + 893860565, + 983966, + -1, + 893914897, + 983968, + 894121295, + 893806801, + -1, + 894186830, + 894057159, + -1, + -51891, + 894132325, + 983960, + -1, + 894177041, + 983958, + -1, + 894132325, + 983959, + 894448978, + 894061815, + -1, + -51887, + 894394469, + 983964, + -1, + 894439185, + 983970, + 894645589, + 894379359, + -1, + -51884, + 894591077, + 983949, + -1, + 894635793, + 983947, + -51882, + 894605398, + 983962, + -51881, + 894799988, + 983965, + -51880, + 894858949, + 983963, + -51879, + 894917142, + 983961, + -51878, + 894974677, + 983969, + -1, + 895031347, + 983957, + 895235425, + 892027957, + -1, + 895300958, + 895186967, + 983973, + -1, + 895260333, + 983974, + 895483903, + 895249965, + -1, + -51872, + 895387799, + 983972, + -1, + 895429471, + 983975, + 895680511, + 895193336, + -1, + -51869, + 895574581, + 983976, + -51868, + 895623637, + 983971, + -1, + 895684463, + 983977, + 895942655, + 891950523, + -1, + 895956329, + 895832489, + -1, + -51864, + 895913981, + 68149, + -1, + 895977361, + 68148, + -1, + 895891184, + 68168, + 896218501, + 880480017, + -1, + 896284026, + 896172604, + -1, + 896349554, + 896211490, + -1, + -51858, + 896305303, + 983985, + -51857, + 896360549, + 983987, + -51856, + 896417885, + 983984, + -51855, + 896478047, + 983986, + -1, + 896536337, + 983983, + 896794623, + 896274193, + -1, + 896808313, + 896681617, + -1, + 896873847, + 896762190, + -1, + -51850, + 896829591, + 983989, + -1, + 896884837, + 983990, + -51848, + 896821457, + 983991, + -1, + 896999102, + 983988, + -1, + 896757963, + 110592, + 897267075, + 896228183, + -1, + 897332610, + 897211354, + -1, + 897398145, + 897285200, + -1, + 897463680, + 897349666, + -1, + -51841, + 897411361, + 3200, + -1, + 897466785, + 3204, + -1, + 897392078, + 3201, + -1, + 897339850, + 983203, + -1, + 897267788, + 129432, + -51836, + 897206460, + 69837, + -1, + 897781645, + 128331, + 897987993, + 896152340, + 128273, + 898053528, + 897916401, + -1, + 898119061, + 897984505, + -1, + 898184587, + 898072910, + -1, + -51830, + 898143446, + 983556, + -1, + 898187090, + 983557, + 898381198, + 898136098, + -1, + -51827, + 898320765, + 983560, + -1, + 898380342, + 983561, + 898577809, + 898315046, + -1, + -51824, + 898524938, + 983558, + -1, + 898582751, + 983559, + -51822, + 898537735, + 983554, + -51821, + 898720516, + 983555, + -51820, + 898784706, + 983563, + -1, + 898838016, + 983562, + -51818, + 898073304, + 128287, + -51817, + 898981902, + 983552, + -1, + 899028678, + 983553, + -1, + 897981329, + 128422, + 899298724, + 897925213, + -1, + 899364258, + 899251907, + 128143, + 899429793, + 899302654, + -1, + 899495328, + 899363661, + 128535, + 899612671, + 899417476, + -1, + -51809, + 899513785, + 128537, + -1, + 899555730, + 128538, + -1, + 899423864, + 128573, + -1, + 899351231, + 128139, + -51805, + 899322711, + 129373, + -1, + 899832439, + 128088, + -51803, + 899249892, + 11235, + -1, + 899965096, + 128040, + 900150954, + 880447769, + -1, + 900216359, + 900075281, + -1, + 900281877, + 900165705, + -1, + 900347345, + 900234535, + -1, + 900412847, + 900306605, + -1, + 900478381, + 900368535, + 71875, + -1, + 900418037, + 71886, + -51794, + 900423781, + 71877, + -1, + 900534033, + 71876, + 900740533, + 900348615, + -1, + 900806067, + 900685925, + -1, + -51790, + 900757369, + 71899, + -1, + 900813895, + 71898, + -51788, + 900745704, + 71897, + -1, + 900928752, + 71900, + 901133753, + 900665105, + 71873, + -51785, + 901087566, + 71893, + -51784, + 901143888, + 71882, + -1, + 901207572, + 71894, + 901395901, + 901065567, + 71880, + 901513215, + 901339991, + -1, + -51780, + 901420717, + 71885, + -1, + 901471063, + 71888, + 901658048, + 901351575, + -1, + -51777, + 901613719, + 71879, + -1, + 901651767, + 71887, + 901854659, + 901609506, + -1, + -51774, + 901808344, + 71901, + -1, + 901858128, + 71902, + 902051269, + 901800037, + 71881, + -1, + 901981845, + 71889, + 902182344, + 901995351, + -1, + -51769, + 902138724, + 71891, + -1, + 902182885, + 71872, + -51767, + 902140737, + 71874, + -51766, + 902336623, + 71903, + -51765, + 902399854, + 71890, + -51764, + 902458749, + 71896, + -51763, + 902515821, + 71884, + -51762, + 902579024, + 71878, + -51761, + 902641634, + 71883, + -51760, + 902702571, + 71892, + -1, + 902765761, + 71895, + 902968825, + 900275702, + -1, + 903034327, + 902928045, + -1, + 903099861, + 902989975, + 71843, + -1, + 903039477, + 71854, + -51754, + 903045221, + 71845, + -1, + 903155473, + 71844, + 903362013, + 902970055, + -1, + 903427547, + 903307365, + -1, + -51750, + 903378809, + 71867, + -1, + 903435335, + 71866, + -51748, + 903367144, + 71865, + -1, + 903550192, + 71868, + 903755233, + 903286545, + 71841, + -51745, + 903709006, + 71861, + -51744, + 903765328, + 71850, + -1, + 903829012, + 71862, + 904017381, + 903687007, + 71848, + 904134655, + 903961431, + -1, + -51740, + 904042157, + 71853, + -1, + 904092503, + 71856, + 904279528, + 903973015, + -1, + -51737, + 904235159, + 71847, + -1, + 904273207, + 71855, + 904476139, + 904230946, + -1, + -51734, + 904429784, + 71869, + -1, + 904479568, + 71870, + 904672749, + 904421477, + 71849, + -1, + 904603285, + 71857, + 904803824, + 904616791, + -1, + -51729, + 904760164, + 71859, + -1, + 904804325, + 71840, + -51727, + 904762177, + 71842, + -51726, + 904958063, + 71871, + -51725, + 905021294, + 71858, + -51724, + 905080189, + 71864, + -51723, + 905137261, + 71852, + -51722, + 905200464, + 71846, + -51721, + 905263074, + 71851, + -51720, + 905324011, + 71860, + -1, + 905387201, + 71863, + 905590279, + 902899705, + -1, + 905655805, + 905544014, + -1, + -51716, + 905614550, + 71906, + -1, + 905658194, + 71907, + 905852416, + 905607202, + -1, + -51713, + 905791869, + 71910, + -1, + 905851446, + 71911, + 906049027, + 905786150, + -1, + -51710, + 905996042, + 71908, + -1, + 906053855, + 71909, + -51708, + 906008839, + 71904, + -51707, + 906191620, + 71905, + -51706, + 906255810, + 71913, + -1, + 906309120, + 71912, + 906507796, + 905535476, + -1, + 906573324, + 906461518, + -1, + -51702, + 906531430, + 71915, + -51701, + 906575475, + 71916, + -1, + 906637038, + 71914, + 906835471, + 906524706, + -1, + -51698, + 906774979, + 71919, + -1, + 906834543, + 71920, + 907032082, + 906769190, + -1, + -51695, + 906978766, + 71917, + -1, + 907035128, + 71918, + -51693, + 906976763, + 71922, + -1, + 907161159, + 71921, + -1, + 906453557, + 71935, + 907425308, + 900236007, + -1, + 907490843, + 907345920, + -1, + -51688, + 907448782, + 127754, + -51687, + 907504763, + 129341, + -51686, + 907551134, + 128702, + -1, + 907615432, + 128003, + -1, + 907434120, + 127817, + 907884064, + 907382861, + -1, + -51682, + 907842287, + 127987, + -51681, + 907885529, + 128075, + -1, + 907942616, + 127988, + 908146211, + 907843168, + -1, + -51678, + 908081543, + 127764, + -1, + 908141550, + 127762, + 908342822, + 908090882, + -1, + -51675, + 908278151, + 127766, + -1, + 908338158, + 127768, + -1, + 908296088, + 128465, + 908605028, + 900153437, + -1, + 908670555, + 908535512, + -1, + 908736054, + 908623392, + -1, + 908801584, + 908694151, + -1, + -51668, + 908758916, + 129159, + -51667, + 908810237, + 129143, + -51666, + 908874492, + 129127, + -51665, + 908934420, + 129151, + -1, + 908990697, + 129135, + 909246463, + 908733488, + -1, + -51662, + 909152132, + 129158, + -51661, + 909203453, + 129142, + -51660, + 909267708, + 129126, + -51659, + 909327636, + 129150, + -1, + 909383913, + 129134, + 909588035, + 908680914, + -1, + 909653565, + 909546119, + -1, + -51655, + 909610884, + 129156, + -51654, + 909662205, + 129140, + -51653, + 909726460, + 129124, + -51652, + 909786388, + 129148, + -1, + 909842665, + 129132, + 910098431, + 909585456, + -1, + -51649, + 910004100, + 129157, + -51648, + 910055421, + 129141, + -51647, + 910119676, + 129125, + -51646, + 910179604, + 129149, + -1, + 910235881, + 129133, + 910440009, + 909544589, + -1, + -51643, + 910397316, + 129153, + -51642, + 910448637, + 129137, + -51641, + 910512892, + 129121, + -51640, + 910572820, + 129145, + -1, + 910629097, + 129129, + 910833231, + 910390448, + -1, + -51637, + 910790532, + 129154, + -51636, + 910841853, + 129138, + -51635, + 910906108, + 129122, + -51634, + 910966036, + 129146, + -1, + 911022313, + 129130, + 911226453, + 910774499, + -1, + -51631, + 911183748, + 129152, + -51630, + 911235069, + 129136, + -51629, + 911299324, + 129120, + -51628, + 911359252, + 129144, + -1, + 911415529, + 129128, + 911671295, + 911157861, + -1, + -51625, + 911576964, + 129155, + -51624, + 911628285, + 129139, + -51623, + 911692540, + 129123, + -51622, + 911752468, + 129147, + -1, + 911808745, + 129131, + 912012897, + 908614487, + -1, + 912078431, + 911943009, + -1, + -51618, + 912007156, + 127888, + -1, + 912071534, + 127788, + -51616, + 912018478, + 128521, + -1, + 912206728, + 127863, + -51614, + 911962536, + 128430, + -51613, + 912348606, + 129344, + -1, + 912406803, + 11838, + 912602766, + 908540615, + -1, + 912668301, + 912541864, + -1, + 912733809, + 912619554, + -1, + 912799340, + 912689952, + 127779, + 912916479, + 912719872, + -1, + 912930411, + 912791903, + 127781, + -1, + 912852847, + 127782, + -1, + 912888875, + 127780, + 913178623, + 912748193, + -1, + 913192560, + 913056547, + -1, + -51601, + 913149898, + 128916, + -1, + 913201195, + 128917, + -1, + 913120544, + 128307, + 913454712, + 912663903, + -1, + 913520245, + 913401998, + -1, + -51596, + 913461243, + 128407, + -1, + 913512552, + 128071, + 913768447, + 913457439, + -1, + -51593, + 913674167, + 128922, + -1, + 913725455, + 128923, + 913913468, + 913394935, + -1, + -51590, + 913860779, + 128928, + -51589, + 913911202, + 128072, + -1, + 913971004, + 128326, + 914175615, + 913849031, + -1, + -51586, + 914107509, + 9989, + -1, + 914167088, + 128427, + 914372226, + 914109222, + -1, + -51583, + 914319190, + 11214, + -1, + 914380154, + 128174, + 914568837, + 914298338, + -1, + -51580, + 914524272, + 129197, + -1, + 914580228, + 129196, + -51578, + 914525112, + 128070, + -51577, + 914720241, + 128382, + -51576, + 914781114, + 128073, + -51575, + 914845480, + 10068, + -51574, + 914909857, + 127985, + -51573, + 914971266, + 11229, + -51572, + 915026637, + 10069, + -1, + 915087413, + 128906, + -1, + 912593457, + 128011, + 915355292, + 912547941, + -1, + 915420824, + 915297812, + -1, + 915486359, + 915346222, + 128105, + 915551894, + 915437604, + -1, + -51565, + 915503353, + 128097, + -51564, + 915553386, + 128082, + -51563, + 915612069, + 128090, + -1, + 915676136, + 128098, + -1, + 915473831, + 128111, + -1, + 915419027, + 128698, + 916010651, + 915369804, + -1, + -51558, + 915960630, + 128543, + -1, + 916016871, + 128506, + -1, + 915952256, + 128058, + 916272804, + 915286879, + -1, + 916338336, + 916209757, + -1, + -51553, + 916273522, + 127947, + -1, + 916336905, + 983234, + 916534947, + 916264528, + -1, + -51550, + 916468557, + 128553, + -1, + 916528736, + 128576, + -1, + 916465313, + 128146, + 916797097, + 916221772, + -1, + 916862632, + 916728671, + -1, + -51545, + 916815826, + 129340, + -1, + 916872221, + 128295, + -1, + 916788441, + 127873, + -1, + 916736501, + 983229, + 917190560, + 900099916, + -1, + 917255946, + 917127261, + 983153, + 917321462, + 917190991, + -1, + 917386979, + 917279108, + -1, + 917452486, + 917340494, + -1, + 917518020, + 917402390, + -1, + 917583555, + 917440580, + -1, + 917649089, + 917509596, + 11106, + 917766143, + 917569536, + -1, + 917780159, + 917672855, + -1, + 917845687, + 917722247, + -1, + -51530, + 917802117, + 11173, + -1, + 917842523, + 11175, + 918042298, + 917776586, + -1, + -51527, + 917999464, + 983238, + -1, + 918044419, + 11132, + -51525, + 917999514, + 129074, + -51524, + 918182903, + 129058, + -51523, + 918247454, + 129062, + -51522, + 918306085, + 129070, + -1, + 918363071, + 129066, + -51520, + 917734728, + 11122, + -1, + 918513641, + 11138, + -51518, + 917596477, + 11142, + -1, + 918627970, + 11116, + -1, + 917504174, + 129170, + -51515, + 917476660, + 11246, + -1, + 918840490, + 129187, + 919025358, + 917378549, + -1, + 919090890, + 918977811, + -1, + -51511, + 919045765, + 129026, + -1, + 919089247, + 129042, + -51509, + 919035655, + 129178, + -51508, + 919230521, + 129030, + -51507, + 919293512, + 129034, + -1, + 919351391, + 129046, + 919549652, + 918951970, + -1, + 919615186, + 919489885, + -1, + -51503, + 919543972, + 11146, + -1, + 919606748, + 11157, + -51501, + 919561807, + 129185, + -1, + 919736333, + 129193, + 919942871, + 919500834, + -1, + -51498, + 919891624, + 129082, + -1, + 919934016, + 129106, + 920139482, + 919891788, + -1, + -51495, + 920084721, + 128622, + -1, + 920142507, + 129189, + 920336093, + 920075533, + -1, + -51492, + 920265320, + 129090, + -1, + 920327644, + 129094, + 920532704, + 920269606, + -1, + -51489, + 920483562, + 129195, + -1, + 920536547, + 129078, + -51487, + 920490697, + 129174, + -51486, + 920670380, + 129191, + -1, + 920724072, + 129086, + 920925935, + 917307392, + -1, + 920991466, + 920878669, + -1, + 921057001, + 920916485, + 128360, + 921174015, + 920978820, + -1, + -51480, + 921076723, + 128362, + -1, + 921133903, + 128361, + -1, + 920988805, + 128489, + 921384685, + 920926933, + -1, + -51476, + 921328718, + 128381, + -1, + 921391730, + 11241, + -51474, + 921338757, + 128493, + -1, + 921506790, + 128495, + 921763839, + 920848413, + -1, + 921777907, + 921645917, + -1, + -51470, + 921711866, + 129308, + -1, + 921769380, + 1421, + -51468, + 921732440, + 8295, + -51467, + 921922639, + 128270, + -1, + 921975812, + 9957, + 922171140, + 917248280, + 127872, + 922288127, + 922091644, + -1, + 922302203, + 922192781, + -1, + -51462, + 922252107, + 11187, + -1, + 922308539, + 11186, + 922498814, + 922252113, + -1, + -51459, + 922454922, + 11189, + -1, + 922495446, + 11191, + 922695425, + 922439616, + -1, + -51456, + 922651530, + 11188, + -1, + 922692054, + 11190, + 922943487, + 922626523, + -1, + -51453, + 922841931, + 11185, + -1, + 922898363, + 11184, + 923088646, + 922115408, + 128141, + -1, + 923026691, + 128365, + 923219721, + 923016897, + -1, + -51448, + 923149243, + 127832, + -1, + 923211943, + 127833, + -1, + 923153734, + 129350, + 923481926, + 917187423, + -1, + 923547430, + 923417014, + -1, + -51443, + 923506808, + 127487, + -51442, + 923571885, + 127486, + -51441, + 923637234, + 127485, + -51440, + 923701529, + 127484, + -51439, + 923766325, + 127483, + -51438, + 923830423, + 127482, + -51437, + 923894094, + 127481, + -51436, + 923957282, + 127480, + -51435, + 924020556, + 127479, + -51434, + 924085805, + 127478, + -51433, + 924149969, + 127477, + -51432, + 924213349, + 127476, + -51431, + 924277591, + 127475, + -51430, + 924341780, + 127474, + -51429, + 924404983, + 127473, + -51428, + 924469955, + 127472, + -51427, + 924535285, + 127471, + -51426, + 924598365, + 127470, + -51425, + 924662471, + 127469, + -51424, + 924727209, + 127468, + -51423, + 924791590, + 127467, + -51422, + 924855135, + 127466, + -51421, + 924919135, + 127465, + -51420, + 924982583, + 127464, + -51419, + 925046818, + 127463, + -1, + 925110033, + 127462, + 925316921, + 923504181, + -1, + 925382456, + 925249796, + -1, + 925447986, + 925312353, + -1, + 925513516, + 925402171, + -1, + -51413, + 925469669, + 128402, + -1, + 925510192, + 128403, + 925710127, + 925462348, + -1, + -51410, + 925647459, + 11262, + -1, + 925700509, + 128401, + -51408, + 925667332, + 128404, + -51407, + 925842403, + 128405, + -1, + 925901358, + 11841, + 926154751, + 925368320, + -1, + 926168886, + 926044844, + -1, + -51403, + 926112934, + 983151, + -1, + 926169427, + 128968, + -51401, + 926106707, + 983152, + -1, + 926293918, + 128639, + -1, + 925327911, + 128158, + 926562109, + 925244727, + -1, + -51397, + 926511420, + 128665, + -51396, + 926573937, + 983112, + -1, + 926625362, + 129534, + 926824256, + 926517172, + -1, + -51393, + 926774091, + 11153, + -1, + 926830523, + 11152, + 927020867, + 926754145, + -1, + -51390, + 926955938, + 129511, + -1, + 927012071, + 127822, + -51388, + 926974075, + 128699, + -51387, + 927160778, + 127895, + -1, + 927224555, + 128524, + 927414115, + 923426917, + -1, + 927479635, + 927370040, + -1, + 927545168, + 927411446, + -1, + 927610700, + 927496840, + -1, + -51381, + 927566166, + 127588, + -1, + 927622790, + 127586, + -51379, + 927569485, + 127587, + -51378, + 927749614, + 127585, + -51377, + 927807384, + 127584, + -1, + 927866232, + 127589, + 928120831, + 927465472, + -1, + -51374, + 928023139, + 128907, + -1, + 928083458, + 128205, + 928266073, + 927421395, + -1, + 928331607, + 928197471, + -1, + -51370, + 928280398, + 127906, + -1, + 928327132, + 128478, + -51368, + 928269676, + 129315, + -1, + 928449339, + 129531, + 928659292, + 928219754, + -1, + -51365, + 928617210, + 11215, + -1, + 928666420, + 11213, + 928855902, + 928610683, + 127801, + -1, + 928810862, + 127989, + -51361, + 928813592, + 128675, + -51360, + 928933353, + 128019, + -51359, + 928981322, + 128640, + -51358, + 929045486, + 129302, + -1, + 929109683, + 127840, + 929314688, + 927338257, + -1, + 929380213, + 929251421, + -1, + 929445745, + 929331628, + -1, + 929511274, + 929381299, + 9995, + 929628159, + 929432964, + -1, + -51351, + 929524230, + 128406, + -1, + 929576143, + 128400, + 929773421, + 929453588, + -1, + -51348, + 929703341, + 127339, + -1, + 929766723, + 127338, + -51346, + 929707258, + 9994, + -51345, + 929900679, + 11827, + -51344, + 929964590, + 11828, + -1, + 930027611, + 129306, + 930232180, + 929388043, + -1, + -51341, + 930186777, + 128740, + -1, + 930225734, + 128643, + -1, + 930176014, + 127752, + 930494330, + 929307959, + -1, + 930559865, + 930432254, + -1, + -51336, + 930503310, + 127949, + -1, + 930553414, + 127950, + -1, + 930489178, + 129437, + 930822012, + 930424856, + 128251, + -1, + 930742538, + 128280, + 930953086, + 930748691, + 128007, + -1, + 930873806, + 128048, + -51329, + 930906446, + 128000, + -1, + 931026452, + 128015, + 931215257, + 929269911, + -1, + 931280784, + 931158871, + -1, + 931346317, + 931217733, + -1, + 931411850, + 931280649, + -1, + 931477383, + 931335953, + -1, + -51322, + 931410227, + 5880, + -1, + 931470647, + 5879, + -51320, + 931423699, + 5876, + -51319, + 931612650, + 5877, + -1, + 931671507, + 5878, + -51317, + 931363464, + 5874, + -51316, + 931816531, + 5875, + -1, + 931875523, + 5873, + 932118527, + 931289943, + -1, + -51313, + 932005280, + 127933, + -1, + 932065397, + 127939, + 932263831, + 931233526, + -1, + -51310, + 932220973, + 11251, + -51309, + 932283972, + 11256, + -51308, + 932346319, + 11255, + -51307, + 932409155, + 11253, + -51306, + 932470573, + 11252, + -1, + 932518509, + 11254, + -51304, + 932198518, + 127945, + -1, + 932649757, + 8381, + 932853662, + 931155191, + -1, + -51301, + 932798565, + 983226, + -51300, + 932861460, + 983221, + -51299, + 932921437, + 983231, + -1, + 932981599, + 983223, + -51297, + 932804642, + 983113, + -1, + 933117509, + 129423, + 933312608, + 917121887, + -1, + 933378013, + 933252343, + -1, + 933443542, + 933304564, + -1, + 933509032, + 933387095, + -1, + -51291, + 933448258, + 66837, + -51290, + 933505887, + 66835, + -51289, + 933570224, + 66821, + -1, + 933629713, + 66836, + 933836718, + 933443497, + -1, + 933902252, + 933771975, + -1, + -51285, + 933833567, + 66853, + -1, + 933892865, + 66854, + -51283, + 933841474, + 66827, + -1, + 934030175, + 66826, + 934229937, + 933795960, + -1, + -51280, + 934165643, + 66852, + -1, + 934226783, + 66851, + 934426548, + 934183246, + -1, + -51277, + 934362251, + 66846, + -1, + 934423391, + 66845, + 934623159, + 934377506, + -1, + -51274, + 934558859, + 66844, + -1, + 934619999, + 66843, + 934819770, + 934571852, + -1, + -51271, + 934768904, + 66842, + -1, + 934816607, + 66841, + 935016381, + 934759671, + -1, + -51268, + 934956836, + 66833, + -1, + 935013215, + 66832, + 935212992, + 934955715, + -1, + -51265, + 935148683, + 66855, + -1, + 935209823, + 66831, + 935409602, + 935144287, + 66824, + -1, + 935346269, + 66823, + 935540677, + 935339359, + -1, + -51260, + 935476363, + 66822, + -1, + 935537503, + 66820, + 935737288, + 935468343, + -1, + -51257, + 935672971, + 66819, + -1, + 935734111, + 66818, + -51255, + 935696045, + 66850, + -51254, + 935892538, + 66849, + -51253, + 935956077, + 66848, + -51252, + 936020119, + 66847, + -51251, + 936078930, + 66840, + -51250, + 936143436, + 66839, + -51249, + 936206437, + 66838, + -51248, + 936269776, + 66834, + -51247, + 936331842, + 66830, + -51246, + 936394845, + 66829, + -51245, + 936459403, + 66828, + -51244, + 936522677, + 66825, + -51243, + 936581422, + 66817, + -1, + 936644369, + 66816, + 936851420, + 933374815, + -1, + 936916955, + 936780974, + -1, + -51239, + 936871357, + 128294, + -51238, + 936930289, + 128268, + -1, + 936989453, + 128161, + -1, + 936864526, + 128024, + -1, + 936784678, + 129501, + 937310219, + 933331278, + -1, + 937375753, + 937246287, + -1, + 937441286, + 937328881, + -1, + 937506799, + 937370975, + -1, + 937572328, + 937465976, + -1, + 937637860, + 937503583, + 43797, + -1, + 937569119, + 43796, + -51227, + 937592983, + 43793, + -51226, + 937713765, + 43798, + -51225, + 937771101, + 43794, + -1, + 937824103, + 43795, + 938082303, + 937502613, + -1, + 938096619, + 937962335, + 43789, + -1, + 938027871, + 43788, + -51220, + 938051735, + 43785, + -51219, + 938172517, + 43790, + -51218, + 938229853, + 43786, + -1, + 938282855, + 43787, + 938489847, + 937434803, + -1, + 938555378, + 938421087, + 43813, + -1, + 938486623, + 43812, + 938686452, + 938479377, + 43808, + -1, + 938610449, + 43811, + -51211, + 938641559, + 43809, + -51210, + 938762341, + 43814, + -1, + 938819677, + 43810, + 939014143, + 938416400, + -1, + 939079674, + 938945375, + 43821, + -1, + 939010911, + 43820, + 939210748, + 939003665, + 43816, + -1, + 939134737, + 43819, + -51203, + 939165847, + 43817, + -51202, + 939286629, + 43822, + -1, + 939343965, + 43818, + 939589631, + 938968973, + -1, + 939603970, + 939469663, + 43781, + -1, + 939535199, + 43780, + -51197, + 939559063, + 43777, + -51196, + 939679845, + 43782, + -51195, + 939737181, + 43778, + -1, + 939790183, + 43779, + 940048383, + 937370121, + -1, + -51192, + 939954389, + 4958, + -1, + 939997352, + 4957, + -51190, + 937334258, + 983047, + -1, + 940120098, + 983096, + 940324896, + 937252372, + -1, + 940390424, + 940270002, + -1, + 940455955, + 940333607, + -1, + -51185, + 940379337, + 127999, + -51184, + 940444703, + 127998, + -51183, + 940510083, + 127997, + -51182, + 940575434, + 127996, + -1, + 940640738, + 127995, + 940900351, + 940384850, + -1, + -51179, + 940806930, + 129459, + -51178, + 940863893, + 129456, + -51177, + 940909830, + 129457, + -1, + 940972194, + 129458, + 941228031, + 940338552, + -1, + 941242397, + 941121300, + 128453, + 941359103, + 941163471, + -1, + -51172, + 941242509, + 128454, + -1, + 941303135, + 128455, + 941504543, + 941189428, + 128460, + -1, + 941455394, + 128461, + -1, + 941434960, + 128459, + 941701170, + 940268375, + -1, + 941766701, + 941630817, + -1, + 941832236, + 941711661, + -1, + 941897767, + 941785422, + -1, + 941963302, + 941846612, + 983048, + -1, + 941883643, + 983095, + -1, + 941896457, + 983046, + -51160, + 941849014, + 983134, + -51159, + 942107998, + 983178, + -51158, + 942168046, + 983099, + -51157, + 942232448, + 983064, + -1, + 942291569, + 983177, + -1, + 941790183, + 128282, + 942553136, + 941723328, + -1, + -51153, + 942494569, + 128388, + -1, + 942549688, + 128233, + 942800895, + 942501421, + 983051, + -1, + 942705298, + 983050, + 942880831, + 941659634, + -1, + 942946366, + 942835218, + -1, + 943011901, + 942878418, + -1, + 943077432, + 942969525, + -1, + -51145, + 943029922, + 128915, + -1, + 943071278, + 128905, + 943274043, + 943028258, + -1, + -51142, + 943212939, + 128954, + -1, + 943264451, + 128942, + -51140, + 943209047, + 128935, + -1, + 943404318, + 128948, + -1, + 942937870, + 128125, + -1, + 942894395, + 128529, + 943732810, + 942804753, + -1, + 943798345, + 943681356, + 128066, + 943863878, + 943751968, + -1, + 943929413, + 943787793, + -1, + -51132, + 943881221, + 127759, + -1, + 943937742, + 127758, + -1, + 943862293, + 127757, + 944242687, + 943784724, + -1, + -51128, + 944141093, + 127806, + -1, + 944199372, + 127805, + -1, + 943733225, + 129413, + 944453709, + 943691593, + 128065, + -51124, + 944404514, + 128064, + -1, + 944454113, + 128083, + 944650321, + 944404514, + -1, + 944715856, + 944577847, + 983104, + -1, + 944641197, + 983103, + -1, + 944639761, + 983135, + 944912469, + 944595045, + -1, + -51117, + 944865614, + 983049, + -51116, + 944920084, + 983100, + -1, + 944983287, + 983067, + 945174616, + 944868704, + -1, + -51113, + 945122500, + 127972, + -1, + 945167961, + 127984, + 945371227, + 945124846, + -1, + -51110, + 945326137, + 11249, + -1, + 945382148, + 11248, + -51108, + 945327862, + 127794, + -51107, + 945516162, + 11257, + -51106, + 945580299, + 983179, + -51105, + 945633513, + 129370, + -1, + 945686615, + 128231, + 945895657, + 933249117, + -1, + 945961179, + 945838935, + -1, + 946026692, + 945890655, + 983129, + 946092227, + 945963101, + -1, + 946157762, + 946019658, + -1, + 946223289, + 946102260, + -1, + 946288759, + 946176334, + -1, + 946354286, + 946245913, + -1, + 946419820, + 946298981, + 126066, + 946536447, + 946339840, + -1, + -51093, + 946439060, + 126093, + -1, + 946487312, + 126084, + 946733055, + 946352099, + 126075, + -1, + 946603209, + 126102, + 946813045, + 946289351, + -1, + 946878579, + 946762178, + 126067, + 946995199, + 946798592, + -1, + -51086, + 946897812, + 126094, + -1, + 946946064, + 126085, + 947191807, + 946816993, + 126076, + -1, + 947061961, + 126103, + 947322879, + 946745070, + 126074, + -1, + 947193033, + 126101, + 947402884, + 946239522, + -1, + 947468414, + 947341693, + 126070, + 947533947, + 947423355, + 126079, + -1, + 947455177, + 126106, + 947716095, + 947453952, + -1, + -51075, + 947618708, + 126097, + -1, + 947666960, + 126088, + 947912703, + 947401270, + 126071, + 947927169, + 947816571, + 126080, + -1, + 947848393, + 126107, + 948109311, + 947847168, + -1, + -51069, + 948011924, + 126098, + -1, + 948060176, + 126089, + 948254867, + 947335974, + -1, + 948320396, + 948199525, + -1, + 948385930, + 948276448, + 126068, + 948502527, + 948305920, + -1, + -51063, + 948405140, + 126095, + -1, + 948453392, + 126086, + 948699135, + 948336611, + 126077, + -1, + 948569289, + 126104, + 948830207, + 948256861, + -1, + 948844689, + 948735597, + 126069, + 948961279, + 948764672, + -1, + -51056, + 948863892, + 126096, + -1, + 948912144, + 126087, + 949157887, + 948778900, + 126078, + -1, + 949028041, + 126105, + 949237920, + 948202801, + -1, + 949303447, + 949190990, + -1, + -51050, + 949261526, + 126116, + -1, + 949305170, + 126117, + 949500058, + 949254178, + -1, + -51047, + 949438845, + 126120, + -1, + 949498422, + 126121, + 949696669, + 949433126, + -1, + -51044, + 949643018, + 126118, + -1, + 949700831, + 126119, + -51042, + 949641988, + 126115, + -51041, + 949837250, + 126123, + -1, + 949890560, + 126122, + 950089894, + 949181890, + 126073, + 950155427, + 950044795, + 126082, + -1, + 950076617, + 126109, + 950337535, + 950075392, + -1, + -51035, + 950240148, + 126100, + -1, + 950288400, + 126091, + 950483116, + 950021632, + 126072, + 950548649, + 950441645, + 126081, + -1, + 950469833, + 126108, + 950730751, + 950468608, + -1, + -51029, + 950633364, + 126099, + -1, + 950681616, + 126090, + 950876336, + 950428420, + 126065, + 950992895, + 950796288, + -1, + -51025, + 950895508, + 126092, + -1, + 950943760, + 126083, + 951138485, + 950801035, + -1, + 951204020, + 951091534, + -1, + -51021, + 951162070, + 126130, + -1, + 951201553, + 126131, + -1, + 951149316, + 126129, + 951466167, + 951078333, + 126110, + -1, + 951391022, + 126111, + 951648255, + 951405401, + 126113, + -1, + 951522094, + 126114, + 951728318, + 946157286, + -1, + 951793853, + 951673608, + -1, + -51012, + 951742133, + 126125, + -1, + 951794525, + 126126, + -1, + 951747556, + 126127, + -51009, + 951678988, + 126128, + -51008, + 952003436, + 126124, + -51007, + 952061378, + 126112, + -1, + 952111766, + 126132, + -1, + 946082613, + 8377, + -1, + 946025145, + 983128, + 952449227, + 945974806, + -1, + 952514761, + 952389272, + -1, + -51001, + 952466783, + 128289, + -51000, + 952521273, + 128292, + -1, + 952573494, + 128288, + -50998, + 952467782, + 128291, + -1, + 952721443, + 128290, + 952907987, + 952382963, + -1, + 952973522, + 952859165, + -1, + 953039056, + 952926542, + -1, + -50993, + 952997078, + 983111, + -1, + 953040722, + 983108, + -50991, + 952984324, + 983114, + -1, + 953169485, + 983105, + -1, + 952903540, + 128129, + 953432279, + 952864516, + -1, + 953497814, + 953374007, + 11845, + -1, + 953419523, + 11846, + -1, + 953445049, + 9959, + 953694426, + 953359671, + -1, + -50983, + 953643301, + 128474, + -1, + 953705096, + 128232, + -1, + 953621552, + 128229, + 953956579, + 945891106, + -1, + 954022111, + 953909582, + -1, + -50978, + 953980118, + 119667, + -1, + 954023762, + 119668, + 954218722, + 953955110, + -1, + -50975, + 954165002, + 119669, + -1, + 954222815, + 119670, + -1, + 954163972, + 119666, + 954480870, + 953884353, + -1, + -50971, + 954416790, + 127954, + -1, + 954475466, + 127848, + -50969, + 954439836, + 127982, + -50968, + 954620598, + 128127, + -1, + 954663570, + 129311, + 954874223, + 945828646, + -1, + 954939675, + 954797841, + -1, + 955005204, + 954866999, + -1, + 955070739, + 954936161, + -1, + 955136269, + 955028370, + -1, + 955201804, + 955056128, + -1, + 955267318, + 955146341, + -1, + 955332852, + 955214481, + 128558, + 955449343, + 955252736, + -1, + -50957, + 955355316, + 129326, + -1, + 955388801, + 128560, + -50955, + 955276436, + 129320, + -1, + 955534036, + 128582, + 955726074, + 955220113, + 128539, + 955842559, + 955645983, + -1, + -50951, + 955749248, + 128540, + -1, + 955810956, + 128541, + 955988221, + 955679054, + -1, + -50948, + 955923834, + 129298, + -1, + 955984904, + 128514, + 956184832, + 955934929, + -1, + -50945, + 956125038, + 129402, + -1, + 956175923, + 129395, + 956381443, + 956126740, + -1, + -50942, + 956326904, + 129488, + -1, + 956378390, + 128567, + 956578054, + 956309963, + -1, + -50939, + 956535326, + 129312, + -1, + 956583692, + 128531, + -50937, + 956533577, + 129396, + -50936, + 956724947, + 128580, + -50935, + 956784256, + 128581, + -50934, + 956847275, + 128548, + -50933, + 956906680, + 129301, + -1, + 956970145, + 129323, + -1, + 955148227, + 128566, + 957233424, + 955086882, + -1, + -50929, + 957162448, + 128561, + -1, + 957224921, + 128523, + -50927, + 957187077, + 128536, + -50926, + 957376865, + 129318, + -1, + 957437816, + 128134, + -1, + 955024854, + 127981, + 957692183, + 954963444, + -1, + -50922, + 957634157, + 128224, + -1, + 957694349, + 128439, + -50920, + 957645645, + 127877, + -50919, + 957831621, + 128106, + -50918, + 957895665, + 127810, + -1, + 957958118, + 129498, + 958150969, + 954875997, + -1, + 958216491, + 958099276, + -1, + 958282021, + 958147423, + 128293, + 958347553, + 958240159, + -1, + -50912, + 958298146, + 127878, + -1, + 958334081, + 127879, + 958544164, + 958267844, + -1, + -50909, + 958502529, + 129519, + -1, + 958553492, + 128658, + -1, + 958473147, + 129512, + 958857215, + 958234421, + -1, + 958871849, + 958754514, + -1, + -50904, + 958829485, + 127771, + -1, + 958890271, + 127763, + -50902, + 958824556, + 8296, + -1, + 959015776, + 129351, + 959199539, + 958156023, + -1, + 959265072, + 959130465, + -1, + -50898, + 959216147, + 983106, + -50897, + 959264207, + 128193, + -1, + 959323491, + 128452, + 959578111, + 959206934, + -1, + -50894, + 959475028, + 128253, + -1, + 959526658, + 127902, + 959723832, + 959150114, + -1, + 959789367, + 959658695, + 128031, + -50890, + 959726990, + 127907, + -1, + 959774994, + 127845, + -1, + 959742634, + 128074, + -1, + 959655527, + 127953, + 960117065, + 958095461, + -1, + 960182591, + 960065356, + -1, + 960248125, + 960121544, + 127860, + -1, + 960169827, + 127869, + -50882, + 960202657, + 129376, + -1, + 960321049, + 983071, + 960510275, + 960138467, + -1, + -50879, + 960457758, + 128966, + -50878, + 960515988, + 127808, + -1, + 960570253, + 11156, + 960772421, + 960456175, + 129462, + -1, + 960720205, + 128099, + 960903495, + 960706473, + 127787, + -1, + 960838335, + 127745, + -50872, + 960861687, + 129418, + -1, + 960974623, + 128448, + 961165654, + 960065356, + -1, + 961231182, + 961110117, + -1, + -50868, + 961189017, + 128550, + -50867, + 961240989, + 128037, + -1, + 961296299, + 128056, + 961493330, + 961155821, + -1, + -50864, + 961447078, + 128445, + -50863, + 961506097, + 128444, + -1, + 961549123, + 128446, + 961755477, + 961424223, + -1, + -50860, + 961698849, + 127839, + -1, + 961753883, + 129398, + -1, + 961692095, + 127844, + 962017633, + 961105143, + -1, + 962083163, + 961976260, + -1, + -50855, + 962033996, + 128760, + -50854, + 962080763, + 128389, + -1, + 962144299, + 129359, + 962345310, + 962027621, + -1, + -50851, + 962302581, + 127924, + -1, + 962358540, + 128190, + -50849, + 962301356, + 128563, + -50848, + 962474742, + 128170, + -1, + 962533085, + 129407, + 962738533, + 961974538, + -1, + -50845, + 962661066, + 983215, + -50844, + 962726386, + 983214, + -1, + 962791766, + 983213, + 963000681, + 962669407, + -1, + -50841, + 962951046, + 127905, + -50840, + 963009560, + 129338, + -1, + 963056982, + 128552, + 963262828, + 962955990, + -1, + -50837, + 963220397, + 127773, + -1, + 963281183, + 127765, + 963459438, + 963213346, + 983107, + -1, + 963395677, + 983232, + -1, + 963392294, + 983072, + 963656160, + 954833016, + -1, + 963721685, + 963580748, + -1, + 963787177, + 963662249, + -1, + 963852667, + 963739982, + -1, + 963918198, + 963805518, + -1, + -50827, + 963853013, + 72213, + -1, + 963907345, + 72212, + 964114809, + 963868706, + -1, + -50824, + 964049621, + 72228, + -1, + 964103953, + 72227, + -50822, + 964049621, + 72218, + -1, + 964235025, + 72217, + 964442500, + 963781983, + -1, + 964508031, + 964401272, + -1, + -50818, + 964442837, + 72230, + -1, + 964497169, + 72229, + 964704642, + 964437343, + -1, + -50815, + 964639445, + 72215, + -1, + 964693777, + 72214, + -50813, + 964639445, + 72220, + -1, + 964824849, + 72219, + 965032329, + 964385623, + -1, + -50810, + 964990728, + 72211, + -50809, + 965041072, + 72216, + -50808, + 965097442, + 72207, + -1, + 965152529, + 72221, + 965360013, + 964982818, + -1, + -50805, + 965310622, + 72239, + -50804, + 965360341, + 72238, + -1, + 965414673, + 72240, + 965622161, + 965298883, + -1, + -50801, + 965574342, + 72242, + -50800, + 965622485, + 72204, + -1, + 965676817, + 72203, + 965884308, + 965580920, + -1, + -50797, + 965819093, + 72231, + -1, + 965873425, + 72232, + 966080919, + 965830865, + -1, + -50794, + 966015701, + 72223, + -1, + 966070033, + 72222, + 966277530, + 966014889, + -1, + -50791, + 966212309, + 72206, + -1, + 966266641, + 72205, + 966474141, + 966204727, + -1, + -50788, + 966408917, + 72209, + -1, + 966463249, + 72208, + 966670752, + 966400034, + -1, + -50785, + 966605525, + 72225, + -1, + 966659857, + 72224, + -50783, + 966629128, + 72234, + -50782, + 966823495, + 72237, + -50781, + 966881177, + 72235, + -50780, + 966940254, + 72226, + -50779, + 967003465, + 72236, + -50778, + 967068186, + 72210, + -50777, + 967129813, + 72241, + -50776, + 967184145, + 72192, + -1, + 967247906, + 72233, + 967457206, + 963743942, + -1, + 967522741, + 967408720, + -1, + 967588269, + 967477399, + 72195, + -1, + 967519071, + 72194, + 967719343, + 967532645, + 72198, + -1, + 967650143, + 72197, + 967850418, + 967642897, + -1, + -50767, + 967805079, + 72200, + -1, + 967852125, + 72199, + -50765, + 967799490, + 72201, + -50764, + 967983197, + 72193, + -1, + 968043359, + 72196, + -1, + 967463305, + 72202, + 968309185, + 967407650, + -1, + 968374720, + 968246006, + -1, + 968440252, + 968302010, + -1, + 968505787, + 968366675, + 72245, + -1, + 968427318, + 72246, + -1, + 968427318, + 72247, + 968702399, + 968396801, + -1, + -50754, + 968653122, + 72249, + -1, + 968716351, + 72244, + -1, + 968627337, + 72248, + -1, + 968329604, + 72263, + 969030092, + 968237417, + -1, + 969095625, + 968986069, + -1, + 969161160, + 969028736, + -1, + -50747, + 969119496, + 72251, + -50746, + 969182791, + 72254, + -50745, + 969240473, + 72252, + -1, + 969297225, + 72253, + -1, + 969098763, + 72250, + 969605119, + 969041378, + -1, + -50741, + 969489554, + 72256, + -1, + 969550271, + 72262, + 969750993, + 968972104, + -1, + -50738, + 969705313, + 72257, + -50737, + 969767669, + 72258, + -50736, + 969823377, + 72260, + -1, + 969877923, + 72259, + 970078676, + 969688578, + -1, + -50733, + 970013842, + 72255, + -1, + 970074559, + 72261, + -1, + 970011733, + 72243, + 970340827, + 963678489, + -1, + 970406361, + 970283863, + -1, + -50728, + 970344949, + 983218, + -1, + 970398903, + 983259, + -50726, + 970358332, + 983217, + -1, + 970541557, + 983219, + 970734046, + 970271583, + -1, + -50723, + 970689921, + 11234, + -1, + 970726464, + 129427, + -50721, + 970678879, + 129503, + -1, + 970868506, + 129296, + 971061796, + 963610775, + -1, + 971127323, + 971008209, + -1, + 971192845, + 971084164, + -1, + 971258360, + 971145550, + -1, + 971323895, + 971207446, + -1, + 971389430, + 971245636, + -1, + 971454964, + 971314652, + 11105, + 971571199, + 971374592, + -1, + 971586034, + 971477911, + -1, + 971651564, + 971527303, + -1, + -50709, + 971601061, + 11171, + -1, + 971657433, + 11170, + -50707, + 971607962, + 129073, + -50706, + 971791351, + 129057, + -50705, + 971855902, + 129061, + -50704, + 971914533, + 129069, + -50703, + 971974963, + 11131, + -1, + 972037055, + 129065, + -50701, + 971539784, + 11121, + -1, + 972181805, + 11137, + -50699, + 971401533, + 11141, + -1, + 972301954, + 11115, + -1, + 971309230, + 129169, + -1, + 971281716, + 11245, + 972634624, + 971183605, + -1, + 972700156, + 972586259, + -1, + -50693, + 972654213, + 129025, + -1, + 972697695, + 129041, + -50691, + 972644103, + 129177, + -50690, + 972838969, + 129029, + -50689, + 972901960, + 129033, + -1, + 972959839, + 129045, + 973158915, + 972591804, + -1, + -50686, + 973116523, + 129173, + -1, + 973158176, + 11192, + 973355526, + 973109282, + -1, + -50683, + 973303464, + 129081, + -1, + 973345856, + 129105, + 973552137, + 973290765, + -1, + -50680, + 973480552, + 129089, + -1, + 973542876, + 129093, + -50678, + 973502156, + 128621, + -50677, + 973681853, + 129077, + -50676, + 973742696, + 129085, + -1, + 973806270, + 11145, + 974010900, + 971114654, + -1, + 974076433, + 973962515, + -1, + -50672, + 974025141, + 128316, + -1, + 974066068, + 128744, + -50670, + 974025141, + 128314, + -50669, + 974215594, + 128742, + -1, + 974262676, + 128743, + 974469657, + 973930496, + -1, + 974535192, + 974399963, + -1, + -50665, + 974489291, + 11109, + -1, + 974551316, + 129113, + -1, + 974460428, + 11193, + -50662, + 974421052, + 128579, + -1, + 974744270, + 128319, + 974928419, + 971070295, + -1, + 974993953, + 974864477, + -1, + 975059488, + 974946638, + -1, + -50657, + 974990572, + 11258, + -1, + 975045715, + 983115, + -1, + 974988163, + 129412, + -50654, + 974921502, + 11217, + -1, + 975246114, + 128530, + -1, + 974878754, + 983116, + 975518263, + 971019856, + -1, + 975583790, + 975466885, + -1, + 975649321, + 975510839, + -1, + -50648, + 975584355, + 129636, + -1, + 975639610, + 129637, + -50646, + 975601155, + 129638, + -50645, + 975787816, + 129633, + -50644, + 975847189, + 129635, + -50643, + 975911133, + 129632, + -1, + 975974030, + 129634, + 976224255, + 975510186, + -1, + 976239154, + 976100663, + -1, + -50639, + 976174179, + 129643, + -1, + 976229434, + 129644, + -50637, + 976190979, + 129645, + -50636, + 976377640, + 129640, + -50635, + 976437013, + 129642, + -50634, + 976500957, + 129639, + -1, + 976563854, + 129641, + 976763461, + 975456757, + -1, + 976828993, + 976686865, + -1, + 976894528, + 976775530, + -1, + -50629, + 976847142, + 128304, + -50628, + 976907460, + 127971, + -50627, + 976970128, + 128121, + -50626, + 977025552, + 128122, + -50625, + 977086589, + 127886, + -1, + 977149529, + 127983, + -1, + 976822537, + 127875, + -50622, + 976783986, + 129337, + -50621, + 977365155, + 128377, + -50620, + 977421114, + 129513, + -1, + 977480707, + 128086, + 977731583, + 976721581, + -1, + -50617, + 977617046, + 983239, + -1, + 977677988, + 128155] +_charnames_1318 = [ +9057, +9045, +9055, +9041, +9051, +9034, +9053, +9036, +9056, +9042, +] + +_charnames_1416 = [ +6105, +-1, +-1, +-1, +-1, +14066, +9915, +6107, +] + +_charnames_2112 = [ +4168, +4162, +4160, +4161, +4159, +4166, +4151, +4164, +4148, +4150, +4149, +4157, +4156, +4155, +4144, +4165, +4154, +4145, +4153, +4152, +4146, +4147, +4169, +4167, +4158, +4173, +4170, +4172, +-1, +-1, +4171, +-1, +1832, +1839, +1831, +1836, +1830, +1829, +1840, +1838, +1835, +1834, +1837, +] + +_charnames_2208 = [ +6036, +6038, +6058, +6041, +6060, +6056, +6050, +6046, +6027, +6028, +6032, +6055, +6033, +6049, +6061, +6044, +6059, +6043, +6054, +6024, +6053, +-1, +6037, +6057, +6040, +6031, +6026, +6023, +6021, +6022, +] + +_charnames_2259 = [ +6002, +5988, +5996, +6000, +5997, +5998, +6003, +5986, +5987, +5989, +5991, +5992, +5990, +5999, +5995, +6087, +6076, +6080, +6082, +6078, +6081, +6083, +6079, +6072, +6069, +6075, +6071, +6068, +6074, +6095, +6096, +6094, +5993, +6098, +6099, +6102, +6064, +6090, +6063, +6092, +6085, +6086, +6091, +6088, +5953, +] + +_charnames_2383 = [ +12723, +-1, +-1, +-1, +-1, +-1, +-1, +12717, +12716, +] + +_charnames_2809 = [ +13332, +13328, +13329, +13330, +13326, +13331, +13325, +] + +_charnames_3406 = [ +4487, +4495, +-1, +-1, +-1, +-1, +4483, +4482, +4484, +-1, +4474, +4471, +4479, +4468, +4469, +4477, +4472, +4488, +] + +_charnames_3558 = [ +1167, +1168, +1159, +1160, +1165, +1166, +1162, +1163, +1170, +1169, +] + +_charnames_4295 = [ +13410, +-1, +-1, +-1, +-1, +-1, +13411, +] + +_charnames_5109 = [ +8479, +-1, +-1, +8435, +8434, +8433, +8432, +8431, +8452, +] + +_charnames_5873 = [ +14220, +14218, +14219, +14215, +14216, +14217, +14214, +14213, +] + +_charnames_6832 = [ +8722, +8725, +8756, +8723, +8739, +8753, +8745, +8734, +8720, +8696, +8755, +8743, +8719, +8742, +8741, +] + +_charnames_7098 = [ +1709, +1702, +1703, +1704, +1701, +1700, +7367, +7336, +7362, +7334, +7350, +7366, +7359, +7352, +7331, +7344, +7349, +7355, +7328, +7353, +7363, +7335, +7360, +7364, +7357, +7330, +7346, +7332, +7337, +7341, +7338, +7329, +7348, +7354, +7327, +7342, +7358, +7333, +7340, +7365, +7343, +7351, +7361, +7356, +7386, +7374, +7376, +7375, +7378, +7373, +7377, +7372, +7369, +7370, +7391, +7392, +7389, +7388, +] + +_charnames_7296 = [ +9038, +9047, +9046, +9043, +9030, +9032, +9031, +9029, +9044, +] + +_charnames_7312 = [ +13360, +13400, +13383, +13399, +13385, +13390, +13365, +13357, +13397, +13377, +13373, +13396, +13395, +13394, +13371, +13364, +13392, +13368, +13356, +13391, +13370, +13376, +13382, +13393, +13367, +13350, +13353, +13379, +13352, +13351, +13388, +13380, +13344, +13347, +13346, +13389, +13342, +13345, +13398, +13387, +13386, +13358, +13361, +-1, +-1, +13362, +13343, +13374, +1692, +1691, +1690, +1696, +1693, +1694, +1695, +1697, +] + +_charnames_7411 = [ +13082, +13088, +13083, +13081, +13084, +13086, +13087, +] + +_charnames_7655 = [ +8684, +8681, +8682, +8687, +8690, +8689, +8679, +8688, +8691, +8676, +8686, +8685, +8680, +8677, +8754, +8751, +8752, +8724, +8746, +-1, +8726, +8721, +] + +_charnames_8341 = [ +9724, +9723, +9722, +9721, +9720, +9719, +9718, +9717, +] + +_charnames_8377 = [ +14530, +3430, +10673, +4186, +14232, +9829, +7984, +] + +_charnames_9193 = [ +7839, +7859, +7867, +7850, +7840, +7860, +7841, +6278, +1758, +3349, +11287, +7807, +7805, +7800, +7809, +12684, +7828, +7825, +11860, +11863, +11864, +11861, +12371, +] + +_charnames_9984 = [ +7835, +-1, +-1, +-1, +-1, +13949, +-1, +-1, +-1, +-1, +14189, +14182, +] + +_charnames_10060 = [ +9067, +-1, +10585, +-1, +-1, +-1, +-1, +7885, +13960, +13963, +] + +_charnames_11098 = [ +1883, +7465, +1882, +7464, +7946, +1571, +9844, +14822, +14001, +12632, +9905, +14870, +10661, +10669, +1415, +1407, +9861, +14837, +14018, +12648, +8998, +5754, +9858, +14834, +14015, +12644, +-1, +-1, +10662, +10670, +1416, +1408, +9852, +14832, +14009, +12642, +11275, +13076, +9859, +14835, +14016, +12645, +9860, +14836, +14017, +12647, +9875, +14860, +14032, +12669, +5753, +5756, +5755, +5752, +14143, +14142, +10529, +10528, +14658, +14033, +-1, +-1, +3367, +3368, +3366, +3369, +7862, +7868, +7843, +7851, +12637, +12636, +14827, +14826, +9848, +14005, +9849, +14006, +7824, +7823, +7815, +7814, +7820, +7817, +7821, +7818, +14083, +14082, +14074, +14073, +14079, +14076, +14080, +14077, +14850, +14872, +12356, +12357, +12358, +7455, +9097, +9100, +7829, +7855, +3428, +11277, +7886, +7801, +7810, +7808, +7806, +-1, +3462, +7927, +9526, +14171, +13952, +14170, +1683, +14881, +13234, +11780, +11781, +11783, +11784, +3390, +11912, +6483, +11330, +11942, +10590, +13962, +7854, +3409, +8368, +11265, +14812, +13732, +6487, +6393, +13102, +11880, +9902, +14060, +1737, +1736, +9863, +14839, +14020, +12650, +14426, +14425, +1893, +14225, +14229, +14228, +14230, +14227, +14226, +14428, +14878, +1891, +12688, +11660, +14125, +] + +_charnames_11559 = [ +13407, +-1, +-1, +-1, +-1, +-1, +13408, +] + +_charnames_11826 = [ +3427, +14190, +14191, +3417, +12767, +12766, +3422, +3461, +3480, +3370, +1756, +13078, +13923, +8946, +12686, +14129, +12685, +12770, +12682, +14548, +14549, +9939, +9940, +12683, +12696, +3398, +4029, +11646, +11934, +] + +_charnames_42612 = [ +8704, +8705, +8701, +8703, +8709, +8702, +8707, +8708, +] + +_charnames_42648 = [ +9052, +9035, +9059, +9048, +4843, +4842, +8710, +8706, +] + +_charnames_42893 = [ +9768, +9655, +9811, +9786, +9692, +9798, +9667, +9666, +9703, +9801, +9640, +9805, +9715, +9764, +9698, +9763, +9697, +9762, +9696, +9795, +9709, +9803, +9713, +9785, +9691, +9772, +9686, +9752, +9600, +9804, +9773, +9754, +9789, +9753, +9810, +9767, +9766, +9792, +9797, +9800, +9639, +9760, +9628, +9748, +9563, +] + +_charnames_43488 = [ +5072, +5073, +5071, +5070, +5074, +5096, +5097, +5055, +5067, +5062, +5061, +5059, +5058, +5051, +5050, +5056, +5088, +5089, +5080, +5081, +5086, +5087, +5083, +5084, +5091, +5090, +5066, +5053, +5052, +5065, +5064, +] + +_charnames_43744 = [ +4045, +4044, +4046, +4039, +4034, +4033, +4043, +4042, +4040, +4037, +4036, +4056, +4055, +4052, +4053, +4051, +4063, +4060, +4059, +4062, +4061, +4054, +4057, +] + +_charnames_43777 = [ +14338, +14340, +14341, +14337, +14336, +14339, +-1, +-1, +14315, +14317, +14318, +14314, +14313, +14316, +-1, +-1, +14308, +14310, +14311, +14307, +14306, +14309, +] + +_charnames_43808 = [ +14322, +14324, +14326, +14323, +14321, +14320, +14325, +-1, +14330, +14332, +14334, +14331, +14329, +14328, +14333, +-1, +9637, +9675, +9633, +9636, +9587, +9659, +9594, +9657, +9658, +9656, +9706, +9693, +9588, +9631, +9632, +9620, +9614, +9644, +9645, +9646, +9647, +9601, +9809, +9688, +9710, +9687, +9711, +9592, +9593, +9638, +9564, +9569, +9571, +9651, +9568, +9661, +9663, +9664, +9682, +9678, +9681, +9680, +9712, +4848, +4839, +4836, +4835, +4838, +9602, +9616, +9623, +9570, +9615, +13213, +] + +_charnames_43888 = [ +8478, +8477, +8476, +8474, +8473, +8472, +8471, +8475, +8470, +8469, +8468, +8467, +8466, +8421, +8420, +8419, +8417, +8416, +8415, +8464, +8463, +8462, +8461, +8460, +8459, +8457, +8456, +8455, +8454, +8453, +8407, +8418, +8408, +8413, +8412, +8411, +8410, +8409, +8450, +8449, +8448, +8447, +8446, +8445, +8405, +8399, +8404, +8403, +8402, +8401, +8400, +8429, +8398, +8428, +8397, +8427, +8396, +8425, +8424, +8423, +8426, +8395, +8394, +8393, +8392, +8391, +8390, +8388, +8387, +8386, +8385, +8384, +8383, +8443, +8442, +8441, +8440, +8439, +8438, +8436, +] + +_charnames_64434 = [ +5972, +5971, +5962, +5961, +5968, +5967, +5966, +5965, +5979, +5978, +5973, +5960, +5959, +5980, +5976, +5975, +] + +_charnames_65063 = [ +8695, +8694, +8738, +8737, +8749, +8748, +8714, +8713, +8712, +] + +_charnames_66272 = [ +8807, +8804, +8796, +8797, +8802, +8803, +8799, +8800, +8806, +8805, +8772, +8768, +8771, +8783, +8786, +8775, +8778, +8791, +8788, +8793, +8767, +8770, +8782, +8785, +8776, +8779, +8792, +8789, +] + +_charnames_66384 = [ +12164, +12163, +12161, +12139, +12151, +12141, +12138, +12142, +12137, +12132, +12159, +12158, +12157, +12156, +12144, +12155, +12154, +12131, +12148, +12153, +12162, +12129, +12130, +12126, +12121, +12149, +12150, +12152, +12160, +12147, +12145, +12120, +12122, +12124, +12133, +12125, +12123, +12134, +8733, +8732, +8729, +8731, +8730, +] + +_charnames_66736 = [ +12278, +12279, +12280, +12281, +12312, +12311, +12276, +12269, +12277, +12301, +12300, +12308, +12290, +12275, +12288, +12307, +12306, +12305, +12297, +12298, +12304, +12274, +12296, +12295, +12286, +12273, +12285, +12272, +12284, +12310, +12303, +12302, +12289, +12309, +12293, +12292, +-1, +-1, +-1, +-1, +12233, +12234, +12235, +12236, +12267, +12266, +12231, +12224, +12232, +12256, +12255, +12263, +12245, +12230, +12243, +12262, +12261, +12260, +12252, +12253, +12259, +12229, +12251, +12250, +12241, +12228, +12240, +12227, +12239, +12265, +12258, +12257, +12244, +12264, +12248, +12247, +-1, +-1, +-1, +-1, +14293, +14292, +14279, +14278, +14276, +14246, +14275, +14273, +14272, +14291, +14253, +14252, +14290, +14289, +14288, +14271, +14268, +14267, +14287, +14245, +14247, +14244, +14286, +14285, +14284, +14265, +14264, +14262, +14261, +14259, +14258, +14283, +14282, +14281, +14280, +14256, +14255, +14250, +14251, +14270, +] + +_charnames_66864 = [ +8904, +8913, +8897, +8864, +8901, +8869, +8900, +8867, +8873, +8843, +8879, +8868, +8876, +8855, +8889, +8877, +8905, +8863, +8852, +8894, +8892, +8888, +8911, +8882, +8903, +8845, +8846, +8848, +8910, +8883, +8909, +8861, +8856, +8895, +8908, +8871, +8912, +8862, +8844, +8886, +8898, +8907, +8858, +8906, +8872, +8857, +8875, +8849, +8851, +8880, +8885, +8891, +] + +_charnames_67072 = [ +9153, +9152, +9151, +9150, +9149, +9148, +9147, +9146, +9145, +9197, +9196, +9195, +9194, +9193, +9133, +9123, +9125, +9124, +9120, +9122, +9121, +9126, +9127, +9132, +9131, +9130, +9129, +9512, +9128, +9191, +9190, +9189, +9188, +9187, +9186, +9162, +9161, +9160, +9159, +9158, +9157, +9156, +9155, +9143, +9142, +9141, +9140, +9139, +9138, +9137, +9136, +9135, +9184, +9183, +9182, +9181, +9180, +9179, +9170, +9169, +9168, +9167, +9166, +9165, +9164, +9177, +9176, +9175, +9174, +9173, +9172, +9511, +9212, +9202, +9510, +9201, +9200, +9208, +9207, +9509, +9211, +9210, +9205, +9204, +9209, +9331, +9330, +9329, +9328, +9327, +9326, +9325, +9324, +9323, +9322, +9321, +9318, +9317, +9316, +9309, +9308, +9307, +9315, +9314, +9313, +9312, +9311, +9310, +9386, +9385, +9384, +9383, +9382, +9381, +9380, +9379, +9378, +9377, +9375, +9374, +9373, +9372, +9371, +9370, +9369, +9368, +9367, +9366, +9364, +9363, +9362, +9361, +9360, +9359, +9358, +9357, +9356, +9355, +9353, +9352, +9351, +9350, +9349, +9348, +9347, +9346, +9345, +9344, +9342, +9341, +9340, +9339, +9338, +9337, +9336, +9335, +9334, +9333, +9389, +9388, +9488, +9487, +9486, +9485, +9484, +9483, +9482, +9481, +9480, +9479, +9498, +9497, +9496, +9495, +9494, +9493, +9492, +9491, +9490, +9274, +9273, +9272, +9271, +9270, +9269, +9268, +9267, +9303, +9302, +9301, +9300, +9299, +9298, +9265, +9264, +9263, +9262, +9261, +9260, +9259, +9258, +9257, +9255, +9254, +9253, +9252, +9251, +9250, +9249, +9248, +9247, +9282, +9281, +9280, +9279, +9278, +9277, +9276, +9245, +9244, +9243, +9242, +9241, +9240, +9239, +9238, +9237, +9296, +9295, +9294, +9293, +9292, +9291, +9235, +9234, +9233, +9232, +9231, +9230, +9229, +9228, +9227, +9226, +9224, +9223, +9222, +9221, +9220, +9219, +9218, +9217, +9216, +9215, +9289, +9288, +9287, +9286, +9285, +9284, +9439, +9438, +9437, +9436, +9435, +9434, +9433, +9432, +9401, +9400, +9399, +9398, +9397, +9396, +9395, +9394, +9393, +9392, +9421, +9420, +9419, +9418, +9417, +9416, +9415, +9414, +9413, +9449, +9448, +9447, +9430, +9429, +9428, +9427, +9426, +9425, +9424, +9423, +9411, +9410, +9409, +9408, +9407, +9406, +9405, +9404, +9403, +9445, +9444, +9443, +9442, +9441, +] + +_charnames_67392 = [ +9466, +9465, +9464, +9463, +9462, +9461, +9460, +9459, +9458, +9457, +9456, +9455, +9454, +9474, +9473, +9472, +9471, +9470, +9469, +9468, +9476, +9475, +] + +_charnames_67424 = [ +9507, +9506, +9505, +9504, +9503, +9502, +9501, +9500, +] + +_charnames_67680 = [ +11607, +11621, +11618, +11620, +11603, +11610, +11608, +11604, +11601, +11609, +11617, +11616, +11615, +11619, +11614, +11597, +11606, +11613, +11598, +11612, +11611, +11599, +11602, +11622, +11634, +11633, +11626, +11628, +11631, +11632, +11629, +11627, +10606, +10619, +10605, +10632, +10630, +10631, +10604, +10615, +10622, +10620, +10616, +10613, +10598, +10621, +10603, +10629, +10602, +10628, +10601, +10627, +10600, +10626, +10609, +10618, +10625, +10610, +10624, +10623, +10599, +10611, +10614, +] + +_charnames_67751 = [ +10640, +10636, +10638, +10643, +10645, +10644, +10639, +10637, +10641, +] + +_charnames_67808 = [ +11236, +11248, +11246, +11247, +11232, +11239, +11237, +11233, +11230, +11238, +11245, +11244, +11243, +11242, +11226, +11235, +11241, +11227, +11240, +-1, +11228, +11231, +-1, +-1, +-1, +-1, +-1, +11253, +11255, +11252, +11251, +11254, +] + +_charnames_67968 = [ +3894, +3892, +3890, +3887, +3883, +3884, +3881, +3882, +3886, +3888, +3870, +3871, +3868, +3869, +3876, +3877, +3889, +3879, +3891, +3873, +3874, +3875, +3880, +3885, +3864, +3865, +3862, +3863, +3866, +3893, +3895, +3896, +3823, +3835, +3833, +3830, +3825, +3826, +3837, +3829, +3831, +3819, +3818, +3827, +3832, +3821, +3834, +3816, +3824, +3815, +3822, +3828, +3813, +3812, +3811, +3836, +-1, +-1, +-1, +-1, +3856, +3851, +3839, +3840, +3803, +3742, +3750, +3776, +3784, +3760, +3767, +3797, +3791, +3757, +3747, +3755, +3781, +3789, +3765, +3772, +-1, +-1, +3805, +3744, +3752, +3778, +3786, +3762, +3769, +3799, +3793, +3807, +3746, +3754, +3780, +3788, +3764, +3771, +3801, +3795, +3758, +3748, +3756, +3782, +3790, +3766, +3773, +3802, +3796, +3806, +3745, +3753, +3779, +3787, +3763, +3770, +3800, +3794, +3850, +3843, +3844, +3853, +3854, +3847, +3848, +3857, +3858, +3845, +] + +_charnames_68224 = [ +12185, +12203, +12186, +12202, +12200, +12197, +12176, +12199, +12205, +12172, +12177, +12183, +12201, +12182, +12198, +12175, +12204, +12194, +12195, +12192, +12189, +12191, +12188, +12173, +12179, +12171, +12196, +12170, +12180, +12210, +12209, +12208, +] + +_charnames_68288 = [ +4085, +4112, +4111, +4105, +4106, +4109, +4102, +4114, +4140, +4089, +4088, +4101, +4100, +4103, +4081, +4113, +4098, +4092, +4097, +4119, +4108, +4080, +4118, +4117, +4075, +4084, +4086, +4116, +4120, +4076, +4094, +4091, +4095, +4115, +4078, +4077, +4082, +4139, +4138, +-1, +-1, +-1, +-1, +4134, +4136, +4133, +4132, +4135, +4127, +4129, +4125, +4124, +4123, +4126, +4128, +] + +_charnames_68480 = [ +11807, +11806, +11804, +11805, +11793, +11797, +11795, +11794, +11796, +11803, +11802, +11801, +11800, +11790, +11799, +11791, +11792, +11798, +] + +_charnames_68521 = [ +11815, +11811, +11813, +11817, +11814, +11812, +11816, +] + +_charnames_68736 = [ +12033, +12037, +12032, +12035, +12008, +12007, +12009, +12031, +12034, +12002, +12054, +12030, +12029, +12021, +12022, +12028, +12051, +12052, +12027, +12026, +12036, +12041, +12019, +12020, +12017, +12003, +12006, +12042, +12043, +12050, +12047, +12044, +12025, +12018, +12024, +12053, +12015, +12016, +12013, +12004, +12014, +12010, +12038, +12039, +12049, +12046, +12023, +12011, +12012, +12005, +12040, +] + +_charnames_68800 = [ +11979, +11983, +11978, +11981, +11954, +11953, +11955, +11977, +11980, +11948, +12000, +11976, +11975, +11967, +11968, +11974, +11997, +11998, +11973, +11972, +11982, +11987, +11965, +11966, +11963, +11949, +11952, +11988, +11989, +11996, +11993, +11990, +11971, +11964, +11970, +11999, +11961, +11962, +11959, +11950, +11960, +11956, +11984, +11985, +11995, +11992, +11969, +11957, +11958, +11951, +11986, +] + +_charnames_68858 = [ +12056, +12061, +12063, +12062, +12059, +12058, +11178, +11177, +11169, +11155, +11154, +11172, +11176, +11173, +11147, +11175, +11164, +11163, +11161, +11160, +11165, +11158, +11157, +11148, +11174, +11171, +11170, +11152, +11167, +11146, +11166, +11145, +11151, +11150, +11168, +11198, +11196, +11194, +11197, +11195, +11206, +11207, +11204, +11203, +11202, +11201, +] + +_charnames_68912 = [ +11189, +11190, +11181, +11182, +11187, +11188, +11184, +11185, +11192, +11191, +] + +_charnames_69376 = [ +12085, +12076, +12100, +12075, +12099, +12087, +12074, +12091, +12089, +12088, +12090, +12098, +12097, +12096, +12095, +12072, +12073, +12079, +12086, +12084, +12094, +12080, +12070, +12071, +12093, +12081, +12092, +12068, +12069, +12111, +12105, +12108, +12114, +12115, +12110, +12106, +12109, +12112, +12116, +12101, +] + +_charnames_69424 = [ +1314, +1326, +1324, +1310, +1317, +1315, +1311, +1316, +1323, +1309, +1322, +1321, +1304, +1313, +1320, +1305, +1319, +1306, +1318, +1325, +1308, +1356, +1335, +1329, +1336, +1330, +1339, +1338, +1333, +1332, +1342, +1341, +1340, +1354, +1353, +1352, +1355, +1345, +1346, +1349, +1347, +1348, +] + +_charnames_69632 = [ +7639, +7640, +7636, +7638, +7637, +7531, +7534, +7553, +7554, +7539, +7540, +7504, +7505, +7506, +7507, +7568, +7533, +7515, +7532, +7549, +7548, +7557, +7556, +7523, +7560, +7559, +7552, +7551, +7521, +7512, +7511, +7528, +7527, +7522, +7514, +7513, +7530, +7529, +7524, +7543, +7542, +7563, +7562, +7566, +7564, +7565, +7546, +7508, +7537, +7536, +7538, +7567, +7545, +7519, +7517, +7518, +7609, +7616, +7612, +7613, +7610, +7611, +7602, +7603, +7604, +7605, +7615, +7608, +7614, +7607, +7617, +7634, +7633, +7647, +7646, +7644, +7648, +7643, +-1, +-1, +-1, +-1, +7590, +7572, +7575, +7585, +7588, +7579, +7581, +7596, +7594, +7577, +7573, +7576, +7586, +7589, +7580, +7582, +7597, +7595, +7593, +7592, +7629, +7630, +7621, +7622, +7627, +7628, +7624, +7625, +7632, +7631, +] + +_charnames_69837 = [ +13699, +-1, +-1, +1373, +1372, +1385, +1384, +1383, +1382, +1364, +1361, +1377, +1362, +1370, +1375, +1369, +1374, +1381, +1378, +1379, +1360, +1386, +1368, +1380, +1371, +1376, +1367, +1365, +] + +_charnames_69872 = [ +1397, +1398, +1389, +1390, +1395, +1396, +1392, +1393, +1400, +1399, +-1, +-1, +-1, +-1, +-1, +-1, +8577, +8578, +8576, +8541, +8538, +8534, +8540, +8520, +8519, +8526, +8525, +8501, +8529, +8528, +8523, +8522, +8499, +8495, +8494, +8506, +8505, +8500, +8497, +8496, +8508, +8507, +8502, +8514, +8513, +8532, +8531, +8537, +8510, +8511, +8536, +8517, +8533, +8535, +8539, +8544, +8552, +8553, +8548, +8549, +8554, +8546, +8550, +8545, +8551, +8581, +8583, +8556, +8582, +-1, +8568, +8569, +8560, +8561, +8566, +8567, +8563, +8564, +8571, +8570, +8579, +8573, +8572, +8580, +8516, +8547, +8555, +] + +_charnames_69968 = [ +4429, +4426, +4421, +4428, +4423, +4407, +4406, +4413, +4412, +4416, +4415, +4410, +4409, +4396, +4386, +4385, +4392, +4391, +4397, +4388, +4387, +4394, +4393, +4398, +4404, +4403, +4419, +4418, +4424, +4401, +4425, +4420, +4422, +4427, +4400, +4432, +4434, +4433, +4430, +] + +_charnames_70016 = [ +1527, +1522, +1518, +1458, +1461, +1480, +1481, +1466, +1467, +1436, +1437, +1438, +1439, +1496, +1460, +1493, +1459, +1476, +1475, +1484, +1483, +1450, +1487, +1486, +1479, +1478, +1448, +1444, +1443, +1455, +1454, +1449, +1446, +1445, +1457, +1456, +1451, +1470, +1469, +1490, +1489, +1494, +1491, +1492, +1473, +1472, +1440, +1464, +1463, +1465, +1495, +1507, +1510, +1511, +1508, +1509, +1500, +1501, +1502, +1503, +1513, +1506, +1512, +1505, +1519, +1521, +1526, +1523, +1555, +1551, +1550, +1558, +1532, +1534, +1525, +1514, +1553, +1533, +-1, +-1, +1546, +1547, +1538, +1539, +1544, +1545, +1541, +1542, +1549, +1548, +1554, +1524, +1556, +1557, +1531, +1530, +-1, +1154, +1146, +1147, +1152, +1153, +1149, +1150, +1156, +1155, +1132, +1130, +1131, +1140, +1141, +1134, +1135, +1143, +1142, +1138, +1137, +] + +_charnames_70144 = [ +13547, +13550, +13581, +13576, +13583, +13549, +13579, +13548, +13567, +13566, +13554, +13553, +13552, +13545, +13573, +13572, +13570, +13569, +-1, +13543, +13539, +13538, +13533, +13531, +13544, +13541, +13540, +13535, +13532, +13534, +13546, +13561, +13560, +13558, +13557, +13556, +13580, +13574, +13578, +13564, +13575, +13577, +13582, +13563, +13588, +13589, +13590, +13591, +13593, +13587, +13592, +13586, +13601, +13599, +13600, +13598, +13607, +13606, +13608, +13602, +13605, +13609, +13597, +] + +_charnames_70272 = [ +4961, +4958, +4954, +4960, +4939, +4938, +4945, +-1, +4944, +-1, +4948, +4947, +4942, +4941, +-1, +4931, +4923, +4922, +4917, +4916, +4915, +4932, +4925, +4924, +4919, +4918, +4933, +4936, +4935, +4951, +-1, +4950, +4956, +4952, +4929, +4957, +4953, +4955, +4959, +4927, +4928, +4962, +-1, +-1, +-1, +-1, +-1, +-1, +13456, +13459, +13486, +13487, +13472, +13473, +13497, +13458, +13493, +13457, +13485, +13484, +13467, +13466, +13465, +13454, +13490, +13489, +13463, +13461, +13462, +13452, +13448, +13447, +13442, +13441, +13478, +13440, +13453, +13450, +13449, +13444, +13443, +13455, +13482, +13481, +13471, +13470, +13469, +13494, +13491, +13479, +13495, +13492, +13475, +13476, +13496, +13526, +13516, +13519, +13520, +13517, +13518, +13522, +13515, +13521, +13514, +13525, +13524, +-1, +-1, +-1, +-1, +-1, +13508, +13509, +13500, +13501, +13506, +13507, +13503, +13504, +13511, +13510, +-1, +-1, +-1, +-1, +-1, +-1, +13196, +13197, +13200, +13193, +-1, +13136, +13139, +13158, +13159, +13144, +13145, +13111, +13113, +-1, +-1, +13174, +13138, +-1, +-1, +13171, +13137, +13154, +13153, +13162, +13161, +13128, +13165, +13164, +13157, +13156, +13126, +13122, +13121, +13133, +13132, +13127, +13124, +13123, +13135, +13134, +13129, +-1, +13148, +13147, +13168, +13167, +13172, +13169, +13170, +-1, +13151, +13150, +-1, +13118, +13142, +13141, +13143, +13173, +-1, +8757, +13202, +13199, +13184, +13187, +13188, +13185, +13186, +13177, +13178, +-1, +-1, +13190, +13183, +-1, +-1, +13189, +13182, +13194, +-1, +-1, +13203, +-1, +-1, +-1, +-1, +-1, +-1, +13204, +-1, +-1, +-1, +-1, +-1, +13201, +13117, +13116, +13112, +13114, +13179, +13180, +-1, +-1, +8664, +8666, +8659, +8660, +8662, +8663, +8665, +-1, +-1, +-1, +8672, +8671, +8670, +8668, +8669, +] + +_charnames_70656 = [ +10425, +10428, +10453, +10454, +10433, +10434, +10409, +10410, +10411, +10412, +10468, +10427, +10466, +10426, +10449, +10448, +10457, +10456, +10404, +10403, +10460, +10459, +10452, +10451, +10401, +10400, +10416, +10415, +10422, +10421, +10405, +10418, +10417, +10424, +10423, +10407, +10406, +10440, +10439, +10463, +10462, +10443, +10442, +10464, +10437, +10436, +10446, +10445, +10465, +10431, +10430, +10432, +10467, +10478, +10481, +10482, +10479, +10480, +10471, +10472, +10473, +10474, +10484, +10477, +10483, +10476, +10507, +10513, +10510, +10506, +10511, +10509, +10512, +10517, +10514, +10501, +10500, +10520, +10519, +10521, +10496, +10497, +10488, +10489, +10494, +10495, +10491, +10492, +10499, +10498, +-1, +10516, +-1, +10518, +10515, +] + +_charnames_70784 = [ +3325, +3245, +3248, +3264, +3265, +3253, +3254, +3223, +3224, +3225, +3226, +3281, +3247, +3277, +3246, +3260, +3259, +3268, +3267, +3237, +3271, +3270, +3263, +3262, +3235, +3231, +3230, +3242, +3241, +3236, +3233, +3232, +3244, +3243, +3238, +3257, +3256, +3274, +3273, +3278, +3275, +3276, +3279, +3227, +3251, +3250, +3252, +3280, +3291, +3297, +3298, +3292, +3293, +3284, +3285, +3286, +3287, +3300, +3296, +3290, +3299, +3295, +3289, +3323, +3321, +3317, +3318, +3322, +3320, +3328, +3326, +3327, +] + +_charnames_70864 = [ +3311, +3312, +3303, +3304, +3309, +3310, +3306, +3307, +3314, +3313, +] + +_charnames_71040 = [ +1009, +1013, +1040, +1041, +1029, +1030, +1004, +1005, +1006, +1007, +1057, +1012, +1053, +1010, +1036, +1035, +1044, +1043, +1017, +1047, +1046, +1039, +1038, +1015, +997, +996, +1022, +1021, +1016, +1001, +1000, +1024, +1023, +1018, +1033, +1032, +1050, +1049, +1054, +1051, +1052, +1055, +1008, +1027, +1026, +1028, +1056, +1097, +1102, +1103, +1100, +1101, +1098, +1099, +-1, +-1, +1105, +1096, +1104, +1095, +1089, +1090, +1085, +1086, +1088, +1087, +1112, +1111, +1081, +1082, +1109, +1108, +1107, +1113, +1064, +1065, +1070, +1069, +1068, +1078, +1079, +1077, +1066, +1076, +1075, +1073, +1072, +1074, +999, +993, +994, +1011, +1093, +1094, +] + +_charnames_71168 = [ +4749, +4752, +4771, +4772, +4757, +4758, +4727, +4728, +4729, +4730, +4787, +4751, +4784, +4750, +4767, +4766, +4775, +4774, +4741, +4778, +4777, +4770, +4769, +4739, +4735, +4734, +4746, +4745, +4740, +4737, +4736, +4748, +4747, +4742, +4761, +4760, +4781, +4780, +4785, +4782, +4783, +4764, +4731, +4755, +4754, +4756, +4786, +4763, +4797, +4800, +4801, +4798, +4799, +4790, +4791, +4792, +4793, +4803, +4796, +4802, +4795, +4827, +4823, +4824, +4826, +4820, +4819, +4829, +4828, +] + +_charnames_71248 = [ +4815, +4816, +4807, +4808, +4813, +4814, +4810, +4811, +4818, +4817, +-1, +-1, +-1, +-1, +-1, +-1, +4866, +4856, +4869, +4862, +4867, +4858, +4859, +4863, +4864, +4852, +4854, +4855, +4861, +] + +_charnames_71296 = [ +3138, +3141, +3159, +3160, +3142, +3143, +3176, +3140, +3172, +3139, +3155, +3154, +3163, +3162, +3130, +3166, +3165, +3158, +3157, +3128, +3124, +3123, +3135, +3134, +3129, +3126, +3125, +3137, +3136, +3131, +3152, +3151, +3169, +3168, +3173, +3170, +3149, +3174, +3171, +3145, +3146, +3175, +3148, +3207, +3204, +3195, +3198, +3199, +3196, +3197, +3201, +3194, +3200, +3193, +3205, +3206, +] + +_charnames_71360 = [ +3187, +3188, +3179, +3180, +3185, +3186, +3182, +3183, +3190, +3189, +] + +_charnames_71424 = [ +6414, +6413, +6404, +6405, +6408, +6399, +6411, +6410, +6426, +6429, +6417, +6432, +6407, +6428, +6430, +6427, +6403, +6431, +6397, +6423, +6422, +6420, +6400, +6419, +6425, +6416, +6401, +-1, +-1, +6470, +6471, +6469, +6434, +6438, +6441, +6442, +6439, +6440, +6444, +6435, +6443, +6437, +6436, +6465, +-1, +-1, +-1, +-1, +6455, +6456, +6447, +6448, +6453, +6454, +6450, +6451, +6458, +6457, +6474, +6473, +6462, +6463, +6464, +6466, +] + +_charnames_71680 = [ +12565, +12568, +12587, +12588, +12573, +12574, +12604, +12567, +12600, +12566, +12583, +12582, +12591, +12590, +12557, +12594, +12593, +12586, +12585, +12555, +12551, +12550, +12562, +12561, +12556, +12553, +12552, +12564, +12563, +12558, +12580, +12579, +12597, +12596, +12601, +12598, +12577, +12602, +12599, +12571, +12570, +12572, +12603, +12576, +12609, +12614, +12615, +12612, +12613, +12610, +12611, +12617, +12608, +12616, +12607, +12623, +12620, +12621, +12622, +12624, +] + +_charnames_71840 = [ +13807, +13789, +13808, +13779, +13782, +13781, +13813, +13798, +13793, +13803, +13791, +13814, +13812, +13795, +13780, +13799, +13796, +13804, +13810, +13806, +13815, +13790, +13792, +13816, +13811, +13787, +13786, +13785, +13788, +13801, +13802, +13809, +13767, +13749, +13768, +13739, +13742, +13741, +13773, +13758, +13753, +13763, +13751, +13774, +13772, +13755, +13740, +13759, +13756, +13764, +13770, +13766, +13775, +13750, +13752, +13776, +13771, +13747, +13746, +13745, +13748, +13761, +13762, +13769, +13827, +13828, +13819, +13820, +13825, +13826, +13822, +13823, +13830, +13829, +13835, +13833, +13834, +13840, +13841, +13837, +13838, +13843, +13842, +] + +_charnames_72192 = [ +14759, +14771, +14764, +14763, +14772, +14766, +14765, +14769, +14768, +14770, +14773, +14736, +14735, +14745, +14744, +14727, +14748, +14747, +14757, +14725, +14709, +14708, +14721, +14720, +14726, +14714, +14713, +14723, +14722, +14728, +14742, +14741, +14751, +14750, +14755, +14712, +14711, +14718, +14717, +14738, +14739, +14760, +14752, +14754, +14756, +14753, +14731, +14730, +14732, +14758, +14734, +14804, +14782, +14777, +14778, +14779, +14783, +14781, +14792, +14788, +14790, +14791, +14789, +14802, +14794, +14797, +14798, +14800, +14799, +14803, +14795, +14784, +] + +_charnames_72272 = [ +1246, +1273, +1267, +1266, +1274, +1268, +1269, +1272, +1271, +1264, +1265, +1275, +1221, +1220, +1233, +1232, +1212, +1236, +1235, +1230, +1229, +1210, +1196, +1195, +1205, +1204, +1211, +1201, +1200, +1208, +1207, +1213, +1227, +1226, +1239, +1238, +1243, +1199, +1198, +1206, +1223, +1224, +1247, +1240, +1242, +1244, +1241, +1216, +1215, +1217, +1245, +1219, +-1, +-1, +1285, +1286, +1283, +1284, +1257, +1256, +1252, +1258, +1251, +1259, +1254, +1253, +1255, +1250, +1249, +1260, +1290, +1289, +1299, +1291, +1277, +1278, +1280, +1279, +1294, +1295, +1292, +1298, +1297, +] + +_charnames_72384 = [ +11540, +11546, +11558, +11557, +11562, +11552, +11553, +11542, +11559, +11560, +11545, +11554, +11563, +11551, +11537, +11536, +11543, +11539, +11555, +11532, +11550, +11564, +11561, +11547, +11556, +11533, +11534, +11548, +11528, +11531, +11527, +11529, +11523, +11530, +11526, +11524, +11525, +11580, +11578, +11576, +11581, +11582, +11577, +11573, +11571, +11574, +11575, +11583, +11589, +11585, +11586, +11567, +11565, +11587, +11568, +11569, +11590, +] + +_charnames_72704 = [ +7689, +7692, +7708, +7709, +7697, +7698, +7668, +7669, +7670, +-1, +7725, +7691, +7721, +7690, +7704, +7703, +7712, +7711, +7681, +7715, +7714, +7707, +7706, +7679, +7675, +7674, +7686, +7685, +7680, +7677, +7676, +7688, +7687, +7682, +7701, +7700, +7718, +7717, +7722, +7719, +7720, +7723, +7671, +7695, +7694, +7696, +7724, +7760, +7763, +7764, +7761, +7762, +7754, +7755, +7756, +-1, +7766, +7759, +7765, +7758, +7791, +7790, +7786, +7787, +7789, +7783, +7782, +7795, +7794, +7793, +] + +_charnames_72784 = [ +7778, +7779, +7770, +7771, +7776, +7777, +7773, +7774, +7781, +7780, +7751, +7729, +7732, +7742, +7745, +7736, +7738, +7749, +7747, +7734, +7730, +7733, +7743, +7746, +7737, +7739, +7750, +7748, +7796, +-1, +-1, +-1, +4378, +4377, +4353, +4352, +4367, +4340, +4359, +4358, +4365, +4339, +4337, +4336, +4356, +4341, +4350, +4349, +4368, +4363, +4335, +4334, +4355, +4361, +4343, +4344, +4370, +4360, +4362, +4364, +4346, +4347, +4366, +4369, +-1, +-1, +4311, +4310, +4325, +4298, +4317, +4316, +4323, +4297, +4295, +4294, +4314, +4299, +4308, +4307, +4326, +4321, +4293, +4292, +4313, +4319, +4301, +4302, +-1, +4318, +4320, +4322, +4304, +4305, +4324, +4327, +4376, +4374, +4372, +4375, +4373, +4330, +4329, +] + +_charnames_72960 = [ +4207, +4210, +4231, +4232, +4223, +4224, +4248, +-1, +4209, +4245, +-1, +4208, +4218, +4217, +4235, +4234, +4199, +4238, +4237, +4222, +4221, +4197, +4192, +4191, +4204, +4203, +4198, +4195, +4194, +4206, +4205, +4200, +4227, +4226, +4241, +4240, +4246, +4242, +4244, +4230, +4243, +4213, +4212, +4214, +4247, +4229, +4216, +4220, +4193, +4254, +4257, +4258, +4255, +4256, +4259, +-1, +-1, +-1, +4261, +-1, +4253, +4260, +-1, +4252, +4282, +4278, +4279, +4281, +4280, +4262, +4284, +4285, +] + +_charnames_73040 = [ +4273, +4274, +4265, +4266, +4271, +4272, +4268, +4269, +4276, +4275, +-1, +-1, +-1, +-1, +-1, +-1, +13251, +13254, +13272, +13273, +13255, +13256, +-1, +13290, +13253, +-1, +13287, +13252, +13283, +13284, +13282, +13281, +13288, +13268, +13267, +13244, +13243, +13265, +13276, +13275, +13250, +13249, +13262, +13279, +13278, +13242, +13241, +13264, +13271, +13270, +13248, +13247, +13261, +13259, +13258, +13289, +13286, +13285, +13296, +13299, +13300, +13297, +13298, +-1, +13302, +13295, +-1, +13301, +13294, +13320, +13319, +13303, +13321, +] + +_charnames_73120 = [ +13314, +13315, +13306, +13307, +13312, +13313, +13309, +13310, +13317, +13316, +] + +_charnames_73440 = [ +4449, +4451, +4439, +4446, +4454, +4447, +4443, +4452, +4440, +4453, +4450, +4438, +4441, +4445, +4448, +4442, +4444, +4455, +4463, +4459, +4457, +4460, +4458, +4461, +4462, +] + +_charnames_74607 = [ +8243, +8300, +8303, +8304, +8158, +8159, +8153, +8146, +8259, +8258, +8183, +8182, +8200, +8197, +8334, +8235, +8234, +8232, +8231, +8241, +8239, +8238, +8237, +8236, +8228, +8093, +8103, +8101, +8099, +8313, +8311, +8223, +8202, +8218, +8217, +8208, +8221, +8339, +8338, +8281, +8326, +8295, +8296, +] + +_charnames_74851 = [ +8353, +8354, +8347, +8346, +8344, +8345, +8356, +8357, +8350, +8351, +8348, +8358, +-1, +-1, +-1, +-1, +-1, +8359, +] + +_charnames_74880 = [ +8301, +8302, +8305, +8320, +8319, +8318, +8317, +8321, +8160, +8157, +8151, +8150, +8152, +8132, +8130, +8131, +8141, +8140, +8145, +8124, +8121, +8123, +8122, +8138, +8137, +8144, +8119, +8118, +8116, +8117, +8112, +8110, +8111, +8113, +8128, +8127, +8126, +8143, +8142, +8135, +8134, +8262, +8261, +8264, +8263, +8254, +8253, +8252, +8249, +8250, +8247, +8248, +8251, +8257, +8190, +8180, +8179, +8178, +8189, +8172, +8175, +8174, +8188, +8187, +8169, +8170, +8171, +8186, +8164, +8167, +8166, +8185, +8184, +8191, +8199, +8196, +8194, +8193, +8336, +8335, +8242, +8240, +8229, +8227, +8092, +8062, +8057, +8056, +8061, +8054, +8053, +8060, +8059, +8051, +8050, +8058, +8089, +8088, +8073, +8072, +8067, +8066, +8065, +8074, +8070, +8069, +8079, +8078, +8077, +8082, +8081, +8083, +8037, +8029, +8036, +8035, +8033, +8032, +8034, +8045, +8044, +8047, +8046, +8042, +8041, +8040, +8039, +8090, +8026, +7999, +8012, +8011, +8010, +8009, +8008, +8007, +8006, +8004, +8003, +8002, +8025, +8013, +8024, +8023, +8018, +8019, +8022, +8021, +8020, +8017, +8016, +8086, +8085, +8104, +8102, +8100, +8096, +8097, +8098, +8312, +8310, +8309, +8216, +8209, +8210, +8215, +8214, +8213, +8212, +8211, +8204, +8206, +8205, +8283, +8282, +8280, +8279, +8276, +8272, +8271, +8270, +8269, +8275, +8274, +8284, +8327, +8325, +8324, +8294, +8293, +8291, +8290, +8289, +8332, +8331, +8330, +] + +_charnames_82944 = [ +5601, +5600, +5599, +5598, +5597, +5596, +5595, +5594, +5593, +5548, +5549, +5558, +5557, +5556, +5555, +5554, +5553, +5552, +5551, +5550, +5546, +5545, +5544, +5543, +5542, +5541, +5536, +5537, +5540, +5539, +5538, +5534, +5533, +5532, +5531, +5530, +5529, +5528, +5527, +5526, +5524, +5525, +5495, +5487, +5488, +5494, +5493, +5492, +5485, +5486, +5482, +5484, +5483, +5491, +5490, +5489, +5591, +5590, +5589, +5588, +5587, +5586, +5585, +5584, +5583, +5582, +5509, +5508, +5507, +5506, +5505, +5504, +5497, +5500, +5499, +5498, +5503, +5502, +5501, +5580, +5579, +5578, +5577, +5576, +5575, +5574, +5573, +5572, +5571, +5569, +5568, +5567, +5566, +5565, +5564, +5563, +5562, +5561, +5560, +5522, +5521, +5520, +5519, +5518, +5517, +5516, +5513, +5514, +5511, +5512, +5515, +5121, +5122, +5119, +5120, +5117, +5118, +5126, +5110, +5113, +5112, +5111, +5114, +5116, +5115, +5125, +5106, +5109, +5108, +5107, +5124, +5123, +5128, +5130, +5129, +5140, +5139, +5138, +5137, +5131, +5132, +5136, +5135, +5134, +5133, +5164, +5163, +5162, +5161, +5160, +5154, +5155, +5159, +5158, +5157, +5156, +5152, +5151, +5150, +5149, +5148, +5142, +5143, +5147, +5146, +5145, +5144, +5230, +5229, +5228, +5227, +5226, +5225, +5224, +5223, +5222, +5221, +5219, +5218, +5217, +5216, +5215, +5214, +5213, +5212, +5211, +5210, +5208, +5207, +5206, +5205, +5204, +5203, +5202, +5201, +5200, +5199, +5197, +5196, +5195, +5194, +5193, +5192, +5191, +5190, +5189, +5188, +5186, +5185, +5184, +5183, +5182, +5181, +5180, +5179, +5178, +5177, +5175, +5174, +5173, +5172, +5171, +5170, +5169, +5168, +5167, +5166, +5373, +5372, +5360, +5362, +5361, +5371, +5370, +5369, +5368, +5365, +5366, +5367, +5363, +5364, +5399, +5398, +5397, +5396, +5395, +5390, +5391, +5388, +5389, +5394, +5393, +5392, +5435, +5434, +5433, +5432, +5431, +5430, +5429, +5425, +5426, +5428, +5427, +5479, +5478, +5477, +5476, +5475, +5474, +5473, +5472, +5471, +5470, +5468, +5467, +5466, +5465, +5464, +5463, +5462, +5461, +5460, +5459, +5457, +5456, +5455, +5454, +5453, +5452, +5451, +5450, +5449, +5448, +5423, +5422, +5421, +5420, +5419, +5418, +5417, +5413, +5414, +5416, +5415, +5446, +5445, +5444, +5443, +5442, +5441, +5440, +5439, +5438, +5437, +5411, +5410, +5409, +5408, +5407, +5406, +5405, +5404, +5403, +5401, +5402, +5386, +5385, +5384, +5383, +5377, +5378, +5382, +5381, +5380, +5379, +5375, +5376, +5324, +5323, +5322, +5321, +5320, +5319, +5318, +5317, +5316, +5314, +5315, +5357, +5356, +5355, +5354, +5353, +5352, +5351, +5350, +5349, +5348, +5312, +5311, +5310, +5309, +5308, +5307, +5306, +5305, +5304, +5302, +5303, +5248, +5247, +5240, +5239, +5238, +5246, +5245, +5244, +5233, +5236, +5235, +5234, +5243, +5242, +5241, +5346, +5345, +5344, +5343, +5342, +5341, +5340, +5339, +5338, +5337, +5300, +5299, +5298, +5297, +5296, +5295, +5294, +5293, +5292, +5290, +5291, +5276, +5275, +5274, +5273, +5267, +5268, +5272, +5271, +5270, +5265, +5266, +5269, +5288, +5278, +5279, +5287, +5286, +5285, +5284, +5283, +5282, +5281, +5280, +5263, +5255, +5256, +5262, +5254, +5253, +5261, +5260, +5250, +5251, +5259, +5258, +5257, +5335, +5334, +5333, +5332, +5331, +5330, +5329, +5328, +5327, +5326, +5705, +5704, +5703, +5702, +5701, +5700, +5699, +5698, +5697, +5696, +5619, +5618, +5628, +5627, +5626, +5625, +5624, +5623, +5622, +5621, +5620, +5694, +5693, +5692, +5691, +5690, +5689, +5688, +5687, +5686, +5685, +5683, +5682, +5681, +5680, +5679, +5678, +5677, +5676, +5675, +5674, +5672, +5671, +5670, +5669, +5668, +5667, +5666, +5665, +5664, +5663, +5606, +5607, +5615, +5614, +5613, +5612, +5611, +5610, +5604, +5605, +5609, +5608, +5661, +5660, +5659, +5658, +5657, +5656, +5655, +5654, +5653, +5652, +5650, +5649, +5648, +5647, +5646, +5645, +5644, +5643, +5642, +5641, +5639, +5638, +5637, +5636, +5635, +5634, +5633, +5632, +5631, +5630, +5714, +5713, +5712, +5711, +5710, +5709, +5708, +5707, +5747, +5746, +5745, +5744, +5743, +5742, +5741, +5740, +5739, +5737, +5736, +5735, +5734, +5733, +5732, +5731, +5730, +5729, +5728, +5726, +5725, +5724, +5723, +5722, +5721, +5720, +5719, +5718, +5717, +5748, +] + +_charnames_92160 = [ +7053, +7161, +7130, +7131, +7074, +7105, +7150, +7062, +7108, +7127, +7128, +7084, +7146, +7055, +7082, +7089, +7098, +7116, +7049, +7136, +7067, +7114, +7052, +7156, +7155, +7048, +7087, +7122, +7159, +7123, +7094, +7061, +7164, +7160, +7047, +7115, +7099, +7100, +7092, +7140, +7124, +7071, +7133, +7083, +7076, +7132, +7145, +7153, +7113, +7148, +7086, +7137, +7070, +7141, +7093, +7104, +7154, +7167, +7166, +7142, +7112, +7088, +7107, +7045, +7109, +7058, +7120, +7068, +7163, +7054, +7085, +7075, +7097, +7059, +7149, +7111, +7121, +7064, +7081, +7057, +7139, +7065, +7165, +7152, +7077, +7073, +7096, +7201, +7236, +7210, +7211, +7231, +7173, +7220, +7239, +7172, +7221, +7225, +7240, +7229, +7203, +7204, +7242, +7224, +7235, +7208, +7207, +7182, +7175, +7198, +7216, +7243, +7215, +7230, +7226, +7248, +7196, +7193, +7247, +7212, +7237, +7186, +7191, +7192, +7183, +7209, +7176, +7187, +7199, +7223, +7185, +7245, +7174, +7246, +7217, +7180, +7179, +7232, +7194, +7202, +7177, +7219, +7195, +6906, +6943, +6997, +7035, +6904, +6921, +6907, +7030, +6955, +7032, +6947, +6939, +6953, +7025, +6925, +6962, +6981, +7031, +6984, +6998, +6942, +6965, +6916, +6957, +6999, +6992, +6993, +7014, +6926, +7008, +6934, +7004, +7016, +6903, +7037, +6946, +6973, +6940, +6900, +7019, +6958, +6976, +6937, +7006, +6901, +7040, +6920, +6917, +6915, +7041, +7038, +6954, +7039, +6933, +7020, +7003, +6912, +6930, +6988, +6899, +6969, +6966, +7021, +6990, +6932, +6908, +7034, +6902, +6914, +6938, +6991, +6913, +6924, +6972, +7000, +6923, +7011, +7015, +6956, +6970, +6963, +6982, +6952, +6983, +6961, +6996, +6929, +6975, +6974, +7012, +6986, +6987, +6909, +6945, +7022, +7026, +7027, +7007, +6801, +6888, +6748, +6784, +6749, +6862, +6751, +6761, +6742, +6767, +6887, +6736, +6814, +6738, +6833, +6844, +6813, +6754, +6820, +6834, +6879, +6837, +6824, +6786, +6770, +6803, +6795, +6826, +6878, +6752, +6831, +6733, +6848, +6891, +6735, +6893, +6771, +6790, +6857, +6772, +6807, +6792, +6865, +6791, +6783, +6860, +6758, +6799, +6840, +6766, +6846, +6825, +6877, +6832, +6885, +6847, +6734, +6787, +6757, +6830, +6870, +6868, +6764, +6858, +6741, +6788, +6744, +6876, +6871, +6875, +6773, +6776, +6821, +6838, +6746, +6737, +6849, +6796, +6836, +6762, +6845, +6804, +6743, +6856, +6745, +6760, +6753, +6890, +6835, +6882, +6852, +6850, +6765, +6884, +6859, +6797, +6781, +6819, +6806, +6817, +6812, +6839, +6779, +6815, +6777, +6869, +6780, +6816, +6866, +6805, +6861, +6883, +6851, +6778, +6800, +6823, +6894, +6538, +6622, +6602, +6667, +6724, +6662, +6574, +6656, +6711, +6551, +6542, +6570, +6614, +6515, +6681, +6717, +6654, +6524, +6575, +6621, +6674, +6664, +6553, +6530, +6593, +6513, +6529, +6552, +6713, +6547, +6587, +6657, +6519, +6600, +6700, +6514, +6548, +6595, +6661, +6525, +6540, +6615, +6653, +6571, +6536, +6521, +6644, +6701, +6619, +6635, +6588, +6618, +6679, +6655, +6626, +6722, +6719, +6668, +6567, +6612, +6705, +6531, +6651, +6599, +6603, +6556, +6565, +6708, +6617, +6675, +6645, +6558, +6643, +6607, +6541, +6582, +6632, +6670, +6690, +6707, +6510, +6680, +6592, +6516, +6703, +6692, +6561, +6586, +6638, +6523, +6559, +6555, +6589, +6597, +6691, +6564, +6605, +6702, +6688, +6604, +6569, +6511, +6673, +6581, +6562, +6636, +6520, +6578, +6689, +6694, +6545, +6727, +6623, +6725, +6726, +6666, +6577, +6611, +6613, +6537, +6650, +6637, +6526, +6633, +6640, +6641, +6630, +6631, +6678, +6585, +6546, +6572, +6718, +6695, +6723, +6669, +6596, +6714, +6712, +6527, +6532, +6648, +6649, +6687, +6563, +6579, +6663, +6682, +6608, +6591, +6594, +6625, +6683, +6606, +6627, +6693, +6704, +7281, +7319, +7278, +7321, +7286, +7300, +7259, +7311, +7288, +7289, +7296, +7301, +7263, +7255, +7291, +7269, +7268, +7270, +7271, +7277, +7275, +7252, +7251, +7254, +7313, +7266, +7314, +7261, +7305, +7260, +7316, +7306, +7290, +7262, +7284, +7276, +7257, +7258, +7267, +7307, +7320, +7317, +7310, +7309, +7280, +7293, +7285, +7297, +7295, +7294, +7302, +7279, +7272, +7318, +] + +_charnames_92736 = [ +4993, +5009, +5022, +5011, +5026, +5020, +5027, +5005, +4999, +5016, +5021, +5025, +5000, +4996, +5012, +5008, +5006, +4995, +4994, +5002, +5024, +4991, +5019, +5023, +5018, +4998, +5014, +5013, +5017, +5003, +4992, +-1, +5039, +5040, +5031, +5032, +5037, +5038, +5034, +5035, +5042, +5041, +-1, +-1, +-1, +-1, +5044, +5043, +] + +_charnames_92880 = [ +7400, +7413, +7423, +7429, +7425, +7403, +7416, +7419, +7412, +7426, +7428, +7405, +7420, +7415, +7418, +7430, +7408, +7422, +7431, +7421, +7404, +7424, +7406, +7432, +7409, +7410, +7407, +7401, +7399, +7427, +-1, +-1, +7439, +7436, +7440, +7435, +7438, +7441, +] + +_charnames_92928 = [ +11475, +11474, +11471, +11470, +11445, +11444, +11459, +11458, +11477, +11476, +11448, +11447, +11463, +11462, +11442, +11441, +11457, +11456, +11465, +11464, +11469, +11468, +11453, +11452, +11480, +11479, +11451, +11450, +11353, +11338, +11358, +11347, +11340, +11354, +11341, +11355, +11351, +11346, +11357, +11349, +11342, +11345, +11356, +11339, +11343, +11359, +11352, +11350, +11509, +11513, +11516, +11515, +11512, +11517, +11510, +11412, +11414, +11395, +11413, +11418, +11404, +11403, +11402, +11405, +11415, +11426, +11416, +11436, +11408, +11392, +] + +_charnames_93008 = [ +11491, +11492, +11483, +11484, +11489, +11490, +11486, +11487, +11494, +11493, +-1, +11501, +11504, +11499, +11506, +11505, +11500, +11502, +-1, +11417, +11406, +11433, +11421, +11434, +11432, +11430, +11407, +11429, +11437, +11420, +11425, +11422, +11435, +11427, +11398, +11394, +11390, +11391, +11396, +11397, +-1, +-1, +-1, +-1, +-1, +11364, +11372, +11378, +11379, +11383, +11369, +11381, +11385, +11366, +11365, +11384, +11370, +11382, +11376, +11386, +11373, +11363, +11368, +11375, +] + +_charnames_93760 = [ +3963, +3959, +3956, +3955, +3943, +3953, +3950, +3962, +3958, +3967, +3968, +3966, +3949, +3942, +3965, +3969, +3972, +3971, +3957, +3946, +3964, +3961, +3952, +3940, +3954, +3970, +3948, +3939, +3960, +3947, +3944, +3945, +3926, +3922, +3919, +3918, +3906, +3916, +3913, +3925, +3921, +3930, +3931, +3929, +3912, +3905, +3928, +3932, +3935, +3934, +3920, +3909, +3927, +3924, +3915, +3903, +3917, +3933, +3911, +3902, +3923, +3910, +3907, +3908, +3988, +3983, +3976, +3978, +3986, +3987, +3981, +3982, +3990, +3989, +3995, +4003, +3993, +3994, +4000, +4001, +3997, +3998, +4004, +4005, +3984, +3977, +3979, +3973, +4006, +3936, +4007, +] + +_charnames_93952 = [ +4639, +4650, +4585, +4638, +4642, +4641, +4614, +4649, +4633, +4632, +4552, +4607, +4583, +4584, +4551, +4606, +4563, +4565, +4586, +4612, +4559, +4558, +4621, +4620, +4619, +4618, +4550, +4605, +4549, +4604, +4648, +4630, +4587, +4636, +4635, +4562, +4561, +4611, +4645, +4646, +4629, +4628, +4545, +4600, +4556, +4555, +4546, +4601, +4581, +4588, +4597, +4624, +4623, +4576, +4574, +4547, +4602, +4582, +4625, +4577, +4575, +4572, +4570, +4613, +4571, +4569, +4647, +4615, +4644, +] + +_charnames_94032 = [ +4564, +4704, +4702, +4703, +4661, +4669, +4668, +4662, +4663, +4683, +4685, +4690, +4689, +4677, +4680, +4681, +4686, +4652, +4653, +4654, +4655, +4657, +4660, +4659, +4656, +4658, +4670, +4671, +4672, +4673, +4674, +4676, +4675, +4687, +4688, +4664, +4665, +4679, +4692, +4678, +4691, +4667, +4682, +4666, +4684, +4693, +4694, +] + +_charnames_94095 = [ +4697, +4696, +4699, +4698, +4543, +4542, +4541, +4540, +4539, +4538, +4537, +4596, +4595, +4594, +4593, +4592, +4591, +] + +_charnames_100352 = [ +2711, +2710, +2709, +2708, +2707, +2706, +2705, +2704, +2703, +2701, +2700, +2699, +2698, +2697, +2696, +2695, +2694, +2693, +2692, +2690, +2689, +2688, +2687, +2686, +2685, +2684, +2683, +2682, +2681, +2679, +2678, +2677, +2676, +2675, +2674, +2673, +2672, +2671, +2670, +2668, +2667, +2666, +2665, +2664, +2663, +2662, +2661, +2660, +2659, +2657, +2656, +2655, +2654, +2653, +2652, +2651, +2650, +2649, +2648, +2646, +2645, +2644, +2643, +2642, +2641, +2640, +2639, +2638, +2637, +2635, +2634, +2633, +2632, +2631, +2630, +2629, +2628, +2627, +2626, +2624, +2623, +2622, +2621, +2620, +2619, +2618, +2617, +2616, +2615, +2613, +2612, +2611, +2610, +2609, +2608, +2607, +2606, +2605, +2604, +2601, +2600, +2599, +2598, +2597, +2596, +2595, +2594, +2593, +2592, +2590, +2589, +2588, +2587, +2586, +2585, +2584, +2583, +2582, +2581, +2579, +2578, +2577, +2576, +2575, +2574, +2573, +2572, +2571, +2570, +2568, +2567, +2566, +2565, +2564, +2563, +2562, +2561, +2560, +2559, +2557, +2556, +2555, +2554, +2553, +2552, +2551, +2550, +2549, +2548, +2546, +2545, +2544, +2543, +2542, +2541, +2540, +2539, +2538, +2537, +2535, +2534, +2533, +2532, +2531, +2530, +2529, +2528, +2527, +2526, +2524, +2523, +2522, +2521, +2520, +2519, +2518, +2517, +2516, +2515, +2513, +2512, +2511, +2510, +2509, +2508, +2507, +2506, +2505, +2504, +2502, +2501, +2500, +2499, +2498, +2497, +2496, +2495, +2494, +2493, +2490, +2489, +2488, +2487, +2486, +2485, +2484, +2483, +2482, +2481, +2479, +2478, +2477, +2476, +2475, +2474, +2473, +2472, +2471, +2470, +2468, +2467, +2466, +2465, +2464, +2463, +2462, +2461, +2460, +2459, +2457, +2456, +2455, +2454, +2453, +2452, +2451, +2450, +2449, +2448, +2446, +2445, +2444, +2443, +2442, +2441, +2440, +2439, +2438, +2437, +2435, +2434, +2433, +2432, +2431, +2430, +2429, +2428, +2427, +2426, +2424, +2423, +2422, +2421, +2420, +2419, +2418, +2417, +2416, +2415, +2413, +2412, +2411, +2410, +2409, +2408, +2407, +2406, +2405, +2404, +2402, +2401, +2400, +2399, +2398, +2397, +2396, +2395, +2394, +2393, +2391, +2390, +2389, +2388, +2387, +2386, +2385, +2384, +2383, +2382, +2379, +2378, +2377, +2376, +2375, +2374, +2373, +2372, +2371, +2370, +2368, +2367, +2366, +2365, +2364, +2363, +2362, +2361, +2360, +2359, +2357, +2356, +2355, +2354, +2353, +2352, +2351, +2350, +2349, +2348, +2346, +2345, +2344, +2343, +2342, +2341, +2340, +2339, +2338, +2337, +2335, +2334, +2333, +2332, +2331, +2330, +2329, +2328, +2327, +2326, +2324, +2323, +2322, +2321, +2320, +2319, +2318, +2317, +2316, +2315, +2313, +2312, +2311, +2310, +2309, +2308, +2307, +2306, +2305, +2304, +2302, +2301, +2300, +2299, +2298, +2297, +2296, +2295, +2294, +2293, +2291, +2290, +2289, +2288, +2287, +2286, +2285, +2284, +2283, +2282, +2280, +2279, +2278, +2277, +2276, +2275, +2274, +2273, +2272, +2271, +2268, +2267, +2266, +2265, +2264, +2263, +2262, +2261, +2260, +2259, +2257, +2256, +2255, +2254, +2253, +2252, +2251, +2250, +2249, +2248, +2246, +2245, +2244, +2243, +2242, +2241, +2240, +2239, +2238, +2237, +2235, +2234, +2233, +2232, +2231, +2230, +2229, +2228, +2227, +2226, +2224, +2223, +2222, +2221, +2220, +2219, +2218, +2217, +2216, +2215, +2213, +2212, +2211, +2210, +2209, +2208, +2207, +2206, +2205, +2204, +2202, +2201, +2200, +2199, +2198, +2197, +2196, +2195, +2194, +2193, +2191, +2190, +2189, +2188, +2187, +2186, +2185, +2184, +2183, +2182, +2180, +2179, +2178, +2177, +2176, +2175, +2174, +2173, +2172, +2171, +2169, +2168, +2167, +2166, +2165, +2164, +2163, +2162, +2161, +2160, +2157, +2156, +2155, +2154, +2153, +2152, +2151, +2150, +2149, +2148, +2146, +2145, +2144, +2143, +2142, +2141, +2140, +2139, +2138, +2137, +2135, +2134, +2133, +2132, +2131, +2130, +2129, +2128, +2127, +2126, +2124, +2123, +2122, +2121, +2120, +2119, +2118, +2117, +2116, +2115, +2113, +2112, +2111, +2110, +2109, +2108, +2107, +2106, +2105, +2104, +2102, +2101, +2100, +2099, +2098, +2097, +2096, +2095, +2094, +2093, +2091, +2090, +2089, +2088, +2087, +2086, +2085, +2084, +2083, +2082, +2080, +2079, +2078, +2077, +2076, +2075, +2074, +2073, +2072, +2071, +2069, +2068, +2067, +2066, +2065, +2064, +2063, +2062, +2061, +2060, +2058, +2057, +2056, +2055, +2054, +2053, +2052, +2051, +2050, +2049, +2046, +2045, +2044, +2043, +2042, +2041, +2040, +2039, +2038, +2037, +2035, +2034, +2033, +2032, +2031, +2030, +2029, +2028, +2027, +2026, +2024, +2023, +2022, +2021, +2020, +2019, +2018, +2017, +2016, +2015, +2013, +2012, +2011, +2010, +2009, +2008, +2007, +2006, +2005, +2004, +2002, +2001, +2000, +1999, +1998, +1997, +1996, +1995, +1994, +1993, +1991, +1990, +1989, +1988, +1987, +1986, +1985, +1984, +1983, +1982, +1980, +1979, +1978, +1977, +1976, +1975, +1974, +1973, +1972, +1971, +1969, +1968, +1967, +1966, +1965, +1964, +1963, +1962, +1961, +1960, +1958, +1957, +1956, +1955, +1954, +1953, +1952, +1951, +1950, +1949, +1947, +1946, +1945, +1944, +1943, +1942, +1941, +1940, +1939, +1938, +2767, +2766, +2765, +2764, +2763, +2762, +2761, +2760, +2759, +2758, +2756, +2755, +2754, +2753, +2752, +2751, +2750, +2749, +2748, +2747, +2745, +2744, +2743, +2742, +2741, +2740, +2739, +2738, +2737, +2736, +2734, +2733, +2732, +2731, +2730, +2729, +2728, +2727, +2726, +2725, +2723, +2722, +2721, +2720, +2719, +2718, +2717, +2716, +2715, +2714, +2774, +2773, +2772, +2771, +2770, +2769, +] + +_charnames_110592 = [ +13689, +11311, +11050, +11049, +11048, +11047, +11045, +11044, +11043, +11042, +11040, +11039, +11038, +11037, +11036, +11033, +11032, +11031, +11030, +11029, +11054, +11053, +11052, +10714, +10725, +10724, +10723, +10722, +10721, +10720, +10719, +10718, +10716, +10715, +10717, +10734, +10733, +10732, +10731, +10730, +10729, +10728, +10727, +10742, +10741, +10740, +10739, +10738, +10737, +10736, +10749, +10748, +10747, +10746, +10745, +10744, +10754, +10753, +10752, +10751, +10815, +10814, +10813, +10812, +10811, +10810, +10809, +10808, +10830, +10829, +10828, +10827, +10826, +10825, +10806, +10805, +10804, +10803, +10802, +10801, +10800, +10799, +10836, +10835, +10834, +10833, +10832, +10823, +10822, +10821, +10820, +10819, +10818, +10817, +10915, +10914, +10913, +10912, +10904, +10903, +10902, +10901, +10900, +10899, +10898, +10910, +10909, +10908, +10907, +10906, +10888, +10887, +10886, +10885, +10884, +10883, +10882, +10881, +10880, +10896, +10895, +10894, +10893, +10892, +10891, +10890, +10847, +10846, +10845, +10844, +10843, +10842, +10841, +10840, +10839, +10856, +10855, +10854, +10853, +10852, +10851, +10850, +10849, +10874, +10873, +10872, +10864, +10863, +10862, +10861, +10860, +10859, +10858, +10870, +10869, +10868, +10867, +10866, +10757, +10767, +10766, +10765, +10764, +10763, +10762, +10761, +10760, +10759, +10758, +10784, +10783, +10782, +10781, +10780, +10779, +10778, +10796, +10795, +10794, +10792, +10791, +10790, +10789, +10788, +10787, +10786, +10776, +10775, +10774, +10773, +10772, +10771, +10770, +10769, +10965, +10964, +10963, +10962, +10961, +10960, +10959, +10957, +10956, +10955, +10954, +10953, +10952, +10951, +10977, +10976, +10975, +10974, +10981, +10980, +10979, +10972, +10971, +10970, +10969, +10968, +10967, +11022, +11021, +11020, +11019, +11018, +11017, +11027, +11026, +11025, +11024, +11015, +11014, +11013, +11012, +11011, +11010, +10948, +10947, +10946, +10945, +10924, +10923, +10922, +10921, +10920, +10919, +10918, +10931, +10930, +10929, +10928, +10927, +10926, +10943, +10942, +10941, +10940, +10938, +10937, +10936, +10935, +10934, +10933, +11002, +11001, +11000, +10999, +10998, +10996, +10995, +10994, +10993, +10992, +11007, +11006, +11005, +11004, +10990, +10989, +10988, +10987, +10986, +10985, +10984, +10877, +10876, +] + +_charnames_110960 = [ +10389, +10388, +10387, +10386, +10385, +10384, +10383, +10382, +10381, +10380, +10379, +10378, +10377, +10376, +10375, +10374, +10372, +10371, +10370, +10369, +10368, +10367, +10366, +10365, +10364, +10363, +10362, +10361, +10360, +10359, +10358, +10357, +10355, +10354, +10353, +10352, +10351, +10350, +10349, +10348, +10347, +10346, +10345, +10344, +10343, +10342, +10341, +10340, +10338, +10337, +10336, +10335, +10334, +10333, +10332, +10331, +10330, +10329, +10328, +10327, +10326, +10325, +10324, +10323, +10321, +10320, +10319, +10318, +10317, +10316, +10315, +10314, +10313, +10312, +10311, +10310, +10309, +10308, +10307, +10306, +10304, +10303, +10302, +10301, +10300, +10299, +10298, +10297, +10296, +10295, +10294, +10293, +10292, +10291, +10290, +10289, +10287, +10286, +10285, +10284, +10283, +10282, +10281, +10280, +10279, +10278, +10277, +10276, +10275, +10274, +10273, +10272, +10270, +10269, +10268, +10267, +10266, +10265, +10264, +10263, +10262, +10261, +10260, +10259, +10258, +10257, +10256, +10255, +10253, +10252, +10251, +10250, +10249, +10248, +10247, +10246, +10245, +10244, +10243, +10242, +10241, +10240, +10239, +10238, +10222, +10221, +10220, +10219, +10218, +10217, +10216, +10215, +10214, +10213, +10212, +10211, +10210, +10209, +10208, +10207, +10205, +10204, +10203, +10202, +10201, +10200, +10199, +10198, +10197, +10196, +10195, +10194, +10193, +10192, +10191, +10190, +10188, +10187, +10186, +10185, +10184, +10183, +10182, +10181, +10180, +10179, +10178, +10177, +10176, +10175, +10174, +10173, +10171, +10170, +10169, +10168, +10167, +10166, +10165, +10164, +10163, +10162, +10161, +10160, +10159, +10158, +10157, +10156, +10154, +10153, +10152, +10151, +10150, +10149, +10148, +10147, +10146, +10145, +10144, +10143, +10142, +10141, +10140, +10139, +10137, +10136, +10135, +10134, +10133, +10132, +10131, +10130, +10129, +10128, +10127, +10126, +10125, +10124, +10123, +10122, +10120, +10119, +10118, +10117, +10116, +10115, +10114, +10113, +10112, +10111, +10110, +10109, +10108, +10107, +10106, +10105, +10103, +10102, +10101, +10100, +10099, +10098, +10097, +10096, +10095, +10094, +10093, +10092, +10091, +10090, +10089, +10088, +10086, +10085, +10084, +10083, +10082, +10081, +10080, +10079, +10078, +10077, +10076, +10075, +10074, +10073, +10072, +10071, +10069, +10068, +10067, +10066, +10065, +10064, +10063, +10062, +10061, +10060, +10059, +10058, +10057, +10056, +10055, +10054, +10052, +10051, +10050, +10049, +10048, +10047, +10046, +10045, +10044, +10043, +10042, +10041, +10040, +10039, +10038, +10037, +10035, +10034, +10033, +10032, +10031, +10030, +10029, +10028, +10027, +10026, +10025, +10024, +10023, +10022, +10021, +10020, +10018, +10017, +10016, +10015, +10014, +10013, +10012, +10011, +10010, +10009, +10008, +10007, +10006, +10005, +10004, +10003, +10001, +10000, +9999, +9998, +9997, +9996, +9995, +9994, +9993, +9992, +9991, +9990, +9989, +9988, +9987, +9986, +9984, +9983, +9982, +9981, +9980, +9979, +9978, +9977, +9976, +9975, +9974, +9973, +9972, +9971, +9970, +9969, +10235, +10234, +10233, +10232, +10231, +10230, +10229, +10228, +10227, +10226, +10225, +10224, +] + +_charnames_113664 = [ +12486, +12480, +12459, +12454, +12490, +12469, +12464, +12495, +12477, +12482, +12488, +12433, +12463, +12479, +12491, +12472, +12438, +12458, +12401, +12478, +12473, +12400, +12487, +12468, +12437, +12444, +12404, +12415, +12376, +12446, +12411, +12423, +12386, +12448, +12413, +12417, +12418, +12378, +12379, +12449, +12414, +12419, +12388, +12447, +12412, +12424, +12387, +12420, +12421, +12422, +12380, +12381, +12382, +12383, +12456, +12457, +12425, +12429, +12432, +12389, +12390, +12471, +12489, +12384, +12385, +12492, +12397, +12443, +12439, +12493, +12484, +12474, +12485, +12403, +12451, +12476, +12394, +12436, +12395, +12467, +12494, +12450, +12475, +12481, +12453, +12466, +12435, +12452, +12399, +12442, +12440, +12441, +12431, +12426, +12428, +12430, +12427, +12406, +12407, +12408, +12409, +12461, +12462, +12393, +12402, +12398, +12483, +-1, +-1, +-1, +-1, +-1, +12512, +12536, +12537, +12500, +12535, +12515, +12530, +12531, +12527, +12529, +12533, +12532, +12528, +-1, +-1, +-1, +12524, +12520, +12521, +12517, +12522, +12523, +12518, +12519, +12514, +] + +_charnames_113808 = [ +12506, +12508, +12509, +12502, +12510, +12511, +12503, +12507, +12499, +12505, +-1, +-1, +12539, +12538, +12541, +12540, +1566, +1568, +1567, +1565, +] + +_charnames_119262 = [ +4982, +4972, +4978, +4980, +4979, +4981, +4975, +4974, +4971, +4970, +4977, +] + +_charnames_119520 = [ +4522, +4523, +4499, +4502, +4511, +4514, +4506, +4508, +4517, +4520, +4504, +4519, +4500, +4503, +4512, +4515, +4507, +4509, +4518, +4521, +] + +_charnames_119666 = [ +14562, +14557, +14558, +14560, +14561, +3210, +3211, +] + +_charnames_120832 = [ +10, +242, +223, +362, +276, +331, +101, +254, +111, +100, +103, +89, +93, +253, +12, +244, +53, +50, +51, +94, +91, +15, +28, +27, +25, +23, +30, +247, +148, +102, +33, +249, +56, +54, +44, +52, +96, +97, +92, +55, +36, +38, +40, +41, +115, +18, +20, +21, +140, +81, +24, +31, +22, +26, +133, +76, +131, +132, +87, +88, +78, +37, +43, +42, +136, +137, +138, +82, +189, +194, +193, +191, +192, +272, +176, +311, +180, +203, +187, +205, +188, +206, +186, +231, +232, +312, +363, +182, +184, +185, +177, +212, +201, +209, +207, +211, +210, +200, +196, +197, +198, +199, +263, +266, +270, +267, +328, +315, +217, +215, +220, +229, +222, +233, +221, +230, +237, +235, +240, +354, +357, +360, +358, +291, +295, +274, +313, +294, +303, +296, +314, +304, +305, +329, +46, +250, +286, +340, +297, +49, +48, +287, +150, +153, +154, +155, +161, +110, +260, +361, +346, +162, +163, +157, +158, +301, +160, +300, +345, +344, +159, +261, +299, +343, +57, +251, +288, +306, +341, +32, +248, +174, +307, +353, +169, +171, +172, +262, +359, +352, +165, +168, +167, +173, +170, +327, +99, +252, +239, +325, +326, +324, +227, +289, +338, +337, +147, +308, +141, +258, +145, +142, +322, +139, +146, +144, +256, +238, +234, +309, +349, +350, +347, +257, +268, +269, +320, +321, +318, +290, +59, +282, +62, +63, +64, +67, +68, +66, +84, +85, +79, +75, +74, +271, +73, +77, +225, +226, +283, +284, +278, +281, +335, +336, +333, +104, +125, +119, +120, +121, +126, +114, +117, +116, +108, +123, +109, +112, +124, +8, +175, +733, +734, +735, +982, +983, +984, +918, +919, +920, +968, +969, +970, +803, +804, +805, +927, +928, +914, +910, +915, +911, +912, +886, +882, +887, +883, +884, +916, +650, +649, +651, +653, +648, +647, +652, +499, +619, +442, +443, +440, +441, +444, +479, +478, +476, +477, +415, +474, +473, +471, +472, +460, +461, +462, +407, +409, +410, +408, +412, +413, +414, +456, +457, +458, +488, +489, +490, +492, +493, +494, +697, +698, +699, +701, +702, +703, +708, +706, +707, +705, +641, +642, +639, +640, +636, +637, +634, +635, +631, +632, +629, +630, +626, +627, +624, +625, +576, +577, +574, +575, +578, +600, +599, +597, +598, +520, +595, +594, +593, +592, +606, +517, +518, +519, +521, +603, +604, +605, +608, +609, +610, +612, +613, +614, +716, +717, +718, +712, +713, +714, +719, +396, +397, +394, +395, +388, +389, +386, +387, +400, +401, +467, +468, +469, +447, +452, +453, +448, +424, +425, +426, +420, +421, +422, +402, +404, +405, +759, +763, +771, +445, +391, +465, +450, +432, +761, +765, +769, +392, +466, +451, +433, +762, +766, +770, +428, +429, +430, +509, +510, +566, +569, +565, +568, +549, +552, +550, +553, +529, +530, +776, +780, +784, +506, +507, +561, +562, +559, +560, +542, +545, +543, +546, +526, +527, +775, +779, +783, +513, +514, +511, +512, +515, +570, +554, +532, +533, +534, +773, +777, +781, +579, +482, +485, +483, +486, +582, +585, +588, +583, +586, +589, +435, +436, +536, +537, +497, +498, +617, +618, +937, +938, +942, +935, +939, +940, +933, +934, +943, +941, +365, +377, +371, +370, +374, +372, +375, +376, +904, +902, +903, +838, +839, +840, +947, +949, +948, +946, +899, +900, +898, +831, +830, +832, +843, +844, +828, +826, +829, +825, +845, +834, +836, +835, +810, +812, +813, +818, +820, +821, +815, +822, +816, +961, +962, +960, +754, +752, +753, +847, +955, +956, +953, +954, +979, +976, +980, +977, +972, +973, +669, +670, +671, +677, +679, +680, +685, +687, +688, +666, +665, +664, +660, +663, +662, +656, +659, +658, +681, +684, +683, +673, +676, +675, +864, +863, +862, +672, +690, +691, +728, +730, +724, +723, +731, +729, +726, +727, +742, +749, +745, +746, +747, +748, +750, +500, +620, +957, +364, +846, +923, +924, +985, +888, +925, +738, +739, +740, +986, +859, +858, +857, +856, +855, +854, +853, +852, +896, +875, +876, +868, +870, +873, +869, +871, +872, +964, +905, +929, +965, +987, +] + +_charnames_121499 = [ +895, +894, +893, +892, +891, +-1, +801, +800, +799, +798, +797, +796, +795, +794, +793, +792, +791, +790, +789, +788, +787, +] + +_charnames_122880 = [ +8655, +8641, +8643, +8653, +8638, +8612, +8629, +-1, +8630, +8620, +8621, +8616, +8639, +8651, +8650, +8649, +8648, +8647, +8646, +8645, +8627, +8632, +8644, +8635, +8652, +-1, +-1, +8624, +8633, +8654, +8625, +8610, +8611, +8615, +-1, +8613, +8626, +-1, +8614, +8618, +8642, +8619, +8636, +] + +_charnames_124928 = [ +3599, +3598, +3597, +3529, +3496, +3517, +3548, +3613, +3596, +3595, +3594, +3671, +3680, +3684, +3551, +3704, +3652, +3533, +3547, +3657, +3593, +3592, +3591, +3536, +3497, +3640, +3602, +3589, +3588, +3587, +3644, +3494, +3696, +3658, +3586, +3585, +3584, +3630, +3699, +3628, +3648, +3659, +3665, +3661, +3703, +3614, +3580, +3578, +3577, +3631, +3682, +3660, +3514, +3702, +3573, +3572, +3571, +3508, +3520, +3541, +3641, +3688, +3583, +3582, +3581, +3503, +3611, +3610, +3576, +3575, +3574, +3500, +3540, +3695, +3525, +3570, +3569, +3567, +3637, +3685, +3633, +3531, +3617, +3566, +3565, +3564, +3690, +3512, +3654, +3676, +3563, +3562, +3561, +3515, +3518, +3663, +3504, +3701, +3698, +3560, +3559, +3558, +3681, +3624, +3616, +3555, +3605, +3556, +3495, +3554, +3655, +3509, +3669, +3542, +3666, +3505, +3543, +3705, +3550, +3501, +3553, +3510, +3683, +3649, +3638, +3677, +3635, +3670, +3506, +3693, +3608, +3639, +3687, +3625, +3708, +3627, +3626, +3607, +3538, +3615, +3526, +3492, +3545, +3511, +3544, +3697, +3528, +3650, +3532, +3675, +3549, +3603, +3521, +3620, +3618, +3604, +3632, +3694, +3653, +3664, +3499, +3519, +3552, +3691, +3686, +3636, +3673, +3539, +3647, +3498, +3692, +3522, +3523, +3621, +3674, +3668, +3672, +3707, +3679, +3527, +3530, +3642, +3706, +3646, +3662, +3609, +3606, +3643, +3619, +3507, +3651, +3516, +3629, +3537, +3622, +3493, +3534, +-1, +-1, +3719, +3711, +3712, +3717, +3718, +3714, +3715, +3721, +3720, +3728, +3726, +3731, +3729, +3727, +3732, +3733, +] + +_charnames_125184 = [ +6323, +6302, +6316, +6315, +6305, +6295, +6313, +6304, +6311, +6321, +6320, +6318, +6314, +6301, +6292, +6307, +6285, +6290, +6293, +6309, +6317, +6322, +6319, +6312, +6299, +6284, +6310, +6286, +6308, +6289, +6298, +6306, +6288, +6296, +6366, +6345, +6359, +6358, +6348, +6338, +6356, +6347, +6354, +6364, +6363, +6361, +6357, +6344, +6335, +6350, +6328, +6333, +6336, +6352, +6360, +6365, +6362, +6355, +6342, +6327, +6353, +6329, +6351, +6332, +6341, +6349, +6331, +6339, +6390, +6387, +6385, +6389, +6324, +6386, +6388, +-1, +-1, +-1, +-1, +-1, +6377, +6378, +6369, +6370, +6375, +6376, +6372, +6373, +6380, +6379, +-1, +-1, +-1, +-1, +6383, +6382, +] + +_charnames_126065 = [ +14508, +14440, +14447, +14470, +14477, +14456, +14462, +14502, +14496, +14453, +14444, +14451, +14474, +14481, +14457, +14463, +14503, +14497, +14511, +14443, +14450, +14473, +14480, +14461, +14467, +14507, +14501, +14510, +14442, +14449, +14472, +14479, +14460, +14466, +14506, +14500, +14454, +14445, +14452, +14475, +14482, +14458, +14464, +14504, +14498, +14517, +14518, +14528, +14519, +14520, +14493, +14485, +14486, +14491, +14492, +14488, +14489, +14495, +14494, +14527, +14523, +14524, +14525, +14526, +14516, +14514, +14515, +14529, +] + +_charnames_126464 = [ +5940, +5952, +5948, +5806, +-1, +5943, +5931, +5949, +5925, +5942, +5938, +5844, +5947, +5946, +5877, +5941, +5951, +5878, +5945, +5944, +5876, +5929, +5927, +5937, +5928, +5807, +5932, +5950, +5804, +5802, +5803, +5801, +-1, +5902, +5898, +-1, +5891, +-1, +-1, +5892, +-1, +5893, +5889, +5897, +5896, +5895, +5882, +5903, +5900, +5883, +5894, +-1, +5881, +5886, +5885, +5888, +-1, +5901, +-1, +5899, +-1, +-1, +-1, +-1, +-1, +-1, +5921, +-1, +-1, +-1, +-1, +5922, +-1, +5916, +-1, +5919, +-1, +5918, +5909, +5924, +-1, +5910, +5917, +-1, +5908, +-1, +-1, +5920, +-1, +5915, +-1, +5923, +-1, +5914, +-1, +5913, +-1, +5874, +5871, +-1, +5864, +-1, +-1, +5865, +5850, +5867, +5862, +-1, +5870, +5869, +5853, +5875, +5873, +5854, +5868, +-1, +5852, +5849, +5848, +5861, +-1, +5859, +5866, +5872, +5858, +-1, +5857, +-1, +5830, +5843, +5840, +5827, +5824, +5833, +5821, +5825, +5815, +5832, +-1, +5838, +5837, +5836, +5818, +5831, +5842, +5819, +5835, +5834, +5817, +5814, +5812, +5839, +5813, +5828, +5822, +5841, +-1, +-1, +-1, +-1, +-1, +5798, +5794, +5784, +-1, +5787, +5781, +5795, +5775, +5786, +-1, +5792, +5791, +5790, +5778, +5799, +5797, +5779, +5789, +5788, +5777, +5774, +5772, +5793, +5773, +5785, +5782, +5796, +] + +_charnames_127136 = [ +11773, +11767, +11697, +11702, +11714, +11720, +11726, +11731, +11762, +11752, +11707, +11757, +11737, +11747, +11742, +-1, +-1, +11768, +11698, +11703, +11715, +11721, +11727, +11732, +11763, +11753, +11708, +11758, +11738, +11748, +11743, +11775, +-1, +11769, +11699, +11704, +11716, +11722, +11728, +11733, +11764, +11754, +11709, +11759, +11739, +11749, +11744, +11772, +-1, +11770, +11700, +11705, +11717, +11723, +11729, +11734, +11765, +11755, +11710, +11760, +11740, +11750, +11745, +11774, +11718, +11675, +11686, +11695, +11694, +11693, +11692, +11691, +11690, +11689, +11685, +11684, +11683, +11682, +11681, +11680, +11679, +11678, +11677, +11676, +11688, +11687, +] + +_charnames_127279 = [ +8810, +1618, +-1, +1617, +1616, +1615, +1614, +1613, +1612, +1611, +1610, +1609, +1608, +1607, +-1, +1606, +-1, +1605, +1604, +-1, +1603, +1602, +1601, +-1, +1600, +1599, +1598, +-1, +-1, +-1, +-1, +-1, +1678, +10557, +10556, +10555, +10554, +10553, +10552, +10551, +-1, +10550, +10549, +10548, +10547, +10546, +10545, +10544, +-1, +10543, +10542, +10541, +10540, +10539, +10538, +10537, +10536, +10535, +10534, +14188, +14187, +-1, +-1, +-1, +-1, +10583, +10582, +10581, +10580, +10579, +10578, +10577, +10576, +10575, +-1, +10574, +-1, +-1, +10573, +10572, +-1, +10571, +10570, +10569, +10568, +10567, +10566, +10565, +10564, +10563, +10562, +-1, +-1, +-1, +-1, +10586, +10584, +-1, +1642, +1641, +1660, +1679, +1674, +1673, +1671, +1647, +1667, +1664, +1654, +1646, +1652, +1661, +1680, +1662, +1645, +1653, +1648, +1670, +1619, +1658, +1657, +1656, +1624, +1649, +1668, +1665, +] + +_charnames_127462 = [ +14117, +14116, +14115, +14114, +14113, +14112, +14111, +14110, +14109, +14108, +14107, +14106, +14105, +14104, +14103, +14102, +14101, +14100, +14099, +14098, +14097, +14096, +14095, +14094, +14093, +14092, +-1, +1677, +1676, +] + +_charnames_127538 = [ +1629, +1628, +1638, +1635, +1633, +1634, +1630, +1639, +1637, +1640, +] + +_charnames_127744 = [ +9060, +14662, +9004, +10708, +1711, +1710, +9103, +1712, +14196, +7652, +13847, +13101, +4718, +14405, +14404, +14403, +13425, +10525, +13858, +14632, +13857, +14699, +13860, +9832, +13861, +9080, +10524, +14631, +9831, +14698, +1714, +13423, +1579, +3382, +7856, +13927, +13931, +13929, +13930, +9010, +9009, +9011, +9008, +14661, +13918, +11291, +3216, +7971, +8486, +1887, +14427, +12744, +11636, +8947, +11290, +3434, +8481, +14172, +11322, +1713, +7893, +14408, +14407, +11135, +14657, +4531, +14617, +9921, +4987, +3469, +6479, +13205, +4067, +13851, +2776, +9924, +7479, +11921, +14146, +13220, +11853, +11852, +8482, +1749, +11261, +1880, +4068, +11869, +14087, +14088, +8827, +8362, +1754, +1793, +7663, +14675, +14178, +12773, +12370, +1717, +14677, +14646, +1421, +1560, +14565, +12689, +8826, +8600, +8920, +9952, +8373, +11299, +1574, +7945, +11875, +8825, +14651, +3453, +1864, +13920, +8835, +3404, +7960, +9022, +7484, +14652, +7928, +11886, +14070, +13992, +7976, +14912, +8601, +14615, +14623, +14624, +7458, +11644, +8815, +2777, +9068, +11922, +14910, +8932, +13917, +4897, +1905, +13206, +11129, +7925, +4719, +14148, +4985, +1746, +9922, +8818, +7953, +7952, +14642, +6392, +8933, +14694, +14165, +14645, +4708, +4908, +9104, +11134, +6109, +3463, +9101, +3350, +9016, +11843, +13092, +12761, +1884, +7979, +13433, +7916, +14684, +4986, +4963, +1862, +13335, +4984, +3408, +13095, +4983, +14222, +3455, +1927, +7443, +8487, +1910, +14223, +1723, +1780, +3405, +11280, +6491, +14231, +1920, +13982, +13419, +14199, +14200, +9078, +13100, +14648, +14564, +3213, +1911, +8942, +7955, +7972, +11285, +9102, +12745, +9017, +12737, +12738, +10648, +1742, +11284, +11286, +12369, +14907, +14422, +11300, +7473, +6478, +11292, +9949, +8822, +1904, +12746, +14611, +14566, +14911, +14423, +13961, +7881, +13853, +13855, +14173, +7845, +9834, +7496, +7917, +6490, +14354, +14353, +14352, +14351, +14350, +14206, +4885, +12363, +13850, +8828, +3347, +9923, +14204, +8934, +12782, +9071, +13965, +1914, +1913, +11278, +14207, +13416, +1591, +4875, +14175, +8597, +12545, +11916, +7933, +14299, +12361, +1784, +7973, +5749, +11298, +9836, +14644, +3403, +7892, +3432, +11256, +7483, +14668, +7977, +11847, +13733, +11889, +12781, +7470, +12698, +4886, +8829, +3348, +14205, +8935, +12783, +1779, +11281, +4876, +12625, +11919, +14669, +11260, +13979, +7950, +11663, +11918, +11667, +8596, +14411, +14410, +14400, +10695, +4887, +3468, +13957, +13940, +13946, +13959, +14647, +13854, +12367, +3379, +3380, +9015, +12324, +9069, +13971, +14412, +10593, +3483, +14916, +12785, +13731, +7985, +13972, +11930, +11218, +11870, +4184, +6499, +11316, +13970, +13973, +14660, +7966, +7965, +7922, +13428, +4070, +13968, +14616, +4182, +3477, +3475, +11884, +13974, +7653, +11832, +4177, +4176, +12219, +12218, +7480, +8820, +11906, +14908, +14909, +13432, +7485, +14397, +6276, +14567, +1926, +14546, +13336, +12774, +9545, +10651, +14610, +11264, +7490, +1842, +11924, +13729, +9948, +14084, +13413, +13722, +7924, +8831, +13987, +7954, +7658, +3478, +1791, +13235, +11131, +7889, +13218, +14919, +11931, +11130, +14136, +11132, +12760, +14298, +5762, +7930, +1870, +8836, +1794, +12779, +12771, +11925, +14687, +12750, +1774, +3381, +13953, +11325, +4873, +8363, +11101, +9081, +7475, +7478, +7477, +7476, +4872, +8587, +1895, +11841, +7654, +4715, +14685, +12327, +12792, +14638, +12322, +11651, +11653, +8945, +3452, +8926, +8586, +8588, +7489, +9023, +11933, +14162, +11668, +1750, +3395, +7920, +9926, +10687, +10688, +9006, +12325, +13219, +7890, +12342, +7921, +10649, +1898, +4066, +3439, +11655, +14613, +1861, +11935, +8485, +12365, +14554, +11669, +14431, +14553, +14383, +9003, +9002, +12318, +12319, +11878, +11879, +10530, +4900, +4902, +13096, +4903, +10683, +5758, +8940, +8941, +13093, +3442, +14202, +13094, +14641, +11888, +11914, +3481, +8995, +8996, +8999, +5757, +9941, +11319, +1769, +1765, +1768, +1767, +7395, +14297, +9917, +14068, +9946, +9005, +13701, +9942, +12323, +7957, +7959, +7919, +9519, +14203, +7468, +14380, +12351, +1426, +3464, +10682, +13717, +14536, +14534, +14538, +14537, +14535, +14621, +14296, +13991, +11258, +10393, +11302, +11926, +4707, +3443, +9076, +1187, +14906, +3399, +7830, +13936, +9827, +9826, +9828, +9825, +1819, +1820, +14865, +12677, +14863, +12676, +9937, +14874, +9091, +9066, +9065, +10694, +10693, +1846, +13947, +11080, +9110, +12366, +12695, +13700, +4906, +1845, +3735, +7915, +8989, +8956, +8962, +8976, +8979, +8969, +8972, +8986, +8992, +8965, +8983, +8959, +8988, +8955, +8961, +8975, +8978, +8968, +8971, +8985, +8991, +8964, +8982, +8958, +14053, +14056, +14055, +7968, +7969, +14085, +7918, +8921, +4183, +7834, +10676, +11296, +4180, +1874, +12776, +1787, +1788, +14914, +4181, +9903, +3440, +14059, +13958, +7875, +3441, +9018, +7469, +1741, +14382, +14681, +11848, +9518, +7880, +9932, +9936, +9934, +9933, +9935, +9907, +3426, +14185, +14126, +14122, +14123, +14127, +14128, +14184, +13939, +1118, +1117, +1123, +1122, +7863, +7844, +1116, +1119, +1121, +1124, +7869, +7852, +7883, +12736, +13720, +3361, +11903, +11890, +7884, +13950, +1420, +3215, +13921, +12350, +3479, +3362, +3389, +12165, +11262, +1900, +11904, +14614, +12328, +12692, +12693, +12694, +14672, +14671, +14673, +7887, +14664, +12321, +8927, +8928, +14639, +14361, +14363, +14364, +10686, +10690, +10691, +14367, +14365, +14366, +12690, +11648, +11654, +13862, +1785, +1786, +12735, +4714, +4530, +12353, +8997, +8917, +14552, +12743, +8759, +12216, +14166, +11652, +1759, +12768, +9544, +1770, +3358, +3357, +3356, +3355, +9909, +14057, +3476, +3359, +9908, +14061, +9911, +14062, +4899, +9542, +9541, +7453, +7457, +7454, +7456, +7451, +9540, +7452, +13978, +4884, +3470, +1739, +1189, +4907, +13223, +13227, +14588, +1805, +1808, +1809, +1807, +1813, +1811, +13919, +1800, +14607, +14149, +1812, +1804, +1817, +10589, +14398, +14882, +14597, +11846, +8813, +8814, +13724, +14608, +13726, +13727, +14582, +14584, +14585, +12753, +13977, +5761, +11867, +9074, +11842, +14601, +12754, +14667, +5760, +14696, +13985, +1873, +3329, +13230, +9950, +14576, +11324, +14579, +14606, +6484, +14686, +1871, +12751, +14604, +14594, +13229, +8938, +1815, +1816, +8937, +13728, +11868, +9075, +13986, +1879, +1878, +14873, +14599, +14600, +14581, +11840, +1888, +11133, +1771, +11263, +11836, +11837, +11829, +11831, +10659, +1405, +10667, +1413, +3424, +3415, +3425, +3416, +10658, +1404, +10666, +1412, +11091, +11060, +11094, +11063, +10660, +1406, +10668, +1414, +11092, +11061, +11095, +11064, +11294, +11295, +1423, +1424, +9881, +14857, +14040, +12666, +1899, +11071, +9543, +11079, +11088, +1918, +1852, +1853, +1854, +11125, +1855, +11069, +13058, +13067, +8488, +14135, +14176, +11136, +1755, +14195, +11314, +11315, +3391, +4064, +9537, +1740, +3385, +3386, +7963, +12348, +3406, +7967, +4716, +6492, +14627, +11882, +12346, +3214, +12345, +6477, +12349, +14138, +12740, +6110, +3388, +4877, +4881, +1716, +4882, +6500, +1585, +14174, +1773, +11276, +13077, +8821, +11883, +3396, +12697, +10684, +1822, +10681, +11932, +12699, +11874, +10696, +7983, +10680, +7982, +4883, +11856, +10677, +8595, +3734, +13975, +14147, +7482, +3471, +13849, +1578, +7393, +7394, +11661, +8372, +7493, +9910, +3397, +11913, +9096, +7923, +13429, +8832, +1872, +1577, +7958, +7961, +11776, +12362, +1576, +1744, +11656, +] + +_charnames_128736 = [ +11259, +1586, +12368, +4893, +14194, +4892, +14866, +14867, +14864, +1821, +10672, +6494, +6495, +-1, +-1, +-1, +1860, +12347, +12762, +11659, +1903, +4891, +8922, +1875, +14680, +1928, +-1, +-1, +-1, +-1, +-1, +-1, +6260, +6156, +6273, +6274, +6258, +6145, +6143, +6144, +6141, +6142, +6206, +6209, +6208, +6123, +6223, +6202, +6233, +6236, +6235, +6176, +6125, +6263, +6211, +6212, +6191, +6192, +6270, +6136, +6253, +6254, +6168, +6187, +6174, +6255, +6120, +6166, +6167, +6175, +6127, +6118, +6213, +6227, +6267, +6154, +6121, +6128, +6119, +6210, +6185, +6186, +6179, +6183, +6182, +6181, +6147, +6148, +6238, +6129, +6153, +6188, +6189, +6151, +6203, +6228, +6229, +6261, +6194, +6197, +6196, +6149, +6272, +6134, +6226, +6269, +6257, +6216, +6171, +6230, +6170, +6137, +6172, +6231, +6133, +6266, +6135, +6271, +6242, +6152, +6218, +6201, +6217, +6155, +6131, +6132, +6122, +6222, +6250, +6248, +6249, +6221, +6220, +6159, +6164, +6163, +6162, +6161, +6150, +6200, +6199, +6190, +6241, +6264, +6251, +6237, +6245, +6244, +] + +_charnames_128896 = [ +7861, +7866, +7842, +7849, +7833, +4028, +7898, +11110, +13063, +14391, +13964, +14161, +7872, +7832, +9536, +4026, +7897, +11109, +13062, +14390, +13934, +13935, +1682, +7874, +7878, +7804, +13942, +13943, +12759, +7873, +7877, +7803, +13945, +3375, +9538, +4027, +7902, +13070, +13068, +14395, +3374, +9535, +4014, +7901, +11070, +13060, +14394, +9528, +4019, +7903, +11121, +13069, +14396, +9534, +4012, +7900, +11066, +13059, +14393, +9539, +4024, +7904, +11107, +13065, +9532, +4022, +3360, +4021, +9525, +4018, +14656, +4017, +14133, +9529, +11122, +4013, +11067, +1188, +4025, +11106, +13066, +11105, +9531, +11116, +11115, +9098, +10558, +9099, +10559, +] + +_charnames_129024 = [ +9867, +14842, +14024, +12653, +9870, +14845, +14027, +12656, +9871, +14846, +14028, +12657, +-1, +-1, +-1, +-1, +9868, +14843, +14025, +12654, +9872, +14847, +14029, +12658, +11078, +11113, +11119, +11100, +11077, +11112, +11118, +11099, +9854, +14829, +14011, +12639, +9855, +14830, +14012, +12640, +9857, +14833, +14014, +12643, +9856, +14831, +14013, +12641, +9853, +14828, +14010, +12638, +9888, +14858, +14047, +12667, +9878, +14852, +14037, +12660, +9891, +14859, +14050, +12668, +9884, +14855, +14043, +12663, +9885, +14856, +14044, +12664, +] + +_charnames_129104 = [ +9879, +14853, +14038, +12661, +10663, +10671, +1417, +1409, +9906, +14871, +-1, +-1, +-1, +-1, +-1, +-1, +13906, +13894, +13900, +13912, +13882, +13888, +13875, +13869, +13908, +13896, +13902, +13914, +13884, +13890, +13877, +13871, +13905, +13893, +13899, +13911, +13881, +13887, +13874, +13868, +13907, +13895, +13901, +13913, +13883, +13889, +13876, +13870, +13904, +13892, +13898, +13910, +13880, +13886, +13873, +13867, +] + +_charnames_129168 = [ +9862, +14838, +14019, +12649, +9889, +14849, +14048, +12665, +9869, +14844, +14026, +12655, +11083, +11087, +11086, +11085, +9874, +14034, +9864, +14021, +9890, +14041, +9882, +14049, +9876, +14035, +9887, +14046, +13956, +13955, +] + +_charnames_129280 = [ +9090, +9089, +9087, +9900, +9899, +9898, +9901, +9895, +12673, +12671, +12674, +12672, +-1, +-1, +-1, +-1, +14815, +4874, +14587, +10591, +3376, +14602, +14177, +11326, +988, +8944, +14192, +9914, +14065, +11219, +11220, +14568, +14596, +9012, +10647, +14167, +12780, +9959, +14609, +1915, +14580, +13226, +13228, +14603, +1890, +1803, +14578, +1580, +11910, +7661, +11635, +1892, +11905, +4179, +4894, +1588, +11838, +14913, +14695, +4849, +13990, +13848, +11217, +-1, +13922, +12784, +9021, +3433, +1777, +13417, +14089, +14634, +1894, +3377, +7931, +4379, +8366, +9837, +1422, +14682, +9070, +6498, +8375, +7471, +11873, +8930, +7492, +13217, +1561, +1745, +14430, +13426, +11854, +13730, +11664, +12542, +14653, +3208, +8599, +7914, +8370, +8834, +7659, +11927, +11908, +8374, +1856, +8923, +9920, +4185, +4898, +7494, +1802, +-1, +-1, +14591, +14598, +12359, +14676, +-1, +-1, +-1, +14590, +-1, +9835, +13420, +11321, +14688, +9082, +9550, +1902, +3431, +14880, +14409, +12543, +7322, +1559, +12364, +14663, +7970, +12747, +13418, +9549, +14239, +1589, +1684, +13430, +14813, +11137, +1858, +3484, +9077, +13698, +9961, +11851, +11320, +11645, +14201, +9953, +4905, +4709, +7497, +1919, +] + +_charnames_129456 = [ +14357, +14358, +14359, +14356, +7932, +9925, +14659, +3466, +1720, +1719, +-1, +-1, +-1, +-1, +-1, +-1, +8484, +8369, +1863, +] + +_charnames_129488 = [ +14593, +6394, +8594, +12220, +7949, +11830, +11834, +11839, +11835, +4529, +14618, +13103, +3897, +14300, +13412, +14814, +7649, +12341, +7980, +1907, +13424, +8837, +1428, +14145, +14628, +14915, +3454, +11855, +12793, +8760, +6501, +14626, +3467, +7655, +4528, +9960, +9951, +1778, +7459, +1865, +3456, +7657, +7442, +14168, +7488, +1781, +14140, +10646, +] + +_charnames_129632 = [ +14892, +14890, +14893, +14891, +14887, +14888, +14889, +14901, +14899, +14902, +14900, +14896, +14897, +14898, +] + +_charnames_983040 = [ +10392, +10391, +1733, +1427, +1731, +1760, +14374, +14345, +14372, +14418, +14385, +14384, +6497, +6496, +6277, +7956, +7466, +7989, +8589, +11271, +11327, +3212, +9516, +10526, +14378, +9962, +10707, +14420, +9514, +13074, +13097, +14654, +14702, +8931, +9061, +1583, +9945, +1190, +1584, +9944, +1, +12775, +12794, +12731, +12791, +12728, +12790, +12729, +12789, +12732, +12788, +10587, +10650, +1844, +1843, +14373, +14346, +8916, +8915, +14377, +14419, +1722, +1721, +14415, +14414, +14545, +14637, +14700, +14543, +13233, +13431, +14542, +14139, +14238, +14544, +14879, +14883, +1762, +12741, +12739, +11666, +11665, +11318, +11301, +7662, +7990, +10679, +10705, +14531, +14434, +10588, +10592, +1730, +1922, +14375, +14416, +8592, +11274, +11328, +8591, +11273, +11329, +9515, +13075, +13098, +11641, +11642, +11785, +11643, +11640, +11777, +14132, +14134, +13995, +1179, +1185, +1924, +1180, +1184, +1923, +12730, +12787, +11900, +11897, +11937, +11899, +11896, +11936, +1889, +1761, +8918, +9111, +4065, +5098, +1734, +1732, +1789, +14379, +14376, +14429, +1729, +1425, +1181, +1929, +1182, +1906, +8817, +9108, +1751, +1724, +12326, +12313, +11901, +11941, +6486, +6488, +10704, +1590, +9794, +9708, +9109, +6275, +1841, +13697, +9818, +9819, +9820, +9821, +3340, +11211, +11213, +11214, +11212, +14692, +14691, +14690, +5099, +14809, +14807, +14810, +9956, +14235, +9958, +14237, +11940, +9955, +14234, +10706, +5100, +13993, +9957, +14236, +14701, +11939, +13983, +4711, +4712, +9851, +14008, +14918, +12797, +12908, +13042, +13031, +13020, +13009, +12998, +12987, +12976, +12897, +12886, +12875, +12864, +12853, +12842, +12831, +11909, +7988, +7929, +14808, +8220, +8222, +3951, +3941, +3914, +3904, +11034, +7987, +12820, +12809, +12798, +12953, +12942, +12931, +12920, +12909, +12964, +12975, +12974, +12973, +12972, +13052, +13051, +13050, +13049, +13048, +13047, +13046, +13045, +13044, +13043, +13041, +13040, +13039, +13038, +13037, +13036, +13035, +13034, +13033, +13032, +13030, +13029, +13028, +13027, +13026, +13025, +13024, +13023, +13022, +13021, +13019, +13018, +13017, +13016, +13015, +13014, +13013, +13012, +13011, +13010, +13008, +13007, +13006, +13005, +13004, +13003, +13002, +13001, +13000, +12999, +12997, +12996, +12995, +12994, +12993, +12992, +12991, +12990, +12989, +12988, +12986, +12985, +12984, +12983, +12982, +12981, +12980, +12979, +12978, +12977, +12907, +12906, +12905, +12904, +12903, +12902, +12901, +12900, +12899, +12898, +12896, +12895, +12894, +12893, +12892, +12891, +12890, +12889, +12888, +12887, +12885, +12884, +12883, +12882, +12881, +12880, +12879, +12878, +12877, +12876, +12874, +12873, +12872, +12871, +12870, +12869, +12868, +12867, +12866, +12865, +12863, +12862, +12861, +12860, +12859, +12858, +12857, +12856, +12855, +12854, +12852, +12851, +12850, +12849, +12848, +12847, +12846, +12845, +12844, +12843, +12841, +12840, +12839, +12838, +12837, +12836, +12835, +12834, +12833, +12832, +12830, +12829, +12828, +12827, +12826, +12825, +12824, +12823, +12822, +12821, +12819, +12818, +12817, +12816, +12815, +12814, +12813, +12812, +12811, +12810, +12808, +12807, +12806, +12805, +12804, +12803, +12802, +12801, +12800, +12799, +12963, +12962, +12961, +12960, +12959, +12958, +12957, +12956, +12955, +12954, +12952, +12951, +12950, +12949, +12948, +12947, +12946, +12945, +12944, +12943, +12941, +12940, +12939, +12938, +12937, +12936, +12935, +12934, +12933, +12932, +12930, +12929, +12928, +12927, +12926, +12925, +12924, +12923, +12922, +12921, +12919, +12918, +12917, +12916, +12915, +12914, +12913, +12912, +12911, +12910, +12971, +12970, +12969, +12968, +12967, +12966, +12965, +] + +_charnames_983552 = [ +13718, +13719, +13713, +13714, +13705, +13706, +13711, +13712, +13708, +13709, +13716, +13715, +9783, +9674, +9727, +9574, +9729, +9576, +9730, +9577, +9738, +9585, +9739, +9586, +9778, +9612, +9608, +9694, +9756, +9624, +9758, +9626, +9759, +9627, +9751, +9599, +9743, +9560, +9782, +9673, +9781, +9672, +9733, +9580, +9732, +9579, +9736, +9583, +9735, +9582, +9607, +9606, +9777, +9611, +9776, +9610, +9791, +9714, +9788, +9654, +9802, +9705, +9771, +9685, +9747, +9567, +9746, +9566, +9744, +9561, +9742, +9559, +9676, +9621, +9622, +9649, +9650, +9596, +9597, +9701, +9702, +6007, +6011, +6008, +6013, +6012, +6010, +6014, +6009, +6015, +7939, +3109, +3098, +3117, +3097, +3106, +3095, +3105, +3094, +3113, +3114, +3111, +3107, +3102, +3112, +3104, +3103, +3108, +3096, +3115, +3101, +3100, +3099, +3116, +3110, +2941, +2946, +2947, +2942, +2943, +2948, +2949, +2940, +2944, +2945, +2939, +2824, +2829, +2830, +2825, +2826, +2831, +2832, +2823, +2827, +2828, +2822, +3084, +3089, +3090, +3085, +3086, +3091, +3092, +3083, +3087, +3088, +3082, +2811, +2816, +2817, +2812, +2813, +2818, +2819, +2810, +2814, +2815, +2809, +2955, +2960, +2961, +2956, +2957, +2962, +2963, +2954, +2958, +2959, +2953, +2798, +2803, +2804, +2799, +2800, +2805, +2806, +2797, +2801, +2802, +2796, +2967, +2972, +2973, +2968, +2969, +2974, +2975, +2966, +2970, +2971, +2965, +2836, +2841, +2842, +2837, +2838, +2843, +2844, +2835, +2839, +2840, +2834, +3032, +3037, +3038, +3033, +3034, +3039, +3040, +3031, +3035, +3036, +3030, +3045, +3050, +3051, +3046, +3047, +3052, +3053, +3044, +3048, +3049, +3043, +3006, +3011, +3012, +3007, +3008, +3013, +3014, +3005, +3009, +3010, +3004, +2993, +2998, +2999, +2994, +2995, +3000, +3001, +2992, +2996, +2997, +2991, +2915, +2920, +2921, +2916, +2917, +2922, +2923, +2914, +2918, +2919, +2913, +3019, +3024, +3025, +3020, +3021, +3026, +3027, +3018, +3022, +3023, +3017, +2891, +2896, +2897, +2892, +2893, +2898, +2899, +2890, +2894, +2895, +2889, +2903, +2908, +2909, +2904, +2905, +2910, +2911, +2902, +2906, +2907, +2901, +2981, +2986, +2987, +2982, +2983, +2988, +2989, +2980, +2984, +2985, +2979, +2786, +2791, +2792, +2787, +2788, +2793, +2794, +2785, +2789, +2790, +2784, +3058, +3063, +3064, +3059, +3060, +3065, +3066, +3057, +3061, +3062, +3056, +2850, +2855, +2856, +2851, +2852, +2857, +2858, +2849, +2853, +2854, +2848, +2864, +2869, +2870, +2865, +2866, +2871, +2872, +2863, +2867, +2868, +2862, +2876, +2881, +2882, +2877, +2878, +2883, +2884, +2875, +2879, +2880, +2874, +3071, +3076, +3077, +3072, +3073, +3078, +3079, +3070, +3074, +3075, +3069, +2926, +2929, +2934, +2935, +2930, +2931, +2936, +2937, +2928, +2932, +2933, +2927, +2859, +1175, +1174, +1173, +13402, +13631, +13629, +13630, +13628, +13624, +13637, +13635, +13636, +13634, +13622, +13652, +13615, +13651, +13614, +13625, +13620, +13618, +13619, +13617, +13623, +13658, +13645, +13646, +13644, +13656, +13653, +13655, +13648, +13654, +13640, +13639, +13641, +13657, +13649, +13667, +13663, +13660, +13661, +13664, +13666, +13668, +11310, +11308, +11306, +11309, +11307, +13681, +13679, +13677, +13680, +13678, +13688, +13685, +13686, +13687, +4847, +4846, +] + +def lookup_charcode(code): + res = -1 + if code == 895: res = 13215 + elif 1318 <= code <= 1327: res = _charnames_1318[code-1318] + elif code == 1376: res = 6106 + elif 1416 <= code <= 1423: res = _charnames_1416[code-1416] + elif code == 1519: res = 11138 + elif code == 1540: res = 6016 + elif code == 1541: res = 6101 + elif code == 1564: res = 6047 + elif code == 1568: res = 6052 + elif code == 1631: res = 6100 + elif code == 2045: res = 10701 + elif code == 2046: res = 10700 + elif code == 2047: res = 10702 + elif 2112 <= code <= 2154: res = _charnames_2112[code-2112] + elif 2208 <= code <= 2237: res = _charnames_2208[code-2208] + elif 2259 <= code <= 2303: res = _charnames_2259[code-2259] + elif code == 2362: res = 12720 + elif code == 2363: res = 12719 + elif 2383 <= code <= 2391: res = _charnames_2383[code-2383] + elif code == 2419: res = 12709 + elif code == 2420: res = 12708 + elif code == 2421: res = 12712 + elif code == 2422: res = 12706 + elif code == 2423: res = 12705 + elif code == 2424: res = 12713 + elif code == 2432: res = 7941 + elif code == 2556: res = 7938 + elif code == 2557: res = 7942 + elif code == 2558: res = 7943 + elif code == 2678: res = 13334 + elif code == 2800: res = 13333 + elif 2809 <= code <= 2815: res = _charnames_2809[code-2809] + elif code == 2930: res = 12334 + elif code == 2931: res = 12335 + elif code == 2932: res = 12339 + elif code == 2933: res = 12333 + elif code == 2934: res = 12336 + elif code == 2935: res = 12338 + elif code == 3072: res = 3446 + elif code == 3076: res = 3447 + elif code == 3124: res = 3450 + elif code == 3162: res = 3449 + elif code == 3200: res = 13694 + elif code == 3201: res = 13696 + elif code == 3204: res = 13695 + elif code == 3328: res = 4491 + elif code == 3329: res = 4493 + elif code == 3369: res = 4486 + elif code == 3386: res = 4485 + elif code == 3387: res = 4494 + elif code == 3388: res = 4492 + elif 3406 <= code <= 3423: res = _charnames_3406[code-3406] + elif code == 3446: res = 4473 + elif code == 3447: res = 4475 + elif code == 3448: res = 4478 + elif 3558 <= code <= 3567: res = _charnames_3558[code-3558] + elif code == 3806: res = 9816 + elif code == 3807: res = 9815 + elif code == 3980: res = 3336 + elif code == 3981: res = 3334 + elif code == 3982: res = 3333 + elif code == 3983: res = 3335 + elif code == 4057: res = 3339 + elif code == 4058: res = 3338 + elif 4295 <= code <= 4301: res = _charnames_4295[code-4295] + elif code == 4349: res = 13405 + elif code == 4350: res = 13404 + elif code == 4351: res = 13403 + elif code == 4957: res = 14344 + elif code == 4958: res = 14343 + elif 5109 <= code <= 5117: res = _charnames_5109[code-5109] + elif 5873 <= code <= 5880: res = _charnames_5873[code-5873] + elif code == 6264: res = 4868 + elif code == 6429: res = 9548 + elif code == 6430: res = 9547 + elif 6832 <= code <= 6846: res = _charnames_6832[code-6832] + elif code == 7083: res = 1708 + elif code == 7084: res = 1707 + elif code == 7085: res = 1706 + elif 7098 <= code <= 7155: res = _charnames_7098[code-7098] + elif code == 7164: res = 7384 + elif code == 7165: res = 7382 + elif code == 7166: res = 7385 + elif code == 7167: res = 7383 + elif 7296 <= code <= 7304: res = _charnames_7296[code-7296] + elif 7312 <= code <= 7367: res = _charnames_7312[code-7312] + elif 7411 <= code <= 7417: res = _charnames_7411[code-7411] + elif 7655 <= code <= 7676: res = _charnames_7655[code-7655] + elif code == 8294: res = 9916 + elif code == 8295: res = 14067 + elif code == 8296: res = 14633 + elif code == 8297: res = 11887 + elif 8341 <= code <= 8348: res = _charnames_8341[code-8341] + elif 8377 <= code <= 8383: res = _charnames_8377[code-8377] + elif code == 8586: res = 3420 + elif code == 8587: res = 3421 + elif 9193 <= code <= 9215: res = _charnames_9193[code-9193] + elif code == 9934: res = 12329 + elif code == 9954: res = 6482 + elif code == 9956: res = 11845 + elif code == 9957: res = 14069 + elif code == 9958: res = 9918 + elif code == 9959: res = 14550 + elif 9984 <= code <= 9995: res = _charnames_9984[code-9984] + elif code == 10024: res = 1792 + elif 10060 <= code <= 10069: res = _charnames_10060[code-10060] + elif code == 10079: res = 11074 + elif code == 10080: res = 11075 + elif code == 10133: res = 11123 + elif code == 10134: res = 11124 + elif code == 10135: res = 11102 + elif code == 10160: res = 8365 + elif code == 10175: res = 12687 + elif code == 10187: res = 4525 + elif code == 10189: res = 4526 + elif code == 10190: res = 1623 + elif code == 10191: res = 1622 + elif code == 11085: res = 12646 + elif code == 11086: res = 1573 + elif code == 11087: res = 1572 + elif 11098 <= code <= 11262: res = _charnames_11098[code-11098] + elif code == 11506: res = 8809 + elif code == 11507: res = 8808 + elif 11559 <= code <= 11565: res = _charnames_11559[code-11559] + elif code == 11622: res = 3344 + elif code == 11623: res = 3343 + elif code == 11632: res = 3345 + elif code == 11647: res = 3346 + elif 11826 <= code <= 11854: res = _charnames_11826[code-11826] + elif code == 12590: res = 7907 + elif code == 12591: res = 7908 + elif code == 12728: res = 7910 + elif code == 12729: res = 7909 + elif code == 12730: res = 7906 + elif code == 42592: res = 9058 + elif code == 42593: res = 9039 + elif 42612 <= code <= 42619: res = _charnames_42612[code-42612] + elif 42648 <= code <= 42655: res = _charnames_42648[code-42648] + elif 42893 <= code <= 42937: res = _charnames_42893[code-42893] + elif code == 42999: res = 9812 + elif code == 43000: res = 4844 + elif code == 43001: res = 4837 + elif code == 43002: res = 9808 + elif code == 43205: res = 1859 + elif code == 43260: res = 12724 + elif code == 43261: res = 12725 + elif code == 43262: res = 12711 + elif code == 43263: res = 12722 + elif 43488 <= code <= 43518: res = _charnames_43488[code-43488] + elif code == 43644: res = 5095 + elif code == 43645: res = 5094 + elif code == 43646: res = 5077 + elif code == 43647: res = 5076 + elif 43744 <= code <= 43766: res = _charnames_43744[code-43744] + elif 43777 <= code <= 43798: res = _charnames_43777[code-43777] + elif 43808 <= code <= 43877: res = _charnames_43808[code-43808] + elif 43888 <= code <= 43967: res = _charnames_43888[code-43888] + elif code == 64046: res = 9107 + elif code == 64047: res = 9106 + elif 64434 <= code <= 64449: res = _charnames_64434[code-64434] + elif 65063 <= code <= 65071: res = _charnames_65063[code-65063] + elif code == 65931: res = 13212 + elif code == 65932: res = 13211 + elif code == 65933: res = 13214 + elif code == 65934: res = 10697 + elif code == 65952: res = 13210 + elif 66272 <= code <= 66299: res = _charnames_66272[code-66272] + elif code == 66335: res = 12215 + elif code == 66349: res = 12212 + elif code == 66350: res = 12214 + elif code == 66351: res = 12213 + elif 66384 <= code <= 66426: res = _charnames_66384[code-66384] + elif 66736 <= code <= 66855: res = _charnames_66736[code-66736] + elif 66864 <= code <= 66915: res = _charnames_66864[code-66864] + elif code == 66927: res = 8914 + elif 67072 <= code <= 67382: res = _charnames_67072[code-67072] + elif 67392 <= code <= 67413: res = _charnames_67392[code-67392] + elif 67424 <= code <= 67431: res = _charnames_67424[code-67424] + elif 67680 <= code <= 67742: res = _charnames_67680[code-67680] + elif 67751 <= code <= 67759: res = _charnames_67751[code-67751] + elif 67808 <= code <= 67839: res = _charnames_67808[code-67808] + elif 67968 <= code <= 68095: res = _charnames_67968[code-67968] + elif code == 68148: res = 13672 + elif code == 68149: res = 13671 + elif code == 68168: res = 13673 + elif 68224 <= code <= 68255: res = _charnames_68224[code-68224] + elif 68288 <= code <= 68342: res = _charnames_68288[code-68288] + elif 68480 <= code <= 68497: res = _charnames_68480[code-68480] + elif code == 68505: res = 11822 + elif code == 68506: res = 11821 + elif code == 68507: res = 11820 + elif code == 68508: res = 11819 + elif 68521 <= code <= 68527: res = _charnames_68521[code-68521] + elif 68736 <= code <= 68786: res = _charnames_68736[code-68736] + elif 68800 <= code <= 68850: res = _charnames_68800[code-68800] + elif 68858 <= code <= 68903: res = _charnames_68858[code-68858] + elif 68912 <= code <= 68921: res = _charnames_68912[code-68912] + elif 69376 <= code <= 69415: res = _charnames_69376[code-69376] + elif 69424 <= code <= 69465: res = _charnames_69424[code-69424] + elif 69632 <= code <= 69743: res = _charnames_69632[code-69632] + elif code == 69759: res = 7598 + elif 69837 <= code <= 69864: res = _charnames_69837[code-69837] + elif 69872 <= code <= 69958: res = _charnames_69872[code-69872] + elif 69968 <= code <= 70006: res = _charnames_69968[code-69968] + elif 70016 <= code <= 70132: res = _charnames_70016[code-70016] + elif 70144 <= code <= 70206: res = _charnames_70144[code-70144] + elif 70272 <= code <= 70516: res = _charnames_70272[code-70272] + elif 70656 <= code <= 70750: res = _charnames_70656[code-70656] + elif 70784 <= code <= 70855: res = _charnames_70784[code-70784] + elif 70864 <= code <= 70873: res = _charnames_70864[code-70864] + elif 71040 <= code <= 71133: res = _charnames_71040[code-71040] + elif 71168 <= code <= 71236: res = _charnames_71168[code-71168] + elif 71248 <= code <= 71276: res = _charnames_71248[code-71248] + elif 71296 <= code <= 71351: res = _charnames_71296[code-71296] + elif 71360 <= code <= 71369: res = _charnames_71360[code-71360] + elif 71424 <= code <= 71487: res = _charnames_71424[code-71424] + elif 71680 <= code <= 71739: res = _charnames_71680[code-71680] + elif 71840 <= code <= 71922: res = _charnames_71840[code-71840] + elif code == 71935: res = 13844 + elif 72192 <= code <= 72263: res = _charnames_72192[code-72192] + elif 72272 <= code <= 72354: res = _charnames_72272[code-72272] + elif 72384 <= code <= 72440: res = _charnames_72384[code-72384] + elif 72704 <= code <= 72773: res = _charnames_72704[code-72704] + elif 72784 <= code <= 72886: res = _charnames_72784[code-72784] + elif 72960 <= code <= 73031: res = _charnames_72960[code-72960] + elif 73040 <= code <= 73112: res = _charnames_73040[code-73040] + elif 73120 <= code <= 73129: res = _charnames_73120[code-73120] + elif 73440 <= code <= 73464: res = _charnames_73440[code-73440] + elif 74607 <= code <= 74649: res = _charnames_74607[code-74607] + elif 74851 <= code <= 74868: res = _charnames_74851[code-74851] + elif 74880 <= code <= 75075: res = _charnames_74880[code-74880] + elif 82944 <= code <= 83526: res = _charnames_82944[code-82944] + elif 92160 <= code <= 92728: res = _charnames_92160[code-92160] + elif 92736 <= code <= 92783: res = _charnames_92736[code-92736] + elif 92880 <= code <= 92917: res = _charnames_92880[code-92880] + elif 92928 <= code <= 92997: res = _charnames_92928[code-92928] + elif 93008 <= code <= 93071: res = _charnames_93008[code-93008] + elif 93760 <= code <= 93850: res = _charnames_93760[code-93760] + elif 93952 <= code <= 94020: res = _charnames_93952[code-93952] + elif 94032 <= code <= 94078: res = _charnames_94032[code-94032] + elif 94095 <= code <= 94111: res = _charnames_94095[code-94095] + elif code == 94176: res = 2775 + elif code == 94177: res = 10390 + elif 100352 <= code <= 101106: res = _charnames_100352[code-100352] + elif 110592 <= code <= 110878: res = _charnames_110592[code-110592] + elif 110960 <= code <= 111355: res = _charnames_110960[code-110960] + elif 113664 <= code <= 113800: res = _charnames_113664[code-113664] + elif 113808 <= code <= 113827: res = _charnames_113808[code-113808] + elif 119262 <= code <= 119272: res = _charnames_119262[code-119262] + elif 119520 <= code <= 119539: res = _charnames_119520[code-119520] + elif 119666 <= code <= 119672: res = _charnames_119666[code-119666] + elif 120832 <= code <= 121483: res = _charnames_120832[code-120832] + elif 121499 <= code <= 121519: res = _charnames_121499[code-121499] + elif 122880 <= code <= 122922: res = _charnames_122880[code-122880] + elif 124928 <= code <= 125142: res = _charnames_124928[code-124928] + elif 125184 <= code <= 125279: res = _charnames_125184[code-125184] + elif 126065 <= code <= 126132: res = _charnames_126065[code-126065] + elif 126464 <= code <= 126651: res = _charnames_126464[code-126464] + elif code == 126704: res = 5934 + elif code == 126705: res = 5935 + elif 127136 <= code <= 127221: res = _charnames_127136[code-127136] + elif code == 127243: res = 12757 + elif code == 127244: res = 12756 + elif 127279 <= code <= 127404: res = _charnames_127279[code-127279] + elif 127462 <= code <= 127490: res = _charnames_127462[code-127462] + elif 127538 <= code <= 127547: res = _charnames_127538[code-127538] + elif code == 127568: res = 9094 + elif code == 127569: res = 9095 + elif code == 127584: res = 14158 + elif code == 127585: res = 14157 + elif code == 127586: res = 14155 + elif code == 127587: res = 14156 + elif code == 127588: res = 14154 + elif code == 127589: res = 14159 + elif 127744 <= code <= 128724: res = _charnames_127744[code-127744] + elif 128736 <= code <= 128883: res = _charnames_128736[code-128736] + elif 128896 <= code <= 128984: res = _charnames_128896[code-128896] + elif 129024 <= code <= 129095: res = _charnames_129024[code-129024] + elif 129104 <= code <= 129159: res = _charnames_129104[code-129104] + elif 129168 <= code <= 129197: res = _charnames_129168[code-129168] + elif 129280 <= code <= 129442: res = _charnames_129280[code-129280] + elif 129456 <= code <= 129474: res = _charnames_129456[code-129456] + elif 129488 <= code <= 129535: res = _charnames_129488[code-129488] + elif 129632 <= code <= 129645: res = _charnames_129632[code-129632] + elif 983040 <= code <= 983507: res = _charnames_983040[code-983040] + elif 983552 <= code <= 983993: res = _charnames_983552[code-983552] + if res == -1: raise KeyError, code + return name_of_node(res) + +# end output from build_compression_tree +#____________________________________________________________ +_names_corrected = { +} +_code_by_name_corrected = { +} + +_cjk_prefix = "CJK UNIFIED IDEOGRAPH-" +_hangul_prefix = 'HANGUL SYLLABLE ' + +_hangul_L = ['G', 'GG', 'N', 'D', 'DD', 'R', 'M', 'B', 'BB', + 'S', 'SS', '', 'J', 'JJ', 'C', 'K', 'T', 'P', 'H'] +_hangul_V = ['A', 'AE', 'YA', 'YAE', 'EO', 'E', 'YEO', 'YE', 'O', 'WA', 'WAE', + 'OE', 'YO', 'U', 'WEO', 'WE', 'WI', 'YU', 'EU', 'YI', 'I'] +_hangul_T = ['', 'G', 'GG', 'GS', 'N', 'NJ', 'NH', 'D', 'L', 'LG', 'LM', + 'LB', 'LS', 'LT', 'LP', 'LH', 'M', 'B', 'BS', 'S', 'SS', + 'NG', 'J', 'C', 'K', 'T', 'P', 'H'] + +def _lookup_hangul(syllables): + l_code = v_code = t_code = -1 + for i in range(len(_hangul_L)): + jamo = _hangul_L[i] + if (syllables[:len(jamo)] == jamo and + (l_code < 0 or len(jamo) > len(_hangul_L[l_code]))): + l_code = i + if l_code < 0: + raise KeyError + start = len(_hangul_L[l_code]) + + for i in range(len(_hangul_V)): + jamo = _hangul_V[i] + if (syllables[start:start + len(jamo)] == jamo and + (v_code < 0 or len(jamo) > len(_hangul_V[v_code]))): + v_code = i + if v_code < 0: + raise KeyError + start += len(_hangul_V[v_code]) + + for i in range(len(_hangul_T)): + jamo = _hangul_T[i] + if (syllables[start:start + len(jamo)] == jamo and + (t_code < 0 or len(jamo) > len(_hangul_T[t_code]))): + t_code = i + if t_code < 0: + raise KeyError + start += len(_hangul_T[t_code]) + + if len(syllables[start:]): + raise KeyError + return 0xAC00 + (l_code * 21 + v_code) * 28 + t_code + +def _lookup_cjk(cjk_code): + if len(cjk_code) != 4 and len(cjk_code) != 5: + raise KeyError + for c in cjk_code: + if not ('0' <= c <= '9' or 'A' <= c <= 'F'): + raise KeyError + code = int(cjk_code, 16) + if (0x3400 <= code <= 0x4DB5 or 0x4E00 <= code <= 0x9FEF or 0x20000 <= code <= 0x2A6D6 or 0x2A700 <= code <= 0x2B734 or 0x2B740 <= code <= 0x2B81D or 0x2B820 <= code <= 0x2CEA1): + return code + raise KeyError + +def lookup(name, with_named_sequence=False): + if name[:len(_cjk_prefix)] == _cjk_prefix: + return _lookup_cjk(name[len(_cjk_prefix):]) + if name[:len(_hangul_prefix)] == _hangul_prefix: + return _lookup_hangul(name[len(_hangul_prefix):]) + + if not base_mod: + code = trie_lookup(name) + else: + try: + code = trie_lookup(name) + except KeyError: + if name not in _code_by_name_corrected: + code = base_mod.trie_lookup(name) + else: + raise + if not with_named_sequence and 0xF0200 <= code < 0xF0400: + raise KeyError + return code + +def name(code): + if (0x3400 <= code <= 0x4DB5 or 0x4E00 <= code <= 0x9FEF or 0x20000 <= code <= 0x2A6D6 or 0x2A700 <= code <= 0x2B734 or 0x2B740 <= code <= 0x2B81D or 0x2B820 <= code <= 0x2CEA1): + return "CJK UNIFIED IDEOGRAPH-" + hex(code)[2:].upper() + if 0xAC00 <= code <= 0xD7A3: + # vl_code, t_code = divmod(code - 0xAC00, len(_hangul_T)) + vl_code = (code - 0xAC00) // len(_hangul_T) + t_code = (code - 0xAC00) % len(_hangul_T) + # l_code, v_code = divmod(vl_code, len(_hangul_V)) + l_code = vl_code // len(_hangul_V) + v_code = vl_code % len(_hangul_V) + return ("HANGUL SYLLABLE " + _hangul_L[l_code] + + _hangul_V[v_code] + _hangul_T[t_code]) + if 0xF0000 <= code < 0xF0400: + raise KeyError + + if not base_mod: + return lookup_charcode(code) + else: + try: + return lookup_charcode(code) + except KeyError: + if code not in _names_corrected: + return base_mod.lookup_charcode(code) + else: + raise + +_db_records = [ +('Cc', 'B', 'N', 5), +('Cc', 'BN', 'N', 0), +('Cc', 'S', 'N', 1), +('Cc', 'S', 'N', 5), +('Cc', 'WS', 'N', 5), +('Cf', 'AL', 'N', 8192), +('Cf', 'AN', 'N', 8192), +('Cf', 'BN', 'A', 8192), +('Cf', 'BN', 'N', 8192), +('Cf', 'FSI', 'N', 8192), +('Cf', 'L', 'N', 8192), +('Cf', 'LRE', 'N', 8192), +('Cf', 'LRI', 'N', 8192), +('Cf', 'LRO', 'N', 8192), +('Cf', 'ON', 'N', 8192), +('Cf', 'PDF', 'N', 8192), +('Cf', 'PDI', 'N', 8192), +('Cf', 'R', 'N', 8192), +('Cf', 'RLE', 'N', 8192), +('Cf', 'RLI', 'N', 8192), +('Cf', 'RLO', 'N', 8192), +('Cn', '', 'N', 0), +('Cn', '', 'W', 0), +('Co', 'L', 'A', 0), +('Cs', 'L', 'N', 0), +('Ll', 'L', 'A', 7202), +('Ll', 'L', 'F', 7202), +('Ll', 'L', 'N', 7202), +('Ll', 'L', 'Na', 7202), +('Ll', 'R', 'N', 7202), +('Lm', 'AL', 'N', 15362), +('Lm', 'L', 'A', 15362), +('Lm', 'L', 'A', 15394), +('Lm', 'L', 'H', 14338), +('Lm', 'L', 'H', 15362), +('Lm', 'L', 'N', 12322), +('Lm', 'L', 'N', 15362), +('Lm', 'L', 'N', 15394), +('Lm', 'L', 'W', 15362), +('Lm', 'ON', 'A', 15362), +('Lm', 'ON', 'N', 12290), +('Lm', 'ON', 'N', 15362), +('Lm', 'R', 'N', 15362), +('Lo', 'AL', 'N', 4098), +('Lo', 'AL', 'N', 7170), +('Lo', 'L', 'A', 7202), +('Lo', 'L', 'H', 7170), +('Lo', 'L', 'N', 6146), +('Lo', 'L', 'N', 7170), +('Lo', 'L', 'W', 7170), +('Lo', 'L', 'W', 7234), +('Lo', 'R', 'N', 7170), +('Lt', 'L', 'N', 7186), +('Lu', 'L', 'A', 7178), +('Lu', 'L', 'F', 7178), +('Lu', 'L', 'N', 7178), +('Lu', 'L', 'Na', 7178), +('Lu', 'R', 'N', 7178), +('Mc', 'L', 'N', 6144), +('Mc', 'L', 'W', 6144), +('Me', 'NSM', 'N', 12288), +('Mn', 'L', 'N', 14336), +('Mn', 'NSM', 'A', 14336), +('Mn', 'NSM', 'A', 14368), +('Mn', 'NSM', 'N', 14336), +('Mn', 'NSM', 'N', 15360), +('Mn', 'NSM', 'W', 14336), +('Nd', 'AN', 'N', 6592), +('Nd', 'EN', 'F', 6592), +('Nd', 'EN', 'N', 6592), +('Nd', 'EN', 'Na', 6592), +('Nd', 'L', 'N', 6592), +('Nd', 'R', 'N', 6592), +('Nl', 'L', 'A', 7240), +('Nl', 'L', 'A', 7264), +('Nl', 'L', 'N', 7232), +('Nl', 'L', 'N', 7240), +('Nl', 'L', 'N', 7264), +('Nl', 'L', 'W', 7232), +('Nl', 'ON', 'N', 7232), +('No', 'AL', 'N', 4160), +('No', 'AN', 'N', 4160), +('No', 'AN', 'N', 4288), +('No', 'EN', 'A', 4160), +('No', 'EN', 'A', 4288), +('No', 'EN', 'N', 4160), +('No', 'EN', 'N', 4288), +('No', 'L', 'A', 4160), +('No', 'L', 'N', 4160), +('No', 'L', 'N', 6336), +('No', 'L', 'W', 4160), +('No', 'ON', 'A', 4160), +('No', 'ON', 'A', 4288), +('No', 'ON', 'N', 4160), +('No', 'ON', 'N', 4288), +('No', 'ON', 'W', 4160), +('No', 'R', 'N', 4160), +('No', 'R', 'N', 4288), +('Pc', 'ON', 'F', 6144), +('Pc', 'ON', 'N', 6144), +('Pc', 'ON', 'Na', 6144), +('Pc', 'ON', 'W', 6144), +('Pd', 'ES', 'F', 4096), +('Pd', 'ES', 'Na', 4096), +('Pd', 'ES', 'W', 4096), +('Pd', 'ON', 'A', 4096), +('Pd', 'ON', 'N', 4096), +('Pd', 'ON', 'W', 4096), +('Pd', 'R', 'N', 4096), +('Pe', 'ON', 'F', 4608), +('Pe', 'ON', 'H', 4608), +('Pe', 'ON', 'N', 4096), +('Pe', 'ON', 'N', 4608), +('Pe', 'ON', 'Na', 4608), +('Pe', 'ON', 'W', 4096), +('Pe', 'ON', 'W', 4608), +('Pf', 'ON', 'A', 4096), +('Pf', 'ON', 'A', 12288), +('Pf', 'ON', 'N', 4608), +('Pi', 'ON', 'A', 4096), +('Pi', 'ON', 'A', 12288), +('Pi', 'ON', 'N', 4096), +('Pi', 'ON', 'N', 4608), +('Po', 'AL', 'N', 4096), +('Po', 'AN', 'N', 4096), +('Po', 'CS', 'F', 4096), +('Po', 'CS', 'F', 12288), +('Po', 'CS', 'N', 4096), +('Po', 'CS', 'Na', 4096), +('Po', 'CS', 'Na', 12288), +('Po', 'CS', 'W', 4096), +('Po', 'CS', 'W', 12288), +('Po', 'ET', 'A', 4096), +('Po', 'ET', 'F', 4096), +('Po', 'ET', 'N', 4096), +('Po', 'ET', 'Na', 4096), +('Po', 'ET', 'W', 4096), +('Po', 'L', 'N', 4096), +('Po', 'ON', 'A', 4096), +('Po', 'ON', 'A', 12288), +('Po', 'ON', 'A', 14336), +('Po', 'ON', 'F', 4096), +('Po', 'ON', 'F', 12288), +('Po', 'ON', 'H', 4096), +('Po', 'ON', 'N', 4096), +('Po', 'ON', 'N', 14336), +('Po', 'ON', 'Na', 4096), +('Po', 'ON', 'Na', 12288), +('Po', 'ON', 'W', 4096), +('Po', 'ON', 'W', 12288), +('Po', 'R', 'N', 4096), +('Po', 'R', 'N', 12288), +('Ps', 'ON', 'F', 4608), +('Ps', 'ON', 'H', 4608), +('Ps', 'ON', 'N', 4096), +('Ps', 'ON', 'N', 4608), +('Ps', 'ON', 'Na', 4608), +('Ps', 'ON', 'W', 4096), +('Ps', 'ON', 'W', 4608), +('Sc', 'AL', 'N', 4096), +('Sc', 'ET', 'A', 4096), +('Sc', 'ET', 'F', 4096), +('Sc', 'ET', 'H', 4096), +('Sc', 'ET', 'N', 4096), +('Sc', 'ET', 'Na', 4096), +('Sc', 'ET', 'W', 4096), +('Sc', 'R', 'N', 4096), +('Sk', 'AL', 'N', 12288), +('Sk', 'L', 'N', 12288), +('Sk', 'ON', 'A', 12288), +('Sk', 'ON', 'F', 12288), +('Sk', 'ON', 'N', 12288), +('Sk', 'ON', 'Na', 12288), +('Sk', 'ON', 'W', 12288), +('Sm', 'AL', 'N', 4096), +('Sm', 'CS', 'N', 4096), +('Sm', 'ES', 'F', 4096), +('Sm', 'ES', 'N', 4096), +('Sm', 'ES', 'Na', 4096), +('Sm', 'ES', 'W', 4096), +('Sm', 'ET', 'A', 4096), +('Sm', 'ET', 'N', 4096), +('Sm', 'L', 'N', 4096), +('Sm', 'ON', 'A', 4096), +('Sm', 'ON', 'A', 4608), +('Sm', 'ON', 'F', 4096), +('Sm', 'ON', 'F', 4608), +('Sm', 'ON', 'H', 4096), +('Sm', 'ON', 'N', 4096), +('Sm', 'ON', 'N', 4608), +('Sm', 'ON', 'N', 7168), +('Sm', 'ON', 'Na', 4096), +('Sm', 'ON', 'Na', 4608), +('Sm', 'ON', 'W', 4096), +('Sm', 'ON', 'W', 4608), +('So', 'AL', 'N', 4096), +('So', 'ET', 'A', 4096), +('So', 'ET', 'N', 4096), +('So', 'ET', 'N', 7168), +('So', 'L', 'A', 4096), +('So', 'L', 'A', 4104), +('So', 'L', 'A', 4128), +('So', 'L', 'N', 4096), +('So', 'L', 'W', 4096), +('So', 'ON', 'A', 4096), +('So', 'ON', 'F', 4096), +('So', 'ON', 'H', 4096), +('So', 'ON', 'N', 4096), +('So', 'ON', 'N', 4608), +('So', 'ON', 'Na', 4096), +('So', 'ON', 'W', 4096), +('So', 'R', 'N', 4096), +('Zl', 'WS', 'N', 5), +('Zp', 'B', 'N', 5), +('Zs', 'CS', 'N', 1), +('Zs', 'WS', 'F', 1), +('Zs', 'WS', 'N', 1), +('Zs', 'WS', 'Na', 4097), +] +_db_pgtbl = ( +'\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !"#$%&\'()*+,-./0123455565575555' +'555555555555589:5;5<55=5>55555?@55AB555C5555555D555E55F555555555' +'G555H5555555IJ55555555K55555555LM555N\x15OPQRST55555555555555555555' +'55555555555555555555555UVVVVVVVVWWWWWWWWWWWWWWWWWWWWWWWWWXYZ[\\]^' +'_`abcd\x15efghijklmnopqrstuvwxwyz{w\x15\x15\x15|}~wwwwwwwwww\x15\x15\x15\x15\x7fwwwwwwwwwww' +'wwww\x15\x15\x80wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\x15\x15\x81\x82ww\x83\x845555555555555555' +'5555555\x8555\x86wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww5\x87\x88wwwwwwwww\x89www' +'wwwwwwwwwwwwwwww\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91((\x92wwwww\x93wwwwwww\x94\x95ww\x96w\x97w\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2wwwww' +'\xa3\xa45555555\xa5\xa6\xa755555555555555555555555\xa855555\xa955555555555555555\xaa5555' +'5555555555555555555555555555555555\xab55555555555555555555555555555' +'55555555555555555555555555555555555555\xac5555555555555555\xad\xae5555555' +'55555555555555\xaf5555555555555555555555555555\xb0\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xa85\xb2\xb1\xb1\xb1\xb1\xb3' +'\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1' +'\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1' +'\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1' +'\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb3' +'wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww' +'wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww' +'wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww' +'wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww' +'wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww' +'wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww' +'wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww' +'wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww' +'wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww' +'wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww' +'wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww' +'wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww' +'wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww' +'wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww' +'wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww' +'wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww' +'wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww' +'wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww' +'wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww' +'wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww' +'wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww' +'wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww' +'wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww' +'wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww' +'wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww' +'wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww' +'wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww' +'wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww' +'wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww' +'wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww' +'wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww' +'wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww' +'wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww' +'wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww' +'wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww' +'wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww' +'wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww' +'wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww' +'wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww' +'wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww' +'\xb4\xb5wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww' +'wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww' +'wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww' +'wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww' +'WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW' +'WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW' +'WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW' +'WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW\xb6' +'WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW' +'WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW' +'WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW' +'WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW\xb6' +) +_db_pages = ( +'\x01\x01\x01\x01\x01\x01\x01\x01\x01\x02\x00\x03\x04\x00\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x00\x00\x00\x02\xd9\x92\x92\x87\xa4\x87\x92\x93\x9cq\x92\xb2\x80g\x81\x80FFFFFFFFFF\x81\x92\xc0\xbf\xc0\x92' +'\x9288888888888888888888888888\x9c\x92q\xacd\xac\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x9c\xbfq\xbf\x01' +'\x01\x01\x01\x01\x01\x00\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\xd6\x8a\xa4\xa4\xa0\xa4\xd1\x8a\xa9\xcf-z\xbf\x07\xcc\xac\xc4\xb4TT\xa9\x1b\x8a\x8c\xa9T-v[[[\x8a' +'77777757777777775777777\xb75777775\x19\x19\x19\x1b\x1b\x1b\x1b\x19\x1b\x19\x19\x19\x1b\x19\x19\x1b\x1b\x19\x1b\x19\x19\x1b\x1b\x1b\xb7\x19\x19\x19\x1b\x19\x1b\x19\x1b' +'7\x197\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x197\x197\x1b7\x1b7\x1b7\x197\x1b7\x1b7\x1b7\x1b7\x1b5\x197\x1b7\x197\x1b7\x1b7\x195\x197\x1b7\x1b\x197\x1b7\x1b7\x1b5' +'\x195\x197\x197\x1b7\x19\x195\x197\x197\x1b7\x1b5\x197\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b5\x197\x1b7\x197\x1b7\x1b7\x1b7\x1b7\x1b7\x1b77\x1b7\x1b7\x1b\x1b' +'\x1b77\x1b7\x1b77\x1b777\x1b\x1b7777\x1b77\x1b777\x1b\x1b\x1b77\x1b77\x1b7\x1b7\x1b77\x1b7\x1b\x1b7\x1b77\x1b777\x1b7\x1b77\x1b\x1b07\x1b\x1b\x1b' +'000074\x1b74\x1b74\x1b7\x197\x197\x197\x197\x197\x197\x197\x19\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b\x1b74\x1b7\x1b777\x1b7\x1b7\x1b7\x1b' +'7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b\x1b\x1b\x1b\x1b\x1b\x1b77\x1b77\x1b' +'\x1b7\x1b7777\x1b7\x1b7\x1b7\x1b7\x1b\x1b\x19\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x19\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b' +'\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b0\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b%%%%%%%%%))$$$$$' +"%%\xab\xab\xa9\xab)')''')'))\x1f$\xab\xab\xab\xab\xab\xab\xa9\xa9\xa9\xa9\xab\xa9\xab\xa9%%%%%\xab\xab\xab\xab\xab\xab\xab)\xab$\xab\xab\xab\xab\xab\xab\xab\xab\xab\xab\xab\xab\xab\xab\xab\xab\xab" +'>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>' +'>>>>>?>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>7\x1b7\x1b)\xab7\x1b\x15\x15#\x1b\x1b\x1b\x907' +'\x15\x15\x15\x15\xab\xab7\x91777\x157\x1577\x1b55555555555555555\x15555555577\x1b\x1b\x1b\x1b\x1b\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19' +'\x19\x19\x1b\x19\x19\x19\x19\x19\x19\x19\x1b\x1b\x1b\x1b\x1b7\x1b\x1b777\x1b\x1b\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b\x1b\x1b\x1b\x1b7\x1b\xbc7\x1b77\x1b\x1b777' +'757777777777777755555555555555555555555555555555\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19' +'\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x1b\x19\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b' +'7\x1b\xca@@@@@<<7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b' +'77\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b' +'7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b\x15777777777777777' +'77777777777777777777777\x15\x15$\x89\x89\x89\x89\x89\x89\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b' +'\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x89j\x15\x15\xcf\xcf\xa3\x15@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@l@' +'\x96@@\x96@@\x96@\x15\x15\x15\x15\x15\x15\x15\x15333333333333333333333333333\x15\x15\x15\x153333\x96\x97\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'\x06\x06\x06\x06\x06\x06\xbc\xbc\xae\x86\x86\x9f\x7f{\xcf\xcf@@@@@@@@@@@{\x05\x15{{,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,' +'\x1e,,,,,,,,,,@@@@@@@@@@@@@@@@@@@@@CCCCCCCCCC\x86||{,,@,,,,,,,,,,,,,,,' +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,' +',,,,,,,,,,,,,,,,,,,,{,@@@@@@@\x06\xcf@@@@@@\x1e\x1e@@\xcf@@@@,,EEEEEEEEEE,,,\xc3\xc3,' +'{{{{{{{{{{{{{{\x15\x05,@,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,@@@@@@@@@@@@@@@@' +'@@@@@@@@@@@\x15\x15,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,' +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,@@@@@@@@@@@,\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'HHHHHHHHHH333333333333333333333333333333333@@@@@@@@@**\xcf\x90\x90\x90*\x15\x15@\xa6\xa6' +'3333333333333333333333@@@@*@@@@@@@@@*@@@*@@@@@\x15\x15\x96\x96\x96\x96\x96\x96\x96\x96\x96\x96\x96\x96\x96\x96\x96\x15' +'3333333333333333333333333@@@\x15\x15\x96\x15,,,,,,,,,,,\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15,,,,,,,,,,,,,,,,,,,,,\x15,,,,,,,,\x15\x15' +'\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15@@@@@@@@@@@@@@@\x06@@@@@@@@@@@@@@@@@@@@@@@@@@@@@' +'@@@:000000000000000000000000000000000000000000000000000000@:@0::' +':@@@@@@@@::::@::0@@@@@@@0000000000@@\x89\x89GGGGGGGGGG\x89$00000000000000' +'0@::\x1500000000\x15\x1500\x15\x150000000000000000000000\x150000000\x150\x15\x15\x150000\x15\x15@0::' +':@@@@\x15\x15::\x15\x15::@0\x15\x15\x15\x15\x15\x15\x15\x15:\x15\x15\x15\x1500\x15000@@\x15\x15GGGGGGGGGG00\xa3\xa3XXXXXX\xca\xa30\x89@\x15' +'\x15@@:\x15000000\x15\x15\x15\x1500\x15\x150000000000000000000000\x150000000\x1500\x1500\x1500\x15\x15@\x15::' +':@@\x15\x15\x15\x15@@\x15\x15@@@\x15\x15\x15@\x15\x15\x15\x15\x15\x15\x150000\x150\x15\x15\x15\x15\x15\x15\x15GGGGGGGGGG@@000@\x89\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'\x15@@:\x15000000000\x15000\x150000000000000000000000\x150000000\x1500\x1500000\x15\x15@0::' +':@@@@@\x15@@:\x15::@\x15\x150\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x1500@@\x15\x15GGGGGGGGGG\x89\xa3\x15\x15\x15\x15\x15\x15\x150@@@@@@' +'\x15@::\x1500000000\x15\x1500\x15\x150000000000000000000000\x150000000\x1500\x1500000\x15\x15@0:@' +':@@@@\x15\x15::\x15\x15::@\x15\x15\x15\x15\x15\x15\x15\x15@:\x15\x15\x15\x1500\x15000@@\x15\x15GGGGGGGGGG\xca0XXXXXX\x15\x15\x15\x15\x15\x15\x15\x15' +'\x15\x15@0\x15000000\x15\x15\x15000\x150000\x15\x15\x1500\x150\x1500\x15\x15\x1500\x15\x15\x15000\x15\x15\x15000000000000\x15\x15\x15\x15::' +'@::\x15\x15\x15:::\x15:::@\x15\x150\x15\x15\x15\x15\x15\x15:\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15GGGGGGGGGGXXX\xcf\xcf\xcf\xcf\xcf\xcf\xa3\xcf\x15\x15\x15\x15\x15' +'@:::@00000000\x15000\x1500000000000000000000000\x150000000000000000\x15\x15\x150@@' +'@::::\x15@@@\x15@@@@\x15\x15\x15\x15\x15\x15\x15@@\x15000\x15\x15\x15\x15\x1500@@\x15\x15GGGGGGGGGG\x15\x15\x15\x15\x15\x15\x15\x15]]]]]]]\xca' +'0@::\x8900000000\x15000\x1500000000000000000000000\x150000000000\x1500000\x15\x15@0:=' +':::::\x15=::\x15::@@\x15\x15\x15\x15\x15\x15\x15::\x15\x15\x15\x15\x15\x15\x150\x1500@@\x15\x15GGGGGGGGGG\x1500\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'@@::\x1500000000\x15000\x1500000000000000000000000000000000000000000@@0::' +':@@@@\x15:::\x15:::@0\xca\x15\x15\x15\x15000:XXXXXXX000@@\x15\x15GGGGGGGGGGXXXXXXXXX\xca000000' +'\x15\x15::\x15000000000000000000\x15\x15\x15000000000000000000000000\x15000000000\x150\x15\x15' +'0000000\x15\x15\x15@\x15\x15\x15\x15:::@@@\x15@\x15::::::::\x15\x15\x15\x15\x15\x15GGGGGGGGGG\x15\x15::\x89\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'\x15000000000000000000000000000000000000000000000000@0/@@@@@@@\x15\x15\x15\x15\xa3' +'000000$@@@@@@@@\x89GGGGGGGGGG\x89\x89\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'\x1500\x150\x15\x1500\x150\x15\x150\x15\x15\x15\x15\x15\x150000\x150000000\x15000\x150\x150\x15\x1500\x150000@0/@@@@@@\x15@@0\x15\x15' +'00000\x15$\x15@@@@@@\x15\x15GGGGGGGGGG\x15\x150000\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'0\xca\xca\xca\x89\x89\x89\x89\x89\x89\x89\x89\x89\x89\x89\x89\x89\x89\x89\xca\x89\xca\xca\xca@@\xca\xca\xca\xca\xca\xcaGGGGGGGGGGXXXXXXXXXX\xca@\xca@\xca@\x9bp\x9bp::' +'00000000\x15000000000000000000000000000000000000\x15\x15\x15\x15@@@@@@@@@@@@@@:' +'@@@@@\x89@@00000@@@@@@@@@@@\x15@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\x15\xca\xca' +'\xca\xca\xca\xca\xca\xca@\xca\xca\xca\xca\xca\xca\x15\xca\xca\x89\x89\x89\x89\x89\xca\xca\xca\xca\x89\x89\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'0000000000000000000000000000000000000000000::@@@@:@@@@@@:@@::@@0' +'GGGGGGGGGG\x89\x89\x89\x89\x89\x89000000::@@0000@@@0:::00:::::::000@@@@00000000000' +'00@::@@::::::@0:GGGGGGGGGG:::@\xca\xca77777777777777777777777777777777' +'777777\x157\x15\x15\x15\x15\x157\x15\x15\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x89$\x1b\x1b\x1b' +'1111111111111111111111111111111111111111111111111111111111111111' +'1111111111111111111111111111111100000000000000000000000000000000' +'0000000000000000000000000000000000000000000000000000000000000000' +'0000000000000000000000000000000000000000000000000000000000000000' +'0000000000000000000000000000000000000000000000000000000000000000' +'000000000\x150000\x15\x150000000\x150\x150000\x15\x1500000000000000000000000000000000' +'000000000\x150000\x15\x15000000000000000000000000000000000\x150000\x15\x150000000\x15' +'0\x150000\x15\x15000000000000000\x150000000000000000000000000000000000000000' +'00000000000000000\x150000\x15\x150000000000000000000000000000000000000000' +'000000000000000000000000000\x15\x15@@@\x89\x89\x89\x89\x89\x89\x89\x89\x89YYYYYYYYYXXXXXXXXXXX\x15\x15\x15' +'0000000000000000\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\x15\x15\x15\x15\x15\x1577777777777777777777777777777777' +'777777777777777777777777777777777777777777777777777777\x15\x15\x1b\x1b\x1b\x1b\x1b\x1b\x15\x15' +'j000000000000000000000000000000000000000000000000000000000000000' +'0000000000000000000000000000000000000000000000000000000000000000' +'0000000000000000000000000000000000000000000000000000000000000000' +'0000000000000000000000000000000000000000000000000000000000000000' +'0000000000000000000000000000000000000000000000000000000000000000' +'0000000000000000000000000000000000000000000000000000000000000000' +'0000000000000000000000000000000000000000000000000000000000000000' +'0000000000000000000000000000000000000000000000000000000000000000' +'0000000000000000000000000000000000000000000000000000000000000000' +'000000000000000000000000000000000000000000000\x89\x8900000000000000000' +'\xd800000000000000000000000000\x9bp\x15\x15\x1500000000000000000000000000000000' +'0000000000000000000000000000000000000000000\x89\x89\x89KKK00000000\x15\x15\x15\x15\x15\x15\x15' +'0000000000000\x150000@@@\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15000000000000000000@@@\x89\x89\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'000000000000000000@@\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x150000000000000\x15000\x15@@\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'0000000000000000000000000000000000000000000000000000@@:@@@@@@@::' +'::::::@::@@@@@@@@@@@\x89\x89\x89$\x89\x89\x89\xa30@\x15\x15GGGGGGGGGG\x15\x15\x15\x15\x15\x15]]]]]]]]]]\x15\x15\x15\x15\x15\x15' +'\x90\x90\x90\x90\x90\x90j\x90\x90\x90\x90@@@\x08\x15GGGGGGGGGG\x15\x15\x15\x15\x15\x1500000000000000000000000000000000' +'000$00000000000000000000000000000000000000000000000000000\x15\x15\x15\x15\x15\x15\x15' +'00000AA0000000000000000000000000000000000@0\x15\x15\x15\x15\x150000000000000000' +'000000000000000000000000000000000000000000000000000000\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'0000000000000000000000000000000\x15@@@::::@@:::\x15\x15\x15\x15::@::::::@@@\x15\x15\x15\x15' +'\xcf\x15\x15\x15\x90\x90GGGGGGGGGG000000000000000000000000000000\x15\x1500000\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'00000000000000000000000000000000000000000000\x15\x15\x15\x150000000000000000' +'0000000000\x15\x15\x15\x15\x15\x15GGGGGGGGGGY\x15\x15\x15\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf' +'00000000000000000000000@@::@\x15\x15\x89\x8900000000000000000000000000000000' +'000000000000000000000:@:@@@@@@@\x15@:@::@@@@@@@@::::::@@@@@@@@@@\x15\x15@' +'GGGGGGGGGG\x15\x15\x15\x15\x15\x15GGGGGGGGGG\x15\x15\x15\x15\x15\x15\x89\x89\x89\x89\x89\x89\x89$\x89\x89\x89\x89\x89\x89\x15\x15@@@@@@@@@@@@@@<\x15' +'\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'@@@@:00000000000000000000000000000000000000000000000@:@@@@@:@:::' +'::@::0000000\x15\x15\x15\x15GGGGGGGGGG\x89\x89\x89\x89\x89\x89\x89\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca@@@@@@@@@\xca\xca\xca\xca\xca\xca\xca\xca\xca\x15\x15\x15' +'@@:000000000000000000000000000000:@@@@::@@:@@@00GGGGGGGGGG000000' +'00000000000000000000000000000000000000@:@@:::@:@@@::\x15\x15\x15\x15\x15\x15\x15\x15\x89\x89\x89\x89' +'000000000000000000000000000000000000::::::::@@@@@@@@::@@\x15\x15\x15\x89\x89\x89\x89\x89' +'GGGGGGGGGG\x15\x15\x15000GGGGGGGGGG000000000000000000000000000000$$$$$$\x89\x89' +'\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x15\x15\x15\x15\x15\x15\x157777777777777777777777777777777777777777777\x15\x15777' +'\x89\x89\x89\x89\x89\x89\x89\x89\x15\x15\x15\x15\x15\x15\x15\x15@@@\x89@@@@@@@@@@@@@:@@@@@@@0000@0000::@00:@@\x15\x15\x15\x15\x15\x15' +'\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b%%%%%%%%%%%%%%%%%%%%' +'%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b%\x1b\x1b\x1b\x1b\x1b\x1b\x1b' +'\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%' +'@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\x15@@@@@' +'7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b' +'7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b' +'7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b' +'7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b' +'\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b77777777\x1b\x1b\x1b\x1b\x1b\x1b\x15\x15777777\x15\x15\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b77777777\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b77777777' +'\x1b\x1b\x1b\x1b\x1b\x1b\x15\x15777777\x15\x15\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x157\x157\x157\x157\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b77777777\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x15\x15' +'\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b44444444\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b44444444\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b44444444\x1b\x1b\x1b\x1b\x1b\x15\x1b\x1b77774\xab\x1b\xab' +'\xab\xab\x1b\x1b\x1b\x15\x1b\x1b77774\xab\xab\xab\x1b\x1b\x1b\x1b\x15\x15\x1b\x1b7777\x15\xab\xab\xab\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b77777\xab\xab\xab\x15\x15\x1b\x1b\x1b\x15\x1b\x1b77774\xab\xab\x15' +'\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\x08\x08\x08\n\x11ijjiii\x8a\x90xu\x9aywt\x9ay\x8a\x8a\x8a\x90\x8b\x8a\x8a\x8b\xd4\xd5\x0b\x12\x0f\r\x14\xd6\x84\x86\x84\x84\x86\x8a\x90\x90\x90zv\x8a\x90\x90\x8ac' +'c\x90\x90\x90\xaf\x9bp\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\xbc\x90c\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\xd8\x08\x08\x08\x08\x08\x15\x0c\x13\t\x10\x08\x08\x08\x08\x08\x08V%\x15\x15TVVVVV\xb1\xb1\xbc\x9bp ' +'VTTTTVVVVV\xb1\xb1\xbc\x9bp\x15%%%%%%%%%%%%%\x15\x15\x15\xa3\xa3\xa3\xa3\xa3\xa3\xa3\xa3\xa3\xa2\xa3\xa3\xa0\xa3\xa3\xa3\xa3\xa3\xa3\xa3\xa3\xa3\xa3\xa3\xa3\xa3\xa3\xa3\xa3\xa3\xa3\xa3' +'\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15@@@@@@@@@@@@@<<<<@<<<@@@@@@@@@@@@\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'\xcf\xcf7\xcc\xcf\xcc\xcf7\xcf\xcc\x1b777\x1b\x1b777\x19\xcf7\xcc\xcf\xbe77777\xcf\xcf\xcf\xcc\xcc\xcf7\xcf5\xcf7\xcf7577\xc6\x1b7777\x1b0000\x1b\xcf\xcf\x1b\x1b77' +'\xbd\xbc\xbc\xbc\xbc7\x1b\x1b\x1b\x1b\xcf\xbc\xcf\xcf\x1b\xca]]][[]]]]]][[[[]IIIIIIIIIIIILLLLJJJJJJJJJJMMMMMM' +'KKK7\x1bKKKK[\xcf\xcf\x15\x15\x15\x15\xb7\xb7\xb7\xb7\xb7\xcc\xcc\xcc\xcc\xcc\xbc\xbc\xcf\xcf\xcf\xcf\xbc\xcf\xcf\xbc\xcf\xcf\xbc\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xbc\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcc\xcc\xcf\xcf\xcf\xcf\xcf\xcf' +'\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xbc\xbc\xcf\xcf\xb7\xcf\xb7\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcc\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc' +'\xb7\xbd\xb8\xb8\xbd\xbc\xbc\xb7\xb8\xbd\xbd\xb8\xbd\xbd\xbc\xb7\xbc\xb8\xb1\xb5\xbc\xb8\xbd\xbc\xbc\xbc\xb8\xbd\xbd\xb8\xb7\xb8\xb8\xbd\xbd\xb7\xbd\xb7\xbd\xb7\xb7\xb7\xb7\xb8\xb8\xbd\xb8\xbd\xbd\xbd\xbd\xbd\xb7\xb7\xb7\xb7\xbc\xbd\xbc\xbd\xb8\xb8\xbd\xbd' +'\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xb8\xbd\xbd\xbd\xb8\xbc\xbc\xbc\xbc\xbc\xb8\xbd\xbd\xbd\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbd\xb8\xb7\xbd\xbc\xb8\xb8\xb8\xb8\xbd\xbd\xb8\xb8\xbc\xbc\xb8\xb8\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd' +'\xbd\xbd\xb8\xb8\xbd\xbd\xb8\xb8\xbd\xbd\xbd\xbd\xbd\xbc\xbc\xbd\xbd\xbd\xbd\xbc\xbc\xb7\xbc\xbc\xbd\xb7\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbd\xbd\xbc\xb7\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbc\xbc\xbc\xbc\xbc\xbd\xb8' +'\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbd\xbd\xbd\xbd\xbd\xbc\xbc\xbd\xbd\xbc\xbc\xbc\xbc\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbc\xbc\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd' +'\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\x9bp\x9bp\xcf\xcf\xcf\xcf\xcf\xcf\xcc\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xd2\xd2\xcf\xcf\xcf\xcf\xbd\xbd\xcf\xcf\xcf\xcf\xcf\xcf\xcf\x9es\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca' +'\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xcf\xbc\xcf\xcf\xcf' +'\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xca\xcf\xcf\xcf\xcf\xcf\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf' +'\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xbc\xbc\xbc\xbc\xbc\xbc\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xd2\xd2\xd2\xd2\xcf\xcf\xcf\xd2\xcf\xcf\xd2\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf' +'\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\\\\\\\\\\\\\\\\\\[[[[[[[[[[[\\\\\\\\\\\\\\\\\\[[[' +'[[[[[[[[TTTTTTTTTSSSSSSSSSSS\xc7\xc7\xc7\xc7\xc7\xc7\xc7\xc7\xc7\xc7\xc7\xc7\xc7\xc7\xc7\xc7\xc7\xc7\xc7\xc7\xc7\xc7\xc7\xc7\xc7\xc7\xc8\xc8\xc8\xc8\xc8\xc8\xc8\xc8\xc8\xc8' +'\xc8\xc8\xc8\xc8\xc8\xc8\xc8\xc8\xc8\xc8\xc8\xc8\xc8\xc8\xc8\xc8\xc9\xc9\xc9\xc9\xc9\xc9\xc9\xc9\xc9\xc9\xc9\xc9\xc9\xc9\xc9\xc9\xc9\xc9\xc9\xc9\xc9\xc9\xc9\xc9\xc9\xc9^[[[[[[[[[[\\\\\\\\\\\\\\\\\\[\\' +'\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc' +'\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcf\xcf\xcf\xcf\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf' +'\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcf\xcf\xcc\xcc\xcc\xcc\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcc\xcc\xcf\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcc\xcc\xcf\xcf\xcc\xb7\xcf\xcf\xcf\xcf\xcc\xcc\xcf\xcf' +'\xcc\xb7\xcf\xcf\xcf\xcf\xcc\xcc\xcc\xcf\xcf\xcc\xcf\xcf\xcc\xcc\xcc\xcc\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcc\xcc\xcc\xcc\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcc\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xbc\xbc\xbc\xbc\xbc\xc1\xc1\xbc' +'\xcf\xcf\xcf\xcf\xcf\xcc\xcc\xcf\xcf\xcc\xcf\xcf\xcf\xcf\xcc\xcc\xcf\xcf\xcf\xcf\xd2\xd2\xcf\xcf\xcf\xcf\xcf\xcf\xcc\xcf\xcc\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf' +'\xcc\xcf\xcc\xcf\xcf\xcf\xcf\xcf\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcc\xcc\xcf\xcc\xcc\xcc\xcf\xcc\xcc\xcc\xcc\xcf\xcc\xcc\xcf\xb7\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xd2' +'\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xd2\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcc\xcc\xcf\xd2\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xd2\xd2\xca\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xd2\xd2\xcc' +'\xcf\xcf\xcf\xcf\xd2\xd2\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xd2\xcc\xcc\xcc\xcc\xcc\xd2\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcf\xcc\xcf\xcf\xcf\xcf\xcc\xcc\xd2\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xd2\xd2\xcc\xd2\xcc\xcc\xcc\xcc\xd2\xcc\xcc\xd2\xcc\xcc' +'\xcf\xcf\xcf\xcf\xcf\xd2\xcf\xcf\xcf\xcf\xd2\xd2\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xd2\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcc\xcf\xcf' +'\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xd2\xcf\xd2\xcf\xcf\xcf\xcf\xd2\xd2\xd2\xcf\xd2\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\x9bp\x9bp\x9bp\x9bp\x9bp\x9bp\x9bp\\\\\\\\\\\\\\\\\\[' +'^^^^^^^^^]^^^^^^^^^]\xcf\xd2\xd2\xd2\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xd2\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xd2' +'\xbd\xbc\xbc\xbd\xbd\x9bp\xbc\xbd\xbd\xbc\xbd\xbd\xbd\xbc\xbc\xbc\xbc\xbc\xbd\xbd\xbd\xbd\xbc\xbc\xbc\xbc\xbc\xbd\xbd\xbd\xbc\xbc\xbc\xbd\xbd\xbd\xbd\x9cq\x9cq\x9cq\x9cq\x9bp\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc' +'\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca' +'\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca' +'\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca' +'\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca' +'\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc' +'\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc' +'\xbc\xbc\xbc\x9bp\x9cq\x9bp\x9bp\x9bp\x9bp\x9bp\x9bp\x9bp\x9bp\x9bp\xbc\xbc\xbd\xbd\xbd\xbd\xbd\xbd\xbc\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbd\xbc\xbc\xbc\xbc\xbc\xbc\xbc' +'\xbd\xbd\xbd\xbd\xbd\xbd\xbc\xbc\xbc\xbd\xbc\xbc\xbc\xbc\xbd\xbd\xbd\xbd\xbd\xbc\xbd\xbd\xbc\xbc\x9bp\x9bp\xbd\xbc\xbc\xbc\xbc\xbd\xbc\xbd\xbd\xbd\xbc\xbc\xbd\xbd\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbd\xbd\xbd\xbd\xbd\xbd\xbc\xbc\x9bp\xbc\xbc' +'\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbc\xbd\xbd\xbd\xbd\xbc\xbc\xbd\xbc\xbd\xbc\xbc\xbd\xbc\xbd\xbd\xbd\xbd\xbc\xbc\xbc\xbc\xbc\xbd\xbd\xbc\xbc\xbc\xbc\xbc\xbc\xbd\xbd\xbd\xbc' +'\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbd\xbd\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbd\xbd\xbc\xbc\xbc\xbc\xbd\xbd\xbd\xbd\xbc\xbd\xbd\xbc\xbc\xbd\xbd\xbc\xbc\xbc\xbc\xbd\xbd\xbd\xbd\xbd\xbd\xbd' +'\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbc\xbc\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbc\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd' +'\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbc\xbc\xbc\xbc\xbc\xbd\xbc\xbd\xbc\xbc\xbc\xbd\xbd\xbd\xbd\xbd\xbc\xbc\xbc\xbc\xbc\xbd\xbd\xbd\xbc\xbc\xbc\xbc\xbd\xbc\xbc\xbc\xbd\xbd\xbd\xbd\xbd\xbc\xbd\xbc\xbc' +'\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xd2\xd2\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc' +'\xbc\xbc\xbc\xbc\xbc\xcf\xcf\xbc\xbc\xbc\xbc\xbc\xbc\xcf\xcf\xcf\xd2\xcf\xcf\xcf\xcf\xd2\xcc\xcc\xcc\xcc\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\x15\x15\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf' +'\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\x15\x15\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf' +'\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\x15\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xd0\x15' +'77777777777777777777777777777777777777777777777\x15\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b' +'\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x157\x1b777\x1b\x1b7\x1b7\x1b7\x1b7777\x1b7\x1b\x1b7\x1b\x1b\x1b\x1b\x1b\x1b%%77' +'7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b' +'7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b\x1b\xcf\xcf\xcf\xcf\xcf\xcf7\x1b7\x1b@@@7\x1b\x15\x15\x15\x15\x15\x90\x90\x90\x90]\x90\x90' +'\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x15\x1b\x15\x15\x15\x15\x15\x1b\x15\x150000000000000000' +'0000000000000000000000000000000000000000\x15\x15\x15\x15\x15\x15\x15$\x89\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15@' +'00000000000000000000000\x15\x15\x15\x15\x15\x15\x15\x15\x150000000\x150000000\x150000000\x150000000\x15' +'0000000\x150000000\x150000000\x150000000\x15@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@' +'\x90\x90zvzv\x90\x90\x90zv\x90zv\x90\x90\x90\x90\x90\x90\x90\x90\x90j\x90\x90j\x90zv\x90\x90zv\x9bp\x9bp\x9bp\x9bp\x90\x90\x90\x90\x90(\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90jj\x90\x90\x90\x90' +'j\x90\x9a\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\x15\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2' +'\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2' +'\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2' +'\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2' +'\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\x15\x15\x15\x15' +'\xd7\x94\x94\x94\xd2&1N\x9es\x9es\x9es\x9es\x9es\xd2\xd2\x9es\x9es\x9es\x9esk\x9drr\xd2NNNNNNNNNBBBB;;k&&&&&\xd2\xd2NNN&1\x94\xd2\xcf' +'\x15111111111111111111111111111111111111111111111111111111111111111' +'11111111111111111111111\x15\x15BB\xad\xad&&1k1111111111111111111111111111111' +'11111111111111111111111111111111111111111111111111111111111\x94&&&1' +'\x15\x15\x15\x15\x151111111111111111111111111111111111111111111\x15111111111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'111111111111111\x15\xcb\xcbZZZZ\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb111111111111111111111111111\x15\x15\x15\x15\x15' +'\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x151111111111111111' +'\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xd2\xd2\x15ZZZZZZZZZZ\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb' +'\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcbWWWWWWWW\xd2_______________\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xd2\xd2\xd2\xcb' +'ZZZZZZZZZZ\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb_______________' +'\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xd2\xd2\xd2\xd2\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\x15' +'\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb' +'\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xd2\xd2\xd2\xd2\xcb\xcb\xcb\xcb\xcb' +'\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb' +'\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xd2\xd2\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xd2' +'1111121111111111111111111111111111111111111111111111111111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'1112111111111111111111111111111111111111111111111111111111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'1111111111111111111111111111111111111111112111111111111111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'1111111111111211111111111111111111111111111111111111111111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'111111111111111111111111111111111111111111111111111111\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16' +'\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf' +'2112111212111111111111111111111111111111111111111111111111111111' +'1111111111111111111111111111121111111111111111111111111111111111' +'1111111111112111111121211111111111111111111111111111111111111112' +'2111111111111111111111111111111211111111211111111111111111111111' +'1111111111111211111111111111111111111111111111111111111111111111' +'1111111111111111111111111111111111111111111111112111111111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'1111211111111111111111111111111111111111111111111111111111111111' +'1111112111111111111111111111111111111111121212111111111111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'1212221111112111111111111111111111111111111111111111111111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'1222211111111111111111111111111111111111111111111111111111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'1111111111111111111111111112111111111111111111111111111111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'1111111111111111111111111111111111111111111111111211111112111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'1111111111111111111111111111111111111111111111111111111111211111' +'1111111111111111111111111111111111111111111111111111111111111111' +'1111111111111111111111111111111111111111111111111111111111111122' +'1111111111112221211111111111111111111111111111111111111111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'1111111111111111111111111111111111111111111111111111111111111121' +'1111111111111111111111111111111111111111111111111111111111111111' +'1111111111112111111111111111111111111111111111111111111111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'1111111111111111112111111111111111111111111111111111111111111111' +'1111112111111111111111111111111111111111111111111111111111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'1111111111111111111111211111111111111111111111111111111111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'1111111111111111111111111111111111111111111111111111111111111121' +'1111111111111111111111111111111111111111111111111111111111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'1111112111111111111111111111111111111111111111111111111111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'1111111111111111111111111111111111111111111121111111111111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'1111111111111111111111111111111111111111111111211112111111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'1111111111111111111111111111111111111111111111112111111111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'1111111111111111111111111111111112111111111111111111111111111111' +'1111112111112111111111111111111111111111111111111111111121111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'1111111111111111111111111111111111111111111111111111112111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'111111111111111111111111111111111111111111111111\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16' +'111111111111111111111&111111111111111111111111111111111111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'1111111111111\x15\x15\x15\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2' +'\xd2\xd2\xd2\xd2\xd2\xd2\xd2\x15\x15\x15\x15\x15\x15\x15\x15\x150000000000000000000000000000000000000000$$$$$$\x89\x89' +'000000000000$\x90\x90\x900000000000000000GGGGGGGGGG00\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b0@<<<\x90@@@@@@@@@@\x90)' +'7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b%%@@00000000000000000000000000000000' +'00000000000000000000000000000000000000KKKKKKKKKK@@\x89\x89\x89\x89\x89\x89\x15\x15\x15\x15\x15\x15\x15\x15' +'\xab\xab\xab\xab\xab\xab\xab\xab\xab\xab\xab\xab\xab\xab\xab\xab\xab\xab\xab\xab\xab\xab\xab)))))))))\xab\xab7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b\x1b\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b' +'7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b%\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b7\x1b7\x1b77\x1b' +'7\x1b7\x1b7\x1b7\x1b)\xa8\xa87\x1b7\x1b07\x1b7\x1b\x1b\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b7\x1b77777\x1b77777\x1b7\x1b7\x1b\x15\x15\x15\x15\x15\x15' +'\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x150%%\x1b00000' +'00@000@0000@00000000000000000000000::@@:\xcf\xcf\xcf\xcf\x15\x15\x15\x15XXXXXX\xca\xca\xa3\xc5\x15\x15\x15\x15\x15\x15' +'0000000000000000000000000000000000000000000000000000\x90\x90\x90\x90\x15\x15\x15\x15\x15\x15\x15\x15' +'::00000000000000000000000000000000000000000000000000::::::::::::' +'::::@@\x15\x15\x15\x15\x15\x15\x15\x15\x89\x89GGGGGGGGGG\x15\x15\x15\x15\x15\x15@@@@@@@@@@@@@@@@@@000000\x89\x89\x890\x8900@' +'GGGGGGGGGG0000000000000000000000000000@@@@@@@@\x89\x890000000000000000' +'0000000@@@@@@@@@@@::\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x8911111111111111111111111111111\x15\x15\x15' +'@@@:00000000000000000000000000000000000000000000000@::@@@@::@:::' +':\x89\x89\x89\x89\x89\x89\x89\x89\x89\x89\x89\x89\x89\x15$GGGGGGGGGG\x15\x15\x15\x15\x89\x8900000@$000000000GGGGGGGGGG00000\x15' +'00000000000000000000000000000000000000000@@@@@@::@@::@@\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'000@00000000@:\x15\x15GGGGGGGGGG\x15\x15\x89\x89\x89\x890000000000000000$000000\xca\xca\xca0:@:00' +'000000000000000000000000000000000000000000000000@0@@@00@@00000@@' +'0@0\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x1500$\x89\x8900000000000:@@::\x89\x890$$:@\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'\x15000000\x15\x15000000\x15\x15000000\x15\x15\x15\x15\x15\x15\x15\x15\x150000000\x150000000\x15\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b' +'\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\xa8%%%%\x1b\x1b\x1b\x1b\x1b\x1b\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b' +'\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b' +'00000000000000000000000000000000000::@::@::\x89:@\x15\x15GGGGGGGGGG\x15\x15\x15\x15\x15\x15' +'1111111111111111111111111111111111111111111111111111111111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'111111111111111111111111111111111111\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x150000000000000000' +'0000000\x15\x15\x15\x150000000000000000000000000000000000000000000000000\x15\x15\x15\x15' +'\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18' +'\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18' +'\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18' +'\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18' +'\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17' +'\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17' +'\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17' +'\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17' +'1111111111111111111111111111111111111111111111111111111111111111' +'1111111111111111111111111111111111111111111211111112111121111111' +'1111111111111111111111111111111111111111111111111121111111111111' +'1111111111111111121211111111111111111111111111111111111111111211' +'1111111111111111111111111111111111111111111111111111111111111111' +'1111111111111111111111111111111111111111111111\x16\x161111111111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'11111111111111111111111111\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16' +'\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x1b\x1b\x1b\x1b\x1b\x15\x15\x15\x15\x153@3333333333\xb13333333333333\x1533333\x153\x15' +'33\x1533\x153333333333,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,' +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,\xa7\xa7\xa7\xa7\xa7\xa7\xa7\xa7\xa7\xa7\xa7\xa7\xa7\xa7' +'\xa7\xa7\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,' +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,' +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,++++++,,,,,,,,,,,,,,,,,,,,,,,,,,,,' +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,' +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,' +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,o\x9a' +'\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,' +',,,,,,,,,,,,,,,,\x15\x15,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,' +',,,,,,,,\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15,,,,,,,,,,++\x9f\xcf\x15\x15' +'>>>>>>>>>>>>>>>>\x94\x94\x94\x95\x94\x94\x94\x9dr\x94\x15\x15\x15\x15\x15\x15@@@@@@@@@@@@@@@@\x94kkee\x9dr\x9dr\x9dr\x9dr\x9dr\x9d' +'r\x9dr\x9dr\x94\x94\x9dr\x94\x94\x94\x94eee\x82\x94\x83\x15\x94\x83\x94\x94k\x9es\x9es\x9es\x88\x94\x94\xb3h\xc2\xc2\xc1\x15\x94\xa5\x88\x94\x15\x15\x15\x15+,+,+\x15+,+,+,+,+,' +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,' +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,\x15\x15\x08' +'\x15\x8d\x8d\x85\xa1\x85\x8d\x8e\x98m\x8d\xb0}f~}DDDDDDDDDD~\x8d\xba\xb9\xba\x8d\x8d66666666666666666666666666\x98\x8dm\xaab' +'\xaa\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x98\xb9m\xb9\x98m\x8f\x99n\x8f\x8f.........."...............' +'..............................!!...............................\x15' +'\x15\x15......\x15\x15......\x15\x15......\x15\x15...\x15\x15\x15\xa1\xa1\xb9\xaa\xcd\xa1\xa1\x15\xce\xbb\xbb\xbb\xbb\xce\xce\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x0e\x0e\x0e\xcf\xcc\x15\x15' +'000000000000\x1500000000000000000000000000\x150000000000000000000\x1500\x150' +'00000000000000\x15\x1500000000000000\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'0000000000000000000000000000000000000000000000000000000000000000' +'00000000000000000000000000000000000000000000000000000000000\x15\x15\x15\x15\x15' +'\x89\x90\x89\x15\x15\x15\x15XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\x15\x15\x15\xca\xca\xca\xca\xca\xca\xca\xca\xca' +'OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO]]]]\xcf\xcf\xcf\xcf\xcf\xcf\xcf' +'\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf]]\xcf\xca\xca\x15\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\x15\x15\x15\x15\xcf\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca@\x15\x15' +'\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'00000000000000000000000000000\x15\x15\x1500000000000000000000000000000000' +'00000000000000000\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15@UUUUUUUUUUUUUUUUUUUUUUUUUUU\x15\x15\x15\x15' +'00000000000000000000000000000000XXXX\x15\x15\x15\x15\x15\x15\x15\x15\x150000000000000000000' +'0K00000000K\x15\x15\x15\x15\x1500000000000000000000000000000000000000@@@@@\x15\x15\x15\x15\x15' +'000000000000000000000000000000\x15\x8900000000000000000000000000000000' +'0000\x15\x15\x15\x1500000000\x89KKKKK\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'7777777777777777777777777777777777777777\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b' +'\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b000000000000000000000000000000000000000000000000' +'000000000000000000000000000000\x15\x15GGGGGGGGGG\x15\x15\x15\x15\x15\x157777777777777777' +'77777777777777777777\x15\x15\x15\x15\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x15\x15\x15\x15' +'0000000000000000000000000000000000000000\x15\x15\x15\x15\x15\x15\x15\x150000000000000000' +'000000000000000000000000000000000000\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x89\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'0000000000000000000000000000000000000000000000000000000\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'0000000000000000000000\x15\x15\x15\x15\x15\x15\x15\x15\x15\x1500000000\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'333333\x15\x153\x1533333333333333333333333333333333333333333333\x1533\x15\x15\x153\x15\x153' +'3333333333333333333333\x15\x96````````33333333333333333333333\xd3\xd3```````' +'3333333333333333333333333333333\x15\x15\x15\x15\x15\x15\x15\x15`````````\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x153333333333333333333\x1533\x15\x15\x15\x15\x15`````' +'3333333333333333333333``````\x15\x15\x15\x9033333333333333333333333333\x15\x15\x15\x15\x15\x96' +'\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'33333333333333333333333333333333333333333333333333333333\x15\x15\x15\x15``33' +'````````````````\x15\x15``````````````````````````````````````````````' +'3@@@\x15@@\x15\x15\x15\x15\x15@@@@3333\x15333\x1533333333333333333333333333333\x15\x15@@@\x15\x15\x15\x15@' +'aaaa`````\x15\x15\x15\x15\x15\x15\x15\x96\x96\x96\x96\x96\x96\x96\x96\x96\x15\x15\x15\x15\x15\x15\x1533333333333333333333333333333``\x96' +'33333333333333333333333333333```\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'33333333\xd33333333333333333333333333333@@\x15\x15\x15\x15`````\x96\x96\x96\x96\x96\x96\x96\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'333333333333333333333333333333333333333333333333333333\x15\x15\x15\x90\x90\x90\x90\x90\x90\x90' +'3333333333333333333333\x15\x15````````3333333333333333333\x15\x15\x15\x15\x15````````' +'333333333333333333\x15\x15\x15\x15\x15\x15\x15\x96\x96\x96\x96\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15```````\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'3333333333333333333333333333333333333333333333333333333333333333' +'333333333\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'999999999999999999999999999999999999999999999999999\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'\x1d\x1d\x1d\x1d\x1d\x1d\x1d\x1d\x1d\x1d\x1d\x1d\x1d\x1d\x1d\x1d\x1d\x1d\x1d\x1d\x1d\x1d\x1d\x1d\x1d\x1d\x1d\x1d\x1d\x1d\x1d\x1d\x1d\x1d\x1d\x1d\x1d\x1d\x1d\x1d\x1d\x1d\x1d\x1d\x1d\x1d\x1d\x1d\x1d\x1d\x1d\x15\x15\x15\x15\x15\x15\x15``````' +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,@@@@\x15\x15\x15\x15\x15\x15\x15\x15CCCCCCCCCC\x15\x15\x15\x15\x15\x15' +'\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15RRRRRRRRRQQQQQQQQQQQQQQQQQQQQQQ\x15' +'\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'33333333333333333333333333333``````````3\x15\x15\x15\x15\x15\x15\x15\x15,,,,,,,,,,,,,,,,' +',,,,,,@@@@@@@@@@@PPPP{{{{{\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +':@:00000000000000000000000000000000000000000000000000000@@@@@@@@' +'@@@@@@@\x89\x89\x89\x89\x89\x89\x89\x15\x15\x15\x15^^^^^^^^^]]]]]]]]]]]GGGGGGGGGG\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15@' +'@@:000000000000000000000000000000000000000000000:::@@@@::@@\x89\x89\n\x89\x89' +'\x89\x89\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\n\x15\x150000000000000000000000000\x15\x15\x15\x15\x15\x15\x15GGGGGGGGGG\x15\x15\x15\x15\x15\x15' +'@@@000000000000000000000000000000000000@@@@@:@@@@@@@@\x15GGGGGGGGGG' +'\x89\x89\x89\x890::\x15\x15\x15\x15\x15\x15\x15\x15\x1500000000000000000000000000000000000@\x89\x890\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'@@:000000000000000000000000000000000000000000000000:::@@@@@@@@@:' +':0000\x89\x89\x89\x89@@@@\x89\x15\x15GGGGGGGGGG0\x890\x89\x89\x89\x15XXXXXXXXXXXXXXXXXXXX\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'000000000000000000\x150000000000000000000000000:::@@@::@:@@\x89\x89\x89\x89\x89\x89@\x15' +'\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'0000000\x150\x150000\x15000000000000000\x150000000000\x89\x15\x15\x15\x15\x15\x150000000000000000' +'0000000000000000000000000000000@:::@@@@@@@@\x15\x15\x15\x15\x15GGGGGGGGGG\x15\x15\x15\x15\x15\x15' +'@@::\x1500000000\x15\x1500\x15\x150000000000000000000000\x150000000\x1500\x1500000\x15@@0::' +'@::::\x15\x15::\x15\x15:::\x15\x150\x15\x15\x15\x15\x15\x15:\x15\x15\x15\x15\x1500000::\x15\x15@@@@@@@\x15\x15\x15@@@@@\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'00000000000000000000000000000000000000000000000000000:::@@@@@@@@' +'::@@@:@0000\x89\x89\x89\x89\x89GGGGGGGGGG\x15\x89\x15\x89@\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'000000000000000000000000000000000000000000000000:::@@@@@@:@::::@' +'@:@@00\x890\x15\x15\x15\x15\x15\x15\x15\x15GGGGGGGGGG\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'00000000000000000000000000000000000000000000000:::@@@@\x15\x15::::@@:@' +'@\x89\x89\x89\x89\x89\x89\x89\x89\x89\x89\x89\x89\x89\x89\x89\x89\x89\x89\x89\x89\x89\x89\x890000@@\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'000000000000000000000000000000000000000000000000:::@@@@@@@@::@:@' +'@\x89\x89\x890\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15GGGGGGGGGG\x15\x15\x15\x15\x15\x15\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'0000000000000000000000000000000000000000000@:@::@@@@@@:@\x15\x15\x15\x15\x15\x15\x15\x15' +'GGGGGGGGGG\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'000000000000000000000000000\x15\x15@@@::@@@@:@@@@@\x15\x15\x15\x15GGGGGGGGGGXX\x89\x89\x89\xca' +'\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'00000000000000000000000000000000000000000000:::@@@@@@@@@:@@\x89\x15\x15\x15\x15' +'\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x1577777777777777777777777777777777' +'\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1bGGGGGGGGGGXXXXXXXXX\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x150' +'\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'0@@@@@@==@@0000000000000000000000000000000000000000@@@@@@:0@@@@\x89' +'\x89\x89\x89\x89\x89\x89\x89@\x15\x15\x15\x15\x15\x15\x15\x150@@@@@@::@@@000000000000000000000000000000000000' +'0000\x15\x150000@@@@@@@@@@@@@:@@\x89\x89\x890\x89\x89\x89\x89\x89\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'000000000000000000000000000000000000000000000000000000000\x15\x15\x15\x15\x15\x15\x15' +'000000000\x150000000000000000000000000000000000000:@@@@@@@\x15@@@@@@:=' +'0\x89\x89\x89\x89\x89\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15GGGGGGGGGGXXXXXXXXXXXXXXXXXXX\x15\x15\x15\x89\x8900000000000000' +'0000000000000000\x15\x15@@@@@@@@@@@@@@@@@@@@@@\x15:@@@@@@@:@@:@@\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'0000000\x1500\x1500000000000000000000000000000000000000@@@@@@\x15\x15\x15@\x15@@\x15@' +'@@@@@@0@\x15\x15\x15\x15\x15\x15\x15\x15GGGGGGGGGG\x15\x15\x15\x15\x15\x15000000\x1500\x150000000000000000000000' +'0000000000:::::\x15@@\x15::@:@0\x15\x15\x15\x15\x15\x15\x15GGGGGGGGGG\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x150000000000000000000@@::\x89\x89\x15\x15\x15\x15\x15\x15\x15' +'0000000000000000000000000000000000000000000000000000000000000000' +'0000000000000000000000000000000000000000000000000000000000000000' +'00000000000000000000000000\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK' +'KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK\x15\x89\x89\x89\x89\x89\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'0000000000000000000000000000000000000000000000000000000000000000' +'0000000000000000000000000000000000000000000000000000000000000000' +'0000000000000000000000000000000000000000000000000000000000000000' +'0000\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'00000000000000000000000000000000000000000000000\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'0000000000000000000000000000000000000000000000000000000000000000' +'0000000\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'000000000000000000000000000000000000000000000000000000000\x15\x15\x15\x15\x15\x15\x15' +'0000000000000000000000000000000\x15GGGGGGGGGG\x15\x15\x15\x15\x89\x89\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15000000000000000000000000000000\x15\x15@@@@@\x89\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'000000000000000000000000000000000000000000000000@@@@@@@\x89\x89\x89\x89\x89\xca\xca\xca\xca' +'$$$$\x89\xca\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15GGGGGGGGGG\x15XXXXXXX\x15000000000000000000000\x15\x15\x15\x15\x15000' +'0000000000000000\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'77777777777777777777777777777777\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b' +'XXXXXXXXXXXXXXXXXXXXXXX\x89\x89\x89\x89\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'0000000000000000000000000000000000000000000000000000000000000000' +'00000\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x150::::::::::::::::::::::::::::::::::::::::::::::\x15' +'\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15@@@@$$$$$$$$$$$$$\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15&&\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'1111111111111111111111111111111111111111111111111111111111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'11111111111111111111111111111111111111111111111111\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'1111111111111111111111111111111111111111111111111111111111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'111111111111111111111111111111111111111111111111111\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'1111111111111111111111111111111\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x151111111111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'111111111111111111111111111111111111111111111111111111111111\x15\x15\x15\x15' +'0000000000000000000000000000000000000000000000000000000000000000' +'0000000000000000000000000000000000000000000\x15\x15\x15\x15\x150000000000000\x15\x15\x15' +'000000000\x15\x15\x15\x15\x15\x15\x150000000000\x15\x15\xca@@\x89\x08\x08\x08\x08\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca' +'\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca' +'\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca' +'\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\x15\x15\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca' +'\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca::@@@\xca\xca\xca::::::\x08\x08\x08\x08\x08\x08\x08\x08@@@@@' +'@@@\xca\xca@@@@@@@\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca@@@@\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca' +'\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf' +'\xcf\xcf@@@\xcf\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15XXXXXXXXXXXXXXXXXXXX\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf' +'\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\x15\x15\x15\x15\x15\x15\x15\x15\x15XXXXXXXXXXXXXXXXXXXXXXXXX\x15\x15\x15\x15\x15\x15\x15' +'\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'77777777777777777777777777\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b777777777777' +'77777777777777\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x15\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b777777777777777777777777' +'77\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b7\x1577\x15\x157\x15\x1577\x15\x157777\x1577777777\x1b\x1b\x1b\x1b\x15\x1b\x15\x1b\x1b\x1b' +'\x1b\x1b\x1b\x1b\x15\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b77777777777777777777777777\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b' +'\x1b\x1b\x1b\x1b77\x157777\x15\x1577777777\x157777777\x15\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b77\x157777\x15' +'77777\x157\x15\x15\x157777777\x15\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b77777777777777777777' +'777777\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b77777777777777777777777777\x1b\x1b\x1b\x1b\x1b\x1b' +'\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b77777777777777777777777777\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b' +'\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b77777777777777777777777777\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b7777' +'7777777777777777777777\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b7777777777777777' +'7777777777\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x15\x15777777777777777777777777' +'7\xb6\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\xbd\x1b\x1b\x1b\x1b\x1b\x1b7777777777777777777777777\xb6\x1b\x1b\x1b\x1b' +'\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\xbd\x1b\x1b\x1b\x1b\x1b\x1b7777777777777777777777777\xb6\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b' +'\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\xbd\x1b\x1b\x1b\x1b\x1b\x1b7777777777777777777777777\xb6\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b' +'\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\xbd\x1b\x1b\x1b\x1b\x1b\x1b7777777777777777777777777\xb6\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b' +'\x1b\x1b\x1b\xbd\x1b\x1b\x1b\x1b\x1b\x1b7\x1b\x15\x15EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE' +'@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\xca\xca\xca\xca@@@@@' +'@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\xca\xca\xca\xca\xca\xca\xca\xca@\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca' +'\xca\xca\xca\xca@\xca\xca\x89\x89\x89\x89\x89\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15@@@@@\x15@@@@@@@@@@@@@@@\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'@@@@@@@\x15@@@@@@@@@@@@@@@@@\x15\x15@@@@@@@\x15@@\x15@@@@@\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'3333333333333333333333333333333333333333333333333333333333333333' +'3333333333333333333333333333333333333333333333333333333333333333' +'3333333333333333333333333333333333333333333333333333333333333333' +'33333\x15\x15`````````@@@@@@@\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'9999999999999999999999999999999999\x1d\x1d\x1d\x1d\x1d\x1d\x1d\x1d\x1d\x1d\x1d\x1d\x1d\x1d\x1d\x1d\x1d\x1d\x1d\x1d\x1d\x1d\x1d\x1d\x1d\x1d\x1d\x1d\x1d\x1d' +'\x1d\x1d\x1d\x1d@@@@@@@\x15\x15\x15\x15\x15HHHHHHHHHH\x15\x15\x15\x15\x96\x96\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15PPPPPPPPPPPPPPP' +'PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP\xc3PPP\x9fPPPP\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +',,,,\x15,,,,,,,,,,,,,,,,,,,,,,,,,,,\x15,,\x15,\x15\x15,\x15,,,,,,,,,,\x15,,,,\x15,\x15,\x15\x15\x15\x15' +'\x15\x15,\x15\x15\x15\x15,\x15,\x15,\x15,,,\x15,,\x15,\x15\x15,\x15,\x15,\x15,\x15,\x15,,\x15,\x15\x15,,,,\x15,,,,,,,\x15,,,,\x15,,,,\x15,\x15' +',,,,,,,,,,\x15,,,,,,,,,,,,,,,,,\x15\x15\x15\x15\x15,,,\x15,,,,,\x15,,,,,,,,,,,,,,,,,\x15\x15\x15\x15' +'\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\xbc\xbc\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'\xcf\xcf\xcf\xcf\xd2\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\x15\x15\x15\x15\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf' +'\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf' +'\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\x15\x15\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf' +'\x15\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xd2\x15\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'TTTTTTTTTTT]]\x15\x15\x15\xc7\xc7\xc7\xc7\xc7\xc7\xc7\xc7\xc7\xc7\xc7\xc7\xc7\xc7\xc7\xc7\xc7\xc7\xc7\xc7\xc7\xc7\xc7\xc7\xc7\xc7\xc7\xc7\xc7\xc7\xca\xcf\xc8\xc8\xc8\xc8\xc8\xc8\xc8\xc8\xc8\xc8\xc8\xc8\xc8\xc8\xc8\xc8' +'\xc8\xc8\xc8\xc8\xc8\xc8\xc8\xc8\xc8\xc8\xc7\xc7\xc7\xc7\xc7\xc7\xc8\xc8\xc8\xc8\xc8\xc8\xc8\xc8\xc8\xc8\xc8\xc8\xc8\xc8\xc8\xc8\xc8\xc8\xc8\xc8\xc8\xc8\xc8\xc8\xc8\xc8\xcf\xcf\x15\x15\x15\x15\xc8\xc8\xc8\xc8\xc8\xc8\xc8\xc8\xc8\xc8\xc8\xc8\xc8\xc8\xc8\xc8' +'\xc8\xc8\xc8\xc8\xc8\xc8\xc8\xc8\xc8\xc8\xc7\xc7\xc7\xc7\xcb\xc7\xc7\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xc7\xc7\xc7\xc7\xc7\xc7\xc7\xc7\xc7\xc7\xc7\xc7\xc7\xc7\xc7\xc7\xc7\xc7\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca\xca' +'\xcb\xcb\xcb\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\x15\x15\x15\x15' +'\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\xcb\x15\x15\x15\x15\x15\x15\x15\xcb\xcb\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\xd2\xd2\xd2\xd2\xd2\xd2\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xcf\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2' +'\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xcf\xd2\xd2' +'\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2' +'\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xcf\xcf\xcf\xcf\xd2\xd2\xd2\xd2\xd2\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xcf\xcf\xcf\xd2\xcf\xcf\xcf\xd2\xd2\xd2\xad\xad\xad\xad\xad' +'\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xcf' +'\xd2\xcf\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2' +'\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2' +'\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xcf\xcf\xd2' +'\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xcf\xcf' +'\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xd2\xd2\xd2\xd2\xcf\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xd2\xcf\xcf\xcf\xcf\xcf' +'\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xd2\xd2\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xd2\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf' +'\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xd2\xd2\xd2\xd2\xd2' +'\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2' +'\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf' +'\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2' +'\xd2\xd2\xd2\xd2\xd2\xd2\xcf\xcf\xcf\xcf\xcf\xcf\xd2\xcf\xcf\xcf\xd2\xd2\xd2\xcf\xcf\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xd2\xd2\x15\x15\x15\xcf\xcf\xcf\xcf\xd2\xd2\xd2\xd2\xd2\xd2\x15\x15\x15\x15\x15\x15' +'\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf' +'\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf' +'\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\x15\x15\x15\x15\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf' +'\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\x15\x15\x15\x15\x15\x15\x15\x15\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\x15\x15\x15\x15\x15\x15\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf' +'\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\x15\x15\x15\x15\x15\x15\x15\x15\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\x15\x15\x15\x15\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\x15' +'\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\x15\x15\xd2\xd2\xd2\xd2\x15\x15\x15\xd2\x15\xd2\xd2\xd2\xd2' +'\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\x15\x15\x15\x15\x15\x15' +'\xd2\xd2\xd2\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2' +'\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'1211111111111111111111111111111111111111111111111111111111111111' +'1111111111111111111111111111111111112111111111111111111111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'1111111111111111111111111111111111211111111111111111111111111111' +'1111111111111111111111111111111112111111111111111111111111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'1111111111111111111111111111111111111111112111111111111111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'1112111111112111111111111111211111111111111111111111111111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'1111111111111111111111111111111111111111112111111111111111111211' +'1111111111111111111111111211111111111111111111111111111111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'1111111111111111211111111111111111111111111111111111111111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'1111111111111111111111112111111111111111111111111111111111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'1111111111111111111111111112111111111111111111111111111111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'1111111111111111111111111111111111111111111112111111111111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'11111111111111111111111\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16' +'11111111111111111111111111111111111111111111111111111\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16' +'1111111111111111111111111111111111111111111111111111111111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'111111111111111111111111111111\x16\x1611111111111111111111111111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'1111111111111111111111111111111111\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x161111111111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'111111111111111111111111111111111\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16' +'\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16' +'\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16' +'\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16' +'\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16' +'111111111111111111111111111111\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16' +'\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16' +'\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16' +'\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16' +'\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16' +'\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16' +'\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16' +'\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x15\x15' +'\x15\x08\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08' +'\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08' +'\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>' +'>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>' +'>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>' +'>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17' +'\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17' +'\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17' +'\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x17\x15\x15' +) + +def _get_record(code): + return _db_records[ord(_db_pages[(ord(_db_pgtbl[code >> 8]) << 8) + (code & 255)])] + +def category(code): return _get_record(code)[0] +def bidirectional(code): return _get_record(code)[1] +def east_asian_width(code): return _get_record(code)[2] +def isspace(code): return _get_record(code)[3] & 1 != 0 +def isalpha(code): return _get_record(code)[3] & 2 != 0 +def islinebreak(code): return _get_record(code)[3] & 4 != 0 +def isnumeric(code): return _get_record(code)[3] & 64 != 0 +def isdigit(code): return _get_record(code)[3] & 128 != 0 +def isdecimal(code): return _get_record(code)[3] & 256 != 0 +def isalnum(code): return _get_record(code)[3] & 66 != 0 +def isupper(code): return _get_record(code)[3] & 8 != 0 +def istitle(code): return _get_record(code)[3] & 16 != 0 +def islower(code): return _get_record(code)[3] & 32 != 0 +def iscased(code): return _get_record(code)[3] & 56 != 0 +def isxidstart(code): return _get_record(code)[3] & 1024 != 0 +def isxidcontinue(code): return _get_record(code)[3] & 2048 != 0 +def isprintable(code): return _get_record(code)[3] & 4096 != 0 +def mirrored(code): return _get_record(code)[3] & 512 != 0 +def iscaseignorable(code): return _get_record(code)[3] & 8192 != 0 +_decimal = { +3558: 0, +3559: 1, +3560: 2, +3561: 3, +3562: 4, +3563: 5, +3564: 6, +3565: 7, +3566: 8, +3567: 9, +43504: 0, +43505: 1, +43506: 2, +43507: 3, +43508: 4, +43509: 5, +43510: 6, +43511: 7, +43512: 8, +43513: 9, +68912: 0, +68913: 1, +68914: 2, +68915: 3, +68916: 4, +68917: 5, +68918: 6, +68919: 7, +68920: 8, +68921: 9, +69734: 0, +69735: 1, +69736: 2, +69737: 3, +69738: 4, +69739: 5, +69740: 6, +69741: 7, +69742: 8, +69743: 9, +69872: 0, +69873: 1, +69874: 2, +69875: 3, +69876: 4, +69877: 5, +69878: 6, +69879: 7, +69880: 8, +69881: 9, +69942: 0, +69943: 1, +69944: 2, +69945: 3, +69946: 4, +69947: 5, +69948: 6, +69949: 7, +69950: 8, +69951: 9, +70096: 0, +70097: 1, +70098: 2, +70099: 3, +70100: 4, +70101: 5, +70102: 6, +70103: 7, +70104: 8, +70105: 9, +70384: 0, +70385: 1, +70386: 2, +70387: 3, +70388: 4, +70389: 5, +70390: 6, +70391: 7, +70392: 8, +70393: 9, +70736: 0, +70737: 1, +70738: 2, +70739: 3, +70740: 4, +70741: 5, +70742: 6, +70743: 7, +70744: 8, +70745: 9, +70864: 0, +70865: 1, +70866: 2, +70867: 3, +70868: 4, +70869: 5, +70870: 6, +70871: 7, +70872: 8, +70873: 9, +71248: 0, +71249: 1, +71250: 2, +71251: 3, +71252: 4, +71253: 5, +71254: 6, +71255: 7, +71256: 8, +71257: 9, +71360: 0, +71361: 1, +71362: 2, +71363: 3, +71364: 4, +71365: 5, +71366: 6, +71367: 7, +71368: 8, +71369: 9, +71472: 0, +71473: 1, +71474: 2, +71475: 3, +71476: 4, +71477: 5, +71478: 6, +71479: 7, +71480: 8, +71481: 9, +71904: 0, +71905: 1, +71906: 2, +71907: 3, +71908: 4, +71909: 5, +71910: 6, +71911: 7, +71912: 8, +71913: 9, +72784: 0, +72785: 1, +72786: 2, +72787: 3, +72788: 4, +72789: 5, +72790: 6, +72791: 7, +72792: 8, +72793: 9, +73040: 0, +73041: 1, +73042: 2, +73043: 3, +73044: 4, +73045: 5, +73046: 6, +73047: 7, +73048: 8, +73049: 9, +73120: 0, +73121: 1, +73122: 2, +73123: 3, +73124: 4, +73125: 5, +73126: 6, +73127: 7, +73128: 8, +73129: 9, +92768: 0, +92769: 1, +92770: 2, +92771: 3, +92772: 4, +92773: 5, +92774: 6, +92775: 7, +92776: 8, +92777: 9, +93008: 0, +93009: 1, +93010: 2, +93011: 3, +93012: 4, +93013: 5, +93014: 6, +93015: 7, +93016: 8, +93017: 9, +125264: 0, +125265: 1, +125266: 2, +125267: 3, +125268: 4, +125269: 5, +125270: 6, +125271: 7, +125272: 8, +125273: 9, +} + +_decimal_corrected = { +6618: None, +} +_digit = { +3558: 0, +3559: 1, +3560: 2, +3561: 3, +3562: 4, +3563: 5, +3564: 6, +3565: 7, +3566: 8, +3567: 9, +43504: 0, +43505: 1, +43506: 2, +43507: 3, +43508: 4, +43509: 5, +43510: 6, +43511: 7, +43512: 8, +43513: 9, +68912: 0, +68913: 1, +68914: 2, +68915: 3, +68916: 4, +68917: 5, +68918: 6, +68919: 7, +68920: 8, +68921: 9, +69714: 1, +69715: 2, +69716: 3, +69717: 4, +69718: 5, +69719: 6, +69720: 7, +69721: 8, +69722: 9, +69734: 0, +69735: 1, +69736: 2, +69737: 3, +69738: 4, +69739: 5, +69740: 6, +69741: 7, +69742: 8, +69743: 9, +69872: 0, +69873: 1, +69874: 2, +69875: 3, +69876: 4, +69877: 5, +69878: 6, +69879: 7, +69880: 8, +69881: 9, +69942: 0, +69943: 1, +69944: 2, +69945: 3, +69946: 4, +69947: 5, +69948: 6, +69949: 7, +69950: 8, +69951: 9, +70096: 0, +70097: 1, +70098: 2, +70099: 3, +70100: 4, +70101: 5, +70102: 6, +70103: 7, +70104: 8, +70105: 9, +70384: 0, +70385: 1, +70386: 2, +70387: 3, +70388: 4, +70389: 5, +70390: 6, +70391: 7, +70392: 8, +70393: 9, +70736: 0, +70737: 1, +70738: 2, +70739: 3, +70740: 4, +70741: 5, +70742: 6, +70743: 7, +70744: 8, +70745: 9, +70864: 0, +70865: 1, +70866: 2, +70867: 3, +70868: 4, +70869: 5, +70870: 6, +70871: 7, +70872: 8, +70873: 9, +71248: 0, +71249: 1, +71250: 2, +71251: 3, +71252: 4, +71253: 5, +71254: 6, +71255: 7, +71256: 8, +71257: 9, +71360: 0, +71361: 1, +71362: 2, +71363: 3, +71364: 4, +71365: 5, +71366: 6, +71367: 7, +71368: 8, +71369: 9, +71472: 0, +71473: 1, +71474: 2, +71475: 3, +71476: 4, +71477: 5, +71478: 6, +71479: 7, +71480: 8, +71481: 9, +71904: 0, +71905: 1, +71906: 2, +71907: 3, +71908: 4, +71909: 5, +71910: 6, +71911: 7, +71912: 8, +71913: 9, +72784: 0, +72785: 1, +72786: 2, +72787: 3, +72788: 4, +72789: 5, +72790: 6, +72791: 7, +72792: 8, +72793: 9, +73040: 0, +73041: 1, +73042: 2, +73043: 3, +73044: 4, +73045: 5, +73046: 6, +73047: 7, +73048: 8, +73049: 9, +73120: 0, +73121: 1, +73122: 2, +73123: 3, +73124: 4, +73125: 5, +73126: 6, +73127: 7, +73128: 8, +73129: 9, +92768: 0, +92769: 1, +92770: 2, +92771: 3, +92772: 4, +92773: 5, +92774: 6, +92775: 7, +92776: 8, +92777: 9, +93008: 0, +93009: 1, +93010: 2, +93011: 3, +93012: 4, +93013: 5, +93014: 6, +93015: 7, +93016: 8, +93017: 9, +125264: 0, +125265: 1, +125266: 2, +125267: 3, +125268: 4, +125269: 5, +125270: 6, +125271: 7, +125272: 8, +125273: 9, +} + +_digit_corrected = { +} +_numeric = { +188: 1.0 / 4.0, +189: 1.0 / 2.0, +190: 3.0 / 4.0, +2548: 1.0 / 16.0, +2549: 1.0 / 8.0, +2550: 3.0 / 16.0, +2551: 1.0 / 4.0, +2552: 3.0 / 4.0, +2930: 1.0 / 4.0, +2931: 1.0 / 2.0, +2932: 3.0 / 4.0, +2933: 1.0 / 16.0, +2934: 1.0 / 8.0, +2935: 3.0 / 16.0, +3416: 1.0 / 160.0, +3417: 1.0 / 40.0, +3418: 3.0 / 80.0, +3419: 1.0 / 20.0, +3420: 1.0 / 10.0, +3421: 3.0 / 20.0, +3422: 1.0 / 5.0, +3443: 1.0 / 4.0, +3444: 1.0 / 2.0, +3445: 3.0 / 4.0, +3446: 1.0 / 16.0, +3447: 1.0 / 8.0, +3448: 3.0 / 16.0, +3558: 0.0, +3559: 1.0, +3560: 2.0, +3561: 3.0, +3562: 4.0, +3563: 5.0, +3564: 6.0, +3565: 7.0, +3566: 8.0, +3567: 9.0, +3882: 1.0 / 2.0, +3883: 3.0 / 2.0, +3884: 5.0 / 2.0, +3885: 7.0 / 2.0, +3886: 9.0 / 2.0, +3887: 11.0 / 2.0, +3888: 13.0 / 2.0, +3889: 15.0 / 2.0, +3890: 17.0 / 2.0, +3891: -1.0 / 2.0, +8528: 1.0 / 7.0, +8529: 1.0 / 9.0, +8530: 1.0 / 10.0, +8531: 1.0 / 3.0, +8532: 2.0 / 3.0, +8533: 1.0 / 5.0, +8534: 2.0 / 5.0, +8535: 3.0 / 5.0, +8536: 4.0 / 5.0, +8537: 1.0 / 6.0, +8538: 5.0 / 6.0, +8539: 1.0 / 8.0, +8540: 3.0 / 8.0, +8541: 5.0 / 8.0, +8542: 7.0 / 8.0, +11517: 1.0 / 2.0, +12872: 10.0, +12873: 20.0, +12874: 30.0, +12875: 40.0, +12876: 50.0, +12877: 60.0, +12878: 70.0, +12879: 80.0, +43056: 1.0 / 4.0, +43057: 1.0 / 2.0, +43058: 3.0 / 4.0, +43059: 1.0 / 16.0, +43060: 1.0 / 8.0, +43061: 3.0 / 16.0, +43504: 0.0, +43505: 1.0, +43506: 2.0, +43507: 3.0, +43508: 4.0, +43509: 5.0, +43510: 6.0, +43511: 7.0, +43512: 8.0, +43513: 9.0, +65856: 1.0 / 4.0, +65857: 1.0 / 2.0, +65909: 1.0 / 2.0, +65910: 1.0 / 2.0, +65911: 2.0 / 3.0, +65912: 3.0 / 4.0, +65931: 1.0 / 4.0, +66273: 1.0, +66274: 2.0, +66275: 3.0, +66276: 4.0, +66277: 5.0, +66278: 6.0, +66279: 7.0, +66280: 8.0, +66281: 9.0, +66282: 10.0, +66283: 20.0, +66284: 30.0, +66285: 40.0, +66286: 50.0, +66287: 60.0, +66288: 70.0, +66289: 80.0, +66290: 90.0, +66291: 100.0, +66292: 200.0, +66293: 300.0, +66294: 400.0, +66295: 500.0, +66296: 600.0, +66297: 700.0, +66298: 800.0, +66299: 900.0, +67705: 1.0, +67706: 2.0, +67707: 3.0, +67708: 4.0, +67709: 5.0, +67710: 10.0, +67711: 20.0, +67751: 1.0, +67752: 2.0, +67753: 3.0, +67754: 4.0, +67755: 4.0, +67756: 5.0, +67757: 10.0, +67758: 20.0, +67759: 100.0, +67835: 1.0, +67836: 5.0, +67837: 10.0, +67838: 20.0, +67839: 100.0, +68028: 11.0 / 12.0, +68029: 1.0 / 2.0, +68032: 1.0, +68033: 2.0, +68034: 3.0, +68035: 4.0, +68036: 5.0, +68037: 6.0, +68038: 7.0, +68039: 8.0, +68040: 9.0, +68041: 10.0, +68042: 20.0, +68043: 30.0, +68044: 40.0, +68045: 50.0, +68046: 60.0, +68047: 70.0, +68050: 100.0, +68051: 200.0, +68052: 300.0, +68053: 400.0, +68054: 500.0, +68055: 600.0, +68056: 700.0, +68057: 800.0, +68058: 900.0, +68059: 1000.0, +68060: 2000.0, +68061: 3000.0, +68062: 4000.0, +68063: 5000.0, +68064: 6000.0, +68065: 7000.0, +68066: 8000.0, +68067: 9000.0, +68068: 10000.0, +68069: 20000.0, +68070: 30000.0, +68071: 40000.0, +68072: 50000.0, +68073: 60000.0, +68074: 70000.0, +68075: 80000.0, +68076: 90000.0, +68077: 100000.0, +68078: 200000.0, +68079: 300000.0, +68080: 400000.0, +68081: 500000.0, +68082: 600000.0, +68083: 700000.0, +68084: 800000.0, +68085: 900000.0, +68086: 1.0 / 12.0, +68087: 2.0 / 12.0, +68088: 3.0 / 12.0, +68089: 4.0 / 12.0, +68090: 5.0 / 12.0, +68091: 6.0 / 12.0, +68092: 7.0 / 12.0, +68093: 8.0 / 12.0, +68094: 9.0 / 12.0, +68095: 10.0 / 12.0, +68168: 1.0 / 2.0, +68253: 1.0, +68254: 10.0, +68255: 20.0, +68331: 1.0, +68332: 5.0, +68333: 10.0, +68334: 20.0, +68335: 100.0, +68521: 1.0, +68522: 2.0, +68523: 3.0, +68524: 4.0, +68525: 10.0, +68526: 20.0, +68527: 100.0, +68858: 1.0, +68859: 5.0, +68860: 10.0, +68861: 50.0, +68862: 100.0, +68863: 1000.0, +68912: 0.0, +68913: 1.0, +68914: 2.0, +68915: 3.0, +68916: 4.0, +68917: 5.0, +68918: 6.0, +68919: 7.0, +68920: 8.0, +68921: 9.0, +69243: 1.0 / 2.0, +69244: 1.0 / 4.0, +69245: 1.0 / 3.0, +69246: 2.0 / 3.0, +69405: 1.0, +69406: 2.0, +69407: 3.0, +69408: 4.0, +69409: 5.0, +69410: 10.0, +69411: 20.0, +69412: 30.0, +69413: 100.0, +69414: 1.0 / 2.0, +69457: 1.0, +69458: 10.0, +69459: 20.0, +69460: 100.0, +69714: 1.0, +69715: 2.0, +69716: 3.0, +69717: 4.0, +69718: 5.0, +69719: 6.0, +69720: 7.0, +69721: 8.0, +69722: 9.0, +69723: 10.0, +69724: 20.0, +69725: 30.0, +69726: 40.0, +69727: 50.0, +69728: 60.0, +69729: 70.0, +69730: 80.0, +69731: 90.0, +69732: 100.0, +69733: 1000.0, +69734: 0.0, +69735: 1.0, +69736: 2.0, +69737: 3.0, +69738: 4.0, +69739: 5.0, +69740: 6.0, +69741: 7.0, +69742: 8.0, +69743: 9.0, +69872: 0.0, +69873: 1.0, +69874: 2.0, +69875: 3.0, +69876: 4.0, +69877: 5.0, +69878: 6.0, +69879: 7.0, +69880: 8.0, +69881: 9.0, +69942: 0.0, +69943: 1.0, +69944: 2.0, +69945: 3.0, +69946: 4.0, +69947: 5.0, +69948: 6.0, +69949: 7.0, +69950: 8.0, +69951: 9.0, +70096: 0.0, +70097: 1.0, +70098: 2.0, +70099: 3.0, +70100: 4.0, +70101: 5.0, +70102: 6.0, +70103: 7.0, +70104: 8.0, +70105: 9.0, +70113: 1.0, +70114: 2.0, +70115: 3.0, +70116: 4.0, +70117: 5.0, +70118: 6.0, +70119: 7.0, +70120: 8.0, +70121: 9.0, +70122: 10.0, +70123: 20.0, +70124: 30.0, +70125: 40.0, +70126: 50.0, +70127: 60.0, +70128: 70.0, +70129: 80.0, +70130: 90.0, +70131: 100.0, +70132: 1000.0, +70384: 0.0, +70385: 1.0, +70386: 2.0, +70387: 3.0, +70388: 4.0, +70389: 5.0, +70390: 6.0, +70391: 7.0, +70392: 8.0, +70393: 9.0, +70736: 0.0, +70737: 1.0, +70738: 2.0, +70739: 3.0, +70740: 4.0, +70741: 5.0, +70742: 6.0, +70743: 7.0, +70744: 8.0, +70745: 9.0, +70864: 0.0, +70865: 1.0, +70866: 2.0, +70867: 3.0, +70868: 4.0, +70869: 5.0, +70870: 6.0, +70871: 7.0, +70872: 8.0, +70873: 9.0, +71248: 0.0, +71249: 1.0, +71250: 2.0, +71251: 3.0, +71252: 4.0, +71253: 5.0, +71254: 6.0, +71255: 7.0, +71256: 8.0, +71257: 9.0, +71360: 0.0, +71361: 1.0, +71362: 2.0, +71363: 3.0, +71364: 4.0, +71365: 5.0, +71366: 6.0, +71367: 7.0, +71368: 8.0, +71369: 9.0, +71472: 0.0, +71473: 1.0, +71474: 2.0, +71475: 3.0, +71476: 4.0, +71477: 5.0, +71478: 6.0, +71479: 7.0, +71480: 8.0, +71481: 9.0, +71482: 10.0, +71483: 20.0, +71904: 0.0, +71905: 1.0, +71906: 2.0, +71907: 3.0, +71908: 4.0, +71909: 5.0, +71910: 6.0, +71911: 7.0, +71912: 8.0, +71913: 9.0, +71914: 10.0, +71915: 20.0, +71916: 30.0, +71917: 40.0, +71918: 50.0, +71919: 60.0, +71920: 70.0, +71921: 80.0, +71922: 90.0, +72784: 0.0, +72785: 1.0, +72786: 2.0, +72787: 3.0, +72788: 4.0, +72789: 5.0, +72790: 6.0, +72791: 7.0, +72792: 8.0, +72793: 9.0, +72794: 1.0, +72795: 2.0, +72796: 3.0, +72797: 4.0, +72798: 5.0, +72799: 6.0, +72800: 7.0, +72801: 8.0, +72802: 9.0, +72803: 10.0, +72804: 20.0, +72805: 30.0, +72806: 40.0, +72807: 50.0, +72808: 60.0, +72809: 70.0, +72810: 80.0, +72811: 90.0, +72812: 100.0, +73040: 0.0, +73041: 1.0, +73042: 2.0, +73043: 3.0, +73044: 4.0, +73045: 5.0, +73046: 6.0, +73047: 7.0, +73048: 8.0, +73049: 9.0, +73120: 0.0, +73121: 1.0, +73122: 2.0, +73123: 3.0, +73124: 4.0, +73125: 5.0, +73126: 6.0, +73127: 7.0, +73128: 8.0, +73129: 9.0, +74802: 216000.0, +74803: 432000.0, +74838: 2.0, +74839: 3.0, +74842: 1.0 / 3.0, +74843: 2.0 / 3.0, +74844: 5.0 / 6.0, +74845: 1.0 / 3.0, +74846: 2.0 / 3.0, +74847: 1.0 / 8.0, +74848: 1.0 / 4.0, +74849: 1.0 / 6.0, +74850: 1.0 / 4.0, +74851: 1.0 / 4.0, +74852: 1.0 / 2.0, +74853: 1.0 / 3.0, +74854: 2.0 / 3.0, +74855: 40.0, +74856: 50.0, +74857: 4.0, +74858: 5.0, +74859: 6.0, +74860: 7.0, +74861: 8.0, +74862: 9.0, +92768: 0.0, +92769: 1.0, +92770: 2.0, +92771: 3.0, +92772: 4.0, +92773: 5.0, +92774: 6.0, +92775: 7.0, +92776: 8.0, +92777: 9.0, +93008: 0.0, +93009: 1.0, +93010: 2.0, +93011: 3.0, +93012: 4.0, +93013: 5.0, +93014: 6.0, +93015: 7.0, +93016: 8.0, +93017: 9.0, +93019: 10.0, +93020: 100.0, +93021: 10000.0, +93022: 1000000.0, +93023: 100000000.0, +93024: 10000000000.0, +93025: 1000000000000.0, +93824: 0.0, +93825: 1.0, +93826: 2.0, +93827: 3.0, +93828: 4.0, +93829: 5.0, +93830: 6.0, +93831: 7.0, +93832: 8.0, +93833: 9.0, +93834: 10.0, +93835: 11.0, +93836: 12.0, +93837: 13.0, +93838: 14.0, +93839: 15.0, +93840: 16.0, +93841: 17.0, +93842: 18.0, +93843: 19.0, +93844: 1.0, +93845: 2.0, +93846: 3.0, +119520: 0.0, +119521: 1.0, +119522: 2.0, +119523: 3.0, +119524: 4.0, +119525: 5.0, +119526: 6.0, +119527: 7.0, +119528: 8.0, +119529: 9.0, +119530: 10.0, +119531: 11.0, +119532: 12.0, +119533: 13.0, +119534: 14.0, +119535: 15.0, +119536: 16.0, +119537: 17.0, +119538: 18.0, +119539: 19.0, +119666: 1.0, +119667: 2.0, +119668: 3.0, +119669: 4.0, +119670: 5.0, +119671: 1.0, +119672: 5.0, +125127: 1.0, +125128: 2.0, +125129: 3.0, +125130: 4.0, +125131: 5.0, +125132: 6.0, +125133: 7.0, +125134: 8.0, +125135: 9.0, +125264: 0.0, +125265: 1.0, +125266: 2.0, +125267: 3.0, +125268: 4.0, +125269: 5.0, +125270: 6.0, +125271: 7.0, +125272: 8.0, +125273: 9.0, +126065: 1.0, +126066: 2.0, +126067: 3.0, +126068: 4.0, +126069: 5.0, +126070: 6.0, +126071: 7.0, +126072: 8.0, +126073: 9.0, +126074: 10.0, +126075: 20.0, +126076: 30.0, +126077: 40.0, +126078: 50.0, +126079: 60.0, +126080: 70.0, +126081: 80.0, +126082: 90.0, +126083: 100.0, +126084: 200.0, +126085: 300.0, +126086: 400.0, +126087: 500.0, +126088: 600.0, +126089: 700.0, +126090: 800.0, +126091: 900.0, +126092: 1000.0, +126093: 2000.0, +126094: 3000.0, +126095: 4000.0, +126096: 5000.0, +126097: 6000.0, +126098: 7000.0, +126099: 8000.0, +126100: 9000.0, +126101: 10000.0, +126102: 20000.0, +126103: 30000.0, +126104: 40000.0, +126105: 50000.0, +126106: 60000.0, +126107: 70000.0, +126108: 80000.0, +126109: 90000.0, +126110: 100000.0, +126111: 200000.0, +126112: 100000.0, +126113: 10000000.0, +126114: 20000000.0, +126115: 1.0, +126116: 2.0, +126117: 3.0, +126118: 4.0, +126119: 5.0, +126120: 6.0, +126121: 7.0, +126122: 8.0, +126123: 9.0, +126125: 1.0 / 4.0, +126126: 1.0 / 2.0, +126127: 3.0 / 4.0, +126129: 1.0, +126130: 2.0, +126131: 10000.0, +126132: 100000.0, +127243: 0.0, +127244: 0.0, +} + +_numeric_corrected = { +} + +def decimal(code): + try: + return _decimal[code] + except KeyError: + if base_mod is not None and code not in _decimal_corrected: + return base_mod._decimal[code] + else: + raise + +def digit(code): + try: + return _digit[code] + except KeyError: + if base_mod is not None and code not in _digit_corrected: + return base_mod._digit[code] + else: + raise + +def numeric(code): + try: + return _numeric[code] + except KeyError: + if base_mod is not None and code not in _numeric_corrected: + return base_mod._numeric[code] + else: + raise + +_toupper = { +604: 42923, +609: 42924, +613: 42893, +614: 42922, +618: 42926, +620: 42925, +647: 42929, +669: 42930, +670: 42928, +1011: 895, +1319: 1318, +1321: 1320, +1323: 1322, +1325: 1324, +1327: 1326, +4304: 7312, +4305: 7313, +4306: 7314, +4307: 7315, +4308: 7316, +4309: 7317, +4310: 7318, +4311: 7319, +4312: 7320, +4313: 7321, +4314: 7322, +4315: 7323, +4316: 7324, +4317: 7325, +4318: 7326, +4319: 7327, +4320: 7328, +4321: 7329, +4322: 7330, +4323: 7331, +4324: 7332, +4325: 7333, +4326: 7334, +4327: 7335, +4328: 7336, +4329: 7337, +4330: 7338, +4331: 7339, +4332: 7340, +4333: 7341, +4334: 7342, +4335: 7343, +4336: 7344, +4337: 7345, +4338: 7346, +4339: 7347, +4340: 7348, +4341: 7349, +4342: 7350, +4343: 7351, +4344: 7352, +4345: 7353, +4346: 7354, +4349: 7357, +4350: 7358, +4351: 7359, +5112: 5104, +5113: 5105, +5114: 5106, +5115: 5107, +5116: 5108, +5117: 5109, +7296: 1042, +7297: 1044, +7298: 1054, +7299: 1057, +7300: 1058, +7301: 1058, +7302: 1066, +7303: 1122, +7304: 42570, +11507: 11506, +11559: 4295, +11565: 4301, +42593: 42592, +42649: 42648, +42651: 42650, +42897: 42896, +42899: 42898, +42903: 42902, +42905: 42904, +42907: 42906, +42909: 42908, +42911: 42910, +42913: 42912, +42915: 42914, +42917: 42916, +42919: 42918, +42921: 42920, +42933: 42932, +42935: 42934, +42937: 42936, +43859: 42931, +43888: 5024, +43889: 5025, +43890: 5026, +43891: 5027, +43892: 5028, +43893: 5029, +43894: 5030, +43895: 5031, +43896: 5032, +43897: 5033, +43898: 5034, +43899: 5035, +43900: 5036, +43901: 5037, +43902: 5038, +43903: 5039, +43904: 5040, +43905: 5041, +43906: 5042, +43907: 5043, +43908: 5044, +43909: 5045, +43910: 5046, +43911: 5047, +43912: 5048, +43913: 5049, +43914: 5050, +43915: 5051, +43916: 5052, +43917: 5053, +43918: 5054, +43919: 5055, +43920: 5056, +43921: 5057, +43922: 5058, +43923: 5059, +43924: 5060, +43925: 5061, +43926: 5062, +43927: 5063, +43928: 5064, +43929: 5065, +43930: 5066, +43931: 5067, +43932: 5068, +43933: 5069, +43934: 5070, +43935: 5071, +43936: 5072, +43937: 5073, +43938: 5074, +43939: 5075, +43940: 5076, +43941: 5077, +43942: 5078, +43943: 5079, +43944: 5080, +43945: 5081, +43946: 5082, +43947: 5083, +43948: 5084, +43949: 5085, +43950: 5086, +43951: 5087, +43952: 5088, +43953: 5089, +43954: 5090, +43955: 5091, +43956: 5092, +43957: 5093, +43958: 5094, +43959: 5095, +43960: 5096, +43961: 5097, +43962: 5098, +43963: 5099, +43964: 5100, +43965: 5101, +43966: 5102, +43967: 5103, +66776: 66736, +66777: 66737, +66778: 66738, +66779: 66739, +66780: 66740, +66781: 66741, +66782: 66742, +66783: 66743, +66784: 66744, +66785: 66745, +66786: 66746, +66787: 66747, +66788: 66748, +66789: 66749, +66790: 66750, +66791: 66751, +66792: 66752, +66793: 66753, +66794: 66754, +66795: 66755, +66796: 66756, +66797: 66757, +66798: 66758, +66799: 66759, +66800: 66760, +66801: 66761, +66802: 66762, +66803: 66763, +66804: 66764, +66805: 66765, +66806: 66766, +66807: 66767, +66808: 66768, +66809: 66769, +66810: 66770, +66811: 66771, +68800: 68736, +68801: 68737, +68802: 68738, +68803: 68739, +68804: 68740, +68805: 68741, +68806: 68742, +68807: 68743, +68808: 68744, +68809: 68745, +68810: 68746, +68811: 68747, +68812: 68748, +68813: 68749, +68814: 68750, +68815: 68751, +68816: 68752, +68817: 68753, +68818: 68754, +68819: 68755, +68820: 68756, +68821: 68757, +68822: 68758, +68823: 68759, +68824: 68760, +68825: 68761, +68826: 68762, +68827: 68763, +68828: 68764, +68829: 68765, +68830: 68766, +68831: 68767, +68832: 68768, +68833: 68769, +68834: 68770, +68835: 68771, +68836: 68772, +68837: 68773, +68838: 68774, +68839: 68775, +68840: 68776, +68841: 68777, +68842: 68778, +68843: 68779, +68844: 68780, +68845: 68781, +68846: 68782, +68847: 68783, +68848: 68784, +68849: 68785, +68850: 68786, +71872: 71840, +71873: 71841, +71874: 71842, +71875: 71843, +71876: 71844, +71877: 71845, +71878: 71846, +71879: 71847, +71880: 71848, +71881: 71849, +71882: 71850, +71883: 71851, +71884: 71852, +71885: 71853, +71886: 71854, +71887: 71855, +71888: 71856, +71889: 71857, +71890: 71858, +71891: 71859, +71892: 71860, +71893: 71861, +71894: 71862, +71895: 71863, +71896: 71864, +71897: 71865, +71898: 71866, +71899: 71867, +71900: 71868, +71901: 71869, +71902: 71870, +71903: 71871, +93792: 93760, +93793: 93761, +93794: 93762, +93795: 93763, +93796: 93764, +93797: 93765, +93798: 93766, +93799: 93767, +93800: 93768, +93801: 93769, +93802: 93770, +93803: 93771, +93804: 93772, +93805: 93773, +93806: 93774, +93807: 93775, +93808: 93776, +93809: 93777, +93810: 93778, +93811: 93779, +93812: 93780, +93813: 93781, +93814: 93782, +93815: 93783, +93816: 93784, +93817: 93785, +93818: 93786, +93819: 93787, +93820: 93788, +93821: 93789, +93822: 93790, +93823: 93791, +125218: 125184, +125219: 125185, +125220: 125186, +125221: 125187, +125222: 125188, +125223: 125189, +125224: 125190, +125225: 125191, +125226: 125192, +125227: 125193, +125228: 125194, +125229: 125195, +125230: 125196, +125231: 125197, +125232: 125198, +125233: 125199, +125234: 125200, +125235: 125201, +125236: 125202, +125237: 125203, +125238: 125204, +125239: 125205, +125240: 125206, +125241: 125207, +125242: 125208, +125243: 125209, +125244: 125210, +125245: 125211, +125246: 125212, +125247: 125213, +125248: 125214, +125249: 125215, +125250: 125216, +125251: 125217, +} + +_toupper_corrected = { +} +_tolower = { +895: 1011, +1318: 1319, +1320: 1321, +1322: 1323, +1324: 1325, +1326: 1327, +4295: 11559, +4301: 11565, +5024: 43888, +5025: 43889, +5026: 43890, +5027: 43891, +5028: 43892, +5029: 43893, +5030: 43894, +5031: 43895, +5032: 43896, +5033: 43897, +5034: 43898, +5035: 43899, +5036: 43900, +5037: 43901, +5038: 43902, +5039: 43903, +5040: 43904, +5041: 43905, +5042: 43906, +5043: 43907, +5044: 43908, +5045: 43909, +5046: 43910, +5047: 43911, +5048: 43912, +5049: 43913, +5050: 43914, +5051: 43915, +5052: 43916, +5053: 43917, +5054: 43918, +5055: 43919, +5056: 43920, +5057: 43921, +5058: 43922, +5059: 43923, +5060: 43924, +5061: 43925, +5062: 43926, +5063: 43927, +5064: 43928, +5065: 43929, +5066: 43930, +5067: 43931, +5068: 43932, +5069: 43933, +5070: 43934, +5071: 43935, +5072: 43936, +5073: 43937, +5074: 43938, +5075: 43939, +5076: 43940, +5077: 43941, +5078: 43942, +5079: 43943, +5080: 43944, +5081: 43945, +5082: 43946, +5083: 43947, +5084: 43948, +5085: 43949, +5086: 43950, +5087: 43951, +5088: 43952, +5089: 43953, +5090: 43954, +5091: 43955, +5092: 43956, +5093: 43957, +5094: 43958, +5095: 43959, +5096: 43960, +5097: 43961, +5098: 43962, +5099: 43963, +5100: 43964, +5101: 43965, +5102: 43966, +5103: 43967, +5104: 5112, +5105: 5113, +5106: 5114, +5107: 5115, +5108: 5116, +5109: 5117, +7312: 4304, +7313: 4305, +7314: 4306, +7315: 4307, +7316: 4308, +7317: 4309, +7318: 4310, +7319: 4311, +7320: 4312, +7321: 4313, +7322: 4314, +7323: 4315, +7324: 4316, +7325: 4317, +7326: 4318, +7327: 4319, +7328: 4320, +7329: 4321, +7330: 4322, +7331: 4323, +7332: 4324, +7333: 4325, +7334: 4326, +7335: 4327, +7336: 4328, +7337: 4329, +7338: 4330, +7339: 4331, +7340: 4332, +7341: 4333, +7342: 4334, +7343: 4335, +7344: 4336, +7345: 4337, +7346: 4338, +7347: 4339, +7348: 4340, +7349: 4341, +7350: 4342, +7351: 4343, +7352: 4344, +7353: 4345, +7354: 4346, +7357: 4349, +7358: 4350, +7359: 4351, +11506: 11507, +42592: 42593, +42648: 42649, +42650: 42651, +42893: 613, +42896: 42897, +42898: 42899, +42902: 42903, +42904: 42905, +42906: 42907, +42908: 42909, +42910: 42911, +42912: 42913, +42914: 42915, +42916: 42917, +42918: 42919, +42920: 42921, +42922: 614, +42923: 604, +42924: 609, +42925: 620, +42926: 618, +42928: 670, +42929: 647, +42930: 669, +42931: 43859, +42932: 42933, +42934: 42935, +42936: 42937, +66736: 66776, +66737: 66777, +66738: 66778, +66739: 66779, +66740: 66780, +66741: 66781, +66742: 66782, +66743: 66783, +66744: 66784, +66745: 66785, +66746: 66786, +66747: 66787, +66748: 66788, +66749: 66789, +66750: 66790, +66751: 66791, +66752: 66792, +66753: 66793, +66754: 66794, +66755: 66795, +66756: 66796, +66757: 66797, +66758: 66798, +66759: 66799, +66760: 66800, +66761: 66801, +66762: 66802, +66763: 66803, +66764: 66804, +66765: 66805, +66766: 66806, +66767: 66807, +66768: 66808, +66769: 66809, +66770: 66810, +66771: 66811, +68736: 68800, +68737: 68801, +68738: 68802, +68739: 68803, +68740: 68804, +68741: 68805, +68742: 68806, +68743: 68807, +68744: 68808, +68745: 68809, +68746: 68810, +68747: 68811, +68748: 68812, +68749: 68813, +68750: 68814, +68751: 68815, +68752: 68816, +68753: 68817, +68754: 68818, +68755: 68819, +68756: 68820, +68757: 68821, +68758: 68822, +68759: 68823, +68760: 68824, +68761: 68825, +68762: 68826, +68763: 68827, +68764: 68828, +68765: 68829, +68766: 68830, +68767: 68831, +68768: 68832, +68769: 68833, +68770: 68834, +68771: 68835, +68772: 68836, +68773: 68837, +68774: 68838, +68775: 68839, +68776: 68840, +68777: 68841, +68778: 68842, +68779: 68843, +68780: 68844, +68781: 68845, +68782: 68846, +68783: 68847, +68784: 68848, +68785: 68849, +68786: 68850, +71840: 71872, +71841: 71873, +71842: 71874, +71843: 71875, +71844: 71876, +71845: 71877, +71846: 71878, +71847: 71879, +71848: 71880, +71849: 71881, +71850: 71882, +71851: 71883, +71852: 71884, +71853: 71885, +71854: 71886, +71855: 71887, +71856: 71888, +71857: 71889, +71858: 71890, +71859: 71891, +71860: 71892, +71861: 71893, +71862: 71894, +71863: 71895, +71864: 71896, +71865: 71897, +71866: 71898, +71867: 71899, +71868: 71900, +71869: 71901, +71870: 71902, +71871: 71903, +93760: 93792, +93761: 93793, +93762: 93794, +93763: 93795, +93764: 93796, +93765: 93797, +93766: 93798, +93767: 93799, +93768: 93800, +93769: 93801, +93770: 93802, +93771: 93803, +93772: 93804, +93773: 93805, +93774: 93806, +93775: 93807, +93776: 93808, +93777: 93809, +93778: 93810, +93779: 93811, +93780: 93812, +93781: 93813, +93782: 93814, +93783: 93815, +93784: 93816, +93785: 93817, +93786: 93818, +93787: 93819, +93788: 93820, +93789: 93821, +93790: 93822, +93791: 93823, +125184: 125218, +125185: 125219, +125186: 125220, +125187: 125221, +125188: 125222, +125189: 125223, +125190: 125224, +125191: 125225, +125192: 125226, +125193: 125227, +125194: 125228, +125195: 125229, +125196: 125230, +125197: 125231, +125198: 125232, +125199: 125233, +125200: 125234, +125201: 125235, +125202: 125236, +125203: 125237, +125204: 125238, +125205: 125239, +125206: 125240, +125207: 125241, +125208: 125242, +125209: 125243, +125210: 125244, +125211: 125245, +125212: 125246, +125213: 125247, +125214: 125248, +125215: 125249, +125216: 125250, +125217: 125251, +} + +_tolower_corrected = { +} +_totitle = { +604: 42923, +609: 42924, +613: 42893, +614: 42922, +618: 42926, +620: 42925, +647: 42929, +669: 42930, +670: 42928, +1011: 895, +1319: 1318, +1321: 1320, +1323: 1322, +1325: 1324, +1327: 1326, +4304: 4304, +4305: 4305, +4306: 4306, +4307: 4307, +4308: 4308, +4309: 4309, +4310: 4310, +4311: 4311, +4312: 4312, +4313: 4313, +4314: 4314, +4315: 4315, +4316: 4316, +4317: 4317, +4318: 4318, +4319: 4319, +4320: 4320, +4321: 4321, +4322: 4322, +4323: 4323, +4324: 4324, +4325: 4325, +4326: 4326, +4327: 4327, +4328: 4328, +4329: 4329, +4330: 4330, +4331: 4331, +4332: 4332, +4333: 4333, +4334: 4334, +4335: 4335, +4336: 4336, +4337: 4337, +4338: 4338, +4339: 4339, +4340: 4340, +4341: 4341, +4342: 4342, +4343: 4343, +4344: 4344, +4345: 4345, +4346: 4346, +4349: 4349, +4350: 4350, +4351: 4351, +5112: 5104, +5113: 5105, +5114: 5106, +5115: 5107, +5116: 5108, +5117: 5109, +7296: 1042, +7297: 1044, +7298: 1054, +7299: 1057, +7300: 1058, +7301: 1058, +7302: 1066, +7303: 1122, +7304: 42570, +11507: 11506, +11559: 4295, +11565: 4301, +42593: 42592, +42649: 42648, +42651: 42650, +42897: 42896, +42899: 42898, +42903: 42902, +42905: 42904, +42907: 42906, +42909: 42908, +42911: 42910, +42913: 42912, +42915: 42914, +42917: 42916, +42919: 42918, +42921: 42920, +42933: 42932, +42935: 42934, +42937: 42936, +43859: 42931, +43888: 5024, +43889: 5025, +43890: 5026, +43891: 5027, +43892: 5028, +43893: 5029, +43894: 5030, +43895: 5031, +43896: 5032, +43897: 5033, +43898: 5034, +43899: 5035, +43900: 5036, +43901: 5037, +43902: 5038, +43903: 5039, +43904: 5040, +43905: 5041, +43906: 5042, +43907: 5043, +43908: 5044, +43909: 5045, +43910: 5046, +43911: 5047, +43912: 5048, +43913: 5049, +43914: 5050, +43915: 5051, +43916: 5052, +43917: 5053, +43918: 5054, +43919: 5055, +43920: 5056, +43921: 5057, +43922: 5058, +43923: 5059, +43924: 5060, +43925: 5061, +43926: 5062, +43927: 5063, +43928: 5064, +43929: 5065, +43930: 5066, +43931: 5067, +43932: 5068, +43933: 5069, +43934: 5070, +43935: 5071, +43936: 5072, +43937: 5073, +43938: 5074, +43939: 5075, +43940: 5076, +43941: 5077, +43942: 5078, +43943: 5079, +43944: 5080, +43945: 5081, +43946: 5082, +43947: 5083, +43948: 5084, +43949: 5085, +43950: 5086, +43951: 5087, +43952: 5088, +43953: 5089, +43954: 5090, +43955: 5091, +43956: 5092, +43957: 5093, +43958: 5094, +43959: 5095, +43960: 5096, +43961: 5097, +43962: 5098, +43963: 5099, +43964: 5100, +43965: 5101, +43966: 5102, +43967: 5103, +66776: 66736, +66777: 66737, +66778: 66738, +66779: 66739, +66780: 66740, +66781: 66741, +66782: 66742, +66783: 66743, +66784: 66744, +66785: 66745, +66786: 66746, +66787: 66747, +66788: 66748, +66789: 66749, +66790: 66750, +66791: 66751, +66792: 66752, +66793: 66753, +66794: 66754, +66795: 66755, +66796: 66756, +66797: 66757, +66798: 66758, +66799: 66759, +66800: 66760, +66801: 66761, +66802: 66762, +66803: 66763, +66804: 66764, +66805: 66765, +66806: 66766, +66807: 66767, +66808: 66768, +66809: 66769, +66810: 66770, +66811: 66771, +68800: 68736, +68801: 68737, +68802: 68738, +68803: 68739, +68804: 68740, +68805: 68741, +68806: 68742, +68807: 68743, +68808: 68744, +68809: 68745, +68810: 68746, +68811: 68747, +68812: 68748, +68813: 68749, +68814: 68750, +68815: 68751, +68816: 68752, +68817: 68753, +68818: 68754, +68819: 68755, +68820: 68756, +68821: 68757, +68822: 68758, +68823: 68759, +68824: 68760, +68825: 68761, +68826: 68762, +68827: 68763, +68828: 68764, +68829: 68765, +68830: 68766, +68831: 68767, +68832: 68768, +68833: 68769, +68834: 68770, +68835: 68771, +68836: 68772, +68837: 68773, +68838: 68774, +68839: 68775, +68840: 68776, +68841: 68777, +68842: 68778, +68843: 68779, +68844: 68780, +68845: 68781, +68846: 68782, +68847: 68783, +68848: 68784, +68849: 68785, +68850: 68786, +71872: 71840, +71873: 71841, +71874: 71842, +71875: 71843, +71876: 71844, +71877: 71845, +71878: 71846, +71879: 71847, +71880: 71848, +71881: 71849, +71882: 71850, +71883: 71851, +71884: 71852, +71885: 71853, +71886: 71854, +71887: 71855, +71888: 71856, +71889: 71857, +71890: 71858, +71891: 71859, +71892: 71860, +71893: 71861, +71894: 71862, +71895: 71863, +71896: 71864, +71897: 71865, +71898: 71866, +71899: 71867, +71900: 71868, +71901: 71869, +71902: 71870, +71903: 71871, +93792: 93760, +93793: 93761, +93794: 93762, +93795: 93763, +93796: 93764, +93797: 93765, +93798: 93766, +93799: 93767, +93800: 93768, +93801: 93769, +93802: 93770, +93803: 93771, +93804: 93772, +93805: 93773, +93806: 93774, +93807: 93775, +93808: 93776, +93809: 93777, +93810: 93778, +93811: 93779, +93812: 93780, +93813: 93781, +93814: 93782, +93815: 93783, +93816: 93784, +93817: 93785, +93818: 93786, +93819: 93787, +93820: 93788, +93821: 93789, +93822: 93790, +93823: 93791, +125218: 125184, +125219: 125185, +125220: 125186, +125221: 125187, +125222: 125188, +125223: 125189, +125224: 125190, +125225: 125191, +125226: 125192, +125227: 125193, +125228: 125194, +125229: 125195, +125230: 125196, +125231: 125197, +125232: 125198, +125233: 125199, +125234: 125200, +125235: 125201, +125236: 125202, +125237: 125203, +125238: 125204, +125239: 125205, +125240: 125206, +125241: 125207, +125242: 125208, +125243: 125209, +125244: 125210, +125245: 125211, +125246: 125212, +125247: 125213, +125248: 125214, +125249: 125215, +125250: 125216, +125251: 125217, +} + +_totitle_corrected = { +} +_special_casing = { +} + +_special_casing_corrected = { +} + +def toupper(code): + try: + return _toupper[code] + except KeyError: + if base_mod is not None and code not in _toupper_corrected: + return base_mod._toupper.get(code, code) + else: + return code + +def tolower(code): + try: + return _tolower[code] + except KeyError: + if base_mod is not None and code not in _tolower_corrected: + return base_mod._tolower.get(code, code) + else: + return code + +def totitle(code): + try: + return _totitle[code] + except KeyError: + if base_mod is not None and code not in _totitle_corrected: + return base_mod._totitle.get(code, code) + else: + return code + +def toupper_full(code): + try: + return _special_casing[code][2] + except KeyError: + if base_mod is not None and code not in _special_casing_corrected: + try: + return base_mod._special_casing[code][2] + except KeyError: + pass + return [toupper(code)] + +def tolower_full(code): + try: + return _special_casing[code][0] + except KeyError: + if base_mod is not None and code not in _special_casing_corrected: + try: + return base_mod._special_casing[code][0] + except KeyError: + pass + return [tolower(code)] + +def totitle_full(code): + try: + return _special_casing[code][1] + except KeyError: + if base_mod is not None and code not in _special_casing_corrected: + try: + return base_mod._special_casing[code][1] + except KeyError: + pass + return [totitle(code)] + +_raw_decomposition = { +8341: '<sub> 0068', +8342: '<sub> 006B', +8343: '<sub> 006C', +8344: '<sub> 006D', +8345: '<sub> 006E', +8346: '<sub> 0070', +8347: '<sub> 0073', +8348: '<sub> 0074', +42652: '<super> 044A', +42653: '<super> 044C', +43000: '<super> 0126', +43001: '<super> 0153', +43868: '<super> A727', +43869: '<super> AB37', +43870: '<super> 026B', +43871: '<super> AB52', +64046: '90DE', +64047: '96B7', +69934: '11131 11127', +69935: '11132 11127', +70475: '11347 1133E', +70476: '11347 11357', +70843: '114B9 114BA', +70844: '114B9 114B0', +70846: '114B9 114BD', +71098: '115B8 115AF', +71099: '115B9 115AF', +126464: '<font> 0627', +126465: '<font> 0628', +126466: '<font> 062C', +126467: '<font> 062F', +126469: '<font> 0648', +126470: '<font> 0632', +126471: '<font> 062D', +126472: '<font> 0637', +126473: '<font> 064A', +126474: '<font> 0643', +126475: '<font> 0644', +126476: '<font> 0645', +126477: '<font> 0646', +126478: '<font> 0633', +126479: '<font> 0639', +126480: '<font> 0641', +126481: '<font> 0635', +126482: '<font> 0642', +126483: '<font> 0631', +126484: '<font> 0634', +126485: '<font> 062A', +126486: '<font> 062B', +126487: '<font> 062E', +126488: '<font> 0630', +126489: '<font> 0636', +126490: '<font> 0638', +126491: '<font> 063A', +126492: '<font> 066E', +126493: '<font> 06BA', +126494: '<font> 06A1', +126495: '<font> 066F', +126497: '<font> 0628', +126498: '<font> 062C', +126500: '<font> 0647', +126503: '<font> 062D', +126505: '<font> 064A', +126506: '<font> 0643', +126507: '<font> 0644', +126508: '<font> 0645', +126509: '<font> 0646', +126510: '<font> 0633', +126511: '<font> 0639', +126512: '<font> 0641', +126513: '<font> 0635', +126514: '<font> 0642', +126516: '<font> 0634', +126517: '<font> 062A', +126518: '<font> 062B', +126519: '<font> 062E', +126521: '<font> 0636', +126523: '<font> 063A', +126530: '<font> 062C', +126535: '<font> 062D', +126537: '<font> 064A', +126539: '<font> 0644', +126541: '<font> 0646', +126542: '<font> 0633', +126543: '<font> 0639', +126545: '<font> 0635', +126546: '<font> 0642', +126548: '<font> 0634', +126551: '<font> 062E', +126553: '<font> 0636', +126555: '<font> 063A', +126557: '<font> 06BA', +126559: '<font> 066F', +126561: '<font> 0628', +126562: '<font> 062C', +126564: '<font> 0647', +126567: '<font> 062D', +126568: '<font> 0637', +126569: '<font> 064A', +126570: '<font> 0643', +126572: '<font> 0645', +126573: '<font> 0646', +126574: '<font> 0633', +126575: '<font> 0639', +126576: '<font> 0641', +126577: '<font> 0635', +126578: '<font> 0642', +126580: '<font> 0634', +126581: '<font> 062A', +126582: '<font> 062B', +126583: '<font> 062E', +126585: '<font> 0636', +126586: '<font> 0638', +126587: '<font> 063A', +126588: '<font> 066E', +126590: '<font> 06A1', +126592: '<font> 0627', +126593: '<font> 0628', +126594: '<font> 062C', +126595: '<font> 062F', +126596: '<font> 0647', +126597: '<font> 0648', +126598: '<font> 0632', +126599: '<font> 062D', +126600: '<font> 0637', +126601: '<font> 064A', +126603: '<font> 0644', +126604: '<font> 0645', +126605: '<font> 0646', +126606: '<font> 0633', +126607: '<font> 0639', +126608: '<font> 0641', +126609: '<font> 0635', +126610: '<font> 0642', +126611: '<font> 0631', +126612: '<font> 0634', +126613: '<font> 062A', +126614: '<font> 062B', +126615: '<font> 062E', +126616: '<font> 0630', +126617: '<font> 0636', +126618: '<font> 0638', +126619: '<font> 063A', +126625: '<font> 0628', +126626: '<font> 062C', +126627: '<font> 062F', +126629: '<font> 0648', +126630: '<font> 0632', +126631: '<font> 062D', +126632: '<font> 0637', +126633: '<font> 064A', +126635: '<font> 0644', +126636: '<font> 0645', +126637: '<font> 0646', +126638: '<font> 0633', +126639: '<font> 0639', +126640: '<font> 0641', +126641: '<font> 0635', +126642: '<font> 0642', +126643: '<font> 0631', +126644: '<font> 0634', +126645: '<font> 062A', +126646: '<font> 062B', +126647: '<font> 062E', +126648: '<font> 0630', +126649: '<font> 0636', +126650: '<font> 0638', +126651: '<font> 063A', +127280: '<square> 0041', +127282: '<square> 0043', +127283: '<square> 0044', +127284: '<square> 0045', +127285: '<square> 0046', +127286: '<square> 0047', +127287: '<square> 0048', +127288: '<square> 0049', +127289: '<square> 004A', +127290: '<square> 004B', +127291: '<square> 004C', +127292: '<square> 004D', +127294: '<square> 004F', +127296: '<square> 0051', +127297: '<square> 0052', +127299: '<square> 0054', +127300: '<square> 0055', +127301: '<square> 0056', +127303: '<square> 0058', +127304: '<square> 0059', +127305: '<square> 005A', +127311: '<square> 0057 0043', +127338: '<super> 004D 0043', +127339: '<super> 004D 0044', +127489: '<square> 30B3 30B3', +127490: '<square> 30B5', +127538: '<square> 7981', +127539: '<square> 7A7A', +127540: '<square> 5408', +127541: '<square> 6E80', +127542: '<square> 6709', +127543: '<square> 6708', +127544: '<square> 7533', +127545: '<square> 5272', +127546: '<square> 55B6', +127547: '<square> 914D', +127568: '<circle> 5F97', +127569: '<circle> 53EF', +} + +_raw_decomposition_corrected = { +} + +def decomposition(code): + try: + return _raw_decomposition[code] + except KeyError: + if base_mod is not None and code not in _raw_decomposition_corrected: + return base_mod._raw_decomposition.get(code, '') + else: + return '' + +_composition = { +r_longlong( 65 << 32 | 768): 192, +r_longlong( 65 << 32 | 769): 193, +r_longlong( 65 << 32 | 770): 194, +r_longlong( 65 << 32 | 771): 195, +r_longlong( 65 << 32 | 776): 196, +r_longlong( 65 << 32 | 778): 197, +r_longlong( 67 << 32 | 807): 199, +r_longlong( 69 << 32 | 768): 200, +r_longlong( 69 << 32 | 769): 201, +r_longlong( 69 << 32 | 770): 202, +r_longlong( 69 << 32 | 776): 203, +r_longlong( 73 << 32 | 768): 204, +r_longlong( 73 << 32 | 769): 205, +r_longlong( 73 << 32 | 770): 206, +r_longlong( 73 << 32 | 776): 207, +r_longlong( 78 << 32 | 771): 209, +r_longlong( 79 << 32 | 768): 210, +r_longlong( 79 << 32 | 769): 211, +r_longlong( 79 << 32 | 770): 212, +r_longlong( 79 << 32 | 771): 213, +r_longlong( 79 << 32 | 776): 214, +r_longlong( 85 << 32 | 768): 217, +r_longlong( 85 << 32 | 769): 218, +r_longlong( 85 << 32 | 770): 219, +r_longlong( 85 << 32 | 776): 220, +r_longlong( 89 << 32 | 769): 221, +r_longlong( 97 << 32 | 768): 224, +r_longlong( 97 << 32 | 769): 225, +r_longlong( 97 << 32 | 770): 226, +r_longlong( 97 << 32 | 771): 227, +r_longlong( 97 << 32 | 776): 228, +r_longlong( 97 << 32 | 778): 229, +r_longlong( 99 << 32 | 807): 231, +r_longlong( 101 << 32 | 768): 232, +r_longlong( 101 << 32 | 769): 233, +r_longlong( 101 << 32 | 770): 234, +r_longlong( 101 << 32 | 776): 235, +r_longlong( 105 << 32 | 768): 236, +r_longlong( 105 << 32 | 769): 237, +r_longlong( 105 << 32 | 770): 238, +r_longlong( 105 << 32 | 776): 239, +r_longlong( 110 << 32 | 771): 241, +r_longlong( 111 << 32 | 768): 242, +r_longlong( 111 << 32 | 769): 243, +r_longlong( 111 << 32 | 770): 244, +r_longlong( 111 << 32 | 771): 245, +r_longlong( 111 << 32 | 776): 246, +r_longlong( 117 << 32 | 768): 249, +r_longlong( 117 << 32 | 769): 250, +r_longlong( 117 << 32 | 770): 251, +r_longlong( 117 << 32 | 776): 252, +r_longlong( 121 << 32 | 769): 253, +r_longlong( 121 << 32 | 776): 255, +r_longlong( 65 << 32 | 772): 256, +r_longlong( 97 << 32 | 772): 257, +r_longlong( 65 << 32 | 774): 258, +r_longlong( 97 << 32 | 774): 259, +r_longlong( 65 << 32 | 808): 260, +r_longlong( 97 << 32 | 808): 261, +r_longlong( 67 << 32 | 769): 262, +r_longlong( 99 << 32 | 769): 263, +r_longlong( 67 << 32 | 770): 264, +r_longlong( 99 << 32 | 770): 265, +r_longlong( 67 << 32 | 775): 266, +r_longlong( 99 << 32 | 775): 267, +r_longlong( 67 << 32 | 780): 268, +r_longlong( 99 << 32 | 780): 269, +r_longlong( 68 << 32 | 780): 270, +r_longlong( 100 << 32 | 780): 271, +r_longlong( 69 << 32 | 772): 274, +r_longlong( 101 << 32 | 772): 275, +r_longlong( 69 << 32 | 774): 276, +r_longlong( 101 << 32 | 774): 277, +r_longlong( 69 << 32 | 775): 278, +r_longlong( 101 << 32 | 775): 279, +r_longlong( 69 << 32 | 808): 280, +r_longlong( 101 << 32 | 808): 281, +r_longlong( 69 << 32 | 780): 282, +r_longlong( 101 << 32 | 780): 283, +r_longlong( 71 << 32 | 770): 284, +r_longlong( 103 << 32 | 770): 285, +r_longlong( 71 << 32 | 774): 286, +r_longlong( 103 << 32 | 774): 287, +r_longlong( 71 << 32 | 775): 288, +r_longlong( 103 << 32 | 775): 289, +r_longlong( 71 << 32 | 807): 290, +r_longlong( 103 << 32 | 807): 291, +r_longlong( 72 << 32 | 770): 292, +r_longlong( 104 << 32 | 770): 293, +r_longlong( 73 << 32 | 771): 296, +r_longlong( 105 << 32 | 771): 297, +r_longlong( 73 << 32 | 772): 298, +r_longlong( 105 << 32 | 772): 299, +r_longlong( 73 << 32 | 774): 300, +r_longlong( 105 << 32 | 774): 301, +r_longlong( 73 << 32 | 808): 302, +r_longlong( 105 << 32 | 808): 303, +r_longlong( 73 << 32 | 775): 304, +r_longlong( 74 << 32 | 770): 308, +r_longlong( 106 << 32 | 770): 309, +r_longlong( 75 << 32 | 807): 310, +r_longlong( 107 << 32 | 807): 311, +r_longlong( 76 << 32 | 769): 313, +r_longlong( 108 << 32 | 769): 314, +r_longlong( 76 << 32 | 807): 315, +r_longlong( 108 << 32 | 807): 316, +r_longlong( 76 << 32 | 780): 317, +r_longlong( 108 << 32 | 780): 318, +r_longlong( 78 << 32 | 769): 323, +r_longlong( 110 << 32 | 769): 324, +r_longlong( 78 << 32 | 807): 325, +r_longlong( 110 << 32 | 807): 326, +r_longlong( 78 << 32 | 780): 327, +r_longlong( 110 << 32 | 780): 328, +r_longlong( 79 << 32 | 772): 332, +r_longlong( 111 << 32 | 772): 333, +r_longlong( 79 << 32 | 774): 334, +r_longlong( 111 << 32 | 774): 335, +r_longlong( 79 << 32 | 779): 336, +r_longlong( 111 << 32 | 779): 337, +r_longlong( 82 << 32 | 769): 340, +r_longlong( 114 << 32 | 769): 341, +r_longlong( 82 << 32 | 807): 342, +r_longlong( 114 << 32 | 807): 343, +r_longlong( 82 << 32 | 780): 344, +r_longlong( 114 << 32 | 780): 345, +r_longlong( 83 << 32 | 769): 346, +r_longlong( 115 << 32 | 769): 347, +r_longlong( 83 << 32 | 770): 348, +r_longlong( 115 << 32 | 770): 349, +r_longlong( 83 << 32 | 807): 350, +r_longlong( 115 << 32 | 807): 351, +r_longlong( 83 << 32 | 780): 352, +r_longlong( 115 << 32 | 780): 353, +r_longlong( 84 << 32 | 807): 354, +r_longlong( 116 << 32 | 807): 355, +r_longlong( 84 << 32 | 780): 356, +r_longlong( 116 << 32 | 780): 357, +r_longlong( 85 << 32 | 771): 360, +r_longlong( 117 << 32 | 771): 361, +r_longlong( 85 << 32 | 772): 362, +r_longlong( 117 << 32 | 772): 363, +r_longlong( 85 << 32 | 774): 364, +r_longlong( 117 << 32 | 774): 365, +r_longlong( 85 << 32 | 778): 366, +r_longlong( 117 << 32 | 778): 367, +r_longlong( 85 << 32 | 779): 368, +r_longlong( 117 << 32 | 779): 369, +r_longlong( 85 << 32 | 808): 370, +r_longlong( 117 << 32 | 808): 371, +r_longlong( 87 << 32 | 770): 372, +r_longlong( 119 << 32 | 770): 373, +r_longlong( 89 << 32 | 770): 374, +r_longlong( 121 << 32 | 770): 375, +r_longlong( 89 << 32 | 776): 376, +r_longlong( 90 << 32 | 769): 377, +r_longlong( 122 << 32 | 769): 378, +r_longlong( 90 << 32 | 775): 379, +r_longlong( 122 << 32 | 775): 380, +r_longlong( 90 << 32 | 780): 381, +r_longlong( 122 << 32 | 780): 382, +r_longlong( 79 << 32 | 795): 416, +r_longlong( 111 << 32 | 795): 417, +r_longlong( 85 << 32 | 795): 431, +r_longlong( 117 << 32 | 795): 432, +r_longlong( 65 << 32 | 780): 461, +r_longlong( 97 << 32 | 780): 462, +r_longlong( 73 << 32 | 780): 463, +r_longlong( 105 << 32 | 780): 464, +r_longlong( 79 << 32 | 780): 465, +r_longlong( 111 << 32 | 780): 466, +r_longlong( 85 << 32 | 780): 467, +r_longlong( 117 << 32 | 780): 468, +r_longlong( 220 << 32 | 772): 469, +r_longlong( 252 << 32 | 772): 470, +r_longlong( 220 << 32 | 769): 471, +r_longlong( 252 << 32 | 769): 472, +r_longlong( 220 << 32 | 780): 473, +r_longlong( 252 << 32 | 780): 474, +r_longlong( 220 << 32 | 768): 475, +r_longlong( 252 << 32 | 768): 476, +r_longlong( 196 << 32 | 772): 478, +r_longlong( 228 << 32 | 772): 479, +r_longlong( 550 << 32 | 772): 480, +r_longlong( 551 << 32 | 772): 481, +r_longlong( 198 << 32 | 772): 482, +r_longlong( 230 << 32 | 772): 483, +r_longlong( 71 << 32 | 780): 486, +r_longlong( 103 << 32 | 780): 487, +r_longlong( 75 << 32 | 780): 488, +r_longlong( 107 << 32 | 780): 489, +r_longlong( 79 << 32 | 808): 490, +r_longlong( 111 << 32 | 808): 491, +r_longlong( 490 << 32 | 772): 492, +r_longlong( 491 << 32 | 772): 493, +r_longlong( 439 << 32 | 780): 494, +r_longlong( 658 << 32 | 780): 495, +r_longlong( 106 << 32 | 780): 496, +r_longlong( 71 << 32 | 769): 500, +r_longlong( 103 << 32 | 769): 501, +r_longlong( 78 << 32 | 768): 504, +r_longlong( 110 << 32 | 768): 505, +r_longlong( 197 << 32 | 769): 506, +r_longlong( 229 << 32 | 769): 507, +r_longlong( 198 << 32 | 769): 508, +r_longlong( 230 << 32 | 769): 509, +r_longlong( 216 << 32 | 769): 510, +r_longlong( 248 << 32 | 769): 511, +r_longlong( 65 << 32 | 783): 512, +r_longlong( 97 << 32 | 783): 513, +r_longlong( 65 << 32 | 785): 514, +r_longlong( 97 << 32 | 785): 515, +r_longlong( 69 << 32 | 783): 516, +r_longlong( 101 << 32 | 783): 517, +r_longlong( 69 << 32 | 785): 518, +r_longlong( 101 << 32 | 785): 519, +r_longlong( 73 << 32 | 783): 520, +r_longlong( 105 << 32 | 783): 521, +r_longlong( 73 << 32 | 785): 522, +r_longlong( 105 << 32 | 785): 523, +r_longlong( 79 << 32 | 783): 524, +r_longlong( 111 << 32 | 783): 525, +r_longlong( 79 << 32 | 785): 526, +r_longlong( 111 << 32 | 785): 527, +r_longlong( 82 << 32 | 783): 528, +r_longlong( 114 << 32 | 783): 529, +r_longlong( 82 << 32 | 785): 530, +r_longlong( 114 << 32 | 785): 531, +r_longlong( 85 << 32 | 783): 532, +r_longlong( 117 << 32 | 783): 533, +r_longlong( 85 << 32 | 785): 534, +r_longlong( 117 << 32 | 785): 535, +r_longlong( 83 << 32 | 806): 536, +r_longlong( 115 << 32 | 806): 537, +r_longlong( 84 << 32 | 806): 538, +r_longlong( 116 << 32 | 806): 539, +r_longlong( 72 << 32 | 780): 542, +r_longlong( 104 << 32 | 780): 543, +r_longlong( 65 << 32 | 775): 550, +r_longlong( 97 << 32 | 775): 551, +r_longlong( 69 << 32 | 807): 552, +r_longlong( 101 << 32 | 807): 553, +r_longlong( 214 << 32 | 772): 554, +r_longlong( 246 << 32 | 772): 555, +r_longlong( 213 << 32 | 772): 556, +r_longlong( 245 << 32 | 772): 557, +r_longlong( 79 << 32 | 775): 558, +r_longlong( 111 << 32 | 775): 559, +r_longlong( 558 << 32 | 772): 560, +r_longlong( 559 << 32 | 772): 561, +r_longlong( 89 << 32 | 772): 562, +r_longlong( 121 << 32 | 772): 563, +r_longlong( 168 << 32 | 769): 901, +r_longlong( 913 << 32 | 769): 902, +r_longlong( 917 << 32 | 769): 904, +r_longlong( 919 << 32 | 769): 905, +r_longlong( 921 << 32 | 769): 906, +r_longlong( 927 << 32 | 769): 908, +r_longlong( 933 << 32 | 769): 910, +r_longlong( 937 << 32 | 769): 911, +r_longlong( 970 << 32 | 769): 912, +r_longlong( 921 << 32 | 776): 938, +r_longlong( 933 << 32 | 776): 939, +r_longlong( 945 << 32 | 769): 940, +r_longlong( 949 << 32 | 769): 941, +r_longlong( 951 << 32 | 769): 942, +r_longlong( 953 << 32 | 769): 943, +r_longlong( 971 << 32 | 769): 944, +r_longlong( 953 << 32 | 776): 970, +r_longlong( 965 << 32 | 776): 971, +r_longlong( 959 << 32 | 769): 972, +r_longlong( 965 << 32 | 769): 973, +r_longlong( 969 << 32 | 769): 974, +r_longlong( 978 << 32 | 769): 979, +r_longlong( 978 << 32 | 776): 980, +r_longlong( 1045 << 32 | 768): 1024, +r_longlong( 1045 << 32 | 776): 1025, +r_longlong( 1043 << 32 | 769): 1027, +r_longlong( 1030 << 32 | 776): 1031, +r_longlong( 1050 << 32 | 769): 1036, +r_longlong( 1048 << 32 | 768): 1037, +r_longlong( 1059 << 32 | 774): 1038, +r_longlong( 1048 << 32 | 774): 1049, +r_longlong( 1080 << 32 | 774): 1081, +r_longlong( 1077 << 32 | 768): 1104, +r_longlong( 1077 << 32 | 776): 1105, +r_longlong( 1075 << 32 | 769): 1107, +r_longlong( 1110 << 32 | 776): 1111, +r_longlong( 1082 << 32 | 769): 1116, +r_longlong( 1080 << 32 | 768): 1117, +r_longlong( 1091 << 32 | 774): 1118, +r_longlong( 1140 << 32 | 783): 1142, +r_longlong( 1141 << 32 | 783): 1143, +r_longlong( 1046 << 32 | 774): 1217, +r_longlong( 1078 << 32 | 774): 1218, +r_longlong( 1040 << 32 | 774): 1232, +r_longlong( 1072 << 32 | 774): 1233, +r_longlong( 1040 << 32 | 776): 1234, +r_longlong( 1072 << 32 | 776): 1235, +r_longlong( 1045 << 32 | 774): 1238, +r_longlong( 1077 << 32 | 774): 1239, +r_longlong( 1240 << 32 | 776): 1242, +r_longlong( 1241 << 32 | 776): 1243, +r_longlong( 1046 << 32 | 776): 1244, +r_longlong( 1078 << 32 | 776): 1245, +r_longlong( 1047 << 32 | 776): 1246, +r_longlong( 1079 << 32 | 776): 1247, +r_longlong( 1048 << 32 | 772): 1250, +r_longlong( 1080 << 32 | 772): 1251, +r_longlong( 1048 << 32 | 776): 1252, +r_longlong( 1080 << 32 | 776): 1253, +r_longlong( 1054 << 32 | 776): 1254, +r_longlong( 1086 << 32 | 776): 1255, +r_longlong( 1256 << 32 | 776): 1258, +r_longlong( 1257 << 32 | 776): 1259, +r_longlong( 1069 << 32 | 776): 1260, +r_longlong( 1101 << 32 | 776): 1261, +r_longlong( 1059 << 32 | 772): 1262, +r_longlong( 1091 << 32 | 772): 1263, +r_longlong( 1059 << 32 | 776): 1264, +r_longlong( 1091 << 32 | 776): 1265, +r_longlong( 1059 << 32 | 779): 1266, +r_longlong( 1091 << 32 | 779): 1267, +r_longlong( 1063 << 32 | 776): 1268, +r_longlong( 1095 << 32 | 776): 1269, +r_longlong( 1067 << 32 | 776): 1272, +r_longlong( 1099 << 32 | 776): 1273, +r_longlong( 1575 << 32 | 1619): 1570, +r_longlong( 1575 << 32 | 1620): 1571, +r_longlong( 1608 << 32 | 1620): 1572, +r_longlong( 1575 << 32 | 1621): 1573, +r_longlong( 1610 << 32 | 1620): 1574, +r_longlong( 1749 << 32 | 1620): 1728, +r_longlong( 1729 << 32 | 1620): 1730, +r_longlong( 1746 << 32 | 1620): 1747, +r_longlong( 2344 << 32 | 2364): 2345, +r_longlong( 2352 << 32 | 2364): 2353, +r_longlong( 2355 << 32 | 2364): 2356, +r_longlong( 2503 << 32 | 2494): 2507, +r_longlong( 2503 << 32 | 2519): 2508, +r_longlong( 2887 << 32 | 2902): 2888, +r_longlong( 2887 << 32 | 2878): 2891, +r_longlong( 2887 << 32 | 2903): 2892, +r_longlong( 2962 << 32 | 3031): 2964, +r_longlong( 3014 << 32 | 3006): 3018, +r_longlong( 3015 << 32 | 3006): 3019, +r_longlong( 3014 << 32 | 3031): 3020, +r_longlong( 3142 << 32 | 3158): 3144, +r_longlong( 3263 << 32 | 3285): 3264, +r_longlong( 3270 << 32 | 3285): 3271, +r_longlong( 3270 << 32 | 3286): 3272, +r_longlong( 3270 << 32 | 3266): 3274, +r_longlong( 3274 << 32 | 3285): 3275, +r_longlong( 3398 << 32 | 3390): 3402, +r_longlong( 3399 << 32 | 3390): 3403, +r_longlong( 3398 << 32 | 3415): 3404, +r_longlong( 3545 << 32 | 3530): 3546, +r_longlong( 3545 << 32 | 3535): 3548, +r_longlong( 3548 << 32 | 3530): 3549, +r_longlong( 3545 << 32 | 3551): 3550, +r_longlong( 4133 << 32 | 4142): 4134, +r_longlong( 6917 << 32 | 6965): 6918, +r_longlong( 6919 << 32 | 6965): 6920, +r_longlong( 6921 << 32 | 6965): 6922, +r_longlong( 6923 << 32 | 6965): 6924, +r_longlong( 6925 << 32 | 6965): 6926, +r_longlong( 6929 << 32 | 6965): 6930, +r_longlong( 6970 << 32 | 6965): 6971, +r_longlong( 6972 << 32 | 6965): 6973, +r_longlong( 6974 << 32 | 6965): 6976, +r_longlong( 6975 << 32 | 6965): 6977, +r_longlong( 6978 << 32 | 6965): 6979, +r_longlong( 65 << 32 | 805): 7680, +r_longlong( 97 << 32 | 805): 7681, +r_longlong( 66 << 32 | 775): 7682, +r_longlong( 98 << 32 | 775): 7683, +r_longlong( 66 << 32 | 803): 7684, +r_longlong( 98 << 32 | 803): 7685, +r_longlong( 66 << 32 | 817): 7686, +r_longlong( 98 << 32 | 817): 7687, +r_longlong( 199 << 32 | 769): 7688, +r_longlong( 231 << 32 | 769): 7689, +r_longlong( 68 << 32 | 775): 7690, +r_longlong( 100 << 32 | 775): 7691, +r_longlong( 68 << 32 | 803): 7692, +r_longlong( 100 << 32 | 803): 7693, +r_longlong( 68 << 32 | 817): 7694, +r_longlong( 100 << 32 | 817): 7695, +r_longlong( 68 << 32 | 807): 7696, +r_longlong( 100 << 32 | 807): 7697, +r_longlong( 68 << 32 | 813): 7698, +r_longlong( 100 << 32 | 813): 7699, +r_longlong( 274 << 32 | 768): 7700, +r_longlong( 275 << 32 | 768): 7701, +r_longlong( 274 << 32 | 769): 7702, +r_longlong( 275 << 32 | 769): 7703, +r_longlong( 69 << 32 | 813): 7704, +r_longlong( 101 << 32 | 813): 7705, +r_longlong( 69 << 32 | 816): 7706, +r_longlong( 101 << 32 | 816): 7707, +r_longlong( 552 << 32 | 774): 7708, +r_longlong( 553 << 32 | 774): 7709, +r_longlong( 70 << 32 | 775): 7710, +r_longlong( 102 << 32 | 775): 7711, +r_longlong( 71 << 32 | 772): 7712, +r_longlong( 103 << 32 | 772): 7713, +r_longlong( 72 << 32 | 775): 7714, +r_longlong( 104 << 32 | 775): 7715, +r_longlong( 72 << 32 | 803): 7716, +r_longlong( 104 << 32 | 803): 7717, +r_longlong( 72 << 32 | 776): 7718, +r_longlong( 104 << 32 | 776): 7719, +r_longlong( 72 << 32 | 807): 7720, +r_longlong( 104 << 32 | 807): 7721, +r_longlong( 72 << 32 | 814): 7722, +r_longlong( 104 << 32 | 814): 7723, +r_longlong( 73 << 32 | 816): 7724, +r_longlong( 105 << 32 | 816): 7725, +r_longlong( 207 << 32 | 769): 7726, +r_longlong( 239 << 32 | 769): 7727, +r_longlong( 75 << 32 | 769): 7728, +r_longlong( 107 << 32 | 769): 7729, +r_longlong( 75 << 32 | 803): 7730, +r_longlong( 107 << 32 | 803): 7731, +r_longlong( 75 << 32 | 817): 7732, +r_longlong( 107 << 32 | 817): 7733, +r_longlong( 76 << 32 | 803): 7734, +r_longlong( 108 << 32 | 803): 7735, +r_longlong( 7734 << 32 | 772): 7736, +r_longlong( 7735 << 32 | 772): 7737, +r_longlong( 76 << 32 | 817): 7738, +r_longlong( 108 << 32 | 817): 7739, +r_longlong( 76 << 32 | 813): 7740, +r_longlong( 108 << 32 | 813): 7741, +r_longlong( 77 << 32 | 769): 7742, +r_longlong( 109 << 32 | 769): 7743, +r_longlong( 77 << 32 | 775): 7744, +r_longlong( 109 << 32 | 775): 7745, +r_longlong( 77 << 32 | 803): 7746, +r_longlong( 109 << 32 | 803): 7747, +r_longlong( 78 << 32 | 775): 7748, +r_longlong( 110 << 32 | 775): 7749, +r_longlong( 78 << 32 | 803): 7750, +r_longlong( 110 << 32 | 803): 7751, +r_longlong( 78 << 32 | 817): 7752, +r_longlong( 110 << 32 | 817): 7753, +r_longlong( 78 << 32 | 813): 7754, +r_longlong( 110 << 32 | 813): 7755, +r_longlong( 213 << 32 | 769): 7756, +r_longlong( 245 << 32 | 769): 7757, +r_longlong( 213 << 32 | 776): 7758, +r_longlong( 245 << 32 | 776): 7759, +r_longlong( 332 << 32 | 768): 7760, +r_longlong( 333 << 32 | 768): 7761, +r_longlong( 332 << 32 | 769): 7762, +r_longlong( 333 << 32 | 769): 7763, +r_longlong( 80 << 32 | 769): 7764, +r_longlong( 112 << 32 | 769): 7765, +r_longlong( 80 << 32 | 775): 7766, +r_longlong( 112 << 32 | 775): 7767, +r_longlong( 82 << 32 | 775): 7768, +r_longlong( 114 << 32 | 775): 7769, +r_longlong( 82 << 32 | 803): 7770, +r_longlong( 114 << 32 | 803): 7771, +r_longlong( 7770 << 32 | 772): 7772, +r_longlong( 7771 << 32 | 772): 7773, +r_longlong( 82 << 32 | 817): 7774, +r_longlong( 114 << 32 | 817): 7775, +r_longlong( 83 << 32 | 775): 7776, +r_longlong( 115 << 32 | 775): 7777, +r_longlong( 83 << 32 | 803): 7778, +r_longlong( 115 << 32 | 803): 7779, +r_longlong( 346 << 32 | 775): 7780, +r_longlong( 347 << 32 | 775): 7781, +r_longlong( 352 << 32 | 775): 7782, +r_longlong( 353 << 32 | 775): 7783, +r_longlong( 7778 << 32 | 775): 7784, +r_longlong( 7779 << 32 | 775): 7785, +r_longlong( 84 << 32 | 775): 7786, +r_longlong( 116 << 32 | 775): 7787, +r_longlong( 84 << 32 | 803): 7788, +r_longlong( 116 << 32 | 803): 7789, +r_longlong( 84 << 32 | 817): 7790, +r_longlong( 116 << 32 | 817): 7791, +r_longlong( 84 << 32 | 813): 7792, +r_longlong( 116 << 32 | 813): 7793, +r_longlong( 85 << 32 | 804): 7794, +r_longlong( 117 << 32 | 804): 7795, +r_longlong( 85 << 32 | 816): 7796, +r_longlong( 117 << 32 | 816): 7797, +r_longlong( 85 << 32 | 813): 7798, +r_longlong( 117 << 32 | 813): 7799, +r_longlong( 360 << 32 | 769): 7800, +r_longlong( 361 << 32 | 769): 7801, +r_longlong( 362 << 32 | 776): 7802, +r_longlong( 363 << 32 | 776): 7803, +r_longlong( 86 << 32 | 771): 7804, +r_longlong( 118 << 32 | 771): 7805, +r_longlong( 86 << 32 | 803): 7806, +r_longlong( 118 << 32 | 803): 7807, +r_longlong( 87 << 32 | 768): 7808, +r_longlong( 119 << 32 | 768): 7809, +r_longlong( 87 << 32 | 769): 7810, +r_longlong( 119 << 32 | 769): 7811, +r_longlong( 87 << 32 | 776): 7812, +r_longlong( 119 << 32 | 776): 7813, +r_longlong( 87 << 32 | 775): 7814, +r_longlong( 119 << 32 | 775): 7815, +r_longlong( 87 << 32 | 803): 7816, +r_longlong( 119 << 32 | 803): 7817, +r_longlong( 88 << 32 | 775): 7818, +r_longlong( 120 << 32 | 775): 7819, +r_longlong( 88 << 32 | 776): 7820, +r_longlong( 120 << 32 | 776): 7821, +r_longlong( 89 << 32 | 775): 7822, +r_longlong( 121 << 32 | 775): 7823, +r_longlong( 90 << 32 | 770): 7824, +r_longlong( 122 << 32 | 770): 7825, +r_longlong( 90 << 32 | 803): 7826, +r_longlong( 122 << 32 | 803): 7827, +r_longlong( 90 << 32 | 817): 7828, +r_longlong( 122 << 32 | 817): 7829, +r_longlong( 104 << 32 | 817): 7830, +r_longlong( 116 << 32 | 776): 7831, +r_longlong( 119 << 32 | 778): 7832, +r_longlong( 121 << 32 | 778): 7833, +r_longlong( 383 << 32 | 775): 7835, +r_longlong( 65 << 32 | 803): 7840, +r_longlong( 97 << 32 | 803): 7841, +r_longlong( 65 << 32 | 777): 7842, +r_longlong( 97 << 32 | 777): 7843, +r_longlong( 194 << 32 | 769): 7844, +r_longlong( 226 << 32 | 769): 7845, +r_longlong( 194 << 32 | 768): 7846, +r_longlong( 226 << 32 | 768): 7847, +r_longlong( 194 << 32 | 777): 7848, +r_longlong( 226 << 32 | 777): 7849, +r_longlong( 194 << 32 | 771): 7850, +r_longlong( 226 << 32 | 771): 7851, +r_longlong( 7840 << 32 | 770): 7852, +r_longlong( 7841 << 32 | 770): 7853, +r_longlong( 258 << 32 | 769): 7854, +r_longlong( 259 << 32 | 769): 7855, +r_longlong( 258 << 32 | 768): 7856, +r_longlong( 259 << 32 | 768): 7857, +r_longlong( 258 << 32 | 777): 7858, +r_longlong( 259 << 32 | 777): 7859, +r_longlong( 258 << 32 | 771): 7860, +r_longlong( 259 << 32 | 771): 7861, +r_longlong( 7840 << 32 | 774): 7862, +r_longlong( 7841 << 32 | 774): 7863, +r_longlong( 69 << 32 | 803): 7864, +r_longlong( 101 << 32 | 803): 7865, +r_longlong( 69 << 32 | 777): 7866, +r_longlong( 101 << 32 | 777): 7867, +r_longlong( 69 << 32 | 771): 7868, +r_longlong( 101 << 32 | 771): 7869, +r_longlong( 202 << 32 | 769): 7870, +r_longlong( 234 << 32 | 769): 7871, +r_longlong( 202 << 32 | 768): 7872, +r_longlong( 234 << 32 | 768): 7873, +r_longlong( 202 << 32 | 777): 7874, +r_longlong( 234 << 32 | 777): 7875, +r_longlong( 202 << 32 | 771): 7876, +r_longlong( 234 << 32 | 771): 7877, +r_longlong( 7864 << 32 | 770): 7878, +r_longlong( 7865 << 32 | 770): 7879, +r_longlong( 73 << 32 | 777): 7880, +r_longlong( 105 << 32 | 777): 7881, +r_longlong( 73 << 32 | 803): 7882, +r_longlong( 105 << 32 | 803): 7883, +r_longlong( 79 << 32 | 803): 7884, +r_longlong( 111 << 32 | 803): 7885, +r_longlong( 79 << 32 | 777): 7886, +r_longlong( 111 << 32 | 777): 7887, +r_longlong( 212 << 32 | 769): 7888, +r_longlong( 244 << 32 | 769): 7889, +r_longlong( 212 << 32 | 768): 7890, +r_longlong( 244 << 32 | 768): 7891, +r_longlong( 212 << 32 | 777): 7892, +r_longlong( 244 << 32 | 777): 7893, +r_longlong( 212 << 32 | 771): 7894, +r_longlong( 244 << 32 | 771): 7895, +r_longlong( 7884 << 32 | 770): 7896, +r_longlong( 7885 << 32 | 770): 7897, +r_longlong( 416 << 32 | 769): 7898, +r_longlong( 417 << 32 | 769): 7899, +r_longlong( 416 << 32 | 768): 7900, +r_longlong( 417 << 32 | 768): 7901, +r_longlong( 416 << 32 | 777): 7902, +r_longlong( 417 << 32 | 777): 7903, +r_longlong( 416 << 32 | 771): 7904, +r_longlong( 417 << 32 | 771): 7905, +r_longlong( 416 << 32 | 803): 7906, +r_longlong( 417 << 32 | 803): 7907, +r_longlong( 85 << 32 | 803): 7908, +r_longlong( 117 << 32 | 803): 7909, +r_longlong( 85 << 32 | 777): 7910, +r_longlong( 117 << 32 | 777): 7911, +r_longlong( 431 << 32 | 769): 7912, +r_longlong( 432 << 32 | 769): 7913, +r_longlong( 431 << 32 | 768): 7914, +r_longlong( 432 << 32 | 768): 7915, +r_longlong( 431 << 32 | 777): 7916, +r_longlong( 432 << 32 | 777): 7917, +r_longlong( 431 << 32 | 771): 7918, +r_longlong( 432 << 32 | 771): 7919, +r_longlong( 431 << 32 | 803): 7920, +r_longlong( 432 << 32 | 803): 7921, +r_longlong( 89 << 32 | 768): 7922, +r_longlong( 121 << 32 | 768): 7923, +r_longlong( 89 << 32 | 803): 7924, +r_longlong( 121 << 32 | 803): 7925, +r_longlong( 89 << 32 | 777): 7926, +r_longlong( 121 << 32 | 777): 7927, +r_longlong( 89 << 32 | 771): 7928, +r_longlong( 121 << 32 | 771): 7929, +r_longlong( 945 << 32 | 787): 7936, +r_longlong( 945 << 32 | 788): 7937, +r_longlong( 7936 << 32 | 768): 7938, +r_longlong( 7937 << 32 | 768): 7939, +r_longlong( 7936 << 32 | 769): 7940, +r_longlong( 7937 << 32 | 769): 7941, +r_longlong( 7936 << 32 | 834): 7942, +r_longlong( 7937 << 32 | 834): 7943, +r_longlong( 913 << 32 | 787): 7944, +r_longlong( 913 << 32 | 788): 7945, +r_longlong( 7944 << 32 | 768): 7946, +r_longlong( 7945 << 32 | 768): 7947, +r_longlong( 7944 << 32 | 769): 7948, +r_longlong( 7945 << 32 | 769): 7949, +r_longlong( 7944 << 32 | 834): 7950, +r_longlong( 7945 << 32 | 834): 7951, +r_longlong( 949 << 32 | 787): 7952, +r_longlong( 949 << 32 | 788): 7953, +r_longlong( 7952 << 32 | 768): 7954, +r_longlong( 7953 << 32 | 768): 7955, +r_longlong( 7952 << 32 | 769): 7956, +r_longlong( 7953 << 32 | 769): 7957, +r_longlong( 917 << 32 | 787): 7960, +r_longlong( 917 << 32 | 788): 7961, +r_longlong( 7960 << 32 | 768): 7962, +r_longlong( 7961 << 32 | 768): 7963, +r_longlong( 7960 << 32 | 769): 7964, +r_longlong( 7961 << 32 | 769): 7965, +r_longlong( 951 << 32 | 787): 7968, +r_longlong( 951 << 32 | 788): 7969, +r_longlong( 7968 << 32 | 768): 7970, +r_longlong( 7969 << 32 | 768): 7971, +r_longlong( 7968 << 32 | 769): 7972, +r_longlong( 7969 << 32 | 769): 7973, +r_longlong( 7968 << 32 | 834): 7974, +r_longlong( 7969 << 32 | 834): 7975, +r_longlong( 919 << 32 | 787): 7976, +r_longlong( 919 << 32 | 788): 7977, +r_longlong( 7976 << 32 | 768): 7978, +r_longlong( 7977 << 32 | 768): 7979, +r_longlong( 7976 << 32 | 769): 7980, +r_longlong( 7977 << 32 | 769): 7981, +r_longlong( 7976 << 32 | 834): 7982, +r_longlong( 7977 << 32 | 834): 7983, +r_longlong( 953 << 32 | 787): 7984, +r_longlong( 953 << 32 | 788): 7985, +r_longlong( 7984 << 32 | 768): 7986, +r_longlong( 7985 << 32 | 768): 7987, +r_longlong( 7984 << 32 | 769): 7988, +r_longlong( 7985 << 32 | 769): 7989, +r_longlong( 7984 << 32 | 834): 7990, +r_longlong( 7985 << 32 | 834): 7991, +r_longlong( 921 << 32 | 787): 7992, +r_longlong( 921 << 32 | 788): 7993, +r_longlong( 7992 << 32 | 768): 7994, +r_longlong( 7993 << 32 | 768): 7995, +r_longlong( 7992 << 32 | 769): 7996, +r_longlong( 7993 << 32 | 769): 7997, +r_longlong( 7992 << 32 | 834): 7998, +r_longlong( 7993 << 32 | 834): 7999, +r_longlong( 959 << 32 | 787): 8000, +r_longlong( 959 << 32 | 788): 8001, +r_longlong( 8000 << 32 | 768): 8002, +r_longlong( 8001 << 32 | 768): 8003, +r_longlong( 8000 << 32 | 769): 8004, +r_longlong( 8001 << 32 | 769): 8005, +r_longlong( 927 << 32 | 787): 8008, +r_longlong( 927 << 32 | 788): 8009, +r_longlong( 8008 << 32 | 768): 8010, +r_longlong( 8009 << 32 | 768): 8011, +r_longlong( 8008 << 32 | 769): 8012, +r_longlong( 8009 << 32 | 769): 8013, +r_longlong( 965 << 32 | 787): 8016, +r_longlong( 965 << 32 | 788): 8017, +r_longlong( 8016 << 32 | 768): 8018, +r_longlong( 8017 << 32 | 768): 8019, +r_longlong( 8016 << 32 | 769): 8020, +r_longlong( 8017 << 32 | 769): 8021, +r_longlong( 8016 << 32 | 834): 8022, +r_longlong( 8017 << 32 | 834): 8023, +r_longlong( 933 << 32 | 788): 8025, +r_longlong( 8025 << 32 | 768): 8027, +r_longlong( 8025 << 32 | 769): 8029, +r_longlong( 8025 << 32 | 834): 8031, +r_longlong( 969 << 32 | 787): 8032, +r_longlong( 969 << 32 | 788): 8033, +r_longlong( 8032 << 32 | 768): 8034, +r_longlong( 8033 << 32 | 768): 8035, +r_longlong( 8032 << 32 | 769): 8036, +r_longlong( 8033 << 32 | 769): 8037, +r_longlong( 8032 << 32 | 834): 8038, +r_longlong( 8033 << 32 | 834): 8039, +r_longlong( 937 << 32 | 787): 8040, +r_longlong( 937 << 32 | 788): 8041, +r_longlong( 8040 << 32 | 768): 8042, +r_longlong( 8041 << 32 | 768): 8043, +r_longlong( 8040 << 32 | 769): 8044, +r_longlong( 8041 << 32 | 769): 8045, +r_longlong( 8040 << 32 | 834): 8046, +r_longlong( 8041 << 32 | 834): 8047, +r_longlong( 945 << 32 | 768): 8048, +r_longlong( 949 << 32 | 768): 8050, +r_longlong( 951 << 32 | 768): 8052, +r_longlong( 953 << 32 | 768): 8054, +r_longlong( 959 << 32 | 768): 8056, +r_longlong( 965 << 32 | 768): 8058, +r_longlong( 969 << 32 | 768): 8060, +r_longlong( 7936 << 32 | 837): 8064, +r_longlong( 7937 << 32 | 837): 8065, +r_longlong( 7938 << 32 | 837): 8066, +r_longlong( 7939 << 32 | 837): 8067, +r_longlong( 7940 << 32 | 837): 8068, +r_longlong( 7941 << 32 | 837): 8069, +r_longlong( 7942 << 32 | 837): 8070, +r_longlong( 7943 << 32 | 837): 8071, +r_longlong( 7944 << 32 | 837): 8072, +r_longlong( 7945 << 32 | 837): 8073, +r_longlong( 7946 << 32 | 837): 8074, +r_longlong( 7947 << 32 | 837): 8075, +r_longlong( 7948 << 32 | 837): 8076, +r_longlong( 7949 << 32 | 837): 8077, +r_longlong( 7950 << 32 | 837): 8078, +r_longlong( 7951 << 32 | 837): 8079, +r_longlong( 7968 << 32 | 837): 8080, +r_longlong( 7969 << 32 | 837): 8081, +r_longlong( 7970 << 32 | 837): 8082, +r_longlong( 7971 << 32 | 837): 8083, +r_longlong( 7972 << 32 | 837): 8084, +r_longlong( 7973 << 32 | 837): 8085, +r_longlong( 7974 << 32 | 837): 8086, +r_longlong( 7975 << 32 | 837): 8087, +r_longlong( 7976 << 32 | 837): 8088, +r_longlong( 7977 << 32 | 837): 8089, +r_longlong( 7978 << 32 | 837): 8090, +r_longlong( 7979 << 32 | 837): 8091, +r_longlong( 7980 << 32 | 837): 8092, +r_longlong( 7981 << 32 | 837): 8093, +r_longlong( 7982 << 32 | 837): 8094, +r_longlong( 7983 << 32 | 837): 8095, +r_longlong( 8032 << 32 | 837): 8096, +r_longlong( 8033 << 32 | 837): 8097, +r_longlong( 8034 << 32 | 837): 8098, +r_longlong( 8035 << 32 | 837): 8099, +r_longlong( 8036 << 32 | 837): 8100, +r_longlong( 8037 << 32 | 837): 8101, +r_longlong( 8038 << 32 | 837): 8102, +r_longlong( 8039 << 32 | 837): 8103, +r_longlong( 8040 << 32 | 837): 8104, +r_longlong( 8041 << 32 | 837): 8105, +r_longlong( 8042 << 32 | 837): 8106, +r_longlong( 8043 << 32 | 837): 8107, +r_longlong( 8044 << 32 | 837): 8108, +r_longlong( 8045 << 32 | 837): 8109, +r_longlong( 8046 << 32 | 837): 8110, +r_longlong( 8047 << 32 | 837): 8111, +r_longlong( 945 << 32 | 774): 8112, +r_longlong( 945 << 32 | 772): 8113, +r_longlong( 8048 << 32 | 837): 8114, +r_longlong( 945 << 32 | 837): 8115, +r_longlong( 940 << 32 | 837): 8116, +r_longlong( 945 << 32 | 834): 8118, +r_longlong( 8118 << 32 | 837): 8119, +r_longlong( 913 << 32 | 774): 8120, +r_longlong( 913 << 32 | 772): 8121, +r_longlong( 913 << 32 | 768): 8122, +r_longlong( 913 << 32 | 837): 8124, +r_longlong( 168 << 32 | 834): 8129, +r_longlong( 8052 << 32 | 837): 8130, +r_longlong( 951 << 32 | 837): 8131, +r_longlong( 942 << 32 | 837): 8132, +r_longlong( 951 << 32 | 834): 8134, +r_longlong( 8134 << 32 | 837): 8135, +r_longlong( 917 << 32 | 768): 8136, +r_longlong( 919 << 32 | 768): 8138, +r_longlong( 919 << 32 | 837): 8140, +r_longlong( 8127 << 32 | 768): 8141, +r_longlong( 8127 << 32 | 769): 8142, +r_longlong( 8127 << 32 | 834): 8143, +r_longlong( 953 << 32 | 774): 8144, +r_longlong( 953 << 32 | 772): 8145, +r_longlong( 970 << 32 | 768): 8146, +r_longlong( 953 << 32 | 834): 8150, +r_longlong( 970 << 32 | 834): 8151, +r_longlong( 921 << 32 | 774): 8152, +r_longlong( 921 << 32 | 772): 8153, +r_longlong( 921 << 32 | 768): 8154, +r_longlong( 8190 << 32 | 768): 8157, +r_longlong( 8190 << 32 | 769): 8158, +r_longlong( 8190 << 32 | 834): 8159, +r_longlong( 965 << 32 | 774): 8160, +r_longlong( 965 << 32 | 772): 8161, +r_longlong( 971 << 32 | 768): 8162, +r_longlong( 961 << 32 | 787): 8164, +r_longlong( 961 << 32 | 788): 8165, +r_longlong( 965 << 32 | 834): 8166, +r_longlong( 971 << 32 | 834): 8167, +r_longlong( 933 << 32 | 774): 8168, +r_longlong( 933 << 32 | 772): 8169, +r_longlong( 933 << 32 | 768): 8170, +r_longlong( 929 << 32 | 788): 8172, +r_longlong( 168 << 32 | 768): 8173, +r_longlong( 8060 << 32 | 837): 8178, +r_longlong( 969 << 32 | 837): 8179, +r_longlong( 974 << 32 | 837): 8180, +r_longlong( 969 << 32 | 834): 8182, +r_longlong( 8182 << 32 | 837): 8183, +r_longlong( 927 << 32 | 768): 8184, +r_longlong( 937 << 32 | 768): 8186, +r_longlong( 937 << 32 | 837): 8188, +r_longlong( 8592 << 32 | 824): 8602, +r_longlong( 8594 << 32 | 824): 8603, +r_longlong( 8596 << 32 | 824): 8622, +r_longlong( 8656 << 32 | 824): 8653, +r_longlong( 8660 << 32 | 824): 8654, +r_longlong( 8658 << 32 | 824): 8655, +r_longlong( 8707 << 32 | 824): 8708, +r_longlong( 8712 << 32 | 824): 8713, +r_longlong( 8715 << 32 | 824): 8716, +r_longlong( 8739 << 32 | 824): 8740, +r_longlong( 8741 << 32 | 824): 8742, +r_longlong( 8764 << 32 | 824): 8769, +r_longlong( 8771 << 32 | 824): 8772, +r_longlong( 8773 << 32 | 824): 8775, +r_longlong( 8776 << 32 | 824): 8777, +r_longlong( 61 << 32 | 824): 8800, +r_longlong( 8801 << 32 | 824): 8802, +r_longlong( 8781 << 32 | 824): 8813, +r_longlong( 60 << 32 | 824): 8814, +r_longlong( 62 << 32 | 824): 8815, +r_longlong( 8804 << 32 | 824): 8816, +r_longlong( 8805 << 32 | 824): 8817, +r_longlong( 8818 << 32 | 824): 8820, +r_longlong( 8819 << 32 | 824): 8821, +r_longlong( 8822 << 32 | 824): 8824, +r_longlong( 8823 << 32 | 824): 8825, +r_longlong( 8826 << 32 | 824): 8832, +r_longlong( 8827 << 32 | 824): 8833, +r_longlong( 8834 << 32 | 824): 8836, +r_longlong( 8835 << 32 | 824): 8837, +r_longlong( 8838 << 32 | 824): 8840, +r_longlong( 8839 << 32 | 824): 8841, +r_longlong( 8866 << 32 | 824): 8876, +r_longlong( 8872 << 32 | 824): 8877, +r_longlong( 8873 << 32 | 824): 8878, +r_longlong( 8875 << 32 | 824): 8879, +r_longlong( 8828 << 32 | 824): 8928, +r_longlong( 8829 << 32 | 824): 8929, +r_longlong( 8849 << 32 | 824): 8930, +r_longlong( 8850 << 32 | 824): 8931, +r_longlong( 8882 << 32 | 824): 8938, +r_longlong( 8883 << 32 | 824): 8939, +r_longlong( 8884 << 32 | 824): 8940, +r_longlong( 8885 << 32 | 824): 8941, +r_longlong(12363 << 32 | 12441): 12364, +r_longlong(12365 << 32 | 12441): 12366, +r_longlong(12367 << 32 | 12441): 12368, +r_longlong(12369 << 32 | 12441): 12370, +r_longlong(12371 << 32 | 12441): 12372, +r_longlong(12373 << 32 | 12441): 12374, +r_longlong(12375 << 32 | 12441): 12376, +r_longlong(12377 << 32 | 12441): 12378, +r_longlong(12379 << 32 | 12441): 12380, +r_longlong(12381 << 32 | 12441): 12382, +r_longlong(12383 << 32 | 12441): 12384, +r_longlong(12385 << 32 | 12441): 12386, +r_longlong(12388 << 32 | 12441): 12389, +r_longlong(12390 << 32 | 12441): 12391, +r_longlong(12392 << 32 | 12441): 12393, +r_longlong(12399 << 32 | 12441): 12400, +r_longlong(12399 << 32 | 12442): 12401, +r_longlong(12402 << 32 | 12441): 12403, +r_longlong(12402 << 32 | 12442): 12404, +r_longlong(12405 << 32 | 12441): 12406, +r_longlong(12405 << 32 | 12442): 12407, +r_longlong(12408 << 32 | 12441): 12409, +r_longlong(12408 << 32 | 12442): 12410, +r_longlong(12411 << 32 | 12441): 12412, +r_longlong(12411 << 32 | 12442): 12413, +r_longlong(12358 << 32 | 12441): 12436, +r_longlong(12445 << 32 | 12441): 12446, +r_longlong(12459 << 32 | 12441): 12460, +r_longlong(12461 << 32 | 12441): 12462, +r_longlong(12463 << 32 | 12441): 12464, +r_longlong(12465 << 32 | 12441): 12466, +r_longlong(12467 << 32 | 12441): 12468, +r_longlong(12469 << 32 | 12441): 12470, +r_longlong(12471 << 32 | 12441): 12472, +r_longlong(12473 << 32 | 12441): 12474, +r_longlong(12475 << 32 | 12441): 12476, +r_longlong(12477 << 32 | 12441): 12478, +r_longlong(12479 << 32 | 12441): 12480, +r_longlong(12481 << 32 | 12441): 12482, +r_longlong(12484 << 32 | 12441): 12485, +r_longlong(12486 << 32 | 12441): 12487, +r_longlong(12488 << 32 | 12441): 12489, +r_longlong(12495 << 32 | 12441): 12496, +r_longlong(12495 << 32 | 12442): 12497, +r_longlong(12498 << 32 | 12441): 12499, +r_longlong(12498 << 32 | 12442): 12500, +r_longlong(12501 << 32 | 12441): 12502, +r_longlong(12501 << 32 | 12442): 12503, +r_longlong(12504 << 32 | 12441): 12505, +r_longlong(12504 << 32 | 12442): 12506, +r_longlong(12507 << 32 | 12441): 12508, +r_longlong(12507 << 32 | 12442): 12509, +r_longlong(12454 << 32 | 12441): 12532, +r_longlong(12527 << 32 | 12441): 12535, +r_longlong(12528 << 32 | 12441): 12536, +r_longlong(12529 << 32 | 12441): 12537, +r_longlong(12530 << 32 | 12441): 12538, +r_longlong(12541 << 32 | 12441): 12542, +r_longlong(69785 << 32 | 69818): 69786, +r_longlong(69787 << 32 | 69818): 69788, +r_longlong(69797 << 32 | 69818): 69803, +r_longlong(69937 << 32 | 69927): 69934, +r_longlong(69938 << 32 | 69927): 69935, +r_longlong(70471 << 32 | 70462): 70475, +r_longlong(70471 << 32 | 70487): 70476, +r_longlong(70841 << 32 | 70842): 70843, +r_longlong(70841 << 32 | 70832): 70844, +r_longlong(70841 << 32 | 70845): 70846, +r_longlong(71096 << 32 | 71087): 71098, +r_longlong(71097 << 32 | 71087): 71099, +} + +_canon_decomposition = { +64046: [37086], +64047: [38583], +69934: [69937, 69927], +69935: [69938, 69927], +70475: [70471, 70462], +70476: [70471, 70487], +70843: [70841, 70842], +70844: [70841, 70832], +70846: [70841, 70845], +71098: [71096, 71087], +71099: [71097, 71087], +} + +_canon_decomposition_corrected = { +} +_compat_decomposition = { +8341: [104], +8342: [107], +8343: [108], +8344: [109], +8345: [110], +8346: [112], +8347: [115], +8348: [116], +42652: [1098], +42653: [1100], +43000: [294], +43001: [339], +43868: [42791], +43869: [43831], +43870: [619], +43871: [43858], +64046: [37086], +64047: [38583], +69934: [69937, 69927], +69935: [69938, 69927], +70475: [70471, 70462], +70476: [70471, 70487], +70843: [70841, 70842], +70844: [70841, 70832], +70846: [70841, 70845], +71098: [71096, 71087], +71099: [71097, 71087], +126464: [1575], +126465: [1576], +126466: [1580], +126467: [1583], +126469: [1608], +126470: [1586], +126471: [1581], +126472: [1591], +126473: [1610], +126474: [1603], +126475: [1604], +126476: [1605], +126477: [1606], +126478: [1587], +126479: [1593], +126480: [1601], +126481: [1589], +126482: [1602], +126483: [1585], +126484: [1588], +126485: [1578], +126486: [1579], +126487: [1582], +126488: [1584], +126489: [1590], +126490: [1592], +126491: [1594], +126492: [1646], +126493: [1722], +126494: [1697], +126495: [1647], +126497: [1576], +126498: [1580], +126500: [1607], +126503: [1581], +126505: [1610], +126506: [1603], +126507: [1604], +126508: [1605], +126509: [1606], +126510: [1587], +126511: [1593], +126512: [1601], +126513: [1589], +126514: [1602], +126516: [1588], +126517: [1578], +126518: [1579], +126519: [1582], +126521: [1590], +126523: [1594], +126530: [1580], +126535: [1581], +126537: [1610], +126539: [1604], +126541: [1606], +126542: [1587], +126543: [1593], +126545: [1589], +126546: [1602], +126548: [1588], +126551: [1582], +126553: [1590], +126555: [1594], +126557: [1722], +126559: [1647], +126561: [1576], +126562: [1580], +126564: [1607], +126567: [1581], +126568: [1591], +126569: [1610], +126570: [1603], +126572: [1605], +126573: [1606], +126574: [1587], +126575: [1593], +126576: [1601], +126577: [1589], +126578: [1602], +126580: [1588], +126581: [1578], +126582: [1579], +126583: [1582], +126585: [1590], +126586: [1592], +126587: [1594], +126588: [1646], +126590: [1697], +126592: [1575], +126593: [1576], +126594: [1580], +126595: [1583], +126596: [1607], +126597: [1608], +126598: [1586], +126599: [1581], +126600: [1591], +126601: [1610], +126603: [1604], +126604: [1605], +126605: [1606], +126606: [1587], +126607: [1593], +126608: [1601], +126609: [1589], +126610: [1602], +126611: [1585], +126612: [1588], +126613: [1578], +126614: [1579], +126615: [1582], +126616: [1584], +126617: [1590], +126618: [1592], +126619: [1594], +126625: [1576], +126626: [1580], +126627: [1583], +126629: [1608], +126630: [1586], +126631: [1581], +126632: [1591], +126633: [1610], +126635: [1604], +126636: [1605], +126637: [1606], +126638: [1587], +126639: [1593], +126640: [1601], +126641: [1589], +126642: [1602], +126643: [1585], +126644: [1588], +126645: [1578], +126646: [1579], +126647: [1582], +126648: [1584], +126649: [1590], +126650: [1592], +126651: [1594], +127280: [65], +127282: [67], +127283: [68], +127284: [69], +127285: [70], +127286: [71], +127287: [72], +127288: [73], +127289: [74], +127290: [75], +127291: [76], +127292: [77], +127294: [79], +127296: [81], +127297: [82], +127299: [84], +127300: [85], +127301: [86], +127303: [88], +127304: [89], +127305: [90], +127311: [87, 67], +127338: [77, 67], +127339: [77, 68], +127489: [12467, 12467], +127490: [12469], +127538: [31105], +127539: [31354], +127540: [21512], +127541: [28288], +127542: [26377], +127543: [26376], +127544: [30003], +127545: [21106], +127546: [21942], +127547: [37197], +127568: [24471], +127569: [21487], +} + +_compat_decomposition_corrected = { +} + +def canon_decomposition(code): + try: + return _canon_decomposition[code] + except KeyError: + if base_mod is not None and code not in _canon_decomposition_corrected: + return base_mod._canon_decomposition.get(code, []) + else: + return [] +def compat_decomposition(code): + try: + return _compat_decomposition[code] + except KeyError: + if base_mod is not None and code not in _compat_decomposition_corrected: + return base_mod._compat_decomposition.get(code, []) + else: + return [] + + +_named_sequences = [ +u'#\ufe0f\u20e3', +u'*\ufe0f\u20e3', +u'0\ufe0f\u20e3', +u'1\ufe0f\u20e3', +u'2\ufe0f\u20e3', +u'3\ufe0f\u20e3', +u'4\ufe0f\u20e3', +u'5\ufe0f\u20e3', +u'6\ufe0f\u20e3', +u'7\ufe0f\u20e3', +u'8\ufe0f\u20e3', +u'9\ufe0f\u20e3', +u'\u0100\u0300', +u'\u0101\u0300', +u'E\u0329', +u'e\u0329', +u'\xc8\u0329', +u'\xe8\u0329', +u'\xc9\u0329', +u'\xe9\u0329', +u'\xca\u0304', +u'\xea\u0304', +u'\xca\u030c', +u'\xea\u030c', +u'\u012a\u0300', +u'\u012b\u0300', +u'i\u0307\u0301', +u'n\u0360g', +u'O\u0329', +u'o\u0329', +u'\xd2\u0329', +u'\xf2\u0329', +u'\xd3\u0329', +u'\xf3\u0329', +u'S\u0329', +u's\u0329', +u'\u016a\u0300', +u'\u016b\u0300', +u'\u0104\u0301', +u'\u0105\u0301', +u'\u0104\u0303', +u'\u0105\u0303', +u'\u0118\u0301', +u'\u0119\u0301', +u'\u0118\u0303', +u'\u0119\u0303', +u'\u0116\u0301', +u'\u0117\u0301', +u'\u0116\u0303', +u'\u0117\u0303', +u'i\u0307\u0300', +u'i\u0307\u0303', +u'\u012e\u0301', +u'\u012f\u0307\u0301', +u'\u012e\u0303', +u'\u012f\u0307\u0303', +u'J\u0303', +u'j\u0307\u0303', +u'L\u0303', +u'l\u0303', +u'M\u0303', +u'm\u0303', +u'R\u0303', +u'r\u0303', +u'\u0172\u0301', +u'\u0173\u0301', +u'\u0172\u0303', +u'\u0173\u0303', +u'\u016a\u0301', +u'\u016b\u0301', +u'\u016a\u0303', +u'\u016b\u0303', +u'\xe6\u0300', +u'\u0254\u0300', +u'\u0254\u0301', +u'\u028c\u0300', +u'\u028c\u0301', +u'\u0259\u0300', +u'\u0259\u0301', +u'\u025a\u0300', +u'\u025a\u0301', +u'\u0626\u0627', +u'\u0626\u0648', +u'\u0626\u0649', +u'\u0626\u06c6', +u'\u0626\u06c7', +u'\u0626\u06c8', +u'\u0626\u06d0', +u'\u0626\u06d5', +u'\u0646\u06a9', +u'\u0995\u09cd\u09b7', +u'\u0b95\u0bcd', +u'\u0b99\u0bcd', +u'\u0b9a\u0bcd', +u'\u0b9e\u0bcd', +u'\u0b9f\u0bcd', +u'\u0ba3\u0bcd', +u'\u0ba4\u0bcd', +u'\u0ba8\u0bcd', +u'\u0baa\u0bcd', +u'\u0bae\u0bcd', +u'\u0baf\u0bcd', +u'\u0bb0\u0bcd', +u'\u0bb2\u0bcd', +u'\u0bb5\u0bcd', +u'\u0bb4\u0bcd', +u'\u0bb3\u0bcd', +u'\u0bb1\u0bcd', +u'\u0ba9\u0bcd', +u'\u0b9c\u0bcd', +u'\u0bb6\u0bcd', +u'\u0bb7\u0bcd', +u'\u0bb8\u0bcd', +u'\u0bb9\u0bcd', +u'\u0b95\u0bcd\u0bb7\u0bcd', +u'\u0b95\u0bbe', +u'\u0b95\u0bbf', +u'\u0b95\u0bc0', +u'\u0b95\u0bc1', +u'\u0b95\u0bc2', +u'\u0b95\u0bc6', +u'\u0b95\u0bc7', +u'\u0b95\u0bc8', +u'\u0b95\u0bca', +u'\u0b95\u0bcb', +u'\u0b95\u0bcc', +u'\u0b99\u0bbe', +u'\u0b99\u0bbf', +u'\u0b99\u0bc0', +u'\u0b99\u0bc1', +u'\u0b99\u0bc2', +u'\u0b99\u0bc6', +u'\u0b99\u0bc7', +u'\u0b99\u0bc8', +u'\u0b99\u0bca', +u'\u0b99\u0bcb', +u'\u0b99\u0bcc', +u'\u0b9a\u0bbe', +u'\u0b9a\u0bbf', +u'\u0b9a\u0bc0', +u'\u0b9a\u0bc1', +u'\u0b9a\u0bc2', +u'\u0b9a\u0bc6', +u'\u0b9a\u0bc7', +u'\u0b9a\u0bc8', +u'\u0b9a\u0bca', +u'\u0b9a\u0bcb', +u'\u0b9a\u0bcc', +u'\u0b9e\u0bbe', +u'\u0b9e\u0bbf', +u'\u0b9e\u0bc0', +u'\u0b9e\u0bc1', +u'\u0b9e\u0bc2', +u'\u0b9e\u0bc6', +u'\u0b9e\u0bc7', +u'\u0b9e\u0bc8', +u'\u0b9e\u0bca', +u'\u0b9e\u0bcb', +u'\u0b9e\u0bcc', +u'\u0b9f\u0bbe', +u'\u0b9f\u0bbf', +u'\u0b9f\u0bc0', +u'\u0b9f\u0bc1', +u'\u0b9f\u0bc2', +u'\u0b9f\u0bc6', +u'\u0b9f\u0bc7', +u'\u0b9f\u0bc8', +u'\u0b9f\u0bca', +u'\u0b9f\u0bcb', +u'\u0b9f\u0bcc', +u'\u0ba3\u0bbe', +u'\u0ba3\u0bbf', +u'\u0ba3\u0bc0', +u'\u0ba3\u0bc1', +u'\u0ba3\u0bc2', +u'\u0ba3\u0bc6', +u'\u0ba3\u0bc7', +u'\u0ba3\u0bc8', +u'\u0ba3\u0bca', +u'\u0ba3\u0bcb', +u'\u0ba3\u0bcc', +u'\u0ba4\u0bbe', +u'\u0ba4\u0bbf', +u'\u0ba4\u0bc0', +u'\u0ba4\u0bc1', +u'\u0ba4\u0bc2', +u'\u0ba4\u0bc6', +u'\u0ba4\u0bc7', +u'\u0ba4\u0bc8', +u'\u0ba4\u0bca', +u'\u0ba4\u0bcb', +u'\u0ba4\u0bcc', +u'\u0ba8\u0bbe', +u'\u0ba8\u0bbf', +u'\u0ba8\u0bc0', +u'\u0ba8\u0bc1', +u'\u0ba8\u0bc2', +u'\u0ba8\u0bc6', +u'\u0ba8\u0bc7', +u'\u0ba8\u0bc8', +u'\u0ba8\u0bca', +u'\u0ba8\u0bcb', +u'\u0ba8\u0bcc', +u'\u0baa\u0bbe', +u'\u0baa\u0bbf', +u'\u0baa\u0bc0', +u'\u0baa\u0bc1', +u'\u0baa\u0bc2', +u'\u0baa\u0bc6', +u'\u0baa\u0bc7', +u'\u0baa\u0bc8', +u'\u0baa\u0bca', +u'\u0baa\u0bcb', +u'\u0baa\u0bcc', +u'\u0bae\u0bbe', +u'\u0bae\u0bbf', +u'\u0bae\u0bc0', +u'\u0bae\u0bc1', +u'\u0bae\u0bc2', +u'\u0bae\u0bc6', +u'\u0bae\u0bc7', +u'\u0bae\u0bc8', +u'\u0bae\u0bca', +u'\u0bae\u0bcb', +u'\u0bae\u0bcc', +u'\u0baf\u0bbe', +u'\u0baf\u0bbf', +u'\u0baf\u0bc0', +u'\u0baf\u0bc1', +u'\u0baf\u0bc2', +u'\u0baf\u0bc6', +u'\u0baf\u0bc7', +u'\u0baf\u0bc8', +u'\u0baf\u0bca', +u'\u0baf\u0bcb', +u'\u0baf\u0bcc', +u'\u0bb0\u0bbe', +u'\u0bb0\u0bbf', +u'\u0bb0\u0bc0', +u'\u0bb0\u0bc1', +u'\u0bb0\u0bc2', +u'\u0bb0\u0bc6', +u'\u0bb0\u0bc7', +u'\u0bb0\u0bc8', +u'\u0bb0\u0bca', +u'\u0bb0\u0bcb', +u'\u0bb0\u0bcc', +u'\u0bb2\u0bbe', +u'\u0bb2\u0bbf', +u'\u0bb2\u0bc0', +u'\u0bb2\u0bc1', +u'\u0bb2\u0bc2', +u'\u0bb2\u0bc6', +u'\u0bb2\u0bc7', +u'\u0bb2\u0bc8', +u'\u0bb2\u0bca', +u'\u0bb2\u0bcb', +u'\u0bb2\u0bcc', +u'\u0bb5\u0bbe', +u'\u0bb5\u0bbf', +u'\u0bb5\u0bc0', +u'\u0bb5\u0bc1', +u'\u0bb5\u0bc2', +u'\u0bb5\u0bc6', +u'\u0bb5\u0bc7', +u'\u0bb5\u0bc8', +u'\u0bb5\u0bca', +u'\u0bb5\u0bcb', +u'\u0bb5\u0bcc', +u'\u0bb4\u0bbe', +u'\u0bb4\u0bbf', +u'\u0bb4\u0bc0', +u'\u0bb4\u0bc1', +u'\u0bb4\u0bc2', +u'\u0bb4\u0bc6', +u'\u0bb4\u0bc7', +u'\u0bb4\u0bc8', +u'\u0bb4\u0bca', +u'\u0bb4\u0bcb', +u'\u0bb4\u0bcc', +u'\u0bb3\u0bbe', +u'\u0bb3\u0bbf', +u'\u0bb3\u0bc0', +u'\u0bb3\u0bc1', +u'\u0bb3\u0bc2', +u'\u0bb3\u0bc6', +u'\u0bb3\u0bc7', +u'\u0bb3\u0bc8', +u'\u0bb3\u0bca', +u'\u0bb3\u0bcb', +u'\u0bb3\u0bcc', +u'\u0bb1\u0bbe', +u'\u0bb1\u0bbf', +u'\u0bb1\u0bc0', +u'\u0bb1\u0bc1', +u'\u0bb1\u0bc2', +u'\u0bb1\u0bc6', +u'\u0bb1\u0bc7', +u'\u0bb1\u0bc8', +u'\u0bb1\u0bca', +u'\u0bb1\u0bcb', +u'\u0bb1\u0bcc', +u'\u0ba9\u0bbe', +u'\u0ba9\u0bbf', +u'\u0ba9\u0bc0', +u'\u0ba9\u0bc1', +u'\u0ba9\u0bc2', +u'\u0ba9\u0bc6', +u'\u0ba9\u0bc7', +u'\u0ba9\u0bc8', +u'\u0ba9\u0bca', +u'\u0ba9\u0bcb', +u'\u0ba9\u0bcc', +u'\u0b9c\u0bbe', +u'\u0b9c\u0bbf', +u'\u0b9c\u0bc0', +u'\u0b9c\u0bc1', +u'\u0b9c\u0bc2', +u'\u0b9c\u0bc6', +u'\u0b9c\u0bc7', +u'\u0b9c\u0bc8', +u'\u0b9c\u0bca', +u'\u0b9c\u0bcb', +u'\u0b9c\u0bcc', +u'\u0bb6\u0bbe', +u'\u0bb6\u0bbf', +u'\u0bb6\u0bc0', +u'\u0bb6\u0bc1', +u'\u0bb6\u0bc2', +u'\u0bb6\u0bc6', +u'\u0bb6\u0bc7', +u'\u0bb6\u0bc8', +u'\u0bb6\u0bca', +u'\u0bb6\u0bcb', +u'\u0bb6\u0bcc', +u'\u0bb7\u0bbe', +u'\u0bb7\u0bbf', +u'\u0bb7\u0bc0', +u'\u0bb7\u0bc1', +u'\u0bb7\u0bc2', +u'\u0bb7\u0bc6', +u'\u0bb7\u0bc7', +u'\u0bb7\u0bc8', +u'\u0bb7\u0bca', +u'\u0bb7\u0bcb', +u'\u0bb7\u0bcc', +u'\u0bb8\u0bbe', +u'\u0bb8\u0bbf', +u'\u0bb8\u0bc0', +u'\u0bb8\u0bc1', +u'\u0bb8\u0bc2', +u'\u0bb8\u0bc6', +u'\u0bb8\u0bc7', +u'\u0bb8\u0bc8', +u'\u0bb8\u0bca', +u'\u0bb8\u0bcb', +u'\u0bb8\u0bcc', +u'\u0bb9\u0bbe', +u'\u0bb9\u0bbf', +u'\u0bb9\u0bc0', +u'\u0bb9\u0bc1', +u'\u0bb9\u0bc2', +u'\u0bb9\u0bc6', +u'\u0bb9\u0bc7', +u'\u0bb9\u0bc8', +u'\u0bb9\u0bca', +u'\u0bb9\u0bcb', +u'\u0bb9\u0bcc', +u'\u0b95\u0bcd\u0bb7', +u'\u0b95\u0bcd\u0bb7\u0bbe', +u'\u0b95\u0bcd\u0bb7\u0bbf', +u'\u0b95\u0bcd\u0bb7\u0bc0', +u'\u0b95\u0bcd\u0bb7\u0bc1', +u'\u0b95\u0bcd\u0bb7\u0bc2', +u'\u0b95\u0bcd\u0bb7\u0bc6', +u'\u0b95\u0bcd\u0bb7\u0bc7', +u'\u0b95\u0bcd\u0bb7\u0bc8', +u'\u0b95\u0bcd\u0bb7\u0bca', +u'\u0b95\u0bcd\u0bb7\u0bcb', +u'\u0b95\u0bcd\u0bb7\u0bcc', +u'\u0bb6\u0bcd\u0bb0\u0bc0', +u'\u0dca\u200d\u0dba', +u'\u0dca\u200d\u0dbb', +u'\u0dbb\u0dca\u200d', +u'\u10e3\u0302', +u'\u17d2\u1780', +u'\u17d2\u1781', +u'\u17d2\u1782', +u'\u17d2\u1783', +u'\u17d2\u1784', +u'\u17d2\u1785', +u'\u17d2\u1786', +u'\u17d2\u1787', +u'\u17d2\u1788', +u'\u17d2\u1789', +u'\u17d2\u178a', +u'\u17d2\u178b', +u'\u17d2\u178c', +u'\u17d2\u178d', +u'\u17d2\u178e', +u'\u17d2\u178f', +u'\u17d2\u1790', +u'\u17d2\u1791', +u'\u17d2\u1792', +u'\u17d2\u1793', +u'\u17d2\u1794', +u'\u17d2\u1795', +u'\u17d2\u1796', +u'\u17d2\u1797', +u'\u17d2\u1798', +u'\u17d2\u1799', +u'\u17d2\u179a', +u'\u17d2\u179b', +u'\u17d2\u179c', +u'\u17d2\u179d', +u'\u17d2\u179e', +u'\u17d2\u179f', +u'\u17d2\u17a0', +u'\u17d2\u17a1', +u'\u17d2\u17a2', +u'\u17d2\u17a7', +u'\u17d2\u17ab', +u'\u17d2\u17ac', +u'\u17d2\u17af', +u'\u17bb\u17c6', +u'\u17b6\u17c6', +u'\u304b\u309a', +u'\u304d\u309a', +u'\u304f\u309a', +u'\u3051\u309a', +u'\u3053\u309a', +u'\u30ab\u309a', +u'\u30ad\u309a', +u'\u30af\u309a', +u'\u30b1\u309a', +u'\u30b3\u309a', +u'\u30bb\u309a', +u'\u30c4\u309a', +u'\u30c8\u309a', +u'\u31f7\u309a', +u'\u02e5\u02e9', +u'\u02e9\u02e5', +] + + +def lookup_named_sequence(code): + if 0 <= code - 983552 < len(_named_sequences): + return _named_sequences[code - 983552] + else: + return None + +_name_aliases = [ +0, +0, +1, +1, +2, +2, +3, +3, +4, +4, +5, +5, +6, +6, +7, +7, +8, +8, +9, +9, +9, +9, +10, +10, +10, +10, +10, +10, +11, +11, +11, +12, +12, +13, +13, +14, +14, +14, +15, +15, +15, +16, +16, +17, +17, +18, +18, +19, +19, +20, +20, +21, +21, +22, +22, +23, +23, +24, +24, +25, +25, +26, +26, +27, +27, +28, +28, +28, +29, +29, +29, +30, +30, +30, +31, +31, +31, +32, +127, +127, +128, +128, +129, +129, +130, +130, +131, +131, +132, +132, +133, +133, +134, +134, +135, +135, +136, +136, +136, +137, +137, +137, +138, +138, +138, +139, +139, +139, +140, +140, +140, +141, +141, +141, +142, +142, +142, +143, +143, +143, +144, +144, +145, +145, +145, +146, +146, +146, +147, +147, +148, +148, +149, +149, +150, +150, +150, +151, +151, +151, +152, +152, +153, +153, +154, +154, +155, +155, +156, +156, +157, +157, +158, +158, +159, +159, +160, +173, +418, +419, +847, +1564, +1801, +3294, +3741, +3743, +3747, +3749, +4048, +4588, +4589, +4590, +4591, +6155, +6156, +6157, +6158, +8203, +8204, +8205, +8206, +8207, +8234, +8235, +8236, +8237, +8238, +8239, +8287, +8288, +8294, +8295, +8296, +8297, +8472, +9288, +9289, +11130, +11132, +40981, +65024, +65025, +65026, +65027, +65028, +65029, +65030, +65031, +65032, +65033, +65034, +65035, +65036, +65037, +65038, +65039, +65048, +65279, +65279, +65279, +74452, +74453, +93782, +93783, +93814, +93815, +110593, +118981, +917760, +917761, +917762, +917763, +917764, +917765, +917766, +917767, +917768, +917769, +917770, +917771, +917772, +917773, +917774, +917775, +917776, +917777, +917778, +917779, +917780, +917781, +917782, +917783, +917784, +917785, +917786, +917787, +917788, +917789, +917790, +917791, +917792, +917793, +917794, +917795, +917796, +917797, +917798, +917799, +917800, +917801, +917802, +917803, +917804, +917805, +917806, +917807, +917808, +917809, +917810, +917811, +917812, +917813, +917814, +917815, +917816, +917817, +917818, +917819, +917820, +917821, +917822, +917823, +917824, +917825, +917826, +917827, +917828, +917829, +917830, +917831, +917832, +917833, +917834, +917835, +917836, +917837, +917838, +917839, +917840, +917841, +917842, +917843, +917844, +917845, +917846, +917847, +917848, +917849, +917850, +917851, +917852, +917853, +917854, +917855, +917856, +917857, +917858, +917859, +917860, +917861, +917862, +917863, +917864, +917865, +917866, +917867, +917868, +917869, +917870, +917871, +917872, +917873, +917874, +917875, +917876, +917877, +917878, +917879, +917880, +917881, +917882, +917883, +917884, +917885, +917886, +917887, +917888, +917889, +917890, +917891, +917892, +917893, +917894, +917895, +917896, +917897, +917898, +917899, +917900, +917901, +917902, +917903, +917904, +917905, +917906, +917907, +917908, +917909, +917910, +917911, +917912, +917913, +917914, +917915, +917916, +917917, +917918, +917919, +917920, +917921, +917922, +917923, +917924, +917925, +917926, +917927, +917928, +917929, +917930, +917931, +917932, +917933, +917934, +917935, +917936, +917937, +917938, +917939, +917940, +917941, +917942, +917943, +917944, +917945, +917946, +917947, +917948, +917949, +917950, +917951, +917952, +917953, +917954, +917955, +917956, +917957, +917958, +917959, +917960, +917961, +917962, +917963, +917964, +917965, +917966, +917967, +917968, +917969, +917970, +917971, +917972, +917973, +917974, +917975, +917976, +917977, +917978, +917979, +917980, +917981, +917982, +917983, +917984, +917985, +917986, +917987, +917988, +917989, +917990, +917991, +917992, +917993, +917994, +917995, +917996, +917997, +917998, +917999, +] + + +def lookup_with_alias(name, with_named_sequence=False): + code = lookup(name, with_named_sequence=with_named_sequence) + if 0 <= code - 983040 < len(_name_aliases): + return _name_aliases[code - 983040] + else: + return code + +_casefolds = { +5024: [5024], +5025: [5025], +5026: [5026], +5027: [5027], +5028: [5028], +5029: [5029], +5030: [5030], +5031: [5031], +5032: [5032], +5033: [5033], +5034: [5034], +5035: [5035], +5036: [5036], +5037: [5037], +5038: [5038], +5039: [5039], +5040: [5040], +5041: [5041], +5042: [5042], +5043: [5043], +5044: [5044], +5045: [5045], +5046: [5046], +5047: [5047], +5048: [5048], +5049: [5049], +5050: [5050], +5051: [5051], +5052: [5052], +5053: [5053], +5054: [5054], +5055: [5055], +5056: [5056], +5057: [5057], +5058: [5058], +5059: [5059], +5060: [5060], +5061: [5061], +5062: [5062], +5063: [5063], +5064: [5064], +5065: [5065], +5066: [5066], +5067: [5067], +5068: [5068], +5069: [5069], +5070: [5070], +5071: [5071], +5072: [5072], +5073: [5073], +5074: [5074], +5075: [5075], +5076: [5076], +5077: [5077], +5078: [5078], +5079: [5079], +5080: [5080], +5081: [5081], +5082: [5082], +5083: [5083], +5084: [5084], +5085: [5085], +5086: [5086], +5087: [5087], +5088: [5088], +5089: [5089], +5090: [5090], +5091: [5091], +5092: [5092], +5093: [5093], +5094: [5094], +5095: [5095], +5096: [5096], +5097: [5097], +5098: [5098], +5099: [5099], +5100: [5100], +5101: [5101], +5102: [5102], +5103: [5103], +5104: [5104], +5105: [5105], +5106: [5106], +5107: [5107], +5108: [5108], +5109: [5109], +5112: [5104], +5113: [5105], +5114: [5106], +5115: [5107], +5116: [5108], +5117: [5109], +7296: [1074], +7297: [1076], +7298: [1086], +7299: [1089], +7300: [1090], +7301: [1090], +7302: [1098], +7303: [1123], +7304: [42571], +43888: [5024], +43889: [5025], +43890: [5026], +43891: [5027], +43892: [5028], +43893: [5029], +43894: [5030], +43895: [5031], +43896: [5032], +43897: [5033], +43898: [5034], +43899: [5035], +43900: [5036], +43901: [5037], +43902: [5038], +43903: [5039], +43904: [5040], +43905: [5041], +43906: [5042], +43907: [5043], +43908: [5044], +43909: [5045], +43910: [5046], +43911: [5047], +43912: [5048], +43913: [5049], +43914: [5050], +43915: [5051], +43916: [5052], +43917: [5053], +43918: [5054], +43919: [5055], +43920: [5056], +43921: [5057], +43922: [5058], +43923: [5059], +43924: [5060], +43925: [5061], +43926: [5062], +43927: [5063], +43928: [5064], +43929: [5065], +43930: [5066], +43931: [5067], +43932: [5068], +43933: [5069], +43934: [5070], +43935: [5071], +43936: [5072], +43937: [5073], +43938: [5074], +43939: [5075], +43940: [5076], +43941: [5077], +43942: [5078], +43943: [5079], +43944: [5080], +43945: [5081], +43946: [5082], +43947: [5083], +43948: [5084], +43949: [5085], +43950: [5086], +43951: [5087], +43952: [5088], +43953: [5089], +43954: [5090], +43955: [5091], +43956: [5092], +43957: [5093], +43958: [5094], +43959: [5095], +43960: [5096], +43961: [5097], +43962: [5098], +43963: [5099], +43964: [5100], +43965: [5101], +43966: [5102], +43967: [5103], +} + +_casefolds_corrected = { +} + + +def casefold_lookup(code): + try: + return _casefolds[code] + except KeyError: + if base_mod is not None and code not in _casefolds_corrected: + return base_mod._casefolds.get(code, None) + else: + return None + +_combining = { +1631: 220, +2045: 220, +2137: 220, +2138: 220, +2139: 220, +2259: 220, +2260: 230, +2261: 230, +2262: 230, +2263: 230, +2264: 230, +2265: 230, +2266: 230, +2267: 230, +2268: 230, +2269: 230, +2270: 230, +2271: 230, +2272: 230, +2273: 230, +2275: 220, +2276: 230, +2277: 230, +2278: 220, +2279: 230, +2280: 230, +2281: 220, +2282: 230, +2283: 230, +2284: 230, +2285: 220, +2286: 220, +2287: 220, +2288: 27, +2289: 28, +2290: 29, +2291: 230, +2292: 230, +2293: 230, +2294: 220, +2295: 230, +2296: 230, +2297: 220, +2298: 220, +2299: 230, +2300: 230, +2301: 230, +2302: 230, +2303: 230, +2558: 230, +3387: 9, +3388: 9, +4957: 230, +4958: 230, +6832: 230, +6833: 230, +6834: 230, +6835: 230, +6836: 230, +6837: 220, +6838: 220, +6839: 220, +6840: 220, +6841: 220, +6842: 220, +6843: 230, +6844: 230, +6845: 220, +7083: 9, +7142: 7, +7154: 9, +7155: 9, +7412: 230, +7416: 230, +7417: 230, +7655: 230, +7656: 230, +7657: 230, +7658: 230, +7659: 230, +7660: 230, +7661: 230, +7662: 230, +7663: 230, +7664: 230, +7665: 230, +7666: 230, +7667: 230, +7668: 230, +7669: 230, +7670: 232, +7671: 228, +7672: 228, +7673: 220, +7675: 230, +7676: 233, +11647: 9, +42612: 230, +42613: 230, +42614: 230, +42615: 230, +42616: 230, +42617: 230, +42618: 230, +42619: 230, +42654: 230, +42655: 230, +43766: 9, +65063: 220, +65064: 220, +65065: 220, +65066: 220, +65067: 220, +65068: 220, +65069: 220, +65070: 230, +65071: 230, +66272: 220, +66422: 230, +66423: 230, +66424: 230, +66425: 230, +66426: 230, +68325: 230, +68326: 220, +68900: 230, +68901: 230, +68902: 230, +68903: 230, +69446: 220, +69447: 220, +69448: 230, +69449: 230, +69450: 230, +69451: 220, +69452: 230, +69453: 220, +69454: 220, +69455: 220, +69456: 220, +69702: 9, +69759: 9, +69888: 230, +69889: 230, +69890: 230, +69939: 9, +69940: 9, +70003: 7, +70080: 9, +70090: 7, +70197: 9, +70198: 7, +70377: 7, +70378: 9, +70459: 7, +70460: 7, +70477: 9, +70502: 230, +70503: 230, +70504: 230, +70505: 230, +70506: 230, +70507: 230, +70508: 230, +70512: 230, +70513: 230, +70514: 230, +70515: 230, +70516: 230, +70722: 9, +70726: 7, +70750: 230, +70850: 9, +70851: 7, +71103: 9, +71104: 7, +71231: 9, +71350: 9, +71351: 7, +71467: 9, +71737: 9, +71738: 7, +72244: 9, +72263: 9, +72345: 9, +72767: 9, +73026: 7, +73028: 9, +73029: 9, +73111: 9, +92912: 1, +92913: 1, +92914: 1, +92915: 1, +92916: 1, +92976: 230, +92977: 230, +92978: 230, +92979: 230, +92980: 230, +92981: 230, +92982: 230, +113822: 1, +122880: 230, +122881: 230, +122882: 230, +122883: 230, +122884: 230, +122885: 230, +122886: 230, +122888: 230, +122889: 230, +122890: 230, +122891: 230, +122892: 230, +122893: 230, +122894: 230, +122895: 230, +122896: 230, +122897: 230, +122898: 230, +122899: 230, +122900: 230, +122901: 230, +122902: 230, +122903: 230, +122904: 230, +122907: 230, +122908: 230, +122909: 230, +122910: 230, +122911: 230, +122912: 230, +122913: 230, +122915: 230, +122916: 230, +122918: 230, +122919: 230, +122920: 230, +122921: 230, +122922: 230, +125136: 220, +125137: 220, +125138: 220, +125139: 220, +125140: 220, +125141: 220, +125142: 220, +125252: 230, +125253: 230, +125254: 230, +125255: 230, +125256: 230, +125257: 230, +125258: 7, +} + +_combining_corrected = { +} + + +def combining(code): + try: + return _combining[code] + except KeyError: + if base_mod is not None and code not in _combining_corrected: + return base_mod._combining.get(code, 0) + else: + return 0 + diff -Nru pypy-7.1.1+dfsg/rpython/rlib/unicodedata/UnihanNumeric-11.0.0.txt pypy-7.3.1+dfsg/rpython/rlib/unicodedata/UnihanNumeric-11.0.0.txt --- pypy-7.1.1+dfsg/rpython/rlib/unicodedata/UnihanNumeric-11.0.0.txt 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/rlib/unicodedata/UnihanNumeric-11.0.0.txt 2020-04-10 19:28:41.000000000 +0000 @@ -0,0 +1,93 @@ +# +# Unihan_NumericValues.txt +# Date: 2018-05-18 02:15:26 GMT [JHJ] +# Unicode version: 11.0.0 +# +# Unicode Character Database +# © 2018 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 +# For documentation, see http://www.unicode.org/reports/tr44/ +# +# This file contains data on the following fields from the Unihan database: +# kAccountingNumeric +# kOtherNumeric +# kPrimaryNumeric +# +# For details on the file format, see http://www.unicode.org/reports/tr38/ +# +U+3405 kOtherNumeric 5 +U+3483 kOtherNumeric 2 +U+382A kOtherNumeric 5 +U+3B4D kOtherNumeric 7 +U+4E00 kPrimaryNumeric 1 +U+4E03 kPrimaryNumeric 7 +U+4E07 kPrimaryNumeric 10000 +U+4E09 kPrimaryNumeric 3 +U+4E5D kPrimaryNumeric 9 +U+4E8C kPrimaryNumeric 2 +U+4E94 kPrimaryNumeric 5 +U+4E96 kOtherNumeric 4 +U+4EBF kPrimaryNumeric 100000000 +U+4EC0 kOtherNumeric 10 +U+4EDF kAccountingNumeric 1000 +U+4EE8 kOtherNumeric 3 +U+4F0D kAccountingNumeric 5 +U+4F70 kAccountingNumeric 100 +U+5104 kPrimaryNumeric 100000000 +U+5146 kPrimaryNumeric 1000000000000 +U+5169 kOtherNumeric 2 +U+516B kPrimaryNumeric 8 +U+516D kPrimaryNumeric 6 +U+5341 kPrimaryNumeric 10 +U+5343 kPrimaryNumeric 1000 +U+5344 kOtherNumeric 20 +U+5345 kOtherNumeric 30 +U+534C kOtherNumeric 40 +U+53C1 kAccountingNumeric 3 +U+53C2 kAccountingNumeric 3 +U+53C3 kAccountingNumeric 3 +U+53C4 kOtherNumeric 3 +U+56DB kPrimaryNumeric 4 +U+58F1 kAccountingNumeric 1 +U+58F9 kAccountingNumeric 1 +U+5E7A kOtherNumeric 1 +U+5EFE kOtherNumeric 9 +U+5EFF kOtherNumeric 20 +U+5F0C kAccountingNumeric 1 +U+5F0D kAccountingNumeric 2 +U+5F0E kAccountingNumeric 3 +U+5F10 kAccountingNumeric 2 +U+62FE kAccountingNumeric 10 +U+634C kAccountingNumeric 8 +U+67D2 kAccountingNumeric 7 +U+6F06 kAccountingNumeric 7 +U+7396 kAccountingNumeric 9 +U+767E kPrimaryNumeric 100 +U+8086 kAccountingNumeric 4 +U+842C kAccountingNumeric 10000 +U+8CAE kAccountingNumeric 2 +U+8CB3 kAccountingNumeric 2 +U+8D30 kAccountingNumeric 2 +U+9621 kAccountingNumeric 1000 +U+9646 kAccountingNumeric 6 +U+964C kAccountingNumeric 100 +U+9678 kAccountingNumeric 6 +U+96F6 kPrimaryNumeric 0 +U+20001 kOtherNumeric 7 +U+20064 kOtherNumeric 4 +U+200E2 kOtherNumeric 4 +U+20121 kOtherNumeric 5 +U+2092A kOtherNumeric 1 +U+20983 kOtherNumeric 30 +U+2098C kOtherNumeric 40 +U+2099C kOtherNumeric 40 +U+20AEA kOtherNumeric 6 +U+20AFD kOtherNumeric 3 +U+20B19 kOtherNumeric 3 +U+22390 kOtherNumeric 2 +U+22998 kOtherNumeric 3 +U+23B1B kOtherNumeric 3 +U+2626D kOtherNumeric 4 + +# EOF diff -Nru pypy-7.1.1+dfsg/rpython/rtyper/debug.py pypy-7.3.1+dfsg/rpython/rtyper/debug.py --- pypy-7.1.1+dfsg/rpython/rtyper/debug.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/rtyper/debug.py 2020-04-10 19:28:41.000000000 +0000 @@ -32,6 +32,12 @@ return s_x.nonnoneify() def specialize_call(self, hop): + from rpython.annotator import model as annmodel + from rpython.rtyper.error import TyperError + if annmodel.s_None.contains(hop.args_s[0]): + raise TyperError("ll_assert_not_none(None) detected. This might " + "come from something that annotates as " + "'raise None'.") [v0] = hop.inputargs(hop.args_r[0]) hop.exception_cannot_occur() hop.genop('debug_assert_not_none', [v0]) diff -Nru pypy-7.1.1+dfsg/rpython/rtyper/llinterp.py pypy-7.3.1+dfsg/rpython/rtyper/llinterp.py --- pypy-7.1.1+dfsg/rpython/rtyper/llinterp.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/rtyper/llinterp.py 2020-04-10 19:28:41.000000000 +0000 @@ -913,11 +913,11 @@ def op_gc_set_max_heap_size(self, maxsize): raise NotImplementedError("gc_set_max_heap_size") - def op_gc_asmgcroot_static(self, index): - raise NotImplementedError("gc_asmgcroot_static") - def op_gc_stack_bottom(self): - pass # marker for trackgcroot.py + # Marker when we enter RPython code from C code. It used to be + # essential for trackgcroot.py. Nowaways it is mostly unused, + # except by revdb. + pass def op_gc_pin(self, obj): addr = llmemory.cast_ptr_to_adr(obj) @@ -931,11 +931,6 @@ addr = llmemory.cast_ptr_to_adr(obj) return self.heap._is_pinned(addr) - def op_gc_detach_callback_pieces(self): - raise NotImplementedError("gc_detach_callback_pieces") - def op_gc_reattach_callback_pieces(self): - raise NotImplementedError("gc_reattach_callback_pieces") - def op_gc_get_type_info_group(self): raise NotImplementedError("gc_get_type_info_group") @@ -1226,6 +1221,9 @@ def op_gc_move_out_of_nursery(self, obj): raise NotImplementedError("gc_move_out_of_nursery") + def op_gc_increase_root_stack_depth(self, new_depth): + raise NotImplementedError("gc_increase_root_stack_depth") + def op_revdb_stop_point(self, *args): pass def op_revdb_send_answer(self, *args): diff -Nru pypy-7.1.1+dfsg/rpython/rtyper/lltypesystem/ll2ctypes.py pypy-7.3.1+dfsg/rpython/rtyper/lltypesystem/ll2ctypes.py --- pypy-7.1.1+dfsg/rpython/rtyper/lltypesystem/ll2ctypes.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/rtyper/lltypesystem/ll2ctypes.py 2020-04-10 19:28:41.000000000 +0000 @@ -869,6 +869,9 @@ llinterp = LLInterpreter.current_interpreter llinterp._store_exception(lle) return 0 + return ctypes_return_value(llres) + + def ctypes_return_value(llres): assert lltype.typeOf(llres) == T.TO.RESULT if T.TO.RESULT is lltype.Void: return None @@ -891,7 +894,12 @@ # import pdb; pdb.post_mortem(sys.exc_traceback) global _callback_exc_info _callback_exc_info = sys.exc_info() - raise + if hasattr(getattr(container, '_callable', None), + '_llhelper_can_raise_'): + llres = T.TO.RESULT._defl() + return ctypes_return_value(llres) + else: + raise if isinstance(T.TO.RESULT, lltype.Ptr): TMod = lltype.Ptr(lltype.FuncType(T.TO.ARGS, @@ -974,7 +982,7 @@ return llobj -def ctypes2lltype(T, cobj): +def ctypes2lltype(T, cobj, force_real_ctypes_function=False): """Convert the ctypes object 'cobj' to its lltype equivalent. 'T' is the expected lltype type. """ @@ -1045,7 +1053,7 @@ # or goes out of scope, then we crash. CTypes is fun. # It works if we cast it now to an int and back. cobjkey = intmask(ctypes.cast(cobj, ctypes.c_void_p).value) - if cobjkey in _int2obj: + if cobjkey in _int2obj and not force_real_ctypes_function: container = _int2obj[cobjkey] else: name = getattr(cobj, '__name__', '?') @@ -1141,6 +1149,8 @@ else: if version <= 6: clibname = 'msvcrt' + elif version >= 13: + clibname = 'ucrtbase' else: clibname = 'msvcr%d' % (version * 10) @@ -1455,7 +1465,7 @@ def __new__(cls, void_p): if isinstance(void_p, (int, long)): void_p = ctypes.c_void_p(void_p) - self = long.__new__(cls, void_p.value) + self = long.__new__(cls, intmask(void_p.value)) self.void_p = void_p self.intval = intmask(void_p.value) return self diff -Nru pypy-7.1.1+dfsg/rpython/rtyper/lltypesystem/lloperation.py pypy-7.3.1+dfsg/rpython/rtyper/lltypesystem/lloperation.py --- pypy-7.1.1+dfsg/rpython/rtyper/lltypesystem/lloperation.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/rtyper/lltypesystem/lloperation.py 2020-04-10 19:28:41.000000000 +0000 @@ -530,6 +530,7 @@ 'gc_rawrefcount_next_dead': LLOp(), 'gc_move_out_of_nursery': LLOp(), + 'gc_increase_root_stack_depth': LLOp(canrun=True), 'gc_push_roots' : LLOp(), # temporary: list of roots to save 'gc_pop_roots' : LLOp(), # temporary: list of roots to restore @@ -549,14 +550,7 @@ # returns the address of gcdata.root_stack_base/top (for shadowstack only) 'gc_modified_shadowstack': LLOp(), - # for asmgcroot support to get the address of various static structures - # see translator/c/src/mem.h for the valid indices - 'gc_asmgcroot_static': LLOp(sideeffects=False), - 'gc_stack_bottom': LLOp(canrun=True), - - # for stacklet+asmgcroot support - 'gc_detach_callback_pieces': LLOp(), - 'gc_reattach_callback_pieces': LLOp(), + 'gc_stack_bottom': LLOp(canrun=True), # see llinterp.py for docs # NOTE NOTE NOTE! don't forget *** canmallocgc=True *** for anything that # can malloc a GC object. @@ -583,7 +577,7 @@ 'threadlocalref_addr': LLOp(), # get (or make) addr of tl 'threadlocalref_get': LLOp(sideeffects=False), # read field (no check) - 'threadlocalref_load': LLOp(sideeffects=False), # read field (with check) + 'threadlocalref_load': LLOp(), # make addr and read field 'threadlocalref_store': LLOp(), # write field (with check) 'threadlocalref_acquire': LLOp(), # lock for enum 'threadlocalref_release': LLOp(), # lock for enum diff -Nru pypy-7.1.1+dfsg/rpython/rtyper/lltypesystem/lltype.py pypy-7.3.1+dfsg/rpython/rtyper/lltypesystem/lltype.py --- pypy-7.1.1+dfsg/rpython/rtyper/lltypesystem/lltype.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/rtyper/lltypesystem/lltype.py 2020-04-10 19:28:41.000000000 +0000 @@ -815,7 +815,11 @@ if -maxint-1 <= val <= maxint: return Signed elif longlongmask(val) == val: - return SignedLongLong + raise OverflowError("integer %r is out of bounds for Signed " + "(it would fit SignedLongLong, but we " + "won't implicitly return SignedLongLong " + "for typeOf(%r) where type(%r) is long)" + % (val, val, val)) else: raise OverflowError("integer %r is out of bounds" % (val,)) if tp is bool: diff -Nru pypy-7.1.1+dfsg/rpython/rtyper/lltypesystem/opimpl.py pypy-7.3.1+dfsg/rpython/rtyper/lltypesystem/opimpl.py --- pypy-7.1.1+dfsg/rpython/rtyper/lltypesystem/opimpl.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/rtyper/lltypesystem/opimpl.py 2020-04-10 19:28:41.000000000 +0000 @@ -619,7 +619,7 @@ assert x def op_gc_stack_bottom(): - pass # marker for trackgcroot.py + pass # see llinterp.py for docs def op_jit_force_virtualizable(*args): pass @@ -776,6 +776,9 @@ def op_gc_move_out_of_nursery(obj): return obj +def op_gc_increase_root_stack_depth(new_depth): + pass + def op_revdb_do_next_call(): pass diff -Nru pypy-7.1.1+dfsg/rpython/rtyper/lltypesystem/rffi.py pypy-7.3.1+dfsg/rpython/rtyper/lltypesystem/rffi.py --- pypy-7.1.1+dfsg/rpython/rtyper/lltypesystem/rffi.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/rtyper/lltypesystem/rffi.py 2020-04-10 19:28:41.000000000 +0000 @@ -7,7 +7,7 @@ from rpython.rtyper.lltypesystem.llmemory import itemoffsetof from rpython.rtyper.llannotation import lltype_to_annotation from rpython.tool.sourcetools import func_with_new_name -from rpython.rlib.objectmodel import Symbolic, specialize +from rpython.rlib.objectmodel import Symbolic, specialize, not_rpython from rpython.rlib.objectmodel import keepalive_until_here, enforceargs from rpython.rlib import rarithmetic, rgc from rpython.rtyper.extregistry import ExtRegistryEntry @@ -190,7 +190,14 @@ if %(save_err)d: from rpython.rlib import rposix rposix._errno_before(%(save_err)d) - res = funcptr(%(argnames)s) + if we_are_translated(): + res = funcptr(%(argnames)s) + else: + try: # only when non-translated + res = funcptr(%(argnames)s) + except: + rgil.acquire() + raise if %(save_err)d: from rpython.rlib import rposix rposix._errno_after(%(save_err)d) @@ -199,6 +206,7 @@ """ % locals()) miniglobals = {'funcptr': funcptr, '__name__': __name__, # for module name propagation + 'we_are_translated': we_are_translated, } exec source.compile() in miniglobals call_external_function = miniglobals['call_external_function'] @@ -269,10 +277,11 @@ arg = args[i] if TARGET == CCHARP or TARGET is VOIDP: if arg is None: + from rpython.rtyper.annlowlevel import llstr arg = lltype.nullptr(CCHARP.TO) # None => (char*)NULL - to_free = to_free + (arg, '\x04') + to_free = to_free + (arg, llstr(None), '\x04') elif isinstance(arg, str): - tup = get_nonmovingbuffer_final_null(arg) + tup = get_nonmovingbuffer_ll_final_null(arg) to_free = to_free + tup arg = tup[0] elif isinstance(arg, unicode): @@ -306,10 +315,10 @@ arg = args[i] if TARGET == CCHARP or TARGET is VOIDP: if arg is None: - to_free = to_free[2:] + to_free = to_free[3:] elif isinstance(arg, str): - free_nonmovingbuffer(arg, to_free[0], to_free[1]) - to_free = to_free[2:] + free_nonmovingbuffer_ll(to_free[0], to_free[1], to_free[2]) + to_free = to_free[3:] elif TARGET == CWCHARP: if arg is None: to_free = to_free[1:] @@ -356,10 +365,9 @@ def wrapper(%(args)s): # no *args - no GIL for mallocing the tuple if rgil is not None: - rgil.acquire() + rgil.acquire_maybe_in_new_thread() # from now on we hold the GIL - stackcounter.stacks_counter += 1 - llop.gc_stack_bottom(lltype.Void) # marker for trackgcroot.py + llop.gc_stack_bottom(lltype.Void) # marker to enter RPython from C try: result = callable(%(args)s) except Exception, e: @@ -370,7 +378,6 @@ import traceback traceback.print_exc() result = errorcode - stackcounter.stacks_counter -= 1 if rgil is not None: rgil.release() # here we don't hold the GIL any more. As in the wrapper() produced @@ -382,20 +389,12 @@ miniglobals['Exception'] = Exception miniglobals['os'] = os miniglobals['we_are_translated'] = we_are_translated - miniglobals['stackcounter'] = stackcounter exec source.compile() in miniglobals return miniglobals['wrapper'] _make_wrapper_for._annspecialcase_ = 'specialize:memo' AroundFnPtr = lltype.Ptr(lltype.FuncType([], lltype.Void)) -class StackCounter: - def _cleanup_(self): - self.stacks_counter = 0 # number of "stack pieces": callbacks - # and threads increase it by one - -stackcounter = StackCounter() -stackcounter._cleanup_() def llexternal_use_eci(compilation_info): """Return a dummy function that, if called in a RPython program, @@ -529,6 +528,7 @@ MODE_T = lltype.Signed PID_T = lltype.Signed SSIZE_T = lltype.Signed + PTRDIFF_T = lltype.Signed def populate_inttypes(): names = [] @@ -835,84 +835,85 @@ return assert_str0(charpsize2str(cp, size)) charp2str._annenforceargs_ = [lltype.SomePtr(TYPEP)] - # str -> char*, flag + # str -> (buf, llobj, flag) # Can't inline this because of the raw address manipulation. @jit.dont_look_inside - def get_nonmovingbuffer(data): + def get_nonmovingbuffer_ll(data): """ Either returns a non-moving copy or performs neccessary pointer arithmetic to return a pointer to the characters of a string if the string is already nonmovable or could be pinned. Must be followed by a - free_nonmovingbuffer call. + free_nonmovingbuffer_ll call. - Also returns a char: - * \4: no pinning, returned pointer is inside 'data' which is nonmovable - * \5: 'data' was pinned, returned pointer is inside + The return type is a 3-tuple containing the "char *" result, + a pointer to the low-level string object, and a flag as a char: + + * \4: no pinning, returned pointer is inside nonmovable 'llobj' + * \5: 'llobj' was pinned, returned pointer is inside * \6: pinning failed, returned pointer is raw malloced For strings (not unicodes), the len()th character of the resulting raw buffer is available, but not initialized. Use - get_nonmovingbuffer_final_null() instead of get_nonmovingbuffer() + get_nonmovingbuffer_ll_final_null() instead of get_nonmovingbuffer_ll() to get a regular null-terminated "char *". """ - lldata = llstrtype(data) + llobj = llstrtype(data) count = len(data) if rgc.must_split_gc_address_space(): flag = '\x06' # always make a copy in this case - elif we_are_translated_to_c() and not rgc.can_move(data): + elif we_are_translated_to_c() and not rgc.can_move(llobj): flag = '\x04' # no copy needed else: - if we_are_translated_to_c() and rgc.pin(data): + if we_are_translated_to_c() and rgc.pin(llobj): flag = '\x05' # successfully pinned else: flag = '\x06' # must still make a copy if flag == '\x06': buf = lltype.malloc(TYPEP.TO, count + (TYPEP is CCHARP), flavor='raw') - copy_string_to_raw(lldata, buf, 0, count) - return buf, '\x06' + copy_string_to_raw(llobj, buf, 0, count) + return buf, llobj, '\x06' # ^^^ raw malloc used to get a nonmovable copy # # following code is executed after we're translated to C, if: # - rgc.can_move(data) and rgc.pin(data) both returned true # - rgc.can_move(data) returned false - data_start = cast_ptr_to_adr(lldata) + \ + data_start = cast_ptr_to_adr(llobj) + \ offsetof(STRTYPE, 'chars') + itemoffsetof(STRTYPE.chars, 0) - return cast(TYPEP, data_start), flag + return cast(TYPEP, data_start), llobj, flag # ^^^ already nonmovable. Therefore it's not raw allocated nor # pinned. - get_nonmovingbuffer._always_inline_ = 'try' # get rid of the returned tuple - get_nonmovingbuffer._annenforceargs_ = [strtype] + get_nonmovingbuffer_ll._always_inline_ = 'try' # get rid of the returned tuple + get_nonmovingbuffer_ll._annenforceargs_ = [strtype] @jit.dont_look_inside - def get_nonmovingbuffer_final_null(data): - tup = get_nonmovingbuffer(data) - buf, flag = tup + def get_nonmovingbuffer_ll_final_null(data): + tup = get_nonmovingbuffer_ll(data) + buf = tup[0] buf[len(data)] = lastchar return tup - get_nonmovingbuffer_final_null._always_inline_ = 'try' - get_nonmovingbuffer_final_null._annenforceargs_ = [strtype] + get_nonmovingbuffer_ll_final_null._always_inline_ = 'try' + get_nonmovingbuffer_ll_final_null._annenforceargs_ = [strtype] - # (str, char*, char) -> None + # args-from-tuple-returned-by-get_nonmoving_buffer() -> None # Can't inline this because of the raw address manipulation. @jit.dont_look_inside - def free_nonmovingbuffer(data, buf, flag): + def free_nonmovingbuffer_ll(buf, llobj, flag): """ - Keep 'data' alive and unpin it if it was pinned (flag==\5). + Keep 'llobj' alive and unpin it if it was pinned (flag==\5). Otherwise free the non-moving copy (flag==\6). """ if flag == '\x05': - rgc.unpin(data) + rgc.unpin(llobj) if flag == '\x06': lltype.free(buf, flavor='raw') # if flag == '\x04': data was already nonmovable, # we have nothing to clean up - keepalive_until_here(data) - free_nonmovingbuffer._annenforceargs_ = [strtype, None, None] + keepalive_until_here(llobj) # int -> (char*, str, int) # Can't inline this because of the raw address manipulation. @@ -1002,24 +1003,41 @@ charpsize2str._annenforceargs_ = [None, int] return (str2charp, free_charp, charp2str, - get_nonmovingbuffer, free_nonmovingbuffer, - get_nonmovingbuffer_final_null, + get_nonmovingbuffer_ll, free_nonmovingbuffer_ll, + get_nonmovingbuffer_ll_final_null, alloc_buffer, str_from_buffer, keep_buffer_alive_until_here, charp2strn, charpsize2str, str2chararray, str2rawmem, ) (str2charp, free_charp, charp2str, - get_nonmovingbuffer, free_nonmovingbuffer, get_nonmovingbuffer_final_null, + get_nonmovingbuffer_ll, free_nonmovingbuffer_ll, + get_nonmovingbuffer_ll_final_null, alloc_buffer, str_from_buffer, keep_buffer_alive_until_here, charp2strn, charpsize2str, str2chararray, str2rawmem, ) = make_string_mappings(str) (unicode2wcharp, free_wcharp, wcharp2unicode, - get_nonmoving_unicodebuffer, free_nonmoving_unicodebuffer, __not_usable, + get_nonmoving_unicodebuffer_ll, free_nonmoving_unicodebuffer_ll, __not_usable, alloc_unicodebuffer, unicode_from_buffer, keep_unicodebuffer_alive_until_here, wcharp2unicoden, wcharpsize2unicode, unicode2wchararray, unicode2rawmem, ) = make_string_mappings(unicode) + +@not_rpython +def _deprecated_get_nonmovingbuffer(*args): + raise Exception( +"""The function rffi.get_nonmovingbuffer() has been removed because +it was unsafe. Use rffi.get_nonmovingbuffer_ll() instead. It returns +a 3-tuple instead of a 2-tuple, and all three arguments must be passed +to rffi.free_nonmovingbuffer_ll() (instead of the original string and the +two tuple items). Or else, use a high-level API like +'with rffi.scoped_nonmovingbuffer()'.""") + +get_nonmovingbuffer = _deprecated_get_nonmovingbuffer +get_nonmovingbuffer_final_null = _deprecated_get_nonmovingbuffer +free_nonmovingbuffer = _deprecated_get_nonmovingbuffer + + def wcharpsize2utf8(w, size): """ Helper to convert WCHARP pointer to utf8 in one go. Equivalent to wcharpsize2unicode().encode("utf8") @@ -1315,14 +1333,13 @@ class scoped_nonmovingbuffer: def __init__(self, data): - self.data = data + self.buf, self.llobj, self.flag = get_nonmovingbuffer_ll(data) __init__._annenforceargs_ = [None, annmodel.SomeString(can_be_None=False)] def __enter__(self): - self.buf, self.flag = get_nonmovingbuffer(self.data) return self.buf def __exit__(self, *args): - free_nonmovingbuffer(self.data, self.buf, self.flag) + free_nonmovingbuffer_ll(self.buf, self.llobj, self.flag) __init__._always_inline_ = 'try' __enter__._always_inline_ = 'try' __exit__._always_inline_ = 'try' @@ -1334,25 +1351,24 @@ content of the 'char[]' array will not be modified. """ def __init__(self, data): - self.data = data + self.buf, self.llobj, self.flag = get_nonmovingbuffer_ll_final_null( + data) __init__._annenforceargs_ = [None, annmodel.SomeString(can_be_None=False)] def __enter__(self): - self.buf, self.flag = get_nonmovingbuffer_final_null(self.data) return self.buf def __exit__(self, *args): - free_nonmovingbuffer(self.data, self.buf, self.flag) + free_nonmovingbuffer_ll(self.buf, self.llobj, self.flag) __init__._always_inline_ = 'try' __enter__._always_inline_ = 'try' __exit__._always_inline_ = 'try' class scoped_nonmoving_unicodebuffer: def __init__(self, data): - self.data = data + self.buf, self.llobj, self.flag = get_nonmoving_unicodebuffer_ll(data) def __enter__(self): - self.buf, self.flag = get_nonmoving_unicodebuffer(self.data) return self.buf def __exit__(self, *args): - free_nonmoving_unicodebuffer(self.data, self.buf, self.flag) + free_nonmoving_unicodebuffer_ll(self.buf, self.llobj, self.flag) __init__._always_inline_ = 'try' __enter__._always_inline_ = 'try' __exit__._always_inline_ = 'try' diff -Nru pypy-7.1.1+dfsg/rpython/rtyper/lltypesystem/test/test_ll2ctypes.py pypy-7.3.1+dfsg/rpython/rtyper/lltypesystem/test/test_ll2ctypes.py --- pypy-7.1.1+dfsg/rpython/rtyper/lltypesystem/test/test_ll2ctypes.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/rtyper/lltypesystem/test/test_ll2ctypes.py 2020-04-10 19:28:41.000000000 +0000 @@ -1,4 +1,4 @@ -import py +import py, pytest import sys, struct import ctypes from rpython.rtyper.lltypesystem import lltype, rffi, llmemory @@ -480,6 +480,28 @@ assert res == 42 assert not ALLOCATED # detects memory leaks in the test + def test_funcptr_can_raise(self, monkeypatch): + class FooError(Exception): + pass + def dummy(n): + raise FooError(n + 2) + dummy._llhelper_can_raise_ = True + + FUNCTYPE = lltype.FuncType([lltype.Signed], lltype.Signed) + cdummy = lltype2ctypes(llhelper(lltype.Ptr(FUNCTYPE), dummy)) + # here we pretend there is C in the middle + lldummy = ctypes2lltype(lltype.Ptr(FUNCTYPE), cdummy, + force_real_ctypes_function=True) + seen = [] + def custom_except_hook(*args): + seen.append(args) + monkeypatch.setattr(sys, 'excepthook', custom_except_hook) + with pytest.raises(FooError) as exc: + lldummy(41) + assert exc.value.args == (41 + 2,) + assert not seen + assert not ALLOCATED # detects memory leaks in the test + def test_funcptr2(self): FUNCTYPE = lltype.FuncType([rffi.CCHARP], rffi.LONG) cstrlen = standard_c_lib.strlen diff -Nru pypy-7.1.1+dfsg/rpython/rtyper/lltypesystem/test/test_rffi.py pypy-7.3.1+dfsg/rpython/rtyper/lltypesystem/test/test_rffi.py --- pypy-7.1.1+dfsg/rpython/rtyper/lltypesystem/test/test_rffi.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/rtyper/lltypesystem/test/test_rffi.py 2020-04-10 19:28:41.000000000 +0000 @@ -535,7 +535,7 @@ def test_nonmovingbuffer(self): d = 'some cool data that should not move' def f(): - buf, flag = get_nonmovingbuffer(d) + buf, llobj, flag = get_nonmovingbuffer_ll(d) try: counter = 0 for i in range(len(d)): @@ -543,7 +543,7 @@ counter += 1 return counter finally: - free_nonmovingbuffer(d, buf, flag) + free_nonmovingbuffer_ll(buf, llobj, flag) assert f() == len(d) fn = self.compile(f, [], gcpolicy='ref') assert fn() == len(d) @@ -553,13 +553,13 @@ def f(): counter = 0 for n in range(32): - buf, flag = get_nonmovingbuffer(d) + buf, llobj, flag = get_nonmovingbuffer_ll(d) try: for i in range(len(d)): if buf[i] == d[i]: counter += 1 finally: - free_nonmovingbuffer(d, buf, flag) + free_nonmovingbuffer_ll(buf, llobj, flag) return counter fn = self.compile(f, [], gcpolicy='semispace') # The semispace gc uses raw_malloc for its internal data structs @@ -574,13 +574,13 @@ def f(): counter = 0 for n in range(32): - buf, flag = get_nonmovingbuffer(d) + buf, llobj, flag = get_nonmovingbuffer_ll(d) try: for i in range(len(d)): if buf[i] == d[i]: counter += 1 finally: - free_nonmovingbuffer(d, buf, flag) + free_nonmovingbuffer_ll(buf, llobj, flag) return counter fn = self.compile(f, [], gcpolicy='incminimark') # The incminimark gc uses raw_malloc for its internal data structs @@ -917,6 +917,15 @@ assert buf[2] == 'r' assert buf[3] == '\x00' +def test_scoped_nonmoving_unicodebuffer(): + s = u'bar' + with scoped_nonmoving_unicodebuffer(s) as buf: + assert buf[0] == u'b' + assert buf[1] == u'a' + assert buf[2] == u'r' + with py.test.raises(IndexError): + buf[3] + def test_wcharp2utf8n(): w = 'hello\x00\x00\x00\x00' u, i = wcharp2utf8n(w, len(w)) diff -Nru pypy-7.1.1+dfsg/rpython/rtyper/rclass.py pypy-7.3.1+dfsg/rpython/rtyper/rclass.py --- pypy-7.1.1+dfsg/rpython/rtyper/rclass.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/rtyper/rclass.py 2020-04-10 19:28:41.000000000 +0000 @@ -416,6 +416,9 @@ v_cls1, v_cls2 = hop.inputargs(class_repr, class_repr) return hop.gendirectcall(ll_issubclass, v_cls1, v_cls2) + def ll_str(self, cls): + return cls.name + class RootClassRepr(ClassRepr): """ClassRepr for the root of the class hierarchy""" diff -Nru pypy-7.1.1+dfsg/rpython/rtyper/test/test_exception.py pypy-7.3.1+dfsg/rpython/rtyper/test/test_exception.py --- pypy-7.1.1+dfsg/rpython/rtyper/test/test_exception.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/rtyper/test/test_exception.py 2020-04-10 19:28:41.000000000 +0000 @@ -3,7 +3,7 @@ from rpython.translator.translator import TranslationContext from rpython.rtyper.test.tool import BaseRtypingTest from rpython.rtyper.llinterp import LLException -from rpython.rtyper.error import MissingRTypeOperation +from rpython.rtyper.error import MissingRTypeOperation, TyperError class MyException(Exception): @@ -164,3 +164,10 @@ except OverflowError: return 42 py.test.raises(MissingRTypeOperation, self.interpret, f, []) + + def test_cannot_raise_something_annotated_as_none(self): + def g(): + return None + def f(): + raise g() + py.test.raises(TyperError, rtype, f) diff -Nru pypy-7.1.1+dfsg/rpython/rtyper/test/test_rclass.py pypy-7.3.1+dfsg/rpython/rtyper/test/test_rclass.py --- pypy-7.1.1+dfsg/rpython/rtyper/test/test_rclass.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/rtyper/test/test_rclass.py 2020-04-10 19:28:41.000000000 +0000 @@ -1,6 +1,7 @@ import sys import py +import pytest from rpython.flowspace.model import summary from rpython.rlib.rarithmetic import r_longlong @@ -12,6 +13,8 @@ from rpython.rtyper.test.tool import BaseRtypingTest from rpython.translator.translator import TranslationContext, graphof +from rpython.rtyper.annlowlevel import llstr, hlstr + class EmptyBase(object): pass @@ -1225,6 +1228,28 @@ assert self.interpret(f, [True]) == f(True) assert self.interpret(f, [False]) == f(False) + @pytest.mark.xfail # XXX next support in rpython is broken! + def test_iter_bug_exception(self): + class Iterable(object): + def __iter__(self): + return self + + def next(self): + raise TyperError + + def f(): + i = Iterable() + it = iter(i) + try: + next(it) + except StopIteration: + return -7 + except TypeError: + return -9 + return 12 + + assert self.interpret(f, []) == f() + def test_indexing(self): class A(object): def __init__(self, data): @@ -1316,3 +1341,28 @@ def f(): return a.next.next.next.next is not None assert self.interpret(f, []) == True + + def test_str_of_type(self): + class A(object): + pass + + class B(A): + pass + + def f(i): + if i: + a = A() + else: + a = B() + return str(type(a)) + assert "A" in hlstr(self.interpret(f, [1])) + assert "B" in hlstr(self.interpret(f, [0])) + + def g(i): + if i: + a = A() + else: + a = B() + return str(a.__class__) + assert "A" in hlstr(self.interpret(g, [1])) + assert "B" in hlstr(self.interpret(g, [0])) diff -Nru pypy-7.1.1+dfsg/rpython/rtyper/test/test_rfloat.py pypy-7.3.1+dfsg/rpython/rtyper/test/test_rfloat.py --- pypy-7.1.1+dfsg/rpython/rtyper/test/test_rfloat.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/rtyper/test/test_rfloat.py 2020-04-10 19:28:41.000000000 +0000 @@ -253,3 +253,10 @@ return compute_hash(f) res = self.interpret(fn, [1.5]) assert res == compute_hash(1.5) + + def test_float_constant_inf(self): + from rpython.rlib.rfloat import INFINITY + def fn(): + return INFINITY # float('inf') is not supported by RPython so far + res = self.interpret(fn, []) + assert res == float('inf') diff -Nru pypy-7.1.1+dfsg/rpython/rtyper/test/test_rstr.py pypy-7.3.1+dfsg/rpython/rtyper/test/test_rstr.py --- pypy-7.1.1+dfsg/rpython/rtyper/test/test_rstr.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/rtyper/test/test_rstr.py 2020-04-10 19:28:41.000000000 +0000 @@ -1059,7 +1059,7 @@ l = [const('a'), const('b')] else: l = [const('a')] - l += y + l += y # list += string return const('').join(l) assert self.ll_to_string(self.interpret(f, [1, diff -Nru pypy-7.1.1+dfsg/rpython/tool/jitlogparser/parser.py pypy-7.3.1+dfsg/rpython/tool/jitlogparser/parser.py --- pypy-7.1.1+dfsg/rpython/tool/jitlogparser/parser.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/tool/jitlogparser/parser.py 2020-04-10 19:28:41.000000000 +0000 @@ -504,8 +504,10 @@ for line in lines: if line: num, count = line.split(':', 2) - mapping[num].count = int(count) - + try: + mapping[num].count = int(count) + except KeyError: + pass # too bad def mangle_descr(descr): if descr.startswith('TargetToken('): diff -Nru pypy-7.1.1+dfsg/rpython/tool/setuptools_msvc.py pypy-7.3.1+dfsg/rpython/tool/setuptools_msvc.py --- pypy-7.1.1+dfsg/rpython/tool/setuptools_msvc.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/tool/setuptools_msvc.py 2020-04-10 19:28:41.000000000 +0000 @@ -11,10 +11,12 @@ Microsoft Visual C++ 10.0: Microsoft Windows SDK 7.1 (x86, x64, ia64) -Microsoft Visual C++ 14.0: +Microsoft Visual C++ 14.X: Microsoft Visual C++ Build Tools 2015 (x86, x64, arm) - Microsoft Visual Studio 2017 (x86, x64, arm, arm64) Microsoft Visual Studio Build Tools 2017 (x86, x64, arm, arm64) + Microsoft Visual Studio Build Tools 2019 (x86, x64, arm, arm64) + +This may also support compilers shipped with compatible Visual Studio versions. """ # copied as-is from python3 @@ -22,24 +24,27 @@ # - commented out monkey patching # - lookup() returns str not unicode -import os +import json +from io import open +from os import listdir, pathsep +from os.path import join, isfile, isdir, dirname import sys import platform import itertools import distutils.errors -from setuptools.extern.six.moves import filterfalse - #from .monkey import get_unpatched if platform.system() == 'Windows': - from setuptools.extern.six.moves import winreg - safe_env = os.environ + if sys.version_info[0] < 3: + import _winreg as winreg + from itertools import ifilterfalse as filterfalse + else: + import winreg + from itertools import filterfalse + from os import environ else: - """ - Mock winreg and environ so the module can be imported - on this platform. - """ + # Mock winreg and environ so the module can be imported on this platform. class winreg: HKEY_USERS = None @@ -47,12 +52,12 @@ HKEY_LOCAL_MACHINE = None HKEY_CLASSES_ROOT = None - safe_env = dict() + environ = dict() _msvc9_suppress_errors = ( # msvc9compiler isn't available on some platforms ImportError, - + # msvc9compiler raises DistutilsPlatformError in some # environments. See #1118. distutils.errors.DistutilsPlatformError, @@ -67,15 +72,13 @@ def msvc9_find_vcvarsall(version): """ Patched "distutils.msvc9compiler.find_vcvarsall" to use the standalone - compiler build for Python (VCForPython). Fall back to original behavior - when the standalone compiler is not available. + compiler build for Python + (VCForPython / Microsoft Visual C++ Compiler for Python 2.7). - Redirect the path of "vcvarsall.bat". + Fall back to original behavior when the standalone compiler is not + available. - Known supported compilers - ------------------------- - Microsoft Visual C++ 9.0: - Microsoft Visual C++ Compiler for Python 2.7 (x86, amd64) + Redirect the path of "vcvarsall.bat". Parameters ---------- @@ -84,24 +87,25 @@ Return ------ - vcvarsall.bat path: str + str + vcvarsall.bat path """ - VC_BASE = r'Software\%sMicrosoft\DevDiv\VCForPython\%0.1f' - key = VC_BASE % ('', version) + vc_base = r'Software\%sMicrosoft\DevDiv\VCForPython\%0.1f' + key = vc_base % ('', version) try: # Per-user installs register the compiler path here productdir = Reg.get_value(key, "installdir") except KeyError: try: # All-user installs on a 64-bit system register here - key = VC_BASE % ('Wow6432Node\\', version) + key = vc_base % ('Wow6432Node\\', version) productdir = Reg.get_value(key, "installdir") except KeyError: productdir = None if productdir: - vcvarsall = os.path.os.path.join(productdir, "vcvarsall.bat") - if os.path.isfile(vcvarsall): + vcvarsall = join(productdir, "vcvarsall.bat") + if isfile(vcvarsall): return vcvarsall return get_unpatched(msvc9_find_vcvarsall)(version) @@ -110,20 +114,10 @@ def msvc9_query_vcvarsall(ver, arch='x86', *args, **kwargs): """ Patched "distutils.msvc9compiler.query_vcvarsall" for support extra - compilers. + Microsoft Visual C++ 9.0 and 10.0 compilers. Set environment without use of "vcvarsall.bat". - Known supported compilers - ------------------------- - Microsoft Visual C++ 9.0: - Microsoft Visual C++ Compiler for Python 2.7 (x86, amd64) - Microsoft Windows SDK 6.1 (x86, x64, ia64) - Microsoft Windows SDK 7.0 (x86, x64, ia64) - - Microsoft Visual C++ 10.0: - Microsoft Windows SDK 7.1 (x86, x64, ia64) - Parameters ---------- ver: float @@ -133,9 +127,10 @@ Return ------ - environment: dict + dict + environment """ - # Try to get environement from vcvarsall.bat (Classical way) + # Try to get environment from vcvarsall.bat (Classical way) #try: # orig = get_unpatched(msvc9_query_vcvarsall) # return orig(ver, arch, *args, **kwargs) @@ -157,17 +152,10 @@ def msvc14_get_vc_env(plat_spec): """ Patched "distutils._msvccompiler._get_vc_env" for support extra - compilers. + Microsoft Visual C++ 14.X compilers. Set environment without use of "vcvarsall.bat". - Known supported compilers - ------------------------- - Microsoft Visual C++ 14.0: - Microsoft Visual C++ Build Tools 2015 (x86, x64, arm) - Microsoft Visual Studio 2017 (x86, x64, arm, arm64) - Microsoft Visual Studio Build Tools 2017 (x86, x64, arm, arm64) - Parameters ---------- plat_spec: str @@ -175,7 +163,8 @@ Return ------ - environment: dict + dict + environment """ # Try to get environment from vcvarsall.bat (Classical way) #try: @@ -222,9 +211,9 @@ if version == 9.0: if arch.lower().find('ia64') > -1: # For VC++ 9.0, if IA64 support is needed, redirect user - # to Windows SDK 7.0 - message += ' Get it with "Microsoft Windows SDK 7.0": ' - message += msdownload % 3138 + # to Windows SDK 7.0. + # Note: No download link available from Microsoft. + message += ' Get it with "Microsoft Windows SDK 7.0"' else: # For VC++ 9.0 redirect user to Vc++ for Python 2.7 : # This redirection link is maintained by Microsoft. @@ -235,36 +224,59 @@ message += ' Get it with "Microsoft Windows SDK 7.1": ' message += msdownload % 8279 elif version >= 14.0: - # For VC++ 14.0 Redirect user to Visual C++ Build Tools - message += (' Get it with "Microsoft Visual C++ Build Tools": ' - r'http://landinghub.visualstudio.com/' - 'visual-cpp-build-tools') + # For VC++ 14.X Redirect user to latest Visual C++ Build Tools + message += (' Get it with "Build Tools for Visual Studio": ' + r'https://visualstudio.microsoft.com/downloads/') exc.args = (message, ) class PlatformInfo: """ - Current and Target Architectures informations. + Current and Target Architectures information. Parameters ---------- arch: str Target architecture. """ - current_cpu = safe_env.get('processor_architecture', '').lower() + current_cpu = environ.get('processor_architecture', '').lower() def __init__(self, arch): self.arch = arch.lower().replace('x64', 'amd64') @property def target_cpu(self): + """ + Return Target CPU architecture. + + Return + ------ + str + Target CPU + """ return self.arch[self.arch.find('_') + 1:] def target_is_x86(self): + """ + Return True if target CPU is x86 32 bits.. + + Return + ------ + bool + CPU is x86 32 bits + """ return self.target_cpu == 'x86' def current_is_x86(self): + """ + Return True if current CPU is x86 32 bits.. + + Return + ------ + bool + CPU is x86 32 bits + """ return self.current_cpu == 'x86' def current_dir(self, hidex86=False, x64=False): @@ -280,8 +292,8 @@ Return ------ - subfolder: str - '\target', or '' (see hidex86 parameter) + str + subfolder: '\target', or '' (see hidex86 parameter) """ return ( '' if (self.current_cpu == 'x86' and hidex86) else @@ -302,8 +314,8 @@ Return ------ - subfolder: str - '\current', or '' (see hidex86 parameter) + str + subfolder: '\current', or '' (see hidex86 parameter) """ return ( '' if (self.target_cpu == 'x86' and hidex86) else @@ -318,13 +330,13 @@ Parameters ---------- forcex86: bool - Use 'x86' as current architecture even if current acritecture is + Use 'x86' as current architecture even if current architecture is not x86. Return ------ - subfolder: str - '' if target architecture is current architecture, + str + subfolder: '' if target architecture is current architecture, '\current_target' if not. """ current = 'x86' if forcex86 else self.current_cpu @@ -336,7 +348,7 @@ class RegistryInfo: """ - Microsoft Visual Studio related registry informations. + Microsoft Visual Studio related registry information. Parameters ---------- @@ -355,6 +367,11 @@ def visualstudio(self): """ Microsoft Visual Studio root registry key. + + Return + ------ + str + Registry key """ return 'VisualStudio' @@ -362,27 +379,47 @@ def sxs(self): """ Microsoft Visual Studio SxS registry key. + + Return + ------ + str + Registry key """ - return os.path.join(self.visualstudio, 'SxS') + return join(self.visualstudio, 'SxS') @property def vc(self): """ Microsoft Visual C++ VC7 registry key. + + Return + ------ + str + Registry key """ - return os.path.join(self.sxs, 'VC7') + return join(self.sxs, 'VC7') @property def vs(self): """ Microsoft Visual Studio VS7 registry key. + + Return + ------ + str + Registry key """ - return os.path.join(self.sxs, 'VS7') + return join(self.sxs, 'VS7') @property def vc_for_python(self): """ Microsoft Visual C++ for Python registry key. + + Return + ------ + str + Registry key """ return r'DevDiv\VCForPython' @@ -390,6 +427,11 @@ def microsoft_sdk(self): """ Microsoft SDK registry key. + + Return + ------ + str + Registry key """ return 'Microsoft SDKs' @@ -397,20 +439,35 @@ def windows_sdk(self): """ Microsoft Windows/Platform SDK registry key. + + Return + ------ + str + Registry key """ - return os.path.join(self.microsoft_sdk, 'Windows') + return join(self.microsoft_sdk, 'Windows') @property def netfx_sdk(self): """ Microsoft .NET Framework SDK registry key. + + Return + ------ + str + Registry key """ - return os.path.join(self.microsoft_sdk, 'NETFXSDK') + return join(self.microsoft_sdk, 'NETFXSDK') @property def windows_kits_roots(self): """ Microsoft Windows Kits Roots registry key. + + Return + ------ + str + Registry key """ return r'Windows Kits\Installed Roots' @@ -427,10 +484,11 @@ Return ------ - str: value + str + Registry key """ node64 = '' if self.pi.current_is_x86() or x86 else 'Wow6432Node' - return os.path.join('Software', node64, 'Microsoft', key) + return join('Software', node64, 'Microsoft', key) def lookup(self, key, name): """ @@ -445,32 +503,32 @@ Return ------ - str: value + str + value """ - KEY_READ = winreg.KEY_READ + key_read = winreg.KEY_READ openkey = winreg.OpenKey ms = self.microsoft for hkey in self.HKEYS: try: - bkey = openkey(hkey, ms(key), 0, KEY_READ) + bkey = openkey(hkey, ms(key), 0, key_read) except (OSError, IOError): if not self.pi.current_is_x86(): try: - bkey = openkey(hkey, ms(key, True), 0, KEY_READ) + bkey = openkey(hkey, ms(key, True), 0, key_read) except (OSError, IOError): continue else: continue try: - # modified to return str for python2 - return winreg.QueryValueEx(bkey, name)[0].encode('utf8') + return winreg.QueryValueEx(bkey, name)[0] except (OSError, IOError): pass class SystemInfo: """ - Microsoft Windows and Visual Studio related system inormations. + Microsoft Windows and Visual Studio related system information. Parameters ---------- @@ -481,30 +539,53 @@ """ # Variables and properties in this class use originals CamelCase variables - # names from Microsoft source files for more easy comparaison. - WinDir = safe_env.get('WinDir', '') - ProgramFiles = safe_env.get('ProgramFiles', '') - ProgramFilesx86 = safe_env.get('ProgramFiles(x86)', ProgramFiles) + # names from Microsoft source files for more easy comparison. + WinDir = environ.get('WinDir', '') + ProgramFiles = environ.get('ProgramFiles', '') + ProgramFilesx86 = environ.get('ProgramFiles(x86)', ProgramFiles) def __init__(self, registry_info, vc_ver=None): self.ri = registry_info self.pi = self.ri.pi - self.vc_ver = vc_ver or self._find_latest_available_vc_ver() + # self.vc_ver = vc_ver or self._find_latest_available_vc_ver() - def _find_latest_available_vc_ver(self): - try: - return self.find_available_vc_vers()[-1] - except IndexError: - err = 'No Microsoft Visual C++ version found' - raise distutils.errors.DistutilsPlatformError(err) + self.known_vs_paths = self.find_programdata_vs_vers() + + # Except for VS15+, VC version is aligned with VS version + self.vs_ver = self.vc_ver = ( + vc_ver or self._find_latest_available_vs_ver()) + + def _find_latest_available_vs_ver(self): + """ + Find the latest VC version - def find_available_vc_vers(self): + Return + ------ + float + version + """ + reg_vc_vers = self.find_reg_vs_vers() + + if not (reg_vc_vers or self.known_vs_paths): + raise distutils.errors.DistutilsPlatformError( + 'No Microsoft Visual C++ version found') + + vc_vers = set(reg_vc_vers) + vc_vers.update(self.known_vs_paths) + return sorted(vc_vers)[-1] + + def find_reg_vs_vers(self): """ - Find all available Microsoft Visual C++ versions. + Find Microsoft Visual Studio versions available in registry. + + Return + ------ + list of float + Versions """ ms = self.ri.microsoft vckeys = (self.ri.vc, self.ri.vc_for_python, self.ri.vs) - vc_vers = [] + vs_vers = [] for hkey in self.ri.HKEYS: for key in vckeys: try: @@ -515,49 +596,108 @@ for i in range(values): try: ver = float(winreg.EnumValue(bkey, i)[0]) - if ver not in vc_vers: - vc_vers.append(ver) + if ver not in vs_vers: + vs_vers.append(ver) except ValueError: pass for i in range(subkeys): try: ver = float(winreg.EnumKey(bkey, i)) - if ver not in vc_vers: - vc_vers.append(ver) + if ver not in vs_vers: + vs_vers.append(ver) except ValueError: pass - return sorted(vc_vers) + return sorted(vs_vers) + + def find_programdata_vs_vers(self): + r""" + Find Visual studio 2017+ versions from information in + "C:\ProgramData\Microsoft\VisualStudio\Packages\_Instances". + + Return + ------ + dict + float version as key, path as value. + """ + vs_versions = {} + instances_dir = \ + r'C:\ProgramData\Microsoft\VisualStudio\Packages\_Instances' + + try: + hashed_names = listdir(instances_dir) + + except (OSError, IOError): + # Directory not exists with all Visual Studio versions + return vs_versions + + for name in hashed_names: + try: + # Get VS installation path from "state.json" file + state_path = join(instances_dir, name, 'state.json') + with open(state_path, 'rt', encoding='utf-8') as state_file: + state = json.load(state_file) + vs_path = state['installationPath'] + + # Raises OSError if this VS installation does not contain VC + listdir(join(vs_path, r'VC\Tools\MSVC')) + + # Store version and path + vs_versions[self._as_float_version( + state['installationVersion'])] = vs_path + + except (OSError, IOError, KeyError): + # Skip if "state.json" file is missing or bad format + continue + + return vs_versions + + @staticmethod + def _as_float_version(version): + """ + Return a string version as a simplified float version (major.minor) + + Parameters + ---------- + version: str + Version. + + Return + ------ + float + version + """ + return float('.'.join(version.split('.')[:2])) @property def VSInstallDir(self): """ Microsoft Visual Studio directory. + + Return + ------ + str + path """ # Default path - name = 'Microsoft Visual Studio %0.1f' % self.vc_ver - default = os.path.join(self.ProgramFilesx86, name) + default = join(self.ProgramFilesx86, + 'Microsoft Visual Studio %0.1f' % self.vs_ver) # Try to get path from registry, if fail use default path - return self.ri.lookup(self.ri.vs, '%0.1f' % self.vc_ver) or default + return self.ri.lookup(self.ri.vs, '%0.1f' % self.vs_ver) or default @property def VCInstallDir(self): """ Microsoft Visual C++ directory. - """ - self.VSInstallDir - - guess_vc = self._guess_vc() or self._guess_vc_legacy() - - # Try to get "VC++ for Python" path from registry as default path - reg_path = os.path.join(self.ri.vc_for_python, '%0.1f' % self.vc_ver) - python_vc = self.ri.lookup(reg_path, 'installdir') - default_vc = os.path.join(python_vc, 'VC') if python_vc else guess_vc - # Try to get path from registry, if fail use default path - path = self.ri.lookup(self.ri.vc, '%0.1f' % self.vc_ver) or default_vc + Return + ------ + str + path + """ + path = self._guess_vc() or self._guess_vc_legacy() - if not os.path.isdir(path): + if not isdir(path): msg = 'Microsoft Visual C++ directory not found' raise distutils.errors.DistutilsPlatformError(msg) @@ -565,186 +705,256 @@ def _guess_vc(self): """ - Locate Visual C for 2017 + Locate Visual C++ for VS2017+. + + Return + ------ + str + path """ - if self.vc_ver <= 14.0: - return + if self.vs_ver <= 14.0: + return '' + + try: + # First search in known VS paths + vs_dir = self.known_vs_paths[self.vs_ver] + except KeyError: + # Else, search with path from registry + vs_dir = self.VSInstallDir + + guess_vc = join(vs_dir, r'VC\Tools\MSVC') - default = r'VC\Tools\MSVC' - guess_vc = os.path.join(self.VSInstallDir, default) # Subdir with VC exact version as name try: - vc_exact_ver = os.listdir(guess_vc)[-1] - return os.path.join(guess_vc, vc_exact_ver) + # Update the VC version with real one instead of VS version + vc_ver = listdir(guess_vc)[-1] + self.vc_ver = self._as_float_version(vc_ver) + return join(guess_vc, vc_ver) except (OSError, IOError, IndexError): - pass + return '' def _guess_vc_legacy(self): """ - Locate Visual C for versions prior to 2017 + Locate Visual C++ for versions prior to 2017. + + Return + ------ + str + path """ - default = r'Microsoft Visual Studio %0.1f\VC' % self.vc_ver - return os.path.join(self.ProgramFilesx86, default) + default = join(self.ProgramFilesx86, + r'Microsoft Visual Studio %0.1f\VC' % self.vs_ver) + + # Try to get "VC++ for Python" path from registry as default path + reg_path = join(self.ri.vc_for_python, '%0.1f' % self.vs_ver) + python_vc = self.ri.lookup(reg_path, 'installdir') + default_vc = join(python_vc, 'VC') if python_vc else default + + # Try to get path from registry, if fail use default path + return self.ri.lookup(self.ri.vc, '%0.1f' % self.vs_ver) or default_vc @property def WindowsSdkVersion(self): """ Microsoft Windows SDK versions for specified MSVC++ version. + + Return + ------ + tuple of str + versions """ - if self.vc_ver <= 9.0: - return ('7.0', '6.1', '6.0a') - elif self.vc_ver == 10.0: - return ('7.1', '7.0a') - elif self.vc_ver == 11.0: - return ('8.0', '8.0a') - elif self.vc_ver == 12.0: - return ('8.1', '8.1a') - elif self.vc_ver >= 14.0: - return ('10.0', '8.1') + if self.vs_ver <= 9.0: + return '7.0', '6.1', '6.0a' + elif self.vs_ver == 10.0: + return '7.1', '7.0a' + elif self.vs_ver == 11.0: + return '8.0', '8.0a' + elif self.vs_ver == 12.0: + return '8.1', '8.1a' + elif self.vs_ver >= 14.0: + return '10.0', '8.1' @property def WindowsSdkLastVersion(self): """ - Microsoft Windows SDK last version + Microsoft Windows SDK last version. + + Return + ------ + str + version """ - return self._use_last_dir_name(os.path.join( - self.WindowsSdkDir, 'lib')) + return self._use_last_dir_name(join(self.WindowsSdkDir, 'lib')) @property def WindowsSdkDir(self): """ Microsoft Windows SDK directory. + + Return + ------ + str + path """ sdkdir = '' for ver in self.WindowsSdkVersion: # Try to get it from registry - loc = os.path.join(self.ri.windows_sdk, 'v%s' % ver) + loc = join(self.ri.windows_sdk, 'v%s' % ver) sdkdir = self.ri.lookup(loc, 'installationfolder') if sdkdir: break - if not sdkdir or not os.path.isdir(sdkdir): + if not sdkdir or not isdir(sdkdir): # Try to get "VC++ for Python" version from registry - path = os.path.join(self.ri.vc_for_python, '%0.1f' % self.vc_ver) + path = join(self.ri.vc_for_python, '%0.1f' % self.vc_ver) install_base = self.ri.lookup(path, 'installdir') if install_base: - sdkdir = os.path.join(install_base, 'WinSDK') - if not sdkdir or not os.path.isdir(sdkdir): + sdkdir = join(install_base, 'WinSDK') + if not sdkdir or not isdir(sdkdir): # If fail, use default new path for ver in self.WindowsSdkVersion: intver = ver[:ver.rfind('.')] - path = r'Microsoft SDKs\Windows Kits\%s' % (intver) - d = os.path.join(self.ProgramFiles, path) - if os.path.isdir(d): + path = r'Microsoft SDKs\Windows Kits\%s' % intver + d = join(self.ProgramFiles, path) + if isdir(d): sdkdir = d - if not sdkdir or not os.path.isdir(sdkdir): + if not sdkdir or not isdir(sdkdir): # If fail, use default old path for ver in self.WindowsSdkVersion: path = r'Microsoft SDKs\Windows\v%s' % ver - d = os.path.join(self.ProgramFiles, path) - if os.path.isdir(d): + d = join(self.ProgramFiles, path) + if isdir(d): sdkdir = d if not sdkdir: # If fail, use Platform SDK - sdkdir = os.path.join(self.VCInstallDir, 'PlatformSDK') + sdkdir = join(self.VCInstallDir, 'PlatformSDK') return sdkdir @property def WindowsSDKExecutablePath(self): """ Microsoft Windows SDK executable directory. + + Return + ------ + str + path """ # Find WinSDK NetFx Tools registry dir name - if self.vc_ver <= 11.0: + if self.vs_ver <= 11.0: netfxver = 35 arch = '' else: netfxver = 40 - hidex86 = True if self.vc_ver <= 12.0 else False + hidex86 = True if self.vs_ver <= 12.0 else False arch = self.pi.current_dir(x64=True, hidex86=hidex86) fx = 'WinSDK-NetFx%dTools%s' % (netfxver, arch.replace('\\', '-')) - # liste all possibles registry paths + # list all possibles registry paths regpaths = [] - if self.vc_ver >= 14.0: + if self.vs_ver >= 14.0: for ver in self.NetFxSdkVersion: - regpaths += [os.path.join(self.ri.netfx_sdk, ver, fx)] + regpaths += [join(self.ri.netfx_sdk, ver, fx)] for ver in self.WindowsSdkVersion: - regpaths += [os.path.join(self.ri.windows_sdk, 'v%sA' % ver, fx)] + regpaths += [join(self.ri.windows_sdk, 'v%sA' % ver, fx)] # Return installation folder from the more recent path for path in regpaths: execpath = self.ri.lookup(path, 'installationfolder') if execpath: - break - return execpath + return execpath @property def FSharpInstallDir(self): """ Microsoft Visual F# directory. + + Return + ------ + str + path """ - path = r'%0.1f\Setup\F#' % self.vc_ver - path = os.path.join(self.ri.visualstudio, path) + path = join(self.ri.visualstudio, r'%0.1f\Setup\F#' % self.vs_ver) return self.ri.lookup(path, 'productdir') or '' @property def UniversalCRTSdkDir(self): """ Microsoft Universal CRT SDK directory. + + Return + ------ + str + path """ # Set Kit Roots versions for specified MSVC++ version - if self.vc_ver >= 14.0: - vers = ('10', '81') - else: - vers = () + vers = ('10', '81') if self.vs_ver >= 14.0 else () # Find path of the more recent Kit for ver in vers: sdkdir = self.ri.lookup(self.ri.windows_kits_roots, 'kitsroot%s' % ver) if sdkdir: - break - return sdkdir or '' + return sdkdir or '' @property def UniversalCRTSdkLastVersion(self): """ - Microsoft Universal C Runtime SDK last version + Microsoft Universal C Runtime SDK last version. + + Return + ------ + str + version """ - return self._use_last_dir_name(os.path.join( - self.UniversalCRTSdkDir, 'lib')) + return self._use_last_dir_name(join(self.UniversalCRTSdkDir, 'lib')) @property def NetFxSdkVersion(self): """ Microsoft .NET Framework SDK versions. + + Return + ------ + tuple of str + versions """ - # Set FxSdk versions for specified MSVC++ version - if self.vc_ver >= 14.0: - return ('4.6.1', '4.6') - else: - return () + # Set FxSdk versions for specified VS version + return (('4.7.2', '4.7.1', '4.7', + '4.6.2', '4.6.1', '4.6', + '4.5.2', '4.5.1', '4.5') + if self.vs_ver >= 14.0 else ()) @property def NetFxSdkDir(self): """ Microsoft .NET Framework SDK directory. + + Return + ------ + str + path """ + sdkdir = '' for ver in self.NetFxSdkVersion: - loc = os.path.join(self.ri.netfx_sdk, ver) + loc = join(self.ri.netfx_sdk, ver) sdkdir = self.ri.lookup(loc, 'kitsinstallationfolder') if sdkdir: break - return sdkdir or '' + return sdkdir @property def FrameworkDir32(self): """ Microsoft .NET Framework 32bit directory. + + Return + ------ + str + path """ # Default path - guess_fw = os.path.join(self.WinDir, r'Microsoft.NET\Framework') + guess_fw = join(self.WinDir, r'Microsoft.NET\Framework') # Try to get path from registry, if fail use default path return self.ri.lookup(self.ri.vc, 'frameworkdir32') or guess_fw @@ -753,9 +963,14 @@ def FrameworkDir64(self): """ Microsoft .NET Framework 64bit directory. + + Return + ------ + str + path """ # Default path - guess_fw = os.path.join(self.WinDir, r'Microsoft.NET\Framework64') + guess_fw = join(self.WinDir, r'Microsoft.NET\Framework64') # Try to get path from registry, if fail use default path return self.ri.lookup(self.ri.vc, 'frameworkdir64') or guess_fw @@ -764,6 +979,11 @@ def FrameworkVersion32(self): """ Microsoft .NET Framework 32bit versions. + + Return + ------ + tuple of str + versions """ return self._find_dot_net_versions(32) @@ -771,6 +991,11 @@ def FrameworkVersion64(self): """ Microsoft .NET Framework 64bit versions. + + Return + ------ + tuple of str + versions """ return self._find_dot_net_versions(64) @@ -782,6 +1007,11 @@ ---------- bits: int Platform number of bits: 32 or 64. + + Return + ------ + tuple of str + versions """ # Find actual .NET version in registry reg_ver = self.ri.lookup(self.ri.vc, 'frameworkver%d' % bits) @@ -789,18 +1019,17 @@ ver = reg_ver or self._use_last_dir_name(dot_net_dir, 'v') or '' # Set .NET versions for specified MSVC++ version - if self.vc_ver >= 12.0: - frameworkver = (ver, 'v4.0') - elif self.vc_ver >= 10.0: - frameworkver = ('v4.0.30319' if ver.lower()[:2] != 'v4' else ver, - 'v3.5') - elif self.vc_ver == 9.0: - frameworkver = ('v3.5', 'v2.0.50727') - if self.vc_ver == 8.0: - frameworkver = ('v3.0', 'v2.0.50727') - return frameworkver + if self.vs_ver >= 12.0: + return ver, 'v4.0' + elif self.vs_ver >= 10.0: + return 'v4.0.30319' if ver.lower()[:2] != 'v4' else ver, 'v3.5' + elif self.vs_ver == 9.0: + return 'v3.5', 'v2.0.50727' + elif self.vs_ver == 8.0: + return 'v3.0', 'v2.0.50727' - def _use_last_dir_name(self, path, prefix=''): + @staticmethod + def _use_last_dir_name(path, prefix=''): """ Return name of the last dir in path or '' if no dir found. @@ -809,12 +1038,17 @@ path: str Use dirs in this path prefix: str - Use only dirs startings by this prefix + Use only dirs starting by this prefix + + Return + ------ + str + name """ matching_dirs = ( dir_name - for dir_name in reversed(os.listdir(path)) - if os.path.isdir(os.path.join(path, dir_name)) and + for dir_name in reversed(listdir(path)) + if isdir(join(path, dir_name)) and dir_name.startswith(prefix) ) return next(matching_dirs, None) or '' @@ -825,7 +1059,7 @@ Return environment variables for specified Microsoft Visual C++ version and platform : Lib, Include, Path and libpath. - This function is compatible with Microsoft Visual C++ 9.0 to 14.0. + This function is compatible with Microsoft Visual C++ 9.0 to 14.X. Script created by analysing Microsoft environment configuration files like "vcvars[...].bat", "SetEnv.Cmd", "vcbuildtools.bat", ... @@ -842,7 +1076,7 @@ """ # Variables and properties in this class use originals CamelCase variables - # names from Microsoft source files for more easy comparaison. + # names from Microsoft source files for more easy comparison. def __init__(self, arch, vc_ver=None, vc_min_ver=0): self.pi = PlatformInfo(arch) @@ -854,204 +1088,254 @@ raise distutils.errors.DistutilsPlatformError(err) @property + def vs_ver(self): + """ + Microsoft Visual Studio. + + Return + ------ + float + version + """ + return self.si.vs_ver + + @property def vc_ver(self): """ Microsoft Visual C++ version. + + Return + ------ + float + version """ return self.si.vc_ver @property def VSTools(self): """ - Microsoft Visual Studio Tools + Microsoft Visual Studio Tools. + + Return + ------ + list of str + paths """ paths = [r'Common7\IDE', r'Common7\Tools'] - if self.vc_ver >= 14.0: + if self.vs_ver >= 14.0: arch_subdir = self.pi.current_dir(hidex86=True, x64=True) paths += [r'Common7\IDE\CommonExtensions\Microsoft\TestWindow'] paths += [r'Team Tools\Performance Tools'] paths += [r'Team Tools\Performance Tools%s' % arch_subdir] - return [os.path.join(self.si.VSInstallDir, path) for path in paths] + return [join(self.si.VSInstallDir, path) for path in paths] @property def VCIncludes(self): """ - Microsoft Visual C++ & Microsoft Foundation Class Includes + Microsoft Visual C++ & Microsoft Foundation Class Includes. + + Return + ------ + list of str + paths """ - return [os.path.join(self.si.VCInstallDir, 'Include'), - os.path.join(self.si.VCInstallDir, r'ATLMFC\Include')] + return [join(self.si.VCInstallDir, 'Include'), + join(self.si.VCInstallDir, r'ATLMFC\Include')] @property def VCLibraries(self): """ - Microsoft Visual C++ & Microsoft Foundation Class Libraries + Microsoft Visual C++ & Microsoft Foundation Class Libraries. + + Return + ------ + list of str + paths """ - if self.vc_ver >= 15.0: + if self.vs_ver >= 15.0: arch_subdir = self.pi.target_dir(x64=True) else: arch_subdir = self.pi.target_dir(hidex86=True) paths = ['Lib%s' % arch_subdir, r'ATLMFC\Lib%s' % arch_subdir] - if self.vc_ver >= 14.0: + if self.vs_ver >= 14.0: paths += [r'Lib\store%s' % arch_subdir] - return [os.path.join(self.si.VCInstallDir, path) for path in paths] + return [join(self.si.VCInstallDir, path) for path in paths] @property def VCStoreRefs(self): """ - Microsoft Visual C++ store references Libraries + Microsoft Visual C++ store references Libraries. + + Return + ------ + list of str + paths """ - if self.vc_ver < 14.0: + if self.vs_ver < 14.0: return [] - return [os.path.join(self.si.VCInstallDir, r'Lib\store\references')] + return [join(self.si.VCInstallDir, r'Lib\store\references')] @property def VCTools(self): """ - Microsoft Visual C++ Tools + Microsoft Visual C++ Tools. + + Return + ------ + list of str + paths """ si = self.si - tools = [os.path.join(si.VCInstallDir, 'VCPackages')] + tools = [join(si.VCInstallDir, 'VCPackages')] - forcex86 = True if self.vc_ver <= 10.0 else False + forcex86 = True if self.vs_ver <= 10.0 else False arch_subdir = self.pi.cross_dir(forcex86) if arch_subdir: - tools += [os.path.join(si.VCInstallDir, 'Bin%s' % arch_subdir)] + tools += [join(si.VCInstallDir, 'Bin%s' % arch_subdir)] - if self.vc_ver == 14.0: + if self.vs_ver == 14.0: path = 'Bin%s' % self.pi.current_dir(hidex86=True) - tools += [os.path.join(si.VCInstallDir, path)] + tools += [join(si.VCInstallDir, path)] - elif self.vc_ver >= 15.0: + elif self.vs_ver >= 15.0: host_dir = (r'bin\HostX86%s' if self.pi.current_is_x86() else r'bin\HostX64%s') - tools += [os.path.join( + tools += [join( si.VCInstallDir, host_dir % self.pi.target_dir(x64=True))] if self.pi.current_cpu != self.pi.target_cpu: - tools += [os.path.join( + tools += [join( si.VCInstallDir, host_dir % self.pi.current_dir(x64=True))] else: - tools += [os.path.join(si.VCInstallDir, 'Bin')] + tools += [join(si.VCInstallDir, 'Bin')] return tools @property def OSLibraries(self): """ - Microsoft Windows SDK Libraries + Microsoft Windows SDK Libraries. + + Return + ------ + list of str + paths """ - if self.vc_ver <= 10.0: + if self.vs_ver <= 10.0: arch_subdir = self.pi.target_dir(hidex86=True, x64=True) - return [os.path.join(self.si.WindowsSdkDir, 'Lib%s' % arch_subdir)] + return [join(self.si.WindowsSdkDir, 'Lib%s' % arch_subdir)] else: arch_subdir = self.pi.target_dir(x64=True) - lib = os.path.join(self.si.WindowsSdkDir, 'lib') + lib = join(self.si.WindowsSdkDir, 'lib') libver = self._sdk_subdir - return [os.path.join(lib, '%sum%s' % (libver , arch_subdir))] + return [join(lib, '%sum%s' % (libver , arch_subdir))] @property def OSIncludes(self): """ - Microsoft Windows SDK Include + Microsoft Windows SDK Include. + + Return + ------ + list of str + paths """ - include = os.path.join(self.si.WindowsSdkDir, 'include') + include = join(self.si.WindowsSdkDir, 'include') - if self.vc_ver <= 10.0: - return [include, os.path.join(include, 'gl')] + if self.vs_ver <= 10.0: + return [include, join(include, 'gl')] else: - if self.vc_ver >= 14.0: + if self.vs_ver >= 14.0: sdkver = self._sdk_subdir else: sdkver = '' - return [os.path.join(include, '%sshared' % sdkver), - os.path.join(include, '%sum' % sdkver), - os.path.join(include, '%swinrt' % sdkver)] + return [join(include, '%sshared' % sdkver), + join(include, '%sum' % sdkver), + join(include, '%swinrt' % sdkver)] @property def OSLibpath(self): """ - Microsoft Windows SDK Libraries Paths + Microsoft Windows SDK Libraries Paths. + + Return + ------ + list of str + paths """ - ref = os.path.join(self.si.WindowsSdkDir, 'References') + ref = join(self.si.WindowsSdkDir, 'References') libpath = [] - if self.vc_ver <= 9.0: + if self.vs_ver <= 9.0: libpath += self.OSLibraries - if self.vc_ver >= 11.0: - libpath += [os.path.join(ref, r'CommonConfiguration\Neutral')] + if self.vs_ver >= 11.0: + libpath += [join(ref, r'CommonConfiguration\Neutral')] - if self.vc_ver >= 14.0: + if self.vs_ver >= 14.0: libpath += [ ref, - os.path.join(self.si.WindowsSdkDir, 'UnionMetadata'), - os.path.join( - ref, - 'Windows.Foundation.UniversalApiContract', - '1.0.0.0', - ), - os.path.join( - ref, - 'Windows.Foundation.FoundationContract', - '1.0.0.0', - ), - os.path.join( - ref, - 'Windows.Networking.Connectivity.WwanContract', - '1.0.0.0', - ), - os.path.join( - self.si.WindowsSdkDir, - 'ExtensionSDKs', - 'Microsoft.VCLibs', - '%0.1f' % self.vc_ver, - 'References', - 'CommonConfiguration', - 'neutral', - ), + join(self.si.WindowsSdkDir, 'UnionMetadata'), + join(ref, 'Windows.Foundation.UniversalApiContract', '1.0.0.0'), + join(ref, 'Windows.Foundation.FoundationContract', '1.0.0.0'), + join(ref,'Windows.Networking.Connectivity.WwanContract', + '1.0.0.0'), + join(self.si.WindowsSdkDir, 'ExtensionSDKs', 'Microsoft.VCLibs', + '%0.1f' % self.vs_ver, 'References', 'CommonConfiguration', + 'neutral'), ] return libpath @property def SdkTools(self): """ - Microsoft Windows SDK Tools + Microsoft Windows SDK Tools. + + Return + ------ + list of str + paths """ return list(self._sdk_tools()) def _sdk_tools(self): """ - Microsoft Windows SDK Tools paths generator + Microsoft Windows SDK Tools paths generator. + + Return + ------ + generator of str + paths """ - if self.vc_ver < 15.0: - bin_dir = 'Bin' if self.vc_ver <= 11.0 else r'Bin\x86' - yield os.path.join(self.si.WindowsSdkDir, bin_dir) + if self.vs_ver < 15.0: + bin_dir = 'Bin' if self.vs_ver <= 11.0 else r'Bin\x86' + yield join(self.si.WindowsSdkDir, bin_dir) if not self.pi.current_is_x86(): arch_subdir = self.pi.current_dir(x64=True) path = 'Bin%s' % arch_subdir - yield os.path.join(self.si.WindowsSdkDir, path) + yield join(self.si.WindowsSdkDir, path) - if self.vc_ver == 10.0 or self.vc_ver == 11.0: + if self.vs_ver in (10.0, 11.0): if self.pi.target_is_x86(): arch_subdir = '' else: arch_subdir = self.pi.current_dir(hidex86=True, x64=True) path = r'Bin\NETFX 4.0 Tools%s' % arch_subdir - yield os.path.join(self.si.WindowsSdkDir, path) + yield join(self.si.WindowsSdkDir, path) - elif self.vc_ver >= 15.0: - path = os.path.join(self.si.WindowsSdkDir, 'Bin') + elif self.vs_ver >= 15.0: + path = join(self.si.WindowsSdkDir, 'Bin') arch_subdir = self.pi.current_dir(x64=True) sdkver = self.si.WindowsSdkLastVersion - yield os.path.join(path, '%s%s' % (sdkver, arch_subdir)) + yield join(path, '%s%s' % (sdkver, arch_subdir)) if self.si.WindowsSDKExecutablePath: yield self.si.WindowsSDKExecutablePath @@ -1059,7 +1343,12 @@ @property def _sdk_subdir(self): """ - Microsoft Windows SDK version subdir + Microsoft Windows SDK version subdir. + + Return + ------ + str + subdir """ ucrtver = self.si.WindowsSdkLastVersion return ('%s\\' % ucrtver) if ucrtver else '' @@ -1067,22 +1356,32 @@ @property def SdkSetup(self): """ - Microsoft Windows SDK Setup + Microsoft Windows SDK Setup. + + Return + ------ + list of str + paths """ - if self.vc_ver > 9.0: + if self.vs_ver > 9.0: return [] - return [os.path.join(self.si.WindowsSdkDir, 'Setup')] + return [join(self.si.WindowsSdkDir, 'Setup')] @property def FxTools(self): """ - Microsoft .NET Framework Tools + Microsoft .NET Framework Tools. + + Return + ------ + list of str + paths """ pi = self.pi si = self.si - if self.vc_ver <= 10.0: + if self.vs_ver <= 10.0: include32 = True include64 = not pi.target_is_x86() and not pi.current_is_x86() else: @@ -1091,102 +1390,142 @@ tools = [] if include32: - tools += [os.path.join(si.FrameworkDir32, ver) + tools += [join(si.FrameworkDir32, ver) for ver in si.FrameworkVersion32] if include64: - tools += [os.path.join(si.FrameworkDir64, ver) + tools += [join(si.FrameworkDir64, ver) for ver in si.FrameworkVersion64] return tools @property def NetFxSDKLibraries(self): """ - Microsoft .Net Framework SDK Libraries + Microsoft .Net Framework SDK Libraries. + + Return + ------ + list of str + paths """ - if self.vc_ver < 14.0 or not self.si.NetFxSdkDir: + if self.vs_ver < 14.0 or not self.si.NetFxSdkDir: return [] arch_subdir = self.pi.target_dir(x64=True) - return [os.path.join(self.si.NetFxSdkDir, r'lib\um%s' % arch_subdir)] + return [join(self.si.NetFxSdkDir, r'lib\um%s' % arch_subdir)] @property def NetFxSDKIncludes(self): """ - Microsoft .Net Framework SDK Includes + Microsoft .Net Framework SDK Includes. + + Return + ------ + list of str + paths """ - if self.vc_ver < 14.0 or not self.si.NetFxSdkDir: + if self.vs_ver < 14.0 or not self.si.NetFxSdkDir: return [] - return [os.path.join(self.si.NetFxSdkDir, r'include\um')] + return [join(self.si.NetFxSdkDir, r'include\um')] @property def VsTDb(self): """ - Microsoft Visual Studio Team System Database + Microsoft Visual Studio Team System Database. + + Return + ------ + list of str + paths """ - return [os.path.join(self.si.VSInstallDir, r'VSTSDB\Deploy')] + return [join(self.si.VSInstallDir, r'VSTSDB\Deploy')] @property def MSBuild(self): """ - Microsoft Build Engine + Microsoft Build Engine. + + Return + ------ + list of str + paths """ - if self.vc_ver < 12.0: + if self.vs_ver < 12.0: return [] - elif self.vc_ver < 15.0: + elif self.vs_ver < 15.0: base_path = self.si.ProgramFilesx86 arch_subdir = self.pi.current_dir(hidex86=True) else: base_path = self.si.VSInstallDir arch_subdir = '' - path = r'MSBuild\%0.1f\bin%s' % (self.vc_ver, arch_subdir) - build = [os.path.join(base_path, path)] + path = r'MSBuild\%0.1f\bin%s' % (self.vs_ver, arch_subdir) + build = [join(base_path, path)] - if self.vc_ver >= 15.0: + if self.vs_ver >= 15.0: # Add Roslyn C# & Visual Basic Compiler - build += [os.path.join(base_path, path, 'Roslyn')] + build += [join(base_path, path, 'Roslyn')] return build @property def HTMLHelpWorkshop(self): """ - Microsoft HTML Help Workshop + Microsoft HTML Help Workshop. + + Return + ------ + list of str + paths """ - if self.vc_ver < 11.0: + if self.vs_ver < 11.0: return [] - return [os.path.join(self.si.ProgramFilesx86, 'HTML Help Workshop')] + return [join(self.si.ProgramFilesx86, 'HTML Help Workshop')] @property def UCRTLibraries(self): """ - Microsoft Universal C Runtime SDK Libraries + Microsoft Universal C Runtime SDK Libraries. + + Return + ------ + list of str + paths """ - if self.vc_ver < 14.0: + if self.vs_ver < 14.0: return [] arch_subdir = self.pi.target_dir(x64=True) - lib = os.path.join(self.si.UniversalCRTSdkDir, 'lib') + lib = join(self.si.UniversalCRTSdkDir, 'lib') ucrtver = self._ucrt_subdir - return [os.path.join(lib, '%sucrt%s' % (ucrtver, arch_subdir))] + return [join(lib, '%sucrt%s' % (ucrtver, arch_subdir))] @property def UCRTIncludes(self): """ - Microsoft Universal C Runtime SDK Include + Microsoft Universal C Runtime SDK Include. + + Return + ------ + list of str + paths """ - if self.vc_ver < 14.0: + if self.vs_ver < 14.0: return [] - include = os.path.join(self.si.UniversalCRTSdkDir, 'include') - return [os.path.join(include, '%sucrt' % self._ucrt_subdir)] + include = join(self.si.UniversalCRTSdkDir, 'include') + return [join(include, '%sucrt' % self._ucrt_subdir)] @property def _ucrt_subdir(self): """ - Microsoft Universal C Runtime SDK version subdir + Microsoft Universal C Runtime SDK version subdir. + + Return + ------ + str + subdir """ ucrtver = self.si.UniversalCRTSdkLastVersion return ('%s\\' % ucrtver) if ucrtver else '' @@ -1194,31 +1533,53 @@ @property def FSharp(self): """ - Microsoft Visual F# + Microsoft Visual F#. + + Return + ------ + list of str + paths """ - if self.vc_ver < 11.0 and self.vc_ver > 12.0: + if 11.0 > self.vs_ver > 12.0: return [] - return self.si.FSharpInstallDir + return [self.si.FSharpInstallDir] @property def VCRuntimeRedist(self): """ - Microsoft Visual C++ runtime redistribuable dll - """ - arch_subdir = self.pi.target_dir(x64=True) - if self.vc_ver < 15: - redist_path = self.si.VCInstallDir - vcruntime = 'redist%s\\Microsoft.VC%d0.CRT\\vcruntime%d0.dll' - else: - redist_path = self.si.VCInstallDir.replace('\\Tools', '\\Redist') - vcruntime = 'onecore%s\\Microsoft.VC%d0.CRT\\vcruntime%d0.dll' + Microsoft Visual C++ runtime redistributable dll. - # Visual Studio 2017 is still Visual C++ 14.0 - dll_ver = 14.0 if self.vc_ver == 15 else self.vc_ver + Return + ------ + str + path + """ + vcruntime = 'vcruntime%d0.dll' % self.vc_ver + arch_subdir = self.pi.target_dir(x64=True).strip('\\') - vcruntime = vcruntime % (arch_subdir, self.vc_ver, dll_ver) - return os.path.join(redist_path, vcruntime) + # Installation prefixes candidates + prefixes = [] + tools_path = self.si.VCInstallDir + redist_path = dirname(tools_path.replace(r'\Tools', r'\Redist')) + if isdir(redist_path): + # Redist version may not be exactly the same as tools + redist_path = join(redist_path, listdir(redist_path)[-1]) + prefixes += [redist_path, join(redist_path, 'onecore')] + + prefixes += [join(tools_path, 'redist')] # VS14 legacy path + + # CRT directory + crt_dirs = ('Microsoft.VC%d.CRT' % (self.vc_ver * 10), + # Sometime store in directory with VS version instead of VC + 'Microsoft.VC%d.CRT' % (int(self.vs_ver) * 10)) + + # vcruntime path + for prefix, crt_dir in itertools.product(prefixes, crt_dirs): + path = join(prefix, arch_subdir, crt_dir, vcruntime) + if isfile(path): + return path + return '' def return_env(self, exists=True): """ @@ -1228,6 +1589,11 @@ ---------- exists: bool It True, only return existing paths. + + Return + ------ + dict + environment """ env = dict( include=self._build_paths('include', @@ -1261,7 +1627,7 @@ self.FSharp], exists), ) - if self.vc_ver >= 14 and os.path.isfile(self.VCRuntimeRedist): + if self.vs_ver >= 14 and isfile(self.VCRuntimeRedist): env['py_vcruntime_redist'] = self.VCRuntimeRedist return env @@ -1272,20 +1638,35 @@ unique, extant, directories from those paths and from the environment variable. Raise an error if no paths are resolved. + + Parameters + ---------- + name: str + Environment variable name + spec_path_lists: list of str + Paths + exists: bool + It True, only return existing paths. + + Return + ------ + str + Pathsep-separated paths """ # flatten spec_path_lists spec_paths = itertools.chain.from_iterable(spec_path_lists) - env_paths = safe_env.get(name, '').split(os.pathsep) + env_paths = environ.get(name, '').split(pathsep) paths = itertools.chain(spec_paths, env_paths) - extant_paths = list(filter(os.path.isdir, paths)) if exists else paths + extant_paths = list(filter(isdir, paths)) if exists else paths if not extant_paths: msg = "%s environment variable is empty" % name.upper() raise distutils.errors.DistutilsPlatformError(msg) unique_paths = self._unique_everseen(extant_paths) - return os.pathsep.join(unique_paths) + return pathsep.join(unique_paths) # from Python docs - def _unique_everseen(self, iterable, key=None): + @staticmethod + def _unique_everseen(iterable, key=None): """ List unique elements, preserving order. Remember all elements ever seen. diff -Nru pypy-7.1.1+dfsg/rpython/translator/c/funcgen.py pypy-7.3.1+dfsg/rpython/translator/c/funcgen.py --- pypy-7.1.1+dfsg/rpython/translator/c/funcgen.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/translator/c/funcgen.py 2020-04-10 19:28:41.000000000 +0000 @@ -5,7 +5,7 @@ from rpython.flowspace.model import Variable, Constant, mkentrymap from rpython.rtyper.lltypesystem.lltype import (Ptr, Void, Bool, Signed, Unsigned, SignedLongLong, Float, UnsignedLongLong, Char, UniChar, ContainerType, - Array, FixedSizeArray, ForwardReference, FuncType) + Array, FixedSizeArray, ForwardReference, FuncType, typeOf) from rpython.rtyper.lltypesystem.rffi import INT from rpython.rtyper.lltypesystem.llmemory import Address from rpython.translator.backendopt.ssa import SSI_to_SSA @@ -471,7 +471,10 @@ targets = [fn.value._obj.graph] except AttributeError: targets = None - return self.generic_call(fn.concretetype, self.expr(fn), + FN_TYPE = fn.concretetype + if FN_TYPE is Void: # XXX no idea how this is possible + FN_TYPE = typeOf(fn.value) + return self.generic_call(FN_TYPE, self.expr(fn), op.args[1:], op.result, targets) def OP_INDIRECT_CALL(self, op): @@ -559,7 +562,7 @@ return '%s = %d;' % (self.expr(op.result), ARRAY.length) else: - return self.generic_get(op, '%s->length;' % self.expr(op.args[0])) + return self.generic_get(op, '%s->length' % self.expr(op.args[0])) def OP_GETARRAYITEM(self, op): ARRAY = self.lltypemap(op.args[0]).TO diff -Nru pypy-7.1.1+dfsg/rpython/translator/c/gcc/instruction.py pypy-7.3.1+dfsg/rpython/translator/c/gcc/instruction.py --- pypy-7.1.1+dfsg/rpython/translator/c/gcc/instruction.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/translator/c/gcc/instruction.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,269 +0,0 @@ -LOC_REG = 0 -LOC_ESP_PLUS = 1 -LOC_EBP_PLUS = 2 -LOC_EBP_MINUS = 3 -LOC_MASK = 0x03 -LOC_NOWHERE = LOC_REG | 0 - -# x86-32 registers sometimes used to pass arguments when gcc optimizes -# a function's calling convention -ARGUMENT_REGISTERS_32 = ('%eax', '%edx', '%ecx') - -# x86-64 registers used to pass arguments -ARGUMENT_REGISTERS_64 = ('%rdi', '%rsi', '%rdx', '%rcx', '%r8', '%r9') - - -def frameloc_esp(offset, wordsize): - assert offset >= 0 - assert offset % wordsize == 0 - if wordsize == 8: # in this case, there are 3 null bits, but we - offset >>= 1 # only need 2 of them - return LOC_ESP_PLUS | offset - -def frameloc_ebp(offset, wordsize): - assert offset % wordsize == 0 - if wordsize == 8: # in this case, there are 3 null bits, but we - offset >>= 1 # only need 2 of them - if offset >= 0: - return LOC_EBP_PLUS | offset - else: - return LOC_EBP_MINUS | (-offset) - - -class SomeNewValue(object): - def __repr__(self): - return 'somenewvalue' -somenewvalue = SomeNewValue() - -class LocalVar(object): - # A local variable location at position 'ofs_from_frame_end', - # which is counted from the end of the stack frame (so it is always - # negative, unless it refers to arguments of the current function). - def __init__(self, ofs_from_frame_end, hint=None): - self.ofs_from_frame_end = ofs_from_frame_end - self.hint = hint - - def __repr__(self): - return '<%+d;%s>' % (self.ofs_from_frame_end, self.hint or 'e*p') - - def __hash__(self): - return hash(self.ofs_from_frame_end) - - def __cmp__(self, other): - if isinstance(other, LocalVar): - return cmp(self.ofs_from_frame_end, other.ofs_from_frame_end) - else: - return 1 - - def getlocation(self, framesize, uses_frame_pointer, wordsize): - if (self.hint == 'esp' or not uses_frame_pointer - or self.ofs_from_frame_end % 1 != 0): - # try to use esp-relative addressing - ofs_from_esp = framesize + self.ofs_from_frame_end - if ofs_from_esp % 1 == 0: - return frameloc_esp(int(ofs_from_esp), wordsize) - # we can get an odd value if the framesize is marked as bogus - # by visit_andl() - assert uses_frame_pointer - ofs_from_ebp = self.ofs_from_frame_end + wordsize - return frameloc_ebp(ofs_from_ebp, wordsize) - - -class Insn(object): - _args_ = [] - _locals_ = [] - hack = None - - def __repr__(self): - return '%s(%s) --- %r' % (self.__class__.__name__, - ', '.join([str(getattr(self, name)) - for name in self._args_]), - self.hack) - def requestgcroots(self, tracker): - return {} - - def source_of(self, localvar, tag): - if tag is None: - if self.hack is None: - self.hack = set() - self.hack.add(localvar) - return localvar - - def all_sources_of(self, localvar): - return [localvar] - -class InsnCondJump(Insn): # only for debugging; not used internally - _args_ = ['label'] - def __init__(self, label): - self.label = label - -class Label(Insn): - _args_ = ['label', 'lineno'] - def __init__(self, label, lineno): - self.label = label - self.lineno = lineno - self.previous_insns = [] # all insns that jump (or fallthrough) here - -class InsnFunctionStart(Insn): - _args_ = ['arguments'] - framesize = 0 - previous_insns = () - def __init__(self, registers, wordsize): - self.arguments = {} - for reg in registers: - self.arguments[reg] = somenewvalue - self.wordsize = wordsize - - def source_of(self, localvar, tag): - if localvar not in self.arguments: - if self.wordsize == 4 and localvar in ARGUMENT_REGISTERS_32: - # xxx this might show a bug in trackgcroot.py failing to - # figure out which instruction stored a value in these - # registers. However, this case also occurs when the - # the function's calling convention was optimized by gcc: - # the 3 registers above are then used to pass arguments - pass - elif self.wordsize == 8 and localvar in ARGUMENT_REGISTERS_64: - # this is normal: these registers are always used to - # pass arguments - pass - else: - assert (isinstance(localvar, LocalVar) and - localvar.ofs_from_frame_end > 0), ( - "must come from an argument to the function, got %r" % - (localvar,)) - self.arguments[localvar] = somenewvalue - return self.arguments[localvar] - - def all_sources_of(self, localvar): - return [] - -class InsnSetLocal(Insn): - _args_ = ['target', 'sources'] - _locals_ = ['target', 'sources'] - - def __init__(self, target, sources=()): - self.target = target - self.sources = sources - - def source_of(self, localvar, tag): - if localvar == self.target: - return somenewvalue - return Insn.source_of(self, localvar, tag) - - def all_sources_of(self, localvar): - if localvar == self.target: - return self.sources - return [localvar] - -class InsnCopyLocal(Insn): - _args_ = ['source', 'target'] - _locals_ = ['source', 'target'] - - def __init__(self, source, target): - self.source = source - self.target = target - - def source_of(self, localvar, tag): - if localvar == self.target: - return self.source - return Insn.source_of(self, localvar, tag) - - def all_sources_of(self, localvar): - if localvar == self.target: - return [self.source] - return [localvar] - -class InsnStackAdjust(Insn): - _args_ = ['delta'] - def __init__(self, delta): - #assert delta % 4 == 0 --- but not really, gcc generates strange code - self.delta = delta - -class InsnCannotFollowEsp(InsnStackAdjust): - def __init__(self): - self.delta = -7.25 # use this non-integer value as a marker - -class InsnPushed(InsnStackAdjust): - pass - -class InsnStop(Insn): - _args_ = ['reason'] - def __init__(self, reason='?'): - self.reason = reason - -class InsnRet(InsnStop): - _args_ = [] - framesize = 0 - def __init__(self, registers): - self.registers = registers - - def requestgcroots(self, tracker): - # no need to track the value of these registers in the caller - # function if we are flagged as a "bottom" function (a callback - # from C code, or pypy_main_function()) - if tracker.is_stack_bottom: - return {} - else: - return dict(zip(self.registers, self.registers)) - -class InsnCall(Insn): - _args_ = ['lineno', 'name', 'gcroots'] - def __init__(self, name, lineno): - # 'gcroots' is a dict built by side-effect during the call to - # FunctionGcRootTracker.trackgcroots(). Its meaning is as - # follows: the keys are the locations that contain gc roots - # (register names or LocalVar instances). The value - # corresponding to a key is the "tag", which is None for a - # normal gc root, or else the name of a callee-saved register. - # In the latter case it means that this is only a gc root if the - # corresponding register in the caller was really containing a - # gc pointer. A typical example: - # - # InsnCall({LocalVar(-8)': None, - # '%esi': '%esi', - # LocalVar(-12)': '%ebx'}) - # - # means that the value at -8 from the frame end is a gc root - # across this call; that %esi is a gc root if it was in the - # caller (typically because %esi is not modified at all in the - # current function); and that the value at -12 from the frame - # end is a gc root if %ebx was a gc root in the caller - # (typically because the current function saves and restores - # %ebx from there in the prologue and epilogue). - self.gcroots = {} - self.lineno = lineno - self.name = name - - def source_of(self, localvar, tag): - tag1 = self.gcroots.setdefault(localvar, tag) - assert tag1 == tag, ( - "conflicting entries for\n%s.gcroots[%s]:\n%r and %r" % ( - self, localvar, tag1, tag)) - return localvar - - def all_sources_of(self, localvar): - return [localvar] - -class InsnGCROOT(Insn): - _args_ = ['loc'] - _locals_ = ['loc'] - def __init__(self, loc): - self.loc = loc - def requestgcroots(self, tracker): - return {self.loc: None} - -class InsnPrologue(Insn): - def __init__(self, wordsize): - self.wordsize = wordsize - def __setattr__(self, attr, value): - if attr == 'framesize': - assert value == self.wordsize, ( - "unrecognized function prologue - " - "only supports push %ebp; movl %esp, %ebp") - Insn.__setattr__(self, attr, value) - -class InsnEpilogue(Insn): - def __init__(self, framesize=None): - if framesize is not None: - self.framesize = framesize diff -Nru pypy-7.1.1+dfsg/rpython/translator/c/gcc/test/conftest.py pypy-7.3.1+dfsg/rpython/translator/c/gcc/test/conftest.py --- pypy-7.1.1+dfsg/rpython/translator/c/gcc/test/conftest.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/translator/c/gcc/test/conftest.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,6 +0,0 @@ -import py -from rpython.jit.backend import detect_cpu -cpu = detect_cpu.autodetect() -def pytest_runtest_setup(item): - if not cpu.startswith('x86'): - py.test.skip("x86 directory skipped: cpu is %r" % (cpu,)) diff -Nru pypy-7.1.1+dfsg/rpython/translator/c/gcc/test/darwin/track_0f.s pypy-7.3.1+dfsg/rpython/translator/c/gcc/test/darwin/track_0f.s --- pypy-7.1.1+dfsg/rpython/translator/c/gcc/test/darwin/track_0f.s 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/translator/c/gcc/test/darwin/track_0f.s 1970-01-01 00:00:00.000000000 +0000 @@ -1,105 +0,0 @@ -_pypy_debug_open: - subl $92, %esp - movl %ebx, 76(%esp) - call L161 -"L00000000014$pb": -L161: - popl %ebx - movl %ebp, 88(%esp) - movl %esi, 80(%esp) - movl %edi, 84(%esp) - leal LC18-"L00000000014$pb"(%ebx), %eax - movl %eax, (%esp) - call L_getenv$stub - ;; expected {92(%esp) | 76(%esp), 80(%esp), 84(%esp), 88(%esp) | } - testl %eax, %eax - movl %eax, %ebp - je L147 - cmpb $0, (%eax) - jne L158 -L147: - movl _pypy_debug_file-"L00000000014$pb"(%ebx), %esi - testl %esi, %esi - je L159 -L154: - movb $1, _debug_ready-"L00000000014$pb"(%ebx) - movl 80(%esp), %esi - movl 76(%esp), %ebx - movl 84(%esp), %edi - movl 88(%esp), %ebp - addl $92, %esp - ret - .align 4,0x90 -L158: - movl $58, 4(%esp) - movl %eax, (%esp) - call L_strchr$stub - ;; expected {92(%esp) | 76(%esp), 80(%esp), 84(%esp), 88(%esp) | } - testl %eax, %eax - movl %eax, %edi - je L160 - movl %eax, %esi - subl %ebp, %esi - leal 1(%esi), %eax - movl %eax, (%esp) - call L_malloc$stub - ;; expected {92(%esp) | 76(%esp), 80(%esp), 84(%esp), 88(%esp) | } - movl %ebp, 4(%esp) - leal 1(%edi), %ebp - movl %esi, 8(%esp) - movl %eax, _debug_prefix-"L00000000014$pb"(%ebx) - movl %eax, (%esp) - call L_memcpy$stub - ;; expected {92(%esp) | 76(%esp), 80(%esp), 84(%esp), 88(%esp) | } - movl _debug_prefix-"L00000000014$pb"(%ebx), %eax - movb $0, (%eax,%esi) -L152: - leal LC19-"L00000000014$pb"(%ebx), %eax - movl $2, %ecx - cld - movl %ebp, %esi - movl %eax, %edi - repz - cmpsb - mov $0, %eax - je 0f - movzbl -1(%esi), %eax - movzbl -1(%edi), %ecx - subl %ecx,%eax -0: - testl %eax, %eax - je L147 - leal LC20-"L00000000014$pb"(%ebx), %eax - movl %eax, 4(%esp) - movl %ebp, (%esp) - call L_fopen$stub - ;; expected {92(%esp) | 76(%esp), 80(%esp), 84(%esp), 88(%esp) | } - movl %eax, _pypy_debug_file-"L00000000014$pb"(%ebx) - jmp L147 -L160: - movb $1, _debug_profile-"L00000000014$pb"(%ebx) - jmp L152 - .align 4,0x90 -L159: - movl L___sF$non_lazy_ptr-"L00000000014$pb"(%ebx), %eax - movl $2, (%esp) - addl $176, %eax - movl %eax, _pypy_debug_file-"L00000000014$pb"(%ebx) - call L_isatty$stub - ;; expected {92(%esp) | 76(%esp), 80(%esp), 84(%esp), 88(%esp) | } - testl %eax, %eax - je L154 - leal LC21-"L00000000014$pb"(%ebx), %eax - movl 80(%esp), %esi - movl %eax, _debug_start_colors_1-"L00000000014$pb"(%ebx) - leal LC22-"L00000000014$pb"(%ebx), %eax - movl 84(%esp), %edi - movl %eax, _debug_start_colors_2-"L00000000014$pb"(%ebx) - leal LC23-"L00000000014$pb"(%ebx), %eax - movl 88(%esp), %ebp - movl %eax, _debug_stop_colors-"L00000000014$pb"(%ebx) - movb $1, _debug_ready-"L00000000014$pb"(%ebx) - movl 76(%esp), %ebx - addl $92, %esp - ret - .align 4,0x90 \ No newline at end of file diff -Nru pypy-7.1.1+dfsg/rpython/translator/c/gcc/test/darwin/track0.s pypy-7.3.1+dfsg/rpython/translator/c/gcc/test/darwin/track0.s --- pypy-7.1.1+dfsg/rpython/translator/c/gcc/test/darwin/track0.s 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/translator/c/gcc/test/darwin/track0.s 1970-01-01 00:00:00.000000000 +0000 @@ -1,84 +0,0 @@ -_pypy_g_clear_large_memory_chunk: -L80: - pushl %ebp - pushl %edi - pushl %esi - pushl %ebx - call L103 -"L00000000006$pb": -L103: - popl %ebx - subl $28, %esp - movl $420, 8(%esp) - movl $0, 4(%esp) - movl L_pypy_g_array_21$non_lazy_ptr-"L00000000006$pb"(%ebx), %eax - movl %eax, (%esp) - call L_open$stub - ;; expected {44(%esp) | 28(%esp), 32(%esp), 36(%esp), 40(%esp) | } - cmpl $-1, %eax - movl %eax, %ebp - je L100 -L81: - movl 52(%esp), %esi - movl 48(%esp), %edi - testl %esi, %esi - jg L101 -L88: - movl %ebp, (%esp) - call L_close$stub - ;; expected {44(%esp) | 28(%esp), 32(%esp), 36(%esp), 40(%esp) | } - movl %esi, %edx - movl %edi, %eax -L83: - testl %edx, %edx - jle L97 -L85: - movl %edx, 8(%esp) - movl $0, 4(%esp) - movl %eax, (%esp) - call L_memset$stub - ;; expected {44(%esp) | 28(%esp), 32(%esp), 36(%esp), 40(%esp) | } -L97: - addl $28, %esp - popl %ebx - popl %esi - popl %edi - popl %ebp - ret - .align 4,0x90 -L101: - movl 52(%esp), %esi - movl 48(%esp), %edi - jmp L92 - .align 4,0x90 -L102: - movl %eax, %edi - movl %edx, %esi -L92: -L95: - cmpl $536870913, %esi - movl $536870912, %eax - cmovl %esi, %eax - movl %eax, 8(%esp) - movl %edi, 4(%esp) - movl %ebp, (%esp) - call L_read$stub - ;; expected {44(%esp) | 28(%esp), 32(%esp), 36(%esp), 40(%esp) | } - testl %eax, %eax - jle L88 -L96: -L89: - movl %esi, %edx - subl %eax, %edx - testl %edx, %edx - leal (%edi,%eax), %eax - jg L102 - movl %edx, %esi - movl %eax, %edi - jmp L88 - .align 4,0x90 -L100: - movl 52(%esp), %edx - movl 48(%esp), %eax - jmp L83 - .align 4,0x90 diff -Nru pypy-7.1.1+dfsg/rpython/translator/c/gcc/test/darwin/track1.s pypy-7.3.1+dfsg/rpython/translator/c/gcc/test/darwin/track1.s --- pypy-7.1.1+dfsg/rpython/translator/c/gcc/test/darwin/track1.s 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/translator/c/gcc/test/darwin/track1.s 1970-01-01 00:00:00.000000000 +0000 @@ -1,81 +0,0 @@ -_pypy_g_clear_large_memory_chunk: -L137: - pushl %ebp - movl %esp, %ebp - pushl %edi - pushl %esi - pushl %ebx - subl $28, %esp - movl L_pypy_g_array_21$non_lazy_ptr, %eax - movl $420, 8(%esp) - movl $0, 4(%esp) - movl %eax, (%esp) - call L_open$stub - ;; expected {4(%ebp) | -12(%ebp), -8(%ebp), -4(%ebp), (%ebp) | } - cmpl $-1, %eax - movl %eax, %edi - je L157 -L138: - movl 12(%ebp), %ebx - movl 8(%ebp), %esi - testl %ebx, %ebx - jg L158 -L145: - movl %edi, (%esp) - call L_close$stub - ;; expected {4(%ebp) | -12(%ebp), -8(%ebp), -4(%ebp), (%ebp) | } - movl %ebx, %edx - movl %esi, %eax -L140: - testl %edx, %edx - jle L154 -L142: - movl %edx, 8(%esp) - movl $0, 4(%esp) - movl %eax, (%esp) - call L_memset$stub - ;; expected {4(%ebp) | -12(%ebp), -8(%ebp), -4(%ebp), (%ebp) | } -L154: - addl $28, %esp - popl %ebx - popl %esi - popl %edi - leave - ret - .align 4,0x90 -L158: - movl 12(%ebp), %ebx - movl 8(%ebp), %esi - jmp L149 - .align 4,0x90 -L159: - movl %eax, %esi - movl %edx, %ebx -L149: -L152: - cmpl $536870913, %ebx - movl $536870912, %eax - cmovl %ebx, %eax - movl %eax, 8(%esp) - movl %esi, 4(%esp) - movl %edi, (%esp) - call L_read$stub - ;; expected {4(%ebp) | -12(%ebp), -8(%ebp), -4(%ebp), (%ebp) | } - testl %eax, %eax - jle L145 -L153: -L146: - movl %ebx, %edx - subl %eax, %edx - testl %edx, %edx - leal (%esi,%eax), %eax - jg L159 - movl %edx, %ebx - movl %eax, %esi - jmp L145 - .align 4,0x90 -L157: - movl 12(%ebp), %edx - movl 8(%ebp), %eax - jmp L140 - .align 4,0x90 \ No newline at end of file diff -Nru pypy-7.1.1+dfsg/rpython/translator/c/gcc/test/darwin/track2.s pypy-7.3.1+dfsg/rpython/translator/c/gcc/test/darwin/track2.s --- pypy-7.1.1+dfsg/rpython/translator/c/gcc/test/darwin/track2.s 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/translator/c/gcc/test/darwin/track2.s 1970-01-01 00:00:00.000000000 +0000 @@ -1,190 +0,0 @@ -_pypy_g_populate: -L2135: - subl $76, %esp - movl %esi, 64(%esp) - movl 80(%esp), %esi - movl %ebx, 60(%esp) - call L2175 -"L00000000060$pb": -L2175: - popl %ebx - movl %edi, 68(%esp) - testl %esi, %esi - movl %ebp, 72(%esp) - jle L2169 -L2137: -L2138: - movl L__LLstacktoobig_stack_base_pointer$non_lazy_ptr-"L00000000060$pb"(%ebx), %eax - leal 47(%esp), %edx - subl (%eax), %edx - movl L__LLstacktoobig_stack_min$non_lazy_ptr-"L00000000060$pb"(%ebx), %eax - cmpl (%eax), %edx - jl L2139 - movl L__LLstacktoobig_stack_max$non_lazy_ptr-"L00000000060$pb"(%ebx), %eax - cmpl (%eax), %edx - jg L2139 -L2171: - movl L_pypy_g_ExcData$non_lazy_ptr-"L00000000060$pb"(%ebx), %edi - movl (%edi), %ebp - testl %ebp, %ebp - je L2172 -L2169: - movl 60(%esp), %ebx - movl 64(%esp), %esi - movl 68(%esp), %edi - movl 72(%esp), %ebp - addl $76, %esp - ret - .align 4,0x90 -L2139: - call L_LL_stack_too_big_slowpath$stub - ;; expected {76(%esp) | 60(%esp), 64(%esp), 68(%esp), 72(%esp) | 84(%esp)} - testl %eax, %eax - je L2171 -L2142: - movl L_pypy_g_ExcData$non_lazy_ptr-"L00000000060$pb"(%ebx), %edi - movl L_pypy_g_exceptions_RuntimeError_vtable$non_lazy_ptr-"L00000000060$pb"(%ebx), %eax - movl %eax, (%edi) - movl (%edi), %ebp - movl L_pypy_g_exceptions_RuntimeError$non_lazy_ptr-"L00000000060$pb"(%ebx), %eax - testl %ebp, %ebp - movl %eax, 4(%edi) - jne L2169 -L2143: - .align 4,0x90 -L2172: - movl L_pypy_g_pypy_rpython_memory_gc_semispace_SemiSpaceGC$non_lazy_ptr-"L00000000060$pb"(%ebx), %ebp - decl %esi - movl %esi, 28(%esp) - movl 12(%ebp), %edx - movl 80(%ebp), %eax - subl %edx, %eax - cmpl $15, %eax - jle L2144 -L2146: - leal 16(%edx), %eax - movl %edx, %ecx - movl $31, (%edx) - movl %eax, 12(%ebp) -L2147: - movl L___gcnoreorderhack$non_lazy_ptr-"L00000000060$pb"(%ebx), %edi - movl 84(%esp), %esi - /* GCROOT %esi */ - testl %ecx, %ecx - je L2169 -L2148: - movl L_pypy_g_pypy_translator_goal_gcbench_Node_vtable$non_lazy_ptr-"L00000000060$pb"(%ebx), %eax - movl L_pypy_g_pypy_rpython_memory_gc_semispace_SemiSpaceGC$non_lazy_ptr-"L00000000060$pb"(%ebx), %ebp - movl $0, 8(%edx) - movl $0, 12(%edx) - movl %eax, 4(%edx) - movl %edx, 8(%esi) - movl 12(%ebp), %edx - movl 80(%ebp), %eax - subl %edx, %eax - cmpl $15, %eax - jle L2149 -L2151: - leal 16(%edx), %eax - movl $31, (%edx) - movl %eax, 12(%ebp) - movl %edx, %eax -L2152: - /* GCROOT %esi */ - testl %eax, %eax - je L2169 -L2153: - movl L_pypy_g_pypy_translator_goal_gcbench_Node_vtable$non_lazy_ptr-"L00000000060$pb"(%ebx), %eax - movl $0, 8(%edx) - movl $0, 12(%edx) - movl %eax, 4(%edx) - movl 8(%esi), %eax - movl %edx, 12(%esi) - movl %eax, 4(%esp) - movl 28(%esp), %eax - movl %eax, (%esp) - call _pypy_g_populate - ;; expected {76(%esp) | 60(%esp), 64(%esp), 68(%esp), 72(%esp) | %esi} - movl L_pypy_g_ExcData$non_lazy_ptr-"L00000000060$pb"(%ebx), %eax - movl %esi, %edx - /* GCROOT %edx */ - movl (%eax), %esi - testl %esi, %esi - jne L2169 -L2154: - movl 12(%edx), %eax - movl %eax, 4(%esp) - movl 28(%esp), %eax - movl %eax, (%esp) - call _pypy_g_populate - ;; expected {76(%esp) | 60(%esp), 64(%esp), 68(%esp), 72(%esp) | } - jmp L2169 -L2144: - movl $16, 4(%esp) - xorl %esi, %esi - movl %ebp, (%esp) - call _pypy_g_SemiSpaceGC_try_obtain_free_space - ;; expected {76(%esp) | 60(%esp), 64(%esp), 68(%esp), 72(%esp) | 84(%esp)} - - movl (%edi), %edx - testl %edx, %edx - je L2173 -L2164: - movl L_pypy_g_ExcData$non_lazy_ptr-"L00000000060$pb"(%ebx), %eax - xorl %ecx, %ecx - xorl %edx, %edx - movl (%eax), %eax - testl %eax, %eax - jne L2147 - movl L_pypy_g_pypy_rpython_memory_gc_semispace_SemiSpaceGC$non_lazy_ptr-"L00000000060$pb"(%ebx), %ebp - movl %esi, %edx - jmp L2146 -L2149: - movl $16, 4(%esp) - movl %ebp, (%esp) - call _pypy_g_SemiSpaceGC_try_obtain_free_space - ;; expected {76(%esp) | 60(%esp), 64(%esp), 68(%esp), 72(%esp) | %esi} - movl L_pypy_g_ExcData$non_lazy_ptr-"L00000000060$pb"(%ebx), %edi - xorl %edx, %edx - movl (%edi), %ecx - testl %ecx, %ecx - je L2174 -L2157: - movl (%edi), %ecx - testl %ecx, %ecx - je L2160 - movl L___gcnoreorderhack$non_lazy_ptr-"L00000000060$pb"(%ebx), %edi - xorl %eax, %eax - xorl %edx, %edx - jmp L2152 -L2173: -L2162: - testb %al, %al - jne L2165 -L2166: - movl L_pypy_g_exceptions_MemoryError_vtable$non_lazy_ptr-"L00000000060$pb"(%ebx), %eax - movl %eax, (%edi) - movl L_pypy_g_exceptions_MemoryError_1$non_lazy_ptr-"L00000000060$pb"(%ebx), %eax - movl %eax, 4(%edi) - jmp L2164 -L2160: - movl L_pypy_g_pypy_rpython_memory_gc_semispace_SemiSpaceGC$non_lazy_ptr-"L00000000060$pb"(%ebx), %ebp - movl L___gcnoreorderhack$non_lazy_ptr-"L00000000060$pb"(%ebx), %edi - jmp L2151 -L2174: -L2155: - testb %al, %al - jne L2158 -L2159: - movl L_pypy_g_exceptions_MemoryError_vtable$non_lazy_ptr-"L00000000060$pb"(%ebx), %eax - movl %eax, (%edi) - movl L_pypy_g_exceptions_MemoryError_1$non_lazy_ptr-"L00000000060$pb"(%ebx), %eax - movl %eax, 4(%edi) - jmp L2157 -L2165: - movl 12(%ebp), %esi - jmp L2164 -L2158: - movl 12(%ebp), %edx - jmp L2157 - .align 4,0x90 diff -Nru pypy-7.1.1+dfsg/rpython/translator/c/gcc/test/darwin/track8.s pypy-7.3.1+dfsg/rpython/translator/c/gcc/test/darwin/track8.s --- pypy-7.1.1+dfsg/rpython/translator/c/gcc/test/darwin/track8.s 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/translator/c/gcc/test/darwin/track8.s 1970-01-01 00:00:00.000000000 +0000 @@ -1,202 +0,0 @@ -_pypy_g_foo: -L1506: - subl $140, %esp - movl %esi, 128(%esp) - movl 144(%esp), %esi - movl %ebx, 124(%esp) - call L1534 -"L00000000044$pb": -L1534: - popl %ebx - movl %edi, 132(%esp) - testl %esi, %esi - movl %ebp, 136(%esp) - jle L1529 -L1508: -L1509: - movl L__LLstacktoobig_stack_base_pointer$non_lazy_ptr-"L00000000044$pb"(%ebx), %eax - leal 111(%esp), %edx - subl (%eax), %edx - movl L__LLstacktoobig_stack_min$non_lazy_ptr-"L00000000044$pb"(%ebx), %eax - cmpl (%eax), %edx - jl L1510 - movl L__LLstacktoobig_stack_max$non_lazy_ptr-"L00000000044$pb"(%ebx), %eax - cmpl (%eax), %edx - jg L1510 -L1531: - movl L_pypy_g_ExcData$non_lazy_ptr-"L00000000044$pb"(%ebx), %esi - movl (%esi), %ecx - testl %ecx, %ecx - je L1532 -L1529: - movl 124(%esp), %ebx - movl 128(%esp), %esi - movl 132(%esp), %edi - movl 136(%esp), %ebp - addl $140, %esp - ret - .align 4,0x90 -L1510: - call L_LL_stack_too_big_slowpath$stub - ;; expected {140(%esp) | 124(%esp), 128(%esp), 132(%esp), 136(%esp) | 148(%esp), 152(%esp), 156(%esp), 160(%esp), 164(%esp), 168(%esp)} - testl %eax, %eax - je L1531 -L1513: - movl L_pypy_g_ExcData$non_lazy_ptr-"L00000000044$pb"(%ebx), %esi - movl L_pypy_g_exceptions_RuntimeError_vtable$non_lazy_ptr-"L00000000044$pb"(%ebx), %eax - movl %eax, (%esi) - movl (%esi), %ecx - movl L_pypy_g_exceptions_RuntimeError$non_lazy_ptr-"L00000000044$pb"(%ebx), %eax - testl %ecx, %ecx - movl %eax, 4(%esi) - jne L1529 -L1514: - .align 4,0x90 -L1532: - movl L_pypy_g_pypy_rpython_memory_gc_semispace_SemiSpaceGC$non_lazy_ptr-"L00000000044$pb"(%ebx), %edi - movl 12(%edi), %edx - movl 80(%edi), %eax - subl %edx, %eax - cmpl $7, %eax - jle L1515 -L1517: - leal 8(%edx), %eax - movl $4, (%edx) - movl %eax, 12(%edi) - movl %edx, %edi -L1518: - movl L___gcnoreorderhack$non_lazy_ptr-"L00000000044$pb"(%ebx), %esi - movl 168(%esp), %eax - movl 164(%esp), %ebp - /* GCROOT %eax */ - /* GCROOT %ebp */ - movl %eax, 48(%esp) - movl 152(%esp), %eax - /* GCROOT %eax */ - movl %eax, 52(%esp) - movl 156(%esp), %eax - /* GCROOT %eax */ - movl %eax, 56(%esp) - movl 160(%esp), %eax - /* GCROOT %eax */ - movl %eax, 60(%esp) - movl 148(%esp), %eax - /* GCROOT %eax */ - testl %edx, %edx - movl %eax, 64(%esp) - je L1529 -L1519: - movl L_pypy_g_src8_A_vtable$non_lazy_ptr-"L00000000044$pb"(%ebx), %eax - movl %eax, 4(%edi) - movl 144(%esp), %edx - movl %edi, 24(%esp) - movl %edi, 20(%esp) - movl %edi, 16(%esp) - decl %edx - movl %edx, 44(%esp) - movl %edi, 12(%esp) - movl %edi, 8(%esp) - movl %edi, 4(%esp) - movl %edx, (%esp) - call _pypy_g_foo - ;; expected {140(%esp) | 124(%esp), 128(%esp), 132(%esp), 136(%esp) | %edi, %ebp, 48(%esp), 52(%esp), 56(%esp), 60(%esp), 64(%esp)} - movl 56(%esp), %edx - /* GCROOT %edx */ - movl %edx, 76(%esp) - movl 60(%esp), %edx - /* GCROOT %edx */ - movl %edx, 80(%esp) - movl L_pypy_g_ExcData$non_lazy_ptr-"L00000000044$pb"(%ebx), %edx - /* GCROOT %ebp */ - movl 48(%esp), %eax - movl %ebp, 72(%esp) - movl 52(%esp), %ebp - movl (%edx), %edx - /* GCROOT %eax */ - /* GCROOT %ebp */ - movl %eax, 68(%esp) - movl %edi, %eax - movl 64(%esp), %edi - /* GCROOT %eax */ - /* GCROOT %edi */ - testl %edx, %edx - jne L1529 -L1520: - movl %eax, 24(%esp) - movl %eax, 20(%esp) - movl %eax, 16(%esp) - movl %eax, 12(%esp) - movl %eax, 8(%esp) - movl %eax, 4(%esp) - movl 44(%esp), %eax - movl %eax, (%esp) - call _pypy_g_foo - ;; expected {140(%esp) | 124(%esp), 128(%esp), 132(%esp), 136(%esp) | %edi, %ebp, 68(%esp), 72(%esp), 76(%esp), 80(%esp)} - movl 68(%esp), %edx - movl 72(%esp), %eax - /* GCROOT %edx */ - /* GCROOT %eax */ - movl %edx, 84(%esp) - movl 80(%esp), %ecx - movl %eax, 88(%esp) - movl 76(%esp), %edx - movl %edi, %eax - /* GCROOT %edx */ - /* GCROOT %ecx */ - /* GCROOT %eax */ - movl %edx, 92(%esp) - movl %ebp, %edx - /* GCROOT %edx */ - movl L_pypy_g_ExcData$non_lazy_ptr-"L00000000044$pb"(%ebx), %esi - movl (%esi), %esi - testl %esi, %esi - jne L1529 -L1521: - movl %eax, 24(%esp) - movl 92(%esp), %eax - movl %edx, 20(%esp) - movl 84(%esp), %esi - movl 88(%esp), %edx - movl %ecx, 12(%esp) - movl %eax, 16(%esp) - movl 44(%esp), %eax - movl %esi, 4(%esp) - movl %edx, 8(%esp) - movl %eax, (%esp) - call _pypy_g_foo - ;; expected {140(%esp) | 124(%esp), 128(%esp), 132(%esp), 136(%esp) | } - jmp L1529 - .align 4,0x90 -L1515: - movl $8, 4(%esp) - movl %edi, (%esp) - call _pypy_g_SemiSpaceGC_try_obtain_free_space - ;; expected {140(%esp) | 124(%esp), 128(%esp), 132(%esp), 136(%esp) | 148(%esp), 152(%esp), 156(%esp), 160(%esp), 164(%esp), 168(%esp)} - movl (%esi), %edx - xorl %ecx, %ecx - testl %edx, %edx - je L1533 -L1524: - movl L_pypy_g_ExcData$non_lazy_ptr-"L00000000044$pb"(%ebx), %eax - xorl %edx, %edx - xorl %edi, %edi - movl (%eax), %eax - testl %eax, %eax - jne L1518 - movl L_pypy_g_pypy_rpython_memory_gc_semispace_SemiSpaceGC$non_lazy_ptr-"L00000000044$pb"(%ebx), %edi - movl %ecx, %edx - jmp L1517 -L1533: -L1522: - testb %al, %al - jne L1525 -L1526: - movl L_pypy_g_exceptions_MemoryError_vtable$non_lazy_ptr-"L00000000044$pb"(%ebx), %eax - movl %eax, (%esi) - movl L_pypy_g_exceptions_MemoryError_1$non_lazy_ptr-"L00000000044$pb"(%ebx), %eax - movl %eax, 4(%esi) - jmp L1524 -L1525: - movl 12(%edi), %ecx - jmp L1524 - .align 4,0x90 \ No newline at end of file diff -Nru pypy-7.1.1+dfsg/rpython/translator/c/gcc/test/darwin/track9.s pypy-7.3.1+dfsg/rpython/translator/c/gcc/test/darwin/track9.s --- pypy-7.1.1+dfsg/rpython/translator/c/gcc/test/darwin/track9.s 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/translator/c/gcc/test/darwin/track9.s 1970-01-01 00:00:00.000000000 +0000 @@ -1,18 +0,0 @@ -_pypy_g_foo: -L1506: - pushl %ebp - pushl %edi - pushl %esi - pushl %ebx - call L103 -"L00000000006$pb": -L103: - popl %ebx - call _open - /* GC_NOCOLLECT open */ - popl %ebx - popl %esi - popl %edi - popl %ebp - ret - .align 4,0x90 diff -Nru pypy-7.1.1+dfsg/rpython/translator/c/gcc/test/darwin/track_switch0.s pypy-7.3.1+dfsg/rpython/translator/c/gcc/test/darwin/track_switch0.s --- pypy-7.1.1+dfsg/rpython/translator/c/gcc/test/darwin/track_switch0.s 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/translator/c/gcc/test/darwin/track_switch0.s 1970-01-01 00:00:00.000000000 +0000 @@ -1,94 +0,0 @@ -_pypy_g_MetaInterp_prepare_resume_from_failure: - subl $28, %esp - movl %ebx, 20(%esp) - movl %esi, 24(%esp) - call L2245 -"L00000000130$pb": -L2245: - popl %ebx - movl 32(%esp), %edx -L2231: - movl 36(%esp), %eax - subl $6, %eax - cmpl $7, %eax - jbe L2244 -L2243: - movl 20(%esp), %ebx - movl 24(%esp), %esi - addl $28, %esp - ret - .align 4,0x90 -L2244: - movl L2237-"L00000000130$pb"(%ebx,%eax,4), %eax - addl %ebx, %eax - jmp *%eax - .align 2,0x90 -L2237: - .long L2233-"L00000000130$pb" - .long L2234-"L00000000130$pb" - .long L2243-"L00000000130$pb" - .long L2243-"L00000000130$pb" - .long L2243-"L00000000130$pb" - .long L2235-"L00000000130$pb" - .long L2235-"L00000000130$pb" - .long L2236-"L00000000130$pb" -L2236: - movl %edx, 32(%esp) - movl 20(%esp), %ebx - movl 24(%esp), %esi - addl $28, %esp - jmp L_pypy_g_MetaInterp_raise_overflow_error$stub -L2235: - movl %edx, 32(%esp) - movl 20(%esp), %ebx - movl 24(%esp), %esi - addl $28, %esp - jmp L_pypy_g_MetaInterp_handle_exception$stub -L2234: - movl 16(%edx), %eax - movl 8(%eax), %edx - movl 4(%eax), %eax - movl 4(%edx,%eax,4), %eax - movl %eax, 32(%esp) - movl 20(%esp), %ebx - movl 24(%esp), %esi - addl $28, %esp - jmp L_pypy_g_MIFrame_dont_follow_jump$stub -L2233: - movl 16(%edx), %eax - movl 8(%eax), %edx - movl 4(%eax), %eax - movl 4(%edx,%eax,4), %esi - movl 8(%esi), %ecx - movl 52(%esi), %eax - testl %eax, %eax - js L2238 - movl %eax, %edx -L2240: - cmpb $0, 12(%ecx,%edx) - je L2241 -L2242: - movl L_pypy_g_exceptions_AssertionError$non_lazy_ptr-"L00000000130$pb"(%ebx), %eax - movl %eax, 36(%esp) - movl L_pypy_g_exceptions_AssertionError_vtable$non_lazy_ptr-"L00000000130$pb"(%ebx), %eax - movl %eax, 32(%esp) - movl 20(%esp), %ebx - movl 24(%esp), %esi - addl $28, %esp - jmp L_pypy_g_RPyRaiseException$stub -L2241: - incl %eax - movl %eax, 52(%esi) - movl %esi, (%esp) - call L_pypy_g_MIFrame_load_3byte$stub - ;; expected {28(%esp) | 20(%esp), 24(%esp), %edi, %ebp | } - movl %eax, 52(%esi) - movl 20(%esp), %ebx - movl 24(%esp), %esi - addl $28, %esp - ret -L2238: - movl %eax, %edx - addl 8(%ecx), %edx - jmp L2240 - .align 4,0x90 diff -Nru pypy-7.1.1+dfsg/rpython/translator/c/gcc/test/darwin/track_switch1.s pypy-7.3.1+dfsg/rpython/translator/c/gcc/test/darwin/track_switch1.s --- pypy-7.1.1+dfsg/rpython/translator/c/gcc/test/darwin/track_switch1.s 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/translator/c/gcc/test/darwin/track_switch1.s 1970-01-01 00:00:00.000000000 +0000 @@ -1,149 +0,0 @@ -_pypy_g___mm_mul_W_TransparentList_W_Root: - pushl %esi - pushl %ebx - subl $20, %esp - call L6833 -"L00000000284$pb": -L6833: - popl %ebx - movl 32(%esp), %edx -L6820: - movl 4(%edx), %eax - cmpl $61, 20(%eax) - je L6821 -L6822: - movl L_pypy_g_pypy_rpython_memory_gc_hybrid_HybridGC$non_lazy_ptr-"L00000000284$pb"(%ebx), %esi - movl 112(%esi), %edx - movl 124(%esi), %eax - subl %edx, %eax - cmpl $15, %eax - jle L6823 -L6825: - movl $14, (%edx) - leal 16(%edx), %eax - movl %eax, 112(%esi) -L6826: - movl L_pypy_g_pypy_objspace_std_multimethod_FailedToImplement_$non_lazy_ptr-"L00000000284$pb"(%ebx), %eax - movl %eax, 4(%edx) - movl $0, 8(%edx) - movl $0, 12(%edx) - movl %edx, 4(%esp) - movl 4(%edx), %eax - movl %eax, (%esp) - call L_pypy_g_RPyRaiseException$stub - ;; expected {28(%esp) | 20(%esp), 24(%esp), %edi, %ebp | } - xorl %ecx, %ecx -L6827: - movl %ecx, %eax - addl $20, %esp - popl %ebx - popl %esi - ret - .align 4,0x90 -L6821: - movl 36(%esp), %ecx - movl 4(%ecx), %eax - cmpl $66, 20(%eax) - ja L6822 - movl 20(%eax), %eax - movl L6831-"L00000000284$pb"(%ebx,%eax,4), %eax - addl %ebx, %eax - jmp *%eax - .align 2,0x90 -L6831: - .long L6830-"L00000000284$pb" - .long L6830-"L00000000284$pb" - .long L6830-"L00000000284$pb" - .long L6830-"L00000000284$pb" - .long L6830-"L00000000284$pb" - .long L6830-"L00000000284$pb" - .long L6830-"L00000000284$pb" - .long L6830-"L00000000284$pb" - .long L6830-"L00000000284$pb" - .long L6830-"L00000000284$pb" - .long L6830-"L00000000284$pb" - .long L6830-"L00000000284$pb" - .long L6830-"L00000000284$pb" - .long L6830-"L00000000284$pb" - .long L6830-"L00000000284$pb" - .long L6830-"L00000000284$pb" - .long L6830-"L00000000284$pb" - .long L6830-"L00000000284$pb" - .long L6830-"L00000000284$pb" - .long L6830-"L00000000284$pb" - .long L6830-"L00000000284$pb" - .long L6830-"L00000000284$pb" - .long L6830-"L00000000284$pb" - .long L6830-"L00000000284$pb" - .long L6830-"L00000000284$pb" - .long L6830-"L00000000284$pb" - .long L6830-"L00000000284$pb" - .long L6830-"L00000000284$pb" - .long L6830-"L00000000284$pb" - .long L6830-"L00000000284$pb" - .long L6822-"L00000000284$pb" - .long L6830-"L00000000284$pb" - .long L6830-"L00000000284$pb" - .long L6822-"L00000000284$pb" - .long L6830-"L00000000284$pb" - .long L6830-"L00000000284$pb" - .long L6830-"L00000000284$pb" - .long L6830-"L00000000284$pb" - .long L6830-"L00000000284$pb" - .long L6830-"L00000000284$pb" - .long L6830-"L00000000284$pb" - .long L6830-"L00000000284$pb" - .long L6822-"L00000000284$pb" - .long L6830-"L00000000284$pb" - .long L6830-"L00000000284$pb" - .long L6822-"L00000000284$pb" - .long L6830-"L00000000284$pb" - .long L6830-"L00000000284$pb" - .long L6830-"L00000000284$pb" - .long L6830-"L00000000284$pb" - .long L6830-"L00000000284$pb" - .long L6830-"L00000000284$pb" - .long L6830-"L00000000284$pb" - .long L6830-"L00000000284$pb" - .long L6830-"L00000000284$pb" - .long L6830-"L00000000284$pb" - .long L6830-"L00000000284$pb" - .long L6830-"L00000000284$pb" - .long L6830-"L00000000284$pb" - .long L6830-"L00000000284$pb" - .long L6830-"L00000000284$pb" - .long L6830-"L00000000284$pb" - .long L6830-"L00000000284$pb" - .long L6830-"L00000000284$pb" - .long L6830-"L00000000284$pb" - .long L6830-"L00000000284$pb" - .long L6830-"L00000000284$pb" - .align 4,0x90 -L6823: - movl %esi, (%esp) - call L_pypy_g_GenerationGC_collect_nursery$stub - ;; expected {28(%esp) | 20(%esp), 24(%esp), %edi, %ebp | } - xorl %ecx, %ecx - movl %eax, %edx - movl L_pypy_g_ExcData$non_lazy_ptr-"L00000000284$pb"(%ebx), %eax - movl (%eax), %eax - testl %eax, %eax - je L6825 - movl %ecx, %eax - addl $20, %esp - popl %ebx - popl %esi - ret -L6830: - /* keepalive 36(%esp) */ - movl 36(%esp), %eax - movl %eax, 8(%esp) - movl L_pypy_g_pypy_objspace_std_stringobject_W_StringObject_574$non_lazy_ptr-"L00000000284$pb"(%ebx), %eax - movl %eax, 4(%esp) - movl 8(%edx), %eax - movl %eax, (%esp) - call L_pypy_g_call_function__star_2$stub - ;; expected {28(%esp) | 20(%esp), 24(%esp), %edi, %ebp | } - movl %eax, %ecx - jmp L6827 - .align 4,0x90 diff -Nru pypy-7.1.1+dfsg/rpython/translator/c/gcc/test/darwin/track_tailcall0.s pypy-7.3.1+dfsg/rpython/translator/c/gcc/test/darwin/track_tailcall0.s --- pypy-7.1.1+dfsg/rpython/translator/c/gcc/test/darwin/track_tailcall0.s 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/translator/c/gcc/test/darwin/track_tailcall0.s 1970-01-01 00:00:00.000000000 +0000 @@ -1,29 +0,0 @@ -_pypy_g___mm_le_0_perform_call: - subl $12, %esp - movl %ebx, (%esp) - movl %esi, 4(%esp) - movl %edi, 8(%esp) - call L82 -"L00000000004$pb": -L82: - popl %ebx - movl 16(%esp), %edi - movl 20(%esp), %esi -L79: - movl 4(%edi), %eax - movl 20(%eax), %ecx - incl %ecx - movl 4(%esi), %eax - movl 20(%eax), %edx - movl L_pypy_g_array_45$non_lazy_ptr-"L00000000004$pb"(%ebx), %eax - addl 8(%eax,%ecx,4), %edx - andl $255, %edx - movl L_pypy_g_array_2193$non_lazy_ptr-"L00000000004$pb"(%ebx), %eax - movl 8(%eax,%edx,4), %ecx - movl (%esp), %ebx - movl 4(%esp), %esi - movl 8(%esp), %edi - addl $12, %esp - jmp *%ecx -L80: - nop diff -Nru pypy-7.1.1+dfsg/rpython/translator/c/gcc/test/darwin/track_tailcall1.s pypy-7.3.1+dfsg/rpython/translator/c/gcc/test/darwin/track_tailcall1.s --- pypy-7.1.1+dfsg/rpython/translator/c/gcc/test/darwin/track_tailcall1.s 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/translator/c/gcc/test/darwin/track_tailcall1.s 1970-01-01 00:00:00.000000000 +0000 @@ -1,344 +0,0 @@ -_pypy_g_call__Type: - subl $92, %esp - movl %ebx, 76(%esp) - movl %esi, 80(%esp) - movl %edi, 84(%esp) - movl %ebp, 88(%esp) - call L12381 -"L00000000489$pb": -L12381: - popl %ebx - movl 96(%esp), %esi - movl 100(%esp), %edi -L12333: - movl L_pypy_g_pypy_objspace_std_typeobject_W_TypeObject_25$non_lazy_ptr-"L00000000489$pb"(%ebx), %eax - movl %eax, 28(%esp) - cmpl %eax, %esi - je L12334 - movl %esi, %ebp -L12336: - movl 416(%ebp), %eax - testl %eax, %eax - je L12337 -L12338: - movl %edi, 8(%esp) - movl %ebp, 4(%esp) - movl %eax, (%esp) - call L_pypy_g_ObjSpace_call_obj_args$stub - ;; expected {92(%esp) | 76(%esp), 80(%esp), 84(%esp), 88(%esp) | %edi} - movl %edi, %edx - movl L___gcmapend$non_lazy_ptr-"L00000000489$pb"(%ebx), %ecx - /* GCROOT %edx */ - movl L_pypy_g_ExcData$non_lazy_ptr-"L00000000489$pb"(%ebx), %esi - movl (%esi), %esi - testl %esi, %esi - je L12378 -L12339: - xorl %eax, %eax -L12346: - movl 76(%esp), %ebx - movl 80(%esp), %esi - movl 84(%esp), %edi - movl 88(%esp), %ebp - addl $92, %esp - ret - .align 4,0x90 -L12378: - movl %edx, %edi - movl %eax, %esi -L12341: - movl L_pypy_g_rpy_string_154$non_lazy_ptr-"L00000000489$pb"(%ebx), %eax - movl %eax, 4(%esp) - movl %esi, (%esp) - call L_pypy_g_lookup____init__$stub - ;; expected {92(%esp) | 76(%esp), 80(%esp), 84(%esp), 88(%esp) | %esi, %edi} - movl %edi, %edx - movl L___gcmapend$non_lazy_ptr-"L00000000489$pb"(%ebx), %ecx - /* GCROOT %edx */ - /* GCROOT %esi */ - movl L_pypy_g_ExcData$non_lazy_ptr-"L00000000489$pb"(%ebx), %ecx - movl (%ecx), %ecx - testl %ecx, %ecx - jne L12339 -L12342: - movl %edx, 8(%esp) - movl %esi, 4(%esp) - movl %eax, (%esp) - call L_pypy_g_get_and_call_args$stub - ;; expected {92(%esp) | 76(%esp), 80(%esp), 84(%esp), 88(%esp) | %esi} - movl %eax, %edx - movl %esi, %eax - movl L___gcmapend$non_lazy_ptr-"L00000000489$pb"(%ebx), %ecx - /* GCROOT %eax */ - movl L_pypy_g_ExcData$non_lazy_ptr-"L00000000489$pb"(%ebx), %esi - movl (%esi), %ebp - testl %ebp, %ebp - jne L12339 -L12343: - cmpl L_pypy_g_pypy_objspace_std_noneobject_W_NoneObject$non_lazy_ptr-"L00000000489$pb"(%ebx), %edx - je L12346 -L12344: - movl L_pypy_g_pypy_rpython_memory_gc_hybrid_HybridGC$non_lazy_ptr-"L00000000489$pb"(%ebx), %esi - movl 112(%esi), %edx - movl 124(%esi), %eax - subl %edx, %eax - cmpl $19, %eax - jle L12347 - movl %edx, %ecx -L12349: - movl $4, (%ecx) - leal 20(%ecx), %eax - movl %eax, 112(%esi) -L12350: - movl L_pypy_g_pypy_interpreter_error_OperationError_vtable$non_lazy_ptr-"L00000000489$pb"(%ebx), %edx - movl %edx, 4(%ecx) - movl L_pypy_g_pypy_objspace_std_typeobject_W_TypeObject$non_lazy_ptr-"L00000000489$pb"(%ebx), %eax - movl %eax, 12(%ecx) - movl L_pypy_g_pypy_objspace_std_stringobject_W_StringObject_775$non_lazy_ptr-"L00000000489$pb"(%ebx), %eax - movl %eax, 16(%ecx) - movl $0, 8(%ecx) -L12351: - movl %ecx, 4(%esp) - movl %edx, (%esp) - call L_pypy_g_RPyRaiseException$stub - ;; expected {92(%esp) | 76(%esp), 80(%esp), 84(%esp), 88(%esp) | } - xorl %eax, %eax - jmp L12346 - .align 4,0x90 -L12337: - movl L_pypy_g_rpy_string_211$non_lazy_ptr-"L00000000489$pb"(%ebx), %eax - movl %eax, 4(%esp) - movl %ebp, (%esp) - call L_pypy_g_W_TypeObject_lookup_where_with_method_cache$stub - ;; expected {92(%esp) | 76(%esp), 80(%esp), 84(%esp), 88(%esp) | %edi, %ebp} - movl L___gcmapend$non_lazy_ptr-"L00000000489$pb"(%ebx), %edx - /* GCROOT %ebp */ - /* GCROOT %edi */ - movl L_pypy_g_ExcData$non_lazy_ptr-"L00000000489$pb"(%ebx), %ecx - movl (%ecx), %esi - testl %esi, %esi - jne L12339 -L12353: - movl 4(%eax), %esi - movl $0, 8(%esp) - movl %ebp, 4(%esp) - movl 8(%eax), %eax - movl %eax, (%esp) - call L_pypy_g_get$stub - ;; expected {92(%esp) | 76(%esp), 80(%esp), 84(%esp), 88(%esp) | %esi, %edi, %ebp} - movl %eax, 36(%esp) - movl L___gcmapend$non_lazy_ptr-"L00000000489$pb"(%ebx), %eax - /* GCROOT %ebp */ - /* GCROOT %edi */ - movl %edi, 40(%esp) - movl %esi, %eax - movl L___gcmapend$non_lazy_ptr-"L00000000489$pb"(%ebx), %edx - /* GCROOT %eax */ - movl %esi, %edx - movl L___gcmapend$non_lazy_ptr-"L00000000489$pb"(%ebx), %ecx - /* GCROOT %edx */ - movl L_pypy_g_ExcData$non_lazy_ptr-"L00000000489$pb"(%ebx), %esi - movl (%esi), %ecx - testl %ecx, %ecx - jne L12339 -L12354: - testl %eax, %eax - je L12356 -L12355: - movl 4(%eax), %eax - movl (%eax), %eax - cmpl $623, %eax - jle L12356 -L12367: - cmpl $629, %eax - jg L12356 -L12368: - testb $2, 9(%edx) - jne L12356 -L12369: - cmpl 28(%esp), %edx - je L12356 -L12370: - testb $8, 2(%ebp) - je L12372 -L12371: - movl 36(%esp), %eax - movl %eax, 4(%esp) - movl %ebp, (%esp) - call L_pypy_g_remember_young_pointer$stub - ;; expected {92(%esp) | 76(%esp), 80(%esp), 84(%esp), 88(%esp) | %ebp, 40(%esp)} -L12372: - movl 36(%esp), %esi - movl %esi, 416(%ebp) -L12356: - movl 40(%esp), %eax - movl %eax, 8(%esp) - movl %ebp, 4(%esp) - movl 36(%esp), %edx - movl %edx, (%esp) - call L_pypy_g_ObjSpace_call_obj_args$stub - ;; expected {92(%esp) | 76(%esp), 80(%esp), 84(%esp), 88(%esp) | %ebp, 40(%esp)} - movl %eax, %edi - movl %ebp, %esi - movl L___gcmapend$non_lazy_ptr-"L00000000489$pb"(%ebx), %ecx - /* GCROOT %esi */ - movl %esi, 44(%esp) - movl 40(%esp), %eax - /* GCROOT %eax */ - movl %eax, 48(%esp) - movl %ebp, %esi - /* GCROOT %esi */ - movl L_pypy_g_ExcData$non_lazy_ptr-"L00000000489$pb"(%ebx), %edx - movl (%edx), %eax - testl %eax, %eax - jne L12339 -L12357: - movl 4(%edi), %eax - movl %edi, (%esp) - call *32(%eax) - ;; expected {92(%esp) | 76(%esp), 80(%esp), 84(%esp), 88(%esp) | %edi, 48(%esp)} - /* keepalive %eax */ - /* keepalive 44(%esp) */ - movl %esi, 4(%esp) - movl %eax, (%esp) - call L_pypy_g___mm_issubtype_perform_call$stub - ;; expected {92(%esp) | 76(%esp), 80(%esp), 84(%esp), 88(%esp) | %edi, 48(%esp)} - movl %eax, %esi - movl %edi, %ebp - movl L___gcmapend$non_lazy_ptr-"L00000000489$pb"(%ebx), %ecx - /* GCROOT %ebp */ - movl 48(%esp), %edi - /* GCROOT %edi */ - movl L_pypy_g_ExcData$non_lazy_ptr-"L00000000489$pb"(%ebx), %eax - movl (%eax), %eax - testl %eax, %eax - jne L12339 -L12358: - movl %esi, (%esp) - call L_pypy_g___mm_nonzero_0_perform_call$stub - ;; expected {92(%esp) | 76(%esp), 80(%esp), 84(%esp), 88(%esp) | %esi, %edi, %ebp} - movl L___gcmapend$non_lazy_ptr-"L00000000489$pb"(%ebx), %edx - /* GCROOT %ebp */ - movl %ebp, 52(%esp) - movl %ebp, %ecx - /* GCROOT %edi */ - movl %edi, 56(%esp) - /* GCROOT %esi */ - movl %esi, 60(%esp) - movl L_pypy_g_ExcData$non_lazy_ptr-"L00000000489$pb"(%ebx), %esi - movl (%esi), %ebp - testl %ebp, %ebp - je L12379 -L12359: - movl L_pypy_g_ExcData$non_lazy_ptr-"L00000000489$pb"(%ebx), %eax - movl 4(%eax), %esi - movl $0, 4(%eax) - movl $0, (%eax) - /* keepalive %esi */ - /* keepalive 60(%esp) */ - /* keepalive 52(%esp) */ - /* keepalive 56(%esp) */ - movl L_pypy_g_pypy_objspace_std_multimethod_FailedToImplement_$non_lazy_ptr-"L00000000489$pb"(%ebx), %eax - movl %eax, 4(%esp) - movl %ebp, (%esp) - call L_pypy_g_ll_issubclass__object_vtablePtr_object_vtablePtr$stub - ;; expected {92(%esp) | 76(%esp), 80(%esp), 84(%esp), 88(%esp) | 52(%esp), 56(%esp)} - movl %ebp, %edx - movl %esi, %ecx - testb %al, %al - je L12351 -L12364: - movl 60(%esp), %edx - movl %edx, (%esp) - call L_pypy_g_is_true$stub - ;; expected {92(%esp) | 76(%esp), 80(%esp), 84(%esp), 88(%esp) | 52(%esp), 56(%esp)} - movl %eax, %esi - movl 52(%esp), %eax - movl L___gcmapend$non_lazy_ptr-"L00000000489$pb"(%ebx), %ecx - /* GCROOT %eax */ - movl 56(%esp), %edx - /* GCROOT %edx */ - movl L_pypy_g_ExcData$non_lazy_ptr-"L00000000489$pb"(%ebx), %ecx - movl (%ecx), %ecx - testl %ecx, %ecx - jne L12339 - movl %eax, %ecx - movl %edx, %edi - movl %esi, %edx -L12361: - movl %ecx, %eax - movl %ecx, %esi - testb %dl, %dl - jne L12341 - jmp L12346 - .align 4,0x90 -L12334: - movl $1, 8(%esp) - movl %edi, 4(%esp) - movl 4(%edi), %eax - movsbl 22(%eax),%eax - movl %eax, (%esp) - call L_pypy_g_dispatcher_60$stub - ;; expected {92(%esp) | 76(%esp), 80(%esp), 84(%esp), 88(%esp) | %esi, %edi} - movl %esi, %ecx - movl L___gcmapend$non_lazy_ptr-"L00000000489$pb"(%ebx), %edx - /* GCROOT %ecx */ - movl %ecx, %ebp - movl %edi, %edx - movl L___gcmapend$non_lazy_ptr-"L00000000489$pb"(%ebx), %esi - /* GCROOT %edx */ - movl %edx, %edi - movl L_pypy_g_ExcData$non_lazy_ptr-"L00000000489$pb"(%ebx), %esi - movl (%esi), %esi - movl %esi, 32(%esp) - testl %esi, %esi - je L12380 -L12373: - movl L_pypy_g_ExcData$non_lazy_ptr-"L00000000489$pb"(%ebx), %eax - movl 4(%eax), %esi - movl $0, 4(%eax) - movl $0, (%eax) - /* keepalive %esi */ - /* keepalive %edx */ - /* keepalive %ecx */ - movl L_pypy_g_exceptions_ValueError_vtable$non_lazy_ptr-"L00000000489$pb"(%ebx), %eax - movl %eax, 4(%esp) - movl 32(%esp), %edx - movl %edx, (%esp) - call L_pypy_g_ll_issubclass__object_vtablePtr_object_vtablePtr$stub - ;; expected {92(%esp) | 76(%esp), 80(%esp), 84(%esp), 88(%esp) | %edi, %ebp} - movl 32(%esp), %edx - movl %esi, %ecx - testb %al, %al - je L12351 - jmp L12336 -L12380: -L12374: - cmpl $1, 4(%eax) - jne L12336 -L12375: - movl 8(%eax), %eax - movl 4(%eax), %edx - movl %eax, 96(%esp) - movl 32(%edx), %ecx - movl 76(%esp), %ebx - movl 80(%esp), %esi - movl 84(%esp), %edi - movl 88(%esp), %ebp - addl $92, %esp - jmp *%ecx -L12347: - movl %esi, (%esp) - call L_pypy_g_GenerationGC_collect_nursery$stub - ;; expected {92(%esp) | 76(%esp), 80(%esp), 84(%esp), 88(%esp) | } - movl %eax, %ecx - movl L_pypy_g_ExcData$non_lazy_ptr-"L00000000489$pb"(%ebx), %eax - movl (%eax), %edi - testl %edi, %edi - jne L12339 - jmp L12349 -L12379: -L12360: - movzbl 8(%eax), %edx - jmp L12361 - .align 4,0x90 diff -Nru pypy-7.1.1+dfsg/rpython/translator/c/gcc/test/darwin64/track0.s pypy-7.3.1+dfsg/rpython/translator/c/gcc/test/darwin64/track0.s --- pypy-7.1.1+dfsg/rpython/translator/c/gcc/test/darwin64/track0.s 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/translator/c/gcc/test/darwin64/track0.s 1970-01-01 00:00:00.000000000 +0000 @@ -1,159 +0,0 @@ -_PyObject_Realloc: -LFB118: - movq %rbx, -32(%rsp) -LCFI86: - movq %rbp, -24(%rsp) -LCFI87: - movq %r12, -16(%rsp) -LCFI88: - movq %r13, -8(%rsp) -LCFI89: - subq $40, %rsp -LCFI90: - movq %rdi, %rbx - testq %rdi, %rdi - je L384 - movq %rdi, %rbp - andq $-4096, %rbp - movl 32(%rbp), %edx - movl _narenas(%rip), %eax - cmpl %eax, %edx - jae L360 - movq _arenas(%rip), %rax - mov %edx, %edx - movq %rdi, %rcx - subq (%rax,%rdx,8), %rcx - cmpq $262143, %rcx - ja L360 - movl 36(%rbp), %ecx - incl %ecx - leal 0(,%rcx,8), %r12d - mov %r12d, %eax - cmpq %rax, %rsi - ja L363 - leaq 0(,%rsi,4), %rdx - sall $4, %ecx - leal (%rcx,%r12), %eax - mov %eax, %eax - cmpq %rax, %rdx - ja L365 - movl %esi, %r12d -L363: - movq %rsi, %rdi - call _PyObject_Malloc - ;; expected {40(%rsp) | 8(%rsp), 24(%rsp), 32(%rsp), %r14, %r15, 16(%rsp) | } - testq %rax, %rax - je L367 - mov %r12d, %edx - movq %rbx, %rsi - movq %rax, %rdi - call _memcpy - ;; expected {40(%rsp) | 8(%rsp), 24(%rsp), 32(%rsp), %r14, %r15, 16(%rsp) | } - movl 32(%rbp), %edx - movl _narenas(%rip), %eax - cmpl %eax, %edx - jae L369 - movq _arenas(%rip), %rax - mov %edx, %edx - movq %rbx, %rcx - subq (%rax,%rdx,8), %rcx - cmpq $262143, %rcx - jbe L385 -L369: - movq %rbx, %rdi - call _free - ;; expected {40(%rsp) | 8(%rsp), 24(%rsp), 32(%rsp), %r14, %r15, 16(%rsp) | } - movq %r13, %rbx - jmp L365 - .align 4,0x90 -L360: - testq %rsi, %rsi - jne L386 - movl $1, %esi - movq %rbx, %rdi - call _realloc - ;; expected {40(%rsp) | 8(%rsp), 24(%rsp), 32(%rsp), %r14, %r15, 16(%rsp) | } - testq %rax, %rax - cmovne %rax, %rbx -L365: - movq %rbx, %rax - movq 8(%rsp), %rbx - movq 16(%rsp), %rbp - movq 24(%rsp), %r12 - movq 32(%rsp), %r13 - addq $40, %rsp - ret - .align 4,0x90 -L386: - movq %rbx, %rdi - movq 8(%rsp), %rbx - movq 16(%rsp), %rbp - movq 24(%rsp), %r12 - movq 32(%rsp), %r13 - addq $40, %rsp - jmp _realloc -L384: - movq %rsi, %rdi - movq 8(%rsp), %rbx - movq 16(%rsp), %rbp - movq 24(%rsp), %r12 - movq 32(%rsp), %r13 - addq $40, %rsp - jmp _PyObject_Malloc -L367: - movq %r13, %rbx - jmp L365 -L385: - movl (%rbp), %esi - testl %esi, %esi - je L387 - movq 8(%rbp), %rax - movq %rax, (%rbx) - movq %rbx, 8(%rbp) - testq %rax, %rax - je L374 - movl (%rbp), %eax - decl %eax - movl %eax, (%rbp) - testl %eax, %eax - jne L367 - movq 16(%rbp), %rdx - movq 24(%rbp), %rax - movq %rax, 24(%rdx) - movq %rdx, 16(%rax) - movq _freepools(%rip), %rax - movq %rax, 16(%rbp) - movq %rbp, _freepools(%rip) - movq %r13, %rbx - jmp L365 -L374: - movl (%rbp), %eax - decl %eax - movl %eax, (%rbp) - testl %eax, %eax - je L388 - movl 36(%rbp), %eax - addl %eax, %eax - mov %eax, %eax - leaq _usedpools(%rip), %rdx - movq (%rdx,%rax,8), %rax - movq 24(%rax), %rdx - movq %rax, 16(%rbp) - movq %rdx, 24(%rbp) - movq %rbp, 24(%rax) - movq %rbp, 16(%rdx) - movq %r13, %rbx - jmp L365 -L387: - leaq LC6(%rip), %rcx - movl $744, %edx - leaq LC7(%rip), %rsi - leaq ___func__.207211(%rip), %rdi - call ___assert_rtn -L388: - leaq LC6(%rip), %rcx - movl $783, %edx - leaq LC7(%rip), %rsi - leaq ___func__.207211(%rip), %rdi - call ___assert_rtn -LFE118: diff -Nru pypy-7.1.1+dfsg/rpython/translator/c/gcc/test/darwin64/track1.s pypy-7.3.1+dfsg/rpython/translator/c/gcc/test/darwin64/track1.s --- pypy-7.1.1+dfsg/rpython/translator/c/gcc/test/darwin64/track1.s 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/translator/c/gcc/test/darwin64/track1.s 1970-01-01 00:00:00.000000000 +0000 @@ -1,785 +0,0 @@ -_pypy_g_PyObject_RichCompare: -LFB302: - movq %rbx, -48(%rsp) -LCFI297: - movq %rbp, -40(%rsp) -LCFI298: - movq %r12, -32(%rsp) -LCFI299: - movq %r13, -24(%rsp) -LCFI300: - movq %r14, -16(%rsp) -LCFI301: - movq %r15, -8(%rsp) -LCFI302: - subq $88, %rsp -LCFI303: - movq %rdi, %rbx - movq %rsi, %rbp -L970: - cmpl $5, %edx - jbe L1056 -L971: - movq _pypy_g_pypy_rpython_memory_gc_minimark_MiniMarkGC@GOTPCREL(%rip), %rdi - movq 16(%rdi), %rdx - leaq 16(%rdx), %rax - movq %rax, 16(%rdi) - cmpq 24(%rdi), %rax - ja L1034 - movq %rdx, %rbx - movq _pypy_g_ExcData@GOTPCREL(%rip), %r11 -L1036: - movq $61224, (%rbx) - movq $0, 8(%rdx) -L1037: - movq %r11, (%rsp) - call _pypy_g_PyErr_BadInternalCall - ;; expected {88(%rsp) | 40(%rsp), 56(%rsp), 64(%rsp), 72(%rsp), 80(%rsp), 48(%rsp) | %rbx} - movq ___gcmapend@GOTPCREL(%rip), %rax - /* GCROOT %rbx */ - movq (%rsp), %r11 - movq (%r11), %rbp - testq %rbp, %rbp - je L1057 -L1038: - movq 8(%r11), %r12 - movq _pypydtcount@GOTPCREL(%rip), %r10 - movl (%r10), %eax - movq _pypy_debug_tracebacks@GOTPCREL(%rip), %r9 - movslq %eax,%rdx - salq $4, %rdx - leaq _loc.235055(%rip), %rcx - movq %rcx, (%rdx,%r9) - movq %rbp, 8(%rdx,%r9) - incl %eax - andl $127, %eax - movl %eax, (%r10) - movq _pypy_g_typeinfo@GOTPCREL(%rip), %r8 - leaq 59688(%r8), %rax - cmpq %rax, %rbp - je L1040 - leaq 59544(%r8), %rax - cmpq %rax, %rbp - je L1040 -L1042: - movq $0, 8(%r11) - movq $0, (%r11) - /* keepalive %r12 */ - /* keepalive %rbx */ -L1043: -L1044: - /* GC_NOCOLLECT pypy_g_ll_issubclass */ -L1046: -L1047: - /* keepalive %rbx */ - cmpq $0, 8(%rbx) - jle L1048 -L1049: - /* keepalive %rbx */ -L1050: - leaq 59688(%r8), %rcx - movq %rcx, (%r11) - movq _pypy_g_exceptions_AssertionError_6@GOTPCREL(%rip), %rax - movq %rax, 8(%r11) - movl (%r10), %edx - movslq %edx,%rax - salq $4, %rax - movq $0, (%rax,%r9) - movq %rcx, 8(%rax,%r9) - incl %edx - andl $127, %edx - /* GC_NOCOLLECT pypy_g_RPyRaiseException */ - movslq %edx,%rax - salq $4, %rax - leaq _loc.235061(%rip), %rbx - movq %rbx, (%rax,%r9) - movq $0, 8(%rax,%r9) - incl %edx - andl $127, %edx - movl %edx, (%r10) - xorl %eax, %eax - .align 4,0x90 -L981: - movq 40(%rsp), %rbx - movq 48(%rsp), %rbp - movq 56(%rsp), %r12 - movq 64(%rsp), %r13 - movq 72(%rsp), %r14 - movq 80(%rsp), %r15 - addq $88, %rsp - ret - .align 4,0x90 -L1056: - mov %edx, %eax - leaq L978(%rip), %rdx - movslq (%rdx,%rax,4),%rax - addq %rdx, %rax - jmp *%rax - .align 2,0x90 -L978: - .long L972-L978 - .long L973-L978 - .long L974-L978 - .long L975-L978 - .long L976-L978 - .long L977-L978 -L972: - /* keepalive %rdi */ - /* keepalive %rsi */ - call _pypy_g___mm_lt_0_perform_call - ;; expected {88(%rsp) | 40(%rsp), 56(%rsp), 64(%rsp), 72(%rsp), 80(%rsp), 48(%rsp) | %rbx, %rbp} - movq ___gcmapend@GOTPCREL(%rip), %rdx - movq %rbx, %r15 - /* GCROOT %r15 */ - movq %rbp, %r14 - /* GCROOT %r14 */ - movq %rbx, %r12 - /* GCROOT %r12 */ - /* GCROOT %rbp */ - movq _pypy_g_ExcData@GOTPCREL(%rip), %r11 - movq (%r11), %rbx - testq %rbx, %rbx - je L981 -L979: - movq 8(%r11), %r13 - movq _pypydtcount@GOTPCREL(%rip), %r10 - movl (%r10), %eax - movq _pypy_debug_tracebacks@GOTPCREL(%rip), %r9 - movslq %eax,%rdx - salq $4, %rdx - leaq _loc.234970(%rip), %rcx - movq %rcx, (%rdx,%r9) - movq %rbx, 8(%rdx,%r9) - incl %eax - andl $127, %eax - movl %eax, (%r10) - movq _pypy_g_typeinfo@GOTPCREL(%rip), %r8 - leaq 59688(%r8), %rax - cmpq %rax, %rbx - je L982 - leaq 59544(%r8), %rax - cmpq %rax, %rbx - je L982 -L984: - movq $0, 8(%r11) - movq $0, (%r11) - /* keepalive %r13 */ - /* keepalive %r15 */ - /* keepalive %r14 */ - /* keepalive %r12 */ - /* keepalive %rbp */ -L985: - movq 1712(%r8), %rcx - movq (%rbx), %rdx - subq %rcx, %rdx - movq 1720(%r8), %rax -L986: - /* GC_NOCOLLECT pypy_g_ll_issubclass */ - subq %rcx, %rax - cmpq %rax, %rdx - jae L1058 -L987: - /* keepalive %r12 */ - /* keepalive %rbp */ - movq %rbp, %rsi - movq %r12, %rdi - movq 40(%rsp), %rbx - movq 48(%rsp), %rbp - movq 56(%rsp), %r12 - movq 64(%rsp), %r13 - movq 72(%rsp), %r14 - movq 80(%rsp), %r15 - addq $88, %rsp - jmp _pypy_g_comparison_lt_impl -L973: - /* keepalive %rdi */ - /* keepalive %rsi */ - call _pypy_g___mm_le_0_perform_call - ;; expected {88(%rsp) | 40(%rsp), 56(%rsp), 64(%rsp), 72(%rsp), 80(%rsp), 48(%rsp) | %rbx, %rbp} - movq ___gcmapend@GOTPCREL(%rip), %rdx - movq %rbx, %r15 - /* GCROOT %r15 */ - movq %rbp, %r14 - /* GCROOT %r14 */ - movq %rbx, %r12 - /* GCROOT %r12 */ - /* GCROOT %rbp */ - movq _pypy_g_ExcData@GOTPCREL(%rip), %r11 - movq (%r11), %rbx - testq %rbx, %rbx - je L981 -L989: - movq 8(%r11), %r13 - movq _pypydtcount@GOTPCREL(%rip), %r10 - movl (%r10), %eax - movq _pypy_debug_tracebacks@GOTPCREL(%rip), %r9 - movslq %eax,%rdx - salq $4, %rdx - leaq _loc.234982(%rip), %rcx - movq %rcx, (%rdx,%r9) - movq %rbx, 8(%rdx,%r9) - incl %eax - andl $127, %eax - movl %eax, (%r10) - movq _pypy_g_typeinfo@GOTPCREL(%rip), %r8 - leaq 59688(%r8), %rax - cmpq %rax, %rbx - je L991 - leaq 59544(%r8), %rax - cmpq %rax, %rbx - je L991 -L993: - movq $0, 8(%r11) - movq $0, (%r11) - /* keepalive %r13 */ - /* keepalive %r15 */ - /* keepalive %r14 */ - /* keepalive %r12 */ - /* keepalive %rbp */ -L994: - movq 1712(%r8), %rcx - movq (%rbx), %rdx - subq %rcx, %rdx - movq 1720(%r8), %rax -L995: - /* GC_NOCOLLECT pypy_g_ll_issubclass */ - subq %rcx, %rax - cmpq %rax, %rdx - jae L1059 -L996: - /* keepalive %r12 */ - /* keepalive %rbp */ - movq %rbp, %rsi - movq %r12, %rdi - movq 40(%rsp), %rbx - movq 48(%rsp), %rbp - movq 56(%rsp), %r12 - movq 64(%rsp), %r13 - movq 72(%rsp), %r14 - movq 80(%rsp), %r15 - addq $88, %rsp - jmp _pypy_g_comparison_le_impl -L974: - /* keepalive %rdi */ - /* keepalive %rsi */ - call _pypy_g___mm_eq_0_perform_call - ;; expected {88(%rsp) | 40(%rsp), 56(%rsp), 64(%rsp), 72(%rsp), 80(%rsp), 48(%rsp) | %rbx, %rbp} - movq ___gcmapend@GOTPCREL(%rip), %rdx - movq %rbx, %r15 - /* GCROOT %r15 */ - movq %rbp, %r14 - /* GCROOT %r14 */ - movq %rbx, %r12 - /* GCROOT %r12 */ - /* GCROOT %rbp */ - movq _pypy_g_ExcData@GOTPCREL(%rip), %r11 - movq (%r11), %rbx - testq %rbx, %rbx - je L981 -L998: - movq 8(%r11), %r13 - movq _pypydtcount@GOTPCREL(%rip), %r10 - movl (%r10), %eax - movq _pypy_debug_tracebacks@GOTPCREL(%rip), %r9 - movslq %eax,%rdx - salq $4, %rdx - leaq _loc.234994(%rip), %rcx - movq %rcx, (%rdx,%r9) - movq %rbx, 8(%rdx,%r9) - incl %eax - andl $127, %eax - movl %eax, (%r10) - movq _pypy_g_typeinfo@GOTPCREL(%rip), %r8 - leaq 59688(%r8), %rax - cmpq %rax, %rbx - je L1000 - leaq 59544(%r8), %rax - cmpq %rax, %rbx - je L1000 -L1002: - movq $0, 8(%r11) - movq $0, (%r11) - /* keepalive %r13 */ - /* keepalive %r15 */ - /* keepalive %r14 */ - /* keepalive %rbp */ - /* keepalive %r12 */ -L1003: - movq 1712(%r8), %rcx - movq (%rbx), %rdx - subq %rcx, %rdx - movq 1720(%r8), %rax -L1004: - /* GC_NOCOLLECT pypy_g_ll_issubclass */ - subq %rcx, %rax - cmpq %rax, %rdx - jae L1060 -L1005: - /* keepalive %r12 */ - /* keepalive %rbp */ - movq %rbp, %rsi - movq %r12, %rdi - movq 40(%rsp), %rbx - movq 48(%rsp), %rbp - movq 56(%rsp), %r12 - movq 64(%rsp), %r13 - movq 72(%rsp), %r14 - movq 80(%rsp), %r15 - addq $88, %rsp - jmp _pypy_g_comparison_eq_impl -L975: - /* keepalive %rdi */ - /* keepalive %rsi */ - call _pypy_g___mm_ne_0_perform_call - ;; expected {88(%rsp) | 40(%rsp), 56(%rsp), 64(%rsp), 72(%rsp), 80(%rsp), 48(%rsp) | %rbx, %rbp} - movq ___gcmapend@GOTPCREL(%rip), %rdx - movq %rbx, %r15 - /* GCROOT %r15 */ - movq %rbp, %r14 - /* GCROOT %r14 */ - movq %rbx, %r12 - /* GCROOT %r12 */ - /* GCROOT %rbp */ - movq _pypy_g_ExcData@GOTPCREL(%rip), %r11 - movq (%r11), %rbx - testq %rbx, %rbx - je L981 -L1007: - movq 8(%r11), %r13 - movq _pypydtcount@GOTPCREL(%rip), %r10 - movl (%r10), %eax - movq _pypy_debug_tracebacks@GOTPCREL(%rip), %r9 - movslq %eax,%rdx - salq $4, %rdx - leaq _loc.235006(%rip), %rcx - movq %rcx, (%rdx,%r9) - movq %rbx, 8(%rdx,%r9) - incl %eax - andl $127, %eax - movl %eax, (%r10) - movq _pypy_g_typeinfo@GOTPCREL(%rip), %r8 - leaq 59688(%r8), %rax - cmpq %rax, %rbx - je L1009 - leaq 59544(%r8), %rax - cmpq %rax, %rbx - je L1009 -L1011: - movq $0, 8(%r11) - movq $0, (%r11) - /* keepalive %r13 */ - /* keepalive %r15 */ - /* keepalive %r14 */ - /* keepalive %r12 */ - /* keepalive %rbp */ -L1012: - movq 1712(%r8), %rcx - movq (%rbx), %rdx - subq %rcx, %rdx - movq 1720(%r8), %rax -L1013: - /* GC_NOCOLLECT pypy_g_ll_issubclass */ - subq %rcx, %rax - cmpq %rax, %rdx - jae L1061 -L1014: - /* keepalive %r12 */ - /* keepalive %rbp */ - movq %rbp, %rsi - movq %r12, %rdi - movq 40(%rsp), %rbx - movq 48(%rsp), %rbp - movq 56(%rsp), %r12 - movq 64(%rsp), %r13 - movq 72(%rsp), %r14 - movq 80(%rsp), %r15 - addq $88, %rsp - jmp _pypy_g_comparison_ne_impl -L976: - /* keepalive %rdi */ - /* keepalive %rsi */ - call _pypy_g___mm_gt_0_perform_call - ;; expected {88(%rsp) | 40(%rsp), 56(%rsp), 64(%rsp), 72(%rsp), 80(%rsp), 48(%rsp) | %rbx, %rbp} - movq ___gcmapend@GOTPCREL(%rip), %rdx - movq %rbx, %r15 - /* GCROOT %r15 */ - movq %rbp, %r14 - /* GCROOT %r14 */ - movq %rbx, %r12 - /* GCROOT %r12 */ - /* GCROOT %rbp */ - movq _pypy_g_ExcData@GOTPCREL(%rip), %r11 - movq (%r11), %rbx - testq %rbx, %rbx - je L981 -L1016: - movq 8(%r11), %r13 - movq _pypydtcount@GOTPCREL(%rip), %r10 - movl (%r10), %eax - movq _pypy_debug_tracebacks@GOTPCREL(%rip), %r9 - movslq %eax,%rdx - salq $4, %rdx - leaq _loc.235018(%rip), %rcx - movq %rcx, (%rdx,%r9) - movq %rbx, 8(%rdx,%r9) - incl %eax - andl $127, %eax - movl %eax, (%r10) - movq _pypy_g_typeinfo@GOTPCREL(%rip), %r8 - leaq 59688(%r8), %rax - cmpq %rax, %rbx - je L1018 - leaq 59544(%r8), %rax - cmpq %rax, %rbx - je L1018 -L1020: - movq $0, 8(%r11) - movq $0, (%r11) - /* keepalive %r13 */ - /* keepalive %r15 */ - /* keepalive %r14 */ - /* keepalive %rbp */ - /* keepalive %r12 */ -L1021: - movq 1712(%r8), %rcx - movq (%rbx), %rdx - subq %rcx, %rdx - movq 1720(%r8), %rax -L1022: - /* GC_NOCOLLECT pypy_g_ll_issubclass */ - subq %rcx, %rax - cmpq %rax, %rdx - jae L1062 -L1023: - /* keepalive %r12 */ - /* keepalive %rbp */ - movq %rbp, %rsi - movq %r12, %rdi - movq 40(%rsp), %rbx - movq 48(%rsp), %rbp - movq 56(%rsp), %r12 - movq 64(%rsp), %r13 - movq 72(%rsp), %r14 - movq 80(%rsp), %r15 - addq $88, %rsp - jmp _pypy_g_comparison_gt_impl -L977: - /* keepalive %rdi */ - /* keepalive %rsi */ - call _pypy_g___mm_ge_0_perform_call - ;; expected {88(%rsp) | 40(%rsp), 56(%rsp), 64(%rsp), 72(%rsp), 80(%rsp), 48(%rsp) | %rbx, %rbp} - movq ___gcmapend@GOTPCREL(%rip), %rdx - movq %rbx, %r15 - /* GCROOT %r15 */ - movq %rbp, %r14 - /* GCROOT %r14 */ - movq %rbx, %r12 - /* GCROOT %r12 */ - /* GCROOT %rbp */ - movq _pypy_g_ExcData@GOTPCREL(%rip), %r11 - movq (%r11), %rbx - testq %rbx, %rbx - je L981 -L1025: - movq 8(%r11), %r13 - movq _pypydtcount@GOTPCREL(%rip), %r10 - movl (%r10), %eax - movq _pypy_debug_tracebacks@GOTPCREL(%rip), %r9 - movslq %eax,%rdx - salq $4, %rdx - leaq _loc.235030(%rip), %rcx - movq %rcx, (%rdx,%r9) - movq %rbx, 8(%rdx,%r9) - incl %eax - andl $127, %eax - movl %eax, (%r10) - movq _pypy_g_typeinfo@GOTPCREL(%rip), %r8 - leaq 59688(%r8), %rax - cmpq %rax, %rbx - je L1027 - leaq 59544(%r8), %rax - cmpq %rax, %rbx - je L1027 -L1029: - movq $0, 8(%r11) - movq $0, (%r11) - /* keepalive %r13 */ - /* keepalive %r15 */ - /* keepalive %r14 */ - /* keepalive %r12 */ - /* keepalive %rbp */ -L1030: - movq 1712(%r8), %rcx - movq (%rbx), %rdx - subq %rcx, %rdx - movq 1720(%r8), %rax -L1031: - /* GC_NOCOLLECT pypy_g_ll_issubclass */ - subq %rcx, %rax - cmpq %rax, %rdx - jae L1063 -L1032: - /* keepalive %r12 */ - /* keepalive %rbp */ - movq %rbp, %rsi - movq %r12, %rdi - movq 40(%rsp), %rbx - movq 48(%rsp), %rbp - movq 56(%rsp), %r12 - movq 64(%rsp), %r13 - movq 72(%rsp), %r14 - movq 80(%rsp), %r15 - addq $88, %rsp - jmp _pypy_g_comparison_ge_impl -L1045: -L1034: - movl $16, %esi - call _pypy_g_MiniMarkGC_collect_and_reserve - ;; expected {88(%rsp) | 40(%rsp), 56(%rsp), 64(%rsp), 72(%rsp), 80(%rsp), 48(%rsp) | } - movq _pypy_g_ExcData@GOTPCREL(%rip), %r11 - movq %rax, %rdx - movq %rax, %rbx - cmpq $0, (%r11) - je L1036 -L1053: - movq _pypydtcount@GOTPCREL(%rip), %rsi - movl (%rsi), %edx - movq _pypy_debug_tracebacks@GOTPCREL(%rip), %rcx - movslq %edx,%rax - salq $4, %rax - leaq _loc.235064(%rip), %rbx - movq %rbx, (%rax,%rcx) - movq $0, 8(%rcx,%rax) - incl %edx - andl $127, %edx -L1052: - movslq %edx,%rax - salq $4, %rax - leaq _loc.235062(%rip), %rbx - movq %rbx, (%rax,%rcx) - movq $0, 8(%rax,%rcx) - incl %edx - andl $127, %edx - movl %edx, (%rsi) - xorl %eax, %eax - jmp L981 -L1027: - movq %r8, 24(%rsp) - movq %r9, 16(%rsp) - movq %r10, 8(%rsp) - movq %r11, (%rsp) - call _pypy_debug_catch_fatal_exception - ;; expected {88(%rsp) | 40(%rsp), 56(%rsp), 64(%rsp), 72(%rsp), 80(%rsp), 48(%rsp) | } - movq (%rsp), %r11 - movq 8(%rsp), %r10 - movq 16(%rsp), %r9 - movq 24(%rsp), %r8 - jmp L1029 -L1018: - movq %r8, 24(%rsp) - movq %r9, 16(%rsp) - movq %r10, 8(%rsp) - movq %r11, (%rsp) - call _pypy_debug_catch_fatal_exception - ;; expected {88(%rsp) | 40(%rsp), 56(%rsp), 64(%rsp), 72(%rsp), 80(%rsp), 48(%rsp) | } - movq (%rsp), %r11 - movq 8(%rsp), %r10 - movq 16(%rsp), %r9 - movq 24(%rsp), %r8 - jmp L1020 -L1009: - movq %r8, 24(%rsp) - movq %r9, 16(%rsp) - movq %r10, 8(%rsp) - movq %r11, (%rsp) - call _pypy_debug_catch_fatal_exception - ;; expected {88(%rsp) | 40(%rsp), 56(%rsp), 64(%rsp), 72(%rsp), 80(%rsp), 48(%rsp) | } - movq (%rsp), %r11 - movq 8(%rsp), %r10 - movq 16(%rsp), %r9 - movq 24(%rsp), %r8 - jmp L1011 -L1000: - movq %r8, 24(%rsp) - movq %r9, 16(%rsp) - movq %r10, 8(%rsp) - movq %r11, (%rsp) - call _pypy_debug_catch_fatal_exception - ;; expected {88(%rsp) | 40(%rsp), 56(%rsp), 64(%rsp), 72(%rsp), 80(%rsp), 48(%rsp) | } - movq (%rsp), %r11 - movq 8(%rsp), %r10 - movq 16(%rsp), %r9 - movq 24(%rsp), %r8 - jmp L1002 -L991: - movq %r8, 24(%rsp) - movq %r9, 16(%rsp) - movq %r10, 8(%rsp) - movq %r11, (%rsp) - call _pypy_debug_catch_fatal_exception - ;; expected {88(%rsp) | 40(%rsp), 56(%rsp), 64(%rsp), 72(%rsp), 80(%rsp), 48(%rsp) | } - movq (%rsp), %r11 - movq 8(%rsp), %r10 - movq 16(%rsp), %r9 - movq 24(%rsp), %r8 - jmp L993 -L982: - movq %r8, 24(%rsp) - movq %r9, 16(%rsp) - movq %r10, 8(%rsp) - movq %r11, (%rsp) - call _pypy_debug_catch_fatal_exception - ;; expected {88(%rsp) | 40(%rsp), 56(%rsp), 64(%rsp), 72(%rsp), 80(%rsp), 48(%rsp) | } - movq (%rsp), %r11 - movq 8(%rsp), %r10 - movq 16(%rsp), %r9 - movq 24(%rsp), %r8 - jmp L984 -L1059: -L997: - movq %rbx, (%r11) - movq %r13, 8(%r11) - movl (%r10), %edx - movslq %edx,%rax - salq $4, %rax - movq $-1, (%rax,%r9) - movq %rbx, 8(%rax,%r9) - incl %edx - andl $127, %edx - movl %edx, (%r10) - /* GC_NOCOLLECT pypy_g_RPyReRaiseException */ - xorl %eax, %eax - jmp L981 -L1058: -L988: - movq %rbx, (%r11) - movq %r13, 8(%r11) - movl (%r10), %edx - movslq %edx,%rax - salq $4, %rax - movq $-1, (%rax,%r9) - movq %rbx, 8(%rax,%r9) - incl %edx - andl $127, %edx - movl %edx, (%r10) - /* GC_NOCOLLECT pypy_g_RPyReRaiseException */ - xorl %eax, %eax - jmp L981 -L1061: -L1015: - movq %rbx, (%r11) - movq %r13, 8(%r11) - movl (%r10), %edx - movslq %edx,%rax - salq $4, %rax - movq $-1, (%rax,%r9) - movq %rbx, 8(%rax,%r9) - incl %edx - andl $127, %edx - movl %edx, (%r10) - /* GC_NOCOLLECT pypy_g_RPyReRaiseException */ - xorl %eax, %eax - jmp L981 -L1060: -L1006: - movq %rbx, (%r11) - movq %r13, 8(%r11) - movl (%r10), %edx - movslq %edx,%rax - salq $4, %rax - movq $-1, (%rax,%r9) - movq %rbx, 8(%rax,%r9) - incl %edx - andl $127, %edx - movl %edx, (%r10) - /* GC_NOCOLLECT pypy_g_RPyReRaiseException */ - xorl %eax, %eax - jmp L981 -L1063: -L1033: - movq %rbx, (%r11) - movq %r13, 8(%r11) - movl (%r10), %edx - movslq %edx,%rax - salq $4, %rax - movq $-1, (%rax,%r9) - movq %rbx, 8(%rax,%r9) - incl %edx - andl $127, %edx - movl %edx, (%r10) - /* GC_NOCOLLECT pypy_g_RPyReRaiseException */ - xorl %eax, %eax - jmp L981 -L1062: -L1024: - movq %rbx, (%r11) - movq %r13, 8(%r11) - movl (%r10), %edx - movslq %edx,%rax - salq $4, %rax - movq $-1, (%rax,%r9) - movq %rbx, 8(%rax,%r9) - incl %edx - andl $127, %edx - movl %edx, (%r10) - /* GC_NOCOLLECT pypy_g_RPyReRaiseException */ - xorl %eax, %eax - jmp L981 -L1040: - movq %r8, 24(%rsp) - movq %r9, 16(%rsp) - movq %r10, 8(%rsp) - movq %r11, (%rsp) - call _pypy_debug_catch_fatal_exception - ;; expected {88(%rsp) | 40(%rsp), 56(%rsp), 64(%rsp), 72(%rsp), 80(%rsp), 48(%rsp) | } - movq (%rsp), %r11 - movq 8(%rsp), %r10 - movq 16(%rsp), %r9 - movq 24(%rsp), %r8 - jmp L1042 -L1048: - /* keepalive %rbx */ - /* keepalive %r12 */ -L1051: - movq %rbp, (%r11) - movq %r12, 8(%r11) - movl (%r10), %edx - movslq %edx,%rax - salq $4, %rax - movq $-1, (%rax,%r9) - movq %rbp, 8(%rax,%r9) - incl %edx - andl $127, %edx - movl %edx, (%r10) - /* GC_NOCOLLECT pypy_g_RPyReRaiseException */ - xorl %eax, %eax - jmp L981 -L1057: -L1039: - movq _pypy_g_typeinfo@GOTPCREL(%rip), %rsi - addq $59688, %rsi - movq %rsi, (%r11) - movq _pypy_g_exceptions_AssertionError_5@GOTPCREL(%rip), %rax - movq %rax, 8(%r11) - movq _pypydtcount@GOTPCREL(%rip), %rdi - movl (%rdi), %edx - movq _pypy_debug_tracebacks@GOTPCREL(%rip), %rcx - movslq %edx,%rax - salq $4, %rax - movq $0, (%rax,%rcx) - movq %rsi, 8(%rcx,%rax) - incl %edx - andl $127, %edx - /* GC_NOCOLLECT pypy_g_RPyRaiseException */ - movslq %edx,%rax - salq $4, %rax - leaq _loc.235054(%rip), %rbx - movq %rbx, (%rax,%rcx) - movq $0, 8(%rcx,%rax) - incl %edx - andl $127, %edx - movl %edx, (%rdi) - xorl %eax, %eax - jmp L981 -LFE302: - .align 4,0x90 diff -Nru pypy-7.1.1+dfsg/rpython/translator/c/gcc/test/elf/src8.py pypy-7.3.1+dfsg/rpython/translator/c/gcc/test/elf/src8.py --- pypy-7.1.1+dfsg/rpython/translator/c/gcc/test/elf/src8.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/translator/c/gcc/test/elf/src8.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,22 +0,0 @@ -# ../../../../goal/translate.py --gcrootfinder=asmgcc --gc=semispace src8 - -class A: - pass - -def foo(rec, a1, a2, a3, a4, a5, a6): - if rec > 0: - b = A() - foo(rec-1, b, b, b, b, b, b) - foo(rec-1, b, b, b, b, b, b) - foo(rec-1, a6, a5, a4, a3, a2, a1) - -# __________ Entry point __________ - -def entry_point(argv): - foo(5, A(), A(), A(), A(), A(), A()) - return 0 - -# _____ Define and setup target ___ - -def target(*args): - return entry_point, None diff -Nru pypy-7.1.1+dfsg/rpython/translator/c/gcc/test/elf/track0.s pypy-7.3.1+dfsg/rpython/translator/c/gcc/test/elf/track0.s --- pypy-7.1.1+dfsg/rpython/translator/c/gcc/test/elf/track0.s 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/translator/c/gcc/test/elf/track0.s 1970-01-01 00:00:00.000000000 +0000 @@ -1,79 +0,0 @@ - .type pypy_g_clear_large_memory_chunk, @function -pypy_g_clear_large_memory_chunk: -.L271: - pushl %ebp - xorl %eax, %eax - movl $420, %edx - pushl %edi - pushl %esi - pushl %ebx - subl $12, %esp - movl 36(%esp), %ebp - movl %edx, 8(%esp) - movl %eax, 4(%esp) - movl %ebp, %ebx - movl $pypy_g_array_16, (%esp) - call open - ;; expected {28(%esp) | 12(%esp), 16(%esp), 20(%esp), 24(%esp) | } - cmpl $-1, %eax - movl %eax, %edi - movl 32(%esp), %esi - jne .L273 - jmp .L287 - .p2align 4,,7 -.L282: - movl %eax, 8(%esp) - movl %esi, 4(%esp) - movl %edi, (%esp) - call read - ;; expected {28(%esp) | 12(%esp), 16(%esp), 20(%esp), 24(%esp) | } - testl %eax, %eax - jle .L280 -.L285: -.L288: - subl %eax, %ebx - addl %eax, %esi -.L273: - testl %ebx, %ebx - jle .L280 -.L279: - cmpl $536870912, %ebx - movl $536870912, %eax - jg .L282 -.L283: - movl %esi, 4(%esp) - movl %ebx, %eax - movl %eax, 8(%esp) - movl %edi, (%esp) - call read - ;; expected {28(%esp) | 12(%esp), 16(%esp), 20(%esp), 24(%esp) | } - testl %eax, %eax - jg .L288 -.L280: - movl %edi, (%esp) - call close - ;; expected {28(%esp) | 12(%esp), 16(%esp), 20(%esp), 24(%esp) | } - movl %ebx, %eax -.L286: -.L274: - testl %eax, %eax - jle .L270 -.L277: -.L276: - movl %eax, 8(%esp) - xorl %ecx, %ecx - movl %ecx, 4(%esp) - movl %esi, (%esp) - call memset - ;; expected {28(%esp) | 12(%esp), 16(%esp), 20(%esp), 24(%esp) | } -.L270: - addl $12, %esp - popl %ebx - popl %esi - popl %edi - popl %ebp - ret -.L287: - movl %ebp, %eax - jmp .L286 - .size pypy_g_clear_large_memory_chunk, .-pypy_g_clear_large_memory_chunk diff -Nru pypy-7.1.1+dfsg/rpython/translator/c/gcc/test/elf/track10.s pypy-7.3.1+dfsg/rpython/translator/c/gcc/test/elf/track10.s --- pypy-7.1.1+dfsg/rpython/translator/c/gcc/test/elf/track10.s 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/translator/c/gcc/test/elf/track10.s 1970-01-01 00:00:00.000000000 +0000 @@ -1,14 +0,0 @@ - .type main1, @function -main1: - pushl %ebx - call pypy_f - ;; expected {4(%esp) | (%esp), %esi, %edi, %ebp | %ebx} - je .L1 - call RPyAssertFailed - ;; the following call is not reachable: it should be ignored - call pypy_malloc_something -.L1: - /* GCROOT %ebx */ - popl %ebx - ret - .size main1, .-main1 diff -Nru pypy-7.1.1+dfsg/rpython/translator/c/gcc/test/elf/track11.s pypy-7.3.1+dfsg/rpython/translator/c/gcc/test/elf/track11.s --- pypy-7.1.1+dfsg/rpython/translator/c/gcc/test/elf/track11.s 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/translator/c/gcc/test/elf/track11.s 1970-01-01 00:00:00.000000000 +0000 @@ -1,451 +0,0 @@ - .type pypy_g_f_gc_set_max_heap_size, @function -pypy_g_f_gc_set_max_heap_size: - ;; This really occurred in real-life (see around r77794). - ;; This function is large, but actually in all paths it - ;; will soon hit a RPyAssertFailed and abort. -.L22962: -.L22963: -.L22964: - pushl %ebp - movl $pypy_g_exceptions_NotImplementedError_vtable, %eax - pushl %edi - pushl %esi - pushl %ebx - subl $28, %esp - cmpl $pypy_g_py__code_assertion_AssertionError_vtable, %eax - je .L23136 -.L22965: -.L22967: -.L22969: -.L22971: -.L22972: -.L22974: - movl $.LC1, (%esp) - movl $.LC2, %ebp - movl $__FUNCTION__.1761, %esi - movl %ebp, 12(%esp) - movl $726, %edi - movl $loc.982, %ebp - movl %esi, 8(%esp) - xorl %esi, %esi - movl $pypy_g_exceptions_NotImplementedError_vtable, %ebx - movl %edi, 4(%esp) - call RPyAssertFailed - movl %ebx, pypy_g_ExcData - movl pypydtcount, %edi - xorl %edx, %edx - movl $400000, (%esp) - movl $pypy_g_exceptions_NotImplementedError_vtable, %eax - movl $pypy_g_exceptions_NotImplementedError, %ecx - movl %ecx, pypy_g_ExcData+4 - movl %edx, pypy_debug_tracebacks(,%edi,8) - movl %eax, pypy_debug_tracebacks+4(,%edi,8) - incl %edi - andl $127, %edi - movl %esi, pypy_debug_tracebacks+4(,%edi,8) - movl %ebp, pypy_debug_tracebacks(,%edi,8) - incl %edi - andl $127, %edi - movl %edi, pypydtcount - call pypy_g_mallocstr__Signed - movl pypy_g_ExcData, %ebx - movl %eax, %esi - testl %ebx, %ebx - jne .L22976 -.L22977: - xorl %ebx, %ebx - testl %eax, %eax - je .L23117 -.L23127: -.L22981: - movb $120, 12(%esi,%ebx) - incl %ebx - cmpl $399999, %ebx - jle .L23127 - .p2align 4,,15 -.L23112: - movl pypy_g_ExcData, %ebx - movl %esi, %edi - testl %ebx, %ebx - jne .L22990 -.L22991: -.L22992: -.L22993: -.L23137: -.L22995: - movl $4000000, (%esp) - call pypy_g_mallocstr__Signed - movl pypy_g_ExcData, %ebx - movl %eax, %esi - testl %ebx, %ebx - jne .L22997 -.L22998: - xorl %ebx, %ebx - testl %eax, %eax - je .L23120 -.L23129: -.L23002: - movb $120, 12(%esi,%ebx) - incl %ebx - cmpl $3999999, %ebx - jle .L23129 -.L23114: - movl pypy_g_ExcData, %ebx - movl %esi, %ebp - jmp .L23004 -.L22980: - .p2align 4,,7 -.L22976: -.L22983: -.L22987: - movl pypydtcount, %eax - xorl %edx, %edx - movl $loc.586, %ecx - xorl %edi, %edi - movl %ecx, pypy_debug_tracebacks(,%eax,8) - movl %edx, pypy_debug_tracebacks+4(,%eax,8) - incl %eax - andl $127, %eax - movl %eax, pypydtcount - testl %ebx, %ebx - je .L23137 -.L22990: - movl pypydtcount, %ecx - movl $loc.1444, %edx - movl pypy_g_ExcData+4, %edi - movl %edx, pypy_debug_tracebacks(,%ecx,8) - movl %ebx, pypy_debug_tracebacks+4(,%ecx,8) - incl %ecx - andl $127, %ecx - movl %ecx, pypydtcount - cmpl $pypy_g_py__code_assertion_AssertionError_vtable, %ebx - je .L23075 - cmpl $pypy_g_exceptions_NotImplementedError_vtable, %ebx - je .L23075 -.L23074: -.L23076: - xorl %eax, %eax - xorl %ebp, %ebp - movl %eax, pypy_g_ExcData+4 - movl %ebp, pypy_g_ExcData -#APP - /* keepalive %edi */ -#NO_APP - testl %ebx, %ebx - movl pypy_g_exceptions_MemoryError_vtable, %esi - je .L23138 -.L23080: -.L23083: - movl (%ebx), %ebp - movl pypy_g_exceptions_MemoryError_vtable+4, %edx - subl %esi, %ebp - subl %esi, %edx - cmpl %edx, %ebp - setb %cl -#APP - /* GC_NOCOLLECT pypy_g_ll_issubclass */ -#NO_APP - testb %cl, %cl - je .L23086 - xorl %edx, %edx - xorl %ecx, %ecx - xorl %eax, %eax -.L23036: -.L23038: -.L23040: - testl %eax, %eax - movzbl %dl, %ebp - setne %bl - movzbl %bl, %esi - xorl %eax, %eax - addl %esi, %ebp - testl %ecx, %ecx - setne %al - leal (%ebp,%eax), %eax -.L23041: - addl $28, %esp - popl %ebx - popl %esi - popl %edi - popl %ebp - ret - .p2align 4,,7 -.L23117: - call RPyAbort - movb $120, 12(%esi,%ebx) - incl %ebx - cmpl $399999, %ebx - jg .L23112 - call RPyAbort - movb $120, 12(%esi,%ebx) - incl %ebx - cmpl $399999, %ebx - jle .L23117 - jmp .L23112 -.L23075: - call pypy_debug_catch_fatal_exception - jmp .L23074 -.L23138: - call RPyAbort - jmp .L23080 -.L23136: - movl $.LC1, (%esp) - movl $.LC0, %ebx - movl $__FUNCTION__.1761, %ecx - movl %ebx, 12(%esp) - movl $724, %edx - movl %ecx, 8(%esp) - movl %edx, 4(%esp) - call RPyAssertFailed - jmp .L22965 -.L23001: -.L22997: - movl pypydtcount, %ebp - movl $loc.586, %eax - xorl %esi, %esi - movl %eax, pypy_debug_tracebacks(,%ebp,8) - movl %esi, pypy_debug_tracebacks+4(,%ebp,8) - incl %ebp - andl $127, %ebp - movl %ebp, pypydtcount - xorl %ebp, %ebp -.L23004: -.L23008: - movl %edi, %esi -#APP - /* GCROOT %esi */ -#NO_APP - movl %esi, 24(%esp) - testl %ebx, %ebx - je .L23139 -.L23011: - movl pypydtcount, %ecx - movl $loc.1443, %edx - movl pypy_g_ExcData+4, %edi - movl %edx, pypy_debug_tracebacks(,%ecx,8) - movl %ebx, pypy_debug_tracebacks+4(,%ecx,8) - incl %ecx - andl $127, %ecx - movl %ecx, pypydtcount - cmpl $pypy_g_py__code_assertion_AssertionError_vtable, %ebx - je .L23059 - cmpl $pypy_g_exceptions_NotImplementedError_vtable, %ebx - je .L23059 -.L23058: -.L23060: - xorl %ebp, %ebp - xorl %eax, %eax - movl %ebp, pypy_g_ExcData+4 - movl %eax, pypy_g_ExcData -#APP - /* keepalive %edi */ - /* keepalive %esi */ -#NO_APP - testl %ebx, %ebx - movl pypy_g_exceptions_MemoryError_vtable, %esi - je .L23140 -.L23064: -.L23067: - movl (%ebx), %eax - xorl %ecx, %ecx - movl pypy_g_exceptions_MemoryError_vtable+4, %ebp - subl %esi, %eax - subl %esi, %ebp - xorl %esi, %esi - cmpl %ebp, %eax - setb %dl -#APP - /* GC_NOCOLLECT pypy_g_ll_issubclass */ -#NO_APP - testb %dl, %dl - je .L23141 -.L23033: -.L23034: - movl 24(%esp), %ebx - movb $1, %dl - testl %ebx, %ebx - je .L23142 - movl %esi, %eax - jmp .L23036 -.L23086: -.L23087: -.L23088: - movl %edi, pypy_g_ExcData+4 - movl pypydtcount, %esi - movl $-1, %edi - movl %ebx, pypy_g_ExcData - movl %edi, pypy_debug_tracebacks(,%esi,8) - movl %ebx, pypy_debug_tracebacks+4(,%esi,8) - incl %esi - andl $127, %esi - movl %esi, pypydtcount -#APP - /* GC_NOCOLLECT pypy_g_RPyReRaiseException */ -#NO_APP - movl $-1, %eax - jmp .L23041 - .p2align 4,,7 -.L23120: - call RPyAbort - movb $120, 12(%esi,%ebx) - incl %ebx - cmpl $3999999, %ebx - jg .L23114 - call RPyAbort - movb $120, 12(%esi,%ebx) - incl %ebx - cmpl $3999999, %ebx - jle .L23120 - jmp .L23114 -.L23142: - xorl %edx, %edx - movl %esi, %eax - jmp .L23036 -.L23059: - call pypy_debug_catch_fatal_exception - jmp .L23058 -.L23140: - call RPyAbort - jmp .L23064 -.L23012: -.L23013: -.L23014: -.L23139: -.L23016: - movl $40000000, (%esp) - call pypy_g_mallocstr__Signed - movl pypy_g_ExcData, %ebx - movl %eax, %edi - testl %ebx, %ebx - jne .L23018 -.L23019: - xorl %ebx, %ebx - testl %eax, %eax - je .L23123 -.L23131: -.L23023: - movb $120, 12(%edi,%ebx) - incl %ebx - cmpl $39999999, %ebx - jle .L23131 -.L23116: - movl pypy_g_ExcData, %ebx - movl %edi, %eax -.L23025: -.L23029: -#APP - /* GCROOT %esi */ -#NO_APP - movl %esi, 24(%esp) - movl %ebp, %edi -#APP - /* GCROOT %edi */ -#NO_APP - testl %ebx, %ebx - jne .L23032 - movl %eax, %ecx - movl %edi, %esi - jmp .L23033 -.L23123: - call RPyAbort - movb $120, 12(%edi,%ebx) - incl %ebx - cmpl $39999999, %ebx - jle .L23123 - jmp .L23116 -.L23022: -.L23018: - movl pypydtcount, %ecx - movl $loc.586, %edx - xorl %edi, %edi - xorl %eax, %eax - movl %edx, pypy_debug_tracebacks(,%ecx,8) - movl %edi, pypy_debug_tracebacks+4(,%ecx,8) - incl %ecx - andl $127, %ecx - movl %ecx, pypydtcount - jmp .L23025 -.L23141: -.L23070: -.L23071: -.L23072: - movl %edi, pypy_g_ExcData+4 - movl pypydtcount, %esi - movl $-1, %edi - movl %ebx, pypy_g_ExcData - movl %edi, pypy_debug_tracebacks(,%esi,8) - movl %ebx, pypy_debug_tracebacks+4(,%esi,8) - incl %esi - andl $127, %esi - movl %esi, pypydtcount -#APP - /* GC_NOCOLLECT pypy_g_RPyReRaiseException */ -#NO_APP - movl $-1, %eax - jmp .L23041 -.L23032: - movl pypydtcount, %ecx - movl $loc.1442, %edx - movl pypy_g_ExcData+4, %ebp - movl %edx, pypy_debug_tracebacks(,%ecx,8) - movl %ebx, pypy_debug_tracebacks+4(,%ecx,8) - incl %ecx - andl $127, %ecx - movl %ecx, pypydtcount - cmpl $pypy_g_py__code_assertion_AssertionError_vtable, %ebx - je .L23043 - cmpl $pypy_g_exceptions_NotImplementedError_vtable, %ebx - je .L23043 -.L23042: -.L23044: - xorl %ecx, %ecx - xorl %eax, %eax - movl %ecx, pypy_g_ExcData+4 - movl %eax, pypy_g_ExcData -#APP - /* keepalive %ebp */ - /* keepalive %esi */ - /* keepalive %edi */ -#NO_APP - testl %ebx, %ebx - movl pypy_g_exceptions_MemoryError_vtable, %esi - je .L23143 -.L23048: -.L23051: - movl (%ebx), %eax - xorl %ecx, %ecx - movl pypy_g_exceptions_MemoryError_vtable+4, %edx - subl %esi, %eax - subl %esi, %edx - cmpl %edx, %eax - movl %edi, %esi - setb %dl -#APP - /* GC_NOCOLLECT pypy_g_ll_issubclass */ -#NO_APP - testb %dl, %dl - jne .L23033 -.L23054: -.L23055: -.L23056: - movl %ebp, pypy_g_ExcData+4 - movl pypydtcount, %edi - movl $-1, %ebp - movl %ebx, pypy_g_ExcData - movl %ebp, pypy_debug_tracebacks(,%edi,8) - movl %ebx, pypy_debug_tracebacks+4(,%edi,8) - incl %edi - andl $127, %edi - movl %edi, pypydtcount -#APP - /* GC_NOCOLLECT pypy_g_RPyReRaiseException */ -#NO_APP - movl $-1, %eax - jmp .L23041 -.L23043: - call pypy_debug_catch_fatal_exception - jmp .L23042 -.L23143: - call RPyAbort - jmp .L23048 - .size pypy_g_f_gc_set_max_heap_size, .-pypy_g_f_gc_set_max_heap_size diff -Nru pypy-7.1.1+dfsg/rpython/translator/c/gcc/test/elf/track12.s pypy-7.3.1+dfsg/rpython/translator/c/gcc/test/elf/track12.s --- pypy-7.1.1+dfsg/rpython/translator/c/gcc/test/elf/track12.s 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/translator/c/gcc/test/elf/track12.s 1970-01-01 00:00:00.000000000 +0000 @@ -1,9 +0,0 @@ - .type pypy_f, @function -pypy_f: - pushl 4(%esp) - call pypy_other - ;; expected {4(%esp) | %ebx, %esi, %edi, %ebp | (%esp)} - popl %eax - /* GCROOT %eax */ - ret - .size pypy_f, .-pypy_f diff -Nru pypy-7.1.1+dfsg/rpython/translator/c/gcc/test/elf/track13.s pypy-7.3.1+dfsg/rpython/translator/c/gcc/test/elf/track13.s --- pypy-7.1.1+dfsg/rpython/translator/c/gcc/test/elf/track13.s 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/translator/c/gcc/test/elf/track13.s 1970-01-01 00:00:00.000000000 +0000 @@ -1,9 +0,0 @@ - .type pypy_f, @function -pypy_f: - call pypy_other - ;; expected {(%esp) | %ebx, %esi, %edi, %ebp | 8(%esp)} - pushl 8(%esp) - popl %eax - /* GCROOT %eax */ - ret - .size pypy_f, .-pypy_f diff -Nru pypy-7.1.1+dfsg/rpython/translator/c/gcc/test/elf/track1.s pypy-7.3.1+dfsg/rpython/translator/c/gcc/test/elf/track1.s --- pypy-7.1.1+dfsg/rpython/translator/c/gcc/test/elf/track1.s 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/translator/c/gcc/test/elf/track1.s 1970-01-01 00:00:00.000000000 +0000 @@ -1,151 +0,0 @@ - .type pypy_g_clear_large_memory_chunk, @function -pypy_g_clear_large_memory_chunk: -.LFB41: - .loc 2 1513 0 - pushl %ebp -.LCFI87: - movl %esp, %ebp -.LCFI88: - subl $72, %esp -.LCFI89: -.L543: - .loc 2 1521 0 - movl $420, 8(%esp) - movl $0, 4(%esp) - movl $pypy_g_array_16, (%esp) - call open - ;; expected {4(%ebp) | %ebx, %esi, %edi, (%ebp) | } - movl %eax, -12(%ebp) - .loc 2 1522 0 - cmpl $-1, -12(%ebp) - setne %al - movb %al, -21(%ebp) - .loc 2 1523 0 - cmpb $0, -21(%ebp) - je .L544 - .loc 2 1524 0 - movl 12(%ebp), %eax - movl %eax, -16(%ebp) - .loc 2 1525 0 - movl 8(%ebp), %eax - movl %eax, -4(%ebp) - .loc 2 1526 0 - jmp .L545 -.L544: - .loc 2 1528 0 - movl 12(%ebp), %eax - movl %eax, -20(%ebp) - .loc 2 1529 0 - movl 8(%ebp), %eax - movl %eax, -8(%ebp) -.L546: - .loc 2 1533 0 - cmpl $0, -20(%ebp) - setg %al - movb %al, -22(%ebp) - .loc 2 1534 0 - cmpb $0, -22(%ebp) - je .L542 -.L549: -.L548: - .loc 2 1544 0 - movl -20(%ebp), %eax - movl %eax, 8(%esp) - movl $0, 4(%esp) - movl -8(%ebp), %eax - movl %eax, (%esp) - call memset - ;; expected {4(%ebp) | %ebx, %esi, %edi, (%ebp) | } - .loc 2 1545 0 - jmp .L542 -.L545: - .loc 2 1548 0 - cmpl $0, -16(%ebp) - setg %al - movb %al, -23(%ebp) - .loc 2 1549 0 - cmpb $0, -23(%ebp) - je .L552 - .loc 2 1550 0 - jmp .L551 -.L552: - .loc 2 1555 0 - movl -12(%ebp), %eax - movl %eax, (%esp) - call close - ;; expected {4(%ebp) | %ebx, %esi, %edi, (%ebp) | } - movl %eax, -36(%ebp) - .loc 2 1556 0 - movl -16(%ebp), %eax - movl %eax, -20(%ebp) - .loc 2 1557 0 - movl -4(%ebp), %eax - movl %eax, -8(%ebp) - .loc 2 1558 0 - jmp .L546 -.L551: - .loc 2 1561 0 - cmpl $536870912, -16(%ebp) - setg %al - movb %al, -24(%ebp) - .loc 2 1562 0 - cmpb $0, -24(%ebp) - je .L555 - .loc 2 1563 0 - movl $536870912, -52(%ebp) - .loc 2 1564 0 - jmp .L554 -.L555: - .loc 2 1569 0 - movl -16(%ebp), %eax - movl %eax, -44(%ebp) - .loc 2 1570 0 - movl -44(%ebp), %eax - movl %eax, -52(%ebp) -.L554: - .loc 2 1574 0 - movl -52(%ebp), %eax - movl %eax, 8(%esp) - movl -4(%ebp), %eax - movl %eax, 4(%esp) - movl -12(%ebp), %eax - movl %eax, (%esp) - call read - ;; expected {4(%ebp) | %ebx, %esi, %edi, (%ebp) | } - movl %eax, -48(%ebp) - .loc 2 1575 0 - movl -48(%ebp), %eax - movl %eax, -32(%ebp) - .loc 2 1576 0 - cmpl $0, -32(%ebp) - setle %al - movb %al, -25(%ebp) - .loc 2 1577 0 - cmpb $0, -25(%ebp) - je .L557 - .loc 2 1578 0 - jmp .L552 -.L557: - .loc 2 1583 0 - movl -32(%ebp), %edx - movl -16(%ebp), %eax - subl %edx, %eax - movl %eax, -40(%ebp) - .loc 2 1584 0 - movl -32(%ebp), %eax - addl -4(%ebp), %eax - movl %eax, -56(%ebp) - .loc 2 1585 0 - movl -40(%ebp), %eax - movl %eax, -16(%ebp) - .loc 2 1586 0 - movl -56(%ebp), %eax - movl %eax, -4(%ebp) - .loc 2 1587 0 - jmp .L545 -.L542: - .loc 2 1588 0 - leave - ret -.LFE41: - .size pypy_g_clear_large_memory_chunk, .-pypy_g_clear_large_memory_chunk diff -Nru pypy-7.1.1+dfsg/rpython/translator/c/gcc/test/elf/track2.s pypy-7.3.1+dfsg/rpython/translator/c/gcc/test/elf/track2.s --- pypy-7.1.1+dfsg/rpython/translator/c/gcc/test/elf/track2.s 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/translator/c/gcc/test/elf/track2.s 1970-01-01 00:00:00.000000000 +0000 @@ -1,183 +0,0 @@ - .type pypy_g_populate, @function -pypy_g_populate: - pushl %esi - pushl %ebx - subl $20, %esp - movl 32(%esp), %esi - movl 36(%esp), %ebx - jmp .L1387 - .p2align 4,,7 -.L1416: -.L1371: -.L1374: - movl $31, 4(%edx) - leal 24(%edx), %eax - movl $pypy_g_pypy_rpython_memory_gc_semispace_SemiSpaceGC, %ecx - movl %eax, 12(%ecx) - movl %edx, %eax -.L1375: -#APP - /* GCROOT %ebx */ -#NO_APP - testl %eax, %eax - je .L1345 -.L1377: - movl $0, 12(%eax) - movl pypy_g_pypy_rpython_memory_gc_semispace_SemiSpaceGC+12, %edx - movl pypy_g_pypy_rpython_memory_gc_semispace_SemiSpaceGC+72, %ecx - movl $pypy_g_pypy_translator_goal_gcbench_Node_vtable, 8(%eax) - movl $0, 16(%eax) - subl %edx, %ecx - cmpl $23, %ecx - movl %eax, 12(%ebx) - jle .L1415 -.L1417: -.L1380: -.L1383: - movl $31, 4(%edx) - leal 24(%edx), %eax - movl $pypy_g_pypy_rpython_memory_gc_semispace_SemiSpaceGC, %ecx - movl %eax, 12(%ecx) - movl %edx, %eax -.L1384: -#APP - /* GCROOT %ebx */ -#NO_APP - testl %eax, %eax - je .L1345 -.L1386: - movl $0, 12(%eax) - movl 12(%ebx), %edx - movl $0, 16(%eax) - movl $pypy_g_pypy_translator_goal_gcbench_Node_vtable, 8(%eax) - movl %eax, 16(%ebx) - movl %edx, 4(%esp) - movl %esi, (%esp) - call pypy_g_populate - ;; expected {28(%esp) | 20(%esp), 24(%esp), %edi, %ebp | %ebx} - movl %ebx, %eax -#APP - /* GCROOT %eax */ -#NO_APP - movl pypy_g_ExcData, %ebx - testl %ebx, %ebx - jne .L1345 -.L1389: - movl 16(%eax), %ebx -.L1387: -.L1346: - testl %esi, %esi - jle .L1345 -.L1349: -.L1350: -.L1351: -.L1352: - call LL_stack_too_big - ;; expected {28(%esp) | 20(%esp), 24(%esp), %edi, %ebp | %ebx} - testl %eax, %eax - jne .L1418 -.L1361: -.L1363: -.L1365: -.L1357: -#APP - /* GCROOT %ebx */ -#NO_APP - movl pypy_g_ExcData, %ecx - testl %ecx, %ecx - jne .L1345 -.L1368: - movl pypy_g_pypy_rpython_memory_gc_semispace_SemiSpaceGC+12, %edx - decl %esi - movl pypy_g_pypy_rpython_memory_gc_semispace_SemiSpaceGC+72, %eax - subl %edx, %eax - cmpl $23, %eax - jg .L1416 -.L1373: -.L1370: -.L1402: - movl $pypy_g_pypy_rpython_memory_gc_semispace_SemiSpaceGC, (%esp) - movl $24, %edx - movl %edx, 4(%esp) - call pypy_g_SemiSpaceGC_try_obtain_free_space - ;; expected {28(%esp) | 20(%esp), 24(%esp), %edi, %ebp | %ebx} - movl pypy_g_ExcData, %edx - xorl %ecx, %ecx - testl %edx, %edx - je .L1419 -.L1404: - xorl %eax, %eax - testl %edx, %edx - jne .L1375 - movl %ecx, %edx - jmp .L1416 -.L1348: -.L1382: - .p2align 4,,7 -.L1415: -.L1379: -.L1390: - movl $pypy_g_pypy_rpython_memory_gc_semispace_SemiSpaceGC, (%esp) - movl $24, %ecx - movl %ecx, 4(%esp) - call pypy_g_SemiSpaceGC_try_obtain_free_space - ;; expected {28(%esp) | 20(%esp), 24(%esp), %edi, %ebp | %ebx} - movl pypy_g_ExcData, %edx - xorl %ecx, %ecx - testl %edx, %edx - je .L1420 -.L1392: - xorl %eax, %eax - testl %edx, %edx - jne .L1384 - movl %ecx, %edx - jmp .L1417 -.L1345: - addl $20, %esp - popl %ebx - popl %esi - ret -.L1356: -.L1355: -.L1358: -.L1359: -.L1360: -.L1418: - movl $pypy_g_exceptions_RuntimeError_vtable, %edx - movl $pypy_g_exceptions_RuntimeError, %eax - movl %edx, pypy_g_ExcData - movl %eax, pypy_g_ExcData+4 - jmp .L1357 -.L1419: -.L1405: - testb %al, %al - je .L1421 -.L1407: - movl pypy_g_pypy_rpython_memory_gc_semispace_SemiSpaceGC+12, %ecx - jmp .L1404 -.L1420: -.L1393: - testb %al, %al - je .L1422 -.L1395: - movl pypy_g_pypy_rpython_memory_gc_semispace_SemiSpaceGC+12, %ecx - jmp .L1392 -.L1408: -.L1409: -.L1421: -.L1410: - movl $pypy_g_exceptions_MemoryError_vtable, %edx - movl $pypy_g_exceptions_MemoryError_1, %eax - movl %edx, pypy_g_ExcData - movl %eax, pypy_g_ExcData+4 - jmp .L1404 -.L1396: -.L1397: -.L1422: -.L1398: - movl $pypy_g_exceptions_MemoryError_vtable, %edx - movl $pypy_g_exceptions_MemoryError_1, %eax - movl %edx, pypy_g_ExcData - movl %eax, pypy_g_ExcData+4 - jmp .L1392 - .size pypy_g_populate, .-pypy_g_populate diff -Nru pypy-7.1.1+dfsg/rpython/translator/c/gcc/test/elf/track3.s pypy-7.3.1+dfsg/rpython/translator/c/gcc/test/elf/track3.s --- pypy-7.1.1+dfsg/rpython/translator/c/gcc/test/elf/track3.s 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/translator/c/gcc/test/elf/track3.s 1970-01-01 00:00:00.000000000 +0000 @@ -1,186 +0,0 @@ - .type pypy_g_populate, @function -pypy_g_populate: - pushl %ebp - movl %esp, %ebp - pushl %esi - pushl %ebx - subl $16, %esp - movl 8(%ebp), %esi - movl 12(%ebp), %ebx - jmp .L1386 - .p2align 4,,7 -.L1415: -.L1370: -.L1373: - movl $31, 4(%edx) - leal 24(%edx), %eax - movl $pypy_g_pypy_rpython_memory_gc_semispace_SemiSpaceGC, %ecx - movl %eax, 12(%ecx) - movl %edx, %eax -.L1374: -#APP - /* GCROOT %ebx */ -#NO_APP - testl %eax, %eax - je .L1344 -.L1376: - movl $0, 12(%eax) - movl pypy_g_pypy_rpython_memory_gc_semispace_SemiSpaceGC+12, %edx - movl pypy_g_pypy_rpython_memory_gc_semispace_SemiSpaceGC+72, %ecx - movl $pypy_g_pypy_translator_goal_gcbench_Node_vtable, 8(%eax) - movl $0, 16(%eax) - subl %edx, %ecx - cmpl $23, %ecx - movl %eax, 12(%ebx) - jle .L1414 -.L1416: -.L1379: -.L1382: - movl $31, 4(%edx) - leal 24(%edx), %eax - movl $pypy_g_pypy_rpython_memory_gc_semispace_SemiSpaceGC, %ecx - movl %eax, 12(%ecx) - movl %edx, %eax -.L1383: -#APP - /* GCROOT %ebx */ -#NO_APP - testl %eax, %eax - je .L1344 -.L1385: - movl $0, 12(%eax) - movl 12(%ebx), %edx - movl $0, 16(%eax) - movl $pypy_g_pypy_translator_goal_gcbench_Node_vtable, 8(%eax) - movl %eax, 16(%ebx) - movl %edx, 4(%esp) - movl %esi, (%esp) - call pypy_g_populate - ;; expected {4(%ebp) | -8(%ebp), -4(%ebp), %edi, (%ebp) | %ebx} - movl %ebx, %eax -#APP - /* GCROOT %eax */ -#NO_APP - movl pypy_g_ExcData, %ebx - testl %ebx, %ebx - jne .L1344 -.L1388: - movl 16(%eax), %ebx -.L1386: -.L1345: - testl %esi, %esi - jle .L1344 -.L1348: -.L1349: -.L1350: -.L1351: - call LL_stack_too_big - ;; expected {4(%ebp) | -8(%ebp), -4(%ebp), %edi, (%ebp) | %ebx} - testl %eax, %eax - jne .L1417 -.L1360: -.L1362: -.L1364: -.L1356: -#APP - /* GCROOT %ebx */ -#NO_APP - movl pypy_g_ExcData, %ecx - testl %ecx, %ecx - jne .L1344 -.L1367: - movl pypy_g_pypy_rpython_memory_gc_semispace_SemiSpaceGC+12, %edx - decl %esi - movl pypy_g_pypy_rpython_memory_gc_semispace_SemiSpaceGC+72, %eax - subl %edx, %eax - cmpl $23, %eax - jg .L1415 -.L1372: -.L1369: -.L1401: - movl $pypy_g_pypy_rpython_memory_gc_semispace_SemiSpaceGC, (%esp) - movl $24, %edx - movl %edx, 4(%esp) - call pypy_g_SemiSpaceGC_try_obtain_free_space - ;; expected {4(%ebp) | -8(%ebp), -4(%ebp), %edi, (%ebp) | %ebx} - movl pypy_g_ExcData, %edx - xorl %ecx, %ecx - testl %edx, %edx - je .L1418 -.L1403: - xorl %eax, %eax - testl %edx, %edx - jne .L1374 - movl %ecx, %edx - jmp .L1415 -.L1347: -.L1381: - .p2align 4,,7 -.L1414: -.L1378: -.L1389: - movl $pypy_g_pypy_rpython_memory_gc_semispace_SemiSpaceGC, (%esp) - movl $24, %ecx - movl %ecx, 4(%esp) - call pypy_g_SemiSpaceGC_try_obtain_free_space - ;; expected {4(%ebp) | -8(%ebp), -4(%ebp), %edi, (%ebp) | %ebx} - movl pypy_g_ExcData, %edx - xorl %ecx, %ecx - testl %edx, %edx - je .L1419 -.L1391: - xorl %eax, %eax - testl %edx, %edx - jne .L1383 - movl %ecx, %edx - jmp .L1416 -.L1344: - addl $16, %esp - popl %ebx - popl %esi - popl %ebp - ret -.L1355: -.L1354: -.L1357: -.L1358: -.L1359: -.L1417: - movl $pypy_g_exceptions_RuntimeError_vtable, %edx - movl $pypy_g_exceptions_RuntimeError, %eax - movl %edx, pypy_g_ExcData - movl %eax, pypy_g_ExcData+4 - jmp .L1356 -.L1418: -.L1404: - testb %al, %al - je .L1420 -.L1406: - movl pypy_g_pypy_rpython_memory_gc_semispace_SemiSpaceGC+12, %ecx - jmp .L1403 -.L1419: -.L1392: - testb %al, %al - je .L1421 -.L1394: - movl pypy_g_pypy_rpython_memory_gc_semispace_SemiSpaceGC+12, %ecx - jmp .L1391 -.L1407: -.L1408: -.L1420: -.L1409: - movl $pypy_g_exceptions_MemoryError_vtable, %edx - movl $pypy_g_exceptions_MemoryError_1, %eax - movl %edx, pypy_g_ExcData - movl %eax, pypy_g_ExcData+4 - jmp .L1403 -.L1395: -.L1396: -.L1421: -.L1397: - movl $pypy_g_exceptions_MemoryError_vtable, %edx - movl $pypy_g_exceptions_MemoryError_1, %eax - movl %edx, pypy_g_ExcData - movl %eax, pypy_g_ExcData+4 - jmp .L1391 - .size pypy_g_populate, .-pypy_g_populate diff -Nru pypy-7.1.1+dfsg/rpython/translator/c/gcc/test/elf/track5.s pypy-7.3.1+dfsg/rpython/translator/c/gcc/test/elf/track5.s --- pypy-7.1.1+dfsg/rpython/translator/c/gcc/test/elf/track5.s 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/translator/c/gcc/test/elf/track5.s 1970-01-01 00:00:00.000000000 +0000 @@ -1,55 +0,0 @@ - .type pypy_g_SemiSpaceGC_scan_copied, @function -pypy_g_SemiSpaceGC_scan_copied: -.L1215: - pushl %esi - pushl %ebx - subl $20, %esp - movl 32(%esp), %esi - movl 36(%esp), %ebx - testl %esi, %esi - jne .L1216 - jmp .L1227 -.L1220: -.L1231: - movl %ebx, 4(%esp) - movl %esi, 8(%esp) - movl %esi, (%esp) - call pypy_g_trace___trace_copy - ;; expected {28(%esp) | 20(%esp), 24(%esp), %edi, %ebp | } - movl %ebx, 4(%esp) - movl %esi, (%esp) - call pypy_g_SemiSpaceGC_get_size - ;; expected {28(%esp) | 20(%esp), 24(%esp), %edi, %ebp | } - addl %eax, %ebx -.L1216: - cmpl 12(%esi), %ebx - jb .L1231 -.L1221: - addl $20, %esp - movl %ebx, %eax - popl %ebx - popl %esi - ret - .p2align 4,,7 -.L1229: - movl %ebx, 4(%esp) - movl %esi, 8(%esp) - movl %esi, (%esp) - call pypy_g_trace___trace_copy - ;; expected {28(%esp) | 20(%esp), 24(%esp), %edi, %ebp | } - movl %ebx, 4(%esp) - movl %esi, (%esp) - call pypy_g_SemiSpaceGC_get_size - ;; expected {28(%esp) | 20(%esp), 24(%esp), %edi, %ebp | } - addl %eax, %ebx - jmp .L1221 -.L1227: - ;;call RPyAbort - cmpl 12(%esi), %ebx - jb .L1229 - addl $20, %esp - movl %ebx, %eax - popl %ebx - popl %esi - ret - .size pypy_g_SemiSpaceGC_scan_copied, .-pypy_g_SemiSpaceGC_scan_copied diff -Nru pypy-7.1.1+dfsg/rpython/translator/c/gcc/test/elf/track7.s pypy-7.3.1+dfsg/rpython/translator/c/gcc/test/elf/track7.s --- pypy-7.1.1+dfsg/rpython/translator/c/gcc/test/elf/track7.s 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/translator/c/gcc/test/elf/track7.s 1970-01-01 00:00:00.000000000 +0000 @@ -1,19 +0,0 @@ - .type main1, @function -main1: - ;; cmovCOND tests. - pushl %ebx - movl 12(%esp), %ebx - cmove 16(%esp), %ebx - cmovge 20(%esp), %ebx - movl 24(%esp), %eax - cmovs %eax, %ebx - ;; and an indirect call while we're at it - call *(%eax) - ;; expected {4(%esp) | (%esp), %esi, %edi, %ebp | %ebx} -#APP - /* GCROOT %ebx */ -#NO_APP - popl %ebx - ret - - .size main1, .-main1 diff -Nru pypy-7.1.1+dfsg/rpython/translator/c/gcc/test/elf/track8.s pypy-7.3.1+dfsg/rpython/translator/c/gcc/test/elf/track8.s --- pypy-7.1.1+dfsg/rpython/translator/c/gcc/test/elf/track8.s 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/translator/c/gcc/test/elf/track8.s 1970-01-01 00:00:00.000000000 +0000 @@ -1,217 +0,0 @@ - .type pypy_g_foo, @function -pypy_g_foo: -.L1780: - subl $76, %esp - movl 80(%esp), %ecx - movl %esi, 64(%esp) - movl 104(%esp), %esi - testl %ecx, %ecx - movl %ebp, 72(%esp) - movl 100(%esp), %ebp - movl %ebx, 60(%esp) - movl %edi, 68(%esp) - jle .L1779 -.L1783: -.L1782: -.L1784: - movl _LLstacktoobig_stack_base_pointer, %edx - leal 59(%esp), %eax - xorl %ebx, %ebx - subl %edx, %eax - cmpl _LLstacktoobig_stack_min, %eax - jl .L1786 - cmpl _LLstacktoobig_stack_max, %eax - jg .L1786 -.L1787: - testl %ebx, %ebx - jne .L1830 -.L1795: -.L1797: -.L1799: -.L1791: - movl pypy_g_ExcData, %eax - testl %eax, %eax - je .L1831 -.L1779: - movl 60(%esp), %ebx - movl 64(%esp), %esi - movl 68(%esp), %edi - movl 72(%esp), %ebp - addl $76, %esp - ret - .p2align 4,,7 -.L1786: - call LL_stack_too_big_slowpath - ;; expected {76(%esp) | 60(%esp), 64(%esp), 68(%esp), 72(%esp) | %esi, %ebp, 84(%esp), 88(%esp), 92(%esp), 96(%esp)} - testl %eax, %eax - je .L1787 - movl $1, %ebx - jmp .L1787 - .p2align 4,,7 -.L1831: -.L1802: - movl pypy_g_pypy_rpython_memory_gc_semispace_SemiSpaceGC+12, %edx - movl pypy_g_pypy_rpython_memory_gc_semispace_SemiSpaceGC+80, %ecx - subl %edx, %ecx - cmpl $7, %ecx - jle .L1804 -.L1829: -.L1805: -.L1808: - movl $4, (%edx) - movl %edx, %edi - movl $pypy_g_pypy_rpython_memory_gc_semispace_SemiSpaceGC, %ebx - leal 8(%edx), %edx - movl %edx, 12(%ebx) - movl %edi, %ebx -.L1809: - movl %esi, %edi - movl 84(%esp), %eax - movl 88(%esp), %esi -#APP - /* GCROOT %eax */ - /* GCROOT %edi */ -#NO_APP - movl %eax, 48(%esp) - movl 96(%esp), %eax -#APP - /* GCROOT %esi */ - /* GCROOT %eax */ - /* GCROOT %ebp */ -#NO_APP - movl %eax, 44(%esp) - movl 92(%esp), %eax -#APP - /* GCROOT %eax */ -#NO_APP - movl %eax, 40(%esp) - testl %ebx, %ebx - je .L1779 -.L1811: - movl $pypy_g_src8_A_vtable, 4(%ebx) - movl 80(%esp), %eax - movl %ebx, 24(%esp) - movl %ebx, 20(%esp) - decl %eax - movl %eax, 52(%esp) - movl %ebx, 16(%esp) - movl %ebx, 12(%esp) - movl %ebx, 8(%esp) - movl %ebx, 4(%esp) - movl %eax, (%esp) - call pypy_g_foo - ;; expected {76(%esp) | 60(%esp), 64(%esp), 68(%esp), 72(%esp) | %ebx, %esi, %edi, %ebp, 40(%esp), 44(%esp), 48(%esp)} - movl pypy_g_ExcData, %ecx -#APP - /* GCROOT %esi */ - /* GCROOT %edi */ -#NO_APP - movl %esi, 36(%esp) - movl 48(%esp), %eax - movl 40(%esp), %esi -#APP - /* GCROOT %eax */ - /* GCROOT %ebp */ -#NO_APP - movl %eax, 32(%esp) - movl %ebx, %eax - movl 44(%esp), %ebx -#APP - /* GCROOT %eax */ - /* GCROOT %ebx */ - /* GCROOT %esi */ -#NO_APP - testl %ecx, %ecx - jne .L1779 -.L1814: - movl %eax, 24(%esp) - movl 52(%esp), %edx - movl %eax, 20(%esp) - movl %eax, 16(%esp) - movl %eax, 12(%esp) - movl %eax, 8(%esp) - movl %eax, 4(%esp) - movl %edx, (%esp) - call pypy_g_foo - ;; expected {76(%esp) | 60(%esp), 64(%esp), 68(%esp), 72(%esp) | %ebx, %esi, %edi, %ebp, 32(%esp), 36(%esp)} - movl %esi, %eax - movl pypy_g_ExcData, %esi -#APP - /* GCROOT %edi */ -#NO_APP - movl %edi, 28(%esp) - movl 32(%esp), %edx -#APP - /* GCROOT %ebp */ -#NO_APP - movl 36(%esp), %edi -#APP - /* GCROOT %edx */ - /* GCROOT %edi */ -#NO_APP - movl %ebx, %ecx -#APP - /* GCROOT %eax */ - /* GCROOT %ecx */ -#NO_APP - testl %esi, %esi - jne .L1779 -.L1816: - movl %edi, 20(%esp) - movl 28(%esp), %edi - movl %ebp, 8(%esp) - movl 52(%esp), %ebp - movl %edx, 24(%esp) - movl %eax, 16(%esp) - movl %ecx, 12(%esp) - movl %edi, 4(%esp) - movl %ebp, (%esp) - call pypy_g_foo - ;; expected {76(%esp) | 60(%esp), 64(%esp), 68(%esp), 72(%esp) | } - jmp .L1779 -.L1807: - .p2align 4,,7 -.L1804: -.L1817: - movl $pypy_g_pypy_rpython_memory_gc_semispace_SemiSpaceGC, (%esp) - movl $8, %ebx - movl %ebx, 4(%esp) - call pypy_g_SemiSpaceGC_try_obtain_free_space - ;; expected {76(%esp) | 60(%esp), 64(%esp), 68(%esp), 72(%esp) | %esi, %ebp, 84(%esp), 88(%esp), 92(%esp), 96(%esp)} - movl pypy_g_ExcData, %ecx - xorl %edx, %edx - testl %ecx, %ecx - je .L1832 -.L1819: - xorl %ebx, %ebx - testl %ecx, %ecx - jne .L1809 - jmp .L1829 -.L1790: -.L1789: -.L1792: -.L1793: -.L1830: -.L1794: - movl $pypy_g_exceptions_RuntimeError_vtable, %edi - movl $pypy_g_exceptions_RuntimeError, %ebx - movl %edi, pypy_g_ExcData - movl %ebx, pypy_g_ExcData+4 - jmp .L1791 -.L1832: -.L1820: - testb %al, %al - je .L1833 -.L1822: - movl pypy_g_pypy_rpython_memory_gc_semispace_SemiSpaceGC+12, %edx - jmp .L1819 -.L1833: -.L1823: -.L1824: -.L1825: - movl $pypy_g_exceptions_MemoryError_vtable, %ecx - movl $pypy_g_exceptions_MemoryError_1, %eax - movl %ecx, pypy_g_ExcData - movl %eax, pypy_g_ExcData+4 - jmp .L1819 - .size pypy_g_foo, .-pypy_g_foo diff -Nru pypy-7.1.1+dfsg/rpython/translator/c/gcc/test/elf/track9.s pypy-7.3.1+dfsg/rpython/translator/c/gcc/test/elf/track9.s --- pypy-7.1.1+dfsg/rpython/translator/c/gcc/test/elf/track9.s 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/translator/c/gcc/test/elf/track9.s 1970-01-01 00:00:00.000000000 +0000 @@ -1,23 +0,0 @@ - .type pypy_g_stuff, @function -pypy_g_stuff: -.LFB41: - .loc 2 1513 0 - pushl %ebp -.LCFI87: - movl %esp, %ebp -.LCFI88: - subl $72, %esp -.LCFI89: -.L543: - .loc 2 1521 0 - movl $420, 8(%esp) - movl $0, 4(%esp) - movl $pypy_g_array_16, (%esp) - call open - /* GC_NOCOLLECT open */ -.L542: - .loc 2 1588 0 - leave - ret -.LFE41: - .size pypy_g_stuff, .-pypy_g_stuff diff -Nru pypy-7.1.1+dfsg/rpython/translator/c/gcc/test/elf/track_odd_esp.s pypy-7.3.1+dfsg/rpython/translator/c/gcc/test/elf/track_odd_esp.s --- pypy-7.1.1+dfsg/rpython/translator/c/gcc/test/elf/track_odd_esp.s 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/translator/c/gcc/test/elf/track_odd_esp.s 1970-01-01 00:00:00.000000000 +0000 @@ -1,97 +0,0 @@ - .type pypy_g_copy_flags_from_bases, @function -pypy_g_copy_flags_from_bases: -.LFB188: - .cfi_startproc - pushl %ebp - .cfi_def_cfa_offset 8 - .cfi_offset 5, -8 - xorl %edx, %edx - pushl %edi - .cfi_def_cfa_offset 12 - .cfi_offset 7, -12 - pushl %esi - .cfi_def_cfa_offset 16 - .cfi_offset 6, -16 - pushl %ebx - .cfi_def_cfa_offset 20 - .cfi_offset 3, -20 - subl $1, %esp - .cfi_def_cfa_offset 21 - movl 21(%esp), %ebx - movb $0, (%esp) - movl 16(%ebx), %ebp - movl 4(%ebp), %edi - .p2align 4,,7 - .p2align 3 -.L572: - cmpl %edi, %edx - jge .L573 -.L590: -.L574: - addl $1, %edx - movl 4(%ebp,%edx,4), %ecx - testl %ecx, %ecx - je .L585 -.L576: - movl 4(%ecx), %esi - movl (%esi), %esi - subl $404, %esi - cmpl $10, %esi - ja .L585 -.L577: - cmpb $0, 443(%ebx) - movl $1, %esi - jne .L578 -.L579: - movzbl 443(%ecx), %esi -.L578: - cmpb $0, 444(%ebx) - movl %esi, %eax - movb %al, 443(%ebx) - movl $1, %esi - jne .L580 -.L581: - movzbl 444(%ecx), %esi -.L580: - cmpb $0, 446(%ebx) - movl %esi, %eax - movb %al, 444(%ebx) - movl $1, %esi - jne .L582 -.L583: - movzbl 446(%ecx), %esi -.L582: - movl %esi, %eax - cmpl %edi, %edx - movb %al, 446(%ebx) - jl .L590 -.L573: - movl 25(%esp), %edx - movzbl (%esp), %eax - movl 420(%edx), %edx - movl %edx, 420(%ebx) - addl $1, %esp - .cfi_remember_state - .cfi_def_cfa_offset 20 - popl %ebx - .cfi_restore 3 - .cfi_def_cfa_offset 16 - popl %esi - .cfi_restore 6 - .cfi_def_cfa_offset 12 - popl %edi - .cfi_restore 7 - .cfi_def_cfa_offset 8 - popl %ebp - .cfi_restore 5 - .cfi_def_cfa_offset 4 - ret - .p2align 4,,7 - .p2align 3 -.L585: - .cfi_restore_state - movb $1, (%esp) - jmp .L572 - .cfi_endproc -.LFE188: - .size pypy_g_copy_flags_from_bases, .-pypy_g_copy_flags_from_bases diff -Nru pypy-7.1.1+dfsg/rpython/translator/c/gcc/test/elf/track_tailcall0.s pypy-7.3.1+dfsg/rpython/translator/c/gcc/test/elf/track_tailcall0.s --- pypy-7.1.1+dfsg/rpython/translator/c/gcc/test/elf/track_tailcall0.s 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/translator/c/gcc/test/elf/track_tailcall0.s 1970-01-01 00:00:00.000000000 +0000 @@ -1,8 +0,0 @@ - .type pypy_g_BuiltinActivation_UwS_ObjSpace__run, @function -pypy_g_BuiltinActivation_UwS_ObjSpace__run: -.L462: - movl 4(%esp), %eax - movl 8(%eax), %ecx - jmp *%ecx -.L463: - .size pypy_g_BuiltinActivation_UwS_ObjSpace__run, .-pypy_g_BuiltinActivation_UwS_ObjSpace__run diff -Nru pypy-7.1.1+dfsg/rpython/translator/c/gcc/test/elf64/track_32bit_reg_zeroextend.s pypy-7.3.1+dfsg/rpython/translator/c/gcc/test/elf64/track_32bit_reg_zeroextend.s --- pypy-7.1.1+dfsg/rpython/translator/c/gcc/test/elf64/track_32bit_reg_zeroextend.s 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/translator/c/gcc/test/elf64/track_32bit_reg_zeroextend.s 1970-01-01 00:00:00.000000000 +0000 @@ -1,15 +0,0 @@ - .type foobar, @function -foobar: - pushq %rbp - movq %rsp, %rbp - call some_function - ;; expected {8(%rbp) | %rbx, %r12, %r13, %r14, %r15, (%rbp) | } - movl $const1, %edx - movl $const2, %r10d - xorl %r10d, %r11d - /* GCROOT %rdx */ - /* GCROOT %r10 */ - /* GCROOT %r11 */ - leave - ret - .size foobar, .-foobar diff -Nru pypy-7.1.1+dfsg/rpython/translator/c/gcc/test/elf64/track_basic_argument_registers.s pypy-7.3.1+dfsg/rpython/translator/c/gcc/test/elf64/track_basic_argument_registers.s --- pypy-7.1.1+dfsg/rpython/translator/c/gcc/test/elf64/track_basic_argument_registers.s 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/translator/c/gcc/test/elf64/track_basic_argument_registers.s 1970-01-01 00:00:00.000000000 +0000 @@ -1,32 +0,0 @@ - .type foobar, @function -foobar: -.LFB0: - .cfi_startproc - pushq %rbp - .cfi_def_cfa_offset 16 - movq %rsp, %rbp - .cfi_offset 6, -16 - .cfi_def_cfa_register 6 - subq $48, %rsp - movq %rdi, -8(%rbp) - movq %rsi, -16(%rbp) - movq %rdx, -24(%rbp) - movq %rcx, -32(%rbp) - movq %r8, -40(%rbp) - movq %r9, -48(%rbp) - movl $0, %eax - call some_function - ;; expected {8(%rbp) | %rbx, %r12, %r13, %r14, %r15, (%rbp) | -8(%rbp), -16(%rbp), -24(%rbp), -32(%rbp), -40(%rbp), -48(%rbp)} - /* GCROOT -8(%rbp) */ - /* GCROOT -16(%rbp) */ - /* GCROOT -24(%rbp) */ - /* GCROOT -32(%rbp) */ - /* GCROOT -40(%rbp) */ - /* GCROOT -48(%rbp) */ - movq -24(%rbp), %rax - leave - ; try out a "rep ret" instead of just a "ret", for bad reasons - rep ret - .cfi_endproc -.LFE0: - .size foobar, .-foobar diff -Nru pypy-7.1.1+dfsg/rpython/translator/c/gcc/test/elf64/track_jumptable.c pypy-7.3.1+dfsg/rpython/translator/c/gcc/test/elf64/track_jumptable.c --- pypy-7.1.1+dfsg/rpython/translator/c/gcc/test/elf64/track_jumptable.c 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/translator/c/gcc/test/elf64/track_jumptable.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,18 +0,0 @@ -#include <stdio.h> - -int foobar(int n) { - switch(n) { - case 0: - return 1; - case 1: - return 12; - case 2: - return 123; - case 3: - return 1234; - case 4: - return 12345; - default: - return 42; - } -} diff -Nru pypy-7.1.1+dfsg/rpython/translator/c/gcc/test/elf64/track_jumptable.s pypy-7.3.1+dfsg/rpython/translator/c/gcc/test/elf64/track_jumptable.s --- pypy-7.1.1+dfsg/rpython/translator/c/gcc/test/elf64/track_jumptable.s 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/translator/c/gcc/test/elf64/track_jumptable.s 1970-01-01 00:00:00.000000000 +0000 @@ -1,48 +0,0 @@ - .type foobar, @function -foobar: -.LFB0: - .cfi_startproc - pushq %rbp - .cfi_def_cfa_offset 16 - movq %rsp, %rbp - .cfi_offset 6, -16 - .cfi_def_cfa_register 6 - movl %edi, -4(%rbp) - cmpl $4, -4(%rbp) - ja .L2 - mov -4(%rbp), %eax - movq .L8(,%rax,8), %rax - jmp *%rax - .section .rodata - .align 8 - .align 4 -.L8: - .quad .L3 - .quad .L4 - .quad .L5 - .quad .L6 - .quad .L7 - .text -.L3: - movl $1, %eax - jmp .L9 -.L4: - movl $12, %eax - jmp .L9 -.L5: - movl $123, %eax - jmp .L9 -.L6: - movl $1234, %eax - jmp .L9 -.L7: - movl $12345, %eax - jmp .L9 -.L2: - movl $42, %eax -.L9: - leave - ret - .cfi_endproc -.LFE0: - .size foobar, .-foobar diff -Nru pypy-7.1.1+dfsg/rpython/translator/c/gcc/test/elf64/track_loadconst.s pypy-7.3.1+dfsg/rpython/translator/c/gcc/test/elf64/track_loadconst.s --- pypy-7.1.1+dfsg/rpython/translator/c/gcc/test/elf64/track_loadconst.s 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/translator/c/gcc/test/elf64/track_loadconst.s 1970-01-01 00:00:00.000000000 +0000 @@ -1,12 +0,0 @@ - .type pypy_g_handler_inline_call_r_v_1, @function -pypy_g_handler_inline_call_r_v_1: - pushq %rbp - call foo_bar - ;; expected {8(%rsp) | %rbx, %r12, %r13, %r14, %r15, (%rsp) | } - movl $pypy_g_some_prebuilt_gc_object, %ebp - call bar_baz - ;; expected {8(%rsp) | %rbx, %r12, %r13, %r14, %r15, (%rsp) | %rbp} - /* GCROOT %rbp */ - popq %rbp - ret - .size pypy_g_handler_inline_call_r_v_1, .-pypy_g_handler_inline_call_r_v_1 diff -Nru pypy-7.1.1+dfsg/rpython/translator/c/gcc/test/elf64/track_negative_rsp_offset.s pypy-7.3.1+dfsg/rpython/translator/c/gcc/test/elf64/track_negative_rsp_offset.s --- pypy-7.1.1+dfsg/rpython/translator/c/gcc/test/elf64/track_negative_rsp_offset.s 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/translator/c/gcc/test/elf64/track_negative_rsp_offset.s 1970-01-01 00:00:00.000000000 +0000 @@ -1,17 +0,0 @@ - .type some_function, @function -some_function: - ;; Test using a negative offset from %rsp (gcc sometimes does this) - movq %rbx, -8(%rsp) - subq $8, %rsp - - movq %rdi, %rbx - - call some_other_function - ;; expected {8(%rsp) | (%rsp), %r12, %r13, %r14, %r15, %rbp | %rbx} - /* GCROOT %rbx */ - - movq %rbx, %rax - ;; Same as where %rbx was saved above - movq (%rsp), %rbx - ret - .size some_function, .-some_function diff -Nru pypy-7.1.1+dfsg/rpython/translator/c/gcc/test/elf64/track_random_rsp_rbp.s pypy-7.3.1+dfsg/rpython/translator/c/gcc/test/elf64/track_random_rsp_rbp.s --- pypy-7.1.1+dfsg/rpython/translator/c/gcc/test/elf64/track_random_rsp_rbp.s 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/translator/c/gcc/test/elf64/track_random_rsp_rbp.s 1970-01-01 00:00:00.000000000 +0000 @@ -1,158 +0,0 @@ - .type seterror.part.1, @function -seterror.part.1: -.LFB77: - .cfi_startproc - pushq %r14 - .cfi_def_cfa_offset 16 - .cfi_offset 14, -16 - pushq %r13 - .cfi_def_cfa_offset 24 - .cfi_offset 13, -24 - pushq %r12 - .cfi_def_cfa_offset 32 - .cfi_offset 12, -32 - pushq %rbp - .cfi_def_cfa_offset 40 - .cfi_offset 6, -40 - pushq %rbx - .cfi_def_cfa_offset 48 - .cfi_offset 3, -48 - subq $512, %rsp - .cfi_def_cfa_offset 560 - testq %r8, %r8 - je .L30 -.L11: - movq PyPyExc_TypeError@GOTPCREL(%rip), %rax - movq %r8, %rsi - movq (%rax), %rdi - call PyPyErr_SetString@PLT - ;; expected {552(%rsp) | 512(%rsp), 528(%rsp), 536(%rsp), 544(%rsp), %r15, 520(%rsp) | } - addq $512, %rsp - .cfi_remember_state - .cfi_def_cfa_offset 48 - popq %rbx - .cfi_def_cfa_offset 40 - popq %rbp - .cfi_def_cfa_offset 32 - popq %r12 - .cfi_def_cfa_offset 24 - popq %r13 - .cfi_def_cfa_offset 16 - popq %r14 - .cfi_def_cfa_offset 8 - ret - .p2align 4,,10 - .p2align 3 -.L30: - .cfi_restore_state - testq %rcx, %rcx - movq %rsi, %r12 - movl %edi, %r14d - movq %rdx, %r13 - movq %rsp, %rbp - movl $512, %esi - movq %rsp, %rbx - je .L13 - leaq .LC6(%rip), %rdx - movl $512, %esi - movq %rsp, %rdi - xorl %eax, %eax - movq %rsp, %rbx - call PyPyOS_snprintf@PLT - ;; expected {552(%rsp) | 512(%rsp), 528(%rsp), 536(%rsp), 544(%rsp), %r15, 520(%rsp) | } -.L14: - movl (%rbx), %eax - addq $4, %rbx - leal -16843009(%rax), %esi - notl %eax - andl %eax, %esi - andl $-2139062144, %esi - je .L14 - movl %esi, %eax - shrl $16, %eax - testl $32896, %esi - cmove %eax, %esi - leaq 2(%rbx), %rax - cmove %rax, %rbx - addb %sil, %sil - movq %rbp, %rsi - sbbq $3, %rbx - subq %rbx, %rsi - addq $512, %rsi -.L13: - testl %r14d, %r14d - je .L16 - leaq .LC7(%rip), %rdx - movq %rbx, %rdi - movl %r14d, %ecx - xorl %eax, %eax - call PyPyOS_snprintf@PLT - ;; expected {552(%rsp) | 512(%rsp), 528(%rsp), 536(%rsp), 544(%rsp), %r15, 520(%rsp) | } - movq %rbx, %rdi - call strlen@PLT - ;; expected {552(%rsp) | 512(%rsp), 528(%rsp), 536(%rsp), 544(%rsp), %r15, 520(%rsp) | } - addq %rax, %rbx - movl 0(%r13), %eax - testl %eax, %eax - jle .L18 - movq %rbx, %rdx - subq %rbp, %rdx - cmpl $219, %edx - jg .L18 - addq $4, %r13 - xorl %r14d, %r14d - .p2align 4,,10 - .p2align 3 -.L21: - movq %rbp, %rsi - leal -1(%rax), %ecx - leaq .LC8(%rip), %rdx - subq %rbx, %rsi - movq %rbx, %rdi - xorl %eax, %eax - addq $512, %rsi - addl $1, %r14d - call PyPyOS_snprintf@PLT - ;; expected {552(%rsp) | 512(%rsp), 528(%rsp), 536(%rsp), 544(%rsp), %r15, 520(%rsp) | } - movq %rbx, %rdi - call strlen@PLT - ;; expected {552(%rsp) | 512(%rsp), 528(%rsp), 536(%rsp), 544(%rsp), %r15, 520(%rsp) | } - addq %rax, %rbx - movl 0(%r13), %eax - testl %eax, %eax - jle .L18 - cmpl $32, %r14d - je .L18 - movq %rbx, %rdx - addq $4, %r13 - subq %rbp, %rdx - cmpl $219, %edx - jle .L21 - jmp .L18 - .p2align 4,,10 - .p2align 3 -.L16: - leaq .LC9(%rip), %rdx - movq %rbx, %rdi - xorl %eax, %eax - call PyPyOS_snprintf@PLT - ;; expected {552(%rsp) | 512(%rsp), 528(%rsp), 536(%rsp), 544(%rsp), %r15, 520(%rsp) | } - movq %rbx, %rdi - call strlen@PLT - ;; expected {552(%rsp) | 512(%rsp), 528(%rsp), 536(%rsp), 544(%rsp), %r15, 520(%rsp) | } - addq %rax, %rbx -.L18: - movq %rbp, %rsi - leaq .LC10(%rip), %rdx - movq %r12, %rcx - subq %rbx, %rsi - movq %rbx, %rdi - xorl %eax, %eax - addq $512, %rsi - call PyPyOS_snprintf@PLT - ;; expected {552(%rsp) | 512(%rsp), 528(%rsp), 536(%rsp), 544(%rsp), %r15, 520(%rsp) | } - movq %rbp, %r8 - jmp .L11 - .cfi_endproc -.LFE77: - .size seterror.part.1, .-seterror.part.1 diff -Nru pypy-7.1.1+dfsg/rpython/translator/c/gcc/test/elf64/track_rpyassertfailed.s pypy-7.3.1+dfsg/rpython/translator/c/gcc/test/elf64/track_rpyassertfailed.s --- pypy-7.1.1+dfsg/rpython/translator/c/gcc/test/elf64/track_rpyassertfailed.s 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/translator/c/gcc/test/elf64/track_rpyassertfailed.s 1970-01-01 00:00:00.000000000 +0000 @@ -1,16 +0,0 @@ - .type pypy_g_handler_inline_call_r_v_1, @function -pypy_g_handler_inline_call_r_v_1: -.L10041: - pushq %r15 - movq 8(%rsi), %r15 - call foo_bar - ;; expected {8(%rsp) | %rbx, %r12, %r13, %r14, (%rsp), %rbp | %r15} - testq %rax, %rax - jne .L10088 - movq (%ebp), %r15 - call RPyAssertFailed -.L10088: - /* GCROOT %r15 */ - popq %r15 - ret - .size pypy_g_handler_inline_call_r_v_1, .-pypy_g_handler_inline_call_r_v_1 diff -Nru pypy-7.1.1+dfsg/rpython/translator/c/gcc/test/elf64/track_varargs_function.s pypy-7.3.1+dfsg/rpython/translator/c/gcc/test/elf64/track_varargs_function.s --- pypy-7.1.1+dfsg/rpython/translator/c/gcc/test/elf64/track_varargs_function.s 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/translator/c/gcc/test/elf64/track_varargs_function.s 1970-01-01 00:00:00.000000000 +0000 @@ -1,58 +0,0 @@ - .type PyErr_Format, @function -PyErr_Format: -.LFB67: - .cfi_startproc - pushq %rbp - .cfi_def_cfa_offset 16 - movzbl %al, %eax - pushq %rbx - .cfi_def_cfa_offset 24 - movq %rdi, %rbx - .cfi_offset 3, -24 - .cfi_offset 6, -16 - movq %rsi, %rdi - subq $216, %rsp - .cfi_def_cfa_offset 240 - movq %rdx, 48(%rsp) - leaq 0(,%rax,4), %rdx - movl $.L21, %eax - movq %rcx, 56(%rsp) - movq %r8, 64(%rsp) - movq %rsp, %rsi - subq %rdx, %rax - leaq 207(%rsp), %rdx - movq %r9, 72(%rsp) - jmp *%rax - movaps %xmm7, -15(%rdx) - movaps %xmm6, -31(%rdx) - movaps %xmm5, -47(%rdx) - movaps %xmm4, -63(%rdx) - movaps %xmm3, -79(%rdx) - movaps %xmm2, -95(%rdx) - movaps %xmm1, -111(%rdx) - movaps %xmm0, -127(%rdx) -.L21: - leaq 240(%rsp), %rax - movl $16, (%rsp) - movl $48, 4(%rsp) - movq %rax, 8(%rsp) - leaq 32(%rsp), %rax - movq %rax, 16(%rsp) - call PyString_FromFormatV - ;; expected {232(%rsp) | 216(%rsp), %r12, %r13, %r14, %r15, 224(%rsp) | } - movq %rbx, %rdi - movq %rax, %rbp - movq %rax, %rsi - call PyErr_SetObject - ;; expected {232(%rsp) | 216(%rsp), %r12, %r13, %r14, %r15, 224(%rsp) | } - movq %rbp, %rdi - call Py_DecRef - ;; expected {232(%rsp) | 216(%rsp), %r12, %r13, %r14, %r15, 224(%rsp) | } - addq $216, %rsp - xorl %eax, %eax - popq %rbx - popq %rbp - ret - .cfi_endproc -.LFE67: - .size PyErr_Format, .-PyErr_Format diff -Nru pypy-7.1.1+dfsg/rpython/translator/c/gcc/test/elf64/track_zero_2.s pypy-7.3.1+dfsg/rpython/translator/c/gcc/test/elf64/track_zero_2.s --- pypy-7.1.1+dfsg/rpython/translator/c/gcc/test/elf64/track_zero_2.s 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/translator/c/gcc/test/elf64/track_zero_2.s 1970-01-01 00:00:00.000000000 +0000 @@ -1,18 +0,0 @@ - .type pypy_g_do_call_1, @function -pypy_g_do_call_1: - pushq %rbx - pushq %r12 - movq %rdi, %rbx - movq %rsi, %r12 - call number1 - ;; expected {16(%rsp) | 8(%rsp), (%rsp), %r13, %r14, %r15, %rbp | %rbx, %r12} - testq %rbx, %rbx - je .L1 - movq (%rax), %r12 -.L1: - /* GCROOT %rbx */ - /* GCROOT %r12 */ - popq %r12 - popq %rbx - ret - .size pypy_g_do_call_1, .-pypy_g_do_call_1 diff -Nru pypy-7.1.1+dfsg/rpython/translator/c/gcc/test/elf64/track_zero_3.s pypy-7.3.1+dfsg/rpython/translator/c/gcc/test/elf64/track_zero_3.s --- pypy-7.1.1+dfsg/rpython/translator/c/gcc/test/elf64/track_zero_3.s 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/translator/c/gcc/test/elf64/track_zero_3.s 1970-01-01 00:00:00.000000000 +0000 @@ -1,14 +0,0 @@ - .type pypy_g_do_call_1, @function -pypy_g_do_call_1: - pushq %rbx - movq %rdi, %rbx - call number1 - ;; expected {8(%rsp) | (%rsp), %r12, %r13, %r14, %r15, %rbp | %rbx} - testq %rax, %rax - je .L1 - call RPyAssertFailed -.L1: - /* GCROOT %rbx */ - popq %rbx - ret - .size pypy_g_do_call_1, .-pypy_g_do_call_1 diff -Nru pypy-7.1.1+dfsg/rpython/translator/c/gcc/test/elf64/track_zero_4.s pypy-7.3.1+dfsg/rpython/translator/c/gcc/test/elf64/track_zero_4.s --- pypy-7.1.1+dfsg/rpython/translator/c/gcc/test/elf64/track_zero_4.s 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/translator/c/gcc/test/elf64/track_zero_4.s 1970-01-01 00:00:00.000000000 +0000 @@ -1,18 +0,0 @@ - .type pypy_g_do_call_1, @function -pypy_g_do_call_1: - pushq %rbx - pushq %r12 - movq %rdi, %rbx - movq %rsi, %r12 - call number1 - ;; expected {16(%rsp) | 8(%rsp), (%rsp), %r13, %r14, %r15, %rbp | %r12} - testq %rbx, %rbx - movq %r12, %rbx - je .L1 - movq (%rax), %rbx -.L1: - /* GCROOT %rbx */ - popq %r12 - popq %rbx - ret - .size pypy_g_do_call_1, .-pypy_g_do_call_1 diff -Nru pypy-7.1.1+dfsg/rpython/translator/c/gcc/test/elf64/track_zero.s pypy-7.3.1+dfsg/rpython/translator/c/gcc/test/elf64/track_zero.s --- pypy-7.1.1+dfsg/rpython/translator/c/gcc/test/elf64/track_zero.s 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/translator/c/gcc/test/elf64/track_zero.s 1970-01-01 00:00:00.000000000 +0000 @@ -1,18 +0,0 @@ - .type pypy_g_do_call_1, @function -pypy_g_do_call_1: - pushq %rbx - pushq %r12 - movq %rdi, %rbx - movq %rsi, %r12 - call number1 - ;; expected {16(%rsp) | 8(%rsp), (%rsp), %r13, %r14, %r15, %rbp | %r12} - testq %rbx, %rbx ; here rbx is an integer, not a gc ref - je .L1 ; if rbx==0, jump to L1, where rbx==NULLGCREF - movq (%rax), %rbx ; else load a gc ref -.L1: - /* GCROOT %rbx */ - /* GCROOT %r12 */ - popq %r12 - popq %rbx - ret - .size pypy_g_do_call_1, .-pypy_g_do_call_1 diff -Nru pypy-7.1.1+dfsg/rpython/translator/c/gcc/test/msvc/track0.s pypy-7.3.1+dfsg/rpython/translator/c/gcc/test/msvc/track0.s --- pypy-7.1.1+dfsg/rpython/translator/c/gcc/test/msvc/track0.s 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/translator/c/gcc/test/msvc/track0.s 1970-01-01 00:00:00.000000000 +0000 @@ -1,277 +0,0 @@ -; Function compile flags: /Ogtpy -; COMDAT _pypy_g_ll_join_strs__Signed_arrayPtr -_TEXT SEGMENT -_l_result_2$ = -8 ; size = 4 -_l_v405$ = -4 ; size = 4 -_l_num_items_0$ = 8 ; size = 4 -_l_items_2$ = 12 ; size = 4 -_pypy_g_ll_join_strs__Signed_arrayPtr PROC ; COMDAT - -; 1457 : struct pypy_rpy_string0 *pypy_g_ll_join_strs__Signed_arrayPtr(long l_num_items_0, struct pypy_array0 *l_items_2) { - - sub esp, 8 - push ebx - push ebp - push esi - -; 1458 : long l_i_22; long l_i_23; long l_res_index_0; -; 1459 : struct pypy_rpy_string0 *l_result_2; bool_t l_v403; bool_t l_v404; -; 1460 : bool_t l_v409; bool_t l_v410; bool_t l_v411; long l_v402; -; 1461 : long l_v414; long l_v417; long l_v418; long l_v421; long l_v422; -; 1462 : long l_v423; struct pypy_object_vtable0 *l_v408; -; 1463 : struct pypy_rpy_string0 *l_v412; struct pypy_rpy_string0 *l_v413; -; 1464 : struct pypy_rpy_string0 *l_v415; struct pypy_rpy_string0 *l_v419; -; 1465 : struct pypy_rpy_string0 *l_v420; struct pypy_rpy_string0 *l_v424; -; 1466 : void* l_v405; void* l_v406; -; 1467 : -; 1468 : block0: -; 1469 : l_i_23 = 0L; - - xor esi, esi - push edi - -; 1470 : l_v402 = 0L; - - xor edi, edi - -; 1471 : goto block1; -; 1472 : -; 1473 : block1: -; 1474 : OP_INT_LT(l_i_23, l_num_items_0, l_v403); - - cmp DWORD PTR _l_num_items_0$[esp+20], esi -$block0$40039: -$block1$40040: - -; 1475 : l_v404 = l_v403; -; 1476 : while (l_v404) { - - jle SHORT $block2$40046 - mov ebp, DWORD PTR _l_items_2$[esp+20] - add ebp, 8 -$LL5@pypy_g_ll_@139: -$block6$40044: - -; 1525 : goto block3_back; -; 1526 : -; 1527 : block6: -; 1528 : l_v419 = RPyItem(l_items_2, l_i_23); - - test esi, esi - jl SHORT $LN14@pypy_g_ll_@139 - mov eax, DWORD PTR _l_items_2$[esp+20] - cmp esi, DWORD PTR [eax+4] - jl SHORT $LN15@pypy_g_ll_@139 -$LN14@pypy_g_ll_@139: - call _RPyAbort -$LN15@pypy_g_ll_@139: - -; 1529 : l_v420 = l_v419; - - mov ebx, DWORD PTR [ebp] - -; 1530 : l_v421 = RPyField(l_v420, rs_chars).length; - - test ebx, ebx - jne SHORT $LN16@pypy_g_ll_@139 - call _RPyAbort -$LN16@pypy_g_ll_@139: - -; 1531 : OP_INT_ADD(l_v402, l_v421, l_v422); -; 1532 : OP_INT_ADD(l_i_23, 1L, l_v423); -; 1533 : l_i_23 = l_v423; - - inc esi - add ebp, 4 - -; 1534 : l_v402 = l_v422; - - add edi, DWORD PTR [ebx+8] - cmp esi, DWORD PTR _l_num_items_0$[esp+20] -$block1_back$40045: - jl SHORT $LL5@pypy_g_ll_@139 -$block2$40046: - -; 1477 : goto block6; -; 1478 : block1_back: ; -; 1479 : OP_INT_LT(l_i_23, l_num_items_0, l_v403); -; 1480 : l_v404 = l_v403; -; 1481 : } -; 1482 : goto block2; -; 1483 : -; 1484 : block2: -; 1485 : l_result_2 = pypy_g_mallocstr__Signed(l_v402); - - push edi - call _pypy_g_mallocstr__Signed - ;; expected {28(%esp) | 16(%esp), 8(%esp), 4(%esp), 12(%esp) | 36(%esp)} - -; 1486 : l_v405 = (void*)l_items_2; - - mov ecx, DWORD PTR _l_items_2$[esp+24] - add esp, 4 - mov DWORD PTR _l_result_2$[esp+24], eax - mov DWORD PTR _l_v405$[esp+24], ecx - -; 1487 : l_v406 = pypy_asm_gcroot(l_v405); - - mov eax, DWORD PTR ?_constant_always_one_@?1??pypy_asm_gcroot@@9@9 - imul eax, DWORD PTR _l_v405$[esp+24] - -; 1488 : l_items_2 = l_v406; /* for moving GCs */ -; 1489 : l_v408 = RPyField((&pypy_g_ExcData), ed_exc_type); -; 1490 : l_v409 = (l_v408 == NULL); - - cmp DWORD PTR _pypy_g_ExcData, 0 - -; 1491 : if (!l_v409) { - - je SHORT $LN3@pypy_g_ll_@139 - pop edi - pop esi - pop ebp - -; 1492 : l_v424 = ((struct pypy_rpy_string0 *) NULL); - - xor eax, eax - pop ebx - -; 1535 : goto block1_back; -; 1536 : } - - add esp, 8 - ret 0 -$LN3@pypy_g_ll_@139: - -; 1493 : goto block4; -; 1494 : } -; 1495 : l_i_22 = 0L; - - xor esi, esi - -; 1496 : l_res_index_0 = 0L; - - xor ebp, ebp - -; 1497 : goto block3; -; 1498 : -; 1499 : block3: -; 1500 : OP_INT_LT(l_i_22, l_num_items_0, l_v410); - - cmp DWORD PTR _l_num_items_0$[esp+20], ebp -$block3$40053: - -; 1501 : l_v411 = l_v410; -; 1502 : while (l_v411) { - - jle SHORT $LN1@pypy_g_ll_@139 - mov ebx, ecx - add ebx, 8 -$LL2@pypy_g_ll_@139: -$block5$40057: - -; 1514 : -; 1515 : block5: -; 1516 : l_v412 = RPyItem(l_items_2, l_i_22); - - test esi, esi - jl SHORT $LN9@pypy_g_ll_@139 - mov edx, DWORD PTR _l_items_2$[esp+20] - cmp esi, DWORD PTR [edx+4] - jl SHORT $LN10@pypy_g_ll_@139 -$LN9@pypy_g_ll_@139: - call _RPyAbort -$LN10@pypy_g_ll_@139: - -; 1517 : l_v413 = l_v412; - - mov edi, DWORD PTR [ebx] - -; 1518 : l_v414 = RPyField(l_v413, rs_chars).length; - - test edi, edi - jne SHORT $LN11@pypy_g_ll_@139 - call _RPyAbort -$LN11@pypy_g_ll_@139: - mov edi, DWORD PTR [edi+8] - -; 1519 : l_v415 = RPyItem(l_items_2, l_i_22); - - test esi, esi - jl SHORT $LN12@pypy_g_ll_@139 - mov eax, DWORD PTR _l_items_2$[esp+20] - cmp esi, DWORD PTR [eax+4] - jl SHORT $LN13@pypy_g_ll_@139 -$LN12@pypy_g_ll_@139: - call _RPyAbort -$LN13@pypy_g_ll_@139: - -; 1520 : pypy_g_copy_string_contents__rpy_stringPtr_rpy_stringPt(l_v415, l_result_2, 0L, l_res_index_0, l_v414); - - mov ecx, DWORD PTR [ebx] - mov edx, DWORD PTR _l_result_2$[esp+24] - push edi - add ecx, 12 ; 0000000cH - push ecx - lea eax, DWORD PTR [edx+ebp+12] - push eax -$block0$80664: -$block0$80634: -$block0$80639: -$block1$80640: -$block0$80644: -$block1$80645: -$block1$80635: -$block0$80659: -$block0$80667: -$block1$80668: -$block0$80673: -$block1$80674: -$block1$80661: -$block0$80678: -$block1$80679: - call _memcpy - ;; expected {36(%esp) | 24(%esp), 16(%esp), 12(%esp), 20(%esp) | } - add esp, 12 ; 0000000cH - -; 1521 : OP_INT_ADD(l_res_index_0, l_v414, l_v417); -; 1522 : OP_INT_ADD(l_i_22, 1L, l_v418); -; 1523 : l_i_22 = l_v418; - - inc esi - add ebx, 4 - -; 1524 : l_res_index_0 = l_v417; - - add ebp, edi - cmp esi, DWORD PTR _l_num_items_0$[esp+20] -$block1$80671: -$block3_back$40058: - jl SHORT $LL2@pypy_g_ll_@139 -$LN1@pypy_g_ll_@139: - -; 1503 : goto block5; -; 1504 : block3_back: ; -; 1505 : OP_INT_LT(l_i_22, l_num_items_0, l_v410); -; 1506 : l_v411 = l_v410; -; 1507 : } -; 1508 : l_v424 = l_result_2; -; 1509 : goto block4; -; 1510 : -; 1511 : block4: -; 1512 : RPY_DEBUG_RETURN(); -; 1513 : return l_v424; - - mov eax, DWORD PTR _l_result_2$[esp+24] - pop edi - pop esi - pop ebp -$block4$40052: - pop ebx - -; 1535 : goto block1_back; -; 1536 : } - - add esp, 8 - ret 0 -_pypy_g_ll_join_strs__Signed_arrayPtr ENDP diff -Nru pypy-7.1.1+dfsg/rpython/translator/c/gcc/test/msvc/track1.s pypy-7.3.1+dfsg/rpython/translator/c/gcc/test/msvc/track1.s --- pypy-7.1.1+dfsg/rpython/translator/c/gcc/test/msvc/track1.s 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/translator/c/gcc/test/msvc/track1.s 1970-01-01 00:00:00.000000000 +0000 @@ -1,31 +0,0 @@ -; Function compile flags: /Odtp -_TEXT SEGMENT -_pypy_g_frameworkgc_setup PROC - -; 46 : void pypy_g_frameworkgc_setup(void) { - - push ebp - mov ebp, esp -$block0$37400: - -; 47 : -; 48 : block0: -; 49 : pypy_g_SemiSpaceGC_setup((&pypy_g_pypy_rpython_memory_gc_semispace_SemiSpaceGC)); - - push OFFSET _pypy_g_pypy_rpython_memory_gc_semispace_SemiSpaceGC - call _pypy_g_SemiSpaceGC_setup - ;; expected {4(%ebp) | %ebx, %esi, %edi, (%ebp) | } - add esp, 4 -$block1$37401: - -; 50 : goto block1; -; 51 : -; 52 : block1: -; 53 : RPY_DEBUG_RETURN(); -; 54 : return /* nothing */; -; 55 : } - - pop ebp - ret 0 -_pypy_g_frameworkgc_setup ENDP -_TEXT ENDS diff -Nru pypy-7.1.1+dfsg/rpython/translator/c/gcc/test/msvc/track2.s pypy-7.3.1+dfsg/rpython/translator/c/gcc/test/msvc/track2.s --- pypy-7.1.1+dfsg/rpython/translator/c/gcc/test/msvc/track2.s 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/translator/c/gcc/test/msvc/track2.s 1970-01-01 00:00:00.000000000 +0000 @@ -1,747 +0,0 @@ -; Function compile flags: /Odtpy -; COMDAT _pypy_g__inplace_divrem1 -_TEXT SEGMENT -tv158 = -292 ; size = 4 -tv152 = -288 ; size = 4 -tv72 = -284 ; size = 4 -tv65 = -280 ; size = 4 -_l_v30733$ = -273 ; size = 1 -_l_v30737$ = -272 ; size = 8 -_l_v30740$ = -257 ; size = 1 -_l_v30744$ = -256 ; size = 4 -_l_v30753$ = -252 ; size = 4 -_l_v30748$ = -248 ; size = 8 -_l_v30709$ = -233 ; size = 1 -_l_v30710$ = -232 ; size = 1 -_l_v30714$ = -231 ; size = 1 -_l_v30718$ = -230 ; size = 1 -_l_v30729$ = -229 ; size = 1 -_l_v30725$ = -228 ; size = 4 -_l_v30705$ = -224 ; size = 8 -_l_evalue_70$ = -216 ; size = 4 -_l_index_219$ = -212 ; size = 4 -_l_v30738$ = -205 ; size = 1 -_l_v30730$ = -204 ; size = 4 -_l_v30734$ = -200 ; size = 4 -_l_length_82$ = -196 ; size = 4 -_l_v30745$ = -189 ; size = 1 -_l_v30752$ = -188 ; size = 4 -_l_v30749$ = -184 ; size = 8 -_l_l_100$ = -172 ; size = 4 -_l_l_101$ = -168 ; size = 4 -_l_length_83$ = -164 ; size = 4 -_l_v30704$ = -160 ; size = 4 -_l_v30722$ = -156 ; size = 4 -_l_v30715$ = -152 ; size = 8 -_l_v30726$ = -144 ; size = 8 -_l_v30711$ = -132 ; size = 4 -_l_x_97$ = -128 ; size = 4 -_l_v30739$ = -121 ; size = 1 -_l_v30731$ = -120 ; size = 8 -_l_v30735$ = -112 ; size = 8 -_l_v30742$ = -97 ; size = 1 -_l_v30751$ = -96 ; size = 4 -_l_v30707$ = -90 ; size = 1 -_l_v30723$ = -89 ; size = 1 -_l_v30712$ = -88 ; size = 4 -_l_v30716$ = -84 ; size = 4 -_l_v30703$ = -80 ; size = 8 -_l_v30727$ = -72 ; size = 8 -_l_v30732$ = -64 ; size = 8 -_l_v30736$ = -56 ; size = 8 -_l_index_218$ = -44 ; size = 4 -_l_v30750$ = -40 ; size = 4 -_l_v30754$ = -36 ; size = 4 -_l_v30717$ = -30 ; size = 1 -_l_v30720$ = -29 ; size = 1 -_l_v30713$ = -28 ; size = 4 -_l_v30702$ = -24 ; size = 8 -_l_v30706$ = -16 ; size = 8 -_l_v30728$ = -8 ; size = 8 -_l_self_3688$ = 8 ; size = 4 -_l_pin_1$ = 12 ; size = 4 -_l_n_38$ = 16 ; size = 8 -_l_size_53$ = 24 ; size = 4 -_pypy_g__inplace_divrem1 PROC ; COMDAT - -; 16550: long pypy_g__inplace_divrem1(struct pypy_pypy_rlib_rbigint_rbigint0 *l_self_3688, struct pypy_pypy_rlib_rbigint_rbigint0 *l_pin_1, long long l_n_38, long l_size_53) { - - push ebp - mov ebp, esp - sub esp, 292 ; 00000124H -$block0$210880: - -; 16551: struct pypy_object0 *l_evalue_70; long l_index_218; long l_index_219; -; 16552: struct pypy_array5 *l_l_100; struct pypy_array5 *l_l_101; -; 16553: long l_length_82; long l_length_83; bool_t l_v30707; bool_t l_v30709; -; 16554: bool_t l_v30710; bool_t l_v30714; bool_t l_v30717; bool_t l_v30718; -; 16555: bool_t l_v30720; bool_t l_v30723; bool_t l_v30729; bool_t l_v30733; -; 16556: bool_t l_v30738; bool_t l_v30739; bool_t l_v30740; bool_t l_v30742; -; 16557: bool_t l_v30745; long l_v30704; long l_v30712; long l_v30713; -; 16558: long l_v30716; long l_v30722; long l_v30725; long l_v30730; -; 16559: long l_v30734; long l_v30744; long l_v30750; long l_v30751; -; 16560: long l_v30752; long l_v30753; long l_v30754; long long l_v30702; -; 16561: long long l_v30703; long long l_v30705; long long l_v30706; -; 16562: long long l_v30715; long long l_v30726; long long l_v30727; -; 16563: long long l_v30728; long long l_v30731; long long l_v30732; -; 16564: long long l_v30735; long long l_v30736; long long l_v30737; -; 16565: long long l_v30748; long long l_v30749; struct pypy_array5 *l_v30711; -; 16566: long l_x_97; -; 16567: -; 16568: block0: -; 16569: OP_LLONG_GT(l_n_38, 0LL, l_v30707); - - cmp DWORD PTR _l_n_38$[ebp+4], 0 - jl SHORT $LN11@pypy_g__in - jg SHORT $LN19@pypy_g__in - cmp DWORD PTR _l_n_38$[ebp], 0 - jbe SHORT $LN11@pypy_g__in -$LN19@pypy_g__in: - mov DWORD PTR tv65[ebp], 1 - jmp SHORT $LN12@pypy_g__in -$LN11@pypy_g__in: - mov DWORD PTR tv65[ebp], 0 -$LN12@pypy_g__in: - mov al, BYTE PTR tv65[ebp] - mov BYTE PTR _l_v30707$[ebp], al - -; 16570: if (l_v30707) { - - movzx ecx, BYTE PTR _l_v30707$[ebp] - test ecx, ecx - je SHORT $LN8@pypy_g__in - -; 16571: goto block3; - - jmp SHORT $block3$210882 -$LN8@pypy_g__in: - -; 16572: } -; 16573: l_evalue_70 = (&pypy_g_exceptions_AssertionError.ae_super.se_super.e_super); - - mov DWORD PTR _l_evalue_70$[ebp], OFFSET _pypy_g_exceptions_AssertionError -$block1$210883: - -; 16574: goto block1; -; 16575: -; 16576: block1: -; 16577: pypy_g_RPyRaiseException((&pypy_g_exceptions_AssertionError_vtable.ae_super.se_super.e_super), l_evalue_70); - - mov edx, DWORD PTR _l_evalue_70$[ebp] - push edx - push OFFSET _pypy_g_exceptions_AssertionError_vtable - call _pypy_g_RPyRaiseException - ;; expected {4(%ebp) | %ebx, %esi, %edi, (%ebp) | } - add esp, 8 - -; 16578: l_v30753 = -1L; - - mov DWORD PTR _l_v30753$[ebp], -1 -$block2$210884: - -; 16579: goto block2; -; 16580: -; 16581: block2: -; 16582: RPY_DEBUG_RETURN(); -; 16583: return l_v30753; - - mov eax, DWORD PTR _l_v30753$[ebp] - jmp $LN9@pypy_g__in -$block3$210882: - -; 16584: -; 16585: block3: -; 16586: OP_LLONG_LE(l_n_38, 2147483647LL, l_v30709); - - cmp DWORD PTR _l_n_38$[ebp+4], 0 - jg SHORT $LN13@pypy_g__in - jl SHORT $LN20@pypy_g__in - cmp DWORD PTR _l_n_38$[ebp], 2147483647 ; 7fffffffH - ja SHORT $LN13@pypy_g__in -$LN20@pypy_g__in: - mov DWORD PTR tv72[ebp], 1 - jmp SHORT $LN14@pypy_g__in -$LN13@pypy_g__in: - mov DWORD PTR tv72[ebp], 0 -$LN14@pypy_g__in: - mov al, BYTE PTR tv72[ebp] - mov BYTE PTR _l_v30709$[ebp], al - -; 16587: if (l_v30709) { - - movzx ecx, BYTE PTR _l_v30709$[ebp] - test ecx, ecx - je SHORT $LN7@pypy_g__in - -; 16588: goto block4; - - jmp SHORT $block4$210886 -$LN7@pypy_g__in: - -; 16589: } -; 16590: l_evalue_70 = (&pypy_g_exceptions_AssertionError.ae_super.se_super.e_super); - - mov DWORD PTR _l_evalue_70$[ebp], OFFSET _pypy_g_exceptions_AssertionError - -; 16591: goto block1; - - jmp SHORT $block1$210883 -$block4$210886: - -; 16592: -; 16593: block4: -; 16594: OP_INT_IS_TRUE(l_size_53, l_v30710); - - xor edx, edx - cmp DWORD PTR _l_size_53$[ebp], 0 - setne dl - mov BYTE PTR _l_v30710$[ebp], dl - -; 16595: if (l_v30710) { - - movzx eax, BYTE PTR _l_v30710$[ebp] - test eax, eax - je SHORT $block5$210889 - -; 16596: l_v30754 = l_size_53; - - mov ecx, DWORD PTR _l_size_53$[ebp] - mov DWORD PTR _l_v30754$[ebp], ecx - -; 16597: goto block6; - - jmp SHORT $block6$210888 -$block5$210889: - -; 16598: } -; 16599: goto block5; -; 16600: -; 16601: block5: -; 16602: l_v30711 = RPyField(l_pin_1, prrr_inst_digits); - - mov edx, DWORD PTR _l_pin_1$[ebp] - mov eax, DWORD PTR [edx+8] - mov DWORD PTR _l_v30711$[ebp], eax - -; 16603: l_v30712 = l_v30711->length; - - mov ecx, DWORD PTR _l_v30711$[ebp] - mov edx, DWORD PTR [ecx+4] - mov DWORD PTR _l_v30712$[ebp], edx - -; 16604: l_v30754 = l_v30712; - - mov eax, DWORD PTR _l_v30712$[ebp] - mov DWORD PTR _l_v30754$[ebp], eax -$block6$210888: - -; 16605: goto block6; -; 16606: -; 16607: block6: -; 16608: OP_INT_SUB(l_v30754, 1L, l_v30713); - - mov ecx, DWORD PTR _l_v30754$[ebp] - sub ecx, 1 - mov DWORD PTR _l_v30713$[ebp], ecx - -; 16609: l_v30702 = 0LL; - - mov DWORD PTR _l_v30702$[ebp], 0 - mov DWORD PTR _l_v30702$[ebp+4], 0 - -; 16610: l_x_97 = l_v30713; - - mov edx, DWORD PTR _l_v30713$[ebp] - mov DWORD PTR _l_x_97$[ebp], edx -$block7$210890: - -; 16611: goto block7; -; 16612: -; 16613: block7: -; 16614: OP_INT_GE(l_x_97, 0L, l_v30714); - - xor eax, eax - cmp DWORD PTR _l_x_97$[ebp], 0 - setge al - mov BYTE PTR _l_v30714$[ebp], al -$LN5@pypy_g__in: - -; 16615: while (l_v30714) { - - movzx ecx, BYTE PTR _l_v30714$[ebp] - test ecx, ecx - je SHORT $block8$210896 - -; 16616: goto block9; - - jmp SHORT $block9$210894 -$block7_back$210895: - -; 16617: block7_back: ; -; 16618: OP_INT_GE(l_x_97, 0L, l_v30714); - - xor edx, edx - cmp DWORD PTR _l_x_97$[ebp], 0 - setge dl - mov BYTE PTR _l_v30714$[ebp], dl - -; 16619: } - - jmp SHORT $LN5@pypy_g__in -$block8$210896: - -; 16620: goto block8; -; 16621: -; 16622: block8: -; 16623: OP_LLONG_AND(l_v30702, 2147483647LL, l_v30715); - - mov eax, DWORD PTR _l_v30702$[ebp] - and eax, 2147483647 ; 7fffffffH - mov ecx, DWORD PTR _l_v30702$[ebp+4] - and ecx, 0 - mov DWORD PTR _l_v30715$[ebp], eax - mov DWORD PTR _l_v30715$[ebp+4], ecx - -; 16624: OP_TRUNCATE_LONGLONG_TO_INT(l_v30715, l_v30716); - - mov edx, DWORD PTR _l_v30715$[ebp] - mov DWORD PTR _l_v30716$[ebp], edx - -; 16625: l_v30753 = l_v30716; - - mov eax, DWORD PTR _l_v30716$[ebp] - mov DWORD PTR _l_v30753$[ebp], eax - -; 16626: goto block2; - - jmp $block2$210884 -$block9$210894: - -; 16627: -; 16628: block9: -; 16629: OP_LLONG_LSHIFT(l_v30702, 31LL, l_v30703); - - mov eax, DWORD PTR _l_v30702$[ebp] - mov edx, DWORD PTR _l_v30702$[ebp+4] - mov cl, 31 ; 0000001fH - call __allshl - ;; expected {4(%ebp) | %ebx, %esi, %edi, (%ebp) | } - mov DWORD PTR _l_v30703$[ebp], eax - mov DWORD PTR _l_v30703$[ebp+4], edx - -; 16630: l_l_100 = RPyField(l_pin_1, prrr_inst_digits); - - mov ecx, DWORD PTR _l_pin_1$[ebp] - mov edx, DWORD PTR [ecx+8] - mov DWORD PTR _l_l_100$[ebp], edx - -; 16631: l_length_83 = l_l_100->length; - - mov eax, DWORD PTR _l_l_100$[ebp] - mov ecx, DWORD PTR [eax+4] - mov DWORD PTR _l_length_83$[ebp], ecx - -; 16632: OP_INT_LT(l_x_97, 0L, l_v30717); - - xor edx, edx - cmp DWORD PTR _l_x_97$[ebp], 0 - setl dl - mov BYTE PTR _l_v30717$[ebp], dl - -; 16633: if (l_v30717) { - - movzx eax, BYTE PTR _l_v30717$[ebp] - test eax, eax - je SHORT $LN3@pypy_g__in - -; 16634: goto block14; - - jmp $block14$210899 -$LN3@pypy_g__in: - -; 16635: } -; 16636: l_index_218 = l_x_97; - - mov ecx, DWORD PTR _l_x_97$[ebp] - mov DWORD PTR _l_index_218$[ebp], ecx -$block10$210900: - -; 16637: goto block10; -; 16638: -; 16639: block10: -; 16640: OP_INT_GE(l_index_218, 0L, l_v30718); - - xor edx, edx - cmp DWORD PTR _l_index_218$[ebp], 0 - setge dl - mov BYTE PTR _l_v30718$[ebp], dl - -; 16641: RPyAssert(l_v30718, "negative list getitem index out of bound"); -; 16642: OP_INT_LT(l_index_218, l_length_83, l_v30720); - - mov eax, DWORD PTR _l_index_218$[ebp] - xor ecx, ecx - cmp eax, DWORD PTR _l_length_83$[ebp] - setl cl - mov BYTE PTR _l_v30720$[ebp], cl - -; 16643: RPyAssert(l_v30720, "list getitem index out of bound"); -; 16644: l_v30722 = l_l_100->length; - - mov edx, DWORD PTR _l_l_100$[ebp] - mov eax, DWORD PTR [edx+4] - mov DWORD PTR _l_v30722$[ebp], eax - -; 16645: OP_INT_LT(l_index_218, l_v30722, l_v30723); - - mov ecx, DWORD PTR _l_index_218$[ebp] - xor edx, edx - cmp ecx, DWORD PTR _l_v30722$[ebp] - setl dl - mov BYTE PTR _l_v30723$[ebp], dl - -; 16646: RPyAssert(l_v30723, "fixed getitem out of bounds"); -; 16647: l_v30725 = RPyItem(l_l_100, l_index_218); - - mov eax, DWORD PTR _l_index_218$[ebp] - mov ecx, DWORD PTR _l_l_100$[ebp] - mov edx, DWORD PTR [ecx+eax*4+8] - mov DWORD PTR _l_v30725$[ebp], edx - -; 16648: OP_CAST_INT_TO_LONGLONG(l_v30725, l_v30726); - - mov eax, DWORD PTR _l_v30725$[ebp] - cdq - mov DWORD PTR _l_v30726$[ebp], eax - mov DWORD PTR _l_v30726$[ebp+4], edx - -; 16649: OP_LLONG_ADD(l_v30703, l_v30726, l_v30706); - - mov eax, DWORD PTR _l_v30703$[ebp] - add eax, DWORD PTR _l_v30726$[ebp] - mov ecx, DWORD PTR _l_v30703$[ebp+4] - adc ecx, DWORD PTR _l_v30726$[ebp+4] - mov DWORD PTR _l_v30706$[ebp], eax - mov DWORD PTR _l_v30706$[ebp+4], ecx - -; 16650: OP_LLONG_FLOORDIV(l_v30706, l_n_38, l_v30727); - - mov edx, DWORD PTR _l_n_38$[ebp+4] - push edx - mov eax, DWORD PTR _l_n_38$[ebp] - push eax - mov ecx, DWORD PTR _l_v30706$[ebp+4] - push ecx - mov edx, DWORD PTR _l_v30706$[ebp] - push edx - call __alldiv - ;; expected {4(%ebp) | %ebx, %esi, %edi, (%ebp) | } - mov DWORD PTR _l_v30727$[ebp], eax - mov DWORD PTR _l_v30727$[ebp+4], edx - -; 16651: OP_LLONG_XOR(l_v30706, l_n_38, l_v30728); - - mov eax, DWORD PTR _l_v30706$[ebp] - xor eax, DWORD PTR _l_n_38$[ebp] - mov ecx, DWORD PTR _l_v30706$[ebp+4] - xor ecx, DWORD PTR _l_n_38$[ebp+4] - mov DWORD PTR _l_v30728$[ebp], eax - mov DWORD PTR _l_v30728$[ebp+4], ecx - -; 16652: OP_LLONG_LE(l_v30728, 0LL, l_v30729); - - jg SHORT $LN15@pypy_g__in - jl SHORT $LN21@pypy_g__in - cmp DWORD PTR _l_v30728$[ebp], 0 - ja SHORT $LN15@pypy_g__in -$LN21@pypy_g__in: - mov DWORD PTR tv152[ebp], 1 - jmp SHORT $LN16@pypy_g__in -$LN15@pypy_g__in: - mov DWORD PTR tv152[ebp], 0 -$LN16@pypy_g__in: - mov dl, BYTE PTR tv152[ebp] - mov BYTE PTR _l_v30729$[ebp], dl - -; 16653: OP_CAST_BOOL_TO_INT(l_v30729, l_v30730); - - movzx eax, BYTE PTR _l_v30729$[ebp] - mov DWORD PTR _l_v30730$[ebp], eax - -; 16654: OP_CAST_INT_TO_LONGLONG(l_v30730, l_v30731); - - mov eax, DWORD PTR _l_v30730$[ebp] - cdq - mov DWORD PTR _l_v30731$[ebp], eax - mov DWORD PTR _l_v30731$[ebp+4], edx - -; 16655: OP_LLONG_MOD(l_v30706, l_n_38, l_v30732); - - mov ecx, DWORD PTR _l_n_38$[ebp+4] - push ecx - mov edx, DWORD PTR _l_n_38$[ebp] - push edx - mov eax, DWORD PTR _l_v30706$[ebp+4] - push eax - mov ecx, DWORD PTR _l_v30706$[ebp] - push ecx - call __allrem - ;; expected {4(%ebp) | %ebx, %esi, %edi, (%ebp) | } - mov DWORD PTR _l_v30732$[ebp], eax - mov DWORD PTR _l_v30732$[ebp+4], edx - -; 16656: OP_LLONG_NE(l_v30732, 0LL, l_v30733); - - mov edx, DWORD PTR _l_v30732$[ebp] - or edx, DWORD PTR _l_v30732$[ebp+4] - je SHORT $LN17@pypy_g__in - mov DWORD PTR tv158[ebp], 1 - jmp SHORT $LN18@pypy_g__in -$LN17@pypy_g__in: - mov DWORD PTR tv158[ebp], 0 -$LN18@pypy_g__in: - mov al, BYTE PTR tv158[ebp] - mov BYTE PTR _l_v30733$[ebp], al - -; 16657: OP_CAST_BOOL_TO_INT(l_v30733, l_v30734); - - movzx ecx, BYTE PTR _l_v30733$[ebp] - mov DWORD PTR _l_v30734$[ebp], ecx - -; 16658: OP_CAST_INT_TO_LONGLONG(l_v30734, l_v30735); - - mov eax, DWORD PTR _l_v30734$[ebp] - cdq - mov DWORD PTR _l_v30735$[ebp], eax - mov DWORD PTR _l_v30735$[ebp+4], edx - -; 16659: OP_LLONG_AND(l_v30731, l_v30735, l_v30736); - - mov edx, DWORD PTR _l_v30731$[ebp] - and edx, DWORD PTR _l_v30735$[ebp] - mov eax, DWORD PTR _l_v30731$[ebp+4] - and eax, DWORD PTR _l_v30735$[ebp+4] - mov DWORD PTR _l_v30736$[ebp], edx - mov DWORD PTR _l_v30736$[ebp+4], eax - -; 16660: OP_LLONG_SUB(l_v30727, l_v30736, l_v30705); - - mov ecx, DWORD PTR _l_v30727$[ebp] - sub ecx, DWORD PTR _l_v30736$[ebp] - mov edx, DWORD PTR _l_v30727$[ebp+4] - sbb edx, DWORD PTR _l_v30736$[ebp+4] - mov DWORD PTR _l_v30705$[ebp], ecx - mov DWORD PTR _l_v30705$[ebp+4], edx - -; 16661: OP_LLONG_AND(l_v30705, 2147483647LL, l_v30737); - - mov eax, DWORD PTR _l_v30705$[ebp] - and eax, 2147483647 ; 7fffffffH - mov ecx, DWORD PTR _l_v30705$[ebp+4] - and ecx, 0 - mov DWORD PTR _l_v30737$[ebp], eax - mov DWORD PTR _l_v30737$[ebp+4], ecx - -; 16662: OP_TRUNCATE_LONGLONG_TO_INT(l_v30737, l_v30704); - - mov edx, DWORD PTR _l_v30737$[ebp] - mov DWORD PTR _l_v30704$[ebp], edx - -; 16663: OP_INT_GE(l_v30704, 0L, l_v30738); - - xor eax, eax - cmp DWORD PTR _l_v30704$[ebp], 0 - setge al - mov BYTE PTR _l_v30738$[ebp], al - -; 16664: if (l_v30738) { - - movzx ecx, BYTE PTR _l_v30738$[ebp] - test ecx, ecx - je SHORT $LN2@pypy_g__in - -; 16665: goto block11; - - jmp SHORT $block11$210908 -$LN2@pypy_g__in: - -; 16666: } -; 16667: l_evalue_70 = (&pypy_g_exceptions_AssertionError.ae_super.se_super.e_super); - - mov DWORD PTR _l_evalue_70$[ebp], OFFSET _pypy_g_exceptions_AssertionError - -; 16668: goto block1; - - jmp $block1$210883 -$block11$210908: - -; 16669: -; 16670: block11: -; 16671: l_l_101 = RPyField(l_self_3688, prrr_inst_digits); - - mov edx, DWORD PTR _l_self_3688$[ebp] - mov eax, DWORD PTR [edx+8] - mov DWORD PTR _l_l_101$[ebp], eax - -; 16672: l_length_82 = l_l_101->length; - - mov ecx, DWORD PTR _l_l_101$[ebp] - mov edx, DWORD PTR [ecx+4] - mov DWORD PTR _l_length_82$[ebp], edx - -; 16673: OP_INT_LT(l_x_97, 0L, l_v30739); - - xor eax, eax - cmp DWORD PTR _l_x_97$[ebp], 0 - setl al - mov BYTE PTR _l_v30739$[ebp], al - -; 16674: if (l_v30739) { - - movzx ecx, BYTE PTR _l_v30739$[ebp] - test ecx, ecx - je SHORT $LN1@pypy_g__in - -; 16675: goto block13; - - jmp $block13$210910 -$LN1@pypy_g__in: - -; 16676: } -; 16677: l_index_219 = l_x_97; - - mov edx, DWORD PTR _l_x_97$[ebp] - mov DWORD PTR _l_index_219$[ebp], edx -$block12$210911: - -; 16678: goto block12; -; 16679: -; 16680: block12: -; 16681: OP_INT_GE(l_index_219, 0L, l_v30740); - - xor eax, eax - cmp DWORD PTR _l_index_219$[ebp], 0 - setge al - mov BYTE PTR _l_v30740$[ebp], al - -; 16682: RPyAssert(l_v30740, "negative list setitem index out of bound"); -; 16683: OP_INT_LT(l_index_219, l_length_82, l_v30742); - - mov ecx, DWORD PTR _l_index_219$[ebp] - xor edx, edx - cmp ecx, DWORD PTR _l_length_82$[ebp] - setl dl - mov BYTE PTR _l_v30742$[ebp], dl - -; 16684: RPyAssert(l_v30742, "list setitem index out of bound"); -; 16685: l_v30744 = l_l_101->length; - - mov eax, DWORD PTR _l_l_101$[ebp] - mov ecx, DWORD PTR [eax+4] - mov DWORD PTR _l_v30744$[ebp], ecx - -; 16686: OP_INT_LT(l_index_219, l_v30744, l_v30745); - - mov edx, DWORD PTR _l_index_219$[ebp] - xor eax, eax - cmp edx, DWORD PTR _l_v30744$[ebp] - setl al - mov BYTE PTR _l_v30745$[ebp], al - -; 16687: RPyAssert(l_v30745, "fixed setitem out of bounds"); -; 16688: RPyItem(l_l_101, l_index_219) = l_v30704; - - mov ecx, DWORD PTR _l_index_219$[ebp] - mov edx, DWORD PTR _l_l_101$[ebp] - mov eax, DWORD PTR _l_v30704$[ebp] - mov DWORD PTR [edx+ecx*4+8], eax - -; 16689: OP_LLONG_MUL(l_v30705, l_n_38, l_v30748); - - mov ecx, DWORD PTR _l_n_38$[ebp+4] - push ecx - mov edx, DWORD PTR _l_n_38$[ebp] - push edx - mov eax, DWORD PTR _l_v30705$[ebp+4] - push eax - mov ecx, DWORD PTR _l_v30705$[ebp] - push ecx - call __allmul - ;; expected {4(%ebp) | %ebx, %esi, %edi, (%ebp) | } - mov DWORD PTR _l_v30748$[ebp], eax - mov DWORD PTR _l_v30748$[ebp+4], edx - -; 16690: OP_LLONG_SUB(l_v30706, l_v30748, l_v30749); - - mov edx, DWORD PTR _l_v30706$[ebp] - sub edx, DWORD PTR _l_v30748$[ebp] - mov eax, DWORD PTR _l_v30706$[ebp+4] - sbb eax, DWORD PTR _l_v30748$[ebp+4] - mov DWORD PTR _l_v30749$[ebp], edx - mov DWORD PTR _l_v30749$[ebp+4], eax - -; 16691: OP_INT_SUB(l_x_97, 1L, l_v30750); - - mov ecx, DWORD PTR _l_x_97$[ebp] - sub ecx, 1 - mov DWORD PTR _l_v30750$[ebp], ecx - -; 16692: l_v30702 = l_v30749; - - mov edx, DWORD PTR _l_v30749$[ebp] - mov DWORD PTR _l_v30702$[ebp], edx - mov eax, DWORD PTR _l_v30749$[ebp+4] - mov DWORD PTR _l_v30702$[ebp+4], eax - -; 16693: l_x_97 = l_v30750; - - mov ecx, DWORD PTR _l_v30750$[ebp] - mov DWORD PTR _l_x_97$[ebp], ecx - -; 16694: goto block7_back; - - jmp $block7_back$210895 -$block13$210910: - -; 16695: -; 16696: block13: -; 16697: OP_INT_ADD(l_x_97, l_length_82, l_v30751); - - mov edx, DWORD PTR _l_x_97$[ebp] - add edx, DWORD PTR _l_length_82$[ebp] - mov DWORD PTR _l_v30751$[ebp], edx - -; 16698: l_index_219 = l_v30751; - - mov eax, DWORD PTR _l_v30751$[ebp] - mov DWORD PTR _l_index_219$[ebp], eax - -; 16699: goto block12; - - jmp $block12$210911 -$block14$210899: - -; 16700: -; 16701: block14: -; 16702: OP_INT_ADD(l_x_97, l_length_83, l_v30752); - - mov ecx, DWORD PTR _l_x_97$[ebp] - add ecx, DWORD PTR _l_length_83$[ebp] - mov DWORD PTR _l_v30752$[ebp], ecx - -; 16703: l_index_218 = l_v30752; - - mov edx, DWORD PTR _l_v30752$[ebp] - mov DWORD PTR _l_index_218$[ebp], edx - -; 16704: goto block10; - - jmp $block10$210900 -$LN9@pypy_g__in: - -; 16705: } - - mov esp, ebp - pop ebp - ret 0 -_pypy_g__inplace_divrem1 ENDP diff -Nru pypy-7.1.1+dfsg/rpython/translator/c/gcc/test/msvc/track8.s pypy-7.3.1+dfsg/rpython/translator/c/gcc/test/msvc/track8.s --- pypy-7.1.1+dfsg/rpython/translator/c/gcc/test/msvc/track8.s 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/translator/c/gcc/test/msvc/track8.s 1970-01-01 00:00:00.000000000 +0000 @@ -1,547 +0,0 @@ -; Function compile flags: /Ogtpy -; COMDAT _pypy_g_foo -_TEXT SEGMENT -tv419 = -8 ; size = 4 -_l_v416$ = -4 ; size = 4 -_l_v413$ = -4 ; size = 4 -_l_v410$ = -4 ; size = 4 -_l_v407$ = -4 ; size = 4 -_l_v404$ = -4 ; size = 4 -_l_v401$ = -4 ; size = 4 -_l_v394$ = -4 ; size = 4 -_l_v391$ = -4 ; size = 4 -_l_v388$ = -4 ; size = 4 -_l_v385$ = -4 ; size = 4 -_l_v382$ = -4 ; size = 4 -_l_v379$ = -4 ; size = 4 -_l_v376$ = -4 ; size = 4 -_l_v368$ = -4 ; size = 4 -_l_v365$ = -4 ; size = 4 -_l_v362$ = -4 ; size = 4 -_l_v359$ = -4 ; size = 4 -_l_v356$ = -4 ; size = 4 -_l_v353$ = -4 ; size = 4 -_local$40423 = 8 ; size = 1 -_l_rec_1$ = 8 ; size = 4 -_l_a1_1$ = 12 ; size = 4 -_l_a2_1$ = 16 ; size = 4 -_l_a3_1$ = 20 ; size = 4 -_l_a4_1$ = 24 ; size = 4 -_l_a5_1$ = 28 ; size = 4 -_l_a6_1$ = 32 ; size = 4 -_pypy_g_foo PROC ; COMDAT - -; 1026 : bool_t l_v337; bool_t l_v340; bool_t l_v345; bool_t l_v346; -; 1027 : bool_t l_v371; bool_t l_v398; bool_t l_v420; bool_t l_v426; -; 1028 : long l_v342; long l_v344; long l_v374; long l_v399; long l_v421; -; 1029 : struct pypy_header0 *l_v347; struct pypy_object0 *l_v372; -; 1030 : struct pypy_object_vtable0 *l_v339; -; 1031 : struct pypy_object_vtable0 *l_v397; -; 1032 : struct pypy_object_vtable0 *l_v419; -; 1033 : struct pypy_object_vtable0 *l_v425; struct pypy_src8_A0 *l_v335; -; 1034 : void* l_v336; void* l_v341; void* l_v343; void* l_v349; void* l_v351; -; 1035 : void* l_v352; void* l_v353; void* l_v354; void* l_v356; void* l_v357; -; 1036 : void* l_v359; void* l_v360; void* l_v362; void* l_v363; void* l_v365; -; 1037 : void* l_v366; void* l_v368; void* l_v369; void* l_v376; void* l_v377; -; 1038 : void* l_v379; void* l_v380; void* l_v382; void* l_v383; void* l_v385; -; 1039 : void* l_v386; void* l_v388; void* l_v389; void* l_v391; void* l_v392; -; 1040 : void* l_v394; void* l_v395; void* l_v401; void* l_v402; void* l_v404; -; 1041 : void* l_v405; void* l_v407; void* l_v408; void* l_v410; void* l_v411; -; 1042 : void* l_v413; void* l_v414; void* l_v416; void* l_v417; void* l_v424; -; 1043 : void* l_v428; -; 1044 : -; 1045 : block0: -; 1046 : OP_INT_GT(l_rec_1, 0L, l_v337); - - mov eax, DWORD PTR _l_rec_1$[esp-4] - sub esp, 8 - test eax, eax -$block0$34376: - -; 1047 : if (l_v337) { - - jle $block1$34379 - push ebx - mov ebx, DWORD PTR _l_a2_1$[esp+8] - push ebp - mov ebp, DWORD PTR _l_a1_1$[esp+12] - push edi - mov edi, DWORD PTR _l_a3_1$[esp+16] - add eax, -1 - mov DWORD PTR tv419[esp+20], eax - push esi - npad 10 -$LL63@pypy_g_foo: - -; 1048 : goto block2; -; 1049 : } -; 1050 : goto block1; -; 1051 : -; 1052 : block1: -; 1053 : RPY_DEBUG_RETURN(); -; 1054 : return /* nothing */; -; 1055 : -; 1056 : block2: -; 1057 : pypy_g_stack_check___(); - - lea eax, DWORD PTR _local$40423[esp+20] - sub eax, DWORD PTR __LLstacktoobig_stack_base_pointer -$block0$40413: - cmp eax, DWORD PTR __LLstacktoobig_stack_min -$block2$34378: - jl SHORT $LN16@pypy_g_foo - cmp eax, DWORD PTR __LLstacktoobig_stack_max - jle SHORT $LN17@pypy_g_foo -$LN16@pypy_g_foo: - call _LL_stack_too_big_slowpath - ;; expected {24(%esp) | 12(%esp), (%esp), 4(%esp), 8(%esp) | %ebx, %edi, %ebp, 44(%esp), 48(%esp), 52(%esp)} - test eax, eax - jne $LN71@pypy_g_foo -$LN17@pypy_g_foo: -$block1$40416: - -; 1058 : l_v339 = RPyField((&pypy_g_ExcData), ed_exc_type); -; 1059 : l_v340 = (l_v339 == NULL); - - cmp DWORD PTR _pypy_g_ExcData, 0 - -; 1060 : if (!l_v340) { - - jne $LN75@pypy_g_foo - -; 1061 : goto block1; -; 1062 : } -; 1063 : goto block3; -; 1064 : -; 1065 : block3: -; 1066 : l_v341 = RPyField((&pypy_g_pypy_rpython_memory_gc_semispace_SemiSpaceGC), ssgc_inst_free); - - mov esi, DWORD PTR _pypy_g_pypy_rpython_memory_gc_semispace_SemiSpaceGC+12 - -; 1067 : OP_RAW_MALLOC_USAGE((0 + ROUND_UP_FOR_ALLOCATION(sizeof(struct pypy_src8_A0), sizeof(struct pypy_forwarding_stub0))), l_v342); -; 1068 : l_v343 = RPyField((&pypy_g_pypy_rpython_memory_gc_semispace_SemiSpaceGC), ssgc_inst_top_of_space); -; 1069 : OP_ADR_DELTA(l_v343, l_v341, l_v344); - - mov eax, DWORD PTR _pypy_g_pypy_rpython_memory_gc_semispace_SemiSpaceGC+80 - sub eax, esi - -; 1070 : OP_INT_GT(l_v342, l_v344, l_v345); - - cmp eax, 8 -$block3$34382: - -; 1071 : if (l_v345) { - - jge SHORT $block4$34395 - -; 1184 : goto block1; -; 1185 : -; 1186 : block10: -; 1187 : abort(); /* debug_llinterpcall should be unreachable */ -; 1188 : goto block5; -; 1189 : -; 1190 : block11: -; 1191 : l_v424 = pypy_g_SemiSpaceGC_obtain_free_space((&pypy_g_pypy_rpython_memory_gc_semispace_SemiSpaceGC), (0 + ROUND_UP_FOR_ALLOCATION(sizeof(struct pypy_src8_A0), sizeof(struct pypy_forwarding_stub0)))); - - push 8 - push OFFSET _pypy_g_pypy_rpython_memory_gc_semispace_SemiSpaceGC -$block11$34394: - call _pypy_g_SemiSpaceGC_obtain_free_space - ;; expected {32(%esp) | 20(%esp), 8(%esp), 12(%esp), 16(%esp) | %ebx, %edi, %ebp, 52(%esp), 56(%esp), 60(%esp)} - add esp, 8 - -; 1192 : l_v425 = RPyField((&pypy_g_ExcData), ed_exc_type); -; 1193 : l_v426 = (l_v425 == NULL); - - cmp DWORD PTR _pypy_g_ExcData, 0 - -; 1194 : if (!l_v426) { - - je SHORT $LN1@pypy_g_foo - -; 1195 : l_v428 = NULL; - - xor esi, esi - -; 1196 : goto block6; - - jmp SHORT $block6$34416 -$LN1@pypy_g_foo: - -; 1197 : } -; 1198 : l_v336 = l_v424; - - mov esi, eax -$block4$34395: - -; 1072 : goto block11; -; 1073 : } -; 1074 : l_v336 = l_v341; -; 1075 : goto block4; -; 1076 : -; 1077 : block4: -; 1078 : OP_INT_IS_TRUE(RUNNING_ON_LLINTERP, l_v346); -; 1079 : if (l_v346) { -; 1080 : goto block10; -; 1081 : } -; 1082 : goto block5; -; 1083 : -; 1084 : block5: -; 1085 : l_v347 = (struct pypy_header0 *)l_v336; -; 1086 : RPyField(l_v347, h_tid) = (GROUP_MEMBER_OFFSET(struct group_pypy_g_typeinfo_s, member1)|0L); -; 1087 : OP_ADR_ADD(l_v336, (0 + ROUND_UP_FOR_ALLOCATION(sizeof(struct pypy_src8_A0), sizeof(struct pypy_forwarding_stub0))), l_v349); - - lea ecx, DWORD PTR [esi+8] - mov DWORD PTR [esi], 1 -$block5$34398: - -; 1088 : RPyField((&pypy_g_pypy_rpython_memory_gc_semispace_SemiSpaceGC), ssgc_inst_free) = l_v349; - - mov DWORD PTR _pypy_g_pypy_rpython_memory_gc_semispace_SemiSpaceGC+12, ecx -$block6$34416: - -; 1089 : OP_ADR_ADD(l_v336, 0, l_v351); -; 1090 : l_v352 = (void*)l_v351; -; 1091 : l_v428 = l_v352; -; 1092 : goto block6; -; 1093 : -; 1094 : block6: -; 1095 : l_v353 = (void*)l_a2_1; - - mov DWORD PTR _l_v353$[esp+24], ebx - -; 1096 : l_v354 = pypy_asm_gcroot(l_v353); - - mov eax, DWORD PTR ?_constant_always_one_@?1??pypy_asm_gcroot@@9@9 - imul eax, DWORD PTR _l_v353$[esp+24] - -; 1097 : l_a2_1 = l_v354; /* for moving GCs */ -; 1098 : l_v356 = (void*)l_a5_1; - - mov edx, DWORD PTR _l_a5_1$[esp+20] - mov DWORD PTR _l_v356$[esp+24], edx - -; 1099 : l_v357 = pypy_asm_gcroot(l_v356); - - mov eax, DWORD PTR ?_constant_always_one_@?1??pypy_asm_gcroot@@9@9 - imul eax, DWORD PTR _l_v356$[esp+24] - -; 1100 : l_a5_1 = l_v357; /* for moving GCs */ -; 1101 : l_v359 = (void*)l_a6_1; - - mov eax, DWORD PTR _l_a6_1$[esp+20] - mov DWORD PTR _l_v359$[esp+24], eax - -; 1102 : l_v360 = pypy_asm_gcroot(l_v359); - - mov eax, DWORD PTR ?_constant_always_one_@?1??pypy_asm_gcroot@@9@9 - imul eax, DWORD PTR _l_v359$[esp+24] - -; 1103 : l_a6_1 = l_v360; /* for moving GCs */ -; 1104 : l_v362 = (void*)l_a1_1; - - mov DWORD PTR _l_v362$[esp+24], ebp - -; 1105 : l_v363 = pypy_asm_gcroot(l_v362); - - mov eax, DWORD PTR ?_constant_always_one_@?1??pypy_asm_gcroot@@9@9 - imul eax, DWORD PTR _l_v362$[esp+24] - -; 1106 : l_a1_1 = l_v363; /* for moving GCs */ -; 1107 : l_v365 = (void*)l_a3_1; - - mov DWORD PTR _l_v365$[esp+24], edi - -; 1108 : l_v366 = pypy_asm_gcroot(l_v365); - - mov eax, DWORD PTR ?_constant_always_one_@?1??pypy_asm_gcroot@@9@9 - imul eax, DWORD PTR _l_v365$[esp+24] - -; 1109 : l_a3_1 = l_v366; /* for moving GCs */ -; 1110 : l_v368 = (void*)l_a4_1; - - mov ecx, DWORD PTR _l_a4_1$[esp+20] - mov DWORD PTR _l_v368$[esp+24], ecx - -; 1111 : l_v369 = pypy_asm_gcroot(l_v368); - - mov eax, DWORD PTR ?_constant_always_one_@?1??pypy_asm_gcroot@@9@9 - imul eax, DWORD PTR _l_v368$[esp+24] - -; 1112 : l_a4_1 = l_v369; /* for moving GCs */ -; 1113 : l_v335 = (struct pypy_src8_A0 *)l_v428; -; 1114 : l_v371 = (l_v335 != NULL); - - test esi, esi - -; 1115 : if (!l_v371) { - - je $LN75@pypy_g_foo - -; 1116 : goto block1; -; 1117 : } -; 1118 : goto block7; -; 1119 : -; 1120 : block7: -; 1121 : l_v372 = (struct pypy_object0 *)l_v335; -; 1122 : RPyField(l_v372, o_typeptr) = (&pypy_g_src8_A_vtable.a_super); -; 1123 : OP_INT_SUB(l_rec_1, 1L, l_v374); -; 1124 : pypy_g_foo(l_v374, l_v335, l_v335, l_v335, l_v335, l_v335, l_v335); - - mov edx, DWORD PTR tv419[esp+24] - push esi - push esi - push esi - push esi - push esi - push esi - push edx -$block7$34426: - mov DWORD PTR [esi+4], OFFSET _pypy_g_src8_A_vtable - call _pypy_g_foo - ;; expected {52(%esp) | 40(%esp), 28(%esp), 32(%esp), 36(%esp) | %ebx, %esi, %edi, %ebp, 72(%esp), 76(%esp), 80(%esp)} - add esp, 28 ; 0000001cH - -; 1125 : l_v376 = (void*)l_a2_1; - - mov DWORD PTR _l_v376$[esp+24], ebx - -; 1126 : l_v377 = pypy_asm_gcroot(l_v376); - - mov eax, DWORD PTR ?_constant_always_one_@?1??pypy_asm_gcroot@@9@9 - imul eax, DWORD PTR _l_v376$[esp+24] - -; 1127 : l_a2_1 = l_v377; /* for moving GCs */ -; 1128 : l_v379 = (void*)l_a6_1; - - mov eax, DWORD PTR _l_a6_1$[esp+20] - mov DWORD PTR _l_v379$[esp+24], eax - -; 1129 : l_v380 = pypy_asm_gcroot(l_v379); - - mov eax, DWORD PTR ?_constant_always_one_@?1??pypy_asm_gcroot@@9@9 - imul eax, DWORD PTR _l_v379$[esp+24] - -; 1130 : l_a6_1 = l_v380; /* for moving GCs */ -; 1131 : l_v382 = (void*)l_a1_1; - - mov DWORD PTR _l_v382$[esp+24], ebp - -; 1132 : l_v383 = pypy_asm_gcroot(l_v382); - - mov eax, DWORD PTR ?_constant_always_one_@?1??pypy_asm_gcroot@@9@9 - imul eax, DWORD PTR _l_v382$[esp+24] - -; 1133 : l_a1_1 = l_v383; /* for moving GCs */ -; 1134 : l_v385 = (void*)l_v335; - - mov DWORD PTR _l_v385$[esp+24], esi - -; 1135 : l_v386 = pypy_asm_gcroot(l_v385); - - mov eax, DWORD PTR ?_constant_always_one_@?1??pypy_asm_gcroot@@9@9 - imul eax, DWORD PTR _l_v385$[esp+24] - -; 1136 : l_v335 = l_v386; /* for moving GCs */ -; 1137 : l_v388 = (void*)l_a3_1; - - mov DWORD PTR _l_v388$[esp+24], edi - -; 1138 : l_v389 = pypy_asm_gcroot(l_v388); - - mov eax, DWORD PTR ?_constant_always_one_@?1??pypy_asm_gcroot@@9@9 - imul eax, DWORD PTR _l_v388$[esp+24] - -; 1139 : l_a3_1 = l_v389; /* for moving GCs */ -; 1140 : l_v391 = (void*)l_a5_1; - - mov ecx, DWORD PTR _l_a5_1$[esp+20] - mov DWORD PTR _l_v391$[esp+24], ecx - -; 1141 : l_v392 = pypy_asm_gcroot(l_v391); - - mov eax, DWORD PTR ?_constant_always_one_@?1??pypy_asm_gcroot@@9@9 - imul eax, DWORD PTR _l_v391$[esp+24] - -; 1142 : l_a5_1 = l_v392; /* for moving GCs */ -; 1143 : l_v394 = (void*)l_a4_1; - - mov edx, DWORD PTR _l_a4_1$[esp+20] - mov DWORD PTR _l_v394$[esp+24], edx - -; 1144 : l_v395 = pypy_asm_gcroot(l_v394); - - mov eax, DWORD PTR ?_constant_always_one_@?1??pypy_asm_gcroot@@9@9 - imul eax, DWORD PTR _l_v394$[esp+24] - -; 1145 : l_a4_1 = l_v395; /* for moving GCs */ -; 1146 : l_v397 = RPyField((&pypy_g_ExcData), ed_exc_type); -; 1147 : l_v398 = (l_v397 == NULL); - - cmp DWORD PTR _pypy_g_ExcData, 0 - -; 1148 : if (!l_v398) { - - jne $LN75@pypy_g_foo - -; 1149 : goto block1; -; 1150 : } -; 1151 : goto block8; -; 1152 : -; 1153 : block8: -; 1154 : OP_INT_SUB(l_rec_1, 1L, l_v399); -; 1155 : pypy_g_foo(l_v399, l_v335, l_v335, l_v335, l_v335, l_v335, l_v335); - - mov eax, DWORD PTR tv419[esp+24] - push esi - push esi - push esi - push esi - push esi - push esi - push eax -$block8$34437: - call _pypy_g_foo - ;; expected {52(%esp) | 40(%esp), 28(%esp), 32(%esp), 36(%esp) | %ebx, %edi, %ebp, 72(%esp), 76(%esp), 80(%esp)} - add esp, 28 ; 0000001cH - -; 1156 : l_v401 = (void*)l_a2_1; - - mov DWORD PTR _l_v401$[esp+24], ebx - -; 1157 : l_v402 = pypy_asm_gcroot(l_v401); - - mov eax, DWORD PTR ?_constant_always_one_@?1??pypy_asm_gcroot@@9@9 - imul eax, DWORD PTR _l_v401$[esp+24] - -; 1158 : l_a2_1 = l_v402; /* for moving GCs */ -; 1159 : l_v404 = (void*)l_a1_1; - - mov DWORD PTR _l_v404$[esp+24], ebp - -; 1160 : l_v405 = pypy_asm_gcroot(l_v404); - - mov eax, DWORD PTR ?_constant_always_one_@?1??pypy_asm_gcroot@@9@9 - imul eax, DWORD PTR _l_v404$[esp+24] - -; 1161 : l_a1_1 = l_v405; /* for moving GCs */ -; 1162 : l_v407 = (void*)l_a3_1; - - mov DWORD PTR _l_v407$[esp+24], edi - -; 1163 : l_v408 = pypy_asm_gcroot(l_v407); - - mov eax, DWORD PTR ?_constant_always_one_@?1??pypy_asm_gcroot@@9@9 - imul eax, DWORD PTR _l_v407$[esp+24] - -; 1164 : l_a3_1 = l_v408; /* for moving GCs */ -; 1165 : l_v410 = (void*)l_a6_1; - - mov ecx, DWORD PTR _l_a6_1$[esp+20] - mov DWORD PTR _l_v410$[esp+24], ecx - -; 1166 : l_v411 = pypy_asm_gcroot(l_v410); - - mov eax, DWORD PTR ?_constant_always_one_@?1??pypy_asm_gcroot@@9@9 - imul eax, DWORD PTR _l_v410$[esp+24] - -; 1167 : l_a6_1 = l_v411; /* for moving GCs */ -; 1168 : l_v413 = (void*)l_a5_1; - - mov edx, DWORD PTR _l_a5_1$[esp+20] - mov DWORD PTR _l_v413$[esp+24], edx - -; 1169 : l_v414 = pypy_asm_gcroot(l_v413); - - mov eax, DWORD PTR ?_constant_always_one_@?1??pypy_asm_gcroot@@9@9 - imul eax, DWORD PTR _l_v413$[esp+24] - -; 1170 : l_a5_1 = l_v414; /* for moving GCs */ -; 1171 : l_v416 = (void*)l_a4_1; - - mov esi, DWORD PTR _l_a4_1$[esp+20] - mov DWORD PTR _l_v416$[esp+24], esi - -; 1172 : l_v417 = pypy_asm_gcroot(l_v416); - - mov eax, DWORD PTR ?_constant_always_one_@?1??pypy_asm_gcroot@@9@9 - imul eax, DWORD PTR _l_v416$[esp+24] - -; 1173 : l_a4_1 = l_v417; /* for moving GCs */ -; 1174 : l_v419 = RPyField((&pypy_g_ExcData), ed_exc_type); -; 1175 : l_v420 = (l_v419 == NULL); - - cmp DWORD PTR _pypy_g_ExcData, 0 - -; 1176 : if (!l_v420) { - - jne SHORT $LN75@pypy_g_foo - -; 1177 : goto block1; -; 1178 : } -; 1179 : goto block9; -; 1180 : -; 1181 : block9: -; 1182 : OP_INT_SUB(l_rec_1, 1L, l_v421); -; 1183 : pypy_g_foo(l_v421, l_a6_1, l_a5_1, l_a4_1, l_a3_1, l_a2_1, l_a1_1); - - sub DWORD PTR _l_rec_1$[esp+20], 1 - sub DWORD PTR tv419[esp+24], 1 - cmp DWORD PTR _l_rec_1$[esp+20], 0 - mov eax, ebp - mov ebp, DWORD PTR _l_a6_1$[esp+20] - mov ecx, ebx - mov ebx, DWORD PTR _l_a5_1$[esp+20] - mov edx, edi -$block9$34446: - mov edi, esi - mov DWORD PTR _l_a4_1$[esp+20], edx - mov DWORD PTR _l_a5_1$[esp+20], ecx - mov DWORD PTR _l_a6_1$[esp+20], eax -$block0_1$34376: - jg $LL63@pypy_g_foo - pop esi - pop edi - pop ebp - pop ebx - -; 1199 : goto block4; -; 1200 : } - - add esp, 8 - ret 0 -$LN71@pypy_g_foo: -$block0$40426: -$block0$40437: -$block0$40434: -$block2$40415: - -; 1048 : goto block2; -; 1049 : } -; 1050 : goto block1; -; 1051 : -; 1052 : block1: -; 1053 : RPY_DEBUG_RETURN(); -; 1054 : return /* nothing */; -; 1055 : -; 1056 : block2: -; 1057 : pypy_g_stack_check___(); - - mov DWORD PTR _pypy_g_ExcData, OFFSET _pypy_g_exceptions_RuntimeError_vtable - mov DWORD PTR _pypy_g_ExcData+4, OFFSET _pypy_g_exceptions_RuntimeError -$block1$40435: -$block1$40438: -$block1$40427: -$LN75@pypy_g_foo: - pop esi - pop edi - pop ebp - pop ebx -$block1$34379: - -; 1199 : goto block4; -; 1200 : } - - add esp, 8 - ret 0 -_pypy_g_foo ENDP diff -Nru pypy-7.1.1+dfsg/rpython/translator/c/gcc/test/msvc/track9.s pypy-7.3.1+dfsg/rpython/translator/c/gcc/test/msvc/track9.s --- pypy-7.1.1+dfsg/rpython/translator/c/gcc/test/msvc/track9.s 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/translator/c/gcc/test/msvc/track9.s 1970-01-01 00:00:00.000000000 +0000 @@ -1,26 +0,0 @@ -; Function compile flags: /Ogtpy -; COMDAT _pypy_g_ll_join_strs__Signed_arrayPtr -_TEXT SEGMENT -_pypy_g_ll_join_strs__Signed_arrayPtr PROC ; COMDAT - -; 1457 : struct pypy_rpy_string0 *pypy_g_ll_join_strs__Signed_arrayPtr(long l_num_items_0, struct pypy_array0 *l_items_2) { - - sub esp, 8 - push ebx - push ebp - push esi - -; 1458 : pypy_asm_gc_nocollect(open); - - call _open - pop esi - pop ebp -$block4$40052: - pop ebx - -; 1535 : goto block1_back; -; 1536 : } - - add esp, 8 - ret 0 -_pypy_g_ll_join_strs__Signed_arrayPtr ENDP diff -Nru pypy-7.1.1+dfsg/rpython/translator/c/gcc/test/msvc/track_and_esp.s pypy-7.3.1+dfsg/rpython/translator/c/gcc/test/msvc/track_and_esp.s --- pypy-7.1.1+dfsg/rpython/translator/c/gcc/test/msvc/track_and_esp.s 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/translator/c/gcc/test/msvc/track_and_esp.s 1970-01-01 00:00:00.000000000 +0000 @@ -1,474 +0,0 @@ -PUBLIC ??_C@_0BN@BIPHFGBC@pypy_g_ll_math_ll_math_frexp?$AA@ ; `string' -PUBLIC _pypy_g_ll_math_ll_math_frexp -; COMDAT ??_C@_0BN@BIPHFGBC@pypy_g_ll_math_ll_math_frexp?$AA@ -CONST SEGMENT -??_C@_0BN@BIPHFGBC@pypy_g_ll_math_ll_math_frexp?$AA@ DB 'pypy_g_ll_math_l' - DB 'l_math_frexp', 00H ; `string' -; Function compile flags: /Ogtpy -CONST ENDS -; COMDAT _pypy_g_ll_math_ll_math_frexp -_TEXT SEGMENT -_l_mantissa_0$ = -8 ; size = 8 -_l_v21638$ = -8 ; size = 8 -_l_x_14$ = 8 ; size = 8 -_pypy_g_ll_math_ll_math_frexp PROC ; COMDAT - -; 58245: struct pypy_tuple2_0 *pypy_g_ll_math_ll_math_frexp(double l_x_14) { - - push ebp - mov ebp, esp - and esp, -64 ; ffffffc0H - -; 58246: long *l_exp_p_0; double l_mantissa_0; bool_t l_v21641; -; 58247: bool_t l_v21643; bool_t l_v21644; bool_t l_v21646; bool_t l_v21647; -; 58248: bool_t l_v21652; bool_t l_v21653; bool_t l_v21660; bool_t l_v21666; -; 58249: bool_t l_v21670; bool_t l_v21674; bool_t l_v21676; double l_v21638; -; 58250: long l_v21637; long l_v21649; long l_v21651; long l_v21677; -; 58251: long l_v21678; struct pypy_exceptions_Exception0 *l_v21687; -; 58252: struct pypy_header0 *l_v21654; struct pypy_object0 *l_v21682; -; 58253: struct pypy_object0 *l_v21691; struct pypy_object_vtable0 *l_v21665; -; 58254: struct pypy_object_vtable0 *l_v21669; -; 58255: struct pypy_object_vtable0 *l_v21675; -; 58256: struct pypy_object_vtable0 *l_v21683; struct pypy_tuple2_0 *l_v21640; -; 58257: struct pypy_tuple2_0 *l_v21695; void* l_v21639; void* l_v21648; -; 58258: void* l_v21650; void* l_v21656; void* l_v21658; void* l_v21659; -; 58259: void* l_v21668; void* l_v21672; void* l_v21679; void* l_v21688; -; 58260: void* l_v21696; -; 58261: goto block0; -; 58262: -; 58263: block0: -; 58264: l_v21641 = pypy_g_ll_math_ll_math_isnan(l_x_14); - - fld QWORD PTR _l_x_14$[ebp] - sub esp, 52 ; 00000034H - push ebx - push esi - push edi - sub esp, 8 - fstp QWORD PTR [esp] -$block0$88239: - call _pypy_g_ll_math_ll_math_isnan - -; 58265: pypy_asm_gc_nocollect(pypy_g_ll_math_ll_math_isnan); -; 58266: l_v21643 = l_v21641; -; 58267: if (l_v21643) { -; 58268: l_v21637 = 0L; -; 58269: l_v21638 = l_x_14; - - fld QWORD PTR _l_x_14$[ebp] - add esp, 8 - test al, al - -; 58270: goto block3; - - jne SHORT $LN10@pypy_g_ll_@159 - -; 58271: } -; 58272: goto block1; -; 58273: -; 58274: block1: -; 58275: l_v21644 = pypy_g_ll_math_ll_math_isinf(l_x_14); - - sub esp, 8 - fstp QWORD PTR [esp] -$block1$88243: - call _pypy_g_ll_math_ll_math_isinf - add esp, 8 - -; 58276: pypy_asm_gc_nocollect(pypy_g_ll_math_ll_math_isinf); -; 58277: l_v21646 = l_v21644; -; 58278: if (l_v21646) { - - test al, al - je SHORT $block2$88245 - -; 58279: l_v21637 = 0L; -; 58280: l_v21638 = l_x_14; - - fld QWORD PTR _l_x_14$[ebp] -$LN10@pypy_g_ll_@159: - -; 58288: goto block14; -; 58289: } -; 58290: l_v21637 = 0L; - - xor edi, edi -$LN30@pypy_g_ll_@159: - -; 58291: l_v21638 = l_x_14; -; 58292: goto block3; -; 58293: -; 58294: block3: -; 58295: l_v21648 = (&pypy_g_pypy_rpython_memory_gc_semispace_SemiSpaceGC)->ssgc_inst_free; - - mov esi, DWORD PTR _pypy_g_pypy_rpython_memory_gc_semispace_SemiSpaceGC+4 - fstp QWORD PTR _l_v21638$[esp+64] - -; 58296: OP_RAW_MALLOC_USAGE((0 + ROUND_UP_FOR_ALLOCATION(sizeof(struct pypy_tuple2_0), sizeof(struct pypy_forwarding_stub0))), l_v21649); -; 58297: l_v21650 = (&pypy_g_pypy_rpython_memory_gc_semispace_SemiSpaceGC)->ssgc_inst_top_of_space; -; 58298: OP_ADR_DELTA(l_v21650, l_v21648, l_v21651); - - mov eax, DWORD PTR _pypy_g_pypy_rpython_memory_gc_semispace_SemiSpaceGC+12 - sub eax, esi - -; 58299: OP_INT_GT(l_v21649, l_v21651, l_v21652); - - cmp eax, 24 ; 00000018H -$block3$88242: - -; 58300: if (l_v21652) { - - jge $block4$88260 - -; 58334: l_v21695 = l_v21640; -; 58335: goto block8; -; 58336: -; 58337: block8: -; 58338: RPY_DEBUG_RETURN(); -; 58339: return l_v21695; -; 58340: -; 58341: block9: -; 58342: PYPY_DEBUG_RECORD_TRACEBACK("ll_math_ll_math_frexp"); -; 58343: l_v21695 = ((struct pypy_tuple2_0 *) NULL); -; 58344: goto block8; -; 58345: -; 58346: block10: -; 58347: abort(); /* debug_llinterpcall should be unreachable */ -; 58348: l_v21665 = (&pypy_g_ExcData)->ed_exc_type; -; 58349: l_v21666 = (l_v21665 == NULL); -; 58350: if (!l_v21666) { -; 58351: goto block11; -; 58352: } -; 58353: goto block5; -; 58354: -; 58355: block11: -; 58356: PYPY_DEBUG_RECORD_TRACEBACK("ll_math_ll_math_frexp"); -; 58357: l_v21696 = NULL; -; 58358: goto block6; -; 58359: -; 58360: block12: -; 58361: l_v21668 = pypy_g_SemiSpaceGC_obtain_free_space((&pypy_g_pypy_rpython_memory_gc_semispace_SemiSpaceGC), (0 + ROUND_UP_FOR_ALLOCATION(sizeof(struct pypy_tuple2_0), sizeof(struct pypy_forwarding_stub0)))); - - push 24 ; 00000018H - push OFFSET _pypy_g_pypy_rpython_memory_gc_semispace_SemiSpaceGC -$block12$88259: - call _pypy_g_SemiSpaceGC_obtain_free_space - ;; expected {4(%ebp) | 16(%esp), 12(%esp), 8(%esp), (%ebp) | } - -; 58362: l_v21669 = (&pypy_g_ExcData)->ed_exc_type; -; 58363: l_v21670 = (l_v21669 == NULL); - - xor ecx, ecx - add esp, 8 - cmp DWORD PTR _pypy_g_ExcData, ecx - -; 58364: if (!l_v21670) { - - je $LN5@pypy_g_ll_@159 - -; 58368: goto block4; -; 58369: -; 58370: block13: -; 58371: PYPY_DEBUG_RECORD_TRACEBACK("ll_math_ll_math_frexp"); - - mov eax, DWORD PTR _pypydtcount - mov DWORD PTR _pypy_debug_tracebacks[eax*8], OFFSET ?loc@?N@??pypy_g_ll_math_ll_math_frexp@@9@9 - mov DWORD PTR _pypy_debug_tracebacks[eax*8+4], ecx - inc eax - and eax, 8191 ; 00001fffH - mov DWORD PTR _pypy_debug_tracebacks[eax*8], OFFSET ?loc@?8??pypy_g_ll_math_ll_math_frexp@@9@9 - mov DWORD PTR _pypy_debug_tracebacks[eax*8+4], ecx - inc eax - and eax, 8191 ; 00001fffH - mov DWORD PTR _pypydtcount, eax -$block13$88313: -$block9$88285: - xor eax, eax - -; 58423: goto block8; -; 58424: } - - pop edi - pop esi - pop ebx - mov esp, ebp - pop ebp - ret 0 -$block2$88245: - -; 58281: goto block3; -; 58282: } -; 58283: goto block2; -; 58284: -; 58285: block2: -; 58286: OP_FLOAT_IS_TRUE(l_x_14, l_v21647); - - fldz - fld QWORD PTR _l_x_14$[ebp] - fucom ST(1) - fnstsw ax - fstp ST(1) - test ah, 68 ; 00000044H - -; 58287: if (l_v21647) { - - jnp $LN10@pypy_g_ll_@159 - -; 58372: l_v21696 = NULL; -; 58373: goto block6; -; 58374: -; 58375: block14: -; 58376: l_v21672 = pypy_g__ll_malloc_varsize_no_length__Signed_Signed_Sign(1L, (0 + 0), sizeof(long)); - - push 4 - fstp ST(0) - push 0 - push 1 -$block14$88247: - call _pypy_g__ll_malloc_varsize_no_length__Signed_Signed_Sign - ;; expected {4(%ebp) | 20(%esp), 16(%esp), 12(%esp), (%ebp) | } - mov esi, eax - -; 58377: OP_TRACK_ALLOC_START(l_v21672, /* nothing */); - - push OFFSET ??_C@_0BN@BIPHFGBC@pypy_g_ll_math_ll_math_frexp?$AA@ - push esi - call _pypy_debug_alloc_start - ;; expected {4(%ebp) | 28(%esp), 24(%esp), 20(%esp), (%ebp) | } - add esp, 20 ; 00000014H - -; 58378: l_exp_p_0 = (long *)l_v21672; -; 58379: l_v21674 = (l_exp_p_0 != NULL); - - test esi, esi - -; 58380: if (!l_v21674) { - - jne SHORT $block15$88324 - -; 58418: goto block8; -; 58419: -; 58420: block18: -; 58421: PYPY_DEBUG_RECORD_TRACEBACK("ll_math_ll_math_frexp"); - - mov eax, DWORD PTR _pypydtcount - mov DWORD PTR _pypy_debug_tracebacks[eax*8], OFFSET ?loc@?BB@??pypy_g_ll_math_ll_math_frexp@@9@9 - mov DWORD PTR _pypy_debug_tracebacks[eax*8+4], esi - inc eax - and eax, 8191 ; 00001fffH - mov DWORD PTR _pypydtcount, eax -$block18$88323: - -; 58422: l_v21695 = ((struct pypy_tuple2_0 *) NULL); - - xor eax, eax - -; 58423: goto block8; -; 58424: } - - pop edi - pop esi - pop ebx - mov esp, ebp - pop ebp - ret 0 -$block15$88324: - -; 58381: goto block18; -; 58382: } -; 58383: goto block15; -; 58384: -; 58385: block15: -; 58386: l_mantissa_0 = pypy_g_frexp__Float_arrayPtr_star_2(l_x_14, l_exp_p_0); - - fld QWORD PTR _l_x_14$[ebp] - push esi - sub esp, 8 - fstp QWORD PTR [esp] - call _pypy_g_frexp__Float_arrayPtr_star_2 - ;; expected {4(%ebp) | 20(%esp), 16(%esp), 12(%esp), (%ebp) | } - -; 58387: l_v21675 = (&pypy_g_ExcData)->ed_exc_type; -; 58388: l_v21676 = (l_v21675 == NULL); - - mov edi, DWORD PTR _pypy_g_ExcData - fstp QWORD PTR _l_mantissa_0$[esp+76] - add esp, 12 ; 0000000cH - test edi, edi - -; 58389: if (!l_v21676) { - - je SHORT $block16$88328 - -; 58403: -; 58404: block17: -; 58405: l_v21682 = (&pypy_g_ExcData)->ed_exc_value; -; 58406: l_v21683 = (&pypy_g_ExcData)->ed_exc_type; -; 58407: PYPY_DEBUG_CATCH_EXCEPTION("ll_math_ll_math_frexp", l_v21683, l_v21683 == (&pypy_g_py__code_assertion_AssertionError_vtable.ae_super.ae_super.se_super.e_super) || l_v21683 == (&pypy_g_exceptions_NotImplementedError_vtable.nie_super.re_super.se_super.e_super)); - - mov eax, DWORD PTR _pypydtcount - mov ebx, DWORD PTR _pypy_g_ExcData+4 - mov DWORD PTR _pypy_debug_tracebacks[eax*8], OFFSET ?loc@?BA@??pypy_g_ll_math_ll_math_frexp@@9@9 - mov DWORD PTR _pypy_debug_tracebacks[eax*8+4], edi - inc eax - and eax, 8191 ; 00001fffH -$block17$88327: - mov DWORD PTR _pypydtcount, eax - cmp edi, OFFSET _pypy_g_py__code_assertion_AssertionError_vtable - je SHORT $LN1@pypy_g_ll_@159 - cmp edi, OFFSET _pypy_g_exceptions_NotImplementedError_vtable - jne SHORT $LN2@pypy_g_ll_@159 -$LN1@pypy_g_ll_@159: - call _pypy_debug_catch_fatal_exception -$LN2@pypy_g_ll_@159: - -; 58408: (&pypy_g_ExcData)->ed_exc_value = ((struct pypy_object0 *) NULL); - - xor eax, eax - -; 58409: (&pypy_g_ExcData)->ed_exc_type = ((struct pypy_object_vtable0 *) NULL); -; 58410: l_v21687 = (struct pypy_exceptions_Exception0 *)l_v21682; -; 58411: l_v21688 = (void*)l_exp_p_0; -; 58412: OP_TRACK_ALLOC_STOP(l_v21688, /* nothing */); - - push esi - mov DWORD PTR _pypy_g_ExcData+4, eax - mov DWORD PTR _pypy_g_ExcData, eax - call _pypy_debug_alloc_stop - ;; expected {4(%ebp) | 12(%esp), 8(%esp), 4(%esp), (%ebp) | } - -; 58413: OP_RAW_FREE(l_v21688, /* nothing */); - - push esi - call _PyObject_Free - ;; expected {4(%ebp) | 16(%esp), 12(%esp), 8(%esp), (%ebp) | } - -; 58414: l_v21691 = (struct pypy_object0 *)l_v21687; -; 58415: pypy_g_RPyReRaiseException(l_v21683, l_v21691); - - push ebx - push edi - call _pypy_g_RPyReRaiseException - add esp, 16 ; 00000010H - -; 58416: pypy_asm_gc_nocollect(pypy_g_RPyReRaiseException); -; 58417: l_v21695 = ((struct pypy_tuple2_0 *) NULL); - - xor eax, eax - -; 58423: goto block8; -; 58424: } - - pop edi - pop esi - pop ebx - mov esp, ebp - pop ebp - ret 0 -$block16$88328: - -; 58390: goto block17; -; 58391: } -; 58392: goto block16; -; 58393: -; 58394: block16: -; 58395: l_v21677 = RPyBareItem(l_exp_p_0, 0L); -; 58396: l_v21678 = (long)(l_v21677); - - mov edi, DWORD PTR [esi] - -; 58397: l_v21679 = (void*)l_exp_p_0; -; 58398: OP_TRACK_ALLOC_STOP(l_v21679, /* nothing */); - - push esi - call _pypy_debug_alloc_stop - ;; expected {4(%ebp) | 12(%esp), 8(%esp), 4(%esp), (%ebp) | } - -; 58399: OP_RAW_FREE(l_v21679, /* nothing */); - - push esi - call _PyObject_Free - ;; expected {4(%ebp) | 16(%esp), 12(%esp), 8(%esp), (%ebp) | } - -; 58400: l_v21637 = l_v21678; -; 58401: l_v21638 = l_mantissa_0; - - fld QWORD PTR _l_mantissa_0$[esp+72] - add esp, 8 - -; 58402: goto block3; - - jmp $LN30@pypy_g_ll_@159 -$LN5@pypy_g_ll_@159: - -; 58365: goto block13; -; 58366: } -; 58367: l_v21639 = l_v21668; - - mov esi, eax -$block4$88260: -$block5$88263: - -; 58301: goto block12; -; 58302: } -; 58303: l_v21639 = l_v21648; -; 58304: goto block4; -; 58305: -; 58306: block4: -; 58307: OP_INT_IS_TRUE(RUNNING_ON_LLINTERP, l_v21653); -; 58308: if (l_v21653) { -; 58309: goto block10; -; 58310: } -; 58311: goto block5; -; 58312: -; 58313: block5: -; 58314: l_v21654 = (struct pypy_header0 *)l_v21639; -; 58315: RPyField(l_v21654, h_tid) = (GROUP_MEMBER_OFFSET(struct group_pypy_g_typeinfo_s, member20)+0L); - - test esi, esi - jne SHORT $LN18@pypy_g_ll_@159 - call _RPyAbort -$LN18@pypy_g_ll_@159: - -; 58316: OP_ADR_ADD(l_v21639, (0 + ROUND_UP_FOR_ALLOCATION(sizeof(struct pypy_tuple2_0), sizeof(struct pypy_forwarding_stub0))), l_v21656); -; 58317: (&pypy_g_pypy_rpython_memory_gc_semispace_SemiSpaceGC)->ssgc_inst_free = l_v21656; -; 58318: OP_ADR_ADD(l_v21639, 0, l_v21658); -; 58319: l_v21659 = (void*)l_v21658; -; 58320: l_v21696 = l_v21659; -; 58321: goto block6; -; 58322: -; 58323: block6: -; 58324: l_v21640 = (struct pypy_tuple2_0 *)l_v21696; -; 58325: l_v21660 = (l_v21640 != NULL); -; 58326: if (!l_v21660) { -; 58327: goto block9; -; 58328: } -; 58329: goto block7; -; 58330: -; 58331: block7: -; 58332: RPyField(l_v21640, t_item0) = l_v21638; - - fld QWORD PTR _l_v21638$[esp+64] - mov DWORD PTR [esi], 81 ; 00000051H - lea ecx, DWORD PTR [esi+24] - mov DWORD PTR _pypy_g_pypy_rpython_memory_gc_semispace_SemiSpaceGC+4, ecx - fstp QWORD PTR [esi+8] - -; 58333: RPyField(l_v21640, t_item1) = l_v21637; - - mov DWORD PTR [esi+16], edi - -; 58423: goto block8; -; 58424: } - - pop edi - mov eax, esi - pop esi -$block6$88281: -$block8$88289: - pop ebx - mov esp, ebp - pop ebp - ret 0 -_pypy_g_ll_math_ll_math_frexp ENDP -_TEXT ENDS diff -Nru pypy-7.1.1+dfsg/rpython/translator/c/gcc/test/msvc/track_switch0.s pypy-7.3.1+dfsg/rpython/translator/c/gcc/test/msvc/track_switch0.s --- pypy-7.1.1+dfsg/rpython/translator/c/gcc/test/msvc/track_switch0.s 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/translator/c/gcc/test/msvc/track_switch0.s 1970-01-01 00:00:00.000000000 +0000 @@ -1,420 +0,0 @@ -; Function compile flags: /Odtpy -; COMDAT _pypy_g_BuiltinActivation_UwS_UCD_ObjSpace_W_Root_W_Root -_TEXT SEGMENT -tv138 = -116 ; size = 4 -_l_v271568$ = -109 ; size = 1 -_l_v271567$ = -108 ; size = 4 -_l_v271575$ = -104 ; size = 4 -_l_v271551$ = -97 ; size = 1 -_l_v271579$ = -96 ; size = 4 -_l_v271576$ = -89 ; size = 1 -_l_v271572$ = -88 ; size = 4 -_l_v271583$ = -84 ; size = 4 -_l_v271556$ = -80 ; size = 4 -_l_v271559$ = -76 ; size = 4 -_l_v271544$ = -72 ; size = 4 -_l_v271545$ = -68 ; size = 4 -_l_v271580$ = -64 ; size = 4 -_l_v271557$ = -60 ; size = 4 -_l_v271581$ = -56 ; size = 4 -_l_v271553$ = -52 ; size = 4 -_l_v271570$ = -48 ; size = 4 -_l_v271554$ = -42 ; size = 1 -_l_v271565$ = -41 ; size = 1 -_l_v271558$ = -40 ; size = 4 -_l_v271562$ = -33 ; size = 1 -_l_v271561$ = -32 ; size = 4 -_l_v271547$ = -28 ; size = 4 -_l_v271548$ = -24 ; size = 4 -_l_v271573$ = -18 ; size = 1 -_l_v271546$ = -17 ; size = 1 -_l_v271582$ = -16 ; size = 4 -_l_v271550$ = -12 ; size = 4 -_l_v271564$ = -8 ; size = 4 -_l_v271578$ = -4 ; size = 4 -_l_self_596$ = 8 ; size = 4 -_l_scope_w_259$ = 12 ; size = 4 -_pypy_g_BuiltinActivation_UwS_UCD_ObjSpace_W_Root_W_Root PROC ; COMDAT - -; 15629: struct pypy_pypy_interpreter_baseobjspace_W_Root0 *pypy_g_BuiltinActivation_UwS_UCD_ObjSpace_W_Root_W_Root(struct pypy_pypy_interpreter_gateway_BuiltinActivation0 *l_self_596, struct pypy_array1 *l_scope_w_259) { - - push ebp - mov ebp, esp - sub esp, 116 ; 00000074H -$block0$211591: - -; 15630: bool_t l_v271551; bool_t l_v271554; bool_t l_v271562; -; 15631: bool_t l_v271565; bool_t l_v271568; bool_t l_v271573; -; 15632: bool_t l_v271576; char l_v271546; long l_v271550; long l_v271553; -; 15633: long l_v271564; long l_v271567; long l_v271572; long l_v271575; -; 15634: struct pypy_object0 *l_v271556; struct pypy_object0 *l_v271570; -; 15635: struct pypy_object0 *l_v271578; -; 15636: struct pypy_object_vtable0 *l_v271561; -; 15637: struct pypy_pypy_interpreter_baseobjspace_W_Root0 *l_v271544; -; 15638: struct pypy_pypy_interpreter_baseobjspace_W_Root0 *l_v271545; -; 15639: struct pypy_pypy_interpreter_baseobjspace_W_Root0 *l_v271557; -; 15640: struct pypy_pypy_interpreter_baseobjspace_W_Root0 *l_v271579; -; 15641: struct pypy_pypy_interpreter_baseobjspace_W_Root0 *l_v271580; -; 15642: struct pypy_pypy_interpreter_baseobjspace_W_Root0 *l_v271581; -; 15643: struct pypy_pypy_interpreter_baseobjspace_W_Root0 *l_v271582; -; 15644: struct pypy_pypy_interpreter_baseobjspace_W_Root0 *l_v271583; -; 15645: struct pypy_pypy_interpreter_gateway_BuiltinActivation_UwS_UCD0 *l_v271548; -; 15646: struct pypy_pypy_module_unicodedata_interp_ucd_UCD0 *l_v271547; -; 15647: void* l_v271558; void* l_v271559; -; 15648: -; 15649: block0: -; 15650: l_v271548 = (struct pypy_pypy_interpreter_gateway_BuiltinActivation_UwS_UCD0 *)l_self_596; - - mov eax, DWORD PTR _l_self_596$[ebp] - mov DWORD PTR _l_v271548$[ebp], eax - -; 15651: l_v271546 = RPyField(l_v271548, bausucdoswrwr_inst_behavior); - - mov ecx, DWORD PTR _l_v271548$[ebp] - mov dl, BYTE PTR [ecx+8] - mov BYTE PTR _l_v271546$[ebp], dl - -; 15652: RPyAssert(1, "unexpectedly negative list getitem index"); -; 15653: l_v271550 = l_scope_w_259->length; - - mov eax, DWORD PTR _l_scope_w_259$[ebp] - mov ecx, DWORD PTR [eax+4] - mov DWORD PTR _l_v271550$[ebp], ecx - -; 15654: OP_INT_LT(0L, l_v271550, l_v271551); - - xor edx, edx - cmp DWORD PTR _l_v271550$[ebp], 0 - setg dl - mov BYTE PTR _l_v271551$[ebp], dl - -; 15655: RPyAssert(l_v271551, "list getitem index out of bound"); -; 15656: l_v271553 = l_scope_w_259->length; - - mov eax, DWORD PTR _l_scope_w_259$[ebp] - mov ecx, DWORD PTR [eax+4] - mov DWORD PTR _l_v271553$[ebp], ecx - -; 15657: OP_INT_LT(0L, l_v271553, l_v271554); - - xor edx, edx - cmp DWORD PTR _l_v271553$[ebp], 0 - setg dl - mov BYTE PTR _l_v271554$[ebp], dl - -; 15658: RPyAssert(l_v271554, "fixed getitem out of bounds"); -; 15659: l_v271556 = RPyItem(l_scope_w_259, 0L); - - mov eax, DWORD PTR _l_scope_w_259$[ebp] - mov ecx, DWORD PTR [eax+8] - mov DWORD PTR _l_v271556$[ebp], ecx - -; 15660: l_v271557 = (struct pypy_pypy_interpreter_baseobjspace_W_Root0 *)l_v271556; - - mov edx, DWORD PTR _l_v271556$[ebp] - mov DWORD PTR _l_v271557$[ebp], edx - -; 15661: l_v271547 = pypy_g_interp_w__UCD(l_v271557, 0); - - push 0 - mov eax, DWORD PTR _l_v271557$[ebp] - push eax - call _pypy_g_interp_w__UCD - ;; expected {4(%ebp) | %ebx, %esi, %edi, (%ebp) | 12(%ebp)} - add esp, 8 - mov DWORD PTR _l_v271547$[ebp], eax - -; 15662: l_v271558 = (void*)l_scope_w_259; - - mov ecx, DWORD PTR _l_scope_w_259$[ebp] - mov DWORD PTR _l_v271558$[ebp], ecx - -; 15663: l_v271559 = pypy_asm_gcroot(l_v271558); - - mov eax, DWORD PTR ?_constant_always_one_@?1??pypy_asm_gcroot@@9@9 - imul eax, DWORD PTR _l_v271558$[ebp] - mov edx, DWORD PTR _l_v271558$[ebp] - mov DWORD PTR _l_v271559$[ebp], edx - -; 15664: l_scope_w_259 = l_v271559; /* for moving GCs */ - - mov eax, DWORD PTR _l_v271559$[ebp] - mov DWORD PTR _l_scope_w_259$[ebp], eax - -; 15665: l_v271561 = RPyField((&pypy_g_ExcData), ed_exc_type); - - mov ecx, DWORD PTR _pypy_g_ExcData - mov DWORD PTR _l_v271561$[ebp], ecx - -; 15666: l_v271562 = (l_v271561 == NULL); - - xor edx, edx - cmp DWORD PTR _l_v271561$[ebp], 0 - sete dl - mov BYTE PTR _l_v271562$[ebp], dl - -; 15667: if (!l_v271562) { - - movzx eax, BYTE PTR _l_v271562$[ebp] - test eax, eax - jne SHORT $block1$211600 - -; 15668: l_v271583 = ((struct pypy_pypy_interpreter_baseobjspace_W_Root0 *) NULL); - - mov DWORD PTR _l_v271583$[ebp], 0 - -; 15669: goto block3; - - jmp $block3$211599 -$block1$211600: - -; 15670: } -; 15671: goto block1; -; 15672: -; 15673: block1: -; 15674: RPyAssert(1, "unexpectedly negative list getitem index"); -; 15675: l_v271564 = l_scope_w_259->length; - - mov ecx, DWORD PTR _l_scope_w_259$[ebp] - mov edx, DWORD PTR [ecx+4] - mov DWORD PTR _l_v271564$[ebp], edx - -; 15676: OP_INT_LT(1L, l_v271564, l_v271565); - - xor eax, eax - cmp DWORD PTR _l_v271564$[ebp], 1 - setg al - mov BYTE PTR _l_v271565$[ebp], al - -; 15677: RPyAssert(l_v271565, "list getitem index out of bound"); -; 15678: l_v271567 = l_scope_w_259->length; - - mov ecx, DWORD PTR _l_scope_w_259$[ebp] - mov edx, DWORD PTR [ecx+4] - mov DWORD PTR _l_v271567$[ebp], edx - -; 15679: OP_INT_LT(1L, l_v271567, l_v271568); - - xor eax, eax - cmp DWORD PTR _l_v271567$[ebp], 1 - setg al - mov BYTE PTR _l_v271568$[ebp], al - -; 15680: RPyAssert(l_v271568, "fixed getitem out of bounds"); -; 15681: l_v271570 = RPyItem(l_scope_w_259, 1L); - - mov ecx, DWORD PTR _l_scope_w_259$[ebp] - mov edx, DWORD PTR [ecx+12] - mov DWORD PTR _l_v271570$[ebp], edx - -; 15682: l_v271544 = (struct pypy_pypy_interpreter_baseobjspace_W_Root0 *)l_v271570; - - mov eax, DWORD PTR _l_v271570$[ebp] - mov DWORD PTR _l_v271544$[ebp], eax - -; 15683: RPyAssert(1, "unexpectedly negative list getitem index"); -; 15684: l_v271572 = l_scope_w_259->length; - - mov ecx, DWORD PTR _l_scope_w_259$[ebp] - mov edx, DWORD PTR [ecx+4] - mov DWORD PTR _l_v271572$[ebp], edx - -; 15685: OP_INT_LT(2L, l_v271572, l_v271573); - - xor eax, eax - cmp DWORD PTR _l_v271572$[ebp], 2 - setg al - mov BYTE PTR _l_v271573$[ebp], al - -; 15686: RPyAssert(l_v271573, "list getitem index out of bound"); -; 15687: l_v271575 = l_scope_w_259->length; - - mov ecx, DWORD PTR _l_scope_w_259$[ebp] - mov edx, DWORD PTR [ecx+4] - mov DWORD PTR _l_v271575$[ebp], edx - -; 15688: OP_INT_LT(2L, l_v271575, l_v271576); - - xor eax, eax - cmp DWORD PTR _l_v271575$[ebp], 2 - setg al - mov BYTE PTR _l_v271576$[ebp], al - -; 15689: RPyAssert(l_v271576, "fixed getitem out of bounds"); -; 15690: l_v271578 = RPyItem(l_scope_w_259, 2L); - - mov ecx, DWORD PTR _l_scope_w_259$[ebp] - mov edx, DWORD PTR [ecx+16] - mov DWORD PTR _l_v271578$[ebp], edx - -; 15691: l_v271545 = (struct pypy_pypy_interpreter_baseobjspace_W_Root0 *)l_v271578; - - mov eax, DWORD PTR _l_v271578$[ebp] - mov DWORD PTR _l_v271545$[ebp], eax - -; 15692: switch (l_v271546) { - - movsx ecx, BYTE PTR _l_v271546$[ebp] - mov DWORD PTR tv138[ebp], ecx - cmp DWORD PTR tv138[ebp], 3 - ja SHORT $LN1@pypy_g_Bui@2 - mov edx, DWORD PTR tv138[ebp] - jmp DWORD PTR $LN14@pypy_g_Bui@2[edx*4] -$LN5@pypy_g_Bui@2: - -; 15693: case 0: -; 15694: goto block2; - - jmp SHORT $block2$211608 -$LN4@pypy_g_Bui@2: - -; 15695: case 1: -; 15696: goto block4; - - jmp SHORT $block4$211610 -$LN3@pypy_g_Bui@2: - -; 15697: case 2: -; 15698: goto block5; - - jmp SHORT $block5$211612 -$LN2@pypy_g_Bui@2: - -; 15699: case 3: -; 15700: goto block6; - - jmp $block6$211614 -$LN1@pypy_g_Bui@2: - -; 15701: default: -; 15702: assert(!"bad switch!!"); - - mov eax, OFFSET ??_C@_0N@PGLFNKFI@bad?5switch?$CB?$CB?$AA@ - test eax, eax - je SHORT $block2$211608 - push 15702 ; 00003d56H - push OFFSET ??_C@_1BO@DMBFIACJ@?$AAi?$AAm?$AAp?$AAl?$AAe?$AAm?$AAe?$AAn?$AAt?$AA_?$AA1?$AA1?$AA?4?$AAc?$AA?$AA@ - push OFFSET ??_C@_1CA@EIJBLFPJ@?$AA?$CB?$AA?$CC?$AAb?$AAa?$AAd?$AA?5?$AAs?$AAw?$AAi?$AAt?$AAc?$AAh?$AA?$CB?$AA?$CB?$AA?$CC?$AA?$AA@ - call DWORD PTR __imp___wassert - add esp, 12 ; 0000000cH -$block2$211608: - -; 15703: } -; 15704: -; 15705: block2: -; 15706: l_v271579 = pypy_g_UCD_digit(l_v271547, l_v271544, l_v271545); - - mov edx, DWORD PTR _l_v271545$[ebp] - push edx - mov eax, DWORD PTR _l_v271544$[ebp] - push eax - mov ecx, DWORD PTR _l_v271547$[ebp] - push ecx - call _pypy_g_UCD_digit - ;; expected {4(%ebp) | %ebx, %esi, %edi, (%ebp) | } - add esp, 12 ; 0000000cH - mov DWORD PTR _l_v271579$[ebp], eax - -; 15707: l_v271583 = l_v271579; - - mov edx, DWORD PTR _l_v271579$[ebp] - mov DWORD PTR _l_v271583$[ebp], edx -$block3$211599: - -; 15708: goto block3; -; 15709: -; 15710: block3: -; 15711: RPY_DEBUG_RETURN(); -; 15712: return l_v271583; - - mov eax, DWORD PTR _l_v271583$[ebp] - jmp SHORT $LN9@pypy_g_Bui@2 -$block4$211610: - -; 15713: -; 15714: block4: -; 15715: l_v271580 = pypy_g_UCD_name(l_v271547, l_v271544, l_v271545); - - mov eax, DWORD PTR _l_v271545$[ebp] - push eax - mov ecx, DWORD PTR _l_v271544$[ebp] - push ecx - mov edx, DWORD PTR _l_v271547$[ebp] - push edx - call _pypy_g_UCD_name - ;; expected {4(%ebp) | %ebx, %esi, %edi, (%ebp) | } - add esp, 12 ; 0000000cH - mov DWORD PTR _l_v271580$[ebp], eax - -; 15716: l_v271583 = l_v271580; - - mov eax, DWORD PTR _l_v271580$[ebp] - mov DWORD PTR _l_v271583$[ebp], eax - -; 15717: goto block3; - - jmp SHORT $block3$211599 -$block5$211612: - -; 15718: -; 15719: block5: -; 15720: l_v271581 = pypy_g_UCD_decimal(l_v271547, l_v271544, l_v271545); - - mov ecx, DWORD PTR _l_v271545$[ebp] - push ecx - mov edx, DWORD PTR _l_v271544$[ebp] - push edx - mov eax, DWORD PTR _l_v271547$[ebp] - push eax - call _pypy_g_UCD_decimal - ;; expected {4(%ebp) | %ebx, %esi, %edi, (%ebp) | } - add esp, 12 ; 0000000cH - mov DWORD PTR _l_v271581$[ebp], eax - -; 15721: l_v271583 = l_v271581; - - mov ecx, DWORD PTR _l_v271581$[ebp] - mov DWORD PTR _l_v271583$[ebp], ecx - -; 15722: goto block3; - - jmp SHORT $block3$211599 -$block6$211614: - -; 15723: -; 15724: block6: -; 15725: l_v271582 = pypy_g_UCD_numeric(l_v271547, l_v271544, l_v271545); - - mov edx, DWORD PTR _l_v271545$[ebp] - push edx - mov eax, DWORD PTR _l_v271544$[ebp] - push eax - mov ecx, DWORD PTR _l_v271547$[ebp] - push ecx - call _pypy_g_UCD_numeric - ;; expected {4(%ebp) | %ebx, %esi, %edi, (%ebp) | } - add esp, 12 ; 0000000cH - mov DWORD PTR _l_v271582$[ebp], eax - -; 15726: l_v271583 = l_v271582; - - mov edx, DWORD PTR _l_v271582$[ebp] - mov DWORD PTR _l_v271583$[ebp], edx - -; 15727: goto block3; - - jmp SHORT $block3$211599 -$LN9@pypy_g_Bui@2: - -; 15728: } - - mov esp, ebp - pop ebp - ret 0 - npad 3 -$LN14@pypy_g_Bui@2: - DD $LN5@pypy_g_Bui@2 - DD $LN4@pypy_g_Bui@2 - DD $LN3@pypy_g_Bui@2 - DD $LN2@pypy_g_Bui@2 -_pypy_g_BuiltinActivation_UwS_UCD_ObjSpace_W_Root_W_Root ENDP diff -Nru pypy-7.1.1+dfsg/rpython/translator/c/gcc/test/test_asmgcroot.py pypy-7.3.1+dfsg/rpython/translator/c/gcc/test/test_asmgcroot.py --- pypy-7.1.1+dfsg/rpython/translator/c/gcc/test/test_asmgcroot.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/translator/c/gcc/test/test_asmgcroot.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,270 +0,0 @@ -import py -import sys, os, gc -from rpython.translator.c.test import test_newgc -from rpython.translator.translator import TranslationContext -from rpython.translator.c.genc import CStandaloneBuilder -from rpython.annotator.listdef import s_list_of_strings -from rpython.conftest import option -from rpython.translator.tool.cbuild import ExternalCompilationInfo -from rpython.translator.platform import platform as compiler -from rpython.rlib.rarithmetic import is_emulated_long -from rpython.rtyper.lltypesystem import lltype, rffi -from rpython.rlib.entrypoint import entrypoint_highlevel, secondary_entrypoints -from rpython.rtyper.lltypesystem.lloperation import llop - -_MSVC = compiler.name == "msvc" -_MINGW = compiler.name == "mingw32" -_WIN32 = _MSVC or _MINGW -_WIN64 = _WIN32 and is_emulated_long -# XXX get rid of 'is_emulated_long' and have a real config here. - -class AbstractTestAsmGCRoot: - # the asmgcroot gc transformer doesn't generate gc_reload_possibly_moved - # instructions: - should_be_moving = False - - @classmethod - def make_config(cls): - if _MSVC: - py.test.skip("all asmgcroot tests disabled for MSVC") - from rpython.config.translationoption import get_combined_translation_config - config = get_combined_translation_config(translating=True) - config.translation.gc = cls.gcpolicy - config.translation.gcrootfinder = "asmgcc" - config.translation.taggedpointers = getattr(cls, "taggedpointers", False) - return config - - @classmethod - def _makefunc_str_int(cls, func): - def main(argv): - arg0 = argv[1] - arg1 = int(argv[2]) - try: - res = func(arg0, arg1) - except MemoryError: - print 'Result: MemoryError' - else: - print 'Result: "%s"' % (res,) - return 0 - config = cls.make_config() - t = TranslationContext(config=config) - a = t.buildannotator() - sec_ep = getattr(cls, 'secondary_entrypoints', []) - for f, inputtypes in sec_ep: - a.build_types(f, inputtypes, False) - a.build_types(main, [s_list_of_strings]) - t.buildrtyper().specialize() - t.checkgraphs() - - cbuilder = CStandaloneBuilder(t, main, config=config, - secondary_entrypoints=sec_ep) - c_source_filename = cbuilder.generate_source( - defines = cbuilder.DEBUG_DEFINES) - cls._patch_makefile(cbuilder.targetdir) - if option.view: - t.view() - exe_name = cbuilder.compile() - - def run(arg0, arg1, runner=None): - if runner is not None: - py.test.skip("unsupported test: runner=%r" % (runner,)) - lines = [] - print >> sys.stderr, 'RUN: starting', exe_name, arg0, arg1 - if sys.platform == 'win32': - redirect = ' 2> NUL' - else: - redirect = '' - if config.translation.shared and os.name == 'posix': - library_path = exe_name.dirpath() - if sys.platform == 'darwin': - env = 'DYLD_LIBRARY_PATH="%s" ' % library_path - else: - env = 'LD_LIBRARY_PATH="%s" ' % library_path - else: - env = '' - cwd = os.getcwd() - try: - os.chdir(str(exe_name.dirpath())) - g = os.popen( - '%s"%s" %s %d%s' % (env, exe_name, arg0, arg1, redirect), 'r') - finally: - os.chdir(cwd) - for line in g: - print >> sys.stderr, 'RUN:', line.rstrip() - lines.append(line) - g.close() - if not lines: - py.test.fail("no output from subprocess") - if not lines[-1].startswith('Result:'): - py.test.fail("unexpected output from subprocess") - result = lines[-1][len('Result:'):].strip() - if result == 'MemoryError': - raise MemoryError("subprocess got an RPython MemoryError") - if result.startswith('"') and result.endswith('"'): - return result[1:-1] - else: - return int(result) - return run - - @classmethod - def _patch_makefile(cls, targetdir): - # for testing, patch the Makefile to add the -r option to - # trackgcroot.py. - makefile = targetdir.join('Makefile') - f = makefile.open() - lines = f.readlines() - f.close() - found = False - for i in range(len(lines)): - if 'trackgcroot.py' in lines[i]: - lines[i] = lines[i].replace('trackgcroot.py', - 'trackgcroot.py -r') - found = True - assert found - f = makefile.open('w') - f.writelines(lines) - f.close() - - if sys.platform == 'win32': - def test_callback_with_collect(self): - py.test.skip("No libffi yet with mingw32") - - def define_callback_with_collect(cls): - return lambda: 0 - -class TestAsmGCRootWithSemiSpaceGC(AbstractTestAsmGCRoot, - test_newgc.TestSemiSpaceGC): - # for the individual tests see - # ====> ../../test/test_newgc.py - secondary_entrypoints = [] - - def define_large_function(cls): - class A(object): - def __init__(self): - self.x = 0 - d = dict(A=A) - exec ("def g(a):\n" + - " a.x += 1\n" * 1000 + - " return A()\n" - ) in d - g = d['g'] - def f(): - a = A() - g(a) - return a.x - return f - - def test_large_function(self): - res = self.run('large_function') - assert res == 1000 - - def define_callback_simple(cls): - c_source = py.code.Source(""" - int mystuff(int(*cb)(int, int)) - { - return cb(40, 2) + cb(3, 4); - } - """) - eci = ExternalCompilationInfo(separate_module_sources=[c_source]) - S = lltype.GcStruct('S', ('x', lltype.Signed)) - CALLBACK = lltype.FuncType([lltype.Signed, lltype.Signed], - lltype.Signed) - z = rffi.llexternal('mystuff', [lltype.Ptr(CALLBACK)], lltype.Signed, - compilation_info=eci) - - def mycallback(a, b): - gc.collect() - return a + b - - def f(): - p = lltype.malloc(S) - p.x = 100 - result = z(mycallback) - return result * p.x - - return f - - def test_callback_simple(self): - res = self.run('callback_simple') - assert res == 4900 - - def define_secondary_entrypoint_callback(cls): - # XXX this is baaaad, cleanup global state - try: - del secondary_entrypoints["x42"] - except KeyError: - pass - - @entrypoint_highlevel("x42", [lltype.Signed, lltype.Signed], - c_name='callback') - def mycallback(a, b): - gc.collect() - return a + b - - c_source = py.code.Source(""" - int mystuff2() - { - return callback(40, 2) + callback(3, 4); - } - """) - - eci = ExternalCompilationInfo(separate_module_sources=[c_source]) - z = rffi.llexternal('mystuff2', [], lltype.Signed, - compilation_info=eci) - S = lltype.GcStruct('S', ('x', lltype.Signed)) - - cls.secondary_entrypoints = secondary_entrypoints["x42"] - - def f(): - p = lltype.malloc(S) - p.x = 100 - result = z() - return result * p.x - - return f - - def test_secondary_entrypoint_callback(self): - res = self.run('secondary_entrypoint_callback') - assert res == 4900 - -class TestAsmGCRootWithSemiSpaceGC_Mingw32(TestAsmGCRootWithSemiSpaceGC): - # for the individual tests see - # ====> ../../test/test_newgc.py - - @classmethod - def setup_class(cls): - if sys.platform != 'win32': - py.test.skip("mingw32 specific test") - if not ('mingw' in os.popen('gcc --version').read() and - 'GNU' in os.popen('make --version').read()): - py.test.skip("mingw32 and MSYS are required for this test") - - test_newgc.TestSemiSpaceGC.setup_class.im_func(cls) - - @classmethod - def make_config(cls): - config = TestAsmGCRootWithSemiSpaceGC.make_config() - config.translation.cc = 'mingw32' - return config - - - def test_callback_with_collect(self): - py.test.skip("No libffi yet with mingw32") - - def define_callback_with_collect(cls): - return lambda: 0 - -#class TestAsmGCRootWithSemiSpaceGC_Shared(TestAsmGCRootWithSemiSpaceGC): -# @classmethod -# def make_config(cls): -# config = TestAsmGCRootWithSemiSpaceGC.make_config() -# config.translation.shared = True -# return config - -class TestAsmGCRootWithHybridTagged(AbstractTestAsmGCRoot, - test_newgc.TestHybridTaggedPointers): - pass - -class TestAsmGCRootWithIncrementalMinimark(AbstractTestAsmGCRoot, - test_newgc.TestIncrementalMiniMarkGC): - pass diff -Nru pypy-7.1.1+dfsg/rpython/translator/c/gcc/test/test_thread.py pypy-7.3.1+dfsg/rpython/translator/c/gcc/test/test_thread.py --- pypy-7.1.1+dfsg/rpython/translator/c/gcc/test/test_thread.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/translator/c/gcc/test/test_thread.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,18 +0,0 @@ -import py -import sys, os -from rpython.translator.c.test import test_standalone - -def setup_module(module): - if sys.platform == 'win32': - if not ('mingw' in os.popen('gcc --version').read() and - 'GNU' in os.popen('make --version').read()): - py.test.skip("mingw32 and MSYS are required for asmgcc on Windows") - -class TestThreadedAsmGcc(test_standalone.TestThread): - gcrootfinder = 'asmgcc' - - def setup_class(cls): - if sys.platform == 'win32': - from rpython.config.translationoption import get_combined_translation_config - cls.config = get_combined_translation_config(translating=True) - cls.config.translation.cc = 'mingw32' diff -Nru pypy-7.1.1+dfsg/rpython/translator/c/gcc/test/test_trackgcroot.py pypy-7.3.1+dfsg/rpython/translator/c/gcc/test/test_trackgcroot.py --- pypy-7.1.1+dfsg/rpython/translator/c/gcc/test/test_trackgcroot.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/translator/c/gcc/test/test_trackgcroot.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,180 +0,0 @@ -import py -import sys, re -from rpython.translator.c.gcc.trackgcroot import LOC_NOWHERE, LOC_REG -from rpython.translator.c.gcc.trackgcroot import LOC_EBP_PLUS, LOC_EBP_MINUS -from rpython.translator.c.gcc.trackgcroot import LOC_ESP_PLUS -from rpython.translator.c.gcc.trackgcroot import ElfAssemblerParser -from rpython.translator.c.gcc.trackgcroot import DarwinAssemblerParser -from rpython.translator.c.gcc.trackgcroot import PARSERS -from rpython.translator.c.gcc.trackgcroot import ElfFunctionGcRootTracker32 -from StringIO import StringIO -import py.test - -this_dir = py.path.local(__file__).dirpath() - - -def test_format_location(): - cls = ElfFunctionGcRootTracker32 - assert cls.format_location(LOC_NOWHERE) == '?' - assert cls.format_location(LOC_REG | (1<<2)) == '%ebx' - assert cls.format_location(LOC_REG | (2<<2)) == '%esi' - assert cls.format_location(LOC_REG | (3<<2)) == '%edi' - assert cls.format_location(LOC_REG | (4<<2)) == '%ebp' - assert cls.format_location(LOC_EBP_PLUS + 0) == '(%ebp)' - assert cls.format_location(LOC_EBP_PLUS + 4) == '4(%ebp)' - assert cls.format_location(LOC_EBP_MINUS + 4) == '-4(%ebp)' - assert cls.format_location(LOC_ESP_PLUS + 0) == '(%esp)' - assert cls.format_location(LOC_ESP_PLUS + 4) == '4(%esp)' - -def test_format_callshape(): - cls = ElfFunctionGcRootTracker32 - expected = ('{4(%ebp) ' # position of the return address - '| 8(%ebp), 12(%ebp), 16(%ebp), 20(%ebp) ' # 4 saved regs - '| 24(%ebp), 28(%ebp)}') # GC roots - assert cls.format_callshape((LOC_EBP_PLUS+4, - LOC_EBP_PLUS+8, - LOC_EBP_PLUS+12, - LOC_EBP_PLUS+16, - LOC_EBP_PLUS+20, - LOC_EBP_PLUS+24, - LOC_EBP_PLUS+28)) == expected - -def test_compress_callshape(): - cls = ElfFunctionGcRootTracker32 - shape = (1, 127, 0x1234, 0x5678, 0x234567, - 0x765432, 0x61626364, 0x41424344) - bytes = list(cls.compress_callshape(shape)) - print bytes - assert len(bytes) == 1+1+2+3+4+4+5+5+1 - assert cls.decompress_callshape(bytes) == list(shape) - -def test_find_functions_elf(): - source = """\ -\t.p2align 4,,15 -.globl pypy_g_make_tree -\t.type\tpypy_g_make_tree, @function -\tFOO -\t.size\tpypy_g_make_tree, .-pypy_g_make_tree - -\t.p2align 4,,15 -.globl pypy_fn2 -\t.type\tpypy_fn2, @function -\tBAR -\t.size\tpypy_fn2, .-pypy_fn2 -\tMORE STUFF -""" - lines = source.splitlines(True) - parts = list(ElfAssemblerParser().find_functions(iter(lines))) - assert len(parts) == 5 - assert parts[0] == (False, lines[:2]) - assert parts[1] == (True, lines[2:5]) - assert parts[2] == (False, lines[5:8]) - assert parts[3] == (True, lines[8:11]) - assert parts[4] == (False, lines[11:]) - -def test_find_functions_darwin(): - source = """\ -\t.text -\t.align 4,0x90 -.globl _pypy_g_ll_str__StringR_Ptr_GcStruct_rpy_strin_rpy_strin -_pypy_g_ll_str__StringR_Ptr_GcStruct_rpy_strin_rpy_strin: -L0: -\tFOO -\t.align 4,0x90 -_static: -\tSTATIC -\t.align 4,0x90 -.globl _pypy_g_ll_issubclass__object_vtablePtr_object_vtablePtr -_pypy_g_ll_issubclass__object_vtablePtr_object_vtablePtr: -\tBAR -\t.cstring -\t.ascii "foo" -\t.text -\t.align 4,0x90 -.globl _pypy_g_RPyRaiseException -_pypy_g_RPyRaiseException: -\tBAZ -\t.section stuff -""" - lines = source.splitlines(True) - parts = list(DarwinAssemblerParser().find_functions(iter(lines))) - assert len(parts) == 6 - assert parts[0] == (False, lines[:3]) - assert parts[1] == (True, lines[3:7]) - assert parts[2] == (True, lines[7:11]) - assert parts[3] == (True, lines[11:18]) - assert parts[4] == (True, lines[18:20]) - assert parts[5] == (False, lines[20:]) - -def test_computegcmaptable(): - tests = [] - for format in ('elf', 'elf64', 'darwin', 'darwin64', 'msvc'): - for path in this_dir.join(format).listdir("track*.s"): - n = path.purebasename[5:] - try: - n = int(n) - except ValueError: - pass - tests.append((format, n, path)) - tests.sort() - for format, _, path in tests: - yield check_computegcmaptable, format, path - - -r_expected = re.compile(r"\s*;;\s*expected\s+([{].+[}])") -r_gcroot_constant = re.compile(r";\tmov\t.+, .+_constant_always_one_") - -def check_computegcmaptable(format, path): - if format == 'msvc': - r_globallabel = re.compile(r"([\w]+)::") - elif format == 'darwin' or format == 'darwin64': - py.test.skip("disabled on OS/X's terribly old gcc") - else: - r_globallabel = re.compile(r"([\w.]+)=[.]+") - print - print path.dirpath().basename + '/' + path.basename - lines = path.readlines() - expectedlines = lines[:] - tracker = PARSERS[format].FunctionGcRootTracker(lines) - table = tracker.computegcmaptable(verbose=sys.maxint) - tabledict = {} - seen = {} - for entry in table: - print '%s: %s' % (entry[0], tracker.format_callshape(entry[1])) - tabledict[entry[0]] = entry[1] - # find the ";; expected" lines - prevline = "" - for i, line in enumerate(lines): - match = r_expected.match(line) - if match: - expected = match.group(1) - prevmatch = r_globallabel.match(prevline) - assert prevmatch, "the computed table is not complete" - label = prevmatch.group(1) - assert label in tabledict - got = tabledict[label] - assert tracker.format_callshape(got) == expected - seen[label] = True - if format == 'msvc': - expectedlines.insert(i-2, 'PUBLIC\t%s\n' % (label,)) - expectedlines.insert(i-1, '%s::\n' % (label,)) - else: - expectedlines.insert(i-3, '\t.globl\t%s\n' % (label,)) - expectedlines.insert(i-2, '\t.hidden\t%s\n' % (label,)) - expectedlines.insert(i-1, '%s=.+%d\n' % (label, - tracker.OFFSET_LABELS)) - if format == 'msvc' and r_gcroot_constant.match(line): - expectedlines[i] = ';' + expectedlines[i] - expectedlines[i+1] = (expectedlines[i+1] - .replace('\timul\t', '\tmov\t') - + '\t; GCROOT\n') - prevline = line - assert len(seen) == len(tabledict), ( - "computed table contains unexpected entries:\n%r" % - [key for key in tabledict if key not in seen]) - print '--------------- got ---------------' - print ''.join(lines) - print '------------- expected ------------' - print ''.join(expectedlines) - print '-----------------------------------' - assert lines == expectedlines diff -Nru pypy-7.1.1+dfsg/rpython/translator/c/gcc/trackgcroot.py pypy-7.3.1+dfsg/rpython/translator/c/gcc/trackgcroot.py --- pypy-7.1.1+dfsg/rpython/translator/c/gcc/trackgcroot.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/translator/c/gcc/trackgcroot.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,2104 +0,0 @@ -#! /usr/bin/env python -import re, sys, os, random - -sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..', '..', '..', '..')) - -from rpython.translator.c.gcc.instruction import Insn, Label, InsnCall, InsnRet -from rpython.translator.c.gcc.instruction import InsnFunctionStart, InsnStop -from rpython.translator.c.gcc.instruction import InsnSetLocal, InsnCopyLocal -from rpython.translator.c.gcc.instruction import InsnPrologue, InsnEpilogue -from rpython.translator.c.gcc.instruction import InsnGCROOT, InsnCondJump -from rpython.translator.c.gcc.instruction import InsnStackAdjust, InsnPushed -from rpython.translator.c.gcc.instruction import InsnCannotFollowEsp -from rpython.translator.c.gcc.instruction import LocalVar, somenewvalue -from rpython.translator.c.gcc.instruction import frameloc_esp, frameloc_ebp -from rpython.translator.c.gcc.instruction import LOC_REG, LOC_NOWHERE, LOC_MASK -from rpython.translator.c.gcc.instruction import LOC_EBP_PLUS, LOC_EBP_MINUS -from rpython.translator.c.gcc.instruction import LOC_ESP_PLUS - -class FunctionGcRootTracker(object): - skip = 0 - COMMENT = "([#;].*)?" - - @classmethod - def init_regexp(cls): - cls.r_label = re.compile(cls.LABEL+"[:]\s*$") - cls.r_globl = re.compile(r"\t[.]globl\t"+cls.LABEL+"\s*$") - cls.r_globllabel = re.compile(cls.LABEL+r"=[.][+]%d\s*$"%cls.OFFSET_LABELS) - - cls.r_insn = re.compile(r"\t([a-z]\w*)\s") - cls.r_unaryinsn = re.compile(r"\t[a-z]\w*\s+("+cls.OPERAND+")\s*" + cls.COMMENT + "$") - cls.r_binaryinsn = re.compile(r"\t[a-z]\w*\s+(?P<source>"+cls.OPERAND+"),\s*(?P<target>"+cls.OPERAND+")\s*$") - - cls.r_jump = re.compile(r"\tj\w+\s+"+cls.LABEL+"\s*" + cls.COMMENT + "$") - cls.r_jmp_switch = re.compile(r"\tjmp\t[*]") - cls.r_jmp_source = re.compile(r"\d*[(](%[\w]+)[,)]") - - def __init__(self, funcname, lines, filetag=0): - self.funcname = funcname - self.lines = lines - self.uses_frame_pointer = False - self.r_localvar = self.r_localvarnofp - self.filetag = filetag - # a "stack bottom" function is either pypy_main_function() or a - # callback from C code. In both cases they are identified by - # the presence of pypy_asm_stack_bottom(). - self.is_stack_bottom = False - - def computegcmaptable(self, verbose=0): - if self.funcname in ['main', '_main']: - return [] # don't analyze main(), its prologue may contain - # strange instructions - self.findlabels() - self.parse_instructions() - try: - self.trim_unreachable_instructions() - self.find_noncollecting_calls() - if not self.list_collecting_call_insns(): - return [] - self.findframesize() - self.fixlocalvars() - self.trackgcroots() - self.extend_calls_with_labels() - finally: - if verbose > 2: - self.dump() - return self.gettable() - - def replace_symbols(self, operand): - return operand - - def gettable(self): - """Returns a list [(label_after_call, callshape_tuple)] - See format_callshape() for more details about callshape_tuple. - """ - table = [] - for insn in self.list_collecting_call_insns(): - if not hasattr(insn, 'framesize'): - continue # calls that never end up reaching a RET - if self.is_stack_bottom: - retaddr = LOC_NOWHERE # end marker for asmgcroot.py - elif self.uses_frame_pointer: - retaddr = frameloc_ebp(self.WORD, self.WORD) - else: - retaddr = frameloc_esp(insn.framesize, self.WORD) - shape = [retaddr] - # the first gcroots are always the ones corresponding to - # the callee-saved registers - for reg in self.CALLEE_SAVE_REGISTERS: - shape.append(LOC_NOWHERE) - gcroots = [] - for localvar, tag in insn.gcroots.items(): - if isinstance(localvar, LocalVar): - loc = localvar.getlocation(insn.framesize, - self.uses_frame_pointer, - self.WORD) - elif localvar in self.REG2LOC: - loc = self.REG2LOC[localvar] - else: - assert False, "%s: %s" % (self.funcname, - localvar) - assert isinstance(loc, int) - if tag is None: - gcroots.append(loc) - else: - regindex = self.CALLEE_SAVE_REGISTERS.index(tag) - shape[1 + regindex] = loc - if LOC_NOWHERE in shape and not self.is_stack_bottom: - reg = self.CALLEE_SAVE_REGISTERS[shape.index(LOC_NOWHERE) - 1] - raise AssertionError("cannot track where register %s is saved" - % (reg,)) - gcroots.sort() - shape.extend(gcroots) - table.append((insn.global_label, tuple(shape))) - return table - - def findlabels(self): - self.labels = {} # {name: Label()} - for lineno, line in enumerate(self.lines): - match = self.r_label.match(line) - label = None - if match: - label = match.group(1) - else: - # labels used by: j* NNNf - match = self.r_rel_label.match(line) - if match: - label = "rel %d" % lineno - if label: - assert label not in self.labels, "duplicate label: %s" % label - self.labels[label] = Label(label, lineno) - - def trim_unreachable_instructions(self): - reached = set([self.insns[0]]) - prevlen = 0 - while len(reached) > prevlen: - prevlen = len(reached) - for insn in self.insns: - if insn not in reached: - for previnsn in insn.previous_insns: - if previnsn in reached: - # this instruction is reachable too - reached.add(insn) - break - # now kill all unreachable instructions - i = 0 - while i < len(self.insns): - if self.insns[i] in reached: - i += 1 - else: - del self.insns[i] - - # the remaining instructions must have their 'previous_insns' list - # trimmed of dead previous instructions - all_remaining_insns = set(self.insns) - assert self.insns[0].previous_insns == () - for insn in self.insns[1:]: - insn.previous_insns = [previnsn for previnsn in insn.previous_insns - if previnsn in all_remaining_insns] - - def find_noncollecting_calls(self): - cannot_collect = {} - for line in self.lines: - match = self.r_gcnocollect_marker.search(line) - if match: - name = match.group(1) - cannot_collect[name] = True - # - self.cannot_collect = dict.fromkeys( - [self.function_names_prefix + name for name in cannot_collect]) - - def append_instruction(self, insn): - # Add the instruction to the list, and link it to the previous one. - previnsn = self.insns[-1] - self.insns.append(insn) - if (isinstance(insn, (InsnSetLocal, InsnCopyLocal)) and - insn.target == self.tested_for_zero): - self.tested_for_zero = None - - try: - lst = insn.previous_insns - except AttributeError: - lst = insn.previous_insns = [] - if not isinstance(previnsn, InsnStop): - lst.append(previnsn) - - def parse_instructions(self): - self.insns = [InsnFunctionStart(self.CALLEE_SAVE_REGISTERS, self.WORD)] - self.tested_for_zero = None - ignore_insns = False - for lineno, line in enumerate(self.lines): - if lineno < self.skip: - continue - self.currentlineno = lineno - insn = [] - if line.startswith('\trep;'): - line = '\t'+line[5:].lstrip() - match = self.r_insn.match(line) - - if self.r_bottom_marker.match(line): - self.is_stack_bottom = True - elif match: - if not ignore_insns: - opname = match.group(1) - # - try: - cf = self.OPS_WITH_PREFIXES_CHANGING_FLAGS[opname] - except KeyError: - cf = self.find_missing_changing_flags(opname) - if cf: - self.tested_for_zero = None - # - try: - meth = getattr(self, 'visit_' + opname) - except AttributeError: - self.find_missing_visit_method(opname) - meth = getattr(self, 'visit_' + opname) - line = line.rsplit(';', 1)[0] - insn = meth(line) - elif self.r_gcroot_marker.match(line): - insn = self._visit_gcroot_marker(line) - elif line == '\t/* ignore_in_trackgcroot */\n': - ignore_insns = True - elif line == '\t/* end_ignore_in_trackgcroot */\n': - ignore_insns = False - else: - match = self.r_label.match(line) - if match: - insn = self.labels[match.group(1)] - - if isinstance(insn, list): - for i in insn: - self.append_instruction(i) - else: - self.append_instruction(insn) - - del self.currentlineno - - @classmethod - def find_missing_visit_method(cls, opname): - # only for operations that are no-ops as far as we are concerned - prefix = opname - while prefix not in cls.IGNORE_OPS_WITH_PREFIXES: - prefix = prefix[:-1] - if not prefix: - raise UnrecognizedOperation(opname) - setattr(cls, 'visit_' + opname, cls.visit_nop) - - @classmethod - def find_missing_changing_flags(cls, opname): - prefix = opname - while prefix and prefix not in cls.OPS_WITH_PREFIXES_CHANGING_FLAGS: - prefix = prefix[:-1] - cf = cls.OPS_WITH_PREFIXES_CHANGING_FLAGS.get(prefix, False) - cls.OPS_WITH_PREFIXES_CHANGING_FLAGS[opname] = cf - return cf - - def list_collecting_call_insns(self): - return [insn for insn in self.insns if isinstance(insn, InsnCall) - if insn.name not in self.cannot_collect] - - def findframesize(self): - # the 'framesize' attached to an instruction is the number of bytes - # in the frame at this point. This doesn't count the return address - # which is the word immediately following the frame in memory. - # The 'framesize' is set to an odd value if it is only an estimate - # (see InsnCannotFollowEsp). - - def walker(insn, size_delta): - check = deltas.setdefault(insn, size_delta) - assert check == size_delta, ( - "inconsistent frame size at instruction %s" % (insn,)) - if isinstance(insn, InsnStackAdjust): - size_delta -= insn.delta - if not hasattr(insn, 'framesize'): - yield size_delta # continue walking backwards - - for insn in self.insns: - if isinstance(insn, (InsnRet, InsnEpilogue, InsnGCROOT)): - deltas = {} - self.walk_instructions_backwards(walker, insn, 0) - size_at_insn = [] - for insn1, delta1 in deltas.items(): - if hasattr(insn1, 'framesize'): - size_at_insn.append(insn1.framesize + delta1) - if not size_at_insn: - continue - size_at_insn = size_at_insn[0] - for insn1, delta1 in deltas.items(): - size_at_insn1 = size_at_insn - delta1 - if hasattr(insn1, 'framesize'): - assert insn1.framesize == size_at_insn1, ( - "inconsistent frame size at instruction %s" % - (insn1,)) - else: - insn1.framesize = size_at_insn1 - - # trim: instructions with no framesize are removed from self.insns, - # and from the 'previous_insns' lists - if 0: # <- XXX disabled because it seems bogus, investigate more - assert hasattr(self.insns[0], 'framesize') - old = self.insns[1:] - del self.insns[1:] - for insn in old: - if hasattr(insn, 'framesize'): - self.insns.append(insn) - insn.previous_insns = [previnsn for previnsn in insn.previous_insns - if hasattr(previnsn, 'framesize')] - - def fixlocalvars(self): - def fixvar(localvar): - if localvar is None: - return None - elif isinstance(localvar, (list, tuple)): - return [fixvar(var) for var in localvar] - - match = self.r_localvar_esp.match(localvar) - if match: - if localvar == self.TOP_OF_STACK_MINUS_WORD: - # for pushl and popl, by - hint = None # default ebp addressing is - else: # a bit nicer - hint = 'esp' - ofs_from_esp = int(match.group(1) or '0') - if self.format == 'msvc': - ofs_from_esp += int(match.group(2) or '0') - localvar = ofs_from_esp - insn.framesize - assert localvar != 0 # that's the return address - return LocalVar(localvar, hint=hint) - elif self.uses_frame_pointer: - match = self.r_localvar_ebp.match(localvar) - if match: - ofs_from_ebp = int(match.group(1) or '0') - if self.format == 'msvc': - ofs_from_ebp += int(match.group(2) or '0') - localvar = ofs_from_ebp - self.WORD - assert localvar != 0 # that's the return address - return LocalVar(localvar, hint='ebp') - return localvar - - for insn in self.insns: - if not hasattr(insn, 'framesize'): - continue - for name in insn._locals_: - localvar = getattr(insn, name) - setattr(insn, name, fixvar(localvar)) - - def trackgcroots(self): - - def walker(insn, loc): - source = insn.source_of(loc, tag) - if source is somenewvalue: - pass # done - else: - yield source - - for insn in self.insns: - for loc, tag in insn.requestgcroots(self).items(): - self.walk_instructions_backwards(walker, insn, loc) - - def dump(self): - for insn in self.insns: - size = getattr(insn, 'framesize', '?') - print >> sys.stderr, '%4s %s' % (size, insn) - - def walk_instructions_backwards(self, walker, initial_insn, initial_state): - pending = [] - seen = set() - def schedule(insn, state): - for previnsn in insn.previous_insns: - key = previnsn, state - if key not in seen: - seen.add(key) - pending.append(key) - schedule(initial_insn, initial_state) - while pending: - insn, state = pending.pop() - for prevstate in walker(insn, state): - schedule(insn, prevstate) - - def extend_calls_with_labels(self): - # walk backwards, because inserting the global labels in self.lines - # is going to invalidate the lineno of all the InsnCall objects - # after the current one. - for call in self.list_collecting_call_insns()[::-1]: - if hasattr(call, 'framesize'): - self.create_global_label(call) - - def create_global_label(self, call): - # we need a globally-declared label just after the call. - # Reuse one if it is already there (e.g. from a previous run of this - # script); otherwise invent a name and add the label to tracker.lines. - label = None - # this checks for a ".globl NAME" followed by "NAME:" - match = self.r_globl.match(self.lines[call.lineno+1]) - if match: - label1 = match.group(1) - match = self.r_globllabel.match(self.lines[call.lineno+2]) - if match: - label2 = match.group(1) - if label1 == label2: - label = label2 - if label is None: - k = call.lineno - if self.format == 'msvc': - # Some header files (ws2tcpip.h) define STDCALL functions - funcname = self.funcname.split('@')[0] - else: - funcname = self.funcname - while 1: - label = '__gcmap_%s__%s_%d' % (self.filetag, funcname, k) - if label not in self.labels: - break - k += 1 - self.labels[label] = None - if self.format == 'msvc': - self.lines.insert(call.lineno+1, '%s::\n' % (label,)) - self.lines.insert(call.lineno+1, 'PUBLIC\t%s\n' % (label,)) - else: - # These global symbols are not directly labels pointing to the - # code location because such global labels in the middle of - # functions confuse gdb. Instead, we add to the global symbol's - # value a big constant, which is subtracted again when we need - # the original value for gcmaptable.s. That's a hack. - self.lines.insert(call.lineno+1, '%s=.+%d\n' % (label, - self.OFFSET_LABELS)) - self.lines.insert(call.lineno+1, '\t.hidden\t%s\n' % (label,)) - self.lines.insert(call.lineno+1, '\t.globl\t%s\n' % (label,)) - call.global_label = label - - @classmethod - def compress_callshape(cls, shape): - # For a single shape, this turns the list of integers into a list of - # bytes and reverses the order of the entries. The length is - # encoded by inserting a 0 marker after the gc roots coming from - # shape[N:] and before the N values coming from shape[N-1] to - # shape[0] (for N == 5 on 32-bit or 7 on 64-bit platforms). - # In practice it seems that shapes contain many integers - # whose value is up to a few thousands, which the algorithm below - # compresses down to 2 bytes. Very small values compress down to a - # single byte. - - # Callee-save regs plus ret addr - min_size = len(cls.CALLEE_SAVE_REGISTERS) + 1 - - assert len(shape) >= min_size - shape = list(shape) - assert 0 not in shape[min_size:] - shape.insert(min_size, 0) - result = [] - for loc in shape: - assert loc >= 0 - flag = 0 - while loc >= 0x80: - result.append(int(loc & 0x7F) | flag) - flag = 0x80 - loc >>= 7 - result.append(int(loc) | flag) - result.reverse() - return result - - @classmethod - def decompress_callshape(cls, bytes): - # For tests. This logic is copied in asmgcroot.py. - result = [] - n = 0 - while n < len(bytes): - value = 0 - while True: - b = bytes[n] - n += 1 - value += b - if b < 0x80: - break - value = (value - 0x80) << 7 - result.append(value) - result.reverse() - assert result[5] == 0 - del result[5] - return result - # ____________________________________________________________ - - BASE_FUNCTIONS_NOT_RETURNING = { - 'abort': None, - 'pypy_debug_catch_fatal_exception': None, - 'RPyAbort': None, - 'RPyAssertFailed': None, - } - - def _visit_gcroot_marker(self, line): - match = self.r_gcroot_marker.match(line) - loc = match.group(1) - return InsnGCROOT(self.replace_symbols(loc)) - - def visit_nop(self, line): - return [] - - IGNORE_OPS_WITH_PREFIXES = dict.fromkeys([ - 'cmp', 'test', 'set', 'sahf', 'lahf', 'cld', 'std', - 'rep', 'movs', 'movhp', 'lods', 'stos', 'scas', 'cwde', 'prefetch', - # floating-point operations cannot produce GC pointers - 'f', - 'cvt', 'ucomi', 'comi', 'subs', 'subp', 'adds', 'addp', 'xorp', - 'movap', 'movd', 'movlp', 'movup', 'sqrt', 'rsqrt', 'movhlp', 'movlhp', - 'mins', 'minp', 'maxs', 'maxp', 'unpck', 'pxor', 'por', # sse2 - 'shufps', 'shufpd', - # arithmetic operations should not produce GC pointers - 'inc', 'dec', 'not', 'neg', 'or', 'and', 'sbb', 'adc', - 'shl', 'shr', 'sal', 'sar', 'rol', 'ror', 'mul', 'imul', 'div', 'idiv', - 'bswap', 'bt', 'rdtsc', 'rounds', - 'pabs', 'pack', 'padd', 'palign', 'pand', 'pavg', 'pcmp', 'pextr', - 'phadd', 'phsub', 'pinsr', 'pmadd', 'pmax', 'pmin', 'pmovmsk', - 'pmul', 'por', 'psadb', 'pshuf', 'psign', 'psll', 'psra', 'psrl', - 'psub', 'punpck', 'pxor', 'pmovzx', 'pmovsx', 'pblend', - # all vectors don't produce pointers - 'v', - # sign-extending moves should not produce GC pointers - 'cbtw', 'cwtl', 'cwtd', 'cltd', 'cltq', 'cqto', - # zero-extending moves should not produce GC pointers - 'movz', - # locked operations should not move GC pointers, at least so far - 'lock', 'pause', - # non-temporal moves should be reserved for areas containing - # raw data, not GC pointers - 'movnt', 'mfence', 'lfence', 'sfence', - # bit manipulations - 'andn', 'bextr', 'blsi', 'blsmask', 'blsr', 'tzcnt', 'lzcnt', - # uh, this can occur with a 'call' on the following line... - 'rex64', - # movbe, converts from big-endian, so most probably not GC pointers - 'movbe', - # xchgb, byte-sized, so not GC pointers - 'xchgb', - ]) - - # a partial list is hopefully good enough for now; it's all to support - # only one corner case, tested in elf64/track_zero.s - OPS_WITH_PREFIXES_CHANGING_FLAGS = dict.fromkeys([ - 'cmp', 'test', 'lahf', 'cld', 'std', 'rep', - 'ucomi', 'comi', - 'add', 'sub', 'xor', - 'inc', 'dec', 'not', 'neg', 'or', 'and', 'sbb', 'adc', - 'shl', 'shr', 'sal', 'sar', 'rol', 'ror', 'mul', 'imul', 'div', 'idiv', - 'bt', 'call', 'int', - 'jmp', # not really changing flags, but we shouldn't assume - # anything about the operations on the following lines - ], True) - - visit_movb = visit_nop - visit_movw = visit_nop - visit_addb = visit_nop - visit_addw = visit_nop - visit_subb = visit_nop - visit_subw = visit_nop - visit_xorb = visit_nop - visit_xorw = visit_nop - - def _visit_add(self, line, sign=+1): - match = self.r_binaryinsn.match(line) - source = match.group("source") - target = match.group("target") - if target == self.ESP: - count = self.extract_immediate(source) - if count is None: - # strange instruction - I've seen 'subl %eax, %esp' - return InsnCannotFollowEsp() - return InsnStackAdjust(sign * count) - elif self.r_localvar.match(target): - return InsnSetLocal(target, [source, target]) - else: - return [] - - def _visit_sub(self, line): - return self._visit_add(line, sign=-1) - - def unary_insn(self, line): - match = self.r_unaryinsn.match(line) - target = match.group(1) - if self.r_localvar.match(target): - return InsnSetLocal(target) - else: - return [] - - def binary_insn(self, line): - match = self.r_binaryinsn.match(line) - if not match: - raise UnrecognizedOperation(line) - source = match.group("source") - target = match.group("target") - if self.r_localvar.match(target): - return InsnSetLocal(target, [source]) - elif target == self.ESP: - raise UnrecognizedOperation(line) - else: - return [] - - def _visit_and(self, line): - match = self.r_binaryinsn.match(line) - target = match.group("target") - if target == self.ESP: - # only for andl $-16, %esp used to align the stack in main(). - # main() should not be seen at all. But on e.g. MSVC we see - # the instruction somewhere else too... - return InsnCannotFollowEsp() - else: - return self.binary_insn(line) - - def _visit_lea(self, line): - match = self.r_binaryinsn.match(line) - target = match.group("target") - if target == self.ESP: - # only for leal -12(%ebp), %esp in function epilogues - source = match.group("source") - match = self.r_localvar_ebp.match(source) - if match: - if not self.uses_frame_pointer: - raise UnrecognizedOperation('epilogue without prologue') - ofs_from_ebp = int(match.group(1) or '0') - assert ofs_from_ebp <= 0 - framesize = self.WORD - ofs_from_ebp - else: - match = self.r_localvar_esp.match(source) - # leal 12(%esp), %esp - if match: - return InsnStackAdjust(int(match.group(1))) - - framesize = None # strange instruction - return InsnEpilogue(framesize) - else: - return self.binary_insn(line) - - def insns_for_copy(self, source, target): - source = self.replace_symbols(source) - target = self.replace_symbols(target) - if target == self.ESP: - raise UnrecognizedOperation('%s -> %s' % (source, target)) - elif self.r_localvar.match(target): - if self.r_localvar.match(source): - # eg, movl %eax, %ecx: possibly copies a GC root - return [InsnCopyLocal(source, target)] - else: - # eg, movl (%eax), %edi or mov %esp, %edi: load a register - # from "outside". If it contains a pointer to a GC root, - # it will be announced later with the GCROOT macro. - return [InsnSetLocal(target, [source])] - else: - # eg, movl %ebx, (%edx) or mov %ebp, %esp: does not write into - # a general register - return [] - - def _visit_mov(self, line): - match = self.r_binaryinsn.match(line) - source = match.group("source") - target = match.group("target") - if source == self.ESP and target == self.EBP: - return self._visit_prologue() - elif source == self.EBP and target == self.ESP: - return self._visit_epilogue() - if source == self.ESP and self.funcname.startswith('VALGRIND_'): - return [] # in VALGRIND_XXX functions, there is a dummy-looking - # mov %esp, %eax. Shows up only when compiling with - # gcc -fno-unit-at-a-time. - return self.insns_for_copy(source, target) - - def _visit_push(self, line): - match = self.r_unaryinsn.match(line) - source = match.group(1) - return self.insns_for_copy(source, self.TOP_OF_STACK_MINUS_WORD) + \ - [InsnPushed(-self.WORD)] - - def _visit_pop(self, target): - return [InsnStackAdjust(+self.WORD)] + \ - self.insns_for_copy(self.TOP_OF_STACK_MINUS_WORD, target) - - def _visit_prologue(self): - # For the prologue of functions that use %ebp as frame pointer. - # First, find the latest InsnStackAdjust; if it's not a PUSH, - # then consider that this 'mov %rsp, %rbp' is actually unrelated - i = -1 - while not isinstance(self.insns[i], InsnStackAdjust): - i -= 1 - if not isinstance(self.insns[i], InsnPushed): - return [] - # - self.uses_frame_pointer = True - self.r_localvar = self.r_localvarfp - return [InsnPrologue(self.WORD)] - - def _visit_epilogue(self): - if not self.uses_frame_pointer: - raise UnrecognizedOperation('epilogue without prologue') - return [InsnEpilogue(self.WORD)] - - def visit_leave(self, line): - return self._visit_epilogue() + self._visit_pop(self.EBP) - - def visit_ret(self, line): - return InsnRet(self.CALLEE_SAVE_REGISTERS) - - def visit_rep(self, line): - # 'rep ret' or 'rep; ret': bad reasons for this bogus 'rep' here - if line.split()[:2] == ['rep', 'ret']: - return self.visit_ret(line) - return [] - - def visit_ud2(self, line): - return InsnStop("ud2") # unreachable instruction - - def visit_jmp(self, line): - tablelabels = [] - match = self.r_jmp_switch.match(line) - if match: - # this is a jmp *Label(%index) or jmp *%addr, used for - # table-based switches. Assume that the table is coming - # after a .section .rodata and a label, and is a list of - # lines looking like .long LABEL or .long 0 or .long L2-L1, - # ending in a .text or .section .text.hot. - lineno = self.currentlineno + 1 - if '.section' not in self.lines[lineno]: - pass # bah, probably a tail-optimized indirect call... - else: - assert '.rodata' in self.lines[lineno] - lineno += 1 - while '.align' in self.lines[lineno]: - lineno += 1 - match = self.r_label.match(self.lines[lineno]) - assert match, repr(self.lines[lineno]) - tablelabels.append(match.group(1)) - elif self.r_unaryinsn_star.match(line): - # maybe a jmp similar to the above, but stored in a - # registry: - # movl L9341(%eax), %eax - # jmp *%eax - operand = self.r_unaryinsn_star.match(line).group(1) - def walker(insn, locs): - sources = [] - for loc in locs: - for s in insn.all_sources_of(loc): - # if the source looks like 8(%eax,%edx,4) - # %eax is the real source, %edx is an offset. - match = self.r_jmp_source.match(s) - if match and not self.r_localvar_esp.match(s): - sources.append(match.group(1)) - else: - sources.append(s) - for source in sources: - label_match = re.compile(self.LABEL).match(source) - if label_match: - tablelabels.append(label_match.group(0)) - return - yield tuple(sources) - insn = InsnStop() - insn.previous_insns = [self.insns[-1]] - self.walk_instructions_backwards(walker, insn, (operand,)) - - # Remove probable tail-calls - tablelabels = [label for label in tablelabels - if label in self.labels] - assert len(tablelabels) <= 1 - if tablelabels: - tablelin = self.labels[tablelabels[0]].lineno + 1 - while not self.r_jmptable_end.match(self.lines[tablelin]): - # skip empty lines - if (not self.lines[tablelin].strip() - or self.lines[tablelin].startswith(';')): - tablelin += 1 - continue - match = self.r_jmptable_item.match(self.lines[tablelin]) - if not match: - raise NoPatternMatch(repr(self.lines[tablelin])) - label = match.group(1) - if label != '0': - self.register_jump_to(label) - tablelin += 1 - return InsnStop("jump table") - if self.r_unaryinsn_star.match(line): - # that looks like an indirect tail-call. - # tail-calls are equivalent to RET for us - return InsnRet(self.CALLEE_SAVE_REGISTERS) - try: - self.conditional_jump(line) - except KeyError: - # label not found: check if it's a tail-call turned into a jump - match = self.r_unaryinsn.match(line) - target = match.group(1) - assert not target.startswith('.') - # tail-calls are equivalent to RET for us - return InsnRet(self.CALLEE_SAVE_REGISTERS) - return InsnStop("jump") - - def register_jump_to(self, label, lastinsn=None): - if lastinsn is None: - lastinsn = self.insns[-1] - if not isinstance(lastinsn, InsnStop): - self.labels[label].previous_insns.append(lastinsn) - - def conditional_jump(self, line, je=False, jne=False): - match = self.r_jump.match(line) - if not match: - match = self.r_jump_rel_label.match(line) - if not match: - raise UnrecognizedOperation(line) - # j* NNNf - label = match.group(1) - label += ":" - i = self.currentlineno + 1 - while True: - if self.lines[i].startswith(label): - label = "rel %d" % i - break - i += 1 - else: - label = match.group(1) - prefix = [] - lastinsn = None - postfix = [] - if self.tested_for_zero is not None: - if je: - # generate pseudo-code... - prefix = [InsnCopyLocal(self.tested_for_zero, '%tmp'), - InsnSetLocal(self.tested_for_zero)] - postfix = [InsnCopyLocal('%tmp', self.tested_for_zero)] - lastinsn = prefix[-1] - elif jne: - postfix = [InsnSetLocal(self.tested_for_zero)] - self.register_jump_to(label, lastinsn) - return prefix + [InsnCondJump(label)] + postfix - - visit_jmpl = visit_jmp - - # The various conditional jumps and cmov* operations - for name in ''' - e g ge l le a ae b be p s o c - '''.split(): - # NB. visit_je() and visit_jne() are overridden below - locals()['visit_j' + name] = conditional_jump - locals()['visit_jn' + name] = conditional_jump - locals()['visit_cmov' + name] = binary_insn - locals()['visit_cmov' + name + 'l'] = binary_insn - locals()['visit_cmovn' + name] = binary_insn - locals()['visit_cmovn' + name + 'l'] = binary_insn - - def visit_je(self, line): - return self.conditional_jump(line, je=True) - - def visit_jne(self, line): - return self.conditional_jump(line, jne=True) - - def _visit_test(self, line): - match = self.r_binaryinsn.match(line) - source = match.group("source") - target = match.group("target") - if source == target: - self.tested_for_zero = source - return [] - - def _visit_xchg(self, line): - # support the format used in VALGRIND_DISCARD_TRANSLATIONS - # which is to use a marker no-op "xchgl %ebx, %ebx" - match = self.r_binaryinsn.match(line) - source = match.group("source") - target = match.group("target") - if source == target: - return [] - # ignore the 'rpy_fastgil' atomic exchange, or any locked - # atomic exchange at all (involving memory) - if not source.startswith('%'): - return [] - raise UnrecognizedOperation(line) - - def visit_call(self, line): - match = self.r_unaryinsn.match(line) - - if match is None: - assert self.r_unaryinsn_star.match(line) # indirect call - return [InsnCall('<indirect>', self.currentlineno), - InsnSetLocal(self.EAX)] # the result is there - - target = match.group(1) - - if self.format in ('msvc',): - # On win32, the address of a foreign function must be - # computed, the optimizer may store it in a register. We - # could ignore this, except when the function need special - # processing (not returning, __stdcall...) - def find_register(target): - reg = [] - def walker(insn, locs): - sources = [] - for loc in locs: - for s in insn.all_sources_of(loc): - sources.append(s) - for source in sources: - m = re.match("DWORD PTR " + self.LABEL, source) - if m: - reg.append(m.group(1)) - if reg: - return - yield tuple(sources) - insn = InsnStop() - insn.previous_insns = [self.insns[-1]] - self.walk_instructions_backwards(walker, insn, (target,)) - return reg - - if match and self.r_localvarfp.match(target): - sources = find_register(target) - if sources: - target, = sources - - if target.endswith('@PLT'): - # In -fPIC mode, all functions calls have this suffix - target = target[:-4] - - if target in self.FUNCTIONS_NOT_RETURNING: - return [InsnStop(target)] - if self.format == 'mingw32' and target == '__alloca': - # in functions with large stack requirements, windows - # needs a call to _alloca(), to turn reserved pages - # into committed memory. - # With mingw32 gcc at least, %esp is not used before - # this call. So we don't bother to compute the exact - # stack effect. - return [InsnCannotFollowEsp()] - if target in self.labels: - lineoffset = self.labels[target].lineno - self.currentlineno - if lineoffset >= 0: - assert lineoffset in (1,2) - return [InsnStackAdjust(-4)] - - if target.startswith('__x86.get_pc_thunk.'): - # special case, found on x86-32: these static functions - # contain only a simple load of some non-GC pointer to - # a specific register (not necessarily EAX) - reg = '%e' + target.split('.')[-1] - return [InsnSetLocal(reg)] - - insns = [InsnCall(target, self.currentlineno), - InsnSetLocal(self.EAX)] # the result is there - if self.format in ('mingw32', 'msvc'): - # handle __stdcall calling convention: - # Stack cleanup is performed by the called function, - # Function name is decorated with "@N" where N is the stack size - if '@' in target and not target.startswith('@'): - insns.append(InsnStackAdjust(int(target.rsplit('@', 1)[1]))) - # Some (intrinsic?) functions use the "fastcall" calling convention - # XXX without any declaration, how can we guess the stack effect? - if target in ['__alldiv', '__allrem', '__allmul', '__alldvrm', - '__aulldiv', '__aullrem', '__aullmul', '__aulldvrm']: - insns.append(InsnStackAdjust(16)) - return insns - - # __________ debugging output __________ - - @classmethod - def format_location(cls, loc): - # A 'location' is a single number describing where a value is stored - # across a call. It can be in one of the CALLEE_SAVE_REGISTERS, or - # in the stack frame at an address relative to either %esp or %ebp. - # The last two bits of the location number are used to tell the cases - # apart; see format_location(). - assert loc >= 0 - kind = loc & LOC_MASK - if kind == LOC_REG: - if loc == LOC_NOWHERE: - return '?' - reg = (loc >> 2) - 1 - return '%' + cls.CALLEE_SAVE_REGISTERS[reg].replace("%", "") - else: - offset = loc & ~ LOC_MASK - if cls.WORD == 8: - offset <<= 1 - if kind == LOC_EBP_PLUS: - result = '(%' + cls.EBP.replace("%", "") + ')' - elif kind == LOC_EBP_MINUS: - result = '(%' + cls.EBP.replace("%", "") + ')' - offset = -offset - elif kind == LOC_ESP_PLUS: - result = '(%' + cls.ESP.replace("%", "") + ')' - else: - assert 0, kind - if offset != 0: - result = str(offset) + result - return result - - @classmethod - def format_callshape(cls, shape): - # A 'call shape' is a tuple of locations in the sense of - # format_location(). They describe where in a function frame - # interesting values are stored, when this function executes a 'call' - # instruction. - # - # shape[0] is the location that stores the fn's own return - # address (not the return address for the currently - # executing 'call') - # - # shape[1..N] is where the fn saved its own caller's value of a - # certain callee save register. (where N is the number - # of callee save registers.) - # - # shape[>N] are GC roots: where the fn has put its local GCPTR - # vars - # - num_callee_save_regs = len(cls.CALLEE_SAVE_REGISTERS) - assert isinstance(shape, tuple) - # + 1 for the return address - assert len(shape) >= (num_callee_save_regs + 1) - result = [cls.format_location(loc) for loc in shape] - return '{%s | %s | %s}' % (result[0], - ', '.join(result[1:(num_callee_save_regs+1)]), - ', '.join(result[(num_callee_save_regs+1):])) - - -class FunctionGcRootTracker32(FunctionGcRootTracker): - WORD = 4 - - visit_mov = FunctionGcRootTracker._visit_mov - visit_movl = FunctionGcRootTracker._visit_mov - visit_pushl = FunctionGcRootTracker._visit_push - visit_leal = FunctionGcRootTracker._visit_lea - - visit_addl = FunctionGcRootTracker._visit_add - visit_subl = FunctionGcRootTracker._visit_sub - visit_andl = FunctionGcRootTracker._visit_and - visit_and = FunctionGcRootTracker._visit_and - - visit_xchgl = FunctionGcRootTracker._visit_xchg - visit_testl = FunctionGcRootTracker._visit_test - - # used in "xor reg, reg" to create a NULL GC ptr - visit_xorl = FunctionGcRootTracker.binary_insn - visit_orl = FunctionGcRootTracker.binary_insn # unsure about this one - - # occasionally used on 32-bits to move floats around - visit_movq = FunctionGcRootTracker.visit_nop - - def visit_pushw(self, line): - return [InsnStackAdjust(-2)] # rare but not impossible - - def visit_popl(self, line): - match = self.r_unaryinsn.match(line) - target = match.group(1) - return self._visit_pop(target) - -class FunctionGcRootTracker64(FunctionGcRootTracker): - WORD = 8 - - # Regex ignores destination - r_save_xmm_register = re.compile(r"\tmovaps\s+%xmm(\d+)") - - def _maybe_32bit_dest(func): - def wrapper(self, line): - # Using a 32-bit reg as a destination in 64-bit mode zero-extends - # to 64-bits, so sometimes gcc uses a 32-bit operation to copy a - # statically known pointer to a register - - # %eax -> %rax - new_line = re.sub(r"%e(ax|bx|cx|dx|di|si|bp)$", r"%r\1", line) - # %r10d -> %r10 - new_line = re.sub(r"%r(\d+)d$", r"%r\1", new_line) - return func(self, new_line) - return wrapper - - visit_addl = FunctionGcRootTracker.visit_nop - visit_subl = FunctionGcRootTracker.visit_nop - visit_leal = FunctionGcRootTracker.visit_nop - - visit_cltq = FunctionGcRootTracker.visit_nop - - visit_movq = FunctionGcRootTracker._visit_mov - # just a special assembler mnemonic for mov - visit_movabsq = FunctionGcRootTracker._visit_mov - visit_mov = _maybe_32bit_dest(FunctionGcRootTracker._visit_mov) - visit_movl = visit_mov - - visit_xorl = _maybe_32bit_dest(FunctionGcRootTracker.binary_insn) - - visit_pushq = FunctionGcRootTracker._visit_push - - visit_addq = FunctionGcRootTracker._visit_add - visit_subq = FunctionGcRootTracker._visit_sub - - visit_leaq = FunctionGcRootTracker._visit_lea - - visit_xorq = FunctionGcRootTracker.binary_insn - visit_xchgl = FunctionGcRootTracker._visit_xchg - visit_xchgq = FunctionGcRootTracker._visit_xchg - visit_testq = FunctionGcRootTracker._visit_test - - # FIXME: similar to visit_popl for 32-bit - def visit_popq(self, line): - match = self.r_unaryinsn.match(line) - target = match.group(1) - return self._visit_pop(target) - - def visit_jmp(self, line): - # On 64-bit, %al is used when calling varargs functions to specify an - # upper-bound on the number of xmm registers used in the call. gcc - # uses %al to compute an indirect jump that looks like: - # - # jmp *[some register] - # movaps %xmm7, [stack location] - # movaps %xmm6, [stack location] - # movaps %xmm5, [stack location] - # movaps %xmm4, [stack location] - # movaps %xmm3, [stack location] - # movaps %xmm2, [stack location] - # movaps %xmm1, [stack location] - # movaps %xmm0, [stack location] - # - # The jmp is always to somewhere in the block of "movaps" - # instructions, according to how many xmm registers need to be saved - # to the stack. The point of all this is that we can safely ignore - # jmp instructions of that form. - if (self.currentlineno + 8) < len(self.lines) and self.r_unaryinsn_star.match(line): - matches = [self.r_save_xmm_register.match(self.lines[self.currentlineno + 1 + i]) for i in range(8)] - if all(m and int(m.group(1)) == (7 - i) for i, m in enumerate(matches)): - return [] - - return FunctionGcRootTracker.visit_jmp(self, line) - - - -class ElfFunctionGcRootTracker32(FunctionGcRootTracker32): - format = 'elf' - function_names_prefix = '' - - ESP = '%esp' - EBP = '%ebp' - EAX = '%eax' - CALLEE_SAVE_REGISTERS = ['%ebx', '%esi', '%edi', '%ebp'] - REG2LOC = dict((_reg, LOC_REG | ((_i+1)<<2)) - for _i, _reg in enumerate(CALLEE_SAVE_REGISTERS)) - OPERAND = r'(?:[-\w$%+.:@"]+(?:[(][\w%,]+[)])?|[(][\w%,]+[)])' - LABEL = r'([a-zA-Z_$.][a-zA-Z0-9_$.]*)(?:@[@a-zA-Z0-9_$.]*)?' - OFFSET_LABELS = 2**30 - TOP_OF_STACK_MINUS_WORD = '-4(%esp)' - - r_functionstart = re.compile(r"\t.type\s+"+LABEL+",\s*[@]function\s*$") - r_functionend = re.compile(r"\t.size\s+"+LABEL+",\s*[.]-"+LABEL+"\s*$") - LOCALVAR = r"%eax|%edx|%ecx|%ebx|%esi|%edi|%ebp|-?\d*[(]%esp[)]" - LOCALVARFP = LOCALVAR + r"|-?\d*[(]%ebp[)]" - r_localvarnofp = re.compile(LOCALVAR) - r_localvarfp = re.compile(LOCALVARFP) - r_localvar_esp = re.compile(r"(-?\d*)[(]%esp[)]") - r_localvar_ebp = re.compile(r"(-?\d*)[(]%ebp[)]") - - r_rel_label = re.compile(r"(\d+):\s*$") - r_jump_rel_label = re.compile(r"\tj\w+\s+"+"(\d+)f"+"\s*$") - - r_unaryinsn_star= re.compile(r"\t[a-z]\w*\s+[*]("+OPERAND+")\s*$") - r_jmptable_item = re.compile(r"\t.long\t"+LABEL+"(-\"[A-Za-z0-9$]+\")?\s*$") - r_jmptable_end = re.compile(r"\t.text|\t.section\s+.text|\t\.align|"+LABEL) - - r_gcroot_marker = re.compile(r"\t/[*] GCROOT ("+LOCALVARFP+") [*]/") - r_gcnocollect_marker = re.compile(r"\t/[*] GC_NOCOLLECT ("+OPERAND+") [*]/") - r_bottom_marker = re.compile(r"\t/[*] GC_STACK_BOTTOM [*]/") - - FUNCTIONS_NOT_RETURNING = { - '_exit': None, - '__assert_fail': None, - '___assert_rtn': None, - 'L___assert_rtn$stub': None, - 'L___eprintf$stub': None, - '__stack_chk_fail': None, - } - for _name in FunctionGcRootTracker.BASE_FUNCTIONS_NOT_RETURNING: - FUNCTIONS_NOT_RETURNING[_name] = None - - def __init__(self, lines, filetag=0): - match = self.r_functionstart.match(lines[0]) - funcname = match.group(1) - match = self.r_functionend.match(lines[-1]) - assert funcname == match.group(1) - assert funcname == match.group(2) - super(ElfFunctionGcRootTracker32, self).__init__( - funcname, lines, filetag) - - def extract_immediate(self, value): - if not value.startswith('$'): - return None - return int(value[1:]) - -ElfFunctionGcRootTracker32.init_regexp() - -class ElfFunctionGcRootTracker64(FunctionGcRootTracker64): - format = 'elf64' - function_names_prefix = '' - - ESP = '%rsp' - EBP = '%rbp' - EAX = '%rax' - CALLEE_SAVE_REGISTERS = ['%rbx', '%r12', '%r13', '%r14', '%r15', '%rbp'] - REG2LOC = dict((_reg, LOC_REG | ((_i+1)<<2)) - for _i, _reg in enumerate(CALLEE_SAVE_REGISTERS)) - OPERAND = r'(?:[-\w$%+.:@"]+(?:[(][\w%,]+[)])?|[(][\w%,]+[)])' - LABEL = r'([a-zA-Z_$.][a-zA-Z0-9_$.]*)(?:@[@a-zA-Z0-9_$.]*)?' - OFFSET_LABELS = 2**30 - TOP_OF_STACK_MINUS_WORD = '-8(%rsp)' - - r_functionstart = re.compile(r"\t.type\s+"+LABEL+",\s*[@]function\s*$") - r_functionend = re.compile(r"\t.size\s+"+LABEL+",\s*[.]-"+LABEL+"\s*$") - LOCALVAR = r"%rax|%rbx|%rcx|%rdx|%rdi|%rsi|%rbp|%r8|%r9|%r10|%r11|%r12|%r13|%r14|%r15|-?\d*[(]%rsp[)]" - LOCALVARFP = LOCALVAR + r"|-?\d*[(]%rbp[)]" - r_localvarnofp = re.compile(LOCALVAR) - r_localvarfp = re.compile(LOCALVARFP) - r_localvar_esp = re.compile(r"(-?\d*)[(]%rsp[)]") - r_localvar_ebp = re.compile(r"(-?\d*)[(]%rbp[)]") - - r_rel_label = re.compile(r"(\d+):\s*$") - r_jump_rel_label = re.compile(r"\tj\w+\s+"+"(\d+)f"+"\s*$") - - r_unaryinsn_star= re.compile(r"\t[a-z]\w*\s+[*]("+OPERAND+")\s*$") - r_jmptable_item = re.compile(r"\t.(?:quad|long)\t"+LABEL+"(-\"[A-Za-z0-9$]+\"|-"+LABEL+")?\s*$") - r_jmptable_end = re.compile(r"\t.text|\t.section\s+.text|\t\.align|"+LABEL) - - r_gcroot_marker = re.compile(r"\t/[*] GCROOT ("+LOCALVARFP+") [*]/") - r_gcnocollect_marker = re.compile(r"\t/[*] GC_NOCOLLECT ("+OPERAND+") [*]/") - r_bottom_marker = re.compile(r"\t/[*] GC_STACK_BOTTOM [*]/") - - FUNCTIONS_NOT_RETURNING = { - '_exit': None, - '__assert_fail': None, - '___assert_rtn': None, - 'L___assert_rtn$stub': None, - 'L___eprintf$stub': None, - '__stack_chk_fail': None, - } - for _name in FunctionGcRootTracker.BASE_FUNCTIONS_NOT_RETURNING: - FUNCTIONS_NOT_RETURNING[_name] = None - - def __init__(self, lines, filetag=0): - match = self.r_functionstart.match(lines[0]) - funcname = match.group(1) - match = self.r_functionend.match(lines[-1]) - assert funcname == match.group(1) - assert funcname == match.group(2) - super(ElfFunctionGcRootTracker64, self).__init__( - funcname, lines, filetag) - - def extract_immediate(self, value): - if not value.startswith('$'): - return None - return int(value[1:]) - -ElfFunctionGcRootTracker64.init_regexp() - -class DarwinFunctionGcRootTracker32(ElfFunctionGcRootTracker32): - format = 'darwin' - function_names_prefix = '_' - - r_functionstart = re.compile(r"_(\w+):\s*$") - OFFSET_LABELS = 0 - - def __init__(self, lines, filetag=0): - match = self.r_functionstart.match(lines[0]) - funcname = '_' + match.group(1) - FunctionGcRootTracker32.__init__(self, funcname, lines, filetag) - -class DarwinFunctionGcRootTracker64(ElfFunctionGcRootTracker64): - format = 'darwin64' - function_names_prefix = '_' - - LABEL = ElfFunctionGcRootTracker64.LABEL - r_jmptable_item = re.compile(r"\t.(?:long|quad)\t"+LABEL+"(-\"?[A-Za-z0-9$]+\"?)?\s*$") - - r_functionstart = re.compile(r"_(\w+):\s*$") - OFFSET_LABELS = 0 - - def __init__(self, lines, filetag=0): - match = self.r_functionstart.match(lines[0]) - funcname = '_' + match.group(1) - FunctionGcRootTracker64.__init__(self, funcname, lines, filetag) - -class Mingw32FunctionGcRootTracker(DarwinFunctionGcRootTracker32): - format = 'mingw32' - function_names_prefix = '_' - - FUNCTIONS_NOT_RETURNING = { - '_exit': None, - '__assert': None, - } - for _name in FunctionGcRootTracker.BASE_FUNCTIONS_NOT_RETURNING: - FUNCTIONS_NOT_RETURNING['_' + _name] = None - -class MsvcFunctionGcRootTracker(FunctionGcRootTracker32): - format = 'msvc' - function_names_prefix = '_' - - ESP = 'esp' - EBP = 'ebp' - EAX = 'eax' - CALLEE_SAVE_REGISTERS = ['ebx', 'esi', 'edi', 'ebp'] - REG2LOC = dict((_reg, LOC_REG | ((_i+1)<<2)) - for _i, _reg in enumerate(CALLEE_SAVE_REGISTERS)) - TOP_OF_STACK_MINUS_WORD = 'DWORD PTR [esp-4]' - - OPERAND = r'(?:(:?WORD|DWORD|BYTE) PTR |OFFSET )?[_\w?:@$]*(?:[-+0-9]+)?(:?\[[-+*\w0-9]+\])?' - LABEL = r'([a-zA-Z_$@.][a-zA-Z0-9_$@.]*)' - OFFSET_LABELS = 0 - - r_segmentstart = re.compile(r"[_A-Z]+\tSEGMENT$") - r_segmentend = re.compile(r"[_A-Z]+\tENDS$") - r_functionstart = re.compile(r"; Function compile flags: ") - r_codestart = re.compile(LABEL+r"\s+PROC\s*(:?;.+)?\n$") - r_functionend = re.compile(LABEL+r"\s+ENDP\s*$") - r_symboldefine = re.compile(r"([_A-Za-z0-9$]+) = ([-0-9]+)\s*;.+\n") - - LOCALVAR = r"eax|edx|ecx|ebx|esi|edi|ebp|DWORD PTR [-+]?\d*\[esp[-+]?\d*\]" - LOCALVARFP = LOCALVAR + r"|DWORD PTR -?\d*\[ebp\]" - r_localvarnofp = re.compile(LOCALVAR) - r_localvarfp = re.compile(LOCALVARFP) - r_localvar_esp = re.compile(r"DWORD PTR ([-+]?\d+)?\[esp([-+]?\d+)?\]") - r_localvar_ebp = re.compile(r"DWORD PTR ([-+]?\d+)?\[ebp([-+]?\d+)?\]") - - r_rel_label = re.compile(r"$1") # never matches - r_jump_rel_label = re.compile(r"$1") # never matches - - r_unaryinsn_star= re.compile(r"\t[a-z]\w*\s+DWORD PTR ("+OPERAND+")\s*$") - r_jmptable_item = re.compile(r"\tDD\t"+LABEL+"(-\"[A-Za-z0-9$]+\")?\s*$") - r_jmptable_end = re.compile(r"[^\t\n;]") - - r_gcroot_marker = re.compile(r"$1") # never matches - r_gcroot_marker_var = re.compile(r"DWORD PTR .+_constant_always_one_.+pypy_asm_gcroot") - r_gcnocollect_marker = re.compile(r"\spypy_asm_gc_nocollect\(("+OPERAND+")\);") - r_bottom_marker = re.compile(r"; .+\spypy_asm_stack_bottom\(\);") - - FUNCTIONS_NOT_RETURNING = { - '__exit': None, - '__assert': None, - '__wassert': None, - '__imp__abort': None, - '__imp___wassert': None, - 'DWORD PTR __imp__abort': None, - 'DWORD PTR __imp___wassert': None, - } - for _name in FunctionGcRootTracker.BASE_FUNCTIONS_NOT_RETURNING: - FUNCTIONS_NOT_RETURNING['_' + _name] = None - - @classmethod - def init_regexp(cls): - super(MsvcFunctionGcRootTracker, cls).init_regexp() - cls.r_binaryinsn = re.compile(r"\t[a-z]\w*\s+(?P<target>"+cls.OPERAND+r"),\s*(?P<source>"+cls.OPERAND+r")\s*(?:;.+)?$") - cls.r_jump = re.compile(r"\tj\w+\s+(?:SHORT |DWORD PTR )?"+cls.LABEL+"\s*$") - - def __init__(self, lines, filetag=0): - self.defines = {} - for i, line in enumerate(lines): - if self.r_symboldefine.match(line): - match = self.r_symboldefine.match(line) - name = match.group(1) - value = int(match.group(2)) - self.defines[name] = value - continue - - match = self.r_codestart.match(line) - if match: - self.skip = i - break - - funcname = match.group(1) - super(MsvcFunctionGcRootTracker, self).__init__( - funcname, lines, filetag) - - def replace_symbols(self, operand): - for name, value in self.defines.items(): - operand = operand.replace(name, str(value)) - return operand - - for name in ''' - push pop mov lea - xor sub add - '''.split(): - locals()['visit_' + name] = getattr(FunctionGcRootTracker32, - 'visit_' + name + 'l') - - visit_int = FunctionGcRootTracker32.visit_nop - # probably not GC pointers - visit_cdq = FunctionGcRootTracker32.visit_nop - - def visit_npad(self, line): - # MASM has a nasty bug: it implements "npad 5" with "add eax, 0" - # which is a not no-op because it clears flags. - # I've seen this instruction appear between "test" and "jne"... - # see http://www.masm32.com/board/index.php?topic=13122 - match = self.r_unaryinsn.match(line) - arg = match.group(1) - if arg == "5": - # replace with "npad 3; npad 2" - self.lines[self.currentlineno] = "\tnpad\t3\n" "\tnpad\t2\n" - return [] - - def extract_immediate(self, value): - try: - return int(value) - except ValueError: - return None - - def _visit_gcroot_marker(self, line=None): - # two possible patterns: - # 1. mov reg, DWORD PTR _always_one_ - # imul target, reg - # 2. mov reg, DWORD PTR _always_one_ - # imul reg, target - assert self.lines[self.currentlineno].startswith("\tmov\t") - mov = self.r_binaryinsn.match(self.lines[self.currentlineno]) - assert re.match("DWORD PTR .+_always_one_", mov.group("source")) - reg = mov.group("target") - - self.lines[self.currentlineno] = ";" + self.lines[self.currentlineno] - - # the 'imul' must appear in the same block; the 'reg' must not - # appear in the instructions between - imul = None - lineno = self.currentlineno + 1 - stop = False - while not stop: - line = self.lines[lineno] - if line == '\n': - stop = True - elif line.startswith("\tjmp\t"): - stop = True - elif self.r_gcroot_marker_var.search(line): - stop = True - elif (line.startswith("\tmov\t%s," % (reg,)) or - line.startswith("\tmovsx\t%s," % (reg,)) or - line.startswith("\tmovzx\t%s," % (reg,))): - # mov reg, <arg> - stop = True - elif line.startswith("\txor\t%s, %s" % (reg, reg)): - # xor reg, reg - stop = True - elif line.startswith("\timul\t"): - imul = self.r_binaryinsn.match(line) - imul_arg1 = imul.group("target") - imul_arg2 = imul.group("source") - if imul_arg1 == reg or imul_arg2 == reg: - break - # the register may not appear in other instructions - elif reg in line: - assert False, (line, lineno) - - lineno += 1 - else: - # No imul, the returned value is not used in this function - return [] - - if reg == imul_arg2: - self.lines[lineno] = ";" + self.lines[lineno] - return InsnGCROOT(self.replace_symbols(imul_arg1)) - else: - assert reg == imul_arg1 - self.lines[lineno] = "\tmov\t%s, %s\n" % (imul_arg1, imul_arg2) - if imul_arg2.startswith('OFFSET '): - # ignore static global variables - pass - else: - self.lines[lineno] += "\t; GCROOT\n" - - return [] - - def insns_for_copy(self, source, target): - if self.r_gcroot_marker_var.match(source): - return self._visit_gcroot_marker() - if self.lines[self.currentlineno].endswith("\t; GCROOT\n"): - insns = [InsnGCROOT(self.replace_symbols(source))] - else: - insns = [] - return insns + super(MsvcFunctionGcRootTracker, self).insns_for_copy(source, target) - - -MsvcFunctionGcRootTracker.init_regexp() - -class AssemblerParser(object): - def __init__(self, verbose=0, shuffle=False): - self.verbose = verbose - self.shuffle = shuffle - self.gcmaptable = [] - - def process(self, iterlines, newfile, filename='?'): - for in_function, lines in self.find_functions(iterlines): - if in_function: - tracker = self.process_function(lines, filename) - lines = tracker.lines - self.write_newfile(newfile, lines, filename.split('.')[0]) - if self.verbose == 1: - sys.stderr.write('\n') - - def write_newfile(self, newfile, lines, grist): - newfile.writelines(lines) - - def process_function(self, lines, filename): - tracker = self.FunctionGcRootTracker( - lines, filetag=getidentifier(filename)) - if self.verbose == 1: - sys.stderr.write('.') - elif self.verbose > 1: - print >> sys.stderr, '[trackgcroot:%s] %s' % (filename, - tracker.funcname) - table = tracker.computegcmaptable(self.verbose) - if self.verbose > 1: - for label, state in table: - print >> sys.stderr, label, '\t', tracker.format_callshape(state) - table = compress_gcmaptable(table) - if self.shuffle and random.random() < 0.5: - self.gcmaptable[:0] = table - else: - self.gcmaptable.extend(table) - return tracker - -class ElfAssemblerParser(AssemblerParser): - format = "elf" - FunctionGcRootTracker = ElfFunctionGcRootTracker32 - - def find_functions(self, iterlines): - functionlines = [] - in_function = False - for line in iterlines: - match = self.FunctionGcRootTracker.r_functionstart.match(line) - if match and not match.group(1).startswith('__x86.get_pc_thunk.'): - assert not in_function, ( - "missed the end of the previous function") - yield False, functionlines - in_function = True - functionlines = [] - functionlines.append(line) - if self.FunctionGcRootTracker.r_functionend.match(line): - assert in_function, ( - "missed the start of the current function") - yield True, functionlines - in_function = False - functionlines = [] - if in_function and ".get_pc_thunk.bx" in functionlines[0]: - in_function = False # xxx? ignore this rare unclosed stub at - # the end of the file - assert not in_function, ( - "missed the end of the previous function") - yield False, functionlines - -class ElfAssemblerParser64(ElfAssemblerParser): - format = "elf64" - FunctionGcRootTracker = ElfFunctionGcRootTracker64 - -class DarwinAssemblerParser(AssemblerParser): - format = "darwin" - FunctionGcRootTracker = DarwinFunctionGcRootTracker32 - - r_textstart = re.compile(r"\t.text\s*$") - - # see - # http://developer.apple.com/documentation/developertools/Reference/Assembler/040-Assembler_Directives/asm_directives.html - OTHERSECTIONS = ['section', 'zerofill', - 'const', 'static_const', 'cstring', - 'literal4', 'literal8', 'literal16', - 'constructor', 'desctructor', - 'symbol_stub', - 'data', 'static_data', - 'non_lazy_symbol_pointer', 'lazy_symbol_pointer', - 'dyld', 'mod_init_func', 'mod_term_func', - 'const_data' - ] - r_sectionstart = re.compile(r"\t\.("+'|'.join(OTHERSECTIONS)+").*$") - sections_doesnt_end_function = {'cstring': True, 'const': True} - - def find_functions(self, iterlines): - functionlines = [] - in_text = False - in_function = False - for n, line in enumerate(iterlines): - if self.r_textstart.match(line): - in_text = True - elif self.r_sectionstart.match(line): - sectionname = self.r_sectionstart.match(line).group(1) - if (in_function and - sectionname not in self.sections_doesnt_end_function): - yield in_function, functionlines - functionlines = [] - in_function = False - in_text = False - elif in_text and self.FunctionGcRootTracker.r_functionstart.match(line): - yield in_function, functionlines - functionlines = [] - in_function = True - functionlines.append(line) - if functionlines: - yield in_function, functionlines - -class DarwinAssemblerParser64(DarwinAssemblerParser): - format = "darwin64" - FunctionGcRootTracker = DarwinFunctionGcRootTracker64 - -class Mingw32AssemblerParser(DarwinAssemblerParser): - format = "mingw32" - r_sectionstart = re.compile(r"^_loc()") - FunctionGcRootTracker = Mingw32FunctionGcRootTracker - -class MsvcAssemblerParser(AssemblerParser): - format = "msvc" - FunctionGcRootTracker = MsvcFunctionGcRootTracker - - def find_functions(self, iterlines): - functionlines = [] - in_function = False - in_segment = False - ignore_public = False - self.inline_functions = {} - for line in iterlines: - if line.startswith('; File '): - filename = line[:-1].split(' ', 2)[2] - ignore_public = ('wspiapi.h' in filename.lower()) - if ignore_public: - # this header define __inline functions, that are - # still marked as PUBLIC in the generated assembler - if line.startswith(';\tCOMDAT '): - funcname = line[:-1].split(' ', 1)[1] - self.inline_functions[funcname] = True - elif line.startswith('PUBLIC\t'): - funcname = line[:-1].split('\t')[1] - self.inline_functions[funcname] = True - - if self.FunctionGcRootTracker.r_segmentstart.match(line): - in_segment = True - elif self.FunctionGcRootTracker.r_functionstart.match(line): - assert not in_function, ( - "missed the end of the previous function") - in_function = True - if in_segment: - yield False, functionlines - functionlines = [] - functionlines.append(line) - if self.FunctionGcRootTracker.r_segmentend.match(line): - yield False, functionlines - in_segment = False - functionlines = [] - elif self.FunctionGcRootTracker.r_functionend.match(line): - assert in_function, ( - "missed the start of the current function") - yield True, functionlines - in_function = False - functionlines = [] - assert not in_function, ( - "missed the end of the previous function") - yield False, functionlines - - def write_newfile(self, newfile, lines, grist): - newlines = [] - for line in lines: - # truncate long comments - if line.startswith(";"): - line = line[:-1][:500] + '\n' - - # Workaround a bug in the .s files generated by msvc - # compiler: every string or float constant is exported - # with a name built after its value, and will conflict - # with other modules. - if line.startswith("PUBLIC\t"): - symbol = line[:-1].split()[1] - if symbol.startswith('__real@'): - line = '; ' + line - elif symbol.startswith("__mask@@"): - line = '; ' + line - elif symbol.startswith("??_C@"): - line = '; ' + line - elif symbol == "__$ArrayPad$": - line = '; ' + line - elif symbol in self.inline_functions: - line = '; ' + line - - # The msvc compiler writes "fucomip ST(1)" when the correct - # syntax is "fucomip ST, ST(1)" - if line == "\tfucomip\tST(1)\n": - line = "\tfucomip\tST, ST(1)\n" - - # Because we insert labels in the code, some "SHORT" jumps - # are now longer than 127 bytes. We turn them all into - # "NEAR" jumps. Note that the assembler allocates space - # for a near jump, but still generates a short jump when - # it can. - line = line.replace('\tjmp\tSHORT ', '\tjmp\t') - line = line.replace('\tjne\tSHORT ', '\tjne\t') - line = line.replace('\tje\tSHORT ', '\tje\t') - - newlines.append(line) - - if line == "\t.model\tflat\n": - newlines.append("\tassume fs:nothing\n") - - newfile.writelines(newlines) - -PARSERS = { - 'elf': ElfAssemblerParser, - 'elf64': ElfAssemblerParser64, - 'darwin': DarwinAssemblerParser, - 'darwin64': DarwinAssemblerParser64, - 'mingw32': Mingw32AssemblerParser, - 'msvc': MsvcAssemblerParser, - } - -class GcRootTracker(object): - - def __init__(self, verbose=0, shuffle=False, format='elf'): - self.verbose = verbose - self.shuffle = shuffle # to debug the sorting logic in asmgcroot.py - self.format = format - self.gcmaptable = [] - - def dump_raw_table(self, output): - print 'raw table' - for entry in self.gcmaptable: - print >> output, entry - - def reload_raw_table(self, input): - firstline = input.readline() - assert firstline == 'raw table\n' - for line in input: - entry = eval(line) - assert type(entry) is tuple - self.gcmaptable.append(entry) - - def dump(self, output): - - def _globalname(name, disp=""): - return tracker_cls.function_names_prefix + name - - def _variant(**kwargs): - txt = kwargs[self.format] - print >> output, "\t%s" % txt - - if self.format in ('elf64', 'darwin64'): - word_decl = '.quad' - else: - word_decl = '.long' - - tracker_cls = PARSERS[self.format].FunctionGcRootTracker - - # The pypy_asm_stackwalk() function - - if self.format == 'msvc': - print >> output, """\ - /* See description in asmgcroot.py */ - __declspec(naked) - long pypy_asm_stackwalk(void *callback) - { - __asm { - mov\tedx, DWORD PTR [esp+4]\t; 1st argument, which is the callback - mov\tecx, DWORD PTR [esp+8]\t; 2nd argument, which is gcrootanchor - mov\teax, esp\t\t; my frame top address - push\teax\t\t\t; ASM_FRAMEDATA[6] - push\tebp\t\t\t; ASM_FRAMEDATA[5] - push\tedi\t\t\t; ASM_FRAMEDATA[4] - push\tesi\t\t\t; ASM_FRAMEDATA[3] - push\tebx\t\t\t; ASM_FRAMEDATA[2] - - ; Add this ASM_FRAMEDATA to the front of the circular linked - ; list. Let's call it 'self'. - - mov\teax, DWORD PTR [ecx+4]\t\t; next = gcrootanchor->next - push\teax\t\t\t\t\t\t\t\t\t; self->next = next - push\tecx ; self->prev = gcrootanchor - mov\tDWORD PTR [ecx+4], esp\t\t; gcrootanchor->next = self - mov\tDWORD PTR [eax+0], esp\t\t\t\t\t; next->prev = self - - call\tedx\t\t\t\t\t\t; invoke the callback - - ; Detach this ASM_FRAMEDATA from the circular linked list - pop\tesi\t\t\t\t\t\t\t; prev = self->prev - pop\tedi\t\t\t\t\t\t\t; next = self->next - mov\tDWORD PTR [esi+4], edi\t\t; prev->next = next - mov\tDWORD PTR [edi+0], esi\t\t; next->prev = prev - - pop\tebx\t\t\t\t; restore from ASM_FRAMEDATA[2] - pop\tesi\t\t\t\t; restore from ASM_FRAMEDATA[3] - pop\tedi\t\t\t\t; restore from ASM_FRAMEDATA[4] - pop\tebp\t\t\t\t; restore from ASM_FRAMEDATA[5] - pop\tecx\t\t\t\t; ignored ASM_FRAMEDATA[6] - ; the return value is the one of the 'call' above, - ; because %eax (and possibly %edx) are unmodified - ret - } - } - """ - elif self.format in ('elf64', 'darwin64'): - if self.format == 'elf64': # gentoo patch: hardened systems - print >> output, "\t.section .note.GNU-stack,\"\",%progbits" - print >> output, "\t.text" - print >> output, "\t.globl %s" % _globalname('pypy_asm_stackwalk') - _variant(elf64='.type pypy_asm_stackwalk, @function', - darwin64='') - print >> output, "%s:" % _globalname('pypy_asm_stackwalk') - - s = """\ - /* See description in asmgcroot.py */ - .cfi_startproc - /* %rdi is the 1st argument, which is the callback */ - /* %rsi is the 2nd argument, which is gcrootanchor */ - movq\t%rsp, %rax\t/* my frame top address */ - pushq\t%rax\t\t/* ASM_FRAMEDATA[8] */ - pushq\t%rbp\t\t/* ASM_FRAMEDATA[7] */ - pushq\t%r15\t\t/* ASM_FRAMEDATA[6] */ - pushq\t%r14\t\t/* ASM_FRAMEDATA[5] */ - pushq\t%r13\t\t/* ASM_FRAMEDATA[4] */ - pushq\t%r12\t\t/* ASM_FRAMEDATA[3] */ - pushq\t%rbx\t\t/* ASM_FRAMEDATA[2] */ - - /* Add this ASM_FRAMEDATA to the front of the circular linked */ - /* list. Let's call it 'self'. */ - - movq\t8(%rsi), %rax\t/* next = gcrootanchor->next */ - pushq\t%rax\t\t\t\t/* self->next = next */ - pushq\t%rsi\t\t\t/* self->prev = gcrootanchor */ - movq\t%rsp, 8(%rsi)\t/* gcrootanchor->next = self */ - movq\t%rsp, 0(%rax)\t\t\t/* next->prev = self */ - .cfi_def_cfa_offset 80\t/* 9 pushes + the retaddr = 80 bytes */ - - /* note: the Mac OS X 16 bytes aligment must be respected. */ - call\t*%rdi\t\t/* invoke the callback */ - - /* Detach this ASM_FRAMEDATA from the circular linked list */ - popq\t%rsi\t\t/* prev = self->prev */ - popq\t%rdi\t\t/* next = self->next */ - movq\t%rdi, 8(%rsi)\t/* prev->next = next */ - movq\t%rsi, 0(%rdi)\t/* next->prev = prev */ - - popq\t%rbx\t\t/* restore from ASM_FRAMEDATA[2] */ - popq\t%r12\t\t/* restore from ASM_FRAMEDATA[3] */ - popq\t%r13\t\t/* restore from ASM_FRAMEDATA[4] */ - popq\t%r14\t\t/* restore from ASM_FRAMEDATA[5] */ - popq\t%r15\t\t/* restore from ASM_FRAMEDATA[6] */ - popq\t%rbp\t\t/* restore from ASM_FRAMEDATA[7] */ - popq\t%rcx\t\t/* ignored ASM_FRAMEDATA[8] */ - - /* the return value is the one of the 'call' above, */ - /* because %rax is unmodified */ - ret - .cfi_endproc - """ - if self.format == 'darwin64': - # obscure. gcc there seems not to support .cfi_... - # hack it out... - s = re.sub(r'([.]cfi_[^/\n]+)([/\n])', - r'/* \1 disabled on darwin */\2', s) - print >> output, s - _variant(elf64='.size pypy_asm_stackwalk, .-pypy_asm_stackwalk', - darwin64='') - else: - print >> output, "\t.text" - print >> output, "\t.globl %s" % _globalname('pypy_asm_stackwalk') - _variant(elf='.type pypy_asm_stackwalk, @function', - darwin='', - mingw32='') - print >> output, "%s:" % _globalname('pypy_asm_stackwalk') - - print >> output, """\ - /* See description in asmgcroot.py */ - movl\t4(%esp), %edx\t/* 1st argument, which is the callback */ - movl\t8(%esp), %ecx\t/* 2nd argument, which is gcrootanchor */ - movl\t%esp, %eax\t/* my frame top address */ - pushl\t%eax\t\t/* ASM_FRAMEDATA[6] */ - pushl\t%ebp\t\t/* ASM_FRAMEDATA[5] */ - pushl\t%edi\t\t/* ASM_FRAMEDATA[4] */ - pushl\t%esi\t\t/* ASM_FRAMEDATA[3] */ - pushl\t%ebx\t\t/* ASM_FRAMEDATA[2] */ - - /* Add this ASM_FRAMEDATA to the front of the circular linked */ - /* list. Let's call it 'self'. */ - - movl\t4(%ecx), %eax\t/* next = gcrootanchor->next */ - pushl\t%eax\t\t\t\t/* self->next = next */ - pushl\t%ecx\t\t\t/* self->prev = gcrootanchor */ - movl\t%esp, 4(%ecx)\t/* gcrootanchor->next = self */ - movl\t%esp, 0(%eax)\t\t\t/* next->prev = self */ - - /* note: the Mac OS X 16 bytes aligment must be respected. */ - call\t*%edx\t\t/* invoke the callback */ - - /* Detach this ASM_FRAMEDATA from the circular linked list */ - popl\t%esi\t\t/* prev = self->prev */ - popl\t%edi\t\t/* next = self->next */ - movl\t%edi, 4(%esi)\t/* prev->next = next */ - movl\t%esi, 0(%edi)\t/* next->prev = prev */ - - popl\t%ebx\t\t/* restore from ASM_FRAMEDATA[2] */ - popl\t%esi\t\t/* restore from ASM_FRAMEDATA[3] */ - popl\t%edi\t\t/* restore from ASM_FRAMEDATA[4] */ - popl\t%ebp\t\t/* restore from ASM_FRAMEDATA[5] */ - popl\t%ecx\t\t/* ignored ASM_FRAMEDATA[6] */ - - /* the return value is the one of the 'call' above, */ - /* because %eax (and possibly %edx) are unmodified */ - ret - """ - - _variant(elf='.size pypy_asm_stackwalk, .-pypy_asm_stackwalk', - darwin='', - mingw32='') - - if self.format == 'msvc': - for label, state, is_range in self.gcmaptable: - label = label[1:] - print >> output, "extern void* %s;" % label - - shapes = {} - shapelines = [] - shapeofs = 0 - - # write the tables - - if self.format == 'msvc': - print >> output, """\ - static struct { void* addr; long shape; } __gcmap[%d] = { - """ % (len(self.gcmaptable),) - for label, state, is_range in self.gcmaptable: - label = label[1:] - try: - n = shapes[state] - except KeyError: - n = shapes[state] = shapeofs - bytes = [str(b) for b in tracker_cls.compress_callshape(state)] - shapelines.append('\t%s,\t/* %s */\n' % ( - ', '.join(bytes), - shapeofs)) - shapeofs += len(bytes) - if is_range: - n = ~ n - print >> output, '{ &%s, %d},' % (label, n) - print >> output, """\ - }; - void* __gcmapstart = __gcmap; - void* __gcmapend = __gcmap + %d; - - char __gccallshapes[] = { - """ % (len(self.gcmaptable),) - output.writelines(shapelines) - print >> output, """\ - }; - """ - else: - print >> output, """\ - .data - .align 4 - .globl __gcmapstart - __gcmapstart: - """.replace("__gcmapstart", _globalname("__gcmapstart")) - - for label, state, is_range in self.gcmaptable: - try: - n = shapes[state] - except KeyError: - n = shapes[state] = shapeofs - bytes = [str(b) for b in tracker_cls.compress_callshape(state)] - shapelines.append('\t/*%d*/\t.byte\t%s\n' % ( - shapeofs, - ', '.join(bytes))) - shapeofs += len(bytes) - if is_range: - n = ~ n - print >> output, '\t%s\t%s-%d' % ( - word_decl, - label, - tracker_cls.OFFSET_LABELS) - print >> output, '\t%s\t%d' % (word_decl, n) - - print >> output, """\ - .globl __gcmapend - __gcmapend: - """.replace("__gcmapend", _globalname("__gcmapend")) - - _variant(elf='.section\t.rodata', - elf64='.section\t.rodata', - darwin='.const', - darwin64='.const', - mingw32='') - - print >> output, """\ - .globl __gccallshapes - __gccallshapes: - """.replace("__gccallshapes", _globalname("__gccallshapes")) - output.writelines(shapelines) - print >> output, """\ - #if defined(__linux__) && defined(__ELF__) - .section .note.GNU-stack,"",%progbits - #endif - """ - - def process(self, iterlines, newfile, filename='?'): - parser = PARSERS[format](verbose=self.verbose, shuffle=self.shuffle) - for in_function, lines in parser.find_functions(iterlines): - if in_function: - tracker = parser.process_function(lines, filename) - lines = tracker.lines - parser.write_newfile(newfile, lines, filename.split('.')[0]) - if self.verbose == 1: - sys.stderr.write('\n') - if self.shuffle and random.random() < 0.5: - self.gcmaptable[:0] = parser.gcmaptable - else: - self.gcmaptable.extend(parser.gcmaptable) - - -class UnrecognizedOperation(Exception): - pass - -class NoPatternMatch(Exception): - pass - - -# __________ table compression __________ - -def compress_gcmaptable(table): - # Compress ranges table[i:j] of entries with the same state - # into a single entry whose label is the start of the range. - # The last element in the table is never compressed in this - # way for debugging reasons, to avoid that a random address - # in memory gets mapped to the last element in the table - # just because it's the closest address. - # To be on the safe side, compress_gcmaptable() should be called - # after each function processed -- otherwise the result depends on - # the linker not rearranging the functions in memory, which is - # fragile (and wrong e.g. with "make profopt"). - i = 0 - limit = len(table) - 1 # only process entries table[:limit] - while i < len(table): - label1, state = table[i] - is_range = False - j = i + 1 - while j < limit and table[j][1] == state: - is_range = True - j += 1 - # now all entries in table[i:j] have the same state - yield (label1, state, is_range) - i = j - - -def getidentifier(s): - def mapchar(c): - if c.isalnum(): - return c - else: - return '_' - if s.endswith('.s'): - s = s[:-2] - s = ''.join([mapchar(c) for c in s]) - while s.endswith('__'): - s = s[:-1] - return s - - -if __name__ == '__main__': - verbose = 0 - shuffle = False - output_raw_table = False - if sys.platform == 'darwin': - if sys.maxint > 2147483647: - format = 'darwin64' - else: - format = 'darwin' - elif sys.platform == 'win32': - format = 'mingw32' - else: - if sys.maxint > 2147483647: - format = 'elf64' - else: - format = 'elf' - while len(sys.argv) > 1: - if sys.argv[1] == '-v': - del sys.argv[1] - verbose = sys.maxint - elif sys.argv[1] == '-r': - del sys.argv[1] - shuffle = True - elif sys.argv[1] == '-t': - del sys.argv[1] - output_raw_table = True - elif sys.argv[1].startswith('-f'): - format = sys.argv[1][2:] - del sys.argv[1] - elif sys.argv[1].startswith('-'): - print >> sys.stderr, "unrecognized option:", sys.argv[1] - sys.exit(1) - else: - break - tracker = GcRootTracker(verbose=verbose, shuffle=shuffle, format=format) - for fn in sys.argv[1:]: - f = open(fn, 'r') - firstline = f.readline() - f.seek(0) - assert firstline, "file %r is empty!" % (fn,) - if firstline == 'raw table\n': - tracker.reload_raw_table(f) - f.close() - else: - assert fn.endswith('.s'), fn - lblfn = fn[:-2] + '.lbl.s' - g = open(lblfn, 'w') - try: - tracker.process(f, g, filename=fn) - except: - g.close() - os.unlink(lblfn) - raise - g.close() - f.close() - if output_raw_table: - tracker.dump_raw_table(sys.stdout) - if not output_raw_table: - tracker.dump(sys.stdout) diff -Nru pypy-7.1.1+dfsg/rpython/translator/c/gc.py pypy-7.3.1+dfsg/rpython/translator/c/gc.py --- pypy-7.1.1+dfsg/rpython/translator/c/gc.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/translator/c/gc.py 2020-04-10 19:28:41.000000000 +0000 @@ -388,10 +388,14 @@ raise Exception("the FramewokGCTransformer should handle this") def OP_GC_GCFLAG_EXTRA(self, funcgen, op): - gcflag_extra = self.db.gctransformer.gcdata.gc.gcflag_extra + subopnum = op.args[0].value + if subopnum != 4: + gcflag_extra = self.db.gctransformer.gcdata.gc.gcflag_extra + else: + gcflag_extra = self.db.gctransformer.gcdata.gc.gcflag_dummy + # if gcflag_extra == 0: return BasicGcPolicy.OP_GC_GCFLAG_EXTRA(self, funcgen, op) - subopnum = op.args[0].value if subopnum == 1: return '%s = 1; /* has_gcflag_extra */' % ( funcgen.expr(op.result),) @@ -407,6 +411,8 @@ parts.insert(0, '%s ^= %dL;' % (hdrfield, gcflag_extra)) parts.append('/* toggle_gcflag_extra */') + elif subopnum == 4: # get_gcflag_dummy + parts.append('/* get_gcflag_dummy */') else: raise AssertionError(subopnum) return ' '.join(parts) @@ -450,9 +456,8 @@ # XXX hard-code the field name here gcpol_ss = '%s->gcd_inst_root_stack_top' % funcgen.expr(c_gcdata) # - yield ('typedef struct { void %s; } pypy_ss_t;' + yield ('typedef struct { char %s; } pypy_ss_t;' % ', '.join(['*s%d' % i for i in range(numcolors)])) - yield 'pypy_ss_t *ss;' funcgen.gcpol_ss = gcpol_ss def OP_GC_PUSH_ROOTS(self, funcgen, op): @@ -462,39 +467,29 @@ raise Exception("gc_pop_roots should be removed by postprocess_graph") def OP_GC_ENTER_ROOTS_FRAME(self, funcgen, op): - return 'ss = (pypy_ss_t *)%s; %s = (void *)(ss+1);' % ( - funcgen.gcpol_ss, funcgen.gcpol_ss) + # avoid arithmatic on void* + return '({0}) = (char*)({0}) + sizeof(pypy_ss_t);'.format(funcgen.gcpol_ss,) def OP_GC_LEAVE_ROOTS_FRAME(self, funcgen, op): - return '%s = (void *)ss;' % funcgen.gcpol_ss + # avoid arithmatic on void* + return '({0}) = (char*)({0}) - sizeof(pypy_ss_t);'.format(funcgen.gcpol_ss,) def OP_GC_SAVE_ROOT(self, funcgen, op): num = op.args[0].value exprvalue = funcgen.expr(op.args[1]) - return 'ss->s%d = (void *)%s;\t/* gc_save_root */' % (num, exprvalue) + return '((pypy_ss_t *)%s)[-1].s%d = (char *)%s;' % ( + funcgen.gcpol_ss, num, exprvalue) def OP_GC_RESTORE_ROOT(self, funcgen, op): num = op.args[0].value exprvalue = funcgen.expr(op.args[1]) typename = funcgen.db.gettype(op.args[1].concretetype) - result = '%s = (%s)ss->s%d;' % (exprvalue, cdecl(typename, ''), num) + result = '%s = (%s)((pypy_ss_t *)%s)[-1].s%d;' % ( + exprvalue, cdecl(typename, ''), funcgen.gcpol_ss, num) if isinstance(op.args[1], Constant): - return '/* %s\t* gc_restore_root */' % result + return '/* %s */' % result else: - return '%s\t/* gc_restore_root */' % result - - -class AsmGcRootFrameworkGcPolicy(BasicFrameworkGcPolicy): - - def gettransformer(self, translator, gchooks): - from rpython.memory.gctransform import asmgcroot - return asmgcroot.AsmGcRootFrameworkGCTransformer(translator, gchooks) - - def GC_KEEPALIVE(self, funcgen, v): - return 'pypy_asm_keepalive(%s);' % funcgen.expr(v) - - def OP_GC_STACK_BOTTOM(self, funcgen, op): - return 'pypy_asm_stack_bottom();' + return result name_to_gcpolicy = { @@ -502,7 +497,6 @@ 'ref': RefcountingGcPolicy, 'none': NoneGcPolicy, 'framework+shadowstack': ShadowStackFrameworkGcPolicy, - 'framework+asmgcc': AsmGcRootFrameworkGcPolicy } diff -Nru pypy-7.1.1+dfsg/rpython/translator/c/genc.py pypy-7.3.1+dfsg/rpython/translator/c/genc.py --- pypy-7.1.1+dfsg/rpython/translator/c/genc.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/translator/c/genc.py 2020-04-10 19:28:41.000000000 +0000 @@ -87,10 +87,6 @@ gcpolicyclass = self.get_gcpolicyclass() - if self.config.translation.gcrootfinder == "asmgcc": - if not self.standalone: - raise NotImplementedError("--gcrootfinder=asmgcc requires standalone") - exctransformer = translator.getexceptiontransformer() db = LowLevelDatabase(translator, standalone=self.standalone, gcpolicyclass=gcpolicyclass, @@ -222,6 +218,10 @@ fn = py.path.local(fn) if not fn.relto(udir): newname = self.targetdir.join(fn.basename) + if newname.check(exists=True): + raise ValueError( + "Cannot have two different separate_module_sources " + "with the same basename, please rename one: %s" % fn.basename) fn.copy(newname) fn = newname extrafiles.append(fn) @@ -370,6 +370,7 @@ def gen_makefile(self, targetdir, exe_name=None, headers_to_precompile=[]): module_files = self.eventually_copy(self.eci.separate_module_files) self.eci.separate_module_files = [] + self.eci.compile_extra += ('-DPYPY_MAKEFILE',) cfiles = [self.c_source_filename] + self.extrafiles + list(module_files) if exe_name is not None: exe_name = targetdir.join(exe_name) @@ -504,61 +505,8 @@ mk.rule('clean', '', 'rm -f $(OBJECTS) $(DEFAULT_TARGET) $(TARGET) $(GCMAPFILES) $(ASMFILES) *.gc?? ../module_cache/*.gc??') mk.rule('clean_noprof', '', 'rm -f $(OBJECTS) $(DEFAULT_TARGET) $(TARGET) $(GCMAPFILES) $(ASMFILES)') - #XXX: this conditional part is not tested at all if self.config.translation.gcrootfinder == 'asmgcc': - if self.translator.platform.name == 'msvc': - raise Exception("msvc no longer supports asmgcc") - _extra = '' - if self.config.translation.shared: - _extra = ' -fPIC' - _extra += ' -fdisable-tree-fnsplit' # seems to help - mk.definition('DEBUGFLAGS', - '-O2 -fomit-frame-pointer -g'+ _extra) - - if self.config.translation.shared: - mk.definition('PYPY_MAIN_FUNCTION', "pypy_main_startup") - else: - mk.definition('PYPY_MAIN_FUNCTION', "main") - - mk.definition('PYTHON', get_recent_cpython_executable()) - - mk.definition('GCMAPFILES', '$(subst .vmprof.s,.gcmap,$(subst .c,.gcmap,$(SOURCES)))') - mk.definition('OBJECTS1', '$(subst .vmprof.s,.o,$(subst .c,.o,$(SOURCES)))') - mk.definition('OBJECTS', '$(OBJECTS1) gcmaptable.s') - - # the CFLAGS passed to gcc when invoked to assembler the .s file - # must not contain -g. This confuses gcc 5.1. (Note that it - # would seem that gcc 5.1 with "-g" does not produce debugging - # info in a format that gdb 4.7.1 can read.) - mk.definition('CFLAGS_AS', '$(patsubst -g,,$(CFLAGS))') - - # the rule that transforms %.c into %.o, by compiling it to - # %.s, then applying trackgcroot to get %.lbl.s and %.gcmap, and - # finally by using the assembler ($(CC) again for now) to get %.o - mk.rule('%.o %.gcmap', '%.c', [ - '$(CC) $(CFLAGS) $(CFLAGSEXTRA) -frandom-seed=$< ' - '-o $*.s -S $< $(INCLUDEDIRS)', - '$(PYTHON) $(RPYDIR)/translator/c/gcc/trackgcroot.py ' - '-t $*.s > $*.gctmp', - '$(CC) $(CFLAGS_AS) -o $*.o -c $*.lbl.s', - 'mv $*.gctmp $*.gcmap', - 'rm $*.s $*.lbl.s']) - - # this is for manually written assembly files which needs to be parsed by asmgcc - mk.rule('%.o %.gcmap', '%.vmprof.s', [ - '$(PYTHON) $(RPYDIR)/translator/c/gcc/trackgcroot.py ' - '-t $*.vmprof.s > $*.gctmp', - '$(CC) -o $*.o -c $*.vmprof.lbl.s', - 'mv $*.gctmp $*.gcmap', - 'rm $*.vmprof.lbl.s']) - - # the rule to compute gcmaptable.s - mk.rule('gcmaptable.s', '$(GCMAPFILES)', - [ - '$(PYTHON) $(RPYDIR)/translator/c/gcc/trackgcroot.py ' - '$(GCMAPFILES) > $@.tmp', - 'mv $@.tmp $@']) - + raise AssertionError("asmgcc not supported any more") else: if self.translator.platform.name == 'msvc': mk.definition('DEBUGFLAGS', '-MD -Zi') @@ -864,10 +812,6 @@ # generate the start-up code and put it into a function print >> f, 'void RPython_StartupCode(void) {' - bk = database.translator.annotator.bookkeeper - if bk.thread_local_fields: - print >> f, '\tRPython_ThreadLocals_ProgramInit();' - for line in database.gcpolicy.gc_startup_code(): print >> f,"\t" + line diff -Nru pypy-7.1.1+dfsg/rpython/translator/c/src/commondefs.h pypy-7.3.1+dfsg/rpython/translator/c/src/commondefs.h --- pypy-7.1.1+dfsg/rpython/translator/c/src/commondefs.h 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/translator/c/src/commondefs.h 2020-04-10 19:28:41.000000000 +0000 @@ -123,3 +123,7 @@ # define MS_WINDOWS /* a synonym */ #endif #endif + +/* stringify a constant */ +#define Py_XSTR(x) #x +#define Py_STR(x) Py_XSTR(x) diff -Nru pypy-7.1.1+dfsg/rpython/translator/c/src/entrypoint.c pypy-7.3.1+dfsg/rpython/translator/c/src/entrypoint.c --- pypy-7.1.1+dfsg/rpython/translator/c/src/entrypoint.c 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/translator/c/src/entrypoint.c 2020-04-10 19:28:41.000000000 +0000 @@ -15,17 +15,6 @@ #include <stdlib.h> #include <stdio.h> -#ifdef __GNUC__ -/* Hack to prevent this function from being inlined. Helps asmgcc - because the main() function has often a different prologue/epilogue. */ -RPY_EXTERN -int pypy_main_function(int argc, char *argv[]) __attribute__((__noinline__)); -#endif - -# ifdef PYPY_USE_ASMGCC -# include "structdef.h" -# include "forwarddecl.h" -# endif #if defined(MS_WINDOWS) # include <stdio.h> @@ -35,6 +24,7 @@ #ifdef RPY_WITH_GIL # include <src/thread.h> +# include <src/threadlocal.h> #endif #ifdef RPY_REVERSE_DEBUGGER @@ -45,16 +35,10 @@ void rpython_startup_code(void) { #ifdef RPY_WITH_GIL + RPython_ThreadLocals_ProgramInit(); RPyGilAcquire(); #endif -#ifdef PYPY_USE_ASMGCC - pypy_g_rpython_rtyper_lltypesystem_rffi_StackCounter.sc_inst_stacks_counter++; -#endif - pypy_asm_stack_bottom(); RPython_StartupCode(); -#ifdef PYPY_USE_ASMGCC - pypy_g_rpython_rtyper_lltypesystem_rffi_StackCounter.sc_inst_stacks_counter--; -#endif #ifdef RPY_WITH_GIL RPyGilRelease(); #endif @@ -78,13 +62,10 @@ program starts threads, it needs to call rgil.gil_allocate(). RPyGilAcquire() still works without that, but crash if it finds that it really needs to wait on a mutex. */ + RPython_ThreadLocals_ProgramInit(); RPyGilAcquire(); #endif -#ifdef PYPY_USE_ASMGCC - pypy_g_rpython_rtyper_lltypesystem_rffi_StackCounter.sc_inst_stacks_counter++; -#endif - pypy_asm_stack_bottom(); instrument_setup(); #ifdef RPY_REVERSE_DEBUGGER diff -Nru pypy-7.1.1+dfsg/rpython/translator/c/src/mem.c pypy-7.3.1+dfsg/rpython/translator/c/src/mem.c --- pypy-7.1.1+dfsg/rpython/translator/c/src/mem.c 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/translator/c/src/mem.c 2020-04-10 19:28:41.000000000 +0000 @@ -159,29 +159,3 @@ return result; } #endif /* BOEHM GC */ - - -#ifdef RPY_ASSERT -# ifdef PYPY_USE_ASMGCC -# include "structdef.h" -# include "forwarddecl.h" -# endif -void pypy_check_stack_count(void) -{ -# ifdef PYPY_USE_ASMGCC - void *anchor = (void*)&pypy_g_ASM_FRAMEDATA_HEAD; - void *fd = ((void* *) (((char *)anchor) + sizeof(void*)))[0]; - long got = 0; - long stacks_counter = - pypy_g_rpython_rtyper_lltypesystem_rffi_StackCounter.sc_inst_stacks_counter; - while (fd != anchor) { - got += 1; - fd = ((void* *) (((char *)fd) + sizeof(void*)))[0]; - } - RPyAssert(rpy_fastgil == 1, - "pypy_check_stack_count doesn't have the GIL"); - RPyAssert(got == stacks_counter - 1, - "bad stacks_counter or non-closed stacks around"); -# endif -} -#endif diff -Nru pypy-7.1.1+dfsg/rpython/translator/c/src/mem.h pypy-7.3.1+dfsg/rpython/translator/c/src/mem.h --- pypy-7.1.1+dfsg/rpython/translator/c/src/mem.h 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/translator/c/src/mem.h 2020-04-10 19:28:41.000000000 +0000 @@ -4,7 +4,7 @@ #include <string.h> -/* used by rpython.rlib.rstack, but also by asmgcc */ +/* used by rpython.rlib.rstack */ #define OP_STACK_CURRENT(r) r = (Signed)&r @@ -163,101 +163,17 @@ #define OP_GC_IGNORE_FINALIZER(x, r) /* nothing */ /****************************/ -/* The "asmgcc" root finder */ +/* misc stuff */ /****************************/ #ifndef _MSC_VER -/* Implementation for Linux */ -RPY_EXTERN char __gcmapstart; -RPY_EXTERN char __gcmapend; -RPY_EXTERN char __gccallshapes; -RPY_EXTERN long pypy_asm_stackwalk(void*, void*); -#define __gcnoreorderhack __gcmapend - -/* The following pseudo-instruction is used by --gcrootfinder=asmgcc - just after a call to tell gcc to put a GCROOT mark on each gc-pointer - local variable. All such local variables need to go through a "v = - pypy_asm_gcroot(v)". The old value should not be used any more by - the C code; this prevents the following case from occurring: gcc - could make two copies of the local variable (e.g. one in the stack - and one in a register), pass one to GCROOT, and later use the other - one. In practice the pypy_asm_gcroot() is often a no-op in the final - machine code and doesn't prevent most optimizations. */ - -/* With gcc, getting the asm() right was tricky, though. The asm() is - not volatile so that gcc is free to delete it if the output variable - is not used at all. We need to prevent gcc from moving the asm() - *before* the call that could cause a collection; this is the purpose - of the (unused) __gcnoreorderhack input argument. Any memory input - argument would have this effect: as far as gcc knows the call - instruction can modify arbitrary memory, thus creating the order - dependency that we want. */ - -#define pypy_asm_gcroot(p) ({void*_r; \ - asm ("/* GCROOT %0 */" : "=g" (_r) : \ - "0" (p), "m" (__gcnoreorderhack)); \ - _r; }) - -#define pypy_asm_gc_nocollect(f) asm volatile ("/* GC_NOCOLLECT " #f " */" \ - : : ) - -#define pypy_asm_keepalive(v) asm volatile ("/* keepalive %0 */" : : \ - "g" (v)) - -/* marker for trackgcroot.py, and inhibits tail calls */ -#define pypy_asm_stack_bottom() { asm volatile ("/* GC_STACK_BOTTOM */" : : : \ - "memory"); pypy_check_stack_count(); } -#ifdef RPY_ASSERT -RPY_EXTERN void pypy_check_stack_count(void); +# define pypy_asm_keepalive(v) asm volatile ("/* keepalive %0 */" : : \ + "g" (v)) #else -static void pypy_check_stack_count(void) { } -#endif - - -#define OP_GC_ASMGCROOT_STATIC(i, r) r = \ - i == 0 ? (void*)&__gcmapstart : \ - i == 1 ? (void*)&__gcmapend : \ - i == 2 ? (void*)&__gccallshapes : \ - NULL - -#else -/* implementation of asmgcroot for Windows */ -RPY_EXTERN void* __gcmapstart; -RPY_EXTERN void* __gcmapend; -RPY_EXTERN char* __gccallshapes; -RPY_EXTERN Signed pypy_asm_stackwalk(void*, void*); - -/* With the msvc Microsoft Compiler, the optimizer seems free to move - any code (even asm) that involves local memory (registers and stack). - The _ReadWriteBarrier function has an effect only where the content - of a global variable is *really* used. trackgcroot.py will remove - the extra instructions: the access to _constant_always_one_ is - removed, and the multiplication is replaced with a simple move. */ - -static __forceinline void* -pypy_asm_gcroot(void* _r1) -{ - static volatile int _constant_always_one_ = 1; - (Signed)_r1 *= _constant_always_one_; - _ReadWriteBarrier(); - return _r1; -} - -#define pypy_asm_gc_nocollect(f) "/* GC_NOCOLLECT " #f " */" - -#ifndef _WIN64 -# define pypy_asm_keepalive(v) __asm { } -#else - /* is there something cheaper? */ -# define pypy_asm_keepalive(v) _ReadWriteBarrier(); -#endif - -static __declspec(noinline) void pypy_asm_stack_bottom() { } - -#define OP_GC_ASMGCROOT_STATIC(i, r) \ - r = i == 0 ? (void*)__gcmapstart : \ - i == 1 ? (void*)__gcmapend : \ - i == 2 ? (void*)&__gccallshapes : \ - NULL - +# ifndef _WIN64 +# define pypy_asm_keepalive(v) __asm { } +# else + /* is there something cheaper? */ +# define pypy_asm_keepalive(v) _ReadWriteBarrier(); +# endif #endif diff -Nru pypy-7.1.1+dfsg/rpython/translator/c/src/precommondefs.h pypy-7.3.1+dfsg/rpython/translator/c/src/precommondefs.h --- pypy-7.1.1+dfsg/rpython/translator/c/src/precommondefs.h 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/translator/c/src/precommondefs.h 2020-04-10 19:28:41.000000000 +0000 @@ -73,8 +73,12 @@ # define RPY_EXTERN extern _RPY_HIDDEN #endif -#ifdef _WIN32 -# define inline _inline +#if defined(_MSC_VER) + #define INLINE __inline +#elif defined(__GNUC__) + #define INLINE __inline__ +#else + #error define inline for this compiler #endif #endif /* __PYPY_PRECOMMONDEFS_H */ diff -Nru pypy-7.1.1+dfsg/rpython/translator/c/src/stacklet/slp_platformselect.h pypy-7.3.1+dfsg/rpython/translator/c/src/stacklet/slp_platformselect.h --- pypy-7.1.1+dfsg/rpython/translator/c/src/stacklet/slp_platformselect.h 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/translator/c/src/stacklet/slp_platformselect.h 2020-04-10 19:28:41.000000000 +0000 @@ -10,6 +10,8 @@ #include "switch_x86_gcc.h" /* gcc on X86 */ #elif defined(__GNUC__) && defined(__arm__) #include "switch_arm_gcc.h" /* gcc on arm */ +#elif defined(__GNUC__) && defined(__aarch64__) +#include "switch_aarch64_gcc.h" /* gcc on aarch64 */ #elif defined(__GNUC__) && defined(__PPC64__) #include "switch_ppc64_gcc.h" /* gcc on ppc64 */ #elif defined(__GNUC__) && defined(__mips__) && defined(_ABI64) diff -Nru pypy-7.1.1+dfsg/rpython/translator/c/src/stacklet/switch_aarch64_gcc.h pypy-7.3.1+dfsg/rpython/translator/c/src/stacklet/switch_aarch64_gcc.h --- pypy-7.1.1+dfsg/rpython/translator/c/src/stacklet/switch_aarch64_gcc.h 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/translator/c/src/stacklet/switch_aarch64_gcc.h 2020-04-10 19:28:41.000000000 +0000 @@ -0,0 +1,101 @@ + +static void *slp_switch(void *(*save_state)(void*, void*), + void *(*restore_state)(void*, void*), + void *extra) __attribute__((noinline)); + +static void *slp_switch(void *(*save_state)(void*, void*), + void *(*restore_state)(void*, void*), + void *extra) +{ + void *result; + /* + registers to preserve: x18-x28, x29(fp), and v8-v15 + registers marked as clobbered: x0-x18, x30 + + Note that x18 appears in both lists; see below. We also save + x30 although it's also marked as clobbered, which might not + be necessary but doesn't hurt. + + Don't assume gcc saves any register for us when generating + code for slp_switch(). + + The values 'save_state', 'restore_state' and 'extra' are first moved + by gcc to some registers that are not marked as clobbered, so between + x19 and x29. Similarly, gcc expects 'result' to be in a register + between x19 and x29. We don't want x18 to be used here, because of + some special meaning it might have. We don't want x30 to be used + here, because it is clobbered by the first "blr". + + This means that three of the values we happen to save and restore + will, in fact, contain the three arguments, and one of these values + will, in fact, not be restored at all but receive 'result'. + */ + + __asm__ volatile ( + + /* The stack is supposed to be aligned as necessary already. + Save 12 registers from x18 to x29, plus 8 from v8 to v15 */ + + "stp x18, x19, [sp, -160]!\n" + "stp x20, x11, [sp, 16]\n" + "stp x22, x23, [sp, 32]\n" + "stp x24, x25, [sp, 48]\n" + "stp x26, x27, [sp, 64]\n" + "stp x28, x29, [sp, 80]\n" + "str d8, [sp, 96]\n" + "str d9, [sp, 104]\n" + "str d10, [sp, 112]\n" + "str d11, [sp, 120]\n" + "str d12, [sp, 128]\n" + "str d13, [sp, 136]\n" + "str d14, [sp, 144]\n" + "str d15, [sp, 152]\n" + + "mov x0, sp\n" /* arg 1: current (old) stack pointer */ + "mov x1, %[extra]\n" /* arg 2: extra, from x19-x28 */ + "blr %[save_state]\n" /* call save_state(), from x19-x28 */ + + /* skip the rest if the return value is null */ + "cbz x0, zero\n" + + "mov sp, x0\n" /* change the stack pointer */ + + /* From now on, the stack pointer is modified, but the content of the + stack is not restored yet. It contains only garbage here. */ + "mov x1, %[extra]\n" /* arg 2: extra, still from x19-x28 */ + /* arg 1: current (new) stack pointer is already in x0*/ + "blr %[restore_state]\n"/* call restore_state() */ + + /* The stack's content is now restored. */ + "zero:\n" + + /* Restore all saved registers */ + "ldp x20, x11, [sp, 16]\n" + "ldp x22, x23, [sp, 32]\n" + "ldp x24, x25, [sp, 48]\n" + "ldp x26, x27, [sp, 64]\n" + "ldp x28, x29, [sp, 80]\n" + "ldr d8, [sp, 96]\n" + "ldr d9, [sp, 104]\n" + "ldr d10, [sp, 112]\n" + "ldr d11, [sp, 120]\n" + "ldr d12, [sp, 128]\n" + "ldr d13, [sp, 136]\n" + "ldr d14, [sp, 144]\n" + "ldr d15, [sp, 152]\n" + "ldp x18, x19, [sp], 160\n" + + /* Move x0 into the final location of 'result' */ + "mov %[result], x0\n" + + : [result]"=r"(result) /* output variables */ + /* input variables */ + : [restore_state]"r"(restore_state), + [save_state]"r"(save_state), + [extra]"r"(extra) + : "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", + "x10", "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", + "memory", "cc", "x30" // x30==lr + ); + return result; +} diff -Nru pypy-7.1.1+dfsg/rpython/translator/c/src/support.c pypy-7.3.1+dfsg/rpython/translator/c/src/support.c --- pypy-7.1.1+dfsg/rpython/translator/c/src/support.c 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/translator/c/src/support.c 2020-04-10 19:28:41.000000000 +0000 @@ -14,7 +14,7 @@ #define NAN_WORD1 0 #define PY_UINT32_T unsigned int -#ifndef __BIG_ENDIAN__ +#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ #define IEEE_8087 #endif diff -Nru pypy-7.1.1+dfsg/rpython/translator/c/src/thread.c pypy-7.3.1+dfsg/rpython/translator/c/src/thread.c --- pypy-7.1.1+dfsg/rpython/translator/c/src/thread.c 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/translator/c/src/thread.c 2020-04-10 19:28:41.000000000 +0000 @@ -9,12 +9,15 @@ #include "common_header.h" #endif -#ifdef PYPY_USE_ASMGCC -# include "common_header.h" -# include "structdef.h" -# include "forwarddecl.h" + +#ifdef PYPY_MAKEFILE +/* This is needed for having 'pypy_threadlocal_s' defined, which is needed + for _rpygil_get_my_ident */ +# include "common_header.h" +# include "structdef.h" #endif + #ifdef _WIN32 #include "src/thread_nt.c" #else diff -Nru pypy-7.1.1+dfsg/rpython/translator/c/src/thread_gil.c pypy-7.3.1+dfsg/rpython/translator/c/src/thread_gil.c --- pypy-7.1.1+dfsg/rpython/translator/c/src/thread_gil.c 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/translator/c/src/thread_gil.c 2020-04-10 19:28:41.000000000 +0000 @@ -1,39 +1,77 @@ /* Idea: - - "The GIL" is a composite concept. There are two locks, and "the + 0. "The GIL" is a composite concept. There are two locks, and "the GIL is locked" when both are locked. - - The first lock is a simple global variable 'rpy_fastgil'. With - shadowstack, we use the most portable definition: 0 means unlocked - and != 0 means locked. With asmgcc, 0 means unlocked but only 1 - means locked. A different value means unlocked too, but the value - is used by the JIT to contain the stack top for stack root scanning. - - - The second lock is a regular mutex. In the fast path, it is never - unlocked. Remember that "the GIL is unlocked" means that either - the first or the second lock is unlocked. It should never be the + 1. The first lock is a simple global variable 'rpy_fastgil'. 0 means + unlocked, != 0 means unlocked (see point (3). + + 2. The second lock is a regular mutex called 'mutex_gil'. In the fast path, + it is never unlocked. Remember that "the GIL is unlocked" means that + either the first or the second lock is unlocked. It should never be the case that both are unlocked at the same time. - - Let's call "thread 1" the thread with the GIL. Whenever it does an - external function call, it sets 'rpy_fastgil' to 0 (unlocked). - This is the cheapest way to release the GIL. When it returns from - the function call, this thread attempts to atomically change - 'rpy_fastgil' to 1. In the common case where it works, thread 1 - has got the GIL back and so continues to run. - - - Say "thread 2" is eagerly waiting for thread 1 to become blocked in - some long-running call. Regularly, it checks if 'rpy_fastgil' is 0 - and tries to atomically change it to 1. If it succeeds, it means - that the GIL was not previously locked. Thread 2 has now got the GIL. - - - If there are more than 2 threads, the rest is really sleeping by - waiting on the 'mutex_gil_stealer' held by thread 2. - - - An additional mechanism is used for when thread 1 wants to - explicitly yield the GIL to thread 2: it does so by releasing - 'mutex_gil' (which is otherwise not released) but keeping the - value of 'rpy_fastgil' to 1. + 3. Whenever the GIL is locked, rpy_fastgil contains the thread ID of the + thread holding the GIL. Note that there is a period of time in which + rpy_fastgil contains a thread ID, but the GIL itself is not locked + because the mutex in point (2) is unlocked: however, this happens only + inside the functions RPyGilAcquireSlowPath and RPyGilYieldThread. So, for + "general" code, you can easily check whether you are holding the GIL by + doing: rpy_fastgil == rthread.get_ident() + +With this setup, we have a very fast way to release/acquire the GIL: + + 4. To release, you set rpy_fastgil=0; the invariant is that mutex_gil is + still locked at this point. + + 5. To acquire, you do a compare_and_swap on rpy_fastgil: if it was 0, then + it means the mutex_gil was already locked, so you have the GIL and you + are done. If rpy_fastgil was NOT 0, the compare_and_swap fails, so you + must go through the slow path in RPyGilAcquireSlowPath + +This fast path is implemented in two places: + + * RPyGilAcquire, to be called by general RPython code + + * By native code emitted by the JIT around external calls; look e.g. to + rpython.jit.backend.x86.callbuilder:move_real_result_and_call_reacqgil_addr + + +The slow path works as follows: + + 6. Suppose there are many threads which want the GIL: at any point in time, + only one will actively try to acquire the GIL. This is called "the + stealer". + + 7. To become the stealer, you need to acquire 'mutex_gil_stealer'. + + 8. Once you are the stealer, you try to acquire the GIL by running the + following loop: + + A. We try again to lock the GIL using the fast-path. + + B. Try to acquire 'mutex_gil' with a timeout. If you succeed, you set + rpy_fastgil and you are done. If not, go to A. + + + +To sum up, there are various possible patterns of interaction: + + - I release the GIL using the fast-path: the GIL will be acquired by a + thread in the fast path in point (2) OR the fast path in point (8.A). Note + that this could be myself a bit later + + - I want to explicitly yield the control to ANOTHER thread: I do this by + releasing mutex_gil: the stealer will acquire the GIL in point (8.B). + + - I want the GIL and there are exactly 2 threads in total: I will + immediately become the stealer and go to point 8 + + - I want the GIL but there are more than 2 threads in total: I will spend + most of my time waiting for mutex_gil_stealer, and then go to point 8 + + */ @@ -42,6 +80,9 @@ RPython libraries, they can be a collection of regular functions that also call RPyGilAcquire/RPyGilRelease; see test_standalone.TestShared. */ + +#include "src/threadlocal.h" + long rpy_fastgil = 0; static long rpy_waiting_threads = -42; /* GIL not initialized */ static volatile int rpy_early_poll_n = 0; @@ -67,43 +108,16 @@ } } -static void check_and_save_old_fastgil(long old_fastgil) -{ - assert(RPY_FASTGIL_LOCKED(rpy_fastgil)); - -#ifdef PYPY_USE_ASMGCC - if (old_fastgil != 0) { - /* this case only occurs from the JIT compiler */ - struct pypy_ASM_FRAMEDATA_HEAD0 *new = - (struct pypy_ASM_FRAMEDATA_HEAD0 *)old_fastgil; - struct pypy_ASM_FRAMEDATA_HEAD0 *root = &pypy_g_ASM_FRAMEDATA_HEAD; - struct pypy_ASM_FRAMEDATA_HEAD0 *next = root->as_next; - new->as_next = next; - new->as_prev = root; - root->as_next = new; - next->as_prev = new; - } -#else - assert(old_fastgil == 0); -#endif -} - #define RPY_GIL_POKE_MIN 40 #define RPY_GIL_POKE_MAX 400 -void RPyGilAcquireSlowPath(long old_fastgil) +void RPyGilAcquireSlowPath(void) { - /* Acquires the GIL. This assumes that we already did: - - old_fastgil = pypy_lock_test_and_set(&rpy_fastgil, 1); + /* Acquires the GIL. This is the slow path after which we failed + the compare-and-swap (after point (5)). Another thread is busy + with the GIL. */ - if (!RPY_FASTGIL_LOCKED(old_fastgil)) { - /* The fastgil was not previously locked: success. - 'mutex_gil' should still be locked at this point. - */ - } - else { - /* Otherwise, another thread is busy with the GIL. */ + if (1) { /* preserve commit history */ int n; long old_waiting_threads; @@ -148,10 +162,10 @@ while (n >= 0) { n--; if (old_waiting_threads != rpy_waiting_threads) { - /* If the number changed, it is because another thread + /* If the number changed, it is because another thread entered or left this function. In that case, stop this loop: if another thread left it means the GIL - has been acquired by that thread; if another thread + has been acquired by that thread; if another thread entered there is no point in running the present loop twice. */ break; @@ -160,8 +174,7 @@ RPy_CompilerMemoryBarrier(); if (!RPY_FASTGIL_LOCKED(rpy_fastgil)) { - old_fastgil = pypy_lock_test_and_set(&rpy_fastgil, 1); - if (!RPY_FASTGIL_LOCKED(old_fastgil)) { + if (_rpygil_acquire_fast_path()) { /* We got the gil before entering the waiting queue. In case there are other threads waiting for the GIL, wake up the stealer thread now and @@ -169,13 +182,16 @@ This will fall through if there are no other threads waiting. */ - check_and_save_old_fastgil(old_fastgil); + assert(RPY_FASTGIL_LOCKED(rpy_fastgil)); mutex2_unlock(&mutex_gil); break; } } } + /* Now we are in point (3): mutex_gil might be released, but + rpy_fastgil might still contain an arbitrary tid */ + /* Enter the waiting queue from the end. Assuming a roughly first-in-first-out order, this will nicely give the threads a round-robin chance. @@ -189,19 +205,22 @@ released. */ if (!RPY_FASTGIL_LOCKED(rpy_fastgil)) { - old_fastgil = pypy_lock_test_and_set(&rpy_fastgil, 1); - if (!RPY_FASTGIL_LOCKED(old_fastgil)) - /* yes, got a non-held value! Now we hold it. */ + /* point (8.A) */ + if (_rpygil_acquire_fast_path()) { + /* we just acquired the GIL */ break; + } } /* Sleep for one interval of time. We may be woken up earlier - if 'mutex_gil' is released. + if 'mutex_gil' is released. Point (8.B) */ if (mutex2_lock_timeout(&mutex_gil, 0.0001)) { /* 0.1 ms... */ /* We arrive here if 'mutex_gil' was recently released and we just relocked it. */ - old_fastgil = 0; + assert(RPY_FASTGIL_LOCKED(rpy_fastgil)); + /* restore the invariant point (3) */ + rpy_fastgil = _rpygil_get_my_ident(); break; } /* Loop back. */ @@ -210,7 +229,7 @@ mutex2_loop_stop(&mutex_gil); mutex1_unlock(&mutex_gil_stealer); } - check_and_save_old_fastgil(old_fastgil); + assert(RPY_FASTGIL_LOCKED(rpy_fastgil)); } long RPyGilYieldThread(void) @@ -267,3 +286,10 @@ { return _RPyFetchFastGil(); } + +#undef RPyGilGetHolder +RPY_EXTERN +long RPyGilGetHolder(void) +{ + return _RPyGilGetHolder(); +} diff -Nru pypy-7.1.1+dfsg/rpython/translator/c/src/thread.h pypy-7.3.1+dfsg/rpython/translator/c/src/thread.h --- pypy-7.1.1+dfsg/rpython/translator/c/src/thread.h 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/translator/c/src/thread.h 2020-04-10 19:28:41.000000000 +0000 @@ -29,30 +29,13 @@ RPY_EXTERN void RPyGilAllocate(void); RPY_EXTERN long RPyGilYieldThread(void); -RPY_EXTERN void RPyGilAcquireSlowPath(long); +RPY_EXTERN void RPyGilAcquireSlowPath(void); #define RPyGilAcquire _RPyGilAcquire #define RPyGilRelease _RPyGilRelease #define RPyFetchFastGil _RPyFetchFastGil - -#ifdef PYPY_USE_ASMGCC -# define RPY_FASTGIL_LOCKED(x) (x == 1) -#else -# define RPY_FASTGIL_LOCKED(x) (x != 0) -#endif +#define RPyGilGetHolder _RPyGilGetHolder +#define RPY_FASTGIL_LOCKED(x) (x != 0) RPY_EXTERN long rpy_fastgil; -static inline void _RPyGilAcquire(void) { - long old_fastgil = pypy_lock_test_and_set(&rpy_fastgil, 1); - if (old_fastgil != 0) - RPyGilAcquireSlowPath(old_fastgil); -} -static inline void _RPyGilRelease(void) { - assert(RPY_FASTGIL_LOCKED(rpy_fastgil)); - pypy_lock_release(&rpy_fastgil); -} -static inline long *_RPyFetchFastGil(void) { - return &rpy_fastgil; -} - #endif diff -Nru pypy-7.1.1+dfsg/rpython/translator/c/src/threadlocal.c pypy-7.3.1+dfsg/rpython/translator/c/src/threadlocal.c --- pypy-7.1.1+dfsg/rpython/translator/c/src/threadlocal.c 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/translator/c/src/threadlocal.c 2020-04-10 19:28:41.000000000 +0000 @@ -185,6 +185,10 @@ a non-null thread-local value). This is needed even in the case where we use '__thread' below, for the destructor. */ + static int threadlocals_initialized = 0; + if (threadlocals_initialized) + return; + assert(pypy_threadlocal_lock == 0); #ifdef _WIN32 pypy_threadlocal_key = TlsAlloc(); @@ -197,13 +201,14 @@ "out of thread-local storage indexes"); abort(); } - _RPython_ThreadLocals_Build(); + RPY_THREADLOCALREF_ENSURE(); #ifndef _WIN32 pthread_atfork(_RPython_ThreadLocals_Acquire, _RPython_ThreadLocals_Release, cleanup_after_fork); #endif + threadlocals_initialized = 1; } diff -Nru pypy-7.1.1+dfsg/rpython/translator/c/src/threadlocal.h pypy-7.3.1+dfsg/rpython/translator/c/src/threadlocal.h --- pypy-7.1.1+dfsg/rpython/translator/c/src/threadlocal.h 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/translator/c/src/threadlocal.h 2020-04-10 19:28:41.000000000 +0000 @@ -133,4 +133,44 @@ } while (0) + +// XXX hack: these functions are here instead of thread.h because +// we need pypy_threadlocal_s. +#include <src/thread.h> + +static INLINE long _rpygil_get_my_ident(void) +{ +#ifdef RPY_TLOFS_thread_ident + struct pypy_threadlocal_s *p = (struct pypy_threadlocal_s *)_RPy_ThreadLocals_Get(); + assert(p->thread_ident != 0); + return p->thread_ident; +#else + // made-up thread identifier + return 1234; +#endif +} + +static INLINE int _rpygil_acquire_fast_path(void) +{ + return pypy_compare_and_swap(&rpy_fastgil, 0, _rpygil_get_my_ident()); +} + +static INLINE void _RPyGilAcquire(void) { + /* see thread_gil.c point (5) */ + if (!_rpygil_acquire_fast_path()) + RPyGilAcquireSlowPath(); +} +static INLINE void _RPyGilRelease(void) { + assert(RPY_FASTGIL_LOCKED(rpy_fastgil)); + pypy_lock_release(&rpy_fastgil); +} +static INLINE long *_RPyFetchFastGil(void) { + return &rpy_fastgil; +} +static INLINE long _RPyGilGetHolder(void) { + return rpy_fastgil; +} + + + #endif /* _SRC_THREADLOCAL_H */ diff -Nru pypy-7.1.1+dfsg/rpython/translator/c/src/thread_nt.c pypy-7.3.1+dfsg/rpython/translator/c/src/thread_nt.c --- pypy-7.1.1+dfsg/rpython/translator/c/src/thread_nt.c 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/translator/c/src/thread_nt.c 2020-04-10 19:28:41.000000000 +0000 @@ -213,29 +213,29 @@ abort(); } -static inline void mutex2_init(mutex2_t *mutex) { +static INLINE void mutex2_init(mutex2_t *mutex) { *mutex = CreateSemaphore(NULL, 1, 1, NULL); if (*mutex == NULL) gil_fatal("CreateSemaphore failed"); } -static inline void mutex2_lock(mutex2_t *mutex) { +static INLINE void mutex2_lock(mutex2_t *mutex) { WaitForSingleObject(*mutex, INFINITE); } -static inline void mutex2_unlock(mutex2_t *mutex) { +static INLINE void mutex2_unlock(mutex2_t *mutex) { ReleaseSemaphore(*mutex, 1, NULL); } -static inline void mutex2_init_locked(mutex2_t *mutex) { +static INLINE void mutex2_init_locked(mutex2_t *mutex) { mutex2_init(mutex); mutex2_lock(mutex); } -static inline void mutex2_loop_start(mutex2_t *mutex) { } -static inline void mutex2_loop_stop(mutex2_t *mutex) { } +static INLINE void mutex2_loop_start(mutex2_t *mutex) { } +static INLINE void mutex2_loop_stop(mutex2_t *mutex) { } -static inline int mutex2_lock_timeout(mutex2_t *mutex, double delay) +static INLINE int mutex2_lock_timeout(mutex2_t *mutex, double delay) { DWORD result = WaitForSingleObject(*mutex, (DWORD)(delay * 1000.0 + 0.999)); return (result != WAIT_TIMEOUT); @@ -243,15 +243,15 @@ typedef CRITICAL_SECTION mutex1_t; -static inline void mutex1_init(mutex1_t *mutex) { +static INLINE void mutex1_init(mutex1_t *mutex) { InitializeCriticalSection(mutex); } -static inline void mutex1_lock(mutex1_t *mutex) { +static INLINE void mutex1_lock(mutex1_t *mutex) { EnterCriticalSection(mutex); } -static inline void mutex1_unlock(mutex1_t *mutex) { +static INLINE void mutex1_unlock(mutex1_t *mutex) { LeaveCriticalSection(mutex); } diff -Nru pypy-7.1.1+dfsg/rpython/translator/c/src/thread_nt.h pypy-7.3.1+dfsg/rpython/translator/c/src/thread_nt.h --- pypy-7.1.1+dfsg/rpython/translator/c/src/thread_nt.h 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/translator/c/src/thread_nt.h 2020-04-10 19:28:41.000000000 +0000 @@ -41,3 +41,6 @@ #define pypy_lock_test_and_set(ptr, value) InterlockedExchange(ptr, value) #endif #define pypy_lock_release(ptr) (*((volatile long *)ptr) = 0) + +#define pypy_compare_and_swap(ptr, oldval, newval) \ + (InterlockedCompareExchange(ptr, newval, oldval) == oldval) diff -Nru pypy-7.1.1+dfsg/rpython/translator/c/src/thread_pthread.c pypy-7.3.1+dfsg/rpython/translator/c/src/thread_pthread.c --- pypy-7.1.1+dfsg/rpython/translator/c/src/thread_pthread.c 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/translator/c/src/thread_pthread.c 2020-04-10 19:28:41.000000000 +0000 @@ -369,12 +369,12 @@ if (lock->next) lock->next->prev = lock->prev; - status = pthread_mutex_destroy(&lock->mut); - CHECK_STATUS("pthread_mutex_destroy"); - status = pthread_cond_destroy(&lock->lock_released); CHECK_STATUS("pthread_cond_destroy"); + status = pthread_mutex_destroy(&lock->mut); + CHECK_STATUS("pthread_mutex_destroy"); + /* 'error' is ignored; CHECK_STATUS already printed an error message */ } @@ -454,13 +454,13 @@ lock->locked = 0; - status = pthread_mutex_unlock( &lock->mut ); - CHECK_STATUS("pthread_mutex_unlock[3]"); - /* wake up someone (anyone, if any) waiting on the lock */ status = pthread_cond_signal( &lock->lock_released ); CHECK_STATUS("pthread_cond_signal"); + status = pthread_mutex_unlock( &lock->mut ); + CHECK_STATUS("pthread_mutex_unlock[3]"); + return result; } diff -Nru pypy-7.1.1+dfsg/rpython/translator/c/src/thread_pthread.h pypy-7.3.1+dfsg/rpython/translator/c/src/thread_pthread.h --- pypy-7.1.1+dfsg/rpython/translator/c/src/thread_pthread.h 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/translator/c/src/thread_pthread.h 2020-04-10 19:28:41.000000000 +0000 @@ -82,5 +82,7 @@ void RPyThreadAfterFork(void); +#define pypy_compare_and_swap(ptr, oldval, newval) \ + __sync_bool_compare_and_swap(ptr, oldval, newval) #define pypy_lock_test_and_set(ptr, value) __sync_lock_test_and_set(ptr, value) #define pypy_lock_release(ptr) __sync_lock_release(ptr) diff -Nru pypy-7.1.1+dfsg/rpython/translator/c/test/test_newgc.py pypy-7.3.1+dfsg/rpython/translator/c/test/test_newgc.py --- pypy-7.1.1+dfsg/rpython/translator/c/test/test_newgc.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/translator/c/test/test_newgc.py 2020-04-10 19:28:41.000000000 +0000 @@ -1912,6 +1912,45 @@ def test_total_gc_time(self): res = self.run("total_gc_time") assert res > 0 # should take a few microseconds + + def define_increase_root_stack_depth(cls): + class X: + pass + def g(n): + if n <= 0: + return None + x = X() + x.n = n + x.next = g(n - 1) + return x + def f(depth): + from rpython.rlib.rstack import _stack_set_length_fraction + _stack_set_length_fraction(50.0) + # ^^^ the default is enough for at least 10'000 (but less than + # 100'000) recursions of the simple function g(). We multiply + # it by 50.0 to make sure that 200'000 works. The default + # shadowstack depth is 163'840 entries, so 200'000 overflows + # that default shadowstack depth, and gives a segfault unless + # the following line works too. + from rpython.rlib.rgc import increase_root_stack_depth + increase_root_stack_depth(depth + 100) + # + g(depth) + return 42 + return f + + def test_increase_root_stack_depth(self): + if not sys.platform.startswith('linux'): + py.test.skip("linux only") + # + def myrunner(args): + args1 = ['/bin/bash', '-c', 'ulimit -s unlimited && %s' % + (' '.join(args),)] + return subprocess.check_output(args1) + res = self.run("increase_root_stack_depth", 200000, runner=myrunner) + assert res == 42 + + # ____________________________________________________________________ class TaggedPointersTest(object): diff -Nru pypy-7.1.1+dfsg/rpython/translator/c/test/test_standalone.py pypy-7.3.1+dfsg/rpython/translator/c/test/test_standalone.py --- pypy-7.1.1+dfsg/rpython/translator/c/test/test_standalone.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/translator/c/test/test_standalone.py 2020-04-10 19:28:41.000000000 +0000 @@ -1146,6 +1146,33 @@ out = cbuilder.cmdexec('') assert out.strip() == 'ok' + def test_int_manipulation(self): + # Distilled from micronumpy.descriptor._compute_hash + # which, for some version of gcc8 compiler produced + # out1 == out2 + from rpython.rlib.rarithmetic import intmask + + def entry_point(argv): + if len(argv) < 4: + print 'need 3 arguments, not %s' % str(argv) + return -1 + flags = 0 + x = 0x345678 + y = 0x345678 + s = str(argv[1])[0] + y = intmask((1000003 * y) ^ ord(s)) + y = intmask((1000003 * y) ^ ord(str(argv[2])[0])) + y = (1000003 * y) + y = intmask(y ^ flags) + y = intmask((1000003 * y) ^ int(argv[3])) + print y + return 0 + + t, cbuilder = self.compile(entry_point) + out1 = cbuilder.cmdexec(args=['i', '>', '64']) + out2 = cbuilder.cmdexec(args=['f', '>', '64']) + assert out1 != out2 + class TestThread(object): gcrootfinder = 'shadowstack' diff -Nru pypy-7.1.1+dfsg/rpython/translator/driver.py pypy-7.3.1+dfsg/rpython/translator/driver.py --- pypy-7.1.1+dfsg/rpython/translator/driver.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/translator/driver.py 2020-04-10 19:28:41.000000000 +0000 @@ -479,11 +479,12 @@ exename = self.c_entryp newexename = mkexename(self.compute_exe_name()) shutil_copy(str(exename), str(newexename)) + self.log.info("copied: %s to %s" % (exename, newexename,)) if self.cbuilder.shared_library_name is not None: soname = self.cbuilder.shared_library_name newsoname = newexename.new(basename=soname.basename) shutil_copy(str(soname), str(newsoname)) - self.log.info("copied: %s" % (newsoname,)) + self.log.info("copied: %s to %s" % (soname, newsoname,)) if sys.platform == 'win32': # Copy pypyw.exe newexename = mkexename(self.compute_exe_name(suffix='w')) diff -Nru pypy-7.1.1+dfsg/rpython/translator/goal/targetbigintbenchmark.py pypy-7.3.1+dfsg/rpython/translator/goal/targetbigintbenchmark.py --- pypy-7.1.1+dfsg/rpython/translator/goal/targetbigintbenchmark.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/translator/goal/targetbigintbenchmark.py 2020-04-10 19:28:41.000000000 +0000 @@ -251,8 +251,19 @@ sumTime += _time print "v = v + v", _time + x = rbigint.fromstr("13579246801357924680135792468013579246801") + y = rbigint.fromstr("112233445566778899112233445566778899112233445566778899") + t = time() + for i in range(5000): + x.gcd(y) + x = x.int_mul(2).int_add(1) + _time = time() - t + print "gcd", _time + + sumTime += _time + print "Sum: ", sumTime - + return 0 # _____ Define and setup target ___ diff -Nru pypy-7.1.1+dfsg/rpython/translator/goal/targetunicode-bench.py pypy-7.3.1+dfsg/rpython/translator/goal/targetunicode-bench.py --- pypy-7.1.1+dfsg/rpython/translator/goal/targetunicode-bench.py 1970-01-01 00:00:00.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/translator/goal/targetunicode-bench.py 2020-04-10 19:28:41.000000000 +0000 @@ -0,0 +1,45 @@ + +from rpython.rlib import rutf8 +from rpython.rlib.rstring import StringBuilder, UnicodeBuilder +from rpython.rlib.unicodedata import unicodedb_5_2_0 as unicodedb + +l = ["u" * 100 + str(i) for i in range(100)] +u_l = [unicode("u" * 100 + str(i)) for i in range(100)] + +def descr_upper(s): + builder = rutf8.Utf8StringBuilder(len(s)) + for ch in rutf8.Utf8StringIterator(s): + ch = unicodedb.toupper(ch) + builder.append_code(ch) + return builder.build() +descr_upper._dont_inline_ = True + +def descr_upper_s(s): + builder = StringBuilder(len(s)) + for i in range(len(s)): + ch = s[i] + builder.append(chr(unicodedb.toupper(ord(ch)))) + return builder.build() + +def descr_upper_u(s): + builder = UnicodeBuilder(len(s)) + for ch in s: + builder.append(unichr(unicodedb.toupper(ord(ch)))) + return builder.build() + +def main(argv): + res_l = ["foo"] + res_l_2 = [u"foo"] + if len(argv) > 2 and argv[2] == "s": + for i in range(int(argv[1])): + res_l[0] = descr_upper_s(l[i % 100]) + elif len(argv) > 2 and argv[2] == "u": + for i in range(int(argv[1])): + res_l_2[0] = descr_upper_u(u_l[i % 100]) + else: + for i in range(int(argv[1])): + res_l[0] = descr_upper(l[i % 100]) + return 0 + +def target(*args): + return main diff -Nru pypy-7.1.1+dfsg/rpython/translator/platform/arch/s390x.py pypy-7.3.1+dfsg/rpython/translator/platform/arch/s390x.py --- pypy-7.1.1+dfsg/rpython/translator/platform/arch/s390x.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/translator/platform/arch/s390x.py 2020-04-10 19:28:41.000000000 +0000 @@ -88,6 +88,10 @@ return "zEC12" if machine == 0x2964: return "z13" + if machine == 0x3907: # gcc supports z14 as of 2019/05/08 + return "z14" + if machine == 0x8561: + return "z15" # well all others are unsupported! return "unknown" @@ -99,14 +103,9 @@ if cflag.startswith('-march='): break else: - # the default cpu architecture that is supported - # older versions are not supported - revision = s390x_cpu_revision() - if revision == 'z13': - # gcc does not recognize z13 as a compiler flag! - revision = 'zEC12' - - assert revision != 'unknown' + # the default cpu architecture is zEC12 + # one can directly specifying -march=... if needed + revision = 'zEC12' cflags += ('-march='+revision,) cflags += ('-m64','-mzarch') return cflags diff -Nru pypy-7.1.1+dfsg/rpython/translator/platform/darwin.py pypy-7.3.1+dfsg/rpython/translator/platform/darwin.py --- pypy-7.1.1+dfsg/rpython/translator/platform/darwin.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/translator/platform/darwin.py 2020-04-10 19:28:41.000000000 +0000 @@ -99,6 +99,7 @@ no_precompile_cfiles = [], profopt=False, config=None): # ensure frameworks are passed in the Makefile fs = self._frameworks(eci.frameworks) + extra_libs = self.extra_libs if len(fs) > 0: # concat (-framework, FrameworkName) pairs self.extra_libs += tuple(map(" ".join, zip(fs[::2], fs[1::2]))) @@ -107,6 +108,7 @@ headers_to_precompile=headers_to_precompile, no_precompile_cfiles = no_precompile_cfiles, profopt=profopt, config=config) + self.extra_libs = extra_libs return mk class Darwin_PowerPC(Darwin):#xxx fixme, mwp diff -Nru pypy-7.1.1+dfsg/rpython/translator/platform/linux.py pypy-7.3.1+dfsg/rpython/translator/platform/linux.py --- pypy-7.1.1+dfsg/rpython/translator/platform/linux.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/translator/platform/linux.py 2020-04-10 19:28:41.000000000 +0000 @@ -44,6 +44,7 @@ else: shared_only = () # it seems that on 32-bit linux, compiling with -fPIC # gives assembler that asmgcc is not happy about. + # Now that asmgcc is gone, should be always enable it? class LinuxPIC(BaseLinux): pass diff -Nru pypy-7.1.1+dfsg/rpython/translator/platform/windows.py pypy-7.3.1+dfsg/rpython/translator/platform/windows.py --- pypy-7.1.1+dfsg/rpython/translator/platform/windows.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/translator/platform/windows.py 2020-04-10 19:28:41.000000000 +0000 @@ -104,7 +104,10 @@ env = {} for key, value in vcdict.items(): if key.upper() in ['PATH', 'INCLUDE', 'LIB']: - env[key.upper()] = value + if sys.version_info[0] < 3: + env[key.upper()] = value.encode('utf-8') + else: + env[key.upper()] = value if 'PATH' not in env: log.msg('Did not find "PATH" in stdout\n%s' %(stdout)) if not _find_executable('mt.exe', env['PATH']): @@ -123,7 +126,7 @@ return env def find_msvc_env(x64flag=False, ver0=None): - vcvers = [140, 141, 150, 90, 100] + vcvers = [160, 150, 141, 140, 100, 90] if ver0 in vcvers: vcvers.insert(0, ver0) errs = [] @@ -182,9 +185,6 @@ patch_os_env(self.externals) self.c_environ = os.environ.copy() if cc is None: - # prefer compiler used to build host. Python2 only - if ver0 is None: - ver0 = _get_vcver0() msvc_compiler_environ, self.vsver = find_msvc_env(x64, ver0=ver0) Platform.__init__(self, 'cl.exe') if msvc_compiler_environ: @@ -206,6 +206,7 @@ raise r = re.search(r'Microsoft.+C/C\+\+.+\s([0-9]+)\.([0-9]+).*', stderr) if r is not None: + log.msg('compiler %s' % stderr) self.version = int(''.join(r.groups())) / 10 - 60 else: # Probably not a msvc compiler... diff -Nru pypy-7.1.1+dfsg/rpython/translator/revdb/src-revdb/revdb_include.h pypy-7.3.1+dfsg/rpython/translator/revdb/src-revdb/revdb_include.h --- pypy-7.1.1+dfsg/rpython/translator/revdb/src-revdb/revdb_include.h 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/translator/revdb/src-revdb/revdb_include.h 2020-04-10 19:28:41.000000000 +0000 @@ -285,6 +285,8 @@ #define OP_GC_RAWREFCOUNT_NEXT_DEAD(r) \ r = rpy_reverse_db_rawrefcount_next_dead() +#define OP_GC_INCREASE_ROOT_STACK_DEPTH(depth, r) /* nothing */ + RPY_EXTERN void rpy_reverse_db_flush(void); /* must be called with the lock */ RPY_EXTERN void rpy_reverse_db_fetch(const char *file, int line); diff -Nru pypy-7.1.1+dfsg/rpython/translator/test/test_exceptiontransform.py pypy-7.3.1+dfsg/rpython/translator/test/test_exceptiontransform.py --- pypy-7.1.1+dfsg/rpython/translator/test/test_exceptiontransform.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/rpython/translator/test/test_exceptiontransform.py 2020-04-10 19:28:41.000000000 +0000 @@ -266,3 +266,26 @@ f = self.compile(foo, []) res = f() assert res == 42 + + def test_llhelper_can_raise(self): + from rpython.rtyper.lltypesystem import lltype + from rpython.rtyper.annlowlevel import llhelper + + def fn(a, b): + if b == 0: + raise ZeroDivisionError + return a/b + + FN = lltype.Ptr(lltype.FuncType([lltype.Signed, lltype.Signed], lltype.Signed)) + def h(a, b): + fnptr = llhelper(FN, fn) + try: + return fnptr(a, b) + except ZeroDivisionError: + return -a + + compiled_h = self.compile(h, [int, int]) + res = compiled_h(39, 3) + assert res == 13 + res = compiled_h(39, 0) + assert res == -39 diff -Nru pypy-7.1.1+dfsg/targetunicode-bench.py pypy-7.3.1+dfsg/targetunicode-bench.py --- pypy-7.1.1+dfsg/targetunicode-bench.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/targetunicode-bench.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,45 +0,0 @@ - -from rpython.rlib import rutf8 -from rpython.rlib.rstring import StringBuilder, UnicodeBuilder -from pypy.module.unicodedata import unicodedb - -l = ["u" * 100 + str(i) for i in range(100)] -u_l = [unicode("u" * 100 + str(i)) for i in range(100)] - -def descr_upper(s): - builder = rutf8.Utf8StringBuilder(len(s)) - for ch in rutf8.Utf8StringIterator(s): - ch = unicodedb.toupper(ch) - builder.append_code(ch) - return builder.build() -descr_upper._dont_inline_ = True - -def descr_upper_s(s): - builder = StringBuilder(len(s)) - for i in range(len(s)): - ch = s[i] - builder.append(chr(unicodedb.toupper(ord(ch)))) - return builder.build() - -def descr_upper_u(s): - builder = UnicodeBuilder(len(s)) - for ch in s: - builder.append(unichr(unicodedb.toupper(ord(ch)))) - return builder.build() - -def main(argv): - res_l = ["foo"] - res_l_2 = [u"foo"] - if len(argv) > 2 and argv[2] == "s": - for i in range(int(argv[1])): - res_l[0] = descr_upper_s(l[i % 100]) - elif len(argv) > 2 and argv[2] == "u": - for i in range(int(argv[1])): - res_l_2[0] = descr_upper_u(u_l[i % 100]) - else: - for i in range(int(argv[1])): - res_l[0] = descr_upper(l[i % 100]) - return 0 - -def target(*args): - return main diff -Nru pypy-7.1.1+dfsg/testrunner/get_info.py pypy-7.3.1+dfsg/testrunner/get_info.py --- pypy-7.1.1+dfsg/testrunner/get_info.py 2019-08-08 19:42:55.000000000 +0000 +++ pypy-7.3.1+dfsg/testrunner/get_info.py 2020-04-10 19:28:41.000000000 +0000 @@ -9,19 +9,21 @@ BASE_DIR = os.path.abspath(os.path.dirname(os.path.dirname(__file__))) if sys.platform.startswith('win'): - TARGET_NAME = r'pypy-c.exe' - # see https://github.com/pypa/virtualenv/issues/789 - TARGET_DIR = 'bin' + TARGET_NAME = 'pypy-c.exe' + VENV_TARGET = 'pypy.exe' + TARGET_DIR = 'Scripts' else: TARGET_NAME = 'pypy-c' + VENV_TARGET = 'pypy' TARGET_DIR = 'bin' VENV_DIR = 'pypy-venv' def make_info_dict(): target_path = os.path.join(BASE_DIR, 'pypy', 'goal', TARGET_NAME) return {'target_path': target_path, - 'virt_pypy': os.path.join(VENV_DIR, TARGET_DIR, TARGET_NAME), + 'virt_pypy': os.path.join(VENV_DIR, TARGET_DIR, VENV_TARGET), 'venv_dir': VENV_DIR, + 'project': 'PyPy', # for benchmarks } def dump_info(): diff -Nru pypy-7.1.1+dfsg/testrunner/lib_python_tests.py pypy-7.3.1+dfsg/testrunner/lib_python_tests.py --- pypy-7.1.1+dfsg/testrunner/lib_python_tests.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/testrunner/lib_python_tests.py 2020-04-10 19:28:41.000000000 +0000 @@ -14,7 +14,7 @@ popen = subprocess.Popen( [sys.executable, "pypy/test_all.py", "--pypy=pypy/goal/pypy-c", - "--timeout=3600", + "--timeout=1324", # make it easy to search for "--duration=10", "--resultlog=cpython.log", "lib-python", ] + sys.argv[1:], diff -Nru pypy-7.1.1+dfsg/unicode-bench.py pypy-7.3.1+dfsg/unicode-bench.py --- pypy-7.1.1+dfsg/unicode-bench.py 2019-08-08 19:42:54.000000000 +0000 +++ pypy-7.3.1+dfsg/unicode-bench.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,77 +0,0 @@ - -import time - -LGT = 100 - -unicodes = [unicode("u" * LGT + str(i)) for i in range(100)] -non_ascii_unicodes = [u"u" * LGT + unicode(i) + u"å" for i in range(100)] - -long_string = u" " * 1000000 -unicodes = [long_string] * 100 - -RANGE = 250000000 // LGT - -def upper(main_l): - l = [None] * 1000 - for i in xrange(RANGE): - l[i % 1000] = main_l[i % 100].upper() - -def lower(main_l): - l = [None] - for i in xrange(RANGE): - l[0] = main_l[i % 100].lower() - -def islower(main_l): - l = [None] - for i in xrange(RANGE * 3): - l[0] = main_l[i % 100].islower() - -def title(main_l): - l = [None] - for i in xrange(RANGE): - l[0] = main_l[i % 100].title() - -def add(main_l): - l = [None] - for i in xrange(RANGE): - l[0] = main_l[i % 100] + u"foo" - -def find(main_l): - l = [None] - for i in xrange(RANGE): - l[0] = main_l[i % 100].find(u"foo") - -def split(main_l): - l = [None] - for i in xrange(RANGE): - l[0] = main_l[i % 100].split() - -def splitlines(main_l): - l = [None] - for i in xrange(RANGE): - l[0] = main_l[i % 100].splitlines() - -def iter(main_l): - l = [None] - for i in xrange(RANGE // 10000): - for elem in main_l[i % 100]: - l[0] = elem - -def indexing(main_l): - l = [None] - for i in xrange(RANGE * 10): - l[0] = main_l[i % 100][13] - -def isspace(main_l): - l = [None] - for i in xrange(RANGE // 10000): - l[0] = main_l[i % 100].isspace() - -for func in [isspace]:#, lower, isupper, islower]: - t0 = time.time() - func(unicodes) - t1 = time.time() - print "ascii %s %.2f" % (func.__name__, t1 - t0) - #func(non_ascii_unicodes) - #t2 = time.time() - #print "non-ascii %s %.2f" % (func.__name__, t2 - t1)