Full Code of edsu/pymarc for AI

master cf33051421ac cached
48 files
1.1 MB
519.4k tokens
342 symbols
1 requests
Download .txt
Showing preview only (1,152K chars total). Download the full file or copy to clipboard to get everything.
Repository: edsu/pymarc
Branch: master
Commit: cf33051421ac
Files: 48
Total size: 1.1 MB

Directory structure:
gitextract_ge7g2q3u/

├── .gitignore
├── .mailmap
├── .travis.yml
├── CONTRIBUTING.md
├── LICENSE
├── MANIFEST.in
├── README.md
├── README_pt_Br.md
├── apply_headers.py
├── docs/
│   └── source/
│       ├── conf.py
│       └── index.rst
├── pymarc/
│   ├── __init__.py
│   ├── constants.py
│   ├── exceptions.py
│   ├── field.py
│   ├── leader.py
│   ├── marc8.py
│   ├── marc8_mapping.py
│   ├── marcjson.py
│   ├── marcxml.py
│   ├── reader.py
│   ├── record.py
│   └── writer.py
├── requirements.dev.txt
├── setup.cfg
├── setup.py
└── test/
    ├── __init__.py
    ├── bad_records.mrc
    ├── bad_tag.xml
    ├── batch.json
    ├── batch.xml
    ├── one.json
    ├── test.json
    ├── test_encode.py
    ├── test_field.py
    ├── test_json.py
    ├── test_leader.py
    ├── test_marc8.py
    ├── test_marc8.txt
    ├── test_ordered_fields.py
    ├── test_reader.py
    ├── test_record.py
    ├── test_utf8.py
    ├── test_utf8.txt
    ├── test_writer.py
    ├── test_xml.py
    ├── utf8.xml
    └── utf8_invalid.mrc

================================================
FILE CONTENTS
================================================

================================================
FILE: .gitignore
================================================
*.pyc
pymarc.egg-info
build
dist
*$py.class
.eggs
*.egg
Pipfile
Pipfile.lock
.vscode


================================================
FILE: .mailmap
================================================
Aaron S. Lav <asl2@pobox.com>
Dan Scott <dan@coffeecode.net> <gitorious@coffeecode.net>
Eric Hellman <eric@hellman.net>
Edward Betts <edward@4angle.com> <edwardbetts@gmail.com>
James Tayson <james.taysom@gmail.com>
Nick Ruest <ruestn@gmail.com>
Geoffrey Spear <geoffspear@gmail.com> <speargh@pitt.edu>


================================================
FILE: .travis.yml
================================================
language: python

script:
  - python setup.py test

stages:
  - lint
  - test

jobs:
  include:
    # Linting
    - stage: lint
      name: "Check linting with flake8"
      install: pip install -r requirements.dev.txt
      script: flake8 .
    - stage: lint
      name: "Check format with black"
      install: pip install -r requirements.dev.txt
      script: black --check --diff .
    # Unit tests
    - stage: test
      name: "Unit tests pypy3"
      python: "pypy3"
    - stage: test
      name: "Unit tests python 3.6"
      python: "3.6"
    - stage: test
      name: "Unit tests python 3.7"
      python: "3.7"
    - stage: test
      name: "Unit tests python 3.8"
      python: "3.8"


================================================
FILE: CONTRIBUTING.md
================================================
# Contributing

Feel free to [report bugs](https://github.com/edsu/pymarc/issues) you have encountered
and [suggest new features](https://github.com/edsu/pymarc/pulls).

For any new development, please respect the standards in place on the project (enforced
by the CI):

* formatting with [black](https://github.com/psf/black)
* validated by [flake8](http://flake8.pycqa.org/en/latest) 
  and (coming soon) [mypy](http://mypy-lang.org)
* tested with [unittest](https://docs.python.org/fr/3/library/unittest.html)
* compatible from python 3.3 to python 3.8

To install development dependencies: `pip install -r requirements.dev.txt`.


================================================
FILE: LICENSE
================================================
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:

1. Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.

2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.

THIS SOFTWARE IS PROVIDED BY THE 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 HOLDER 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.

Copyright for this project is held by its many contributors, including:

Adam Constabaris <ajconsta@ncsu.edu>
André Nesse <an@macpro.lan>
Chris Adams <chris@improbable.org>
Dan Chudnov <dchud@umich.edu>
Dan Michael O. Heggø <danmichaelo@gmail.com>
Dan Scott <dan@coffeecode.net>
David Chouinard <david@davidchouinard.com>
Ed Hill <hill.charles2@gmail.com>
Ed Summers <ehs@pobox.com>
Edward Betts <edward@4angle.com>
Eric Hellman <eric@hellman.net>
Gabriel Farrell <gsf747@gmail.com>
Geoffrey Spear <geoffspear@gmail.com>
Godmar Back <godmar@gmail.com>
Helga <cdg013@gmail.com>
James Tayson <james.taysom@gmail.com>
Jay Luker <lbjay@reallywow.com>
Jim Nicholls <jim.nicholls@gmail.com>
Karol Sikora <me@karolsikora.me>
Lucas Souza <lucassouzaufpa@gmail.com>
Mark A. Matienzo <mark@matienzo.org>
Martin Czygan <martin.czygan@gmail.com>
Michael B. Klein <mbklein@gmail.com>
Michael J. Giarlo <leftwing@alumni.rutgers.edu>
Mikhail Terekhov <termim@gmail.com>
Nick Ruest <ruestn@gmail.com>
Pierre Verkest <pverkest@anybox.fr>
Radim Řehůřek <radimrehurek@seznam.cz>
Renaud Boyer <rboyer@anybox.fr>
Robert Marchman <robert.l.marchman@dartmouth.edu>
Sean Chen <schen@law.duke.edu>
Simon Hohl <simon.hohl@dainst.org>
Ted Lawless <tlawless@tuscola.(none)>
Victor Seva <vseva@dlsi.ua.es>
Will Earp <will.earp@icloud.com>
cclauss <cclauss@bluewin.ch>
cyperus-papyrus <cdg013@gmail.com>
gitgovdoc <bwebb@gpo.gov>
mmh <maherma@asdeguiaingenieria.com>
nemobis <federicoleva@tiscali.it>
wrCisco <lbjma@tiscali.it>


================================================
FILE: MANIFEST.in
================================================
recursive-include test *.py *.dat *.xml *.json *.mrc *.txt *.xml
recursive-include docs *.py
recursive-include docs *.rst

include *.md
include *.txt


================================================
FILE: README.md
================================================
# The pymarc repository has moved to [GitLab](https://gitlab.com/pymarc/pymarc).


================================================
FILE: README_pt_Br.md
================================================
# O repositório pymarc foi movido para [GitLab](https://gitlab.com/pymarc/pymarc).


================================================
FILE: apply_headers.py
================================================
#!/usr/bin/env python

"""Apply standard license headers and generate contributor list.

Rather than trying to maintain file-level lists of contributors and copyright
dates, apply a standard license header that points to the LICENSE file for the
licensing details. And then generate the LICENSE file with a complete list of
contributors based on the git commit history.

To adjust contributor names or combine email addresses, see .mailmap.

See https://github.com/edsu/pymarc/issues/147 for context.
"""

# This file is part of pymarc. It is subject to the license terms in the
# LICENSE file found in the top-level directory of this distribution and at
# https://opensource.org/licenses/BSD-2-Clause. pymarc may be copied, modified,
# propagated, or distributed according to the terms contained in the LICENSE
# file.

import pathlib
import shlex
import subprocess


def get_contributors():
    """Get a complete list of contributors from `git log`."""
    # dictionary = add each name only once
    contribs = {}

    gitargs = shlex.split("git log --use-mailmap --format=short")
    log = subprocess.run(gitargs, capture_output=True, encoding="utf-8")
    for line in log.stdout.split("\n"):
        if line[0 : len("Author: ")] == "Author: ":
            contribs[line[len("Author: ") :]] = 1

    # Return a list of the contributors
    return sorted(contribs)


def generate_license(contribs):
    """Generate a BSD-2 license file that lists contributors."""
    bsd2 = """Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:

1. Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.

2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.

THIS SOFTWARE IS PROVIDED BY THE 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 HOLDER 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.

"""

    with open("LICENSE", "w") as licensef:
        licensef.write(bsd2)
        licensef.write(
            "Copyright for this project is held by its many contributors, including:\n\n"
        )
        for contrib in contribs:
            licensef.write("{}\n".format(contrib))


def apply_headers():
    """Ensure standard license header is in each Python file."""
    header = """# This file is part of pymarc. It is subject to the license terms in the
# LICENSE file found in the top-level directory of this distribution and at
# https://opensource.org/licenses/BSD-2-Clause. pymarc may be copied, modified,
# propagated, or distributed according to the terms contained in the LICENSE
# file.
"""

    path = pathlib.Path(".")
    for pyfile in list(path.glob("**/*.py")):
        if str(pyfile) == "docs/source/conf.py" or str(pyfile) == "test/__init__.py":
            continue
        with open(pyfile, "r") as reader:
            contents = reader.read()
            if contents.find(header) == -1:
                if str(pyfile) == "test/__init__.py":
                    # Avoid angering black with a blank line at the end
                    write_header(pyfile, reader, contents, header)
                else:
                    write_header(pyfile, reader, contents, header + "\n")


def write_header(pyfile, reader, contents, header):
    """Rewrite Python source file with the license header."""
    reader.close()
    utf8_decl = "# -*- coding: utf-8 -*-\n"
    with open(pyfile, "w") as writer:
        if contents.startswith("# __init__.py"):
            sections = contents.split("\n\n", 1)
            writer.write(sections[0])
            writer.write("\n\n")
            writer.write(header)
            writer.write(sections[1])
        elif contents.startswith(utf8_decl):
            sections = contents.split(utf8_decl, 1)
            writer.write(utf8_decl)
            writer.write("\n")
            writer.write(header)
            writer.write(sections[1])
        else:
            writer.write(header)
            writer.write(contents)


if __name__ == "__main__":
    generate_license(get_contributors())
    apply_headers()


================================================
FILE: docs/source/conf.py
================================================
"""Pymarc's documentation build configuration file.

Created by sphinx-quickstart on Thu Jul 21 10:24:11 2016.

This file is execfile()d with the current directory set to its
containing dir.

Note that not all possible configuration values are present in this
autogenerated file.

All configuration values have a default; values that are commented out
serve to show the default.

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.
"""

import os
import sys

sys.path.append(os.path.join(os.path.dirname(__file__), "../.."))
print(sys.path)
# sys.path.insert(0, os.path.abspath('.'))

# -- General configuration ------------------------------------------------

# If your documentation needs a minimal Sphinx version, state it here.
#
# needs_sphinx = '1.0'

# 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.autosummary",
    "sphinx.ext.intersphinx",
    "sphinx.ext.ifconfig",
    "sphinx.ext.viewcode",
]

# Add any paths that contain templates here, relative to this directory.
templates_path = ["_templates"]

# The suffix(es) of source filenames.
# You can specify multiple suffix as a list of string:
#
# source_suffix = ['.rst', '.md']
source_suffix = ".rst"

# The encoding of source files.
#
# source_encoding = 'utf-8-sig'

# The master toctree document.
master_doc = "index"

# General information about the project.
project = "pymarc"
copyright = "Contributors listed in the accompanying LICENSE file"
author = "Ed Summers"

# The version info for the project you're documenting, acts as replacement for
# |version| and |release|, also used in various other places throughout the
# built documents.
#
# The short X.Y version.
version = "4.0.0"
with open(os.path.join(os.path.dirname(__file__), "../../setup.py")) as setup_file:
    for line in setup_file:
        if line.startswith("version"):
            __, version = line.split(" = ")
            version = version.replace('"', "")
            break
release = version

# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
#
# This is also used if you do content translation via gettext catalogs.
# Usually you set "language" from the command line for these cases.
language = None

# There are two options for replacing |today|: either, you set today to some
# non-false value, then it is used:
#
# today = ''
#
# Else, today_fmt is used as the format for a strftime call.
#
# today_fmt = '%B %d, %Y'

# List of patterns, relative to source directory, that match files and
# directories to ignore when looking for source files.
# This patterns also effect to html_static_path and html_extra_path
exclude_patterns = []

# The reST default role (used for this markup: `text`) to use for all
# documents.
#
# default_role = None

# If true, '()' will be appended to :func: etc. cross-reference text.
#
# add_function_parentheses = True

# If true, the current module name will be prepended to all description
# unit titles (such as .. function::).
#
# add_module_names = True

# If true, sectionauthor and moduleauthor directives will be shown in the
# output. They are ignored by default.
#
# show_authors = False

# The name of the Pygments (syntax highlighting) style to use.
pygments_style = "sphinx"

# A list of ignored prefixes for module index sorting.
# modindex_common_prefix = []

# If true, keep warnings as "system message" paragraphs in the built documents.
# keep_warnings = False

# If true, `todo` and `todoList` produce output, else they produce nothing.
todo_include_todos = False


# -- Options for HTML output ----------------------------------------------

# The theme to use for HTML and HTML Help pages.  See the documentation for
# a list of builtin themes.
#
html_theme = "sphinx_rtd_theme"

# Theme options are theme-specific and customize the look and feel of a theme
# further.  For a list of options available for each theme, see the
# documentation.
#
# html_theme_options = {}

# Add any paths that contain custom themes here, relative to this directory.
# html_theme_path = []

# The name for this set of Sphinx documents.
# "<project> v<release> documentation" by default.
#
# html_title = 'pymarc v3.1.5'

# A shorter title for the navigation bar.  Default is the same as html_title.
#
# html_short_title = None

# The name of an image file (relative to this directory) to place at the top
# of the sidebar.
#
# html_logo = None

# The name of an image file (relative to this directory) to use as a favicon of
# the docs.  This file should be a Windows icon file (.ico) being 16x16 or 32x32
# pixels large.
#
# html_favicon = None

# Add any paths that contain custom static files (such as style sheets) here,
# relative to this directory. They are copied after the builtin static files,
# so a file named "default.css" will overwrite the builtin "default.css".
html_static_path = ["_static"]

# Add any extra paths that contain custom files (such as robots.txt or
# .htaccess) here, relative to this directory. These files are copied
# directly to the root of the documentation.
#
# html_extra_path = []

# If not None, a 'Last updated on:' timestamp is inserted at every page
# bottom, using the given strftime format.
# The empty string is equivalent to '%b %d, %Y'.
#
# html_last_updated_fmt = None

# If true, SmartyPants will be used to convert quotes and dashes to
# typographically correct entities.
#
# html_use_smartypants = True

# Custom sidebar templates, maps document names to template names.
#
# html_sidebars = {}

# Additional templates that should be rendered to pages, maps page names to
# template names.
#
# html_additional_pages = {}

# If false, no module index is generated.
#
# html_domain_indices = True

# If false, no index is generated.
#
# html_use_index = True

# If true, the index is split into individual pages for each letter.
#
# html_split_index = False

# If true, links to the reST sources are added to the pages.
#
# html_show_sourcelink = True

# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
#
# html_show_sphinx = True

# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
#
# html_show_copyright = True

# If true, an OpenSearch description file will be output, and all pages will
# contain a <link> tag referring to it.  The value of this option must be the
# base URL from which the finished HTML is served.
#
# html_use_opensearch = ''

# This is the file name suffix for HTML files (e.g. ".xhtml").
# html_file_suffix = None

# Language to be used for generating the HTML full-text search index.
# Sphinx supports the following languages:
#   'da', 'de', 'en', 'es', 'fi', 'fr', 'h', 'it', 'ja'
#   'nl', 'no', 'pt', 'ro', 'r', 'sv', 'tr', 'zh'
#
# html_search_language = 'en'

# A dictionary with options for the search language support, empty by default.
# 'ja' uses this config value.
# 'zh' user can custom change `jieba` dictionary path.
#
# html_search_options = {'type': 'default'}

# The name of a javascript file (relative to the configuration directory) that
# implements a search results scorer. If empty, the default will be used.
#
# html_search_scorer = 'scorer.js'

# Output file base name for HTML help builder.
htmlhelp_basename = "pymarcdoc"

# -- Options for LaTeX output ---------------------------------------------

latex_elements = {
    # The paper size ('letterpaper' or 'a4paper').
    #
    # 'papersize': 'letterpaper',
    # The font size ('10pt', '11pt' or '12pt').
    #
    # 'pointsize': '10pt',
    # Additional stuff for the LaTeX preamble.
    #
    # 'preamble': '',
    # Latex figure (float) alignment
    #
    # 'figure_align': 'htbp',
}

# Grouping the document tree into LaTeX files. List of tuples
# (source start file, target name, title,
#  author, documentclass [howto, manual, or own class]).
latex_documents = [
    (master_doc, "pymarc.tex", "pymarc Documentation", "Ed Summers", "manual"),
]

# The name of an image file (relative to this directory) to place at the top of
# the title page.
#
# latex_logo = None

# For "manual" documents, if this is true, then toplevel headings are parts,
# not chapters.
#
# latex_use_parts = False

# If true, show page references after internal links.
#
# latex_show_pagerefs = False

# If true, show URL addresses after external links.
#
# latex_show_urls = False

# Documents to append as an appendix to all manuals.
#
# latex_appendices = []

# It false, will not define \strong, \code, 	itleref, \crossref ... but only
# \sphinxstrong, ..., \sphinxtitleref, ... To help avoid clash with user added
# packages.
#
# latex_keep_old_macro_names = True

# If false, no module index is generated.
#
# latex_domain_indices = True


# -- Options for manual page output ---------------------------------------

# One entry per manual page. List of tuples
# (source start file, name, description, authors, manual section).
man_pages = [(master_doc, "pymarc", "pymarc Documentation", [author], 1)]

# If true, show URL addresses after external links.
#
# man_show_urls = False


# -- Options for Texinfo output -------------------------------------------

# Grouping the document tree into Texinfo files. List of tuples
# (source start file, target name, title, author,
#  dir menu entry, description, category)
texinfo_documents = [
    (
        master_doc,
        "pymarc",
        "pymarc Documentation",
        author,
        "pymarc",
        "One line description of project.",
        "Miscellaneous",
    ),
]

# Documents to append as an appendix to all manuals.
#
# texinfo_appendices = []

# If false, no module index is generated.
#
# texinfo_domain_indices = True

# How to display URL addresses: 'footnote', 'no', or 'inline'.
#
# texinfo_show_urls = 'footnote'

# If true, do not generate a @detailmenu in the "Top" node's menu.
#
# texinfo_no_detailmenu = False


# Example configuration for intersphinx: refer to the Python standard library.
intersphinx_mapping = {"https://docs.python.org/": None}


================================================
FILE: docs/source/index.rst
================================================
.. pymarc documentation master file, created by
   sphinx-quickstart on Thu Jul 21 10:24:11 2016.
   You can adapt this file completely to your liking, but it should at least
   contain the root `toctree` directive.

Pymarc
======

Release v\ |version|

Pymarc is a python library for working with bibliographic data encoded in MARC21.

It should work under python 2.x and 3.x. It provides an API for reading, writing
and modifying MARC records. It was mostly designed to be an emergency
eject seat, for getting your data assets out of MARC and into some kind
of saner representation. However over the years it has been used to
create and modify MARC records, since despite `repeated calls`_ for it to die as a
format, MARC seems to be living quite happily as a zombie.

Below are some common examples of how you might want to use pymarc. If
you run across an example that you think should be here please send a
pull request.

.. _repeated calls: https://web.archive.org/web/20170731163019/http://www.marc-must-die.info/index.php/Main_Page

Reading
~~~~~~~

Most often you will have some MARC data and will want to extract data
from it. Here's an example of reading a batch of records and printing
out the title. If you are curious this example uses the batch file
available here in pymarc repository:

.. code-block:: python

    from pymarc import MARCReader

    with open('test/marc.dat', 'rb') as fh:
        reader = MARCReader(fh)
        for record in reader:
            print(record.title())

    The pragmatic programmer : from journeyman to master /
    Programming Python /
    Learning Python /
    Python cookbook /
    Python programming for the absolute beginner /
    Web programming : techniques for integrating Python, Linux, Apache, and MySQL /
    Python programming on Win32 /
    Python programming : an introduction to computer science /
    Python Web programming /
    Core python programming /
    Python and Tkinter programming /
    Game programming with Python, Lua, and Ruby /
    Python programming patterns /
    Python programming with the Java class libraries : a tutorial for building Web
    and Enterprise applications /
    Learn to program using Python : a tutorial for hobbyists, self-starters, and all
    who want to learn the art of computer programming /
    Programming with Python /
    BSD Sockets programming from a multi-language perspective /
    Design patterns : elements of reusable object-oriented software /
    Introduction to algorithms /
    ANSI Common Lisp /

A pymarc.Record object has a few handy methods like title for
getting at bits of a bibliographic record, others include: author,
isbn, subjects, location, notes,
physicaldescription, publisher, pubyear. But really, to work
with MARC data you need to understand the numeric field tags and
subfield codes that are used to designate various bits of information.
There is a lot more hiding in a MARC record than these methods provide
access to. For example the title method extracts the information
from the 245 field, subfields a and b. You can access
245a like so:

.. code-block:: python

    print(record['245']['a'])

Some fields like subjects can repeat. In cases like that you will want
to use get_fields to get all of them as pymarc.Field objects,
which you can then interact with further:

.. code-block:: python

    for f in record.get_fields('650'):
        print(f)

If you are new to MARC fields Understanding
MARC (http://www.loc.gov/marc/umb/) is a pretty good primer, and the
MARC 21 Formats (http://www.loc.gov/marc/marcdocz.html) page at the
Library of Congress is a good reference once you understand the basics.

Writing
~~~~~~~

Here's an example of creating a record and writing it out to a file.

.. code-block:: python

    from pymarc import Record, Field

    record = Record()
    record.add_field(
        Field(
            tag = '245',
            indicators = ['0','1'],
            subfields = [
                'a', 'The pragmatic programmer : ',
                'b', 'from journeyman to master /',
                'c', 'Andrew Hunt, David Thomas.'
            ]))
    with open('file.dat', 'wb') as out:
        out.write(record.as_marc())

Updating
~~~~~~~~

Updating works the same way, you read it in, modify it, and then write
it out again:

.. code-block:: python

    from pymarc import MARCReader

    with open('test/marc.dat', 'rb') as fh:
       reader = MARCReader(fh)
       record = next(reader)
       record['245']['a'] = 'The Zombie Programmer'
    with open('file.dat', 'wb') as out:
       out.write(record.as_marc())

JSON and XML
~~~~~~~~~~~~

If you find yourself using MARC data a fair bit, and distributing it,
you may make other developers a bit happier by using the JSON or XML
serializations. pymarc has support for both. The main benefit here is
that the UTF8 character encoding is used, rather than the frustratingly
archaic MARC8 encoding. Also they will be able to use JSON and XML tools
to get at the data they want instead of some crazy MARC processing
library like, ahem, pymarc.


API Docs
========

Reader
~~~~~~

.. automodule:: pymarc.reader
    :members:
    :undoc-members:
    :show-inheritance:

Record
~~~~~~

.. automodule:: pymarc.record
    :members:
    :undoc-members:
    :show-inheritance:

Writer
~~~~~~

.. automodule:: pymarc.writer
    :members:
    :undoc-members:
    :show-inheritance:

Field
-----

.. automodule:: pymarc.field
    :members:
    :undoc-members:
    :show-inheritance:

Exceptions
~~~~~~~~~~

.. automodule:: pymarc.exceptions
    :members:
    :undoc-members:
    :show-inheritance:

MarcXML
~~~~~~~

.. automodule:: pymarc.marcxml
    :members:
    :undoc-members:
    :show-inheritance:

Constants
~~~~~~~~~

.. automodule:: pymarc.constants
    :members:
    :undoc-members:
    :show-inheritance:

MARC-8
~~~~~~

.. automodule:: pymarc.marc8
    :members:
    :undoc-members:
    :show-inheritance:

MARC-8 mapping
~~~~~~~~~~~~~~

.. automodule:: pymarc.marc8_mapping
    :members:
    :undoc-members:
    :show-inheritance:

Leader
------

.. automodule:: pymarc.leader
    :members:
    :undoc-members:
    :show-inheritance:


Indices and tables
==================

* :ref:`genindex`
* :ref:`modindex`
* :ref:`search`


================================================
FILE: pymarc/__init__.py
================================================
# This file is part of pymarc. It is subject to the license terms in the
# LICENSE file found in the top-level directory of this distribution and at
# https://opensource.org/licenses/BSD-2-Clause. pymarc may be copied, modified,
# propagated, or distributed according to the terms contained in the LICENSE
# file.

from .record import *
from .field import *
from .exceptions import *
from .reader import *
from .writer import *
from .constants import *
from .marc8 import marc8_to_unicode, MARC8ToUnicode
from .marcxml import *
from .marcjson import *


================================================
FILE: pymarc/constants.py
================================================
# This file is part of pymarc. It is subject to the license terms in the
# LICENSE file found in the top-level directory of this distribution and at
# https://opensource.org/licenses/BSD-2-Clause. pymarc may be copied, modified,
# propagated, or distributed according to the terms contained in the LICENSE
# file.

"""Constants for pymarc."""

LEADER_LEN = 24
DIRECTORY_ENTRY_LEN = 12
SUBFIELD_INDICATOR = chr(0x1F)
END_OF_FIELD = chr(0x1E)
END_OF_RECORD = chr(0x1D)


================================================
FILE: pymarc/exceptions.py
================================================
# This file is part of pymarc. It is subject to the license terms in the
# LICENSE file found in the top-level directory of this distribution and at
# https://opensource.org/licenses/BSD-2-Clause. pymarc may be copied, modified,
# propagated, or distributed according to the terms contained in the LICENSE
# file.

"""Exceptions for pymarc."""


class PymarcException(Exception):
    """Base pymarc Exception."""

    pass


class RecordLengthInvalid(PymarcException):
    """Invalid record length."""

    def __str__(self):
        return "Invalid record length in first 5 bytes of record"


class RecordLeaderInvalid(PymarcException):
    """Unable to extract record leader."""

    def __str__(self):
        return "Unable to extract record leader"


class RecordDirectoryInvalid(PymarcException):
    """Invalid directory."""

    def __str__(self):
        return "Invalid directory"


class NoFieldsFound(PymarcException):
    """Unable to locate fields in record data."""

    def __str__(self):
        return "Unable to locate fields in record data"


class BaseAddressInvalid(PymarcException):
    """Base address exceeds size of record."""

    def __str__(self):
        return "Base address exceeds size of record"


class BaseAddressNotFound(PymarcException):
    """Unable to locate base address of record."""

    def __str__(self):
        return "Unable to locate base address of record"


class WriteNeedsRecord(PymarcException):
    """Write requires a pymarc.Record object as an argument."""

    def __str__(self):
        return "Write requires a pymarc.Record object as an argument"


class NoActiveFile(PymarcException):
    """There is no active file to write to in call to write."""

    def __str__(self):
        return "There is no active file to write to in call to write"


class FieldNotFound(PymarcException):
    """Record does not contain the specified field."""

    def __str__(self):
        return "Record does not contain the specified field"


class BadSubfieldCodeWarning(Warning):
    """Warning about a non-ASCII subfield code."""

    pass


class BadLeaderValue(PymarcException):
    """Error when setting a leader value."""

    pass


================================================
FILE: pymarc/field.py
================================================
# This file is part of pymarc. It is subject to the license terms in the
# LICENSE file found in the top-level directory of this distribution and at
# https://opensource.org/licenses/BSD-2-Clause. pymarc may be copied, modified,
# propagated, or distributed according to the terms contained in the LICENSE
# file.

"""The pymarc.field file."""

import logging

from pymarc.constants import SUBFIELD_INDICATOR, END_OF_FIELD
from pymarc.marc8 import marc8_to_unicode


class Field:
    """Field() pass in the field tag, indicators and subfields for the tag.

    .. code-block:: python

        field = Field(
            tag = '245',
            indicators = ['0','1'],
            subfields = [
                'a', 'The pragmatic programmer : ',
                'b', 'from journeyman to master /',
                'c', 'Andrew Hunt, David Thomas.',
            ])

    If you want to create a control field, don't pass in the indicators
    and use a data parameter rather than a subfields parameter:

    .. code-block:: python

        field = Field(tag='001', data='fol05731351')
    """

    def __init__(self, tag, indicators=None, subfields=None, data=u""):
        """Initialize a field `tag`."""
        if indicators is None:
            indicators = []
        if subfields is None:
            subfields = []
        indicators = [str(x) for x in indicators]

        # attempt to normalize integer tags if necessary
        try:
            self.tag = "%03i" % int(tag)
        except ValueError:
            self.tag = "%03s" % tag

        # assume controlfields are numeric only; replicates ruby-marc behavior
        if self.tag < "010" and self.tag.isdigit():
            self.data = data
        else:
            self.indicators = indicators
            self.subfields = subfields

    def __iter__(self):
        self.__pos = 0
        return self

    def __str__(self):
        """String representation of the field.

        A Field object in a string context will return the tag, indicators
        and subfield as a string. This follows MARCMaker format; see [1]
        and [2] for further reference. Special character mnemonic strings
        have yet to be implemented (see [3]), so be forewarned. Note also
        for complete MARCMaker compatibility, you will need to change your
        newlines to DOS format ('CRLF').

        [1] http://www.loc.gov/marc/makrbrkr.html#mechanics
        [2] http://search.cpan.org/~eijabb/MARC-File-MARCMaker/
        [3] http://www.loc.gov/marc/mnemonics.html
        """
        if self.is_control_field():
            text = "=%s  %s" % (self.tag, self.data.replace(" ", "\\"))
        else:
            text = "=%s  " % (self.tag)
            for indicator in self.indicators:
                if indicator in (" ", "\\"):
                    text += "\\"
                else:
                    text += "%s" % indicator
            for subfield in self:
                text += "$%s%s" % subfield
        return text

    def __getitem__(self, subfield):
        """Retrieve the first subfield with a given subfield code in a field.

        .. code-block:: python

            field['a']

        Handy for quick lookups.
        """
        subfields = self.get_subfields(subfield)
        if len(subfields) > 0:
            return subfields[0]
        return None

    def __contains__(self, subfield):
        """Allows a shorthand test of field membership.

        .. code-block:: python

            'a' in field

        """
        subfields = self.get_subfields(subfield)
        return len(subfields) > 0

    def __setitem__(self, code, value):
        """Set the values of the subfield code in a field.

        .. code-block:: python

            field['a'] = 'value'

        Raises KeyError if there is more than one subfield code.
        """
        subfields = self.get_subfields(code)
        if len(subfields) > 1:
            raise KeyError("more than one code '%s'" % code)
        elif len(subfields) == 0:
            raise KeyError("no code '%s'" % code)
        num_code = len(self.subfields) // 2
        while num_code >= 0:
            if self.subfields[(num_code * 2) - 2] == code:
                self.subfields[(num_code * 2) - 1] = value
                break
            num_code -= 1

    def __next__(self):
        if not hasattr(self, "subfields"):
            raise StopIteration
        while self.__pos < len(self.subfields):
            subfield = (self.subfields[self.__pos], self.subfields[self.__pos + 1])
            self.__pos += 2
            return subfield
        raise StopIteration

    def value(self):
        """Returns the field as a string w/ tag, indicators, and subfield indicators."""
        if self.is_control_field():
            return self.data
        value_list = []
        for subfield in self:
            value_list.append(subfield[1].strip())
        return " ".join(value_list)

    def get_subfields(self, *codes):
        """Get subfields matching `codes`.

        get_subfields() accepts one or more subfield codes and returns
        a list of subfield values.  The order of the subfield values
        in the list will be the order that they appear in the field.

        .. code-block:: python

            print(field.get_subfields('a'))
            print(field.get_subfields('a', 'b', 'z'))
        """
        values = []
        for subfield in self:
            if subfield[0] in codes:
                values.append(subfield[1])
        return values

    def add_subfield(self, code, value, pos=None):
        """Adds a subfield code/value to the end of a field or at a position (pos).

        .. code-block:: python

            field.add_subfield('u', 'http://www.loc.gov')
            field.add_subfield('u', 'http://www.loc.gov', 0)

        If pos is not supplied or out of range, the subfield will be added at the end.
        """
        append = pos is None or (pos + 1) * 2 > len(self.subfields)

        if append:
            self.subfields.append(code)
            self.subfields.append(value)
        else:
            i = pos * 2
            self.subfields.insert(i, code)
            self.subfields.insert(i + 1, value)

    def delete_subfield(self, code):
        """Deletes the first subfield with the specified 'code' and returns its value.

        .. code-block:: python

            value = field.delete_subfield('a')

        If no subfield is found with the specified code None is returned.
        """
        try:
            index = self.subfields.index(code)
            if index % 2 == 0:
                value = self.subfields.pop(index + 1)
                self.subfields.pop(index)
                return value
            else:
                return None
        except ValueError:
            return None

    def is_control_field(self):
        """Returns true or false if the field is considered a control field.

        Control fields lack indicators and subfields.
        """
        if self.tag < "010" and self.tag.isdigit():
            return True
        return False

    def as_marc(self, encoding):
        """Used during conversion of a field to raw marc."""
        if self.is_control_field():
            return (self.data + END_OF_FIELD).encode(encoding)
        marc = self.indicator1 + self.indicator2
        for subfield in self:
            marc += SUBFIELD_INDICATOR + subfield[0] + subfield[1]

        return (marc + END_OF_FIELD).encode(encoding)

    # alias for backwards compatibility
    as_marc21 = as_marc

    def format_field(self):
        """Returns the field as a string w/ tag, indicators, and subfield indicators.

        Like :func:`Field.value() <pymarc.field.Field.value>`, but prettier
        (adds spaces, formats subject headings).
        """
        if self.is_control_field():
            return self.data
        fielddata = ""
        for subfield in self:
            if subfield[0] == "6":
                continue
            if not self.is_subject_field():
                fielddata += " %s" % subfield[1]
            else:
                if subfield[0] not in ("v", "x", "y", "z"):
                    fielddata += " %s" % subfield[1]
                else:
                    fielddata += " -- %s" % subfield[1]
        return fielddata.strip()

    def is_subject_field(self):
        """Returns True or False if the field is considered a subject field.

        Used by :func:`format_field() <pymarc.field.Field.format_field>` .
        """
        if self.tag.startswith("6"):
            return True
        return False

    @property
    def indicator1(self):
        """Indicator 1."""
        return self.indicators[0]

    @indicator1.setter
    def indicator1(self, value):
        """Indicator 1 (setter)."""
        self.indicators[0] = value

    @property
    def indicator2(self):
        """Indicator 2."""
        return self.indicators[1]

    @indicator2.setter
    def indicator2(self, value):
        """Indicator 2 (setter)."""
        self.indicators[1] = value


class RawField(Field):
    """MARC field that keeps data in raw, undecoded byte strings.

    Should only be used when input records are wrongly encoded.
    """

    def as_marc(self, encoding=None):
        """Used during conversion of a field to raw marc."""
        if encoding is not None:
            logging.warn("Attempt to force a RawField into encoding %s", encoding)
        if self.is_control_field():
            return self.data + END_OF_FIELD
        marc = self.indicator1.encode("ascii") + self.indicator2.encode("ascii")
        for subfield in self:
            marc += SUBFIELD_INDICATOR.encode("ascii") + subfield[0] + subfield[1]
        return marc + END_OF_FIELD


def map_marc8_field(f):
    """Map MARC8 field."""
    if f.is_control_field():
        f.data = marc8_to_unicode(f.data)
    else:
        f.subfields = map(marc8_to_unicode, f.subfields)
    return f


================================================
FILE: pymarc/leader.py
================================================
# This file is part of pymarc. It is subject to the license terms in the
# LICENSE file found in the top-level directory of this distribution and at
# https://opensource.org/licenses/BSD-2-Clause. pymarc may be copied, modified,
# propagated, or distributed according to the terms contained in the LICENSE
# file.

"""The pymarc.leader file."""
from pymarc.constants import LEADER_LEN
from pymarc.exceptions import BadLeaderValue, RecordLeaderInvalid


class Leader(object):
    """Mutable leader.

    A class to manipulate a `Record`'s leader.

    You can use the properties (`status`, `bibliographic_level`, etc.) or their
    slices/index equivalent (`leader[5]`, `leader[7]`, etc.) to read and write
    values.

    See `LoC's documentation
    <https://www.loc.gov/marc/bibliographic/bdleader.html>`_
    for more infos about those fields.

    .. code-block:: python

        leader = Leader("00475cas a2200169 i 4500")
        leader[0:4]  # returns "00475"
        leader.status  # returns "c"
        leader.status = "a"  # sets the status to "a"
        leader[5] # returns the status "a"
        leader[5] = "b" # sets the status to "b"
        str(leader)  # "00475bas a2200169 i 4500"

    Usually the leader is accessed through the `leader` property of a record.

    .. code-block:: python

        from pymarc import MARCReader
        with open('test/marc.dat', 'rb') as fh:
            reader = MARCReader(fh)
            for record in reader:
                print(record.leader)

    When creating/updating a `Record` please note that `record_length` and
    `base_address` will only be generated in the marc21 output of
    :func:`record.as_marc() <pymarc.record.Record.as_marc>`
    """

    def __init__(self, leader):
        # type: (str)
        """Leader is initialized with a string."""
        if len(leader) != LEADER_LEN:
            raise RecordLeaderInvalid
        self.leader = leader

    def __getitem__(self, item):
        # type: (str) -> str
        """Get values using position, slice or properties.

        leader[:4] == leader.length
        """
        if isinstance(item, slice) or isinstance(item, int):
            return self.leader[item]
        return getattr(self, item)

    def __setitem__(self, item, value):
        # type: (str, str) -> str
        """Set values using position, slice or properties.

        leader[5] = "a"
        leader[0:4] = "0000"
        leader.status = "a"
        """
        if isinstance(item, slice):
            self._replace_values(position=item.start, value=value)
        elif isinstance(item, int):
            self._replace_values(position=item, value=value)
        else:
            setattr(self, item, value)

    def __str__(self):
        # type: () -> str
        """A string representation of the leader."""
        return self.leader

    def _replace_values(self, position, value):
        # type: (int, str) -> str
        """Replaces the values in the leader at `position` by `value`."""
        if position < 0:
            raise IndexError("Position must be positive")
        after = position + len(value)
        if after > LEADER_LEN:
            raise BadLeaderValue(
                "%s is too long to be inserted at %d" % (value, position)
            )
        self.leader = self.leader[:position] + value + self.leader[after:]

    @property
    def record_length(self):
        # type: () -> str
        """Record length (00-04)."""
        return self.leader[:5]

    @record_length.setter
    def record_length(self, value):
        # type: (str) -> str
        """Record length (00-04)."""
        if len(value) != 5:
            raise BadLeaderValue("Record length is 4 chars field, got %s" % value)
        self._replace_values(position=0, value=value)

    @property
    def record_status(self):
        # type: () -> str
        """Record status (05)."""
        return self.leader[5]

    @record_status.setter
    def record_status(self, value):
        # type: (str) -> str
        """Record status (05)."""
        if len(value) != 1:
            raise BadLeaderValue("Record status is 1 char field, got %s" % value)
        self._replace_values(position=5, value=value)

    @property
    def type_of_record(self):
        # type: () -> str
        """Type of record (06)."""
        return self.leader[6]

    @type_of_record.setter
    def type_of_record(self, value):
        # type: (str) -> str
        """Type of record (06)."""
        if len(value) != 1:
            raise BadLeaderValue("Type of record is 1 char field, got %s" % value)
        self._replace_values(position=6, value=value)

    @property
    def bibliographic_level(self):
        # type: () -> str
        """Bibliographic level (07)."""
        return self.leader[7]

    @bibliographic_level.setter
    def bibliographic_level(self, value):
        # type: (str) -> str
        """Bibliographic level (07)."""
        if len(value) != 1:
            raise BadLeaderValue("Bibliographic level is 1 char field, got %s" % value)
        self._replace_values(position=7, value=value)

    @property
    def type_of_control(self):
        # type: () -> str
        """Type of control (08)."""
        return self.leader[8]

    @type_of_control.setter
    def type_of_control(self, value):
        # type: (str) -> str
        """Type of control (08)."""
        if len(value) != 1:
            raise BadLeaderValue("Type of control is 1 char field, got %s" % value)
        self._replace_values(position=8, value=value)

    @property
    def coding_scheme(self):
        # type: () -> str
        """Character coding scheme (09)."""
        return self.leader[9]

    @coding_scheme.setter
    def coding_scheme(self, value):
        # type: (str) -> str
        """Character coding scheme (09)."""
        if len(value) != 1:
            raise BadLeaderValue(
                "Character coding scheme is 1 char field, got %s" % value
            )
        self._replace_values(position=9, value=value)

    @property
    def indicator_count(self):
        # type: () -> str
        """Indicator count (10)."""
        return self.leader[10]

    @indicator_count.setter
    def indicator_count(self, value):
        # type: (str) -> str
        """Indicator count (10)."""
        if len(value) != 1:
            raise BadLeaderValue("Indicator count is 1 char field, got %s" % value)
        self._replace_values(position=10, value=value)

    @property
    def subfield_code_count(self):
        # type: () -> str
        """Subfield code count (11)."""
        return self.leader[11]

    @subfield_code_count.setter
    def subfield_code_count(self, value):
        # type: (str) -> str
        """Subfield code count (11)."""
        if len(value) != 1:
            raise BadLeaderValue("Subfield code count is 1 char field, got %s" % value)
        self._replace_values(position=11, value=value)

    @property
    def base_address(self):
        # type: () -> str
        """Base address of data (12-16)."""
        return self.leader[12:17]

    @base_address.setter
    def base_address(self, value):
        # type: (str) -> str
        """Base address of data (12-16)."""
        if len(value) != 5:
            raise BadLeaderValue(
                "Base address of data is 4 chars field, got %s" % value
            )
        self._replace_values(position=12, value=value)

    @property
    def encoding_level(self):
        # type: () -> str
        """Encoding level (17)."""
        return self.leader[17]

    @encoding_level.setter
    def encoding_level(self, value):
        # type: (str) -> str
        """Encoding level (17)."""
        if len(value) != 1:
            raise BadLeaderValue("Encoding level is 1 char field, got %s" % value)
        self._replace_values(position=17, value=value)

    @property
    def cataloging_form(self):
        # type: () -> str
        """Descriptive cataloging form (18)."""
        return self.leader[18]

    @cataloging_form.setter
    def cataloging_form(self, value):
        # type: (str) -> str
        """Descriptive cataloging form (18)."""
        if len(value) != 1:
            raise BadLeaderValue(
                "Descriptive cataloging form is 1 char field, got %s" % value
            )
        self._replace_values(position=18, value=value)

    @property
    def multipart_ressource(self):
        # type: () -> str
        """Multipart resource record level (19)."""
        return self.leader[19]

    @multipart_ressource.setter
    def multipart_ressource(self, value):
        # type: (str) -> str
        """Multipart resource record level (19)."""
        if len(value) != 1:
            raise BadLeaderValue(
                "Multipart resource record level is 1 char field, got %s" % value
            )
        self._replace_values(position=19, value=value)

    @property
    def length_of_field_length(self):
        # type: () -> str
        """Length of the length-of-field portion (20)."""
        return self.leader[20]

    @length_of_field_length.setter
    def length_of_field_length(self, value):
        # type: (str) -> str
        """Length of the length-of-field portion (20)."""
        if len(value) != 1:
            raise BadLeaderValue(
                "Length of the length-of-field portion is 1 char field, got %s" % value
            )
        self._replace_values(position=20, value=value)

    @property
    def starting_character_position_length(self):
        # type: () -> str
        """Length of the starting-character-position portion (21)."""
        return self.leader[21]

    @starting_character_position_length.setter
    def starting_character_position_length(self, value):
        # type: (str) -> str
        """Length of the starting-character-position portion (21)."""
        if len(value) != 1:
            raise BadLeaderValue(
                "Length of the starting-character-position portion is 1 char field, got %s"
                % value
            )
        self._replace_values(position=21, value=value)

    @property
    def implementation_defined_length(self):
        # type: () -> str
        """Length of the implementation-defined portion (22)."""
        return self.leader[22]

    @implementation_defined_length.setter
    def implementation_defined_length(self, value):
        # type: (str) -> str
        """Length of the starting-character-position portion (22)."""
        if len(value) != 1:
            raise BadLeaderValue(
                "Length of the implementation-defined portion is 1 char field, got %s"
                % value
            )
        self._replace_values(position=22, value=value)


================================================
FILE: pymarc/marc8.py
================================================
# This file is part of pymarc. It is subject to the license terms in the
# LICENSE file found in the top-level directory of this distribution and at
# https://opensource.org/licenses/BSD-2-Clause. pymarc may be copied, modified,
# propagated, or distributed according to the terms contained in the LICENSE
# file.

"""Handle MARC-8 files.

see http://www.loc.gov/marc/specifications/speccharmarc8.html
"""

import sys
import unicodedata

from pymarc import marc8_mapping


def marc8_to_unicode(marc8, hide_utf8_warnings=False):
    """Pass in a string, and get back a Unicode object.

    .. code-block:: python

        print marc8_to_unicode(record.title())
    """
    # XXX: might be good to stash away a converter somehow
    # instead of always re-creating it
    converter = MARC8ToUnicode(quiet=hide_utf8_warnings)
    try:
        return converter.translate(marc8)
    except IndexError:
        # convert IndexError into UnicodeDecodeErrors
        raise UnicodeDecodeError(
            "marc8_to_unicode",
            marc8,
            0,
            len(marc8),
            "invalid multibyte character encoding",
        )
    except TypeError:
        # convert TypeError into UnicodeDecodeErrors
        raise UnicodeDecodeError(
            "marc8_to_unicode",
            marc8,
            0,
            len(marc8),
            "invalid multibyte character encoding",
        )


class MARC8ToUnicode:
    """Converts MARC-8 to Unicode.

    Note that currently, unicode strings aren't normalized, and some codecs (e.g.
    iso8859-1) will fail on such strings.  When I can require python 2.3, this will go
    away.

    Warning: MARC-8 EACC (East Asian characters) makes some
    distinctions which aren't captured in Unicode.  The LC tables give
    the option of mapping such characters either to a Unicode private
    use area, or a substitute character which (usually) gives the
    sense.  I've picked the second, so this means that the MARC data
    should be treated as primary and the Unicode data used for display
    purposes only.  (If you know of either of fonts designed for use
    with LC's private-use Unicode assignments, or of attempts to
    standardize Unicode characters to allow round-trips from EACC,
    or if you need the private-use Unicode character translations,
    please inform me, asl2@pobox.com.
    """

    basic_latin = 0x42
    ansel = 0x45

    def __init__(self, G0=basic_latin, G1=ansel, quiet=False):
        """Init."""
        self.g0 = G0
        self.g0_set = set([b"(", b",", b"$"])
        self.g1 = G1
        self.g1_set = set([b")", b"-", b"$"])
        self.quiet = quiet

    def translate(self, marc8_string):
        """Translate."""
        # don't choke on empty marc8_string
        if not marc8_string:
            return u""
        uni_list = []
        combinings = []
        pos = 0
        while pos < len(marc8_string):
            # http://www.loc.gov/marc/specifications/speccharmarc8.html
            if marc8_string[pos : pos + 1] == b"\x1b":
                next_byte = marc8_string[pos + 1 : pos + 2]
                if next_byte in self.g0_set:
                    if len(marc8_string) >= pos + 3:
                        if (
                            marc8_string[pos + 2 : pos + 3] == b","
                            and next_byte == b"$"
                        ):
                            pos += 1
                        self.g0 = ord(marc8_string[pos + 2 : pos + 3])
                        pos = pos + 3
                        continue
                    else:
                        # if there aren't enough remaining characters, readd
                        # the escape character so it doesn't get lost; may
                        # help users diagnose problem records
                        uni_list.append(marc8_string[pos : pos + 1].decode("ascii"))
                        pos += 1
                        continue

                elif next_byte in self.g1_set:
                    if marc8_string[pos + 2 : pos + 3] == b"-" and next_byte == b"$":
                        pos += 1
                    self.g1 = ord(marc8_string[pos + 2 : pos + 3])
                    pos = pos + 3
                    continue
                else:
                    charset = ord(next_byte)
                    if charset in marc8_mapping.CODESETS:
                        self.g0 = charset
                        pos += 2
                    elif charset == 0x73:
                        self.g0 = self.basic_latin
                        pos += 2
                        if pos == len(marc8_string):
                            break

            def is_multibyte(charset):
                return charset == 0x31

            mb_flag = is_multibyte(self.g0)

            if mb_flag:
                code_point = (
                    ord(marc8_string[pos : pos + 1]) * 65536
                    + ord(marc8_string[pos + 1 : pos + 2]) * 256
                    + ord(marc8_string[pos + 2 : pos + 3])
                )
                pos += 3
            else:
                code_point = ord(marc8_string[pos : pos + 1])
                pos += 1

            if code_point < 0x20 or (code_point > 0x80 and code_point < 0xA0):
                uni = chr(code_point)
                continue

            try:
                if code_point > 0x80 and not mb_flag:
                    (uni, cflag) = marc8_mapping.CODESETS[self.g1][code_point]
                else:
                    (uni, cflag) = marc8_mapping.CODESETS[self.g0][code_point]
            except KeyError:
                try:
                    uni = marc8_mapping.ODD_MAP[code_point]
                    uni_list.append(chr(uni))
                    # we can short circuit because we know these mappings
                    # won't be involved in combinings.  (i hope?)
                    continue
                except KeyError:
                    pass
                if not self.quiet:
                    sys.stderr.write(
                        "Unable to parse character 0x%x in g0=%s g1=%s\n"
                        % (code_point, self.g0, self.g1)
                    )
                uni = ord(" ")
                cflag = False

            if cflag:
                combinings.append(chr(uni))
            else:
                uni_list.append(chr(uni))
                if len(combinings) > 0:
                    uni_list.extend(combinings)
                    combinings = []

        # what to do if combining chars left over?
        uni_str = u"".join(uni_list)

        # unicodedata.normalize not available until Python 2.3
        if hasattr(unicodedata, "normalize"):
            uni_str = unicodedata.normalize("NFC", uni_str)

        return uni_str


================================================
FILE: pymarc/marc8_mapping.py
================================================
# This file is part of pymarc. It is subject to the license terms in the
# LICENSE file found in the top-level directory of this distribution and at
# https://opensource.org/licenses/BSD-2-Clause. pymarc may be copied, modified,
# propagated, or distributed according to the terms contained in the LICENSE
# file.

"""MARC-8 mapping."""

CHARSET_34 = {  # Extended Arabic
    0xA1: (0x6FD, 0),  # DOUBLE ALEF WITH HAMZA ABOVE / ARABIC SIGN SINDHI AMPERSAND
    0xA2: (0x672, 0),  # ARABIC LETTER ALEF WITH WAVY HAMZA ABOVE
    0xA3: (0x673, 0),  # ARABIC LETTER ALEF WITH WAVY HAMZA BELOW
    0xA4: (0x679, 0),  # ARABIC LETTER TTEH
    0xA5: (0x67A, 0),  # ARABIC LETTER TTEHEH
    0xA6: (0x67B, 0),  # ARABIC LETTER BBEH
    0xA7: (0x67C, 0),  # ARABIC LETTER TEH WITH RING
    0xA8: (0x67D, 0),  # ARABIC LETTER TEH WITH THREE DOTS ABOVE DOWNWARDS
    0xA9: (0x67E, 0),  # ARABIC LETTER PEH
    0xAA: (0x67F, 0),  # ARABIC LETTER TEHEH
    0xAB: (0x680, 0),  # ARABIC LETTER BEHEH
    0xAC: (0x681, 0),  # ARABIC LETTER HAH WITH HAMZA ABOVE
    0xAD: (0x682, 0),  # ARABIC LETTER HAH WITH TWO ABOVE DOTS VERTICAL ABOVE
    0xAE: (0x683, 0),  # ARABIC LETTER NYEH
    0xAF: (0x684, 0),  # ARABIC LETTER DYEH
    0xB0: (0x685, 0),  # ARABIC LETTER HAH WITH THREE DOTS ABOVE
    0xB1: (0x686, 0),  # ARABIC LETTER TCHEH
    0xB2: (0x6BF, 0),  # ARABIC LETTER TCHEH WITH DOT ABOVE
    0xB3: (0x687, 0),  # ARABIC LETTER TCHEHEH
    0xB4: (0x688, 0),  # ARABIC LETTER DDAL
    0xB5: (0x689, 0),  # ARABIC LETTER DAL WITH RING
    0xB6: (0x68A, 0),  # ARABIC LETTER DAL WITH DOT BELOW
    0xB7: (0x68B, 0),  # ARABIC LETTER DAL WITH DOT BELOW AND SMALL TAH
    0xB8: (0x68C, 0),  # ARABIC LETTER DAHAL
    0xB9: (0x68D, 0),  # ARABIC LETTER DDAHAL
    0xBA: (0x68E, 0),  # ARABIC LETTER DUL
    0xBB: (0x68F, 0),  # ARABIC LETTER DAL WITH THREE DOTS ABOVE DOWNWARDS
    0xBC: (0x690, 0),  # ARABIC LETTER DAL WITH FOUR DOTS ABOVE
    0xBD: (0x691, 0),  # ARABIC LETTER RREH
    0xBE: (0x692, 0),  # ARABIC LETTER REH WITH SMALL V
    0xBF: (0x693, 0),  # ARABIC LETTER REH WITH RING
    0xC0: (0x694, 0),  # ARABIC LETTER REH WITH DOT BELOW
    0xC1: (0x695, 0),  # ARABIC LETTER REH WITH SMALL V BELOW
    0xC2: (0x696, 0),  # ARABIC LETTER REH WITH DOT BELOW AND DOT ABOVE
    0xC3: (0x697, 0),  # ARABIC LETTER REH WITH TWO DOTS ABOVE
    0xC4: (0x698, 0),  # ARABIC LETTER JEH
    0xC5: (0x699, 0),  # ARABIC LETTER REH WITH FOUR DOTS ABOVE
    0xC6: (0x69A, 0),  # ARABIC LETTER SEEN WITH DOT BELOW AND DOT ABOVE
    0xC7: (0x69B, 0),  # ARABIC LETTER SEEN WITH THREE DOTS BELOW
    0xC8: (0x69C, 0),  # ARABIC LETTER SEEN WITH THREE DOTS BELOW AND THREE DOTS ABOVE
    0xC9: (0x6FA, 0),  # ARABIC LETTER SHEEN WITH DOT BELOW
    0xCA: (0x69D, 0),  # ARABIC LETTER SAD WITH TWO DOTS BELOW
    0xCB: (0x69E, 0),  # ARABIC LETTER SAD WITH THREE DOTS ABOVE
    0xCC: (0x6FB, 0),  # ARABIC LETTER DAD WITH DOT BELOW
    0xCD: (0x69F, 0),  # ARABIC LETTER TAH WITH THREE DOTS ABOVE
    0xCE: (0x6A0, 0),  # ARABIC LETTER AIN WITH THREE DOTS ABOVE
    0xCF: (0x6FC, 0),  # ARABIC LETTER GHAIN WITH DOT BELOW
    0xD0: (0x6A1, 0),  # ARABIC LETTER DOTLESS FEH
    0xD1: (0x6A2, 0),  # ARABIC LETTER FEH WITH DOT MOVED BELOW
    0xD2: (0x6A3, 0),  # ARABIC LETTER FEH WITH DOT BELOW
    0xD3: (0x6A4, 0),  # ARABIC LETTER VEH
    0xD4: (0x6A5, 0),  # ARABIC LETTER FEH WITH THREE DOTS BELOW
    0xD5: (0x6A6, 0),  # ARABIC LETTER PEHEH
    0xD6: (0x6A7, 0),  # ARABIC LETTER QAF WITH DOT ABOVE
    0xD7: (0x6A8, 0),  # ARABIC LETTER QAF WITH THREE DOTS ABOVE
    0xD8: (0x6A9, 0),  # ARABIC LETTER KEHEH
    0xD9: (0x6AA, 0),  # ARABIC LETTER SWASH KAF
    0xDA: (0x6AB, 0),  # ARABIC LETTER KAF WITH RING
    0xDB: (0x6AC, 0),  # ARABIC LETTER KAF WITH DOT ABOVE
    0xDC: (0x6AD, 0),  # ARABIC LETTER NG
    0xDD: (0x6AE, 0),  # ARABIC LETTER KAF WITH THREE DOTS BELOW
    0xDE: (0x6AF, 0),  # ARABIC LETTER GAF
    0xDF: (0x6B0, 0),  # ARABIC LETTER GAF WITH RING
    0xE0: (0x6B1, 0),  # ARABIC LETTER NGOEH
    0xE1: (0x6B2, 0),  # ARABIC LETTER GAF WITH TWO DOTS BELOW
    0xE2: (0x6B3, 0),  # ARABIC LETTER GUEH
    0xE3: (0x6B4, 0),  # ARABIC LETTER GAF WITH THREE DOTS ABOVE
    0xE4: (0x6B5, 0),  # ARABIC LETTER LAM WITH SMALL V
    0xE5: (0x6B6, 0),  # ARABIC LETTER LAM WITH DOT ABOVE
    0xE6: (0x6B7, 0),  # ARABIC LETTER LAM WITH THREE DOTS ABOVE
    0xE7: (0x6B8, 0),  # ARABIC LETTER LAM WITH THREE DOTS BELOW
    0xE8: (0x6BA, 0),  # ARABIC LETTER NOON GHUNNA
    0xE9: (0x6BB, 0),  # ARABIC LETTER RNOON
    0xEA: (0x6BC, 0),  # ARABIC LETTER NOON WITH RING
    0xEB: (0x6BD, 0),  # ARABIC LETTER NOON WITH THREE DOTS ABOVE
    0xEC: (0x6B9, 0),  # ARABIC LETTER NOON WITH DOT BELOW
    0xED: (0x6BE, 0),  # ARABIC LETTER HEH DOACHASHMEE
    0xEE: (0x6C0, 0),  # HEH WITH HAMZA ABOVE / ARABIC LETTER HEH WITH YEH ABOVE
    0xEF: (0x6C4, 0),  # ARABIC LETTER WAW WITH RING
    0xF0: (0x6C5, 0),  # KYRGHYZ OE / ARABIC LETTER KIRGHIZ OE
    0xF1: (0x6C6, 0),  # ARABIC LETTER OE
    0xF2: (0x6CA, 0),  # ARABIC LETTER WAW WITH TWO DOTS ABOVE
    0xF3: (0x6CB, 0),  # ARABIC LETTER VE
    0xF4: (0x6CD, 0),  # ARABIC LETTER YEH WITH TAIL
    0xF5: (0x6CE, 0),  # ARABIC LETTER YEH WITH SMALL V
    0xF6: (0x6D0, 0),  # ARABIC LETTER E
    0xF7: (0x6D2, 0),  # ARABIC LETTER YEH BARREE
    0xF8: (0x6D3, 0),  # ARABIC LETTER YEH BARREE WITH HAMZA ABOVE
    0xFD: (0x306, 1),  # SHORT E / COMBINING BREVE
    0xFE: (0x30C, 1),  # SHORT U / COMBINING CARON
}
CHARSET_45 = {  # Extended Latin (ANSEL)
    0x88: (0x98, 0),  # NON-SORT BEGIN / START OF STRING
    0x89: (0x9C, 0),  # NON-SORT END / STRING TERMINATOR
    0x8D: (0x200D, 0),  # JOINER / ZERO WIDTH JOINER
    0x8E: (0x200C, 0),  # NON-JOINER / ZERO WIDTH NON-JOINER
    0xA1: (0x141, 0),  # UPPERCASE POLISH L / LATIN CAPITAL LETTER L WITH STROKE
    0xA2: (0xD8, 0),  # UPPERCASE SCANDINAVIAN O / LATIN CAPITAL LETTER O WITH STROKE
    0xA3: (0x110, 0),  # UPPERCASE D WITH CROSSBAR / LATIN CAPITAL LETTER D WITH STROKE
    0xA4: (
        0xDE,
        0,
    ),  # UPPERCASE ICELANDIC THORN / LATIN CAPITAL LETTER THORN (Icelandic)
    0xA5: (0xC6, 0),  # UPPERCASE DIGRAPH AE / LATIN CAPITAL LIGATURE AE
    0xA6: (0x152, 0),  # UPPERCASE DIGRAPH OE / LATIN CAPITAL LIGATURE OE
    0xA7: (0x2B9, 0),  # SOFT SIGN, PRIME / MODIFIER LETTER PRIME
    0xA8: (0xB7, 0),  # MIDDLE DOT
    0xA9: (0x266D, 0),  # MUSIC FLAT SIGN
    0xAA: (0xAE, 0),  # PATENT MARK / REGISTERED SIGN
    0xAB: (0xB1, 0),  # PLUS OR MINUS / PLUS-MINUS SIGN
    0xAC: (0x1A0, 0),  # UPPERCASE O-HOOK / LATIN CAPITAL LETTER O WITH HORN
    0xAD: (0x1AF, 0),  # UPPERCASE U-HOOK / LATIN CAPITAL LETTER U WITH HORN
    0xAE: (0x2BC, 0),  # ALIF / MODIFIER LETTER RIGHT HALF RING
    0xB0: (0x2BB, 0),  # AYN / MODIFIER LETTER TURNED COMMA
    0xB1: (0x142, 0),  # LOWERCASE POLISH L / LATIN SMALL LETTER L WITH STROKE
    0xB2: (0xF8, 0),  # LOWERCASE SCANDINAVIAN O / LATIN SMALL LETTER O WITH STROKE
    0xB3: (0x111, 0),  # LOWERCASE D WITH CROSSBAR / LATIN SMALL LETTER D WITH STROKE
    0xB4: (0xFE, 0),  # LOWERCASE ICELANDIC THORN / LATIN SMALL LETTER THORN (Icelandic)
    0xB5: (0xE6, 0),  # LOWERCASE DIGRAPH AE / LATIN SMALL LIGATURE AE
    0xB6: (0x153, 0),  # LOWERCASE DIGRAPH OE / LATIN SMALL LIGATURE OE
    0xB7: (0x2BA, 0),  # HARD SIGN, DOUBLE PRIME / MODIFIER LETTER DOUBLE PRIME
    0xB8: (0x131, 0),  # LOWERCASE TURKISH I / LATIN SMALL LETTER DOTLESS I
    0xB9: (0xA3, 0),  # BRITISH POUND / POUND SIGN
    0xBA: (0xF0, 0),  # LOWERCASE ETH / LATIN SMALL LETTER ETH (Icelandic)
    0xBC: (0x1A1, 0),  # LOWERCASE O-HOOK / LATIN SMALL LETTER O WITH HORN
    0xBD: (0x1B0, 0),  # LOWERCASE U-HOOK / LATIN SMALL LETTER U WITH HORN
    0xC0: (0xB0, 0),  # DEGREE SIGN
    0xC1: (0x2113, 0),  # SCRIPT SMALL L
    0xC2: (0x2117, 0),  # SOUND RECORDING COPYRIGHT
    0xC3: (0xA9, 0),  # COPYRIGHT SIGN
    0xC4: (0x266F, 0),  # MUSIC SHARP SIGN
    0xC5: (0xBF, 0),  # INVERTED QUESTION MARK
    0xC6: (0xA1, 0),  # INVERTED EXCLAMATION MARK
    0xC7: (0xDF, 0),  # ESZETT SYMBOL
    0xC8: (0x20AC, 0),  # EURO SIGN
    0xE0: (0x309, 1),  # PSEUDO QUESTION MARK / COMBINING HOOK ABOVE
    0xE1: (0x300, 1),  # GRAVE / COMBINING GRAVE ACCENT (Varia)
    0xE2: (0x301, 1),  # ACUTE / COMBINING ACUTE ACCENT (Oxia)
    0xE3: (0x302, 1),  # CIRCUMFLEX / COMBINING CIRCUMFLEX ACCENT
    0xE4: (0x303, 1),  # TILDE / COMBINING TILDE
    0xE5: (0x304, 1),  # MACRON / COMBINING MACRON
    0xE6: (0x306, 1),  # BREVE / COMBINING BREVE (Vrachy)
    0xE7: (0x307, 1),  # SUPERIOR DOT / COMBINING DOT ABOVE
    0xE8: (0x308, 1),  # UMLAUT, DIAERESIS / COMBINING DIAERESIS (Dialytika)
    0xE9: (0x30C, 1),  # HACEK / COMBINING CARON
    0xEA: (0x30A, 1),  # CIRCLE ABOVE, ANGSTROM / COMBINING RING ABOVE
    0xEB: (0xFE20, 1),  # LIGATURE, FIRST HALF / COMBINING LIGATURE LEFT HALF
    0xEC: (0xFE21, 1),  # LIGATURE, SECOND HALF / COMBINING LIGATURE RIGHT HALF
    0xED: (0x315, 1),  # HIGH COMMA, OFF CENTER / COMBINING COMMA ABOVE RIGHT
    0xEE: (0x30B, 1),  # DOUBLE ACUTE / COMBINING DOUBLE ACUTE ACCENT
    0xEF: (0x310, 1),  # CANDRABINDU / COMBINING CANDRABINDU
    0xF0: (0x327, 1),  # CEDILLA / COMBINING CEDILLA
    0xF1: (0x328, 1),  # RIGHT HOOK, OGONEK / COMBINING OGONEK
    0xF2: (0x323, 1),  # DOT BELOW / COMBINING DOT BELOW
    0xF3: (0x324, 1),  # DOUBLE DOT BELOW / COMBINING DIAERESIS BELOW
    0xF4: (0x325, 1),  # CIRCLE BELOW / COMBINING RING BELOW
    0xF5: (0x333, 1),  # DOUBLE UNDERSCORE / COMBINING DOUBLE LOW LINE
    0xF6: (0x332, 1),  # UNDERSCORE / COMBINING LOW LINE
    0xF7: (0x326, 1),  # LEFT HOOK (COMMA BELOW) / COMBINING COMMA BELOW
    0xF8: (0x31C, 1),  # RIGHT CEDILLA / COMBINING LEFT HALF RING BELOW
    0xF9: (0x32E, 1),  # UPADHMANIYA / COMBINING BREVE BELOW
    0xFA: (0xFE22, 1),  # DOUBLE TILDE, FIRST HALF / COMBINING DOUBLE TILDE LEFT HALF
    0xFB: (0xFE23, 1),  # DOUBLE TILDE, SECOND HALF / COMBINING DOUBLE TILDE RIGHT HALF
    0xFE: (0x313, 1),  # HIGH COMMA, CENTERED / COMBINING COMMA ABOVE (Psili)
}
CHARSET_33 = {  # Basic Arabic
    0x21: (0x21, 0),  # EXCLAMATION MARK
    0x22: (0x22, 0),  # QUOTATION MARK
    0x23: (0x23, 0),  # NUMBER SIGN
    0x24: (0x24, 0),  # DOLLAR SIGN
    0x25: (0x66A, 0),  # PERCENT SIGN / ARABIC PERCENT SIGN
    0x26: (0x26, 0),  # AMPERSAND
    0x27: (0x27, 0),  # APOSTROPHE
    0x28: (0x28, 0),  # OPENING PARENTHESIS / LEFT PARENTHESIS
    0x29: (0x29, 0),  # CLOSING PARENTHESIS / RIGHT PARENTHESIS
    0x2A: (0x66D, 0),  # ASTERISK / ARABIC FIVE POINTED STAR
    0x2B: (0x2B, 0),  # PLUS SIGN
    0x2C: (0x60C, 0),  # ARABIC COMMA
    0x2D: (0x2D, 0),  # HYPHEN-MINUS
    0x2E: (0x2E, 0),  # PERIOD, DECIMAL POINT / FULL STOP
    0x2F: (0x2F, 0),  # SLASH / SOLIDUS
    0x30: (0x660, 0),  # ARABIC-INDIC DIGIT ZERO
    0x31: (0x661, 0),  # ARABIC-INDIC DIGIT ONE
    0x32: (0x662, 0),  # ARABIC-INDIC DIGIT TWO
    0x33: (0x663, 0),  # ARABIC-INDIC DIGIT THREE
    0x34: (0x664, 0),  # ARABIC-INDIC DIGIT FOUR
    0x35: (0x665, 0),  # ARABIC-INDIC DIGIT FIVE
    0x36: (0x666, 0),  # ARABIC-INDIC DIGIT SIX
    0x37: (0x667, 0),  # ARABIC-INDIC DIGIT SEVEN
    0x38: (0x668, 0),  # ARABIC-INDIC DIGIT EIGHT
    0x39: (0x669, 0),  # ARABIC-INDIC DIGIT NINE
    0x3A: (0x3A, 0),  # COLON
    0x3B: (0x61B, 0),  # ARABIC SEMICOLON
    0x3C: (0x3C, 0),  # LESS-THAN SIGN
    0x3D: (0x3D, 0),  # EQUALS SIGN
    0x3E: (0x3E, 0),  # GREATER-THAN SIGN
    0x3F: (0x61F, 0),  # ARABIC QUESTION MARK
    0x41: (0x621, 0),  # HAMZAH / ARABIC LETTER HAMZA
    0x42: (0x622, 0),  # ARABIC LETTER ALEF WITH MADDA ABOVE
    0x43: (0x623, 0),  # ARABIC LETTER ALEF WITH HAMZA ABOVE
    0x44: (0x624, 0),  # ARABIC LETTER WAW WITH HAMZA ABOVE
    0x45: (0x625, 0),  # ARABIC LETTER ALEF WITH HAMZA BELOW
    0x46: (0x626, 0),  # ARABIC LETTER YEH WITH HAMZA ABOVE
    0x47: (0x627, 0),  # ARABIC LETTER ALEF
    0x48: (0x628, 0),  # ARABIC LETTER BEH
    0x49: (0x629, 0),  # ARABIC LETTER TEH MARBUTA
    0x4A: (0x62A, 0),  # ARABIC LETTER TEH
    0x4B: (0x62B, 0),  # ARABIC LETTER THEH
    0x4C: (0x62C, 0),  # ARABIC LETTER JEEM
    0x4D: (0x62D, 0),  # ARABIC LETTER HAH
    0x4E: (0x62E, 0),  # ARABIC LETTER KHAH
    0x4F: (0x62F, 0),  # ARABIC LETTER DAL
    0x50: (0x630, 0),  # ARABIC LETTER THAL
    0x51: (0x631, 0),  # ARABIC LETTER REH
    0x52: (0x632, 0),  # ARABIC LETTER ZAIN
    0x53: (0x633, 0),  # ARABIC LETTER SEEN
    0x54: (0x634, 0),  # ARABIC LETTER SHEEN
    0x55: (0x635, 0),  # ARABIC LETTER SAD
    0x56: (0x636, 0),  # ARABIC LETTER DAD
    0x57: (0x637, 0),  # ARABIC LETTER TAH
    0x58: (0x638, 0),  # ARABIC LETTER ZAH
    0x59: (0x639, 0),  # ARABIC LETTER AIN
    0x5A: (0x63A, 0),  # ARABIC LETTER GHAIN
    0x5B: (0x5B, 0),  # OPENING SQUARE BRACKET / LEFT SQUARE BRACKET
    0x5D: (0x5D, 0),  # CLOSING SQUARE BRACKET / RIGHT SQUARE BRACKET
    0x60: (0x640, 0),  # ARABIC TATWEEL
    0x61: (0x641, 0),  # ARABIC LETTER FEH
    0x62: (0x642, 0),  # ARABIC LETTER QAF
    0x63: (0x643, 0),  # ARABIC LETTER KAF
    0x64: (0x644, 0),  # ARABIC LETTER LAM
    0x65: (0x645, 0),  # ARABIC LETTER MEEM
    0x66: (0x646, 0),  # ARABIC LETTER NOON
    0x67: (0x647, 0),  # ARABIC LETTER HEH
    0x68: (0x648, 0),  # ARABIC LETTER WAW
    0x69: (0x649, 0),  # ARABIC LETTER ALEF MAKSURA
    0x6A: (0x64A, 0),  # ARABIC LETTER YEH
    0x6B: (0x64B, 1),  # ARABIC FATHATAN
    0x6C: (0x64C, 1),  # ARABIC DAMMATAN
    0x6D: (0x64D, 1),  # ARABIC KASRATAN
    0x6E: (0x64E, 1),  # ARABIC FATHA
    0x6F: (0x64F, 1),  # ARABIC DAMMA
    0x70: (0x650, 1),  # ARABIC KASRA
    0x71: (0x651, 1),  # ARABIC SHADDA
    0x72: (0x652, 1),  # ARABIC SUKUN
    0x73: (0x671, 0),  # ARABIC LETTER ALEF WASLA
    0x74: (0x670, 0),  # ARABIC LETTER SUPERSCRIPT ALEF
    0x78: (0x66C, 0),  # ARABIC THOUSANDS SEPARATOR
    0x79: (0x201D, 0),  # RIGHT DOUBLE QUOTATION MARK
    0x7A: (0x201C, 0),  # LEFT DOUBLE QUOTATION MARK
}
CHARSET_32 = {  # Basic Hebrew
    0x21: (0x21, 0),  # EXCLAMATION MARK
    0x22: (0x5F4, 0),  # QUOTATION MARK, GERSHAYIM / HEBREW PUNCTUATION GERSHAYIM
    0x23: (0x23, 0),  # NUMBER SIGN
    0x24: (0x24, 0),  # DOLLAR SIGN
    0x25: (0x25, 0),  # PERCENT SIGN
    0x26: (0x26, 0),  # AMPERSAND
    0x27: (0x5F3, 0),  # APOSTROPHE, GERESH / HEBREW PUNCTUATION GERESH
    0x28: (0x28, 0),  # OPENING PARENTHESIS / LEFT PARENTHESIS
    0x29: (0x29, 0),  # CLOSING PARENTHESIS / RIGHT PARENTHESIS
    0x2A: (0x2A, 0),  # ASTERISK
    0x2B: (0x2B, 0),  # PLUS SIGN
    0x2C: (0x2C, 0),  # COMMA
    0x2D: (0x5BE, 0),  # HYPHEN-MINUS, MAKEF / HEBREW PUNCTUATION MAQAF
    0x2E: (0x2E, 0),  # PERIOD, DECIMAL POINT / FULL STOP
    0x2F: (0x2F, 0),  # SLASH / SOLIDUS
    0x30: (0x30, 0),  # DIGIT ZERO
    0x31: (0x31, 0),  # DIGIT ONE
    0x32: (0x32, 0),  # DIGIT TWO
    0x33: (0x33, 0),  # DIGIT THREE
    0x34: (0x34, 0),  # DIGIT FOUR
    0x35: (0x35, 0),  # DIGIT FIVE
    0x36: (0x36, 0),  # DIGIT SIX
    0x37: (0x37, 0),  # DIGIT SEVEN
    0x38: (0x38, 0),  # DIGIT EIGHT
    0x39: (0x39, 0),  # DIGIT NINE
    0x3A: (0x3A, 0),  # COLON
    0x3B: (0x3B, 0),  # SEMICOLON
    0x3C: (0x3C, 0),  # LESS-THAN SIGN
    0x3D: (0x3D, 0),  # EQUALS SIGN
    0x3E: (0x3E, 0),  # GREATER-THAN SIGN
    0x3F: (0x3F, 0),  # QUESTION MARK
    0x40: (0x5B7, 1),  # HEBREW POINT PATAH
    0x41: (0x5B8, 1),  # KAMATS / HEBREW POINT QAMATS
    0x42: (0x5B6, 1),  # HEBREW POINT SEGOL
    0x43: (0x5B5, 1),  # TSEREH / HEBREW POINT TSERE
    0x44: (0x5B4, 1),  # HIRIK / HEBREW POINT HIRIQ
    0x45: (0x5B9, 1),  # HOLAM, LEFT SIN DOT / HEBREW POINT HOLAM
    0x46: (0x5BB, 1),  # KUBUTS / HEBREW POINT QUBUTS
    0x47: (0x5B0, 1),  # HEBREW POINT SHEVA
    0x48: (0x5B2, 1),  # HEBREW POINT HATAF PATAH
    0x49: (0x5B3, 1),  # HATAF KAMATS / HEBREW POINT HATAF QAMATS
    0x4A: (0x5B1, 1),  # HEBREW POINT HATAF SEGOL
    0x4B: (0x5BC, 1),  # HEBREW POINT DAGESH OR MAPIQ
    0x4C: (0x5BF, 1),  # RAFEH / HEBREW POINT RAFE
    0x4D: (0x5C1, 1),  # RIGHT SHIN DOT / HEBREW POINT  SHIN DOT
    0x4E: (0xFB1E, 1),  # VARIKA / HEBREW POINT JUDEO-SPANISH VARIKA
    0x5B: (0x5B, 0),  # OPENING SQUARE BRACKET / LEFT SQUARE BRACKET
    0x5D: (0x5D, 0),  # CLOSING SQUARE BRACKET / RIGHT SQUARE BRACKET
    0x60: (0x5D0, 0),  # HEBREW LETTER ALEF
    0x61: (0x5D1, 0),  # HEBREW LETTER BET
    0x62: (0x5D2, 0),  # HEBREW LETTER GIMEL
    0x63: (0x5D3, 0),  # HEBREW LETTER DALET
    0x64: (0x5D4, 0),  # HEBREW LETTER HE
    0x65: (0x5D5, 0),  # HEBREW LETTER VAV
    0x66: (0x5D6, 0),  # HEBREW LETTER ZAYIN
    0x67: (0x5D7, 0),  # HEBREW LETTER HET
    0x68: (0x5D8, 0),  # HEBREW LETTER TET
    0x69: (0x5D9, 0),  # HEBREW LETTER YOD
    0x6A: (0x5DA, 0),  # HEBREW LETTER FINAL KAF
    0x6B: (0x5DB, 0),  # HEBREW LETTER KAF
    0x6C: (0x5DC, 0),  # HEBREW LETTER LAMED
    0x6D: (0x5DD, 0),  # HEBREW LETTER FINAL MEM
    0x6E: (0x5DE, 0),  # HEBREW LETTER MEM
    0x6F: (0x5DF, 0),  # HEBREW LETTER FINAL NUN
    0x70: (0x5E0, 0),  # HEBREW LETTER NUN
    0x71: (0x5E1, 0),  # HEBREW LETTER SAMEKH
    0x72: (0x5E2, 0),  # HEBREW LETTER AYIN
    0x73: (0x5E3, 0),  # HEBREW LETTER FINAL PE
    0x74: (0x5E4, 0),  # HEBREW LETTER PE
    0x75: (0x5E5, 0),  # HEBREW LETTER FINAL TSADI
    0x76: (0x5E6, 0),  # HEBREW LETTER TSADI
    0x77: (0x5E7, 0),  # HEBREW LETTER QOF / KOF
    0x78: (0x5E8, 0),  # HEBREW LETTER RESH
    0x79: (0x5E9, 0),  # HEBREW LETTER SHIN
    0x7A: (0x5EA, 0),  # HEBREW LETTER TAV
    0x7B: (0x5F0, 0),  # HEBREW LIGATURE YIDDISH DOUBLE VAV / TSVEY VOVN
    0x7C: (0x5F1, 0),  # HEBREW LIGATURE YIDDISH VAV YOD / VOV YUD
    0x7D: (0x5F2, 0),  # HEBREW LIGATURE YIDDISH DOUBLE YOD / TSVEY YUDN
}
CHARSET_31 = {  # Chinese, Japanese, Korean (EACC)
    0x215556: (0x8461, 0),  # East Asian ideograph
    0x6F5557: (0xC5D1, 0),  # Korean hangul
    0x456324: (0x9F61, 0),  # East Asian ideograph
    0x6F5140: (0xBCCF, 0),  # Korean hangul
    0x6F5558: (0xC5D4, 0),  # Korean hangul
    0x213536: (0x53EC, 0),  # East Asian ideograph
    0x6F5D3C: (0xD64B, 0),  # Korean hangul
    0x215559: (0x8438, 0),  # East Asian ideograph
    0x2D555A: (0x8386, 0),  # East Asian ideograph
    0x6F5C7C: (0xD5D0, 0),  # Korean hangul
    0x295B60: (0x9E55, 0),  # East Asian ideograph
    0x2D555B: (0x8385, 0),  # East Asian ideograph
    0x6F555C: (0xC5E3, 0),  # Korean hangul
    0x6F5141: (0xBCD0, 0),  # Korean hangul
    0x27555D: (0x5E2D, 0),  # East Asian ideograph
    0x23555E: (0x9B1F, 0),  # East Asian ideograph
    0x333F24: (0x7718, 0),  # East Asian ideograph
    0x6F555F: (0xC5ED, 0),  # Korean hangul
    0x6F4F5C: (0xB9AC, 0),  # Korean hangul
    0x6F5560: (0xC5EE, 0),  # Korean hangul
    0x6F4E21: (0xB540, 0),  # Korean hangul
    0x4B4146: (0x6362, 0),  # East Asian ideograph
    0x235031: (0x9874, 0),  # East Asian ideograph
    0x225561: (0x7273, 0),  # East Asian ideograph
    0x274257: (0x6BD9, 0),  # East Asian ideograph
    0x295C28: (0x9E58, 0),  # East Asian ideograph
    0x6F5142: (0xBCD1, 0),  # Korean hangul
    0x6F5562: (0xC5F4, 0),  # Korean hangul
    0x213727: (0x5616, 0),  # East Asian ideograph
    0x215563: (0x84C0, 0),  # East Asian ideograph
    0x215564: (0x8499, 0),  # East Asian ideograph
    0x6F562E: (0xC679, 0),  # Korean hangul
    0x2D4674: (0x51B2, 0),  # East Asian ideograph
    0x6F5565: (0xC5FC, 0),  # Korean hangul
    0x4B4147: (0x633F, 0),  # East Asian ideograph
    0x215566: (0x8490, 0),  # East Asian ideograph
    0x6F5143: (0xBCD2, 0),  # Korean hangul
    0x275567: (0x82CD, 0),  # East Asian ideograph
    0x215568: (0x853D, 0),  # East Asian ideograph
    0x6F5569: (0xC600, 0),  # Korean hangul
    0x27314C: (0x6765, 0),  # East Asian ideograph
    0x276071: (0x517B, 0),  # East Asian ideograph
    0x6F556A: (0xC601, 0),  # Korean hangul
    0x33325D: (0x4FA1, 0),  # East Asian ideograph
    0x6F5839: (0xC9DD, 0),  # Korean hangul
    0x2D6B5F: (0x5273, 0),  # East Asian ideograph
    0x21556B: (0x851A, 0),  # East Asian ideograph
    0x6F5144: (0xBCD5, 0),  # Korean hangul
    0x27556C: (0x83B2, 0),  # East Asian ideograph
    0x22556D: (0x727C, 0),  # East Asian ideograph
    0x21556E: (0x852D, 0),  # East Asian ideograph
    0x6F556F: (0xC610, 0),  # Korean hangul
    0x295721: (0x9C86, 0),  # East Asian ideograph
    0x466074: (0x76B2, 0),  # East Asian ideograph
    0x333529: (0x53DC, 0),  # East Asian ideograph
    0x6F5145: (0xBCF4, 0),  # Korean hangul
    0x225571: (0x727F, 0),  # East Asian ideograph
    0x225D42: (0x7521, 0),  # East Asian ideograph
    0x275949: (0x8A89, 0),  # East Asian ideograph
    0x6F5037: (0xBA84, 0),  # Korean hangul
    0x215573: (0x8514, 0),  # East Asian ideograph
    0x215574: (0x84EC, 0),  # East Asian ideograph
    0x4C2330: (0x5C53, 0),  # East Asian ideograph
    0x69656E: (0x7DD5, 0),  # East Asian ideograph
    0x6F5146: (0xBCF5, 0),  # Korean hangul
    0x215576: (0x8569, 0),  # East Asian ideograph
    0x282441: (0x5C98, 0),  # East Asian ideograph
    0x234021: (0x9132, 0),  # East Asian ideograph
    0x4D4176: (0x91DB, 0),  # East Asian ideograph
    0x335577: (0x8602, 0),  # East Asian ideograph
    0x394022: (0x6443, 0),  # East Asian ideograph
    0x6F5578: (0xC634, 0),  # Korean hangul
    0x6F4F5D: (0xB9AD, 0),  # Korean hangul
    0x2D3749: (0x5650, 0),  # East Asian ideograph
    0x287139: (0x7EE8, 0),  # East Asian ideograph
    0x234024: (0x9126, 0),  # East Asian ideograph
    0x6F557A: (0xC637, 0),  # Korean hangul
    0x213C35: (0x5DDE, 0),  # East Asian ideograph
    0x6F5147: (0xBCF6, 0),  # Korean hangul
    0x6F557B: (0xC639, 0),  # Korean hangul
    0x215945: (0x8B66, 0),  # East Asian ideograph
    0x21372C: (
        0x5606,
        0,
    ),  # East Asian ideograph (variant of 4B372C which maps to 5606)
    0x27557C: (0x829C, 0),  # East Asian ideograph
    0x224027: (0x69BF, 0),  # East Asian ideograph
    0x23557D: (0x9B34, 0),  # East Asian ideograph
    0x6F557E: (0xC640, 0),  # Korean hangul
    0x2D4029: (0x5214, 0),  # East Asian ideograph
    0x6F5148: (0xBCF8, 0),  # Korean hangul
    0x23402B: (0x9134, 0),  # East Asian ideograph
    0x21372D: (0x5609, 0),  # East Asian ideograph
    0x23402C: (0x9136, 0),  # East Asian ideograph
    0x6F5876: (0xCC14, 0),  # Korean hangul
    0x22402D: (0x69A3, 0),  # East Asian ideograph
    0x22507C: (0x70DC, 0),  # East Asian ideograph
    0x22402E: (0x69A4, 0),  # East Asian ideograph
    0x6F5149: (0xBCFC, 0),  # Korean hangul
    0x6F575F: (0xC8B0, 0),  # Korean hangul
    0x295A75: (0x9E41, 0),  # East Asian ideograph
    0x4B525A: (0x7FFA, 0),  # East Asian ideograph
    0x234031: (0x913A, 0),  # East Asian ideograph
    0x2D383F: (0x575A, 0),  # East Asian ideograph
    0x294371: (0x94FD, 0),  # East Asian ideograph
    0x234032: (0x913B, 0),  # East Asian ideograph
    0x6F5C27: (0xD38C, 0),  # Korean hangul
    0x224034: (0x69D4, 0),  # East Asian ideograph
    0x6F514A: (0xBD04, 0),  # Korean hangul
    0x335F73: (0x9759, 0),  # East Asian ideograph
    0x6F4C33: (0xB17C, 0),  # Korean hangul
    0x4B525B: (
        0x66DC,
        0,
    ),  # East Asian ideograph (variant of 39525B which maps to 66DC)
    0x2E7C2E: (0x831C, 0),  # East Asian ideograph
    0x224038: (0x69C3, 0),  # East Asian ideograph
    0x6F5B4D: (0xD280, 0),  # Korean hangul
    0x2D4039: (0x67C6, 0),  # East Asian ideograph
    0x6F514B: (0xBD05, 0),  # Korean hangul
    0x276036: (0x54CD, 0),  # East Asian ideograph
    0x395477: (0x85A6, 0),  # East Asian ideograph
    0x213730: (0x5617, 0),  # East Asian ideograph
    0x4B525C: (0x8002, 0),  # East Asian ideograph
    0x23403B: (0x9143, 0),  # East Asian ideograph
    0x295B6B: (0x9E57, 0),  # East Asian ideograph
    0x2D5963: (0x8C98, 0),  # East Asian ideograph
    0x224C3C: (0x6F3B, 0),  # East Asian ideograph
    0x22403E: (0x6A11, 0),  # East Asian ideograph
    0x6F5A73: (0xD0C8, 0),  # Korean hangul
    0x6F514C: (0xBD07, 0),  # Korean hangul
    0x213B74: (0x5CFD, 0),  # East Asian ideograph
    0x23403F: (0x9145, 0),  # East Asian ideograph
    0x21594A: (0x8B80, 0),  # East Asian ideograph
    0x213731: (0x560D, 0),  # East Asian ideograph
    0x225D49: (0x752F, 0),  # East Asian ideograph
    0x234040: (0x9148, 0),  # East Asian ideograph
    0x224041: (0x6A00, 0),  # East Asian ideograph
    0x295B6C: (0x9E4B, 0),  # East Asian ideograph
    0x234042: (0x9150, 0),  # East Asian ideograph
    0x234043: (0x914E, 0),  # East Asian ideograph
    0x6F514D: (0xBD09, 0),  # Korean hangul
    0x213B75: (0x5CED, 0),  # East Asian ideograph
    0x394A60: (0x9AE6, 0),  # East Asian ideograph
    0x213732: (0x562E, 0),  # East Asian ideograph
    0x334045: (0x629B, 0),  # East Asian ideograph
    0x292A34: (0x86AC, 0),  # East Asian ideograph
    0x224046: (0x69E6, 0),  # East Asian ideograph
    0x2F2D79: (0x88B5, 0),  # East Asian ideograph
    0x234048: (0x9159, 0),  # East Asian ideograph
    0x6F514E: (0xBD10, 0),  # Korean hangul
    0x276039: (0x9877, 0),  # East Asian ideograph
    0x234049: (0x915C, 0),  # East Asian ideograph
    0x33494A: (0x70D6, 0),  # East Asian ideograph
    0x294372: (0x9513, 0),  # East Asian ideograph
    0x22404B: (0x6A0B, 0),  # East Asian ideograph
    0x22404C: (0x69E5, 0),  # East Asian ideograph
    0x2E2F7A: (0x6738, 0),  # East Asian ideograph
    0x22404D: (0x69E9, 0),  # East Asian ideograph
    0x6F514F: (0xBD14, 0),  # Korean hangul
    0x27603A: (0x9879, 0),  # East Asian ideograph
    0x2D4F29: (0x9F9D, 0),  # East Asian ideograph
    0x213734: (0x564E, 0),  # East Asian ideograph
    0x2D404F: (0x6294, 0),  # East Asian ideograph
    0x6F5039: (0xBA87, 0),  # Korean hangul
    0x224050: (0x69FC, 0),  # East Asian ideograph
    0x6F5B4E: (0xD284, 0),  # Korean hangul
    0x234052: (0x915A, 0),  # East Asian ideograph
    0x6F5150: (0xBD24, 0),  # Korean hangul
    0x213B78: (0x5CF0, 0),  # East Asian ideograph
    0x234053: (0x9161, 0),  # East Asian ideograph
    0x6F596B: (0xCE6B, 0),  # Korean hangul
    0x225D4D: (0x753A, 0),  # East Asian ideograph
    0x224054: (0x6A17, 0),  # East Asian ideograph
    0x4B4C3C: (0x7573, 0),  # East Asian ideograph
    0x224056: (0x69E7, 0),  # East Asian ideograph
    0x224057: (0x69EB, 0),  # East Asian ideograph
    0x6F5151: (0xBD48, 0),  # Korean hangul
    0x213B79: (0x5CF6, 0),  # East Asian ideograph
    0x294621: (0x9553, 0),  # East Asian ideograph
    0x4B6266: (0x9ED2, 0),  # East Asian ideograph
    0x6F5631: (0xC688, 0),  # Korean hangul
    0x22405B: (0x69F1, 0),  # East Asian ideograph
    0x6F5152: (0xBD49, 0),  # Korean hangul
    0x27603D: (0x9884, 0),  # East Asian ideograph
    0x22405E: (0x6A2B, 0),  # East Asian ideograph
    0x29444D: (0x952B, 0),  # East Asian ideograph
    0x22405F: (0x69FF, 0),  # East Asian ideograph
    0x224060: (0x6A20, 0),  # East Asian ideograph
    0x234061: (0x916F, 0),  # East Asian ideograph
    0x6F5153: (0xBD4C, 0),  # Korean hangul
    0x27603E: (0x987C, 0),  # East Asian ideograph
    0x234062: (0x916E, 0),  # East Asian ideograph
    0x275D60: (0x94E8, 0),  # East Asian ideograph
    0x6F5A71: (0xD0C1, 0),  # Korean hangul
    0x4B4E21: (0x7B36, 0),  # East Asian ideograph
    0x224064: (0x69ED, 0),  # East Asian ideograph
    0x28355B: (0x6484, 0),  # East Asian ideograph
    0x6F547D: (0xC545, 0),  # Korean hangul
    0x234066: (0x917A, 0),  # East Asian ideograph
    0x6F582E: (0xC9CA, 0),  # Korean hangul
    0x6F5154: (0xBD50, 0),  # Korean hangul
    0x27603F: (0x987D, 0),  # East Asian ideograph
    0x224067: (0x6A1B, 0),  # East Asian ideograph
    0x213739: (0x5657, 0),  # East Asian ideograph
    0x2D7143: (0x55E2, 0),  # East Asian ideograph
    0x234068: (0x9172, 0),  # East Asian ideograph
    0x2D5A63: (0x8DE5, 0),  # East Asian ideograph
    0x2D384A: (0x5872, 0),  # East Asian ideograph
    0x234069: (0x9179, 0),  # East Asian ideograph
    0x27632C: (0x9F9A, 0),  # East Asian ideograph
    0x23406A: (0x9176, 0),  # East Asian ideograph
    0x4C233F: (0x5C76, 0),  # East Asian ideograph
    0x23406B: (0x9174, 0),  # East Asian ideograph
    0x6F5155: (0xBD58, 0),  # Korean hangul
    0x213B7D: (0x5D1B, 0),  # East Asian ideograph
    0x276040: (0x987F, 0),  # East Asian ideograph
    0x23406C: (0x9173, 0),  # East Asian ideograph
    0x23406D: (0x9185, 0),  # East Asian ideograph
    0x22406E: (0x6A18, 0),  # East Asian ideograph
    0x23406F: (0x9182, 0),  # East Asian ideograph
    0x4B5F30: (
        0x9686,
        0,
    ),  # East Asian ideograph (variant of 215F30 which maps to 9686)
    0x234070: (0x918A, 0),  # East Asian ideograph
    0x6F5A75: (0xD0D0, 0),  # Korean hangul
    0x213C38: (0x5DE8, 0),  # East Asian ideograph
    0x6F5156: (0xBD59, 0),  # Korean hangul
    0x276041: (0x9881, 0),  # East Asian ideograph
    0x234071: (0x9186, 0),  # East Asian ideograph
    0x21373B: (0x5653, 0),  # East Asian ideograph
    0x234072: (0x918C, 0),  # East Asian ideograph
    0x234073: (0x9181, 0),  # East Asian ideograph
    0x224075: (0x6A0C, 0),  # East Asian ideograph
    0x6F5157: (0xBD64, 0),  # Korean hangul
    0x224076: (0x6A0F, 0),  # East Asian ideograph
    0x21373C: (0x563F, 0),  # East Asian ideograph
    0x4B3F74: (0x623B, 0),  # East Asian ideograph
    0x282F43: (0x6206, 0),  # East Asian ideograph
    0x454738: (0x6CFA, 0),  # East Asian ideograph
    0x275E6A: (0x9610, 0),  # East Asian ideograph
    0x274F36: (0x5E0C, 0),  # East Asian ideograph
    0x6F5E21: (0xD79D, 0),  # Korean hangul
    0x232B24: (0x876A, 0),  # East Asian ideograph
    0x212B25: (0x300C, 0),  # Ideographic left corner bracket
    0x2F5158: (0x7CC7, 0),  # East Asian ideograph
    0x23407B: (0x9191, 0),  # East Asian ideograph
    0x225D55: (0x754A, 0),  # East Asian ideograph
    0x294628: (0x9552, 0),  # East Asian ideograph
    0x4B3050: (0x4E8A, 0),  # East Asian ideograph
    0x22407C: (0x69EE, 0),  # East Asian ideograph
    0x232B27: (0x874E, 0),  # East Asian ideograph
    0x695B37: (0x6737, 0),  # East Asian ideograph
    0x23407D: (0x9190, 0),  # East Asian ideograph
    0x23407E: (0x918E, 0),  # East Asian ideograph
    0x4C6775: (0x7962, 0),  # Unrelated variant of EACC 293032 which maps to 7962
    0x6F5159: (0xBD81, 0),  # Korean hangul
    0x21373E: (0x5637, 0),  # East Asian ideograph
    0x294629: (0x84E5, 0),  # East Asian ideograph
    0x4B3051: (0x5F10, 0),  # East Asian ideograph
    0x6F503B: (0xBAA9, 0),  # Korean hangul
    0x222B2D: (0x602B, 0),  # East Asian ideograph
    0x6F5B50: (0xD290, 0),  # Korean hangul
    0x455847: (
        0x8A25,
        0,
    ),  # East Asian ideograph (variant of 215847 which maps to 8A25)
    0x396B2F: (0x521F, 0),  # East Asian ideograph
    0x6F515A: (0xBD84, 0),  # Korean hangul
    0x6F5861: (0xCAD9, 0),  # Korean hangul
    0x222B30: (0x6019, 0),  # East Asian ideograph
    0x225D57: (0x754E, 0),  # East Asian ideograph
    0x4B3052: (0x6275, 0),  # East Asian ideograph
    0x212B31: (0xFF3B, 0),  # Ideographic left square bracket
    0x4B3749: (
        0x5668,
        0,
    ),  # East Asian ideograph (variant of 213749 which maps to 5668)
    0x3A3B7D: (0x67B1, 0),  # East Asian ideograph
    0x216B33: (0x5231, 0),  # East Asian ideograph
    0x23504A: (0x98BF, 0),  # East Asian ideograph
    0x4B5F35: (0x6B92, 0),  # East Asian ideograph
    0x474270: (0x94BC, 0),  # East Asian ideograph
    0x6F515B: (0xBD87, 0),  # Korean hangul
    0x212B35: (0x3001, 0),  # Ideographic comma
    0x216B36: (0x5235, 0),  # East Asian ideograph
    0x4B6268: (0x9ED9, 0),  # East Asian ideograph
    0x3F404F: (0x638A, 0),  # East Asian ideograph
    0x695B7B: (0x6926, 0),  # East Asian ideograph
    0x222B38: (0x601B, 0),  # East Asian ideograph
    0x216B39: (0x5233, 0),  # East Asian ideograph
    0x6F485F: (0xAC00, 0),  # Korean hangul
    0x276047: (0x988A, 0),  # East Asian ideograph
    0x212B3A: (0xFF1A, 0),  # Ideographic colon
    0x225D59: (0x754B, 0),  # East Asian ideograph
    0x333F3F: (0x51F4, 0),  # East Asian ideograph
    0x212B3B: (0xFF1F, 0),  # Ideographic question mark
    0x2D3852: (0x51A2, 0),  # East Asian ideograph
    0x295739: (0x9C9E, 0),  # East Asian ideograph
    0x222B3D: (0x6033, 0),  # East Asian ideograph
    0x276B3E: (0x522D, 0),  # East Asian ideograph
    0x6F515D: (0xBD89, 0),  # Korean hangul
    0x276048: (0x9888, 0),  # East Asian ideograph
    0x275A28: (0x8D42, 0),  # East Asian ideograph
    0x225D5A: (0x7548, 0),  # East Asian ideograph
    0x29462D: (0x9549, 0),  # East Asian ideograph
    0x6F4B45: (0xB07D, 0),  # Korean hangul
    0x274F3C: (0x79F0, 0),  # East Asian ideograph
    0x706B42: (0x80BC, 0),  # East Asian ideograph
    0x6F515E: (0xBD90, 0),  # Korean hangul
    0x276049: (0x9891, 0),  # East Asian ideograph
    0x217B75: (0x5AA0, 0),  # East Asian ideograph
    0x706B44: (0x80BD, 0),  # East Asian ideograph
    0x33615A: (0x8EB0, 0),  # East Asian ideograph
    0x222B45: (0x600D, 0),  # East Asian ideograph
    0x2D3854: (0x5896, 0),  # East Asian ideograph
    0x274F3D: (0x79CD, 0),  # East Asian ideograph
    0x28533C: (0x709D, 0),  # East Asian ideograph
    0x69573B: (0x5F41, 0),  # East Asian ideograph
    0x216B47: (0x5260, 0),  # East Asian ideograph
    0x6F5B51: (0xD291, 0),  # Korean hangul
    0x6F515F: (0xBD91, 0),  # Korean hangul
    0x27604A: (0x9893, 0),  # East Asian ideograph
    0x213744: (0x5678, 0),  # East Asian ideograph
    0x4B3057: (0x4E99, 0),  # East Asian ideograph
    0x6F2477: (0x3154, 0),  # Korean hangul
    0x2F4053: (0x914F, 0),  # East Asian ideograph
    0x226B4B: (0x7B37, 0),  # East Asian ideograph
    0x29573C: (0x9C91, 0),  # East Asian ideograph
    0x706B4C: (0x80E9, 0),  # East Asian ideograph
    0x4B5F3A: (0x967A, 0),  # East Asian ideograph
    0x216B4D: (0x525E, 0),  # East Asian ideograph
    0x6F5160: (0xBD93, 0),  # Korean hangul
    0x6F5940: (0xCCAD, 0),  # Korean hangul
    0x29573D: (0x9C92, 0),  # East Asian ideograph
    0x6F5161: (0xBD95, 0),  # Korean hangul
    0x216B53: (0x5255, 0),  # East Asian ideograph
    0x705F50: (0x549D, 0),  # East Asian ideograph
    0x2E6B54: (0x7B04, 0),  # East Asian ideograph
    0x292B55: (0x86F3, 0),  # East Asian ideograph
    0x6F555A: (0xC5E0, 0),  # Korean hangul
    0x70622A: (0x7339, 0),  # East Asian ideograph
    0x6F5162: (0xBD99, 0),  # Korean hangul
    0x212B59: (0xFF0F, 0),  # Ideographic solidus
    0x2D562E: (0x8024, 0),  # East Asian ideograph
    0x213563: (0x5439, 0),  # East Asian ideograph
    0x216B5B: (0x526E, 0),  # East Asian ideograph
    0x6F4B67: (0xB0C8, 0),  # Korean hangul
    0x4B3D24: (0x53A6, 0),  # East Asian ideograph
    0x6F5163: (0xBD9C, 0),  # Korean hangul
    0x225D60: (0x755B, 0),  # East Asian ideograph
    0x276B5F: (0x672D, 0),  # East Asian ideograph
    0x2D433E: (0x667B, 0),  # East Asian ideograph
    0x235053: (0x98C6, 0),  # East Asian ideograph
    0x345452: (0x7118, 0),  # East Asian ideograph
    0x6F5B40: (0xD1D8, 0),  # Korean hangul
    0x213569: (0x5462, 0),  # East Asian ideograph
    0x4C6B62: (
        0x7B4C,
        0,
    ),  # East Asian ideograph (variant of 226B62 which maps to 7B4C)
    0x394634: (
        0x6B96,
        0,
    ),  # East Asian ideograph (variant of 214634 which maps to 6B96)
    0x274171: (0x629A, 0),  # East Asian ideograph
    0x6F5165: (0xBDF0, 0),  # Korean hangul
    0x28356D: (0x6512, 0),  # East Asian ideograph
    0x274F44: (0x79EF, 0),  # East Asian ideograph
    0x295742: (0x9C95, 0),  # East Asian ideograph
    0x4B3D27: (0x5EC3, 0),  # East Asian ideograph
    0x6F5166: (0xBE0C, 0),  # Korean hangul
    0x6F4D23: (0xB310, 0),  # Korean hangul
    0x213B61: (
        0x5C64,
        0,
    ),  # East Asian ideograph (variant of 4B3B61 which maps to 5C64)
    0x4B5277: (0x8068, 0),  # East Asian ideograph
    0x336162: (0x9A23, 0),  # East Asian ideograph
    0x705F51: (0x54D0, 0),  # East Asian ideograph
    0x6F4A46: (0xAE50, 0),  # Korean hangul
    0x292B6E: (0x86F0, 0),  # East Asian ideograph
    0x2D4A60: (0x6C02, 0),  # East Asian ideograph
    0x222B6F: (0x604C, 0),  # East Asian ideograph
    0x6F5167: (0xBE0D, 0),  # Korean hangul
    0x276052: (0x989B, 0),  # East Asian ideograph
    0x6F4D24: (0xB311, 0),  # Korean hangul
    0x232B72: (0x87AC, 0),  # East Asian ideograph
    0x6F496C: (0xAD49, 0),  # Korean hangul
    0x216B74: (0x5282, 0),  # East Asian ideograph
    0x2D5F2E: (0x661C, 0),  # East Asian ideograph
    0x216B75: (0x5281, 0),  # East Asian ideograph
    0x6F5168: (0xBE10, 0),  # Korean hangul
    0x215966: (0x8C8C, 0),  # East Asian ideograph
    0x6F5621: (0xC641, 0),  # Korean hangul
    0x33515C: (0x7DAB, 0),  # East Asian ideograph
    0x275622: (0x8427, 0),  # East Asian ideograph
    0x215623: (0x859B, 0),  # East Asian ideograph
    0x226B79: (0x7B72, 0),  # East Asian ideograph
    0x215624: (0x8591, 0),  # East Asian ideograph
    0x2D496B: (0x70DF, 0),  # East Asian ideograph
    0x226B7A: (0x7B78, 0),  # East Asian ideograph
    0x6F5169: (0xBE14, 0),  # Korean hangul
    0x275626: (0x8537, 0),  # East Asian ideograph
    0x23487C: (0x9481, 0),  # East Asian ideograph
    0x226B7C: (0x7B67, 0),  # East Asian ideograph
    0x6F5627: (0xC654, 0),  # Korean hangul
    0x2D5635: (0x846F, 0),  # East Asian ideograph
    0x215628: (0x8587, 0),  # East Asian ideograph
    0x29352D: (0x8C30, 0),  # East Asian ideograph
    0x275629: (0x84DD, 0),  # East Asian ideograph
    0x21562A: (0x85A9, 0),  # East Asian ideograph
    0x276055: (0x613F, 0),  # East Asian ideograph
    0x6F4D27: (0xB315, 0),  # Korean hangul
    0x225D67: (0x7563, 0),  # East Asian ideograph
    0x273D2F: (0x5385, 0),  # East Asian ideograph
    0x335D23: (0x8A76, 0),  # East Asian ideograph
    0x6F562D: (0xC678, 0),  # Korean hangul
    0x2E2968: (0x5F51, 0),  # East Asian ideograph
    0x21562E: (0x85C9, 0),  # East Asian ideograph
    0x4B3D2C: (0x53B0, 0),  # East Asian ideograph
    0x21562F: (0x85B0, 0),  # East Asian ideograph
    0x4B527C: (0x8080, 0),  # East Asian ideograph
    0x233F4E: (0x9100, 0),  # East Asian ideograph
    0x4B4E39: (0x5CFA, 0),  # East Asian ideograph
    0x275631: (0x827A, 0),  # East Asian ideograph
    0x215632: (0x85EA, 0),  # East Asian ideograph
    0x695633: (0x5CBE, 0),  # East Asian ideograph
    0x6F516C: (0xBE1F, 0),  # Korean hangul
    0x21596A: (0x8CA0, 0),  # East Asian ideograph
    0x213751: (0x5687, 0),  # East Asian ideograph
    0x275635: (0x836F, 0),  # East Asian ideograph
    0x6F5529: (0xC558, 0),  # Korean hangul
    0x235636: (0x9B43, 0),  # East Asian ideograph
    0x275637: (0x853C, 0),  # East Asian ideograph
    0x6F5C2E: (0xD39C, 0),  # Korean hangul
    0x4C5638: (0x729F, 0),  # East Asian ideograph
    0x275639: (0x853A, 0),  # East Asian ideograph
    0x21563A: (0x8606, 0),  # East Asian ideograph
    0x233F50: (0x9107, 0),  # East Asian ideograph
    0x225927: (0x73EA, 0),  # East Asian ideograph
    0x21563B: (0x860B, 0),  # East Asian ideograph
    0x6F5A22: (0xCEAC, 0),  # Korean hangul
    0x21563C: (0x8607, 0),  # East Asian ideograph
    0x224C5E: (0x6F36, 0),  # East Asian ideograph
    0x21563D: (0x860A, 0),  # East Asian ideograph
    0x4B3D2F: (0x5EF0, 0),  # East Asian ideograph
    0x696576: (0x7E90, 0),  # East Asian ideograph
    0x21563E: (0x862D, 0),  # East Asian ideograph
    0x276059: (0x9885, 0),  # East Asian ideograph
    0x21596C: (0x8CA1, 0),  # East Asian ideograph
    0x2D563F: (0x6A97, 0),  # East Asian ideograph
    0x276023: (0x5DE9, 0),  # East Asian ideograph
    0x275640: (0x85D3, 0),  # East Asian ideograph
    0x346126: (0x6900, 0),  # East Asian ideograph
    0x2D3421: (0x5294, 0),  # East Asian ideograph
    0x235641: (0x9B4B, 0),  # East Asian ideograph
    0x215642: (0x863F, 0),  # East Asian ideograph
    0x4B5F49: (0x51CB, 0),  # East Asian ideograph
    0x2D4971: (0x70A4, 0),  # East Asian ideograph
    0x395643: (0x4E55, 0),  # East Asian ideograph
    0x6F4D2C: (0xB35C, 0),  # Korean hangul
    0x213754: (0x5695, 0),  # East Asian ideograph
    0x275644: (0x4E47, 0),  # East Asian ideograph
    0x70602D: (0x55B9, 0),  # East Asian ideograph
    0x692426: (0x3046, 0),  # Hiragana letter U
    0x2D5A7E: (0x8E7B, 0),  # East Asian ideograph
    0x6F5645: (0xC6CC, 0),  # Korean hangul
    0x6F5646: (0xC6CD, 0),  # Korean hangul
    0x2D572B: (0x8797, 0),  # East Asian ideograph
    0x275647: (0x5904, 0),  # East Asian ideograph
    0x215648: (0x865C, 0),  # East Asian ideograph
    0x27605B: (0x98CE, 0),  # East Asian ideograph
    0x28645A: (0x7817, 0),  # East Asian ideograph
    0x6F4D2D: (0xB35F, 0),  # Korean hangul
    0x225D6D: (0x7579, 0),  # East Asian ideograph
    0x21564A: (0x865F, 0),  # East Asian ideograph
    0x2D563C: (0x8613, 0),  # East Asian ideograph
    0x45564B: (
        0x865E,
        0,
    ),  # East Asian ideograph (variant of 21564B which maps to 865E)
    0x21564C: (0x8667, 0),  # East Asian ideograph
    0x6F5171: (0xBE4C, 0),  # Korean hangul
    0x27605C: (0x98D2, 0),  # East Asian ideograph
    0x69564E: (0x5D76, 0),  # East Asian ideograph
    0x29302D: (0x88E3, 0),  # East Asian ideograph
    0x22564F: (0x72B4, 0),  # East Asian ideograph
    0x6F496E: (0xAD6C, 0),  # Korean hangul
    0x277169: (0x5522, 0),  # East Asian ideograph
    0x6F5650: (0xC6EC, 0),  # Korean hangul
    0x6F5C2F: (0xD3A0, 0),  # Korean hangul
    0x235061: (0x98E4, 0),  # East Asian ideograph
    0x4B5F4C: (0x9D8F, 0),  # East Asian ideograph
    0x225652: (0x72B5, 0),  # East Asian ideograph
    0x27605D: (0x53F0, 0),  # East Asian ideograph (duplicate simplified)
    0x6F4D2F: (0xB365, 0),  # Korean hangul
    0x6F5653: (0xC704, 0),  # Korean hangul
    0x294642: (0x94E0, 0),  # East Asian ideograph
    0x692429: (0x3049, 0),  # Hiragana letter small O
    0x333F55: (0x5B3E, 0),  # East Asian ideograph
    0x6F5654: (0xC705, 0),  # Korean hangul
    0x6F5655: (0xC708, 0),  # Korean hangul
    0x225656: (0x72BC, 0),  # East Asian ideograph
    0x695657: (0x5D90, 0),  # East Asian ideograph
    0x27605E: (0x522E, 0),  # East Asian ideograph
    0x6F4D30: (0xB367, 0),  # Korean hangul
    0x225658: (0x72C3, 0),  # East Asian ideograph
    0x217747: (0x5853, 0),  # East Asian ideograph
    0x6F5659: (0xC719, 0),  # Korean hangul
    0x21565A: (0x86CB, 0),  # East Asian ideograph
    0x293537: (0x8C20, 0),  # East Asian ideograph
    0x235063: (0x98E5, 0),  # East Asian ideograph
    0x6F5174: (0xBE55, 0),  # Korean hangul
    0x27605F: (0x98D3, 0),  # East Asian ideograph
    0x6F4D31: (0xB368, 0),  # Korean hangul
    0x23565D: (0x9B74, 0),  # East Asian ideograph
    0x6F4B23: (0xAFB9, 0),  # Korean hangul
    0x4B306C: (0x96E0, 0),  # East Asian ideograph
    0x6F565E: (0xC730, 0),  # Korean hangul
    0x6F5638: (0xC6A7, 0),  # Korean hangul
    0x6F565F: (0xC735, 0),  # Korean hangul
    0x4C6074: (0x76B9, 0),  # East Asian ideograph
    0x224C65: (0x6F2D, 0),  # East Asian ideograph
    0x215660: (0x86DF, 0),  # East Asian ideograph
    0x4B5052: (0x7C56, 0),  # East Asian ideograph
    0x6F5175: (0xBE57, 0),  # Korean hangul
    0x6F4D32: (0xB369, 0),  # Korean hangul
    0x213B64: (0x5C6F, 0),  # East Asian ideograph
    0x6F5662: (0xC73D, 0),  # Korean hangul
    0x396223: (0x9BFD, 0),  # East Asian ideograph (variant of 216223)
    0x333F58: (0x61F4, 0),  # East Asian ideograph
    0x235663: (0x9B68, 0),  # East Asian ideograph
    0x2D3428: (0x5226, 0),  # East Asian ideograph
    0x2E5A40: (0x73B3, 0),  # East Asian ideograph
    0x215664: (0x86DB, 0),  # East Asian ideograph
    0x6F583B: (0xC9E2, 0),  # Korean hangul
    0x293539: (0x8C33, 0),  # East Asian ideograph
    0x215665: (0x86E4, 0),  # East Asian ideograph
    0x4B5F50: (0x96E3, 0),  # East Asian ideograph
    0x4B3B37: (0x51A9, 0),  # East Asian ideograph
    0x6F5176: (0xBE59, 0),  # Korean hangul
    0x2F2F5D: (0x7E48, 0),  # East Asian ideograph
    0x276061: (0x98D5, 0),  # East Asian ideograph
    0x286460: (0x7856, 0),  # East Asian ideograph
    0x21375B: (0x56B6, 0),  # East Asian ideograph
    0x215667: (0x86F9, 0),  # East Asian ideograph
    0x225930: (0x73DB, 0),  # East Asian ideograph
    0x6F5668: (0xC751, 0),  # Korean hangul
    0x22403D: (0x6A12, 0),  # East Asian ideograph
    0x6F5669: (0xC758, 0),  # Korean hangul
    0x224C67: (0x6F34, 0),  # East Asian ideograph
    0x4B566A: (
        0x8708,
        0,
    ),  # East Asian ideograph (variant of 21566A which maps to 8708)
    0x21566B: (0x8700, 0),  # East Asian ideograph
    0x276062: (0x98D8, 0),  # East Asian ideograph
    0x285E7A: (0x75D6, 0),  # East Asian ideograph
    0x6F4D34: (0xB36B, 0),  # Korean hangul
    0x22566C: (0x72CC, 0),  # East Asian ideograph
    0x294647: (0x954F, 0),  # East Asian ideograph
    0x6F566D: (0xC77C, 0),  # Korean hangul
    0x334730: (0x6E5F, 0),  # East Asian ideograph
    0x6F5041: (0xBABB, 0),  # Korean hangul
    0x22566E: (0x72DB, 0),  # East Asian ideograph
    0x22566F: (0x72CD, 0),  # East Asian ideograph
    0x21356D: (0x5496, 0),  # East Asian ideograph
    0x276063: (0x98DE, 0),  # East Asian ideograph
    0x6F4D35: (0xB36E, 0),  # Korean hangul
    0x21375D: (0x56C1, 0),  # East Asian ideograph
    0x225D75: (0x7571, 0),  # East Asian ideograph
    0x333F5B: (0x6133, 0),  # East Asian ideograph
    0x235672: (0x9B80, 0),  # East Asian ideograph
    0x235673: (0x9B8C, 0),  # East Asian ideograph
    0x2F5E42: (0x9EC9, 0),  # East Asian ideograph
    0x6F5674: (0xC789, 0),  # Korean hangul
    0x6F543C: (0xC318, 0),  # Korean hangul
    0x2D5675: (0x9F05, 0),  # East Asian ideograph
    0x6F4D36: (0xB370, 0),  # Korean hangul
    0x21375E: (0x56C2, 0),  # East Asian ideograph
    0x275676: (0x8680, 0),  # East Asian ideograph
    0x692430: (0x3050, 0),  # Hiragana letter GU
    0x4D386F: (0x544B, 0),  # East Asian ideograph
    0x2D4122: (0x6485, 0),  # East Asian ideograph
    0x224123: (0x69F0, 0),  # East Asian ideograph
    0x295756: (0x9CA9, 0),  # East Asian ideograph
    0x215679: (0x8774, 0),  # East Asian ideograph
    0x224124: (0x69F2, 0),  # East Asian ideograph
    0x21567A: (0x8766, 0),  # East Asian ideograph
    0x234125: (0x9193, 0),  # East Asian ideograph
    0x6F4D37: (0xB371, 0),  # Korean hangul
    0x23567B: (0x9B7D, 0),  # East Asian ideograph
    0x21774E: (0x5856, 0),  # East Asian ideograph
    0x4B3072: (0x4EED, 0),  # East Asian ideograph
    0x6F4A4A: (0xAE60, 0),  # Korean hangul
    0x33567C: (0x8671, 0),  # East Asian ideograph
    0x6F567D: (0xC798, 0),  # Korean hangul
    0x224128: (0x6A14, 0),  # East Asian ideograph
    0x21567E: (0x8757, 0),  # East Asian ideograph
    0x224129: (0x6A63, 0),  # East Asian ideograph
    0x295030: (0x989E, 0),  # East Asian ideograph
    0x6F517B: (0xBE60, 0),  # Korean hangul
    0x4B412A: (0x6323, 0),  # East Asian ideograph
    0x6F4D38: (0xB374, 0),  # Korean hangul
    0x225742: (0x731E, 0),  # East Asian ideograph
    0x23412B: (0x919D, 0),  # East Asian ideograph
    0x212B33: (0x3002, 0),  # Ideographic full stop
    0x23412C: (0x919A, 0),  # East Asian ideograph
    0x2D342E: (0x8274, 0),  # East Asian ideograph
    0x6F5538: (0xC580, 0),  # Korean hangul
    0x276067: (0x9968, 0),  # East Asian ideograph
    0x6F4D39: (0xB378, 0),  # Korean hangul
    0x234130: (0x91A2, 0),  # East Asian ideograph
    0x3F476F: (0x51C8, 0),  # East Asian ideograph
    0x334131: (0x6425, 0),  # East Asian ideograph
    0x6F5042: (0xBABD, 0),  # Korean hangul
    0x2D4132: (0x642F, 0),  # East Asian ideograph
    0x287130: (0x7EDB, 0),  # East Asian ideograph
    0x234C29: (0x9708, 0),  # East Asian ideograph
    0x6F517D: (0xBE64, 0),  # Korean hangul
    0x234134: (
        0x919B,
        0,
    ),  # East Asian ideograph (variant of 4D4134 which maps to 919B)
    0x6F4D3A: (0xB380, 0),  # Korean hangul
    0x213762: (0x56C8, 0),  # East Asian ideograph
    0x336179: (0x9C7B, 0),  # East Asian ideograph
    0x4C3474: (0x631D, 0),  # East Asian ideograph
    0x235D36: (0x9E15, 0),  # East Asian ideograph
    0x274136: (0x62A1, 0),  # East Asian ideograph
    0x274F5C: (0x6D3C, 0),  # East Asian ideograph
    0x6F4F68: (0xB9CC, 0),  # Korean hangul
    0x224137: (0x6A67, 0),  # East Asian ideograph
    0x344138: (0x8022, 0),  # East Asian ideograph
    0x6F517E: (0xBE68, 0),  # Korean hangul
    0x224139: (0x6A43, 0),  # East Asian ideograph
    0x6F4D3B: (0xB383, 0),  # Korean hangul
    0x22413A: (0x6A33, 0),  # East Asian ideograph
    0x225938: (0x73E3, 0),  # East Asian ideograph
    0x22413B: (0x6A32, 0),  # East Asian ideograph
    0x274F5D: (0x7A9D, 0),  # East Asian ideograph
    0x27413C: (0x62E3, 0),  # East Asian ideograph
    0x706247: (0x9987, 0),  # East Asian ideograph
    0x23413D: (0x91AA, 0),  # East Asian ideograph
    0x27606A: (0x996E, 0),  # East Asian ideograph
    0x6F4D3C: (0xB385, 0),  # Korean hangul
    0x213B66: (0x5C79, 0),  # East Asian ideograph
    0x213764: (0x56D1, 0),  # East Asian ideograph
    0x22413F: (0x6A28, 0),  # East Asian ideograph
    0x213321: (0x5167, 0),  # East Asian ideograph
    0x4C3F68: (0x69C7, 0),  # East Asian ideograph
    0x224140: (0x6A48, 0),  # East Asian ideograph
    0x224141: (0x6A50, 0),  # East Asian ideograph
    0x224142: (0x6A52, 0),  # East Asian ideograph
    0x334C2C: (0x754D, 0),  # East Asian ideograph
    0x336058: (0x9855, 0),  # East Asian ideograph
    0x224143: (0x6A72, 0),  # East Asian ideograph
    0x6F4D3D: (0xB38C, 0),  # Korean hangul
    0x274570: (0x6743, 0),  # East Asian ideograph
    0x285836: (0x7315, 0),  # East Asian ideograph
    0x224145: (0x6A3E, 0),  # East Asian ideograph
    0x224146: (0x6A77, 0),  # East Asian ideograph
    0x287134: (0x7ED7, 0),  # East Asian ideograph
    0x224147: (0x6A5B, 0),  # East Asian ideograph
    0x214148: (0x63EA, 0),  # East Asian ideograph
    0x6F4D3E: (0xB3C4, 0),  # Korean hangul
    0x225D7E: (0x757F, 0),  # East Asian ideograph
    0x217755: (0x589A, 0),  # East Asian ideograph
    0x2D3877: (0x5900, 0),  # East Asian ideograph
    0x22414A: (0x6A5E, 0),  # East Asian ideograph
    0x21414B: (0x643E, 0),  # East Asian ideograph
    0x21414C: (0x6413, 0),  # East Asian ideograph
    0x23414D: (0x91B5, 0),  # East Asian ideograph
    0x3F4A60: (0x7266, 0),  # East Asian ideograph
    0x6F4D3F: (0xB3C5, 0),  # Korean hangul
    0x6F4C78: (0xB2F7, 0),  # Korean hangul
    0x335D3B: (0x57DC, 0),  # East Asian ideograph
    0x22414F: (0x6A51, 0),  # East Asian ideograph
    0x2D4150: (0x6428, 0),  # East Asian ideograph
    0x29575F: (0x9CA0, 0),  # East Asian ideograph
    0x224151: (0x6A56, 0),  # East Asian ideograph
    0x2D4152: (0x6447, 0),  # East Asian ideograph
    0x6F4D40: (0xB3C8, 0),  # Korean hangul
    0x224153: (0x6A36, 0),  # East Asian ideograph
    0x2D4154: (0x635C, 0),  # East Asian ideograph
    0x2D3436: (0x52F3, 0),  # East Asian ideograph
    0x274155: (0x62A2, 0),  # East Asian ideograph
    0x217C30: (0x5A93, 0),  # East Asian ideograph
    0x224156: (0x6A7A, 0),  # East Asian ideograph
    0x234157: (0x91BD, 0),  # East Asian ideograph
    0x6F4D41: (0xB3CB, 0),  # Korean hangul
    0x213769: (0x56E4, 0),  # East Asian ideograph
    0x224158: (0x6A3F, 0),  # East Asian ideograph
    0x4B4F7B: (0x7B7A, 0),  # East Asian ideograph
    0x21623B: (
        0x9D12,
        0,
    ),  # East Asian ideograph (variant of 4B623B which maps to 9D12)
    0x4B523E: (
        0x7F9A,
        0,
    ),  # East Asian ideograph (variant of 21523E which maps to 7F9A)
    0x23415A: (0x91C2, 0),  # East Asian ideograph
    0x293651: (0x8D36, 0),  # East Asian ideograph
    0x23415B: (0x91C4, 0),  # East Asian ideograph
    0x33347D: (0x53C1, 0),  # East Asian ideograph
    0x23415C: (0x91C3, 0),  # East Asian ideograph
    0x275A30: (0x8D24, 0),  # East Asian ideograph
    0x29415D: (0x917D, 0),  # East Asian ideograph
    0x29586A: (0x9CCB, 0),  # East Asian ideograph
    0x274F64: (0x7A83, 0),  # East Asian ideograph
    0x27415F: (0x6402, 0),  # East Asian ideograph
    0x70624E: (0x9995, 0),  # East Asian ideograph
    0x224C76: (0x6EFA, 0),  # East Asian ideograph
    0x224833: (0x6CB4, 0),  # East Asian ideograph
    0x4B5164: (0x770C, 0),  # East Asian ideograph
    0x4C4146: (0x8538, 0),  # East Asian ideograph
    0x234161: (0x91D4, 0),  # East Asian ideograph
    0x284257: (0x68BC, 0),  # East Asian ideograph
    0x294656: (0x955B, 0),  # East Asian ideograph
    0x234162: (0x91D3, 0),  # East Asian ideograph
    0x234163: (0x91D5, 0),  # East Asian ideograph
    0x217639: (0x580E, 0),  # East Asian ideograph
    0x234164: (0x91D9, 0),  # East Asian ideograph
    0x274B22: (0x72EF, 0),  # East Asian ideograph
    0x6F5B59: (0xD2B8, 0),  # Korean hangul
    0x274165: (0x635E, 0),  # East Asian ideograph
    0x286272: (0x770D, 0),  # East Asian ideograph
    0x274166: (0x62E8, 0),  # East Asian ideograph
    0x6F4D44: (0xB3D4, 0),  # Korean hangul
    0x234168: (0x91E2, 0),  # East Asian ideograph
    0x6F534A: (0xC1A9, 0),  # Korean hangul
    0x234169: (0x91ED, 0),  # East Asian ideograph
    0x23416A: (0x91F7, 0),  # East Asian ideograph
    0x333D2F: (0x5E81, 0),  # East Asian ideograph
    0x23416B: (0x91FA, 0),  # East Asian ideograph
    0x6F4D45: (0xB3D5, 0),  # Korean hangul
    0x21775C: (0x5889, 0),  # East Asian ideograph
    0x22416C: (0x69F9, 0),  # East Asian ideograph
    0x215543: (0x83CC, 0),  # East Asian ideograph
    0x4B4E56: (0x78FA, 0),  # East Asian ideograph
    0x22416D: (0x6A64, 0),  # East Asian ideograph
    0x295427: (0x9A85, 0),  # East Asian ideograph
    0x27416E: (0x6251, 0),  # East Asian ideograph
    0x217C31: (0x5AAC, 0),  # East Asian ideograph
    0x23416F: (0x91F2, 0),  # East Asian ideograph
    0x234171: (0x91E8, 0),  # East Asian ideograph
    0x294458: (0x952C, 0),  # East Asian ideograph
    0x4B434D: (0x663F, 0),  # East Asian ideograph
    0x234172: (0x91F6, 0),  # East Asian ideograph
    0x2D343C: (0x52A2, 0),  # East Asian ideograph
    0x334C3E: (0x8E08, 0),  # East Asian ideograph
    0x234173: (0x91EE, 0),  # East Asian ideograph
    0x274174: (0x62E5, 0),  # East Asian ideograph
    0x4B3D4B: (0x5F3E, 0),  # East Asian ideograph
    0x334C36: (
        0x753B,
        0,
    ),  # East Asian ideograph (variant of 274C36 which maps to 753B)
    0x4B4C67: (
        0x761F,
        0,
    ),  # East Asian ideograph (variant of 214C67 which maps to 761F)
    0x224175: (0x6AA8, 0),  # East Asian ideograph
    0x29465A: (0x955F, 0),  # East Asian ideograph
    0x274176: (0x51FB, 0),  # East Asian ideograph
    0x692441: (0x3061, 0),  # Hiragana letter TI
    0x21332C: (0x5178, 0),  # East Asian ideograph
    0x235D43: (0x9E7B, 0),  # East Asian ideograph
    0x224177: (0x6AA5, 0),  # East Asian ideograph
    0x2D343D: (0x52E7, 0),  # East Asian ideograph
    0x224179: (0x6A96, 0),  # East Asian ideograph
    0x4B3D4C: (0x5F25, 0),  # East Asian ideograph (variant of 273D4C)
    0x222C24: (0x608A, 0),  # East Asian ideograph
    0x27417A: (0x6321, 0),  # East Asian ideograph
    0x6F4D48: (0xB3DB, 0),  # Korean hangul
    0x707360: (0x7B7B, 0),  # East Asian ideograph
    0x286032: (0x75AC, 0),  # East Asian ideograph
    0x21332D: (0x517C, 0),  # East Asian ideograph
    0x27417C: (0x636E, 0),  # East Asian ideograph
    0x216C27: (0x5296, 0),  # East Asian ideograph
    0x27417D: (0x63B3, 0),  # East Asian ideograph
    0x284F26: (0x6CF7, 0),  # East Asian ideograph
    0x224A44: (0x6E12, 0),  # East Asian ideograph
    0x22417E: (0x6A7D, 0),  # East Asian ideograph
    0x6F5D6A: (0xD750, 0),  # Korean hangul
    0x226C29: (0x7B73, 0),  # East Asian ideograph
    0x2E2B74: (0x609B, 0),  # East Asian ideograph
    0x276077: (0x997F, 0),  # East Asian ideograph
    0x6F4D49: (0xB3FC, 0),  # Korean hangul
    0x217760: (0x589B, 0),  # East Asian ideograph
    0x223378: (0x647D, 0),  # East Asian ideograph
    0x232C2C: (0x87EE, 0),  # East Asian ideograph
    0x274B28: (0x72DE, 0),  # East Asian ideograph
    0x222C2F: (0x609E, 0),  # East Asian ideograph
    0x6F4B28: (0xAFC9, 0),  # Korean hangul
    0x217761: (0x587C, 0),  # East Asian ideograph
    0x222C30: (0x6083, 0),  # East Asian ideograph
    0x4B4E5B: (0x783F, 0),  # East Asian ideograph
    0x22483B: (0x6D28, 0),  # East Asian ideograph
    0x216C33: (0x52AE, 0),  # East Asian ideograph
    0x4C4345: (0x67A6, 0),  # East Asian ideograph
    0x222C34: (0x60A7, 0),  # East Asian ideograph
    0x6F4D4B: (0xB410, 0),  # Korean hangul
    0x213773: (0x5718, 0),  # East Asian ideograph
    0x233B2E: (0x8EC9, 0),  # East Asian ideograph
    0x216C38: (0x52BC, 0),  # East Asian ideograph
    0x2D454E: (0x697D, 0),  # East Asian ideograph
    0x217763: (0x5888, 0),  # East Asian ideograph
    0x692446: (0x3066, 0),  # Hiragana letter TE
    0x232C3A: (0x87D6, 0),  # East Asian ideograph
    0x235D48: (0x9E83, 0),  # East Asian ideograph
    0x39302D: (0x534B, 0),  # East Asian ideograph
    0x6F4D4D: (0xB41C, 0),  # Korean hangul
    0x213775: (0x571F, 0),  # East Asian ideograph
    0x286037: (0x763F, 0),  # East Asian ideograph
    0x692447: (0x3067, 0),  # Hiragana letter DE
    0x223731: (0x65C6, 0),  # East Asian ideograph
    0x294478: (0x9522, 0),  # East Asian ideograph
    0x274B2C: (0x730E, 0),  # East Asian ideograph
    0x287144: (0x7EE0, 0),  # East Asian ideograph
    0x234C3D: (0x971D, 0),  # East Asian ideograph
    0x706C43: (0x70C0, 0),  # East Asian ideograph
    0x213333: (0x5191, 0),  # East Asian ideograph
    0x333066: (0x5FC8, 0),  # East Asian ideograph
    0x69613A: (0x7549, 0),  # East Asian ideograph
    0x6F4F6C: (0xB9D1, 0),  # Korean hangul
    0x216C46: (0x52D4, 0),  # East Asian ideograph
    0x234C3E: (0x9719, 0),  # East Asian ideograph
    0x453666: (0x5AD0, 0),  # East Asian ideograph
    0x232C48: (0x87D3, 0),  # East Asian ideograph
    0x6F4D4F: (0xB428, 0),  # Korean hangul
    0x6F4B29: (0xAFCB, 0),  # Korean hangul
    0x294662: (0x956A, 0),  # East Asian ideograph
    0x692449: (0x3069, 0),  # Hiragana letter DO
    0x275F50: (0x96BE, 0),  # East Asian ideograph
    0x235D4B: (0x9E88, 0),  # East Asian ideograph
    0x274B2E: (0x732E, 0),  # East Asian ideograph
    0x235A6B: (0x9D3D, 0),  # East Asian ideograph
    0x292C4C: (0x866E, 0),  # East Asian ideograph
    0x4B346B: (0x5DF5, 0),  # East Asian ideograph
    0x69595E: (0x63B5, 0),  # East Asian ideograph
    0x472C4D: (
        0x8801,
        0,
    ),  # East Asian ideograph (variant of 232C4D which maps to 8801)
    0x28603A: (0x75C8, 0),  # East Asian ideograph
    0x454774: (0x6E15, 0),  # East Asian ideograph
    0x6F5564: (0xC5F7, 0),  # Korean hangul
    0x694664: (0x51EA, 0),  # East Asian ideograph
    0x294221: (0x9495, 0),  # East Asian ideograph
    0x6F4975: (0xAD7C, 0),  # Korean hangul
    0x292C55: (0x86CF, 0),  # East Asian ideograph
    0x6F5762: (0xC8C8, 0),  # Korean hangul
    0x4B5F6F: (0x970A, 0),  # East Asian ideograph
    0x2D4F37: (0x7980, 0),  # East Asian ideograph
    0x216C58: (0x52F0, 0),  # East Asian ideograph
    0x294222: (0x9490, 0),  # East Asian ideograph
    0x6F5A48: (0xCF78, 0),  # Korean hangul
    0x216C5A: (0x52F1, 0),  # East Asian ideograph
    0x2D632B: (0x5C28, 0),  # East Asian ideograph
    0x4B4135: (0x6368, 0),  # East Asian ideograph
    0x275C3E: (0x8FC7, 0),  # East Asian ideograph
    0x223B7A: (0x67F6, 0),  # East Asian ideograph
    0x69244D: (0x306D, 0),  # Hiragana letter NE
    0x222C5D: (0x60C4, 0),  # East Asian ideograph
    0x3A284C: (0x53A9, 0),  # East Asian ideograph (variant of 4C284C)
    0x294223: (0x94AD, 0),  # East Asian ideograph
    0x235D4F: (0x9E87, 0),  # East Asian ideograph
    0x3F5E60: (0x9586, 0),  # East Asian ideograph
    0x395773: (0x7DAF, 0),  # East Asian ideograph
    0x4B5F71: (0x9756, 0),  # East Asian ideograph
    0x224844: (0x6D39, 0),  # East Asian ideograph
    0x292C61: (0x86F4, 0),  # East Asian ideograph
    0x6F4D54: (0xB451, 0),  # Korean hangul
    0x6F4B2A: (0xAFCD, 0),  # Korean hangul
    0x69544B: (0x5870, 0),  # East Asian ideograph
    0x213339: (0x51A5, 0),  # East Asian ideograph
    0x294224: (0x94AA, 0),  # East Asian ideograph
    0x6F563F: (0xC6B9, 0),  # Korean hangul
    0x292C64: (0x877E, 0),  # East Asian ideograph
    0x4B5F72: (0x975B, 0),  # East Asian ideograph
    0x4B5365: (0x8133, 0),  # East Asian ideograph
    0x222C66: (0x60E2, 0),  # East Asian ideograph
    0x6F4A50: (0xAE6C, 0),  # Korean hangul
    0x294225: (0x94AB, 0),  # East Asian ideograph
    0x2D5664: (0x9F04, 0),  # East Asian ideograph
    0x6F542A: (0xC2ED, 0),  # Korean hangul
    0x4B5F73: (
        0x975C,
        0,
    ),  # East Asian ideograph (variant of 215F73 which maps to 975C)
    0x335228: (0x94B5, 0),  # East Asian ideograph
    0x336C6B: (0x6031, 0),  # East Asian ideograph
    0x6F4D56: (0xB458, 0),  # Korean hangul
    0x692450: (0x3070, 0),  # Hiragana letter BA
    0x4B4E67: (0x79D8, 0),  # East Asian ideograph
    0x6F5C37: (0xD3BC, 0),  # Korean hangul
    0x28714D: (0x7EE1, 0),  # East Asian ideograph
    0x216C6F: (0x530B, 0),  # East Asian ideograph
    0x6F4D57: (0xB460, 0),  # Korean hangul
    0x222C73: (0x6103, 0),  # East Asian ideograph
    0x6F5A21: (0xCEA5, 0),  # Korean hangul
    0x4B3D5C: (0x5F83, 0),  # East Asian ideograph
    0x6F4D58: (0xB461, 0),  # Korean hangul
    0x6F5425: (0xC2E0, 0),  # Korean hangul
    0x692452: (0x3072, 0),  # Hiragana letter HI
    0x21333D: (0x51B6, 0),  # East Asian ideograph
    0x215721: (0x8759, 0),  # East Asian ideograph
    0x6F4F6E: (0xB9D9, 0),  # Korean hangul
    0x6F5723: (0xC7A4, 0),  # Korean hangul
    0x225724: (0x72F4, 0),  # East Asian ideograph
    0x6F5D74: (0xD769, 0),  # Korean hangul
    0x6F4D59: (0xB463, 0),  # Korean hangul
    0x215725: (0x879E, 0),  # East Asian ideograph
    0x695438: (0x57B3, 0),  # East Asian ideograph
    0x692453: (0x3073, 0),  # Hiragana letter BI
    0x6F5726: (0xC7A7, 0),  # Korean hangul
    0x6F5727: (0xC7AC, 0),  # Korean hangul
    0x2F5E66: (0x9B12, 0),  # East Asian ideograph
    0x4B4B71: (
        0x7F3E,
        0,
    ),  # East Asian ideograph (variant of 2D4B71 which maps to 7F3E)
    0x6F5728: (0xC7AD, 0),  # Korean hangul
    0x225729: (0x7302, 0),  # East Asian ideograph
    0x697323: (0x9D64, 0),  # East Asian ideograph
    0x6F4D5A: (0xB465, 0),  # Korean hangul
    0x6F572A: (0xC7B4, 0),  # Korean hangul
    0x2E4873: (0x6FA3, 0),  # East Asian ideograph
    0x21572B: (0x87B3, 0),  # East Asian ideograph
    0x333330: (0x518A, 0),  # East Asian ideograph
    0x21572C: (0x87BB, 0),  # East Asian ideograph
    0x29577A: (0x9CAD, 0),  # East Asian ideograph
    0x21572D: (0x87C8, 0),  # East Asian ideograph
    0x39563C: (0x56CC, 0),  # East Asian ideograph
    0x222632: (0x5DB8, 0),  # East Asian ideograph
    0x21572E: (0x87D2, 0),  # East Asian ideograph
    0x4B5D58: (0x9234, 0),  # East Asian ideograph
    0x6F4D5B: (0xB46C, 0),  # Korean hangul
    0x21572F: (0x87BA, 0),  # East Asian ideograph
    0x2D5730: (0x87C7, 0),  # East Asian ideograph
    0x235731: (0x9B92, 0),  # East Asian ideograph
    0x6F5C38: (0xD3C4, 0),  # Korean hangul
    0x275732: (0x86F2, 0),  # East Asian ideograph
    0x6F4E75: (0xB7AC, 0),  # Korean hangul
    0x275733: (0x866B, 0),  # East Asian ideograph
    0x6F4D5C: (0xB480, 0),  # Korean hangul
    0x275734: (0x8749, 0),  # East Asian ideograph
    0x215735: (0x87FB, 0),  # East Asian ideograph
    0x215736: (0x8805, 0),  # East Asian ideograph
    0x2D5228: (0x9262, 0),  # East Asian ideograph
    0x29577C: (0x9CB0, 0),  # East Asian ideograph
    0x695737: (0x5F16, 0),  # East Asian ideograph
    0x222634: (0x5DBF, 0),  # East Asian ideograph
    0x213D21: (0x5EBE, 0),  # East Asian ideograph
    0x6F4D5D: (0xB488, 0),  # Korean hangul
    0x235739: (0x9B9D, 0),  # East Asian ideograph
    0x6F573A: (0xC811, 0),  # Korean hangul
    0x2D3453: (0x758B, 0),  # East Asian ideograph
    0x21573B: (0x8822, 0),  # East Asian ideograph
    0x213132: (0x4F5B, 0),  # East Asian ideograph
    0x21573C: (0x8823, 0),  # East Asian ideograph
    0x21573D: (0x8821, 0),  # East Asian ideograph
    0x23417A: (0x91F8, 0),  # East Asian ideograph
    0x6F4D5E: (0xB4A4, 0),  # Korean hangul
    0x21573E: (0x881F, 0),  # East Asian ideograph
    0x275E69: (0x5173, 0),  # East Asian ideograph
    0x6F5B7A: (0xD330, 0),  # Korean hangul
    0x692458: (0x3078, 0),  # Hiragana letter HE
    0x21573F: (0x8831, 0),  # East Asian ideograph
    0x235D5A: (0x9E95, 0),  # East Asian ideograph
    0x4B5740: (0x8827, 0),  # East Asian ideograph
    0x2D572D: (0x8748, 0),  # East Asian ideograph
    0x215741: (0x8836, 0),  # East Asian ideograph
    0x69533B: (0x555D, 0),  # East Asian ideograph
    0x275742: (0x86EE, 0),  # East Asian ideograph
    0x27614F: (0x9A74, 0),  # East Asian ideograph
    0x6F4D5F: (0xB4B7, 0),  # Korean hangul
    0x215743: (0x8840, 0),  # East Asian ideograph
    0x4C5C3A: (0x73F1, 0),  # East Asian ideograph
    0x6F5744: (0xC82D, 0),  # Korean hangul
    0x694823: (0x7872, 0),  # East Asian ideograph
    0x6F5745: (0xC82F, 0),  # Korean hangul
    0x2D522B: (0x9475, 0),  # East Asian ideograph
    0x215746: (
        0x8853,
        0,
    ),  # East Asian ideograph (variant of 4B5746 which maps to 8853)
    0x275747: (0x4E8D, 0),  # East Asian ideograph
    0x2D4562: (0x681D, 0),  # East Asian ideograph
    0x275A36: (0x8D56, 0),  # East Asian ideograph
    0x6F4D60: (0xB4C0, 0),  # Korean hangul
    0x69245A: (0x307A, 0),  # Hiragana letter PE
    0x213345: (0x51DD, 0),  # East Asian ideograph
    0x215749: (0x885B, 0),  # East Asian ideograph
    0x235D5C: (0x9E91, 0),  # East Asian ideograph
    0x2D3164: (0x7AE2, 0),  # East Asian ideograph
    0x4B4A2E: (0x55B6, 0),  # East Asian ideograph
    0x21574A: (0x885D, 0),  # East Asian ideograph
    0x474236: (0x949A, 0),  # East Asian ideograph
    0x2D4425: (0x686E, 0),  # East Asian ideograph
    0x29533D: (0x9A90, 0),  # East Asian ideograph
    0x21574C: (0x8862, 0),  # East Asian ideograph
    0x3B3922: (0x8DB5, 0),  # East Asian ideograph
    0x21574D: (0x8863, 0),  # East Asian ideograph
    0x23574E: (0x9BA0, 0),  # East Asian ideograph
    0x2D3457: (0x62FE, 0),  # East Asian ideograph
    0x21574F: (0x8868, 0),  # East Asian ideograph
    0x6F5750: (0xC885, 0),  # Korean hangul
    0x213D22: (0x5ECA, 0),  # East Asian ideograph
    0x2D4564: (0x68B9, 0),  # East Asian ideograph
    0x215752: (0x8881, 0),  # East Asian ideograph
    0x27602E: (0x97E9, 0),  # East Asian ideograph
    0x6F5753: (0xC88B, 0),  # Korean hangul
    0x69613E: (0x7569, 0),  # East Asian ideograph
    0x6F5754: (0xC88C, 0),  # Korean hangul
    0x215755: (0x8888, 0),  # East Asian ideograph
    0x4B3D67: (0x5F84, 0),  # East Asian ideograph (variant of 273D67)
    0x215756: (0x88AB, 0),  # East Asian ideograph
    0x6F4D63: (0xB4DD, 0),  # Korean hangul
    0x29367E: (0x8D59, 0),  # East Asian ideograph
    0x217337: (0x568A, 0),  # East Asian ideograph
    0x215759: (0x888D, 0),  # East Asian ideograph
    0x6F5967: (0xCE60, 0),  # Korean hangul
    0x21575A: (0x888B, 0),  # East Asian ideograph
    0x21575B: (0x889E, 0),  # East Asian ideograph
    0x4D3C6C: (0x8FB6, 0),  # East Asian ideograph
    0x21575C: (0x88C1, 0),  # East Asian ideograph
    0x273A36: (0x5988, 0),  # East Asian ideograph
    0x6F4921: (0xAC70, 0),  # Korean hangul
    0x23575D: (0x9BC6, 0),  # East Asian ideograph
    0x23575E: (0x9BBF, 0),  # East Asian ideograph
    0x22575F: (0x733B, 0),  # East Asian ideograph
    0x2D5760: (0x5E2C, 0),  # East Asian ideograph
    0x6F4D65: (0xB4E3, 0),  # Korean hangul
    0x4C7265: (0x7DFC, 0),  # East Asian ideograph
    0x69245F: (0x307F, 0),  # Hiragana letter MI
    0x6F4922: (0xAC71, 0),  # Korean hangul
    0x225762: (0x733A, 0),  # East Asian ideograph
    0x6F5125: (0xBC45, 0),  # Korean hangul
    0x2E4670: (0x6CD0, 0),  # East Asian ideograph
    0x284539: (0x6B9A, 0),  # East Asian ideograph
    0x2D345B: (0x6607, 0),  # East Asian ideograph
    0x275763: (0x91CC, 0),  # East Asian ideograph
    0x393054: (0x4F0D, 0),  # East Asian ideograph
    0x226260: (0x777A, 0),  # East Asian ideograph
    0x6F5764: (0xC8D4, 0),  # Korean hangul
    0x232739: (0x85DA, 0),  # East Asian ideograph
    0x215765: (0x88DD, 0),  # East Asian ideograph
    0x395564: (0x6726, 0),  # East Asian ideograph
    0x235766: (0x9BB9, 0),  # East Asian ideograph
    0x6F4E2E: (0xB560, 0),  # Korean hangul
    0x6F5767: (0xC8E0, 0),  # Korean hangul
    0x6F504B: (0xBB3B, 0),  # Korean hangul
    0x6F2469: (0x3138, 0),  # Korean hangul
    0x215768: (0x88F3, 0),  # East Asian ideograph
    0x2D5232: (0x8FA0, 0),  # East Asian ideograph
    0x6F5769: (0xC8F0, 0),  # Korean hangul
    0x6F5B60: (0xD2CB, 0),  # Korean hangul
    0x69576A: (0x603A, 0),  # East Asian ideograph
    0x22576B: (0x7352, 0),  # East Asian ideograph
    0x21334C: (0x51F9, 0),  # East Asian ideograph
    0x27576C: (0x5236, 0),  # East Asian ideograph
    0x225521: (0x721D, 0),  # East Asian ideograph
    0x2D345D: (0x5349, 0),  # East Asian ideograph
    0x6F576D: (0xC8FD, 0),  # Korean hangul
    0x2D5233: (0x7F78, 0),  # East Asian ideograph
    0x23576E: (0x9BC0, 0),  # East Asian ideograph
    0x29312B: (0x89D1, 0),  # East Asian ideograph
    0x2D5361: (0x811A, 0),  # East Asian ideograph
    0x4B576F: (
        0x8910,
        0,
    ),  # East Asian ideograph (variant of 21576F which maps to 8910)
    0x6F4D68: (0xB4ED, 0),  # Korean hangul
    0x6F4B2E: (0xAFE9, 0),  # Korean hangul
    0x6F4925: (0xAC77, 0),  # Korean hangul
    0x275771: (0x8934, 0),  # East Asian ideograph
    0x215772: (0x8912, 0),  # East Asian ideograph
    0x294164: (0x948B, 0),  # East Asian ideograph
    0x275773: (0x88E4, 0),  # East Asian ideograph
    0x215774: (0x892A, 0),  # East Asian ideograph
    0x6F4D69: (0xB4EF, 0),  # Korean hangul
    0x29467C: (0x9546, 0),  # East Asian ideograph
    0x3F4926: (0x6E08, 0),  # East Asian ideograph
    0x21334E: (0x51FD, 0),  # East Asian ideograph
    0x6F5776: (0xC92C, 0),  # Korean hangul
    0x234221: (0x91F9, 0),  # East Asian ideograph
    0x215777: (0x893B, 0),  # East Asian ideograph
    0x224222: (0x6A7F, 0),  # East Asian ideograph
    0x6F5A33: (0xCF11, 0),  # Korean hangul
    0x234223: (0x9204, 0),  # East Asian ideograph
    0x216231: (0x9CF6, 0),  # East Asian ideograph
    0x215779: (0x8938, 0),  # East Asian ideograph
    0x224224: (0x6A91, 0),  # East Asian ideograph
    0x21577A: (0x8944, 0),  # East Asian ideograph
    0x214225: (0x64E0, 0),  # East Asian ideograph
    0x6F4927: (0xAC79, 0),  # Korean hangul
    0x22577B: (0x7358, 0),  # East Asian ideograph
    0x224226: (0x6A9F, 0),  # East Asian ideograph
    0x4B4A38: (0x71D7, 0),  # East Asian ideograph
    0x21577C: (0x8960, 0),  # East Asian ideograph
    0x234227: (0x920A, 0),  # East Asian ideograph
    0x27577D: (0x8884, 0),  # East Asian ideograph
    0x234228: (0x9225, 0),  # East Asian ideograph
    0x295347: (0x9A93, 0),  # East Asian ideograph
    0x216232: (0x9CF4, 0),  # East Asian ideograph
    0x21577E: (0x8964, 0),  # East Asian ideograph
    0x274229: (0x6401, 0),  # East Asian ideograph
    0x22422A: (0x6A92, 0),  # East Asian ideograph
    0x692465: (0x3085, 0),  # Hiragana letter small YU
    0x22422B: (0x6AA3, 0),  # East Asian ideograph
    0x6F504C: (0xBB3C, 0),  # Korean hangul
    0x6F545B: (0xC42C, 0),  # Korean hangul
    0x23422C: (0x9228, 0),  # East Asian ideograph
    0x6F5A35: (0xCF15, 0),  # Korean hangul
    0x6F5B61: (0xD2D4, 0),  # Korean hangul
    0x29556C: (0x960B, 0),  # East Asian ideograph
    0x4B5B46: (0x8F0C, 0),  # East Asian ideograph
    0x21422E: (0x64FE, 0),  # East Asian ideograph
    0x456260: (0x5E7A, 0),  # East Asian ideograph
    0x275C57: (0x8FD8, 0),  # East Asian ideograph
    0x23422F: (0x9203, 0),  # East Asian ideograph
    0x276030: (0x827D, 0),  # East Asian ideograph
    0x692466: (0x3086, 0),  # Hiragana letter YU
    0x274230: (0x6446, 0),  # East Asian ideograph
    0x2D567B: (0x8717, 0),  # East Asian ideograph
    0x234231: (0x9200, 0),  # East Asian ideograph
    0x393573: (0x5611, 0),  # East Asian ideograph
    0x234232: (0x9218, 0),  # East Asian ideograph
    0x295C3E: (0x9E37, 0),  # East Asian ideograph
    0x274233: (0x62E6, 0),  # East Asian ideograph
    0x6F4D6D: (0xB518, 0),  # Korean hangul
    0x6F4B2F: (0xAFF0, 0),  # Korean hangul
    0x274234: (0x6400, 0),  # East Asian ideograph
    0x274235: (0x6444, 0),  # East Asian ideograph
    0x234236: (0x9208, 0),  # East Asian ideograph
    0x6F5A37: (0xCF20, 0),  # Korean hangul
    0x224237: (0x6A9B, 0),  # East Asian ideograph
    0x234238: (0x921C, 0),  # East Asian ideograph
    0x2D6079: (0x8218, 0),  # East Asian ideograph
    0x6F492B: (0xAC83, 0),  # Korean hangul
    0x213353: (0x5206, 0),  # East Asian ideograph
    0x27423A: (0x6405, 0),  # East Asian ideograph
    0x287349: (0x7F30, 0),  # East Asian ideograph
    0x2D3464: (0x613D, 0),  # East Asian ideograph
    0x23423B: (0x9224, 0),  # East Asian ideograph
    0x2D3021: (0x5F0C, 0),  # East Asian ideograph
    0x6F5A38: (0xCF24, 0),  # Korean hangul
    0x335772: (0x8943, 0),  # East Asian ideograph
    0x293132: (0x89CC, 0),  # East Asian ideograph
    0x226635: (0x7911, 0),  # East Asian ideograph
    0x33423D: (0x53CE, 0),  # East Asian ideograph
    0x284D2B: (0x6D54, 0),  # East Asian ideograph
    0x2D486B: (0x6F82, 0),  # East Asian ideograph
    0x692469: (0x3089, 0),  # Hiragana letter RA
    0x6F576B: (0xC8F5, 0),  # Korean hangul
    0x2D3C7C: (0x83F4, 0),  # East Asian ideograph
    0x4B516D: (0x7DCF, 0),  # East Asian ideograph
    0x216237: (0x9D23, 0),  # East Asian ideograph
    0x224242: (0x6AA0, 0),  # East Asian ideograph
    0x6F4D70: (0xB524, 0),  # Korean hangul
    0x234243: (0x9212, 0),  # East Asian ideograph
    0x69246A: (0x308A, 0),  # Hiragana letter RI
    0x334244: (0x6559, 0),  # East Asian ideograph
    0x4B4A3E: (0x7235, 0),  # East Asian ideograph
    0x2F5E7D: (0x6641, 0),  # East Asian ideograph
    0x393577: (0x9FA2, 0),  # East Asian ideograph
    0x6F5B62: (0xD1F8, 0),  # Korean hangul
    0x214247: (0x6557, 0),  # East Asian ideograph
    0x6F4D71: (0xB525, 0),  # Korean hangul
    0x6F4C7A: (0xB2FA, 0),  # Korean hangul
    0x234248: (0x91FF, 0),  # East Asian ideograph
    0x285323: (0x8367, 0),  # East Asian ideograph
    0x69246B: (0x308B, 0),  # Hiragana letter RU
    0x217345: (0x5699, 0),  # East Asian ideograph
    0x224249: (0x6A9E, 0),  # East Asian ideograph
    0x22424A: (0x6A87, 0),  # East Asian ideograph
    0x6F5A3B: (0xCF2F, 0),  # Korean hangul
    0x22424B: (0x6A8E, 0),  # East Asian ideograph
    0x23424E: (0x9206, 0),  # East Asian ideograph
    0x27424F: (0x542F, 0),  # East Asian ideograph
    0x6F5A3C: (0xCF30, 0),  # Korean hangul
    0x21623A: (0x9D1B, 0),  # East Asian ideograph
    0x224251: (0x6AAB, 0),  # East Asian ideograph
    0x6F4D73: (0xB528, 0),  # Korean hangul
    0x234252: (0x9249, 0),  # East Asian ideograph
    0x6F4930: (0xAC89, 0),  # Korean hangul
    0x394243: (0x4FF2, 0),  # East Asian ideograph
    0x705F61: (0x54DA, 0),  # East Asian ideograph
    0x234254: (0x924D, 0),  # East Asian ideograph
    0x6F556B: (0xC606, 0),  # Korean hangul
    0x224255: (0x6AC8, 0),  # East Asian ideograph
    0x224864: (0x6D19, 0),  # East Asian ideograph
    0x4C4177: (0x8223, 0),  # East Asian ideograph
    0x274256: (0x655B, 0),  # East Asian ideograph
    0x6F4D74: (0xB529, 0),  # Korean hangul
    0x224257: (0x6AAE, 0),  # East Asian ideograph
    0x6F4931: (0xAC8A, 0),  # Korean hangul
    0x6F497C: (0xAD90, 0),  # Korean hangul
    0x234258: (0x923A, 0),  # East Asian ideograph
    0x2D346A: (0x5918, 0),  # East Asian ideograph
    0x6F4879: (0xAC30, 0),  # Korean hangul
    0x2D3C7D: (0x53A2, 0),  # East Asian ideograph
    0x2D4F3E: (0x7A3E, 0),  # East Asian ideograph
    0x4D4134: (0x919B, 0),  # East Asian ideograph
    0x23425C: (0x922E, 0),  # East Asian ideograph
    0x6F4932: (0xAC8B, 0),  # Korean hangul
    0x22425D: (0x6ABF, 0),  # East Asian ideograph
    0x2D5241: (0x7FA3, 0),  # East Asian ideograph
    0x6F5A3F: (0xCF58, 0),  # Korean hangul
    0x23425F: (0x9233, 0),  # East Asian ideograph
    0x294260: (0x94B7, 0),  # East Asian ideograph
    0x234261: (0x9266, 0),  # East Asian ideograph
    0x6F4933: (0xAC8C, 0),  # Korean hangul
    0x214263: (0x65AC, 0),  # East Asian ideograph
    0x29446D: (0x951B, 0),  # East Asian ideograph
    0x6F5A40: (0xCF5C, 0),  # Korean hangul
    0x224264: (0x6ACA, 0),  # East Asian ideograph
    0x224867: (0x6D0E, 0),  # East Asian ideograph
    0x4B3938: (0x5942, 0),  # East Asian ideograph
    0x214266: (0x65B7, 0),  # East Asian ideograph
    0x6F4934: (0xAC90, 0),  # Korean hangul
    0x22375B: (0x65FB, 0),  # East Asian ideograph
    0x4B4A45: (0x5C13, 0),  # East Asian ideograph
    0x234268: (0x9235, 0),  # East Asian ideograph
    0x4B4B77: (0x4EC0, 0),  # East Asian ideograph
    0x6F5A41: (0xCF64, 0),  # Korean hangul
    0x4B5B52: (0x8F42, 0),  # East Asian ideograph
    0x6F4D78: (0xB530, 0),  # Korean hangul
    0x23426B: (0x9250, 0),  # East Asian ideograph
    0x692472: (0x3092, 0),  # Hiragana letter WO
    0x21335D: (0x5228, 0),  # East Asian ideograph
    0x22375C: (0x65FC, 0),  # East Asian ideograph
    0x23426C: (0x926B, 0),  # East Asian ideograph
    0x23426D: (0x9239, 0),  # East Asian ideograph
    0x6F556C: (0xC607, 0),  # Korean hangul
    0x6F5A42: (0xCF65, 0),  # Korean hangul
    0x6F4B6C: (0xB0E5, 0),  # Korean hangul
    0x23426F: (0x926D, 0),  # East Asian ideograph
    0x234270: (0x926C, 0),  # East Asian ideograph
    0x6F4936: (0xAC9C, 0),  # Korean hangul
    0x234271: (0x924F, 0),  # East Asian ideograph
    0x2D4272: (0x65E3, 0),  # East Asian ideograph
    0x6F5C3E: (0xD3ED, 0),  # Korean hangul
    0x2D3C7E: (0x53A0, 0),  # East Asian ideograph
    0x6F5A43: (0xCF67, 0),  # Korean hangul
    0x294274: (0x94BF, 0),  # East Asian ideograph
    0x6F4D7A: (0xB532, 0),  # Korean hangul
    0x6F4937: (0xAC9F, 0),  # Korean hangul
    0x234277: (0x9260, 0),  # East Asian ideograph
    0x2D302D: (0x4E17, 0),  # East Asian ideograph
    0x6F4D62: (0xB4DC, 0),  # Korean hangul
    0x6F5A44: (0xCF69, 0),  # Korean hangul
    0x234C6A: (0x9741, 0),  # East Asian ideograph
    0x4B5B55: (0x8EE2, 0),  # East Asian ideograph
    0x224279: (0x6AE6, 0),  # East Asian ideograph
    0x216D24: (0x531C, 0),  # East Asian ideograph
    0x6F4D7B: (0xB534, 0),  # Korean hangul
    0x69562E: (0x5CBB, 0),  # East Asian ideograph
    0x6F4938: (0xACA0, 0),  # Korean hangul
    0x6F5B3A: (0xD1A4, 0),  # Korean hangul
    0x275823: (0x88AD, 0),  # East Asian ideograph
    0x29424B: (0x94A3, 0),  # East Asian ideograph
    0x235D77: (0x9EAD, 0),  # East Asian ideograph
    0x6F4F75: (0xB9E5, 0),  # Korean hangul
    0x213D6A: (0x5F97, 0),  # East Asian ideograph
    0x2E3870: (0x714A, 0),  # East Asian ideograph
    0x6F5A45: (0xCF70, 0),  # Korean hangul
    0x22486C: (0x6D00, 0),  # East Asian ideograph
    0x234C6B: (0x9747, 0),  # East Asian ideograph
    0x23427E: (0x9236, 0),  # East Asian ideograph
    0x6F4D7C: (0xB537, 0),  # Korean hangul
    0x6F4B32: (0xB00C, 0),  # Korean hangul
    0x222D2A: (0x610A, 0),  # East Asian ideograph
    0x22442A: (0x6B35, 0),  # East Asian ideograph
    0x216D2E: (0x532D, 0),  # East Asian ideograph
    0x6F4D7D: (0xB538, 0),  # Korean hangul
    0x6F493A: (0xACA8, 0),  # Korean hangul
    0x213362: (0x5230, 0),  # East Asian ideograph
    0x276822: (0x507B, 0),  # East Asian ideograph
    0x2D3473: (0x5374, 0),  # East Asian ideograph
    0x6F5A47: (0xCF74, 0),  # Korean hangul
    0x4C3F7A: (0x6922, 0),  # East Asian ideograph
    0x29535A: (0x9A9F, 0),  # East Asian ideograph
    0x222D32: (0x6112, 0),  # East Asian ideograph
    0x4B5B58: (0x8EE3, 0),  # East Asian ideograph
    0x4B393F: (0x5333, 0),  # East Asian ideograph
    0x216D33: (0x5330, 0),  # East Asian ideograph
    0x2D486E: (0x6F97, 0),  # East Asian ideograph (not in Unicode)
    0x282D34: (0x607D, 0),  # East Asian ideograph
    0x6F497E: (0xADA4, 0),  # Korean hangul
    0x224E32: (0x6FCA, 0),  # East Asian ideograph
    0x6F5C3F: (0xD3F0, 0),  # Korean hangul
    0x2F5A48: (0x9D44, 0),  # East Asian ideograph
    0x22486F: (0x6D33, 0),  # East Asian ideograph
    0x4C5F58: (0x7640, 0),  # East Asian ideograph
    0x6F4E2F: (0xB561, 0),  # Korean hangul
    0x6F493C: (0xACAA, 0),  # Korean hangul
    0x39424F: (0x5554, 0),  # East Asian ideograph
    0x2D3032: (0x7ADD, 0),  # East Asian ideograph
    0x33392F: (0x9029, 0),  # East Asian ideograph
    0x284F5D: (0x6CA3, 0),  # East Asian ideograph
    0x22442D: (0x6B3B, 0),  # East Asian ideograph
    0x216D3E: (0x533D, 0),  # East Asian ideograph
    0x51513B: (0x7E9F, 0),  # East Asian ideograph
    0x222D3F: (0x6121, 0),  # East Asian ideograph
    0x6F4F76: (0xB9E8, 0),  # Korean hangul
    0x292768: (0x8572, 0),  # East Asian ideograph
    0x274B5F: (0x7410, 0),  # East Asian ideograph
    0x6F5A4A: (0xCF85, 0),  # Korean hangul
    0x232D41: (0x8841, 0),  # East Asian ideograph
    0x2D4277: (0x65EE, 0),  # East Asian ideograph
    0x293A6B: (0x8E7F, 0),  # East Asian ideograph
    0x232A57: (0x873E, 0),  # East Asian ideograph
    0x6F4B33: (0xB00D, 0),  # Korean hangul
    0x222D43: (0x6106, 0),  # East Asian ideograph
    0x294251: (0x94C8, 0),  # East Asian ideograph
    0x3B2D44: (0x8842, 0),  # East Asian ideograph
    0x295053: (0x98D9, 0),  # East Asian ideograph
    0x287178: (0x7EF6, 0),  # East Asian ideograph
    0x226D47: (0x7C00, 0),  # East Asian ideograph
    0x2D4141: (0x63B2, 0),  # East Asian ideograph
    0x6F493F: (0xACB0, 0),  # Korean hangul
    0x6F547E: (0xC548, 0),  # Korean hangul
    0x294252: (0x94C9, 0),  # East Asian ideograph
    0x296028: (0x9F86, 0),  # East Asian ideograph
    0x2F3833: (0x8D91, 0),  # East Asian ideograph
    0x216D4B: (0x535D, 0),  # East Asian ideograph
    0x6F4940: (0xACB8, 0),  # Korean hangul
    0x284F61: (0x6EE0, 0),  # East Asian ideograph
    0x6F5C40: (0xD3F4, 0),  # Korean hangul
    0x295360: (0x9A98, 0),  # East Asian ideograph
    0x4B5B5E: (0x5F01, 0),  # East Asian ideograph
    0x232D51: (0x884A, 0),  # East Asian ideograph
    0x6F4941: (0xACB9, 0),  # Korean hangul
    0x294254: (0x94CB, 0),  # East Asian ideograph
    0x286D54: (0x7B5A, 0),  # East Asian ideograph
    0x222D56: (0x53AF, 0),  # East Asian ideograph
    0x232D57: (0x8850, 0),  # East Asian ideograph
    0x21336A: (0x524C, 0),  # East Asian ideograph
    0x294255: (0x94CA, 0),  # East Asian ideograph
    0x29602B: (0x9F85, 0),  # East Asian ideograph
    0x6F4F77: (0xB9EC, 0),  # Korean hangul
    0x21313A: (0x4F38, 0),  # East Asian ideograph
    0x3F462B: (0x5E30, 0),  # East Asian ideograph
    0x274B64: (0x7391, 0),  # East Asian ideograph
    0x6F5A4F: (0xCFB0, 0),  # Korean hangul
    0x696D5A: (0x8F4C, 0),  # East Asian ideograph
    0x29327E: (0x8C07, 0),  # East Asian ideograph
    0x6F4B34: (0xB010, 0),  # Korean hangul
    0x6F4943: (0xACBC, 0),  # Korean hangul
    0x21336B: (0x524B, 0),  # East Asian ideograph
    0x4D4862: (0x9229, 0),  # East Asian ideograph
    0x222D5E: (0x6137, 0),  # East Asian ideograph
    0x28717D: (0x7EFA, 0),  # East Asian ideograph
    0x6F5A50: (0xCFC4, 0),  # Korean hangul
    0x6F4B75: (0xB113, 0),  # Korean hangul
    0x6F4A5A: (0xAEBD, 0),  # Korean hangul
    0x6F4944: (0xACBD, 0),  # Korean hangul
    0x21735B: (0x56C3, 0),  # East Asian ideograph
    0x225541: (0x723F, 0),  # East Asian ideograph
    0x226D63: (0x7C20, 0),  # East Asian ideograph
    0x2D4147: (0x6271, 0),  # East Asian ideograph
    0x216D66: (0x5393, 0),  # East Asian ideograph
    0x6F4945: (0xACC1, 0),  # Korean hangul
    0x21336D: (0x5247, 0),  # East Asian ideograph
    0x294258: (0x94B0, 0),  # East Asian ideograph
    0x6F4B22: (0xAFB8, 0),  # Korean hangul
    0x335941: (0x54D7, 0),  # East Asian ideograph
    0x274B67: (0x73AF, 0),  # East Asian ideograph
    0x234C78: (0x975D, 0),  # East Asian ideograph
    0x234835: (0x942B, 0),  # East Asian ideograph
    0x6F5052: (0xBB4F, 0),  # Korean hangul
    0x276D6D: (0x538D, 0),  # East Asian ideograph
    0x274B68: (0x7477, 0),  # East Asian ideograph
    0x6F5A53: (0xCFE4, 0),  # Korean hangul
    0x225235: (0x712F, 0),  # East Asian ideograph
    0x294F23: (0x9880, 0),  # East Asian ideograph
    0x4B546D: (
        0x82D3,
        0,
    ),  # East Asian ideograph (variant of 21546D which maps to 82D3)
    0x6F4C7B: (0xB2FB, 0),  # Korean hangul
    0x6F4947: (0xACC4, 0),  # Korean hangul
    0x21336F: (0x5256, 0),  # East Asian ideograph
    0x225544: (0x7242, 0),  # East Asian ideograph
    0x6F5724: (0xC7A5, 0),  # Korean hangul
    0x274932: (0x6CFB, 0),  # East Asian ideograph
    0x4B682E: (0x4EC2, 0),  # East Asian ideograph
    0x274B69: (0x73BA, 0),  # East Asian ideograph
    0x6F5A54: (0xCFE8, 0),  # Korean hangul
    0x234837: (0x9441, 0),  # East Asian ideograph
    0x213D3F: (0x5F17, 0),  # East Asian ideograph
    0x4D2D75: (
        0x8872,
        0,
    ),  # East Asian ideograph (variant of 232D75 which maps to 8872)
    0x213370: (0x525B, 0),  # East Asian ideograph
    0x69252C: (0x30AC, 0),  # Katakana letter GA
    0x225821: (0x734B, 0),  # East Asian ideograph
    0x282D77: (0x60AD, 0),  # East Asian ideograph
    0x215822: (0x896F, 0),  # East Asian ideograph
    0x6F5A55: (0xCFF0, 0),  # Korean hangul
    0x6F557D: (0xC63B, 0),  # Korean hangul
    0x234C7B: (0x975F, 0),  # East Asian ideograph
    0x222D79: (0x6164, 0),  # East Asian ideograph
    0x4B5824: (0x897E, 0),  # East Asian ideograph
    0x696D7A: (0x9027, 0),  # East Asian ideograph
    0x6F4949: (0xACD7, 0),  # Korean hangul
    0x215825: (0x8981, 0),  # East Asian ideograph
    0x29425C: (0x94CC, 0),  # East Asian ideograph
    0x695C29: (0x6925, 0),  # East Asian ideograph
    0x4B5826: (
        0x8983,
        0,
    ),  # East Asian ideograph (variant of 215826 which maps to 8983)
    0x232D7C: (0x8879, 0),  # East Asian ideograph
    0x295827: (0x9CB2, 0),  # East Asian ideograph
    0x6F5A56: (0xCFF3, 0),  # Korean hangul
    0x295369: (0x9A7A, 0),  # East Asian ideograph
    0x215828: (0x898B, 0),  # East Asian ideograph
    0x225829: (0x736C, 0),  # East Asian ideograph
    0x6F494A: (0xACE0, 0),  # Korean hangul
    0x21582A: (0x8993, 0),  # East Asian ideograph
    0x21582B: (0x8996, 0),  # East Asian ideograph
    0x2D5259: (0x98DC, 0),  # East Asian ideograph
    0x21582C: (0x89AA, 0),  # East Asian ideograph
    0x284F6B: (0x6F13, 0),  # East Asian ideograph
    0x29536A: (0x9A9D, 0),  # East Asian ideograph
    0x21582D: (0x89A6, 0),  # East Asian ideograph
    0x27582E: (0x89CA, 0),  # East Asian ideograph
    0x6F494B: (0xACE1, 0),  # Korean hangul
    0x22582F: (0x736F, 0),  # East Asian ideograph
    0x275830: (0x89C9, 0),  # East Asian ideograph
    0x215831: (0x89BD, 0),  # East Asian ideograph
    0x6F5A58: (0xCFFC, 0),  # Korean hangul
    0x275832: (0x89C2, 0),  # East Asian ideograph
    0x222871: (0x5EE8, 0),  # East Asian ideograph
    0x22443C: (0x6B43, 0),  # East Asian ideograph
    0x33483B: (0x6CDD, 0),  # East Asian ideograph
    0x2D5833: (0x752A, 0),  # East Asian ideograph
    0x276037: (0x9875, 0),  # East Asian ideograph
    0x6F494C: (0xACE4, 0),  # Korean hangul
    0x215834: (0x89E3, 0),  # East Asian ideograph
    0x29425F: (0x94B6, 0),  # East Asian ideograph
    0x275835: (0x89DE, 0),  # East Asian ideograph
    0x274933: (0x6E0E, 0),  # East Asian ideograph
    0x235B52: (0x9D6F, 0),  # East Asian ideograph
    0x215836: (0x89F8, 0),  # East Asian ideograph
    0x455837: (0x8BA0, 0),  # East Asian ideograph
    0x4C5F69: (0x75EB, 0),  # East Asian ideograph
    0x275838: (0x8BA1, 0),  # East Asian ideograph
    0x6F4B36: (0xB01C, 0),  # Korean hangul
    0x6F494D: (0xACE7, 0),  # Korean hangul
    0x275839: (0x8BA2, 0),  # East Asian ideograph
    0x4D2962: (
        0x86C9,
        0,
    ),  # East Asian ideograph (variant of 232962 which maps to 86C9)
    0x223331: (0x640C, 0),  # East Asian ideograph
    0x22583B: (0x7381, 0),  # East Asian ideograph
    0x6F5A5A: (0xD018, 0),  # Korean hangul
    0x2E7431: (0x7F48, 0),  # East Asian ideograph
    0x4B625C: (
        0x9EB8,
        0,
    ),  # East Asian ideograph (variant of 27625C which maps to 9EB8)
    0x27583C: (0x8BB0, 0),  # East Asian ideograph
    0x22443E: (0x6B48, 0),  # East Asian ideograph
    0x23483D: (0x9467, 0),  # East Asian ideograph
    0x27583D: (0x8BA8, 0),  # East Asian ideograph
    0x273A63: (0x5B6A, 0),  # East Asian ideograph
    0x6F494E: (0xACE8, 0),  # Korean hangul
    0x27583E: (0x8BA7, 0),  # East Asian ideograph
    0x294261: (0x94B2, 0),  # East Asian ideograph
    0x22583F: (0x7388, 0),  # East Asian ideograph
    0x2D525D: (0x6537, 0),  # East Asian ideograph
    0x224C3F: (0x6F26, 0),  # East Asian ideograph
    0x6F5A5B: (0xD02D, 0),  # Korean hangul
    0x215841: (0x8A16, 0),  # East Asian ideograph
    0x215842: (0x8A17, 0),  # East Asian ideograph
    0x6F494F: (0xACEA, 0),  # Korean hangul
    0x275843: (0x8BAD, 0),  # East Asian ideograph
    0x275844: (0x8BBF, 0),  # East Asian ideograph
    0x233732: (0x8D0C, 0),  # East Asian ideograph
    0x2D3045: (0x4E57, 0),  # East Asian ideograph
    0x275845: (0x8BC0, 0),  # East Asian ideograph
    0x6F5A5C: (0xD034, 0),  # Korean hangul
    0x225846: (0x7395, 0),  # East Asian ideograph
    0x294F2C: (0x988F, 0),  # East Asian ideograph
    0x215847: (0x8A25, 0),  # East Asian ideograph
    0x6F4950: (0xACEC, 0),  # Korean hangul
    0x225848: (0x7397, 0),  # East Asian ideograph
    0x6F5739: (0xC810, 0),  # Korean hangul
    0x285C3A: (0x748E, 0),  # East Asian ideograph
    0x6F5054: (0xBB54, 0),  # Korean hangul
    0x215849: (0x8A2D, 0),  # East Asian ideograph
    0x21584A: (0x8A1B, 0),  # East Asian ideograph
    0x6F5A5D: (0xD035, 0),  # Korean hangul
    0x295370: (0x9A9C, 0),  # East Asian ideograph
    0x286D47: (0x7BA6, 0),  # East Asian ideograph
    0x21584B: (0x8A1F, 0),  # East Asian ideograph
    0x21584C: (0x8A3B, 0),  # East Asian ideograph
    0x2D4153: (0x64E3, 0),  # East Asian ideograph
    0x276038: (0x9876, 0),  # East Asian ideograph
    0x6F4951: (0xACEF, 0),  # Korean hangul
    0x22584D: (0x7394, 0),  # East Asian ideograph
    0x294264: (0x94BA, 0),  # East Asian ideograph
    0x21584E: (0x8A55, 0),  # East Asian ideograph
    0x21584F: (0x8A5E, 0),  # East Asian ideograph
    0x4B576C: (0x523E, 0),  # East Asian ideograph
    0x27486D: (0x6DA6, 0),  # East Asian ideograph
    0x275851: (0x8BC2, 0),  # East Asian ideograph
    0x6F4B37: (0xB01D, 0),  # Korean hangul
    0x6F4952: (0xACF0, 0),  # Korean hangul
    0x225852: (0x73A6, 0),  # East Asian ideograph
    0x227768: (0x80B8, 0),  # East Asian ideograph
    0x223336: (0x6415, 0),  # East Asian ideograph
    0x275854: (0x8BC8, 0),  # East Asian ideograph
    0x6F5A5F: (0xD050, 0),  # Korean hangul
    0x275855: (0x8BCB, 0),  # East Asian ideograph
    0x275856: (0x8BC9, 0),  # East Asian ideograph
    0x6F4A5D: (0xAEC4, 0),  # Korean hangul
    0x215857: (0x8A3A, 0),  # East Asian ideograph
    0x21736A: (0x56D4, 0),  # East Asian ideograph
    0x33333C: (0x6C37, 0),  # East Asian ideograph
    0x215858: (0x8A6B, 0),  # East Asian ideograph
    0x4B4621: (0x6B53, 0),  # East Asian ideograph
    0x235859: (0x9C12, 0),  # East Asian ideograph
    0x6F5A60: (0xD06C, 0),  # Korean hangul
    0x27585A: (0x8BE6, 0),  # East Asian ideograph
    0x27585B: (0x8BD5, 0),  # East Asian ideograph
    0x45456D: (0x6A10, 0),  # East Asian ideograph
    0x2D5F2C: (0x5826, 0),  # East Asian ideograph
    0x6F4954: (0xACF3, 0),  # Korean hangul
    0x21585C: (0x8A69, 0),  # East Asian ideograph
    0x6F4B4A: (0xB08F, 0),  # Korean hangul
    0x225551: (0x724F, 0),  # East Asian ideograph
    0x21585D: (0x8A70, 0),  # East Asian ideograph
    0x29443E: (0x94E4, 0),  # East Asian ideograph
    0x21585E: (0x8A63, 0),  # East Asian ideograph
    0x6F5A61: (0xD070, 0),  # Korean hangul
    0x21625F: (0x9EBB, 0),  # East Asian ideograph
    0x21585F: (0x8A7C, 0),  # East Asian ideograph
    0x215860: (0x8AA0, 0),  # East Asian ideograph
    0x6F4E30: (0xB5A0, 0),  # Korean hangul
    0x2D5F2D: (0x964F, 0),  # East Asian ideograph
    0x275861: (0x5938, 0),  # East Asian ideograph
    0x275840: (0x8BAF, 0),  # East Asian ideograph
    0x6F5055: (0xBB58, 0),  # Korean hangul
    0x215862: (0x8A85, 0),  # East Asian ideograph
    0x6F5441: (0xC329, 0),  # Korean hangul
    0x225863: (0x73A0, 0),  # East Asian ideograph
    0x6F5A62: (0xD074, 0),  # Korean hangul
    0x695375: (0x56CE, 0),  # East Asian ideograph
    0x6F5864: (0xCB18, 0),  # Korean hangul
    0x215865: (0x8A62, 0),  # East Asian ideograph
    0x2D575B: (0x886E, 0),  # East Asian ideograph
    0x3F4956: (0x7832, 0),  # East Asian ideograph
    0x215866: (0x8A71, 0),  # East Asian ideograph
    0x285C40: (0x74D2, 0),  # East Asian ideograph
    0x215867: (0x8A6E, 0),  # East Asian ideograph
    0x295132: (0x997D, 0),  # East Asian ideograph
    0x233739: (0x8D11, 0),  # East Asian ideograph
    0x2D5265: (0x79D0, 0),  # East Asian ideograph
    0x225868: (0x73CF, 0),  # East Asian ideograph
    0x6F5A63: (0xD07C, 0),  # Korean hangul
    0x282D5E: (0x607A, 0),  # East Asian ideograph
    0x6F4A25: (0xADD0, 0),  # Korean hangul
    0x275869: (0x8BF4, 0),  # East Asian ideograph
    0x21586A: (0x8AA6, 0),  # East Asian ideograph
    0x6F4B38: (0xB028, 0),  # Korean hangul
    0x21586B: (0x8AA1, 0),  # East Asian ideograph
    0x215155: (0x7DD6, 0),  # East Asian ideograph
    0x22333B: (0x6422, 0),  # East Asian ideograph
    0x27586D: (0x5FD7, 0),  # East Asian ideograph
    0x22456F: (0x6BE7, 0),  # East Asian ideograph
    0x23586E: (0x9C23, 0),  # East Asian ideograph
    0x27586F: (0x8BEC, 0),  # East Asian ideograph
    0x6F4F36: (0xB839, 0),  # Korean hangul
    0x6F4A5E: (0xAECC, 0),  # Korean hangul
    0x215870: (0x8A8D, 0),  # East Asian ideograph
    0x21736F: (0x56E1, 0),  # East Asian ideograph
    0x294469: (0x94FC, 0),  # East Asian ideograph
    0x215871: (
        0x8AA4,
        0,
    ),  # East Asian ideograph (variant of 4B5871 which maps to 8AA4)
    0x23373B: (0x8D12, 0),  # East Asian ideograph
    0x2D5267: (0x79CF, 0),  # East Asian ideograph
    0x215872: (0x8AA8, 0),  # East Asian ideograph
    0x2D4E24: (0x6998, 0),  # East Asian ideograph
    0x215873: (0x8AA5, 0),  # East Asian ideograph
    0x217E60: (0x5BC9, 0),  # East Asian ideograph
    0x215874: (0x8A98, 0),  # East Asian ideograph
    0x4B5D65: (0x8217, 0),  # East Asian ideograph
    0x6F4959: (0xACFD, 0),  # Korean hangul
    0x215875: (0x8A91, 0),  # East Asian ideograph
    0x6F5130: (0xBC9A, 0),  # Korean hangul
    0x275876: (0x8C0A, 0),  # East Asian ideograph
    0x6F4B68: (0xB0C9, 0),  # Korean hangul
    0x215877: (0x8AC4, 0),  # East Asian ideograph
    0x6F5A66: (0xD0A4, 0),  # Korean hangul
    0x4B5176: (0x7E04, 0),  # East Asian ideograph
    0x295379: (0x9A96, 0),  # East Asian ideograph
    0x235878: (0x9C21, 0),  # East Asian ideograph
    0x234323: (0x924E, 0),  # East Asian ideograph
    0x275879: (0x8C08, 0),  # East Asian ideograph
    0x6F495A: (0xAD00, 0),  # Korean hangul
    0x27587A: (0x8BF7, 0),  # East Asian ideograph
    0x224325: (0x6ACC, 0),  # East Asian ideograph
    0x21587B: (0x8AF8, 0),  # East Asian ideograph
    0x23373D: (0x8D14, 0),  # East Asian ideograph
    0x21587C: (0x8AB2, 0),  # East Asian ideograph
    0x234327: (0x9256, 0),  # East Asian ideograph
    0x29537A: (0x9AA2, 0),  # East Asian ideograph
    0x21587D: (0x8ABF, 0),  # East Asian ideograph
    0x224328: (0x6AD1, 0),  # East Asian ideograph
    0x21587E: (0x8AC9, 0),  # East Asian ideograph
    0x4C7D4D: (0x8343, 0),  # East Asian ideograph
    0x2D4329: (0x668E, 0),  # East Asian ideograph
    0x6F495B: (0xAD04, 0),  # Korean hangul
    0x6F5D31: (0xD611, 0),  # Korean hangul
    0x6F4F7C: (0xB9F9, 0),  # Korean hangul
    0x23432B: (0x925A, 0),  # East Asian ideograph
    0x2D3051: (0x5F0D, 0),  # East Asian ideograph
    0x6F5A68: (0xD0A8, 0),  # Korean hangul
    0x216266: (0x9ED1, 0),  # East Asian ideograph
    0x27432D: (0x65F6, 0),  # East Asian ideograph
    0x4B5736: (0x877F, 0),  # East Asian ideograph
    0x23432E: (0x9241, 0),  # East Asian ideograph
    0x6F495C: (0xAD0C, 0),  # Korean hangul
    0x285252: (0x709C, 0),  # East Asian ideograph
    0x275847: (0x8BB7, 0),  # East Asian ideograph
    0x23432F: (0x9283, 0),  # East Asian ideograph
    0x335958: (0x8C4A, 0),  # East Asian ideograph
    0x394330: (0x6644, 0),  # East Asian ideograph
    0x2D526B: (0x7085, 0),  # East Asian ideograph
    0x234331: (0x92A5, 0),  # East Asian ideograph
    0x213065: (0x4ECA, 0),  # East Asian ideograph
    0x6F5626: (0xC653, 0),  # Korean hangul
    0x274332: (0x663C, 0),  # East Asian ideograph
    0x234333: (0x9282, 0),  # East Asian ideograph
    0x2D5F35: (0x78D2, 0),  # East Asian ideograph
    0x6F495D: (0xAD0D, 0),  # Korean hangul
    0x275848: (0x8BB8, 0),  # East Asian ideograph
    0x224334: (0x6ACD, 0),  # East Asian ideograph
    0x234335: (0x92A8, 0),  # East Asian ideograph
    0x2D3053: (0x4E3C, 0),  # East Asian ideograph
    0x29572B: (0x9C90, 0),  # East Asian ideograph
    0x6F5A6A: (0xD0B4, 0),  # Korean hangul
    0x224337: (0x6AEC, 0),  # East Asian ideograph
    0x215E25: (0x938A, 0),  # East Asian ideograph
    0x234338: (0x92A4, 0),  # East Asian ideograph
    0x6F495E: (0xAD0F, 0),  # Korean hangul
    0x224339: (0x6AF3, 0),  # East Asian ideograph
    0x22433A: (0x6AE7, 0),  # East Asian ideograph
    0x2D433B: (0x6662, 0),  # East Asian ideograph
    0x226225: (0x7735, 0),  # East Asian ideograph
    0x4B5B29: (0x8E8D, 0),  # East Asian ideograph
    0x6F495F: (0xAD11, 0),  # Korean hangul
    0x23433E: (0x9276, 0),  # East Asian ideograph
    0x227775: (0x6711, 0),  # East Asian ideograph
    0x22433F: (0x6AEB, 0),  # East Asian ideograph
    0x224340: (0x6AEA, 0),  # East Asian ideograph
    0x21626A: (0x9EDE, 0),  # East Asian ideograph
    0x274341: (0x6655, 0),  # East Asian ideograph
    0x6F5428: (0xC2EB, 0),  # Korean hangul
    0x234342: (0x9288, 0),  # East Asian ideograph
    0x27603B: (0x987A, 0),  # East Asian ideograph
    0x6F4960: (0xAD18, 0),  # Korean hangul
    0x274343: (0x7545, 0),  # East Asian ideograph
    0x6F4F7D: (0xB9FA, 0),  # Korean hangul
    0x223344: (0x6430, 0),  # East Asian ideograph
    0x224344: (0x6AF1, 0),  # East Asian ideograph
    0x4C6C46: (0x7B9F, 0),  # East Asian ideograph
    0x234345: (0x928E, 0),  # East Asian ideograph
    0x6F562A: (0xC65D, 0),  # Korean hangul
    0x234346: (0x92A0, 0),  # East Asian ideograph
    0x4B7954: (0x5968, 0),  # East Asian ideograph
    0x6F4B3A: (0xB045, 0),  # Korean hangul
    0x234347: (0x9277, 0),  # East Asian ideograph
    0x6F4961: (0xAD19, 0),  # Korean hangul
    0x274348: (0x6653, 0),  # East Asian ideograph
    0x274349: (0x5386, 0),  # East Asian ideograph (duplicate simplified)
    0x6F564F: (0xC6E9, 0),  # Korean hangul
    0x224571: (0x6BE8, 0),  # East Asian ideograph
    0x213066: (0x4EC1, 0),  # East Asian ideograph
    0x6F562B: (0xC660, 0),  # Korean hangul
    0x27434B: (0x66A7, 0),  # East Asian ideograph
    0x6F4962: (0xAD1C, 0),  # Korean hangul
    0x27434D: (0x65F7, 0),  # East Asian ideograph
    0x6F4A60: (0xAECF, 0),  # Korean hangul
    0x4B335B: (0x522B, 0),  # East Asian ideograph
    0x23595E: (0x9C6E, 0),  # East Asian ideograph
    0x22434E: (0x6AFD, 0),  # East Asian ideograph
    0x2D3058: (0x4E9C, 0),  # East Asian ideograph
    0x29434F: (0x94DE, 0),  # East Asian ideograph
    0x6F562C: (0xC671, 0),  # Korean hangul
    0x224350: (0x6AFA, 0),  # East Asian ideograph
    0x347D24: (0x83C7, 0),  # East Asian ideograph
    0x6F552E: (0xC561, 0),  # Korean hangul
    0x2D5F3B: (0x96A0, 0),  # East Asian ideograph
    0x6F4963: (0xAD20, 0),  # Korean hangul
    0x6F5132: (0xBCA1, 0),  # Korean hangul
    0x224352: (0x6B01, 0),  # East Asian ideograph
    0x4B4A74: (
        0x731C,
        0,
    ),  # East Asian ideograph (variant of 214A74 which maps to 731C)
    0x234354: (0x927E, 0),  # East Asian ideograph
    0x6F5C47: (0xD45C, 0),  # Korean hangul
    0x274355: (0x4E66, 0),  # East Asian ideograph
    0x6F4964: (0xAD28, 0),  # Korean hangul
    0x334357: (0x6702, 0),  # East Asian ideograph
    0x223348: (0x6435, 0),  # East Asian ideograph
    0x224358: (0x6B03, 0),  # East Asian ideograph
    0x224359: (0x6AF8, 0),  # East Asian ideograph
    0x21605F: (0x98B6, 0),  # East Asian ideograph
    0x4D6047: (0x816D, 0),  # East Asian ideograph
    0x27435A: (0x4F1A, 0),  # East Asian ideograph
    0x23435B: (0x9291, 0),  # East Asian ideograph
    0x27603C: (0x987B, 0),  # East Asian ideograph
    0x6F4965: (0xAD29, 0),  # Korean hangul
    0x6F4F7E: (0xBA00, 0),  # Korean hangul
    0x23435D: (0x929B, 0),  # East Asian ideograph
    0x233748: (0x8D6C, 0),  # East Asian ideograph
    0x2D305B: (0x4EBE, 0),  # East Asian ideograph
    0x217573: (0x57D5, 0),  # East Asian ideograph
    0x6F562F: (0xC67C, 0),  # Korean hangul
    0x284B43: (0x8365, 0),  # East Asian ideograph
    0x22435F: (0x6B0D, 0),  # East Asian ideograph
    0x6F4B3B: (0xB048, 0),  # Korean hangul
    0x224360: (0x6B09, 0),  # East Asian ideograph
    0x355053: (0x98C8, 0),  # East Asian ideograph
    0x6F4966: (0xAD2D, 0),  # Korean hangul
    0x224361: (0x6B0E, 0),  # East Asian ideograph
    0x225563: (0x726E, 0),  # East Asian ideograph
    0x234362: (0x927F, 0),  # East Asian ideograph
    0x69243C: (0x305C, 0),  # Hiragana letter ZE
    0x6F5630: (0xC680, 0),  # Korean hangul
    0x234364: (0x92A3, 0),  # East Asian ideograph
    0x6F4967: (0xAD34, 0),  # Korean hangul
    0x275852: (0x8BCF, 0),  # East Asian ideograph
    0x214366: (0x6727, 0),  # East Asian ideograph
    0x224367: (0x6B11, 0),  # East Asian ideograph
    0x2D4E33: (0x78AA, 0),  # East Asian ideograph
    0x3F5631: (0x517F, 0),  # East Asian ideograph
    0x334369: (0x5932, 0),  # East Asian ideograph
    0x234857: (0x9464, 0),  # East Asian ideograph
    0x21436A: (0x672B, 0),  # East Asian ideograph
    0x293032: (0x7962, 0),  # East Asian ideograph
    0x6F4968: (0xAD38, 0),  # Korean hangul
    0x275853: (0x8BC5, 0),  # East Asian ideograph
    0x33496A: (0x934A, 0),  # East Asian ideograph
    0x22436D: (0x6B19, 0),  # East Asian ideograph
    0x4B5179: (0x7F0B, 0),  # East Asian ideograph
    0x6F5632: (0xC68B, 0),  # Korean hangul
    0x23436F: (0x92D0, 0),  # East Asian ideograph
    0x6F4969: (0xAD3C, 0),  # Korean hangul
    0x2D4370: (0x6736, 0),  # East Asian ideograph
    0x215167: (0x7E46, 0),  # East Asian ideograph
    0x234371: (0x92F1, 0),  # East Asian ideograph
    0x234372: (0x92DF, 0),  # East Asian ideograph
    0x275528: (0x835A, 0),  # East Asian ideograph
    0x215E31: (0x93C8, 0),  # East Asian ideograph
    0x6F496A: (0xAD44, 0),  # Korean hangul
    0x214375: (0x6750, 0),  # East Asian ideograph
    0x215168: (0x7E37, 0),  # East Asian ideograph
    0x6F572B: (0xC7BC, 0),  # Korean hangul
    0x234376: (0x92B6, 0),  # East Asian ideograph
    0x4B4638: (0x6BB1, 0),  # East Asian ideograph
    0x234377: (0x92C0, 0),  # East Asian ideograph
    0x6F5634: (0xC694, 0),  # Korean hangul
    0x6F4D2B: (0xB35B, 0),  # Korean hangul
    0x6F4B3C: (0xB04A, 0),  # Korean hangul
    0x234379: (0x92BE, 0),  # East Asian ideograph
    0x6F572E: (0xC7C0, 0),  # Korean hangul
    0x2D3061: (0x4EB0, 0),  # East Asian ideograph
    0x6F5A78: (0xD0D4, 0),  # Korean hangul
    0x6F5635: (0xC695, 0),  # Korean hangul
    0x29437D: (0x94D8, 0),  # East Asian ideograph
    0x696E28: (0x9056, 0),  # East Asian ideograph
    0x4B5746: (0x8853, 0),  # East Asian ideograph
    0x23437E: (0x92D5, 0),  # East Asian ideograph
    0x2D3D2B: (0x5EBF, 0),  # East Asian ideograph
    0x6F4A62: (0xAED1, 0),  # Korean hangul
    0x276E2A: (0x53A3, 0),  # East Asian ideograph
    0x2D527B: (0x8074, 0),  # East Asian ideograph
    0x6F5A79: (0xD0D5, 0),  # Korean hangul
    0x282D74: (0x6004, 0),  # East Asian ideograph
    0x6F5636: (0xC698, 0),  # Korean hangul
    0x23485C: (0x9465, 0),  # East Asian ideograph
    0x226233: (0x774A, 0),  # East Asian ideograph
    0x6F496D: (0xAD50, 0),  # Korean hangul
    0x6F5C49: (0xD478, 0),  # Korean hangul
    0x6F5840: (0xC9ED, 0),  # Korean hangul
    0x222E2F: (0x615C, 0),  # East Asian ideograph
    0x223351: (0x640A, 0),  # East Asian ideograph
    0x21317D: (0x501A, 0),  # East Asian ideograph
    0x6F5A7A: (0xD0DC, 0),  # Korean hangul
    0x2E7451: (0x7F58, 0),  # East Asian ideograph
    0x6F5637: (0xC6A5, 0),  # Korean hangul
    0x215E35: (0x93DD, 0),  # East Asian ideograph
    0x23485D: (0x9455, 0),  # East Asian ideograph
    0x6F4E31: (0xB5A1, 0),  # Korean hangul
    0x225E2C: (0x7590, 0),  # East Asian ideograph
    0x2D3D2D: (0x5396, 0),  # East Asian ideograph
    0x275859: (0x8BE5, 0),  # East Asian ideograph
    0x21516C: (0x7E2B, 0),  # East Asian ideograph
    0x225128: (0x70E0, 0),  # East Asian ideograph
    0x6F5A7B: (0xD0DD, 0),  # Korean hangul
    0x275529: (0x830E, 0),  # East Asian ideograph
    0x22445F: (0x6B6E, 0),  # East Asian ideograph
    0x33485E: (0x67D2, 0),  # East Asian ideograph
    0x226235: (0x7743, 0),  # East Asian ideograph
    0x2D4171: (0x62CA, 0),  # East Asian ideograph
    0x6F496F: (0xAD6D, 0),  # Korean hangul
    0x6F572C: (0xC7BD, 0),  # Korean hangul
    0x27493A: (0x6FD1, 0),  # East Asian ideograph
    0x23596B: (0x9C7A, 0),  # East Asian ideograph
    0x235B59: (0x9DA9, 0),  # East Asian ideograph
    0x27474E: (0x6CFE, 0),  # East Asian ideograph
    0x6F5639: (0xC6A9, 0),  # Korean hangul
    0x215E37: (0x93D8, 0),  # East Asian ideograph
    0x222E3D: (0x61A2, 0),  # East Asian ideograph
    0x2D3D2F: (0x539B, 0),  # East Asian ideograph
    0x6F5946: (0xCCD0, 0),  # Korean hangul
    0x345D6B: (0x756D, 0),  # East Asian ideograph
    0x285D6B: (0x7572, 0),  # East Asian ideograph
    0x222E40: (0x61A8, 0),  # East Asian ideograph
    0x6F563A: (0xC6B0, 0),  # Korean hangul
    0x4B3C2B: (0x67C3, 0),  # East Asian ideograph (Version J extension)
    0x6F4F37: (0xB840, 0),  # Korean hangul
    0x6F4971: (0xAD73, 0),  # Korean hangul
    0x6F4A63: (0xAED8, 0),  # Korean hangul
    0x22512B: (0x70D4, 0),  # East Asian ideograph
    0x23552A: (0x9AEF, 0),  # East Asian ideograph
    0x6F5A7E: (0xD0EC, 0),  # Korean hangul
    0x222E45: (0x6196, 0),  # East Asian ideograph
    0x6F563B: (0xC6B1, 0),  # Korean hangul
    0x6F4972: (0xAD74, 0),  # Korean hangul
    0x6F563C: (0xC6B4, 0),  # Korean hangul
    0x234862: (0x946A, 0),  # East Asian ideograph
    0x282E4C: (0x6126, 0),  # East Asian ideograph
    0x2D5F4B: (0x96D1, 0),  # East Asian ideograph
    0x6F4973: (0xAD75, 0),  # Korean hangul
    0x215171: (0x7E54, 0),  # East Asian ideograph
    0x6F563D: (0xC6B7, 0),  # Korean hangul
    0x215E3B: (0x93FD, 0),  # East Asian ideograph
    0x2D4176: (0x6483, 0),  # East Asian ideograph
    0x2D5F4C: (0x9DC4, 0),  # East Asian ideograph
    0x6F4974: (0xAD76, 0),  # Korean hangul
    0x6F5D32: (0xD613, 0),  # Korean hangul
    0x282E52: (0x6003, 0),  # East Asian ideograph
    0x27493B: (0x6CA5, 0),  # East Asian ideograph
    0x233941: (0x8DFD, 0),  # East Asian ideograph
    0x6F563E: (0xC6B8, 0),  # Korean hangul
    0x4B5773: (0x7ED4, 0),  # East Asian ideograph
    0x213C23: (0x5D22, 0),  # East Asian ideograph
    0x286E56: (0x7BA8, 0),  # East Asian ideograph
    0x2D3D34: (0x5EFE, 0),  # East Asian ideograph
    0x215173: (0x7E5E, 0),  # East Asian ideograph
    0x223359: (0x6407, 0),  # East Asian ideograph
    0x216E58: (0x535F, 0),  # East Asian ideograph
    0x707523: (0x9170, 0),  # East Asian ideograph
    0x6F4B77: (0xB119, 0),  # Korean hangul
    0x222E5A: (0x61CB, 0),  # East Asian ideograph
    0x213C24: (0x5D29, 0),  # East Asian ideograph
    0x33355C: (0x5449, 0),  # East Asian ideograph
    0x273648: (0x95EE, 0),  # East Asian ideograph
    0x282E5C: (0x603F, 0),  # East Asian ideograph
    0x27514C: (0x7EFF, 0),  # East Asian ideograph
    0x6F5579: (0xC635, 0),  # Korean hangul
    0x6F5640: (0xC6BA, 0),  # Korean hangul
    0x6F5951: (0xCD5C, 0),  # Korean hangul
    0x4B397B: (0x5A2F, 0),  # East Asian ideograph
    0x29402C: (0x90D0, 0),  # East Asian ideograph
    0x22623D: (0x7760, 0),  # East Asian ideograph
    0x6F4977: (0xAD7F, 0),  # Korean hangul
    0x6F5136: (0xBCB0, 0),  # Korean hangul
    0x216E61: (0x5414, 0),  # East Asian ideograph
    0x22335B: (0x643B, 0),  # East Asian ideograph
    0x6F4A2E: (0xADFC, 0),  # Korean hangul
    0x6F5641: (0xC6C0, 0),  # Korean hangul
    0x213C26: (0x5D19, 0),  # East Asian ideograph
    0x275863: (0x8BE1, 0),  # East Asian ideograph
    0x695A7E: (0x66BC, 0),  # East Asian ideograph
    0x287E61: (0x82CC, 0),  # East Asian ideograph
    0x232E68: (0x88D2, 0),  # East Asian ideograph
    0x6F5642: (0xC6C1, 0),  # Korean hangul
    0x234868: (0x946B, 0),  # East Asian ideograph
    0x6F5429: (0xC2EC, 0),  # Korean hangul
    0x334425: (0x76C3, 0),  # East Asian ideograph
    0x6F4979: (0xAD82, 0),  # Korean hangul
    0x296062: (0x9F9B, 0),  # East Asian ideograph
    0x22335D: (0x643F, 0),  # East Asian ideograph
    0x23375C: (0x8D7A, 0),  # East Asian ideograph
    0x6F5643: (0xC6C3, 0),  # Korean hangul
    0x213C28: (0x5D50, 0),  # East Asian ideograph
    0x216E6F: (0x541A, 0),  # East Asian ideograph
    0x6F497A: (0xAD88, 0),  # Korean hangul
    0x275422: (0x810F, 0),  # East Asian ideograph (duplicate simplified)
    0x222E71: (0x61E0, 0),  # East Asian ideograph
    0x2D3E40: (0x6052, 0),  # East Asian ideograph
    0x6F5644: (0xC6C5, 0),  # Korean hangul
    0x28702E: (0x56E2, 0),  # East Asian ideograph (duplicate simplified)
    0x6F497B: (0xAD8C, 0),  # Korean hangul
    0x6F4A65: (0xAEF4, 0),  # Korean hangul
    0x455164: (0x53BF, 0),  # East Asian ideograph
    0x215921: (0x8AC2, 0),  # East Asian ideograph
    0x222E77: (0x61E5, 0),  # East Asian ideograph
    0x275922: (0x8C01, 0),  # East Asian ideograph
    0x275923: (0x8BDE, 0),  # East Asian ideograph
    0x232652: (0x85A2, 0),  # East Asian ideograph
    0x6F552F: (0xC564, 0),  # Korean hangul
    0x216E79: (0x5454, 0),  # East Asian ideograph
    0x275924: (0x8BBA, 0),  # East Asian ideograph
    0x235925: (0x9C32, 0),  # East Asian ideograph
    0x215926: (0x8AFA, 0),  # East Asian ideograph
    0x275927: (0x8C0F, 0),  # East Asian ideograph
    0x216E7D: (0x543D, 0),  # East Asian ideograph
    0x235928: (0x9C48, 0),  # East Asian ideograph
    0x282E7E: (0x603C, 0),  # East Asian ideograph
    0x215929: (0x8AE7, 0),  # East Asian ideograph
    0x275868: (0x8BDF, 0),  # East Asian ideograph
    0x6F505D: (0xBBC8, 0),  # Korean hangul
    0x23592A: (0x9C33, 0),  # East Asian ideograph
    0x21592B: (0x8B00, 0),  # East Asian ideograph
    0x6F5B72: (0xD31D, 0),  # Korean hangul
    0x27592C: (0x8C12, 0),  # East Asian ideograph
    0x6F5647: (0xC6D0, 0),  # Korean hangul
    0x29416B: (0x948E, 0),  # East Asian ideograph
    0x213E47: (0x6064, 0),  # East Asian ideograph
    0x23486D: (0x9471, 0),  # East Asian ideograph
    0x27592E: (0x8BFA, 0),  # East Asian ideograph
    0x22592F: (0x73D4, 0),  # East Asian ideograph
    0x27493D: (0x6F47, 0),  # East Asian ideograph
    0x233761: (0x8D84, 0),  # East Asian ideograph
    0x215930: (0x8AED, 0),  # East Asian ideograph
    0x335A7B: (0x8E28, 0),  # East Asian ideograph
    0x275931: (0x8C24, 0),  # East Asian ideograph
    0x6F5648: (0xC6D4, 0),  # Korean hangul
    0x697174: (0x9ADE, 0),  # East Asian ideograph
    0x235932: (0x9C35, 0),  # East Asian ideograph
    0x275933: (0x8C1C, 0),  # East Asian ideograph
    0x27586A: (0x8BF5, 0),  # East Asian ideograph
    0x215934: (0x8B1B, 0),  # East Asian ideograph
    0x215935: (0x8B0A, 0),  # East Asian ideograph
    0x225936: (0x73E7, 0),  # East Asian ideograph
    0x6F5649: (0xC6DC, 0),  # Korean hangul
    0x275937: (0x8A8A, 0),  # East Asian ideograph
    0x215938: (0x8B1D, 0),  # East Asian ideograph
    0x27586B: (0x8BEB, 0),  # East Asian ideograph
    0x6F4A66: (0xAF0D, 0),  # Korean hangul
    0x282F66: (0x6217, 0),  # East Asian ideograph
    0x215939: (0x8B39, 0),  # East Asian ideograph
    0x22513A: (0x70D0, 0),  # East Asian ideograph
    0x21593A: (0x8B2C, 0),  # East Asian ideograph
    0x21593B: (0x8B28, 0),  # East Asian ideograph
    0x6F564A: (0xC6DD, 0),  # Korean hangul
    0x224471: (0x6B82, 0),  # East Asian ideograph
    0x21593C: (0x8B58, 0),  # East Asian ideograph
    0x27593D: (0x8C31, 0),  # East Asian ideograph
    0x6F5138: (0xBCB3, 0),  # Korean hangul
    0x27586C: (0x8BED, 0),  # East Asian ideograph
    0x27593E: (0x8C32, 0),  # East Asian ideograph
    0x22513B: (0x70C7, 0),  # East Asian ideograph
    0x22593F: (0x73E9, 0),  # East Asian ideograph
    0x274E5B: (0x77FF, 0),  # East Asian ideograph
    0x215940: (0x8B5A, 0),  # East Asian ideograph
    0x6F564B: (0xC6DF, 0),  # Korean hangul
    0x395577: (0x854B, 0),  # East Asian ideograph
    0x213C30: (0x5DCD, 0),  # East Asian ideograph
    0x215942: (0x8B4F, 0),  # East Asian ideograph
    0x6F573B: (0xC813, 0),  # Korean hangul
    0x275943: (0x8BAE, 0),  # East Asian ideograph
    0x22472C: (0x6C54, 0),  # East Asian ideograph
    0x22513C: (0x70DA, 0),  # East Asian ideograph
    0x6F5944: (0xCCBC, 0),  # Korean hangul
    0x2D435F: (0x6716, 0),  # East Asian ideograph
    0x6F5B73: (0xD31F, 0),  # Korean hangul
    0x235945: (0x9C51, 0),  # East Asian ideograph
    0x6F564C: (0xC6E0, 0),  # Korean hangul
    0x69255A: (0x30DA, 0),  # Katakana letter PE
    0x213C31: (0x5DD2, 0),  # East Asian ideograph
    0x215947: (0x8B74, 0),  # East Asian ideograph
    0x215948: (0x8B77, 0),  # East Asian ideograph
    0x2E4C7B: (0x6E86, 0),  # East Asian ideograph
    0x22513D: (0x70C6, 0),  # East Asian ideograph
    0x235949: (0x9C63, 0),  # East Asian ideograph
    0x333323: (0x4E21, 0),  # East Asian ideograph
    0x22594A: (0x73F8, 0),  # East Asian ideograph
    0x6F564D: (0xC6E1, 0),  # Korean hangul
    0x6F5275: (0xC0DB, 0),  # Korean hangul
    0x27594B: (0x53D8, 0),  # East Asian ideograph
    0x21594C: (0x8B93, 0),  # East Asian ideograph
    0x27594D: (0x8C36, 0),  # East Asian ideograph
    0x28582B: (0x7303, 0),  # East Asian ideograph
    0x27594E: (0x8C17, 0),  # East Asian ideograph
    0x21594F: (0x8B9A, 0),  # East Asian ideograph
    0x6F564E: (0xC6E8, 0),  # Korean hangul
    0x4B3C2F: (0x5DBA, 0),  # East Asian ideograph
    0x287030: (0x7C9D, 0),  # East Asian ideograph
    0x213C33: (0x5DD6, 0),  # East Asian ideograph
    0x6F5A2C: (0xCEF9, 0),  # Korean hangul
    0x2D3253: (0x50E3, 0),  # East Asian ideograph
    0x6F4A67: (0xAF2C, 0),  # Korean hangul
    0x6F5952: (0xCD78, 0),  # Korean hangul
    0x333768: (0x8FF4, 0),  # East Asian ideograph
    0x21373F: (0x5659, 0),  # East Asian ideograph
    0x393439: (0x61C3, 0),  # East Asian ideograph
    0x215954: (0x8C48, 0),  # East Asian ideograph
    0x395652: (0x87A1, 0),  # East Asian ideograph
    0x215955: (0x8C49, 0),  # East Asian ideograph
    0x215956: (0x8C4C, 0),  # East Asian ideograph
    0x396167: (0x9B2A, 0),  # East Asian ideograph
    0x706B5B: (0x810E, 0),  # East Asian ideograph
    0x275957: (0x7AD6, 0),  # East Asian ideograph
    0x215958: (0x8C50, 0),  # East Asian ideograph
    0x474931: (0x95F6, 0),  # East Asian ideograph
    0x2D5959: (0x8277, 0),  # East Asian ideograph
    0x213665: (0x558A, 0),  # East Asian ideograph
    0x22595A: (0x73FD, 0),  # East Asian ideograph
    0x6F4E32: (0xB5A4, 0),  # Korean hangul
    0x217C24: (0x5AA7, 0),  # East Asian ideograph
    0x2F5973: (0x9CEC, 0),  # East Asian ideograph
    0x6F595B: (0xCDB0, 0),  # Korean hangul
    0x21595C: (0x8C62, 0),  # East Asian ideograph
    0x4B4655: (0x6C17, 0),  # East Asian ideograph
    0x6F595D: (0xCDCC, 0),  # Korean hangul
    0x455D3E: (0x9485, 0),  # East Asian ideograph
    0x6F5B74: (0xD320, 0),  # Korean hangul
    0x21595E: (0x8C6B, 0),  # East Asian ideograph
    0x6F5651: (0xC6F0, 0),  # Korean hangul
    0x69717D: (0x9AF1, 0),  # East Asian ideograph
    0x2D595F: (0x732A, 0),  # East Asian ideograph
    0x2D5960: (0x72B2, 0),  # East Asian ideograph
    0x6F5731: (0xC7C9, 0),  # Korean hangul
    0x513A47: (0x8885, 0),  # East Asian ideograph
    0x6F5962: (0xCE30, 0),  # Korean hangul
    0x39505B: (0x9B3B, 0),  # East Asian ideograph
    0x215963: (0x8C8A, 0),  # East Asian ideograph
    0x6F5652: (0xC6F8, 0),  # Korean hangul
    0x224479: (0x6B8D, 0),  # East Asian ideograph
    0x4B5964: (0x72E2, 0),  # East Asian ideograph
    0x234435: (0x92DD, 0),  # East Asian ideograph
    0x2D5965: (0x72F8, 0),  # East Asian ideograph
    0x2D3D48: (0x5F4A, 0),  # East Asian ideograph
    0x275966: (0x7683, 0),  # East Asian ideograph
    0x213F79: (0x6249, 0),  # East Asian ideograph
    0x215967: (0x8C93, 0),  # East Asian ideograph
    0x215968: (0x8C9D, 0),  # East Asian ideograph
    0x295B77: (0x9E63, 0),  # East Asian ideograph
    0x215969: (0x8C9E, 0),  # East Asian ideograph
    0x217C27: (0x5A9C, 0),  # East Asian ideograph
    0x6F5C2D: (0xD399, 0),  # Korean hangul
    0x27596A: (0x8D1F, 0),  # East Asian ideograph
    0x6F4A68: (0xAF2D, 0),  # Korean hangul
    0x706B5F: (0x8112, 0),  # East Asian ideograph
    0x21596B: (0x8CA2, 0),  # East Asian ideograph
    0x52735D: (
        0x7E8A,
        0,
    ),  # East Asian ideograph (variant of 22735D which maps to 7E8A)
    0x695C30: (0x6923, 0),  # East Asian ideograph
    0x225144: (0x7104, 0),  # East Asian ideograph
    0x22596C: (0x7430, 0),  # East Asian ideograph
    0x33332A: (0x4E93, 0),  # East Asian ideograph
    0x21596D: (0x8CAC, 0),  # East Asian ideograph
    0x21596E: (0x8CAB, 0),  # East Asian ideograph
    0x217C28: (0x5A7C, 0),  # East Asian ideograph
    0x697260: (0x9C30, 0),  # East Asian ideograph
    0x27596F: (0x8D27, 0),  # East Asian ideograph
    0x215970: (0x8CAA, 0),  # East Asian ideograph
    0x695C31: (0x6921, 0),  # East Asian ideograph
    0x215971: (0x8CA7, 0),  # East Asian ideograph
    0x6F5C4F: (0xD48B, 0),  # Korean hangul
    0x275E46: (0x9576, 0),  # East Asian ideograph
    0x215972: (0x8CA9, 0),  # East Asian ideograph
    0x215973: (0x8CAF, 0),  # East Asian ideograph
    0x217C29: (0x5A96, 0),  # East Asian ideograph
    0x6F5974: (0xCE85, 0),  # Korean hangul
    0x275975: (0x8D39, 0),  # East Asian ideograph
    0x6F5060: (0xBBF9, 0),  # Korean hangul
    0x4B465A: (0x6C32, 0),  # East Asian ideograph
    0x275976: (0x8D32, 0),  # East Asian ideograph
    0x234421: (0x92C6, 0),  # East Asian ideograph
    0x215977: (0x8CC0, 0),  # East Asian ideograph
    0x6F5656: (0xC70C, 0),  # Korean hangul
    0x277748: (0x57B2, 0),  # East Asian ideograph
    0x215978: (0x8CB4, 0),  # East Asian ideograph
    0x275979: (0x8D34, 0),  # East Asian ideograph
    0x295B2A: (0x9E46, 0),  # East Asian ideograph
    0x6F503E: (0xBAB0, 0),  # Korean hangul
    0x21597A: (0x8CB7, 0),  # East Asian ideograph
    0x234425: (0x92F4, 0),  # East Asian ideograph
    0x27597B: (0x8D2C, 0),  # East Asian ideograph
    0x274426: (0x4E1C, 0),  # East Asian ideograph
    0x27597C: (0x8D3B, 0),  # East Asian ideograph
    0x6F5657: (0xC714, 0),  # Korean hangul
    0x234427: (0x92CF, 0),  # East Asian ideograph
    0x292D51: (0x8511, 0),  # East Asian ideograph
    0x21597D: (0x8CB8, 0),  # East Asian ideograph
    0x23443A: (0x92CA, 0),  # East Asian ideograph
    0x27597E: (0x8D38, 0),  # East Asian ideograph
    0x23442A: (0x92B2, 0),  # East Asian ideograph
    0x225148: (0x70F3, 0),  # East Asian ideograph
    0x29442B: (0x9503, 0),  # East Asian ideograph
    0x6F5324: (0xC120, 0),  # Korean hangul
    0x6F5658: (0xC717, 0),  # Korean hangul
    0x23442C: (0x92E7, 0),  # East Asian ideograph
    0x294F6B: (0x98A1, 0),  # East Asian ideograph
    0x696D41: (0x8EC8, 0),  # East Asian ideograph
    0x23442D: (0x92C7, 0),  # East Asian ideograph
    0x277D40: (0x5AF1, 0),  # East Asian ideograph
    0x2D3D4E: (0x7BF2, 0),  # East Asian ideograph
    0x23442E: (0x92F0, 0),  # East Asian ideograph
    0x6F4A69: (0xAF30, 0),  # Korean hangul
    0x23442F: (0x92DB, 0),  # East Asian ideograph
    0x6F4E5E: (0xB768, 0),  # Korean hangul
    0x234430: (0x92DC, 0),  # East Asian ideograph
    0x2D4E5B: (0x945B, 0),  # East Asian ideograph
    0x234431: (0x92D8, 0),  # East Asian ideograph
    0x224432: (0x6B39, 0),  # East Asian ideograph
    0x234433: (0x92E9, 0),  # East Asian ideograph
    0x224435: (0x6B3F, 0),  # East Asian ideograph
    0x274E5E: (0x783E, 0),  # East Asian ideograph
    0x6F565A: (0xC720, 0),  # Korean hangul
    0x27375A: (0x4E25, 0),  # East Asian ideograph
    0x224437: (0x6B46, 0),  # East Asian ideograph
    0x2D3D50: (0x5F5C, 0),  # East Asian ideograph
    0x224438: (0x6B41, 0),  # East Asian ideograph
    0x234439: (0x92D1, 0),  # East Asian ideograph
    0x6F5061: (0xBBFC, 0),  # Korean hangul
    0x283561: (0x64BA, 0),  # East Asian ideograph
    0x22443A: (0x6B40, 0),  # East Asian ideograph
    0x6F565B: (0xC721, 0),  # Korean hangul
    0x22443B: (0x6B42, 0),  # East Asian ideograph
    0x6F5973: (0xCE84, 0),  # Korean hangul
    0x6F4C7E: (0xB301, 0),  # Korean hangul
    0x23443C: (0x92C2, 0),  # East Asian ideograph
    0x6F4F29: (0xB810, 0),  # Korean hangul
    0x454C3C: (0x7589, 0),  # East Asian ideograph
    0x6F5733: (0xC7D8, 0),  # Korean hangul
    0x23443E: (0x92CC, 0),  # East Asian ideograph
    0x22443F: (0x6B4A, 0),  # East Asian ideograph
    0x235B60: (0x9D98, 0),  # East Asian ideograph
    0x2E525D: (0x715B, 0),  # East Asian ideograph
    0x6F565C: (0xC724, 0),  # Korean hangul
    0x234440: (0x92EF, 0),  # East Asian ideograph
    0x213C41: (0x5DF7, 0),  # East Asian ideograph
    0x234441: (0x92E8, 0),  # East Asian ideograph
    0x6F5D35: (0xD61C, 0),  # Korean hangul
    0x287739: (0x8069, 0),  # East Asian ideograph
    0x27587E: (0x8BFF, 0),  # East Asian ideograph
    0x234443: (0x92EB, 0),  # East Asian ideograph
    0x695C39: (0x697E, 0),  # East Asian ideograph
    0x295D36: (0x9E2C, 0),  # East Asian ideograph
    0x2D4444: (0x69C5, 0),  # East Asian ideograph
    0x6F565D: (0xC728, 0),  # Korean hangul
    0x234445: (0x92F5, 0),  # East Asian ideograph
    0x224446: (
        0x6B4E,
        0,
    ),  # East Asian ideograph (variant of 4C4446 which maps to 6B4E)
    0x6F4A6A: (0xAF34, 0),  # Korean hangul
    0x234448: (0x92F2, 0),  # East Asian ideograph
    0x28422B: (0x6A2F, 0),  # East Asian ideograph
    0x334449: (0x6144, 0),  # East Asian ideograph
    0x22444A: (0x6B57, 0),  # East Asian ideograph
    0x2D444B: (0x6852, 0),  # East Asian ideograph
    0x6F5530: (0xC568, 0),  # Korean hangul
    0x6F513C: (0xBCC0, 0),  # Korean hangul
    0x22444C: (0x6B54, 0),  # East Asian ideograph
    0x23444D: (0x9307, 0),  # East Asian ideograph
    0x22444E: (0x6B55, 0),  # East Asian ideograph
    0x6F5C51: (0xD4CC, 0),  # Korean hangul
    0x515E5D: (0x9616, 0),  # East Asian ideograph
    0x2D4450: (0x8308, 0),  # East Asian ideograph
    0x224451: (0x6B5C, 0),  # East Asian ideograph
    0x287A56: (0x8114, 0),  # East Asian ideograph
    0x6F5062: (0xBBFF, 0),  # Korean hangul
    0x212B38: (0xFF0C, 0),  # Ideographic variant comma
    0x225150: (0x70F4, 0),  # East Asian ideograph
    0x23554F: (0x9B10, 0),  # East Asian ideograph
    0x224453: (0x6B5E, 0),  # East Asian ideograph
    0x6F5B77: (0xD328, 0),  # Korean hangul
    0x224454: (0x6B60, 0),  # East Asian ideograph
    0x22625D: (0x777E, 0),  # East Asian ideograph
    0x217C34: (0x5AAE, 0),  # East Asian ideograph
    0x4B4456: (0x6813, 0),  # East Asian ideograph
    0x6F5734: (0xC800, 0),  # Korean hangul
    0x294457: (0x9529, 0),  # East Asian ideograph
    0x212B39: (0xFF1B, 0),  # Ideographic semicolon
    0x234458: (0x931F, 0),  # East Asian ideograph
    0x6F5661: (0xC73C, 0),  # Korean hangul
    0x23445A: (0x9331, 0),  # East Asian ideograph
    0x4D5F70: (0x9F44, 0),  # East Asian ideograph
    0x22445B: (0x6B6B, 0),  # East Asian ideograph
    0x22736B: (0x7E95, 0),  # East Asian ideograph
    0x22445D: (0x6B6C, 0),  # East Asian ideograph
    0x4C284C: (0x53A9, 0),  # East Asian ideograph
    0x4B3C33: (0x5DCC, 0),  # East Asian ideograph
    0x215E60: (0x95BB, 0),  # East Asian ideograph
    0x23445F: (0x930F, 0),  # East Asian ideograph
    0x6F4A6B: (0xAF3C, 0),  # Korean hangul
    0x224461: (0x6B71, 0),  # East Asian ideograph
    0x6F5D2C: (0xD600, 0),  # Korean hangul
    0x234462: (0x9302, 0),  # East Asian ideograph
    0x6F5170: (0xBE4B, 0),  # Korean hangul
    0x274463: (0x6761, 0),  # East Asian ideograph
    0x234464: (0x9324, 0),  # East Asian ideograph
    0x2D5B2F: (0x8EB1, 0),  # East Asian ideograph
    0x214466: (0x6885, 0),  # East Asian ideograph
    0x274468: (0x67AD, 0),  # East Asian ideograph
    0x294F77: (0x989F, 0),  # East Asian ideograph
    0x6F5221: (0xBE70, 0),  # Korean hangul
    0x6F4B7A: (0xB11D, 0),  # Korean hangul
    0x274469: (0x6800, 0),  # East Asian ideograph
    0x2D5F73: (0x975A, 0),  # Unrelated variant of EACC 234C76 which maps to 975A
    0x23446A: (0x9323, 0),  # East Asian ideograph
    0x22446B: (0x6B7E, 0),  # East Asian ideograph
    0x212B3D: (0xFF01, 0),  # Ideographic exclamation point
    0x225155: (0x7111, 0),  # East Asian ideograph
    0x23446C: (0x9321, 0),  # East Asian ideograph
    0x4C683E: (0x79EB, 0),  # East Asian ideograph
    0x27446D: (0x5F03, 0),  # East Asian ideograph
    0x6F5222: (0xBE71, 0),  # Korean hangul
    0x27446E: (0x6816, 0),  # East Asian ideograph
    0x2D4E79: (0x5FA1, 0),  # East Asian ideograph
    0x6F5735: (0xC801, 0),  # Korean hangul
    0x2D4B43: (0x746F, 0),  # East Asian ideograph
    0x274471: (0x680B, 0),  # East Asian ideograph
    0x4B5A68: (
        0x8DF5,
        0,
    ),  # East Asian ideograph (variant of 275A68 which maps to 8DF5)
    0x234472: (0x9301, 0),  # East Asian ideograph
    0x6F5223: (0xBE73, 0),  # Korean hangul
    0x6F5326: (0xC124, 0),  # Korean hangul
    0x224473: (0x6B84, 0),  # East Asian ideograph
    0x2D3332: (0x5190, 0),  # East Asian ideograph
    0x234474: (0x9315, 0),  # East Asian ideograph
    0x47366F: (0x8D4D, 0),  # East Asian ideograph
    0x294475: (0x9494, 0),  # East Asian ideograph
    0x235556: (0x9B1D, 0),  # East Asian ideograph
    0x234476: (0x9329, 0),  # East Asian ideograph
    0x23386F: (0x8DBA, 0),  # East Asian ideograph
    0x232F21: (0x88FC, 0),  # East Asian ideograph
    0x2D4A26: (0x713C, 0),  # East Asian ideograph
    0x287035: (0x7C74, 0),  # East Asian ideograph
    0x6F5224: (0xBE74, 0),  # Korean hangul
    0x234478: (0x932E, 0),  # East Asian ideograph
    0x234479: (0x932A, 0),  # East Asian ideograph
    0x6F4A6C: (0xAF3D, 0),  # Korean hangul
    0x27447A: (0x67A3, 0),  # East Asian ideograph
    0x6F5D2D: (0xD601, 0),  # Korean hangul
    0x22447B: (0x6B95, 0),  # East Asian ideograph
    0x21447C: (0x6912, 0),  # East Asian ideograph
    0x216F27: (0x5423, 0),  # East Asian ideograph
    0x213C4D: (0x5E11, 0),  # East Asian ideograph
    0x2D447D: (0x684C, 0),  # East Asian ideograph
    0x2D3D5E: (0x9AF4, 0),  # East Asian ideograph
    0x23447E: (0x9335, 0),  # East Asian ideograph
    0x706058: (0x562D, 0),  # East Asian ideograph
    0x273671: (0x54DF, 0),  # East Asian ideograph
    0x6F5226: (0xBE7B, 0),  # Korean hangul
    0x232F2D: (0x8909, 0),  # East Asian ideograph
    0x23444C: (0x9303, 0),  # East Asian ideograph
    0x4D5B35: (0x9DAB, 0),  # East Asian ideograph
    0x232F2F: (0x8918, 0),  # East Asian ideograph
    0x6F5B79: (0xD32C, 0),  # Korean hangul
    0x213D3C: (0x5F15, 0),  # East Asian ideograph
    0x6F566A: (0xC774, 0),  # Korean hangul
    0x6F5227: (0xBE7C, 0),  # Korean hangul
    0x213C4F: (0x5E25, 0),  # East Asian ideograph
    0x2D3632: (0x8A7B, 0),  # East Asian ideograph
    0x346622: (0x589D, 0),  # East Asian ideograph
    0x295C47: (0x9E68, 0),  # East Asian ideograph
    0x293A2E: (0x8DC4, 0),  # East Asian ideograph
    0x2E6F35: (0x6CD4, 0),  # East Asian ideograph
    0x6F566B: (0xC775, 0),  # Korean hangul
    0x6F5228: (0xBE7D, 0),  # Korean hangul
    0x22516D: (0x7134, 0),  # East Asian ideograph
    0x23444E: (0x931E, 0),  # East Asian ideograph
    0x2F5D49: (0x9EA4, 0),  # East Asian ideograph
    0x2E313A: (0x6332, 0),  # East Asian ideograph
    0x216F3A: (0x546D, 0),  # East Asian ideograph
    0x6F566C: (0xC778, 0),  # Korean hangul
    0x282458: (0x5D03, 0),  # East Asian ideograph
    0x216F3B: (0x5491, 0),  # East Asian ideograph
    0x6F5229: (0xBE80, 0),  # Korean hangul
    0x4D5F7B: (0x97F2, 0),  # East Asian ideograph
    0x222F3D: (0x6201, 0),  # East Asian ideograph
    0x295C49: (0x9E47, 0),  # East Asian ideograph
    0x4B577E: (0x7E7F, 0),  # East Asian ideograph
    0x217C41: (0x5AC4, 0),  # East Asian ideograph
    0x215A28: (0x8CC2, 0),  # East Asian ideograph
    0x697265: (0x9C5A, 0),  # East Asian ideograph
    0x216F42: (0x5494, 0),  # East Asian ideograph
    0x232F43: (0x8915, 0),  # East Asian ideograph
    0x333344: (0x51DB, 0),  # East Asian ideograph
    0x6F566E: (0xC77D, 0),  # Korean hangul
    0x274340: (0x6656, 0),  # East Asian ideograph
    0x6F522B: (0xBE8C, 0),  # Korean hangul
    0x213C53: (0x5E36, 0),  # East Asian ideograph
    0x4C5175: (0x8315, 0),  # East Asian ideograph
    0x225E37: (0x75A2, 0),  # East Asian ideograph
    0x222F47: (0x6214, 0),  # East Asian ideograph
    0x2D3921: (0x591F, 0),  # East Asian ideograph
    0x233345: (0x8AE2, 0),  # East Asian ideograph
    0x216F49: (0x548D, 0),  # East Asian ideograph
    0x355D5C: (0x8C8E, 0),  # East Asian ideograph
    0x6F566F: (0xC783, 0),  # Korean hangul
    0x216F4A: (0x5463, 0),  # East Asian ideograph
    0x6F522C: (0xBE8F, 0),  # Korean hangul
    0x6F5737: (0xC808, 0),  # Korean hangul
    0x225160: (0x70F6, 0),  # East Asian ideograph
    0x6F5670: (0xC784, 0),  # Korean hangul
    0x234453: (0x931D, 0),  # East Asian ideograph
    0x216F7B: (0x551A, 0),  # East Asian ideograph
    0x6F5D68: (0xD744, 0),  # Korean hangul
    0x6F5671: (0xC785, 0),  # Korean hangul
    0x6F522E: (0xBE91, 0),  # Korean hangul
    0x294427: (0x94D7, 0),  # East Asian ideograph
    0x234454: (0x92FA, 0),  # East Asian ideograph
    0x2D3D67: (0x9015, 0),  # East Asian ideograph
    0x6F4A6E: (0xAF41, 0),  # Korean hangul
    0x222F56: (0x6223, 0),  # East Asian ideograph
    0x6F4F43: (0xB8E8, 0),  # Korean hangul
    0x6F5D2F: (0xD608, 0),  # Korean hangul
    0x335561: (0x8462, 0),  # East Asian ideograph
    0x216F58: (0x54A1, 0),  # East Asian ideograph
    0x6F5672: (0xC787, 0),  # Korean hangul
    0x274344: (0x6682, 0),  # East Asian ideograph
    0x6F522F: (0xBE98, 0),  # Korean hangul
    0x213C57: (0x5E3D, 0),  # East Asian ideograph
    0x4B356A: (0x55EC, 0),  # East Asian ideograph
    0x23223C: (0x83F3, 0),  # East Asian ideograph
    0x696F5B: (0x958A, 0),  # East Asian ideograph
    0x273238: (0x4FA6, 0),  # East Asian ideograph
    0x695C4F: (0x69DD, 0),  # East Asian ideograph
    0x222F5D: (0x6224, 0),  # East Asian ideograph
    0x6F5673: (0xC788, 0),  # Korean hangul
    0x216F5E: (0x54BE, 0),  # East Asian ideograph
    0x6F5230: (0xBEA8, 0),  # Korean hangul
    0x213C58: (0x5E40, 0),  # East Asian ideograph
    0x692433: (0x3053, 0),  # Hiragana letter KO
    0x292F60: (0x88E2, 0),  # East Asian ideograph
    0x6F5066: (0xBC0B, 0),  # Korean hangul
    0x4C2F61: (0x622C, 0),  # East Asian ideograph
    0x4B4235: (0x6442, 0),  # East Asian ideograph
    0x6F5B7B: (0xD338, 0),  # Korean hangul
    0x6F5C32: (0xD3AB, 0),  # Korean hangul
    0x6F5231: (0xBED0, 0),  # Korean hangul
    0x213C59: (0x5E4C, 0),  # East Asian ideograph
    0x216F64: (0x54B5, 0),  # East Asian ideograph
    0x225E2E: (0x7594, 0),  # East Asian ideograph
    0x6F5738: (0xC80A, 0),  # Korean hangul
    0x2D3F24: (0x661A, 0),  # East Asian ideograph
    0x226F66: (0x7CCE, 0),  # East Asian ideograph
    0x4B4236: (0x643A, 0),  # East Asian ideograph
    0x6F5A30: (0xCF04, 0),  # Korean hangul
    0x2D4A34: (0x718F, 0),  # East Asian ideograph
    0x226F68: (0x7CC8, 0),  # East Asian ideograph
    0x6F5A28: (0xCEF4, 0),  # Korean hangul
    0x6F5232: (0xBED1, 0),  # Korean hangul
    0x222F69: (0x97EF, 0),  # East Asian ideograph
    0x333428: (0x523C, 0),  # East Asian ideograph
    0x6F5676: (0xC78E, 0),  # Korean hangul
    0x216F6D: (0x54AE, 0),  # East Asian ideograph
    0x6F5233: (0xBED4, 0),  # Korean hangul
    0x2D3D6C: (0x5F93, 0),  # East Asian ideograph
    0x6F4A6F: (0xAF42, 0),  # Korean hangul
    0x232F6F: (0x894F, 0),  # East Asian ideograph
    0x2D5B42: (0x8F19, 0),  # East Asian ideograph
    0x393E7D: (0x7609, 0),  # East Asian ideograph
    0x695C53: (0x6A2E, 0),  # East Asian ideograph
    0x225167: (0x70EF, 0),  # East Asian ideograph
    0x235566: (0x9B23, 0),  # East Asian ideograph
    0x216F71: (0x54BF, 0),  # East Asian ideograph
    0x6F5677: (0xC655, 0),  # Korean hangul
    0x292F72: (0x88E5, 0),  # East Asian ideograph
    0x6F5234: (0xBED7, 0),  # Korean hangul
    0x213C5C: (0x5E57, 0),  # East Asian ideograph
    0x4D2F73: (0x7E5D, 0),  # East Asian ideograph
    0x6F4F4C: (0xB93C, 0),  # Korean hangul
    0x2D5B43: (0x8EFD, 0),  # East Asian ideograph
    0x226F75: (0x7CD7, 0),  # East Asian ideograph
    0x225168: (0x7100, 0),  # East Asian ideograph
    0x33334E: (0x51FE, 0),  # East Asian ideograph
    0x225A21: (0x7428, 0),  # East Asian ideograph
    0x215A22: (0x8CC7, 0),  # East Asian ideograph
    0x23445B: (0x9306, 0),  # East Asian ideograph
    0x215A23: (0x8CCA, 0),  # East Asian ideograph
    0x6F536C: (0xC274, 0),  # Korean hangul
    0x4B312D: (0x4F2B, 0),  # East Asian ideograph
    0x235A24: (0x9D04, 0),  # East Asian ideograph
    0x21322A: (0x5003, 0),  # East Asian ideograph
    0x222F7A: (0x6250, 0),  # East Asian ideograph
    0x215A25: (0x8CC4, 0),  # East Asian ideograph
    0x6F5D60: (0xD71C, 0),  # Korean hangul
    0x335568: (0x8406, 0),  # East Asian ideograph
    0x226F7B: (
        0x7CE8,
        0,
    ),  # East Asian ideograph (variant of 4C6F7B which maps to 7CE8)
    0x6F5B7C: (0xD339, 0),  # Korean hangul
    0x275A26: (0x8D40, 0),  # East Asian ideograph
    0x6F5679: (0xC790, 0),  # Korean hangul
    0x2E2F7C: (0x634D, 0),  # East Asian ideograph
    0x215A27: (0x8CC3, 0),  # East Asian ideograph
    0x213C5E: (0x5E63, 0),  # East Asian ideograph
    0x276121: (0x998A, 0),  # East Asian ideograph
    0x2D6F7D: (0x8123, 0),  # East Asian ideograph
    0x235A28: (0x9D07, 0),  # East Asian ideograph
    0x2D4472: (0x68CA, 0),  # East Asian ideograph
    0x215A29: (0x8CD3, 0),  # East Asian ideograph
    0x215A2A: (0x8CD1, 0),  # East Asian ideograph
    0x217D2E: (0x5B0D, 0),  # East Asian ideograph
    0x215A2B: (0x8CD2, 0),  # East Asian ideograph
    0x395063: (0x9939, 0),  # East Asian ideograph
    0x6F567A: (0xC791, 0),  # Korean hangul
    0x275A2C: (0x8D54, 0),  # East Asian ideograph
    0x23445D: (0x92F9, 0),  # East Asian ideograph
    0x215A2D: (0x8CE6, 0),  # East Asian ideograph
    0x295C57: (0x9E6B, 0),  # East Asian ideograph
    0x215A2F: (0x8CE3, 0),  # East Asian ideograph
    0x213076: (0x4ED9, 0),  # East Asian ideograph
    0x215A30: (0x8CE2, 0),  # East Asian ideograph
    0x4B3C38: (0x949C, 0),  # East Asian ideograph
    0x275A31: (0x8D31, 0),  # East Asian ideograph
    0x276123: (0x9992, 0),  # East Asian ideograph
    0x225A32: (0x743B, 0),  # East Asian ideograph
    0x4B3130: (0x4FAB, 0),  # East Asian ideograph
    0x6F4A70: (0xAF43, 0),  # Korean hangul
    0x215A33: (0x8CDC, 0),  # East Asian ideograph
    0x275A34: (0x8D28, 0),  # East Asian ideograph
    0x215A35: (0x8CED, 0),  # East Asian ideograph
    0x2D4A3B: (0x4E89, 0),  # East Asian ideograph
    0x225A36: (0x7444, 0),  # East Asian ideograph
    0x275A37: (0x8D5B, 0),  # East Asian ideograph
    0x215A38: (0x8CFA, 0),  # East Asian ideograph
    0x215A39: (0x8D05, 0),  # East Asian ideograph
    0x293A40: (0x8DF8, 0),  # East Asian ideograph
    0x23556C: (0x9B29, 0),  # East Asian ideograph
    0x215A3A: (0x8CFC, 0),  # East Asian ideograph
    0x215A3B: (
        0x8D08,
        0,
    ),  # East Asian ideograph (variant of 4B5A3B which maps to 8D08)
    0x6F5352: (0xC1F0, 0),  # Korean hangul
    0x215A3C: (0x8D0B, 0),  # East Asian ideograph
    0x215A3D: (0x8D0A, 0),  # East Asian ideograph
    0x215A3E: (0x8D0F, 0),  # East Asian ideograph
    0x6F5B7D: (0xD33B, 0),  # Korean hangul
    0x215A3F: (0x8D0D, 0),  # East Asian ideograph
    0x6F567E: (0xC7A0, 0),  # Korean hangul
    0x213D40: (0x5F1B, 0),  # East Asian ideograph
    0x215A40: (0x8D13, 0),  # East Asian ideograph
    0x276126: (0x990D, 0),  # East Asian ideograph
    0x215A41: (0x8D16, 0),  # East Asian ideograph
    0x215A42: (0x8D1B, 0),  # East Asian ideograph
    0x295C5B: (0x9E6C, 0),  # East Asian ideograph
    0x225A43: (0x7458, 0),  # East Asian ideograph
    0x235A44: (0x9D1D, 0),  # East Asian ideograph
    0x225A45: (0x7442, 0),  # East Asian ideograph
    0x6F5A46: (0xCF71, 0),  # Korean hangul
    0x2D3D75: (0x60EA, 0),  # East Asian ideograph
    0x2E4174: (0x6AA9, 0),  # East Asian ideograph
    0x225A47: (0x744B, 0),  # East Asian ideograph
    0x215A48: (0x8D70, 0),  # East Asian ideograph
    0x6F5660: (0xC737, 0),  # Korean hangul
    0x337345: (0x9F67, 0),  # East Asian ideograph
    0x6F5A49: (0xCF80, 0),  # Korean hangul
    0x225A4A: (0x744A, 0),  # East Asian ideograph
    0x213C65: (0x5E74, 0),  # East Asian ideograph
    0x6F5A4B: (0xCF8C, 0),  # Korean hangul
    0x6F5938: (0xCC71, 0),  # Korean hangul
    0x2D3D76: (0x5FB4, 0),  # East Asian ideograph
    0x2D5476: (0x8318, 0),  # East Asian ideograph
    0x6F5A4C: (0xCF8D, 0),  # Korean hangul
    0x6F5573: (0xC628, 0),  # Korean hangul
    0x6F5A4D: (0xCFA1, 0),  # Korean hangul
    0x2D5A4E: (0x8D82, 0),  # East Asian ideograph
    0x215A4F: (0x8D99, 0),  # East Asian ideograph
    0x4B3864: (0x58C7, 0),  # East Asian ideograph
    0x275A50: (0x8D76, 0),  # East Asian ideograph
    0x2D392F: (0x7287, 0),  # East Asian ideograph
    0x6F5A51: (0xCFE0, 0),  # Korean hangul
    0x704C2A: (0x915E, 0),  # East Asian ideograph
    0x224E37: (0x6FAF, 0),  # East Asian ideograph
    0x6F5A52: (0xCFE1, 0),  # Korean hangul
    0x6F5C58: (0xD515, 0),  # Korean hangul
    0x215A53: (0x8DA8, 0),  # East Asian ideograph
    0x6F492E: (0xAC86, 0),  # Korean hangul
    0x6F537D: (0xC2B4, 0),  # Korean hangul
    0x6F523F: (0xBF40, 0),  # Korean hangul
    0x225A55: (0x7457, 0),  # East Asian ideograph
    0x225A56: (0x7451, 0),  # East Asian ideograph
    0x6F5069: (0xBC0F, 0),  # Korean hangul
    0x6F5A57: (0xCFF5, 0),  # Korean hangul
    0x293A46: (0x8E70, 0),  # East Asian ideograph
    0x23512F: (0x9916, 0),  # East Asian ideograph
    0x4B3642: (0x8BF6, 0),  # East Asian ideograph
    0x2E4E41: (0x7032, 0),  # East Asian ideograph
    0x215A59: (0x8DDB, 0),  # East Asian ideograph
    0x6F5240: (0xBF41, 0),  # Korean hangul
    0x706131: (0x5C9C, 0),  # East Asian ideograph
    0x4B357B: (0x54CC, 0),  # East Asian ideograph
    0x225A5A: (0x745D, 0),  # East Asian ideograph
    0x225A5B: (0x7454, 0),  # East Asian ideograph
    0x225174: (0x7131, 0),  # East Asian ideograph
    0x235573: (0x9B2D, 0),  # East Asian ideograph
    0x235130: (0x9914, 0),  # East Asian ideograph
    0x33386E: (0x576F, 0),  # East Asian ideograph
    0x6F5A5E: (0xD038, 0),  # Korean hangul
    0x6F5241: (0xBF44, 0),  # Korean hangul
    0x2D5A5F: (0x8E5F, 0),  # East Asian ideograph
    0x6F5949: (0xCD09, 0),  # Korean hangul
    0x225A60: (0x746D, 0),  # East Asian ideograph
    0x277239: (0x54D4, 0),  # East Asian ideograph
    0x225A61: (0x7462, 0),  # East Asian ideograph
    0x235574: (0x9B2E, 0),  # East Asian ideograph (not in Unicode)
    0x29506C: (0x996B, 0),  # East Asian ideograph
    0x6F532F: (0xC131, 0),  # Korean hangul
    0x215A62: (0x8DF3, 0),  # East Asian ideograph
    0x215A63: (0x8DFA, 0),  # East Asian ideograph
    0x6F5242: (0xBF48, 0),  # Korean hangul
    0x27612D: (0x51AF, 0),  # East Asian ideograph
    0x6F5A64: (0xD07D, 0),  # Korean hangul
    0x4C796B: (0x815F, 0),  # East Asian ideograph
    0x235A65: (0x9D30, 0),  # East Asian ideograph
    0x275021: (0x7B0B, 0),  # East Asian ideograph
    0x235132: (0x9911, 0),  # East Asian ideograph
    0x2F3B63: (0x5E32, 0),  # East Asian ideograph (not in Unicode)
    0x2D4A45: (0x5C12, 0),  # East Asian ideograph
    0x275A68: (0x8DF5, 0),  # East Asian ideograph
    0x6F5243: (0xBF50, 0),  # Korean hangul
    0x213C6B: (0x5E7E, 0),  # East Asian ideograph
    0x215A69: (0x8E22, 0),  # East Asian ideograph
    0x225A6A: (0x7471, 0),  # East Asian ideograph
    0x225A6B: (0x7468, 0),  # East Asian ideograph
    0x4B5936: (0x8B20, 0),  # East Asian ideograph
    0x4D5A6C: (0x9D
Download .txt
gitextract_ge7g2q3u/

├── .gitignore
├── .mailmap
├── .travis.yml
├── CONTRIBUTING.md
├── LICENSE
├── MANIFEST.in
├── README.md
├── README_pt_Br.md
├── apply_headers.py
├── docs/
│   └── source/
│       ├── conf.py
│       └── index.rst
├── pymarc/
│   ├── __init__.py
│   ├── constants.py
│   ├── exceptions.py
│   ├── field.py
│   ├── leader.py
│   ├── marc8.py
│   ├── marc8_mapping.py
│   ├── marcjson.py
│   ├── marcxml.py
│   ├── reader.py
│   ├── record.py
│   └── writer.py
├── requirements.dev.txt
├── setup.cfg
├── setup.py
└── test/
    ├── __init__.py
    ├── bad_records.mrc
    ├── bad_tag.xml
    ├── batch.json
    ├── batch.xml
    ├── one.json
    ├── test.json
    ├── test_encode.py
    ├── test_field.py
    ├── test_json.py
    ├── test_leader.py
    ├── test_marc8.py
    ├── test_marc8.txt
    ├── test_ordered_fields.py
    ├── test_reader.py
    ├── test_record.py
    ├── test_utf8.py
    ├── test_utf8.txt
    ├── test_writer.py
    ├── test_xml.py
    ├── utf8.xml
    └── utf8_invalid.mrc
Download .txt
SYMBOL INDEX (342 symbols across 21 files)

FILE: apply_headers.py
  function get_contributors (line 26) | def get_contributors():
  function generate_license (line 41) | def generate_license(contribs):
  function apply_headers (line 75) | def apply_headers():
  function write_header (line 98) | def write_header(pyfile, reader, contents, header):

FILE: pymarc/exceptions.py
  class PymarcException (line 10) | class PymarcException(Exception):
  class RecordLengthInvalid (line 16) | class RecordLengthInvalid(PymarcException):
    method __str__ (line 19) | def __str__(self):
  class RecordLeaderInvalid (line 23) | class RecordLeaderInvalid(PymarcException):
    method __str__ (line 26) | def __str__(self):
  class RecordDirectoryInvalid (line 30) | class RecordDirectoryInvalid(PymarcException):
    method __str__ (line 33) | def __str__(self):
  class NoFieldsFound (line 37) | class NoFieldsFound(PymarcException):
    method __str__ (line 40) | def __str__(self):
  class BaseAddressInvalid (line 44) | class BaseAddressInvalid(PymarcException):
    method __str__ (line 47) | def __str__(self):
  class BaseAddressNotFound (line 51) | class BaseAddressNotFound(PymarcException):
    method __str__ (line 54) | def __str__(self):
  class WriteNeedsRecord (line 58) | class WriteNeedsRecord(PymarcException):
    method __str__ (line 61) | def __str__(self):
  class NoActiveFile (line 65) | class NoActiveFile(PymarcException):
    method __str__ (line 68) | def __str__(self):
  class FieldNotFound (line 72) | class FieldNotFound(PymarcException):
    method __str__ (line 75) | def __str__(self):
  class BadSubfieldCodeWarning (line 79) | class BadSubfieldCodeWarning(Warning):
  class BadLeaderValue (line 85) | class BadLeaderValue(PymarcException):

FILE: pymarc/field.py
  class Field (line 15) | class Field:
    method __init__ (line 37) | def __init__(self, tag, indicators=None, subfields=None, data=u""):
    method __iter__ (line 58) | def __iter__(self):
    method __str__ (line 62) | def __str__(self):
    method __getitem__ (line 89) | def __getitem__(self, subfield):
    method __contains__ (line 103) | def __contains__(self, subfield):
    method __setitem__ (line 114) | def __setitem__(self, code, value):
    method __next__ (line 135) | def __next__(self):
    method value (line 144) | def value(self):
    method get_subfields (line 153) | def get_subfields(self, *codes):
    method add_subfield (line 171) | def add_subfield(self, code, value, pos=None):
    method delete_subfield (line 191) | def delete_subfield(self, code):
    method is_control_field (line 211) | def is_control_field(self):
    method as_marc (line 220) | def as_marc(self, encoding):
    method format_field (line 233) | def format_field(self):
    method is_subject_field (line 254) | def is_subject_field(self):
    method indicator1 (line 264) | def indicator1(self):
    method indicator1 (line 269) | def indicator1(self, value):
    method indicator2 (line 274) | def indicator2(self):
    method indicator2 (line 279) | def indicator2(self, value):
  class RawField (line 284) | class RawField(Field):
    method as_marc (line 290) | def as_marc(self, encoding=None):
  function map_marc8_field (line 302) | def map_marc8_field(f):

FILE: pymarc/leader.py
  class Leader (line 12) | class Leader(object):
    method __init__ (line 50) | def __init__(self, leader):
    method __getitem__ (line 57) | def __getitem__(self, item):
    method __setitem__ (line 67) | def __setitem__(self, item, value):
    method __str__ (line 82) | def __str__(self):
    method _replace_values (line 87) | def _replace_values(self, position, value):
    method record_length (line 100) | def record_length(self):
    method record_length (line 106) | def record_length(self, value):
    method record_status (line 114) | def record_status(self):
    method record_status (line 120) | def record_status(self, value):
    method type_of_record (line 128) | def type_of_record(self):
    method type_of_record (line 134) | def type_of_record(self, value):
    method bibliographic_level (line 142) | def bibliographic_level(self):
    method bibliographic_level (line 148) | def bibliographic_level(self, value):
    method type_of_control (line 156) | def type_of_control(self):
    method type_of_control (line 162) | def type_of_control(self, value):
    method coding_scheme (line 170) | def coding_scheme(self):
    method coding_scheme (line 176) | def coding_scheme(self, value):
    method indicator_count (line 186) | def indicator_count(self):
    method indicator_count (line 192) | def indicator_count(self, value):
    method subfield_code_count (line 200) | def subfield_code_count(self):
    method subfield_code_count (line 206) | def subfield_code_count(self, value):
    method base_address (line 214) | def base_address(self):
    method base_address (line 220) | def base_address(self, value):
    method encoding_level (line 230) | def encoding_level(self):
    method encoding_level (line 236) | def encoding_level(self, value):
    method cataloging_form (line 244) | def cataloging_form(self):
    method cataloging_form (line 250) | def cataloging_form(self, value):
    method multipart_ressource (line 260) | def multipart_ressource(self):
    method multipart_ressource (line 266) | def multipart_ressource(self, value):
    method length_of_field_length (line 276) | def length_of_field_length(self):
    method length_of_field_length (line 282) | def length_of_field_length(self, value):
    method starting_character_position_length (line 292) | def starting_character_position_length(self):
    method starting_character_position_length (line 298) | def starting_character_position_length(self, value):
    method implementation_defined_length (line 309) | def implementation_defined_length(self):
    method implementation_defined_length (line 315) | def implementation_defined_length(self, value):

FILE: pymarc/marc8.py
  function marc8_to_unicode (line 18) | def marc8_to_unicode(marc8, hide_utf8_warnings=False):
  class MARC8ToUnicode (line 50) | class MARC8ToUnicode:
    method __init__ (line 73) | def __init__(self, G0=basic_latin, G1=ansel, quiet=False):
    method translate (line 81) | def translate(self, marc8_string):

FILE: pymarc/marcjson.py
  class JsonHandler (line 12) | class JsonHandler:
    method __init__ (line 15) | def __init__(self):
    method element (line 22) | def element(self, element_dict, name=None):
    method elements (line 50) | def elements(self, dict_list):
    method process_record (line 58) | def process_record(self, record):
  function parse_json_to_array (line 63) | def parse_json_to_array(json_file):

FILE: pymarc/marcxml.py
  class XmlHandler (line 22) | class XmlHandler(ContentHandler):
    method __init__ (line 32) | def __init__(self, strict=False, normalize_form=None):
    method startElementNS (line 46) | def startElementNS(self, name, qname, attrs):
    method endElementNS (line 67) | def endElementNS(self, name, qname):
    method characters (line 97) | def characters(self, chars):
    method process_record (line 101) | def process_record(self, record):
  function parse_xml (line 106) | def parse_xml(xml_file, handler):
  function map_xml (line 114) | def map_xml(function, *files):
  function parse_xml_to_array (line 133) | def parse_xml_to_array(xml_file, strict=False, normalize_form=None):
  function record_to_xml (line 147) | def record_to_xml(record, quiet=False, namespace=False):
  function record_to_xml_node (line 153) | def record_to_xml_node(record, quiet=False, namespace=False):

FILE: pymarc/reader.py
  class Reader (line 18) | class Reader:
    method __iter__ (line 21) | def __iter__(self):
  class MARCReader (line 25) | class MARCReader(Reader):
    method current_chunk (line 104) | def current_chunk(self):
    method current_exception (line 109) | def current_exception(self):
    method __init__ (line 113) | def __init__(
    method close (line 140) | def close(self):
    method __next__ (line 146) | def __next__(self):
  function map_records (line 180) | def map_records(f, *files):
  class JSONReader (line 195) | class JSONReader(Reader):
    method __init__ (line 198) | def __init__(self, marc_target, encoding="utf-8", stream=False):
    method __iter__ (line 218) | def __iter__(self):
    method __next__ (line 225) | def __next__(self):

FILE: pymarc/record.py
  class Record (line 40) | class Record:
    method __init__ (line 78) | def __init__(
    method __str__ (line 105) | def __str__(self):
    method __getitem__ (line 116) | def __getitem__(self, tag):
    method __contains__ (line 128) | def __contains__(self, tag):
    method __iter__ (line 138) | def __iter__(self):
    method __next__ (line 142) | def __next__(self):
    method add_field (line 148) | def add_field(self, *fields):
    method add_grouped_field (line 155) | def add_grouped_field(self, *fields):
    method add_ordered_field (line 168) | def add_ordered_field(self, *fields):
    method _sort_fields (line 180) | def _sort_fields(self, field, mode):
    method remove_field (line 206) | def remove_field(self, *fields):
    method remove_fields (line 214) | def remove_fields(self, *tags):
    method get_fields (line 224) | def get_fields(self, *args):
    method decode_marc (line 246) | def decode_marc(
    method as_marc (line 374) | def as_marc(self):
    method as_dict (line 427) | def as_dict(self):
    method as_json (line 445) | def as_json(self, **kwargs):
    method title (line 453) | def title(self):
    method issn_title (line 466) | def issn_title(self):
    method isbn (line 479) | def isbn(self):
    method issn (line 498) | def issn(self):
    method sudoc (line 505) | def sudoc(self):
    method author (line 518) | def author(self):
    method uniformtitle (line 528) | def uniformtitle(self):
    method series (line 536) | def series(self):
    method subjects (line 544) | def subjects(self):
    method addedentries (line 573) | def addedentries(self):
    method location (line 599) | def location(self):
    method notes (line 603) | def notes(self):
    method physicaldescription (line 666) | def physicaldescription(self):
    method publisher (line 670) | def publisher(self):
    method pubyear (line 683) | def pubyear(self):
  function map_marc8_record (line 693) | def map_marc8_record(record):
  function normalize_subfield_code (line 702) | def normalize_subfield_code(subfield):

FILE: pymarc/writer.py
  class Writer (line 15) | class Writer(object):
    method __init__ (line 18) | def __init__(self, file_handle):
    method write (line 22) | def write(self, record):
    method close (line 27) | def close(self, close_fh=True):
  class JSONWriter (line 38) | class JSONWriter(Writer):
    method __init__ (line 63) | def __init__(self, file_handle):
    method write (line 69) | def write(self, record):
    method close (line 77) | def close(self, close_fh=True):
  class MARCWriter (line 87) | class MARCWriter(Writer):
    method __init__ (line 116) | def __init__(self, file_handle):
    method write (line 120) | def write(self, record):
  class TextWriter (line 126) | class TextWriter(Writer):
    method __init__ (line 150) | def __init__(self, file_handle):
    method write (line 155) | def write(self, record):
  class XMLWriter (line 164) | class XMLWriter(Writer):
    method __init__ (line 195) | def __init__(self, file_handle):
    method write (line 201) | def write(self, record):
    method close (line 207) | def close(self, close_fh=True):

FILE: test/test_encode.py
  class Encode (line 12) | class Encode(unittest.TestCase):
    method test_encode_decode (line 13) | def test_encode_decode(self):
    method test_encode_decode_alphatag (line 27) | def test_encode_decode_alphatag(self):
  function suite (line 42) | def suite():

FILE: test/test_field.py
  class FieldTest (line 13) | class FieldTest(unittest.TestCase):
    method setUp (line 14) | def setUp(self):
    method test_string (line 31) | def test_string(self):
    method test_controlfield_string (line 36) | def test_controlfield_string(self):
    method test_indicators (line 41) | def test_indicators(self):
    method test_subfields_created (line 45) | def test_subfields_created(self):
    method test_subfield_short (line 49) | def test_subfield_short(self):
    method test_subfields (line 53) | def test_subfields(self):
    method test_subfields_multi (line 59) | def test_subfields_multi(self):
    method test_encode (line 69) | def test_encode(self):
    method test_membership (line 72) | def test_membership(self):
    method test_iterator (line 76) | def test_iterator(self):
    method test_value (line 83) | def test_value(self):
    method test_non_integer_tag (line 89) | def test_non_integer_tag(self):
    method test_add_subfield (line 93) | def test_add_subfield(self):
    method test_delete_subfield (line 104) | def test_delete_subfield(self):
    method test_is_subject_field (line 115) | def test_is_subject_field(self):
    method test_format_field (line 119) | def test_format_field(self):
    method test_tag_normalize (line 130) | def test_tag_normalize(self):
    method test_alphatag (line 134) | def test_alphatag(self):
    method test_setitem_no_key (line 140) | def test_setitem_no_key(self):
    method test_setitem_repeated_key (line 151) | def test_setitem_repeated_key(self):
    method test_iter_over_controlfield (line 163) | def test_iter_over_controlfield(self):
    method test_setitem (line 169) | def test_setitem(self):
    method test_delete_subfield_only_by_code (line 173) | def test_delete_subfield_only_by_code(self):
    method test_set_indicators_affects_str (line 179) | def test_set_indicators_affects_str(self):
    method test_set_indicators_affects_marc (line 186) | def test_set_indicators_affects_marc(self):
  function suite (line 195) | def suite():

FILE: test/test_json.py
  class JsonReaderTest (line 13) | class JsonReaderTest(unittest.TestCase):
    method setUp (line 14) | def setUp(self):
    method testRoundtrip (line 21) | def testRoundtrip(self):
    method testOneRecord (line 37) | def testOneRecord(self):
  class JsonTest (line 44) | class JsonTest(unittest.TestCase):
    method setUp (line 45) | def setUp(self):
    method test_as_dict_single (line 53) | def test_as_dict_single(self):
    method test_as_json_types (line 68) | def test_as_json_types(self):
    method test_as_json_simple (line 82) | def test_as_json_simple(self):
    method test_as_json_multiple (line 99) | def test_as_json_multiple(self):
  class JsonParse (line 104) | class JsonParse(unittest.TestCase):
    method setUp (line 105) | def setUp(self):
    method testRoundtrip (line 112) | def testRoundtrip(self):
    method testParseJsonXml (line 120) | def testParseJsonXml(self):
  function suite (line 130) | def suite():

FILE: test/test_leader.py
  function random_string (line 36) | def random_string(length):
  class LeaderTest (line 42) | class LeaderTest(unittest.TestCase):
    method test_leader_invalid_length (line 45) | def test_leader_invalid_length(self):
    method test_leader_value (line 48) | def test_leader_value(self):
    method test_str (line 52) | def test_str(self):
    method test_add (line 56) | def test_add(self):
    method test_getters (line 61) | def test_getters(self):
    method test_setters (line 67) | def test_setters(self):
    method test_setters_errors (line 77) | def test_setters_errors(self):
  function suite (line 85) | def suite():

FILE: test/test_marc8.py
  class MARC8Test (line 16) | class MARC8Test(TestCase):
    method test_marc8_reader (line 17) | def test_marc8_reader(self):
    method test_marc8_reader_to_unicode (line 26) | def test_marc8_reader_to_unicode(self):
    method test_marc8_reader_to_1251 (line 35) | def test_marc8_reader_to_1251(self):
    method test_marc8_reader_to_1251_without_1251 (line 44) | def test_marc8_reader_to_1251_without_1251(self):
    method test_marc8_reader_to_unicode_bad_eacc_sequence (line 57) | def test_marc8_reader_to_unicode_bad_eacc_sequence(self):
    method test_marc8_reader_to_unicode_bad_escape (line 66) | def test_marc8_reader_to_unicode_bad_escape(self):
    method test_marc8_to_unicode (line 75) | def test_marc8_to_unicode(self):
    method test_writing_unicode (line 92) | def test_writing_unicode(self):
    method test_reading_utf8_with_flag (line 107) | def test_reading_utf8_with_flag(self):
    method test_reading_utf8_without_flag (line 131) | def test_reading_utf8_without_flag(self):
    method test_record_create_force_utf8 (line 168) | def test_record_create_force_utf8(self, force_utf8=True):
    method test_subscript_2 (line 172) | def test_subscript_2(self):
    method test_eszett_euro (line 178) | def test_eszett_euro(self):
    method test_alif (line 190) | def test_alif(self):
  function suite (line 198) | def suite():

FILE: test/test_ordered_fields.py
  class OrderedFieldsTest (line 12) | class OrderedFieldsTest(unittest.TestCase):
    method test_add_ordered_fields (line 13) | def test_add_ordered_fields(self):
    method test_add_grouped_fields (line 33) | def test_add_grouped_fields(self):
  function suite (line 51) | def suite():

FILE: test/test_reader.py
  class MARCReaderBaseTest (line 15) | class MARCReaderBaseTest(object):
    method test_iterator (line 16) | def test_iterator(self):
    method test_string (line 22) | def test_string(self):
  class MARCReaderFileTest (line 32) | class MARCReaderFileTest(unittest.TestCase, MARCReaderBaseTest):
    method setUp (line 35) | def setUp(self):
    method tearDown (line 38) | def tearDown(self):
    method test_map_records (line 42) | def test_map_records(self):
    method test_multi_map_records (line 52) | def test_multi_map_records(self):
    method disabled_test_codecs (line 65) | def disabled_test_codecs(self):
    method test_bad_subfield (line 73) | def test_bad_subfield(self):
    method test_bad_indicator (line 79) | def test_bad_indicator(self):
    method test_regression_45 (line 85) | def test_regression_45(self):
    method test_strict_mode (line 94) | def test_strict_mode(self):
  class MARCReaderStringTest (line 105) | class MARCReaderStringTest(unittest.TestCase, MARCReaderBaseTest):
    method setUp (line 106) | def setUp(self):
  class MARCReaderFilePermissiveTest (line 116) | class MARCReaderFilePermissiveTest(unittest.TestCase):
    method setUp (line 119) | def setUp(self):
    method tearDown (line 124) | def tearDown(self):
    method test_permissive_mode (line 128) | def test_permissive_mode(self):
  function suite (line 173) | def suite():

FILE: test/test_record.py
  class RecordTest (line 15) | class RecordTest(unittest.TestCase):
    method test_add_field (line 16) | def test_add_field(self):
    method test_remove_field (line 24) | def test_remove_field(self):
    method test_quick_access (line 40) | def test_quick_access(self):
    method test_membership (line 49) | def test_membership(self):
    method test_field_not_found (line 58) | def test_field_not_found(self):
    method test_find (line 62) | def test_find(self):
    method test_multi_find (line 78) | def test_multi_find(self):
    method test_bad_leader (line 91) | def test_bad_leader(self):
    method test_bad_base_address (line 95) | def test_bad_base_address(self):
    method test_title (line 101) | def test_title(self):
    method test_issn_title (line 111) | def test_issn_title(self):
    method test_isbn (line 125) | def test_isbn(self):
    method test_issn (line 149) | def test_issn(self):
    method test_multiple_isbn (line 157) | def test_multiple_isbn(self):
    method test_author (line 163) | def test_author(self):
    method test_uniformtitle (line 177) | def test_uniformtitle(self):
    method test_subjects (line 197) | def test_subjects(self):
    method test_added_entries (line 224) | def test_added_entries(self):
    method test_physicaldescription (line 245) | def test_physicaldescription(self):
    method test_location (line 274) | def test_location(self):
    method test_notes (line 308) | def test_notes(self):
    method test_publisher (line 326) | def test_publisher(self):
    method test_pubyear (line 360) | def test_pubyear(self):
    method test_alphatag (line 394) | def test_alphatag(self):
    method test_copy (line 404) | def test_copy(self):
    method test_as_marc_with_explicit_leader (line 415) | def test_as_marc_with_explicit_leader(self):
    method test_remove_fields (line 434) | def test_remove_fields(self):
    method test_as_marc_consistency (line 443) | def test_as_marc_consistency(self):
    method test_init_with_no_leader (line 449) | def test_init_with_no_leader(self):
    method test_init_with_no_leader_but_with_force_utf8 (line 463) | def test_init_with_no_leader_but_with_force_utf8(self):
    method test_init_with_leader (line 476) | def test_init_with_leader(self):
    method test_init_with_leader_and_force_utf8 (line 489) | def test_init_with_leader_and_force_utf8(self):
  function suite (line 503) | def suite():

FILE: test/test_utf8.py
  class MARCUnicodeTest (line 13) | class MARCUnicodeTest(unittest.TestCase):
    method test_read_utf8 (line 14) | def test_read_utf8(self):
    method test_copy_utf8 (line 24) | def test_copy_utf8(self):
    method test_combining_diacritic (line 44) | def test_combining_diacritic(self):
  function suite (line 51) | def suite():

FILE: test/test_writer.py
  class JSONWriterTest (line 16) | class JSONWriterTest(unittest.TestCase):
    method test_close_true (line 17) | def test_close_true(self):
    method test_close_false (line 28) | def test_close_false(self):
    method test_writing_0_records (line 40) | def test_writing_0_records(self):
    method test_writing_empty_record (line 55) | def test_writing_empty_record(self):
    method test_writing_1_record (line 77) | def test_writing_1_record(self):
    method test_writing_3_records (line 123) | def test_writing_3_records(self):
  class MARCWriterTest (line 226) | class MARCWriterTest(unittest.TestCase):
    method test_write (line 227) | def test_write(self):
    method test_close_true (line 248) | def test_close_true(self):
    method test_close_false (line 259) | def test_close_false(self):
  class TextWriterTest (line 272) | class TextWriterTest(unittest.TestCase):
    method test_writing_0_records (line 273) | def test_writing_0_records(self):
    method test_writing_1_record (line 286) | def test_writing_1_record(self):
    method test_writing_3_records (line 307) | def test_writing_3_records(self):
    method test_writing_empty_record (line 350) | def test_writing_empty_record(self):
    method test_close_true (line 365) | def test_close_true(self):
    method test_close_false (line 376) | def test_close_false(self):
  class XMLWriterTest (line 389) | class XMLWriterTest(unittest.TestCase):
    method test_writing_0_records (line 390) | def test_writing_0_records(self):
    method test_writing_empty_record (line 405) | def test_writing_empty_record(self):
    method test_writing_1_record (line 425) | def test_writing_1_record(self):
    method test_writing_3_records (line 456) | def test_writing_3_records(self):
    method test_close_true (line 519) | def test_close_true(self):
    method test_close_false (line 530) | def test_close_false(self):
  function suite (line 543) | def suite():

FILE: test/test_xml.py
  class XmlTest (line 13) | class XmlTest(unittest.TestCase):
    method test_map_xml (line 14) | def test_map_xml(self):
    method test_multi_map_xml (line 23) | def test_multi_map_xml(self):
    method test_parse_to_array (line 32) | def test_parse_to_array(self):
    method test_xml (line 56) | def test_xml(self):
    method test_strict (line 83) | def test_strict(self):
    method test_xml_namespaces (line 87) | def test_xml_namespaces(self):
    method test_bad_tag (line 105) | def test_bad_tag(self):
  function suite (line 110) | def suite():
Condensed preview — 48 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (1,221K chars).
[
  {
    "path": ".gitignore",
    "chars": 85,
    "preview": "*.pyc\npymarc.egg-info\nbuild\ndist\n*$py.class\n.eggs\n*.egg\nPipfile\nPipfile.lock\n.vscode\n"
  },
  {
    "path": ".mailmap",
    "chars": 302,
    "preview": "Aaron S. Lav <asl2@pobox.com>\nDan Scott <dan@coffeecode.net> <gitorious@coffeecode.net>\nEric Hellman <eric@hellman.net>\n"
  },
  {
    "path": ".travis.yml",
    "chars": 696,
    "preview": "language: python\n\nscript:\n  - python setup.py test\n\nstages:\n  - lint\n  - test\n\njobs:\n  include:\n    # Linting\n    - stag"
  },
  {
    "path": "CONTRIBUTING.md",
    "chars": 633,
    "preview": "# Contributing\n\nFeel free to [report bugs](https://github.com/edsu/pymarc/issues) you have encountered\nand [suggest new "
  },
  {
    "path": "LICENSE",
    "chars": 2735,
    "preview": "Redistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the followi"
  },
  {
    "path": "MANIFEST.in",
    "chars": 150,
    "preview": "recursive-include test *.py *.dat *.xml *.json *.mrc *.txt *.xml\nrecursive-include docs *.py\nrecursive-include docs *.rs"
  },
  {
    "path": "README.md",
    "chars": 81,
    "preview": "# The pymarc repository has moved to [GitLab](https://gitlab.com/pymarc/pymarc).\n"
  },
  {
    "path": "README_pt_Br.md",
    "chars": 83,
    "preview": "# O repositório pymarc foi movido para [GitLab](https://gitlab.com/pymarc/pymarc).\n"
  },
  {
    "path": "apply_headers.py",
    "chars": 4883,
    "preview": "#!/usr/bin/env python\n\n\"\"\"Apply standard license headers and generate contributor list.\n\nRather than trying to maintain "
  },
  {
    "path": "docs/source/conf.py",
    "chars": 10301,
    "preview": "\"\"\"Pymarc's documentation build configuration file.\n\nCreated by sphinx-quickstart on Thu Jul 21 10:24:11 2016.\n\nThis fil"
  },
  {
    "path": "docs/source/index.rst",
    "chars": 6252,
    "preview": ".. pymarc documentation master file, created by\n   sphinx-quickstart on Thu Jul 21 10:24:11 2016.\n   You can adapt this "
  },
  {
    "path": "pymarc/__init__.py",
    "chars": 552,
    "preview": "# This file is part of pymarc. It is subject to the license terms in the\n# LICENSE file found in the top-level directory"
  },
  {
    "path": "pymarc/constants.py",
    "chars": 467,
    "preview": "# This file is part of pymarc. It is subject to the license terms in the\n# LICENSE file found in the top-level directory"
  },
  {
    "path": "pymarc/exceptions.py",
    "chars": 2184,
    "preview": "# This file is part of pymarc. It is subject to the license terms in the\n# LICENSE file found in the top-level directory"
  },
  {
    "path": "pymarc/field.py",
    "chars": 9937,
    "preview": "# This file is part of pymarc. It is subject to the license terms in the\n# LICENSE file found in the top-level directory"
  },
  {
    "path": "pymarc/leader.py",
    "chars": 10674,
    "preview": "# This file is part of pymarc. It is subject to the license terms in the\n# LICENSE file found in the top-level directory"
  },
  {
    "path": "pymarc/marc8.py",
    "chars": 6758,
    "preview": "# This file is part of pymarc. It is subject to the license terms in the\n# LICENSE file found in the top-level directory"
  },
  {
    "path": "pymarc/marc8_mapping.py",
    "chars": 835551,
    "preview": "# This file is part of pymarc. It is subject to the license terms in the\n# LICENSE file found in the top-level directory"
  },
  {
    "path": "pymarc/marcjson.py",
    "chars": 2322,
    "preview": "# This file is part of pymarc. It is subject to the license terms in the\n# LICENSE file found in the top-level directory"
  },
  {
    "path": "pymarc/marcxml.py",
    "chars": 6491,
    "preview": "# This file is part of pymarc. It is subject to the license terms in the\n# LICENSE file found in the top-level directory"
  },
  {
    "path": "pymarc/reader.py",
    "chars": 7813,
    "preview": "# This file is part of pymarc. It is subject to the license terms in the\n# LICENSE file found in the top-level directory"
  },
  {
    "path": "pymarc/record.py",
    "chars": 22409,
    "preview": "# This file is part of pymarc. It is subject to the license terms in the\n# LICENSE file found in the top-level directory"
  },
  {
    "path": "pymarc/writer.py",
    "chars": 6090,
    "preview": "# This file is part of pymarc. It is subject to the license terms in the\n# LICENSE file found in the top-level directory"
  },
  {
    "path": "requirements.dev.txt",
    "chars": 41,
    "preview": "# linting\nblack\nflake8\nflake8-docstrings\n"
  },
  {
    "path": "setup.cfg",
    "chars": 510,
    "preview": "[flake8]\nignore = \n\t# line length is handled by black\n\tE501\n\t# Missing docstring in public nested class (ex. Meta)\n\tD106"
  },
  {
    "path": "setup.py",
    "chars": 1314,
    "preview": "# This file is part of pymarc. It is subject to the license terms in the\n# LICENSE file found in the top-level directory"
  },
  {
    "path": "test/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "test/bad_records.mrc",
    "chars": 917,
    "preview": "00127     2200037   4500245008900000\u001e01\u001faThe pragmatic programmer : \u001fbfrom journeyman to master /\u001fcAndrew Hunt, David Th"
  },
  {
    "path": "test/bad_tag.xml",
    "chars": 2063,
    "preview": "<?xml version=\"1.0\"?>\n<ns0:record xmlns:ns0=\"http://www.loc.gov/MARC21/slim\">\n  <ns0:leader>      Z   22 4500</ns0:leade"
  },
  {
    "path": "test/batch.json",
    "chars": 9063,
    "preview": "[\n{\n  \"leader\": \"00925njm  22002777a 4500\",\n  \"fields\": [\n    {\n      \"001\": \"5637241\"\n    },\n    {\n      \"003\": \"DLC\"\n "
  },
  {
    "path": "test/batch.xml",
    "chars": 8247,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<!-- edited with XML Spy v4.3 U (http://www.xmlspy.com) by Morgan Cundiff (Libra"
  },
  {
    "path": "test/one.json",
    "chars": 3260,
    "preview": "{\n  \"leader\": \"00755cam  22002414a 4500\",\n  \"fields\": [\n    {\n      \"001\": \"fol05731351 \"\n    },\n    {\n      \"003\": \"IMc"
  },
  {
    "path": "test/test.json",
    "chars": 9410,
    "preview": "[{\n    \"leader\":\"01471cjm a2200349 a 4500\",\n    \"fields\":\n    [\n        {\n            \"001\":\"5674874\"\n        },\n       "
  },
  {
    "path": "test/test_encode.py",
    "chars": 1551,
    "preview": "# This file is part of pymarc. It is subject to the license terms in the\n# LICENSE file found in the top-level directory"
  },
  {
    "path": "test/test_field.py",
    "chars": 6843,
    "preview": "# This file is part of pymarc. It is subject to the license terms in the\n# LICENSE file found in the top-level directory"
  },
  {
    "path": "test/test_json.py",
    "chars": 4954,
    "preview": "# This file is part of pymarc. It is subject to the license terms in the\n# LICENSE file found in the top-level directory"
  },
  {
    "path": "test/test_leader.py",
    "chars": 2869,
    "preview": "# This file is part of pymarc. It is subject to the license terms in the\n# LICENSE file found in the top-level directory"
  },
  {
    "path": "test/test_marc8.py",
    "chars": 7765,
    "preview": "# -*- coding: utf-8 -*-\n\n# This file is part of pymarc. It is subject to the license terms in the\n# LICENSE file found i"
  },
  {
    "path": "test/test_marc8.txt",
    "chars": 55430,
    "preview": "\u001b(3YhOI,\u001b(B \u001b(3eMeO\u001b(B.\n\u001b(3cja\u001b(B \u001b(3SbWJ\u001b(B \u001b(3GdedcjI\u001b(B \u001b(3aj\u001b(B \u001b(3eUQ?\u001b(B :\n\u001b(3GdWHYI\u001b(B 1.\n\u001b(3GdbGgQI\u001b(B :\n\u001b$1!S+!"
  },
  {
    "path": "test/test_ordered_fields.py",
    "chars": 1808,
    "preview": "# This file is part of pymarc. It is subject to the license terms in the\n# LICENSE file found in the top-level directory"
  },
  {
    "path": "test/test_reader.py",
    "chars": 6413,
    "preview": "# -*- coding: utf-8 -*-\n\n# This file is part of pymarc. It is subject to the license terms in the\n# LICENSE file found i"
  },
  {
    "path": "test/test_record.py",
    "chars": 18013,
    "preview": "# This file is part of pymarc. It is subject to the license terms in the\n# LICENSE file found in the top-level directory"
  },
  {
    "path": "test/test_utf8.py",
    "chars": 1617,
    "preview": "# This file is part of pymarc. It is subject to the license terms in the\n# LICENSE file found in the top-level directory"
  },
  {
    "path": "test/test_utf8.txt",
    "chars": 20118,
    "preview": "عودة، محمد.\nكيف سقطت الملكية في مصر؟ :\nالطبعة 1.\nالقاهرة :\n肖 显靜.\n第一 推动 /\n第1版.\n北京市 :\n与 2049年 的 中国 对话\n吴 国林,\n芋生 裕信,\n西脇 順三郎 "
  },
  {
    "path": "test/test_writer.py",
    "chars": 20353,
    "preview": "# This file is part of pymarc. It is subject to the license terms in the\n# LICENSE file found in the top-level directory"
  },
  {
    "path": "test/test_xml.py",
    "chars": 3932,
    "preview": "# This file is part of pymarc. It is subject to the license terms in the\n# LICENSE file found in the top-level directory"
  },
  {
    "path": "test/utf8.xml",
    "chars": 1437,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n            <marc:collection xmlns:marc=\"http://www.loc.gov/MARC21/slim\" xmlns:xs"
  },
  {
    "path": "test/utf8_invalid.mrc",
    "chars": 1002,
    "preview": "01004cam a2200277   4500001000700000005001700007008004100024035001900065090003200084245008100116260006800197300001800265"
  }
]

About this extraction

This page contains the full source code of the edsu/pymarc GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 48 files (1.1 MB), approximately 519.4k tokens, and a symbol index with 342 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!