diff --git a/python/sites/build.txt b/python/sites/build.txt
index 18ed54c6a645..b13faa47db1b 100644
--- a/python/sites/build.txt
+++ b/python/sites/build.txt
@@ -28,9 +28,10 @@ vendored:third_party/python/frozenlist
vendored:third_party/python/giturlparse
vendored:third_party/python/glean_parser
vendored:third_party/python/gyp/pylib
-vendored:third_party/python/jinja2_time
vendored:third_party/python/json_e
vendored:third_party/python/Mako
+vendored:third_party/python/markdown_it_py
+vendored:third_party/python/mdurl
vendored:third_party/python/mohawk
vendored:third_party/python/mozilla_repo_urls
vendored:third_party/python/multidict
@@ -38,11 +39,13 @@ vendored:third_party/python/pathspec
vendored:third_party/python/ply
vendored:third_party/python/pyasn1
vendored:third_party/python/pyasn1_modules
+vendored:third_party/python/pygments
vendored:third_party/python/pylru
vendored:third_party/python/python_dateutil
vendored:third_party/python/python_slugify
vendored:third_party/python/redo
vendored:third_party/python/requests_unixsocket
+vendored:third_party/python/rich
vendored:third_party/python/rsa
vendored:third_party/python/slugid
vendored:third_party/python/taskcluster
@@ -50,6 +53,7 @@ vendored:third_party/python/taskcluster_taskgraph
vendored:third_party/python/taskcluster_urls
vendored:third_party/python/text_unidecode
vendored:third_party/python/toml
+vendored:third_party/python/types_python_dateutil
vendored:third_party/python/voluptuous
vendored:third_party/python/yamllint
vendored:third_party/python/yarl
diff --git a/python/sites/common.txt b/python/sites/common.txt
index aef64e570d77..d4336462b76f 100644
--- a/python/sites/common.txt
+++ b/python/sites/common.txt
@@ -31,8 +31,9 @@ vendored:third_party/python/frozenlist
vendored:third_party/python/giturlparse
vendored:third_party/python/glean_parser
vendored:third_party/python/gyp/pylib
-vendored:third_party/python/jinja2_time
vendored:third_party/python/json_e
+vendored:third_party/python/markdown_it_py
+vendored:third_party/python/mdurl
vendored:third_party/python/mohawk
vendored:third_party/python/mozilla_repo_urls
vendored:third_party/python/multidict
@@ -40,12 +41,14 @@ vendored:third_party/python/pathspec
vendored:third_party/python/ply
vendored:third_party/python/pyasn1
vendored:third_party/python/pyasn1_modules
+vendored:third_party/python/pygments
vendored:third_party/python/pylru
vendored:third_party/python/python_dateutil
vendored:third_party/python/python_slugify
vendored:third_party/python/redo
vendored:third_party/python/requests_unixsocket
vendored:third_party/python/responses
+vendored:third_party/python/rich
vendored:third_party/python/rsa
vendored:third_party/python/slugid
vendored:third_party/python/taskcluster
@@ -53,6 +56,7 @@ vendored:third_party/python/taskcluster_taskgraph
vendored:third_party/python/taskcluster_urls
vendored:third_party/python/text_unidecode
vendored:third_party/python/toml
+vendored:third_party/python/types_python_dateutil
vendored:third_party/python/voluptuous
vendored:third_party/python/yamllint
vendored:third_party/python/yarl
diff --git a/python/sites/docs.txt b/python/sites/docs.txt
index e5d0b95c3fb9..ec15a1bb94b9 100644
--- a/python/sites/docs.txt
+++ b/python/sites/docs.txt
@@ -37,16 +37,20 @@ vendored:third_party/python/fluent.syntax
vendored:third_party/python/frozenlist
vendored:third_party/python/giturlparse
vendored:third_party/python/gyp/pylib
-vendored:third_party/python/jinja2_time
vendored:third_party/python/json_e
+vendored:third_party/python/markdown_it_py
+vendored:third_party/python/mdurl
vendored:third_party/python/mohawk
vendored:third_party/python/mozilla_repo_urls
+vendored:third_party/python/pygments
vendored:third_party/python/pylru
vendored:third_party/python/redo
vendored:third_party/python/requests_unixsocket
vendored:third_party/python/responses
+vendored:third_party/python/rich
vendored:third_party/python/slugid
vendored:third_party/python/taskcluster
vendored:third_party/python/taskcluster_taskgraph
vendored:third_party/python/taskcluster_urls
+vendored:third_party/python/types_python_dateutil
vendored:third_party/python/voluptuous
diff --git a/python/sites/lint.txt b/python/sites/lint.txt
index 50eda55eba33..788c74ce25f0 100644
--- a/python/sites/lint.txt
+++ b/python/sites/lint.txt
@@ -13,22 +13,26 @@ vendored:third_party/python/esprima
vendored:third_party/python/fluent.syntax
vendored:third_party/python/frozenlist
vendored:third_party/python/giturlparse
-vendored:third_party/python/jinja2_time
vendored:third_party/python/json_e
+vendored:third_party/python/markdown_it_py
+vendored:third_party/python/mdurl
vendored:third_party/python/mohawk
vendored:third_party/python/mozilla_repo_urls
vendored:third_party/python/multidict
vendored:third_party/python/pathspec
+vendored:third_party/python/pygments
vendored:third_party/python/python_dateutil
vendored:third_party/python/python_slugify
vendored:third_party/python/redo
vendored:third_party/python/requests_unixsocket
+vendored:third_party/python/rich
vendored:third_party/python/slugid
vendored:third_party/python/taskcluster
vendored:third_party/python/taskcluster_taskgraph
vendored:third_party/python/taskcluster_urls
vendored:third_party/python/text_unidecode
vendored:third_party/python/toml
+vendored:third_party/python/types_python_dateutil
vendored:third_party/python/voluptuous
vendored:third_party/python/yamllint
vendored:third_party/python/yarl
diff --git a/python/sites/python-test.txt b/python/sites/python-test.txt
index 58ad4f5efbce..e67f63643f41 100644
--- a/python/sites/python-test.txt
+++ b/python/sites/python-test.txt
@@ -39,8 +39,9 @@ vendored:third_party/python/frozenlist
vendored:third_party/python/giturlparse
vendored:third_party/python/glean_parser
vendored:third_party/python/gyp/pylib
-vendored:third_party/python/jinja2_time
vendored:third_party/python/json_e
+vendored:third_party/python/markdown_it_py
+vendored:third_party/python/mdurl
vendored:third_party/python/mohawk
vendored:third_party/python/mozilla_repo_urls
vendored:third_party/python/multidict
@@ -48,12 +49,14 @@ vendored:third_party/python/pathspec
vendored:third_party/python/ply
vendored:third_party/python/pyasn1
vendored:third_party/python/pyasn1_modules
+vendored:third_party/python/pygments
vendored:third_party/python/pylru
vendored:third_party/python/python_dateutil
vendored:third_party/python/python_slugify
vendored:third_party/python/redo
vendored:third_party/python/requests_unixsocket
vendored:third_party/python/responses
+vendored:third_party/python/rich
vendored:third_party/python/rsa
vendored:third_party/python/slugid
vendored:third_party/python/taskcluster
@@ -61,6 +64,7 @@ vendored:third_party/python/taskcluster_taskgraph
vendored:third_party/python/taskcluster_urls
vendored:third_party/python/text_unidecode
vendored:third_party/python/toml
+vendored:third_party/python/types_python_dateutil
vendored:third_party/python/voluptuous
vendored:third_party/python/yamllint
vendored:third_party/python/yarl
diff --git a/python/sites/try.txt b/python/sites/try.txt
index 9607d5687cbc..d2538c7bee93 100644
--- a/python/sites/try.txt
+++ b/python/sites/try.txt
@@ -31,9 +31,10 @@ vendored:third_party/python/frozenlist
vendored:third_party/python/giturlparse
vendored:third_party/python/glean_parser
vendored:third_party/python/gyp/pylib
-vendored:third_party/python/jinja2_time
vendored:third_party/python/json_e
vendored:third_party/python/jsonschema
+vendored:third_party/python/markdown_it_py
+vendored:third_party/python/mdurl
vendored:third_party/python/mohawk
vendored:third_party/python/mozilla_repo_urls
vendored:third_party/python/multidict
@@ -42,6 +43,7 @@ vendored:third_party/python/pkgutil_resolve_name
vendored:third_party/python/ply
vendored:third_party/python/pyasn1
vendored:third_party/python/pyasn1_modules
+vendored:third_party/python/pygments
vendored:third_party/python/pylru
vendored:third_party/python/pyrsistent
vendored:third_party/python/python_dateutil
@@ -49,6 +51,7 @@ vendored:third_party/python/python_slugify
vendored:third_party/python/redo
vendored:third_party/python/requests_unixsocket
vendored:third_party/python/responses
+vendored:third_party/python/rich
vendored:third_party/python/rsa
vendored:third_party/python/slugid
vendored:third_party/python/taskcluster
@@ -56,6 +59,7 @@ vendored:third_party/python/taskcluster_taskgraph
vendored:third_party/python/taskcluster_urls
vendored:third_party/python/text_unidecode
vendored:third_party/python/toml
+vendored:third_party/python/types_python_dateutil
vendored:third_party/python/voluptuous
vendored:third_party/python/yamllint
vendored:third_party/python/yarl
diff --git a/third_party/python/arrow/arrow-1.2.3.dist-info/RECORD b/third_party/python/arrow/arrow-1.2.3.dist-info/RECORD
deleted file mode 100644
index 62e73a16f59e..000000000000
--- a/third_party/python/arrow/arrow-1.2.3.dist-info/RECORD
+++ /dev/null
@@ -1,16 +0,0 @@
-arrow/__init__.py,sha256=HxsSJGl56GoeHB__No-kdGmC_Wes_Ttf0ohOy7OoFig,872
-arrow/_version.py,sha256=C-D_WWrVkBDmQmApLcm0sWNh2CgIrwWfc8_sB5vvU-Q,22
-arrow/api.py,sha256=6tdqrG0NjrKO22_eWHU4a5xerfR6IrZPY-yynGpnvTM,2755
-arrow/arrow.py,sha256=CnSXk3GCi1DroUvElSxlwQy9Y-2lCUSV5GKLLrBFmRA,63570
-arrow/constants.py,sha256=y3scgWgxiFuQg4DeFlhmexy1BA7K8LFNZyqK-VWPQJs,3238
-arrow/factory.py,sha256=dWP3XIYfYjqp7DCOdEYAD7PQfsbpQE70Ph9OS1A1LnE,11435
-arrow/formatter.py,sha256=YpYY8jeGZH0sgjc23PBm8HKf-EMHLp-8Ua52XfrVgPQ,5271
-arrow/locales.py,sha256=QSi6FJTVdmxDxAUIDMhUp3sJ13tHhF2tB50fA_mve0I,156276
-arrow/parser.py,sha256=ingY4axAO40kEYUL8MwqTIhFegCAVouDZk3c4YOs9aI,25720
-arrow/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-arrow/util.py,sha256=xnDevqRyNeYWbl3x-n_Tyo4cOgHcdgbxFECFsJ1XoEc,3679
-arrow-1.2.3.dist-info/LICENSE,sha256=QNbhJV1xUfXwQaUUcl08lP-owYgeWgwptr6pPwPi47s,11341
-arrow-1.2.3.dist-info/METADATA,sha256=gg8GFdfHjX15F_yMrLsluJwKUXTaQi5ECUvwBlZYe9o,6938
-arrow-1.2.3.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92
-arrow-1.2.3.dist-info/top_level.txt,sha256=aCBThK2RIB824ctI3l9i6z94l8UYpFF-BC4m3dDzFFo,6
-arrow-1.2.3.dist-info/RECORD,,
diff --git a/third_party/python/arrow/arrow-1.2.3.dist-info/top_level.txt b/third_party/python/arrow/arrow-1.2.3.dist-info/top_level.txt
deleted file mode 100644
index e2dc7471c204..000000000000
--- a/third_party/python/arrow/arrow-1.2.3.dist-info/top_level.txt
+++ /dev/null
@@ -1 +0,0 @@
-arrow
diff --git a/third_party/python/arrow/arrow-1.2.3.dist-info/LICENSE b/third_party/python/arrow/arrow-1.3.0.dist-info/LICENSE
similarity index 99%
rename from third_party/python/arrow/arrow-1.2.3.dist-info/LICENSE
rename to third_party/python/arrow/arrow-1.3.0.dist-info/LICENSE
index 4f9eea5d1493..ff864f3ba15d 100644
--- a/third_party/python/arrow/arrow-1.2.3.dist-info/LICENSE
+++ b/third_party/python/arrow/arrow-1.3.0.dist-info/LICENSE
@@ -186,7 +186,7 @@
same "printed page" as the copyright notice for easier
identification within third-party archives.
- Copyright 2021 Chris Smith
+ Copyright 2023 Chris Smith
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
diff --git a/third_party/python/arrow/arrow-1.2.3.dist-info/METADATA b/third_party/python/arrow/arrow-1.3.0.dist-info/METADATA
similarity index 84%
rename from third_party/python/arrow/arrow-1.2.3.dist-info/METADATA
rename to third_party/python/arrow/arrow-1.3.0.dist-info/METADATA
index b3f89db32091..94b7642bdea0 100644
--- a/third_party/python/arrow/arrow-1.2.3.dist-info/METADATA
+++ b/third_party/python/arrow/arrow-1.3.0.dist-info/METADATA
@@ -1,31 +1,43 @@
Metadata-Version: 2.1
Name: arrow
-Version: 1.2.3
+Version: 1.3.0
Summary: Better dates & times for Python
-Home-page: https://arrow.readthedocs.io
-Author: Chris Smith
-Author-email: crsmithdev@gmail.com
-License: Apache 2.0
-Project-URL: Repository, https://github.com/arrow-py/arrow
-Project-URL: Bug Reports, https://github.com/arrow-py/arrow/issues
-Project-URL: Documentation, https://arrow.readthedocs.io
-Keywords: arrow date time datetime timestamp timezone humanize
+Keywords: arrow,date,time,datetime,timestamp,timezone,humanize
+Author-email: Chris Smith
+Requires-Python: >=3.8
+Description-Content-Type: text/x-rst
Classifier: Development Status :: 5 - Production/Stable
Classifier: Intended Audience :: Developers
+Classifier: Intended Audience :: Information Technology
Classifier: License :: OSI Approved :: Apache Software License
Classifier: Topic :: Software Development :: Libraries :: Python Modules
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3 :: Only
-Classifier: Programming Language :: Python :: 3.6
-Classifier: Programming Language :: Python :: 3.7
Classifier: Programming Language :: Python :: 3.8
Classifier: Programming Language :: Python :: 3.9
Classifier: Programming Language :: Python :: 3.10
-Requires-Python: >=3.6
-Description-Content-Type: text/x-rst
-License-File: LICENSE
-Requires-Dist: python-dateutil (>=2.7.0)
-Requires-Dist: typing-extensions ; python_version < "3.8"
+Classifier: Programming Language :: Python :: 3.11
+Classifier: Programming Language :: Python :: 3.12
+Classifier: Operating System :: OS Independent
+Requires-Dist: python-dateutil>=2.7.0
+Requires-Dist: types-python-dateutil>=2.8.10
+Requires-Dist: doc8 ; extra == "doc"
+Requires-Dist: sphinx>=7.0.0 ; extra == "doc"
+Requires-Dist: sphinx-autobuild ; extra == "doc"
+Requires-Dist: sphinx-autodoc-typehints ; extra == "doc"
+Requires-Dist: sphinx_rtd_theme>=1.3.0 ; extra == "doc"
+Requires-Dist: dateparser==1.* ; extra == "test"
+Requires-Dist: pre-commit ; extra == "test"
+Requires-Dist: pytest ; extra == "test"
+Requires-Dist: pytest-cov ; extra == "test"
+Requires-Dist: pytest-mock ; extra == "test"
+Requires-Dist: pytz==2021.1 ; extra == "test"
+Requires-Dist: simplejson==3.* ; extra == "test"
+Project-URL: Documentation, https://arrow.readthedocs.io
+Project-URL: Issues, https://github.com/arrow-py/arrow/issues
+Project-URL: Source, https://github.com/arrow-py/arrow
+Provides-Extra: doc
+Provides-Extra: test
Arrow: Better dates & times for Python
======================================
@@ -161,3 +173,4 @@ Support Arrow
-------------
`Open Collective `_ is an online funding platform that provides tools to raise money and share your finances with full transparency. It is the platform of choice for individuals and companies to make one-time or recurring donations directly to the project. If you are interested in making a financial contribution, please visit the `Arrow collective `_.
+
diff --git a/third_party/python/arrow/arrow-1.3.0.dist-info/RECORD b/third_party/python/arrow/arrow-1.3.0.dist-info/RECORD
new file mode 100644
index 000000000000..6b7ca331e4af
--- /dev/null
+++ b/third_party/python/arrow/arrow-1.3.0.dist-info/RECORD
@@ -0,0 +1,15 @@
+arrow/__init__.py,sha256=HxsSJGl56GoeHB__No-kdGmC_Wes_Ttf0ohOy7OoFig,872
+arrow/_version.py,sha256=F5mW07pSyGrqDNY2Ehr-UpDzpBtN-FsYU0QGZWf6PJE,22
+arrow/api.py,sha256=6tdqrG0NjrKO22_eWHU4a5xerfR6IrZPY-yynGpnvTM,2755
+arrow/arrow.py,sha256=m9XvNnpQ1aTHZWXPud3W2-QMfilgWXnUCnuZInwf27g,63517
+arrow/constants.py,sha256=y3scgWgxiFuQg4DeFlhmexy1BA7K8LFNZyqK-VWPQJs,3238
+arrow/factory.py,sha256=qiDSokfcVWJhiJbIkOcU1Ohh4N0PdKxghsJzBnI8AUo,11432
+arrow/formatter.py,sha256=0D0-AjBZwuay9312KvY0UnaVBfAZj-vEIqWcG0_3ZDQ,5267
+arrow/locales.py,sha256=6g5xHq5UkIAZPF8N2PvzN_xoUvsfNcPhNfJw0TUi8tw,156894
+arrow/parser.py,sha256=FO6NWpzjvZcsMhIck6pd7hKe1ijlKUZE9l_OFlyskyw,25790
+arrow/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+arrow/util.py,sha256=xnDevqRyNeYWbl3x-n_Tyo4cOgHcdgbxFECFsJ1XoEc,3679
+arrow-1.3.0.dist-info/LICENSE,sha256=tIH4cpbLCr2xP9jLuUsUwyi-iA7J5oVHphuE2s_9Bno,11341
+arrow-1.3.0.dist-info/WHEEL,sha256=EZbGkh7Ie4PoZfRQ8I0ZuP9VklN_TvcZ6DSE5Uar4z4,81
+arrow-1.3.0.dist-info/METADATA,sha256=P7gh6Gt6pIqBLBP577OoTZWFhRmAOpMyiwpuNEeklac,7534
+arrow-1.3.0.dist-info/RECORD,,
diff --git a/third_party/python/build/build-1.2.1.dist-info/WHEEL b/third_party/python/arrow/arrow-1.3.0.dist-info/WHEEL
similarity index 100%
rename from third_party/python/build/build-1.2.1.dist-info/WHEEL
rename to third_party/python/arrow/arrow-1.3.0.dist-info/WHEEL
diff --git a/third_party/python/arrow/arrow/_version.py b/third_party/python/arrow/arrow/_version.py
index 10aa336ce071..67bc602abf06 100644
--- a/third_party/python/arrow/arrow/_version.py
+++ b/third_party/python/arrow/arrow/_version.py
@@ -1 +1 @@
-__version__ = "1.2.3"
+__version__ = "1.3.0"
diff --git a/third_party/python/arrow/arrow/arrow.py b/third_party/python/arrow/arrow/arrow.py
index 1ede107f5632..8d329efd8145 100644
--- a/third_party/python/arrow/arrow/arrow.py
+++ b/third_party/python/arrow/arrow/arrow.py
@@ -168,9 +168,9 @@ class Arrow:
isinstance(tzinfo, dt_tzinfo)
and hasattr(tzinfo, "localize")
and hasattr(tzinfo, "zone")
- and tzinfo.zone # type: ignore[attr-defined]
+ and tzinfo.zone
):
- tzinfo = parser.TzinfoParser.parse(tzinfo.zone) # type: ignore[attr-defined]
+ tzinfo = parser.TzinfoParser.parse(tzinfo.zone)
elif isinstance(tzinfo, str):
tzinfo = parser.TzinfoParser.parse(tzinfo)
@@ -495,7 +495,7 @@ class Arrow:
yield current
values = [getattr(current, f) for f in cls._ATTRS]
- current = cls(*values, tzinfo=tzinfo).shift( # type: ignore
+ current = cls(*values, tzinfo=tzinfo).shift( # type: ignore[misc]
**{frame_relative: relative_steps}
)
@@ -578,7 +578,7 @@ class Arrow:
for _ in range(3 - len(values)):
values.append(1)
- floor = self.__class__(*values, tzinfo=self.tzinfo) # type: ignore
+ floor = self.__class__(*values, tzinfo=self.tzinfo) # type: ignore[misc]
if frame_absolute == "week":
# if week_start is greater than self.isoweekday() go back one week by setting delta = 7
@@ -792,7 +792,6 @@ class Arrow:
return self._datetime.isoformat()
def __format__(self, formatstr: str) -> str:
-
if len(formatstr) > 0:
return self.format(formatstr)
@@ -804,7 +803,6 @@ class Arrow:
# attributes and properties
def __getattr__(self, name: str) -> int:
-
if name == "week":
return self.isocalendar()[1]
@@ -965,7 +963,6 @@ class Arrow:
absolute_kwargs = {}
for key, value in kwargs.items():
-
if key in self._ATTRS:
absolute_kwargs[key] = value
elif key in ["week", "quarter"]:
@@ -1022,7 +1019,6 @@ class Arrow:
additional_attrs = ["weeks", "quarters", "weekday"]
for key, value in kwargs.items():
-
if key in self._ATTRS_PLURAL or key in additional_attrs:
relative_kwargs[key] = value
else:
@@ -1259,11 +1255,10 @@ class Arrow:
)
if trunc(abs(delta)) != 1:
- granularity += "s" # type: ignore
+ granularity += "s" # type: ignore[assignment]
return locale.describe(granularity, delta, only_distance=only_distance)
else:
-
if not granularity:
raise ValueError(
"Empty granularity list provided. "
@@ -1314,7 +1309,7 @@ class Arrow:
def dehumanize(self, input_string: str, locale: str = "en_us") -> "Arrow":
"""Returns a new :class:`Arrow ` object, that represents
- the time difference relative to the attrbiutes of the
+ the time difference relative to the attributes of the
:class:`Arrow ` object.
:param timestring: a ``str`` representing a humanized relative time.
@@ -1367,7 +1362,6 @@ class Arrow:
# Search input string for each time unit within locale
for unit, unit_object in locale_obj.timeframes.items():
-
# Need to check the type of unit_object to create the correct dictionary
if isinstance(unit_object, Mapping):
strings_to_search = unit_object
@@ -1378,7 +1372,6 @@ class Arrow:
# Needs to cycle all through strings as some locales have strings that
# could overlap in a regex match, since input validation isn't being performed.
for time_delta, time_string in strings_to_search.items():
-
# Replace {0} with regex \d representing digits
search_string = str(time_string)
search_string = search_string.format(r"\d+")
@@ -1419,7 +1412,7 @@ class Arrow:
# Assert error if string does not modify any units
if not any([True for k, v in unit_visited.items() if v]):
raise ValueError(
- "Input string not valid. Note: Some locales do not support the week granulairty in Arrow. "
+ "Input string not valid. Note: Some locales do not support the week granularity in Arrow. "
"If you are attempting to use the week granularity on an unsupported locale, this could be the cause of this error."
)
@@ -1718,7 +1711,6 @@ class Arrow:
# math
def __add__(self, other: Any) -> "Arrow":
-
if isinstance(other, (timedelta, relativedelta)):
return self.fromdatetime(self._datetime + other, self._datetime.tzinfo)
@@ -1736,7 +1728,6 @@ class Arrow:
pass # pragma: no cover
def __sub__(self, other: Any) -> Union[timedelta, "Arrow"]:
-
if isinstance(other, (timedelta, relativedelta)):
return self.fromdatetime(self._datetime - other, self._datetime.tzinfo)
@@ -1749,7 +1740,6 @@ class Arrow:
return NotImplemented
def __rsub__(self, other: Any) -> timedelta:
-
if isinstance(other, dt_datetime):
return other - self._datetime
@@ -1758,42 +1748,36 @@ class Arrow:
# comparisons
def __eq__(self, other: Any) -> bool:
-
if not isinstance(other, (Arrow, dt_datetime)):
return False
return self._datetime == self._get_datetime(other)
def __ne__(self, other: Any) -> bool:
-
if not isinstance(other, (Arrow, dt_datetime)):
return True
return not self.__eq__(other)
def __gt__(self, other: Any) -> bool:
-
if not isinstance(other, (Arrow, dt_datetime)):
return NotImplemented
return self._datetime > self._get_datetime(other)
def __ge__(self, other: Any) -> bool:
-
if not isinstance(other, (Arrow, dt_datetime)):
return NotImplemented
return self._datetime >= self._get_datetime(other)
def __lt__(self, other: Any) -> bool:
-
if not isinstance(other, (Arrow, dt_datetime)):
return NotImplemented
return self._datetime < self._get_datetime(other)
def __le__(self, other: Any) -> bool:
-
if not isinstance(other, (Arrow, dt_datetime)):
return NotImplemented
@@ -1865,7 +1849,6 @@ class Arrow:
def _get_iteration_params(cls, end: Any, limit: Optional[int]) -> Tuple[Any, int]:
"""Sets default end and limit values for range method."""
if end is None:
-
if limit is None:
raise ValueError("One of 'end' or 'limit' is required.")
diff --git a/third_party/python/arrow/arrow/factory.py b/third_party/python/arrow/arrow/factory.py
index aad4af8bdec2..f35085f1c6bd 100644
--- a/third_party/python/arrow/arrow/factory.py
+++ b/third_party/python/arrow/arrow/factory.py
@@ -267,11 +267,9 @@ class ArrowFactory:
raise TypeError(f"Cannot parse single argument of type {type(arg)!r}.")
elif arg_count == 2:
-
arg_1, arg_2 = args[0], args[1]
if isinstance(arg_1, datetime):
-
# (datetime, tzinfo/str) -> fromdatetime @ tzinfo
if isinstance(arg_2, (dt_tzinfo, str)):
return self.type.fromdatetime(arg_1, tzinfo=arg_2)
@@ -281,7 +279,6 @@ class ArrowFactory:
)
elif isinstance(arg_1, date):
-
# (date, tzinfo/str) -> fromdate @ tzinfo
if isinstance(arg_2, (dt_tzinfo, str)):
return self.type.fromdate(arg_1, tzinfo=arg_2)
diff --git a/third_party/python/arrow/arrow/formatter.py b/third_party/python/arrow/arrow/formatter.py
index 728bea1aafc6..d45f7153921f 100644
--- a/third_party/python/arrow/arrow/formatter.py
+++ b/third_party/python/arrow/arrow/formatter.py
@@ -29,7 +29,6 @@ FORMAT_W3C: Final[str] = "YYYY-MM-DD HH:mm:ssZZ"
class DateTimeFormatter:
-
# This pattern matches characters enclosed in square brackets are matched as
# an atomic group. For more info on atomic groups and how to they are
# emulated in Python's re library, see https://stackoverflow.com/a/13577411/2701578
@@ -41,18 +40,15 @@ class DateTimeFormatter:
locale: locales.Locale
def __init__(self, locale: str = DEFAULT_LOCALE) -> None:
-
self.locale = locales.get_locale(locale)
def format(cls, dt: datetime, fmt: str) -> str:
-
# FIXME: _format_token() is nullable
return cls._FORMAT_RE.sub(
lambda m: cast(str, cls._format_token(dt, m.group(0))), fmt
)
def _format_token(self, dt: datetime, token: Optional[str]) -> Optional[str]:
-
if token and token.startswith("[") and token.endswith("]"):
return token[1:-1]
diff --git a/third_party/python/arrow/arrow/locales.py b/third_party/python/arrow/arrow/locales.py
index 3627497f57b9..34b2a0986e0c 100644
--- a/third_party/python/arrow/arrow/locales.py
+++ b/third_party/python/arrow/arrow/locales.py
@@ -129,7 +129,6 @@ class Locale:
_locale_map[locale_name.lower().replace("_", "-")] = cls
def __init__(self) -> None:
-
self._month_name_to_ordinal = None
def describe(
@@ -174,7 +173,7 @@ class Locale:
# Needed to determine the correct relative string to use
timeframe_value = 0
- for _unit_name, unit_value in timeframes:
+ for _, unit_value in timeframes:
if trunc(unit_value) != 0:
timeframe_value = trunc(unit_value)
break
@@ -285,7 +284,6 @@ class Locale:
timeframe: TimeFrameLiteral,
delta: Union[float, int],
) -> str:
-
if timeframe == "now":
return humanized
@@ -425,7 +423,7 @@ class ItalianLocale(Locale):
"hours": "{0} ore",
"day": "un giorno",
"days": "{0} giorni",
- "week": "una settimana,",
+ "week": "una settimana",
"weeks": "{0} settimane",
"month": "un mese",
"months": "{0} mesi",
@@ -867,14 +865,16 @@ class FinnishLocale(Locale):
timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = {
"now": "juuri nyt",
- "second": "sekunti",
- "seconds": {"past": "{0} muutama sekunti", "future": "{0} muutaman sekunnin"},
+ "second": {"past": "sekunti", "future": "sekunnin"},
+ "seconds": {"past": "{0} sekuntia", "future": "{0} sekunnin"},
"minute": {"past": "minuutti", "future": "minuutin"},
"minutes": {"past": "{0} minuuttia", "future": "{0} minuutin"},
"hour": {"past": "tunti", "future": "tunnin"},
"hours": {"past": "{0} tuntia", "future": "{0} tunnin"},
- "day": "päivä",
+ "day": {"past": "päivä", "future": "päivän"},
"days": {"past": "{0} päivää", "future": "{0} päivän"},
+ "week": {"past": "viikko", "future": "viikon"},
+ "weeks": {"past": "{0} viikkoa", "future": "{0} viikon"},
"month": {"past": "kuukausi", "future": "kuukauden"},
"months": {"past": "{0} kuukautta", "future": "{0} kuukauden"},
"year": {"past": "vuosi", "future": "vuoden"},
@@ -1887,7 +1887,7 @@ class GermanBaseLocale(Locale):
future = "in {0}"
and_word = "und"
- timeframes = {
+ timeframes: ClassVar[Dict[TimeFrameLiteral, str]] = {
"now": "gerade eben",
"second": "einer Sekunde",
"seconds": "{0} Sekunden",
@@ -1982,7 +1982,9 @@ class GermanBaseLocale(Locale):
return super().describe(timeframe, delta, only_distance)
# German uses a different case without 'in' or 'ago'
- humanized = self.timeframes_only_distance[timeframe].format(trunc(abs(delta)))
+ humanized: str = self.timeframes_only_distance[timeframe].format(
+ trunc(abs(delta))
+ )
return humanized
@@ -2547,6 +2549,8 @@ class ArabicLocale(Locale):
"hours": {"2": "ساعتين", "ten": "{0} ساعات", "higher": "{0} ساعة"},
"day": "يوم",
"days": {"2": "يومين", "ten": "{0} أيام", "higher": "{0} يوم"},
+ "week": "اسبوع",
+ "weeks": {"2": "اسبوعين", "ten": "{0} أسابيع", "higher": "{0} اسبوع"},
"month": "شهر",
"months": {"2": "شهرين", "ten": "{0} أشهر", "higher": "{0} شهر"},
"year": "سنة",
@@ -3709,6 +3713,8 @@ class HungarianLocale(Locale):
"hours": {"past": "{0} órával", "future": "{0} óra"},
"day": {"past": "egy nappal", "future": "egy nap"},
"days": {"past": "{0} nappal", "future": "{0} nap"},
+ "week": {"past": "egy héttel", "future": "egy hét"},
+ "weeks": {"past": "{0} héttel", "future": "{0} hét"},
"month": {"past": "egy hónappal", "future": "egy hónap"},
"months": {"past": "{0} hónappal", "future": "{0} hónap"},
"year": {"past": "egy évvel", "future": "egy év"},
@@ -3934,7 +3940,6 @@ class ThaiLocale(Locale):
class LaotianLocale(Locale):
-
names = ["lo", "lo-la"]
past = "{0} ກ່ອນຫນ້ານີ້"
@@ -4119,6 +4124,7 @@ class BengaliLocale(Locale):
return f"{n}র্থ"
if n == 6:
return f"{n}ষ্ঠ"
+ return ""
class RomanshLocale(Locale):
@@ -4137,6 +4143,8 @@ class RomanshLocale(Locale):
"hours": "{0} ura",
"day": "in di",
"days": "{0} dis",
+ "week": "in'emna",
+ "weeks": "{0} emnas",
"month": "in mais",
"months": "{0} mais",
"year": "in onn",
@@ -5399,7 +5407,7 @@ class LuxembourgishLocale(Locale):
future = "an {0}"
and_word = "an"
- timeframes = {
+ timeframes: ClassVar[Dict[TimeFrameLiteral, str]] = {
"now": "just elo",
"second": "enger Sekonn",
"seconds": "{0} Sekonnen",
@@ -5487,7 +5495,9 @@ class LuxembourgishLocale(Locale):
return super().describe(timeframe, delta, only_distance)
# Luxembourgish uses a different case without 'in' or 'ago'
- humanized = self.timeframes_only_distance[timeframe].format(trunc(abs(delta)))
+ humanized: str = self.timeframes_only_distance[timeframe].format(
+ trunc(abs(delta))
+ )
return humanized
diff --git a/third_party/python/arrow/arrow/parser.py b/third_party/python/arrow/arrow/parser.py
index e95d78b0d6eb..645e3da74141 100644
--- a/third_party/python/arrow/arrow/parser.py
+++ b/third_party/python/arrow/arrow/parser.py
@@ -159,7 +159,6 @@ class DateTimeParser:
_input_re_map: Dict[_FORMAT_TYPE, Pattern[str]]
def __init__(self, locale: str = DEFAULT_LOCALE, cache_size: int = 0) -> None:
-
self.locale = locales.get_locale(locale)
self._input_re_map = self._BASE_INPUT_RE_MAP.copy()
self._input_re_map.update(
@@ -196,7 +195,6 @@ class DateTimeParser:
def parse_iso(
self, datetime_string: str, normalize_whitespace: bool = False
) -> datetime:
-
if normalize_whitespace:
datetime_string = re.sub(r"\s+", " ", datetime_string.strip())
@@ -236,13 +234,14 @@ class DateTimeParser:
]
if has_time:
-
if has_space_divider:
date_string, time_string = datetime_string.split(" ", 1)
else:
date_string, time_string = datetime_string.split("T", 1)
- time_parts = re.split(r"[\+\-Z]", time_string, 1, re.IGNORECASE)
+ time_parts = re.split(
+ r"[\+\-Z]", time_string, maxsplit=1, flags=re.IGNORECASE
+ )
time_components: Optional[Match[str]] = self._TIME_RE.match(time_parts[0])
@@ -303,7 +302,6 @@ class DateTimeParser:
fmt: Union[List[str], str],
normalize_whitespace: bool = False,
) -> datetime:
-
if normalize_whitespace:
datetime_string = re.sub(r"\s+", " ", datetime_string)
@@ -341,12 +339,11 @@ class DateTimeParser:
f"Unable to find a match group for the specified token {token!r}."
)
- self._parse_token(token, value, parts) # type: ignore
+ self._parse_token(token, value, parts) # type: ignore[arg-type]
return self._build_datetime(parts)
def _generate_pattern_re(self, fmt: str) -> Tuple[List[_FORMAT_TYPE], Pattern[str]]:
-
# fmt is a string of tokens like 'YYYY-MM-DD'
# we construct a new string by replacing each
# token by its pattern:
@@ -498,7 +495,6 @@ class DateTimeParser:
value: Any,
parts: _Parts,
) -> None:
-
if token == "YYYY":
parts["year"] = int(value)
@@ -508,7 +504,7 @@ class DateTimeParser:
elif token in ["MMMM", "MMM"]:
# FIXME: month_number() is nullable
- parts["month"] = self.locale.month_number(value.lower()) # type: ignore
+ parts["month"] = self.locale.month_number(value.lower()) # type: ignore[typeddict-item]
elif token in ["MM", "M"]:
parts["month"] = int(value)
@@ -588,7 +584,6 @@ class DateTimeParser:
weekdate = parts.get("weekdate")
if weekdate is not None:
-
year, week = int(weekdate[0]), int(weekdate[1])
if weekdate[2] is not None:
@@ -712,7 +707,6 @@ class DateTimeParser:
)
def _parse_multiformat(self, string: str, formats: Iterable[str]) -> datetime:
-
_datetime: Optional[datetime] = None
for fmt in formats:
@@ -740,12 +734,11 @@ class DateTimeParser:
class TzinfoParser:
_TZINFO_RE: ClassVar[Pattern[str]] = re.compile(
- r"^([\+\-])?(\d{2})(?:\:?(\d{2}))?$"
+ r"^(?:\(UTC)*([\+\-])?(\d{2})(?:\:?(\d{2}))?"
)
@classmethod
def parse(cls, tzinfo_string: str) -> dt_tzinfo:
-
tzinfo: Optional[dt_tzinfo] = None
if tzinfo_string == "local":
@@ -755,7 +748,6 @@ class TzinfoParser:
tzinfo = tz.tzutc()
else:
-
iso_match = cls._TZINFO_RE.match(tzinfo_string)
if iso_match:
diff --git a/third_party/python/build/build-1.2.1.dist-info/LICENSE b/third_party/python/build/build-1.2.2.dist-info/LICENSE
similarity index 100%
rename from third_party/python/build/build-1.2.1.dist-info/LICENSE
rename to third_party/python/build/build-1.2.2.dist-info/LICENSE
diff --git a/third_party/python/build/build-1.2.1.dist-info/METADATA b/third_party/python/build/build-1.2.2.dist-info/METADATA
similarity index 68%
rename from third_party/python/build/build-1.2.1.dist-info/METADATA
rename to third_party/python/build/build-1.2.2.dist-info/METADATA
index 98c8cd2ab5bf..5c798844127f 100644
--- a/third_party/python/build/build-1.2.1.dist-info/METADATA
+++ b/third_party/python/build/build-1.2.2.dist-info/METADATA
@@ -1,6 +1,6 @@
Metadata-Version: 2.1
Name: build
-Version: 1.2.1
+Version: 1.2.2
Summary: A simple, correct Python build frontend
Author-email: Filipe Laíns , Bernát Gábor , layday , Henry Schreiner
Requires-Python: >= 3.8
@@ -86,10 +86,67 @@ This will build the package in an isolated environment, generating a
source-distribution and wheel in the directory `dist/`.
See the [documentation](https://build.pypa.io) for full information.
+### Common arguments
+
+- `--sdist` (`-s`): Produce just an SDist
+- `--wheel` (`-w`): Produce just a wheel
+- `-C
+
+ Featured Packages
+
+
+
+
+
+
+
+
+ In other language (unofficial port - by the community)
+
+
+
+
> A library that helps you read text from an unknown charset encoding.
Motivated by `chardet`,
> I'm trying to resolve the issue by taking a new approach.
@@ -56,21 +71,22 @@ Provides-Extra: unicode_backport
This project offers you an alternative to **Universal Charset Encoding Detector**, also known as **Chardet**.
-| Feature | [Chardet](https://github.com/chardet/chardet) | Charset Normalizer | [cChardet](https://github.com/PyYoshi/cChardet) |
-|--------------------------------------------------|:---------------------------------------------:|:------------------------------------------------------------------------------------------------------:|:-----------------------------------------------:|
-| `Fast` | ❌
| ✅
| ✅
|
-| `Universal**` | ❌ | ✅ | ❌ |
-| `Reliable` **without** distinguishable standards | ❌ | ✅ | ✅ |
-| `Reliable` **with** distinguishable standards | ✅ | ✅ | ✅ |
-| `License` | LGPL-2.1
_restrictive_ | MIT | MPL-1.1
_restrictive_ |
-| `Native Python` | ✅ | ✅ | ❌ |
-| `Detect spoken language` | ❌ | ✅ | N/A |
-| `UnicodeDecodeError Safety` | ❌ | ✅ | ❌ |
-| `Whl Size` | 193.6 kB | 40 kB | ~200 kB |
-| `Supported Encoding` | 33 | 🎉 [90](https://charset-normalizer.readthedocs.io/en/latest/user/support.html#supported-encodings) | 40 |
+| Feature | [Chardet](https://github.com/chardet/chardet) | Charset Normalizer | [cChardet](https://github.com/PyYoshi/cChardet) |
+|--------------------------------------------------|:---------------------------------------------:|:--------------------------------------------------------------------------------------------------:|:-----------------------------------------------:|
+| `Fast` | ❌ | ✅ | ✅ |
+| `Universal**` | ❌ | ✅ | ❌ |
+| `Reliable` **without** distinguishable standards | ❌ | ✅ | ✅ |
+| `Reliable` **with** distinguishable standards | ✅ | ✅ | ✅ |
+| `License` | LGPL-2.1
_restrictive_ | MIT | MPL-1.1
_restrictive_ |
+| `Native Python` | ✅ | ✅ | ❌ |
+| `Detect spoken language` | ❌ | ✅ | N/A |
+| `UnicodeDecodeError Safety` | ❌ | ✅ | ❌ |
+| `Whl Size (min)` | 193.6 kB | 42 kB | ~200 kB |
+| `Supported Encoding` | 33 | 🎉 [99](https://charset-normalizer.readthedocs.io/en/latest/user/support.html#supported-encodings) | 40 |

+
*\*\* : They are clearly using specific code for a specific encoding even if covering most of used one*
Did you got there because of the logs? See [https://charset-normalizer.readthedocs.io/en/latest/user/miscellaneous.html](https://charset-normalizer.readthedocs.io/en/latest/user/miscellaneous.html)
@@ -145,6 +161,12 @@ optional arguments:
normalizer ./data/sample.1.fr.srt
```
+or
+
+```bash
+python -m charset_normalizer ./data/sample.1.fr.srt
+```
+
🎉 Since version 1.4.0 the CLI produce easily usable stdout result in JSON format.
```json
@@ -241,6 +263,7 @@ that intel is worth something here. So I use those records against decoded text
- Python >=2.7,<3.5: Unsupported
- Python 3.5: charset-normalizer < 2.1
- Python 3.6: charset-normalizer < 3.1
+- Python 3.7: charset-normalizer < 4.0
Upgrade your Python interpreter as soon as possible.
@@ -270,6 +293,38 @@ tools.
All notable changes to charset-normalizer will be documented in this file. This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
+## [3.3.2](https://github.com/Ousret/charset_normalizer/compare/3.3.1...3.3.2) (2023-10-31)
+
+### Fixed
+- Unintentional memory usage regression when using large payload that match several encoding (#376)
+- Regression on some detection case showcased in the documentation (#371)
+
+### Added
+- Noise (md) probe that identify malformed arabic representation due to the presence of letters in isolated form (credit to my wife)
+
+## [3.3.1](https://github.com/Ousret/charset_normalizer/compare/3.3.0...3.3.1) (2023-10-22)
+
+### Changed
+- Optional mypyc compilation upgraded to version 1.6.1 for Python >= 3.8
+- Improved the general detection reliability based on reports from the community
+
+## [3.3.0](https://github.com/Ousret/charset_normalizer/compare/3.2.0...3.3.0) (2023-09-30)
+
+### Added
+- Allow to execute the CLI (e.g. normalizer) through `python -m charset_normalizer.cli` or `python -m charset_normalizer`
+- Support for 9 forgotten encoding that are supported by Python but unlisted in `encoding.aliases` as they have no alias (#323)
+
+### Removed
+- (internal) Redundant utils.is_ascii function and unused function is_private_use_only
+- (internal) charset_normalizer.assets is moved inside charset_normalizer.constant
+
+### Changed
+- (internal) Unicode code blocks in constants are updated using the latest v15.0.0 definition to improve detection
+- Optional mypyc compilation upgraded to version 1.5.1 for Python >= 3.8
+
+### Fixed
+- Unable to properly sort CharsetMatch when both chaos/noise and coherence were close due to an unreachable condition in \_\_lt\_\_ (#350)
+
## [3.2.0](https://github.com/Ousret/charset_normalizer/compare/3.1.0...3.2.0) (2023-06-07)
### Changed
diff --git a/third_party/python/charset_normalizer/charset_normalizer-3.3.2.dist-info/RECORD b/third_party/python/charset_normalizer/charset_normalizer-3.3.2.dist-info/RECORD
new file mode 100644
index 000000000000..04323fbc2a05
--- /dev/null
+++ b/third_party/python/charset_normalizer/charset_normalizer-3.3.2.dist-info/RECORD
@@ -0,0 +1,19 @@
+charset_normalizer/__init__.py,sha256=UzI3xC8PhmcLRMzSgPb6minTmRq0kWznnCBJ8ZCc2XI,1577
+charset_normalizer/__main__.py,sha256=JxY8bleaENOFlLRb9HfoeZCzAMnn2A1oGR5Xm2eyqg0,73
+charset_normalizer/api.py,sha256=WOlWjy6wT8SeMYFpaGbXZFN1TMXa-s8vZYfkL4G29iQ,21097
+charset_normalizer/cd.py,sha256=xwZliZcTQFA3jU0c00PRiu9MNxXTFxQkFLWmMW24ZzI,12560
+charset_normalizer/constant.py,sha256=p0IsOVcEbPWYPOdWhnhRbjK1YVBy6fs05C5vKC-zoxU,40481
+charset_normalizer/legacy.py,sha256=T-QuVMsMeDiQEk8WSszMrzVJg_14AMeSkmHdRYhdl1k,2071
+charset_normalizer/md.py,sha256=NkSuVLK13_a8c7BxZ4cGIQ5vOtGIWOdh22WZEvjp-7U,19624
+charset_normalizer/models.py,sha256=I5i0s4aKCCgLPY2tUY3pwkgFA-BUbbNxQ7hVkVTt62s,11624
+charset_normalizer/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+charset_normalizer/utils.py,sha256=teiosMqzKjXyAHXnGdjSBOgnBZwx-SkBbCLrx0UXy8M,11894
+charset_normalizer/version.py,sha256=iHKUfHD3kDRSyrh_BN2ojh43TA5-UZQjvbVIEFfpHDs,79
+charset_normalizer/cli/__init__.py,sha256=D5ERp8P62llm2FuoMzydZ7d9rs8cvvLXqE-1_6oViPc,100
+charset_normalizer/cli/__main__.py,sha256=2F-xURZJzo063Ye-2RLJ2wcmURpbKeAzKwpiws65dAs,9744
+charset_normalizer-3.3.2.dist-info/LICENSE,sha256=6zGgxaT7Cbik4yBV0lweX5w1iidS_vPNcgIT0cz-4kE,1070
+charset_normalizer-3.3.2.dist-info/METADATA,sha256=cfLhl5A6SI-F0oclm8w8ux9wshL1nipdeCdVnYb4AaA,33550
+charset_normalizer-3.3.2.dist-info/WHEEL,sha256=Xo9-1PvkuimrydujYJAjF7pCkriuXBpUPEjma1nZyJ0,92
+charset_normalizer-3.3.2.dist-info/entry_points.txt,sha256=ADSTKrkXZ3hhdOVFi6DcUEHQRS0xfxDIE_pEz4wLIXA,65
+charset_normalizer-3.3.2.dist-info/top_level.txt,sha256=7ASyzePr8_xuZWJsnqJjIBtyV8vhEo0wBCv1MPRRi3Q,19
+charset_normalizer-3.3.2.dist-info/RECORD,,
diff --git a/third_party/python/zipp/zipp-3.4.1.dist-info/WHEEL b/third_party/python/charset_normalizer/charset_normalizer-3.3.2.dist-info/WHEEL
similarity index 65%
rename from third_party/python/zipp/zipp-3.4.1.dist-info/WHEEL
rename to third_party/python/charset_normalizer/charset_normalizer-3.3.2.dist-info/WHEEL
index 385faab0525c..ba48cbcf9275 100644
--- a/third_party/python/zipp/zipp-3.4.1.dist-info/WHEEL
+++ b/third_party/python/charset_normalizer/charset_normalizer-3.3.2.dist-info/WHEEL
@@ -1,5 +1,5 @@
Wheel-Version: 1.0
-Generator: bdist_wheel (0.36.2)
+Generator: bdist_wheel (0.41.3)
Root-Is-Purelib: true
Tag: py3-none-any
diff --git a/third_party/python/charset_normalizer/charset_normalizer-3.3.2.dist-info/entry_points.txt b/third_party/python/charset_normalizer/charset_normalizer-3.3.2.dist-info/entry_points.txt
new file mode 100644
index 000000000000..65619e73ec06
--- /dev/null
+++ b/third_party/python/charset_normalizer/charset_normalizer-3.3.2.dist-info/entry_points.txt
@@ -0,0 +1,2 @@
+[console_scripts]
+normalizer = charset_normalizer.cli:cli_detect
diff --git a/third_party/python/charset_normalizer/charset_normalizer-3.2.0.dist-info/top_level.txt b/third_party/python/charset_normalizer/charset_normalizer-3.3.2.dist-info/top_level.txt
similarity index 100%
rename from third_party/python/charset_normalizer/charset_normalizer-3.2.0.dist-info/top_level.txt
rename to third_party/python/charset_normalizer/charset_normalizer-3.3.2.dist-info/top_level.txt
diff --git a/third_party/python/charset_normalizer/charset_normalizer/__main__.py b/third_party/python/charset_normalizer/charset_normalizer/__main__.py
new file mode 100644
index 000000000000..beae2ef77490
--- /dev/null
+++ b/third_party/python/charset_normalizer/charset_normalizer/__main__.py
@@ -0,0 +1,4 @@
+from .cli import cli_detect
+
+if __name__ == "__main__":
+ cli_detect()
diff --git a/third_party/python/charset_normalizer/charset_normalizer/assets/__init__.py b/third_party/python/charset_normalizer/charset_normalizer/assets/__init__.py
deleted file mode 100644
index 9075930dc8f9..000000000000
--- a/third_party/python/charset_normalizer/charset_normalizer/assets/__init__.py
+++ /dev/null
@@ -1,1440 +0,0 @@
-# -*- coding: utf-8 -*-
-from typing import Dict, List
-
-# Language label that contain the em dash "—"
-# character are to be considered alternative seq to origin
-FREQUENCIES: Dict[str, List[str]] = {
- "English": [
- "e",
- "a",
- "t",
- "i",
- "o",
- "n",
- "s",
- "r",
- "h",
- "l",
- "d",
- "c",
- "u",
- "m",
- "f",
- "p",
- "g",
- "w",
- "y",
- "b",
- "v",
- "k",
- "x",
- "j",
- "z",
- "q",
- ],
- "English—": [
- "e",
- "a",
- "t",
- "i",
- "o",
- "n",
- "s",
- "r",
- "h",
- "l",
- "d",
- "c",
- "m",
- "u",
- "f",
- "p",
- "g",
- "w",
- "b",
- "y",
- "v",
- "k",
- "j",
- "x",
- "z",
- "q",
- ],
- "German": [
- "e",
- "n",
- "i",
- "r",
- "s",
- "t",
- "a",
- "d",
- "h",
- "u",
- "l",
- "g",
- "o",
- "c",
- "m",
- "b",
- "f",
- "k",
- "w",
- "z",
- "p",
- "v",
- "ü",
- "ä",
- "ö",
- "j",
- ],
- "French": [
- "e",
- "a",
- "s",
- "n",
- "i",
- "t",
- "r",
- "l",
- "u",
- "o",
- "d",
- "c",
- "p",
- "m",
- "é",
- "v",
- "g",
- "f",
- "b",
- "h",
- "q",
- "à",
- "x",
- "è",
- "y",
- "j",
- ],
- "Dutch": [
- "e",
- "n",
- "a",
- "i",
- "r",
- "t",
- "o",
- "d",
- "s",
- "l",
- "g",
- "h",
- "v",
- "m",
- "u",
- "k",
- "c",
- "p",
- "b",
- "w",
- "j",
- "z",
- "f",
- "y",
- "x",
- "ë",
- ],
- "Italian": [
- "e",
- "i",
- "a",
- "o",
- "n",
- "l",
- "t",
- "r",
- "s",
- "c",
- "d",
- "u",
- "p",
- "m",
- "g",
- "v",
- "f",
- "b",
- "z",
- "h",
- "q",
- "è",
- "à",
- "k",
- "y",
- "ò",
- ],
- "Polish": [
- "a",
- "i",
- "o",
- "e",
- "n",
- "r",
- "z",
- "w",
- "s",
- "c",
- "t",
- "k",
- "y",
- "d",
- "p",
- "m",
- "u",
- "l",
- "j",
- "ł",
- "g",
- "b",
- "h",
- "ą",
- "ę",
- "ó",
- ],
- "Spanish": [
- "e",
- "a",
- "o",
- "n",
- "s",
- "r",
- "i",
- "l",
- "d",
- "t",
- "c",
- "u",
- "m",
- "p",
- "b",
- "g",
- "v",
- "f",
- "y",
- "ó",
- "h",
- "q",
- "í",
- "j",
- "z",
- "á",
- ],
- "Russian": [
- "о",
- "а",
- "е",
- "и",
- "н",
- "с",
- "т",
- "р",
- "в",
- "л",
- "к",
- "м",
- "д",
- "п",
- "у",
- "г",
- "я",
- "ы",
- "з",
- "б",
- "й",
- "ь",
- "ч",
- "х",
- "ж",
- "ц",
- ],
- # Jap-Kanji
- "Japanese": [
- "人",
- "一",
- "大",
- "亅",
- "丁",
- "丨",
- "竹",
- "笑",
- "口",
- "日",
- "今",
- "二",
- "彳",
- "行",
- "十",
- "土",
- "丶",
- "寸",
- "寺",
- "時",
- "乙",
- "丿",
- "乂",
- "气",
- "気",
- "冂",
- "巾",
- "亠",
- "市",
- "目",
- "儿",
- "見",
- "八",
- "小",
- "凵",
- "県",
- "月",
- "彐",
- "門",
- "間",
- "木",
- "東",
- "山",
- "出",
- "本",
- "中",
- "刀",
- "分",
- "耳",
- "又",
- "取",
- "最",
- "言",
- "田",
- "心",
- "思",
- "刂",
- "前",
- "京",
- "尹",
- "事",
- "生",
- "厶",
- "云",
- "会",
- "未",
- "来",
- "白",
- "冫",
- "楽",
- "灬",
- "馬",
- "尸",
- "尺",
- "駅",
- "明",
- "耂",
- "者",
- "了",
- "阝",
- "都",
- "高",
- "卜",
- "占",
- "厂",
- "广",
- "店",
- "子",
- "申",
- "奄",
- "亻",
- "俺",
- "上",
- "方",
- "冖",
- "学",
- "衣",
- "艮",
- "食",
- "自",
- ],
- # Jap-Katakana
- "Japanese—": [
- "ー",
- "ン",
- "ス",
- "・",
- "ル",
- "ト",
- "リ",
- "イ",
- "ア",
- "ラ",
- "ッ",
- "ク",
- "ド",
- "シ",
- "レ",
- "ジ",
- "タ",
- "フ",
- "ロ",
- "カ",
- "テ",
- "マ",
- "ィ",
- "グ",
- "バ",
- "ム",
- "プ",
- "オ",
- "コ",
- "デ",
- "ニ",
- "ウ",
- "メ",
- "サ",
- "ビ",
- "ナ",
- "ブ",
- "ャ",
- "エ",
- "ュ",
- "チ",
- "キ",
- "ズ",
- "ダ",
- "パ",
- "ミ",
- "ェ",
- "ョ",
- "ハ",
- "セ",
- "ベ",
- "ガ",
- "モ",
- "ツ",
- "ネ",
- "ボ",
- "ソ",
- "ノ",
- "ァ",
- "ヴ",
- "ワ",
- "ポ",
- "ペ",
- "ピ",
- "ケ",
- "ゴ",
- "ギ",
- "ザ",
- "ホ",
- "ゲ",
- "ォ",
- "ヤ",
- "ヒ",
- "ユ",
- "ヨ",
- "ヘ",
- "ゼ",
- "ヌ",
- "ゥ",
- "ゾ",
- "ヶ",
- "ヂ",
- "ヲ",
- "ヅ",
- "ヵ",
- "ヱ",
- "ヰ",
- "ヮ",
- "ヽ",
- "゠",
- "ヾ",
- "ヷ",
- "ヿ",
- "ヸ",
- "ヹ",
- "ヺ",
- ],
- # Jap-Hiragana
- "Japanese——": [
- "の",
- "に",
- "る",
- "た",
- "と",
- "は",
- "し",
- "い",
- "を",
- "で",
- "て",
- "が",
- "な",
- "れ",
- "か",
- "ら",
- "さ",
- "っ",
- "り",
- "す",
- "あ",
- "も",
- "こ",
- "ま",
- "う",
- "く",
- "よ",
- "き",
- "ん",
- "め",
- "お",
- "け",
- "そ",
- "つ",
- "だ",
- "や",
- "え",
- "ど",
- "わ",
- "ち",
- "み",
- "せ",
- "じ",
- "ば",
- "へ",
- "び",
- "ず",
- "ろ",
- "ほ",
- "げ",
- "む",
- "べ",
- "ひ",
- "ょ",
- "ゆ",
- "ぶ",
- "ご",
- "ゃ",
- "ね",
- "ふ",
- "ぐ",
- "ぎ",
- "ぼ",
- "ゅ",
- "づ",
- "ざ",
- "ぞ",
- "ぬ",
- "ぜ",
- "ぱ",
- "ぽ",
- "ぷ",
- "ぴ",
- "ぃ",
- "ぁ",
- "ぇ",
- "ぺ",
- "ゞ",
- "ぢ",
- "ぉ",
- "ぅ",
- "ゐ",
- "ゝ",
- "ゑ",
- "゛",
- "゜",
- "ゎ",
- "ゔ",
- "゚",
- "ゟ",
- "゙",
- "ゕ",
- "ゖ",
- ],
- "Portuguese": [
- "a",
- "e",
- "o",
- "s",
- "i",
- "r",
- "d",
- "n",
- "t",
- "m",
- "u",
- "c",
- "l",
- "p",
- "g",
- "v",
- "b",
- "f",
- "h",
- "ã",
- "q",
- "é",
- "ç",
- "á",
- "z",
- "í",
- ],
- "Swedish": [
- "e",
- "a",
- "n",
- "r",
- "t",
- "s",
- "i",
- "l",
- "d",
- "o",
- "m",
- "k",
- "g",
- "v",
- "h",
- "f",
- "u",
- "p",
- "ä",
- "c",
- "b",
- "ö",
- "å",
- "y",
- "j",
- "x",
- ],
- "Chinese": [
- "的",
- "一",
- "是",
- "不",
- "了",
- "在",
- "人",
- "有",
- "我",
- "他",
- "这",
- "个",
- "们",
- "中",
- "来",
- "上",
- "大",
- "为",
- "和",
- "国",
- "地",
- "到",
- "以",
- "说",
- "时",
- "要",
- "就",
- "出",
- "会",
- "可",
- "也",
- "你",
- "对",
- "生",
- "能",
- "而",
- "子",
- "那",
- "得",
- "于",
- "着",
- "下",
- "自",
- "之",
- "年",
- "过",
- "发",
- "后",
- "作",
- "里",
- "用",
- "道",
- "行",
- "所",
- "然",
- "家",
- "种",
- "事",
- "成",
- "方",
- "多",
- "经",
- "么",
- "去",
- "法",
- "学",
- "如",
- "都",
- "同",
- "现",
- "当",
- "没",
- "动",
- "面",
- "起",
- "看",
- "定",
- "天",
- "分",
- "还",
- "进",
- "好",
- "小",
- "部",
- "其",
- "些",
- "主",
- "样",
- "理",
- "心",
- "她",
- "本",
- "前",
- "开",
- "但",
- "因",
- "只",
- "从",
- "想",
- "实",
- ],
- "Ukrainian": [
- "о",
- "а",
- "н",
- "і",
- "и",
- "р",
- "в",
- "т",
- "е",
- "с",
- "к",
- "л",
- "у",
- "д",
- "м",
- "п",
- "з",
- "я",
- "ь",
- "б",
- "г",
- "й",
- "ч",
- "х",
- "ц",
- "ї",
- ],
- "Norwegian": [
- "e",
- "r",
- "n",
- "t",
- "a",
- "s",
- "i",
- "o",
- "l",
- "d",
- "g",
- "k",
- "m",
- "v",
- "f",
- "p",
- "u",
- "b",
- "h",
- "å",
- "y",
- "j",
- "ø",
- "c",
- "æ",
- "w",
- ],
- "Finnish": [
- "a",
- "i",
- "n",
- "t",
- "e",
- "s",
- "l",
- "o",
- "u",
- "k",
- "ä",
- "m",
- "r",
- "v",
- "j",
- "h",
- "p",
- "y",
- "d",
- "ö",
- "g",
- "c",
- "b",
- "f",
- "w",
- "z",
- ],
- "Vietnamese": [
- "n",
- "h",
- "t",
- "i",
- "c",
- "g",
- "a",
- "o",
- "u",
- "m",
- "l",
- "r",
- "à",
- "đ",
- "s",
- "e",
- "v",
- "p",
- "b",
- "y",
- "ư",
- "d",
- "á",
- "k",
- "ộ",
- "ế",
- ],
- "Czech": [
- "o",
- "e",
- "a",
- "n",
- "t",
- "s",
- "i",
- "l",
- "v",
- "r",
- "k",
- "d",
- "u",
- "m",
- "p",
- "í",
- "c",
- "h",
- "z",
- "á",
- "y",
- "j",
- "b",
- "ě",
- "é",
- "ř",
- ],
- "Hungarian": [
- "e",
- "a",
- "t",
- "l",
- "s",
- "n",
- "k",
- "r",
- "i",
- "o",
- "z",
- "á",
- "é",
- "g",
- "m",
- "b",
- "y",
- "v",
- "d",
- "h",
- "u",
- "p",
- "j",
- "ö",
- "f",
- "c",
- ],
- "Korean": [
- "이",
- "다",
- "에",
- "의",
- "는",
- "로",
- "하",
- "을",
- "가",
- "고",
- "지",
- "서",
- "한",
- "은",
- "기",
- "으",
- "년",
- "대",
- "사",
- "시",
- "를",
- "리",
- "도",
- "인",
- "스",
- "일",
- ],
- "Indonesian": [
- "a",
- "n",
- "e",
- "i",
- "r",
- "t",
- "u",
- "s",
- "d",
- "k",
- "m",
- "l",
- "g",
- "p",
- "b",
- "o",
- "h",
- "y",
- "j",
- "c",
- "w",
- "f",
- "v",
- "z",
- "x",
- "q",
- ],
- "Turkish": [
- "a",
- "e",
- "i",
- "n",
- "r",
- "l",
- "ı",
- "k",
- "d",
- "t",
- "s",
- "m",
- "y",
- "u",
- "o",
- "b",
- "ü",
- "ş",
- "v",
- "g",
- "z",
- "h",
- "c",
- "p",
- "ç",
- "ğ",
- ],
- "Romanian": [
- "e",
- "i",
- "a",
- "r",
- "n",
- "t",
- "u",
- "l",
- "o",
- "c",
- "s",
- "d",
- "p",
- "m",
- "ă",
- "f",
- "v",
- "î",
- "g",
- "b",
- "ș",
- "ț",
- "z",
- "h",
- "â",
- "j",
- ],
- "Farsi": [
- "ا",
- "ی",
- "ر",
- "د",
- "ن",
- "ه",
- "و",
- "م",
- "ت",
- "ب",
- "س",
- "ل",
- "ک",
- "ش",
- "ز",
- "ف",
- "گ",
- "ع",
- "خ",
- "ق",
- "ج",
- "آ",
- "پ",
- "ح",
- "ط",
- "ص",
- ],
- "Arabic": [
- "ا",
- "ل",
- "ي",
- "م",
- "و",
- "ن",
- "ر",
- "ت",
- "ب",
- "ة",
- "ع",
- "د",
- "س",
- "ف",
- "ه",
- "ك",
- "ق",
- "أ",
- "ح",
- "ج",
- "ش",
- "ط",
- "ص",
- "ى",
- "خ",
- "إ",
- ],
- "Danish": [
- "e",
- "r",
- "n",
- "t",
- "a",
- "i",
- "s",
- "d",
- "l",
- "o",
- "g",
- "m",
- "k",
- "f",
- "v",
- "u",
- "b",
- "h",
- "p",
- "å",
- "y",
- "ø",
- "æ",
- "c",
- "j",
- "w",
- ],
- "Serbian": [
- "а",
- "и",
- "о",
- "е",
- "н",
- "р",
- "с",
- "у",
- "т",
- "к",
- "ј",
- "в",
- "д",
- "м",
- "п",
- "л",
- "г",
- "з",
- "б",
- "a",
- "i",
- "e",
- "o",
- "n",
- "ц",
- "ш",
- ],
- "Lithuanian": [
- "i",
- "a",
- "s",
- "o",
- "r",
- "e",
- "t",
- "n",
- "u",
- "k",
- "m",
- "l",
- "p",
- "v",
- "d",
- "j",
- "g",
- "ė",
- "b",
- "y",
- "ų",
- "š",
- "ž",
- "c",
- "ą",
- "į",
- ],
- "Slovene": [
- "e",
- "a",
- "i",
- "o",
- "n",
- "r",
- "s",
- "l",
- "t",
- "j",
- "v",
- "k",
- "d",
- "p",
- "m",
- "u",
- "z",
- "b",
- "g",
- "h",
- "č",
- "c",
- "š",
- "ž",
- "f",
- "y",
- ],
- "Slovak": [
- "o",
- "a",
- "e",
- "n",
- "i",
- "r",
- "v",
- "t",
- "s",
- "l",
- "k",
- "d",
- "m",
- "p",
- "u",
- "c",
- "h",
- "j",
- "b",
- "z",
- "á",
- "y",
- "ý",
- "í",
- "č",
- "é",
- ],
- "Hebrew": [
- "י",
- "ו",
- "ה",
- "ל",
- "ר",
- "ב",
- "ת",
- "מ",
- "א",
- "ש",
- "נ",
- "ע",
- "ם",
- "ד",
- "ק",
- "ח",
- "פ",
- "ס",
- "כ",
- "ג",
- "ט",
- "צ",
- "ן",
- "ז",
- "ך",
- ],
- "Bulgarian": [
- "а",
- "и",
- "о",
- "е",
- "н",
- "т",
- "р",
- "с",
- "в",
- "л",
- "к",
- "д",
- "п",
- "м",
- "з",
- "г",
- "я",
- "ъ",
- "у",
- "б",
- "ч",
- "ц",
- "й",
- "ж",
- "щ",
- "х",
- ],
- "Croatian": [
- "a",
- "i",
- "o",
- "e",
- "n",
- "r",
- "j",
- "s",
- "t",
- "u",
- "k",
- "l",
- "v",
- "d",
- "m",
- "p",
- "g",
- "z",
- "b",
- "c",
- "č",
- "h",
- "š",
- "ž",
- "ć",
- "f",
- ],
- "Hindi": [
- "क",
- "र",
- "स",
- "न",
- "त",
- "म",
- "ह",
- "प",
- "य",
- "ल",
- "व",
- "ज",
- "द",
- "ग",
- "ब",
- "श",
- "ट",
- "अ",
- "ए",
- "थ",
- "भ",
- "ड",
- "च",
- "ध",
- "ष",
- "इ",
- ],
- "Estonian": [
- "a",
- "i",
- "e",
- "s",
- "t",
- "l",
- "u",
- "n",
- "o",
- "k",
- "r",
- "d",
- "m",
- "v",
- "g",
- "p",
- "j",
- "h",
- "ä",
- "b",
- "õ",
- "ü",
- "f",
- "c",
- "ö",
- "y",
- ],
- "Thai": [
- "า",
- "น",
- "ร",
- "อ",
- "ก",
- "เ",
- "ง",
- "ม",
- "ย",
- "ล",
- "ว",
- "ด",
- "ท",
- "ส",
- "ต",
- "ะ",
- "ป",
- "บ",
- "ค",
- "ห",
- "แ",
- "จ",
- "พ",
- "ช",
- "ข",
- "ใ",
- ],
- "Greek": [
- "α",
- "τ",
- "ο",
- "ι",
- "ε",
- "ν",
- "ρ",
- "σ",
- "κ",
- "η",
- "π",
- "ς",
- "υ",
- "μ",
- "λ",
- "ί",
- "ό",
- "ά",
- "γ",
- "έ",
- "δ",
- "ή",
- "ω",
- "χ",
- "θ",
- "ύ",
- ],
- "Tamil": [
- "க",
- "த",
- "ப",
- "ட",
- "ர",
- "ம",
- "ல",
- "ன",
- "வ",
- "ற",
- "ய",
- "ள",
- "ச",
- "ந",
- "இ",
- "ண",
- "அ",
- "ஆ",
- "ழ",
- "ங",
- "எ",
- "உ",
- "ஒ",
- "ஸ",
- ],
- "Kazakh": [
- "а",
- "ы",
- "е",
- "н",
- "т",
- "р",
- "л",
- "і",
- "д",
- "с",
- "м",
- "қ",
- "к",
- "о",
- "б",
- "и",
- "у",
- "ғ",
- "ж",
- "ң",
- "з",
- "ш",
- "й",
- "п",
- "г",
- "ө",
- ],
-}
diff --git a/third_party/python/charset_normalizer/charset_normalizer/cd.py b/third_party/python/charset_normalizer/charset_normalizer/cd.py
index 6e56fe84a9e0..4ea6760c45bc 100644
--- a/third_party/python/charset_normalizer/charset_normalizer/cd.py
+++ b/third_party/python/charset_normalizer/charset_normalizer/cd.py
@@ -4,8 +4,13 @@ from collections import Counter
from functools import lru_cache
from typing import Counter as TypeCounter, Dict, List, Optional, Tuple
-from .assets import FREQUENCIES
-from .constant import KO_NAMES, LANGUAGE_SUPPORTED_COUNT, TOO_SMALL_SEQUENCE, ZH_NAMES
+from .constant import (
+ FREQUENCIES,
+ KO_NAMES,
+ LANGUAGE_SUPPORTED_COUNT,
+ TOO_SMALL_SEQUENCE,
+ ZH_NAMES,
+)
from .md import is_suspiciously_successive_range
from .models import CoherenceMatches
from .utils import (
diff --git a/third_party/python/charset_normalizer/charset_normalizer/cli/__init__.py b/third_party/python/charset_normalizer/charset_normalizer/cli/__init__.py
index e69de29bb2d1..d95fedfe5723 100644
--- a/third_party/python/charset_normalizer/charset_normalizer/cli/__init__.py
+++ b/third_party/python/charset_normalizer/charset_normalizer/cli/__init__.py
@@ -0,0 +1,6 @@
+from .__main__ import cli_detect, query_yes_no
+
+__all__ = (
+ "cli_detect",
+ "query_yes_no",
+)
diff --git a/third_party/python/charset_normalizer/charset_normalizer/cli/normalizer.py b/third_party/python/charset_normalizer/charset_normalizer/cli/__main__.py
similarity index 100%
rename from third_party/python/charset_normalizer/charset_normalizer/cli/normalizer.py
rename to third_party/python/charset_normalizer/charset_normalizer/cli/__main__.py
diff --git a/third_party/python/charset_normalizer/charset_normalizer/constant.py b/third_party/python/charset_normalizer/charset_normalizer/constant.py
index 3188108d6ba5..863490461eac 100644
--- a/third_party/python/charset_normalizer/charset_normalizer/constant.py
+++ b/third_party/python/charset_normalizer/charset_normalizer/constant.py
@@ -1,10 +1,9 @@
+# -*- coding: utf-8 -*-
from codecs import BOM_UTF8, BOM_UTF16_BE, BOM_UTF16_LE, BOM_UTF32_BE, BOM_UTF32_LE
from encodings.aliases import aliases
from re import IGNORECASE, compile as re_compile
from typing import Dict, List, Set, Union
-from .assets import FREQUENCIES
-
# Contain for each eligible encoding a list of/item bytes SIG/BOM
ENCODING_MARKS: Dict[str, Union[bytes, List[bytes]]] = {
"utf_8": BOM_UTF8,
@@ -23,288 +22,338 @@ ENCODING_MARKS: Dict[str, Union[bytes, List[bytes]]] = {
TOO_SMALL_SEQUENCE: int = 32
TOO_BIG_SEQUENCE: int = int(10e6)
-UTF8_MAXIMAL_ALLOCATION: int = 1112064
+UTF8_MAXIMAL_ALLOCATION: int = 1_112_064
+# Up-to-date Unicode ucd/15.0.0
UNICODE_RANGES_COMBINED: Dict[str, range] = {
- "Control character": range(31 + 1),
- "Basic Latin": range(32, 127 + 1),
- "Latin-1 Supplement": range(128, 255 + 1),
- "Latin Extended-A": range(256, 383 + 1),
- "Latin Extended-B": range(384, 591 + 1),
- "IPA Extensions": range(592, 687 + 1),
- "Spacing Modifier Letters": range(688, 767 + 1),
- "Combining Diacritical Marks": range(768, 879 + 1),
- "Greek and Coptic": range(880, 1023 + 1),
- "Cyrillic": range(1024, 1279 + 1),
- "Cyrillic Supplement": range(1280, 1327 + 1),
- "Armenian": range(1328, 1423 + 1),
- "Hebrew": range(1424, 1535 + 1),
- "Arabic": range(1536, 1791 + 1),
- "Syriac": range(1792, 1871 + 1),
- "Arabic Supplement": range(1872, 1919 + 1),
- "Thaana": range(1920, 1983 + 1),
- "NKo": range(1984, 2047 + 1),
- "Samaritan": range(2048, 2111 + 1),
- "Mandaic": range(2112, 2143 + 1),
- "Syriac Supplement": range(2144, 2159 + 1),
- "Arabic Extended-A": range(2208, 2303 + 1),
- "Devanagari": range(2304, 2431 + 1),
- "Bengali": range(2432, 2559 + 1),
- "Gurmukhi": range(2560, 2687 + 1),
- "Gujarati": range(2688, 2815 + 1),
- "Oriya": range(2816, 2943 + 1),
- "Tamil": range(2944, 3071 + 1),
- "Telugu": range(3072, 3199 + 1),
- "Kannada": range(3200, 3327 + 1),
- "Malayalam": range(3328, 3455 + 1),
- "Sinhala": range(3456, 3583 + 1),
- "Thai": range(3584, 3711 + 1),
- "Lao": range(3712, 3839 + 1),
- "Tibetan": range(3840, 4095 + 1),
- "Myanmar": range(4096, 4255 + 1),
- "Georgian": range(4256, 4351 + 1),
- "Hangul Jamo": range(4352, 4607 + 1),
- "Ethiopic": range(4608, 4991 + 1),
- "Ethiopic Supplement": range(4992, 5023 + 1),
- "Cherokee": range(5024, 5119 + 1),
- "Unified Canadian Aboriginal Syllabics": range(5120, 5759 + 1),
- "Ogham": range(5760, 5791 + 1),
- "Runic": range(5792, 5887 + 1),
- "Tagalog": range(5888, 5919 + 1),
- "Hanunoo": range(5920, 5951 + 1),
- "Buhid": range(5952, 5983 + 1),
- "Tagbanwa": range(5984, 6015 + 1),
- "Khmer": range(6016, 6143 + 1),
- "Mongolian": range(6144, 6319 + 1),
- "Unified Canadian Aboriginal Syllabics Extended": range(6320, 6399 + 1),
- "Limbu": range(6400, 6479 + 1),
- "Tai Le": range(6480, 6527 + 1),
- "New Tai Lue": range(6528, 6623 + 1),
- "Khmer Symbols": range(6624, 6655 + 1),
- "Buginese": range(6656, 6687 + 1),
- "Tai Tham": range(6688, 6831 + 1),
- "Combining Diacritical Marks Extended": range(6832, 6911 + 1),
- "Balinese": range(6912, 7039 + 1),
- "Sundanese": range(7040, 7103 + 1),
- "Batak": range(7104, 7167 + 1),
- "Lepcha": range(7168, 7247 + 1),
- "Ol Chiki": range(7248, 7295 + 1),
- "Cyrillic Extended C": range(7296, 7311 + 1),
- "Sundanese Supplement": range(7360, 7375 + 1),
- "Vedic Extensions": range(7376, 7423 + 1),
- "Phonetic Extensions": range(7424, 7551 + 1),
- "Phonetic Extensions Supplement": range(7552, 7615 + 1),
- "Combining Diacritical Marks Supplement": range(7616, 7679 + 1),
- "Latin Extended Additional": range(7680, 7935 + 1),
- "Greek Extended": range(7936, 8191 + 1),
- "General Punctuation": range(8192, 8303 + 1),
- "Superscripts and Subscripts": range(8304, 8351 + 1),
- "Currency Symbols": range(8352, 8399 + 1),
- "Combining Diacritical Marks for Symbols": range(8400, 8447 + 1),
- "Letterlike Symbols": range(8448, 8527 + 1),
- "Number Forms": range(8528, 8591 + 1),
- "Arrows": range(8592, 8703 + 1),
- "Mathematical Operators": range(8704, 8959 + 1),
- "Miscellaneous Technical": range(8960, 9215 + 1),
- "Control Pictures": range(9216, 9279 + 1),
- "Optical Character Recognition": range(9280, 9311 + 1),
- "Enclosed Alphanumerics": range(9312, 9471 + 1),
- "Box Drawing": range(9472, 9599 + 1),
- "Block Elements": range(9600, 9631 + 1),
- "Geometric Shapes": range(9632, 9727 + 1),
- "Miscellaneous Symbols": range(9728, 9983 + 1),
- "Dingbats": range(9984, 10175 + 1),
- "Miscellaneous Mathematical Symbols-A": range(10176, 10223 + 1),
- "Supplemental Arrows-A": range(10224, 10239 + 1),
- "Braille Patterns": range(10240, 10495 + 1),
- "Supplemental Arrows-B": range(10496, 10623 + 1),
- "Miscellaneous Mathematical Symbols-B": range(10624, 10751 + 1),
- "Supplemental Mathematical Operators": range(10752, 11007 + 1),
- "Miscellaneous Symbols and Arrows": range(11008, 11263 + 1),
- "Glagolitic": range(11264, 11359 + 1),
- "Latin Extended-C": range(11360, 11391 + 1),
- "Coptic": range(11392, 11519 + 1),
- "Georgian Supplement": range(11520, 11567 + 1),
- "Tifinagh": range(11568, 11647 + 1),
- "Ethiopic Extended": range(11648, 11743 + 1),
- "Cyrillic Extended-A": range(11744, 11775 + 1),
- "Supplemental Punctuation": range(11776, 11903 + 1),
- "CJK Radicals Supplement": range(11904, 12031 + 1),
- "Kangxi Radicals": range(12032, 12255 + 1),
- "Ideographic Description Characters": range(12272, 12287 + 1),
- "CJK Symbols and Punctuation": range(12288, 12351 + 1),
- "Hiragana": range(12352, 12447 + 1),
- "Katakana": range(12448, 12543 + 1),
- "Bopomofo": range(12544, 12591 + 1),
- "Hangul Compatibility Jamo": range(12592, 12687 + 1),
- "Kanbun": range(12688, 12703 + 1),
- "Bopomofo Extended": range(12704, 12735 + 1),
- "CJK Strokes": range(12736, 12783 + 1),
- "Katakana Phonetic Extensions": range(12784, 12799 + 1),
- "Enclosed CJK Letters and Months": range(12800, 13055 + 1),
- "CJK Compatibility": range(13056, 13311 + 1),
- "CJK Unified Ideographs Extension A": range(13312, 19903 + 1),
- "Yijing Hexagram Symbols": range(19904, 19967 + 1),
- "CJK Unified Ideographs": range(19968, 40959 + 1),
- "Yi Syllables": range(40960, 42127 + 1),
- "Yi Radicals": range(42128, 42191 + 1),
- "Lisu": range(42192, 42239 + 1),
- "Vai": range(42240, 42559 + 1),
- "Cyrillic Extended-B": range(42560, 42655 + 1),
- "Bamum": range(42656, 42751 + 1),
- "Modifier Tone Letters": range(42752, 42783 + 1),
- "Latin Extended-D": range(42784, 43007 + 1),
- "Syloti Nagri": range(43008, 43055 + 1),
- "Common Indic Number Forms": range(43056, 43071 + 1),
- "Phags-pa": range(43072, 43135 + 1),
- "Saurashtra": range(43136, 43231 + 1),
- "Devanagari Extended": range(43232, 43263 + 1),
- "Kayah Li": range(43264, 43311 + 1),
- "Rejang": range(43312, 43359 + 1),
- "Hangul Jamo Extended-A": range(43360, 43391 + 1),
- "Javanese": range(43392, 43487 + 1),
- "Myanmar Extended-B": range(43488, 43519 + 1),
- "Cham": range(43520, 43615 + 1),
- "Myanmar Extended-A": range(43616, 43647 + 1),
- "Tai Viet": range(43648, 43743 + 1),
- "Meetei Mayek Extensions": range(43744, 43775 + 1),
- "Ethiopic Extended-A": range(43776, 43823 + 1),
- "Latin Extended-E": range(43824, 43887 + 1),
- "Cherokee Supplement": range(43888, 43967 + 1),
- "Meetei Mayek": range(43968, 44031 + 1),
- "Hangul Syllables": range(44032, 55215 + 1),
- "Hangul Jamo Extended-B": range(55216, 55295 + 1),
- "High Surrogates": range(55296, 56191 + 1),
- "High Private Use Surrogates": range(56192, 56319 + 1),
- "Low Surrogates": range(56320, 57343 + 1),
- "Private Use Area": range(57344, 63743 + 1),
- "CJK Compatibility Ideographs": range(63744, 64255 + 1),
- "Alphabetic Presentation Forms": range(64256, 64335 + 1),
- "Arabic Presentation Forms-A": range(64336, 65023 + 1),
- "Variation Selectors": range(65024, 65039 + 1),
- "Vertical Forms": range(65040, 65055 + 1),
- "Combining Half Marks": range(65056, 65071 + 1),
- "CJK Compatibility Forms": range(65072, 65103 + 1),
- "Small Form Variants": range(65104, 65135 + 1),
- "Arabic Presentation Forms-B": range(65136, 65279 + 1),
- "Halfwidth and Fullwidth Forms": range(65280, 65519 + 1),
- "Specials": range(65520, 65535 + 1),
- "Linear B Syllabary": range(65536, 65663 + 1),
- "Linear B Ideograms": range(65664, 65791 + 1),
- "Aegean Numbers": range(65792, 65855 + 1),
- "Ancient Greek Numbers": range(65856, 65935 + 1),
- "Ancient Symbols": range(65936, 65999 + 1),
- "Phaistos Disc": range(66000, 66047 + 1),
- "Lycian": range(66176, 66207 + 1),
- "Carian": range(66208, 66271 + 1),
- "Coptic Epact Numbers": range(66272, 66303 + 1),
- "Old Italic": range(66304, 66351 + 1),
- "Gothic": range(66352, 66383 + 1),
- "Old Permic": range(66384, 66431 + 1),
- "Ugaritic": range(66432, 66463 + 1),
- "Old Persian": range(66464, 66527 + 1),
- "Deseret": range(66560, 66639 + 1),
- "Shavian": range(66640, 66687 + 1),
- "Osmanya": range(66688, 66735 + 1),
- "Osage": range(66736, 66815 + 1),
- "Elbasan": range(66816, 66863 + 1),
- "Caucasian Albanian": range(66864, 66927 + 1),
- "Linear A": range(67072, 67455 + 1),
- "Cypriot Syllabary": range(67584, 67647 + 1),
- "Imperial Aramaic": range(67648, 67679 + 1),
- "Palmyrene": range(67680, 67711 + 1),
- "Nabataean": range(67712, 67759 + 1),
- "Hatran": range(67808, 67839 + 1),
- "Phoenician": range(67840, 67871 + 1),
- "Lydian": range(67872, 67903 + 1),
- "Meroitic Hieroglyphs": range(67968, 67999 + 1),
- "Meroitic Cursive": range(68000, 68095 + 1),
- "Kharoshthi": range(68096, 68191 + 1),
- "Old South Arabian": range(68192, 68223 + 1),
- "Old North Arabian": range(68224, 68255 + 1),
- "Manichaean": range(68288, 68351 + 1),
- "Avestan": range(68352, 68415 + 1),
- "Inscriptional Parthian": range(68416, 68447 + 1),
- "Inscriptional Pahlavi": range(68448, 68479 + 1),
- "Psalter Pahlavi": range(68480, 68527 + 1),
- "Old Turkic": range(68608, 68687 + 1),
- "Old Hungarian": range(68736, 68863 + 1),
- "Rumi Numeral Symbols": range(69216, 69247 + 1),
- "Brahmi": range(69632, 69759 + 1),
- "Kaithi": range(69760, 69839 + 1),
- "Sora Sompeng": range(69840, 69887 + 1),
- "Chakma": range(69888, 69967 + 1),
- "Mahajani": range(69968, 70015 + 1),
- "Sharada": range(70016, 70111 + 1),
- "Sinhala Archaic Numbers": range(70112, 70143 + 1),
- "Khojki": range(70144, 70223 + 1),
- "Multani": range(70272, 70319 + 1),
- "Khudawadi": range(70320, 70399 + 1),
- "Grantha": range(70400, 70527 + 1),
- "Newa": range(70656, 70783 + 1),
- "Tirhuta": range(70784, 70879 + 1),
- "Siddham": range(71040, 71167 + 1),
- "Modi": range(71168, 71263 + 1),
- "Mongolian Supplement": range(71264, 71295 + 1),
- "Takri": range(71296, 71375 + 1),
- "Ahom": range(71424, 71487 + 1),
- "Warang Citi": range(71840, 71935 + 1),
- "Zanabazar Square": range(72192, 72271 + 1),
- "Soyombo": range(72272, 72367 + 1),
- "Pau Cin Hau": range(72384, 72447 + 1),
- "Bhaiksuki": range(72704, 72815 + 1),
- "Marchen": range(72816, 72895 + 1),
- "Masaram Gondi": range(72960, 73055 + 1),
- "Cuneiform": range(73728, 74751 + 1),
- "Cuneiform Numbers and Punctuation": range(74752, 74879 + 1),
- "Early Dynastic Cuneiform": range(74880, 75087 + 1),
- "Egyptian Hieroglyphs": range(77824, 78895 + 1),
- "Anatolian Hieroglyphs": range(82944, 83583 + 1),
- "Bamum Supplement": range(92160, 92735 + 1),
- "Mro": range(92736, 92783 + 1),
- "Bassa Vah": range(92880, 92927 + 1),
- "Pahawh Hmong": range(92928, 93071 + 1),
- "Miao": range(93952, 94111 + 1),
- "Ideographic Symbols and Punctuation": range(94176, 94207 + 1),
- "Tangut": range(94208, 100351 + 1),
- "Tangut Components": range(100352, 101119 + 1),
- "Kana Supplement": range(110592, 110847 + 1),
- "Kana Extended-A": range(110848, 110895 + 1),
- "Nushu": range(110960, 111359 + 1),
- "Duployan": range(113664, 113823 + 1),
- "Shorthand Format Controls": range(113824, 113839 + 1),
- "Byzantine Musical Symbols": range(118784, 119039 + 1),
- "Musical Symbols": range(119040, 119295 + 1),
- "Ancient Greek Musical Notation": range(119296, 119375 + 1),
- "Tai Xuan Jing Symbols": range(119552, 119647 + 1),
- "Counting Rod Numerals": range(119648, 119679 + 1),
- "Mathematical Alphanumeric Symbols": range(119808, 120831 + 1),
- "Sutton SignWriting": range(120832, 121519 + 1),
- "Glagolitic Supplement": range(122880, 122927 + 1),
- "Mende Kikakui": range(124928, 125151 + 1),
- "Adlam": range(125184, 125279 + 1),
- "Arabic Mathematical Alphabetic Symbols": range(126464, 126719 + 1),
- "Mahjong Tiles": range(126976, 127023 + 1),
- "Domino Tiles": range(127024, 127135 + 1),
- "Playing Cards": range(127136, 127231 + 1),
- "Enclosed Alphanumeric Supplement": range(127232, 127487 + 1),
- "Enclosed Ideographic Supplement": range(127488, 127743 + 1),
- "Miscellaneous Symbols and Pictographs": range(127744, 128511 + 1),
- "Emoticons range(Emoji)": range(128512, 128591 + 1),
- "Ornamental Dingbats": range(128592, 128639 + 1),
- "Transport and Map Symbols": range(128640, 128767 + 1),
- "Alchemical Symbols": range(128768, 128895 + 1),
- "Geometric Shapes Extended": range(128896, 129023 + 1),
- "Supplemental Arrows-C": range(129024, 129279 + 1),
- "Supplemental Symbols and Pictographs": range(129280, 129535 + 1),
- "CJK Unified Ideographs Extension B": range(131072, 173791 + 1),
- "CJK Unified Ideographs Extension C": range(173824, 177983 + 1),
- "CJK Unified Ideographs Extension D": range(177984, 178207 + 1),
- "CJK Unified Ideographs Extension E": range(178208, 183983 + 1),
- "CJK Unified Ideographs Extension F": range(183984, 191471 + 1),
- "CJK Compatibility Ideographs Supplement": range(194560, 195103 + 1),
- "Tags": range(917504, 917631 + 1),
- "Variation Selectors Supplement": range(917760, 917999 + 1),
+ "Control character": range(32),
+ "Basic Latin": range(32, 128),
+ "Latin-1 Supplement": range(128, 256),
+ "Latin Extended-A": range(256, 384),
+ "Latin Extended-B": range(384, 592),
+ "IPA Extensions": range(592, 688),
+ "Spacing Modifier Letters": range(688, 768),
+ "Combining Diacritical Marks": range(768, 880),
+ "Greek and Coptic": range(880, 1024),
+ "Cyrillic": range(1024, 1280),
+ "Cyrillic Supplement": range(1280, 1328),
+ "Armenian": range(1328, 1424),
+ "Hebrew": range(1424, 1536),
+ "Arabic": range(1536, 1792),
+ "Syriac": range(1792, 1872),
+ "Arabic Supplement": range(1872, 1920),
+ "Thaana": range(1920, 1984),
+ "NKo": range(1984, 2048),
+ "Samaritan": range(2048, 2112),
+ "Mandaic": range(2112, 2144),
+ "Syriac Supplement": range(2144, 2160),
+ "Arabic Extended-B": range(2160, 2208),
+ "Arabic Extended-A": range(2208, 2304),
+ "Devanagari": range(2304, 2432),
+ "Bengali": range(2432, 2560),
+ "Gurmukhi": range(2560, 2688),
+ "Gujarati": range(2688, 2816),
+ "Oriya": range(2816, 2944),
+ "Tamil": range(2944, 3072),
+ "Telugu": range(3072, 3200),
+ "Kannada": range(3200, 3328),
+ "Malayalam": range(3328, 3456),
+ "Sinhala": range(3456, 3584),
+ "Thai": range(3584, 3712),
+ "Lao": range(3712, 3840),
+ "Tibetan": range(3840, 4096),
+ "Myanmar": range(4096, 4256),
+ "Georgian": range(4256, 4352),
+ "Hangul Jamo": range(4352, 4608),
+ "Ethiopic": range(4608, 4992),
+ "Ethiopic Supplement": range(4992, 5024),
+ "Cherokee": range(5024, 5120),
+ "Unified Canadian Aboriginal Syllabics": range(5120, 5760),
+ "Ogham": range(5760, 5792),
+ "Runic": range(5792, 5888),
+ "Tagalog": range(5888, 5920),
+ "Hanunoo": range(5920, 5952),
+ "Buhid": range(5952, 5984),
+ "Tagbanwa": range(5984, 6016),
+ "Khmer": range(6016, 6144),
+ "Mongolian": range(6144, 6320),
+ "Unified Canadian Aboriginal Syllabics Extended": range(6320, 6400),
+ "Limbu": range(6400, 6480),
+ "Tai Le": range(6480, 6528),
+ "New Tai Lue": range(6528, 6624),
+ "Khmer Symbols": range(6624, 6656),
+ "Buginese": range(6656, 6688),
+ "Tai Tham": range(6688, 6832),
+ "Combining Diacritical Marks Extended": range(6832, 6912),
+ "Balinese": range(6912, 7040),
+ "Sundanese": range(7040, 7104),
+ "Batak": range(7104, 7168),
+ "Lepcha": range(7168, 7248),
+ "Ol Chiki": range(7248, 7296),
+ "Cyrillic Extended-C": range(7296, 7312),
+ "Georgian Extended": range(7312, 7360),
+ "Sundanese Supplement": range(7360, 7376),
+ "Vedic Extensions": range(7376, 7424),
+ "Phonetic Extensions": range(7424, 7552),
+ "Phonetic Extensions Supplement": range(7552, 7616),
+ "Combining Diacritical Marks Supplement": range(7616, 7680),
+ "Latin Extended Additional": range(7680, 7936),
+ "Greek Extended": range(7936, 8192),
+ "General Punctuation": range(8192, 8304),
+ "Superscripts and Subscripts": range(8304, 8352),
+ "Currency Symbols": range(8352, 8400),
+ "Combining Diacritical Marks for Symbols": range(8400, 8448),
+ "Letterlike Symbols": range(8448, 8528),
+ "Number Forms": range(8528, 8592),
+ "Arrows": range(8592, 8704),
+ "Mathematical Operators": range(8704, 8960),
+ "Miscellaneous Technical": range(8960, 9216),
+ "Control Pictures": range(9216, 9280),
+ "Optical Character Recognition": range(9280, 9312),
+ "Enclosed Alphanumerics": range(9312, 9472),
+ "Box Drawing": range(9472, 9600),
+ "Block Elements": range(9600, 9632),
+ "Geometric Shapes": range(9632, 9728),
+ "Miscellaneous Symbols": range(9728, 9984),
+ "Dingbats": range(9984, 10176),
+ "Miscellaneous Mathematical Symbols-A": range(10176, 10224),
+ "Supplemental Arrows-A": range(10224, 10240),
+ "Braille Patterns": range(10240, 10496),
+ "Supplemental Arrows-B": range(10496, 10624),
+ "Miscellaneous Mathematical Symbols-B": range(10624, 10752),
+ "Supplemental Mathematical Operators": range(10752, 11008),
+ "Miscellaneous Symbols and Arrows": range(11008, 11264),
+ "Glagolitic": range(11264, 11360),
+ "Latin Extended-C": range(11360, 11392),
+ "Coptic": range(11392, 11520),
+ "Georgian Supplement": range(11520, 11568),
+ "Tifinagh": range(11568, 11648),
+ "Ethiopic Extended": range(11648, 11744),
+ "Cyrillic Extended-A": range(11744, 11776),
+ "Supplemental Punctuation": range(11776, 11904),
+ "CJK Radicals Supplement": range(11904, 12032),
+ "Kangxi Radicals": range(12032, 12256),
+ "Ideographic Description Characters": range(12272, 12288),
+ "CJK Symbols and Punctuation": range(12288, 12352),
+ "Hiragana": range(12352, 12448),
+ "Katakana": range(12448, 12544),
+ "Bopomofo": range(12544, 12592),
+ "Hangul Compatibility Jamo": range(12592, 12688),
+ "Kanbun": range(12688, 12704),
+ "Bopomofo Extended": range(12704, 12736),
+ "CJK Strokes": range(12736, 12784),
+ "Katakana Phonetic Extensions": range(12784, 12800),
+ "Enclosed CJK Letters and Months": range(12800, 13056),
+ "CJK Compatibility": range(13056, 13312),
+ "CJK Unified Ideographs Extension A": range(13312, 19904),
+ "Yijing Hexagram Symbols": range(19904, 19968),
+ "CJK Unified Ideographs": range(19968, 40960),
+ "Yi Syllables": range(40960, 42128),
+ "Yi Radicals": range(42128, 42192),
+ "Lisu": range(42192, 42240),
+ "Vai": range(42240, 42560),
+ "Cyrillic Extended-B": range(42560, 42656),
+ "Bamum": range(42656, 42752),
+ "Modifier Tone Letters": range(42752, 42784),
+ "Latin Extended-D": range(42784, 43008),
+ "Syloti Nagri": range(43008, 43056),
+ "Common Indic Number Forms": range(43056, 43072),
+ "Phags-pa": range(43072, 43136),
+ "Saurashtra": range(43136, 43232),
+ "Devanagari Extended": range(43232, 43264),
+ "Kayah Li": range(43264, 43312),
+ "Rejang": range(43312, 43360),
+ "Hangul Jamo Extended-A": range(43360, 43392),
+ "Javanese": range(43392, 43488),
+ "Myanmar Extended-B": range(43488, 43520),
+ "Cham": range(43520, 43616),
+ "Myanmar Extended-A": range(43616, 43648),
+ "Tai Viet": range(43648, 43744),
+ "Meetei Mayek Extensions": range(43744, 43776),
+ "Ethiopic Extended-A": range(43776, 43824),
+ "Latin Extended-E": range(43824, 43888),
+ "Cherokee Supplement": range(43888, 43968),
+ "Meetei Mayek": range(43968, 44032),
+ "Hangul Syllables": range(44032, 55216),
+ "Hangul Jamo Extended-B": range(55216, 55296),
+ "High Surrogates": range(55296, 56192),
+ "High Private Use Surrogates": range(56192, 56320),
+ "Low Surrogates": range(56320, 57344),
+ "Private Use Area": range(57344, 63744),
+ "CJK Compatibility Ideographs": range(63744, 64256),
+ "Alphabetic Presentation Forms": range(64256, 64336),
+ "Arabic Presentation Forms-A": range(64336, 65024),
+ "Variation Selectors": range(65024, 65040),
+ "Vertical Forms": range(65040, 65056),
+ "Combining Half Marks": range(65056, 65072),
+ "CJK Compatibility Forms": range(65072, 65104),
+ "Small Form Variants": range(65104, 65136),
+ "Arabic Presentation Forms-B": range(65136, 65280),
+ "Halfwidth and Fullwidth Forms": range(65280, 65520),
+ "Specials": range(65520, 65536),
+ "Linear B Syllabary": range(65536, 65664),
+ "Linear B Ideograms": range(65664, 65792),
+ "Aegean Numbers": range(65792, 65856),
+ "Ancient Greek Numbers": range(65856, 65936),
+ "Ancient Symbols": range(65936, 66000),
+ "Phaistos Disc": range(66000, 66048),
+ "Lycian": range(66176, 66208),
+ "Carian": range(66208, 66272),
+ "Coptic Epact Numbers": range(66272, 66304),
+ "Old Italic": range(66304, 66352),
+ "Gothic": range(66352, 66384),
+ "Old Permic": range(66384, 66432),
+ "Ugaritic": range(66432, 66464),
+ "Old Persian": range(66464, 66528),
+ "Deseret": range(66560, 66640),
+ "Shavian": range(66640, 66688),
+ "Osmanya": range(66688, 66736),
+ "Osage": range(66736, 66816),
+ "Elbasan": range(66816, 66864),
+ "Caucasian Albanian": range(66864, 66928),
+ "Vithkuqi": range(66928, 67008),
+ "Linear A": range(67072, 67456),
+ "Latin Extended-F": range(67456, 67520),
+ "Cypriot Syllabary": range(67584, 67648),
+ "Imperial Aramaic": range(67648, 67680),
+ "Palmyrene": range(67680, 67712),
+ "Nabataean": range(67712, 67760),
+ "Hatran": range(67808, 67840),
+ "Phoenician": range(67840, 67872),
+ "Lydian": range(67872, 67904),
+ "Meroitic Hieroglyphs": range(67968, 68000),
+ "Meroitic Cursive": range(68000, 68096),
+ "Kharoshthi": range(68096, 68192),
+ "Old South Arabian": range(68192, 68224),
+ "Old North Arabian": range(68224, 68256),
+ "Manichaean": range(68288, 68352),
+ "Avestan": range(68352, 68416),
+ "Inscriptional Parthian": range(68416, 68448),
+ "Inscriptional Pahlavi": range(68448, 68480),
+ "Psalter Pahlavi": range(68480, 68528),
+ "Old Turkic": range(68608, 68688),
+ "Old Hungarian": range(68736, 68864),
+ "Hanifi Rohingya": range(68864, 68928),
+ "Rumi Numeral Symbols": range(69216, 69248),
+ "Yezidi": range(69248, 69312),
+ "Arabic Extended-C": range(69312, 69376),
+ "Old Sogdian": range(69376, 69424),
+ "Sogdian": range(69424, 69488),
+ "Old Uyghur": range(69488, 69552),
+ "Chorasmian": range(69552, 69600),
+ "Elymaic": range(69600, 69632),
+ "Brahmi": range(69632, 69760),
+ "Kaithi": range(69760, 69840),
+ "Sora Sompeng": range(69840, 69888),
+ "Chakma": range(69888, 69968),
+ "Mahajani": range(69968, 70016),
+ "Sharada": range(70016, 70112),
+ "Sinhala Archaic Numbers": range(70112, 70144),
+ "Khojki": range(70144, 70224),
+ "Multani": range(70272, 70320),
+ "Khudawadi": range(70320, 70400),
+ "Grantha": range(70400, 70528),
+ "Newa": range(70656, 70784),
+ "Tirhuta": range(70784, 70880),
+ "Siddham": range(71040, 71168),
+ "Modi": range(71168, 71264),
+ "Mongolian Supplement": range(71264, 71296),
+ "Takri": range(71296, 71376),
+ "Ahom": range(71424, 71504),
+ "Dogra": range(71680, 71760),
+ "Warang Citi": range(71840, 71936),
+ "Dives Akuru": range(71936, 72032),
+ "Nandinagari": range(72096, 72192),
+ "Zanabazar Square": range(72192, 72272),
+ "Soyombo": range(72272, 72368),
+ "Unified Canadian Aboriginal Syllabics Extended-A": range(72368, 72384),
+ "Pau Cin Hau": range(72384, 72448),
+ "Devanagari Extended-A": range(72448, 72544),
+ "Bhaiksuki": range(72704, 72816),
+ "Marchen": range(72816, 72896),
+ "Masaram Gondi": range(72960, 73056),
+ "Gunjala Gondi": range(73056, 73136),
+ "Makasar": range(73440, 73472),
+ "Kawi": range(73472, 73568),
+ "Lisu Supplement": range(73648, 73664),
+ "Tamil Supplement": range(73664, 73728),
+ "Cuneiform": range(73728, 74752),
+ "Cuneiform Numbers and Punctuation": range(74752, 74880),
+ "Early Dynastic Cuneiform": range(74880, 75088),
+ "Cypro-Minoan": range(77712, 77824),
+ "Egyptian Hieroglyphs": range(77824, 78896),
+ "Egyptian Hieroglyph Format Controls": range(78896, 78944),
+ "Anatolian Hieroglyphs": range(82944, 83584),
+ "Bamum Supplement": range(92160, 92736),
+ "Mro": range(92736, 92784),
+ "Tangsa": range(92784, 92880),
+ "Bassa Vah": range(92880, 92928),
+ "Pahawh Hmong": range(92928, 93072),
+ "Medefaidrin": range(93760, 93856),
+ "Miao": range(93952, 94112),
+ "Ideographic Symbols and Punctuation": range(94176, 94208),
+ "Tangut": range(94208, 100352),
+ "Tangut Components": range(100352, 101120),
+ "Khitan Small Script": range(101120, 101632),
+ "Tangut Supplement": range(101632, 101760),
+ "Kana Extended-B": range(110576, 110592),
+ "Kana Supplement": range(110592, 110848),
+ "Kana Extended-A": range(110848, 110896),
+ "Small Kana Extension": range(110896, 110960),
+ "Nushu": range(110960, 111360),
+ "Duployan": range(113664, 113824),
+ "Shorthand Format Controls": range(113824, 113840),
+ "Znamenny Musical Notation": range(118528, 118736),
+ "Byzantine Musical Symbols": range(118784, 119040),
+ "Musical Symbols": range(119040, 119296),
+ "Ancient Greek Musical Notation": range(119296, 119376),
+ "Kaktovik Numerals": range(119488, 119520),
+ "Mayan Numerals": range(119520, 119552),
+ "Tai Xuan Jing Symbols": range(119552, 119648),
+ "Counting Rod Numerals": range(119648, 119680),
+ "Mathematical Alphanumeric Symbols": range(119808, 120832),
+ "Sutton SignWriting": range(120832, 121520),
+ "Latin Extended-G": range(122624, 122880),
+ "Glagolitic Supplement": range(122880, 122928),
+ "Cyrillic Extended-D": range(122928, 123024),
+ "Nyiakeng Puachue Hmong": range(123136, 123216),
+ "Toto": range(123536, 123584),
+ "Wancho": range(123584, 123648),
+ "Nag Mundari": range(124112, 124160),
+ "Ethiopic Extended-B": range(124896, 124928),
+ "Mende Kikakui": range(124928, 125152),
+ "Adlam": range(125184, 125280),
+ "Indic Siyaq Numbers": range(126064, 126144),
+ "Ottoman Siyaq Numbers": range(126208, 126288),
+ "Arabic Mathematical Alphabetic Symbols": range(126464, 126720),
+ "Mahjong Tiles": range(126976, 127024),
+ "Domino Tiles": range(127024, 127136),
+ "Playing Cards": range(127136, 127232),
+ "Enclosed Alphanumeric Supplement": range(127232, 127488),
+ "Enclosed Ideographic Supplement": range(127488, 127744),
+ "Miscellaneous Symbols and Pictographs": range(127744, 128512),
+ "Emoticons range(Emoji)": range(128512, 128592),
+ "Ornamental Dingbats": range(128592, 128640),
+ "Transport and Map Symbols": range(128640, 128768),
+ "Alchemical Symbols": range(128768, 128896),
+ "Geometric Shapes Extended": range(128896, 129024),
+ "Supplemental Arrows-C": range(129024, 129280),
+ "Supplemental Symbols and Pictographs": range(129280, 129536),
+ "Chess Symbols": range(129536, 129648),
+ "Symbols and Pictographs Extended-A": range(129648, 129792),
+ "Symbols for Legacy Computing": range(129792, 130048),
+ "CJK Unified Ideographs Extension B": range(131072, 173792),
+ "CJK Unified Ideographs Extension C": range(173824, 177984),
+ "CJK Unified Ideographs Extension D": range(177984, 178208),
+ "CJK Unified Ideographs Extension E": range(178208, 183984),
+ "CJK Unified Ideographs Extension F": range(183984, 191472),
+ "CJK Compatibility Ideographs Supplement": range(194560, 195104),
+ "CJK Unified Ideographs Extension G": range(196608, 201552),
+ "CJK Unified Ideographs Extension H": range(201552, 205744),
+ "Tags": range(917504, 917632),
+ "Variation Selectors Supplement": range(917760, 918000),
+ "Supplementary Private Use Area-A": range(983040, 1048576),
+ "Supplementary Private Use Area-B": range(1048576, 1114112),
}
@@ -331,11 +380,23 @@ RE_POSSIBLE_ENCODING_INDICATION = re_compile(
IGNORECASE,
)
+IANA_NO_ALIASES = [
+ "cp720",
+ "cp737",
+ "cp856",
+ "cp874",
+ "cp875",
+ "cp1006",
+ "koi8_r",
+ "koi8_t",
+ "koi8_u",
+]
+
IANA_SUPPORTED: List[str] = sorted(
filter(
lambda x: x.endswith("_codec") is False
and x not in {"rot_13", "tactis", "mbcs"},
- list(set(aliases.values())),
+ list(set(aliases.values())) + IANA_NO_ALIASES,
)
)
@@ -489,7 +550,1446 @@ COMMON_SAFE_ASCII_CHARACTERS: Set[str] = {
KO_NAMES: Set[str] = {"johab", "cp949", "euc_kr"}
ZH_NAMES: Set[str] = {"big5", "cp950", "big5hkscs", "hz"}
-LANGUAGE_SUPPORTED_COUNT: int = len(FREQUENCIES)
-
# Logging LEVEL below DEBUG
TRACE: int = 5
+
+
+# Language label that contain the em dash "—"
+# character are to be considered alternative seq to origin
+FREQUENCIES: Dict[str, List[str]] = {
+ "English": [
+ "e",
+ "a",
+ "t",
+ "i",
+ "o",
+ "n",
+ "s",
+ "r",
+ "h",
+ "l",
+ "d",
+ "c",
+ "u",
+ "m",
+ "f",
+ "p",
+ "g",
+ "w",
+ "y",
+ "b",
+ "v",
+ "k",
+ "x",
+ "j",
+ "z",
+ "q",
+ ],
+ "English—": [
+ "e",
+ "a",
+ "t",
+ "i",
+ "o",
+ "n",
+ "s",
+ "r",
+ "h",
+ "l",
+ "d",
+ "c",
+ "m",
+ "u",
+ "f",
+ "p",
+ "g",
+ "w",
+ "b",
+ "y",
+ "v",
+ "k",
+ "j",
+ "x",
+ "z",
+ "q",
+ ],
+ "German": [
+ "e",
+ "n",
+ "i",
+ "r",
+ "s",
+ "t",
+ "a",
+ "d",
+ "h",
+ "u",
+ "l",
+ "g",
+ "o",
+ "c",
+ "m",
+ "b",
+ "f",
+ "k",
+ "w",
+ "z",
+ "p",
+ "v",
+ "ü",
+ "ä",
+ "ö",
+ "j",
+ ],
+ "French": [
+ "e",
+ "a",
+ "s",
+ "n",
+ "i",
+ "t",
+ "r",
+ "l",
+ "u",
+ "o",
+ "d",
+ "c",
+ "p",
+ "m",
+ "é",
+ "v",
+ "g",
+ "f",
+ "b",
+ "h",
+ "q",
+ "à",
+ "x",
+ "è",
+ "y",
+ "j",
+ ],
+ "Dutch": [
+ "e",
+ "n",
+ "a",
+ "i",
+ "r",
+ "t",
+ "o",
+ "d",
+ "s",
+ "l",
+ "g",
+ "h",
+ "v",
+ "m",
+ "u",
+ "k",
+ "c",
+ "p",
+ "b",
+ "w",
+ "j",
+ "z",
+ "f",
+ "y",
+ "x",
+ "ë",
+ ],
+ "Italian": [
+ "e",
+ "i",
+ "a",
+ "o",
+ "n",
+ "l",
+ "t",
+ "r",
+ "s",
+ "c",
+ "d",
+ "u",
+ "p",
+ "m",
+ "g",
+ "v",
+ "f",
+ "b",
+ "z",
+ "h",
+ "q",
+ "è",
+ "à",
+ "k",
+ "y",
+ "ò",
+ ],
+ "Polish": [
+ "a",
+ "i",
+ "o",
+ "e",
+ "n",
+ "r",
+ "z",
+ "w",
+ "s",
+ "c",
+ "t",
+ "k",
+ "y",
+ "d",
+ "p",
+ "m",
+ "u",
+ "l",
+ "j",
+ "ł",
+ "g",
+ "b",
+ "h",
+ "ą",
+ "ę",
+ "ó",
+ ],
+ "Spanish": [
+ "e",
+ "a",
+ "o",
+ "n",
+ "s",
+ "r",
+ "i",
+ "l",
+ "d",
+ "t",
+ "c",
+ "u",
+ "m",
+ "p",
+ "b",
+ "g",
+ "v",
+ "f",
+ "y",
+ "ó",
+ "h",
+ "q",
+ "í",
+ "j",
+ "z",
+ "á",
+ ],
+ "Russian": [
+ "о",
+ "а",
+ "е",
+ "и",
+ "н",
+ "с",
+ "т",
+ "р",
+ "в",
+ "л",
+ "к",
+ "м",
+ "д",
+ "п",
+ "у",
+ "г",
+ "я",
+ "ы",
+ "з",
+ "б",
+ "й",
+ "ь",
+ "ч",
+ "х",
+ "ж",
+ "ц",
+ ],
+ # Jap-Kanji
+ "Japanese": [
+ "人",
+ "一",
+ "大",
+ "亅",
+ "丁",
+ "丨",
+ "竹",
+ "笑",
+ "口",
+ "日",
+ "今",
+ "二",
+ "彳",
+ "行",
+ "十",
+ "土",
+ "丶",
+ "寸",
+ "寺",
+ "時",
+ "乙",
+ "丿",
+ "乂",
+ "气",
+ "気",
+ "冂",
+ "巾",
+ "亠",
+ "市",
+ "目",
+ "儿",
+ "見",
+ "八",
+ "小",
+ "凵",
+ "県",
+ "月",
+ "彐",
+ "門",
+ "間",
+ "木",
+ "東",
+ "山",
+ "出",
+ "本",
+ "中",
+ "刀",
+ "分",
+ "耳",
+ "又",
+ "取",
+ "最",
+ "言",
+ "田",
+ "心",
+ "思",
+ "刂",
+ "前",
+ "京",
+ "尹",
+ "事",
+ "生",
+ "厶",
+ "云",
+ "会",
+ "未",
+ "来",
+ "白",
+ "冫",
+ "楽",
+ "灬",
+ "馬",
+ "尸",
+ "尺",
+ "駅",
+ "明",
+ "耂",
+ "者",
+ "了",
+ "阝",
+ "都",
+ "高",
+ "卜",
+ "占",
+ "厂",
+ "广",
+ "店",
+ "子",
+ "申",
+ "奄",
+ "亻",
+ "俺",
+ "上",
+ "方",
+ "冖",
+ "学",
+ "衣",
+ "艮",
+ "食",
+ "自",
+ ],
+ # Jap-Katakana
+ "Japanese—": [
+ "ー",
+ "ン",
+ "ス",
+ "・",
+ "ル",
+ "ト",
+ "リ",
+ "イ",
+ "ア",
+ "ラ",
+ "ッ",
+ "ク",
+ "ド",
+ "シ",
+ "レ",
+ "ジ",
+ "タ",
+ "フ",
+ "ロ",
+ "カ",
+ "テ",
+ "マ",
+ "ィ",
+ "グ",
+ "バ",
+ "ム",
+ "プ",
+ "オ",
+ "コ",
+ "デ",
+ "ニ",
+ "ウ",
+ "メ",
+ "サ",
+ "ビ",
+ "ナ",
+ "ブ",
+ "ャ",
+ "エ",
+ "ュ",
+ "チ",
+ "キ",
+ "ズ",
+ "ダ",
+ "パ",
+ "ミ",
+ "ェ",
+ "ョ",
+ "ハ",
+ "セ",
+ "ベ",
+ "ガ",
+ "モ",
+ "ツ",
+ "ネ",
+ "ボ",
+ "ソ",
+ "ノ",
+ "ァ",
+ "ヴ",
+ "ワ",
+ "ポ",
+ "ペ",
+ "ピ",
+ "ケ",
+ "ゴ",
+ "ギ",
+ "ザ",
+ "ホ",
+ "ゲ",
+ "ォ",
+ "ヤ",
+ "ヒ",
+ "ユ",
+ "ヨ",
+ "ヘ",
+ "ゼ",
+ "ヌ",
+ "ゥ",
+ "ゾ",
+ "ヶ",
+ "ヂ",
+ "ヲ",
+ "ヅ",
+ "ヵ",
+ "ヱ",
+ "ヰ",
+ "ヮ",
+ "ヽ",
+ "゠",
+ "ヾ",
+ "ヷ",
+ "ヿ",
+ "ヸ",
+ "ヹ",
+ "ヺ",
+ ],
+ # Jap-Hiragana
+ "Japanese——": [
+ "の",
+ "に",
+ "る",
+ "た",
+ "と",
+ "は",
+ "し",
+ "い",
+ "を",
+ "で",
+ "て",
+ "が",
+ "な",
+ "れ",
+ "か",
+ "ら",
+ "さ",
+ "っ",
+ "り",
+ "す",
+ "あ",
+ "も",
+ "こ",
+ "ま",
+ "う",
+ "く",
+ "よ",
+ "き",
+ "ん",
+ "め",
+ "お",
+ "け",
+ "そ",
+ "つ",
+ "だ",
+ "や",
+ "え",
+ "ど",
+ "わ",
+ "ち",
+ "み",
+ "せ",
+ "じ",
+ "ば",
+ "へ",
+ "び",
+ "ず",
+ "ろ",
+ "ほ",
+ "げ",
+ "む",
+ "べ",
+ "ひ",
+ "ょ",
+ "ゆ",
+ "ぶ",
+ "ご",
+ "ゃ",
+ "ね",
+ "ふ",
+ "ぐ",
+ "ぎ",
+ "ぼ",
+ "ゅ",
+ "づ",
+ "ざ",
+ "ぞ",
+ "ぬ",
+ "ぜ",
+ "ぱ",
+ "ぽ",
+ "ぷ",
+ "ぴ",
+ "ぃ",
+ "ぁ",
+ "ぇ",
+ "ぺ",
+ "ゞ",
+ "ぢ",
+ "ぉ",
+ "ぅ",
+ "ゐ",
+ "ゝ",
+ "ゑ",
+ "゛",
+ "゜",
+ "ゎ",
+ "ゔ",
+ "゚",
+ "ゟ",
+ "゙",
+ "ゕ",
+ "ゖ",
+ ],
+ "Portuguese": [
+ "a",
+ "e",
+ "o",
+ "s",
+ "i",
+ "r",
+ "d",
+ "n",
+ "t",
+ "m",
+ "u",
+ "c",
+ "l",
+ "p",
+ "g",
+ "v",
+ "b",
+ "f",
+ "h",
+ "ã",
+ "q",
+ "é",
+ "ç",
+ "á",
+ "z",
+ "í",
+ ],
+ "Swedish": [
+ "e",
+ "a",
+ "n",
+ "r",
+ "t",
+ "s",
+ "i",
+ "l",
+ "d",
+ "o",
+ "m",
+ "k",
+ "g",
+ "v",
+ "h",
+ "f",
+ "u",
+ "p",
+ "ä",
+ "c",
+ "b",
+ "ö",
+ "å",
+ "y",
+ "j",
+ "x",
+ ],
+ "Chinese": [
+ "的",
+ "一",
+ "是",
+ "不",
+ "了",
+ "在",
+ "人",
+ "有",
+ "我",
+ "他",
+ "这",
+ "个",
+ "们",
+ "中",
+ "来",
+ "上",
+ "大",
+ "为",
+ "和",
+ "国",
+ "地",
+ "到",
+ "以",
+ "说",
+ "时",
+ "要",
+ "就",
+ "出",
+ "会",
+ "可",
+ "也",
+ "你",
+ "对",
+ "生",
+ "能",
+ "而",
+ "子",
+ "那",
+ "得",
+ "于",
+ "着",
+ "下",
+ "自",
+ "之",
+ "年",
+ "过",
+ "发",
+ "后",
+ "作",
+ "里",
+ "用",
+ "道",
+ "行",
+ "所",
+ "然",
+ "家",
+ "种",
+ "事",
+ "成",
+ "方",
+ "多",
+ "经",
+ "么",
+ "去",
+ "法",
+ "学",
+ "如",
+ "都",
+ "同",
+ "现",
+ "当",
+ "没",
+ "动",
+ "面",
+ "起",
+ "看",
+ "定",
+ "天",
+ "分",
+ "还",
+ "进",
+ "好",
+ "小",
+ "部",
+ "其",
+ "些",
+ "主",
+ "样",
+ "理",
+ "心",
+ "她",
+ "本",
+ "前",
+ "开",
+ "但",
+ "因",
+ "只",
+ "从",
+ "想",
+ "实",
+ ],
+ "Ukrainian": [
+ "о",
+ "а",
+ "н",
+ "і",
+ "и",
+ "р",
+ "в",
+ "т",
+ "е",
+ "с",
+ "к",
+ "л",
+ "у",
+ "д",
+ "м",
+ "п",
+ "з",
+ "я",
+ "ь",
+ "б",
+ "г",
+ "й",
+ "ч",
+ "х",
+ "ц",
+ "ї",
+ ],
+ "Norwegian": [
+ "e",
+ "r",
+ "n",
+ "t",
+ "a",
+ "s",
+ "i",
+ "o",
+ "l",
+ "d",
+ "g",
+ "k",
+ "m",
+ "v",
+ "f",
+ "p",
+ "u",
+ "b",
+ "h",
+ "å",
+ "y",
+ "j",
+ "ø",
+ "c",
+ "æ",
+ "w",
+ ],
+ "Finnish": [
+ "a",
+ "i",
+ "n",
+ "t",
+ "e",
+ "s",
+ "l",
+ "o",
+ "u",
+ "k",
+ "ä",
+ "m",
+ "r",
+ "v",
+ "j",
+ "h",
+ "p",
+ "y",
+ "d",
+ "ö",
+ "g",
+ "c",
+ "b",
+ "f",
+ "w",
+ "z",
+ ],
+ "Vietnamese": [
+ "n",
+ "h",
+ "t",
+ "i",
+ "c",
+ "g",
+ "a",
+ "o",
+ "u",
+ "m",
+ "l",
+ "r",
+ "à",
+ "đ",
+ "s",
+ "e",
+ "v",
+ "p",
+ "b",
+ "y",
+ "ư",
+ "d",
+ "á",
+ "k",
+ "ộ",
+ "ế",
+ ],
+ "Czech": [
+ "o",
+ "e",
+ "a",
+ "n",
+ "t",
+ "s",
+ "i",
+ "l",
+ "v",
+ "r",
+ "k",
+ "d",
+ "u",
+ "m",
+ "p",
+ "í",
+ "c",
+ "h",
+ "z",
+ "á",
+ "y",
+ "j",
+ "b",
+ "ě",
+ "é",
+ "ř",
+ ],
+ "Hungarian": [
+ "e",
+ "a",
+ "t",
+ "l",
+ "s",
+ "n",
+ "k",
+ "r",
+ "i",
+ "o",
+ "z",
+ "á",
+ "é",
+ "g",
+ "m",
+ "b",
+ "y",
+ "v",
+ "d",
+ "h",
+ "u",
+ "p",
+ "j",
+ "ö",
+ "f",
+ "c",
+ ],
+ "Korean": [
+ "이",
+ "다",
+ "에",
+ "의",
+ "는",
+ "로",
+ "하",
+ "을",
+ "가",
+ "고",
+ "지",
+ "서",
+ "한",
+ "은",
+ "기",
+ "으",
+ "년",
+ "대",
+ "사",
+ "시",
+ "를",
+ "리",
+ "도",
+ "인",
+ "스",
+ "일",
+ ],
+ "Indonesian": [
+ "a",
+ "n",
+ "e",
+ "i",
+ "r",
+ "t",
+ "u",
+ "s",
+ "d",
+ "k",
+ "m",
+ "l",
+ "g",
+ "p",
+ "b",
+ "o",
+ "h",
+ "y",
+ "j",
+ "c",
+ "w",
+ "f",
+ "v",
+ "z",
+ "x",
+ "q",
+ ],
+ "Turkish": [
+ "a",
+ "e",
+ "i",
+ "n",
+ "r",
+ "l",
+ "ı",
+ "k",
+ "d",
+ "t",
+ "s",
+ "m",
+ "y",
+ "u",
+ "o",
+ "b",
+ "ü",
+ "ş",
+ "v",
+ "g",
+ "z",
+ "h",
+ "c",
+ "p",
+ "ç",
+ "ğ",
+ ],
+ "Romanian": [
+ "e",
+ "i",
+ "a",
+ "r",
+ "n",
+ "t",
+ "u",
+ "l",
+ "o",
+ "c",
+ "s",
+ "d",
+ "p",
+ "m",
+ "ă",
+ "f",
+ "v",
+ "î",
+ "g",
+ "b",
+ "ș",
+ "ț",
+ "z",
+ "h",
+ "â",
+ "j",
+ ],
+ "Farsi": [
+ "ا",
+ "ی",
+ "ر",
+ "د",
+ "ن",
+ "ه",
+ "و",
+ "م",
+ "ت",
+ "ب",
+ "س",
+ "ل",
+ "ک",
+ "ش",
+ "ز",
+ "ف",
+ "گ",
+ "ع",
+ "خ",
+ "ق",
+ "ج",
+ "آ",
+ "پ",
+ "ح",
+ "ط",
+ "ص",
+ ],
+ "Arabic": [
+ "ا",
+ "ل",
+ "ي",
+ "م",
+ "و",
+ "ن",
+ "ر",
+ "ت",
+ "ب",
+ "ة",
+ "ع",
+ "د",
+ "س",
+ "ف",
+ "ه",
+ "ك",
+ "ق",
+ "أ",
+ "ح",
+ "ج",
+ "ش",
+ "ط",
+ "ص",
+ "ى",
+ "خ",
+ "إ",
+ ],
+ "Danish": [
+ "e",
+ "r",
+ "n",
+ "t",
+ "a",
+ "i",
+ "s",
+ "d",
+ "l",
+ "o",
+ "g",
+ "m",
+ "k",
+ "f",
+ "v",
+ "u",
+ "b",
+ "h",
+ "p",
+ "å",
+ "y",
+ "ø",
+ "æ",
+ "c",
+ "j",
+ "w",
+ ],
+ "Serbian": [
+ "а",
+ "и",
+ "о",
+ "е",
+ "н",
+ "р",
+ "с",
+ "у",
+ "т",
+ "к",
+ "ј",
+ "в",
+ "д",
+ "м",
+ "п",
+ "л",
+ "г",
+ "з",
+ "б",
+ "a",
+ "i",
+ "e",
+ "o",
+ "n",
+ "ц",
+ "ш",
+ ],
+ "Lithuanian": [
+ "i",
+ "a",
+ "s",
+ "o",
+ "r",
+ "e",
+ "t",
+ "n",
+ "u",
+ "k",
+ "m",
+ "l",
+ "p",
+ "v",
+ "d",
+ "j",
+ "g",
+ "ė",
+ "b",
+ "y",
+ "ų",
+ "š",
+ "ž",
+ "c",
+ "ą",
+ "į",
+ ],
+ "Slovene": [
+ "e",
+ "a",
+ "i",
+ "o",
+ "n",
+ "r",
+ "s",
+ "l",
+ "t",
+ "j",
+ "v",
+ "k",
+ "d",
+ "p",
+ "m",
+ "u",
+ "z",
+ "b",
+ "g",
+ "h",
+ "č",
+ "c",
+ "š",
+ "ž",
+ "f",
+ "y",
+ ],
+ "Slovak": [
+ "o",
+ "a",
+ "e",
+ "n",
+ "i",
+ "r",
+ "v",
+ "t",
+ "s",
+ "l",
+ "k",
+ "d",
+ "m",
+ "p",
+ "u",
+ "c",
+ "h",
+ "j",
+ "b",
+ "z",
+ "á",
+ "y",
+ "ý",
+ "í",
+ "č",
+ "é",
+ ],
+ "Hebrew": [
+ "י",
+ "ו",
+ "ה",
+ "ל",
+ "ר",
+ "ב",
+ "ת",
+ "מ",
+ "א",
+ "ש",
+ "נ",
+ "ע",
+ "ם",
+ "ד",
+ "ק",
+ "ח",
+ "פ",
+ "ס",
+ "כ",
+ "ג",
+ "ט",
+ "צ",
+ "ן",
+ "ז",
+ "ך",
+ ],
+ "Bulgarian": [
+ "а",
+ "и",
+ "о",
+ "е",
+ "н",
+ "т",
+ "р",
+ "с",
+ "в",
+ "л",
+ "к",
+ "д",
+ "п",
+ "м",
+ "з",
+ "г",
+ "я",
+ "ъ",
+ "у",
+ "б",
+ "ч",
+ "ц",
+ "й",
+ "ж",
+ "щ",
+ "х",
+ ],
+ "Croatian": [
+ "a",
+ "i",
+ "o",
+ "e",
+ "n",
+ "r",
+ "j",
+ "s",
+ "t",
+ "u",
+ "k",
+ "l",
+ "v",
+ "d",
+ "m",
+ "p",
+ "g",
+ "z",
+ "b",
+ "c",
+ "č",
+ "h",
+ "š",
+ "ž",
+ "ć",
+ "f",
+ ],
+ "Hindi": [
+ "क",
+ "र",
+ "स",
+ "न",
+ "त",
+ "म",
+ "ह",
+ "प",
+ "य",
+ "ल",
+ "व",
+ "ज",
+ "द",
+ "ग",
+ "ब",
+ "श",
+ "ट",
+ "अ",
+ "ए",
+ "थ",
+ "भ",
+ "ड",
+ "च",
+ "ध",
+ "ष",
+ "इ",
+ ],
+ "Estonian": [
+ "a",
+ "i",
+ "e",
+ "s",
+ "t",
+ "l",
+ "u",
+ "n",
+ "o",
+ "k",
+ "r",
+ "d",
+ "m",
+ "v",
+ "g",
+ "p",
+ "j",
+ "h",
+ "ä",
+ "b",
+ "õ",
+ "ü",
+ "f",
+ "c",
+ "ö",
+ "y",
+ ],
+ "Thai": [
+ "า",
+ "น",
+ "ร",
+ "อ",
+ "ก",
+ "เ",
+ "ง",
+ "ม",
+ "ย",
+ "ล",
+ "ว",
+ "ด",
+ "ท",
+ "ส",
+ "ต",
+ "ะ",
+ "ป",
+ "บ",
+ "ค",
+ "ห",
+ "แ",
+ "จ",
+ "พ",
+ "ช",
+ "ข",
+ "ใ",
+ ],
+ "Greek": [
+ "α",
+ "τ",
+ "ο",
+ "ι",
+ "ε",
+ "ν",
+ "ρ",
+ "σ",
+ "κ",
+ "η",
+ "π",
+ "ς",
+ "υ",
+ "μ",
+ "λ",
+ "ί",
+ "ό",
+ "ά",
+ "γ",
+ "έ",
+ "δ",
+ "ή",
+ "ω",
+ "χ",
+ "θ",
+ "ύ",
+ ],
+ "Tamil": [
+ "க",
+ "த",
+ "ப",
+ "ட",
+ "ர",
+ "ம",
+ "ல",
+ "ன",
+ "வ",
+ "ற",
+ "ய",
+ "ள",
+ "ச",
+ "ந",
+ "இ",
+ "ண",
+ "அ",
+ "ஆ",
+ "ழ",
+ "ங",
+ "எ",
+ "உ",
+ "ஒ",
+ "ஸ",
+ ],
+ "Kazakh": [
+ "а",
+ "ы",
+ "е",
+ "н",
+ "т",
+ "р",
+ "л",
+ "і",
+ "д",
+ "с",
+ "м",
+ "қ",
+ "к",
+ "о",
+ "б",
+ "и",
+ "у",
+ "ғ",
+ "ж",
+ "ң",
+ "з",
+ "ш",
+ "й",
+ "п",
+ "г",
+ "ө",
+ ],
+}
+
+LANGUAGE_SUPPORTED_COUNT: int = len(FREQUENCIES)
diff --git a/third_party/python/charset_normalizer/charset_normalizer/md.py b/third_party/python/charset_normalizer/charset_normalizer/md.py
index 13aa062e71e4..77897aae4f44 100644
--- a/third_party/python/charset_normalizer/charset_normalizer/md.py
+++ b/third_party/python/charset_normalizer/charset_normalizer/md.py
@@ -9,7 +9,8 @@ from .constant import (
)
from .utils import (
is_accentuated,
- is_ascii,
+ is_arabic,
+ is_arabic_isolated_form,
is_case_variable,
is_cjk,
is_emoticon,
@@ -128,8 +129,9 @@ class TooManyAccentuatedPlugin(MessDetectorPlugin):
@property
def ratio(self) -> float:
- if self._character_count == 0 or self._character_count < 8:
+ if self._character_count < 8:
return 0.0
+
ratio_of_accentuation: float = self._accentuated_count / self._character_count
return ratio_of_accentuation if ratio_of_accentuation >= 0.35 else 0.0
@@ -234,16 +236,13 @@ class SuspiciousRange(MessDetectorPlugin):
@property
def ratio(self) -> float:
- if self._character_count == 0:
+ if self._character_count <= 24:
return 0.0
ratio_of_suspicious_range_usage: float = (
self._suspicious_successive_range_count * 2
) / self._character_count
- if ratio_of_suspicious_range_usage < 0.1:
- return 0.0
-
return ratio_of_suspicious_range_usage
@@ -296,7 +295,11 @@ class SuperWeirdWordPlugin(MessDetectorPlugin):
self._is_current_word_bad = True
# Word/Buffer ending with an upper case accentuated letter are so rare,
# that we will consider them all as suspicious. Same weight as foreign_long suspicious.
- if is_accentuated(self._buffer[-1]) and self._buffer[-1].isupper():
+ if (
+ is_accentuated(self._buffer[-1])
+ and self._buffer[-1].isupper()
+ and all(_.isupper() for _ in self._buffer) is False
+ ):
self._foreign_long_count += 1
self._is_current_word_bad = True
if buffer_length >= 24 and self._foreign_long_watch:
@@ -419,7 +422,7 @@ class ArchaicUpperLowerPlugin(MessDetectorPlugin):
return
- if self._current_ascii_only is True and is_ascii(character) is False:
+ if self._current_ascii_only is True and character.isascii() is False:
self._current_ascii_only = False
if self._last_alpha_seen is not None:
@@ -455,6 +458,34 @@ class ArchaicUpperLowerPlugin(MessDetectorPlugin):
return self._successive_upper_lower_count_final / self._character_count
+class ArabicIsolatedFormPlugin(MessDetectorPlugin):
+ def __init__(self) -> None:
+ self._character_count: int = 0
+ self._isolated_form_count: int = 0
+
+ def reset(self) -> None: # pragma: no cover
+ self._character_count = 0
+ self._isolated_form_count = 0
+
+ def eligible(self, character: str) -> bool:
+ return is_arabic(character)
+
+ def feed(self, character: str) -> None:
+ self._character_count += 1
+
+ if is_arabic_isolated_form(character):
+ self._isolated_form_count += 1
+
+ @property
+ def ratio(self) -> float:
+ if self._character_count < 8:
+ return 0.0
+
+ isolated_form_usage: float = self._isolated_form_count / self._character_count
+
+ return isolated_form_usage
+
+
@lru_cache(maxsize=1024)
def is_suspiciously_successive_range(
unicode_range_a: Optional[str], unicode_range_b: Optional[str]
@@ -522,6 +553,8 @@ def is_suspiciously_successive_range(
return False
if "Forms" in unicode_range_a or "Forms" in unicode_range_b:
return False
+ if unicode_range_a == "Basic Latin" or unicode_range_b == "Basic Latin":
+ return False
return True
diff --git a/third_party/python/charset_normalizer/charset_normalizer/models.py b/third_party/python/charset_normalizer/charset_normalizer/models.py
index 7f8ca389050c..a760b9c558d9 100644
--- a/third_party/python/charset_normalizer/charset_normalizer/models.py
+++ b/third_party/python/charset_normalizer/charset_normalizer/models.py
@@ -54,16 +54,19 @@ class CharsetMatch:
# Below 1% difference --> Use Coherence
if chaos_difference < 0.01 and coherence_difference > 0.02:
- # When having a tough decision, use the result that decoded as many multi-byte as possible.
- if chaos_difference == 0.0 and self.coherence == other.coherence:
- return self.multi_byte_usage > other.multi_byte_usage
return self.coherence > other.coherence
+ elif chaos_difference < 0.01 and coherence_difference <= 0.02:
+ # When having a difficult decision, use the result that decoded as many multi-byte as possible.
+ # preserve RAM usage!
+ if len(self._payload) >= TOO_BIG_SEQUENCE:
+ return self.chaos < other.chaos
+ return self.multi_byte_usage > other.multi_byte_usage
return self.chaos < other.chaos
@property
def multi_byte_usage(self) -> float:
- return 1.0 - len(str(self)) / len(self.raw)
+ return 1.0 - (len(str(self)) / len(self.raw))
def __str__(self) -> str:
# Lazy Str Loading
diff --git a/third_party/python/charset_normalizer/charset_normalizer/utils.py b/third_party/python/charset_normalizer/charset_normalizer/utils.py
index bf2767a0e602..e5cbbf4c0ddf 100644
--- a/third_party/python/charset_normalizer/charset_normalizer/utils.py
+++ b/third_party/python/charset_normalizer/charset_normalizer/utils.py
@@ -32,6 +32,8 @@ def is_accentuated(character: str) -> bool:
or "WITH DIAERESIS" in description
or "WITH CIRCUMFLEX" in description
or "WITH TILDE" in description
+ or "WITH MACRON" in description
+ or "WITH RING ABOVE" in description
)
@@ -69,15 +71,6 @@ def is_latin(character: str) -> bool:
return "LATIN" in description
-@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION)
-def is_ascii(character: str) -> bool:
- try:
- character.encode("ascii")
- except UnicodeEncodeError:
- return False
- return True
-
-
@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION)
def is_punctuation(character: str) -> bool:
character_category: str = unicodedata.category(character)
@@ -105,7 +98,7 @@ def is_symbol(character: str) -> bool:
if character_range is None:
return False
- return "Forms" in character_range
+ return "Forms" in character_range and character_category != "Lo"
@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION)
@@ -115,7 +108,7 @@ def is_emoticon(character: str) -> bool:
if character_range is None:
return False
- return "Emoticons" in character_range
+ return "Emoticons" in character_range or "Pictographs" in character_range
@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION)
@@ -133,12 +126,6 @@ def is_case_variable(character: str) -> bool:
return character.islower() != character.isupper()
-def is_private_use_only(character: str) -> bool:
- character_category: str = unicodedata.category(character)
-
- return character_category == "Co"
-
-
@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION)
def is_cjk(character: str) -> bool:
try:
@@ -189,6 +176,26 @@ def is_thai(character: str) -> bool:
return "THAI" in character_name
+@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION)
+def is_arabic(character: str) -> bool:
+ try:
+ character_name = unicodedata.name(character)
+ except ValueError:
+ return False
+
+ return "ARABIC" in character_name
+
+
+@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION)
+def is_arabic_isolated_form(character: str) -> bool:
+ try:
+ character_name = unicodedata.name(character)
+ except ValueError:
+ return False
+
+ return "ARABIC" in character_name and "ISOLATED FORM" in character_name
+
+
@lru_cache(maxsize=len(UNICODE_RANGES_COMBINED))
def is_unicode_range_secondary(range_name: str) -> bool:
return any(keyword in range_name for keyword in UNICODE_SECONDARY_RANGE_KEYWORD)
@@ -205,7 +212,7 @@ def is_unprintable(character: str) -> bool:
)
-def any_specified_encoding(sequence: bytes, search_zone: int = 4096) -> Optional[str]:
+def any_specified_encoding(sequence: bytes, search_zone: int = 8192) -> Optional[str]:
"""
Extract using ASCII-only decoder any specified encoding in the first n-bytes.
"""
diff --git a/third_party/python/charset_normalizer/charset_normalizer/version.py b/third_party/python/charset_normalizer/charset_normalizer/version.py
index 5eed49a42ab2..5a4da4ff49bc 100644
--- a/third_party/python/charset_normalizer/charset_normalizer/version.py
+++ b/third_party/python/charset_normalizer/charset_normalizer/version.py
@@ -2,5 +2,5 @@
Expose version
"""
-__version__ = "3.2.0"
+__version__ = "3.3.2"
VERSION = __version__.split(".")
diff --git a/third_party/python/cookiecutter/cookiecutter-2.1.1.dist-info/METADATA b/third_party/python/cookiecutter/cookiecutter-2.1.1.dist-info/METADATA
deleted file mode 100644
index 43b7238d8f28..000000000000
--- a/third_party/python/cookiecutter/cookiecutter-2.1.1.dist-info/METADATA
+++ /dev/null
@@ -1,256 +0,0 @@
-Metadata-Version: 2.1
-Name: cookiecutter
-Version: 2.1.1
-Summary: A command-line utility that creates projects from project templates, e.g. creating a Python package project from a Python package project template.
-Home-page: https://github.com/cookiecutter/cookiecutter
-Author: Audrey Feldroy
-Author-email: audreyr@gmail.com
-License: BSD
-Keywords: cookiecutter,Python,projects,project templates,Jinja2,skeleton,scaffolding,project directory,package,packaging
-Classifier: Development Status :: 5 - Production/Stable
-Classifier: Environment :: Console
-Classifier: Intended Audience :: Developers
-Classifier: Natural Language :: English
-Classifier: License :: OSI Approved :: BSD License
-Classifier: Programming Language :: Python :: 3 :: Only
-Classifier: Programming Language :: Python :: 3
-Classifier: Programming Language :: Python :: 3.7
-Classifier: Programming Language :: Python :: 3.8
-Classifier: Programming Language :: Python :: 3.9
-Classifier: Programming Language :: Python :: 3.10
-Classifier: Programming Language :: Python :: Implementation :: CPython
-Classifier: Programming Language :: Python :: Implementation :: PyPy
-Classifier: Programming Language :: Python
-Classifier: Topic :: Software Development
-Requires-Python: >=3.7
-Description-Content-Type: text/markdown
-License-File: LICENSE
-License-File: AUTHORS.md
-Requires-Dist: binaryornot (>=0.4.4)
-Requires-Dist: Jinja2 (<4.0.0,>=2.7)
-Requires-Dist: click (<9.0.0,>=7.0)
-Requires-Dist: pyyaml (>=5.3.1)
-Requires-Dist: jinja2-time (>=0.2.0)
-Requires-Dist: python-slugify (>=4.0.0)
-Requires-Dist: requests (>=2.23.0)
-
-# Cookiecutter
-
-[](https://pypi.org/project/cookiecutter/)
-[](https://pypi.org/project/cookiecutter/)
-[](https://github.com/cookiecutter/cookiecutter/actions)
-[](https://codecov.io/github/cookiecutter/cookiecutter?branch=master)
-[](https://discord.gg/9BrxzPKuEW)
-[](https://readthedocs.org/projects/cookiecutter/?badge=latest)
-[](https://scrutinizer-ci.com/g/cookiecutter/cookiecutter/?branch=master)
-
-A command-line utility that creates projects from **cookiecutters** (project templates), e.g. creating a Python package project from a Python package project template.
-
-- Documentation: [https://cookiecutter.readthedocs.io](https://cookiecutter.readthedocs.io)
-- GitHub: [https://github.com/cookiecutter/cookiecutter](https://github.com/cookiecutter/cookiecutter)
-- PyPI: [https://pypi.org/project/cookiecutter/](https://pypi.org/project/cookiecutter/)
-- Free and open source software: [BSD license](https://github.com/cookiecutter/cookiecutter/blob/master/LICENSE)
-
-
-
-## Features
-
-- Cross-platform: Windows, Mac, and Linux are officially supported.
-- You don't have to know/write Python code to use Cookiecutter.
-- Works with Python 3.7, 3.8, 3.9., 3.10
-- Project templates can be in any programming language or markup format:
- Python, JavaScript, Ruby, CoffeeScript, RST, Markdown, CSS, HTML, you name it.
- You can use multiple languages in the same project template.
-
-### For users of existing templates
-
-- Simple command line usage:
-
- ```bash
- # Create project from the cookiecutter-pypackage.git repo template
- # You'll be prompted to enter values.
- # Then it'll create your Python package in the current working directory,
- # based on those values.
- $ cookiecutter https://github.com/audreyfeldroy/cookiecutter-pypackage
- # For the sake of brevity, repos on GitHub can just use the 'gh' prefix
- $ cookiecutter gh:audreyfeldroy/cookiecutter-pypackage
- ```
-
-- Use it at the command line with a local template:
-
- ```bash
- # Create project in the current working directory, from the local
- # cookiecutter-pypackage/ template
- $ cookiecutter cookiecutter-pypackage/
- ```
-
-- Or use it from Python:
-
- ```py
- from cookiecutter.main import cookiecutter
-
- # Create project from the cookiecutter-pypackage/ template
- cookiecutter('cookiecutter-pypackage/')
-
- # Create project from the cookiecutter-pypackage.git repo template
- cookiecutter('https://github.com/audreyfeldroy/cookiecutter-pypackage.git')
- ```
-
-- Unless you suppress it with `--no-input`, you are prompted for input:
- - Prompts are the keys in `cookiecutter.json`.
- - Default responses are the values in `cookiecutter.json`.
- - Prompts are shown in order.
-- Cross-platform support for `~/.cookiecutterrc` files:
-
- ```yaml
- default_context:
- full_name: "Audrey Roy Greenfeld"
- email: "audreyr@gmail.com"
- github_username: "audreyfeldroy"
- cookiecutters_dir: "~/.cookiecutters/"
- ```
-
-- Cookiecutters (cloned Cookiecutter project templates) are put into `~/.cookiecutters/` by default, or cookiecutters_dir if specified.
-- If you have already cloned a cookiecutter into `~/.cookiecutters/`, you can reference it by directory name:
-
- ```bash
- # Clone cookiecutter-pypackage
- $ cookiecutter gh:audreyfeldroy/cookiecutter-pypackage
- # Now you can use the already cloned cookiecutter by name
- $ cookiecutter cookiecutter-pypackage
- ```
-
-- You can use local cookiecutters, or remote cookiecutters directly from Git repos or from Mercurial repos on Bitbucket.
-- Default context: specify key/value pairs that you want used as defaults whenever you generate a project.
-- Inject extra context with command-line arguments:
-
- ```bash
- cookiecutter --no-input gh:msabramo/cookiecutter-supervisor program_name=foobar startsecs=10
- ```
-
-- Direct access to the Cookiecutter API allows for injection of extra context.
-- Paths to local projects can be specified as absolute or relative.
-- Projects generated to your current directory or to target directory if specified with `-o` option.
-
-### For template creators
-
-- Supports unlimited levels of directory nesting.
-- 100% of templating is done with Jinja2.
-- Both, directory names and filenames can be templated.
- For example:
-
- ```py
- {{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}.py
- ```
-- Simply define your template variables in a `cookiecutter.json` file.
- For example:
-
- ```json
- {
- "full_name": "Audrey Roy Greenfeld",
- "email": "audreyr@gmail.com",
- "project_name": "Complexity",
- "repo_name": "complexity",
- "project_short_description": "Refreshingly simple static site generator.",
- "release_date": "2013-07-10",
- "year": "2013",
- "version": "0.1.1"
- }
- ```
-- Pre- and post-generate hooks: Python or shell scripts to run before or after generating a project.
-
-## Available Cookiecutters
-
-Making great cookies takes a lot of cookiecutters and contributors.
-We're so pleased that there are many Cookiecutter project templates to choose from.
-We hope you find a cookiecutter that is just right for your needs.
-
-### A Pantry Full of Cookiecutters
-
-The best place to start searching for specific and ready to use cookiecutter template is [Github search](https://github.com/search?q=cookiecutter&type=Repositories).
-Just type `cookiecutter` and you will discover over 4000 related repositories.
-
-We also recommend you to check related GitHub topics.
-For general search use [cookiecutter-template](https://github.com/topics/cookiecutter-template).
-For specific topics try to use `cookiecutter-yourtopic`, like `cookiecutter-python` or `cookiecutter-datascience`.
-This is a new GitHub feature, so not all active repositories use it at the moment.
-
-If you are template developer please add related [topics](https://help.github.com/en/github/administering-a-repository/classifying-your-repository-with-topics) with `cookiecutter` prefix to you repository.
-We believe it will make it more discoverable.
-You are almost not limited in topics amount, use it!
-
-### Cookiecutter Specials
-
-These Cookiecutters are maintained by the cookiecutter team:
-
-- [cookiecutter-pypackage](https://github.com/audreyfeldroy/cookiecutter-pypackage):
- ultimate Python package project template by [@audreyfeldroy's](https://github.com/audreyfeldroy).
-- [cookiecutter-django](https://github.com/pydanny/cookiecutter-django):
- a framework for jumpstarting production-ready Django projects quickly.
- It is bleeding edge with Bootstrap 5, customizable users app, starter templates, working user registration, celery setup, and much more.
-- [cookiecutter-pytest-plugin](https://github.com/pytest-dev/cookiecutter-pytest-plugin):
- Minimal Cookiecutter template for authoring [pytest](https://docs.pytest.org/) plugins that help you to write better programs.
-
-## Community
-
-The core committer team can be found in [authors section](AUTHORS.md).
-We are always welcome and invite you to participate.
-
-Stuck? Try one of the following:
-
-- See the [Troubleshooting](https://cookiecutter.readthedocs.io/en/latest/troubleshooting.html) page.
-- Ask for help on [Stack Overflow](https://stackoverflow.com/questions/tagged/cookiecutter).
-- You are strongly encouraged to [file an issue](https://github.com/cookiecutter/cookiecutter/issues?q=is%3Aopen) about the problem.
- Do it even if it's just "I can't get it to work on this cookiecutter" with a link to your cookiecutter.
- Don't worry about naming/pinpointing the issue properly.
-- Ask for help on [Discord](https://discord.gg/9BrxzPKuEW) if you must (but please try one of the other options first, so that others can benefit from the discussion).
-
-Development on Cookiecutter is community-driven:
-
-- Huge thanks to all the [contributors](AUTHORS.md) who have pitched in to help make Cookiecutter an even better tool.
-- Everyone is invited to contribute.
- Read the [contributing instructions](CONTRIBUTING.md), then get started.
-- Connect with other Cookiecutter contributors and users on [Discord](https://discord.gg/9BrxzPKuEW)
- (note: due to work and other commitments, a core committer might not always be available)
-
-Encouragement is unbelievably motivating.
-If you want more work done on Cookiecutter, show support:
-
-- Thank a core committer for their efforts.
-- Star [Cookiecutter on GitHub](https://github.com/cookiecutter/cookiecutter).
-- [Support this project](#support-this-project)
-
-Got criticism or complaints?
-
-- [File an issue](https://github.com/cookiecutter/cookiecutter/issues?q=is%3Aopen) so that Cookiecutter can be improved.
- Be friendly and constructive about what could be better.
- Make detailed suggestions.
-- **Keep us in the loop so that we can help.**
- For example, if you are discussing problems with Cookiecutter on a mailing list, [file an issue](https://github.com/cookiecutter/cookiecutter/issues?q=is%3Aopen) where you link to the discussion thread and/or cc at least 1 core committer on the email.
-- Be encouraging.
- A comment like "This function ought to be rewritten like this" is much more likely to result in action than a comment like "Eww, look how bad this function is."
-
-Waiting for a response to an issue/question?
-
-- Be patient and persistent. All issues are on the core committer team's radar and will be considered thoughtfully, but we have a lot of issues to work through.
- If urgent, it's fine to ping a core committer in the issue with a reminder.
-- Ask others to comment, discuss, review, etc.
-- Search the Cookiecutter repo for issues related to yours.
-- Need a fix/feature/release/help urgently, and can't wait?
- [@audreyfeldroy](https://github.com/audreyfeldroy) is available for hire for consultation or custom development.
-
-## Support This Project
-
-This project is run by volunteers.
-Shortly we will be providing means for organizations and individuals to support the project.
-
-## Code of Conduct
-
-Everyone interacting in the Cookiecutter project's codebases and documentation is expected to follow the [PyPA Code of Conduct](https://www.pypa.io/en/latest/code-of-conduct/).
-This includes, but is not limited to, issue trackers, chat rooms, mailing lists, and other virtual or in real life communication.
-
-## Creator / Leader
-
-This project was created and is led by [Audrey Roy Greenfeld](https://github.com/audreyfeldroy).
-
-She is supported by a team of maintainers.
diff --git a/third_party/python/cookiecutter/cookiecutter-2.1.1.dist-info/RECORD b/third_party/python/cookiecutter/cookiecutter-2.1.1.dist-info/RECORD
deleted file mode 100644
index e9bbcd08c405..000000000000
--- a/third_party/python/cookiecutter/cookiecutter-2.1.1.dist-info/RECORD
+++ /dev/null
@@ -1,25 +0,0 @@
-cookiecutter/__init__.py,sha256=mvVTrlACc_h48704u9mn8R7qybdzRDm3kUJYaag2U5I,59
-cookiecutter/__main__.py,sha256=0i3swGdJG0xGGydZ8oVXMVv17yQm3kHzRaP35B6uEas,194
-cookiecutter/cli.py,sha256=CWBPBcFBe6P-JqKymRLGmtOU9SBed_gso7nsffi_uCw,6926
-cookiecutter/config.py,sha256=Sy3a9nrybICBvI5YLYS2yUdA2JEbrBJhWUGB2RIDWZ8,4250
-cookiecutter/environment.py,sha256=nCEeEc8puQlMJsU6OGtWzj2QIwbR_cSLY07Z9gmOEHQ,2259
-cookiecutter/exceptions.py,sha256=ri744cAhzcMR86NCzbqq0QzpKZ5Mrsq0Hhl0_6sg8vg,3886
-cookiecutter/extensions.py,sha256=FrxrIxgYnnXTMa8hy38n6E5b9WS70PdpkJlLjip_hoI,1861
-cookiecutter/find.py,sha256=L1JE51TWguZPqAGteLpDsnp3AZVJpVa1Cjl7j5tuYoQ,1008
-cookiecutter/generate.py,sha256=vA6q8IOgrXLrUj2LZAH4vSL8SJXtZdYK8FPVmT56EPw,14827
-cookiecutter/hooks.py,sha256=eT_wRfWXBhiSfMhHerrx8ACAMeexu91fbqtk7NE1oI8,4227
-cookiecutter/log.py,sha256=4KwD0yjS5jGK17pJm94jYbJDib0r_hhd_1bdNN-C5y0,1568
-cookiecutter/main.py,sha256=XA9GKJbrDCaVDivkGkBLuFbTS7rqDTWIRnrEDcwb22c,4657
-cookiecutter/prompt.py,sha256=jipyemmYF-HE3K0cmkrycoZ8TFUhJpIYMr6dxhErvg8,8197
-cookiecutter/replay.py,sha256=D2vKyMfMbZ1So0IrIk8KWzYj5l0Jbvr9yQoIO_1wb4Y,1512
-cookiecutter/repository.py,sha256=C8jk4OhGc1ldCjdZ5IXHMSJyaK-AX9GD0-jXOcPGv3g,4206
-cookiecutter/utils.py,sha256=wYctIUKvuh7yEBaBaNu_H_ohNIOlE-e8FYCIbemgARw,3136
-cookiecutter/vcs.py,sha256=RNb_L_pRbezB3tlvEVwBBxDiW7yLPJ1ku978V1BFFzc,4184
-cookiecutter/zipfile.py,sha256=uFvUACBImliMpFfZDOfly0FAGggikvJQzjsc6li4KKc,4264
-cookiecutter-2.1.1.dist-info/AUTHORS.md,sha256=wr92S5G373_A1QbLpGehSS6AqWMqz_GMbNSCRVAzxaU,11784
-cookiecutter-2.1.1.dist-info/LICENSE,sha256=iPRc_2ncuesJXa8jA4O-ytRyYZSrjJsEHURe72StH2s,1493
-cookiecutter-2.1.1.dist-info/METADATA,sha256=iSZkpbgaptuhc1KYr2okLKP5M0alCGPxalF7GXOUleU,12593
-cookiecutter-2.1.1.dist-info/WHEEL,sha256=z9j0xAa_JmUKMpmz72K0ZGALSM_n-wQVmGbleXx2VHg,110
-cookiecutter-2.1.1.dist-info/entry_points.txt,sha256=NzYmXG0J4ML4EmM5POUl9I5PxNN1qlDVgOtkjVR8Fng,60
-cookiecutter-2.1.1.dist-info/top_level.txt,sha256=UE0NGj4iqLNgC-5CAY4V94Tqp9mAD8HqwvZpG9z6cGY,13
-cookiecutter-2.1.1.dist-info/RECORD,,
diff --git a/third_party/python/cookiecutter/cookiecutter-2.1.1.dist-info/AUTHORS.md b/third_party/python/cookiecutter/cookiecutter-2.6.0.dist-info/AUTHORS.md
similarity index 99%
rename from third_party/python/cookiecutter/cookiecutter-2.1.1.dist-info/AUTHORS.md
rename to third_party/python/cookiecutter/cookiecutter-2.6.0.dist-info/AUTHORS.md
index 9e5a014943ae..76ebc2622554 100644
--- a/third_party/python/cookiecutter/cookiecutter-2.1.1.dist-info/AUTHORS.md
+++ b/third_party/python/cookiecutter/cookiecutter-2.6.0.dist-info/AUTHORS.md
@@ -191,7 +191,7 @@ Contributions include user testing, debugging, improving documentation, reviewin
- Adam Chainz ([@adamchainz](https://github.com/adamchainz))
- Andrew Ittner ([@tephyr](https://github.com/tephyr))
-- Audrey Roy Greenfeld ([@audreyr](https://github.com/audreyr))
+- Audrey Roy Greenfeld ([@audreyfeldroy](https://github.com/audreyfeldroy))
- Carol Willing ([@willingc](https://github.com/willingc))
- Christopher Clarke ([@chrisdev](https://github.com/chrisdev))
- Citlalli Murillo ([@citmusa](https://github.com/citmusa))
diff --git a/third_party/python/cookiecutter/cookiecutter-2.1.1.dist-info/LICENSE b/third_party/python/cookiecutter/cookiecutter-2.6.0.dist-info/LICENSE
similarity index 96%
rename from third_party/python/cookiecutter/cookiecutter-2.1.1.dist-info/LICENSE
rename to third_party/python/cookiecutter/cookiecutter-2.6.0.dist-info/LICENSE
index 06486a8f39e4..9661fad7a1aa 100644
--- a/third_party/python/cookiecutter/cookiecutter-2.1.1.dist-info/LICENSE
+++ b/third_party/python/cookiecutter/cookiecutter-2.6.0.dist-info/LICENSE
@@ -1,4 +1,4 @@
-Copyright (c) 2013-2021, Audrey Roy Greenfeld
+Copyright (c) 2013-2022, Audrey Roy Greenfeld
All rights reserved.
Redistribution and use in source and binary forms, with or
diff --git a/third_party/python/cookiecutter/cookiecutter-2.6.0.dist-info/METADATA b/third_party/python/cookiecutter/cookiecutter-2.6.0.dist-info/METADATA
new file mode 100644
index 000000000000..98fd3984b2d1
--- /dev/null
+++ b/third_party/python/cookiecutter/cookiecutter-2.6.0.dist-info/METADATA
@@ -0,0 +1,181 @@
+Metadata-Version: 2.1
+Name: cookiecutter
+Version: 2.6.0
+Summary: A command-line utility that creates projects from project templates, e.g. creating a Python package project from a Python package project template.
+Home-page: https://github.com/cookiecutter/cookiecutter
+Author: Audrey Feldroy
+Author-email: audreyr@gmail.com
+License: BSD
+Project-URL: Documentation, https://cookiecutter.readthedocs.io
+Project-URL: Issues, https://github.com/cookiecutter/cookiecutter/issues
+Project-URL: Discord, https://discord.gg/9BrxzPKuEW
+Keywords: cookiecutter,Python,projects,project templates,Jinja2,skeleton,scaffolding,project directory,package,packaging
+Classifier: Development Status :: 5 - Production/Stable
+Classifier: Environment :: Console
+Classifier: Intended Audience :: Developers
+Classifier: Natural Language :: English
+Classifier: License :: OSI Approved :: BSD License
+Classifier: Programming Language :: Python :: 3 :: Only
+Classifier: Programming Language :: Python :: 3
+Classifier: Programming Language :: Python :: 3.7
+Classifier: Programming Language :: Python :: 3.8
+Classifier: Programming Language :: Python :: 3.9
+Classifier: Programming Language :: Python :: 3.10
+Classifier: Programming Language :: Python :: 3.11
+Classifier: Programming Language :: Python :: 3.12
+Classifier: Programming Language :: Python :: Implementation :: CPython
+Classifier: Programming Language :: Python :: Implementation :: PyPy
+Classifier: Programming Language :: Python
+Classifier: Topic :: Software Development
+Requires-Python: >=3.7
+Description-Content-Type: text/markdown
+License-File: LICENSE
+License-File: AUTHORS.md
+Requires-Dist: binaryornot >=0.4.4
+Requires-Dist: Jinja2 <4.0.0,>=2.7
+Requires-Dist: click <9.0.0,>=7.0
+Requires-Dist: pyyaml >=5.3.1
+Requires-Dist: python-slugify >=4.0.0
+Requires-Dist: requests >=2.23.0
+Requires-Dist: arrow
+Requires-Dist: rich
+
+
+
+
+
+
+
+[](https://pypi.org/project/cookiecutter/)
+[](https://pypi.org/project/cookiecutter/)
+[](https://github.com/cookiecutter/cookiecutter/actions)
+[](https://codecov.io/github/cookiecutter/cookiecutter?branch=master)
+[](https://discord.gg/9BrxzPKuEW)
+[](https://readthedocs.org/projects/cookiecutter/?badge=latest)
+[](https://scrutinizer-ci.com/g/cookiecutter/cookiecutter/?branch=master)
+
+
+
+# Cookiecutter
+
+Create projects swiftly from **cookiecutters** (project templates) with this command-line utility. Ideal for generating Python package projects and more.
+
+- [Documentation](https://cookiecutter.readthedocs.io)
+- [GitHub](https://github.com/cookiecutter/cookiecutter)
+- [PyPI](https://pypi.org/project/cookiecutter/)
+- [License (BSD)](https://github.com/cookiecutter/cookiecutter/blob/main/LICENSE)
+
+## Installation
+
+Install cookiecutter using pip package manager:
+```
+# pipx is strongly recommended.
+pipx install cookiecutter
+
+# If pipx is not an option,
+# you can install cookiecutter in your Python user directory.
+python -m pip install --user cookiecutter
+```
+
+## Features
+
+- **Cross-Platform:** Supports Windows, Mac, and Linux.
+- **User-Friendly:** No Python knowledge required.
+- **Versatile:** Compatible with Python 3.7 to 3.12.
+- **Multi-Language Support:** Use templates in any language or markup format.
+
+### For Users
+
+#### Quick Start
+
+The recommended way to use Cookiecutter as a command line utility is to run it with [`pipx`](https://pypa.github.io/pipx/), which can be installed with `pip install pipx`, but if you plan to use Cookiecutter programmatically, please run `pip install cookiecutter`.
+
+**Use a GitHub template**
+
+```bash
+# You'll be prompted to enter values.
+# Then it'll create your Python package in the current working directory,
+# based on those values.
+# For the sake of brevity, repos on GitHub can just use the 'gh' prefix
+$ pipx run cookiecutter gh:audreyfeldroy/cookiecutter-pypackage
+```
+
+**Use a local template**
+
+```bash
+$ pipx run cookiecutter cookiecutter-pypackage/
+```
+
+**Use it from Python**
+
+```py
+from cookiecutter.main import cookiecutter
+
+# Create project from the cookiecutter-pypackage/ template
+cookiecutter('cookiecutter-pypackage/')
+
+# Create project from the cookiecutter-pypackage.git repo template
+cookiecutter('gh:audreyfeldroy//cookiecutter-pypackage.git')
+```
+
+#### Detailed Usage
+
+- Generate projects from local or remote templates.
+- Customize projects with `cookiecutter.json` prompts.
+- Utilize pre-prompt, pre- and post-generate hooks.
+
+[Learn More](https://cookiecutter.readthedocs.io/en/latest/usage.html)
+
+### For Template Creators
+
+- Utilize unlimited directory nesting.
+- Employ Jinja2 for all templating needs.
+- Define template variables easily with `cookiecutter.json`.
+
+[Learn More](https://cookiecutter.readthedocs.io/en/latest/tutorials/)
+
+## Available Templates
+
+Discover a variety of ready-to-use templates on [GitHub](https://github.com/search?q=cookiecutter&type=Repositories).
+
+### Special Templates
+
+- [cookiecutter-pypackage](https://github.com/audreyfeldroy/cookiecutter-pypackage)
+- [cookiecutter-django](https://github.com/pydanny/cookiecutter-django)
+- [cookiecutter-pytest-plugin](https://github.com/pytest-dev/cookiecutter-pytest-plugin)
+- [cookiecutter-plone-starter](https://github.com/collective/cookiecutter-plone-starter)
+
+## Community
+
+Join the community, contribute, or seek assistance.
+
+- [Troubleshooting Guide](https://cookiecutter.readthedocs.io/en/latest/troubleshooting.html)
+- [Stack Overflow](https://stackoverflow.com/questions/tagged/cookiecutter)
+- [Discord](https://discord.gg/9BrxzPKuEW)
+- [File an Issue](https://github.com/cookiecutter/cookiecutter/issues?q=is%3Aopen)
+- [Contributors](AUTHORS.md)
+- [Contribution Guide](CONTRIBUTING.md)
+
+### Support
+
+- Star us on [GitHub](https://github.com/cookiecutter/cookiecutter).
+- Stay tuned for upcoming support options.
+
+### Feedback
+
+We value your feedback. Share your criticisms or complaints constructively to help us improve.
+
+- [File an Issue](https://github.com/cookiecutter/cookiecutter/issues?q=is%3Aopen)
+
+### Waiting for a Response?
+
+- Be patient and consider reaching out to the community for assistance.
+- For urgent matters, contact [@audreyfeldroy](https://github.com/audreyfeldroy) for consultation or custom development.
+
+## Code of Conduct
+
+Adhere to the [PyPA Code of Conduct](https://www.pypa.io/en/latest/code-of-conduct/) during all interactions in the project's ecosystem.
+
+## Acknowledgements
+
+Created and led by [Audrey Roy Greenfeld](https://github.com/audreyfeldroy), supported by a dedicated team of maintainers and contributors.
diff --git a/third_party/python/cookiecutter/cookiecutter-2.6.0.dist-info/RECORD b/third_party/python/cookiecutter/cookiecutter-2.6.0.dist-info/RECORD
new file mode 100644
index 000000000000..a86379bbf782
--- /dev/null
+++ b/third_party/python/cookiecutter/cookiecutter-2.6.0.dist-info/RECORD
@@ -0,0 +1,26 @@
+cookiecutter/VERSION.txt,sha256=ZpNDXq22c92il6BlLSQeKT42EgC8QNuUnPJQHRjdAe4,6
+cookiecutter/__init__.py,sha256=jTBQJjspBrKDfb2haGLWQqctW8WhGnVE9g3-NjgD62g,318
+cookiecutter/__main__.py,sha256=2JVU8TMLsY4u_ZGBnhKcPOo_hkI35NTkCDuaxY6o6IY,194
+cookiecutter/cli.py,sha256=oJFRfQcHdfkhnAj0QUQtUtaCFeuh0HQms6B5XK7p6lM,7320
+cookiecutter/config.py,sha256=ej-HBApdkn-gNPHonN63cEknlEAdtOuvbYJknkoaRho,4768
+cookiecutter/environment.py,sha256=pFTCl6e49G2y9Lg1mwBa7NfP9ELaL3LGndNDvPIxTbc,2281
+cookiecutter/exceptions.py,sha256=BrjHrDP-FZXzPLtnX1EzWmuK89lrEisAY1eBk5hZyKw,3886
+cookiecutter/extensions.py,sha256=8BuIn4PQD5vI8or61B9yDfqe6Zv3lmq5u2EyZP5ZcuE,3958
+cookiecutter/find.py,sha256=i4dDikoJdR_AnNFzgwhSpPfbK1DzPwGsY1Sw_ZG9fzg,1048
+cookiecutter/generate.py,sha256=bL4M82oQCHiyhG2jV_U1CKt3ZvzGuzGlccRX1QqT-6A,16485
+cookiecutter/hooks.py,sha256=uagC6zzvOmjFCCPYPFFeFNq-OkeIP1_iwUphjB3w33M,6025
+cookiecutter/log.py,sha256=siVpW210V9v3LLIbFaxkYX9ikR639_n3ClecsRW8QIA,1569
+cookiecutter/main.py,sha256=A9kJ515-xUrnEiUC2shtJi3TA6xFBVTjRPEgMQz1CFA,7808
+cookiecutter/prompt.py,sha256=HFoxWCoZCEuDH5vjUXypUB7JtneehIFYavANHLbuFwE,14179
+cookiecutter/replay.py,sha256=s2MdjGkpe5sRHECx8yhzF3P8DwLUIejXe_xNkreLRiE,1502
+cookiecutter/repository.py,sha256=5O4briSbOQ62X3q3Ue0xkDkxu6Q2sCOVNQjFSi_db48,4238
+cookiecutter/utils.py,sha256=AMePsbFp4QgnygdrUK5zMF47yz8nfNmv6SJOhVVF-Rk,2835
+cookiecutter/vcs.py,sha256=HEH9TrPyFzC3ywHKYtHbKB-dQXe-HTSpj4UmwRDnjzY,4414
+cookiecutter/zipfile.py,sha256=o-nd1qPnd_ebSO3KZ39JTK4QmaN3L2a79LGJ2r1YOQU,4452
+cookiecutter-2.6.0.dist-info/AUTHORS.md,sha256=bhFFlXN6uRC8P-aKyAN691dGR2fTvxyLTyQCAmGjgkU,11796
+cookiecutter-2.6.0.dist-info/LICENSE,sha256=DiLr7v-0gFo_umkyL-_BzC2CYfFHrjvzCRtjcrPnT4M,1493
+cookiecutter-2.6.0.dist-info/METADATA,sha256=zpq7ndfu63e0eojUIQD_C83EGqFZ2XsJmxh23mXCcTE,7324
+cookiecutter-2.6.0.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92
+cookiecutter-2.6.0.dist-info/entry_points.txt,sha256=NzYmXG0J4ML4EmM5POUl9I5PxNN1qlDVgOtkjVR8Fng,60
+cookiecutter-2.6.0.dist-info/top_level.txt,sha256=UE0NGj4iqLNgC-5CAY4V94Tqp9mAD8HqwvZpG9z6cGY,13
+cookiecutter-2.6.0.dist-info/RECORD,,
diff --git a/third_party/python/charset_normalizer/charset_normalizer-3.2.0.dist-info/WHEEL b/third_party/python/cookiecutter/cookiecutter-2.6.0.dist-info/WHEEL
similarity index 65%
rename from third_party/python/charset_normalizer/charset_normalizer-3.2.0.dist-info/WHEEL
rename to third_party/python/cookiecutter/cookiecutter-2.6.0.dist-info/WHEEL
index 1f37c02f2eb2..98c0d20b7a64 100644
--- a/third_party/python/charset_normalizer/charset_normalizer-3.2.0.dist-info/WHEEL
+++ b/third_party/python/cookiecutter/cookiecutter-2.6.0.dist-info/WHEEL
@@ -1,5 +1,5 @@
Wheel-Version: 1.0
-Generator: bdist_wheel (0.40.0)
+Generator: bdist_wheel (0.42.0)
Root-Is-Purelib: true
Tag: py3-none-any
diff --git a/third_party/python/cookiecutter/cookiecutter-2.1.1.dist-info/entry_points.txt b/third_party/python/cookiecutter/cookiecutter-2.6.0.dist-info/entry_points.txt
similarity index 100%
rename from third_party/python/cookiecutter/cookiecutter-2.1.1.dist-info/entry_points.txt
rename to third_party/python/cookiecutter/cookiecutter-2.6.0.dist-info/entry_points.txt
diff --git a/third_party/python/cookiecutter/cookiecutter-2.1.1.dist-info/top_level.txt b/third_party/python/cookiecutter/cookiecutter-2.6.0.dist-info/top_level.txt
similarity index 100%
rename from third_party/python/cookiecutter/cookiecutter-2.1.1.dist-info/top_level.txt
rename to third_party/python/cookiecutter/cookiecutter-2.6.0.dist-info/top_level.txt
diff --git a/third_party/python/cookiecutter/cookiecutter/VERSION.txt b/third_party/python/cookiecutter/cookiecutter/VERSION.txt
new file mode 100644
index 000000000000..e70b4523ae7f
--- /dev/null
+++ b/third_party/python/cookiecutter/cookiecutter/VERSION.txt
@@ -0,0 +1 @@
+2.6.0
diff --git a/third_party/python/cookiecutter/cookiecutter/__init__.py b/third_party/python/cookiecutter/cookiecutter/__init__.py
index f0e3a2c38d8f..62f037dd88e0 100644
--- a/third_party/python/cookiecutter/cookiecutter/__init__.py
+++ b/third_party/python/cookiecutter/cookiecutter/__init__.py
@@ -1,2 +1,13 @@
"""Main package for Cookiecutter."""
-__version__ = "2.1.1"
+
+from pathlib import Path
+
+
+def _get_version() -> str:
+ """Read VERSION.txt and return its contents."""
+ path = Path(__file__).parent.resolve()
+ version_file = path / "VERSION.txt"
+ return version_file.read_text(encoding="utf-8").strip()
+
+
+__version__ = _get_version()
diff --git a/third_party/python/cookiecutter/cookiecutter/__main__.py b/third_party/python/cookiecutter/cookiecutter/__main__.py
index 9ac366172618..7eb04c79cd5a 100644
--- a/third_party/python/cookiecutter/cookiecutter/__main__.py
+++ b/third_party/python/cookiecutter/cookiecutter/__main__.py
@@ -1,6 +1,6 @@
"""Allow cookiecutter to be executable through `python -m cookiecutter`."""
-from cookiecutter.cli import main
+from cookiecutter.cli import main
if __name__ == "__main__": # pragma: no cover
main(prog_name="cookiecutter")
diff --git a/third_party/python/cookiecutter/cookiecutter/cli.py b/third_party/python/cookiecutter/cookiecutter/cli.py
index a792fa5f568f..8b678635aa08 100644
--- a/third_party/python/cookiecutter/cookiecutter/cli.py
+++ b/third_party/python/cookiecutter/cookiecutter/cli.py
@@ -1,4 +1,5 @@
"""Main `cookiecutter` CLI."""
+
import collections
import json
import os
@@ -7,6 +8,7 @@ import sys
import click
from cookiecutter import __version__
+from cookiecutter.config import get_user_config
from cookiecutter.exceptions import (
ContextDecodingException,
FailedHookException,
@@ -20,24 +22,22 @@ from cookiecutter.exceptions import (
)
from cookiecutter.log import configure_logger
from cookiecutter.main import cookiecutter
-from cookiecutter.config import get_user_config
def version_msg():
"""Return the Cookiecutter version, location and Python powering it."""
python_version = sys.version
location = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
- message = 'Cookiecutter %(version)s from {} (Python {})'
- return message.format(location, python_version)
+ return f"Cookiecutter {__version__} from {location} (Python {python_version})"
def validate_extra_context(ctx, param, value):
"""Validate extra context."""
- for s in value:
- if '=' not in s:
+ for string in value:
+ if '=' not in string:
raise click.BadParameter(
- 'EXTRA_CONTEXT should contain items of the form key=value; '
- "'{}' doesn't match that form".format(s)
+ f"EXTRA_CONTEXT should contain items of the form key=value; "
+ f"'{string}' doesn't match that form"
)
# Convert tuple -- e.g.: ('program_name=foobar', 'startsecs=66')
@@ -51,8 +51,8 @@ def list_installed_templates(default_config, passed_config_file):
cookiecutter_folder = config.get('cookiecutters_dir')
if not os.path.exists(cookiecutter_folder):
click.echo(
- 'Error: Cannot list installed templates. Folder does not exist: '
- '{}'.format(cookiecutter_folder)
+ f"Error: Cannot list installed templates. "
+ f"Folder does not exist: {cookiecutter_folder}"
)
sys.exit(-1)
@@ -75,7 +75,9 @@ def list_installed_templates(default_config, passed_config_file):
@click.option(
'--no-input',
is_flag=True,
- help='Do not prompt for parameters and only use cookiecutter.json file content',
+ help='Do not prompt for parameters and only use cookiecutter.json file content. '
+ 'Defaults to deleting any cached resources and redownloading them. '
+ 'Cannot be combined with the --replay flag.',
)
@click.option(
'-c',
@@ -93,7 +95,8 @@ def list_installed_templates(default_config, passed_config_file):
@click.option(
'--replay',
is_flag=True,
- help='Do not prompt for parameters and only use information entered previously',
+ help='Do not prompt for parameters and only use information entered previously. '
+ 'Cannot be combined with the --no-input flag or with extra configuration passed.',
)
@click.option(
'--replay-file',
@@ -144,6 +147,11 @@ def list_installed_templates(default_config, passed_config_file):
@click.option(
'-l', '--list-installed', is_flag=True, help='List currently installed templates.'
)
+@click.option(
+ '--keep-project-on-failure',
+ is_flag=True,
+ help='Do not delete project folder on failure',
+)
def main(
template,
extra_context,
@@ -161,6 +169,7 @@ def main(
accept_hooks,
replay_file,
list_installed,
+ keep_project_on_failure,
):
"""Create a project from a Cookiecutter project template (TEMPLATE).
@@ -205,6 +214,7 @@ def main(
directory=directory,
skip_if_file_exists=skip_if_file_exists,
accept_hooks=_accept_hooks,
+ keep_project_on_failure=keep_project_on_failure,
)
except (
ContextDecodingException,
diff --git a/third_party/python/cookiecutter/cookiecutter/config.py b/third_party/python/cookiecutter/cookiecutter/config.py
index 0d0fa8c7e145..04d59b7c5580 100644
--- a/third_party/python/cookiecutter/cookiecutter/config.py
+++ b/third_party/python/cookiecutter/cookiecutter/config.py
@@ -1,4 +1,5 @@
"""Global configuration handling."""
+
import collections
import copy
import logging
@@ -60,11 +61,15 @@ def get_config(config_path):
logger.debug('config_path is %s', config_path)
with open(config_path, encoding='utf-8') as file_handle:
try:
- yaml_dict = yaml.safe_load(file_handle)
+ yaml_dict = yaml.safe_load(file_handle) or {}
except yaml.YAMLError as e:
raise InvalidConfiguration(
f'Unable to parse YAML file {config_path}.'
) from e
+ if not isinstance(yaml_dict, dict):
+ raise InvalidConfiguration(
+ f'Top-level element of YAML file {config_path} should be an object.'
+ )
config_dict = merge_configs(DEFAULT_CONFIG, yaml_dict)
@@ -83,6 +88,9 @@ def get_user_config(config_file=None, default_config=False):
If ``default_config`` is True, ignore ``config_file`` and return default
values for the config parameters.
+ If ``default_config`` is a dict, merge values with default values and return them
+ for the config parameters.
+
If a path to a ``config_file`` is given, that is different from the default
location, load the user config from that.
@@ -93,6 +101,10 @@ def get_user_config(config_file=None, default_config=False):
If the environment variable is not set, try the default config file path
before falling back to the default config values.
"""
+ # Do NOT load a config. Merge provided values with defaults and return them instead
+ if default_config and isinstance(default_config, dict):
+ return merge_configs(DEFAULT_CONFIG, default_config)
+
# Do NOT load a config. Return defaults instead.
if default_config:
logger.debug("Force ignoring user config with default_config switch.")
diff --git a/third_party/python/cookiecutter/cookiecutter/environment.py b/third_party/python/cookiecutter/cookiecutter/environment.py
index f2804c59508e..235f74be6901 100644
--- a/third_party/python/cookiecutter/cookiecutter/environment.py
+++ b/third_party/python/cookiecutter/cookiecutter/environment.py
@@ -1,4 +1,5 @@
"""Jinja2 environment and extensions loading."""
+
from jinja2 import Environment, StrictUndefined
from cookiecutter.exceptions import UnknownExtension
@@ -26,15 +27,15 @@ class ExtensionLoaderMixin:
'cookiecutter.extensions.JsonifyExtension',
'cookiecutter.extensions.RandomStringExtension',
'cookiecutter.extensions.SlugifyExtension',
+ 'cookiecutter.extensions.TimeExtension',
'cookiecutter.extensions.UUIDExtension',
- 'jinja2_time.TimeExtension',
]
extensions = default_extensions + self._read_extensions(context)
try:
super().__init__(extensions=extensions, **kwargs)
except ImportError as err:
- raise UnknownExtension(f'Unable to load extension: {err}')
+ raise UnknownExtension(f'Unable to load extension: {err}') from err
def _read_extensions(self, context):
"""Return list of extensions as str to be passed on to the Jinja2 env.
diff --git a/third_party/python/cookiecutter/cookiecutter/exceptions.py b/third_party/python/cookiecutter/cookiecutter/exceptions.py
index 4acf6dc47c0a..622e7c6ef845 100644
--- a/third_party/python/cookiecutter/cookiecutter/exceptions.py
+++ b/third_party/python/cookiecutter/cookiecutter/exceptions.py
@@ -132,7 +132,7 @@ class UndefinedVariableInTemplate(CookiecutterException):
class UnknownExtension(CookiecutterException):
"""
- Exception for un-importable extention.
+ Exception for un-importable extension.
Raised when an environment is unable to import a required extension.
"""
diff --git a/third_party/python/cookiecutter/cookiecutter/extensions.py b/third_party/python/cookiecutter/cookiecutter/extensions.py
index 6a3161abab80..666497c9754d 100644
--- a/third_party/python/cookiecutter/cookiecutter/extensions.py
+++ b/third_party/python/cookiecutter/cookiecutter/extensions.py
@@ -1,9 +1,12 @@
"""Jinja2 extensions."""
+
import json
import string
import uuid
from secrets import choice
+import arrow
+from jinja2 import nodes
from jinja2.ext import Extension
from slugify import slugify as pyslugify
@@ -64,3 +67,65 @@ class UUIDExtension(Extension):
return str(uuid.uuid4())
environment.globals.update(uuid4=uuid4)
+
+
+class TimeExtension(Extension):
+ """Jinja2 Extension for dates and times."""
+
+ tags = {'now'}
+
+ def __init__(self, environment):
+ """Jinja2 Extension constructor."""
+ super().__init__(environment)
+
+ environment.extend(datetime_format='%Y-%m-%d')
+
+ def _datetime(self, timezone, operator, offset, datetime_format):
+ d = arrow.now(timezone)
+
+ # parse shift params from offset and include operator
+ shift_params = {}
+ for param in offset.split(','):
+ interval, value = param.split('=')
+ shift_params[interval.strip()] = float(operator + value.strip())
+ d = d.shift(**shift_params)
+
+ if datetime_format is None:
+ datetime_format = self.environment.datetime_format
+ return d.strftime(datetime_format)
+
+ def _now(self, timezone, datetime_format):
+ if datetime_format is None:
+ datetime_format = self.environment.datetime_format
+ return arrow.now(timezone).strftime(datetime_format)
+
+ def parse(self, parser):
+ """Parse datetime template and add datetime value."""
+ lineno = next(parser.stream).lineno
+
+ node = parser.parse_expression()
+
+ if parser.stream.skip_if('comma'):
+ datetime_format = parser.parse_expression()
+ else:
+ datetime_format = nodes.Const(None)
+
+ if isinstance(node, nodes.Add):
+ call_method = self.call_method(
+ '_datetime',
+ [node.left, nodes.Const('+'), node.right, datetime_format],
+ lineno=lineno,
+ )
+ elif isinstance(node, nodes.Sub):
+ call_method = self.call_method(
+ '_datetime',
+ [node.left, nodes.Const('-'), node.right, datetime_format],
+ lineno=lineno,
+ )
+ else:
+ call_method = self.call_method(
+ '_now',
+ [node, datetime_format],
+ lineno=lineno,
+ )
+ return nodes.Output([call_method], lineno=lineno)
diff --git a/third_party/python/cookiecutter/cookiecutter/find.py b/third_party/python/cookiecutter/cookiecutter/find.py
index 054e286f4aad..486735f0ff2e 100644
--- a/third_party/python/cookiecutter/cookiecutter/find.py
+++ b/third_party/python/cookiecutter/cookiecutter/find.py
@@ -1,31 +1,34 @@
"""Functions for finding Cookiecutter templates and other components."""
+
import logging
import os
+from pathlib import Path
+
+from jinja2 import Environment
from cookiecutter.exceptions import NonTemplatedInputDirException
logger = logging.getLogger(__name__)
-def find_template(repo_dir):
- """Determine which child directory of `repo_dir` is the project template.
+def find_template(repo_dir: "os.PathLike[str]", env: Environment) -> Path:
+ """Determine which child directory of ``repo_dir`` is the project template.
:param repo_dir: Local directory of newly cloned repo.
- :returns project_template: Relative path to project template.
+ :return: Relative path to project template.
"""
logger.debug('Searching %s for the project template.', repo_dir)
- repo_dir_contents = os.listdir(repo_dir)
-
- project_template = None
- for item in repo_dir_contents:
- if 'cookiecutter' in item and '{{' in item and '}}' in item:
- project_template = item
+ for str_path in os.listdir(repo_dir):
+ if (
+ 'cookiecutter' in str_path
+ and env.variable_start_string in str_path
+ and env.variable_end_string in str_path
+ ):
+ project_template = Path(repo_dir, str_path)
break
-
- if project_template:
- project_template = os.path.join(repo_dir, project_template)
- logger.debug('The project template appears to be %s', project_template)
- return project_template
else:
raise NonTemplatedInputDirException
+
+ logger.debug('The project template appears to be %s', project_template)
+ return project_template
diff --git a/third_party/python/cookiecutter/cookiecutter/generate.py b/third_party/python/cookiecutter/cookiecutter/generate.py
index 7bdce5a8bbef..eb3b200bfb43 100644
--- a/third_party/python/cookiecutter/cookiecutter/generate.py
+++ b/third_party/python/cookiecutter/cookiecutter/generate.py
@@ -1,4 +1,5 @@
"""Functions for generating a project from a project template."""
+
import fnmatch
import json
import logging
@@ -6,22 +7,25 @@ import os
import shutil
import warnings
from collections import OrderedDict
+from pathlib import Path
from binaryornot.check import is_binary
-from jinja2 import FileSystemLoader
+from jinja2 import Environment, FileSystemLoader
from jinja2.exceptions import TemplateSyntaxError, UndefinedError
-from cookiecutter.environment import StrictEnvironment
from cookiecutter.exceptions import (
ContextDecodingException,
- FailedHookException,
- NonTemplatedInputDirException,
OutputDirExistsException,
UndefinedVariableInTemplate,
)
from cookiecutter.find import find_template
-from cookiecutter.hooks import run_hook
-from cookiecutter.utils import make_sure_path_exists, rmtree, work_in
+from cookiecutter.hooks import run_hook_from_repo_dir
+from cookiecutter.utils import (
+ create_env_with_context,
+ make_sure_path_exists,
+ rmtree,
+ work_in,
+)
logger = logging.getLogger(__name__)
@@ -46,28 +50,52 @@ def is_copy_only_path(path, context):
return False
-def apply_overwrites_to_context(context, overwrite_context):
+def apply_overwrites_to_context(
+ context, overwrite_context, *, in_dictionary_variable=False
+):
"""Modify the given context in place based on the overwrite_context."""
for variable, overwrite in overwrite_context.items():
if variable not in context:
- # Do not include variables which are not used in the template
- continue
+ if not in_dictionary_variable:
+ # We are dealing with a new variable on first level, ignore
+ continue
+ # We are dealing with a new dictionary variable in a deeper level
+ context[variable] = overwrite
context_value = context[variable]
-
if isinstance(context_value, list):
- # We are dealing with a choice variable
- if overwrite in context_value:
- # This overwrite is actually valid for the given context
- # Let's set it as default (by definition first item in list)
- # see ``cookiecutter.prompt.prompt_choice_for_config``
- context_value.remove(overwrite)
- context_value.insert(0, overwrite)
+ if in_dictionary_variable:
+ context[variable] = overwrite
+ continue
+ if isinstance(overwrite, list):
+ # We are dealing with a multichoice variable
+ # Let's confirm all choices are valid for the given context
+ if set(overwrite).issubset(set(context_value)):
+ context[variable] = overwrite
+ else:
+ raise ValueError(
+ f"{overwrite} provided for multi-choice variable "
+ f"{variable}, but valid choices are {context_value}"
+ )
else:
- raise ValueError(
- "{} provided for choice variable {}, but the "
- "choices are {}.".format(overwrite, variable, context_value)
- )
+ # We are dealing with a choice variable
+ if overwrite in context_value:
+ # This overwrite is actually valid for the given context
+ # Let's set it as default (by definition first item in list)
+ # see ``cookiecutter.prompt.prompt_choice_for_config``
+ context_value.remove(overwrite)
+ context_value.insert(0, overwrite)
+ else:
+ raise ValueError(
+ f"{overwrite} provided for choice variable "
+ f"{variable}, but the choices are {context_value}."
+ )
+ elif isinstance(context_value, dict) and isinstance(overwrite, dict):
+ # Partially overwrite some keys in original dict
+ apply_overwrites_to_context(
+ context_value, overwrite, in_dictionary_variable=True
+ )
+ context[variable] = context_value
else:
# Simply overwrite the value for this variable
context[variable] = overwrite
@@ -96,10 +124,10 @@ def generate_context(
full_fpath = os.path.abspath(context_file)
json_exc_message = str(e)
our_exc_message = (
- 'JSON decoding error while loading "{}". Decoding'
- ' error details: "{}"'.format(full_fpath, json_exc_message)
+ f"JSON decoding error while loading '{full_fpath}'. "
+ f"Decoding error details: '{json_exc_message}'"
)
- raise ContextDecodingException(our_exc_message)
+ raise ContextDecodingException(our_exc_message) from e
# Add the Python object to the context dictionary
file_name = os.path.split(context_file)[1]
@@ -111,8 +139,8 @@ def generate_context(
if default_context:
try:
apply_overwrites_to_context(obj, default_context)
- except ValueError as ex:
- warnings.warn("Invalid default received: " + str(ex))
+ except ValueError as error:
+ warnings.warn(f"Invalid default received: {error}")
if extra_context:
apply_overwrites_to_context(obj, extra_context)
@@ -163,55 +191,63 @@ def generate_file(project_dir, infile, context, env, skip_if_file_exists=False):
if is_binary(infile):
logger.debug('Copying binary %s to %s without rendering', infile, outfile)
shutil.copyfile(infile, outfile)
+ shutil.copymode(infile, outfile)
+ return
+
+ # Force fwd slashes on Windows for get_template
+ # This is a by-design Jinja issue
+ infile_fwd_slashes = infile.replace(os.path.sep, '/')
+
+ # Render the file
+ try:
+ tmpl = env.get_template(infile_fwd_slashes)
+ except TemplateSyntaxError as exception:
+ # Disable translated so that printed exception contains verbose
+ # information about syntax error location
+ exception.translated = False
+ raise
+ rendered_file = tmpl.render(**context)
+
+ if context['cookiecutter'].get('_new_lines', False):
+ # Use `_new_lines` from context, if configured.
+ newline = context['cookiecutter']['_new_lines']
+ logger.debug('Using configured newline character %s', repr(newline))
else:
- # Force fwd slashes on Windows for get_template
- # This is a by-design Jinja issue
- infile_fwd_slashes = infile.replace(os.path.sep, '/')
+ # Detect original file newline to output the rendered file.
+ # Note that newlines can be a tuple if file contains mixed line endings.
+ # In this case, we pick the first line ending we detected.
+ with open(infile, encoding='utf-8') as rd:
+ rd.readline() # Read only the first line to load a 'newlines' value.
+ newline = rd.newlines[0] if isinstance(rd.newlines, tuple) else rd.newlines
+ logger.debug('Using detected newline character %s', repr(newline))
- # Render the file
- try:
- tmpl = env.get_template(infile_fwd_slashes)
- except TemplateSyntaxError as exception:
- # Disable translated so that printed exception contains verbose
- # information about syntax error location
- exception.translated = False
- raise
- rendered_file = tmpl.render(**context)
+ logger.debug('Writing contents to file %s', outfile)
- # Detect original file newline to output the rendered file
- # note: newline='' ensures newlines are not converted
- with open(infile, encoding='utf-8', newline='') as rd:
- rd.readline() # Read the first line to load 'newlines' value
-
- # Use `_new_lines` overwrite from context, if configured.
- newline = rd.newlines
- if context['cookiecutter'].get('_new_lines', False):
- newline = context['cookiecutter']['_new_lines']
- logger.debug('Overwriting end line character with %s', newline)
-
- logger.debug('Writing contents to file %s', outfile)
-
- with open(outfile, 'w', encoding='utf-8', newline=newline) as fh:
- fh.write(rendered_file)
+ with open(outfile, 'w', encoding='utf-8', newline=newline) as fh:
+ fh.write(rendered_file)
# Apply file permissions to output file
shutil.copymode(infile, outfile)
def render_and_create_dir(
- dirname, context, output_dir, environment, overwrite_if_exists=False
+ dirname: str,
+ context: dict,
+ output_dir: "os.PathLike[str]",
+ environment: Environment,
+ overwrite_if_exists: bool = False,
):
"""Render name of a directory, create the directory, return its path."""
name_tmpl = environment.from_string(dirname)
rendered_dirname = name_tmpl.render(**context)
- dir_to_create = os.path.normpath(os.path.join(output_dir, rendered_dirname))
+ dir_to_create = Path(output_dir, rendered_dirname)
logger.debug(
'Rendered dir %s must exist in output_dir %s', dir_to_create, output_dir
)
- output_dir_exists = os.path.exists(dir_to_create)
+ output_dir_exists = dir_to_create.exists()
if output_dir_exists:
if overwrite_if_exists:
@@ -227,14 +263,6 @@ def render_and_create_dir(
return dir_to_create, not output_dir_exists
-def ensure_dir_is_templated(dirname):
- """Ensure that dirname is a templated directory name."""
- if '{{' in dirname and '}}' in dirname:
- return True
- else:
- raise NonTemplatedInputDirException
-
-
def _run_hook_from_repo_dir(
repo_dir, hook_name, project_dir, context, delete_project_on_failure
):
@@ -247,18 +275,15 @@ def _run_hook_from_repo_dir(
:param delete_project_on_failure: Delete the project directory on hook
failure?
"""
- with work_in(repo_dir):
- try:
- run_hook(hook_name, project_dir, context)
- except FailedHookException:
- if delete_project_on_failure:
- rmtree(project_dir)
- logger.error(
- "Stopping generation because %s hook "
- "script didn't exit successfully",
- hook_name,
- )
- raise
+ warnings.warn(
+ "The '_run_hook_from_repo_dir' function is deprecated, "
+ "use 'cookiecutter.hooks.run_hook_from_repo_dir' instead",
+ DeprecationWarning,
+ 2,
+ )
+ run_hook_from_repo_dir(
+ repo_dir, hook_name, project_dir, context, delete_project_on_failure
+ )
def generate_files(
@@ -268,6 +293,7 @@ def generate_files(
overwrite_if_exists=False,
skip_if_file_exists=False,
accept_hooks=True,
+ keep_project_on_failure=False,
):
"""Render the templates and saves them to files.
@@ -276,24 +302,27 @@ def generate_files(
:param output_dir: Where to output the generated project dir into.
:param overwrite_if_exists: Overwrite the contents of the output directory
if it exists.
+ :param skip_if_file_exists: Skip the files in the corresponding directories
+ if they already exist
:param accept_hooks: Accept pre and post hooks if set to `True`.
+ :param keep_project_on_failure: If `True` keep generated project directory even when
+ generation fails
"""
- template_dir = find_template(repo_dir)
- logger.debug('Generating project from %s...', template_dir)
context = context or OrderedDict([])
- envvars = context.get('cookiecutter', {}).get('_jinja2_env_vars', {})
+ env = create_env_with_context(context)
+
+ template_dir = find_template(repo_dir, env)
+ logger.debug('Generating project from %s...', template_dir)
unrendered_dir = os.path.split(template_dir)[1]
- ensure_dir_is_templated(unrendered_dir)
- env = StrictEnvironment(context=context, keep_trailing_newline=True, **envvars)
try:
project_dir, output_directory_created = render_and_create_dir(
unrendered_dir, context, output_dir, env, overwrite_if_exists
)
except UndefinedError as err:
msg = f"Unable to create project directory '{unrendered_dir}'"
- raise UndefinedVariableInTemplate(msg, err, context)
+ raise UndefinedVariableInTemplate(msg, err, context) from err
# We want the Jinja path and the OS paths to match. Consequently, we'll:
# + CD to the template folder
@@ -307,15 +336,15 @@ def generate_files(
# if we created the output directory, then it's ok to remove it
# if rendering fails
- delete_project_on_failure = output_directory_created
+ delete_project_on_failure = output_directory_created and not keep_project_on_failure
if accept_hooks:
- _run_hook_from_repo_dir(
+ run_hook_from_repo_dir(
repo_dir, 'pre_gen_project', project_dir, context, delete_project_on_failure
)
with work_in(template_dir):
- env.loader = FileSystemLoader('.')
+ env.loader = FileSystemLoader(['.', '../templates'])
for root, dirs, files in os.walk('.'):
# We must separate the two types of dirs into different lists.
@@ -330,6 +359,7 @@ def generate_files(
# specified in the ``_copy_without_render`` setting, but
# we store just the dir name
if is_copy_only_path(d_, context):
+ logger.debug('Found copy only path %s', d)
copy_dirs.append(d)
else:
render_dirs.append(d)
@@ -339,6 +369,12 @@ def generate_files(
outdir = os.path.normpath(os.path.join(project_dir, indir))
outdir = env.from_string(outdir).render(**context)
logger.debug('Copying dir %s to %s without rendering', indir, outdir)
+
+ # The outdir is not the root dir, it is the dir which marked as copy
+ # only in the config file. If the program hits this line, which means
+ # the overwrite_if_exists = True, and root dir exists
+ if os.path.isdir(outdir):
+ shutil.rmtree(outdir)
shutil.copytree(indir, outdir)
# We mutate ``dirs``, because we only want to go through these dirs
@@ -355,7 +391,7 @@ def generate_files(
rmtree(project_dir)
_dir = os.path.relpath(unrendered_dir, output_dir)
msg = f"Unable to create directory '{_dir}'"
- raise UndefinedVariableInTemplate(msg, err, context)
+ raise UndefinedVariableInTemplate(msg, err, context) from err
for f in files:
infile = os.path.normpath(os.path.join(root, f))
@@ -377,10 +413,10 @@ def generate_files(
if delete_project_on_failure:
rmtree(project_dir)
msg = f"Unable to create file '{infile}'"
- raise UndefinedVariableInTemplate(msg, err, context)
+ raise UndefinedVariableInTemplate(msg, err, context) from err
if accept_hooks:
- _run_hook_from_repo_dir(
+ run_hook_from_repo_dir(
repo_dir,
'post_gen_project',
project_dir,
diff --git a/third_party/python/cookiecutter/cookiecutter/hooks.py b/third_party/python/cookiecutter/cookiecutter/hooks.py
index 763287c584ad..16b0647d2c20 100644
--- a/third_party/python/cookiecutter/cookiecutter/hooks.py
+++ b/third_party/python/cookiecutter/cookiecutter/hooks.py
@@ -1,18 +1,28 @@
"""Functions for discovering and executing various cookiecutter hooks."""
+
import errno
import logging
import os
import subprocess # nosec
import sys
import tempfile
+from pathlib import Path
+
+from jinja2.exceptions import UndefinedError
from cookiecutter import utils
-from cookiecutter.environment import StrictEnvironment
from cookiecutter.exceptions import FailedHookException
+from cookiecutter.utils import (
+ create_env_with_context,
+ create_tmp_repo_dir,
+ rmtree,
+ work_in,
+)
logger = logging.getLogger(__name__)
_HOOKS = [
+ 'pre_prompt',
'pre_gen_project',
'post_gen_project',
]
@@ -28,7 +38,6 @@ def valid_hook(hook_file, hook_name):
"""
filename = os.path.basename(hook_file)
basename = os.path.splitext(filename)[0]
-
matching_hook = basename == hook_name
supported_hook = basename in _HOOKS
backup_file = filename.endswith('~')
@@ -85,12 +94,12 @@ def run_script(script_path, cwd='.'):
raise FailedHookException(
f'Hook script failed (exit status: {exit_status})'
)
- except OSError as os_error:
- if os_error.errno == errno.ENOEXEC:
+ except OSError as err:
+ if err.errno == errno.ENOEXEC:
raise FailedHookException(
'Hook script failed, might be an empty file or missing a shebang'
- )
- raise FailedHookException(f'Hook script failed (error: {os_error})')
+ ) from err
+ raise FailedHookException(f'Hook script failed (error: {err})') from err
def run_script_with_context(script_path, cwd, context):
@@ -106,7 +115,7 @@ def run_script_with_context(script_path, cwd, context):
contents = file.read()
with tempfile.NamedTemporaryFile(delete=False, mode='wb', suffix=extension) as temp:
- env = StrictEnvironment(context=context, keep_trailing_newline=True)
+ env = create_env_with_context(context)
template = env.from_string(contents)
output = template.render(**context)
temp.write(output.encode('utf-8'))
@@ -129,3 +138,55 @@ def run_hook(hook_name, project_dir, context):
logger.debug('Running hook %s', hook_name)
for script in scripts:
run_script_with_context(script, project_dir, context)
+
+
+def run_hook_from_repo_dir(
+ repo_dir, hook_name, project_dir, context, delete_project_on_failure
+):
+ """Run hook from repo directory, clean project directory if hook fails.
+
+ :param repo_dir: Project template input directory.
+ :param hook_name: The hook to execute.
+ :param project_dir: The directory to execute the script from.
+ :param context: Cookiecutter project context.
+ :param delete_project_on_failure: Delete the project directory on hook
+ failure?
+ """
+ with work_in(repo_dir):
+ try:
+ run_hook(hook_name, project_dir, context)
+ except (
+ FailedHookException,
+ UndefinedError,
+ ):
+ if delete_project_on_failure:
+ rmtree(project_dir)
+ logger.error(
+ "Stopping generation because %s hook "
+ "script didn't exit successfully",
+ hook_name,
+ )
+ raise
+
+
+def run_pre_prompt_hook(repo_dir: "os.PathLike[str]") -> Path:
+ """Run pre_prompt hook from repo directory.
+
+ :param repo_dir: Project template input directory.
+ """
+ # Check if we have a valid pre_prompt script
+ with work_in(repo_dir):
+ scripts = find_hook('pre_prompt')
+ if not scripts:
+ return repo_dir
+
+ # Create a temporary directory
+ repo_dir = create_tmp_repo_dir(repo_dir)
+ with work_in(repo_dir):
+ scripts = find_hook('pre_prompt')
+ for script in scripts:
+ try:
+ run_script(script, repo_dir)
+ except FailedHookException:
+ raise FailedHookException('Pre-Prompt Hook script failed')
+ return repo_dir
diff --git a/third_party/python/cookiecutter/cookiecutter/log.py b/third_party/python/cookiecutter/cookiecutter/log.py
index d7633c5715ae..c2ac283eaa0f 100644
--- a/third_party/python/cookiecutter/cookiecutter/log.py
+++ b/third_party/python/cookiecutter/cookiecutter/log.py
@@ -1,4 +1,5 @@
"""Module for setting up logging."""
+
import logging
import sys
diff --git a/third_party/python/cookiecutter/cookiecutter/main.py b/third_party/python/cookiecutter/cookiecutter/main.py
index bc2f262dfba2..2146c1b73b31 100644
--- a/third_party/python/cookiecutter/cookiecutter/main.py
+++ b/third_party/python/cookiecutter/cookiecutter/main.py
@@ -4,15 +4,18 @@ Main entry point for the `cookiecutter` command.
The code in this module is also a good example of how to use Cookiecutter as a
library rather than a script.
"""
-from copy import copy
+
import logging
import os
import sys
+from copy import copy
+from pathlib import Path
from cookiecutter.config import get_user_config
from cookiecutter.exceptions import InvalidModeException
from cookiecutter.generate import generate_context, generate_files
-from cookiecutter.prompt import prompt_for_config
+from cookiecutter.hooks import run_pre_prompt_hook
+from cookiecutter.prompt import choose_nested_template, prompt_for_config
from cookiecutter.replay import dump, load
from cookiecutter.repository import determine_repo_dir
from cookiecutter.utils import rmtree
@@ -34,6 +37,7 @@ def cookiecutter(
directory=None,
skip_if_file_exists=False,
accept_hooks=True,
+ keep_project_on_failure=False,
):
"""
Run Cookiecutter just as if using it from the command line.
@@ -41,18 +45,26 @@ def cookiecutter(
:param template: A directory containing a project template directory,
or a URL to a git repository.
:param checkout: The branch, tag or commit ID to checkout after clone.
- :param no_input: Prompt the user at command line for manual configuration?
+ :param no_input: Do not prompt for user input.
+ Use default values for template parameters taken from `cookiecutter.json`, user
+ config and `extra_dict`. Force a refresh of cached resources.
:param extra_context: A dictionary of context that overrides default
and user configuration.
:param replay: Do not prompt for input, instead read from saved json. If
``True`` read from the ``replay_dir``.
if it exists
+ :param overwrite_if_exists: Overwrite the contents of the output directory
+ if it exists.
:param output_dir: Where to output the generated project dir into.
:param config_file: User configuration file path.
:param default_config: Use default values rather than a config file.
:param password: The password to use when extracting the repository.
:param directory: Relative path to a cookiecutter template in a repository.
+ :param skip_if_file_exists: Skip the files in the corresponding directories
+ if they already exist.
:param accept_hooks: Accept pre and post hooks if set to `True`.
+ :param keep_project_on_failure: If `True` keep generated project directory even when
+ generation fails
"""
if replay and ((no_input is not False) or (extra_context is not None)):
err_msg = (
@@ -65,8 +77,7 @@ def cookiecutter(
config_file=config_file,
default_config=default_config,
)
-
- repo_dir, cleanup = determine_repo_dir(
+ base_repo_dir, cleanup_base_repo_dir = determine_repo_dir(
template=template,
abbreviations=config_dict['abbreviations'],
clone_to_dir=config_dict['cookiecutters_dir'],
@@ -75,39 +86,96 @@ def cookiecutter(
password=password,
directory=directory,
)
+ repo_dir, cleanup = base_repo_dir, cleanup_base_repo_dir
+ # Run pre_prompt hook
+ repo_dir = run_pre_prompt_hook(base_repo_dir) if accept_hooks else repo_dir
+ # Always remove temporary dir if it was created
+ cleanup = True if repo_dir != base_repo_dir else False
+
import_patch = _patch_import_path_for_repo(repo_dir)
-
template_name = os.path.basename(os.path.abspath(repo_dir))
-
if replay:
with import_patch:
if isinstance(replay, bool):
- context = load(config_dict['replay_dir'], template_name)
+ context_from_replayfile = load(config_dict['replay_dir'], template_name)
else:
path, template_name = os.path.split(os.path.splitext(replay)[0])
- context = load(path, template_name)
- else:
- context_file = os.path.join(repo_dir, 'cookiecutter.json')
- logger.debug('context_file is %s', context_file)
+ context_from_replayfile = load(path, template_name)
+ context_file = os.path.join(repo_dir, 'cookiecutter.json')
+ logger.debug('context_file is %s', context_file)
+
+ if replay:
+ context = generate_context(
+ context_file=context_file,
+ default_context=config_dict['default_context'],
+ extra_context=None,
+ )
+ logger.debug('replayfile context: %s', context_from_replayfile)
+ items_for_prompting = {
+ k: v
+ for k, v in context['cookiecutter'].items()
+ if k not in context_from_replayfile['cookiecutter'].keys()
+ }
+ context_for_prompting = {}
+ context_for_prompting['cookiecutter'] = items_for_prompting
+ context = context_from_replayfile
+ logger.debug('prompting context: %s', context_for_prompting)
+ else:
context = generate_context(
context_file=context_file,
default_context=config_dict['default_context'],
extra_context=extra_context,
)
+ context_for_prompting = context
+ # preserve the original cookiecutter options
+ # print(context['cookiecutter'])
+ context['_cookiecutter'] = {
+ k: v for k, v in context['cookiecutter'].items() if not k.startswith("_")
+ }
- # prompt the user to manually configure at the command line.
- # except when 'no-input' flag is set
- with import_patch:
- context['cookiecutter'] = prompt_for_config(context, no_input)
+ # prompt the user to manually configure at the command line.
+ # except when 'no-input' flag is set
- # include template dir or url in the context dict
- context['cookiecutter']['_template'] = template
+ with import_patch:
+ if {"template", "templates"} & set(context["cookiecutter"].keys()):
+ nested_template = choose_nested_template(context, repo_dir, no_input)
+ return cookiecutter(
+ template=nested_template,
+ checkout=checkout,
+ no_input=no_input,
+ extra_context=extra_context,
+ replay=replay,
+ overwrite_if_exists=overwrite_if_exists,
+ output_dir=output_dir,
+ config_file=config_file,
+ default_config=default_config,
+ password=password,
+ directory=directory,
+ skip_if_file_exists=skip_if_file_exists,
+ accept_hooks=accept_hooks,
+ keep_project_on_failure=keep_project_on_failure,
+ )
+ if context_for_prompting['cookiecutter']:
+ context['cookiecutter'].update(
+ prompt_for_config(context_for_prompting, no_input)
+ )
- # include output+dir in the context dict
- context['cookiecutter']['_output_dir'] = os.path.abspath(output_dir)
+ logger.debug('context is %s', context)
- dump(config_dict['replay_dir'], template_name, context)
+ # include template dir or url in the context dict
+ context['cookiecutter']['_template'] = template
+
+ # include output+dir in the context dict
+ context['cookiecutter']['_output_dir'] = os.path.abspath(output_dir)
+
+ # include repo dir or url in the context dict
+ context['cookiecutter']['_repo_dir'] = f"{repo_dir}"
+
+ # include checkout details in the context dict
+ context['cookiecutter']['_checkout'] = checkout
+
+ dump(config_dict['replay_dir'], template_name, context)
# Create project from local context and project template.
with import_patch:
@@ -118,18 +186,20 @@ def cookiecutter(
skip_if_file_exists=skip_if_file_exists,
output_dir=output_dir,
accept_hooks=accept_hooks,
+ keep_project_on_failure=keep_project_on_failure,
)
# Cleanup (if required)
if cleanup:
rmtree(repo_dir)
-
+ if cleanup_base_repo_dir:
+ rmtree(base_repo_dir)
return result
class _patch_import_path_for_repo:
- def __init__(self, repo_dir):
- self._repo_dir = repo_dir
+ def __init__(self, repo_dir: "os.PathLike[str]"):
+ self._repo_dir = f"{repo_dir}" if isinstance(repo_dir, Path) else repo_dir
self._path = None
def __enter__(self):
diff --git a/third_party/python/cookiecutter/cookiecutter/prompt.py b/third_party/python/cookiecutter/cookiecutter/prompt.py
index f06cdc3c0b40..761ac99447b9 100644
--- a/third_party/python/cookiecutter/cookiecutter/prompt.py
+++ b/third_party/python/cookiecutter/cookiecutter/prompt.py
@@ -1,36 +1,76 @@
"""Functions for prompting the user for project info."""
-import functools
+
import json
+import os
+import re
+import sys
from collections import OrderedDict
+from pathlib import Path
-import click
from jinja2.exceptions import UndefinedError
+from rich.prompt import Confirm, InvalidResponse, Prompt, PromptBase
-from cookiecutter.environment import StrictEnvironment
from cookiecutter.exceptions import UndefinedVariableInTemplate
+from cookiecutter.utils import create_env_with_context, rmtree
-def read_user_variable(var_name, default_value):
+def read_user_variable(var_name, default_value, prompts=None, prefix=""):
"""Prompt user for variable and return the entered value or given default.
:param str var_name: Variable of the context to query the user
:param default_value: Value that will be returned if no input happens
"""
- # Please see https://click.palletsprojects.com/en/7.x/api/#click.prompt
- return click.prompt(var_name, default=default_value)
+ question = (
+ prompts[var_name]
+ if prompts and var_name in prompts.keys() and prompts[var_name]
+ else var_name
+ )
+
+ while True:
+ variable = Prompt.ask(f"{prefix}{question}", default=default_value)
+ if variable is not None:
+ break
+
+ return variable
-def read_user_yes_no(question, default_value):
+class YesNoPrompt(Confirm):
+ """A prompt that returns a boolean for yes/no questions."""
+
+ yes_choices = ["1", "true", "t", "yes", "y", "on"]
+ no_choices = ["0", "false", "f", "no", "n", "off"]
+
+ def process_response(self, value: str) -> bool:
+ """Convert choices to a bool."""
+ value = value.strip().lower()
+ if value in self.yes_choices:
+ return True
+ elif value in self.no_choices:
+ return False
+ else:
+ raise InvalidResponse(self.validate_error_message)
+
+
+def read_user_yes_no(var_name, default_value, prompts=None, prefix=""):
"""Prompt the user to reply with 'yes' or 'no' (or equivalent values).
- Note:
- Possible choices are 'true', '1', 'yes', 'y' or 'false', '0', 'no', 'n'
+ - These input values will be converted to ``True``:
+ "1", "true", "t", "yes", "y", "on"
+ - These input values will be converted to ``False``:
+ "0", "false", "f", "no", "n", "off"
+
+ Actual parsing done by :func:`prompt`; Check this function codebase change in
+ case of unexpected behaviour.
:param str question: Question to the user
:param default_value: Value that will be returned if no input happens
"""
- # Please see https://click.palletsprojects.com/en/7.x/api/#click.prompt
- return click.prompt(question, default=default_value, type=click.BOOL)
+ question = (
+ prompts[var_name]
+ if prompts and var_name in prompts.keys() and prompts[var_name]
+ else var_name
+ )
+ return YesNoPrompt.ask(f"{prefix}{question}", default=default_value)
def read_repo_password(question):
@@ -38,11 +78,10 @@ def read_repo_password(question):
:param str question: Question to the user
"""
- # Please see https://click.palletsprojects.com/en/7.x/api/#click.prompt
- return click.prompt(question, hide_input=True)
+ return Prompt.ask(question, password=True)
-def read_user_choice(var_name, options):
+def read_user_choice(var_name, options, prompts=None, prefix=""):
"""Prompt the user to choose from several options for the given variable.
The first item will be returned if no input happens.
@@ -51,7 +90,6 @@ def read_user_choice(var_name, options):
:param list options: Sequence of options that are available to select from
:return: Exactly one item of ``options`` that has been chosen by the user
"""
- # Please see https://click.palletsprojects.com/en/7.x/api/#click.prompt
if not isinstance(options, list):
raise TypeError
@@ -60,20 +98,37 @@ def read_user_choice(var_name, options):
choice_map = OrderedDict((f'{i}', value) for i, value in enumerate(options, 1))
choices = choice_map.keys()
- default = '1'
- choice_lines = ['{} - {}'.format(*c) for c in choice_map.items()]
+ question = f"Select {var_name}"
+ choice_lines = [
+ ' [bold magenta]{}[/] - [bold]{}[/]'.format(*c) for c in choice_map.items()
+ ]
+
+ # Handle if human-readable prompt is provided
+ if prompts and var_name in prompts.keys():
+ if isinstance(prompts[var_name], str):
+ question = prompts[var_name]
+ else:
+ if "__prompt__" in prompts[var_name]:
+ question = prompts[var_name]["__prompt__"]
+ choice_lines = [
+ (
+ f" [bold magenta]{i}[/] - [bold]{prompts[var_name][p]}[/]"
+ if p in prompts[var_name]
+ else f" [bold magenta]{i}[/] - [bold]{p}[/]"
+ )
+ for i, p in choice_map.items()
+ ]
+
prompt = '\n'.join(
(
- f'Select {var_name}:',
- '\n'.join(choice_lines),
- 'Choose from {}'.format(', '.join(choices)),
+ f"{prefix}{question}",
+ "\n".join(choice_lines),
+ " Choose from",
)
)
- user_choice = click.prompt(
- prompt, type=click.Choice(choices), default=default, show_choices=False
- )
+ user_choice = Prompt.ask(prompt, choices=list(choices), default=list(choices)[0])
return choice_map[user_choice]
@@ -85,44 +140,51 @@ def process_json(user_value, default_value=None):
:param str user_value: User-supplied value to load as a JSON dict
"""
- if user_value == DEFAULT_DISPLAY:
- # Return the given default w/o any processing
- return default_value
-
try:
user_dict = json.loads(user_value, object_pairs_hook=OrderedDict)
- except Exception:
+ except Exception as error:
# Leave it up to click to ask the user again
- raise click.UsageError('Unable to decode to JSON.')
+ raise InvalidResponse('Unable to decode to JSON.') from error
if not isinstance(user_dict, dict):
# Leave it up to click to ask the user again
- raise click.UsageError('Requires JSON dict.')
+ raise InvalidResponse('Requires JSON dict.')
return user_dict
-def read_user_dict(var_name, default_value):
+class JsonPrompt(PromptBase[dict]):
+ """A prompt that returns a dict from JSON string."""
+
+ default = None
+ response_type = dict
+ validate_error_message = "[prompt.invalid] Please enter a valid JSON string"
+
+ def process_response(self, value: str) -> dict:
+ """Convert choices to a dict."""
+ return process_json(value, self.default)
+
+
+def read_user_dict(var_name, default_value, prompts=None, prefix=""):
"""Prompt the user to provide a dictionary of data.
:param str var_name: Variable as specified in the context
:param default_value: Value that will be returned if no input is provided
:return: A Python dictionary to use in the context.
"""
- # Please see https://click.palletsprojects.com/en/7.x/api/#click.prompt
if not isinstance(default_value, dict):
raise TypeError
- user_value = click.prompt(
- var_name,
- default=DEFAULT_DISPLAY,
- type=click.STRING,
- value_proc=functools.partial(process_json, default_value=default_value),
+ question = (
+ prompts[var_name]
+ if prompts and var_name in prompts.keys() and prompts[var_name]
+ else var_name
+ )
+ user_value = JsonPrompt.ask(
+ f"{prefix}{question} [cyan bold]({DEFAULT_DISPLAY})[/]",
+ default=default_value,
+ show_default=False,
)
-
- if click.__version__.startswith("7.") and user_value == DEFAULT_DISPLAY:
- # click 7.x does not invoke value_proc on the default value.
- return default_value # pragma: no cover
return user_value
@@ -143,8 +205,8 @@ def render_variable(env, raw, cookiecutter_dict):
being populated with variables.
:return: The rendered value for the default variable.
"""
- if raw is None:
- return None
+ if raw is None or isinstance(raw, bool):
+ return raw
elif isinstance(raw, dict):
return {
render_variable(env, k, cookiecutter_dict): render_variable(
@@ -159,35 +221,61 @@ def render_variable(env, raw, cookiecutter_dict):
template = env.from_string(raw)
- rendered_template = template.render(cookiecutter=cookiecutter_dict)
- return rendered_template
+ return template.render(cookiecutter=cookiecutter_dict)
-def prompt_choice_for_config(cookiecutter_dict, env, key, options, no_input):
+def _prompts_from_options(options: dict) -> dict:
+ """Process template options and return friendly prompt information."""
+ prompts = {"__prompt__": "Select a template"}
+ for option_key, option_value in options.items():
+ title = str(option_value.get("title", option_key))
+ description = option_value.get("description", option_key)
+ label = title if title == description else f"{title} ({description})"
+ prompts[option_key] = label
+ return prompts
+
+
+def prompt_choice_for_template(key, options, no_input):
"""Prompt user with a set of options to choose from.
- Each of the possible choices is rendered beforehand.
+ :param no_input: Do not prompt for user input and return the first available option.
+ """
+ opts = list(options.keys())
+ prompts = {"templates": _prompts_from_options(options)}
+ return opts[0] if no_input else read_user_choice(key, opts, prompts, "")
+
+
+def prompt_choice_for_config(
+ cookiecutter_dict, env, key, options, no_input, prompts=None, prefix=""
+):
+ """Prompt user with a set of options to choose from.
+
+ :param no_input: Do not prompt for user input and return the first available option.
"""
rendered_options = [render_variable(env, raw, cookiecutter_dict) for raw in options]
-
if no_input:
return rendered_options[0]
- return read_user_choice(key, rendered_options)
+ return read_user_choice(key, rendered_options, prompts, prefix)
def prompt_for_config(context, no_input=False):
"""Prompt user to enter a new config.
:param dict context: Source for field names and sample values.
- :param no_input: Prompt the user at command line for manual configuration?
+ :param no_input: Do not prompt for user input and use only values from context.
"""
cookiecutter_dict = OrderedDict([])
- env = StrictEnvironment(context=context)
+ env = create_env_with_context(context)
+ prompts = context['cookiecutter'].pop('__prompts__', {})
# First pass: Handle simple and raw variables, plus choices.
# These must be done first because the dictionaries keys and
# values might refer to them.
- for key, raw in context['cookiecutter'].items():
+ count = 0
+ all_prompts = context['cookiecutter'].items()
+ visible_prompts = [k for k, _ in all_prompts if not k.startswith("_")]
+ size = len(visible_prompts)
+ for key, raw in all_prompts:
if key.startswith('_') and not key.startswith('__'):
cookiecutter_dict[key] = raw
continue
@@ -195,42 +283,131 @@ def prompt_for_config(context, no_input=False):
cookiecutter_dict[key] = render_variable(env, raw, cookiecutter_dict)
continue
+ if not isinstance(raw, dict):
+ count += 1
+ prefix = f" [dim][{count}/{size}][/] "
+
try:
if isinstance(raw, list):
# We are dealing with a choice variable
val = prompt_choice_for_config(
- cookiecutter_dict, env, key, raw, no_input
+ cookiecutter_dict, env, key, raw, no_input, prompts, prefix
)
cookiecutter_dict[key] = val
+ elif isinstance(raw, bool):
+ # We are dealing with a boolean variable
+ if no_input:
+ cookiecutter_dict[key] = render_variable(
+ env, raw, cookiecutter_dict
+ )
+ else:
+ cookiecutter_dict[key] = read_user_yes_no(key, raw, prompts, prefix)
elif not isinstance(raw, dict):
# We are dealing with a regular variable
val = render_variable(env, raw, cookiecutter_dict)
if not no_input:
- val = read_user_variable(key, val)
+ val = read_user_variable(key, val, prompts, prefix)
cookiecutter_dict[key] = val
except UndefinedError as err:
msg = f"Unable to render variable '{key}'"
- raise UndefinedVariableInTemplate(msg, err, context)
+ raise UndefinedVariableInTemplate(msg, err, context) from err
# Second pass; handle the dictionaries.
for key, raw in context['cookiecutter'].items():
- # Skip private type dicts not ot be rendered.
+ # Skip private type dicts not to be rendered.
if key.startswith('_') and not key.startswith('__'):
continue
try:
if isinstance(raw, dict):
# We are dealing with a dict variable
+ count += 1
+ prefix = f" [dim][{count}/{size}][/] "
val = render_variable(env, raw, cookiecutter_dict)
if not no_input and not key.startswith('__'):
- val = read_user_dict(key, val)
+ val = read_user_dict(key, val, prompts, prefix)
cookiecutter_dict[key] = val
except UndefinedError as err:
msg = f"Unable to render variable '{key}'"
- raise UndefinedVariableInTemplate(msg, err, context)
+ raise UndefinedVariableInTemplate(msg, err, context) from err
return cookiecutter_dict
+
+
+def choose_nested_template(context: dict, repo_dir: str, no_input: bool = False) -> str:
+ """Prompt user to select the nested template to use.
+
+ :param context: Source for field names and sample values.
+ :param repo_dir: Repository directory.
+ :param no_input: Do not prompt for user input and use only values from context.
+ :returns: Path to the selected template.
+ """
+ cookiecutter_dict = OrderedDict([])
+ env = create_env_with_context(context)
+ prefix = ""
+ prompts = context['cookiecutter'].pop('__prompts__', {})
+ key = "templates"
+ config = context['cookiecutter'].get(key, {})
+ if config:
+ # Pass
+ val = prompt_choice_for_template(key, config, no_input)
+ template = config[val]["path"]
+ else:
+ # Old style
+ key = "template"
+ config = context['cookiecutter'].get(key, [])
+ val = prompt_choice_for_config(
+ cookiecutter_dict, env, key, config, no_input, prompts, prefix
+ )
+ template = re.search(r'\((.+)\)', val).group(1)
+
+ template = Path(template) if template else None
+ if not (template and not template.is_absolute()):
+ raise ValueError("Illegal template path")
+
+ repo_dir = Path(repo_dir).resolve()
+ template_path = (repo_dir / template).resolve()
+ # Return path as string
+ return f"{template_path}"
+
+
+def prompt_and_delete(path, no_input=False):
+ """
+ Ask user if it's okay to delete the previously-downloaded file/directory.
+
+ If yes, delete it. If no, checks to see if the old version should be
+ reused. If yes, it's reused; otherwise, Cookiecutter exits.
+
+ :param path: Previously downloaded zipfile.
+ :param no_input: Suppress prompt to delete repo and just delete it.
+ :return: True if the content was deleted
+ """
+ # Suppress prompt if called via API
+ if no_input:
+ ok_to_delete = True
+ else:
+ question = (
+ f"You've downloaded {path} before. Is it okay to delete and re-download it?"
+ )
+
+ ok_to_delete = read_user_yes_no(question, 'yes')
+
+ if ok_to_delete:
+ if os.path.isdir(path):
+ rmtree(path)
+ else:
+ os.remove(path)
+ return True
+ else:
+ ok_to_reuse = read_user_yes_no(
+ "Do you want to re-use the existing version?", 'yes'
+ )
+
+ if ok_to_reuse:
+ return False
+
+ sys.exit()
diff --git a/third_party/python/cookiecutter/cookiecutter/replay.py b/third_party/python/cookiecutter/cookiecutter/replay.py
index 9730e84da807..196f2b1694ca 100644
--- a/third_party/python/cookiecutter/cookiecutter/replay.py
+++ b/third_party/python/cookiecutter/cookiecutter/replay.py
@@ -3,6 +3,7 @@ cookiecutter.replay.
-------------------
"""
+
import json
import os
@@ -16,10 +17,9 @@ def get_file_name(replay_dir, template_name):
return os.path.join(replay_dir, file_name)
-def dump(replay_dir, template_name, context):
+def dump(replay_dir: "os.PathLike[str]", template_name: str, context: dict):
"""Write json data to file."""
- if not make_sure_path_exists(replay_dir):
- raise OSError(f'Unable to create replay dir at {replay_dir}')
+ make_sure_path_exists(replay_dir)
if not isinstance(template_name, str):
raise TypeError('Template name is required to be of type str')
@@ -32,7 +32,7 @@ def dump(replay_dir, template_name, context):
replay_file = get_file_name(replay_dir, template_name)
- with open(replay_file, 'w') as outfile:
+ with open(replay_file, 'w', encoding="utf-8") as outfile:
json.dump(context, outfile, indent=2)
@@ -43,7 +43,7 @@ def load(replay_dir, template_name):
replay_file = get_file_name(replay_dir, template_name)
- with open(replay_file) as infile:
+ with open(replay_file, encoding="utf-8") as infile:
context = json.load(infile)
if 'cookiecutter' not in context:
diff --git a/third_party/python/cookiecutter/cookiecutter/repository.py b/third_party/python/cookiecutter/cookiecutter/repository.py
index f8e6fcbcc5ea..cc5576ad685e 100644
--- a/third_party/python/cookiecutter/cookiecutter/repository.py
+++ b/third_party/python/cookiecutter/cookiecutter/repository.py
@@ -1,4 +1,5 @@
"""Cookiecutter repository functions."""
+
import os
import re
@@ -82,11 +83,12 @@ def determine_repo_dir(
definitions.
:param clone_to_dir: The directory to clone the repository into.
:param checkout: The branch, tag or commit ID to checkout after clone.
- :param no_input: Prompt the user at command line for manual configuration?
+ :param no_input: Do not prompt for user input and eventually force a refresh of
+ cached resources.
:param password: The password to use when extracting the repository.
:param directory: Directory within repo where cookiecutter.json lives.
:return: A tuple containing the cookiecutter template directory, and
- a boolean descriving whether that directory should be cleaned up
+ a boolean describing whether that directory should be cleaned up
after the template has been instantiated.
:raises: `RepositoryNotFound` if a repository directory could not be found.
"""
diff --git a/third_party/python/cookiecutter/cookiecutter/utils.py b/third_party/python/cookiecutter/cookiecutter/utils.py
index 4750a2663e70..b21252c5be2c 100644
--- a/third_party/python/cookiecutter/cookiecutter/utils.py
+++ b/third_party/python/cookiecutter/cookiecutter/utils.py
@@ -1,15 +1,18 @@
"""Helper functions used throughout Cookiecutter."""
+
import contextlib
-import errno
import logging
import os
import shutil
import stat
-import sys
+import tempfile
+from pathlib import Path
+from typing import Dict
-from cookiecutter.prompt import read_user_yes_no
from jinja2.ext import Extension
+from cookiecutter.environment import StrictEnvironment
+
logger = logging.getLogger(__name__)
@@ -31,19 +34,16 @@ def rmtree(path):
shutil.rmtree(path, onerror=force_delete)
-def make_sure_path_exists(path):
+def make_sure_path_exists(path: "os.PathLike[str]") -> None:
"""Ensure that a directory exists.
- :param path: A directory path.
+ :param path: A directory tree path for creation.
"""
- logger.debug('Making sure path exists: %s', path)
+ logger.debug('Making sure path exists (creates tree if not exist): %s', path)
try:
- os.makedirs(path)
- logger.debug('Created directory at: %s', path)
- except OSError as exception:
- if exception.errno != errno.EEXIST:
- return False
- return True
+ Path(path).mkdir(parents=True, exist_ok=True)
+ except OSError as error:
+ raise OSError(f'Unable to create directory at {path}') from error
@contextlib.contextmanager
@@ -70,44 +70,6 @@ def make_executable(script_path):
os.chmod(script_path, status.st_mode | stat.S_IEXEC)
-def prompt_and_delete(path, no_input=False):
- """
- Ask user if it's okay to delete the previously-downloaded file/directory.
-
- If yes, delete it. If no, checks to see if the old version should be
- reused. If yes, it's reused; otherwise, Cookiecutter exits.
-
- :param path: Previously downloaded zipfile.
- :param no_input: Suppress prompt to delete repo and just delete it.
- :return: True if the content was deleted
- """
- # Suppress prompt if called via API
- if no_input:
- ok_to_delete = True
- else:
- question = (
- "You've downloaded {} before. Is it okay to delete and re-download it?"
- ).format(path)
-
- ok_to_delete = read_user_yes_no(question, 'yes')
-
- if ok_to_delete:
- if os.path.isdir(path):
- rmtree(path)
- else:
- os.remove(path)
- return True
- else:
- ok_to_reuse = read_user_yes_no(
- "Do you want to re-use the existing version?", 'yes'
- )
-
- if ok_to_reuse:
- return False
-
- sys.exit()
-
-
def simple_filter(filter_function):
"""Decorate a function to wrap it in a simplified jinja2 extension."""
@@ -118,3 +80,20 @@ def simple_filter(filter_function):
SimpleFilterExtension.__name__ = filter_function.__name__
return SimpleFilterExtension
+
+
+def create_tmp_repo_dir(repo_dir: "os.PathLike[str]") -> Path:
+ """Create a temporary dir with a copy of the contents of repo_dir."""
+ repo_dir = Path(repo_dir).resolve()
+ base_dir = tempfile.mkdtemp(prefix='cookiecutter')
+ new_dir = f"{base_dir}/{repo_dir.name}"
+ logger.debug(f'Copying repo_dir from {repo_dir} to {new_dir}')
+ shutil.copytree(repo_dir, new_dir)
+ return Path(new_dir)
+
+
+def create_env_with_context(context: Dict):
+ """Create a jinja environment using the provided context."""
+ envvars = context.get('cookiecutter', {}).get('_jinja2_env_vars', {})
+
+ return StrictEnvironment(context=context, keep_trailing_newline=True, **envvars)
diff --git a/third_party/python/cookiecutter/cookiecutter/vcs.py b/third_party/python/cookiecutter/cookiecutter/vcs.py
index bb4356b31745..db57ae9625e7 100644
--- a/third_party/python/cookiecutter/cookiecutter/vcs.py
+++ b/third_party/python/cookiecutter/cookiecutter/vcs.py
@@ -1,8 +1,11 @@
"""Helper functions for working with version control systems."""
+
import logging
import os
import subprocess # nosec
+from pathlib import Path
from shutil import which
+from typing import Optional
from cookiecutter.exceptions import (
RepositoryCloneFailed,
@@ -10,7 +13,8 @@ from cookiecutter.exceptions import (
UnknownRepoType,
VCSNotInstalled,
)
-from cookiecutter.utils import make_sure_path_exists, prompt_and_delete
+from cookiecutter.prompt import prompt_and_delete
+from cookiecutter.utils import make_sure_path_exists
logger = logging.getLogger(__name__)
@@ -54,18 +58,24 @@ def is_vcs_installed(repo_type):
return bool(which(repo_type))
-def clone(repo_url, checkout=None, clone_to_dir='.', no_input=False):
+def clone(
+ repo_url: str,
+ checkout: Optional[str] = None,
+ clone_to_dir: "os.PathLike[str]" = ".",
+ no_input: bool = False,
+):
"""Clone a repo to the current directory.
:param repo_url: Repo URL of unknown type.
:param checkout: The branch, tag or commit ID to checkout after clone.
:param clone_to_dir: The directory to clone to.
Defaults to the current directory.
- :param no_input: Suppress all user prompts when calling via API.
+ :param no_input: Do not prompt for user input and eventually force a refresh of
+ cached resources.
:returns: str with path to the new directory of the repository.
"""
# Ensure that clone_to_dir exists
- clone_to_dir = os.path.expanduser(clone_to_dir)
+ clone_to_dir = Path(clone_to_dir).expanduser()
make_sure_path_exists(clone_to_dir)
# identify the repo_type
@@ -113,12 +123,12 @@ def clone(repo_url, checkout=None, clone_to_dir='.', no_input=False):
raise RepositoryNotFound(
f'The repository {repo_url} could not be found, '
'have you made a typo?'
- )
+ ) from clone_error
if any(error in output for error in BRANCH_ERRORS):
raise RepositoryCloneFailed(
f'The {checkout} branch of repository '
f'{repo_url} could not found, have you made a typo?'
- )
+ ) from clone_error
logger.error('git clone failed with error: %s', output)
raise
diff --git a/third_party/python/cookiecutter/cookiecutter/zipfile.py b/third_party/python/cookiecutter/cookiecutter/zipfile.py
index 7395ce61bcc7..e3cfb3e201c8 100644
--- a/third_party/python/cookiecutter/cookiecutter/zipfile.py
+++ b/third_party/python/cookiecutter/cookiecutter/zipfile.py
@@ -1,16 +1,25 @@
"""Utility functions for handling and fetching repo archives in zip format."""
+
import os
import tempfile
+from pathlib import Path
+from typing import Optional
from zipfile import BadZipFile, ZipFile
import requests
from cookiecutter.exceptions import InvalidZipRepository
-from cookiecutter.prompt import read_repo_password
-from cookiecutter.utils import make_sure_path_exists, prompt_and_delete
+from cookiecutter.prompt import prompt_and_delete, read_repo_password
+from cookiecutter.utils import make_sure_path_exists
-def unzip(zip_uri, is_url, clone_to_dir='.', no_input=False, password=None):
+def unzip(
+ zip_uri: str,
+ is_url: bool,
+ clone_to_dir: "os.PathLike[str]" = ".",
+ no_input: bool = False,
+ password: Optional[str] = None,
+):
"""Download and unpack a zipfile at a given URI.
This will download the zipfile to the cookiecutter repository,
@@ -20,11 +29,12 @@ def unzip(zip_uri, is_url, clone_to_dir='.', no_input=False, password=None):
:param is_url: Is the zip URI a URL or a file?
:param clone_to_dir: The cookiecutter repository directory
to put the archive into.
- :param no_input: Suppress any prompts
+ :param no_input: Do not prompt for user input and eventually force a refresh of
+ cached resources.
:param password: The password to use when unpacking the repository.
"""
# Ensure that clone_to_dir exists
- clone_to_dir = os.path.expanduser(clone_to_dir)
+ clone_to_dir = Path(clone_to_dir).expanduser()
make_sure_path_exists(clone_to_dir)
if is_url:
@@ -40,7 +50,7 @@ def unzip(zip_uri, is_url, clone_to_dir='.', no_input=False, password=None):
if download:
# (Re) download the zipfile
- r = requests.get(zip_uri, stream=True)
+ r = requests.get(zip_uri, stream=True, timeout=100)
with open(zip_path, 'wb') as f:
for chunk in r.iter_content(chunk_size=1024):
if chunk: # filter out keep-alive new chunks
@@ -62,8 +72,7 @@ def unzip(zip_uri, is_url, clone_to_dir='.', no_input=False, password=None):
first_filename = zip_file.namelist()[0]
if not first_filename.endswith('/'):
raise InvalidZipRepository(
- 'Zip repository {} does not include '
- 'a top-level directory'.format(zip_uri)
+ f"Zip repository {zip_uri} does not include a top-level directory"
)
# Construct the final target directory
diff --git a/third_party/python/diskcache/diskcache-4.1.0.dist-info/RECORD b/third_party/python/diskcache/diskcache-4.1.0.dist-info/RECORD
deleted file mode 100644
index d4bca0ad4555..000000000000
--- a/third_party/python/diskcache/diskcache-4.1.0.dist-info/RECORD
+++ /dev/null
@@ -1,12 +0,0 @@
-diskcache/__init__.py,sha256=6RtBwXsSbdiZ-H44I7nLwF2-1VyVMHq1cJ5ynfnQt-E,1234
-diskcache/cli.py,sha256=JzkI2KtJJ0VRfBAq69lTkItoLwg4vOrTezczetSCfaY,40
-diskcache/core.py,sha256=nZRqL-VuJZZw1Ll5ADBzGivpIN_vXTDC8KSOyQ_XvjI,82426
-diskcache/djangocache.py,sha256=vAWT1FdmvHoHas244yoOblc6GhvozgLuFyjASMFPaK0,15488
-diskcache/fanout.py,sha256=Ha5C8BpClAHKEi6cJvJ5HvmAKlNwfiMpjb_az_hIJE0,21271
-diskcache/persistent.py,sha256=hgsS9-LymHsBeuNx0fBPOsiobvpJmGOIxT1T67BQUYw,37450
-diskcache/recipes.py,sha256=VQty-6AVoXcc6hfp1QOFvQZSf8W5AbQBFe1N3QlyILk,13849
-diskcache-4.1.0.dist-info/LICENSE,sha256=KBQYvOJPaViOo1FzqVpqPSGqW0jDZG6KiE8kLKMzNkw,559
-diskcache-4.1.0.dist-info/METADATA,sha256=wWGlNFCEiyWQ6R5zq3m3RFQbxELo6oJyrpryNir-yFo,19886
-diskcache-4.1.0.dist-info/WHEEL,sha256=h_aVn5OB2IERUjMbi2pucmR_zzWJtk303YXvhh60NJ8,110
-diskcache-4.1.0.dist-info/top_level.txt,sha256=A5fqg_AHgOQc_0o1NZ-Uo5Bsb7CV3fR99J-p1-F4yuA,10
-diskcache-4.1.0.dist-info/RECORD,,
diff --git a/third_party/python/diskcache/diskcache-4.1.0.dist-info/LICENSE b/third_party/python/diskcache/diskcache-5.6.3.dist-info/LICENSE
similarity index 94%
rename from third_party/python/diskcache/diskcache-4.1.0.dist-info/LICENSE
rename to third_party/python/diskcache/diskcache-5.6.3.dist-info/LICENSE
index 3259b989fd2e..bb4cfb761663 100644
--- a/third_party/python/diskcache/diskcache-4.1.0.dist-info/LICENSE
+++ b/third_party/python/diskcache/diskcache-5.6.3.dist-info/LICENSE
@@ -1,4 +1,4 @@
-Copyright 2016-2019 Grant Jenks
+Copyright 2016-2022 Grant Jenks
Licensed under the Apache License, Version 2.0 (the "License"); you may not use
this file except in compliance with the License. You may obtain a copy of the
diff --git a/third_party/python/diskcache/diskcache-4.1.0.dist-info/METADATA b/third_party/python/diskcache/diskcache-5.6.3.dist-info/METADATA
similarity index 92%
rename from third_party/python/diskcache/diskcache-4.1.0.dist-info/METADATA
rename to third_party/python/diskcache/diskcache-5.6.3.dist-info/METADATA
index dff6db382f78..19713ef7ffac 100644
--- a/third_party/python/diskcache/diskcache-4.1.0.dist-info/METADATA
+++ b/third_party/python/diskcache/diskcache-5.6.3.dist-info/METADATA
@@ -1,26 +1,29 @@
Metadata-Version: 2.1
Name: diskcache
-Version: 4.1.0
+Version: 5.6.3
Summary: Disk Cache -- Disk and file backed persistent cache.
Home-page: http://www.grantjenks.com/docs/diskcache/
Author: Grant Jenks
Author-email: contact@grantjenks.com
License: Apache 2.0
-Platform: UNKNOWN
+Project-URL: Documentation, http://www.grantjenks.com/docs/diskcache/
+Project-URL: Funding, https://gum.co/diskcache
+Project-URL: Source, https://github.com/grantjenks/python-diskcache
+Project-URL: Tracker, https://github.com/grantjenks/python-diskcache/issues
Classifier: Development Status :: 5 - Production/Stable
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: Apache Software License
Classifier: Natural Language :: English
Classifier: Programming Language :: Python
-Classifier: Programming Language :: Python :: 2
-Classifier: Programming Language :: Python :: 2.7
Classifier: Programming Language :: Python :: 3
-Classifier: Programming Language :: Python :: 3.4
Classifier: Programming Language :: Python :: 3.5
Classifier: Programming Language :: Python :: 3.6
Classifier: Programming Language :: Python :: 3.7
+Classifier: Programming Language :: Python :: 3.8
+Classifier: Programming Language :: Python :: 3.9
Classifier: Programming Language :: Python :: Implementation :: CPython
-Classifier: Programming Language :: Python :: Implementation :: PyPy
+Requires-Python: >=3
+License-File: LICENSE
DiskCache: Disk Backed Cache
============================
@@ -28,7 +31,7 @@ DiskCache: Disk Backed Cache
`DiskCache`_ is an Apache2 licensed disk and file backed cache library, written
in pure-Python, and compatible with Django.
-The cloud-based computing of 2019 puts a premium on memory. Gigabytes of empty
+The cloud-based computing of 2023 puts a premium on memory. Gigabytes of empty
space is left on disks as processes vie for memory. Among these processes is
Memcached (and sometimes Redis) which is used as a cache. Wouldn't it be nice
to leverage empty disk space for caching?
@@ -101,16 +104,16 @@ Features
- Thread-safe and process-safe
- Supports multiple eviction policies (LRU and LFU included)
- Keys support "tag" metadata and eviction
-- Developed on Python 3.7
-- Tested on CPython 2.7, 3.4, 3.5, 3.6, 3.7 and PyPy
+- Developed on Python 3.10
+- Tested on CPython 3.6, 3.7, 3.8, 3.9, 3.10
- Tested on Linux, Mac OS X, and Windows
-- Tested using Travis CI and AppVeyor CI
+- Tested using GitHub Actions
-.. image:: https://api.travis-ci.org/grantjenks/python-diskcache.svg?branch=master
- :target: http://www.grantjenks.com/docs/diskcache/
+.. image:: https://github.com/grantjenks/python-diskcache/workflows/integration/badge.svg
+ :target: https://github.com/grantjenks/python-diskcache/actions?query=workflow%3Aintegration
-.. image:: https://ci.appveyor.com/api/projects/status/github/grantjenks/python-diskcache?branch=master&svg=true
- :target: http://www.grantjenks.com/docs/diskcache/
+.. image:: https://github.com/grantjenks/python-diskcache/workflows/release/badge.svg
+ :target: https://github.com/grantjenks/python-diskcache/actions?query=workflow%3Arelease
Quickstart
----------
@@ -123,7 +126,7 @@ You can access documentation in the interpreter with Python's built-in help
function::
>>> import diskcache
- >>> help(diskcache)
+ >>> help(diskcache) # doctest: +SKIP
The core of `DiskCache`_ is three data types intended for caching. `Cache`_
objects manage a SQLite database and filesystem directory to store key and
@@ -131,26 +134,26 @@ value pairs. `FanoutCache`_ provides a sharding layer to utilize multiple
caches and `DjangoCache`_ integrates that with `Django`_::
>>> from diskcache import Cache, FanoutCache, DjangoCache
- >>> help(Cache)
- >>> help(FanoutCache)
- >>> help(DjangoCache)
+ >>> help(Cache) # doctest: +SKIP
+ >>> help(FanoutCache) # doctest: +SKIP
+ >>> help(DjangoCache) # doctest: +SKIP
Built atop the caching data types, are `Deque`_ and `Index`_ which work as a
cross-process, persistent replacements for Python's ``collections.deque`` and
``dict``. These implement the sequence and mapping container base classes::
>>> from diskcache import Deque, Index
- >>> help(Deque)
- >>> help(Index)
+ >>> help(Deque) # doctest: +SKIP
+ >>> help(Index) # doctest: +SKIP
Finally, a number of `recipes`_ for cross-process synchronization are provided
using an underlying cache. Features like memoization with cache stampede
prevention, cross-process locking, and cross-process throttling are available::
>>> from diskcache import memoize_stampede, Lock, throttle
- >>> help(memoize_stampede)
- >>> help(Lock)
- >>> help(throttle)
+ >>> help(memoize_stampede) # doctest: +SKIP
+ >>> help(Lock) # doctest: +SKIP
+ >>> help(throttle) # doctest: +SKIP
Python's docstrings are a quick way to get started but not intended as a
replacement for the `DiskCache Tutorial`_ and `DiskCache API Reference`_.
@@ -209,7 +212,7 @@ other projects are shown in the tables below.
access. Keys are arbitrary strings, values arbitrary pickle-able objects.
* `pickleDB`_ is a lightweight and simple key-value store. It is built upon
Python's simplejson module and was inspired by Redis. It is licensed with the
- BSD three-caluse license.
+ BSD three-clause license.
.. _`dbm`: https://docs.python.org/3/library/dbm.html
.. _`shelve`: https://docs.python.org/3/library/shelve.html
@@ -338,7 +341,6 @@ Object Relational Mappings (ORM)
.. _`Django ORM`: https://docs.djangoproject.com/en/dev/topics/db/
.. _`SQLAlchemy`: https://www.sqlalchemy.org/
.. _`Peewee`: http://docs.peewee-orm.com/
-.. _`dataset`: https://dataset.readthedocs.io/
.. _`SQLObject`: http://sqlobject.org/
.. _`Pony ORM`: https://ponyorm.com/
@@ -412,7 +414,7 @@ Reference
License
-------
-Copyright 2016-2019 Grant Jenks
+Copyright 2016-2023 Grant Jenks
Licensed under the Apache License, Version 2.0 (the "License"); you may not use
this file except in compliance with the License. You may obtain a copy of the
@@ -426,5 +428,3 @@ CONDITIONS OF ANY KIND, either express or implied. See the License for the
specific language governing permissions and limitations under the License.
.. _`DiskCache`: http://www.grantjenks.com/docs/diskcache/
-
-
diff --git a/third_party/python/diskcache/diskcache-5.6.3.dist-info/RECORD b/third_party/python/diskcache/diskcache-5.6.3.dist-info/RECORD
new file mode 100644
index 000000000000..7e1dfc89b9d0
--- /dev/null
+++ b/third_party/python/diskcache/diskcache-5.6.3.dist-info/RECORD
@@ -0,0 +1,12 @@
+diskcache/__init__.py,sha256=JcEtz224G-ysHmgyxWId28A0wQfCIif0mdv4tqC-Zxk,1262
+diskcache/cli.py,sha256=RVv6Fyn7h_0E5BoAVJzbbjOWPDHXO0ZjNgh9g5CBRP8,44
+diskcache/core.py,sha256=oinmHnYCXvR2QXVRaBoqPf8iM79M5pAeixajlaJ9TNs,81867
+diskcache/djangocache.py,sha256=SX8jl2d-vfOMG7hXZuuh2VCnZEUP-mHGjYLpM2RdMaQ,16110
+diskcache/fanout.py,sha256=E4Gk-puAGsaiqyf45YlLdVTf2RM1g7Qy-TPSug1Elpo,22725
+diskcache/persistent.py,sha256=Cir3CPetAfACHlCEzY1P5B_YrZPPeWqsoKrkuBBxcCo,34681
+diskcache/recipes.py,sha256=dr6CtZ67nRe3XMUBj2J6D_uftquMi_rNpZBg8i6lfRM,14922
+diskcache-5.6.3.dist-info/LICENSE,sha256=WDVGuqP9k2B9hFEmVwZ3pAH1COIotQRP77w5Sa8XlnI,559
+diskcache-5.6.3.dist-info/METADATA,sha256=b8cM_0OjxmZlMebCaOkAWfuTrliu1wgWPAzuyrJNuu8,20458
+diskcache-5.6.3.dist-info/WHEEL,sha256=yQN5g4mg4AybRjkgi-9yy4iQEFibGQmlz78Pik5Or-A,92
+diskcache-5.6.3.dist-info/top_level.txt,sha256=A5fqg_AHgOQc_0o1NZ-Uo5Bsb7CV3fR99J-p1-F4yuA,10
+diskcache-5.6.3.dist-info/RECORD,,
diff --git a/third_party/python/arrow/arrow-1.2.3.dist-info/WHEEL b/third_party/python/diskcache/diskcache-5.6.3.dist-info/WHEEL
similarity index 65%
rename from third_party/python/arrow/arrow-1.2.3.dist-info/WHEEL
rename to third_party/python/diskcache/diskcache-5.6.3.dist-info/WHEEL
index becc9a66ea73..7e688737d490 100644
--- a/third_party/python/arrow/arrow-1.2.3.dist-info/WHEEL
+++ b/third_party/python/diskcache/diskcache-5.6.3.dist-info/WHEEL
@@ -1,5 +1,5 @@
Wheel-Version: 1.0
-Generator: bdist_wheel (0.37.1)
+Generator: bdist_wheel (0.41.2)
Root-Is-Purelib: true
Tag: py3-none-any
diff --git a/third_party/python/diskcache/diskcache-4.1.0.dist-info/top_level.txt b/third_party/python/diskcache/diskcache-5.6.3.dist-info/top_level.txt
similarity index 100%
rename from third_party/python/diskcache/diskcache-4.1.0.dist-info/top_level.txt
rename to third_party/python/diskcache/diskcache-5.6.3.dist-info/top_level.txt
diff --git a/third_party/python/diskcache/diskcache/__init__.py b/third_party/python/diskcache/diskcache/__init__.py
index 192524e6ce27..7757d6601e27 100644
--- a/third_party/python/diskcache/diskcache/__init__.py
+++ b/third_party/python/diskcache/diskcache/__init__.py
@@ -3,15 +3,31 @@ DiskCache API Reference
=======================
The :doc:`tutorial` provides a helpful walkthrough of most methods.
-
"""
-from .core import Cache, Disk, EmptyDirWarning, JSONDisk, UnknownFileWarning, Timeout
-from .core import DEFAULT_SETTINGS, ENOVAL, EVICTION_POLICY, UNKNOWN
+from .core import (
+ DEFAULT_SETTINGS,
+ ENOVAL,
+ EVICTION_POLICY,
+ UNKNOWN,
+ Cache,
+ Disk,
+ EmptyDirWarning,
+ JSONDisk,
+ Timeout,
+ UnknownFileWarning,
+)
from .fanout import FanoutCache
from .persistent import Deque, Index
-from .recipes import Averager, BoundedSemaphore, Lock, RLock
-from .recipes import barrier, memoize_stampede, throttle
+from .recipes import (
+ Averager,
+ BoundedSemaphore,
+ Lock,
+ RLock,
+ barrier,
+ memoize_stampede,
+ throttle,
+)
__all__ = [
'Averager',
@@ -37,15 +53,16 @@ __all__ = [
]
try:
- from .djangocache import DjangoCache # pylint: disable=wrong-import-position
+ from .djangocache import DjangoCache # noqa
+
__all__.append('DjangoCache')
-except Exception: # pylint: disable=broad-except
+except Exception: # pylint: disable=broad-except # pragma: no cover
# Django not installed or not setup so ignore.
pass
__title__ = 'diskcache'
-__version__ = '4.1.0'
-__build__ = 0x040100
+__version__ = '5.6.3'
+__build__ = 0x050603
__author__ = 'Grant Jenks'
__license__ = 'Apache 2.0'
-__copyright__ = 'Copyright 2016-2018 Grant Jenks'
+__copyright__ = 'Copyright 2016-2023 Grant Jenks'
diff --git a/third_party/python/diskcache/diskcache/cli.py b/third_party/python/diskcache/diskcache/cli.py
index 44bffebfcca7..6a39f601fe11 100644
--- a/third_party/python/diskcache/diskcache/cli.py
+++ b/third_party/python/diskcache/diskcache/cli.py
@@ -1 +1 @@
-"Command line interface to disk cache."
+"""Command line interface to disk cache."""
diff --git a/third_party/python/diskcache/diskcache/core.py b/third_party/python/diskcache/diskcache/core.py
index 0c8fd2c74528..c7c84860ea85 100644
--- a/third_party/python/diskcache/diskcache/core.py
+++ b/third_party/python/diskcache/diskcache/core.py
@@ -1,5 +1,4 @@
"""Core disk and file backed cache API.
-
"""
import codecs
@@ -10,67 +9,32 @@ import io
import json
import os
import os.path as op
+import pickle
import pickletools
import sqlite3
import struct
-import sys
import tempfile
import threading
import time
import warnings
import zlib
-############################################################################
-# BEGIN Python 2/3 Shims
-############################################################################
-
-if sys.hexversion < 0x03000000:
- import cPickle as pickle # pylint: disable=import-error
- # ISSUE #25 Fix for http://bugs.python.org/issue10211
- from cStringIO import StringIO as BytesIO # pylint: disable=import-error
- from thread import get_ident # pylint: disable=import-error,no-name-in-module
- TextType = unicode # pylint: disable=invalid-name,undefined-variable
- BytesType = str
- INT_TYPES = int, long # pylint: disable=undefined-variable
- range = xrange # pylint: disable=redefined-builtin,invalid-name,undefined-variable
- io_open = io.open # pylint: disable=invalid-name
-else:
- import pickle
- from io import BytesIO # pylint: disable=ungrouped-imports
- from threading import get_ident
- TextType = str
- BytesType = bytes
- INT_TYPES = (int,)
- io_open = open # pylint: disable=invalid-name
def full_name(func):
- "Return full name of `func` by adding the module and function name."
- try:
- # The __qualname__ attribute is only available in Python 3.3 and later.
- # GrantJ 2019-03-29 Remove after support for Python 2 is dropped.
- name = func.__qualname__
- except AttributeError:
- name = func.__name__
- return func.__module__ + '.' + name
+ """Return full name of `func` by adding the module and function name."""
+ return func.__module__ + '.' + func.__qualname__
-############################################################################
-# END Python 2/3 Shims
-############################################################################
-
-try:
- WindowsError
-except NameError:
- class WindowsError(Exception):
- "Windows error place-holder on platforms without support."
class Constant(tuple):
- "Pretty display of immutable constant."
+ """Pretty display of immutable constant."""
+
def __new__(cls, name):
return tuple.__new__(cls, (name,))
def __repr__(self):
return '%s' % self[0]
+
DBNAME = 'cache.db'
ENOVAL = Constant('ENOVAL')
UNKNOWN = Constant('UNKNOWN')
@@ -82,25 +46,25 @@ MODE_TEXT = 3
MODE_PICKLE = 4
DEFAULT_SETTINGS = {
- u'statistics': 0, # False
- u'tag_index': 0, # False
- u'eviction_policy': u'least-recently-stored',
- u'size_limit': 2 ** 30, # 1gb
- u'cull_limit': 10,
- u'sqlite_auto_vacuum': 1, # FULL
- u'sqlite_cache_size': 2 ** 13, # 8,192 pages
- u'sqlite_journal_mode': u'wal',
- u'sqlite_mmap_size': 2 ** 26, # 64mb
- u'sqlite_synchronous': 1, # NORMAL
- u'disk_min_file_size': 2 ** 15, # 32kb
- u'disk_pickle_protocol': pickle.HIGHEST_PROTOCOL,
+ 'statistics': 0, # False
+ 'tag_index': 0, # False
+ 'eviction_policy': 'least-recently-stored',
+ 'size_limit': 2**30, # 1gb
+ 'cull_limit': 10,
+ 'sqlite_auto_vacuum': 1, # FULL
+ 'sqlite_cache_size': 2**13, # 8,192 pages
+ 'sqlite_journal_mode': 'wal',
+ 'sqlite_mmap_size': 2**26, # 64mb
+ 'sqlite_synchronous': 1, # NORMAL
+ 'disk_min_file_size': 2**15, # 32kb
+ 'disk_pickle_protocol': pickle.HIGHEST_PROTOCOL,
}
METADATA = {
- u'count': 0,
- u'size': 0,
- u'hits': 0,
- u'misses': 0,
+ 'count': 0,
+ 'size': 0,
+ 'hits': 0,
+ 'misses': 0,
}
EVICTION_POLICY = {
@@ -136,8 +100,9 @@ EVICTION_POLICY = {
}
-class Disk(object):
- "Cache key and value serialization for SQLite database and files."
+class Disk:
+ """Cache key and value serialization for SQLite database and files."""
+
def __init__(self, directory, min_file_size=0, pickle_protocol=0):
"""Initialize disk instance.
@@ -150,7 +115,6 @@ class Disk(object):
self.min_file_size = min_file_size
self.pickle_protocol = pickle_protocol
-
def hash(self, key):
"""Compute portable hash for `key`.
@@ -164,15 +128,14 @@ class Disk(object):
if type_disk_key is sqlite3.Binary:
return zlib.adler32(disk_key) & mask
- elif type_disk_key is TextType:
- return zlib.adler32(disk_key.encode('utf-8')) & mask # pylint: disable=no-member
- elif type_disk_key in INT_TYPES:
+ elif type_disk_key is str:
+ return zlib.adler32(disk_key.encode('utf-8')) & mask # noqa
+ elif type_disk_key is int:
return disk_key % mask
else:
assert type_disk_key is float
return zlib.adler32(struct.pack('!d', disk_key)) & mask
-
def put(self, key):
"""Convert `key` to fields key and raw for Cache table.
@@ -180,22 +143,25 @@ class Disk(object):
:return: (database key, raw boolean) pair
"""
- # pylint: disable=bad-continuation,unidiomatic-typecheck
+ # pylint: disable=unidiomatic-typecheck
type_key = type(key)
- if type_key is BytesType:
+ if type_key is bytes:
return sqlite3.Binary(key), True
- elif ((type_key is TextType)
- or (type_key in INT_TYPES
- and -9223372036854775808 <= key <= 9223372036854775807)
- or (type_key is float)):
+ elif (
+ (type_key is str)
+ or (
+ type_key is int
+ and -9223372036854775808 <= key <= 9223372036854775807
+ )
+ or (type_key is float)
+ ):
return key, True
else:
data = pickle.dumps(key, protocol=self.pickle_protocol)
result = pickletools.optimize(data)
return sqlite3.Binary(result), False
-
def get(self, key, raw):
"""Convert fields `key` and `raw` from Cache table to key.
@@ -204,12 +170,11 @@ class Disk(object):
:return: corresponding Python key
"""
- # pylint: disable=no-self-use,unidiomatic-typecheck
+ # pylint: disable=unidiomatic-typecheck
if raw:
- return BytesType(key) if type(key) is sqlite3.Binary else key
+ return bytes(key) if type(key) is sqlite3.Binary else key
else:
- return pickle.load(BytesIO(key))
-
+ return pickle.load(io.BytesIO(key))
def store(self, value, read, key=UNKNOWN):
"""Convert `value` to fields size, mode, filename, and value for Cache
@@ -225,39 +190,32 @@ class Disk(object):
type_value = type(value)
min_file_size = self.min_file_size
- if ((type_value is TextType and len(value) < min_file_size)
- or (type_value in INT_TYPES
- and -9223372036854775808 <= value <= 9223372036854775807)
- or (type_value is float)):
+ if (
+ (type_value is str and len(value) < min_file_size)
+ or (
+ type_value is int
+ and -9223372036854775808 <= value <= 9223372036854775807
+ )
+ or (type_value is float)
+ ):
return 0, MODE_RAW, None, value
- elif type_value is BytesType:
+ elif type_value is bytes:
if len(value) < min_file_size:
return 0, MODE_RAW, None, sqlite3.Binary(value)
else:
filename, full_path = self.filename(key, value)
-
- with open(full_path, 'wb') as writer:
- writer.write(value)
-
+ self._write(full_path, io.BytesIO(value), 'xb')
return len(value), MODE_BINARY, filename, None
- elif type_value is TextType:
+ elif type_value is str:
filename, full_path = self.filename(key, value)
-
- with io_open(full_path, 'w', encoding='UTF-8') as writer:
- writer.write(value)
-
+ self._write(full_path, io.StringIO(value), 'x', 'UTF-8')
size = op.getsize(full_path)
return size, MODE_TEXT, filename, None
elif read:
- size = 0
- reader = ft.partial(value.read, 2 ** 22)
+ reader = ft.partial(value.read, 2**22)
filename, full_path = self.filename(key, value)
-
- with open(full_path, 'wb') as writer:
- for chunk in iter(reader, b''):
- size += len(chunk)
- writer.write(chunk)
-
+ iterator = iter(reader, b'')
+ size = self._write(full_path, iterator, 'xb')
return size, MODE_BINARY, filename, None
else:
result = pickle.dumps(value, protocol=self.pickle_protocol)
@@ -266,12 +224,32 @@ class Disk(object):
return 0, MODE_PICKLE, None, sqlite3.Binary(result)
else:
filename, full_path = self.filename(key, value)
-
- with open(full_path, 'wb') as writer:
- writer.write(result)
-
+ self._write(full_path, io.BytesIO(result), 'xb')
return len(result), MODE_PICKLE, filename, None
+ def _write(self, full_path, iterator, mode, encoding=None):
+ full_dir, _ = op.split(full_path)
+
+ for count in range(1, 11):
+ with cl.suppress(OSError):
+ os.makedirs(full_dir)
+
+ try:
+ # Another cache may have deleted the directory before
+ # the file could be opened.
+ writer = open(full_path, mode, encoding=encoding)
+ except OSError:
+ if count == 10:
+ # Give up after 10 tries to open the file.
+ raise
+ continue
+
+ with writer:
+ size = 0
+ for chunk in iterator:
+ size += len(chunk)
+ writer.write(chunk)
+ return size
def fetch(self, mode, filename, value, read):
"""Convert fields `mode`, `filename`, and `value` from Cache table to
@@ -282,11 +260,12 @@ class Disk(object):
:param value: database value
:param bool read: when True, return an open file handle
:return: corresponding Python value
+ :raises: IOError if the value cannot be read
"""
- # pylint: disable=no-self-use,unidiomatic-typecheck
+ # pylint: disable=unidiomatic-typecheck,consider-using-with
if mode == MODE_RAW:
- return BytesType(value) if type(value) is sqlite3.Binary else value
+ return bytes(value) if type(value) is sqlite3.Binary else value
elif mode == MODE_BINARY:
if read:
return open(op.join(self._directory, filename), 'rb')
@@ -295,15 +274,14 @@ class Disk(object):
return reader.read()
elif mode == MODE_TEXT:
full_path = op.join(self._directory, filename)
- with io_open(full_path, 'r', encoding='UTF-8') as reader:
+ with open(full_path, 'r', encoding='UTF-8') as reader:
return reader.read()
elif mode == MODE_PICKLE:
if value is None:
with open(op.join(self._directory, filename), 'rb') as reader:
return pickle.load(reader)
else:
- return pickle.load(BytesIO(value))
-
+ return pickle.load(io.BytesIO(value))
def filename(self, key=UNKNOWN, value=UNKNOWN):
"""Return filename and full-path tuple for file storage.
@@ -327,43 +305,35 @@ class Disk(object):
hex_name = codecs.encode(os.urandom(16), 'hex').decode('utf-8')
sub_dir = op.join(hex_name[:2], hex_name[2:4])
name = hex_name[4:] + '.val'
- directory = op.join(self._directory, sub_dir)
-
- try:
- os.makedirs(directory)
- except OSError as error:
- if error.errno != errno.EEXIST:
- raise
-
filename = op.join(sub_dir, name)
full_path = op.join(self._directory, filename)
return filename, full_path
+ def remove(self, file_path):
+ """Remove a file given by `file_path`.
- def remove(self, filename):
- """Remove a file given by `filename`.
+ This method is cross-thread and cross-process safe. If an OSError
+ occurs, it is suppressed.
- This method is cross-thread and cross-process safe. If an "error no
- entry" occurs, it is suppressed.
-
- :param str filename: relative path to file
+ :param str file_path: relative path to file
"""
- full_path = op.join(self._directory, filename)
+ full_path = op.join(self._directory, file_path)
+ full_dir, _ = op.split(full_path)
- try:
+ # Suppress OSError that may occur if two caches attempt to delete the
+ # same file or directory at the same time.
+
+ with cl.suppress(OSError):
os.remove(full_path)
- except WindowsError:
- pass
- except OSError as error:
- if error.errno != errno.ENOENT:
- # ENOENT may occur if two caches attempt to delete the same
- # file at the same time.
- raise
+
+ with cl.suppress(OSError):
+ os.removedirs(full_dir)
class JSONDisk(Disk):
- "Cache key and value using JSON serialization with zlib compression."
+ """Cache key and value using JSON serialization with zlib compression."""
+
def __init__(self, directory, compress_level=1, **kwargs):
"""Initialize JSON disk instance.
@@ -378,60 +348,58 @@ class JSONDisk(Disk):
"""
self.compress_level = compress_level
- super(JSONDisk, self).__init__(directory, **kwargs)
-
+ super().__init__(directory, **kwargs)
def put(self, key):
json_bytes = json.dumps(key).encode('utf-8')
data = zlib.compress(json_bytes, self.compress_level)
- return super(JSONDisk, self).put(data)
-
+ return super().put(data)
def get(self, key, raw):
- data = super(JSONDisk, self).get(key, raw)
+ data = super().get(key, raw)
return json.loads(zlib.decompress(data).decode('utf-8'))
-
def store(self, value, read, key=UNKNOWN):
if not read:
json_bytes = json.dumps(value).encode('utf-8')
value = zlib.compress(json_bytes, self.compress_level)
- return super(JSONDisk, self).store(value, read, key=key)
-
+ return super().store(value, read, key=key)
def fetch(self, mode, filename, value, read):
- data = super(JSONDisk, self).fetch(mode, filename, value, read)
+ data = super().fetch(mode, filename, value, read)
if not read:
data = json.loads(zlib.decompress(data).decode('utf-8'))
return data
class Timeout(Exception):
- "Database timeout expired."
+ """Database timeout expired."""
class UnknownFileWarning(UserWarning):
- "Warning used by Cache.check for unknown files."
+ """Warning used by Cache.check for unknown files."""
class EmptyDirWarning(UserWarning):
- "Warning used by Cache.check for empty directories."
+ """Warning used by Cache.check for empty directories."""
-def args_to_key(base, args, kwargs, typed):
+def args_to_key(base, args, kwargs, typed, ignore):
"""Create cache key out of function arguments.
:param tuple base: base of key
:param tuple args: function arguments
:param dict kwargs: function keyword arguments
:param bool typed: include types in cache key
+ :param set ignore: positional or keyword args to ignore
:return: cache key tuple
"""
- key = base + args
+ args = tuple(arg for index, arg in enumerate(args) if index not in ignore)
+ key = base + args + (None,)
if kwargs:
- key += (ENOVAL,)
+ kwargs = {key: val for key, val in kwargs.items() if key not in ignore}
sorted_items = sorted(kwargs.items())
for item in sorted_items:
@@ -446,9 +414,9 @@ def args_to_key(base, args, kwargs, typed):
return key
-class Cache(object):
- "Disk and file backed cache."
- # pylint: disable=bad-continuation
+class Cache:
+ """Disk and file backed cache."""
+
def __init__(self, directory=None, timeout=60, disk=Disk, **settings):
"""Initialize cache instance.
@@ -461,10 +429,11 @@ class Cache(object):
try:
assert issubclass(disk, Disk)
except (TypeError, AssertionError):
- raise ValueError('disk must subclass diskcache.Disk')
+ raise ValueError('disk must subclass diskcache.Disk') from None
if directory is None:
directory = tempfile.mkdtemp(prefix='diskcache-')
+ directory = str(directory)
directory = op.expanduser(directory)
directory = op.expandvars(directory)
@@ -481,17 +450,17 @@ class Cache(object):
raise EnvironmentError(
error.errno,
'Cache directory "%s" does not exist'
- ' and could not be created' % self._directory
- )
+ ' and could not be created' % self._directory,
+ ) from None
sql = self._sql_retry
# Setup Settings table.
try:
- current_settings = dict(sql(
- 'SELECT key, value FROM Settings'
- ).fetchall())
+ current_settings = dict(
+ sql('SELECT key, value FROM Settings').fetchall()
+ )
except sqlite3.OperationalError:
current_settings = {}
@@ -508,7 +477,8 @@ class Cache(object):
if key.startswith('sqlite_'):
self.reset(key, value, update=False)
- sql('CREATE TABLE IF NOT EXISTS Settings ('
+ sql(
+ 'CREATE TABLE IF NOT EXISTS Settings ('
' key TEXT NOT NULL UNIQUE,'
' value)'
)
@@ -516,7 +486,8 @@ class Cache(object):
# Setup Disk object (must happen after settings initialized).
kwargs = {
- key[5:]: value for key, value in sets.items()
+ key[5:]: value
+ for key, value in sets.items()
if key.startswith('disk_')
}
self._disk = disk(directory, **kwargs)
@@ -533,11 +504,12 @@ class Cache(object):
sql(query, (key, value))
self.reset(key)
- (self._page_size,), = sql('PRAGMA page_size').fetchall()
+ ((self._page_size,),) = sql('PRAGMA page_size').fetchall()
# Setup Cache table.
- sql('CREATE TABLE IF NOT EXISTS Cache ('
+ sql(
+ 'CREATE TABLE IF NOT EXISTS Cache ('
' rowid INTEGER PRIMARY KEY,'
' key BLOB,'
' raw INTEGER,'
@@ -552,11 +524,13 @@ class Cache(object):
' value BLOB)'
)
- sql('CREATE UNIQUE INDEX IF NOT EXISTS Cache_key_raw ON'
+ sql(
+ 'CREATE UNIQUE INDEX IF NOT EXISTS Cache_key_raw ON'
' Cache(key, raw)'
)
- sql('CREATE INDEX IF NOT EXISTS Cache_expire_time ON'
+ sql(
+ 'CREATE INDEX IF NOT EXISTS Cache_expire_time ON'
' Cache (expire_time)'
)
@@ -567,32 +541,37 @@ class Cache(object):
# Use triggers to keep Metadata updated.
- sql('CREATE TRIGGER IF NOT EXISTS Settings_count_insert'
+ sql(
+ 'CREATE TRIGGER IF NOT EXISTS Settings_count_insert'
' AFTER INSERT ON Cache FOR EACH ROW BEGIN'
' UPDATE Settings SET value = value + 1'
' WHERE key = "count"; END'
)
- sql('CREATE TRIGGER IF NOT EXISTS Settings_count_delete'
+ sql(
+ 'CREATE TRIGGER IF NOT EXISTS Settings_count_delete'
' AFTER DELETE ON Cache FOR EACH ROW BEGIN'
' UPDATE Settings SET value = value - 1'
' WHERE key = "count"; END'
)
- sql('CREATE TRIGGER IF NOT EXISTS Settings_size_insert'
+ sql(
+ 'CREATE TRIGGER IF NOT EXISTS Settings_size_insert'
' AFTER INSERT ON Cache FOR EACH ROW BEGIN'
' UPDATE Settings SET value = value + NEW.size'
' WHERE key = "size"; END'
)
- sql('CREATE TRIGGER IF NOT EXISTS Settings_size_update'
+ sql(
+ 'CREATE TRIGGER IF NOT EXISTS Settings_size_update'
' AFTER UPDATE ON Cache FOR EACH ROW BEGIN'
' UPDATE Settings'
' SET value = value + NEW.size - OLD.size'
' WHERE key = "size"; END'
)
- sql('CREATE TRIGGER IF NOT EXISTS Settings_size_delete'
+ sql(
+ 'CREATE TRIGGER IF NOT EXISTS Settings_size_delete'
' AFTER DELETE ON Cache FOR EACH ROW BEGIN'
' UPDATE Settings SET value = value - OLD.size'
' WHERE key = "size"; END'
@@ -611,25 +590,21 @@ class Cache(object):
self._timeout = timeout
self._sql # pylint: disable=pointless-statement
-
@property
def directory(self):
"""Cache directory."""
return self._directory
-
@property
def timeout(self):
"""SQLite connection timeout value in seconds."""
return self._timeout
-
@property
def disk(self):
"""Disk used for serialization."""
return self._disk
-
@property
def _con(self):
# Check process ID to support process forking. If the process
@@ -668,12 +643,10 @@ class Cache(object):
return con
-
@property
def _sql(self):
return self._con.execute
-
@property
def _sql_retry(self):
sql = self._sql
@@ -701,7 +674,6 @@ class Cache(object):
return _execute_with_retry
-
@cl.contextmanager
def transact(self, retry=False):
"""Context manager to perform a transaction by locking the cache.
@@ -733,13 +705,12 @@ class Cache(object):
with self._transact(retry=retry):
yield
-
@cl.contextmanager
def _transact(self, retry=False, filename=None):
sql = self._sql
filenames = []
_disk_remove = self._disk.remove
- tid = get_ident()
+ tid = threading.get_ident()
txn_id = self._txn_id
if tid == txn_id:
@@ -756,7 +727,7 @@ class Cache(object):
continue
if filename is not None:
_disk_remove(filename)
- raise Timeout
+ raise Timeout from None
try:
yield sql, filenames.append
@@ -775,7 +746,6 @@ class Cache(object):
if name is not None:
_disk_remove(name)
-
def set(self, key, value, expire=None, read=False, tag=None, retry=False):
"""Set `key` and `value` item in cache.
@@ -831,7 +801,7 @@ class Cache(object):
).fetchall()
if rows:
- (rowid, old_filename), = rows
+ ((rowid, old_filename),) = rows
cleanup(old_filename)
self._row_update(rowid, now, columns)
else:
@@ -841,7 +811,6 @@ class Cache(object):
return True
-
def __setitem__(self, key, value):
"""Set corresponding `value` for `key` in cache.
@@ -853,11 +822,11 @@ class Cache(object):
"""
self.set(key, value, retry=True)
-
def _row_update(self, rowid, now, columns):
sql = self._sql
expire_time, tag, size, mode, filename, value = columns
- sql('UPDATE Cache SET'
+ sql(
+ 'UPDATE Cache SET'
' store_time = ?,'
' expire_time = ?,'
' access_time = ?,'
@@ -867,11 +836,12 @@ class Cache(object):
' mode = ?,'
' filename = ?,'
' value = ?'
- ' WHERE rowid = ?', (
- now, # store_time
+ ' WHERE rowid = ?',
+ (
+ now, # store_time
expire_time,
- now, # access_time
- 0, # access_count
+ now, # access_time
+ 0, # access_count
tag,
size,
mode,
@@ -881,20 +851,21 @@ class Cache(object):
),
)
-
def _row_insert(self, key, raw, now, columns):
sql = self._sql
expire_time, tag, size, mode, filename, value = columns
- sql('INSERT INTO Cache('
+ sql(
+ 'INSERT INTO Cache('
' key, raw, store_time, expire_time, access_time,'
' access_count, tag, size, mode, filename, value'
- ') VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)', (
+ ') VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)',
+ (
key,
raw,
- now, # store_time
+ now, # store_time
expire_time,
- now, # access_time
- 0, # access_count
+ now, # access_time
+ 0, # access_count
tag,
size,
mode,
@@ -903,7 +874,6 @@ class Cache(object):
),
)
-
def _cull(self, now, sql, cleanup, limit=None):
cull_limit = self.cull_limit if limit is None else limit
@@ -922,13 +892,12 @@ class Cache(object):
rows = sql(select_expired, (now, cull_limit)).fetchall()
if rows:
- delete_expired = (
- 'DELETE FROM Cache WHERE rowid IN (%s)'
- % (select_expired_template % 'rowid')
+ delete_expired = 'DELETE FROM Cache WHERE rowid IN (%s)' % (
+ select_expired_template % 'rowid'
)
sql(delete_expired, (now, cull_limit))
- for filename, in rows:
+ for (filename,) in rows:
cleanup(filename)
cull_limit -= len(rows)
@@ -947,16 +916,14 @@ class Cache(object):
rows = sql(select_filename, (cull_limit,)).fetchall()
if rows:
- delete = (
- 'DELETE FROM Cache WHERE rowid IN (%s)'
- % (select_policy.format(fields='rowid', now=now))
+ delete = 'DELETE FROM Cache WHERE rowid IN (%s)' % (
+ select_policy.format(fields='rowid', now=now)
)
sql(delete, (cull_limit,))
- for filename, in rows:
+ for (filename,) in rows:
cleanup(filename)
-
def touch(self, key, expire=None, retry=False):
"""Touch `key` in cache and update `expire` time.
@@ -983,17 +950,17 @@ class Cache(object):
).fetchall()
if rows:
- (rowid, old_expire_time), = rows
+ ((rowid, old_expire_time),) = rows
if old_expire_time is None or old_expire_time > now:
- sql('UPDATE Cache SET expire_time = ? WHERE rowid = ?',
+ sql(
+ 'UPDATE Cache SET expire_time = ? WHERE rowid = ?',
(expire_time, rowid),
)
return True
return False
-
def add(self, key, value, expire=None, read=False, tag=None, retry=False):
"""Add `key` and `value` item to cache.
@@ -1033,7 +1000,7 @@ class Cache(object):
).fetchall()
if rows:
- (rowid, old_filename, old_expire_time), = rows
+ ((rowid, old_filename, old_expire_time),) = rows
if old_expire_time is None or old_expire_time > now:
cleanup(filename)
@@ -1048,7 +1015,6 @@ class Cache(object):
return True
-
def incr(self, key, delta=1, default=0, retry=False):
"""Increment value by delta for item with key.
@@ -1089,19 +1055,23 @@ class Cache(object):
raise KeyError(key)
value = default + delta
- columns = (None, None) + self._disk.store(value, False, key=key)
+ columns = (None, None) + self._disk.store(
+ value, False, key=key
+ )
self._row_insert(db_key, raw, now, columns)
self._cull(now, sql, cleanup)
return value
- (rowid, expire_time, filename, value), = rows
+ ((rowid, expire_time, filename, value),) = rows
if expire_time is not None and expire_time < now:
if default is None:
raise KeyError(key)
value = default + delta
- columns = (None, None) + self._disk.store(value, False, key=key)
+ columns = (None, None) + self._disk.store(
+ value, False, key=key
+ )
self._row_update(rowid, now, columns)
self._cull(now, sql, cleanup)
cleanup(filename)
@@ -1120,7 +1090,6 @@ class Cache(object):
return value
-
def decr(self, key, delta=1, default=0, retry=False):
"""Decrement value by delta for item with key.
@@ -1151,9 +1120,15 @@ class Cache(object):
"""
return self.incr(key, -delta, default, retry)
-
- def get(self, key, default=None, read=False, expire_time=False, tag=False,
- retry=False):
+ def get(
+ self,
+ key,
+ default=None,
+ read=False,
+ expire_time=False,
+ tag=False,
+ retry=False,
+ ):
"""Retrieve value from cache. If `key` is missing, return `default`.
Raises :exc:`Timeout` error when database timeout occurs and `retry` is
@@ -1192,7 +1167,7 @@ class Cache(object):
if not rows:
return default
- (rowid, db_expire_time, db_tag, mode, filename, db_value), = rows
+ ((rowid, db_expire_time, db_tag, mode, filename, db_value),) = rows
try:
value = self._disk.fetch(mode, filename, db_value, read)
@@ -1216,19 +1191,17 @@ class Cache(object):
sql(cache_miss)
return default
- (rowid, db_expire_time, db_tag,
- mode, filename, db_value), = rows
+ (
+ (rowid, db_expire_time, db_tag, mode, filename, db_value),
+ ) = rows # noqa: E127
try:
value = self._disk.fetch(mode, filename, db_value, read)
- except IOError as error:
- if error.errno == errno.ENOENT:
- # Key was deleted before we could retrieve result.
- if self.statistics:
- sql(cache_miss)
- return default
- else:
- raise
+ except IOError:
+ # Key was deleted before we could retrieve result.
+ if self.statistics:
+ sql(cache_miss)
+ return default
if self.statistics:
sql(cache_hit)
@@ -1248,7 +1221,6 @@ class Cache(object):
else:
return value
-
def __getitem__(self, key):
"""Return corresponding value for `key` from cache.
@@ -1262,7 +1234,6 @@ class Cache(object):
raise KeyError(key)
return value
-
def read(self, key, retry=False):
"""Return file handle value corresponding to `key` from cache.
@@ -1281,7 +1252,6 @@ class Cache(object):
raise KeyError(key)
return handle
-
def __contains__(self, key):
"""Return `True` if `key` matching item is found in cache.
@@ -1301,8 +1271,9 @@ class Cache(object):
return bool(rows)
-
- def pop(self, key, default=None, expire_time=False, tag=False, retry=False):
+ def pop(
+ self, key, default=None, expire_time=False, tag=False, retry=False
+ ): # noqa: E501
"""Remove corresponding item for `key` from cache and return value.
If `key` is missing, return `default`.
@@ -1340,18 +1311,15 @@ class Cache(object):
if not rows:
return default
- (rowid, db_expire_time, db_tag, mode, filename, db_value), = rows
+ ((rowid, db_expire_time, db_tag, mode, filename, db_value),) = rows
sql('DELETE FROM Cache WHERE rowid = ?', (rowid,))
try:
value = self._disk.fetch(mode, filename, db_value, False)
- except IOError as error:
- if error.errno == errno.ENOENT:
- # Key was deleted before we could retrieve result.
- return default
- else:
- raise
+ except IOError:
+ # Key was deleted before we could retrieve result.
+ return default
finally:
if filename is not None:
self._disk.remove(filename)
@@ -1365,7 +1333,6 @@ class Cache(object):
else:
return value
-
def __delitem__(self, key, retry=True):
"""Delete corresponding item for `key` from cache.
@@ -1391,13 +1358,12 @@ class Cache(object):
if not rows:
raise KeyError(key)
- (rowid, filename), = rows
+ ((rowid, filename),) = rows
sql('DELETE FROM Cache WHERE rowid = ?', (rowid,))
cleanup(filename)
return True
-
def delete(self, key, retry=False):
"""Delete corresponding item for `key` from cache.
@@ -1412,14 +1378,22 @@ class Cache(object):
:raises Timeout: if database timeout occurs
"""
+ # pylint: disable=unnecessary-dunder-call
try:
return self.__delitem__(key, retry=retry)
except KeyError:
return False
-
- def push(self, value, prefix=None, side='back', expire=None, read=False,
- tag=None, retry=False):
+ def push(
+ self,
+ value,
+ prefix=None,
+ side='back',
+ expire=None,
+ read=False,
+ tag=None,
+ retry=False,
+ ):
"""Push `value` onto `side` of queue identified by `prefix` in cache.
When prefix is None, integer keys are used. Otherwise, string keys are
@@ -1485,10 +1459,10 @@ class Cache(object):
rows = sql(select, (min_key, max_key, raw)).fetchall()
if rows:
- (key,), = rows
+ ((key,),) = rows
if prefix is not None:
- num = int(key[(key.rfind('-') + 1):])
+ num = int(key[(key.rfind('-') + 1) :])
else:
num = key
@@ -1510,9 +1484,15 @@ class Cache(object):
return db_key
-
- def pull(self, prefix=None, default=(None, None), side='front',
- expire_time=False, tag=False, retry=False):
+ def pull(
+ self,
+ prefix=None,
+ default=(None, None),
+ side='front',
+ expire_time=False,
+ tag=False,
+ retry=False,
+ ):
"""Pull key and value item pair from `side` of queue in cache.
When prefix is None, integer keys are used. Otherwise, string keys are
@@ -1593,8 +1573,9 @@ class Cache(object):
if not rows:
return default
- (rowid, key, db_expire, db_tag, mode, name,
- db_value), = rows
+ (
+ (rowid, key, db_expire, db_tag, mode, name, db_value),
+ ) = rows
sql('DELETE FROM Cache WHERE rowid = ?', (rowid,))
@@ -1605,12 +1586,9 @@ class Cache(object):
try:
value = self._disk.fetch(mode, name, db_value, False)
- except IOError as error:
- if error.errno == errno.ENOENT:
- # Key was deleted before we could retrieve result.
- continue
- else:
- raise
+ except IOError:
+ # Key was deleted before we could retrieve result.
+ continue
finally:
if name is not None:
self._disk.remove(name)
@@ -1625,9 +1603,15 @@ class Cache(object):
else:
return key, value
-
- def peek(self, prefix=None, default=(None, None), side='front',
- expire_time=False, tag=False, retry=False):
+ def peek(
+ self,
+ prefix=None,
+ default=(None, None),
+ side='front',
+ expire_time=False,
+ tag=False,
+ retry=False,
+ ):
"""Peek at key and value item pair from `side` of queue in cache.
When prefix is None, integer keys are used. Otherwise, string keys are
@@ -1704,8 +1688,9 @@ class Cache(object):
if not rows:
return default
- (rowid, key, db_expire, db_tag, mode, name,
- db_value), = rows
+ (
+ (rowid, key, db_expire, db_tag, mode, name, db_value),
+ ) = rows
if db_expire is not None and db_expire < time.time():
sql('DELETE FROM Cache WHERE rowid = ?', (rowid,))
@@ -1715,15 +1700,9 @@ class Cache(object):
try:
value = self._disk.fetch(mode, name, db_value, False)
- except IOError as error:
- if error.errno == errno.ENOENT:
- # Key was deleted before we could retrieve result.
- continue
- else:
- raise
- finally:
- if name is not None:
- self._disk.remove(name)
+ except IOError:
+ # Key was deleted before we could retrieve result.
+ continue
break
if expire_time and tag:
@@ -1735,7 +1714,6 @@ class Cache(object):
else:
return key, value
-
def peekitem(self, last=True, expire_time=False, tag=False, retry=False):
"""Peek at key and value item pair in cache based on iteration order.
@@ -1777,8 +1755,18 @@ class Cache(object):
if not rows:
raise KeyError('dictionary is empty')
- (rowid, db_key, raw, db_expire, db_tag, mode, name,
- db_value), = rows
+ (
+ (
+ rowid,
+ db_key,
+ raw,
+ db_expire,
+ db_tag,
+ mode,
+ name,
+ db_value,
+ ),
+ ) = rows
if db_expire is not None and db_expire < time.time():
sql('DELETE FROM Cache WHERE rowid = ?', (rowid,))
@@ -1790,12 +1778,9 @@ class Cache(object):
try:
value = self._disk.fetch(mode, name, db_value, False)
- except IOError as error:
- if error.errno == errno.ENOENT:
- # Key was deleted before we could retrieve result.
- continue
- else:
- raise
+ except IOError:
+ # Key was deleted before we could retrieve result.
+ continue
break
if expire_time and tag:
@@ -1807,8 +1792,9 @@ class Cache(object):
else:
return key, value
-
- def memoize(self, name=None, typed=False, expire=None, tag=None):
+ def memoize(
+ self, name=None, typed=False, expire=None, tag=None, ignore=()
+ ):
"""Memoizing cache decorator.
Decorator to wrap callable with memoizing function using cache.
@@ -1867,6 +1853,7 @@ class Cache(object):
:param float expire: seconds until arguments expire
(default None, no expiry)
:param str tag: text to associate with arguments (default None)
+ :param set ignore: positional or keyword args to ignore (default ())
:return: callable decorator
"""
@@ -1875,12 +1862,12 @@ class Cache(object):
raise TypeError('name cannot be callable')
def decorator(func):
- "Decorator created by memoize() for callable `func`."
+ """Decorator created by memoize() for callable `func`."""
base = (full_name(func),) if name is None else (name,)
@ft.wraps(func)
def wrapper(*args, **kwargs):
- "Wrapper for callable to cache arguments and return values."
+ """Wrapper for callable to cache arguments and return values."""
key = wrapper.__cache_key__(*args, **kwargs)
result = self.get(key, default=ENOVAL, retry=True)
@@ -1892,15 +1879,14 @@ class Cache(object):
return result
def __cache_key__(*args, **kwargs):
- "Make key for cache given function arguments."
- return args_to_key(base, args, kwargs, typed)
+ """Make key for cache given function arguments."""
+ return args_to_key(base, args, kwargs, typed, ignore)
wrapper.__cache_key__ = __cache_key__
return wrapper
return decorator
-
def check(self, fix=False, retry=False):
"""Check database and file system consistency.
@@ -1929,8 +1915,8 @@ class Cache(object):
rows = sql('PRAGMA integrity_check').fetchall()
- if len(rows) != 1 or rows[0][0] != u'ok':
- for message, in rows:
+ if len(rows) != 1 or rows[0][0] != 'ok':
+ for (message,) in rows:
warnings.warn(message)
if fix:
@@ -1961,7 +1947,8 @@ class Cache(object):
warnings.warn(message % args)
if fix:
- sql('UPDATE Cache SET size = ?'
+ sql(
+ 'UPDATE Cache SET size = ?'
' WHERE rowid = ?',
(real_size, rowid),
)
@@ -2002,14 +1989,15 @@ class Cache(object):
# Check Settings.count against count of Cache rows.
self.reset('count')
- (count,), = sql('SELECT COUNT(key) FROM Cache').fetchall()
+ ((count,),) = sql('SELECT COUNT(key) FROM Cache').fetchall()
if self.count != count:
message = 'Settings.count != COUNT(Cache.key); %d != %d'
warnings.warn(message % (self.count, count))
if fix:
- sql('UPDATE Settings SET value = ? WHERE key = ?',
+ sql(
+ 'UPDATE Settings SET value = ? WHERE key = ?',
(count, 'count'),
)
@@ -2017,20 +2005,20 @@ class Cache(object):
self.reset('size')
select_size = 'SELECT COALESCE(SUM(size), 0) FROM Cache'
- (size,), = sql(select_size).fetchall()
+ ((size,),) = sql(select_size).fetchall()
if self.size != size:
message = 'Settings.size != SUM(Cache.size); %d != %d'
warnings.warn(message % (self.size, size))
if fix:
- sql('UPDATE Settings SET value = ? WHERE key =?',
+ sql(
+ 'UPDATE Settings SET value = ? WHERE key =?',
(size, 'size'),
)
return warns
-
def create_tag_index(self):
"""Create tag index on cache database.
@@ -2043,7 +2031,6 @@ class Cache(object):
sql('CREATE INDEX IF NOT EXISTS Cache_tag_rowid ON Cache(tag, rowid)')
self.reset('tag_index', 1)
-
def drop_tag_index(self):
"""Drop tag index on cache database.
@@ -2054,7 +2041,6 @@ class Cache(object):
sql('DROP INDEX IF EXISTS Cache_tag_rowid')
self.reset('tag_index', 0)
-
def evict(self, tag, retry=False):
"""Remove items with matching `tag` from cache.
@@ -2082,7 +2068,6 @@ class Cache(object):
args = [tag, 0, 100]
return self._select_delete(select, args, arg_index=1, retry=retry)
-
def expire(self, now=None, retry=False):
"""Remove expired items from cache.
@@ -2110,7 +2095,6 @@ class Cache(object):
args = [0, now or time.time(), 100]
return self._select_delete(select, args, row_index=1, retry=retry)
-
def cull(self, retry=False):
"""Cull items from cache until volume is less than size limit.
@@ -2140,7 +2124,7 @@ class Cache(object):
select_policy = EVICTION_POLICY[self.eviction_policy]['cull']
if select_policy is None:
- return
+ return 0
select_filename = select_policy.format(fields='filename', now=now)
@@ -2159,14 +2143,13 @@ class Cache(object):
)
sql(delete, (10,))
- for filename, in rows:
+ for (filename,) in rows:
cleanup(filename)
except Timeout:
- raise Timeout(count)
+ raise Timeout(count) from None
return count
-
def clear(self, retry=False):
"""Remove all items from cache.
@@ -2193,9 +2176,9 @@ class Cache(object):
args = [0, 100]
return self._select_delete(select, args, retry=retry)
-
- def _select_delete(self, select, args, row_index=0, arg_index=0,
- retry=False):
+ def _select_delete(
+ self, select, args, row_index=0, arg_index=0, retry=False
+ ):
count = 0
delete = 'DELETE FROM Cache WHERE rowid IN (%s)'
@@ -2215,11 +2198,10 @@ class Cache(object):
cleanup(row[-1])
except Timeout:
- raise Timeout(count)
+ raise Timeout(count) from None
return count
-
def iterkeys(self, reverse=False):
"""Iterate Cache keys in database sort order.
@@ -2263,7 +2245,7 @@ class Cache(object):
row = sql(select).fetchall()
if row:
- (key, raw), = row
+ ((key, raw),) = row
else:
return
@@ -2278,11 +2260,10 @@ class Cache(object):
for key, raw in rows:
yield _disk_get(key, raw)
-
def _iter(self, ascending=True):
sql = self._sql
rows = sql('SELECT MAX(rowid) FROM Cache').fetchall()
- (max_rowid,), = rows
+ ((max_rowid,),) = rows
yield # Signal ready.
if max_rowid is None:
@@ -2312,21 +2293,18 @@ class Cache(object):
for rowid, key, raw in rows:
yield _disk_get(key, raw)
-
def __iter__(self):
- "Iterate keys in cache including expired items."
+ """Iterate keys in cache including expired items."""
iterator = self._iter()
next(iterator)
return iterator
-
def __reversed__(self):
- "Reverse iterate keys in cache including expired items."
+ """Reverse iterate keys in cache including expired items."""
iterator = self._iter(ascending=False)
next(iterator)
return iterator
-
def stats(self, enable=True, reset=False):
"""Return cache statistics hits and misses.
@@ -2346,22 +2324,18 @@ class Cache(object):
return result
-
def volume(self):
"""Return estimated total size of cache on disk.
:return: size in bytes
"""
- (page_count,), = self._sql('PRAGMA page_count').fetchall()
+ ((page_count,),) = self._sql('PRAGMA page_count').fetchall()
total_size = self._page_size * page_count + self.reset('size')
return total_size
-
def close(self):
- """Close database connection.
-
- """
+ """Close database connection."""
con = getattr(self._local, 'con', None)
if con is None:
@@ -2374,30 +2348,25 @@ class Cache(object):
except AttributeError:
pass
-
def __enter__(self):
# Create connection in thread.
- connection = self._con # pylint: disable=unused-variable
+ # pylint: disable=unused-variable
+ connection = self._con # noqa
return self
-
def __exit__(self, *exception):
self.close()
-
def __len__(self):
- "Count of items in cache including expired items."
+ """Count of items in cache including expired items."""
return self.reset('count')
-
def __getstate__(self):
return (self.directory, self.timeout, type(self.disk))
-
def __setstate__(self, state):
self.__init__(*state)
-
def reset(self, key, value=ENOVAL, update=True):
"""Reset `key` and `value` item from Settings table.
@@ -2431,7 +2400,7 @@ class Cache(object):
if value is ENOVAL:
select = 'SELECT value FROM Settings WHERE key = ?'
- (value,), = sql_retry(select, (key,)).fetchall()
+ ((value,),) = sql_retry(select, (key,)).fetchall()
setattr(self, key, value)
return value
@@ -2459,7 +2428,9 @@ class Cache(object):
while True:
try:
try:
- (old_value,), = sql('PRAGMA %s' % (pragma)).fetchall()
+ ((old_value,),) = sql(
+ 'PRAGMA %s' % (pragma)
+ ).fetchall()
update = old_value != value
except ValueError:
update = True
diff --git a/third_party/python/diskcache/diskcache/djangocache.py b/third_party/python/diskcache/diskcache/djangocache.py
index 997b85240623..5dc8ce2c5f98 100644
--- a/third_party/python/diskcache/diskcache/djangocache.py
+++ b/third_party/python/diskcache/diskcache/djangocache.py
@@ -1,11 +1,12 @@
-"Django-compatible disk and file backed cache."
+"""Django-compatible disk and file backed cache."""
from functools import wraps
+
from django.core.cache.backends.base import BaseCache
try:
from django.core.cache.backends.base import DEFAULT_TIMEOUT
-except ImportError:
+except ImportError: # pragma: no cover
# For older versions of Django simply use 300 seconds.
DEFAULT_TIMEOUT = 300
@@ -14,7 +15,8 @@ from .fanout import FanoutCache
class DjangoCache(BaseCache):
- "Django-compatible disk and file backed cache."
+ """Django-compatible disk and file backed cache."""
+
def __init__(self, directory, params):
"""Initialize DjangoCache instance.
@@ -22,19 +24,17 @@ class DjangoCache(BaseCache):
:param dict params: cache parameters
"""
- super(DjangoCache, self).__init__(params)
+ super().__init__(params)
shards = params.get('SHARDS', 8)
timeout = params.get('DATABASE_TIMEOUT', 0.010)
options = params.get('OPTIONS', {})
self._cache = FanoutCache(directory, shards, timeout, **options)
-
@property
def directory(self):
"""Cache directory."""
return self._cache.directory
-
def cache(self, name):
"""Return Cache with given `name` in subdirectory.
@@ -44,16 +44,15 @@ class DjangoCache(BaseCache):
"""
return self._cache.cache(name)
-
- def deque(self, name):
+ def deque(self, name, maxlen=None):
"""Return Deque with given `name` in subdirectory.
:param str name: subdirectory name for Deque
+ :param maxlen: max length (default None, no max)
:return: Deque with given name
"""
- return self._cache.deque(name)
-
+ return self._cache.deque(name, maxlen=maxlen)
def index(self, name):
"""Return Index with given `name` in subdirectory.
@@ -64,9 +63,16 @@ class DjangoCache(BaseCache):
"""
return self._cache.index(name)
-
- def add(self, key, value, timeout=DEFAULT_TIMEOUT, version=None,
- read=False, tag=None, retry=True):
+ def add(
+ self,
+ key,
+ value,
+ timeout=DEFAULT_TIMEOUT,
+ version=None,
+ read=False,
+ tag=None,
+ retry=True,
+ ):
"""Set a value in the cache if the key does not already exist. If
timeout is given, that timeout will be used for the key; otherwise the
default cache timeout will be used.
@@ -89,9 +95,16 @@ class DjangoCache(BaseCache):
timeout = self.get_backend_timeout(timeout=timeout)
return self._cache.add(key, value, timeout, read, tag, retry)
-
- def get(self, key, default=None, version=None, read=False,
- expire_time=False, tag=False, retry=False):
+ def get(
+ self,
+ key,
+ default=None,
+ version=None,
+ read=False,
+ expire_time=False,
+ tag=False,
+ retry=False,
+ ):
"""Fetch a given key from the cache. If the key does not exist, return
default, which itself defaults to None.
@@ -111,7 +124,6 @@ class DjangoCache(BaseCache):
key = self.make_key(key, version=version)
return self._cache.get(key, default, read, expire_time, tag, retry)
-
def read(self, key, version=None):
"""Return file handle corresponding to `key` from Cache.
@@ -124,9 +136,16 @@ class DjangoCache(BaseCache):
key = self.make_key(key, version=version)
return self._cache.read(key)
-
- def set(self, key, value, timeout=DEFAULT_TIMEOUT, version=None,
- read=False, tag=None, retry=True):
+ def set(
+ self,
+ key,
+ value,
+ timeout=DEFAULT_TIMEOUT,
+ version=None,
+ read=False,
+ tag=None,
+ retry=True,
+ ):
"""Set a value in the cache. If timeout is given, that timeout will be
used for the key; otherwise the default cache timeout will be used.
@@ -146,7 +165,6 @@ class DjangoCache(BaseCache):
timeout = self.get_backend_timeout(timeout=timeout)
return self._cache.set(key, value, timeout, read, tag, retry)
-
def touch(self, key, timeout=DEFAULT_TIMEOUT, version=None, retry=True):
"""Touch a key in the cache. If timeout is given, that timeout will be
used for the key; otherwise the default cache timeout will be used.
@@ -164,9 +182,15 @@ class DjangoCache(BaseCache):
timeout = self.get_backend_timeout(timeout=timeout)
return self._cache.touch(key, timeout, retry)
-
- def pop(self, key, default=None, version=None, expire_time=False,
- tag=False, retry=True):
+ def pop(
+ self,
+ key,
+ default=None,
+ version=None,
+ expire_time=False,
+ tag=False,
+ retry=True,
+ ):
"""Remove corresponding item for `key` from cache and return value.
If `key` is missing, return `default`.
@@ -186,7 +210,6 @@ class DjangoCache(BaseCache):
key = self.make_key(key, version=version)
return self._cache.pop(key, default, expire_time, tag, retry)
-
def delete(self, key, version=None, retry=True):
"""Delete a key from the cache, failing silently.
@@ -198,8 +221,7 @@ class DjangoCache(BaseCache):
"""
# pylint: disable=arguments-differ
key = self.make_key(key, version=version)
- self._cache.delete(key, retry)
-
+ return self._cache.delete(key, retry)
def incr(self, key, delta=1, version=None, default=None, retry=True):
"""Increment value by delta for item with key.
@@ -228,8 +250,7 @@ class DjangoCache(BaseCache):
try:
return self._cache.incr(key, delta, default, retry)
except KeyError:
- raise ValueError("Key '%s' not found" % key)
-
+ raise ValueError("Key '%s' not found" % key) from None
def decr(self, key, delta=1, version=None, default=None, retry=True):
"""Decrement value by delta for item with key.
@@ -259,7 +280,6 @@ class DjangoCache(BaseCache):
# pylint: disable=arguments-differ
return self.incr(key, -delta, version, default, retry)
-
def has_key(self, key, version=None):
"""Returns True if the key is in the cache and has not expired.
@@ -271,7 +291,6 @@ class DjangoCache(BaseCache):
key = self.make_key(key, version=version)
return key in self._cache
-
def expire(self):
"""Remove expired items from cache.
@@ -280,7 +299,6 @@ class DjangoCache(BaseCache):
"""
return self._cache.expire()
-
def stats(self, enable=True, reset=False):
"""Return cache statistics hits and misses.
@@ -291,7 +309,6 @@ class DjangoCache(BaseCache):
"""
return self._cache.stats(enable=enable, reset=reset)
-
def create_tag_index(self):
"""Create tag index on cache database.
@@ -302,7 +319,6 @@ class DjangoCache(BaseCache):
"""
self._cache.create_tag_index()
-
def drop_tag_index(self):
"""Drop tag index on cache database.
@@ -311,7 +327,6 @@ class DjangoCache(BaseCache):
"""
self._cache.drop_tag_index()
-
def evict(self, tag):
"""Remove items with matching `tag` from cache.
@@ -321,7 +336,6 @@ class DjangoCache(BaseCache):
"""
return self._cache.evict(tag)
-
def cull(self):
"""Cull items from cache until volume is less than size limit.
@@ -330,18 +344,15 @@ class DjangoCache(BaseCache):
"""
return self._cache.cull()
-
def clear(self):
- "Remove *all* values from the cache at once."
+ """Remove *all* values from the cache at once."""
return self._cache.clear()
-
def close(self, **kwargs):
- "Close the cache connection."
+ """Close the cache connection."""
# pylint: disable=unused-argument
self._cache.close()
-
def get_backend_timeout(self, timeout=DEFAULT_TIMEOUT):
"""Return seconds to expiration.
@@ -356,9 +367,15 @@ class DjangoCache(BaseCache):
timeout = -1
return None if timeout is None else timeout
-
- def memoize(self, name=None, timeout=DEFAULT_TIMEOUT, version=None,
- typed=False, tag=None):
+ def memoize(
+ self,
+ name=None,
+ timeout=DEFAULT_TIMEOUT,
+ version=None,
+ typed=False,
+ tag=None,
+ ignore=(),
+ ):
"""Memoizing cache decorator.
Decorator to wrap callable with memoizing function using cache.
@@ -392,6 +409,7 @@ class DjangoCache(BaseCache):
:param int version: key version number (default None, cache parameter)
:param bool typed: cache different types separately (default False)
:param str tag: text to associate with arguments (default None)
+ :param set ignore: positional or keyword args to ignore (default ())
:return: callable decorator
"""
@@ -400,12 +418,12 @@ class DjangoCache(BaseCache):
raise TypeError('name cannot be callable')
def decorator(func):
- "Decorator created by memoize() for callable `func`."
+ """Decorator created by memoize() for callable `func`."""
base = (full_name(func),) if name is None else (name,)
@wraps(func)
def wrapper(*args, **kwargs):
- "Wrapper for callable to cache arguments and return values."
+ """Wrapper for callable to cache arguments and return values."""
key = wrapper.__cache_key__(*args, **kwargs)
result = self.get(key, ENOVAL, version, retry=True)
@@ -418,14 +436,19 @@ class DjangoCache(BaseCache):
)
if valid_timeout:
self.set(
- key, result, timeout, version, tag=tag, retry=True,
+ key,
+ result,
+ timeout,
+ version,
+ tag=tag,
+ retry=True,
)
return result
def __cache_key__(*args, **kwargs):
- "Make key for cache given function arguments."
- return args_to_key(base, args, kwargs, typed)
+ """Make key for cache given function arguments."""
+ return args_to_key(base, args, kwargs, typed, ignore)
wrapper.__cache_key__ = __cache_key__
return wrapper
diff --git a/third_party/python/diskcache/diskcache/fanout.py b/third_party/python/diskcache/diskcache/fanout.py
index 8a0a722ae6e1..9822ee4e576b 100644
--- a/third_party/python/diskcache/diskcache/fanout.py
+++ b/third_party/python/diskcache/diskcache/fanout.py
@@ -1,32 +1,24 @@
-"Fanout cache automatically shards keys and values."
+"""Fanout cache automatically shards keys and values."""
+import contextlib as cl
+import functools
import itertools as it
import operator
import os.path as op
import sqlite3
-import sys
import tempfile
import time
-from .core import ENOVAL, DEFAULT_SETTINGS, Cache, Disk, Timeout
+from .core import DEFAULT_SETTINGS, ENOVAL, Cache, Disk, Timeout
from .persistent import Deque, Index
-############################################################################
-# BEGIN Python 2/3 Shims
-############################################################################
-if sys.hexversion >= 0x03000000:
- from functools import reduce
+class FanoutCache:
+ """Cache that shards keys and values."""
-############################################################################
-# END Python 2/3 Shims
-############################################################################
-
-
-class FanoutCache(object):
- "Cache that shards keys and values."
- def __init__(self, directory=None, shards=8, timeout=0.010, disk=Disk,
- **settings):
+ def __init__(
+ self, directory=None, shards=8, timeout=0.010, disk=Disk, **settings
+ ):
"""Initialize cache instance.
:param str directory: cache directory
@@ -38,6 +30,7 @@ class FanoutCache(object):
"""
if directory is None:
directory = tempfile.mkdtemp(prefix='diskcache-')
+ directory = str(directory)
directory = op.expanduser(directory)
directory = op.expandvars(directory)
@@ -46,13 +39,14 @@ class FanoutCache(object):
self._count = shards
self._directory = directory
+ self._disk = disk
self._shards = tuple(
Cache(
directory=op.join(directory, '%03d' % num),
timeout=timeout,
disk=disk,
size_limit=size_limit,
- **settings
+ **settings,
)
for num in range(shards)
)
@@ -61,16 +55,49 @@ class FanoutCache(object):
self._deques = {}
self._indexes = {}
-
@property
def directory(self):
"""Cache directory."""
return self._directory
-
def __getattr__(self, name):
+ safe_names = {'timeout', 'disk'}
+ valid_name = name in DEFAULT_SETTINGS or name in safe_names
+ assert valid_name, 'cannot access {} in cache shard'.format(name)
return getattr(self._shards[0], name)
+ @cl.contextmanager
+ def transact(self, retry=True):
+ """Context manager to perform a transaction by locking the cache.
+
+ While the cache is locked, no other write operation is permitted.
+ Transactions should therefore be as short as possible. Read and write
+ operations performed in a transaction are atomic. Read operations may
+ occur concurrent to a transaction.
+
+ Transactions may be nested and may not be shared between threads.
+
+ Blocks until transactions are held on all cache shards by retrying as
+ necessary.
+
+ >>> cache = FanoutCache()
+ >>> with cache.transact(): # Atomically increment two keys.
+ ... _ = cache.incr('total', 123.4)
+ ... _ = cache.incr('count', 1)
+ >>> with cache.transact(): # Atomically calculate average.
+ ... average = cache['total'] / cache['count']
+ >>> average
+ 123.4
+
+ :return: context manager for use in `with` statement
+
+ """
+ assert retry, 'retry must be True in FanoutCache'
+ with cl.ExitStack() as stack:
+ for shard in self._shards:
+ shard_transaction = shard.transact(retry=True)
+ stack.enter_context(shard_transaction)
+ yield
def set(self, key, value, expire=None, read=False, tag=None, retry=False):
"""Set `key` and `value` item in cache.
@@ -98,7 +125,6 @@ class FanoutCache(object):
except Timeout:
return False
-
def __setitem__(self, key, value):
"""Set `key` and `value` item in cache.
@@ -112,7 +138,6 @@ class FanoutCache(object):
shard = self._shards[index]
shard[key] = value
-
def touch(self, key, expire=None, retry=False):
"""Touch `key` in cache and update `expire` time.
@@ -133,7 +158,6 @@ class FanoutCache(object):
except Timeout:
return False
-
def add(self, key, value, expire=None, read=False, tag=None, retry=False):
"""Add `key` and `value` item to cache.
@@ -165,7 +189,6 @@ class FanoutCache(object):
except Timeout:
return False
-
def incr(self, key, delta=1, default=0, retry=False):
"""Increment value by delta for item with key.
@@ -197,7 +220,6 @@ class FanoutCache(object):
except Timeout:
return None
-
def decr(self, key, delta=1, default=0, retry=False):
"""Decrement value by delta for item with key.
@@ -232,9 +254,15 @@ class FanoutCache(object):
except Timeout:
return None
-
- def get(self, key, default=None, read=False, expire_time=False, tag=False,
- retry=False):
+ def get(
+ self,
+ key,
+ default=None,
+ read=False,
+ expire_time=False,
+ tag=False,
+ retry=False,
+ ):
"""Retrieve value from cache. If `key` is missing, return `default`.
If database timeout occurs then returns `default` unless `retry` is set
@@ -258,7 +286,6 @@ class FanoutCache(object):
except (Timeout, sqlite3.OperationalError):
return default
-
def __getitem__(self, key):
"""Return corresponding value for `key` from cache.
@@ -273,7 +300,6 @@ class FanoutCache(object):
shard = self._shards[index]
return shard[key]
-
def read(self, key):
"""Return file handle corresponding to `key` from cache.
@@ -287,7 +313,6 @@ class FanoutCache(object):
raise KeyError(key)
return handle
-
def __contains__(self, key):
"""Return `True` if `key` matching item is found in cache.
@@ -299,8 +324,9 @@ class FanoutCache(object):
shard = self._shards[index]
return key in shard
-
- def pop(self, key, default=None, expire_time=False, tag=False, retry=False):
+ def pop(
+ self, key, default=None, expire_time=False, tag=False, retry=False
+ ): # noqa: E501
"""Remove corresponding item for `key` from cache and return value.
If `key` is missing, return `default`.
@@ -326,7 +352,6 @@ class FanoutCache(object):
except Timeout:
return default
-
def delete(self, key, retry=False):
"""Delete corresponding item for `key` from cache.
@@ -347,7 +372,6 @@ class FanoutCache(object):
except Timeout:
return False
-
def __delitem__(self, key):
"""Delete corresponding item for `key` from cache.
@@ -361,7 +385,6 @@ class FanoutCache(object):
shard = self._shards[index]
del shard[key]
-
def check(self, fix=False, retry=False):
"""Check database and file system consistency.
@@ -383,8 +406,7 @@ class FanoutCache(object):
"""
warnings = (shard.check(fix, retry) for shard in self._shards)
- return reduce(operator.iadd, warnings, [])
-
+ return functools.reduce(operator.iadd, warnings, [])
def expire(self, retry=False):
"""Remove expired items from cache.
@@ -398,7 +420,6 @@ class FanoutCache(object):
"""
return self._remove('expire', args=(time.time(),), retry=retry)
-
def create_tag_index(self):
"""Create tag index on cache database.
@@ -410,7 +431,6 @@ class FanoutCache(object):
for shard in self._shards:
shard.create_tag_index()
-
def drop_tag_index(self):
"""Drop tag index on cache database.
@@ -420,7 +440,6 @@ class FanoutCache(object):
for shard in self._shards:
shard.drop_tag_index()
-
def evict(self, tag, retry=False):
"""Remove items with matching `tag` from cache.
@@ -434,7 +453,6 @@ class FanoutCache(object):
"""
return self._remove('evict', args=(tag,), retry=retry)
-
def cull(self, retry=False):
"""Cull items from cache until volume is less than size limit.
@@ -447,7 +465,6 @@ class FanoutCache(object):
"""
return self._remove('cull', retry=retry)
-
def clear(self, retry=False):
"""Remove all items from cache.
@@ -460,7 +477,6 @@ class FanoutCache(object):
"""
return self._remove('clear', retry=retry)
-
def _remove(self, name, args=(), retry=False):
total = 0
for shard in self._shards:
@@ -475,7 +491,6 @@ class FanoutCache(object):
break
return total
-
def stats(self, enable=True, reset=False):
"""Return cache statistics hits and misses.
@@ -489,7 +504,6 @@ class FanoutCache(object):
total_misses = sum(misses for _, misses in results)
return total_hits, total_misses
-
def volume(self):
"""Return estimated total size of cache on disk.
@@ -498,49 +512,40 @@ class FanoutCache(object):
"""
return sum(shard.volume() for shard in self._shards)
-
def close(self):
- "Close database connection."
+ """Close database connection."""
for shard in self._shards:
shard.close()
self._caches.clear()
self._deques.clear()
self._indexes.clear()
-
def __enter__(self):
return self
-
def __exit__(self, *exception):
self.close()
-
def __getstate__(self):
return (self._directory, self._count, self.timeout, type(self.disk))
-
def __setstate__(self, state):
self.__init__(*state)
-
def __iter__(self):
- "Iterate keys in cache including expired items."
+ """Iterate keys in cache including expired items."""
iterators = (iter(shard) for shard in self._shards)
return it.chain.from_iterable(iterators)
-
def __reversed__(self):
- "Reverse iterate keys in cache including expired items."
+ """Reverse iterate keys in cache including expired items."""
iterators = (reversed(shard) for shard in reversed(self._shards))
return it.chain.from_iterable(iterators)
-
def __len__(self):
- "Count of items in cache including expired items."
+ """Count of items in cache including expired items."""
return sum(len(shard) for shard in self._shards)
-
def reset(self, key, value=ENOVAL):
"""Reset `key` and `value` item from Settings table.
@@ -569,10 +574,11 @@ class FanoutCache(object):
break
return result
-
- def cache(self, name):
+ def cache(self, name, timeout=60, disk=None, **settings):
"""Return Cache with given `name` in subdirectory.
+ If disk is none (default), uses the fanout cache disk.
+
>>> fanout_cache = FanoutCache()
>>> cache = fanout_cache.cache('test')
>>> cache.set('abc', 123)
@@ -585,6 +591,9 @@ class FanoutCache(object):
True
:param str name: subdirectory name for Cache
+ :param float timeout: SQLite connection timeout
+ :param disk: Disk type or subclass for serialization
+ :param settings: any of DEFAULT_SETTINGS
:return: Cache with given name
"""
@@ -595,12 +604,16 @@ class FanoutCache(object):
except KeyError:
parts = name.split('/')
directory = op.join(self._directory, 'cache', *parts)
- temp = Cache(directory=directory)
+ temp = Cache(
+ directory=directory,
+ timeout=timeout,
+ disk=self._disk if disk is None else Disk,
+ **settings,
+ )
_caches[name] = temp
return temp
-
- def deque(self, name):
+ def deque(self, name, maxlen=None):
"""Return Deque with given `name` in subdirectory.
>>> cache = FanoutCache()
@@ -614,6 +627,7 @@ class FanoutCache(object):
1
:param str name: subdirectory name for Deque
+ :param maxlen: max length (default None, no max)
:return: Deque with given name
"""
@@ -624,10 +638,14 @@ class FanoutCache(object):
except KeyError:
parts = name.split('/')
directory = op.join(self._directory, 'deque', *parts)
- temp = Deque(directory=directory)
- _deques[name] = temp
- return temp
-
+ cache = Cache(
+ directory=directory,
+ disk=self._disk,
+ eviction_policy='none',
+ )
+ deque = Deque.fromcache(cache, maxlen=maxlen)
+ _deques[name] = deque
+ return deque
def index(self, name):
"""Return Index with given `name` in subdirectory.
@@ -656,22 +674,14 @@ class FanoutCache(object):
except KeyError:
parts = name.split('/')
directory = op.join(self._directory, 'index', *parts)
- temp = Index(directory)
- _indexes[name] = temp
- return temp
+ cache = Cache(
+ directory=directory,
+ disk=self._disk,
+ eviction_policy='none',
+ )
+ index = Index.fromcache(cache)
+ _indexes[name] = index
+ return index
-############################################################################
-# BEGIN Python 2/3 Shims
-############################################################################
-
-if sys.hexversion < 0x03000000:
- import types
- memoize_func = Cache.__dict__['memoize'] # pylint: disable=invalid-name
- FanoutCache.memoize = types.MethodType(memoize_func, None, FanoutCache)
-else:
- FanoutCache.memoize = Cache.memoize
-
-############################################################################
-# END Python 2/3 Shims
-############################################################################
+FanoutCache.memoize = Cache.memoize # type: ignore
diff --git a/third_party/python/diskcache/diskcache/persistent.py b/third_party/python/diskcache/diskcache/persistent.py
index 961f77361f87..522bb74c5b1e 100644
--- a/third_party/python/diskcache/diskcache/persistent.py
+++ b/third_party/python/diskcache/diskcache/persistent.py
@@ -1,40 +1,26 @@
"""Persistent Data Types
-
"""
import operator as op
-import sys
-
from collections import OrderedDict
+from collections.abc import (
+ ItemsView,
+ KeysView,
+ MutableMapping,
+ Sequence,
+ ValuesView,
+)
from contextlib import contextmanager
from shutil import rmtree
-from .core import BytesType, Cache, ENOVAL, TextType
-
-############################################################################
-# BEGIN Python 2/3 Shims
-############################################################################
-
-try:
- from collections.abc import MutableMapping, Sequence
- from collections.abc import KeysView, ValuesView, ItemsView
-except ImportError:
- from collections import MutableMapping, Sequence
- from collections import KeysView, ValuesView, ItemsView
-
-if sys.hexversion < 0x03000000:
- from itertools import izip as zip # pylint: disable=redefined-builtin,no-name-in-module,ungrouped-imports
- range = xrange # pylint: disable=redefined-builtin,invalid-name,undefined-variable
-
-############################################################################
-# END Python 2/3 Shims
-############################################################################
+from .core import ENOVAL, Cache
def _make_compare(seq_op, doc):
- "Make compare method with Sequence semantics."
+ """Make compare method with Sequence semantics."""
+
def compare(self, that):
- "Compare method for deque and sequence."
+ """Compare method for deque and sequence."""
if not isinstance(that, Sequence):
return NotImplemented
@@ -88,7 +74,8 @@ class Deque(Sequence):
[3, 2, 1, 0, 0, -1, -2, -3]
"""
- def __init__(self, iterable=(), directory=None):
+
+ def __init__(self, iterable=(), directory=None, maxlen=None):
"""Initialize deque instance.
If directory is None then temporary directory created. The directory
@@ -99,12 +86,11 @@ class Deque(Sequence):
"""
self._cache = Cache(directory, eviction_policy='none')
- with self.transact():
- self.extend(iterable)
-
+ self._maxlen = float('inf') if maxlen is None else maxlen
+ self._extend(iterable)
@classmethod
- def fromcache(cls, cache, iterable=()):
+ def fromcache(cls, cache, iterable=(), maxlen=None):
"""Initialize deque using `cache`.
>>> cache = Cache()
@@ -126,21 +112,44 @@ class Deque(Sequence):
# pylint: disable=no-member,protected-access
self = cls.__new__(cls)
self._cache = cache
- self.extend(iterable)
+ self._maxlen = float('inf') if maxlen is None else maxlen
+ self._extend(iterable)
return self
-
@property
def cache(self):
- "Cache used by deque."
+ """Cache used by deque."""
return self._cache
-
@property
def directory(self):
- "Directory path where deque is stored."
+ """Directory path where deque is stored."""
return self._cache.directory
+ @property
+ def maxlen(self):
+ """Max length of the deque."""
+ return self._maxlen
+
+ @maxlen.setter
+ def maxlen(self, value):
+ """Set max length of the deque.
+
+ Pops items from left while length greater than max.
+
+ >>> deque = Deque()
+ >>> deque.extendleft('abcde')
+ >>> deque.maxlen = 3
+ >>> list(deque)
+ ['c', 'd', 'e']
+
+ :param value: max length
+
+ """
+ self._maxlen = value
+ with self._cache.transact(retry=True):
+ while len(self._cache) > self._maxlen:
+ self._popleft()
def _index(self, index, func):
len_self = len(self)
@@ -172,7 +181,6 @@ class Deque(Sequence):
raise IndexError('deque index out of range')
-
def __getitem__(self, index):
"""deque.__getitem__(index) <==> deque[index]
@@ -195,7 +203,6 @@ class Deque(Sequence):
"""
return self._index(index, self._cache.__getitem__)
-
def __setitem__(self, index, value):
"""deque.__setitem__(index, value) <==> deque[index] = value
@@ -214,9 +221,11 @@ class Deque(Sequence):
:raises IndexError: if index out of range
"""
- set_value = lambda key: self._cache.__setitem__(key, value)
- self._index(index, set_value)
+ def _set_value(key):
+ return self._cache.__setitem__(key, value)
+
+ self._index(index, _set_value)
def __delitem__(self, index):
"""deque.__delitem__(index) <==> del deque[index]
@@ -237,7 +246,6 @@ class Deque(Sequence):
"""
self._index(index, self._cache.__delitem__)
-
def __repr__(self):
"""deque.__repr__() <==> repr(deque)
@@ -247,7 +255,6 @@ class Deque(Sequence):
name = type(self).__name__
return '{0}(directory={1!r})'.format(name, self.directory)
-
__eq__ = _make_compare(op.eq, 'equal to')
__ne__ = _make_compare(op.ne, 'not equal to')
__lt__ = _make_compare(op.lt, 'less than')
@@ -255,7 +262,6 @@ class Deque(Sequence):
__le__ = _make_compare(op.le, 'less than or equal to')
__ge__ = _make_compare(op.ge, 'greater than or equal to')
-
def __iadd__(self, iterable):
"""deque.__iadd__(iterable) <==> deque += iterable
@@ -265,10 +271,9 @@ class Deque(Sequence):
:return: deque with added items
"""
- self.extend(iterable)
+ self._extend(iterable)
return self
-
def __iter__(self):
"""deque.__iter__() <==> iter(deque)
@@ -283,7 +288,6 @@ class Deque(Sequence):
except KeyError:
pass
-
def __len__(self):
"""deque.__len__() <==> len(deque)
@@ -292,7 +296,6 @@ class Deque(Sequence):
"""
return len(self._cache)
-
def __reversed__(self):
"""deque.__reversed__() <==> reversed(deque)
@@ -315,14 +318,12 @@ class Deque(Sequence):
except KeyError:
pass
-
def __getstate__(self):
- return self.directory
-
+ return self.directory, self.maxlen
def __setstate__(self, state):
- self.__init__(directory=state)
-
+ directory, maxlen = state
+ self.__init__(directory=directory, maxlen=maxlen)
def append(self, value):
"""Add `value` to back of deque.
@@ -337,8 +338,12 @@ class Deque(Sequence):
:param value: value to add to back of deque
"""
- self._cache.push(value, retry=True)
+ with self._cache.transact(retry=True):
+ self._cache.push(value, retry=True)
+ if len(self._cache) > self._maxlen:
+ self._popleft()
+ _append = append
def appendleft(self, value):
"""Add `value` to front of deque.
@@ -353,8 +358,12 @@ class Deque(Sequence):
:param value: value to add to front of deque
"""
- self._cache.push(value, side='front', retry=True)
+ with self._cache.transact(retry=True):
+ self._cache.push(value, side='front', retry=True)
+ if len(self._cache) > self._maxlen:
+ self._pop()
+ _appendleft = appendleft
def clear(self):
"""Remove all elements from deque.
@@ -369,6 +378,12 @@ class Deque(Sequence):
"""
self._cache.clear(retry=True)
+ _clear = clear
+
+ def copy(self):
+ """Copy deque with same directory and max length."""
+ TypeSelf = type(self)
+ return TypeSelf(directory=self.directory, maxlen=self.maxlen)
def count(self, value):
"""Return number of occurrences of `value` in deque.
@@ -388,7 +403,6 @@ class Deque(Sequence):
"""
return sum(1 for item in self if value == item)
-
def extend(self, iterable):
"""Extend back side of deque with values from `iterable`.
@@ -396,8 +410,9 @@ class Deque(Sequence):
"""
for value in iterable:
- self.append(value)
+ self._append(value)
+ _extend = extend
def extendleft(self, iterable):
"""Extend front side of deque with value from `iterable`.
@@ -411,8 +426,7 @@ class Deque(Sequence):
"""
for value in iterable:
- self.appendleft(value)
-
+ self._appendleft(value)
def peek(self):
"""Peek at value at back of deque.
@@ -440,9 +454,8 @@ class Deque(Sequence):
raise IndexError('peek from an empty deque')
return value
-
def peekleft(self):
- """Peek at value at back of deque.
+ """Peek at value at front of deque.
Faster than indexing deque at 0.
@@ -467,7 +480,6 @@ class Deque(Sequence):
raise IndexError('peek from an empty deque')
return value
-
def pop(self):
"""Remove and return value at back of deque.
@@ -494,6 +506,7 @@ class Deque(Sequence):
raise IndexError('pop from an empty deque')
return value
+ _pop = pop
def popleft(self):
"""Remove and return value at front of deque.
@@ -519,6 +532,7 @@ class Deque(Sequence):
raise IndexError('pop from an empty deque')
return value
+ _popleft = popleft
def remove(self, value):
"""Remove first occurrence of `value` in deque.
@@ -557,7 +571,6 @@ class Deque(Sequence):
raise ValueError('deque.remove(value): value not in deque')
-
def reverse(self):
"""Reverse deque in place.
@@ -568,19 +581,20 @@ class Deque(Sequence):
['c', 'b', 'a']
"""
+ # pylint: disable=protected-access
# GrantJ 2019-03-22 Consider using an algorithm that swaps the values
# at two keys. Like self._cache.swap(key1, key2, retry=True) The swap
# method would exchange the values at two given keys. Then, using a
- # forward iterator and a reverse iterator, the reversis method could
+ # forward iterator and a reverse iterator, the reverse method could
# avoid making copies of the values.
temp = Deque(iterable=reversed(self))
- self.clear()
- self.extend(temp)
+ self._clear()
+ self._extend(temp)
directory = temp.directory
+ temp._cache.close()
del temp
rmtree(directory)
-
def rotate(self, steps=1):
"""Rotate deque right by `steps`.
@@ -612,26 +626,24 @@ class Deque(Sequence):
for _ in range(steps):
try:
- value = self.pop()
+ value = self._pop()
except IndexError:
return
else:
- self.appendleft(value)
+ self._appendleft(value)
else:
steps *= -1
steps %= len_self
for _ in range(steps):
try:
- value = self.popleft()
+ value = self._popleft()
except IndexError:
return
else:
- self.append(value)
-
-
- __hash__ = None
+ self._append(value)
+ __hash__ = None # type: ignore
@contextmanager
def transact(self):
@@ -682,6 +694,7 @@ class Index(MutableMapping):
('c', 3)
"""
+
def __init__(self, *args, **kwargs):
"""Initialize index in directory and update items.
@@ -699,7 +712,7 @@ class Index(MutableMapping):
4
"""
- if args and isinstance(args[0], (BytesType, TextType)):
+ if args and isinstance(args[0], (bytes, str)):
directory = args[0]
args = args[1:]
else:
@@ -707,8 +720,9 @@ class Index(MutableMapping):
args = args[1:]
directory = None
self._cache = Cache(directory, eviction_policy='none')
- self.update(*args, **kwargs)
+ self._update(*args, **kwargs)
+ _update = MutableMapping.update
@classmethod
def fromcache(cls, cache, *args, **kwargs):
@@ -734,22 +748,19 @@ class Index(MutableMapping):
# pylint: disable=no-member,protected-access
self = cls.__new__(cls)
self._cache = cache
- self.update(*args, **kwargs)
+ self._update(*args, **kwargs)
return self
-
@property
def cache(self):
- "Cache used by index."
+ """Cache used by index."""
return self._cache
-
@property
def directory(self):
- "Directory path where items are stored."
+ """Directory path where items are stored."""
return self._cache.directory
-
def __getitem__(self, key):
"""index.__getitem__(key) <==> index[key]
@@ -773,7 +784,6 @@ class Index(MutableMapping):
"""
return self._cache[key]
-
def __setitem__(self, key, value):
"""index.__setitem__(key, value) <==> index[key] = value
@@ -791,7 +801,6 @@ class Index(MutableMapping):
"""
self._cache[key] = value
-
def __delitem__(self, key):
"""index.__delitem__(key) <==> del index[key]
@@ -814,7 +823,6 @@ class Index(MutableMapping):
"""
del self._cache[key]
-
def setdefault(self, key, default=None):
"""Set and get value for `key` in index using `default`.
@@ -839,7 +847,6 @@ class Index(MutableMapping):
except KeyError:
_cache.add(key, default, retry=True)
-
def peekitem(self, last=True):
"""Peek at key and value item pair in index based on iteration order.
@@ -858,7 +865,6 @@ class Index(MutableMapping):
"""
return self._cache.peekitem(last, retry=True)
-
def pop(self, key, default=ENOVAL):
"""Remove corresponding item for `key` from index and return value.
@@ -889,7 +895,6 @@ class Index(MutableMapping):
raise KeyError(key)
return value
-
def popitem(self, last=True):
"""Remove and return item pair.
@@ -915,7 +920,7 @@ class Index(MutableMapping):
:raises KeyError: if index is empty
"""
- # pylint: disable=arguments-differ
+ # pylint: disable=arguments-differ,unbalanced-tuple-unpacking
_cache = self._cache
with _cache.transact(retry=True):
@@ -924,7 +929,6 @@ class Index(MutableMapping):
return key, value
-
def push(self, value, prefix=None, side='back'):
"""Push `value` onto `side` of queue in index identified by `prefix`.
@@ -956,7 +960,6 @@ class Index(MutableMapping):
"""
return self._cache.push(value, prefix, side, retry=True)
-
def pull(self, prefix=None, default=(None, None), side='front'):
"""Pull key and value item pair from `side` of queue in index.
@@ -997,7 +1000,6 @@ class Index(MutableMapping):
"""
return self._cache.pull(prefix, default, side, retry=True)
-
def clear(self):
"""Remove all items from index.
@@ -1011,7 +1013,6 @@ class Index(MutableMapping):
"""
self._cache.clear(retry=True)
-
def __iter__(self):
"""index.__iter__() <==> iter(index)
@@ -1020,7 +1021,6 @@ class Index(MutableMapping):
"""
return iter(self._cache)
-
def __reversed__(self):
"""index.__reversed__() <==> reversed(index)
@@ -1037,7 +1037,6 @@ class Index(MutableMapping):
"""
return reversed(self._cache)
-
def __len__(self):
"""index.__len__() <==> len(index)
@@ -1046,210 +1045,56 @@ class Index(MutableMapping):
"""
return len(self._cache)
+ def keys(self):
+ """Set-like object providing a view of index keys.
- if sys.hexversion < 0x03000000:
- def keys(self):
- """List of index keys.
+ >>> index = Index()
+ >>> index.update({'a': 1, 'b': 2, 'c': 3})
+ >>> keys_view = index.keys()
+ >>> 'b' in keys_view
+ True
- >>> index = Index()
- >>> index.update([('a', 1), ('b', 2), ('c', 3)])
- >>> index.keys()
- ['a', 'b', 'c']
+ :return: keys view
- :return: list of keys
+ """
+ return KeysView(self)
- """
- return list(self._cache)
+ def values(self):
+ """Set-like object providing a view of index values.
+ >>> index = Index()
+ >>> index.update({'a': 1, 'b': 2, 'c': 3})
+ >>> values_view = index.values()
+ >>> 2 in values_view
+ True
- def values(self):
- """List of index values.
+ :return: values view
- >>> index = Index()
- >>> index.update([('a', 1), ('b', 2), ('c', 3)])
- >>> index.values()
- [1, 2, 3]
+ """
+ return ValuesView(self)
- :return: list of values
+ def items(self):
+ """Set-like object providing a view of index items.
- """
- return list(self.itervalues())
+ >>> index = Index()
+ >>> index.update({'a': 1, 'b': 2, 'c': 3})
+ >>> items_view = index.items()
+ >>> ('b', 2) in items_view
+ True
+ :return: items view
- def items(self):
- """List of index items.
-
- >>> index = Index()
- >>> index.update([('a', 1), ('b', 2), ('c', 3)])
- >>> index.items()
- [('a', 1), ('b', 2), ('c', 3)]
-
- :return: list of items
-
- """
- return list(self.iteritems())
-
-
- def iterkeys(self):
- """Iterator of index keys.
-
- >>> index = Index()
- >>> index.update([('a', 1), ('b', 2), ('c', 3)])
- >>> list(index.iterkeys())
- ['a', 'b', 'c']
-
- :return: iterator of keys
-
- """
- return iter(self._cache)
-
-
- def itervalues(self):
- """Iterator of index values.
-
- >>> index = Index()
- >>> index.update([('a', 1), ('b', 2), ('c', 3)])
- >>> list(index.itervalues())
- [1, 2, 3]
-
- :return: iterator of values
-
- """
- _cache = self._cache
-
- for key in _cache:
- while True:
- try:
- yield _cache[key]
- except KeyError:
- pass
- break
-
-
- def iteritems(self):
- """Iterator of index items.
-
- >>> index = Index()
- >>> index.update([('a', 1), ('b', 2), ('c', 3)])
- >>> list(index.iteritems())
- [('a', 1), ('b', 2), ('c', 3)]
-
- :return: iterator of items
-
- """
- _cache = self._cache
-
- for key in _cache:
- while True:
- try:
- yield key, _cache[key]
- except KeyError:
- pass
- break
-
-
- def viewkeys(self):
- """Set-like object providing a view of index keys.
-
- >>> index = Index()
- >>> index.update({'a': 1, 'b': 2, 'c': 3})
- >>> keys_view = index.viewkeys()
- >>> 'b' in keys_view
- True
-
- :return: keys view
-
- """
- return KeysView(self)
-
-
- def viewvalues(self):
- """Set-like object providing a view of index values.
-
- >>> index = Index()
- >>> index.update({'a': 1, 'b': 2, 'c': 3})
- >>> values_view = index.viewvalues()
- >>> 2 in values_view
- True
-
- :return: values view
-
- """
- return ValuesView(self)
-
-
- def viewitems(self):
- """Set-like object providing a view of index items.
-
- >>> index = Index()
- >>> index.update({'a': 1, 'b': 2, 'c': 3})
- >>> items_view = index.viewitems()
- >>> ('b', 2) in items_view
- True
-
- :return: items view
-
- """
- return ItemsView(self)
-
-
- else:
- def keys(self):
- """Set-like object providing a view of index keys.
-
- >>> index = Index()
- >>> index.update({'a': 1, 'b': 2, 'c': 3})
- >>> keys_view = index.keys()
- >>> 'b' in keys_view
- True
-
- :return: keys view
-
- """
- return KeysView(self)
-
-
- def values(self):
- """Set-like object providing a view of index values.
-
- >>> index = Index()
- >>> index.update({'a': 1, 'b': 2, 'c': 3})
- >>> values_view = index.values()
- >>> 2 in values_view
- True
-
- :return: values view
-
- """
- return ValuesView(self)
-
-
- def items(self):
- """Set-like object providing a view of index items.
-
- >>> index = Index()
- >>> index.update({'a': 1, 'b': 2, 'c': 3})
- >>> items_view = index.items()
- >>> ('b', 2) in items_view
- True
-
- :return: items view
-
- """
- return ItemsView(self)
-
-
- __hash__ = None
+ """
+ return ItemsView(self)
+ __hash__ = None # type: ignore
def __getstate__(self):
return self.directory
-
def __setstate__(self, state):
self.__init__(state)
-
def __eq__(self, other):
"""index.__eq__(other) <==> index == other
@@ -1283,7 +1128,6 @@ class Index(MutableMapping):
else:
return all(self[key] == other.get(key, ENOVAL) for key in self)
-
def __ne__(self, other):
"""index.__ne__(other) <==> index != other
@@ -1307,8 +1151,7 @@ class Index(MutableMapping):
"""
return not self == other
-
- def memoize(self, name=None, typed=False):
+ def memoize(self, name=None, typed=False, ignore=()):
"""Memoizing cache decorator.
Decorator to wrap callable with memoizing function using cache.
@@ -1359,11 +1202,11 @@ class Index(MutableMapping):
:param str name: name given for callable (default None, automatic)
:param bool typed: cache different types separately (default False)
+ :param set ignore: positional or keyword args to ignore (default ())
:return: callable decorator
"""
- return self._cache.memoize(name, typed)
-
+ return self._cache.memoize(name, typed, ignore=ignore)
@contextmanager
def transact(self):
@@ -1392,7 +1235,6 @@ class Index(MutableMapping):
with self._cache.transact(retry=True):
yield
-
def __repr__(self):
"""index.__repr__() <==> repr(index)
diff --git a/third_party/python/diskcache/diskcache/recipes.py b/third_party/python/diskcache/diskcache/recipes.py
index fb6425090a0a..babb68f67bd3 100644
--- a/third_party/python/diskcache/diskcache/recipes.py
+++ b/third_party/python/diskcache/diskcache/recipes.py
@@ -1,37 +1,25 @@
"""Disk Cache Recipes
-
"""
import functools
import math
import os
import random
-import sys
import threading
import time
from .core import ENOVAL, args_to_key, full_name
-############################################################################
-# BEGIN Python 2/3 Shims
-############################################################################
-if sys.hexversion < 0x03000000:
- from thread import get_ident # pylint: disable=import-error
-else:
- from threading import get_ident
-
-############################################################################
-# END Python 2/3 Shims
-############################################################################
-
-
-class Averager(object):
+class Averager:
"""Recipe for calculating a running average.
Sometimes known as "online statistics," the running average maintains the
total and count. The average can then be calculated at any time.
+ Assumes the key will not be evicted. Set the eviction policy to 'none' on
+ the cache to guarantee the key is not evicted.
+
>>> import diskcache
>>> cache = diskcache.FanoutCache()
>>> ave = Averager(cache, 'latency')
@@ -46,6 +34,7 @@ class Averager(object):
None
"""
+
def __init__(self, cache, key, expire=None, tag=None):
self._cache = cache
self._key = key
@@ -53,29 +42,35 @@ class Averager(object):
self._tag = tag
def add(self, value):
- "Add `value` to average."
+ """Add `value` to average."""
with self._cache.transact(retry=True):
total, count = self._cache.get(self._key, default=(0.0, 0))
total += value
count += 1
self._cache.set(
- self._key, (total, count), expire=self._expire, tag=self._tag,
+ self._key,
+ (total, count),
+ expire=self._expire,
+ tag=self._tag,
)
def get(self):
- "Get current average or return `None` if count equals zero."
+ """Get current average or return `None` if count equals zero."""
total, count = self._cache.get(self._key, default=(0.0, 0), retry=True)
return None if count == 0 else total / count
def pop(self):
- "Return current average and delete key."
+ """Return current average and delete key."""
total, count = self._cache.pop(self._key, default=(0.0, 0), retry=True)
return None if count == 0 else total / count
-class Lock(object):
+class Lock:
"""Recipe for cross-process and cross-thread lock.
+ Assumes the key will not be evicted. Set the eviction policy to 'none' on
+ the cache to guarantee the key is not evicted.
+
>>> import diskcache
>>> cache = diskcache.Cache()
>>> lock = Lock(cache, 'report-123')
@@ -85,6 +80,7 @@ class Lock(object):
... pass
"""
+
def __init__(self, cache, key, expire=None, tag=None):
self._cache = cache
self._key = key
@@ -92,19 +88,27 @@ class Lock(object):
self._tag = tag
def acquire(self):
- "Acquire lock using spin-lock algorithm."
+ """Acquire lock using spin-lock algorithm."""
while True:
added = self._cache.add(
- self._key, None, expire=self._expire, tag=self._tag, retry=True,
+ self._key,
+ None,
+ expire=self._expire,
+ tag=self._tag,
+ retry=True,
)
if added:
break
time.sleep(0.001)
def release(self):
- "Release lock by deleting key."
+ """Release lock by deleting key."""
self._cache.delete(self._key, retry=True)
+ def locked(self):
+ """Return true if the lock is acquired."""
+ return self._key in self._cache
+
def __enter__(self):
self.acquire()
@@ -112,9 +116,12 @@ class Lock(object):
self.release()
-class RLock(object):
+class RLock:
"""Recipe for cross-process and cross-thread re-entrant lock.
+ Assumes the key will not be evicted. Set the eviction policy to 'none' on
+ the cache to guarantee the key is not evicted.
+
>>> import diskcache
>>> cache = diskcache.Cache()
>>> rlock = RLock(cache, 'user-123')
@@ -130,6 +137,7 @@ class RLock(object):
AssertionError: cannot release un-acquired lock
"""
+
def __init__(self, cache, key, expire=None, tag=None):
self._cache = cache
self._key = key
@@ -137,9 +145,9 @@ class RLock(object):
self._tag = tag
def acquire(self):
- "Acquire lock by incrementing count using spin-lock algorithm."
+ """Acquire lock by incrementing count using spin-lock algorithm."""
pid = os.getpid()
- tid = get_ident()
+ tid = threading.get_ident()
pid_tid = '{}-{}'.format(pid, tid)
while True:
@@ -147,16 +155,18 @@ class RLock(object):
value, count = self._cache.get(self._key, default=(None, 0))
if pid_tid == value or count == 0:
self._cache.set(
- self._key, (pid_tid, count + 1),
- expire=self._expire, tag=self._tag,
+ self._key,
+ (pid_tid, count + 1),
+ expire=self._expire,
+ tag=self._tag,
)
return
time.sleep(0.001)
def release(self):
- "Release lock by decrementing count."
+ """Release lock by decrementing count."""
pid = os.getpid()
- tid = get_ident()
+ tid = threading.get_ident()
pid_tid = '{}-{}'.format(pid, tid)
with self._cache.transact(retry=True):
@@ -164,8 +174,10 @@ class RLock(object):
is_owned = pid_tid == value and count > 0
assert is_owned, 'cannot release un-acquired lock'
self._cache.set(
- self._key, (value, count - 1),
- expire=self._expire, tag=self._tag,
+ self._key,
+ (value, count - 1),
+ expire=self._expire,
+ tag=self._tag,
)
def __enter__(self):
@@ -175,9 +187,12 @@ class RLock(object):
self.release()
-class BoundedSemaphore(object):
+class BoundedSemaphore:
"""Recipe for cross-process and cross-thread bounded semaphore.
+ Assumes the key will not be evicted. Set the eviction policy to 'none' on
+ the cache to guarantee the key is not evicted.
+
>>> import diskcache
>>> cache = diskcache.Cache()
>>> semaphore = BoundedSemaphore(cache, 'max-cons', value=2)
@@ -193,6 +208,7 @@ class BoundedSemaphore(object):
AssertionError: cannot release un-acquired semaphore
"""
+
def __init__(self, cache, key, value=1, expire=None, tag=None):
self._cache = cache
self._key = key
@@ -201,26 +217,31 @@ class BoundedSemaphore(object):
self._tag = tag
def acquire(self):
- "Acquire semaphore by decrementing value using spin-lock algorithm."
+ """Acquire semaphore by decrementing value using spin-lock algorithm."""
while True:
with self._cache.transact(retry=True):
value = self._cache.get(self._key, default=self._value)
if value > 0:
self._cache.set(
- self._key, value - 1,
- expire=self._expire, tag=self._tag,
+ self._key,
+ value - 1,
+ expire=self._expire,
+ tag=self._tag,
)
return
time.sleep(0.001)
def release(self):
- "Release semaphore by incrementing value."
+ """Release semaphore by incrementing value."""
with self._cache.transact(retry=True):
value = self._cache.get(self._key, default=self._value)
assert self._value > value, 'cannot release un-acquired semaphore'
value += 1
self._cache.set(
- self._key, value, expire=self._expire, tag=self._tag,
+ self._key,
+ value,
+ expire=self._expire,
+ tag=self._tag,
)
def __enter__(self):
@@ -230,10 +251,21 @@ class BoundedSemaphore(object):
self.release()
-def throttle(cache, count, seconds, name=None, expire=None, tag=None,
- time_func=time.time, sleep_func=time.sleep):
+def throttle(
+ cache,
+ count,
+ seconds,
+ name=None,
+ expire=None,
+ tag=None,
+ time_func=time.time,
+ sleep_func=time.sleep,
+):
"""Decorator to throttle calls to function.
+ Assumes keys will not be evicted. Set the eviction policy to 'none' on the
+ cache to guarantee the keys are not evicted.
+
>>> import diskcache, time
>>> cache = diskcache.Cache()
>>> count = 0
@@ -248,6 +280,7 @@ def throttle(cache, count, seconds, name=None, expire=None, tag=None,
True
"""
+
def decorator(func):
rate = count / float(seconds)
key = full_name(func) if name is None else name
@@ -287,6 +320,9 @@ def barrier(cache, lock_factory, name=None, expire=None, tag=None):
Supports different kinds of locks: Lock, RLock, BoundedSemaphore.
+ Assumes keys will not be evicted. Set the eviction policy to 'none' on the
+ cache to guarantee the keys are not evicted.
+
>>> import diskcache, time
>>> cache = diskcache.Cache()
>>> @barrier(cache, Lock)
@@ -304,6 +340,7 @@ def barrier(cache, lock_factory, name=None, expire=None, tag=None):
>>> pool.terminate()
"""
+
def decorator(func):
key = full_name(func) if name is None else name
lock = lock_factory(cache, key, expire=expire, tag=tag)
@@ -318,7 +355,9 @@ def barrier(cache, lock_factory, name=None, expire=None, tag=None):
return decorator
-def memoize_stampede(cache, expire, name=None, typed=False, tag=None, beta=1):
+def memoize_stampede(
+ cache, expire, name=None, typed=False, tag=None, beta=1, ignore=()
+):
"""Memoizing cache decorator with cache stampede protection.
Cache stampedes are a type of system overload that can occur when parallel
@@ -371,16 +410,17 @@ def memoize_stampede(cache, expire, name=None, typed=False, tag=None, beta=1):
:param str name: name given for callable (default None, automatic)
:param bool typed: cache different types separately (default False)
:param str tag: text to associate with arguments (default None)
+ :param set ignore: positional or keyword args to ignore (default ())
:return: callable decorator
"""
# Caution: Nearly identical code exists in Cache.memoize
def decorator(func):
- "Decorator created by memoize call for callable."
+ """Decorator created by memoize call for callable."""
base = (full_name(func),) if name is None else (name,)
def timer(*args, **kwargs):
- "Time execution of `func` and return result and time delta."
+ """Time execution of `func` and return result and time delta."""
start = time.time()
result = func(*args, **kwargs)
delta = time.time() - start
@@ -388,10 +428,13 @@ def memoize_stampede(cache, expire, name=None, typed=False, tag=None, beta=1):
@functools.wraps(func)
def wrapper(*args, **kwargs):
- "Wrapper for callable to cache arguments and return values."
+ """Wrapper for callable to cache arguments and return values."""
key = wrapper.__cache_key__(*args, **kwargs)
pair, expire_time = cache.get(
- key, default=ENOVAL, expire_time=True, retry=True,
+ key,
+ default=ENOVAL,
+ expire_time=True,
+ retry=True,
)
if pair is not ENOVAL:
@@ -406,7 +449,10 @@ def memoize_stampede(cache, expire, name=None, typed=False, tag=None, beta=1):
thread_key = key + (ENOVAL,)
thread_added = cache.add(
- thread_key, None, expire=delta, retry=True,
+ thread_key,
+ None,
+ expire=delta,
+ retry=True,
)
if thread_added:
@@ -415,8 +461,13 @@ def memoize_stampede(cache, expire, name=None, typed=False, tag=None, beta=1):
with cache:
pair = timer(*args, **kwargs)
cache.set(
- key, pair, expire=expire, tag=tag, retry=True,
+ key,
+ pair,
+ expire=expire,
+ tag=tag,
+ retry=True,
)
+
thread = threading.Thread(target=recompute)
thread.daemon = True
thread.start()
@@ -428,8 +479,8 @@ def memoize_stampede(cache, expire, name=None, typed=False, tag=None, beta=1):
return pair[0]
def __cache_key__(*args, **kwargs):
- "Make key for cache given function arguments."
- return args_to_key(base, args, kwargs, typed)
+ """Make key for cache given function arguments."""
+ return args_to_key(base, args, kwargs, typed, ignore)
wrapper.__cache_key__ = __cache_key__
return wrapper
diff --git a/third_party/python/frozenlist/CHANGES.rst b/third_party/python/frozenlist/CHANGES.rst
deleted file mode 100644
index 3c649d268fe6..000000000000
--- a/third_party/python/frozenlist/CHANGES.rst
+++ /dev/null
@@ -1,55 +0,0 @@
-=========
-Changelog
-=========
-
-..
- You should *NOT* be adding new change log entries to this file, this
- file is managed by towncrier. You *may* edit previous change logs to
- fix problems like typo corrections or such.
- To add a new change log entry, please see
- https://pip.pypa.io/en/latest/development/contributing/#news-entries
- we named the news folder "changes".
-
- WARNING: Don't drop the next directive!
-
-.. towncrier release notes start
-
-1.1.1 (2020-11-14)
-==================
-
-Bugfixes
---------
-
-- Provide x86 Windows wheels.
- `#169 `_
-
-
-----
-
-
-1.1.0 (2020-10-13)
-==================
-
-Features
---------
-
-- Add support for hashing of a frozen list.
- `#136 `_
-
-- Support Python 3.8 and 3.9.
-
-- Provide wheels for ``aarch64``, ``i686``, ``ppc64le``, ``s390x`` architectures on
- Linux as well as ``x86_64``.
-
-
-----
-
-
-1.0.0 (2019-11-09)
-==================
-
-Deprecations and Removals
--------------------------
-
-- Dropped support for Python 3.5; only 3.6, 3.7 and 3.8 are supported going forward.
- `#24 `_
diff --git a/third_party/python/frozenlist/CONTRIBUTORS.txt b/third_party/python/frozenlist/CONTRIBUTORS.txt
deleted file mode 100644
index caf7b7a55c75..000000000000
--- a/third_party/python/frozenlist/CONTRIBUTORS.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-- Contributors -
-----------------
-Andrew Svetlov
-Marcin Konowalczyk
-Martijn Pieters
-Pau Freixes
-Paul Colomiets
diff --git a/third_party/python/frozenlist/MANIFEST.in b/third_party/python/frozenlist/MANIFEST.in
deleted file mode 100644
index ee8dd6699671..000000000000
--- a/third_party/python/frozenlist/MANIFEST.in
+++ /dev/null
@@ -1,17 +0,0 @@
-include LICENSE.txt
-include CHANGES.rst
-include README.rst
-include CONTRIBUTORS.txt
-graft frozenlist
-graft docs
-graft tests
-include frozenlist/*.c
-global-exclude *.pyc
-global-exclude *.pyd
-global-exclude *.so
-global-exclude *.lib
-global-exclude *.dll
-global-exclude *.a
-global-exclude *.obj
-exclude frozenlist/*.html
-prune docs/_build
diff --git a/third_party/python/frozenlist/PKG-INFO b/third_party/python/frozenlist/PKG-INFO
deleted file mode 100644
index 6ee3906b339f..000000000000
--- a/third_party/python/frozenlist/PKG-INFO
+++ /dev/null
@@ -1,206 +0,0 @@
-Metadata-Version: 2.1
-Name: frozenlist
-Version: 1.1.1
-Summary: A list-like structure which implements collections.abc.MutableSequence
-Home-page: https://github.com/aio-libs/frozenlist
-Author: Nikolay Kim
-Author-email: fafhrd91@gmail.com
-Maintainer: Martijn Pieters
-Maintainer-email: aio-libs@googlegroups.com
-License: Apache 2
-Project-URL: Chat: Gitter, https://gitter.im/aio-libs/Lobby
-Project-URL: CI: Github Actions, https://github.com/aio-libs/frozenlist/actions
-Project-URL: Coverage: codecov, https://codecov.io/github/aio-libs/frozenlist
-Project-URL: Docs: RTD, https://frozenlist.readthedocs.io
-Project-URL: GitHub: issues, https://github.com/aio-libs/frozenlist/issues
-Project-URL: GitHub: repo, https://github.com/aio-libs/frozenlist
-Description: ==========
- frozenlist
- ==========
-
- .. image:: https://github.com/aio-libs/frozenlist/workflows/CI/badge.svg
- :target: https://github.com/aio-libs/frozenlist/actions
- :alt: GitHub status for master branch
-
- .. image:: https://codecov.io/gh/aio-libs/frozenlist/branch/master/graph/badge.svg
- :target: https://codecov.io/gh/aio-libs/frozenlist
- :alt: codecov.io status for master branch
-
- .. image:: https://badge.fury.io/py/frozenlist.svg
- :target: https://pypi.org/project/frozenlist
- :alt: Latest PyPI package version
-
- .. image:: https://readthedocs.org/projects/frozenlist/badge/?version=latest
- :target: https://frozenlist.readthedocs.io/
- :alt: Latest Read The Docs
-
- .. image:: https://img.shields.io/discourse/topics?server=https%3A%2F%2Faio-libs.discourse.group%2F
- :target: https://aio-libs.discourse.group/
- :alt: Discourse group for io-libs
-
- .. image:: https://badges.gitter.im/Join%20Chat.svg
- :target: https://gitter.im/aio-libs/Lobby
- :alt: Chat on Gitter
-
- Introduction
- ============
-
- ``frozenlist.FrozenList`` is a list-like structure which implements
- ``collections.abc.MutableSequence``. The list is *mutable* until ``FrozenList.freeze``
- is called, after which list modifications raise ``RuntimeError``:
-
-
- >>> from frozenlist import FrozenList
- >>> fl = FrozenList([17, 42])
- >>> fl.append('spam')
- >>> fl.append('Vikings')
- >>> fl
-
- >>> fl.freeze()
- >>> fl
-
- >>> fl.frozen
- True
- >>> fl.append("Monty")
- Traceback (most recent call last):
- File "", line 1, in
- File "frozenlist/_frozenlist.pyx", line 97, in frozenlist._frozenlist.FrozenList.append
- self._check_frozen()
- File "frozenlist/_frozenlist.pyx", line 19, in frozenlist._frozenlist.FrozenList._check_frozen
- raise RuntimeError("Cannot modify frozen list.")
- RuntimeError: Cannot modify frozen list.
-
-
- FrozenList is also hashable, but only when frozen. Otherwise it also throws a RuntimeError:
-
-
- >>> fl = FrozenList([17, 42, 'spam'])
- >>> hash(fl)
- Traceback (most recent call last):
- File "", line 1, in
- File "frozenlist/_frozenlist.pyx", line 111, in frozenlist._frozenlist.FrozenList.__hash__
- raise RuntimeError("Cannot hash unfrozen list.")
- RuntimeError: Cannot hash unfrozen list.
- >>> fl.freeze()
- >>> hash(fl)
- 3713081631934410656
- >>> dictionary = {fl: 'Vikings'} # frozen fl can be a dict key
- >>> dictionary
- {: 'Vikings'}
-
-
- Installation
- ------------
-
- ::
-
- $ pip install frozenlist
-
- The library requires Python 3.6 or newer.
-
-
- Documentation
- =============
-
- https://frozenlist.readthedocs.io/
-
- Communication channels
- ======================
-
- *aio-libs discourse group*: https://aio-libs.discourse.group
-
- Feel free to post your questions and ideas here.
-
- *gitter chat* https://gitter.im/aio-libs/Lobby
-
- Requirements
- ============
-
- - Python >= 3.6
-
- License
- =======
-
- ``frozenlist`` is offered under the Apache 2 license.
-
- Source code
- ===========
-
- The project is hosted on GitHub_
-
- Please file an issue in the `bug tracker
- `_ if you have found a bug
- or have some suggestions to improve the library.
-
- .. _GitHub: https://github.com/aio-libs/frozenlist
-
- =========
- Changelog
- =========
-
- ..
- You should *NOT* be adding new change log entries to this file, this
- file is managed by towncrier. You *may* edit previous change logs to
- fix problems like typo corrections or such.
- To add a new change log entry, please see
- https://pip.pypa.io/en/latest/development/contributing/#news-entries
- we named the news folder "changes".
-
- WARNING: Don't drop the next directive!
-
- .. towncrier release notes start
-
- 1.1.1 (2020-11-14)
- ==================
-
- Bugfixes
- --------
-
- - Provide x86 Windows wheels.
- `#169 `_
-
-
- ----
-
-
- 1.1.0 (2020-10-13)
- ==================
-
- Features
- --------
-
- - Add support for hashing of a frozen list.
- `#136 `_
-
- - Support Python 3.8 and 3.9.
-
- - Provide wheels for ``aarch64``, ``i686``, ``ppc64le``, ``s390x`` architectures on
- Linux as well as ``x86_64``.
-
-
- ----
-
-
- 1.0.0 (2019-11-09)
- ==================
-
- Deprecations and Removals
- -------------------------
-
- - Dropped support for Python 3.5; only 3.6, 3.7 and 3.8 are supported going forward.
- `#24 `_
-Platform: UNKNOWN
-Classifier: License :: OSI Approved :: Apache Software License
-Classifier: Intended Audience :: Developers
-Classifier: Programming Language :: Python
-Classifier: Programming Language :: Python :: 3
-Classifier: Programming Language :: Python :: 3.6
-Classifier: Programming Language :: Python :: 3.7
-Classifier: Programming Language :: Python :: 3.8
-Classifier: Programming Language :: Python :: 3.9
-Classifier: Development Status :: 5 - Production/Stable
-Classifier: Operating System :: POSIX
-Classifier: Operating System :: MacOS :: MacOS X
-Classifier: Operating System :: Microsoft :: Windows
-Requires-Python: >=3.6
-Description-Content-Type: text/x-rst
diff --git a/third_party/python/frozenlist/README.rst b/third_party/python/frozenlist/README.rst
deleted file mode 100644
index 9345fb70632e..000000000000
--- a/third_party/python/frozenlist/README.rst
+++ /dev/null
@@ -1,119 +0,0 @@
-==========
-frozenlist
-==========
-
-.. image:: https://github.com/aio-libs/frozenlist/workflows/CI/badge.svg
- :target: https://github.com/aio-libs/frozenlist/actions
- :alt: GitHub status for master branch
-
-.. image:: https://codecov.io/gh/aio-libs/frozenlist/branch/master/graph/badge.svg
- :target: https://codecov.io/gh/aio-libs/frozenlist
- :alt: codecov.io status for master branch
-
-.. image:: https://badge.fury.io/py/frozenlist.svg
- :target: https://pypi.org/project/frozenlist
- :alt: Latest PyPI package version
-
-.. image:: https://readthedocs.org/projects/frozenlist/badge/?version=latest
- :target: https://frozenlist.readthedocs.io/
- :alt: Latest Read The Docs
-
-.. image:: https://img.shields.io/discourse/topics?server=https%3A%2F%2Faio-libs.discourse.group%2F
- :target: https://aio-libs.discourse.group/
- :alt: Discourse group for io-libs
-
-.. image:: https://badges.gitter.im/Join%20Chat.svg
- :target: https://gitter.im/aio-libs/Lobby
- :alt: Chat on Gitter
-
-Introduction
-============
-
-``frozenlist.FrozenList`` is a list-like structure which implements
-``collections.abc.MutableSequence``. The list is *mutable* until ``FrozenList.freeze``
-is called, after which list modifications raise ``RuntimeError``:
-
-
->>> from frozenlist import FrozenList
->>> fl = FrozenList([17, 42])
->>> fl.append('spam')
->>> fl.append('Vikings')
->>> fl
-
->>> fl.freeze()
->>> fl
-
->>> fl.frozen
-True
->>> fl.append("Monty")
-Traceback (most recent call last):
- File "", line 1, in
- File "frozenlist/_frozenlist.pyx", line 97, in frozenlist._frozenlist.FrozenList.append
- self._check_frozen()
- File "frozenlist/_frozenlist.pyx", line 19, in frozenlist._frozenlist.FrozenList._check_frozen
- raise RuntimeError("Cannot modify frozen list.")
-RuntimeError: Cannot modify frozen list.
-
-
-FrozenList is also hashable, but only when frozen. Otherwise it also throws a RuntimeError:
-
-
->>> fl = FrozenList([17, 42, 'spam'])
->>> hash(fl)
-Traceback (most recent call last):
- File "", line 1, in
- File "frozenlist/_frozenlist.pyx", line 111, in frozenlist._frozenlist.FrozenList.__hash__
- raise RuntimeError("Cannot hash unfrozen list.")
-RuntimeError: Cannot hash unfrozen list.
->>> fl.freeze()
->>> hash(fl)
-3713081631934410656
->>> dictionary = {fl: 'Vikings'} # frozen fl can be a dict key
->>> dictionary
-{: 'Vikings'}
-
-
-Installation
-------------
-
-::
-
- $ pip install frozenlist
-
-The library requires Python 3.6 or newer.
-
-
-Documentation
-=============
-
-https://frozenlist.readthedocs.io/
-
-Communication channels
-======================
-
-*aio-libs discourse group*: https://aio-libs.discourse.group
-
-Feel free to post your questions and ideas here.
-
-*gitter chat* https://gitter.im/aio-libs/Lobby
-
-Requirements
-============
-
-- Python >= 3.6
-
-License
-=======
-
-``frozenlist`` is offered under the Apache 2 license.
-
-Source code
-===========
-
-The project is hosted on GitHub_
-
-Please file an issue in the `bug tracker
-`_ if you have found a bug
-or have some suggestions to improve the library.
-
-.. _GitHub: https://github.com/aio-libs/frozenlist
diff --git a/third_party/python/frozenlist/LICENSE.txt b/third_party/python/frozenlist/frozenlist-1.4.1.dist-info/LICENSE
similarity index 100%
rename from third_party/python/frozenlist/LICENSE.txt
rename to third_party/python/frozenlist/frozenlist-1.4.1.dist-info/LICENSE
diff --git a/third_party/python/frozenlist/frozenlist-1.4.1.dist-info/METADATA b/third_party/python/frozenlist/frozenlist-1.4.1.dist-info/METADATA
new file mode 100644
index 000000000000..60603d5a5a4d
--- /dev/null
+++ b/third_party/python/frozenlist/frozenlist-1.4.1.dist-info/METADATA
@@ -0,0 +1,420 @@
+Metadata-Version: 2.1
+Name: frozenlist
+Version: 1.4.1
+Summary: A list-like structure which implements collections.abc.MutableSequence
+Home-page: https://github.com/aio-libs/frozenlist
+Maintainer: aiohttp team
+Maintainer-email: team@aiohttp.org
+License: Apache 2
+Project-URL: Chat: Matrix, https://matrix.to/#/#aio-libs:matrix.org
+Project-URL: Chat: Matrix Space, https://matrix.to/#/#aio-libs-space:matrix.org
+Project-URL: CI: Github Actions, https://github.com/aio-libs/frozenlist/actions
+Project-URL: Code of Conduct, https://github.com/aio-libs/.github/blob/master/CODE_OF_CONDUCT.md
+Project-URL: Coverage: codecov, https://codecov.io/github/aio-libs/frozenlist
+Project-URL: Docs: Changelog, https://github.com/aio-libs/frozenlist/blob/master/CHANGES.rst#changelog
+Project-URL: Docs: RTD, https://frozenlist.aio-libs.org
+Project-URL: GitHub: issues, https://github.com/aio-libs/frozenlist/issues
+Project-URL: GitHub: repo, https://github.com/aio-libs/frozenlist
+Classifier: Development Status :: 5 - Production/Stable
+Classifier: Intended Audience :: Developers
+Classifier: License :: OSI Approved :: Apache Software License
+Classifier: Operating System :: POSIX
+Classifier: Operating System :: MacOS :: MacOS X
+Classifier: Operating System :: Microsoft :: Windows
+Classifier: Programming Language :: Cython
+Classifier: Programming Language :: Python
+Classifier: Programming Language :: Python :: 3
+Classifier: Programming Language :: Python :: 3.8
+Classifier: Programming Language :: Python :: 3.9
+Classifier: Programming Language :: Python :: 3.10
+Classifier: Programming Language :: Python :: 3.11
+Classifier: Programming Language :: Python :: 3.12
+Classifier: Programming Language :: Python :: Implementation :: CPython
+Classifier: Programming Language :: Python :: Implementation :: PyPy
+Requires-Python: >=3.8
+Description-Content-Type: text/x-rst
+License-File: LICENSE
+
+frozenlist
+==========
+
+.. image:: https://github.com/aio-libs/frozenlist/workflows/CI/badge.svg
+ :target: https://github.com/aio-libs/frozenlist/actions
+ :alt: GitHub status for master branch
+
+.. image:: https://codecov.io/gh/aio-libs/frozenlist/branch/master/graph/badge.svg
+ :target: https://codecov.io/gh/aio-libs/frozenlist
+ :alt: codecov.io status for master branch
+
+.. image:: https://img.shields.io/pypi/v/frozenlist.svg?logo=Python&logoColor=white
+ :target: https://pypi.org/project/frozenlist
+ :alt: frozenlist @ PyPI
+
+.. image:: https://readthedocs.org/projects/frozenlist/badge/?version=latest
+ :target: https://frozenlist.aio-libs.org
+ :alt: Read The Docs build status badge
+
+.. image:: https://img.shields.io/matrix/aio-libs:matrix.org?label=Discuss%20on%20Matrix%20at%20%23aio-libs%3Amatrix.org&logo=matrix&server_fqdn=matrix.org&style=flat
+ :target: https://matrix.to/#/%23aio-libs:matrix.org
+ :alt: Matrix Room — #aio-libs:matrix.org
+
+.. image:: https://img.shields.io/matrix/aio-libs-space:matrix.org?label=Discuss%20on%20Matrix%20at%20%23aio-libs-space%3Amatrix.org&logo=matrix&server_fqdn=matrix.org&style=flat
+ :target: https://matrix.to/#/%23aio-libs-space:matrix.org
+ :alt: Matrix Space — #aio-libs-space:matrix.org
+
+Introduction
+------------
+
+``frozenlist.FrozenList`` is a list-like structure which implements
+``collections.abc.MutableSequence``. The list is *mutable* until ``FrozenList.freeze``
+is called, after which list modifications raise ``RuntimeError``:
+
+
+>>> from frozenlist import FrozenList
+>>> fl = FrozenList([17, 42])
+>>> fl.append('spam')
+>>> fl.append('Vikings')
+>>> fl
+
+>>> fl.freeze()
+>>> fl
+
+>>> fl.frozen
+True
+>>> fl.append("Monty")
+Traceback (most recent call last):
+ File "", line 1, in
+ File "frozenlist/_frozenlist.pyx", line 97, in frozenlist._frozenlist.FrozenList.append
+ self._check_frozen()
+ File "frozenlist/_frozenlist.pyx", line 19, in frozenlist._frozenlist.FrozenList._check_frozen
+ raise RuntimeError("Cannot modify frozen list.")
+RuntimeError: Cannot modify frozen list.
+
+
+FrozenList is also hashable, but only when frozen. Otherwise it also throws a RuntimeError:
+
+
+>>> fl = FrozenList([17, 42, 'spam'])
+>>> hash(fl)
+Traceback (most recent call last):
+ File "", line 1, in
+ File "frozenlist/_frozenlist.pyx", line 111, in frozenlist._frozenlist.FrozenList.__hash__
+ raise RuntimeError("Cannot hash unfrozen list.")
+RuntimeError: Cannot hash unfrozen list.
+>>> fl.freeze()
+>>> hash(fl)
+3713081631934410656
+>>> dictionary = {fl: 'Vikings'} # frozen fl can be a dict key
+>>> dictionary
+{: 'Vikings'}
+
+
+Installation
+------------
+
+::
+
+ $ pip install frozenlist
+
+The library requires Python 3.8 or newer.
+
+
+Documentation
+-------------
+
+https://frozenlist.aio-libs.org
+
+Communication channels
+----------------------
+
+We have a *Matrix Space* `#aio-libs-space:matrix.org
+`_ which is
+also accessible via Gitter.
+
+Requirements
+------------
+
+- Python >= 3.8
+
+License
+-------
+
+``frozenlist`` is offered under the Apache 2 license.
+
+Source code
+-----------
+
+The project is hosted on GitHub_
+
+Please file an issue in the `bug tracker
+`_ if you have found a bug
+or have some suggestions to improve the library.
+
+.. _GitHub: https://github.com/aio-libs/frozenlist
+
+=========
+Changelog
+=========
+
+..
+ You should *NOT* be adding new change log entries to this file, this
+ file is managed by towncrier. You *may* edit previous change logs to
+ fix problems like typo corrections or such.
+ To add a new change log entry, please see
+ https://pip.pypa.io/en/latest/development/contributing/#news-entries
+ we named the news folder "changes".
+
+ WARNING: Don't drop the next directive!
+
+.. towncrier release notes start
+
+1.4.1 (2023-12-15)
+==================
+
+Packaging updates and notes for downstreams
+-------------------------------------------
+
+- Declared Python 3.12 and PyPy 3.8-3.10 supported officially
+ in the distribution package metadata.
+
+
+ *Related issues and pull requests on GitHub:*
+ `#553 `__.
+
+- Replaced the packaging is replaced from an old-fashioned ``setup.py`` to an
+ in-tree `PEP 517 `__ build backend -- by `@webknjaz `__.
+
+ Whenever the end-users or downstream packagers need to build ``frozenlist``
+ from source (a Git checkout or an sdist), they may pass a ``config_settings``
+ flag ``pure-python``. If this flag is not set, a C-extension will be built
+ and included into the distribution.
+
+ Here is how this can be done with ``pip``:
+
+ .. code-block:: console
+
+ $ python3 -m pip install . --config-settings=pure-python=
+
+ This will also work with ``-e | --editable``.
+
+ The same can be achieved via ``pypa/build``:
+
+ .. code-block:: console
+
+ $ python3 -m build --config-setting=pure-python=
+
+ Adding ``-w | --wheel`` can force ``pypa/build`` produce a wheel from source
+ directly, as opposed to building an ``sdist`` and then building from it.
+
+
+ *Related issues and pull requests on GitHub:*
+ `#560 `__.
+
+
+Contributor-facing changes
+--------------------------
+
+- It is now possible to request line tracing in Cython builds using the
+ ``with-cython-tracing`` `PEP 517 `__ config setting
+ -- `@webknjaz `__.
+
+ This can be used in CI and development environment to measure coverage
+ on Cython modules, but is not normally useful to the end-users or
+ downstream packagers.
+
+ Here's a usage example:
+
+ .. code-block:: console
+
+ $ python3 -Im pip install . --config-settings=with-cython-tracing=true
+
+ For editable installs, this setting is on by default. Otherwise, it's
+ off unless requested explicitly.
+
+ The following produces C-files required for the Cython coverage
+ plugin to map the measurements back to the PYX-files:
+
+ .. code-block:: console
+
+ $ python -Im pip install -e .
+
+ Alternatively, the ``FROZENLIST_CYTHON_TRACING=1`` environment variable
+ can be set to do the same as the `PEP 517 `__ config setting.
+
+
+ *Related issues and pull requests on GitHub:*
+ `#560 `__.
+
+- Coverage collection has been implemented for the Cython modules
+ -- by `@webknjaz `__.
+
+ It will also be reported to Codecov from any non-release CI jobs.
+
+
+ *Related issues and pull requests on GitHub:*
+ `#561 `__.
+
+- A step-by-step ``Release Guide`` guide has
+ been added, describing how to release *frozenlist* -- by `@webknjaz `__.
+
+ This is primarily targeting the maintainers.
+
+
+ *Related issues and pull requests on GitHub:*
+ `#563 `__.
+
+- Detailed ``Contributing Guidelines`` on
+ authoring the changelog fragments have been published in the
+ documentation -- by `@webknjaz `__.
+
+
+ *Related issues and pull requests on GitHub:*
+ `#564 `__.
+
+
+----
+
+
+1.4.0 (2023-07-12)
+==================
+
+The published source distribution package became buildable
+under Python 3.12.
+
+
+----
+
+
+Bugfixes
+--------
+
+- Removed an unused ``typing.Tuple`` import
+ `#411 `_
+
+
+Deprecations and Removals
+-------------------------
+
+- Dropped Python 3.7 support.
+ `#413 `_
+
+
+Misc
+----
+
+- `#410 `_, `#433 `_
+
+
+----
+
+
+1.3.3 (2022-11-08)
+==================
+
+- Fixed CI runs when creating a new release, where new towncrier versions
+ fail when the current version section is already present.
+
+
+----
+
+
+1.3.2 (2022-11-08)
+==================
+
+Misc
+----
+
+- Updated the CI runs to better check for test results and to avoid deprecated syntax. `#327 `_
+
+
+----
+
+
+1.3.1 (2022-08-02)
+==================
+
+The published source distribution package became buildable
+under Python 3.11.
+
+
+----
+
+
+1.3.0 (2022-01-18)
+==================
+
+Bugfixes
+--------
+
+- Do not install C sources with binary distributions.
+ `#250 `_
+
+
+Deprecations and Removals
+-------------------------
+
+- Dropped Python 3.6 support
+ `#274 `_
+
+
+----
+
+
+1.2.0 (2021-10-16)
+==================
+
+Features
+--------
+
+- ``FrozenList`` now supports being used as a generic type as per PEP 585, e.g. ``frozen_int_list: FrozenList[int]`` (requires Python 3.9 or newer).
+ `#172 `_
+- Added support for Python 3.10.
+ `#227 `_
+- Started shipping platform-specific wheels with the ``musl`` tag targeting typical Alpine Linux runtimes.
+ `#227 `_
+- Started shipping platform-specific arm64 wheels for Apple Silicon.
+ `#227 `_
+
+
+----
+
+
+1.1.1 (2020-11-14)
+==================
+
+Bugfixes
+--------
+
+- Provide x86 Windows wheels.
+ `#169 `_
+
+
+----
+
+
+1.1.0 (2020-10-13)
+==================
+
+Features
+--------
+
+- Add support for hashing of a frozen list.
+ `#136 `_
+
+- Support Python 3.8 and 3.9.
+
+- Provide wheels for ``aarch64``, ``i686``, ``ppc64le``, ``s390x`` architectures on
+ Linux as well as ``x86_64``.
+
+
+----
+
+
+1.0.0 (2019-11-09)
+==================
+
+Deprecations and Removals
+-------------------------
+
+- Dropped support for Python 3.5; only 3.6, 3.7 and 3.8 are supported going forward.
+ `#24 `_
diff --git a/third_party/python/frozenlist/frozenlist-1.4.1.dist-info/RECORD b/third_party/python/frozenlist/frozenlist-1.4.1.dist-info/RECORD
new file mode 100644
index 000000000000..dbd92174372d
--- /dev/null
+++ b/third_party/python/frozenlist/frozenlist-1.4.1.dist-info/RECORD
@@ -0,0 +1,9 @@
+frozenlist/__init__.py,sha256=hrSQhfujMaz1BWlHfwuVFrPD02-pCK7jG4e9FaCZCmM,2316
+frozenlist/__init__.pyi,sha256=vMEoES1xGegPtVXoCi9XydEeHsyuIq-KdeXwP5PdsaA,1470
+frozenlist/_frozenlist.pyx,sha256=9V4Z1En6TZwgFD26d-sjxyhUzUm338H1Qiz4-i5ukv0,2983
+frozenlist/py.typed,sha256=sow9soTwP9T_gEAQSVh7Gb8855h04Nwmhs2We-JRgZM,7
+frozenlist-1.4.1.dist-info/LICENSE,sha256=b9UkPpLdf5jsacesN3co50kFcJ_1J6W_mNbQJjwE9bY,11332
+frozenlist-1.4.1.dist-info/METADATA,sha256=i-BTxwxpJrHm-I8DMpFRvXVXJiqXwUcsPiUR47NY6eg,12136
+frozenlist-1.4.1.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92
+frozenlist-1.4.1.dist-info/top_level.txt,sha256=jivtxsPXA3nK3WBWW2LW5Mtu_GHt8UZA13NeCs2cKuA,11
+frozenlist-1.4.1.dist-info/RECORD,,
diff --git a/third_party/python/frozenlist/frozenlist-1.4.1.dist-info/WHEEL b/third_party/python/frozenlist/frozenlist-1.4.1.dist-info/WHEEL
new file mode 100644
index 000000000000..98c0d20b7a64
--- /dev/null
+++ b/third_party/python/frozenlist/frozenlist-1.4.1.dist-info/WHEEL
@@ -0,0 +1,5 @@
+Wheel-Version: 1.0
+Generator: bdist_wheel (0.42.0)
+Root-Is-Purelib: true
+Tag: py3-none-any
+
diff --git a/third_party/python/frozenlist/frozenlist.egg-info/top_level.txt b/third_party/python/frozenlist/frozenlist-1.4.1.dist-info/top_level.txt
similarity index 100%
rename from third_party/python/frozenlist/frozenlist.egg-info/top_level.txt
rename to third_party/python/frozenlist/frozenlist-1.4.1.dist-info/top_level.txt
diff --git a/third_party/python/frozenlist/frozenlist.egg-info/PKG-INFO b/third_party/python/frozenlist/frozenlist.egg-info/PKG-INFO
deleted file mode 100644
index 6ee3906b339f..000000000000
--- a/third_party/python/frozenlist/frozenlist.egg-info/PKG-INFO
+++ /dev/null
@@ -1,206 +0,0 @@
-Metadata-Version: 2.1
-Name: frozenlist
-Version: 1.1.1
-Summary: A list-like structure which implements collections.abc.MutableSequence
-Home-page: https://github.com/aio-libs/frozenlist
-Author: Nikolay Kim
-Author-email: fafhrd91@gmail.com
-Maintainer: Martijn Pieters
-Maintainer-email: aio-libs@googlegroups.com
-License: Apache 2
-Project-URL: Chat: Gitter, https://gitter.im/aio-libs/Lobby
-Project-URL: CI: Github Actions, https://github.com/aio-libs/frozenlist/actions
-Project-URL: Coverage: codecov, https://codecov.io/github/aio-libs/frozenlist
-Project-URL: Docs: RTD, https://frozenlist.readthedocs.io
-Project-URL: GitHub: issues, https://github.com/aio-libs/frozenlist/issues
-Project-URL: GitHub: repo, https://github.com/aio-libs/frozenlist
-Description: ==========
- frozenlist
- ==========
-
- .. image:: https://github.com/aio-libs/frozenlist/workflows/CI/badge.svg
- :target: https://github.com/aio-libs/frozenlist/actions
- :alt: GitHub status for master branch
-
- .. image:: https://codecov.io/gh/aio-libs/frozenlist/branch/master/graph/badge.svg
- :target: https://codecov.io/gh/aio-libs/frozenlist
- :alt: codecov.io status for master branch
-
- .. image:: https://badge.fury.io/py/frozenlist.svg
- :target: https://pypi.org/project/frozenlist
- :alt: Latest PyPI package version
-
- .. image:: https://readthedocs.org/projects/frozenlist/badge/?version=latest
- :target: https://frozenlist.readthedocs.io/
- :alt: Latest Read The Docs
-
- .. image:: https://img.shields.io/discourse/topics?server=https%3A%2F%2Faio-libs.discourse.group%2F
- :target: https://aio-libs.discourse.group/
- :alt: Discourse group for io-libs
-
- .. image:: https://badges.gitter.im/Join%20Chat.svg
- :target: https://gitter.im/aio-libs/Lobby
- :alt: Chat on Gitter
-
- Introduction
- ============
-
- ``frozenlist.FrozenList`` is a list-like structure which implements
- ``collections.abc.MutableSequence``. The list is *mutable* until ``FrozenList.freeze``
- is called, after which list modifications raise ``RuntimeError``:
-
-
- >>> from frozenlist import FrozenList
- >>> fl = FrozenList([17, 42])
- >>> fl.append('spam')
- >>> fl.append('Vikings')
- >>> fl
-
- >>> fl.freeze()
- >>> fl
-
- >>> fl.frozen
- True
- >>> fl.append("Monty")
- Traceback (most recent call last):
- File "", line 1, in
- File "frozenlist/_frozenlist.pyx", line 97, in frozenlist._frozenlist.FrozenList.append
- self._check_frozen()
- File "frozenlist/_frozenlist.pyx", line 19, in frozenlist._frozenlist.FrozenList._check_frozen
- raise RuntimeError("Cannot modify frozen list.")
- RuntimeError: Cannot modify frozen list.
-
-
- FrozenList is also hashable, but only when frozen. Otherwise it also throws a RuntimeError:
-
-
- >>> fl = FrozenList([17, 42, 'spam'])
- >>> hash(fl)
- Traceback (most recent call last):
- File "", line 1, in
- File "frozenlist/_frozenlist.pyx", line 111, in frozenlist._frozenlist.FrozenList.__hash__
- raise RuntimeError("Cannot hash unfrozen list.")
- RuntimeError: Cannot hash unfrozen list.
- >>> fl.freeze()
- >>> hash(fl)
- 3713081631934410656
- >>> dictionary = {fl: 'Vikings'} # frozen fl can be a dict key
- >>> dictionary
- {: 'Vikings'}
-
-
- Installation
- ------------
-
- ::
-
- $ pip install frozenlist
-
- The library requires Python 3.6 or newer.
-
-
- Documentation
- =============
-
- https://frozenlist.readthedocs.io/
-
- Communication channels
- ======================
-
- *aio-libs discourse group*: https://aio-libs.discourse.group
-
- Feel free to post your questions and ideas here.
-
- *gitter chat* https://gitter.im/aio-libs/Lobby
-
- Requirements
- ============
-
- - Python >= 3.6
-
- License
- =======
-
- ``frozenlist`` is offered under the Apache 2 license.
-
- Source code
- ===========
-
- The project is hosted on GitHub_
-
- Please file an issue in the `bug tracker
- `_ if you have found a bug
- or have some suggestions to improve the library.
-
- .. _GitHub: https://github.com/aio-libs/frozenlist
-
- =========
- Changelog
- =========
-
- ..
- You should *NOT* be adding new change log entries to this file, this
- file is managed by towncrier. You *may* edit previous change logs to
- fix problems like typo corrections or such.
- To add a new change log entry, please see
- https://pip.pypa.io/en/latest/development/contributing/#news-entries
- we named the news folder "changes".
-
- WARNING: Don't drop the next directive!
-
- .. towncrier release notes start
-
- 1.1.1 (2020-11-14)
- ==================
-
- Bugfixes
- --------
-
- - Provide x86 Windows wheels.
- `#169 `_
-
-
- ----
-
-
- 1.1.0 (2020-10-13)
- ==================
-
- Features
- --------
-
- - Add support for hashing of a frozen list.
- `#136 `_
-
- - Support Python 3.8 and 3.9.
-
- - Provide wheels for ``aarch64``, ``i686``, ``ppc64le``, ``s390x`` architectures on
- Linux as well as ``x86_64``.
-
-
- ----
-
-
- 1.0.0 (2019-11-09)
- ==================
-
- Deprecations and Removals
- -------------------------
-
- - Dropped support for Python 3.5; only 3.6, 3.7 and 3.8 are supported going forward.
- `#24 `_
-Platform: UNKNOWN
-Classifier: License :: OSI Approved :: Apache Software License
-Classifier: Intended Audience :: Developers
-Classifier: Programming Language :: Python
-Classifier: Programming Language :: Python :: 3
-Classifier: Programming Language :: Python :: 3.6
-Classifier: Programming Language :: Python :: 3.7
-Classifier: Programming Language :: Python :: 3.8
-Classifier: Programming Language :: Python :: 3.9
-Classifier: Development Status :: 5 - Production/Stable
-Classifier: Operating System :: POSIX
-Classifier: Operating System :: MacOS :: MacOS X
-Classifier: Operating System :: Microsoft :: Windows
-Requires-Python: >=3.6
-Description-Content-Type: text/x-rst
diff --git a/third_party/python/frozenlist/frozenlist.egg-info/SOURCES.txt b/third_party/python/frozenlist/frozenlist.egg-info/SOURCES.txt
deleted file mode 100644
index b704bc3ee35c..000000000000
--- a/third_party/python/frozenlist/frozenlist.egg-info/SOURCES.txt
+++ /dev/null
@@ -1,24 +0,0 @@
-CHANGES.rst
-CONTRIBUTORS.txt
-LICENSE.txt
-MANIFEST.in
-README.rst
-pyproject.toml
-setup.cfg
-setup.py
-docs/Makefile
-docs/conf.py
-docs/index.rst
-docs/make.bat
-docs/spelling_wordlist.txt
-frozenlist/__init__.py
-frozenlist/__init__.pyi
-frozenlist/_frozenlist.c
-frozenlist/_frozenlist.pyx
-frozenlist/py.typed
-frozenlist.egg-info/PKG-INFO
-frozenlist.egg-info/SOURCES.txt
-frozenlist.egg-info/dependency_links.txt
-frozenlist.egg-info/top_level.txt
-tests/conftest.py
-tests/test_frozenlist.py
\ No newline at end of file
diff --git a/third_party/python/frozenlist/frozenlist.egg-info/dependency_links.txt b/third_party/python/frozenlist/frozenlist.egg-info/dependency_links.txt
deleted file mode 100644
index 8b137891791f..000000000000
--- a/third_party/python/frozenlist/frozenlist.egg-info/dependency_links.txt
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/third_party/python/frozenlist/frozenlist/__init__.py b/third_party/python/frozenlist/frozenlist/__init__.py
index 1ef327bac135..c0f71368bab1 100644
--- a/third_party/python/frozenlist/frozenlist/__init__.py
+++ b/third_party/python/frozenlist/frozenlist/__init__.py
@@ -1,22 +1,29 @@
import os
+import sys
+import types
from collections.abc import MutableSequence
from functools import total_ordering
-from typing import Tuple
+from typing import Type
-__version__ = '1.1.1'
+__version__ = "1.4.1"
-__all__ = (
- 'FrozenList', 'PyFrozenList'
-) # type: Tuple[str, ...]
+__all__ = ("FrozenList", "PyFrozenList") # type: Tuple[str, ...]
-NO_EXTENSIONS = bool(os.environ.get('FROZENLIST_NO_EXTENSIONS')) # type: bool
+NO_EXTENSIONS = bool(os.environ.get("FROZENLIST_NO_EXTENSIONS")) # type: bool
@total_ordering
class FrozenList(MutableSequence):
+ __slots__ = ("_frozen", "_items")
- __slots__ = ('_frozen', '_items')
+ if sys.version_info >= (3, 9):
+ __class_getitem__ = classmethod(types.GenericAlias)
+ else:
+
+ @classmethod
+ def __class_getitem__(cls: Type["FrozenList"]) -> Type["FrozenList"]:
+ return cls
def __init__(self, items=None):
self._frozen = False
@@ -67,8 +74,7 @@ class FrozenList(MutableSequence):
self._items.insert(pos, item)
def __repr__(self):
- return ''.format(self._frozen,
- self._items)
+ return f""
def __hash__(self):
if self._frozen:
@@ -80,9 +86,10 @@ class FrozenList(MutableSequence):
PyFrozenList = FrozenList
-try:
- from ._frozenlist import FrozenList as CFrozenList # type: ignore
- if not NO_EXTENSIONS: # pragma: no cover
+if not NO_EXTENSIONS:
+ try:
+ from ._frozenlist import FrozenList as CFrozenList # type: ignore
+ except ImportError: # pragma: no cover
+ pass
+ else:
FrozenList = CFrozenList # type: ignore
-except ImportError: # pragma: no cover
- pass
diff --git a/third_party/python/frozenlist/frozenlist/__init__.pyi b/third_party/python/frozenlist/frozenlist/__init__.pyi
index d9509f3391ec..ae803ef6aad7 100644
--- a/third_party/python/frozenlist/frozenlist/__init__.pyi
+++ b/third_party/python/frozenlist/frozenlist/__init__.pyi
@@ -10,56 +10,38 @@ from typing import (
overload,
)
-_T = TypeVar('_T')
+_T = TypeVar("_T")
_Arg = Union[List[_T], Iterable[_T]]
-
class FrozenList(MutableSequence[_T], Generic[_T]):
-
- def __init__(self, items: Optional[_Arg[_T]]=None) -> None: ...
-
+ def __init__(self, items: Optional[_Arg[_T]] = None) -> None: ...
@property
def frozen(self) -> bool: ...
-
def freeze(self) -> None: ...
-
@overload
def __getitem__(self, i: int) -> _T: ...
-
@overload
def __getitem__(self, s: slice) -> FrozenList[_T]: ...
-
@overload
def __setitem__(self, i: int, o: _T) -> None: ...
-
@overload
def __setitem__(self, s: slice, o: Iterable[_T]) -> None: ...
-
@overload
def __delitem__(self, i: int) -> None: ...
-
@overload
def __delitem__(self, i: slice) -> None: ...
-
def __len__(self) -> int: ...
-
def __iter__(self) -> Iterator[_T]: ...
-
def __reversed__(self) -> Iterator[_T]: ...
-
def __eq__(self, other: object) -> bool: ...
def __le__(self, other: FrozenList[_T]) -> bool: ...
def __ne__(self, other: object) -> bool: ...
def __lt__(self, other: FrozenList[_T]) -> bool: ...
def __ge__(self, other: FrozenList[_T]) -> bool: ...
def __gt__(self, other: FrozenList[_T]) -> bool: ...
-
def insert(self, pos: int, item: _T) -> None: ...
-
def __repr__(self) -> str: ...
-
def __hash__(self) -> int: ...
-
# types for C accelerators are the same
CFrozenList = PyFrozenList = FrozenList
diff --git a/third_party/python/frozenlist/frozenlist/_frozenlist.c b/third_party/python/frozenlist/frozenlist/_frozenlist.c
deleted file mode 100644
index 2ebf7abe689f..000000000000
--- a/third_party/python/frozenlist/frozenlist/_frozenlist.c
+++ /dev/null
@@ -1,7631 +0,0 @@
-/* Generated by Cython 0.29.21 */
-
-#define PY_SSIZE_T_CLEAN
-#include "Python.h"
-#ifndef Py_PYTHON_H
- #error Python headers needed to compile C extensions, please install development version of Python.
-#elif PY_VERSION_HEX < 0x02060000 || (0x03000000 <= PY_VERSION_HEX && PY_VERSION_HEX < 0x03030000)
- #error Cython requires Python 2.6+ or Python 3.3+.
-#else
-#define CYTHON_ABI "0_29_21"
-#define CYTHON_HEX_VERSION 0x001D15F0
-#define CYTHON_FUTURE_DIVISION 1
-#include
-#ifndef offsetof
- #define offsetof(type, member) ( (size_t) & ((type*)0) -> member )
-#endif
-#if !defined(WIN32) && !defined(MS_WINDOWS)
- #ifndef __stdcall
- #define __stdcall
- #endif
- #ifndef __cdecl
- #define __cdecl
- #endif
- #ifndef __fastcall
- #define __fastcall
- #endif
-#endif
-#ifndef DL_IMPORT
- #define DL_IMPORT(t) t
-#endif
-#ifndef DL_EXPORT
- #define DL_EXPORT(t) t
-#endif
-#define __PYX_COMMA ,
-#ifndef HAVE_LONG_LONG
- #if PY_VERSION_HEX >= 0x02070000
- #define HAVE_LONG_LONG
- #endif
-#endif
-#ifndef PY_LONG_LONG
- #define PY_LONG_LONG LONG_LONG
-#endif
-#ifndef Py_HUGE_VAL
- #define Py_HUGE_VAL HUGE_VAL
-#endif
-#ifdef PYPY_VERSION
- #define CYTHON_COMPILING_IN_PYPY 1
- #define CYTHON_COMPILING_IN_PYSTON 0
- #define CYTHON_COMPILING_IN_CPYTHON 0
- #undef CYTHON_USE_TYPE_SLOTS
- #define CYTHON_USE_TYPE_SLOTS 0
- #undef CYTHON_USE_PYTYPE_LOOKUP
- #define CYTHON_USE_PYTYPE_LOOKUP 0
- #if PY_VERSION_HEX < 0x03050000
- #undef CYTHON_USE_ASYNC_SLOTS
- #define CYTHON_USE_ASYNC_SLOTS 0
- #elif !defined(CYTHON_USE_ASYNC_SLOTS)
- #define CYTHON_USE_ASYNC_SLOTS 1
- #endif
- #undef CYTHON_USE_PYLIST_INTERNALS
- #define CYTHON_USE_PYLIST_INTERNALS 0
- #undef CYTHON_USE_UNICODE_INTERNALS
- #define CYTHON_USE_UNICODE_INTERNALS 0
- #undef CYTHON_USE_UNICODE_WRITER
- #define CYTHON_USE_UNICODE_WRITER 0
- #undef CYTHON_USE_PYLONG_INTERNALS
- #define CYTHON_USE_PYLONG_INTERNALS 0
- #undef CYTHON_AVOID_BORROWED_REFS
- #define CYTHON_AVOID_BORROWED_REFS 1
- #undef CYTHON_ASSUME_SAFE_MACROS
- #define CYTHON_ASSUME_SAFE_MACROS 0
- #undef CYTHON_UNPACK_METHODS
- #define CYTHON_UNPACK_METHODS 0
- #undef CYTHON_FAST_THREAD_STATE
- #define CYTHON_FAST_THREAD_STATE 0
- #undef CYTHON_FAST_PYCALL
- #define CYTHON_FAST_PYCALL 0
- #undef CYTHON_PEP489_MULTI_PHASE_INIT
- #define CYTHON_PEP489_MULTI_PHASE_INIT 0
- #undef CYTHON_USE_TP_FINALIZE
- #define CYTHON_USE_TP_FINALIZE 0
- #undef CYTHON_USE_DICT_VERSIONS
- #define CYTHON_USE_DICT_VERSIONS 0
- #undef CYTHON_USE_EXC_INFO_STACK
- #define CYTHON_USE_EXC_INFO_STACK 0
-#elif defined(PYSTON_VERSION)
- #define CYTHON_COMPILING_IN_PYPY 0
- #define CYTHON_COMPILING_IN_PYSTON 1
- #define CYTHON_COMPILING_IN_CPYTHON 0
- #ifndef CYTHON_USE_TYPE_SLOTS
- #define CYTHON_USE_TYPE_SLOTS 1
- #endif
- #undef CYTHON_USE_PYTYPE_LOOKUP
- #define CYTHON_USE_PYTYPE_LOOKUP 0
- #undef CYTHON_USE_ASYNC_SLOTS
- #define CYTHON_USE_ASYNC_SLOTS 0
- #undef CYTHON_USE_PYLIST_INTERNALS
- #define CYTHON_USE_PYLIST_INTERNALS 0
- #ifndef CYTHON_USE_UNICODE_INTERNALS
- #define CYTHON_USE_UNICODE_INTERNALS 1
- #endif
- #undef CYTHON_USE_UNICODE_WRITER
- #define CYTHON_USE_UNICODE_WRITER 0
- #undef CYTHON_USE_PYLONG_INTERNALS
- #define CYTHON_USE_PYLONG_INTERNALS 0
- #ifndef CYTHON_AVOID_BORROWED_REFS
- #define CYTHON_AVOID_BORROWED_REFS 0
- #endif
- #ifndef CYTHON_ASSUME_SAFE_MACROS
- #define CYTHON_ASSUME_SAFE_MACROS 1
- #endif
- #ifndef CYTHON_UNPACK_METHODS
- #define CYTHON_UNPACK_METHODS 1
- #endif
- #undef CYTHON_FAST_THREAD_STATE
- #define CYTHON_FAST_THREAD_STATE 0
- #undef CYTHON_FAST_PYCALL
- #define CYTHON_FAST_PYCALL 0
- #undef CYTHON_PEP489_MULTI_PHASE_INIT
- #define CYTHON_PEP489_MULTI_PHASE_INIT 0
- #undef CYTHON_USE_TP_FINALIZE
- #define CYTHON_USE_TP_FINALIZE 0
- #undef CYTHON_USE_DICT_VERSIONS
- #define CYTHON_USE_DICT_VERSIONS 0
- #undef CYTHON_USE_EXC_INFO_STACK
- #define CYTHON_USE_EXC_INFO_STACK 0
-#else
- #define CYTHON_COMPILING_IN_PYPY 0
- #define CYTHON_COMPILING_IN_PYSTON 0
- #define CYTHON_COMPILING_IN_CPYTHON 1
- #ifndef CYTHON_USE_TYPE_SLOTS
- #define CYTHON_USE_TYPE_SLOTS 1
- #endif
- #if PY_VERSION_HEX < 0x02070000
- #undef CYTHON_USE_PYTYPE_LOOKUP
- #define CYTHON_USE_PYTYPE_LOOKUP 0
- #elif !defined(CYTHON_USE_PYTYPE_LOOKUP)
- #define CYTHON_USE_PYTYPE_LOOKUP 1
- #endif
- #if PY_MAJOR_VERSION < 3
- #undef CYTHON_USE_ASYNC_SLOTS
- #define CYTHON_USE_ASYNC_SLOTS 0
- #elif !defined(CYTHON_USE_ASYNC_SLOTS)
- #define CYTHON_USE_ASYNC_SLOTS 1
- #endif
- #if PY_VERSION_HEX < 0x02070000
- #undef CYTHON_USE_PYLONG_INTERNALS
- #define CYTHON_USE_PYLONG_INTERNALS 0
- #elif !defined(CYTHON_USE_PYLONG_INTERNALS)
- #define CYTHON_USE_PYLONG_INTERNALS 1
- #endif
- #ifndef CYTHON_USE_PYLIST_INTERNALS
- #define CYTHON_USE_PYLIST_INTERNALS 1
- #endif
- #ifndef CYTHON_USE_UNICODE_INTERNALS
- #define CYTHON_USE_UNICODE_INTERNALS 1
- #endif
- #if PY_VERSION_HEX < 0x030300F0
- #undef CYTHON_USE_UNICODE_WRITER
- #define CYTHON_USE_UNICODE_WRITER 0
- #elif !defined(CYTHON_USE_UNICODE_WRITER)
- #define CYTHON_USE_UNICODE_WRITER 1
- #endif
- #ifndef CYTHON_AVOID_BORROWED_REFS
- #define CYTHON_AVOID_BORROWED_REFS 0
- #endif
- #ifndef CYTHON_ASSUME_SAFE_MACROS
- #define CYTHON_ASSUME_SAFE_MACROS 1
- #endif
- #ifndef CYTHON_UNPACK_METHODS
- #define CYTHON_UNPACK_METHODS 1
- #endif
- #ifndef CYTHON_FAST_THREAD_STATE
- #define CYTHON_FAST_THREAD_STATE 1
- #endif
- #ifndef CYTHON_FAST_PYCALL
- #define CYTHON_FAST_PYCALL 1
- #endif
- #ifndef CYTHON_PEP489_MULTI_PHASE_INIT
- #define CYTHON_PEP489_MULTI_PHASE_INIT (PY_VERSION_HEX >= 0x03050000)
- #endif
- #ifndef CYTHON_USE_TP_FINALIZE
- #define CYTHON_USE_TP_FINALIZE (PY_VERSION_HEX >= 0x030400a1)
- #endif
- #ifndef CYTHON_USE_DICT_VERSIONS
- #define CYTHON_USE_DICT_VERSIONS (PY_VERSION_HEX >= 0x030600B1)
- #endif
- #ifndef CYTHON_USE_EXC_INFO_STACK
- #define CYTHON_USE_EXC_INFO_STACK (PY_VERSION_HEX >= 0x030700A3)
- #endif
-#endif
-#if !defined(CYTHON_FAST_PYCCALL)
-#define CYTHON_FAST_PYCCALL (CYTHON_FAST_PYCALL && PY_VERSION_HEX >= 0x030600B1)
-#endif
-#if CYTHON_USE_PYLONG_INTERNALS
- #include "longintrepr.h"
- #undef SHIFT
- #undef BASE
- #undef MASK
- #ifdef SIZEOF_VOID_P
- enum { __pyx_check_sizeof_voidp = 1 / (int)(SIZEOF_VOID_P == sizeof(void*)) };
- #endif
-#endif
-#ifndef __has_attribute
- #define __has_attribute(x) 0
-#endif
-#ifndef __has_cpp_attribute
- #define __has_cpp_attribute(x) 0
-#endif
-#ifndef CYTHON_RESTRICT
- #if defined(__GNUC__)
- #define CYTHON_RESTRICT __restrict__
- #elif defined(_MSC_VER) && _MSC_VER >= 1400
- #define CYTHON_RESTRICT __restrict
- #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
- #define CYTHON_RESTRICT restrict
- #else
- #define CYTHON_RESTRICT
- #endif
-#endif
-#ifndef CYTHON_UNUSED
-# if defined(__GNUC__)
-# if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4))
-# define CYTHON_UNUSED __attribute__ ((__unused__))
-# else
-# define CYTHON_UNUSED
-# endif
-# elif defined(__ICC) || (defined(__INTEL_COMPILER) && !defined(_MSC_VER))
-# define CYTHON_UNUSED __attribute__ ((__unused__))
-# else
-# define CYTHON_UNUSED
-# endif
-#endif
-#ifndef CYTHON_MAYBE_UNUSED_VAR
-# if defined(__cplusplus)
- template void CYTHON_MAYBE_UNUSED_VAR( const T& ) { }
-# else
-# define CYTHON_MAYBE_UNUSED_VAR(x) (void)(x)
-# endif
-#endif
-#ifndef CYTHON_NCP_UNUSED
-# if CYTHON_COMPILING_IN_CPYTHON
-# define CYTHON_NCP_UNUSED
-# else
-# define CYTHON_NCP_UNUSED CYTHON_UNUSED
-# endif
-#endif
-#define __Pyx_void_to_None(void_result) ((void)(void_result), Py_INCREF(Py_None), Py_None)
-#ifdef _MSC_VER
- #ifndef _MSC_STDINT_H_
- #if _MSC_VER < 1300
- typedef unsigned char uint8_t;
- typedef unsigned int uint32_t;
- #else
- typedef unsigned __int8 uint8_t;
- typedef unsigned __int32 uint32_t;
- #endif
- #endif
-#else
- #include
-#endif
-#ifndef CYTHON_FALLTHROUGH
- #if defined(__cplusplus) && __cplusplus >= 201103L
- #if __has_cpp_attribute(fallthrough)
- #define CYTHON_FALLTHROUGH [[fallthrough]]
- #elif __has_cpp_attribute(clang::fallthrough)
- #define CYTHON_FALLTHROUGH [[clang::fallthrough]]
- #elif __has_cpp_attribute(gnu::fallthrough)
- #define CYTHON_FALLTHROUGH [[gnu::fallthrough]]
- #endif
- #endif
- #ifndef CYTHON_FALLTHROUGH
- #if __has_attribute(fallthrough)
- #define CYTHON_FALLTHROUGH __attribute__((fallthrough))
- #else
- #define CYTHON_FALLTHROUGH
- #endif
- #endif
- #if defined(__clang__ ) && defined(__apple_build_version__)
- #if __apple_build_version__ < 7000000
- #undef CYTHON_FALLTHROUGH
- #define CYTHON_FALLTHROUGH
- #endif
- #endif
-#endif
-
-#ifndef CYTHON_INLINE
- #if defined(__clang__)
- #define CYTHON_INLINE __inline__ __attribute__ ((__unused__))
- #elif defined(__GNUC__)
- #define CYTHON_INLINE __inline__
- #elif defined(_MSC_VER)
- #define CYTHON_INLINE __inline
- #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
- #define CYTHON_INLINE inline
- #else
- #define CYTHON_INLINE
- #endif
-#endif
-
-#if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX < 0x02070600 && !defined(Py_OptimizeFlag)
- #define Py_OptimizeFlag 0
-#endif
-#define __PYX_BUILD_PY_SSIZE_T "n"
-#define CYTHON_FORMAT_SSIZE_T "z"
-#if PY_MAJOR_VERSION < 3
- #define __Pyx_BUILTIN_MODULE_NAME "__builtin__"
- #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\
- PyCode_New(a+k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)
- #define __Pyx_DefaultClassType PyClass_Type
-#else
- #define __Pyx_BUILTIN_MODULE_NAME "builtins"
-#if PY_VERSION_HEX >= 0x030800A4 && PY_VERSION_HEX < 0x030800B2
- #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\
- PyCode_New(a, 0, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)
-#else
- #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\
- PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)
-#endif
- #define __Pyx_DefaultClassType PyType_Type
-#endif
-#ifndef Py_TPFLAGS_CHECKTYPES
- #define Py_TPFLAGS_CHECKTYPES 0
-#endif
-#ifndef Py_TPFLAGS_HAVE_INDEX
- #define Py_TPFLAGS_HAVE_INDEX 0
-#endif
-#ifndef Py_TPFLAGS_HAVE_NEWBUFFER
- #define Py_TPFLAGS_HAVE_NEWBUFFER 0
-#endif
-#ifndef Py_TPFLAGS_HAVE_FINALIZE
- #define Py_TPFLAGS_HAVE_FINALIZE 0
-#endif
-#ifndef METH_STACKLESS
- #define METH_STACKLESS 0
-#endif
-#if PY_VERSION_HEX <= 0x030700A3 || !defined(METH_FASTCALL)
- #ifndef METH_FASTCALL
- #define METH_FASTCALL 0x80
- #endif
- typedef PyObject *(*__Pyx_PyCFunctionFast) (PyObject *self, PyObject *const *args, Py_ssize_t nargs);
- typedef PyObject *(*__Pyx_PyCFunctionFastWithKeywords) (PyObject *self, PyObject *const *args,
- Py_ssize_t nargs, PyObject *kwnames);
-#else
- #define __Pyx_PyCFunctionFast _PyCFunctionFast
- #define __Pyx_PyCFunctionFastWithKeywords _PyCFunctionFastWithKeywords
-#endif
-#if CYTHON_FAST_PYCCALL
-#define __Pyx_PyFastCFunction_Check(func)\
- ((PyCFunction_Check(func) && (METH_FASTCALL == (PyCFunction_GET_FLAGS(func) & ~(METH_CLASS | METH_STATIC | METH_COEXIST | METH_KEYWORDS | METH_STACKLESS)))))
-#else
-#define __Pyx_PyFastCFunction_Check(func) 0
-#endif
-#if CYTHON_COMPILING_IN_PYPY && !defined(PyObject_Malloc)
- #define PyObject_Malloc(s) PyMem_Malloc(s)
- #define PyObject_Free(p) PyMem_Free(p)
- #define PyObject_Realloc(p) PyMem_Realloc(p)
-#endif
-#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030400A1
- #define PyMem_RawMalloc(n) PyMem_Malloc(n)
- #define PyMem_RawRealloc(p, n) PyMem_Realloc(p, n)
- #define PyMem_RawFree(p) PyMem_Free(p)
-#endif
-#if CYTHON_COMPILING_IN_PYSTON
- #define __Pyx_PyCode_HasFreeVars(co) PyCode_HasFreeVars(co)
- #define __Pyx_PyFrame_SetLineNumber(frame, lineno) PyFrame_SetLineNumber(frame, lineno)
-#else
- #define __Pyx_PyCode_HasFreeVars(co) (PyCode_GetNumFree(co) > 0)
- #define __Pyx_PyFrame_SetLineNumber(frame, lineno) (frame)->f_lineno = (lineno)
-#endif
-#if !CYTHON_FAST_THREAD_STATE || PY_VERSION_HEX < 0x02070000
- #define __Pyx_PyThreadState_Current PyThreadState_GET()
-#elif PY_VERSION_HEX >= 0x03060000
- #define __Pyx_PyThreadState_Current _PyThreadState_UncheckedGet()
-#elif PY_VERSION_HEX >= 0x03000000
- #define __Pyx_PyThreadState_Current PyThreadState_GET()
-#else
- #define __Pyx_PyThreadState_Current _PyThreadState_Current
-#endif
-#if PY_VERSION_HEX < 0x030700A2 && !defined(PyThread_tss_create) && !defined(Py_tss_NEEDS_INIT)
-#include "pythread.h"
-#define Py_tss_NEEDS_INIT 0
-typedef int Py_tss_t;
-static CYTHON_INLINE int PyThread_tss_create(Py_tss_t *key) {
- *key = PyThread_create_key();
- return 0;
-}
-static CYTHON_INLINE Py_tss_t * PyThread_tss_alloc(void) {
- Py_tss_t *key = (Py_tss_t *)PyObject_Malloc(sizeof(Py_tss_t));
- *key = Py_tss_NEEDS_INIT;
- return key;
-}
-static CYTHON_INLINE void PyThread_tss_free(Py_tss_t *key) {
- PyObject_Free(key);
-}
-static CYTHON_INLINE int PyThread_tss_is_created(Py_tss_t *key) {
- return *key != Py_tss_NEEDS_INIT;
-}
-static CYTHON_INLINE void PyThread_tss_delete(Py_tss_t *key) {
- PyThread_delete_key(*key);
- *key = Py_tss_NEEDS_INIT;
-}
-static CYTHON_INLINE int PyThread_tss_set(Py_tss_t *key, void *value) {
- return PyThread_set_key_value(*key, value);
-}
-static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) {
- return PyThread_get_key_value(*key);
-}
-#endif
-#if CYTHON_COMPILING_IN_CPYTHON || defined(_PyDict_NewPresized)
-#define __Pyx_PyDict_NewPresized(n) ((n <= 8) ? PyDict_New() : _PyDict_NewPresized(n))
-#else
-#define __Pyx_PyDict_NewPresized(n) PyDict_New()
-#endif
-#if PY_MAJOR_VERSION >= 3 || CYTHON_FUTURE_DIVISION
- #define __Pyx_PyNumber_Divide(x,y) PyNumber_TrueDivide(x,y)
- #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceTrueDivide(x,y)
-#else
- #define __Pyx_PyNumber_Divide(x,y) PyNumber_Divide(x,y)
- #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceDivide(x,y)
-#endif
-#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030500A1 && CYTHON_USE_UNICODE_INTERNALS
-#define __Pyx_PyDict_GetItemStr(dict, name) _PyDict_GetItem_KnownHash(dict, name, ((PyASCIIObject *) name)->hash)
-#else
-#define __Pyx_PyDict_GetItemStr(dict, name) PyDict_GetItem(dict, name)
-#endif
-#if PY_VERSION_HEX > 0x03030000 && defined(PyUnicode_KIND)
- #define CYTHON_PEP393_ENABLED 1
- #define __Pyx_PyUnicode_READY(op) (likely(PyUnicode_IS_READY(op)) ?\
- 0 : _PyUnicode_Ready((PyObject *)(op)))
- #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_LENGTH(u)
- #define __Pyx_PyUnicode_READ_CHAR(u, i) PyUnicode_READ_CHAR(u, i)
- #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) PyUnicode_MAX_CHAR_VALUE(u)
- #define __Pyx_PyUnicode_KIND(u) PyUnicode_KIND(u)
- #define __Pyx_PyUnicode_DATA(u) PyUnicode_DATA(u)
- #define __Pyx_PyUnicode_READ(k, d, i) PyUnicode_READ(k, d, i)
- #define __Pyx_PyUnicode_WRITE(k, d, i, ch) PyUnicode_WRITE(k, d, i, ch)
- #if defined(PyUnicode_IS_READY) && defined(PyUnicode_GET_SIZE)
- #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : PyUnicode_GET_SIZE(u)))
- #else
- #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GET_LENGTH(u))
- #endif
-#else
- #define CYTHON_PEP393_ENABLED 0
- #define PyUnicode_1BYTE_KIND 1
- #define PyUnicode_2BYTE_KIND 2
- #define PyUnicode_4BYTE_KIND 4
- #define __Pyx_PyUnicode_READY(op) (0)
- #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_SIZE(u)
- #define __Pyx_PyUnicode_READ_CHAR(u, i) ((Py_UCS4)(PyUnicode_AS_UNICODE(u)[i]))
- #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) ((sizeof(Py_UNICODE) == 2) ? 65535 : 1114111)
- #define __Pyx_PyUnicode_KIND(u) (sizeof(Py_UNICODE))
- #define __Pyx_PyUnicode_DATA(u) ((void*)PyUnicode_AS_UNICODE(u))
- #define __Pyx_PyUnicode_READ(k, d, i) ((void)(k), (Py_UCS4)(((Py_UNICODE*)d)[i]))
- #define __Pyx_PyUnicode_WRITE(k, d, i, ch) (((void)(k)), ((Py_UNICODE*)d)[i] = ch)
- #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GET_SIZE(u))
-#endif
-#if CYTHON_COMPILING_IN_PYPY
- #define __Pyx_PyUnicode_Concat(a, b) PyNumber_Add(a, b)
- #define __Pyx_PyUnicode_ConcatSafe(a, b) PyNumber_Add(a, b)
-#else
- #define __Pyx_PyUnicode_Concat(a, b) PyUnicode_Concat(a, b)
- #define __Pyx_PyUnicode_ConcatSafe(a, b) ((unlikely((a) == Py_None) || unlikely((b) == Py_None)) ?\
- PyNumber_Add(a, b) : __Pyx_PyUnicode_Concat(a, b))
-#endif
-#if CYTHON_COMPILING_IN_PYPY && !defined(PyUnicode_Contains)
- #define PyUnicode_Contains(u, s) PySequence_Contains(u, s)
-#endif
-#if CYTHON_COMPILING_IN_PYPY && !defined(PyByteArray_Check)
- #define PyByteArray_Check(obj) PyObject_TypeCheck(obj, &PyByteArray_Type)
-#endif
-#if CYTHON_COMPILING_IN_PYPY && !defined(PyObject_Format)
- #define PyObject_Format(obj, fmt) PyObject_CallMethod(obj, "__format__", "O", fmt)
-#endif
-#define __Pyx_PyString_FormatSafe(a, b) ((unlikely((a) == Py_None || (PyString_Check(b) && !PyString_CheckExact(b)))) ? PyNumber_Remainder(a, b) : __Pyx_PyString_Format(a, b))
-#define __Pyx_PyUnicode_FormatSafe(a, b) ((unlikely((a) == Py_None || (PyUnicode_Check(b) && !PyUnicode_CheckExact(b)))) ? PyNumber_Remainder(a, b) : PyUnicode_Format(a, b))
-#if PY_MAJOR_VERSION >= 3
- #define __Pyx_PyString_Format(a, b) PyUnicode_Format(a, b)
-#else
- #define __Pyx_PyString_Format(a, b) PyString_Format(a, b)
-#endif
-#if PY_MAJOR_VERSION < 3 && !defined(PyObject_ASCII)
- #define PyObject_ASCII(o) PyObject_Repr(o)
-#endif
-#if PY_MAJOR_VERSION >= 3
- #define PyBaseString_Type PyUnicode_Type
- #define PyStringObject PyUnicodeObject
- #define PyString_Type PyUnicode_Type
- #define PyString_Check PyUnicode_Check
- #define PyString_CheckExact PyUnicode_CheckExact
-#ifndef PyObject_Unicode
- #define PyObject_Unicode PyObject_Str
-#endif
-#endif
-#if PY_MAJOR_VERSION >= 3
- #define __Pyx_PyBaseString_Check(obj) PyUnicode_Check(obj)
- #define __Pyx_PyBaseString_CheckExact(obj) PyUnicode_CheckExact(obj)
-#else
- #define __Pyx_PyBaseString_Check(obj) (PyString_Check(obj) || PyUnicode_Check(obj))
- #define __Pyx_PyBaseString_CheckExact(obj) (PyString_CheckExact(obj) || PyUnicode_CheckExact(obj))
-#endif
-#ifndef PySet_CheckExact
- #define PySet_CheckExact(obj) (Py_TYPE(obj) == &PySet_Type)
-#endif
-#if PY_VERSION_HEX >= 0x030900A4
- #define __Pyx_SET_REFCNT(obj, refcnt) Py_SET_REFCNT(obj, refcnt)
- #define __Pyx_SET_SIZE(obj, size) Py_SET_SIZE(obj, size)
-#else
- #define __Pyx_SET_REFCNT(obj, refcnt) Py_REFCNT(obj) = (refcnt)
- #define __Pyx_SET_SIZE(obj, size) Py_SIZE(obj) = (size)
-#endif
-#if CYTHON_ASSUME_SAFE_MACROS
- #define __Pyx_PySequence_SIZE(seq) Py_SIZE(seq)
-#else
- #define __Pyx_PySequence_SIZE(seq) PySequence_Size(seq)
-#endif
-#if PY_MAJOR_VERSION >= 3
- #define PyIntObject PyLongObject
- #define PyInt_Type PyLong_Type
- #define PyInt_Check(op) PyLong_Check(op)
- #define PyInt_CheckExact(op) PyLong_CheckExact(op)
- #define PyInt_FromString PyLong_FromString
- #define PyInt_FromUnicode PyLong_FromUnicode
- #define PyInt_FromLong PyLong_FromLong
- #define PyInt_FromSize_t PyLong_FromSize_t
- #define PyInt_FromSsize_t PyLong_FromSsize_t
- #define PyInt_AsLong PyLong_AsLong
- #define PyInt_AS_LONG PyLong_AS_LONG
- #define PyInt_AsSsize_t PyLong_AsSsize_t
- #define PyInt_AsUnsignedLongMask PyLong_AsUnsignedLongMask
- #define PyInt_AsUnsignedLongLongMask PyLong_AsUnsignedLongLongMask
- #define PyNumber_Int PyNumber_Long
-#endif
-#if PY_MAJOR_VERSION >= 3
- #define PyBoolObject PyLongObject
-#endif
-#if PY_MAJOR_VERSION >= 3 && CYTHON_COMPILING_IN_PYPY
- #ifndef PyUnicode_InternFromString
- #define PyUnicode_InternFromString(s) PyUnicode_FromString(s)
- #endif
-#endif
-#if PY_VERSION_HEX < 0x030200A4
- typedef long Py_hash_t;
- #define __Pyx_PyInt_FromHash_t PyInt_FromLong
- #define __Pyx_PyInt_AsHash_t PyInt_AsLong
-#else
- #define __Pyx_PyInt_FromHash_t PyInt_FromSsize_t
- #define __Pyx_PyInt_AsHash_t PyInt_AsSsize_t
-#endif
-#if PY_MAJOR_VERSION >= 3
- #define __Pyx_PyMethod_New(func, self, klass) ((self) ? ((void)(klass), PyMethod_New(func, self)) : __Pyx_NewRef(func))
-#else
- #define __Pyx_PyMethod_New(func, self, klass) PyMethod_New(func, self, klass)
-#endif
-#if CYTHON_USE_ASYNC_SLOTS
- #if PY_VERSION_HEX >= 0x030500B1
- #define __Pyx_PyAsyncMethodsStruct PyAsyncMethods
- #define __Pyx_PyType_AsAsync(obj) (Py_TYPE(obj)->tp_as_async)
- #else
- #define __Pyx_PyType_AsAsync(obj) ((__Pyx_PyAsyncMethodsStruct*) (Py_TYPE(obj)->tp_reserved))
- #endif
-#else
- #define __Pyx_PyType_AsAsync(obj) NULL
-#endif
-#ifndef __Pyx_PyAsyncMethodsStruct
- typedef struct {
- unaryfunc am_await;
- unaryfunc am_aiter;
- unaryfunc am_anext;
- } __Pyx_PyAsyncMethodsStruct;
-#endif
-
-#if defined(WIN32) || defined(MS_WINDOWS)
- #define _USE_MATH_DEFINES
-#endif
-#include
-#ifdef NAN
-#define __PYX_NAN() ((float) NAN)
-#else
-static CYTHON_INLINE float __PYX_NAN() {
- float value;
- memset(&value, 0xFF, sizeof(value));
- return value;
-}
-#endif
-#if defined(__CYGWIN__) && defined(_LDBL_EQ_DBL)
-#define __Pyx_truncl trunc
-#else
-#define __Pyx_truncl truncl
-#endif
-
-#define __PYX_MARK_ERR_POS(f_index, lineno) \
- { __pyx_filename = __pyx_f[f_index]; (void)__pyx_filename; __pyx_lineno = lineno; (void)__pyx_lineno; __pyx_clineno = __LINE__; (void)__pyx_clineno; }
-#define __PYX_ERR(f_index, lineno, Ln_error) \
- { __PYX_MARK_ERR_POS(f_index, lineno) goto Ln_error; }
-
-#ifndef __PYX_EXTERN_C
- #ifdef __cplusplus
- #define __PYX_EXTERN_C extern "C"
- #else
- #define __PYX_EXTERN_C extern
- #endif
-#endif
-
-#define __PYX_HAVE__frozenlist___frozenlist
-#define __PYX_HAVE_API__frozenlist___frozenlist
-/* Early includes */
-#ifdef _OPENMP
-#include
-#endif /* _OPENMP */
-
-#if defined(PYREX_WITHOUT_ASSERTIONS) && !defined(CYTHON_WITHOUT_ASSERTIONS)
-#define CYTHON_WITHOUT_ASSERTIONS
-#endif
-
-typedef struct {PyObject **p; const char *s; const Py_ssize_t n; const char* encoding;
- const char is_unicode; const char is_str; const char intern; } __Pyx_StringTabEntry;
-
-#define __PYX_DEFAULT_STRING_ENCODING_IS_ASCII 0
-#define __PYX_DEFAULT_STRING_ENCODING_IS_UTF8 0
-#define __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT (PY_MAJOR_VERSION >= 3 && __PYX_DEFAULT_STRING_ENCODING_IS_UTF8)
-#define __PYX_DEFAULT_STRING_ENCODING ""
-#define __Pyx_PyObject_FromString __Pyx_PyBytes_FromString
-#define __Pyx_PyObject_FromStringAndSize __Pyx_PyBytes_FromStringAndSize
-#define __Pyx_uchar_cast(c) ((unsigned char)c)
-#define __Pyx_long_cast(x) ((long)x)
-#define __Pyx_fits_Py_ssize_t(v, type, is_signed) (\
- (sizeof(type) < sizeof(Py_ssize_t)) ||\
- (sizeof(type) > sizeof(Py_ssize_t) &&\
- likely(v < (type)PY_SSIZE_T_MAX ||\
- v == (type)PY_SSIZE_T_MAX) &&\
- (!is_signed || likely(v > (type)PY_SSIZE_T_MIN ||\
- v == (type)PY_SSIZE_T_MIN))) ||\
- (sizeof(type) == sizeof(Py_ssize_t) &&\
- (is_signed || likely(v < (type)PY_SSIZE_T_MAX ||\
- v == (type)PY_SSIZE_T_MAX))) )
-static CYTHON_INLINE int __Pyx_is_valid_index(Py_ssize_t i, Py_ssize_t limit) {
- return (size_t) i < (size_t) limit;
-}
-#if defined (__cplusplus) && __cplusplus >= 201103L
- #include
- #define __Pyx_sst_abs(value) std::abs(value)
-#elif SIZEOF_INT >= SIZEOF_SIZE_T
- #define __Pyx_sst_abs(value) abs(value)
-#elif SIZEOF_LONG >= SIZEOF_SIZE_T
- #define __Pyx_sst_abs(value) labs(value)
-#elif defined (_MSC_VER)
- #define __Pyx_sst_abs(value) ((Py_ssize_t)_abs64(value))
-#elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
- #define __Pyx_sst_abs(value) llabs(value)
-#elif defined (__GNUC__)
- #define __Pyx_sst_abs(value) __builtin_llabs(value)
-#else
- #define __Pyx_sst_abs(value) ((value<0) ? -value : value)
-#endif
-static CYTHON_INLINE const char* __Pyx_PyObject_AsString(PyObject*);
-static CYTHON_INLINE const char* __Pyx_PyObject_AsStringAndSize(PyObject*, Py_ssize_t* length);
-#define __Pyx_PyByteArray_FromString(s) PyByteArray_FromStringAndSize((const char*)s, strlen((const char*)s))
-#define __Pyx_PyByteArray_FromStringAndSize(s, l) PyByteArray_FromStringAndSize((const char*)s, l)
-#define __Pyx_PyBytes_FromString PyBytes_FromString
-#define __Pyx_PyBytes_FromStringAndSize PyBytes_FromStringAndSize
-static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char*);
-#if PY_MAJOR_VERSION < 3
- #define __Pyx_PyStr_FromString __Pyx_PyBytes_FromString
- #define __Pyx_PyStr_FromStringAndSize __Pyx_PyBytes_FromStringAndSize
-#else
- #define __Pyx_PyStr_FromString __Pyx_PyUnicode_FromString
- #define __Pyx_PyStr_FromStringAndSize __Pyx_PyUnicode_FromStringAndSize
-#endif
-#define __Pyx_PyBytes_AsWritableString(s) ((char*) PyBytes_AS_STRING(s))
-#define __Pyx_PyBytes_AsWritableSString(s) ((signed char*) PyBytes_AS_STRING(s))
-#define __Pyx_PyBytes_AsWritableUString(s) ((unsigned char*) PyBytes_AS_STRING(s))
-#define __Pyx_PyBytes_AsString(s) ((const char*) PyBytes_AS_STRING(s))
-#define __Pyx_PyBytes_AsSString(s) ((const signed char*) PyBytes_AS_STRING(s))
-#define __Pyx_PyBytes_AsUString(s) ((const unsigned char*) PyBytes_AS_STRING(s))
-#define __Pyx_PyObject_AsWritableString(s) ((char*) __Pyx_PyObject_AsString(s))
-#define __Pyx_PyObject_AsWritableSString(s) ((signed char*) __Pyx_PyObject_AsString(s))
-#define __Pyx_PyObject_AsWritableUString(s) ((unsigned char*) __Pyx_PyObject_AsString(s))
-#define __Pyx_PyObject_AsSString(s) ((const signed char*) __Pyx_PyObject_AsString(s))
-#define __Pyx_PyObject_AsUString(s) ((const unsigned char*) __Pyx_PyObject_AsString(s))
-#define __Pyx_PyObject_FromCString(s) __Pyx_PyObject_FromString((const char*)s)
-#define __Pyx_PyBytes_FromCString(s) __Pyx_PyBytes_FromString((const char*)s)
-#define __Pyx_PyByteArray_FromCString(s) __Pyx_PyByteArray_FromString((const char*)s)
-#define __Pyx_PyStr_FromCString(s) __Pyx_PyStr_FromString((const char*)s)
-#define __Pyx_PyUnicode_FromCString(s) __Pyx_PyUnicode_FromString((const char*)s)
-static CYTHON_INLINE size_t __Pyx_Py_UNICODE_strlen(const Py_UNICODE *u) {
- const Py_UNICODE *u_end = u;
- while (*u_end++) ;
- return (size_t)(u_end - u - 1);
-}
-#define __Pyx_PyUnicode_FromUnicode(u) PyUnicode_FromUnicode(u, __Pyx_Py_UNICODE_strlen(u))
-#define __Pyx_PyUnicode_FromUnicodeAndLength PyUnicode_FromUnicode
-#define __Pyx_PyUnicode_AsUnicode PyUnicode_AsUnicode
-#define __Pyx_NewRef(obj) (Py_INCREF(obj), obj)
-#define __Pyx_Owned_Py_None(b) __Pyx_NewRef(Py_None)
-static CYTHON_INLINE PyObject * __Pyx_PyBool_FromLong(long b);
-static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject*);
-static CYTHON_INLINE int __Pyx_PyObject_IsTrueAndDecref(PyObject*);
-static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x);
-#define __Pyx_PySequence_Tuple(obj)\
- (likely(PyTuple_CheckExact(obj)) ? __Pyx_NewRef(obj) : PySequence_Tuple(obj))
-static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject*);
-static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t);
-#if CYTHON_ASSUME_SAFE_MACROS
-#define __pyx_PyFloat_AsDouble(x) (PyFloat_CheckExact(x) ? PyFloat_AS_DOUBLE(x) : PyFloat_AsDouble(x))
-#else
-#define __pyx_PyFloat_AsDouble(x) PyFloat_AsDouble(x)
-#endif
-#define __pyx_PyFloat_AsFloat(x) ((float) __pyx_PyFloat_AsDouble(x))
-#if PY_MAJOR_VERSION >= 3
-#define __Pyx_PyNumber_Int(x) (PyLong_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Long(x))
-#else
-#define __Pyx_PyNumber_Int(x) (PyInt_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Int(x))
-#endif
-#define __Pyx_PyNumber_Float(x) (PyFloat_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Float(x))
-#if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII
-static int __Pyx_sys_getdefaultencoding_not_ascii;
-static int __Pyx_init_sys_getdefaultencoding_params(void) {
- PyObject* sys;
- PyObject* default_encoding = NULL;
- PyObject* ascii_chars_u = NULL;
- PyObject* ascii_chars_b = NULL;
- const char* default_encoding_c;
- sys = PyImport_ImportModule("sys");
- if (!sys) goto bad;
- default_encoding = PyObject_CallMethod(sys, (char*) "getdefaultencoding", NULL);
- Py_DECREF(sys);
- if (!default_encoding) goto bad;
- default_encoding_c = PyBytes_AsString(default_encoding);
- if (!default_encoding_c) goto bad;
- if (strcmp(default_encoding_c, "ascii") == 0) {
- __Pyx_sys_getdefaultencoding_not_ascii = 0;
- } else {
- char ascii_chars[128];
- int c;
- for (c = 0; c < 128; c++) {
- ascii_chars[c] = c;
- }
- __Pyx_sys_getdefaultencoding_not_ascii = 1;
- ascii_chars_u = PyUnicode_DecodeASCII(ascii_chars, 128, NULL);
- if (!ascii_chars_u) goto bad;
- ascii_chars_b = PyUnicode_AsEncodedString(ascii_chars_u, default_encoding_c, NULL);
- if (!ascii_chars_b || !PyBytes_Check(ascii_chars_b) || memcmp(ascii_chars, PyBytes_AS_STRING(ascii_chars_b), 128) != 0) {
- PyErr_Format(
- PyExc_ValueError,
- "This module compiled with c_string_encoding=ascii, but default encoding '%.200s' is not a superset of ascii.",
- default_encoding_c);
- goto bad;
- }
- Py_DECREF(ascii_chars_u);
- Py_DECREF(ascii_chars_b);
- }
- Py_DECREF(default_encoding);
- return 0;
-bad:
- Py_XDECREF(default_encoding);
- Py_XDECREF(ascii_chars_u);
- Py_XDECREF(ascii_chars_b);
- return -1;
-}
-#endif
-#if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT && PY_MAJOR_VERSION >= 3
-#define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_DecodeUTF8(c_str, size, NULL)
-#else
-#define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_Decode(c_str, size, __PYX_DEFAULT_STRING_ENCODING, NULL)
-#if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT
-static char* __PYX_DEFAULT_STRING_ENCODING;
-static int __Pyx_init_sys_getdefaultencoding_params(void) {
- PyObject* sys;
- PyObject* default_encoding = NULL;
- char* default_encoding_c;
- sys = PyImport_ImportModule("sys");
- if (!sys) goto bad;
- default_encoding = PyObject_CallMethod(sys, (char*) (const char*) "getdefaultencoding", NULL);
- Py_DECREF(sys);
- if (!default_encoding) goto bad;
- default_encoding_c = PyBytes_AsString(default_encoding);
- if (!default_encoding_c) goto bad;
- __PYX_DEFAULT_STRING_ENCODING = (char*) malloc(strlen(default_encoding_c) + 1);
- if (!__PYX_DEFAULT_STRING_ENCODING) goto bad;
- strcpy(__PYX_DEFAULT_STRING_ENCODING, default_encoding_c);
- Py_DECREF(default_encoding);
- return 0;
-bad:
- Py_XDECREF(default_encoding);
- return -1;
-}
-#endif
-#endif
-
-
-/* Test for GCC > 2.95 */
-#if defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))
- #define likely(x) __builtin_expect(!!(x), 1)
- #define unlikely(x) __builtin_expect(!!(x), 0)
-#else /* !__GNUC__ or GCC < 2.95 */
- #define likely(x) (x)
- #define unlikely(x) (x)
-#endif /* __GNUC__ */
-static CYTHON_INLINE void __Pyx_pretend_to_initialize(void* ptr) { (void)ptr; }
-
-static PyObject *__pyx_m = NULL;
-static PyObject *__pyx_d;
-static PyObject *__pyx_b;
-static PyObject *__pyx_cython_runtime = NULL;
-static PyObject *__pyx_empty_tuple;
-static PyObject *__pyx_empty_bytes;
-static PyObject *__pyx_empty_unicode;
-static int __pyx_lineno;
-static int __pyx_clineno = 0;
-static const char * __pyx_cfilenm= __FILE__;
-static const char *__pyx_filename;
-
-
-static const char *__pyx_f[] = {
- "frozenlist/_frozenlist.pyx",
- "stringsource",
-};
-
-/*--- Type declarations ---*/
-struct __pyx_obj_10frozenlist_11_frozenlist_FrozenList;
-
-/* "frozenlist/_frozenlist.pyx":4
- *
- *
- * cdef class FrozenList: # <<<<<<<<<<<<<<
- *
- * cdef readonly bint frozen
- */
-struct __pyx_obj_10frozenlist_11_frozenlist_FrozenList {
- PyObject_HEAD
- struct __pyx_vtabstruct_10frozenlist_11_frozenlist_FrozenList *__pyx_vtab;
- int frozen;
- PyObject *_items;
-};
-
-
-
-struct __pyx_vtabstruct_10frozenlist_11_frozenlist_FrozenList {
- PyObject *(*_check_frozen)(struct __pyx_obj_10frozenlist_11_frozenlist_FrozenList *);
- PyObject *(*_fast_len)(struct __pyx_obj_10frozenlist_11_frozenlist_FrozenList *);
-};
-static struct __pyx_vtabstruct_10frozenlist_11_frozenlist_FrozenList *__pyx_vtabptr_10frozenlist_11_frozenlist_FrozenList;
-static CYTHON_INLINE PyObject *__pyx_f_10frozenlist_11_frozenlist_10FrozenList__fast_len(struct __pyx_obj_10frozenlist_11_frozenlist_FrozenList *);
-
-/* --- Runtime support code (head) --- */
-/* Refnanny.proto */
-#ifndef CYTHON_REFNANNY
- #define CYTHON_REFNANNY 0
-#endif
-#if CYTHON_REFNANNY
- typedef struct {
- void (*INCREF)(void*, PyObject*, int);
- void (*DECREF)(void*, PyObject*, int);
- void (*GOTREF)(void*, PyObject*, int);
- void (*GIVEREF)(void*, PyObject*, int);
- void* (*SetupContext)(const char*, int, const char*);
- void (*FinishContext)(void**);
- } __Pyx_RefNannyAPIStruct;
- static __Pyx_RefNannyAPIStruct *__Pyx_RefNanny = NULL;
- static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname);
- #define __Pyx_RefNannyDeclarations void *__pyx_refnanny = NULL;
-#ifdef WITH_THREAD
- #define __Pyx_RefNannySetupContext(name, acquire_gil)\
- if (acquire_gil) {\
- PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure();\
- __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__);\
- PyGILState_Release(__pyx_gilstate_save);\
- } else {\
- __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__);\
- }
-#else
- #define __Pyx_RefNannySetupContext(name, acquire_gil)\
- __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__)
-#endif
- #define __Pyx_RefNannyFinishContext()\
- __Pyx_RefNanny->FinishContext(&__pyx_refnanny)
- #define __Pyx_INCREF(r) __Pyx_RefNanny->INCREF(__pyx_refnanny, (PyObject *)(r), __LINE__)
- #define __Pyx_DECREF(r) __Pyx_RefNanny->DECREF(__pyx_refnanny, (PyObject *)(r), __LINE__)
- #define __Pyx_GOTREF(r) __Pyx_RefNanny->GOTREF(__pyx_refnanny, (PyObject *)(r), __LINE__)
- #define __Pyx_GIVEREF(r) __Pyx_RefNanny->GIVEREF(__pyx_refnanny, (PyObject *)(r), __LINE__)
- #define __Pyx_XINCREF(r) do { if((r) != NULL) {__Pyx_INCREF(r); }} while(0)
- #define __Pyx_XDECREF(r) do { if((r) != NULL) {__Pyx_DECREF(r); }} while(0)
- #define __Pyx_XGOTREF(r) do { if((r) != NULL) {__Pyx_GOTREF(r); }} while(0)
- #define __Pyx_XGIVEREF(r) do { if((r) != NULL) {__Pyx_GIVEREF(r);}} while(0)
-#else
- #define __Pyx_RefNannyDeclarations
- #define __Pyx_RefNannySetupContext(name, acquire_gil)
- #define __Pyx_RefNannyFinishContext()
- #define __Pyx_INCREF(r) Py_INCREF(r)
- #define __Pyx_DECREF(r) Py_DECREF(r)
- #define __Pyx_GOTREF(r)
- #define __Pyx_GIVEREF(r)
- #define __Pyx_XINCREF(r) Py_XINCREF(r)
- #define __Pyx_XDECREF(r) Py_XDECREF(r)
- #define __Pyx_XGOTREF(r)
- #define __Pyx_XGIVEREF(r)
-#endif
-#define __Pyx_XDECREF_SET(r, v) do {\
- PyObject *tmp = (PyObject *) r;\
- r = v; __Pyx_XDECREF(tmp);\
- } while (0)
-#define __Pyx_DECREF_SET(r, v) do {\
- PyObject *tmp = (PyObject *) r;\
- r = v; __Pyx_DECREF(tmp);\
- } while (0)
-#define __Pyx_CLEAR(r) do { PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);} while(0)
-#define __Pyx_XCLEAR(r) do { if((r) != NULL) {PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);}} while(0)
-
-/* PyObjectGetAttrStr.proto */
-#if CYTHON_USE_TYPE_SLOTS
-static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject* attr_name);
-#else
-#define __Pyx_PyObject_GetAttrStr(o,n) PyObject_GetAttr(o,n)
-#endif
-
-/* GetBuiltinName.proto */
-static PyObject *__Pyx_GetBuiltinName(PyObject *name);
-
-/* RaiseDoubleKeywords.proto */
-static void __Pyx_RaiseDoubleKeywordsError(const char* func_name, PyObject* kw_name);
-
-/* ParseKeywords.proto */
-static int __Pyx_ParseOptionalKeywords(PyObject *kwds, PyObject **argnames[],\
- PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args,\
- const char* function_name);
-
-/* RaiseArgTupleInvalid.proto */
-static void __Pyx_RaiseArgtupleInvalid(const char* func_name, int exact,
- Py_ssize_t num_min, Py_ssize_t num_max, Py_ssize_t num_found);
-
-/* PyObjectCall.proto */
-#if CYTHON_COMPILING_IN_CPYTHON
-static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw);
-#else
-#define __Pyx_PyObject_Call(func, arg, kw) PyObject_Call(func, arg, kw)
-#endif
-
-/* PyThreadStateGet.proto */
-#if CYTHON_FAST_THREAD_STATE
-#define __Pyx_PyThreadState_declare PyThreadState *__pyx_tstate;
-#define __Pyx_PyThreadState_assign __pyx_tstate = __Pyx_PyThreadState_Current;
-#define __Pyx_PyErr_Occurred() __pyx_tstate->curexc_type
-#else
-#define __Pyx_PyThreadState_declare
-#define __Pyx_PyThreadState_assign
-#define __Pyx_PyErr_Occurred() PyErr_Occurred()
-#endif
-
-/* PyErrFetchRestore.proto */
-#if CYTHON_FAST_THREAD_STATE
-#define __Pyx_PyErr_Clear() __Pyx_ErrRestore(NULL, NULL, NULL)
-#define __Pyx_ErrRestoreWithState(type, value, tb) __Pyx_ErrRestoreInState(PyThreadState_GET(), type, value, tb)
-#define __Pyx_ErrFetchWithState(type, value, tb) __Pyx_ErrFetchInState(PyThreadState_GET(), type, value, tb)
-#define __Pyx_ErrRestore(type, value, tb) __Pyx_ErrRestoreInState(__pyx_tstate, type, value, tb)
-#define __Pyx_ErrFetch(type, value, tb) __Pyx_ErrFetchInState(__pyx_tstate, type, value, tb)
-static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb);
-static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb);
-#if CYTHON_COMPILING_IN_CPYTHON
-#define __Pyx_PyErr_SetNone(exc) (Py_INCREF(exc), __Pyx_ErrRestore((exc), NULL, NULL))
-#else
-#define __Pyx_PyErr_SetNone(exc) PyErr_SetNone(exc)
-#endif
-#else
-#define __Pyx_PyErr_Clear() PyErr_Clear()
-#define __Pyx_PyErr_SetNone(exc) PyErr_SetNone(exc)
-#define __Pyx_ErrRestoreWithState(type, value, tb) PyErr_Restore(type, value, tb)
-#define __Pyx_ErrFetchWithState(type, value, tb) PyErr_Fetch(type, value, tb)
-#define __Pyx_ErrRestoreInState(tstate, type, value, tb) PyErr_Restore(type, value, tb)
-#define __Pyx_ErrFetchInState(tstate, type, value, tb) PyErr_Fetch(type, value, tb)
-#define __Pyx_ErrRestore(type, value, tb) PyErr_Restore(type, value, tb)
-#define __Pyx_ErrFetch(type, value, tb) PyErr_Fetch(type, value, tb)
-#endif
-
-/* RaiseException.proto */
-static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause);
-
-/* GetItemInt.proto */
-#define __Pyx_GetItemInt(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\
- (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\
- __Pyx_GetItemInt_Fast(o, (Py_ssize_t)i, is_list, wraparound, boundscheck) :\
- (is_list ? (PyErr_SetString(PyExc_IndexError, "list index out of range"), (PyObject*)NULL) :\
- __Pyx_GetItemInt_Generic(o, to_py_func(i))))
-#define __Pyx_GetItemInt_List(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\
- (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\
- __Pyx_GetItemInt_List_Fast(o, (Py_ssize_t)i, wraparound, boundscheck) :\
- (PyErr_SetString(PyExc_IndexError, "list index out of range"), (PyObject*)NULL))
-static CYTHON_INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, Py_ssize_t i,
- int wraparound, int boundscheck);
-#define __Pyx_GetItemInt_Tuple(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\
- (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\
- __Pyx_GetItemInt_Tuple_Fast(o, (Py_ssize_t)i, wraparound, boundscheck) :\
- (PyErr_SetString(PyExc_IndexError, "tuple index out of range"), (PyObject*)NULL))
-static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize_t i,
- int wraparound, int boundscheck);
-static PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j);
-static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i,
- int is_list, int wraparound, int boundscheck);
-
-/* ObjectGetItem.proto */
-#if CYTHON_USE_TYPE_SLOTS
-static CYTHON_INLINE PyObject *__Pyx_PyObject_GetItem(PyObject *obj, PyObject* key);
-#else
-#define __Pyx_PyObject_GetItem(obj, key) PyObject_GetItem(obj, key)
-#endif
-
-/* PyFunctionFastCall.proto */
-#if CYTHON_FAST_PYCALL
-#define __Pyx_PyFunction_FastCall(func, args, nargs)\
- __Pyx_PyFunction_FastCallDict((func), (args), (nargs), NULL)
-#if 1 || PY_VERSION_HEX < 0x030600B1
-static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, Py_ssize_t nargs, PyObject *kwargs);
-#else
-#define __Pyx_PyFunction_FastCallDict(func, args, nargs, kwargs) _PyFunction_FastCallDict(func, args, nargs, kwargs)
-#endif
-#define __Pyx_BUILD_ASSERT_EXPR(cond)\
- (sizeof(char [1 - 2*!(cond)]) - 1)
-#ifndef Py_MEMBER_SIZE
-#define Py_MEMBER_SIZE(type, member) sizeof(((type *)0)->member)
-#endif
- static size_t __pyx_pyframe_localsplus_offset = 0;
- #include "frameobject.h"
- #define __Pxy_PyFrame_Initialize_Offsets()\
- ((void)__Pyx_BUILD_ASSERT_EXPR(sizeof(PyFrameObject) == offsetof(PyFrameObject, f_localsplus) + Py_MEMBER_SIZE(PyFrameObject, f_localsplus)),\
- (void)(__pyx_pyframe_localsplus_offset = ((size_t)PyFrame_Type.tp_basicsize) - Py_MEMBER_SIZE(PyFrameObject, f_localsplus)))
- #define __Pyx_PyFrame_GetLocalsplus(frame)\
- (assert(__pyx_pyframe_localsplus_offset), (PyObject **)(((char *)(frame)) + __pyx_pyframe_localsplus_offset))
-#endif
-
-/* PyObjectCallMethO.proto */
-#if CYTHON_COMPILING_IN_CPYTHON
-static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject *arg);
-#endif
-
-/* PyObjectCallNoArg.proto */
-#if CYTHON_COMPILING_IN_CPYTHON
-static CYTHON_INLINE PyObject* __Pyx_PyObject_CallNoArg(PyObject *func);
-#else
-#define __Pyx_PyObject_CallNoArg(func) __Pyx_PyObject_Call(func, __pyx_empty_tuple, NULL)
-#endif
-
-/* PyCFunctionFastCall.proto */
-#if CYTHON_FAST_PYCCALL
-static CYTHON_INLINE PyObject *__Pyx_PyCFunction_FastCall(PyObject *func, PyObject **args, Py_ssize_t nargs);
-#else
-#define __Pyx_PyCFunction_FastCall(func, args, nargs) (assert(0), NULL)
-#endif
-
-/* PyObjectCallOneArg.proto */
-static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg);
-
-/* PyIntCompare.proto */
-static CYTHON_INLINE PyObject* __Pyx_PyInt_EqObjC(PyObject *op1, PyObject *op2, long intval, long inplace);
-
-/* PySequenceContains.proto */
-static CYTHON_INLINE int __Pyx_PySequence_ContainsTF(PyObject* item, PyObject* seq, int eq) {
- int result = PySequence_Contains(seq, item);
- return unlikely(result < 0) ? result : (result == (eq == Py_EQ));
-}
-
-/* PyObjectCall2Args.proto */
-static CYTHON_UNUSED PyObject* __Pyx_PyObject_Call2Args(PyObject* function, PyObject* arg1, PyObject* arg2);
-
-/* PyObjectGetMethod.proto */
-static int __Pyx_PyObject_GetMethod(PyObject *obj, PyObject *name, PyObject **method);
-
-/* PyObjectCallMethod1.proto */
-static PyObject* __Pyx_PyObject_CallMethod1(PyObject* obj, PyObject* method_name, PyObject* arg);
-
-/* pop_index.proto */
-static PyObject* __Pyx__PyObject_PopNewIndex(PyObject* L, PyObject* py_ix);
-static PyObject* __Pyx__PyObject_PopIndex(PyObject* L, PyObject* py_ix);
-#if CYTHON_USE_PYLIST_INTERNALS && CYTHON_ASSUME_SAFE_MACROS
-static PyObject* __Pyx__PyList_PopIndex(PyObject* L, PyObject* py_ix, Py_ssize_t ix);
-#define __Pyx_PyObject_PopIndex(L, py_ix, ix, is_signed, type, to_py_func) (\
- (likely(PyList_CheckExact(L) && __Pyx_fits_Py_ssize_t(ix, type, is_signed))) ?\
- __Pyx__PyList_PopIndex(L, py_ix, ix) : (\
- (unlikely((py_ix) == Py_None)) ? __Pyx__PyObject_PopNewIndex(L, to_py_func(ix)) :\
- __Pyx__PyObject_PopIndex(L, py_ix)))
-#define __Pyx_PyList_PopIndex(L, py_ix, ix, is_signed, type, to_py_func) (\
- __Pyx_fits_Py_ssize_t(ix, type, is_signed) ?\
- __Pyx__PyList_PopIndex(L, py_ix, ix) : (\
- (unlikely((py_ix) == Py_None)) ? __Pyx__PyObject_PopNewIndex(L, to_py_func(ix)) :\
- __Pyx__PyObject_PopIndex(L, py_ix)))
-#else
-#define __Pyx_PyList_PopIndex(L, py_ix, ix, is_signed, type, to_py_func)\
- __Pyx_PyObject_PopIndex(L, py_ix, ix, is_signed, type, to_py_func)
-#define __Pyx_PyObject_PopIndex(L, py_ix, ix, is_signed, type, to_py_func) (\
- (unlikely((py_ix) == Py_None)) ? __Pyx__PyObject_PopNewIndex(L, to_py_func(ix)) :\
- __Pyx__PyObject_PopIndex(L, py_ix))
-#endif
-
-/* ListAppend.proto */
-#if CYTHON_USE_PYLIST_INTERNALS && CYTHON_ASSUME_SAFE_MACROS
-static CYTHON_INLINE int __Pyx_PyList_Append(PyObject* list, PyObject* x) {
- PyListObject* L = (PyListObject*) list;
- Py_ssize_t len = Py_SIZE(list);
- if (likely(L->allocated > len) & likely(len > (L->allocated >> 1))) {
- Py_INCREF(x);
- PyList_SET_ITEM(list, len, x);
- __Pyx_SET_SIZE(list, len + 1);
- return 0;
- }
- return PyList_Append(list, x);
-}
-#else
-#define __Pyx_PyList_Append(L,x) PyList_Append(L,x)
-#endif
-
-/* PyErrExceptionMatches.proto */
-#if CYTHON_FAST_THREAD_STATE
-#define __Pyx_PyErr_ExceptionMatches(err) __Pyx_PyErr_ExceptionMatchesInState(__pyx_tstate, err)
-static CYTHON_INLINE int __Pyx_PyErr_ExceptionMatchesInState(PyThreadState* tstate, PyObject* err);
-#else
-#define __Pyx_PyErr_ExceptionMatches(err) PyErr_ExceptionMatches(err)
-#endif
-
-/* GetAttr.proto */
-static CYTHON_INLINE PyObject *__Pyx_GetAttr(PyObject *, PyObject *);
-
-/* GetAttr3.proto */
-static CYTHON_INLINE PyObject *__Pyx_GetAttr3(PyObject *, PyObject *, PyObject *);
-
-/* PyDictVersioning.proto */
-#if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_TYPE_SLOTS
-#define __PYX_DICT_VERSION_INIT ((PY_UINT64_T) -1)
-#define __PYX_GET_DICT_VERSION(dict) (((PyDictObject*)(dict))->ma_version_tag)
-#define __PYX_UPDATE_DICT_CACHE(dict, value, cache_var, version_var)\
- (version_var) = __PYX_GET_DICT_VERSION(dict);\
- (cache_var) = (value);
-#define __PYX_PY_DICT_LOOKUP_IF_MODIFIED(VAR, DICT, LOOKUP) {\
- static PY_UINT64_T __pyx_dict_version = 0;\
- static PyObject *__pyx_dict_cached_value = NULL;\
- if (likely(__PYX_GET_DICT_VERSION(DICT) == __pyx_dict_version)) {\
- (VAR) = __pyx_dict_cached_value;\
- } else {\
- (VAR) = __pyx_dict_cached_value = (LOOKUP);\
- __pyx_dict_version = __PYX_GET_DICT_VERSION(DICT);\
- }\
-}
-static CYTHON_INLINE PY_UINT64_T __Pyx_get_tp_dict_version(PyObject *obj);
-static CYTHON_INLINE PY_UINT64_T __Pyx_get_object_dict_version(PyObject *obj);
-static CYTHON_INLINE int __Pyx_object_dict_version_matches(PyObject* obj, PY_UINT64_T tp_dict_version, PY_UINT64_T obj_dict_version);
-#else
-#define __PYX_GET_DICT_VERSION(dict) (0)
-#define __PYX_UPDATE_DICT_CACHE(dict, value, cache_var, version_var)
-#define __PYX_PY_DICT_LOOKUP_IF_MODIFIED(VAR, DICT, LOOKUP) (VAR) = (LOOKUP);
-#endif
-
-/* GetModuleGlobalName.proto */
-#if CYTHON_USE_DICT_VERSIONS
-#define __Pyx_GetModuleGlobalName(var, name) {\
- static PY_UINT64_T __pyx_dict_version = 0;\
- static PyObject *__pyx_dict_cached_value = NULL;\
- (var) = (likely(__pyx_dict_version == __PYX_GET_DICT_VERSION(__pyx_d))) ?\
- (likely(__pyx_dict_cached_value) ? __Pyx_NewRef(__pyx_dict_cached_value) : __Pyx_GetBuiltinName(name)) :\
- __Pyx__GetModuleGlobalName(name, &__pyx_dict_version, &__pyx_dict_cached_value);\
-}
-#define __Pyx_GetModuleGlobalNameUncached(var, name) {\
- PY_UINT64_T __pyx_dict_version;\
- PyObject *__pyx_dict_cached_value;\
- (var) = __Pyx__GetModuleGlobalName(name, &__pyx_dict_version, &__pyx_dict_cached_value);\
-}
-static PyObject *__Pyx__GetModuleGlobalName(PyObject *name, PY_UINT64_T *dict_version, PyObject **dict_cached_value);
-#else
-#define __Pyx_GetModuleGlobalName(var, name) (var) = __Pyx__GetModuleGlobalName(name)
-#define __Pyx_GetModuleGlobalNameUncached(var, name) (var) = __Pyx__GetModuleGlobalName(name)
-static CYTHON_INLINE PyObject *__Pyx__GetModuleGlobalName(PyObject *name);
-#endif
-
-/* Import.proto */
-static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level);
-
-/* ImportFrom.proto */
-static PyObject* __Pyx_ImportFrom(PyObject* module, PyObject* name);
-
-/* HasAttr.proto */
-static CYTHON_INLINE int __Pyx_HasAttr(PyObject *, PyObject *);
-
-/* PyObject_GenericGetAttrNoDict.proto */
-#if CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP && PY_VERSION_HEX < 0x03070000
-static CYTHON_INLINE PyObject* __Pyx_PyObject_GenericGetAttrNoDict(PyObject* obj, PyObject* attr_name);
-#else
-#define __Pyx_PyObject_GenericGetAttrNoDict PyObject_GenericGetAttr
-#endif
-
-/* PyObject_GenericGetAttr.proto */
-#if CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP && PY_VERSION_HEX < 0x03070000
-static PyObject* __Pyx_PyObject_GenericGetAttr(PyObject* obj, PyObject* attr_name);
-#else
-#define __Pyx_PyObject_GenericGetAttr PyObject_GenericGetAttr
-#endif
-
-/* SetVTable.proto */
-static int __Pyx_SetVtable(PyObject *dict, void *vtable);
-
-/* PyObjectGetAttrStrNoError.proto */
-static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStrNoError(PyObject* obj, PyObject* attr_name);
-
-/* SetupReduce.proto */
-static int __Pyx_setup_reduce(PyObject* type_obj);
-
-/* CLineInTraceback.proto */
-#ifdef CYTHON_CLINE_IN_TRACEBACK
-#define __Pyx_CLineForTraceback(tstate, c_line) (((CYTHON_CLINE_IN_TRACEBACK)) ? c_line : 0)
-#else
-static int __Pyx_CLineForTraceback(PyThreadState *tstate, int c_line);
-#endif
-
-/* CodeObjectCache.proto */
-typedef struct {
- PyCodeObject* code_object;
- int code_line;
-} __Pyx_CodeObjectCacheEntry;
-struct __Pyx_CodeObjectCache {
- int count;
- int max_count;
- __Pyx_CodeObjectCacheEntry* entries;
-};
-static struct __Pyx_CodeObjectCache __pyx_code_cache = {0,0,NULL};
-static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line);
-static PyCodeObject *__pyx_find_code_object(int code_line);
-static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object);
-
-/* AddTraceback.proto */
-static void __Pyx_AddTraceback(const char *funcname, int c_line,
- int py_line, const char *filename);
-
-/* CIntToPy.proto */
-static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value);
-
-/* CIntToPy.proto */
-static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value);
-
-/* CIntFromPy.proto */
-static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *);
-
-/* CIntFromPy.proto */
-static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *);
-
-/* FastTypeChecks.proto */
-#if CYTHON_COMPILING_IN_CPYTHON
-#define __Pyx_TypeCheck(obj, type) __Pyx_IsSubtype(Py_TYPE(obj), (PyTypeObject *)type)
-static CYTHON_INLINE int __Pyx_IsSubtype(PyTypeObject *a, PyTypeObject *b);
-static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches(PyObject *err, PyObject *type);
-static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches2(PyObject *err, PyObject *type1, PyObject *type2);
-#else
-#define __Pyx_TypeCheck(obj, type) PyObject_TypeCheck(obj, (PyTypeObject *)type)
-#define __Pyx_PyErr_GivenExceptionMatches(err, type) PyErr_GivenExceptionMatches(err, type)
-#define __Pyx_PyErr_GivenExceptionMatches2(err, type1, type2) (PyErr_GivenExceptionMatches(err, type1) || PyErr_GivenExceptionMatches(err, type2))
-#endif
-#define __Pyx_PyException_Check(obj) __Pyx_TypeCheck(obj, PyExc_Exception)
-
-/* CheckBinaryVersion.proto */
-static int __Pyx_check_binary_version(void);
-
-/* InitStrings.proto */
-static int __Pyx_InitStrings(__Pyx_StringTabEntry *t);
-
-static PyObject *__pyx_f_10frozenlist_11_frozenlist_10FrozenList__check_frozen(struct __pyx_obj_10frozenlist_11_frozenlist_FrozenList *__pyx_v_self); /* proto*/
-static CYTHON_INLINE PyObject *__pyx_f_10frozenlist_11_frozenlist_10FrozenList__fast_len(struct __pyx_obj_10frozenlist_11_frozenlist_FrozenList *__pyx_v_self); /* proto*/
-
-/* Module declarations from 'frozenlist._frozenlist' */
-static PyTypeObject *__pyx_ptype_10frozenlist_11_frozenlist_FrozenList = 0;
-static PyObject *__pyx_f_10frozenlist_11_frozenlist___pyx_unpickle_FrozenList__set_state(struct __pyx_obj_10frozenlist_11_frozenlist_FrozenList *, PyObject *); /*proto*/
-#define __Pyx_MODULE_NAME "frozenlist._frozenlist"
-extern int __pyx_module_is_main_frozenlist___frozenlist;
-int __pyx_module_is_main_frozenlist___frozenlist = 0;
-
-/* Implementation of 'frozenlist._frozenlist' */
-static PyObject *__pyx_builtin_RuntimeError;
-static const char __pyx_k_new[] = "__new__";
-static const char __pyx_k_pop[] = "pop";
-static const char __pyx_k_pos[] = "pos";
-static const char __pyx_k_dict[] = "__dict__";
-static const char __pyx_k_item[] = "item";
-static const char __pyx_k_iter[] = "__iter__";
-static const char __pyx_k_main[] = "__main__";
-static const char __pyx_k_name[] = "__name__";
-static const char __pyx_k_test[] = "__test__";
-static const char __pyx_k_clear[] = "clear";
-static const char __pyx_k_count[] = "count";
-static const char __pyx_k_index[] = "index";
-static const char __pyx_k_items[] = "items";
-static const char __pyx_k_format[] = "format";
-static const char __pyx_k_import[] = "__import__";
-static const char __pyx_k_pickle[] = "pickle";
-static const char __pyx_k_reduce[] = "__reduce__";
-static const char __pyx_k_remove[] = "remove";
-static const char __pyx_k_update[] = "update";
-static const char __pyx_k_getstate[] = "__getstate__";
-static const char __pyx_k_pyx_type[] = "__pyx_type";
-static const char __pyx_k_register[] = "register";
-static const char __pyx_k_reversed[] = "__reversed__";
-static const char __pyx_k_setstate[] = "__setstate__";
-static const char __pyx_k_pyx_state[] = "__pyx_state";
-static const char __pyx_k_reduce_ex[] = "__reduce_ex__";
-static const char __pyx_k_FrozenList[] = "FrozenList";
-static const char __pyx_k_pyx_result[] = "__pyx_result";
-static const char __pyx_k_pyx_vtable[] = "__pyx_vtable__";
-static const char __pyx_k_PickleError[] = "PickleError";
-static const char __pyx_k_RuntimeError[] = "RuntimeError";
-static const char __pyx_k_pyx_checksum[] = "__pyx_checksum";
-static const char __pyx_k_stringsource[] = "stringsource";
-static const char __pyx_k_reduce_cython[] = "__reduce_cython__";
-static const char __pyx_k_MutableSequence[] = "MutableSequence";
-static const char __pyx_k_collections_abc[] = "collections.abc";
-static const char __pyx_k_pyx_PickleError[] = "__pyx_PickleError";
-static const char __pyx_k_setstate_cython[] = "__setstate_cython__";
-static const char __pyx_k_cline_in_traceback[] = "cline_in_traceback";
-static const char __pyx_k_FrozenList_frozen_r[] = "";
-static const char __pyx_k_frozenlist__frozenlist[] = "frozenlist._frozenlist";
-static const char __pyx_k_pyx_unpickle_FrozenList[] = "__pyx_unpickle_FrozenList";
-static const char __pyx_k_Cannot_hash_unfrozen_list[] = "Cannot hash unfrozen list.";
-static const char __pyx_k_Cannot_modify_frozen_list[] = "Cannot modify frozen list.";
-static const char __pyx_k_Incompatible_checksums_s_vs_0x94[] = "Incompatible checksums (%s vs 0x949a143 = (_items, frozen))";
-static PyObject *__pyx_kp_u_Cannot_hash_unfrozen_list;
-static PyObject *__pyx_kp_u_Cannot_modify_frozen_list;
-static PyObject *__pyx_n_s_FrozenList;
-static PyObject *__pyx_kp_u_FrozenList_frozen_r;
-static PyObject *__pyx_kp_s_Incompatible_checksums_s_vs_0x94;
-static PyObject *__pyx_n_s_MutableSequence;
-static PyObject *__pyx_n_s_PickleError;
-static PyObject *__pyx_n_s_RuntimeError;
-static PyObject *__pyx_n_s_clear;
-static PyObject *__pyx_n_s_cline_in_traceback;
-static PyObject *__pyx_n_s_collections_abc;
-static PyObject *__pyx_n_s_count;
-static PyObject *__pyx_n_s_dict;
-static PyObject *__pyx_n_s_format;
-static PyObject *__pyx_n_s_frozenlist__frozenlist;
-static PyObject *__pyx_n_s_getstate;
-static PyObject *__pyx_n_s_import;
-static PyObject *__pyx_n_s_index;
-static PyObject *__pyx_n_s_item;
-static PyObject *__pyx_n_s_items;
-static PyObject *__pyx_n_s_iter;
-static PyObject *__pyx_n_s_main;
-static PyObject *__pyx_n_s_name;
-static PyObject *__pyx_n_s_new;
-static PyObject *__pyx_n_s_pickle;
-static PyObject *__pyx_n_s_pop;
-static PyObject *__pyx_n_s_pos;
-static PyObject *__pyx_n_s_pyx_PickleError;
-static PyObject *__pyx_n_s_pyx_checksum;
-static PyObject *__pyx_n_s_pyx_result;
-static PyObject *__pyx_n_s_pyx_state;
-static PyObject *__pyx_n_s_pyx_type;
-static PyObject *__pyx_n_s_pyx_unpickle_FrozenList;
-static PyObject *__pyx_n_s_pyx_vtable;
-static PyObject *__pyx_n_s_reduce;
-static PyObject *__pyx_n_s_reduce_cython;
-static PyObject *__pyx_n_s_reduce_ex;
-static PyObject *__pyx_n_s_register;
-static PyObject *__pyx_n_s_remove;
-static PyObject *__pyx_n_s_reversed;
-static PyObject *__pyx_n_s_setstate;
-static PyObject *__pyx_n_s_setstate_cython;
-static PyObject *__pyx_kp_s_stringsource;
-static PyObject *__pyx_n_s_test;
-static PyObject *__pyx_n_s_update;
-static int __pyx_pf_10frozenlist_11_frozenlist_10FrozenList___init__(struct __pyx_obj_10frozenlist_11_frozenlist_FrozenList *__pyx_v_self, PyObject *__pyx_v_items); /* proto */
-static PyObject *__pyx_pf_10frozenlist_11_frozenlist_10FrozenList_2freeze(struct __pyx_obj_10frozenlist_11_frozenlist_FrozenList *__pyx_v_self); /* proto */
-static PyObject *__pyx_pf_10frozenlist_11_frozenlist_10FrozenList_4__getitem__(struct __pyx_obj_10frozenlist_11_frozenlist_FrozenList *__pyx_v_self, PyObject *__pyx_v_index); /* proto */
-static int __pyx_pf_10frozenlist_11_frozenlist_10FrozenList_6__setitem__(struct __pyx_obj_10frozenlist_11_frozenlist_FrozenList *__pyx_v_self, PyObject *__pyx_v_index, PyObject *__pyx_v_value); /* proto */
-static int __pyx_pf_10frozenlist_11_frozenlist_10FrozenList_8__delitem__(struct __pyx_obj_10frozenlist_11_frozenlist_FrozenList *__pyx_v_self, PyObject *__pyx_v_index); /* proto */
-static Py_ssize_t __pyx_pf_10frozenlist_11_frozenlist_10FrozenList_10__len__(struct __pyx_obj_10frozenlist_11_frozenlist_FrozenList *__pyx_v_self); /* proto */
-static PyObject *__pyx_pf_10frozenlist_11_frozenlist_10FrozenList_12__iter__(struct __pyx_obj_10frozenlist_11_frozenlist_FrozenList *__pyx_v_self); /* proto */
-static PyObject *__pyx_pf_10frozenlist_11_frozenlist_10FrozenList_14__reversed__(struct __pyx_obj_10frozenlist_11_frozenlist_FrozenList *__pyx_v_self); /* proto */
-static PyObject *__pyx_pf_10frozenlist_11_frozenlist_10FrozenList_16__richcmp__(struct __pyx_obj_10frozenlist_11_frozenlist_FrozenList *__pyx_v_self, PyObject *__pyx_v_other, PyObject *__pyx_v_op); /* proto */
-static PyObject *__pyx_pf_10frozenlist_11_frozenlist_10FrozenList_18insert(struct __pyx_obj_10frozenlist_11_frozenlist_FrozenList *__pyx_v_self, PyObject *__pyx_v_pos, PyObject *__pyx_v_item); /* proto */
-static int __pyx_pf_10frozenlist_11_frozenlist_10FrozenList_20__contains__(struct __pyx_obj_10frozenlist_11_frozenlist_FrozenList *__pyx_v_self, PyObject *__pyx_v_item); /* proto */
-static PyObject *__pyx_pf_10frozenlist_11_frozenlist_10FrozenList_22__iadd__(struct __pyx_obj_10frozenlist_11_frozenlist_FrozenList *__pyx_v_self, PyObject *__pyx_v_items); /* proto */
-static PyObject *__pyx_pf_10frozenlist_11_frozenlist_10FrozenList_24index(struct __pyx_obj_10frozenlist_11_frozenlist_FrozenList *__pyx_v_self, PyObject *__pyx_v_item); /* proto */
-static PyObject *__pyx_pf_10frozenlist_11_frozenlist_10FrozenList_26remove(struct __pyx_obj_10frozenlist_11_frozenlist_FrozenList *__pyx_v_self, PyObject *__pyx_v_item); /* proto */
-static PyObject *__pyx_pf_10frozenlist_11_frozenlist_10FrozenList_28clear(struct __pyx_obj_10frozenlist_11_frozenlist_FrozenList *__pyx_v_self); /* proto */
-static PyObject *__pyx_pf_10frozenlist_11_frozenlist_10FrozenList_30extend(struct __pyx_obj_10frozenlist_11_frozenlist_FrozenList *__pyx_v_self, PyObject *__pyx_v_items); /* proto */
-static PyObject *__pyx_pf_10frozenlist_11_frozenlist_10FrozenList_32reverse(struct __pyx_obj_10frozenlist_11_frozenlist_FrozenList *__pyx_v_self); /* proto */
-static PyObject *__pyx_pf_10frozenlist_11_frozenlist_10FrozenList_34pop(struct __pyx_obj_10frozenlist_11_frozenlist_FrozenList *__pyx_v_self, PyObject *__pyx_v_index); /* proto */
-static PyObject *__pyx_pf_10frozenlist_11_frozenlist_10FrozenList_36append(struct __pyx_obj_10frozenlist_11_frozenlist_FrozenList *__pyx_v_self, PyObject *__pyx_v_item); /* proto */
-static PyObject *__pyx_pf_10frozenlist_11_frozenlist_10FrozenList_38count(struct __pyx_obj_10frozenlist_11_frozenlist_FrozenList *__pyx_v_self, PyObject *__pyx_v_item); /* proto */
-static PyObject *__pyx_pf_10frozenlist_11_frozenlist_10FrozenList_40__repr__(struct __pyx_obj_10frozenlist_11_frozenlist_FrozenList *__pyx_v_self); /* proto */
-static Py_hash_t __pyx_pf_10frozenlist_11_frozenlist_10FrozenList_42__hash__(struct __pyx_obj_10frozenlist_11_frozenlist_FrozenList *__pyx_v_self); /* proto */
-static PyObject *__pyx_pf_10frozenlist_11_frozenlist_10FrozenList_6frozen___get__(struct __pyx_obj_10frozenlist_11_frozenlist_FrozenList *__pyx_v_self); /* proto */
-static PyObject *__pyx_pf_10frozenlist_11_frozenlist_10FrozenList_44__reduce_cython__(struct __pyx_obj_10frozenlist_11_frozenlist_FrozenList *__pyx_v_self); /* proto */
-static PyObject *__pyx_pf_10frozenlist_11_frozenlist_10FrozenList_46__setstate_cython__(struct __pyx_obj_10frozenlist_11_frozenlist_FrozenList *__pyx_v_self, PyObject *__pyx_v___pyx_state); /* proto */
-static PyObject *__pyx_pf_10frozenlist_11_frozenlist___pyx_unpickle_FrozenList(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v___pyx_type, long __pyx_v___pyx_checksum, PyObject *__pyx_v___pyx_state); /* proto */
-static PyObject *__pyx_tp_new_10frozenlist_11_frozenlist_FrozenList(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
-static PyObject *__pyx_int_0;
-static PyObject *__pyx_int_1;
-static PyObject *__pyx_int_2;
-static PyObject *__pyx_int_3;
-static PyObject *__pyx_int_4;
-static PyObject *__pyx_int_5;
-static PyObject *__pyx_int_155820355;
-static PyObject *__pyx_int_neg_1;
-static PyObject *__pyx_tuple_;
-static PyObject *__pyx_tuple__2;
-static PyObject *__pyx_tuple__3;
-static PyObject *__pyx_codeobj__4;
-/* Late includes */
-
-/* "frozenlist/_frozenlist.pyx":9
- * cdef list _items
- *
- * def __init__(self, items=None): # <<<<<<<<<<<<<<
- * self.frozen = False
- * if items is not None:
- */
-
-/* Python wrapper */
-static int __pyx_pw_10frozenlist_11_frozenlist_10FrozenList_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pw_10frozenlist_11_frozenlist_10FrozenList_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
- PyObject *__pyx_v_items = 0;
- int __pyx_lineno = 0;
- const char *__pyx_filename = NULL;
- int __pyx_clineno = 0;
- int __pyx_r;
- __Pyx_RefNannyDeclarations
- __Pyx_RefNannySetupContext("__init__ (wrapper)", 0);
- {
- static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_items,0};
- PyObject* values[1] = {0};
- values[0] = ((PyObject *)Py_None);
- if (unlikely(__pyx_kwds)) {
- Py_ssize_t kw_args;
- const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
- switch (pos_args) {
- case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
- CYTHON_FALLTHROUGH;
- case 0: break;
- default: goto __pyx_L5_argtuple_error;
- }
- kw_args = PyDict_Size(__pyx_kwds);
- switch (pos_args) {
- case 0:
- if (kw_args > 0) {
- PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_items);
- if (value) { values[0] = value; kw_args--; }
- }
- }
- if (unlikely(kw_args > 0)) {
- if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__init__") < 0)) __PYX_ERR(0, 9, __pyx_L3_error)
- }
- } else {
- switch (PyTuple_GET_SIZE(__pyx_args)) {
- case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
- CYTHON_FALLTHROUGH;
- case 0: break;
- default: goto __pyx_L5_argtuple_error;
- }
- }
- __pyx_v_items = values[0];
- }
- goto __pyx_L4_argument_unpacking_done;
- __pyx_L5_argtuple_error:;
- __Pyx_RaiseArgtupleInvalid("__init__", 0, 0, 1, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 9, __pyx_L3_error)
- __pyx_L3_error:;
- __Pyx_AddTraceback("frozenlist._frozenlist.FrozenList.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename);
- __Pyx_RefNannyFinishContext();
- return -1;
- __pyx_L4_argument_unpacking_done:;
- __pyx_r = __pyx_pf_10frozenlist_11_frozenlist_10FrozenList___init__(((struct __pyx_obj_10frozenlist_11_frozenlist_FrozenList *)__pyx_v_self), __pyx_v_items);
-
- /* function exit code */
- __Pyx_RefNannyFinishContext();
- return __pyx_r;
-}
-
-static int __pyx_pf_10frozenlist_11_frozenlist_10FrozenList___init__(struct __pyx_obj_10frozenlist_11_frozenlist_FrozenList *__pyx_v_self, PyObject *__pyx_v_items) {
- int __pyx_r;
- __Pyx_RefNannyDeclarations
- int __pyx_t_1;
- int __pyx_t_2;
- PyObject *__pyx_t_3 = NULL;
- int __pyx_lineno = 0;
- const char *__pyx_filename = NULL;
- int __pyx_clineno = 0;
- __Pyx_RefNannySetupContext("__init__", 0);
- __Pyx_INCREF(__pyx_v_items);
-
- /* "frozenlist/_frozenlist.pyx":10
- *
- * def __init__(self, items=None):
- * self.frozen = False # <<<<<<<<<<<<<<
- * if items is not None:
- * items = list(items)
- */
- __pyx_v_self->frozen = 0;
-
- /* "frozenlist/_frozenlist.pyx":11
- * def __init__(self, items=None):
- * self.frozen = False
- * if items is not None: # <<<<<<<<<<<<<<
- * items = list(items)
- * else:
- */
- __pyx_t_1 = (__pyx_v_items != Py_None);
- __pyx_t_2 = (__pyx_t_1 != 0);
- if (__pyx_t_2) {
-
- /* "frozenlist/_frozenlist.pyx":12
- * self.frozen = False
- * if items is not None:
- * items = list(items) # <<<<<<<<<<<<<<
- * else:
- * items = []
- */
- __pyx_t_3 = PySequence_List(__pyx_v_items); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 12, __pyx_L1_error)
- __Pyx_GOTREF(__pyx_t_3);
- __Pyx_DECREF_SET(__pyx_v_items, __pyx_t_3);
- __pyx_t_3 = 0;
-
- /* "frozenlist/_frozenlist.pyx":11
- * def __init__(self, items=None):
- * self.frozen = False
- * if items is not None: # <<<<<<<<<<<<<<
- * items = list(items)
- * else:
- */
- goto __pyx_L3;
- }
-
- /* "frozenlist/_frozenlist.pyx":14
- * items = list(items)
- * else:
- * items = [] # <<<<<<<<<<<<<<
- * self._items = items
- *
- */
- /*else*/ {
- __pyx_t_3 = PyList_New(0); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 14, __pyx_L1_error)
- __Pyx_GOTREF(__pyx_t_3);
- __Pyx_DECREF_SET(__pyx_v_items, __pyx_t_3);
- __pyx_t_3 = 0;
- }
- __pyx_L3:;
-
- /* "frozenlist/_frozenlist.pyx":15
- * else:
- * items = []
- * self._items = items # <<<<<<<<<<<<<<
- *
- * cdef object _check_frozen(self):
- */
- if (!(likely(PyList_CheckExact(__pyx_v_items))||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "list", Py_TYPE(__pyx_v_items)->tp_name), 0))) __PYX_ERR(0, 15, __pyx_L1_error)
- __pyx_t_3 = __pyx_v_items;
- __Pyx_INCREF(__pyx_t_3);
- __Pyx_GIVEREF(__pyx_t_3);
- __Pyx_GOTREF(__pyx_v_self->_items);
- __Pyx_DECREF(__pyx_v_self->_items);
- __pyx_v_self->_items = ((PyObject*)__pyx_t_3);
- __pyx_t_3 = 0;
-
- /* "frozenlist/_frozenlist.pyx":9
- * cdef list _items
- *
- * def __init__(self, items=None): # <<<<<<<<<<<<<<
- * self.frozen = False
- * if items is not None:
- */
-
- /* function exit code */
- __pyx_r = 0;
- goto __pyx_L0;
- __pyx_L1_error:;
- __Pyx_XDECREF(__pyx_t_3);
- __Pyx_AddTraceback("frozenlist._frozenlist.FrozenList.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename);
- __pyx_r = -1;
- __pyx_L0:;
- __Pyx_XDECREF(__pyx_v_items);
- __Pyx_RefNannyFinishContext();
- return __pyx_r;
-}
-
-/* "frozenlist/_frozenlist.pyx":17
- * self._items = items
- *
- * cdef object _check_frozen(self): # <<<<<<<<<<<<<<
- * if self.frozen:
- * raise RuntimeError("Cannot modify frozen list.")
- */
-
-static PyObject *__pyx_f_10frozenlist_11_frozenlist_10FrozenList__check_frozen(struct __pyx_obj_10frozenlist_11_frozenlist_FrozenList *__pyx_v_self) {
- PyObject *__pyx_r = NULL;
- __Pyx_RefNannyDeclarations
- int __pyx_t_1;
- PyObject *__pyx_t_2 = NULL;
- int __pyx_lineno = 0;
- const char *__pyx_filename = NULL;
- int __pyx_clineno = 0;
- __Pyx_RefNannySetupContext("_check_frozen", 0);
-
- /* "frozenlist/_frozenlist.pyx":18
- *
- * cdef object _check_frozen(self):
- * if self.frozen: # <<<<<<<<<<<<<<
- * raise RuntimeError("Cannot modify frozen list.")
- *
- */
- __pyx_t_1 = (__pyx_v_self->frozen != 0);
- if (unlikely(__pyx_t_1)) {
-
- /* "frozenlist/_frozenlist.pyx":19
- * cdef object _check_frozen(self):
- * if self.frozen:
- * raise RuntimeError("Cannot modify frozen list.") # <<<<<<<<<<<<<<
- *
- * cdef inline object _fast_len(self):
- */
- __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_RuntimeError, __pyx_tuple_, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 19, __pyx_L1_error)
- __Pyx_GOTREF(__pyx_t_2);
- __Pyx_Raise(__pyx_t_2, 0, 0, 0);
- __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
- __PYX_ERR(0, 19, __pyx_L1_error)
-
- /* "frozenlist/_frozenlist.pyx":18
- *
- * cdef object _check_frozen(self):
- * if self.frozen: # <<<<<<<<<<<<<<
- * raise RuntimeError("Cannot modify frozen list.")
- *
- */
- }
-
- /* "frozenlist/_frozenlist.pyx":17
- * self._items = items
- *
- * cdef object _check_frozen(self): # <<<<<<<<<<<<<<
- * if self.frozen:
- * raise RuntimeError("Cannot modify frozen list.")
- */
-
- /* function exit code */
- __pyx_r = Py_None; __Pyx_INCREF(Py_None);
- goto __pyx_L0;
- __pyx_L1_error:;
- __Pyx_XDECREF(__pyx_t_2);
- __Pyx_AddTraceback("frozenlist._frozenlist.FrozenList._check_frozen", __pyx_clineno, __pyx_lineno, __pyx_filename);
- __pyx_r = 0;
- __pyx_L0:;
- __Pyx_XGIVEREF(__pyx_r);
- __Pyx_RefNannyFinishContext();
- return __pyx_r;
-}
-
-/* "frozenlist/_frozenlist.pyx":21
- * raise RuntimeError("Cannot modify frozen list.")
- *
- * cdef inline object _fast_len(self): # <<<<<<<<<<<<<<
- * return len(self._items)
- *
- */
-
-static CYTHON_INLINE PyObject *__pyx_f_10frozenlist_11_frozenlist_10FrozenList__fast_len(struct __pyx_obj_10frozenlist_11_frozenlist_FrozenList *__pyx_v_self) {
- PyObject *__pyx_r = NULL;
- __Pyx_RefNannyDeclarations
- PyObject *__pyx_t_1 = NULL;
- Py_ssize_t __pyx_t_2;
- int __pyx_lineno = 0;
- const char *__pyx_filename = NULL;
- int __pyx_clineno = 0;
- __Pyx_RefNannySetupContext("_fast_len", 0);
-
- /* "frozenlist/_frozenlist.pyx":22
- *
- * cdef inline object _fast_len(self):
- * return len(self._items) # <<<<<<<<<<<<<<
- *
- * def freeze(self):
- */
- __Pyx_XDECREF(__pyx_r);
- __pyx_t_1 = __pyx_v_self->_items;
- __Pyx_INCREF(__pyx_t_1);
- if (unlikely(__pyx_t_1 == Py_None)) {
- PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()");
- __PYX_ERR(0, 22, __pyx_L1_error)
- }
- __pyx_t_2 = PyList_GET_SIZE(__pyx_t_1); if (unlikely(__pyx_t_2 == ((Py_ssize_t)-1))) __PYX_ERR(0, 22, __pyx_L1_error)
- __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
- __pyx_t_1 = PyInt_FromSsize_t(__pyx_t_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 22, __pyx_L1_error)
- __Pyx_GOTREF(__pyx_t_1);
- __pyx_r = __pyx_t_1;
- __pyx_t_1 = 0;
- goto __pyx_L0;
-
- /* "frozenlist/_frozenlist.pyx":21
- * raise RuntimeError("Cannot modify frozen list.")
- *
- * cdef inline object _fast_len(self): # <<<<<<<<<<<<<<
- * return len(self._items)
- *
- */
-
- /* function exit code */
- __pyx_L1_error:;
- __Pyx_XDECREF(__pyx_t_1);
- __Pyx_AddTraceback("frozenlist._frozenlist.FrozenList._fast_len", __pyx_clineno, __pyx_lineno, __pyx_filename);
- __pyx_r = 0;
- __pyx_L0:;
- __Pyx_XGIVEREF(__pyx_r);
- __Pyx_RefNannyFinishContext();
- return __pyx_r;
-}
-
-/* "frozenlist/_frozenlist.pyx":24
- * return len(self._items)
- *
- * def freeze(self): # <<<<<<<<<<<<<<
- * self.frozen = True
- *
- */
-
-/* Python wrapper */
-static PyObject *__pyx_pw_10frozenlist_11_frozenlist_10FrozenList_3freeze(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
-static PyObject *__pyx_pw_10frozenlist_11_frozenlist_10FrozenList_3freeze(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
- PyObject *__pyx_r = 0;
- __Pyx_RefNannyDeclarations
- __Pyx_RefNannySetupContext("freeze (wrapper)", 0);
- __pyx_r = __pyx_pf_10frozenlist_11_frozenlist_10FrozenList_2freeze(((struct __pyx_obj_10frozenlist_11_frozenlist_FrozenList *)__pyx_v_self));
-
- /* function exit code */
- __Pyx_RefNannyFinishContext();
- return __pyx_r;
-}
-
-static PyObject *__pyx_pf_10frozenlist_11_frozenlist_10FrozenList_2freeze(struct __pyx_obj_10frozenlist_11_frozenlist_FrozenList *__pyx_v_self) {
- PyObject *__pyx_r = NULL;
- __Pyx_RefNannyDeclarations
- __Pyx_RefNannySetupContext("freeze", 0);
-
- /* "frozenlist/_frozenlist.pyx":25
- *
- * def freeze(self):
- * self.frozen = True # <<<<<<<<<<<<<<
- *
- * def __getitem__(self, index):
- */
- __pyx_v_self->frozen = 1;
-
- /* "frozenlist/_frozenlist.pyx":24
- * return len(self._items)
- *
- * def freeze(self): # <<<<<<<<<<<<<<
- * self.frozen = True
- *
- */
-
- /* function exit code */
- __pyx_r = Py_None; __Pyx_INCREF(Py_None);
- __Pyx_XGIVEREF(__pyx_r);
- __Pyx_RefNannyFinishContext();
- return __pyx_r;
-}
-
-/* "frozenlist/_frozenlist.pyx":27
- * self.frozen = True
- *
- * def __getitem__(self, index): # <<<<<<<<<<<<<<
- * return self._items[index]
- *
- */
-
-/* Python wrapper */
-static PyObject *__pyx_pw_10frozenlist_11_frozenlist_10FrozenList_5__getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_index); /*proto*/
-static PyObject *__pyx_pw_10frozenlist_11_frozenlist_10FrozenList_5__getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_index) {
- PyObject *__pyx_r = 0;
- __Pyx_RefNannyDeclarations
- __Pyx_RefNannySetupContext("__getitem__ (wrapper)", 0);
- __pyx_r = __pyx_pf_10frozenlist_11_frozenlist_10FrozenList_4__getitem__(((struct __pyx_obj_10frozenlist_11_frozenlist_FrozenList *)__pyx_v_self), ((PyObject *)__pyx_v_index));
-
- /* function exit code */
- __Pyx_RefNannyFinishContext();
- return __pyx_r;
-}
-
-static PyObject *__pyx_pf_10frozenlist_11_frozenlist_10FrozenList_4__getitem__(struct __pyx_obj_10frozenlist_11_frozenlist_FrozenList *__pyx_v_self, PyObject *__pyx_v_index) {
- PyObject *__pyx_r = NULL;
- __Pyx_RefNannyDeclarations
- PyObject *__pyx_t_1 = NULL;
- int __pyx_lineno = 0;
- const char *__pyx_filename = NULL;
- int __pyx_clineno = 0;
- __Pyx_RefNannySetupContext("__getitem__", 0);
-
- /* "frozenlist/_frozenlist.pyx":28
- *
- * def __getitem__(self, index):
- * return self._items[index] # <<<<<<<<<<<<<<
- *
- * def __setitem__(self, index, value):
- */
- __Pyx_XDECREF(__pyx_r);
- if (unlikely(__pyx_v_self->_items == Py_None)) {
- PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
- __PYX_ERR(0, 28, __pyx_L1_error)
- }
- __pyx_t_1 = __Pyx_PyObject_GetItem(__pyx_v_self->_items, __pyx_v_index); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 28, __pyx_L1_error)
- __Pyx_GOTREF(__pyx_t_1);
- __pyx_r = __pyx_t_1;
- __pyx_t_1 = 0;
- goto __pyx_L0;
-
- /* "frozenlist/_frozenlist.pyx":27
- * self.frozen = True
- *
- * def __getitem__(self, index): # <<<<<<<<<<<<<<
- * return self._items[index]
- *
- */
-
- /* function exit code */
- __pyx_L1_error:;
- __Pyx_XDECREF(__pyx_t_1);
- __Pyx_AddTraceback("frozenlist._frozenlist.FrozenList.__getitem__", __pyx_clineno, __pyx_lineno, __pyx_filename);
- __pyx_r = NULL;
- __pyx_L0:;
- __Pyx_XGIVEREF(__pyx_r);
- __Pyx_RefNannyFinishContext();
- return __pyx_r;
-}
-
-/* "frozenlist/_frozenlist.pyx":30
- * return self._items[index]
- *
- * def __setitem__(self, index, value): # <<<<<<<<<<<<<<
- * self._check_frozen()
- * self._items[index] = value
- */
-
-/* Python wrapper */
-static int __pyx_pw_10frozenlist_11_frozenlist_10FrozenList_7__setitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_index, PyObject *__pyx_v_value); /*proto*/
-static int __pyx_pw_10frozenlist_11_frozenlist_10FrozenList_7__setitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_index, PyObject *__pyx_v_value) {
- int __pyx_r;
- __Pyx_RefNannyDeclarations
- __Pyx_RefNannySetupContext("__setitem__ (wrapper)", 0);
- __pyx_r = __pyx_pf_10frozenlist_11_frozenlist_10FrozenList_6__setitem__(((struct __pyx_obj_10frozenlist_11_frozenlist_FrozenList *)__pyx_v_self), ((PyObject *)__pyx_v_index), ((PyObject *)__pyx_v_value));
-
- /* function exit code */
- __Pyx_RefNannyFinishContext();
- return __pyx_r;
-}
-
-static int __pyx_pf_10frozenlist_11_frozenlist_10FrozenList_6__setitem__(struct __pyx_obj_10frozenlist_11_frozenlist_FrozenList *__pyx_v_self, PyObject *__pyx_v_index, PyObject *__pyx_v_value) {
- int __pyx_r;
- __Pyx_RefNannyDeclarations
- PyObject *__pyx_t_1 = NULL;
- int __pyx_lineno = 0;
- const char *__pyx_filename = NULL;
- int __pyx_clineno = 0;
- __Pyx_RefNannySetupContext("__setitem__", 0);
-
- /* "frozenlist/_frozenlist.pyx":31
- *
- * def __setitem__(self, index, value):
- * self._check_frozen() # <<<<<<<<<<<<<<
- * self._items[index] = value
- *
- */
- __pyx_t_1 = ((struct __pyx_vtabstruct_10frozenlist_11_frozenlist_FrozenList *)__pyx_v_self->__pyx_vtab)->_check_frozen(__pyx_v_self); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 31, __pyx_L1_error)
- __Pyx_GOTREF(__pyx_t_1);
- __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-
- /* "frozenlist/_frozenlist.pyx":32
- * def __setitem__(self, index, value):
- * self._check_frozen()
- * self._items[index] = value # <<<<<<<<<<<<<<
- *
- * def __delitem__(self, index):
- */
- if (unlikely(__pyx_v_self->_items == Py_None)) {
- PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
- __PYX_ERR(0, 32, __pyx_L1_error)
- }
- if (unlikely(PyObject_SetItem(__pyx_v_self->_items, __pyx_v_index, __pyx_v_value) < 0)) __PYX_ERR(0, 32, __pyx_L1_error)
-
- /* "frozenlist/_frozenlist.pyx":30
- * return self._items[index]
- *
- * def __setitem__(self, index, value): # <<<<<<<<<<<<<<
- * self._check_frozen()
- * self._items[index] = value
- */
-
- /* function exit code */
- __pyx_r = 0;
- goto __pyx_L0;
- __pyx_L1_error:;
- __Pyx_XDECREF(__pyx_t_1);
- __Pyx_AddTraceback("frozenlist._frozenlist.FrozenList.__setitem__", __pyx_clineno, __pyx_lineno, __pyx_filename);
- __pyx_r = -1;
- __pyx_L0:;
- __Pyx_RefNannyFinishContext();
- return __pyx_r;
-}
-
-/* "frozenlist/_frozenlist.pyx":34
- * self._items[index] = value
- *
- * def __delitem__(self, index): # <<<<<<<<<<<<<<
- * self._check_frozen()
- * del self._items[index]
- */
-
-/* Python wrapper */
-static int __pyx_pw_10frozenlist_11_frozenlist_10FrozenList_9__delitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_index); /*proto*/
-static int __pyx_pw_10frozenlist_11_frozenlist_10FrozenList_9__delitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_index) {
- int __pyx_r;
- __Pyx_RefNannyDeclarations
- __Pyx_RefNannySetupContext("__delitem__ (wrapper)", 0);
- __pyx_r = __pyx_pf_10frozenlist_11_frozenlist_10FrozenList_8__delitem__(((struct __pyx_obj_10frozenlist_11_frozenlist_FrozenList *)__pyx_v_self), ((PyObject *)__pyx_v_index));
-
- /* function exit code */
- __Pyx_RefNannyFinishContext();
- return __pyx_r;
-}
-
-static int __pyx_pf_10frozenlist_11_frozenlist_10FrozenList_8__delitem__(struct __pyx_obj_10frozenlist_11_frozenlist_FrozenList *__pyx_v_self, PyObject *__pyx_v_index) {
- int __pyx_r;
- __Pyx_RefNannyDeclarations
- PyObject *__pyx_t_1 = NULL;
- int __pyx_lineno = 0;
- const char *__pyx_filename = NULL;
- int __pyx_clineno = 0;
- __Pyx_RefNannySetupContext("__delitem__", 0);
-
- /* "frozenlist/_frozenlist.pyx":35
- *
- * def __delitem__(self, index):
- * self._check_frozen() # <<<<<<<<<<<<<<
- * del self._items[index]
- *
- */
- __pyx_t_1 = ((struct __pyx_vtabstruct_10frozenlist_11_frozenlist_FrozenList *)__pyx_v_self->__pyx_vtab)->_check_frozen(__pyx_v_self); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 35, __pyx_L1_error)
- __Pyx_GOTREF(__pyx_t_1);
- __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-
- /* "frozenlist/_frozenlist.pyx":36
- * def __delitem__(self, index):
- * self._check_frozen()
- * del self._items[index] # <<<<<<<<<<<<<<
- *
- * def __len__(self):
- */
- if (unlikely(__pyx_v_self->_items == Py_None)) {
- PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
- __PYX_ERR(0, 36, __pyx_L1_error)
- }
- if (unlikely(PyObject_DelItem(__pyx_v_self->_items, __pyx_v_index) < 0)) __PYX_ERR(0, 36, __pyx_L1_error)
-
- /* "frozenlist/_frozenlist.pyx":34
- * self._items[index] = value
- *
- * def __delitem__(self, index): # <<<<<<<<<<<<<<
- * self._check_frozen()
- * del self._items[index]
- */
-
- /* function exit code */
- __pyx_r = 0;
- goto __pyx_L0;
- __pyx_L1_error:;
- __Pyx_XDECREF(__pyx_t_1);
- __Pyx_AddTraceback("frozenlist._frozenlist.FrozenList.__delitem__", __pyx_clineno, __pyx_lineno, __pyx_filename);
- __pyx_r = -1;
- __pyx_L0:;
- __Pyx_RefNannyFinishContext();
- return __pyx_r;
-}
-
-/* "frozenlist/_frozenlist.pyx":38
- * del self._items[index]
- *
- * def __len__(self): # <<<<<<<<<<<<<<
- * return self._fast_len()
- *
- */
-
-/* Python wrapper */
-static Py_ssize_t __pyx_pw_10frozenlist_11_frozenlist_10FrozenList_11__len__(PyObject *__pyx_v_self); /*proto*/
-static Py_ssize_t __pyx_pw_10frozenlist_11_frozenlist_10FrozenList_11__len__(PyObject *__pyx_v_self) {
- Py_ssize_t __pyx_r;
- __Pyx_RefNannyDeclarations
- __Pyx_RefNannySetupContext("__len__ (wrapper)", 0);
- __pyx_r = __pyx_pf_10frozenlist_11_frozenlist_10FrozenList_10__len__(((struct __pyx_obj_10frozenlist_11_frozenlist_FrozenList *)__pyx_v_self));
-
- /* function exit code */
- __Pyx_RefNannyFinishContext();
- return __pyx_r;
-}
-
-static Py_ssize_t __pyx_pf_10frozenlist_11_frozenlist_10FrozenList_10__len__(struct __pyx_obj_10frozenlist_11_frozenlist_FrozenList *__pyx_v_self) {
- Py_ssize_t __pyx_r;
- __Pyx_RefNannyDeclarations
- PyObject *__pyx_t_1 = NULL;
- Py_ssize_t __pyx_t_2;
- int __pyx_lineno = 0;
- const char *__pyx_filename = NULL;
- int __pyx_clineno = 0;
- __Pyx_RefNannySetupContext("__len__", 0);
-
- /* "frozenlist/_frozenlist.pyx":39
- *
- * def __len__(self):
- * return self._fast_len() # <<<<<<<<<<<<<<
- *
- * def __iter__(self):
- */
- __pyx_t_1 = __pyx_f_10frozenlist_11_frozenlist_10FrozenList__fast_len(__pyx_v_self); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 39, __pyx_L1_error)
- __Pyx_GOTREF(__pyx_t_1);
- __pyx_t_2 = __Pyx_PyIndex_AsSsize_t(__pyx_t_1); if (unlikely((__pyx_t_2 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 39, __pyx_L1_error)
- __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
- __pyx_r = __pyx_t_2;
- goto __pyx_L0;
-
- /* "frozenlist/_frozenlist.pyx":38
- * del self._items[index]
- *
- * def __len__(self): # <<<<<<<<<<<<<<
- * return self._fast_len()
- *
- */
-
- /* function exit code */
- __pyx_L1_error:;
- __Pyx_XDECREF(__pyx_t_1);
- __Pyx_AddTraceback("frozenlist._frozenlist.FrozenList.__len__", __pyx_clineno, __pyx_lineno, __pyx_filename);
- __pyx_r = -1;
- __pyx_L0:;
- __Pyx_RefNannyFinishContext();
- return __pyx_r;
-}
-
-/* "frozenlist/_frozenlist.pyx":41
- * return self._fast_len()
- *
- * def __iter__(self): # <<<<<<<<<<<<<<
- * return self._items.__iter__()
- *
- */
-
-/* Python wrapper */
-static PyObject *__pyx_pw_10frozenlist_11_frozenlist_10FrozenList_13__iter__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pw_10frozenlist_11_frozenlist_10FrozenList_13__iter__(PyObject *__pyx_v_self) {
- PyObject *__pyx_r = 0;
- __Pyx_RefNannyDeclarations
- __Pyx_RefNannySetupContext("__iter__ (wrapper)", 0);
- __pyx_r = __pyx_pf_10frozenlist_11_frozenlist_10FrozenList_12__iter__(((struct __pyx_obj_10frozenlist_11_frozenlist_FrozenList *)__pyx_v_self));
-
- /* function exit code */
- __Pyx_RefNannyFinishContext();
- return __pyx_r;
-}
-
-static PyObject *__pyx_pf_10frozenlist_11_frozenlist_10FrozenList_12__iter__(struct __pyx_obj_10frozenlist_11_frozenlist_FrozenList *__pyx_v_self) {
- PyObject *__pyx_r = NULL;
- __Pyx_RefNannyDeclarations
- PyObject *__pyx_t_1 = NULL;
- PyObject *__pyx_t_2 = NULL;
- PyObject *__pyx_t_3 = NULL;
- int __pyx_lineno = 0;
- const char *__pyx_filename = NULL;
- int __pyx_clineno = 0;
- __Pyx_RefNannySetupContext("__iter__", 0);
-
- /* "frozenlist/_frozenlist.pyx":42
- *
- * def __iter__(self):
- * return self._items.__iter__() # <<<<<<<<<<<<<<
- *
- * def __reversed__(self):
- */
- __Pyx_XDECREF(__pyx_r);
- __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_self->_items, __pyx_n_s_iter); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 42, __pyx_L1_error)
- __Pyx_GOTREF(__pyx_t_2);
- __pyx_t_3 = NULL;
- if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_2))) {
- __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2);
- if (likely(__pyx_t_3)) {
- PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
- __Pyx_INCREF(__pyx_t_3);
- __Pyx_INCREF(function);
- __Pyx_DECREF_SET(__pyx_t_2, function);
- }
- }
- __pyx_t_1 = (__pyx_t_3) ? __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_3) : __Pyx_PyObject_CallNoArg(__pyx_t_2);
- __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
- if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 42, __pyx_L1_error)
- __Pyx_GOTREF(__pyx_t_1);
- __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
- __pyx_r = __pyx_t_1;
- __pyx_t_1 = 0;
- goto __pyx_L0;
-
- /* "frozenlist/_frozenlist.pyx":41
- * return self._fast_len()
- *
- * def __iter__(self): # <<<<<<<<<<<<<<
- * return self._items.__iter__()
- *
- */
-
- /* function exit code */
- __pyx_L1_error:;
- __Pyx_XDECREF(__pyx_t_1);
- __Pyx_XDECREF(__pyx_t_2);
- __Pyx_XDECREF(__pyx_t_3);
- __Pyx_AddTraceback("frozenlist._frozenlist.FrozenList.__iter__", __pyx_clineno, __pyx_lineno, __pyx_filename);
- __pyx_r = NULL;
- __pyx_L0:;
- __Pyx_XGIVEREF(__pyx_r);
- __Pyx_RefNannyFinishContext();
- return __pyx_r;
-}
-
-/* "frozenlist/_frozenlist.pyx":44
- * return self._items.__iter__()
- *
- * def __reversed__(self): # <<<<<<<<<<<<<<
- * return self._items.__reversed__()
- *
- */
-
-/* Python wrapper */
-static PyObject *__pyx_pw_10frozenlist_11_frozenlist_10FrozenList_15__reversed__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
-static PyObject *__pyx_pw_10frozenlist_11_frozenlist_10FrozenList_15__reversed__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
- PyObject *__pyx_r = 0;
- __Pyx_RefNannyDeclarations
- __Pyx_RefNannySetupContext("__reversed__ (wrapper)", 0);
- __pyx_r = __pyx_pf_10frozenlist_11_frozenlist_10FrozenList_14__reversed__(((struct __pyx_obj_10frozenlist_11_frozenlist_FrozenList *)__pyx_v_self));
-
- /* function exit code */
- __Pyx_RefNannyFinishContext();
- return __pyx_r;
-}
-
-static PyObject *__pyx_pf_10frozenlist_11_frozenlist_10FrozenList_14__reversed__(struct __pyx_obj_10frozenlist_11_frozenlist_FrozenList *__pyx_v_self) {
- PyObject *__pyx_r = NULL;
- __Pyx_RefNannyDeclarations
- PyObject *__pyx_t_1 = NULL;
- PyObject *__pyx_t_2 = NULL;
- PyObject *__pyx_t_3 = NULL;
- int __pyx_lineno = 0;
- const char *__pyx_filename = NULL;
- int __pyx_clineno = 0;
- __Pyx_RefNannySetupContext("__reversed__", 0);
-
- /* "frozenlist/_frozenlist.pyx":45
- *
- * def __reversed__(self):
- * return self._items.__reversed__() # <<<<<<<<<<<<<<
- *
- * def __richcmp__(self, other, op):
- */
- __Pyx_XDECREF(__pyx_r);
- __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_self->_items, __pyx_n_s_reversed); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 45, __pyx_L1_error)
- __Pyx_GOTREF(__pyx_t_2);
- __pyx_t_3 = NULL;
- if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_2))) {
- __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2);
- if (likely(__pyx_t_3)) {
- PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
- __Pyx_INCREF(__pyx_t_3);
- __Pyx_INCREF(function);
- __Pyx_DECREF_SET(__pyx_t_2, function);
- }
- }
- __pyx_t_1 = (__pyx_t_3) ? __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_3) : __Pyx_PyObject_CallNoArg(__pyx_t_2);
- __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
- if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 45, __pyx_L1_error)
- __Pyx_GOTREF(__pyx_t_1);
- __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
- __pyx_r = __pyx_t_1;
- __pyx_t_1 = 0;
- goto __pyx_L0;
-
- /* "frozenlist/_frozenlist.pyx":44
- * return self._items.__iter__()
- *
- * def __reversed__(self): # <<<<<<<<<<<<<<
- * return self._items.__reversed__()
- *
- */
-
- /* function exit code */
- __pyx_L1_error:;
- __Pyx_XDECREF(__pyx_t_1);
- __Pyx_XDECREF(__pyx_t_2);
- __Pyx_XDECREF(__pyx_t_3);
- __Pyx_AddTraceback("frozenlist._frozenlist.FrozenList.__reversed__", __pyx_clineno, __pyx_lineno, __pyx_filename);
- __pyx_r = NULL;
- __pyx_L0:;
- __Pyx_XGIVEREF(__pyx_r);
- __Pyx_RefNannyFinishContext();
- return __pyx_r;
-}
-
-/* "frozenlist/_frozenlist.pyx":47
- * return self._items.__reversed__()
- *
- * def __richcmp__(self, other, op): # <<<<<<<<<<<<<<
- * if op == 0: # <
- * return list(self) < other
- */
-
-/* Python wrapper */
-static PyObject *__pyx_pw_10frozenlist_11_frozenlist_10FrozenList_17__richcmp__(PyObject *__pyx_v_self, PyObject *__pyx_v_other, int __pyx_arg_op); /*proto*/
-static PyObject *__pyx_pw_10frozenlist_11_frozenlist_10FrozenList_17__richcmp__(PyObject *__pyx_v_self, PyObject *__pyx_v_other, int __pyx_arg_op) {
- PyObject *__pyx_v_op = 0;
- int __pyx_lineno = 0;
- const char *__pyx_filename = NULL;
- int __pyx_clineno = 0;
- PyObject *__pyx_r = 0;
- __Pyx_RefNannyDeclarations
- __Pyx_RefNannySetupContext("__richcmp__ (wrapper)", 0);
- __pyx_v_op = __Pyx_PyInt_From_int(__pyx_arg_op); if (unlikely(!__pyx_v_op)) __PYX_ERR(0, 47, __pyx_L3_error)
- __Pyx_GOTREF(__pyx_v_op);
- goto __pyx_L4_argument_unpacking_done;
- __pyx_L3_error:;
- __Pyx_AddTraceback("frozenlist._frozenlist.FrozenList.__richcmp__", __pyx_clineno, __pyx_lineno, __pyx_filename);
- __Pyx_RefNannyFinishContext();
- return NULL;
- __pyx_L4_argument_unpacking_done:;
- __pyx_r = __pyx_pf_10frozenlist_11_frozenlist_10FrozenList_16__richcmp__(((struct __pyx_obj_10frozenlist_11_frozenlist_FrozenList *)__pyx_v_self), ((PyObject *)__pyx_v_other), ((PyObject *)__pyx_v_op));
-
- /* function exit code */
- __Pyx_XDECREF(__pyx_v_op);
- __Pyx_RefNannyFinishContext();
- return __pyx_r;
-}
-
-static PyObject *__pyx_pf_10frozenlist_11_frozenlist_10FrozenList_16__richcmp__(struct __pyx_obj_10frozenlist_11_frozenlist_FrozenList *__pyx_v_self, PyObject *__pyx_v_other, PyObject *__pyx_v_op) {
- PyObject *__pyx_r = NULL;
- __Pyx_RefNannyDeclarations
- PyObject *__pyx_t_1 = NULL;
- int __pyx_t_2;
- PyObject *__pyx_t_3 = NULL;
- int __pyx_lineno = 0;
- const char *__pyx_filename = NULL;
- int __pyx_clineno = 0;
- __Pyx_RefNannySetupContext("__richcmp__", 0);
-
- /* "frozenlist/_frozenlist.pyx":48
- *
- * def __richcmp__(self, other, op):
- * if op == 0: # < # <<<<<<<<<<<<<<
- * return list(self) < other
- * if op == 1: # <=
- */
- __pyx_t_1 = __Pyx_PyInt_EqObjC(__pyx_v_op, __pyx_int_0, 0, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 48, __pyx_L1_error)
- __Pyx_GOTREF(__pyx_t_1);
- __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_2 < 0)) __PYX_ERR(0, 48, __pyx_L1_error)
- __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
- if (__pyx_t_2) {
-
- /* "frozenlist/_frozenlist.pyx":49
- * def __richcmp__(self, other, op):
- * if op == 0: # <
- * return list(self) < other # <<<<<<<<<<<<<<
- * if op == 1: # <=
- * return list(self) <= other
- */
- __Pyx_XDECREF(__pyx_r);
- __pyx_t_1 = PySequence_List(((PyObject *)__pyx_v_self)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 49, __pyx_L1_error)
- __Pyx_GOTREF(__pyx_t_1);
- __pyx_t_3 = PyObject_RichCompare(__pyx_t_1, __pyx_v_other, Py_LT); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 49, __pyx_L1_error)
- __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
- __pyx_r = __pyx_t_3;
- __pyx_t_3 = 0;
- goto __pyx_L0;
-
- /* "frozenlist/_frozenlist.pyx":48
- *
- * def __richcmp__(self, other, op):
- * if op == 0: # < # <<<<<<<<<<<<<<
- * return list(self) < other
- * if op == 1: # <=
- */
- }
-
- /* "frozenlist/_frozenlist.pyx":50
- * if op == 0: # <
- * return list(self) < other
- * if op == 1: # <= # <<<<<<<<<<<<<<
- * return list(self) <= other
- * if op == 2: # ==
- */
- __pyx_t_3 = __Pyx_PyInt_EqObjC(__pyx_v_op, __pyx_int_1, 1, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 50, __pyx_L1_error)
- __Pyx_GOTREF(__pyx_t_3);
- __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_2 < 0)) __PYX_ERR(0, 50, __pyx_L1_error)
- __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
- if (__pyx_t_2) {
-
- /* "frozenlist/_frozenlist.pyx":51
- * return list(self) < other
- * if op == 1: # <=
- * return list(self) <= other # <<<<<<<<<<<<<<
- * if op == 2: # ==
- * return list(self) == other
- */
- __Pyx_XDECREF(__pyx_r);
- __pyx_t_3 = PySequence_List(((PyObject *)__pyx_v_self)); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 51, __pyx_L1_error)
- __Pyx_GOTREF(__pyx_t_3);
- __pyx_t_1 = PyObject_RichCompare(__pyx_t_3, __pyx_v_other, Py_LE); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 51, __pyx_L1_error)
- __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
- __pyx_r = __pyx_t_1;
- __pyx_t_1 = 0;
- goto __pyx_L0;
-
- /* "frozenlist/_frozenlist.pyx":50
- * if op == 0: # <
- * return list(self) < other
- * if op == 1: # <= # <<<<<<<<<<<<<<
- * return list(self) <= other
- * if op == 2: # ==
- */
- }
-
- /* "frozenlist/_frozenlist.pyx":52
- * if op == 1: # <=
- * return list(self) <= other
- * if op == 2: # == # <<<<<<<<<<<<<<
- * return list(self) == other
- * if op == 3: # !=
- */
- __pyx_t_1 = __Pyx_PyInt_EqObjC(__pyx_v_op, __pyx_int_2, 2, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 52, __pyx_L1_error)
- __Pyx_GOTREF(__pyx_t_1);
- __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_2 < 0)) __PYX_ERR(0, 52, __pyx_L1_error)
- __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
- if (__pyx_t_2) {
-
- /* "frozenlist/_frozenlist.pyx":53
- * return list(self) <= other
- * if op == 2: # ==
- * return list(self) == other # <<<<<<<<<<<<<<
- * if op == 3: # !=
- * return list(self) != other
- */
- __Pyx_XDECREF(__pyx_r);
- __pyx_t_1 = PySequence_List(((PyObject *)__pyx_v_self)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 53, __pyx_L1_error)
- __Pyx_GOTREF(__pyx_t_1);
- __pyx_t_3 = PyObject_RichCompare(__pyx_t_1, __pyx_v_other, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 53, __pyx_L1_error)
- __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
- __pyx_r = __pyx_t_3;
- __pyx_t_3 = 0;
- goto __pyx_L0;
-
- /* "frozenlist/_frozenlist.pyx":52
- * if op == 1: # <=
- * return list(self) <= other
- * if op == 2: # == # <<<<<<<<<<<<<<
- * return list(self) == other
- * if op == 3: # !=
- */
- }
-
- /* "frozenlist/_frozenlist.pyx":54
- * if op == 2: # ==
- * return list(self) == other
- * if op == 3: # != # <<<<<<<<<<<<<<
- * return list(self) != other
- * if op == 4: # >
- */
- __pyx_t_3 = __Pyx_PyInt_EqObjC(__pyx_v_op, __pyx_int_3, 3, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 54, __pyx_L1_error)
- __Pyx_GOTREF(__pyx_t_3);
- __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_2 < 0)) __PYX_ERR(0, 54, __pyx_L1_error)
- __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
- if (__pyx_t_2) {
-
- /* "frozenlist/_frozenlist.pyx":55
- * return list(self) == other
- * if op == 3: # !=
- * return list(self) != other # <<<<<<<<<<<<<<
- * if op == 4: # >
- * return list(self) > other
- */
- __Pyx_XDECREF(__pyx_r);
- __pyx_t_3 = PySequence_List(((PyObject *)__pyx_v_self)); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 55, __pyx_L1_error)
- __Pyx_GOTREF(__pyx_t_3);
- __pyx_t_1 = PyObject_RichCompare(__pyx_t_3, __pyx_v_other, Py_NE); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 55, __pyx_L1_error)
- __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
- __pyx_r = __pyx_t_1;
- __pyx_t_1 = 0;
- goto __pyx_L0;
-
- /* "frozenlist/_frozenlist.pyx":54
- * if op == 2: # ==
- * return list(self) == other
- * if op == 3: # != # <<<<<<<<<<<<<<
- * return list(self) != other
- * if op == 4: # >
- */
- }
-
- /* "frozenlist/_frozenlist.pyx":56
- * if op == 3: # !=
- * return list(self) != other
- * if op == 4: # > # <<<<<<<<<<<<<<
- * return list(self) > other
- * if op == 5: # =>
- */
- __pyx_t_1 = __Pyx_PyInt_EqObjC(__pyx_v_op, __pyx_int_4, 4, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 56, __pyx_L1_error)
- __Pyx_GOTREF(__pyx_t_1);
- __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_2 < 0)) __PYX_ERR(0, 56, __pyx_L1_error)
- __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
- if (__pyx_t_2) {
-
- /* "frozenlist/_frozenlist.pyx":57
- * return list(self) != other
- * if op == 4: # >
- * return list(self) > other # <<<<<<<<<<<<<<
- * if op == 5: # =>
- * return list(self) >= other
- */
- __Pyx_XDECREF(__pyx_r);
- __pyx_t_1 = PySequence_List(((PyObject *)__pyx_v_self)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 57, __pyx_L1_error)
- __Pyx_GOTREF(__pyx_t_1);
- __pyx_t_3 = PyObject_RichCompare(__pyx_t_1, __pyx_v_other, Py_GT); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 57, __pyx_L1_error)
- __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
- __pyx_r = __pyx_t_3;
- __pyx_t_3 = 0;
- goto __pyx_L0;
-
- /* "frozenlist/_frozenlist.pyx":56
- * if op == 3: # !=
- * return list(self) != other
- * if op == 4: # > # <<<<<<<<<<<<<<
- * return list(self) > other
- * if op == 5: # =>
- */
- }
-
- /* "frozenlist/_frozenlist.pyx":58
- * if op == 4: # >
- * return list(self) > other
- * if op == 5: # => # <<<<<<<<<<<<<<
- * return list(self) >= other
- *
- */
- __pyx_t_3 = __Pyx_PyInt_EqObjC(__pyx_v_op, __pyx_int_5, 5, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 58, __pyx_L1_error)
- __Pyx_GOTREF(__pyx_t_3);
- __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_2 < 0)) __PYX_ERR(0, 58, __pyx_L1_error)
- __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
- if (__pyx_t_2) {
-
- /* "frozenlist/_frozenlist.pyx":59
- * return list(self) > other
- * if op == 5: # =>
- * return list(self) >= other # <<<<<<<<<<<<<<
- *
- * def insert(self, pos, item):
- */
- __Pyx_XDECREF(__pyx_r);
- __pyx_t_3 = PySequence_List(((PyObject *)__pyx_v_self)); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 59, __pyx_L1_error)
- __Pyx_GOTREF(__pyx_t_3);
- __pyx_t_1 = PyObject_RichCompare(__pyx_t_3, __pyx_v_other, Py_GE); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 59, __pyx_L1_error)
- __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
- __pyx_r = __pyx_t_1;
- __pyx_t_1 = 0;
- goto __pyx_L0;
-
- /* "frozenlist/_frozenlist.pyx":58
- * if op == 4: # >
- * return list(self) > other
- * if op == 5: # => # <<<<<<<<<<<<<<
- * return list(self) >= other
- *
- */
- }
-
- /* "frozenlist/_frozenlist.pyx":47
- * return self._items.__reversed__()
- *
- * def __richcmp__(self, other, op): # <<<<<<<<<<<<<<
- * if op == 0: # <
- * return list(self) < other
- */
-
- /* function exit code */
- __pyx_r = Py_None; __Pyx_INCREF(Py_None);
- goto __pyx_L0;
- __pyx_L1_error:;
- __Pyx_XDECREF(__pyx_t_1);
- __Pyx_XDECREF(__pyx_t_3);
- __Pyx_AddTraceback("frozenlist._frozenlist.FrozenList.__richcmp__", __pyx_clineno, __pyx_lineno, __pyx_filename);
- __pyx_r = NULL;
- __pyx_L0:;
- __Pyx_XGIVEREF(__pyx_r);
- __Pyx_RefNannyFinishContext();
- return __pyx_r;
-}
-
-/* "frozenlist/_frozenlist.pyx":61
- * return list(self) >= other
- *
- * def insert(self, pos, item): # <<<<<<<<<<<<<<
- * self._check_frozen()
- * self._items.insert(pos, item)
- */
-
-/* Python wrapper */
-static PyObject *__pyx_pw_10frozenlist_11_frozenlist_10FrozenList_19insert(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pw_10frozenlist_11_frozenlist_10FrozenList_19insert(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
- PyObject *__pyx_v_pos = 0;
- PyObject *__pyx_v_item = 0;
- int __pyx_lineno = 0;
- const char *__pyx_filename = NULL;
- int __pyx_clineno = 0;
- PyObject *__pyx_r = 0;
- __Pyx_RefNannyDeclarations
- __Pyx_RefNannySetupContext("insert (wrapper)", 0);
- {
- static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pos,&__pyx_n_s_item,0};
- PyObject* values[2] = {0,0};
- if (unlikely(__pyx_kwds)) {
- Py_ssize_t kw_args;
- const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
- switch (pos_args) {
- case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
- CYTHON_FALLTHROUGH;
- case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
- CYTHON_FALLTHROUGH;
- case 0: break;
- default: goto __pyx_L5_argtuple_error;
- }
- kw_args = PyDict_Size(__pyx_kwds);
- switch (pos_args) {
- case 0:
- if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_pos)) != 0)) kw_args--;
- else goto __pyx_L5_argtuple_error;
- CYTHON_FALLTHROUGH;
- case 1:
- if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_item)) != 0)) kw_args--;
- else {
- __Pyx_RaiseArgtupleInvalid("insert", 1, 2, 2, 1); __PYX_ERR(0, 61, __pyx_L3_error)
- }
- }
- if (unlikely(kw_args > 0)) {
- if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "insert") < 0)) __PYX_ERR(0, 61, __pyx_L3_error)
- }
- } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
- goto __pyx_L5_argtuple_error;
- } else {
- values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
- values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
- }
- __pyx_v_pos = values[0];
- __pyx_v_item = values[1];
- }
- goto __pyx_L4_argument_unpacking_done;
- __pyx_L5_argtuple_error:;
- __Pyx_RaiseArgtupleInvalid("insert", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 61, __pyx_L3_error)
- __pyx_L3_error:;
- __Pyx_AddTraceback("frozenlist._frozenlist.FrozenList.insert", __pyx_clineno, __pyx_lineno, __pyx_filename);
- __Pyx_RefNannyFinishContext();
- return NULL;
- __pyx_L4_argument_unpacking_done:;
- __pyx_r = __pyx_pf_10frozenlist_11_frozenlist_10FrozenList_18insert(((struct __pyx_obj_10frozenlist_11_frozenlist_FrozenList *)__pyx_v_self), __pyx_v_pos, __pyx_v_item);
-
- /* function exit code */
- __Pyx_RefNannyFinishContext();
- return __pyx_r;
-}
-
-static PyObject *__pyx_pf_10frozenlist_11_frozenlist_10FrozenList_18insert(struct __pyx_obj_10frozenlist_11_frozenlist_FrozenList *__pyx_v_self, PyObject *__pyx_v_pos, PyObject *__pyx_v_item) {
- PyObject *__pyx_r = NULL;
- __Pyx_RefNannyDeclarations
- PyObject *__pyx_t_1 = NULL;
- Py_ssize_t __pyx_t_2;
- int __pyx_t_3;
- int __pyx_lineno = 0;
- const char *__pyx_filename = NULL;
- int __pyx_clineno = 0;
- __Pyx_RefNannySetupContext("insert", 0);
-
- /* "frozenlist/_frozenlist.pyx":62
- *
- * def insert(self, pos, item):
- * self._check_frozen() # <<<<<<<<<<<<<<
- * self._items.insert(pos, item)
- *
- */
- __pyx_t_1 = ((struct __pyx_vtabstruct_10frozenlist_11_frozenlist_FrozenList *)__pyx_v_self->__pyx_vtab)->_check_frozen(__pyx_v_self); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 62, __pyx_L1_error)
- __Pyx_GOTREF(__pyx_t_1);
- __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-
- /* "frozenlist/_frozenlist.pyx":63
- * def insert(self, pos, item):
- * self._check_frozen()
- * self._items.insert(pos, item) # <<<<<<<<<<<<<<
- *
- * def __contains__(self, item):
- */
- if (unlikely(__pyx_v_self->_items == Py_None)) {
- PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "insert");
- __PYX_ERR(0, 63, __pyx_L1_error)
- }
- __pyx_t_2 = __Pyx_PyIndex_AsSsize_t(__pyx_v_pos); if (unlikely((__pyx_t_2 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 63, __pyx_L1_error)
- __pyx_t_3 = PyList_Insert(__pyx_v_self->_items, __pyx_t_2, __pyx_v_item); if (unlikely(__pyx_t_3 == ((int)-1))) __PYX_ERR(0, 63, __pyx_L1_error)
-
- /* "frozenlist/_frozenlist.pyx":61
- * return list(self) >= other
- *
- * def insert(self, pos, item): # <<<<<<<<<<<<<<
- * self._check_frozen()
- * self._items.insert(pos, item)
- */
-
- /* function exit code */
- __pyx_r = Py_None; __Pyx_INCREF(Py_None);
- goto __pyx_L0;
- __pyx_L1_error:;
- __Pyx_XDECREF(__pyx_t_1);
- __Pyx_AddTraceback("frozenlist._frozenlist.FrozenList.insert", __pyx_clineno, __pyx_lineno, __pyx_filename);
- __pyx_r = NULL;
- __pyx_L0:;
- __Pyx_XGIVEREF(__pyx_r);
- __Pyx_RefNannyFinishContext();
- return __pyx_r;
-}
-
-/* "frozenlist/_frozenlist.pyx":65
- * self._items.insert(pos, item)
- *
- * def __contains__(self, item): # <<<<<<<<<<<<<<
- * return item in self._items
- *
- */
-
-/* Python wrapper */
-static int __pyx_pw_10frozenlist_11_frozenlist_10FrozenList_21__contains__(PyObject *__pyx_v_self, PyObject *__pyx_v_item); /*proto*/
-static int __pyx_pw_10frozenlist_11_frozenlist_10FrozenList_21__contains__(PyObject *__pyx_v_self, PyObject *__pyx_v_item) {
- int __pyx_r;
- __Pyx_RefNannyDeclarations
- __Pyx_RefNannySetupContext("__contains__ (wrapper)", 0);
- __pyx_r = __pyx_pf_10frozenlist_11_frozenlist_10FrozenList_20__contains__(((struct __pyx_obj_10frozenlist_11_frozenlist_FrozenList *)__pyx_v_self), ((PyObject *)__pyx_v_item));
-
- /* function exit code */
- __Pyx_RefNannyFinishContext();
- return __pyx_r;
-}
-
-static int __pyx_pf_10frozenlist_11_frozenlist_10FrozenList_20__contains__(struct __pyx_obj_10frozenlist_11_frozenlist_FrozenList *__pyx_v_self, PyObject *__pyx_v_item) {
- int __pyx_r;
- __Pyx_RefNannyDeclarations
- int __pyx_t_1;
- int __pyx_lineno = 0;
- const char *__pyx_filename = NULL;
- int __pyx_clineno = 0;
- __Pyx_RefNannySetupContext("__contains__", 0);
-
- /* "frozenlist/_frozenlist.pyx":66
- *
- * def __contains__(self, item):
- * return item in self._items # <<<<<<<<<<<<<<
- *
- * def __iadd__(self, items):
- */
- __pyx_t_1 = (__Pyx_PySequence_ContainsTF(__pyx_v_item, __pyx_v_self->_items, Py_EQ)); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(0, 66, __pyx_L1_error)
- __pyx_r = __pyx_t_1;
- goto __pyx_L0;
-
- /* "frozenlist/_frozenlist.pyx":65
- * self._items.insert(pos, item)
- *
- * def __contains__(self, item): # <<<<<<<<<<<<<<
- * return item in self._items
- *
- */
-
- /* function exit code */
- __pyx_L1_error:;
- __Pyx_AddTraceback("frozenlist._frozenlist.FrozenList.__contains__", __pyx_clineno, __pyx_lineno, __pyx_filename);
- __pyx_r = -1;
- __pyx_L0:;
- __Pyx_RefNannyFinishContext();
- return __pyx_r;
-}
-
-/* "frozenlist/_frozenlist.pyx":68
- * return item in self._items
- *
- * def __iadd__(self, items): # <<<<<<<<<<<<<<
- * self._check_frozen()
- * self._items += list(items)
- */
-
-/* Python wrapper */
-static PyObject *__pyx_pw_10frozenlist_11_frozenlist_10FrozenList_23__iadd__(PyObject *__pyx_v_self, PyObject *__pyx_v_items); /*proto*/
-static PyObject *__pyx_pw_10frozenlist_11_frozenlist_10FrozenList_23__iadd__(PyObject *__pyx_v_self, PyObject *__pyx_v_items) {
- PyObject *__pyx_r = 0;
- __Pyx_RefNannyDeclarations
- __Pyx_RefNannySetupContext("__iadd__ (wrapper)", 0);
- __pyx_r = __pyx_pf_10frozenlist_11_frozenlist_10FrozenList_22__iadd__(((struct __pyx_obj_10frozenlist_11_frozenlist_FrozenList *)__pyx_v_self), ((PyObject *)__pyx_v_items));
-
- /* function exit code */
- __Pyx_RefNannyFinishContext();
- return __pyx_r;
-}
-
-static PyObject *__pyx_pf_10frozenlist_11_frozenlist_10FrozenList_22__iadd__(struct __pyx_obj_10frozenlist_11_frozenlist_FrozenList *__pyx_v_self, PyObject *__pyx_v_items) {
- PyObject *__pyx_r = NULL;
- __Pyx_RefNannyDeclarations
- PyObject *__pyx_t_1 = NULL;
- PyObject *__pyx_t_2 = NULL;
- int __pyx_lineno = 0;
- const char *__pyx_filename = NULL;
- int __pyx_clineno = 0;
- __Pyx_RefNannySetupContext("__iadd__", 0);
-
- /* "frozenlist/_frozenlist.pyx":69
- *
- * def __iadd__(self, items):
- * self._check_frozen() # <<<<<<<<<<<<<<
- * self._items += list(items)
- * return self
- */
- __pyx_t_1 = ((struct __pyx_vtabstruct_10frozenlist_11_frozenlist_FrozenList *)__pyx_v_self->__pyx_vtab)->_check_frozen(__pyx_v_self); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 69, __pyx_L1_error)
- __Pyx_GOTREF(__pyx_t_1);
- __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-
- /* "frozenlist/_frozenlist.pyx":70
- * def __iadd__(self, items):
- * self._check_frozen()
- * self._items += list(items) # <<<<<<<<<<<<<<
- * return self
- *
- */
- __pyx_t_1 = PySequence_List(__pyx_v_items); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 70, __pyx_L1_error)
- __Pyx_GOTREF(__pyx_t_1);
- __pyx_t_2 = PyNumber_InPlaceAdd(__pyx_v_self->_items, __pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 70, __pyx_L1_error)
- __Pyx_GOTREF(__pyx_t_2);
- __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
- __Pyx_GIVEREF(__pyx_t_2);
- __Pyx_GOTREF(__pyx_v_self->_items);
- __Pyx_DECREF(__pyx_v_self->_items);
- __pyx_v_self->_items = ((PyObject*)__pyx_t_2);
- __pyx_t_2 = 0;
-
- /* "frozenlist/_frozenlist.pyx":71
- * self._check_frozen()
- * self._items += list(items)
- * return self # <<<<<<<<<<<<<<
- *
- * def index(self, item):
- */
- __Pyx_XDECREF(__pyx_r);
- __Pyx_INCREF(((PyObject *)__pyx_v_self));
- __pyx_r = ((PyObject *)__pyx_v_self);
- goto __pyx_L0;
-
- /* "frozenlist/_frozenlist.pyx":68
- * return item in self._items
- *
- * def __iadd__(self, items): # <<<<<<<<<<<<<<
- * self._check_frozen()
- * self._items += list(items)
- */
-
- /* function exit code */
- __pyx_L1_error:;
- __Pyx_XDECREF(__pyx_t_1);
- __Pyx_XDECREF(__pyx_t_2);
- __Pyx_AddTraceback("frozenlist._frozenlist.FrozenList.__iadd__", __pyx_clineno, __pyx_lineno, __pyx_filename);
- __pyx_r = NULL;
- __pyx_L0:;
- __Pyx_XGIVEREF(__pyx_r);
- __Pyx_RefNannyFinishContext();
- return __pyx_r;
-}
-
-/* "frozenlist/_frozenlist.pyx":73
- * return self
- *
- * def index(self, item): # <<<<<<<<<<<<<<
- * return self._items.index(item)
- *
- */
-
-/* Python wrapper */
-static PyObject *__pyx_pw_10frozenlist_11_frozenlist_10FrozenList_25index(PyObject *__pyx_v_self, PyObject *__pyx_v_item); /*proto*/
-static PyObject *__pyx_pw_10frozenlist_11_frozenlist_10FrozenList_25index(PyObject *__pyx_v_self, PyObject *__pyx_v_item) {
- PyObject *__pyx_r = 0;
- __Pyx_RefNannyDeclarations
- __Pyx_RefNannySetupContext("index (wrapper)", 0);
- __pyx_r = __pyx_pf_10frozenlist_11_frozenlist_10FrozenList_24index(((struct __pyx_obj_10frozenlist_11_frozenlist_FrozenList *)__pyx_v_self), ((PyObject *)__pyx_v_item));
-
- /* function exit code */
- __Pyx_RefNannyFinishContext();
- return __pyx_r;
-}
-
-static PyObject *__pyx_pf_10frozenlist_11_frozenlist_10FrozenList_24index(struct __pyx_obj_10frozenlist_11_frozenlist_FrozenList *__pyx_v_self, PyObject *__pyx_v_item) {
- PyObject *__pyx_r = NULL;
- __Pyx_RefNannyDeclarations
- PyObject *__pyx_t_1 = NULL;
- PyObject *__pyx_t_2 = NULL;
- PyObject *__pyx_t_3 = NULL;
- int __pyx_lineno = 0;
- const char *__pyx_filename = NULL;
- int __pyx_clineno = 0;
- __Pyx_RefNannySetupContext("index", 0);
-
- /* "frozenlist/_frozenlist.pyx":74
- *
- * def index(self, item):
- * return self._items.index(item) # <<<<<<<<<<<<<<
- *
- * def remove(self, item):
- */
- __Pyx_XDECREF(__pyx_r);
- __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_self->_items, __pyx_n_s_index); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 74, __pyx_L1_error)
- __Pyx_GOTREF(__pyx_t_2);
- __pyx_t_3 = NULL;
- if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_2))) {
- __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2);
- if (likely(__pyx_t_3)) {
- PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
- __Pyx_INCREF(__pyx_t_3);
- __Pyx_INCREF(function);
- __Pyx_DECREF_SET(__pyx_t_2, function);
- }
- }
- __pyx_t_1 = (__pyx_t_3) ? __Pyx_PyObject_Call2Args(__pyx_t_2, __pyx_t_3, __pyx_v_item) : __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_v_item);
- __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
- if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 74, __pyx_L1_error)
- __Pyx_GOTREF(__pyx_t_1);
- __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
- __pyx_r = __pyx_t_1;
- __pyx_t_1 = 0;
- goto __pyx_L0;
-
- /* "frozenlist/_frozenlist.pyx":73
- * return self
- *
- * def index(self, item): # <<<<<<<<<<<<<<
- * return self._items.index(item)
- *
- */
-
- /* function exit code */
- __pyx_L1_error:;
- __Pyx_XDECREF(__pyx_t_1);
- __Pyx_XDECREF(__pyx_t_2);
- __Pyx_XDECREF(__pyx_t_3);
- __Pyx_AddTraceback("frozenlist._frozenlist.FrozenList.index", __pyx_clineno, __pyx_lineno, __pyx_filename);
- __pyx_r = NULL;
- __pyx_L0:;
- __Pyx_XGIVEREF(__pyx_r);
- __Pyx_RefNannyFinishContext();
- return __pyx_r;
-}
-
-/* "frozenlist/_frozenlist.pyx":76
- * return self._items.index(item)
- *
- * def remove(self, item): # <<<<<<<<<<<<<<
- * self._check_frozen()
- * self._items.remove(item)
- */
-
-/* Python wrapper */
-static PyObject *__pyx_pw_10frozenlist_11_frozenlist_10FrozenList_27remove(PyObject *__pyx_v_self, PyObject *__pyx_v_item); /*proto*/
-static PyObject *__pyx_pw_10frozenlist_11_frozenlist_10FrozenList_27remove(PyObject *__pyx_v_self, PyObject *__pyx_v_item) {
- PyObject *__pyx_r = 0;
- __Pyx_RefNannyDeclarations
- __Pyx_RefNannySetupContext("remove (wrapper)", 0);
- __pyx_r = __pyx_pf_10frozenlist_11_frozenlist_10FrozenList_26remove(((struct __pyx_obj_10frozenlist_11_frozenlist_FrozenList *)__pyx_v_self), ((PyObject *)__pyx_v_item));
-
- /* function exit code */
- __Pyx_RefNannyFinishContext();
- return __pyx_r;
-}
-
-static PyObject *__pyx_pf_10frozenlist_11_frozenlist_10FrozenList_26remove(struct __pyx_obj_10frozenlist_11_frozenlist_FrozenList *__pyx_v_self, PyObject *__pyx_v_item) {
- PyObject *__pyx_r = NULL;
- __Pyx_RefNannyDeclarations
- PyObject *__pyx_t_1 = NULL;
- PyObject *__pyx_t_2 = NULL;
- PyObject *__pyx_t_3 = NULL;
- int __pyx_lineno = 0;
- const char *__pyx_filename = NULL;
- int __pyx_clineno = 0;
- __Pyx_RefNannySetupContext("remove", 0);
-
- /* "frozenlist/_frozenlist.pyx":77
- *
- * def remove(self, item):
- * self._check_frozen() # <<<<<<<<<<<<<<
- * self._items.remove(item)
- *
- */
- __pyx_t_1 = ((struct __pyx_vtabstruct_10frozenlist_11_frozenlist_FrozenList *)__pyx_v_self->__pyx_vtab)->_check_frozen(__pyx_v_self); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 77, __pyx_L1_error)
- __Pyx_GOTREF(__pyx_t_1);
- __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-
- /* "frozenlist/_frozenlist.pyx":78
- * def remove(self, item):
- * self._check_frozen()
- * self._items.remove(item) # <<<<<<<<<<<<<<
- *
- * def clear(self):
- */
- __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_self->_items, __pyx_n_s_remove); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 78, __pyx_L1_error)
- __Pyx_GOTREF(__pyx_t_2);
- __pyx_t_3 = NULL;
- if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_2))) {
- __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2);
- if (likely(__pyx_t_3)) {
- PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
- __Pyx_INCREF(__pyx_t_3);
- __Pyx_INCREF(function);
- __Pyx_DECREF_SET(__pyx_t_2, function);
- }
- }
- __pyx_t_1 = (__pyx_t_3) ? __Pyx_PyObject_Call2Args(__pyx_t_2, __pyx_t_3, __pyx_v_item) : __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_v_item);
- __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
- if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 78, __pyx_L1_error)
- __Pyx_GOTREF(__pyx_t_1);
- __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
- __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-
- /* "frozenlist/_frozenlist.pyx":76
- * return self._items.index(item)
- *
- * def remove(self, item): # <<<<<<<<<<<<<<
- * self._check_frozen()
- * self._items.remove(item)
- */
-
- /* function exit code */
- __pyx_r = Py_None; __Pyx_INCREF(Py_None);
- goto __pyx_L0;
- __pyx_L1_error:;
- __Pyx_XDECREF(__pyx_t_1);
- __Pyx_XDECREF(__pyx_t_2);
- __Pyx_XDECREF(__pyx_t_3);
- __Pyx_AddTraceback("frozenlist._frozenlist.FrozenList.remove", __pyx_clineno, __pyx_lineno, __pyx_filename);
- __pyx_r = NULL;
- __pyx_L0:;
- __Pyx_XGIVEREF(__pyx_r);
- __Pyx_RefNannyFinishContext();
- return __pyx_r;
-}
-
-/* "frozenlist/_frozenlist.pyx":80
- * self._items.remove(item)
- *
- * def clear(self): # <<<<<<<<<<<<<<
- * self._check_frozen()
- * self._items.clear()
- */
-
-/* Python wrapper */
-static PyObject *__pyx_pw_10frozenlist_11_frozenlist_10FrozenList_29clear(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
-static PyObject *__pyx_pw_10frozenlist_11_frozenlist_10FrozenList_29clear(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
- PyObject *__pyx_r = 0;
- __Pyx_RefNannyDeclarations
- __Pyx_RefNannySetupContext("clear (wrapper)", 0);
- __pyx_r = __pyx_pf_10frozenlist_11_frozenlist_10FrozenList_28clear(((struct __pyx_obj_10frozenlist_11_frozenlist_FrozenList *)__pyx_v_self));
-
- /* function exit code */
- __Pyx_RefNannyFinishContext();
- return __pyx_r;
-}
-
-static PyObject *__pyx_pf_10frozenlist_11_frozenlist_10FrozenList_28clear(struct __pyx_obj_10frozenlist_11_frozenlist_FrozenList *__pyx_v_self) {
- PyObject *__pyx_r = NULL;
- __Pyx_RefNannyDeclarations
- PyObject *__pyx_t_1 = NULL;
- PyObject *__pyx_t_2 = NULL;
- PyObject *__pyx_t_3 = NULL;
- int __pyx_lineno = 0;
- const char *__pyx_filename = NULL;
- int __pyx_clineno = 0;
- __Pyx_RefNannySetupContext("clear", 0);
-
- /* "frozenlist/_frozenlist.pyx":81
- *
- * def clear(self):
- * self._check_frozen() # <<<<<<<<<<<<<<
- * self._items.clear()
- *
- */
- __pyx_t_1 = ((struct __pyx_vtabstruct_10frozenlist_11_frozenlist_FrozenList *)__pyx_v_self->__pyx_vtab)->_check_frozen(__pyx_v_self); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 81, __pyx_L1_error)
- __Pyx_GOTREF(__pyx_t_1);
- __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-
- /* "frozenlist/_frozenlist.pyx":82
- * def clear(self):
- * self._check_frozen()
- * self._items.clear() # <<<<<<<<<<<<<<
- *
- * def extend(self, items):
- */
- __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_self->_items, __pyx_n_s_clear); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 82, __pyx_L1_error)
- __Pyx_GOTREF(__pyx_t_2);
- __pyx_t_3 = NULL;
- if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_2))) {
- __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2);
- if (likely(__pyx_t_3)) {
- PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
- __Pyx_INCREF(__pyx_t_3);
- __Pyx_INCREF(function);
- __Pyx_DECREF_SET(__pyx_t_2, function);
- }
- }
- __pyx_t_1 = (__pyx_t_3) ? __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_3) : __Pyx_PyObject_CallNoArg(__pyx_t_2);
- __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
- if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 82, __pyx_L1_error)
- __Pyx_GOTREF(__pyx_t_1);
- __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
- __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-
- /* "frozenlist/_frozenlist.pyx":80
- * self._items.remove(item)
- *
- * def clear(self): # <<<<<<<<<<<<<<
- * self._check_frozen()
- * self._items.clear()
- */
-
- /* function exit code */
- __pyx_r = Py_None; __Pyx_INCREF(Py_None);
- goto __pyx_L0;
- __pyx_L1_error:;
- __Pyx_XDECREF(__pyx_t_1);
- __Pyx_XDECREF(__pyx_t_2);
- __Pyx_XDECREF(__pyx_t_3);
- __Pyx_AddTraceback("frozenlist._frozenlist.FrozenList.clear", __pyx_clineno, __pyx_lineno, __pyx_filename);
- __pyx_r = NULL;
- __pyx_L0:;
- __Pyx_XGIVEREF(__pyx_r);
- __Pyx_RefNannyFinishContext();
- return __pyx_r;
-}
-
-/* "frozenlist/_frozenlist.pyx":84
- * self._items.clear()
- *
- * def extend(self, items): # <<<<<<<<<<<<<<
- * self._check_frozen()
- * self._items += list(items)
- */
-
-/* Python wrapper */
-static PyObject *__pyx_pw_10frozenlist_11_frozenlist_10FrozenList_31extend(PyObject *__pyx_v_self, PyObject *__pyx_v_items); /*proto*/
-static PyObject *__pyx_pw_10frozenlist_11_frozenlist_10FrozenList_31extend(PyObject *__pyx_v_self, PyObject *__pyx_v_items) {
- PyObject *__pyx_r = 0;
- __Pyx_RefNannyDeclarations
- __Pyx_RefNannySetupContext("extend (wrapper)", 0);
- __pyx_r = __pyx_pf_10frozenlist_11_frozenlist_10FrozenList_30extend(((struct __pyx_obj_10frozenlist_11_frozenlist_FrozenList *)__pyx_v_self), ((PyObject *)__pyx_v_items));
-
- /* function exit code */
- __Pyx_RefNannyFinishContext();
- return __pyx_r;
-}
-
-static PyObject *__pyx_pf_10frozenlist_11_frozenlist_10FrozenList_30extend(struct __pyx_obj_10frozenlist_11_frozenlist_FrozenList *__pyx_v_self, PyObject *__pyx_v_items) {
- PyObject *__pyx_r = NULL;
- __Pyx_RefNannyDeclarations
- PyObject *__pyx_t_1 = NULL;
- PyObject *__pyx_t_2 = NULL;
- int __pyx_lineno = 0;
- const char *__pyx_filename = NULL;
- int __pyx_clineno = 0;
- __Pyx_RefNannySetupContext("extend", 0);
-
- /* "frozenlist/_frozenlist.pyx":85
- *
- * def extend(self, items):
- * self._check_frozen() # <<<<<<<<<<<<<<
- * self._items += list(items)
- *
- */
- __pyx_t_1 = ((struct __pyx_vtabstruct_10frozenlist_11_frozenlist_FrozenList *)__pyx_v_self->__pyx_vtab)->_check_frozen(__pyx_v_self); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 85, __pyx_L1_error)
- __Pyx_GOTREF(__pyx_t_1);
- __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-
- /* "frozenlist/_frozenlist.pyx":86
- * def extend(self, items):
- * self._check_frozen()
- * self._items += list(items) # <<<<<<<<<<<<<<
- *
- * def reverse(self):
- */
- __pyx_t_1 = PySequence_List(__pyx_v_items); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 86, __pyx_L1_error)
- __Pyx_GOTREF(__pyx_t_1);
- __pyx_t_2 = PyNumber_InPlaceAdd(__pyx_v_self->_items, __pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 86, __pyx_L1_error)
- __Pyx_GOTREF(__pyx_t_2);
- __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
- __Pyx_GIVEREF(__pyx_t_2);
- __Pyx_GOTREF(__pyx_v_self->_items);
- __Pyx_DECREF(__pyx_v_self->_items);
- __pyx_v_self->_items = ((PyObject*)__pyx_t_2);
- __pyx_t_2 = 0;
-
- /* "frozenlist/_frozenlist.pyx":84
- * self._items.clear()
- *
- * def extend(self, items): # <<<<<<<<<<<<<<
- * self._check_frozen()
- * self._items += list(items)
- */
-
- /* function exit code */
- __pyx_r = Py_None; __Pyx_INCREF(Py_None);
- goto __pyx_L0;
- __pyx_L1_error:;
- __Pyx_XDECREF(__pyx_t_1);
- __Pyx_XDECREF(__pyx_t_2);
- __Pyx_AddTraceback("frozenlist._frozenlist.FrozenList.extend", __pyx_clineno, __pyx_lineno, __pyx_filename);
- __pyx_r = NULL;
- __pyx_L0:;
- __Pyx_XGIVEREF(__pyx_r);
- __Pyx_RefNannyFinishContext();
- return __pyx_r;
-}
-
-/* "frozenlist/_frozenlist.pyx":88
- * self._items += list(items)
- *
- * def reverse(self): # <<<<<<<<<<<<<<
- * self._check_frozen()
- * self._items.reverse()
- */
-
-/* Python wrapper */
-static PyObject *__pyx_pw_10frozenlist_11_frozenlist_10FrozenList_33reverse(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
-static PyObject *__pyx_pw_10frozenlist_11_frozenlist_10FrozenList_33reverse(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
- PyObject *__pyx_r = 0;
- __Pyx_RefNannyDeclarations
- __Pyx_RefNannySetupContext("reverse (wrapper)", 0);
- __pyx_r = __pyx_pf_10frozenlist_11_frozenlist_10FrozenList_32reverse(((struct __pyx_obj_10frozenlist_11_frozenlist_FrozenList *)__pyx_v_self));
-
- /* function exit code */
- __Pyx_RefNannyFinishContext();
- return __pyx_r;
-}
-
-static PyObject *__pyx_pf_10frozenlist_11_frozenlist_10FrozenList_32reverse(struct __pyx_obj_10frozenlist_11_frozenlist_FrozenList *__pyx_v_self) {
- PyObject *__pyx_r = NULL;
- __Pyx_RefNannyDeclarations
- PyObject *__pyx_t_1 = NULL;
- int __pyx_t_2;
- int __pyx_lineno = 0;
- const char *__pyx_filename = NULL;
- int __pyx_clineno = 0;
- __Pyx_RefNannySetupContext("reverse", 0);
-
- /* "frozenlist/_frozenlist.pyx":89
- *
- * def reverse(self):
- * self._check_frozen() # <<<<<<<<<<<<<<
- * self._items.reverse()
- *
- */
- __pyx_t_1 = ((struct __pyx_vtabstruct_10frozenlist_11_frozenlist_FrozenList *)__pyx_v_self->__pyx_vtab)->_check_frozen(__pyx_v_self); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 89, __pyx_L1_error)
- __Pyx_GOTREF(__pyx_t_1);
- __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-
- /* "frozenlist/_frozenlist.pyx":90
- * def reverse(self):
- * self._check_frozen()
- * self._items.reverse() # <<<<<<<<<<<<<<
- *
- * def pop(self, index=-1):
- */
- if (unlikely(__pyx_v_self->_items == Py_None)) {
- PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "reverse");
- __PYX_ERR(0, 90, __pyx_L1_error)
- }
- __pyx_t_2 = PyList_Reverse(__pyx_v_self->_items); if (unlikely(__pyx_t_2 == ((int)-1))) __PYX_ERR(0, 90, __pyx_L1_error)
-
- /* "frozenlist/_frozenlist.pyx":88
- * self._items += list(items)
- *
- * def reverse(self): # <<<<<<<<<<<<<<
- * self._check_frozen()
- * self._items.reverse()
- */
-
- /* function exit code */
- __pyx_r = Py_None; __Pyx_INCREF(Py_None);
- goto __pyx_L0;
- __pyx_L1_error:;
- __Pyx_XDECREF(__pyx_t_1);
- __Pyx_AddTraceback("frozenlist._frozenlist.FrozenList.reverse", __pyx_clineno, __pyx_lineno, __pyx_filename);
- __pyx_r = NULL;
- __pyx_L0:;
- __Pyx_XGIVEREF(__pyx_r);
- __Pyx_RefNannyFinishContext();
- return __pyx_r;
-}
-
-/* "frozenlist/_frozenlist.pyx":92
- * self._items.reverse()
- *
- * def pop(self, index=-1): # <<<<<<<<<<<<<<
- * self._check_frozen()
- * return self._items.pop(index)
- */
-
-/* Python wrapper */
-static PyObject *__pyx_pw_10frozenlist_11_frozenlist_10FrozenList_35pop(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pw_10frozenlist_11_frozenlist_10FrozenList_35pop(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
- PyObject *__pyx_v_index = 0;
- int __pyx_lineno = 0;
- const char *__pyx_filename = NULL;
- int __pyx_clineno = 0;
- PyObject *__pyx_r = 0;
- __Pyx_RefNannyDeclarations
- __Pyx_RefNannySetupContext("pop (wrapper)", 0);
- {
- static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_index,0};
- PyObject* values[1] = {0};
- values[0] = ((PyObject *)__pyx_int_neg_1);
- if (unlikely(__pyx_kwds)) {
- Py_ssize_t kw_args;
- const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
- switch (pos_args) {
- case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
- CYTHON_FALLTHROUGH;
- case 0: break;
- default: goto __pyx_L5_argtuple_error;
- }
- kw_args = PyDict_Size(__pyx_kwds);
- switch (pos_args) {
- case 0:
- if (kw_args > 0) {
- PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_index);
- if (value) { values[0] = value; kw_args--; }
- }
- }
- if (unlikely(kw_args > 0)) {
- if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "pop") < 0)) __PYX_ERR(0, 92, __pyx_L3_error)
- }
- } else {
- switch (PyTuple_GET_SIZE(__pyx_args)) {
- case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
- CYTHON_FALLTHROUGH;
- case 0: break;
- default: goto __pyx_L5_argtuple_error;
- }
- }
- __pyx_v_index = values[0];
- }
- goto __pyx_L4_argument_unpacking_done;
- __pyx_L5_argtuple_error:;
- __Pyx_RaiseArgtupleInvalid("pop", 0, 0, 1, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 92, __pyx_L3_error)
- __pyx_L3_error:;
- __Pyx_AddTraceback("frozenlist._frozenlist.FrozenList.pop", __pyx_clineno, __pyx_lineno, __pyx_filename);
- __Pyx_RefNannyFinishContext();
- return NULL;
- __pyx_L4_argument_unpacking_done:;
- __pyx_r = __pyx_pf_10frozenlist_11_frozenlist_10FrozenList_34pop(((struct __pyx_obj_10frozenlist_11_frozenlist_FrozenList *)__pyx_v_self), __pyx_v_index);
-
- /* function exit code */
- __Pyx_RefNannyFinishContext();
- return __pyx_r;
-}
-
-static PyObject *__pyx_pf_10frozenlist_11_frozenlist_10FrozenList_34pop(struct __pyx_obj_10frozenlist_11_frozenlist_FrozenList *__pyx_v_self, PyObject *__pyx_v_index) {
- PyObject *__pyx_r = NULL;
- __Pyx_RefNannyDeclarations
- PyObject *__pyx_t_1 = NULL;
- Py_ssize_t __pyx_t_2;
- int __pyx_lineno = 0;
- const char *__pyx_filename = NULL;
- int __pyx_clineno = 0;
- __Pyx_RefNannySetupContext("pop", 0);
-
- /* "frozenlist/_frozenlist.pyx":93
- *
- * def pop(self, index=-1):
- * self._check_frozen() # <<<<<<<<<<<<<<
- * return self._items.pop(index)
- *
- */
- __pyx_t_1 = ((struct __pyx_vtabstruct_10frozenlist_11_frozenlist_FrozenList *)__pyx_v_self->__pyx_vtab)->_check_frozen(__pyx_v_self); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 93, __pyx_L1_error)
- __Pyx_GOTREF(__pyx_t_1);
- __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-
- /* "frozenlist/_frozenlist.pyx":94
- * def pop(self, index=-1):
- * self._check_frozen()
- * return self._items.pop(index) # <<<<<<<<<<<<<<
- *
- * def append(self, item):
- */
- __Pyx_XDECREF(__pyx_r);
- if (unlikely(__pyx_v_self->_items == Py_None)) {
- PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "pop");
- __PYX_ERR(0, 94, __pyx_L1_error)
- }
- __pyx_t_2 = __Pyx_PyIndex_AsSsize_t(__pyx_v_index); if (unlikely((__pyx_t_2 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 94, __pyx_L1_error)
- __pyx_t_1 = __Pyx_PyList_PopIndex(__pyx_v_self->_items, __pyx_v_index, __pyx_t_2, 1, Py_ssize_t, PyInt_FromSsize_t); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 94, __pyx_L1_error)
- __Pyx_GOTREF(__pyx_t_1);
- __pyx_r = __pyx_t_1;
- __pyx_t_1 = 0;
- goto __pyx_L0;
-
- /* "frozenlist/_frozenlist.pyx":92
- * self._items.reverse()
- *
- * def pop(self, index=-1): # <<<<<<<<<<<<<<
- * self._check_frozen()
- * return self._items.pop(index)
- */
-
- /* function exit code */
- __pyx_L1_error:;
- __Pyx_XDECREF(__pyx_t_1);
- __Pyx_AddTraceback("frozenlist._frozenlist.FrozenList.pop", __pyx_clineno, __pyx_lineno, __pyx_filename);
- __pyx_r = NULL;
- __pyx_L0:;
- __Pyx_XGIVEREF(__pyx_r);
- __Pyx_RefNannyFinishContext();
- return __pyx_r;
-}
-
-/* "frozenlist/_frozenlist.pyx":96
- * return self._items.pop(index)
- *
- * def append(self, item): # <<<<<<<<<<<<<<
- * self._check_frozen()
- * return self._items.append(item)
- */
-
-/* Python wrapper */
-static PyObject *__pyx_pw_10frozenlist_11_frozenlist_10FrozenList_37append(PyObject *__pyx_v_self, PyObject *__pyx_v_item); /*proto*/
-static PyObject *__pyx_pw_10frozenlist_11_frozenlist_10FrozenList_37append(PyObject *__pyx_v_self, PyObject *__pyx_v_item) {
- PyObject *__pyx_r = 0;
- __Pyx_RefNannyDeclarations
- __Pyx_RefNannySetupContext("append (wrapper)", 0);
- __pyx_r = __pyx_pf_10frozenlist_11_frozenlist_10FrozenList_36append(((struct __pyx_obj_10frozenlist_11_frozenlist_FrozenList *)__pyx_v_self), ((PyObject *)__pyx_v_item));
-
- /* function exit code */
- __Pyx_RefNannyFinishContext();
- return __pyx_r;
-}
-
-static PyObject *__pyx_pf_10frozenlist_11_frozenlist_10FrozenList_36append(struct __pyx_obj_10frozenlist_11_frozenlist_FrozenList *__pyx_v_self, PyObject *__pyx_v_item) {
- PyObject *__pyx_r = NULL;
- __Pyx_RefNannyDeclarations
- PyObject *__pyx_t_1 = NULL;
- int __pyx_t_2;
- int __pyx_lineno = 0;
- const char *__pyx_filename = NULL;
- int __pyx_clineno = 0;
- __Pyx_RefNannySetupContext("append", 0);
-
- /* "frozenlist/_frozenlist.pyx":97
- *
- * def append(self, item):
- * self._check_frozen() # <<<<<<<<<<<<<<
- * return self._items.append(item)
- *
- */
- __pyx_t_1 = ((struct __pyx_vtabstruct_10frozenlist_11_frozenlist_FrozenList *)__pyx_v_self->__pyx_vtab)->_check_frozen(__pyx_v_self); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 97, __pyx_L1_error)
- __Pyx_GOTREF(__pyx_t_1);
- __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-
- /* "frozenlist/_frozenlist.pyx":98
- * def append(self, item):
- * self._check_frozen()
- * return self._items.append(item) # <<<<<<<<<<<<<<
- *
- * def count(self, item):
- */
- __Pyx_XDECREF(__pyx_r);
- if (unlikely(__pyx_v_self->_items == Py_None)) {
- PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "append");
- __PYX_ERR(0, 98, __pyx_L1_error)
- }
- __pyx_t_2 = __Pyx_PyList_Append(__pyx_v_self->_items, __pyx_v_item); if (unlikely(__pyx_t_2 == ((int)-1))) __PYX_ERR(0, 98, __pyx_L1_error)
- __pyx_t_1 = __Pyx_Owned_Py_None(__pyx_t_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 98, __pyx_L1_error)
- __Pyx_GOTREF(__pyx_t_1);
- __pyx_r = __pyx_t_1;
- __pyx_t_1 = 0;
- goto __pyx_L0;
-
- /* "frozenlist/_frozenlist.pyx":96
- * return self._items.pop(index)
- *
- * def append(self, item): # <<<<<<<<<<<<<<
- * self._check_frozen()
- * return self._items.append(item)
- */
-
- /* function exit code */
- __pyx_L1_error:;
- __Pyx_XDECREF(__pyx_t_1);
- __Pyx_AddTraceback("frozenlist._frozenlist.FrozenList.append", __pyx_clineno, __pyx_lineno, __pyx_filename);
- __pyx_r = NULL;
- __pyx_L0:;
- __Pyx_XGIVEREF(__pyx_r);
- __Pyx_RefNannyFinishContext();
- return __pyx_r;
-}
-
-/* "frozenlist/_frozenlist.pyx":100
- * return self._items.append(item)
- *
- * def count(self, item): # <<<<<<<<<<<<<<
- * return self._items.count(item)
- *
- */
-
-/* Python wrapper */
-static PyObject *__pyx_pw_10frozenlist_11_frozenlist_10FrozenList_39count(PyObject *__pyx_v_self, PyObject *__pyx_v_item); /*proto*/
-static PyObject *__pyx_pw_10frozenlist_11_frozenlist_10FrozenList_39count(PyObject *__pyx_v_self, PyObject *__pyx_v_item) {
- PyObject *__pyx_r = 0;
- __Pyx_RefNannyDeclarations
- __Pyx_RefNannySetupContext("count (wrapper)", 0);
- __pyx_r = __pyx_pf_10frozenlist_11_frozenlist_10FrozenList_38count(((struct __pyx_obj_10frozenlist_11_frozenlist_FrozenList *)__pyx_v_self), ((PyObject *)__pyx_v_item));
-
- /* function exit code */
- __Pyx_RefNannyFinishContext();
- return __pyx_r;
-}
-
-static PyObject *__pyx_pf_10frozenlist_11_frozenlist_10FrozenList_38count(struct __pyx_obj_10frozenlist_11_frozenlist_FrozenList *__pyx_v_self, PyObject *__pyx_v_item) {
- PyObject *__pyx_r = NULL;
- __Pyx_RefNannyDeclarations
- PyObject *__pyx_t_1 = NULL;
- PyObject *__pyx_t_2 = NULL;
- PyObject *__pyx_t_3 = NULL;
- int __pyx_lineno = 0;
- const char *__pyx_filename = NULL;
- int __pyx_clineno = 0;
- __Pyx_RefNannySetupContext("count", 0);
-
- /* "frozenlist/_frozenlist.pyx":101
- *
- * def count(self, item):
- * return self._items.count(item) # <<<<<<<<<<<<<<
- *
- * def __repr__(self):
- */
- __Pyx_XDECREF(__pyx_r);
- __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_self->_items, __pyx_n_s_count); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 101, __pyx_L1_error)
- __Pyx_GOTREF(__pyx_t_2);
- __pyx_t_3 = NULL;
- if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_2))) {
- __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2);
- if (likely(__pyx_t_3)) {
- PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
- __Pyx_INCREF(__pyx_t_3);
- __Pyx_INCREF(function);
- __Pyx_DECREF_SET(__pyx_t_2, function);
- }
- }
- __pyx_t_1 = (__pyx_t_3) ? __Pyx_PyObject_Call2Args(__pyx_t_2, __pyx_t_3, __pyx_v_item) : __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_v_item);
- __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
- if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 101, __pyx_L1_error)
- __Pyx_GOTREF(__pyx_t_1);
- __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
- __pyx_r = __pyx_t_1;
- __pyx_t_1 = 0;
- goto __pyx_L0;
-
- /* "frozenlist/_frozenlist.pyx":100
- * return self._items.append(item)
- *
- * def count(self, item): # <<<<<<<<<<<<<<
- * return self._items.count(item)
- *
- */
-
- /* function exit code */
- __pyx_L1_error:;
- __Pyx_XDECREF(__pyx_t_1);
- __Pyx_XDECREF(__pyx_t_2);
- __Pyx_XDECREF(__pyx_t_3);
- __Pyx_AddTraceback("frozenlist._frozenlist.FrozenList.count", __pyx_clineno, __pyx_lineno, __pyx_filename);
- __pyx_r = NULL;
- __pyx_L0:;
- __Pyx_XGIVEREF(__pyx_r);
- __Pyx_RefNannyFinishContext();
- return __pyx_r;
-}
-
-/* "frozenlist/_frozenlist.pyx":103
- * return self._items.count(item)
- *
- * def __repr__(self): # <<<<<<<<<<<<<<
- * return ''.format(self.frozen,
- * self._items)
- */
-
-/* Python wrapper */
-static PyObject *__pyx_pw_10frozenlist_11_frozenlist_10FrozenList_41__repr__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pw_10frozenlist_11_frozenlist_10FrozenList_41__repr__(PyObject *__pyx_v_self) {
- PyObject *__pyx_r = 0;
- __Pyx_RefNannyDeclarations
- __Pyx_RefNannySetupContext("__repr__ (wrapper)", 0);
- __pyx_r = __pyx_pf_10frozenlist_11_frozenlist_10FrozenList_40__repr__(((struct __pyx_obj_10frozenlist_11_frozenlist_FrozenList *)__pyx_v_self));
-
- /* function exit code */
- __Pyx_RefNannyFinishContext();
- return __pyx_r;
-}
-
-static PyObject *__pyx_pf_10frozenlist_11_frozenlist_10FrozenList_40__repr__(struct __pyx_obj_10frozenlist_11_frozenlist_FrozenList *__pyx_v_self) {
- PyObject *__pyx_r = NULL;
- __Pyx_RefNannyDeclarations
- PyObject *__pyx_t_1 = NULL;
- PyObject *__pyx_t_2 = NULL;
- PyObject *__pyx_t_3 = NULL;
- PyObject *__pyx_t_4 = NULL;
- int __pyx_t_5;
- PyObject *__pyx_t_6 = NULL;
- int __pyx_lineno = 0;
- const char *__pyx_filename = NULL;
- int __pyx_clineno = 0;
- __Pyx_RefNannySetupContext("__repr__", 0);
-
- /* "frozenlist/_frozenlist.pyx":104
- *
- * def __repr__(self):
- * return ''.format(self.frozen, # <<<<<<<<<<<<<<
- * self._items)
- *
- */
- __Pyx_XDECREF(__pyx_r);
- __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_kp_u_FrozenList_frozen_r, __pyx_n_s_format); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 104, __pyx_L1_error)
- __Pyx_GOTREF(__pyx_t_2);
- __pyx_t_3 = __Pyx_PyBool_FromLong(__pyx_v_self->frozen); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 104, __pyx_L1_error)
- __Pyx_GOTREF(__pyx_t_3);
-
- /* "frozenlist/_frozenlist.pyx":105
- * def __repr__(self):
- * return ''.format(self.frozen,
- * self._items) # <<<<<<<<<<<<<<
- *
- * def __hash__(self):
- */
- __pyx_t_4 = NULL;
- __pyx_t_5 = 0;
- if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_2))) {
- __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_2);
- if (likely(__pyx_t_4)) {
- PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
- __Pyx_INCREF(__pyx_t_4);
- __Pyx_INCREF(function);
- __Pyx_DECREF_SET(__pyx_t_2, function);
- __pyx_t_5 = 1;
- }
- }
- #if CYTHON_FAST_PYCALL
- if (PyFunction_Check(__pyx_t_2)) {
- PyObject *__pyx_temp[3] = {__pyx_t_4, __pyx_t_3, __pyx_v_self->_items};
- __pyx_t_1 = __Pyx_PyFunction_FastCall(__pyx_t_2, __pyx_temp+1-__pyx_t_5, 2+__pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 104, __pyx_L1_error)
- __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
- __Pyx_GOTREF(__pyx_t_1);
- __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
- } else
- #endif
- #if CYTHON_FAST_PYCCALL
- if (__Pyx_PyFastCFunction_Check(__pyx_t_2)) {
- PyObject *__pyx_temp[3] = {__pyx_t_4, __pyx_t_3, __pyx_v_self->_items};
- __pyx_t_1 = __Pyx_PyCFunction_FastCall(__pyx_t_2, __pyx_temp+1-__pyx_t_5, 2+__pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 104, __pyx_L1_error)
- __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
- __Pyx_GOTREF(__pyx_t_1);
- __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
- } else
- #endif
- {
- __pyx_t_6 = PyTuple_New(2+__pyx_t_5); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 104, __pyx_L1_error)
- __Pyx_GOTREF(__pyx_t_6);
- if (__pyx_t_4) {
- __Pyx_GIVEREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_4); __pyx_t_4 = NULL;
- }
- __Pyx_GIVEREF(__pyx_t_3);
- PyTuple_SET_ITEM(__pyx_t_6, 0+__pyx_t_5, __pyx_t_3);
- __Pyx_INCREF(__pyx_v_self->_items);
- __Pyx_GIVEREF(__pyx_v_self->_items);
- PyTuple_SET_ITEM(__pyx_t_6, 1+__pyx_t_5, __pyx_v_self->_items);
- __pyx_t_3 = 0;
- __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_6, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 104, __pyx_L1_error)
- __Pyx_GOTREF(__pyx_t_1);
- __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
- }
- __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
- __pyx_r = __pyx_t_1;
- __pyx_t_1 = 0;
- goto __pyx_L0;
-
- /* "frozenlist/_frozenlist.pyx":103
- * return self._items.count(item)
- *
- * def __repr__(self): # <<<<<<<<<<<<<<
- * return ''.format(self.frozen,
- * self._items)
- */
-
- /* function exit code */
- __pyx_L1_error:;
- __Pyx_XDECREF(__pyx_t_1);
- __Pyx_XDECREF(__pyx_t_2);
- __Pyx_XDECREF(__pyx_t_3);
- __Pyx_XDECREF(__pyx_t_4);
- __Pyx_XDECREF(__pyx_t_6);
- __Pyx_AddTraceback("frozenlist._frozenlist.FrozenList.__repr__", __pyx_clineno, __pyx_lineno, __pyx_filename);
- __pyx_r = NULL;
- __pyx_L0:;
- __Pyx_XGIVEREF(__pyx_r);
- __Pyx_RefNannyFinishContext();
- return __pyx_r;
-}
-
-/* "frozenlist/_frozenlist.pyx":107
- * self._items)
- *
- * def __hash__(self): # <<<<<<<<<<<<<<
- * if self.frozen:
- * return hash(tuple(self._items))
- */
-
-/* Python wrapper */
-static Py_hash_t __pyx_pw_10frozenlist_11_frozenlist_10FrozenList_43__hash__(PyObject *__pyx_v_self); /*proto*/
-static Py_hash_t __pyx_pw_10frozenlist_11_frozenlist_10FrozenList_43__hash__(PyObject *__pyx_v_self) {
- Py_hash_t __pyx_r;
- __Pyx_RefNannyDeclarations
- __Pyx_RefNannySetupContext("__hash__ (wrapper)", 0);
- __pyx_r = __pyx_pf_10frozenlist_11_frozenlist_10FrozenList_42__hash__(((struct __pyx_obj_10frozenlist_11_frozenlist_FrozenList *)__pyx_v_self));
-
- /* function exit code */
- __Pyx_RefNannyFinishContext();
- return __pyx_r;
-}
-
-static Py_hash_t __pyx_pf_10frozenlist_11_frozenlist_10FrozenList_42__hash__(struct __pyx_obj_10frozenlist_11_frozenlist_FrozenList *__pyx_v_self) {
- Py_hash_t __pyx_r;
- __Pyx_RefNannyDeclarations
- int __pyx_t_1;
- PyObject *__pyx_t_2 = NULL;
- Py_hash_t __pyx_t_3;
- int __pyx_lineno = 0;
- const char *__pyx_filename = NULL;
- int __pyx_clineno = 0;
- __Pyx_RefNannySetupContext("__hash__", 0);
-
- /* "frozenlist/_frozenlist.pyx":108
- *
- * def __hash__(self):
- * if self.frozen: # <<<<<<<<<<<<<<
- * return hash(tuple(self._items))
- * else:
- */
- __pyx_t_1 = (__pyx_v_self->frozen != 0);
- if (likely(__pyx_t_1)) {
-
- /* "frozenlist/_frozenlist.pyx":109
- * def __hash__(self):
- * if self.frozen:
- * return hash(tuple(self._items)) # <<<<<<<<<<<<<<
- * else:
- * raise RuntimeError("Cannot hash unfrozen list.")
- */
- if (unlikely(__pyx_v_self->_items == Py_None)) {
- PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable");
- __PYX_ERR(0, 109, __pyx_L1_error)
- }
- __pyx_t_2 = PyList_AsTuple(__pyx_v_self->_items); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 109, __pyx_L1_error)
- __Pyx_GOTREF(__pyx_t_2);
- __pyx_t_3 = PyObject_Hash(__pyx_t_2); if (unlikely(__pyx_t_3 == ((Py_hash_t)-1))) __PYX_ERR(0, 109, __pyx_L1_error)
- __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
- __pyx_r = __pyx_t_3;
- goto __pyx_L0;
-
- /* "frozenlist/_frozenlist.pyx":108
- *
- * def __hash__(self):
- * if self.frozen: # <<<<<<<<<<<<<<
- * return hash(tuple(self._items))
- * else:
- */
- }
-
- /* "frozenlist/_frozenlist.pyx":111
- * return hash(tuple(self._items))
- * else:
- * raise RuntimeError("Cannot hash unfrozen list.") # <<<<<<<<<<<<<<
- *
- *
- */
- /*else*/ {
- __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_RuntimeError, __pyx_tuple__2, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 111, __pyx_L1_error)
- __Pyx_GOTREF(__pyx_t_2);
- __Pyx_Raise(__pyx_t_2, 0, 0, 0);
- __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
- __PYX_ERR(0, 111, __pyx_L1_error)
- }
-
- /* "frozenlist/_frozenlist.pyx":107
- * self._items)
- *
- * def __hash__(self): # <<<<<<<<<<<<<<
- * if self.frozen:
- * return hash(tuple(self._items))
- */
-
- /* function exit code */
- __pyx_L1_error:;
- __Pyx_XDECREF(__pyx_t_2);
- __Pyx_AddTraceback("frozenlist._frozenlist.FrozenList.__hash__", __pyx_clineno, __pyx_lineno, __pyx_filename);
- __pyx_r = -1;
- __pyx_L0:;
- if (unlikely(__pyx_r == -1) && !PyErr_Occurred()) __pyx_r = -2;
- __Pyx_RefNannyFinishContext();
- return __pyx_r;
-}
-
-/* "frozenlist/_frozenlist.pyx":6
- * cdef class FrozenList:
- *
- * cdef readonly bint frozen # <<<<<<<<<<<<<<
- * cdef list _items
- *
- */
-
-/* Python wrapper */
-static PyObject *__pyx_pw_10frozenlist_11_frozenlist_10FrozenList_6frozen_1__get__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pw_10frozenlist_11_frozenlist_10FrozenList_6frozen_1__get__(PyObject *__pyx_v_self) {
- PyObject *__pyx_r = 0;
- __Pyx_RefNannyDeclarations
- __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
- __pyx_r = __pyx_pf_10frozenlist_11_frozenlist_10FrozenList_6frozen___get__(((struct __pyx_obj_10frozenlist_11_frozenlist_FrozenList *)__pyx_v_self));
-
- /* function exit code */
- __Pyx_RefNannyFinishContext();
- return __pyx_r;
-}
-
-static PyObject *__pyx_pf_10frozenlist_11_frozenlist_10FrozenList_6frozen___get__(struct __pyx_obj_10frozenlist_11_frozenlist_FrozenList *__pyx_v_self) {
- PyObject *__pyx_r = NULL;
- __Pyx_RefNannyDeclarations
- PyObject *__pyx_t_1 = NULL;
- int __pyx_lineno = 0;
- const char *__pyx_filename = NULL;
- int __pyx_clineno = 0;
- __Pyx_RefNannySetupContext("__get__", 0);
- __Pyx_XDECREF(__pyx_r);
- __pyx_t_1 = __Pyx_PyBool_FromLong(__pyx_v_self->frozen); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 6, __pyx_L1_error)
- __Pyx_GOTREF(__pyx_t_1);
- __pyx_r = __pyx_t_1;
- __pyx_t_1 = 0;
- goto __pyx_L0;
-
- /* function exit code */
- __pyx_L1_error:;
- __Pyx_XDECREF(__pyx_t_1);
- __Pyx_AddTraceback("frozenlist._frozenlist.FrozenList.frozen.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
- __pyx_r = NULL;
- __pyx_L0:;
- __Pyx_XGIVEREF(__pyx_r);
- __Pyx_RefNannyFinishContext();
- return __pyx_r;
-}
-
-/* "(tree fragment)":1
- * def __reduce_cython__(self): # <<<<<<<<<<<<<<
- * cdef tuple state
- * cdef object _dict
- */
-
-/* Python wrapper */
-static PyObject *__pyx_pw_10frozenlist_11_frozenlist_10FrozenList_45__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
-static PyObject *__pyx_pw_10frozenlist_11_frozenlist_10FrozenList_45__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
- PyObject *__pyx_r = 0;
- __Pyx_RefNannyDeclarations
- __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0);
- __pyx_r = __pyx_pf_10frozenlist_11_frozenlist_10FrozenList_44__reduce_cython__(((struct __pyx_obj_10frozenlist_11_frozenlist_FrozenList *)__pyx_v_self));
-
- /* function exit code */
- __Pyx_RefNannyFinishContext();
- return __pyx_r;
-}
-
-static PyObject *__pyx_pf_10frozenlist_11_frozenlist_10FrozenList_44__reduce_cython__(struct __pyx_obj_10frozenlist_11_frozenlist_FrozenList *__pyx_v_self) {
- PyObject *__pyx_v_state = 0;
- PyObject *__pyx_v__dict = 0;
- int __pyx_v_use_setstate;
- PyObject *__pyx_r = NULL;
- __Pyx_RefNannyDeclarations
- PyObject *__pyx_t_1 = NULL;
- PyObject *__pyx_t_2 = NULL;
- int __pyx_t_3;
- int __pyx_t_4;
- PyObject *__pyx_t_5 = NULL;
- int __pyx_lineno = 0;
- const char *__pyx_filename = NULL;
- int __pyx_clineno = 0;
- __Pyx_RefNannySetupContext("__reduce_cython__", 0);
-
- /* "(tree fragment)":5
- * cdef object _dict
- * cdef bint use_setstate
- * state = (self._items, self.frozen) # <<<<<<<<<<<<<<
- * _dict = getattr(self, '__dict__', None)
- * if _dict is not None:
- */
- __pyx_t_1 = __Pyx_PyBool_FromLong(__pyx_v_self->frozen); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 5, __pyx_L1_error)
- __Pyx_GOTREF(__pyx_t_1);
- __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 5, __pyx_L1_error)
- __Pyx_GOTREF(__pyx_t_2);
- __Pyx_INCREF(__pyx_v_self->_items);
- __Pyx_GIVEREF(__pyx_v_self->_items);
- PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_self->_items);
- __Pyx_GIVEREF(__pyx_t_1);
- PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_1);
- __pyx_t_1 = 0;
- __pyx_v_state = ((PyObject*)__pyx_t_2);
- __pyx_t_2 = 0;
-
- /* "(tree fragment)":6
- * cdef bint use_setstate
- * state = (self._items, self.frozen)
- * _dict = getattr(self, '__dict__', None) # <<<<<<<<<<<<<<
- * if _dict is not None:
- * state += (_dict,)
- */
- __pyx_t_2 = __Pyx_GetAttr3(((PyObject *)__pyx_v_self), __pyx_n_s_dict, Py_None); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 6, __pyx_L1_error)
- __Pyx_GOTREF(__pyx_t_2);
- __pyx_v__dict = __pyx_t_2;
- __pyx_t_2 = 0;
-
- /* "(tree fragment)":7
- * state = (self._items, self.frozen)
- * _dict = getattr(self, '__dict__', None)
- * if _dict is not None: # <<<<<<<<<<<<<<
- * state += (_dict,)
- * use_setstate = True
- */
- __pyx_t_3 = (__pyx_v__dict != Py_None);
- __pyx_t_4 = (__pyx_t_3 != 0);
- if (__pyx_t_4) {
-
- /* "(tree fragment)":8
- * _dict = getattr(self, '__dict__', None)
- * if _dict is not None:
- * state += (_dict,) # <<<<<<<<<<<<<<
- * use_setstate = True
- * else:
- */
- __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 8, __pyx_L1_error)
- __Pyx_GOTREF(__pyx_t_2);
- __Pyx_INCREF(__pyx_v__dict);
- __Pyx_GIVEREF(__pyx_v__dict);
- PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v__dict);
- __pyx_t_1 = PyNumber_InPlaceAdd(__pyx_v_state, __pyx_t_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 8, __pyx_L1_error)
- __Pyx_GOTREF(__pyx_t_1);
- __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
- __Pyx_DECREF_SET(__pyx_v_state, ((PyObject*)__pyx_t_1));
- __pyx_t_1 = 0;
-
- /* "(tree fragment)":9
- * if _dict is not None:
- * state += (_dict,)
- * use_setstate = True # <<<<<<<<<<<<<<
- * else:
- * use_setstate = self._items is not None
- */
- __pyx_v_use_setstate = 1;
-
- /* "(tree fragment)":7
- * state = (self._items, self.frozen)
- * _dict = getattr(self, '__dict__', None)
- * if _dict is not None: # <<<<<<<<<<<<<<
- * state += (_dict,)
- * use_setstate = True
- */
- goto __pyx_L3;
- }
-
- /* "(tree fragment)":11
- * use_setstate = True
- * else:
- * use_setstate = self._items is not None # <<<<<<<<<<<<<<
- * if use_setstate:
- * return __pyx_unpickle_FrozenList, (type(self), 0x949a143, None), state
- */
- /*else*/ {
- __pyx_t_4 = (__pyx_v_self->_items != ((PyObject*)Py_None));
- __pyx_v_use_setstate = __pyx_t_4;
- }
- __pyx_L3:;
-
- /* "(tree fragment)":12
- * else:
- * use_setstate = self._items is not None
- * if use_setstate: # <<<<<<<<<<<<<<
- * return __pyx_unpickle_FrozenList, (type(self), 0x949a143, None), state
- * else:
- */
- __pyx_t_4 = (__pyx_v_use_setstate != 0);
- if (__pyx_t_4) {
-
- /* "(tree fragment)":13
- * use_setstate = self._items is not None
- * if use_setstate:
- * return __pyx_unpickle_FrozenList, (type(self), 0x949a143, None), state # <<<<<<<<<<<<<<
- * else:
- * return __pyx_unpickle_FrozenList, (type(self), 0x949a143, state)
- */
- __Pyx_XDECREF(__pyx_r);
- __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_pyx_unpickle_FrozenList); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 13, __pyx_L1_error)
- __Pyx_GOTREF(__pyx_t_1);
- __pyx_t_2 = PyTuple_New(3); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 13, __pyx_L1_error)
- __Pyx_GOTREF(__pyx_t_2);
- __Pyx_INCREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self))));
- __Pyx_GIVEREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self))));
- PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self))));
- __Pyx_INCREF(__pyx_int_155820355);
- __Pyx_GIVEREF(__pyx_int_155820355);
- PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_int_155820355);
- __Pyx_INCREF(Py_None);
- __Pyx_GIVEREF(Py_None);
- PyTuple_SET_ITEM(__pyx_t_2, 2, Py_None);
- __pyx_t_5 = PyTuple_New(3); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 13, __pyx_L1_error)
- __Pyx_GOTREF(__pyx_t_5);
- __Pyx_GIVEREF(__pyx_t_1);
- PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_1);
- __Pyx_GIVEREF(__pyx_t_2);
- PyTuple_SET_ITEM(__pyx_t_5, 1, __pyx_t_2);
- __Pyx_INCREF(__pyx_v_state);
- __Pyx_GIVEREF(__pyx_v_state);
- PyTuple_SET_ITEM(__pyx_t_5, 2, __pyx_v_state);
- __pyx_t_1 = 0;
- __pyx_t_2 = 0;
- __pyx_r = __pyx_t_5;
- __pyx_t_5 = 0;
- goto __pyx_L0;
-
- /* "(tree fragment)":12
- * else:
- * use_setstate = self._items is not None
- * if use_setstate: # <<<<<<<<<<<<<<
- * return __pyx_unpickle_FrozenList, (type(self), 0x949a143, None), state
- * else:
- */
- }
-
- /* "(tree fragment)":15
- * return __pyx_unpickle_FrozenList, (type(self), 0x949a143, None), state
- * else:
- * return __pyx_unpickle_FrozenList, (type(self), 0x949a143, state) # <<<<<<<<<<<<<<
- * def __setstate_cython__(self, __pyx_state):
- * __pyx_unpickle_FrozenList__set_state(self, __pyx_state)
- */
- /*else*/ {
- __Pyx_XDECREF(__pyx_r);
- __Pyx_GetModuleGlobalName(__pyx_t_5, __pyx_n_s_pyx_unpickle_FrozenList); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 15, __pyx_L1_error)
- __Pyx_GOTREF(__pyx_t_5);
- __pyx_t_2 = PyTuple_New(3); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 15, __pyx_L1_error)
- __Pyx_GOTREF(__pyx_t_2);
- __Pyx_INCREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self))));
- __Pyx_GIVEREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self))));
- PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self))));
- __Pyx_INCREF(__pyx_int_155820355);
- __Pyx_GIVEREF(__pyx_int_155820355);
- PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_int_155820355);
- __Pyx_INCREF(__pyx_v_state);
- __Pyx_GIVEREF(__pyx_v_state);
- PyTuple_SET_ITEM(__pyx_t_2, 2, __pyx_v_state);
- __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 15, __pyx_L1_error)
- __Pyx_GOTREF(__pyx_t_1);
- __Pyx_GIVEREF(__pyx_t_5);
- PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_5);
- __Pyx_GIVEREF(__pyx_t_2);
- PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_t_2);
- __pyx_t_5 = 0;
- __pyx_t_2 = 0;
- __pyx_r = __pyx_t_1;
- __pyx_t_1 = 0;
- goto __pyx_L0;
- }
-
- /* "(tree fragment)":1
- * def __reduce_cython__(self): # <<<<<<<<<<<<<<
- * cdef tuple state
- * cdef object _dict
- */
-
- /* function exit code */
- __pyx_L1_error:;
- __Pyx_XDECREF(__pyx_t_1);
- __Pyx_XDECREF(__pyx_t_2);
- __Pyx_XDECREF(__pyx_t_5);
- __Pyx_AddTraceback("frozenlist._frozenlist.FrozenList.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
- __pyx_r = NULL;
- __pyx_L0:;
- __Pyx_XDECREF(__pyx_v_state);
- __Pyx_XDECREF(__pyx_v__dict);
- __Pyx_XGIVEREF(__pyx_r);
- __Pyx_RefNannyFinishContext();
- return __pyx_r;
-}
-
-/* "(tree fragment)":16
- * else:
- * return __pyx_unpickle_FrozenList, (type(self), 0x949a143, state)
- * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<<
- * __pyx_unpickle_FrozenList__set_state(self, __pyx_state)
- */
-
-/* Python wrapper */
-static PyObject *__pyx_pw_10frozenlist_11_frozenlist_10FrozenList_47__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state); /*proto*/
-static PyObject *__pyx_pw_10frozenlist_11_frozenlist_10FrozenList_47__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state) {
- PyObject *__pyx_r = 0;
- __Pyx_RefNannyDeclarations
- __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0);
- __pyx_r = __pyx_pf_10frozenlist_11_frozenlist_10FrozenList_46__setstate_cython__(((struct __pyx_obj_10frozenlist_11_frozenlist_FrozenList *)__pyx_v_self), ((PyObject *)__pyx_v___pyx_state));
-
- /* function exit code */
- __Pyx_RefNannyFinishContext();
- return __pyx_r;
-}
-
-static PyObject *__pyx_pf_10frozenlist_11_frozenlist_10FrozenList_46__setstate_cython__(struct __pyx_obj_10frozenlist_11_frozenlist_FrozenList *__pyx_v_self, PyObject *__pyx_v___pyx_state) {
- PyObject *__pyx_r = NULL;
- __Pyx_RefNannyDeclarations
- PyObject *__pyx_t_1 = NULL;
- int __pyx_lineno = 0;
- const char *__pyx_filename = NULL;
- int __pyx_clineno = 0;
- __Pyx_RefNannySetupContext("__setstate_cython__", 0);
-
- /* "(tree fragment)":17
- * return __pyx_unpickle_FrozenList, (type(self), 0x949a143, state)
- * def __setstate_cython__(self, __pyx_state):
- * __pyx_unpickle_FrozenList__set_state(self, __pyx_state) # <<<<<<<<<<<<<<
- */
- if (!(likely(PyTuple_CheckExact(__pyx_v___pyx_state))||((__pyx_v___pyx_state) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "tuple", Py_TYPE(__pyx_v___pyx_state)->tp_name), 0))) __PYX_ERR(1, 17, __pyx_L1_error)
- __pyx_t_1 = __pyx_f_10frozenlist_11_frozenlist___pyx_unpickle_FrozenList__set_state(__pyx_v_self, ((PyObject*)__pyx_v___pyx_state)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 17, __pyx_L1_error)
- __Pyx_GOTREF(__pyx_t_1);
- __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-
- /* "(tree fragment)":16
- * else:
- * return __pyx_unpickle_FrozenList, (type(self), 0x949a143, state)
- * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<<
- * __pyx_unpickle_FrozenList__set_state(self, __pyx_state)
- */
-
- /* function exit code */
- __pyx_r = Py_None; __Pyx_INCREF(Py_None);
- goto __pyx_L0;
- __pyx_L1_error:;
- __Pyx_XDECREF(__pyx_t_1);
- __Pyx_AddTraceback("frozenlist._frozenlist.FrozenList.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
- __pyx_r = NULL;
- __pyx_L0:;
- __Pyx_XGIVEREF(__pyx_r);
- __Pyx_RefNannyFinishContext();
- return __pyx_r;
-}
-
-/* "(tree fragment)":1
- * def __pyx_unpickle_FrozenList(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<<
- * cdef object __pyx_PickleError
- * cdef object __pyx_result
- */
-
-/* Python wrapper */
-static PyObject *__pyx_pw_10frozenlist_11_frozenlist_1__pyx_unpickle_FrozenList(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyMethodDef __pyx_mdef_10frozenlist_11_frozenlist_1__pyx_unpickle_FrozenList = {"__pyx_unpickle_FrozenList", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_10frozenlist_11_frozenlist_1__pyx_unpickle_FrozenList, METH_VARARGS|METH_KEYWORDS, 0};
-static PyObject *__pyx_pw_10frozenlist_11_frozenlist_1__pyx_unpickle_FrozenList(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
- PyObject *__pyx_v___pyx_type = 0;
- long __pyx_v___pyx_checksum;
- PyObject *__pyx_v___pyx_state = 0;
- int __pyx_lineno = 0;
- const char *__pyx_filename = NULL;
- int __pyx_clineno = 0;
- PyObject *__pyx_r = 0;
- __Pyx_RefNannyDeclarations
- __Pyx_RefNannySetupContext("__pyx_unpickle_FrozenList (wrapper)", 0);
- {
- static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_type,&__pyx_n_s_pyx_checksum,&__pyx_n_s_pyx_state,0};
- PyObject* values[3] = {0,0,0};
- if (unlikely(__pyx_kwds)) {
- Py_ssize_t kw_args;
- const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
- switch (pos_args) {
- case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
- CYTHON_FALLTHROUGH;
- case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
- CYTHON_FALLTHROUGH;
- case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
- CYTHON_FALLTHROUGH;
- case 0: break;
- default: goto __pyx_L5_argtuple_error;
- }
- kw_args = PyDict_Size(__pyx_kwds);
- switch (pos_args) {
- case 0:
- if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_pyx_type)) != 0)) kw_args--;
- else goto __pyx_L5_argtuple_error;
- CYTHON_FALLTHROUGH;
- case 1:
- if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_pyx_checksum)) != 0)) kw_args--;
- else {
- __Pyx_RaiseArgtupleInvalid("__pyx_unpickle_FrozenList", 1, 3, 3, 1); __PYX_ERR(1, 1, __pyx_L3_error)
- }
- CYTHON_FALLTHROUGH;
- case 2:
- if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_pyx_state)) != 0)) kw_args--;
- else {
- __Pyx_RaiseArgtupleInvalid("__pyx_unpickle_FrozenList", 1, 3, 3, 2); __PYX_ERR(1, 1, __pyx_L3_error)
- }
- }
- if (unlikely(kw_args > 0)) {
- if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__pyx_unpickle_FrozenList") < 0)) __PYX_ERR(1, 1, __pyx_L3_error)
- }
- } else if (PyTuple_GET_SIZE(__pyx_args) != 3) {
- goto __pyx_L5_argtuple_error;
- } else {
- values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
- values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
- values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
- }
- __pyx_v___pyx_type = values[0];
- __pyx_v___pyx_checksum = __Pyx_PyInt_As_long(values[1]); if (unlikely((__pyx_v___pyx_checksum == (long)-1) && PyErr_Occurred())) __PYX_ERR(1, 1, __pyx_L3_error)
- __pyx_v___pyx_state = values[2];
- }
- goto __pyx_L4_argument_unpacking_done;
- __pyx_L5_argtuple_error:;
- __Pyx_RaiseArgtupleInvalid("__pyx_unpickle_FrozenList", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(1, 1, __pyx_L3_error)
- __pyx_L3_error:;
- __Pyx_AddTraceback("frozenlist._frozenlist.__pyx_unpickle_FrozenList", __pyx_clineno, __pyx_lineno, __pyx_filename);
- __Pyx_RefNannyFinishContext();
- return NULL;
- __pyx_L4_argument_unpacking_done:;
- __pyx_r = __pyx_pf_10frozenlist_11_frozenlist___pyx_unpickle_FrozenList(__pyx_self, __pyx_v___pyx_type, __pyx_v___pyx_checksum, __pyx_v___pyx_state);
-
- /* function exit code */
- __Pyx_RefNannyFinishContext();
- return __pyx_r;
-}
-
-static PyObject *__pyx_pf_10frozenlist_11_frozenlist___pyx_unpickle_FrozenList(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v___pyx_type, long __pyx_v___pyx_checksum, PyObject *__pyx_v___pyx_state) {
- PyObject *__pyx_v___pyx_PickleError = 0;
- PyObject *__pyx_v___pyx_result = 0;
- PyObject *__pyx_r = NULL;
- __Pyx_RefNannyDeclarations
- int __pyx_t_1;
- PyObject *__pyx_t_2 = NULL;
- PyObject *__pyx_t_3 = NULL;
- PyObject *__pyx_t_4 = NULL;
- PyObject *__pyx_t_5 = NULL;
- int __pyx_t_6;
- int __pyx_lineno = 0;
- const char *__pyx_filename = NULL;
- int __pyx_clineno = 0;
- __Pyx_RefNannySetupContext("__pyx_unpickle_FrozenList", 0);
-
- /* "(tree fragment)":4
- * cdef object __pyx_PickleError
- * cdef object __pyx_result
- * if __pyx_checksum != 0x949a143: # <<<<<<<<<<<<<<
- * from pickle import PickleError as __pyx_PickleError
- * raise __pyx_PickleError("Incompatible checksums (%s vs 0x949a143 = (_items, frozen))" % __pyx_checksum)
- */
- __pyx_t_1 = ((__pyx_v___pyx_checksum != 0x949a143) != 0);
- if (__pyx_t_1) {
-
- /* "(tree fragment)":5
- * cdef object __pyx_result
- * if __pyx_checksum != 0x949a143:
- * from pickle import PickleError as __pyx_PickleError # <<<<<<<<<<<<<<
- * raise __pyx_PickleError("Incompatible checksums (%s vs 0x949a143 = (_items, frozen))" % __pyx_checksum)
- * __pyx_result = FrozenList.__new__(__pyx_type)
- */
- __pyx_t_2 = PyList_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 5, __pyx_L1_error)
- __Pyx_GOTREF(__pyx_t_2);
- __Pyx_INCREF(__pyx_n_s_PickleError);
- __Pyx_GIVEREF(__pyx_n_s_PickleError);
- PyList_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_PickleError);
- __pyx_t_3 = __Pyx_Import(__pyx_n_s_pickle, __pyx_t_2, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 5, __pyx_L1_error)
- __Pyx_GOTREF(__pyx_t_3);
- __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
- __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_PickleError); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 5, __pyx_L1_error)
- __Pyx_GOTREF(__pyx_t_2);
- __Pyx_INCREF(__pyx_t_2);
- __pyx_v___pyx_PickleError = __pyx_t_2;
- __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
- __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-
- /* "(tree fragment)":6
- * if __pyx_checksum != 0x949a143:
- * from pickle import PickleError as __pyx_PickleError
- * raise __pyx_PickleError("Incompatible checksums (%s vs 0x949a143 = (_items, frozen))" % __pyx_checksum) # <<<<<<<<<<<<<<
- * __pyx_result = FrozenList.__new__(__pyx_type)
- * if __pyx_state is not None:
- */
- __pyx_t_2 = __Pyx_PyInt_From_long(__pyx_v___pyx_checksum); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 6, __pyx_L1_error)
- __Pyx_GOTREF(__pyx_t_2);
- __pyx_t_4 = __Pyx_PyString_Format(__pyx_kp_s_Incompatible_checksums_s_vs_0x94, __pyx_t_2); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 6, __pyx_L1_error)
- __Pyx_GOTREF(__pyx_t_4);
- __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
- __Pyx_INCREF(__pyx_v___pyx_PickleError);
- __pyx_t_2 = __pyx_v___pyx_PickleError; __pyx_t_5 = NULL;
- if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_2))) {
- __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_2);
- if (likely(__pyx_t_5)) {
- PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
- __Pyx_INCREF(__pyx_t_5);
- __Pyx_INCREF(function);
- __Pyx_DECREF_SET(__pyx_t_2, function);
- }
- }
- __pyx_t_3 = (__pyx_t_5) ? __Pyx_PyObject_Call2Args(__pyx_t_2, __pyx_t_5, __pyx_t_4) : __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_4);
- __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
- __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
- if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 6, __pyx_L1_error)
- __Pyx_GOTREF(__pyx_t_3);
- __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
- __Pyx_Raise(__pyx_t_3, 0, 0, 0);
- __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
- __PYX_ERR(1, 6, __pyx_L1_error)
-
- /* "(tree fragment)":4
- * cdef object __pyx_PickleError
- * cdef object __pyx_result
- * if __pyx_checksum != 0x949a143: # <<<<<<<<<<<<<<
- * from pickle import PickleError as __pyx_PickleError
- * raise __pyx_PickleError("Incompatible checksums (%s vs 0x949a143 = (_items, frozen))" % __pyx_checksum)
- */
- }
-
- /* "(tree fragment)":7
- * from pickle import PickleError as __pyx_PickleError
- * raise __pyx_PickleError("Incompatible checksums (%s vs 0x949a143 = (_items, frozen))" % __pyx_checksum)
- * __pyx_result = FrozenList.__new__(__pyx_type) # <<<<<<<<<<<<<<
- * if __pyx_state is not None:
- * __pyx_unpickle_FrozenList__set_state( __pyx_result, __pyx_state)
- */
- __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_ptype_10frozenlist_11_frozenlist_FrozenList), __pyx_n_s_new); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 7, __pyx_L1_error)
- __Pyx_GOTREF(__pyx_t_2);
- __pyx_t_4 = NULL;
- if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_2))) {
- __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_2);
- if (likely(__pyx_t_4)) {
- PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
- __Pyx_INCREF(__pyx_t_4);
- __Pyx_INCREF(function);
- __Pyx_DECREF_SET(__pyx_t_2, function);
- }
- }
- __pyx_t_3 = (__pyx_t_4) ? __Pyx_PyObject_Call2Args(__pyx_t_2, __pyx_t_4, __pyx_v___pyx_type) : __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_v___pyx_type);
- __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
- if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 7, __pyx_L1_error)
- __Pyx_GOTREF(__pyx_t_3);
- __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
- __pyx_v___pyx_result = __pyx_t_3;
- __pyx_t_3 = 0;
-
- /* "(tree fragment)":8
- * raise __pyx_PickleError("Incompatible checksums (%s vs 0x949a143 = (_items, frozen))" % __pyx_checksum)
- * __pyx_result = FrozenList.__new__(__pyx_type)
- * if __pyx_state is not None: # <<<<<<<<<<<<<<
- * __pyx_unpickle_FrozenList__set_state( __pyx_result, __pyx_state)
- * return __pyx_result
- */
- __pyx_t_1 = (__pyx_v___pyx_state != Py_None);
- __pyx_t_6 = (__pyx_t_1 != 0);
- if (__pyx_t_6) {
-
- /* "(tree fragment)":9
- * __pyx_result = FrozenList.__new__(__pyx_type)
- * if __pyx_state is not None:
- * __pyx_unpickle_FrozenList__set_state( __pyx_result, __pyx_state) # <<<<<<<<<<<<<<
- * return __pyx_result
- * cdef __pyx_unpickle_FrozenList__set_state(FrozenList __pyx_result, tuple __pyx_state):
- */
- if (!(likely(PyTuple_CheckExact(__pyx_v___pyx_state))||((__pyx_v___pyx_state) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "tuple", Py_TYPE(__pyx_v___pyx_state)->tp_name), 0))) __PYX_ERR(1, 9, __pyx_L1_error)
- __pyx_t_3 = __pyx_f_10frozenlist_11_frozenlist___pyx_unpickle_FrozenList__set_state(((struct __pyx_obj_10frozenlist_11_frozenlist_FrozenList *)__pyx_v___pyx_result), ((PyObject*)__pyx_v___pyx_state)); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 9, __pyx_L1_error)
- __Pyx_GOTREF(__pyx_t_3);
- __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-
- /* "(tree fragment)":8
- * raise __pyx_PickleError("Incompatible checksums (%s vs 0x949a143 = (_items, frozen))" % __pyx_checksum)
- * __pyx_result = FrozenList.__new__(__pyx_type)
- * if __pyx_state is not None: # <<<<<<<<<<<<<<
- * __pyx_unpickle_FrozenList__set_state( __pyx_result, __pyx_state)
- * return __pyx_result
- */
- }
-
- /* "(tree fragment)":10
- * if __pyx_state is not None:
- * __pyx_unpickle_FrozenList__set_state( __pyx_result, __pyx_state)
- * return __pyx_result # <<<<<<<<<<<<<<
- * cdef __pyx_unpickle_FrozenList__set_state(FrozenList __pyx_result, tuple __pyx_state):
- * __pyx_result._items = __pyx_state[0]; __pyx_result.frozen = __pyx_state[1]
- */
- __Pyx_XDECREF(__pyx_r);
- __Pyx_INCREF(__pyx_v___pyx_result);
- __pyx_r = __pyx_v___pyx_result;
- goto __pyx_L0;
-
- /* "(tree fragment)":1
- * def __pyx_unpickle_FrozenList(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<<
- * cdef object __pyx_PickleError
- * cdef object __pyx_result
- */
-
- /* function exit code */
- __pyx_L1_error:;
- __Pyx_XDECREF(__pyx_t_2);
- __Pyx_XDECREF(__pyx_t_3);
- __Pyx_XDECREF(__pyx_t_4);
- __Pyx_XDECREF(__pyx_t_5);
- __Pyx_AddTraceback("frozenlist._frozenlist.__pyx_unpickle_FrozenList", __pyx_clineno, __pyx_lineno, __pyx_filename);
- __pyx_r = NULL;
- __pyx_L0:;
- __Pyx_XDECREF(__pyx_v___pyx_PickleError);
- __Pyx_XDECREF(__pyx_v___pyx_result);
- __Pyx_XGIVEREF(__pyx_r);
- __Pyx_RefNannyFinishContext();
- return __pyx_r;
-}
-
-/* "(tree fragment)":11
- * __pyx_unpickle_FrozenList__set_state( __pyx_result, __pyx_state)
- * return __pyx_result
- * cdef __pyx_unpickle_FrozenList__set_state(FrozenList __pyx_result, tuple __pyx_state): # <<<<<<<<<<<<<<
- * __pyx_result._items = __pyx_state[0]; __pyx_result.frozen = __pyx_state[1]
- * if len(__pyx_state) > 2 and hasattr(__pyx_result, '__dict__'):
- */
-
-static PyObject *__pyx_f_10frozenlist_11_frozenlist___pyx_unpickle_FrozenList__set_state(struct __pyx_obj_10frozenlist_11_frozenlist_FrozenList *__pyx_v___pyx_result, PyObject *__pyx_v___pyx_state) {
- PyObject *__pyx_r = NULL;
- __Pyx_RefNannyDeclarations
- PyObject *__pyx_t_1 = NULL;
- int __pyx_t_2;
- Py_ssize_t __pyx_t_3;
- int __pyx_t_4;
- int __pyx_t_5;
- PyObject *__pyx_t_6 = NULL;
- PyObject *__pyx_t_7 = NULL;
- PyObject *__pyx_t_8 = NULL;
- int __pyx_lineno = 0;
- const char *__pyx_filename = NULL;
- int __pyx_clineno = 0;
- __Pyx_RefNannySetupContext("__pyx_unpickle_FrozenList__set_state", 0);
-
- /* "(tree fragment)":12
- * return __pyx_result
- * cdef __pyx_unpickle_FrozenList__set_state(FrozenList __pyx_result, tuple __pyx_state):
- * __pyx_result._items = __pyx_state[0]; __pyx_result.frozen = __pyx_state[1] # <<<<<<<<<<<<<<
- * if len(__pyx_state) > 2 and hasattr(__pyx_result, '__dict__'):
- * __pyx_result.__dict__.update(__pyx_state[2])
- */
- if (unlikely(__pyx_v___pyx_state == Py_None)) {
- PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
- __PYX_ERR(1, 12, __pyx_L1_error)
- }
- __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error)
- __Pyx_GOTREF(__pyx_t_1);
- if (!(likely(PyList_CheckExact(__pyx_t_1))||((__pyx_t_1) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "list", Py_TYPE(__pyx_t_1)->tp_name), 0))) __PYX_ERR(1, 12, __pyx_L1_error)
- __Pyx_GIVEREF(__pyx_t_1);
- __Pyx_GOTREF(__pyx_v___pyx_result->_items);
- __Pyx_DECREF(__pyx_v___pyx_result->_items);
- __pyx_v___pyx_result->_items = ((PyObject*)__pyx_t_1);
- __pyx_t_1 = 0;
- if (unlikely(__pyx_v___pyx_state == Py_None)) {
- PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
- __PYX_ERR(1, 12, __pyx_L1_error)
- }
- __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error)
- __Pyx_GOTREF(__pyx_t_1);
- __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely((__pyx_t_2 == (int)-1) && PyErr_Occurred())) __PYX_ERR(1, 12, __pyx_L1_error)
- __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
- __pyx_v___pyx_result->frozen = __pyx_t_2;
-
- /* "(tree fragment)":13
- * cdef __pyx_unpickle_FrozenList__set_state(FrozenList __pyx_result, tuple __pyx_state):
- * __pyx_result._items = __pyx_state[0]; __pyx_result.frozen = __pyx_state[1]
- * if len(__pyx_state) > 2 and hasattr(__pyx_result, '__dict__'): # <<<<<<<<<<<<<<
- * __pyx_result.__dict__.update(__pyx_state[2])
- */
- if (unlikely(__pyx_v___pyx_state == Py_None)) {
- PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()");
- __PYX_ERR(1, 13, __pyx_L1_error)
- }
- __pyx_t_3 = PyTuple_GET_SIZE(__pyx_v___pyx_state); if (unlikely(__pyx_t_3 == ((Py_ssize_t)-1))) __PYX_ERR(1, 13, __pyx_L1_error)
- __pyx_t_4 = ((__pyx_t_3 > 2) != 0);
- if (__pyx_t_4) {
- } else {
- __pyx_t_2 = __pyx_t_4;
- goto __pyx_L4_bool_binop_done;
- }
- __pyx_t_4 = __Pyx_HasAttr(((PyObject *)__pyx_v___pyx_result), __pyx_n_s_dict); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(1, 13, __pyx_L1_error)
- __pyx_t_5 = (__pyx_t_4 != 0);
- __pyx_t_2 = __pyx_t_5;
- __pyx_L4_bool_binop_done:;
- if (__pyx_t_2) {
-
- /* "(tree fragment)":14
- * __pyx_result._items = __pyx_state[0]; __pyx_result.frozen = __pyx_state[1]
- * if len(__pyx_state) > 2 and hasattr(__pyx_result, '__dict__'):
- * __pyx_result.__dict__.update(__pyx_state[2]) # <<<<<<<<<<<<<<
- */
- __pyx_t_6 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v___pyx_result), __pyx_n_s_dict); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 14, __pyx_L1_error)
- __Pyx_GOTREF(__pyx_t_6);
- __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_update); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 14, __pyx_L1_error)
- __Pyx_GOTREF(__pyx_t_7);
- __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
- if (unlikely(__pyx_v___pyx_state == Py_None)) {
- PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
- __PYX_ERR(1, 14, __pyx_L1_error)
- }
- __pyx_t_6 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 2, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 14, __pyx_L1_error)
- __Pyx_GOTREF(__pyx_t_6);
- __pyx_t_8 = NULL;
- if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_7))) {
- __pyx_t_8 = PyMethod_GET_SELF(__pyx_t_7);
- if (likely(__pyx_t_8)) {
- PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_7);
- __Pyx_INCREF(__pyx_t_8);
- __Pyx_INCREF(function);
- __Pyx_DECREF_SET(__pyx_t_7, function);
- }
- }
- __pyx_t_1 = (__pyx_t_8) ? __Pyx_PyObject_Call2Args(__pyx_t_7, __pyx_t_8, __pyx_t_6) : __Pyx_PyObject_CallOneArg(__pyx_t_7, __pyx_t_6);
- __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0;
- __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
- if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 14, __pyx_L1_error)
- __Pyx_GOTREF(__pyx_t_1);
- __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
- __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-
- /* "(tree fragment)":13
- * cdef __pyx_unpickle_FrozenList__set_state(FrozenList __pyx_result, tuple __pyx_state):
- * __pyx_result._items = __pyx_state[0]; __pyx_result.frozen = __pyx_state[1]
- * if len(__pyx_state) > 2 and hasattr(__pyx_result, '__dict__'): # <<<<<<<<<<<<<<
- * __pyx_result.__dict__.update(__pyx_state[2])
- */
- }
-
- /* "(tree fragment)":11
- * __pyx_unpickle_FrozenList__set_state( __pyx_result, __pyx_state)
- * return __pyx_result
- * cdef __pyx_unpickle_FrozenList__set_state(FrozenList __pyx_result, tuple __pyx_state): # <<<<<<<<<<<<<<
- * __pyx_result._items = __pyx_state[0]; __pyx_result.frozen = __pyx_state[1]
- * if len(__pyx_state) > 2 and hasattr(__pyx_result, '__dict__'):
- */
-
- /* function exit code */
- __pyx_r = Py_None; __Pyx_INCREF(Py_None);
- goto __pyx_L0;
- __pyx_L1_error:;
- __Pyx_XDECREF(__pyx_t_1);
- __Pyx_XDECREF(__pyx_t_6);
- __Pyx_XDECREF(__pyx_t_7);
- __Pyx_XDECREF(__pyx_t_8);
- __Pyx_AddTraceback("frozenlist._frozenlist.__pyx_unpickle_FrozenList__set_state", __pyx_clineno, __pyx_lineno, __pyx_filename);
- __pyx_r = 0;
- __pyx_L0:;
- __Pyx_XGIVEREF(__pyx_r);
- __Pyx_RefNannyFinishContext();
- return __pyx_r;
-}
-static struct __pyx_vtabstruct_10frozenlist_11_frozenlist_FrozenList __pyx_vtable_10frozenlist_11_frozenlist_FrozenList;
-
-static PyObject *__pyx_tp_new_10frozenlist_11_frozenlist_FrozenList(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
- struct __pyx_obj_10frozenlist_11_frozenlist_FrozenList *p;
- PyObject *o;
- if (likely((t->tp_flags & Py_TPFLAGS_IS_ABSTRACT) == 0)) {
- o = (*t->tp_alloc)(t, 0);
- } else {
- o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0);
- }
- if (unlikely(!o)) return 0;
- p = ((struct __pyx_obj_10frozenlist_11_frozenlist_FrozenList *)o);
- p->__pyx_vtab = __pyx_vtabptr_10frozenlist_11_frozenlist_FrozenList;
- p->_items = ((PyObject*)Py_None); Py_INCREF(Py_None);
- return o;
-}
-
-static void __pyx_tp_dealloc_10frozenlist_11_frozenlist_FrozenList(PyObject *o) {
- struct __pyx_obj_10frozenlist_11_frozenlist_FrozenList *p = (struct __pyx_obj_10frozenlist_11_frozenlist_FrozenList *)o;
- #if CYTHON_USE_TP_FINALIZE
- if (unlikely(PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE) && Py_TYPE(o)->tp_finalize) && !_PyGC_FINALIZED(o)) {
- if (PyObject_CallFinalizerFromDealloc(o)) return;
- }
- #endif
- PyObject_GC_UnTrack(o);
- Py_CLEAR(p->_items);
- (*Py_TYPE(o)->tp_free)(o);
-}
-
-static int __pyx_tp_traverse_10frozenlist_11_frozenlist_FrozenList(PyObject *o, visitproc v, void *a) {
- int e;
- struct __pyx_obj_10frozenlist_11_frozenlist_FrozenList *p = (struct __pyx_obj_10frozenlist_11_frozenlist_FrozenList *)o;
- if (p->_items) {
- e = (*v)(p->_items, a); if (e) return e;
- }
- return 0;
-}
-
-static int __pyx_tp_clear_10frozenlist_11_frozenlist_FrozenList(PyObject *o) {
- PyObject* tmp;
- struct __pyx_obj_10frozenlist_11_frozenlist_FrozenList *p = (struct __pyx_obj_10frozenlist_11_frozenlist_FrozenList *)o;
- tmp = ((PyObject*)p->_items);
- p->_items = ((PyObject*)Py_None); Py_INCREF(Py_None);
- Py_XDECREF(tmp);
- return 0;
-}
-static PyObject *__pyx_sq_item_10frozenlist_11_frozenlist_FrozenList(PyObject *o, Py_ssize_t i) {
- PyObject *r;
- PyObject *x = PyInt_FromSsize_t(i); if(!x) return 0;
- r = Py_TYPE(o)->tp_as_mapping->mp_subscript(o, x);
- Py_DECREF(x);
- return r;
-}
-
-static int __pyx_mp_ass_subscript_10frozenlist_11_frozenlist_FrozenList(PyObject *o, PyObject *i, PyObject *v) {
- if (v) {
- return __pyx_pw_10frozenlist_11_frozenlist_10FrozenList_7__setitem__(o, i, v);
- }
- else {
- return __pyx_pw_10frozenlist_11_frozenlist_10FrozenList_9__delitem__(o, i);
- }
-}
-
-static PyObject *__pyx_getprop_10frozenlist_11_frozenlist_10FrozenList_frozen(PyObject *o, CYTHON_UNUSED void *x) {
- return __pyx_pw_10frozenlist_11_frozenlist_10FrozenList_6frozen_1__get__(o);
-}
-
-static PyMethodDef __pyx_methods_10frozenlist_11_frozenlist_FrozenList[] = {
- {"freeze", (PyCFunction)__pyx_pw_10frozenlist_11_frozenlist_10FrozenList_3freeze, METH_NOARGS, 0},
- {"__reversed__", (PyCFunction)__pyx_pw_10frozenlist_11_frozenlist_10FrozenList_15__reversed__, METH_NOARGS, 0},
- {"insert", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_10frozenlist_11_frozenlist_10FrozenList_19insert, METH_VARARGS|METH_KEYWORDS, 0},
- {"index", (PyCFunction)__pyx_pw_10frozenlist_11_frozenlist_10FrozenList_25index, METH_O, 0},
- {"remove", (PyCFunction)__pyx_pw_10frozenlist_11_frozenlist_10FrozenList_27remove, METH_O, 0},
- {"clear", (PyCFunction)__pyx_pw_10frozenlist_11_frozenlist_10FrozenList_29clear, METH_NOARGS, 0},
- {"extend", (PyCFunction)__pyx_pw_10frozenlist_11_frozenlist_10FrozenList_31extend, METH_O, 0},
- {"reverse", (PyCFunction)__pyx_pw_10frozenlist_11_frozenlist_10FrozenList_33reverse, METH_NOARGS, 0},
- {"pop", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_10frozenlist_11_frozenlist_10FrozenList_35pop, METH_VARARGS|METH_KEYWORDS, 0},
- {"append", (PyCFunction)__pyx_pw_10frozenlist_11_frozenlist_10FrozenList_37append, METH_O, 0},
- {"count", (PyCFunction)__pyx_pw_10frozenlist_11_frozenlist_10FrozenList_39count, METH_O, 0},
- {"__reduce_cython__", (PyCFunction)__pyx_pw_10frozenlist_11_frozenlist_10FrozenList_45__reduce_cython__, METH_NOARGS, 0},
- {"__setstate_cython__", (PyCFunction)__pyx_pw_10frozenlist_11_frozenlist_10FrozenList_47__setstate_cython__, METH_O, 0},
- {0, 0, 0, 0}
-};
-
-static struct PyGetSetDef __pyx_getsets_10frozenlist_11_frozenlist_FrozenList[] = {
- {(char *)"frozen", __pyx_getprop_10frozenlist_11_frozenlist_10FrozenList_frozen, 0, (char *)0, 0},
- {0, 0, 0, 0, 0}
-};
-
-static PyNumberMethods __pyx_tp_as_number_FrozenList = {
- 0, /*nb_add*/
- 0, /*nb_subtract*/
- 0, /*nb_multiply*/
- #if PY_MAJOR_VERSION < 3 || (CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX < 0x03050000)
- 0, /*nb_divide*/
- #endif
- 0, /*nb_remainder*/
- 0, /*nb_divmod*/
- 0, /*nb_power*/
- 0, /*nb_negative*/
- 0, /*nb_positive*/
- 0, /*nb_absolute*/
- 0, /*nb_nonzero*/
- 0, /*nb_invert*/
- 0, /*nb_lshift*/
- 0, /*nb_rshift*/
- 0, /*nb_and*/
- 0, /*nb_xor*/
- 0, /*nb_or*/
- #if PY_MAJOR_VERSION < 3 || (CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX < 0x03050000)
- 0, /*nb_coerce*/
- #endif
- 0, /*nb_int*/
- #if PY_MAJOR_VERSION < 3
- 0, /*nb_long*/
- #else
- 0, /*reserved*/
- #endif
- 0, /*nb_float*/
- #if PY_MAJOR_VERSION < 3 || (CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX < 0x03050000)
- 0, /*nb_oct*/
- #endif
- #if PY_MAJOR_VERSION < 3 || (CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX < 0x03050000)
- 0, /*nb_hex*/
- #endif
- __pyx_pw_10frozenlist_11_frozenlist_10FrozenList_23__iadd__, /*nb_inplace_add*/
- 0, /*nb_inplace_subtract*/
- 0, /*nb_inplace_multiply*/
- #if PY_MAJOR_VERSION < 3 || (CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX < 0x03050000)
- 0, /*nb_inplace_divide*/
- #endif
- 0, /*nb_inplace_remainder*/
- 0, /*nb_inplace_power*/
- 0, /*nb_inplace_lshift*/
- 0, /*nb_inplace_rshift*/
- 0, /*nb_inplace_and*/
- 0, /*nb_inplace_xor*/
- 0, /*nb_inplace_or*/
- 0, /*nb_floor_divide*/
- 0, /*nb_true_divide*/
- 0, /*nb_inplace_floor_divide*/
- 0, /*nb_inplace_true_divide*/
- 0, /*nb_index*/
- #if PY_VERSION_HEX >= 0x03050000
- 0, /*nb_matrix_multiply*/
- #endif
- #if PY_VERSION_HEX >= 0x03050000
- 0, /*nb_inplace_matrix_multiply*/
- #endif
-};
-
-static PySequenceMethods __pyx_tp_as_sequence_FrozenList = {
- __pyx_pw_10frozenlist_11_frozenlist_10FrozenList_11__len__, /*sq_length*/
- 0, /*sq_concat*/
- 0, /*sq_repeat*/
- __pyx_sq_item_10frozenlist_11_frozenlist_FrozenList, /*sq_item*/
- 0, /*sq_slice*/
- 0, /*sq_ass_item*/
- 0, /*sq_ass_slice*/
- __pyx_pw_10frozenlist_11_frozenlist_10FrozenList_21__contains__, /*sq_contains*/
- 0, /*sq_inplace_concat*/
- 0, /*sq_inplace_repeat*/
-};
-
-static PyMappingMethods __pyx_tp_as_mapping_FrozenList = {
- __pyx_pw_10frozenlist_11_frozenlist_10FrozenList_11__len__, /*mp_length*/
- __pyx_pw_10frozenlist_11_frozenlist_10FrozenList_5__getitem__, /*mp_subscript*/
- __pyx_mp_ass_subscript_10frozenlist_11_frozenlist_FrozenList, /*mp_ass_subscript*/
-};
-
-static PyTypeObject __pyx_type_10frozenlist_11_frozenlist_FrozenList = {
- PyVarObject_HEAD_INIT(0, 0)
- "frozenlist._frozenlist.FrozenList", /*tp_name*/
- sizeof(struct __pyx_obj_10frozenlist_11_frozenlist_FrozenList), /*tp_basicsize*/
- 0, /*tp_itemsize*/
- __pyx_tp_dealloc_10frozenlist_11_frozenlist_FrozenList, /*tp_dealloc*/
- #if PY_VERSION_HEX < 0x030800b4
- 0, /*tp_print*/
- #endif
- #if PY_VERSION_HEX >= 0x030800b4
- 0, /*tp_vectorcall_offset*/
- #endif
- 0, /*tp_getattr*/
- 0, /*tp_setattr*/
- #if PY_MAJOR_VERSION < 3
- 0, /*tp_compare*/
- #endif
- #if PY_MAJOR_VERSION >= 3
- 0, /*tp_as_async*/
- #endif
- __pyx_pw_10frozenlist_11_frozenlist_10FrozenList_41__repr__, /*tp_repr*/
- &__pyx_tp_as_number_FrozenList, /*tp_as_number*/
- &__pyx_tp_as_sequence_FrozenList, /*tp_as_sequence*/
- &__pyx_tp_as_mapping_FrozenList, /*tp_as_mapping*/
- __pyx_pw_10frozenlist_11_frozenlist_10FrozenList_43__hash__, /*tp_hash*/
- 0, /*tp_call*/
- 0, /*tp_str*/
- 0, /*tp_getattro*/
- 0, /*tp_setattro*/
- 0, /*tp_as_buffer*/
- Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
- 0, /*tp_doc*/
- __pyx_tp_traverse_10frozenlist_11_frozenlist_FrozenList, /*tp_traverse*/
- __pyx_tp_clear_10frozenlist_11_frozenlist_FrozenList, /*tp_clear*/
- __pyx_pw_10frozenlist_11_frozenlist_10FrozenList_17__richcmp__, /*tp_richcompare*/
- 0, /*tp_weaklistoffset*/
- __pyx_pw_10frozenlist_11_frozenlist_10FrozenList_13__iter__, /*tp_iter*/
- 0, /*tp_iternext*/
- __pyx_methods_10frozenlist_11_frozenlist_FrozenList, /*tp_methods*/
- 0, /*tp_members*/
- __pyx_getsets_10frozenlist_11_frozenlist_FrozenList, /*tp_getset*/
- 0, /*tp_base*/
- 0, /*tp_dict*/
- 0, /*tp_descr_get*/
- 0, /*tp_descr_set*/
- 0, /*tp_dictoffset*/
- __pyx_pw_10frozenlist_11_frozenlist_10FrozenList_1__init__, /*tp_init*/
- 0, /*tp_alloc*/
- __pyx_tp_new_10frozenlist_11_frozenlist_FrozenList, /*tp_new*/
- 0, /*tp_free*/
- 0, /*tp_is_gc*/
- 0, /*tp_bases*/
- 0, /*tp_mro*/
- 0, /*tp_cache*/
- 0, /*tp_subclasses*/
- 0, /*tp_weaklist*/
- 0, /*tp_del*/
- 0, /*tp_version_tag*/
- #if PY_VERSION_HEX >= 0x030400a1
- 0, /*tp_finalize*/
- #endif
- #if PY_VERSION_HEX >= 0x030800b1
- 0, /*tp_vectorcall*/
- #endif
- #if PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000
- 0, /*tp_print*/
- #endif
-};
-
-static PyMethodDef __pyx_methods[] = {
- {0, 0, 0, 0}
-};
-
-#if PY_MAJOR_VERSION >= 3
-#if CYTHON_PEP489_MULTI_PHASE_INIT
-static PyObject* __pyx_pymod_create(PyObject *spec, PyModuleDef *def); /*proto*/
-static int __pyx_pymod_exec__frozenlist(PyObject* module); /*proto*/
-static PyModuleDef_Slot __pyx_moduledef_slots[] = {
- {Py_mod_create, (void*)__pyx_pymod_create},
- {Py_mod_exec, (void*)__pyx_pymod_exec__frozenlist},
- {0, NULL}
-};
-#endif
-
-static struct PyModuleDef __pyx_moduledef = {
- PyModuleDef_HEAD_INIT,
- "_frozenlist",
- 0, /* m_doc */
- #if CYTHON_PEP489_MULTI_PHASE_INIT
- 0, /* m_size */
- #else
- -1, /* m_size */
- #endif
- __pyx_methods /* m_methods */,
- #if CYTHON_PEP489_MULTI_PHASE_INIT
- __pyx_moduledef_slots, /* m_slots */
- #else
- NULL, /* m_reload */
- #endif
- NULL, /* m_traverse */
- NULL, /* m_clear */
- NULL /* m_free */
-};
-#endif
-#ifndef CYTHON_SMALL_CODE
-#if defined(__clang__)
- #define CYTHON_SMALL_CODE
-#elif defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3))
- #define CYTHON_SMALL_CODE __attribute__((cold))
-#else
- #define CYTHON_SMALL_CODE
-#endif
-#endif
-
-static __Pyx_StringTabEntry __pyx_string_tab[] = {
- {&__pyx_kp_u_Cannot_hash_unfrozen_list, __pyx_k_Cannot_hash_unfrozen_list, sizeof(__pyx_k_Cannot_hash_unfrozen_list), 0, 1, 0, 0},
- {&__pyx_kp_u_Cannot_modify_frozen_list, __pyx_k_Cannot_modify_frozen_list, sizeof(__pyx_k_Cannot_modify_frozen_list), 0, 1, 0, 0},
- {&__pyx_n_s_FrozenList, __pyx_k_FrozenList, sizeof(__pyx_k_FrozenList), 0, 0, 1, 1},
- {&__pyx_kp_u_FrozenList_frozen_r, __pyx_k_FrozenList_frozen_r, sizeof(__pyx_k_FrozenList_frozen_r), 0, 1, 0, 0},
- {&__pyx_kp_s_Incompatible_checksums_s_vs_0x94, __pyx_k_Incompatible_checksums_s_vs_0x94, sizeof(__pyx_k_Incompatible_checksums_s_vs_0x94), 0, 0, 1, 0},
- {&__pyx_n_s_MutableSequence, __pyx_k_MutableSequence, sizeof(__pyx_k_MutableSequence), 0, 0, 1, 1},
- {&__pyx_n_s_PickleError, __pyx_k_PickleError, sizeof(__pyx_k_PickleError), 0, 0, 1, 1},
- {&__pyx_n_s_RuntimeError, __pyx_k_RuntimeError, sizeof(__pyx_k_RuntimeError), 0, 0, 1, 1},
- {&__pyx_n_s_clear, __pyx_k_clear, sizeof(__pyx_k_clear), 0, 0, 1, 1},
- {&__pyx_n_s_cline_in_traceback, __pyx_k_cline_in_traceback, sizeof(__pyx_k_cline_in_traceback), 0, 0, 1, 1},
- {&__pyx_n_s_collections_abc, __pyx_k_collections_abc, sizeof(__pyx_k_collections_abc), 0, 0, 1, 1},
- {&__pyx_n_s_count, __pyx_k_count, sizeof(__pyx_k_count), 0, 0, 1, 1},
- {&__pyx_n_s_dict, __pyx_k_dict, sizeof(__pyx_k_dict), 0, 0, 1, 1},
- {&__pyx_n_s_format, __pyx_k_format, sizeof(__pyx_k_format), 0, 0, 1, 1},
- {&__pyx_n_s_frozenlist__frozenlist, __pyx_k_frozenlist__frozenlist, sizeof(__pyx_k_frozenlist__frozenlist), 0, 0, 1, 1},
- {&__pyx_n_s_getstate, __pyx_k_getstate, sizeof(__pyx_k_getstate), 0, 0, 1, 1},
- {&__pyx_n_s_import, __pyx_k_import, sizeof(__pyx_k_import), 0, 0, 1, 1},
- {&__pyx_n_s_index, __pyx_k_index, sizeof(__pyx_k_index), 0, 0, 1, 1},
- {&__pyx_n_s_item, __pyx_k_item, sizeof(__pyx_k_item), 0, 0, 1, 1},
- {&__pyx_n_s_items, __pyx_k_items, sizeof(__pyx_k_items), 0, 0, 1, 1},
- {&__pyx_n_s_iter, __pyx_k_iter, sizeof(__pyx_k_iter), 0, 0, 1, 1},
- {&__pyx_n_s_main, __pyx_k_main, sizeof(__pyx_k_main), 0, 0, 1, 1},
- {&__pyx_n_s_name, __pyx_k_name, sizeof(__pyx_k_name), 0, 0, 1, 1},
- {&__pyx_n_s_new, __pyx_k_new, sizeof(__pyx_k_new), 0, 0, 1, 1},
- {&__pyx_n_s_pickle, __pyx_k_pickle, sizeof(__pyx_k_pickle), 0, 0, 1, 1},
- {&__pyx_n_s_pop, __pyx_k_pop, sizeof(__pyx_k_pop), 0, 0, 1, 1},
- {&__pyx_n_s_pos, __pyx_k_pos, sizeof(__pyx_k_pos), 0, 0, 1, 1},
- {&__pyx_n_s_pyx_PickleError, __pyx_k_pyx_PickleError, sizeof(__pyx_k_pyx_PickleError), 0, 0, 1, 1},
- {&__pyx_n_s_pyx_checksum, __pyx_k_pyx_checksum, sizeof(__pyx_k_pyx_checksum), 0, 0, 1, 1},
- {&__pyx_n_s_pyx_result, __pyx_k_pyx_result, sizeof(__pyx_k_pyx_result), 0, 0, 1, 1},
- {&__pyx_n_s_pyx_state, __pyx_k_pyx_state, sizeof(__pyx_k_pyx_state), 0, 0, 1, 1},
- {&__pyx_n_s_pyx_type, __pyx_k_pyx_type, sizeof(__pyx_k_pyx_type), 0, 0, 1, 1},
- {&__pyx_n_s_pyx_unpickle_FrozenList, __pyx_k_pyx_unpickle_FrozenList, sizeof(__pyx_k_pyx_unpickle_FrozenList), 0, 0, 1, 1},
- {&__pyx_n_s_pyx_vtable, __pyx_k_pyx_vtable, sizeof(__pyx_k_pyx_vtable), 0, 0, 1, 1},
- {&__pyx_n_s_reduce, __pyx_k_reduce, sizeof(__pyx_k_reduce), 0, 0, 1, 1},
- {&__pyx_n_s_reduce_cython, __pyx_k_reduce_cython, sizeof(__pyx_k_reduce_cython), 0, 0, 1, 1},
- {&__pyx_n_s_reduce_ex, __pyx_k_reduce_ex, sizeof(__pyx_k_reduce_ex), 0, 0, 1, 1},
- {&__pyx_n_s_register, __pyx_k_register, sizeof(__pyx_k_register), 0, 0, 1, 1},
- {&__pyx_n_s_remove, __pyx_k_remove, sizeof(__pyx_k_remove), 0, 0, 1, 1},
- {&__pyx_n_s_reversed, __pyx_k_reversed, sizeof(__pyx_k_reversed), 0, 0, 1, 1},
- {&__pyx_n_s_setstate, __pyx_k_setstate, sizeof(__pyx_k_setstate), 0, 0, 1, 1},
- {&__pyx_n_s_setstate_cython, __pyx_k_setstate_cython, sizeof(__pyx_k_setstate_cython), 0, 0, 1, 1},
- {&__pyx_kp_s_stringsource, __pyx_k_stringsource, sizeof(__pyx_k_stringsource), 0, 0, 1, 0},
- {&__pyx_n_s_test, __pyx_k_test, sizeof(__pyx_k_test), 0, 0, 1, 1},
- {&__pyx_n_s_update, __pyx_k_update, sizeof(__pyx_k_update), 0, 0, 1, 1},
- {0, 0, 0, 0, 0, 0, 0}
-};
-static CYTHON_SMALL_CODE int __Pyx_InitCachedBuiltins(void) {
- __pyx_builtin_RuntimeError = __Pyx_GetBuiltinName(__pyx_n_s_RuntimeError); if (!__pyx_builtin_RuntimeError) __PYX_ERR(0, 19, __pyx_L1_error)
- return 0;
- __pyx_L1_error:;
- return -1;
-}
-
-static CYTHON_SMALL_CODE int __Pyx_InitCachedConstants(void) {
- __Pyx_RefNannyDeclarations
- __Pyx_RefNannySetupContext("__Pyx_InitCachedConstants", 0);
-
- /* "frozenlist/_frozenlist.pyx":19
- * cdef object _check_frozen(self):
- * if self.frozen:
- * raise RuntimeError("Cannot modify frozen list.") # <<<<<<<<<<<<<<
- *
- * cdef inline object _fast_len(self):
- */
- __pyx_tuple_ = PyTuple_Pack(1, __pyx_kp_u_Cannot_modify_frozen_list); if (unlikely(!__pyx_tuple_)) __PYX_ERR(0, 19, __pyx_L1_error)
- __Pyx_GOTREF(__pyx_tuple_);
- __Pyx_GIVEREF(__pyx_tuple_);
-
- /* "frozenlist/_frozenlist.pyx":111
- * return hash(tuple(self._items))
- * else:
- * raise RuntimeError("Cannot hash unfrozen list.") # <<<<<<<<<<<<<<
- *
- *
- */
- __pyx_tuple__2 = PyTuple_Pack(1, __pyx_kp_u_Cannot_hash_unfrozen_list); if (unlikely(!__pyx_tuple__2)) __PYX_ERR(0, 111, __pyx_L1_error)
- __Pyx_GOTREF(__pyx_tuple__2);
- __Pyx_GIVEREF(__pyx_tuple__2);
-
- /* "(tree fragment)":1
- * def __pyx_unpickle_FrozenList(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<<
- * cdef object __pyx_PickleError
- * cdef object __pyx_result
- */
- __pyx_tuple__3 = PyTuple_Pack(5, __pyx_n_s_pyx_type, __pyx_n_s_pyx_checksum, __pyx_n_s_pyx_state, __pyx_n_s_pyx_PickleError, __pyx_n_s_pyx_result); if (unlikely(!__pyx_tuple__3)) __PYX_ERR(1, 1, __pyx_L1_error)
- __Pyx_GOTREF(__pyx_tuple__3);
- __Pyx_GIVEREF(__pyx_tuple__3);
- __pyx_codeobj__4 = (PyObject*)__Pyx_PyCode_New(3, 0, 5, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__3, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_pyx_unpickle_FrozenList, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__4)) __PYX_ERR(1, 1, __pyx_L1_error)
- __Pyx_RefNannyFinishContext();
- return 0;
- __pyx_L1_error:;
- __Pyx_RefNannyFinishContext();
- return -1;
-}
-
-static CYTHON_SMALL_CODE int __Pyx_InitGlobals(void) {
- if (__Pyx_InitStrings(__pyx_string_tab) < 0) __PYX_ERR(0, 1, __pyx_L1_error);
- __pyx_int_0 = PyInt_FromLong(0); if (unlikely(!__pyx_int_0)) __PYX_ERR(0, 1, __pyx_L1_error)
- __pyx_int_1 = PyInt_FromLong(1); if (unlikely(!__pyx_int_1)) __PYX_ERR(0, 1, __pyx_L1_error)
- __pyx_int_2 = PyInt_FromLong(2); if (unlikely(!__pyx_int_2)) __PYX_ERR(0, 1, __pyx_L1_error)
- __pyx_int_3 = PyInt_FromLong(3); if (unlikely(!__pyx_int_3)) __PYX_ERR(0, 1, __pyx_L1_error)
- __pyx_int_4 = PyInt_FromLong(4); if (unlikely(!__pyx_int_4)) __PYX_ERR(0, 1, __pyx_L1_error)
- __pyx_int_5 = PyInt_FromLong(5); if (unlikely(!__pyx_int_5)) __PYX_ERR(0, 1, __pyx_L1_error)
- __pyx_int_155820355 = PyInt_FromLong(155820355L); if (unlikely(!__pyx_int_155820355)) __PYX_ERR(0, 1, __pyx_L1_error)
- __pyx_int_neg_1 = PyInt_FromLong(-1); if (unlikely(!__pyx_int_neg_1)) __PYX_ERR(0, 1, __pyx_L1_error)
- return 0;
- __pyx_L1_error:;
- return -1;
-}
-
-static CYTHON_SMALL_CODE int __Pyx_modinit_global_init_code(void); /*proto*/
-static CYTHON_SMALL_CODE int __Pyx_modinit_variable_export_code(void); /*proto*/
-static CYTHON_SMALL_CODE int __Pyx_modinit_function_export_code(void); /*proto*/
-static CYTHON_SMALL_CODE int __Pyx_modinit_type_init_code(void); /*proto*/
-static CYTHON_SMALL_CODE int __Pyx_modinit_type_import_code(void); /*proto*/
-static CYTHON_SMALL_CODE int __Pyx_modinit_variable_import_code(void); /*proto*/
-static CYTHON_SMALL_CODE int __Pyx_modinit_function_import_code(void); /*proto*/
-
-static int __Pyx_modinit_global_init_code(void) {
- __Pyx_RefNannyDeclarations
- __Pyx_RefNannySetupContext("__Pyx_modinit_global_init_code", 0);
- /*--- Global init code ---*/
- __Pyx_RefNannyFinishContext();
- return 0;
-}
-
-static int __Pyx_modinit_variable_export_code(void) {
- __Pyx_RefNannyDeclarations
- __Pyx_RefNannySetupContext("__Pyx_modinit_variable_export_code", 0);
- /*--- Variable export code ---*/
- __Pyx_RefNannyFinishContext();
- return 0;
-}
-
-static int __Pyx_modinit_function_export_code(void) {
- __Pyx_RefNannyDeclarations
- __Pyx_RefNannySetupContext("__Pyx_modinit_function_export_code", 0);
- /*--- Function export code ---*/
- __Pyx_RefNannyFinishContext();
- return 0;
-}
-
-static int __Pyx_modinit_type_init_code(void) {
- __Pyx_RefNannyDeclarations
- int __pyx_lineno = 0;
- const char *__pyx_filename = NULL;
- int __pyx_clineno = 0;
- __Pyx_RefNannySetupContext("__Pyx_modinit_type_init_code", 0);
- /*--- Type init code ---*/
- __pyx_vtabptr_10frozenlist_11_frozenlist_FrozenList = &__pyx_vtable_10frozenlist_11_frozenlist_FrozenList;
- __pyx_vtable_10frozenlist_11_frozenlist_FrozenList._check_frozen = (PyObject *(*)(struct __pyx_obj_10frozenlist_11_frozenlist_FrozenList *))__pyx_f_10frozenlist_11_frozenlist_10FrozenList__check_frozen;
- __pyx_vtable_10frozenlist_11_frozenlist_FrozenList._fast_len = (PyObject *(*)(struct __pyx_obj_10frozenlist_11_frozenlist_FrozenList *))__pyx_f_10frozenlist_11_frozenlist_10FrozenList__fast_len;
- if (PyType_Ready(&__pyx_type_10frozenlist_11_frozenlist_FrozenList) < 0) __PYX_ERR(0, 4, __pyx_L1_error)
- #if PY_VERSION_HEX < 0x030800B1
- __pyx_type_10frozenlist_11_frozenlist_FrozenList.tp_print = 0;
- #endif
- if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_type_10frozenlist_11_frozenlist_FrozenList.tp_dictoffset && __pyx_type_10frozenlist_11_frozenlist_FrozenList.tp_getattro == PyObject_GenericGetAttr)) {
- __pyx_type_10frozenlist_11_frozenlist_FrozenList.tp_getattro = __Pyx_PyObject_GenericGetAttr;
- }
- if (__Pyx_SetVtable(__pyx_type_10frozenlist_11_frozenlist_FrozenList.tp_dict, __pyx_vtabptr_10frozenlist_11_frozenlist_FrozenList) < 0) __PYX_ERR(0, 4, __pyx_L1_error)
- if (PyObject_SetAttr(__pyx_m, __pyx_n_s_FrozenList, (PyObject *)&__pyx_type_10frozenlist_11_frozenlist_FrozenList) < 0) __PYX_ERR(0, 4, __pyx_L1_error)
- if (__Pyx_setup_reduce((PyObject*)&__pyx_type_10frozenlist_11_frozenlist_FrozenList) < 0) __PYX_ERR(0, 4, __pyx_L1_error)
- __pyx_ptype_10frozenlist_11_frozenlist_FrozenList = &__pyx_type_10frozenlist_11_frozenlist_FrozenList;
- __Pyx_RefNannyFinishContext();
- return 0;
- __pyx_L1_error:;
- __Pyx_RefNannyFinishContext();
- return -1;
-}
-
-static int __Pyx_modinit_type_import_code(void) {
- __Pyx_RefNannyDeclarations
- __Pyx_RefNannySetupContext("__Pyx_modinit_type_import_code", 0);
- /*--- Type import code ---*/
- __Pyx_RefNannyFinishContext();
- return 0;
-}
-
-static int __Pyx_modinit_variable_import_code(void) {
- __Pyx_RefNannyDeclarations
- __Pyx_RefNannySetupContext("__Pyx_modinit_variable_import_code", 0);
- /*--- Variable import code ---*/
- __Pyx_RefNannyFinishContext();
- return 0;
-}
-
-static int __Pyx_modinit_function_import_code(void) {
- __Pyx_RefNannyDeclarations
- __Pyx_RefNannySetupContext("__Pyx_modinit_function_import_code", 0);
- /*--- Function import code ---*/
- __Pyx_RefNannyFinishContext();
- return 0;
-}
-
-
-#ifndef CYTHON_NO_PYINIT_EXPORT
-#define __Pyx_PyMODINIT_FUNC PyMODINIT_FUNC
-#elif PY_MAJOR_VERSION < 3
-#ifdef __cplusplus
-#define __Pyx_PyMODINIT_FUNC extern "C" void
-#else
-#define __Pyx_PyMODINIT_FUNC void
-#endif
-#else
-#ifdef __cplusplus
-#define __Pyx_PyMODINIT_FUNC extern "C" PyObject *
-#else
-#define __Pyx_PyMODINIT_FUNC PyObject *
-#endif
-#endif
-
-
-#if PY_MAJOR_VERSION < 3
-__Pyx_PyMODINIT_FUNC init_frozenlist(void) CYTHON_SMALL_CODE; /*proto*/
-__Pyx_PyMODINIT_FUNC init_frozenlist(void)
-#else
-__Pyx_PyMODINIT_FUNC PyInit__frozenlist(void) CYTHON_SMALL_CODE; /*proto*/
-__Pyx_PyMODINIT_FUNC PyInit__frozenlist(void)
-#if CYTHON_PEP489_MULTI_PHASE_INIT
-{
- return PyModuleDef_Init(&__pyx_moduledef);
-}
-static CYTHON_SMALL_CODE int __Pyx_check_single_interpreter(void) {
- #if PY_VERSION_HEX >= 0x030700A1
- static PY_INT64_T main_interpreter_id = -1;
- PY_INT64_T current_id = PyInterpreterState_GetID(PyThreadState_Get()->interp);
- if (main_interpreter_id == -1) {
- main_interpreter_id = current_id;
- return (unlikely(current_id == -1)) ? -1 : 0;
- } else if (unlikely(main_interpreter_id != current_id))
- #else
- static PyInterpreterState *main_interpreter = NULL;
- PyInterpreterState *current_interpreter = PyThreadState_Get()->interp;
- if (!main_interpreter) {
- main_interpreter = current_interpreter;
- } else if (unlikely(main_interpreter != current_interpreter))
- #endif
- {
- PyErr_SetString(
- PyExc_ImportError,
- "Interpreter change detected - this module can only be loaded into one interpreter per process.");
- return -1;
- }
- return 0;
-}
-static CYTHON_SMALL_CODE int __Pyx_copy_spec_to_module(PyObject *spec, PyObject *moddict, const char* from_name, const char* to_name, int allow_none) {
- PyObject *value = PyObject_GetAttrString(spec, from_name);
- int result = 0;
- if (likely(value)) {
- if (allow_none || value != Py_None) {
- result = PyDict_SetItemString(moddict, to_name, value);
- }
- Py_DECREF(value);
- } else if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
- PyErr_Clear();
- } else {
- result = -1;
- }
- return result;
-}
-static CYTHON_SMALL_CODE PyObject* __pyx_pymod_create(PyObject *spec, CYTHON_UNUSED PyModuleDef *def) {
- PyObject *module = NULL, *moddict, *modname;
- if (__Pyx_check_single_interpreter())
- return NULL;
- if (__pyx_m)
- return __Pyx_NewRef(__pyx_m);
- modname = PyObject_GetAttrString(spec, "name");
- if (unlikely(!modname)) goto bad;
- module = PyModule_NewObject(modname);
- Py_DECREF(modname);
- if (unlikely(!module)) goto bad;
- moddict = PyModule_GetDict(module);
- if (unlikely(!moddict)) goto bad;
- if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "loader", "__loader__", 1) < 0)) goto bad;
- if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "origin", "__file__", 1) < 0)) goto bad;
- if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "parent", "__package__", 1) < 0)) goto bad;
- if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "submodule_search_locations", "__path__", 0) < 0)) goto bad;
- return module;
-bad:
- Py_XDECREF(module);
- return NULL;
-}
-
-
-static CYTHON_SMALL_CODE int __pyx_pymod_exec__frozenlist(PyObject *__pyx_pyinit_module)
-#endif
-#endif
-{
- PyObject *__pyx_t_1 = NULL;
- PyObject *__pyx_t_2 = NULL;
- int __pyx_lineno = 0;
- const char *__pyx_filename = NULL;
- int __pyx_clineno = 0;
- __Pyx_RefNannyDeclarations
- #if CYTHON_PEP489_MULTI_PHASE_INIT
- if (__pyx_m) {
- if (__pyx_m == __pyx_pyinit_module) return 0;
- PyErr_SetString(PyExc_RuntimeError, "Module '_frozenlist' has already been imported. Re-initialisation is not supported.");
- return -1;
- }
- #elif PY_MAJOR_VERSION >= 3
- if (__pyx_m) return __Pyx_NewRef(__pyx_m);
- #endif
- #if CYTHON_REFNANNY
-__Pyx_RefNanny = __Pyx_RefNannyImportAPI("refnanny");
-if (!__Pyx_RefNanny) {
- PyErr_Clear();
- __Pyx_RefNanny = __Pyx_RefNannyImportAPI("Cython.Runtime.refnanny");
- if (!__Pyx_RefNanny)
- Py_FatalError("failed to import 'refnanny' module");
-}
-#endif
- __Pyx_RefNannySetupContext("__Pyx_PyMODINIT_FUNC PyInit__frozenlist(void)", 0);
- if (__Pyx_check_binary_version() < 0) __PYX_ERR(0, 1, __pyx_L1_error)
- #ifdef __Pxy_PyFrame_Initialize_Offsets
- __Pxy_PyFrame_Initialize_Offsets();
- #endif
- __pyx_empty_tuple = PyTuple_New(0); if (unlikely(!__pyx_empty_tuple)) __PYX_ERR(0, 1, __pyx_L1_error)
- __pyx_empty_bytes = PyBytes_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_bytes)) __PYX_ERR(0, 1, __pyx_L1_error)
- __pyx_empty_unicode = PyUnicode_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_unicode)) __PYX_ERR(0, 1, __pyx_L1_error)
- #ifdef __Pyx_CyFunction_USED
- if (__pyx_CyFunction_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error)
- #endif
- #ifdef __Pyx_FusedFunction_USED
- if (__pyx_FusedFunction_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error)
- #endif
- #ifdef __Pyx_Coroutine_USED
- if (__pyx_Coroutine_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error)
- #endif
- #ifdef __Pyx_Generator_USED
- if (__pyx_Generator_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error)
- #endif
- #ifdef __Pyx_AsyncGen_USED
- if (__pyx_AsyncGen_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error)
- #endif
- #ifdef __Pyx_StopAsyncIteration_USED
- if (__pyx_StopAsyncIteration_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error)
- #endif
- /*--- Library function declarations ---*/
- /*--- Threads initialization code ---*/
- #if defined(__PYX_FORCE_INIT_THREADS) && __PYX_FORCE_INIT_THREADS
- #ifdef WITH_THREAD /* Python build with threading support? */
- PyEval_InitThreads();
- #endif
- #endif
- /*--- Module creation code ---*/
- #if CYTHON_PEP489_MULTI_PHASE_INIT
- __pyx_m = __pyx_pyinit_module;
- Py_INCREF(__pyx_m);
- #else
- #if PY_MAJOR_VERSION < 3
- __pyx_m = Py_InitModule4("_frozenlist", __pyx_methods, 0, 0, PYTHON_API_VERSION); Py_XINCREF(__pyx_m);
- #else
- __pyx_m = PyModule_Create(&__pyx_moduledef);
- #endif
- if (unlikely(!__pyx_m)) __PYX_ERR(0, 1, __pyx_L1_error)
- #endif
- __pyx_d = PyModule_GetDict(__pyx_m); if (unlikely(!__pyx_d)) __PYX_ERR(0, 1, __pyx_L1_error)
- Py_INCREF(__pyx_d);
- __pyx_b = PyImport_AddModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_b)) __PYX_ERR(0, 1, __pyx_L1_error)
- Py_INCREF(__pyx_b);
- __pyx_cython_runtime = PyImport_AddModule((char *) "cython_runtime"); if (unlikely(!__pyx_cython_runtime)) __PYX_ERR(0, 1, __pyx_L1_error)
- Py_INCREF(__pyx_cython_runtime);
- if (PyObject_SetAttrString(__pyx_m, "__builtins__", __pyx_b) < 0) __PYX_ERR(0, 1, __pyx_L1_error);
- /*--- Initialize various global constants etc. ---*/
- if (__Pyx_InitGlobals() < 0) __PYX_ERR(0, 1, __pyx_L1_error)
- #if PY_MAJOR_VERSION < 3 && (__PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT)
- if (__Pyx_init_sys_getdefaultencoding_params() < 0) __PYX_ERR(0, 1, __pyx_L1_error)
- #endif
- if (__pyx_module_is_main_frozenlist___frozenlist) {
- if (PyObject_SetAttr(__pyx_m, __pyx_n_s_name, __pyx_n_s_main) < 0) __PYX_ERR(0, 1, __pyx_L1_error)
- }
- #if PY_MAJOR_VERSION >= 3
- {
- PyObject *modules = PyImport_GetModuleDict(); if (unlikely(!modules)) __PYX_ERR(0, 1, __pyx_L1_error)
- if (!PyDict_GetItemString(modules, "frozenlist._frozenlist")) {
- if (unlikely(PyDict_SetItemString(modules, "frozenlist._frozenlist", __pyx_m) < 0)) __PYX_ERR(0, 1, __pyx_L1_error)
- }
- }
- #endif
- /*--- Builtin init code ---*/
- if (__Pyx_InitCachedBuiltins() < 0) __PYX_ERR(0, 1, __pyx_L1_error)
- /*--- Constants init code ---*/
- if (__Pyx_InitCachedConstants() < 0) __PYX_ERR(0, 1, __pyx_L1_error)
- /*--- Global type/function init code ---*/
- (void)__Pyx_modinit_global_init_code();
- (void)__Pyx_modinit_variable_export_code();
- (void)__Pyx_modinit_function_export_code();
- if (unlikely(__Pyx_modinit_type_init_code() < 0)) __PYX_ERR(0, 1, __pyx_L1_error)
- (void)__Pyx_modinit_type_import_code();
- (void)__Pyx_modinit_variable_import_code();
- (void)__Pyx_modinit_function_import_code();
- /*--- Execution code ---*/
- #if defined(__Pyx_Generator_USED) || defined(__Pyx_Coroutine_USED)
- if (__Pyx_patch_abc() < 0) __PYX_ERR(0, 1, __pyx_L1_error)
- #endif
-
- /* "frozenlist/_frozenlist.pyx":1
- * from collections.abc import MutableSequence # <<<<<<<<<<<<<<
- *
- *
- */
- __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1, __pyx_L1_error)
- __Pyx_GOTREF(__pyx_t_1);
- __Pyx_INCREF(__pyx_n_s_MutableSequence);
- __Pyx_GIVEREF(__pyx_n_s_MutableSequence);
- PyList_SET_ITEM(__pyx_t_1, 0, __pyx_n_s_MutableSequence);
- __pyx_t_2 = __Pyx_Import(__pyx_n_s_collections_abc, __pyx_t_1, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1, __pyx_L1_error)
- __Pyx_GOTREF(__pyx_t_2);
- __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
- __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_MutableSequence); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1, __pyx_L1_error)
- __Pyx_GOTREF(__pyx_t_1);
- if (PyDict_SetItem(__pyx_d, __pyx_n_s_MutableSequence, __pyx_t_1) < 0) __PYX_ERR(0, 1, __pyx_L1_error)
- __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
- __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-
- /* "frozenlist/_frozenlist.pyx":114
- *
- *
- * MutableSequence.register(FrozenList) # <<<<<<<<<<<<<<
- */
- __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_MutableSequence); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 114, __pyx_L1_error)
- __Pyx_GOTREF(__pyx_t_2);
- __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_register); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 114, __pyx_L1_error)
- __Pyx_GOTREF(__pyx_t_1);
- __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
- __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_t_1, ((PyObject *)__pyx_ptype_10frozenlist_11_frozenlist_FrozenList)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 114, __pyx_L1_error)
- __Pyx_GOTREF(__pyx_t_2);
- __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
- __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-
- /* "(tree fragment)":1
- * def __pyx_unpickle_FrozenList(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<<
- * cdef object __pyx_PickleError
- * cdef object __pyx_result
- */
- __pyx_t_2 = PyCFunction_NewEx(&__pyx_mdef_10frozenlist_11_frozenlist_1__pyx_unpickle_FrozenList, NULL, __pyx_n_s_frozenlist__frozenlist); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 1, __pyx_L1_error)
- __Pyx_GOTREF(__pyx_t_2);
- if (PyDict_SetItem(__pyx_d, __pyx_n_s_pyx_unpickle_FrozenList, __pyx_t_2) < 0) __PYX_ERR(1, 1, __pyx_L1_error)
- __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-
- /* "frozenlist/_frozenlist.pyx":1
- * from collections.abc import MutableSequence # <<<<<<<<<<<<<<
- *
- *
- */
- __pyx_t_2 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1, __pyx_L1_error)
- __Pyx_GOTREF(__pyx_t_2);
- if (PyDict_SetItem(__pyx_d, __pyx_n_s_test, __pyx_t_2) < 0) __PYX_ERR(0, 1, __pyx_L1_error)
- __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-
- /*--- Wrapped vars code ---*/
-
- goto __pyx_L0;
- __pyx_L1_error:;
- __Pyx_XDECREF(__pyx_t_1);
- __Pyx_XDECREF(__pyx_t_2);
- if (__pyx_m) {
- if (__pyx_d) {
- __Pyx_AddTraceback("init frozenlist._frozenlist", __pyx_clineno, __pyx_lineno, __pyx_filename);
- }
- Py_CLEAR(__pyx_m);
- } else if (!PyErr_Occurred()) {
- PyErr_SetString(PyExc_ImportError, "init frozenlist._frozenlist");
- }
- __pyx_L0:;
- __Pyx_RefNannyFinishContext();
- #if CYTHON_PEP489_MULTI_PHASE_INIT
- return (__pyx_m != NULL) ? 0 : -1;
- #elif PY_MAJOR_VERSION >= 3
- return __pyx_m;
- #else
- return;
- #endif
-}
-
-/* --- Runtime support code --- */
-/* Refnanny */
-#if CYTHON_REFNANNY
-static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname) {
- PyObject *m = NULL, *p = NULL;
- void *r = NULL;
- m = PyImport_ImportModule(modname);
- if (!m) goto end;
- p = PyObject_GetAttrString(m, "RefNannyAPI");
- if (!p) goto end;
- r = PyLong_AsVoidPtr(p);
-end:
- Py_XDECREF(p);
- Py_XDECREF(m);
- return (__Pyx_RefNannyAPIStruct *)r;
-}
-#endif
-
-/* PyObjectGetAttrStr */
-#if CYTHON_USE_TYPE_SLOTS
-static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject* attr_name) {
- PyTypeObject* tp = Py_TYPE(obj);
- if (likely(tp->tp_getattro))
- return tp->tp_getattro(obj, attr_name);
-#if PY_MAJOR_VERSION < 3
- if (likely(tp->tp_getattr))
- return tp->tp_getattr(obj, PyString_AS_STRING(attr_name));
-#endif
- return PyObject_GetAttr(obj, attr_name);
-}
-#endif
-
-/* GetBuiltinName */
-static PyObject *__Pyx_GetBuiltinName(PyObject *name) {
- PyObject* result = __Pyx_PyObject_GetAttrStr(__pyx_b, name);
- if (unlikely(!result)) {
- PyErr_Format(PyExc_NameError,
-#if PY_MAJOR_VERSION >= 3
- "name '%U' is not defined", name);
-#else
- "name '%.200s' is not defined", PyString_AS_STRING(name));
-#endif
- }
- return result;
-}
-
-/* RaiseDoubleKeywords */
-static void __Pyx_RaiseDoubleKeywordsError(
- const char* func_name,
- PyObject* kw_name)
-{
- PyErr_Format(PyExc_TypeError,
- #if PY_MAJOR_VERSION >= 3
- "%s() got multiple values for keyword argument '%U'", func_name, kw_name);
- #else
- "%s() got multiple values for keyword argument '%s'", func_name,
- PyString_AsString(kw_name));
- #endif
-}
-
-/* ParseKeywords */
-static int __Pyx_ParseOptionalKeywords(
- PyObject *kwds,
- PyObject **argnames[],
- PyObject *kwds2,
- PyObject *values[],
- Py_ssize_t num_pos_args,
- const char* function_name)
-{
- PyObject *key = 0, *value = 0;
- Py_ssize_t pos = 0;
- PyObject*** name;
- PyObject*** first_kw_arg = argnames + num_pos_args;
- while (PyDict_Next(kwds, &pos, &key, &value)) {
- name = first_kw_arg;
- while (*name && (**name != key)) name++;
- if (*name) {
- values[name-argnames] = value;
- continue;
- }
- name = first_kw_arg;
- #if PY_MAJOR_VERSION < 3
- if (likely(PyString_Check(key))) {
- while (*name) {
- if ((CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**name) == PyString_GET_SIZE(key))
- && _PyString_Eq(**name, key)) {
- values[name-argnames] = value;
- break;
- }
- name++;
- }
- if (*name) continue;
- else {
- PyObject*** argname = argnames;
- while (argname != first_kw_arg) {
- if ((**argname == key) || (
- (CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**argname) == PyString_GET_SIZE(key))
- && _PyString_Eq(**argname, key))) {
- goto arg_passed_twice;
- }
- argname++;
- }
- }
- } else
- #endif
- if (likely(PyUnicode_Check(key))) {
- while (*name) {
- int cmp = (**name == key) ? 0 :
- #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3
- (__Pyx_PyUnicode_GET_LENGTH(**name) != __Pyx_PyUnicode_GET_LENGTH(key)) ? 1 :
- #endif
- PyUnicode_Compare(**name, key);
- if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad;
- if (cmp == 0) {
- values[name-argnames] = value;
- break;
- }
- name++;
- }
- if (*name) continue;
- else {
- PyObject*** argname = argnames;
- while (argname != first_kw_arg) {
- int cmp = (**argname == key) ? 0 :
- #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3
- (__Pyx_PyUnicode_GET_LENGTH(**argname) != __Pyx_PyUnicode_GET_LENGTH(key)) ? 1 :
- #endif
- PyUnicode_Compare(**argname, key);
- if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad;
- if (cmp == 0) goto arg_passed_twice;
- argname++;
- }
- }
- } else
- goto invalid_keyword_type;
- if (kwds2) {
- if (unlikely(PyDict_SetItem(kwds2, key, value))) goto bad;
- } else {
- goto invalid_keyword;
- }
- }
- return 0;
-arg_passed_twice:
- __Pyx_RaiseDoubleKeywordsError(function_name, key);
- goto bad;
-invalid_keyword_type:
- PyErr_Format(PyExc_TypeError,
- "%.200s() keywords must be strings", function_name);
- goto bad;
-invalid_keyword:
- PyErr_Format(PyExc_TypeError,
- #if PY_MAJOR_VERSION < 3
- "%.200s() got an unexpected keyword argument '%.200s'",
- function_name, PyString_AsString(key));
- #else
- "%s() got an unexpected keyword argument '%U'",
- function_name, key);
- #endif
-bad:
- return -1;
-}
-
-/* RaiseArgTupleInvalid */
-static void __Pyx_RaiseArgtupleInvalid(
- const char* func_name,
- int exact,
- Py_ssize_t num_min,
- Py_ssize_t num_max,
- Py_ssize_t num_found)
-{
- Py_ssize_t num_expected;
- const char *more_or_less;
- if (num_found < num_min) {
- num_expected = num_min;
- more_or_less = "at least";
- } else {
- num_expected = num_max;
- more_or_less = "at most";
- }
- if (exact) {
- more_or_less = "exactly";
- }
- PyErr_Format(PyExc_TypeError,
- "%.200s() takes %.8s %" CYTHON_FORMAT_SSIZE_T "d positional argument%.1s (%" CYTHON_FORMAT_SSIZE_T "d given)",
- func_name, more_or_less, num_expected,
- (num_expected == 1) ? "" : "s", num_found);
-}
-
-/* PyObjectCall */
-#if CYTHON_COMPILING_IN_CPYTHON
-static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw) {
- PyObject *result;
- ternaryfunc call = func->ob_type->tp_call;
- if (unlikely(!call))
- return PyObject_Call(func, arg, kw);
- if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object")))
- return NULL;
- result = (*call)(func, arg, kw);
- Py_LeaveRecursiveCall();
- if (unlikely(!result) && unlikely(!PyErr_Occurred())) {
- PyErr_SetString(
- PyExc_SystemError,
- "NULL result without error in PyObject_Call");
- }
- return result;
-}
-#endif
-
-/* PyErrFetchRestore */
-#if CYTHON_FAST_THREAD_STATE
-static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb) {
- PyObject *tmp_type, *tmp_value, *tmp_tb;
- tmp_type = tstate->curexc_type;
- tmp_value = tstate->curexc_value;
- tmp_tb = tstate->curexc_traceback;
- tstate->curexc_type = type;
- tstate->curexc_value = value;
- tstate->curexc_traceback = tb;
- Py_XDECREF(tmp_type);
- Py_XDECREF(tmp_value);
- Py_XDECREF(tmp_tb);
-}
-static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) {
- *type = tstate->curexc_type;
- *value = tstate->curexc_value;
- *tb = tstate->curexc_traceback;
- tstate->curexc_type = 0;
- tstate->curexc_value = 0;
- tstate->curexc_traceback = 0;
-}
-#endif
-
-/* RaiseException */
-#if PY_MAJOR_VERSION < 3
-static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb,
- CYTHON_UNUSED PyObject *cause) {
- __Pyx_PyThreadState_declare
- Py_XINCREF(type);
- if (!value || value == Py_None)
- value = NULL;
- else
- Py_INCREF(value);
- if (!tb || tb == Py_None)
- tb = NULL;
- else {
- Py_INCREF(tb);
- if (!PyTraceBack_Check(tb)) {
- PyErr_SetString(PyExc_TypeError,
- "raise: arg 3 must be a traceback or None");
- goto raise_error;
- }
- }
- if (PyType_Check(type)) {
-#if CYTHON_COMPILING_IN_PYPY
- if (!value) {
- Py_INCREF(Py_None);
- value = Py_None;
- }
-#endif
- PyErr_NormalizeException(&type, &value, &tb);
- } else {
- if (value) {
- PyErr_SetString(PyExc_TypeError,
- "instance exception may not have a separate value");
- goto raise_error;
- }
- value = type;
- type = (PyObject*) Py_TYPE(type);
- Py_INCREF(type);
- if (!PyType_IsSubtype((PyTypeObject *)type, (PyTypeObject *)PyExc_BaseException)) {
- PyErr_SetString(PyExc_TypeError,
- "raise: exception class must be a subclass of BaseException");
- goto raise_error;
- }
- }
- __Pyx_PyThreadState_assign
- __Pyx_ErrRestore(type, value, tb);
- return;
-raise_error:
- Py_XDECREF(value);
- Py_XDECREF(type);
- Py_XDECREF(tb);
- return;
-}
-#else
-static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause) {
- PyObject* owned_instance = NULL;
- if (tb == Py_None) {
- tb = 0;
- } else if (tb && !PyTraceBack_Check(tb)) {
- PyErr_SetString(PyExc_TypeError,
- "raise: arg 3 must be a traceback or None");
- goto bad;
- }
- if (value == Py_None)
- value = 0;
- if (PyExceptionInstance_Check(type)) {
- if (value) {
- PyErr_SetString(PyExc_TypeError,
- "instance exception may not have a separate value");
- goto bad;
- }
- value = type;
- type = (PyObject*) Py_TYPE(value);
- } else if (PyExceptionClass_Check(type)) {
- PyObject *instance_class = NULL;
- if (value && PyExceptionInstance_Check(value)) {
- instance_class = (PyObject*) Py_TYPE(value);
- if (instance_class != type) {
- int is_subclass = PyObject_IsSubclass(instance_class, type);
- if (!is_subclass) {
- instance_class = NULL;
- } else if (unlikely(is_subclass == -1)) {
- goto bad;
- } else {
- type = instance_class;
- }
- }
- }
- if (!instance_class) {
- PyObject *args;
- if (!value)
- args = PyTuple_New(0);
- else if (PyTuple_Check(value)) {
- Py_INCREF(value);
- args = value;
- } else
- args = PyTuple_Pack(1, value);
- if (!args)
- goto bad;
- owned_instance = PyObject_Call(type, args, NULL);
- Py_DECREF(args);
- if (!owned_instance)
- goto bad;
- value = owned_instance;
- if (!PyExceptionInstance_Check(value)) {
- PyErr_Format(PyExc_TypeError,
- "calling %R should have returned an instance of "
- "BaseException, not %R",
- type, Py_TYPE(value));
- goto bad;
- }
- }
- } else {
- PyErr_SetString(PyExc_TypeError,
- "raise: exception class must be a subclass of BaseException");
- goto bad;
- }
- if (cause) {
- PyObject *fixed_cause;
- if (cause == Py_None) {
- fixed_cause = NULL;
- } else if (PyExceptionClass_Check(cause)) {
- fixed_cause = PyObject_CallObject(cause, NULL);
- if (fixed_cause == NULL)
- goto bad;
- } else if (PyExceptionInstance_Check(cause)) {
- fixed_cause = cause;
- Py_INCREF(fixed_cause);
- } else {
- PyErr_SetString(PyExc_TypeError,
- "exception causes must derive from "
- "BaseException");
- goto bad;
- }
- PyException_SetCause(value, fixed_cause);
- }
- PyErr_SetObject(type, value);
- if (tb) {
-#if CYTHON_COMPILING_IN_PYPY
- PyObject *tmp_type, *tmp_value, *tmp_tb;
- PyErr_Fetch(&tmp_type, &tmp_value, &tmp_tb);
- Py_INCREF(tb);
- PyErr_Restore(tmp_type, tmp_value, tb);
- Py_XDECREF(tmp_tb);
-#else
- PyThreadState *tstate = __Pyx_PyThreadState_Current;
- PyObject* tmp_tb = tstate->curexc_traceback;
- if (tb != tmp_tb) {
- Py_INCREF(tb);
- tstate->curexc_traceback = tb;
- Py_XDECREF(tmp_tb);
- }
-#endif
- }
-bad:
- Py_XDECREF(owned_instance);
- return;
-}
-#endif
-
-/* GetItemInt */
-static PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j) {
- PyObject *r;
- if (!j) return NULL;
- r = PyObject_GetItem(o, j);
- Py_DECREF(j);
- return r;
-}
-static CYTHON_INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, Py_ssize_t i,
- CYTHON_NCP_UNUSED int wraparound,
- CYTHON_NCP_UNUSED int boundscheck) {
-#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
- Py_ssize_t wrapped_i = i;
- if (wraparound & unlikely(i < 0)) {
- wrapped_i += PyList_GET_SIZE(o);
- }
- if ((!boundscheck) || likely(__Pyx_is_valid_index(wrapped_i, PyList_GET_SIZE(o)))) {
- PyObject *r = PyList_GET_ITEM(o, wrapped_i);
- Py_INCREF(r);
- return r;
- }
- return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i));
-#else
- return PySequence_GetItem(o, i);
-#endif
-}
-static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize_t i,
- CYTHON_NCP_UNUSED int wraparound,
- CYTHON_NCP_UNUSED int boundscheck) {
-#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
- Py_ssize_t wrapped_i = i;
- if (wraparound & unlikely(i < 0)) {
- wrapped_i += PyTuple_GET_SIZE(o);
- }
- if ((!boundscheck) || likely(__Pyx_is_valid_index(wrapped_i, PyTuple_GET_SIZE(o)))) {
- PyObject *r = PyTuple_GET_ITEM(o, wrapped_i);
- Py_INCREF(r);
- return r;
- }
- return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i));
-#else
- return PySequence_GetItem(o, i);
-#endif
-}
-static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i, int is_list,
- CYTHON_NCP_UNUSED int wraparound,
- CYTHON_NCP_UNUSED int boundscheck) {
-#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS && CYTHON_USE_TYPE_SLOTS
- if (is_list || PyList_CheckExact(o)) {
- Py_ssize_t n = ((!wraparound) | likely(i >= 0)) ? i : i + PyList_GET_SIZE(o);
- if ((!boundscheck) || (likely(__Pyx_is_valid_index(n, PyList_GET_SIZE(o))))) {
- PyObject *r = PyList_GET_ITEM(o, n);
- Py_INCREF(r);
- return r;
- }
- }
- else if (PyTuple_CheckExact(o)) {
- Py_ssize_t n = ((!wraparound) | likely(i >= 0)) ? i : i + PyTuple_GET_SIZE(o);
- if ((!boundscheck) || likely(__Pyx_is_valid_index(n, PyTuple_GET_SIZE(o)))) {
- PyObject *r = PyTuple_GET_ITEM(o, n);
- Py_INCREF(r);
- return r;
- }
- } else {
- PySequenceMethods *m = Py_TYPE(o)->tp_as_sequence;
- if (likely(m && m->sq_item)) {
- if (wraparound && unlikely(i < 0) && likely(m->sq_length)) {
- Py_ssize_t l = m->sq_length(o);
- if (likely(l >= 0)) {
- i += l;
- } else {
- if (!PyErr_ExceptionMatches(PyExc_OverflowError))
- return NULL;
- PyErr_Clear();
- }
- }
- return m->sq_item(o, i);
- }
- }
-#else
- if (is_list || PySequence_Check(o)) {
- return PySequence_GetItem(o, i);
- }
-#endif
- return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i));
-}
-
-/* ObjectGetItem */
-#if CYTHON_USE_TYPE_SLOTS
-static PyObject *__Pyx_PyObject_GetIndex(PyObject *obj, PyObject* index) {
- PyObject *runerr;
- Py_ssize_t key_value;
- PySequenceMethods *m = Py_TYPE(obj)->tp_as_sequence;
- if (unlikely(!(m && m->sq_item))) {
- PyErr_Format(PyExc_TypeError, "'%.200s' object is not subscriptable", Py_TYPE(obj)->tp_name);
- return NULL;
- }
- key_value = __Pyx_PyIndex_AsSsize_t(index);
- if (likely(key_value != -1 || !(runerr = PyErr_Occurred()))) {
- return __Pyx_GetItemInt_Fast(obj, key_value, 0, 1, 1);
- }
- if (PyErr_GivenExceptionMatches(runerr, PyExc_OverflowError)) {
- PyErr_Clear();
- PyErr_Format(PyExc_IndexError, "cannot fit '%.200s' into an index-sized integer", Py_TYPE(index)->tp_name);
- }
- return NULL;
-}
-static PyObject *__Pyx_PyObject_GetItem(PyObject *obj, PyObject* key) {
- PyMappingMethods *m = Py_TYPE(obj)->tp_as_mapping;
- if (likely(m && m->mp_subscript)) {
- return m->mp_subscript(obj, key);
- }
- return __Pyx_PyObject_GetIndex(obj, key);
-}
-#endif
-
-/* PyFunctionFastCall */
-#if CYTHON_FAST_PYCALL
-static PyObject* __Pyx_PyFunction_FastCallNoKw(PyCodeObject *co, PyObject **args, Py_ssize_t na,
- PyObject *globals) {
- PyFrameObject *f;
- PyThreadState *tstate = __Pyx_PyThreadState_Current;
- PyObject **fastlocals;
- Py_ssize_t i;
- PyObject *result;
- assert(globals != NULL);
- /* XXX Perhaps we should create a specialized
- PyFrame_New() that doesn't take locals, but does
- take builtins without sanity checking them.
- */
- assert(tstate != NULL);
- f = PyFrame_New(tstate, co, globals, NULL);
- if (f == NULL) {
- return NULL;
- }
- fastlocals = __Pyx_PyFrame_GetLocalsplus(f);
- for (i = 0; i < na; i++) {
- Py_INCREF(*args);
- fastlocals[i] = *args++;
- }
- result = PyEval_EvalFrameEx(f,0);
- ++tstate->recursion_depth;
- Py_DECREF(f);
- --tstate->recursion_depth;
- return result;
-}
-#if 1 || PY_VERSION_HEX < 0x030600B1
-static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, Py_ssize_t nargs, PyObject *kwargs) {
- PyCodeObject *co = (PyCodeObject *)PyFunction_GET_CODE(func);
- PyObject *globals = PyFunction_GET_GLOBALS(func);
- PyObject *argdefs = PyFunction_GET_DEFAULTS(func);
- PyObject *closure;
-#if PY_MAJOR_VERSION >= 3
- PyObject *kwdefs;
-#endif
- PyObject *kwtuple, **k;
- PyObject **d;
- Py_ssize_t nd;
- Py_ssize_t nk;
- PyObject *result;
- assert(kwargs == NULL || PyDict_Check(kwargs));
- nk = kwargs ? PyDict_Size(kwargs) : 0;
- if (Py_EnterRecursiveCall((char*)" while calling a Python object")) {
- return NULL;
- }
- if (
-#if PY_MAJOR_VERSION >= 3
- co->co_kwonlyargcount == 0 &&
-#endif
- likely(kwargs == NULL || nk == 0) &&
- co->co_flags == (CO_OPTIMIZED | CO_NEWLOCALS | CO_NOFREE)) {
- if (argdefs == NULL && co->co_argcount == nargs) {
- result = __Pyx_PyFunction_FastCallNoKw(co, args, nargs, globals);
- goto done;
- }
- else if (nargs == 0 && argdefs != NULL
- && co->co_argcount == Py_SIZE(argdefs)) {
- /* function called with no arguments, but all parameters have
- a default value: use default values as arguments .*/
- args = &PyTuple_GET_ITEM(argdefs, 0);
- result =__Pyx_PyFunction_FastCallNoKw(co, args, Py_SIZE(argdefs), globals);
- goto done;
- }
- }
- if (kwargs != NULL) {
- Py_ssize_t pos, i;
- kwtuple = PyTuple_New(2 * nk);
- if (kwtuple == NULL) {
- result = NULL;
- goto done;
- }
- k = &PyTuple_GET_ITEM(kwtuple, 0);
- pos = i = 0;
- while (PyDict_Next(kwargs, &pos, &k[i], &k[i+1])) {
- Py_INCREF(k[i]);
- Py_INCREF(k[i+1]);
- i += 2;
- }
- nk = i / 2;
- }
- else {
- kwtuple = NULL;
- k = NULL;
- }
- closure = PyFunction_GET_CLOSURE(func);
-#if PY_MAJOR_VERSION >= 3
- kwdefs = PyFunction_GET_KW_DEFAULTS(func);
-#endif
- if (argdefs != NULL) {
- d = &PyTuple_GET_ITEM(argdefs, 0);
- nd = Py_SIZE(argdefs);
- }
- else {
- d = NULL;
- nd = 0;
- }
-#if PY_MAJOR_VERSION >= 3
- result = PyEval_EvalCodeEx((PyObject*)co, globals, (PyObject *)NULL,
- args, (int)nargs,
- k, (int)nk,
- d, (int)nd, kwdefs, closure);
-#else
- result = PyEval_EvalCodeEx(co, globals, (PyObject *)NULL,
- args, (int)nargs,
- k, (int)nk,
- d, (int)nd, closure);
-#endif
- Py_XDECREF(kwtuple);
-done:
- Py_LeaveRecursiveCall();
- return result;
-}
-#endif
-#endif
-
-/* PyObjectCallMethO */
-#if CYTHON_COMPILING_IN_CPYTHON
-static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject *arg) {
- PyObject *self, *result;
- PyCFunction cfunc;
- cfunc = PyCFunction_GET_FUNCTION(func);
- self = PyCFunction_GET_SELF(func);
- if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object")))
- return NULL;
- result = cfunc(self, arg);
- Py_LeaveRecursiveCall();
- if (unlikely(!result) && unlikely(!PyErr_Occurred())) {
- PyErr_SetString(
- PyExc_SystemError,
- "NULL result without error in PyObject_Call");
- }
- return result;
-}
-#endif
-
-/* PyObjectCallNoArg */
-#if CYTHON_COMPILING_IN_CPYTHON
-static CYTHON_INLINE PyObject* __Pyx_PyObject_CallNoArg(PyObject *func) {
-#if CYTHON_FAST_PYCALL
- if (PyFunction_Check(func)) {
- return __Pyx_PyFunction_FastCall(func, NULL, 0);
- }
-#endif
-#ifdef __Pyx_CyFunction_USED
- if (likely(PyCFunction_Check(func) || __Pyx_CyFunction_Check(func)))
-#else
- if (likely(PyCFunction_Check(func)))
-#endif
- {
- if (likely(PyCFunction_GET_FLAGS(func) & METH_NOARGS)) {
- return __Pyx_PyObject_CallMethO(func, NULL);
- }
- }
- return __Pyx_PyObject_Call(func, __pyx_empty_tuple, NULL);
-}
-#endif
-
-/* PyCFunctionFastCall */
-#if CYTHON_FAST_PYCCALL
-static CYTHON_INLINE PyObject * __Pyx_PyCFunction_FastCall(PyObject *func_obj, PyObject **args, Py_ssize_t nargs) {
- PyCFunctionObject *func = (PyCFunctionObject*)func_obj;
- PyCFunction meth = PyCFunction_GET_FUNCTION(func);
- PyObject *self = PyCFunction_GET_SELF(func);
- int flags = PyCFunction_GET_FLAGS(func);
- assert(PyCFunction_Check(func));
- assert(METH_FASTCALL == (flags & ~(METH_CLASS | METH_STATIC | METH_COEXIST | METH_KEYWORDS | METH_STACKLESS)));
- assert(nargs >= 0);
- assert(nargs == 0 || args != NULL);
- /* _PyCFunction_FastCallDict() must not be called with an exception set,
- because it may clear it (directly or indirectly) and so the
- caller loses its exception */
- assert(!PyErr_Occurred());
- if ((PY_VERSION_HEX < 0x030700A0) || unlikely(flags & METH_KEYWORDS)) {
- return (*((__Pyx_PyCFunctionFastWithKeywords)(void*)meth)) (self, args, nargs, NULL);
- } else {
- return (*((__Pyx_PyCFunctionFast)(void*)meth)) (self, args, nargs);
- }
-}
-#endif
-
-/* PyObjectCallOneArg */
-#if CYTHON_COMPILING_IN_CPYTHON
-static PyObject* __Pyx__PyObject_CallOneArg(PyObject *func, PyObject *arg) {
- PyObject *result;
- PyObject *args = PyTuple_New(1);
- if (unlikely(!args)) return NULL;
- Py_INCREF(arg);
- PyTuple_SET_ITEM(args, 0, arg);
- result = __Pyx_PyObject_Call(func, args, NULL);
- Py_DECREF(args);
- return result;
-}
-static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg) {
-#if CYTHON_FAST_PYCALL
- if (PyFunction_Check(func)) {
- return __Pyx_PyFunction_FastCall(func, &arg, 1);
- }
-#endif
- if (likely(PyCFunction_Check(func))) {
- if (likely(PyCFunction_GET_FLAGS(func) & METH_O)) {
- return __Pyx_PyObject_CallMethO(func, arg);
-#if CYTHON_FAST_PYCCALL
- } else if (PyCFunction_GET_FLAGS(func) & METH_FASTCALL) {
- return __Pyx_PyCFunction_FastCall(func, &arg, 1);
-#endif
- }
- }
- return __Pyx__PyObject_CallOneArg(func, arg);
-}
-#else
-static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg) {
- PyObject *result;
- PyObject *args = PyTuple_Pack(1, arg);
- if (unlikely(!args)) return NULL;
- result = __Pyx_PyObject_Call(func, args, NULL);
- Py_DECREF(args);
- return result;
-}
-#endif
-
-/* PyIntCompare */
-static CYTHON_INLINE PyObject* __Pyx_PyInt_EqObjC(PyObject *op1, PyObject *op2, CYTHON_UNUSED long intval, CYTHON_UNUSED long inplace) {
- if (op1 == op2) {
- Py_RETURN_TRUE;
- }
- #if PY_MAJOR_VERSION < 3
- if (likely(PyInt_CheckExact(op1))) {
- const long b = intval;
- long a = PyInt_AS_LONG(op1);
- if (a == b) Py_RETURN_TRUE; else Py_RETURN_FALSE;
- }
- #endif
- #if CYTHON_USE_PYLONG_INTERNALS
- if (likely(PyLong_CheckExact(op1))) {
- int unequal;
- unsigned long uintval;
- Py_ssize_t size = Py_SIZE(op1);
- const digit* digits = ((PyLongObject*)op1)->ob_digit;
- if (intval == 0) {
- if (size == 0) Py_RETURN_TRUE; else Py_RETURN_FALSE;
- } else if (intval < 0) {
- if (size >= 0)
- Py_RETURN_FALSE;
- intval = -intval;
- size = -size;
- } else {
- if (size <= 0)
- Py_RETURN_FALSE;
- }
- uintval = (unsigned long) intval;
-#if PyLong_SHIFT * 4 < SIZEOF_LONG*8
- if (uintval >> (PyLong_SHIFT * 4)) {
- unequal = (size != 5) || (digits[0] != (uintval & (unsigned long) PyLong_MASK))
- | (digits[1] != ((uintval >> (1 * PyLong_SHIFT)) & (unsigned long) PyLong_MASK)) | (digits[2] != ((uintval >> (2 * PyLong_SHIFT)) & (unsigned long) PyLong_MASK)) | (digits[3] != ((uintval >> (3 * PyLong_SHIFT)) & (unsigned long) PyLong_MASK)) | (digits[4] != ((uintval >> (4 * PyLong_SHIFT)) & (unsigned long) PyLong_MASK));
- } else
-#endif
-#if PyLong_SHIFT * 3 < SIZEOF_LONG*8
- if (uintval >> (PyLong_SHIFT * 3)) {
- unequal = (size != 4) || (digits[0] != (uintval & (unsigned long) PyLong_MASK))
- | (digits[1] != ((uintval >> (1 * PyLong_SHIFT)) & (unsigned long) PyLong_MASK)) | (digits[2] != ((uintval >> (2 * PyLong_SHIFT)) & (unsigned long) PyLong_MASK)) | (digits[3] != ((uintval >> (3 * PyLong_SHIFT)) & (unsigned long) PyLong_MASK));
- } else
-#endif
-#if PyLong_SHIFT * 2 < SIZEOF_LONG*8
- if (uintval >> (PyLong_SHIFT * 2)) {
- unequal = (size != 3) || (digits[0] != (uintval & (unsigned long) PyLong_MASK))
- | (digits[1] != ((uintval >> (1 * PyLong_SHIFT)) & (unsigned long) PyLong_MASK)) | (digits[2] != ((uintval >> (2 * PyLong_SHIFT)) & (unsigned long) PyLong_MASK));
- } else
-#endif
-#if PyLong_SHIFT * 1 < SIZEOF_LONG*8
- if (uintval >> (PyLong_SHIFT * 1)) {
- unequal = (size != 2) || (digits[0] != (uintval & (unsigned long) PyLong_MASK))
- | (digits[1] != ((uintval >> (1 * PyLong_SHIFT)) & (unsigned long) PyLong_MASK));
- } else
-#endif
- unequal = (size != 1) || (((unsigned long) digits[0]) != (uintval & (unsigned long) PyLong_MASK));
- if (unequal == 0) Py_RETURN_TRUE; else Py_RETURN_FALSE;
- }
- #endif
- if (PyFloat_CheckExact(op1)) {
- const long b = intval;
- double a = PyFloat_AS_DOUBLE(op1);
- if ((double)a == (double)b) Py_RETURN_TRUE; else Py_RETURN_FALSE;
- }
- return (
- PyObject_RichCompare(op1, op2, Py_EQ));
-}
-
-/* PyObjectCall2Args */
-static CYTHON_UNUSED PyObject* __Pyx_PyObject_Call2Args(PyObject* function, PyObject* arg1, PyObject* arg2) {
- PyObject *args, *result = NULL;
- #if CYTHON_FAST_PYCALL
- if (PyFunction_Check(function)) {
- PyObject *args[2] = {arg1, arg2};
- return __Pyx_PyFunction_FastCall(function, args, 2);
- }
- #endif
- #if CYTHON_FAST_PYCCALL
- if (__Pyx_PyFastCFunction_Check(function)) {
- PyObject *args[2] = {arg1, arg2};
- return __Pyx_PyCFunction_FastCall(function, args, 2);
- }
- #endif
- args = PyTuple_New(2);
- if (unlikely(!args)) goto done;
- Py_INCREF(arg1);
- PyTuple_SET_ITEM(args, 0, arg1);
- Py_INCREF(arg2);
- PyTuple_SET_ITEM(args, 1, arg2);
- Py_INCREF(function);
- result = __Pyx_PyObject_Call(function, args, NULL);
- Py_DECREF(args);
- Py_DECREF(function);
-done:
- return result;
-}
-
-/* PyObjectGetMethod */
-static int __Pyx_PyObject_GetMethod(PyObject *obj, PyObject *name, PyObject **method) {
- PyObject *attr;
-#if CYTHON_UNPACK_METHODS && CYTHON_COMPILING_IN_CPYTHON && CYTHON_USE_PYTYPE_LOOKUP
- PyTypeObject *tp = Py_TYPE(obj);
- PyObject *descr;
- descrgetfunc f = NULL;
- PyObject **dictptr, *dict;
- int meth_found = 0;
- assert (*method == NULL);
- if (unlikely(tp->tp_getattro != PyObject_GenericGetAttr)) {
- attr = __Pyx_PyObject_GetAttrStr(obj, name);
- goto try_unpack;
- }
- if (unlikely(tp->tp_dict == NULL) && unlikely(PyType_Ready(tp) < 0)) {
- return 0;
- }
- descr = _PyType_Lookup(tp, name);
- if (likely(descr != NULL)) {
- Py_INCREF(descr);
-#if PY_MAJOR_VERSION >= 3
- #ifdef __Pyx_CyFunction_USED
- if (likely(PyFunction_Check(descr) || (Py_TYPE(descr) == &PyMethodDescr_Type) || __Pyx_CyFunction_Check(descr)))
- #else
- if (likely(PyFunction_Check(descr) || (Py_TYPE(descr) == &PyMethodDescr_Type)))
- #endif
-#else
- #ifdef __Pyx_CyFunction_USED
- if (likely(PyFunction_Check(descr) || __Pyx_CyFunction_Check(descr)))
- #else
- if (likely(PyFunction_Check(descr)))
- #endif
-#endif
- {
- meth_found = 1;
- } else {
- f = Py_TYPE(descr)->tp_descr_get;
- if (f != NULL && PyDescr_IsData(descr)) {
- attr = f(descr, obj, (PyObject *)Py_TYPE(obj));
- Py_DECREF(descr);
- goto try_unpack;
- }
- }
- }
- dictptr = _PyObject_GetDictPtr(obj);
- if (dictptr != NULL && (dict = *dictptr) != NULL) {
- Py_INCREF(dict);
- attr = __Pyx_PyDict_GetItemStr(dict, name);
- if (attr != NULL) {
- Py_INCREF(attr);
- Py_DECREF(dict);
- Py_XDECREF(descr);
- goto try_unpack;
- }
- Py_DECREF(dict);
- }
- if (meth_found) {
- *method = descr;
- return 1;
- }
- if (f != NULL) {
- attr = f(descr, obj, (PyObject *)Py_TYPE(obj));
- Py_DECREF(descr);
- goto try_unpack;
- }
- if (descr != NULL) {
- *method = descr;
- return 0;
- }
- PyErr_Format(PyExc_AttributeError,
-#if PY_MAJOR_VERSION >= 3
- "'%.50s' object has no attribute '%U'",
- tp->tp_name, name);
-#else
- "'%.50s' object has no attribute '%.400s'",
- tp->tp_name, PyString_AS_STRING(name));
-#endif
- return 0;
-#else
- attr = __Pyx_PyObject_GetAttrStr(obj, name);
- goto try_unpack;
-#endif
-try_unpack:
-#if CYTHON_UNPACK_METHODS
- if (likely(attr) && PyMethod_Check(attr) && likely(PyMethod_GET_SELF(attr) == obj)) {
- PyObject *function = PyMethod_GET_FUNCTION(attr);
- Py_INCREF(function);
- Py_DECREF(attr);
- *method = function;
- return 1;
- }
-#endif
- *method = attr;
- return 0;
-}
-
-/* PyObjectCallMethod1 */
-static PyObject* __Pyx__PyObject_CallMethod1(PyObject* method, PyObject* arg) {
- PyObject *result = __Pyx_PyObject_CallOneArg(method, arg);
- Py_DECREF(method);
- return result;
-}
-static PyObject* __Pyx_PyObject_CallMethod1(PyObject* obj, PyObject* method_name, PyObject* arg) {
- PyObject *method = NULL, *result;
- int is_method = __Pyx_PyObject_GetMethod(obj, method_name, &method);
- if (likely(is_method)) {
- result = __Pyx_PyObject_Call2Args(method, obj, arg);
- Py_DECREF(method);
- return result;
- }
- if (unlikely(!method)) return NULL;
- return __Pyx__PyObject_CallMethod1(method, arg);
-}
-
-/* pop_index */
-static PyObject* __Pyx__PyObject_PopNewIndex(PyObject* L, PyObject* py_ix) {
- PyObject *r;
- if (unlikely(!py_ix)) return NULL;
- r = __Pyx__PyObject_PopIndex(L, py_ix);
- Py_DECREF(py_ix);
- return r;
-}
-static PyObject* __Pyx__PyObject_PopIndex(PyObject* L, PyObject* py_ix) {
- return __Pyx_PyObject_CallMethod1(L, __pyx_n_s_pop, py_ix);
-}
-#if CYTHON_USE_PYLIST_INTERNALS && CYTHON_ASSUME_SAFE_MACROS
-static PyObject* __Pyx__PyList_PopIndex(PyObject* L, PyObject* py_ix, Py_ssize_t ix) {
- Py_ssize_t size = PyList_GET_SIZE(L);
- if (likely(size > (((PyListObject*)L)->allocated >> 1))) {
- Py_ssize_t cix = ix;
- if (cix < 0) {
- cix += size;
- }
- if (likely(__Pyx_is_valid_index(cix, size))) {
- PyObject* v = PyList_GET_ITEM(L, cix);
- __Pyx_SET_SIZE(L, Py_SIZE(L) - 1);
- size -= 1;
- memmove(&PyList_GET_ITEM(L, cix), &PyList_GET_ITEM(L, cix+1), (size_t)(size-cix)*sizeof(PyObject*));
- return v;
- }
- }
- if (py_ix == Py_None) {
- return __Pyx__PyObject_PopNewIndex(L, PyInt_FromSsize_t(ix));
- } else {
- return __Pyx__PyObject_PopIndex(L, py_ix);
- }
-}
-#endif
-
-/* PyErrExceptionMatches */
-#if CYTHON_FAST_THREAD_STATE
-static int __Pyx_PyErr_ExceptionMatchesTuple(PyObject *exc_type, PyObject *tuple) {
- Py_ssize_t i, n;
- n = PyTuple_GET_SIZE(tuple);
-#if PY_MAJOR_VERSION >= 3
- for (i=0; icurexc_type;
- if (exc_type == err) return 1;
- if (unlikely(!exc_type)) return 0;
- if (unlikely(PyTuple_Check(err)))
- return __Pyx_PyErr_ExceptionMatchesTuple(exc_type, err);
- return __Pyx_PyErr_GivenExceptionMatches(exc_type, err);
-}
-#endif
-
-/* GetAttr */
-static CYTHON_INLINE PyObject *__Pyx_GetAttr(PyObject *o, PyObject *n) {
-#if CYTHON_USE_TYPE_SLOTS
-#if PY_MAJOR_VERSION >= 3
- if (likely(PyUnicode_Check(n)))
-#else
- if (likely(PyString_Check(n)))
-#endif
- return __Pyx_PyObject_GetAttrStr(o, n);
-#endif
- return PyObject_GetAttr(o, n);
-}
-
-/* GetAttr3 */
-static PyObject *__Pyx_GetAttr3Default(PyObject *d) {
- __Pyx_PyThreadState_declare
- __Pyx_PyThreadState_assign
- if (unlikely(!__Pyx_PyErr_ExceptionMatches(PyExc_AttributeError)))
- return NULL;
- __Pyx_PyErr_Clear();
- Py_INCREF(d);
- return d;
-}
-static CYTHON_INLINE PyObject *__Pyx_GetAttr3(PyObject *o, PyObject *n, PyObject *d) {
- PyObject *r = __Pyx_GetAttr(o, n);
- return (likely(r)) ? r : __Pyx_GetAttr3Default(d);
-}
-
-/* PyDictVersioning */
-#if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_TYPE_SLOTS
-static CYTHON_INLINE PY_UINT64_T __Pyx_get_tp_dict_version(PyObject *obj) {
- PyObject *dict = Py_TYPE(obj)->tp_dict;
- return likely(dict) ? __PYX_GET_DICT_VERSION(dict) : 0;
-}
-static CYTHON_INLINE PY_UINT64_T __Pyx_get_object_dict_version(PyObject *obj) {
- PyObject **dictptr = NULL;
- Py_ssize_t offset = Py_TYPE(obj)->tp_dictoffset;
- if (offset) {
-#if CYTHON_COMPILING_IN_CPYTHON
- dictptr = (likely(offset > 0)) ? (PyObject **) ((char *)obj + offset) : _PyObject_GetDictPtr(obj);
-#else
- dictptr = _PyObject_GetDictPtr(obj);
-#endif
- }
- return (dictptr && *dictptr) ? __PYX_GET_DICT_VERSION(*dictptr) : 0;
-}
-static CYTHON_INLINE int __Pyx_object_dict_version_matches(PyObject* obj, PY_UINT64_T tp_dict_version, PY_UINT64_T obj_dict_version) {
- PyObject *dict = Py_TYPE(obj)->tp_dict;
- if (unlikely(!dict) || unlikely(tp_dict_version != __PYX_GET_DICT_VERSION(dict)))
- return 0;
- return obj_dict_version == __Pyx_get_object_dict_version(obj);
-}
-#endif
-
-/* GetModuleGlobalName */
-#if CYTHON_USE_DICT_VERSIONS
-static PyObject *__Pyx__GetModuleGlobalName(PyObject *name, PY_UINT64_T *dict_version, PyObject **dict_cached_value)
-#else
-static CYTHON_INLINE PyObject *__Pyx__GetModuleGlobalName(PyObject *name)
-#endif
-{
- PyObject *result;
-#if !CYTHON_AVOID_BORROWED_REFS
-#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030500A1
- result = _PyDict_GetItem_KnownHash(__pyx_d, name, ((PyASCIIObject *) name)->hash);
- __PYX_UPDATE_DICT_CACHE(__pyx_d, result, *dict_cached_value, *dict_version)
- if (likely(result)) {
- return __Pyx_NewRef(result);
- } else if (unlikely(PyErr_Occurred())) {
- return NULL;
- }
-#else
- result = PyDict_GetItem(__pyx_d, name);
- __PYX_UPDATE_DICT_CACHE(__pyx_d, result, *dict_cached_value, *dict_version)
- if (likely(result)) {
- return __Pyx_NewRef(result);
- }
-#endif
-#else
- result = PyObject_GetItem(__pyx_d, name);
- __PYX_UPDATE_DICT_CACHE(__pyx_d, result, *dict_cached_value, *dict_version)
- if (likely(result)) {
- return __Pyx_NewRef(result);
- }
- PyErr_Clear();
-#endif
- return __Pyx_GetBuiltinName(name);
-}
-
-/* Import */
-static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level) {
- PyObject *empty_list = 0;
- PyObject *module = 0;
- PyObject *global_dict = 0;
- PyObject *empty_dict = 0;
- PyObject *list;
- #if PY_MAJOR_VERSION < 3
- PyObject *py_import;
- py_import = __Pyx_PyObject_GetAttrStr(__pyx_b, __pyx_n_s_import);
- if (!py_import)
- goto bad;
- #endif
- if (from_list)
- list = from_list;
- else {
- empty_list = PyList_New(0);
- if (!empty_list)
- goto bad;
- list = empty_list;
- }
- global_dict = PyModule_GetDict(__pyx_m);
- if (!global_dict)
- goto bad;
- empty_dict = PyDict_New();
- if (!empty_dict)
- goto bad;
- {
- #if PY_MAJOR_VERSION >= 3
- if (level == -1) {
- if ((1) && (strchr(__Pyx_MODULE_NAME, '.'))) {
- module = PyImport_ImportModuleLevelObject(
- name, global_dict, empty_dict, list, 1);
- if (!module) {
- if (!PyErr_ExceptionMatches(PyExc_ImportError))
- goto bad;
- PyErr_Clear();
- }
- }
- level = 0;
- }
- #endif
- if (!module) {
- #if PY_MAJOR_VERSION < 3
- PyObject *py_level = PyInt_FromLong(level);
- if (!py_level)
- goto bad;
- module = PyObject_CallFunctionObjArgs(py_import,
- name, global_dict, empty_dict, list, py_level, (PyObject *)NULL);
- Py_DECREF(py_level);
- #else
- module = PyImport_ImportModuleLevelObject(
- name, global_dict, empty_dict, list, level);
- #endif
- }
- }
-bad:
- #if PY_MAJOR_VERSION < 3
- Py_XDECREF(py_import);
- #endif
- Py_XDECREF(empty_list);
- Py_XDECREF(empty_dict);
- return module;
-}
-
-/* ImportFrom */
-static PyObject* __Pyx_ImportFrom(PyObject* module, PyObject* name) {
- PyObject* value = __Pyx_PyObject_GetAttrStr(module, name);
- if (unlikely(!value) && PyErr_ExceptionMatches(PyExc_AttributeError)) {
- PyErr_Format(PyExc_ImportError,
- #if PY_MAJOR_VERSION < 3
- "cannot import name %.230s", PyString_AS_STRING(name));
- #else
- "cannot import name %S", name);
- #endif
- }
- return value;
-}
-
-/* HasAttr */
-static CYTHON_INLINE int __Pyx_HasAttr(PyObject *o, PyObject *n) {
- PyObject *r;
- if (unlikely(!__Pyx_PyBaseString_Check(n))) {
- PyErr_SetString(PyExc_TypeError,
- "hasattr(): attribute name must be string");
- return -1;
- }
- r = __Pyx_GetAttr(o, n);
- if (unlikely(!r)) {
- PyErr_Clear();
- return 0;
- } else {
- Py_DECREF(r);
- return 1;
- }
-}
-
-/* PyObject_GenericGetAttrNoDict */
-#if CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP && PY_VERSION_HEX < 0x03070000
-static PyObject *__Pyx_RaiseGenericGetAttributeError(PyTypeObject *tp, PyObject *attr_name) {
- PyErr_Format(PyExc_AttributeError,
-#if PY_MAJOR_VERSION >= 3
- "'%.50s' object has no attribute '%U'",
- tp->tp_name, attr_name);
-#else
- "'%.50s' object has no attribute '%.400s'",
- tp->tp_name, PyString_AS_STRING(attr_name));
-#endif
- return NULL;
-}
-static CYTHON_INLINE PyObject* __Pyx_PyObject_GenericGetAttrNoDict(PyObject* obj, PyObject* attr_name) {
- PyObject *descr;
- PyTypeObject *tp = Py_TYPE(obj);
- if (unlikely(!PyString_Check(attr_name))) {
- return PyObject_GenericGetAttr(obj, attr_name);
- }
- assert(!tp->tp_dictoffset);
- descr = _PyType_Lookup(tp, attr_name);
- if (unlikely(!descr)) {
- return __Pyx_RaiseGenericGetAttributeError(tp, attr_name);
- }
- Py_INCREF(descr);
- #if PY_MAJOR_VERSION < 3
- if (likely(PyType_HasFeature(Py_TYPE(descr), Py_TPFLAGS_HAVE_CLASS)))
- #endif
- {
- descrgetfunc f = Py_TYPE(descr)->tp_descr_get;
- if (unlikely(f)) {
- PyObject *res = f(descr, obj, (PyObject *)tp);
- Py_DECREF(descr);
- return res;
- }
- }
- return descr;
-}
-#endif
-
-/* PyObject_GenericGetAttr */
-#if CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP && PY_VERSION_HEX < 0x03070000
-static PyObject* __Pyx_PyObject_GenericGetAttr(PyObject* obj, PyObject* attr_name) {
- if (unlikely(Py_TYPE(obj)->tp_dictoffset)) {
- return PyObject_GenericGetAttr(obj, attr_name);
- }
- return __Pyx_PyObject_GenericGetAttrNoDict(obj, attr_name);
-}
-#endif
-
-/* SetVTable */
-static int __Pyx_SetVtable(PyObject *dict, void *vtable) {
-#if PY_VERSION_HEX >= 0x02070000
- PyObject *ob = PyCapsule_New(vtable, 0, 0);
-#else
- PyObject *ob = PyCObject_FromVoidPtr(vtable, 0);
-#endif
- if (!ob)
- goto bad;
- if (PyDict_SetItem(dict, __pyx_n_s_pyx_vtable, ob) < 0)
- goto bad;
- Py_DECREF(ob);
- return 0;
-bad:
- Py_XDECREF(ob);
- return -1;
-}
-
-/* PyObjectGetAttrStrNoError */
-static void __Pyx_PyObject_GetAttrStr_ClearAttributeError(void) {
- __Pyx_PyThreadState_declare
- __Pyx_PyThreadState_assign
- if (likely(__Pyx_PyErr_ExceptionMatches(PyExc_AttributeError)))
- __Pyx_PyErr_Clear();
-}
-static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStrNoError(PyObject* obj, PyObject* attr_name) {
- PyObject *result;
-#if CYTHON_COMPILING_IN_CPYTHON && CYTHON_USE_TYPE_SLOTS && PY_VERSION_HEX >= 0x030700B1
- PyTypeObject* tp = Py_TYPE(obj);
- if (likely(tp->tp_getattro == PyObject_GenericGetAttr)) {
- return _PyObject_GenericGetAttrWithDict(obj, attr_name, NULL, 1);
- }
-#endif
- result = __Pyx_PyObject_GetAttrStr(obj, attr_name);
- if (unlikely(!result)) {
- __Pyx_PyObject_GetAttrStr_ClearAttributeError();
- }
- return result;
-}
-
-/* SetupReduce */
-static int __Pyx_setup_reduce_is_named(PyObject* meth, PyObject* name) {
- int ret;
- PyObject *name_attr;
- name_attr = __Pyx_PyObject_GetAttrStr(meth, __pyx_n_s_name);
- if (likely(name_attr)) {
- ret = PyObject_RichCompareBool(name_attr, name, Py_EQ);
- } else {
- ret = -1;
- }
- if (unlikely(ret < 0)) {
- PyErr_Clear();
- ret = 0;
- }
- Py_XDECREF(name_attr);
- return ret;
-}
-static int __Pyx_setup_reduce(PyObject* type_obj) {
- int ret = 0;
- PyObject *object_reduce = NULL;
- PyObject *object_reduce_ex = NULL;
- PyObject *reduce = NULL;
- PyObject *reduce_ex = NULL;
- PyObject *reduce_cython = NULL;
- PyObject *setstate = NULL;
- PyObject *setstate_cython = NULL;
-#if CYTHON_USE_PYTYPE_LOOKUP
- if (_PyType_Lookup((PyTypeObject*)type_obj, __pyx_n_s_getstate)) goto __PYX_GOOD;
-#else
- if (PyObject_HasAttr(type_obj, __pyx_n_s_getstate)) goto __PYX_GOOD;
-#endif
-#if CYTHON_USE_PYTYPE_LOOKUP
- object_reduce_ex = _PyType_Lookup(&PyBaseObject_Type, __pyx_n_s_reduce_ex); if (!object_reduce_ex) goto __PYX_BAD;
-#else
- object_reduce_ex = __Pyx_PyObject_GetAttrStr((PyObject*)&PyBaseObject_Type, __pyx_n_s_reduce_ex); if (!object_reduce_ex) goto __PYX_BAD;
-#endif
- reduce_ex = __Pyx_PyObject_GetAttrStr(type_obj, __pyx_n_s_reduce_ex); if (unlikely(!reduce_ex)) goto __PYX_BAD;
- if (reduce_ex == object_reduce_ex) {
-#if CYTHON_USE_PYTYPE_LOOKUP
- object_reduce = _PyType_Lookup(&PyBaseObject_Type, __pyx_n_s_reduce); if (!object_reduce) goto __PYX_BAD;
-#else
- object_reduce = __Pyx_PyObject_GetAttrStr((PyObject*)&PyBaseObject_Type, __pyx_n_s_reduce); if (!object_reduce) goto __PYX_BAD;
-#endif
- reduce = __Pyx_PyObject_GetAttrStr(type_obj, __pyx_n_s_reduce); if (unlikely(!reduce)) goto __PYX_BAD;
- if (reduce == object_reduce || __Pyx_setup_reduce_is_named(reduce, __pyx_n_s_reduce_cython)) {
- reduce_cython = __Pyx_PyObject_GetAttrStrNoError(type_obj, __pyx_n_s_reduce_cython);
- if (likely(reduce_cython)) {
- ret = PyDict_SetItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_reduce, reduce_cython); if (unlikely(ret < 0)) goto __PYX_BAD;
- ret = PyDict_DelItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_reduce_cython); if (unlikely(ret < 0)) goto __PYX_BAD;
- } else if (reduce == object_reduce || PyErr_Occurred()) {
- goto __PYX_BAD;
- }
- setstate = __Pyx_PyObject_GetAttrStr(type_obj, __pyx_n_s_setstate);
- if (!setstate) PyErr_Clear();
- if (!setstate || __Pyx_setup_reduce_is_named(setstate, __pyx_n_s_setstate_cython)) {
- setstate_cython = __Pyx_PyObject_GetAttrStrNoError(type_obj, __pyx_n_s_setstate_cython);
- if (likely(setstate_cython)) {
- ret = PyDict_SetItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_setstate, setstate_cython); if (unlikely(ret < 0)) goto __PYX_BAD;
- ret = PyDict_DelItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_setstate_cython); if (unlikely(ret < 0)) goto __PYX_BAD;
- } else if (!setstate || PyErr_Occurred()) {
- goto __PYX_BAD;
- }
- }
- PyType_Modified((PyTypeObject*)type_obj);
- }
- }
- goto __PYX_GOOD;
-__PYX_BAD:
- if (!PyErr_Occurred())
- PyErr_Format(PyExc_RuntimeError, "Unable to initialize pickling for %s", ((PyTypeObject*)type_obj)->tp_name);
- ret = -1;
-__PYX_GOOD:
-#if !CYTHON_USE_PYTYPE_LOOKUP
- Py_XDECREF(object_reduce);
- Py_XDECREF(object_reduce_ex);
-#endif
- Py_XDECREF(reduce);
- Py_XDECREF(reduce_ex);
- Py_XDECREF(reduce_cython);
- Py_XDECREF(setstate);
- Py_XDECREF(setstate_cython);
- return ret;
-}
-
-/* CLineInTraceback */
-#ifndef CYTHON_CLINE_IN_TRACEBACK
-static int __Pyx_CLineForTraceback(CYTHON_NCP_UNUSED PyThreadState *tstate, int c_line) {
- PyObject *use_cline;
- PyObject *ptype, *pvalue, *ptraceback;
-#if CYTHON_COMPILING_IN_CPYTHON
- PyObject **cython_runtime_dict;
-#endif
- if (unlikely(!__pyx_cython_runtime)) {
- return c_line;
- }
- __Pyx_ErrFetchInState(tstate, &ptype, &pvalue, &ptraceback);
-#if CYTHON_COMPILING_IN_CPYTHON
- cython_runtime_dict = _PyObject_GetDictPtr(__pyx_cython_runtime);
- if (likely(cython_runtime_dict)) {
- __PYX_PY_DICT_LOOKUP_IF_MODIFIED(
- use_cline, *cython_runtime_dict,
- __Pyx_PyDict_GetItemStr(*cython_runtime_dict, __pyx_n_s_cline_in_traceback))
- } else
-#endif
- {
- PyObject *use_cline_obj = __Pyx_PyObject_GetAttrStr(__pyx_cython_runtime, __pyx_n_s_cline_in_traceback);
- if (use_cline_obj) {
- use_cline = PyObject_Not(use_cline_obj) ? Py_False : Py_True;
- Py_DECREF(use_cline_obj);
- } else {
- PyErr_Clear();
- use_cline = NULL;
- }
- }
- if (!use_cline) {
- c_line = 0;
- PyObject_SetAttr(__pyx_cython_runtime, __pyx_n_s_cline_in_traceback, Py_False);
- }
- else if (use_cline == Py_False || (use_cline != Py_True && PyObject_Not(use_cline) != 0)) {
- c_line = 0;
- }
- __Pyx_ErrRestoreInState(tstate, ptype, pvalue, ptraceback);
- return c_line;
-}
-#endif
-
-/* CodeObjectCache */
-static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line) {
- int start = 0, mid = 0, end = count - 1;
- if (end >= 0 && code_line > entries[end].code_line) {
- return count;
- }
- while (start < end) {
- mid = start + (end - start) / 2;
- if (code_line < entries[mid].code_line) {
- end = mid;
- } else if (code_line > entries[mid].code_line) {
- start = mid + 1;
- } else {
- return mid;
- }
- }
- if (code_line <= entries[mid].code_line) {
- return mid;
- } else {
- return mid + 1;
- }
-}
-static PyCodeObject *__pyx_find_code_object(int code_line) {
- PyCodeObject* code_object;
- int pos;
- if (unlikely(!code_line) || unlikely(!__pyx_code_cache.entries)) {
- return NULL;
- }
- pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line);
- if (unlikely(pos >= __pyx_code_cache.count) || unlikely(__pyx_code_cache.entries[pos].code_line != code_line)) {
- return NULL;
- }
- code_object = __pyx_code_cache.entries[pos].code_object;
- Py_INCREF(code_object);
- return code_object;
-}
-static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object) {
- int pos, i;
- __Pyx_CodeObjectCacheEntry* entries = __pyx_code_cache.entries;
- if (unlikely(!code_line)) {
- return;
- }
- if (unlikely(!entries)) {
- entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Malloc(64*sizeof(__Pyx_CodeObjectCacheEntry));
- if (likely(entries)) {
- __pyx_code_cache.entries = entries;
- __pyx_code_cache.max_count = 64;
- __pyx_code_cache.count = 1;
- entries[0].code_line = code_line;
- entries[0].code_object = code_object;
- Py_INCREF(code_object);
- }
- return;
- }
- pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line);
- if ((pos < __pyx_code_cache.count) && unlikely(__pyx_code_cache.entries[pos].code_line == code_line)) {
- PyCodeObject* tmp = entries[pos].code_object;
- entries[pos].code_object = code_object;
- Py_DECREF(tmp);
- return;
- }
- if (__pyx_code_cache.count == __pyx_code_cache.max_count) {
- int new_max = __pyx_code_cache.max_count + 64;
- entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Realloc(
- __pyx_code_cache.entries, ((size_t)new_max) * sizeof(__Pyx_CodeObjectCacheEntry));
- if (unlikely(!entries)) {
- return;
- }
- __pyx_code_cache.entries = entries;
- __pyx_code_cache.max_count = new_max;
- }
- for (i=__pyx_code_cache.count; i>pos; i--) {
- entries[i] = entries[i-1];
- }
- entries[pos].code_line = code_line;
- entries[pos].code_object = code_object;
- __pyx_code_cache.count++;
- Py_INCREF(code_object);
-}
-
-/* AddTraceback */
-#include "compile.h"
-#include "frameobject.h"
-#include "traceback.h"
-static PyCodeObject* __Pyx_CreateCodeObjectForTraceback(
- const char *funcname, int c_line,
- int py_line, const char *filename) {
- PyCodeObject *py_code = 0;
- PyObject *py_srcfile = 0;
- PyObject *py_funcname = 0;
- #if PY_MAJOR_VERSION < 3
- py_srcfile = PyString_FromString(filename);
- #else
- py_srcfile = PyUnicode_FromString(filename);
- #endif
- if (!py_srcfile) goto bad;
- if (c_line) {
- #if PY_MAJOR_VERSION < 3
- py_funcname = PyString_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line);
- #else
- py_funcname = PyUnicode_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line);
- #endif
- }
- else {
- #if PY_MAJOR_VERSION < 3
- py_funcname = PyString_FromString(funcname);
- #else
- py_funcname = PyUnicode_FromString(funcname);
- #endif
- }
- if (!py_funcname) goto bad;
- py_code = __Pyx_PyCode_New(
- 0,
- 0,
- 0,
- 0,
- 0,
- __pyx_empty_bytes, /*PyObject *code,*/
- __pyx_empty_tuple, /*PyObject *consts,*/
- __pyx_empty_tuple, /*PyObject *names,*/
- __pyx_empty_tuple, /*PyObject *varnames,*/
- __pyx_empty_tuple, /*PyObject *freevars,*/
- __pyx_empty_tuple, /*PyObject *cellvars,*/
- py_srcfile, /*PyObject *filename,*/
- py_funcname, /*PyObject *name,*/
- py_line,
- __pyx_empty_bytes /*PyObject *lnotab*/
- );
- Py_DECREF(py_srcfile);
- Py_DECREF(py_funcname);
- return py_code;
-bad:
- Py_XDECREF(py_srcfile);
- Py_XDECREF(py_funcname);
- return NULL;
-}
-static void __Pyx_AddTraceback(const char *funcname, int c_line,
- int py_line, const char *filename) {
- PyCodeObject *py_code = 0;
- PyFrameObject *py_frame = 0;
- PyThreadState *tstate = __Pyx_PyThreadState_Current;
- if (c_line) {
- c_line = __Pyx_CLineForTraceback(tstate, c_line);
- }
- py_code = __pyx_find_code_object(c_line ? -c_line : py_line);
- if (!py_code) {
- py_code = __Pyx_CreateCodeObjectForTraceback(
- funcname, c_line, py_line, filename);
- if (!py_code) goto bad;
- __pyx_insert_code_object(c_line ? -c_line : py_line, py_code);
- }
- py_frame = PyFrame_New(
- tstate, /*PyThreadState *tstate,*/
- py_code, /*PyCodeObject *code,*/
- __pyx_d, /*PyObject *globals,*/
- 0 /*PyObject *locals*/
- );
- if (!py_frame) goto bad;
- __Pyx_PyFrame_SetLineNumber(py_frame, py_line);
- PyTraceBack_Here(py_frame);
-bad:
- Py_XDECREF(py_code);
- Py_XDECREF(py_frame);
-}
-
-/* CIntToPy */
-static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value) {
- const int neg_one = (int) ((int) 0 - (int) 1), const_zero = (int) 0;
- const int is_unsigned = neg_one > const_zero;
- if (is_unsigned) {
- if (sizeof(int) < sizeof(long)) {
- return PyInt_FromLong((long) value);
- } else if (sizeof(int) <= sizeof(unsigned long)) {
- return PyLong_FromUnsignedLong((unsigned long) value);
-#ifdef HAVE_LONG_LONG
- } else if (sizeof(int) <= sizeof(unsigned PY_LONG_LONG)) {
- return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value);
-#endif
- }
- } else {
- if (sizeof(int) <= sizeof(long)) {
- return PyInt_FromLong((long) value);
-#ifdef HAVE_LONG_LONG
- } else if (sizeof(int) <= sizeof(PY_LONG_LONG)) {
- return PyLong_FromLongLong((PY_LONG_LONG) value);
-#endif
- }
- }
- {
- int one = 1; int little = (int)*(unsigned char *)&one;
- unsigned char *bytes = (unsigned char *)&value;
- return _PyLong_FromByteArray(bytes, sizeof(int),
- little, !is_unsigned);
- }
-}
-
-/* CIntFromPyVerify */
-#define __PYX_VERIFY_RETURN_INT(target_type, func_type, func_value)\
- __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 0)
-#define __PYX_VERIFY_RETURN_INT_EXC(target_type, func_type, func_value)\
- __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 1)
-#define __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, exc)\
- {\
- func_type value = func_value;\
- if (sizeof(target_type) < sizeof(func_type)) {\
- if (unlikely(value != (func_type) (target_type) value)) {\
- func_type zero = 0;\
- if (exc && unlikely(value == (func_type)-1 && PyErr_Occurred()))\
- return (target_type) -1;\
- if (is_unsigned && unlikely(value < zero))\
- goto raise_neg_overflow;\
- else\
- goto raise_overflow;\
- }\
- }\
- return (target_type) value;\
- }
-
-/* CIntToPy */
-static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value) {
- const long neg_one = (long) ((long) 0 - (long) 1), const_zero = (long) 0;
- const int is_unsigned = neg_one > const_zero;
- if (is_unsigned) {
- if (sizeof(long) < sizeof(long)) {
- return PyInt_FromLong((long) value);
- } else if (sizeof(long) <= sizeof(unsigned long)) {
- return PyLong_FromUnsignedLong((unsigned long) value);
-#ifdef HAVE_LONG_LONG
- } else if (sizeof(long) <= sizeof(unsigned PY_LONG_LONG)) {
- return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value);
-#endif
- }
- } else {
- if (sizeof(long) <= sizeof(long)) {
- return PyInt_FromLong((long) value);
-#ifdef HAVE_LONG_LONG
- } else if (sizeof(long) <= sizeof(PY_LONG_LONG)) {
- return PyLong_FromLongLong((PY_LONG_LONG) value);
-#endif
- }
- }
- {
- int one = 1; int little = (int)*(unsigned char *)&one;
- unsigned char *bytes = (unsigned char *)&value;
- return _PyLong_FromByteArray(bytes, sizeof(long),
- little, !is_unsigned);
- }
-}
-
-/* CIntFromPy */
-static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *x) {
- const long neg_one = (long) ((long) 0 - (long) 1), const_zero = (long) 0;
- const int is_unsigned = neg_one > const_zero;
-#if PY_MAJOR_VERSION < 3
- if (likely(PyInt_Check(x))) {
- if (sizeof(long) < sizeof(long)) {
- __PYX_VERIFY_RETURN_INT(long, long, PyInt_AS_LONG(x))
- } else {
- long val = PyInt_AS_LONG(x);
- if (is_unsigned && unlikely(val < 0)) {
- goto raise_neg_overflow;
- }
- return (long) val;
- }
- } else
-#endif
- if (likely(PyLong_Check(x))) {
- if (is_unsigned) {
-#if CYTHON_USE_PYLONG_INTERNALS
- const digit* digits = ((PyLongObject*)x)->ob_digit;
- switch (Py_SIZE(x)) {
- case 0: return (long) 0;
- case 1: __PYX_VERIFY_RETURN_INT(long, digit, digits[0])
- case 2:
- if (8 * sizeof(long) > 1 * PyLong_SHIFT) {
- if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) {
- __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
- } else if (8 * sizeof(long) >= 2 * PyLong_SHIFT) {
- return (long) (((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0]));
- }
- }
- break;
- case 3:
- if (8 * sizeof(long) > 2 * PyLong_SHIFT) {
- if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) {
- __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
- } else if (8 * sizeof(long) >= 3 * PyLong_SHIFT) {
- return (long) (((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]));
- }
- }
- break;
- case 4:
- if (8 * sizeof(long) > 3 * PyLong_SHIFT) {
- if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) {
- __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
- } else if (8 * sizeof(long) >= 4 * PyLong_SHIFT) {
- return (long) (((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]));
- }
- }
- break;
- }
-#endif
-#if CYTHON_COMPILING_IN_CPYTHON
- if (unlikely(Py_SIZE(x) < 0)) {
- goto raise_neg_overflow;
- }
-#else
- {
- int result = PyObject_RichCompareBool(x, Py_False, Py_LT);
- if (unlikely(result < 0))
- return (long) -1;
- if (unlikely(result == 1))
- goto raise_neg_overflow;
- }
-#endif
- if (sizeof(long) <= sizeof(unsigned long)) {
- __PYX_VERIFY_RETURN_INT_EXC(long, unsigned long, PyLong_AsUnsignedLong(x))
-#ifdef HAVE_LONG_LONG
- } else if (sizeof(long) <= sizeof(unsigned PY_LONG_LONG)) {
- __PYX_VERIFY_RETURN_INT_EXC(long, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x))
-#endif
- }
- } else {
-#if CYTHON_USE_PYLONG_INTERNALS
- const digit* digits = ((PyLongObject*)x)->ob_digit;
- switch (Py_SIZE(x)) {
- case 0: return (long) 0;
- case -1: __PYX_VERIFY_RETURN_INT(long, sdigit, (sdigit) (-(sdigit)digits[0]))
- case 1: __PYX_VERIFY_RETURN_INT(long, digit, +digits[0])
- case -2:
- if (8 * sizeof(long) - 1 > 1 * PyLong_SHIFT) {
- if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) {
- __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
- } else if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) {
- return (long) (((long)-1)*(((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0])));
- }
- }
- break;
- case 2:
- if (8 * sizeof(long) > 1 * PyLong_SHIFT) {
- if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) {
- __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
- } else if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) {
- return (long) ((((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0])));
- }
- }
- break;
- case -3:
- if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) {
- if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) {
- __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
- } else if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) {
- return (long) (((long)-1)*(((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])));
- }
- }
- break;
- case 3:
- if (8 * sizeof(long) > 2 * PyLong_SHIFT) {
- if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) {
- __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
- } else if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) {
- return (long) ((((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])));
- }
- }
- break;
- case -4:
- if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) {
- if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) {
- __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
- } else if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) {
- return (long) (((long)-1)*(((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])));
- }
- }
- break;
- case 4:
- if (8 * sizeof(long) > 3 * PyLong_SHIFT) {
- if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) {
- __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
- } else if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) {
- return (long) ((((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])));
- }
- }
- break;
- }
-#endif
- if (sizeof(long) <= sizeof(long)) {
- __PYX_VERIFY_RETURN_INT_EXC(long, long, PyLong_AsLong(x))
-#ifdef HAVE_LONG_LONG
- } else if (sizeof(long) <= sizeof(PY_LONG_LONG)) {
- __PYX_VERIFY_RETURN_INT_EXC(long, PY_LONG_LONG, PyLong_AsLongLong(x))
-#endif
- }
- }
- {
-#if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray)
- PyErr_SetString(PyExc_RuntimeError,
- "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers");
-#else
- long val;
- PyObject *v = __Pyx_PyNumber_IntOrLong(x);
- #if PY_MAJOR_VERSION < 3
- if (likely(v) && !PyLong_Check(v)) {
- PyObject *tmp = v;
- v = PyNumber_Long(tmp);
- Py_DECREF(tmp);
- }
- #endif
- if (likely(v)) {
- int one = 1; int is_little = (int)*(unsigned char *)&one;
- unsigned char *bytes = (unsigned char *)&val;
- int ret = _PyLong_AsByteArray((PyLongObject *)v,
- bytes, sizeof(val),
- is_little, !is_unsigned);
- Py_DECREF(v);
- if (likely(!ret))
- return val;
- }
-#endif
- return (long) -1;
- }
- } else {
- long val;
- PyObject *tmp = __Pyx_PyNumber_IntOrLong(x);
- if (!tmp) return (long) -1;
- val = __Pyx_PyInt_As_long(tmp);
- Py_DECREF(tmp);
- return val;
- }
-raise_overflow:
- PyErr_SetString(PyExc_OverflowError,
- "value too large to convert to long");
- return (long) -1;
-raise_neg_overflow:
- PyErr_SetString(PyExc_OverflowError,
- "can't convert negative value to long");
- return (long) -1;
-}
-
-/* CIntFromPy */
-static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *x) {
- const int neg_one = (int) ((int) 0 - (int) 1), const_zero = (int) 0;
- const int is_unsigned = neg_one > const_zero;
-#if PY_MAJOR_VERSION < 3
- if (likely(PyInt_Check(x))) {
- if (sizeof(int) < sizeof(long)) {
- __PYX_VERIFY_RETURN_INT(int, long, PyInt_AS_LONG(x))
- } else {
- long val = PyInt_AS_LONG(x);
- if (is_unsigned && unlikely(val < 0)) {
- goto raise_neg_overflow;
- }
- return (int) val;
- }
- } else
-#endif
- if (likely(PyLong_Check(x))) {
- if (is_unsigned) {
-#if CYTHON_USE_PYLONG_INTERNALS
- const digit* digits = ((PyLongObject*)x)->ob_digit;
- switch (Py_SIZE(x)) {
- case 0: return (int) 0;
- case 1: __PYX_VERIFY_RETURN_INT(int, digit, digits[0])
- case 2:
- if (8 * sizeof(int) > 1 * PyLong_SHIFT) {
- if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) {
- __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
- } else if (8 * sizeof(int) >= 2 * PyLong_SHIFT) {
- return (int) (((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0]));
- }
- }
- break;
- case 3:
- if (8 * sizeof(int) > 2 * PyLong_SHIFT) {
- if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) {
- __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
- } else if (8 * sizeof(int) >= 3 * PyLong_SHIFT) {
- return (int) (((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]));
- }
- }
- break;
- case 4:
- if (8 * sizeof(int) > 3 * PyLong_SHIFT) {
- if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) {
- __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
- } else if (8 * sizeof(int) >= 4 * PyLong_SHIFT) {
- return (int) (((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]));
- }
- }
- break;
- }
-#endif
-#if CYTHON_COMPILING_IN_CPYTHON
- if (unlikely(Py_SIZE(x) < 0)) {
- goto raise_neg_overflow;
- }
-#else
- {
- int result = PyObject_RichCompareBool(x, Py_False, Py_LT);
- if (unlikely(result < 0))
- return (int) -1;
- if (unlikely(result == 1))
- goto raise_neg_overflow;
- }
-#endif
- if (sizeof(int) <= sizeof(unsigned long)) {
- __PYX_VERIFY_RETURN_INT_EXC(int, unsigned long, PyLong_AsUnsignedLong(x))
-#ifdef HAVE_LONG_LONG
- } else if (sizeof(int) <= sizeof(unsigned PY_LONG_LONG)) {
- __PYX_VERIFY_RETURN_INT_EXC(int, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x))
-#endif
- }
- } else {
-#if CYTHON_USE_PYLONG_INTERNALS
- const digit* digits = ((PyLongObject*)x)->ob_digit;
- switch (Py_SIZE(x)) {
- case 0: return (int) 0;
- case -1: __PYX_VERIFY_RETURN_INT(int, sdigit, (sdigit) (-(sdigit)digits[0]))
- case 1: __PYX_VERIFY_RETURN_INT(int, digit, +digits[0])
- case -2:
- if (8 * sizeof(int) - 1 > 1 * PyLong_SHIFT) {
- if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) {
- __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
- } else if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) {
- return (int) (((int)-1)*(((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0])));
- }
- }
- break;
- case 2:
- if (8 * sizeof(int) > 1 * PyLong_SHIFT) {
- if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) {
- __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
- } else if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) {
- return (int) ((((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0])));
- }
- }
- break;
- case -3:
- if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) {
- if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) {
- __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
- } else if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) {
- return (int) (((int)-1)*(((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])));
- }
- }
- break;
- case 3:
- if (8 * sizeof(int) > 2 * PyLong_SHIFT) {
- if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) {
- __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
- } else if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) {
- return (int) ((((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])));
- }
- }
- break;
- case -4:
- if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) {
- if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) {
- __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
- } else if (8 * sizeof(int) - 1 > 4 * PyLong_SHIFT) {
- return (int) (((int)-1)*(((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])));
- }
- }
- break;
- case 4:
- if (8 * sizeof(int) > 3 * PyLong_SHIFT) {
- if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) {
- __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
- } else if (8 * sizeof(int) - 1 > 4 * PyLong_SHIFT) {
- return (int) ((((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])));
- }
- }
- break;
- }
-#endif
- if (sizeof(int) <= sizeof(long)) {
- __PYX_VERIFY_RETURN_INT_EXC(int, long, PyLong_AsLong(x))
-#ifdef HAVE_LONG_LONG
- } else if (sizeof(int) <= sizeof(PY_LONG_LONG)) {
- __PYX_VERIFY_RETURN_INT_EXC(int, PY_LONG_LONG, PyLong_AsLongLong(x))
-#endif
- }
- }
- {
-#if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray)
- PyErr_SetString(PyExc_RuntimeError,
- "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers");
-#else
- int val;
- PyObject *v = __Pyx_PyNumber_IntOrLong(x);
- #if PY_MAJOR_VERSION < 3
- if (likely(v) && !PyLong_Check(v)) {
- PyObject *tmp = v;
- v = PyNumber_Long(tmp);
- Py_DECREF(tmp);
- }
- #endif
- if (likely(v)) {
- int one = 1; int is_little = (int)*(unsigned char *)&one;
- unsigned char *bytes = (unsigned char *)&val;
- int ret = _PyLong_AsByteArray((PyLongObject *)v,
- bytes, sizeof(val),
- is_little, !is_unsigned);
- Py_DECREF(v);
- if (likely(!ret))
- return val;
- }
-#endif
- return (int) -1;
- }
- } else {
- int val;
- PyObject *tmp = __Pyx_PyNumber_IntOrLong(x);
- if (!tmp) return (int) -1;
- val = __Pyx_PyInt_As_int(tmp);
- Py_DECREF(tmp);
- return val;
- }
-raise_overflow:
- PyErr_SetString(PyExc_OverflowError,
- "value too large to convert to int");
- return (int) -1;
-raise_neg_overflow:
- PyErr_SetString(PyExc_OverflowError,
- "can't convert negative value to int");
- return (int) -1;
-}
-
-/* FastTypeChecks */
-#if CYTHON_COMPILING_IN_CPYTHON
-static int __Pyx_InBases(PyTypeObject *a, PyTypeObject *b) {
- while (a) {
- a = a->tp_base;
- if (a == b)
- return 1;
- }
- return b == &PyBaseObject_Type;
-}
-static CYTHON_INLINE int __Pyx_IsSubtype(PyTypeObject *a, PyTypeObject *b) {
- PyObject *mro;
- if (a == b) return 1;
- mro = a->tp_mro;
- if (likely(mro)) {
- Py_ssize_t i, n;
- n = PyTuple_GET_SIZE(mro);
- for (i = 0; i < n; i++) {
- if (PyTuple_GET_ITEM(mro, i) == (PyObject *)b)
- return 1;
- }
- return 0;
- }
- return __Pyx_InBases(a, b);
-}
-#if PY_MAJOR_VERSION == 2
-static int __Pyx_inner_PyErr_GivenExceptionMatches2(PyObject *err, PyObject* exc_type1, PyObject* exc_type2) {
- PyObject *exception, *value, *tb;
- int res;
- __Pyx_PyThreadState_declare
- __Pyx_PyThreadState_assign
- __Pyx_ErrFetch(&exception, &value, &tb);
- res = exc_type1 ? PyObject_IsSubclass(err, exc_type1) : 0;
- if (unlikely(res == -1)) {
- PyErr_WriteUnraisable(err);
- res = 0;
- }
- if (!res) {
- res = PyObject_IsSubclass(err, exc_type2);
- if (unlikely(res == -1)) {
- PyErr_WriteUnraisable(err);
- res = 0;
- }
- }
- __Pyx_ErrRestore(exception, value, tb);
- return res;
-}
-#else
-static CYTHON_INLINE int __Pyx_inner_PyErr_GivenExceptionMatches2(PyObject *err, PyObject* exc_type1, PyObject *exc_type2) {
- int res = exc_type1 ? __Pyx_IsSubtype((PyTypeObject*)err, (PyTypeObject*)exc_type1) : 0;
- if (!res) {
- res = __Pyx_IsSubtype((PyTypeObject*)err, (PyTypeObject*)exc_type2);
- }
- return res;
-}
-#endif
-static int __Pyx_PyErr_GivenExceptionMatchesTuple(PyObject *exc_type, PyObject *tuple) {
- Py_ssize_t i, n;
- assert(PyExceptionClass_Check(exc_type));
- n = PyTuple_GET_SIZE(tuple);
-#if PY_MAJOR_VERSION >= 3
- for (i=0; ip) {
- #if PY_MAJOR_VERSION < 3
- if (t->is_unicode) {
- *t->p = PyUnicode_DecodeUTF8(t->s, t->n - 1, NULL);
- } else if (t->intern) {
- *t->p = PyString_InternFromString(t->s);
- } else {
- *t->p = PyString_FromStringAndSize(t->s, t->n - 1);
- }
- #else
- if (t->is_unicode | t->is_str) {
- if (t->intern) {
- *t->p = PyUnicode_InternFromString(t->s);
- } else if (t->encoding) {
- *t->p = PyUnicode_Decode(t->s, t->n - 1, t->encoding, NULL);
- } else {
- *t->p = PyUnicode_FromStringAndSize(t->s, t->n - 1);
- }
- } else {
- *t->p = PyBytes_FromStringAndSize(t->s, t->n - 1);
- }
- #endif
- if (!*t->p)
- return -1;
- if (PyObject_Hash(*t->p) == -1)
- return -1;
- ++t;
- }
- return 0;
-}
-
-static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char* c_str) {
- return __Pyx_PyUnicode_FromStringAndSize(c_str, (Py_ssize_t)strlen(c_str));
-}
-static CYTHON_INLINE const char* __Pyx_PyObject_AsString(PyObject* o) {
- Py_ssize_t ignore;
- return __Pyx_PyObject_AsStringAndSize(o, &ignore);
-}
-#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT
-#if !CYTHON_PEP393_ENABLED
-static const char* __Pyx_PyUnicode_AsStringAndSize(PyObject* o, Py_ssize_t *length) {
- char* defenc_c;
- PyObject* defenc = _PyUnicode_AsDefaultEncodedString(o, NULL);
- if (!defenc) return NULL;
- defenc_c = PyBytes_AS_STRING(defenc);
-#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII
- {
- char* end = defenc_c + PyBytes_GET_SIZE(defenc);
- char* c;
- for (c = defenc_c; c < end; c++) {
- if ((unsigned char) (*c) >= 128) {
- PyUnicode_AsASCIIString(o);
- return NULL;
- }
- }
- }
-#endif
- *length = PyBytes_GET_SIZE(defenc);
- return defenc_c;
-}
-#else
-static CYTHON_INLINE const char* __Pyx_PyUnicode_AsStringAndSize(PyObject* o, Py_ssize_t *length) {
- if (unlikely(__Pyx_PyUnicode_READY(o) == -1)) return NULL;
-#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII
- if (likely(PyUnicode_IS_ASCII(o))) {
- *length = PyUnicode_GET_LENGTH(o);
- return PyUnicode_AsUTF8(o);
- } else {
- PyUnicode_AsASCIIString(o);
- return NULL;
- }
-#else
- return PyUnicode_AsUTF8AndSize(o, length);
-#endif
-}
-#endif
-#endif
-static CYTHON_INLINE const char* __Pyx_PyObject_AsStringAndSize(PyObject* o, Py_ssize_t *length) {
-#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT
- if (
-#if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII
- __Pyx_sys_getdefaultencoding_not_ascii &&
-#endif
- PyUnicode_Check(o)) {
- return __Pyx_PyUnicode_AsStringAndSize(o, length);
- } else
-#endif
-#if (!CYTHON_COMPILING_IN_PYPY) || (defined(PyByteArray_AS_STRING) && defined(PyByteArray_GET_SIZE))
- if (PyByteArray_Check(o)) {
- *length = PyByteArray_GET_SIZE(o);
- return PyByteArray_AS_STRING(o);
- } else
-#endif
- {
- char* result;
- int r = PyBytes_AsStringAndSize(o, &result, length);
- if (unlikely(r < 0)) {
- return NULL;
- } else {
- return result;
- }
- }
-}
-static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject* x) {
- int is_true = x == Py_True;
- if (is_true | (x == Py_False) | (x == Py_None)) return is_true;
- else return PyObject_IsTrue(x);
-}
-static CYTHON_INLINE int __Pyx_PyObject_IsTrueAndDecref(PyObject* x) {
- int retval;
- if (unlikely(!x)) return -1;
- retval = __Pyx_PyObject_IsTrue(x);
- Py_DECREF(x);
- return retval;
-}
-static PyObject* __Pyx_PyNumber_IntOrLongWrongResultType(PyObject* result, const char* type_name) {
-#if PY_MAJOR_VERSION >= 3
- if (PyLong_Check(result)) {
- if (PyErr_WarnFormat(PyExc_DeprecationWarning, 1,
- "__int__ returned non-int (type %.200s). "
- "The ability to return an instance of a strict subclass of int "
- "is deprecated, and may be removed in a future version of Python.",
- Py_TYPE(result)->tp_name)) {
- Py_DECREF(result);
- return NULL;
- }
- return result;
- }
-#endif
- PyErr_Format(PyExc_TypeError,
- "__%.4s__ returned non-%.4s (type %.200s)",
- type_name, type_name, Py_TYPE(result)->tp_name);
- Py_DECREF(result);
- return NULL;
-}
-static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x) {
-#if CYTHON_USE_TYPE_SLOTS
- PyNumberMethods *m;
-#endif
- const char *name = NULL;
- PyObject *res = NULL;
-#if PY_MAJOR_VERSION < 3
- if (likely(PyInt_Check(x) || PyLong_Check(x)))
-#else
- if (likely(PyLong_Check(x)))
-#endif
- return __Pyx_NewRef(x);
-#if CYTHON_USE_TYPE_SLOTS
- m = Py_TYPE(x)->tp_as_number;
- #if PY_MAJOR_VERSION < 3
- if (m && m->nb_int) {
- name = "int";
- res = m->nb_int(x);
- }
- else if (m && m->nb_long) {
- name = "long";
- res = m->nb_long(x);
- }
- #else
- if (likely(m && m->nb_int)) {
- name = "int";
- res = m->nb_int(x);
- }
- #endif
-#else
- if (!PyBytes_CheckExact(x) && !PyUnicode_CheckExact(x)) {
- res = PyNumber_Int(x);
- }
-#endif
- if (likely(res)) {
-#if PY_MAJOR_VERSION < 3
- if (unlikely(!PyInt_Check(res) && !PyLong_Check(res))) {
-#else
- if (unlikely(!PyLong_CheckExact(res))) {
-#endif
- return __Pyx_PyNumber_IntOrLongWrongResultType(res, name);
- }
- }
- else if (!PyErr_Occurred()) {
- PyErr_SetString(PyExc_TypeError,
- "an integer is required");
- }
- return res;
-}
-static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject* b) {
- Py_ssize_t ival;
- PyObject *x;
-#if PY_MAJOR_VERSION < 3
- if (likely(PyInt_CheckExact(b))) {
- if (sizeof(Py_ssize_t) >= sizeof(long))
- return PyInt_AS_LONG(b);
- else
- return PyInt_AsSsize_t(b);
- }
-#endif
- if (likely(PyLong_CheckExact(b))) {
- #if CYTHON_USE_PYLONG_INTERNALS
- const digit* digits = ((PyLongObject*)b)->ob_digit;
- const Py_ssize_t size = Py_SIZE(b);
- if (likely(__Pyx_sst_abs(size) <= 1)) {
- ival = likely(size) ? digits[0] : 0;
- if (size == -1) ival = -ival;
- return ival;
- } else {
- switch (size) {
- case 2:
- if (8 * sizeof(Py_ssize_t) > 2 * PyLong_SHIFT) {
- return (Py_ssize_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0]));
- }
- break;
- case -2:
- if (8 * sizeof(Py_ssize_t) > 2 * PyLong_SHIFT) {
- return -(Py_ssize_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0]));
- }
- break;
- case 3:
- if (8 * sizeof(Py_ssize_t) > 3 * PyLong_SHIFT) {
- return (Py_ssize_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0]));
- }
- break;
- case -3:
- if (8 * sizeof(Py_ssize_t) > 3 * PyLong_SHIFT) {
- return -(Py_ssize_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0]));
- }
- break;
- case 4:
- if (8 * sizeof(Py_ssize_t) > 4 * PyLong_SHIFT) {
- return (Py_ssize_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0]));
- }
- break;
- case -4:
- if (8 * sizeof(Py_ssize_t) > 4 * PyLong_SHIFT) {
- return -(Py_ssize_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0]));
- }
- break;
- }
- }
- #endif
- return PyLong_AsSsize_t(b);
- }
- x = PyNumber_Index(b);
- if (!x) return -1;
- ival = PyInt_AsSsize_t(x);
- Py_DECREF(x);
- return ival;
-}
-static CYTHON_INLINE PyObject * __Pyx_PyBool_FromLong(long b) {
- return b ? __Pyx_NewRef(Py_True) : __Pyx_NewRef(Py_False);
-}
-static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t ival) {
- return PyInt_FromSize_t(ival);
-}
-
-
-#endif /* Py_PYTHON_H */
diff --git a/third_party/python/frozenlist/frozenlist/_frozenlist.pyx b/third_party/python/frozenlist/frozenlist/_frozenlist.pyx
index 19e4cb95e079..9ee846c1aeb1 100644
--- a/third_party/python/frozenlist/frozenlist/_frozenlist.pyx
+++ b/third_party/python/frozenlist/frozenlist/_frozenlist.pyx
@@ -1,8 +1,17 @@
+import sys
+import types
from collections.abc import MutableSequence
cdef class FrozenList:
+ if sys.version_info >= (3, 9):
+ __class_getitem__ = classmethod(types.GenericAlias)
+ else:
+ @classmethod
+ def __class_getitem__(cls):
+ return cls
+
cdef readonly bint frozen
cdef list _items
diff --git a/third_party/python/frozenlist/frozenlist/py.typed b/third_party/python/frozenlist/frozenlist/py.typed
index 20a74394fc0d..f5642f79f21d 100644
--- a/third_party/python/frozenlist/frozenlist/py.typed
+++ b/third_party/python/frozenlist/frozenlist/py.typed
@@ -1 +1 @@
-Marker
\ No newline at end of file
+Marker
diff --git a/third_party/python/frozenlist/pyproject.toml b/third_party/python/frozenlist/pyproject.toml
deleted file mode 100644
index c2b7467278f3..000000000000
--- a/third_party/python/frozenlist/pyproject.toml
+++ /dev/null
@@ -1,10 +0,0 @@
-[build-system]
-requires= ['setuptools', 'wheel', 'Cython']
-
-[tool.towncrier]
-package = "frozenlist"
-filename = "CHANGES.rst"
-directory = "CHANGES/"
-title_format = "{version} ({project_date})"
-template = "CHANGES/.TEMPLATE.rst"
-issue_format = "`#{issue} `_"
diff --git a/third_party/python/frozenlist/setup.cfg b/third_party/python/frozenlist/setup.cfg
deleted file mode 100644
index e96d501be2b3..000000000000
--- a/third_party/python/frozenlist/setup.cfg
+++ /dev/null
@@ -1,50 +0,0 @@
-[aliases]
-test = pytest
-
-[metadata]
-license_file = LICENSE.txt
-
-[pep8]
-max-line-length = 79
-
-[easy_install]
-zip_ok = false
-
-[flake8]
-ignore = N801,N802,N803,E226,W504,E252
-max-line-length = 79
-
-[isort]
-multi_line_output = 3
-include_trailing_comma = True
-force_grid_wrap = 0
-use_parentheses = True
-known_third_party = pytest
-known_first_party = frozenlist
-
-[report]
-exclude_lines =
- @abc.abstractmethod
- @abstractmethod
-
-[coverage:run]
-branch = True
-source = frozenlist
-omit = site-packages
-
-[mypy]
-follow_imports = silent
-strict_optional = True
-warn_redundant_casts = True
-check_untyped_defs = True
-disallow_any_generics = True
-disallow_untyped_defs = True
-warn_unused_ignores = True
-
-[mypy-pytest]
-ignore_missing_imports = true
-
-[egg_info]
-tag_build =
-tag_date = 0
-
diff --git a/third_party/python/frozenlist/setup.py b/third_party/python/frozenlist/setup.py
deleted file mode 100644
index 9d0e26fcb57a..000000000000
--- a/third_party/python/frozenlist/setup.py
+++ /dev/null
@@ -1,90 +0,0 @@
-import os
-import pathlib
-import re
-import sys
-
-from setuptools import Extension, setup
-
-if sys.version_info < (3, 6):
- raise RuntimeError("frozenlist 1.x requires Python 3.6+")
-
-
-NO_EXTENSIONS = (
- bool(os.environ.get('FROZENLIST_NO_EXTENSIONS')) or
- sys.implementation.name != "cpython"
-)
-
-here = pathlib.Path(__file__).parent
-
-if NO_EXTENSIONS:
- print("*********************")
- print("* Pure Python build *")
- print("*********************")
- ext_modules = None
-else:
- print("**********************")
- print("* Accellerated build *")
- print("**********************")
- ext_modules = [
- Extension('frozenlist._frozenlist', ['frozenlist/_frozenlist.c'])
- ]
-
-
-txt = (here / 'frozenlist' / '__init__.py').read_text('utf-8')
-try:
- version = re.findall(r"^__version__ = '([^']+)'\r?$",
- txt, re.M)[0]
-except IndexError:
- raise RuntimeError('Unable to determine version.')
-
-install_requires = []
-
-
-def read(f):
- return (here / f).read_text('utf-8').strip()
-
-
-setup(
- name='frozenlist',
- version=version,
- description=(
- 'A list-like structure which implements '
- 'collections.abc.MutableSequence'
- ),
- long_description='\n\n'.join((read('README.rst'), read('CHANGES.rst'))),
- long_description_content_type="text/x-rst",
- classifiers=[
- 'License :: OSI Approved :: Apache Software License',
- 'Intended Audience :: Developers',
- 'Programming Language :: Python',
- 'Programming Language :: Python :: 3',
- 'Programming Language :: Python :: 3.6',
- 'Programming Language :: Python :: 3.7',
- 'Programming Language :: Python :: 3.8',
- 'Programming Language :: Python :: 3.9',
- 'Development Status :: 5 - Production/Stable',
- 'Operating System :: POSIX',
- 'Operating System :: MacOS :: MacOS X',
- 'Operating System :: Microsoft :: Windows',
- ],
- author='Nikolay Kim',
- author_email='fafhrd91@gmail.com',
- maintainer='Martijn Pieters ',
- maintainer_email='aio-libs@googlegroups.com',
- url='https://github.com/aio-libs/frozenlist',
- project_urls={
- 'Chat: Gitter': 'https://gitter.im/aio-libs/Lobby',
- 'CI: Github Actions':
- 'https://github.com/aio-libs/frozenlist/actions',
- 'Coverage: codecov': 'https://codecov.io/github/aio-libs/frozenlist',
- 'Docs: RTD': 'https://frozenlist.readthedocs.io',
- 'GitHub: issues': 'https://github.com/aio-libs/frozenlist/issues',
- 'GitHub: repo': 'https://github.com/aio-libs/frozenlist',
- },
- license='Apache 2',
- packages=['frozenlist'],
- ext_modules=ext_modules,
- python_requires='>=3.6',
- install_requires=install_requires,
- include_package_data=True,
-)
diff --git a/third_party/python/giturlparse/giturlparse-0.10.0.dist-info/RECORD b/third_party/python/giturlparse/giturlparse-0.10.0.dist-info/RECORD
deleted file mode 100644
index f5d97476fbd3..000000000000
--- a/third_party/python/giturlparse/giturlparse-0.10.0.dist-info/RECORD
+++ /dev/null
@@ -1,18 +0,0 @@
-giturlparse/__init__.py,sha256=c5WMm7u1auWiuJrsY0bo1IsT6iRi8b6pGebNQC03_PI,332
-giturlparse/parser.py,sha256=BTaOH--z1-odYdOwEb5iNadYpCvUM4-bKHYXGKxGIZM,1924
-giturlparse/result.py,sha256=wKg1h9vYXkPseRgEAIk8TDPS1UMIU_z3t4IKbT7uD18,2765
-giturlparse/platforms/__init__.py,sha256=y8xzQWxqGHwlvx0pY99Hqott-xK2Q0iBzpQ9dTehTrY,527
-giturlparse/platforms/assembla.py,sha256=iPYpPOu8cNapbniD7sj63aTwPGT4DUH1U8RkvbUkiqE,498
-giturlparse/platforms/base.py,sha256=cZPxEa1u1WNq6IvhUVp3XWJtks9Dy2sifDaJAdeHclI,1566
-giturlparse/platforms/bitbucket.py,sha256=R6dsFBhuMlLe9-gIAP7X8hzJn-FHAjI-bBgnfNom4tc,680
-giturlparse/platforms/friendcode.py,sha256=w__PNSQAkNO2Y45doOw7YMDqwuSyu_FocQTRa305VM0,389
-giturlparse/platforms/github.py,sha256=G_7VRQpm5ZtvOcc1xbVF3CnC4AcCRnyK7EgkoaoqOEo,1446
-giturlparse/platforms/gitlab.py,sha256=2K65zlI8CA5OdXV9eXW3SBFH7oW78lFlkhLviW3Mwyo,1794
-giturlparse/tests/__init__.py,sha256=yBGT6Ycwx1AsTFYemzHoqrJ82seE0gfGti99VyrV3x0,37
-giturlparse/tests/parse.py,sha256=dpFzvo40qdH7Zg6CmgMqBMeZz473GhbZotmVK_nq_pk,14594
-giturlparse/tests/rewrite.py,sha256=scB7YGBUeFo3bEyI0Mvc0hK_ajlBY2RkrEGRtnrtukc,3386
-giturlparse-0.10.0.dist-info/LICENSE,sha256=c7p036pSC0mkAbXSFFmoUjoUbzt1GKgz7qXvqFEwv2g,10273
-giturlparse-0.10.0.dist-info/METADATA,sha256=NDWxArULRXhAAu2KttDMuZu1k35HvJ1eJHEcWfeB8lI,3511
-giturlparse-0.10.0.dist-info/WHEEL,sha256=oh0NKYrTcu1i1-wgrI1cnhkjYIi8WJ-8qd9Jrr5_y4E,110
-giturlparse-0.10.0.dist-info/top_level.txt,sha256=NHfX7iaRAYz-bnROU6Q0tgNInQU-YgIeeii0uznxCLA,12
-giturlparse-0.10.0.dist-info/RECORD,,
diff --git a/third_party/python/giturlparse/giturlparse-0.10.0.dist-info/LICENSE b/third_party/python/giturlparse/giturlparse-0.12.0.dist-info/LICENSE
similarity index 100%
rename from third_party/python/giturlparse/giturlparse-0.10.0.dist-info/LICENSE
rename to third_party/python/giturlparse/giturlparse-0.12.0.dist-info/LICENSE
diff --git a/third_party/python/giturlparse/giturlparse-0.10.0.dist-info/METADATA b/third_party/python/giturlparse/giturlparse-0.12.0.dist-info/METADATA
similarity index 73%
rename from third_party/python/giturlparse/giturlparse-0.10.0.dist-info/METADATA
rename to third_party/python/giturlparse/giturlparse-0.12.0.dist-info/METADATA
index 198277d691bb..20000dc50dda 100644
--- a/third_party/python/giturlparse/giturlparse-0.10.0.dist-info/METADATA
+++ b/third_party/python/giturlparse/giturlparse-0.12.0.dist-info/METADATA
@@ -1,6 +1,6 @@
Metadata-Version: 2.1
Name: giturlparse
-Version: 0.10.0
+Version: 0.12.0
Summary: A Git URL parsing module (supports parsing and rewriting)
Home-page: https://github.com/nephila/giturlparse
Author: Aaron O Mullan
@@ -9,16 +9,18 @@ Maintainer: Iacopo Spalletti
Maintainer-email: i.spalletti@nephila.it
License: Apache v2
Keywords: giturlparse
-Platform: UNKNOWN
Classifier: Development Status :: 5 - Production/Stable
Classifier: Framework :: Django
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: Apache Software License
Classifier: Natural Language :: English
-Classifier: Programming Language :: Python :: 3.6
-Classifier: Programming Language :: Python :: 3.7
-Requires-Python: >=3.6
+Classifier: Programming Language :: Python :: 3.8
+Classifier: Programming Language :: Python :: 3.9
+Classifier: Programming Language :: Python :: 3.10
+Classifier: Programming Language :: Python :: 3.11
+Requires-Python: >=3.8
Description-Content-Type: text/x-rst
+License-File: LICENSE
===========
giturlparse
@@ -59,6 +61,8 @@ Exposed attributes
* ``path``: path to file or directory (includes the branch name) - gitlab / github only
* ``path_raw``: raw path starting from the repo name (might include platform keyword) - gitlab / github only
* ``branch``: branch name (when parseable) - gitlab / github only
+* ``username``: username from ``:@`` gitlab / github urls
+* ``access_token``: access token from ``:@`` gitlab / github urls
Parse
==================
@@ -126,7 +130,7 @@ Tests
::
- python setup.py test
+ python -munittest
License
==================
@@ -141,6 +145,51 @@ History
.. towncrier release notes start
+0.12.0 (2023-09-24)
+===================
+
+Features
+--------
+
+- Add github/gitlab username:access_token parse support (#21)
+- Migrate to bump-my-version (#79)
+
+
+Bugfixes
+--------
+
+- Fix Gitlab URLs with branch (#42)
+- Align tox.ini with github actions (#71)
+
+
+0.11.1 (2023-08-04)
+===================
+
+Bugfixes
+--------
+
+- Remove debug print statements (#66)
+
+
+0.11.0 (2023-08-03)
+===================
+
+Features
+--------
+
+- Add parsing variable for user to gitlab parser (#47)
+- Add support for Python 3.8+ (#48)
+
+
+Bugfixes
+--------
+
+- Update tests invocation method to avoid future breakages (#29)
+- Update linting tools and fix code style (#34)
+- Add more github use cases (#43)
+- Fix parsing generic git url (#46)
+
+
0.10.0 (2020-12-05)
===================
@@ -161,5 +210,3 @@ Features
==================
* First fork release
-
-
diff --git a/third_party/python/giturlparse/giturlparse-0.12.0.dist-info/RECORD b/third_party/python/giturlparse/giturlparse-0.12.0.dist-info/RECORD
new file mode 100644
index 000000000000..0b1f8b738d17
--- /dev/null
+++ b/third_party/python/giturlparse/giturlparse-0.12.0.dist-info/RECORD
@@ -0,0 +1,18 @@
+giturlparse/__init__.py,sha256=Et0mV504K6ypj76y-60gU0qYzqmiRTbq1YdOrARrTA4,332
+giturlparse/parser.py,sha256=-4ygZsi8n7zwMHSD9JKFKcpoXqmLZZIyuXbbPUisC8E,1902
+giturlparse/result.py,sha256=f5H0x3VUnTjm3iUT6rZsKNIXuxEecVpAOvZzi4Zlm4g,2841
+giturlparse/platforms/__init__.py,sha256=y8xzQWxqGHwlvx0pY99Hqott-xK2Q0iBzpQ9dTehTrY,527
+giturlparse/platforms/assembla.py,sha256=JK6DND7nfgCNzY0ugFSmn4GkquG8gpDoiv_Mr7bmtLU,512
+giturlparse/platforms/base.py,sha256=_BT0V_z6ACpQfysRn_QYPq7yfg4N0NcjcfibfYkvDiI,1575
+giturlparse/platforms/bitbucket.py,sha256=yAn6yOh5VB9aiVGGwh2rQKM-YIp1727UMhxMq-P2DU0,694
+giturlparse/platforms/friendcode.py,sha256=Nf3yl4OVvdYyteQZ93zbUUbMOeLFwQTiz5f-dM72COU,396
+giturlparse/platforms/github.py,sha256=N4OJ5_Bih-8GmWKmloAMVsRJ4zHgpjFCGC_ZjkF08Rg,1551
+giturlparse/platforms/gitlab.py,sha256=rVrlnQ8Em7ZgeU_mAXcxrhOxJ3BUEebAxqbaw10_q2o,2069
+giturlparse/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+giturlparse/tests/test_parse.py,sha256=1bqwfNn4f9tEFdtt6ZtRDSyHA0aaXP1PMaw22CpckM4,24425
+giturlparse/tests/test_rewrite.py,sha256=FNFgRB7m1P4Gm2Ug17QUoiYh4Nxh3nW6xhOBoiftPyo,4056
+giturlparse-0.12.0.dist-info/LICENSE,sha256=c7p036pSC0mkAbXSFFmoUjoUbzt1GKgz7qXvqFEwv2g,10273
+giturlparse-0.12.0.dist-info/METADATA,sha256=acBpJYXHGYX2xDRdhc9CoEwOmWRkE8pPSHkhiQdkxBw,4509
+giturlparse-0.12.0.dist-info/WHEEL,sha256=iYlv5fX357PQyRT2o6tw1bN-YcKFFHKqB_LwHO5wP-g,110
+giturlparse-0.12.0.dist-info/top_level.txt,sha256=NHfX7iaRAYz-bnROU6Q0tgNInQU-YgIeeii0uznxCLA,12
+giturlparse-0.12.0.dist-info/RECORD,,
diff --git a/third_party/python/chardet/chardet-4.0.0.dist-info/WHEEL b/third_party/python/giturlparse/giturlparse-0.12.0.dist-info/WHEEL
similarity index 70%
rename from third_party/python/chardet/chardet-4.0.0.dist-info/WHEEL
rename to third_party/python/giturlparse/giturlparse-0.12.0.dist-info/WHEEL
index 6d38aa0601b3..c34f1162ef9a 100644
--- a/third_party/python/chardet/chardet-4.0.0.dist-info/WHEEL
+++ b/third_party/python/giturlparse/giturlparse-0.12.0.dist-info/WHEEL
@@ -1,5 +1,5 @@
Wheel-Version: 1.0
-Generator: bdist_wheel (0.35.1)
+Generator: bdist_wheel (0.41.2)
Root-Is-Purelib: true
Tag: py2-none-any
Tag: py3-none-any
diff --git a/third_party/python/giturlparse/giturlparse-0.10.0.dist-info/top_level.txt b/third_party/python/giturlparse/giturlparse-0.12.0.dist-info/top_level.txt
similarity index 100%
rename from third_party/python/giturlparse/giturlparse-0.10.0.dist-info/top_level.txt
rename to third_party/python/giturlparse/giturlparse-0.12.0.dist-info/top_level.txt
diff --git a/third_party/python/giturlparse/giturlparse/__init__.py b/third_party/python/giturlparse/giturlparse/__init__.py
index aee86e37505b..6bdad3b73028 100644
--- a/third_party/python/giturlparse/giturlparse/__init__.py
+++ b/third_party/python/giturlparse/giturlparse/__init__.py
@@ -3,7 +3,7 @@ from .result import GitUrlParsed
__author__ = "Iacopo Spalletti"
__email__ = "i.spalletti@nephila.it"
-__version__ = "0.10.0"
+__version__ = "0.12.0"
def parse(url, check_domain=True):
diff --git a/third_party/python/giturlparse/giturlparse/parser.py b/third_party/python/giturlparse/giturlparse/parser.py
index c67f03500de4..f2c99e21b690 100644
--- a/third_party/python/giturlparse/giturlparse/parser.py
+++ b/third_party/python/giturlparse/giturlparse/parser.py
@@ -13,6 +13,8 @@ SUPPORTED_ATTRIBUTES = (
"url",
"platform",
"protocol",
+ "username",
+ "access_token",
)
@@ -22,6 +24,7 @@ def parse(url, check_domain=True):
parsed_info["port"] = ""
parsed_info["path_raw"] = ""
parsed_info["groups_path"] = ""
+ parsed_info["owner"] = ""
# Defaults to all attributes
map(parsed_info.setdefault, SUPPORTED_ATTRIBUTES)
@@ -34,14 +37,13 @@ def parse(url, check_domain=True):
# Skip if not matched
if not match:
- # print("[%s] URL: %s dit not match %s" % (name, url, regex.pattern))
continue
# Skip if domain is bad
domain = match.group("domain")
# print('[%s] DOMAIN = %s' % (url, domain,))
if check_domain:
- if platform.DOMAINS and not (domain in platform.DOMAINS):
+ if platform.DOMAINS and domain not in platform.DOMAINS:
continue
if platform.SKIP_DOMAINS and domain in platform.SKIP_DOMAINS:
continue
diff --git a/third_party/python/giturlparse/giturlparse/platforms/assembla.py b/third_party/python/giturlparse/giturlparse/platforms/assembla.py
index 2624e859542f..ac56499873a7 100644
--- a/third_party/python/giturlparse/giturlparse/platforms/assembla.py
+++ b/third_party/python/giturlparse/giturlparse/platforms/assembla.py
@@ -8,7 +8,7 @@ class AssemblaPlatform(BasePlatform):
"git": r"(?P(?Pgit))://(?P.+?)/(?P(?P.+)).git",
}
FORMATS = {
- "ssh": r"git@%(domain)s:%(repo)s.git",
- "git": r"git://%(domain)s/%(repo)s.git",
+ "ssh": r"git@%(domain)s:%(repo)s%(dot_git)s",
+ "git": r"git://%(domain)s/%(repo)s%(dot_git)s",
}
DEFAULTS = {"_user": "git"}
diff --git a/third_party/python/giturlparse/giturlparse/platforms/base.py b/third_party/python/giturlparse/giturlparse/platforms/base.py
index 000726381dd1..8ca9badaa63a 100644
--- a/third_party/python/giturlparse/giturlparse/platforms/base.py
+++ b/third_party/python/giturlparse/giturlparse/platforms/base.py
@@ -4,17 +4,16 @@ import re
class BasePlatform:
FORMATS = {
- "ssh": r"(?P(git\+)?(?Pssh))?(://)?%(_user)s@%(host)s:%(repo)s.git",
- "http": r"(?P(git\+)?(?Phttp))://%(host)s/%(repo)s.git",
- "https": r"(?P(git\+)?(?Phttps))://%(host)s/%(repo)s.git",
- "git": r"(?P(?Pgit))://%(host)s/%(repo)s.git",
+ "https": r"https://%(domain)s/%(repo)s%(dot_git)s",
+ "ssh": r"git@%(domain)s:%(repo)s%(dot_git)s%(path_raw)s",
+ "git": r"git://%(domain)s/%(repo)s%(dot_git)s%(path_raw)s",
}
PATTERNS = {
- "ssh": r"(?P<_user>.+)@(?P[^/]+?):(?P.+).git",
- "http": r"http://(?P[^/]+?)/(?P.+).git",
- "https": r"https://(?P[^/]+?)/(?P.+).git",
- "git": r"git://(?P[^/]+?)/(?P.+).git",
+ "ssh": r"(?P<_user>.+)@(?P[^/]+?):(?P.+)(?:(\.git)?(/)?)",
+ "http": r"(?P(?Phttp))://(?P[^/]+?)/(?P.+)(?:(\.git)?(/)?)",
+ "https": r"(?P(?Phttps))://(?P[^/]+?)/(?P.+)(?:(\.git)?(/)?)",
+ "git": r"(?P(?Pgit))://(?P[^/]+?)/(?P.+)(?:(\.git)?(/)?)",
}
# None means it matches all domains
@@ -38,6 +37,6 @@ class BasePlatform:
def clean_data(data):
data["path"] = ""
data["branch"] = ""
- data["protocols"] = list(filter(lambda x: x, data["protocols"].split("+")))
- data["pathname"] = data["pathname"].strip(":")
+ data["protocols"] = list(filter(lambda x: x, data.get("protocols", "").split("+")))
+ data["pathname"] = data.get("pathname", "").strip(":").rstrip("/")
return data
diff --git a/third_party/python/giturlparse/giturlparse/platforms/bitbucket.py b/third_party/python/giturlparse/giturlparse/platforms/bitbucket.py
index baab24466b2d..51c1d543fe57 100644
--- a/third_party/python/giturlparse/giturlparse/platforms/bitbucket.py
+++ b/third_party/python/giturlparse/giturlparse/platforms/bitbucket.py
@@ -13,8 +13,8 @@ class BitbucketPlatform(BasePlatform):
),
}
FORMATS = {
- "https": r"https://%(owner)s@%(domain)s/%(owner)s/%(repo)s.git",
- "ssh": r"git@%(domain)s:%(owner)s/%(repo)s.git",
+ "https": r"https://%(owner)s@%(domain)s/%(owner)s/%(repo)s%(dot_git)s",
+ "ssh": r"git@%(domain)s:%(owner)s/%(repo)s%(dot_git)s",
}
DOMAINS = ("bitbucket.org",)
DEFAULTS = {"_user": "git"}
diff --git a/third_party/python/giturlparse/giturlparse/platforms/friendcode.py b/third_party/python/giturlparse/giturlparse/platforms/friendcode.py
index 6de9f17eabec..87149e667299 100644
--- a/third_party/python/giturlparse/giturlparse/platforms/friendcode.py
+++ b/third_party/python/giturlparse/giturlparse/platforms/friendcode.py
@@ -10,5 +10,5 @@ class FriendCodePlatform(BasePlatform):
),
}
FORMATS = {
- "https": r"https://%(domain)s/%(owner)s@user/%(repo)s.git",
+ "https": r"https://%(domain)s/%(owner)s@user/%(repo)s%(dot_git)s",
}
diff --git a/third_party/python/giturlparse/giturlparse/platforms/github.py b/third_party/python/giturlparse/giturlparse/platforms/github.py
index 8eb44ef5134c..e31943ff90a0 100644
--- a/third_party/python/giturlparse/giturlparse/platforms/github.py
+++ b/third_party/python/giturlparse/giturlparse/platforms/github.py
@@ -4,24 +4,25 @@ from .base import BasePlatform
class GitHubPlatform(BasePlatform):
PATTERNS = {
"https": (
- r"(?P(git\+)?(?Phttps))://(?P[^/]+?)"
- r"(?P/(?P[^/]+?)/(?P[^/]+?)(?:\.git)?(?P(/blob/|/tree/).+)?)$"
+ r"(?P(git\+)?(?Phttps))://"
+ r"((?P[^/]+?):(?P[^/]+?)@)?(?P[^/]+?)"
+ r"(?P/(?P[^/]+?)/(?P[^/]+?)(?:(\.git)?(/)?)(?P(/blob/|/tree/).+)?)$"
),
"ssh": (
r"(?P(git\+)?(?Pssh))?(://)?git@(?P.+?)(?P(:|/)"
- r"(?P[^/]+)/(?P[^/]+?)(?:\.git)"
+ r"(?P[^/]+)/(?P[^/]+?)(?:(\.git)?(/)?)"
r"(?P(/blob/|/tree/).+)?)$"
),
"git": (
r"(?P(?Pgit))://(?P.+?)"
- r"(?P/(?P[^/]+)/(?P[^/]+?)(?:\.git)?"
+ r"(?P/(?P[^/]+)/(?P[^/]+?)(?:(\.git)?(/)?)"
r"(?P(/blob/|/tree/).+)?)$"
),
}
FORMATS = {
- "https": r"https://%(domain)s/%(owner)s/%(repo)s.git%(path_raw)s",
- "ssh": r"git@%(domain)s:%(owner)s/%(repo)s.git%(path_raw)s",
- "git": r"git://%(domain)s/%(owner)s/%(repo)s.git%(path_raw)s",
+ "https": r"https://%(domain)s/%(owner)s/%(repo)s%(dot_git)s%(path_raw)s",
+ "ssh": r"git@%(domain)s:%(owner)s/%(repo)s%(dot_git)s%(path_raw)s",
+ "git": r"git://%(domain)s/%(owner)s/%(repo)s%(dot_git)s%(path_raw)s",
}
DOMAINS = (
"github.com",
diff --git a/third_party/python/giturlparse/giturlparse/platforms/gitlab.py b/third_party/python/giturlparse/giturlparse/platforms/gitlab.py
index 38b37efb2336..44d3cd54aecc 100644
--- a/third_party/python/giturlparse/giturlparse/platforms/gitlab.py
+++ b/third_party/python/giturlparse/giturlparse/platforms/gitlab.py
@@ -4,28 +4,29 @@ from .base import BasePlatform
class GitLabPlatform(BasePlatform):
PATTERNS = {
"https": (
- r"(?P(git\+)?(?Phttps))://(?P.+?)(?P:[0-9]+)?"
+ r"(?P(git\+)?(?Phttps))://"
+ r"((?P[^/]+?):(?P[^/]+?)@)?(?P[^:/]+)(?P:[0-9]+)?"
r"(?P/(?P[^/]+?)/"
- r"(?P.*?)?(?(groups_path)/)?(?P[^/]+?)(?:\.git)?"
- r"(?P(/blob/|/-/tree/).+)?)$"
+ r"(?P.*?)?(?(groups_path)/)?(?P[^/]+?)(?:(\.git)?(/)?)"
+ r"(?P(/blob/|/-/blob/|/-/tree/).+)?)$"
),
"ssh": (
- r"(?P(git\+)?(?Pssh))?(://)?git@(?P.+?):(?P[0-9]+)?(?(port))?"
+ r"(?P(git\+)?(?Pssh))?(://)?(?P<_user>.+?)@(?P[^:/]+)(:)?(?P[0-9]+)?(?(port))?"
r"(?P/?(?P[^/]+)/"
- r"(?P.*?)?(?(groups_path)/)?(?P[^/]+?)(?:\.git)?"
- r"(?P(/blob/|/-/tree/).+)?)$"
+ r"(?P.*?)?(?(groups_path)/)?(?P[^/]+?)(?:(\.git)?(/)?)"
+ r"(?P(/blob/|/-/blob/|/-/tree/).+)?)$"
),
"git": (
- r"(?P(?Pgit))://(?P.+?):(?P[0-9]+)?(?(port))?"
- r"(?P/?(?P[^/]+)/"
- r"(?P.*?)?(?(groups_path)/)?(?P[^/]+?)(?:\.git)?"
- r"(?P(/blob/|/-/tree/).+)?)$"
+ r"(?P(?Pgit))://(?P[^:/]+):?(?P[0-9]+)?(?(port))?"
+ r"(?P/(?P[^/]+?)/"
+ r"(?P.*?)?(?(groups_path)/)?(?P[^/]+?)(?:(\.git)?(/)?)"
+ r"(?P(/blob/|/-/blob/|/-/tree/).+)?)$"
),
}
FORMATS = {
- "https": r"https://%(domain)s/%(owner)s/%(groups_slash)s%(repo)s.git%(path_raw)s",
- "ssh": r"git@%(domain)s:%(port_slash)s%(owner)s/%(groups_slash)s%(repo)s.git%(path_raw)s",
- "git": r"git://%(domain)s%(port)s/%(owner)s/%(groups_slash)s%(repo)s.git%(path_raw)s",
+ "https": r"https://%(domain)s/%(owner)s/%(groups_slash)s%(repo)s%(dot_git)s%(path_raw)s",
+ "ssh": r"git@%(domain)s:%(port_slash)s%(owner)s/%(groups_slash)s%(repo)s%(dot_git)s%(path_raw)s",
+ "git": r"git://%(domain)s%(port)s/%(owner)s/%(groups_slash)s%(repo)s%(dot_git)s%(path_raw)s",
}
SKIP_DOMAINS = (
"github.com",
@@ -38,6 +39,8 @@ class GitLabPlatform(BasePlatform):
data = BasePlatform.clean_data(data)
if data["path_raw"].startswith("/blob/"):
data["path"] = data["path_raw"].replace("/blob/", "")
+ if data["path_raw"].startswith("/-/blob/"):
+ data["path"] = data["path_raw"].replace("/-/blob/", "")
if data["path_raw"].startswith("/-/tree/"):
data["branch"] = data["path_raw"].replace("/-/tree/", "")
return data
diff --git a/third_party/python/giturlparse/giturlparse/result.py b/third_party/python/giturlparse/giturlparse/result.py
index 4a33136c51cf..43194373871c 100644
--- a/third_party/python/giturlparse/giturlparse/result.py
+++ b/third_party/python/giturlparse/giturlparse/result.py
@@ -69,6 +69,7 @@ class GitUrlParsed:
items = copy(self._parsed)
items["port_slash"] = "%s/" % self.port if self.port else ""
items["groups_slash"] = "%s/" % self.groups_path if self.groups_path else ""
+ items["dot_git"] = "" if items["repo"].endswith(".git") else ".git"
return self._platform_obj.FORMATS[protocol] % items
@property
diff --git a/third_party/python/idna/idna-2.10.dist-info/LICENSE.rst b/third_party/python/idna/idna-2.10.dist-info/LICENSE.rst
deleted file mode 100644
index 63664b82e7a2..000000000000
--- a/third_party/python/idna/idna-2.10.dist-info/LICENSE.rst
+++ /dev/null
@@ -1,34 +0,0 @@
-License
--------
-
-License: bsd-3-clause
-
-Copyright (c) 2013-2020, Kim Davies. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-#. Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-
-#. Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following
- disclaimer in the documentation and/or other materials provided with
- the distribution.
-
-#. Neither the name of the copyright holder nor the names of the
- contributors may be used to endorse or promote products derived
- from this software without specific prior written permission.
-
-#. THIS SOFTWARE IS PROVIDED BY THE 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 HOLDERS OR
- CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
- USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
- DAMAGE.
diff --git a/third_party/python/idna/idna-2.10.dist-info/METADATA b/third_party/python/idna/idna-2.10.dist-info/METADATA
deleted file mode 100644
index f73c0ffefe83..000000000000
--- a/third_party/python/idna/idna-2.10.dist-info/METADATA
+++ /dev/null
@@ -1,243 +0,0 @@
-Metadata-Version: 2.1
-Name: idna
-Version: 2.10
-Summary: Internationalized Domain Names in Applications (IDNA)
-Home-page: https://github.com/kjd/idna
-Author: Kim Davies
-Author-email: kim@cynosure.com.au
-License: BSD-like
-Platform: UNKNOWN
-Classifier: Development Status :: 5 - Production/Stable
-Classifier: Intended Audience :: Developers
-Classifier: Intended Audience :: System Administrators
-Classifier: License :: OSI Approved :: BSD License
-Classifier: Operating System :: OS Independent
-Classifier: Programming Language :: Python
-Classifier: Programming Language :: Python :: 2
-Classifier: Programming Language :: Python :: 2.7
-Classifier: Programming Language :: Python :: 3
-Classifier: Programming Language :: Python :: 3.4
-Classifier: Programming Language :: Python :: 3.5
-Classifier: Programming Language :: Python :: 3.6
-Classifier: Programming Language :: Python :: 3.7
-Classifier: Programming Language :: Python :: 3.8
-Classifier: Programming Language :: Python :: Implementation :: CPython
-Classifier: Programming Language :: Python :: Implementation :: PyPy
-Classifier: Topic :: Internet :: Name Service (DNS)
-Classifier: Topic :: Software Development :: Libraries :: Python Modules
-Classifier: Topic :: Utilities
-Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*
-
-Internationalized Domain Names in Applications (IDNA)
-=====================================================
-
-Support for the Internationalised Domain Names in Applications
-(IDNA) protocol as specified in `RFC 5891 `_.
-This is the latest version of the protocol and is sometimes referred to as
-“IDNA 2008”.
-
-This library also provides support for Unicode Technical Standard 46,
-`Unicode IDNA Compatibility Processing `_.
-
-This acts as a suitable replacement for the “encodings.idna” module that
-comes with the Python standard library, but only supports the
-old, deprecated IDNA specification (`RFC 3490 `_).
-
-Basic functions are simply executed:
-
-.. code-block:: pycon
-
- # Python 3
- >>> import idna
- >>> idna.encode('ドメイン.テスト')
- b'xn--eckwd4c7c.xn--zckzah'
- >>> print(idna.decode('xn--eckwd4c7c.xn--zckzah'))
- ドメイン.テスト
-
- # Python 2
- >>> import idna
- >>> idna.encode(u'ドメイン.テスト')
- 'xn--eckwd4c7c.xn--zckzah'
- >>> print idna.decode('xn--eckwd4c7c.xn--zckzah')
- ドメイン.テスト
-
-Packages
---------
-
-The latest tagged release version is published in the PyPI repository:
-
-.. image:: https://badge.fury.io/py/idna.svg
- :target: http://badge.fury.io/py/idna
-
-
-Installation
-------------
-
-To install this library, you can use pip:
-
-.. code-block:: bash
-
- $ pip install idna
-
-Alternatively, you can install the package using the bundled setup script:
-
-.. code-block:: bash
-
- $ python setup.py install
-
-This library works with Python 2.7 and Python 3.4 or later.
-
-
-Usage
------
-
-For typical usage, the ``encode`` and ``decode`` functions will take a domain
-name argument and perform a conversion to A-labels or U-labels respectively.
-
-.. code-block:: pycon
-
- # Python 3
- >>> import idna
- >>> idna.encode('ドメイン.テスト')
- b'xn--eckwd4c7c.xn--zckzah'
- >>> print(idna.decode('xn--eckwd4c7c.xn--zckzah'))
- ドメイン.テスト
-
-You may use the codec encoding and decoding methods using the
-``idna.codec`` module:
-
-.. code-block:: pycon
-
- # Python 2
- >>> import idna.codec
- >>> print u'домена.испытание'.encode('idna')
- xn--80ahd1agd.xn--80akhbyknj4f
- >>> print 'xn--80ahd1agd.xn--80akhbyknj4f'.decode('idna')
- домена.испытание
-
-Conversions can be applied at a per-label basis using the ``ulabel`` or ``alabel``
-functions if necessary:
-
-.. code-block:: pycon
-
- # Python 2
- >>> idna.alabel(u'测试')
- 'xn--0zwm56d'
-
-Compatibility Mapping (UTS #46)
-+++++++++++++++++++++++++++++++
-
-As described in `RFC 5895 `_, the IDNA
-specification no longer normalizes input from different potential ways a user
-may input a domain name. This functionality, known as a “mapping”, is now
-considered by the specification to be a local user-interface issue distinct
-from IDNA conversion functionality.
-
-This library provides one such mapping, that was developed by the Unicode
-Consortium. Known as `Unicode IDNA Compatibility Processing `_,
-it provides for both a regular mapping for typical applications, as well as
-a transitional mapping to help migrate from older IDNA 2003 applications.
-
-For example, “Königsgäßchen” is not a permissible label as *LATIN CAPITAL
-LETTER K* is not allowed (nor are capital letters in general). UTS 46 will
-convert this into lower case prior to applying the IDNA conversion.
-
-.. code-block:: pycon
-
- # Python 3
- >>> import idna
- >>> idna.encode(u'Königsgäßchen')
- ...
- idna.core.InvalidCodepoint: Codepoint U+004B at position 1 of 'Königsgäßchen' not allowed
- >>> idna.encode('Königsgäßchen', uts46=True)
- b'xn--knigsgchen-b4a3dun'
- >>> print(idna.decode('xn--knigsgchen-b4a3dun'))
- königsgäßchen
-
-Transitional processing provides conversions to help transition from the older
-2003 standard to the current standard. For example, in the original IDNA
-specification, the *LATIN SMALL LETTER SHARP S* (ß) was converted into two
-*LATIN SMALL LETTER S* (ss), whereas in the current IDNA specification this
-conversion is not performed.
-
-.. code-block:: pycon
-
- # Python 2
- >>> idna.encode(u'Königsgäßchen', uts46=True, transitional=True)
- 'xn--knigsgsschen-lcb0w'
-
-Implementors should use transitional processing with caution, only in rare
-cases where conversion from legacy labels to current labels must be performed
-(i.e. IDNA implementations that pre-date 2008). For typical applications
-that just need to convert labels, transitional processing is unlikely to be
-beneficial and could produce unexpected incompatible results.
-
-``encodings.idna`` Compatibility
-++++++++++++++++++++++++++++++++
-
-Function calls from the Python built-in ``encodings.idna`` module are
-mapped to their IDNA 2008 equivalents using the ``idna.compat`` module.
-Simply substitute the ``import`` clause in your code to refer to the
-new module name.
-
-Exceptions
-----------
-
-All errors raised during the conversion following the specification should
-raise an exception derived from the ``idna.IDNAError`` base class.
-
-More specific exceptions that may be generated as ``idna.IDNABidiError``
-when the error reflects an illegal combination of left-to-right and right-to-left
-characters in a label; ``idna.InvalidCodepoint`` when a specific codepoint is
-an illegal character in an IDN label (i.e. INVALID); and ``idna.InvalidCodepointContext``
-when the codepoint is illegal based on its positional context (i.e. it is CONTEXTO
-or CONTEXTJ but the contextual requirements are not satisfied.)
-
-Building and Diagnostics
-------------------------
-
-The IDNA and UTS 46 functionality relies upon pre-calculated lookup tables for
-performance. These tables are derived from computing against eligibility criteria
-in the respective standards. These tables are computed using the command-line
-script ``tools/idna-data``.
-
-This tool will fetch relevant tables from the Unicode Consortium and perform the
-required calculations to identify eligibility. It has three main modes:
-
-* ``idna-data make-libdata``. Generates ``idnadata.py`` and ``uts46data.py``,
- the pre-calculated lookup tables using for IDNA and UTS 46 conversions. Implementors
- who wish to track this library against a different Unicode version may use this tool
- to manually generate a different version of the ``idnadata.py`` and ``uts46data.py``
- files.
-
-* ``idna-data make-table``. Generate a table of the IDNA disposition
- (e.g. PVALID, CONTEXTJ, CONTEXTO) in the format found in Appendix B.1 of RFC
- 5892 and the pre-computed tables published by `IANA `_.
-
-* ``idna-data U+0061``. Prints debugging output on the various properties
- associated with an individual Unicode codepoint (in this case, U+0061), that are
- used to assess the IDNA and UTS 46 status of a codepoint. This is helpful in debugging
- or analysis.
-
-The tool accepts a number of arguments, described using ``idna-data -h``. Most notably,
-the ``--version`` argument allows the specification of the version of Unicode to use
-in computing the table data. For example, ``idna-data --version 9.0.0 make-libdata``
-will generate library data against Unicode 9.0.0.
-
-Note that this script requires Python 3, but all generated library data will work
-in Python 2.7.
-
-
-Testing
--------
-
-The library has a test suite based on each rule of the IDNA specification, as
-well as tests that are provided as part of the Unicode Technical Standard 46,
-`Unicode IDNA Compatibility Processing `_.
-
-The tests are run automatically on each commit at Travis CI:
-
-.. image:: https://travis-ci.org/kjd/idna.svg?branch=master
- :target: https://travis-ci.org/kjd/idna
-
-
diff --git a/third_party/python/idna/idna-2.10.dist-info/RECORD b/third_party/python/idna/idna-2.10.dist-info/RECORD
deleted file mode 100644
index fd40d6538206..000000000000
--- a/third_party/python/idna/idna-2.10.dist-info/RECORD
+++ /dev/null
@@ -1,13 +0,0 @@
-idna/__init__.py,sha256=9Nt7xpyet3DmOrPUGooDdAwmHZZu1qUAy2EaJ93kGiQ,58
-idna/codec.py,sha256=lvYb7yu7PhAqFaAIAdWcwgaWI2UmgseUua-1c0AsG0A,3299
-idna/compat.py,sha256=R-h29D-6mrnJzbXxymrWUW7iZUvy-26TQwZ0ij57i4U,232
-idna/core.py,sha256=jCoaLb3bA2tS_DDx9PpGuNTEZZN2jAzB369aP-IHYRE,11951
-idna/idnadata.py,sha256=gmzFwZWjdms3kKZ_M_vwz7-LP_SCgYfSeE03B21Qpsk,42350
-idna/intranges.py,sha256=TY1lpxZIQWEP6tNqjZkFA5hgoMWOj1OBmnUG8ihT87E,1749
-idna/package_data.py,sha256=bxBjpLnE06_1jSYKEy5svOMu1zM3OMztXVUb1tPlcp0,22
-idna/uts46data.py,sha256=lMdw2zdjkH1JUWXPPEfFUSYT3Fyj60bBmfLvvy5m7ko,202084
-idna-2.10.dist-info/LICENSE.rst,sha256=QSAUQg0kc9ugYRfD1Nng7sqm3eDKMM2VH07CvjlCbzI,1565
-idna-2.10.dist-info/METADATA,sha256=ZWCaQDBjdmSvx5EU7Cv6ORC-9NUQ6nXh1eXx38ySe40,9104
-idna-2.10.dist-info/WHEEL,sha256=8zNYZbwQSXoB9IfXOjPfeNwvAsALAjffgk27FqvCWbo,110
-idna-2.10.dist-info/top_level.txt,sha256=jSag9sEDqvSPftxOQy-ABfGV_RSy7oFh4zZJpODV8k0,5
-idna-2.10.dist-info/RECORD,,
diff --git a/third_party/python/idna/idna-2.10.dist-info/top_level.txt b/third_party/python/idna/idna-2.10.dist-info/top_level.txt
deleted file mode 100644
index c40472e6fc27..000000000000
--- a/third_party/python/idna/idna-2.10.dist-info/top_level.txt
+++ /dev/null
@@ -1 +0,0 @@
-idna
diff --git a/third_party/python/idna/idna-3.10.dist-info/LICENSE.md b/third_party/python/idna/idna-3.10.dist-info/LICENSE.md
new file mode 100644
index 000000000000..19b6b45242c1
--- /dev/null
+++ b/third_party/python/idna/idna-3.10.dist-info/LICENSE.md
@@ -0,0 +1,31 @@
+BSD 3-Clause License
+
+Copyright (c) 2013-2024, Kim Davies and contributors.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+3. Neither the name of the copyright holder nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL 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.
diff --git a/third_party/python/idna/idna-3.10.dist-info/METADATA b/third_party/python/idna/idna-3.10.dist-info/METADATA
new file mode 100644
index 000000000000..c42623e9423c
--- /dev/null
+++ b/third_party/python/idna/idna-3.10.dist-info/METADATA
@@ -0,0 +1,250 @@
+Metadata-Version: 2.1
+Name: idna
+Version: 3.10
+Summary: Internationalized Domain Names in Applications (IDNA)
+Author-email: Kim Davies
+Requires-Python: >=3.6
+Description-Content-Type: text/x-rst
+Classifier: Development Status :: 5 - Production/Stable
+Classifier: Intended Audience :: Developers
+Classifier: Intended Audience :: System Administrators
+Classifier: License :: OSI Approved :: BSD License
+Classifier: Operating System :: OS Independent
+Classifier: Programming Language :: Python
+Classifier: Programming Language :: Python :: 3
+Classifier: Programming Language :: Python :: 3 :: Only
+Classifier: Programming Language :: Python :: 3.6
+Classifier: Programming Language :: Python :: 3.7
+Classifier: Programming Language :: Python :: 3.8
+Classifier: Programming Language :: Python :: 3.9
+Classifier: Programming Language :: Python :: 3.10
+Classifier: Programming Language :: Python :: 3.11
+Classifier: Programming Language :: Python :: 3.12
+Classifier: Programming Language :: Python :: 3.13
+Classifier: Programming Language :: Python :: Implementation :: CPython
+Classifier: Programming Language :: Python :: Implementation :: PyPy
+Classifier: Topic :: Internet :: Name Service (DNS)
+Classifier: Topic :: Software Development :: Libraries :: Python Modules
+Classifier: Topic :: Utilities
+Requires-Dist: ruff >= 0.6.2 ; extra == "all"
+Requires-Dist: mypy >= 1.11.2 ; extra == "all"
+Requires-Dist: pytest >= 8.3.2 ; extra == "all"
+Requires-Dist: flake8 >= 7.1.1 ; extra == "all"
+Project-URL: Changelog, https://github.com/kjd/idna/blob/master/HISTORY.rst
+Project-URL: Issue tracker, https://github.com/kjd/idna/issues
+Project-URL: Source, https://github.com/kjd/idna
+Provides-Extra: all
+
+Internationalized Domain Names in Applications (IDNA)
+=====================================================
+
+Support for the Internationalized Domain Names in
+Applications (IDNA) protocol as specified in `RFC 5891
+`_. This is the latest version of
+the protocol and is sometimes referred to as “IDNA 2008”.
+
+This library also provides support for Unicode Technical
+Standard 46, `Unicode IDNA Compatibility Processing
+`_.
+
+This acts as a suitable replacement for the “encodings.idna”
+module that comes with the Python standard library, but which
+only supports the older superseded IDNA specification (`RFC 3490
+`_).
+
+Basic functions are simply executed:
+
+.. code-block:: pycon
+
+ >>> import idna
+ >>> idna.encode('ドメイン.テスト')
+ b'xn--eckwd4c7c.xn--zckzah'
+ >>> print(idna.decode('xn--eckwd4c7c.xn--zckzah'))
+ ドメイン.テスト
+
+
+Installation
+------------
+
+This package is available for installation from PyPI:
+
+.. code-block:: bash
+
+ $ python3 -m pip install idna
+
+
+Usage
+-----
+
+For typical usage, the ``encode`` and ``decode`` functions will take a
+domain name argument and perform a conversion to A-labels or U-labels
+respectively.
+
+.. code-block:: pycon
+
+ >>> import idna
+ >>> idna.encode('ドメイン.テスト')
+ b'xn--eckwd4c7c.xn--zckzah'
+ >>> print(idna.decode('xn--eckwd4c7c.xn--zckzah'))
+ ドメイン.テスト
+
+You may use the codec encoding and decoding methods using the
+``idna.codec`` module:
+
+.. code-block:: pycon
+
+ >>> import idna.codec
+ >>> print('домен.испытание'.encode('idna2008'))
+ b'xn--d1acufc.xn--80akhbyknj4f'
+ >>> print(b'xn--d1acufc.xn--80akhbyknj4f'.decode('idna2008'))
+ домен.испытание
+
+Conversions can be applied at a per-label basis using the ``ulabel`` or
+``alabel`` functions if necessary:
+
+.. code-block:: pycon
+
+ >>> idna.alabel('测试')
+ b'xn--0zwm56d'
+
+Compatibility Mapping (UTS #46)
++++++++++++++++++++++++++++++++
+
+As described in `RFC 5895 `_, the
+IDNA specification does not normalize input from different potential
+ways a user may input a domain name. This functionality, known as
+a “mapping”, is considered by the specification to be a local
+user-interface issue distinct from IDNA conversion functionality.
+
+This library provides one such mapping that was developed by the
+Unicode Consortium. Known as `Unicode IDNA Compatibility Processing
+`_, it provides for both a regular
+mapping for typical applications, as well as a transitional mapping to
+help migrate from older IDNA 2003 applications. Strings are
+preprocessed according to Section 4.4 “Preprocessing for IDNA2008”
+prior to the IDNA operations.
+
+For example, “Königsgäßchen” is not a permissible label as *LATIN
+CAPITAL LETTER K* is not allowed (nor are capital letters in general).
+UTS 46 will convert this into lower case prior to applying the IDNA
+conversion.
+
+.. code-block:: pycon
+
+ >>> import idna
+ >>> idna.encode('Königsgäßchen')
+ ...
+ idna.core.InvalidCodepoint: Codepoint U+004B at position 1 of 'Königsgäßchen' not allowed
+ >>> idna.encode('Königsgäßchen', uts46=True)
+ b'xn--knigsgchen-b4a3dun'
+ >>> print(idna.decode('xn--knigsgchen-b4a3dun'))
+ königsgäßchen
+
+Transitional processing provides conversions to help transition from
+the older 2003 standard to the current standard. For example, in the
+original IDNA specification, the *LATIN SMALL LETTER SHARP S* (ß) was
+converted into two *LATIN SMALL LETTER S* (ss), whereas in the current
+IDNA specification this conversion is not performed.
+
+.. code-block:: pycon
+
+ >>> idna.encode('Königsgäßchen', uts46=True, transitional=True)
+ 'xn--knigsgsschen-lcb0w'
+
+Implementers should use transitional processing with caution, only in
+rare cases where conversion from legacy labels to current labels must be
+performed (i.e. IDNA implementations that pre-date 2008). For typical
+applications that just need to convert labels, transitional processing
+is unlikely to be beneficial and could produce unexpected incompatible
+results.
+
+``encodings.idna`` Compatibility
+++++++++++++++++++++++++++++++++
+
+Function calls from the Python built-in ``encodings.idna`` module are
+mapped to their IDNA 2008 equivalents using the ``idna.compat`` module.
+Simply substitute the ``import`` clause in your code to refer to the new
+module name.
+
+Exceptions
+----------
+
+All errors raised during the conversion following the specification
+should raise an exception derived from the ``idna.IDNAError`` base
+class.
+
+More specific exceptions that may be generated as ``idna.IDNABidiError``
+when the error reflects an illegal combination of left-to-right and
+right-to-left characters in a label; ``idna.InvalidCodepoint`` when
+a specific codepoint is an illegal character in an IDN label (i.e.
+INVALID); and ``idna.InvalidCodepointContext`` when the codepoint is
+illegal based on its positional context (i.e. it is CONTEXTO or CONTEXTJ
+but the contextual requirements are not satisfied.)
+
+Building and Diagnostics
+------------------------
+
+The IDNA and UTS 46 functionality relies upon pre-calculated lookup
+tables for performance. These tables are derived from computing against
+eligibility criteria in the respective standards. These tables are
+computed using the command-line script ``tools/idna-data``.
+
+This tool will fetch relevant codepoint data from the Unicode repository
+and perform the required calculations to identify eligibility. There are
+three main modes:
+
+* ``idna-data make-libdata``. Generates ``idnadata.py`` and
+ ``uts46data.py``, the pre-calculated lookup tables used for IDNA and
+ UTS 46 conversions. Implementers who wish to track this library against
+ a different Unicode version may use this tool to manually generate a
+ different version of the ``idnadata.py`` and ``uts46data.py`` files.
+
+* ``idna-data make-table``. Generate a table of the IDNA disposition
+ (e.g. PVALID, CONTEXTJ, CONTEXTO) in the format found in Appendix
+ B.1 of RFC 5892 and the pre-computed tables published by `IANA
+ `_.
+
+* ``idna-data U+0061``. Prints debugging output on the various
+ properties associated with an individual Unicode codepoint (in this
+ case, U+0061), that are used to assess the IDNA and UTS 46 status of a
+ codepoint. This is helpful in debugging or analysis.
+
+The tool accepts a number of arguments, described using ``idna-data
+-h``. Most notably, the ``--version`` argument allows the specification
+of the version of Unicode to be used in computing the table data. For
+example, ``idna-data --version 9.0.0 make-libdata`` will generate
+library data against Unicode 9.0.0.
+
+
+Additional Notes
+----------------
+
+* **Packages**. The latest tagged release version is published in the
+ `Python Package Index `_.
+
+* **Version support**. This library supports Python 3.6 and higher.
+ As this library serves as a low-level toolkit for a variety of
+ applications, many of which strive for broad compatibility with older
+ Python versions, there is no rush to remove older interpreter support.
+ Removing support for older versions should be well justified in that the
+ maintenance burden has become too high.
+
+* **Python 2**. Python 2 is supported by version 2.x of this library.
+ Use "idna<3" in your requirements file if you need this library for
+ a Python 2 application. Be advised that these versions are no longer
+ actively developed.
+
+* **Testing**. The library has a test suite based on each rule of the
+ IDNA specification, as well as tests that are provided as part of the
+ Unicode Technical Standard 46, `Unicode IDNA Compatibility Processing
+ `_.
+
+* **Emoji**. It is an occasional request to support emoji domains in
+ this library. Encoding of symbols like emoji is expressly prohibited by
+ the technical standard IDNA 2008 and emoji domains are broadly phased
+ out across the domain industry due to associated security risks. For
+ now, applications that need to support these non-compliant labels
+ may wish to consider trying the encode/decode operation in this library
+ first, and then falling back to using `encodings.idna`. See `the Github
+ project `_ for more discussion.
+
diff --git a/third_party/python/idna/idna-3.10.dist-info/RECORD b/third_party/python/idna/idna-3.10.dist-info/RECORD
new file mode 100644
index 000000000000..20dc1db0c476
--- /dev/null
+++ b/third_party/python/idna/idna-3.10.dist-info/RECORD
@@ -0,0 +1,13 @@
+idna/__init__.py,sha256=MPqNDLZbXqGaNdXxAFhiqFPKEQXju2jNQhCey6-5eJM,868
+idna/codec.py,sha256=PEew3ItwzjW4hymbasnty2N2OXvNcgHB-JjrBuxHPYY,3422
+idna/compat.py,sha256=RzLy6QQCdl9784aFhb2EX9EKGCJjg0P3PilGdeXXcx8,316
+idna/core.py,sha256=YJYyAMnwiQEPjVC4-Fqu_p4CJ6yKKuDGmppBNQNQpFs,13239
+idna/idnadata.py,sha256=W30GcIGvtOWYwAjZj4ZjuouUutC6ffgNuyjJy7fZ-lo,78306
+idna/intranges.py,sha256=amUtkdhYcQG8Zr-CoMM_kVRacxkivC1WgxN1b63KKdU,1898
+idna/package_data.py,sha256=q59S3OXsc5VI8j6vSD0sGBMyk6zZ4vWFREE88yCJYKs,21
+idna/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+idna/uts46data.py,sha256=rt90K9J40gUSwppDPCrhjgi5AA6pWM65dEGRSf6rIhM,239289
+idna-3.10.dist-info/LICENSE.md,sha256=pZ8LDvNjWHQQmkRhykT_enDVBpboFHZ7-vch1Mmw2w8,1541
+idna-3.10.dist-info/WHEEL,sha256=EZbGkh7Ie4PoZfRQ8I0ZuP9VklN_TvcZ6DSE5Uar4z4,81
+idna-3.10.dist-info/METADATA,sha256=URR5ZyDfQ1PCEGhkYoojqfi2Ra0tau2--lhwG4XSfjI,10158
+idna-3.10.dist-info/RECORD,,
diff --git a/third_party/python/idna/idna-3.10.dist-info/WHEEL b/third_party/python/idna/idna-3.10.dist-info/WHEEL
new file mode 100644
index 000000000000..3b5e64b5e6c4
--- /dev/null
+++ b/third_party/python/idna/idna-3.10.dist-info/WHEEL
@@ -0,0 +1,4 @@
+Wheel-Version: 1.0
+Generator: flit 3.9.0
+Root-Is-Purelib: true
+Tag: py3-none-any
diff --git a/third_party/python/idna/idna/__init__.py b/third_party/python/idna/idna/__init__.py
index 847bf9354781..cfdc030a751b 100644
--- a/third_party/python/idna/idna/__init__.py
+++ b/third_party/python/idna/idna/__init__.py
@@ -1,2 +1,45 @@
+from .core import (
+ IDNABidiError,
+ IDNAError,
+ InvalidCodepoint,
+ InvalidCodepointContext,
+ alabel,
+ check_bidi,
+ check_hyphen_ok,
+ check_initial_combiner,
+ check_label,
+ check_nfc,
+ decode,
+ encode,
+ ulabel,
+ uts46_remap,
+ valid_contextj,
+ valid_contexto,
+ valid_label_length,
+ valid_string_length,
+)
+from .intranges import intranges_contain
from .package_data import __version__
-from .core import *
+
+__all__ = [
+ "__version__",
+ "IDNABidiError",
+ "IDNAError",
+ "InvalidCodepoint",
+ "InvalidCodepointContext",
+ "alabel",
+ "check_bidi",
+ "check_hyphen_ok",
+ "check_initial_combiner",
+ "check_label",
+ "check_nfc",
+ "decode",
+ "encode",
+ "intranges_contain",
+ "ulabel",
+ "uts46_remap",
+ "valid_contextj",
+ "valid_contexto",
+ "valid_label_length",
+ "valid_string_length",
+]
diff --git a/third_party/python/idna/idna/codec.py b/third_party/python/idna/idna/codec.py
index 98c65ead146e..913abfd6a23c 100644
--- a/third_party/python/idna/idna/codec.py
+++ b/third_party/python/idna/idna/codec.py
@@ -1,50 +1,51 @@
-from .core import encode, decode, alabel, ulabel, IDNAError
import codecs
import re
+from typing import Any, Optional, Tuple
+
+from .core import IDNAError, alabel, decode, encode, ulabel
+
+_unicode_dots_re = re.compile("[\u002e\u3002\uff0e\uff61]")
-_unicode_dots_re = re.compile(u'[\u002e\u3002\uff0e\uff61]')
class Codec(codecs.Codec):
+ def encode(self, data: str, errors: str = "strict") -> Tuple[bytes, int]:
+ if errors != "strict":
+ raise IDNAError('Unsupported error handling "{}"'.format(errors))
- def encode(self, data, errors='strict'):
+ if not data:
+ return b"", 0
- if errors != 'strict':
- raise IDNAError("Unsupported error handling \"{0}\"".format(errors))
+ return encode(data), len(data)
+
+ def decode(self, data: bytes, errors: str = "strict") -> Tuple[str, int]:
+ if errors != "strict":
+ raise IDNAError('Unsupported error handling "{}"'.format(errors))
if not data:
return "", 0
- return encode(data), len(data)
-
- def decode(self, data, errors='strict'):
-
- if errors != 'strict':
- raise IDNAError("Unsupported error handling \"{0}\"".format(errors))
-
- if not data:
- return u"", 0
-
return decode(data), len(data)
+
class IncrementalEncoder(codecs.BufferedIncrementalEncoder):
- def _buffer_encode(self, data, errors, final):
- if errors != 'strict':
- raise IDNAError("Unsupported error handling \"{0}\"".format(errors))
+ def _buffer_encode(self, data: str, errors: str, final: bool) -> Tuple[bytes, int]:
+ if errors != "strict":
+ raise IDNAError('Unsupported error handling "{}"'.format(errors))
if not data:
- return ("", 0)
+ return b"", 0
labels = _unicode_dots_re.split(data)
- trailing_dot = u''
+ trailing_dot = b""
if labels:
if not labels[-1]:
- trailing_dot = '.'
+ trailing_dot = b"."
del labels[-1]
elif not final:
# Keep potentially unfinished label until the next call
del labels[-1]
if labels:
- trailing_dot = '.'
+ trailing_dot = b"."
result = []
size = 0
@@ -55,37 +56,33 @@ class IncrementalEncoder(codecs.BufferedIncrementalEncoder):
size += len(label)
# Join with U+002E
- result = ".".join(result) + trailing_dot
+ result_bytes = b".".join(result) + trailing_dot
size += len(trailing_dot)
- return (result, size)
+ return result_bytes, size
+
class IncrementalDecoder(codecs.BufferedIncrementalDecoder):
- def _buffer_decode(self, data, errors, final):
- if errors != 'strict':
- raise IDNAError("Unsupported error handling \"{0}\"".format(errors))
+ def _buffer_decode(self, data: Any, errors: str, final: bool) -> Tuple[str, int]:
+ if errors != "strict":
+ raise IDNAError('Unsupported error handling "{}"'.format(errors))
if not data:
- return (u"", 0)
+ return ("", 0)
- # IDNA allows decoding to operate on Unicode strings, too.
- if isinstance(data, unicode):
- labels = _unicode_dots_re.split(data)
- else:
- # Must be ASCII string
- data = str(data)
- unicode(data, "ascii")
- labels = data.split(".")
+ if not isinstance(data, str):
+ data = str(data, "ascii")
- trailing_dot = u''
+ labels = _unicode_dots_re.split(data)
+ trailing_dot = ""
if labels:
if not labels[-1]:
- trailing_dot = u'.'
+ trailing_dot = "."
del labels[-1]
elif not final:
# Keep potentially unfinished label until the next call
del labels[-1]
if labels:
- trailing_dot = u'.'
+ trailing_dot = "."
result = []
size = 0
@@ -95,20 +92,24 @@ class IncrementalDecoder(codecs.BufferedIncrementalDecoder):
size += 1
size += len(label)
- result = u".".join(result) + trailing_dot
+ result_str = ".".join(result) + trailing_dot
size += len(trailing_dot)
- return (result, size)
+ return (result_str, size)
class StreamWriter(Codec, codecs.StreamWriter):
pass
+
class StreamReader(Codec, codecs.StreamReader):
pass
-def getregentry():
+
+def search_function(name: str) -> Optional[codecs.CodecInfo]:
+ if name != "idna2008":
+ return None
return codecs.CodecInfo(
- name='idna',
+ name=name,
encode=Codec().encode,
decode=Codec().decode,
incrementalencoder=IncrementalEncoder,
@@ -116,3 +117,6 @@ def getregentry():
streamwriter=StreamWriter,
streamreader=StreamReader,
)
+
+
+codecs.register(search_function)
diff --git a/third_party/python/idna/idna/compat.py b/third_party/python/idna/idna/compat.py
index 4d47f336dbc5..1df9f2a70e68 100644
--- a/third_party/python/idna/idna/compat.py
+++ b/third_party/python/idna/idna/compat.py
@@ -1,12 +1,15 @@
-from .core import *
-from .codec import *
+from typing import Any, Union
-def ToASCII(label):
+from .core import decode, encode
+
+
+def ToASCII(label: str) -> bytes:
return encode(label)
-def ToUnicode(label):
+
+def ToUnicode(label: Union[bytes, bytearray]) -> str:
return decode(label)
-def nameprep(s):
- raise NotImplementedError("IDNA 2008 does not utilise nameprep protocol")
+def nameprep(s: Any) -> None:
+ raise NotImplementedError("IDNA 2008 does not utilise nameprep protocol")
diff --git a/third_party/python/idna/idna/core.py b/third_party/python/idna/idna/core.py
index 41ec5c711d14..9115f123f027 100644
--- a/third_party/python/idna/idna/core.py
+++ b/third_party/python/idna/idna/core.py
@@ -1,361 +1,391 @@
-from . import idnadata
import bisect
-import unicodedata
import re
-import sys
+import unicodedata
+from typing import Optional, Union
+
+from . import idnadata
from .intranges import intranges_contain
_virama_combining_class = 9
-_alabel_prefix = b'xn--'
-_unicode_dots_re = re.compile(u'[\u002e\u3002\uff0e\uff61]')
+_alabel_prefix = b"xn--"
+_unicode_dots_re = re.compile("[\u002e\u3002\uff0e\uff61]")
-if sys.version_info[0] >= 3:
- unicode = str
- unichr = chr
class IDNAError(UnicodeError):
- """ Base exception for all IDNA-encoding related problems """
+ """Base exception for all IDNA-encoding related problems"""
+
pass
class IDNABidiError(IDNAError):
- """ Exception when bidirectional requirements are not satisfied """
+ """Exception when bidirectional requirements are not satisfied"""
+
pass
class InvalidCodepoint(IDNAError):
- """ Exception when a disallowed or unallocated codepoint is used """
+ """Exception when a disallowed or unallocated codepoint is used"""
+
pass
class InvalidCodepointContext(IDNAError):
- """ Exception when the codepoint is not valid in the context it is used """
+ """Exception when the codepoint is not valid in the context it is used"""
+
pass
-def _combining_class(cp):
- v = unicodedata.combining(unichr(cp))
+def _combining_class(cp: int) -> int:
+ v = unicodedata.combining(chr(cp))
if v == 0:
- if not unicodedata.name(unichr(cp)):
+ if not unicodedata.name(chr(cp)):
raise ValueError("Unknown character in unicodedata")
return v
-def _is_script(cp, script):
+
+def _is_script(cp: str, script: str) -> bool:
return intranges_contain(ord(cp), idnadata.scripts[script])
-def _punycode(s):
- return s.encode('punycode')
-def _unot(s):
- return 'U+{0:04X}'.format(s)
+def _punycode(s: str) -> bytes:
+ return s.encode("punycode")
-def valid_label_length(label):
+def _unot(s: int) -> str:
+ return "U+{:04X}".format(s)
+
+def valid_label_length(label: Union[bytes, str]) -> bool:
if len(label) > 63:
return False
return True
-def valid_string_length(label, trailing_dot):
-
+def valid_string_length(label: Union[bytes, str], trailing_dot: bool) -> bool:
if len(label) > (254 if trailing_dot else 253):
return False
return True
-def check_bidi(label, check_ltr=False):
-
+def check_bidi(label: str, check_ltr: bool = False) -> bool:
# Bidi rules should only be applied if string contains RTL characters
bidi_label = False
- for (idx, cp) in enumerate(label, 1):
+ for idx, cp in enumerate(label, 1):
direction = unicodedata.bidirectional(cp)
- if direction == '':
+ if direction == "":
# String likely comes from a newer version of Unicode
- raise IDNABidiError('Unknown directionality in label {0} at position {1}'.format(repr(label), idx))
- if direction in ['R', 'AL', 'AN']:
+ raise IDNABidiError("Unknown directionality in label {} at position {}".format(repr(label), idx))
+ if direction in ["R", "AL", "AN"]:
bidi_label = True
if not bidi_label and not check_ltr:
return True
# Bidi rule 1
direction = unicodedata.bidirectional(label[0])
- if direction in ['R', 'AL']:
+ if direction in ["R", "AL"]:
rtl = True
- elif direction == 'L':
+ elif direction == "L":
rtl = False
else:
- raise IDNABidiError('First codepoint in label {0} must be directionality L, R or AL'.format(repr(label)))
+ raise IDNABidiError("First codepoint in label {} must be directionality L, R or AL".format(repr(label)))
valid_ending = False
- number_type = False
- for (idx, cp) in enumerate(label, 1):
+ number_type: Optional[str] = None
+ for idx, cp in enumerate(label, 1):
direction = unicodedata.bidirectional(cp)
if rtl:
# Bidi rule 2
- if not direction in ['R', 'AL', 'AN', 'EN', 'ES', 'CS', 'ET', 'ON', 'BN', 'NSM']:
- raise IDNABidiError('Invalid direction for codepoint at position {0} in a right-to-left label'.format(idx))
+ if direction not in [
+ "R",
+ "AL",
+ "AN",
+ "EN",
+ "ES",
+ "CS",
+ "ET",
+ "ON",
+ "BN",
+ "NSM",
+ ]:
+ raise IDNABidiError("Invalid direction for codepoint at position {} in a right-to-left label".format(idx))
# Bidi rule 3
- if direction in ['R', 'AL', 'EN', 'AN']:
+ if direction in ["R", "AL", "EN", "AN"]:
valid_ending = True
- elif direction != 'NSM':
+ elif direction != "NSM":
valid_ending = False
# Bidi rule 4
- if direction in ['AN', 'EN']:
+ if direction in ["AN", "EN"]:
if not number_type:
number_type = direction
else:
if number_type != direction:
- raise IDNABidiError('Can not mix numeral types in a right-to-left label')
+ raise IDNABidiError("Can not mix numeral types in a right-to-left label")
else:
# Bidi rule 5
- if not direction in ['L', 'EN', 'ES', 'CS', 'ET', 'ON', 'BN', 'NSM']:
- raise IDNABidiError('Invalid direction for codepoint at position {0} in a left-to-right label'.format(idx))
+ if direction not in ["L", "EN", "ES", "CS", "ET", "ON", "BN", "NSM"]:
+ raise IDNABidiError("Invalid direction for codepoint at position {} in a left-to-right label".format(idx))
# Bidi rule 6
- if direction in ['L', 'EN']:
+ if direction in ["L", "EN"]:
valid_ending = True
- elif direction != 'NSM':
+ elif direction != "NSM":
valid_ending = False
if not valid_ending:
- raise IDNABidiError('Label ends with illegal codepoint directionality')
+ raise IDNABidiError("Label ends with illegal codepoint directionality")
return True
-def check_initial_combiner(label):
-
- if unicodedata.category(label[0])[0] == 'M':
- raise IDNAError('Label begins with an illegal combining character')
+def check_initial_combiner(label: str) -> bool:
+ if unicodedata.category(label[0])[0] == "M":
+ raise IDNAError("Label begins with an illegal combining character")
return True
-def check_hyphen_ok(label):
-
- if label[2:4] == '--':
- raise IDNAError('Label has disallowed hyphens in 3rd and 4th position')
- if label[0] == '-' or label[-1] == '-':
- raise IDNAError('Label must not start or end with a hyphen')
+def check_hyphen_ok(label: str) -> bool:
+ if label[2:4] == "--":
+ raise IDNAError("Label has disallowed hyphens in 3rd and 4th position")
+ if label[0] == "-" or label[-1] == "-":
+ raise IDNAError("Label must not start or end with a hyphen")
return True
-def check_nfc(label):
-
- if unicodedata.normalize('NFC', label) != label:
- raise IDNAError('Label must be in Normalization Form C')
+def check_nfc(label: str) -> None:
+ if unicodedata.normalize("NFC", label) != label:
+ raise IDNAError("Label must be in Normalization Form C")
-def valid_contextj(label, pos):
-
+def valid_contextj(label: str, pos: int) -> bool:
cp_value = ord(label[pos])
- if cp_value == 0x200c:
-
+ if cp_value == 0x200C:
if pos > 0:
if _combining_class(ord(label[pos - 1])) == _virama_combining_class:
return True
ok = False
- for i in range(pos-1, -1, -1):
+ for i in range(pos - 1, -1, -1):
joining_type = idnadata.joining_types.get(ord(label[i]))
- if joining_type == ord('T'):
+ if joining_type == ord("T"):
continue
- if joining_type in [ord('L'), ord('D')]:
+ elif joining_type in [ord("L"), ord("D")]:
ok = True
break
+ else:
+ break
if not ok:
return False
ok = False
- for i in range(pos+1, len(label)):
+ for i in range(pos + 1, len(label)):
joining_type = idnadata.joining_types.get(ord(label[i]))
- if joining_type == ord('T'):
+ if joining_type == ord("T"):
continue
- if joining_type in [ord('R'), ord('D')]:
+ elif joining_type in [ord("R"), ord("D")]:
ok = True
break
+ else:
+ break
return ok
- if cp_value == 0x200d:
-
+ if cp_value == 0x200D:
if pos > 0:
if _combining_class(ord(label[pos - 1])) == _virama_combining_class:
return True
return False
else:
-
return False
-def valid_contexto(label, pos, exception=False):
-
+def valid_contexto(label: str, pos: int, exception: bool = False) -> bool:
cp_value = ord(label[pos])
- if cp_value == 0x00b7:
- if 0 < pos < len(label)-1:
- if ord(label[pos - 1]) == 0x006c and ord(label[pos + 1]) == 0x006c:
+ if cp_value == 0x00B7:
+ if 0 < pos < len(label) - 1:
+ if ord(label[pos - 1]) == 0x006C and ord(label[pos + 1]) == 0x006C:
return True
return False
elif cp_value == 0x0375:
- if pos < len(label)-1 and len(label) > 1:
- return _is_script(label[pos + 1], 'Greek')
+ if pos < len(label) - 1 and len(label) > 1:
+ return _is_script(label[pos + 1], "Greek")
return False
- elif cp_value == 0x05f3 or cp_value == 0x05f4:
+ elif cp_value == 0x05F3 or cp_value == 0x05F4:
if pos > 0:
- return _is_script(label[pos - 1], 'Hebrew')
+ return _is_script(label[pos - 1], "Hebrew")
return False
- elif cp_value == 0x30fb:
+ elif cp_value == 0x30FB:
for cp in label:
- if cp == u'\u30fb':
+ if cp == "\u30fb":
continue
- if _is_script(cp, 'Hiragana') or _is_script(cp, 'Katakana') or _is_script(cp, 'Han'):
+ if _is_script(cp, "Hiragana") or _is_script(cp, "Katakana") or _is_script(cp, "Han"):
return True
return False
elif 0x660 <= cp_value <= 0x669:
for cp in label:
- if 0x6f0 <= ord(cp) <= 0x06f9:
+ if 0x6F0 <= ord(cp) <= 0x06F9:
return False
return True
- elif 0x6f0 <= cp_value <= 0x6f9:
+ elif 0x6F0 <= cp_value <= 0x6F9:
for cp in label:
if 0x660 <= ord(cp) <= 0x0669:
return False
return True
+ return False
-def check_label(label):
+def check_label(label: Union[str, bytes, bytearray]) -> None:
if isinstance(label, (bytes, bytearray)):
- label = label.decode('utf-8')
+ label = label.decode("utf-8")
if len(label) == 0:
- raise IDNAError('Empty Label')
+ raise IDNAError("Empty Label")
check_nfc(label)
check_hyphen_ok(label)
check_initial_combiner(label)
- for (pos, cp) in enumerate(label):
+ for pos, cp in enumerate(label):
cp_value = ord(cp)
- if intranges_contain(cp_value, idnadata.codepoint_classes['PVALID']):
+ if intranges_contain(cp_value, idnadata.codepoint_classes["PVALID"]):
continue
- elif intranges_contain(cp_value, idnadata.codepoint_classes['CONTEXTJ']):
+ elif intranges_contain(cp_value, idnadata.codepoint_classes["CONTEXTJ"]):
try:
if not valid_contextj(label, pos):
- raise InvalidCodepointContext('Joiner {0} not allowed at position {1} in {2}'.format(
- _unot(cp_value), pos+1, repr(label)))
+ raise InvalidCodepointContext(
+ "Joiner {} not allowed at position {} in {}".format(_unot(cp_value), pos + 1, repr(label))
+ )
except ValueError:
- raise IDNAError('Unknown codepoint adjacent to joiner {0} at position {1} in {2}'.format(
- _unot(cp_value), pos+1, repr(label)))
- elif intranges_contain(cp_value, idnadata.codepoint_classes['CONTEXTO']):
+ raise IDNAError(
+ "Unknown codepoint adjacent to joiner {} at position {} in {}".format(
+ _unot(cp_value), pos + 1, repr(label)
+ )
+ )
+ elif intranges_contain(cp_value, idnadata.codepoint_classes["CONTEXTO"]):
if not valid_contexto(label, pos):
- raise InvalidCodepointContext('Codepoint {0} not allowed at position {1} in {2}'.format(_unot(cp_value), pos+1, repr(label)))
+ raise InvalidCodepointContext(
+ "Codepoint {} not allowed at position {} in {}".format(_unot(cp_value), pos + 1, repr(label))
+ )
else:
- raise InvalidCodepoint('Codepoint {0} at position {1} of {2} not allowed'.format(_unot(cp_value), pos+1, repr(label)))
+ raise InvalidCodepoint(
+ "Codepoint {} at position {} of {} not allowed".format(_unot(cp_value), pos + 1, repr(label))
+ )
check_bidi(label)
-def alabel(label):
-
+def alabel(label: str) -> bytes:
try:
- label = label.encode('ascii')
- ulabel(label)
- if not valid_label_length(label):
- raise IDNAError('Label too long')
- return label
+ label_bytes = label.encode("ascii")
+ ulabel(label_bytes)
+ if not valid_label_length(label_bytes):
+ raise IDNAError("Label too long")
+ return label_bytes
except UnicodeEncodeError:
pass
- if not label:
- raise IDNAError('No Input')
-
- label = unicode(label)
check_label(label)
- label = _punycode(label)
- label = _alabel_prefix + label
+ label_bytes = _alabel_prefix + _punycode(label)
- if not valid_label_length(label):
- raise IDNAError('Label too long')
+ if not valid_label_length(label_bytes):
+ raise IDNAError("Label too long")
- return label
+ return label_bytes
-def ulabel(label):
-
+def ulabel(label: Union[str, bytes, bytearray]) -> str:
if not isinstance(label, (bytes, bytearray)):
try:
- label = label.encode('ascii')
+ label_bytes = label.encode("ascii")
except UnicodeEncodeError:
check_label(label)
return label
-
- label = label.lower()
- if label.startswith(_alabel_prefix):
- label = label[len(_alabel_prefix):]
- if not label:
- raise IDNAError('Malformed A-label, no Punycode eligible content found')
- if label.decode('ascii')[-1] == '-':
- raise IDNAError('A-label must not end with a hyphen')
else:
- check_label(label)
- return label.decode('ascii')
+ label_bytes = label
- label = label.decode('punycode')
+ label_bytes = label_bytes.lower()
+ if label_bytes.startswith(_alabel_prefix):
+ label_bytes = label_bytes[len(_alabel_prefix) :]
+ if not label_bytes:
+ raise IDNAError("Malformed A-label, no Punycode eligible content found")
+ if label_bytes.decode("ascii")[-1] == "-":
+ raise IDNAError("A-label must not end with a hyphen")
+ else:
+ check_label(label_bytes)
+ return label_bytes.decode("ascii")
+
+ try:
+ label = label_bytes.decode("punycode")
+ except UnicodeError:
+ raise IDNAError("Invalid A-label")
check_label(label)
return label
-def uts46_remap(domain, std3_rules=True, transitional=False):
+def uts46_remap(domain: str, std3_rules: bool = True, transitional: bool = False) -> str:
"""Re-map the characters in the string according to UTS46 processing."""
from .uts46data import uts46data
- output = u""
- try:
- for pos, char in enumerate(domain):
- code_point = ord(char)
- uts46row = uts46data[code_point if code_point < 256 else
- bisect.bisect_left(uts46data, (code_point, "Z")) - 1]
+
+ output = ""
+
+ for pos, char in enumerate(domain):
+ code_point = ord(char)
+ try:
+ uts46row = uts46data[code_point if code_point < 256 else bisect.bisect_left(uts46data, (code_point, "Z")) - 1]
status = uts46row[1]
- replacement = uts46row[2] if len(uts46row) == 3 else None
- if (status == "V" or
- (status == "D" and not transitional) or
- (status == "3" and not std3_rules and replacement is None)):
+ replacement: Optional[str] = None
+ if len(uts46row) == 3:
+ replacement = uts46row[2]
+ if (
+ status == "V"
+ or (status == "D" and not transitional)
+ or (status == "3" and not std3_rules and replacement is None)
+ ):
output += char
- elif replacement is not None and (status == "M" or
- (status == "3" and not std3_rules) or
- (status == "D" and transitional)):
+ elif replacement is not None and (
+ status == "M" or (status == "3" and not std3_rules) or (status == "D" and transitional)
+ ):
output += replacement
elif status != "I":
raise IndexError()
- return unicodedata.normalize("NFC", output)
- except IndexError:
- raise InvalidCodepoint(
- "Codepoint {0} not allowed at position {1} in {2}".format(
- _unot(code_point), pos + 1, repr(domain)))
+ except IndexError:
+ raise InvalidCodepoint(
+ "Codepoint {} not allowed at position {} in {}".format(_unot(code_point), pos + 1, repr(domain))
+ )
+
+ return unicodedata.normalize("NFC", output)
-def encode(s, strict=False, uts46=False, std3_rules=False, transitional=False):
-
- if isinstance(s, (bytes, bytearray)):
- s = s.decode("ascii")
+def encode(
+ s: Union[str, bytes, bytearray],
+ strict: bool = False,
+ uts46: bool = False,
+ std3_rules: bool = False,
+ transitional: bool = False,
+) -> bytes:
+ if not isinstance(s, str):
+ try:
+ s = str(s, "ascii")
+ except UnicodeDecodeError:
+ raise IDNAError("should pass a unicode string to the function rather than a byte string.")
if uts46:
s = uts46_remap(s, std3_rules, transitional)
trailing_dot = False
result = []
if strict:
- labels = s.split('.')
+ labels = s.split(".")
else:
labels = _unicode_dots_re.split(s)
- if not labels or labels == ['']:
- raise IDNAError('Empty domain')
- if labels[-1] == '':
+ if not labels or labels == [""]:
+ raise IDNAError("Empty domain")
+ if labels[-1] == "":
del labels[-1]
trailing_dot = True
for label in labels:
@@ -363,19 +393,26 @@ def encode(s, strict=False, uts46=False, std3_rules=False, transitional=False):
if s:
result.append(s)
else:
- raise IDNAError('Empty label')
+ raise IDNAError("Empty label")
if trailing_dot:
- result.append(b'')
- s = b'.'.join(result)
+ result.append(b"")
+ s = b".".join(result)
if not valid_string_length(s, trailing_dot):
- raise IDNAError('Domain too long')
+ raise IDNAError("Domain too long")
return s
-def decode(s, strict=False, uts46=False, std3_rules=False):
-
- if isinstance(s, (bytes, bytearray)):
- s = s.decode("ascii")
+def decode(
+ s: Union[str, bytes, bytearray],
+ strict: bool = False,
+ uts46: bool = False,
+ std3_rules: bool = False,
+) -> str:
+ try:
+ if not isinstance(s, str):
+ s = str(s, "ascii")
+ except UnicodeDecodeError:
+ raise IDNAError("Invalid ASCII in A-label")
if uts46:
s = uts46_remap(s, std3_rules, False)
trailing_dot = False
@@ -383,9 +420,9 @@ def decode(s, strict=False, uts46=False, std3_rules=False):
if not strict:
labels = _unicode_dots_re.split(s)
else:
- labels = s.split(u'.')
- if not labels or labels == ['']:
- raise IDNAError('Empty domain')
+ labels = s.split(".")
+ if not labels or labels == [""]:
+ raise IDNAError("Empty domain")
if not labels[-1]:
del labels[-1]
trailing_dot = True
@@ -394,7 +431,7 @@ def decode(s, strict=False, uts46=False, std3_rules=False):
if s:
result.append(s)
else:
- raise IDNAError('Empty label')
+ raise IDNAError("Empty label")
if trailing_dot:
- result.append(u'')
- return u'.'.join(result)
+ result.append("")
+ return ".".join(result)
diff --git a/third_party/python/idna/idna/idnadata.py b/third_party/python/idna/idna/idnadata.py
index a284e4c84ac4..4be6004622ef 100644
--- a/third_party/python/idna/idna/idnadata.py
+++ b/third_party/python/idna/idna/idnadata.py
@@ -1,107 +1,290 @@
# This file is automatically generated by tools/idna-data
-__version__ = "13.0.0"
+__version__ = "15.1.0"
scripts = {
- 'Greek': (
+ "Greek": (
0x37000000374,
0x37500000378,
- 0x37a0000037e,
- 0x37f00000380,
+ 0x37A0000037E,
+ 0x37F00000380,
0x38400000385,
0x38600000387,
- 0x3880000038b,
- 0x38c0000038d,
- 0x38e000003a2,
- 0x3a3000003e2,
- 0x3f000000400,
- 0x1d2600001d2b,
- 0x1d5d00001d62,
- 0x1d6600001d6b,
- 0x1dbf00001dc0,
- 0x1f0000001f16,
- 0x1f1800001f1e,
- 0x1f2000001f46,
- 0x1f4800001f4e,
- 0x1f5000001f58,
- 0x1f5900001f5a,
- 0x1f5b00001f5c,
- 0x1f5d00001f5e,
- 0x1f5f00001f7e,
- 0x1f8000001fb5,
- 0x1fb600001fc5,
- 0x1fc600001fd4,
- 0x1fd600001fdc,
- 0x1fdd00001ff0,
- 0x1ff200001ff5,
- 0x1ff600001fff,
+ 0x3880000038B,
+ 0x38C0000038D,
+ 0x38E000003A2,
+ 0x3A3000003E2,
+ 0x3F000000400,
+ 0x1D2600001D2B,
+ 0x1D5D00001D62,
+ 0x1D6600001D6B,
+ 0x1DBF00001DC0,
+ 0x1F0000001F16,
+ 0x1F1800001F1E,
+ 0x1F2000001F46,
+ 0x1F4800001F4E,
+ 0x1F5000001F58,
+ 0x1F5900001F5A,
+ 0x1F5B00001F5C,
+ 0x1F5D00001F5E,
+ 0x1F5F00001F7E,
+ 0x1F8000001FB5,
+ 0x1FB600001FC5,
+ 0x1FC600001FD4,
+ 0x1FD600001FDC,
+ 0x1FDD00001FF0,
+ 0x1FF200001FF5,
+ 0x1FF600001FFF,
0x212600002127,
- 0xab650000ab66,
- 0x101400001018f,
- 0x101a0000101a1,
- 0x1d2000001d246,
+ 0xAB650000AB66,
+ 0x101400001018F,
+ 0x101A0000101A1,
+ 0x1D2000001D246,
),
- 'Han': (
- 0x2e8000002e9a,
- 0x2e9b00002ef4,
- 0x2f0000002fd6,
+ "Han": (
+ 0x2E8000002E9A,
+ 0x2E9B00002EF4,
+ 0x2F0000002FD6,
0x300500003006,
0x300700003008,
- 0x30210000302a,
- 0x30380000303c,
- 0x340000004dc0,
- 0x4e0000009ffd,
- 0xf9000000fa6e,
- 0xfa700000fada,
- 0x16ff000016ff2,
- 0x200000002a6de,
- 0x2a7000002b735,
- 0x2b7400002b81e,
- 0x2b8200002cea2,
- 0x2ceb00002ebe1,
- 0x2f8000002fa1e,
- 0x300000003134b,
+ 0x30210000302A,
+ 0x30380000303C,
+ 0x340000004DC0,
+ 0x4E000000A000,
+ 0xF9000000FA6E,
+ 0xFA700000FADA,
+ 0x16FE200016FE4,
+ 0x16FF000016FF2,
+ 0x200000002A6E0,
+ 0x2A7000002B73A,
+ 0x2B7400002B81E,
+ 0x2B8200002CEA2,
+ 0x2CEB00002EBE1,
+ 0x2EBF00002EE5E,
+ 0x2F8000002FA1E,
+ 0x300000003134B,
+ 0x31350000323B0,
),
- 'Hebrew': (
- 0x591000005c8,
- 0x5d0000005eb,
- 0x5ef000005f5,
- 0xfb1d0000fb37,
- 0xfb380000fb3d,
- 0xfb3e0000fb3f,
- 0xfb400000fb42,
- 0xfb430000fb45,
- 0xfb460000fb50,
+ "Hebrew": (
+ 0x591000005C8,
+ 0x5D0000005EB,
+ 0x5EF000005F5,
+ 0xFB1D0000FB37,
+ 0xFB380000FB3D,
+ 0xFB3E0000FB3F,
+ 0xFB400000FB42,
+ 0xFB430000FB45,
+ 0xFB460000FB50,
),
- 'Hiragana': (
+ "Hiragana": (
0x304100003097,
- 0x309d000030a0,
- 0x1b0010001b11f,
- 0x1b1500001b153,
- 0x1f2000001f201,
+ 0x309D000030A0,
+ 0x1B0010001B120,
+ 0x1B1320001B133,
+ 0x1B1500001B153,
+ 0x1F2000001F201,
),
- 'Katakana': (
- 0x30a1000030fb,
- 0x30fd00003100,
- 0x31f000003200,
- 0x32d0000032ff,
+ "Katakana": (
+ 0x30A1000030FB,
+ 0x30FD00003100,
+ 0x31F000003200,
+ 0x32D0000032FF,
0x330000003358,
- 0xff660000ff70,
- 0xff710000ff9e,
- 0x1b0000001b001,
- 0x1b1640001b168,
+ 0xFF660000FF70,
+ 0xFF710000FF9E,
+ 0x1AFF00001AFF4,
+ 0x1AFF50001AFFC,
+ 0x1AFFD0001AFFF,
+ 0x1B0000001B001,
+ 0x1B1200001B123,
+ 0x1B1550001B156,
+ 0x1B1640001B168,
),
}
joining_types = {
- 0x600: 85,
- 0x601: 85,
- 0x602: 85,
- 0x603: 85,
- 0x604: 85,
- 0x605: 85,
- 0x608: 85,
- 0x60b: 85,
+ 0xAD: 84,
+ 0x300: 84,
+ 0x301: 84,
+ 0x302: 84,
+ 0x303: 84,
+ 0x304: 84,
+ 0x305: 84,
+ 0x306: 84,
+ 0x307: 84,
+ 0x308: 84,
+ 0x309: 84,
+ 0x30A: 84,
+ 0x30B: 84,
+ 0x30C: 84,
+ 0x30D: 84,
+ 0x30E: 84,
+ 0x30F: 84,
+ 0x310: 84,
+ 0x311: 84,
+ 0x312: 84,
+ 0x313: 84,
+ 0x314: 84,
+ 0x315: 84,
+ 0x316: 84,
+ 0x317: 84,
+ 0x318: 84,
+ 0x319: 84,
+ 0x31A: 84,
+ 0x31B: 84,
+ 0x31C: 84,
+ 0x31D: 84,
+ 0x31E: 84,
+ 0x31F: 84,
+ 0x320: 84,
+ 0x321: 84,
+ 0x322: 84,
+ 0x323: 84,
+ 0x324: 84,
+ 0x325: 84,
+ 0x326: 84,
+ 0x327: 84,
+ 0x328: 84,
+ 0x329: 84,
+ 0x32A: 84,
+ 0x32B: 84,
+ 0x32C: 84,
+ 0x32D: 84,
+ 0x32E: 84,
+ 0x32F: 84,
+ 0x330: 84,
+ 0x331: 84,
+ 0x332: 84,
+ 0x333: 84,
+ 0x334: 84,
+ 0x335: 84,
+ 0x336: 84,
+ 0x337: 84,
+ 0x338: 84,
+ 0x339: 84,
+ 0x33A: 84,
+ 0x33B: 84,
+ 0x33C: 84,
+ 0x33D: 84,
+ 0x33E: 84,
+ 0x33F: 84,
+ 0x340: 84,
+ 0x341: 84,
+ 0x342: 84,
+ 0x343: 84,
+ 0x344: 84,
+ 0x345: 84,
+ 0x346: 84,
+ 0x347: 84,
+ 0x348: 84,
+ 0x349: 84,
+ 0x34A: 84,
+ 0x34B: 84,
+ 0x34C: 84,
+ 0x34D: 84,
+ 0x34E: 84,
+ 0x34F: 84,
+ 0x350: 84,
+ 0x351: 84,
+ 0x352: 84,
+ 0x353: 84,
+ 0x354: 84,
+ 0x355: 84,
+ 0x356: 84,
+ 0x357: 84,
+ 0x358: 84,
+ 0x359: 84,
+ 0x35A: 84,
+ 0x35B: 84,
+ 0x35C: 84,
+ 0x35D: 84,
+ 0x35E: 84,
+ 0x35F: 84,
+ 0x360: 84,
+ 0x361: 84,
+ 0x362: 84,
+ 0x363: 84,
+ 0x364: 84,
+ 0x365: 84,
+ 0x366: 84,
+ 0x367: 84,
+ 0x368: 84,
+ 0x369: 84,
+ 0x36A: 84,
+ 0x36B: 84,
+ 0x36C: 84,
+ 0x36D: 84,
+ 0x36E: 84,
+ 0x36F: 84,
+ 0x483: 84,
+ 0x484: 84,
+ 0x485: 84,
+ 0x486: 84,
+ 0x487: 84,
+ 0x488: 84,
+ 0x489: 84,
+ 0x591: 84,
+ 0x592: 84,
+ 0x593: 84,
+ 0x594: 84,
+ 0x595: 84,
+ 0x596: 84,
+ 0x597: 84,
+ 0x598: 84,
+ 0x599: 84,
+ 0x59A: 84,
+ 0x59B: 84,
+ 0x59C: 84,
+ 0x59D: 84,
+ 0x59E: 84,
+ 0x59F: 84,
+ 0x5A0: 84,
+ 0x5A1: 84,
+ 0x5A2: 84,
+ 0x5A3: 84,
+ 0x5A4: 84,
+ 0x5A5: 84,
+ 0x5A6: 84,
+ 0x5A7: 84,
+ 0x5A8: 84,
+ 0x5A9: 84,
+ 0x5AA: 84,
+ 0x5AB: 84,
+ 0x5AC: 84,
+ 0x5AD: 84,
+ 0x5AE: 84,
+ 0x5AF: 84,
+ 0x5B0: 84,
+ 0x5B1: 84,
+ 0x5B2: 84,
+ 0x5B3: 84,
+ 0x5B4: 84,
+ 0x5B5: 84,
+ 0x5B6: 84,
+ 0x5B7: 84,
+ 0x5B8: 84,
+ 0x5B9: 84,
+ 0x5BA: 84,
+ 0x5BB: 84,
+ 0x5BC: 84,
+ 0x5BD: 84,
+ 0x5BF: 84,
+ 0x5C1: 84,
+ 0x5C2: 84,
+ 0x5C4: 84,
+ 0x5C5: 84,
+ 0x5C7: 84,
+ 0x610: 84,
+ 0x611: 84,
+ 0x612: 84,
+ 0x613: 84,
+ 0x614: 84,
+ 0x615: 84,
+ 0x616: 84,
+ 0x617: 84,
+ 0x618: 84,
+ 0x619: 84,
+ 0x61A: 84,
+ 0x61C: 84,
0x620: 68,
- 0x621: 85,
0x622: 82,
0x623: 82,
0x624: 82,
@@ -110,12 +293,12 @@ joining_types = {
0x627: 82,
0x628: 68,
0x629: 82,
- 0x62a: 68,
- 0x62b: 68,
- 0x62c: 68,
- 0x62d: 68,
- 0x62e: 68,
- 0x62f: 82,
+ 0x62A: 68,
+ 0x62B: 68,
+ 0x62C: 68,
+ 0x62D: 68,
+ 0x62E: 68,
+ 0x62F: 82,
0x630: 82,
0x631: 82,
0x632: 82,
@@ -126,12 +309,12 @@ joining_types = {
0x637: 68,
0x638: 68,
0x639: 68,
- 0x63a: 68,
- 0x63b: 68,
- 0x63c: 68,
- 0x63d: 68,
- 0x63e: 68,
- 0x63f: 68,
+ 0x63A: 68,
+ 0x63B: 68,
+ 0x63C: 68,
+ 0x63D: 68,
+ 0x63E: 68,
+ 0x63F: 68,
0x640: 67,
0x641: 68,
0x642: 68,
@@ -142,24 +325,45 @@ joining_types = {
0x647: 68,
0x648: 82,
0x649: 68,
- 0x64a: 68,
- 0x66e: 68,
- 0x66f: 68,
+ 0x64A: 68,
+ 0x64B: 84,
+ 0x64C: 84,
+ 0x64D: 84,
+ 0x64E: 84,
+ 0x64F: 84,
+ 0x650: 84,
+ 0x651: 84,
+ 0x652: 84,
+ 0x653: 84,
+ 0x654: 84,
+ 0x655: 84,
+ 0x656: 84,
+ 0x657: 84,
+ 0x658: 84,
+ 0x659: 84,
+ 0x65A: 84,
+ 0x65B: 84,
+ 0x65C: 84,
+ 0x65D: 84,
+ 0x65E: 84,
+ 0x65F: 84,
+ 0x66E: 68,
+ 0x66F: 68,
+ 0x670: 84,
0x671: 82,
0x672: 82,
0x673: 82,
- 0x674: 85,
0x675: 82,
0x676: 82,
0x677: 82,
0x678: 68,
0x679: 68,
- 0x67a: 68,
- 0x67b: 68,
- 0x67c: 68,
- 0x67d: 68,
- 0x67e: 68,
- 0x67f: 68,
+ 0x67A: 68,
+ 0x67B: 68,
+ 0x67C: 68,
+ 0x67D: 68,
+ 0x67E: 68,
+ 0x67F: 68,
0x680: 68,
0x681: 68,
0x682: 68,
@@ -170,12 +374,12 @@ joining_types = {
0x687: 68,
0x688: 82,
0x689: 82,
- 0x68a: 82,
- 0x68b: 82,
- 0x68c: 82,
- 0x68d: 82,
- 0x68e: 82,
- 0x68f: 82,
+ 0x68A: 82,
+ 0x68B: 82,
+ 0x68C: 82,
+ 0x68D: 82,
+ 0x68E: 82,
+ 0x68F: 82,
0x690: 82,
0x691: 82,
0x692: 82,
@@ -186,74 +390,93 @@ joining_types = {
0x697: 82,
0x698: 82,
0x699: 82,
- 0x69a: 68,
- 0x69b: 68,
- 0x69c: 68,
- 0x69d: 68,
- 0x69e: 68,
- 0x69f: 68,
- 0x6a0: 68,
- 0x6a1: 68,
- 0x6a2: 68,
- 0x6a3: 68,
- 0x6a4: 68,
- 0x6a5: 68,
- 0x6a6: 68,
- 0x6a7: 68,
- 0x6a8: 68,
- 0x6a9: 68,
- 0x6aa: 68,
- 0x6ab: 68,
- 0x6ac: 68,
- 0x6ad: 68,
- 0x6ae: 68,
- 0x6af: 68,
- 0x6b0: 68,
- 0x6b1: 68,
- 0x6b2: 68,
- 0x6b3: 68,
- 0x6b4: 68,
- 0x6b5: 68,
- 0x6b6: 68,
- 0x6b7: 68,
- 0x6b8: 68,
- 0x6b9: 68,
- 0x6ba: 68,
- 0x6bb: 68,
- 0x6bc: 68,
- 0x6bd: 68,
- 0x6be: 68,
- 0x6bf: 68,
- 0x6c0: 82,
- 0x6c1: 68,
- 0x6c2: 68,
- 0x6c3: 82,
- 0x6c4: 82,
- 0x6c5: 82,
- 0x6c6: 82,
- 0x6c7: 82,
- 0x6c8: 82,
- 0x6c9: 82,
- 0x6ca: 82,
- 0x6cb: 82,
- 0x6cc: 68,
- 0x6cd: 82,
- 0x6ce: 68,
- 0x6cf: 82,
- 0x6d0: 68,
- 0x6d1: 68,
- 0x6d2: 82,
- 0x6d3: 82,
- 0x6d5: 82,
- 0x6dd: 85,
- 0x6ee: 82,
- 0x6ef: 82,
- 0x6fa: 68,
- 0x6fb: 68,
- 0x6fc: 68,
- 0x6ff: 68,
- 0x70f: 84,
+ 0x69A: 68,
+ 0x69B: 68,
+ 0x69C: 68,
+ 0x69D: 68,
+ 0x69E: 68,
+ 0x69F: 68,
+ 0x6A0: 68,
+ 0x6A1: 68,
+ 0x6A2: 68,
+ 0x6A3: 68,
+ 0x6A4: 68,
+ 0x6A5: 68,
+ 0x6A6: 68,
+ 0x6A7: 68,
+ 0x6A8: 68,
+ 0x6A9: 68,
+ 0x6AA: 68,
+ 0x6AB: 68,
+ 0x6AC: 68,
+ 0x6AD: 68,
+ 0x6AE: 68,
+ 0x6AF: 68,
+ 0x6B0: 68,
+ 0x6B1: 68,
+ 0x6B2: 68,
+ 0x6B3: 68,
+ 0x6B4: 68,
+ 0x6B5: 68,
+ 0x6B6: 68,
+ 0x6B7: 68,
+ 0x6B8: 68,
+ 0x6B9: 68,
+ 0x6BA: 68,
+ 0x6BB: 68,
+ 0x6BC: 68,
+ 0x6BD: 68,
+ 0x6BE: 68,
+ 0x6BF: 68,
+ 0x6C0: 82,
+ 0x6C1: 68,
+ 0x6C2: 68,
+ 0x6C3: 82,
+ 0x6C4: 82,
+ 0x6C5: 82,
+ 0x6C6: 82,
+ 0x6C7: 82,
+ 0x6C8: 82,
+ 0x6C9: 82,
+ 0x6CA: 82,
+ 0x6CB: 82,
+ 0x6CC: 68,
+ 0x6CD: 82,
+ 0x6CE: 68,
+ 0x6CF: 82,
+ 0x6D0: 68,
+ 0x6D1: 68,
+ 0x6D2: 82,
+ 0x6D3: 82,
+ 0x6D5: 82,
+ 0x6D6: 84,
+ 0x6D7: 84,
+ 0x6D8: 84,
+ 0x6D9: 84,
+ 0x6DA: 84,
+ 0x6DB: 84,
+ 0x6DC: 84,
+ 0x6DF: 84,
+ 0x6E0: 84,
+ 0x6E1: 84,
+ 0x6E2: 84,
+ 0x6E3: 84,
+ 0x6E4: 84,
+ 0x6E7: 84,
+ 0x6E8: 84,
+ 0x6EA: 84,
+ 0x6EB: 84,
+ 0x6EC: 84,
+ 0x6ED: 84,
+ 0x6EE: 82,
+ 0x6EF: 82,
+ 0x6FA: 68,
+ 0x6FB: 68,
+ 0x6FC: 68,
+ 0x6FF: 68,
+ 0x70F: 84,
0x710: 82,
+ 0x711: 84,
0x712: 68,
0x713: 68,
0x714: 68,
@@ -262,12 +485,12 @@ joining_types = {
0x717: 82,
0x718: 82,
0x719: 82,
- 0x71a: 68,
- 0x71b: 68,
- 0x71c: 68,
- 0x71d: 68,
- 0x71e: 82,
- 0x71f: 68,
+ 0x71A: 68,
+ 0x71B: 68,
+ 0x71C: 68,
+ 0x71D: 68,
+ 0x71E: 82,
+ 0x71F: 68,
0x720: 68,
0x721: 68,
0x722: 68,
@@ -278,15 +501,42 @@ joining_types = {
0x727: 68,
0x728: 82,
0x729: 68,
- 0x72a: 82,
- 0x72b: 68,
- 0x72c: 82,
- 0x72d: 68,
- 0x72e: 68,
- 0x72f: 82,
- 0x74d: 82,
- 0x74e: 68,
- 0x74f: 68,
+ 0x72A: 82,
+ 0x72B: 68,
+ 0x72C: 82,
+ 0x72D: 68,
+ 0x72E: 68,
+ 0x72F: 82,
+ 0x730: 84,
+ 0x731: 84,
+ 0x732: 84,
+ 0x733: 84,
+ 0x734: 84,
+ 0x735: 84,
+ 0x736: 84,
+ 0x737: 84,
+ 0x738: 84,
+ 0x739: 84,
+ 0x73A: 84,
+ 0x73B: 84,
+ 0x73C: 84,
+ 0x73D: 84,
+ 0x73E: 84,
+ 0x73F: 84,
+ 0x740: 84,
+ 0x741: 84,
+ 0x742: 84,
+ 0x743: 84,
+ 0x744: 84,
+ 0x745: 84,
+ 0x746: 84,
+ 0x747: 84,
+ 0x748: 84,
+ 0x749: 84,
+ 0x74A: 84,
+ 0x74D: 82,
+ 0x74E: 68,
+ 0x74F: 68,
0x750: 68,
0x751: 68,
0x752: 68,
@@ -297,12 +547,12 @@ joining_types = {
0x757: 68,
0x758: 68,
0x759: 82,
- 0x75a: 82,
- 0x75b: 82,
- 0x75c: 68,
- 0x75d: 68,
- 0x75e: 68,
- 0x75f: 68,
+ 0x75A: 82,
+ 0x75B: 82,
+ 0x75C: 68,
+ 0x75D: 68,
+ 0x75E: 68,
+ 0x75F: 68,
0x760: 68,
0x761: 68,
0x762: 68,
@@ -313,12 +563,12 @@ joining_types = {
0x767: 68,
0x768: 68,
0x769: 68,
- 0x76a: 68,
- 0x76b: 82,
- 0x76c: 82,
- 0x76d: 68,
- 0x76e: 68,
- 0x76f: 68,
+ 0x76A: 68,
+ 0x76B: 82,
+ 0x76C: 82,
+ 0x76D: 68,
+ 0x76E: 68,
+ 0x76F: 68,
0x770: 68,
0x771: 82,
0x772: 68,
@@ -329,46 +579,88 @@ joining_types = {
0x777: 68,
0x778: 82,
0x779: 82,
- 0x77a: 68,
- 0x77b: 68,
- 0x77c: 68,
- 0x77d: 68,
- 0x77e: 68,
- 0x77f: 68,
- 0x7ca: 68,
- 0x7cb: 68,
- 0x7cc: 68,
- 0x7cd: 68,
- 0x7ce: 68,
- 0x7cf: 68,
- 0x7d0: 68,
- 0x7d1: 68,
- 0x7d2: 68,
- 0x7d3: 68,
- 0x7d4: 68,
- 0x7d5: 68,
- 0x7d6: 68,
- 0x7d7: 68,
- 0x7d8: 68,
- 0x7d9: 68,
- 0x7da: 68,
- 0x7db: 68,
- 0x7dc: 68,
- 0x7dd: 68,
- 0x7de: 68,
- 0x7df: 68,
- 0x7e0: 68,
- 0x7e1: 68,
- 0x7e2: 68,
- 0x7e3: 68,
- 0x7e4: 68,
- 0x7e5: 68,
- 0x7e6: 68,
- 0x7e7: 68,
- 0x7e8: 68,
- 0x7e9: 68,
- 0x7ea: 68,
- 0x7fa: 67,
+ 0x77A: 68,
+ 0x77B: 68,
+ 0x77C: 68,
+ 0x77D: 68,
+ 0x77E: 68,
+ 0x77F: 68,
+ 0x7A6: 84,
+ 0x7A7: 84,
+ 0x7A8: 84,
+ 0x7A9: 84,
+ 0x7AA: 84,
+ 0x7AB: 84,
+ 0x7AC: 84,
+ 0x7AD: 84,
+ 0x7AE: 84,
+ 0x7AF: 84,
+ 0x7B0: 84,
+ 0x7CA: 68,
+ 0x7CB: 68,
+ 0x7CC: 68,
+ 0x7CD: 68,
+ 0x7CE: 68,
+ 0x7CF: 68,
+ 0x7D0: 68,
+ 0x7D1: 68,
+ 0x7D2: 68,
+ 0x7D3: 68,
+ 0x7D4: 68,
+ 0x7D5: 68,
+ 0x7D6: 68,
+ 0x7D7: 68,
+ 0x7D8: 68,
+ 0x7D9: 68,
+ 0x7DA: 68,
+ 0x7DB: 68,
+ 0x7DC: 68,
+ 0x7DD: 68,
+ 0x7DE: 68,
+ 0x7DF: 68,
+ 0x7E0: 68,
+ 0x7E1: 68,
+ 0x7E2: 68,
+ 0x7E3: 68,
+ 0x7E4: 68,
+ 0x7E5: 68,
+ 0x7E6: 68,
+ 0x7E7: 68,
+ 0x7E8: 68,
+ 0x7E9: 68,
+ 0x7EA: 68,
+ 0x7EB: 84,
+ 0x7EC: 84,
+ 0x7ED: 84,
+ 0x7EE: 84,
+ 0x7EF: 84,
+ 0x7F0: 84,
+ 0x7F1: 84,
+ 0x7F2: 84,
+ 0x7F3: 84,
+ 0x7FA: 67,
+ 0x7FD: 84,
+ 0x816: 84,
+ 0x817: 84,
+ 0x818: 84,
+ 0x819: 84,
+ 0x81B: 84,
+ 0x81C: 84,
+ 0x81D: 84,
+ 0x81E: 84,
+ 0x81F: 84,
+ 0x820: 84,
+ 0x821: 84,
+ 0x822: 84,
+ 0x823: 84,
+ 0x825: 84,
+ 0x826: 84,
+ 0x827: 84,
+ 0x829: 84,
+ 0x82A: 84,
+ 0x82B: 84,
+ 0x82C: 84,
+ 0x82D: 84,
0x840: 82,
0x841: 68,
0x842: 68,
@@ -379,12 +671,12 @@ joining_types = {
0x847: 82,
0x848: 68,
0x849: 82,
- 0x84a: 68,
- 0x84b: 68,
- 0x84c: 68,
- 0x84d: 68,
- 0x84e: 68,
- 0x84f: 68,
+ 0x84A: 68,
+ 0x84B: 68,
+ 0x84C: 68,
+ 0x84D: 68,
+ 0x84E: 68,
+ 0x84F: 68,
0x850: 68,
0x851: 68,
0x852: 68,
@@ -394,61 +686,446 @@ joining_types = {
0x856: 82,
0x857: 82,
0x858: 82,
+ 0x859: 84,
+ 0x85A: 84,
+ 0x85B: 84,
0x860: 68,
- 0x861: 85,
0x862: 68,
0x863: 68,
0x864: 68,
0x865: 68,
- 0x866: 85,
0x867: 82,
0x868: 68,
0x869: 82,
- 0x86a: 82,
- 0x8a0: 68,
- 0x8a1: 68,
- 0x8a2: 68,
- 0x8a3: 68,
- 0x8a4: 68,
- 0x8a5: 68,
- 0x8a6: 68,
- 0x8a7: 68,
- 0x8a8: 68,
- 0x8a9: 68,
- 0x8aa: 82,
- 0x8ab: 82,
- 0x8ac: 82,
- 0x8ad: 85,
- 0x8ae: 82,
- 0x8af: 68,
- 0x8b0: 68,
- 0x8b1: 82,
- 0x8b2: 82,
- 0x8b3: 68,
- 0x8b4: 68,
- 0x8b6: 68,
- 0x8b7: 68,
- 0x8b8: 68,
- 0x8b9: 82,
- 0x8ba: 68,
- 0x8bb: 68,
- 0x8bc: 68,
- 0x8bd: 68,
- 0x8be: 68,
- 0x8bf: 68,
- 0x8c0: 68,
- 0x8c1: 68,
- 0x8c2: 68,
- 0x8c3: 68,
- 0x8c4: 68,
- 0x8c5: 68,
- 0x8c6: 68,
- 0x8c7: 68,
- 0x8e2: 85,
- 0x1806: 85,
+ 0x86A: 82,
+ 0x870: 82,
+ 0x871: 82,
+ 0x872: 82,
+ 0x873: 82,
+ 0x874: 82,
+ 0x875: 82,
+ 0x876: 82,
+ 0x877: 82,
+ 0x878: 82,
+ 0x879: 82,
+ 0x87A: 82,
+ 0x87B: 82,
+ 0x87C: 82,
+ 0x87D: 82,
+ 0x87E: 82,
+ 0x87F: 82,
+ 0x880: 82,
+ 0x881: 82,
+ 0x882: 82,
+ 0x883: 67,
+ 0x884: 67,
+ 0x885: 67,
+ 0x886: 68,
+ 0x889: 68,
+ 0x88A: 68,
+ 0x88B: 68,
+ 0x88C: 68,
+ 0x88D: 68,
+ 0x88E: 82,
+ 0x898: 84,
+ 0x899: 84,
+ 0x89A: 84,
+ 0x89B: 84,
+ 0x89C: 84,
+ 0x89D: 84,
+ 0x89E: 84,
+ 0x89F: 84,
+ 0x8A0: 68,
+ 0x8A1: 68,
+ 0x8A2: 68,
+ 0x8A3: 68,
+ 0x8A4: 68,
+ 0x8A5: 68,
+ 0x8A6: 68,
+ 0x8A7: 68,
+ 0x8A8: 68,
+ 0x8A9: 68,
+ 0x8AA: 82,
+ 0x8AB: 82,
+ 0x8AC: 82,
+ 0x8AE: 82,
+ 0x8AF: 68,
+ 0x8B0: 68,
+ 0x8B1: 82,
+ 0x8B2: 82,
+ 0x8B3: 68,
+ 0x8B4: 68,
+ 0x8B5: 68,
+ 0x8B6: 68,
+ 0x8B7: 68,
+ 0x8B8: 68,
+ 0x8B9: 82,
+ 0x8BA: 68,
+ 0x8BB: 68,
+ 0x8BC: 68,
+ 0x8BD: 68,
+ 0x8BE: 68,
+ 0x8BF: 68,
+ 0x8C0: 68,
+ 0x8C1: 68,
+ 0x8C2: 68,
+ 0x8C3: 68,
+ 0x8C4: 68,
+ 0x8C5: 68,
+ 0x8C6: 68,
+ 0x8C7: 68,
+ 0x8C8: 68,
+ 0x8CA: 84,
+ 0x8CB: 84,
+ 0x8CC: 84,
+ 0x8CD: 84,
+ 0x8CE: 84,
+ 0x8CF: 84,
+ 0x8D0: 84,
+ 0x8D1: 84,
+ 0x8D2: 84,
+ 0x8D3: 84,
+ 0x8D4: 84,
+ 0x8D5: 84,
+ 0x8D6: 84,
+ 0x8D7: 84,
+ 0x8D8: 84,
+ 0x8D9: 84,
+ 0x8DA: 84,
+ 0x8DB: 84,
+ 0x8DC: 84,
+ 0x8DD: 84,
+ 0x8DE: 84,
+ 0x8DF: 84,
+ 0x8E0: 84,
+ 0x8E1: 84,
+ 0x8E3: 84,
+ 0x8E4: 84,
+ 0x8E5: 84,
+ 0x8E6: 84,
+ 0x8E7: 84,
+ 0x8E8: 84,
+ 0x8E9: 84,
+ 0x8EA: 84,
+ 0x8EB: 84,
+ 0x8EC: 84,
+ 0x8ED: 84,
+ 0x8EE: 84,
+ 0x8EF: 84,
+ 0x8F0: 84,
+ 0x8F1: 84,
+ 0x8F2: 84,
+ 0x8F3: 84,
+ 0x8F4: 84,
+ 0x8F5: 84,
+ 0x8F6: 84,
+ 0x8F7: 84,
+ 0x8F8: 84,
+ 0x8F9: 84,
+ 0x8FA: 84,
+ 0x8FB: 84,
+ 0x8FC: 84,
+ 0x8FD: 84,
+ 0x8FE: 84,
+ 0x8FF: 84,
+ 0x900: 84,
+ 0x901: 84,
+ 0x902: 84,
+ 0x93A: 84,
+ 0x93C: 84,
+ 0x941: 84,
+ 0x942: 84,
+ 0x943: 84,
+ 0x944: 84,
+ 0x945: 84,
+ 0x946: 84,
+ 0x947: 84,
+ 0x948: 84,
+ 0x94D: 84,
+ 0x951: 84,
+ 0x952: 84,
+ 0x953: 84,
+ 0x954: 84,
+ 0x955: 84,
+ 0x956: 84,
+ 0x957: 84,
+ 0x962: 84,
+ 0x963: 84,
+ 0x981: 84,
+ 0x9BC: 84,
+ 0x9C1: 84,
+ 0x9C2: 84,
+ 0x9C3: 84,
+ 0x9C4: 84,
+ 0x9CD: 84,
+ 0x9E2: 84,
+ 0x9E3: 84,
+ 0x9FE: 84,
+ 0xA01: 84,
+ 0xA02: 84,
+ 0xA3C: 84,
+ 0xA41: 84,
+ 0xA42: 84,
+ 0xA47: 84,
+ 0xA48: 84,
+ 0xA4B: 84,
+ 0xA4C: 84,
+ 0xA4D: 84,
+ 0xA51: 84,
+ 0xA70: 84,
+ 0xA71: 84,
+ 0xA75: 84,
+ 0xA81: 84,
+ 0xA82: 84,
+ 0xABC: 84,
+ 0xAC1: 84,
+ 0xAC2: 84,
+ 0xAC3: 84,
+ 0xAC4: 84,
+ 0xAC5: 84,
+ 0xAC7: 84,
+ 0xAC8: 84,
+ 0xACD: 84,
+ 0xAE2: 84,
+ 0xAE3: 84,
+ 0xAFA: 84,
+ 0xAFB: 84,
+ 0xAFC: 84,
+ 0xAFD: 84,
+ 0xAFE: 84,
+ 0xAFF: 84,
+ 0xB01: 84,
+ 0xB3C: 84,
+ 0xB3F: 84,
+ 0xB41: 84,
+ 0xB42: 84,
+ 0xB43: 84,
+ 0xB44: 84,
+ 0xB4D: 84,
+ 0xB55: 84,
+ 0xB56: 84,
+ 0xB62: 84,
+ 0xB63: 84,
+ 0xB82: 84,
+ 0xBC0: 84,
+ 0xBCD: 84,
+ 0xC00: 84,
+ 0xC04: 84,
+ 0xC3C: 84,
+ 0xC3E: 84,
+ 0xC3F: 84,
+ 0xC40: 84,
+ 0xC46: 84,
+ 0xC47: 84,
+ 0xC48: 84,
+ 0xC4A: 84,
+ 0xC4B: 84,
+ 0xC4C: 84,
+ 0xC4D: 84,
+ 0xC55: 84,
+ 0xC56: 84,
+ 0xC62: 84,
+ 0xC63: 84,
+ 0xC81: 84,
+ 0xCBC: 84,
+ 0xCBF: 84,
+ 0xCC6: 84,
+ 0xCCC: 84,
+ 0xCCD: 84,
+ 0xCE2: 84,
+ 0xCE3: 84,
+ 0xD00: 84,
+ 0xD01: 84,
+ 0xD3B: 84,
+ 0xD3C: 84,
+ 0xD41: 84,
+ 0xD42: 84,
+ 0xD43: 84,
+ 0xD44: 84,
+ 0xD4D: 84,
+ 0xD62: 84,
+ 0xD63: 84,
+ 0xD81: 84,
+ 0xDCA: 84,
+ 0xDD2: 84,
+ 0xDD3: 84,
+ 0xDD4: 84,
+ 0xDD6: 84,
+ 0xE31: 84,
+ 0xE34: 84,
+ 0xE35: 84,
+ 0xE36: 84,
+ 0xE37: 84,
+ 0xE38: 84,
+ 0xE39: 84,
+ 0xE3A: 84,
+ 0xE47: 84,
+ 0xE48: 84,
+ 0xE49: 84,
+ 0xE4A: 84,
+ 0xE4B: 84,
+ 0xE4C: 84,
+ 0xE4D: 84,
+ 0xE4E: 84,
+ 0xEB1: 84,
+ 0xEB4: 84,
+ 0xEB5: 84,
+ 0xEB6: 84,
+ 0xEB7: 84,
+ 0xEB8: 84,
+ 0xEB9: 84,
+ 0xEBA: 84,
+ 0xEBB: 84,
+ 0xEBC: 84,
+ 0xEC8: 84,
+ 0xEC9: 84,
+ 0xECA: 84,
+ 0xECB: 84,
+ 0xECC: 84,
+ 0xECD: 84,
+ 0xECE: 84,
+ 0xF18: 84,
+ 0xF19: 84,
+ 0xF35: 84,
+ 0xF37: 84,
+ 0xF39: 84,
+ 0xF71: 84,
+ 0xF72: 84,
+ 0xF73: 84,
+ 0xF74: 84,
+ 0xF75: 84,
+ 0xF76: 84,
+ 0xF77: 84,
+ 0xF78: 84,
+ 0xF79: 84,
+ 0xF7A: 84,
+ 0xF7B: 84,
+ 0xF7C: 84,
+ 0xF7D: 84,
+ 0xF7E: 84,
+ 0xF80: 84,
+ 0xF81: 84,
+ 0xF82: 84,
+ 0xF83: 84,
+ 0xF84: 84,
+ 0xF86: 84,
+ 0xF87: 84,
+ 0xF8D: 84,
+ 0xF8E: 84,
+ 0xF8F: 84,
+ 0xF90: 84,
+ 0xF91: 84,
+ 0xF92: 84,
+ 0xF93: 84,
+ 0xF94: 84,
+ 0xF95: 84,
+ 0xF96: 84,
+ 0xF97: 84,
+ 0xF99: 84,
+ 0xF9A: 84,
+ 0xF9B: 84,
+ 0xF9C: 84,
+ 0xF9D: 84,
+ 0xF9E: 84,
+ 0xF9F: 84,
+ 0xFA0: 84,
+ 0xFA1: 84,
+ 0xFA2: 84,
+ 0xFA3: 84,
+ 0xFA4: 84,
+ 0xFA5: 84,
+ 0xFA6: 84,
+ 0xFA7: 84,
+ 0xFA8: 84,
+ 0xFA9: 84,
+ 0xFAA: 84,
+ 0xFAB: 84,
+ 0xFAC: 84,
+ 0xFAD: 84,
+ 0xFAE: 84,
+ 0xFAF: 84,
+ 0xFB0: 84,
+ 0xFB1: 84,
+ 0xFB2: 84,
+ 0xFB3: 84,
+ 0xFB4: 84,
+ 0xFB5: 84,
+ 0xFB6: 84,
+ 0xFB7: 84,
+ 0xFB8: 84,
+ 0xFB9: 84,
+ 0xFBA: 84,
+ 0xFBB: 84,
+ 0xFBC: 84,
+ 0xFC6: 84,
+ 0x102D: 84,
+ 0x102E: 84,
+ 0x102F: 84,
+ 0x1030: 84,
+ 0x1032: 84,
+ 0x1033: 84,
+ 0x1034: 84,
+ 0x1035: 84,
+ 0x1036: 84,
+ 0x1037: 84,
+ 0x1039: 84,
+ 0x103A: 84,
+ 0x103D: 84,
+ 0x103E: 84,
+ 0x1058: 84,
+ 0x1059: 84,
+ 0x105E: 84,
+ 0x105F: 84,
+ 0x1060: 84,
+ 0x1071: 84,
+ 0x1072: 84,
+ 0x1073: 84,
+ 0x1074: 84,
+ 0x1082: 84,
+ 0x1085: 84,
+ 0x1086: 84,
+ 0x108D: 84,
+ 0x109D: 84,
+ 0x135D: 84,
+ 0x135E: 84,
+ 0x135F: 84,
+ 0x1712: 84,
+ 0x1713: 84,
+ 0x1714: 84,
+ 0x1732: 84,
+ 0x1733: 84,
+ 0x1752: 84,
+ 0x1753: 84,
+ 0x1772: 84,
+ 0x1773: 84,
+ 0x17B4: 84,
+ 0x17B5: 84,
+ 0x17B7: 84,
+ 0x17B8: 84,
+ 0x17B9: 84,
+ 0x17BA: 84,
+ 0x17BB: 84,
+ 0x17BC: 84,
+ 0x17BD: 84,
+ 0x17C6: 84,
+ 0x17C9: 84,
+ 0x17CA: 84,
+ 0x17CB: 84,
+ 0x17CC: 84,
+ 0x17CD: 84,
+ 0x17CE: 84,
+ 0x17CF: 84,
+ 0x17D0: 84,
+ 0x17D1: 84,
+ 0x17D2: 84,
+ 0x17D3: 84,
+ 0x17DD: 84,
0x1807: 68,
- 0x180a: 67,
- 0x180e: 85,
+ 0x180A: 67,
+ 0x180B: 84,
+ 0x180C: 84,
+ 0x180D: 84,
+ 0x180F: 84,
0x1820: 68,
0x1821: 68,
0x1822: 68,
@@ -459,12 +1136,12 @@ joining_types = {
0x1827: 68,
0x1828: 68,
0x1829: 68,
- 0x182a: 68,
- 0x182b: 68,
- 0x182c: 68,
- 0x182d: 68,
- 0x182e: 68,
- 0x182f: 68,
+ 0x182A: 68,
+ 0x182B: 68,
+ 0x182C: 68,
+ 0x182D: 68,
+ 0x182E: 68,
+ 0x182F: 68,
0x1830: 68,
0x1831: 68,
0x1832: 68,
@@ -475,12 +1152,12 @@ joining_types = {
0x1837: 68,
0x1838: 68,
0x1839: 68,
- 0x183a: 68,
- 0x183b: 68,
- 0x183c: 68,
- 0x183d: 68,
- 0x183e: 68,
- 0x183f: 68,
+ 0x183A: 68,
+ 0x183B: 68,
+ 0x183C: 68,
+ 0x183D: 68,
+ 0x183E: 68,
+ 0x183F: 68,
0x1840: 68,
0x1841: 68,
0x1842: 68,
@@ -491,12 +1168,12 @@ joining_types = {
0x1847: 68,
0x1848: 68,
0x1849: 68,
- 0x184a: 68,
- 0x184b: 68,
- 0x184c: 68,
- 0x184d: 68,
- 0x184e: 68,
- 0x184f: 68,
+ 0x184A: 68,
+ 0x184B: 68,
+ 0x184C: 68,
+ 0x184D: 68,
+ 0x184E: 68,
+ 0x184F: 68,
0x1850: 68,
0x1851: 68,
0x1852: 68,
@@ -507,12 +1184,12 @@ joining_types = {
0x1857: 68,
0x1858: 68,
0x1859: 68,
- 0x185a: 68,
- 0x185b: 68,
- 0x185c: 68,
- 0x185d: 68,
- 0x185e: 68,
- 0x185f: 68,
+ 0x185A: 68,
+ 0x185B: 68,
+ 0x185C: 68,
+ 0x185D: 68,
+ 0x185E: 68,
+ 0x185F: 68,
0x1860: 68,
0x1861: 68,
0x1862: 68,
@@ -523,12 +1200,12 @@ joining_types = {
0x1867: 68,
0x1868: 68,
0x1869: 68,
- 0x186a: 68,
- 0x186b: 68,
- 0x186c: 68,
- 0x186d: 68,
- 0x186e: 68,
- 0x186f: 68,
+ 0x186A: 68,
+ 0x186B: 68,
+ 0x186C: 68,
+ 0x186D: 68,
+ 0x186E: 68,
+ 0x186F: 68,
0x1870: 68,
0x1871: 68,
0x1872: 68,
@@ -538,22 +1215,17 @@ joining_types = {
0x1876: 68,
0x1877: 68,
0x1878: 68,
- 0x1880: 85,
- 0x1881: 85,
- 0x1882: 85,
- 0x1883: 85,
- 0x1884: 85,
0x1885: 84,
0x1886: 84,
0x1887: 68,
0x1888: 68,
0x1889: 68,
- 0x188a: 68,
- 0x188b: 68,
- 0x188c: 68,
- 0x188d: 68,
- 0x188e: 68,
- 0x188f: 68,
+ 0x188A: 68,
+ 0x188B: 68,
+ 0x188C: 68,
+ 0x188D: 68,
+ 0x188E: 68,
+ 0x188F: 68,
0x1890: 68,
0x1891: 68,
0x1892: 68,
@@ -564,1487 +1236,3008 @@ joining_types = {
0x1897: 68,
0x1898: 68,
0x1899: 68,
- 0x189a: 68,
- 0x189b: 68,
- 0x189c: 68,
- 0x189d: 68,
- 0x189e: 68,
- 0x189f: 68,
- 0x18a0: 68,
- 0x18a1: 68,
- 0x18a2: 68,
- 0x18a3: 68,
- 0x18a4: 68,
- 0x18a5: 68,
- 0x18a6: 68,
- 0x18a7: 68,
- 0x18a8: 68,
- 0x18aa: 68,
- 0x200c: 85,
- 0x200d: 67,
- 0x202f: 85,
- 0x2066: 85,
- 0x2067: 85,
- 0x2068: 85,
- 0x2069: 85,
- 0xa840: 68,
- 0xa841: 68,
- 0xa842: 68,
- 0xa843: 68,
- 0xa844: 68,
- 0xa845: 68,
- 0xa846: 68,
- 0xa847: 68,
- 0xa848: 68,
- 0xa849: 68,
- 0xa84a: 68,
- 0xa84b: 68,
- 0xa84c: 68,
- 0xa84d: 68,
- 0xa84e: 68,
- 0xa84f: 68,
- 0xa850: 68,
- 0xa851: 68,
- 0xa852: 68,
- 0xa853: 68,
- 0xa854: 68,
- 0xa855: 68,
- 0xa856: 68,
- 0xa857: 68,
- 0xa858: 68,
- 0xa859: 68,
- 0xa85a: 68,
- 0xa85b: 68,
- 0xa85c: 68,
- 0xa85d: 68,
- 0xa85e: 68,
- 0xa85f: 68,
- 0xa860: 68,
- 0xa861: 68,
- 0xa862: 68,
- 0xa863: 68,
- 0xa864: 68,
- 0xa865: 68,
- 0xa866: 68,
- 0xa867: 68,
- 0xa868: 68,
- 0xa869: 68,
- 0xa86a: 68,
- 0xa86b: 68,
- 0xa86c: 68,
- 0xa86d: 68,
- 0xa86e: 68,
- 0xa86f: 68,
- 0xa870: 68,
- 0xa871: 68,
- 0xa872: 76,
- 0xa873: 85,
- 0x10ac0: 68,
- 0x10ac1: 68,
- 0x10ac2: 68,
- 0x10ac3: 68,
- 0x10ac4: 68,
- 0x10ac5: 82,
- 0x10ac6: 85,
- 0x10ac7: 82,
- 0x10ac8: 85,
- 0x10ac9: 82,
- 0x10aca: 82,
- 0x10acb: 85,
- 0x10acc: 85,
- 0x10acd: 76,
- 0x10ace: 82,
- 0x10acf: 82,
- 0x10ad0: 82,
- 0x10ad1: 82,
- 0x10ad2: 82,
- 0x10ad3: 68,
- 0x10ad4: 68,
- 0x10ad5: 68,
- 0x10ad6: 68,
- 0x10ad7: 76,
- 0x10ad8: 68,
- 0x10ad9: 68,
- 0x10ada: 68,
- 0x10adb: 68,
- 0x10adc: 68,
- 0x10add: 82,
- 0x10ade: 68,
- 0x10adf: 68,
- 0x10ae0: 68,
- 0x10ae1: 82,
- 0x10ae2: 85,
- 0x10ae3: 85,
- 0x10ae4: 82,
- 0x10aeb: 68,
- 0x10aec: 68,
- 0x10aed: 68,
- 0x10aee: 68,
- 0x10aef: 82,
- 0x10b80: 68,
- 0x10b81: 82,
- 0x10b82: 68,
- 0x10b83: 82,
- 0x10b84: 82,
- 0x10b85: 82,
- 0x10b86: 68,
- 0x10b87: 68,
- 0x10b88: 68,
- 0x10b89: 82,
- 0x10b8a: 68,
- 0x10b8b: 68,
- 0x10b8c: 82,
- 0x10b8d: 68,
- 0x10b8e: 82,
- 0x10b8f: 82,
- 0x10b90: 68,
- 0x10b91: 82,
- 0x10ba9: 82,
- 0x10baa: 82,
- 0x10bab: 82,
- 0x10bac: 82,
- 0x10bad: 68,
- 0x10bae: 68,
- 0x10baf: 85,
- 0x10d00: 76,
- 0x10d01: 68,
- 0x10d02: 68,
- 0x10d03: 68,
- 0x10d04: 68,
- 0x10d05: 68,
- 0x10d06: 68,
- 0x10d07: 68,
- 0x10d08: 68,
- 0x10d09: 68,
- 0x10d0a: 68,
- 0x10d0b: 68,
- 0x10d0c: 68,
- 0x10d0d: 68,
- 0x10d0e: 68,
- 0x10d0f: 68,
- 0x10d10: 68,
- 0x10d11: 68,
- 0x10d12: 68,
- 0x10d13: 68,
- 0x10d14: 68,
- 0x10d15: 68,
- 0x10d16: 68,
- 0x10d17: 68,
- 0x10d18: 68,
- 0x10d19: 68,
- 0x10d1a: 68,
- 0x10d1b: 68,
- 0x10d1c: 68,
- 0x10d1d: 68,
- 0x10d1e: 68,
- 0x10d1f: 68,
- 0x10d20: 68,
- 0x10d21: 68,
- 0x10d22: 82,
- 0x10d23: 68,
- 0x10f30: 68,
- 0x10f31: 68,
- 0x10f32: 68,
- 0x10f33: 82,
- 0x10f34: 68,
- 0x10f35: 68,
- 0x10f36: 68,
- 0x10f37: 68,
- 0x10f38: 68,
- 0x10f39: 68,
- 0x10f3a: 68,
- 0x10f3b: 68,
- 0x10f3c: 68,
- 0x10f3d: 68,
- 0x10f3e: 68,
- 0x10f3f: 68,
- 0x10f40: 68,
- 0x10f41: 68,
- 0x10f42: 68,
- 0x10f43: 68,
- 0x10f44: 68,
- 0x10f45: 85,
- 0x10f51: 68,
- 0x10f52: 68,
- 0x10f53: 68,
- 0x10f54: 82,
- 0x10fb0: 68,
- 0x10fb1: 85,
- 0x10fb2: 68,
- 0x10fb3: 68,
- 0x10fb4: 82,
- 0x10fb5: 82,
- 0x10fb6: 82,
- 0x10fb7: 85,
- 0x10fb8: 68,
- 0x10fb9: 82,
- 0x10fba: 82,
- 0x10fbb: 68,
- 0x10fbc: 68,
- 0x10fbd: 82,
- 0x10fbe: 68,
- 0x10fbf: 68,
- 0x10fc0: 85,
- 0x10fc1: 68,
- 0x10fc2: 82,
- 0x10fc3: 82,
- 0x10fc4: 68,
- 0x10fc5: 85,
- 0x10fc6: 85,
- 0x10fc7: 85,
- 0x10fc8: 85,
- 0x10fc9: 82,
- 0x10fca: 68,
- 0x10fcb: 76,
- 0x110bd: 85,
- 0x110cd: 85,
- 0x1e900: 68,
- 0x1e901: 68,
- 0x1e902: 68,
- 0x1e903: 68,
- 0x1e904: 68,
- 0x1e905: 68,
- 0x1e906: 68,
- 0x1e907: 68,
- 0x1e908: 68,
- 0x1e909: 68,
- 0x1e90a: 68,
- 0x1e90b: 68,
- 0x1e90c: 68,
- 0x1e90d: 68,
- 0x1e90e: 68,
- 0x1e90f: 68,
- 0x1e910: 68,
- 0x1e911: 68,
- 0x1e912: 68,
- 0x1e913: 68,
- 0x1e914: 68,
- 0x1e915: 68,
- 0x1e916: 68,
- 0x1e917: 68,
- 0x1e918: 68,
- 0x1e919: 68,
- 0x1e91a: 68,
- 0x1e91b: 68,
- 0x1e91c: 68,
- 0x1e91d: 68,
- 0x1e91e: 68,
- 0x1e91f: 68,
- 0x1e920: 68,
- 0x1e921: 68,
- 0x1e922: 68,
- 0x1e923: 68,
- 0x1e924: 68,
- 0x1e925: 68,
- 0x1e926: 68,
- 0x1e927: 68,
- 0x1e928: 68,
- 0x1e929: 68,
- 0x1e92a: 68,
- 0x1e92b: 68,
- 0x1e92c: 68,
- 0x1e92d: 68,
- 0x1e92e: 68,
- 0x1e92f: 68,
- 0x1e930: 68,
- 0x1e931: 68,
- 0x1e932: 68,
- 0x1e933: 68,
- 0x1e934: 68,
- 0x1e935: 68,
- 0x1e936: 68,
- 0x1e937: 68,
- 0x1e938: 68,
- 0x1e939: 68,
- 0x1e93a: 68,
- 0x1e93b: 68,
- 0x1e93c: 68,
- 0x1e93d: 68,
- 0x1e93e: 68,
- 0x1e93f: 68,
- 0x1e940: 68,
- 0x1e941: 68,
- 0x1e942: 68,
- 0x1e943: 68,
- 0x1e94b: 84,
+ 0x189A: 68,
+ 0x189B: 68,
+ 0x189C: 68,
+ 0x189D: 68,
+ 0x189E: 68,
+ 0x189F: 68,
+ 0x18A0: 68,
+ 0x18A1: 68,
+ 0x18A2: 68,
+ 0x18A3: 68,
+ 0x18A4: 68,
+ 0x18A5: 68,
+ 0x18A6: 68,
+ 0x18A7: 68,
+ 0x18A8: 68,
+ 0x18A9: 84,
+ 0x18AA: 68,
+ 0x1920: 84,
+ 0x1921: 84,
+ 0x1922: 84,
+ 0x1927: 84,
+ 0x1928: 84,
+ 0x1932: 84,
+ 0x1939: 84,
+ 0x193A: 84,
+ 0x193B: 84,
+ 0x1A17: 84,
+ 0x1A18: 84,
+ 0x1A1B: 84,
+ 0x1A56: 84,
+ 0x1A58: 84,
+ 0x1A59: 84,
+ 0x1A5A: 84,
+ 0x1A5B: 84,
+ 0x1A5C: 84,
+ 0x1A5D: 84,
+ 0x1A5E: 84,
+ 0x1A60: 84,
+ 0x1A62: 84,
+ 0x1A65: 84,
+ 0x1A66: 84,
+ 0x1A67: 84,
+ 0x1A68: 84,
+ 0x1A69: 84,
+ 0x1A6A: 84,
+ 0x1A6B: 84,
+ 0x1A6C: 84,
+ 0x1A73: 84,
+ 0x1A74: 84,
+ 0x1A75: 84,
+ 0x1A76: 84,
+ 0x1A77: 84,
+ 0x1A78: 84,
+ 0x1A79: 84,
+ 0x1A7A: 84,
+ 0x1A7B: 84,
+ 0x1A7C: 84,
+ 0x1A7F: 84,
+ 0x1AB0: 84,
+ 0x1AB1: 84,
+ 0x1AB2: 84,
+ 0x1AB3: 84,
+ 0x1AB4: 84,
+ 0x1AB5: 84,
+ 0x1AB6: 84,
+ 0x1AB7: 84,
+ 0x1AB8: 84,
+ 0x1AB9: 84,
+ 0x1ABA: 84,
+ 0x1ABB: 84,
+ 0x1ABC: 84,
+ 0x1ABD: 84,
+ 0x1ABE: 84,
+ 0x1ABF: 84,
+ 0x1AC0: 84,
+ 0x1AC1: 84,
+ 0x1AC2: 84,
+ 0x1AC3: 84,
+ 0x1AC4: 84,
+ 0x1AC5: 84,
+ 0x1AC6: 84,
+ 0x1AC7: 84,
+ 0x1AC8: 84,
+ 0x1AC9: 84,
+ 0x1ACA: 84,
+ 0x1ACB: 84,
+ 0x1ACC: 84,
+ 0x1ACD: 84,
+ 0x1ACE: 84,
+ 0x1B00: 84,
+ 0x1B01: 84,
+ 0x1B02: 84,
+ 0x1B03: 84,
+ 0x1B34: 84,
+ 0x1B36: 84,
+ 0x1B37: 84,
+ 0x1B38: 84,
+ 0x1B39: 84,
+ 0x1B3A: 84,
+ 0x1B3C: 84,
+ 0x1B42: 84,
+ 0x1B6B: 84,
+ 0x1B6C: 84,
+ 0x1B6D: 84,
+ 0x1B6E: 84,
+ 0x1B6F: 84,
+ 0x1B70: 84,
+ 0x1B71: 84,
+ 0x1B72: 84,
+ 0x1B73: 84,
+ 0x1B80: 84,
+ 0x1B81: 84,
+ 0x1BA2: 84,
+ 0x1BA3: 84,
+ 0x1BA4: 84,
+ 0x1BA5: 84,
+ 0x1BA8: 84,
+ 0x1BA9: 84,
+ 0x1BAB: 84,
+ 0x1BAC: 84,
+ 0x1BAD: 84,
+ 0x1BE6: 84,
+ 0x1BE8: 84,
+ 0x1BE9: 84,
+ 0x1BED: 84,
+ 0x1BEF: 84,
+ 0x1BF0: 84,
+ 0x1BF1: 84,
+ 0x1C2C: 84,
+ 0x1C2D: 84,
+ 0x1C2E: 84,
+ 0x1C2F: 84,
+ 0x1C30: 84,
+ 0x1C31: 84,
+ 0x1C32: 84,
+ 0x1C33: 84,
+ 0x1C36: 84,
+ 0x1C37: 84,
+ 0x1CD0: 84,
+ 0x1CD1: 84,
+ 0x1CD2: 84,
+ 0x1CD4: 84,
+ 0x1CD5: 84,
+ 0x1CD6: 84,
+ 0x1CD7: 84,
+ 0x1CD8: 84,
+ 0x1CD9: 84,
+ 0x1CDA: 84,
+ 0x1CDB: 84,
+ 0x1CDC: 84,
+ 0x1CDD: 84,
+ 0x1CDE: 84,
+ 0x1CDF: 84,
+ 0x1CE0: 84,
+ 0x1CE2: 84,
+ 0x1CE3: 84,
+ 0x1CE4: 84,
+ 0x1CE5: 84,
+ 0x1CE6: 84,
+ 0x1CE7: 84,
+ 0x1CE8: 84,
+ 0x1CED: 84,
+ 0x1CF4: 84,
+ 0x1CF8: 84,
+ 0x1CF9: 84,
+ 0x1DC0: 84,
+ 0x1DC1: 84,
+ 0x1DC2: 84,
+ 0x1DC3: 84,
+ 0x1DC4: 84,
+ 0x1DC5: 84,
+ 0x1DC6: 84,
+ 0x1DC7: 84,
+ 0x1DC8: 84,
+ 0x1DC9: 84,
+ 0x1DCA: 84,
+ 0x1DCB: 84,
+ 0x1DCC: 84,
+ 0x1DCD: 84,
+ 0x1DCE: 84,
+ 0x1DCF: 84,
+ 0x1DD0: 84,
+ 0x1DD1: 84,
+ 0x1DD2: 84,
+ 0x1DD3: 84,
+ 0x1DD4: 84,
+ 0x1DD5: 84,
+ 0x1DD6: 84,
+ 0x1DD7: 84,
+ 0x1DD8: 84,
+ 0x1DD9: 84,
+ 0x1DDA: 84,
+ 0x1DDB: 84,
+ 0x1DDC: 84,
+ 0x1DDD: 84,
+ 0x1DDE: 84,
+ 0x1DDF: 84,
+ 0x1DE0: 84,
+ 0x1DE1: 84,
+ 0x1DE2: 84,
+ 0x1DE3: 84,
+ 0x1DE4: 84,
+ 0x1DE5: 84,
+ 0x1DE6: 84,
+ 0x1DE7: 84,
+ 0x1DE8: 84,
+ 0x1DE9: 84,
+ 0x1DEA: 84,
+ 0x1DEB: 84,
+ 0x1DEC: 84,
+ 0x1DED: 84,
+ 0x1DEE: 84,
+ 0x1DEF: 84,
+ 0x1DF0: 84,
+ 0x1DF1: 84,
+ 0x1DF2: 84,
+ 0x1DF3: 84,
+ 0x1DF4: 84,
+ 0x1DF5: 84,
+ 0x1DF6: 84,
+ 0x1DF7: 84,
+ 0x1DF8: 84,
+ 0x1DF9: 84,
+ 0x1DFA: 84,
+ 0x1DFB: 84,
+ 0x1DFC: 84,
+ 0x1DFD: 84,
+ 0x1DFE: 84,
+ 0x1DFF: 84,
+ 0x200B: 84,
+ 0x200D: 67,
+ 0x200E: 84,
+ 0x200F: 84,
+ 0x202A: 84,
+ 0x202B: 84,
+ 0x202C: 84,
+ 0x202D: 84,
+ 0x202E: 84,
+ 0x2060: 84,
+ 0x2061: 84,
+ 0x2062: 84,
+ 0x2063: 84,
+ 0x2064: 84,
+ 0x206A: 84,
+ 0x206B: 84,
+ 0x206C: 84,
+ 0x206D: 84,
+ 0x206E: 84,
+ 0x206F: 84,
+ 0x20D0: 84,
+ 0x20D1: 84,
+ 0x20D2: 84,
+ 0x20D3: 84,
+ 0x20D4: 84,
+ 0x20D5: 84,
+ 0x20D6: 84,
+ 0x20D7: 84,
+ 0x20D8: 84,
+ 0x20D9: 84,
+ 0x20DA: 84,
+ 0x20DB: 84,
+ 0x20DC: 84,
+ 0x20DD: 84,
+ 0x20DE: 84,
+ 0x20DF: 84,
+ 0x20E0: 84,
+ 0x20E1: 84,
+ 0x20E2: 84,
+ 0x20E3: 84,
+ 0x20E4: 84,
+ 0x20E5: 84,
+ 0x20E6: 84,
+ 0x20E7: 84,
+ 0x20E8: 84,
+ 0x20E9: 84,
+ 0x20EA: 84,
+ 0x20EB: 84,
+ 0x20EC: 84,
+ 0x20ED: 84,
+ 0x20EE: 84,
+ 0x20EF: 84,
+ 0x20F0: 84,
+ 0x2CEF: 84,
+ 0x2CF0: 84,
+ 0x2CF1: 84,
+ 0x2D7F: 84,
+ 0x2DE0: 84,
+ 0x2DE1: 84,
+ 0x2DE2: 84,
+ 0x2DE3: 84,
+ 0x2DE4: 84,
+ 0x2DE5: 84,
+ 0x2DE6: 84,
+ 0x2DE7: 84,
+ 0x2DE8: 84,
+ 0x2DE9: 84,
+ 0x2DEA: 84,
+ 0x2DEB: 84,
+ 0x2DEC: 84,
+ 0x2DED: 84,
+ 0x2DEE: 84,
+ 0x2DEF: 84,
+ 0x2DF0: 84,
+ 0x2DF1: 84,
+ 0x2DF2: 84,
+ 0x2DF3: 84,
+ 0x2DF4: 84,
+ 0x2DF5: 84,
+ 0x2DF6: 84,
+ 0x2DF7: 84,
+ 0x2DF8: 84,
+ 0x2DF9: 84,
+ 0x2DFA: 84,
+ 0x2DFB: 84,
+ 0x2DFC: 84,
+ 0x2DFD: 84,
+ 0x2DFE: 84,
+ 0x2DFF: 84,
+ 0x302A: 84,
+ 0x302B: 84,
+ 0x302C: 84,
+ 0x302D: 84,
+ 0x3099: 84,
+ 0x309A: 84,
+ 0xA66F: 84,
+ 0xA670: 84,
+ 0xA671: 84,
+ 0xA672: 84,
+ 0xA674: 84,
+ 0xA675: 84,
+ 0xA676: 84,
+ 0xA677: 84,
+ 0xA678: 84,
+ 0xA679: 84,
+ 0xA67A: 84,
+ 0xA67B: 84,
+ 0xA67C: 84,
+ 0xA67D: 84,
+ 0xA69E: 84,
+ 0xA69F: 84,
+ 0xA6F0: 84,
+ 0xA6F1: 84,
+ 0xA802: 84,
+ 0xA806: 84,
+ 0xA80B: 84,
+ 0xA825: 84,
+ 0xA826: 84,
+ 0xA82C: 84,
+ 0xA840: 68,
+ 0xA841: 68,
+ 0xA842: 68,
+ 0xA843: 68,
+ 0xA844: 68,
+ 0xA845: 68,
+ 0xA846: 68,
+ 0xA847: 68,
+ 0xA848: 68,
+ 0xA849: 68,
+ 0xA84A: 68,
+ 0xA84B: 68,
+ 0xA84C: 68,
+ 0xA84D: 68,
+ 0xA84E: 68,
+ 0xA84F: 68,
+ 0xA850: 68,
+ 0xA851: 68,
+ 0xA852: 68,
+ 0xA853: 68,
+ 0xA854: 68,
+ 0xA855: 68,
+ 0xA856: 68,
+ 0xA857: 68,
+ 0xA858: 68,
+ 0xA859: 68,
+ 0xA85A: 68,
+ 0xA85B: 68,
+ 0xA85C: 68,
+ 0xA85D: 68,
+ 0xA85E: 68,
+ 0xA85F: 68,
+ 0xA860: 68,
+ 0xA861: 68,
+ 0xA862: 68,
+ 0xA863: 68,
+ 0xA864: 68,
+ 0xA865: 68,
+ 0xA866: 68,
+ 0xA867: 68,
+ 0xA868: 68,
+ 0xA869: 68,
+ 0xA86A: 68,
+ 0xA86B: 68,
+ 0xA86C: 68,
+ 0xA86D: 68,
+ 0xA86E: 68,
+ 0xA86F: 68,
+ 0xA870: 68,
+ 0xA871: 68,
+ 0xA872: 76,
+ 0xA8C4: 84,
+ 0xA8C5: 84,
+ 0xA8E0: 84,
+ 0xA8E1: 84,
+ 0xA8E2: 84,
+ 0xA8E3: 84,
+ 0xA8E4: 84,
+ 0xA8E5: 84,
+ 0xA8E6: 84,
+ 0xA8E7: 84,
+ 0xA8E8: 84,
+ 0xA8E9: 84,
+ 0xA8EA: 84,
+ 0xA8EB: 84,
+ 0xA8EC: 84,
+ 0xA8ED: 84,
+ 0xA8EE: 84,
+ 0xA8EF: 84,
+ 0xA8F0: 84,
+ 0xA8F1: 84,
+ 0xA8FF: 84,
+ 0xA926: 84,
+ 0xA927: 84,
+ 0xA928: 84,
+ 0xA929: 84,
+ 0xA92A: 84,
+ 0xA92B: 84,
+ 0xA92C: 84,
+ 0xA92D: 84,
+ 0xA947: 84,
+ 0xA948: 84,
+ 0xA949: 84,
+ 0xA94A: 84,
+ 0xA94B: 84,
+ 0xA94C: 84,
+ 0xA94D: 84,
+ 0xA94E: 84,
+ 0xA94F: 84,
+ 0xA950: 84,
+ 0xA951: 84,
+ 0xA980: 84,
+ 0xA981: 84,
+ 0xA982: 84,
+ 0xA9B3: 84,
+ 0xA9B6: 84,
+ 0xA9B7: 84,
+ 0xA9B8: 84,
+ 0xA9B9: 84,
+ 0xA9BC: 84,
+ 0xA9BD: 84,
+ 0xA9E5: 84,
+ 0xAA29: 84,
+ 0xAA2A: 84,
+ 0xAA2B: 84,
+ 0xAA2C: 84,
+ 0xAA2D: 84,
+ 0xAA2E: 84,
+ 0xAA31: 84,
+ 0xAA32: 84,
+ 0xAA35: 84,
+ 0xAA36: 84,
+ 0xAA43: 84,
+ 0xAA4C: 84,
+ 0xAA7C: 84,
+ 0xAAB0: 84,
+ 0xAAB2: 84,
+ 0xAAB3: 84,
+ 0xAAB4: 84,
+ 0xAAB7: 84,
+ 0xAAB8: 84,
+ 0xAABE: 84,
+ 0xAABF: 84,
+ 0xAAC1: 84,
+ 0xAAEC: 84,
+ 0xAAED: 84,
+ 0xAAF6: 84,
+ 0xABE5: 84,
+ 0xABE8: 84,
+ 0xABED: 84,
+ 0xFB1E: 84,
+ 0xFE00: 84,
+ 0xFE01: 84,
+ 0xFE02: 84,
+ 0xFE03: 84,
+ 0xFE04: 84,
+ 0xFE05: 84,
+ 0xFE06: 84,
+ 0xFE07: 84,
+ 0xFE08: 84,
+ 0xFE09: 84,
+ 0xFE0A: 84,
+ 0xFE0B: 84,
+ 0xFE0C: 84,
+ 0xFE0D: 84,
+ 0xFE0E: 84,
+ 0xFE0F: 84,
+ 0xFE20: 84,
+ 0xFE21: 84,
+ 0xFE22: 84,
+ 0xFE23: 84,
+ 0xFE24: 84,
+ 0xFE25: 84,
+ 0xFE26: 84,
+ 0xFE27: 84,
+ 0xFE28: 84,
+ 0xFE29: 84,
+ 0xFE2A: 84,
+ 0xFE2B: 84,
+ 0xFE2C: 84,
+ 0xFE2D: 84,
+ 0xFE2E: 84,
+ 0xFE2F: 84,
+ 0xFEFF: 84,
+ 0xFFF9: 84,
+ 0xFFFA: 84,
+ 0xFFFB: 84,
+ 0x101FD: 84,
+ 0x102E0: 84,
+ 0x10376: 84,
+ 0x10377: 84,
+ 0x10378: 84,
+ 0x10379: 84,
+ 0x1037A: 84,
+ 0x10A01: 84,
+ 0x10A02: 84,
+ 0x10A03: 84,
+ 0x10A05: 84,
+ 0x10A06: 84,
+ 0x10A0C: 84,
+ 0x10A0D: 84,
+ 0x10A0E: 84,
+ 0x10A0F: 84,
+ 0x10A38: 84,
+ 0x10A39: 84,
+ 0x10A3A: 84,
+ 0x10A3F: 84,
+ 0x10AC0: 68,
+ 0x10AC1: 68,
+ 0x10AC2: 68,
+ 0x10AC3: 68,
+ 0x10AC4: 68,
+ 0x10AC5: 82,
+ 0x10AC7: 82,
+ 0x10AC9: 82,
+ 0x10ACA: 82,
+ 0x10ACD: 76,
+ 0x10ACE: 82,
+ 0x10ACF: 82,
+ 0x10AD0: 82,
+ 0x10AD1: 82,
+ 0x10AD2: 82,
+ 0x10AD3: 68,
+ 0x10AD4: 68,
+ 0x10AD5: 68,
+ 0x10AD6: 68,
+ 0x10AD7: 76,
+ 0x10AD8: 68,
+ 0x10AD9: 68,
+ 0x10ADA: 68,
+ 0x10ADB: 68,
+ 0x10ADC: 68,
+ 0x10ADD: 82,
+ 0x10ADE: 68,
+ 0x10ADF: 68,
+ 0x10AE0: 68,
+ 0x10AE1: 82,
+ 0x10AE4: 82,
+ 0x10AE5: 84,
+ 0x10AE6: 84,
+ 0x10AEB: 68,
+ 0x10AEC: 68,
+ 0x10AED: 68,
+ 0x10AEE: 68,
+ 0x10AEF: 82,
+ 0x10B80: 68,
+ 0x10B81: 82,
+ 0x10B82: 68,
+ 0x10B83: 82,
+ 0x10B84: 82,
+ 0x10B85: 82,
+ 0x10B86: 68,
+ 0x10B87: 68,
+ 0x10B88: 68,
+ 0x10B89: 82,
+ 0x10B8A: 68,
+ 0x10B8B: 68,
+ 0x10B8C: 82,
+ 0x10B8D: 68,
+ 0x10B8E: 82,
+ 0x10B8F: 82,
+ 0x10B90: 68,
+ 0x10B91: 82,
+ 0x10BA9: 82,
+ 0x10BAA: 82,
+ 0x10BAB: 82,
+ 0x10BAC: 82,
+ 0x10BAD: 68,
+ 0x10BAE: 68,
+ 0x10D00: 76,
+ 0x10D01: 68,
+ 0x10D02: 68,
+ 0x10D03: 68,
+ 0x10D04: 68,
+ 0x10D05: 68,
+ 0x10D06: 68,
+ 0x10D07: 68,
+ 0x10D08: 68,
+ 0x10D09: 68,
+ 0x10D0A: 68,
+ 0x10D0B: 68,
+ 0x10D0C: 68,
+ 0x10D0D: 68,
+ 0x10D0E: 68,
+ 0x10D0F: 68,
+ 0x10D10: 68,
+ 0x10D11: 68,
+ 0x10D12: 68,
+ 0x10D13: 68,
+ 0x10D14: 68,
+ 0x10D15: 68,
+ 0x10D16: 68,
+ 0x10D17: 68,
+ 0x10D18: 68,
+ 0x10D19: 68,
+ 0x10D1A: 68,
+ 0x10D1B: 68,
+ 0x10D1C: 68,
+ 0x10D1D: 68,
+ 0x10D1E: 68,
+ 0x10D1F: 68,
+ 0x10D20: 68,
+ 0x10D21: 68,
+ 0x10D22: 82,
+ 0x10D23: 68,
+ 0x10D24: 84,
+ 0x10D25: 84,
+ 0x10D26: 84,
+ 0x10D27: 84,
+ 0x10EAB: 84,
+ 0x10EAC: 84,
+ 0x10EFD: 84,
+ 0x10EFE: 84,
+ 0x10EFF: 84,
+ 0x10F30: 68,
+ 0x10F31: 68,
+ 0x10F32: 68,
+ 0x10F33: 82,
+ 0x10F34: 68,
+ 0x10F35: 68,
+ 0x10F36: 68,
+ 0x10F37: 68,
+ 0x10F38: 68,
+ 0x10F39: 68,
+ 0x10F3A: 68,
+ 0x10F3B: 68,
+ 0x10F3C: 68,
+ 0x10F3D: 68,
+ 0x10F3E: 68,
+ 0x10F3F: 68,
+ 0x10F40: 68,
+ 0x10F41: 68,
+ 0x10F42: 68,
+ 0x10F43: 68,
+ 0x10F44: 68,
+ 0x10F46: 84,
+ 0x10F47: 84,
+ 0x10F48: 84,
+ 0x10F49: 84,
+ 0x10F4A: 84,
+ 0x10F4B: 84,
+ 0x10F4C: 84,
+ 0x10F4D: 84,
+ 0x10F4E: 84,
+ 0x10F4F: 84,
+ 0x10F50: 84,
+ 0x10F51: 68,
+ 0x10F52: 68,
+ 0x10F53: 68,
+ 0x10F54: 82,
+ 0x10F70: 68,
+ 0x10F71: 68,
+ 0x10F72: 68,
+ 0x10F73: 68,
+ 0x10F74: 82,
+ 0x10F75: 82,
+ 0x10F76: 68,
+ 0x10F77: 68,
+ 0x10F78: 68,
+ 0x10F79: 68,
+ 0x10F7A: 68,
+ 0x10F7B: 68,
+ 0x10F7C: 68,
+ 0x10F7D: 68,
+ 0x10F7E: 68,
+ 0x10F7F: 68,
+ 0x10F80: 68,
+ 0x10F81: 68,
+ 0x10F82: 84,
+ 0x10F83: 84,
+ 0x10F84: 84,
+ 0x10F85: 84,
+ 0x10FB0: 68,
+ 0x10FB2: 68,
+ 0x10FB3: 68,
+ 0x10FB4: 82,
+ 0x10FB5: 82,
+ 0x10FB6: 82,
+ 0x10FB8: 68,
+ 0x10FB9: 82,
+ 0x10FBA: 82,
+ 0x10FBB: 68,
+ 0x10FBC: 68,
+ 0x10FBD: 82,
+ 0x10FBE: 68,
+ 0x10FBF: 68,
+ 0x10FC1: 68,
+ 0x10FC2: 82,
+ 0x10FC3: 82,
+ 0x10FC4: 68,
+ 0x10FC9: 82,
+ 0x10FCA: 68,
+ 0x10FCB: 76,
+ 0x11001: 84,
+ 0x11038: 84,
+ 0x11039: 84,
+ 0x1103A: 84,
+ 0x1103B: 84,
+ 0x1103C: 84,
+ 0x1103D: 84,
+ 0x1103E: 84,
+ 0x1103F: 84,
+ 0x11040: 84,
+ 0x11041: 84,
+ 0x11042: 84,
+ 0x11043: 84,
+ 0x11044: 84,
+ 0x11045: 84,
+ 0x11046: 84,
+ 0x11070: 84,
+ 0x11073: 84,
+ 0x11074: 84,
+ 0x1107F: 84,
+ 0x11080: 84,
+ 0x11081: 84,
+ 0x110B3: 84,
+ 0x110B4: 84,
+ 0x110B5: 84,
+ 0x110B6: 84,
+ 0x110B9: 84,
+ 0x110BA: 84,
+ 0x110C2: 84,
+ 0x11100: 84,
+ 0x11101: 84,
+ 0x11102: 84,
+ 0x11127: 84,
+ 0x11128: 84,
+ 0x11129: 84,
+ 0x1112A: 84,
+ 0x1112B: 84,
+ 0x1112D: 84,
+ 0x1112E: 84,
+ 0x1112F: 84,
+ 0x11130: 84,
+ 0x11131: 84,
+ 0x11132: 84,
+ 0x11133: 84,
+ 0x11134: 84,
+ 0x11173: 84,
+ 0x11180: 84,
+ 0x11181: 84,
+ 0x111B6: 84,
+ 0x111B7: 84,
+ 0x111B8: 84,
+ 0x111B9: 84,
+ 0x111BA: 84,
+ 0x111BB: 84,
+ 0x111BC: 84,
+ 0x111BD: 84,
+ 0x111BE: 84,
+ 0x111C9: 84,
+ 0x111CA: 84,
+ 0x111CB: 84,
+ 0x111CC: 84,
+ 0x111CF: 84,
+ 0x1122F: 84,
+ 0x11230: 84,
+ 0x11231: 84,
+ 0x11234: 84,
+ 0x11236: 84,
+ 0x11237: 84,
+ 0x1123E: 84,
+ 0x11241: 84,
+ 0x112DF: 84,
+ 0x112E3: 84,
+ 0x112E4: 84,
+ 0x112E5: 84,
+ 0x112E6: 84,
+ 0x112E7: 84,
+ 0x112E8: 84,
+ 0x112E9: 84,
+ 0x112EA: 84,
+ 0x11300: 84,
+ 0x11301: 84,
+ 0x1133B: 84,
+ 0x1133C: 84,
+ 0x11340: 84,
+ 0x11366: 84,
+ 0x11367: 84,
+ 0x11368: 84,
+ 0x11369: 84,
+ 0x1136A: 84,
+ 0x1136B: 84,
+ 0x1136C: 84,
+ 0x11370: 84,
+ 0x11371: 84,
+ 0x11372: 84,
+ 0x11373: 84,
+ 0x11374: 84,
+ 0x11438: 84,
+ 0x11439: 84,
+ 0x1143A: 84,
+ 0x1143B: 84,
+ 0x1143C: 84,
+ 0x1143D: 84,
+ 0x1143E: 84,
+ 0x1143F: 84,
+ 0x11442: 84,
+ 0x11443: 84,
+ 0x11444: 84,
+ 0x11446: 84,
+ 0x1145E: 84,
+ 0x114B3: 84,
+ 0x114B4: 84,
+ 0x114B5: 84,
+ 0x114B6: 84,
+ 0x114B7: 84,
+ 0x114B8: 84,
+ 0x114BA: 84,
+ 0x114BF: 84,
+ 0x114C0: 84,
+ 0x114C2: 84,
+ 0x114C3: 84,
+ 0x115B2: 84,
+ 0x115B3: 84,
+ 0x115B4: 84,
+ 0x115B5: 84,
+ 0x115BC: 84,
+ 0x115BD: 84,
+ 0x115BF: 84,
+ 0x115C0: 84,
+ 0x115DC: 84,
+ 0x115DD: 84,
+ 0x11633: 84,
+ 0x11634: 84,
+ 0x11635: 84,
+ 0x11636: 84,
+ 0x11637: 84,
+ 0x11638: 84,
+ 0x11639: 84,
+ 0x1163A: 84,
+ 0x1163D: 84,
+ 0x1163F: 84,
+ 0x11640: 84,
+ 0x116AB: 84,
+ 0x116AD: 84,
+ 0x116B0: 84,
+ 0x116B1: 84,
+ 0x116B2: 84,
+ 0x116B3: 84,
+ 0x116B4: 84,
+ 0x116B5: 84,
+ 0x116B7: 84,
+ 0x1171D: 84,
+ 0x1171E: 84,
+ 0x1171F: 84,
+ 0x11722: 84,
+ 0x11723: 84,
+ 0x11724: 84,
+ 0x11725: 84,
+ 0x11727: 84,
+ 0x11728: 84,
+ 0x11729: 84,
+ 0x1172A: 84,
+ 0x1172B: 84,
+ 0x1182F: 84,
+ 0x11830: 84,
+ 0x11831: 84,
+ 0x11832: 84,
+ 0x11833: 84,
+ 0x11834: 84,
+ 0x11835: 84,
+ 0x11836: 84,
+ 0x11837: 84,
+ 0x11839: 84,
+ 0x1183A: 84,
+ 0x1193B: 84,
+ 0x1193C: 84,
+ 0x1193E: 84,
+ 0x11943: 84,
+ 0x119D4: 84,
+ 0x119D5: 84,
+ 0x119D6: 84,
+ 0x119D7: 84,
+ 0x119DA: 84,
+ 0x119DB: 84,
+ 0x119E0: 84,
+ 0x11A01: 84,
+ 0x11A02: 84,
+ 0x11A03: 84,
+ 0x11A04: 84,
+ 0x11A05: 84,
+ 0x11A06: 84,
+ 0x11A07: 84,
+ 0x11A08: 84,
+ 0x11A09: 84,
+ 0x11A0A: 84,
+ 0x11A33: 84,
+ 0x11A34: 84,
+ 0x11A35: 84,
+ 0x11A36: 84,
+ 0x11A37: 84,
+ 0x11A38: 84,
+ 0x11A3B: 84,
+ 0x11A3C: 84,
+ 0x11A3D: 84,
+ 0x11A3E: 84,
+ 0x11A47: 84,
+ 0x11A51: 84,
+ 0x11A52: 84,
+ 0x11A53: 84,
+ 0x11A54: 84,
+ 0x11A55: 84,
+ 0x11A56: 84,
+ 0x11A59: 84,
+ 0x11A5A: 84,
+ 0x11A5B: 84,
+ 0x11A8A: 84,
+ 0x11A8B: 84,
+ 0x11A8C: 84,
+ 0x11A8D: 84,
+ 0x11A8E: 84,
+ 0x11A8F: 84,
+ 0x11A90: 84,
+ 0x11A91: 84,
+ 0x11A92: 84,
+ 0x11A93: 84,
+ 0x11A94: 84,
+ 0x11A95: 84,
+ 0x11A96: 84,
+ 0x11A98: 84,
+ 0x11A99: 84,
+ 0x11C30: 84,
+ 0x11C31: 84,
+ 0x11C32: 84,
+ 0x11C33: 84,
+ 0x11C34: 84,
+ 0x11C35: 84,
+ 0x11C36: 84,
+ 0x11C38: 84,
+ 0x11C39: 84,
+ 0x11C3A: 84,
+ 0x11C3B: 84,
+ 0x11C3C: 84,
+ 0x11C3D: 84,
+ 0x11C3F: 84,
+ 0x11C92: 84,
+ 0x11C93: 84,
+ 0x11C94: 84,
+ 0x11C95: 84,
+ 0x11C96: 84,
+ 0x11C97: 84,
+ 0x11C98: 84,
+ 0x11C99: 84,
+ 0x11C9A: 84,
+ 0x11C9B: 84,
+ 0x11C9C: 84,
+ 0x11C9D: 84,
+ 0x11C9E: 84,
+ 0x11C9F: 84,
+ 0x11CA0: 84,
+ 0x11CA1: 84,
+ 0x11CA2: 84,
+ 0x11CA3: 84,
+ 0x11CA4: 84,
+ 0x11CA5: 84,
+ 0x11CA6: 84,
+ 0x11CA7: 84,
+ 0x11CAA: 84,
+ 0x11CAB: 84,
+ 0x11CAC: 84,
+ 0x11CAD: 84,
+ 0x11CAE: 84,
+ 0x11CAF: 84,
+ 0x11CB0: 84,
+ 0x11CB2: 84,
+ 0x11CB3: 84,
+ 0x11CB5: 84,
+ 0x11CB6: 84,
+ 0x11D31: 84,
+ 0x11D32: 84,
+ 0x11D33: 84,
+ 0x11D34: 84,
+ 0x11D35: 84,
+ 0x11D36: 84,
+ 0x11D3A: 84,
+ 0x11D3C: 84,
+ 0x11D3D: 84,
+ 0x11D3F: 84,
+ 0x11D40: 84,
+ 0x11D41: 84,
+ 0x11D42: 84,
+ 0x11D43: 84,
+ 0x11D44: 84,
+ 0x11D45: 84,
+ 0x11D47: 84,
+ 0x11D90: 84,
+ 0x11D91: 84,
+ 0x11D95: 84,
+ 0x11D97: 84,
+ 0x11EF3: 84,
+ 0x11EF4: 84,
+ 0x11F00: 84,
+ 0x11F01: 84,
+ 0x11F36: 84,
+ 0x11F37: 84,
+ 0x11F38: 84,
+ 0x11F39: 84,
+ 0x11F3A: 84,
+ 0x11F40: 84,
+ 0x11F42: 84,
+ 0x13430: 84,
+ 0x13431: 84,
+ 0x13432: 84,
+ 0x13433: 84,
+ 0x13434: 84,
+ 0x13435: 84,
+ 0x13436: 84,
+ 0x13437: 84,
+ 0x13438: 84,
+ 0x13439: 84,
+ 0x1343A: 84,
+ 0x1343B: 84,
+ 0x1343C: 84,
+ 0x1343D: 84,
+ 0x1343E: 84,
+ 0x1343F: 84,
+ 0x13440: 84,
+ 0x13447: 84,
+ 0x13448: 84,
+ 0x13449: 84,
+ 0x1344A: 84,
+ 0x1344B: 84,
+ 0x1344C: 84,
+ 0x1344D: 84,
+ 0x1344E: 84,
+ 0x1344F: 84,
+ 0x13450: 84,
+ 0x13451: 84,
+ 0x13452: 84,
+ 0x13453: 84,
+ 0x13454: 84,
+ 0x13455: 84,
+ 0x16AF0: 84,
+ 0x16AF1: 84,
+ 0x16AF2: 84,
+ 0x16AF3: 84,
+ 0x16AF4: 84,
+ 0x16B30: 84,
+ 0x16B31: 84,
+ 0x16B32: 84,
+ 0x16B33: 84,
+ 0x16B34: 84,
+ 0x16B35: 84,
+ 0x16B36: 84,
+ 0x16F4F: 84,
+ 0x16F8F: 84,
+ 0x16F90: 84,
+ 0x16F91: 84,
+ 0x16F92: 84,
+ 0x16FE4: 84,
+ 0x1BC9D: 84,
+ 0x1BC9E: 84,
+ 0x1BCA0: 84,
+ 0x1BCA1: 84,
+ 0x1BCA2: 84,
+ 0x1BCA3: 84,
+ 0x1CF00: 84,
+ 0x1CF01: 84,
+ 0x1CF02: 84,
+ 0x1CF03: 84,
+ 0x1CF04: 84,
+ 0x1CF05: 84,
+ 0x1CF06: 84,
+ 0x1CF07: 84,
+ 0x1CF08: 84,
+ 0x1CF09: 84,
+ 0x1CF0A: 84,
+ 0x1CF0B: 84,
+ 0x1CF0C: 84,
+ 0x1CF0D: 84,
+ 0x1CF0E: 84,
+ 0x1CF0F: 84,
+ 0x1CF10: 84,
+ 0x1CF11: 84,
+ 0x1CF12: 84,
+ 0x1CF13: 84,
+ 0x1CF14: 84,
+ 0x1CF15: 84,
+ 0x1CF16: 84,
+ 0x1CF17: 84,
+ 0x1CF18: 84,
+ 0x1CF19: 84,
+ 0x1CF1A: 84,
+ 0x1CF1B: 84,
+ 0x1CF1C: 84,
+ 0x1CF1D: 84,
+ 0x1CF1E: 84,
+ 0x1CF1F: 84,
+ 0x1CF20: 84,
+ 0x1CF21: 84,
+ 0x1CF22: 84,
+ 0x1CF23: 84,
+ 0x1CF24: 84,
+ 0x1CF25: 84,
+ 0x1CF26: 84,
+ 0x1CF27: 84,
+ 0x1CF28: 84,
+ 0x1CF29: 84,
+ 0x1CF2A: 84,
+ 0x1CF2B: 84,
+ 0x1CF2C: 84,
+ 0x1CF2D: 84,
+ 0x1CF30: 84,
+ 0x1CF31: 84,
+ 0x1CF32: 84,
+ 0x1CF33: 84,
+ 0x1CF34: 84,
+ 0x1CF35: 84,
+ 0x1CF36: 84,
+ 0x1CF37: 84,
+ 0x1CF38: 84,
+ 0x1CF39: 84,
+ 0x1CF3A: 84,
+ 0x1CF3B: 84,
+ 0x1CF3C: 84,
+ 0x1CF3D: 84,
+ 0x1CF3E: 84,
+ 0x1CF3F: 84,
+ 0x1CF40: 84,
+ 0x1CF41: 84,
+ 0x1CF42: 84,
+ 0x1CF43: 84,
+ 0x1CF44: 84,
+ 0x1CF45: 84,
+ 0x1CF46: 84,
+ 0x1D167: 84,
+ 0x1D168: 84,
+ 0x1D169: 84,
+ 0x1D173: 84,
+ 0x1D174: 84,
+ 0x1D175: 84,
+ 0x1D176: 84,
+ 0x1D177: 84,
+ 0x1D178: 84,
+ 0x1D179: 84,
+ 0x1D17A: 84,
+ 0x1D17B: 84,
+ 0x1D17C: 84,
+ 0x1D17D: 84,
+ 0x1D17E: 84,
+ 0x1D17F: 84,
+ 0x1D180: 84,
+ 0x1D181: 84,
+ 0x1D182: 84,
+ 0x1D185: 84,
+ 0x1D186: 84,
+ 0x1D187: 84,
+ 0x1D188: 84,
+ 0x1D189: 84,
+ 0x1D18A: 84,
+ 0x1D18B: 84,
+ 0x1D1AA: 84,
+ 0x1D1AB: 84,
+ 0x1D1AC: 84,
+ 0x1D1AD: 84,
+ 0x1D242: 84,
+ 0x1D243: 84,
+ 0x1D244: 84,
+ 0x1DA00: 84,
+ 0x1DA01: 84,
+ 0x1DA02: 84,
+ 0x1DA03: 84,
+ 0x1DA04: 84,
+ 0x1DA05: 84,
+ 0x1DA06: 84,
+ 0x1DA07: 84,
+ 0x1DA08: 84,
+ 0x1DA09: 84,
+ 0x1DA0A: 84,
+ 0x1DA0B: 84,
+ 0x1DA0C: 84,
+ 0x1DA0D: 84,
+ 0x1DA0E: 84,
+ 0x1DA0F: 84,
+ 0x1DA10: 84,
+ 0x1DA11: 84,
+ 0x1DA12: 84,
+ 0x1DA13: 84,
+ 0x1DA14: 84,
+ 0x1DA15: 84,
+ 0x1DA16: 84,
+ 0x1DA17: 84,
+ 0x1DA18: 84,
+ 0x1DA19: 84,
+ 0x1DA1A: 84,
+ 0x1DA1B: 84,
+ 0x1DA1C: 84,
+ 0x1DA1D: 84,
+ 0x1DA1E: 84,
+ 0x1DA1F: 84,
+ 0x1DA20: 84,
+ 0x1DA21: 84,
+ 0x1DA22: 84,
+ 0x1DA23: 84,
+ 0x1DA24: 84,
+ 0x1DA25: 84,
+ 0x1DA26: 84,
+ 0x1DA27: 84,
+ 0x1DA28: 84,
+ 0x1DA29: 84,
+ 0x1DA2A: 84,
+ 0x1DA2B: 84,
+ 0x1DA2C: 84,
+ 0x1DA2D: 84,
+ 0x1DA2E: 84,
+ 0x1DA2F: 84,
+ 0x1DA30: 84,
+ 0x1DA31: 84,
+ 0x1DA32: 84,
+ 0x1DA33: 84,
+ 0x1DA34: 84,
+ 0x1DA35: 84,
+ 0x1DA36: 84,
+ 0x1DA3B: 84,
+ 0x1DA3C: 84,
+ 0x1DA3D: 84,
+ 0x1DA3E: 84,
+ 0x1DA3F: 84,
+ 0x1DA40: 84,
+ 0x1DA41: 84,
+ 0x1DA42: 84,
+ 0x1DA43: 84,
+ 0x1DA44: 84,
+ 0x1DA45: 84,
+ 0x1DA46: 84,
+ 0x1DA47: 84,
+ 0x1DA48: 84,
+ 0x1DA49: 84,
+ 0x1DA4A: 84,
+ 0x1DA4B: 84,
+ 0x1DA4C: 84,
+ 0x1DA4D: 84,
+ 0x1DA4E: 84,
+ 0x1DA4F: 84,
+ 0x1DA50: 84,
+ 0x1DA51: 84,
+ 0x1DA52: 84,
+ 0x1DA53: 84,
+ 0x1DA54: 84,
+ 0x1DA55: 84,
+ 0x1DA56: 84,
+ 0x1DA57: 84,
+ 0x1DA58: 84,
+ 0x1DA59: 84,
+ 0x1DA5A: 84,
+ 0x1DA5B: 84,
+ 0x1DA5C: 84,
+ 0x1DA5D: 84,
+ 0x1DA5E: 84,
+ 0x1DA5F: 84,
+ 0x1DA60: 84,
+ 0x1DA61: 84,
+ 0x1DA62: 84,
+ 0x1DA63: 84,
+ 0x1DA64: 84,
+ 0x1DA65: 84,
+ 0x1DA66: 84,
+ 0x1DA67: 84,
+ 0x1DA68: 84,
+ 0x1DA69: 84,
+ 0x1DA6A: 84,
+ 0x1DA6B: 84,
+ 0x1DA6C: 84,
+ 0x1DA75: 84,
+ 0x1DA84: 84,
+ 0x1DA9B: 84,
+ 0x1DA9C: 84,
+ 0x1DA9D: 84,
+ 0x1DA9E: 84,
+ 0x1DA9F: 84,
+ 0x1DAA1: 84,
+ 0x1DAA2: 84,
+ 0x1DAA3: 84,
+ 0x1DAA4: 84,
+ 0x1DAA5: 84,
+ 0x1DAA6: 84,
+ 0x1DAA7: 84,
+ 0x1DAA8: 84,
+ 0x1DAA9: 84,
+ 0x1DAAA: 84,
+ 0x1DAAB: 84,
+ 0x1DAAC: 84,
+ 0x1DAAD: 84,
+ 0x1DAAE: 84,
+ 0x1DAAF: 84,
+ 0x1E000: 84,
+ 0x1E001: 84,
+ 0x1E002: 84,
+ 0x1E003: 84,
+ 0x1E004: 84,
+ 0x1E005: 84,
+ 0x1E006: 84,
+ 0x1E008: 84,
+ 0x1E009: 84,
+ 0x1E00A: 84,
+ 0x1E00B: 84,
+ 0x1E00C: 84,
+ 0x1E00D: 84,
+ 0x1E00E: 84,
+ 0x1E00F: 84,
+ 0x1E010: 84,
+ 0x1E011: 84,
+ 0x1E012: 84,
+ 0x1E013: 84,
+ 0x1E014: 84,
+ 0x1E015: 84,
+ 0x1E016: 84,
+ 0x1E017: 84,
+ 0x1E018: 84,
+ 0x1E01B: 84,
+ 0x1E01C: 84,
+ 0x1E01D: 84,
+ 0x1E01E: 84,
+ 0x1E01F: 84,
+ 0x1E020: 84,
+ 0x1E021: 84,
+ 0x1E023: 84,
+ 0x1E024: 84,
+ 0x1E026: 84,
+ 0x1E027: 84,
+ 0x1E028: 84,
+ 0x1E029: 84,
+ 0x1E02A: 84,
+ 0x1E08F: 84,
+ 0x1E130: 84,
+ 0x1E131: 84,
+ 0x1E132: 84,
+ 0x1E133: 84,
+ 0x1E134: 84,
+ 0x1E135: 84,
+ 0x1E136: 84,
+ 0x1E2AE: 84,
+ 0x1E2EC: 84,
+ 0x1E2ED: 84,
+ 0x1E2EE: 84,
+ 0x1E2EF: 84,
+ 0x1E4EC: 84,
+ 0x1E4ED: 84,
+ 0x1E4EE: 84,
+ 0x1E4EF: 84,
+ 0x1E8D0: 84,
+ 0x1E8D1: 84,
+ 0x1E8D2: 84,
+ 0x1E8D3: 84,
+ 0x1E8D4: 84,
+ 0x1E8D5: 84,
+ 0x1E8D6: 84,
+ 0x1E900: 68,
+ 0x1E901: 68,
+ 0x1E902: 68,
+ 0x1E903: 68,
+ 0x1E904: 68,
+ 0x1E905: 68,
+ 0x1E906: 68,
+ 0x1E907: 68,
+ 0x1E908: 68,
+ 0x1E909: 68,
+ 0x1E90A: 68,
+ 0x1E90B: 68,
+ 0x1E90C: 68,
+ 0x1E90D: 68,
+ 0x1E90E: 68,
+ 0x1E90F: 68,
+ 0x1E910: 68,
+ 0x1E911: 68,
+ 0x1E912: 68,
+ 0x1E913: 68,
+ 0x1E914: 68,
+ 0x1E915: 68,
+ 0x1E916: 68,
+ 0x1E917: 68,
+ 0x1E918: 68,
+ 0x1E919: 68,
+ 0x1E91A: 68,
+ 0x1E91B: 68,
+ 0x1E91C: 68,
+ 0x1E91D: 68,
+ 0x1E91E: 68,
+ 0x1E91F: 68,
+ 0x1E920: 68,
+ 0x1E921: 68,
+ 0x1E922: 68,
+ 0x1E923: 68,
+ 0x1E924: 68,
+ 0x1E925: 68,
+ 0x1E926: 68,
+ 0x1E927: 68,
+ 0x1E928: 68,
+ 0x1E929: 68,
+ 0x1E92A: 68,
+ 0x1E92B: 68,
+ 0x1E92C: 68,
+ 0x1E92D: 68,
+ 0x1E92E: 68,
+ 0x1E92F: 68,
+ 0x1E930: 68,
+ 0x1E931: 68,
+ 0x1E932: 68,
+ 0x1E933: 68,
+ 0x1E934: 68,
+ 0x1E935: 68,
+ 0x1E936: 68,
+ 0x1E937: 68,
+ 0x1E938: 68,
+ 0x1E939: 68,
+ 0x1E93A: 68,
+ 0x1E93B: 68,
+ 0x1E93C: 68,
+ 0x1E93D: 68,
+ 0x1E93E: 68,
+ 0x1E93F: 68,
+ 0x1E940: 68,
+ 0x1E941: 68,
+ 0x1E942: 68,
+ 0x1E943: 68,
+ 0x1E944: 84,
+ 0x1E945: 84,
+ 0x1E946: 84,
+ 0x1E947: 84,
+ 0x1E948: 84,
+ 0x1E949: 84,
+ 0x1E94A: 84,
+ 0x1E94B: 84,
+ 0xE0001: 84,
+ 0xE0020: 84,
+ 0xE0021: 84,
+ 0xE0022: 84,
+ 0xE0023: 84,
+ 0xE0024: 84,
+ 0xE0025: 84,
+ 0xE0026: 84,
+ 0xE0027: 84,
+ 0xE0028: 84,
+ 0xE0029: 84,
+ 0xE002A: 84,
+ 0xE002B: 84,
+ 0xE002C: 84,
+ 0xE002D: 84,
+ 0xE002E: 84,
+ 0xE002F: 84,
+ 0xE0030: 84,
+ 0xE0031: 84,
+ 0xE0032: 84,
+ 0xE0033: 84,
+ 0xE0034: 84,
+ 0xE0035: 84,
+ 0xE0036: 84,
+ 0xE0037: 84,
+ 0xE0038: 84,
+ 0xE0039: 84,
+ 0xE003A: 84,
+ 0xE003B: 84,
+ 0xE003C: 84,
+ 0xE003D: 84,
+ 0xE003E: 84,
+ 0xE003F: 84,
+ 0xE0040: 84,
+ 0xE0041: 84,
+ 0xE0042: 84,
+ 0xE0043: 84,
+ 0xE0044: 84,
+ 0xE0045: 84,
+ 0xE0046: 84,
+ 0xE0047: 84,
+ 0xE0048: 84,
+ 0xE0049: 84,
+ 0xE004A: 84,
+ 0xE004B: 84,
+ 0xE004C: 84,
+ 0xE004D: 84,
+ 0xE004E: 84,
+ 0xE004F: 84,
+ 0xE0050: 84,
+ 0xE0051: 84,
+ 0xE0052: 84,
+ 0xE0053: 84,
+ 0xE0054: 84,
+ 0xE0055: 84,
+ 0xE0056: 84,
+ 0xE0057: 84,
+ 0xE0058: 84,
+ 0xE0059: 84,
+ 0xE005A: 84,
+ 0xE005B: 84,
+ 0xE005C: 84,
+ 0xE005D: 84,
+ 0xE005E: 84,
+ 0xE005F: 84,
+ 0xE0060: 84,
+ 0xE0061: 84,
+ 0xE0062: 84,
+ 0xE0063: 84,
+ 0xE0064: 84,
+ 0xE0065: 84,
+ 0xE0066: 84,
+ 0xE0067: 84,
+ 0xE0068: 84,
+ 0xE0069: 84,
+ 0xE006A: 84,
+ 0xE006B: 84,
+ 0xE006C: 84,
+ 0xE006D: 84,
+ 0xE006E: 84,
+ 0xE006F: 84,
+ 0xE0070: 84,
+ 0xE0071: 84,
+ 0xE0072: 84,
+ 0xE0073: 84,
+ 0xE0074: 84,
+ 0xE0075: 84,
+ 0xE0076: 84,
+ 0xE0077: 84,
+ 0xE0078: 84,
+ 0xE0079: 84,
+ 0xE007A: 84,
+ 0xE007B: 84,
+ 0xE007C: 84,
+ 0xE007D: 84,
+ 0xE007E: 84,
+ 0xE007F: 84,
+ 0xE0100: 84,
+ 0xE0101: 84,
+ 0xE0102: 84,
+ 0xE0103: 84,
+ 0xE0104: 84,
+ 0xE0105: 84,
+ 0xE0106: 84,
+ 0xE0107: 84,
+ 0xE0108: 84,
+ 0xE0109: 84,
+ 0xE010A: 84,
+ 0xE010B: 84,
+ 0xE010C: 84,
+ 0xE010D: 84,
+ 0xE010E: 84,
+ 0xE010F: 84,
+ 0xE0110: 84,
+ 0xE0111: 84,
+ 0xE0112: 84,
+ 0xE0113: 84,
+ 0xE0114: 84,
+ 0xE0115: 84,
+ 0xE0116: 84,
+ 0xE0117: 84,
+ 0xE0118: 84,
+ 0xE0119: 84,
+ 0xE011A: 84,
+ 0xE011B: 84,
+ 0xE011C: 84,
+ 0xE011D: 84,
+ 0xE011E: 84,
+ 0xE011F: 84,
+ 0xE0120: 84,
+ 0xE0121: 84,
+ 0xE0122: 84,
+ 0xE0123: 84,
+ 0xE0124: 84,
+ 0xE0125: 84,
+ 0xE0126: 84,
+ 0xE0127: 84,
+ 0xE0128: 84,
+ 0xE0129: 84,
+ 0xE012A: 84,
+ 0xE012B: 84,
+ 0xE012C: 84,
+ 0xE012D: 84,
+ 0xE012E: 84,
+ 0xE012F: 84,
+ 0xE0130: 84,
+ 0xE0131: 84,
+ 0xE0132: 84,
+ 0xE0133: 84,
+ 0xE0134: 84,
+ 0xE0135: 84,
+ 0xE0136: 84,
+ 0xE0137: 84,
+ 0xE0138: 84,
+ 0xE0139: 84,
+ 0xE013A: 84,
+ 0xE013B: 84,
+ 0xE013C: 84,
+ 0xE013D: 84,
+ 0xE013E: 84,
+ 0xE013F: 84,
+ 0xE0140: 84,
+ 0xE0141: 84,
+ 0xE0142: 84,
+ 0xE0143: 84,
+ 0xE0144: 84,
+ 0xE0145: 84,
+ 0xE0146: 84,
+ 0xE0147: 84,
+ 0xE0148: 84,
+ 0xE0149: 84,
+ 0xE014A: 84,
+ 0xE014B: 84,
+ 0xE014C: 84,
+ 0xE014D: 84,
+ 0xE014E: 84,
+ 0xE014F: 84,
+ 0xE0150: 84,
+ 0xE0151: 84,
+ 0xE0152: 84,
+ 0xE0153: 84,
+ 0xE0154: 84,
+ 0xE0155: 84,
+ 0xE0156: 84,
+ 0xE0157: 84,
+ 0xE0158: 84,
+ 0xE0159: 84,
+ 0xE015A: 84,
+ 0xE015B: 84,
+ 0xE015C: 84,
+ 0xE015D: 84,
+ 0xE015E: 84,
+ 0xE015F: 84,
+ 0xE0160: 84,
+ 0xE0161: 84,
+ 0xE0162: 84,
+ 0xE0163: 84,
+ 0xE0164: 84,
+ 0xE0165: 84,
+ 0xE0166: 84,
+ 0xE0167: 84,
+ 0xE0168: 84,
+ 0xE0169: 84,
+ 0xE016A: 84,
+ 0xE016B: 84,
+ 0xE016C: 84,
+ 0xE016D: 84,
+ 0xE016E: 84,
+ 0xE016F: 84,
+ 0xE0170: 84,
+ 0xE0171: 84,
+ 0xE0172: 84,
+ 0xE0173: 84,
+ 0xE0174: 84,
+ 0xE0175: 84,
+ 0xE0176: 84,
+ 0xE0177: 84,
+ 0xE0178: 84,
+ 0xE0179: 84,
+ 0xE017A: 84,
+ 0xE017B: 84,
+ 0xE017C: 84,
+ 0xE017D: 84,
+ 0xE017E: 84,
+ 0xE017F: 84,
+ 0xE0180: 84,
+ 0xE0181: 84,
+ 0xE0182: 84,
+ 0xE0183: 84,
+ 0xE0184: 84,
+ 0xE0185: 84,
+ 0xE0186: 84,
+ 0xE0187: 84,
+ 0xE0188: 84,
+ 0xE0189: 84,
+ 0xE018A: 84,
+ 0xE018B: 84,
+ 0xE018C: 84,
+ 0xE018D: 84,
+ 0xE018E: 84,
+ 0xE018F: 84,
+ 0xE0190: 84,
+ 0xE0191: 84,
+ 0xE0192: 84,
+ 0xE0193: 84,
+ 0xE0194: 84,
+ 0xE0195: 84,
+ 0xE0196: 84,
+ 0xE0197: 84,
+ 0xE0198: 84,
+ 0xE0199: 84,
+ 0xE019A: 84,
+ 0xE019B: 84,
+ 0xE019C: 84,
+ 0xE019D: 84,
+ 0xE019E: 84,
+ 0xE019F: 84,
+ 0xE01A0: 84,
+ 0xE01A1: 84,
+ 0xE01A2: 84,
+ 0xE01A3: 84,
+ 0xE01A4: 84,
+ 0xE01A5: 84,
+ 0xE01A6: 84,
+ 0xE01A7: 84,
+ 0xE01A8: 84,
+ 0xE01A9: 84,
+ 0xE01AA: 84,
+ 0xE01AB: 84,
+ 0xE01AC: 84,
+ 0xE01AD: 84,
+ 0xE01AE: 84,
+ 0xE01AF: 84,
+ 0xE01B0: 84,
+ 0xE01B1: 84,
+ 0xE01B2: 84,
+ 0xE01B3: 84,
+ 0xE01B4: 84,
+ 0xE01B5: 84,
+ 0xE01B6: 84,
+ 0xE01B7: 84,
+ 0xE01B8: 84,
+ 0xE01B9: 84,
+ 0xE01BA: 84,
+ 0xE01BB: 84,
+ 0xE01BC: 84,
+ 0xE01BD: 84,
+ 0xE01BE: 84,
+ 0xE01BF: 84,
+ 0xE01C0: 84,
+ 0xE01C1: 84,
+ 0xE01C2: 84,
+ 0xE01C3: 84,
+ 0xE01C4: 84,
+ 0xE01C5: 84,
+ 0xE01C6: 84,
+ 0xE01C7: 84,
+ 0xE01C8: 84,
+ 0xE01C9: 84,
+ 0xE01CA: 84,
+ 0xE01CB: 84,
+ 0xE01CC: 84,
+ 0xE01CD: 84,
+ 0xE01CE: 84,
+ 0xE01CF: 84,
+ 0xE01D0: 84,
+ 0xE01D1: 84,
+ 0xE01D2: 84,
+ 0xE01D3: 84,
+ 0xE01D4: 84,
+ 0xE01D5: 84,
+ 0xE01D6: 84,
+ 0xE01D7: 84,
+ 0xE01D8: 84,
+ 0xE01D9: 84,
+ 0xE01DA: 84,
+ 0xE01DB: 84,
+ 0xE01DC: 84,
+ 0xE01DD: 84,
+ 0xE01DE: 84,
+ 0xE01DF: 84,
+ 0xE01E0: 84,
+ 0xE01E1: 84,
+ 0xE01E2: 84,
+ 0xE01E3: 84,
+ 0xE01E4: 84,
+ 0xE01E5: 84,
+ 0xE01E6: 84,
+ 0xE01E7: 84,
+ 0xE01E8: 84,
+ 0xE01E9: 84,
+ 0xE01EA: 84,
+ 0xE01EB: 84,
+ 0xE01EC: 84,
+ 0xE01ED: 84,
+ 0xE01EE: 84,
+ 0xE01EF: 84,
}
codepoint_classes = {
- 'PVALID': (
- 0x2d0000002e,
- 0x300000003a,
- 0x610000007b,
- 0xdf000000f7,
- 0xf800000100,
+ "PVALID": (
+ 0x2D0000002E,
+ 0x300000003A,
+ 0x610000007B,
+ 0xDF000000F7,
+ 0xF800000100,
0x10100000102,
0x10300000104,
0x10500000106,
0x10700000108,
- 0x1090000010a,
- 0x10b0000010c,
- 0x10d0000010e,
- 0x10f00000110,
+ 0x1090000010A,
+ 0x10B0000010C,
+ 0x10D0000010E,
+ 0x10F00000110,
0x11100000112,
0x11300000114,
0x11500000116,
0x11700000118,
- 0x1190000011a,
- 0x11b0000011c,
- 0x11d0000011e,
- 0x11f00000120,
+ 0x1190000011A,
+ 0x11B0000011C,
+ 0x11D0000011E,
+ 0x11F00000120,
0x12100000122,
0x12300000124,
0x12500000126,
0x12700000128,
- 0x1290000012a,
- 0x12b0000012c,
- 0x12d0000012e,
- 0x12f00000130,
+ 0x1290000012A,
+ 0x12B0000012C,
+ 0x12D0000012E,
+ 0x12F00000130,
0x13100000132,
0x13500000136,
0x13700000139,
- 0x13a0000013b,
- 0x13c0000013d,
- 0x13e0000013f,
+ 0x13A0000013B,
+ 0x13C0000013D,
+ 0x13E0000013F,
0x14200000143,
0x14400000145,
0x14600000147,
0x14800000149,
- 0x14b0000014c,
- 0x14d0000014e,
- 0x14f00000150,
+ 0x14B0000014C,
+ 0x14D0000014E,
+ 0x14F00000150,
0x15100000152,
0x15300000154,
0x15500000156,
0x15700000158,
- 0x1590000015a,
- 0x15b0000015c,
- 0x15d0000015e,
- 0x15f00000160,
+ 0x1590000015A,
+ 0x15B0000015C,
+ 0x15D0000015E,
+ 0x15F00000160,
0x16100000162,
0x16300000164,
0x16500000166,
0x16700000168,
- 0x1690000016a,
- 0x16b0000016c,
- 0x16d0000016e,
- 0x16f00000170,
+ 0x1690000016A,
+ 0x16B0000016C,
+ 0x16D0000016E,
+ 0x16F00000170,
0x17100000172,
0x17300000174,
0x17500000176,
0x17700000178,
- 0x17a0000017b,
- 0x17c0000017d,
- 0x17e0000017f,
+ 0x17A0000017B,
+ 0x17C0000017D,
+ 0x17E0000017F,
0x18000000181,
0x18300000184,
0x18500000186,
0x18800000189,
- 0x18c0000018e,
+ 0x18C0000018E,
0x19200000193,
0x19500000196,
- 0x1990000019c,
- 0x19e0000019f,
- 0x1a1000001a2,
- 0x1a3000001a4,
- 0x1a5000001a6,
- 0x1a8000001a9,
- 0x1aa000001ac,
- 0x1ad000001ae,
- 0x1b0000001b1,
- 0x1b4000001b5,
- 0x1b6000001b7,
- 0x1b9000001bc,
- 0x1bd000001c4,
- 0x1ce000001cf,
- 0x1d0000001d1,
- 0x1d2000001d3,
- 0x1d4000001d5,
- 0x1d6000001d7,
- 0x1d8000001d9,
- 0x1da000001db,
- 0x1dc000001de,
- 0x1df000001e0,
- 0x1e1000001e2,
- 0x1e3000001e4,
- 0x1e5000001e6,
- 0x1e7000001e8,
- 0x1e9000001ea,
- 0x1eb000001ec,
- 0x1ed000001ee,
- 0x1ef000001f1,
- 0x1f5000001f6,
- 0x1f9000001fa,
- 0x1fb000001fc,
- 0x1fd000001fe,
- 0x1ff00000200,
+ 0x1990000019C,
+ 0x19E0000019F,
+ 0x1A1000001A2,
+ 0x1A3000001A4,
+ 0x1A5000001A6,
+ 0x1A8000001A9,
+ 0x1AA000001AC,
+ 0x1AD000001AE,
+ 0x1B0000001B1,
+ 0x1B4000001B5,
+ 0x1B6000001B7,
+ 0x1B9000001BC,
+ 0x1BD000001C4,
+ 0x1CE000001CF,
+ 0x1D0000001D1,
+ 0x1D2000001D3,
+ 0x1D4000001D5,
+ 0x1D6000001D7,
+ 0x1D8000001D9,
+ 0x1DA000001DB,
+ 0x1DC000001DE,
+ 0x1DF000001E0,
+ 0x1E1000001E2,
+ 0x1E3000001E4,
+ 0x1E5000001E6,
+ 0x1E7000001E8,
+ 0x1E9000001EA,
+ 0x1EB000001EC,
+ 0x1ED000001EE,
+ 0x1EF000001F1,
+ 0x1F5000001F6,
+ 0x1F9000001FA,
+ 0x1FB000001FC,
+ 0x1FD000001FE,
+ 0x1FF00000200,
0x20100000202,
0x20300000204,
0x20500000206,
0x20700000208,
- 0x2090000020a,
- 0x20b0000020c,
- 0x20d0000020e,
- 0x20f00000210,
+ 0x2090000020A,
+ 0x20B0000020C,
+ 0x20D0000020E,
+ 0x20F00000210,
0x21100000212,
0x21300000214,
0x21500000216,
0x21700000218,
- 0x2190000021a,
- 0x21b0000021c,
- 0x21d0000021e,
- 0x21f00000220,
+ 0x2190000021A,
+ 0x21B0000021C,
+ 0x21D0000021E,
+ 0x21F00000220,
0x22100000222,
0x22300000224,
0x22500000226,
0x22700000228,
- 0x2290000022a,
- 0x22b0000022c,
- 0x22d0000022e,
- 0x22f00000230,
+ 0x2290000022A,
+ 0x22B0000022C,
+ 0x22D0000022E,
+ 0x22F00000230,
0x23100000232,
- 0x2330000023a,
- 0x23c0000023d,
- 0x23f00000241,
+ 0x2330000023A,
+ 0x23C0000023D,
+ 0x23F00000241,
0x24200000243,
0x24700000248,
- 0x2490000024a,
- 0x24b0000024c,
- 0x24d0000024e,
- 0x24f000002b0,
- 0x2b9000002c2,
- 0x2c6000002d2,
- 0x2ec000002ed,
- 0x2ee000002ef,
+ 0x2490000024A,
+ 0x24B0000024C,
+ 0x24D0000024E,
+ 0x24F000002B0,
+ 0x2B9000002C2,
+ 0x2C6000002D2,
+ 0x2EC000002ED,
+ 0x2EE000002EF,
0x30000000340,
0x34200000343,
- 0x3460000034f,
+ 0x3460000034F,
0x35000000370,
0x37100000372,
0x37300000374,
0x37700000378,
- 0x37b0000037e,
+ 0x37B0000037E,
0x39000000391,
- 0x3ac000003cf,
- 0x3d7000003d8,
- 0x3d9000003da,
- 0x3db000003dc,
- 0x3dd000003de,
- 0x3df000003e0,
- 0x3e1000003e2,
- 0x3e3000003e4,
- 0x3e5000003e6,
- 0x3e7000003e8,
- 0x3e9000003ea,
- 0x3eb000003ec,
- 0x3ed000003ee,
- 0x3ef000003f0,
- 0x3f3000003f4,
- 0x3f8000003f9,
- 0x3fb000003fd,
+ 0x3AC000003CF,
+ 0x3D7000003D8,
+ 0x3D9000003DA,
+ 0x3DB000003DC,
+ 0x3DD000003DE,
+ 0x3DF000003E0,
+ 0x3E1000003E2,
+ 0x3E3000003E4,
+ 0x3E5000003E6,
+ 0x3E7000003E8,
+ 0x3E9000003EA,
+ 0x3EB000003EC,
+ 0x3ED000003EE,
+ 0x3EF000003F0,
+ 0x3F3000003F4,
+ 0x3F8000003F9,
+ 0x3FB000003FD,
0x43000000460,
0x46100000462,
0x46300000464,
0x46500000466,
0x46700000468,
- 0x4690000046a,
- 0x46b0000046c,
- 0x46d0000046e,
- 0x46f00000470,
+ 0x4690000046A,
+ 0x46B0000046C,
+ 0x46D0000046E,
+ 0x46F00000470,
0x47100000472,
0x47300000474,
0x47500000476,
0x47700000478,
- 0x4790000047a,
- 0x47b0000047c,
- 0x47d0000047e,
- 0x47f00000480,
+ 0x4790000047A,
+ 0x47B0000047C,
+ 0x47D0000047E,
+ 0x47F00000480,
0x48100000482,
0x48300000488,
- 0x48b0000048c,
- 0x48d0000048e,
- 0x48f00000490,
+ 0x48B0000048C,
+ 0x48D0000048E,
+ 0x48F00000490,
0x49100000492,
0x49300000494,
0x49500000496,
0x49700000498,
- 0x4990000049a,
- 0x49b0000049c,
- 0x49d0000049e,
- 0x49f000004a0,
- 0x4a1000004a2,
- 0x4a3000004a4,
- 0x4a5000004a6,
- 0x4a7000004a8,
- 0x4a9000004aa,
- 0x4ab000004ac,
- 0x4ad000004ae,
- 0x4af000004b0,
- 0x4b1000004b2,
- 0x4b3000004b4,
- 0x4b5000004b6,
- 0x4b7000004b8,
- 0x4b9000004ba,
- 0x4bb000004bc,
- 0x4bd000004be,
- 0x4bf000004c0,
- 0x4c2000004c3,
- 0x4c4000004c5,
- 0x4c6000004c7,
- 0x4c8000004c9,
- 0x4ca000004cb,
- 0x4cc000004cd,
- 0x4ce000004d0,
- 0x4d1000004d2,
- 0x4d3000004d4,
- 0x4d5000004d6,
- 0x4d7000004d8,
- 0x4d9000004da,
- 0x4db000004dc,
- 0x4dd000004de,
- 0x4df000004e0,
- 0x4e1000004e2,
- 0x4e3000004e4,
- 0x4e5000004e6,
- 0x4e7000004e8,
- 0x4e9000004ea,
- 0x4eb000004ec,
- 0x4ed000004ee,
- 0x4ef000004f0,
- 0x4f1000004f2,
- 0x4f3000004f4,
- 0x4f5000004f6,
- 0x4f7000004f8,
- 0x4f9000004fa,
- 0x4fb000004fc,
- 0x4fd000004fe,
- 0x4ff00000500,
+ 0x4990000049A,
+ 0x49B0000049C,
+ 0x49D0000049E,
+ 0x49F000004A0,
+ 0x4A1000004A2,
+ 0x4A3000004A4,
+ 0x4A5000004A6,
+ 0x4A7000004A8,
+ 0x4A9000004AA,
+ 0x4AB000004AC,
+ 0x4AD000004AE,
+ 0x4AF000004B0,
+ 0x4B1000004B2,
+ 0x4B3000004B4,
+ 0x4B5000004B6,
+ 0x4B7000004B8,
+ 0x4B9000004BA,
+ 0x4BB000004BC,
+ 0x4BD000004BE,
+ 0x4BF000004C0,
+ 0x4C2000004C3,
+ 0x4C4000004C5,
+ 0x4C6000004C7,
+ 0x4C8000004C9,
+ 0x4CA000004CB,
+ 0x4CC000004CD,
+ 0x4CE000004D0,
+ 0x4D1000004D2,
+ 0x4D3000004D4,
+ 0x4D5000004D6,
+ 0x4D7000004D8,
+ 0x4D9000004DA,
+ 0x4DB000004DC,
+ 0x4DD000004DE,
+ 0x4DF000004E0,
+ 0x4E1000004E2,
+ 0x4E3000004E4,
+ 0x4E5000004E6,
+ 0x4E7000004E8,
+ 0x4E9000004EA,
+ 0x4EB000004EC,
+ 0x4ED000004EE,
+ 0x4EF000004F0,
+ 0x4F1000004F2,
+ 0x4F3000004F4,
+ 0x4F5000004F6,
+ 0x4F7000004F8,
+ 0x4F9000004FA,
+ 0x4FB000004FC,
+ 0x4FD000004FE,
+ 0x4FF00000500,
0x50100000502,
0x50300000504,
0x50500000506,
0x50700000508,
- 0x5090000050a,
- 0x50b0000050c,
- 0x50d0000050e,
- 0x50f00000510,
+ 0x5090000050A,
+ 0x50B0000050C,
+ 0x50D0000050E,
+ 0x50F00000510,
0x51100000512,
0x51300000514,
0x51500000516,
0x51700000518,
- 0x5190000051a,
- 0x51b0000051c,
- 0x51d0000051e,
- 0x51f00000520,
+ 0x5190000051A,
+ 0x51B0000051C,
+ 0x51D0000051E,
+ 0x51F00000520,
0x52100000522,
0x52300000524,
0x52500000526,
0x52700000528,
- 0x5290000052a,
- 0x52b0000052c,
- 0x52d0000052e,
- 0x52f00000530,
- 0x5590000055a,
+ 0x5290000052A,
+ 0x52B0000052C,
+ 0x52D0000052E,
+ 0x52F00000530,
+ 0x5590000055A,
0x56000000587,
0x58800000589,
- 0x591000005be,
- 0x5bf000005c0,
- 0x5c1000005c3,
- 0x5c4000005c6,
- 0x5c7000005c8,
- 0x5d0000005eb,
- 0x5ef000005f3,
- 0x6100000061b,
+ 0x591000005BE,
+ 0x5BF000005C0,
+ 0x5C1000005C3,
+ 0x5C4000005C6,
+ 0x5C7000005C8,
+ 0x5D0000005EB,
+ 0x5EF000005F3,
+ 0x6100000061B,
0x62000000640,
0x64100000660,
- 0x66e00000675,
- 0x679000006d4,
- 0x6d5000006dd,
- 0x6df000006e9,
- 0x6ea000006f0,
- 0x6fa00000700,
- 0x7100000074b,
- 0x74d000007b2,
- 0x7c0000007f6,
- 0x7fd000007fe,
- 0x8000000082e,
- 0x8400000085c,
- 0x8600000086b,
- 0x8a0000008b5,
- 0x8b6000008c8,
- 0x8d3000008e2,
- 0x8e300000958,
+ 0x66E00000675,
+ 0x679000006D4,
+ 0x6D5000006DD,
+ 0x6DF000006E9,
+ 0x6EA000006F0,
+ 0x6FA00000700,
+ 0x7100000074B,
+ 0x74D000007B2,
+ 0x7C0000007F6,
+ 0x7FD000007FE,
+ 0x8000000082E,
+ 0x8400000085C,
+ 0x8600000086B,
+ 0x87000000888,
+ 0x8890000088F,
+ 0x898000008E2,
+ 0x8E300000958,
0x96000000964,
0x96600000970,
0x97100000984,
- 0x9850000098d,
- 0x98f00000991,
- 0x993000009a9,
- 0x9aa000009b1,
- 0x9b2000009b3,
- 0x9b6000009ba,
- 0x9bc000009c5,
- 0x9c7000009c9,
- 0x9cb000009cf,
- 0x9d7000009d8,
- 0x9e0000009e4,
- 0x9e6000009f2,
- 0x9fc000009fd,
- 0x9fe000009ff,
- 0xa0100000a04,
- 0xa0500000a0b,
- 0xa0f00000a11,
- 0xa1300000a29,
- 0xa2a00000a31,
- 0xa3200000a33,
- 0xa3500000a36,
- 0xa3800000a3a,
- 0xa3c00000a3d,
- 0xa3e00000a43,
- 0xa4700000a49,
- 0xa4b00000a4e,
- 0xa5100000a52,
- 0xa5c00000a5d,
- 0xa6600000a76,
- 0xa8100000a84,
- 0xa8500000a8e,
- 0xa8f00000a92,
- 0xa9300000aa9,
- 0xaaa00000ab1,
- 0xab200000ab4,
- 0xab500000aba,
- 0xabc00000ac6,
- 0xac700000aca,
- 0xacb00000ace,
- 0xad000000ad1,
- 0xae000000ae4,
- 0xae600000af0,
- 0xaf900000b00,
- 0xb0100000b04,
- 0xb0500000b0d,
- 0xb0f00000b11,
- 0xb1300000b29,
- 0xb2a00000b31,
- 0xb3200000b34,
- 0xb3500000b3a,
- 0xb3c00000b45,
- 0xb4700000b49,
- 0xb4b00000b4e,
- 0xb5500000b58,
- 0xb5f00000b64,
- 0xb6600000b70,
- 0xb7100000b72,
- 0xb8200000b84,
- 0xb8500000b8b,
- 0xb8e00000b91,
- 0xb9200000b96,
- 0xb9900000b9b,
- 0xb9c00000b9d,
- 0xb9e00000ba0,
- 0xba300000ba5,
- 0xba800000bab,
- 0xbae00000bba,
- 0xbbe00000bc3,
- 0xbc600000bc9,
- 0xbca00000bce,
- 0xbd000000bd1,
- 0xbd700000bd8,
- 0xbe600000bf0,
- 0xc0000000c0d,
- 0xc0e00000c11,
- 0xc1200000c29,
- 0xc2a00000c3a,
- 0xc3d00000c45,
- 0xc4600000c49,
- 0xc4a00000c4e,
- 0xc5500000c57,
- 0xc5800000c5b,
- 0xc6000000c64,
- 0xc6600000c70,
- 0xc8000000c84,
- 0xc8500000c8d,
- 0xc8e00000c91,
- 0xc9200000ca9,
- 0xcaa00000cb4,
- 0xcb500000cba,
- 0xcbc00000cc5,
- 0xcc600000cc9,
- 0xcca00000cce,
- 0xcd500000cd7,
- 0xcde00000cdf,
- 0xce000000ce4,
- 0xce600000cf0,
- 0xcf100000cf3,
- 0xd0000000d0d,
- 0xd0e00000d11,
- 0xd1200000d45,
- 0xd4600000d49,
- 0xd4a00000d4f,
- 0xd5400000d58,
- 0xd5f00000d64,
- 0xd6600000d70,
- 0xd7a00000d80,
- 0xd8100000d84,
- 0xd8500000d97,
- 0xd9a00000db2,
- 0xdb300000dbc,
- 0xdbd00000dbe,
- 0xdc000000dc7,
- 0xdca00000dcb,
- 0xdcf00000dd5,
- 0xdd600000dd7,
- 0xdd800000de0,
- 0xde600000df0,
- 0xdf200000df4,
- 0xe0100000e33,
- 0xe3400000e3b,
- 0xe4000000e4f,
- 0xe5000000e5a,
- 0xe8100000e83,
- 0xe8400000e85,
- 0xe8600000e8b,
- 0xe8c00000ea4,
- 0xea500000ea6,
- 0xea700000eb3,
- 0xeb400000ebe,
- 0xec000000ec5,
- 0xec600000ec7,
- 0xec800000ece,
- 0xed000000eda,
- 0xede00000ee0,
- 0xf0000000f01,
- 0xf0b00000f0c,
- 0xf1800000f1a,
- 0xf2000000f2a,
- 0xf3500000f36,
- 0xf3700000f38,
- 0xf3900000f3a,
- 0xf3e00000f43,
- 0xf4400000f48,
- 0xf4900000f4d,
- 0xf4e00000f52,
- 0xf5300000f57,
- 0xf5800000f5c,
- 0xf5d00000f69,
- 0xf6a00000f6d,
- 0xf7100000f73,
- 0xf7400000f75,
- 0xf7a00000f81,
- 0xf8200000f85,
- 0xf8600000f93,
- 0xf9400000f98,
- 0xf9900000f9d,
- 0xf9e00000fa2,
- 0xfa300000fa7,
- 0xfa800000fac,
- 0xfad00000fb9,
- 0xfba00000fbd,
- 0xfc600000fc7,
- 0x10000000104a,
- 0x10500000109e,
- 0x10d0000010fb,
- 0x10fd00001100,
+ 0x9850000098D,
+ 0x98F00000991,
+ 0x993000009A9,
+ 0x9AA000009B1,
+ 0x9B2000009B3,
+ 0x9B6000009BA,
+ 0x9BC000009C5,
+ 0x9C7000009C9,
+ 0x9CB000009CF,
+ 0x9D7000009D8,
+ 0x9E0000009E4,
+ 0x9E6000009F2,
+ 0x9FC000009FD,
+ 0x9FE000009FF,
+ 0xA0100000A04,
+ 0xA0500000A0B,
+ 0xA0F00000A11,
+ 0xA1300000A29,
+ 0xA2A00000A31,
+ 0xA3200000A33,
+ 0xA3500000A36,
+ 0xA3800000A3A,
+ 0xA3C00000A3D,
+ 0xA3E00000A43,
+ 0xA4700000A49,
+ 0xA4B00000A4E,
+ 0xA5100000A52,
+ 0xA5C00000A5D,
+ 0xA6600000A76,
+ 0xA8100000A84,
+ 0xA8500000A8E,
+ 0xA8F00000A92,
+ 0xA9300000AA9,
+ 0xAAA00000AB1,
+ 0xAB200000AB4,
+ 0xAB500000ABA,
+ 0xABC00000AC6,
+ 0xAC700000ACA,
+ 0xACB00000ACE,
+ 0xAD000000AD1,
+ 0xAE000000AE4,
+ 0xAE600000AF0,
+ 0xAF900000B00,
+ 0xB0100000B04,
+ 0xB0500000B0D,
+ 0xB0F00000B11,
+ 0xB1300000B29,
+ 0xB2A00000B31,
+ 0xB3200000B34,
+ 0xB3500000B3A,
+ 0xB3C00000B45,
+ 0xB4700000B49,
+ 0xB4B00000B4E,
+ 0xB5500000B58,
+ 0xB5F00000B64,
+ 0xB6600000B70,
+ 0xB7100000B72,
+ 0xB8200000B84,
+ 0xB8500000B8B,
+ 0xB8E00000B91,
+ 0xB9200000B96,
+ 0xB9900000B9B,
+ 0xB9C00000B9D,
+ 0xB9E00000BA0,
+ 0xBA300000BA5,
+ 0xBA800000BAB,
+ 0xBAE00000BBA,
+ 0xBBE00000BC3,
+ 0xBC600000BC9,
+ 0xBCA00000BCE,
+ 0xBD000000BD1,
+ 0xBD700000BD8,
+ 0xBE600000BF0,
+ 0xC0000000C0D,
+ 0xC0E00000C11,
+ 0xC1200000C29,
+ 0xC2A00000C3A,
+ 0xC3C00000C45,
+ 0xC4600000C49,
+ 0xC4A00000C4E,
+ 0xC5500000C57,
+ 0xC5800000C5B,
+ 0xC5D00000C5E,
+ 0xC6000000C64,
+ 0xC6600000C70,
+ 0xC8000000C84,
+ 0xC8500000C8D,
+ 0xC8E00000C91,
+ 0xC9200000CA9,
+ 0xCAA00000CB4,
+ 0xCB500000CBA,
+ 0xCBC00000CC5,
+ 0xCC600000CC9,
+ 0xCCA00000CCE,
+ 0xCD500000CD7,
+ 0xCDD00000CDF,
+ 0xCE000000CE4,
+ 0xCE600000CF0,
+ 0xCF100000CF4,
+ 0xD0000000D0D,
+ 0xD0E00000D11,
+ 0xD1200000D45,
+ 0xD4600000D49,
+ 0xD4A00000D4F,
+ 0xD5400000D58,
+ 0xD5F00000D64,
+ 0xD6600000D70,
+ 0xD7A00000D80,
+ 0xD8100000D84,
+ 0xD8500000D97,
+ 0xD9A00000DB2,
+ 0xDB300000DBC,
+ 0xDBD00000DBE,
+ 0xDC000000DC7,
+ 0xDCA00000DCB,
+ 0xDCF00000DD5,
+ 0xDD600000DD7,
+ 0xDD800000DE0,
+ 0xDE600000DF0,
+ 0xDF200000DF4,
+ 0xE0100000E33,
+ 0xE3400000E3B,
+ 0xE4000000E4F,
+ 0xE5000000E5A,
+ 0xE8100000E83,
+ 0xE8400000E85,
+ 0xE8600000E8B,
+ 0xE8C00000EA4,
+ 0xEA500000EA6,
+ 0xEA700000EB3,
+ 0xEB400000EBE,
+ 0xEC000000EC5,
+ 0xEC600000EC7,
+ 0xEC800000ECF,
+ 0xED000000EDA,
+ 0xEDE00000EE0,
+ 0xF0000000F01,
+ 0xF0B00000F0C,
+ 0xF1800000F1A,
+ 0xF2000000F2A,
+ 0xF3500000F36,
+ 0xF3700000F38,
+ 0xF3900000F3A,
+ 0xF3E00000F43,
+ 0xF4400000F48,
+ 0xF4900000F4D,
+ 0xF4E00000F52,
+ 0xF5300000F57,
+ 0xF5800000F5C,
+ 0xF5D00000F69,
+ 0xF6A00000F6D,
+ 0xF7100000F73,
+ 0xF7400000F75,
+ 0xF7A00000F81,
+ 0xF8200000F85,
+ 0xF8600000F93,
+ 0xF9400000F98,
+ 0xF9900000F9D,
+ 0xF9E00000FA2,
+ 0xFA300000FA7,
+ 0xFA800000FAC,
+ 0xFAD00000FB9,
+ 0xFBA00000FBD,
+ 0xFC600000FC7,
+ 0x10000000104A,
+ 0x10500000109E,
+ 0x10D0000010FB,
+ 0x10FD00001100,
0x120000001249,
- 0x124a0000124e,
+ 0x124A0000124E,
0x125000001257,
0x125800001259,
- 0x125a0000125e,
+ 0x125A0000125E,
0x126000001289,
- 0x128a0000128e,
- 0x1290000012b1,
- 0x12b2000012b6,
- 0x12b8000012bf,
- 0x12c0000012c1,
- 0x12c2000012c6,
- 0x12c8000012d7,
- 0x12d800001311,
+ 0x128A0000128E,
+ 0x1290000012B1,
+ 0x12B2000012B6,
+ 0x12B8000012BF,
+ 0x12C0000012C1,
+ 0x12C2000012C6,
+ 0x12C8000012D7,
+ 0x12D800001311,
0x131200001316,
- 0x13180000135b,
- 0x135d00001360,
+ 0x13180000135B,
+ 0x135D00001360,
0x138000001390,
- 0x13a0000013f6,
- 0x14010000166d,
- 0x166f00001680,
- 0x16810000169b,
- 0x16a0000016eb,
- 0x16f1000016f9,
- 0x17000000170d,
- 0x170e00001715,
- 0x172000001735,
+ 0x13A0000013F6,
+ 0x14010000166D,
+ 0x166F00001680,
+ 0x16810000169B,
+ 0x16A0000016EB,
+ 0x16F1000016F9,
+ 0x170000001716,
+ 0x171F00001735,
0x174000001754,
- 0x17600000176d,
- 0x176e00001771,
+ 0x17600000176D,
+ 0x176E00001771,
0x177200001774,
- 0x1780000017b4,
- 0x17b6000017d4,
- 0x17d7000017d8,
- 0x17dc000017de,
- 0x17e0000017ea,
- 0x18100000181a,
+ 0x1780000017B4,
+ 0x17B6000017D4,
+ 0x17D7000017D8,
+ 0x17DC000017DE,
+ 0x17E0000017EA,
+ 0x18100000181A,
0x182000001879,
- 0x1880000018ab,
- 0x18b0000018f6,
- 0x19000000191f,
- 0x19200000192c,
- 0x19300000193c,
- 0x19460000196e,
+ 0x1880000018AB,
+ 0x18B0000018F6,
+ 0x19000000191F,
+ 0x19200000192C,
+ 0x19300000193C,
+ 0x19460000196E,
0x197000001975,
- 0x1980000019ac,
- 0x19b0000019ca,
- 0x19d0000019da,
- 0x1a0000001a1c,
- 0x1a2000001a5f,
- 0x1a6000001a7d,
- 0x1a7f00001a8a,
- 0x1a9000001a9a,
- 0x1aa700001aa8,
- 0x1ab000001abe,
- 0x1abf00001ac1,
- 0x1b0000001b4c,
- 0x1b5000001b5a,
- 0x1b6b00001b74,
- 0x1b8000001bf4,
- 0x1c0000001c38,
- 0x1c4000001c4a,
- 0x1c4d00001c7e,
- 0x1cd000001cd3,
- 0x1cd400001cfb,
- 0x1d0000001d2c,
- 0x1d2f00001d30,
- 0x1d3b00001d3c,
- 0x1d4e00001d4f,
- 0x1d6b00001d78,
- 0x1d7900001d9b,
- 0x1dc000001dfa,
- 0x1dfb00001e00,
- 0x1e0100001e02,
- 0x1e0300001e04,
- 0x1e0500001e06,
- 0x1e0700001e08,
- 0x1e0900001e0a,
- 0x1e0b00001e0c,
- 0x1e0d00001e0e,
- 0x1e0f00001e10,
- 0x1e1100001e12,
- 0x1e1300001e14,
- 0x1e1500001e16,
- 0x1e1700001e18,
- 0x1e1900001e1a,
- 0x1e1b00001e1c,
- 0x1e1d00001e1e,
- 0x1e1f00001e20,
- 0x1e2100001e22,
- 0x1e2300001e24,
- 0x1e2500001e26,
- 0x1e2700001e28,
- 0x1e2900001e2a,
- 0x1e2b00001e2c,
- 0x1e2d00001e2e,
- 0x1e2f00001e30,
- 0x1e3100001e32,
- 0x1e3300001e34,
- 0x1e3500001e36,
- 0x1e3700001e38,
- 0x1e3900001e3a,
- 0x1e3b00001e3c,
- 0x1e3d00001e3e,
- 0x1e3f00001e40,
- 0x1e4100001e42,
- 0x1e4300001e44,
- 0x1e4500001e46,
- 0x1e4700001e48,
- 0x1e4900001e4a,
- 0x1e4b00001e4c,
- 0x1e4d00001e4e,
- 0x1e4f00001e50,
- 0x1e5100001e52,
- 0x1e5300001e54,
- 0x1e5500001e56,
- 0x1e5700001e58,
- 0x1e5900001e5a,
- 0x1e5b00001e5c,
- 0x1e5d00001e5e,
- 0x1e5f00001e60,
- 0x1e6100001e62,
- 0x1e6300001e64,
- 0x1e6500001e66,
- 0x1e6700001e68,
- 0x1e6900001e6a,
- 0x1e6b00001e6c,
- 0x1e6d00001e6e,
- 0x1e6f00001e70,
- 0x1e7100001e72,
- 0x1e7300001e74,
- 0x1e7500001e76,
- 0x1e7700001e78,
- 0x1e7900001e7a,
- 0x1e7b00001e7c,
- 0x1e7d00001e7e,
- 0x1e7f00001e80,
- 0x1e8100001e82,
- 0x1e8300001e84,
- 0x1e8500001e86,
- 0x1e8700001e88,
- 0x1e8900001e8a,
- 0x1e8b00001e8c,
- 0x1e8d00001e8e,
- 0x1e8f00001e90,
- 0x1e9100001e92,
- 0x1e9300001e94,
- 0x1e9500001e9a,
- 0x1e9c00001e9e,
- 0x1e9f00001ea0,
- 0x1ea100001ea2,
- 0x1ea300001ea4,
- 0x1ea500001ea6,
- 0x1ea700001ea8,
- 0x1ea900001eaa,
- 0x1eab00001eac,
- 0x1ead00001eae,
- 0x1eaf00001eb0,
- 0x1eb100001eb2,
- 0x1eb300001eb4,
- 0x1eb500001eb6,
- 0x1eb700001eb8,
- 0x1eb900001eba,
- 0x1ebb00001ebc,
- 0x1ebd00001ebe,
- 0x1ebf00001ec0,
- 0x1ec100001ec2,
- 0x1ec300001ec4,
- 0x1ec500001ec6,
- 0x1ec700001ec8,
- 0x1ec900001eca,
- 0x1ecb00001ecc,
- 0x1ecd00001ece,
- 0x1ecf00001ed0,
- 0x1ed100001ed2,
- 0x1ed300001ed4,
- 0x1ed500001ed6,
- 0x1ed700001ed8,
- 0x1ed900001eda,
- 0x1edb00001edc,
- 0x1edd00001ede,
- 0x1edf00001ee0,
- 0x1ee100001ee2,
- 0x1ee300001ee4,
- 0x1ee500001ee6,
- 0x1ee700001ee8,
- 0x1ee900001eea,
- 0x1eeb00001eec,
- 0x1eed00001eee,
- 0x1eef00001ef0,
- 0x1ef100001ef2,
- 0x1ef300001ef4,
- 0x1ef500001ef6,
- 0x1ef700001ef8,
- 0x1ef900001efa,
- 0x1efb00001efc,
- 0x1efd00001efe,
- 0x1eff00001f08,
- 0x1f1000001f16,
- 0x1f2000001f28,
- 0x1f3000001f38,
- 0x1f4000001f46,
- 0x1f5000001f58,
- 0x1f6000001f68,
- 0x1f7000001f71,
- 0x1f7200001f73,
- 0x1f7400001f75,
- 0x1f7600001f77,
- 0x1f7800001f79,
- 0x1f7a00001f7b,
- 0x1f7c00001f7d,
- 0x1fb000001fb2,
- 0x1fb600001fb7,
- 0x1fc600001fc7,
- 0x1fd000001fd3,
- 0x1fd600001fd8,
- 0x1fe000001fe3,
- 0x1fe400001fe8,
- 0x1ff600001ff7,
- 0x214e0000214f,
+ 0x1980000019AC,
+ 0x19B0000019CA,
+ 0x19D0000019DA,
+ 0x1A0000001A1C,
+ 0x1A2000001A5F,
+ 0x1A6000001A7D,
+ 0x1A7F00001A8A,
+ 0x1A9000001A9A,
+ 0x1AA700001AA8,
+ 0x1AB000001ABE,
+ 0x1ABF00001ACF,
+ 0x1B0000001B4D,
+ 0x1B5000001B5A,
+ 0x1B6B00001B74,
+ 0x1B8000001BF4,
+ 0x1C0000001C38,
+ 0x1C4000001C4A,
+ 0x1C4D00001C7E,
+ 0x1CD000001CD3,
+ 0x1CD400001CFB,
+ 0x1D0000001D2C,
+ 0x1D2F00001D30,
+ 0x1D3B00001D3C,
+ 0x1D4E00001D4F,
+ 0x1D6B00001D78,
+ 0x1D7900001D9B,
+ 0x1DC000001E00,
+ 0x1E0100001E02,
+ 0x1E0300001E04,
+ 0x1E0500001E06,
+ 0x1E0700001E08,
+ 0x1E0900001E0A,
+ 0x1E0B00001E0C,
+ 0x1E0D00001E0E,
+ 0x1E0F00001E10,
+ 0x1E1100001E12,
+ 0x1E1300001E14,
+ 0x1E1500001E16,
+ 0x1E1700001E18,
+ 0x1E1900001E1A,
+ 0x1E1B00001E1C,
+ 0x1E1D00001E1E,
+ 0x1E1F00001E20,
+ 0x1E2100001E22,
+ 0x1E2300001E24,
+ 0x1E2500001E26,
+ 0x1E2700001E28,
+ 0x1E2900001E2A,
+ 0x1E2B00001E2C,
+ 0x1E2D00001E2E,
+ 0x1E2F00001E30,
+ 0x1E3100001E32,
+ 0x1E3300001E34,
+ 0x1E3500001E36,
+ 0x1E3700001E38,
+ 0x1E3900001E3A,
+ 0x1E3B00001E3C,
+ 0x1E3D00001E3E,
+ 0x1E3F00001E40,
+ 0x1E4100001E42,
+ 0x1E4300001E44,
+ 0x1E4500001E46,
+ 0x1E4700001E48,
+ 0x1E4900001E4A,
+ 0x1E4B00001E4C,
+ 0x1E4D00001E4E,
+ 0x1E4F00001E50,
+ 0x1E5100001E52,
+ 0x1E5300001E54,
+ 0x1E5500001E56,
+ 0x1E5700001E58,
+ 0x1E5900001E5A,
+ 0x1E5B00001E5C,
+ 0x1E5D00001E5E,
+ 0x1E5F00001E60,
+ 0x1E6100001E62,
+ 0x1E6300001E64,
+ 0x1E6500001E66,
+ 0x1E6700001E68,
+ 0x1E6900001E6A,
+ 0x1E6B00001E6C,
+ 0x1E6D00001E6E,
+ 0x1E6F00001E70,
+ 0x1E7100001E72,
+ 0x1E7300001E74,
+ 0x1E7500001E76,
+ 0x1E7700001E78,
+ 0x1E7900001E7A,
+ 0x1E7B00001E7C,
+ 0x1E7D00001E7E,
+ 0x1E7F00001E80,
+ 0x1E8100001E82,
+ 0x1E8300001E84,
+ 0x1E8500001E86,
+ 0x1E8700001E88,
+ 0x1E8900001E8A,
+ 0x1E8B00001E8C,
+ 0x1E8D00001E8E,
+ 0x1E8F00001E90,
+ 0x1E9100001E92,
+ 0x1E9300001E94,
+ 0x1E9500001E9A,
+ 0x1E9C00001E9E,
+ 0x1E9F00001EA0,
+ 0x1EA100001EA2,
+ 0x1EA300001EA4,
+ 0x1EA500001EA6,
+ 0x1EA700001EA8,
+ 0x1EA900001EAA,
+ 0x1EAB00001EAC,
+ 0x1EAD00001EAE,
+ 0x1EAF00001EB0,
+ 0x1EB100001EB2,
+ 0x1EB300001EB4,
+ 0x1EB500001EB6,
+ 0x1EB700001EB8,
+ 0x1EB900001EBA,
+ 0x1EBB00001EBC,
+ 0x1EBD00001EBE,
+ 0x1EBF00001EC0,
+ 0x1EC100001EC2,
+ 0x1EC300001EC4,
+ 0x1EC500001EC6,
+ 0x1EC700001EC8,
+ 0x1EC900001ECA,
+ 0x1ECB00001ECC,
+ 0x1ECD00001ECE,
+ 0x1ECF00001ED0,
+ 0x1ED100001ED2,
+ 0x1ED300001ED4,
+ 0x1ED500001ED6,
+ 0x1ED700001ED8,
+ 0x1ED900001EDA,
+ 0x1EDB00001EDC,
+ 0x1EDD00001EDE,
+ 0x1EDF00001EE0,
+ 0x1EE100001EE2,
+ 0x1EE300001EE4,
+ 0x1EE500001EE6,
+ 0x1EE700001EE8,
+ 0x1EE900001EEA,
+ 0x1EEB00001EEC,
+ 0x1EED00001EEE,
+ 0x1EEF00001EF0,
+ 0x1EF100001EF2,
+ 0x1EF300001EF4,
+ 0x1EF500001EF6,
+ 0x1EF700001EF8,
+ 0x1EF900001EFA,
+ 0x1EFB00001EFC,
+ 0x1EFD00001EFE,
+ 0x1EFF00001F08,
+ 0x1F1000001F16,
+ 0x1F2000001F28,
+ 0x1F3000001F38,
+ 0x1F4000001F46,
+ 0x1F5000001F58,
+ 0x1F6000001F68,
+ 0x1F7000001F71,
+ 0x1F7200001F73,
+ 0x1F7400001F75,
+ 0x1F7600001F77,
+ 0x1F7800001F79,
+ 0x1F7A00001F7B,
+ 0x1F7C00001F7D,
+ 0x1FB000001FB2,
+ 0x1FB600001FB7,
+ 0x1FC600001FC7,
+ 0x1FD000001FD3,
+ 0x1FD600001FD8,
+ 0x1FE000001FE3,
+ 0x1FE400001FE8,
+ 0x1FF600001FF7,
+ 0x214E0000214F,
0x218400002185,
- 0x2c3000002c5f,
- 0x2c6100002c62,
- 0x2c6500002c67,
- 0x2c6800002c69,
- 0x2c6a00002c6b,
- 0x2c6c00002c6d,
- 0x2c7100002c72,
- 0x2c7300002c75,
- 0x2c7600002c7c,
- 0x2c8100002c82,
- 0x2c8300002c84,
- 0x2c8500002c86,
- 0x2c8700002c88,
- 0x2c8900002c8a,
- 0x2c8b00002c8c,
- 0x2c8d00002c8e,
- 0x2c8f00002c90,
- 0x2c9100002c92,
- 0x2c9300002c94,
- 0x2c9500002c96,
- 0x2c9700002c98,
- 0x2c9900002c9a,
- 0x2c9b00002c9c,
- 0x2c9d00002c9e,
- 0x2c9f00002ca0,
- 0x2ca100002ca2,
- 0x2ca300002ca4,
- 0x2ca500002ca6,
- 0x2ca700002ca8,
- 0x2ca900002caa,
- 0x2cab00002cac,
- 0x2cad00002cae,
- 0x2caf00002cb0,
- 0x2cb100002cb2,
- 0x2cb300002cb4,
- 0x2cb500002cb6,
- 0x2cb700002cb8,
- 0x2cb900002cba,
- 0x2cbb00002cbc,
- 0x2cbd00002cbe,
- 0x2cbf00002cc0,
- 0x2cc100002cc2,
- 0x2cc300002cc4,
- 0x2cc500002cc6,
- 0x2cc700002cc8,
- 0x2cc900002cca,
- 0x2ccb00002ccc,
- 0x2ccd00002cce,
- 0x2ccf00002cd0,
- 0x2cd100002cd2,
- 0x2cd300002cd4,
- 0x2cd500002cd6,
- 0x2cd700002cd8,
- 0x2cd900002cda,
- 0x2cdb00002cdc,
- 0x2cdd00002cde,
- 0x2cdf00002ce0,
- 0x2ce100002ce2,
- 0x2ce300002ce5,
- 0x2cec00002ced,
- 0x2cee00002cf2,
- 0x2cf300002cf4,
- 0x2d0000002d26,
- 0x2d2700002d28,
- 0x2d2d00002d2e,
- 0x2d3000002d68,
- 0x2d7f00002d97,
- 0x2da000002da7,
- 0x2da800002daf,
- 0x2db000002db7,
- 0x2db800002dbf,
- 0x2dc000002dc7,
- 0x2dc800002dcf,
- 0x2dd000002dd7,
- 0x2dd800002ddf,
- 0x2de000002e00,
- 0x2e2f00002e30,
+ 0x2C3000002C60,
+ 0x2C6100002C62,
+ 0x2C6500002C67,
+ 0x2C6800002C69,
+ 0x2C6A00002C6B,
+ 0x2C6C00002C6D,
+ 0x2C7100002C72,
+ 0x2C7300002C75,
+ 0x2C7600002C7C,
+ 0x2C8100002C82,
+ 0x2C8300002C84,
+ 0x2C8500002C86,
+ 0x2C8700002C88,
+ 0x2C8900002C8A,
+ 0x2C8B00002C8C,
+ 0x2C8D00002C8E,
+ 0x2C8F00002C90,
+ 0x2C9100002C92,
+ 0x2C9300002C94,
+ 0x2C9500002C96,
+ 0x2C9700002C98,
+ 0x2C9900002C9A,
+ 0x2C9B00002C9C,
+ 0x2C9D00002C9E,
+ 0x2C9F00002CA0,
+ 0x2CA100002CA2,
+ 0x2CA300002CA4,
+ 0x2CA500002CA6,
+ 0x2CA700002CA8,
+ 0x2CA900002CAA,
+ 0x2CAB00002CAC,
+ 0x2CAD00002CAE,
+ 0x2CAF00002CB0,
+ 0x2CB100002CB2,
+ 0x2CB300002CB4,
+ 0x2CB500002CB6,
+ 0x2CB700002CB8,
+ 0x2CB900002CBA,
+ 0x2CBB00002CBC,
+ 0x2CBD00002CBE,
+ 0x2CBF00002CC0,
+ 0x2CC100002CC2,
+ 0x2CC300002CC4,
+ 0x2CC500002CC6,
+ 0x2CC700002CC8,
+ 0x2CC900002CCA,
+ 0x2CCB00002CCC,
+ 0x2CCD00002CCE,
+ 0x2CCF00002CD0,
+ 0x2CD100002CD2,
+ 0x2CD300002CD4,
+ 0x2CD500002CD6,
+ 0x2CD700002CD8,
+ 0x2CD900002CDA,
+ 0x2CDB00002CDC,
+ 0x2CDD00002CDE,
+ 0x2CDF00002CE0,
+ 0x2CE100002CE2,
+ 0x2CE300002CE5,
+ 0x2CEC00002CED,
+ 0x2CEE00002CF2,
+ 0x2CF300002CF4,
+ 0x2D0000002D26,
+ 0x2D2700002D28,
+ 0x2D2D00002D2E,
+ 0x2D3000002D68,
+ 0x2D7F00002D97,
+ 0x2DA000002DA7,
+ 0x2DA800002DAF,
+ 0x2DB000002DB7,
+ 0x2DB800002DBF,
+ 0x2DC000002DC7,
+ 0x2DC800002DCF,
+ 0x2DD000002DD7,
+ 0x2DD800002DDF,
+ 0x2DE000002E00,
+ 0x2E2F00002E30,
0x300500003008,
- 0x302a0000302e,
- 0x303c0000303d,
+ 0x302A0000302E,
+ 0x303C0000303D,
0x304100003097,
- 0x30990000309b,
- 0x309d0000309f,
- 0x30a1000030fb,
- 0x30fc000030ff,
+ 0x30990000309B,
+ 0x309D0000309F,
+ 0x30A1000030FB,
+ 0x30FC000030FF,
0x310500003130,
- 0x31a0000031c0,
- 0x31f000003200,
- 0x340000004dc0,
- 0x4e0000009ffd,
- 0xa0000000a48d,
- 0xa4d00000a4fe,
- 0xa5000000a60d,
- 0xa6100000a62c,
- 0xa6410000a642,
- 0xa6430000a644,
- 0xa6450000a646,
- 0xa6470000a648,
- 0xa6490000a64a,
- 0xa64b0000a64c,
- 0xa64d0000a64e,
- 0xa64f0000a650,
- 0xa6510000a652,
- 0xa6530000a654,
- 0xa6550000a656,
- 0xa6570000a658,
- 0xa6590000a65a,
- 0xa65b0000a65c,
- 0xa65d0000a65e,
- 0xa65f0000a660,
- 0xa6610000a662,
- 0xa6630000a664,
- 0xa6650000a666,
- 0xa6670000a668,
- 0xa6690000a66a,
- 0xa66b0000a66c,
- 0xa66d0000a670,
- 0xa6740000a67e,
- 0xa67f0000a680,
- 0xa6810000a682,
- 0xa6830000a684,
- 0xa6850000a686,
- 0xa6870000a688,
- 0xa6890000a68a,
- 0xa68b0000a68c,
- 0xa68d0000a68e,
- 0xa68f0000a690,
- 0xa6910000a692,
- 0xa6930000a694,
- 0xa6950000a696,
- 0xa6970000a698,
- 0xa6990000a69a,
- 0xa69b0000a69c,
- 0xa69e0000a6e6,
- 0xa6f00000a6f2,
- 0xa7170000a720,
- 0xa7230000a724,
- 0xa7250000a726,
- 0xa7270000a728,
- 0xa7290000a72a,
- 0xa72b0000a72c,
- 0xa72d0000a72e,
- 0xa72f0000a732,
- 0xa7330000a734,
- 0xa7350000a736,
- 0xa7370000a738,
- 0xa7390000a73a,
- 0xa73b0000a73c,
- 0xa73d0000a73e,
- 0xa73f0000a740,
- 0xa7410000a742,
- 0xa7430000a744,
- 0xa7450000a746,
- 0xa7470000a748,
- 0xa7490000a74a,
- 0xa74b0000a74c,
- 0xa74d0000a74e,
- 0xa74f0000a750,
- 0xa7510000a752,
- 0xa7530000a754,
- 0xa7550000a756,
- 0xa7570000a758,
- 0xa7590000a75a,
- 0xa75b0000a75c,
- 0xa75d0000a75e,
- 0xa75f0000a760,
- 0xa7610000a762,
- 0xa7630000a764,
- 0xa7650000a766,
- 0xa7670000a768,
- 0xa7690000a76a,
- 0xa76b0000a76c,
- 0xa76d0000a76e,
- 0xa76f0000a770,
- 0xa7710000a779,
- 0xa77a0000a77b,
- 0xa77c0000a77d,
- 0xa77f0000a780,
- 0xa7810000a782,
- 0xa7830000a784,
- 0xa7850000a786,
- 0xa7870000a789,
- 0xa78c0000a78d,
- 0xa78e0000a790,
- 0xa7910000a792,
- 0xa7930000a796,
- 0xa7970000a798,
- 0xa7990000a79a,
- 0xa79b0000a79c,
- 0xa79d0000a79e,
- 0xa79f0000a7a0,
- 0xa7a10000a7a2,
- 0xa7a30000a7a4,
- 0xa7a50000a7a6,
- 0xa7a70000a7a8,
- 0xa7a90000a7aa,
- 0xa7af0000a7b0,
- 0xa7b50000a7b6,
- 0xa7b70000a7b8,
- 0xa7b90000a7ba,
- 0xa7bb0000a7bc,
- 0xa7bd0000a7be,
- 0xa7bf0000a7c0,
- 0xa7c30000a7c4,
- 0xa7c80000a7c9,
- 0xa7ca0000a7cb,
- 0xa7f60000a7f8,
- 0xa7fa0000a828,
- 0xa82c0000a82d,
- 0xa8400000a874,
- 0xa8800000a8c6,
- 0xa8d00000a8da,
- 0xa8e00000a8f8,
- 0xa8fb0000a8fc,
- 0xa8fd0000a92e,
- 0xa9300000a954,
- 0xa9800000a9c1,
- 0xa9cf0000a9da,
- 0xa9e00000a9ff,
- 0xaa000000aa37,
- 0xaa400000aa4e,
- 0xaa500000aa5a,
- 0xaa600000aa77,
- 0xaa7a0000aac3,
- 0xaadb0000aade,
- 0xaae00000aaf0,
- 0xaaf20000aaf7,
- 0xab010000ab07,
- 0xab090000ab0f,
- 0xab110000ab17,
- 0xab200000ab27,
- 0xab280000ab2f,
- 0xab300000ab5b,
- 0xab600000ab6a,
- 0xabc00000abeb,
- 0xabec0000abee,
- 0xabf00000abfa,
- 0xac000000d7a4,
- 0xfa0e0000fa10,
- 0xfa110000fa12,
- 0xfa130000fa15,
- 0xfa1f0000fa20,
- 0xfa210000fa22,
- 0xfa230000fa25,
- 0xfa270000fa2a,
- 0xfb1e0000fb1f,
- 0xfe200000fe30,
- 0xfe730000fe74,
- 0x100000001000c,
- 0x1000d00010027,
- 0x100280001003b,
- 0x1003c0001003e,
- 0x1003f0001004e,
- 0x100500001005e,
- 0x10080000100fb,
- 0x101fd000101fe,
- 0x102800001029d,
- 0x102a0000102d1,
- 0x102e0000102e1,
+ 0x31A0000031C0,
+ 0x31F000003200,
+ 0x340000004DC0,
+ 0x4E000000A48D,
+ 0xA4D00000A4FE,
+ 0xA5000000A60D,
+ 0xA6100000A62C,
+ 0xA6410000A642,
+ 0xA6430000A644,
+ 0xA6450000A646,
+ 0xA6470000A648,
+ 0xA6490000A64A,
+ 0xA64B0000A64C,
+ 0xA64D0000A64E,
+ 0xA64F0000A650,
+ 0xA6510000A652,
+ 0xA6530000A654,
+ 0xA6550000A656,
+ 0xA6570000A658,
+ 0xA6590000A65A,
+ 0xA65B0000A65C,
+ 0xA65D0000A65E,
+ 0xA65F0000A660,
+ 0xA6610000A662,
+ 0xA6630000A664,
+ 0xA6650000A666,
+ 0xA6670000A668,
+ 0xA6690000A66A,
+ 0xA66B0000A66C,
+ 0xA66D0000A670,
+ 0xA6740000A67E,
+ 0xA67F0000A680,
+ 0xA6810000A682,
+ 0xA6830000A684,
+ 0xA6850000A686,
+ 0xA6870000A688,
+ 0xA6890000A68A,
+ 0xA68B0000A68C,
+ 0xA68D0000A68E,
+ 0xA68F0000A690,
+ 0xA6910000A692,
+ 0xA6930000A694,
+ 0xA6950000A696,
+ 0xA6970000A698,
+ 0xA6990000A69A,
+ 0xA69B0000A69C,
+ 0xA69E0000A6E6,
+ 0xA6F00000A6F2,
+ 0xA7170000A720,
+ 0xA7230000A724,
+ 0xA7250000A726,
+ 0xA7270000A728,
+ 0xA7290000A72A,
+ 0xA72B0000A72C,
+ 0xA72D0000A72E,
+ 0xA72F0000A732,
+ 0xA7330000A734,
+ 0xA7350000A736,
+ 0xA7370000A738,
+ 0xA7390000A73A,
+ 0xA73B0000A73C,
+ 0xA73D0000A73E,
+ 0xA73F0000A740,
+ 0xA7410000A742,
+ 0xA7430000A744,
+ 0xA7450000A746,
+ 0xA7470000A748,
+ 0xA7490000A74A,
+ 0xA74B0000A74C,
+ 0xA74D0000A74E,
+ 0xA74F0000A750,
+ 0xA7510000A752,
+ 0xA7530000A754,
+ 0xA7550000A756,
+ 0xA7570000A758,
+ 0xA7590000A75A,
+ 0xA75B0000A75C,
+ 0xA75D0000A75E,
+ 0xA75F0000A760,
+ 0xA7610000A762,
+ 0xA7630000A764,
+ 0xA7650000A766,
+ 0xA7670000A768,
+ 0xA7690000A76A,
+ 0xA76B0000A76C,
+ 0xA76D0000A76E,
+ 0xA76F0000A770,
+ 0xA7710000A779,
+ 0xA77A0000A77B,
+ 0xA77C0000A77D,
+ 0xA77F0000A780,
+ 0xA7810000A782,
+ 0xA7830000A784,
+ 0xA7850000A786,
+ 0xA7870000A789,
+ 0xA78C0000A78D,
+ 0xA78E0000A790,
+ 0xA7910000A792,
+ 0xA7930000A796,
+ 0xA7970000A798,
+ 0xA7990000A79A,
+ 0xA79B0000A79C,
+ 0xA79D0000A79E,
+ 0xA79F0000A7A0,
+ 0xA7A10000A7A2,
+ 0xA7A30000A7A4,
+ 0xA7A50000A7A6,
+ 0xA7A70000A7A8,
+ 0xA7A90000A7AA,
+ 0xA7AF0000A7B0,
+ 0xA7B50000A7B6,
+ 0xA7B70000A7B8,
+ 0xA7B90000A7BA,
+ 0xA7BB0000A7BC,
+ 0xA7BD0000A7BE,
+ 0xA7BF0000A7C0,
+ 0xA7C10000A7C2,
+ 0xA7C30000A7C4,
+ 0xA7C80000A7C9,
+ 0xA7CA0000A7CB,
+ 0xA7D10000A7D2,
+ 0xA7D30000A7D4,
+ 0xA7D50000A7D6,
+ 0xA7D70000A7D8,
+ 0xA7D90000A7DA,
+ 0xA7F60000A7F8,
+ 0xA7FA0000A828,
+ 0xA82C0000A82D,
+ 0xA8400000A874,
+ 0xA8800000A8C6,
+ 0xA8D00000A8DA,
+ 0xA8E00000A8F8,
+ 0xA8FB0000A8FC,
+ 0xA8FD0000A92E,
+ 0xA9300000A954,
+ 0xA9800000A9C1,
+ 0xA9CF0000A9DA,
+ 0xA9E00000A9FF,
+ 0xAA000000AA37,
+ 0xAA400000AA4E,
+ 0xAA500000AA5A,
+ 0xAA600000AA77,
+ 0xAA7A0000AAC3,
+ 0xAADB0000AADE,
+ 0xAAE00000AAF0,
+ 0xAAF20000AAF7,
+ 0xAB010000AB07,
+ 0xAB090000AB0F,
+ 0xAB110000AB17,
+ 0xAB200000AB27,
+ 0xAB280000AB2F,
+ 0xAB300000AB5B,
+ 0xAB600000AB69,
+ 0xABC00000ABEB,
+ 0xABEC0000ABEE,
+ 0xABF00000ABFA,
+ 0xAC000000D7A4,
+ 0xFA0E0000FA10,
+ 0xFA110000FA12,
+ 0xFA130000FA15,
+ 0xFA1F0000FA20,
+ 0xFA210000FA22,
+ 0xFA230000FA25,
+ 0xFA270000FA2A,
+ 0xFB1E0000FB1F,
+ 0xFE200000FE30,
+ 0xFE730000FE74,
+ 0x100000001000C,
+ 0x1000D00010027,
+ 0x100280001003B,
+ 0x1003C0001003E,
+ 0x1003F0001004E,
+ 0x100500001005E,
+ 0x10080000100FB,
+ 0x101FD000101FE,
+ 0x102800001029D,
+ 0x102A0000102D1,
+ 0x102E0000102E1,
0x1030000010320,
- 0x1032d00010341,
- 0x103420001034a,
- 0x103500001037b,
- 0x103800001039e,
- 0x103a0000103c4,
- 0x103c8000103d0,
- 0x104280001049e,
- 0x104a0000104aa,
- 0x104d8000104fc,
+ 0x1032D00010341,
+ 0x103420001034A,
+ 0x103500001037B,
+ 0x103800001039E,
+ 0x103A0000103C4,
+ 0x103C8000103D0,
+ 0x104280001049E,
+ 0x104A0000104AA,
+ 0x104D8000104FC,
0x1050000010528,
0x1053000010564,
+ 0x10597000105A2,
+ 0x105A3000105B2,
+ 0x105B3000105BA,
+ 0x105BB000105BD,
0x1060000010737,
0x1074000010756,
0x1076000010768,
+ 0x1078000010781,
0x1080000010806,
0x1080800010809,
- 0x1080a00010836,
+ 0x1080A00010836,
0x1083700010839,
- 0x1083c0001083d,
- 0x1083f00010856,
+ 0x1083C0001083D,
+ 0x1083F00010856,
0x1086000010877,
- 0x108800001089f,
- 0x108e0000108f3,
- 0x108f4000108f6,
+ 0x108800001089F,
+ 0x108E0000108F3,
+ 0x108F4000108F6,
0x1090000010916,
- 0x109200001093a,
- 0x10980000109b8,
- 0x109be000109c0,
- 0x10a0000010a04,
- 0x10a0500010a07,
- 0x10a0c00010a14,
- 0x10a1500010a18,
- 0x10a1900010a36,
- 0x10a3800010a3b,
- 0x10a3f00010a40,
- 0x10a6000010a7d,
- 0x10a8000010a9d,
- 0x10ac000010ac8,
- 0x10ac900010ae7,
- 0x10b0000010b36,
- 0x10b4000010b56,
- 0x10b6000010b73,
- 0x10b8000010b92,
- 0x10c0000010c49,
- 0x10cc000010cf3,
- 0x10d0000010d28,
- 0x10d3000010d3a,
- 0x10e8000010eaa,
- 0x10eab00010ead,
- 0x10eb000010eb2,
- 0x10f0000010f1d,
- 0x10f2700010f28,
- 0x10f3000010f51,
- 0x10fb000010fc5,
- 0x10fe000010ff7,
+ 0x109200001093A,
+ 0x10980000109B8,
+ 0x109BE000109C0,
+ 0x10A0000010A04,
+ 0x10A0500010A07,
+ 0x10A0C00010A14,
+ 0x10A1500010A18,
+ 0x10A1900010A36,
+ 0x10A3800010A3B,
+ 0x10A3F00010A40,
+ 0x10A6000010A7D,
+ 0x10A8000010A9D,
+ 0x10AC000010AC8,
+ 0x10AC900010AE7,
+ 0x10B0000010B36,
+ 0x10B4000010B56,
+ 0x10B6000010B73,
+ 0x10B8000010B92,
+ 0x10C0000010C49,
+ 0x10CC000010CF3,
+ 0x10D0000010D28,
+ 0x10D3000010D3A,
+ 0x10E8000010EAA,
+ 0x10EAB00010EAD,
+ 0x10EB000010EB2,
+ 0x10EFD00010F1D,
+ 0x10F2700010F28,
+ 0x10F3000010F51,
+ 0x10F7000010F86,
+ 0x10FB000010FC5,
+ 0x10FE000010FF7,
0x1100000011047,
- 0x1106600011070,
- 0x1107f000110bb,
- 0x110d0000110e9,
- 0x110f0000110fa,
+ 0x1106600011076,
+ 0x1107F000110BB,
+ 0x110C2000110C3,
+ 0x110D0000110E9,
+ 0x110F0000110FA,
0x1110000011135,
0x1113600011140,
0x1114400011148,
0x1115000011174,
0x1117600011177,
- 0x11180000111c5,
- 0x111c9000111cd,
- 0x111ce000111db,
- 0x111dc000111dd,
+ 0x11180000111C5,
+ 0x111C9000111CD,
+ 0x111CE000111DB,
+ 0x111DC000111DD,
0x1120000011212,
0x1121300011238,
- 0x1123e0001123f,
+ 0x1123E00011242,
0x1128000011287,
0x1128800011289,
- 0x1128a0001128e,
- 0x1128f0001129e,
- 0x1129f000112a9,
- 0x112b0000112eb,
- 0x112f0000112fa,
+ 0x1128A0001128E,
+ 0x1128F0001129E,
+ 0x1129F000112A9,
+ 0x112B0000112EB,
+ 0x112F0000112FA,
0x1130000011304,
- 0x113050001130d,
- 0x1130f00011311,
+ 0x113050001130D,
+ 0x1130F00011311,
0x1131300011329,
- 0x1132a00011331,
+ 0x1132A00011331,
0x1133200011334,
- 0x113350001133a,
- 0x1133b00011345,
+ 0x113350001133A,
+ 0x1133B00011345,
0x1134700011349,
- 0x1134b0001134e,
+ 0x1134B0001134E,
0x1135000011351,
0x1135700011358,
- 0x1135d00011364,
- 0x113660001136d,
+ 0x1135D00011364,
+ 0x113660001136D,
0x1137000011375,
- 0x114000001144b,
- 0x114500001145a,
- 0x1145e00011462,
- 0x11480000114c6,
- 0x114c7000114c8,
- 0x114d0000114da,
- 0x11580000115b6,
- 0x115b8000115c1,
- 0x115d8000115de,
+ 0x114000001144B,
+ 0x114500001145A,
+ 0x1145E00011462,
+ 0x11480000114C6,
+ 0x114C7000114C8,
+ 0x114D0000114DA,
+ 0x11580000115B6,
+ 0x115B8000115C1,
+ 0x115D8000115DE,
0x1160000011641,
0x1164400011645,
- 0x116500001165a,
- 0x11680000116b9,
- 0x116c0000116ca,
- 0x117000001171b,
- 0x1171d0001172c,
- 0x117300001173a,
- 0x118000001183b,
- 0x118c0000118ea,
- 0x118ff00011907,
- 0x119090001190a,
- 0x1190c00011914,
+ 0x116500001165A,
+ 0x11680000116B9,
+ 0x116C0000116CA,
+ 0x117000001171B,
+ 0x1171D0001172C,
+ 0x117300001173A,
+ 0x1174000011747,
+ 0x118000001183B,
+ 0x118C0000118EA,
+ 0x118FF00011907,
+ 0x119090001190A,
+ 0x1190C00011914,
0x1191500011917,
0x1191800011936,
0x1193700011939,
- 0x1193b00011944,
- 0x119500001195a,
- 0x119a0000119a8,
- 0x119aa000119d8,
- 0x119da000119e2,
- 0x119e3000119e5,
- 0x11a0000011a3f,
- 0x11a4700011a48,
- 0x11a5000011a9a,
- 0x11a9d00011a9e,
- 0x11ac000011af9,
- 0x11c0000011c09,
- 0x11c0a00011c37,
- 0x11c3800011c41,
- 0x11c5000011c5a,
- 0x11c7200011c90,
- 0x11c9200011ca8,
- 0x11ca900011cb7,
- 0x11d0000011d07,
- 0x11d0800011d0a,
- 0x11d0b00011d37,
- 0x11d3a00011d3b,
- 0x11d3c00011d3e,
- 0x11d3f00011d48,
- 0x11d5000011d5a,
- 0x11d6000011d66,
- 0x11d6700011d69,
- 0x11d6a00011d8f,
- 0x11d9000011d92,
- 0x11d9300011d99,
- 0x11da000011daa,
- 0x11ee000011ef7,
- 0x11fb000011fb1,
- 0x120000001239a,
+ 0x1193B00011944,
+ 0x119500001195A,
+ 0x119A0000119A8,
+ 0x119AA000119D8,
+ 0x119DA000119E2,
+ 0x119E3000119E5,
+ 0x11A0000011A3F,
+ 0x11A4700011A48,
+ 0x11A5000011A9A,
+ 0x11A9D00011A9E,
+ 0x11AB000011AF9,
+ 0x11C0000011C09,
+ 0x11C0A00011C37,
+ 0x11C3800011C41,
+ 0x11C5000011C5A,
+ 0x11C7200011C90,
+ 0x11C9200011CA8,
+ 0x11CA900011CB7,
+ 0x11D0000011D07,
+ 0x11D0800011D0A,
+ 0x11D0B00011D37,
+ 0x11D3A00011D3B,
+ 0x11D3C00011D3E,
+ 0x11D3F00011D48,
+ 0x11D5000011D5A,
+ 0x11D6000011D66,
+ 0x11D6700011D69,
+ 0x11D6A00011D8F,
+ 0x11D9000011D92,
+ 0x11D9300011D99,
+ 0x11DA000011DAA,
+ 0x11EE000011EF7,
+ 0x11F0000011F11,
+ 0x11F1200011F3B,
+ 0x11F3E00011F43,
+ 0x11F5000011F5A,
+ 0x11FB000011FB1,
+ 0x120000001239A,
0x1248000012544,
- 0x130000001342f,
+ 0x12F9000012FF1,
+ 0x1300000013430,
+ 0x1344000013456,
0x1440000014647,
- 0x1680000016a39,
- 0x16a4000016a5f,
- 0x16a6000016a6a,
- 0x16ad000016aee,
- 0x16af000016af5,
- 0x16b0000016b37,
- 0x16b4000016b44,
- 0x16b5000016b5a,
- 0x16b6300016b78,
- 0x16b7d00016b90,
- 0x16e6000016e80,
- 0x16f0000016f4b,
- 0x16f4f00016f88,
- 0x16f8f00016fa0,
- 0x16fe000016fe2,
- 0x16fe300016fe5,
- 0x16ff000016ff2,
- 0x17000000187f8,
- 0x1880000018cd6,
- 0x18d0000018d09,
- 0x1b0000001b11f,
- 0x1b1500001b153,
- 0x1b1640001b168,
- 0x1b1700001b2fc,
- 0x1bc000001bc6b,
- 0x1bc700001bc7d,
- 0x1bc800001bc89,
- 0x1bc900001bc9a,
- 0x1bc9d0001bc9f,
- 0x1da000001da37,
- 0x1da3b0001da6d,
- 0x1da750001da76,
- 0x1da840001da85,
- 0x1da9b0001daa0,
- 0x1daa10001dab0,
- 0x1e0000001e007,
- 0x1e0080001e019,
- 0x1e01b0001e022,
- 0x1e0230001e025,
- 0x1e0260001e02b,
- 0x1e1000001e12d,
- 0x1e1300001e13e,
- 0x1e1400001e14a,
- 0x1e14e0001e14f,
- 0x1e2c00001e2fa,
- 0x1e8000001e8c5,
- 0x1e8d00001e8d7,
- 0x1e9220001e94c,
- 0x1e9500001e95a,
- 0x1fbf00001fbfa,
- 0x200000002a6de,
- 0x2a7000002b735,
- 0x2b7400002b81e,
- 0x2b8200002cea2,
- 0x2ceb00002ebe1,
- 0x300000003134b,
+ 0x1680000016A39,
+ 0x16A4000016A5F,
+ 0x16A6000016A6A,
+ 0x16A7000016ABF,
+ 0x16AC000016ACA,
+ 0x16AD000016AEE,
+ 0x16AF000016AF5,
+ 0x16B0000016B37,
+ 0x16B4000016B44,
+ 0x16B5000016B5A,
+ 0x16B6300016B78,
+ 0x16B7D00016B90,
+ 0x16E6000016E80,
+ 0x16F0000016F4B,
+ 0x16F4F00016F88,
+ 0x16F8F00016FA0,
+ 0x16FE000016FE2,
+ 0x16FE300016FE5,
+ 0x16FF000016FF2,
+ 0x17000000187F8,
+ 0x1880000018CD6,
+ 0x18D0000018D09,
+ 0x1AFF00001AFF4,
+ 0x1AFF50001AFFC,
+ 0x1AFFD0001AFFF,
+ 0x1B0000001B123,
+ 0x1B1320001B133,
+ 0x1B1500001B153,
+ 0x1B1550001B156,
+ 0x1B1640001B168,
+ 0x1B1700001B2FC,
+ 0x1BC000001BC6B,
+ 0x1BC700001BC7D,
+ 0x1BC800001BC89,
+ 0x1BC900001BC9A,
+ 0x1BC9D0001BC9F,
+ 0x1CF000001CF2E,
+ 0x1CF300001CF47,
+ 0x1DA000001DA37,
+ 0x1DA3B0001DA6D,
+ 0x1DA750001DA76,
+ 0x1DA840001DA85,
+ 0x1DA9B0001DAA0,
+ 0x1DAA10001DAB0,
+ 0x1DF000001DF1F,
+ 0x1DF250001DF2B,
+ 0x1E0000001E007,
+ 0x1E0080001E019,
+ 0x1E01B0001E022,
+ 0x1E0230001E025,
+ 0x1E0260001E02B,
+ 0x1E08F0001E090,
+ 0x1E1000001E12D,
+ 0x1E1300001E13E,
+ 0x1E1400001E14A,
+ 0x1E14E0001E14F,
+ 0x1E2900001E2AF,
+ 0x1E2C00001E2FA,
+ 0x1E4D00001E4FA,
+ 0x1E7E00001E7E7,
+ 0x1E7E80001E7EC,
+ 0x1E7ED0001E7EF,
+ 0x1E7F00001E7FF,
+ 0x1E8000001E8C5,
+ 0x1E8D00001E8D7,
+ 0x1E9220001E94C,
+ 0x1E9500001E95A,
+ 0x200000002A6E0,
+ 0x2A7000002B73A,
+ 0x2B7400002B81E,
+ 0x2B8200002CEA2,
+ 0x2CEB00002EBE1,
+ 0x2EBF00002EE5E,
+ 0x300000003134B,
+ 0x31350000323B0,
),
- 'CONTEXTJ': (
- 0x200c0000200e,
- ),
- 'CONTEXTO': (
- 0xb7000000b8,
+ "CONTEXTJ": (0x200C0000200E,),
+ "CONTEXTO": (
+ 0xB7000000B8,
0x37500000376,
- 0x5f3000005f5,
- 0x6600000066a,
- 0x6f0000006fa,
- 0x30fb000030fc,
+ 0x5F3000005F5,
+ 0x6600000066A,
+ 0x6F0000006FA,
+ 0x30FB000030FC,
),
}
diff --git a/third_party/python/idna/idna/intranges.py b/third_party/python/idna/idna/intranges.py
index fa8a735662d0..7bfaa8d80d7d 100644
--- a/third_party/python/idna/idna/intranges.py
+++ b/third_party/python/idna/idna/intranges.py
@@ -6,8 +6,10 @@ in the original list?" in time O(log(# runs)).
"""
import bisect
+from typing import List, Tuple
-def intranges_from_list(list_):
+
+def intranges_from_list(list_: List[int]) -> Tuple[int, ...]:
"""Represent a list of integers as a sequence of ranges:
((start_0, end_0), (start_1, end_1), ...), such that the original
integers are exactly those x such that start_i <= x < end_i for some i.
@@ -19,30 +21,32 @@ def intranges_from_list(list_):
ranges = []
last_write = -1
for i in range(len(sorted_list)):
- if i+1 < len(sorted_list):
- if sorted_list[i] == sorted_list[i+1]-1:
+ if i + 1 < len(sorted_list):
+ if sorted_list[i] == sorted_list[i + 1] - 1:
continue
- current_range = sorted_list[last_write+1:i+1]
+ current_range = sorted_list[last_write + 1 : i + 1]
ranges.append(_encode_range(current_range[0], current_range[-1] + 1))
last_write = i
return tuple(ranges)
-def _encode_range(start, end):
+
+def _encode_range(start: int, end: int) -> int:
return (start << 32) | end
-def _decode_range(r):
+
+def _decode_range(r: int) -> Tuple[int, int]:
return (r >> 32), (r & ((1 << 32) - 1))
-def intranges_contain(int_, ranges):
+def intranges_contain(int_: int, ranges: Tuple[int, ...]) -> bool:
"""Determine if `int_` falls into one of the ranges in `ranges`."""
tuple_ = _encode_range(int_, 0)
pos = bisect.bisect_left(ranges, tuple_)
# we could be immediately ahead of a tuple (start, end)
# with start < int_ <= end
if pos > 0:
- left, right = _decode_range(ranges[pos-1])
+ left, right = _decode_range(ranges[pos - 1])
if left <= int_ < right:
return True
# or we could be immediately behind a tuple (int_, end)
diff --git a/third_party/python/idna/idna/package_data.py b/third_party/python/idna/idna/package_data.py
index ce1c521d23a4..514ff7e2e68b 100644
--- a/third_party/python/idna/idna/package_data.py
+++ b/third_party/python/idna/idna/package_data.py
@@ -1,2 +1 @@
-__version__ = '2.10'
-
+__version__ = "3.10"
diff --git a/third_party/python/idna/idna/py.typed b/third_party/python/idna/idna/py.typed
new file mode 100644
index 000000000000..e69de29bb2d1
diff --git a/third_party/python/idna/idna/uts46data.py b/third_party/python/idna/idna/uts46data.py
index 3766dd49f6d6..eb894327410d 100644
--- a/third_party/python/idna/idna/uts46data.py
+++ b/third_party/python/idna/idna/uts46data.py
@@ -1,8278 +1,8600 @@
# This file is automatically generated by tools/idna-data
# vim: set fileencoding=utf-8 :
+from typing import List, Tuple, Union
+
"""IDNA Mapping Table from UTS46."""
-__version__ = "13.0.0"
-def _seg_0():
+__version__ = "15.1.0"
+
+
+def _seg_0() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x0, '3'),
- (0x1, '3'),
- (0x2, '3'),
- (0x3, '3'),
- (0x4, '3'),
- (0x5, '3'),
- (0x6, '3'),
- (0x7, '3'),
- (0x8, '3'),
- (0x9, '3'),
- (0xA, '3'),
- (0xB, '3'),
- (0xC, '3'),
- (0xD, '3'),
- (0xE, '3'),
- (0xF, '3'),
- (0x10, '3'),
- (0x11, '3'),
- (0x12, '3'),
- (0x13, '3'),
- (0x14, '3'),
- (0x15, '3'),
- (0x16, '3'),
- (0x17, '3'),
- (0x18, '3'),
- (0x19, '3'),
- (0x1A, '3'),
- (0x1B, '3'),
- (0x1C, '3'),
- (0x1D, '3'),
- (0x1E, '3'),
- (0x1F, '3'),
- (0x20, '3'),
- (0x21, '3'),
- (0x22, '3'),
- (0x23, '3'),
- (0x24, '3'),
- (0x25, '3'),
- (0x26, '3'),
- (0x27, '3'),
- (0x28, '3'),
- (0x29, '3'),
- (0x2A, '3'),
- (0x2B, '3'),
- (0x2C, '3'),
- (0x2D, 'V'),
- (0x2E, 'V'),
- (0x2F, '3'),
- (0x30, 'V'),
- (0x31, 'V'),
- (0x32, 'V'),
- (0x33, 'V'),
- (0x34, 'V'),
- (0x35, 'V'),
- (0x36, 'V'),
- (0x37, 'V'),
- (0x38, 'V'),
- (0x39, 'V'),
- (0x3A, '3'),
- (0x3B, '3'),
- (0x3C, '3'),
- (0x3D, '3'),
- (0x3E, '3'),
- (0x3F, '3'),
- (0x40, '3'),
- (0x41, 'M', u'a'),
- (0x42, 'M', u'b'),
- (0x43, 'M', u'c'),
- (0x44, 'M', u'd'),
- (0x45, 'M', u'e'),
- (0x46, 'M', u'f'),
- (0x47, 'M', u'g'),
- (0x48, 'M', u'h'),
- (0x49, 'M', u'i'),
- (0x4A, 'M', u'j'),
- (0x4B, 'M', u'k'),
- (0x4C, 'M', u'l'),
- (0x4D, 'M', u'm'),
- (0x4E, 'M', u'n'),
- (0x4F, 'M', u'o'),
- (0x50, 'M', u'p'),
- (0x51, 'M', u'q'),
- (0x52, 'M', u'r'),
- (0x53, 'M', u's'),
- (0x54, 'M', u't'),
- (0x55, 'M', u'u'),
- (0x56, 'M', u'v'),
- (0x57, 'M', u'w'),
- (0x58, 'M', u'x'),
- (0x59, 'M', u'y'),
- (0x5A, 'M', u'z'),
- (0x5B, '3'),
- (0x5C, '3'),
- (0x5D, '3'),
- (0x5E, '3'),
- (0x5F, '3'),
- (0x60, '3'),
- (0x61, 'V'),
- (0x62, 'V'),
- (0x63, 'V'),
+ (0x0, "3"),
+ (0x1, "3"),
+ (0x2, "3"),
+ (0x3, "3"),
+ (0x4, "3"),
+ (0x5, "3"),
+ (0x6, "3"),
+ (0x7, "3"),
+ (0x8, "3"),
+ (0x9, "3"),
+ (0xA, "3"),
+ (0xB, "3"),
+ (0xC, "3"),
+ (0xD, "3"),
+ (0xE, "3"),
+ (0xF, "3"),
+ (0x10, "3"),
+ (0x11, "3"),
+ (0x12, "3"),
+ (0x13, "3"),
+ (0x14, "3"),
+ (0x15, "3"),
+ (0x16, "3"),
+ (0x17, "3"),
+ (0x18, "3"),
+ (0x19, "3"),
+ (0x1A, "3"),
+ (0x1B, "3"),
+ (0x1C, "3"),
+ (0x1D, "3"),
+ (0x1E, "3"),
+ (0x1F, "3"),
+ (0x20, "3"),
+ (0x21, "3"),
+ (0x22, "3"),
+ (0x23, "3"),
+ (0x24, "3"),
+ (0x25, "3"),
+ (0x26, "3"),
+ (0x27, "3"),
+ (0x28, "3"),
+ (0x29, "3"),
+ (0x2A, "3"),
+ (0x2B, "3"),
+ (0x2C, "3"),
+ (0x2D, "V"),
+ (0x2E, "V"),
+ (0x2F, "3"),
+ (0x30, "V"),
+ (0x31, "V"),
+ (0x32, "V"),
+ (0x33, "V"),
+ (0x34, "V"),
+ (0x35, "V"),
+ (0x36, "V"),
+ (0x37, "V"),
+ (0x38, "V"),
+ (0x39, "V"),
+ (0x3A, "3"),
+ (0x3B, "3"),
+ (0x3C, "3"),
+ (0x3D, "3"),
+ (0x3E, "3"),
+ (0x3F, "3"),
+ (0x40, "3"),
+ (0x41, "M", "a"),
+ (0x42, "M", "b"),
+ (0x43, "M", "c"),
+ (0x44, "M", "d"),
+ (0x45, "M", "e"),
+ (0x46, "M", "f"),
+ (0x47, "M", "g"),
+ (0x48, "M", "h"),
+ (0x49, "M", "i"),
+ (0x4A, "M", "j"),
+ (0x4B, "M", "k"),
+ (0x4C, "M", "l"),
+ (0x4D, "M", "m"),
+ (0x4E, "M", "n"),
+ (0x4F, "M", "o"),
+ (0x50, "M", "p"),
+ (0x51, "M", "q"),
+ (0x52, "M", "r"),
+ (0x53, "M", "s"),
+ (0x54, "M", "t"),
+ (0x55, "M", "u"),
+ (0x56, "M", "v"),
+ (0x57, "M", "w"),
+ (0x58, "M", "x"),
+ (0x59, "M", "y"),
+ (0x5A, "M", "z"),
+ (0x5B, "3"),
+ (0x5C, "3"),
+ (0x5D, "3"),
+ (0x5E, "3"),
+ (0x5F, "3"),
+ (0x60, "3"),
+ (0x61, "V"),
+ (0x62, "V"),
+ (0x63, "V"),
]
-def _seg_1():
+
+def _seg_1() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x64, 'V'),
- (0x65, 'V'),
- (0x66, 'V'),
- (0x67, 'V'),
- (0x68, 'V'),
- (0x69, 'V'),
- (0x6A, 'V'),
- (0x6B, 'V'),
- (0x6C, 'V'),
- (0x6D, 'V'),
- (0x6E, 'V'),
- (0x6F, 'V'),
- (0x70, 'V'),
- (0x71, 'V'),
- (0x72, 'V'),
- (0x73, 'V'),
- (0x74, 'V'),
- (0x75, 'V'),
- (0x76, 'V'),
- (0x77, 'V'),
- (0x78, 'V'),
- (0x79, 'V'),
- (0x7A, 'V'),
- (0x7B, '3'),
- (0x7C, '3'),
- (0x7D, '3'),
- (0x7E, '3'),
- (0x7F, '3'),
- (0x80, 'X'),
- (0x81, 'X'),
- (0x82, 'X'),
- (0x83, 'X'),
- (0x84, 'X'),
- (0x85, 'X'),
- (0x86, 'X'),
- (0x87, 'X'),
- (0x88, 'X'),
- (0x89, 'X'),
- (0x8A, 'X'),
- (0x8B, 'X'),
- (0x8C, 'X'),
- (0x8D, 'X'),
- (0x8E, 'X'),
- (0x8F, 'X'),
- (0x90, 'X'),
- (0x91, 'X'),
- (0x92, 'X'),
- (0x93, 'X'),
- (0x94, 'X'),
- (0x95, 'X'),
- (0x96, 'X'),
- (0x97, 'X'),
- (0x98, 'X'),
- (0x99, 'X'),
- (0x9A, 'X'),
- (0x9B, 'X'),
- (0x9C, 'X'),
- (0x9D, 'X'),
- (0x9E, 'X'),
- (0x9F, 'X'),
- (0xA0, '3', u' '),
- (0xA1, 'V'),
- (0xA2, 'V'),
- (0xA3, 'V'),
- (0xA4, 'V'),
- (0xA5, 'V'),
- (0xA6, 'V'),
- (0xA7, 'V'),
- (0xA8, '3', u' ̈'),
- (0xA9, 'V'),
- (0xAA, 'M', u'a'),
- (0xAB, 'V'),
- (0xAC, 'V'),
- (0xAD, 'I'),
- (0xAE, 'V'),
- (0xAF, '3', u' ̄'),
- (0xB0, 'V'),
- (0xB1, 'V'),
- (0xB2, 'M', u'2'),
- (0xB3, 'M', u'3'),
- (0xB4, '3', u' ́'),
- (0xB5, 'M', u'μ'),
- (0xB6, 'V'),
- (0xB7, 'V'),
- (0xB8, '3', u' ̧'),
- (0xB9, 'M', u'1'),
- (0xBA, 'M', u'o'),
- (0xBB, 'V'),
- (0xBC, 'M', u'1⁄4'),
- (0xBD, 'M', u'1⁄2'),
- (0xBE, 'M', u'3⁄4'),
- (0xBF, 'V'),
- (0xC0, 'M', u'à'),
- (0xC1, 'M', u'á'),
- (0xC2, 'M', u'â'),
- (0xC3, 'M', u'ã'),
- (0xC4, 'M', u'ä'),
- (0xC5, 'M', u'å'),
- (0xC6, 'M', u'æ'),
- (0xC7, 'M', u'ç'),
+ (0x64, "V"),
+ (0x65, "V"),
+ (0x66, "V"),
+ (0x67, "V"),
+ (0x68, "V"),
+ (0x69, "V"),
+ (0x6A, "V"),
+ (0x6B, "V"),
+ (0x6C, "V"),
+ (0x6D, "V"),
+ (0x6E, "V"),
+ (0x6F, "V"),
+ (0x70, "V"),
+ (0x71, "V"),
+ (0x72, "V"),
+ (0x73, "V"),
+ (0x74, "V"),
+ (0x75, "V"),
+ (0x76, "V"),
+ (0x77, "V"),
+ (0x78, "V"),
+ (0x79, "V"),
+ (0x7A, "V"),
+ (0x7B, "3"),
+ (0x7C, "3"),
+ (0x7D, "3"),
+ (0x7E, "3"),
+ (0x7F, "3"),
+ (0x80, "X"),
+ (0x81, "X"),
+ (0x82, "X"),
+ (0x83, "X"),
+ (0x84, "X"),
+ (0x85, "X"),
+ (0x86, "X"),
+ (0x87, "X"),
+ (0x88, "X"),
+ (0x89, "X"),
+ (0x8A, "X"),
+ (0x8B, "X"),
+ (0x8C, "X"),
+ (0x8D, "X"),
+ (0x8E, "X"),
+ (0x8F, "X"),
+ (0x90, "X"),
+ (0x91, "X"),
+ (0x92, "X"),
+ (0x93, "X"),
+ (0x94, "X"),
+ (0x95, "X"),
+ (0x96, "X"),
+ (0x97, "X"),
+ (0x98, "X"),
+ (0x99, "X"),
+ (0x9A, "X"),
+ (0x9B, "X"),
+ (0x9C, "X"),
+ (0x9D, "X"),
+ (0x9E, "X"),
+ (0x9F, "X"),
+ (0xA0, "3", " "),
+ (0xA1, "V"),
+ (0xA2, "V"),
+ (0xA3, "V"),
+ (0xA4, "V"),
+ (0xA5, "V"),
+ (0xA6, "V"),
+ (0xA7, "V"),
+ (0xA8, "3", " ̈"),
+ (0xA9, "V"),
+ (0xAA, "M", "a"),
+ (0xAB, "V"),
+ (0xAC, "V"),
+ (0xAD, "I"),
+ (0xAE, "V"),
+ (0xAF, "3", " ̄"),
+ (0xB0, "V"),
+ (0xB1, "V"),
+ (0xB2, "M", "2"),
+ (0xB3, "M", "3"),
+ (0xB4, "3", " ́"),
+ (0xB5, "M", "μ"),
+ (0xB6, "V"),
+ (0xB7, "V"),
+ (0xB8, "3", " ̧"),
+ (0xB9, "M", "1"),
+ (0xBA, "M", "o"),
+ (0xBB, "V"),
+ (0xBC, "M", "1⁄4"),
+ (0xBD, "M", "1⁄2"),
+ (0xBE, "M", "3⁄4"),
+ (0xBF, "V"),
+ (0xC0, "M", "à"),
+ (0xC1, "M", "á"),
+ (0xC2, "M", "â"),
+ (0xC3, "M", "ã"),
+ (0xC4, "M", "ä"),
+ (0xC5, "M", "å"),
+ (0xC6, "M", "æ"),
+ (0xC7, "M", "ç"),
]
-def _seg_2():
+
+def _seg_2() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0xC8, 'M', u'è'),
- (0xC9, 'M', u'é'),
- (0xCA, 'M', u'ê'),
- (0xCB, 'M', u'ë'),
- (0xCC, 'M', u'ì'),
- (0xCD, 'M', u'í'),
- (0xCE, 'M', u'î'),
- (0xCF, 'M', u'ï'),
- (0xD0, 'M', u'ð'),
- (0xD1, 'M', u'ñ'),
- (0xD2, 'M', u'ò'),
- (0xD3, 'M', u'ó'),
- (0xD4, 'M', u'ô'),
- (0xD5, 'M', u'õ'),
- (0xD6, 'M', u'ö'),
- (0xD7, 'V'),
- (0xD8, 'M', u'ø'),
- (0xD9, 'M', u'ù'),
- (0xDA, 'M', u'ú'),
- (0xDB, 'M', u'û'),
- (0xDC, 'M', u'ü'),
- (0xDD, 'M', u'ý'),
- (0xDE, 'M', u'þ'),
- (0xDF, 'D', u'ss'),
- (0xE0, 'V'),
- (0xE1, 'V'),
- (0xE2, 'V'),
- (0xE3, 'V'),
- (0xE4, 'V'),
- (0xE5, 'V'),
- (0xE6, 'V'),
- (0xE7, 'V'),
- (0xE8, 'V'),
- (0xE9, 'V'),
- (0xEA, 'V'),
- (0xEB, 'V'),
- (0xEC, 'V'),
- (0xED, 'V'),
- (0xEE, 'V'),
- (0xEF, 'V'),
- (0xF0, 'V'),
- (0xF1, 'V'),
- (0xF2, 'V'),
- (0xF3, 'V'),
- (0xF4, 'V'),
- (0xF5, 'V'),
- (0xF6, 'V'),
- (0xF7, 'V'),
- (0xF8, 'V'),
- (0xF9, 'V'),
- (0xFA, 'V'),
- (0xFB, 'V'),
- (0xFC, 'V'),
- (0xFD, 'V'),
- (0xFE, 'V'),
- (0xFF, 'V'),
- (0x100, 'M', u'ā'),
- (0x101, 'V'),
- (0x102, 'M', u'ă'),
- (0x103, 'V'),
- (0x104, 'M', u'ą'),
- (0x105, 'V'),
- (0x106, 'M', u'ć'),
- (0x107, 'V'),
- (0x108, 'M', u'ĉ'),
- (0x109, 'V'),
- (0x10A, 'M', u'ċ'),
- (0x10B, 'V'),
- (0x10C, 'M', u'č'),
- (0x10D, 'V'),
- (0x10E, 'M', u'ď'),
- (0x10F, 'V'),
- (0x110, 'M', u'đ'),
- (0x111, 'V'),
- (0x112, 'M', u'ē'),
- (0x113, 'V'),
- (0x114, 'M', u'ĕ'),
- (0x115, 'V'),
- (0x116, 'M', u'ė'),
- (0x117, 'V'),
- (0x118, 'M', u'ę'),
- (0x119, 'V'),
- (0x11A, 'M', u'ě'),
- (0x11B, 'V'),
- (0x11C, 'M', u'ĝ'),
- (0x11D, 'V'),
- (0x11E, 'M', u'ğ'),
- (0x11F, 'V'),
- (0x120, 'M', u'ġ'),
- (0x121, 'V'),
- (0x122, 'M', u'ģ'),
- (0x123, 'V'),
- (0x124, 'M', u'ĥ'),
- (0x125, 'V'),
- (0x126, 'M', u'ħ'),
- (0x127, 'V'),
- (0x128, 'M', u'ĩ'),
- (0x129, 'V'),
- (0x12A, 'M', u'ī'),
- (0x12B, 'V'),
+ (0xC8, "M", "è"),
+ (0xC9, "M", "é"),
+ (0xCA, "M", "ê"),
+ (0xCB, "M", "ë"),
+ (0xCC, "M", "ì"),
+ (0xCD, "M", "í"),
+ (0xCE, "M", "î"),
+ (0xCF, "M", "ï"),
+ (0xD0, "M", "ð"),
+ (0xD1, "M", "ñ"),
+ (0xD2, "M", "ò"),
+ (0xD3, "M", "ó"),
+ (0xD4, "M", "ô"),
+ (0xD5, "M", "õ"),
+ (0xD6, "M", "ö"),
+ (0xD7, "V"),
+ (0xD8, "M", "ø"),
+ (0xD9, "M", "ù"),
+ (0xDA, "M", "ú"),
+ (0xDB, "M", "û"),
+ (0xDC, "M", "ü"),
+ (0xDD, "M", "ý"),
+ (0xDE, "M", "þ"),
+ (0xDF, "D", "ss"),
+ (0xE0, "V"),
+ (0xE1, "V"),
+ (0xE2, "V"),
+ (0xE3, "V"),
+ (0xE4, "V"),
+ (0xE5, "V"),
+ (0xE6, "V"),
+ (0xE7, "V"),
+ (0xE8, "V"),
+ (0xE9, "V"),
+ (0xEA, "V"),
+ (0xEB, "V"),
+ (0xEC, "V"),
+ (0xED, "V"),
+ (0xEE, "V"),
+ (0xEF, "V"),
+ (0xF0, "V"),
+ (0xF1, "V"),
+ (0xF2, "V"),
+ (0xF3, "V"),
+ (0xF4, "V"),
+ (0xF5, "V"),
+ (0xF6, "V"),
+ (0xF7, "V"),
+ (0xF8, "V"),
+ (0xF9, "V"),
+ (0xFA, "V"),
+ (0xFB, "V"),
+ (0xFC, "V"),
+ (0xFD, "V"),
+ (0xFE, "V"),
+ (0xFF, "V"),
+ (0x100, "M", "ā"),
+ (0x101, "V"),
+ (0x102, "M", "ă"),
+ (0x103, "V"),
+ (0x104, "M", "ą"),
+ (0x105, "V"),
+ (0x106, "M", "ć"),
+ (0x107, "V"),
+ (0x108, "M", "ĉ"),
+ (0x109, "V"),
+ (0x10A, "M", "ċ"),
+ (0x10B, "V"),
+ (0x10C, "M", "č"),
+ (0x10D, "V"),
+ (0x10E, "M", "ď"),
+ (0x10F, "V"),
+ (0x110, "M", "đ"),
+ (0x111, "V"),
+ (0x112, "M", "ē"),
+ (0x113, "V"),
+ (0x114, "M", "ĕ"),
+ (0x115, "V"),
+ (0x116, "M", "ė"),
+ (0x117, "V"),
+ (0x118, "M", "ę"),
+ (0x119, "V"),
+ (0x11A, "M", "ě"),
+ (0x11B, "V"),
+ (0x11C, "M", "ĝ"),
+ (0x11D, "V"),
+ (0x11E, "M", "ğ"),
+ (0x11F, "V"),
+ (0x120, "M", "ġ"),
+ (0x121, "V"),
+ (0x122, "M", "ģ"),
+ (0x123, "V"),
+ (0x124, "M", "ĥ"),
+ (0x125, "V"),
+ (0x126, "M", "ħ"),
+ (0x127, "V"),
+ (0x128, "M", "ĩ"),
+ (0x129, "V"),
+ (0x12A, "M", "ī"),
+ (0x12B, "V"),
]
-def _seg_3():
+
+def _seg_3() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x12C, 'M', u'ĭ'),
- (0x12D, 'V'),
- (0x12E, 'M', u'į'),
- (0x12F, 'V'),
- (0x130, 'M', u'i̇'),
- (0x131, 'V'),
- (0x132, 'M', u'ij'),
- (0x134, 'M', u'ĵ'),
- (0x135, 'V'),
- (0x136, 'M', u'ķ'),
- (0x137, 'V'),
- (0x139, 'M', u'ĺ'),
- (0x13A, 'V'),
- (0x13B, 'M', u'ļ'),
- (0x13C, 'V'),
- (0x13D, 'M', u'ľ'),
- (0x13E, 'V'),
- (0x13F, 'M', u'l·'),
- (0x141, 'M', u'ł'),
- (0x142, 'V'),
- (0x143, 'M', u'ń'),
- (0x144, 'V'),
- (0x145, 'M', u'ņ'),
- (0x146, 'V'),
- (0x147, 'M', u'ň'),
- (0x148, 'V'),
- (0x149, 'M', u'ʼn'),
- (0x14A, 'M', u'ŋ'),
- (0x14B, 'V'),
- (0x14C, 'M', u'ō'),
- (0x14D, 'V'),
- (0x14E, 'M', u'ŏ'),
- (0x14F, 'V'),
- (0x150, 'M', u'ő'),
- (0x151, 'V'),
- (0x152, 'M', u'œ'),
- (0x153, 'V'),
- (0x154, 'M', u'ŕ'),
- (0x155, 'V'),
- (0x156, 'M', u'ŗ'),
- (0x157, 'V'),
- (0x158, 'M', u'ř'),
- (0x159, 'V'),
- (0x15A, 'M', u'ś'),
- (0x15B, 'V'),
- (0x15C, 'M', u'ŝ'),
- (0x15D, 'V'),
- (0x15E, 'M', u'ş'),
- (0x15F, 'V'),
- (0x160, 'M', u'š'),
- (0x161, 'V'),
- (0x162, 'M', u'ţ'),
- (0x163, 'V'),
- (0x164, 'M', u'ť'),
- (0x165, 'V'),
- (0x166, 'M', u'ŧ'),
- (0x167, 'V'),
- (0x168, 'M', u'ũ'),
- (0x169, 'V'),
- (0x16A, 'M', u'ū'),
- (0x16B, 'V'),
- (0x16C, 'M', u'ŭ'),
- (0x16D, 'V'),
- (0x16E, 'M', u'ů'),
- (0x16F, 'V'),
- (0x170, 'M', u'ű'),
- (0x171, 'V'),
- (0x172, 'M', u'ų'),
- (0x173, 'V'),
- (0x174, 'M', u'ŵ'),
- (0x175, 'V'),
- (0x176, 'M', u'ŷ'),
- (0x177, 'V'),
- (0x178, 'M', u'ÿ'),
- (0x179, 'M', u'ź'),
- (0x17A, 'V'),
- (0x17B, 'M', u'ż'),
- (0x17C, 'V'),
- (0x17D, 'M', u'ž'),
- (0x17E, 'V'),
- (0x17F, 'M', u's'),
- (0x180, 'V'),
- (0x181, 'M', u'ɓ'),
- (0x182, 'M', u'ƃ'),
- (0x183, 'V'),
- (0x184, 'M', u'ƅ'),
- (0x185, 'V'),
- (0x186, 'M', u'ɔ'),
- (0x187, 'M', u'ƈ'),
- (0x188, 'V'),
- (0x189, 'M', u'ɖ'),
- (0x18A, 'M', u'ɗ'),
- (0x18B, 'M', u'ƌ'),
- (0x18C, 'V'),
- (0x18E, 'M', u'ǝ'),
- (0x18F, 'M', u'ə'),
- (0x190, 'M', u'ɛ'),
- (0x191, 'M', u'ƒ'),
- (0x192, 'V'),
- (0x193, 'M', u'ɠ'),
+ (0x12C, "M", "ĭ"),
+ (0x12D, "V"),
+ (0x12E, "M", "į"),
+ (0x12F, "V"),
+ (0x130, "M", "i̇"),
+ (0x131, "V"),
+ (0x132, "M", "ij"),
+ (0x134, "M", "ĵ"),
+ (0x135, "V"),
+ (0x136, "M", "ķ"),
+ (0x137, "V"),
+ (0x139, "M", "ĺ"),
+ (0x13A, "V"),
+ (0x13B, "M", "ļ"),
+ (0x13C, "V"),
+ (0x13D, "M", "ľ"),
+ (0x13E, "V"),
+ (0x13F, "M", "l·"),
+ (0x141, "M", "ł"),
+ (0x142, "V"),
+ (0x143, "M", "ń"),
+ (0x144, "V"),
+ (0x145, "M", "ņ"),
+ (0x146, "V"),
+ (0x147, "M", "ň"),
+ (0x148, "V"),
+ (0x149, "M", "ʼn"),
+ (0x14A, "M", "ŋ"),
+ (0x14B, "V"),
+ (0x14C, "M", "ō"),
+ (0x14D, "V"),
+ (0x14E, "M", "ŏ"),
+ (0x14F, "V"),
+ (0x150, "M", "ő"),
+ (0x151, "V"),
+ (0x152, "M", "œ"),
+ (0x153, "V"),
+ (0x154, "M", "ŕ"),
+ (0x155, "V"),
+ (0x156, "M", "ŗ"),
+ (0x157, "V"),
+ (0x158, "M", "ř"),
+ (0x159, "V"),
+ (0x15A, "M", "ś"),
+ (0x15B, "V"),
+ (0x15C, "M", "ŝ"),
+ (0x15D, "V"),
+ (0x15E, "M", "ş"),
+ (0x15F, "V"),
+ (0x160, "M", "š"),
+ (0x161, "V"),
+ (0x162, "M", "ţ"),
+ (0x163, "V"),
+ (0x164, "M", "ť"),
+ (0x165, "V"),
+ (0x166, "M", "ŧ"),
+ (0x167, "V"),
+ (0x168, "M", "ũ"),
+ (0x169, "V"),
+ (0x16A, "M", "ū"),
+ (0x16B, "V"),
+ (0x16C, "M", "ŭ"),
+ (0x16D, "V"),
+ (0x16E, "M", "ů"),
+ (0x16F, "V"),
+ (0x170, "M", "ű"),
+ (0x171, "V"),
+ (0x172, "M", "ų"),
+ (0x173, "V"),
+ (0x174, "M", "ŵ"),
+ (0x175, "V"),
+ (0x176, "M", "ŷ"),
+ (0x177, "V"),
+ (0x178, "M", "ÿ"),
+ (0x179, "M", "ź"),
+ (0x17A, "V"),
+ (0x17B, "M", "ż"),
+ (0x17C, "V"),
+ (0x17D, "M", "ž"),
+ (0x17E, "V"),
+ (0x17F, "M", "s"),
+ (0x180, "V"),
+ (0x181, "M", "ɓ"),
+ (0x182, "M", "ƃ"),
+ (0x183, "V"),
+ (0x184, "M", "ƅ"),
+ (0x185, "V"),
+ (0x186, "M", "ɔ"),
+ (0x187, "M", "ƈ"),
+ (0x188, "V"),
+ (0x189, "M", "ɖ"),
+ (0x18A, "M", "ɗ"),
+ (0x18B, "M", "ƌ"),
+ (0x18C, "V"),
+ (0x18E, "M", "ǝ"),
+ (0x18F, "M", "ə"),
+ (0x190, "M", "ɛ"),
+ (0x191, "M", "ƒ"),
+ (0x192, "V"),
+ (0x193, "M", "ɠ"),
]
-def _seg_4():
+
+def _seg_4() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x194, 'M', u'ɣ'),
- (0x195, 'V'),
- (0x196, 'M', u'ɩ'),
- (0x197, 'M', u'ɨ'),
- (0x198, 'M', u'ƙ'),
- (0x199, 'V'),
- (0x19C, 'M', u'ɯ'),
- (0x19D, 'M', u'ɲ'),
- (0x19E, 'V'),
- (0x19F, 'M', u'ɵ'),
- (0x1A0, 'M', u'ơ'),
- (0x1A1, 'V'),
- (0x1A2, 'M', u'ƣ'),
- (0x1A3, 'V'),
- (0x1A4, 'M', u'ƥ'),
- (0x1A5, 'V'),
- (0x1A6, 'M', u'ʀ'),
- (0x1A7, 'M', u'ƨ'),
- (0x1A8, 'V'),
- (0x1A9, 'M', u'ʃ'),
- (0x1AA, 'V'),
- (0x1AC, 'M', u'ƭ'),
- (0x1AD, 'V'),
- (0x1AE, 'M', u'ʈ'),
- (0x1AF, 'M', u'ư'),
- (0x1B0, 'V'),
- (0x1B1, 'M', u'ʊ'),
- (0x1B2, 'M', u'ʋ'),
- (0x1B3, 'M', u'ƴ'),
- (0x1B4, 'V'),
- (0x1B5, 'M', u'ƶ'),
- (0x1B6, 'V'),
- (0x1B7, 'M', u'ʒ'),
- (0x1B8, 'M', u'ƹ'),
- (0x1B9, 'V'),
- (0x1BC, 'M', u'ƽ'),
- (0x1BD, 'V'),
- (0x1C4, 'M', u'dž'),
- (0x1C7, 'M', u'lj'),
- (0x1CA, 'M', u'nj'),
- (0x1CD, 'M', u'ǎ'),
- (0x1CE, 'V'),
- (0x1CF, 'M', u'ǐ'),
- (0x1D0, 'V'),
- (0x1D1, 'M', u'ǒ'),
- (0x1D2, 'V'),
- (0x1D3, 'M', u'ǔ'),
- (0x1D4, 'V'),
- (0x1D5, 'M', u'ǖ'),
- (0x1D6, 'V'),
- (0x1D7, 'M', u'ǘ'),
- (0x1D8, 'V'),
- (0x1D9, 'M', u'ǚ'),
- (0x1DA, 'V'),
- (0x1DB, 'M', u'ǜ'),
- (0x1DC, 'V'),
- (0x1DE, 'M', u'ǟ'),
- (0x1DF, 'V'),
- (0x1E0, 'M', u'ǡ'),
- (0x1E1, 'V'),
- (0x1E2, 'M', u'ǣ'),
- (0x1E3, 'V'),
- (0x1E4, 'M', u'ǥ'),
- (0x1E5, 'V'),
- (0x1E6, 'M', u'ǧ'),
- (0x1E7, 'V'),
- (0x1E8, 'M', u'ǩ'),
- (0x1E9, 'V'),
- (0x1EA, 'M', u'ǫ'),
- (0x1EB, 'V'),
- (0x1EC, 'M', u'ǭ'),
- (0x1ED, 'V'),
- (0x1EE, 'M', u'ǯ'),
- (0x1EF, 'V'),
- (0x1F1, 'M', u'dz'),
- (0x1F4, 'M', u'ǵ'),
- (0x1F5, 'V'),
- (0x1F6, 'M', u'ƕ'),
- (0x1F7, 'M', u'ƿ'),
- (0x1F8, 'M', u'ǹ'),
- (0x1F9, 'V'),
- (0x1FA, 'M', u'ǻ'),
- (0x1FB, 'V'),
- (0x1FC, 'M', u'ǽ'),
- (0x1FD, 'V'),
- (0x1FE, 'M', u'ǿ'),
- (0x1FF, 'V'),
- (0x200, 'M', u'ȁ'),
- (0x201, 'V'),
- (0x202, 'M', u'ȃ'),
- (0x203, 'V'),
- (0x204, 'M', u'ȅ'),
- (0x205, 'V'),
- (0x206, 'M', u'ȇ'),
- (0x207, 'V'),
- (0x208, 'M', u'ȉ'),
- (0x209, 'V'),
- (0x20A, 'M', u'ȋ'),
- (0x20B, 'V'),
- (0x20C, 'M', u'ȍ'),
+ (0x194, "M", "ɣ"),
+ (0x195, "V"),
+ (0x196, "M", "ɩ"),
+ (0x197, "M", "ɨ"),
+ (0x198, "M", "ƙ"),
+ (0x199, "V"),
+ (0x19C, "M", "ɯ"),
+ (0x19D, "M", "ɲ"),
+ (0x19E, "V"),
+ (0x19F, "M", "ɵ"),
+ (0x1A0, "M", "ơ"),
+ (0x1A1, "V"),
+ (0x1A2, "M", "ƣ"),
+ (0x1A3, "V"),
+ (0x1A4, "M", "ƥ"),
+ (0x1A5, "V"),
+ (0x1A6, "M", "ʀ"),
+ (0x1A7, "M", "ƨ"),
+ (0x1A8, "V"),
+ (0x1A9, "M", "ʃ"),
+ (0x1AA, "V"),
+ (0x1AC, "M", "ƭ"),
+ (0x1AD, "V"),
+ (0x1AE, "M", "ʈ"),
+ (0x1AF, "M", "ư"),
+ (0x1B0, "V"),
+ (0x1B1, "M", "ʊ"),
+ (0x1B2, "M", "ʋ"),
+ (0x1B3, "M", "ƴ"),
+ (0x1B4, "V"),
+ (0x1B5, "M", "ƶ"),
+ (0x1B6, "V"),
+ (0x1B7, "M", "ʒ"),
+ (0x1B8, "M", "ƹ"),
+ (0x1B9, "V"),
+ (0x1BC, "M", "ƽ"),
+ (0x1BD, "V"),
+ (0x1C4, "M", "dž"),
+ (0x1C7, "M", "lj"),
+ (0x1CA, "M", "nj"),
+ (0x1CD, "M", "ǎ"),
+ (0x1CE, "V"),
+ (0x1CF, "M", "ǐ"),
+ (0x1D0, "V"),
+ (0x1D1, "M", "ǒ"),
+ (0x1D2, "V"),
+ (0x1D3, "M", "ǔ"),
+ (0x1D4, "V"),
+ (0x1D5, "M", "ǖ"),
+ (0x1D6, "V"),
+ (0x1D7, "M", "ǘ"),
+ (0x1D8, "V"),
+ (0x1D9, "M", "ǚ"),
+ (0x1DA, "V"),
+ (0x1DB, "M", "ǜ"),
+ (0x1DC, "V"),
+ (0x1DE, "M", "ǟ"),
+ (0x1DF, "V"),
+ (0x1E0, "M", "ǡ"),
+ (0x1E1, "V"),
+ (0x1E2, "M", "ǣ"),
+ (0x1E3, "V"),
+ (0x1E4, "M", "ǥ"),
+ (0x1E5, "V"),
+ (0x1E6, "M", "ǧ"),
+ (0x1E7, "V"),
+ (0x1E8, "M", "ǩ"),
+ (0x1E9, "V"),
+ (0x1EA, "M", "ǫ"),
+ (0x1EB, "V"),
+ (0x1EC, "M", "ǭ"),
+ (0x1ED, "V"),
+ (0x1EE, "M", "ǯ"),
+ (0x1EF, "V"),
+ (0x1F1, "M", "dz"),
+ (0x1F4, "M", "ǵ"),
+ (0x1F5, "V"),
+ (0x1F6, "M", "ƕ"),
+ (0x1F7, "M", "ƿ"),
+ (0x1F8, "M", "ǹ"),
+ (0x1F9, "V"),
+ (0x1FA, "M", "ǻ"),
+ (0x1FB, "V"),
+ (0x1FC, "M", "ǽ"),
+ (0x1FD, "V"),
+ (0x1FE, "M", "ǿ"),
+ (0x1FF, "V"),
+ (0x200, "M", "ȁ"),
+ (0x201, "V"),
+ (0x202, "M", "ȃ"),
+ (0x203, "V"),
+ (0x204, "M", "ȅ"),
+ (0x205, "V"),
+ (0x206, "M", "ȇ"),
+ (0x207, "V"),
+ (0x208, "M", "ȉ"),
+ (0x209, "V"),
+ (0x20A, "M", "ȋ"),
+ (0x20B, "V"),
+ (0x20C, "M", "ȍ"),
]
-def _seg_5():
+
+def _seg_5() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x20D, 'V'),
- (0x20E, 'M', u'ȏ'),
- (0x20F, 'V'),
- (0x210, 'M', u'ȑ'),
- (0x211, 'V'),
- (0x212, 'M', u'ȓ'),
- (0x213, 'V'),
- (0x214, 'M', u'ȕ'),
- (0x215, 'V'),
- (0x216, 'M', u'ȗ'),
- (0x217, 'V'),
- (0x218, 'M', u'ș'),
- (0x219, 'V'),
- (0x21A, 'M', u'ț'),
- (0x21B, 'V'),
- (0x21C, 'M', u'ȝ'),
- (0x21D, 'V'),
- (0x21E, 'M', u'ȟ'),
- (0x21F, 'V'),
- (0x220, 'M', u'ƞ'),
- (0x221, 'V'),
- (0x222, 'M', u'ȣ'),
- (0x223, 'V'),
- (0x224, 'M', u'ȥ'),
- (0x225, 'V'),
- (0x226, 'M', u'ȧ'),
- (0x227, 'V'),
- (0x228, 'M', u'ȩ'),
- (0x229, 'V'),
- (0x22A, 'M', u'ȫ'),
- (0x22B, 'V'),
- (0x22C, 'M', u'ȭ'),
- (0x22D, 'V'),
- (0x22E, 'M', u'ȯ'),
- (0x22F, 'V'),
- (0x230, 'M', u'ȱ'),
- (0x231, 'V'),
- (0x232, 'M', u'ȳ'),
- (0x233, 'V'),
- (0x23A, 'M', u'ⱥ'),
- (0x23B, 'M', u'ȼ'),
- (0x23C, 'V'),
- (0x23D, 'M', u'ƚ'),
- (0x23E, 'M', u'ⱦ'),
- (0x23F, 'V'),
- (0x241, 'M', u'ɂ'),
- (0x242, 'V'),
- (0x243, 'M', u'ƀ'),
- (0x244, 'M', u'ʉ'),
- (0x245, 'M', u'ʌ'),
- (0x246, 'M', u'ɇ'),
- (0x247, 'V'),
- (0x248, 'M', u'ɉ'),
- (0x249, 'V'),
- (0x24A, 'M', u'ɋ'),
- (0x24B, 'V'),
- (0x24C, 'M', u'ɍ'),
- (0x24D, 'V'),
- (0x24E, 'M', u'ɏ'),
- (0x24F, 'V'),
- (0x2B0, 'M', u'h'),
- (0x2B1, 'M', u'ɦ'),
- (0x2B2, 'M', u'j'),
- (0x2B3, 'M', u'r'),
- (0x2B4, 'M', u'ɹ'),
- (0x2B5, 'M', u'ɻ'),
- (0x2B6, 'M', u'ʁ'),
- (0x2B7, 'M', u'w'),
- (0x2B8, 'M', u'y'),
- (0x2B9, 'V'),
- (0x2D8, '3', u' ̆'),
- (0x2D9, '3', u' ̇'),
- (0x2DA, '3', u' ̊'),
- (0x2DB, '3', u' ̨'),
- (0x2DC, '3', u' ̃'),
- (0x2DD, '3', u' ̋'),
- (0x2DE, 'V'),
- (0x2E0, 'M', u'ɣ'),
- (0x2E1, 'M', u'l'),
- (0x2E2, 'M', u's'),
- (0x2E3, 'M', u'x'),
- (0x2E4, 'M', u'ʕ'),
- (0x2E5, 'V'),
- (0x340, 'M', u'̀'),
- (0x341, 'M', u'́'),
- (0x342, 'V'),
- (0x343, 'M', u'̓'),
- (0x344, 'M', u'̈́'),
- (0x345, 'M', u'ι'),
- (0x346, 'V'),
- (0x34F, 'I'),
- (0x350, 'V'),
- (0x370, 'M', u'ͱ'),
- (0x371, 'V'),
- (0x372, 'M', u'ͳ'),
- (0x373, 'V'),
- (0x374, 'M', u'ʹ'),
- (0x375, 'V'),
- (0x376, 'M', u'ͷ'),
- (0x377, 'V'),
+ (0x20D, "V"),
+ (0x20E, "M", "ȏ"),
+ (0x20F, "V"),
+ (0x210, "M", "ȑ"),
+ (0x211, "V"),
+ (0x212, "M", "ȓ"),
+ (0x213, "V"),
+ (0x214, "M", "ȕ"),
+ (0x215, "V"),
+ (0x216, "M", "ȗ"),
+ (0x217, "V"),
+ (0x218, "M", "ș"),
+ (0x219, "V"),
+ (0x21A, "M", "ț"),
+ (0x21B, "V"),
+ (0x21C, "M", "ȝ"),
+ (0x21D, "V"),
+ (0x21E, "M", "ȟ"),
+ (0x21F, "V"),
+ (0x220, "M", "ƞ"),
+ (0x221, "V"),
+ (0x222, "M", "ȣ"),
+ (0x223, "V"),
+ (0x224, "M", "ȥ"),
+ (0x225, "V"),
+ (0x226, "M", "ȧ"),
+ (0x227, "V"),
+ (0x228, "M", "ȩ"),
+ (0x229, "V"),
+ (0x22A, "M", "ȫ"),
+ (0x22B, "V"),
+ (0x22C, "M", "ȭ"),
+ (0x22D, "V"),
+ (0x22E, "M", "ȯ"),
+ (0x22F, "V"),
+ (0x230, "M", "ȱ"),
+ (0x231, "V"),
+ (0x232, "M", "ȳ"),
+ (0x233, "V"),
+ (0x23A, "M", "ⱥ"),
+ (0x23B, "M", "ȼ"),
+ (0x23C, "V"),
+ (0x23D, "M", "ƚ"),
+ (0x23E, "M", "ⱦ"),
+ (0x23F, "V"),
+ (0x241, "M", "ɂ"),
+ (0x242, "V"),
+ (0x243, "M", "ƀ"),
+ (0x244, "M", "ʉ"),
+ (0x245, "M", "ʌ"),
+ (0x246, "M", "ɇ"),
+ (0x247, "V"),
+ (0x248, "M", "ɉ"),
+ (0x249, "V"),
+ (0x24A, "M", "ɋ"),
+ (0x24B, "V"),
+ (0x24C, "M", "ɍ"),
+ (0x24D, "V"),
+ (0x24E, "M", "ɏ"),
+ (0x24F, "V"),
+ (0x2B0, "M", "h"),
+ (0x2B1, "M", "ɦ"),
+ (0x2B2, "M", "j"),
+ (0x2B3, "M", "r"),
+ (0x2B4, "M", "ɹ"),
+ (0x2B5, "M", "ɻ"),
+ (0x2B6, "M", "ʁ"),
+ (0x2B7, "M", "w"),
+ (0x2B8, "M", "y"),
+ (0x2B9, "V"),
+ (0x2D8, "3", " ̆"),
+ (0x2D9, "3", " ̇"),
+ (0x2DA, "3", " ̊"),
+ (0x2DB, "3", " ̨"),
+ (0x2DC, "3", " ̃"),
+ (0x2DD, "3", " ̋"),
+ (0x2DE, "V"),
+ (0x2E0, "M", "ɣ"),
+ (0x2E1, "M", "l"),
+ (0x2E2, "M", "s"),
+ (0x2E3, "M", "x"),
+ (0x2E4, "M", "ʕ"),
+ (0x2E5, "V"),
+ (0x340, "M", "̀"),
+ (0x341, "M", "́"),
+ (0x342, "V"),
+ (0x343, "M", "̓"),
+ (0x344, "M", "̈́"),
+ (0x345, "M", "ι"),
+ (0x346, "V"),
+ (0x34F, "I"),
+ (0x350, "V"),
+ (0x370, "M", "ͱ"),
+ (0x371, "V"),
+ (0x372, "M", "ͳ"),
+ (0x373, "V"),
+ (0x374, "M", "ʹ"),
+ (0x375, "V"),
+ (0x376, "M", "ͷ"),
+ (0x377, "V"),
]
-def _seg_6():
+
+def _seg_6() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x378, 'X'),
- (0x37A, '3', u' ι'),
- (0x37B, 'V'),
- (0x37E, '3', u';'),
- (0x37F, 'M', u'ϳ'),
- (0x380, 'X'),
- (0x384, '3', u' ́'),
- (0x385, '3', u' ̈́'),
- (0x386, 'M', u'ά'),
- (0x387, 'M', u'·'),
- (0x388, 'M', u'έ'),
- (0x389, 'M', u'ή'),
- (0x38A, 'M', u'ί'),
- (0x38B, 'X'),
- (0x38C, 'M', u'ό'),
- (0x38D, 'X'),
- (0x38E, 'M', u'ύ'),
- (0x38F, 'M', u'ώ'),
- (0x390, 'V'),
- (0x391, 'M', u'α'),
- (0x392, 'M', u'β'),
- (0x393, 'M', u'γ'),
- (0x394, 'M', u'δ'),
- (0x395, 'M', u'ε'),
- (0x396, 'M', u'ζ'),
- (0x397, 'M', u'η'),
- (0x398, 'M', u'θ'),
- (0x399, 'M', u'ι'),
- (0x39A, 'M', u'κ'),
- (0x39B, 'M', u'λ'),
- (0x39C, 'M', u'μ'),
- (0x39D, 'M', u'ν'),
- (0x39E, 'M', u'ξ'),
- (0x39F, 'M', u'ο'),
- (0x3A0, 'M', u'π'),
- (0x3A1, 'M', u'ρ'),
- (0x3A2, 'X'),
- (0x3A3, 'M', u'σ'),
- (0x3A4, 'M', u'τ'),
- (0x3A5, 'M', u'υ'),
- (0x3A6, 'M', u'φ'),
- (0x3A7, 'M', u'χ'),
- (0x3A8, 'M', u'ψ'),
- (0x3A9, 'M', u'ω'),
- (0x3AA, 'M', u'ϊ'),
- (0x3AB, 'M', u'ϋ'),
- (0x3AC, 'V'),
- (0x3C2, 'D', u'σ'),
- (0x3C3, 'V'),
- (0x3CF, 'M', u'ϗ'),
- (0x3D0, 'M', u'β'),
- (0x3D1, 'M', u'θ'),
- (0x3D2, 'M', u'υ'),
- (0x3D3, 'M', u'ύ'),
- (0x3D4, 'M', u'ϋ'),
- (0x3D5, 'M', u'φ'),
- (0x3D6, 'M', u'π'),
- (0x3D7, 'V'),
- (0x3D8, 'M', u'ϙ'),
- (0x3D9, 'V'),
- (0x3DA, 'M', u'ϛ'),
- (0x3DB, 'V'),
- (0x3DC, 'M', u'ϝ'),
- (0x3DD, 'V'),
- (0x3DE, 'M', u'ϟ'),
- (0x3DF, 'V'),
- (0x3E0, 'M', u'ϡ'),
- (0x3E1, 'V'),
- (0x3E2, 'M', u'ϣ'),
- (0x3E3, 'V'),
- (0x3E4, 'M', u'ϥ'),
- (0x3E5, 'V'),
- (0x3E6, 'M', u'ϧ'),
- (0x3E7, 'V'),
- (0x3E8, 'M', u'ϩ'),
- (0x3E9, 'V'),
- (0x3EA, 'M', u'ϫ'),
- (0x3EB, 'V'),
- (0x3EC, 'M', u'ϭ'),
- (0x3ED, 'V'),
- (0x3EE, 'M', u'ϯ'),
- (0x3EF, 'V'),
- (0x3F0, 'M', u'κ'),
- (0x3F1, 'M', u'ρ'),
- (0x3F2, 'M', u'σ'),
- (0x3F3, 'V'),
- (0x3F4, 'M', u'θ'),
- (0x3F5, 'M', u'ε'),
- (0x3F6, 'V'),
- (0x3F7, 'M', u'ϸ'),
- (0x3F8, 'V'),
- (0x3F9, 'M', u'σ'),
- (0x3FA, 'M', u'ϻ'),
- (0x3FB, 'V'),
- (0x3FD, 'M', u'ͻ'),
- (0x3FE, 'M', u'ͼ'),
- (0x3FF, 'M', u'ͽ'),
- (0x400, 'M', u'ѐ'),
- (0x401, 'M', u'ё'),
- (0x402, 'M', u'ђ'),
+ (0x378, "X"),
+ (0x37A, "3", " ι"),
+ (0x37B, "V"),
+ (0x37E, "3", ";"),
+ (0x37F, "M", "ϳ"),
+ (0x380, "X"),
+ (0x384, "3", " ́"),
+ (0x385, "3", " ̈́"),
+ (0x386, "M", "ά"),
+ (0x387, "M", "·"),
+ (0x388, "M", "έ"),
+ (0x389, "M", "ή"),
+ (0x38A, "M", "ί"),
+ (0x38B, "X"),
+ (0x38C, "M", "ό"),
+ (0x38D, "X"),
+ (0x38E, "M", "ύ"),
+ (0x38F, "M", "ώ"),
+ (0x390, "V"),
+ (0x391, "M", "α"),
+ (0x392, "M", "β"),
+ (0x393, "M", "γ"),
+ (0x394, "M", "δ"),
+ (0x395, "M", "ε"),
+ (0x396, "M", "ζ"),
+ (0x397, "M", "η"),
+ (0x398, "M", "θ"),
+ (0x399, "M", "ι"),
+ (0x39A, "M", "κ"),
+ (0x39B, "M", "λ"),
+ (0x39C, "M", "μ"),
+ (0x39D, "M", "ν"),
+ (0x39E, "M", "ξ"),
+ (0x39F, "M", "ο"),
+ (0x3A0, "M", "π"),
+ (0x3A1, "M", "ρ"),
+ (0x3A2, "X"),
+ (0x3A3, "M", "σ"),
+ (0x3A4, "M", "τ"),
+ (0x3A5, "M", "υ"),
+ (0x3A6, "M", "φ"),
+ (0x3A7, "M", "χ"),
+ (0x3A8, "M", "ψ"),
+ (0x3A9, "M", "ω"),
+ (0x3AA, "M", "ϊ"),
+ (0x3AB, "M", "ϋ"),
+ (0x3AC, "V"),
+ (0x3C2, "D", "σ"),
+ (0x3C3, "V"),
+ (0x3CF, "M", "ϗ"),
+ (0x3D0, "M", "β"),
+ (0x3D1, "M", "θ"),
+ (0x3D2, "M", "υ"),
+ (0x3D3, "M", "ύ"),
+ (0x3D4, "M", "ϋ"),
+ (0x3D5, "M", "φ"),
+ (0x3D6, "M", "π"),
+ (0x3D7, "V"),
+ (0x3D8, "M", "ϙ"),
+ (0x3D9, "V"),
+ (0x3DA, "M", "ϛ"),
+ (0x3DB, "V"),
+ (0x3DC, "M", "ϝ"),
+ (0x3DD, "V"),
+ (0x3DE, "M", "ϟ"),
+ (0x3DF, "V"),
+ (0x3E0, "M", "ϡ"),
+ (0x3E1, "V"),
+ (0x3E2, "M", "ϣ"),
+ (0x3E3, "V"),
+ (0x3E4, "M", "ϥ"),
+ (0x3E5, "V"),
+ (0x3E6, "M", "ϧ"),
+ (0x3E7, "V"),
+ (0x3E8, "M", "ϩ"),
+ (0x3E9, "V"),
+ (0x3EA, "M", "ϫ"),
+ (0x3EB, "V"),
+ (0x3EC, "M", "ϭ"),
+ (0x3ED, "V"),
+ (0x3EE, "M", "ϯ"),
+ (0x3EF, "V"),
+ (0x3F0, "M", "κ"),
+ (0x3F1, "M", "ρ"),
+ (0x3F2, "M", "σ"),
+ (0x3F3, "V"),
+ (0x3F4, "M", "θ"),
+ (0x3F5, "M", "ε"),
+ (0x3F6, "V"),
+ (0x3F7, "M", "ϸ"),
+ (0x3F8, "V"),
+ (0x3F9, "M", "σ"),
+ (0x3FA, "M", "ϻ"),
+ (0x3FB, "V"),
+ (0x3FD, "M", "ͻ"),
+ (0x3FE, "M", "ͼ"),
+ (0x3FF, "M", "ͽ"),
+ (0x400, "M", "ѐ"),
+ (0x401, "M", "ё"),
+ (0x402, "M", "ђ"),
]
-def _seg_7():
+
+def _seg_7() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x403, 'M', u'ѓ'),
- (0x404, 'M', u'є'),
- (0x405, 'M', u'ѕ'),
- (0x406, 'M', u'і'),
- (0x407, 'M', u'ї'),
- (0x408, 'M', u'ј'),
- (0x409, 'M', u'љ'),
- (0x40A, 'M', u'њ'),
- (0x40B, 'M', u'ћ'),
- (0x40C, 'M', u'ќ'),
- (0x40D, 'M', u'ѝ'),
- (0x40E, 'M', u'ў'),
- (0x40F, 'M', u'џ'),
- (0x410, 'M', u'а'),
- (0x411, 'M', u'б'),
- (0x412, 'M', u'в'),
- (0x413, 'M', u'г'),
- (0x414, 'M', u'д'),
- (0x415, 'M', u'е'),
- (0x416, 'M', u'ж'),
- (0x417, 'M', u'з'),
- (0x418, 'M', u'и'),
- (0x419, 'M', u'й'),
- (0x41A, 'M', u'к'),
- (0x41B, 'M', u'л'),
- (0x41C, 'M', u'м'),
- (0x41D, 'M', u'н'),
- (0x41E, 'M', u'о'),
- (0x41F, 'M', u'п'),
- (0x420, 'M', u'р'),
- (0x421, 'M', u'с'),
- (0x422, 'M', u'т'),
- (0x423, 'M', u'у'),
- (0x424, 'M', u'ф'),
- (0x425, 'M', u'х'),
- (0x426, 'M', u'ц'),
- (0x427, 'M', u'ч'),
- (0x428, 'M', u'ш'),
- (0x429, 'M', u'щ'),
- (0x42A, 'M', u'ъ'),
- (0x42B, 'M', u'ы'),
- (0x42C, 'M', u'ь'),
- (0x42D, 'M', u'э'),
- (0x42E, 'M', u'ю'),
- (0x42F, 'M', u'я'),
- (0x430, 'V'),
- (0x460, 'M', u'ѡ'),
- (0x461, 'V'),
- (0x462, 'M', u'ѣ'),
- (0x463, 'V'),
- (0x464, 'M', u'ѥ'),
- (0x465, 'V'),
- (0x466, 'M', u'ѧ'),
- (0x467, 'V'),
- (0x468, 'M', u'ѩ'),
- (0x469, 'V'),
- (0x46A, 'M', u'ѫ'),
- (0x46B, 'V'),
- (0x46C, 'M', u'ѭ'),
- (0x46D, 'V'),
- (0x46E, 'M', u'ѯ'),
- (0x46F, 'V'),
- (0x470, 'M', u'ѱ'),
- (0x471, 'V'),
- (0x472, 'M', u'ѳ'),
- (0x473, 'V'),
- (0x474, 'M', u'ѵ'),
- (0x475, 'V'),
- (0x476, 'M', u'ѷ'),
- (0x477, 'V'),
- (0x478, 'M', u'ѹ'),
- (0x479, 'V'),
- (0x47A, 'M', u'ѻ'),
- (0x47B, 'V'),
- (0x47C, 'M', u'ѽ'),
- (0x47D, 'V'),
- (0x47E, 'M', u'ѿ'),
- (0x47F, 'V'),
- (0x480, 'M', u'ҁ'),
- (0x481, 'V'),
- (0x48A, 'M', u'ҋ'),
- (0x48B, 'V'),
- (0x48C, 'M', u'ҍ'),
- (0x48D, 'V'),
- (0x48E, 'M', u'ҏ'),
- (0x48F, 'V'),
- (0x490, 'M', u'ґ'),
- (0x491, 'V'),
- (0x492, 'M', u'ғ'),
- (0x493, 'V'),
- (0x494, 'M', u'ҕ'),
- (0x495, 'V'),
- (0x496, 'M', u'җ'),
- (0x497, 'V'),
- (0x498, 'M', u'ҙ'),
- (0x499, 'V'),
- (0x49A, 'M', u'қ'),
- (0x49B, 'V'),
- (0x49C, 'M', u'ҝ'),
- (0x49D, 'V'),
+ (0x403, "M", "ѓ"),
+ (0x404, "M", "є"),
+ (0x405, "M", "ѕ"),
+ (0x406, "M", "і"),
+ (0x407, "M", "ї"),
+ (0x408, "M", "ј"),
+ (0x409, "M", "љ"),
+ (0x40A, "M", "њ"),
+ (0x40B, "M", "ћ"),
+ (0x40C, "M", "ќ"),
+ (0x40D, "M", "ѝ"),
+ (0x40E, "M", "ў"),
+ (0x40F, "M", "џ"),
+ (0x410, "M", "а"),
+ (0x411, "M", "б"),
+ (0x412, "M", "в"),
+ (0x413, "M", "г"),
+ (0x414, "M", "д"),
+ (0x415, "M", "е"),
+ (0x416, "M", "ж"),
+ (0x417, "M", "з"),
+ (0x418, "M", "и"),
+ (0x419, "M", "й"),
+ (0x41A, "M", "к"),
+ (0x41B, "M", "л"),
+ (0x41C, "M", "м"),
+ (0x41D, "M", "н"),
+ (0x41E, "M", "о"),
+ (0x41F, "M", "п"),
+ (0x420, "M", "р"),
+ (0x421, "M", "с"),
+ (0x422, "M", "т"),
+ (0x423, "M", "у"),
+ (0x424, "M", "ф"),
+ (0x425, "M", "х"),
+ (0x426, "M", "ц"),
+ (0x427, "M", "ч"),
+ (0x428, "M", "ш"),
+ (0x429, "M", "щ"),
+ (0x42A, "M", "ъ"),
+ (0x42B, "M", "ы"),
+ (0x42C, "M", "ь"),
+ (0x42D, "M", "э"),
+ (0x42E, "M", "ю"),
+ (0x42F, "M", "я"),
+ (0x430, "V"),
+ (0x460, "M", "ѡ"),
+ (0x461, "V"),
+ (0x462, "M", "ѣ"),
+ (0x463, "V"),
+ (0x464, "M", "ѥ"),
+ (0x465, "V"),
+ (0x466, "M", "ѧ"),
+ (0x467, "V"),
+ (0x468, "M", "ѩ"),
+ (0x469, "V"),
+ (0x46A, "M", "ѫ"),
+ (0x46B, "V"),
+ (0x46C, "M", "ѭ"),
+ (0x46D, "V"),
+ (0x46E, "M", "ѯ"),
+ (0x46F, "V"),
+ (0x470, "M", "ѱ"),
+ (0x471, "V"),
+ (0x472, "M", "ѳ"),
+ (0x473, "V"),
+ (0x474, "M", "ѵ"),
+ (0x475, "V"),
+ (0x476, "M", "ѷ"),
+ (0x477, "V"),
+ (0x478, "M", "ѹ"),
+ (0x479, "V"),
+ (0x47A, "M", "ѻ"),
+ (0x47B, "V"),
+ (0x47C, "M", "ѽ"),
+ (0x47D, "V"),
+ (0x47E, "M", "ѿ"),
+ (0x47F, "V"),
+ (0x480, "M", "ҁ"),
+ (0x481, "V"),
+ (0x48A, "M", "ҋ"),
+ (0x48B, "V"),
+ (0x48C, "M", "ҍ"),
+ (0x48D, "V"),
+ (0x48E, "M", "ҏ"),
+ (0x48F, "V"),
+ (0x490, "M", "ґ"),
+ (0x491, "V"),
+ (0x492, "M", "ғ"),
+ (0x493, "V"),
+ (0x494, "M", "ҕ"),
+ (0x495, "V"),
+ (0x496, "M", "җ"),
+ (0x497, "V"),
+ (0x498, "M", "ҙ"),
+ (0x499, "V"),
+ (0x49A, "M", "қ"),
+ (0x49B, "V"),
+ (0x49C, "M", "ҝ"),
+ (0x49D, "V"),
]
-def _seg_8():
+
+def _seg_8() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x49E, 'M', u'ҟ'),
- (0x49F, 'V'),
- (0x4A0, 'M', u'ҡ'),
- (0x4A1, 'V'),
- (0x4A2, 'M', u'ң'),
- (0x4A3, 'V'),
- (0x4A4, 'M', u'ҥ'),
- (0x4A5, 'V'),
- (0x4A6, 'M', u'ҧ'),
- (0x4A7, 'V'),
- (0x4A8, 'M', u'ҩ'),
- (0x4A9, 'V'),
- (0x4AA, 'M', u'ҫ'),
- (0x4AB, 'V'),
- (0x4AC, 'M', u'ҭ'),
- (0x4AD, 'V'),
- (0x4AE, 'M', u'ү'),
- (0x4AF, 'V'),
- (0x4B0, 'M', u'ұ'),
- (0x4B1, 'V'),
- (0x4B2, 'M', u'ҳ'),
- (0x4B3, 'V'),
- (0x4B4, 'M', u'ҵ'),
- (0x4B5, 'V'),
- (0x4B6, 'M', u'ҷ'),
- (0x4B7, 'V'),
- (0x4B8, 'M', u'ҹ'),
- (0x4B9, 'V'),
- (0x4BA, 'M', u'һ'),
- (0x4BB, 'V'),
- (0x4BC, 'M', u'ҽ'),
- (0x4BD, 'V'),
- (0x4BE, 'M', u'ҿ'),
- (0x4BF, 'V'),
- (0x4C0, 'X'),
- (0x4C1, 'M', u'ӂ'),
- (0x4C2, 'V'),
- (0x4C3, 'M', u'ӄ'),
- (0x4C4, 'V'),
- (0x4C5, 'M', u'ӆ'),
- (0x4C6, 'V'),
- (0x4C7, 'M', u'ӈ'),
- (0x4C8, 'V'),
- (0x4C9, 'M', u'ӊ'),
- (0x4CA, 'V'),
- (0x4CB, 'M', u'ӌ'),
- (0x4CC, 'V'),
- (0x4CD, 'M', u'ӎ'),
- (0x4CE, 'V'),
- (0x4D0, 'M', u'ӑ'),
- (0x4D1, 'V'),
- (0x4D2, 'M', u'ӓ'),
- (0x4D3, 'V'),
- (0x4D4, 'M', u'ӕ'),
- (0x4D5, 'V'),
- (0x4D6, 'M', u'ӗ'),
- (0x4D7, 'V'),
- (0x4D8, 'M', u'ә'),
- (0x4D9, 'V'),
- (0x4DA, 'M', u'ӛ'),
- (0x4DB, 'V'),
- (0x4DC, 'M', u'ӝ'),
- (0x4DD, 'V'),
- (0x4DE, 'M', u'ӟ'),
- (0x4DF, 'V'),
- (0x4E0, 'M', u'ӡ'),
- (0x4E1, 'V'),
- (0x4E2, 'M', u'ӣ'),
- (0x4E3, 'V'),
- (0x4E4, 'M', u'ӥ'),
- (0x4E5, 'V'),
- (0x4E6, 'M', u'ӧ'),
- (0x4E7, 'V'),
- (0x4E8, 'M', u'ө'),
- (0x4E9, 'V'),
- (0x4EA, 'M', u'ӫ'),
- (0x4EB, 'V'),
- (0x4EC, 'M', u'ӭ'),
- (0x4ED, 'V'),
- (0x4EE, 'M', u'ӯ'),
- (0x4EF, 'V'),
- (0x4F0, 'M', u'ӱ'),
- (0x4F1, 'V'),
- (0x4F2, 'M', u'ӳ'),
- (0x4F3, 'V'),
- (0x4F4, 'M', u'ӵ'),
- (0x4F5, 'V'),
- (0x4F6, 'M', u'ӷ'),
- (0x4F7, 'V'),
- (0x4F8, 'M', u'ӹ'),
- (0x4F9, 'V'),
- (0x4FA, 'M', u'ӻ'),
- (0x4FB, 'V'),
- (0x4FC, 'M', u'ӽ'),
- (0x4FD, 'V'),
- (0x4FE, 'M', u'ӿ'),
- (0x4FF, 'V'),
- (0x500, 'M', u'ԁ'),
- (0x501, 'V'),
- (0x502, 'M', u'ԃ'),
+ (0x49E, "M", "ҟ"),
+ (0x49F, "V"),
+ (0x4A0, "M", "ҡ"),
+ (0x4A1, "V"),
+ (0x4A2, "M", "ң"),
+ (0x4A3, "V"),
+ (0x4A4, "M", "ҥ"),
+ (0x4A5, "V"),
+ (0x4A6, "M", "ҧ"),
+ (0x4A7, "V"),
+ (0x4A8, "M", "ҩ"),
+ (0x4A9, "V"),
+ (0x4AA, "M", "ҫ"),
+ (0x4AB, "V"),
+ (0x4AC, "M", "ҭ"),
+ (0x4AD, "V"),
+ (0x4AE, "M", "ү"),
+ (0x4AF, "V"),
+ (0x4B0, "M", "ұ"),
+ (0x4B1, "V"),
+ (0x4B2, "M", "ҳ"),
+ (0x4B3, "V"),
+ (0x4B4, "M", "ҵ"),
+ (0x4B5, "V"),
+ (0x4B6, "M", "ҷ"),
+ (0x4B7, "V"),
+ (0x4B8, "M", "ҹ"),
+ (0x4B9, "V"),
+ (0x4BA, "M", "һ"),
+ (0x4BB, "V"),
+ (0x4BC, "M", "ҽ"),
+ (0x4BD, "V"),
+ (0x4BE, "M", "ҿ"),
+ (0x4BF, "V"),
+ (0x4C0, "X"),
+ (0x4C1, "M", "ӂ"),
+ (0x4C2, "V"),
+ (0x4C3, "M", "ӄ"),
+ (0x4C4, "V"),
+ (0x4C5, "M", "ӆ"),
+ (0x4C6, "V"),
+ (0x4C7, "M", "ӈ"),
+ (0x4C8, "V"),
+ (0x4C9, "M", "ӊ"),
+ (0x4CA, "V"),
+ (0x4CB, "M", "ӌ"),
+ (0x4CC, "V"),
+ (0x4CD, "M", "ӎ"),
+ (0x4CE, "V"),
+ (0x4D0, "M", "ӑ"),
+ (0x4D1, "V"),
+ (0x4D2, "M", "ӓ"),
+ (0x4D3, "V"),
+ (0x4D4, "M", "ӕ"),
+ (0x4D5, "V"),
+ (0x4D6, "M", "ӗ"),
+ (0x4D7, "V"),
+ (0x4D8, "M", "ә"),
+ (0x4D9, "V"),
+ (0x4DA, "M", "ӛ"),
+ (0x4DB, "V"),
+ (0x4DC, "M", "ӝ"),
+ (0x4DD, "V"),
+ (0x4DE, "M", "ӟ"),
+ (0x4DF, "V"),
+ (0x4E0, "M", "ӡ"),
+ (0x4E1, "V"),
+ (0x4E2, "M", "ӣ"),
+ (0x4E3, "V"),
+ (0x4E4, "M", "ӥ"),
+ (0x4E5, "V"),
+ (0x4E6, "M", "ӧ"),
+ (0x4E7, "V"),
+ (0x4E8, "M", "ө"),
+ (0x4E9, "V"),
+ (0x4EA, "M", "ӫ"),
+ (0x4EB, "V"),
+ (0x4EC, "M", "ӭ"),
+ (0x4ED, "V"),
+ (0x4EE, "M", "ӯ"),
+ (0x4EF, "V"),
+ (0x4F0, "M", "ӱ"),
+ (0x4F1, "V"),
+ (0x4F2, "M", "ӳ"),
+ (0x4F3, "V"),
+ (0x4F4, "M", "ӵ"),
+ (0x4F5, "V"),
+ (0x4F6, "M", "ӷ"),
+ (0x4F7, "V"),
+ (0x4F8, "M", "ӹ"),
+ (0x4F9, "V"),
+ (0x4FA, "M", "ӻ"),
+ (0x4FB, "V"),
+ (0x4FC, "M", "ӽ"),
+ (0x4FD, "V"),
+ (0x4FE, "M", "ӿ"),
+ (0x4FF, "V"),
+ (0x500, "M", "ԁ"),
+ (0x501, "V"),
+ (0x502, "M", "ԃ"),
]
-def _seg_9():
+
+def _seg_9() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x503, 'V'),
- (0x504, 'M', u'ԅ'),
- (0x505, 'V'),
- (0x506, 'M', u'ԇ'),
- (0x507, 'V'),
- (0x508, 'M', u'ԉ'),
- (0x509, 'V'),
- (0x50A, 'M', u'ԋ'),
- (0x50B, 'V'),
- (0x50C, 'M', u'ԍ'),
- (0x50D, 'V'),
- (0x50E, 'M', u'ԏ'),
- (0x50F, 'V'),
- (0x510, 'M', u'ԑ'),
- (0x511, 'V'),
- (0x512, 'M', u'ԓ'),
- (0x513, 'V'),
- (0x514, 'M', u'ԕ'),
- (0x515, 'V'),
- (0x516, 'M', u'ԗ'),
- (0x517, 'V'),
- (0x518, 'M', u'ԙ'),
- (0x519, 'V'),
- (0x51A, 'M', u'ԛ'),
- (0x51B, 'V'),
- (0x51C, 'M', u'ԝ'),
- (0x51D, 'V'),
- (0x51E, 'M', u'ԟ'),
- (0x51F, 'V'),
- (0x520, 'M', u'ԡ'),
- (0x521, 'V'),
- (0x522, 'M', u'ԣ'),
- (0x523, 'V'),
- (0x524, 'M', u'ԥ'),
- (0x525, 'V'),
- (0x526, 'M', u'ԧ'),
- (0x527, 'V'),
- (0x528, 'M', u'ԩ'),
- (0x529, 'V'),
- (0x52A, 'M', u'ԫ'),
- (0x52B, 'V'),
- (0x52C, 'M', u'ԭ'),
- (0x52D, 'V'),
- (0x52E, 'M', u'ԯ'),
- (0x52F, 'V'),
- (0x530, 'X'),
- (0x531, 'M', u'ա'),
- (0x532, 'M', u'բ'),
- (0x533, 'M', u'գ'),
- (0x534, 'M', u'դ'),
- (0x535, 'M', u'ե'),
- (0x536, 'M', u'զ'),
- (0x537, 'M', u'է'),
- (0x538, 'M', u'ը'),
- (0x539, 'M', u'թ'),
- (0x53A, 'M', u'ժ'),
- (0x53B, 'M', u'ի'),
- (0x53C, 'M', u'լ'),
- (0x53D, 'M', u'խ'),
- (0x53E, 'M', u'ծ'),
- (0x53F, 'M', u'կ'),
- (0x540, 'M', u'հ'),
- (0x541, 'M', u'ձ'),
- (0x542, 'M', u'ղ'),
- (0x543, 'M', u'ճ'),
- (0x544, 'M', u'մ'),
- (0x545, 'M', u'յ'),
- (0x546, 'M', u'ն'),
- (0x547, 'M', u'շ'),
- (0x548, 'M', u'ո'),
- (0x549, 'M', u'չ'),
- (0x54A, 'M', u'պ'),
- (0x54B, 'M', u'ջ'),
- (0x54C, 'M', u'ռ'),
- (0x54D, 'M', u'ս'),
- (0x54E, 'M', u'վ'),
- (0x54F, 'M', u'տ'),
- (0x550, 'M', u'ր'),
- (0x551, 'M', u'ց'),
- (0x552, 'M', u'ւ'),
- (0x553, 'M', u'փ'),
- (0x554, 'M', u'ք'),
- (0x555, 'M', u'օ'),
- (0x556, 'M', u'ֆ'),
- (0x557, 'X'),
- (0x559, 'V'),
- (0x587, 'M', u'եւ'),
- (0x588, 'V'),
- (0x58B, 'X'),
- (0x58D, 'V'),
- (0x590, 'X'),
- (0x591, 'V'),
- (0x5C8, 'X'),
- (0x5D0, 'V'),
- (0x5EB, 'X'),
- (0x5EF, 'V'),
- (0x5F5, 'X'),
- (0x606, 'V'),
- (0x61C, 'X'),
- (0x61E, 'V'),
+ (0x503, "V"),
+ (0x504, "M", "ԅ"),
+ (0x505, "V"),
+ (0x506, "M", "ԇ"),
+ (0x507, "V"),
+ (0x508, "M", "ԉ"),
+ (0x509, "V"),
+ (0x50A, "M", "ԋ"),
+ (0x50B, "V"),
+ (0x50C, "M", "ԍ"),
+ (0x50D, "V"),
+ (0x50E, "M", "ԏ"),
+ (0x50F, "V"),
+ (0x510, "M", "ԑ"),
+ (0x511, "V"),
+ (0x512, "M", "ԓ"),
+ (0x513, "V"),
+ (0x514, "M", "ԕ"),
+ (0x515, "V"),
+ (0x516, "M", "ԗ"),
+ (0x517, "V"),
+ (0x518, "M", "ԙ"),
+ (0x519, "V"),
+ (0x51A, "M", "ԛ"),
+ (0x51B, "V"),
+ (0x51C, "M", "ԝ"),
+ (0x51D, "V"),
+ (0x51E, "M", "ԟ"),
+ (0x51F, "V"),
+ (0x520, "M", "ԡ"),
+ (0x521, "V"),
+ (0x522, "M", "ԣ"),
+ (0x523, "V"),
+ (0x524, "M", "ԥ"),
+ (0x525, "V"),
+ (0x526, "M", "ԧ"),
+ (0x527, "V"),
+ (0x528, "M", "ԩ"),
+ (0x529, "V"),
+ (0x52A, "M", "ԫ"),
+ (0x52B, "V"),
+ (0x52C, "M", "ԭ"),
+ (0x52D, "V"),
+ (0x52E, "M", "ԯ"),
+ (0x52F, "V"),
+ (0x530, "X"),
+ (0x531, "M", "ա"),
+ (0x532, "M", "բ"),
+ (0x533, "M", "գ"),
+ (0x534, "M", "դ"),
+ (0x535, "M", "ե"),
+ (0x536, "M", "զ"),
+ (0x537, "M", "է"),
+ (0x538, "M", "ը"),
+ (0x539, "M", "թ"),
+ (0x53A, "M", "ժ"),
+ (0x53B, "M", "ի"),
+ (0x53C, "M", "լ"),
+ (0x53D, "M", "խ"),
+ (0x53E, "M", "ծ"),
+ (0x53F, "M", "կ"),
+ (0x540, "M", "հ"),
+ (0x541, "M", "ձ"),
+ (0x542, "M", "ղ"),
+ (0x543, "M", "ճ"),
+ (0x544, "M", "մ"),
+ (0x545, "M", "յ"),
+ (0x546, "M", "ն"),
+ (0x547, "M", "շ"),
+ (0x548, "M", "ո"),
+ (0x549, "M", "չ"),
+ (0x54A, "M", "պ"),
+ (0x54B, "M", "ջ"),
+ (0x54C, "M", "ռ"),
+ (0x54D, "M", "ս"),
+ (0x54E, "M", "վ"),
+ (0x54F, "M", "տ"),
+ (0x550, "M", "ր"),
+ (0x551, "M", "ց"),
+ (0x552, "M", "ւ"),
+ (0x553, "M", "փ"),
+ (0x554, "M", "ք"),
+ (0x555, "M", "օ"),
+ (0x556, "M", "ֆ"),
+ (0x557, "X"),
+ (0x559, "V"),
+ (0x587, "M", "եւ"),
+ (0x588, "V"),
+ (0x58B, "X"),
+ (0x58D, "V"),
+ (0x590, "X"),
+ (0x591, "V"),
+ (0x5C8, "X"),
+ (0x5D0, "V"),
+ (0x5EB, "X"),
+ (0x5EF, "V"),
+ (0x5F5, "X"),
+ (0x606, "V"),
+ (0x61C, "X"),
+ (0x61D, "V"),
]
-def _seg_10():
+
+def _seg_10() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x675, 'M', u'اٴ'),
- (0x676, 'M', u'وٴ'),
- (0x677, 'M', u'ۇٴ'),
- (0x678, 'M', u'يٴ'),
- (0x679, 'V'),
- (0x6DD, 'X'),
- (0x6DE, 'V'),
- (0x70E, 'X'),
- (0x710, 'V'),
- (0x74B, 'X'),
- (0x74D, 'V'),
- (0x7B2, 'X'),
- (0x7C0, 'V'),
- (0x7FB, 'X'),
- (0x7FD, 'V'),
- (0x82E, 'X'),
- (0x830, 'V'),
- (0x83F, 'X'),
- (0x840, 'V'),
- (0x85C, 'X'),
- (0x85E, 'V'),
- (0x85F, 'X'),
- (0x860, 'V'),
- (0x86B, 'X'),
- (0x8A0, 'V'),
- (0x8B5, 'X'),
- (0x8B6, 'V'),
- (0x8C8, 'X'),
- (0x8D3, 'V'),
- (0x8E2, 'X'),
- (0x8E3, 'V'),
- (0x958, 'M', u'क़'),
- (0x959, 'M', u'ख़'),
- (0x95A, 'M', u'ग़'),
- (0x95B, 'M', u'ज़'),
- (0x95C, 'M', u'ड़'),
- (0x95D, 'M', u'ढ़'),
- (0x95E, 'M', u'फ़'),
- (0x95F, 'M', u'य़'),
- (0x960, 'V'),
- (0x984, 'X'),
- (0x985, 'V'),
- (0x98D, 'X'),
- (0x98F, 'V'),
- (0x991, 'X'),
- (0x993, 'V'),
- (0x9A9, 'X'),
- (0x9AA, 'V'),
- (0x9B1, 'X'),
- (0x9B2, 'V'),
- (0x9B3, 'X'),
- (0x9B6, 'V'),
- (0x9BA, 'X'),
- (0x9BC, 'V'),
- (0x9C5, 'X'),
- (0x9C7, 'V'),
- (0x9C9, 'X'),
- (0x9CB, 'V'),
- (0x9CF, 'X'),
- (0x9D7, 'V'),
- (0x9D8, 'X'),
- (0x9DC, 'M', u'ড়'),
- (0x9DD, 'M', u'ঢ়'),
- (0x9DE, 'X'),
- (0x9DF, 'M', u'য়'),
- (0x9E0, 'V'),
- (0x9E4, 'X'),
- (0x9E6, 'V'),
- (0x9FF, 'X'),
- (0xA01, 'V'),
- (0xA04, 'X'),
- (0xA05, 'V'),
- (0xA0B, 'X'),
- (0xA0F, 'V'),
- (0xA11, 'X'),
- (0xA13, 'V'),
- (0xA29, 'X'),
- (0xA2A, 'V'),
- (0xA31, 'X'),
- (0xA32, 'V'),
- (0xA33, 'M', u'ਲ਼'),
- (0xA34, 'X'),
- (0xA35, 'V'),
- (0xA36, 'M', u'ਸ਼'),
- (0xA37, 'X'),
- (0xA38, 'V'),
- (0xA3A, 'X'),
- (0xA3C, 'V'),
- (0xA3D, 'X'),
- (0xA3E, 'V'),
- (0xA43, 'X'),
- (0xA47, 'V'),
- (0xA49, 'X'),
- (0xA4B, 'V'),
- (0xA4E, 'X'),
- (0xA51, 'V'),
- (0xA52, 'X'),
- (0xA59, 'M', u'ਖ਼'),
- (0xA5A, 'M', u'ਗ਼'),
- (0xA5B, 'M', u'ਜ਼'),
+ (0x675, "M", "اٴ"),
+ (0x676, "M", "وٴ"),
+ (0x677, "M", "ۇٴ"),
+ (0x678, "M", "يٴ"),
+ (0x679, "V"),
+ (0x6DD, "X"),
+ (0x6DE, "V"),
+ (0x70E, "X"),
+ (0x710, "V"),
+ (0x74B, "X"),
+ (0x74D, "V"),
+ (0x7B2, "X"),
+ (0x7C0, "V"),
+ (0x7FB, "X"),
+ (0x7FD, "V"),
+ (0x82E, "X"),
+ (0x830, "V"),
+ (0x83F, "X"),
+ (0x840, "V"),
+ (0x85C, "X"),
+ (0x85E, "V"),
+ (0x85F, "X"),
+ (0x860, "V"),
+ (0x86B, "X"),
+ (0x870, "V"),
+ (0x88F, "X"),
+ (0x898, "V"),
+ (0x8E2, "X"),
+ (0x8E3, "V"),
+ (0x958, "M", "क़"),
+ (0x959, "M", "ख़"),
+ (0x95A, "M", "ग़"),
+ (0x95B, "M", "ज़"),
+ (0x95C, "M", "ड़"),
+ (0x95D, "M", "ढ़"),
+ (0x95E, "M", "फ़"),
+ (0x95F, "M", "य़"),
+ (0x960, "V"),
+ (0x984, "X"),
+ (0x985, "V"),
+ (0x98D, "X"),
+ (0x98F, "V"),
+ (0x991, "X"),
+ (0x993, "V"),
+ (0x9A9, "X"),
+ (0x9AA, "V"),
+ (0x9B1, "X"),
+ (0x9B2, "V"),
+ (0x9B3, "X"),
+ (0x9B6, "V"),
+ (0x9BA, "X"),
+ (0x9BC, "V"),
+ (0x9C5, "X"),
+ (0x9C7, "V"),
+ (0x9C9, "X"),
+ (0x9CB, "V"),
+ (0x9CF, "X"),
+ (0x9D7, "V"),
+ (0x9D8, "X"),
+ (0x9DC, "M", "ড়"),
+ (0x9DD, "M", "ঢ়"),
+ (0x9DE, "X"),
+ (0x9DF, "M", "য়"),
+ (0x9E0, "V"),
+ (0x9E4, "X"),
+ (0x9E6, "V"),
+ (0x9FF, "X"),
+ (0xA01, "V"),
+ (0xA04, "X"),
+ (0xA05, "V"),
+ (0xA0B, "X"),
+ (0xA0F, "V"),
+ (0xA11, "X"),
+ (0xA13, "V"),
+ (0xA29, "X"),
+ (0xA2A, "V"),
+ (0xA31, "X"),
+ (0xA32, "V"),
+ (0xA33, "M", "ਲ਼"),
+ (0xA34, "X"),
+ (0xA35, "V"),
+ (0xA36, "M", "ਸ਼"),
+ (0xA37, "X"),
+ (0xA38, "V"),
+ (0xA3A, "X"),
+ (0xA3C, "V"),
+ (0xA3D, "X"),
+ (0xA3E, "V"),
+ (0xA43, "X"),
+ (0xA47, "V"),
+ (0xA49, "X"),
+ (0xA4B, "V"),
+ (0xA4E, "X"),
+ (0xA51, "V"),
+ (0xA52, "X"),
+ (0xA59, "M", "ਖ਼"),
+ (0xA5A, "M", "ਗ਼"),
+ (0xA5B, "M", "ਜ਼"),
+ (0xA5C, "V"),
+ (0xA5D, "X"),
]
-def _seg_11():
+
+def _seg_11() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0xA5C, 'V'),
- (0xA5D, 'X'),
- (0xA5E, 'M', u'ਫ਼'),
- (0xA5F, 'X'),
- (0xA66, 'V'),
- (0xA77, 'X'),
- (0xA81, 'V'),
- (0xA84, 'X'),
- (0xA85, 'V'),
- (0xA8E, 'X'),
- (0xA8F, 'V'),
- (0xA92, 'X'),
- (0xA93, 'V'),
- (0xAA9, 'X'),
- (0xAAA, 'V'),
- (0xAB1, 'X'),
- (0xAB2, 'V'),
- (0xAB4, 'X'),
- (0xAB5, 'V'),
- (0xABA, 'X'),
- (0xABC, 'V'),
- (0xAC6, 'X'),
- (0xAC7, 'V'),
- (0xACA, 'X'),
- (0xACB, 'V'),
- (0xACE, 'X'),
- (0xAD0, 'V'),
- (0xAD1, 'X'),
- (0xAE0, 'V'),
- (0xAE4, 'X'),
- (0xAE6, 'V'),
- (0xAF2, 'X'),
- (0xAF9, 'V'),
- (0xB00, 'X'),
- (0xB01, 'V'),
- (0xB04, 'X'),
- (0xB05, 'V'),
- (0xB0D, 'X'),
- (0xB0F, 'V'),
- (0xB11, 'X'),
- (0xB13, 'V'),
- (0xB29, 'X'),
- (0xB2A, 'V'),
- (0xB31, 'X'),
- (0xB32, 'V'),
- (0xB34, 'X'),
- (0xB35, 'V'),
- (0xB3A, 'X'),
- (0xB3C, 'V'),
- (0xB45, 'X'),
- (0xB47, 'V'),
- (0xB49, 'X'),
- (0xB4B, 'V'),
- (0xB4E, 'X'),
- (0xB55, 'V'),
- (0xB58, 'X'),
- (0xB5C, 'M', u'ଡ଼'),
- (0xB5D, 'M', u'ଢ଼'),
- (0xB5E, 'X'),
- (0xB5F, 'V'),
- (0xB64, 'X'),
- (0xB66, 'V'),
- (0xB78, 'X'),
- (0xB82, 'V'),
- (0xB84, 'X'),
- (0xB85, 'V'),
- (0xB8B, 'X'),
- (0xB8E, 'V'),
- (0xB91, 'X'),
- (0xB92, 'V'),
- (0xB96, 'X'),
- (0xB99, 'V'),
- (0xB9B, 'X'),
- (0xB9C, 'V'),
- (0xB9D, 'X'),
- (0xB9E, 'V'),
- (0xBA0, 'X'),
- (0xBA3, 'V'),
- (0xBA5, 'X'),
- (0xBA8, 'V'),
- (0xBAB, 'X'),
- (0xBAE, 'V'),
- (0xBBA, 'X'),
- (0xBBE, 'V'),
- (0xBC3, 'X'),
- (0xBC6, 'V'),
- (0xBC9, 'X'),
- (0xBCA, 'V'),
- (0xBCE, 'X'),
- (0xBD0, 'V'),
- (0xBD1, 'X'),
- (0xBD7, 'V'),
- (0xBD8, 'X'),
- (0xBE6, 'V'),
- (0xBFB, 'X'),
- (0xC00, 'V'),
- (0xC0D, 'X'),
- (0xC0E, 'V'),
- (0xC11, 'X'),
- (0xC12, 'V'),
+ (0xA5E, "M", "ਫ਼"),
+ (0xA5F, "X"),
+ (0xA66, "V"),
+ (0xA77, "X"),
+ (0xA81, "V"),
+ (0xA84, "X"),
+ (0xA85, "V"),
+ (0xA8E, "X"),
+ (0xA8F, "V"),
+ (0xA92, "X"),
+ (0xA93, "V"),
+ (0xAA9, "X"),
+ (0xAAA, "V"),
+ (0xAB1, "X"),
+ (0xAB2, "V"),
+ (0xAB4, "X"),
+ (0xAB5, "V"),
+ (0xABA, "X"),
+ (0xABC, "V"),
+ (0xAC6, "X"),
+ (0xAC7, "V"),
+ (0xACA, "X"),
+ (0xACB, "V"),
+ (0xACE, "X"),
+ (0xAD0, "V"),
+ (0xAD1, "X"),
+ (0xAE0, "V"),
+ (0xAE4, "X"),
+ (0xAE6, "V"),
+ (0xAF2, "X"),
+ (0xAF9, "V"),
+ (0xB00, "X"),
+ (0xB01, "V"),
+ (0xB04, "X"),
+ (0xB05, "V"),
+ (0xB0D, "X"),
+ (0xB0F, "V"),
+ (0xB11, "X"),
+ (0xB13, "V"),
+ (0xB29, "X"),
+ (0xB2A, "V"),
+ (0xB31, "X"),
+ (0xB32, "V"),
+ (0xB34, "X"),
+ (0xB35, "V"),
+ (0xB3A, "X"),
+ (0xB3C, "V"),
+ (0xB45, "X"),
+ (0xB47, "V"),
+ (0xB49, "X"),
+ (0xB4B, "V"),
+ (0xB4E, "X"),
+ (0xB55, "V"),
+ (0xB58, "X"),
+ (0xB5C, "M", "ଡ଼"),
+ (0xB5D, "M", "ଢ଼"),
+ (0xB5E, "X"),
+ (0xB5F, "V"),
+ (0xB64, "X"),
+ (0xB66, "V"),
+ (0xB78, "X"),
+ (0xB82, "V"),
+ (0xB84, "X"),
+ (0xB85, "V"),
+ (0xB8B, "X"),
+ (0xB8E, "V"),
+ (0xB91, "X"),
+ (0xB92, "V"),
+ (0xB96, "X"),
+ (0xB99, "V"),
+ (0xB9B, "X"),
+ (0xB9C, "V"),
+ (0xB9D, "X"),
+ (0xB9E, "V"),
+ (0xBA0, "X"),
+ (0xBA3, "V"),
+ (0xBA5, "X"),
+ (0xBA8, "V"),
+ (0xBAB, "X"),
+ (0xBAE, "V"),
+ (0xBBA, "X"),
+ (0xBBE, "V"),
+ (0xBC3, "X"),
+ (0xBC6, "V"),
+ (0xBC9, "X"),
+ (0xBCA, "V"),
+ (0xBCE, "X"),
+ (0xBD0, "V"),
+ (0xBD1, "X"),
+ (0xBD7, "V"),
+ (0xBD8, "X"),
+ (0xBE6, "V"),
+ (0xBFB, "X"),
+ (0xC00, "V"),
+ (0xC0D, "X"),
+ (0xC0E, "V"),
+ (0xC11, "X"),
+ (0xC12, "V"),
+ (0xC29, "X"),
+ (0xC2A, "V"),
]
-def _seg_12():
+
+def _seg_12() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0xC29, 'X'),
- (0xC2A, 'V'),
- (0xC3A, 'X'),
- (0xC3D, 'V'),
- (0xC45, 'X'),
- (0xC46, 'V'),
- (0xC49, 'X'),
- (0xC4A, 'V'),
- (0xC4E, 'X'),
- (0xC55, 'V'),
- (0xC57, 'X'),
- (0xC58, 'V'),
- (0xC5B, 'X'),
- (0xC60, 'V'),
- (0xC64, 'X'),
- (0xC66, 'V'),
- (0xC70, 'X'),
- (0xC77, 'V'),
- (0xC8D, 'X'),
- (0xC8E, 'V'),
- (0xC91, 'X'),
- (0xC92, 'V'),
- (0xCA9, 'X'),
- (0xCAA, 'V'),
- (0xCB4, 'X'),
- (0xCB5, 'V'),
- (0xCBA, 'X'),
- (0xCBC, 'V'),
- (0xCC5, 'X'),
- (0xCC6, 'V'),
- (0xCC9, 'X'),
- (0xCCA, 'V'),
- (0xCCE, 'X'),
- (0xCD5, 'V'),
- (0xCD7, 'X'),
- (0xCDE, 'V'),
- (0xCDF, 'X'),
- (0xCE0, 'V'),
- (0xCE4, 'X'),
- (0xCE6, 'V'),
- (0xCF0, 'X'),
- (0xCF1, 'V'),
- (0xCF3, 'X'),
- (0xD00, 'V'),
- (0xD0D, 'X'),
- (0xD0E, 'V'),
- (0xD11, 'X'),
- (0xD12, 'V'),
- (0xD45, 'X'),
- (0xD46, 'V'),
- (0xD49, 'X'),
- (0xD4A, 'V'),
- (0xD50, 'X'),
- (0xD54, 'V'),
- (0xD64, 'X'),
- (0xD66, 'V'),
- (0xD80, 'X'),
- (0xD81, 'V'),
- (0xD84, 'X'),
- (0xD85, 'V'),
- (0xD97, 'X'),
- (0xD9A, 'V'),
- (0xDB2, 'X'),
- (0xDB3, 'V'),
- (0xDBC, 'X'),
- (0xDBD, 'V'),
- (0xDBE, 'X'),
- (0xDC0, 'V'),
- (0xDC7, 'X'),
- (0xDCA, 'V'),
- (0xDCB, 'X'),
- (0xDCF, 'V'),
- (0xDD5, 'X'),
- (0xDD6, 'V'),
- (0xDD7, 'X'),
- (0xDD8, 'V'),
- (0xDE0, 'X'),
- (0xDE6, 'V'),
- (0xDF0, 'X'),
- (0xDF2, 'V'),
- (0xDF5, 'X'),
- (0xE01, 'V'),
- (0xE33, 'M', u'ํา'),
- (0xE34, 'V'),
- (0xE3B, 'X'),
- (0xE3F, 'V'),
- (0xE5C, 'X'),
- (0xE81, 'V'),
- (0xE83, 'X'),
- (0xE84, 'V'),
- (0xE85, 'X'),
- (0xE86, 'V'),
- (0xE8B, 'X'),
- (0xE8C, 'V'),
- (0xEA4, 'X'),
- (0xEA5, 'V'),
- (0xEA6, 'X'),
- (0xEA7, 'V'),
- (0xEB3, 'M', u'ໍາ'),
- (0xEB4, 'V'),
+ (0xC3A, "X"),
+ (0xC3C, "V"),
+ (0xC45, "X"),
+ (0xC46, "V"),
+ (0xC49, "X"),
+ (0xC4A, "V"),
+ (0xC4E, "X"),
+ (0xC55, "V"),
+ (0xC57, "X"),
+ (0xC58, "V"),
+ (0xC5B, "X"),
+ (0xC5D, "V"),
+ (0xC5E, "X"),
+ (0xC60, "V"),
+ (0xC64, "X"),
+ (0xC66, "V"),
+ (0xC70, "X"),
+ (0xC77, "V"),
+ (0xC8D, "X"),
+ (0xC8E, "V"),
+ (0xC91, "X"),
+ (0xC92, "V"),
+ (0xCA9, "X"),
+ (0xCAA, "V"),
+ (0xCB4, "X"),
+ (0xCB5, "V"),
+ (0xCBA, "X"),
+ (0xCBC, "V"),
+ (0xCC5, "X"),
+ (0xCC6, "V"),
+ (0xCC9, "X"),
+ (0xCCA, "V"),
+ (0xCCE, "X"),
+ (0xCD5, "V"),
+ (0xCD7, "X"),
+ (0xCDD, "V"),
+ (0xCDF, "X"),
+ (0xCE0, "V"),
+ (0xCE4, "X"),
+ (0xCE6, "V"),
+ (0xCF0, "X"),
+ (0xCF1, "V"),
+ (0xCF4, "X"),
+ (0xD00, "V"),
+ (0xD0D, "X"),
+ (0xD0E, "V"),
+ (0xD11, "X"),
+ (0xD12, "V"),
+ (0xD45, "X"),
+ (0xD46, "V"),
+ (0xD49, "X"),
+ (0xD4A, "V"),
+ (0xD50, "X"),
+ (0xD54, "V"),
+ (0xD64, "X"),
+ (0xD66, "V"),
+ (0xD80, "X"),
+ (0xD81, "V"),
+ (0xD84, "X"),
+ (0xD85, "V"),
+ (0xD97, "X"),
+ (0xD9A, "V"),
+ (0xDB2, "X"),
+ (0xDB3, "V"),
+ (0xDBC, "X"),
+ (0xDBD, "V"),
+ (0xDBE, "X"),
+ (0xDC0, "V"),
+ (0xDC7, "X"),
+ (0xDCA, "V"),
+ (0xDCB, "X"),
+ (0xDCF, "V"),
+ (0xDD5, "X"),
+ (0xDD6, "V"),
+ (0xDD7, "X"),
+ (0xDD8, "V"),
+ (0xDE0, "X"),
+ (0xDE6, "V"),
+ (0xDF0, "X"),
+ (0xDF2, "V"),
+ (0xDF5, "X"),
+ (0xE01, "V"),
+ (0xE33, "M", "ํา"),
+ (0xE34, "V"),
+ (0xE3B, "X"),
+ (0xE3F, "V"),
+ (0xE5C, "X"),
+ (0xE81, "V"),
+ (0xE83, "X"),
+ (0xE84, "V"),
+ (0xE85, "X"),
+ (0xE86, "V"),
+ (0xE8B, "X"),
+ (0xE8C, "V"),
+ (0xEA4, "X"),
+ (0xEA5, "V"),
+ (0xEA6, "X"),
+ (0xEA7, "V"),
+ (0xEB3, "M", "ໍາ"),
+ (0xEB4, "V"),
]
-def _seg_13():
+
+def _seg_13() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0xEBE, 'X'),
- (0xEC0, 'V'),
- (0xEC5, 'X'),
- (0xEC6, 'V'),
- (0xEC7, 'X'),
- (0xEC8, 'V'),
- (0xECE, 'X'),
- (0xED0, 'V'),
- (0xEDA, 'X'),
- (0xEDC, 'M', u'ຫນ'),
- (0xEDD, 'M', u'ຫມ'),
- (0xEDE, 'V'),
- (0xEE0, 'X'),
- (0xF00, 'V'),
- (0xF0C, 'M', u'་'),
- (0xF0D, 'V'),
- (0xF43, 'M', u'གྷ'),
- (0xF44, 'V'),
- (0xF48, 'X'),
- (0xF49, 'V'),
- (0xF4D, 'M', u'ཌྷ'),
- (0xF4E, 'V'),
- (0xF52, 'M', u'དྷ'),
- (0xF53, 'V'),
- (0xF57, 'M', u'བྷ'),
- (0xF58, 'V'),
- (0xF5C, 'M', u'ཛྷ'),
- (0xF5D, 'V'),
- (0xF69, 'M', u'ཀྵ'),
- (0xF6A, 'V'),
- (0xF6D, 'X'),
- (0xF71, 'V'),
- (0xF73, 'M', u'ཱི'),
- (0xF74, 'V'),
- (0xF75, 'M', u'ཱུ'),
- (0xF76, 'M', u'ྲྀ'),
- (0xF77, 'M', u'ྲཱྀ'),
- (0xF78, 'M', u'ླྀ'),
- (0xF79, 'M', u'ླཱྀ'),
- (0xF7A, 'V'),
- (0xF81, 'M', u'ཱྀ'),
- (0xF82, 'V'),
- (0xF93, 'M', u'ྒྷ'),
- (0xF94, 'V'),
- (0xF98, 'X'),
- (0xF99, 'V'),
- (0xF9D, 'M', u'ྜྷ'),
- (0xF9E, 'V'),
- (0xFA2, 'M', u'ྡྷ'),
- (0xFA3, 'V'),
- (0xFA7, 'M', u'ྦྷ'),
- (0xFA8, 'V'),
- (0xFAC, 'M', u'ྫྷ'),
- (0xFAD, 'V'),
- (0xFB9, 'M', u'ྐྵ'),
- (0xFBA, 'V'),
- (0xFBD, 'X'),
- (0xFBE, 'V'),
- (0xFCD, 'X'),
- (0xFCE, 'V'),
- (0xFDB, 'X'),
- (0x1000, 'V'),
- (0x10A0, 'X'),
- (0x10C7, 'M', u'ⴧ'),
- (0x10C8, 'X'),
- (0x10CD, 'M', u'ⴭ'),
- (0x10CE, 'X'),
- (0x10D0, 'V'),
- (0x10FC, 'M', u'ნ'),
- (0x10FD, 'V'),
- (0x115F, 'X'),
- (0x1161, 'V'),
- (0x1249, 'X'),
- (0x124A, 'V'),
- (0x124E, 'X'),
- (0x1250, 'V'),
- (0x1257, 'X'),
- (0x1258, 'V'),
- (0x1259, 'X'),
- (0x125A, 'V'),
- (0x125E, 'X'),
- (0x1260, 'V'),
- (0x1289, 'X'),
- (0x128A, 'V'),
- (0x128E, 'X'),
- (0x1290, 'V'),
- (0x12B1, 'X'),
- (0x12B2, 'V'),
- (0x12B6, 'X'),
- (0x12B8, 'V'),
- (0x12BF, 'X'),
- (0x12C0, 'V'),
- (0x12C1, 'X'),
- (0x12C2, 'V'),
- (0x12C6, 'X'),
- (0x12C8, 'V'),
- (0x12D7, 'X'),
- (0x12D8, 'V'),
- (0x1311, 'X'),
- (0x1312, 'V'),
+ (0xEBE, "X"),
+ (0xEC0, "V"),
+ (0xEC5, "X"),
+ (0xEC6, "V"),
+ (0xEC7, "X"),
+ (0xEC8, "V"),
+ (0xECF, "X"),
+ (0xED0, "V"),
+ (0xEDA, "X"),
+ (0xEDC, "M", "ຫນ"),
+ (0xEDD, "M", "ຫມ"),
+ (0xEDE, "V"),
+ (0xEE0, "X"),
+ (0xF00, "V"),
+ (0xF0C, "M", "་"),
+ (0xF0D, "V"),
+ (0xF43, "M", "གྷ"),
+ (0xF44, "V"),
+ (0xF48, "X"),
+ (0xF49, "V"),
+ (0xF4D, "M", "ཌྷ"),
+ (0xF4E, "V"),
+ (0xF52, "M", "དྷ"),
+ (0xF53, "V"),
+ (0xF57, "M", "བྷ"),
+ (0xF58, "V"),
+ (0xF5C, "M", "ཛྷ"),
+ (0xF5D, "V"),
+ (0xF69, "M", "ཀྵ"),
+ (0xF6A, "V"),
+ (0xF6D, "X"),
+ (0xF71, "V"),
+ (0xF73, "M", "ཱི"),
+ (0xF74, "V"),
+ (0xF75, "M", "ཱུ"),
+ (0xF76, "M", "ྲྀ"),
+ (0xF77, "M", "ྲཱྀ"),
+ (0xF78, "M", "ླྀ"),
+ (0xF79, "M", "ླཱྀ"),
+ (0xF7A, "V"),
+ (0xF81, "M", "ཱྀ"),
+ (0xF82, "V"),
+ (0xF93, "M", "ྒྷ"),
+ (0xF94, "V"),
+ (0xF98, "X"),
+ (0xF99, "V"),
+ (0xF9D, "M", "ྜྷ"),
+ (0xF9E, "V"),
+ (0xFA2, "M", "ྡྷ"),
+ (0xFA3, "V"),
+ (0xFA7, "M", "ྦྷ"),
+ (0xFA8, "V"),
+ (0xFAC, "M", "ྫྷ"),
+ (0xFAD, "V"),
+ (0xFB9, "M", "ྐྵ"),
+ (0xFBA, "V"),
+ (0xFBD, "X"),
+ (0xFBE, "V"),
+ (0xFCD, "X"),
+ (0xFCE, "V"),
+ (0xFDB, "X"),
+ (0x1000, "V"),
+ (0x10A0, "X"),
+ (0x10C7, "M", "ⴧ"),
+ (0x10C8, "X"),
+ (0x10CD, "M", "ⴭ"),
+ (0x10CE, "X"),
+ (0x10D0, "V"),
+ (0x10FC, "M", "ნ"),
+ (0x10FD, "V"),
+ (0x115F, "X"),
+ (0x1161, "V"),
+ (0x1249, "X"),
+ (0x124A, "V"),
+ (0x124E, "X"),
+ (0x1250, "V"),
+ (0x1257, "X"),
+ (0x1258, "V"),
+ (0x1259, "X"),
+ (0x125A, "V"),
+ (0x125E, "X"),
+ (0x1260, "V"),
+ (0x1289, "X"),
+ (0x128A, "V"),
+ (0x128E, "X"),
+ (0x1290, "V"),
+ (0x12B1, "X"),
+ (0x12B2, "V"),
+ (0x12B6, "X"),
+ (0x12B8, "V"),
+ (0x12BF, "X"),
+ (0x12C0, "V"),
+ (0x12C1, "X"),
+ (0x12C2, "V"),
+ (0x12C6, "X"),
+ (0x12C8, "V"),
+ (0x12D7, "X"),
+ (0x12D8, "V"),
+ (0x1311, "X"),
+ (0x1312, "V"),
]
-def _seg_14():
+
+def _seg_14() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x1316, 'X'),
- (0x1318, 'V'),
- (0x135B, 'X'),
- (0x135D, 'V'),
- (0x137D, 'X'),
- (0x1380, 'V'),
- (0x139A, 'X'),
- (0x13A0, 'V'),
- (0x13F6, 'X'),
- (0x13F8, 'M', u'Ᏸ'),
- (0x13F9, 'M', u'Ᏹ'),
- (0x13FA, 'M', u'Ᏺ'),
- (0x13FB, 'M', u'Ᏻ'),
- (0x13FC, 'M', u'Ᏼ'),
- (0x13FD, 'M', u'Ᏽ'),
- (0x13FE, 'X'),
- (0x1400, 'V'),
- (0x1680, 'X'),
- (0x1681, 'V'),
- (0x169D, 'X'),
- (0x16A0, 'V'),
- (0x16F9, 'X'),
- (0x1700, 'V'),
- (0x170D, 'X'),
- (0x170E, 'V'),
- (0x1715, 'X'),
- (0x1720, 'V'),
- (0x1737, 'X'),
- (0x1740, 'V'),
- (0x1754, 'X'),
- (0x1760, 'V'),
- (0x176D, 'X'),
- (0x176E, 'V'),
- (0x1771, 'X'),
- (0x1772, 'V'),
- (0x1774, 'X'),
- (0x1780, 'V'),
- (0x17B4, 'X'),
- (0x17B6, 'V'),
- (0x17DE, 'X'),
- (0x17E0, 'V'),
- (0x17EA, 'X'),
- (0x17F0, 'V'),
- (0x17FA, 'X'),
- (0x1800, 'V'),
- (0x1806, 'X'),
- (0x1807, 'V'),
- (0x180B, 'I'),
- (0x180E, 'X'),
- (0x1810, 'V'),
- (0x181A, 'X'),
- (0x1820, 'V'),
- (0x1879, 'X'),
- (0x1880, 'V'),
- (0x18AB, 'X'),
- (0x18B0, 'V'),
- (0x18F6, 'X'),
- (0x1900, 'V'),
- (0x191F, 'X'),
- (0x1920, 'V'),
- (0x192C, 'X'),
- (0x1930, 'V'),
- (0x193C, 'X'),
- (0x1940, 'V'),
- (0x1941, 'X'),
- (0x1944, 'V'),
- (0x196E, 'X'),
- (0x1970, 'V'),
- (0x1975, 'X'),
- (0x1980, 'V'),
- (0x19AC, 'X'),
- (0x19B0, 'V'),
- (0x19CA, 'X'),
- (0x19D0, 'V'),
- (0x19DB, 'X'),
- (0x19DE, 'V'),
- (0x1A1C, 'X'),
- (0x1A1E, 'V'),
- (0x1A5F, 'X'),
- (0x1A60, 'V'),
- (0x1A7D, 'X'),
- (0x1A7F, 'V'),
- (0x1A8A, 'X'),
- (0x1A90, 'V'),
- (0x1A9A, 'X'),
- (0x1AA0, 'V'),
- (0x1AAE, 'X'),
- (0x1AB0, 'V'),
- (0x1AC1, 'X'),
- (0x1B00, 'V'),
- (0x1B4C, 'X'),
- (0x1B50, 'V'),
- (0x1B7D, 'X'),
- (0x1B80, 'V'),
- (0x1BF4, 'X'),
- (0x1BFC, 'V'),
- (0x1C38, 'X'),
- (0x1C3B, 'V'),
- (0x1C4A, 'X'),
- (0x1C4D, 'V'),
+ (0x1316, "X"),
+ (0x1318, "V"),
+ (0x135B, "X"),
+ (0x135D, "V"),
+ (0x137D, "X"),
+ (0x1380, "V"),
+ (0x139A, "X"),
+ (0x13A0, "V"),
+ (0x13F6, "X"),
+ (0x13F8, "M", "Ᏸ"),
+ (0x13F9, "M", "Ᏹ"),
+ (0x13FA, "M", "Ᏺ"),
+ (0x13FB, "M", "Ᏻ"),
+ (0x13FC, "M", "Ᏼ"),
+ (0x13FD, "M", "Ᏽ"),
+ (0x13FE, "X"),
+ (0x1400, "V"),
+ (0x1680, "X"),
+ (0x1681, "V"),
+ (0x169D, "X"),
+ (0x16A0, "V"),
+ (0x16F9, "X"),
+ (0x1700, "V"),
+ (0x1716, "X"),
+ (0x171F, "V"),
+ (0x1737, "X"),
+ (0x1740, "V"),
+ (0x1754, "X"),
+ (0x1760, "V"),
+ (0x176D, "X"),
+ (0x176E, "V"),
+ (0x1771, "X"),
+ (0x1772, "V"),
+ (0x1774, "X"),
+ (0x1780, "V"),
+ (0x17B4, "X"),
+ (0x17B6, "V"),
+ (0x17DE, "X"),
+ (0x17E0, "V"),
+ (0x17EA, "X"),
+ (0x17F0, "V"),
+ (0x17FA, "X"),
+ (0x1800, "V"),
+ (0x1806, "X"),
+ (0x1807, "V"),
+ (0x180B, "I"),
+ (0x180E, "X"),
+ (0x180F, "I"),
+ (0x1810, "V"),
+ (0x181A, "X"),
+ (0x1820, "V"),
+ (0x1879, "X"),
+ (0x1880, "V"),
+ (0x18AB, "X"),
+ (0x18B0, "V"),
+ (0x18F6, "X"),
+ (0x1900, "V"),
+ (0x191F, "X"),
+ (0x1920, "V"),
+ (0x192C, "X"),
+ (0x1930, "V"),
+ (0x193C, "X"),
+ (0x1940, "V"),
+ (0x1941, "X"),
+ (0x1944, "V"),
+ (0x196E, "X"),
+ (0x1970, "V"),
+ (0x1975, "X"),
+ (0x1980, "V"),
+ (0x19AC, "X"),
+ (0x19B0, "V"),
+ (0x19CA, "X"),
+ (0x19D0, "V"),
+ (0x19DB, "X"),
+ (0x19DE, "V"),
+ (0x1A1C, "X"),
+ (0x1A1E, "V"),
+ (0x1A5F, "X"),
+ (0x1A60, "V"),
+ (0x1A7D, "X"),
+ (0x1A7F, "V"),
+ (0x1A8A, "X"),
+ (0x1A90, "V"),
+ (0x1A9A, "X"),
+ (0x1AA0, "V"),
+ (0x1AAE, "X"),
+ (0x1AB0, "V"),
+ (0x1ACF, "X"),
+ (0x1B00, "V"),
+ (0x1B4D, "X"),
+ (0x1B50, "V"),
+ (0x1B7F, "X"),
+ (0x1B80, "V"),
+ (0x1BF4, "X"),
+ (0x1BFC, "V"),
+ (0x1C38, "X"),
+ (0x1C3B, "V"),
+ (0x1C4A, "X"),
+ (0x1C4D, "V"),
+ (0x1C80, "M", "в"),
]
-def _seg_15():
+
+def _seg_15() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x1C80, 'M', u'в'),
- (0x1C81, 'M', u'д'),
- (0x1C82, 'M', u'о'),
- (0x1C83, 'M', u'с'),
- (0x1C84, 'M', u'т'),
- (0x1C86, 'M', u'ъ'),
- (0x1C87, 'M', u'ѣ'),
- (0x1C88, 'M', u'ꙋ'),
- (0x1C89, 'X'),
- (0x1C90, 'M', u'ა'),
- (0x1C91, 'M', u'ბ'),
- (0x1C92, 'M', u'გ'),
- (0x1C93, 'M', u'დ'),
- (0x1C94, 'M', u'ე'),
- (0x1C95, 'M', u'ვ'),
- (0x1C96, 'M', u'ზ'),
- (0x1C97, 'M', u'თ'),
- (0x1C98, 'M', u'ი'),
- (0x1C99, 'M', u'კ'),
- (0x1C9A, 'M', u'ლ'),
- (0x1C9B, 'M', u'მ'),
- (0x1C9C, 'M', u'ნ'),
- (0x1C9D, 'M', u'ო'),
- (0x1C9E, 'M', u'პ'),
- (0x1C9F, 'M', u'ჟ'),
- (0x1CA0, 'M', u'რ'),
- (0x1CA1, 'M', u'ს'),
- (0x1CA2, 'M', u'ტ'),
- (0x1CA3, 'M', u'უ'),
- (0x1CA4, 'M', u'ფ'),
- (0x1CA5, 'M', u'ქ'),
- (0x1CA6, 'M', u'ღ'),
- (0x1CA7, 'M', u'ყ'),
- (0x1CA8, 'M', u'შ'),
- (0x1CA9, 'M', u'ჩ'),
- (0x1CAA, 'M', u'ც'),
- (0x1CAB, 'M', u'ძ'),
- (0x1CAC, 'M', u'წ'),
- (0x1CAD, 'M', u'ჭ'),
- (0x1CAE, 'M', u'ხ'),
- (0x1CAF, 'M', u'ჯ'),
- (0x1CB0, 'M', u'ჰ'),
- (0x1CB1, 'M', u'ჱ'),
- (0x1CB2, 'M', u'ჲ'),
- (0x1CB3, 'M', u'ჳ'),
- (0x1CB4, 'M', u'ჴ'),
- (0x1CB5, 'M', u'ჵ'),
- (0x1CB6, 'M', u'ჶ'),
- (0x1CB7, 'M', u'ჷ'),
- (0x1CB8, 'M', u'ჸ'),
- (0x1CB9, 'M', u'ჹ'),
- (0x1CBA, 'M', u'ჺ'),
- (0x1CBB, 'X'),
- (0x1CBD, 'M', u'ჽ'),
- (0x1CBE, 'M', u'ჾ'),
- (0x1CBF, 'M', u'ჿ'),
- (0x1CC0, 'V'),
- (0x1CC8, 'X'),
- (0x1CD0, 'V'),
- (0x1CFB, 'X'),
- (0x1D00, 'V'),
- (0x1D2C, 'M', u'a'),
- (0x1D2D, 'M', u'æ'),
- (0x1D2E, 'M', u'b'),
- (0x1D2F, 'V'),
- (0x1D30, 'M', u'd'),
- (0x1D31, 'M', u'e'),
- (0x1D32, 'M', u'ǝ'),
- (0x1D33, 'M', u'g'),
- (0x1D34, 'M', u'h'),
- (0x1D35, 'M', u'i'),
- (0x1D36, 'M', u'j'),
- (0x1D37, 'M', u'k'),
- (0x1D38, 'M', u'l'),
- (0x1D39, 'M', u'm'),
- (0x1D3A, 'M', u'n'),
- (0x1D3B, 'V'),
- (0x1D3C, 'M', u'o'),
- (0x1D3D, 'M', u'ȣ'),
- (0x1D3E, 'M', u'p'),
- (0x1D3F, 'M', u'r'),
- (0x1D40, 'M', u't'),
- (0x1D41, 'M', u'u'),
- (0x1D42, 'M', u'w'),
- (0x1D43, 'M', u'a'),
- (0x1D44, 'M', u'ɐ'),
- (0x1D45, 'M', u'ɑ'),
- (0x1D46, 'M', u'ᴂ'),
- (0x1D47, 'M', u'b'),
- (0x1D48, 'M', u'd'),
- (0x1D49, 'M', u'e'),
- (0x1D4A, 'M', u'ə'),
- (0x1D4B, 'M', u'ɛ'),
- (0x1D4C, 'M', u'ɜ'),
- (0x1D4D, 'M', u'g'),
- (0x1D4E, 'V'),
- (0x1D4F, 'M', u'k'),
- (0x1D50, 'M', u'm'),
- (0x1D51, 'M', u'ŋ'),
- (0x1D52, 'M', u'o'),
+ (0x1C81, "M", "д"),
+ (0x1C82, "M", "о"),
+ (0x1C83, "M", "с"),
+ (0x1C84, "M", "т"),
+ (0x1C86, "M", "ъ"),
+ (0x1C87, "M", "ѣ"),
+ (0x1C88, "M", "ꙋ"),
+ (0x1C89, "X"),
+ (0x1C90, "M", "ა"),
+ (0x1C91, "M", "ბ"),
+ (0x1C92, "M", "გ"),
+ (0x1C93, "M", "დ"),
+ (0x1C94, "M", "ე"),
+ (0x1C95, "M", "ვ"),
+ (0x1C96, "M", "ზ"),
+ (0x1C97, "M", "თ"),
+ (0x1C98, "M", "ი"),
+ (0x1C99, "M", "კ"),
+ (0x1C9A, "M", "ლ"),
+ (0x1C9B, "M", "მ"),
+ (0x1C9C, "M", "ნ"),
+ (0x1C9D, "M", "ო"),
+ (0x1C9E, "M", "პ"),
+ (0x1C9F, "M", "ჟ"),
+ (0x1CA0, "M", "რ"),
+ (0x1CA1, "M", "ს"),
+ (0x1CA2, "M", "ტ"),
+ (0x1CA3, "M", "უ"),
+ (0x1CA4, "M", "ფ"),
+ (0x1CA5, "M", "ქ"),
+ (0x1CA6, "M", "ღ"),
+ (0x1CA7, "M", "ყ"),
+ (0x1CA8, "M", "შ"),
+ (0x1CA9, "M", "ჩ"),
+ (0x1CAA, "M", "ც"),
+ (0x1CAB, "M", "ძ"),
+ (0x1CAC, "M", "წ"),
+ (0x1CAD, "M", "ჭ"),
+ (0x1CAE, "M", "ხ"),
+ (0x1CAF, "M", "ჯ"),
+ (0x1CB0, "M", "ჰ"),
+ (0x1CB1, "M", "ჱ"),
+ (0x1CB2, "M", "ჲ"),
+ (0x1CB3, "M", "ჳ"),
+ (0x1CB4, "M", "ჴ"),
+ (0x1CB5, "M", "ჵ"),
+ (0x1CB6, "M", "ჶ"),
+ (0x1CB7, "M", "ჷ"),
+ (0x1CB8, "M", "ჸ"),
+ (0x1CB9, "M", "ჹ"),
+ (0x1CBA, "M", "ჺ"),
+ (0x1CBB, "X"),
+ (0x1CBD, "M", "ჽ"),
+ (0x1CBE, "M", "ჾ"),
+ (0x1CBF, "M", "ჿ"),
+ (0x1CC0, "V"),
+ (0x1CC8, "X"),
+ (0x1CD0, "V"),
+ (0x1CFB, "X"),
+ (0x1D00, "V"),
+ (0x1D2C, "M", "a"),
+ (0x1D2D, "M", "æ"),
+ (0x1D2E, "M", "b"),
+ (0x1D2F, "V"),
+ (0x1D30, "M", "d"),
+ (0x1D31, "M", "e"),
+ (0x1D32, "M", "ǝ"),
+ (0x1D33, "M", "g"),
+ (0x1D34, "M", "h"),
+ (0x1D35, "M", "i"),
+ (0x1D36, "M", "j"),
+ (0x1D37, "M", "k"),
+ (0x1D38, "M", "l"),
+ (0x1D39, "M", "m"),
+ (0x1D3A, "M", "n"),
+ (0x1D3B, "V"),
+ (0x1D3C, "M", "o"),
+ (0x1D3D, "M", "ȣ"),
+ (0x1D3E, "M", "p"),
+ (0x1D3F, "M", "r"),
+ (0x1D40, "M", "t"),
+ (0x1D41, "M", "u"),
+ (0x1D42, "M", "w"),
+ (0x1D43, "M", "a"),
+ (0x1D44, "M", "ɐ"),
+ (0x1D45, "M", "ɑ"),
+ (0x1D46, "M", "ᴂ"),
+ (0x1D47, "M", "b"),
+ (0x1D48, "M", "d"),
+ (0x1D49, "M", "e"),
+ (0x1D4A, "M", "ə"),
+ (0x1D4B, "M", "ɛ"),
+ (0x1D4C, "M", "ɜ"),
+ (0x1D4D, "M", "g"),
+ (0x1D4E, "V"),
+ (0x1D4F, "M", "k"),
+ (0x1D50, "M", "m"),
+ (0x1D51, "M", "ŋ"),
+ (0x1D52, "M", "o"),
+ (0x1D53, "M", "ɔ"),
]
-def _seg_16():
+
+def _seg_16() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x1D53, 'M', u'ɔ'),
- (0x1D54, 'M', u'ᴖ'),
- (0x1D55, 'M', u'ᴗ'),
- (0x1D56, 'M', u'p'),
- (0x1D57, 'M', u't'),
- (0x1D58, 'M', u'u'),
- (0x1D59, 'M', u'ᴝ'),
- (0x1D5A, 'M', u'ɯ'),
- (0x1D5B, 'M', u'v'),
- (0x1D5C, 'M', u'ᴥ'),
- (0x1D5D, 'M', u'β'),
- (0x1D5E, 'M', u'γ'),
- (0x1D5F, 'M', u'δ'),
- (0x1D60, 'M', u'φ'),
- (0x1D61, 'M', u'χ'),
- (0x1D62, 'M', u'i'),
- (0x1D63, 'M', u'r'),
- (0x1D64, 'M', u'u'),
- (0x1D65, 'M', u'v'),
- (0x1D66, 'M', u'β'),
- (0x1D67, 'M', u'γ'),
- (0x1D68, 'M', u'ρ'),
- (0x1D69, 'M', u'φ'),
- (0x1D6A, 'M', u'χ'),
- (0x1D6B, 'V'),
- (0x1D78, 'M', u'н'),
- (0x1D79, 'V'),
- (0x1D9B, 'M', u'ɒ'),
- (0x1D9C, 'M', u'c'),
- (0x1D9D, 'M', u'ɕ'),
- (0x1D9E, 'M', u'ð'),
- (0x1D9F, 'M', u'ɜ'),
- (0x1DA0, 'M', u'f'),
- (0x1DA1, 'M', u'ɟ'),
- (0x1DA2, 'M', u'ɡ'),
- (0x1DA3, 'M', u'ɥ'),
- (0x1DA4, 'M', u'ɨ'),
- (0x1DA5, 'M', u'ɩ'),
- (0x1DA6, 'M', u'ɪ'),
- (0x1DA7, 'M', u'ᵻ'),
- (0x1DA8, 'M', u'ʝ'),
- (0x1DA9, 'M', u'ɭ'),
- (0x1DAA, 'M', u'ᶅ'),
- (0x1DAB, 'M', u'ʟ'),
- (0x1DAC, 'M', u'ɱ'),
- (0x1DAD, 'M', u'ɰ'),
- (0x1DAE, 'M', u'ɲ'),
- (0x1DAF, 'M', u'ɳ'),
- (0x1DB0, 'M', u'ɴ'),
- (0x1DB1, 'M', u'ɵ'),
- (0x1DB2, 'M', u'ɸ'),
- (0x1DB3, 'M', u'ʂ'),
- (0x1DB4, 'M', u'ʃ'),
- (0x1DB5, 'M', u'ƫ'),
- (0x1DB6, 'M', u'ʉ'),
- (0x1DB7, 'M', u'ʊ'),
- (0x1DB8, 'M', u'ᴜ'),
- (0x1DB9, 'M', u'ʋ'),
- (0x1DBA, 'M', u'ʌ'),
- (0x1DBB, 'M', u'z'),
- (0x1DBC, 'M', u'ʐ'),
- (0x1DBD, 'M', u'ʑ'),
- (0x1DBE, 'M', u'ʒ'),
- (0x1DBF, 'M', u'θ'),
- (0x1DC0, 'V'),
- (0x1DFA, 'X'),
- (0x1DFB, 'V'),
- (0x1E00, 'M', u'ḁ'),
- (0x1E01, 'V'),
- (0x1E02, 'M', u'ḃ'),
- (0x1E03, 'V'),
- (0x1E04, 'M', u'ḅ'),
- (0x1E05, 'V'),
- (0x1E06, 'M', u'ḇ'),
- (0x1E07, 'V'),
- (0x1E08, 'M', u'ḉ'),
- (0x1E09, 'V'),
- (0x1E0A, 'M', u'ḋ'),
- (0x1E0B, 'V'),
- (0x1E0C, 'M', u'ḍ'),
- (0x1E0D, 'V'),
- (0x1E0E, 'M', u'ḏ'),
- (0x1E0F, 'V'),
- (0x1E10, 'M', u'ḑ'),
- (0x1E11, 'V'),
- (0x1E12, 'M', u'ḓ'),
- (0x1E13, 'V'),
- (0x1E14, 'M', u'ḕ'),
- (0x1E15, 'V'),
- (0x1E16, 'M', u'ḗ'),
- (0x1E17, 'V'),
- (0x1E18, 'M', u'ḙ'),
- (0x1E19, 'V'),
- (0x1E1A, 'M', u'ḛ'),
- (0x1E1B, 'V'),
- (0x1E1C, 'M', u'ḝ'),
- (0x1E1D, 'V'),
- (0x1E1E, 'M', u'ḟ'),
- (0x1E1F, 'V'),
- (0x1E20, 'M', u'ḡ'),
+ (0x1D54, "M", "ᴖ"),
+ (0x1D55, "M", "ᴗ"),
+ (0x1D56, "M", "p"),
+ (0x1D57, "M", "t"),
+ (0x1D58, "M", "u"),
+ (0x1D59, "M", "ᴝ"),
+ (0x1D5A, "M", "ɯ"),
+ (0x1D5B, "M", "v"),
+ (0x1D5C, "M", "ᴥ"),
+ (0x1D5D, "M", "β"),
+ (0x1D5E, "M", "γ"),
+ (0x1D5F, "M", "δ"),
+ (0x1D60, "M", "φ"),
+ (0x1D61, "M", "χ"),
+ (0x1D62, "M", "i"),
+ (0x1D63, "M", "r"),
+ (0x1D64, "M", "u"),
+ (0x1D65, "M", "v"),
+ (0x1D66, "M", "β"),
+ (0x1D67, "M", "γ"),
+ (0x1D68, "M", "ρ"),
+ (0x1D69, "M", "φ"),
+ (0x1D6A, "M", "χ"),
+ (0x1D6B, "V"),
+ (0x1D78, "M", "н"),
+ (0x1D79, "V"),
+ (0x1D9B, "M", "ɒ"),
+ (0x1D9C, "M", "c"),
+ (0x1D9D, "M", "ɕ"),
+ (0x1D9E, "M", "ð"),
+ (0x1D9F, "M", "ɜ"),
+ (0x1DA0, "M", "f"),
+ (0x1DA1, "M", "ɟ"),
+ (0x1DA2, "M", "ɡ"),
+ (0x1DA3, "M", "ɥ"),
+ (0x1DA4, "M", "ɨ"),
+ (0x1DA5, "M", "ɩ"),
+ (0x1DA6, "M", "ɪ"),
+ (0x1DA7, "M", "ᵻ"),
+ (0x1DA8, "M", "ʝ"),
+ (0x1DA9, "M", "ɭ"),
+ (0x1DAA, "M", "ᶅ"),
+ (0x1DAB, "M", "ʟ"),
+ (0x1DAC, "M", "ɱ"),
+ (0x1DAD, "M", "ɰ"),
+ (0x1DAE, "M", "ɲ"),
+ (0x1DAF, "M", "ɳ"),
+ (0x1DB0, "M", "ɴ"),
+ (0x1DB1, "M", "ɵ"),
+ (0x1DB2, "M", "ɸ"),
+ (0x1DB3, "M", "ʂ"),
+ (0x1DB4, "M", "ʃ"),
+ (0x1DB5, "M", "ƫ"),
+ (0x1DB6, "M", "ʉ"),
+ (0x1DB7, "M", "ʊ"),
+ (0x1DB8, "M", "ᴜ"),
+ (0x1DB9, "M", "ʋ"),
+ (0x1DBA, "M", "ʌ"),
+ (0x1DBB, "M", "z"),
+ (0x1DBC, "M", "ʐ"),
+ (0x1DBD, "M", "ʑ"),
+ (0x1DBE, "M", "ʒ"),
+ (0x1DBF, "M", "θ"),
+ (0x1DC0, "V"),
+ (0x1E00, "M", "ḁ"),
+ (0x1E01, "V"),
+ (0x1E02, "M", "ḃ"),
+ (0x1E03, "V"),
+ (0x1E04, "M", "ḅ"),
+ (0x1E05, "V"),
+ (0x1E06, "M", "ḇ"),
+ (0x1E07, "V"),
+ (0x1E08, "M", "ḉ"),
+ (0x1E09, "V"),
+ (0x1E0A, "M", "ḋ"),
+ (0x1E0B, "V"),
+ (0x1E0C, "M", "ḍ"),
+ (0x1E0D, "V"),
+ (0x1E0E, "M", "ḏ"),
+ (0x1E0F, "V"),
+ (0x1E10, "M", "ḑ"),
+ (0x1E11, "V"),
+ (0x1E12, "M", "ḓ"),
+ (0x1E13, "V"),
+ (0x1E14, "M", "ḕ"),
+ (0x1E15, "V"),
+ (0x1E16, "M", "ḗ"),
+ (0x1E17, "V"),
+ (0x1E18, "M", "ḙ"),
+ (0x1E19, "V"),
+ (0x1E1A, "M", "ḛ"),
+ (0x1E1B, "V"),
+ (0x1E1C, "M", "ḝ"),
+ (0x1E1D, "V"),
+ (0x1E1E, "M", "ḟ"),
+ (0x1E1F, "V"),
+ (0x1E20, "M", "ḡ"),
+ (0x1E21, "V"),
+ (0x1E22, "M", "ḣ"),
+ (0x1E23, "V"),
]
-def _seg_17():
+
+def _seg_17() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x1E21, 'V'),
- (0x1E22, 'M', u'ḣ'),
- (0x1E23, 'V'),
- (0x1E24, 'M', u'ḥ'),
- (0x1E25, 'V'),
- (0x1E26, 'M', u'ḧ'),
- (0x1E27, 'V'),
- (0x1E28, 'M', u'ḩ'),
- (0x1E29, 'V'),
- (0x1E2A, 'M', u'ḫ'),
- (0x1E2B, 'V'),
- (0x1E2C, 'M', u'ḭ'),
- (0x1E2D, 'V'),
- (0x1E2E, 'M', u'ḯ'),
- (0x1E2F, 'V'),
- (0x1E30, 'M', u'ḱ'),
- (0x1E31, 'V'),
- (0x1E32, 'M', u'ḳ'),
- (0x1E33, 'V'),
- (0x1E34, 'M', u'ḵ'),
- (0x1E35, 'V'),
- (0x1E36, 'M', u'ḷ'),
- (0x1E37, 'V'),
- (0x1E38, 'M', u'ḹ'),
- (0x1E39, 'V'),
- (0x1E3A, 'M', u'ḻ'),
- (0x1E3B, 'V'),
- (0x1E3C, 'M', u'ḽ'),
- (0x1E3D, 'V'),
- (0x1E3E, 'M', u'ḿ'),
- (0x1E3F, 'V'),
- (0x1E40, 'M', u'ṁ'),
- (0x1E41, 'V'),
- (0x1E42, 'M', u'ṃ'),
- (0x1E43, 'V'),
- (0x1E44, 'M', u'ṅ'),
- (0x1E45, 'V'),
- (0x1E46, 'M', u'ṇ'),
- (0x1E47, 'V'),
- (0x1E48, 'M', u'ṉ'),
- (0x1E49, 'V'),
- (0x1E4A, 'M', u'ṋ'),
- (0x1E4B, 'V'),
- (0x1E4C, 'M', u'ṍ'),
- (0x1E4D, 'V'),
- (0x1E4E, 'M', u'ṏ'),
- (0x1E4F, 'V'),
- (0x1E50, 'M', u'ṑ'),
- (0x1E51, 'V'),
- (0x1E52, 'M', u'ṓ'),
- (0x1E53, 'V'),
- (0x1E54, 'M', u'ṕ'),
- (0x1E55, 'V'),
- (0x1E56, 'M', u'ṗ'),
- (0x1E57, 'V'),
- (0x1E58, 'M', u'ṙ'),
- (0x1E59, 'V'),
- (0x1E5A, 'M', u'ṛ'),
- (0x1E5B, 'V'),
- (0x1E5C, 'M', u'ṝ'),
- (0x1E5D, 'V'),
- (0x1E5E, 'M', u'ṟ'),
- (0x1E5F, 'V'),
- (0x1E60, 'M', u'ṡ'),
- (0x1E61, 'V'),
- (0x1E62, 'M', u'ṣ'),
- (0x1E63, 'V'),
- (0x1E64, 'M', u'ṥ'),
- (0x1E65, 'V'),
- (0x1E66, 'M', u'ṧ'),
- (0x1E67, 'V'),
- (0x1E68, 'M', u'ṩ'),
- (0x1E69, 'V'),
- (0x1E6A, 'M', u'ṫ'),
- (0x1E6B, 'V'),
- (0x1E6C, 'M', u'ṭ'),
- (0x1E6D, 'V'),
- (0x1E6E, 'M', u'ṯ'),
- (0x1E6F, 'V'),
- (0x1E70, 'M', u'ṱ'),
- (0x1E71, 'V'),
- (0x1E72, 'M', u'ṳ'),
- (0x1E73, 'V'),
- (0x1E74, 'M', u'ṵ'),
- (0x1E75, 'V'),
- (0x1E76, 'M', u'ṷ'),
- (0x1E77, 'V'),
- (0x1E78, 'M', u'ṹ'),
- (0x1E79, 'V'),
- (0x1E7A, 'M', u'ṻ'),
- (0x1E7B, 'V'),
- (0x1E7C, 'M', u'ṽ'),
- (0x1E7D, 'V'),
- (0x1E7E, 'M', u'ṿ'),
- (0x1E7F, 'V'),
- (0x1E80, 'M', u'ẁ'),
- (0x1E81, 'V'),
- (0x1E82, 'M', u'ẃ'),
- (0x1E83, 'V'),
- (0x1E84, 'M', u'ẅ'),
+ (0x1E24, "M", "ḥ"),
+ (0x1E25, "V"),
+ (0x1E26, "M", "ḧ"),
+ (0x1E27, "V"),
+ (0x1E28, "M", "ḩ"),
+ (0x1E29, "V"),
+ (0x1E2A, "M", "ḫ"),
+ (0x1E2B, "V"),
+ (0x1E2C, "M", "ḭ"),
+ (0x1E2D, "V"),
+ (0x1E2E, "M", "ḯ"),
+ (0x1E2F, "V"),
+ (0x1E30, "M", "ḱ"),
+ (0x1E31, "V"),
+ (0x1E32, "M", "ḳ"),
+ (0x1E33, "V"),
+ (0x1E34, "M", "ḵ"),
+ (0x1E35, "V"),
+ (0x1E36, "M", "ḷ"),
+ (0x1E37, "V"),
+ (0x1E38, "M", "ḹ"),
+ (0x1E39, "V"),
+ (0x1E3A, "M", "ḻ"),
+ (0x1E3B, "V"),
+ (0x1E3C, "M", "ḽ"),
+ (0x1E3D, "V"),
+ (0x1E3E, "M", "ḿ"),
+ (0x1E3F, "V"),
+ (0x1E40, "M", "ṁ"),
+ (0x1E41, "V"),
+ (0x1E42, "M", "ṃ"),
+ (0x1E43, "V"),
+ (0x1E44, "M", "ṅ"),
+ (0x1E45, "V"),
+ (0x1E46, "M", "ṇ"),
+ (0x1E47, "V"),
+ (0x1E48, "M", "ṉ"),
+ (0x1E49, "V"),
+ (0x1E4A, "M", "ṋ"),
+ (0x1E4B, "V"),
+ (0x1E4C, "M", "ṍ"),
+ (0x1E4D, "V"),
+ (0x1E4E, "M", "ṏ"),
+ (0x1E4F, "V"),
+ (0x1E50, "M", "ṑ"),
+ (0x1E51, "V"),
+ (0x1E52, "M", "ṓ"),
+ (0x1E53, "V"),
+ (0x1E54, "M", "ṕ"),
+ (0x1E55, "V"),
+ (0x1E56, "M", "ṗ"),
+ (0x1E57, "V"),
+ (0x1E58, "M", "ṙ"),
+ (0x1E59, "V"),
+ (0x1E5A, "M", "ṛ"),
+ (0x1E5B, "V"),
+ (0x1E5C, "M", "ṝ"),
+ (0x1E5D, "V"),
+ (0x1E5E, "M", "ṟ"),
+ (0x1E5F, "V"),
+ (0x1E60, "M", "ṡ"),
+ (0x1E61, "V"),
+ (0x1E62, "M", "ṣ"),
+ (0x1E63, "V"),
+ (0x1E64, "M", "ṥ"),
+ (0x1E65, "V"),
+ (0x1E66, "M", "ṧ"),
+ (0x1E67, "V"),
+ (0x1E68, "M", "ṩ"),
+ (0x1E69, "V"),
+ (0x1E6A, "M", "ṫ"),
+ (0x1E6B, "V"),
+ (0x1E6C, "M", "ṭ"),
+ (0x1E6D, "V"),
+ (0x1E6E, "M", "ṯ"),
+ (0x1E6F, "V"),
+ (0x1E70, "M", "ṱ"),
+ (0x1E71, "V"),
+ (0x1E72, "M", "ṳ"),
+ (0x1E73, "V"),
+ (0x1E74, "M", "ṵ"),
+ (0x1E75, "V"),
+ (0x1E76, "M", "ṷ"),
+ (0x1E77, "V"),
+ (0x1E78, "M", "ṹ"),
+ (0x1E79, "V"),
+ (0x1E7A, "M", "ṻ"),
+ (0x1E7B, "V"),
+ (0x1E7C, "M", "ṽ"),
+ (0x1E7D, "V"),
+ (0x1E7E, "M", "ṿ"),
+ (0x1E7F, "V"),
+ (0x1E80, "M", "ẁ"),
+ (0x1E81, "V"),
+ (0x1E82, "M", "ẃ"),
+ (0x1E83, "V"),
+ (0x1E84, "M", "ẅ"),
+ (0x1E85, "V"),
+ (0x1E86, "M", "ẇ"),
+ (0x1E87, "V"),
]
-def _seg_18():
+
+def _seg_18() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x1E85, 'V'),
- (0x1E86, 'M', u'ẇ'),
- (0x1E87, 'V'),
- (0x1E88, 'M', u'ẉ'),
- (0x1E89, 'V'),
- (0x1E8A, 'M', u'ẋ'),
- (0x1E8B, 'V'),
- (0x1E8C, 'M', u'ẍ'),
- (0x1E8D, 'V'),
- (0x1E8E, 'M', u'ẏ'),
- (0x1E8F, 'V'),
- (0x1E90, 'M', u'ẑ'),
- (0x1E91, 'V'),
- (0x1E92, 'M', u'ẓ'),
- (0x1E93, 'V'),
- (0x1E94, 'M', u'ẕ'),
- (0x1E95, 'V'),
- (0x1E9A, 'M', u'aʾ'),
- (0x1E9B, 'M', u'ṡ'),
- (0x1E9C, 'V'),
- (0x1E9E, 'M', u'ss'),
- (0x1E9F, 'V'),
- (0x1EA0, 'M', u'ạ'),
- (0x1EA1, 'V'),
- (0x1EA2, 'M', u'ả'),
- (0x1EA3, 'V'),
- (0x1EA4, 'M', u'ấ'),
- (0x1EA5, 'V'),
- (0x1EA6, 'M', u'ầ'),
- (0x1EA7, 'V'),
- (0x1EA8, 'M', u'ẩ'),
- (0x1EA9, 'V'),
- (0x1EAA, 'M', u'ẫ'),
- (0x1EAB, 'V'),
- (0x1EAC, 'M', u'ậ'),
- (0x1EAD, 'V'),
- (0x1EAE, 'M', u'ắ'),
- (0x1EAF, 'V'),
- (0x1EB0, 'M', u'ằ'),
- (0x1EB1, 'V'),
- (0x1EB2, 'M', u'ẳ'),
- (0x1EB3, 'V'),
- (0x1EB4, 'M', u'ẵ'),
- (0x1EB5, 'V'),
- (0x1EB6, 'M', u'ặ'),
- (0x1EB7, 'V'),
- (0x1EB8, 'M', u'ẹ'),
- (0x1EB9, 'V'),
- (0x1EBA, 'M', u'ẻ'),
- (0x1EBB, 'V'),
- (0x1EBC, 'M', u'ẽ'),
- (0x1EBD, 'V'),
- (0x1EBE, 'M', u'ế'),
- (0x1EBF, 'V'),
- (0x1EC0, 'M', u'ề'),
- (0x1EC1, 'V'),
- (0x1EC2, 'M', u'ể'),
- (0x1EC3, 'V'),
- (0x1EC4, 'M', u'ễ'),
- (0x1EC5, 'V'),
- (0x1EC6, 'M', u'ệ'),
- (0x1EC7, 'V'),
- (0x1EC8, 'M', u'ỉ'),
- (0x1EC9, 'V'),
- (0x1ECA, 'M', u'ị'),
- (0x1ECB, 'V'),
- (0x1ECC, 'M', u'ọ'),
- (0x1ECD, 'V'),
- (0x1ECE, 'M', u'ỏ'),
- (0x1ECF, 'V'),
- (0x1ED0, 'M', u'ố'),
- (0x1ED1, 'V'),
- (0x1ED2, 'M', u'ồ'),
- (0x1ED3, 'V'),
- (0x1ED4, 'M', u'ổ'),
- (0x1ED5, 'V'),
- (0x1ED6, 'M', u'ỗ'),
- (0x1ED7, 'V'),
- (0x1ED8, 'M', u'ộ'),
- (0x1ED9, 'V'),
- (0x1EDA, 'M', u'ớ'),
- (0x1EDB, 'V'),
- (0x1EDC, 'M', u'ờ'),
- (0x1EDD, 'V'),
- (0x1EDE, 'M', u'ở'),
- (0x1EDF, 'V'),
- (0x1EE0, 'M', u'ỡ'),
- (0x1EE1, 'V'),
- (0x1EE2, 'M', u'ợ'),
- (0x1EE3, 'V'),
- (0x1EE4, 'M', u'ụ'),
- (0x1EE5, 'V'),
- (0x1EE6, 'M', u'ủ'),
- (0x1EE7, 'V'),
- (0x1EE8, 'M', u'ứ'),
- (0x1EE9, 'V'),
- (0x1EEA, 'M', u'ừ'),
- (0x1EEB, 'V'),
- (0x1EEC, 'M', u'ử'),
- (0x1EED, 'V'),
+ (0x1E88, "M", "ẉ"),
+ (0x1E89, "V"),
+ (0x1E8A, "M", "ẋ"),
+ (0x1E8B, "V"),
+ (0x1E8C, "M", "ẍ"),
+ (0x1E8D, "V"),
+ (0x1E8E, "M", "ẏ"),
+ (0x1E8F, "V"),
+ (0x1E90, "M", "ẑ"),
+ (0x1E91, "V"),
+ (0x1E92, "M", "ẓ"),
+ (0x1E93, "V"),
+ (0x1E94, "M", "ẕ"),
+ (0x1E95, "V"),
+ (0x1E9A, "M", "aʾ"),
+ (0x1E9B, "M", "ṡ"),
+ (0x1E9C, "V"),
+ (0x1E9E, "M", "ß"),
+ (0x1E9F, "V"),
+ (0x1EA0, "M", "ạ"),
+ (0x1EA1, "V"),
+ (0x1EA2, "M", "ả"),
+ (0x1EA3, "V"),
+ (0x1EA4, "M", "ấ"),
+ (0x1EA5, "V"),
+ (0x1EA6, "M", "ầ"),
+ (0x1EA7, "V"),
+ (0x1EA8, "M", "ẩ"),
+ (0x1EA9, "V"),
+ (0x1EAA, "M", "ẫ"),
+ (0x1EAB, "V"),
+ (0x1EAC, "M", "ậ"),
+ (0x1EAD, "V"),
+ (0x1EAE, "M", "ắ"),
+ (0x1EAF, "V"),
+ (0x1EB0, "M", "ằ"),
+ (0x1EB1, "V"),
+ (0x1EB2, "M", "ẳ"),
+ (0x1EB3, "V"),
+ (0x1EB4, "M", "ẵ"),
+ (0x1EB5, "V"),
+ (0x1EB6, "M", "ặ"),
+ (0x1EB7, "V"),
+ (0x1EB8, "M", "ẹ"),
+ (0x1EB9, "V"),
+ (0x1EBA, "M", "ẻ"),
+ (0x1EBB, "V"),
+ (0x1EBC, "M", "ẽ"),
+ (0x1EBD, "V"),
+ (0x1EBE, "M", "ế"),
+ (0x1EBF, "V"),
+ (0x1EC0, "M", "ề"),
+ (0x1EC1, "V"),
+ (0x1EC2, "M", "ể"),
+ (0x1EC3, "V"),
+ (0x1EC4, "M", "ễ"),
+ (0x1EC5, "V"),
+ (0x1EC6, "M", "ệ"),
+ (0x1EC7, "V"),
+ (0x1EC8, "M", "ỉ"),
+ (0x1EC9, "V"),
+ (0x1ECA, "M", "ị"),
+ (0x1ECB, "V"),
+ (0x1ECC, "M", "ọ"),
+ (0x1ECD, "V"),
+ (0x1ECE, "M", "ỏ"),
+ (0x1ECF, "V"),
+ (0x1ED0, "M", "ố"),
+ (0x1ED1, "V"),
+ (0x1ED2, "M", "ồ"),
+ (0x1ED3, "V"),
+ (0x1ED4, "M", "ổ"),
+ (0x1ED5, "V"),
+ (0x1ED6, "M", "ỗ"),
+ (0x1ED7, "V"),
+ (0x1ED8, "M", "ộ"),
+ (0x1ED9, "V"),
+ (0x1EDA, "M", "ớ"),
+ (0x1EDB, "V"),
+ (0x1EDC, "M", "ờ"),
+ (0x1EDD, "V"),
+ (0x1EDE, "M", "ở"),
+ (0x1EDF, "V"),
+ (0x1EE0, "M", "ỡ"),
+ (0x1EE1, "V"),
+ (0x1EE2, "M", "ợ"),
+ (0x1EE3, "V"),
+ (0x1EE4, "M", "ụ"),
+ (0x1EE5, "V"),
+ (0x1EE6, "M", "ủ"),
+ (0x1EE7, "V"),
+ (0x1EE8, "M", "ứ"),
+ (0x1EE9, "V"),
+ (0x1EEA, "M", "ừ"),
+ (0x1EEB, "V"),
+ (0x1EEC, "M", "ử"),
+ (0x1EED, "V"),
+ (0x1EEE, "M", "ữ"),
+ (0x1EEF, "V"),
+ (0x1EF0, "M", "ự"),
]
-def _seg_19():
+
+def _seg_19() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x1EEE, 'M', u'ữ'),
- (0x1EEF, 'V'),
- (0x1EF0, 'M', u'ự'),
- (0x1EF1, 'V'),
- (0x1EF2, 'M', u'ỳ'),
- (0x1EF3, 'V'),
- (0x1EF4, 'M', u'ỵ'),
- (0x1EF5, 'V'),
- (0x1EF6, 'M', u'ỷ'),
- (0x1EF7, 'V'),
- (0x1EF8, 'M', u'ỹ'),
- (0x1EF9, 'V'),
- (0x1EFA, 'M', u'ỻ'),
- (0x1EFB, 'V'),
- (0x1EFC, 'M', u'ỽ'),
- (0x1EFD, 'V'),
- (0x1EFE, 'M', u'ỿ'),
- (0x1EFF, 'V'),
- (0x1F08, 'M', u'ἀ'),
- (0x1F09, 'M', u'ἁ'),
- (0x1F0A, 'M', u'ἂ'),
- (0x1F0B, 'M', u'ἃ'),
- (0x1F0C, 'M', u'ἄ'),
- (0x1F0D, 'M', u'ἅ'),
- (0x1F0E, 'M', u'ἆ'),
- (0x1F0F, 'M', u'ἇ'),
- (0x1F10, 'V'),
- (0x1F16, 'X'),
- (0x1F18, 'M', u'ἐ'),
- (0x1F19, 'M', u'ἑ'),
- (0x1F1A, 'M', u'ἒ'),
- (0x1F1B, 'M', u'ἓ'),
- (0x1F1C, 'M', u'ἔ'),
- (0x1F1D, 'M', u'ἕ'),
- (0x1F1E, 'X'),
- (0x1F20, 'V'),
- (0x1F28, 'M', u'ἠ'),
- (0x1F29, 'M', u'ἡ'),
- (0x1F2A, 'M', u'ἢ'),
- (0x1F2B, 'M', u'ἣ'),
- (0x1F2C, 'M', u'ἤ'),
- (0x1F2D, 'M', u'ἥ'),
- (0x1F2E, 'M', u'ἦ'),
- (0x1F2F, 'M', u'ἧ'),
- (0x1F30, 'V'),
- (0x1F38, 'M', u'ἰ'),
- (0x1F39, 'M', u'ἱ'),
- (0x1F3A, 'M', u'ἲ'),
- (0x1F3B, 'M', u'ἳ'),
- (0x1F3C, 'M', u'ἴ'),
- (0x1F3D, 'M', u'ἵ'),
- (0x1F3E, 'M', u'ἶ'),
- (0x1F3F, 'M', u'ἷ'),
- (0x1F40, 'V'),
- (0x1F46, 'X'),
- (0x1F48, 'M', u'ὀ'),
- (0x1F49, 'M', u'ὁ'),
- (0x1F4A, 'M', u'ὂ'),
- (0x1F4B, 'M', u'ὃ'),
- (0x1F4C, 'M', u'ὄ'),
- (0x1F4D, 'M', u'ὅ'),
- (0x1F4E, 'X'),
- (0x1F50, 'V'),
- (0x1F58, 'X'),
- (0x1F59, 'M', u'ὑ'),
- (0x1F5A, 'X'),
- (0x1F5B, 'M', u'ὓ'),
- (0x1F5C, 'X'),
- (0x1F5D, 'M', u'ὕ'),
- (0x1F5E, 'X'),
- (0x1F5F, 'M', u'ὗ'),
- (0x1F60, 'V'),
- (0x1F68, 'M', u'ὠ'),
- (0x1F69, 'M', u'ὡ'),
- (0x1F6A, 'M', u'ὢ'),
- (0x1F6B, 'M', u'ὣ'),
- (0x1F6C, 'M', u'ὤ'),
- (0x1F6D, 'M', u'ὥ'),
- (0x1F6E, 'M', u'ὦ'),
- (0x1F6F, 'M', u'ὧ'),
- (0x1F70, 'V'),
- (0x1F71, 'M', u'ά'),
- (0x1F72, 'V'),
- (0x1F73, 'M', u'έ'),
- (0x1F74, 'V'),
- (0x1F75, 'M', u'ή'),
- (0x1F76, 'V'),
- (0x1F77, 'M', u'ί'),
- (0x1F78, 'V'),
- (0x1F79, 'M', u'ό'),
- (0x1F7A, 'V'),
- (0x1F7B, 'M', u'ύ'),
- (0x1F7C, 'V'),
- (0x1F7D, 'M', u'ώ'),
- (0x1F7E, 'X'),
- (0x1F80, 'M', u'ἀι'),
- (0x1F81, 'M', u'ἁι'),
- (0x1F82, 'M', u'ἂι'),
- (0x1F83, 'M', u'ἃι'),
- (0x1F84, 'M', u'ἄι'),
+ (0x1EF1, "V"),
+ (0x1EF2, "M", "ỳ"),
+ (0x1EF3, "V"),
+ (0x1EF4, "M", "ỵ"),
+ (0x1EF5, "V"),
+ (0x1EF6, "M", "ỷ"),
+ (0x1EF7, "V"),
+ (0x1EF8, "M", "ỹ"),
+ (0x1EF9, "V"),
+ (0x1EFA, "M", "ỻ"),
+ (0x1EFB, "V"),
+ (0x1EFC, "M", "ỽ"),
+ (0x1EFD, "V"),
+ (0x1EFE, "M", "ỿ"),
+ (0x1EFF, "V"),
+ (0x1F08, "M", "ἀ"),
+ (0x1F09, "M", "ἁ"),
+ (0x1F0A, "M", "ἂ"),
+ (0x1F0B, "M", "ἃ"),
+ (0x1F0C, "M", "ἄ"),
+ (0x1F0D, "M", "ἅ"),
+ (0x1F0E, "M", "ἆ"),
+ (0x1F0F, "M", "ἇ"),
+ (0x1F10, "V"),
+ (0x1F16, "X"),
+ (0x1F18, "M", "ἐ"),
+ (0x1F19, "M", "ἑ"),
+ (0x1F1A, "M", "ἒ"),
+ (0x1F1B, "M", "ἓ"),
+ (0x1F1C, "M", "ἔ"),
+ (0x1F1D, "M", "ἕ"),
+ (0x1F1E, "X"),
+ (0x1F20, "V"),
+ (0x1F28, "M", "ἠ"),
+ (0x1F29, "M", "ἡ"),
+ (0x1F2A, "M", "ἢ"),
+ (0x1F2B, "M", "ἣ"),
+ (0x1F2C, "M", "ἤ"),
+ (0x1F2D, "M", "ἥ"),
+ (0x1F2E, "M", "ἦ"),
+ (0x1F2F, "M", "ἧ"),
+ (0x1F30, "V"),
+ (0x1F38, "M", "ἰ"),
+ (0x1F39, "M", "ἱ"),
+ (0x1F3A, "M", "ἲ"),
+ (0x1F3B, "M", "ἳ"),
+ (0x1F3C, "M", "ἴ"),
+ (0x1F3D, "M", "ἵ"),
+ (0x1F3E, "M", "ἶ"),
+ (0x1F3F, "M", "ἷ"),
+ (0x1F40, "V"),
+ (0x1F46, "X"),
+ (0x1F48, "M", "ὀ"),
+ (0x1F49, "M", "ὁ"),
+ (0x1F4A, "M", "ὂ"),
+ (0x1F4B, "M", "ὃ"),
+ (0x1F4C, "M", "ὄ"),
+ (0x1F4D, "M", "ὅ"),
+ (0x1F4E, "X"),
+ (0x1F50, "V"),
+ (0x1F58, "X"),
+ (0x1F59, "M", "ὑ"),
+ (0x1F5A, "X"),
+ (0x1F5B, "M", "ὓ"),
+ (0x1F5C, "X"),
+ (0x1F5D, "M", "ὕ"),
+ (0x1F5E, "X"),
+ (0x1F5F, "M", "ὗ"),
+ (0x1F60, "V"),
+ (0x1F68, "M", "ὠ"),
+ (0x1F69, "M", "ὡ"),
+ (0x1F6A, "M", "ὢ"),
+ (0x1F6B, "M", "ὣ"),
+ (0x1F6C, "M", "ὤ"),
+ (0x1F6D, "M", "ὥ"),
+ (0x1F6E, "M", "ὦ"),
+ (0x1F6F, "M", "ὧ"),
+ (0x1F70, "V"),
+ (0x1F71, "M", "ά"),
+ (0x1F72, "V"),
+ (0x1F73, "M", "έ"),
+ (0x1F74, "V"),
+ (0x1F75, "M", "ή"),
+ (0x1F76, "V"),
+ (0x1F77, "M", "ί"),
+ (0x1F78, "V"),
+ (0x1F79, "M", "ό"),
+ (0x1F7A, "V"),
+ (0x1F7B, "M", "ύ"),
+ (0x1F7C, "V"),
+ (0x1F7D, "M", "ώ"),
+ (0x1F7E, "X"),
+ (0x1F80, "M", "ἀι"),
+ (0x1F81, "M", "ἁι"),
+ (0x1F82, "M", "ἂι"),
+ (0x1F83, "M", "ἃι"),
+ (0x1F84, "M", "ἄι"),
+ (0x1F85, "M", "ἅι"),
+ (0x1F86, "M", "ἆι"),
+ (0x1F87, "M", "ἇι"),
]
-def _seg_20():
+
+def _seg_20() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x1F85, 'M', u'ἅι'),
- (0x1F86, 'M', u'ἆι'),
- (0x1F87, 'M', u'ἇι'),
- (0x1F88, 'M', u'ἀι'),
- (0x1F89, 'M', u'ἁι'),
- (0x1F8A, 'M', u'ἂι'),
- (0x1F8B, 'M', u'ἃι'),
- (0x1F8C, 'M', u'ἄι'),
- (0x1F8D, 'M', u'ἅι'),
- (0x1F8E, 'M', u'ἆι'),
- (0x1F8F, 'M', u'ἇι'),
- (0x1F90, 'M', u'ἠι'),
- (0x1F91, 'M', u'ἡι'),
- (0x1F92, 'M', u'ἢι'),
- (0x1F93, 'M', u'ἣι'),
- (0x1F94, 'M', u'ἤι'),
- (0x1F95, 'M', u'ἥι'),
- (0x1F96, 'M', u'ἦι'),
- (0x1F97, 'M', u'ἧι'),
- (0x1F98, 'M', u'ἠι'),
- (0x1F99, 'M', u'ἡι'),
- (0x1F9A, 'M', u'ἢι'),
- (0x1F9B, 'M', u'ἣι'),
- (0x1F9C, 'M', u'ἤι'),
- (0x1F9D, 'M', u'ἥι'),
- (0x1F9E, 'M', u'ἦι'),
- (0x1F9F, 'M', u'ἧι'),
- (0x1FA0, 'M', u'ὠι'),
- (0x1FA1, 'M', u'ὡι'),
- (0x1FA2, 'M', u'ὢι'),
- (0x1FA3, 'M', u'ὣι'),
- (0x1FA4, 'M', u'ὤι'),
- (0x1FA5, 'M', u'ὥι'),
- (0x1FA6, 'M', u'ὦι'),
- (0x1FA7, 'M', u'ὧι'),
- (0x1FA8, 'M', u'ὠι'),
- (0x1FA9, 'M', u'ὡι'),
- (0x1FAA, 'M', u'ὢι'),
- (0x1FAB, 'M', u'ὣι'),
- (0x1FAC, 'M', u'ὤι'),
- (0x1FAD, 'M', u'ὥι'),
- (0x1FAE, 'M', u'ὦι'),
- (0x1FAF, 'M', u'ὧι'),
- (0x1FB0, 'V'),
- (0x1FB2, 'M', u'ὰι'),
- (0x1FB3, 'M', u'αι'),
- (0x1FB4, 'M', u'άι'),
- (0x1FB5, 'X'),
- (0x1FB6, 'V'),
- (0x1FB7, 'M', u'ᾶι'),
- (0x1FB8, 'M', u'ᾰ'),
- (0x1FB9, 'M', u'ᾱ'),
- (0x1FBA, 'M', u'ὰ'),
- (0x1FBB, 'M', u'ά'),
- (0x1FBC, 'M', u'αι'),
- (0x1FBD, '3', u' ̓'),
- (0x1FBE, 'M', u'ι'),
- (0x1FBF, '3', u' ̓'),
- (0x1FC0, '3', u' ͂'),
- (0x1FC1, '3', u' ̈͂'),
- (0x1FC2, 'M', u'ὴι'),
- (0x1FC3, 'M', u'ηι'),
- (0x1FC4, 'M', u'ήι'),
- (0x1FC5, 'X'),
- (0x1FC6, 'V'),
- (0x1FC7, 'M', u'ῆι'),
- (0x1FC8, 'M', u'ὲ'),
- (0x1FC9, 'M', u'έ'),
- (0x1FCA, 'M', u'ὴ'),
- (0x1FCB, 'M', u'ή'),
- (0x1FCC, 'M', u'ηι'),
- (0x1FCD, '3', u' ̓̀'),
- (0x1FCE, '3', u' ̓́'),
- (0x1FCF, '3', u' ̓͂'),
- (0x1FD0, 'V'),
- (0x1FD3, 'M', u'ΐ'),
- (0x1FD4, 'X'),
- (0x1FD6, 'V'),
- (0x1FD8, 'M', u'ῐ'),
- (0x1FD9, 'M', u'ῑ'),
- (0x1FDA, 'M', u'ὶ'),
- (0x1FDB, 'M', u'ί'),
- (0x1FDC, 'X'),
- (0x1FDD, '3', u' ̔̀'),
- (0x1FDE, '3', u' ̔́'),
- (0x1FDF, '3', u' ̔͂'),
- (0x1FE0, 'V'),
- (0x1FE3, 'M', u'ΰ'),
- (0x1FE4, 'V'),
- (0x1FE8, 'M', u'ῠ'),
- (0x1FE9, 'M', u'ῡ'),
- (0x1FEA, 'M', u'ὺ'),
- (0x1FEB, 'M', u'ύ'),
- (0x1FEC, 'M', u'ῥ'),
- (0x1FED, '3', u' ̈̀'),
- (0x1FEE, '3', u' ̈́'),
- (0x1FEF, '3', u'`'),
- (0x1FF0, 'X'),
- (0x1FF2, 'M', u'ὼι'),
- (0x1FF3, 'M', u'ωι'),
+ (0x1F88, "M", "ἀι"),
+ (0x1F89, "M", "ἁι"),
+ (0x1F8A, "M", "ἂι"),
+ (0x1F8B, "M", "ἃι"),
+ (0x1F8C, "M", "ἄι"),
+ (0x1F8D, "M", "ἅι"),
+ (0x1F8E, "M", "ἆι"),
+ (0x1F8F, "M", "ἇι"),
+ (0x1F90, "M", "ἠι"),
+ (0x1F91, "M", "ἡι"),
+ (0x1F92, "M", "ἢι"),
+ (0x1F93, "M", "ἣι"),
+ (0x1F94, "M", "ἤι"),
+ (0x1F95, "M", "ἥι"),
+ (0x1F96, "M", "ἦι"),
+ (0x1F97, "M", "ἧι"),
+ (0x1F98, "M", "ἠι"),
+ (0x1F99, "M", "ἡι"),
+ (0x1F9A, "M", "ἢι"),
+ (0x1F9B, "M", "ἣι"),
+ (0x1F9C, "M", "ἤι"),
+ (0x1F9D, "M", "ἥι"),
+ (0x1F9E, "M", "ἦι"),
+ (0x1F9F, "M", "ἧι"),
+ (0x1FA0, "M", "ὠι"),
+ (0x1FA1, "M", "ὡι"),
+ (0x1FA2, "M", "ὢι"),
+ (0x1FA3, "M", "ὣι"),
+ (0x1FA4, "M", "ὤι"),
+ (0x1FA5, "M", "ὥι"),
+ (0x1FA6, "M", "ὦι"),
+ (0x1FA7, "M", "ὧι"),
+ (0x1FA8, "M", "ὠι"),
+ (0x1FA9, "M", "ὡι"),
+ (0x1FAA, "M", "ὢι"),
+ (0x1FAB, "M", "ὣι"),
+ (0x1FAC, "M", "ὤι"),
+ (0x1FAD, "M", "ὥι"),
+ (0x1FAE, "M", "ὦι"),
+ (0x1FAF, "M", "ὧι"),
+ (0x1FB0, "V"),
+ (0x1FB2, "M", "ὰι"),
+ (0x1FB3, "M", "αι"),
+ (0x1FB4, "M", "άι"),
+ (0x1FB5, "X"),
+ (0x1FB6, "V"),
+ (0x1FB7, "M", "ᾶι"),
+ (0x1FB8, "M", "ᾰ"),
+ (0x1FB9, "M", "ᾱ"),
+ (0x1FBA, "M", "ὰ"),
+ (0x1FBB, "M", "ά"),
+ (0x1FBC, "M", "αι"),
+ (0x1FBD, "3", " ̓"),
+ (0x1FBE, "M", "ι"),
+ (0x1FBF, "3", " ̓"),
+ (0x1FC0, "3", " ͂"),
+ (0x1FC1, "3", " ̈͂"),
+ (0x1FC2, "M", "ὴι"),
+ (0x1FC3, "M", "ηι"),
+ (0x1FC4, "M", "ήι"),
+ (0x1FC5, "X"),
+ (0x1FC6, "V"),
+ (0x1FC7, "M", "ῆι"),
+ (0x1FC8, "M", "ὲ"),
+ (0x1FC9, "M", "έ"),
+ (0x1FCA, "M", "ὴ"),
+ (0x1FCB, "M", "ή"),
+ (0x1FCC, "M", "ηι"),
+ (0x1FCD, "3", " ̓̀"),
+ (0x1FCE, "3", " ̓́"),
+ (0x1FCF, "3", " ̓͂"),
+ (0x1FD0, "V"),
+ (0x1FD3, "M", "ΐ"),
+ (0x1FD4, "X"),
+ (0x1FD6, "V"),
+ (0x1FD8, "M", "ῐ"),
+ (0x1FD9, "M", "ῑ"),
+ (0x1FDA, "M", "ὶ"),
+ (0x1FDB, "M", "ί"),
+ (0x1FDC, "X"),
+ (0x1FDD, "3", " ̔̀"),
+ (0x1FDE, "3", " ̔́"),
+ (0x1FDF, "3", " ̔͂"),
+ (0x1FE0, "V"),
+ (0x1FE3, "M", "ΰ"),
+ (0x1FE4, "V"),
+ (0x1FE8, "M", "ῠ"),
+ (0x1FE9, "M", "ῡ"),
+ (0x1FEA, "M", "ὺ"),
+ (0x1FEB, "M", "ύ"),
+ (0x1FEC, "M", "ῥ"),
+ (0x1FED, "3", " ̈̀"),
+ (0x1FEE, "3", " ̈́"),
+ (0x1FEF, "3", "`"),
+ (0x1FF0, "X"),
+ (0x1FF2, "M", "ὼι"),
+ (0x1FF3, "M", "ωι"),
+ (0x1FF4, "M", "ώι"),
+ (0x1FF5, "X"),
+ (0x1FF6, "V"),
]
-def _seg_21():
+
+def _seg_21() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x1FF4, 'M', u'ώι'),
- (0x1FF5, 'X'),
- (0x1FF6, 'V'),
- (0x1FF7, 'M', u'ῶι'),
- (0x1FF8, 'M', u'ὸ'),
- (0x1FF9, 'M', u'ό'),
- (0x1FFA, 'M', u'ὼ'),
- (0x1FFB, 'M', u'ώ'),
- (0x1FFC, 'M', u'ωι'),
- (0x1FFD, '3', u' ́'),
- (0x1FFE, '3', u' ̔'),
- (0x1FFF, 'X'),
- (0x2000, '3', u' '),
- (0x200B, 'I'),
- (0x200C, 'D', u''),
- (0x200E, 'X'),
- (0x2010, 'V'),
- (0x2011, 'M', u'‐'),
- (0x2012, 'V'),
- (0x2017, '3', u' ̳'),
- (0x2018, 'V'),
- (0x2024, 'X'),
- (0x2027, 'V'),
- (0x2028, 'X'),
- (0x202F, '3', u' '),
- (0x2030, 'V'),
- (0x2033, 'M', u'′′'),
- (0x2034, 'M', u'′′′'),
- (0x2035, 'V'),
- (0x2036, 'M', u'‵‵'),
- (0x2037, 'M', u'‵‵‵'),
- (0x2038, 'V'),
- (0x203C, '3', u'!!'),
- (0x203D, 'V'),
- (0x203E, '3', u' ̅'),
- (0x203F, 'V'),
- (0x2047, '3', u'??'),
- (0x2048, '3', u'?!'),
- (0x2049, '3', u'!?'),
- (0x204A, 'V'),
- (0x2057, 'M', u'′′′′'),
- (0x2058, 'V'),
- (0x205F, '3', u' '),
- (0x2060, 'I'),
- (0x2061, 'X'),
- (0x2064, 'I'),
- (0x2065, 'X'),
- (0x2070, 'M', u'0'),
- (0x2071, 'M', u'i'),
- (0x2072, 'X'),
- (0x2074, 'M', u'4'),
- (0x2075, 'M', u'5'),
- (0x2076, 'M', u'6'),
- (0x2077, 'M', u'7'),
- (0x2078, 'M', u'8'),
- (0x2079, 'M', u'9'),
- (0x207A, '3', u'+'),
- (0x207B, 'M', u'−'),
- (0x207C, '3', u'='),
- (0x207D, '3', u'('),
- (0x207E, '3', u')'),
- (0x207F, 'M', u'n'),
- (0x2080, 'M', u'0'),
- (0x2081, 'M', u'1'),
- (0x2082, 'M', u'2'),
- (0x2083, 'M', u'3'),
- (0x2084, 'M', u'4'),
- (0x2085, 'M', u'5'),
- (0x2086, 'M', u'6'),
- (0x2087, 'M', u'7'),
- (0x2088, 'M', u'8'),
- (0x2089, 'M', u'9'),
- (0x208A, '3', u'+'),
- (0x208B, 'M', u'−'),
- (0x208C, '3', u'='),
- (0x208D, '3', u'('),
- (0x208E, '3', u')'),
- (0x208F, 'X'),
- (0x2090, 'M', u'a'),
- (0x2091, 'M', u'e'),
- (0x2092, 'M', u'o'),
- (0x2093, 'M', u'x'),
- (0x2094, 'M', u'ə'),
- (0x2095, 'M', u'h'),
- (0x2096, 'M', u'k'),
- (0x2097, 'M', u'l'),
- (0x2098, 'M', u'm'),
- (0x2099, 'M', u'n'),
- (0x209A, 'M', u'p'),
- (0x209B, 'M', u's'),
- (0x209C, 'M', u't'),
- (0x209D, 'X'),
- (0x20A0, 'V'),
- (0x20A8, 'M', u'rs'),
- (0x20A9, 'V'),
- (0x20C0, 'X'),
- (0x20D0, 'V'),
- (0x20F1, 'X'),
- (0x2100, '3', u'a/c'),
- (0x2101, '3', u'a/s'),
+ (0x1FF7, "M", "ῶι"),
+ (0x1FF8, "M", "ὸ"),
+ (0x1FF9, "M", "ό"),
+ (0x1FFA, "M", "ὼ"),
+ (0x1FFB, "M", "ώ"),
+ (0x1FFC, "M", "ωι"),
+ (0x1FFD, "3", " ́"),
+ (0x1FFE, "3", " ̔"),
+ (0x1FFF, "X"),
+ (0x2000, "3", " "),
+ (0x200B, "I"),
+ (0x200C, "D", ""),
+ (0x200E, "X"),
+ (0x2010, "V"),
+ (0x2011, "M", "‐"),
+ (0x2012, "V"),
+ (0x2017, "3", " ̳"),
+ (0x2018, "V"),
+ (0x2024, "X"),
+ (0x2027, "V"),
+ (0x2028, "X"),
+ (0x202F, "3", " "),
+ (0x2030, "V"),
+ (0x2033, "M", "′′"),
+ (0x2034, "M", "′′′"),
+ (0x2035, "V"),
+ (0x2036, "M", "‵‵"),
+ (0x2037, "M", "‵‵‵"),
+ (0x2038, "V"),
+ (0x203C, "3", "!!"),
+ (0x203D, "V"),
+ (0x203E, "3", " ̅"),
+ (0x203F, "V"),
+ (0x2047, "3", "??"),
+ (0x2048, "3", "?!"),
+ (0x2049, "3", "!?"),
+ (0x204A, "V"),
+ (0x2057, "M", "′′′′"),
+ (0x2058, "V"),
+ (0x205F, "3", " "),
+ (0x2060, "I"),
+ (0x2061, "X"),
+ (0x2064, "I"),
+ (0x2065, "X"),
+ (0x2070, "M", "0"),
+ (0x2071, "M", "i"),
+ (0x2072, "X"),
+ (0x2074, "M", "4"),
+ (0x2075, "M", "5"),
+ (0x2076, "M", "6"),
+ (0x2077, "M", "7"),
+ (0x2078, "M", "8"),
+ (0x2079, "M", "9"),
+ (0x207A, "3", "+"),
+ (0x207B, "M", "−"),
+ (0x207C, "3", "="),
+ (0x207D, "3", "("),
+ (0x207E, "3", ")"),
+ (0x207F, "M", "n"),
+ (0x2080, "M", "0"),
+ (0x2081, "M", "1"),
+ (0x2082, "M", "2"),
+ (0x2083, "M", "3"),
+ (0x2084, "M", "4"),
+ (0x2085, "M", "5"),
+ (0x2086, "M", "6"),
+ (0x2087, "M", "7"),
+ (0x2088, "M", "8"),
+ (0x2089, "M", "9"),
+ (0x208A, "3", "+"),
+ (0x208B, "M", "−"),
+ (0x208C, "3", "="),
+ (0x208D, "3", "("),
+ (0x208E, "3", ")"),
+ (0x208F, "X"),
+ (0x2090, "M", "a"),
+ (0x2091, "M", "e"),
+ (0x2092, "M", "o"),
+ (0x2093, "M", "x"),
+ (0x2094, "M", "ə"),
+ (0x2095, "M", "h"),
+ (0x2096, "M", "k"),
+ (0x2097, "M", "l"),
+ (0x2098, "M", "m"),
+ (0x2099, "M", "n"),
+ (0x209A, "M", "p"),
+ (0x209B, "M", "s"),
+ (0x209C, "M", "t"),
+ (0x209D, "X"),
+ (0x20A0, "V"),
+ (0x20A8, "M", "rs"),
+ (0x20A9, "V"),
+ (0x20C1, "X"),
+ (0x20D0, "V"),
+ (0x20F1, "X"),
+ (0x2100, "3", "a/c"),
+ (0x2101, "3", "a/s"),
+ (0x2102, "M", "c"),
+ (0x2103, "M", "°c"),
+ (0x2104, "V"),
]
-def _seg_22():
+
+def _seg_22() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
+ return [
+ (0x2105, "3", "c/o"),
+ (0x2106, "3", "c/u"),
+ (0x2107, "M", "ɛ"),
+ (0x2108, "V"),
+ (0x2109, "M", "°f"),
+ (0x210A, "M", "g"),
+ (0x210B, "M", "h"),
+ (0x210F, "M", "ħ"),
+ (0x2110, "M", "i"),
+ (0x2112, "M", "l"),
+ (0x2114, "V"),
+ (0x2115, "M", "n"),
+ (0x2116, "M", "no"),
+ (0x2117, "V"),
+ (0x2119, "M", "p"),
+ (0x211A, "M", "q"),
+ (0x211B, "M", "r"),
+ (0x211E, "V"),
+ (0x2120, "M", "sm"),
+ (0x2121, "M", "tel"),
+ (0x2122, "M", "tm"),
+ (0x2123, "V"),
+ (0x2124, "M", "z"),
+ (0x2125, "V"),
+ (0x2126, "M", "ω"),
+ (0x2127, "V"),
+ (0x2128, "M", "z"),
+ (0x2129, "V"),
+ (0x212A, "M", "k"),
+ (0x212B, "M", "å"),
+ (0x212C, "M", "b"),
+ (0x212D, "M", "c"),
+ (0x212E, "V"),
+ (0x212F, "M", "e"),
+ (0x2131, "M", "f"),
+ (0x2132, "X"),
+ (0x2133, "M", "m"),
+ (0x2134, "M", "o"),
+ (0x2135, "M", "א"),
+ (0x2136, "M", "ב"),
+ (0x2137, "M", "ג"),
+ (0x2138, "M", "ד"),
+ (0x2139, "M", "i"),
+ (0x213A, "V"),
+ (0x213B, "M", "fax"),
+ (0x213C, "M", "π"),
+ (0x213D, "M", "γ"),
+ (0x213F, "M", "π"),
+ (0x2140, "M", "∑"),
+ (0x2141, "V"),
+ (0x2145, "M", "d"),
+ (0x2147, "M", "e"),
+ (0x2148, "M", "i"),
+ (0x2149, "M", "j"),
+ (0x214A, "V"),
+ (0x2150, "M", "1⁄7"),
+ (0x2151, "M", "1⁄9"),
+ (0x2152, "M", "1⁄10"),
+ (0x2153, "M", "1⁄3"),
+ (0x2154, "M", "2⁄3"),
+ (0x2155, "M", "1⁄5"),
+ (0x2156, "M", "2⁄5"),
+ (0x2157, "M", "3⁄5"),
+ (0x2158, "M", "4⁄5"),
+ (0x2159, "M", "1⁄6"),
+ (0x215A, "M", "5⁄6"),
+ (0x215B, "M", "1⁄8"),
+ (0x215C, "M", "3⁄8"),
+ (0x215D, "M", "5⁄8"),
+ (0x215E, "M", "7⁄8"),
+ (0x215F, "M", "1⁄"),
+ (0x2160, "M", "i"),
+ (0x2161, "M", "ii"),
+ (0x2162, "M", "iii"),
+ (0x2163, "M", "iv"),
+ (0x2164, "M", "v"),
+ (0x2165, "M", "vi"),
+ (0x2166, "M", "vii"),
+ (0x2167, "M", "viii"),
+ (0x2168, "M", "ix"),
+ (0x2169, "M", "x"),
+ (0x216A, "M", "xi"),
+ (0x216B, "M", "xii"),
+ (0x216C, "M", "l"),
+ (0x216D, "M", "c"),
+ (0x216E, "M", "d"),
+ (0x216F, "M", "m"),
+ (0x2170, "M", "i"),
+ (0x2171, "M", "ii"),
+ (0x2172, "M", "iii"),
+ (0x2173, "M", "iv"),
+ (0x2174, "M", "v"),
+ (0x2175, "M", "vi"),
+ (0x2176, "M", "vii"),
+ (0x2177, "M", "viii"),
+ (0x2178, "M", "ix"),
+ (0x2179, "M", "x"),
+ (0x217A, "M", "xi"),
+ (0x217B, "M", "xii"),
+ (0x217C, "M", "l"),
+ ]
+
+
+def _seg_23() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x2102, 'M', u'c'),
- (0x2103, 'M', u'°c'),
- (0x2104, 'V'),
- (0x2105, '3', u'c/o'),
- (0x2106, '3', u'c/u'),
- (0x2107, 'M', u'ɛ'),
- (0x2108, 'V'),
- (0x2109, 'M', u'°f'),
- (0x210A, 'M', u'g'),
- (0x210B, 'M', u'h'),
- (0x210F, 'M', u'ħ'),
- (0x2110, 'M', u'i'),
- (0x2112, 'M', u'l'),
- (0x2114, 'V'),
- (0x2115, 'M', u'n'),
- (0x2116, 'M', u'no'),
- (0x2117, 'V'),
- (0x2119, 'M', u'p'),
- (0x211A, 'M', u'q'),
- (0x211B, 'M', u'r'),
- (0x211E, 'V'),
- (0x2120, 'M', u'sm'),
- (0x2121, 'M', u'tel'),
- (0x2122, 'M', u'tm'),
- (0x2123, 'V'),
- (0x2124, 'M', u'z'),
- (0x2125, 'V'),
- (0x2126, 'M', u'ω'),
- (0x2127, 'V'),
- (0x2128, 'M', u'z'),
- (0x2129, 'V'),
- (0x212A, 'M', u'k'),
- (0x212B, 'M', u'å'),
- (0x212C, 'M', u'b'),
- (0x212D, 'M', u'c'),
- (0x212E, 'V'),
- (0x212F, 'M', u'e'),
- (0x2131, 'M', u'f'),
- (0x2132, 'X'),
- (0x2133, 'M', u'm'),
- (0x2134, 'M', u'o'),
- (0x2135, 'M', u'א'),
- (0x2136, 'M', u'ב'),
- (0x2137, 'M', u'ג'),
- (0x2138, 'M', u'ד'),
- (0x2139, 'M', u'i'),
- (0x213A, 'V'),
- (0x213B, 'M', u'fax'),
- (0x213C, 'M', u'π'),
- (0x213D, 'M', u'γ'),
- (0x213F, 'M', u'π'),
- (0x2140, 'M', u'∑'),
- (0x2141, 'V'),
- (0x2145, 'M', u'd'),
- (0x2147, 'M', u'e'),
- (0x2148, 'M', u'i'),
- (0x2149, 'M', u'j'),
- (0x214A, 'V'),
- (0x2150, 'M', u'1⁄7'),
- (0x2151, 'M', u'1⁄9'),
- (0x2152, 'M', u'1⁄10'),
- (0x2153, 'M', u'1⁄3'),
- (0x2154, 'M', u'2⁄3'),
- (0x2155, 'M', u'1⁄5'),
- (0x2156, 'M', u'2⁄5'),
- (0x2157, 'M', u'3⁄5'),
- (0x2158, 'M', u'4⁄5'),
- (0x2159, 'M', u'1⁄6'),
- (0x215A, 'M', u'5⁄6'),
- (0x215B, 'M', u'1⁄8'),
- (0x215C, 'M', u'3⁄8'),
- (0x215D, 'M', u'5⁄8'),
- (0x215E, 'M', u'7⁄8'),
- (0x215F, 'M', u'1⁄'),
- (0x2160, 'M', u'i'),
- (0x2161, 'M', u'ii'),
- (0x2162, 'M', u'iii'),
- (0x2163, 'M', u'iv'),
- (0x2164, 'M', u'v'),
- (0x2165, 'M', u'vi'),
- (0x2166, 'M', u'vii'),
- (0x2167, 'M', u'viii'),
- (0x2168, 'M', u'ix'),
- (0x2169, 'M', u'x'),
- (0x216A, 'M', u'xi'),
- (0x216B, 'M', u'xii'),
- (0x216C, 'M', u'l'),
- (0x216D, 'M', u'c'),
- (0x216E, 'M', u'd'),
- (0x216F, 'M', u'm'),
- (0x2170, 'M', u'i'),
- (0x2171, 'M', u'ii'),
- (0x2172, 'M', u'iii'),
- (0x2173, 'M', u'iv'),
- (0x2174, 'M', u'v'),
- (0x2175, 'M', u'vi'),
- (0x2176, 'M', u'vii'),
- (0x2177, 'M', u'viii'),
- (0x2178, 'M', u'ix'),
- (0x2179, 'M', u'x'),
+ (0x217D, "M", "c"),
+ (0x217E, "M", "d"),
+ (0x217F, "M", "m"),
+ (0x2180, "V"),
+ (0x2183, "X"),
+ (0x2184, "V"),
+ (0x2189, "M", "0⁄3"),
+ (0x218A, "V"),
+ (0x218C, "X"),
+ (0x2190, "V"),
+ (0x222C, "M", "∫∫"),
+ (0x222D, "M", "∫∫∫"),
+ (0x222E, "V"),
+ (0x222F, "M", "∮∮"),
+ (0x2230, "M", "∮∮∮"),
+ (0x2231, "V"),
+ (0x2329, "M", "〈"),
+ (0x232A, "M", "〉"),
+ (0x232B, "V"),
+ (0x2427, "X"),
+ (0x2440, "V"),
+ (0x244B, "X"),
+ (0x2460, "M", "1"),
+ (0x2461, "M", "2"),
+ (0x2462, "M", "3"),
+ (0x2463, "M", "4"),
+ (0x2464, "M", "5"),
+ (0x2465, "M", "6"),
+ (0x2466, "M", "7"),
+ (0x2467, "M", "8"),
+ (0x2468, "M", "9"),
+ (0x2469, "M", "10"),
+ (0x246A, "M", "11"),
+ (0x246B, "M", "12"),
+ (0x246C, "M", "13"),
+ (0x246D, "M", "14"),
+ (0x246E, "M", "15"),
+ (0x246F, "M", "16"),
+ (0x2470, "M", "17"),
+ (0x2471, "M", "18"),
+ (0x2472, "M", "19"),
+ (0x2473, "M", "20"),
+ (0x2474, "3", "(1)"),
+ (0x2475, "3", "(2)"),
+ (0x2476, "3", "(3)"),
+ (0x2477, "3", "(4)"),
+ (0x2478, "3", "(5)"),
+ (0x2479, "3", "(6)"),
+ (0x247A, "3", "(7)"),
+ (0x247B, "3", "(8)"),
+ (0x247C, "3", "(9)"),
+ (0x247D, "3", "(10)"),
+ (0x247E, "3", "(11)"),
+ (0x247F, "3", "(12)"),
+ (0x2480, "3", "(13)"),
+ (0x2481, "3", "(14)"),
+ (0x2482, "3", "(15)"),
+ (0x2483, "3", "(16)"),
+ (0x2484, "3", "(17)"),
+ (0x2485, "3", "(18)"),
+ (0x2486, "3", "(19)"),
+ (0x2487, "3", "(20)"),
+ (0x2488, "X"),
+ (0x249C, "3", "(a)"),
+ (0x249D, "3", "(b)"),
+ (0x249E, "3", "(c)"),
+ (0x249F, "3", "(d)"),
+ (0x24A0, "3", "(e)"),
+ (0x24A1, "3", "(f)"),
+ (0x24A2, "3", "(g)"),
+ (0x24A3, "3", "(h)"),
+ (0x24A4, "3", "(i)"),
+ (0x24A5, "3", "(j)"),
+ (0x24A6, "3", "(k)"),
+ (0x24A7, "3", "(l)"),
+ (0x24A8, "3", "(m)"),
+ (0x24A9, "3", "(n)"),
+ (0x24AA, "3", "(o)"),
+ (0x24AB, "3", "(p)"),
+ (0x24AC, "3", "(q)"),
+ (0x24AD, "3", "(r)"),
+ (0x24AE, "3", "(s)"),
+ (0x24AF, "3", "(t)"),
+ (0x24B0, "3", "(u)"),
+ (0x24B1, "3", "(v)"),
+ (0x24B2, "3", "(w)"),
+ (0x24B3, "3", "(x)"),
+ (0x24B4, "3", "(y)"),
+ (0x24B5, "3", "(z)"),
+ (0x24B6, "M", "a"),
+ (0x24B7, "M", "b"),
+ (0x24B8, "M", "c"),
+ (0x24B9, "M", "d"),
+ (0x24BA, "M", "e"),
+ (0x24BB, "M", "f"),
+ (0x24BC, "M", "g"),
+ (0x24BD, "M", "h"),
+ (0x24BE, "M", "i"),
+ (0x24BF, "M", "j"),
+ (0x24C0, "M", "k"),
]
-def _seg_23():
+
+def _seg_24() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x217A, 'M', u'xi'),
- (0x217B, 'M', u'xii'),
- (0x217C, 'M', u'l'),
- (0x217D, 'M', u'c'),
- (0x217E, 'M', u'd'),
- (0x217F, 'M', u'm'),
- (0x2180, 'V'),
- (0x2183, 'X'),
- (0x2184, 'V'),
- (0x2189, 'M', u'0⁄3'),
- (0x218A, 'V'),
- (0x218C, 'X'),
- (0x2190, 'V'),
- (0x222C, 'M', u'∫∫'),
- (0x222D, 'M', u'∫∫∫'),
- (0x222E, 'V'),
- (0x222F, 'M', u'∮∮'),
- (0x2230, 'M', u'∮∮∮'),
- (0x2231, 'V'),
- (0x2260, '3'),
- (0x2261, 'V'),
- (0x226E, '3'),
- (0x2270, 'V'),
- (0x2329, 'M', u'〈'),
- (0x232A, 'M', u'〉'),
- (0x232B, 'V'),
- (0x2427, 'X'),
- (0x2440, 'V'),
- (0x244B, 'X'),
- (0x2460, 'M', u'1'),
- (0x2461, 'M', u'2'),
- (0x2462, 'M', u'3'),
- (0x2463, 'M', u'4'),
- (0x2464, 'M', u'5'),
- (0x2465, 'M', u'6'),
- (0x2466, 'M', u'7'),
- (0x2467, 'M', u'8'),
- (0x2468, 'M', u'9'),
- (0x2469, 'M', u'10'),
- (0x246A, 'M', u'11'),
- (0x246B, 'M', u'12'),
- (0x246C, 'M', u'13'),
- (0x246D, 'M', u'14'),
- (0x246E, 'M', u'15'),
- (0x246F, 'M', u'16'),
- (0x2470, 'M', u'17'),
- (0x2471, 'M', u'18'),
- (0x2472, 'M', u'19'),
- (0x2473, 'M', u'20'),
- (0x2474, '3', u'(1)'),
- (0x2475, '3', u'(2)'),
- (0x2476, '3', u'(3)'),
- (0x2477, '3', u'(4)'),
- (0x2478, '3', u'(5)'),
- (0x2479, '3', u'(6)'),
- (0x247A, '3', u'(7)'),
- (0x247B, '3', u'(8)'),
- (0x247C, '3', u'(9)'),
- (0x247D, '3', u'(10)'),
- (0x247E, '3', u'(11)'),
- (0x247F, '3', u'(12)'),
- (0x2480, '3', u'(13)'),
- (0x2481, '3', u'(14)'),
- (0x2482, '3', u'(15)'),
- (0x2483, '3', u'(16)'),
- (0x2484, '3', u'(17)'),
- (0x2485, '3', u'(18)'),
- (0x2486, '3', u'(19)'),
- (0x2487, '3', u'(20)'),
- (0x2488, 'X'),
- (0x249C, '3', u'(a)'),
- (0x249D, '3', u'(b)'),
- (0x249E, '3', u'(c)'),
- (0x249F, '3', u'(d)'),
- (0x24A0, '3', u'(e)'),
- (0x24A1, '3', u'(f)'),
- (0x24A2, '3', u'(g)'),
- (0x24A3, '3', u'(h)'),
- (0x24A4, '3', u'(i)'),
- (0x24A5, '3', u'(j)'),
- (0x24A6, '3', u'(k)'),
- (0x24A7, '3', u'(l)'),
- (0x24A8, '3', u'(m)'),
- (0x24A9, '3', u'(n)'),
- (0x24AA, '3', u'(o)'),
- (0x24AB, '3', u'(p)'),
- (0x24AC, '3', u'(q)'),
- (0x24AD, '3', u'(r)'),
- (0x24AE, '3', u'(s)'),
- (0x24AF, '3', u'(t)'),
- (0x24B0, '3', u'(u)'),
- (0x24B1, '3', u'(v)'),
- (0x24B2, '3', u'(w)'),
- (0x24B3, '3', u'(x)'),
- (0x24B4, '3', u'(y)'),
- (0x24B5, '3', u'(z)'),
- (0x24B6, 'M', u'a'),
- (0x24B7, 'M', u'b'),
- (0x24B8, 'M', u'c'),
- (0x24B9, 'M', u'd'),
+ (0x24C1, "M", "l"),
+ (0x24C2, "M", "m"),
+ (0x24C3, "M", "n"),
+ (0x24C4, "M", "o"),
+ (0x24C5, "M", "p"),
+ (0x24C6, "M", "q"),
+ (0x24C7, "M", "r"),
+ (0x24C8, "M", "s"),
+ (0x24C9, "M", "t"),
+ (0x24CA, "M", "u"),
+ (0x24CB, "M", "v"),
+ (0x24CC, "M", "w"),
+ (0x24CD, "M", "x"),
+ (0x24CE, "M", "y"),
+ (0x24CF, "M", "z"),
+ (0x24D0, "M", "a"),
+ (0x24D1, "M", "b"),
+ (0x24D2, "M", "c"),
+ (0x24D3, "M", "d"),
+ (0x24D4, "M", "e"),
+ (0x24D5, "M", "f"),
+ (0x24D6, "M", "g"),
+ (0x24D7, "M", "h"),
+ (0x24D8, "M", "i"),
+ (0x24D9, "M", "j"),
+ (0x24DA, "M", "k"),
+ (0x24DB, "M", "l"),
+ (0x24DC, "M", "m"),
+ (0x24DD, "M", "n"),
+ (0x24DE, "M", "o"),
+ (0x24DF, "M", "p"),
+ (0x24E0, "M", "q"),
+ (0x24E1, "M", "r"),
+ (0x24E2, "M", "s"),
+ (0x24E3, "M", "t"),
+ (0x24E4, "M", "u"),
+ (0x24E5, "M", "v"),
+ (0x24E6, "M", "w"),
+ (0x24E7, "M", "x"),
+ (0x24E8, "M", "y"),
+ (0x24E9, "M", "z"),
+ (0x24EA, "M", "0"),
+ (0x24EB, "V"),
+ (0x2A0C, "M", "∫∫∫∫"),
+ (0x2A0D, "V"),
+ (0x2A74, "3", "::="),
+ (0x2A75, "3", "=="),
+ (0x2A76, "3", "==="),
+ (0x2A77, "V"),
+ (0x2ADC, "M", "⫝̸"),
+ (0x2ADD, "V"),
+ (0x2B74, "X"),
+ (0x2B76, "V"),
+ (0x2B96, "X"),
+ (0x2B97, "V"),
+ (0x2C00, "M", "ⰰ"),
+ (0x2C01, "M", "ⰱ"),
+ (0x2C02, "M", "ⰲ"),
+ (0x2C03, "M", "ⰳ"),
+ (0x2C04, "M", "ⰴ"),
+ (0x2C05, "M", "ⰵ"),
+ (0x2C06, "M", "ⰶ"),
+ (0x2C07, "M", "ⰷ"),
+ (0x2C08, "M", "ⰸ"),
+ (0x2C09, "M", "ⰹ"),
+ (0x2C0A, "M", "ⰺ"),
+ (0x2C0B, "M", "ⰻ"),
+ (0x2C0C, "M", "ⰼ"),
+ (0x2C0D, "M", "ⰽ"),
+ (0x2C0E, "M", "ⰾ"),
+ (0x2C0F, "M", "ⰿ"),
+ (0x2C10, "M", "ⱀ"),
+ (0x2C11, "M", "ⱁ"),
+ (0x2C12, "M", "ⱂ"),
+ (0x2C13, "M", "ⱃ"),
+ (0x2C14, "M", "ⱄ"),
+ (0x2C15, "M", "ⱅ"),
+ (0x2C16, "M", "ⱆ"),
+ (0x2C17, "M", "ⱇ"),
+ (0x2C18, "M", "ⱈ"),
+ (0x2C19, "M", "ⱉ"),
+ (0x2C1A, "M", "ⱊ"),
+ (0x2C1B, "M", "ⱋ"),
+ (0x2C1C, "M", "ⱌ"),
+ (0x2C1D, "M", "ⱍ"),
+ (0x2C1E, "M", "ⱎ"),
+ (0x2C1F, "M", "ⱏ"),
+ (0x2C20, "M", "ⱐ"),
+ (0x2C21, "M", "ⱑ"),
+ (0x2C22, "M", "ⱒ"),
+ (0x2C23, "M", "ⱓ"),
+ (0x2C24, "M", "ⱔ"),
+ (0x2C25, "M", "ⱕ"),
+ (0x2C26, "M", "ⱖ"),
+ (0x2C27, "M", "ⱗ"),
+ (0x2C28, "M", "ⱘ"),
+ (0x2C29, "M", "ⱙ"),
+ (0x2C2A, "M", "ⱚ"),
+ (0x2C2B, "M", "ⱛ"),
+ (0x2C2C, "M", "ⱜ"),
]
-def _seg_24():
+
+def _seg_25() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
+ return [
+ (0x2C2D, "M", "ⱝ"),
+ (0x2C2E, "M", "ⱞ"),
+ (0x2C2F, "M", "ⱟ"),
+ (0x2C30, "V"),
+ (0x2C60, "M", "ⱡ"),
+ (0x2C61, "V"),
+ (0x2C62, "M", "ɫ"),
+ (0x2C63, "M", "ᵽ"),
+ (0x2C64, "M", "ɽ"),
+ (0x2C65, "V"),
+ (0x2C67, "M", "ⱨ"),
+ (0x2C68, "V"),
+ (0x2C69, "M", "ⱪ"),
+ (0x2C6A, "V"),
+ (0x2C6B, "M", "ⱬ"),
+ (0x2C6C, "V"),
+ (0x2C6D, "M", "ɑ"),
+ (0x2C6E, "M", "ɱ"),
+ (0x2C6F, "M", "ɐ"),
+ (0x2C70, "M", "ɒ"),
+ (0x2C71, "V"),
+ (0x2C72, "M", "ⱳ"),
+ (0x2C73, "V"),
+ (0x2C75, "M", "ⱶ"),
+ (0x2C76, "V"),
+ (0x2C7C, "M", "j"),
+ (0x2C7D, "M", "v"),
+ (0x2C7E, "M", "ȿ"),
+ (0x2C7F, "M", "ɀ"),
+ (0x2C80, "M", "ⲁ"),
+ (0x2C81, "V"),
+ (0x2C82, "M", "ⲃ"),
+ (0x2C83, "V"),
+ (0x2C84, "M", "ⲅ"),
+ (0x2C85, "V"),
+ (0x2C86, "M", "ⲇ"),
+ (0x2C87, "V"),
+ (0x2C88, "M", "ⲉ"),
+ (0x2C89, "V"),
+ (0x2C8A, "M", "ⲋ"),
+ (0x2C8B, "V"),
+ (0x2C8C, "M", "ⲍ"),
+ (0x2C8D, "V"),
+ (0x2C8E, "M", "ⲏ"),
+ (0x2C8F, "V"),
+ (0x2C90, "M", "ⲑ"),
+ (0x2C91, "V"),
+ (0x2C92, "M", "ⲓ"),
+ (0x2C93, "V"),
+ (0x2C94, "M", "ⲕ"),
+ (0x2C95, "V"),
+ (0x2C96, "M", "ⲗ"),
+ (0x2C97, "V"),
+ (0x2C98, "M", "ⲙ"),
+ (0x2C99, "V"),
+ (0x2C9A, "M", "ⲛ"),
+ (0x2C9B, "V"),
+ (0x2C9C, "M", "ⲝ"),
+ (0x2C9D, "V"),
+ (0x2C9E, "M", "ⲟ"),
+ (0x2C9F, "V"),
+ (0x2CA0, "M", "ⲡ"),
+ (0x2CA1, "V"),
+ (0x2CA2, "M", "ⲣ"),
+ (0x2CA3, "V"),
+ (0x2CA4, "M", "ⲥ"),
+ (0x2CA5, "V"),
+ (0x2CA6, "M", "ⲧ"),
+ (0x2CA7, "V"),
+ (0x2CA8, "M", "ⲩ"),
+ (0x2CA9, "V"),
+ (0x2CAA, "M", "ⲫ"),
+ (0x2CAB, "V"),
+ (0x2CAC, "M", "ⲭ"),
+ (0x2CAD, "V"),
+ (0x2CAE, "M", "ⲯ"),
+ (0x2CAF, "V"),
+ (0x2CB0, "M", "ⲱ"),
+ (0x2CB1, "V"),
+ (0x2CB2, "M", "ⲳ"),
+ (0x2CB3, "V"),
+ (0x2CB4, "M", "ⲵ"),
+ (0x2CB5, "V"),
+ (0x2CB6, "M", "ⲷ"),
+ (0x2CB7, "V"),
+ (0x2CB8, "M", "ⲹ"),
+ (0x2CB9, "V"),
+ (0x2CBA, "M", "ⲻ"),
+ (0x2CBB, "V"),
+ (0x2CBC, "M", "ⲽ"),
+ (0x2CBD, "V"),
+ (0x2CBE, "M", "ⲿ"),
+ (0x2CBF, "V"),
+ (0x2CC0, "M", "ⳁ"),
+ (0x2CC1, "V"),
+ (0x2CC2, "M", "ⳃ"),
+ (0x2CC3, "V"),
+ (0x2CC4, "M", "ⳅ"),
+ (0x2CC5, "V"),
+ (0x2CC6, "M", "ⳇ"),
+ ]
+
+
+def _seg_26() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x24BA, 'M', u'e'),
- (0x24BB, 'M', u'f'),
- (0x24BC, 'M', u'g'),
- (0x24BD, 'M', u'h'),
- (0x24BE, 'M', u'i'),
- (0x24BF, 'M', u'j'),
- (0x24C0, 'M', u'k'),
- (0x24C1, 'M', u'l'),
- (0x24C2, 'M', u'm'),
- (0x24C3, 'M', u'n'),
- (0x24C4, 'M', u'o'),
- (0x24C5, 'M', u'p'),
- (0x24C6, 'M', u'q'),
- (0x24C7, 'M', u'r'),
- (0x24C8, 'M', u's'),
- (0x24C9, 'M', u't'),
- (0x24CA, 'M', u'u'),
- (0x24CB, 'M', u'v'),
- (0x24CC, 'M', u'w'),
- (0x24CD, 'M', u'x'),
- (0x24CE, 'M', u'y'),
- (0x24CF, 'M', u'z'),
- (0x24D0, 'M', u'a'),
- (0x24D1, 'M', u'b'),
- (0x24D2, 'M', u'c'),
- (0x24D3, 'M', u'd'),
- (0x24D4, 'M', u'e'),
- (0x24D5, 'M', u'f'),
- (0x24D6, 'M', u'g'),
- (0x24D7, 'M', u'h'),
- (0x24D8, 'M', u'i'),
- (0x24D9, 'M', u'j'),
- (0x24DA, 'M', u'k'),
- (0x24DB, 'M', u'l'),
- (0x24DC, 'M', u'm'),
- (0x24DD, 'M', u'n'),
- (0x24DE, 'M', u'o'),
- (0x24DF, 'M', u'p'),
- (0x24E0, 'M', u'q'),
- (0x24E1, 'M', u'r'),
- (0x24E2, 'M', u's'),
- (0x24E3, 'M', u't'),
- (0x24E4, 'M', u'u'),
- (0x24E5, 'M', u'v'),
- (0x24E6, 'M', u'w'),
- (0x24E7, 'M', u'x'),
- (0x24E8, 'M', u'y'),
- (0x24E9, 'M', u'z'),
- (0x24EA, 'M', u'0'),
- (0x24EB, 'V'),
- (0x2A0C, 'M', u'∫∫∫∫'),
- (0x2A0D, 'V'),
- (0x2A74, '3', u'::='),
- (0x2A75, '3', u'=='),
- (0x2A76, '3', u'==='),
- (0x2A77, 'V'),
- (0x2ADC, 'M', u'⫝̸'),
- (0x2ADD, 'V'),
- (0x2B74, 'X'),
- (0x2B76, 'V'),
- (0x2B96, 'X'),
- (0x2B97, 'V'),
- (0x2C00, 'M', u'ⰰ'),
- (0x2C01, 'M', u'ⰱ'),
- (0x2C02, 'M', u'ⰲ'),
- (0x2C03, 'M', u'ⰳ'),
- (0x2C04, 'M', u'ⰴ'),
- (0x2C05, 'M', u'ⰵ'),
- (0x2C06, 'M', u'ⰶ'),
- (0x2C07, 'M', u'ⰷ'),
- (0x2C08, 'M', u'ⰸ'),
- (0x2C09, 'M', u'ⰹ'),
- (0x2C0A, 'M', u'ⰺ'),
- (0x2C0B, 'M', u'ⰻ'),
- (0x2C0C, 'M', u'ⰼ'),
- (0x2C0D, 'M', u'ⰽ'),
- (0x2C0E, 'M', u'ⰾ'),
- (0x2C0F, 'M', u'ⰿ'),
- (0x2C10, 'M', u'ⱀ'),
- (0x2C11, 'M', u'ⱁ'),
- (0x2C12, 'M', u'ⱂ'),
- (0x2C13, 'M', u'ⱃ'),
- (0x2C14, 'M', u'ⱄ'),
- (0x2C15, 'M', u'ⱅ'),
- (0x2C16, 'M', u'ⱆ'),
- (0x2C17, 'M', u'ⱇ'),
- (0x2C18, 'M', u'ⱈ'),
- (0x2C19, 'M', u'ⱉ'),
- (0x2C1A, 'M', u'ⱊ'),
- (0x2C1B, 'M', u'ⱋ'),
- (0x2C1C, 'M', u'ⱌ'),
- (0x2C1D, 'M', u'ⱍ'),
- (0x2C1E, 'M', u'ⱎ'),
- (0x2C1F, 'M', u'ⱏ'),
- (0x2C20, 'M', u'ⱐ'),
- (0x2C21, 'M', u'ⱑ'),
- (0x2C22, 'M', u'ⱒ'),
- (0x2C23, 'M', u'ⱓ'),
- (0x2C24, 'M', u'ⱔ'),
- (0x2C25, 'M', u'ⱕ'),
+ (0x2CC7, "V"),
+ (0x2CC8, "M", "ⳉ"),
+ (0x2CC9, "V"),
+ (0x2CCA, "M", "ⳋ"),
+ (0x2CCB, "V"),
+ (0x2CCC, "M", "ⳍ"),
+ (0x2CCD, "V"),
+ (0x2CCE, "M", "ⳏ"),
+ (0x2CCF, "V"),
+ (0x2CD0, "M", "ⳑ"),
+ (0x2CD1, "V"),
+ (0x2CD2, "M", "ⳓ"),
+ (0x2CD3, "V"),
+ (0x2CD4, "M", "ⳕ"),
+ (0x2CD5, "V"),
+ (0x2CD6, "M", "ⳗ"),
+ (0x2CD7, "V"),
+ (0x2CD8, "M", "ⳙ"),
+ (0x2CD9, "V"),
+ (0x2CDA, "M", "ⳛ"),
+ (0x2CDB, "V"),
+ (0x2CDC, "M", "ⳝ"),
+ (0x2CDD, "V"),
+ (0x2CDE, "M", "ⳟ"),
+ (0x2CDF, "V"),
+ (0x2CE0, "M", "ⳡ"),
+ (0x2CE1, "V"),
+ (0x2CE2, "M", "ⳣ"),
+ (0x2CE3, "V"),
+ (0x2CEB, "M", "ⳬ"),
+ (0x2CEC, "V"),
+ (0x2CED, "M", "ⳮ"),
+ (0x2CEE, "V"),
+ (0x2CF2, "M", "ⳳ"),
+ (0x2CF3, "V"),
+ (0x2CF4, "X"),
+ (0x2CF9, "V"),
+ (0x2D26, "X"),
+ (0x2D27, "V"),
+ (0x2D28, "X"),
+ (0x2D2D, "V"),
+ (0x2D2E, "X"),
+ (0x2D30, "V"),
+ (0x2D68, "X"),
+ (0x2D6F, "M", "ⵡ"),
+ (0x2D70, "V"),
+ (0x2D71, "X"),
+ (0x2D7F, "V"),
+ (0x2D97, "X"),
+ (0x2DA0, "V"),
+ (0x2DA7, "X"),
+ (0x2DA8, "V"),
+ (0x2DAF, "X"),
+ (0x2DB0, "V"),
+ (0x2DB7, "X"),
+ (0x2DB8, "V"),
+ (0x2DBF, "X"),
+ (0x2DC0, "V"),
+ (0x2DC7, "X"),
+ (0x2DC8, "V"),
+ (0x2DCF, "X"),
+ (0x2DD0, "V"),
+ (0x2DD7, "X"),
+ (0x2DD8, "V"),
+ (0x2DDF, "X"),
+ (0x2DE0, "V"),
+ (0x2E5E, "X"),
+ (0x2E80, "V"),
+ (0x2E9A, "X"),
+ (0x2E9B, "V"),
+ (0x2E9F, "M", "母"),
+ (0x2EA0, "V"),
+ (0x2EF3, "M", "龟"),
+ (0x2EF4, "X"),
+ (0x2F00, "M", "一"),
+ (0x2F01, "M", "丨"),
+ (0x2F02, "M", "丶"),
+ (0x2F03, "M", "丿"),
+ (0x2F04, "M", "乙"),
+ (0x2F05, "M", "亅"),
+ (0x2F06, "M", "二"),
+ (0x2F07, "M", "亠"),
+ (0x2F08, "M", "人"),
+ (0x2F09, "M", "儿"),
+ (0x2F0A, "M", "入"),
+ (0x2F0B, "M", "八"),
+ (0x2F0C, "M", "冂"),
+ (0x2F0D, "M", "冖"),
+ (0x2F0E, "M", "冫"),
+ (0x2F0F, "M", "几"),
+ (0x2F10, "M", "凵"),
+ (0x2F11, "M", "刀"),
+ (0x2F12, "M", "力"),
+ (0x2F13, "M", "勹"),
+ (0x2F14, "M", "匕"),
+ (0x2F15, "M", "匚"),
+ (0x2F16, "M", "匸"),
+ (0x2F17, "M", "十"),
+ (0x2F18, "M", "卜"),
+ (0x2F19, "M", "卩"),
]
-def _seg_25():
+
+def _seg_27() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x2C26, 'M', u'ⱖ'),
- (0x2C27, 'M', u'ⱗ'),
- (0x2C28, 'M', u'ⱘ'),
- (0x2C29, 'M', u'ⱙ'),
- (0x2C2A, 'M', u'ⱚ'),
- (0x2C2B, 'M', u'ⱛ'),
- (0x2C2C, 'M', u'ⱜ'),
- (0x2C2D, 'M', u'ⱝ'),
- (0x2C2E, 'M', u'ⱞ'),
- (0x2C2F, 'X'),
- (0x2C30, 'V'),
- (0x2C5F, 'X'),
- (0x2C60, 'M', u'ⱡ'),
- (0x2C61, 'V'),
- (0x2C62, 'M', u'ɫ'),
- (0x2C63, 'M', u'ᵽ'),
- (0x2C64, 'M', u'ɽ'),
- (0x2C65, 'V'),
- (0x2C67, 'M', u'ⱨ'),
- (0x2C68, 'V'),
- (0x2C69, 'M', u'ⱪ'),
- (0x2C6A, 'V'),
- (0x2C6B, 'M', u'ⱬ'),
- (0x2C6C, 'V'),
- (0x2C6D, 'M', u'ɑ'),
- (0x2C6E, 'M', u'ɱ'),
- (0x2C6F, 'M', u'ɐ'),
- (0x2C70, 'M', u'ɒ'),
- (0x2C71, 'V'),
- (0x2C72, 'M', u'ⱳ'),
- (0x2C73, 'V'),
- (0x2C75, 'M', u'ⱶ'),
- (0x2C76, 'V'),
- (0x2C7C, 'M', u'j'),
- (0x2C7D, 'M', u'v'),
- (0x2C7E, 'M', u'ȿ'),
- (0x2C7F, 'M', u'ɀ'),
- (0x2C80, 'M', u'ⲁ'),
- (0x2C81, 'V'),
- (0x2C82, 'M', u'ⲃ'),
- (0x2C83, 'V'),
- (0x2C84, 'M', u'ⲅ'),
- (0x2C85, 'V'),
- (0x2C86, 'M', u'ⲇ'),
- (0x2C87, 'V'),
- (0x2C88, 'M', u'ⲉ'),
- (0x2C89, 'V'),
- (0x2C8A, 'M', u'ⲋ'),
- (0x2C8B, 'V'),
- (0x2C8C, 'M', u'ⲍ'),
- (0x2C8D, 'V'),
- (0x2C8E, 'M', u'ⲏ'),
- (0x2C8F, 'V'),
- (0x2C90, 'M', u'ⲑ'),
- (0x2C91, 'V'),
- (0x2C92, 'M', u'ⲓ'),
- (0x2C93, 'V'),
- (0x2C94, 'M', u'ⲕ'),
- (0x2C95, 'V'),
- (0x2C96, 'M', u'ⲗ'),
- (0x2C97, 'V'),
- (0x2C98, 'M', u'ⲙ'),
- (0x2C99, 'V'),
- (0x2C9A, 'M', u'ⲛ'),
- (0x2C9B, 'V'),
- (0x2C9C, 'M', u'ⲝ'),
- (0x2C9D, 'V'),
- (0x2C9E, 'M', u'ⲟ'),
- (0x2C9F, 'V'),
- (0x2CA0, 'M', u'ⲡ'),
- (0x2CA1, 'V'),
- (0x2CA2, 'M', u'ⲣ'),
- (0x2CA3, 'V'),
- (0x2CA4, 'M', u'ⲥ'),
- (0x2CA5, 'V'),
- (0x2CA6, 'M', u'ⲧ'),
- (0x2CA7, 'V'),
- (0x2CA8, 'M', u'ⲩ'),
- (0x2CA9, 'V'),
- (0x2CAA, 'M', u'ⲫ'),
- (0x2CAB, 'V'),
- (0x2CAC, 'M', u'ⲭ'),
- (0x2CAD, 'V'),
- (0x2CAE, 'M', u'ⲯ'),
- (0x2CAF, 'V'),
- (0x2CB0, 'M', u'ⲱ'),
- (0x2CB1, 'V'),
- (0x2CB2, 'M', u'ⲳ'),
- (0x2CB3, 'V'),
- (0x2CB4, 'M', u'ⲵ'),
- (0x2CB5, 'V'),
- (0x2CB6, 'M', u'ⲷ'),
- (0x2CB7, 'V'),
- (0x2CB8, 'M', u'ⲹ'),
- (0x2CB9, 'V'),
- (0x2CBA, 'M', u'ⲻ'),
- (0x2CBB, 'V'),
- (0x2CBC, 'M', u'ⲽ'),
- (0x2CBD, 'V'),
- (0x2CBE, 'M', u'ⲿ'),
+ (0x2F1A, "M", "厂"),
+ (0x2F1B, "M", "厶"),
+ (0x2F1C, "M", "又"),
+ (0x2F1D, "M", "口"),
+ (0x2F1E, "M", "囗"),
+ (0x2F1F, "M", "土"),
+ (0x2F20, "M", "士"),
+ (0x2F21, "M", "夂"),
+ (0x2F22, "M", "夊"),
+ (0x2F23, "M", "夕"),
+ (0x2F24, "M", "大"),
+ (0x2F25, "M", "女"),
+ (0x2F26, "M", "子"),
+ (0x2F27, "M", "宀"),
+ (0x2F28, "M", "寸"),
+ (0x2F29, "M", "小"),
+ (0x2F2A, "M", "尢"),
+ (0x2F2B, "M", "尸"),
+ (0x2F2C, "M", "屮"),
+ (0x2F2D, "M", "山"),
+ (0x2F2E, "M", "巛"),
+ (0x2F2F, "M", "工"),
+ (0x2F30, "M", "己"),
+ (0x2F31, "M", "巾"),
+ (0x2F32, "M", "干"),
+ (0x2F33, "M", "幺"),
+ (0x2F34, "M", "广"),
+ (0x2F35, "M", "廴"),
+ (0x2F36, "M", "廾"),
+ (0x2F37, "M", "弋"),
+ (0x2F38, "M", "弓"),
+ (0x2F39, "M", "彐"),
+ (0x2F3A, "M", "彡"),
+ (0x2F3B, "M", "彳"),
+ (0x2F3C, "M", "心"),
+ (0x2F3D, "M", "戈"),
+ (0x2F3E, "M", "戶"),
+ (0x2F3F, "M", "手"),
+ (0x2F40, "M", "支"),
+ (0x2F41, "M", "攴"),
+ (0x2F42, "M", "文"),
+ (0x2F43, "M", "斗"),
+ (0x2F44, "M", "斤"),
+ (0x2F45, "M", "方"),
+ (0x2F46, "M", "无"),
+ (0x2F47, "M", "日"),
+ (0x2F48, "M", "曰"),
+ (0x2F49, "M", "月"),
+ (0x2F4A, "M", "木"),
+ (0x2F4B, "M", "欠"),
+ (0x2F4C, "M", "止"),
+ (0x2F4D, "M", "歹"),
+ (0x2F4E, "M", "殳"),
+ (0x2F4F, "M", "毋"),
+ (0x2F50, "M", "比"),
+ (0x2F51, "M", "毛"),
+ (0x2F52, "M", "氏"),
+ (0x2F53, "M", "气"),
+ (0x2F54, "M", "水"),
+ (0x2F55, "M", "火"),
+ (0x2F56, "M", "爪"),
+ (0x2F57, "M", "父"),
+ (0x2F58, "M", "爻"),
+ (0x2F59, "M", "爿"),
+ (0x2F5A, "M", "片"),
+ (0x2F5B, "M", "牙"),
+ (0x2F5C, "M", "牛"),
+ (0x2F5D, "M", "犬"),
+ (0x2F5E, "M", "玄"),
+ (0x2F5F, "M", "玉"),
+ (0x2F60, "M", "瓜"),
+ (0x2F61, "M", "瓦"),
+ (0x2F62, "M", "甘"),
+ (0x2F63, "M", "生"),
+ (0x2F64, "M", "用"),
+ (0x2F65, "M", "田"),
+ (0x2F66, "M", "疋"),
+ (0x2F67, "M", "疒"),
+ (0x2F68, "M", "癶"),
+ (0x2F69, "M", "白"),
+ (0x2F6A, "M", "皮"),
+ (0x2F6B, "M", "皿"),
+ (0x2F6C, "M", "目"),
+ (0x2F6D, "M", "矛"),
+ (0x2F6E, "M", "矢"),
+ (0x2F6F, "M", "石"),
+ (0x2F70, "M", "示"),
+ (0x2F71, "M", "禸"),
+ (0x2F72, "M", "禾"),
+ (0x2F73, "M", "穴"),
+ (0x2F74, "M", "立"),
+ (0x2F75, "M", "竹"),
+ (0x2F76, "M", "米"),
+ (0x2F77, "M", "糸"),
+ (0x2F78, "M", "缶"),
+ (0x2F79, "M", "网"),
+ (0x2F7A, "M", "羊"),
+ (0x2F7B, "M", "羽"),
+ (0x2F7C, "M", "老"),
+ (0x2F7D, "M", "而"),
]
-def _seg_26():
+
+def _seg_28() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x2CBF, 'V'),
- (0x2CC0, 'M', u'ⳁ'),
- (0x2CC1, 'V'),
- (0x2CC2, 'M', u'ⳃ'),
- (0x2CC3, 'V'),
- (0x2CC4, 'M', u'ⳅ'),
- (0x2CC5, 'V'),
- (0x2CC6, 'M', u'ⳇ'),
- (0x2CC7, 'V'),
- (0x2CC8, 'M', u'ⳉ'),
- (0x2CC9, 'V'),
- (0x2CCA, 'M', u'ⳋ'),
- (0x2CCB, 'V'),
- (0x2CCC, 'M', u'ⳍ'),
- (0x2CCD, 'V'),
- (0x2CCE, 'M', u'ⳏ'),
- (0x2CCF, 'V'),
- (0x2CD0, 'M', u'ⳑ'),
- (0x2CD1, 'V'),
- (0x2CD2, 'M', u'ⳓ'),
- (0x2CD3, 'V'),
- (0x2CD4, 'M', u'ⳕ'),
- (0x2CD5, 'V'),
- (0x2CD6, 'M', u'ⳗ'),
- (0x2CD7, 'V'),
- (0x2CD8, 'M', u'ⳙ'),
- (0x2CD9, 'V'),
- (0x2CDA, 'M', u'ⳛ'),
- (0x2CDB, 'V'),
- (0x2CDC, 'M', u'ⳝ'),
- (0x2CDD, 'V'),
- (0x2CDE, 'M', u'ⳟ'),
- (0x2CDF, 'V'),
- (0x2CE0, 'M', u'ⳡ'),
- (0x2CE1, 'V'),
- (0x2CE2, 'M', u'ⳣ'),
- (0x2CE3, 'V'),
- (0x2CEB, 'M', u'ⳬ'),
- (0x2CEC, 'V'),
- (0x2CED, 'M', u'ⳮ'),
- (0x2CEE, 'V'),
- (0x2CF2, 'M', u'ⳳ'),
- (0x2CF3, 'V'),
- (0x2CF4, 'X'),
- (0x2CF9, 'V'),
- (0x2D26, 'X'),
- (0x2D27, 'V'),
- (0x2D28, 'X'),
- (0x2D2D, 'V'),
- (0x2D2E, 'X'),
- (0x2D30, 'V'),
- (0x2D68, 'X'),
- (0x2D6F, 'M', u'ⵡ'),
- (0x2D70, 'V'),
- (0x2D71, 'X'),
- (0x2D7F, 'V'),
- (0x2D97, 'X'),
- (0x2DA0, 'V'),
- (0x2DA7, 'X'),
- (0x2DA8, 'V'),
- (0x2DAF, 'X'),
- (0x2DB0, 'V'),
- (0x2DB7, 'X'),
- (0x2DB8, 'V'),
- (0x2DBF, 'X'),
- (0x2DC0, 'V'),
- (0x2DC7, 'X'),
- (0x2DC8, 'V'),
- (0x2DCF, 'X'),
- (0x2DD0, 'V'),
- (0x2DD7, 'X'),
- (0x2DD8, 'V'),
- (0x2DDF, 'X'),
- (0x2DE0, 'V'),
- (0x2E53, 'X'),
- (0x2E80, 'V'),
- (0x2E9A, 'X'),
- (0x2E9B, 'V'),
- (0x2E9F, 'M', u'母'),
- (0x2EA0, 'V'),
- (0x2EF3, 'M', u'龟'),
- (0x2EF4, 'X'),
- (0x2F00, 'M', u'一'),
- (0x2F01, 'M', u'丨'),
- (0x2F02, 'M', u'丶'),
- (0x2F03, 'M', u'丿'),
- (0x2F04, 'M', u'乙'),
- (0x2F05, 'M', u'亅'),
- (0x2F06, 'M', u'二'),
- (0x2F07, 'M', u'亠'),
- (0x2F08, 'M', u'人'),
- (0x2F09, 'M', u'儿'),
- (0x2F0A, 'M', u'入'),
- (0x2F0B, 'M', u'八'),
- (0x2F0C, 'M', u'冂'),
- (0x2F0D, 'M', u'冖'),
- (0x2F0E, 'M', u'冫'),
- (0x2F0F, 'M', u'几'),
- (0x2F10, 'M', u'凵'),
- (0x2F11, 'M', u'刀'),
+ (0x2F7E, "M", "耒"),
+ (0x2F7F, "M", "耳"),
+ (0x2F80, "M", "聿"),
+ (0x2F81, "M", "肉"),
+ (0x2F82, "M", "臣"),
+ (0x2F83, "M", "自"),
+ (0x2F84, "M", "至"),
+ (0x2F85, "M", "臼"),
+ (0x2F86, "M", "舌"),
+ (0x2F87, "M", "舛"),
+ (0x2F88, "M", "舟"),
+ (0x2F89, "M", "艮"),
+ (0x2F8A, "M", "色"),
+ (0x2F8B, "M", "艸"),
+ (0x2F8C, "M", "虍"),
+ (0x2F8D, "M", "虫"),
+ (0x2F8E, "M", "血"),
+ (0x2F8F, "M", "行"),
+ (0x2F90, "M", "衣"),
+ (0x2F91, "M", "襾"),
+ (0x2F92, "M", "見"),
+ (0x2F93, "M", "角"),
+ (0x2F94, "M", "言"),
+ (0x2F95, "M", "谷"),
+ (0x2F96, "M", "豆"),
+ (0x2F97, "M", "豕"),
+ (0x2F98, "M", "豸"),
+ (0x2F99, "M", "貝"),
+ (0x2F9A, "M", "赤"),
+ (0x2F9B, "M", "走"),
+ (0x2F9C, "M", "足"),
+ (0x2F9D, "M", "身"),
+ (0x2F9E, "M", "車"),
+ (0x2F9F, "M", "辛"),
+ (0x2FA0, "M", "辰"),
+ (0x2FA1, "M", "辵"),
+ (0x2FA2, "M", "邑"),
+ (0x2FA3, "M", "酉"),
+ (0x2FA4, "M", "釆"),
+ (0x2FA5, "M", "里"),
+ (0x2FA6, "M", "金"),
+ (0x2FA7, "M", "長"),
+ (0x2FA8, "M", "門"),
+ (0x2FA9, "M", "阜"),
+ (0x2FAA, "M", "隶"),
+ (0x2FAB, "M", "隹"),
+ (0x2FAC, "M", "雨"),
+ (0x2FAD, "M", "靑"),
+ (0x2FAE, "M", "非"),
+ (0x2FAF, "M", "面"),
+ (0x2FB0, "M", "革"),
+ (0x2FB1, "M", "韋"),
+ (0x2FB2, "M", "韭"),
+ (0x2FB3, "M", "音"),
+ (0x2FB4, "M", "頁"),
+ (0x2FB5, "M", "風"),
+ (0x2FB6, "M", "飛"),
+ (0x2FB7, "M", "食"),
+ (0x2FB8, "M", "首"),
+ (0x2FB9, "M", "香"),
+ (0x2FBA, "M", "馬"),
+ (0x2FBB, "M", "骨"),
+ (0x2FBC, "M", "高"),
+ (0x2FBD, "M", "髟"),
+ (0x2FBE, "M", "鬥"),
+ (0x2FBF, "M", "鬯"),
+ (0x2FC0, "M", "鬲"),
+ (0x2FC1, "M", "鬼"),
+ (0x2FC2, "M", "魚"),
+ (0x2FC3, "M", "鳥"),
+ (0x2FC4, "M", "鹵"),
+ (0x2FC5, "M", "鹿"),
+ (0x2FC6, "M", "麥"),
+ (0x2FC7, "M", "麻"),
+ (0x2FC8, "M", "黃"),
+ (0x2FC9, "M", "黍"),
+ (0x2FCA, "M", "黑"),
+ (0x2FCB, "M", "黹"),
+ (0x2FCC, "M", "黽"),
+ (0x2FCD, "M", "鼎"),
+ (0x2FCE, "M", "鼓"),
+ (0x2FCF, "M", "鼠"),
+ (0x2FD0, "M", "鼻"),
+ (0x2FD1, "M", "齊"),
+ (0x2FD2, "M", "齒"),
+ (0x2FD3, "M", "龍"),
+ (0x2FD4, "M", "龜"),
+ (0x2FD5, "M", "龠"),
+ (0x2FD6, "X"),
+ (0x3000, "3", " "),
+ (0x3001, "V"),
+ (0x3002, "M", "."),
+ (0x3003, "V"),
+ (0x3036, "M", "〒"),
+ (0x3037, "V"),
+ (0x3038, "M", "十"),
+ (0x3039, "M", "卄"),
+ (0x303A, "M", "卅"),
+ (0x303B, "V"),
+ (0x3040, "X"),
]
-def _seg_27():
+
+def _seg_29() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x2F12, 'M', u'力'),
- (0x2F13, 'M', u'勹'),
- (0x2F14, 'M', u'匕'),
- (0x2F15, 'M', u'匚'),
- (0x2F16, 'M', u'匸'),
- (0x2F17, 'M', u'十'),
- (0x2F18, 'M', u'卜'),
- (0x2F19, 'M', u'卩'),
- (0x2F1A, 'M', u'厂'),
- (0x2F1B, 'M', u'厶'),
- (0x2F1C, 'M', u'又'),
- (0x2F1D, 'M', u'口'),
- (0x2F1E, 'M', u'囗'),
- (0x2F1F, 'M', u'土'),
- (0x2F20, 'M', u'士'),
- (0x2F21, 'M', u'夂'),
- (0x2F22, 'M', u'夊'),
- (0x2F23, 'M', u'夕'),
- (0x2F24, 'M', u'大'),
- (0x2F25, 'M', u'女'),
- (0x2F26, 'M', u'子'),
- (0x2F27, 'M', u'宀'),
- (0x2F28, 'M', u'寸'),
- (0x2F29, 'M', u'小'),
- (0x2F2A, 'M', u'尢'),
- (0x2F2B, 'M', u'尸'),
- (0x2F2C, 'M', u'屮'),
- (0x2F2D, 'M', u'山'),
- (0x2F2E, 'M', u'巛'),
- (0x2F2F, 'M', u'工'),
- (0x2F30, 'M', u'己'),
- (0x2F31, 'M', u'巾'),
- (0x2F32, 'M', u'干'),
- (0x2F33, 'M', u'幺'),
- (0x2F34, 'M', u'广'),
- (0x2F35, 'M', u'廴'),
- (0x2F36, 'M', u'廾'),
- (0x2F37, 'M', u'弋'),
- (0x2F38, 'M', u'弓'),
- (0x2F39, 'M', u'彐'),
- (0x2F3A, 'M', u'彡'),
- (0x2F3B, 'M', u'彳'),
- (0x2F3C, 'M', u'心'),
- (0x2F3D, 'M', u'戈'),
- (0x2F3E, 'M', u'戶'),
- (0x2F3F, 'M', u'手'),
- (0x2F40, 'M', u'支'),
- (0x2F41, 'M', u'攴'),
- (0x2F42, 'M', u'文'),
- (0x2F43, 'M', u'斗'),
- (0x2F44, 'M', u'斤'),
- (0x2F45, 'M', u'方'),
- (0x2F46, 'M', u'无'),
- (0x2F47, 'M', u'日'),
- (0x2F48, 'M', u'曰'),
- (0x2F49, 'M', u'月'),
- (0x2F4A, 'M', u'木'),
- (0x2F4B, 'M', u'欠'),
- (0x2F4C, 'M', u'止'),
- (0x2F4D, 'M', u'歹'),
- (0x2F4E, 'M', u'殳'),
- (0x2F4F, 'M', u'毋'),
- (0x2F50, 'M', u'比'),
- (0x2F51, 'M', u'毛'),
- (0x2F52, 'M', u'氏'),
- (0x2F53, 'M', u'气'),
- (0x2F54, 'M', u'水'),
- (0x2F55, 'M', u'火'),
- (0x2F56, 'M', u'爪'),
- (0x2F57, 'M', u'父'),
- (0x2F58, 'M', u'爻'),
- (0x2F59, 'M', u'爿'),
- (0x2F5A, 'M', u'片'),
- (0x2F5B, 'M', u'牙'),
- (0x2F5C, 'M', u'牛'),
- (0x2F5D, 'M', u'犬'),
- (0x2F5E, 'M', u'玄'),
- (0x2F5F, 'M', u'玉'),
- (0x2F60, 'M', u'瓜'),
- (0x2F61, 'M', u'瓦'),
- (0x2F62, 'M', u'甘'),
- (0x2F63, 'M', u'生'),
- (0x2F64, 'M', u'用'),
- (0x2F65, 'M', u'田'),
- (0x2F66, 'M', u'疋'),
- (0x2F67, 'M', u'疒'),
- (0x2F68, 'M', u'癶'),
- (0x2F69, 'M', u'白'),
- (0x2F6A, 'M', u'皮'),
- (0x2F6B, 'M', u'皿'),
- (0x2F6C, 'M', u'目'),
- (0x2F6D, 'M', u'矛'),
- (0x2F6E, 'M', u'矢'),
- (0x2F6F, 'M', u'石'),
- (0x2F70, 'M', u'示'),
- (0x2F71, 'M', u'禸'),
- (0x2F72, 'M', u'禾'),
- (0x2F73, 'M', u'穴'),
- (0x2F74, 'M', u'立'),
- (0x2F75, 'M', u'竹'),
+ (0x3041, "V"),
+ (0x3097, "X"),
+ (0x3099, "V"),
+ (0x309B, "3", " ゙"),
+ (0x309C, "3", " ゚"),
+ (0x309D, "V"),
+ (0x309F, "M", "より"),
+ (0x30A0, "V"),
+ (0x30FF, "M", "コト"),
+ (0x3100, "X"),
+ (0x3105, "V"),
+ (0x3130, "X"),
+ (0x3131, "M", "ᄀ"),
+ (0x3132, "M", "ᄁ"),
+ (0x3133, "M", "ᆪ"),
+ (0x3134, "M", "ᄂ"),
+ (0x3135, "M", "ᆬ"),
+ (0x3136, "M", "ᆭ"),
+ (0x3137, "M", "ᄃ"),
+ (0x3138, "M", "ᄄ"),
+ (0x3139, "M", "ᄅ"),
+ (0x313A, "M", "ᆰ"),
+ (0x313B, "M", "ᆱ"),
+ (0x313C, "M", "ᆲ"),
+ (0x313D, "M", "ᆳ"),
+ (0x313E, "M", "ᆴ"),
+ (0x313F, "M", "ᆵ"),
+ (0x3140, "M", "ᄚ"),
+ (0x3141, "M", "ᄆ"),
+ (0x3142, "M", "ᄇ"),
+ (0x3143, "M", "ᄈ"),
+ (0x3144, "M", "ᄡ"),
+ (0x3145, "M", "ᄉ"),
+ (0x3146, "M", "ᄊ"),
+ (0x3147, "M", "ᄋ"),
+ (0x3148, "M", "ᄌ"),
+ (0x3149, "M", "ᄍ"),
+ (0x314A, "M", "ᄎ"),
+ (0x314B, "M", "ᄏ"),
+ (0x314C, "M", "ᄐ"),
+ (0x314D, "M", "ᄑ"),
+ (0x314E, "M", "ᄒ"),
+ (0x314F, "M", "ᅡ"),
+ (0x3150, "M", "ᅢ"),
+ (0x3151, "M", "ᅣ"),
+ (0x3152, "M", "ᅤ"),
+ (0x3153, "M", "ᅥ"),
+ (0x3154, "M", "ᅦ"),
+ (0x3155, "M", "ᅧ"),
+ (0x3156, "M", "ᅨ"),
+ (0x3157, "M", "ᅩ"),
+ (0x3158, "M", "ᅪ"),
+ (0x3159, "M", "ᅫ"),
+ (0x315A, "M", "ᅬ"),
+ (0x315B, "M", "ᅭ"),
+ (0x315C, "M", "ᅮ"),
+ (0x315D, "M", "ᅯ"),
+ (0x315E, "M", "ᅰ"),
+ (0x315F, "M", "ᅱ"),
+ (0x3160, "M", "ᅲ"),
+ (0x3161, "M", "ᅳ"),
+ (0x3162, "M", "ᅴ"),
+ (0x3163, "M", "ᅵ"),
+ (0x3164, "X"),
+ (0x3165, "M", "ᄔ"),
+ (0x3166, "M", "ᄕ"),
+ (0x3167, "M", "ᇇ"),
+ (0x3168, "M", "ᇈ"),
+ (0x3169, "M", "ᇌ"),
+ (0x316A, "M", "ᇎ"),
+ (0x316B, "M", "ᇓ"),
+ (0x316C, "M", "ᇗ"),
+ (0x316D, "M", "ᇙ"),
+ (0x316E, "M", "ᄜ"),
+ (0x316F, "M", "ᇝ"),
+ (0x3170, "M", "ᇟ"),
+ (0x3171, "M", "ᄝ"),
+ (0x3172, "M", "ᄞ"),
+ (0x3173, "M", "ᄠ"),
+ (0x3174, "M", "ᄢ"),
+ (0x3175, "M", "ᄣ"),
+ (0x3176, "M", "ᄧ"),
+ (0x3177, "M", "ᄩ"),
+ (0x3178, "M", "ᄫ"),
+ (0x3179, "M", "ᄬ"),
+ (0x317A, "M", "ᄭ"),
+ (0x317B, "M", "ᄮ"),
+ (0x317C, "M", "ᄯ"),
+ (0x317D, "M", "ᄲ"),
+ (0x317E, "M", "ᄶ"),
+ (0x317F, "M", "ᅀ"),
+ (0x3180, "M", "ᅇ"),
+ (0x3181, "M", "ᅌ"),
+ (0x3182, "M", "ᇱ"),
+ (0x3183, "M", "ᇲ"),
+ (0x3184, "M", "ᅗ"),
+ (0x3185, "M", "ᅘ"),
+ (0x3186, "M", "ᅙ"),
+ (0x3187, "M", "ᆄ"),
+ (0x3188, "M", "ᆅ"),
]
-def _seg_28():
+
+def _seg_30() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x2F76, 'M', u'米'),
- (0x2F77, 'M', u'糸'),
- (0x2F78, 'M', u'缶'),
- (0x2F79, 'M', u'网'),
- (0x2F7A, 'M', u'羊'),
- (0x2F7B, 'M', u'羽'),
- (0x2F7C, 'M', u'老'),
- (0x2F7D, 'M', u'而'),
- (0x2F7E, 'M', u'耒'),
- (0x2F7F, 'M', u'耳'),
- (0x2F80, 'M', u'聿'),
- (0x2F81, 'M', u'肉'),
- (0x2F82, 'M', u'臣'),
- (0x2F83, 'M', u'自'),
- (0x2F84, 'M', u'至'),
- (0x2F85, 'M', u'臼'),
- (0x2F86, 'M', u'舌'),
- (0x2F87, 'M', u'舛'),
- (0x2F88, 'M', u'舟'),
- (0x2F89, 'M', u'艮'),
- (0x2F8A, 'M', u'色'),
- (0x2F8B, 'M', u'艸'),
- (0x2F8C, 'M', u'虍'),
- (0x2F8D, 'M', u'虫'),
- (0x2F8E, 'M', u'血'),
- (0x2F8F, 'M', u'行'),
- (0x2F90, 'M', u'衣'),
- (0x2F91, 'M', u'襾'),
- (0x2F92, 'M', u'見'),
- (0x2F93, 'M', u'角'),
- (0x2F94, 'M', u'言'),
- (0x2F95, 'M', u'谷'),
- (0x2F96, 'M', u'豆'),
- (0x2F97, 'M', u'豕'),
- (0x2F98, 'M', u'豸'),
- (0x2F99, 'M', u'貝'),
- (0x2F9A, 'M', u'赤'),
- (0x2F9B, 'M', u'走'),
- (0x2F9C, 'M', u'足'),
- (0x2F9D, 'M', u'身'),
- (0x2F9E, 'M', u'車'),
- (0x2F9F, 'M', u'辛'),
- (0x2FA0, 'M', u'辰'),
- (0x2FA1, 'M', u'辵'),
- (0x2FA2, 'M', u'邑'),
- (0x2FA3, 'M', u'酉'),
- (0x2FA4, 'M', u'釆'),
- (0x2FA5, 'M', u'里'),
- (0x2FA6, 'M', u'金'),
- (0x2FA7, 'M', u'長'),
- (0x2FA8, 'M', u'門'),
- (0x2FA9, 'M', u'阜'),
- (0x2FAA, 'M', u'隶'),
- (0x2FAB, 'M', u'隹'),
- (0x2FAC, 'M', u'雨'),
- (0x2FAD, 'M', u'靑'),
- (0x2FAE, 'M', u'非'),
- (0x2FAF, 'M', u'面'),
- (0x2FB0, 'M', u'革'),
- (0x2FB1, 'M', u'韋'),
- (0x2FB2, 'M', u'韭'),
- (0x2FB3, 'M', u'音'),
- (0x2FB4, 'M', u'頁'),
- (0x2FB5, 'M', u'風'),
- (0x2FB6, 'M', u'飛'),
- (0x2FB7, 'M', u'食'),
- (0x2FB8, 'M', u'首'),
- (0x2FB9, 'M', u'香'),
- (0x2FBA, 'M', u'馬'),
- (0x2FBB, 'M', u'骨'),
- (0x2FBC, 'M', u'高'),
- (0x2FBD, 'M', u'髟'),
- (0x2FBE, 'M', u'鬥'),
- (0x2FBF, 'M', u'鬯'),
- (0x2FC0, 'M', u'鬲'),
- (0x2FC1, 'M', u'鬼'),
- (0x2FC2, 'M', u'魚'),
- (0x2FC3, 'M', u'鳥'),
- (0x2FC4, 'M', u'鹵'),
- (0x2FC5, 'M', u'鹿'),
- (0x2FC6, 'M', u'麥'),
- (0x2FC7, 'M', u'麻'),
- (0x2FC8, 'M', u'黃'),
- (0x2FC9, 'M', u'黍'),
- (0x2FCA, 'M', u'黑'),
- (0x2FCB, 'M', u'黹'),
- (0x2FCC, 'M', u'黽'),
- (0x2FCD, 'M', u'鼎'),
- (0x2FCE, 'M', u'鼓'),
- (0x2FCF, 'M', u'鼠'),
- (0x2FD0, 'M', u'鼻'),
- (0x2FD1, 'M', u'齊'),
- (0x2FD2, 'M', u'齒'),
- (0x2FD3, 'M', u'龍'),
- (0x2FD4, 'M', u'龜'),
- (0x2FD5, 'M', u'龠'),
- (0x2FD6, 'X'),
- (0x3000, '3', u' '),
- (0x3001, 'V'),
- (0x3002, 'M', u'.'),
+ (0x3189, "M", "ᆈ"),
+ (0x318A, "M", "ᆑ"),
+ (0x318B, "M", "ᆒ"),
+ (0x318C, "M", "ᆔ"),
+ (0x318D, "M", "ᆞ"),
+ (0x318E, "M", "ᆡ"),
+ (0x318F, "X"),
+ (0x3190, "V"),
+ (0x3192, "M", "一"),
+ (0x3193, "M", "二"),
+ (0x3194, "M", "三"),
+ (0x3195, "M", "四"),
+ (0x3196, "M", "上"),
+ (0x3197, "M", "中"),
+ (0x3198, "M", "下"),
+ (0x3199, "M", "甲"),
+ (0x319A, "M", "乙"),
+ (0x319B, "M", "丙"),
+ (0x319C, "M", "丁"),
+ (0x319D, "M", "天"),
+ (0x319E, "M", "地"),
+ (0x319F, "M", "人"),
+ (0x31A0, "V"),
+ (0x31E4, "X"),
+ (0x31F0, "V"),
+ (0x3200, "3", "(ᄀ)"),
+ (0x3201, "3", "(ᄂ)"),
+ (0x3202, "3", "(ᄃ)"),
+ (0x3203, "3", "(ᄅ)"),
+ (0x3204, "3", "(ᄆ)"),
+ (0x3205, "3", "(ᄇ)"),
+ (0x3206, "3", "(ᄉ)"),
+ (0x3207, "3", "(ᄋ)"),
+ (0x3208, "3", "(ᄌ)"),
+ (0x3209, "3", "(ᄎ)"),
+ (0x320A, "3", "(ᄏ)"),
+ (0x320B, "3", "(ᄐ)"),
+ (0x320C, "3", "(ᄑ)"),
+ (0x320D, "3", "(ᄒ)"),
+ (0x320E, "3", "(가)"),
+ (0x320F, "3", "(나)"),
+ (0x3210, "3", "(다)"),
+ (0x3211, "3", "(라)"),
+ (0x3212, "3", "(마)"),
+ (0x3213, "3", "(바)"),
+ (0x3214, "3", "(사)"),
+ (0x3215, "3", "(아)"),
+ (0x3216, "3", "(자)"),
+ (0x3217, "3", "(차)"),
+ (0x3218, "3", "(카)"),
+ (0x3219, "3", "(타)"),
+ (0x321A, "3", "(파)"),
+ (0x321B, "3", "(하)"),
+ (0x321C, "3", "(주)"),
+ (0x321D, "3", "(오전)"),
+ (0x321E, "3", "(오후)"),
+ (0x321F, "X"),
+ (0x3220, "3", "(一)"),
+ (0x3221, "3", "(二)"),
+ (0x3222, "3", "(三)"),
+ (0x3223, "3", "(四)"),
+ (0x3224, "3", "(五)"),
+ (0x3225, "3", "(六)"),
+ (0x3226, "3", "(七)"),
+ (0x3227, "3", "(八)"),
+ (0x3228, "3", "(九)"),
+ (0x3229, "3", "(十)"),
+ (0x322A, "3", "(月)"),
+ (0x322B, "3", "(火)"),
+ (0x322C, "3", "(水)"),
+ (0x322D, "3", "(木)"),
+ (0x322E, "3", "(金)"),
+ (0x322F, "3", "(土)"),
+ (0x3230, "3", "(日)"),
+ (0x3231, "3", "(株)"),
+ (0x3232, "3", "(有)"),
+ (0x3233, "3", "(社)"),
+ (0x3234, "3", "(名)"),
+ (0x3235, "3", "(特)"),
+ (0x3236, "3", "(財)"),
+ (0x3237, "3", "(祝)"),
+ (0x3238, "3", "(労)"),
+ (0x3239, "3", "(代)"),
+ (0x323A, "3", "(呼)"),
+ (0x323B, "3", "(学)"),
+ (0x323C, "3", "(監)"),
+ (0x323D, "3", "(企)"),
+ (0x323E, "3", "(資)"),
+ (0x323F, "3", "(協)"),
+ (0x3240, "3", "(祭)"),
+ (0x3241, "3", "(休)"),
+ (0x3242, "3", "(自)"),
+ (0x3243, "3", "(至)"),
+ (0x3244, "M", "問"),
+ (0x3245, "M", "幼"),
+ (0x3246, "M", "文"),
+ (0x3247, "M", "箏"),
+ (0x3248, "V"),
+ (0x3250, "M", "pte"),
+ (0x3251, "M", "21"),
]
-def _seg_29():
+
+def _seg_31() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x3003, 'V'),
- (0x3036, 'M', u'〒'),
- (0x3037, 'V'),
- (0x3038, 'M', u'十'),
- (0x3039, 'M', u'卄'),
- (0x303A, 'M', u'卅'),
- (0x303B, 'V'),
- (0x3040, 'X'),
- (0x3041, 'V'),
- (0x3097, 'X'),
- (0x3099, 'V'),
- (0x309B, '3', u' ゙'),
- (0x309C, '3', u' ゚'),
- (0x309D, 'V'),
- (0x309F, 'M', u'より'),
- (0x30A0, 'V'),
- (0x30FF, 'M', u'コト'),
- (0x3100, 'X'),
- (0x3105, 'V'),
- (0x3130, 'X'),
- (0x3131, 'M', u'ᄀ'),
- (0x3132, 'M', u'ᄁ'),
- (0x3133, 'M', u'ᆪ'),
- (0x3134, 'M', u'ᄂ'),
- (0x3135, 'M', u'ᆬ'),
- (0x3136, 'M', u'ᆭ'),
- (0x3137, 'M', u'ᄃ'),
- (0x3138, 'M', u'ᄄ'),
- (0x3139, 'M', u'ᄅ'),
- (0x313A, 'M', u'ᆰ'),
- (0x313B, 'M', u'ᆱ'),
- (0x313C, 'M', u'ᆲ'),
- (0x313D, 'M', u'ᆳ'),
- (0x313E, 'M', u'ᆴ'),
- (0x313F, 'M', u'ᆵ'),
- (0x3140, 'M', u'ᄚ'),
- (0x3141, 'M', u'ᄆ'),
- (0x3142, 'M', u'ᄇ'),
- (0x3143, 'M', u'ᄈ'),
- (0x3144, 'M', u'ᄡ'),
- (0x3145, 'M', u'ᄉ'),
- (0x3146, 'M', u'ᄊ'),
- (0x3147, 'M', u'ᄋ'),
- (0x3148, 'M', u'ᄌ'),
- (0x3149, 'M', u'ᄍ'),
- (0x314A, 'M', u'ᄎ'),
- (0x314B, 'M', u'ᄏ'),
- (0x314C, 'M', u'ᄐ'),
- (0x314D, 'M', u'ᄑ'),
- (0x314E, 'M', u'ᄒ'),
- (0x314F, 'M', u'ᅡ'),
- (0x3150, 'M', u'ᅢ'),
- (0x3151, 'M', u'ᅣ'),
- (0x3152, 'M', u'ᅤ'),
- (0x3153, 'M', u'ᅥ'),
- (0x3154, 'M', u'ᅦ'),
- (0x3155, 'M', u'ᅧ'),
- (0x3156, 'M', u'ᅨ'),
- (0x3157, 'M', u'ᅩ'),
- (0x3158, 'M', u'ᅪ'),
- (0x3159, 'M', u'ᅫ'),
- (0x315A, 'M', u'ᅬ'),
- (0x315B, 'M', u'ᅭ'),
- (0x315C, 'M', u'ᅮ'),
- (0x315D, 'M', u'ᅯ'),
- (0x315E, 'M', u'ᅰ'),
- (0x315F, 'M', u'ᅱ'),
- (0x3160, 'M', u'ᅲ'),
- (0x3161, 'M', u'ᅳ'),
- (0x3162, 'M', u'ᅴ'),
- (0x3163, 'M', u'ᅵ'),
- (0x3164, 'X'),
- (0x3165, 'M', u'ᄔ'),
- (0x3166, 'M', u'ᄕ'),
- (0x3167, 'M', u'ᇇ'),
- (0x3168, 'M', u'ᇈ'),
- (0x3169, 'M', u'ᇌ'),
- (0x316A, 'M', u'ᇎ'),
- (0x316B, 'M', u'ᇓ'),
- (0x316C, 'M', u'ᇗ'),
- (0x316D, 'M', u'ᇙ'),
- (0x316E, 'M', u'ᄜ'),
- (0x316F, 'M', u'ᇝ'),
- (0x3170, 'M', u'ᇟ'),
- (0x3171, 'M', u'ᄝ'),
- (0x3172, 'M', u'ᄞ'),
- (0x3173, 'M', u'ᄠ'),
- (0x3174, 'M', u'ᄢ'),
- (0x3175, 'M', u'ᄣ'),
- (0x3176, 'M', u'ᄧ'),
- (0x3177, 'M', u'ᄩ'),
- (0x3178, 'M', u'ᄫ'),
- (0x3179, 'M', u'ᄬ'),
- (0x317A, 'M', u'ᄭ'),
- (0x317B, 'M', u'ᄮ'),
- (0x317C, 'M', u'ᄯ'),
- (0x317D, 'M', u'ᄲ'),
- (0x317E, 'M', u'ᄶ'),
- (0x317F, 'M', u'ᅀ'),
- (0x3180, 'M', u'ᅇ'),
+ (0x3252, "M", "22"),
+ (0x3253, "M", "23"),
+ (0x3254, "M", "24"),
+ (0x3255, "M", "25"),
+ (0x3256, "M", "26"),
+ (0x3257, "M", "27"),
+ (0x3258, "M", "28"),
+ (0x3259, "M", "29"),
+ (0x325A, "M", "30"),
+ (0x325B, "M", "31"),
+ (0x325C, "M", "32"),
+ (0x325D, "M", "33"),
+ (0x325E, "M", "34"),
+ (0x325F, "M", "35"),
+ (0x3260, "M", "ᄀ"),
+ (0x3261, "M", "ᄂ"),
+ (0x3262, "M", "ᄃ"),
+ (0x3263, "M", "ᄅ"),
+ (0x3264, "M", "ᄆ"),
+ (0x3265, "M", "ᄇ"),
+ (0x3266, "M", "ᄉ"),
+ (0x3267, "M", "ᄋ"),
+ (0x3268, "M", "ᄌ"),
+ (0x3269, "M", "ᄎ"),
+ (0x326A, "M", "ᄏ"),
+ (0x326B, "M", "ᄐ"),
+ (0x326C, "M", "ᄑ"),
+ (0x326D, "M", "ᄒ"),
+ (0x326E, "M", "가"),
+ (0x326F, "M", "나"),
+ (0x3270, "M", "다"),
+ (0x3271, "M", "라"),
+ (0x3272, "M", "마"),
+ (0x3273, "M", "바"),
+ (0x3274, "M", "사"),
+ (0x3275, "M", "아"),
+ (0x3276, "M", "자"),
+ (0x3277, "M", "차"),
+ (0x3278, "M", "카"),
+ (0x3279, "M", "타"),
+ (0x327A, "M", "파"),
+ (0x327B, "M", "하"),
+ (0x327C, "M", "참고"),
+ (0x327D, "M", "주의"),
+ (0x327E, "M", "우"),
+ (0x327F, "V"),
+ (0x3280, "M", "一"),
+ (0x3281, "M", "二"),
+ (0x3282, "M", "三"),
+ (0x3283, "M", "四"),
+ (0x3284, "M", "五"),
+ (0x3285, "M", "六"),
+ (0x3286, "M", "七"),
+ (0x3287, "M", "八"),
+ (0x3288, "M", "九"),
+ (0x3289, "M", "十"),
+ (0x328A, "M", "月"),
+ (0x328B, "M", "火"),
+ (0x328C, "M", "水"),
+ (0x328D, "M", "木"),
+ (0x328E, "M", "金"),
+ (0x328F, "M", "土"),
+ (0x3290, "M", "日"),
+ (0x3291, "M", "株"),
+ (0x3292, "M", "有"),
+ (0x3293, "M", "社"),
+ (0x3294, "M", "名"),
+ (0x3295, "M", "特"),
+ (0x3296, "M", "財"),
+ (0x3297, "M", "祝"),
+ (0x3298, "M", "労"),
+ (0x3299, "M", "秘"),
+ (0x329A, "M", "男"),
+ (0x329B, "M", "女"),
+ (0x329C, "M", "適"),
+ (0x329D, "M", "優"),
+ (0x329E, "M", "印"),
+ (0x329F, "M", "注"),
+ (0x32A0, "M", "項"),
+ (0x32A1, "M", "休"),
+ (0x32A2, "M", "写"),
+ (0x32A3, "M", "正"),
+ (0x32A4, "M", "上"),
+ (0x32A5, "M", "中"),
+ (0x32A6, "M", "下"),
+ (0x32A7, "M", "左"),
+ (0x32A8, "M", "右"),
+ (0x32A9, "M", "医"),
+ (0x32AA, "M", "宗"),
+ (0x32AB, "M", "学"),
+ (0x32AC, "M", "監"),
+ (0x32AD, "M", "企"),
+ (0x32AE, "M", "資"),
+ (0x32AF, "M", "協"),
+ (0x32B0, "M", "夜"),
+ (0x32B1, "M", "36"),
+ (0x32B2, "M", "37"),
+ (0x32B3, "M", "38"),
+ (0x32B4, "M", "39"),
+ (0x32B5, "M", "40"),
]
-def _seg_30():
+
+def _seg_32() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x3181, 'M', u'ᅌ'),
- (0x3182, 'M', u'ᇱ'),
- (0x3183, 'M', u'ᇲ'),
- (0x3184, 'M', u'ᅗ'),
- (0x3185, 'M', u'ᅘ'),
- (0x3186, 'M', u'ᅙ'),
- (0x3187, 'M', u'ᆄ'),
- (0x3188, 'M', u'ᆅ'),
- (0x3189, 'M', u'ᆈ'),
- (0x318A, 'M', u'ᆑ'),
- (0x318B, 'M', u'ᆒ'),
- (0x318C, 'M', u'ᆔ'),
- (0x318D, 'M', u'ᆞ'),
- (0x318E, 'M', u'ᆡ'),
- (0x318F, 'X'),
- (0x3190, 'V'),
- (0x3192, 'M', u'一'),
- (0x3193, 'M', u'二'),
- (0x3194, 'M', u'三'),
- (0x3195, 'M', u'四'),
- (0x3196, 'M', u'上'),
- (0x3197, 'M', u'中'),
- (0x3198, 'M', u'下'),
- (0x3199, 'M', u'甲'),
- (0x319A, 'M', u'乙'),
- (0x319B, 'M', u'丙'),
- (0x319C, 'M', u'丁'),
- (0x319D, 'M', u'天'),
- (0x319E, 'M', u'地'),
- (0x319F, 'M', u'人'),
- (0x31A0, 'V'),
- (0x31E4, 'X'),
- (0x31F0, 'V'),
- (0x3200, '3', u'(ᄀ)'),
- (0x3201, '3', u'(ᄂ)'),
- (0x3202, '3', u'(ᄃ)'),
- (0x3203, '3', u'(ᄅ)'),
- (0x3204, '3', u'(ᄆ)'),
- (0x3205, '3', u'(ᄇ)'),
- (0x3206, '3', u'(ᄉ)'),
- (0x3207, '3', u'(ᄋ)'),
- (0x3208, '3', u'(ᄌ)'),
- (0x3209, '3', u'(ᄎ)'),
- (0x320A, '3', u'(ᄏ)'),
- (0x320B, '3', u'(ᄐ)'),
- (0x320C, '3', u'(ᄑ)'),
- (0x320D, '3', u'(ᄒ)'),
- (0x320E, '3', u'(가)'),
- (0x320F, '3', u'(나)'),
- (0x3210, '3', u'(다)'),
- (0x3211, '3', u'(라)'),
- (0x3212, '3', u'(마)'),
- (0x3213, '3', u'(바)'),
- (0x3214, '3', u'(사)'),
- (0x3215, '3', u'(아)'),
- (0x3216, '3', u'(자)'),
- (0x3217, '3', u'(차)'),
- (0x3218, '3', u'(카)'),
- (0x3219, '3', u'(타)'),
- (0x321A, '3', u'(파)'),
- (0x321B, '3', u'(하)'),
- (0x321C, '3', u'(주)'),
- (0x321D, '3', u'(오전)'),
- (0x321E, '3', u'(오후)'),
- (0x321F, 'X'),
- (0x3220, '3', u'(一)'),
- (0x3221, '3', u'(二)'),
- (0x3222, '3', u'(三)'),
- (0x3223, '3', u'(四)'),
- (0x3224, '3', u'(五)'),
- (0x3225, '3', u'(六)'),
- (0x3226, '3', u'(七)'),
- (0x3227, '3', u'(八)'),
- (0x3228, '3', u'(九)'),
- (0x3229, '3', u'(十)'),
- (0x322A, '3', u'(月)'),
- (0x322B, '3', u'(火)'),
- (0x322C, '3', u'(水)'),
- (0x322D, '3', u'(木)'),
- (0x322E, '3', u'(金)'),
- (0x322F, '3', u'(土)'),
- (0x3230, '3', u'(日)'),
- (0x3231, '3', u'(株)'),
- (0x3232, '3', u'(有)'),
- (0x3233, '3', u'(社)'),
- (0x3234, '3', u'(名)'),
- (0x3235, '3', u'(特)'),
- (0x3236, '3', u'(財)'),
- (0x3237, '3', u'(祝)'),
- (0x3238, '3', u'(労)'),
- (0x3239, '3', u'(代)'),
- (0x323A, '3', u'(呼)'),
- (0x323B, '3', u'(学)'),
- (0x323C, '3', u'(監)'),
- (0x323D, '3', u'(企)'),
- (0x323E, '3', u'(資)'),
- (0x323F, '3', u'(協)'),
- (0x3240, '3', u'(祭)'),
- (0x3241, '3', u'(休)'),
- (0x3242, '3', u'(自)'),
+ (0x32B6, "M", "41"),
+ (0x32B7, "M", "42"),
+ (0x32B8, "M", "43"),
+ (0x32B9, "M", "44"),
+ (0x32BA, "M", "45"),
+ (0x32BB, "M", "46"),
+ (0x32BC, "M", "47"),
+ (0x32BD, "M", "48"),
+ (0x32BE, "M", "49"),
+ (0x32BF, "M", "50"),
+ (0x32C0, "M", "1月"),
+ (0x32C1, "M", "2月"),
+ (0x32C2, "M", "3月"),
+ (0x32C3, "M", "4月"),
+ (0x32C4, "M", "5月"),
+ (0x32C5, "M", "6月"),
+ (0x32C6, "M", "7月"),
+ (0x32C7, "M", "8月"),
+ (0x32C8, "M", "9月"),
+ (0x32C9, "M", "10月"),
+ (0x32CA, "M", "11月"),
+ (0x32CB, "M", "12月"),
+ (0x32CC, "M", "hg"),
+ (0x32CD, "M", "erg"),
+ (0x32CE, "M", "ev"),
+ (0x32CF, "M", "ltd"),
+ (0x32D0, "M", "ア"),
+ (0x32D1, "M", "イ"),
+ (0x32D2, "M", "ウ"),
+ (0x32D3, "M", "エ"),
+ (0x32D4, "M", "オ"),
+ (0x32D5, "M", "カ"),
+ (0x32D6, "M", "キ"),
+ (0x32D7, "M", "ク"),
+ (0x32D8, "M", "ケ"),
+ (0x32D9, "M", "コ"),
+ (0x32DA, "M", "サ"),
+ (0x32DB, "M", "シ"),
+ (0x32DC, "M", "ス"),
+ (0x32DD, "M", "セ"),
+ (0x32DE, "M", "ソ"),
+ (0x32DF, "M", "タ"),
+ (0x32E0, "M", "チ"),
+ (0x32E1, "M", "ツ"),
+ (0x32E2, "M", "テ"),
+ (0x32E3, "M", "ト"),
+ (0x32E4, "M", "ナ"),
+ (0x32E5, "M", "ニ"),
+ (0x32E6, "M", "ヌ"),
+ (0x32E7, "M", "ネ"),
+ (0x32E8, "M", "ノ"),
+ (0x32E9, "M", "ハ"),
+ (0x32EA, "M", "ヒ"),
+ (0x32EB, "M", "フ"),
+ (0x32EC, "M", "ヘ"),
+ (0x32ED, "M", "ホ"),
+ (0x32EE, "M", "マ"),
+ (0x32EF, "M", "ミ"),
+ (0x32F0, "M", "ム"),
+ (0x32F1, "M", "メ"),
+ (0x32F2, "M", "モ"),
+ (0x32F3, "M", "ヤ"),
+ (0x32F4, "M", "ユ"),
+ (0x32F5, "M", "ヨ"),
+ (0x32F6, "M", "ラ"),
+ (0x32F7, "M", "リ"),
+ (0x32F8, "M", "ル"),
+ (0x32F9, "M", "レ"),
+ (0x32FA, "M", "ロ"),
+ (0x32FB, "M", "ワ"),
+ (0x32FC, "M", "ヰ"),
+ (0x32FD, "M", "ヱ"),
+ (0x32FE, "M", "ヲ"),
+ (0x32FF, "M", "令和"),
+ (0x3300, "M", "アパート"),
+ (0x3301, "M", "アルファ"),
+ (0x3302, "M", "アンペア"),
+ (0x3303, "M", "アール"),
+ (0x3304, "M", "イニング"),
+ (0x3305, "M", "インチ"),
+ (0x3306, "M", "ウォン"),
+ (0x3307, "M", "エスクード"),
+ (0x3308, "M", "エーカー"),
+ (0x3309, "M", "オンス"),
+ (0x330A, "M", "オーム"),
+ (0x330B, "M", "カイリ"),
+ (0x330C, "M", "カラット"),
+ (0x330D, "M", "カロリー"),
+ (0x330E, "M", "ガロン"),
+ (0x330F, "M", "ガンマ"),
+ (0x3310, "M", "ギガ"),
+ (0x3311, "M", "ギニー"),
+ (0x3312, "M", "キュリー"),
+ (0x3313, "M", "ギルダー"),
+ (0x3314, "M", "キロ"),
+ (0x3315, "M", "キログラム"),
+ (0x3316, "M", "キロメートル"),
+ (0x3317, "M", "キロワット"),
+ (0x3318, "M", "グラム"),
+ (0x3319, "M", "グラムトン"),
]
-def _seg_31():
+
+def _seg_33() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x3243, '3', u'(至)'),
- (0x3244, 'M', u'問'),
- (0x3245, 'M', u'幼'),
- (0x3246, 'M', u'文'),
- (0x3247, 'M', u'箏'),
- (0x3248, 'V'),
- (0x3250, 'M', u'pte'),
- (0x3251, 'M', u'21'),
- (0x3252, 'M', u'22'),
- (0x3253, 'M', u'23'),
- (0x3254, 'M', u'24'),
- (0x3255, 'M', u'25'),
- (0x3256, 'M', u'26'),
- (0x3257, 'M', u'27'),
- (0x3258, 'M', u'28'),
- (0x3259, 'M', u'29'),
- (0x325A, 'M', u'30'),
- (0x325B, 'M', u'31'),
- (0x325C, 'M', u'32'),
- (0x325D, 'M', u'33'),
- (0x325E, 'M', u'34'),
- (0x325F, 'M', u'35'),
- (0x3260, 'M', u'ᄀ'),
- (0x3261, 'M', u'ᄂ'),
- (0x3262, 'M', u'ᄃ'),
- (0x3263, 'M', u'ᄅ'),
- (0x3264, 'M', u'ᄆ'),
- (0x3265, 'M', u'ᄇ'),
- (0x3266, 'M', u'ᄉ'),
- (0x3267, 'M', u'ᄋ'),
- (0x3268, 'M', u'ᄌ'),
- (0x3269, 'M', u'ᄎ'),
- (0x326A, 'M', u'ᄏ'),
- (0x326B, 'M', u'ᄐ'),
- (0x326C, 'M', u'ᄑ'),
- (0x326D, 'M', u'ᄒ'),
- (0x326E, 'M', u'가'),
- (0x326F, 'M', u'나'),
- (0x3270, 'M', u'다'),
- (0x3271, 'M', u'라'),
- (0x3272, 'M', u'마'),
- (0x3273, 'M', u'바'),
- (0x3274, 'M', u'사'),
- (0x3275, 'M', u'아'),
- (0x3276, 'M', u'자'),
- (0x3277, 'M', u'차'),
- (0x3278, 'M', u'카'),
- (0x3279, 'M', u'타'),
- (0x327A, 'M', u'파'),
- (0x327B, 'M', u'하'),
- (0x327C, 'M', u'참고'),
- (0x327D, 'M', u'주의'),
- (0x327E, 'M', u'우'),
- (0x327F, 'V'),
- (0x3280, 'M', u'一'),
- (0x3281, 'M', u'二'),
- (0x3282, 'M', u'三'),
- (0x3283, 'M', u'四'),
- (0x3284, 'M', u'五'),
- (0x3285, 'M', u'六'),
- (0x3286, 'M', u'七'),
- (0x3287, 'M', u'八'),
- (0x3288, 'M', u'九'),
- (0x3289, 'M', u'十'),
- (0x328A, 'M', u'月'),
- (0x328B, 'M', u'火'),
- (0x328C, 'M', u'水'),
- (0x328D, 'M', u'木'),
- (0x328E, 'M', u'金'),
- (0x328F, 'M', u'土'),
- (0x3290, 'M', u'日'),
- (0x3291, 'M', u'株'),
- (0x3292, 'M', u'有'),
- (0x3293, 'M', u'社'),
- (0x3294, 'M', u'名'),
- (0x3295, 'M', u'特'),
- (0x3296, 'M', u'財'),
- (0x3297, 'M', u'祝'),
- (0x3298, 'M', u'労'),
- (0x3299, 'M', u'秘'),
- (0x329A, 'M', u'男'),
- (0x329B, 'M', u'女'),
- (0x329C, 'M', u'適'),
- (0x329D, 'M', u'優'),
- (0x329E, 'M', u'印'),
- (0x329F, 'M', u'注'),
- (0x32A0, 'M', u'項'),
- (0x32A1, 'M', u'休'),
- (0x32A2, 'M', u'写'),
- (0x32A3, 'M', u'正'),
- (0x32A4, 'M', u'上'),
- (0x32A5, 'M', u'中'),
- (0x32A6, 'M', u'下'),
- (0x32A7, 'M', u'左'),
- (0x32A8, 'M', u'右'),
- (0x32A9, 'M', u'医'),
- (0x32AA, 'M', u'宗'),
- (0x32AB, 'M', u'学'),
- (0x32AC, 'M', u'監'),
- (0x32AD, 'M', u'企'),
+ (0x331A, "M", "クルゼイロ"),
+ (0x331B, "M", "クローネ"),
+ (0x331C, "M", "ケース"),
+ (0x331D, "M", "コルナ"),
+ (0x331E, "M", "コーポ"),
+ (0x331F, "M", "サイクル"),
+ (0x3320, "M", "サンチーム"),
+ (0x3321, "M", "シリング"),
+ (0x3322, "M", "センチ"),
+ (0x3323, "M", "セント"),
+ (0x3324, "M", "ダース"),
+ (0x3325, "M", "デシ"),
+ (0x3326, "M", "ドル"),
+ (0x3327, "M", "トン"),
+ (0x3328, "M", "ナノ"),
+ (0x3329, "M", "ノット"),
+ (0x332A, "M", "ハイツ"),
+ (0x332B, "M", "パーセント"),
+ (0x332C, "M", "パーツ"),
+ (0x332D, "M", "バーレル"),
+ (0x332E, "M", "ピアストル"),
+ (0x332F, "M", "ピクル"),
+ (0x3330, "M", "ピコ"),
+ (0x3331, "M", "ビル"),
+ (0x3332, "M", "ファラッド"),
+ (0x3333, "M", "フィート"),
+ (0x3334, "M", "ブッシェル"),
+ (0x3335, "M", "フラン"),
+ (0x3336, "M", "ヘクタール"),
+ (0x3337, "M", "ペソ"),
+ (0x3338, "M", "ペニヒ"),
+ (0x3339, "M", "ヘルツ"),
+ (0x333A, "M", "ペンス"),
+ (0x333B, "M", "ページ"),
+ (0x333C, "M", "ベータ"),
+ (0x333D, "M", "ポイント"),
+ (0x333E, "M", "ボルト"),
+ (0x333F, "M", "ホン"),
+ (0x3340, "M", "ポンド"),
+ (0x3341, "M", "ホール"),
+ (0x3342, "M", "ホーン"),
+ (0x3343, "M", "マイクロ"),
+ (0x3344, "M", "マイル"),
+ (0x3345, "M", "マッハ"),
+ (0x3346, "M", "マルク"),
+ (0x3347, "M", "マンション"),
+ (0x3348, "M", "ミクロン"),
+ (0x3349, "M", "ミリ"),
+ (0x334A, "M", "ミリバール"),
+ (0x334B, "M", "メガ"),
+ (0x334C, "M", "メガトン"),
+ (0x334D, "M", "メートル"),
+ (0x334E, "M", "ヤード"),
+ (0x334F, "M", "ヤール"),
+ (0x3350, "M", "ユアン"),
+ (0x3351, "M", "リットル"),
+ (0x3352, "M", "リラ"),
+ (0x3353, "M", "ルピー"),
+ (0x3354, "M", "ルーブル"),
+ (0x3355, "M", "レム"),
+ (0x3356, "M", "レントゲン"),
+ (0x3357, "M", "ワット"),
+ (0x3358, "M", "0点"),
+ (0x3359, "M", "1点"),
+ (0x335A, "M", "2点"),
+ (0x335B, "M", "3点"),
+ (0x335C, "M", "4点"),
+ (0x335D, "M", "5点"),
+ (0x335E, "M", "6点"),
+ (0x335F, "M", "7点"),
+ (0x3360, "M", "8点"),
+ (0x3361, "M", "9点"),
+ (0x3362, "M", "10点"),
+ (0x3363, "M", "11点"),
+ (0x3364, "M", "12点"),
+ (0x3365, "M", "13点"),
+ (0x3366, "M", "14点"),
+ (0x3367, "M", "15点"),
+ (0x3368, "M", "16点"),
+ (0x3369, "M", "17点"),
+ (0x336A, "M", "18点"),
+ (0x336B, "M", "19点"),
+ (0x336C, "M", "20点"),
+ (0x336D, "M", "21点"),
+ (0x336E, "M", "22点"),
+ (0x336F, "M", "23点"),
+ (0x3370, "M", "24点"),
+ (0x3371, "M", "hpa"),
+ (0x3372, "M", "da"),
+ (0x3373, "M", "au"),
+ (0x3374, "M", "bar"),
+ (0x3375, "M", "ov"),
+ (0x3376, "M", "pc"),
+ (0x3377, "M", "dm"),
+ (0x3378, "M", "dm2"),
+ (0x3379, "M", "dm3"),
+ (0x337A, "M", "iu"),
+ (0x337B, "M", "平成"),
+ (0x337C, "M", "昭和"),
+ (0x337D, "M", "大正"),
]
-def _seg_32():
+
+def _seg_34() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x32AE, 'M', u'資'),
- (0x32AF, 'M', u'協'),
- (0x32B0, 'M', u'夜'),
- (0x32B1, 'M', u'36'),
- (0x32B2, 'M', u'37'),
- (0x32B3, 'M', u'38'),
- (0x32B4, 'M', u'39'),
- (0x32B5, 'M', u'40'),
- (0x32B6, 'M', u'41'),
- (0x32B7, 'M', u'42'),
- (0x32B8, 'M', u'43'),
- (0x32B9, 'M', u'44'),
- (0x32BA, 'M', u'45'),
- (0x32BB, 'M', u'46'),
- (0x32BC, 'M', u'47'),
- (0x32BD, 'M', u'48'),
- (0x32BE, 'M', u'49'),
- (0x32BF, 'M', u'50'),
- (0x32C0, 'M', u'1月'),
- (0x32C1, 'M', u'2月'),
- (0x32C2, 'M', u'3月'),
- (0x32C3, 'M', u'4月'),
- (0x32C4, 'M', u'5月'),
- (0x32C5, 'M', u'6月'),
- (0x32C6, 'M', u'7月'),
- (0x32C7, 'M', u'8月'),
- (0x32C8, 'M', u'9月'),
- (0x32C9, 'M', u'10月'),
- (0x32CA, 'M', u'11月'),
- (0x32CB, 'M', u'12月'),
- (0x32CC, 'M', u'hg'),
- (0x32CD, 'M', u'erg'),
- (0x32CE, 'M', u'ev'),
- (0x32CF, 'M', u'ltd'),
- (0x32D0, 'M', u'ア'),
- (0x32D1, 'M', u'イ'),
- (0x32D2, 'M', u'ウ'),
- (0x32D3, 'M', u'エ'),
- (0x32D4, 'M', u'オ'),
- (0x32D5, 'M', u'カ'),
- (0x32D6, 'M', u'キ'),
- (0x32D7, 'M', u'ク'),
- (0x32D8, 'M', u'ケ'),
- (0x32D9, 'M', u'コ'),
- (0x32DA, 'M', u'サ'),
- (0x32DB, 'M', u'シ'),
- (0x32DC, 'M', u'ス'),
- (0x32DD, 'M', u'セ'),
- (0x32DE, 'M', u'ソ'),
- (0x32DF, 'M', u'タ'),
- (0x32E0, 'M', u'チ'),
- (0x32E1, 'M', u'ツ'),
- (0x32E2, 'M', u'テ'),
- (0x32E3, 'M', u'ト'),
- (0x32E4, 'M', u'ナ'),
- (0x32E5, 'M', u'ニ'),
- (0x32E6, 'M', u'ヌ'),
- (0x32E7, 'M', u'ネ'),
- (0x32E8, 'M', u'ノ'),
- (0x32E9, 'M', u'ハ'),
- (0x32EA, 'M', u'ヒ'),
- (0x32EB, 'M', u'フ'),
- (0x32EC, 'M', u'ヘ'),
- (0x32ED, 'M', u'ホ'),
- (0x32EE, 'M', u'マ'),
- (0x32EF, 'M', u'ミ'),
- (0x32F0, 'M', u'ム'),
- (0x32F1, 'M', u'メ'),
- (0x32F2, 'M', u'モ'),
- (0x32F3, 'M', u'ヤ'),
- (0x32F4, 'M', u'ユ'),
- (0x32F5, 'M', u'ヨ'),
- (0x32F6, 'M', u'ラ'),
- (0x32F7, 'M', u'リ'),
- (0x32F8, 'M', u'ル'),
- (0x32F9, 'M', u'レ'),
- (0x32FA, 'M', u'ロ'),
- (0x32FB, 'M', u'ワ'),
- (0x32FC, 'M', u'ヰ'),
- (0x32FD, 'M', u'ヱ'),
- (0x32FE, 'M', u'ヲ'),
- (0x32FF, 'M', u'令和'),
- (0x3300, 'M', u'アパート'),
- (0x3301, 'M', u'アルファ'),
- (0x3302, 'M', u'アンペア'),
- (0x3303, 'M', u'アール'),
- (0x3304, 'M', u'イニング'),
- (0x3305, 'M', u'インチ'),
- (0x3306, 'M', u'ウォン'),
- (0x3307, 'M', u'エスクード'),
- (0x3308, 'M', u'エーカー'),
- (0x3309, 'M', u'オンス'),
- (0x330A, 'M', u'オーム'),
- (0x330B, 'M', u'カイリ'),
- (0x330C, 'M', u'カラット'),
- (0x330D, 'M', u'カロリー'),
- (0x330E, 'M', u'ガロン'),
- (0x330F, 'M', u'ガンマ'),
- (0x3310, 'M', u'ギガ'),
- (0x3311, 'M', u'ギニー'),
+ (0x337E, "M", "明治"),
+ (0x337F, "M", "株式会社"),
+ (0x3380, "M", "pa"),
+ (0x3381, "M", "na"),
+ (0x3382, "M", "μa"),
+ (0x3383, "M", "ma"),
+ (0x3384, "M", "ka"),
+ (0x3385, "M", "kb"),
+ (0x3386, "M", "mb"),
+ (0x3387, "M", "gb"),
+ (0x3388, "M", "cal"),
+ (0x3389, "M", "kcal"),
+ (0x338A, "M", "pf"),
+ (0x338B, "M", "nf"),
+ (0x338C, "M", "μf"),
+ (0x338D, "M", "μg"),
+ (0x338E, "M", "mg"),
+ (0x338F, "M", "kg"),
+ (0x3390, "M", "hz"),
+ (0x3391, "M", "khz"),
+ (0x3392, "M", "mhz"),
+ (0x3393, "M", "ghz"),
+ (0x3394, "M", "thz"),
+ (0x3395, "M", "μl"),
+ (0x3396, "M", "ml"),
+ (0x3397, "M", "dl"),
+ (0x3398, "M", "kl"),
+ (0x3399, "M", "fm"),
+ (0x339A, "M", "nm"),
+ (0x339B, "M", "μm"),
+ (0x339C, "M", "mm"),
+ (0x339D, "M", "cm"),
+ (0x339E, "M", "km"),
+ (0x339F, "M", "mm2"),
+ (0x33A0, "M", "cm2"),
+ (0x33A1, "M", "m2"),
+ (0x33A2, "M", "km2"),
+ (0x33A3, "M", "mm3"),
+ (0x33A4, "M", "cm3"),
+ (0x33A5, "M", "m3"),
+ (0x33A6, "M", "km3"),
+ (0x33A7, "M", "m∕s"),
+ (0x33A8, "M", "m∕s2"),
+ (0x33A9, "M", "pa"),
+ (0x33AA, "M", "kpa"),
+ (0x33AB, "M", "mpa"),
+ (0x33AC, "M", "gpa"),
+ (0x33AD, "M", "rad"),
+ (0x33AE, "M", "rad∕s"),
+ (0x33AF, "M", "rad∕s2"),
+ (0x33B0, "M", "ps"),
+ (0x33B1, "M", "ns"),
+ (0x33B2, "M", "μs"),
+ (0x33B3, "M", "ms"),
+ (0x33B4, "M", "pv"),
+ (0x33B5, "M", "nv"),
+ (0x33B6, "M", "μv"),
+ (0x33B7, "M", "mv"),
+ (0x33B8, "M", "kv"),
+ (0x33B9, "M", "mv"),
+ (0x33BA, "M", "pw"),
+ (0x33BB, "M", "nw"),
+ (0x33BC, "M", "μw"),
+ (0x33BD, "M", "mw"),
+ (0x33BE, "M", "kw"),
+ (0x33BF, "M", "mw"),
+ (0x33C0, "M", "kω"),
+ (0x33C1, "M", "mω"),
+ (0x33C2, "X"),
+ (0x33C3, "M", "bq"),
+ (0x33C4, "M", "cc"),
+ (0x33C5, "M", "cd"),
+ (0x33C6, "M", "c∕kg"),
+ (0x33C7, "X"),
+ (0x33C8, "M", "db"),
+ (0x33C9, "M", "gy"),
+ (0x33CA, "M", "ha"),
+ (0x33CB, "M", "hp"),
+ (0x33CC, "M", "in"),
+ (0x33CD, "M", "kk"),
+ (0x33CE, "M", "km"),
+ (0x33CF, "M", "kt"),
+ (0x33D0, "M", "lm"),
+ (0x33D1, "M", "ln"),
+ (0x33D2, "M", "log"),
+ (0x33D3, "M", "lx"),
+ (0x33D4, "M", "mb"),
+ (0x33D5, "M", "mil"),
+ (0x33D6, "M", "mol"),
+ (0x33D7, "M", "ph"),
+ (0x33D8, "X"),
+ (0x33D9, "M", "ppm"),
+ (0x33DA, "M", "pr"),
+ (0x33DB, "M", "sr"),
+ (0x33DC, "M", "sv"),
+ (0x33DD, "M", "wb"),
+ (0x33DE, "M", "v∕m"),
+ (0x33DF, "M", "a∕m"),
+ (0x33E0, "M", "1日"),
+ (0x33E1, "M", "2日"),
]
-def _seg_33():
+
+def _seg_35() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x3312, 'M', u'キュリー'),
- (0x3313, 'M', u'ギルダー'),
- (0x3314, 'M', u'キロ'),
- (0x3315, 'M', u'キログラム'),
- (0x3316, 'M', u'キロメートル'),
- (0x3317, 'M', u'キロワット'),
- (0x3318, 'M', u'グラム'),
- (0x3319, 'M', u'グラムトン'),
- (0x331A, 'M', u'クルゼイロ'),
- (0x331B, 'M', u'クローネ'),
- (0x331C, 'M', u'ケース'),
- (0x331D, 'M', u'コルナ'),
- (0x331E, 'M', u'コーポ'),
- (0x331F, 'M', u'サイクル'),
- (0x3320, 'M', u'サンチーム'),
- (0x3321, 'M', u'シリング'),
- (0x3322, 'M', u'センチ'),
- (0x3323, 'M', u'セント'),
- (0x3324, 'M', u'ダース'),
- (0x3325, 'M', u'デシ'),
- (0x3326, 'M', u'ドル'),
- (0x3327, 'M', u'トン'),
- (0x3328, 'M', u'ナノ'),
- (0x3329, 'M', u'ノット'),
- (0x332A, 'M', u'ハイツ'),
- (0x332B, 'M', u'パーセント'),
- (0x332C, 'M', u'パーツ'),
- (0x332D, 'M', u'バーレル'),
- (0x332E, 'M', u'ピアストル'),
- (0x332F, 'M', u'ピクル'),
- (0x3330, 'M', u'ピコ'),
- (0x3331, 'M', u'ビル'),
- (0x3332, 'M', u'ファラッド'),
- (0x3333, 'M', u'フィート'),
- (0x3334, 'M', u'ブッシェル'),
- (0x3335, 'M', u'フラン'),
- (0x3336, 'M', u'ヘクタール'),
- (0x3337, 'M', u'ペソ'),
- (0x3338, 'M', u'ペニヒ'),
- (0x3339, 'M', u'ヘルツ'),
- (0x333A, 'M', u'ペンス'),
- (0x333B, 'M', u'ページ'),
- (0x333C, 'M', u'ベータ'),
- (0x333D, 'M', u'ポイント'),
- (0x333E, 'M', u'ボルト'),
- (0x333F, 'M', u'ホン'),
- (0x3340, 'M', u'ポンド'),
- (0x3341, 'M', u'ホール'),
- (0x3342, 'M', u'ホーン'),
- (0x3343, 'M', u'マイクロ'),
- (0x3344, 'M', u'マイル'),
- (0x3345, 'M', u'マッハ'),
- (0x3346, 'M', u'マルク'),
- (0x3347, 'M', u'マンション'),
- (0x3348, 'M', u'ミクロン'),
- (0x3349, 'M', u'ミリ'),
- (0x334A, 'M', u'ミリバール'),
- (0x334B, 'M', u'メガ'),
- (0x334C, 'M', u'メガトン'),
- (0x334D, 'M', u'メートル'),
- (0x334E, 'M', u'ヤード'),
- (0x334F, 'M', u'ヤール'),
- (0x3350, 'M', u'ユアン'),
- (0x3351, 'M', u'リットル'),
- (0x3352, 'M', u'リラ'),
- (0x3353, 'M', u'ルピー'),
- (0x3354, 'M', u'ルーブル'),
- (0x3355, 'M', u'レム'),
- (0x3356, 'M', u'レントゲン'),
- (0x3357, 'M', u'ワット'),
- (0x3358, 'M', u'0点'),
- (0x3359, 'M', u'1点'),
- (0x335A, 'M', u'2点'),
- (0x335B, 'M', u'3点'),
- (0x335C, 'M', u'4点'),
- (0x335D, 'M', u'5点'),
- (0x335E, 'M', u'6点'),
- (0x335F, 'M', u'7点'),
- (0x3360, 'M', u'8点'),
- (0x3361, 'M', u'9点'),
- (0x3362, 'M', u'10点'),
- (0x3363, 'M', u'11点'),
- (0x3364, 'M', u'12点'),
- (0x3365, 'M', u'13点'),
- (0x3366, 'M', u'14点'),
- (0x3367, 'M', u'15点'),
- (0x3368, 'M', u'16点'),
- (0x3369, 'M', u'17点'),
- (0x336A, 'M', u'18点'),
- (0x336B, 'M', u'19点'),
- (0x336C, 'M', u'20点'),
- (0x336D, 'M', u'21点'),
- (0x336E, 'M', u'22点'),
- (0x336F, 'M', u'23点'),
- (0x3370, 'M', u'24点'),
- (0x3371, 'M', u'hpa'),
- (0x3372, 'M', u'da'),
- (0x3373, 'M', u'au'),
- (0x3374, 'M', u'bar'),
- (0x3375, 'M', u'ov'),
+ (0x33E2, "M", "3日"),
+ (0x33E3, "M", "4日"),
+ (0x33E4, "M", "5日"),
+ (0x33E5, "M", "6日"),
+ (0x33E6, "M", "7日"),
+ (0x33E7, "M", "8日"),
+ (0x33E8, "M", "9日"),
+ (0x33E9, "M", "10日"),
+ (0x33EA, "M", "11日"),
+ (0x33EB, "M", "12日"),
+ (0x33EC, "M", "13日"),
+ (0x33ED, "M", "14日"),
+ (0x33EE, "M", "15日"),
+ (0x33EF, "M", "16日"),
+ (0x33F0, "M", "17日"),
+ (0x33F1, "M", "18日"),
+ (0x33F2, "M", "19日"),
+ (0x33F3, "M", "20日"),
+ (0x33F4, "M", "21日"),
+ (0x33F5, "M", "22日"),
+ (0x33F6, "M", "23日"),
+ (0x33F7, "M", "24日"),
+ (0x33F8, "M", "25日"),
+ (0x33F9, "M", "26日"),
+ (0x33FA, "M", "27日"),
+ (0x33FB, "M", "28日"),
+ (0x33FC, "M", "29日"),
+ (0x33FD, "M", "30日"),
+ (0x33FE, "M", "31日"),
+ (0x33FF, "M", "gal"),
+ (0x3400, "V"),
+ (0xA48D, "X"),
+ (0xA490, "V"),
+ (0xA4C7, "X"),
+ (0xA4D0, "V"),
+ (0xA62C, "X"),
+ (0xA640, "M", "ꙁ"),
+ (0xA641, "V"),
+ (0xA642, "M", "ꙃ"),
+ (0xA643, "V"),
+ (0xA644, "M", "ꙅ"),
+ (0xA645, "V"),
+ (0xA646, "M", "ꙇ"),
+ (0xA647, "V"),
+ (0xA648, "M", "ꙉ"),
+ (0xA649, "V"),
+ (0xA64A, "M", "ꙋ"),
+ (0xA64B, "V"),
+ (0xA64C, "M", "ꙍ"),
+ (0xA64D, "V"),
+ (0xA64E, "M", "ꙏ"),
+ (0xA64F, "V"),
+ (0xA650, "M", "ꙑ"),
+ (0xA651, "V"),
+ (0xA652, "M", "ꙓ"),
+ (0xA653, "V"),
+ (0xA654, "M", "ꙕ"),
+ (0xA655, "V"),
+ (0xA656, "M", "ꙗ"),
+ (0xA657, "V"),
+ (0xA658, "M", "ꙙ"),
+ (0xA659, "V"),
+ (0xA65A, "M", "ꙛ"),
+ (0xA65B, "V"),
+ (0xA65C, "M", "ꙝ"),
+ (0xA65D, "V"),
+ (0xA65E, "M", "ꙟ"),
+ (0xA65F, "V"),
+ (0xA660, "M", "ꙡ"),
+ (0xA661, "V"),
+ (0xA662, "M", "ꙣ"),
+ (0xA663, "V"),
+ (0xA664, "M", "ꙥ"),
+ (0xA665, "V"),
+ (0xA666, "M", "ꙧ"),
+ (0xA667, "V"),
+ (0xA668, "M", "ꙩ"),
+ (0xA669, "V"),
+ (0xA66A, "M", "ꙫ"),
+ (0xA66B, "V"),
+ (0xA66C, "M", "ꙭ"),
+ (0xA66D, "V"),
+ (0xA680, "M", "ꚁ"),
+ (0xA681, "V"),
+ (0xA682, "M", "ꚃ"),
+ (0xA683, "V"),
+ (0xA684, "M", "ꚅ"),
+ (0xA685, "V"),
+ (0xA686, "M", "ꚇ"),
+ (0xA687, "V"),
+ (0xA688, "M", "ꚉ"),
+ (0xA689, "V"),
+ (0xA68A, "M", "ꚋ"),
+ (0xA68B, "V"),
+ (0xA68C, "M", "ꚍ"),
+ (0xA68D, "V"),
+ (0xA68E, "M", "ꚏ"),
+ (0xA68F, "V"),
+ (0xA690, "M", "ꚑ"),
+ (0xA691, "V"),
]
-def _seg_34():
+
+def _seg_36() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x3376, 'M', u'pc'),
- (0x3377, 'M', u'dm'),
- (0x3378, 'M', u'dm2'),
- (0x3379, 'M', u'dm3'),
- (0x337A, 'M', u'iu'),
- (0x337B, 'M', u'平成'),
- (0x337C, 'M', u'昭和'),
- (0x337D, 'M', u'大正'),
- (0x337E, 'M', u'明治'),
- (0x337F, 'M', u'株式会社'),
- (0x3380, 'M', u'pa'),
- (0x3381, 'M', u'na'),
- (0x3382, 'M', u'μa'),
- (0x3383, 'M', u'ma'),
- (0x3384, 'M', u'ka'),
- (0x3385, 'M', u'kb'),
- (0x3386, 'M', u'mb'),
- (0x3387, 'M', u'gb'),
- (0x3388, 'M', u'cal'),
- (0x3389, 'M', u'kcal'),
- (0x338A, 'M', u'pf'),
- (0x338B, 'M', u'nf'),
- (0x338C, 'M', u'μf'),
- (0x338D, 'M', u'μg'),
- (0x338E, 'M', u'mg'),
- (0x338F, 'M', u'kg'),
- (0x3390, 'M', u'hz'),
- (0x3391, 'M', u'khz'),
- (0x3392, 'M', u'mhz'),
- (0x3393, 'M', u'ghz'),
- (0x3394, 'M', u'thz'),
- (0x3395, 'M', u'μl'),
- (0x3396, 'M', u'ml'),
- (0x3397, 'M', u'dl'),
- (0x3398, 'M', u'kl'),
- (0x3399, 'M', u'fm'),
- (0x339A, 'M', u'nm'),
- (0x339B, 'M', u'μm'),
- (0x339C, 'M', u'mm'),
- (0x339D, 'M', u'cm'),
- (0x339E, 'M', u'km'),
- (0x339F, 'M', u'mm2'),
- (0x33A0, 'M', u'cm2'),
- (0x33A1, 'M', u'm2'),
- (0x33A2, 'M', u'km2'),
- (0x33A3, 'M', u'mm3'),
- (0x33A4, 'M', u'cm3'),
- (0x33A5, 'M', u'm3'),
- (0x33A6, 'M', u'km3'),
- (0x33A7, 'M', u'm∕s'),
- (0x33A8, 'M', u'm∕s2'),
- (0x33A9, 'M', u'pa'),
- (0x33AA, 'M', u'kpa'),
- (0x33AB, 'M', u'mpa'),
- (0x33AC, 'M', u'gpa'),
- (0x33AD, 'M', u'rad'),
- (0x33AE, 'M', u'rad∕s'),
- (0x33AF, 'M', u'rad∕s2'),
- (0x33B0, 'M', u'ps'),
- (0x33B1, 'M', u'ns'),
- (0x33B2, 'M', u'μs'),
- (0x33B3, 'M', u'ms'),
- (0x33B4, 'M', u'pv'),
- (0x33B5, 'M', u'nv'),
- (0x33B6, 'M', u'μv'),
- (0x33B7, 'M', u'mv'),
- (0x33B8, 'M', u'kv'),
- (0x33B9, 'M', u'mv'),
- (0x33BA, 'M', u'pw'),
- (0x33BB, 'M', u'nw'),
- (0x33BC, 'M', u'μw'),
- (0x33BD, 'M', u'mw'),
- (0x33BE, 'M', u'kw'),
- (0x33BF, 'M', u'mw'),
- (0x33C0, 'M', u'kω'),
- (0x33C1, 'M', u'mω'),
- (0x33C2, 'X'),
- (0x33C3, 'M', u'bq'),
- (0x33C4, 'M', u'cc'),
- (0x33C5, 'M', u'cd'),
- (0x33C6, 'M', u'c∕kg'),
- (0x33C7, 'X'),
- (0x33C8, 'M', u'db'),
- (0x33C9, 'M', u'gy'),
- (0x33CA, 'M', u'ha'),
- (0x33CB, 'M', u'hp'),
- (0x33CC, 'M', u'in'),
- (0x33CD, 'M', u'kk'),
- (0x33CE, 'M', u'km'),
- (0x33CF, 'M', u'kt'),
- (0x33D0, 'M', u'lm'),
- (0x33D1, 'M', u'ln'),
- (0x33D2, 'M', u'log'),
- (0x33D3, 'M', u'lx'),
- (0x33D4, 'M', u'mb'),
- (0x33D5, 'M', u'mil'),
- (0x33D6, 'M', u'mol'),
- (0x33D7, 'M', u'ph'),
- (0x33D8, 'X'),
- (0x33D9, 'M', u'ppm'),
+ (0xA692, "M", "ꚓ"),
+ (0xA693, "V"),
+ (0xA694, "M", "ꚕ"),
+ (0xA695, "V"),
+ (0xA696, "M", "ꚗ"),
+ (0xA697, "V"),
+ (0xA698, "M", "ꚙ"),
+ (0xA699, "V"),
+ (0xA69A, "M", "ꚛ"),
+ (0xA69B, "V"),
+ (0xA69C, "M", "ъ"),
+ (0xA69D, "M", "ь"),
+ (0xA69E, "V"),
+ (0xA6F8, "X"),
+ (0xA700, "V"),
+ (0xA722, "M", "ꜣ"),
+ (0xA723, "V"),
+ (0xA724, "M", "ꜥ"),
+ (0xA725, "V"),
+ (0xA726, "M", "ꜧ"),
+ (0xA727, "V"),
+ (0xA728, "M", "ꜩ"),
+ (0xA729, "V"),
+ (0xA72A, "M", "ꜫ"),
+ (0xA72B, "V"),
+ (0xA72C, "M", "ꜭ"),
+ (0xA72D, "V"),
+ (0xA72E, "M", "ꜯ"),
+ (0xA72F, "V"),
+ (0xA732, "M", "ꜳ"),
+ (0xA733, "V"),
+ (0xA734, "M", "ꜵ"),
+ (0xA735, "V"),
+ (0xA736, "M", "ꜷ"),
+ (0xA737, "V"),
+ (0xA738, "M", "ꜹ"),
+ (0xA739, "V"),
+ (0xA73A, "M", "ꜻ"),
+ (0xA73B, "V"),
+ (0xA73C, "M", "ꜽ"),
+ (0xA73D, "V"),
+ (0xA73E, "M", "ꜿ"),
+ (0xA73F, "V"),
+ (0xA740, "M", "ꝁ"),
+ (0xA741, "V"),
+ (0xA742, "M", "ꝃ"),
+ (0xA743, "V"),
+ (0xA744, "M", "ꝅ"),
+ (0xA745, "V"),
+ (0xA746, "M", "ꝇ"),
+ (0xA747, "V"),
+ (0xA748, "M", "ꝉ"),
+ (0xA749, "V"),
+ (0xA74A, "M", "ꝋ"),
+ (0xA74B, "V"),
+ (0xA74C, "M", "ꝍ"),
+ (0xA74D, "V"),
+ (0xA74E, "M", "ꝏ"),
+ (0xA74F, "V"),
+ (0xA750, "M", "ꝑ"),
+ (0xA751, "V"),
+ (0xA752, "M", "ꝓ"),
+ (0xA753, "V"),
+ (0xA754, "M", "ꝕ"),
+ (0xA755, "V"),
+ (0xA756, "M", "ꝗ"),
+ (0xA757, "V"),
+ (0xA758, "M", "ꝙ"),
+ (0xA759, "V"),
+ (0xA75A, "M", "ꝛ"),
+ (0xA75B, "V"),
+ (0xA75C, "M", "ꝝ"),
+ (0xA75D, "V"),
+ (0xA75E, "M", "ꝟ"),
+ (0xA75F, "V"),
+ (0xA760, "M", "ꝡ"),
+ (0xA761, "V"),
+ (0xA762, "M", "ꝣ"),
+ (0xA763, "V"),
+ (0xA764, "M", "ꝥ"),
+ (0xA765, "V"),
+ (0xA766, "M", "ꝧ"),
+ (0xA767, "V"),
+ (0xA768, "M", "ꝩ"),
+ (0xA769, "V"),
+ (0xA76A, "M", "ꝫ"),
+ (0xA76B, "V"),
+ (0xA76C, "M", "ꝭ"),
+ (0xA76D, "V"),
+ (0xA76E, "M", "ꝯ"),
+ (0xA76F, "V"),
+ (0xA770, "M", "ꝯ"),
+ (0xA771, "V"),
+ (0xA779, "M", "ꝺ"),
+ (0xA77A, "V"),
+ (0xA77B, "M", "ꝼ"),
+ (0xA77C, "V"),
+ (0xA77D, "M", "ᵹ"),
+ (0xA77E, "M", "ꝿ"),
+ (0xA77F, "V"),
]
-def _seg_35():
+
+def _seg_37() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x33DA, 'M', u'pr'),
- (0x33DB, 'M', u'sr'),
- (0x33DC, 'M', u'sv'),
- (0x33DD, 'M', u'wb'),
- (0x33DE, 'M', u'v∕m'),
- (0x33DF, 'M', u'a∕m'),
- (0x33E0, 'M', u'1日'),
- (0x33E1, 'M', u'2日'),
- (0x33E2, 'M', u'3日'),
- (0x33E3, 'M', u'4日'),
- (0x33E4, 'M', u'5日'),
- (0x33E5, 'M', u'6日'),
- (0x33E6, 'M', u'7日'),
- (0x33E7, 'M', u'8日'),
- (0x33E8, 'M', u'9日'),
- (0x33E9, 'M', u'10日'),
- (0x33EA, 'M', u'11日'),
- (0x33EB, 'M', u'12日'),
- (0x33EC, 'M', u'13日'),
- (0x33ED, 'M', u'14日'),
- (0x33EE, 'M', u'15日'),
- (0x33EF, 'M', u'16日'),
- (0x33F0, 'M', u'17日'),
- (0x33F1, 'M', u'18日'),
- (0x33F2, 'M', u'19日'),
- (0x33F3, 'M', u'20日'),
- (0x33F4, 'M', u'21日'),
- (0x33F5, 'M', u'22日'),
- (0x33F6, 'M', u'23日'),
- (0x33F7, 'M', u'24日'),
- (0x33F8, 'M', u'25日'),
- (0x33F9, 'M', u'26日'),
- (0x33FA, 'M', u'27日'),
- (0x33FB, 'M', u'28日'),
- (0x33FC, 'M', u'29日'),
- (0x33FD, 'M', u'30日'),
- (0x33FE, 'M', u'31日'),
- (0x33FF, 'M', u'gal'),
- (0x3400, 'V'),
- (0x9FFD, 'X'),
- (0xA000, 'V'),
- (0xA48D, 'X'),
- (0xA490, 'V'),
- (0xA4C7, 'X'),
- (0xA4D0, 'V'),
- (0xA62C, 'X'),
- (0xA640, 'M', u'ꙁ'),
- (0xA641, 'V'),
- (0xA642, 'M', u'ꙃ'),
- (0xA643, 'V'),
- (0xA644, 'M', u'ꙅ'),
- (0xA645, 'V'),
- (0xA646, 'M', u'ꙇ'),
- (0xA647, 'V'),
- (0xA648, 'M', u'ꙉ'),
- (0xA649, 'V'),
- (0xA64A, 'M', u'ꙋ'),
- (0xA64B, 'V'),
- (0xA64C, 'M', u'ꙍ'),
- (0xA64D, 'V'),
- (0xA64E, 'M', u'ꙏ'),
- (0xA64F, 'V'),
- (0xA650, 'M', u'ꙑ'),
- (0xA651, 'V'),
- (0xA652, 'M', u'ꙓ'),
- (0xA653, 'V'),
- (0xA654, 'M', u'ꙕ'),
- (0xA655, 'V'),
- (0xA656, 'M', u'ꙗ'),
- (0xA657, 'V'),
- (0xA658, 'M', u'ꙙ'),
- (0xA659, 'V'),
- (0xA65A, 'M', u'ꙛ'),
- (0xA65B, 'V'),
- (0xA65C, 'M', u'ꙝ'),
- (0xA65D, 'V'),
- (0xA65E, 'M', u'ꙟ'),
- (0xA65F, 'V'),
- (0xA660, 'M', u'ꙡ'),
- (0xA661, 'V'),
- (0xA662, 'M', u'ꙣ'),
- (0xA663, 'V'),
- (0xA664, 'M', u'ꙥ'),
- (0xA665, 'V'),
- (0xA666, 'M', u'ꙧ'),
- (0xA667, 'V'),
- (0xA668, 'M', u'ꙩ'),
- (0xA669, 'V'),
- (0xA66A, 'M', u'ꙫ'),
- (0xA66B, 'V'),
- (0xA66C, 'M', u'ꙭ'),
- (0xA66D, 'V'),
- (0xA680, 'M', u'ꚁ'),
- (0xA681, 'V'),
- (0xA682, 'M', u'ꚃ'),
- (0xA683, 'V'),
- (0xA684, 'M', u'ꚅ'),
- (0xA685, 'V'),
- (0xA686, 'M', u'ꚇ'),
- (0xA687, 'V'),
+ (0xA780, "M", "ꞁ"),
+ (0xA781, "V"),
+ (0xA782, "M", "ꞃ"),
+ (0xA783, "V"),
+ (0xA784, "M", "ꞅ"),
+ (0xA785, "V"),
+ (0xA786, "M", "ꞇ"),
+ (0xA787, "V"),
+ (0xA78B, "M", "ꞌ"),
+ (0xA78C, "V"),
+ (0xA78D, "M", "ɥ"),
+ (0xA78E, "V"),
+ (0xA790, "M", "ꞑ"),
+ (0xA791, "V"),
+ (0xA792, "M", "ꞓ"),
+ (0xA793, "V"),
+ (0xA796, "M", "ꞗ"),
+ (0xA797, "V"),
+ (0xA798, "M", "ꞙ"),
+ (0xA799, "V"),
+ (0xA79A, "M", "ꞛ"),
+ (0xA79B, "V"),
+ (0xA79C, "M", "ꞝ"),
+ (0xA79D, "V"),
+ (0xA79E, "M", "ꞟ"),
+ (0xA79F, "V"),
+ (0xA7A0, "M", "ꞡ"),
+ (0xA7A1, "V"),
+ (0xA7A2, "M", "ꞣ"),
+ (0xA7A3, "V"),
+ (0xA7A4, "M", "ꞥ"),
+ (0xA7A5, "V"),
+ (0xA7A6, "M", "ꞧ"),
+ (0xA7A7, "V"),
+ (0xA7A8, "M", "ꞩ"),
+ (0xA7A9, "V"),
+ (0xA7AA, "M", "ɦ"),
+ (0xA7AB, "M", "ɜ"),
+ (0xA7AC, "M", "ɡ"),
+ (0xA7AD, "M", "ɬ"),
+ (0xA7AE, "M", "ɪ"),
+ (0xA7AF, "V"),
+ (0xA7B0, "M", "ʞ"),
+ (0xA7B1, "M", "ʇ"),
+ (0xA7B2, "M", "ʝ"),
+ (0xA7B3, "M", "ꭓ"),
+ (0xA7B4, "M", "ꞵ"),
+ (0xA7B5, "V"),
+ (0xA7B6, "M", "ꞷ"),
+ (0xA7B7, "V"),
+ (0xA7B8, "M", "ꞹ"),
+ (0xA7B9, "V"),
+ (0xA7BA, "M", "ꞻ"),
+ (0xA7BB, "V"),
+ (0xA7BC, "M", "ꞽ"),
+ (0xA7BD, "V"),
+ (0xA7BE, "M", "ꞿ"),
+ (0xA7BF, "V"),
+ (0xA7C0, "M", "ꟁ"),
+ (0xA7C1, "V"),
+ (0xA7C2, "M", "ꟃ"),
+ (0xA7C3, "V"),
+ (0xA7C4, "M", "ꞔ"),
+ (0xA7C5, "M", "ʂ"),
+ (0xA7C6, "M", "ᶎ"),
+ (0xA7C7, "M", "ꟈ"),
+ (0xA7C8, "V"),
+ (0xA7C9, "M", "ꟊ"),
+ (0xA7CA, "V"),
+ (0xA7CB, "X"),
+ (0xA7D0, "M", "ꟑ"),
+ (0xA7D1, "V"),
+ (0xA7D2, "X"),
+ (0xA7D3, "V"),
+ (0xA7D4, "X"),
+ (0xA7D5, "V"),
+ (0xA7D6, "M", "ꟗ"),
+ (0xA7D7, "V"),
+ (0xA7D8, "M", "ꟙ"),
+ (0xA7D9, "V"),
+ (0xA7DA, "X"),
+ (0xA7F2, "M", "c"),
+ (0xA7F3, "M", "f"),
+ (0xA7F4, "M", "q"),
+ (0xA7F5, "M", "ꟶ"),
+ (0xA7F6, "V"),
+ (0xA7F8, "M", "ħ"),
+ (0xA7F9, "M", "œ"),
+ (0xA7FA, "V"),
+ (0xA82D, "X"),
+ (0xA830, "V"),
+ (0xA83A, "X"),
+ (0xA840, "V"),
+ (0xA878, "X"),
+ (0xA880, "V"),
+ (0xA8C6, "X"),
+ (0xA8CE, "V"),
+ (0xA8DA, "X"),
+ (0xA8E0, "V"),
+ (0xA954, "X"),
]
-def _seg_36():
+
+def _seg_38() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0xA688, 'M', u'ꚉ'),
- (0xA689, 'V'),
- (0xA68A, 'M', u'ꚋ'),
- (0xA68B, 'V'),
- (0xA68C, 'M', u'ꚍ'),
- (0xA68D, 'V'),
- (0xA68E, 'M', u'ꚏ'),
- (0xA68F, 'V'),
- (0xA690, 'M', u'ꚑ'),
- (0xA691, 'V'),
- (0xA692, 'M', u'ꚓ'),
- (0xA693, 'V'),
- (0xA694, 'M', u'ꚕ'),
- (0xA695, 'V'),
- (0xA696, 'M', u'ꚗ'),
- (0xA697, 'V'),
- (0xA698, 'M', u'ꚙ'),
- (0xA699, 'V'),
- (0xA69A, 'M', u'ꚛ'),
- (0xA69B, 'V'),
- (0xA69C, 'M', u'ъ'),
- (0xA69D, 'M', u'ь'),
- (0xA69E, 'V'),
- (0xA6F8, 'X'),
- (0xA700, 'V'),
- (0xA722, 'M', u'ꜣ'),
- (0xA723, 'V'),
- (0xA724, 'M', u'ꜥ'),
- (0xA725, 'V'),
- (0xA726, 'M', u'ꜧ'),
- (0xA727, 'V'),
- (0xA728, 'M', u'ꜩ'),
- (0xA729, 'V'),
- (0xA72A, 'M', u'ꜫ'),
- (0xA72B, 'V'),
- (0xA72C, 'M', u'ꜭ'),
- (0xA72D, 'V'),
- (0xA72E, 'M', u'ꜯ'),
- (0xA72F, 'V'),
- (0xA732, 'M', u'ꜳ'),
- (0xA733, 'V'),
- (0xA734, 'M', u'ꜵ'),
- (0xA735, 'V'),
- (0xA736, 'M', u'ꜷ'),
- (0xA737, 'V'),
- (0xA738, 'M', u'ꜹ'),
- (0xA739, 'V'),
- (0xA73A, 'M', u'ꜻ'),
- (0xA73B, 'V'),
- (0xA73C, 'M', u'ꜽ'),
- (0xA73D, 'V'),
- (0xA73E, 'M', u'ꜿ'),
- (0xA73F, 'V'),
- (0xA740, 'M', u'ꝁ'),
- (0xA741, 'V'),
- (0xA742, 'M', u'ꝃ'),
- (0xA743, 'V'),
- (0xA744, 'M', u'ꝅ'),
- (0xA745, 'V'),
- (0xA746, 'M', u'ꝇ'),
- (0xA747, 'V'),
- (0xA748, 'M', u'ꝉ'),
- (0xA749, 'V'),
- (0xA74A, 'M', u'ꝋ'),
- (0xA74B, 'V'),
- (0xA74C, 'M', u'ꝍ'),
- (0xA74D, 'V'),
- (0xA74E, 'M', u'ꝏ'),
- (0xA74F, 'V'),
- (0xA750, 'M', u'ꝑ'),
- (0xA751, 'V'),
- (0xA752, 'M', u'ꝓ'),
- (0xA753, 'V'),
- (0xA754, 'M', u'ꝕ'),
- (0xA755, 'V'),
- (0xA756, 'M', u'ꝗ'),
- (0xA757, 'V'),
- (0xA758, 'M', u'ꝙ'),
- (0xA759, 'V'),
- (0xA75A, 'M', u'ꝛ'),
- (0xA75B, 'V'),
- (0xA75C, 'M', u'ꝝ'),
- (0xA75D, 'V'),
- (0xA75E, 'M', u'ꝟ'),
- (0xA75F, 'V'),
- (0xA760, 'M', u'ꝡ'),
- (0xA761, 'V'),
- (0xA762, 'M', u'ꝣ'),
- (0xA763, 'V'),
- (0xA764, 'M', u'ꝥ'),
- (0xA765, 'V'),
- (0xA766, 'M', u'ꝧ'),
- (0xA767, 'V'),
- (0xA768, 'M', u'ꝩ'),
- (0xA769, 'V'),
- (0xA76A, 'M', u'ꝫ'),
- (0xA76B, 'V'),
- (0xA76C, 'M', u'ꝭ'),
- (0xA76D, 'V'),
- (0xA76E, 'M', u'ꝯ'),
+ (0xA95F, "V"),
+ (0xA97D, "X"),
+ (0xA980, "V"),
+ (0xA9CE, "X"),
+ (0xA9CF, "V"),
+ (0xA9DA, "X"),
+ (0xA9DE, "V"),
+ (0xA9FF, "X"),
+ (0xAA00, "V"),
+ (0xAA37, "X"),
+ (0xAA40, "V"),
+ (0xAA4E, "X"),
+ (0xAA50, "V"),
+ (0xAA5A, "X"),
+ (0xAA5C, "V"),
+ (0xAAC3, "X"),
+ (0xAADB, "V"),
+ (0xAAF7, "X"),
+ (0xAB01, "V"),
+ (0xAB07, "X"),
+ (0xAB09, "V"),
+ (0xAB0F, "X"),
+ (0xAB11, "V"),
+ (0xAB17, "X"),
+ (0xAB20, "V"),
+ (0xAB27, "X"),
+ (0xAB28, "V"),
+ (0xAB2F, "X"),
+ (0xAB30, "V"),
+ (0xAB5C, "M", "ꜧ"),
+ (0xAB5D, "M", "ꬷ"),
+ (0xAB5E, "M", "ɫ"),
+ (0xAB5F, "M", "ꭒ"),
+ (0xAB60, "V"),
+ (0xAB69, "M", "ʍ"),
+ (0xAB6A, "V"),
+ (0xAB6C, "X"),
+ (0xAB70, "M", "Ꭰ"),
+ (0xAB71, "M", "Ꭱ"),
+ (0xAB72, "M", "Ꭲ"),
+ (0xAB73, "M", "Ꭳ"),
+ (0xAB74, "M", "Ꭴ"),
+ (0xAB75, "M", "Ꭵ"),
+ (0xAB76, "M", "Ꭶ"),
+ (0xAB77, "M", "Ꭷ"),
+ (0xAB78, "M", "Ꭸ"),
+ (0xAB79, "M", "Ꭹ"),
+ (0xAB7A, "M", "Ꭺ"),
+ (0xAB7B, "M", "Ꭻ"),
+ (0xAB7C, "M", "Ꭼ"),
+ (0xAB7D, "M", "Ꭽ"),
+ (0xAB7E, "M", "Ꭾ"),
+ (0xAB7F, "M", "Ꭿ"),
+ (0xAB80, "M", "Ꮀ"),
+ (0xAB81, "M", "Ꮁ"),
+ (0xAB82, "M", "Ꮂ"),
+ (0xAB83, "M", "Ꮃ"),
+ (0xAB84, "M", "Ꮄ"),
+ (0xAB85, "M", "Ꮅ"),
+ (0xAB86, "M", "Ꮆ"),
+ (0xAB87, "M", "Ꮇ"),
+ (0xAB88, "M", "Ꮈ"),
+ (0xAB89, "M", "Ꮉ"),
+ (0xAB8A, "M", "Ꮊ"),
+ (0xAB8B, "M", "Ꮋ"),
+ (0xAB8C, "M", "Ꮌ"),
+ (0xAB8D, "M", "Ꮍ"),
+ (0xAB8E, "M", "Ꮎ"),
+ (0xAB8F, "M", "Ꮏ"),
+ (0xAB90, "M", "Ꮐ"),
+ (0xAB91, "M", "Ꮑ"),
+ (0xAB92, "M", "Ꮒ"),
+ (0xAB93, "M", "Ꮓ"),
+ (0xAB94, "M", "Ꮔ"),
+ (0xAB95, "M", "Ꮕ"),
+ (0xAB96, "M", "Ꮖ"),
+ (0xAB97, "M", "Ꮗ"),
+ (0xAB98, "M", "Ꮘ"),
+ (0xAB99, "M", "Ꮙ"),
+ (0xAB9A, "M", "Ꮚ"),
+ (0xAB9B, "M", "Ꮛ"),
+ (0xAB9C, "M", "Ꮜ"),
+ (0xAB9D, "M", "Ꮝ"),
+ (0xAB9E, "M", "Ꮞ"),
+ (0xAB9F, "M", "Ꮟ"),
+ (0xABA0, "M", "Ꮠ"),
+ (0xABA1, "M", "Ꮡ"),
+ (0xABA2, "M", "Ꮢ"),
+ (0xABA3, "M", "Ꮣ"),
+ (0xABA4, "M", "Ꮤ"),
+ (0xABA5, "M", "Ꮥ"),
+ (0xABA6, "M", "Ꮦ"),
+ (0xABA7, "M", "Ꮧ"),
+ (0xABA8, "M", "Ꮨ"),
+ (0xABA9, "M", "Ꮩ"),
+ (0xABAA, "M", "Ꮪ"),
+ (0xABAB, "M", "Ꮫ"),
+ (0xABAC, "M", "Ꮬ"),
+ (0xABAD, "M", "Ꮭ"),
+ (0xABAE, "M", "Ꮮ"),
]
-def _seg_37():
+
+def _seg_39() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0xA76F, 'V'),
- (0xA770, 'M', u'ꝯ'),
- (0xA771, 'V'),
- (0xA779, 'M', u'ꝺ'),
- (0xA77A, 'V'),
- (0xA77B, 'M', u'ꝼ'),
- (0xA77C, 'V'),
- (0xA77D, 'M', u'ᵹ'),
- (0xA77E, 'M', u'ꝿ'),
- (0xA77F, 'V'),
- (0xA780, 'M', u'ꞁ'),
- (0xA781, 'V'),
- (0xA782, 'M', u'ꞃ'),
- (0xA783, 'V'),
- (0xA784, 'M', u'ꞅ'),
- (0xA785, 'V'),
- (0xA786, 'M', u'ꞇ'),
- (0xA787, 'V'),
- (0xA78B, 'M', u'ꞌ'),
- (0xA78C, 'V'),
- (0xA78D, 'M', u'ɥ'),
- (0xA78E, 'V'),
- (0xA790, 'M', u'ꞑ'),
- (0xA791, 'V'),
- (0xA792, 'M', u'ꞓ'),
- (0xA793, 'V'),
- (0xA796, 'M', u'ꞗ'),
- (0xA797, 'V'),
- (0xA798, 'M', u'ꞙ'),
- (0xA799, 'V'),
- (0xA79A, 'M', u'ꞛ'),
- (0xA79B, 'V'),
- (0xA79C, 'M', u'ꞝ'),
- (0xA79D, 'V'),
- (0xA79E, 'M', u'ꞟ'),
- (0xA79F, 'V'),
- (0xA7A0, 'M', u'ꞡ'),
- (0xA7A1, 'V'),
- (0xA7A2, 'M', u'ꞣ'),
- (0xA7A3, 'V'),
- (0xA7A4, 'M', u'ꞥ'),
- (0xA7A5, 'V'),
- (0xA7A6, 'M', u'ꞧ'),
- (0xA7A7, 'V'),
- (0xA7A8, 'M', u'ꞩ'),
- (0xA7A9, 'V'),
- (0xA7AA, 'M', u'ɦ'),
- (0xA7AB, 'M', u'ɜ'),
- (0xA7AC, 'M', u'ɡ'),
- (0xA7AD, 'M', u'ɬ'),
- (0xA7AE, 'M', u'ɪ'),
- (0xA7AF, 'V'),
- (0xA7B0, 'M', u'ʞ'),
- (0xA7B1, 'M', u'ʇ'),
- (0xA7B2, 'M', u'ʝ'),
- (0xA7B3, 'M', u'ꭓ'),
- (0xA7B4, 'M', u'ꞵ'),
- (0xA7B5, 'V'),
- (0xA7B6, 'M', u'ꞷ'),
- (0xA7B7, 'V'),
- (0xA7B8, 'M', u'ꞹ'),
- (0xA7B9, 'V'),
- (0xA7BA, 'M', u'ꞻ'),
- (0xA7BB, 'V'),
- (0xA7BC, 'M', u'ꞽ'),
- (0xA7BD, 'V'),
- (0xA7BE, 'M', u'ꞿ'),
- (0xA7BF, 'V'),
- (0xA7C0, 'X'),
- (0xA7C2, 'M', u'ꟃ'),
- (0xA7C3, 'V'),
- (0xA7C4, 'M', u'ꞔ'),
- (0xA7C5, 'M', u'ʂ'),
- (0xA7C6, 'M', u'ᶎ'),
- (0xA7C7, 'M', u'ꟈ'),
- (0xA7C8, 'V'),
- (0xA7C9, 'M', u'ꟊ'),
- (0xA7CA, 'V'),
- (0xA7CB, 'X'),
- (0xA7F5, 'M', u'ꟶ'),
- (0xA7F6, 'V'),
- (0xA7F8, 'M', u'ħ'),
- (0xA7F9, 'M', u'œ'),
- (0xA7FA, 'V'),
- (0xA82D, 'X'),
- (0xA830, 'V'),
- (0xA83A, 'X'),
- (0xA840, 'V'),
- (0xA878, 'X'),
- (0xA880, 'V'),
- (0xA8C6, 'X'),
- (0xA8CE, 'V'),
- (0xA8DA, 'X'),
- (0xA8E0, 'V'),
- (0xA954, 'X'),
- (0xA95F, 'V'),
- (0xA97D, 'X'),
- (0xA980, 'V'),
- (0xA9CE, 'X'),
- (0xA9CF, 'V'),
+ (0xABAF, "M", "Ꮯ"),
+ (0xABB0, "M", "Ꮰ"),
+ (0xABB1, "M", "Ꮱ"),
+ (0xABB2, "M", "Ꮲ"),
+ (0xABB3, "M", "Ꮳ"),
+ (0xABB4, "M", "Ꮴ"),
+ (0xABB5, "M", "Ꮵ"),
+ (0xABB6, "M", "Ꮶ"),
+ (0xABB7, "M", "Ꮷ"),
+ (0xABB8, "M", "Ꮸ"),
+ (0xABB9, "M", "Ꮹ"),
+ (0xABBA, "M", "Ꮺ"),
+ (0xABBB, "M", "Ꮻ"),
+ (0xABBC, "M", "Ꮼ"),
+ (0xABBD, "M", "Ꮽ"),
+ (0xABBE, "M", "Ꮾ"),
+ (0xABBF, "M", "Ꮿ"),
+ (0xABC0, "V"),
+ (0xABEE, "X"),
+ (0xABF0, "V"),
+ (0xABFA, "X"),
+ (0xAC00, "V"),
+ (0xD7A4, "X"),
+ (0xD7B0, "V"),
+ (0xD7C7, "X"),
+ (0xD7CB, "V"),
+ (0xD7FC, "X"),
+ (0xF900, "M", "豈"),
+ (0xF901, "M", "更"),
+ (0xF902, "M", "車"),
+ (0xF903, "M", "賈"),
+ (0xF904, "M", "滑"),
+ (0xF905, "M", "串"),
+ (0xF906, "M", "句"),
+ (0xF907, "M", "龜"),
+ (0xF909, "M", "契"),
+ (0xF90A, "M", "金"),
+ (0xF90B, "M", "喇"),
+ (0xF90C, "M", "奈"),
+ (0xF90D, "M", "懶"),
+ (0xF90E, "M", "癩"),
+ (0xF90F, "M", "羅"),
+ (0xF910, "M", "蘿"),
+ (0xF911, "M", "螺"),
+ (0xF912, "M", "裸"),
+ (0xF913, "M", "邏"),
+ (0xF914, "M", "樂"),
+ (0xF915, "M", "洛"),
+ (0xF916, "M", "烙"),
+ (0xF917, "M", "珞"),
+ (0xF918, "M", "落"),
+ (0xF919, "M", "酪"),
+ (0xF91A, "M", "駱"),
+ (0xF91B, "M", "亂"),
+ (0xF91C, "M", "卵"),
+ (0xF91D, "M", "欄"),
+ (0xF91E, "M", "爛"),
+ (0xF91F, "M", "蘭"),
+ (0xF920, "M", "鸞"),
+ (0xF921, "M", "嵐"),
+ (0xF922, "M", "濫"),
+ (0xF923, "M", "藍"),
+ (0xF924, "M", "襤"),
+ (0xF925, "M", "拉"),
+ (0xF926, "M", "臘"),
+ (0xF927, "M", "蠟"),
+ (0xF928, "M", "廊"),
+ (0xF929, "M", "朗"),
+ (0xF92A, "M", "浪"),
+ (0xF92B, "M", "狼"),
+ (0xF92C, "M", "郎"),
+ (0xF92D, "M", "來"),
+ (0xF92E, "M", "冷"),
+ (0xF92F, "M", "勞"),
+ (0xF930, "M", "擄"),
+ (0xF931, "M", "櫓"),
+ (0xF932, "M", "爐"),
+ (0xF933, "M", "盧"),
+ (0xF934, "M", "老"),
+ (0xF935, "M", "蘆"),
+ (0xF936, "M", "虜"),
+ (0xF937, "M", "路"),
+ (0xF938, "M", "露"),
+ (0xF939, "M", "魯"),
+ (0xF93A, "M", "鷺"),
+ (0xF93B, "M", "碌"),
+ (0xF93C, "M", "祿"),
+ (0xF93D, "M", "綠"),
+ (0xF93E, "M", "菉"),
+ (0xF93F, "M", "錄"),
+ (0xF940, "M", "鹿"),
+ (0xF941, "M", "論"),
+ (0xF942, "M", "壟"),
+ (0xF943, "M", "弄"),
+ (0xF944, "M", "籠"),
+ (0xF945, "M", "聾"),
+ (0xF946, "M", "牢"),
+ (0xF947, "M", "磊"),
+ (0xF948, "M", "賂"),
+ (0xF949, "M", "雷"),
]
-def _seg_38():
+
+def _seg_40() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0xA9DA, 'X'),
- (0xA9DE, 'V'),
- (0xA9FF, 'X'),
- (0xAA00, 'V'),
- (0xAA37, 'X'),
- (0xAA40, 'V'),
- (0xAA4E, 'X'),
- (0xAA50, 'V'),
- (0xAA5A, 'X'),
- (0xAA5C, 'V'),
- (0xAAC3, 'X'),
- (0xAADB, 'V'),
- (0xAAF7, 'X'),
- (0xAB01, 'V'),
- (0xAB07, 'X'),
- (0xAB09, 'V'),
- (0xAB0F, 'X'),
- (0xAB11, 'V'),
- (0xAB17, 'X'),
- (0xAB20, 'V'),
- (0xAB27, 'X'),
- (0xAB28, 'V'),
- (0xAB2F, 'X'),
- (0xAB30, 'V'),
- (0xAB5C, 'M', u'ꜧ'),
- (0xAB5D, 'M', u'ꬷ'),
- (0xAB5E, 'M', u'ɫ'),
- (0xAB5F, 'M', u'ꭒ'),
- (0xAB60, 'V'),
- (0xAB69, 'M', u'ʍ'),
- (0xAB6A, 'V'),
- (0xAB6C, 'X'),
- (0xAB70, 'M', u'Ꭰ'),
- (0xAB71, 'M', u'Ꭱ'),
- (0xAB72, 'M', u'Ꭲ'),
- (0xAB73, 'M', u'Ꭳ'),
- (0xAB74, 'M', u'Ꭴ'),
- (0xAB75, 'M', u'Ꭵ'),
- (0xAB76, 'M', u'Ꭶ'),
- (0xAB77, 'M', u'Ꭷ'),
- (0xAB78, 'M', u'Ꭸ'),
- (0xAB79, 'M', u'Ꭹ'),
- (0xAB7A, 'M', u'Ꭺ'),
- (0xAB7B, 'M', u'Ꭻ'),
- (0xAB7C, 'M', u'Ꭼ'),
- (0xAB7D, 'M', u'Ꭽ'),
- (0xAB7E, 'M', u'Ꭾ'),
- (0xAB7F, 'M', u'Ꭿ'),
- (0xAB80, 'M', u'Ꮀ'),
- (0xAB81, 'M', u'Ꮁ'),
- (0xAB82, 'M', u'Ꮂ'),
- (0xAB83, 'M', u'Ꮃ'),
- (0xAB84, 'M', u'Ꮄ'),
- (0xAB85, 'M', u'Ꮅ'),
- (0xAB86, 'M', u'Ꮆ'),
- (0xAB87, 'M', u'Ꮇ'),
- (0xAB88, 'M', u'Ꮈ'),
- (0xAB89, 'M', u'Ꮉ'),
- (0xAB8A, 'M', u'Ꮊ'),
- (0xAB8B, 'M', u'Ꮋ'),
- (0xAB8C, 'M', u'Ꮌ'),
- (0xAB8D, 'M', u'Ꮍ'),
- (0xAB8E, 'M', u'Ꮎ'),
- (0xAB8F, 'M', u'Ꮏ'),
- (0xAB90, 'M', u'Ꮐ'),
- (0xAB91, 'M', u'Ꮑ'),
- (0xAB92, 'M', u'Ꮒ'),
- (0xAB93, 'M', u'Ꮓ'),
- (0xAB94, 'M', u'Ꮔ'),
- (0xAB95, 'M', u'Ꮕ'),
- (0xAB96, 'M', u'Ꮖ'),
- (0xAB97, 'M', u'Ꮗ'),
- (0xAB98, 'M', u'Ꮘ'),
- (0xAB99, 'M', u'Ꮙ'),
- (0xAB9A, 'M', u'Ꮚ'),
- (0xAB9B, 'M', u'Ꮛ'),
- (0xAB9C, 'M', u'Ꮜ'),
- (0xAB9D, 'M', u'Ꮝ'),
- (0xAB9E, 'M', u'Ꮞ'),
- (0xAB9F, 'M', u'Ꮟ'),
- (0xABA0, 'M', u'Ꮠ'),
- (0xABA1, 'M', u'Ꮡ'),
- (0xABA2, 'M', u'Ꮢ'),
- (0xABA3, 'M', u'Ꮣ'),
- (0xABA4, 'M', u'Ꮤ'),
- (0xABA5, 'M', u'Ꮥ'),
- (0xABA6, 'M', u'Ꮦ'),
- (0xABA7, 'M', u'Ꮧ'),
- (0xABA8, 'M', u'Ꮨ'),
- (0xABA9, 'M', u'Ꮩ'),
- (0xABAA, 'M', u'Ꮪ'),
- (0xABAB, 'M', u'Ꮫ'),
- (0xABAC, 'M', u'Ꮬ'),
- (0xABAD, 'M', u'Ꮭ'),
- (0xABAE, 'M', u'Ꮮ'),
- (0xABAF, 'M', u'Ꮯ'),
- (0xABB0, 'M', u'Ꮰ'),
- (0xABB1, 'M', u'Ꮱ'),
- (0xABB2, 'M', u'Ꮲ'),
- (0xABB3, 'M', u'Ꮳ'),
+ (0xF94A, "M", "壘"),
+ (0xF94B, "M", "屢"),
+ (0xF94C, "M", "樓"),
+ (0xF94D, "M", "淚"),
+ (0xF94E, "M", "漏"),
+ (0xF94F, "M", "累"),
+ (0xF950, "M", "縷"),
+ (0xF951, "M", "陋"),
+ (0xF952, "M", "勒"),
+ (0xF953, "M", "肋"),
+ (0xF954, "M", "凜"),
+ (0xF955, "M", "凌"),
+ (0xF956, "M", "稜"),
+ (0xF957, "M", "綾"),
+ (0xF958, "M", "菱"),
+ (0xF959, "M", "陵"),
+ (0xF95A, "M", "讀"),
+ (0xF95B, "M", "拏"),
+ (0xF95C, "M", "樂"),
+ (0xF95D, "M", "諾"),
+ (0xF95E, "M", "丹"),
+ (0xF95F, "M", "寧"),
+ (0xF960, "M", "怒"),
+ (0xF961, "M", "率"),
+ (0xF962, "M", "異"),
+ (0xF963, "M", "北"),
+ (0xF964, "M", "磻"),
+ (0xF965, "M", "便"),
+ (0xF966, "M", "復"),
+ (0xF967, "M", "不"),
+ (0xF968, "M", "泌"),
+ (0xF969, "M", "數"),
+ (0xF96A, "M", "索"),
+ (0xF96B, "M", "參"),
+ (0xF96C, "M", "塞"),
+ (0xF96D, "M", "省"),
+ (0xF96E, "M", "葉"),
+ (0xF96F, "M", "說"),
+ (0xF970, "M", "殺"),
+ (0xF971, "M", "辰"),
+ (0xF972, "M", "沈"),
+ (0xF973, "M", "拾"),
+ (0xF974, "M", "若"),
+ (0xF975, "M", "掠"),
+ (0xF976, "M", "略"),
+ (0xF977, "M", "亮"),
+ (0xF978, "M", "兩"),
+ (0xF979, "M", "凉"),
+ (0xF97A, "M", "梁"),
+ (0xF97B, "M", "糧"),
+ (0xF97C, "M", "良"),
+ (0xF97D, "M", "諒"),
+ (0xF97E, "M", "量"),
+ (0xF97F, "M", "勵"),
+ (0xF980, "M", "呂"),
+ (0xF981, "M", "女"),
+ (0xF982, "M", "廬"),
+ (0xF983, "M", "旅"),
+ (0xF984, "M", "濾"),
+ (0xF985, "M", "礪"),
+ (0xF986, "M", "閭"),
+ (0xF987, "M", "驪"),
+ (0xF988, "M", "麗"),
+ (0xF989, "M", "黎"),
+ (0xF98A, "M", "力"),
+ (0xF98B, "M", "曆"),
+ (0xF98C, "M", "歷"),
+ (0xF98D, "M", "轢"),
+ (0xF98E, "M", "年"),
+ (0xF98F, "M", "憐"),
+ (0xF990, "M", "戀"),
+ (0xF991, "M", "撚"),
+ (0xF992, "M", "漣"),
+ (0xF993, "M", "煉"),
+ (0xF994, "M", "璉"),
+ (0xF995, "M", "秊"),
+ (0xF996, "M", "練"),
+ (0xF997, "M", "聯"),
+ (0xF998, "M", "輦"),
+ (0xF999, "M", "蓮"),
+ (0xF99A, "M", "連"),
+ (0xF99B, "M", "鍊"),
+ (0xF99C, "M", "列"),
+ (0xF99D, "M", "劣"),
+ (0xF99E, "M", "咽"),
+ (0xF99F, "M", "烈"),
+ (0xF9A0, "M", "裂"),
+ (0xF9A1, "M", "說"),
+ (0xF9A2, "M", "廉"),
+ (0xF9A3, "M", "念"),
+ (0xF9A4, "M", "捻"),
+ (0xF9A5, "M", "殮"),
+ (0xF9A6, "M", "簾"),
+ (0xF9A7, "M", "獵"),
+ (0xF9A8, "M", "令"),
+ (0xF9A9, "M", "囹"),
+ (0xF9AA, "M", "寧"),
+ (0xF9AB, "M", "嶺"),
+ (0xF9AC, "M", "怜"),
+ (0xF9AD, "M", "玲"),
]
-def _seg_39():
+
+def _seg_41() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0xABB4, 'M', u'Ꮴ'),
- (0xABB5, 'M', u'Ꮵ'),
- (0xABB6, 'M', u'Ꮶ'),
- (0xABB7, 'M', u'Ꮷ'),
- (0xABB8, 'M', u'Ꮸ'),
- (0xABB9, 'M', u'Ꮹ'),
- (0xABBA, 'M', u'Ꮺ'),
- (0xABBB, 'M', u'Ꮻ'),
- (0xABBC, 'M', u'Ꮼ'),
- (0xABBD, 'M', u'Ꮽ'),
- (0xABBE, 'M', u'Ꮾ'),
- (0xABBF, 'M', u'Ꮿ'),
- (0xABC0, 'V'),
- (0xABEE, 'X'),
- (0xABF0, 'V'),
- (0xABFA, 'X'),
- (0xAC00, 'V'),
- (0xD7A4, 'X'),
- (0xD7B0, 'V'),
- (0xD7C7, 'X'),
- (0xD7CB, 'V'),
- (0xD7FC, 'X'),
- (0xF900, 'M', u'豈'),
- (0xF901, 'M', u'更'),
- (0xF902, 'M', u'車'),
- (0xF903, 'M', u'賈'),
- (0xF904, 'M', u'滑'),
- (0xF905, 'M', u'串'),
- (0xF906, 'M', u'句'),
- (0xF907, 'M', u'龜'),
- (0xF909, 'M', u'契'),
- (0xF90A, 'M', u'金'),
- (0xF90B, 'M', u'喇'),
- (0xF90C, 'M', u'奈'),
- (0xF90D, 'M', u'懶'),
- (0xF90E, 'M', u'癩'),
- (0xF90F, 'M', u'羅'),
- (0xF910, 'M', u'蘿'),
- (0xF911, 'M', u'螺'),
- (0xF912, 'M', u'裸'),
- (0xF913, 'M', u'邏'),
- (0xF914, 'M', u'樂'),
- (0xF915, 'M', u'洛'),
- (0xF916, 'M', u'烙'),
- (0xF917, 'M', u'珞'),
- (0xF918, 'M', u'落'),
- (0xF919, 'M', u'酪'),
- (0xF91A, 'M', u'駱'),
- (0xF91B, 'M', u'亂'),
- (0xF91C, 'M', u'卵'),
- (0xF91D, 'M', u'欄'),
- (0xF91E, 'M', u'爛'),
- (0xF91F, 'M', u'蘭'),
- (0xF920, 'M', u'鸞'),
- (0xF921, 'M', u'嵐'),
- (0xF922, 'M', u'濫'),
- (0xF923, 'M', u'藍'),
- (0xF924, 'M', u'襤'),
- (0xF925, 'M', u'拉'),
- (0xF926, 'M', u'臘'),
- (0xF927, 'M', u'蠟'),
- (0xF928, 'M', u'廊'),
- (0xF929, 'M', u'朗'),
- (0xF92A, 'M', u'浪'),
- (0xF92B, 'M', u'狼'),
- (0xF92C, 'M', u'郎'),
- (0xF92D, 'M', u'來'),
- (0xF92E, 'M', u'冷'),
- (0xF92F, 'M', u'勞'),
- (0xF930, 'M', u'擄'),
- (0xF931, 'M', u'櫓'),
- (0xF932, 'M', u'爐'),
- (0xF933, 'M', u'盧'),
- (0xF934, 'M', u'老'),
- (0xF935, 'M', u'蘆'),
- (0xF936, 'M', u'虜'),
- (0xF937, 'M', u'路'),
- (0xF938, 'M', u'露'),
- (0xF939, 'M', u'魯'),
- (0xF93A, 'M', u'鷺'),
- (0xF93B, 'M', u'碌'),
- (0xF93C, 'M', u'祿'),
- (0xF93D, 'M', u'綠'),
- (0xF93E, 'M', u'菉'),
- (0xF93F, 'M', u'錄'),
- (0xF940, 'M', u'鹿'),
- (0xF941, 'M', u'論'),
- (0xF942, 'M', u'壟'),
- (0xF943, 'M', u'弄'),
- (0xF944, 'M', u'籠'),
- (0xF945, 'M', u'聾'),
- (0xF946, 'M', u'牢'),
- (0xF947, 'M', u'磊'),
- (0xF948, 'M', u'賂'),
- (0xF949, 'M', u'雷'),
- (0xF94A, 'M', u'壘'),
- (0xF94B, 'M', u'屢'),
- (0xF94C, 'M', u'樓'),
- (0xF94D, 'M', u'淚'),
- (0xF94E, 'M', u'漏'),
+ (0xF9AE, "M", "瑩"),
+ (0xF9AF, "M", "羚"),
+ (0xF9B0, "M", "聆"),
+ (0xF9B1, "M", "鈴"),
+ (0xF9B2, "M", "零"),
+ (0xF9B3, "M", "靈"),
+ (0xF9B4, "M", "領"),
+ (0xF9B5, "M", "例"),
+ (0xF9B6, "M", "禮"),
+ (0xF9B7, "M", "醴"),
+ (0xF9B8, "M", "隸"),
+ (0xF9B9, "M", "惡"),
+ (0xF9BA, "M", "了"),
+ (0xF9BB, "M", "僚"),
+ (0xF9BC, "M", "寮"),
+ (0xF9BD, "M", "尿"),
+ (0xF9BE, "M", "料"),
+ (0xF9BF, "M", "樂"),
+ (0xF9C0, "M", "燎"),
+ (0xF9C1, "M", "療"),
+ (0xF9C2, "M", "蓼"),
+ (0xF9C3, "M", "遼"),
+ (0xF9C4, "M", "龍"),
+ (0xF9C5, "M", "暈"),
+ (0xF9C6, "M", "阮"),
+ (0xF9C7, "M", "劉"),
+ (0xF9C8, "M", "杻"),
+ (0xF9C9, "M", "柳"),
+ (0xF9CA, "M", "流"),
+ (0xF9CB, "M", "溜"),
+ (0xF9CC, "M", "琉"),
+ (0xF9CD, "M", "留"),
+ (0xF9CE, "M", "硫"),
+ (0xF9CF, "M", "紐"),
+ (0xF9D0, "M", "類"),
+ (0xF9D1, "M", "六"),
+ (0xF9D2, "M", "戮"),
+ (0xF9D3, "M", "陸"),
+ (0xF9D4, "M", "倫"),
+ (0xF9D5, "M", "崙"),
+ (0xF9D6, "M", "淪"),
+ (0xF9D7, "M", "輪"),
+ (0xF9D8, "M", "律"),
+ (0xF9D9, "M", "慄"),
+ (0xF9DA, "M", "栗"),
+ (0xF9DB, "M", "率"),
+ (0xF9DC, "M", "隆"),
+ (0xF9DD, "M", "利"),
+ (0xF9DE, "M", "吏"),
+ (0xF9DF, "M", "履"),
+ (0xF9E0, "M", "易"),
+ (0xF9E1, "M", "李"),
+ (0xF9E2, "M", "梨"),
+ (0xF9E3, "M", "泥"),
+ (0xF9E4, "M", "理"),
+ (0xF9E5, "M", "痢"),
+ (0xF9E6, "M", "罹"),
+ (0xF9E7, "M", "裏"),
+ (0xF9E8, "M", "裡"),
+ (0xF9E9, "M", "里"),
+ (0xF9EA, "M", "離"),
+ (0xF9EB, "M", "匿"),
+ (0xF9EC, "M", "溺"),
+ (0xF9ED, "M", "吝"),
+ (0xF9EE, "M", "燐"),
+ (0xF9EF, "M", "璘"),
+ (0xF9F0, "M", "藺"),
+ (0xF9F1, "M", "隣"),
+ (0xF9F2, "M", "鱗"),
+ (0xF9F3, "M", "麟"),
+ (0xF9F4, "M", "林"),
+ (0xF9F5, "M", "淋"),
+ (0xF9F6, "M", "臨"),
+ (0xF9F7, "M", "立"),
+ (0xF9F8, "M", "笠"),
+ (0xF9F9, "M", "粒"),
+ (0xF9FA, "M", "狀"),
+ (0xF9FB, "M", "炙"),
+ (0xF9FC, "M", "識"),
+ (0xF9FD, "M", "什"),
+ (0xF9FE, "M", "茶"),
+ (0xF9FF, "M", "刺"),
+ (0xFA00, "M", "切"),
+ (0xFA01, "M", "度"),
+ (0xFA02, "M", "拓"),
+ (0xFA03, "M", "糖"),
+ (0xFA04, "M", "宅"),
+ (0xFA05, "M", "洞"),
+ (0xFA06, "M", "暴"),
+ (0xFA07, "M", "輻"),
+ (0xFA08, "M", "行"),
+ (0xFA09, "M", "降"),
+ (0xFA0A, "M", "見"),
+ (0xFA0B, "M", "廓"),
+ (0xFA0C, "M", "兀"),
+ (0xFA0D, "M", "嗀"),
+ (0xFA0E, "V"),
+ (0xFA10, "M", "塚"),
+ (0xFA11, "V"),
+ (0xFA12, "M", "晴"),
]
-def _seg_40():
+
+def _seg_42() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0xF94F, 'M', u'累'),
- (0xF950, 'M', u'縷'),
- (0xF951, 'M', u'陋'),
- (0xF952, 'M', u'勒'),
- (0xF953, 'M', u'肋'),
- (0xF954, 'M', u'凜'),
- (0xF955, 'M', u'凌'),
- (0xF956, 'M', u'稜'),
- (0xF957, 'M', u'綾'),
- (0xF958, 'M', u'菱'),
- (0xF959, 'M', u'陵'),
- (0xF95A, 'M', u'讀'),
- (0xF95B, 'M', u'拏'),
- (0xF95C, 'M', u'樂'),
- (0xF95D, 'M', u'諾'),
- (0xF95E, 'M', u'丹'),
- (0xF95F, 'M', u'寧'),
- (0xF960, 'M', u'怒'),
- (0xF961, 'M', u'率'),
- (0xF962, 'M', u'異'),
- (0xF963, 'M', u'北'),
- (0xF964, 'M', u'磻'),
- (0xF965, 'M', u'便'),
- (0xF966, 'M', u'復'),
- (0xF967, 'M', u'不'),
- (0xF968, 'M', u'泌'),
- (0xF969, 'M', u'數'),
- (0xF96A, 'M', u'索'),
- (0xF96B, 'M', u'參'),
- (0xF96C, 'M', u'塞'),
- (0xF96D, 'M', u'省'),
- (0xF96E, 'M', u'葉'),
- (0xF96F, 'M', u'說'),
- (0xF970, 'M', u'殺'),
- (0xF971, 'M', u'辰'),
- (0xF972, 'M', u'沈'),
- (0xF973, 'M', u'拾'),
- (0xF974, 'M', u'若'),
- (0xF975, 'M', u'掠'),
- (0xF976, 'M', u'略'),
- (0xF977, 'M', u'亮'),
- (0xF978, 'M', u'兩'),
- (0xF979, 'M', u'凉'),
- (0xF97A, 'M', u'梁'),
- (0xF97B, 'M', u'糧'),
- (0xF97C, 'M', u'良'),
- (0xF97D, 'M', u'諒'),
- (0xF97E, 'M', u'量'),
- (0xF97F, 'M', u'勵'),
- (0xF980, 'M', u'呂'),
- (0xF981, 'M', u'女'),
- (0xF982, 'M', u'廬'),
- (0xF983, 'M', u'旅'),
- (0xF984, 'M', u'濾'),
- (0xF985, 'M', u'礪'),
- (0xF986, 'M', u'閭'),
- (0xF987, 'M', u'驪'),
- (0xF988, 'M', u'麗'),
- (0xF989, 'M', u'黎'),
- (0xF98A, 'M', u'力'),
- (0xF98B, 'M', u'曆'),
- (0xF98C, 'M', u'歷'),
- (0xF98D, 'M', u'轢'),
- (0xF98E, 'M', u'年'),
- (0xF98F, 'M', u'憐'),
- (0xF990, 'M', u'戀'),
- (0xF991, 'M', u'撚'),
- (0xF992, 'M', u'漣'),
- (0xF993, 'M', u'煉'),
- (0xF994, 'M', u'璉'),
- (0xF995, 'M', u'秊'),
- (0xF996, 'M', u'練'),
- (0xF997, 'M', u'聯'),
- (0xF998, 'M', u'輦'),
- (0xF999, 'M', u'蓮'),
- (0xF99A, 'M', u'連'),
- (0xF99B, 'M', u'鍊'),
- (0xF99C, 'M', u'列'),
- (0xF99D, 'M', u'劣'),
- (0xF99E, 'M', u'咽'),
- (0xF99F, 'M', u'烈'),
- (0xF9A0, 'M', u'裂'),
- (0xF9A1, 'M', u'說'),
- (0xF9A2, 'M', u'廉'),
- (0xF9A3, 'M', u'念'),
- (0xF9A4, 'M', u'捻'),
- (0xF9A5, 'M', u'殮'),
- (0xF9A6, 'M', u'簾'),
- (0xF9A7, 'M', u'獵'),
- (0xF9A8, 'M', u'令'),
- (0xF9A9, 'M', u'囹'),
- (0xF9AA, 'M', u'寧'),
- (0xF9AB, 'M', u'嶺'),
- (0xF9AC, 'M', u'怜'),
- (0xF9AD, 'M', u'玲'),
- (0xF9AE, 'M', u'瑩'),
- (0xF9AF, 'M', u'羚'),
- (0xF9B0, 'M', u'聆'),
- (0xF9B1, 'M', u'鈴'),
- (0xF9B2, 'M', u'零'),
+ (0xFA13, "V"),
+ (0xFA15, "M", "凞"),
+ (0xFA16, "M", "猪"),
+ (0xFA17, "M", "益"),
+ (0xFA18, "M", "礼"),
+ (0xFA19, "M", "神"),
+ (0xFA1A, "M", "祥"),
+ (0xFA1B, "M", "福"),
+ (0xFA1C, "M", "靖"),
+ (0xFA1D, "M", "精"),
+ (0xFA1E, "M", "羽"),
+ (0xFA1F, "V"),
+ (0xFA20, "M", "蘒"),
+ (0xFA21, "V"),
+ (0xFA22, "M", "諸"),
+ (0xFA23, "V"),
+ (0xFA25, "M", "逸"),
+ (0xFA26, "M", "都"),
+ (0xFA27, "V"),
+ (0xFA2A, "M", "飯"),
+ (0xFA2B, "M", "飼"),
+ (0xFA2C, "M", "館"),
+ (0xFA2D, "M", "鶴"),
+ (0xFA2E, "M", "郞"),
+ (0xFA2F, "M", "隷"),
+ (0xFA30, "M", "侮"),
+ (0xFA31, "M", "僧"),
+ (0xFA32, "M", "免"),
+ (0xFA33, "M", "勉"),
+ (0xFA34, "M", "勤"),
+ (0xFA35, "M", "卑"),
+ (0xFA36, "M", "喝"),
+ (0xFA37, "M", "嘆"),
+ (0xFA38, "M", "器"),
+ (0xFA39, "M", "塀"),
+ (0xFA3A, "M", "墨"),
+ (0xFA3B, "M", "層"),
+ (0xFA3C, "M", "屮"),
+ (0xFA3D, "M", "悔"),
+ (0xFA3E, "M", "慨"),
+ (0xFA3F, "M", "憎"),
+ (0xFA40, "M", "懲"),
+ (0xFA41, "M", "敏"),
+ (0xFA42, "M", "既"),
+ (0xFA43, "M", "暑"),
+ (0xFA44, "M", "梅"),
+ (0xFA45, "M", "海"),
+ (0xFA46, "M", "渚"),
+ (0xFA47, "M", "漢"),
+ (0xFA48, "M", "煮"),
+ (0xFA49, "M", "爫"),
+ (0xFA4A, "M", "琢"),
+ (0xFA4B, "M", "碑"),
+ (0xFA4C, "M", "社"),
+ (0xFA4D, "M", "祉"),
+ (0xFA4E, "M", "祈"),
+ (0xFA4F, "M", "祐"),
+ (0xFA50, "M", "祖"),
+ (0xFA51, "M", "祝"),
+ (0xFA52, "M", "禍"),
+ (0xFA53, "M", "禎"),
+ (0xFA54, "M", "穀"),
+ (0xFA55, "M", "突"),
+ (0xFA56, "M", "節"),
+ (0xFA57, "M", "練"),
+ (0xFA58, "M", "縉"),
+ (0xFA59, "M", "繁"),
+ (0xFA5A, "M", "署"),
+ (0xFA5B, "M", "者"),
+ (0xFA5C, "M", "臭"),
+ (0xFA5D, "M", "艹"),
+ (0xFA5F, "M", "著"),
+ (0xFA60, "M", "褐"),
+ (0xFA61, "M", "視"),
+ (0xFA62, "M", "謁"),
+ (0xFA63, "M", "謹"),
+ (0xFA64, "M", "賓"),
+ (0xFA65, "M", "贈"),
+ (0xFA66, "M", "辶"),
+ (0xFA67, "M", "逸"),
+ (0xFA68, "M", "難"),
+ (0xFA69, "M", "響"),
+ (0xFA6A, "M", "頻"),
+ (0xFA6B, "M", "恵"),
+ (0xFA6C, "M", "𤋮"),
+ (0xFA6D, "M", "舘"),
+ (0xFA6E, "X"),
+ (0xFA70, "M", "並"),
+ (0xFA71, "M", "况"),
+ (0xFA72, "M", "全"),
+ (0xFA73, "M", "侀"),
+ (0xFA74, "M", "充"),
+ (0xFA75, "M", "冀"),
+ (0xFA76, "M", "勇"),
+ (0xFA77, "M", "勺"),
+ (0xFA78, "M", "喝"),
+ (0xFA79, "M", "啕"),
+ (0xFA7A, "M", "喙"),
+ (0xFA7B, "M", "嗢"),
+ (0xFA7C, "M", "塚"),
]
-def _seg_41():
+
+def _seg_43() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0xF9B3, 'M', u'靈'),
- (0xF9B4, 'M', u'領'),
- (0xF9B5, 'M', u'例'),
- (0xF9B6, 'M', u'禮'),
- (0xF9B7, 'M', u'醴'),
- (0xF9B8, 'M', u'隸'),
- (0xF9B9, 'M', u'惡'),
- (0xF9BA, 'M', u'了'),
- (0xF9BB, 'M', u'僚'),
- (0xF9BC, 'M', u'寮'),
- (0xF9BD, 'M', u'尿'),
- (0xF9BE, 'M', u'料'),
- (0xF9BF, 'M', u'樂'),
- (0xF9C0, 'M', u'燎'),
- (0xF9C1, 'M', u'療'),
- (0xF9C2, 'M', u'蓼'),
- (0xF9C3, 'M', u'遼'),
- (0xF9C4, 'M', u'龍'),
- (0xF9C5, 'M', u'暈'),
- (0xF9C6, 'M', u'阮'),
- (0xF9C7, 'M', u'劉'),
- (0xF9C8, 'M', u'杻'),
- (0xF9C9, 'M', u'柳'),
- (0xF9CA, 'M', u'流'),
- (0xF9CB, 'M', u'溜'),
- (0xF9CC, 'M', u'琉'),
- (0xF9CD, 'M', u'留'),
- (0xF9CE, 'M', u'硫'),
- (0xF9CF, 'M', u'紐'),
- (0xF9D0, 'M', u'類'),
- (0xF9D1, 'M', u'六'),
- (0xF9D2, 'M', u'戮'),
- (0xF9D3, 'M', u'陸'),
- (0xF9D4, 'M', u'倫'),
- (0xF9D5, 'M', u'崙'),
- (0xF9D6, 'M', u'淪'),
- (0xF9D7, 'M', u'輪'),
- (0xF9D8, 'M', u'律'),
- (0xF9D9, 'M', u'慄'),
- (0xF9DA, 'M', u'栗'),
- (0xF9DB, 'M', u'率'),
- (0xF9DC, 'M', u'隆'),
- (0xF9DD, 'M', u'利'),
- (0xF9DE, 'M', u'吏'),
- (0xF9DF, 'M', u'履'),
- (0xF9E0, 'M', u'易'),
- (0xF9E1, 'M', u'李'),
- (0xF9E2, 'M', u'梨'),
- (0xF9E3, 'M', u'泥'),
- (0xF9E4, 'M', u'理'),
- (0xF9E5, 'M', u'痢'),
- (0xF9E6, 'M', u'罹'),
- (0xF9E7, 'M', u'裏'),
- (0xF9E8, 'M', u'裡'),
- (0xF9E9, 'M', u'里'),
- (0xF9EA, 'M', u'離'),
- (0xF9EB, 'M', u'匿'),
- (0xF9EC, 'M', u'溺'),
- (0xF9ED, 'M', u'吝'),
- (0xF9EE, 'M', u'燐'),
- (0xF9EF, 'M', u'璘'),
- (0xF9F0, 'M', u'藺'),
- (0xF9F1, 'M', u'隣'),
- (0xF9F2, 'M', u'鱗'),
- (0xF9F3, 'M', u'麟'),
- (0xF9F4, 'M', u'林'),
- (0xF9F5, 'M', u'淋'),
- (0xF9F6, 'M', u'臨'),
- (0xF9F7, 'M', u'立'),
- (0xF9F8, 'M', u'笠'),
- (0xF9F9, 'M', u'粒'),
- (0xF9FA, 'M', u'狀'),
- (0xF9FB, 'M', u'炙'),
- (0xF9FC, 'M', u'識'),
- (0xF9FD, 'M', u'什'),
- (0xF9FE, 'M', u'茶'),
- (0xF9FF, 'M', u'刺'),
- (0xFA00, 'M', u'切'),
- (0xFA01, 'M', u'度'),
- (0xFA02, 'M', u'拓'),
- (0xFA03, 'M', u'糖'),
- (0xFA04, 'M', u'宅'),
- (0xFA05, 'M', u'洞'),
- (0xFA06, 'M', u'暴'),
- (0xFA07, 'M', u'輻'),
- (0xFA08, 'M', u'行'),
- (0xFA09, 'M', u'降'),
- (0xFA0A, 'M', u'見'),
- (0xFA0B, 'M', u'廓'),
- (0xFA0C, 'M', u'兀'),
- (0xFA0D, 'M', u'嗀'),
- (0xFA0E, 'V'),
- (0xFA10, 'M', u'塚'),
- (0xFA11, 'V'),
- (0xFA12, 'M', u'晴'),
- (0xFA13, 'V'),
- (0xFA15, 'M', u'凞'),
- (0xFA16, 'M', u'猪'),
- (0xFA17, 'M', u'益'),
- (0xFA18, 'M', u'礼'),
+ (0xFA7D, "M", "墳"),
+ (0xFA7E, "M", "奄"),
+ (0xFA7F, "M", "奔"),
+ (0xFA80, "M", "婢"),
+ (0xFA81, "M", "嬨"),
+ (0xFA82, "M", "廒"),
+ (0xFA83, "M", "廙"),
+ (0xFA84, "M", "彩"),
+ (0xFA85, "M", "徭"),
+ (0xFA86, "M", "惘"),
+ (0xFA87, "M", "慎"),
+ (0xFA88, "M", "愈"),
+ (0xFA89, "M", "憎"),
+ (0xFA8A, "M", "慠"),
+ (0xFA8B, "M", "懲"),
+ (0xFA8C, "M", "戴"),
+ (0xFA8D, "M", "揄"),
+ (0xFA8E, "M", "搜"),
+ (0xFA8F, "M", "摒"),
+ (0xFA90, "M", "敖"),
+ (0xFA91, "M", "晴"),
+ (0xFA92, "M", "朗"),
+ (0xFA93, "M", "望"),
+ (0xFA94, "M", "杖"),
+ (0xFA95, "M", "歹"),
+ (0xFA96, "M", "殺"),
+ (0xFA97, "M", "流"),
+ (0xFA98, "M", "滛"),
+ (0xFA99, "M", "滋"),
+ (0xFA9A, "M", "漢"),
+ (0xFA9B, "M", "瀞"),
+ (0xFA9C, "M", "煮"),
+ (0xFA9D, "M", "瞧"),
+ (0xFA9E, "M", "爵"),
+ (0xFA9F, "M", "犯"),
+ (0xFAA0, "M", "猪"),
+ (0xFAA1, "M", "瑱"),
+ (0xFAA2, "M", "甆"),
+ (0xFAA3, "M", "画"),
+ (0xFAA4, "M", "瘝"),
+ (0xFAA5, "M", "瘟"),
+ (0xFAA6, "M", "益"),
+ (0xFAA7, "M", "盛"),
+ (0xFAA8, "M", "直"),
+ (0xFAA9, "M", "睊"),
+ (0xFAAA, "M", "着"),
+ (0xFAAB, "M", "磌"),
+ (0xFAAC, "M", "窱"),
+ (0xFAAD, "M", "節"),
+ (0xFAAE, "M", "类"),
+ (0xFAAF, "M", "絛"),
+ (0xFAB0, "M", "練"),
+ (0xFAB1, "M", "缾"),
+ (0xFAB2, "M", "者"),
+ (0xFAB3, "M", "荒"),
+ (0xFAB4, "M", "華"),
+ (0xFAB5, "M", "蝹"),
+ (0xFAB6, "M", "襁"),
+ (0xFAB7, "M", "覆"),
+ (0xFAB8, "M", "視"),
+ (0xFAB9, "M", "調"),
+ (0xFABA, "M", "諸"),
+ (0xFABB, "M", "請"),
+ (0xFABC, "M", "謁"),
+ (0xFABD, "M", "諾"),
+ (0xFABE, "M", "諭"),
+ (0xFABF, "M", "謹"),
+ (0xFAC0, "M", "變"),
+ (0xFAC1, "M", "贈"),
+ (0xFAC2, "M", "輸"),
+ (0xFAC3, "M", "遲"),
+ (0xFAC4, "M", "醙"),
+ (0xFAC5, "M", "鉶"),
+ (0xFAC6, "M", "陼"),
+ (0xFAC7, "M", "難"),
+ (0xFAC8, "M", "靖"),
+ (0xFAC9, "M", "韛"),
+ (0xFACA, "M", "響"),
+ (0xFACB, "M", "頋"),
+ (0xFACC, "M", "頻"),
+ (0xFACD, "M", "鬒"),
+ (0xFACE, "M", "龜"),
+ (0xFACF, "M", "𢡊"),
+ (0xFAD0, "M", "𢡄"),
+ (0xFAD1, "M", "𣏕"),
+ (0xFAD2, "M", "㮝"),
+ (0xFAD3, "M", "䀘"),
+ (0xFAD4, "M", "䀹"),
+ (0xFAD5, "M", "𥉉"),
+ (0xFAD6, "M", "𥳐"),
+ (0xFAD7, "M", "𧻓"),
+ (0xFAD8, "M", "齃"),
+ (0xFAD9, "M", "龎"),
+ (0xFADA, "X"),
+ (0xFB00, "M", "ff"),
+ (0xFB01, "M", "fi"),
+ (0xFB02, "M", "fl"),
+ (0xFB03, "M", "ffi"),
+ (0xFB04, "M", "ffl"),
+ (0xFB05, "M", "st"),
]
-def _seg_42():
+
+def _seg_44() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0xFA19, 'M', u'神'),
- (0xFA1A, 'M', u'祥'),
- (0xFA1B, 'M', u'福'),
- (0xFA1C, 'M', u'靖'),
- (0xFA1D, 'M', u'精'),
- (0xFA1E, 'M', u'羽'),
- (0xFA1F, 'V'),
- (0xFA20, 'M', u'蘒'),
- (0xFA21, 'V'),
- (0xFA22, 'M', u'諸'),
- (0xFA23, 'V'),
- (0xFA25, 'M', u'逸'),
- (0xFA26, 'M', u'都'),
- (0xFA27, 'V'),
- (0xFA2A, 'M', u'飯'),
- (0xFA2B, 'M', u'飼'),
- (0xFA2C, 'M', u'館'),
- (0xFA2D, 'M', u'鶴'),
- (0xFA2E, 'M', u'郞'),
- (0xFA2F, 'M', u'隷'),
- (0xFA30, 'M', u'侮'),
- (0xFA31, 'M', u'僧'),
- (0xFA32, 'M', u'免'),
- (0xFA33, 'M', u'勉'),
- (0xFA34, 'M', u'勤'),
- (0xFA35, 'M', u'卑'),
- (0xFA36, 'M', u'喝'),
- (0xFA37, 'M', u'嘆'),
- (0xFA38, 'M', u'器'),
- (0xFA39, 'M', u'塀'),
- (0xFA3A, 'M', u'墨'),
- (0xFA3B, 'M', u'層'),
- (0xFA3C, 'M', u'屮'),
- (0xFA3D, 'M', u'悔'),
- (0xFA3E, 'M', u'慨'),
- (0xFA3F, 'M', u'憎'),
- (0xFA40, 'M', u'懲'),
- (0xFA41, 'M', u'敏'),
- (0xFA42, 'M', u'既'),
- (0xFA43, 'M', u'暑'),
- (0xFA44, 'M', u'梅'),
- (0xFA45, 'M', u'海'),
- (0xFA46, 'M', u'渚'),
- (0xFA47, 'M', u'漢'),
- (0xFA48, 'M', u'煮'),
- (0xFA49, 'M', u'爫'),
- (0xFA4A, 'M', u'琢'),
- (0xFA4B, 'M', u'碑'),
- (0xFA4C, 'M', u'社'),
- (0xFA4D, 'M', u'祉'),
- (0xFA4E, 'M', u'祈'),
- (0xFA4F, 'M', u'祐'),
- (0xFA50, 'M', u'祖'),
- (0xFA51, 'M', u'祝'),
- (0xFA52, 'M', u'禍'),
- (0xFA53, 'M', u'禎'),
- (0xFA54, 'M', u'穀'),
- (0xFA55, 'M', u'突'),
- (0xFA56, 'M', u'節'),
- (0xFA57, 'M', u'練'),
- (0xFA58, 'M', u'縉'),
- (0xFA59, 'M', u'繁'),
- (0xFA5A, 'M', u'署'),
- (0xFA5B, 'M', u'者'),
- (0xFA5C, 'M', u'臭'),
- (0xFA5D, 'M', u'艹'),
- (0xFA5F, 'M', u'著'),
- (0xFA60, 'M', u'褐'),
- (0xFA61, 'M', u'視'),
- (0xFA62, 'M', u'謁'),
- (0xFA63, 'M', u'謹'),
- (0xFA64, 'M', u'賓'),
- (0xFA65, 'M', u'贈'),
- (0xFA66, 'M', u'辶'),
- (0xFA67, 'M', u'逸'),
- (0xFA68, 'M', u'難'),
- (0xFA69, 'M', u'響'),
- (0xFA6A, 'M', u'頻'),
- (0xFA6B, 'M', u'恵'),
- (0xFA6C, 'M', u'𤋮'),
- (0xFA6D, 'M', u'舘'),
- (0xFA6E, 'X'),
- (0xFA70, 'M', u'並'),
- (0xFA71, 'M', u'况'),
- (0xFA72, 'M', u'全'),
- (0xFA73, 'M', u'侀'),
- (0xFA74, 'M', u'充'),
- (0xFA75, 'M', u'冀'),
- (0xFA76, 'M', u'勇'),
- (0xFA77, 'M', u'勺'),
- (0xFA78, 'M', u'喝'),
- (0xFA79, 'M', u'啕'),
- (0xFA7A, 'M', u'喙'),
- (0xFA7B, 'M', u'嗢'),
- (0xFA7C, 'M', u'塚'),
- (0xFA7D, 'M', u'墳'),
- (0xFA7E, 'M', u'奄'),
- (0xFA7F, 'M', u'奔'),
- (0xFA80, 'M', u'婢'),
- (0xFA81, 'M', u'嬨'),
+ (0xFB07, "X"),
+ (0xFB13, "M", "մն"),
+ (0xFB14, "M", "մե"),
+ (0xFB15, "M", "մի"),
+ (0xFB16, "M", "վն"),
+ (0xFB17, "M", "մխ"),
+ (0xFB18, "X"),
+ (0xFB1D, "M", "יִ"),
+ (0xFB1E, "V"),
+ (0xFB1F, "M", "ײַ"),
+ (0xFB20, "M", "ע"),
+ (0xFB21, "M", "א"),
+ (0xFB22, "M", "ד"),
+ (0xFB23, "M", "ה"),
+ (0xFB24, "M", "כ"),
+ (0xFB25, "M", "ל"),
+ (0xFB26, "M", "ם"),
+ (0xFB27, "M", "ר"),
+ (0xFB28, "M", "ת"),
+ (0xFB29, "3", "+"),
+ (0xFB2A, "M", "שׁ"),
+ (0xFB2B, "M", "שׂ"),
+ (0xFB2C, "M", "שּׁ"),
+ (0xFB2D, "M", "שּׂ"),
+ (0xFB2E, "M", "אַ"),
+ (0xFB2F, "M", "אָ"),
+ (0xFB30, "M", "אּ"),
+ (0xFB31, "M", "בּ"),
+ (0xFB32, "M", "גּ"),
+ (0xFB33, "M", "דּ"),
+ (0xFB34, "M", "הּ"),
+ (0xFB35, "M", "וּ"),
+ (0xFB36, "M", "זּ"),
+ (0xFB37, "X"),
+ (0xFB38, "M", "טּ"),
+ (0xFB39, "M", "יּ"),
+ (0xFB3A, "M", "ךּ"),
+ (0xFB3B, "M", "כּ"),
+ (0xFB3C, "M", "לּ"),
+ (0xFB3D, "X"),
+ (0xFB3E, "M", "מּ"),
+ (0xFB3F, "X"),
+ (0xFB40, "M", "נּ"),
+ (0xFB41, "M", "סּ"),
+ (0xFB42, "X"),
+ (0xFB43, "M", "ףּ"),
+ (0xFB44, "M", "פּ"),
+ (0xFB45, "X"),
+ (0xFB46, "M", "צּ"),
+ (0xFB47, "M", "קּ"),
+ (0xFB48, "M", "רּ"),
+ (0xFB49, "M", "שּ"),
+ (0xFB4A, "M", "תּ"),
+ (0xFB4B, "M", "וֹ"),
+ (0xFB4C, "M", "בֿ"),
+ (0xFB4D, "M", "כֿ"),
+ (0xFB4E, "M", "פֿ"),
+ (0xFB4F, "M", "אל"),
+ (0xFB50, "M", "ٱ"),
+ (0xFB52, "M", "ٻ"),
+ (0xFB56, "M", "پ"),
+ (0xFB5A, "M", "ڀ"),
+ (0xFB5E, "M", "ٺ"),
+ (0xFB62, "M", "ٿ"),
+ (0xFB66, "M", "ٹ"),
+ (0xFB6A, "M", "ڤ"),
+ (0xFB6E, "M", "ڦ"),
+ (0xFB72, "M", "ڄ"),
+ (0xFB76, "M", "ڃ"),
+ (0xFB7A, "M", "چ"),
+ (0xFB7E, "M", "ڇ"),
+ (0xFB82, "M", "ڍ"),
+ (0xFB84, "M", "ڌ"),
+ (0xFB86, "M", "ڎ"),
+ (0xFB88, "M", "ڈ"),
+ (0xFB8A, "M", "ژ"),
+ (0xFB8C, "M", "ڑ"),
+ (0xFB8E, "M", "ک"),
+ (0xFB92, "M", "گ"),
+ (0xFB96, "M", "ڳ"),
+ (0xFB9A, "M", "ڱ"),
+ (0xFB9E, "M", "ں"),
+ (0xFBA0, "M", "ڻ"),
+ (0xFBA4, "M", "ۀ"),
+ (0xFBA6, "M", "ہ"),
+ (0xFBAA, "M", "ھ"),
+ (0xFBAE, "M", "ے"),
+ (0xFBB0, "M", "ۓ"),
+ (0xFBB2, "V"),
+ (0xFBC3, "X"),
+ (0xFBD3, "M", "ڭ"),
+ (0xFBD7, "M", "ۇ"),
+ (0xFBD9, "M", "ۆ"),
+ (0xFBDB, "M", "ۈ"),
+ (0xFBDD, "M", "ۇٴ"),
+ (0xFBDE, "M", "ۋ"),
+ (0xFBE0, "M", "ۅ"),
+ (0xFBE2, "M", "ۉ"),
+ (0xFBE4, "M", "ې"),
+ (0xFBE8, "M", "ى"),
]
-def _seg_43():
+
+def _seg_45() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0xFA82, 'M', u'廒'),
- (0xFA83, 'M', u'廙'),
- (0xFA84, 'M', u'彩'),
- (0xFA85, 'M', u'徭'),
- (0xFA86, 'M', u'惘'),
- (0xFA87, 'M', u'慎'),
- (0xFA88, 'M', u'愈'),
- (0xFA89, 'M', u'憎'),
- (0xFA8A, 'M', u'慠'),
- (0xFA8B, 'M', u'懲'),
- (0xFA8C, 'M', u'戴'),
- (0xFA8D, 'M', u'揄'),
- (0xFA8E, 'M', u'搜'),
- (0xFA8F, 'M', u'摒'),
- (0xFA90, 'M', u'敖'),
- (0xFA91, 'M', u'晴'),
- (0xFA92, 'M', u'朗'),
- (0xFA93, 'M', u'望'),
- (0xFA94, 'M', u'杖'),
- (0xFA95, 'M', u'歹'),
- (0xFA96, 'M', u'殺'),
- (0xFA97, 'M', u'流'),
- (0xFA98, 'M', u'滛'),
- (0xFA99, 'M', u'滋'),
- (0xFA9A, 'M', u'漢'),
- (0xFA9B, 'M', u'瀞'),
- (0xFA9C, 'M', u'煮'),
- (0xFA9D, 'M', u'瞧'),
- (0xFA9E, 'M', u'爵'),
- (0xFA9F, 'M', u'犯'),
- (0xFAA0, 'M', u'猪'),
- (0xFAA1, 'M', u'瑱'),
- (0xFAA2, 'M', u'甆'),
- (0xFAA3, 'M', u'画'),
- (0xFAA4, 'M', u'瘝'),
- (0xFAA5, 'M', u'瘟'),
- (0xFAA6, 'M', u'益'),
- (0xFAA7, 'M', u'盛'),
- (0xFAA8, 'M', u'直'),
- (0xFAA9, 'M', u'睊'),
- (0xFAAA, 'M', u'着'),
- (0xFAAB, 'M', u'磌'),
- (0xFAAC, 'M', u'窱'),
- (0xFAAD, 'M', u'節'),
- (0xFAAE, 'M', u'类'),
- (0xFAAF, 'M', u'絛'),
- (0xFAB0, 'M', u'練'),
- (0xFAB1, 'M', u'缾'),
- (0xFAB2, 'M', u'者'),
- (0xFAB3, 'M', u'荒'),
- (0xFAB4, 'M', u'華'),
- (0xFAB5, 'M', u'蝹'),
- (0xFAB6, 'M', u'襁'),
- (0xFAB7, 'M', u'覆'),
- (0xFAB8, 'M', u'視'),
- (0xFAB9, 'M', u'調'),
- (0xFABA, 'M', u'諸'),
- (0xFABB, 'M', u'請'),
- (0xFABC, 'M', u'謁'),
- (0xFABD, 'M', u'諾'),
- (0xFABE, 'M', u'諭'),
- (0xFABF, 'M', u'謹'),
- (0xFAC0, 'M', u'變'),
- (0xFAC1, 'M', u'贈'),
- (0xFAC2, 'M', u'輸'),
- (0xFAC3, 'M', u'遲'),
- (0xFAC4, 'M', u'醙'),
- (0xFAC5, 'M', u'鉶'),
- (0xFAC6, 'M', u'陼'),
- (0xFAC7, 'M', u'難'),
- (0xFAC8, 'M', u'靖'),
- (0xFAC9, 'M', u'韛'),
- (0xFACA, 'M', u'響'),
- (0xFACB, 'M', u'頋'),
- (0xFACC, 'M', u'頻'),
- (0xFACD, 'M', u'鬒'),
- (0xFACE, 'M', u'龜'),
- (0xFACF, 'M', u'𢡊'),
- (0xFAD0, 'M', u'𢡄'),
- (0xFAD1, 'M', u'𣏕'),
- (0xFAD2, 'M', u'㮝'),
- (0xFAD3, 'M', u'䀘'),
- (0xFAD4, 'M', u'䀹'),
- (0xFAD5, 'M', u'𥉉'),
- (0xFAD6, 'M', u'𥳐'),
- (0xFAD7, 'M', u'𧻓'),
- (0xFAD8, 'M', u'齃'),
- (0xFAD9, 'M', u'龎'),
- (0xFADA, 'X'),
- (0xFB00, 'M', u'ff'),
- (0xFB01, 'M', u'fi'),
- (0xFB02, 'M', u'fl'),
- (0xFB03, 'M', u'ffi'),
- (0xFB04, 'M', u'ffl'),
- (0xFB05, 'M', u'st'),
- (0xFB07, 'X'),
- (0xFB13, 'M', u'մն'),
- (0xFB14, 'M', u'մե'),
- (0xFB15, 'M', u'մի'),
- (0xFB16, 'M', u'վն'),
+ (0xFBEA, "M", "ئا"),
+ (0xFBEC, "M", "ئە"),
+ (0xFBEE, "M", "ئو"),
+ (0xFBF0, "M", "ئۇ"),
+ (0xFBF2, "M", "ئۆ"),
+ (0xFBF4, "M", "ئۈ"),
+ (0xFBF6, "M", "ئې"),
+ (0xFBF9, "M", "ئى"),
+ (0xFBFC, "M", "ی"),
+ (0xFC00, "M", "ئج"),
+ (0xFC01, "M", "ئح"),
+ (0xFC02, "M", "ئم"),
+ (0xFC03, "M", "ئى"),
+ (0xFC04, "M", "ئي"),
+ (0xFC05, "M", "بج"),
+ (0xFC06, "M", "بح"),
+ (0xFC07, "M", "بخ"),
+ (0xFC08, "M", "بم"),
+ (0xFC09, "M", "بى"),
+ (0xFC0A, "M", "بي"),
+ (0xFC0B, "M", "تج"),
+ (0xFC0C, "M", "تح"),
+ (0xFC0D, "M", "تخ"),
+ (0xFC0E, "M", "تم"),
+ (0xFC0F, "M", "تى"),
+ (0xFC10, "M", "تي"),
+ (0xFC11, "M", "ثج"),
+ (0xFC12, "M", "ثم"),
+ (0xFC13, "M", "ثى"),
+ (0xFC14, "M", "ثي"),
+ (0xFC15, "M", "جح"),
+ (0xFC16, "M", "جم"),
+ (0xFC17, "M", "حج"),
+ (0xFC18, "M", "حم"),
+ (0xFC19, "M", "خج"),
+ (0xFC1A, "M", "خح"),
+ (0xFC1B, "M", "خم"),
+ (0xFC1C, "M", "سج"),
+ (0xFC1D, "M", "سح"),
+ (0xFC1E, "M", "سخ"),
+ (0xFC1F, "M", "سم"),
+ (0xFC20, "M", "صح"),
+ (0xFC21, "M", "صم"),
+ (0xFC22, "M", "ضج"),
+ (0xFC23, "M", "ضح"),
+ (0xFC24, "M", "ضخ"),
+ (0xFC25, "M", "ضم"),
+ (0xFC26, "M", "طح"),
+ (0xFC27, "M", "طم"),
+ (0xFC28, "M", "ظم"),
+ (0xFC29, "M", "عج"),
+ (0xFC2A, "M", "عم"),
+ (0xFC2B, "M", "غج"),
+ (0xFC2C, "M", "غم"),
+ (0xFC2D, "M", "فج"),
+ (0xFC2E, "M", "فح"),
+ (0xFC2F, "M", "فخ"),
+ (0xFC30, "M", "فم"),
+ (0xFC31, "M", "فى"),
+ (0xFC32, "M", "في"),
+ (0xFC33, "M", "قح"),
+ (0xFC34, "M", "قم"),
+ (0xFC35, "M", "قى"),
+ (0xFC36, "M", "قي"),
+ (0xFC37, "M", "كا"),
+ (0xFC38, "M", "كج"),
+ (0xFC39, "M", "كح"),
+ (0xFC3A, "M", "كخ"),
+ (0xFC3B, "M", "كل"),
+ (0xFC3C, "M", "كم"),
+ (0xFC3D, "M", "كى"),
+ (0xFC3E, "M", "كي"),
+ (0xFC3F, "M", "لج"),
+ (0xFC40, "M", "لح"),
+ (0xFC41, "M", "لخ"),
+ (0xFC42, "M", "لم"),
+ (0xFC43, "M", "لى"),
+ (0xFC44, "M", "لي"),
+ (0xFC45, "M", "مج"),
+ (0xFC46, "M", "مح"),
+ (0xFC47, "M", "مخ"),
+ (0xFC48, "M", "مم"),
+ (0xFC49, "M", "مى"),
+ (0xFC4A, "M", "مي"),
+ (0xFC4B, "M", "نج"),
+ (0xFC4C, "M", "نح"),
+ (0xFC4D, "M", "نخ"),
+ (0xFC4E, "M", "نم"),
+ (0xFC4F, "M", "نى"),
+ (0xFC50, "M", "ني"),
+ (0xFC51, "M", "هج"),
+ (0xFC52, "M", "هم"),
+ (0xFC53, "M", "هى"),
+ (0xFC54, "M", "هي"),
+ (0xFC55, "M", "يج"),
+ (0xFC56, "M", "يح"),
+ (0xFC57, "M", "يخ"),
+ (0xFC58, "M", "يم"),
+ (0xFC59, "M", "يى"),
+ (0xFC5A, "M", "يي"),
]
-def _seg_44():
+
+def _seg_46() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0xFB17, 'M', u'մխ'),
- (0xFB18, 'X'),
- (0xFB1D, 'M', u'יִ'),
- (0xFB1E, 'V'),
- (0xFB1F, 'M', u'ײַ'),
- (0xFB20, 'M', u'ע'),
- (0xFB21, 'M', u'א'),
- (0xFB22, 'M', u'ד'),
- (0xFB23, 'M', u'ה'),
- (0xFB24, 'M', u'כ'),
- (0xFB25, 'M', u'ל'),
- (0xFB26, 'M', u'ם'),
- (0xFB27, 'M', u'ר'),
- (0xFB28, 'M', u'ת'),
- (0xFB29, '3', u'+'),
- (0xFB2A, 'M', u'שׁ'),
- (0xFB2B, 'M', u'שׂ'),
- (0xFB2C, 'M', u'שּׁ'),
- (0xFB2D, 'M', u'שּׂ'),
- (0xFB2E, 'M', u'אַ'),
- (0xFB2F, 'M', u'אָ'),
- (0xFB30, 'M', u'אּ'),
- (0xFB31, 'M', u'בּ'),
- (0xFB32, 'M', u'גּ'),
- (0xFB33, 'M', u'דּ'),
- (0xFB34, 'M', u'הּ'),
- (0xFB35, 'M', u'וּ'),
- (0xFB36, 'M', u'זּ'),
- (0xFB37, 'X'),
- (0xFB38, 'M', u'טּ'),
- (0xFB39, 'M', u'יּ'),
- (0xFB3A, 'M', u'ךּ'),
- (0xFB3B, 'M', u'כּ'),
- (0xFB3C, 'M', u'לּ'),
- (0xFB3D, 'X'),
- (0xFB3E, 'M', u'מּ'),
- (0xFB3F, 'X'),
- (0xFB40, 'M', u'נּ'),
- (0xFB41, 'M', u'סּ'),
- (0xFB42, 'X'),
- (0xFB43, 'M', u'ףּ'),
- (0xFB44, 'M', u'פּ'),
- (0xFB45, 'X'),
- (0xFB46, 'M', u'צּ'),
- (0xFB47, 'M', u'קּ'),
- (0xFB48, 'M', u'רּ'),
- (0xFB49, 'M', u'שּ'),
- (0xFB4A, 'M', u'תּ'),
- (0xFB4B, 'M', u'וֹ'),
- (0xFB4C, 'M', u'בֿ'),
- (0xFB4D, 'M', u'כֿ'),
- (0xFB4E, 'M', u'פֿ'),
- (0xFB4F, 'M', u'אל'),
- (0xFB50, 'M', u'ٱ'),
- (0xFB52, 'M', u'ٻ'),
- (0xFB56, 'M', u'پ'),
- (0xFB5A, 'M', u'ڀ'),
- (0xFB5E, 'M', u'ٺ'),
- (0xFB62, 'M', u'ٿ'),
- (0xFB66, 'M', u'ٹ'),
- (0xFB6A, 'M', u'ڤ'),
- (0xFB6E, 'M', u'ڦ'),
- (0xFB72, 'M', u'ڄ'),
- (0xFB76, 'M', u'ڃ'),
- (0xFB7A, 'M', u'چ'),
- (0xFB7E, 'M', u'ڇ'),
- (0xFB82, 'M', u'ڍ'),
- (0xFB84, 'M', u'ڌ'),
- (0xFB86, 'M', u'ڎ'),
- (0xFB88, 'M', u'ڈ'),
- (0xFB8A, 'M', u'ژ'),
- (0xFB8C, 'M', u'ڑ'),
- (0xFB8E, 'M', u'ک'),
- (0xFB92, 'M', u'گ'),
- (0xFB96, 'M', u'ڳ'),
- (0xFB9A, 'M', u'ڱ'),
- (0xFB9E, 'M', u'ں'),
- (0xFBA0, 'M', u'ڻ'),
- (0xFBA4, 'M', u'ۀ'),
- (0xFBA6, 'M', u'ہ'),
- (0xFBAA, 'M', u'ھ'),
- (0xFBAE, 'M', u'ے'),
- (0xFBB0, 'M', u'ۓ'),
- (0xFBB2, 'V'),
- (0xFBC2, 'X'),
- (0xFBD3, 'M', u'ڭ'),
- (0xFBD7, 'M', u'ۇ'),
- (0xFBD9, 'M', u'ۆ'),
- (0xFBDB, 'M', u'ۈ'),
- (0xFBDD, 'M', u'ۇٴ'),
- (0xFBDE, 'M', u'ۋ'),
- (0xFBE0, 'M', u'ۅ'),
- (0xFBE2, 'M', u'ۉ'),
- (0xFBE4, 'M', u'ې'),
- (0xFBE8, 'M', u'ى'),
- (0xFBEA, 'M', u'ئا'),
- (0xFBEC, 'M', u'ئە'),
- (0xFBEE, 'M', u'ئو'),
- (0xFBF0, 'M', u'ئۇ'),
- (0xFBF2, 'M', u'ئۆ'),
+ (0xFC5B, "M", "ذٰ"),
+ (0xFC5C, "M", "رٰ"),
+ (0xFC5D, "M", "ىٰ"),
+ (0xFC5E, "3", " ٌّ"),
+ (0xFC5F, "3", " ٍّ"),
+ (0xFC60, "3", " َّ"),
+ (0xFC61, "3", " ُّ"),
+ (0xFC62, "3", " ِّ"),
+ (0xFC63, "3", " ّٰ"),
+ (0xFC64, "M", "ئر"),
+ (0xFC65, "M", "ئز"),
+ (0xFC66, "M", "ئم"),
+ (0xFC67, "M", "ئن"),
+ (0xFC68, "M", "ئى"),
+ (0xFC69, "M", "ئي"),
+ (0xFC6A, "M", "بر"),
+ (0xFC6B, "M", "بز"),
+ (0xFC6C, "M", "بم"),
+ (0xFC6D, "M", "بن"),
+ (0xFC6E, "M", "بى"),
+ (0xFC6F, "M", "بي"),
+ (0xFC70, "M", "تر"),
+ (0xFC71, "M", "تز"),
+ (0xFC72, "M", "تم"),
+ (0xFC73, "M", "تن"),
+ (0xFC74, "M", "تى"),
+ (0xFC75, "M", "تي"),
+ (0xFC76, "M", "ثر"),
+ (0xFC77, "M", "ثز"),
+ (0xFC78, "M", "ثم"),
+ (0xFC79, "M", "ثن"),
+ (0xFC7A, "M", "ثى"),
+ (0xFC7B, "M", "ثي"),
+ (0xFC7C, "M", "فى"),
+ (0xFC7D, "M", "في"),
+ (0xFC7E, "M", "قى"),
+ (0xFC7F, "M", "قي"),
+ (0xFC80, "M", "كا"),
+ (0xFC81, "M", "كل"),
+ (0xFC82, "M", "كم"),
+ (0xFC83, "M", "كى"),
+ (0xFC84, "M", "كي"),
+ (0xFC85, "M", "لم"),
+ (0xFC86, "M", "لى"),
+ (0xFC87, "M", "لي"),
+ (0xFC88, "M", "ما"),
+ (0xFC89, "M", "مم"),
+ (0xFC8A, "M", "نر"),
+ (0xFC8B, "M", "نز"),
+ (0xFC8C, "M", "نم"),
+ (0xFC8D, "M", "نن"),
+ (0xFC8E, "M", "نى"),
+ (0xFC8F, "M", "ني"),
+ (0xFC90, "M", "ىٰ"),
+ (0xFC91, "M", "ير"),
+ (0xFC92, "M", "يز"),
+ (0xFC93, "M", "يم"),
+ (0xFC94, "M", "ين"),
+ (0xFC95, "M", "يى"),
+ (0xFC96, "M", "يي"),
+ (0xFC97, "M", "ئج"),
+ (0xFC98, "M", "ئح"),
+ (0xFC99, "M", "ئخ"),
+ (0xFC9A, "M", "ئم"),
+ (0xFC9B, "M", "ئه"),
+ (0xFC9C, "M", "بج"),
+ (0xFC9D, "M", "بح"),
+ (0xFC9E, "M", "بخ"),
+ (0xFC9F, "M", "بم"),
+ (0xFCA0, "M", "به"),
+ (0xFCA1, "M", "تج"),
+ (0xFCA2, "M", "تح"),
+ (0xFCA3, "M", "تخ"),
+ (0xFCA4, "M", "تم"),
+ (0xFCA5, "M", "ته"),
+ (0xFCA6, "M", "ثم"),
+ (0xFCA7, "M", "جح"),
+ (0xFCA8, "M", "جم"),
+ (0xFCA9, "M", "حج"),
+ (0xFCAA, "M", "حم"),
+ (0xFCAB, "M", "خج"),
+ (0xFCAC, "M", "خم"),
+ (0xFCAD, "M", "سج"),
+ (0xFCAE, "M", "سح"),
+ (0xFCAF, "M", "سخ"),
+ (0xFCB0, "M", "سم"),
+ (0xFCB1, "M", "صح"),
+ (0xFCB2, "M", "صخ"),
+ (0xFCB3, "M", "صم"),
+ (0xFCB4, "M", "ضج"),
+ (0xFCB5, "M", "ضح"),
+ (0xFCB6, "M", "ضخ"),
+ (0xFCB7, "M", "ضم"),
+ (0xFCB8, "M", "طح"),
+ (0xFCB9, "M", "ظم"),
+ (0xFCBA, "M", "عج"),
+ (0xFCBB, "M", "عم"),
+ (0xFCBC, "M", "غج"),
+ (0xFCBD, "M", "غم"),
+ (0xFCBE, "M", "فج"),
]
-def _seg_45():
+
+def _seg_47() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0xFBF4, 'M', u'ئۈ'),
- (0xFBF6, 'M', u'ئې'),
- (0xFBF9, 'M', u'ئى'),
- (0xFBFC, 'M', u'ی'),
- (0xFC00, 'M', u'ئج'),
- (0xFC01, 'M', u'ئح'),
- (0xFC02, 'M', u'ئم'),
- (0xFC03, 'M', u'ئى'),
- (0xFC04, 'M', u'ئي'),
- (0xFC05, 'M', u'بج'),
- (0xFC06, 'M', u'بح'),
- (0xFC07, 'M', u'بخ'),
- (0xFC08, 'M', u'بم'),
- (0xFC09, 'M', u'بى'),
- (0xFC0A, 'M', u'بي'),
- (0xFC0B, 'M', u'تج'),
- (0xFC0C, 'M', u'تح'),
- (0xFC0D, 'M', u'تخ'),
- (0xFC0E, 'M', u'تم'),
- (0xFC0F, 'M', u'تى'),
- (0xFC10, 'M', u'تي'),
- (0xFC11, 'M', u'ثج'),
- (0xFC12, 'M', u'ثم'),
- (0xFC13, 'M', u'ثى'),
- (0xFC14, 'M', u'ثي'),
- (0xFC15, 'M', u'جح'),
- (0xFC16, 'M', u'جم'),
- (0xFC17, 'M', u'حج'),
- (0xFC18, 'M', u'حم'),
- (0xFC19, 'M', u'خج'),
- (0xFC1A, 'M', u'خح'),
- (0xFC1B, 'M', u'خم'),
- (0xFC1C, 'M', u'سج'),
- (0xFC1D, 'M', u'سح'),
- (0xFC1E, 'M', u'سخ'),
- (0xFC1F, 'M', u'سم'),
- (0xFC20, 'M', u'صح'),
- (0xFC21, 'M', u'صم'),
- (0xFC22, 'M', u'ضج'),
- (0xFC23, 'M', u'ضح'),
- (0xFC24, 'M', u'ضخ'),
- (0xFC25, 'M', u'ضم'),
- (0xFC26, 'M', u'طح'),
- (0xFC27, 'M', u'طم'),
- (0xFC28, 'M', u'ظم'),
- (0xFC29, 'M', u'عج'),
- (0xFC2A, 'M', u'عم'),
- (0xFC2B, 'M', u'غج'),
- (0xFC2C, 'M', u'غم'),
- (0xFC2D, 'M', u'فج'),
- (0xFC2E, 'M', u'فح'),
- (0xFC2F, 'M', u'فخ'),
- (0xFC30, 'M', u'فم'),
- (0xFC31, 'M', u'فى'),
- (0xFC32, 'M', u'في'),
- (0xFC33, 'M', u'قح'),
- (0xFC34, 'M', u'قم'),
- (0xFC35, 'M', u'قى'),
- (0xFC36, 'M', u'قي'),
- (0xFC37, 'M', u'كا'),
- (0xFC38, 'M', u'كج'),
- (0xFC39, 'M', u'كح'),
- (0xFC3A, 'M', u'كخ'),
- (0xFC3B, 'M', u'كل'),
- (0xFC3C, 'M', u'كم'),
- (0xFC3D, 'M', u'كى'),
- (0xFC3E, 'M', u'كي'),
- (0xFC3F, 'M', u'لج'),
- (0xFC40, 'M', u'لح'),
- (0xFC41, 'M', u'لخ'),
- (0xFC42, 'M', u'لم'),
- (0xFC43, 'M', u'لى'),
- (0xFC44, 'M', u'لي'),
- (0xFC45, 'M', u'مج'),
- (0xFC46, 'M', u'مح'),
- (0xFC47, 'M', u'مخ'),
- (0xFC48, 'M', u'مم'),
- (0xFC49, 'M', u'مى'),
- (0xFC4A, 'M', u'مي'),
- (0xFC4B, 'M', u'نج'),
- (0xFC4C, 'M', u'نح'),
- (0xFC4D, 'M', u'نخ'),
- (0xFC4E, 'M', u'نم'),
- (0xFC4F, 'M', u'نى'),
- (0xFC50, 'M', u'ني'),
- (0xFC51, 'M', u'هج'),
- (0xFC52, 'M', u'هم'),
- (0xFC53, 'M', u'هى'),
- (0xFC54, 'M', u'هي'),
- (0xFC55, 'M', u'يج'),
- (0xFC56, 'M', u'يح'),
- (0xFC57, 'M', u'يخ'),
- (0xFC58, 'M', u'يم'),
- (0xFC59, 'M', u'يى'),
- (0xFC5A, 'M', u'يي'),
- (0xFC5B, 'M', u'ذٰ'),
- (0xFC5C, 'M', u'رٰ'),
- (0xFC5D, 'M', u'ىٰ'),
- (0xFC5E, '3', u' ٌّ'),
- (0xFC5F, '3', u' ٍّ'),
+ (0xFCBF, "M", "فح"),
+ (0xFCC0, "M", "فخ"),
+ (0xFCC1, "M", "فم"),
+ (0xFCC2, "M", "قح"),
+ (0xFCC3, "M", "قم"),
+ (0xFCC4, "M", "كج"),
+ (0xFCC5, "M", "كح"),
+ (0xFCC6, "M", "كخ"),
+ (0xFCC7, "M", "كل"),
+ (0xFCC8, "M", "كم"),
+ (0xFCC9, "M", "لج"),
+ (0xFCCA, "M", "لح"),
+ (0xFCCB, "M", "لخ"),
+ (0xFCCC, "M", "لم"),
+ (0xFCCD, "M", "له"),
+ (0xFCCE, "M", "مج"),
+ (0xFCCF, "M", "مح"),
+ (0xFCD0, "M", "مخ"),
+ (0xFCD1, "M", "مم"),
+ (0xFCD2, "M", "نج"),
+ (0xFCD3, "M", "نح"),
+ (0xFCD4, "M", "نخ"),
+ (0xFCD5, "M", "نم"),
+ (0xFCD6, "M", "نه"),
+ (0xFCD7, "M", "هج"),
+ (0xFCD8, "M", "هم"),
+ (0xFCD9, "M", "هٰ"),
+ (0xFCDA, "M", "يج"),
+ (0xFCDB, "M", "يح"),
+ (0xFCDC, "M", "يخ"),
+ (0xFCDD, "M", "يم"),
+ (0xFCDE, "M", "يه"),
+ (0xFCDF, "M", "ئم"),
+ (0xFCE0, "M", "ئه"),
+ (0xFCE1, "M", "بم"),
+ (0xFCE2, "M", "به"),
+ (0xFCE3, "M", "تم"),
+ (0xFCE4, "M", "ته"),
+ (0xFCE5, "M", "ثم"),
+ (0xFCE6, "M", "ثه"),
+ (0xFCE7, "M", "سم"),
+ (0xFCE8, "M", "سه"),
+ (0xFCE9, "M", "شم"),
+ (0xFCEA, "M", "شه"),
+ (0xFCEB, "M", "كل"),
+ (0xFCEC, "M", "كم"),
+ (0xFCED, "M", "لم"),
+ (0xFCEE, "M", "نم"),
+ (0xFCEF, "M", "نه"),
+ (0xFCF0, "M", "يم"),
+ (0xFCF1, "M", "يه"),
+ (0xFCF2, "M", "ـَّ"),
+ (0xFCF3, "M", "ـُّ"),
+ (0xFCF4, "M", "ـِّ"),
+ (0xFCF5, "M", "طى"),
+ (0xFCF6, "M", "طي"),
+ (0xFCF7, "M", "عى"),
+ (0xFCF8, "M", "عي"),
+ (0xFCF9, "M", "غى"),
+ (0xFCFA, "M", "غي"),
+ (0xFCFB, "M", "سى"),
+ (0xFCFC, "M", "سي"),
+ (0xFCFD, "M", "شى"),
+ (0xFCFE, "M", "شي"),
+ (0xFCFF, "M", "حى"),
+ (0xFD00, "M", "حي"),
+ (0xFD01, "M", "جى"),
+ (0xFD02, "M", "جي"),
+ (0xFD03, "M", "خى"),
+ (0xFD04, "M", "خي"),
+ (0xFD05, "M", "صى"),
+ (0xFD06, "M", "صي"),
+ (0xFD07, "M", "ضى"),
+ (0xFD08, "M", "ضي"),
+ (0xFD09, "M", "شج"),
+ (0xFD0A, "M", "شح"),
+ (0xFD0B, "M", "شخ"),
+ (0xFD0C, "M", "شم"),
+ (0xFD0D, "M", "شر"),
+ (0xFD0E, "M", "سر"),
+ (0xFD0F, "M", "صر"),
+ (0xFD10, "M", "ضر"),
+ (0xFD11, "M", "طى"),
+ (0xFD12, "M", "طي"),
+ (0xFD13, "M", "عى"),
+ (0xFD14, "M", "عي"),
+ (0xFD15, "M", "غى"),
+ (0xFD16, "M", "غي"),
+ (0xFD17, "M", "سى"),
+ (0xFD18, "M", "سي"),
+ (0xFD19, "M", "شى"),
+ (0xFD1A, "M", "شي"),
+ (0xFD1B, "M", "حى"),
+ (0xFD1C, "M", "حي"),
+ (0xFD1D, "M", "جى"),
+ (0xFD1E, "M", "جي"),
+ (0xFD1F, "M", "خى"),
+ (0xFD20, "M", "خي"),
+ (0xFD21, "M", "صى"),
+ (0xFD22, "M", "صي"),
]
-def _seg_46():
+
+def _seg_48() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0xFC60, '3', u' َّ'),
- (0xFC61, '3', u' ُّ'),
- (0xFC62, '3', u' ِّ'),
- (0xFC63, '3', u' ّٰ'),
- (0xFC64, 'M', u'ئر'),
- (0xFC65, 'M', u'ئز'),
- (0xFC66, 'M', u'ئم'),
- (0xFC67, 'M', u'ئن'),
- (0xFC68, 'M', u'ئى'),
- (0xFC69, 'M', u'ئي'),
- (0xFC6A, 'M', u'بر'),
- (0xFC6B, 'M', u'بز'),
- (0xFC6C, 'M', u'بم'),
- (0xFC6D, 'M', u'بن'),
- (0xFC6E, 'M', u'بى'),
- (0xFC6F, 'M', u'بي'),
- (0xFC70, 'M', u'تر'),
- (0xFC71, 'M', u'تز'),
- (0xFC72, 'M', u'تم'),
- (0xFC73, 'M', u'تن'),
- (0xFC74, 'M', u'تى'),
- (0xFC75, 'M', u'تي'),
- (0xFC76, 'M', u'ثر'),
- (0xFC77, 'M', u'ثز'),
- (0xFC78, 'M', u'ثم'),
- (0xFC79, 'M', u'ثن'),
- (0xFC7A, 'M', u'ثى'),
- (0xFC7B, 'M', u'ثي'),
- (0xFC7C, 'M', u'فى'),
- (0xFC7D, 'M', u'في'),
- (0xFC7E, 'M', u'قى'),
- (0xFC7F, 'M', u'قي'),
- (0xFC80, 'M', u'كا'),
- (0xFC81, 'M', u'كل'),
- (0xFC82, 'M', u'كم'),
- (0xFC83, 'M', u'كى'),
- (0xFC84, 'M', u'كي'),
- (0xFC85, 'M', u'لم'),
- (0xFC86, 'M', u'لى'),
- (0xFC87, 'M', u'لي'),
- (0xFC88, 'M', u'ما'),
- (0xFC89, 'M', u'مم'),
- (0xFC8A, 'M', u'نر'),
- (0xFC8B, 'M', u'نز'),
- (0xFC8C, 'M', u'نم'),
- (0xFC8D, 'M', u'نن'),
- (0xFC8E, 'M', u'نى'),
- (0xFC8F, 'M', u'ني'),
- (0xFC90, 'M', u'ىٰ'),
- (0xFC91, 'M', u'ير'),
- (0xFC92, 'M', u'يز'),
- (0xFC93, 'M', u'يم'),
- (0xFC94, 'M', u'ين'),
- (0xFC95, 'M', u'يى'),
- (0xFC96, 'M', u'يي'),
- (0xFC97, 'M', u'ئج'),
- (0xFC98, 'M', u'ئح'),
- (0xFC99, 'M', u'ئخ'),
- (0xFC9A, 'M', u'ئم'),
- (0xFC9B, 'M', u'ئه'),
- (0xFC9C, 'M', u'بج'),
- (0xFC9D, 'M', u'بح'),
- (0xFC9E, 'M', u'بخ'),
- (0xFC9F, 'M', u'بم'),
- (0xFCA0, 'M', u'به'),
- (0xFCA1, 'M', u'تج'),
- (0xFCA2, 'M', u'تح'),
- (0xFCA3, 'M', u'تخ'),
- (0xFCA4, 'M', u'تم'),
- (0xFCA5, 'M', u'ته'),
- (0xFCA6, 'M', u'ثم'),
- (0xFCA7, 'M', u'جح'),
- (0xFCA8, 'M', u'جم'),
- (0xFCA9, 'M', u'حج'),
- (0xFCAA, 'M', u'حم'),
- (0xFCAB, 'M', u'خج'),
- (0xFCAC, 'M', u'خم'),
- (0xFCAD, 'M', u'سج'),
- (0xFCAE, 'M', u'سح'),
- (0xFCAF, 'M', u'سخ'),
- (0xFCB0, 'M', u'سم'),
- (0xFCB1, 'M', u'صح'),
- (0xFCB2, 'M', u'صخ'),
- (0xFCB3, 'M', u'صم'),
- (0xFCB4, 'M', u'ضج'),
- (0xFCB5, 'M', u'ضح'),
- (0xFCB6, 'M', u'ضخ'),
- (0xFCB7, 'M', u'ضم'),
- (0xFCB8, 'M', u'طح'),
- (0xFCB9, 'M', u'ظم'),
- (0xFCBA, 'M', u'عج'),
- (0xFCBB, 'M', u'عم'),
- (0xFCBC, 'M', u'غج'),
- (0xFCBD, 'M', u'غم'),
- (0xFCBE, 'M', u'فج'),
- (0xFCBF, 'M', u'فح'),
- (0xFCC0, 'M', u'فخ'),
- (0xFCC1, 'M', u'فم'),
- (0xFCC2, 'M', u'قح'),
- (0xFCC3, 'M', u'قم'),
+ (0xFD23, "M", "ضى"),
+ (0xFD24, "M", "ضي"),
+ (0xFD25, "M", "شج"),
+ (0xFD26, "M", "شح"),
+ (0xFD27, "M", "شخ"),
+ (0xFD28, "M", "شم"),
+ (0xFD29, "M", "شر"),
+ (0xFD2A, "M", "سر"),
+ (0xFD2B, "M", "صر"),
+ (0xFD2C, "M", "ضر"),
+ (0xFD2D, "M", "شج"),
+ (0xFD2E, "M", "شح"),
+ (0xFD2F, "M", "شخ"),
+ (0xFD30, "M", "شم"),
+ (0xFD31, "M", "سه"),
+ (0xFD32, "M", "شه"),
+ (0xFD33, "M", "طم"),
+ (0xFD34, "M", "سج"),
+ (0xFD35, "M", "سح"),
+ (0xFD36, "M", "سخ"),
+ (0xFD37, "M", "شج"),
+ (0xFD38, "M", "شح"),
+ (0xFD39, "M", "شخ"),
+ (0xFD3A, "M", "طم"),
+ (0xFD3B, "M", "ظم"),
+ (0xFD3C, "M", "اً"),
+ (0xFD3E, "V"),
+ (0xFD50, "M", "تجم"),
+ (0xFD51, "M", "تحج"),
+ (0xFD53, "M", "تحم"),
+ (0xFD54, "M", "تخم"),
+ (0xFD55, "M", "تمج"),
+ (0xFD56, "M", "تمح"),
+ (0xFD57, "M", "تمخ"),
+ (0xFD58, "M", "جمح"),
+ (0xFD5A, "M", "حمي"),
+ (0xFD5B, "M", "حمى"),
+ (0xFD5C, "M", "سحج"),
+ (0xFD5D, "M", "سجح"),
+ (0xFD5E, "M", "سجى"),
+ (0xFD5F, "M", "سمح"),
+ (0xFD61, "M", "سمج"),
+ (0xFD62, "M", "سمم"),
+ (0xFD64, "M", "صحح"),
+ (0xFD66, "M", "صمم"),
+ (0xFD67, "M", "شحم"),
+ (0xFD69, "M", "شجي"),
+ (0xFD6A, "M", "شمخ"),
+ (0xFD6C, "M", "شمم"),
+ (0xFD6E, "M", "ضحى"),
+ (0xFD6F, "M", "ضخم"),
+ (0xFD71, "M", "طمح"),
+ (0xFD73, "M", "طمم"),
+ (0xFD74, "M", "طمي"),
+ (0xFD75, "M", "عجم"),
+ (0xFD76, "M", "عمم"),
+ (0xFD78, "M", "عمى"),
+ (0xFD79, "M", "غمم"),
+ (0xFD7A, "M", "غمي"),
+ (0xFD7B, "M", "غمى"),
+ (0xFD7C, "M", "فخم"),
+ (0xFD7E, "M", "قمح"),
+ (0xFD7F, "M", "قمم"),
+ (0xFD80, "M", "لحم"),
+ (0xFD81, "M", "لحي"),
+ (0xFD82, "M", "لحى"),
+ (0xFD83, "M", "لجج"),
+ (0xFD85, "M", "لخم"),
+ (0xFD87, "M", "لمح"),
+ (0xFD89, "M", "محج"),
+ (0xFD8A, "M", "محم"),
+ (0xFD8B, "M", "محي"),
+ (0xFD8C, "M", "مجح"),
+ (0xFD8D, "M", "مجم"),
+ (0xFD8E, "M", "مخج"),
+ (0xFD8F, "M", "مخم"),
+ (0xFD90, "X"),
+ (0xFD92, "M", "مجخ"),
+ (0xFD93, "M", "همج"),
+ (0xFD94, "M", "همم"),
+ (0xFD95, "M", "نحم"),
+ (0xFD96, "M", "نحى"),
+ (0xFD97, "M", "نجم"),
+ (0xFD99, "M", "نجى"),
+ (0xFD9A, "M", "نمي"),
+ (0xFD9B, "M", "نمى"),
+ (0xFD9C, "M", "يمم"),
+ (0xFD9E, "M", "بخي"),
+ (0xFD9F, "M", "تجي"),
+ (0xFDA0, "M", "تجى"),
+ (0xFDA1, "M", "تخي"),
+ (0xFDA2, "M", "تخى"),
+ (0xFDA3, "M", "تمي"),
+ (0xFDA4, "M", "تمى"),
+ (0xFDA5, "M", "جمي"),
+ (0xFDA6, "M", "جحى"),
+ (0xFDA7, "M", "جمى"),
+ (0xFDA8, "M", "سخى"),
+ (0xFDA9, "M", "صحي"),
+ (0xFDAA, "M", "شحي"),
]
-def _seg_47():
+
+def _seg_49() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0xFCC4, 'M', u'كج'),
- (0xFCC5, 'M', u'كح'),
- (0xFCC6, 'M', u'كخ'),
- (0xFCC7, 'M', u'كل'),
- (0xFCC8, 'M', u'كم'),
- (0xFCC9, 'M', u'لج'),
- (0xFCCA, 'M', u'لح'),
- (0xFCCB, 'M', u'لخ'),
- (0xFCCC, 'M', u'لم'),
- (0xFCCD, 'M', u'له'),
- (0xFCCE, 'M', u'مج'),
- (0xFCCF, 'M', u'مح'),
- (0xFCD0, 'M', u'مخ'),
- (0xFCD1, 'M', u'مم'),
- (0xFCD2, 'M', u'نج'),
- (0xFCD3, 'M', u'نح'),
- (0xFCD4, 'M', u'نخ'),
- (0xFCD5, 'M', u'نم'),
- (0xFCD6, 'M', u'نه'),
- (0xFCD7, 'M', u'هج'),
- (0xFCD8, 'M', u'هم'),
- (0xFCD9, 'M', u'هٰ'),
- (0xFCDA, 'M', u'يج'),
- (0xFCDB, 'M', u'يح'),
- (0xFCDC, 'M', u'يخ'),
- (0xFCDD, 'M', u'يم'),
- (0xFCDE, 'M', u'يه'),
- (0xFCDF, 'M', u'ئم'),
- (0xFCE0, 'M', u'ئه'),
- (0xFCE1, 'M', u'بم'),
- (0xFCE2, 'M', u'به'),
- (0xFCE3, 'M', u'تم'),
- (0xFCE4, 'M', u'ته'),
- (0xFCE5, 'M', u'ثم'),
- (0xFCE6, 'M', u'ثه'),
- (0xFCE7, 'M', u'سم'),
- (0xFCE8, 'M', u'سه'),
- (0xFCE9, 'M', u'شم'),
- (0xFCEA, 'M', u'شه'),
- (0xFCEB, 'M', u'كل'),
- (0xFCEC, 'M', u'كم'),
- (0xFCED, 'M', u'لم'),
- (0xFCEE, 'M', u'نم'),
- (0xFCEF, 'M', u'نه'),
- (0xFCF0, 'M', u'يم'),
- (0xFCF1, 'M', u'يه'),
- (0xFCF2, 'M', u'ـَّ'),
- (0xFCF3, 'M', u'ـُّ'),
- (0xFCF4, 'M', u'ـِّ'),
- (0xFCF5, 'M', u'طى'),
- (0xFCF6, 'M', u'طي'),
- (0xFCF7, 'M', u'عى'),
- (0xFCF8, 'M', u'عي'),
- (0xFCF9, 'M', u'غى'),
- (0xFCFA, 'M', u'غي'),
- (0xFCFB, 'M', u'سى'),
- (0xFCFC, 'M', u'سي'),
- (0xFCFD, 'M', u'شى'),
- (0xFCFE, 'M', u'شي'),
- (0xFCFF, 'M', u'حى'),
- (0xFD00, 'M', u'حي'),
- (0xFD01, 'M', u'جى'),
- (0xFD02, 'M', u'جي'),
- (0xFD03, 'M', u'خى'),
- (0xFD04, 'M', u'خي'),
- (0xFD05, 'M', u'صى'),
- (0xFD06, 'M', u'صي'),
- (0xFD07, 'M', u'ضى'),
- (0xFD08, 'M', u'ضي'),
- (0xFD09, 'M', u'شج'),
- (0xFD0A, 'M', u'شح'),
- (0xFD0B, 'M', u'شخ'),
- (0xFD0C, 'M', u'شم'),
- (0xFD0D, 'M', u'شر'),
- (0xFD0E, 'M', u'سر'),
- (0xFD0F, 'M', u'صر'),
- (0xFD10, 'M', u'ضر'),
- (0xFD11, 'M', u'طى'),
- (0xFD12, 'M', u'طي'),
- (0xFD13, 'M', u'عى'),
- (0xFD14, 'M', u'عي'),
- (0xFD15, 'M', u'غى'),
- (0xFD16, 'M', u'غي'),
- (0xFD17, 'M', u'سى'),
- (0xFD18, 'M', u'سي'),
- (0xFD19, 'M', u'شى'),
- (0xFD1A, 'M', u'شي'),
- (0xFD1B, 'M', u'حى'),
- (0xFD1C, 'M', u'حي'),
- (0xFD1D, 'M', u'جى'),
- (0xFD1E, 'M', u'جي'),
- (0xFD1F, 'M', u'خى'),
- (0xFD20, 'M', u'خي'),
- (0xFD21, 'M', u'صى'),
- (0xFD22, 'M', u'صي'),
- (0xFD23, 'M', u'ضى'),
- (0xFD24, 'M', u'ضي'),
- (0xFD25, 'M', u'شج'),
- (0xFD26, 'M', u'شح'),
- (0xFD27, 'M', u'شخ'),
+ (0xFDAB, "M", "ضحي"),
+ (0xFDAC, "M", "لجي"),
+ (0xFDAD, "M", "لمي"),
+ (0xFDAE, "M", "يحي"),
+ (0xFDAF, "M", "يجي"),
+ (0xFDB0, "M", "يمي"),
+ (0xFDB1, "M", "ممي"),
+ (0xFDB2, "M", "قمي"),
+ (0xFDB3, "M", "نحي"),
+ (0xFDB4, "M", "قمح"),
+ (0xFDB5, "M", "لحم"),
+ (0xFDB6, "M", "عمي"),
+ (0xFDB7, "M", "كمي"),
+ (0xFDB8, "M", "نجح"),
+ (0xFDB9, "M", "مخي"),
+ (0xFDBA, "M", "لجم"),
+ (0xFDBB, "M", "كمم"),
+ (0xFDBC, "M", "لجم"),
+ (0xFDBD, "M", "نجح"),
+ (0xFDBE, "M", "جحي"),
+ (0xFDBF, "M", "حجي"),
+ (0xFDC0, "M", "مجي"),
+ (0xFDC1, "M", "فمي"),
+ (0xFDC2, "M", "بحي"),
+ (0xFDC3, "M", "كمم"),
+ (0xFDC4, "M", "عجم"),
+ (0xFDC5, "M", "صمم"),
+ (0xFDC6, "M", "سخي"),
+ (0xFDC7, "M", "نجي"),
+ (0xFDC8, "X"),
+ (0xFDCF, "V"),
+ (0xFDD0, "X"),
+ (0xFDF0, "M", "صلے"),
+ (0xFDF1, "M", "قلے"),
+ (0xFDF2, "M", "الله"),
+ (0xFDF3, "M", "اكبر"),
+ (0xFDF4, "M", "محمد"),
+ (0xFDF5, "M", "صلعم"),
+ (0xFDF6, "M", "رسول"),
+ (0xFDF7, "M", "عليه"),
+ (0xFDF8, "M", "وسلم"),
+ (0xFDF9, "M", "صلى"),
+ (0xFDFA, "3", "صلى الله عليه وسلم"),
+ (0xFDFB, "3", "جل جلاله"),
+ (0xFDFC, "M", "ریال"),
+ (0xFDFD, "V"),
+ (0xFE00, "I"),
+ (0xFE10, "3", ","),
+ (0xFE11, "M", "、"),
+ (0xFE12, "X"),
+ (0xFE13, "3", ":"),
+ (0xFE14, "3", ";"),
+ (0xFE15, "3", "!"),
+ (0xFE16, "3", "?"),
+ (0xFE17, "M", "〖"),
+ (0xFE18, "M", "〗"),
+ (0xFE19, "X"),
+ (0xFE20, "V"),
+ (0xFE30, "X"),
+ (0xFE31, "M", "—"),
+ (0xFE32, "M", "–"),
+ (0xFE33, "3", "_"),
+ (0xFE35, "3", "("),
+ (0xFE36, "3", ")"),
+ (0xFE37, "3", "{"),
+ (0xFE38, "3", "}"),
+ (0xFE39, "M", "〔"),
+ (0xFE3A, "M", "〕"),
+ (0xFE3B, "M", "【"),
+ (0xFE3C, "M", "】"),
+ (0xFE3D, "M", "《"),
+ (0xFE3E, "M", "》"),
+ (0xFE3F, "M", "〈"),
+ (0xFE40, "M", "〉"),
+ (0xFE41, "M", "「"),
+ (0xFE42, "M", "」"),
+ (0xFE43, "M", "『"),
+ (0xFE44, "M", "』"),
+ (0xFE45, "V"),
+ (0xFE47, "3", "["),
+ (0xFE48, "3", "]"),
+ (0xFE49, "3", " ̅"),
+ (0xFE4D, "3", "_"),
+ (0xFE50, "3", ","),
+ (0xFE51, "M", "、"),
+ (0xFE52, "X"),
+ (0xFE54, "3", ";"),
+ (0xFE55, "3", ":"),
+ (0xFE56, "3", "?"),
+ (0xFE57, "3", "!"),
+ (0xFE58, "M", "—"),
+ (0xFE59, "3", "("),
+ (0xFE5A, "3", ")"),
+ (0xFE5B, "3", "{"),
+ (0xFE5C, "3", "}"),
+ (0xFE5D, "M", "〔"),
+ (0xFE5E, "M", "〕"),
+ (0xFE5F, "3", "#"),
+ (0xFE60, "3", "&"),
+ (0xFE61, "3", "*"),
]
-def _seg_48():
+
+def _seg_50() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0xFD28, 'M', u'شم'),
- (0xFD29, 'M', u'شر'),
- (0xFD2A, 'M', u'سر'),
- (0xFD2B, 'M', u'صر'),
- (0xFD2C, 'M', u'ضر'),
- (0xFD2D, 'M', u'شج'),
- (0xFD2E, 'M', u'شح'),
- (0xFD2F, 'M', u'شخ'),
- (0xFD30, 'M', u'شم'),
- (0xFD31, 'M', u'سه'),
- (0xFD32, 'M', u'شه'),
- (0xFD33, 'M', u'طم'),
- (0xFD34, 'M', u'سج'),
- (0xFD35, 'M', u'سح'),
- (0xFD36, 'M', u'سخ'),
- (0xFD37, 'M', u'شج'),
- (0xFD38, 'M', u'شح'),
- (0xFD39, 'M', u'شخ'),
- (0xFD3A, 'M', u'طم'),
- (0xFD3B, 'M', u'ظم'),
- (0xFD3C, 'M', u'اً'),
- (0xFD3E, 'V'),
- (0xFD40, 'X'),
- (0xFD50, 'M', u'تجم'),
- (0xFD51, 'M', u'تحج'),
- (0xFD53, 'M', u'تحم'),
- (0xFD54, 'M', u'تخم'),
- (0xFD55, 'M', u'تمج'),
- (0xFD56, 'M', u'تمح'),
- (0xFD57, 'M', u'تمخ'),
- (0xFD58, 'M', u'جمح'),
- (0xFD5A, 'M', u'حمي'),
- (0xFD5B, 'M', u'حمى'),
- (0xFD5C, 'M', u'سحج'),
- (0xFD5D, 'M', u'سجح'),
- (0xFD5E, 'M', u'سجى'),
- (0xFD5F, 'M', u'سمح'),
- (0xFD61, 'M', u'سمج'),
- (0xFD62, 'M', u'سمم'),
- (0xFD64, 'M', u'صحح'),
- (0xFD66, 'M', u'صمم'),
- (0xFD67, 'M', u'شحم'),
- (0xFD69, 'M', u'شجي'),
- (0xFD6A, 'M', u'شمخ'),
- (0xFD6C, 'M', u'شمم'),
- (0xFD6E, 'M', u'ضحى'),
- (0xFD6F, 'M', u'ضخم'),
- (0xFD71, 'M', u'طمح'),
- (0xFD73, 'M', u'طمم'),
- (0xFD74, 'M', u'طمي'),
- (0xFD75, 'M', u'عجم'),
- (0xFD76, 'M', u'عمم'),
- (0xFD78, 'M', u'عمى'),
- (0xFD79, 'M', u'غمم'),
- (0xFD7A, 'M', u'غمي'),
- (0xFD7B, 'M', u'غمى'),
- (0xFD7C, 'M', u'فخم'),
- (0xFD7E, 'M', u'قمح'),
- (0xFD7F, 'M', u'قمم'),
- (0xFD80, 'M', u'لحم'),
- (0xFD81, 'M', u'لحي'),
- (0xFD82, 'M', u'لحى'),
- (0xFD83, 'M', u'لجج'),
- (0xFD85, 'M', u'لخم'),
- (0xFD87, 'M', u'لمح'),
- (0xFD89, 'M', u'محج'),
- (0xFD8A, 'M', u'محم'),
- (0xFD8B, 'M', u'محي'),
- (0xFD8C, 'M', u'مجح'),
- (0xFD8D, 'M', u'مجم'),
- (0xFD8E, 'M', u'مخج'),
- (0xFD8F, 'M', u'مخم'),
- (0xFD90, 'X'),
- (0xFD92, 'M', u'مجخ'),
- (0xFD93, 'M', u'همج'),
- (0xFD94, 'M', u'همم'),
- (0xFD95, 'M', u'نحم'),
- (0xFD96, 'M', u'نحى'),
- (0xFD97, 'M', u'نجم'),
- (0xFD99, 'M', u'نجى'),
- (0xFD9A, 'M', u'نمي'),
- (0xFD9B, 'M', u'نمى'),
- (0xFD9C, 'M', u'يمم'),
- (0xFD9E, 'M', u'بخي'),
- (0xFD9F, 'M', u'تجي'),
- (0xFDA0, 'M', u'تجى'),
- (0xFDA1, 'M', u'تخي'),
- (0xFDA2, 'M', u'تخى'),
- (0xFDA3, 'M', u'تمي'),
- (0xFDA4, 'M', u'تمى'),
- (0xFDA5, 'M', u'جمي'),
- (0xFDA6, 'M', u'جحى'),
- (0xFDA7, 'M', u'جمى'),
- (0xFDA8, 'M', u'سخى'),
- (0xFDA9, 'M', u'صحي'),
- (0xFDAA, 'M', u'شحي'),
- (0xFDAB, 'M', u'ضحي'),
- (0xFDAC, 'M', u'لجي'),
- (0xFDAD, 'M', u'لمي'),
- (0xFDAE, 'M', u'يحي'),
+ (0xFE62, "3", "+"),
+ (0xFE63, "M", "-"),
+ (0xFE64, "3", "<"),
+ (0xFE65, "3", ">"),
+ (0xFE66, "3", "="),
+ (0xFE67, "X"),
+ (0xFE68, "3", "\\"),
+ (0xFE69, "3", "$"),
+ (0xFE6A, "3", "%"),
+ (0xFE6B, "3", "@"),
+ (0xFE6C, "X"),
+ (0xFE70, "3", " ً"),
+ (0xFE71, "M", "ـً"),
+ (0xFE72, "3", " ٌ"),
+ (0xFE73, "V"),
+ (0xFE74, "3", " ٍ"),
+ (0xFE75, "X"),
+ (0xFE76, "3", " َ"),
+ (0xFE77, "M", "ـَ"),
+ (0xFE78, "3", " ُ"),
+ (0xFE79, "M", "ـُ"),
+ (0xFE7A, "3", " ِ"),
+ (0xFE7B, "M", "ـِ"),
+ (0xFE7C, "3", " ّ"),
+ (0xFE7D, "M", "ـّ"),
+ (0xFE7E, "3", " ْ"),
+ (0xFE7F, "M", "ـْ"),
+ (0xFE80, "M", "ء"),
+ (0xFE81, "M", "آ"),
+ (0xFE83, "M", "أ"),
+ (0xFE85, "M", "ؤ"),
+ (0xFE87, "M", "إ"),
+ (0xFE89, "M", "ئ"),
+ (0xFE8D, "M", "ا"),
+ (0xFE8F, "M", "ب"),
+ (0xFE93, "M", "ة"),
+ (0xFE95, "M", "ت"),
+ (0xFE99, "M", "ث"),
+ (0xFE9D, "M", "ج"),
+ (0xFEA1, "M", "ح"),
+ (0xFEA5, "M", "خ"),
+ (0xFEA9, "M", "د"),
+ (0xFEAB, "M", "ذ"),
+ (0xFEAD, "M", "ر"),
+ (0xFEAF, "M", "ز"),
+ (0xFEB1, "M", "س"),
+ (0xFEB5, "M", "ش"),
+ (0xFEB9, "M", "ص"),
+ (0xFEBD, "M", "ض"),
+ (0xFEC1, "M", "ط"),
+ (0xFEC5, "M", "ظ"),
+ (0xFEC9, "M", "ع"),
+ (0xFECD, "M", "غ"),
+ (0xFED1, "M", "ف"),
+ (0xFED5, "M", "ق"),
+ (0xFED9, "M", "ك"),
+ (0xFEDD, "M", "ل"),
+ (0xFEE1, "M", "م"),
+ (0xFEE5, "M", "ن"),
+ (0xFEE9, "M", "ه"),
+ (0xFEED, "M", "و"),
+ (0xFEEF, "M", "ى"),
+ (0xFEF1, "M", "ي"),
+ (0xFEF5, "M", "لآ"),
+ (0xFEF7, "M", "لأ"),
+ (0xFEF9, "M", "لإ"),
+ (0xFEFB, "M", "لا"),
+ (0xFEFD, "X"),
+ (0xFEFF, "I"),
+ (0xFF00, "X"),
+ (0xFF01, "3", "!"),
+ (0xFF02, "3", '"'),
+ (0xFF03, "3", "#"),
+ (0xFF04, "3", "$"),
+ (0xFF05, "3", "%"),
+ (0xFF06, "3", "&"),
+ (0xFF07, "3", "'"),
+ (0xFF08, "3", "("),
+ (0xFF09, "3", ")"),
+ (0xFF0A, "3", "*"),
+ (0xFF0B, "3", "+"),
+ (0xFF0C, "3", ","),
+ (0xFF0D, "M", "-"),
+ (0xFF0E, "M", "."),
+ (0xFF0F, "3", "/"),
+ (0xFF10, "M", "0"),
+ (0xFF11, "M", "1"),
+ (0xFF12, "M", "2"),
+ (0xFF13, "M", "3"),
+ (0xFF14, "M", "4"),
+ (0xFF15, "M", "5"),
+ (0xFF16, "M", "6"),
+ (0xFF17, "M", "7"),
+ (0xFF18, "M", "8"),
+ (0xFF19, "M", "9"),
+ (0xFF1A, "3", ":"),
+ (0xFF1B, "3", ";"),
+ (0xFF1C, "3", "<"),
+ (0xFF1D, "3", "="),
+ (0xFF1E, "3", ">"),
]
-def _seg_49():
+
+def _seg_51() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0xFDAF, 'M', u'يجي'),
- (0xFDB0, 'M', u'يمي'),
- (0xFDB1, 'M', u'ممي'),
- (0xFDB2, 'M', u'قمي'),
- (0xFDB3, 'M', u'نحي'),
- (0xFDB4, 'M', u'قمح'),
- (0xFDB5, 'M', u'لحم'),
- (0xFDB6, 'M', u'عمي'),
- (0xFDB7, 'M', u'كمي'),
- (0xFDB8, 'M', u'نجح'),
- (0xFDB9, 'M', u'مخي'),
- (0xFDBA, 'M', u'لجم'),
- (0xFDBB, 'M', u'كمم'),
- (0xFDBC, 'M', u'لجم'),
- (0xFDBD, 'M', u'نجح'),
- (0xFDBE, 'M', u'جحي'),
- (0xFDBF, 'M', u'حجي'),
- (0xFDC0, 'M', u'مجي'),
- (0xFDC1, 'M', u'فمي'),
- (0xFDC2, 'M', u'بحي'),
- (0xFDC3, 'M', u'كمم'),
- (0xFDC4, 'M', u'عجم'),
- (0xFDC5, 'M', u'صمم'),
- (0xFDC6, 'M', u'سخي'),
- (0xFDC7, 'M', u'نجي'),
- (0xFDC8, 'X'),
- (0xFDF0, 'M', u'صلے'),
- (0xFDF1, 'M', u'قلے'),
- (0xFDF2, 'M', u'الله'),
- (0xFDF3, 'M', u'اكبر'),
- (0xFDF4, 'M', u'محمد'),
- (0xFDF5, 'M', u'صلعم'),
- (0xFDF6, 'M', u'رسول'),
- (0xFDF7, 'M', u'عليه'),
- (0xFDF8, 'M', u'وسلم'),
- (0xFDF9, 'M', u'صلى'),
- (0xFDFA, '3', u'صلى الله عليه وسلم'),
- (0xFDFB, '3', u'جل جلاله'),
- (0xFDFC, 'M', u'ریال'),
- (0xFDFD, 'V'),
- (0xFDFE, 'X'),
- (0xFE00, 'I'),
- (0xFE10, '3', u','),
- (0xFE11, 'M', u'、'),
- (0xFE12, 'X'),
- (0xFE13, '3', u':'),
- (0xFE14, '3', u';'),
- (0xFE15, '3', u'!'),
- (0xFE16, '3', u'?'),
- (0xFE17, 'M', u'〖'),
- (0xFE18, 'M', u'〗'),
- (0xFE19, 'X'),
- (0xFE20, 'V'),
- (0xFE30, 'X'),
- (0xFE31, 'M', u'—'),
- (0xFE32, 'M', u'–'),
- (0xFE33, '3', u'_'),
- (0xFE35, '3', u'('),
- (0xFE36, '3', u')'),
- (0xFE37, '3', u'{'),
- (0xFE38, '3', u'}'),
- (0xFE39, 'M', u'〔'),
- (0xFE3A, 'M', u'〕'),
- (0xFE3B, 'M', u'【'),
- (0xFE3C, 'M', u'】'),
- (0xFE3D, 'M', u'《'),
- (0xFE3E, 'M', u'》'),
- (0xFE3F, 'M', u'〈'),
- (0xFE40, 'M', u'〉'),
- (0xFE41, 'M', u'「'),
- (0xFE42, 'M', u'」'),
- (0xFE43, 'M', u'『'),
- (0xFE44, 'M', u'』'),
- (0xFE45, 'V'),
- (0xFE47, '3', u'['),
- (0xFE48, '3', u']'),
- (0xFE49, '3', u' ̅'),
- (0xFE4D, '3', u'_'),
- (0xFE50, '3', u','),
- (0xFE51, 'M', u'、'),
- (0xFE52, 'X'),
- (0xFE54, '3', u';'),
- (0xFE55, '3', u':'),
- (0xFE56, '3', u'?'),
- (0xFE57, '3', u'!'),
- (0xFE58, 'M', u'—'),
- (0xFE59, '3', u'('),
- (0xFE5A, '3', u')'),
- (0xFE5B, '3', u'{'),
- (0xFE5C, '3', u'}'),
- (0xFE5D, 'M', u'〔'),
- (0xFE5E, 'M', u'〕'),
- (0xFE5F, '3', u'#'),
- (0xFE60, '3', u'&'),
- (0xFE61, '3', u'*'),
- (0xFE62, '3', u'+'),
- (0xFE63, 'M', u'-'),
- (0xFE64, '3', u'<'),
- (0xFE65, '3', u'>'),
- (0xFE66, '3', u'='),
+ (0xFF1F, "3", "?"),
+ (0xFF20, "3", "@"),
+ (0xFF21, "M", "a"),
+ (0xFF22, "M", "b"),
+ (0xFF23, "M", "c"),
+ (0xFF24, "M", "d"),
+ (0xFF25, "M", "e"),
+ (0xFF26, "M", "f"),
+ (0xFF27, "M", "g"),
+ (0xFF28, "M", "h"),
+ (0xFF29, "M", "i"),
+ (0xFF2A, "M", "j"),
+ (0xFF2B, "M", "k"),
+ (0xFF2C, "M", "l"),
+ (0xFF2D, "M", "m"),
+ (0xFF2E, "M", "n"),
+ (0xFF2F, "M", "o"),
+ (0xFF30, "M", "p"),
+ (0xFF31, "M", "q"),
+ (0xFF32, "M", "r"),
+ (0xFF33, "M", "s"),
+ (0xFF34, "M", "t"),
+ (0xFF35, "M", "u"),
+ (0xFF36, "M", "v"),
+ (0xFF37, "M", "w"),
+ (0xFF38, "M", "x"),
+ (0xFF39, "M", "y"),
+ (0xFF3A, "M", "z"),
+ (0xFF3B, "3", "["),
+ (0xFF3C, "3", "\\"),
+ (0xFF3D, "3", "]"),
+ (0xFF3E, "3", "^"),
+ (0xFF3F, "3", "_"),
+ (0xFF40, "3", "`"),
+ (0xFF41, "M", "a"),
+ (0xFF42, "M", "b"),
+ (0xFF43, "M", "c"),
+ (0xFF44, "M", "d"),
+ (0xFF45, "M", "e"),
+ (0xFF46, "M", "f"),
+ (0xFF47, "M", "g"),
+ (0xFF48, "M", "h"),
+ (0xFF49, "M", "i"),
+ (0xFF4A, "M", "j"),
+ (0xFF4B, "M", "k"),
+ (0xFF4C, "M", "l"),
+ (0xFF4D, "M", "m"),
+ (0xFF4E, "M", "n"),
+ (0xFF4F, "M", "o"),
+ (0xFF50, "M", "p"),
+ (0xFF51, "M", "q"),
+ (0xFF52, "M", "r"),
+ (0xFF53, "M", "s"),
+ (0xFF54, "M", "t"),
+ (0xFF55, "M", "u"),
+ (0xFF56, "M", "v"),
+ (0xFF57, "M", "w"),
+ (0xFF58, "M", "x"),
+ (0xFF59, "M", "y"),
+ (0xFF5A, "M", "z"),
+ (0xFF5B, "3", "{"),
+ (0xFF5C, "3", "|"),
+ (0xFF5D, "3", "}"),
+ (0xFF5E, "3", "~"),
+ (0xFF5F, "M", "⦅"),
+ (0xFF60, "M", "⦆"),
+ (0xFF61, "M", "."),
+ (0xFF62, "M", "「"),
+ (0xFF63, "M", "」"),
+ (0xFF64, "M", "、"),
+ (0xFF65, "M", "・"),
+ (0xFF66, "M", "ヲ"),
+ (0xFF67, "M", "ァ"),
+ (0xFF68, "M", "ィ"),
+ (0xFF69, "M", "ゥ"),
+ (0xFF6A, "M", "ェ"),
+ (0xFF6B, "M", "ォ"),
+ (0xFF6C, "M", "ャ"),
+ (0xFF6D, "M", "ュ"),
+ (0xFF6E, "M", "ョ"),
+ (0xFF6F, "M", "ッ"),
+ (0xFF70, "M", "ー"),
+ (0xFF71, "M", "ア"),
+ (0xFF72, "M", "イ"),
+ (0xFF73, "M", "ウ"),
+ (0xFF74, "M", "エ"),
+ (0xFF75, "M", "オ"),
+ (0xFF76, "M", "カ"),
+ (0xFF77, "M", "キ"),
+ (0xFF78, "M", "ク"),
+ (0xFF79, "M", "ケ"),
+ (0xFF7A, "M", "コ"),
+ (0xFF7B, "M", "サ"),
+ (0xFF7C, "M", "シ"),
+ (0xFF7D, "M", "ス"),
+ (0xFF7E, "M", "セ"),
+ (0xFF7F, "M", "ソ"),
+ (0xFF80, "M", "タ"),
+ (0xFF81, "M", "チ"),
+ (0xFF82, "M", "ツ"),
]
-def _seg_50():
+
+def _seg_52() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0xFE67, 'X'),
- (0xFE68, '3', u'\\'),
- (0xFE69, '3', u'$'),
- (0xFE6A, '3', u'%'),
- (0xFE6B, '3', u'@'),
- (0xFE6C, 'X'),
- (0xFE70, '3', u' ً'),
- (0xFE71, 'M', u'ـً'),
- (0xFE72, '3', u' ٌ'),
- (0xFE73, 'V'),
- (0xFE74, '3', u' ٍ'),
- (0xFE75, 'X'),
- (0xFE76, '3', u' َ'),
- (0xFE77, 'M', u'ـَ'),
- (0xFE78, '3', u' ُ'),
- (0xFE79, 'M', u'ـُ'),
- (0xFE7A, '3', u' ِ'),
- (0xFE7B, 'M', u'ـِ'),
- (0xFE7C, '3', u' ّ'),
- (0xFE7D, 'M', u'ـّ'),
- (0xFE7E, '3', u' ْ'),
- (0xFE7F, 'M', u'ـْ'),
- (0xFE80, 'M', u'ء'),
- (0xFE81, 'M', u'آ'),
- (0xFE83, 'M', u'أ'),
- (0xFE85, 'M', u'ؤ'),
- (0xFE87, 'M', u'إ'),
- (0xFE89, 'M', u'ئ'),
- (0xFE8D, 'M', u'ا'),
- (0xFE8F, 'M', u'ب'),
- (0xFE93, 'M', u'ة'),
- (0xFE95, 'M', u'ت'),
- (0xFE99, 'M', u'ث'),
- (0xFE9D, 'M', u'ج'),
- (0xFEA1, 'M', u'ح'),
- (0xFEA5, 'M', u'خ'),
- (0xFEA9, 'M', u'د'),
- (0xFEAB, 'M', u'ذ'),
- (0xFEAD, 'M', u'ر'),
- (0xFEAF, 'M', u'ز'),
- (0xFEB1, 'M', u'س'),
- (0xFEB5, 'M', u'ش'),
- (0xFEB9, 'M', u'ص'),
- (0xFEBD, 'M', u'ض'),
- (0xFEC1, 'M', u'ط'),
- (0xFEC5, 'M', u'ظ'),
- (0xFEC9, 'M', u'ع'),
- (0xFECD, 'M', u'غ'),
- (0xFED1, 'M', u'ف'),
- (0xFED5, 'M', u'ق'),
- (0xFED9, 'M', u'ك'),
- (0xFEDD, 'M', u'ل'),
- (0xFEE1, 'M', u'م'),
- (0xFEE5, 'M', u'ن'),
- (0xFEE9, 'M', u'ه'),
- (0xFEED, 'M', u'و'),
- (0xFEEF, 'M', u'ى'),
- (0xFEF1, 'M', u'ي'),
- (0xFEF5, 'M', u'لآ'),
- (0xFEF7, 'M', u'لأ'),
- (0xFEF9, 'M', u'لإ'),
- (0xFEFB, 'M', u'لا'),
- (0xFEFD, 'X'),
- (0xFEFF, 'I'),
- (0xFF00, 'X'),
- (0xFF01, '3', u'!'),
- (0xFF02, '3', u'"'),
- (0xFF03, '3', u'#'),
- (0xFF04, '3', u'$'),
- (0xFF05, '3', u'%'),
- (0xFF06, '3', u'&'),
- (0xFF07, '3', u'\''),
- (0xFF08, '3', u'('),
- (0xFF09, '3', u')'),
- (0xFF0A, '3', u'*'),
- (0xFF0B, '3', u'+'),
- (0xFF0C, '3', u','),
- (0xFF0D, 'M', u'-'),
- (0xFF0E, 'M', u'.'),
- (0xFF0F, '3', u'/'),
- (0xFF10, 'M', u'0'),
- (0xFF11, 'M', u'1'),
- (0xFF12, 'M', u'2'),
- (0xFF13, 'M', u'3'),
- (0xFF14, 'M', u'4'),
- (0xFF15, 'M', u'5'),
- (0xFF16, 'M', u'6'),
- (0xFF17, 'M', u'7'),
- (0xFF18, 'M', u'8'),
- (0xFF19, 'M', u'9'),
- (0xFF1A, '3', u':'),
- (0xFF1B, '3', u';'),
- (0xFF1C, '3', u'<'),
- (0xFF1D, '3', u'='),
- (0xFF1E, '3', u'>'),
- (0xFF1F, '3', u'?'),
- (0xFF20, '3', u'@'),
- (0xFF21, 'M', u'a'),
- (0xFF22, 'M', u'b'),
- (0xFF23, 'M', u'c'),
+ (0xFF83, "M", "テ"),
+ (0xFF84, "M", "ト"),
+ (0xFF85, "M", "ナ"),
+ (0xFF86, "M", "ニ"),
+ (0xFF87, "M", "ヌ"),
+ (0xFF88, "M", "ネ"),
+ (0xFF89, "M", "ノ"),
+ (0xFF8A, "M", "ハ"),
+ (0xFF8B, "M", "ヒ"),
+ (0xFF8C, "M", "フ"),
+ (0xFF8D, "M", "ヘ"),
+ (0xFF8E, "M", "ホ"),
+ (0xFF8F, "M", "マ"),
+ (0xFF90, "M", "ミ"),
+ (0xFF91, "M", "ム"),
+ (0xFF92, "M", "メ"),
+ (0xFF93, "M", "モ"),
+ (0xFF94, "M", "ヤ"),
+ (0xFF95, "M", "ユ"),
+ (0xFF96, "M", "ヨ"),
+ (0xFF97, "M", "ラ"),
+ (0xFF98, "M", "リ"),
+ (0xFF99, "M", "ル"),
+ (0xFF9A, "M", "レ"),
+ (0xFF9B, "M", "ロ"),
+ (0xFF9C, "M", "ワ"),
+ (0xFF9D, "M", "ン"),
+ (0xFF9E, "M", "゙"),
+ (0xFF9F, "M", "゚"),
+ (0xFFA0, "X"),
+ (0xFFA1, "M", "ᄀ"),
+ (0xFFA2, "M", "ᄁ"),
+ (0xFFA3, "M", "ᆪ"),
+ (0xFFA4, "M", "ᄂ"),
+ (0xFFA5, "M", "ᆬ"),
+ (0xFFA6, "M", "ᆭ"),
+ (0xFFA7, "M", "ᄃ"),
+ (0xFFA8, "M", "ᄄ"),
+ (0xFFA9, "M", "ᄅ"),
+ (0xFFAA, "M", "ᆰ"),
+ (0xFFAB, "M", "ᆱ"),
+ (0xFFAC, "M", "ᆲ"),
+ (0xFFAD, "M", "ᆳ"),
+ (0xFFAE, "M", "ᆴ"),
+ (0xFFAF, "M", "ᆵ"),
+ (0xFFB0, "M", "ᄚ"),
+ (0xFFB1, "M", "ᄆ"),
+ (0xFFB2, "M", "ᄇ"),
+ (0xFFB3, "M", "ᄈ"),
+ (0xFFB4, "M", "ᄡ"),
+ (0xFFB5, "M", "ᄉ"),
+ (0xFFB6, "M", "ᄊ"),
+ (0xFFB7, "M", "ᄋ"),
+ (0xFFB8, "M", "ᄌ"),
+ (0xFFB9, "M", "ᄍ"),
+ (0xFFBA, "M", "ᄎ"),
+ (0xFFBB, "M", "ᄏ"),
+ (0xFFBC, "M", "ᄐ"),
+ (0xFFBD, "M", "ᄑ"),
+ (0xFFBE, "M", "ᄒ"),
+ (0xFFBF, "X"),
+ (0xFFC2, "M", "ᅡ"),
+ (0xFFC3, "M", "ᅢ"),
+ (0xFFC4, "M", "ᅣ"),
+ (0xFFC5, "M", "ᅤ"),
+ (0xFFC6, "M", "ᅥ"),
+ (0xFFC7, "M", "ᅦ"),
+ (0xFFC8, "X"),
+ (0xFFCA, "M", "ᅧ"),
+ (0xFFCB, "M", "ᅨ"),
+ (0xFFCC, "M", "ᅩ"),
+ (0xFFCD, "M", "ᅪ"),
+ (0xFFCE, "M", "ᅫ"),
+ (0xFFCF, "M", "ᅬ"),
+ (0xFFD0, "X"),
+ (0xFFD2, "M", "ᅭ"),
+ (0xFFD3, "M", "ᅮ"),
+ (0xFFD4, "M", "ᅯ"),
+ (0xFFD5, "M", "ᅰ"),
+ (0xFFD6, "M", "ᅱ"),
+ (0xFFD7, "M", "ᅲ"),
+ (0xFFD8, "X"),
+ (0xFFDA, "M", "ᅳ"),
+ (0xFFDB, "M", "ᅴ"),
+ (0xFFDC, "M", "ᅵ"),
+ (0xFFDD, "X"),
+ (0xFFE0, "M", "¢"),
+ (0xFFE1, "M", "£"),
+ (0xFFE2, "M", "¬"),
+ (0xFFE3, "3", " ̄"),
+ (0xFFE4, "M", "¦"),
+ (0xFFE5, "M", "¥"),
+ (0xFFE6, "M", "₩"),
+ (0xFFE7, "X"),
+ (0xFFE8, "M", "│"),
+ (0xFFE9, "M", "←"),
+ (0xFFEA, "M", "↑"),
+ (0xFFEB, "M", "→"),
+ (0xFFEC, "M", "↓"),
+ (0xFFED, "M", "■"),
]
-def _seg_51():
+
+def _seg_53() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0xFF24, 'M', u'd'),
- (0xFF25, 'M', u'e'),
- (0xFF26, 'M', u'f'),
- (0xFF27, 'M', u'g'),
- (0xFF28, 'M', u'h'),
- (0xFF29, 'M', u'i'),
- (0xFF2A, 'M', u'j'),
- (0xFF2B, 'M', u'k'),
- (0xFF2C, 'M', u'l'),
- (0xFF2D, 'M', u'm'),
- (0xFF2E, 'M', u'n'),
- (0xFF2F, 'M', u'o'),
- (0xFF30, 'M', u'p'),
- (0xFF31, 'M', u'q'),
- (0xFF32, 'M', u'r'),
- (0xFF33, 'M', u's'),
- (0xFF34, 'M', u't'),
- (0xFF35, 'M', u'u'),
- (0xFF36, 'M', u'v'),
- (0xFF37, 'M', u'w'),
- (0xFF38, 'M', u'x'),
- (0xFF39, 'M', u'y'),
- (0xFF3A, 'M', u'z'),
- (0xFF3B, '3', u'['),
- (0xFF3C, '3', u'\\'),
- (0xFF3D, '3', u']'),
- (0xFF3E, '3', u'^'),
- (0xFF3F, '3', u'_'),
- (0xFF40, '3', u'`'),
- (0xFF41, 'M', u'a'),
- (0xFF42, 'M', u'b'),
- (0xFF43, 'M', u'c'),
- (0xFF44, 'M', u'd'),
- (0xFF45, 'M', u'e'),
- (0xFF46, 'M', u'f'),
- (0xFF47, 'M', u'g'),
- (0xFF48, 'M', u'h'),
- (0xFF49, 'M', u'i'),
- (0xFF4A, 'M', u'j'),
- (0xFF4B, 'M', u'k'),
- (0xFF4C, 'M', u'l'),
- (0xFF4D, 'M', u'm'),
- (0xFF4E, 'M', u'n'),
- (0xFF4F, 'M', u'o'),
- (0xFF50, 'M', u'p'),
- (0xFF51, 'M', u'q'),
- (0xFF52, 'M', u'r'),
- (0xFF53, 'M', u's'),
- (0xFF54, 'M', u't'),
- (0xFF55, 'M', u'u'),
- (0xFF56, 'M', u'v'),
- (0xFF57, 'M', u'w'),
- (0xFF58, 'M', u'x'),
- (0xFF59, 'M', u'y'),
- (0xFF5A, 'M', u'z'),
- (0xFF5B, '3', u'{'),
- (0xFF5C, '3', u'|'),
- (0xFF5D, '3', u'}'),
- (0xFF5E, '3', u'~'),
- (0xFF5F, 'M', u'⦅'),
- (0xFF60, 'M', u'⦆'),
- (0xFF61, 'M', u'.'),
- (0xFF62, 'M', u'「'),
- (0xFF63, 'M', u'」'),
- (0xFF64, 'M', u'、'),
- (0xFF65, 'M', u'・'),
- (0xFF66, 'M', u'ヲ'),
- (0xFF67, 'M', u'ァ'),
- (0xFF68, 'M', u'ィ'),
- (0xFF69, 'M', u'ゥ'),
- (0xFF6A, 'M', u'ェ'),
- (0xFF6B, 'M', u'ォ'),
- (0xFF6C, 'M', u'ャ'),
- (0xFF6D, 'M', u'ュ'),
- (0xFF6E, 'M', u'ョ'),
- (0xFF6F, 'M', u'ッ'),
- (0xFF70, 'M', u'ー'),
- (0xFF71, 'M', u'ア'),
- (0xFF72, 'M', u'イ'),
- (0xFF73, 'M', u'ウ'),
- (0xFF74, 'M', u'エ'),
- (0xFF75, 'M', u'オ'),
- (0xFF76, 'M', u'カ'),
- (0xFF77, 'M', u'キ'),
- (0xFF78, 'M', u'ク'),
- (0xFF79, 'M', u'ケ'),
- (0xFF7A, 'M', u'コ'),
- (0xFF7B, 'M', u'サ'),
- (0xFF7C, 'M', u'シ'),
- (0xFF7D, 'M', u'ス'),
- (0xFF7E, 'M', u'セ'),
- (0xFF7F, 'M', u'ソ'),
- (0xFF80, 'M', u'タ'),
- (0xFF81, 'M', u'チ'),
- (0xFF82, 'M', u'ツ'),
- (0xFF83, 'M', u'テ'),
- (0xFF84, 'M', u'ト'),
- (0xFF85, 'M', u'ナ'),
- (0xFF86, 'M', u'ニ'),
- (0xFF87, 'M', u'ヌ'),
+ (0xFFEE, "M", "○"),
+ (0xFFEF, "X"),
+ (0x10000, "V"),
+ (0x1000C, "X"),
+ (0x1000D, "V"),
+ (0x10027, "X"),
+ (0x10028, "V"),
+ (0x1003B, "X"),
+ (0x1003C, "V"),
+ (0x1003E, "X"),
+ (0x1003F, "V"),
+ (0x1004E, "X"),
+ (0x10050, "V"),
+ (0x1005E, "X"),
+ (0x10080, "V"),
+ (0x100FB, "X"),
+ (0x10100, "V"),
+ (0x10103, "X"),
+ (0x10107, "V"),
+ (0x10134, "X"),
+ (0x10137, "V"),
+ (0x1018F, "X"),
+ (0x10190, "V"),
+ (0x1019D, "X"),
+ (0x101A0, "V"),
+ (0x101A1, "X"),
+ (0x101D0, "V"),
+ (0x101FE, "X"),
+ (0x10280, "V"),
+ (0x1029D, "X"),
+ (0x102A0, "V"),
+ (0x102D1, "X"),
+ (0x102E0, "V"),
+ (0x102FC, "X"),
+ (0x10300, "V"),
+ (0x10324, "X"),
+ (0x1032D, "V"),
+ (0x1034B, "X"),
+ (0x10350, "V"),
+ (0x1037B, "X"),
+ (0x10380, "V"),
+ (0x1039E, "X"),
+ (0x1039F, "V"),
+ (0x103C4, "X"),
+ (0x103C8, "V"),
+ (0x103D6, "X"),
+ (0x10400, "M", "𐐨"),
+ (0x10401, "M", "𐐩"),
+ (0x10402, "M", "𐐪"),
+ (0x10403, "M", "𐐫"),
+ (0x10404, "M", "𐐬"),
+ (0x10405, "M", "𐐭"),
+ (0x10406, "M", "𐐮"),
+ (0x10407, "M", "𐐯"),
+ (0x10408, "M", "𐐰"),
+ (0x10409, "M", "𐐱"),
+ (0x1040A, "M", "𐐲"),
+ (0x1040B, "M", "𐐳"),
+ (0x1040C, "M", "𐐴"),
+ (0x1040D, "M", "𐐵"),
+ (0x1040E, "M", "𐐶"),
+ (0x1040F, "M", "𐐷"),
+ (0x10410, "M", "𐐸"),
+ (0x10411, "M", "𐐹"),
+ (0x10412, "M", "𐐺"),
+ (0x10413, "M", "𐐻"),
+ (0x10414, "M", "𐐼"),
+ (0x10415, "M", "𐐽"),
+ (0x10416, "M", "𐐾"),
+ (0x10417, "M", "𐐿"),
+ (0x10418, "M", "𐑀"),
+ (0x10419, "M", "𐑁"),
+ (0x1041A, "M", "𐑂"),
+ (0x1041B, "M", "𐑃"),
+ (0x1041C, "M", "𐑄"),
+ (0x1041D, "M", "𐑅"),
+ (0x1041E, "M", "𐑆"),
+ (0x1041F, "M", "𐑇"),
+ (0x10420, "M", "𐑈"),
+ (0x10421, "M", "𐑉"),
+ (0x10422, "M", "𐑊"),
+ (0x10423, "M", "𐑋"),
+ (0x10424, "M", "𐑌"),
+ (0x10425, "M", "𐑍"),
+ (0x10426, "M", "𐑎"),
+ (0x10427, "M", "𐑏"),
+ (0x10428, "V"),
+ (0x1049E, "X"),
+ (0x104A0, "V"),
+ (0x104AA, "X"),
+ (0x104B0, "M", "𐓘"),
+ (0x104B1, "M", "𐓙"),
+ (0x104B2, "M", "𐓚"),
+ (0x104B3, "M", "𐓛"),
+ (0x104B4, "M", "𐓜"),
+ (0x104B5, "M", "𐓝"),
+ (0x104B6, "M", "𐓞"),
+ (0x104B7, "M", "𐓟"),
+ (0x104B8, "M", "𐓠"),
+ (0x104B9, "M", "𐓡"),
]
-def _seg_52():
+
+def _seg_54() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0xFF88, 'M', u'ネ'),
- (0xFF89, 'M', u'ノ'),
- (0xFF8A, 'M', u'ハ'),
- (0xFF8B, 'M', u'ヒ'),
- (0xFF8C, 'M', u'フ'),
- (0xFF8D, 'M', u'ヘ'),
- (0xFF8E, 'M', u'ホ'),
- (0xFF8F, 'M', u'マ'),
- (0xFF90, 'M', u'ミ'),
- (0xFF91, 'M', u'ム'),
- (0xFF92, 'M', u'メ'),
- (0xFF93, 'M', u'モ'),
- (0xFF94, 'M', u'ヤ'),
- (0xFF95, 'M', u'ユ'),
- (0xFF96, 'M', u'ヨ'),
- (0xFF97, 'M', u'ラ'),
- (0xFF98, 'M', u'リ'),
- (0xFF99, 'M', u'ル'),
- (0xFF9A, 'M', u'レ'),
- (0xFF9B, 'M', u'ロ'),
- (0xFF9C, 'M', u'ワ'),
- (0xFF9D, 'M', u'ン'),
- (0xFF9E, 'M', u'゙'),
- (0xFF9F, 'M', u'゚'),
- (0xFFA0, 'X'),
- (0xFFA1, 'M', u'ᄀ'),
- (0xFFA2, 'M', u'ᄁ'),
- (0xFFA3, 'M', u'ᆪ'),
- (0xFFA4, 'M', u'ᄂ'),
- (0xFFA5, 'M', u'ᆬ'),
- (0xFFA6, 'M', u'ᆭ'),
- (0xFFA7, 'M', u'ᄃ'),
- (0xFFA8, 'M', u'ᄄ'),
- (0xFFA9, 'M', u'ᄅ'),
- (0xFFAA, 'M', u'ᆰ'),
- (0xFFAB, 'M', u'ᆱ'),
- (0xFFAC, 'M', u'ᆲ'),
- (0xFFAD, 'M', u'ᆳ'),
- (0xFFAE, 'M', u'ᆴ'),
- (0xFFAF, 'M', u'ᆵ'),
- (0xFFB0, 'M', u'ᄚ'),
- (0xFFB1, 'M', u'ᄆ'),
- (0xFFB2, 'M', u'ᄇ'),
- (0xFFB3, 'M', u'ᄈ'),
- (0xFFB4, 'M', u'ᄡ'),
- (0xFFB5, 'M', u'ᄉ'),
- (0xFFB6, 'M', u'ᄊ'),
- (0xFFB7, 'M', u'ᄋ'),
- (0xFFB8, 'M', u'ᄌ'),
- (0xFFB9, 'M', u'ᄍ'),
- (0xFFBA, 'M', u'ᄎ'),
- (0xFFBB, 'M', u'ᄏ'),
- (0xFFBC, 'M', u'ᄐ'),
- (0xFFBD, 'M', u'ᄑ'),
- (0xFFBE, 'M', u'ᄒ'),
- (0xFFBF, 'X'),
- (0xFFC2, 'M', u'ᅡ'),
- (0xFFC3, 'M', u'ᅢ'),
- (0xFFC4, 'M', u'ᅣ'),
- (0xFFC5, 'M', u'ᅤ'),
- (0xFFC6, 'M', u'ᅥ'),
- (0xFFC7, 'M', u'ᅦ'),
- (0xFFC8, 'X'),
- (0xFFCA, 'M', u'ᅧ'),
- (0xFFCB, 'M', u'ᅨ'),
- (0xFFCC, 'M', u'ᅩ'),
- (0xFFCD, 'M', u'ᅪ'),
- (0xFFCE, 'M', u'ᅫ'),
- (0xFFCF, 'M', u'ᅬ'),
- (0xFFD0, 'X'),
- (0xFFD2, 'M', u'ᅭ'),
- (0xFFD3, 'M', u'ᅮ'),
- (0xFFD4, 'M', u'ᅯ'),
- (0xFFD5, 'M', u'ᅰ'),
- (0xFFD6, 'M', u'ᅱ'),
- (0xFFD7, 'M', u'ᅲ'),
- (0xFFD8, 'X'),
- (0xFFDA, 'M', u'ᅳ'),
- (0xFFDB, 'M', u'ᅴ'),
- (0xFFDC, 'M', u'ᅵ'),
- (0xFFDD, 'X'),
- (0xFFE0, 'M', u'¢'),
- (0xFFE1, 'M', u'£'),
- (0xFFE2, 'M', u'¬'),
- (0xFFE3, '3', u' ̄'),
- (0xFFE4, 'M', u'¦'),
- (0xFFE5, 'M', u'¥'),
- (0xFFE6, 'M', u'₩'),
- (0xFFE7, 'X'),
- (0xFFE8, 'M', u'│'),
- (0xFFE9, 'M', u'←'),
- (0xFFEA, 'M', u'↑'),
- (0xFFEB, 'M', u'→'),
- (0xFFEC, 'M', u'↓'),
- (0xFFED, 'M', u'■'),
- (0xFFEE, 'M', u'○'),
- (0xFFEF, 'X'),
- (0x10000, 'V'),
- (0x1000C, 'X'),
- (0x1000D, 'V'),
+ (0x104BA, "M", "𐓢"),
+ (0x104BB, "M", "𐓣"),
+ (0x104BC, "M", "𐓤"),
+ (0x104BD, "M", "𐓥"),
+ (0x104BE, "M", "𐓦"),
+ (0x104BF, "M", "𐓧"),
+ (0x104C0, "M", "𐓨"),
+ (0x104C1, "M", "𐓩"),
+ (0x104C2, "M", "𐓪"),
+ (0x104C3, "M", "𐓫"),
+ (0x104C4, "M", "𐓬"),
+ (0x104C5, "M", "𐓭"),
+ (0x104C6, "M", "𐓮"),
+ (0x104C7, "M", "𐓯"),
+ (0x104C8, "M", "𐓰"),
+ (0x104C9, "M", "𐓱"),
+ (0x104CA, "M", "𐓲"),
+ (0x104CB, "M", "𐓳"),
+ (0x104CC, "M", "𐓴"),
+ (0x104CD, "M", "𐓵"),
+ (0x104CE, "M", "𐓶"),
+ (0x104CF, "M", "𐓷"),
+ (0x104D0, "M", "𐓸"),
+ (0x104D1, "M", "𐓹"),
+ (0x104D2, "M", "𐓺"),
+ (0x104D3, "M", "𐓻"),
+ (0x104D4, "X"),
+ (0x104D8, "V"),
+ (0x104FC, "X"),
+ (0x10500, "V"),
+ (0x10528, "X"),
+ (0x10530, "V"),
+ (0x10564, "X"),
+ (0x1056F, "V"),
+ (0x10570, "M", "𐖗"),
+ (0x10571, "M", "𐖘"),
+ (0x10572, "M", "𐖙"),
+ (0x10573, "M", "𐖚"),
+ (0x10574, "M", "𐖛"),
+ (0x10575, "M", "𐖜"),
+ (0x10576, "M", "𐖝"),
+ (0x10577, "M", "𐖞"),
+ (0x10578, "M", "𐖟"),
+ (0x10579, "M", "𐖠"),
+ (0x1057A, "M", "𐖡"),
+ (0x1057B, "X"),
+ (0x1057C, "M", "𐖣"),
+ (0x1057D, "M", "𐖤"),
+ (0x1057E, "M", "𐖥"),
+ (0x1057F, "M", "𐖦"),
+ (0x10580, "M", "𐖧"),
+ (0x10581, "M", "𐖨"),
+ (0x10582, "M", "𐖩"),
+ (0x10583, "M", "𐖪"),
+ (0x10584, "M", "𐖫"),
+ (0x10585, "M", "𐖬"),
+ (0x10586, "M", "𐖭"),
+ (0x10587, "M", "𐖮"),
+ (0x10588, "M", "𐖯"),
+ (0x10589, "M", "𐖰"),
+ (0x1058A, "M", "𐖱"),
+ (0x1058B, "X"),
+ (0x1058C, "M", "𐖳"),
+ (0x1058D, "M", "𐖴"),
+ (0x1058E, "M", "𐖵"),
+ (0x1058F, "M", "𐖶"),
+ (0x10590, "M", "𐖷"),
+ (0x10591, "M", "𐖸"),
+ (0x10592, "M", "𐖹"),
+ (0x10593, "X"),
+ (0x10594, "M", "𐖻"),
+ (0x10595, "M", "𐖼"),
+ (0x10596, "X"),
+ (0x10597, "V"),
+ (0x105A2, "X"),
+ (0x105A3, "V"),
+ (0x105B2, "X"),
+ (0x105B3, "V"),
+ (0x105BA, "X"),
+ (0x105BB, "V"),
+ (0x105BD, "X"),
+ (0x10600, "V"),
+ (0x10737, "X"),
+ (0x10740, "V"),
+ (0x10756, "X"),
+ (0x10760, "V"),
+ (0x10768, "X"),
+ (0x10780, "V"),
+ (0x10781, "M", "ː"),
+ (0x10782, "M", "ˑ"),
+ (0x10783, "M", "æ"),
+ (0x10784, "M", "ʙ"),
+ (0x10785, "M", "ɓ"),
+ (0x10786, "X"),
+ (0x10787, "M", "ʣ"),
+ (0x10788, "M", "ꭦ"),
+ (0x10789, "M", "ʥ"),
+ (0x1078A, "M", "ʤ"),
+ (0x1078B, "M", "ɖ"),
+ (0x1078C, "M", "ɗ"),
]
-def _seg_53():
+
+def _seg_55() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x10027, 'X'),
- (0x10028, 'V'),
- (0x1003B, 'X'),
- (0x1003C, 'V'),
- (0x1003E, 'X'),
- (0x1003F, 'V'),
- (0x1004E, 'X'),
- (0x10050, 'V'),
- (0x1005E, 'X'),
- (0x10080, 'V'),
- (0x100FB, 'X'),
- (0x10100, 'V'),
- (0x10103, 'X'),
- (0x10107, 'V'),
- (0x10134, 'X'),
- (0x10137, 'V'),
- (0x1018F, 'X'),
- (0x10190, 'V'),
- (0x1019D, 'X'),
- (0x101A0, 'V'),
- (0x101A1, 'X'),
- (0x101D0, 'V'),
- (0x101FE, 'X'),
- (0x10280, 'V'),
- (0x1029D, 'X'),
- (0x102A0, 'V'),
- (0x102D1, 'X'),
- (0x102E0, 'V'),
- (0x102FC, 'X'),
- (0x10300, 'V'),
- (0x10324, 'X'),
- (0x1032D, 'V'),
- (0x1034B, 'X'),
- (0x10350, 'V'),
- (0x1037B, 'X'),
- (0x10380, 'V'),
- (0x1039E, 'X'),
- (0x1039F, 'V'),
- (0x103C4, 'X'),
- (0x103C8, 'V'),
- (0x103D6, 'X'),
- (0x10400, 'M', u'𐐨'),
- (0x10401, 'M', u'𐐩'),
- (0x10402, 'M', u'𐐪'),
- (0x10403, 'M', u'𐐫'),
- (0x10404, 'M', u'𐐬'),
- (0x10405, 'M', u'𐐭'),
- (0x10406, 'M', u'𐐮'),
- (0x10407, 'M', u'𐐯'),
- (0x10408, 'M', u'𐐰'),
- (0x10409, 'M', u'𐐱'),
- (0x1040A, 'M', u'𐐲'),
- (0x1040B, 'M', u'𐐳'),
- (0x1040C, 'M', u'𐐴'),
- (0x1040D, 'M', u'𐐵'),
- (0x1040E, 'M', u'𐐶'),
- (0x1040F, 'M', u'𐐷'),
- (0x10410, 'M', u'𐐸'),
- (0x10411, 'M', u'𐐹'),
- (0x10412, 'M', u'𐐺'),
- (0x10413, 'M', u'𐐻'),
- (0x10414, 'M', u'𐐼'),
- (0x10415, 'M', u'𐐽'),
- (0x10416, 'M', u'𐐾'),
- (0x10417, 'M', u'𐐿'),
- (0x10418, 'M', u'𐑀'),
- (0x10419, 'M', u'𐑁'),
- (0x1041A, 'M', u'𐑂'),
- (0x1041B, 'M', u'𐑃'),
- (0x1041C, 'M', u'𐑄'),
- (0x1041D, 'M', u'𐑅'),
- (0x1041E, 'M', u'𐑆'),
- (0x1041F, 'M', u'𐑇'),
- (0x10420, 'M', u'𐑈'),
- (0x10421, 'M', u'𐑉'),
- (0x10422, 'M', u'𐑊'),
- (0x10423, 'M', u'𐑋'),
- (0x10424, 'M', u'𐑌'),
- (0x10425, 'M', u'𐑍'),
- (0x10426, 'M', u'𐑎'),
- (0x10427, 'M', u'𐑏'),
- (0x10428, 'V'),
- (0x1049E, 'X'),
- (0x104A0, 'V'),
- (0x104AA, 'X'),
- (0x104B0, 'M', u'𐓘'),
- (0x104B1, 'M', u'𐓙'),
- (0x104B2, 'M', u'𐓚'),
- (0x104B3, 'M', u'𐓛'),
- (0x104B4, 'M', u'𐓜'),
- (0x104B5, 'M', u'𐓝'),
- (0x104B6, 'M', u'𐓞'),
- (0x104B7, 'M', u'𐓟'),
- (0x104B8, 'M', u'𐓠'),
- (0x104B9, 'M', u'𐓡'),
- (0x104BA, 'M', u'𐓢'),
- (0x104BB, 'M', u'𐓣'),
- (0x104BC, 'M', u'𐓤'),
- (0x104BD, 'M', u'𐓥'),
- (0x104BE, 'M', u'𐓦'),
+ (0x1078D, "M", "ᶑ"),
+ (0x1078E, "M", "ɘ"),
+ (0x1078F, "M", "ɞ"),
+ (0x10790, "M", "ʩ"),
+ (0x10791, "M", "ɤ"),
+ (0x10792, "M", "ɢ"),
+ (0x10793, "M", "ɠ"),
+ (0x10794, "M", "ʛ"),
+ (0x10795, "M", "ħ"),
+ (0x10796, "M", "ʜ"),
+ (0x10797, "M", "ɧ"),
+ (0x10798, "M", "ʄ"),
+ (0x10799, "M", "ʪ"),
+ (0x1079A, "M", "ʫ"),
+ (0x1079B, "M", "ɬ"),
+ (0x1079C, "M", "𝼄"),
+ (0x1079D, "M", "ꞎ"),
+ (0x1079E, "M", "ɮ"),
+ (0x1079F, "M", "𝼅"),
+ (0x107A0, "M", "ʎ"),
+ (0x107A1, "M", "𝼆"),
+ (0x107A2, "M", "ø"),
+ (0x107A3, "M", "ɶ"),
+ (0x107A4, "M", "ɷ"),
+ (0x107A5, "M", "q"),
+ (0x107A6, "M", "ɺ"),
+ (0x107A7, "M", "𝼈"),
+ (0x107A8, "M", "ɽ"),
+ (0x107A9, "M", "ɾ"),
+ (0x107AA, "M", "ʀ"),
+ (0x107AB, "M", "ʨ"),
+ (0x107AC, "M", "ʦ"),
+ (0x107AD, "M", "ꭧ"),
+ (0x107AE, "M", "ʧ"),
+ (0x107AF, "M", "ʈ"),
+ (0x107B0, "M", "ⱱ"),
+ (0x107B1, "X"),
+ (0x107B2, "M", "ʏ"),
+ (0x107B3, "M", "ʡ"),
+ (0x107B4, "M", "ʢ"),
+ (0x107B5, "M", "ʘ"),
+ (0x107B6, "M", "ǀ"),
+ (0x107B7, "M", "ǁ"),
+ (0x107B8, "M", "ǂ"),
+ (0x107B9, "M", "𝼊"),
+ (0x107BA, "M", "𝼞"),
+ (0x107BB, "X"),
+ (0x10800, "V"),
+ (0x10806, "X"),
+ (0x10808, "V"),
+ (0x10809, "X"),
+ (0x1080A, "V"),
+ (0x10836, "X"),
+ (0x10837, "V"),
+ (0x10839, "X"),
+ (0x1083C, "V"),
+ (0x1083D, "X"),
+ (0x1083F, "V"),
+ (0x10856, "X"),
+ (0x10857, "V"),
+ (0x1089F, "X"),
+ (0x108A7, "V"),
+ (0x108B0, "X"),
+ (0x108E0, "V"),
+ (0x108F3, "X"),
+ (0x108F4, "V"),
+ (0x108F6, "X"),
+ (0x108FB, "V"),
+ (0x1091C, "X"),
+ (0x1091F, "V"),
+ (0x1093A, "X"),
+ (0x1093F, "V"),
+ (0x10940, "X"),
+ (0x10980, "V"),
+ (0x109B8, "X"),
+ (0x109BC, "V"),
+ (0x109D0, "X"),
+ (0x109D2, "V"),
+ (0x10A04, "X"),
+ (0x10A05, "V"),
+ (0x10A07, "X"),
+ (0x10A0C, "V"),
+ (0x10A14, "X"),
+ (0x10A15, "V"),
+ (0x10A18, "X"),
+ (0x10A19, "V"),
+ (0x10A36, "X"),
+ (0x10A38, "V"),
+ (0x10A3B, "X"),
+ (0x10A3F, "V"),
+ (0x10A49, "X"),
+ (0x10A50, "V"),
+ (0x10A59, "X"),
+ (0x10A60, "V"),
+ (0x10AA0, "X"),
+ (0x10AC0, "V"),
+ (0x10AE7, "X"),
+ (0x10AEB, "V"),
+ (0x10AF7, "X"),
+ (0x10B00, "V"),
]
-def _seg_54():
+
+def _seg_56() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x104BF, 'M', u'𐓧'),
- (0x104C0, 'M', u'𐓨'),
- (0x104C1, 'M', u'𐓩'),
- (0x104C2, 'M', u'𐓪'),
- (0x104C3, 'M', u'𐓫'),
- (0x104C4, 'M', u'𐓬'),
- (0x104C5, 'M', u'𐓭'),
- (0x104C6, 'M', u'𐓮'),
- (0x104C7, 'M', u'𐓯'),
- (0x104C8, 'M', u'𐓰'),
- (0x104C9, 'M', u'𐓱'),
- (0x104CA, 'M', u'𐓲'),
- (0x104CB, 'M', u'𐓳'),
- (0x104CC, 'M', u'𐓴'),
- (0x104CD, 'M', u'𐓵'),
- (0x104CE, 'M', u'𐓶'),
- (0x104CF, 'M', u'𐓷'),
- (0x104D0, 'M', u'𐓸'),
- (0x104D1, 'M', u'𐓹'),
- (0x104D2, 'M', u'𐓺'),
- (0x104D3, 'M', u'𐓻'),
- (0x104D4, 'X'),
- (0x104D8, 'V'),
- (0x104FC, 'X'),
- (0x10500, 'V'),
- (0x10528, 'X'),
- (0x10530, 'V'),
- (0x10564, 'X'),
- (0x1056F, 'V'),
- (0x10570, 'X'),
- (0x10600, 'V'),
- (0x10737, 'X'),
- (0x10740, 'V'),
- (0x10756, 'X'),
- (0x10760, 'V'),
- (0x10768, 'X'),
- (0x10800, 'V'),
- (0x10806, 'X'),
- (0x10808, 'V'),
- (0x10809, 'X'),
- (0x1080A, 'V'),
- (0x10836, 'X'),
- (0x10837, 'V'),
- (0x10839, 'X'),
- (0x1083C, 'V'),
- (0x1083D, 'X'),
- (0x1083F, 'V'),
- (0x10856, 'X'),
- (0x10857, 'V'),
- (0x1089F, 'X'),
- (0x108A7, 'V'),
- (0x108B0, 'X'),
- (0x108E0, 'V'),
- (0x108F3, 'X'),
- (0x108F4, 'V'),
- (0x108F6, 'X'),
- (0x108FB, 'V'),
- (0x1091C, 'X'),
- (0x1091F, 'V'),
- (0x1093A, 'X'),
- (0x1093F, 'V'),
- (0x10940, 'X'),
- (0x10980, 'V'),
- (0x109B8, 'X'),
- (0x109BC, 'V'),
- (0x109D0, 'X'),
- (0x109D2, 'V'),
- (0x10A04, 'X'),
- (0x10A05, 'V'),
- (0x10A07, 'X'),
- (0x10A0C, 'V'),
- (0x10A14, 'X'),
- (0x10A15, 'V'),
- (0x10A18, 'X'),
- (0x10A19, 'V'),
- (0x10A36, 'X'),
- (0x10A38, 'V'),
- (0x10A3B, 'X'),
- (0x10A3F, 'V'),
- (0x10A49, 'X'),
- (0x10A50, 'V'),
- (0x10A59, 'X'),
- (0x10A60, 'V'),
- (0x10AA0, 'X'),
- (0x10AC0, 'V'),
- (0x10AE7, 'X'),
- (0x10AEB, 'V'),
- (0x10AF7, 'X'),
- (0x10B00, 'V'),
- (0x10B36, 'X'),
- (0x10B39, 'V'),
- (0x10B56, 'X'),
- (0x10B58, 'V'),
- (0x10B73, 'X'),
- (0x10B78, 'V'),
- (0x10B92, 'X'),
- (0x10B99, 'V'),
- (0x10B9D, 'X'),
- (0x10BA9, 'V'),
- (0x10BB0, 'X'),
+ (0x10B36, "X"),
+ (0x10B39, "V"),
+ (0x10B56, "X"),
+ (0x10B58, "V"),
+ (0x10B73, "X"),
+ (0x10B78, "V"),
+ (0x10B92, "X"),
+ (0x10B99, "V"),
+ (0x10B9D, "X"),
+ (0x10BA9, "V"),
+ (0x10BB0, "X"),
+ (0x10C00, "V"),
+ (0x10C49, "X"),
+ (0x10C80, "M", "𐳀"),
+ (0x10C81, "M", "𐳁"),
+ (0x10C82, "M", "𐳂"),
+ (0x10C83, "M", "𐳃"),
+ (0x10C84, "M", "𐳄"),
+ (0x10C85, "M", "𐳅"),
+ (0x10C86, "M", "𐳆"),
+ (0x10C87, "M", "𐳇"),
+ (0x10C88, "M", "𐳈"),
+ (0x10C89, "M", "𐳉"),
+ (0x10C8A, "M", "𐳊"),
+ (0x10C8B, "M", "𐳋"),
+ (0x10C8C, "M", "𐳌"),
+ (0x10C8D, "M", "𐳍"),
+ (0x10C8E, "M", "𐳎"),
+ (0x10C8F, "M", "𐳏"),
+ (0x10C90, "M", "𐳐"),
+ (0x10C91, "M", "𐳑"),
+ (0x10C92, "M", "𐳒"),
+ (0x10C93, "M", "𐳓"),
+ (0x10C94, "M", "𐳔"),
+ (0x10C95, "M", "𐳕"),
+ (0x10C96, "M", "𐳖"),
+ (0x10C97, "M", "𐳗"),
+ (0x10C98, "M", "𐳘"),
+ (0x10C99, "M", "𐳙"),
+ (0x10C9A, "M", "𐳚"),
+ (0x10C9B, "M", "𐳛"),
+ (0x10C9C, "M", "𐳜"),
+ (0x10C9D, "M", "𐳝"),
+ (0x10C9E, "M", "𐳞"),
+ (0x10C9F, "M", "𐳟"),
+ (0x10CA0, "M", "𐳠"),
+ (0x10CA1, "M", "𐳡"),
+ (0x10CA2, "M", "𐳢"),
+ (0x10CA3, "M", "𐳣"),
+ (0x10CA4, "M", "𐳤"),
+ (0x10CA5, "M", "𐳥"),
+ (0x10CA6, "M", "𐳦"),
+ (0x10CA7, "M", "𐳧"),
+ (0x10CA8, "M", "𐳨"),
+ (0x10CA9, "M", "𐳩"),
+ (0x10CAA, "M", "𐳪"),
+ (0x10CAB, "M", "𐳫"),
+ (0x10CAC, "M", "𐳬"),
+ (0x10CAD, "M", "𐳭"),
+ (0x10CAE, "M", "𐳮"),
+ (0x10CAF, "M", "𐳯"),
+ (0x10CB0, "M", "𐳰"),
+ (0x10CB1, "M", "𐳱"),
+ (0x10CB2, "M", "𐳲"),
+ (0x10CB3, "X"),
+ (0x10CC0, "V"),
+ (0x10CF3, "X"),
+ (0x10CFA, "V"),
+ (0x10D28, "X"),
+ (0x10D30, "V"),
+ (0x10D3A, "X"),
+ (0x10E60, "V"),
+ (0x10E7F, "X"),
+ (0x10E80, "V"),
+ (0x10EAA, "X"),
+ (0x10EAB, "V"),
+ (0x10EAE, "X"),
+ (0x10EB0, "V"),
+ (0x10EB2, "X"),
+ (0x10EFD, "V"),
+ (0x10F28, "X"),
+ (0x10F30, "V"),
+ (0x10F5A, "X"),
+ (0x10F70, "V"),
+ (0x10F8A, "X"),
+ (0x10FB0, "V"),
+ (0x10FCC, "X"),
+ (0x10FE0, "V"),
+ (0x10FF7, "X"),
+ (0x11000, "V"),
+ (0x1104E, "X"),
+ (0x11052, "V"),
+ (0x11076, "X"),
+ (0x1107F, "V"),
+ (0x110BD, "X"),
+ (0x110BE, "V"),
+ (0x110C3, "X"),
+ (0x110D0, "V"),
+ (0x110E9, "X"),
+ (0x110F0, "V"),
]
-def _seg_55():
+
+def _seg_57() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x10C00, 'V'),
- (0x10C49, 'X'),
- (0x10C80, 'M', u'𐳀'),
- (0x10C81, 'M', u'𐳁'),
- (0x10C82, 'M', u'𐳂'),
- (0x10C83, 'M', u'𐳃'),
- (0x10C84, 'M', u'𐳄'),
- (0x10C85, 'M', u'𐳅'),
- (0x10C86, 'M', u'𐳆'),
- (0x10C87, 'M', u'𐳇'),
- (0x10C88, 'M', u'𐳈'),
- (0x10C89, 'M', u'𐳉'),
- (0x10C8A, 'M', u'𐳊'),
- (0x10C8B, 'M', u'𐳋'),
- (0x10C8C, 'M', u'𐳌'),
- (0x10C8D, 'M', u'𐳍'),
- (0x10C8E, 'M', u'𐳎'),
- (0x10C8F, 'M', u'𐳏'),
- (0x10C90, 'M', u'𐳐'),
- (0x10C91, 'M', u'𐳑'),
- (0x10C92, 'M', u'𐳒'),
- (0x10C93, 'M', u'𐳓'),
- (0x10C94, 'M', u'𐳔'),
- (0x10C95, 'M', u'𐳕'),
- (0x10C96, 'M', u'𐳖'),
- (0x10C97, 'M', u'𐳗'),
- (0x10C98, 'M', u'𐳘'),
- (0x10C99, 'M', u'𐳙'),
- (0x10C9A, 'M', u'𐳚'),
- (0x10C9B, 'M', u'𐳛'),
- (0x10C9C, 'M', u'𐳜'),
- (0x10C9D, 'M', u'𐳝'),
- (0x10C9E, 'M', u'𐳞'),
- (0x10C9F, 'M', u'𐳟'),
- (0x10CA0, 'M', u'𐳠'),
- (0x10CA1, 'M', u'𐳡'),
- (0x10CA2, 'M', u'𐳢'),
- (0x10CA3, 'M', u'𐳣'),
- (0x10CA4, 'M', u'𐳤'),
- (0x10CA5, 'M', u'𐳥'),
- (0x10CA6, 'M', u'𐳦'),
- (0x10CA7, 'M', u'𐳧'),
- (0x10CA8, 'M', u'𐳨'),
- (0x10CA9, 'M', u'𐳩'),
- (0x10CAA, 'M', u'𐳪'),
- (0x10CAB, 'M', u'𐳫'),
- (0x10CAC, 'M', u'𐳬'),
- (0x10CAD, 'M', u'𐳭'),
- (0x10CAE, 'M', u'𐳮'),
- (0x10CAF, 'M', u'𐳯'),
- (0x10CB0, 'M', u'𐳰'),
- (0x10CB1, 'M', u'𐳱'),
- (0x10CB2, 'M', u'𐳲'),
- (0x10CB3, 'X'),
- (0x10CC0, 'V'),
- (0x10CF3, 'X'),
- (0x10CFA, 'V'),
- (0x10D28, 'X'),
- (0x10D30, 'V'),
- (0x10D3A, 'X'),
- (0x10E60, 'V'),
- (0x10E7F, 'X'),
- (0x10E80, 'V'),
- (0x10EAA, 'X'),
- (0x10EAB, 'V'),
- (0x10EAE, 'X'),
- (0x10EB0, 'V'),
- (0x10EB2, 'X'),
- (0x10F00, 'V'),
- (0x10F28, 'X'),
- (0x10F30, 'V'),
- (0x10F5A, 'X'),
- (0x10FB0, 'V'),
- (0x10FCC, 'X'),
- (0x10FE0, 'V'),
- (0x10FF7, 'X'),
- (0x11000, 'V'),
- (0x1104E, 'X'),
- (0x11052, 'V'),
- (0x11070, 'X'),
- (0x1107F, 'V'),
- (0x110BD, 'X'),
- (0x110BE, 'V'),
- (0x110C2, 'X'),
- (0x110D0, 'V'),
- (0x110E9, 'X'),
- (0x110F0, 'V'),
- (0x110FA, 'X'),
- (0x11100, 'V'),
- (0x11135, 'X'),
- (0x11136, 'V'),
- (0x11148, 'X'),
- (0x11150, 'V'),
- (0x11177, 'X'),
- (0x11180, 'V'),
- (0x111E0, 'X'),
- (0x111E1, 'V'),
- (0x111F5, 'X'),
- (0x11200, 'V'),
- (0x11212, 'X'),
+ (0x110FA, "X"),
+ (0x11100, "V"),
+ (0x11135, "X"),
+ (0x11136, "V"),
+ (0x11148, "X"),
+ (0x11150, "V"),
+ (0x11177, "X"),
+ (0x11180, "V"),
+ (0x111E0, "X"),
+ (0x111E1, "V"),
+ (0x111F5, "X"),
+ (0x11200, "V"),
+ (0x11212, "X"),
+ (0x11213, "V"),
+ (0x11242, "X"),
+ (0x11280, "V"),
+ (0x11287, "X"),
+ (0x11288, "V"),
+ (0x11289, "X"),
+ (0x1128A, "V"),
+ (0x1128E, "X"),
+ (0x1128F, "V"),
+ (0x1129E, "X"),
+ (0x1129F, "V"),
+ (0x112AA, "X"),
+ (0x112B0, "V"),
+ (0x112EB, "X"),
+ (0x112F0, "V"),
+ (0x112FA, "X"),
+ (0x11300, "V"),
+ (0x11304, "X"),
+ (0x11305, "V"),
+ (0x1130D, "X"),
+ (0x1130F, "V"),
+ (0x11311, "X"),
+ (0x11313, "V"),
+ (0x11329, "X"),
+ (0x1132A, "V"),
+ (0x11331, "X"),
+ (0x11332, "V"),
+ (0x11334, "X"),
+ (0x11335, "V"),
+ (0x1133A, "X"),
+ (0x1133B, "V"),
+ (0x11345, "X"),
+ (0x11347, "V"),
+ (0x11349, "X"),
+ (0x1134B, "V"),
+ (0x1134E, "X"),
+ (0x11350, "V"),
+ (0x11351, "X"),
+ (0x11357, "V"),
+ (0x11358, "X"),
+ (0x1135D, "V"),
+ (0x11364, "X"),
+ (0x11366, "V"),
+ (0x1136D, "X"),
+ (0x11370, "V"),
+ (0x11375, "X"),
+ (0x11400, "V"),
+ (0x1145C, "X"),
+ (0x1145D, "V"),
+ (0x11462, "X"),
+ (0x11480, "V"),
+ (0x114C8, "X"),
+ (0x114D0, "V"),
+ (0x114DA, "X"),
+ (0x11580, "V"),
+ (0x115B6, "X"),
+ (0x115B8, "V"),
+ (0x115DE, "X"),
+ (0x11600, "V"),
+ (0x11645, "X"),
+ (0x11650, "V"),
+ (0x1165A, "X"),
+ (0x11660, "V"),
+ (0x1166D, "X"),
+ (0x11680, "V"),
+ (0x116BA, "X"),
+ (0x116C0, "V"),
+ (0x116CA, "X"),
+ (0x11700, "V"),
+ (0x1171B, "X"),
+ (0x1171D, "V"),
+ (0x1172C, "X"),
+ (0x11730, "V"),
+ (0x11747, "X"),
+ (0x11800, "V"),
+ (0x1183C, "X"),
+ (0x118A0, "M", "𑣀"),
+ (0x118A1, "M", "𑣁"),
+ (0x118A2, "M", "𑣂"),
+ (0x118A3, "M", "𑣃"),
+ (0x118A4, "M", "𑣄"),
+ (0x118A5, "M", "𑣅"),
+ (0x118A6, "M", "𑣆"),
+ (0x118A7, "M", "𑣇"),
+ (0x118A8, "M", "𑣈"),
+ (0x118A9, "M", "𑣉"),
+ (0x118AA, "M", "𑣊"),
]
-def _seg_56():
+
+def _seg_58() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x11213, 'V'),
- (0x1123F, 'X'),
- (0x11280, 'V'),
- (0x11287, 'X'),
- (0x11288, 'V'),
- (0x11289, 'X'),
- (0x1128A, 'V'),
- (0x1128E, 'X'),
- (0x1128F, 'V'),
- (0x1129E, 'X'),
- (0x1129F, 'V'),
- (0x112AA, 'X'),
- (0x112B0, 'V'),
- (0x112EB, 'X'),
- (0x112F0, 'V'),
- (0x112FA, 'X'),
- (0x11300, 'V'),
- (0x11304, 'X'),
- (0x11305, 'V'),
- (0x1130D, 'X'),
- (0x1130F, 'V'),
- (0x11311, 'X'),
- (0x11313, 'V'),
- (0x11329, 'X'),
- (0x1132A, 'V'),
- (0x11331, 'X'),
- (0x11332, 'V'),
- (0x11334, 'X'),
- (0x11335, 'V'),
- (0x1133A, 'X'),
- (0x1133B, 'V'),
- (0x11345, 'X'),
- (0x11347, 'V'),
- (0x11349, 'X'),
- (0x1134B, 'V'),
- (0x1134E, 'X'),
- (0x11350, 'V'),
- (0x11351, 'X'),
- (0x11357, 'V'),
- (0x11358, 'X'),
- (0x1135D, 'V'),
- (0x11364, 'X'),
- (0x11366, 'V'),
- (0x1136D, 'X'),
- (0x11370, 'V'),
- (0x11375, 'X'),
- (0x11400, 'V'),
- (0x1145C, 'X'),
- (0x1145D, 'V'),
- (0x11462, 'X'),
- (0x11480, 'V'),
- (0x114C8, 'X'),
- (0x114D0, 'V'),
- (0x114DA, 'X'),
- (0x11580, 'V'),
- (0x115B6, 'X'),
- (0x115B8, 'V'),
- (0x115DE, 'X'),
- (0x11600, 'V'),
- (0x11645, 'X'),
- (0x11650, 'V'),
- (0x1165A, 'X'),
- (0x11660, 'V'),
- (0x1166D, 'X'),
- (0x11680, 'V'),
- (0x116B9, 'X'),
- (0x116C0, 'V'),
- (0x116CA, 'X'),
- (0x11700, 'V'),
- (0x1171B, 'X'),
- (0x1171D, 'V'),
- (0x1172C, 'X'),
- (0x11730, 'V'),
- (0x11740, 'X'),
- (0x11800, 'V'),
- (0x1183C, 'X'),
- (0x118A0, 'M', u'𑣀'),
- (0x118A1, 'M', u'𑣁'),
- (0x118A2, 'M', u'𑣂'),
- (0x118A3, 'M', u'𑣃'),
- (0x118A4, 'M', u'𑣄'),
- (0x118A5, 'M', u'𑣅'),
- (0x118A6, 'M', u'𑣆'),
- (0x118A7, 'M', u'𑣇'),
- (0x118A8, 'M', u'𑣈'),
- (0x118A9, 'M', u'𑣉'),
- (0x118AA, 'M', u'𑣊'),
- (0x118AB, 'M', u'𑣋'),
- (0x118AC, 'M', u'𑣌'),
- (0x118AD, 'M', u'𑣍'),
- (0x118AE, 'M', u'𑣎'),
- (0x118AF, 'M', u'𑣏'),
- (0x118B0, 'M', u'𑣐'),
- (0x118B1, 'M', u'𑣑'),
- (0x118B2, 'M', u'𑣒'),
- (0x118B3, 'M', u'𑣓'),
- (0x118B4, 'M', u'𑣔'),
- (0x118B5, 'M', u'𑣕'),
- (0x118B6, 'M', u'𑣖'),
- (0x118B7, 'M', u'𑣗'),
+ (0x118AB, "M", "𑣋"),
+ (0x118AC, "M", "𑣌"),
+ (0x118AD, "M", "𑣍"),
+ (0x118AE, "M", "𑣎"),
+ (0x118AF, "M", "𑣏"),
+ (0x118B0, "M", "𑣐"),
+ (0x118B1, "M", "𑣑"),
+ (0x118B2, "M", "𑣒"),
+ (0x118B3, "M", "𑣓"),
+ (0x118B4, "M", "𑣔"),
+ (0x118B5, "M", "𑣕"),
+ (0x118B6, "M", "𑣖"),
+ (0x118B7, "M", "𑣗"),
+ (0x118B8, "M", "𑣘"),
+ (0x118B9, "M", "𑣙"),
+ (0x118BA, "M", "𑣚"),
+ (0x118BB, "M", "𑣛"),
+ (0x118BC, "M", "𑣜"),
+ (0x118BD, "M", "𑣝"),
+ (0x118BE, "M", "𑣞"),
+ (0x118BF, "M", "𑣟"),
+ (0x118C0, "V"),
+ (0x118F3, "X"),
+ (0x118FF, "V"),
+ (0x11907, "X"),
+ (0x11909, "V"),
+ (0x1190A, "X"),
+ (0x1190C, "V"),
+ (0x11914, "X"),
+ (0x11915, "V"),
+ (0x11917, "X"),
+ (0x11918, "V"),
+ (0x11936, "X"),
+ (0x11937, "V"),
+ (0x11939, "X"),
+ (0x1193B, "V"),
+ (0x11947, "X"),
+ (0x11950, "V"),
+ (0x1195A, "X"),
+ (0x119A0, "V"),
+ (0x119A8, "X"),
+ (0x119AA, "V"),
+ (0x119D8, "X"),
+ (0x119DA, "V"),
+ (0x119E5, "X"),
+ (0x11A00, "V"),
+ (0x11A48, "X"),
+ (0x11A50, "V"),
+ (0x11AA3, "X"),
+ (0x11AB0, "V"),
+ (0x11AF9, "X"),
+ (0x11B00, "V"),
+ (0x11B0A, "X"),
+ (0x11C00, "V"),
+ (0x11C09, "X"),
+ (0x11C0A, "V"),
+ (0x11C37, "X"),
+ (0x11C38, "V"),
+ (0x11C46, "X"),
+ (0x11C50, "V"),
+ (0x11C6D, "X"),
+ (0x11C70, "V"),
+ (0x11C90, "X"),
+ (0x11C92, "V"),
+ (0x11CA8, "X"),
+ (0x11CA9, "V"),
+ (0x11CB7, "X"),
+ (0x11D00, "V"),
+ (0x11D07, "X"),
+ (0x11D08, "V"),
+ (0x11D0A, "X"),
+ (0x11D0B, "V"),
+ (0x11D37, "X"),
+ (0x11D3A, "V"),
+ (0x11D3B, "X"),
+ (0x11D3C, "V"),
+ (0x11D3E, "X"),
+ (0x11D3F, "V"),
+ (0x11D48, "X"),
+ (0x11D50, "V"),
+ (0x11D5A, "X"),
+ (0x11D60, "V"),
+ (0x11D66, "X"),
+ (0x11D67, "V"),
+ (0x11D69, "X"),
+ (0x11D6A, "V"),
+ (0x11D8F, "X"),
+ (0x11D90, "V"),
+ (0x11D92, "X"),
+ (0x11D93, "V"),
+ (0x11D99, "X"),
+ (0x11DA0, "V"),
+ (0x11DAA, "X"),
+ (0x11EE0, "V"),
+ (0x11EF9, "X"),
+ (0x11F00, "V"),
+ (0x11F11, "X"),
+ (0x11F12, "V"),
+ (0x11F3B, "X"),
+ (0x11F3E, "V"),
]
-def _seg_57():
+
+def _seg_59() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x118B8, 'M', u'𑣘'),
- (0x118B9, 'M', u'𑣙'),
- (0x118BA, 'M', u'𑣚'),
- (0x118BB, 'M', u'𑣛'),
- (0x118BC, 'M', u'𑣜'),
- (0x118BD, 'M', u'𑣝'),
- (0x118BE, 'M', u'𑣞'),
- (0x118BF, 'M', u'𑣟'),
- (0x118C0, 'V'),
- (0x118F3, 'X'),
- (0x118FF, 'V'),
- (0x11907, 'X'),
- (0x11909, 'V'),
- (0x1190A, 'X'),
- (0x1190C, 'V'),
- (0x11914, 'X'),
- (0x11915, 'V'),
- (0x11917, 'X'),
- (0x11918, 'V'),
- (0x11936, 'X'),
- (0x11937, 'V'),
- (0x11939, 'X'),
- (0x1193B, 'V'),
- (0x11947, 'X'),
- (0x11950, 'V'),
- (0x1195A, 'X'),
- (0x119A0, 'V'),
- (0x119A8, 'X'),
- (0x119AA, 'V'),
- (0x119D8, 'X'),
- (0x119DA, 'V'),
- (0x119E5, 'X'),
- (0x11A00, 'V'),
- (0x11A48, 'X'),
- (0x11A50, 'V'),
- (0x11AA3, 'X'),
- (0x11AC0, 'V'),
- (0x11AF9, 'X'),
- (0x11C00, 'V'),
- (0x11C09, 'X'),
- (0x11C0A, 'V'),
- (0x11C37, 'X'),
- (0x11C38, 'V'),
- (0x11C46, 'X'),
- (0x11C50, 'V'),
- (0x11C6D, 'X'),
- (0x11C70, 'V'),
- (0x11C90, 'X'),
- (0x11C92, 'V'),
- (0x11CA8, 'X'),
- (0x11CA9, 'V'),
- (0x11CB7, 'X'),
- (0x11D00, 'V'),
- (0x11D07, 'X'),
- (0x11D08, 'V'),
- (0x11D0A, 'X'),
- (0x11D0B, 'V'),
- (0x11D37, 'X'),
- (0x11D3A, 'V'),
- (0x11D3B, 'X'),
- (0x11D3C, 'V'),
- (0x11D3E, 'X'),
- (0x11D3F, 'V'),
- (0x11D48, 'X'),
- (0x11D50, 'V'),
- (0x11D5A, 'X'),
- (0x11D60, 'V'),
- (0x11D66, 'X'),
- (0x11D67, 'V'),
- (0x11D69, 'X'),
- (0x11D6A, 'V'),
- (0x11D8F, 'X'),
- (0x11D90, 'V'),
- (0x11D92, 'X'),
- (0x11D93, 'V'),
- (0x11D99, 'X'),
- (0x11DA0, 'V'),
- (0x11DAA, 'X'),
- (0x11EE0, 'V'),
- (0x11EF9, 'X'),
- (0x11FB0, 'V'),
- (0x11FB1, 'X'),
- (0x11FC0, 'V'),
- (0x11FF2, 'X'),
- (0x11FFF, 'V'),
- (0x1239A, 'X'),
- (0x12400, 'V'),
- (0x1246F, 'X'),
- (0x12470, 'V'),
- (0x12475, 'X'),
- (0x12480, 'V'),
- (0x12544, 'X'),
- (0x13000, 'V'),
- (0x1342F, 'X'),
- (0x14400, 'V'),
- (0x14647, 'X'),
- (0x16800, 'V'),
- (0x16A39, 'X'),
- (0x16A40, 'V'),
- (0x16A5F, 'X'),
+ (0x11F5A, "X"),
+ (0x11FB0, "V"),
+ (0x11FB1, "X"),
+ (0x11FC0, "V"),
+ (0x11FF2, "X"),
+ (0x11FFF, "V"),
+ (0x1239A, "X"),
+ (0x12400, "V"),
+ (0x1246F, "X"),
+ (0x12470, "V"),
+ (0x12475, "X"),
+ (0x12480, "V"),
+ (0x12544, "X"),
+ (0x12F90, "V"),
+ (0x12FF3, "X"),
+ (0x13000, "V"),
+ (0x13430, "X"),
+ (0x13440, "V"),
+ (0x13456, "X"),
+ (0x14400, "V"),
+ (0x14647, "X"),
+ (0x16800, "V"),
+ (0x16A39, "X"),
+ (0x16A40, "V"),
+ (0x16A5F, "X"),
+ (0x16A60, "V"),
+ (0x16A6A, "X"),
+ (0x16A6E, "V"),
+ (0x16ABF, "X"),
+ (0x16AC0, "V"),
+ (0x16ACA, "X"),
+ (0x16AD0, "V"),
+ (0x16AEE, "X"),
+ (0x16AF0, "V"),
+ (0x16AF6, "X"),
+ (0x16B00, "V"),
+ (0x16B46, "X"),
+ (0x16B50, "V"),
+ (0x16B5A, "X"),
+ (0x16B5B, "V"),
+ (0x16B62, "X"),
+ (0x16B63, "V"),
+ (0x16B78, "X"),
+ (0x16B7D, "V"),
+ (0x16B90, "X"),
+ (0x16E40, "M", "𖹠"),
+ (0x16E41, "M", "𖹡"),
+ (0x16E42, "M", "𖹢"),
+ (0x16E43, "M", "𖹣"),
+ (0x16E44, "M", "𖹤"),
+ (0x16E45, "M", "𖹥"),
+ (0x16E46, "M", "𖹦"),
+ (0x16E47, "M", "𖹧"),
+ (0x16E48, "M", "𖹨"),
+ (0x16E49, "M", "𖹩"),
+ (0x16E4A, "M", "𖹪"),
+ (0x16E4B, "M", "𖹫"),
+ (0x16E4C, "M", "𖹬"),
+ (0x16E4D, "M", "𖹭"),
+ (0x16E4E, "M", "𖹮"),
+ (0x16E4F, "M", "𖹯"),
+ (0x16E50, "M", "𖹰"),
+ (0x16E51, "M", "𖹱"),
+ (0x16E52, "M", "𖹲"),
+ (0x16E53, "M", "𖹳"),
+ (0x16E54, "M", "𖹴"),
+ (0x16E55, "M", "𖹵"),
+ (0x16E56, "M", "𖹶"),
+ (0x16E57, "M", "𖹷"),
+ (0x16E58, "M", "𖹸"),
+ (0x16E59, "M", "𖹹"),
+ (0x16E5A, "M", "𖹺"),
+ (0x16E5B, "M", "𖹻"),
+ (0x16E5C, "M", "𖹼"),
+ (0x16E5D, "M", "𖹽"),
+ (0x16E5E, "M", "𖹾"),
+ (0x16E5F, "M", "𖹿"),
+ (0x16E60, "V"),
+ (0x16E9B, "X"),
+ (0x16F00, "V"),
+ (0x16F4B, "X"),
+ (0x16F4F, "V"),
+ (0x16F88, "X"),
+ (0x16F8F, "V"),
+ (0x16FA0, "X"),
+ (0x16FE0, "V"),
+ (0x16FE5, "X"),
+ (0x16FF0, "V"),
+ (0x16FF2, "X"),
+ (0x17000, "V"),
+ (0x187F8, "X"),
+ (0x18800, "V"),
+ (0x18CD6, "X"),
+ (0x18D00, "V"),
+ (0x18D09, "X"),
+ (0x1AFF0, "V"),
+ (0x1AFF4, "X"),
+ (0x1AFF5, "V"),
+ (0x1AFFC, "X"),
+ (0x1AFFD, "V"),
]
-def _seg_58():
+
+def _seg_60() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x16A60, 'V'),
- (0x16A6A, 'X'),
- (0x16A6E, 'V'),
- (0x16A70, 'X'),
- (0x16AD0, 'V'),
- (0x16AEE, 'X'),
- (0x16AF0, 'V'),
- (0x16AF6, 'X'),
- (0x16B00, 'V'),
- (0x16B46, 'X'),
- (0x16B50, 'V'),
- (0x16B5A, 'X'),
- (0x16B5B, 'V'),
- (0x16B62, 'X'),
- (0x16B63, 'V'),
- (0x16B78, 'X'),
- (0x16B7D, 'V'),
- (0x16B90, 'X'),
- (0x16E40, 'M', u'𖹠'),
- (0x16E41, 'M', u'𖹡'),
- (0x16E42, 'M', u'𖹢'),
- (0x16E43, 'M', u'𖹣'),
- (0x16E44, 'M', u'𖹤'),
- (0x16E45, 'M', u'𖹥'),
- (0x16E46, 'M', u'𖹦'),
- (0x16E47, 'M', u'𖹧'),
- (0x16E48, 'M', u'𖹨'),
- (0x16E49, 'M', u'𖹩'),
- (0x16E4A, 'M', u'𖹪'),
- (0x16E4B, 'M', u'𖹫'),
- (0x16E4C, 'M', u'𖹬'),
- (0x16E4D, 'M', u'𖹭'),
- (0x16E4E, 'M', u'𖹮'),
- (0x16E4F, 'M', u'𖹯'),
- (0x16E50, 'M', u'𖹰'),
- (0x16E51, 'M', u'𖹱'),
- (0x16E52, 'M', u'𖹲'),
- (0x16E53, 'M', u'𖹳'),
- (0x16E54, 'M', u'𖹴'),
- (0x16E55, 'M', u'𖹵'),
- (0x16E56, 'M', u'𖹶'),
- (0x16E57, 'M', u'𖹷'),
- (0x16E58, 'M', u'𖹸'),
- (0x16E59, 'M', u'𖹹'),
- (0x16E5A, 'M', u'𖹺'),
- (0x16E5B, 'M', u'𖹻'),
- (0x16E5C, 'M', u'𖹼'),
- (0x16E5D, 'M', u'𖹽'),
- (0x16E5E, 'M', u'𖹾'),
- (0x16E5F, 'M', u'𖹿'),
- (0x16E60, 'V'),
- (0x16E9B, 'X'),
- (0x16F00, 'V'),
- (0x16F4B, 'X'),
- (0x16F4F, 'V'),
- (0x16F88, 'X'),
- (0x16F8F, 'V'),
- (0x16FA0, 'X'),
- (0x16FE0, 'V'),
- (0x16FE5, 'X'),
- (0x16FF0, 'V'),
- (0x16FF2, 'X'),
- (0x17000, 'V'),
- (0x187F8, 'X'),
- (0x18800, 'V'),
- (0x18CD6, 'X'),
- (0x18D00, 'V'),
- (0x18D09, 'X'),
- (0x1B000, 'V'),
- (0x1B11F, 'X'),
- (0x1B150, 'V'),
- (0x1B153, 'X'),
- (0x1B164, 'V'),
- (0x1B168, 'X'),
- (0x1B170, 'V'),
- (0x1B2FC, 'X'),
- (0x1BC00, 'V'),
- (0x1BC6B, 'X'),
- (0x1BC70, 'V'),
- (0x1BC7D, 'X'),
- (0x1BC80, 'V'),
- (0x1BC89, 'X'),
- (0x1BC90, 'V'),
- (0x1BC9A, 'X'),
- (0x1BC9C, 'V'),
- (0x1BCA0, 'I'),
- (0x1BCA4, 'X'),
- (0x1D000, 'V'),
- (0x1D0F6, 'X'),
- (0x1D100, 'V'),
- (0x1D127, 'X'),
- (0x1D129, 'V'),
- (0x1D15E, 'M', u'𝅗𝅥'),
- (0x1D15F, 'M', u'𝅘𝅥'),
- (0x1D160, 'M', u'𝅘𝅥𝅮'),
- (0x1D161, 'M', u'𝅘𝅥𝅯'),
- (0x1D162, 'M', u'𝅘𝅥𝅰'),
- (0x1D163, 'M', u'𝅘𝅥𝅱'),
- (0x1D164, 'M', u'𝅘𝅥𝅲'),
- (0x1D165, 'V'),
+ (0x1AFFF, "X"),
+ (0x1B000, "V"),
+ (0x1B123, "X"),
+ (0x1B132, "V"),
+ (0x1B133, "X"),
+ (0x1B150, "V"),
+ (0x1B153, "X"),
+ (0x1B155, "V"),
+ (0x1B156, "X"),
+ (0x1B164, "V"),
+ (0x1B168, "X"),
+ (0x1B170, "V"),
+ (0x1B2FC, "X"),
+ (0x1BC00, "V"),
+ (0x1BC6B, "X"),
+ (0x1BC70, "V"),
+ (0x1BC7D, "X"),
+ (0x1BC80, "V"),
+ (0x1BC89, "X"),
+ (0x1BC90, "V"),
+ (0x1BC9A, "X"),
+ (0x1BC9C, "V"),
+ (0x1BCA0, "I"),
+ (0x1BCA4, "X"),
+ (0x1CF00, "V"),
+ (0x1CF2E, "X"),
+ (0x1CF30, "V"),
+ (0x1CF47, "X"),
+ (0x1CF50, "V"),
+ (0x1CFC4, "X"),
+ (0x1D000, "V"),
+ (0x1D0F6, "X"),
+ (0x1D100, "V"),
+ (0x1D127, "X"),
+ (0x1D129, "V"),
+ (0x1D15E, "M", "𝅗𝅥"),
+ (0x1D15F, "M", "𝅘𝅥"),
+ (0x1D160, "M", "𝅘𝅥𝅮"),
+ (0x1D161, "M", "𝅘𝅥𝅯"),
+ (0x1D162, "M", "𝅘𝅥𝅰"),
+ (0x1D163, "M", "𝅘𝅥𝅱"),
+ (0x1D164, "M", "𝅘𝅥𝅲"),
+ (0x1D165, "V"),
+ (0x1D173, "X"),
+ (0x1D17B, "V"),
+ (0x1D1BB, "M", "𝆹𝅥"),
+ (0x1D1BC, "M", "𝆺𝅥"),
+ (0x1D1BD, "M", "𝆹𝅥𝅮"),
+ (0x1D1BE, "M", "𝆺𝅥𝅮"),
+ (0x1D1BF, "M", "𝆹𝅥𝅯"),
+ (0x1D1C0, "M", "𝆺𝅥𝅯"),
+ (0x1D1C1, "V"),
+ (0x1D1EB, "X"),
+ (0x1D200, "V"),
+ (0x1D246, "X"),
+ (0x1D2C0, "V"),
+ (0x1D2D4, "X"),
+ (0x1D2E0, "V"),
+ (0x1D2F4, "X"),
+ (0x1D300, "V"),
+ (0x1D357, "X"),
+ (0x1D360, "V"),
+ (0x1D379, "X"),
+ (0x1D400, "M", "a"),
+ (0x1D401, "M", "b"),
+ (0x1D402, "M", "c"),
+ (0x1D403, "M", "d"),
+ (0x1D404, "M", "e"),
+ (0x1D405, "M", "f"),
+ (0x1D406, "M", "g"),
+ (0x1D407, "M", "h"),
+ (0x1D408, "M", "i"),
+ (0x1D409, "M", "j"),
+ (0x1D40A, "M", "k"),
+ (0x1D40B, "M", "l"),
+ (0x1D40C, "M", "m"),
+ (0x1D40D, "M", "n"),
+ (0x1D40E, "M", "o"),
+ (0x1D40F, "M", "p"),
+ (0x1D410, "M", "q"),
+ (0x1D411, "M", "r"),
+ (0x1D412, "M", "s"),
+ (0x1D413, "M", "t"),
+ (0x1D414, "M", "u"),
+ (0x1D415, "M", "v"),
+ (0x1D416, "M", "w"),
+ (0x1D417, "M", "x"),
+ (0x1D418, "M", "y"),
+ (0x1D419, "M", "z"),
+ (0x1D41A, "M", "a"),
+ (0x1D41B, "M", "b"),
+ (0x1D41C, "M", "c"),
+ (0x1D41D, "M", "d"),
+ (0x1D41E, "M", "e"),
+ (0x1D41F, "M", "f"),
+ (0x1D420, "M", "g"),
+ (0x1D421, "M", "h"),
+ (0x1D422, "M", "i"),
+ (0x1D423, "M", "j"),
+ (0x1D424, "M", "k"),
]
-def _seg_59():
+
+def _seg_61() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x1D173, 'X'),
- (0x1D17B, 'V'),
- (0x1D1BB, 'M', u'𝆹𝅥'),
- (0x1D1BC, 'M', u'𝆺𝅥'),
- (0x1D1BD, 'M', u'𝆹𝅥𝅮'),
- (0x1D1BE, 'M', u'𝆺𝅥𝅮'),
- (0x1D1BF, 'M', u'𝆹𝅥𝅯'),
- (0x1D1C0, 'M', u'𝆺𝅥𝅯'),
- (0x1D1C1, 'V'),
- (0x1D1E9, 'X'),
- (0x1D200, 'V'),
- (0x1D246, 'X'),
- (0x1D2E0, 'V'),
- (0x1D2F4, 'X'),
- (0x1D300, 'V'),
- (0x1D357, 'X'),
- (0x1D360, 'V'),
- (0x1D379, 'X'),
- (0x1D400, 'M', u'a'),
- (0x1D401, 'M', u'b'),
- (0x1D402, 'M', u'c'),
- (0x1D403, 'M', u'd'),
- (0x1D404, 'M', u'e'),
- (0x1D405, 'M', u'f'),
- (0x1D406, 'M', u'g'),
- (0x1D407, 'M', u'h'),
- (0x1D408, 'M', u'i'),
- (0x1D409, 'M', u'j'),
- (0x1D40A, 'M', u'k'),
- (0x1D40B, 'M', u'l'),
- (0x1D40C, 'M', u'm'),
- (0x1D40D, 'M', u'n'),
- (0x1D40E, 'M', u'o'),
- (0x1D40F, 'M', u'p'),
- (0x1D410, 'M', u'q'),
- (0x1D411, 'M', u'r'),
- (0x1D412, 'M', u's'),
- (0x1D413, 'M', u't'),
- (0x1D414, 'M', u'u'),
- (0x1D415, 'M', u'v'),
- (0x1D416, 'M', u'w'),
- (0x1D417, 'M', u'x'),
- (0x1D418, 'M', u'y'),
- (0x1D419, 'M', u'z'),
- (0x1D41A, 'M', u'a'),
- (0x1D41B, 'M', u'b'),
- (0x1D41C, 'M', u'c'),
- (0x1D41D, 'M', u'd'),
- (0x1D41E, 'M', u'e'),
- (0x1D41F, 'M', u'f'),
- (0x1D420, 'M', u'g'),
- (0x1D421, 'M', u'h'),
- (0x1D422, 'M', u'i'),
- (0x1D423, 'M', u'j'),
- (0x1D424, 'M', u'k'),
- (0x1D425, 'M', u'l'),
- (0x1D426, 'M', u'm'),
- (0x1D427, 'M', u'n'),
- (0x1D428, 'M', u'o'),
- (0x1D429, 'M', u'p'),
- (0x1D42A, 'M', u'q'),
- (0x1D42B, 'M', u'r'),
- (0x1D42C, 'M', u's'),
- (0x1D42D, 'M', u't'),
- (0x1D42E, 'M', u'u'),
- (0x1D42F, 'M', u'v'),
- (0x1D430, 'M', u'w'),
- (0x1D431, 'M', u'x'),
- (0x1D432, 'M', u'y'),
- (0x1D433, 'M', u'z'),
- (0x1D434, 'M', u'a'),
- (0x1D435, 'M', u'b'),
- (0x1D436, 'M', u'c'),
- (0x1D437, 'M', u'd'),
- (0x1D438, 'M', u'e'),
- (0x1D439, 'M', u'f'),
- (0x1D43A, 'M', u'g'),
- (0x1D43B, 'M', u'h'),
- (0x1D43C, 'M', u'i'),
- (0x1D43D, 'M', u'j'),
- (0x1D43E, 'M', u'k'),
- (0x1D43F, 'M', u'l'),
- (0x1D440, 'M', u'm'),
- (0x1D441, 'M', u'n'),
- (0x1D442, 'M', u'o'),
- (0x1D443, 'M', u'p'),
- (0x1D444, 'M', u'q'),
- (0x1D445, 'M', u'r'),
- (0x1D446, 'M', u's'),
- (0x1D447, 'M', u't'),
- (0x1D448, 'M', u'u'),
- (0x1D449, 'M', u'v'),
- (0x1D44A, 'M', u'w'),
- (0x1D44B, 'M', u'x'),
- (0x1D44C, 'M', u'y'),
- (0x1D44D, 'M', u'z'),
- (0x1D44E, 'M', u'a'),
- (0x1D44F, 'M', u'b'),
- (0x1D450, 'M', u'c'),
- (0x1D451, 'M', u'd'),
+ (0x1D425, "M", "l"),
+ (0x1D426, "M", "m"),
+ (0x1D427, "M", "n"),
+ (0x1D428, "M", "o"),
+ (0x1D429, "M", "p"),
+ (0x1D42A, "M", "q"),
+ (0x1D42B, "M", "r"),
+ (0x1D42C, "M", "s"),
+ (0x1D42D, "M", "t"),
+ (0x1D42E, "M", "u"),
+ (0x1D42F, "M", "v"),
+ (0x1D430, "M", "w"),
+ (0x1D431, "M", "x"),
+ (0x1D432, "M", "y"),
+ (0x1D433, "M", "z"),
+ (0x1D434, "M", "a"),
+ (0x1D435, "M", "b"),
+ (0x1D436, "M", "c"),
+ (0x1D437, "M", "d"),
+ (0x1D438, "M", "e"),
+ (0x1D439, "M", "f"),
+ (0x1D43A, "M", "g"),
+ (0x1D43B, "M", "h"),
+ (0x1D43C, "M", "i"),
+ (0x1D43D, "M", "j"),
+ (0x1D43E, "M", "k"),
+ (0x1D43F, "M", "l"),
+ (0x1D440, "M", "m"),
+ (0x1D441, "M", "n"),
+ (0x1D442, "M", "o"),
+ (0x1D443, "M", "p"),
+ (0x1D444, "M", "q"),
+ (0x1D445, "M", "r"),
+ (0x1D446, "M", "s"),
+ (0x1D447, "M", "t"),
+ (0x1D448, "M", "u"),
+ (0x1D449, "M", "v"),
+ (0x1D44A, "M", "w"),
+ (0x1D44B, "M", "x"),
+ (0x1D44C, "M", "y"),
+ (0x1D44D, "M", "z"),
+ (0x1D44E, "M", "a"),
+ (0x1D44F, "M", "b"),
+ (0x1D450, "M", "c"),
+ (0x1D451, "M", "d"),
+ (0x1D452, "M", "e"),
+ (0x1D453, "M", "f"),
+ (0x1D454, "M", "g"),
+ (0x1D455, "X"),
+ (0x1D456, "M", "i"),
+ (0x1D457, "M", "j"),
+ (0x1D458, "M", "k"),
+ (0x1D459, "M", "l"),
+ (0x1D45A, "M", "m"),
+ (0x1D45B, "M", "n"),
+ (0x1D45C, "M", "o"),
+ (0x1D45D, "M", "p"),
+ (0x1D45E, "M", "q"),
+ (0x1D45F, "M", "r"),
+ (0x1D460, "M", "s"),
+ (0x1D461, "M", "t"),
+ (0x1D462, "M", "u"),
+ (0x1D463, "M", "v"),
+ (0x1D464, "M", "w"),
+ (0x1D465, "M", "x"),
+ (0x1D466, "M", "y"),
+ (0x1D467, "M", "z"),
+ (0x1D468, "M", "a"),
+ (0x1D469, "M", "b"),
+ (0x1D46A, "M", "c"),
+ (0x1D46B, "M", "d"),
+ (0x1D46C, "M", "e"),
+ (0x1D46D, "M", "f"),
+ (0x1D46E, "M", "g"),
+ (0x1D46F, "M", "h"),
+ (0x1D470, "M", "i"),
+ (0x1D471, "M", "j"),
+ (0x1D472, "M", "k"),
+ (0x1D473, "M", "l"),
+ (0x1D474, "M", "m"),
+ (0x1D475, "M", "n"),
+ (0x1D476, "M", "o"),
+ (0x1D477, "M", "p"),
+ (0x1D478, "M", "q"),
+ (0x1D479, "M", "r"),
+ (0x1D47A, "M", "s"),
+ (0x1D47B, "M", "t"),
+ (0x1D47C, "M", "u"),
+ (0x1D47D, "M", "v"),
+ (0x1D47E, "M", "w"),
+ (0x1D47F, "M", "x"),
+ (0x1D480, "M", "y"),
+ (0x1D481, "M", "z"),
+ (0x1D482, "M", "a"),
+ (0x1D483, "M", "b"),
+ (0x1D484, "M", "c"),
+ (0x1D485, "M", "d"),
+ (0x1D486, "M", "e"),
+ (0x1D487, "M", "f"),
+ (0x1D488, "M", "g"),
]
-def _seg_60():
+
+def _seg_62() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x1D452, 'M', u'e'),
- (0x1D453, 'M', u'f'),
- (0x1D454, 'M', u'g'),
- (0x1D455, 'X'),
- (0x1D456, 'M', u'i'),
- (0x1D457, 'M', u'j'),
- (0x1D458, 'M', u'k'),
- (0x1D459, 'M', u'l'),
- (0x1D45A, 'M', u'm'),
- (0x1D45B, 'M', u'n'),
- (0x1D45C, 'M', u'o'),
- (0x1D45D, 'M', u'p'),
- (0x1D45E, 'M', u'q'),
- (0x1D45F, 'M', u'r'),
- (0x1D460, 'M', u's'),
- (0x1D461, 'M', u't'),
- (0x1D462, 'M', u'u'),
- (0x1D463, 'M', u'v'),
- (0x1D464, 'M', u'w'),
- (0x1D465, 'M', u'x'),
- (0x1D466, 'M', u'y'),
- (0x1D467, 'M', u'z'),
- (0x1D468, 'M', u'a'),
- (0x1D469, 'M', u'b'),
- (0x1D46A, 'M', u'c'),
- (0x1D46B, 'M', u'd'),
- (0x1D46C, 'M', u'e'),
- (0x1D46D, 'M', u'f'),
- (0x1D46E, 'M', u'g'),
- (0x1D46F, 'M', u'h'),
- (0x1D470, 'M', u'i'),
- (0x1D471, 'M', u'j'),
- (0x1D472, 'M', u'k'),
- (0x1D473, 'M', u'l'),
- (0x1D474, 'M', u'm'),
- (0x1D475, 'M', u'n'),
- (0x1D476, 'M', u'o'),
- (0x1D477, 'M', u'p'),
- (0x1D478, 'M', u'q'),
- (0x1D479, 'M', u'r'),
- (0x1D47A, 'M', u's'),
- (0x1D47B, 'M', u't'),
- (0x1D47C, 'M', u'u'),
- (0x1D47D, 'M', u'v'),
- (0x1D47E, 'M', u'w'),
- (0x1D47F, 'M', u'x'),
- (0x1D480, 'M', u'y'),
- (0x1D481, 'M', u'z'),
- (0x1D482, 'M', u'a'),
- (0x1D483, 'M', u'b'),
- (0x1D484, 'M', u'c'),
- (0x1D485, 'M', u'd'),
- (0x1D486, 'M', u'e'),
- (0x1D487, 'M', u'f'),
- (0x1D488, 'M', u'g'),
- (0x1D489, 'M', u'h'),
- (0x1D48A, 'M', u'i'),
- (0x1D48B, 'M', u'j'),
- (0x1D48C, 'M', u'k'),
- (0x1D48D, 'M', u'l'),
- (0x1D48E, 'M', u'm'),
- (0x1D48F, 'M', u'n'),
- (0x1D490, 'M', u'o'),
- (0x1D491, 'M', u'p'),
- (0x1D492, 'M', u'q'),
- (0x1D493, 'M', u'r'),
- (0x1D494, 'M', u's'),
- (0x1D495, 'M', u't'),
- (0x1D496, 'M', u'u'),
- (0x1D497, 'M', u'v'),
- (0x1D498, 'M', u'w'),
- (0x1D499, 'M', u'x'),
- (0x1D49A, 'M', u'y'),
- (0x1D49B, 'M', u'z'),
- (0x1D49C, 'M', u'a'),
- (0x1D49D, 'X'),
- (0x1D49E, 'M', u'c'),
- (0x1D49F, 'M', u'd'),
- (0x1D4A0, 'X'),
- (0x1D4A2, 'M', u'g'),
- (0x1D4A3, 'X'),
- (0x1D4A5, 'M', u'j'),
- (0x1D4A6, 'M', u'k'),
- (0x1D4A7, 'X'),
- (0x1D4A9, 'M', u'n'),
- (0x1D4AA, 'M', u'o'),
- (0x1D4AB, 'M', u'p'),
- (0x1D4AC, 'M', u'q'),
- (0x1D4AD, 'X'),
- (0x1D4AE, 'M', u's'),
- (0x1D4AF, 'M', u't'),
- (0x1D4B0, 'M', u'u'),
- (0x1D4B1, 'M', u'v'),
- (0x1D4B2, 'M', u'w'),
- (0x1D4B3, 'M', u'x'),
- (0x1D4B4, 'M', u'y'),
- (0x1D4B5, 'M', u'z'),
- (0x1D4B6, 'M', u'a'),
- (0x1D4B7, 'M', u'b'),
- (0x1D4B8, 'M', u'c'),
+ (0x1D489, "M", "h"),
+ (0x1D48A, "M", "i"),
+ (0x1D48B, "M", "j"),
+ (0x1D48C, "M", "k"),
+ (0x1D48D, "M", "l"),
+ (0x1D48E, "M", "m"),
+ (0x1D48F, "M", "n"),
+ (0x1D490, "M", "o"),
+ (0x1D491, "M", "p"),
+ (0x1D492, "M", "q"),
+ (0x1D493, "M", "r"),
+ (0x1D494, "M", "s"),
+ (0x1D495, "M", "t"),
+ (0x1D496, "M", "u"),
+ (0x1D497, "M", "v"),
+ (0x1D498, "M", "w"),
+ (0x1D499, "M", "x"),
+ (0x1D49A, "M", "y"),
+ (0x1D49B, "M", "z"),
+ (0x1D49C, "M", "a"),
+ (0x1D49D, "X"),
+ (0x1D49E, "M", "c"),
+ (0x1D49F, "M", "d"),
+ (0x1D4A0, "X"),
+ (0x1D4A2, "M", "g"),
+ (0x1D4A3, "X"),
+ (0x1D4A5, "M", "j"),
+ (0x1D4A6, "M", "k"),
+ (0x1D4A7, "X"),
+ (0x1D4A9, "M", "n"),
+ (0x1D4AA, "M", "o"),
+ (0x1D4AB, "M", "p"),
+ (0x1D4AC, "M", "q"),
+ (0x1D4AD, "X"),
+ (0x1D4AE, "M", "s"),
+ (0x1D4AF, "M", "t"),
+ (0x1D4B0, "M", "u"),
+ (0x1D4B1, "M", "v"),
+ (0x1D4B2, "M", "w"),
+ (0x1D4B3, "M", "x"),
+ (0x1D4B4, "M", "y"),
+ (0x1D4B5, "M", "z"),
+ (0x1D4B6, "M", "a"),
+ (0x1D4B7, "M", "b"),
+ (0x1D4B8, "M", "c"),
+ (0x1D4B9, "M", "d"),
+ (0x1D4BA, "X"),
+ (0x1D4BB, "M", "f"),
+ (0x1D4BC, "X"),
+ (0x1D4BD, "M", "h"),
+ (0x1D4BE, "M", "i"),
+ (0x1D4BF, "M", "j"),
+ (0x1D4C0, "M", "k"),
+ (0x1D4C1, "M", "l"),
+ (0x1D4C2, "M", "m"),
+ (0x1D4C3, "M", "n"),
+ (0x1D4C4, "X"),
+ (0x1D4C5, "M", "p"),
+ (0x1D4C6, "M", "q"),
+ (0x1D4C7, "M", "r"),
+ (0x1D4C8, "M", "s"),
+ (0x1D4C9, "M", "t"),
+ (0x1D4CA, "M", "u"),
+ (0x1D4CB, "M", "v"),
+ (0x1D4CC, "M", "w"),
+ (0x1D4CD, "M", "x"),
+ (0x1D4CE, "M", "y"),
+ (0x1D4CF, "M", "z"),
+ (0x1D4D0, "M", "a"),
+ (0x1D4D1, "M", "b"),
+ (0x1D4D2, "M", "c"),
+ (0x1D4D3, "M", "d"),
+ (0x1D4D4, "M", "e"),
+ (0x1D4D5, "M", "f"),
+ (0x1D4D6, "M", "g"),
+ (0x1D4D7, "M", "h"),
+ (0x1D4D8, "M", "i"),
+ (0x1D4D9, "M", "j"),
+ (0x1D4DA, "M", "k"),
+ (0x1D4DB, "M", "l"),
+ (0x1D4DC, "M", "m"),
+ (0x1D4DD, "M", "n"),
+ (0x1D4DE, "M", "o"),
+ (0x1D4DF, "M", "p"),
+ (0x1D4E0, "M", "q"),
+ (0x1D4E1, "M", "r"),
+ (0x1D4E2, "M", "s"),
+ (0x1D4E3, "M", "t"),
+ (0x1D4E4, "M", "u"),
+ (0x1D4E5, "M", "v"),
+ (0x1D4E6, "M", "w"),
+ (0x1D4E7, "M", "x"),
+ (0x1D4E8, "M", "y"),
+ (0x1D4E9, "M", "z"),
+ (0x1D4EA, "M", "a"),
+ (0x1D4EB, "M", "b"),
+ (0x1D4EC, "M", "c"),
+ (0x1D4ED, "M", "d"),
+ (0x1D4EE, "M", "e"),
+ (0x1D4EF, "M", "f"),
]
-def _seg_61():
+
+def _seg_63() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x1D4B9, 'M', u'd'),
- (0x1D4BA, 'X'),
- (0x1D4BB, 'M', u'f'),
- (0x1D4BC, 'X'),
- (0x1D4BD, 'M', u'h'),
- (0x1D4BE, 'M', u'i'),
- (0x1D4BF, 'M', u'j'),
- (0x1D4C0, 'M', u'k'),
- (0x1D4C1, 'M', u'l'),
- (0x1D4C2, 'M', u'm'),
- (0x1D4C3, 'M', u'n'),
- (0x1D4C4, 'X'),
- (0x1D4C5, 'M', u'p'),
- (0x1D4C6, 'M', u'q'),
- (0x1D4C7, 'M', u'r'),
- (0x1D4C8, 'M', u's'),
- (0x1D4C9, 'M', u't'),
- (0x1D4CA, 'M', u'u'),
- (0x1D4CB, 'M', u'v'),
- (0x1D4CC, 'M', u'w'),
- (0x1D4CD, 'M', u'x'),
- (0x1D4CE, 'M', u'y'),
- (0x1D4CF, 'M', u'z'),
- (0x1D4D0, 'M', u'a'),
- (0x1D4D1, 'M', u'b'),
- (0x1D4D2, 'M', u'c'),
- (0x1D4D3, 'M', u'd'),
- (0x1D4D4, 'M', u'e'),
- (0x1D4D5, 'M', u'f'),
- (0x1D4D6, 'M', u'g'),
- (0x1D4D7, 'M', u'h'),
- (0x1D4D8, 'M', u'i'),
- (0x1D4D9, 'M', u'j'),
- (0x1D4DA, 'M', u'k'),
- (0x1D4DB, 'M', u'l'),
- (0x1D4DC, 'M', u'm'),
- (0x1D4DD, 'M', u'n'),
- (0x1D4DE, 'M', u'o'),
- (0x1D4DF, 'M', u'p'),
- (0x1D4E0, 'M', u'q'),
- (0x1D4E1, 'M', u'r'),
- (0x1D4E2, 'M', u's'),
- (0x1D4E3, 'M', u't'),
- (0x1D4E4, 'M', u'u'),
- (0x1D4E5, 'M', u'v'),
- (0x1D4E6, 'M', u'w'),
- (0x1D4E7, 'M', u'x'),
- (0x1D4E8, 'M', u'y'),
- (0x1D4E9, 'M', u'z'),
- (0x1D4EA, 'M', u'a'),
- (0x1D4EB, 'M', u'b'),
- (0x1D4EC, 'M', u'c'),
- (0x1D4ED, 'M', u'd'),
- (0x1D4EE, 'M', u'e'),
- (0x1D4EF, 'M', u'f'),
- (0x1D4F0, 'M', u'g'),
- (0x1D4F1, 'M', u'h'),
- (0x1D4F2, 'M', u'i'),
- (0x1D4F3, 'M', u'j'),
- (0x1D4F4, 'M', u'k'),
- (0x1D4F5, 'M', u'l'),
- (0x1D4F6, 'M', u'm'),
- (0x1D4F7, 'M', u'n'),
- (0x1D4F8, 'M', u'o'),
- (0x1D4F9, 'M', u'p'),
- (0x1D4FA, 'M', u'q'),
- (0x1D4FB, 'M', u'r'),
- (0x1D4FC, 'M', u's'),
- (0x1D4FD, 'M', u't'),
- (0x1D4FE, 'M', u'u'),
- (0x1D4FF, 'M', u'v'),
- (0x1D500, 'M', u'w'),
- (0x1D501, 'M', u'x'),
- (0x1D502, 'M', u'y'),
- (0x1D503, 'M', u'z'),
- (0x1D504, 'M', u'a'),
- (0x1D505, 'M', u'b'),
- (0x1D506, 'X'),
- (0x1D507, 'M', u'd'),
- (0x1D508, 'M', u'e'),
- (0x1D509, 'M', u'f'),
- (0x1D50A, 'M', u'g'),
- (0x1D50B, 'X'),
- (0x1D50D, 'M', u'j'),
- (0x1D50E, 'M', u'k'),
- (0x1D50F, 'M', u'l'),
- (0x1D510, 'M', u'm'),
- (0x1D511, 'M', u'n'),
- (0x1D512, 'M', u'o'),
- (0x1D513, 'M', u'p'),
- (0x1D514, 'M', u'q'),
- (0x1D515, 'X'),
- (0x1D516, 'M', u's'),
- (0x1D517, 'M', u't'),
- (0x1D518, 'M', u'u'),
- (0x1D519, 'M', u'v'),
- (0x1D51A, 'M', u'w'),
- (0x1D51B, 'M', u'x'),
- (0x1D51C, 'M', u'y'),
- (0x1D51D, 'X'),
+ (0x1D4F0, "M", "g"),
+ (0x1D4F1, "M", "h"),
+ (0x1D4F2, "M", "i"),
+ (0x1D4F3, "M", "j"),
+ (0x1D4F4, "M", "k"),
+ (0x1D4F5, "M", "l"),
+ (0x1D4F6, "M", "m"),
+ (0x1D4F7, "M", "n"),
+ (0x1D4F8, "M", "o"),
+ (0x1D4F9, "M", "p"),
+ (0x1D4FA, "M", "q"),
+ (0x1D4FB, "M", "r"),
+ (0x1D4FC, "M", "s"),
+ (0x1D4FD, "M", "t"),
+ (0x1D4FE, "M", "u"),
+ (0x1D4FF, "M", "v"),
+ (0x1D500, "M", "w"),
+ (0x1D501, "M", "x"),
+ (0x1D502, "M", "y"),
+ (0x1D503, "M", "z"),
+ (0x1D504, "M", "a"),
+ (0x1D505, "M", "b"),
+ (0x1D506, "X"),
+ (0x1D507, "M", "d"),
+ (0x1D508, "M", "e"),
+ (0x1D509, "M", "f"),
+ (0x1D50A, "M", "g"),
+ (0x1D50B, "X"),
+ (0x1D50D, "M", "j"),
+ (0x1D50E, "M", "k"),
+ (0x1D50F, "M", "l"),
+ (0x1D510, "M", "m"),
+ (0x1D511, "M", "n"),
+ (0x1D512, "M", "o"),
+ (0x1D513, "M", "p"),
+ (0x1D514, "M", "q"),
+ (0x1D515, "X"),
+ (0x1D516, "M", "s"),
+ (0x1D517, "M", "t"),
+ (0x1D518, "M", "u"),
+ (0x1D519, "M", "v"),
+ (0x1D51A, "M", "w"),
+ (0x1D51B, "M", "x"),
+ (0x1D51C, "M", "y"),
+ (0x1D51D, "X"),
+ (0x1D51E, "M", "a"),
+ (0x1D51F, "M", "b"),
+ (0x1D520, "M", "c"),
+ (0x1D521, "M", "d"),
+ (0x1D522, "M", "e"),
+ (0x1D523, "M", "f"),
+ (0x1D524, "M", "g"),
+ (0x1D525, "M", "h"),
+ (0x1D526, "M", "i"),
+ (0x1D527, "M", "j"),
+ (0x1D528, "M", "k"),
+ (0x1D529, "M", "l"),
+ (0x1D52A, "M", "m"),
+ (0x1D52B, "M", "n"),
+ (0x1D52C, "M", "o"),
+ (0x1D52D, "M", "p"),
+ (0x1D52E, "M", "q"),
+ (0x1D52F, "M", "r"),
+ (0x1D530, "M", "s"),
+ (0x1D531, "M", "t"),
+ (0x1D532, "M", "u"),
+ (0x1D533, "M", "v"),
+ (0x1D534, "M", "w"),
+ (0x1D535, "M", "x"),
+ (0x1D536, "M", "y"),
+ (0x1D537, "M", "z"),
+ (0x1D538, "M", "a"),
+ (0x1D539, "M", "b"),
+ (0x1D53A, "X"),
+ (0x1D53B, "M", "d"),
+ (0x1D53C, "M", "e"),
+ (0x1D53D, "M", "f"),
+ (0x1D53E, "M", "g"),
+ (0x1D53F, "X"),
+ (0x1D540, "M", "i"),
+ (0x1D541, "M", "j"),
+ (0x1D542, "M", "k"),
+ (0x1D543, "M", "l"),
+ (0x1D544, "M", "m"),
+ (0x1D545, "X"),
+ (0x1D546, "M", "o"),
+ (0x1D547, "X"),
+ (0x1D54A, "M", "s"),
+ (0x1D54B, "M", "t"),
+ (0x1D54C, "M", "u"),
+ (0x1D54D, "M", "v"),
+ (0x1D54E, "M", "w"),
+ (0x1D54F, "M", "x"),
+ (0x1D550, "M", "y"),
+ (0x1D551, "X"),
+ (0x1D552, "M", "a"),
+ (0x1D553, "M", "b"),
+ (0x1D554, "M", "c"),
+ (0x1D555, "M", "d"),
+ (0x1D556, "M", "e"),
]
-def _seg_62():
+
+def _seg_64() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x1D51E, 'M', u'a'),
- (0x1D51F, 'M', u'b'),
- (0x1D520, 'M', u'c'),
- (0x1D521, 'M', u'd'),
- (0x1D522, 'M', u'e'),
- (0x1D523, 'M', u'f'),
- (0x1D524, 'M', u'g'),
- (0x1D525, 'M', u'h'),
- (0x1D526, 'M', u'i'),
- (0x1D527, 'M', u'j'),
- (0x1D528, 'M', u'k'),
- (0x1D529, 'M', u'l'),
- (0x1D52A, 'M', u'm'),
- (0x1D52B, 'M', u'n'),
- (0x1D52C, 'M', u'o'),
- (0x1D52D, 'M', u'p'),
- (0x1D52E, 'M', u'q'),
- (0x1D52F, 'M', u'r'),
- (0x1D530, 'M', u's'),
- (0x1D531, 'M', u't'),
- (0x1D532, 'M', u'u'),
- (0x1D533, 'M', u'v'),
- (0x1D534, 'M', u'w'),
- (0x1D535, 'M', u'x'),
- (0x1D536, 'M', u'y'),
- (0x1D537, 'M', u'z'),
- (0x1D538, 'M', u'a'),
- (0x1D539, 'M', u'b'),
- (0x1D53A, 'X'),
- (0x1D53B, 'M', u'd'),
- (0x1D53C, 'M', u'e'),
- (0x1D53D, 'M', u'f'),
- (0x1D53E, 'M', u'g'),
- (0x1D53F, 'X'),
- (0x1D540, 'M', u'i'),
- (0x1D541, 'M', u'j'),
- (0x1D542, 'M', u'k'),
- (0x1D543, 'M', u'l'),
- (0x1D544, 'M', u'm'),
- (0x1D545, 'X'),
- (0x1D546, 'M', u'o'),
- (0x1D547, 'X'),
- (0x1D54A, 'M', u's'),
- (0x1D54B, 'M', u't'),
- (0x1D54C, 'M', u'u'),
- (0x1D54D, 'M', u'v'),
- (0x1D54E, 'M', u'w'),
- (0x1D54F, 'M', u'x'),
- (0x1D550, 'M', u'y'),
- (0x1D551, 'X'),
- (0x1D552, 'M', u'a'),
- (0x1D553, 'M', u'b'),
- (0x1D554, 'M', u'c'),
- (0x1D555, 'M', u'd'),
- (0x1D556, 'M', u'e'),
- (0x1D557, 'M', u'f'),
- (0x1D558, 'M', u'g'),
- (0x1D559, 'M', u'h'),
- (0x1D55A, 'M', u'i'),
- (0x1D55B, 'M', u'j'),
- (0x1D55C, 'M', u'k'),
- (0x1D55D, 'M', u'l'),
- (0x1D55E, 'M', u'm'),
- (0x1D55F, 'M', u'n'),
- (0x1D560, 'M', u'o'),
- (0x1D561, 'M', u'p'),
- (0x1D562, 'M', u'q'),
- (0x1D563, 'M', u'r'),
- (0x1D564, 'M', u's'),
- (0x1D565, 'M', u't'),
- (0x1D566, 'M', u'u'),
- (0x1D567, 'M', u'v'),
- (0x1D568, 'M', u'w'),
- (0x1D569, 'M', u'x'),
- (0x1D56A, 'M', u'y'),
- (0x1D56B, 'M', u'z'),
- (0x1D56C, 'M', u'a'),
- (0x1D56D, 'M', u'b'),
- (0x1D56E, 'M', u'c'),
- (0x1D56F, 'M', u'd'),
- (0x1D570, 'M', u'e'),
- (0x1D571, 'M', u'f'),
- (0x1D572, 'M', u'g'),
- (0x1D573, 'M', u'h'),
- (0x1D574, 'M', u'i'),
- (0x1D575, 'M', u'j'),
- (0x1D576, 'M', u'k'),
- (0x1D577, 'M', u'l'),
- (0x1D578, 'M', u'm'),
- (0x1D579, 'M', u'n'),
- (0x1D57A, 'M', u'o'),
- (0x1D57B, 'M', u'p'),
- (0x1D57C, 'M', u'q'),
- (0x1D57D, 'M', u'r'),
- (0x1D57E, 'M', u's'),
- (0x1D57F, 'M', u't'),
- (0x1D580, 'M', u'u'),
- (0x1D581, 'M', u'v'),
- (0x1D582, 'M', u'w'),
- (0x1D583, 'M', u'x'),
+ (0x1D557, "M", "f"),
+ (0x1D558, "M", "g"),
+ (0x1D559, "M", "h"),
+ (0x1D55A, "M", "i"),
+ (0x1D55B, "M", "j"),
+ (0x1D55C, "M", "k"),
+ (0x1D55D, "M", "l"),
+ (0x1D55E, "M", "m"),
+ (0x1D55F, "M", "n"),
+ (0x1D560, "M", "o"),
+ (0x1D561, "M", "p"),
+ (0x1D562, "M", "q"),
+ (0x1D563, "M", "r"),
+ (0x1D564, "M", "s"),
+ (0x1D565, "M", "t"),
+ (0x1D566, "M", "u"),
+ (0x1D567, "M", "v"),
+ (0x1D568, "M", "w"),
+ (0x1D569, "M", "x"),
+ (0x1D56A, "M", "y"),
+ (0x1D56B, "M", "z"),
+ (0x1D56C, "M", "a"),
+ (0x1D56D, "M", "b"),
+ (0x1D56E, "M", "c"),
+ (0x1D56F, "M", "d"),
+ (0x1D570, "M", "e"),
+ (0x1D571, "M", "f"),
+ (0x1D572, "M", "g"),
+ (0x1D573, "M", "h"),
+ (0x1D574, "M", "i"),
+ (0x1D575, "M", "j"),
+ (0x1D576, "M", "k"),
+ (0x1D577, "M", "l"),
+ (0x1D578, "M", "m"),
+ (0x1D579, "M", "n"),
+ (0x1D57A, "M", "o"),
+ (0x1D57B, "M", "p"),
+ (0x1D57C, "M", "q"),
+ (0x1D57D, "M", "r"),
+ (0x1D57E, "M", "s"),
+ (0x1D57F, "M", "t"),
+ (0x1D580, "M", "u"),
+ (0x1D581, "M", "v"),
+ (0x1D582, "M", "w"),
+ (0x1D583, "M", "x"),
+ (0x1D584, "M", "y"),
+ (0x1D585, "M", "z"),
+ (0x1D586, "M", "a"),
+ (0x1D587, "M", "b"),
+ (0x1D588, "M", "c"),
+ (0x1D589, "M", "d"),
+ (0x1D58A, "M", "e"),
+ (0x1D58B, "M", "f"),
+ (0x1D58C, "M", "g"),
+ (0x1D58D, "M", "h"),
+ (0x1D58E, "M", "i"),
+ (0x1D58F, "M", "j"),
+ (0x1D590, "M", "k"),
+ (0x1D591, "M", "l"),
+ (0x1D592, "M", "m"),
+ (0x1D593, "M", "n"),
+ (0x1D594, "M", "o"),
+ (0x1D595, "M", "p"),
+ (0x1D596, "M", "q"),
+ (0x1D597, "M", "r"),
+ (0x1D598, "M", "s"),
+ (0x1D599, "M", "t"),
+ (0x1D59A, "M", "u"),
+ (0x1D59B, "M", "v"),
+ (0x1D59C, "M", "w"),
+ (0x1D59D, "M", "x"),
+ (0x1D59E, "M", "y"),
+ (0x1D59F, "M", "z"),
+ (0x1D5A0, "M", "a"),
+ (0x1D5A1, "M", "b"),
+ (0x1D5A2, "M", "c"),
+ (0x1D5A3, "M", "d"),
+ (0x1D5A4, "M", "e"),
+ (0x1D5A5, "M", "f"),
+ (0x1D5A6, "M", "g"),
+ (0x1D5A7, "M", "h"),
+ (0x1D5A8, "M", "i"),
+ (0x1D5A9, "M", "j"),
+ (0x1D5AA, "M", "k"),
+ (0x1D5AB, "M", "l"),
+ (0x1D5AC, "M", "m"),
+ (0x1D5AD, "M", "n"),
+ (0x1D5AE, "M", "o"),
+ (0x1D5AF, "M", "p"),
+ (0x1D5B0, "M", "q"),
+ (0x1D5B1, "M", "r"),
+ (0x1D5B2, "M", "s"),
+ (0x1D5B3, "M", "t"),
+ (0x1D5B4, "M", "u"),
+ (0x1D5B5, "M", "v"),
+ (0x1D5B6, "M", "w"),
+ (0x1D5B7, "M", "x"),
+ (0x1D5B8, "M", "y"),
+ (0x1D5B9, "M", "z"),
+ (0x1D5BA, "M", "a"),
]
-def _seg_63():
+
+def _seg_65() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x1D584, 'M', u'y'),
- (0x1D585, 'M', u'z'),
- (0x1D586, 'M', u'a'),
- (0x1D587, 'M', u'b'),
- (0x1D588, 'M', u'c'),
- (0x1D589, 'M', u'd'),
- (0x1D58A, 'M', u'e'),
- (0x1D58B, 'M', u'f'),
- (0x1D58C, 'M', u'g'),
- (0x1D58D, 'M', u'h'),
- (0x1D58E, 'M', u'i'),
- (0x1D58F, 'M', u'j'),
- (0x1D590, 'M', u'k'),
- (0x1D591, 'M', u'l'),
- (0x1D592, 'M', u'm'),
- (0x1D593, 'M', u'n'),
- (0x1D594, 'M', u'o'),
- (0x1D595, 'M', u'p'),
- (0x1D596, 'M', u'q'),
- (0x1D597, 'M', u'r'),
- (0x1D598, 'M', u's'),
- (0x1D599, 'M', u't'),
- (0x1D59A, 'M', u'u'),
- (0x1D59B, 'M', u'v'),
- (0x1D59C, 'M', u'w'),
- (0x1D59D, 'M', u'x'),
- (0x1D59E, 'M', u'y'),
- (0x1D59F, 'M', u'z'),
- (0x1D5A0, 'M', u'a'),
- (0x1D5A1, 'M', u'b'),
- (0x1D5A2, 'M', u'c'),
- (0x1D5A3, 'M', u'd'),
- (0x1D5A4, 'M', u'e'),
- (0x1D5A5, 'M', u'f'),
- (0x1D5A6, 'M', u'g'),
- (0x1D5A7, 'M', u'h'),
- (0x1D5A8, 'M', u'i'),
- (0x1D5A9, 'M', u'j'),
- (0x1D5AA, 'M', u'k'),
- (0x1D5AB, 'M', u'l'),
- (0x1D5AC, 'M', u'm'),
- (0x1D5AD, 'M', u'n'),
- (0x1D5AE, 'M', u'o'),
- (0x1D5AF, 'M', u'p'),
- (0x1D5B0, 'M', u'q'),
- (0x1D5B1, 'M', u'r'),
- (0x1D5B2, 'M', u's'),
- (0x1D5B3, 'M', u't'),
- (0x1D5B4, 'M', u'u'),
- (0x1D5B5, 'M', u'v'),
- (0x1D5B6, 'M', u'w'),
- (0x1D5B7, 'M', u'x'),
- (0x1D5B8, 'M', u'y'),
- (0x1D5B9, 'M', u'z'),
- (0x1D5BA, 'M', u'a'),
- (0x1D5BB, 'M', u'b'),
- (0x1D5BC, 'M', u'c'),
- (0x1D5BD, 'M', u'd'),
- (0x1D5BE, 'M', u'e'),
- (0x1D5BF, 'M', u'f'),
- (0x1D5C0, 'M', u'g'),
- (0x1D5C1, 'M', u'h'),
- (0x1D5C2, 'M', u'i'),
- (0x1D5C3, 'M', u'j'),
- (0x1D5C4, 'M', u'k'),
- (0x1D5C5, 'M', u'l'),
- (0x1D5C6, 'M', u'm'),
- (0x1D5C7, 'M', u'n'),
- (0x1D5C8, 'M', u'o'),
- (0x1D5C9, 'M', u'p'),
- (0x1D5CA, 'M', u'q'),
- (0x1D5CB, 'M', u'r'),
- (0x1D5CC, 'M', u's'),
- (0x1D5CD, 'M', u't'),
- (0x1D5CE, 'M', u'u'),
- (0x1D5CF, 'M', u'v'),
- (0x1D5D0, 'M', u'w'),
- (0x1D5D1, 'M', u'x'),
- (0x1D5D2, 'M', u'y'),
- (0x1D5D3, 'M', u'z'),
- (0x1D5D4, 'M', u'a'),
- (0x1D5D5, 'M', u'b'),
- (0x1D5D6, 'M', u'c'),
- (0x1D5D7, 'M', u'd'),
- (0x1D5D8, 'M', u'e'),
- (0x1D5D9, 'M', u'f'),
- (0x1D5DA, 'M', u'g'),
- (0x1D5DB, 'M', u'h'),
- (0x1D5DC, 'M', u'i'),
- (0x1D5DD, 'M', u'j'),
- (0x1D5DE, 'M', u'k'),
- (0x1D5DF, 'M', u'l'),
- (0x1D5E0, 'M', u'm'),
- (0x1D5E1, 'M', u'n'),
- (0x1D5E2, 'M', u'o'),
- (0x1D5E3, 'M', u'p'),
- (0x1D5E4, 'M', u'q'),
- (0x1D5E5, 'M', u'r'),
- (0x1D5E6, 'M', u's'),
- (0x1D5E7, 'M', u't'),
+ (0x1D5BB, "M", "b"),
+ (0x1D5BC, "M", "c"),
+ (0x1D5BD, "M", "d"),
+ (0x1D5BE, "M", "e"),
+ (0x1D5BF, "M", "f"),
+ (0x1D5C0, "M", "g"),
+ (0x1D5C1, "M", "h"),
+ (0x1D5C2, "M", "i"),
+ (0x1D5C3, "M", "j"),
+ (0x1D5C4, "M", "k"),
+ (0x1D5C5, "M", "l"),
+ (0x1D5C6, "M", "m"),
+ (0x1D5C7, "M", "n"),
+ (0x1D5C8, "M", "o"),
+ (0x1D5C9, "M", "p"),
+ (0x1D5CA, "M", "q"),
+ (0x1D5CB, "M", "r"),
+ (0x1D5CC, "M", "s"),
+ (0x1D5CD, "M", "t"),
+ (0x1D5CE, "M", "u"),
+ (0x1D5CF, "M", "v"),
+ (0x1D5D0, "M", "w"),
+ (0x1D5D1, "M", "x"),
+ (0x1D5D2, "M", "y"),
+ (0x1D5D3, "M", "z"),
+ (0x1D5D4, "M", "a"),
+ (0x1D5D5, "M", "b"),
+ (0x1D5D6, "M", "c"),
+ (0x1D5D7, "M", "d"),
+ (0x1D5D8, "M", "e"),
+ (0x1D5D9, "M", "f"),
+ (0x1D5DA, "M", "g"),
+ (0x1D5DB, "M", "h"),
+ (0x1D5DC, "M", "i"),
+ (0x1D5DD, "M", "j"),
+ (0x1D5DE, "M", "k"),
+ (0x1D5DF, "M", "l"),
+ (0x1D5E0, "M", "m"),
+ (0x1D5E1, "M", "n"),
+ (0x1D5E2, "M", "o"),
+ (0x1D5E3, "M", "p"),
+ (0x1D5E4, "M", "q"),
+ (0x1D5E5, "M", "r"),
+ (0x1D5E6, "M", "s"),
+ (0x1D5E7, "M", "t"),
+ (0x1D5E8, "M", "u"),
+ (0x1D5E9, "M", "v"),
+ (0x1D5EA, "M", "w"),
+ (0x1D5EB, "M", "x"),
+ (0x1D5EC, "M", "y"),
+ (0x1D5ED, "M", "z"),
+ (0x1D5EE, "M", "a"),
+ (0x1D5EF, "M", "b"),
+ (0x1D5F0, "M", "c"),
+ (0x1D5F1, "M", "d"),
+ (0x1D5F2, "M", "e"),
+ (0x1D5F3, "M", "f"),
+ (0x1D5F4, "M", "g"),
+ (0x1D5F5, "M", "h"),
+ (0x1D5F6, "M", "i"),
+ (0x1D5F7, "M", "j"),
+ (0x1D5F8, "M", "k"),
+ (0x1D5F9, "M", "l"),
+ (0x1D5FA, "M", "m"),
+ (0x1D5FB, "M", "n"),
+ (0x1D5FC, "M", "o"),
+ (0x1D5FD, "M", "p"),
+ (0x1D5FE, "M", "q"),
+ (0x1D5FF, "M", "r"),
+ (0x1D600, "M", "s"),
+ (0x1D601, "M", "t"),
+ (0x1D602, "M", "u"),
+ (0x1D603, "M", "v"),
+ (0x1D604, "M", "w"),
+ (0x1D605, "M", "x"),
+ (0x1D606, "M", "y"),
+ (0x1D607, "M", "z"),
+ (0x1D608, "M", "a"),
+ (0x1D609, "M", "b"),
+ (0x1D60A, "M", "c"),
+ (0x1D60B, "M", "d"),
+ (0x1D60C, "M", "e"),
+ (0x1D60D, "M", "f"),
+ (0x1D60E, "M", "g"),
+ (0x1D60F, "M", "h"),
+ (0x1D610, "M", "i"),
+ (0x1D611, "M", "j"),
+ (0x1D612, "M", "k"),
+ (0x1D613, "M", "l"),
+ (0x1D614, "M", "m"),
+ (0x1D615, "M", "n"),
+ (0x1D616, "M", "o"),
+ (0x1D617, "M", "p"),
+ (0x1D618, "M", "q"),
+ (0x1D619, "M", "r"),
+ (0x1D61A, "M", "s"),
+ (0x1D61B, "M", "t"),
+ (0x1D61C, "M", "u"),
+ (0x1D61D, "M", "v"),
+ (0x1D61E, "M", "w"),
]
-def _seg_64():
+
+def _seg_66() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x1D5E8, 'M', u'u'),
- (0x1D5E9, 'M', u'v'),
- (0x1D5EA, 'M', u'w'),
- (0x1D5EB, 'M', u'x'),
- (0x1D5EC, 'M', u'y'),
- (0x1D5ED, 'M', u'z'),
- (0x1D5EE, 'M', u'a'),
- (0x1D5EF, 'M', u'b'),
- (0x1D5F0, 'M', u'c'),
- (0x1D5F1, 'M', u'd'),
- (0x1D5F2, 'M', u'e'),
- (0x1D5F3, 'M', u'f'),
- (0x1D5F4, 'M', u'g'),
- (0x1D5F5, 'M', u'h'),
- (0x1D5F6, 'M', u'i'),
- (0x1D5F7, 'M', u'j'),
- (0x1D5F8, 'M', u'k'),
- (0x1D5F9, 'M', u'l'),
- (0x1D5FA, 'M', u'm'),
- (0x1D5FB, 'M', u'n'),
- (0x1D5FC, 'M', u'o'),
- (0x1D5FD, 'M', u'p'),
- (0x1D5FE, 'M', u'q'),
- (0x1D5FF, 'M', u'r'),
- (0x1D600, 'M', u's'),
- (0x1D601, 'M', u't'),
- (0x1D602, 'M', u'u'),
- (0x1D603, 'M', u'v'),
- (0x1D604, 'M', u'w'),
- (0x1D605, 'M', u'x'),
- (0x1D606, 'M', u'y'),
- (0x1D607, 'M', u'z'),
- (0x1D608, 'M', u'a'),
- (0x1D609, 'M', u'b'),
- (0x1D60A, 'M', u'c'),
- (0x1D60B, 'M', u'd'),
- (0x1D60C, 'M', u'e'),
- (0x1D60D, 'M', u'f'),
- (0x1D60E, 'M', u'g'),
- (0x1D60F, 'M', u'h'),
- (0x1D610, 'M', u'i'),
- (0x1D611, 'M', u'j'),
- (0x1D612, 'M', u'k'),
- (0x1D613, 'M', u'l'),
- (0x1D614, 'M', u'm'),
- (0x1D615, 'M', u'n'),
- (0x1D616, 'M', u'o'),
- (0x1D617, 'M', u'p'),
- (0x1D618, 'M', u'q'),
- (0x1D619, 'M', u'r'),
- (0x1D61A, 'M', u's'),
- (0x1D61B, 'M', u't'),
- (0x1D61C, 'M', u'u'),
- (0x1D61D, 'M', u'v'),
- (0x1D61E, 'M', u'w'),
- (0x1D61F, 'M', u'x'),
- (0x1D620, 'M', u'y'),
- (0x1D621, 'M', u'z'),
- (0x1D622, 'M', u'a'),
- (0x1D623, 'M', u'b'),
- (0x1D624, 'M', u'c'),
- (0x1D625, 'M', u'd'),
- (0x1D626, 'M', u'e'),
- (0x1D627, 'M', u'f'),
- (0x1D628, 'M', u'g'),
- (0x1D629, 'M', u'h'),
- (0x1D62A, 'M', u'i'),
- (0x1D62B, 'M', u'j'),
- (0x1D62C, 'M', u'k'),
- (0x1D62D, 'M', u'l'),
- (0x1D62E, 'M', u'm'),
- (0x1D62F, 'M', u'n'),
- (0x1D630, 'M', u'o'),
- (0x1D631, 'M', u'p'),
- (0x1D632, 'M', u'q'),
- (0x1D633, 'M', u'r'),
- (0x1D634, 'M', u's'),
- (0x1D635, 'M', u't'),
- (0x1D636, 'M', u'u'),
- (0x1D637, 'M', u'v'),
- (0x1D638, 'M', u'w'),
- (0x1D639, 'M', u'x'),
- (0x1D63A, 'M', u'y'),
- (0x1D63B, 'M', u'z'),
- (0x1D63C, 'M', u'a'),
- (0x1D63D, 'M', u'b'),
- (0x1D63E, 'M', u'c'),
- (0x1D63F, 'M', u'd'),
- (0x1D640, 'M', u'e'),
- (0x1D641, 'M', u'f'),
- (0x1D642, 'M', u'g'),
- (0x1D643, 'M', u'h'),
- (0x1D644, 'M', u'i'),
- (0x1D645, 'M', u'j'),
- (0x1D646, 'M', u'k'),
- (0x1D647, 'M', u'l'),
- (0x1D648, 'M', u'm'),
- (0x1D649, 'M', u'n'),
- (0x1D64A, 'M', u'o'),
- (0x1D64B, 'M', u'p'),
+ (0x1D61F, "M", "x"),
+ (0x1D620, "M", "y"),
+ (0x1D621, "M", "z"),
+ (0x1D622, "M", "a"),
+ (0x1D623, "M", "b"),
+ (0x1D624, "M", "c"),
+ (0x1D625, "M", "d"),
+ (0x1D626, "M", "e"),
+ (0x1D627, "M", "f"),
+ (0x1D628, "M", "g"),
+ (0x1D629, "M", "h"),
+ (0x1D62A, "M", "i"),
+ (0x1D62B, "M", "j"),
+ (0x1D62C, "M", "k"),
+ (0x1D62D, "M", "l"),
+ (0x1D62E, "M", "m"),
+ (0x1D62F, "M", "n"),
+ (0x1D630, "M", "o"),
+ (0x1D631, "M", "p"),
+ (0x1D632, "M", "q"),
+ (0x1D633, "M", "r"),
+ (0x1D634, "M", "s"),
+ (0x1D635, "M", "t"),
+ (0x1D636, "M", "u"),
+ (0x1D637, "M", "v"),
+ (0x1D638, "M", "w"),
+ (0x1D639, "M", "x"),
+ (0x1D63A, "M", "y"),
+ (0x1D63B, "M", "z"),
+ (0x1D63C, "M", "a"),
+ (0x1D63D, "M", "b"),
+ (0x1D63E, "M", "c"),
+ (0x1D63F, "M", "d"),
+ (0x1D640, "M", "e"),
+ (0x1D641, "M", "f"),
+ (0x1D642, "M", "g"),
+ (0x1D643, "M", "h"),
+ (0x1D644, "M", "i"),
+ (0x1D645, "M", "j"),
+ (0x1D646, "M", "k"),
+ (0x1D647, "M", "l"),
+ (0x1D648, "M", "m"),
+ (0x1D649, "M", "n"),
+ (0x1D64A, "M", "o"),
+ (0x1D64B, "M", "p"),
+ (0x1D64C, "M", "q"),
+ (0x1D64D, "M", "r"),
+ (0x1D64E, "M", "s"),
+ (0x1D64F, "M", "t"),
+ (0x1D650, "M", "u"),
+ (0x1D651, "M", "v"),
+ (0x1D652, "M", "w"),
+ (0x1D653, "M", "x"),
+ (0x1D654, "M", "y"),
+ (0x1D655, "M", "z"),
+ (0x1D656, "M", "a"),
+ (0x1D657, "M", "b"),
+ (0x1D658, "M", "c"),
+ (0x1D659, "M", "d"),
+ (0x1D65A, "M", "e"),
+ (0x1D65B, "M", "f"),
+ (0x1D65C, "M", "g"),
+ (0x1D65D, "M", "h"),
+ (0x1D65E, "M", "i"),
+ (0x1D65F, "M", "j"),
+ (0x1D660, "M", "k"),
+ (0x1D661, "M", "l"),
+ (0x1D662, "M", "m"),
+ (0x1D663, "M", "n"),
+ (0x1D664, "M", "o"),
+ (0x1D665, "M", "p"),
+ (0x1D666, "M", "q"),
+ (0x1D667, "M", "r"),
+ (0x1D668, "M", "s"),
+ (0x1D669, "M", "t"),
+ (0x1D66A, "M", "u"),
+ (0x1D66B, "M", "v"),
+ (0x1D66C, "M", "w"),
+ (0x1D66D, "M", "x"),
+ (0x1D66E, "M", "y"),
+ (0x1D66F, "M", "z"),
+ (0x1D670, "M", "a"),
+ (0x1D671, "M", "b"),
+ (0x1D672, "M", "c"),
+ (0x1D673, "M", "d"),
+ (0x1D674, "M", "e"),
+ (0x1D675, "M", "f"),
+ (0x1D676, "M", "g"),
+ (0x1D677, "M", "h"),
+ (0x1D678, "M", "i"),
+ (0x1D679, "M", "j"),
+ (0x1D67A, "M", "k"),
+ (0x1D67B, "M", "l"),
+ (0x1D67C, "M", "m"),
+ (0x1D67D, "M", "n"),
+ (0x1D67E, "M", "o"),
+ (0x1D67F, "M", "p"),
+ (0x1D680, "M", "q"),
+ (0x1D681, "M", "r"),
+ (0x1D682, "M", "s"),
]
-def _seg_65():
+
+def _seg_67() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x1D64C, 'M', u'q'),
- (0x1D64D, 'M', u'r'),
- (0x1D64E, 'M', u's'),
- (0x1D64F, 'M', u't'),
- (0x1D650, 'M', u'u'),
- (0x1D651, 'M', u'v'),
- (0x1D652, 'M', u'w'),
- (0x1D653, 'M', u'x'),
- (0x1D654, 'M', u'y'),
- (0x1D655, 'M', u'z'),
- (0x1D656, 'M', u'a'),
- (0x1D657, 'M', u'b'),
- (0x1D658, 'M', u'c'),
- (0x1D659, 'M', u'd'),
- (0x1D65A, 'M', u'e'),
- (0x1D65B, 'M', u'f'),
- (0x1D65C, 'M', u'g'),
- (0x1D65D, 'M', u'h'),
- (0x1D65E, 'M', u'i'),
- (0x1D65F, 'M', u'j'),
- (0x1D660, 'M', u'k'),
- (0x1D661, 'M', u'l'),
- (0x1D662, 'M', u'm'),
- (0x1D663, 'M', u'n'),
- (0x1D664, 'M', u'o'),
- (0x1D665, 'M', u'p'),
- (0x1D666, 'M', u'q'),
- (0x1D667, 'M', u'r'),
- (0x1D668, 'M', u's'),
- (0x1D669, 'M', u't'),
- (0x1D66A, 'M', u'u'),
- (0x1D66B, 'M', u'v'),
- (0x1D66C, 'M', u'w'),
- (0x1D66D, 'M', u'x'),
- (0x1D66E, 'M', u'y'),
- (0x1D66F, 'M', u'z'),
- (0x1D670, 'M', u'a'),
- (0x1D671, 'M', u'b'),
- (0x1D672, 'M', u'c'),
- (0x1D673, 'M', u'd'),
- (0x1D674, 'M', u'e'),
- (0x1D675, 'M', u'f'),
- (0x1D676, 'M', u'g'),
- (0x1D677, 'M', u'h'),
- (0x1D678, 'M', u'i'),
- (0x1D679, 'M', u'j'),
- (0x1D67A, 'M', u'k'),
- (0x1D67B, 'M', u'l'),
- (0x1D67C, 'M', u'm'),
- (0x1D67D, 'M', u'n'),
- (0x1D67E, 'M', u'o'),
- (0x1D67F, 'M', u'p'),
- (0x1D680, 'M', u'q'),
- (0x1D681, 'M', u'r'),
- (0x1D682, 'M', u's'),
- (0x1D683, 'M', u't'),
- (0x1D684, 'M', u'u'),
- (0x1D685, 'M', u'v'),
- (0x1D686, 'M', u'w'),
- (0x1D687, 'M', u'x'),
- (0x1D688, 'M', u'y'),
- (0x1D689, 'M', u'z'),
- (0x1D68A, 'M', u'a'),
- (0x1D68B, 'M', u'b'),
- (0x1D68C, 'M', u'c'),
- (0x1D68D, 'M', u'd'),
- (0x1D68E, 'M', u'e'),
- (0x1D68F, 'M', u'f'),
- (0x1D690, 'M', u'g'),
- (0x1D691, 'M', u'h'),
- (0x1D692, 'M', u'i'),
- (0x1D693, 'M', u'j'),
- (0x1D694, 'M', u'k'),
- (0x1D695, 'M', u'l'),
- (0x1D696, 'M', u'm'),
- (0x1D697, 'M', u'n'),
- (0x1D698, 'M', u'o'),
- (0x1D699, 'M', u'p'),
- (0x1D69A, 'M', u'q'),
- (0x1D69B, 'M', u'r'),
- (0x1D69C, 'M', u's'),
- (0x1D69D, 'M', u't'),
- (0x1D69E, 'M', u'u'),
- (0x1D69F, 'M', u'v'),
- (0x1D6A0, 'M', u'w'),
- (0x1D6A1, 'M', u'x'),
- (0x1D6A2, 'M', u'y'),
- (0x1D6A3, 'M', u'z'),
- (0x1D6A4, 'M', u'ı'),
- (0x1D6A5, 'M', u'ȷ'),
- (0x1D6A6, 'X'),
- (0x1D6A8, 'M', u'α'),
- (0x1D6A9, 'M', u'β'),
- (0x1D6AA, 'M', u'γ'),
- (0x1D6AB, 'M', u'δ'),
- (0x1D6AC, 'M', u'ε'),
- (0x1D6AD, 'M', u'ζ'),
- (0x1D6AE, 'M', u'η'),
- (0x1D6AF, 'M', u'θ'),
- (0x1D6B0, 'M', u'ι'),
+ (0x1D683, "M", "t"),
+ (0x1D684, "M", "u"),
+ (0x1D685, "M", "v"),
+ (0x1D686, "M", "w"),
+ (0x1D687, "M", "x"),
+ (0x1D688, "M", "y"),
+ (0x1D689, "M", "z"),
+ (0x1D68A, "M", "a"),
+ (0x1D68B, "M", "b"),
+ (0x1D68C, "M", "c"),
+ (0x1D68D, "M", "d"),
+ (0x1D68E, "M", "e"),
+ (0x1D68F, "M", "f"),
+ (0x1D690, "M", "g"),
+ (0x1D691, "M", "h"),
+ (0x1D692, "M", "i"),
+ (0x1D693, "M", "j"),
+ (0x1D694, "M", "k"),
+ (0x1D695, "M", "l"),
+ (0x1D696, "M", "m"),
+ (0x1D697, "M", "n"),
+ (0x1D698, "M", "o"),
+ (0x1D699, "M", "p"),
+ (0x1D69A, "M", "q"),
+ (0x1D69B, "M", "r"),
+ (0x1D69C, "M", "s"),
+ (0x1D69D, "M", "t"),
+ (0x1D69E, "M", "u"),
+ (0x1D69F, "M", "v"),
+ (0x1D6A0, "M", "w"),
+ (0x1D6A1, "M", "x"),
+ (0x1D6A2, "M", "y"),
+ (0x1D6A3, "M", "z"),
+ (0x1D6A4, "M", "ı"),
+ (0x1D6A5, "M", "ȷ"),
+ (0x1D6A6, "X"),
+ (0x1D6A8, "M", "α"),
+ (0x1D6A9, "M", "β"),
+ (0x1D6AA, "M", "γ"),
+ (0x1D6AB, "M", "δ"),
+ (0x1D6AC, "M", "ε"),
+ (0x1D6AD, "M", "ζ"),
+ (0x1D6AE, "M", "η"),
+ (0x1D6AF, "M", "θ"),
+ (0x1D6B0, "M", "ι"),
+ (0x1D6B1, "M", "κ"),
+ (0x1D6B2, "M", "λ"),
+ (0x1D6B3, "M", "μ"),
+ (0x1D6B4, "M", "ν"),
+ (0x1D6B5, "M", "ξ"),
+ (0x1D6B6, "M", "ο"),
+ (0x1D6B7, "M", "π"),
+ (0x1D6B8, "M", "ρ"),
+ (0x1D6B9, "M", "θ"),
+ (0x1D6BA, "M", "σ"),
+ (0x1D6BB, "M", "τ"),
+ (0x1D6BC, "M", "υ"),
+ (0x1D6BD, "M", "φ"),
+ (0x1D6BE, "M", "χ"),
+ (0x1D6BF, "M", "ψ"),
+ (0x1D6C0, "M", "ω"),
+ (0x1D6C1, "M", "∇"),
+ (0x1D6C2, "M", "α"),
+ (0x1D6C3, "M", "β"),
+ (0x1D6C4, "M", "γ"),
+ (0x1D6C5, "M", "δ"),
+ (0x1D6C6, "M", "ε"),
+ (0x1D6C7, "M", "ζ"),
+ (0x1D6C8, "M", "η"),
+ (0x1D6C9, "M", "θ"),
+ (0x1D6CA, "M", "ι"),
+ (0x1D6CB, "M", "κ"),
+ (0x1D6CC, "M", "λ"),
+ (0x1D6CD, "M", "μ"),
+ (0x1D6CE, "M", "ν"),
+ (0x1D6CF, "M", "ξ"),
+ (0x1D6D0, "M", "ο"),
+ (0x1D6D1, "M", "π"),
+ (0x1D6D2, "M", "ρ"),
+ (0x1D6D3, "M", "σ"),
+ (0x1D6D5, "M", "τ"),
+ (0x1D6D6, "M", "υ"),
+ (0x1D6D7, "M", "φ"),
+ (0x1D6D8, "M", "χ"),
+ (0x1D6D9, "M", "ψ"),
+ (0x1D6DA, "M", "ω"),
+ (0x1D6DB, "M", "∂"),
+ (0x1D6DC, "M", "ε"),
+ (0x1D6DD, "M", "θ"),
+ (0x1D6DE, "M", "κ"),
+ (0x1D6DF, "M", "φ"),
+ (0x1D6E0, "M", "ρ"),
+ (0x1D6E1, "M", "π"),
+ (0x1D6E2, "M", "α"),
+ (0x1D6E3, "M", "β"),
+ (0x1D6E4, "M", "γ"),
+ (0x1D6E5, "M", "δ"),
+ (0x1D6E6, "M", "ε"),
+ (0x1D6E7, "M", "ζ"),
+ (0x1D6E8, "M", "η"),
]
-def _seg_66():
+
+def _seg_68() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x1D6B1, 'M', u'κ'),
- (0x1D6B2, 'M', u'λ'),
- (0x1D6B3, 'M', u'μ'),
- (0x1D6B4, 'M', u'ν'),
- (0x1D6B5, 'M', u'ξ'),
- (0x1D6B6, 'M', u'ο'),
- (0x1D6B7, 'M', u'π'),
- (0x1D6B8, 'M', u'ρ'),
- (0x1D6B9, 'M', u'θ'),
- (0x1D6BA, 'M', u'σ'),
- (0x1D6BB, 'M', u'τ'),
- (0x1D6BC, 'M', u'υ'),
- (0x1D6BD, 'M', u'φ'),
- (0x1D6BE, 'M', u'χ'),
- (0x1D6BF, 'M', u'ψ'),
- (0x1D6C0, 'M', u'ω'),
- (0x1D6C1, 'M', u'∇'),
- (0x1D6C2, 'M', u'α'),
- (0x1D6C3, 'M', u'β'),
- (0x1D6C4, 'M', u'γ'),
- (0x1D6C5, 'M', u'δ'),
- (0x1D6C6, 'M', u'ε'),
- (0x1D6C7, 'M', u'ζ'),
- (0x1D6C8, 'M', u'η'),
- (0x1D6C9, 'M', u'θ'),
- (0x1D6CA, 'M', u'ι'),
- (0x1D6CB, 'M', u'κ'),
- (0x1D6CC, 'M', u'λ'),
- (0x1D6CD, 'M', u'μ'),
- (0x1D6CE, 'M', u'ν'),
- (0x1D6CF, 'M', u'ξ'),
- (0x1D6D0, 'M', u'ο'),
- (0x1D6D1, 'M', u'π'),
- (0x1D6D2, 'M', u'ρ'),
- (0x1D6D3, 'M', u'σ'),
- (0x1D6D5, 'M', u'τ'),
- (0x1D6D6, 'M', u'υ'),
- (0x1D6D7, 'M', u'φ'),
- (0x1D6D8, 'M', u'χ'),
- (0x1D6D9, 'M', u'ψ'),
- (0x1D6DA, 'M', u'ω'),
- (0x1D6DB, 'M', u'∂'),
- (0x1D6DC, 'M', u'ε'),
- (0x1D6DD, 'M', u'θ'),
- (0x1D6DE, 'M', u'κ'),
- (0x1D6DF, 'M', u'φ'),
- (0x1D6E0, 'M', u'ρ'),
- (0x1D6E1, 'M', u'π'),
- (0x1D6E2, 'M', u'α'),
- (0x1D6E3, 'M', u'β'),
- (0x1D6E4, 'M', u'γ'),
- (0x1D6E5, 'M', u'δ'),
- (0x1D6E6, 'M', u'ε'),
- (0x1D6E7, 'M', u'ζ'),
- (0x1D6E8, 'M', u'η'),
- (0x1D6E9, 'M', u'θ'),
- (0x1D6EA, 'M', u'ι'),
- (0x1D6EB, 'M', u'κ'),
- (0x1D6EC, 'M', u'λ'),
- (0x1D6ED, 'M', u'μ'),
- (0x1D6EE, 'M', u'ν'),
- (0x1D6EF, 'M', u'ξ'),
- (0x1D6F0, 'M', u'ο'),
- (0x1D6F1, 'M', u'π'),
- (0x1D6F2, 'M', u'ρ'),
- (0x1D6F3, 'M', u'θ'),
- (0x1D6F4, 'M', u'σ'),
- (0x1D6F5, 'M', u'τ'),
- (0x1D6F6, 'M', u'υ'),
- (0x1D6F7, 'M', u'φ'),
- (0x1D6F8, 'M', u'χ'),
- (0x1D6F9, 'M', u'ψ'),
- (0x1D6FA, 'M', u'ω'),
- (0x1D6FB, 'M', u'∇'),
- (0x1D6FC, 'M', u'α'),
- (0x1D6FD, 'M', u'β'),
- (0x1D6FE, 'M', u'γ'),
- (0x1D6FF, 'M', u'δ'),
- (0x1D700, 'M', u'ε'),
- (0x1D701, 'M', u'ζ'),
- (0x1D702, 'M', u'η'),
- (0x1D703, 'M', u'θ'),
- (0x1D704, 'M', u'ι'),
- (0x1D705, 'M', u'κ'),
- (0x1D706, 'M', u'λ'),
- (0x1D707, 'M', u'μ'),
- (0x1D708, 'M', u'ν'),
- (0x1D709, 'M', u'ξ'),
- (0x1D70A, 'M', u'ο'),
- (0x1D70B, 'M', u'π'),
- (0x1D70C, 'M', u'ρ'),
- (0x1D70D, 'M', u'σ'),
- (0x1D70F, 'M', u'τ'),
- (0x1D710, 'M', u'υ'),
- (0x1D711, 'M', u'φ'),
- (0x1D712, 'M', u'χ'),
- (0x1D713, 'M', u'ψ'),
- (0x1D714, 'M', u'ω'),
- (0x1D715, 'M', u'∂'),
- (0x1D716, 'M', u'ε'),
+ (0x1D6E9, "M", "θ"),
+ (0x1D6EA, "M", "ι"),
+ (0x1D6EB, "M", "κ"),
+ (0x1D6EC, "M", "λ"),
+ (0x1D6ED, "M", "μ"),
+ (0x1D6EE, "M", "ν"),
+ (0x1D6EF, "M", "ξ"),
+ (0x1D6F0, "M", "ο"),
+ (0x1D6F1, "M", "π"),
+ (0x1D6F2, "M", "ρ"),
+ (0x1D6F3, "M", "θ"),
+ (0x1D6F4, "M", "σ"),
+ (0x1D6F5, "M", "τ"),
+ (0x1D6F6, "M", "υ"),
+ (0x1D6F7, "M", "φ"),
+ (0x1D6F8, "M", "χ"),
+ (0x1D6F9, "M", "ψ"),
+ (0x1D6FA, "M", "ω"),
+ (0x1D6FB, "M", "∇"),
+ (0x1D6FC, "M", "α"),
+ (0x1D6FD, "M", "β"),
+ (0x1D6FE, "M", "γ"),
+ (0x1D6FF, "M", "δ"),
+ (0x1D700, "M", "ε"),
+ (0x1D701, "M", "ζ"),
+ (0x1D702, "M", "η"),
+ (0x1D703, "M", "θ"),
+ (0x1D704, "M", "ι"),
+ (0x1D705, "M", "κ"),
+ (0x1D706, "M", "λ"),
+ (0x1D707, "M", "μ"),
+ (0x1D708, "M", "ν"),
+ (0x1D709, "M", "ξ"),
+ (0x1D70A, "M", "ο"),
+ (0x1D70B, "M", "π"),
+ (0x1D70C, "M", "ρ"),
+ (0x1D70D, "M", "σ"),
+ (0x1D70F, "M", "τ"),
+ (0x1D710, "M", "υ"),
+ (0x1D711, "M", "φ"),
+ (0x1D712, "M", "χ"),
+ (0x1D713, "M", "ψ"),
+ (0x1D714, "M", "ω"),
+ (0x1D715, "M", "∂"),
+ (0x1D716, "M", "ε"),
+ (0x1D717, "M", "θ"),
+ (0x1D718, "M", "κ"),
+ (0x1D719, "M", "φ"),
+ (0x1D71A, "M", "ρ"),
+ (0x1D71B, "M", "π"),
+ (0x1D71C, "M", "α"),
+ (0x1D71D, "M", "β"),
+ (0x1D71E, "M", "γ"),
+ (0x1D71F, "M", "δ"),
+ (0x1D720, "M", "ε"),
+ (0x1D721, "M", "ζ"),
+ (0x1D722, "M", "η"),
+ (0x1D723, "M", "θ"),
+ (0x1D724, "M", "ι"),
+ (0x1D725, "M", "κ"),
+ (0x1D726, "M", "λ"),
+ (0x1D727, "M", "μ"),
+ (0x1D728, "M", "ν"),
+ (0x1D729, "M", "ξ"),
+ (0x1D72A, "M", "ο"),
+ (0x1D72B, "M", "π"),
+ (0x1D72C, "M", "ρ"),
+ (0x1D72D, "M", "θ"),
+ (0x1D72E, "M", "σ"),
+ (0x1D72F, "M", "τ"),
+ (0x1D730, "M", "υ"),
+ (0x1D731, "M", "φ"),
+ (0x1D732, "M", "χ"),
+ (0x1D733, "M", "ψ"),
+ (0x1D734, "M", "ω"),
+ (0x1D735, "M", "∇"),
+ (0x1D736, "M", "α"),
+ (0x1D737, "M", "β"),
+ (0x1D738, "M", "γ"),
+ (0x1D739, "M", "δ"),
+ (0x1D73A, "M", "ε"),
+ (0x1D73B, "M", "ζ"),
+ (0x1D73C, "M", "η"),
+ (0x1D73D, "M", "θ"),
+ (0x1D73E, "M", "ι"),
+ (0x1D73F, "M", "κ"),
+ (0x1D740, "M", "λ"),
+ (0x1D741, "M", "μ"),
+ (0x1D742, "M", "ν"),
+ (0x1D743, "M", "ξ"),
+ (0x1D744, "M", "ο"),
+ (0x1D745, "M", "π"),
+ (0x1D746, "M", "ρ"),
+ (0x1D747, "M", "σ"),
+ (0x1D749, "M", "τ"),
+ (0x1D74A, "M", "υ"),
+ (0x1D74B, "M", "φ"),
+ (0x1D74C, "M", "χ"),
+ (0x1D74D, "M", "ψ"),
+ (0x1D74E, "M", "ω"),
]
-def _seg_67():
+
+def _seg_69() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x1D717, 'M', u'θ'),
- (0x1D718, 'M', u'κ'),
- (0x1D719, 'M', u'φ'),
- (0x1D71A, 'M', u'ρ'),
- (0x1D71B, 'M', u'π'),
- (0x1D71C, 'M', u'α'),
- (0x1D71D, 'M', u'β'),
- (0x1D71E, 'M', u'γ'),
- (0x1D71F, 'M', u'δ'),
- (0x1D720, 'M', u'ε'),
- (0x1D721, 'M', u'ζ'),
- (0x1D722, 'M', u'η'),
- (0x1D723, 'M', u'θ'),
- (0x1D724, 'M', u'ι'),
- (0x1D725, 'M', u'κ'),
- (0x1D726, 'M', u'λ'),
- (0x1D727, 'M', u'μ'),
- (0x1D728, 'M', u'ν'),
- (0x1D729, 'M', u'ξ'),
- (0x1D72A, 'M', u'ο'),
- (0x1D72B, 'M', u'π'),
- (0x1D72C, 'M', u'ρ'),
- (0x1D72D, 'M', u'θ'),
- (0x1D72E, 'M', u'σ'),
- (0x1D72F, 'M', u'τ'),
- (0x1D730, 'M', u'υ'),
- (0x1D731, 'M', u'φ'),
- (0x1D732, 'M', u'χ'),
- (0x1D733, 'M', u'ψ'),
- (0x1D734, 'M', u'ω'),
- (0x1D735, 'M', u'∇'),
- (0x1D736, 'M', u'α'),
- (0x1D737, 'M', u'β'),
- (0x1D738, 'M', u'γ'),
- (0x1D739, 'M', u'δ'),
- (0x1D73A, 'M', u'ε'),
- (0x1D73B, 'M', u'ζ'),
- (0x1D73C, 'M', u'η'),
- (0x1D73D, 'M', u'θ'),
- (0x1D73E, 'M', u'ι'),
- (0x1D73F, 'M', u'κ'),
- (0x1D740, 'M', u'λ'),
- (0x1D741, 'M', u'μ'),
- (0x1D742, 'M', u'ν'),
- (0x1D743, 'M', u'ξ'),
- (0x1D744, 'M', u'ο'),
- (0x1D745, 'M', u'π'),
- (0x1D746, 'M', u'ρ'),
- (0x1D747, 'M', u'σ'),
- (0x1D749, 'M', u'τ'),
- (0x1D74A, 'M', u'υ'),
- (0x1D74B, 'M', u'φ'),
- (0x1D74C, 'M', u'χ'),
- (0x1D74D, 'M', u'ψ'),
- (0x1D74E, 'M', u'ω'),
- (0x1D74F, 'M', u'∂'),
- (0x1D750, 'M', u'ε'),
- (0x1D751, 'M', u'θ'),
- (0x1D752, 'M', u'κ'),
- (0x1D753, 'M', u'φ'),
- (0x1D754, 'M', u'ρ'),
- (0x1D755, 'M', u'π'),
- (0x1D756, 'M', u'α'),
- (0x1D757, 'M', u'β'),
- (0x1D758, 'M', u'γ'),
- (0x1D759, 'M', u'δ'),
- (0x1D75A, 'M', u'ε'),
- (0x1D75B, 'M', u'ζ'),
- (0x1D75C, 'M', u'η'),
- (0x1D75D, 'M', u'θ'),
- (0x1D75E, 'M', u'ι'),
- (0x1D75F, 'M', u'κ'),
- (0x1D760, 'M', u'λ'),
- (0x1D761, 'M', u'μ'),
- (0x1D762, 'M', u'ν'),
- (0x1D763, 'M', u'ξ'),
- (0x1D764, 'M', u'ο'),
- (0x1D765, 'M', u'π'),
- (0x1D766, 'M', u'ρ'),
- (0x1D767, 'M', u'θ'),
- (0x1D768, 'M', u'σ'),
- (0x1D769, 'M', u'τ'),
- (0x1D76A, 'M', u'υ'),
- (0x1D76B, 'M', u'φ'),
- (0x1D76C, 'M', u'χ'),
- (0x1D76D, 'M', u'ψ'),
- (0x1D76E, 'M', u'ω'),
- (0x1D76F, 'M', u'∇'),
- (0x1D770, 'M', u'α'),
- (0x1D771, 'M', u'β'),
- (0x1D772, 'M', u'γ'),
- (0x1D773, 'M', u'δ'),
- (0x1D774, 'M', u'ε'),
- (0x1D775, 'M', u'ζ'),
- (0x1D776, 'M', u'η'),
- (0x1D777, 'M', u'θ'),
- (0x1D778, 'M', u'ι'),
- (0x1D779, 'M', u'κ'),
- (0x1D77A, 'M', u'λ'),
- (0x1D77B, 'M', u'μ'),
+ (0x1D74F, "M", "∂"),
+ (0x1D750, "M", "ε"),
+ (0x1D751, "M", "θ"),
+ (0x1D752, "M", "κ"),
+ (0x1D753, "M", "φ"),
+ (0x1D754, "M", "ρ"),
+ (0x1D755, "M", "π"),
+ (0x1D756, "M", "α"),
+ (0x1D757, "M", "β"),
+ (0x1D758, "M", "γ"),
+ (0x1D759, "M", "δ"),
+ (0x1D75A, "M", "ε"),
+ (0x1D75B, "M", "ζ"),
+ (0x1D75C, "M", "η"),
+ (0x1D75D, "M", "θ"),
+ (0x1D75E, "M", "ι"),
+ (0x1D75F, "M", "κ"),
+ (0x1D760, "M", "λ"),
+ (0x1D761, "M", "μ"),
+ (0x1D762, "M", "ν"),
+ (0x1D763, "M", "ξ"),
+ (0x1D764, "M", "ο"),
+ (0x1D765, "M", "π"),
+ (0x1D766, "M", "ρ"),
+ (0x1D767, "M", "θ"),
+ (0x1D768, "M", "σ"),
+ (0x1D769, "M", "τ"),
+ (0x1D76A, "M", "υ"),
+ (0x1D76B, "M", "φ"),
+ (0x1D76C, "M", "χ"),
+ (0x1D76D, "M", "ψ"),
+ (0x1D76E, "M", "ω"),
+ (0x1D76F, "M", "∇"),
+ (0x1D770, "M", "α"),
+ (0x1D771, "M", "β"),
+ (0x1D772, "M", "γ"),
+ (0x1D773, "M", "δ"),
+ (0x1D774, "M", "ε"),
+ (0x1D775, "M", "ζ"),
+ (0x1D776, "M", "η"),
+ (0x1D777, "M", "θ"),
+ (0x1D778, "M", "ι"),
+ (0x1D779, "M", "κ"),
+ (0x1D77A, "M", "λ"),
+ (0x1D77B, "M", "μ"),
+ (0x1D77C, "M", "ν"),
+ (0x1D77D, "M", "ξ"),
+ (0x1D77E, "M", "ο"),
+ (0x1D77F, "M", "π"),
+ (0x1D780, "M", "ρ"),
+ (0x1D781, "M", "σ"),
+ (0x1D783, "M", "τ"),
+ (0x1D784, "M", "υ"),
+ (0x1D785, "M", "φ"),
+ (0x1D786, "M", "χ"),
+ (0x1D787, "M", "ψ"),
+ (0x1D788, "M", "ω"),
+ (0x1D789, "M", "∂"),
+ (0x1D78A, "M", "ε"),
+ (0x1D78B, "M", "θ"),
+ (0x1D78C, "M", "κ"),
+ (0x1D78D, "M", "φ"),
+ (0x1D78E, "M", "ρ"),
+ (0x1D78F, "M", "π"),
+ (0x1D790, "M", "α"),
+ (0x1D791, "M", "β"),
+ (0x1D792, "M", "γ"),
+ (0x1D793, "M", "δ"),
+ (0x1D794, "M", "ε"),
+ (0x1D795, "M", "ζ"),
+ (0x1D796, "M", "η"),
+ (0x1D797, "M", "θ"),
+ (0x1D798, "M", "ι"),
+ (0x1D799, "M", "κ"),
+ (0x1D79A, "M", "λ"),
+ (0x1D79B, "M", "μ"),
+ (0x1D79C, "M", "ν"),
+ (0x1D79D, "M", "ξ"),
+ (0x1D79E, "M", "ο"),
+ (0x1D79F, "M", "π"),
+ (0x1D7A0, "M", "ρ"),
+ (0x1D7A1, "M", "θ"),
+ (0x1D7A2, "M", "σ"),
+ (0x1D7A3, "M", "τ"),
+ (0x1D7A4, "M", "υ"),
+ (0x1D7A5, "M", "φ"),
+ (0x1D7A6, "M", "χ"),
+ (0x1D7A7, "M", "ψ"),
+ (0x1D7A8, "M", "ω"),
+ (0x1D7A9, "M", "∇"),
+ (0x1D7AA, "M", "α"),
+ (0x1D7AB, "M", "β"),
+ (0x1D7AC, "M", "γ"),
+ (0x1D7AD, "M", "δ"),
+ (0x1D7AE, "M", "ε"),
+ (0x1D7AF, "M", "ζ"),
+ (0x1D7B0, "M", "η"),
+ (0x1D7B1, "M", "θ"),
+ (0x1D7B2, "M", "ι"),
+ (0x1D7B3, "M", "κ"),
]
-def _seg_68():
+
+def _seg_70() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x1D77C, 'M', u'ν'),
- (0x1D77D, 'M', u'ξ'),
- (0x1D77E, 'M', u'ο'),
- (0x1D77F, 'M', u'π'),
- (0x1D780, 'M', u'ρ'),
- (0x1D781, 'M', u'σ'),
- (0x1D783, 'M', u'τ'),
- (0x1D784, 'M', u'υ'),
- (0x1D785, 'M', u'φ'),
- (0x1D786, 'M', u'χ'),
- (0x1D787, 'M', u'ψ'),
- (0x1D788, 'M', u'ω'),
- (0x1D789, 'M', u'∂'),
- (0x1D78A, 'M', u'ε'),
- (0x1D78B, 'M', u'θ'),
- (0x1D78C, 'M', u'κ'),
- (0x1D78D, 'M', u'φ'),
- (0x1D78E, 'M', u'ρ'),
- (0x1D78F, 'M', u'π'),
- (0x1D790, 'M', u'α'),
- (0x1D791, 'M', u'β'),
- (0x1D792, 'M', u'γ'),
- (0x1D793, 'M', u'δ'),
- (0x1D794, 'M', u'ε'),
- (0x1D795, 'M', u'ζ'),
- (0x1D796, 'M', u'η'),
- (0x1D797, 'M', u'θ'),
- (0x1D798, 'M', u'ι'),
- (0x1D799, 'M', u'κ'),
- (0x1D79A, 'M', u'λ'),
- (0x1D79B, 'M', u'μ'),
- (0x1D79C, 'M', u'ν'),
- (0x1D79D, 'M', u'ξ'),
- (0x1D79E, 'M', u'ο'),
- (0x1D79F, 'M', u'π'),
- (0x1D7A0, 'M', u'ρ'),
- (0x1D7A1, 'M', u'θ'),
- (0x1D7A2, 'M', u'σ'),
- (0x1D7A3, 'M', u'τ'),
- (0x1D7A4, 'M', u'υ'),
- (0x1D7A5, 'M', u'φ'),
- (0x1D7A6, 'M', u'χ'),
- (0x1D7A7, 'M', u'ψ'),
- (0x1D7A8, 'M', u'ω'),
- (0x1D7A9, 'M', u'∇'),
- (0x1D7AA, 'M', u'α'),
- (0x1D7AB, 'M', u'β'),
- (0x1D7AC, 'M', u'γ'),
- (0x1D7AD, 'M', u'δ'),
- (0x1D7AE, 'M', u'ε'),
- (0x1D7AF, 'M', u'ζ'),
- (0x1D7B0, 'M', u'η'),
- (0x1D7B1, 'M', u'θ'),
- (0x1D7B2, 'M', u'ι'),
- (0x1D7B3, 'M', u'κ'),
- (0x1D7B4, 'M', u'λ'),
- (0x1D7B5, 'M', u'μ'),
- (0x1D7B6, 'M', u'ν'),
- (0x1D7B7, 'M', u'ξ'),
- (0x1D7B8, 'M', u'ο'),
- (0x1D7B9, 'M', u'π'),
- (0x1D7BA, 'M', u'ρ'),
- (0x1D7BB, 'M', u'σ'),
- (0x1D7BD, 'M', u'τ'),
- (0x1D7BE, 'M', u'υ'),
- (0x1D7BF, 'M', u'φ'),
- (0x1D7C0, 'M', u'χ'),
- (0x1D7C1, 'M', u'ψ'),
- (0x1D7C2, 'M', u'ω'),
- (0x1D7C3, 'M', u'∂'),
- (0x1D7C4, 'M', u'ε'),
- (0x1D7C5, 'M', u'θ'),
- (0x1D7C6, 'M', u'κ'),
- (0x1D7C7, 'M', u'φ'),
- (0x1D7C8, 'M', u'ρ'),
- (0x1D7C9, 'M', u'π'),
- (0x1D7CA, 'M', u'ϝ'),
- (0x1D7CC, 'X'),
- (0x1D7CE, 'M', u'0'),
- (0x1D7CF, 'M', u'1'),
- (0x1D7D0, 'M', u'2'),
- (0x1D7D1, 'M', u'3'),
- (0x1D7D2, 'M', u'4'),
- (0x1D7D3, 'M', u'5'),
- (0x1D7D4, 'M', u'6'),
- (0x1D7D5, 'M', u'7'),
- (0x1D7D6, 'M', u'8'),
- (0x1D7D7, 'M', u'9'),
- (0x1D7D8, 'M', u'0'),
- (0x1D7D9, 'M', u'1'),
- (0x1D7DA, 'M', u'2'),
- (0x1D7DB, 'M', u'3'),
- (0x1D7DC, 'M', u'4'),
- (0x1D7DD, 'M', u'5'),
- (0x1D7DE, 'M', u'6'),
- (0x1D7DF, 'M', u'7'),
- (0x1D7E0, 'M', u'8'),
- (0x1D7E1, 'M', u'9'),
- (0x1D7E2, 'M', u'0'),
- (0x1D7E3, 'M', u'1'),
+ (0x1D7B4, "M", "λ"),
+ (0x1D7B5, "M", "μ"),
+ (0x1D7B6, "M", "ν"),
+ (0x1D7B7, "M", "ξ"),
+ (0x1D7B8, "M", "ο"),
+ (0x1D7B9, "M", "π"),
+ (0x1D7BA, "M", "ρ"),
+ (0x1D7BB, "M", "σ"),
+ (0x1D7BD, "M", "τ"),
+ (0x1D7BE, "M", "υ"),
+ (0x1D7BF, "M", "φ"),
+ (0x1D7C0, "M", "χ"),
+ (0x1D7C1, "M", "ψ"),
+ (0x1D7C2, "M", "ω"),
+ (0x1D7C3, "M", "∂"),
+ (0x1D7C4, "M", "ε"),
+ (0x1D7C5, "M", "θ"),
+ (0x1D7C6, "M", "κ"),
+ (0x1D7C7, "M", "φ"),
+ (0x1D7C8, "M", "ρ"),
+ (0x1D7C9, "M", "π"),
+ (0x1D7CA, "M", "ϝ"),
+ (0x1D7CC, "X"),
+ (0x1D7CE, "M", "0"),
+ (0x1D7CF, "M", "1"),
+ (0x1D7D0, "M", "2"),
+ (0x1D7D1, "M", "3"),
+ (0x1D7D2, "M", "4"),
+ (0x1D7D3, "M", "5"),
+ (0x1D7D4, "M", "6"),
+ (0x1D7D5, "M", "7"),
+ (0x1D7D6, "M", "8"),
+ (0x1D7D7, "M", "9"),
+ (0x1D7D8, "M", "0"),
+ (0x1D7D9, "M", "1"),
+ (0x1D7DA, "M", "2"),
+ (0x1D7DB, "M", "3"),
+ (0x1D7DC, "M", "4"),
+ (0x1D7DD, "M", "5"),
+ (0x1D7DE, "M", "6"),
+ (0x1D7DF, "M", "7"),
+ (0x1D7E0, "M", "8"),
+ (0x1D7E1, "M", "9"),
+ (0x1D7E2, "M", "0"),
+ (0x1D7E3, "M", "1"),
+ (0x1D7E4, "M", "2"),
+ (0x1D7E5, "M", "3"),
+ (0x1D7E6, "M", "4"),
+ (0x1D7E7, "M", "5"),
+ (0x1D7E8, "M", "6"),
+ (0x1D7E9, "M", "7"),
+ (0x1D7EA, "M", "8"),
+ (0x1D7EB, "M", "9"),
+ (0x1D7EC, "M", "0"),
+ (0x1D7ED, "M", "1"),
+ (0x1D7EE, "M", "2"),
+ (0x1D7EF, "M", "3"),
+ (0x1D7F0, "M", "4"),
+ (0x1D7F1, "M", "5"),
+ (0x1D7F2, "M", "6"),
+ (0x1D7F3, "M", "7"),
+ (0x1D7F4, "M", "8"),
+ (0x1D7F5, "M", "9"),
+ (0x1D7F6, "M", "0"),
+ (0x1D7F7, "M", "1"),
+ (0x1D7F8, "M", "2"),
+ (0x1D7F9, "M", "3"),
+ (0x1D7FA, "M", "4"),
+ (0x1D7FB, "M", "5"),
+ (0x1D7FC, "M", "6"),
+ (0x1D7FD, "M", "7"),
+ (0x1D7FE, "M", "8"),
+ (0x1D7FF, "M", "9"),
+ (0x1D800, "V"),
+ (0x1DA8C, "X"),
+ (0x1DA9B, "V"),
+ (0x1DAA0, "X"),
+ (0x1DAA1, "V"),
+ (0x1DAB0, "X"),
+ (0x1DF00, "V"),
+ (0x1DF1F, "X"),
+ (0x1DF25, "V"),
+ (0x1DF2B, "X"),
+ (0x1E000, "V"),
+ (0x1E007, "X"),
+ (0x1E008, "V"),
+ (0x1E019, "X"),
+ (0x1E01B, "V"),
+ (0x1E022, "X"),
+ (0x1E023, "V"),
+ (0x1E025, "X"),
+ (0x1E026, "V"),
+ (0x1E02B, "X"),
+ (0x1E030, "M", "а"),
+ (0x1E031, "M", "б"),
+ (0x1E032, "M", "в"),
+ (0x1E033, "M", "г"),
+ (0x1E034, "M", "д"),
+ (0x1E035, "M", "е"),
+ (0x1E036, "M", "ж"),
]
-def _seg_69():
+
+def _seg_71() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x1D7E4, 'M', u'2'),
- (0x1D7E5, 'M', u'3'),
- (0x1D7E6, 'M', u'4'),
- (0x1D7E7, 'M', u'5'),
- (0x1D7E8, 'M', u'6'),
- (0x1D7E9, 'M', u'7'),
- (0x1D7EA, 'M', u'8'),
- (0x1D7EB, 'M', u'9'),
- (0x1D7EC, 'M', u'0'),
- (0x1D7ED, 'M', u'1'),
- (0x1D7EE, 'M', u'2'),
- (0x1D7EF, 'M', u'3'),
- (0x1D7F0, 'M', u'4'),
- (0x1D7F1, 'M', u'5'),
- (0x1D7F2, 'M', u'6'),
- (0x1D7F3, 'M', u'7'),
- (0x1D7F4, 'M', u'8'),
- (0x1D7F5, 'M', u'9'),
- (0x1D7F6, 'M', u'0'),
- (0x1D7F7, 'M', u'1'),
- (0x1D7F8, 'M', u'2'),
- (0x1D7F9, 'M', u'3'),
- (0x1D7FA, 'M', u'4'),
- (0x1D7FB, 'M', u'5'),
- (0x1D7FC, 'M', u'6'),
- (0x1D7FD, 'M', u'7'),
- (0x1D7FE, 'M', u'8'),
- (0x1D7FF, 'M', u'9'),
- (0x1D800, 'V'),
- (0x1DA8C, 'X'),
- (0x1DA9B, 'V'),
- (0x1DAA0, 'X'),
- (0x1DAA1, 'V'),
- (0x1DAB0, 'X'),
- (0x1E000, 'V'),
- (0x1E007, 'X'),
- (0x1E008, 'V'),
- (0x1E019, 'X'),
- (0x1E01B, 'V'),
- (0x1E022, 'X'),
- (0x1E023, 'V'),
- (0x1E025, 'X'),
- (0x1E026, 'V'),
- (0x1E02B, 'X'),
- (0x1E100, 'V'),
- (0x1E12D, 'X'),
- (0x1E130, 'V'),
- (0x1E13E, 'X'),
- (0x1E140, 'V'),
- (0x1E14A, 'X'),
- (0x1E14E, 'V'),
- (0x1E150, 'X'),
- (0x1E2C0, 'V'),
- (0x1E2FA, 'X'),
- (0x1E2FF, 'V'),
- (0x1E300, 'X'),
- (0x1E800, 'V'),
- (0x1E8C5, 'X'),
- (0x1E8C7, 'V'),
- (0x1E8D7, 'X'),
- (0x1E900, 'M', u'𞤢'),
- (0x1E901, 'M', u'𞤣'),
- (0x1E902, 'M', u'𞤤'),
- (0x1E903, 'M', u'𞤥'),
- (0x1E904, 'M', u'𞤦'),
- (0x1E905, 'M', u'𞤧'),
- (0x1E906, 'M', u'𞤨'),
- (0x1E907, 'M', u'𞤩'),
- (0x1E908, 'M', u'𞤪'),
- (0x1E909, 'M', u'𞤫'),
- (0x1E90A, 'M', u'𞤬'),
- (0x1E90B, 'M', u'𞤭'),
- (0x1E90C, 'M', u'𞤮'),
- (0x1E90D, 'M', u'𞤯'),
- (0x1E90E, 'M', u'𞤰'),
- (0x1E90F, 'M', u'𞤱'),
- (0x1E910, 'M', u'𞤲'),
- (0x1E911, 'M', u'𞤳'),
- (0x1E912, 'M', u'𞤴'),
- (0x1E913, 'M', u'𞤵'),
- (0x1E914, 'M', u'𞤶'),
- (0x1E915, 'M', u'𞤷'),
- (0x1E916, 'M', u'𞤸'),
- (0x1E917, 'M', u'𞤹'),
- (0x1E918, 'M', u'𞤺'),
- (0x1E919, 'M', u'𞤻'),
- (0x1E91A, 'M', u'𞤼'),
- (0x1E91B, 'M', u'𞤽'),
- (0x1E91C, 'M', u'𞤾'),
- (0x1E91D, 'M', u'𞤿'),
- (0x1E91E, 'M', u'𞥀'),
- (0x1E91F, 'M', u'𞥁'),
- (0x1E920, 'M', u'𞥂'),
- (0x1E921, 'M', u'𞥃'),
- (0x1E922, 'V'),
- (0x1E94C, 'X'),
- (0x1E950, 'V'),
- (0x1E95A, 'X'),
- (0x1E95E, 'V'),
- (0x1E960, 'X'),
+ (0x1E037, "M", "з"),
+ (0x1E038, "M", "и"),
+ (0x1E039, "M", "к"),
+ (0x1E03A, "M", "л"),
+ (0x1E03B, "M", "м"),
+ (0x1E03C, "M", "о"),
+ (0x1E03D, "M", "п"),
+ (0x1E03E, "M", "р"),
+ (0x1E03F, "M", "с"),
+ (0x1E040, "M", "т"),
+ (0x1E041, "M", "у"),
+ (0x1E042, "M", "ф"),
+ (0x1E043, "M", "х"),
+ (0x1E044, "M", "ц"),
+ (0x1E045, "M", "ч"),
+ (0x1E046, "M", "ш"),
+ (0x1E047, "M", "ы"),
+ (0x1E048, "M", "э"),
+ (0x1E049, "M", "ю"),
+ (0x1E04A, "M", "ꚉ"),
+ (0x1E04B, "M", "ә"),
+ (0x1E04C, "M", "і"),
+ (0x1E04D, "M", "ј"),
+ (0x1E04E, "M", "ө"),
+ (0x1E04F, "M", "ү"),
+ (0x1E050, "M", "ӏ"),
+ (0x1E051, "M", "а"),
+ (0x1E052, "M", "б"),
+ (0x1E053, "M", "в"),
+ (0x1E054, "M", "г"),
+ (0x1E055, "M", "д"),
+ (0x1E056, "M", "е"),
+ (0x1E057, "M", "ж"),
+ (0x1E058, "M", "з"),
+ (0x1E059, "M", "и"),
+ (0x1E05A, "M", "к"),
+ (0x1E05B, "M", "л"),
+ (0x1E05C, "M", "о"),
+ (0x1E05D, "M", "п"),
+ (0x1E05E, "M", "с"),
+ (0x1E05F, "M", "у"),
+ (0x1E060, "M", "ф"),
+ (0x1E061, "M", "х"),
+ (0x1E062, "M", "ц"),
+ (0x1E063, "M", "ч"),
+ (0x1E064, "M", "ш"),
+ (0x1E065, "M", "ъ"),
+ (0x1E066, "M", "ы"),
+ (0x1E067, "M", "ґ"),
+ (0x1E068, "M", "і"),
+ (0x1E069, "M", "ѕ"),
+ (0x1E06A, "M", "џ"),
+ (0x1E06B, "M", "ҫ"),
+ (0x1E06C, "M", "ꙑ"),
+ (0x1E06D, "M", "ұ"),
+ (0x1E06E, "X"),
+ (0x1E08F, "V"),
+ (0x1E090, "X"),
+ (0x1E100, "V"),
+ (0x1E12D, "X"),
+ (0x1E130, "V"),
+ (0x1E13E, "X"),
+ (0x1E140, "V"),
+ (0x1E14A, "X"),
+ (0x1E14E, "V"),
+ (0x1E150, "X"),
+ (0x1E290, "V"),
+ (0x1E2AF, "X"),
+ (0x1E2C0, "V"),
+ (0x1E2FA, "X"),
+ (0x1E2FF, "V"),
+ (0x1E300, "X"),
+ (0x1E4D0, "V"),
+ (0x1E4FA, "X"),
+ (0x1E7E0, "V"),
+ (0x1E7E7, "X"),
+ (0x1E7E8, "V"),
+ (0x1E7EC, "X"),
+ (0x1E7ED, "V"),
+ (0x1E7EF, "X"),
+ (0x1E7F0, "V"),
+ (0x1E7FF, "X"),
+ (0x1E800, "V"),
+ (0x1E8C5, "X"),
+ (0x1E8C7, "V"),
+ (0x1E8D7, "X"),
+ (0x1E900, "M", "𞤢"),
+ (0x1E901, "M", "𞤣"),
+ (0x1E902, "M", "𞤤"),
+ (0x1E903, "M", "𞤥"),
+ (0x1E904, "M", "𞤦"),
+ (0x1E905, "M", "𞤧"),
+ (0x1E906, "M", "𞤨"),
+ (0x1E907, "M", "𞤩"),
+ (0x1E908, "M", "𞤪"),
+ (0x1E909, "M", "𞤫"),
+ (0x1E90A, "M", "𞤬"),
+ (0x1E90B, "M", "𞤭"),
+ (0x1E90C, "M", "𞤮"),
+ (0x1E90D, "M", "𞤯"),
]
-def _seg_70():
+
+def _seg_72() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x1EC71, 'V'),
- (0x1ECB5, 'X'),
- (0x1ED01, 'V'),
- (0x1ED3E, 'X'),
- (0x1EE00, 'M', u'ا'),
- (0x1EE01, 'M', u'ب'),
- (0x1EE02, 'M', u'ج'),
- (0x1EE03, 'M', u'د'),
- (0x1EE04, 'X'),
- (0x1EE05, 'M', u'و'),
- (0x1EE06, 'M', u'ز'),
- (0x1EE07, 'M', u'ح'),
- (0x1EE08, 'M', u'ط'),
- (0x1EE09, 'M', u'ي'),
- (0x1EE0A, 'M', u'ك'),
- (0x1EE0B, 'M', u'ل'),
- (0x1EE0C, 'M', u'م'),
- (0x1EE0D, 'M', u'ن'),
- (0x1EE0E, 'M', u'س'),
- (0x1EE0F, 'M', u'ع'),
- (0x1EE10, 'M', u'ف'),
- (0x1EE11, 'M', u'ص'),
- (0x1EE12, 'M', u'ق'),
- (0x1EE13, 'M', u'ر'),
- (0x1EE14, 'M', u'ش'),
- (0x1EE15, 'M', u'ت'),
- (0x1EE16, 'M', u'ث'),
- (0x1EE17, 'M', u'خ'),
- (0x1EE18, 'M', u'ذ'),
- (0x1EE19, 'M', u'ض'),
- (0x1EE1A, 'M', u'ظ'),
- (0x1EE1B, 'M', u'غ'),
- (0x1EE1C, 'M', u'ٮ'),
- (0x1EE1D, 'M', u'ں'),
- (0x1EE1E, 'M', u'ڡ'),
- (0x1EE1F, 'M', u'ٯ'),
- (0x1EE20, 'X'),
- (0x1EE21, 'M', u'ب'),
- (0x1EE22, 'M', u'ج'),
- (0x1EE23, 'X'),
- (0x1EE24, 'M', u'ه'),
- (0x1EE25, 'X'),
- (0x1EE27, 'M', u'ح'),
- (0x1EE28, 'X'),
- (0x1EE29, 'M', u'ي'),
- (0x1EE2A, 'M', u'ك'),
- (0x1EE2B, 'M', u'ل'),
- (0x1EE2C, 'M', u'م'),
- (0x1EE2D, 'M', u'ن'),
- (0x1EE2E, 'M', u'س'),
- (0x1EE2F, 'M', u'ع'),
- (0x1EE30, 'M', u'ف'),
- (0x1EE31, 'M', u'ص'),
- (0x1EE32, 'M', u'ق'),
- (0x1EE33, 'X'),
- (0x1EE34, 'M', u'ش'),
- (0x1EE35, 'M', u'ت'),
- (0x1EE36, 'M', u'ث'),
- (0x1EE37, 'M', u'خ'),
- (0x1EE38, 'X'),
- (0x1EE39, 'M', u'ض'),
- (0x1EE3A, 'X'),
- (0x1EE3B, 'M', u'غ'),
- (0x1EE3C, 'X'),
- (0x1EE42, 'M', u'ج'),
- (0x1EE43, 'X'),
- (0x1EE47, 'M', u'ح'),
- (0x1EE48, 'X'),
- (0x1EE49, 'M', u'ي'),
- (0x1EE4A, 'X'),
- (0x1EE4B, 'M', u'ل'),
- (0x1EE4C, 'X'),
- (0x1EE4D, 'M', u'ن'),
- (0x1EE4E, 'M', u'س'),
- (0x1EE4F, 'M', u'ع'),
- (0x1EE50, 'X'),
- (0x1EE51, 'M', u'ص'),
- (0x1EE52, 'M', u'ق'),
- (0x1EE53, 'X'),
- (0x1EE54, 'M', u'ش'),
- (0x1EE55, 'X'),
- (0x1EE57, 'M', u'خ'),
- (0x1EE58, 'X'),
- (0x1EE59, 'M', u'ض'),
- (0x1EE5A, 'X'),
- (0x1EE5B, 'M', u'غ'),
- (0x1EE5C, 'X'),
- (0x1EE5D, 'M', u'ں'),
- (0x1EE5E, 'X'),
- (0x1EE5F, 'M', u'ٯ'),
- (0x1EE60, 'X'),
- (0x1EE61, 'M', u'ب'),
- (0x1EE62, 'M', u'ج'),
- (0x1EE63, 'X'),
- (0x1EE64, 'M', u'ه'),
- (0x1EE65, 'X'),
- (0x1EE67, 'M', u'ح'),
- (0x1EE68, 'M', u'ط'),
- (0x1EE69, 'M', u'ي'),
- (0x1EE6A, 'M', u'ك'),
+ (0x1E90E, "M", "𞤰"),
+ (0x1E90F, "M", "𞤱"),
+ (0x1E910, "M", "𞤲"),
+ (0x1E911, "M", "𞤳"),
+ (0x1E912, "M", "𞤴"),
+ (0x1E913, "M", "𞤵"),
+ (0x1E914, "M", "𞤶"),
+ (0x1E915, "M", "𞤷"),
+ (0x1E916, "M", "𞤸"),
+ (0x1E917, "M", "𞤹"),
+ (0x1E918, "M", "𞤺"),
+ (0x1E919, "M", "𞤻"),
+ (0x1E91A, "M", "𞤼"),
+ (0x1E91B, "M", "𞤽"),
+ (0x1E91C, "M", "𞤾"),
+ (0x1E91D, "M", "𞤿"),
+ (0x1E91E, "M", "𞥀"),
+ (0x1E91F, "M", "𞥁"),
+ (0x1E920, "M", "𞥂"),
+ (0x1E921, "M", "𞥃"),
+ (0x1E922, "V"),
+ (0x1E94C, "X"),
+ (0x1E950, "V"),
+ (0x1E95A, "X"),
+ (0x1E95E, "V"),
+ (0x1E960, "X"),
+ (0x1EC71, "V"),
+ (0x1ECB5, "X"),
+ (0x1ED01, "V"),
+ (0x1ED3E, "X"),
+ (0x1EE00, "M", "ا"),
+ (0x1EE01, "M", "ب"),
+ (0x1EE02, "M", "ج"),
+ (0x1EE03, "M", "د"),
+ (0x1EE04, "X"),
+ (0x1EE05, "M", "و"),
+ (0x1EE06, "M", "ز"),
+ (0x1EE07, "M", "ح"),
+ (0x1EE08, "M", "ط"),
+ (0x1EE09, "M", "ي"),
+ (0x1EE0A, "M", "ك"),
+ (0x1EE0B, "M", "ل"),
+ (0x1EE0C, "M", "م"),
+ (0x1EE0D, "M", "ن"),
+ (0x1EE0E, "M", "س"),
+ (0x1EE0F, "M", "ع"),
+ (0x1EE10, "M", "ف"),
+ (0x1EE11, "M", "ص"),
+ (0x1EE12, "M", "ق"),
+ (0x1EE13, "M", "ر"),
+ (0x1EE14, "M", "ش"),
+ (0x1EE15, "M", "ت"),
+ (0x1EE16, "M", "ث"),
+ (0x1EE17, "M", "خ"),
+ (0x1EE18, "M", "ذ"),
+ (0x1EE19, "M", "ض"),
+ (0x1EE1A, "M", "ظ"),
+ (0x1EE1B, "M", "غ"),
+ (0x1EE1C, "M", "ٮ"),
+ (0x1EE1D, "M", "ں"),
+ (0x1EE1E, "M", "ڡ"),
+ (0x1EE1F, "M", "ٯ"),
+ (0x1EE20, "X"),
+ (0x1EE21, "M", "ب"),
+ (0x1EE22, "M", "ج"),
+ (0x1EE23, "X"),
+ (0x1EE24, "M", "ه"),
+ (0x1EE25, "X"),
+ (0x1EE27, "M", "ح"),
+ (0x1EE28, "X"),
+ (0x1EE29, "M", "ي"),
+ (0x1EE2A, "M", "ك"),
+ (0x1EE2B, "M", "ل"),
+ (0x1EE2C, "M", "م"),
+ (0x1EE2D, "M", "ن"),
+ (0x1EE2E, "M", "س"),
+ (0x1EE2F, "M", "ع"),
+ (0x1EE30, "M", "ف"),
+ (0x1EE31, "M", "ص"),
+ (0x1EE32, "M", "ق"),
+ (0x1EE33, "X"),
+ (0x1EE34, "M", "ش"),
+ (0x1EE35, "M", "ت"),
+ (0x1EE36, "M", "ث"),
+ (0x1EE37, "M", "خ"),
+ (0x1EE38, "X"),
+ (0x1EE39, "M", "ض"),
+ (0x1EE3A, "X"),
+ (0x1EE3B, "M", "غ"),
+ (0x1EE3C, "X"),
+ (0x1EE42, "M", "ج"),
+ (0x1EE43, "X"),
+ (0x1EE47, "M", "ح"),
+ (0x1EE48, "X"),
+ (0x1EE49, "M", "ي"),
+ (0x1EE4A, "X"),
+ (0x1EE4B, "M", "ل"),
+ (0x1EE4C, "X"),
+ (0x1EE4D, "M", "ن"),
+ (0x1EE4E, "M", "س"),
]
-def _seg_71():
+
+def _seg_73() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x1EE6B, 'X'),
- (0x1EE6C, 'M', u'م'),
- (0x1EE6D, 'M', u'ن'),
- (0x1EE6E, 'M', u'س'),
- (0x1EE6F, 'M', u'ع'),
- (0x1EE70, 'M', u'ف'),
- (0x1EE71, 'M', u'ص'),
- (0x1EE72, 'M', u'ق'),
- (0x1EE73, 'X'),
- (0x1EE74, 'M', u'ش'),
- (0x1EE75, 'M', u'ت'),
- (0x1EE76, 'M', u'ث'),
- (0x1EE77, 'M', u'خ'),
- (0x1EE78, 'X'),
- (0x1EE79, 'M', u'ض'),
- (0x1EE7A, 'M', u'ظ'),
- (0x1EE7B, 'M', u'غ'),
- (0x1EE7C, 'M', u'ٮ'),
- (0x1EE7D, 'X'),
- (0x1EE7E, 'M', u'ڡ'),
- (0x1EE7F, 'X'),
- (0x1EE80, 'M', u'ا'),
- (0x1EE81, 'M', u'ب'),
- (0x1EE82, 'M', u'ج'),
- (0x1EE83, 'M', u'د'),
- (0x1EE84, 'M', u'ه'),
- (0x1EE85, 'M', u'و'),
- (0x1EE86, 'M', u'ز'),
- (0x1EE87, 'M', u'ح'),
- (0x1EE88, 'M', u'ط'),
- (0x1EE89, 'M', u'ي'),
- (0x1EE8A, 'X'),
- (0x1EE8B, 'M', u'ل'),
- (0x1EE8C, 'M', u'م'),
- (0x1EE8D, 'M', u'ن'),
- (0x1EE8E, 'M', u'س'),
- (0x1EE8F, 'M', u'ع'),
- (0x1EE90, 'M', u'ف'),
- (0x1EE91, 'M', u'ص'),
- (0x1EE92, 'M', u'ق'),
- (0x1EE93, 'M', u'ر'),
- (0x1EE94, 'M', u'ش'),
- (0x1EE95, 'M', u'ت'),
- (0x1EE96, 'M', u'ث'),
- (0x1EE97, 'M', u'خ'),
- (0x1EE98, 'M', u'ذ'),
- (0x1EE99, 'M', u'ض'),
- (0x1EE9A, 'M', u'ظ'),
- (0x1EE9B, 'M', u'غ'),
- (0x1EE9C, 'X'),
- (0x1EEA1, 'M', u'ب'),
- (0x1EEA2, 'M', u'ج'),
- (0x1EEA3, 'M', u'د'),
- (0x1EEA4, 'X'),
- (0x1EEA5, 'M', u'و'),
- (0x1EEA6, 'M', u'ز'),
- (0x1EEA7, 'M', u'ح'),
- (0x1EEA8, 'M', u'ط'),
- (0x1EEA9, 'M', u'ي'),
- (0x1EEAA, 'X'),
- (0x1EEAB, 'M', u'ل'),
- (0x1EEAC, 'M', u'م'),
- (0x1EEAD, 'M', u'ن'),
- (0x1EEAE, 'M', u'س'),
- (0x1EEAF, 'M', u'ع'),
- (0x1EEB0, 'M', u'ف'),
- (0x1EEB1, 'M', u'ص'),
- (0x1EEB2, 'M', u'ق'),
- (0x1EEB3, 'M', u'ر'),
- (0x1EEB4, 'M', u'ش'),
- (0x1EEB5, 'M', u'ت'),
- (0x1EEB6, 'M', u'ث'),
- (0x1EEB7, 'M', u'خ'),
- (0x1EEB8, 'M', u'ذ'),
- (0x1EEB9, 'M', u'ض'),
- (0x1EEBA, 'M', u'ظ'),
- (0x1EEBB, 'M', u'غ'),
- (0x1EEBC, 'X'),
- (0x1EEF0, 'V'),
- (0x1EEF2, 'X'),
- (0x1F000, 'V'),
- (0x1F02C, 'X'),
- (0x1F030, 'V'),
- (0x1F094, 'X'),
- (0x1F0A0, 'V'),
- (0x1F0AF, 'X'),
- (0x1F0B1, 'V'),
- (0x1F0C0, 'X'),
- (0x1F0C1, 'V'),
- (0x1F0D0, 'X'),
- (0x1F0D1, 'V'),
- (0x1F0F6, 'X'),
- (0x1F101, '3', u'0,'),
- (0x1F102, '3', u'1,'),
- (0x1F103, '3', u'2,'),
- (0x1F104, '3', u'3,'),
- (0x1F105, '3', u'4,'),
- (0x1F106, '3', u'5,'),
- (0x1F107, '3', u'6,'),
- (0x1F108, '3', u'7,'),
+ (0x1EE4F, "M", "ع"),
+ (0x1EE50, "X"),
+ (0x1EE51, "M", "ص"),
+ (0x1EE52, "M", "ق"),
+ (0x1EE53, "X"),
+ (0x1EE54, "M", "ش"),
+ (0x1EE55, "X"),
+ (0x1EE57, "M", "خ"),
+ (0x1EE58, "X"),
+ (0x1EE59, "M", "ض"),
+ (0x1EE5A, "X"),
+ (0x1EE5B, "M", "غ"),
+ (0x1EE5C, "X"),
+ (0x1EE5D, "M", "ں"),
+ (0x1EE5E, "X"),
+ (0x1EE5F, "M", "ٯ"),
+ (0x1EE60, "X"),
+ (0x1EE61, "M", "ب"),
+ (0x1EE62, "M", "ج"),
+ (0x1EE63, "X"),
+ (0x1EE64, "M", "ه"),
+ (0x1EE65, "X"),
+ (0x1EE67, "M", "ح"),
+ (0x1EE68, "M", "ط"),
+ (0x1EE69, "M", "ي"),
+ (0x1EE6A, "M", "ك"),
+ (0x1EE6B, "X"),
+ (0x1EE6C, "M", "م"),
+ (0x1EE6D, "M", "ن"),
+ (0x1EE6E, "M", "س"),
+ (0x1EE6F, "M", "ع"),
+ (0x1EE70, "M", "ف"),
+ (0x1EE71, "M", "ص"),
+ (0x1EE72, "M", "ق"),
+ (0x1EE73, "X"),
+ (0x1EE74, "M", "ش"),
+ (0x1EE75, "M", "ت"),
+ (0x1EE76, "M", "ث"),
+ (0x1EE77, "M", "خ"),
+ (0x1EE78, "X"),
+ (0x1EE79, "M", "ض"),
+ (0x1EE7A, "M", "ظ"),
+ (0x1EE7B, "M", "غ"),
+ (0x1EE7C, "M", "ٮ"),
+ (0x1EE7D, "X"),
+ (0x1EE7E, "M", "ڡ"),
+ (0x1EE7F, "X"),
+ (0x1EE80, "M", "ا"),
+ (0x1EE81, "M", "ب"),
+ (0x1EE82, "M", "ج"),
+ (0x1EE83, "M", "د"),
+ (0x1EE84, "M", "ه"),
+ (0x1EE85, "M", "و"),
+ (0x1EE86, "M", "ز"),
+ (0x1EE87, "M", "ح"),
+ (0x1EE88, "M", "ط"),
+ (0x1EE89, "M", "ي"),
+ (0x1EE8A, "X"),
+ (0x1EE8B, "M", "ل"),
+ (0x1EE8C, "M", "م"),
+ (0x1EE8D, "M", "ن"),
+ (0x1EE8E, "M", "س"),
+ (0x1EE8F, "M", "ع"),
+ (0x1EE90, "M", "ف"),
+ (0x1EE91, "M", "ص"),
+ (0x1EE92, "M", "ق"),
+ (0x1EE93, "M", "ر"),
+ (0x1EE94, "M", "ش"),
+ (0x1EE95, "M", "ت"),
+ (0x1EE96, "M", "ث"),
+ (0x1EE97, "M", "خ"),
+ (0x1EE98, "M", "ذ"),
+ (0x1EE99, "M", "ض"),
+ (0x1EE9A, "M", "ظ"),
+ (0x1EE9B, "M", "غ"),
+ (0x1EE9C, "X"),
+ (0x1EEA1, "M", "ب"),
+ (0x1EEA2, "M", "ج"),
+ (0x1EEA3, "M", "د"),
+ (0x1EEA4, "X"),
+ (0x1EEA5, "M", "و"),
+ (0x1EEA6, "M", "ز"),
+ (0x1EEA7, "M", "ح"),
+ (0x1EEA8, "M", "ط"),
+ (0x1EEA9, "M", "ي"),
+ (0x1EEAA, "X"),
+ (0x1EEAB, "M", "ل"),
+ (0x1EEAC, "M", "م"),
+ (0x1EEAD, "M", "ن"),
+ (0x1EEAE, "M", "س"),
+ (0x1EEAF, "M", "ع"),
+ (0x1EEB0, "M", "ف"),
+ (0x1EEB1, "M", "ص"),
+ (0x1EEB2, "M", "ق"),
+ (0x1EEB3, "M", "ر"),
+ (0x1EEB4, "M", "ش"),
+ (0x1EEB5, "M", "ت"),
+ (0x1EEB6, "M", "ث"),
+ (0x1EEB7, "M", "خ"),
+ (0x1EEB8, "M", "ذ"),
]
-def _seg_72():
+
+def _seg_74() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x1F109, '3', u'8,'),
- (0x1F10A, '3', u'9,'),
- (0x1F10B, 'V'),
- (0x1F110, '3', u'(a)'),
- (0x1F111, '3', u'(b)'),
- (0x1F112, '3', u'(c)'),
- (0x1F113, '3', u'(d)'),
- (0x1F114, '3', u'(e)'),
- (0x1F115, '3', u'(f)'),
- (0x1F116, '3', u'(g)'),
- (0x1F117, '3', u'(h)'),
- (0x1F118, '3', u'(i)'),
- (0x1F119, '3', u'(j)'),
- (0x1F11A, '3', u'(k)'),
- (0x1F11B, '3', u'(l)'),
- (0x1F11C, '3', u'(m)'),
- (0x1F11D, '3', u'(n)'),
- (0x1F11E, '3', u'(o)'),
- (0x1F11F, '3', u'(p)'),
- (0x1F120, '3', u'(q)'),
- (0x1F121, '3', u'(r)'),
- (0x1F122, '3', u'(s)'),
- (0x1F123, '3', u'(t)'),
- (0x1F124, '3', u'(u)'),
- (0x1F125, '3', u'(v)'),
- (0x1F126, '3', u'(w)'),
- (0x1F127, '3', u'(x)'),
- (0x1F128, '3', u'(y)'),
- (0x1F129, '3', u'(z)'),
- (0x1F12A, 'M', u'〔s〕'),
- (0x1F12B, 'M', u'c'),
- (0x1F12C, 'M', u'r'),
- (0x1F12D, 'M', u'cd'),
- (0x1F12E, 'M', u'wz'),
- (0x1F12F, 'V'),
- (0x1F130, 'M', u'a'),
- (0x1F131, 'M', u'b'),
- (0x1F132, 'M', u'c'),
- (0x1F133, 'M', u'd'),
- (0x1F134, 'M', u'e'),
- (0x1F135, 'M', u'f'),
- (0x1F136, 'M', u'g'),
- (0x1F137, 'M', u'h'),
- (0x1F138, 'M', u'i'),
- (0x1F139, 'M', u'j'),
- (0x1F13A, 'M', u'k'),
- (0x1F13B, 'M', u'l'),
- (0x1F13C, 'M', u'm'),
- (0x1F13D, 'M', u'n'),
- (0x1F13E, 'M', u'o'),
- (0x1F13F, 'M', u'p'),
- (0x1F140, 'M', u'q'),
- (0x1F141, 'M', u'r'),
- (0x1F142, 'M', u's'),
- (0x1F143, 'M', u't'),
- (0x1F144, 'M', u'u'),
- (0x1F145, 'M', u'v'),
- (0x1F146, 'M', u'w'),
- (0x1F147, 'M', u'x'),
- (0x1F148, 'M', u'y'),
- (0x1F149, 'M', u'z'),
- (0x1F14A, 'M', u'hv'),
- (0x1F14B, 'M', u'mv'),
- (0x1F14C, 'M', u'sd'),
- (0x1F14D, 'M', u'ss'),
- (0x1F14E, 'M', u'ppv'),
- (0x1F14F, 'M', u'wc'),
- (0x1F150, 'V'),
- (0x1F16A, 'M', u'mc'),
- (0x1F16B, 'M', u'md'),
- (0x1F16C, 'M', u'mr'),
- (0x1F16D, 'V'),
- (0x1F190, 'M', u'dj'),
- (0x1F191, 'V'),
- (0x1F1AE, 'X'),
- (0x1F1E6, 'V'),
- (0x1F200, 'M', u'ほか'),
- (0x1F201, 'M', u'ココ'),
- (0x1F202, 'M', u'サ'),
- (0x1F203, 'X'),
- (0x1F210, 'M', u'手'),
- (0x1F211, 'M', u'字'),
- (0x1F212, 'M', u'双'),
- (0x1F213, 'M', u'デ'),
- (0x1F214, 'M', u'二'),
- (0x1F215, 'M', u'多'),
- (0x1F216, 'M', u'解'),
- (0x1F217, 'M', u'天'),
- (0x1F218, 'M', u'交'),
- (0x1F219, 'M', u'映'),
- (0x1F21A, 'M', u'無'),
- (0x1F21B, 'M', u'料'),
- (0x1F21C, 'M', u'前'),
- (0x1F21D, 'M', u'後'),
- (0x1F21E, 'M', u'再'),
- (0x1F21F, 'M', u'新'),
- (0x1F220, 'M', u'初'),
- (0x1F221, 'M', u'終'),
- (0x1F222, 'M', u'生'),
- (0x1F223, 'M', u'販'),
+ (0x1EEB9, "M", "ض"),
+ (0x1EEBA, "M", "ظ"),
+ (0x1EEBB, "M", "غ"),
+ (0x1EEBC, "X"),
+ (0x1EEF0, "V"),
+ (0x1EEF2, "X"),
+ (0x1F000, "V"),
+ (0x1F02C, "X"),
+ (0x1F030, "V"),
+ (0x1F094, "X"),
+ (0x1F0A0, "V"),
+ (0x1F0AF, "X"),
+ (0x1F0B1, "V"),
+ (0x1F0C0, "X"),
+ (0x1F0C1, "V"),
+ (0x1F0D0, "X"),
+ (0x1F0D1, "V"),
+ (0x1F0F6, "X"),
+ (0x1F101, "3", "0,"),
+ (0x1F102, "3", "1,"),
+ (0x1F103, "3", "2,"),
+ (0x1F104, "3", "3,"),
+ (0x1F105, "3", "4,"),
+ (0x1F106, "3", "5,"),
+ (0x1F107, "3", "6,"),
+ (0x1F108, "3", "7,"),
+ (0x1F109, "3", "8,"),
+ (0x1F10A, "3", "9,"),
+ (0x1F10B, "V"),
+ (0x1F110, "3", "(a)"),
+ (0x1F111, "3", "(b)"),
+ (0x1F112, "3", "(c)"),
+ (0x1F113, "3", "(d)"),
+ (0x1F114, "3", "(e)"),
+ (0x1F115, "3", "(f)"),
+ (0x1F116, "3", "(g)"),
+ (0x1F117, "3", "(h)"),
+ (0x1F118, "3", "(i)"),
+ (0x1F119, "3", "(j)"),
+ (0x1F11A, "3", "(k)"),
+ (0x1F11B, "3", "(l)"),
+ (0x1F11C, "3", "(m)"),
+ (0x1F11D, "3", "(n)"),
+ (0x1F11E, "3", "(o)"),
+ (0x1F11F, "3", "(p)"),
+ (0x1F120, "3", "(q)"),
+ (0x1F121, "3", "(r)"),
+ (0x1F122, "3", "(s)"),
+ (0x1F123, "3", "(t)"),
+ (0x1F124, "3", "(u)"),
+ (0x1F125, "3", "(v)"),
+ (0x1F126, "3", "(w)"),
+ (0x1F127, "3", "(x)"),
+ (0x1F128, "3", "(y)"),
+ (0x1F129, "3", "(z)"),
+ (0x1F12A, "M", "〔s〕"),
+ (0x1F12B, "M", "c"),
+ (0x1F12C, "M", "r"),
+ (0x1F12D, "M", "cd"),
+ (0x1F12E, "M", "wz"),
+ (0x1F12F, "V"),
+ (0x1F130, "M", "a"),
+ (0x1F131, "M", "b"),
+ (0x1F132, "M", "c"),
+ (0x1F133, "M", "d"),
+ (0x1F134, "M", "e"),
+ (0x1F135, "M", "f"),
+ (0x1F136, "M", "g"),
+ (0x1F137, "M", "h"),
+ (0x1F138, "M", "i"),
+ (0x1F139, "M", "j"),
+ (0x1F13A, "M", "k"),
+ (0x1F13B, "M", "l"),
+ (0x1F13C, "M", "m"),
+ (0x1F13D, "M", "n"),
+ (0x1F13E, "M", "o"),
+ (0x1F13F, "M", "p"),
+ (0x1F140, "M", "q"),
+ (0x1F141, "M", "r"),
+ (0x1F142, "M", "s"),
+ (0x1F143, "M", "t"),
+ (0x1F144, "M", "u"),
+ (0x1F145, "M", "v"),
+ (0x1F146, "M", "w"),
+ (0x1F147, "M", "x"),
+ (0x1F148, "M", "y"),
+ (0x1F149, "M", "z"),
+ (0x1F14A, "M", "hv"),
+ (0x1F14B, "M", "mv"),
+ (0x1F14C, "M", "sd"),
+ (0x1F14D, "M", "ss"),
+ (0x1F14E, "M", "ppv"),
+ (0x1F14F, "M", "wc"),
+ (0x1F150, "V"),
+ (0x1F16A, "M", "mc"),
+ (0x1F16B, "M", "md"),
+ (0x1F16C, "M", "mr"),
+ (0x1F16D, "V"),
+ (0x1F190, "M", "dj"),
+ (0x1F191, "V"),
]
-def _seg_73():
+
+def _seg_75() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x1F224, 'M', u'声'),
- (0x1F225, 'M', u'吹'),
- (0x1F226, 'M', u'演'),
- (0x1F227, 'M', u'投'),
- (0x1F228, 'M', u'捕'),
- (0x1F229, 'M', u'一'),
- (0x1F22A, 'M', u'三'),
- (0x1F22B, 'M', u'遊'),
- (0x1F22C, 'M', u'左'),
- (0x1F22D, 'M', u'中'),
- (0x1F22E, 'M', u'右'),
- (0x1F22F, 'M', u'指'),
- (0x1F230, 'M', u'走'),
- (0x1F231, 'M', u'打'),
- (0x1F232, 'M', u'禁'),
- (0x1F233, 'M', u'空'),
- (0x1F234, 'M', u'合'),
- (0x1F235, 'M', u'満'),
- (0x1F236, 'M', u'有'),
- (0x1F237, 'M', u'月'),
- (0x1F238, 'M', u'申'),
- (0x1F239, 'M', u'割'),
- (0x1F23A, 'M', u'営'),
- (0x1F23B, 'M', u'配'),
- (0x1F23C, 'X'),
- (0x1F240, 'M', u'〔本〕'),
- (0x1F241, 'M', u'〔三〕'),
- (0x1F242, 'M', u'〔二〕'),
- (0x1F243, 'M', u'〔安〕'),
- (0x1F244, 'M', u'〔点〕'),
- (0x1F245, 'M', u'〔打〕'),
- (0x1F246, 'M', u'〔盗〕'),
- (0x1F247, 'M', u'〔勝〕'),
- (0x1F248, 'M', u'〔敗〕'),
- (0x1F249, 'X'),
- (0x1F250, 'M', u'得'),
- (0x1F251, 'M', u'可'),
- (0x1F252, 'X'),
- (0x1F260, 'V'),
- (0x1F266, 'X'),
- (0x1F300, 'V'),
- (0x1F6D8, 'X'),
- (0x1F6E0, 'V'),
- (0x1F6ED, 'X'),
- (0x1F6F0, 'V'),
- (0x1F6FD, 'X'),
- (0x1F700, 'V'),
- (0x1F774, 'X'),
- (0x1F780, 'V'),
- (0x1F7D9, 'X'),
- (0x1F7E0, 'V'),
- (0x1F7EC, 'X'),
- (0x1F800, 'V'),
- (0x1F80C, 'X'),
- (0x1F810, 'V'),
- (0x1F848, 'X'),
- (0x1F850, 'V'),
- (0x1F85A, 'X'),
- (0x1F860, 'V'),
- (0x1F888, 'X'),
- (0x1F890, 'V'),
- (0x1F8AE, 'X'),
- (0x1F8B0, 'V'),
- (0x1F8B2, 'X'),
- (0x1F900, 'V'),
- (0x1F979, 'X'),
- (0x1F97A, 'V'),
- (0x1F9CC, 'X'),
- (0x1F9CD, 'V'),
- (0x1FA54, 'X'),
- (0x1FA60, 'V'),
- (0x1FA6E, 'X'),
- (0x1FA70, 'V'),
- (0x1FA75, 'X'),
- (0x1FA78, 'V'),
- (0x1FA7B, 'X'),
- (0x1FA80, 'V'),
- (0x1FA87, 'X'),
- (0x1FA90, 'V'),
- (0x1FAA9, 'X'),
- (0x1FAB0, 'V'),
- (0x1FAB7, 'X'),
- (0x1FAC0, 'V'),
- (0x1FAC3, 'X'),
- (0x1FAD0, 'V'),
- (0x1FAD7, 'X'),
- (0x1FB00, 'V'),
- (0x1FB93, 'X'),
- (0x1FB94, 'V'),
- (0x1FBCB, 'X'),
- (0x1FBF0, 'M', u'0'),
- (0x1FBF1, 'M', u'1'),
- (0x1FBF2, 'M', u'2'),
- (0x1FBF3, 'M', u'3'),
- (0x1FBF4, 'M', u'4'),
- (0x1FBF5, 'M', u'5'),
- (0x1FBF6, 'M', u'6'),
- (0x1FBF7, 'M', u'7'),
- (0x1FBF8, 'M', u'8'),
- (0x1FBF9, 'M', u'9'),
+ (0x1F1AE, "X"),
+ (0x1F1E6, "V"),
+ (0x1F200, "M", "ほか"),
+ (0x1F201, "M", "ココ"),
+ (0x1F202, "M", "サ"),
+ (0x1F203, "X"),
+ (0x1F210, "M", "手"),
+ (0x1F211, "M", "字"),
+ (0x1F212, "M", "双"),
+ (0x1F213, "M", "デ"),
+ (0x1F214, "M", "二"),
+ (0x1F215, "M", "多"),
+ (0x1F216, "M", "解"),
+ (0x1F217, "M", "天"),
+ (0x1F218, "M", "交"),
+ (0x1F219, "M", "映"),
+ (0x1F21A, "M", "無"),
+ (0x1F21B, "M", "料"),
+ (0x1F21C, "M", "前"),
+ (0x1F21D, "M", "後"),
+ (0x1F21E, "M", "再"),
+ (0x1F21F, "M", "新"),
+ (0x1F220, "M", "初"),
+ (0x1F221, "M", "終"),
+ (0x1F222, "M", "生"),
+ (0x1F223, "M", "販"),
+ (0x1F224, "M", "声"),
+ (0x1F225, "M", "吹"),
+ (0x1F226, "M", "演"),
+ (0x1F227, "M", "投"),
+ (0x1F228, "M", "捕"),
+ (0x1F229, "M", "一"),
+ (0x1F22A, "M", "三"),
+ (0x1F22B, "M", "遊"),
+ (0x1F22C, "M", "左"),
+ (0x1F22D, "M", "中"),
+ (0x1F22E, "M", "右"),
+ (0x1F22F, "M", "指"),
+ (0x1F230, "M", "走"),
+ (0x1F231, "M", "打"),
+ (0x1F232, "M", "禁"),
+ (0x1F233, "M", "空"),
+ (0x1F234, "M", "合"),
+ (0x1F235, "M", "満"),
+ (0x1F236, "M", "有"),
+ (0x1F237, "M", "月"),
+ (0x1F238, "M", "申"),
+ (0x1F239, "M", "割"),
+ (0x1F23A, "M", "営"),
+ (0x1F23B, "M", "配"),
+ (0x1F23C, "X"),
+ (0x1F240, "M", "〔本〕"),
+ (0x1F241, "M", "〔三〕"),
+ (0x1F242, "M", "〔二〕"),
+ (0x1F243, "M", "〔安〕"),
+ (0x1F244, "M", "〔点〕"),
+ (0x1F245, "M", "〔打〕"),
+ (0x1F246, "M", "〔盗〕"),
+ (0x1F247, "M", "〔勝〕"),
+ (0x1F248, "M", "〔敗〕"),
+ (0x1F249, "X"),
+ (0x1F250, "M", "得"),
+ (0x1F251, "M", "可"),
+ (0x1F252, "X"),
+ (0x1F260, "V"),
+ (0x1F266, "X"),
+ (0x1F300, "V"),
+ (0x1F6D8, "X"),
+ (0x1F6DC, "V"),
+ (0x1F6ED, "X"),
+ (0x1F6F0, "V"),
+ (0x1F6FD, "X"),
+ (0x1F700, "V"),
+ (0x1F777, "X"),
+ (0x1F77B, "V"),
+ (0x1F7DA, "X"),
+ (0x1F7E0, "V"),
+ (0x1F7EC, "X"),
+ (0x1F7F0, "V"),
+ (0x1F7F1, "X"),
+ (0x1F800, "V"),
+ (0x1F80C, "X"),
+ (0x1F810, "V"),
+ (0x1F848, "X"),
+ (0x1F850, "V"),
+ (0x1F85A, "X"),
+ (0x1F860, "V"),
+ (0x1F888, "X"),
+ (0x1F890, "V"),
+ (0x1F8AE, "X"),
+ (0x1F8B0, "V"),
+ (0x1F8B2, "X"),
+ (0x1F900, "V"),
+ (0x1FA54, "X"),
+ (0x1FA60, "V"),
+ (0x1FA6E, "X"),
+ (0x1FA70, "V"),
+ (0x1FA7D, "X"),
+ (0x1FA80, "V"),
+ (0x1FA89, "X"),
]
-def _seg_74():
+
+def _seg_76() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x1FBFA, 'X'),
- (0x20000, 'V'),
- (0x2A6DE, 'X'),
- (0x2A700, 'V'),
- (0x2B735, 'X'),
- (0x2B740, 'V'),
- (0x2B81E, 'X'),
- (0x2B820, 'V'),
- (0x2CEA2, 'X'),
- (0x2CEB0, 'V'),
- (0x2EBE1, 'X'),
- (0x2F800, 'M', u'丽'),
- (0x2F801, 'M', u'丸'),
- (0x2F802, 'M', u'乁'),
- (0x2F803, 'M', u'𠄢'),
- (0x2F804, 'M', u'你'),
- (0x2F805, 'M', u'侮'),
- (0x2F806, 'M', u'侻'),
- (0x2F807, 'M', u'倂'),
- (0x2F808, 'M', u'偺'),
- (0x2F809, 'M', u'備'),
- (0x2F80A, 'M', u'僧'),
- (0x2F80B, 'M', u'像'),
- (0x2F80C, 'M', u'㒞'),
- (0x2F80D, 'M', u'𠘺'),
- (0x2F80E, 'M', u'免'),
- (0x2F80F, 'M', u'兔'),
- (0x2F810, 'M', u'兤'),
- (0x2F811, 'M', u'具'),
- (0x2F812, 'M', u'𠔜'),
- (0x2F813, 'M', u'㒹'),
- (0x2F814, 'M', u'內'),
- (0x2F815, 'M', u'再'),
- (0x2F816, 'M', u'𠕋'),
- (0x2F817, 'M', u'冗'),
- (0x2F818, 'M', u'冤'),
- (0x2F819, 'M', u'仌'),
- (0x2F81A, 'M', u'冬'),
- (0x2F81B, 'M', u'况'),
- (0x2F81C, 'M', u'𩇟'),
- (0x2F81D, 'M', u'凵'),
- (0x2F81E, 'M', u'刃'),
- (0x2F81F, 'M', u'㓟'),
- (0x2F820, 'M', u'刻'),
- (0x2F821, 'M', u'剆'),
- (0x2F822, 'M', u'割'),
- (0x2F823, 'M', u'剷'),
- (0x2F824, 'M', u'㔕'),
- (0x2F825, 'M', u'勇'),
- (0x2F826, 'M', u'勉'),
- (0x2F827, 'M', u'勤'),
- (0x2F828, 'M', u'勺'),
- (0x2F829, 'M', u'包'),
- (0x2F82A, 'M', u'匆'),
- (0x2F82B, 'M', u'北'),
- (0x2F82C, 'M', u'卉'),
- (0x2F82D, 'M', u'卑'),
- (0x2F82E, 'M', u'博'),
- (0x2F82F, 'M', u'即'),
- (0x2F830, 'M', u'卽'),
- (0x2F831, 'M', u'卿'),
- (0x2F834, 'M', u'𠨬'),
- (0x2F835, 'M', u'灰'),
- (0x2F836, 'M', u'及'),
- (0x2F837, 'M', u'叟'),
- (0x2F838, 'M', u'𠭣'),
- (0x2F839, 'M', u'叫'),
- (0x2F83A, 'M', u'叱'),
- (0x2F83B, 'M', u'吆'),
- (0x2F83C, 'M', u'咞'),
- (0x2F83D, 'M', u'吸'),
- (0x2F83E, 'M', u'呈'),
- (0x2F83F, 'M', u'周'),
- (0x2F840, 'M', u'咢'),
- (0x2F841, 'M', u'哶'),
- (0x2F842, 'M', u'唐'),
- (0x2F843, 'M', u'啓'),
- (0x2F844, 'M', u'啣'),
- (0x2F845, 'M', u'善'),
- (0x2F847, 'M', u'喙'),
- (0x2F848, 'M', u'喫'),
- (0x2F849, 'M', u'喳'),
- (0x2F84A, 'M', u'嗂'),
- (0x2F84B, 'M', u'圖'),
- (0x2F84C, 'M', u'嘆'),
- (0x2F84D, 'M', u'圗'),
- (0x2F84E, 'M', u'噑'),
- (0x2F84F, 'M', u'噴'),
- (0x2F850, 'M', u'切'),
- (0x2F851, 'M', u'壮'),
- (0x2F852, 'M', u'城'),
- (0x2F853, 'M', u'埴'),
- (0x2F854, 'M', u'堍'),
- (0x2F855, 'M', u'型'),
- (0x2F856, 'M', u'堲'),
- (0x2F857, 'M', u'報'),
- (0x2F858, 'M', u'墬'),
- (0x2F859, 'M', u'𡓤'),
- (0x2F85A, 'M', u'売'),
- (0x2F85B, 'M', u'壷'),
+ (0x1FA90, "V"),
+ (0x1FABE, "X"),
+ (0x1FABF, "V"),
+ (0x1FAC6, "X"),
+ (0x1FACE, "V"),
+ (0x1FADC, "X"),
+ (0x1FAE0, "V"),
+ (0x1FAE9, "X"),
+ (0x1FAF0, "V"),
+ (0x1FAF9, "X"),
+ (0x1FB00, "V"),
+ (0x1FB93, "X"),
+ (0x1FB94, "V"),
+ (0x1FBCB, "X"),
+ (0x1FBF0, "M", "0"),
+ (0x1FBF1, "M", "1"),
+ (0x1FBF2, "M", "2"),
+ (0x1FBF3, "M", "3"),
+ (0x1FBF4, "M", "4"),
+ (0x1FBF5, "M", "5"),
+ (0x1FBF6, "M", "6"),
+ (0x1FBF7, "M", "7"),
+ (0x1FBF8, "M", "8"),
+ (0x1FBF9, "M", "9"),
+ (0x1FBFA, "X"),
+ (0x20000, "V"),
+ (0x2A6E0, "X"),
+ (0x2A700, "V"),
+ (0x2B73A, "X"),
+ (0x2B740, "V"),
+ (0x2B81E, "X"),
+ (0x2B820, "V"),
+ (0x2CEA2, "X"),
+ (0x2CEB0, "V"),
+ (0x2EBE1, "X"),
+ (0x2EBF0, "V"),
+ (0x2EE5E, "X"),
+ (0x2F800, "M", "丽"),
+ (0x2F801, "M", "丸"),
+ (0x2F802, "M", "乁"),
+ (0x2F803, "M", "𠄢"),
+ (0x2F804, "M", "你"),
+ (0x2F805, "M", "侮"),
+ (0x2F806, "M", "侻"),
+ (0x2F807, "M", "倂"),
+ (0x2F808, "M", "偺"),
+ (0x2F809, "M", "備"),
+ (0x2F80A, "M", "僧"),
+ (0x2F80B, "M", "像"),
+ (0x2F80C, "M", "㒞"),
+ (0x2F80D, "M", "𠘺"),
+ (0x2F80E, "M", "免"),
+ (0x2F80F, "M", "兔"),
+ (0x2F810, "M", "兤"),
+ (0x2F811, "M", "具"),
+ (0x2F812, "M", "𠔜"),
+ (0x2F813, "M", "㒹"),
+ (0x2F814, "M", "內"),
+ (0x2F815, "M", "再"),
+ (0x2F816, "M", "𠕋"),
+ (0x2F817, "M", "冗"),
+ (0x2F818, "M", "冤"),
+ (0x2F819, "M", "仌"),
+ (0x2F81A, "M", "冬"),
+ (0x2F81B, "M", "况"),
+ (0x2F81C, "M", "𩇟"),
+ (0x2F81D, "M", "凵"),
+ (0x2F81E, "M", "刃"),
+ (0x2F81F, "M", "㓟"),
+ (0x2F820, "M", "刻"),
+ (0x2F821, "M", "剆"),
+ (0x2F822, "M", "割"),
+ (0x2F823, "M", "剷"),
+ (0x2F824, "M", "㔕"),
+ (0x2F825, "M", "勇"),
+ (0x2F826, "M", "勉"),
+ (0x2F827, "M", "勤"),
+ (0x2F828, "M", "勺"),
+ (0x2F829, "M", "包"),
+ (0x2F82A, "M", "匆"),
+ (0x2F82B, "M", "北"),
+ (0x2F82C, "M", "卉"),
+ (0x2F82D, "M", "卑"),
+ (0x2F82E, "M", "博"),
+ (0x2F82F, "M", "即"),
+ (0x2F830, "M", "卽"),
+ (0x2F831, "M", "卿"),
+ (0x2F834, "M", "𠨬"),
+ (0x2F835, "M", "灰"),
+ (0x2F836, "M", "及"),
+ (0x2F837, "M", "叟"),
+ (0x2F838, "M", "𠭣"),
+ (0x2F839, "M", "叫"),
+ (0x2F83A, "M", "叱"),
+ (0x2F83B, "M", "吆"),
+ (0x2F83C, "M", "咞"),
+ (0x2F83D, "M", "吸"),
+ (0x2F83E, "M", "呈"),
+ (0x2F83F, "M", "周"),
+ (0x2F840, "M", "咢"),
]
-def _seg_75():
+
+def _seg_77() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x2F85C, 'M', u'夆'),
- (0x2F85D, 'M', u'多'),
- (0x2F85E, 'M', u'夢'),
- (0x2F85F, 'M', u'奢'),
- (0x2F860, 'M', u'𡚨'),
- (0x2F861, 'M', u'𡛪'),
- (0x2F862, 'M', u'姬'),
- (0x2F863, 'M', u'娛'),
- (0x2F864, 'M', u'娧'),
- (0x2F865, 'M', u'姘'),
- (0x2F866, 'M', u'婦'),
- (0x2F867, 'M', u'㛮'),
- (0x2F868, 'X'),
- (0x2F869, 'M', u'嬈'),
- (0x2F86A, 'M', u'嬾'),
- (0x2F86C, 'M', u'𡧈'),
- (0x2F86D, 'M', u'寃'),
- (0x2F86E, 'M', u'寘'),
- (0x2F86F, 'M', u'寧'),
- (0x2F870, 'M', u'寳'),
- (0x2F871, 'M', u'𡬘'),
- (0x2F872, 'M', u'寿'),
- (0x2F873, 'M', u'将'),
- (0x2F874, 'X'),
- (0x2F875, 'M', u'尢'),
- (0x2F876, 'M', u'㞁'),
- (0x2F877, 'M', u'屠'),
- (0x2F878, 'M', u'屮'),
- (0x2F879, 'M', u'峀'),
- (0x2F87A, 'M', u'岍'),
- (0x2F87B, 'M', u'𡷤'),
- (0x2F87C, 'M', u'嵃'),
- (0x2F87D, 'M', u'𡷦'),
- (0x2F87E, 'M', u'嵮'),
- (0x2F87F, 'M', u'嵫'),
- (0x2F880, 'M', u'嵼'),
- (0x2F881, 'M', u'巡'),
- (0x2F882, 'M', u'巢'),
- (0x2F883, 'M', u'㠯'),
- (0x2F884, 'M', u'巽'),
- (0x2F885, 'M', u'帨'),
- (0x2F886, 'M', u'帽'),
- (0x2F887, 'M', u'幩'),
- (0x2F888, 'M', u'㡢'),
- (0x2F889, 'M', u'𢆃'),
- (0x2F88A, 'M', u'㡼'),
- (0x2F88B, 'M', u'庰'),
- (0x2F88C, 'M', u'庳'),
- (0x2F88D, 'M', u'庶'),
- (0x2F88E, 'M', u'廊'),
- (0x2F88F, 'M', u'𪎒'),
- (0x2F890, 'M', u'廾'),
- (0x2F891, 'M', u'𢌱'),
- (0x2F893, 'M', u'舁'),
- (0x2F894, 'M', u'弢'),
- (0x2F896, 'M', u'㣇'),
- (0x2F897, 'M', u'𣊸'),
- (0x2F898, 'M', u'𦇚'),
- (0x2F899, 'M', u'形'),
- (0x2F89A, 'M', u'彫'),
- (0x2F89B, 'M', u'㣣'),
- (0x2F89C, 'M', u'徚'),
- (0x2F89D, 'M', u'忍'),
- (0x2F89E, 'M', u'志'),
- (0x2F89F, 'M', u'忹'),
- (0x2F8A0, 'M', u'悁'),
- (0x2F8A1, 'M', u'㤺'),
- (0x2F8A2, 'M', u'㤜'),
- (0x2F8A3, 'M', u'悔'),
- (0x2F8A4, 'M', u'𢛔'),
- (0x2F8A5, 'M', u'惇'),
- (0x2F8A6, 'M', u'慈'),
- (0x2F8A7, 'M', u'慌'),
- (0x2F8A8, 'M', u'慎'),
- (0x2F8A9, 'M', u'慌'),
- (0x2F8AA, 'M', u'慺'),
- (0x2F8AB, 'M', u'憎'),
- (0x2F8AC, 'M', u'憲'),
- (0x2F8AD, 'M', u'憤'),
- (0x2F8AE, 'M', u'憯'),
- (0x2F8AF, 'M', u'懞'),
- (0x2F8B0, 'M', u'懲'),
- (0x2F8B1, 'M', u'懶'),
- (0x2F8B2, 'M', u'成'),
- (0x2F8B3, 'M', u'戛'),
- (0x2F8B4, 'M', u'扝'),
- (0x2F8B5, 'M', u'抱'),
- (0x2F8B6, 'M', u'拔'),
- (0x2F8B7, 'M', u'捐'),
- (0x2F8B8, 'M', u'𢬌'),
- (0x2F8B9, 'M', u'挽'),
- (0x2F8BA, 'M', u'拼'),
- (0x2F8BB, 'M', u'捨'),
- (0x2F8BC, 'M', u'掃'),
- (0x2F8BD, 'M', u'揤'),
- (0x2F8BE, 'M', u'𢯱'),
- (0x2F8BF, 'M', u'搢'),
- (0x2F8C0, 'M', u'揅'),
- (0x2F8C1, 'M', u'掩'),
- (0x2F8C2, 'M', u'㨮'),
+ (0x2F841, "M", "哶"),
+ (0x2F842, "M", "唐"),
+ (0x2F843, "M", "啓"),
+ (0x2F844, "M", "啣"),
+ (0x2F845, "M", "善"),
+ (0x2F847, "M", "喙"),
+ (0x2F848, "M", "喫"),
+ (0x2F849, "M", "喳"),
+ (0x2F84A, "M", "嗂"),
+ (0x2F84B, "M", "圖"),
+ (0x2F84C, "M", "嘆"),
+ (0x2F84D, "M", "圗"),
+ (0x2F84E, "M", "噑"),
+ (0x2F84F, "M", "噴"),
+ (0x2F850, "M", "切"),
+ (0x2F851, "M", "壮"),
+ (0x2F852, "M", "城"),
+ (0x2F853, "M", "埴"),
+ (0x2F854, "M", "堍"),
+ (0x2F855, "M", "型"),
+ (0x2F856, "M", "堲"),
+ (0x2F857, "M", "報"),
+ (0x2F858, "M", "墬"),
+ (0x2F859, "M", "𡓤"),
+ (0x2F85A, "M", "売"),
+ (0x2F85B, "M", "壷"),
+ (0x2F85C, "M", "夆"),
+ (0x2F85D, "M", "多"),
+ (0x2F85E, "M", "夢"),
+ (0x2F85F, "M", "奢"),
+ (0x2F860, "M", "𡚨"),
+ (0x2F861, "M", "𡛪"),
+ (0x2F862, "M", "姬"),
+ (0x2F863, "M", "娛"),
+ (0x2F864, "M", "娧"),
+ (0x2F865, "M", "姘"),
+ (0x2F866, "M", "婦"),
+ (0x2F867, "M", "㛮"),
+ (0x2F868, "X"),
+ (0x2F869, "M", "嬈"),
+ (0x2F86A, "M", "嬾"),
+ (0x2F86C, "M", "𡧈"),
+ (0x2F86D, "M", "寃"),
+ (0x2F86E, "M", "寘"),
+ (0x2F86F, "M", "寧"),
+ (0x2F870, "M", "寳"),
+ (0x2F871, "M", "𡬘"),
+ (0x2F872, "M", "寿"),
+ (0x2F873, "M", "将"),
+ (0x2F874, "X"),
+ (0x2F875, "M", "尢"),
+ (0x2F876, "M", "㞁"),
+ (0x2F877, "M", "屠"),
+ (0x2F878, "M", "屮"),
+ (0x2F879, "M", "峀"),
+ (0x2F87A, "M", "岍"),
+ (0x2F87B, "M", "𡷤"),
+ (0x2F87C, "M", "嵃"),
+ (0x2F87D, "M", "𡷦"),
+ (0x2F87E, "M", "嵮"),
+ (0x2F87F, "M", "嵫"),
+ (0x2F880, "M", "嵼"),
+ (0x2F881, "M", "巡"),
+ (0x2F882, "M", "巢"),
+ (0x2F883, "M", "㠯"),
+ (0x2F884, "M", "巽"),
+ (0x2F885, "M", "帨"),
+ (0x2F886, "M", "帽"),
+ (0x2F887, "M", "幩"),
+ (0x2F888, "M", "㡢"),
+ (0x2F889, "M", "𢆃"),
+ (0x2F88A, "M", "㡼"),
+ (0x2F88B, "M", "庰"),
+ (0x2F88C, "M", "庳"),
+ (0x2F88D, "M", "庶"),
+ (0x2F88E, "M", "廊"),
+ (0x2F88F, "M", "𪎒"),
+ (0x2F890, "M", "廾"),
+ (0x2F891, "M", "𢌱"),
+ (0x2F893, "M", "舁"),
+ (0x2F894, "M", "弢"),
+ (0x2F896, "M", "㣇"),
+ (0x2F897, "M", "𣊸"),
+ (0x2F898, "M", "𦇚"),
+ (0x2F899, "M", "形"),
+ (0x2F89A, "M", "彫"),
+ (0x2F89B, "M", "㣣"),
+ (0x2F89C, "M", "徚"),
+ (0x2F89D, "M", "忍"),
+ (0x2F89E, "M", "志"),
+ (0x2F89F, "M", "忹"),
+ (0x2F8A0, "M", "悁"),
+ (0x2F8A1, "M", "㤺"),
+ (0x2F8A2, "M", "㤜"),
+ (0x2F8A3, "M", "悔"),
+ (0x2F8A4, "M", "𢛔"),
+ (0x2F8A5, "M", "惇"),
+ (0x2F8A6, "M", "慈"),
+ (0x2F8A7, "M", "慌"),
+ (0x2F8A8, "M", "慎"),
]
-def _seg_76():
+
+def _seg_78() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x2F8C3, 'M', u'摩'),
- (0x2F8C4, 'M', u'摾'),
- (0x2F8C5, 'M', u'撝'),
- (0x2F8C6, 'M', u'摷'),
- (0x2F8C7, 'M', u'㩬'),
- (0x2F8C8, 'M', u'敏'),
- (0x2F8C9, 'M', u'敬'),
- (0x2F8CA, 'M', u'𣀊'),
- (0x2F8CB, 'M', u'旣'),
- (0x2F8CC, 'M', u'書'),
- (0x2F8CD, 'M', u'晉'),
- (0x2F8CE, 'M', u'㬙'),
- (0x2F8CF, 'M', u'暑'),
- (0x2F8D0, 'M', u'㬈'),
- (0x2F8D1, 'M', u'㫤'),
- (0x2F8D2, 'M', u'冒'),
- (0x2F8D3, 'M', u'冕'),
- (0x2F8D4, 'M', u'最'),
- (0x2F8D5, 'M', u'暜'),
- (0x2F8D6, 'M', u'肭'),
- (0x2F8D7, 'M', u'䏙'),
- (0x2F8D8, 'M', u'朗'),
- (0x2F8D9, 'M', u'望'),
- (0x2F8DA, 'M', u'朡'),
- (0x2F8DB, 'M', u'杞'),
- (0x2F8DC, 'M', u'杓'),
- (0x2F8DD, 'M', u'𣏃'),
- (0x2F8DE, 'M', u'㭉'),
- (0x2F8DF, 'M', u'柺'),
- (0x2F8E0, 'M', u'枅'),
- (0x2F8E1, 'M', u'桒'),
- (0x2F8E2, 'M', u'梅'),
- (0x2F8E3, 'M', u'𣑭'),
- (0x2F8E4, 'M', u'梎'),
- (0x2F8E5, 'M', u'栟'),
- (0x2F8E6, 'M', u'椔'),
- (0x2F8E7, 'M', u'㮝'),
- (0x2F8E8, 'M', u'楂'),
- (0x2F8E9, 'M', u'榣'),
- (0x2F8EA, 'M', u'槪'),
- (0x2F8EB, 'M', u'檨'),
- (0x2F8EC, 'M', u'𣚣'),
- (0x2F8ED, 'M', u'櫛'),
- (0x2F8EE, 'M', u'㰘'),
- (0x2F8EF, 'M', u'次'),
- (0x2F8F0, 'M', u'𣢧'),
- (0x2F8F1, 'M', u'歔'),
- (0x2F8F2, 'M', u'㱎'),
- (0x2F8F3, 'M', u'歲'),
- (0x2F8F4, 'M', u'殟'),
- (0x2F8F5, 'M', u'殺'),
- (0x2F8F6, 'M', u'殻'),
- (0x2F8F7, 'M', u'𣪍'),
- (0x2F8F8, 'M', u'𡴋'),
- (0x2F8F9, 'M', u'𣫺'),
- (0x2F8FA, 'M', u'汎'),
- (0x2F8FB, 'M', u'𣲼'),
- (0x2F8FC, 'M', u'沿'),
- (0x2F8FD, 'M', u'泍'),
- (0x2F8FE, 'M', u'汧'),
- (0x2F8FF, 'M', u'洖'),
- (0x2F900, 'M', u'派'),
- (0x2F901, 'M', u'海'),
- (0x2F902, 'M', u'流'),
- (0x2F903, 'M', u'浩'),
- (0x2F904, 'M', u'浸'),
- (0x2F905, 'M', u'涅'),
- (0x2F906, 'M', u'𣴞'),
- (0x2F907, 'M', u'洴'),
- (0x2F908, 'M', u'港'),
- (0x2F909, 'M', u'湮'),
- (0x2F90A, 'M', u'㴳'),
- (0x2F90B, 'M', u'滋'),
- (0x2F90C, 'M', u'滇'),
- (0x2F90D, 'M', u'𣻑'),
- (0x2F90E, 'M', u'淹'),
- (0x2F90F, 'M', u'潮'),
- (0x2F910, 'M', u'𣽞'),
- (0x2F911, 'M', u'𣾎'),
- (0x2F912, 'M', u'濆'),
- (0x2F913, 'M', u'瀹'),
- (0x2F914, 'M', u'瀞'),
- (0x2F915, 'M', u'瀛'),
- (0x2F916, 'M', u'㶖'),
- (0x2F917, 'M', u'灊'),
- (0x2F918, 'M', u'災'),
- (0x2F919, 'M', u'灷'),
- (0x2F91A, 'M', u'炭'),
- (0x2F91B, 'M', u'𠔥'),
- (0x2F91C, 'M', u'煅'),
- (0x2F91D, 'M', u'𤉣'),
- (0x2F91E, 'M', u'熜'),
- (0x2F91F, 'X'),
- (0x2F920, 'M', u'爨'),
- (0x2F921, 'M', u'爵'),
- (0x2F922, 'M', u'牐'),
- (0x2F923, 'M', u'𤘈'),
- (0x2F924, 'M', u'犀'),
- (0x2F925, 'M', u'犕'),
- (0x2F926, 'M', u'𤜵'),
+ (0x2F8A9, "M", "慌"),
+ (0x2F8AA, "M", "慺"),
+ (0x2F8AB, "M", "憎"),
+ (0x2F8AC, "M", "憲"),
+ (0x2F8AD, "M", "憤"),
+ (0x2F8AE, "M", "憯"),
+ (0x2F8AF, "M", "懞"),
+ (0x2F8B0, "M", "懲"),
+ (0x2F8B1, "M", "懶"),
+ (0x2F8B2, "M", "成"),
+ (0x2F8B3, "M", "戛"),
+ (0x2F8B4, "M", "扝"),
+ (0x2F8B5, "M", "抱"),
+ (0x2F8B6, "M", "拔"),
+ (0x2F8B7, "M", "捐"),
+ (0x2F8B8, "M", "𢬌"),
+ (0x2F8B9, "M", "挽"),
+ (0x2F8BA, "M", "拼"),
+ (0x2F8BB, "M", "捨"),
+ (0x2F8BC, "M", "掃"),
+ (0x2F8BD, "M", "揤"),
+ (0x2F8BE, "M", "𢯱"),
+ (0x2F8BF, "M", "搢"),
+ (0x2F8C0, "M", "揅"),
+ (0x2F8C1, "M", "掩"),
+ (0x2F8C2, "M", "㨮"),
+ (0x2F8C3, "M", "摩"),
+ (0x2F8C4, "M", "摾"),
+ (0x2F8C5, "M", "撝"),
+ (0x2F8C6, "M", "摷"),
+ (0x2F8C7, "M", "㩬"),
+ (0x2F8C8, "M", "敏"),
+ (0x2F8C9, "M", "敬"),
+ (0x2F8CA, "M", "𣀊"),
+ (0x2F8CB, "M", "旣"),
+ (0x2F8CC, "M", "書"),
+ (0x2F8CD, "M", "晉"),
+ (0x2F8CE, "M", "㬙"),
+ (0x2F8CF, "M", "暑"),
+ (0x2F8D0, "M", "㬈"),
+ (0x2F8D1, "M", "㫤"),
+ (0x2F8D2, "M", "冒"),
+ (0x2F8D3, "M", "冕"),
+ (0x2F8D4, "M", "最"),
+ (0x2F8D5, "M", "暜"),
+ (0x2F8D6, "M", "肭"),
+ (0x2F8D7, "M", "䏙"),
+ (0x2F8D8, "M", "朗"),
+ (0x2F8D9, "M", "望"),
+ (0x2F8DA, "M", "朡"),
+ (0x2F8DB, "M", "杞"),
+ (0x2F8DC, "M", "杓"),
+ (0x2F8DD, "M", "𣏃"),
+ (0x2F8DE, "M", "㭉"),
+ (0x2F8DF, "M", "柺"),
+ (0x2F8E0, "M", "枅"),
+ (0x2F8E1, "M", "桒"),
+ (0x2F8E2, "M", "梅"),
+ (0x2F8E3, "M", "𣑭"),
+ (0x2F8E4, "M", "梎"),
+ (0x2F8E5, "M", "栟"),
+ (0x2F8E6, "M", "椔"),
+ (0x2F8E7, "M", "㮝"),
+ (0x2F8E8, "M", "楂"),
+ (0x2F8E9, "M", "榣"),
+ (0x2F8EA, "M", "槪"),
+ (0x2F8EB, "M", "檨"),
+ (0x2F8EC, "M", "𣚣"),
+ (0x2F8ED, "M", "櫛"),
+ (0x2F8EE, "M", "㰘"),
+ (0x2F8EF, "M", "次"),
+ (0x2F8F0, "M", "𣢧"),
+ (0x2F8F1, "M", "歔"),
+ (0x2F8F2, "M", "㱎"),
+ (0x2F8F3, "M", "歲"),
+ (0x2F8F4, "M", "殟"),
+ (0x2F8F5, "M", "殺"),
+ (0x2F8F6, "M", "殻"),
+ (0x2F8F7, "M", "𣪍"),
+ (0x2F8F8, "M", "𡴋"),
+ (0x2F8F9, "M", "𣫺"),
+ (0x2F8FA, "M", "汎"),
+ (0x2F8FB, "M", "𣲼"),
+ (0x2F8FC, "M", "沿"),
+ (0x2F8FD, "M", "泍"),
+ (0x2F8FE, "M", "汧"),
+ (0x2F8FF, "M", "洖"),
+ (0x2F900, "M", "派"),
+ (0x2F901, "M", "海"),
+ (0x2F902, "M", "流"),
+ (0x2F903, "M", "浩"),
+ (0x2F904, "M", "浸"),
+ (0x2F905, "M", "涅"),
+ (0x2F906, "M", "𣴞"),
+ (0x2F907, "M", "洴"),
+ (0x2F908, "M", "港"),
+ (0x2F909, "M", "湮"),
+ (0x2F90A, "M", "㴳"),
+ (0x2F90B, "M", "滋"),
+ (0x2F90C, "M", "滇"),
]
-def _seg_77():
+
+def _seg_79() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x2F927, 'M', u'𤠔'),
- (0x2F928, 'M', u'獺'),
- (0x2F929, 'M', u'王'),
- (0x2F92A, 'M', u'㺬'),
- (0x2F92B, 'M', u'玥'),
- (0x2F92C, 'M', u'㺸'),
- (0x2F92E, 'M', u'瑇'),
- (0x2F92F, 'M', u'瑜'),
- (0x2F930, 'M', u'瑱'),
- (0x2F931, 'M', u'璅'),
- (0x2F932, 'M', u'瓊'),
- (0x2F933, 'M', u'㼛'),
- (0x2F934, 'M', u'甤'),
- (0x2F935, 'M', u'𤰶'),
- (0x2F936, 'M', u'甾'),
- (0x2F937, 'M', u'𤲒'),
- (0x2F938, 'M', u'異'),
- (0x2F939, 'M', u'𢆟'),
- (0x2F93A, 'M', u'瘐'),
- (0x2F93B, 'M', u'𤾡'),
- (0x2F93C, 'M', u'𤾸'),
- (0x2F93D, 'M', u'𥁄'),
- (0x2F93E, 'M', u'㿼'),
- (0x2F93F, 'M', u'䀈'),
- (0x2F940, 'M', u'直'),
- (0x2F941, 'M', u'𥃳'),
- (0x2F942, 'M', u'𥃲'),
- (0x2F943, 'M', u'𥄙'),
- (0x2F944, 'M', u'𥄳'),
- (0x2F945, 'M', u'眞'),
- (0x2F946, 'M', u'真'),
- (0x2F948, 'M', u'睊'),
- (0x2F949, 'M', u'䀹'),
- (0x2F94A, 'M', u'瞋'),
- (0x2F94B, 'M', u'䁆'),
- (0x2F94C, 'M', u'䂖'),
- (0x2F94D, 'M', u'𥐝'),
- (0x2F94E, 'M', u'硎'),
- (0x2F94F, 'M', u'碌'),
- (0x2F950, 'M', u'磌'),
- (0x2F951, 'M', u'䃣'),
- (0x2F952, 'M', u'𥘦'),
- (0x2F953, 'M', u'祖'),
- (0x2F954, 'M', u'𥚚'),
- (0x2F955, 'M', u'𥛅'),
- (0x2F956, 'M', u'福'),
- (0x2F957, 'M', u'秫'),
- (0x2F958, 'M', u'䄯'),
- (0x2F959, 'M', u'穀'),
- (0x2F95A, 'M', u'穊'),
- (0x2F95B, 'M', u'穏'),
- (0x2F95C, 'M', u'𥥼'),
- (0x2F95D, 'M', u'𥪧'),
- (0x2F95F, 'X'),
- (0x2F960, 'M', u'䈂'),
- (0x2F961, 'M', u'𥮫'),
- (0x2F962, 'M', u'篆'),
- (0x2F963, 'M', u'築'),
- (0x2F964, 'M', u'䈧'),
- (0x2F965, 'M', u'𥲀'),
- (0x2F966, 'M', u'糒'),
- (0x2F967, 'M', u'䊠'),
- (0x2F968, 'M', u'糨'),
- (0x2F969, 'M', u'糣'),
- (0x2F96A, 'M', u'紀'),
- (0x2F96B, 'M', u'𥾆'),
- (0x2F96C, 'M', u'絣'),
- (0x2F96D, 'M', u'䌁'),
- (0x2F96E, 'M', u'緇'),
- (0x2F96F, 'M', u'縂'),
- (0x2F970, 'M', u'繅'),
- (0x2F971, 'M', u'䌴'),
- (0x2F972, 'M', u'𦈨'),
- (0x2F973, 'M', u'𦉇'),
- (0x2F974, 'M', u'䍙'),
- (0x2F975, 'M', u'𦋙'),
- (0x2F976, 'M', u'罺'),
- (0x2F977, 'M', u'𦌾'),
- (0x2F978, 'M', u'羕'),
- (0x2F979, 'M', u'翺'),
- (0x2F97A, 'M', u'者'),
- (0x2F97B, 'M', u'𦓚'),
- (0x2F97C, 'M', u'𦔣'),
- (0x2F97D, 'M', u'聠'),
- (0x2F97E, 'M', u'𦖨'),
- (0x2F97F, 'M', u'聰'),
- (0x2F980, 'M', u'𣍟'),
- (0x2F981, 'M', u'䏕'),
- (0x2F982, 'M', u'育'),
- (0x2F983, 'M', u'脃'),
- (0x2F984, 'M', u'䐋'),
- (0x2F985, 'M', u'脾'),
- (0x2F986, 'M', u'媵'),
- (0x2F987, 'M', u'𦞧'),
- (0x2F988, 'M', u'𦞵'),
- (0x2F989, 'M', u'𣎓'),
- (0x2F98A, 'M', u'𣎜'),
- (0x2F98B, 'M', u'舁'),
- (0x2F98C, 'M', u'舄'),
- (0x2F98D, 'M', u'辞'),
+ (0x2F90D, "M", "𣻑"),
+ (0x2F90E, "M", "淹"),
+ (0x2F90F, "M", "潮"),
+ (0x2F910, "M", "𣽞"),
+ (0x2F911, "M", "𣾎"),
+ (0x2F912, "M", "濆"),
+ (0x2F913, "M", "瀹"),
+ (0x2F914, "M", "瀞"),
+ (0x2F915, "M", "瀛"),
+ (0x2F916, "M", "㶖"),
+ (0x2F917, "M", "灊"),
+ (0x2F918, "M", "災"),
+ (0x2F919, "M", "灷"),
+ (0x2F91A, "M", "炭"),
+ (0x2F91B, "M", "𠔥"),
+ (0x2F91C, "M", "煅"),
+ (0x2F91D, "M", "𤉣"),
+ (0x2F91E, "M", "熜"),
+ (0x2F91F, "X"),
+ (0x2F920, "M", "爨"),
+ (0x2F921, "M", "爵"),
+ (0x2F922, "M", "牐"),
+ (0x2F923, "M", "𤘈"),
+ (0x2F924, "M", "犀"),
+ (0x2F925, "M", "犕"),
+ (0x2F926, "M", "𤜵"),
+ (0x2F927, "M", "𤠔"),
+ (0x2F928, "M", "獺"),
+ (0x2F929, "M", "王"),
+ (0x2F92A, "M", "㺬"),
+ (0x2F92B, "M", "玥"),
+ (0x2F92C, "M", "㺸"),
+ (0x2F92E, "M", "瑇"),
+ (0x2F92F, "M", "瑜"),
+ (0x2F930, "M", "瑱"),
+ (0x2F931, "M", "璅"),
+ (0x2F932, "M", "瓊"),
+ (0x2F933, "M", "㼛"),
+ (0x2F934, "M", "甤"),
+ (0x2F935, "M", "𤰶"),
+ (0x2F936, "M", "甾"),
+ (0x2F937, "M", "𤲒"),
+ (0x2F938, "M", "異"),
+ (0x2F939, "M", "𢆟"),
+ (0x2F93A, "M", "瘐"),
+ (0x2F93B, "M", "𤾡"),
+ (0x2F93C, "M", "𤾸"),
+ (0x2F93D, "M", "𥁄"),
+ (0x2F93E, "M", "㿼"),
+ (0x2F93F, "M", "䀈"),
+ (0x2F940, "M", "直"),
+ (0x2F941, "M", "𥃳"),
+ (0x2F942, "M", "𥃲"),
+ (0x2F943, "M", "𥄙"),
+ (0x2F944, "M", "𥄳"),
+ (0x2F945, "M", "眞"),
+ (0x2F946, "M", "真"),
+ (0x2F948, "M", "睊"),
+ (0x2F949, "M", "䀹"),
+ (0x2F94A, "M", "瞋"),
+ (0x2F94B, "M", "䁆"),
+ (0x2F94C, "M", "䂖"),
+ (0x2F94D, "M", "𥐝"),
+ (0x2F94E, "M", "硎"),
+ (0x2F94F, "M", "碌"),
+ (0x2F950, "M", "磌"),
+ (0x2F951, "M", "䃣"),
+ (0x2F952, "M", "𥘦"),
+ (0x2F953, "M", "祖"),
+ (0x2F954, "M", "𥚚"),
+ (0x2F955, "M", "𥛅"),
+ (0x2F956, "M", "福"),
+ (0x2F957, "M", "秫"),
+ (0x2F958, "M", "䄯"),
+ (0x2F959, "M", "穀"),
+ (0x2F95A, "M", "穊"),
+ (0x2F95B, "M", "穏"),
+ (0x2F95C, "M", "𥥼"),
+ (0x2F95D, "M", "𥪧"),
+ (0x2F95F, "X"),
+ (0x2F960, "M", "䈂"),
+ (0x2F961, "M", "𥮫"),
+ (0x2F962, "M", "篆"),
+ (0x2F963, "M", "築"),
+ (0x2F964, "M", "䈧"),
+ (0x2F965, "M", "𥲀"),
+ (0x2F966, "M", "糒"),
+ (0x2F967, "M", "䊠"),
+ (0x2F968, "M", "糨"),
+ (0x2F969, "M", "糣"),
+ (0x2F96A, "M", "紀"),
+ (0x2F96B, "M", "𥾆"),
+ (0x2F96C, "M", "絣"),
+ (0x2F96D, "M", "䌁"),
+ (0x2F96E, "M", "緇"),
+ (0x2F96F, "M", "縂"),
+ (0x2F970, "M", "繅"),
+ (0x2F971, "M", "䌴"),
+ (0x2F972, "M", "𦈨"),
+ (0x2F973, "M", "𦉇"),
]
-def _seg_78():
+
+def _seg_80() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x2F98E, 'M', u'䑫'),
- (0x2F98F, 'M', u'芑'),
- (0x2F990, 'M', u'芋'),
- (0x2F991, 'M', u'芝'),
- (0x2F992, 'M', u'劳'),
- (0x2F993, 'M', u'花'),
- (0x2F994, 'M', u'芳'),
- (0x2F995, 'M', u'芽'),
- (0x2F996, 'M', u'苦'),
- (0x2F997, 'M', u'𦬼'),
- (0x2F998, 'M', u'若'),
- (0x2F999, 'M', u'茝'),
- (0x2F99A, 'M', u'荣'),
- (0x2F99B, 'M', u'莭'),
- (0x2F99C, 'M', u'茣'),
- (0x2F99D, 'M', u'莽'),
- (0x2F99E, 'M', u'菧'),
- (0x2F99F, 'M', u'著'),
- (0x2F9A0, 'M', u'荓'),
- (0x2F9A1, 'M', u'菊'),
- (0x2F9A2, 'M', u'菌'),
- (0x2F9A3, 'M', u'菜'),
- (0x2F9A4, 'M', u'𦰶'),
- (0x2F9A5, 'M', u'𦵫'),
- (0x2F9A6, 'M', u'𦳕'),
- (0x2F9A7, 'M', u'䔫'),
- (0x2F9A8, 'M', u'蓱'),
- (0x2F9A9, 'M', u'蓳'),
- (0x2F9AA, 'M', u'蔖'),
- (0x2F9AB, 'M', u'𧏊'),
- (0x2F9AC, 'M', u'蕤'),
- (0x2F9AD, 'M', u'𦼬'),
- (0x2F9AE, 'M', u'䕝'),
- (0x2F9AF, 'M', u'䕡'),
- (0x2F9B0, 'M', u'𦾱'),
- (0x2F9B1, 'M', u'𧃒'),
- (0x2F9B2, 'M', u'䕫'),
- (0x2F9B3, 'M', u'虐'),
- (0x2F9B4, 'M', u'虜'),
- (0x2F9B5, 'M', u'虧'),
- (0x2F9B6, 'M', u'虩'),
- (0x2F9B7, 'M', u'蚩'),
- (0x2F9B8, 'M', u'蚈'),
- (0x2F9B9, 'M', u'蜎'),
- (0x2F9BA, 'M', u'蛢'),
- (0x2F9BB, 'M', u'蝹'),
- (0x2F9BC, 'M', u'蜨'),
- (0x2F9BD, 'M', u'蝫'),
- (0x2F9BE, 'M', u'螆'),
- (0x2F9BF, 'X'),
- (0x2F9C0, 'M', u'蟡'),
- (0x2F9C1, 'M', u'蠁'),
- (0x2F9C2, 'M', u'䗹'),
- (0x2F9C3, 'M', u'衠'),
- (0x2F9C4, 'M', u'衣'),
- (0x2F9C5, 'M', u'𧙧'),
- (0x2F9C6, 'M', u'裗'),
- (0x2F9C7, 'M', u'裞'),
- (0x2F9C8, 'M', u'䘵'),
- (0x2F9C9, 'M', u'裺'),
- (0x2F9CA, 'M', u'㒻'),
- (0x2F9CB, 'M', u'𧢮'),
- (0x2F9CC, 'M', u'𧥦'),
- (0x2F9CD, 'M', u'䚾'),
- (0x2F9CE, 'M', u'䛇'),
- (0x2F9CF, 'M', u'誠'),
- (0x2F9D0, 'M', u'諭'),
- (0x2F9D1, 'M', u'變'),
- (0x2F9D2, 'M', u'豕'),
- (0x2F9D3, 'M', u'𧲨'),
- (0x2F9D4, 'M', u'貫'),
- (0x2F9D5, 'M', u'賁'),
- (0x2F9D6, 'M', u'贛'),
- (0x2F9D7, 'M', u'起'),
- (0x2F9D8, 'M', u'𧼯'),
- (0x2F9D9, 'M', u'𠠄'),
- (0x2F9DA, 'M', u'跋'),
- (0x2F9DB, 'M', u'趼'),
- (0x2F9DC, 'M', u'跰'),
- (0x2F9DD, 'M', u'𠣞'),
- (0x2F9DE, 'M', u'軔'),
- (0x2F9DF, 'M', u'輸'),
- (0x2F9E0, 'M', u'𨗒'),
- (0x2F9E1, 'M', u'𨗭'),
- (0x2F9E2, 'M', u'邔'),
- (0x2F9E3, 'M', u'郱'),
- (0x2F9E4, 'M', u'鄑'),
- (0x2F9E5, 'M', u'𨜮'),
- (0x2F9E6, 'M', u'鄛'),
- (0x2F9E7, 'M', u'鈸'),
- (0x2F9E8, 'M', u'鋗'),
- (0x2F9E9, 'M', u'鋘'),
- (0x2F9EA, 'M', u'鉼'),
- (0x2F9EB, 'M', u'鏹'),
- (0x2F9EC, 'M', u'鐕'),
- (0x2F9ED, 'M', u'𨯺'),
- (0x2F9EE, 'M', u'開'),
- (0x2F9EF, 'M', u'䦕'),
- (0x2F9F0, 'M', u'閷'),
- (0x2F9F1, 'M', u'𨵷'),
+ (0x2F974, "M", "䍙"),
+ (0x2F975, "M", "𦋙"),
+ (0x2F976, "M", "罺"),
+ (0x2F977, "M", "𦌾"),
+ (0x2F978, "M", "羕"),
+ (0x2F979, "M", "翺"),
+ (0x2F97A, "M", "者"),
+ (0x2F97B, "M", "𦓚"),
+ (0x2F97C, "M", "𦔣"),
+ (0x2F97D, "M", "聠"),
+ (0x2F97E, "M", "𦖨"),
+ (0x2F97F, "M", "聰"),
+ (0x2F980, "M", "𣍟"),
+ (0x2F981, "M", "䏕"),
+ (0x2F982, "M", "育"),
+ (0x2F983, "M", "脃"),
+ (0x2F984, "M", "䐋"),
+ (0x2F985, "M", "脾"),
+ (0x2F986, "M", "媵"),
+ (0x2F987, "M", "𦞧"),
+ (0x2F988, "M", "𦞵"),
+ (0x2F989, "M", "𣎓"),
+ (0x2F98A, "M", "𣎜"),
+ (0x2F98B, "M", "舁"),
+ (0x2F98C, "M", "舄"),
+ (0x2F98D, "M", "辞"),
+ (0x2F98E, "M", "䑫"),
+ (0x2F98F, "M", "芑"),
+ (0x2F990, "M", "芋"),
+ (0x2F991, "M", "芝"),
+ (0x2F992, "M", "劳"),
+ (0x2F993, "M", "花"),
+ (0x2F994, "M", "芳"),
+ (0x2F995, "M", "芽"),
+ (0x2F996, "M", "苦"),
+ (0x2F997, "M", "𦬼"),
+ (0x2F998, "M", "若"),
+ (0x2F999, "M", "茝"),
+ (0x2F99A, "M", "荣"),
+ (0x2F99B, "M", "莭"),
+ (0x2F99C, "M", "茣"),
+ (0x2F99D, "M", "莽"),
+ (0x2F99E, "M", "菧"),
+ (0x2F99F, "M", "著"),
+ (0x2F9A0, "M", "荓"),
+ (0x2F9A1, "M", "菊"),
+ (0x2F9A2, "M", "菌"),
+ (0x2F9A3, "M", "菜"),
+ (0x2F9A4, "M", "𦰶"),
+ (0x2F9A5, "M", "𦵫"),
+ (0x2F9A6, "M", "𦳕"),
+ (0x2F9A7, "M", "䔫"),
+ (0x2F9A8, "M", "蓱"),
+ (0x2F9A9, "M", "蓳"),
+ (0x2F9AA, "M", "蔖"),
+ (0x2F9AB, "M", "𧏊"),
+ (0x2F9AC, "M", "蕤"),
+ (0x2F9AD, "M", "𦼬"),
+ (0x2F9AE, "M", "䕝"),
+ (0x2F9AF, "M", "䕡"),
+ (0x2F9B0, "M", "𦾱"),
+ (0x2F9B1, "M", "𧃒"),
+ (0x2F9B2, "M", "䕫"),
+ (0x2F9B3, "M", "虐"),
+ (0x2F9B4, "M", "虜"),
+ (0x2F9B5, "M", "虧"),
+ (0x2F9B6, "M", "虩"),
+ (0x2F9B7, "M", "蚩"),
+ (0x2F9B8, "M", "蚈"),
+ (0x2F9B9, "M", "蜎"),
+ (0x2F9BA, "M", "蛢"),
+ (0x2F9BB, "M", "蝹"),
+ (0x2F9BC, "M", "蜨"),
+ (0x2F9BD, "M", "蝫"),
+ (0x2F9BE, "M", "螆"),
+ (0x2F9BF, "X"),
+ (0x2F9C0, "M", "蟡"),
+ (0x2F9C1, "M", "蠁"),
+ (0x2F9C2, "M", "䗹"),
+ (0x2F9C3, "M", "衠"),
+ (0x2F9C4, "M", "衣"),
+ (0x2F9C5, "M", "𧙧"),
+ (0x2F9C6, "M", "裗"),
+ (0x2F9C7, "M", "裞"),
+ (0x2F9C8, "M", "䘵"),
+ (0x2F9C9, "M", "裺"),
+ (0x2F9CA, "M", "㒻"),
+ (0x2F9CB, "M", "𧢮"),
+ (0x2F9CC, "M", "𧥦"),
+ (0x2F9CD, "M", "䚾"),
+ (0x2F9CE, "M", "䛇"),
+ (0x2F9CF, "M", "誠"),
+ (0x2F9D0, "M", "諭"),
+ (0x2F9D1, "M", "變"),
+ (0x2F9D2, "M", "豕"),
+ (0x2F9D3, "M", "𧲨"),
+ (0x2F9D4, "M", "貫"),
+ (0x2F9D5, "M", "賁"),
+ (0x2F9D6, "M", "贛"),
+ (0x2F9D7, "M", "起"),
]
-def _seg_79():
+
+def _seg_81() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x2F9F2, 'M', u'䧦'),
- (0x2F9F3, 'M', u'雃'),
- (0x2F9F4, 'M', u'嶲'),
- (0x2F9F5, 'M', u'霣'),
- (0x2F9F6, 'M', u'𩅅'),
- (0x2F9F7, 'M', u'𩈚'),
- (0x2F9F8, 'M', u'䩮'),
- (0x2F9F9, 'M', u'䩶'),
- (0x2F9FA, 'M', u'韠'),
- (0x2F9FB, 'M', u'𩐊'),
- (0x2F9FC, 'M', u'䪲'),
- (0x2F9FD, 'M', u'𩒖'),
- (0x2F9FE, 'M', u'頋'),
- (0x2FA00, 'M', u'頩'),
- (0x2FA01, 'M', u'𩖶'),
- (0x2FA02, 'M', u'飢'),
- (0x2FA03, 'M', u'䬳'),
- (0x2FA04, 'M', u'餩'),
- (0x2FA05, 'M', u'馧'),
- (0x2FA06, 'M', u'駂'),
- (0x2FA07, 'M', u'駾'),
- (0x2FA08, 'M', u'䯎'),
- (0x2FA09, 'M', u'𩬰'),
- (0x2FA0A, 'M', u'鬒'),
- (0x2FA0B, 'M', u'鱀'),
- (0x2FA0C, 'M', u'鳽'),
- (0x2FA0D, 'M', u'䳎'),
- (0x2FA0E, 'M', u'䳭'),
- (0x2FA0F, 'M', u'鵧'),
- (0x2FA10, 'M', u'𪃎'),
- (0x2FA11, 'M', u'䳸'),
- (0x2FA12, 'M', u'𪄅'),
- (0x2FA13, 'M', u'𪈎'),
- (0x2FA14, 'M', u'𪊑'),
- (0x2FA15, 'M', u'麻'),
- (0x2FA16, 'M', u'䵖'),
- (0x2FA17, 'M', u'黹'),
- (0x2FA18, 'M', u'黾'),
- (0x2FA19, 'M', u'鼅'),
- (0x2FA1A, 'M', u'鼏'),
- (0x2FA1B, 'M', u'鼖'),
- (0x2FA1C, 'M', u'鼻'),
- (0x2FA1D, 'M', u'𪘀'),
- (0x2FA1E, 'X'),
- (0x30000, 'V'),
- (0x3134B, 'X'),
- (0xE0100, 'I'),
- (0xE01F0, 'X'),
+ (0x2F9D8, "M", "𧼯"),
+ (0x2F9D9, "M", "𠠄"),
+ (0x2F9DA, "M", "跋"),
+ (0x2F9DB, "M", "趼"),
+ (0x2F9DC, "M", "跰"),
+ (0x2F9DD, "M", "𠣞"),
+ (0x2F9DE, "M", "軔"),
+ (0x2F9DF, "M", "輸"),
+ (0x2F9E0, "M", "𨗒"),
+ (0x2F9E1, "M", "𨗭"),
+ (0x2F9E2, "M", "邔"),
+ (0x2F9E3, "M", "郱"),
+ (0x2F9E4, "M", "鄑"),
+ (0x2F9E5, "M", "𨜮"),
+ (0x2F9E6, "M", "鄛"),
+ (0x2F9E7, "M", "鈸"),
+ (0x2F9E8, "M", "鋗"),
+ (0x2F9E9, "M", "鋘"),
+ (0x2F9EA, "M", "鉼"),
+ (0x2F9EB, "M", "鏹"),
+ (0x2F9EC, "M", "鐕"),
+ (0x2F9ED, "M", "𨯺"),
+ (0x2F9EE, "M", "開"),
+ (0x2F9EF, "M", "䦕"),
+ (0x2F9F0, "M", "閷"),
+ (0x2F9F1, "M", "𨵷"),
+ (0x2F9F2, "M", "䧦"),
+ (0x2F9F3, "M", "雃"),
+ (0x2F9F4, "M", "嶲"),
+ (0x2F9F5, "M", "霣"),
+ (0x2F9F6, "M", "𩅅"),
+ (0x2F9F7, "M", "𩈚"),
+ (0x2F9F8, "M", "䩮"),
+ (0x2F9F9, "M", "䩶"),
+ (0x2F9FA, "M", "韠"),
+ (0x2F9FB, "M", "𩐊"),
+ (0x2F9FC, "M", "䪲"),
+ (0x2F9FD, "M", "𩒖"),
+ (0x2F9FE, "M", "頋"),
+ (0x2FA00, "M", "頩"),
+ (0x2FA01, "M", "𩖶"),
+ (0x2FA02, "M", "飢"),
+ (0x2FA03, "M", "䬳"),
+ (0x2FA04, "M", "餩"),
+ (0x2FA05, "M", "馧"),
+ (0x2FA06, "M", "駂"),
+ (0x2FA07, "M", "駾"),
+ (0x2FA08, "M", "䯎"),
+ (0x2FA09, "M", "𩬰"),
+ (0x2FA0A, "M", "鬒"),
+ (0x2FA0B, "M", "鱀"),
+ (0x2FA0C, "M", "鳽"),
+ (0x2FA0D, "M", "䳎"),
+ (0x2FA0E, "M", "䳭"),
+ (0x2FA0F, "M", "鵧"),
+ (0x2FA10, "M", "𪃎"),
+ (0x2FA11, "M", "䳸"),
+ (0x2FA12, "M", "𪄅"),
+ (0x2FA13, "M", "𪈎"),
+ (0x2FA14, "M", "𪊑"),
+ (0x2FA15, "M", "麻"),
+ (0x2FA16, "M", "䵖"),
+ (0x2FA17, "M", "黹"),
+ (0x2FA18, "M", "黾"),
+ (0x2FA19, "M", "鼅"),
+ (0x2FA1A, "M", "鼏"),
+ (0x2FA1B, "M", "鼖"),
+ (0x2FA1C, "M", "鼻"),
+ (0x2FA1D, "M", "𪘀"),
+ (0x2FA1E, "X"),
+ (0x30000, "V"),
+ (0x3134B, "X"),
+ (0x31350, "V"),
+ (0x323B0, "X"),
+ (0xE0100, "I"),
+ (0xE01F0, "X"),
]
+
uts46data = tuple(
_seg_0()
+ _seg_1()
@@ -8354,4 +8676,6 @@ uts46data = tuple(
+ _seg_77()
+ _seg_78()
+ _seg_79()
-)
+ + _seg_80()
+ + _seg_81()
+) # type: Tuple[Union[Tuple[int, str], Tuple[int, str, str]], ...]
diff --git a/third_party/python/importlib_resources/importlib_resources-5.12.0.dist-info/RECORD b/third_party/python/importlib_resources/importlib_resources-5.12.0.dist-info/RECORD
deleted file mode 100644
index 2babad09e79b..000000000000
--- a/third_party/python/importlib_resources/importlib_resources-5.12.0.dist-info/RECORD
+++ /dev/null
@@ -1,48 +0,0 @@
-importlib_resources/__init__.py,sha256=evPm12kLgYqTm-pbzm60bOuumumT8IpBNWFp0uMyrzE,506
-importlib_resources/_adapters.py,sha256=vprJGbUeHbajX6XCuMP6J3lMrqCi-P_MTlziJUR7jfk,4482
-importlib_resources/_common.py,sha256=jSC4xfLdcMNbtbWHtpzbFkNa0W7kvf__nsYn14C_AEU,5457
-importlib_resources/_compat.py,sha256=4oDJPpo63eH_3l5BkBHmkjAQW4HGs5qvYd2-ziLA_ck,2935
-importlib_resources/_itertools.py,sha256=eDisV6RqiNZOogLSXf6LOGHOYc79FGgPrKNLzFLmCrU,1277
-importlib_resources/_legacy.py,sha256=0TKdZixxLWA-xwtAZw4HcpqJmj4Xprx1Zkcty0gTRZY,3481
-importlib_resources/abc.py,sha256=Icr2IJ2QtH7vvAB9vC5WRJ9KBoaDyJa7KUs8McuROzo,5140
-importlib_resources/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-importlib_resources/readers.py,sha256=i80n49L2rBAtlB9bU0zAeQHiEXxcdP99-pWR6ED-ypY,4312
-importlib_resources/simple.py,sha256=0__2TQBTQoqkajYmNPt1HxERcReAT6boVKJA328pr04,2576
-importlib_resources/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-importlib_resources/tests/_compat.py,sha256=YTSB0U1R9oADnh6GrQcOCgojxcF_N6H1LklymEWf9SQ,708
-importlib_resources/tests/_path.py,sha256=nkv3ek7D1U898v921rYbldDCtKri2oyYOi3EJqGjEGU,1289
-importlib_resources/tests/test_compatibilty_files.py,sha256=95N_R7aik8cvnE6sBJpsxmP0K5plOWRIJDgbalD-Hpw,3314
-importlib_resources/tests/test_contents.py,sha256=V1Xfk3lqTDdvUsZuV18Kndf0CT_tkM2oEIwk9Vv0rhg,968
-importlib_resources/tests/test_custom.py,sha256=jVYg9idEVdUN6idHUfDDlZ-zDWl56qYNbj5QrcZO76Y,1124
-importlib_resources/tests/test_files.py,sha256=W5XoBWSTr84Ke15UtjqWLet2iUDUyJfQxbST4PDlj2w,3283
-importlib_resources/tests/test_open.py,sha256=9qvdC6Eu2Kn3mh3xDR5HUEQoePSKIecTxU4vnH9veO8,2671
-importlib_resources/tests/test_path.py,sha256=XR5RI7_zndI_Nqw9eHU1tDmSGIo29N1GP8INodPc584,2142
-importlib_resources/tests/test_read.py,sha256=BYdRqZEEJE17NHPArpZW9VsIwMlna1BpHyWkgCvEKWk,2512
-importlib_resources/tests/test_reader.py,sha256=YS1RHDzSIo7Dy3AhoK7sY-cFWIFnfkMNfQR3xlXsgio,4990
-importlib_resources/tests/test_resource.py,sha256=cPHz7VLwq6bFznZ-JDYE3f_4VJthQztRHKhiA9SriT0,8270
-importlib_resources/tests/update-zips.py,sha256=x-SrO5v87iLLUMXyefxDwAd3imAs_slI94sLWvJ6N40,1417
-importlib_resources/tests/util.py,sha256=TQz12vSkHNjGlF3hB0OR4kx2sCR-xcj0wI2esDyHR9I,5001
-importlib_resources/tests/data01/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-importlib_resources/tests/data01/binary.file,sha256=BU7ewdAhH2JP7Qy8qdT5QAsOSRxDdCryxbCr6_DJkNg,4
-importlib_resources/tests/data01/utf-16.file,sha256=t5q9qhxX0rYqItBOM8D3ylwG-RHrnOYteTLtQr6sF7g,44
-importlib_resources/tests/data01/utf-8.file,sha256=kwWgYG4yQ-ZF2X_WA66EjYPmxJRn-w8aSOiS9e8tKYY,20
-importlib_resources/tests/data01/subdirectory/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-importlib_resources/tests/data01/subdirectory/binary.file,sha256=BU7ewdAhH2JP7Qy8qdT5QAsOSRxDdCryxbCr6_DJkNg,4
-importlib_resources/tests/data02/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-importlib_resources/tests/data02/one/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-importlib_resources/tests/data02/one/resource1.txt,sha256=10flKac7c-XXFzJ3t-AB5MJjlBy__dSZvPE_dOm2q6U,13
-importlib_resources/tests/data02/subdirectory/subsubdir/resource.txt,sha256=jnrBBztxYrtQck7cmVnc4xQVO4-agzAZDGSFkAWtlFw,10
-importlib_resources/tests/data02/two/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-importlib_resources/tests/data02/two/resource2.txt,sha256=lt2jbN3TMn9QiFKM832X39bU_62UptDdUkoYzkvEbl0,13
-importlib_resources/tests/namespacedata01/binary.file,sha256=BU7ewdAhH2JP7Qy8qdT5QAsOSRxDdCryxbCr6_DJkNg,4
-importlib_resources/tests/namespacedata01/utf-16.file,sha256=t5q9qhxX0rYqItBOM8D3ylwG-RHrnOYteTLtQr6sF7g,44
-importlib_resources/tests/namespacedata01/utf-8.file,sha256=kwWgYG4yQ-ZF2X_WA66EjYPmxJRn-w8aSOiS9e8tKYY,20
-importlib_resources/tests/zipdata01/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-importlib_resources/tests/zipdata01/ziptestdata.zip,sha256=z5Of4dsv3T0t-46B0MsVhxlhsPGMz28aUhJDWpj3_oY,876
-importlib_resources/tests/zipdata02/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-importlib_resources/tests/zipdata02/ziptestdata.zip,sha256=ydI-_j-xgQ7tDxqBp9cjOqXBGxUp6ZBbwVJu6Xj-nrY,698
-importlib_resources-5.12.0.dist-info/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
-importlib_resources-5.12.0.dist-info/METADATA,sha256=uEY10nhKI-5nXImnXgsNt7BDYf7u2Qw8-BO2K2hmlJA,4111
-importlib_resources-5.12.0.dist-info/WHEEL,sha256=2wepM1nk4DS4eFpYrW1TTqPcoGNfHhhO_i5m4cOimbo,92
-importlib_resources-5.12.0.dist-info/top_level.txt,sha256=fHIjHU1GZwAjvcydpmUnUrTnbvdiWjG4OEVZK8by0TQ,20
-importlib_resources-5.12.0.dist-info/RECORD,,
diff --git a/third_party/python/importlib_resources/importlib_resources-5.12.0.dist-info/LICENSE b/third_party/python/importlib_resources/importlib_resources-6.4.5.dist-info/LICENSE
similarity index 100%
rename from third_party/python/importlib_resources/importlib_resources-5.12.0.dist-info/LICENSE
rename to third_party/python/importlib_resources/importlib_resources-6.4.5.dist-info/LICENSE
diff --git a/third_party/python/importlib_resources/importlib_resources-5.12.0.dist-info/METADATA b/third_party/python/importlib_resources/importlib_resources-6.4.5.dist-info/METADATA
similarity index 58%
rename from third_party/python/importlib_resources/importlib_resources-5.12.0.dist-info/METADATA
rename to third_party/python/importlib_resources/importlib_resources-6.4.5.dist-info/METADATA
index 038059d306a7..1ee4166c1666 100644
--- a/third_party/python/importlib_resources/importlib_resources-5.12.0.dist-info/METADATA
+++ b/third_party/python/importlib_resources/importlib_resources-6.4.5.dist-info/METADATA
@@ -1,53 +1,57 @@
Metadata-Version: 2.1
-Name: importlib-resources
-Version: 5.12.0
+Name: importlib_resources
+Version: 6.4.5
Summary: Read resources from Python packages
-Home-page: https://github.com/python/importlib_resources
-Author: Barry Warsaw
-Author-email: barry@python.org
-Project-URL: Documentation, https://importlib-resources.readthedocs.io/
+Author-email: Barry Warsaw
+Maintainer-email: "Jason R. Coombs"
+Project-URL: Source, https://github.com/python/importlib_resources
Classifier: Development Status :: 5 - Production/Stable
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: Apache Software License
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3 :: Only
-Requires-Python: >=3.7
+Requires-Python: >=3.8
+Description-Content-Type: text/x-rst
License-File: LICENSE
-Requires-Dist: zipp (>=3.1.0) ; python_version < "3.10"
-Provides-Extra: docs
-Requires-Dist: sphinx (>=3.5) ; extra == 'docs'
-Requires-Dist: jaraco.packaging (>=9) ; extra == 'docs'
-Requires-Dist: rst.linker (>=1.9) ; extra == 'docs'
-Requires-Dist: furo ; extra == 'docs'
-Requires-Dist: sphinx-lint ; extra == 'docs'
-Requires-Dist: jaraco.tidelift (>=1.4) ; extra == 'docs'
-Provides-Extra: testing
-Requires-Dist: pytest (>=6) ; extra == 'testing'
-Requires-Dist: pytest-checkdocs (>=2.4) ; extra == 'testing'
-Requires-Dist: flake8 (<5) ; extra == 'testing'
-Requires-Dist: pytest-cov ; extra == 'testing'
-Requires-Dist: pytest-enabler (>=1.3) ; extra == 'testing'
-Requires-Dist: pytest-black (>=0.3.7) ; (platform_python_implementation != "PyPy") and extra == 'testing'
-Requires-Dist: pytest-mypy (>=0.9.1) ; (platform_python_implementation != "PyPy") and extra == 'testing'
-Requires-Dist: pytest-flake8 ; (python_version < "3.12") and extra == 'testing'
+Requires-Dist: zipp >=3.1.0 ; python_version < "3.10"
+Provides-Extra: check
+Requires-Dist: pytest-checkdocs >=2.4 ; extra == 'check'
+Requires-Dist: pytest-ruff >=0.2.1 ; (sys_platform != "cygwin") and extra == 'check'
+Provides-Extra: cover
+Requires-Dist: pytest-cov ; extra == 'cover'
+Provides-Extra: doc
+Requires-Dist: sphinx >=3.5 ; extra == 'doc'
+Requires-Dist: jaraco.packaging >=9.3 ; extra == 'doc'
+Requires-Dist: rst.linker >=1.9 ; extra == 'doc'
+Requires-Dist: furo ; extra == 'doc'
+Requires-Dist: sphinx-lint ; extra == 'doc'
+Requires-Dist: jaraco.tidelift >=1.4 ; extra == 'doc'
+Provides-Extra: enabler
+Requires-Dist: pytest-enabler >=2.2 ; extra == 'enabler'
+Provides-Extra: test
+Requires-Dist: pytest !=8.1.*,>=6 ; extra == 'test'
+Requires-Dist: zipp >=3.17 ; extra == 'test'
+Requires-Dist: jaraco.test >=5.4 ; extra == 'test'
+Provides-Extra: type
+Requires-Dist: pytest-mypy ; extra == 'type'
.. image:: https://img.shields.io/pypi/v/importlib_resources.svg
:target: https://pypi.org/project/importlib_resources
.. image:: https://img.shields.io/pypi/pyversions/importlib_resources.svg
-.. image:: https://github.com/python/importlib_resources/workflows/tests/badge.svg
+.. image:: https://github.com/python/importlib_resources/actions/workflows/main.yml/badge.svg
:target: https://github.com/python/importlib_resources/actions?query=workflow%3A%22tests%22
:alt: tests
-.. image:: https://img.shields.io/badge/code%20style-black-000000.svg
- :target: https://github.com/psf/black
- :alt: Code style: Black
+.. image:: https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/charliermarsh/ruff/main/assets/badge/v2.json
+ :target: https://github.com/astral-sh/ruff
+ :alt: Ruff
.. image:: https://readthedocs.org/projects/importlib-resources/badge/?version=latest
:target: https://importlib-resources.readthedocs.io/en/latest/?badge=latest
-.. image:: https://img.shields.io/badge/skeleton-2023-informational
+.. image:: https://img.shields.io/badge/skeleton-2024-informational
:target: https://blog.jaraco.com/skeleton
.. image:: https://tidelift.com/badges/package/pypi/importlib-resources
@@ -76,7 +80,9 @@ were contributed to different versions in the standard library:
* - importlib_resources
- stdlib
- * - 5.9
+ * - 6.0
+ - 3.13
+ * - 5.12
- 3.12
* - 5.7
- 3.11
@@ -95,10 +101,3 @@ Available as part of the Tidelift Subscription.
This project and the maintainers of thousands of other packages are working with Tidelift to deliver one enterprise subscription that covers all of the open source you use.
`Learn more `_.
-
-Security Contact
-================
-
-To report a security vulnerability, please use the
-`Tidelift security contact `_.
-Tidelift will coordinate the fix and disclosure.
diff --git a/third_party/python/importlib_resources/importlib_resources-6.4.5.dist-info/RECORD b/third_party/python/importlib_resources/importlib_resources-6.4.5.dist-info/RECORD
new file mode 100644
index 000000000000..70578717e4c4
--- /dev/null
+++ b/third_party/python/importlib_resources/importlib_resources-6.4.5.dist-info/RECORD
@@ -0,0 +1,36 @@
+importlib_resources/__init__.py,sha256=3J-261Qqzg-1kBenMVsOsvJo19EbUmYqjHkrZWiFHOM,703
+importlib_resources/_adapters.py,sha256=vprJGbUeHbajX6XCuMP6J3lMrqCi-P_MTlziJUR7jfk,4482
+importlib_resources/_common.py,sha256=5PVT4ezn_Ptj7LIAebtLYquK7A6X4EYoQJM37yTBdbQ,5624
+importlib_resources/_functional.py,sha256=mLU4DwSlh8_2IXWqwKOfPVxyRqAEpB3B4XTfRxr3X3M,2651
+importlib_resources/_itertools.py,sha256=eDisV6RqiNZOogLSXf6LOGHOYc79FGgPrKNLzFLmCrU,1277
+importlib_resources/abc.py,sha256=UKNU9ncEDkZRB3txcGb3WLxsL2iju9JbaLTI-dfLE_4,5162
+importlib_resources/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+importlib_resources/readers.py,sha256=n9Rn8B5UHapkXGSfFhQNbdk_pfDCISPBLIXZnpoOKs8,6251
+importlib_resources/simple.py,sha256=wJm2qGZ9EMPFhRLiJBa9Em5tVKbD7Q8ibWtt4ZNgWBU,2590
+importlib_resources/compat/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+importlib_resources/compat/py38.py,sha256=MWhut3XsAJwBYUaa5Qb2AoCrZNqcQjVThP-P1uBoE_4,230
+importlib_resources/compat/py39.py,sha256=KlP7QiD3NkoytWFjJgrJI33uRTw667vEDtkZWUtBDZM,152
+importlib_resources/future/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+importlib_resources/future/adapters.py,sha256=1-MF2VRcCButhcC1OMfZILU9o3kwZ4nXB2lurXpaIAw,2940
+importlib_resources/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+importlib_resources/tests/_path.py,sha256=eqMTKkYA9Hc8_mzrVBN14HPuoc2HFNxuyTWqAo_2ZEM,2288
+importlib_resources/tests/test_compatibilty_files.py,sha256=95N_R7aik8cvnE6sBJpsxmP0K5plOWRIJDgbalD-Hpw,3314
+importlib_resources/tests/test_contents.py,sha256=EagRx9Mz7MOe1kRaOc9XNX_YlBYy90Qzhv2rqWMhMlw,837
+importlib_resources/tests/test_custom.py,sha256=QrHZqIWl0e-fsQRfm0ych8stOlKJOsAIU3rK6QOcyN0,1221
+importlib_resources/tests/test_files.py,sha256=4G4Wo4_2UJtpg9HrEKjRaXimM68lXKjkAmFY-9OLCyE,5796
+importlib_resources/tests/test_functional.py,sha256=DV8sdnwtpacNjHQ3ExifIoeQTCr4C-M-NVbaWewOcAo,8863
+importlib_resources/tests/test_open.py,sha256=eCDLP6SszzBK6vs5j6LDkuR0Y2rHXrTYNRVZsAFKnCQ,2681
+importlib_resources/tests/test_path.py,sha256=rz_BOqNzEu5ZRyrhAHOi9tvx3K_0AqHiRNkYT4QFhQw,1985
+importlib_resources/tests/test_read.py,sha256=oh0ZkCZ04N0DxPXgBLdadENwia4J0_sYt73uaH_I11g,3045
+importlib_resources/tests/test_reader.py,sha256=G62D2vkFjYSeFT6BFE-z_shUX8n7h80f089ojXCufBY,4655
+importlib_resources/tests/test_resource.py,sha256=ZxW6cIXJRwgvU7-wCc2jIRWV9M4pX4uznijN0vNfplM,7686
+importlib_resources/tests/util.py,sha256=CtY1uL-Xl71sw553ow2st6M5X710jf2jrhYAv6nhZ_Y,6065
+importlib_resources/tests/zip.py,sha256=nG9D6u_4nu67NrEUFfMt7vzba0qO_-QPyAAWc6W4gP4,577
+importlib_resources/tests/compat/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+importlib_resources/tests/compat/py312.py,sha256=qcWjpZhQo2oEsdwIlRRQHrsMGDltkFTnETeG7fLdUS8,364
+importlib_resources/tests/compat/py39.py,sha256=nOjut4CZDtRgZEblX9hWhupo9vli_CA1270_JwdQzRo,441
+importlib_resources-6.4.5.dist-info/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
+importlib_resources-6.4.5.dist-info/METADATA,sha256=iwGfOzcc9jUBSuQa6zQeXla0el4YCZlAoj5uRIm7fyg,3975
+importlib_resources-6.4.5.dist-info/WHEEL,sha256=cVxcB9AmuTcXqmwrtPhNK88dr7IR_b6qagTj0UvIEbY,91
+importlib_resources-6.4.5.dist-info/top_level.txt,sha256=fHIjHU1GZwAjvcydpmUnUrTnbvdiWjG4OEVZK8by0TQ,20
+importlib_resources-6.4.5.dist-info/RECORD,,
diff --git a/third_party/python/importlib_resources/importlib_resources-6.4.5.dist-info/WHEEL b/third_party/python/importlib_resources/importlib_resources-6.4.5.dist-info/WHEEL
new file mode 100644
index 000000000000..0fde4dd96cac
--- /dev/null
+++ b/third_party/python/importlib_resources/importlib_resources-6.4.5.dist-info/WHEEL
@@ -0,0 +1,5 @@
+Wheel-Version: 1.0
+Generator: setuptools (74.1.2)
+Root-Is-Purelib: true
+Tag: py3-none-any
+
diff --git a/third_party/python/importlib_resources/importlib_resources-5.12.0.dist-info/top_level.txt b/third_party/python/importlib_resources/importlib_resources-6.4.5.dist-info/top_level.txt
similarity index 100%
rename from third_party/python/importlib_resources/importlib_resources-5.12.0.dist-info/top_level.txt
rename to third_party/python/importlib_resources/importlib_resources-6.4.5.dist-info/top_level.txt
diff --git a/third_party/python/importlib_resources/importlib_resources/__init__.py b/third_party/python/importlib_resources/importlib_resources/__init__.py
index 34e3a9950cc5..723c9f9eb33c 100644
--- a/third_party/python/importlib_resources/importlib_resources/__init__.py
+++ b/third_party/python/importlib_resources/importlib_resources/__init__.py
@@ -1,20 +1,27 @@
-"""Read resources contained within a package."""
+"""
+Read resources contained within a package.
+
+This codebase is shared between importlib.resources in the stdlib
+and importlib_resources in PyPI. See
+https://github.com/python/importlib_metadata/wiki/Development-Methodology
+for more detail.
+"""
from ._common import (
as_file,
files,
Package,
+ Anchor,
)
-from ._legacy import (
+from ._functional import (
contents,
- open_binary,
- read_binary,
- open_text,
- read_text,
is_resource,
+ open_binary,
+ open_text,
path,
- Resource,
+ read_binary,
+ read_text,
)
from .abc import ResourceReader
@@ -22,11 +29,11 @@ from .abc import ResourceReader
__all__ = [
'Package',
- 'Resource',
+ 'Anchor',
'ResourceReader',
'as_file',
- 'contents',
'files',
+ 'contents',
'is_resource',
'open_binary',
'open_text',
diff --git a/third_party/python/importlib_resources/importlib_resources/_common.py b/third_party/python/importlib_resources/importlib_resources/_common.py
index 3c6de1cfb2e7..f065d493fb7e 100644
--- a/third_party/python/importlib_resources/importlib_resources/_common.py
+++ b/third_party/python/importlib_resources/importlib_resources/_common.py
@@ -12,8 +12,6 @@ import itertools
from typing import Union, Optional, cast
from .abc import ResourceReader, Traversable
-from ._compat import wrap_spec
-
Package = Union[types.ModuleType, str]
Anchor = Package
@@ -27,6 +25,8 @@ def package_to_anchor(func):
>>> files('a', 'b')
Traceback (most recent call last):
TypeError: files() takes from 0 to 1 positional arguments but 2 were given
+
+ Remove this compatibility in Python 3.14.
"""
undefined = object()
@@ -66,10 +66,10 @@ def get_resource_reader(package: types.ModuleType) -> Optional[ResourceReader]:
# zipimport.zipimporter does not support weak references, resulting in a
# TypeError. That seems terrible.
spec = package.__spec__
- reader = getattr(spec.loader, 'get_resource_reader', None) # type: ignore
+ reader = getattr(spec.loader, 'get_resource_reader', None) # type: ignore[union-attr]
if reader is None:
return None
- return reader(spec.name) # type: ignore
+ return reader(spec.name) # type: ignore[union-attr]
@functools.singledispatch
@@ -93,12 +93,13 @@ def _infer_caller():
"""
def is_this_file(frame_info):
- return frame_info.filename == __file__
+ return frame_info.filename == stack[0].filename
def is_wrapper(frame_info):
return frame_info.function == 'wrapper'
- not_this_file = itertools.filterfalse(is_this_file, inspect.stack())
+ stack = inspect.stack()
+ not_this_file = itertools.filterfalse(is_this_file, stack)
# also exclude 'wrapper' due to singledispatch in the call stack
callers = itertools.filterfalse(is_wrapper, not_this_file)
return next(callers).frame
@@ -109,6 +110,9 @@ def from_package(package: types.ModuleType):
Return a Traversable object for the given package.
"""
+ # deferred for performance (python/cpython#109829)
+ from .future.adapters import wrap_spec
+
spec = wrap_spec(package)
reader = spec.loader.get_resource_reader(spec.name)
return reader.files()
@@ -179,7 +183,7 @@ def _(path):
@contextlib.contextmanager
def _temp_path(dir: tempfile.TemporaryDirectory):
"""
- Wrap tempfile.TemporyDirectory to return a pathlib object.
+ Wrap tempfile.TemporaryDirectory to return a pathlib object.
"""
with dir as result:
yield pathlib.Path(result)
diff --git a/third_party/python/importlib_resources/importlib_resources/_compat.py b/third_party/python/importlib_resources/importlib_resources/_compat.py
deleted file mode 100644
index a93a88263be8..000000000000
--- a/third_party/python/importlib_resources/importlib_resources/_compat.py
+++ /dev/null
@@ -1,109 +0,0 @@
-# flake8: noqa
-
-import abc
-import os
-import sys
-import pathlib
-from contextlib import suppress
-from typing import Union
-
-
-if sys.version_info >= (3, 10):
- from zipfile import Path as ZipPath # type: ignore
-else:
- from zipp import Path as ZipPath # type: ignore
-
-
-try:
- from typing import runtime_checkable # type: ignore
-except ImportError:
-
- def runtime_checkable(cls): # type: ignore
- return cls
-
-
-try:
- from typing import Protocol # type: ignore
-except ImportError:
- Protocol = abc.ABC # type: ignore
-
-
-class TraversableResourcesLoader:
- """
- Adapt loaders to provide TraversableResources and other
- compatibility.
-
- Used primarily for Python 3.9 and earlier where the native
- loaders do not yet implement TraversableResources.
- """
-
- def __init__(self, spec):
- self.spec = spec
-
- @property
- def path(self):
- return self.spec.origin
-
- def get_resource_reader(self, name):
- from . import readers, _adapters
-
- def _zip_reader(spec):
- with suppress(AttributeError):
- return readers.ZipReader(spec.loader, spec.name)
-
- def _namespace_reader(spec):
- with suppress(AttributeError, ValueError):
- return readers.NamespaceReader(spec.submodule_search_locations)
-
- def _available_reader(spec):
- with suppress(AttributeError):
- return spec.loader.get_resource_reader(spec.name)
-
- def _native_reader(spec):
- reader = _available_reader(spec)
- return reader if hasattr(reader, 'files') else None
-
- def _file_reader(spec):
- try:
- path = pathlib.Path(self.path)
- except TypeError:
- return None
- if path.exists():
- return readers.FileReader(self)
-
- return (
- # local ZipReader if a zip module
- _zip_reader(self.spec)
- or
- # local NamespaceReader if a namespace module
- _namespace_reader(self.spec)
- or
- # local FileReader
- _file_reader(self.spec)
- or
- # native reader if it supplies 'files'
- _native_reader(self.spec)
- or
- # fallback - adapt the spec ResourceReader to TraversableReader
- _adapters.CompatibilityFiles(self.spec)
- )
-
-
-def wrap_spec(package):
- """
- Construct a package spec with traversable compatibility
- on the spec/loader/reader.
-
- Supersedes _adapters.wrap_spec to use TraversableResourcesLoader
- from above for older Python compatibility (<3.10).
- """
- from . import _adapters
-
- return _adapters.SpecLoaderAdapter(package.__spec__, TraversableResourcesLoader)
-
-
-if sys.version_info >= (3, 9):
- StrPath = Union[str, os.PathLike[str]]
-else:
- # PathLike is only subscriptable at runtime in 3.9+
- StrPath = Union[str, "os.PathLike[str]"]
diff --git a/third_party/python/importlib_resources/importlib_resources/_functional.py b/third_party/python/importlib_resources/importlib_resources/_functional.py
new file mode 100644
index 000000000000..f59416f2dd62
--- /dev/null
+++ b/third_party/python/importlib_resources/importlib_resources/_functional.py
@@ -0,0 +1,81 @@
+"""Simplified function-based API for importlib.resources"""
+
+import warnings
+
+from ._common import files, as_file
+
+
+_MISSING = object()
+
+
+def open_binary(anchor, *path_names):
+ """Open for binary reading the *resource* within *package*."""
+ return _get_resource(anchor, path_names).open('rb')
+
+
+def open_text(anchor, *path_names, encoding=_MISSING, errors='strict'):
+ """Open for text reading the *resource* within *package*."""
+ encoding = _get_encoding_arg(path_names, encoding)
+ resource = _get_resource(anchor, path_names)
+ return resource.open('r', encoding=encoding, errors=errors)
+
+
+def read_binary(anchor, *path_names):
+ """Read and return contents of *resource* within *package* as bytes."""
+ return _get_resource(anchor, path_names).read_bytes()
+
+
+def read_text(anchor, *path_names, encoding=_MISSING, errors='strict'):
+ """Read and return contents of *resource* within *package* as str."""
+ encoding = _get_encoding_arg(path_names, encoding)
+ resource = _get_resource(anchor, path_names)
+ return resource.read_text(encoding=encoding, errors=errors)
+
+
+def path(anchor, *path_names):
+ """Return the path to the *resource* as an actual file system path."""
+ return as_file(_get_resource(anchor, path_names))
+
+
+def is_resource(anchor, *path_names):
+ """Return ``True`` if there is a resource named *name* in the package,
+
+ Otherwise returns ``False``.
+ """
+ return _get_resource(anchor, path_names).is_file()
+
+
+def contents(anchor, *path_names):
+ """Return an iterable over the named resources within the package.
+
+ The iterable returns :class:`str` resources (e.g. files).
+ The iterable does not recurse into subdirectories.
+ """
+ warnings.warn(
+ "importlib.resources.contents is deprecated. "
+ "Use files(anchor).iterdir() instead.",
+ DeprecationWarning,
+ stacklevel=1,
+ )
+ return (resource.name for resource in _get_resource(anchor, path_names).iterdir())
+
+
+def _get_encoding_arg(path_names, encoding):
+ # For compatibility with versions where *encoding* was a positional
+ # argument, it needs to be given explicitly when there are multiple
+ # *path_names*.
+ # This limitation can be removed in Python 3.15.
+ if encoding is _MISSING:
+ if len(path_names) > 1:
+ raise TypeError(
+ "'encoding' argument required with multiple path names",
+ )
+ else:
+ return 'utf-8'
+ return encoding
+
+
+def _get_resource(anchor, path_names):
+ if anchor is None:
+ raise TypeError("anchor must be module or string, got None")
+ return files(anchor).joinpath(*path_names)
diff --git a/third_party/python/importlib_resources/importlib_resources/_legacy.py b/third_party/python/importlib_resources/importlib_resources/_legacy.py
deleted file mode 100644
index b1ea8105dad6..000000000000
--- a/third_party/python/importlib_resources/importlib_resources/_legacy.py
+++ /dev/null
@@ -1,120 +0,0 @@
-import functools
-import os
-import pathlib
-import types
-import warnings
-
-from typing import Union, Iterable, ContextManager, BinaryIO, TextIO, Any
-
-from . import _common
-
-Package = Union[types.ModuleType, str]
-Resource = str
-
-
-def deprecated(func):
- @functools.wraps(func)
- def wrapper(*args, **kwargs):
- warnings.warn(
- f"{func.__name__} is deprecated. Use files() instead. "
- "Refer to https://importlib-resources.readthedocs.io"
- "/en/latest/using.html#migrating-from-legacy for migration advice.",
- DeprecationWarning,
- stacklevel=2,
- )
- return func(*args, **kwargs)
-
- return wrapper
-
-
-def normalize_path(path: Any) -> str:
- """Normalize a path by ensuring it is a string.
-
- If the resulting string contains path separators, an exception is raised.
- """
- str_path = str(path)
- parent, file_name = os.path.split(str_path)
- if parent:
- raise ValueError(f'{path!r} must be only a file name')
- return file_name
-
-
-@deprecated
-def open_binary(package: Package, resource: Resource) -> BinaryIO:
- """Return a file-like object opened for binary reading of the resource."""
- return (_common.files(package) / normalize_path(resource)).open('rb')
-
-
-@deprecated
-def read_binary(package: Package, resource: Resource) -> bytes:
- """Return the binary contents of the resource."""
- return (_common.files(package) / normalize_path(resource)).read_bytes()
-
-
-@deprecated
-def open_text(
- package: Package,
- resource: Resource,
- encoding: str = 'utf-8',
- errors: str = 'strict',
-) -> TextIO:
- """Return a file-like object opened for text reading of the resource."""
- return (_common.files(package) / normalize_path(resource)).open(
- 'r', encoding=encoding, errors=errors
- )
-
-
-@deprecated
-def read_text(
- package: Package,
- resource: Resource,
- encoding: str = 'utf-8',
- errors: str = 'strict',
-) -> str:
- """Return the decoded string of the resource.
-
- The decoding-related arguments have the same semantics as those of
- bytes.decode().
- """
- with open_text(package, resource, encoding, errors) as fp:
- return fp.read()
-
-
-@deprecated
-def contents(package: Package) -> Iterable[str]:
- """Return an iterable of entries in `package`.
-
- Note that not all entries are resources. Specifically, directories are
- not considered resources. Use `is_resource()` on each entry returned here
- to check if it is a resource or not.
- """
- return [path.name for path in _common.files(package).iterdir()]
-
-
-@deprecated
-def is_resource(package: Package, name: str) -> bool:
- """True if `name` is a resource inside `package`.
-
- Directories are *not* resources.
- """
- resource = normalize_path(name)
- return any(
- traversable.name == resource and traversable.is_file()
- for traversable in _common.files(package).iterdir()
- )
-
-
-@deprecated
-def path(
- package: Package,
- resource: Resource,
-) -> ContextManager[pathlib.Path]:
- """A context manager providing a file path object to the resource.
-
- If the resource does not already exist on its own on the file system,
- a temporary file will be created. If the file was created, the file
- will be deleted upon exiting the context manager (no exception is
- raised if the file was deleted prior to the context manager
- exiting).
- """
- return _common.as_file(_common.files(package) / normalize_path(resource))
diff --git a/third_party/python/importlib_resources/importlib_resources/abc.py b/third_party/python/importlib_resources/importlib_resources/abc.py
index 23b6aeafe4f4..7a58dd2f96ec 100644
--- a/third_party/python/importlib_resources/importlib_resources/abc.py
+++ b/third_party/python/importlib_resources/importlib_resources/abc.py
@@ -3,8 +3,9 @@ import io
import itertools
import pathlib
from typing import Any, BinaryIO, Iterable, Iterator, NoReturn, Text, Optional
+from typing import runtime_checkable, Protocol
-from ._compat import runtime_checkable, Protocol, StrPath
+from .compat.py38 import StrPath
__all__ = ["ResourceReader", "Traversable", "TraversableResources"]
diff --git a/third_party/python/importlib_resources/importlib_resources/compat/__init__.py b/third_party/python/importlib_resources/importlib_resources/compat/__init__.py
new file mode 100644
index 000000000000..e69de29bb2d1
diff --git a/third_party/python/importlib_resources/importlib_resources/compat/py38.py b/third_party/python/importlib_resources/importlib_resources/compat/py38.py
new file mode 100644
index 000000000000..4d548257f858
--- /dev/null
+++ b/third_party/python/importlib_resources/importlib_resources/compat/py38.py
@@ -0,0 +1,11 @@
+import os
+import sys
+
+from typing import Union
+
+
+if sys.version_info >= (3, 9):
+ StrPath = Union[str, os.PathLike[str]]
+else:
+ # PathLike is only subscriptable at runtime in 3.9+
+ StrPath = Union[str, "os.PathLike[str]"]
diff --git a/third_party/python/importlib_resources/importlib_resources/compat/py39.py b/third_party/python/importlib_resources/importlib_resources/compat/py39.py
new file mode 100644
index 000000000000..ed5abd5e5852
--- /dev/null
+++ b/third_party/python/importlib_resources/importlib_resources/compat/py39.py
@@ -0,0 +1,10 @@
+import sys
+
+
+__all__ = ['ZipPath']
+
+
+if sys.version_info >= (3, 10):
+ from zipfile import Path as ZipPath
+else:
+ from zipp import Path as ZipPath
diff --git a/third_party/python/importlib_resources/importlib_resources/future/__init__.py b/third_party/python/importlib_resources/importlib_resources/future/__init__.py
new file mode 100644
index 000000000000..e69de29bb2d1
diff --git a/third_party/python/importlib_resources/importlib_resources/future/adapters.py b/third_party/python/importlib_resources/importlib_resources/future/adapters.py
new file mode 100644
index 000000000000..0e9764bae855
--- /dev/null
+++ b/third_party/python/importlib_resources/importlib_resources/future/adapters.py
@@ -0,0 +1,95 @@
+import functools
+import pathlib
+from contextlib import suppress
+from types import SimpleNamespace
+
+from .. import readers, _adapters
+
+
+def _block_standard(reader_getter):
+ """
+ Wrap _adapters.TraversableResourcesLoader.get_resource_reader
+ and intercept any standard library readers.
+ """
+
+ @functools.wraps(reader_getter)
+ def wrapper(*args, **kwargs):
+ """
+ If the reader is from the standard library, return None to allow
+ allow likely newer implementations in this library to take precedence.
+ """
+ try:
+ reader = reader_getter(*args, **kwargs)
+ except NotADirectoryError:
+ # MultiplexedPath may fail on zip subdirectory
+ return
+ # Python 3.10+
+ mod_name = reader.__class__.__module__
+ if mod_name.startswith('importlib.') and mod_name.endswith('readers'):
+ return
+ # Python 3.8, 3.9
+ if isinstance(reader, _adapters.CompatibilityFiles) and (
+ reader.spec.loader.__class__.__module__.startswith('zipimport')
+ or reader.spec.loader.__class__.__module__.startswith(
+ '_frozen_importlib_external'
+ )
+ ):
+ return
+ return reader
+
+ return wrapper
+
+
+def _skip_degenerate(reader):
+ """
+ Mask any degenerate reader. Ref #298.
+ """
+ is_degenerate = (
+ isinstance(reader, _adapters.CompatibilityFiles) and not reader._reader
+ )
+ return reader if not is_degenerate else None
+
+
+class TraversableResourcesLoader(_adapters.TraversableResourcesLoader):
+ """
+ Adapt loaders to provide TraversableResources and other
+ compatibility.
+
+ Ensures the readers from importlib_resources are preferred
+ over stdlib readers.
+ """
+
+ def get_resource_reader(self, name):
+ return (
+ _skip_degenerate(_block_standard(super().get_resource_reader)(name))
+ or self._standard_reader()
+ or super().get_resource_reader(name)
+ )
+
+ def _standard_reader(self):
+ return self._zip_reader() or self._namespace_reader() or self._file_reader()
+
+ def _zip_reader(self):
+ with suppress(AttributeError):
+ return readers.ZipReader(self.spec.loader, self.spec.name)
+
+ def _namespace_reader(self):
+ with suppress(AttributeError, ValueError):
+ return readers.NamespaceReader(self.spec.submodule_search_locations)
+
+ def _file_reader(self):
+ try:
+ path = pathlib.Path(self.spec.origin)
+ except TypeError:
+ return None
+ if path.exists():
+ return readers.FileReader(SimpleNamespace(path=path))
+
+
+def wrap_spec(package):
+ """
+ Override _adapters.wrap_spec to use TraversableResourcesLoader
+ from above. Ensures that future behavior is always available on older
+ Pythons.
+ """
+ return _adapters.SpecLoaderAdapter(package.__spec__, TraversableResourcesLoader)
diff --git a/third_party/python/importlib_resources/importlib_resources/readers.py b/third_party/python/importlib_resources/importlib_resources/readers.py
index 51d030a654f5..4f761c64b535 100644
--- a/third_party/python/importlib_resources/importlib_resources/readers.py
+++ b/third_party/python/importlib_resources/importlib_resources/readers.py
@@ -1,12 +1,18 @@
+from __future__ import annotations
+
import collections
+import contextlib
import itertools
import pathlib
import operator
+import re
+import warnings
+from collections.abc import Iterator
from . import abc
from ._itertools import only
-from ._compat import ZipPath
+from .compat.py39 import ZipPath
def remove_duplicates(items):
@@ -31,8 +37,10 @@ class FileReader(abc.TraversableResources):
class ZipReader(abc.TraversableResources):
def __init__(self, loader, module):
- _, _, name = module.rpartition('.')
- self.prefix = loader.prefix.replace('\\', '/') + name + '/'
+ self.prefix = loader.prefix.replace('\\', '/')
+ if loader.is_package(module):
+ _, _, name = module.rpartition('.')
+ self.prefix += name + '/'
self.archive = loader.archive
def open_resource(self, resource):
@@ -62,7 +70,7 @@ class MultiplexedPath(abc.Traversable):
"""
def __init__(self, *paths):
- self._paths = list(map(pathlib.Path, remove_duplicates(paths)))
+ self._paths = list(map(_ensure_traversable, remove_duplicates(paths)))
if not self._paths:
message = 'MultiplexedPath must contain at least one path'
raise FileNotFoundError(message)
@@ -130,7 +138,40 @@ class NamespaceReader(abc.TraversableResources):
def __init__(self, namespace_path):
if 'NamespacePath' not in str(namespace_path):
raise ValueError('Invalid path')
- self.path = MultiplexedPath(*list(namespace_path))
+ self.path = MultiplexedPath(*filter(bool, map(self._resolve, namespace_path)))
+
+ @classmethod
+ def _resolve(cls, path_str) -> abc.Traversable | None:
+ r"""
+ Given an item from a namespace path, resolve it to a Traversable.
+
+ path_str might be a directory on the filesystem or a path to a
+ zipfile plus the path within the zipfile, e.g. ``/foo/bar`` or
+ ``/foo/baz.zip/inner_dir`` or ``foo\baz.zip\inner_dir\sub``.
+
+ path_str might also be a sentinel used by editable packages to
+ trigger other behaviors (see python/importlib_resources#311).
+ In that case, return None.
+ """
+ dirs = (cand for cand in cls._candidate_paths(path_str) if cand.is_dir())
+ return next(dirs, None)
+
+ @classmethod
+ def _candidate_paths(cls, path_str: str) -> Iterator[abc.Traversable]:
+ yield pathlib.Path(path_str)
+ yield from cls._resolve_zip_path(path_str)
+
+ @staticmethod
+ def _resolve_zip_path(path_str: str):
+ for match in reversed(list(re.finditer(r'[\\/]', path_str))):
+ with contextlib.suppress(
+ FileNotFoundError,
+ IsADirectoryError,
+ NotADirectoryError,
+ PermissionError,
+ ):
+ inner = path_str[match.end() :].replace('\\', '/') + '/'
+ yield ZipPath(path_str[: match.start()], inner.lstrip('/'))
def resource_path(self, resource):
"""
@@ -142,3 +183,21 @@ class NamespaceReader(abc.TraversableResources):
def files(self):
return self.path
+
+
+def _ensure_traversable(path):
+ """
+ Convert deprecated string arguments to traversables (pathlib.Path).
+
+ Remove with Python 3.15.
+ """
+ if not isinstance(path, str):
+ return path
+
+ warnings.warn(
+ "String arguments are deprecated. Pass a Traversable instead.",
+ DeprecationWarning,
+ stacklevel=3,
+ )
+
+ return pathlib.Path(path)
diff --git a/third_party/python/importlib_resources/importlib_resources/simple.py b/third_party/python/importlib_resources/importlib_resources/simple.py
index 7770c922c84f..2e75299b13aa 100644
--- a/third_party/python/importlib_resources/importlib_resources/simple.py
+++ b/third_party/python/importlib_resources/importlib_resources/simple.py
@@ -77,7 +77,7 @@ class ResourceHandle(Traversable):
def __init__(self, parent: ResourceContainer, name: str):
self.parent = parent
- self.name = name # type: ignore
+ self.name = name # type: ignore[misc]
def is_file(self):
return True
@@ -88,7 +88,7 @@ class ResourceHandle(Traversable):
def open(self, mode='r', *args, **kwargs):
stream = self.parent.reader.open_binary(self.name)
if 'b' not in mode:
- stream = io.TextIOWrapper(*args, **kwargs)
+ stream = io.TextIOWrapper(stream, *args, **kwargs)
return stream
def joinpath(self, name):
diff --git a/third_party/python/jinja2_time/jinja2_time-0.2.0.dist-info/DESCRIPTION.rst b/third_party/python/jinja2_time/jinja2_time-0.2.0.dist-info/DESCRIPTION.rst
deleted file mode 100644
index a56fcb8b1423..000000000000
--- a/third_party/python/jinja2_time/jinja2_time-0.2.0.dist-info/DESCRIPTION.rst
+++ /dev/null
@@ -1,147 +0,0 @@
-===========
-Jinja2 Time
-===========
-
-|pypi| |pyversions| |license| |travis-ci|
-
-Jinja2 Extension for Dates and Times
-
-.. |pypi| image:: https://img.shields.io/pypi/v/jinja2-time.svg
- :target: https://pypi.python.org/pypi/jinja2-time
- :alt: PyPI Package
-
-.. |pyversions| image:: https://img.shields.io/pypi/pyversions/jinja2-time.svg
- :target: https://pypi.python.org/pypi/jinja2-time/
- :alt: PyPI Python Versions
-
-.. |license| image:: https://img.shields.io/pypi/l/jinja2-time.svg
- :target: https://pypi.python.org/pypi/jinja2-time
- :alt: PyPI Package License
-
-.. |travis-ci| image:: https://travis-ci.org/hackebrot/jinja2-time.svg?branch=master
- :target: https://travis-ci.org/hackebrot/jinja2-time
- :alt: See Build Status on Travis CI
-
-Installation
-------------
-
-**jinja2-time** is available for download from `PyPI`_ via `pip`_::
-
- $ pip install jinja2-time
-
-It will automatically install `jinja2`_ along with `arrow`_.
-
-.. _`jinja2`: https://github.com/mitsuhiko/jinja2
-.. _`PyPI`: https://pypi.python.org/pypi
-.. _`arrow`: https://github.com/crsmithdev/arrow
-.. _`pip`: https://pypi.python.org/pypi/pip/
-
-Usage
------
-
-Now Tag
-~~~~~~~
-
-The extension comes with a ``now`` tag that provides convenient access to the
-`arrow.now()`_ API from your templates.
-
-You can control the output by specifying a format, that will be passed to
-Python's `strftime()`_:
-
-.. _`arrow.now()`: http://crsmithdev.com/arrow/#arrow.factory.ArrowFactory.now
-.. _`strftime()`: https://docs.python.org/3.5/library/datetime.html#strftime-and-strptime-behavior
-
-.. code-block:: python
-
- from jinja2 import Environment
-
- env = Environment(extensions=['jinja2_time.TimeExtension'])
-
- # Timezone 'local', default format -> "2015-12-10"
- template = env.from_string("{% now 'local' %}")
-
- # Timezone 'utc', explicit format -> "Thu, 10 Dec 2015 15:49:01"
- template = env.from_string("{% now 'utc', '%a, %d %b %Y %H:%M:%S' %}")
-
- # Timezone 'Europe/Berlin', explicit format -> "CET +0100"
- template = env.from_string("{% now 'Europe/Berlin', '%Z %z' %}")
-
- # Timezone 'utc', explicit format -> "2015"
- template = env.from_string("{% now 'utc', '%Y' %}")
-
- template.render()
-
-Default Datetime Format
-~~~~~~~~~~~~~~~~~~~~~~~
-
-**TimeExtension** extends the environment with a ``datetime_format`` attribute.
-
-It is used as a fallback if you omit the format for ``now``.
-
-.. code-block:: python
-
- from jinja2 import Environment
-
- env = Environment(extensions=['jinja2_time.TimeExtension'])
-
- env.datetime_format = '%a, %d %b %Y %H:%M:%S'
-
- # Timezone 'utc', default format -> "Thu, 10 Dec 2015 15:49:01"
- template = env.from_string("{% now 'utc' %}")
-
- template.render()
-
-Time Offset
-~~~~~~~~~~~
-
-**jinja2-time** implements a convenient interface to modify ``now`` by a
-relative time offset:
-
-.. code-block:: python
-
- # Examples for now "2015-12-09 23:33:01"
-
- # "Thu, 10 Dec 2015 01:33:31"
- "{% now 'utc' + 'hours=2, seconds=30' %}"
-
- # "Wed, 09 Dec 2015 23:22:01"
- "{% now 'utc' - 'minutes=11' %}"
-
- # "07 Dec 2015 23:00:00"
- "{% now 'utc' - 'days=2, minutes=33, seconds=1', '%d %b %Y %H:%M:%S' %}"
-
-Further documentation on the underlying functionality can be found in the
-`arrow replace docs`_.
-
-.. _`arrow replace docs`: http://arrow.readthedocs.io/en/latest/#replace-shift
-
-
-Issues
-------
-
-If you encounter any problems, please `file an issue`_ along with a detailed description.
-
-.. _`file an issue`: https://github.com/hackebrot/jinja2-time/issues
-
-
-Code of Conduct
----------------
-
-Everyone interacting in the jinja2-time project's codebases, issue trackers, chat
-rooms, and mailing lists is expected to follow the `PyPA Code of Conduct`_.
-
-.. _`PyPA Code of Conduct`: https://www.pypa.io/en/latest/code-of-conduct/
-
-License
--------
-
-Distributed under the terms of the `MIT`_ license, jinja2-time is free and open source software
-
-.. image:: https://opensource.org/trademarks/osi-certified/web/osi-certified-120x100.png
- :align: left
- :alt: OSI certified
- :target: https://opensource.org/
-
-.. _`MIT`: http://opensource.org/licenses/MIT
-
-
diff --git a/third_party/python/jinja2_time/jinja2_time-0.2.0.dist-info/METADATA b/third_party/python/jinja2_time/jinja2_time-0.2.0.dist-info/METADATA
deleted file mode 100644
index 3714572a788e..000000000000
--- a/third_party/python/jinja2_time/jinja2_time-0.2.0.dist-info/METADATA
+++ /dev/null
@@ -1,174 +0,0 @@
-Metadata-Version: 2.0
-Name: jinja2-time
-Version: 0.2.0
-Summary: Jinja2 Extension for Dates and Times
-Home-page: https://github.com/hackebrot/jinja2-time
-Author: Raphael Pierzina
-Author-email: raphael@hackebrot.de
-License: MIT
-Keywords: jinja2,extension,time
-Platform: UNKNOWN
-Classifier: Development Status :: 3 - Alpha
-Classifier: Intended Audience :: Developers
-Classifier: License :: OSI Approved :: MIT License
-Classifier: Natural Language :: English
-Classifier: Operating System :: OS Independent
-Classifier: Programming Language :: Python :: 2
-Classifier: Programming Language :: Python :: 2.7
-Classifier: Programming Language :: Python :: 3
-Classifier: Programming Language :: Python :: 3.3
-Classifier: Programming Language :: Python :: 3.4
-Classifier: Programming Language :: Python :: 3.5
-Classifier: Programming Language :: Python :: Implementation :: CPython
-Classifier: Programming Language :: Python :: Implementation :: PyPy
-Classifier: Programming Language :: Python
-Requires-Dist: jinja2
-Requires-Dist: arrow
-
-===========
-Jinja2 Time
-===========
-
-|pypi| |pyversions| |license| |travis-ci|
-
-Jinja2 Extension for Dates and Times
-
-.. |pypi| image:: https://img.shields.io/pypi/v/jinja2-time.svg
- :target: https://pypi.python.org/pypi/jinja2-time
- :alt: PyPI Package
-
-.. |pyversions| image:: https://img.shields.io/pypi/pyversions/jinja2-time.svg
- :target: https://pypi.python.org/pypi/jinja2-time/
- :alt: PyPI Python Versions
-
-.. |license| image:: https://img.shields.io/pypi/l/jinja2-time.svg
- :target: https://pypi.python.org/pypi/jinja2-time
- :alt: PyPI Package License
-
-.. |travis-ci| image:: https://travis-ci.org/hackebrot/jinja2-time.svg?branch=master
- :target: https://travis-ci.org/hackebrot/jinja2-time
- :alt: See Build Status on Travis CI
-
-Installation
-------------
-
-**jinja2-time** is available for download from `PyPI`_ via `pip`_::
-
- $ pip install jinja2-time
-
-It will automatically install `jinja2`_ along with `arrow`_.
-
-.. _`jinja2`: https://github.com/mitsuhiko/jinja2
-.. _`PyPI`: https://pypi.python.org/pypi
-.. _`arrow`: https://github.com/crsmithdev/arrow
-.. _`pip`: https://pypi.python.org/pypi/pip/
-
-Usage
------
-
-Now Tag
-~~~~~~~
-
-The extension comes with a ``now`` tag that provides convenient access to the
-`arrow.now()`_ API from your templates.
-
-You can control the output by specifying a format, that will be passed to
-Python's `strftime()`_:
-
-.. _`arrow.now()`: http://crsmithdev.com/arrow/#arrow.factory.ArrowFactory.now
-.. _`strftime()`: https://docs.python.org/3.5/library/datetime.html#strftime-and-strptime-behavior
-
-.. code-block:: python
-
- from jinja2 import Environment
-
- env = Environment(extensions=['jinja2_time.TimeExtension'])
-
- # Timezone 'local', default format -> "2015-12-10"
- template = env.from_string("{% now 'local' %}")
-
- # Timezone 'utc', explicit format -> "Thu, 10 Dec 2015 15:49:01"
- template = env.from_string("{% now 'utc', '%a, %d %b %Y %H:%M:%S' %}")
-
- # Timezone 'Europe/Berlin', explicit format -> "CET +0100"
- template = env.from_string("{% now 'Europe/Berlin', '%Z %z' %}")
-
- # Timezone 'utc', explicit format -> "2015"
- template = env.from_string("{% now 'utc', '%Y' %}")
-
- template.render()
-
-Default Datetime Format
-~~~~~~~~~~~~~~~~~~~~~~~
-
-**TimeExtension** extends the environment with a ``datetime_format`` attribute.
-
-It is used as a fallback if you omit the format for ``now``.
-
-.. code-block:: python
-
- from jinja2 import Environment
-
- env = Environment(extensions=['jinja2_time.TimeExtension'])
-
- env.datetime_format = '%a, %d %b %Y %H:%M:%S'
-
- # Timezone 'utc', default format -> "Thu, 10 Dec 2015 15:49:01"
- template = env.from_string("{% now 'utc' %}")
-
- template.render()
-
-Time Offset
-~~~~~~~~~~~
-
-**jinja2-time** implements a convenient interface to modify ``now`` by a
-relative time offset:
-
-.. code-block:: python
-
- # Examples for now "2015-12-09 23:33:01"
-
- # "Thu, 10 Dec 2015 01:33:31"
- "{% now 'utc' + 'hours=2, seconds=30' %}"
-
- # "Wed, 09 Dec 2015 23:22:01"
- "{% now 'utc' - 'minutes=11' %}"
-
- # "07 Dec 2015 23:00:00"
- "{% now 'utc' - 'days=2, minutes=33, seconds=1', '%d %b %Y %H:%M:%S' %}"
-
-Further documentation on the underlying functionality can be found in the
-`arrow replace docs`_.
-
-.. _`arrow replace docs`: http://arrow.readthedocs.io/en/latest/#replace-shift
-
-
-Issues
-------
-
-If you encounter any problems, please `file an issue`_ along with a detailed description.
-
-.. _`file an issue`: https://github.com/hackebrot/jinja2-time/issues
-
-
-Code of Conduct
----------------
-
-Everyone interacting in the jinja2-time project's codebases, issue trackers, chat
-rooms, and mailing lists is expected to follow the `PyPA Code of Conduct`_.
-
-.. _`PyPA Code of Conduct`: https://www.pypa.io/en/latest/code-of-conduct/
-
-License
--------
-
-Distributed under the terms of the `MIT`_ license, jinja2-time is free and open source software
-
-.. image:: https://opensource.org/trademarks/osi-certified/web/osi-certified-120x100.png
- :align: left
- :alt: OSI certified
- :target: https://opensource.org/
-
-.. _`MIT`: http://opensource.org/licenses/MIT
-
-
diff --git a/third_party/python/jinja2_time/jinja2_time-0.2.0.dist-info/RECORD b/third_party/python/jinja2_time/jinja2_time-0.2.0.dist-info/RECORD
deleted file mode 100644
index e647ee37262b..000000000000
--- a/third_party/python/jinja2_time/jinja2_time-0.2.0.dist-info/RECORD
+++ /dev/null
@@ -1,8 +0,0 @@
-jinja2_time/__init__.py,sha256=M48p6Z1Rsv5OOL-q7kTRog1JPSquiRYOOxkhO3jJcrE,184
-jinja2_time/jinja2_time.py,sha256=MbBuzEMYSU_fHdx9M7ZfGGvEwdAnDOstQviU6GNPUpE,2080
-jinja2_time-0.2.0.dist-info/DESCRIPTION.rst,sha256=ATjmUYtQxCdXoMkTixBnyyF9lU1AhshfMJxY5ZrJkqo,4109
-jinja2_time-0.2.0.dist-info/METADATA,sha256=9nhHvQYAYZcafV5VigNdV_FB1btn5xLSY-kAOvt7bUk,5135
-jinja2_time-0.2.0.dist-info/metadata.json,sha256=i6xJP3_vGVQGUno_3vOjK9gFRtyFuyTnMy2k76rf1Js,1140
-jinja2_time-0.2.0.dist-info/RECORD,,
-jinja2_time-0.2.0.dist-info/top_level.txt,sha256=oQxkTcv8SKoVYEKSYSrhkn5AsQR1-p1rAqo-Ouu0mNA,12
-jinja2_time-0.2.0.dist-info/WHEEL,sha256=AvR0WeTpDaxT645bl5FQxUK6NPsTls2ttpcGJg3j1Xg,110
diff --git a/third_party/python/jinja2_time/jinja2_time-0.2.0.dist-info/WHEEL b/third_party/python/jinja2_time/jinja2_time-0.2.0.dist-info/WHEEL
deleted file mode 100644
index 9dff69d86102..000000000000
--- a/third_party/python/jinja2_time/jinja2_time-0.2.0.dist-info/WHEEL
+++ /dev/null
@@ -1,6 +0,0 @@
-Wheel-Version: 1.0
-Generator: bdist_wheel (0.24.0)
-Root-Is-Purelib: true
-Tag: py2-none-any
-Tag: py3-none-any
-
diff --git a/third_party/python/jinja2_time/jinja2_time-0.2.0.dist-info/metadata.json b/third_party/python/jinja2_time/jinja2_time-0.2.0.dist-info/metadata.json
deleted file mode 100644
index d1de0ed87065..000000000000
--- a/third_party/python/jinja2_time/jinja2_time-0.2.0.dist-info/metadata.json
+++ /dev/null
@@ -1 +0,0 @@
-{"extras": [], "run_requires": [{"requires": ["jinja2", "arrow"]}], "version": "0.2.0", "keywords": ["jinja2", "extension", "time"], "license": "MIT", "summary": "Jinja2 Extension for Dates and Times", "generator": "bdist_wheel (0.24.0)", "metadata_version": "2.0", "name": "jinja2-time", "extensions": {"python.details": {"contacts": [{"email": "raphael@hackebrot.de", "name": "Raphael Pierzina", "role": "author"}], "project_urls": {"Home": "https://github.com/hackebrot/jinja2-time"}, "document_names": {"description": "DESCRIPTION.rst"}}}, "classifiers": ["Development Status :: 3 - Alpha", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Natural Language :: English", "Operating System :: OS Independent", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: Implementation :: CPython", "Programming Language :: Python :: Implementation :: PyPy", "Programming Language :: Python"]}
\ No newline at end of file
diff --git a/third_party/python/jinja2_time/jinja2_time-0.2.0.dist-info/top_level.txt b/third_party/python/jinja2_time/jinja2_time-0.2.0.dist-info/top_level.txt
deleted file mode 100644
index 5ac870f1f95c..000000000000
--- a/third_party/python/jinja2_time/jinja2_time-0.2.0.dist-info/top_level.txt
+++ /dev/null
@@ -1 +0,0 @@
-jinja2_time
diff --git a/third_party/python/jinja2_time/jinja2_time/__init__.py b/third_party/python/jinja2_time/jinja2_time/__init__.py
deleted file mode 100644
index d813a7b741d1..000000000000
--- a/third_party/python/jinja2_time/jinja2_time/__init__.py
+++ /dev/null
@@ -1,10 +0,0 @@
-# -*- coding: utf-8 -*-
-
-from .jinja2_time import TimeExtension
-
-__author__ = 'Raphael Pierzina'
-__email__ = 'raphael@hackebrot.de'
-__version__ = '0.2.0'
-
-
-__all__ = ['TimeExtension']
diff --git a/third_party/python/jinja2_time/jinja2_time/jinja2_time.py b/third_party/python/jinja2_time/jinja2_time/jinja2_time.py
deleted file mode 100644
index ce713cbdc2a6..000000000000
--- a/third_party/python/jinja2_time/jinja2_time/jinja2_time.py
+++ /dev/null
@@ -1,65 +0,0 @@
-# -*- coding: utf-8 -*-
-
-import arrow
-
-from jinja2 import nodes
-from jinja2.ext import Extension
-
-
-class TimeExtension(Extension):
- tags = set(['now'])
-
- def __init__(self, environment):
- super(TimeExtension, self).__init__(environment)
-
- # add the defaults to the environment
- environment.extend(datetime_format='%Y-%m-%d')
-
- def _datetime(self, timezone, operator, offset, datetime_format):
- d = arrow.now(timezone)
-
- # Parse replace kwargs from offset and include operator
- replace_params = {}
- for param in offset.split(','):
- interval, value = param.split('=')
- replace_params[interval.strip()] = float(operator + value.strip())
- d = d.replace(**replace_params)
-
- if datetime_format is None:
- datetime_format = self.environment.datetime_format
- return d.strftime(datetime_format)
-
- def _now(self, timezone, datetime_format):
- if datetime_format is None:
- datetime_format = self.environment.datetime_format
- return arrow.now(timezone).strftime(datetime_format)
-
- def parse(self, parser):
- lineno = next(parser.stream).lineno
-
- node = parser.parse_expression()
-
- if parser.stream.skip_if('comma'):
- datetime_format = parser.parse_expression()
- else:
- datetime_format = nodes.Const(None)
-
- if isinstance(node, nodes.Add):
- call_method = self.call_method(
- '_datetime',
- [node.left, nodes.Const('+'), node.right, datetime_format],
- lineno=lineno,
- )
- elif isinstance(node, nodes.Sub):
- call_method = self.call_method(
- '_datetime',
- [node.left, nodes.Const('-'), node.right, datetime_format],
- lineno=lineno,
- )
- else:
- call_method = self.call_method(
- '_now',
- [node, datetime_format],
- lineno=lineno,
- )
- return nodes.Output([call_method], lineno=lineno)
diff --git a/third_party/python/jinxed/jinxed-1.2.0.dist-info/RECORD b/third_party/python/jinxed/jinxed-1.2.0.dist-info/RECORD
deleted file mode 100644
index 2929aa63a9ba..000000000000
--- a/third_party/python/jinxed/jinxed-1.2.0.dist-info/RECORD
+++ /dev/null
@@ -1,18 +0,0 @@
-jinxed/__init__.py,sha256=SiIICY1hCXKflXonUVMsB6tnX0HlBOqmTvStTGJlkWU,1047
-jinxed/_keys.py,sha256=2UeEOVCPBgy5fv6HKaW_TxmHI03QwqEv_TiKGB5lSCI,2535
-jinxed/_terminal.py,sha256=kdYG-8E9rIgMCXxzEVA19-q01EYm2TQWxvr5vCPnnyY,3330
-jinxed/_tparm.py,sha256=sn1P8_4VsSsgHYgco1va-Bk2eQTColtPTj3aAa3QR7A,8833
-jinxed/_util.py,sha256=kcxjcHhGX7cqrlYlBYc03dsez3RCx899OzPgQ_L4jmE,1462
-jinxed/has_key.py,sha256=J9nU62s2KZcndOud1b8x_B3uBsZonGfqPLWan9Kh5Jw,4269
-jinxed/win32.py,sha256=oIpfwPRAAq4kBJGXA5pnaapaYW7ubO72sF2HEZeY2uM,10256
-jinxed/terminfo/__init__.py,sha256=63dZbYG1TkSJwWbm_2rEfmBjMalOO-gBj1pHEvCaTNg,5088
-jinxed/terminfo/ansicon.py,sha256=X3dLufLBpFwX8ouKJMt7Ia3Xu7rCKxKI9pQEYFlAD5E,4313
-jinxed/terminfo/vtwin10.py,sha256=W4sqWtH0p-lzd-5u0q_wkePNhbKtJX_UeDksPBnYp5o,2057
-jinxed/terminfo/xterm.py,sha256=NIPuVWIWvhF4ClQxewGlRnVxBKq2j1iV1knKdG7WA1I,30525
-jinxed/terminfo/xterm_256color.py,sha256=Xi6I7LbIy2F4hmpzXf51YK1utdWWKUNqEWlpHb39isM,792
-jinxed/terminfo/xterm_256colors.py,sha256=02ci_cybpc_qNw-guktEth-JduVTspDCats4QaEtOjQ,793
-jinxed-1.2.0.dist-info/LICENSE,sha256=HyVuytGSiAUQ6ErWBHTqt1iSGHhLmlC8fO7jTCuR8dU,16725
-jinxed-1.2.0.dist-info/METADATA,sha256=pXE3x-jb9pFccBO8qpKUp2HSbBc_JmNoJ4XfcOVPxgQ,4272
-jinxed-1.2.0.dist-info/WHEEL,sha256=Z-nyYpwrcSqxfdux5Mbn_DQ525iP7J2DG3JgGvOYyTQ,110
-jinxed-1.2.0.dist-info/top_level.txt,sha256=B6kZZ8ObbPHjOIuhpS6zxE9lGfnpHp5KthpsDuXIXR0,7
-jinxed-1.2.0.dist-info/RECORD,,
diff --git a/third_party/python/jinxed/jinxed-1.2.0.dist-info/WHEEL b/third_party/python/jinxed/jinxed-1.2.0.dist-info/WHEEL
deleted file mode 100644
index 01b8fc7d4a10..000000000000
--- a/third_party/python/jinxed/jinxed-1.2.0.dist-info/WHEEL
+++ /dev/null
@@ -1,6 +0,0 @@
-Wheel-Version: 1.0
-Generator: bdist_wheel (0.36.2)
-Root-Is-Purelib: true
-Tag: py2-none-any
-Tag: py3-none-any
-
diff --git a/third_party/python/jinxed/jinxed-1.2.0.dist-info/LICENSE b/third_party/python/jinxed/jinxed-1.3.0.dist-info/LICENSE
similarity index 100%
rename from third_party/python/jinxed/jinxed-1.2.0.dist-info/LICENSE
rename to third_party/python/jinxed/jinxed-1.3.0.dist-info/LICENSE
diff --git a/third_party/python/jinxed/jinxed-1.2.0.dist-info/METADATA b/third_party/python/jinxed/jinxed-1.3.0.dist-info/METADATA
similarity index 88%
rename from third_party/python/jinxed/jinxed-1.2.0.dist-info/METADATA
rename to third_party/python/jinxed/jinxed-1.3.0.dist-info/METADATA
index ae98a1b6fb2b..ab2c1a315be2 100644
--- a/third_party/python/jinxed/jinxed-1.2.0.dist-info/METADATA
+++ b/third_party/python/jinxed/jinxed-1.3.0.dist-info/METADATA
@@ -1,6 +1,6 @@
Metadata-Version: 2.1
Name: jinxed
-Version: 1.2.0
+Version: 1.3.0
Summary: Jinxed Terminal Library
Home-page: https://github.com/Rockhopper-Technologies/jinxed
Author: Avram Lubkin
@@ -9,7 +9,6 @@ Maintainer: Avram Lubkin
Maintainer-email: avylove@rockhopper.net
License: MPLv2.0
Keywords: terminal console blessed curses
-Platform: UNKNOWN
Classifier: Development Status :: 5 - Production/Stable
Classifier: Environment :: Console
Classifier: Intended Audience :: Developers
@@ -23,6 +22,10 @@ Classifier: Programming Language :: Python :: 3.6
Classifier: Programming Language :: Python :: 3.7
Classifier: Programming Language :: Python :: 3.8
Classifier: Programming Language :: Python :: 3.9
+Classifier: Programming Language :: Python :: 3.10
+Classifier: Programming Language :: Python :: 3.11
+Classifier: Programming Language :: Python :: 3.12
+Classifier: Programming Language :: Python :: 3.13
Classifier: Programming Language :: Python :: Implementation :: CPython
Classifier: Programming Language :: Python :: Implementation :: PyPy
Classifier: Topic :: Terminals
@@ -31,7 +34,7 @@ Requires-Dist: ansicon ; platform_system == "Windows"
.. start-badges
-| |docs| |appveyor| |travis| |codecov|
+| |docs| |gh_actions| |codecov|
| |pypi| |supported-versions| |supported-implementations|
| |linux| |windows| |mac| |bsd|
@@ -43,6 +46,10 @@ Requires-Dist: ansicon ; platform_system == "Windows"
:target: https://ci.appveyor.com/project/Rockhopper-Technologies/jinxed
:alt: Appveyor Build Status
+.. |gh_actions| image:: https://img.shields.io/github/actions/workflow/status/Rockhopper-Technologies/jinxed/tests.yml?event=push&logo=github-actions&style=plastic
+ :target: https://github.com/Rockhopper-Technologies/jinxed/actions/workflows/tests.yml
+ :alt: GitHub Actions Status
+
.. |travis| image:: https://img.shields.io/travis/com/Rockhopper-Technologies/jinxed.svg?style=plastic&logo=travis
:target: https://travis-ci.com/Rockhopper-Technologies/jinxed
:alt: Travis-CI Build Status
@@ -109,4 +116,3 @@ Jinxed documentation can be found on `Read the Docs = (3, 10):
+ DATACLASS_KWARGS = {"slots": True}
+else:
+ DATACLASS_KWARGS = {}
diff --git a/third_party/python/markdown_it_py/markdown_it/_punycode.py b/third_party/python/markdown_it_py/markdown_it/_punycode.py
new file mode 100644
index 000000000000..f9baad278d0d
--- /dev/null
+++ b/third_party/python/markdown_it_py/markdown_it/_punycode.py
@@ -0,0 +1,67 @@
+# Copyright 2014 Mathias Bynens
+# Copyright 2021 Taneli Hukkinen
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+import codecs
+import re
+from typing import Callable
+
+REGEX_SEPARATORS = re.compile(r"[\x2E\u3002\uFF0E\uFF61]")
+REGEX_NON_ASCII = re.compile(r"[^\0-\x7E]")
+
+
+def encode(uni: str) -> str:
+ return codecs.encode(uni, encoding="punycode").decode()
+
+
+def decode(ascii: str) -> str:
+ return codecs.decode(ascii, encoding="punycode") # type: ignore
+
+
+def map_domain(string: str, fn: Callable[[str], str]) -> str:
+ parts = string.split("@")
+ result = ""
+ if len(parts) > 1:
+ # In email addresses, only the domain name should be punycoded. Leave
+ # the local part (i.e. everything up to `@`) intact.
+ result = parts[0] + "@"
+ string = parts[1]
+ labels = REGEX_SEPARATORS.split(string)
+ encoded = ".".join(fn(label) for label in labels)
+ return result + encoded
+
+
+def to_unicode(obj: str) -> str:
+ def mapping(obj: str) -> str:
+ if obj.startswith("xn--"):
+ return decode(obj[4:].lower())
+ return obj
+
+ return map_domain(obj, mapping)
+
+
+def to_ascii(obj: str) -> str:
+ def mapping(obj: str) -> str:
+ if REGEX_NON_ASCII.search(obj):
+ return "xn--" + encode(obj)
+ return obj
+
+ return map_domain(obj, mapping)
diff --git a/third_party/python/markdown_it_py/markdown_it/cli/__init__.py b/third_party/python/markdown_it_py/markdown_it/cli/__init__.py
new file mode 100644
index 000000000000..e69de29bb2d1
diff --git a/third_party/python/markdown_it_py/markdown_it/cli/parse.py b/third_party/python/markdown_it_py/markdown_it/cli/parse.py
new file mode 100644
index 000000000000..890d5de3e4bb
--- /dev/null
+++ b/third_party/python/markdown_it_py/markdown_it/cli/parse.py
@@ -0,0 +1,109 @@
+#!/usr/bin/env python
+"""
+CLI interface to markdown-it-py
+
+Parse one or more markdown files, convert each to HTML, and print to stdout.
+"""
+from __future__ import annotations
+
+import argparse
+from collections.abc import Iterable, Sequence
+import sys
+
+from markdown_it import __version__
+from markdown_it.main import MarkdownIt
+
+version_str = "markdown-it-py [version {}]".format(__version__)
+
+
+def main(args: Sequence[str] | None = None) -> int:
+ namespace = parse_args(args)
+ if namespace.filenames:
+ convert(namespace.filenames)
+ else:
+ interactive()
+ return 0
+
+
+def convert(filenames: Iterable[str]) -> None:
+ for filename in filenames:
+ convert_file(filename)
+
+
+def convert_file(filename: str) -> None:
+ """
+ Parse a Markdown file and dump the output to stdout.
+ """
+ try:
+ with open(filename, "r", encoding="utf8", errors="ignore") as fin:
+ rendered = MarkdownIt().render(fin.read())
+ print(rendered, end="")
+ except OSError:
+ sys.stderr.write(f'Cannot open file "{filename}".\n')
+ sys.exit(1)
+
+
+def interactive() -> None:
+ """
+ Parse user input, dump to stdout, rinse and repeat.
+ Python REPL style.
+ """
+ print_heading()
+ contents = []
+ more = False
+ while True:
+ try:
+ prompt, more = ("... ", True) if more else (">>> ", True)
+ contents.append(input(prompt) + "\n")
+ except EOFError:
+ print("\n" + MarkdownIt().render("\n".join(contents)), end="")
+ more = False
+ contents = []
+ except KeyboardInterrupt:
+ print("\nExiting.")
+ break
+
+
+def parse_args(args: Sequence[str] | None) -> argparse.Namespace:
+ """Parse input CLI arguments."""
+ parser = argparse.ArgumentParser(
+ description="Parse one or more markdown files, "
+ "convert each to HTML, and print to stdout",
+ # NOTE: Remember to update README.md w/ the output of `markdown-it -h`
+ epilog=(
+ f"""
+Interactive:
+
+ $ markdown-it
+ markdown-it-py [version {__version__}] (interactive)
+ Type Ctrl-D to complete input, or Ctrl-C to exit.
+ >>> # Example
+ ... > markdown *input*
+ ...
+ Example
+
+ markdown input
+
+
+Batch:
+
+ $ markdown-it README.md README.footer.md > index.html
+"""
+ ),
+ formatter_class=argparse.RawDescriptionHelpFormatter,
+ )
+ parser.add_argument("-v", "--version", action="version", version=version_str)
+ parser.add_argument(
+ "filenames", nargs="*", help="specify an optional list of files to convert"
+ )
+ return parser.parse_args(args)
+
+
+def print_heading() -> None:
+ print("{} (interactive)".format(version_str))
+ print("Type Ctrl-D to complete input, or Ctrl-C to exit.")
+
+
+if __name__ == "__main__":
+ exit_code = main(sys.argv[1:])
+ sys.exit(exit_code)
diff --git a/third_party/python/markdown_it_py/markdown_it/common/__init__.py b/third_party/python/markdown_it_py/markdown_it/common/__init__.py
new file mode 100644
index 000000000000..e69de29bb2d1
diff --git a/third_party/python/markdown_it_py/markdown_it/common/entities.py b/third_party/python/markdown_it_py/markdown_it/common/entities.py
new file mode 100644
index 000000000000..6bb2d343c233
--- /dev/null
+++ b/third_party/python/markdown_it_py/markdown_it/common/entities.py
@@ -0,0 +1,4 @@
+"""HTML5 entities map: { name -> characters }."""
+import html.entities
+
+entities = {name.rstrip(";"): chars for name, chars in html.entities.html5.items()}
diff --git a/third_party/python/markdown_it_py/markdown_it/common/html_blocks.py b/third_party/python/markdown_it_py/markdown_it/common/html_blocks.py
new file mode 100644
index 000000000000..8b199af336ed
--- /dev/null
+++ b/third_party/python/markdown_it_py/markdown_it/common/html_blocks.py
@@ -0,0 +1,68 @@
+"""List of valid html blocks names, according to commonmark spec
+http://jgm.github.io/CommonMark/spec.html#html-blocks
+"""
+
+block_names = [
+ "address",
+ "article",
+ "aside",
+ "base",
+ "basefont",
+ "blockquote",
+ "body",
+ "caption",
+ "center",
+ "col",
+ "colgroup",
+ "dd",
+ "details",
+ "dialog",
+ "dir",
+ "div",
+ "dl",
+ "dt",
+ "fieldset",
+ "figcaption",
+ "figure",
+ "footer",
+ "form",
+ "frame",
+ "frameset",
+ "h1",
+ "h2",
+ "h3",
+ "h4",
+ "h5",
+ "h6",
+ "head",
+ "header",
+ "hr",
+ "html",
+ "iframe",
+ "legend",
+ "li",
+ "link",
+ "main",
+ "menu",
+ "menuitem",
+ "nav",
+ "noframes",
+ "ol",
+ "optgroup",
+ "option",
+ "p",
+ "param",
+ "section",
+ "source",
+ "summary",
+ "table",
+ "tbody",
+ "td",
+ "tfoot",
+ "th",
+ "thead",
+ "title",
+ "tr",
+ "track",
+ "ul",
+]
diff --git a/third_party/python/markdown_it_py/markdown_it/common/html_re.py b/third_party/python/markdown_it_py/markdown_it/common/html_re.py
new file mode 100644
index 000000000000..f0c336d23816
--- /dev/null
+++ b/third_party/python/markdown_it_py/markdown_it/common/html_re.py
@@ -0,0 +1,40 @@
+"""Regexps to match html elements
+"""
+
+import re
+
+attr_name = "[a-zA-Z_:][a-zA-Z0-9:._-]*"
+
+unquoted = "[^\"'=<>`\\x00-\\x20]+"
+single_quoted = "'[^']*'"
+double_quoted = '"[^"]*"'
+
+attr_value = "(?:" + unquoted + "|" + single_quoted + "|" + double_quoted + ")"
+
+attribute = "(?:\\s+" + attr_name + "(?:\\s*=\\s*" + attr_value + ")?)"
+
+open_tag = "<[A-Za-z][A-Za-z0-9\\-]*" + attribute + "*\\s*\\/?>"
+
+close_tag = "<\\/[A-Za-z][A-Za-z0-9\\-]*\\s*>"
+comment = "|"
+processing = "<[?][\\s\\S]*?[?]>"
+declaration = "]*>"
+cdata = ""
+
+HTML_TAG_RE = re.compile(
+ "^(?:"
+ + open_tag
+ + "|"
+ + close_tag
+ + "|"
+ + comment
+ + "|"
+ + processing
+ + "|"
+ + declaration
+ + "|"
+ + cdata
+ + ")"
+)
+HTML_OPEN_CLOSE_TAG_STR = "^(?:" + open_tag + "|" + close_tag + ")"
+HTML_OPEN_CLOSE_TAG_RE = re.compile(HTML_OPEN_CLOSE_TAG_STR)
diff --git a/third_party/python/markdown_it_py/markdown_it/common/normalize_url.py b/third_party/python/markdown_it_py/markdown_it/common/normalize_url.py
new file mode 100644
index 000000000000..92720b31621b
--- /dev/null
+++ b/third_party/python/markdown_it_py/markdown_it/common/normalize_url.py
@@ -0,0 +1,81 @@
+from __future__ import annotations
+
+from collections.abc import Callable
+from contextlib import suppress
+import re
+from urllib.parse import quote, unquote, urlparse, urlunparse # noqa: F401
+
+import mdurl
+
+from .. import _punycode
+
+RECODE_HOSTNAME_FOR = ("http:", "https:", "mailto:")
+
+
+def normalizeLink(url: str) -> str:
+ """Normalize destination URLs in links
+
+ ::
+
+ [label]: destination 'title'
+ ^^^^^^^^^^^
+ """
+ parsed = mdurl.parse(url, slashes_denote_host=True)
+
+ # Encode hostnames in urls like:
+ # `http://host/`, `https://host/`, `mailto:user@host`, `//host/`
+ #
+ # We don't encode unknown schemas, because it's likely that we encode
+ # something we shouldn't (e.g. `skype:name` treated as `skype:host`)
+ #
+ if parsed.hostname and (
+ not parsed.protocol or parsed.protocol in RECODE_HOSTNAME_FOR
+ ):
+ with suppress(Exception):
+ parsed = parsed._replace(hostname=_punycode.to_ascii(parsed.hostname))
+
+ return mdurl.encode(mdurl.format(parsed))
+
+
+def normalizeLinkText(url: str) -> str:
+ """Normalize autolink content
+
+ ::
+
+
+ ~~~~~~~~~~~
+ """
+ parsed = mdurl.parse(url, slashes_denote_host=True)
+
+ # Encode hostnames in urls like:
+ # `http://host/`, `https://host/`, `mailto:user@host`, `//host/`
+ #
+ # We don't encode unknown schemas, because it's likely that we encode
+ # something we shouldn't (e.g. `skype:name` treated as `skype:host`)
+ #
+ if parsed.hostname and (
+ not parsed.protocol or parsed.protocol in RECODE_HOSTNAME_FOR
+ ):
+ with suppress(Exception):
+ parsed = parsed._replace(hostname=_punycode.to_unicode(parsed.hostname))
+
+ # add '%' to exclude list because of https://github.com/markdown-it/markdown-it/issues/720
+ return mdurl.decode(mdurl.format(parsed), mdurl.DECODE_DEFAULT_CHARS + "%")
+
+
+BAD_PROTO_RE = re.compile(r"^(vbscript|javascript|file|data):")
+GOOD_DATA_RE = re.compile(r"^data:image\/(gif|png|jpeg|webp);")
+
+
+def validateLink(url: str, validator: Callable[[str], bool] | None = None) -> bool:
+ """Validate URL link is allowed in output.
+
+ This validator can prohibit more than really needed to prevent XSS.
+ It's a tradeoff to keep code simple and to be secure by default.
+
+ Note: url should be normalized at this point, and existing entities decoded.
+ """
+ if validator is not None:
+ return validator(url)
+ url = url.strip().lower()
+ return bool(GOOD_DATA_RE.search(url)) if BAD_PROTO_RE.search(url) else True
diff --git a/third_party/python/markdown_it_py/markdown_it/common/utils.py b/third_party/python/markdown_it_py/markdown_it/common/utils.py
new file mode 100644
index 000000000000..0d11e3e3eec3
--- /dev/null
+++ b/third_party/python/markdown_it_py/markdown_it/common/utils.py
@@ -0,0 +1,318 @@
+"""Utilities for parsing source text
+"""
+from __future__ import annotations
+
+import re
+from typing import Match, TypeVar
+
+from .entities import entities
+
+
+def charCodeAt(src: str, pos: int) -> int | None:
+ """
+ Returns the Unicode value of the character at the specified location.
+
+ @param - index The zero-based index of the desired character.
+ If there is no character at the specified index, NaN is returned.
+
+ This was added for compatibility with python
+ """
+ try:
+ return ord(src[pos])
+ except IndexError:
+ return None
+
+
+def charStrAt(src: str, pos: int) -> str | None:
+ """
+ Returns the Unicode value of the character at the specified location.
+
+ @param - index The zero-based index of the desired character.
+ If there is no character at the specified index, NaN is returned.
+
+ This was added for compatibility with python
+ """
+ try:
+ return src[pos]
+ except IndexError:
+ return None
+
+
+_ItemTV = TypeVar("_ItemTV")
+
+
+def arrayReplaceAt(
+ src: list[_ItemTV], pos: int, newElements: list[_ItemTV]
+) -> list[_ItemTV]:
+ """
+ Remove element from array and put another array at those position.
+ Useful for some operations with tokens
+ """
+ return src[:pos] + newElements + src[pos + 1 :]
+
+
+def isValidEntityCode(c: int) -> bool:
+ # broken sequence
+ if c >= 0xD800 and c <= 0xDFFF:
+ return False
+ # never used
+ if c >= 0xFDD0 and c <= 0xFDEF:
+ return False
+ if ((c & 0xFFFF) == 0xFFFF) or ((c & 0xFFFF) == 0xFFFE):
+ return False
+ # control codes
+ if c >= 0x00 and c <= 0x08:
+ return False
+ if c == 0x0B:
+ return False
+ if c >= 0x0E and c <= 0x1F:
+ return False
+ if c >= 0x7F and c <= 0x9F:
+ return False
+ # out of range
+ if c > 0x10FFFF:
+ return False
+ return True
+
+
+def fromCodePoint(c: int) -> str:
+ """Convert ordinal to unicode.
+
+ Note, in the original Javascript two string characters were required,
+ for codepoints larger than `0xFFFF`.
+ But Python 3 can represent any unicode codepoint in one character.
+ """
+ return chr(c)
+
+
+# UNESCAPE_MD_RE = re.compile(r'\\([!"#$%&\'()*+,\-.\/:;<=>?@[\\\]^_`{|}~])')
+# ENTITY_RE_g = re.compile(r'&([a-z#][a-z0-9]{1,31})', re.IGNORECASE)
+UNESCAPE_ALL_RE = re.compile(
+ r'\\([!"#$%&\'()*+,\-.\/:;<=>?@[\\\]^_`{|}~])' + "|" + r"&([a-z#][a-z0-9]{1,31});",
+ re.IGNORECASE,
+)
+DIGITAL_ENTITY_BASE10_RE = re.compile(r"#([0-9]{1,8})")
+DIGITAL_ENTITY_BASE16_RE = re.compile(r"#x([a-f0-9]{1,8})", re.IGNORECASE)
+
+
+def replaceEntityPattern(match: str, name: str) -> str:
+ """Convert HTML entity patterns,
+ see https://spec.commonmark.org/0.30/#entity-references
+ """
+ if name in entities:
+ return entities[name]
+
+ code: None | int = None
+ if pat := DIGITAL_ENTITY_BASE10_RE.fullmatch(name):
+ code = int(pat.group(1), 10)
+ elif pat := DIGITAL_ENTITY_BASE16_RE.fullmatch(name):
+ code = int(pat.group(1), 16)
+
+ if code is not None and isValidEntityCode(code):
+ return fromCodePoint(code)
+
+ return match
+
+
+def unescapeAll(string: str) -> str:
+ def replacer_func(match: Match[str]) -> str:
+ escaped = match.group(1)
+ if escaped:
+ return escaped
+ entity = match.group(2)
+ return replaceEntityPattern(match.group(), entity)
+
+ if "\\" not in string and "&" not in string:
+ return string
+ return UNESCAPE_ALL_RE.sub(replacer_func, string)
+
+
+ESCAPABLE = r"""\\!"#$%&'()*+,./:;<=>?@\[\]^`{}|_~-"""
+ESCAPE_CHAR = re.compile(r"\\([" + ESCAPABLE + r"])")
+
+
+def stripEscape(string: str) -> str:
+ """Strip escape \\ characters"""
+ return ESCAPE_CHAR.sub(r"\1", string)
+
+
+def escapeHtml(raw: str) -> str:
+ """Replace special characters "&", "<", ">" and '"' to HTML-safe sequences."""
+ # like html.escape, but without escaping single quotes
+ raw = raw.replace("&", "&") # Must be done first!
+ raw = raw.replace("<", "<")
+ raw = raw.replace(">", ">")
+ raw = raw.replace('"', """)
+ return raw
+
+
+# //////////////////////////////////////////////////////////////////////////////
+
+REGEXP_ESCAPE_RE = re.compile(r"[.?*+^$[\]\\(){}|-]")
+
+
+def escapeRE(string: str) -> str:
+ string = REGEXP_ESCAPE_RE.sub("\\$&", string)
+ return string
+
+
+# //////////////////////////////////////////////////////////////////////////////
+
+
+def isSpace(code: int | None) -> bool:
+ """Check if character code is a whitespace."""
+ return code in (0x09, 0x20)
+
+
+def isStrSpace(ch: str | None) -> bool:
+ """Check if character is a whitespace."""
+ return ch in ("\t", " ")
+
+
+MD_WHITESPACE = {
+ 0x09, # \t
+ 0x0A, # \n
+ 0x0B, # \v
+ 0x0C, # \f
+ 0x0D, # \r
+ 0x20, # space
+ 0xA0,
+ 0x1680,
+ 0x202F,
+ 0x205F,
+ 0x3000,
+}
+
+
+def isWhiteSpace(code: int) -> bool:
+ r"""Zs (unicode class) || [\t\f\v\r\n]"""
+ if code >= 0x2000 and code <= 0x200A:
+ return True
+ return code in MD_WHITESPACE
+
+
+# //////////////////////////////////////////////////////////////////////////////
+
+UNICODE_PUNCT_RE = re.compile(
+ r"[!-#%-\*,-\/:;\?@\[-\]_\{\}\xA1\xA7\xAB\xB6\xB7\xBB\xBF\u037E\u0387\u055A-\u055F\u0589\u058A\u05BE\u05C0\u05C3\u05C6\u05F3\u05F4\u0609\u060A\u060C\u060D\u061B\u061E\u061F\u066A-\u066D\u06D4\u0700-\u070D\u07F7-\u07F9\u0830-\u083E\u085E\u0964\u0965\u0970\u09FD\u0A76\u0AF0\u0C84\u0DF4\u0E4F\u0E5A\u0E5B\u0F04-\u0F12\u0F14\u0F3A-\u0F3D\u0F85\u0FD0-\u0FD4\u0FD9\u0FDA\u104A-\u104F\u10FB\u1360-\u1368\u1400\u166D\u166E\u169B\u169C\u16EB-\u16ED\u1735\u1736\u17D4-\u17D6\u17D8-\u17DA\u1800-\u180A\u1944\u1945\u1A1E\u1A1F\u1AA0-\u1AA6\u1AA8-\u1AAD\u1B5A-\u1B60\u1BFC-\u1BFF\u1C3B-\u1C3F\u1C7E\u1C7F\u1CC0-\u1CC7\u1CD3\u2010-\u2027\u2030-\u2043\u2045-\u2051\u2053-\u205E\u207D\u207E\u208D\u208E\u2308-\u230B\u2329\u232A\u2768-\u2775\u27C5\u27C6\u27E6-\u27EF\u2983-\u2998\u29D8-\u29DB\u29FC\u29FD\u2CF9-\u2CFC\u2CFE\u2CFF\u2D70\u2E00-\u2E2E\u2E30-\u2E4E\u3001-\u3003\u3008-\u3011\u3014-\u301F\u3030\u303D\u30A0\u30FB\uA4FE\uA4FF\uA60D-\uA60F\uA673\uA67E\uA6F2-\uA6F7\uA874-\uA877\uA8CE\uA8CF\uA8F8-\uA8FA\uA8FC\uA92E\uA92F\uA95F\uA9C1-\uA9CD\uA9DE\uA9DF\uAA5C-\uAA5F\uAADE\uAADF\uAAF0\uAAF1\uABEB\uFD3E\uFD3F\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE61\uFE63\uFE68\uFE6A\uFE6B\uFF01-\uFF03\uFF05-\uFF0A\uFF0C-\uFF0F\uFF1A\uFF1B\uFF1F\uFF20\uFF3B-\uFF3D\uFF3F\uFF5B\uFF5D\uFF5F-\uFF65]|\uD800[\uDD00-\uDD02\uDF9F\uDFD0]|\uD801\uDD6F|\uD802[\uDC57\uDD1F\uDD3F\uDE50-\uDE58\uDE7F\uDEF0-\uDEF6\uDF39-\uDF3F\uDF99-\uDF9C]|\uD803[\uDF55-\uDF59]|\uD804[\uDC47-\uDC4D\uDCBB\uDCBC\uDCBE-\uDCC1\uDD40-\uDD43\uDD74\uDD75\uDDC5-\uDDC8\uDDCD\uDDDB\uDDDD-\uDDDF\uDE38-\uDE3D\uDEA9]|\uD805[\uDC4B-\uDC4F\uDC5B\uDC5D\uDCC6\uDDC1-\uDDD7\uDE41-\uDE43\uDE60-\uDE6C\uDF3C-\uDF3E]|\uD806[\uDC3B\uDE3F-\uDE46\uDE9A-\uDE9C\uDE9E-\uDEA2]|\uD807[\uDC41-\uDC45\uDC70\uDC71\uDEF7\uDEF8]|\uD809[\uDC70-\uDC74]|\uD81A[\uDE6E\uDE6F\uDEF5\uDF37-\uDF3B\uDF44]|\uD81B[\uDE97-\uDE9A]|\uD82F\uDC9F|\uD836[\uDE87-\uDE8B]|\uD83A[\uDD5E\uDD5F]" # noqa: E501
+)
+
+
+# Currently without astral characters support.
+def isPunctChar(ch: str) -> bool:
+ """Check if character is a punctuation character."""
+ return UNICODE_PUNCT_RE.search(ch) is not None
+
+
+MD_ASCII_PUNCT = {
+ 0x21, # /* ! */
+ 0x22, # /* " */
+ 0x23, # /* # */
+ 0x24, # /* $ */
+ 0x25, # /* % */
+ 0x26, # /* & */
+ 0x27, # /* ' */
+ 0x28, # /* ( */
+ 0x29, # /* ) */
+ 0x2A, # /* * */
+ 0x2B, # /* + */
+ 0x2C, # /* , */
+ 0x2D, # /* - */
+ 0x2E, # /* . */
+ 0x2F, # /* / */
+ 0x3A, # /* : */
+ 0x3B, # /* ; */
+ 0x3C, # /* < */
+ 0x3D, # /* = */
+ 0x3E, # /* > */
+ 0x3F, # /* ? */
+ 0x40, # /* @ */
+ 0x5B, # /* [ */
+ 0x5C, # /* \ */
+ 0x5D, # /* ] */
+ 0x5E, # /* ^ */
+ 0x5F, # /* _ */
+ 0x60, # /* ` */
+ 0x7B, # /* { */
+ 0x7C, # /* | */
+ 0x7D, # /* } */
+ 0x7E, # /* ~ */
+}
+
+
+def isMdAsciiPunct(ch: int) -> bool:
+ """Markdown ASCII punctuation characters.
+
+ ::
+
+ !, ", #, $, %, &, ', (, ), *, +, ,, -, ., /, :, ;, <, =, >, ?, @, [, \\, ], ^, _, `, {, |, }, or ~
+
+ See http://spec.commonmark.org/0.15/#ascii-punctuation-character
+
+ Don't confuse with unicode punctuation !!! It lacks some chars in ascii range.
+
+ """ # noqa: E501
+ return ch in MD_ASCII_PUNCT
+
+
+def normalizeReference(string: str) -> str:
+ """Helper to unify [reference labels]."""
+ # Trim and collapse whitespace
+ #
+ string = re.sub(r"\s+", " ", string.strip())
+
+ # In node v10 'ẞ'.toLowerCase() === 'Ṿ', which is presumed to be a bug
+ # fixed in v12 (couldn't find any details).
+ #
+ # So treat this one as a special case
+ # (remove this when node v10 is no longer supported).
+ #
+ # if ('ẞ'.toLowerCase() === 'Ṿ') {
+ # str = str.replace(/ẞ/g, 'ß')
+ # }
+
+ # .toLowerCase().toUpperCase() should get rid of all differences
+ # between letter variants.
+ #
+ # Simple .toLowerCase() doesn't normalize 125 code points correctly,
+ # and .toUpperCase doesn't normalize 6 of them (list of exceptions:
+ # İ, ϴ, ẞ, Ω, K, Å - those are already uppercased, but have differently
+ # uppercased versions).
+ #
+ # Here's an example showing how it happens. Lets take greek letter omega:
+ # uppercase U+0398 (Θ), U+03f4 (ϴ) and lowercase U+03b8 (θ), U+03d1 (ϑ)
+ #
+ # Unicode entries:
+ # 0398;GREEK CAPITAL LETTER THETA;Lu;0;L;;;;;N;;;;03B8
+ # 03B8;GREEK SMALL LETTER THETA;Ll;0;L;;;;;N;;;0398;;0398
+ # 03D1;GREEK THETA SYMBOL;Ll;0;L; 03B8;;;;N;GREEK SMALL LETTER SCRIPT THETA;;0398;;0398
+ # 03F4;GREEK CAPITAL THETA SYMBOL;Lu;0;L; 0398;;;;N;;;;03B8
+ #
+ # Case-insensitive comparison should treat all of them as equivalent.
+ #
+ # But .toLowerCase() doesn't change ϑ (it's already lowercase),
+ # and .toUpperCase() doesn't change ϴ (already uppercase).
+ #
+ # Applying first lower then upper case normalizes any character:
+ # '\u0398\u03f4\u03b8\u03d1'.toLowerCase().toUpperCase() === '\u0398\u0398\u0398\u0398'
+ #
+ # Note: this is equivalent to unicode case folding; unicode normalization
+ # is a different step that is not required here.
+ #
+ # Final result should be uppercased, because it's later stored in an object
+ # (this avoid a conflict with Object.prototype members,
+ # most notably, `__proto__`)
+ #
+ return string.lower().upper()
+
+
+LINK_OPEN_RE = re.compile(r"^\s]", flags=re.IGNORECASE)
+LINK_CLOSE_RE = re.compile(r"^", flags=re.IGNORECASE)
+
+
+def isLinkOpen(string: str) -> bool:
+ return bool(LINK_OPEN_RE.search(string))
+
+
+def isLinkClose(string: str) -> bool:
+ return bool(LINK_CLOSE_RE.search(string))
diff --git a/third_party/python/markdown_it_py/markdown_it/helpers/__init__.py b/third_party/python/markdown_it_py/markdown_it/helpers/__init__.py
new file mode 100644
index 000000000000..3dbbdd1d480e
--- /dev/null
+++ b/third_party/python/markdown_it_py/markdown_it/helpers/__init__.py
@@ -0,0 +1,6 @@
+"""Functions for parsing Links
+"""
+__all__ = ("parseLinkLabel", "parseLinkDestination", "parseLinkTitle")
+from .parse_link_destination import parseLinkDestination
+from .parse_link_label import parseLinkLabel
+from .parse_link_title import parseLinkTitle
diff --git a/third_party/python/markdown_it_py/markdown_it/helpers/parse_link_destination.py b/third_party/python/markdown_it_py/markdown_it/helpers/parse_link_destination.py
new file mode 100644
index 000000000000..f42b2244db53
--- /dev/null
+++ b/third_party/python/markdown_it_py/markdown_it/helpers/parse_link_destination.py
@@ -0,0 +1,86 @@
+"""
+Parse link destination
+"""
+
+from ..common.utils import charCodeAt, unescapeAll
+
+
+class _Result:
+ __slots__ = ("ok", "pos", "lines", "str")
+
+ def __init__(self) -> None:
+ self.ok = False
+ self.pos = 0
+ self.lines = 0
+ self.str = ""
+
+
+def parseLinkDestination(string: str, pos: int, maximum: int) -> _Result:
+ lines = 0
+ start = pos
+ result = _Result()
+
+ if charCodeAt(string, pos) == 0x3C: # /* < */
+ pos += 1
+ while pos < maximum:
+ code = charCodeAt(string, pos)
+ if code == 0x0A: # /* \n */)
+ return result
+ if code == 0x3C: # / * < * /
+ return result
+ if code == 0x3E: # /* > */) {
+ result.pos = pos + 1
+ result.str = unescapeAll(string[start + 1 : pos])
+ result.ok = True
+ return result
+
+ if code == 0x5C and pos + 1 < maximum: # \
+ pos += 2
+ continue
+
+ pos += 1
+
+ # no closing '>'
+ return result
+
+ # this should be ... } else { ... branch
+
+ level = 0
+ while pos < maximum:
+ code = charCodeAt(string, pos)
+
+ if code is None or code == 0x20:
+ break
+
+ # ascii control characters
+ if code < 0x20 or code == 0x7F:
+ break
+
+ if code == 0x5C and pos + 1 < maximum:
+ if charCodeAt(string, pos + 1) == 0x20:
+ break
+ pos += 2
+ continue
+
+ if code == 0x28: # /* ( */)
+ level += 1
+ if level > 32:
+ return result
+
+ if code == 0x29: # /* ) */)
+ if level == 0:
+ break
+ level -= 1
+
+ pos += 1
+
+ if start == pos:
+ return result
+ if level != 0:
+ return result
+
+ result.str = unescapeAll(string[start:pos])
+ result.lines = lines
+ result.pos = pos
+ result.ok = True
+ return result
diff --git a/third_party/python/markdown_it_py/markdown_it/helpers/parse_link_label.py b/third_party/python/markdown_it_py/markdown_it/helpers/parse_link_label.py
new file mode 100644
index 000000000000..01c653c56be8
--- /dev/null
+++ b/third_party/python/markdown_it_py/markdown_it/helpers/parse_link_label.py
@@ -0,0 +1,43 @@
+"""
+Parse link label
+
+this function assumes that first character ("[") already matches
+returns the end of the label
+
+"""
+from markdown_it.rules_inline import StateInline
+
+
+def parseLinkLabel(state: StateInline, start: int, disableNested: bool = False) -> int:
+ labelEnd = -1
+ oldPos = state.pos
+ found = False
+
+ state.pos = start + 1
+ level = 1
+
+ while state.pos < state.posMax:
+ marker = state.src[state.pos]
+ if marker == "]":
+ level -= 1
+ if level == 0:
+ found = True
+ break
+
+ prevPos = state.pos
+ state.md.inline.skipToken(state)
+ if marker == "[":
+ if prevPos == state.pos - 1:
+ # increase level if we find text `[`,
+ # which is not a part of any token
+ level += 1
+ elif disableNested:
+ state.pos = oldPos
+ return -1
+ if found:
+ labelEnd = state.pos
+
+ # restore old state
+ state.pos = oldPos
+
+ return labelEnd
diff --git a/third_party/python/markdown_it_py/markdown_it/helpers/parse_link_title.py b/third_party/python/markdown_it_py/markdown_it/helpers/parse_link_title.py
new file mode 100644
index 000000000000..8f589336f60e
--- /dev/null
+++ b/third_party/python/markdown_it_py/markdown_it/helpers/parse_link_title.py
@@ -0,0 +1,60 @@
+"""Parse link title
+"""
+from ..common.utils import charCodeAt, unescapeAll
+
+
+class _Result:
+ __slots__ = ("ok", "pos", "lines", "str")
+
+ def __init__(self) -> None:
+ self.ok = False
+ self.pos = 0
+ self.lines = 0
+ self.str = ""
+
+ def __str__(self) -> str:
+ return self.str
+
+
+def parseLinkTitle(string: str, pos: int, maximum: int) -> _Result:
+ lines = 0
+ start = pos
+ result = _Result()
+
+ if pos >= maximum:
+ return result
+
+ marker = charCodeAt(string, pos)
+
+ # /* " */ /* ' */ /* ( */
+ if marker != 0x22 and marker != 0x27 and marker != 0x28:
+ return result
+
+ pos += 1
+
+ # if opening marker is "(", switch it to closing marker ")"
+ if marker == 0x28:
+ marker = 0x29
+
+ while pos < maximum:
+ code = charCodeAt(string, pos)
+ if code == marker:
+ title = string[start + 1 : pos]
+ title = unescapeAll(title)
+ result.pos = pos + 1
+ result.lines = lines
+ result.str = title
+ result.ok = True
+ return result
+ elif code == 0x28 and marker == 0x29: # /* ( */ /* ) */
+ return result
+ elif code == 0x0A:
+ lines += 1
+ elif code == 0x5C and pos + 1 < maximum: # /* \ */
+ pos += 1
+ if charCodeAt(string, pos) == 0x0A:
+ lines += 1
+
+ pos += 1
+
+ return result
diff --git a/third_party/python/markdown_it_py/markdown_it/main.py b/third_party/python/markdown_it_py/markdown_it/main.py
new file mode 100644
index 000000000000..bb294a990cc5
--- /dev/null
+++ b/third_party/python/markdown_it_py/markdown_it/main.py
@@ -0,0 +1,355 @@
+from __future__ import annotations
+
+from collections.abc import Callable, Generator, Iterable, Mapping, MutableMapping
+from contextlib import contextmanager
+from typing import Any, Literal, overload
+
+from . import helpers, presets
+from .common import normalize_url, utils
+from .parser_block import ParserBlock
+from .parser_core import ParserCore
+from .parser_inline import ParserInline
+from .renderer import RendererHTML, RendererProtocol
+from .rules_core.state_core import StateCore
+from .token import Token
+from .utils import EnvType, OptionsDict, OptionsType, PresetType
+
+try:
+ import linkify_it
+except ModuleNotFoundError:
+ linkify_it = None
+
+
+_PRESETS: dict[str, PresetType] = {
+ "default": presets.default.make(),
+ "js-default": presets.js_default.make(),
+ "zero": presets.zero.make(),
+ "commonmark": presets.commonmark.make(),
+ "gfm-like": presets.gfm_like.make(),
+}
+
+
+class MarkdownIt:
+ def __init__(
+ self,
+ config: str | PresetType = "commonmark",
+ options_update: Mapping[str, Any] | None = None,
+ *,
+ renderer_cls: Callable[[MarkdownIt], RendererProtocol] = RendererHTML,
+ ):
+ """Main parser class
+
+ :param config: name of configuration to load or a pre-defined dictionary
+ :param options_update: dictionary that will be merged into ``config["options"]``
+ :param renderer_cls: the class to load as the renderer:
+ ``self.renderer = renderer_cls(self)
+ """
+ # add modules
+ self.utils = utils
+ self.helpers = helpers
+
+ # initialise classes
+ self.inline = ParserInline()
+ self.block = ParserBlock()
+ self.core = ParserCore()
+ self.renderer = renderer_cls(self)
+ self.linkify = linkify_it.LinkifyIt() if linkify_it else None
+
+ # set the configuration
+ if options_update and not isinstance(options_update, Mapping):
+ # catch signature change where renderer_cls was not used as a key-word
+ raise TypeError(
+ f"options_update should be a mapping: {options_update}"
+ "\n(Perhaps you intended this to be the renderer_cls?)"
+ )
+ self.configure(config, options_update=options_update)
+
+ def __repr__(self) -> str:
+ return f"{self.__class__.__module__}.{self.__class__.__name__}()"
+
+ @overload
+ def __getitem__(self, name: Literal["inline"]) -> ParserInline:
+ ...
+
+ @overload
+ def __getitem__(self, name: Literal["block"]) -> ParserBlock:
+ ...
+
+ @overload
+ def __getitem__(self, name: Literal["core"]) -> ParserCore:
+ ...
+
+ @overload
+ def __getitem__(self, name: Literal["renderer"]) -> RendererProtocol:
+ ...
+
+ @overload
+ def __getitem__(self, name: str) -> Any:
+ ...
+
+ def __getitem__(self, name: str) -> Any:
+ return {
+ "inline": self.inline,
+ "block": self.block,
+ "core": self.core,
+ "renderer": self.renderer,
+ }[name]
+
+ def set(self, options: OptionsType) -> None:
+ """Set parser options (in the same format as in constructor).
+ Probably, you will never need it, but you can change options after constructor call.
+
+ __Note:__ To achieve the best possible performance, don't modify a
+ `markdown-it` instance options on the fly. If you need multiple configurations
+ it's best to create multiple instances and initialize each with separate config.
+ """
+ self.options = OptionsDict(options)
+
+ def configure(
+ self, presets: str | PresetType, options_update: Mapping[str, Any] | None = None
+ ) -> MarkdownIt:
+ """Batch load of all options and component settings.
+ This is an internal method, and you probably will not need it.
+ But if you will - see available presets and data structure
+ [here](https://github.com/markdown-it/markdown-it/tree/master/lib/presets)
+
+ We strongly recommend to use presets instead of direct config loads.
+ That will give better compatibility with next versions.
+ """
+ if isinstance(presets, str):
+ if presets not in _PRESETS:
+ raise KeyError(f"Wrong `markdown-it` preset '{presets}', check name")
+ config = _PRESETS[presets]
+ else:
+ config = presets
+
+ if not config:
+ raise ValueError("Wrong `markdown-it` config, can't be empty")
+
+ options = config.get("options", {}) or {}
+ if options_update:
+ options = {**options, **options_update} # type: ignore
+
+ self.set(options) # type: ignore
+
+ if "components" in config:
+ for name, component in config["components"].items():
+ rules = component.get("rules", None)
+ if rules:
+ self[name].ruler.enableOnly(rules)
+ rules2 = component.get("rules2", None)
+ if rules2:
+ self[name].ruler2.enableOnly(rules2)
+
+ return self
+
+ def get_all_rules(self) -> dict[str, list[str]]:
+ """Return the names of all active rules."""
+ rules = {
+ chain: self[chain].ruler.get_all_rules()
+ for chain in ["core", "block", "inline"]
+ }
+ rules["inline2"] = self.inline.ruler2.get_all_rules()
+ return rules
+
+ def get_active_rules(self) -> dict[str, list[str]]:
+ """Return the names of all active rules."""
+ rules = {
+ chain: self[chain].ruler.get_active_rules()
+ for chain in ["core", "block", "inline"]
+ }
+ rules["inline2"] = self.inline.ruler2.get_active_rules()
+ return rules
+
+ def enable(
+ self, names: str | Iterable[str], ignoreInvalid: bool = False
+ ) -> MarkdownIt:
+ """Enable list or rules. (chainable)
+
+ :param names: rule name or list of rule names to enable.
+ :param ignoreInvalid: set `true` to ignore errors when rule not found.
+
+ It will automatically find appropriate components,
+ containing rules with given names. If rule not found, and `ignoreInvalid`
+ not set - throws exception.
+
+ Example::
+
+ md = MarkdownIt().enable(['sub', 'sup']).disable('smartquotes')
+
+ """
+ result = []
+
+ if isinstance(names, str):
+ names = [names]
+
+ for chain in ["core", "block", "inline"]:
+ result.extend(self[chain].ruler.enable(names, True))
+ result.extend(self.inline.ruler2.enable(names, True))
+
+ missed = [name for name in names if name not in result]
+ if missed and not ignoreInvalid:
+ raise ValueError(f"MarkdownIt. Failed to enable unknown rule(s): {missed}")
+
+ return self
+
+ def disable(
+ self, names: str | Iterable[str], ignoreInvalid: bool = False
+ ) -> MarkdownIt:
+ """The same as [[MarkdownIt.enable]], but turn specified rules off. (chainable)
+
+ :param names: rule name or list of rule names to disable.
+ :param ignoreInvalid: set `true` to ignore errors when rule not found.
+
+ """
+ result = []
+
+ if isinstance(names, str):
+ names = [names]
+
+ for chain in ["core", "block", "inline"]:
+ result.extend(self[chain].ruler.disable(names, True))
+ result.extend(self.inline.ruler2.disable(names, True))
+
+ missed = [name for name in names if name not in result]
+ if missed and not ignoreInvalid:
+ raise ValueError(f"MarkdownIt. Failed to disable unknown rule(s): {missed}")
+ return self
+
+ @contextmanager
+ def reset_rules(self) -> Generator[None, None, None]:
+ """A context manager, that will reset the current enabled rules on exit."""
+ chain_rules = self.get_active_rules()
+ yield
+ for chain, rules in chain_rules.items():
+ if chain != "inline2":
+ self[chain].ruler.enableOnly(rules)
+ self.inline.ruler2.enableOnly(chain_rules["inline2"])
+
+ def add_render_rule(
+ self, name: str, function: Callable[..., Any], fmt: str = "html"
+ ) -> None:
+ """Add a rule for rendering a particular Token type.
+
+ Only applied when ``renderer.__output__ == fmt``
+ """
+ if self.renderer.__output__ == fmt:
+ self.renderer.rules[name] = function.__get__(self.renderer) # type: ignore
+
+ def use(
+ self, plugin: Callable[..., None], *params: Any, **options: Any
+ ) -> MarkdownIt:
+ """Load specified plugin with given params into current parser instance. (chainable)
+
+ It's just a sugar to call `plugin(md, params)` with curring.
+
+ Example::
+
+ def func(tokens, idx):
+ tokens[idx].content = tokens[idx].content.replace('foo', 'bar')
+ md = MarkdownIt().use(plugin, 'foo_replace', 'text', func)
+
+ """
+ plugin(self, *params, **options)
+ return self
+
+ def parse(self, src: str, env: EnvType | None = None) -> list[Token]:
+ """Parse the source string to a token stream
+
+ :param src: source string
+ :param env: environment sandbox
+
+ Parse input string and return list of block tokens (special token type
+ "inline" will contain list of inline tokens).
+
+ `env` is used to pass data between "distributed" rules and return additional
+ metadata like reference info, needed for the renderer. It also can be used to
+ inject data in specific cases. Usually, you will be ok to pass `{}`,
+ and then pass updated object to renderer.
+ """
+ env = {} if env is None else env
+ if not isinstance(env, MutableMapping):
+ raise TypeError(f"Input data should be a MutableMapping, not {type(env)}")
+ if not isinstance(src, str):
+ raise TypeError(f"Input data should be a string, not {type(src)}")
+ state = StateCore(src, self, env)
+ self.core.process(state)
+ return state.tokens
+
+ def render(self, src: str, env: EnvType | None = None) -> Any:
+ """Render markdown string into html. It does all magic for you :).
+
+ :param src: source string
+ :param env: environment sandbox
+ :returns: The output of the loaded renderer
+
+ `env` can be used to inject additional metadata (`{}` by default).
+ But you will not need it with high probability. See also comment
+ in [[MarkdownIt.parse]].
+ """
+ env = {} if env is None else env
+ return self.renderer.render(self.parse(src, env), self.options, env)
+
+ def parseInline(self, src: str, env: EnvType | None = None) -> list[Token]:
+ """The same as [[MarkdownIt.parse]] but skip all block rules.
+
+ :param src: source string
+ :param env: environment sandbox
+
+ It returns the
+ block tokens list with the single `inline` element, containing parsed inline
+ tokens in `children` property. Also updates `env` object.
+ """
+ env = {} if env is None else env
+ if not isinstance(env, MutableMapping):
+ raise TypeError(f"Input data should be an MutableMapping, not {type(env)}")
+ if not isinstance(src, str):
+ raise TypeError(f"Input data should be a string, not {type(src)}")
+ state = StateCore(src, self, env)
+ state.inlineMode = True
+ self.core.process(state)
+ return state.tokens
+
+ def renderInline(self, src: str, env: EnvType | None = None) -> Any:
+ """Similar to [[MarkdownIt.render]] but for single paragraph content.
+
+ :param src: source string
+ :param env: environment sandbox
+
+ Similar to [[MarkdownIt.render]] but for single paragraph content. Result
+ will NOT be wrapped into `` tags.
+ """
+ env = {} if env is None else env
+ return self.renderer.render(self.parseInline(src, env), self.options, env)
+
+ # link methods
+
+ def validateLink(self, url: str) -> bool:
+ """Validate if the URL link is allowed in output.
+
+ This validator can prohibit more than really needed to prevent XSS.
+ It's a tradeoff to keep code simple and to be secure by default.
+
+ Note: the url should be normalized at this point, and existing entities decoded.
+ """
+ return normalize_url.validateLink(url)
+
+ def normalizeLink(self, url: str) -> str:
+ """Normalize destination URLs in links
+
+ ::
+
+ [label]: destination 'title'
+ ^^^^^^^^^^^
+ """
+ return normalize_url.normalizeLink(url)
+
+ def normalizeLinkText(self, link: str) -> str:
+ """Normalize autolink content
+
+ ::
+
+
+ ~~~~~~~~~~~
+ """
+ return normalize_url.normalizeLinkText(link)
diff --git a/third_party/python/markdown_it_py/markdown_it/parser_block.py b/third_party/python/markdown_it_py/markdown_it/parser_block.py
new file mode 100644
index 000000000000..72360f9b31be
--- /dev/null
+++ b/third_party/python/markdown_it_py/markdown_it/parser_block.py
@@ -0,0 +1,111 @@
+"""Block-level tokenizer."""
+from __future__ import annotations
+
+import logging
+from typing import TYPE_CHECKING, Callable
+
+from . import rules_block
+from .ruler import Ruler
+from .rules_block.state_block import StateBlock
+from .token import Token
+from .utils import EnvType
+
+if TYPE_CHECKING:
+ from markdown_it import MarkdownIt
+
+LOGGER = logging.getLogger(__name__)
+
+
+RuleFuncBlockType = Callable[[StateBlock, int, int, bool], bool]
+"""(state: StateBlock, startLine: int, endLine: int, silent: bool) -> matched: bool)
+
+`silent` disables token generation, useful for lookahead.
+"""
+
+_rules: list[tuple[str, RuleFuncBlockType, list[str]]] = [
+ # First 2 params - rule name & source. Secondary array - list of rules,
+ # which can be terminated by this one.
+ ("table", rules_block.table, ["paragraph", "reference"]),
+ ("code", rules_block.code, []),
+ ("fence", rules_block.fence, ["paragraph", "reference", "blockquote", "list"]),
+ (
+ "blockquote",
+ rules_block.blockquote,
+ ["paragraph", "reference", "blockquote", "list"],
+ ),
+ ("hr", rules_block.hr, ["paragraph", "reference", "blockquote", "list"]),
+ ("list", rules_block.list_block, ["paragraph", "reference", "blockquote"]),
+ ("reference", rules_block.reference, []),
+ ("html_block", rules_block.html_block, ["paragraph", "reference", "blockquote"]),
+ ("heading", rules_block.heading, ["paragraph", "reference", "blockquote"]),
+ ("lheading", rules_block.lheading, []),
+ ("paragraph", rules_block.paragraph, []),
+]
+
+
+class ParserBlock:
+ """
+ ParserBlock#ruler -> Ruler
+
+ [[Ruler]] instance. Keep configuration of block rules.
+ """
+
+ def __init__(self) -> None:
+ self.ruler = Ruler[RuleFuncBlockType]()
+ for name, rule, alt in _rules:
+ self.ruler.push(name, rule, {"alt": alt})
+
+ def tokenize(self, state: StateBlock, startLine: int, endLine: int) -> None:
+ """Generate tokens for input range."""
+ rules = self.ruler.getRules("")
+ line = startLine
+ maxNesting = state.md.options.maxNesting
+ hasEmptyLines = False
+
+ while line < endLine:
+ state.line = line = state.skipEmptyLines(line)
+ if line >= endLine:
+ break
+ if state.sCount[line] < state.blkIndent:
+ # Termination condition for nested calls.
+ # Nested calls currently used for blockquotes & lists
+ break
+ if state.level >= maxNesting:
+ # If nesting level exceeded - skip tail to the end.
+ # That's not ordinary situation and we should not care about content.
+ state.line = endLine
+ break
+
+ # Try all possible rules.
+ # On success, rule should:
+ # - update `state.line`
+ # - update `state.tokens`
+ # - return True
+ for rule in rules:
+ if rule(state, line, endLine, False):
+ break
+
+ # set state.tight if we had an empty line before current tag
+ # i.e. latest empty line should not count
+ state.tight = not hasEmptyLines
+
+ line = state.line
+
+ # paragraph might "eat" one newline after it in nested lists
+ if (line - 1) < endLine and state.isEmpty(line - 1):
+ hasEmptyLines = True
+
+ if line < endLine and state.isEmpty(line):
+ hasEmptyLines = True
+ line += 1
+ state.line = line
+
+ def parse(
+ self, src: str, md: MarkdownIt, env: EnvType, outTokens: list[Token]
+ ) -> list[Token] | None:
+ """Process input string and push block tokens into `outTokens`."""
+ if not src:
+ return None
+ state = StateBlock(src, md, env, outTokens)
+ self.tokenize(state, state.line, state.lineMax)
+ return state.tokens
diff --git a/third_party/python/markdown_it_py/markdown_it/parser_core.py b/third_party/python/markdown_it_py/markdown_it/parser_core.py
new file mode 100644
index 000000000000..ca5ab2566ba5
--- /dev/null
+++ b/third_party/python/markdown_it_py/markdown_it/parser_core.py
@@ -0,0 +1,45 @@
+"""
+ * class Core
+ *
+ * Top-level rules executor. Glues block/inline parsers and does intermediate
+ * transformations.
+"""
+from __future__ import annotations
+
+from typing import Callable
+
+from .ruler import Ruler
+from .rules_core import (
+ block,
+ inline,
+ linkify,
+ normalize,
+ replace,
+ smartquotes,
+ text_join,
+)
+from .rules_core.state_core import StateCore
+
+RuleFuncCoreType = Callable[[StateCore], None]
+
+_rules: list[tuple[str, RuleFuncCoreType]] = [
+ ("normalize", normalize),
+ ("block", block),
+ ("inline", inline),
+ ("linkify", linkify),
+ ("replacements", replace),
+ ("smartquotes", smartquotes),
+ ("text_join", text_join),
+]
+
+
+class ParserCore:
+ def __init__(self) -> None:
+ self.ruler = Ruler[RuleFuncCoreType]()
+ for name, rule in _rules:
+ self.ruler.push(name, rule)
+
+ def process(self, state: StateCore) -> None:
+ """Executes core chain rules."""
+ for rule in self.ruler.getRules(""):
+ rule(state)
diff --git a/third_party/python/markdown_it_py/markdown_it/parser_inline.py b/third_party/python/markdown_it_py/markdown_it/parser_inline.py
new file mode 100644
index 000000000000..0026c3839d14
--- /dev/null
+++ b/third_party/python/markdown_it_py/markdown_it/parser_inline.py
@@ -0,0 +1,147 @@
+"""Tokenizes paragraph content.
+"""
+from __future__ import annotations
+
+from typing import TYPE_CHECKING, Callable
+
+from . import rules_inline
+from .ruler import Ruler
+from .rules_inline.state_inline import StateInline
+from .token import Token
+from .utils import EnvType
+
+if TYPE_CHECKING:
+ from markdown_it import MarkdownIt
+
+
+# Parser rules
+RuleFuncInlineType = Callable[[StateInline, bool], bool]
+"""(state: StateInline, silent: bool) -> matched: bool)
+
+`silent` disables token generation, useful for lookahead.
+"""
+_rules: list[tuple[str, RuleFuncInlineType]] = [
+ ("text", rules_inline.text),
+ ("linkify", rules_inline.linkify),
+ ("newline", rules_inline.newline),
+ ("escape", rules_inline.escape),
+ ("backticks", rules_inline.backtick),
+ ("strikethrough", rules_inline.strikethrough.tokenize),
+ ("emphasis", rules_inline.emphasis.tokenize),
+ ("link", rules_inline.link),
+ ("image", rules_inline.image),
+ ("autolink", rules_inline.autolink),
+ ("html_inline", rules_inline.html_inline),
+ ("entity", rules_inline.entity),
+]
+
+# Note `rule2` ruleset was created specifically for emphasis/strikethrough
+# post-processing and may be changed in the future.
+#
+# Don't use this for anything except pairs (plugins working with `balance_pairs`).
+#
+RuleFuncInline2Type = Callable[[StateInline], None]
+_rules2: list[tuple[str, RuleFuncInline2Type]] = [
+ ("balance_pairs", rules_inline.link_pairs),
+ ("strikethrough", rules_inline.strikethrough.postProcess),
+ ("emphasis", rules_inline.emphasis.postProcess),
+ # rules for pairs separate '**' into its own text tokens, which may be left unused,
+ # rule below merges unused segments back with the rest of the text
+ ("fragments_join", rules_inline.fragments_join),
+]
+
+
+class ParserInline:
+ def __init__(self) -> None:
+ self.ruler = Ruler[RuleFuncInlineType]()
+ for name, rule in _rules:
+ self.ruler.push(name, rule)
+ # Second ruler used for post-processing (e.g. in emphasis-like rules)
+ self.ruler2 = Ruler[RuleFuncInline2Type]()
+ for name, rule2 in _rules2:
+ self.ruler2.push(name, rule2)
+
+ def skipToken(self, state: StateInline) -> None:
+ """Skip single token by running all rules in validation mode;
+ returns `True` if any rule reported success
+ """
+ ok = False
+ pos = state.pos
+ rules = self.ruler.getRules("")
+ maxNesting = state.md.options["maxNesting"]
+ cache = state.cache
+
+ if pos in cache:
+ state.pos = cache[pos]
+ return
+
+ if state.level < maxNesting:
+ for rule in rules:
+ # Increment state.level and decrement it later to limit recursion.
+ # It's harmless to do here, because no tokens are created.
+ # But ideally, we'd need a separate private state variable for this purpose.
+ state.level += 1
+ ok = rule(state, True)
+ state.level -= 1
+ if ok:
+ break
+ else:
+ # Too much nesting, just skip until the end of the paragraph.
+ #
+ # NOTE: this will cause links to behave incorrectly in the following case,
+ # when an amount of `[` is exactly equal to `maxNesting + 1`:
+ #
+ # [[[[[[[[[[[[[[[[[[[[[foo]()
+ #
+ # TODO: remove this workaround when CM standard will allow nested links
+ # (we can replace it by preventing links from being parsed in
+ # validation mode)
+ #
+ state.pos = state.posMax
+
+ if not ok:
+ state.pos += 1
+ cache[pos] = state.pos
+
+ def tokenize(self, state: StateInline) -> None:
+ """Generate tokens for input range."""
+ ok = False
+ rules = self.ruler.getRules("")
+ end = state.posMax
+ maxNesting = state.md.options["maxNesting"]
+
+ while state.pos < end:
+ # Try all possible rules.
+ # On success, rule should:
+ #
+ # - update `state.pos`
+ # - update `state.tokens`
+ # - return true
+
+ if state.level < maxNesting:
+ for rule in rules:
+ ok = rule(state, False)
+ if ok:
+ break
+
+ if ok:
+ if state.pos >= end:
+ break
+ continue
+
+ state.pending += state.src[state.pos]
+ state.pos += 1
+
+ if state.pending:
+ state.pushPending()
+
+ def parse(
+ self, src: str, md: MarkdownIt, env: EnvType, tokens: list[Token]
+ ) -> list[Token]:
+ """Process input string and push inline tokens into `tokens`"""
+ state = StateInline(src, md, env, tokens)
+ self.tokenize(state)
+ rules2 = self.ruler2.getRules("")
+ for rule in rules2:
+ rule(state)
+ return state.tokens
diff --git a/third_party/python/markdown_it_py/markdown_it/port.yaml b/third_party/python/markdown_it_py/markdown_it/port.yaml
new file mode 100644
index 000000000000..3e289e9e27d5
--- /dev/null
+++ b/third_party/python/markdown_it_py/markdown_it/port.yaml
@@ -0,0 +1,48 @@
+- package: markdown-it/markdown-it
+ version: 13.0.1
+ commit: e843acc9edad115cbf8cf85e676443f01658be08
+ date: May 3, 2022
+ notes:
+ - Rename variables that use python built-in names, e.g.
+ - `max` -> `maximum`
+ - `len` -> `length`
+ - `str` -> `string`
+ - |
+ Convert JS `for` loops to `while` loops
+ this is generally the main difference between the codes,
+ because in python you can't do e.g. `for {i=1;i PresetType:
+ config = commonmark.make()
+ config["components"]["core"]["rules"].append("linkify")
+ config["components"]["block"]["rules"].append("table")
+ config["components"]["inline"]["rules"].extend(["strikethrough", "linkify"])
+ config["components"]["inline"]["rules2"].append("strikethrough")
+ config["options"]["linkify"] = True
+ config["options"]["html"] = True
+ return config
diff --git a/third_party/python/markdown_it_py/markdown_it/presets/commonmark.py b/third_party/python/markdown_it_py/markdown_it/presets/commonmark.py
new file mode 100644
index 000000000000..3990d4344aeb
--- /dev/null
+++ b/third_party/python/markdown_it_py/markdown_it/presets/commonmark.py
@@ -0,0 +1,74 @@
+"""Commonmark default options.
+
+This differs to presets.default,
+primarily in that it allows HTML and does not enable components:
+
+- block: table
+- inline: strikethrough
+"""
+from ..utils import PresetType
+
+
+def make() -> PresetType:
+ return {
+ "options": {
+ "maxNesting": 20, # Internal protection, recursion limit
+ "html": True, # Enable HTML tags in source,
+ # this is just a shorthand for .enable(["html_inline", "html_block"])
+ # used by the linkify rule:
+ "linkify": False, # autoconvert URL-like texts to links
+ # used by the replacements and smartquotes rules
+ # Enable some language-neutral replacements + quotes beautification
+ "typographer": False,
+ # used by the smartquotes rule:
+ # Double + single quotes replacement pairs, when typographer enabled,
+ # and smartquotes on. Could be either a String or an Array.
+ #
+ # For example, you can use '«»„“' for Russian, '„“‚‘' for German,
+ # and ['«\xA0', '\xA0»', '‹\xA0', '\xA0›'] for French (including nbsp).
+ "quotes": "\u201c\u201d\u2018\u2019", # /* “”‘’ */
+ # Renderer specific; these options are used directly in the HTML renderer
+ "xhtmlOut": True, # Use '/' to close single tags (
)
+ "breaks": False, # Convert '\n' in paragraphs into
+ "langPrefix": "language-", # CSS language prefix for fenced blocks
+ # Highlighter function. Should return escaped HTML,
+ # or '' if the source string is not changed and should be escaped externally.
+ # If result starts with PresetType:
+ return {
+ "options": {
+ "maxNesting": 100, # Internal protection, recursion limit
+ "html": False, # Enable HTML tags in source
+ # this is just a shorthand for .disable(["html_inline", "html_block"])
+ # used by the linkify rule:
+ "linkify": False, # autoconvert URL-like texts to links
+ # used by the replacements and smartquotes rules:
+ # Enable some language-neutral replacements + quotes beautification
+ "typographer": False,
+ # used by the smartquotes rule:
+ # Double + single quotes replacement pairs, when typographer enabled,
+ # and smartquotes on. Could be either a String or an Array.
+ # For example, you can use '«»„“' for Russian, '„“‚‘' for German,
+ # and ['«\xA0', '\xA0»', '‹\xA0', '\xA0›'] for French (including nbsp).
+ "quotes": "\u201c\u201d\u2018\u2019", # /* “”‘’ */
+ # Renderer specific; these options are used directly in the HTML renderer
+ "xhtmlOut": False, # Use '/' to close single tags (
)
+ "breaks": False, # Convert '\n' in paragraphs into
+ "langPrefix": "language-", # CSS language prefix for fenced blocks
+ # Highlighter function. Should return escaped HTML,
+ # or '' if the source string is not changed and should be escaped externally.
+ # If result starts with PresetType:
+ return {
+ "options": {
+ "maxNesting": 20, # Internal protection, recursion limit
+ "html": False, # Enable HTML tags in source
+ # this is just a shorthand for .disable(["html_inline", "html_block"])
+ # used by the linkify rule:
+ "linkify": False, # autoconvert URL-like texts to links
+ # used by the replacements and smartquotes rules:
+ # Enable some language-neutral replacements + quotes beautification
+ "typographer": False,
+ # used by the smartquotes rule:
+ # Double + single quotes replacement pairs, when typographer enabled,
+ # and smartquotes on. Could be either a String or an Array.
+ # For example, you can use '«»„“' for Russian, '„“‚‘' for German,
+ # and ['«\xA0', '\xA0»', '‹\xA0', '\xA0›'] for French (including nbsp).
+ "quotes": "\u201c\u201d\u2018\u2019", # /* “”‘’ */
+ # Renderer specific; these options are used directly in the HTML renderer
+ "xhtmlOut": False, # Use '/' to close single tags (
)
+ "breaks": False, # Convert '\n' in paragraphs into
+ "langPrefix": "language-", # CSS language prefix for fenced blocks
+ # Highlighter function. Should return escaped HTML,
+ # or '' if the source string is not changed and should be escaped externally.
+ # If result starts with Any:
+ ...
+
+
+class RendererHTML(RendererProtocol):
+ """Contains render rules for tokens. Can be updated and extended.
+
+ Example:
+
+ Each rule is called as independent static function with fixed signature:
+
+ ::
+
+ class Renderer:
+ def token_type_name(self, tokens, idx, options, env) {
+ # ...
+ return renderedHTML
+
+ ::
+
+ class CustomRenderer(RendererHTML):
+ def strong_open(self, tokens, idx, options, env):
+ return ''
+ def strong_close(self, tokens, idx, options, env):
+ return ''
+
+ md = MarkdownIt(renderer_cls=CustomRenderer)
+
+ result = md.render(...)
+
+ See https://github.com/markdown-it/markdown-it/blob/master/lib/renderer.js
+ for more details and examples.
+ """
+
+ __output__ = "html"
+
+ def __init__(self, parser: Any = None):
+ self.rules = {
+ k: v
+ for k, v in inspect.getmembers(self, predicate=inspect.ismethod)
+ if not (k.startswith("render") or k.startswith("_"))
+ }
+
+ def render(
+ self, tokens: Sequence[Token], options: OptionsDict, env: EnvType
+ ) -> str:
+ """Takes token stream and generates HTML.
+
+ :param tokens: list on block tokens to render
+ :param options: params of parser instance
+ :param env: additional data from parsed input
+
+ """
+ result = ""
+
+ for i, token in enumerate(tokens):
+ if token.type == "inline":
+ if token.children:
+ result += self.renderInline(token.children, options, env)
+ elif token.type in self.rules:
+ result += self.rules[token.type](tokens, i, options, env)
+ else:
+ result += self.renderToken(tokens, i, options, env)
+
+ return result
+
+ def renderInline(
+ self, tokens: Sequence[Token], options: OptionsDict, env: EnvType
+ ) -> str:
+ """The same as ``render``, but for single token of `inline` type.
+
+ :param tokens: list on block tokens to render
+ :param options: params of parser instance
+ :param env: additional data from parsed input (references, for example)
+ """
+ result = ""
+
+ for i, token in enumerate(tokens):
+ if token.type in self.rules:
+ result += self.rules[token.type](tokens, i, options, env)
+ else:
+ result += self.renderToken(tokens, i, options, env)
+
+ return result
+
+ def renderToken(
+ self,
+ tokens: Sequence[Token],
+ idx: int,
+ options: OptionsDict,
+ env: EnvType,
+ ) -> str:
+ """Default token renderer.
+
+ Can be overridden by custom function
+
+ :param idx: token index to render
+ :param options: params of parser instance
+ """
+ result = ""
+ needLf = False
+ token = tokens[idx]
+
+ # Tight list paragraphs
+ if token.hidden:
+ return ""
+
+ # Insert a newline between hidden paragraph and subsequent opening
+ # block-level tag.
+ #
+ # For example, here we should insert a newline before blockquote:
+ # - a
+ # >
+ #
+ if token.block and token.nesting != -1 and idx and tokens[idx - 1].hidden:
+ result += "\n"
+
+ # Add token name, e.g. `
`.
+ #
+ needLf = False
+
+ result += ">\n" if needLf else ">"
+
+ return result
+
+ @staticmethod
+ def renderAttrs(token: Token) -> str:
+ """Render token attributes to string."""
+ result = ""
+
+ for key, value in token.attrItems():
+ result += " " + escapeHtml(key) + '="' + escapeHtml(str(value)) + '"'
+
+ return result
+
+ def renderInlineAsText(
+ self,
+ tokens: Sequence[Token] | None,
+ options: OptionsDict,
+ env: EnvType,
+ ) -> str:
+ """Special kludge for image `alt` attributes to conform CommonMark spec.
+
+ Don't try to use it! Spec requires to show `alt` content with stripped markup,
+ instead of simple escaping.
+
+ :param tokens: list on block tokens to render
+ :param options: params of parser instance
+ :param env: additional data from parsed input
+ """
+ result = ""
+
+ for token in tokens or []:
+ if token.type == "text":
+ result += token.content
+ elif token.type == "image":
+ if token.children:
+ result += self.renderInlineAsText(token.children, options, env)
+ elif token.type == "softbreak":
+ result += "\n"
+
+ return result
+
+ ###################################################
+
+ def code_inline(
+ self, tokens: Sequence[Token], idx: int, options: OptionsDict, env: EnvType
+ ) -> str:
+ token = tokens[idx]
+ return (
+ ""
+ + escapeHtml(tokens[idx].content)
+ + ""
+ )
+
+ def code_block(
+ self,
+ tokens: Sequence[Token],
+ idx: int,
+ options: OptionsDict,
+ env: EnvType,
+ ) -> str:
+ token = tokens[idx]
+
+ return (
+ ""
+ + escapeHtml(tokens[idx].content)
+ + "
\n"
+ )
+
+ def fence(
+ self,
+ tokens: Sequence[Token],
+ idx: int,
+ options: OptionsDict,
+ env: EnvType,
+ ) -> str:
+ token = tokens[idx]
+ info = unescapeAll(token.info).strip() if token.info else ""
+ langName = ""
+ langAttrs = ""
+
+ if info:
+ arr = info.split(maxsplit=1)
+ langName = arr[0]
+ if len(arr) == 2:
+ langAttrs = arr[1]
+
+ if options.highlight:
+ highlighted = options.highlight(
+ token.content, langName, langAttrs
+ ) or escapeHtml(token.content)
+ else:
+ highlighted = escapeHtml(token.content)
+
+ if highlighted.startswith(""
+ + highlighted
+ + "
\n"
+ )
+
+ return (
+ ""
+ + highlighted
+ + "
\n"
+ )
+
+ def image(
+ self,
+ tokens: Sequence[Token],
+ idx: int,
+ options: OptionsDict,
+ env: EnvType,
+ ) -> str:
+ token = tokens[idx]
+
+ # "alt" attr MUST be set, even if empty. Because it's mandatory and
+ # should be placed on proper position for tests.
+ if token.children:
+ token.attrSet("alt", self.renderInlineAsText(token.children, options, env))
+ else:
+ token.attrSet("alt", "")
+
+ return self.renderToken(tokens, idx, options, env)
+
+ def hardbreak(
+ self, tokens: Sequence[Token], idx: int, options: OptionsDict, env: EnvType
+ ) -> str:
+ return "
\n" if options.xhtmlOut else "
\n"
+
+ def softbreak(
+ self, tokens: Sequence[Token], idx: int, options: OptionsDict, env: EnvType
+ ) -> str:
+ return (
+ ("
\n" if options.xhtmlOut else "
\n") if options.breaks else "\n"
+ )
+
+ def text(
+ self, tokens: Sequence[Token], idx: int, options: OptionsDict, env: EnvType
+ ) -> str:
+ return escapeHtml(tokens[idx].content)
+
+ def html_block(
+ self, tokens: Sequence[Token], idx: int, options: OptionsDict, env: EnvType
+ ) -> str:
+ return tokens[idx].content
+
+ def html_inline(
+ self, tokens: Sequence[Token], idx: int, options: OptionsDict, env: EnvType
+ ) -> str:
+ return tokens[idx].content
diff --git a/third_party/python/markdown_it_py/markdown_it/ruler.py b/third_party/python/markdown_it_py/markdown_it/ruler.py
new file mode 100644
index 000000000000..bd8baba34e69
--- /dev/null
+++ b/third_party/python/markdown_it_py/markdown_it/ruler.py
@@ -0,0 +1,276 @@
+"""
+class Ruler
+
+Helper class, used by [[MarkdownIt#core]], [[MarkdownIt#block]] and
+[[MarkdownIt#inline]] to manage sequences of functions (rules):
+
+- keep rules in defined order
+- assign the name to each rule
+- enable/disable rules
+- add/replace rules
+- allow assign rules to additional named chains (in the same)
+- caching lists of active rules
+
+You will not need use this class directly until write plugins. For simple
+rules control use [[MarkdownIt.disable]], [[MarkdownIt.enable]] and
+[[MarkdownIt.use]].
+"""
+from __future__ import annotations
+
+from collections.abc import Iterable
+from dataclasses import dataclass, field
+from typing import TYPE_CHECKING, Generic, TypedDict, TypeVar
+import warnings
+
+from markdown_it._compat import DATACLASS_KWARGS
+
+from .utils import EnvType
+
+if TYPE_CHECKING:
+ from markdown_it import MarkdownIt
+
+
+class StateBase:
+ def __init__(self, src: str, md: MarkdownIt, env: EnvType):
+ self.src = src
+ self.env = env
+ self.md = md
+
+ @property
+ def src(self) -> str:
+ return self._src
+
+ @src.setter
+ def src(self, value: str) -> None:
+ self._src = value
+ self._srcCharCode: tuple[int, ...] | None = None
+
+ @property
+ def srcCharCode(self) -> tuple[int, ...]:
+ warnings.warn(
+ "StateBase.srcCharCode is deprecated. Use StateBase.src instead.",
+ DeprecationWarning,
+ stacklevel=2,
+ )
+ if self._srcCharCode is None:
+ self._srcCharCode = tuple(ord(c) for c in self._src)
+ return self._srcCharCode
+
+
+class RuleOptionsType(TypedDict, total=False):
+ alt: list[str]
+
+
+RuleFuncTv = TypeVar("RuleFuncTv")
+"""A rule function, whose signature is dependent on the state type."""
+
+
+@dataclass(**DATACLASS_KWARGS)
+class Rule(Generic[RuleFuncTv]):
+ name: str
+ enabled: bool
+ fn: RuleFuncTv = field(repr=False)
+ alt: list[str]
+
+
+class Ruler(Generic[RuleFuncTv]):
+ def __init__(self) -> None:
+ # List of added rules.
+ self.__rules__: list[Rule[RuleFuncTv]] = []
+ # Cached rule chains.
+ # First level - chain name, '' for default.
+ # Second level - diginal anchor for fast filtering by charcodes.
+ self.__cache__: dict[str, list[RuleFuncTv]] | None = None
+
+ def __find__(self, name: str) -> int:
+ """Find rule index by name"""
+ for i, rule in enumerate(self.__rules__):
+ if rule.name == name:
+ return i
+ return -1
+
+ def __compile__(self) -> None:
+ """Build rules lookup cache"""
+ chains = {""}
+ # collect unique names
+ for rule in self.__rules__:
+ if not rule.enabled:
+ continue
+ for name in rule.alt:
+ chains.add(name)
+ self.__cache__ = {}
+ for chain in chains:
+ self.__cache__[chain] = []
+ for rule in self.__rules__:
+ if not rule.enabled:
+ continue
+ if chain and (chain not in rule.alt):
+ continue
+ self.__cache__[chain].append(rule.fn)
+
+ def at(
+ self, ruleName: str, fn: RuleFuncTv, options: RuleOptionsType | None = None
+ ) -> None:
+ """Replace rule by name with new function & options.
+
+ :param ruleName: rule name to replace.
+ :param fn: new rule function.
+ :param options: new rule options (not mandatory).
+ :raises: KeyError if name not found
+ """
+ index = self.__find__(ruleName)
+ options = options or {}
+ if index == -1:
+ raise KeyError(f"Parser rule not found: {ruleName}")
+ self.__rules__[index].fn = fn
+ self.__rules__[index].alt = options.get("alt", [])
+ self.__cache__ = None
+
+ def before(
+ self,
+ beforeName: str,
+ ruleName: str,
+ fn: RuleFuncTv,
+ options: RuleOptionsType | None = None,
+ ) -> None:
+ """Add new rule to chain before one with given name.
+
+ :param beforeName: new rule will be added before this one.
+ :param ruleName: new rule will be added before this one.
+ :param fn: new rule function.
+ :param options: new rule options (not mandatory).
+ :raises: KeyError if name not found
+ """
+ index = self.__find__(beforeName)
+ options = options or {}
+ if index == -1:
+ raise KeyError(f"Parser rule not found: {beforeName}")
+ self.__rules__.insert(
+ index, Rule[RuleFuncTv](ruleName, True, fn, options.get("alt", []))
+ )
+ self.__cache__ = None
+
+ def after(
+ self,
+ afterName: str,
+ ruleName: str,
+ fn: RuleFuncTv,
+ options: RuleOptionsType | None = None,
+ ) -> None:
+ """Add new rule to chain after one with given name.
+
+ :param afterName: new rule will be added after this one.
+ :param ruleName: new rule will be added after this one.
+ :param fn: new rule function.
+ :param options: new rule options (not mandatory).
+ :raises: KeyError if name not found
+ """
+ index = self.__find__(afterName)
+ options = options or {}
+ if index == -1:
+ raise KeyError(f"Parser rule not found: {afterName}")
+ self.__rules__.insert(
+ index + 1, Rule[RuleFuncTv](ruleName, True, fn, options.get("alt", []))
+ )
+ self.__cache__ = None
+
+ def push(
+ self, ruleName: str, fn: RuleFuncTv, options: RuleOptionsType | None = None
+ ) -> None:
+ """Push new rule to the end of chain.
+
+ :param ruleName: new rule will be added to the end of chain.
+ :param fn: new rule function.
+ :param options: new rule options (not mandatory).
+
+ """
+ self.__rules__.append(
+ Rule[RuleFuncTv](ruleName, True, fn, (options or {}).get("alt", []))
+ )
+ self.__cache__ = None
+
+ def enable(
+ self, names: str | Iterable[str], ignoreInvalid: bool = False
+ ) -> list[str]:
+ """Enable rules with given names.
+
+ :param names: name or list of rule names to enable.
+ :param ignoreInvalid: ignore errors when rule not found
+ :raises: KeyError if name not found and not ignoreInvalid
+ :return: list of found rule names
+ """
+ if isinstance(names, str):
+ names = [names]
+ result: list[str] = []
+ for name in names:
+ idx = self.__find__(name)
+ if (idx < 0) and ignoreInvalid:
+ continue
+ if (idx < 0) and not ignoreInvalid:
+ raise KeyError(f"Rules manager: invalid rule name {name}")
+ self.__rules__[idx].enabled = True
+ result.append(name)
+ self.__cache__ = None
+ return result
+
+ def enableOnly(
+ self, names: str | Iterable[str], ignoreInvalid: bool = False
+ ) -> list[str]:
+ """Enable rules with given names, and disable everything else.
+
+ :param names: name or list of rule names to enable.
+ :param ignoreInvalid: ignore errors when rule not found
+ :raises: KeyError if name not found and not ignoreInvalid
+ :return: list of found rule names
+ """
+ if isinstance(names, str):
+ names = [names]
+ for rule in self.__rules__:
+ rule.enabled = False
+ return self.enable(names, ignoreInvalid)
+
+ def disable(
+ self, names: str | Iterable[str], ignoreInvalid: bool = False
+ ) -> list[str]:
+ """Disable rules with given names.
+
+ :param names: name or list of rule names to enable.
+ :param ignoreInvalid: ignore errors when rule not found
+ :raises: KeyError if name not found and not ignoreInvalid
+ :return: list of found rule names
+ """
+ if isinstance(names, str):
+ names = [names]
+ result = []
+ for name in names:
+ idx = self.__find__(name)
+ if (idx < 0) and ignoreInvalid:
+ continue
+ if (idx < 0) and not ignoreInvalid:
+ raise KeyError(f"Rules manager: invalid rule name {name}")
+ self.__rules__[idx].enabled = False
+ result.append(name)
+ self.__cache__ = None
+ return result
+
+ def getRules(self, chainName: str = "") -> list[RuleFuncTv]:
+ """Return array of active functions (rules) for given chain name.
+ It analyzes rules configuration, compiles caches if not exists and returns result.
+
+ Default chain name is `''` (empty string). It can't be skipped.
+ That's done intentionally, to keep signature monomorphic for high speed.
+
+ """
+ if self.__cache__ is None:
+ self.__compile__()
+ assert self.__cache__ is not None
+ # Chain can be empty, if rules disabled. But we still have to return Array.
+ return self.__cache__.get(chainName, []) or []
+
+ def get_all_rules(self) -> list[str]:
+ """Return all available rule names."""
+ return [r.name for r in self.__rules__]
+
+ def get_active_rules(self) -> list[str]:
+ """Return the active rule names."""
+ return [r.name for r in self.__rules__ if r.enabled]
diff --git a/third_party/python/markdown_it_py/markdown_it/rules_block/__init__.py b/third_party/python/markdown_it_py/markdown_it/rules_block/__init__.py
new file mode 100644
index 000000000000..bcf138df9098
--- /dev/null
+++ b/third_party/python/markdown_it_py/markdown_it/rules_block/__init__.py
@@ -0,0 +1,27 @@
+__all__ = (
+ "StateBlock",
+ "paragraph",
+ "heading",
+ "lheading",
+ "code",
+ "fence",
+ "hr",
+ "list_block",
+ "reference",
+ "blockquote",
+ "html_block",
+ "table",
+)
+
+from .blockquote import blockquote
+from .code import code
+from .fence import fence
+from .heading import heading
+from .hr import hr
+from .html_block import html_block
+from .lheading import lheading
+from .list import list_block
+from .paragraph import paragraph
+from .reference import reference
+from .state_block import StateBlock
+from .table import table
diff --git a/third_party/python/markdown_it_py/markdown_it/rules_block/blockquote.py b/third_party/python/markdown_it_py/markdown_it/rules_block/blockquote.py
new file mode 100644
index 000000000000..0c9081b9cbd4
--- /dev/null
+++ b/third_party/python/markdown_it_py/markdown_it/rules_block/blockquote.py
@@ -0,0 +1,299 @@
+# Block quotes
+from __future__ import annotations
+
+import logging
+
+from ..common.utils import isStrSpace
+from .state_block import StateBlock
+
+LOGGER = logging.getLogger(__name__)
+
+
+def blockquote(state: StateBlock, startLine: int, endLine: int, silent: bool) -> bool:
+ LOGGER.debug(
+ "entering blockquote: %s, %s, %s, %s", state, startLine, endLine, silent
+ )
+
+ oldLineMax = state.lineMax
+ pos = state.bMarks[startLine] + state.tShift[startLine]
+ max = state.eMarks[startLine]
+
+ if state.is_code_block(startLine):
+ return False
+
+ # check the block quote marker
+ try:
+ if state.src[pos] != ">":
+ return False
+ except IndexError:
+ return False
+ pos += 1
+
+ # we know that it's going to be a valid blockquote,
+ # so no point trying to find the end of it in silent mode
+ if silent:
+ return True
+
+ # set offset past spaces and ">"
+ initial = offset = state.sCount[startLine] + 1
+
+ try:
+ second_char: str | None = state.src[pos]
+ except IndexError:
+ second_char = None
+
+ # skip one optional space after '>'
+ if second_char == " ":
+ # ' > test '
+ # ^ -- position start of line here:
+ pos += 1
+ initial += 1
+ offset += 1
+ adjustTab = False
+ spaceAfterMarker = True
+ elif second_char == "\t":
+ spaceAfterMarker = True
+
+ if (state.bsCount[startLine] + offset) % 4 == 3:
+ # ' >\t test '
+ # ^ -- position start of line here (tab has width==1)
+ pos += 1
+ initial += 1
+ offset += 1
+ adjustTab = False
+ else:
+ # ' >\t test '
+ # ^ -- position start of line here + shift bsCount slightly
+ # to make extra space appear
+ adjustTab = True
+
+ else:
+ spaceAfterMarker = False
+
+ oldBMarks = [state.bMarks[startLine]]
+ state.bMarks[startLine] = pos
+
+ while pos < max:
+ ch = state.src[pos]
+
+ if isStrSpace(ch):
+ if ch == "\t":
+ offset += (
+ 4
+ - (offset + state.bsCount[startLine] + (1 if adjustTab else 0)) % 4
+ )
+ else:
+ offset += 1
+
+ else:
+ break
+
+ pos += 1
+
+ oldBSCount = [state.bsCount[startLine]]
+ state.bsCount[startLine] = (
+ state.sCount[startLine] + 1 + (1 if spaceAfterMarker else 0)
+ )
+
+ lastLineEmpty = pos >= max
+
+ oldSCount = [state.sCount[startLine]]
+ state.sCount[startLine] = offset - initial
+
+ oldTShift = [state.tShift[startLine]]
+ state.tShift[startLine] = pos - state.bMarks[startLine]
+
+ terminatorRules = state.md.block.ruler.getRules("blockquote")
+
+ oldParentType = state.parentType
+ state.parentType = "blockquote"
+
+ # Search the end of the block
+ #
+ # Block ends with either:
+ # 1. an empty line outside:
+ # ```
+ # > test
+ #
+ # ```
+ # 2. an empty line inside:
+ # ```
+ # >
+ # test
+ # ```
+ # 3. another tag:
+ # ```
+ # > test
+ # - - -
+ # ```
+
+ # for (nextLine = startLine + 1; nextLine < endLine; nextLine++) {
+ nextLine = startLine + 1
+ while nextLine < endLine:
+ # check if it's outdented, i.e. it's inside list item and indented
+ # less than said list item:
+ #
+ # ```
+ # 1. anything
+ # > current blockquote
+ # 2. checking this line
+ # ```
+ isOutdented = state.sCount[nextLine] < state.blkIndent
+
+ pos = state.bMarks[nextLine] + state.tShift[nextLine]
+ max = state.eMarks[nextLine]
+
+ if pos >= max:
+ # Case 1: line is not inside the blockquote, and this line is empty.
+ break
+
+ evaluatesTrue = state.src[pos] == ">" and not isOutdented
+ pos += 1
+ if evaluatesTrue:
+ # This line is inside the blockquote.
+
+ # set offset past spaces and ">"
+ initial = offset = state.sCount[nextLine] + 1
+
+ try:
+ next_char: str | None = state.src[pos]
+ except IndexError:
+ next_char = None
+
+ # skip one optional space after '>'
+ if next_char == " ":
+ # ' > test '
+ # ^ -- position start of line here:
+ pos += 1
+ initial += 1
+ offset += 1
+ adjustTab = False
+ spaceAfterMarker = True
+ elif next_char == "\t":
+ spaceAfterMarker = True
+
+ if (state.bsCount[nextLine] + offset) % 4 == 3:
+ # ' >\t test '
+ # ^ -- position start of line here (tab has width==1)
+ pos += 1
+ initial += 1
+ offset += 1
+ adjustTab = False
+ else:
+ # ' >\t test '
+ # ^ -- position start of line here + shift bsCount slightly
+ # to make extra space appear
+ adjustTab = True
+
+ else:
+ spaceAfterMarker = False
+
+ oldBMarks.append(state.bMarks[nextLine])
+ state.bMarks[nextLine] = pos
+
+ while pos < max:
+ ch = state.src[pos]
+
+ if isStrSpace(ch):
+ if ch == "\t":
+ offset += (
+ 4
+ - (
+ offset
+ + state.bsCount[nextLine]
+ + (1 if adjustTab else 0)
+ )
+ % 4
+ )
+ else:
+ offset += 1
+ else:
+ break
+
+ pos += 1
+
+ lastLineEmpty = pos >= max
+
+ oldBSCount.append(state.bsCount[nextLine])
+ state.bsCount[nextLine] = (
+ state.sCount[nextLine] + 1 + (1 if spaceAfterMarker else 0)
+ )
+
+ oldSCount.append(state.sCount[nextLine])
+ state.sCount[nextLine] = offset - initial
+
+ oldTShift.append(state.tShift[nextLine])
+ state.tShift[nextLine] = pos - state.bMarks[nextLine]
+
+ nextLine += 1
+ continue
+
+ # Case 2: line is not inside the blockquote, and the last line was empty.
+ if lastLineEmpty:
+ break
+
+ # Case 3: another tag found.
+ terminate = False
+
+ for terminatorRule in terminatorRules:
+ if terminatorRule(state, nextLine, endLine, True):
+ terminate = True
+ break
+
+ if terminate:
+ # Quirk to enforce "hard termination mode" for paragraphs;
+ # normally if you call `tokenize(state, startLine, nextLine)`,
+ # paragraphs will look below nextLine for paragraph continuation,
+ # but if blockquote is terminated by another tag, they shouldn't
+ state.lineMax = nextLine
+
+ if state.blkIndent != 0:
+ # state.blkIndent was non-zero, we now set it to zero,
+ # so we need to re-calculate all offsets to appear as
+ # if indent wasn't changed
+ oldBMarks.append(state.bMarks[nextLine])
+ oldBSCount.append(state.bsCount[nextLine])
+ oldTShift.append(state.tShift[nextLine])
+ oldSCount.append(state.sCount[nextLine])
+ state.sCount[nextLine] -= state.blkIndent
+
+ break
+
+ oldBMarks.append(state.bMarks[nextLine])
+ oldBSCount.append(state.bsCount[nextLine])
+ oldTShift.append(state.tShift[nextLine])
+ oldSCount.append(state.sCount[nextLine])
+
+ # A negative indentation means that this is a paragraph continuation
+ #
+ state.sCount[nextLine] = -1
+
+ nextLine += 1
+
+ oldIndent = state.blkIndent
+ state.blkIndent = 0
+
+ token = state.push("blockquote_open", "blockquote", 1)
+ token.markup = ">"
+ token.map = lines = [startLine, 0]
+
+ state.md.block.tokenize(state, startLine, nextLine)
+
+ token = state.push("blockquote_close", "blockquote", -1)
+ token.markup = ">"
+
+ state.lineMax = oldLineMax
+ state.parentType = oldParentType
+ lines[1] = state.line
+
+ # Restore original tShift; this might not be necessary since the parser
+ # has already been here, but just to make sure we can do that.
+ for i, item in enumerate(oldTShift):
+ state.bMarks[i + startLine] = oldBMarks[i]
+ state.tShift[i + startLine] = item
+ state.sCount[i + startLine] = oldSCount[i]
+ state.bsCount[i + startLine] = oldBSCount[i]
+
+ state.blkIndent = oldIndent
+
+ return True
diff --git a/third_party/python/markdown_it_py/markdown_it/rules_block/code.py b/third_party/python/markdown_it_py/markdown_it/rules_block/code.py
new file mode 100644
index 000000000000..89db9cec4e0f
--- /dev/null
+++ b/third_party/python/markdown_it_py/markdown_it/rules_block/code.py
@@ -0,0 +1,35 @@
+"""Code block (4 spaces padded)."""
+import logging
+
+from .state_block import StateBlock
+
+LOGGER = logging.getLogger(__name__)
+
+
+def code(state: StateBlock, startLine: int, endLine: int, silent: bool) -> bool:
+ LOGGER.debug("entering code: %s, %s, %s, %s", state, startLine, endLine, silent)
+
+ if not state.is_code_block(startLine):
+ return False
+
+ last = nextLine = startLine + 1
+
+ while nextLine < endLine:
+ if state.isEmpty(nextLine):
+ nextLine += 1
+ continue
+
+ if state.is_code_block(nextLine):
+ nextLine += 1
+ last = nextLine
+ continue
+
+ break
+
+ state.line = last
+
+ token = state.push("code_block", "code", 0)
+ token.content = state.getLines(startLine, last, 4 + state.blkIndent, False) + "\n"
+ token.map = [startLine, state.line]
+
+ return True
diff --git a/third_party/python/markdown_it_py/markdown_it/rules_block/fence.py b/third_party/python/markdown_it_py/markdown_it/rules_block/fence.py
new file mode 100644
index 000000000000..263f1b8de8dc
--- /dev/null
+++ b/third_party/python/markdown_it_py/markdown_it/rules_block/fence.py
@@ -0,0 +1,101 @@
+# fences (``` lang, ~~~ lang)
+import logging
+
+from .state_block import StateBlock
+
+LOGGER = logging.getLogger(__name__)
+
+
+def fence(state: StateBlock, startLine: int, endLine: int, silent: bool) -> bool:
+ LOGGER.debug("entering fence: %s, %s, %s, %s", state, startLine, endLine, silent)
+
+ haveEndMarker = False
+ pos = state.bMarks[startLine] + state.tShift[startLine]
+ maximum = state.eMarks[startLine]
+
+ if state.is_code_block(startLine):
+ return False
+
+ if pos + 3 > maximum:
+ return False
+
+ marker = state.src[pos]
+
+ if marker not in ("~", "`"):
+ return False
+
+ # scan marker length
+ mem = pos
+ pos = state.skipCharsStr(pos, marker)
+
+ length = pos - mem
+
+ if length < 3:
+ return False
+
+ markup = state.src[mem:pos]
+ params = state.src[pos:maximum]
+
+ if marker == "`" and marker in params:
+ return False
+
+ # Since start is found, we can report success here in validation mode
+ if silent:
+ return True
+
+ # search end of block
+ nextLine = startLine
+
+ while True:
+ nextLine += 1
+ if nextLine >= endLine:
+ # unclosed block should be autoclosed by end of document.
+ # also block seems to be autoclosed by end of parent
+ break
+
+ pos = mem = state.bMarks[nextLine] + state.tShift[nextLine]
+ maximum = state.eMarks[nextLine]
+
+ if pos < maximum and state.sCount[nextLine] < state.blkIndent:
+ # non-empty line with negative indent should stop the list:
+ # - ```
+ # test
+ break
+
+ try:
+ if state.src[pos] != marker:
+ continue
+ except IndexError:
+ break
+
+ if state.is_code_block(nextLine):
+ continue
+
+ pos = state.skipCharsStr(pos, marker)
+
+ # closing code fence must be at least as long as the opening one
+ if pos - mem < length:
+ continue
+
+ # make sure tail has spaces only
+ pos = state.skipSpaces(pos)
+
+ if pos < maximum:
+ continue
+
+ haveEndMarker = True
+ # found!
+ break
+
+ # If a fence has heading spaces, they should be removed from its inner block
+ length = state.sCount[startLine]
+
+ state.line = nextLine + (1 if haveEndMarker else 0)
+
+ token = state.push("fence", "code", 0)
+ token.info = params
+ token.content = state.getLines(startLine + 1, nextLine, length, True)
+ token.markup = markup
+ token.map = [startLine, state.line]
+
+ return True
diff --git a/third_party/python/markdown_it_py/markdown_it/rules_block/heading.py b/third_party/python/markdown_it_py/markdown_it/rules_block/heading.py
new file mode 100644
index 000000000000..850ffb504d1b
--- /dev/null
+++ b/third_party/python/markdown_it_py/markdown_it/rules_block/heading.py
@@ -0,0 +1,68 @@
+""" Atex heading (#, ##, ...) """
+from __future__ import annotations
+
+import logging
+
+from ..common.utils import isStrSpace
+from .state_block import StateBlock
+
+LOGGER = logging.getLogger(__name__)
+
+
+def heading(state: StateBlock, startLine: int, endLine: int, silent: bool) -> bool:
+ LOGGER.debug("entering heading: %s, %s, %s, %s", state, startLine, endLine, silent)
+
+ pos = state.bMarks[startLine] + state.tShift[startLine]
+ maximum = state.eMarks[startLine]
+
+ if state.is_code_block(startLine):
+ return False
+
+ ch: str | None = state.src[pos]
+
+ if ch != "#" or pos >= maximum:
+ return False
+
+ # count heading level
+ level = 1
+ pos += 1
+ try:
+ ch = state.src[pos]
+ except IndexError:
+ ch = None
+ while ch == "#" and pos < maximum and level <= 6:
+ level += 1
+ pos += 1
+ try:
+ ch = state.src[pos]
+ except IndexError:
+ ch = None
+
+ if level > 6 or (pos < maximum and not isStrSpace(ch)):
+ return False
+
+ if silent:
+ return True
+
+ # Let's cut tails like ' ### ' from the end of string
+
+ maximum = state.skipSpacesBack(maximum, pos)
+ tmp = state.skipCharsStrBack(maximum, "#", pos)
+ if tmp > pos and isStrSpace(state.src[tmp - 1]):
+ maximum = tmp
+
+ state.line = startLine + 1
+
+ token = state.push("heading_open", "h" + str(level), 1)
+ token.markup = "########"[:level]
+ token.map = [startLine, state.line]
+
+ token = state.push("inline", "", 0)
+ token.content = state.src[pos:maximum].strip()
+ token.map = [startLine, state.line]
+ token.children = []
+
+ token = state.push("heading_close", "h" + str(level), -1)
+ token.markup = "########"[:level]
+
+ return True
diff --git a/third_party/python/markdown_it_py/markdown_it/rules_block/hr.py b/third_party/python/markdown_it_py/markdown_it/rules_block/hr.py
new file mode 100644
index 000000000000..16df05f2ab2e
--- /dev/null
+++ b/third_party/python/markdown_it_py/markdown_it/rules_block/hr.py
@@ -0,0 +1,55 @@
+"""Horizontal rule
+
+At least 3 of these characters on a line * - _
+"""
+import logging
+
+from ..common.utils import isStrSpace
+from .state_block import StateBlock
+
+LOGGER = logging.getLogger(__name__)
+
+
+def hr(state: StateBlock, startLine: int, endLine: int, silent: bool) -> bool:
+ LOGGER.debug("entering hr: %s, %s, %s, %s", state, startLine, endLine, silent)
+
+ pos = state.bMarks[startLine] + state.tShift[startLine]
+ maximum = state.eMarks[startLine]
+
+ if state.is_code_block(startLine):
+ return False
+
+ try:
+ marker = state.src[pos]
+ except IndexError:
+ return False
+ pos += 1
+
+ # Check hr marker
+ if marker not in ("*", "-", "_"):
+ return False
+
+ # markers can be mixed with spaces, but there should be at least 3 of them
+
+ cnt = 1
+ while pos < maximum:
+ ch = state.src[pos]
+ pos += 1
+ if ch != marker and not isStrSpace(ch):
+ return False
+ if ch == marker:
+ cnt += 1
+
+ if cnt < 3:
+ return False
+
+ if silent:
+ return True
+
+ state.line = startLine + 1
+
+ token = state.push("hr", "hr", 0)
+ token.map = [startLine, state.line]
+ token.markup = marker * (cnt + 1)
+
+ return True
diff --git a/third_party/python/markdown_it_py/markdown_it/rules_block/html_block.py b/third_party/python/markdown_it_py/markdown_it/rules_block/html_block.py
new file mode 100644
index 000000000000..3d43f6ee1deb
--- /dev/null
+++ b/third_party/python/markdown_it_py/markdown_it/rules_block/html_block.py
@@ -0,0 +1,90 @@
+# HTML block
+from __future__ import annotations
+
+import logging
+import re
+
+from ..common.html_blocks import block_names
+from ..common.html_re import HTML_OPEN_CLOSE_TAG_STR
+from .state_block import StateBlock
+
+LOGGER = logging.getLogger(__name__)
+
+# An array of opening and corresponding closing sequences for html tags,
+# last argument defines whether it can terminate a paragraph or not
+HTML_SEQUENCES: list[tuple[re.Pattern[str], re.Pattern[str], bool]] = [
+ (
+ re.compile(r"^<(script|pre|style|textarea)(?=(\s|>|$))", re.IGNORECASE),
+ re.compile(r"<\/(script|pre|style|textarea)>", re.IGNORECASE),
+ True,
+ ),
+ (re.compile(r"^"), True),
+ (re.compile(r"^<\?"), re.compile(r"\?>"), True),
+ (re.compile(r"^"), True),
+ (re.compile(r"^"), True),
+ (
+ re.compile("^?(" + "|".join(block_names) + ")(?=(\\s|/?>|$))", re.IGNORECASE),
+ re.compile(r"^$"),
+ True,
+ ),
+ (re.compile(HTML_OPEN_CLOSE_TAG_STR + "\\s*$"), re.compile(r"^$"), False),
+]
+
+
+def html_block(state: StateBlock, startLine: int, endLine: int, silent: bool) -> bool:
+ LOGGER.debug(
+ "entering html_block: %s, %s, %s, %s", state, startLine, endLine, silent
+ )
+ pos = state.bMarks[startLine] + state.tShift[startLine]
+ maximum = state.eMarks[startLine]
+
+ if state.is_code_block(startLine):
+ return False
+
+ if not state.md.options.get("html", None):
+ return False
+
+ if state.src[pos] != "<":
+ return False
+
+ lineText = state.src[pos:maximum]
+
+ html_seq = None
+ for HTML_SEQUENCE in HTML_SEQUENCES:
+ if HTML_SEQUENCE[0].search(lineText):
+ html_seq = HTML_SEQUENCE
+ break
+
+ if not html_seq:
+ return False
+
+ if silent:
+ # true if this sequence can be a terminator, false otherwise
+ return html_seq[2]
+
+ nextLine = startLine + 1
+
+ # If we are here - we detected HTML block.
+ # Let's roll down till block end.
+ if not html_seq[1].search(lineText):
+ while nextLine < endLine:
+ if state.sCount[nextLine] < state.blkIndent:
+ break
+
+ pos = state.bMarks[nextLine] + state.tShift[nextLine]
+ maximum = state.eMarks[nextLine]
+ lineText = state.src[pos:maximum]
+
+ if html_seq[1].search(lineText):
+ if len(lineText) != 0:
+ nextLine += 1
+ break
+ nextLine += 1
+
+ state.line = nextLine
+
+ token = state.push("html_block", "", 0)
+ token.map = [startLine, nextLine]
+ token.content = state.getLines(startLine, nextLine, state.blkIndent, True)
+
+ return True
diff --git a/third_party/python/markdown_it_py/markdown_it/rules_block/lheading.py b/third_party/python/markdown_it_py/markdown_it/rules_block/lheading.py
new file mode 100644
index 000000000000..3522207abb68
--- /dev/null
+++ b/third_party/python/markdown_it_py/markdown_it/rules_block/lheading.py
@@ -0,0 +1,86 @@
+# lheading (---, ==)
+import logging
+
+from .state_block import StateBlock
+
+LOGGER = logging.getLogger(__name__)
+
+
+def lheading(state: StateBlock, startLine: int, endLine: int, silent: bool) -> bool:
+ LOGGER.debug("entering lheading: %s, %s, %s, %s", state, startLine, endLine, silent)
+
+ level = None
+ nextLine = startLine + 1
+ ruler = state.md.block.ruler
+ terminatorRules = ruler.getRules("paragraph")
+
+ if state.is_code_block(startLine):
+ return False
+
+ oldParentType = state.parentType
+ state.parentType = "paragraph" # use paragraph to match terminatorRules
+
+ # jump line-by-line until empty one or EOF
+ while nextLine < endLine and not state.isEmpty(nextLine):
+ # this would be a code block normally, but after paragraph
+ # it's considered a lazy continuation regardless of what's there
+ if state.sCount[nextLine] - state.blkIndent > 3:
+ nextLine += 1
+ continue
+
+ # Check for underline in setext header
+ if state.sCount[nextLine] >= state.blkIndent:
+ pos = state.bMarks[nextLine] + state.tShift[nextLine]
+ maximum = state.eMarks[nextLine]
+
+ if pos < maximum:
+ marker = state.src[pos]
+
+ if marker in ("-", "="):
+ pos = state.skipCharsStr(pos, marker)
+ pos = state.skipSpaces(pos)
+
+ # /* = */
+ if pos >= maximum:
+ level = 1 if marker == "=" else 2
+ break
+
+ # quirk for blockquotes, this line should already be checked by that rule
+ if state.sCount[nextLine] < 0:
+ nextLine += 1
+ continue
+
+ # Some tags can terminate paragraph without empty line.
+ terminate = False
+ for terminatorRule in terminatorRules:
+ if terminatorRule(state, nextLine, endLine, True):
+ terminate = True
+ break
+ if terminate:
+ break
+
+ nextLine += 1
+
+ if not level:
+ # Didn't find valid underline
+ return False
+
+ content = state.getLines(startLine, nextLine, state.blkIndent, False).strip()
+
+ state.line = nextLine + 1
+
+ token = state.push("heading_open", "h" + str(level), 1)
+ token.markup = marker
+ token.map = [startLine, state.line]
+
+ token = state.push("inline", "", 0)
+ token.content = content
+ token.map = [startLine, state.line - 1]
+ token.children = []
+
+ token = state.push("heading_close", "h" + str(level), -1)
+ token.markup = marker
+
+ state.parentType = oldParentType
+
+ return True
diff --git a/third_party/python/markdown_it_py/markdown_it/rules_block/list.py b/third_party/python/markdown_it_py/markdown_it/rules_block/list.py
new file mode 100644
index 000000000000..d8070d747035
--- /dev/null
+++ b/third_party/python/markdown_it_py/markdown_it/rules_block/list.py
@@ -0,0 +1,345 @@
+# Lists
+import logging
+
+from ..common.utils import isStrSpace
+from .state_block import StateBlock
+
+LOGGER = logging.getLogger(__name__)
+
+
+# Search `[-+*][\n ]`, returns next pos after marker on success
+# or -1 on fail.
+def skipBulletListMarker(state: StateBlock, startLine: int) -> int:
+ pos = state.bMarks[startLine] + state.tShift[startLine]
+ maximum = state.eMarks[startLine]
+
+ try:
+ marker = state.src[pos]
+ except IndexError:
+ return -1
+ pos += 1
+
+ if marker not in ("*", "-", "+"):
+ return -1
+
+ if pos < maximum:
+ ch = state.src[pos]
+
+ if not isStrSpace(ch):
+ # " -test " - is not a list item
+ return -1
+
+ return pos
+
+
+# Search `\d+[.)][\n ]`, returns next pos after marker on success
+# or -1 on fail.
+def skipOrderedListMarker(state: StateBlock, startLine: int) -> int:
+ start = state.bMarks[startLine] + state.tShift[startLine]
+ pos = start
+ maximum = state.eMarks[startLine]
+
+ # List marker should have at least 2 chars (digit + dot)
+ if pos + 1 >= maximum:
+ return -1
+
+ ch = state.src[pos]
+ pos += 1
+
+ ch_ord = ord(ch)
+ # /* 0 */ /* 9 */
+ if ch_ord < 0x30 or ch_ord > 0x39:
+ return -1
+
+ while True:
+ # EOL -> fail
+ if pos >= maximum:
+ return -1
+
+ ch = state.src[pos]
+ pos += 1
+
+ # /* 0 */ /* 9 */
+ ch_ord = ord(ch)
+ if ch_ord >= 0x30 and ch_ord <= 0x39:
+ # List marker should have no more than 9 digits
+ # (prevents integer overflow in browsers)
+ if pos - start >= 10:
+ return -1
+
+ continue
+
+ # found valid marker
+ if ch in (")", "."):
+ break
+
+ return -1
+
+ if pos < maximum:
+ ch = state.src[pos]
+
+ if not isStrSpace(ch):
+ # " 1.test " - is not a list item
+ return -1
+
+ return pos
+
+
+def markTightParagraphs(state: StateBlock, idx: int) -> None:
+ level = state.level + 2
+
+ i = idx + 2
+ length = len(state.tokens) - 2
+ while i < length:
+ if state.tokens[i].level == level and state.tokens[i].type == "paragraph_open":
+ state.tokens[i + 2].hidden = True
+ state.tokens[i].hidden = True
+ i += 2
+ i += 1
+
+
+def list_block(state: StateBlock, startLine: int, endLine: int, silent: bool) -> bool:
+ LOGGER.debug("entering list: %s, %s, %s, %s", state, startLine, endLine, silent)
+
+ isTerminatingParagraph = False
+ tight = True
+
+ if state.is_code_block(startLine):
+ return False
+
+ # Special case:
+ # - item 1
+ # - item 2
+ # - item 3
+ # - item 4
+ # - this one is a paragraph continuation
+ if (
+ state.listIndent >= 0
+ and state.sCount[startLine] - state.listIndent >= 4
+ and state.sCount[startLine] < state.blkIndent
+ ):
+ return False
+
+ # limit conditions when list can interrupt
+ # a paragraph (validation mode only)
+ # Next list item should still terminate previous list item
+ #
+ # This code can fail if plugins use blkIndent as well as lists,
+ # but I hope the spec gets fixed long before that happens.
+ #
+ if (
+ silent
+ and state.parentType == "paragraph"
+ and state.sCount[startLine] >= state.blkIndent
+ ):
+ isTerminatingParagraph = True
+
+ # Detect list type and position after marker
+ posAfterMarker = skipOrderedListMarker(state, startLine)
+ if posAfterMarker >= 0:
+ isOrdered = True
+ start = state.bMarks[startLine] + state.tShift[startLine]
+ markerValue = int(state.src[start : posAfterMarker - 1])
+
+ # If we're starting a new ordered list right after
+ # a paragraph, it should start with 1.
+ if isTerminatingParagraph and markerValue != 1:
+ return False
+ else:
+ posAfterMarker = skipBulletListMarker(state, startLine)
+ if posAfterMarker >= 0:
+ isOrdered = False
+ else:
+ return False
+
+ # If we're starting a new unordered list right after
+ # a paragraph, first line should not be empty.
+ if (
+ isTerminatingParagraph
+ and state.skipSpaces(posAfterMarker) >= state.eMarks[startLine]
+ ):
+ return False
+
+ # We should terminate list on style change. Remember first one to compare.
+ markerChar = state.src[posAfterMarker - 1]
+
+ # For validation mode we can terminate immediately
+ if silent:
+ return True
+
+ # Start list
+ listTokIdx = len(state.tokens)
+
+ if isOrdered:
+ token = state.push("ordered_list_open", "ol", 1)
+ if markerValue != 1:
+ token.attrs = {"start": markerValue}
+
+ else:
+ token = state.push("bullet_list_open", "ul", 1)
+
+ token.map = listLines = [startLine, 0]
+ token.markup = markerChar
+
+ #
+ # Iterate list items
+ #
+
+ nextLine = startLine
+ prevEmptyEnd = False
+ terminatorRules = state.md.block.ruler.getRules("list")
+
+ oldParentType = state.parentType
+ state.parentType = "list"
+
+ while nextLine < endLine:
+ pos = posAfterMarker
+ maximum = state.eMarks[nextLine]
+
+ initial = offset = (
+ state.sCount[nextLine]
+ + posAfterMarker
+ - (state.bMarks[startLine] + state.tShift[startLine])
+ )
+
+ while pos < maximum:
+ ch = state.src[pos]
+
+ if ch == "\t":
+ offset += 4 - (offset + state.bsCount[nextLine]) % 4
+ elif ch == " ":
+ offset += 1
+ else:
+ break
+
+ pos += 1
+
+ contentStart = pos
+
+ # trimming space in "- \n 3" case, indent is 1 here
+ indentAfterMarker = 1 if contentStart >= maximum else offset - initial
+
+ # If we have more than 4 spaces, the indent is 1
+ # (the rest is just indented code block)
+ if indentAfterMarker > 4:
+ indentAfterMarker = 1
+
+ # " - test"
+ # ^^^^^ - calculating total length of this thing
+ indent = initial + indentAfterMarker
+
+ # Run subparser & write tokens
+ token = state.push("list_item_open", "li", 1)
+ token.markup = markerChar
+ token.map = itemLines = [startLine, 0]
+ if isOrdered:
+ token.info = state.src[start : posAfterMarker - 1]
+
+ # change current state, then restore it after parser subcall
+ oldTight = state.tight
+ oldTShift = state.tShift[startLine]
+ oldSCount = state.sCount[startLine]
+
+ # - example list
+ # ^ listIndent position will be here
+ # ^ blkIndent position will be here
+ #
+ oldListIndent = state.listIndent
+ state.listIndent = state.blkIndent
+ state.blkIndent = indent
+
+ state.tight = True
+ state.tShift[startLine] = contentStart - state.bMarks[startLine]
+ state.sCount[startLine] = offset
+
+ if contentStart >= maximum and state.isEmpty(startLine + 1):
+ # workaround for this case
+ # (list item is empty, list terminates before "foo"):
+ # ~~~~~~~~
+ # -
+ #
+ # foo
+ # ~~~~~~~~
+ state.line = min(state.line + 2, endLine)
+ else:
+ # NOTE in list.js this was:
+ # state.md.block.tokenize(state, startLine, endLine, True)
+ # but tokeniz does not take the final parameter
+ state.md.block.tokenize(state, startLine, endLine)
+
+ # If any of list item is tight, mark list as tight
+ if (not state.tight) or prevEmptyEnd:
+ tight = False
+
+ # Item become loose if finish with empty line,
+ # but we should filter last element, because it means list finish
+ prevEmptyEnd = (state.line - startLine) > 1 and state.isEmpty(state.line - 1)
+
+ state.blkIndent = state.listIndent
+ state.listIndent = oldListIndent
+ state.tShift[startLine] = oldTShift
+ state.sCount[startLine] = oldSCount
+ state.tight = oldTight
+
+ token = state.push("list_item_close", "li", -1)
+ token.markup = markerChar
+
+ nextLine = startLine = state.line
+ itemLines[1] = nextLine
+
+ if nextLine >= endLine:
+ break
+
+ contentStart = state.bMarks[startLine]
+
+ #
+ # Try to check if list is terminated or continued.
+ #
+ if state.sCount[nextLine] < state.blkIndent:
+ break
+
+ if state.is_code_block(startLine):
+ break
+
+ # fail if terminating block found
+ terminate = False
+ for terminatorRule in terminatorRules:
+ if terminatorRule(state, nextLine, endLine, True):
+ terminate = True
+ break
+
+ if terminate:
+ break
+
+ # fail if list has another type
+ if isOrdered:
+ posAfterMarker = skipOrderedListMarker(state, nextLine)
+ if posAfterMarker < 0:
+ break
+ start = state.bMarks[nextLine] + state.tShift[nextLine]
+ else:
+ posAfterMarker = skipBulletListMarker(state, nextLine)
+ if posAfterMarker < 0:
+ break
+
+ if markerChar != state.src[posAfterMarker - 1]:
+ break
+
+ # Finalize list
+ if isOrdered:
+ token = state.push("ordered_list_close", "ol", -1)
+ else:
+ token = state.push("bullet_list_close", "ul", -1)
+
+ token.markup = markerChar
+
+ listLines[1] = nextLine
+ state.line = nextLine
+
+ state.parentType = oldParentType
+
+ # mark paragraphs tight if needed
+ if tight:
+ markTightParagraphs(state, listTokIdx)
+
+ return True
diff --git a/third_party/python/markdown_it_py/markdown_it/rules_block/paragraph.py b/third_party/python/markdown_it_py/markdown_it/rules_block/paragraph.py
new file mode 100644
index 000000000000..5388a4b1468d
--- /dev/null
+++ b/third_party/python/markdown_it_py/markdown_it/rules_block/paragraph.py
@@ -0,0 +1,65 @@
+"""Paragraph."""
+import logging
+
+from .state_block import StateBlock
+
+LOGGER = logging.getLogger(__name__)
+
+
+def paragraph(state: StateBlock, startLine: int, endLine: int, silent: bool) -> bool:
+ LOGGER.debug(
+ "entering paragraph: %s, %s, %s, %s", state, startLine, endLine, silent
+ )
+
+ nextLine = startLine + 1
+ ruler = state.md.block.ruler
+ terminatorRules = ruler.getRules("paragraph")
+ endLine = state.lineMax
+
+ oldParentType = state.parentType
+ state.parentType = "paragraph"
+
+ # jump line-by-line until empty one or EOF
+ while nextLine < endLine:
+ if state.isEmpty(nextLine):
+ break
+ # this would be a code block normally, but after paragraph
+ # it's considered a lazy continuation regardless of what's there
+ if state.sCount[nextLine] - state.blkIndent > 3:
+ nextLine += 1
+ continue
+
+ # quirk for blockquotes, this line should already be checked by that rule
+ if state.sCount[nextLine] < 0:
+ nextLine += 1
+ continue
+
+ # Some tags can terminate paragraph without empty line.
+ terminate = False
+ for terminatorRule in terminatorRules:
+ if terminatorRule(state, nextLine, endLine, True):
+ terminate = True
+ break
+
+ if terminate:
+ break
+
+ nextLine += 1
+
+ content = state.getLines(startLine, nextLine, state.blkIndent, False).strip()
+
+ state.line = nextLine
+
+ token = state.push("paragraph_open", "p", 1)
+ token.map = [startLine, state.line]
+
+ token = state.push("inline", "", 0)
+ token.content = content
+ token.map = [startLine, state.line]
+ token.children = []
+
+ token = state.push("paragraph_close", "p", -1)
+
+ state.parentType = oldParentType
+
+ return True
diff --git a/third_party/python/markdown_it_py/markdown_it/rules_block/reference.py b/third_party/python/markdown_it_py/markdown_it/rules_block/reference.py
new file mode 100644
index 000000000000..b77944b2ee81
--- /dev/null
+++ b/third_party/python/markdown_it_py/markdown_it/rules_block/reference.py
@@ -0,0 +1,215 @@
+import logging
+
+from ..common.utils import charCodeAt, isSpace, normalizeReference
+from .state_block import StateBlock
+
+LOGGER = logging.getLogger(__name__)
+
+
+def reference(state: StateBlock, startLine: int, _endLine: int, silent: bool) -> bool:
+ LOGGER.debug(
+ "entering reference: %s, %s, %s, %s", state, startLine, _endLine, silent
+ )
+
+ lines = 0
+ pos = state.bMarks[startLine] + state.tShift[startLine]
+ maximum = state.eMarks[startLine]
+ nextLine = startLine + 1
+
+ if state.is_code_block(startLine):
+ return False
+
+ if state.src[pos] != "[":
+ return False
+
+ # Simple check to quickly interrupt scan on [link](url) at the start of line.
+ # Can be useful on practice: https:#github.com/markdown-it/markdown-it/issues/54
+ while pos < maximum:
+ # /* ] */ /* \ */ /* : */
+ if state.src[pos] == "]" and state.src[pos - 1] != "\\":
+ if pos + 1 == maximum:
+ return False
+ if state.src[pos + 1] != ":":
+ return False
+ break
+ pos += 1
+
+ endLine = state.lineMax
+
+ # jump line-by-line until empty one or EOF
+ terminatorRules = state.md.block.ruler.getRules("reference")
+
+ oldParentType = state.parentType
+ state.parentType = "reference"
+
+ while nextLine < endLine and not state.isEmpty(nextLine):
+ # this would be a code block normally, but after paragraph
+ # it's considered a lazy continuation regardless of what's there
+ if state.sCount[nextLine] - state.blkIndent > 3:
+ nextLine += 1
+ continue
+
+ # quirk for blockquotes, this line should already be checked by that rule
+ if state.sCount[nextLine] < 0:
+ nextLine += 1
+ continue
+
+ # Some tags can terminate paragraph without empty line.
+ terminate = False
+ for terminatorRule in terminatorRules:
+ if terminatorRule(state, nextLine, endLine, True):
+ terminate = True
+ break
+
+ if terminate:
+ break
+
+ nextLine += 1
+
+ string = state.getLines(startLine, nextLine, state.blkIndent, False).strip()
+ maximum = len(string)
+
+ labelEnd = None
+ pos = 1
+ while pos < maximum:
+ ch = charCodeAt(string, pos)
+ if ch == 0x5B: # /* [ */
+ return False
+ elif ch == 0x5D: # /* ] */
+ labelEnd = pos
+ break
+ elif ch == 0x0A: # /* \n */
+ lines += 1
+ elif ch == 0x5C: # /* \ */
+ pos += 1
+ if pos < maximum and charCodeAt(string, pos) == 0x0A:
+ lines += 1
+ pos += 1
+
+ if (
+ labelEnd is None or labelEnd < 0 or charCodeAt(string, labelEnd + 1) != 0x3A
+ ): # /* : */
+ return False
+
+ # [label]: destination 'title'
+ # ^^^ skip optional whitespace here
+ pos = labelEnd + 2
+ while pos < maximum:
+ ch = charCodeAt(string, pos)
+ if ch == 0x0A:
+ lines += 1
+ elif isSpace(ch):
+ pass
+ else:
+ break
+ pos += 1
+
+ # [label]: destination 'title'
+ # ^^^^^^^^^^^ parse this
+ res = state.md.helpers.parseLinkDestination(string, pos, maximum)
+ if not res.ok:
+ return False
+
+ href = state.md.normalizeLink(res.str)
+ if not state.md.validateLink(href):
+ return False
+
+ pos = res.pos
+ lines += res.lines
+
+ # save cursor state, we could require to rollback later
+ destEndPos = pos
+ destEndLineNo = lines
+
+ # [label]: destination 'title'
+ # ^^^ skipping those spaces
+ start = pos
+ while pos < maximum:
+ ch = charCodeAt(string, pos)
+ if ch == 0x0A:
+ lines += 1
+ elif isSpace(ch):
+ pass
+ else:
+ break
+ pos += 1
+
+ # [label]: destination 'title'
+ # ^^^^^^^ parse this
+ res = state.md.helpers.parseLinkTitle(string, pos, maximum)
+ if pos < maximum and start != pos and res.ok:
+ title = res.str
+ pos = res.pos
+ lines += res.lines
+ else:
+ title = ""
+ pos = destEndPos
+ lines = destEndLineNo
+
+ # skip trailing spaces until the rest of the line
+ while pos < maximum:
+ ch = charCodeAt(string, pos)
+ if not isSpace(ch):
+ break
+ pos += 1
+
+ if pos < maximum and charCodeAt(string, pos) != 0x0A and title:
+ # garbage at the end of the line after title,
+ # but it could still be a valid reference if we roll back
+ title = ""
+ pos = destEndPos
+ lines = destEndLineNo
+ while pos < maximum:
+ ch = charCodeAt(string, pos)
+ if not isSpace(ch):
+ break
+ pos += 1
+
+ if pos < maximum and charCodeAt(string, pos) != 0x0A:
+ # garbage at the end of the line
+ return False
+
+ label = normalizeReference(string[1:labelEnd])
+ if not label:
+ # CommonMark 0.20 disallows empty labels
+ return False
+
+ # Reference can not terminate anything. This check is for safety only.
+ if silent:
+ return True
+
+ if "references" not in state.env:
+ state.env["references"] = {}
+
+ state.line = startLine + lines + 1
+
+ # note, this is not part of markdown-it JS, but is useful for renderers
+ if state.md.options.get("inline_definitions", False):
+ token = state.push("definition", "", 0)
+ token.meta = {
+ "id": label,
+ "title": title,
+ "url": href,
+ "label": string[1:labelEnd],
+ }
+ token.map = [startLine, state.line]
+
+ if label not in state.env["references"]:
+ state.env["references"][label] = {
+ "title": title,
+ "href": href,
+ "map": [startLine, state.line],
+ }
+ else:
+ state.env.setdefault("duplicate_refs", []).append(
+ {
+ "title": title,
+ "href": href,
+ "label": label,
+ "map": [startLine, state.line],
+ }
+ )
+
+ state.parentType = oldParentType
+
+ return True
diff --git a/third_party/python/markdown_it_py/markdown_it/rules_block/state_block.py b/third_party/python/markdown_it_py/markdown_it/rules_block/state_block.py
new file mode 100644
index 000000000000..445ad265a01e
--- /dev/null
+++ b/third_party/python/markdown_it_py/markdown_it/rules_block/state_block.py
@@ -0,0 +1,261 @@
+from __future__ import annotations
+
+from typing import TYPE_CHECKING, Literal
+
+from ..common.utils import isStrSpace
+from ..ruler import StateBase
+from ..token import Token
+from ..utils import EnvType
+
+if TYPE_CHECKING:
+ from markdown_it.main import MarkdownIt
+
+
+class StateBlock(StateBase):
+ def __init__(
+ self, src: str, md: MarkdownIt, env: EnvType, tokens: list[Token]
+ ) -> None:
+ self.src = src
+
+ # link to parser instance
+ self.md = md
+
+ self.env = env
+
+ #
+ # Internal state variables
+ #
+
+ self.tokens = tokens
+
+ self.bMarks: list[int] = [] # line begin offsets for fast jumps
+ self.eMarks: list[int] = [] # line end offsets for fast jumps
+ # offsets of the first non-space characters (tabs not expanded)
+ self.tShift: list[int] = []
+ self.sCount: list[int] = [] # indents for each line (tabs expanded)
+
+ # An amount of virtual spaces (tabs expanded) between beginning
+ # of each line (bMarks) and real beginning of that line.
+ #
+ # It exists only as a hack because blockquotes override bMarks
+ # losing information in the process.
+ #
+ # It's used only when expanding tabs, you can think about it as
+ # an initial tab length, e.g. bsCount=21 applied to string `\t123`
+ # means first tab should be expanded to 4-21%4 === 3 spaces.
+ #
+ self.bsCount: list[int] = []
+
+ # block parser variables
+ self.blkIndent = 0 # required block content indent (for example, if we are
+ # inside a list, it would be positioned after list marker)
+ self.line = 0 # line index in src
+ self.lineMax = 0 # lines count
+ self.tight = False # loose/tight mode for lists
+ self.ddIndent = -1 # indent of the current dd block (-1 if there isn't any)
+ self.listIndent = -1 # indent of the current list block (-1 if there isn't any)
+
+ # can be 'blockquote', 'list', 'root', 'paragraph' or 'reference'
+ # used in lists to determine if they interrupt a paragraph
+ self.parentType = "root"
+
+ self.level = 0
+
+ # renderer
+ self.result = ""
+
+ # Create caches
+ # Generate markers.
+ indent_found = False
+
+ start = pos = indent = offset = 0
+ length = len(self.src)
+
+ for pos, character in enumerate(self.src):
+ if not indent_found:
+ if isStrSpace(character):
+ indent += 1
+
+ if character == "\t":
+ offset += 4 - offset % 4
+ else:
+ offset += 1
+ continue
+ else:
+ indent_found = True
+
+ if character == "\n" or pos == length - 1:
+ if character != "\n":
+ pos += 1
+ self.bMarks.append(start)
+ self.eMarks.append(pos)
+ self.tShift.append(indent)
+ self.sCount.append(offset)
+ self.bsCount.append(0)
+
+ indent_found = False
+ indent = 0
+ offset = 0
+ start = pos + 1
+
+ # Push fake entry to simplify cache bounds checks
+ self.bMarks.append(length)
+ self.eMarks.append(length)
+ self.tShift.append(0)
+ self.sCount.append(0)
+ self.bsCount.append(0)
+
+ self.lineMax = len(self.bMarks) - 1 # don't count last fake line
+
+ # pre-check if code blocks are enabled, to speed up is_code_block method
+ self._code_enabled = "code" in self.md["block"].ruler.get_active_rules()
+
+ def __repr__(self) -> str:
+ return (
+ f"{self.__class__.__name__}"
+ f"(line={self.line},level={self.level},tokens={len(self.tokens)})"
+ )
+
+ def push(self, ttype: str, tag: str, nesting: Literal[-1, 0, 1]) -> Token:
+ """Push new token to "stream"."""
+ token = Token(ttype, tag, nesting)
+ token.block = True
+ if nesting < 0:
+ self.level -= 1 # closing tag
+ token.level = self.level
+ if nesting > 0:
+ self.level += 1 # opening tag
+ self.tokens.append(token)
+ return token
+
+ def isEmpty(self, line: int) -> bool:
+ """."""
+ return (self.bMarks[line] + self.tShift[line]) >= self.eMarks[line]
+
+ def skipEmptyLines(self, from_pos: int) -> int:
+ """."""
+ while from_pos < self.lineMax:
+ try:
+ if (self.bMarks[from_pos] + self.tShift[from_pos]) < self.eMarks[
+ from_pos
+ ]:
+ break
+ except IndexError:
+ pass
+ from_pos += 1
+ return from_pos
+
+ def skipSpaces(self, pos: int) -> int:
+ """Skip spaces from given position."""
+ while True:
+ try:
+ current = self.src[pos]
+ except IndexError:
+ break
+ if not isStrSpace(current):
+ break
+ pos += 1
+ return pos
+
+ def skipSpacesBack(self, pos: int, minimum: int) -> int:
+ """Skip spaces from given position in reverse."""
+ if pos <= minimum:
+ return pos
+ while pos > minimum:
+ pos -= 1
+ if not isStrSpace(self.src[pos]):
+ return pos + 1
+ return pos
+
+ def skipChars(self, pos: int, code: int) -> int:
+ """Skip character code from given position."""
+ while True:
+ try:
+ current = self.srcCharCode[pos]
+ except IndexError:
+ break
+ if current != code:
+ break
+ pos += 1
+ return pos
+
+ def skipCharsStr(self, pos: int, ch: str) -> int:
+ """Skip character string from given position."""
+ while True:
+ try:
+ current = self.src[pos]
+ except IndexError:
+ break
+ if current != ch:
+ break
+ pos += 1
+ return pos
+
+ def skipCharsBack(self, pos: int, code: int, minimum: int) -> int:
+ """Skip character code reverse from given position - 1."""
+ if pos <= minimum:
+ return pos
+ while pos > minimum:
+ pos -= 1
+ if code != self.srcCharCode[pos]:
+ return pos + 1
+ return pos
+
+ def skipCharsStrBack(self, pos: int, ch: str, minimum: int) -> int:
+ """Skip character string reverse from given position - 1."""
+ if pos <= minimum:
+ return pos
+ while pos > minimum:
+ pos -= 1
+ if ch != self.src[pos]:
+ return pos + 1
+ return pos
+
+ def getLines(self, begin: int, end: int, indent: int, keepLastLF: bool) -> str:
+ """Cut lines range from source."""
+ line = begin
+ if begin >= end:
+ return ""
+
+ queue = [""] * (end - begin)
+
+ i = 1
+ while line < end:
+ lineIndent = 0
+ lineStart = first = self.bMarks[line]
+ last = (
+ self.eMarks[line] + 1
+ if line + 1 < end or keepLastLF
+ else self.eMarks[line]
+ )
+
+ while (first < last) and (lineIndent < indent):
+ ch = self.src[first]
+ if isStrSpace(ch):
+ if ch == "\t":
+ lineIndent += 4 - (lineIndent + self.bsCount[line]) % 4
+ else:
+ lineIndent += 1
+ elif first - lineStart < self.tShift[line]:
+ lineIndent += 1
+ else:
+ break
+ first += 1
+
+ if lineIndent > indent:
+ # partially expanding tabs in code blocks, e.g '\t\tfoobar'
+ # with indent=2 becomes ' \tfoobar'
+ queue[i - 1] = (" " * (lineIndent - indent)) + self.src[first:last]
+ else:
+ queue[i - 1] = self.src[first:last]
+
+ line += 1
+ i += 1
+
+ return "".join(queue)
+
+ def is_code_block(self, line: int) -> bool:
+ """Check if line is a code block,
+ i.e. the code block rule is enabled and text is indented by more than 3 spaces.
+ """
+ return self._code_enabled and (self.sCount[line] - self.blkIndent) >= 4
diff --git a/third_party/python/markdown_it_py/markdown_it/rules_block/table.py b/third_party/python/markdown_it_py/markdown_it/rules_block/table.py
new file mode 100644
index 000000000000..4b666c1d5d9e
--- /dev/null
+++ b/third_party/python/markdown_it_py/markdown_it/rules_block/table.py
@@ -0,0 +1,236 @@
+# GFM table, https://github.github.com/gfm/#tables-extension-
+from __future__ import annotations
+
+import re
+
+from ..common.utils import charStrAt, isStrSpace
+from .state_block import StateBlock
+
+headerLineRe = re.compile(r"^:?-+:?$")
+enclosingPipesRe = re.compile(r"^\||\|$")
+
+
+def getLine(state: StateBlock, line: int) -> str:
+ pos = state.bMarks[line] + state.tShift[line]
+ maximum = state.eMarks[line]
+
+ # return state.src.substr(pos, max - pos)
+ return state.src[pos:maximum]
+
+
+def escapedSplit(string: str) -> list[str]:
+ result: list[str] = []
+ pos = 0
+ max = len(string)
+ isEscaped = False
+ lastPos = 0
+ current = ""
+ ch = charStrAt(string, pos)
+
+ while pos < max:
+ if ch == "|":
+ if not isEscaped:
+ # pipe separating cells, '|'
+ result.append(current + string[lastPos:pos])
+ current = ""
+ lastPos = pos + 1
+ else:
+ # escaped pipe, '\|'
+ current += string[lastPos : pos - 1]
+ lastPos = pos
+
+ isEscaped = ch == "\\"
+ pos += 1
+
+ ch = charStrAt(string, pos)
+
+ result.append(current + string[lastPos:])
+
+ return result
+
+
+def table(state: StateBlock, startLine: int, endLine: int, silent: bool) -> bool:
+ tbodyLines = None
+
+ # should have at least two lines
+ if startLine + 2 > endLine:
+ return False
+
+ nextLine = startLine + 1
+
+ if state.sCount[nextLine] < state.blkIndent:
+ return False
+
+ if state.is_code_block(nextLine):
+ return False
+
+ # first character of the second line should be '|', '-', ':',
+ # and no other characters are allowed but spaces;
+ # basically, this is the equivalent of /^[-:|][-:|\s]*$/ regexp
+
+ pos = state.bMarks[nextLine] + state.tShift[nextLine]
+ if pos >= state.eMarks[nextLine]:
+ return False
+ first_ch = state.src[pos]
+ pos += 1
+ if first_ch not in ("|", "-", ":"):
+ return False
+
+ if pos >= state.eMarks[nextLine]:
+ return False
+ second_ch = state.src[pos]
+ pos += 1
+ if second_ch not in ("|", "-", ":") and not isStrSpace(second_ch):
+ return False
+
+ # if first character is '-', then second character must not be a space
+ # (due to parsing ambiguity with list)
+ if first_ch == "-" and isStrSpace(second_ch):
+ return False
+
+ while pos < state.eMarks[nextLine]:
+ ch = state.src[pos]
+
+ if ch not in ("|", "-", ":") and not isStrSpace(ch):
+ return False
+
+ pos += 1
+
+ lineText = getLine(state, startLine + 1)
+
+ columns = lineText.split("|")
+ aligns = []
+ for i in range(len(columns)):
+ t = columns[i].strip()
+ if not t:
+ # allow empty columns before and after table, but not in between columns;
+ # e.g. allow ` |---| `, disallow ` ---||--- `
+ if i == 0 or i == len(columns) - 1:
+ continue
+ else:
+ return False
+
+ if not headerLineRe.search(t):
+ return False
+ if charStrAt(t, len(t) - 1) == ":":
+ aligns.append("center" if charStrAt(t, 0) == ":" else "right")
+ elif charStrAt(t, 0) == ":":
+ aligns.append("left")
+ else:
+ aligns.append("")
+
+ lineText = getLine(state, startLine).strip()
+ if "|" not in lineText:
+ return False
+ if state.is_code_block(startLine):
+ return False
+ columns = escapedSplit(lineText)
+ if columns and columns[0] == "":
+ columns.pop(0)
+ if columns and columns[-1] == "":
+ columns.pop()
+
+ # header row will define an amount of columns in the entire table,
+ # and align row should be exactly the same (the rest of the rows can differ)
+ columnCount = len(columns)
+ if columnCount == 0 or columnCount != len(aligns):
+ return False
+
+ if silent:
+ return True
+
+ oldParentType = state.parentType
+ state.parentType = "table"
+
+ # use 'blockquote' lists for termination because it's
+ # the most similar to tables
+ terminatorRules = state.md.block.ruler.getRules("blockquote")
+
+ token = state.push("table_open", "table", 1)
+ token.map = tableLines = [startLine, 0]
+
+ token = state.push("thead_open", "thead", 1)
+ token.map = [startLine, startLine + 1]
+
+ token = state.push("tr_open", "tr", 1)
+ token.map = [startLine, startLine + 1]
+
+ for i in range(len(columns)):
+ token = state.push("th_open", "th", 1)
+ if aligns[i]:
+ token.attrs = {"style": "text-align:" + aligns[i]}
+
+ token = state.push("inline", "", 0)
+ # note in markdown-it this map was removed in v12.0.0 however, we keep it,
+ # since it is helpful to propagate to children tokens
+ token.map = [startLine, startLine + 1]
+ token.content = columns[i].strip()
+ token.children = []
+
+ token = state.push("th_close", "th", -1)
+
+ token = state.push("tr_close", "tr", -1)
+ token = state.push("thead_close", "thead", -1)
+
+ nextLine = startLine + 2
+ while nextLine < endLine:
+ if state.sCount[nextLine] < state.blkIndent:
+ break
+
+ terminate = False
+ for i in range(len(terminatorRules)):
+ if terminatorRules[i](state, nextLine, endLine, True):
+ terminate = True
+ break
+
+ if terminate:
+ break
+ lineText = getLine(state, nextLine).strip()
+ if not lineText:
+ break
+ if state.is_code_block(nextLine):
+ break
+ columns = escapedSplit(lineText)
+ if columns and columns[0] == "":
+ columns.pop(0)
+ if columns and columns[-1] == "":
+ columns.pop()
+
+ if nextLine == startLine + 2:
+ token = state.push("tbody_open", "tbody", 1)
+ token.map = tbodyLines = [startLine + 2, 0]
+
+ token = state.push("tr_open", "tr", 1)
+ token.map = [nextLine, nextLine + 1]
+
+ for i in range(columnCount):
+ token = state.push("td_open", "td", 1)
+ if aligns[i]:
+ token.attrs = {"style": "text-align:" + aligns[i]}
+
+ token = state.push("inline", "", 0)
+ # note in markdown-it this map was removed in v12.0.0 however, we keep it,
+ # since it is helpful to propagate to children tokens
+ token.map = [nextLine, nextLine + 1]
+ try:
+ token.content = columns[i].strip() if columns[i] else ""
+ except IndexError:
+ token.content = ""
+ token.children = []
+
+ token = state.push("td_close", "td", -1)
+
+ token = state.push("tr_close", "tr", -1)
+
+ nextLine += 1
+
+ if tbodyLines:
+ token = state.push("tbody_close", "tbody", -1)
+ tbodyLines[1] = nextLine
+
+ token = state.push("table_close", "table", -1)
+
+ tableLines[1] = nextLine
+ state.parentType = oldParentType
+ state.line = nextLine
+ return True
diff --git a/third_party/python/markdown_it_py/markdown_it/rules_core/__init__.py b/third_party/python/markdown_it_py/markdown_it/rules_core/__init__.py
new file mode 100644
index 000000000000..c9c5368c2b69
--- /dev/null
+++ b/third_party/python/markdown_it_py/markdown_it/rules_core/__init__.py
@@ -0,0 +1,19 @@
+__all__ = (
+ "StateCore",
+ "normalize",
+ "block",
+ "inline",
+ "replace",
+ "smartquotes",
+ "linkify",
+ "text_join",
+)
+
+from .block import block
+from .inline import inline
+from .linkify import linkify
+from .normalize import normalize
+from .replacements import replace
+from .smartquotes import smartquotes
+from .state_core import StateCore
+from .text_join import text_join
diff --git a/third_party/python/markdown_it_py/markdown_it/rules_core/block.py b/third_party/python/markdown_it_py/markdown_it/rules_core/block.py
new file mode 100644
index 000000000000..a6c3bb8d7ae1
--- /dev/null
+++ b/third_party/python/markdown_it_py/markdown_it/rules_core/block.py
@@ -0,0 +1,13 @@
+from ..token import Token
+from .state_core import StateCore
+
+
+def block(state: StateCore) -> None:
+ if state.inlineMode:
+ token = Token("inline", "", 0)
+ token.content = state.src
+ token.map = [0, 1]
+ token.children = []
+ state.tokens.append(token)
+ else:
+ state.md.block.parse(state.src, state.md, state.env, state.tokens)
diff --git a/third_party/python/markdown_it_py/markdown_it/rules_core/inline.py b/third_party/python/markdown_it_py/markdown_it/rules_core/inline.py
new file mode 100644
index 000000000000..c3fd0b5e25dd
--- /dev/null
+++ b/third_party/python/markdown_it_py/markdown_it/rules_core/inline.py
@@ -0,0 +1,10 @@
+from .state_core import StateCore
+
+
+def inline(state: StateCore) -> None:
+ """Parse inlines"""
+ for token in state.tokens:
+ if token.type == "inline":
+ if token.children is None:
+ token.children = []
+ state.md.inline.parse(token.content, state.md, state.env, token.children)
diff --git a/third_party/python/markdown_it_py/markdown_it/rules_core/linkify.py b/third_party/python/markdown_it_py/markdown_it/rules_core/linkify.py
new file mode 100644
index 000000000000..efbc9d4c9b1c
--- /dev/null
+++ b/third_party/python/markdown_it_py/markdown_it/rules_core/linkify.py
@@ -0,0 +1,149 @@
+from __future__ import annotations
+
+import re
+from typing import Protocol
+
+from ..common.utils import arrayReplaceAt, isLinkClose, isLinkOpen
+from ..token import Token
+from .state_core import StateCore
+
+HTTP_RE = re.compile(r"^http://")
+MAILTO_RE = re.compile(r"^mailto:")
+TEST_MAILTO_RE = re.compile(r"^mailto:", flags=re.IGNORECASE)
+
+
+def linkify(state: StateCore) -> None:
+ """Rule for identifying plain-text links."""
+ if not state.md.options.linkify:
+ return
+
+ if not state.md.linkify:
+ raise ModuleNotFoundError("Linkify enabled but not installed.")
+
+ for inline_token in state.tokens:
+ if inline_token.type != "inline" or not state.md.linkify.pretest(
+ inline_token.content
+ ):
+ continue
+
+ tokens = inline_token.children
+
+ htmlLinkLevel = 0
+
+ # We scan from the end, to keep position when new tags added.
+ # Use reversed logic in links start/end match
+ assert tokens is not None
+ i = len(tokens)
+ while i >= 1:
+ i -= 1
+ assert isinstance(tokens, list)
+ currentToken = tokens[i]
+
+ # Skip content of markdown links
+ if currentToken.type == "link_close":
+ i -= 1
+ while (
+ tokens[i].level != currentToken.level
+ and tokens[i].type != "link_open"
+ ):
+ i -= 1
+ continue
+
+ # Skip content of html tag links
+ if currentToken.type == "html_inline":
+ if isLinkOpen(currentToken.content) and htmlLinkLevel > 0:
+ htmlLinkLevel -= 1
+ if isLinkClose(currentToken.content):
+ htmlLinkLevel += 1
+ if htmlLinkLevel > 0:
+ continue
+
+ if currentToken.type == "text" and state.md.linkify.test(
+ currentToken.content
+ ):
+ text = currentToken.content
+ links: list[_LinkType] = state.md.linkify.match(text) or []
+
+ # Now split string to nodes
+ nodes = []
+ level = currentToken.level
+ lastPos = 0
+
+ # forbid escape sequence at the start of the string,
+ # this avoids http\://example.com/ from being linkified as
+ # http://example.com/
+ if (
+ links
+ and links[0].index == 0
+ and i > 0
+ and tokens[i - 1].type == "text_special"
+ ):
+ links = links[1:]
+
+ for link in links:
+ url = link.url
+ fullUrl = state.md.normalizeLink(url)
+ if not state.md.validateLink(fullUrl):
+ continue
+
+ urlText = link.text
+
+ # Linkifier might send raw hostnames like "example.com", where url
+ # starts with domain name. So we prepend http:// in those cases,
+ # and remove it afterwards.
+ if not link.schema:
+ urlText = HTTP_RE.sub(
+ "", state.md.normalizeLinkText("http://" + urlText)
+ )
+ elif link.schema == "mailto:" and TEST_MAILTO_RE.search(urlText):
+ urlText = MAILTO_RE.sub(
+ "", state.md.normalizeLinkText("mailto:" + urlText)
+ )
+ else:
+ urlText = state.md.normalizeLinkText(urlText)
+
+ pos = link.index
+
+ if pos > lastPos:
+ token = Token("text", "", 0)
+ token.content = text[lastPos:pos]
+ token.level = level
+ nodes.append(token)
+
+ token = Token("link_open", "a", 1)
+ token.attrs = {"href": fullUrl}
+ token.level = level
+ level += 1
+ token.markup = "linkify"
+ token.info = "auto"
+ nodes.append(token)
+
+ token = Token("text", "", 0)
+ token.content = urlText
+ token.level = level
+ nodes.append(token)
+
+ token = Token("link_close", "a", -1)
+ level -= 1
+ token.level = level
+ token.markup = "linkify"
+ token.info = "auto"
+ nodes.append(token)
+
+ lastPos = link.last_index
+
+ if lastPos < len(text):
+ token = Token("text", "", 0)
+ token.content = text[lastPos:]
+ token.level = level
+ nodes.append(token)
+
+ inline_token.children = tokens = arrayReplaceAt(tokens, i, nodes)
+
+
+class _LinkType(Protocol):
+ url: str
+ text: str
+ index: int
+ last_index: int
+ schema: str | None
diff --git a/third_party/python/markdown_it_py/markdown_it/rules_core/normalize.py b/third_party/python/markdown_it_py/markdown_it/rules_core/normalize.py
new file mode 100644
index 000000000000..c9f8d0d5729b
--- /dev/null
+++ b/third_party/python/markdown_it_py/markdown_it/rules_core/normalize.py
@@ -0,0 +1,18 @@
+"""Normalize input string."""
+import re
+
+from .state_core import StateCore
+
+# https://spec.commonmark.org/0.29/#line-ending
+NEWLINES_RE = re.compile(r"\r\n?|\n")
+NULL_RE = re.compile(r"\0")
+
+
+def normalize(state: StateCore) -> None:
+ # Normalize newlines
+ string = NEWLINES_RE.sub("\n", state.src)
+
+ # Replace NULL characters
+ string = NULL_RE.sub("\uFFFD", string)
+
+ state.src = string
diff --git a/third_party/python/markdown_it_py/markdown_it/rules_core/replacements.py b/third_party/python/markdown_it_py/markdown_it/rules_core/replacements.py
new file mode 100644
index 000000000000..14912e17ac8e
--- /dev/null
+++ b/third_party/python/markdown_it_py/markdown_it/rules_core/replacements.py
@@ -0,0 +1,126 @@
+"""Simple typographic replacements
+
+* ``(c)``, ``(C)`` → ©
+* ``(tm)``, ``(TM)`` → ™
+* ``(r)``, ``(R)`` → ®
+* ``+-`` → ±
+* ``...`` → …
+* ``?....`` → ?..
+* ``!....`` → !..
+* ``????????`` → ???
+* ``!!!!!`` → !!!
+* ``,,,`` → ,
+* ``--`` → &ndash
+* ``---`` → &mdash
+"""
+from __future__ import annotations
+
+import logging
+import re
+
+from ..token import Token
+from .state_core import StateCore
+
+LOGGER = logging.getLogger(__name__)
+
+# TODO:
+# - fractionals 1/2, 1/4, 3/4 -> ½, ¼, ¾
+# - multiplication 2 x 4 -> 2 × 4
+
+RARE_RE = re.compile(r"\+-|\.\.|\?\?\?\?|!!!!|,,|--")
+
+# Workaround for phantomjs - need regex without /g flag,
+# or root check will fail every second time
+# SCOPED_ABBR_TEST_RE = r"\((c|tm|r)\)"
+
+SCOPED_ABBR_RE = re.compile(r"\((c|tm|r)\)", flags=re.IGNORECASE)
+
+PLUS_MINUS_RE = re.compile(r"\+-")
+
+ELLIPSIS_RE = re.compile(r"\.{2,}")
+
+ELLIPSIS_QUESTION_EXCLAMATION_RE = re.compile(r"([?!])…")
+
+QUESTION_EXCLAMATION_RE = re.compile(r"([?!]){4,}")
+
+COMMA_RE = re.compile(r",{2,}")
+
+EM_DASH_RE = re.compile(r"(^|[^-])---(?=[^-]|$)", flags=re.MULTILINE)
+
+EN_DASH_RE = re.compile(r"(^|\s)--(?=\s|$)", flags=re.MULTILINE)
+
+EN_DASH_INDENT_RE = re.compile(r"(^|[^-\s])--(?=[^-\s]|$)", flags=re.MULTILINE)
+
+
+SCOPED_ABBR = {"c": "©", "r": "®", "tm": "™"}
+
+
+def replaceFn(match: re.Match[str]) -> str:
+ return SCOPED_ABBR[match.group(1).lower()]
+
+
+def replace_scoped(inlineTokens: list[Token]) -> None:
+ inside_autolink = 0
+
+ for token in inlineTokens:
+ if token.type == "text" and not inside_autolink:
+ token.content = SCOPED_ABBR_RE.sub(replaceFn, token.content)
+
+ if token.type == "link_open" and token.info == "auto":
+ inside_autolink -= 1
+
+ if token.type == "link_close" and token.info == "auto":
+ inside_autolink += 1
+
+
+def replace_rare(inlineTokens: list[Token]) -> None:
+ inside_autolink = 0
+
+ for token in inlineTokens:
+ if (
+ token.type == "text"
+ and (not inside_autolink)
+ and RARE_RE.search(token.content)
+ ):
+ # +- -> ±
+ token.content = PLUS_MINUS_RE.sub("±", token.content)
+
+ # .., ..., ....... -> …
+ token.content = ELLIPSIS_RE.sub("…", token.content)
+
+ # but ?..... & !..... -> ?.. & !..
+ token.content = ELLIPSIS_QUESTION_EXCLAMATION_RE.sub("\\1..", token.content)
+ token.content = QUESTION_EXCLAMATION_RE.sub("\\1\\1\\1", token.content)
+
+ # ,, ,,, ,,,, -> ,
+ token.content = COMMA_RE.sub(",", token.content)
+
+ # em-dash
+ token.content = EM_DASH_RE.sub("\\1\u2014", token.content)
+
+ # en-dash
+ token.content = EN_DASH_RE.sub("\\1\u2013", token.content)
+ token.content = EN_DASH_INDENT_RE.sub("\\1\u2013", token.content)
+
+ if token.type == "link_open" and token.info == "auto":
+ inside_autolink -= 1
+
+ if token.type == "link_close" and token.info == "auto":
+ inside_autolink += 1
+
+
+def replace(state: StateCore) -> None:
+ if not state.md.options.typographer:
+ return
+
+ for token in state.tokens:
+ if token.type != "inline":
+ continue
+ if token.children is None:
+ continue
+
+ if SCOPED_ABBR_RE.search(token.content):
+ replace_scoped(token.children)
+
+ if RARE_RE.search(token.content):
+ replace_rare(token.children)
diff --git a/third_party/python/markdown_it_py/markdown_it/rules_core/smartquotes.py b/third_party/python/markdown_it_py/markdown_it/rules_core/smartquotes.py
new file mode 100644
index 000000000000..c98fbd71e7d2
--- /dev/null
+++ b/third_party/python/markdown_it_py/markdown_it/rules_core/smartquotes.py
@@ -0,0 +1,202 @@
+"""Convert straight quotation marks to typographic ones
+"""
+from __future__ import annotations
+
+import re
+from typing import Any
+
+from ..common.utils import charCodeAt, isMdAsciiPunct, isPunctChar, isWhiteSpace
+from ..token import Token
+from .state_core import StateCore
+
+QUOTE_TEST_RE = re.compile(r"['\"]")
+QUOTE_RE = re.compile(r"['\"]")
+APOSTROPHE = "\u2019" # ’
+
+
+def replaceAt(string: str, index: int, ch: str) -> str:
+ # When the index is negative, the behavior is different from the js version.
+ # But basically, the index will not be negative.
+ assert index >= 0
+ return string[:index] + ch + string[index + 1 :]
+
+
+def process_inlines(tokens: list[Token], state: StateCore) -> None:
+ stack: list[dict[str, Any]] = []
+
+ for i, token in enumerate(tokens):
+ thisLevel = token.level
+
+ j = 0
+ for j in range(len(stack))[::-1]:
+ if stack[j]["level"] <= thisLevel:
+ break
+ else:
+ # When the loop is terminated without a "break".
+ # Subtract 1 to get the same index as the js version.
+ j -= 1
+
+ stack = stack[: j + 1]
+
+ if token.type != "text":
+ continue
+
+ text = token.content
+ pos = 0
+ maximum = len(text)
+
+ while pos < maximum:
+ goto_outer = False
+ lastIndex = pos
+ t = QUOTE_RE.search(text[lastIndex:])
+ if not t:
+ break
+
+ canOpen = canClose = True
+ pos = t.start(0) + lastIndex + 1
+ isSingle = t.group(0) == "'"
+
+ # Find previous character,
+ # default to space if it's the beginning of the line
+ lastChar: None | int = 0x20
+
+ if t.start(0) + lastIndex - 1 >= 0:
+ lastChar = charCodeAt(text, t.start(0) + lastIndex - 1)
+ else:
+ for j in range(i)[::-1]:
+ if tokens[j].type == "softbreak" or tokens[j].type == "hardbreak":
+ break
+ # should skip all tokens except 'text', 'html_inline' or 'code_inline'
+ if not tokens[j].content:
+ continue
+
+ lastChar = charCodeAt(tokens[j].content, len(tokens[j].content) - 1)
+ break
+
+ # Find next character,
+ # default to space if it's the end of the line
+ nextChar: None | int = 0x20
+
+ if pos < maximum:
+ nextChar = charCodeAt(text, pos)
+ else:
+ for j in range(i + 1, len(tokens)):
+ # nextChar defaults to 0x20
+ if tokens[j].type == "softbreak" or tokens[j].type == "hardbreak":
+ break
+ # should skip all tokens except 'text', 'html_inline' or 'code_inline'
+ if not tokens[j].content:
+ continue
+
+ nextChar = charCodeAt(tokens[j].content, 0)
+ break
+
+ isLastPunctChar = lastChar is not None and (
+ isMdAsciiPunct(lastChar) or isPunctChar(chr(lastChar))
+ )
+ isNextPunctChar = nextChar is not None and (
+ isMdAsciiPunct(nextChar) or isPunctChar(chr(nextChar))
+ )
+
+ isLastWhiteSpace = lastChar is not None and isWhiteSpace(lastChar)
+ isNextWhiteSpace = nextChar is not None and isWhiteSpace(nextChar)
+
+ if isNextWhiteSpace: # noqa: SIM114
+ canOpen = False
+ elif isNextPunctChar and not (isLastWhiteSpace or isLastPunctChar):
+ canOpen = False
+
+ if isLastWhiteSpace: # noqa: SIM114
+ canClose = False
+ elif isLastPunctChar and not (isNextWhiteSpace or isNextPunctChar):
+ canClose = False
+
+ if nextChar == 0x22 and t.group(0) == '"': # 0x22: " # noqa: SIM102
+ if (
+ lastChar is not None and lastChar >= 0x30 and lastChar <= 0x39
+ ): # 0x30: 0, 0x39: 9
+ # special case: 1"" - count first quote as an inch
+ canClose = canOpen = False
+
+ if canOpen and canClose:
+ # Replace quotes in the middle of punctuation sequence, but not
+ # in the middle of the words, i.e.:
+ #
+ # 1. foo " bar " baz - not replaced
+ # 2. foo-"-bar-"-baz - replaced
+ # 3. foo"bar"baz - not replaced
+ canOpen = isLastPunctChar
+ canClose = isNextPunctChar
+
+ if not canOpen and not canClose:
+ # middle of word
+ if isSingle:
+ token.content = replaceAt(
+ token.content, t.start(0) + lastIndex, APOSTROPHE
+ )
+ continue
+
+ if canClose:
+ # this could be a closing quote, rewind the stack to get a match
+ for j in range(len(stack))[::-1]:
+ item = stack[j]
+ if stack[j]["level"] < thisLevel:
+ break
+ if item["single"] == isSingle and stack[j]["level"] == thisLevel:
+ item = stack[j]
+
+ if isSingle:
+ openQuote = state.md.options.quotes[2]
+ closeQuote = state.md.options.quotes[3]
+ else:
+ openQuote = state.md.options.quotes[0]
+ closeQuote = state.md.options.quotes[1]
+
+ # replace token.content *before* tokens[item.token].content,
+ # because, if they are pointing at the same token, replaceAt
+ # could mess up indices when quote length != 1
+ token.content = replaceAt(
+ token.content, t.start(0) + lastIndex, closeQuote
+ )
+ tokens[item["token"]].content = replaceAt(
+ tokens[item["token"]].content, item["pos"], openQuote
+ )
+
+ pos += len(closeQuote) - 1
+ if item["token"] == i:
+ pos += len(openQuote) - 1
+
+ text = token.content
+ maximum = len(text)
+
+ stack = stack[:j]
+ goto_outer = True
+ break
+ if goto_outer:
+ goto_outer = False
+ continue
+
+ if canOpen:
+ stack.append(
+ {
+ "token": i,
+ "pos": t.start(0) + lastIndex,
+ "single": isSingle,
+ "level": thisLevel,
+ }
+ )
+ elif canClose and isSingle:
+ token.content = replaceAt(
+ token.content, t.start(0) + lastIndex, APOSTROPHE
+ )
+
+
+def smartquotes(state: StateCore) -> None:
+ if not state.md.options.typographer:
+ return
+
+ for token in state.tokens:
+ if token.type != "inline" or not QUOTE_RE.search(token.content):
+ continue
+ if token.children is not None:
+ process_inlines(token.children, state)
diff --git a/third_party/python/markdown_it_py/markdown_it/rules_core/state_core.py b/third_party/python/markdown_it_py/markdown_it/rules_core/state_core.py
new file mode 100644
index 000000000000..a938041d992f
--- /dev/null
+++ b/third_party/python/markdown_it_py/markdown_it/rules_core/state_core.py
@@ -0,0 +1,25 @@
+from __future__ import annotations
+
+from typing import TYPE_CHECKING
+
+from ..ruler import StateBase
+from ..token import Token
+from ..utils import EnvType
+
+if TYPE_CHECKING:
+ from markdown_it import MarkdownIt
+
+
+class StateCore(StateBase):
+ def __init__(
+ self,
+ src: str,
+ md: MarkdownIt,
+ env: EnvType,
+ tokens: list[Token] | None = None,
+ ) -> None:
+ self.src = src
+ self.md = md # link to parser instance
+ self.env = env
+ self.tokens: list[Token] = tokens or []
+ self.inlineMode = False
diff --git a/third_party/python/markdown_it_py/markdown_it/rules_core/text_join.py b/third_party/python/markdown_it_py/markdown_it/rules_core/text_join.py
new file mode 100644
index 000000000000..d54ccbbc376e
--- /dev/null
+++ b/third_party/python/markdown_it_py/markdown_it/rules_core/text_join.py
@@ -0,0 +1,34 @@
+"""Join raw text tokens with the rest of the text
+
+This is set as a separate rule to provide an opportunity for plugins
+to run text replacements after text join, but before escape join.
+
+For example, `\\:)` shouldn't be replaced with an emoji.
+"""
+from __future__ import annotations
+
+from ..token import Token
+from .state_core import StateCore
+
+
+def text_join(state: StateCore) -> None:
+ """Join raw text for escape sequences (`text_special`) tokens with the rest of the text"""
+
+ for inline_token in state.tokens[:]:
+ if inline_token.type != "inline":
+ continue
+
+ # convert text_special to text and join all adjacent text nodes
+ new_tokens: list[Token] = []
+ for child_token in inline_token.children or []:
+ if child_token.type == "text_special":
+ child_token.type = "text"
+ if (
+ child_token.type == "text"
+ and new_tokens
+ and new_tokens[-1].type == "text"
+ ):
+ new_tokens[-1].content += child_token.content
+ else:
+ new_tokens.append(child_token)
+ inline_token.children = new_tokens
diff --git a/third_party/python/markdown_it_py/markdown_it/rules_inline/__init__.py b/third_party/python/markdown_it_py/markdown_it/rules_inline/__init__.py
new file mode 100644
index 000000000000..3a8026ec3a7a
--- /dev/null
+++ b/third_party/python/markdown_it_py/markdown_it/rules_inline/__init__.py
@@ -0,0 +1,31 @@
+__all__ = (
+ "StateInline",
+ "text",
+ "fragments_join",
+ "link_pairs",
+ "linkify",
+ "escape",
+ "newline",
+ "backtick",
+ "emphasis",
+ "image",
+ "link",
+ "autolink",
+ "entity",
+ "html_inline",
+ "strikethrough",
+)
+from . import emphasis, strikethrough
+from .autolink import autolink
+from .backticks import backtick
+from .balance_pairs import link_pairs
+from .entity import entity
+from .escape import escape
+from .fragments_join import fragments_join
+from .html_inline import html_inline
+from .image import image
+from .link import link
+from .linkify import linkify
+from .newline import newline
+from .state_inline import StateInline
+from .text import text
diff --git a/third_party/python/markdown_it_py/markdown_it/rules_inline/autolink.py b/third_party/python/markdown_it_py/markdown_it/rules_inline/autolink.py
new file mode 100644
index 000000000000..295d963f3925
--- /dev/null
+++ b/third_party/python/markdown_it_py/markdown_it/rules_inline/autolink.py
@@ -0,0 +1,77 @@
+# Process autolinks ''
+import re
+
+from .state_inline import StateInline
+
+EMAIL_RE = re.compile(
+ r"^([a-zA-Z0-9.!#$%&\'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*)$" # noqa: E501
+)
+AUTOLINK_RE = re.compile(r"^([a-zA-Z][a-zA-Z0-9+.\-]{1,31}):([^<>\x00-\x20]*)$")
+
+
+def autolink(state: StateInline, silent: bool) -> bool:
+ pos = state.pos
+
+ if state.src[pos] != "<":
+ return False
+
+ start = state.pos
+ maximum = state.posMax
+
+ while True:
+ pos += 1
+ if pos >= maximum:
+ return False
+
+ ch = state.src[pos]
+
+ if ch == "<":
+ return False
+ if ch == ">":
+ break
+
+ url = state.src[start + 1 : pos]
+
+ if AUTOLINK_RE.search(url) is not None:
+ fullUrl = state.md.normalizeLink(url)
+ if not state.md.validateLink(fullUrl):
+ return False
+
+ if not silent:
+ token = state.push("link_open", "a", 1)
+ token.attrs = {"href": fullUrl}
+ token.markup = "autolink"
+ token.info = "auto"
+
+ token = state.push("text", "", 0)
+ token.content = state.md.normalizeLinkText(url)
+
+ token = state.push("link_close", "a", -1)
+ token.markup = "autolink"
+ token.info = "auto"
+
+ state.pos += len(url) + 2
+ return True
+
+ if EMAIL_RE.search(url) is not None:
+ fullUrl = state.md.normalizeLink("mailto:" + url)
+ if not state.md.validateLink(fullUrl):
+ return False
+
+ if not silent:
+ token = state.push("link_open", "a", 1)
+ token.attrs = {"href": fullUrl}
+ token.markup = "autolink"
+ token.info = "auto"
+
+ token = state.push("text", "", 0)
+ token.content = state.md.normalizeLinkText(url)
+
+ token = state.push("link_close", "a", -1)
+ token.markup = "autolink"
+ token.info = "auto"
+
+ state.pos += len(url) + 2
+ return True
+
+ return False
diff --git a/third_party/python/markdown_it_py/markdown_it/rules_inline/backticks.py b/third_party/python/markdown_it_py/markdown_it/rules_inline/backticks.py
new file mode 100644
index 000000000000..fc60d6b15cdf
--- /dev/null
+++ b/third_party/python/markdown_it_py/markdown_it/rules_inline/backticks.py
@@ -0,0 +1,72 @@
+# Parse backticks
+import re
+
+from .state_inline import StateInline
+
+regex = re.compile("^ (.+) $")
+
+
+def backtick(state: StateInline, silent: bool) -> bool:
+ pos = state.pos
+
+ if state.src[pos] != "`":
+ return False
+
+ start = pos
+ pos += 1
+ maximum = state.posMax
+
+ # scan marker length
+ while pos < maximum and (state.src[pos] == "`"):
+ pos += 1
+
+ marker = state.src[start:pos]
+ openerLength = len(marker)
+
+ if state.backticksScanned and state.backticks.get(openerLength, 0) <= start:
+ if not silent:
+ state.pending += marker
+ state.pos += openerLength
+ return True
+
+ matchStart = matchEnd = pos
+
+ # Nothing found in the cache, scan until the end of the line (or until marker is found)
+ while True:
+ try:
+ matchStart = state.src.index("`", matchEnd)
+ except ValueError:
+ break
+ matchEnd = matchStart + 1
+
+ # scan marker length
+ while matchEnd < maximum and (state.src[matchEnd] == "`"):
+ matchEnd += 1
+
+ closerLength = matchEnd - matchStart
+
+ if closerLength == openerLength:
+ # Found matching closer length.
+ if not silent:
+ token = state.push("code_inline", "code", 0)
+ token.markup = marker
+ token.content = state.src[pos:matchStart].replace("\n", " ")
+ if (
+ token.content.startswith(" ")
+ and token.content.endswith(" ")
+ and len(token.content.strip()) > 0
+ ):
+ token.content = token.content[1:-1]
+ state.pos = matchEnd
+ return True
+
+ # Some different length found, put it in cache as upper limit of where closer can be found
+ state.backticks[closerLength] = matchStart
+
+ # Scanned through the end, didn't find anything
+ state.backticksScanned = True
+
+ if not silent:
+ state.pending += marker
+ state.pos += openerLength
+ return True
diff --git a/third_party/python/markdown_it_py/markdown_it/rules_inline/balance_pairs.py b/third_party/python/markdown_it_py/markdown_it/rules_inline/balance_pairs.py
new file mode 100644
index 000000000000..bbb2101c7e16
--- /dev/null
+++ b/third_party/python/markdown_it_py/markdown_it/rules_inline/balance_pairs.py
@@ -0,0 +1,137 @@
+"""Balance paired characters (*, _, etc) in inline tokens."""
+from __future__ import annotations
+
+from .state_inline import Delimiter, StateInline
+
+
+def processDelimiters(state: StateInline, delimiters: list[Delimiter]) -> None:
+ """For each opening emphasis-like marker find a matching closing one."""
+ if not delimiters:
+ return
+
+ openersBottom = {}
+ maximum = len(delimiters)
+
+ # headerIdx is the first delimiter of the current (where closer is) delimiter run
+ headerIdx = 0
+ lastTokenIdx = -2 # needs any value lower than -1
+ jumps: list[int] = []
+ closerIdx = 0
+ while closerIdx < maximum:
+ closer = delimiters[closerIdx]
+
+ jumps.append(0)
+
+ # markers belong to same delimiter run if:
+ # - they have adjacent tokens
+ # - AND markers are the same
+ #
+ if (
+ delimiters[headerIdx].marker != closer.marker
+ or lastTokenIdx != closer.token - 1
+ ):
+ headerIdx = closerIdx
+ lastTokenIdx = closer.token
+
+ # Length is only used for emphasis-specific "rule of 3",
+ # if it's not defined (in strikethrough or 3rd party plugins),
+ # we can default it to 0 to disable those checks.
+ #
+ closer.length = closer.length or 0
+
+ if not closer.close:
+ closerIdx += 1
+ continue
+
+ # Previously calculated lower bounds (previous fails)
+ # for each marker, each delimiter length modulo 3,
+ # and for whether this closer can be an opener;
+ # https://github.com/commonmark/cmark/commit/34250e12ccebdc6372b8b49c44fab57c72443460
+ if closer.marker not in openersBottom:
+ openersBottom[closer.marker] = [-1, -1, -1, -1, -1, -1]
+
+ minOpenerIdx = openersBottom[closer.marker][
+ (3 if closer.open else 0) + (closer.length % 3)
+ ]
+
+ openerIdx = headerIdx - jumps[headerIdx] - 1
+
+ newMinOpenerIdx = openerIdx
+
+ while openerIdx > minOpenerIdx:
+ opener = delimiters[openerIdx]
+
+ if opener.marker != closer.marker:
+ openerIdx -= jumps[openerIdx] + 1
+ continue
+
+ if opener.open and opener.end < 0:
+ isOddMatch = False
+
+ # from spec:
+ #
+ # If one of the delimiters can both open and close emphasis, then the
+ # sum of the lengths of the delimiter runs containing the opening and
+ # closing delimiters must not be a multiple of 3 unless both lengths
+ # are multiples of 3.
+ #
+ if (
+ (opener.close or closer.open)
+ and ((opener.length + closer.length) % 3 == 0)
+ and (opener.length % 3 != 0 or closer.length % 3 != 0)
+ ):
+ isOddMatch = True
+
+ if not isOddMatch:
+ # If previous delimiter cannot be an opener, we can safely skip
+ # the entire sequence in future checks. This is required to make
+ # sure algorithm has linear complexity (see *_*_*_*_*_... case).
+ #
+ if openerIdx > 0 and not delimiters[openerIdx - 1].open:
+ lastJump = jumps[openerIdx - 1] + 1
+ else:
+ lastJump = 0
+
+ jumps[closerIdx] = closerIdx - openerIdx + lastJump
+ jumps[openerIdx] = lastJump
+
+ closer.open = False
+ opener.end = closerIdx
+ opener.close = False
+ newMinOpenerIdx = -1
+
+ # treat next token as start of run,
+ # it optimizes skips in **<...>**a**<...>** pathological case
+ lastTokenIdx = -2
+
+ break
+
+ openerIdx -= jumps[openerIdx] + 1
+
+ if newMinOpenerIdx != -1:
+ # If match for this delimiter run failed, we want to set lower bound for
+ # future lookups. This is required to make sure algorithm has linear
+ # complexity.
+ #
+ # See details here:
+ # https:#github.com/commonmark/cmark/issues/178#issuecomment-270417442
+ #
+ openersBottom[closer.marker][
+ (3 if closer.open else 0) + ((closer.length or 0) % 3)
+ ] = newMinOpenerIdx
+
+ closerIdx += 1
+
+
+def link_pairs(state: StateInline) -> None:
+ tokens_meta = state.tokens_meta
+ maximum = len(state.tokens_meta)
+
+ processDelimiters(state, state.delimiters)
+
+ curr = 0
+ while curr < maximum:
+ curr_meta = tokens_meta[curr]
+ if curr_meta and "delimiters" in curr_meta:
+ processDelimiters(state, curr_meta["delimiters"])
+ curr += 1
diff --git a/third_party/python/markdown_it_py/markdown_it/rules_inline/emphasis.py b/third_party/python/markdown_it_py/markdown_it/rules_inline/emphasis.py
new file mode 100644
index 000000000000..9a98f9e216c9
--- /dev/null
+++ b/third_party/python/markdown_it_py/markdown_it/rules_inline/emphasis.py
@@ -0,0 +1,102 @@
+# Process *this* and _that_
+#
+from __future__ import annotations
+
+from .state_inline import Delimiter, StateInline
+
+
+def tokenize(state: StateInline, silent: bool) -> bool:
+ """Insert each marker as a separate text token, and add it to delimiter list"""
+ start = state.pos
+ marker = state.src[start]
+
+ if silent:
+ return False
+
+ if marker not in ("_", "*"):
+ return False
+
+ scanned = state.scanDelims(state.pos, marker == "*")
+
+ for _ in range(scanned.length):
+ token = state.push("text", "", 0)
+ token.content = marker
+ state.delimiters.append(
+ Delimiter(
+ marker=ord(marker),
+ length=scanned.length,
+ token=len(state.tokens) - 1,
+ end=-1,
+ open=scanned.can_open,
+ close=scanned.can_close,
+ )
+ )
+
+ state.pos += scanned.length
+
+ return True
+
+
+def _postProcess(state: StateInline, delimiters: list[Delimiter]) -> None:
+ i = len(delimiters) - 1
+ while i >= 0:
+ startDelim = delimiters[i]
+
+ # /* _ */ /* * */
+ if startDelim.marker != 0x5F and startDelim.marker != 0x2A:
+ i -= 1
+ continue
+
+ # Process only opening markers
+ if startDelim.end == -1:
+ i -= 1
+ continue
+
+ endDelim = delimiters[startDelim.end]
+
+ # If the previous delimiter has the same marker and is adjacent to this one,
+ # merge those into one strong delimiter.
+ #
+ # `whatever` -> `whatever`
+ #
+ isStrong = (
+ i > 0
+ and delimiters[i - 1].end == startDelim.end + 1
+ # check that first two markers match and adjacent
+ and delimiters[i - 1].marker == startDelim.marker
+ and delimiters[i - 1].token == startDelim.token - 1
+ # check that last two markers are adjacent (we can safely assume they match)
+ and delimiters[startDelim.end + 1].token == endDelim.token + 1
+ )
+
+ ch = chr(startDelim.marker)
+
+ token = state.tokens[startDelim.token]
+ token.type = "strong_open" if isStrong else "em_open"
+ token.tag = "strong" if isStrong else "em"
+ token.nesting = 1
+ token.markup = ch + ch if isStrong else ch
+ token.content = ""
+
+ token = state.tokens[endDelim.token]
+ token.type = "strong_close" if isStrong else "em_close"
+ token.tag = "strong" if isStrong else "em"
+ token.nesting = -1
+ token.markup = ch + ch if isStrong else ch
+ token.content = ""
+
+ if isStrong:
+ state.tokens[delimiters[i - 1].token].content = ""
+ state.tokens[delimiters[startDelim.end + 1].token].content = ""
+ i -= 1
+
+ i -= 1
+
+
+def postProcess(state: StateInline) -> None:
+ """Walk through delimiter list and replace text tokens with tags."""
+ _postProcess(state, state.delimiters)
+
+ for token in state.tokens_meta:
+ if token and "delimiters" in token:
+ _postProcess(state, token["delimiters"])
diff --git a/third_party/python/markdown_it_py/markdown_it/rules_inline/entity.py b/third_party/python/markdown_it_py/markdown_it/rules_inline/entity.py
new file mode 100644
index 000000000000..ec9d39650e5b
--- /dev/null
+++ b/third_party/python/markdown_it_py/markdown_it/rules_inline/entity.py
@@ -0,0 +1,53 @@
+# Process html entity - {, ¯, ", ...
+import re
+
+from ..common.entities import entities
+from ..common.utils import fromCodePoint, isValidEntityCode
+from .state_inline import StateInline
+
+DIGITAL_RE = re.compile(r"^((?:x[a-f0-9]{1,6}|[0-9]{1,7}));", re.IGNORECASE)
+NAMED_RE = re.compile(r"^&([a-z][a-z0-9]{1,31});", re.IGNORECASE)
+
+
+def entity(state: StateInline, silent: bool) -> bool:
+ pos = state.pos
+ maximum = state.posMax
+
+ if state.src[pos] != "&":
+ return False
+
+ if pos + 1 >= maximum:
+ return False
+
+ if state.src[pos + 1] == "#":
+ if match := DIGITAL_RE.search(state.src[pos:]):
+ if not silent:
+ match1 = match.group(1)
+ code = (
+ int(match1[1:], 16) if match1[0].lower() == "x" else int(match1, 10)
+ )
+
+ token = state.push("text_special", "", 0)
+ token.content = (
+ fromCodePoint(code)
+ if isValidEntityCode(code)
+ else fromCodePoint(0xFFFD)
+ )
+ token.markup = match.group(0)
+ token.info = "entity"
+
+ state.pos += len(match.group(0))
+ return True
+
+ else:
+ if (match := NAMED_RE.search(state.src[pos:])) and match.group(1) in entities:
+ if not silent:
+ token = state.push("text_special", "", 0)
+ token.content = entities[match.group(1)]
+ token.markup = match.group(0)
+ token.info = "entity"
+
+ state.pos += len(match.group(0))
+ return True
+
+ return False
diff --git a/third_party/python/markdown_it_py/markdown_it/rules_inline/escape.py b/third_party/python/markdown_it_py/markdown_it/rules_inline/escape.py
new file mode 100644
index 000000000000..9f68b5dfad17
--- /dev/null
+++ b/third_party/python/markdown_it_py/markdown_it/rules_inline/escape.py
@@ -0,0 +1,92 @@
+"""
+Process escaped chars and hardbreaks
+"""
+from ..common.utils import isStrSpace
+from .state_inline import StateInline
+
+
+def escape(state: StateInline, silent: bool) -> bool:
+ """Process escaped chars and hardbreaks."""
+ pos = state.pos
+ maximum = state.posMax
+
+ if state.src[pos] != "\\":
+ return False
+
+ pos += 1
+
+ # '\' at the end of the inline block
+ if pos >= maximum:
+ return False
+
+ ch1 = state.src[pos]
+ ch1_ord = ord(ch1)
+ if ch1 == "\n":
+ if not silent:
+ state.push("hardbreak", "br", 0)
+ pos += 1
+ # skip leading whitespaces from next line
+ while pos < maximum:
+ ch = state.src[pos]
+ if not isStrSpace(ch):
+ break
+ pos += 1
+
+ state.pos = pos
+ return True
+
+ escapedStr = state.src[pos]
+
+ if ch1_ord >= 0xD800 and ch1_ord <= 0xDBFF and pos + 1 < maximum:
+ ch2 = state.src[pos + 1]
+ ch2_ord = ord(ch2)
+ if ch2_ord >= 0xDC00 and ch2_ord <= 0xDFFF:
+ escapedStr += ch2
+ pos += 1
+
+ origStr = "\\" + escapedStr
+
+ if not silent:
+ token = state.push("text_special", "", 0)
+ token.content = escapedStr if ch1 in _ESCAPED else origStr
+ token.markup = origStr
+ token.info = "escape"
+
+ state.pos = pos + 1
+ return True
+
+
+_ESCAPED = {
+ "!",
+ '"',
+ "#",
+ "$",
+ "%",
+ "&",
+ "'",
+ "(",
+ ")",
+ "*",
+ "+",
+ ",",
+ "-",
+ ".",
+ "/",
+ ":",
+ ";",
+ "<",
+ "=",
+ ">",
+ "?",
+ "@",
+ "[",
+ "\\",
+ "]",
+ "^",
+ "_",
+ "`",
+ "{",
+ "|",
+ "}",
+ "~",
+}
diff --git a/third_party/python/markdown_it_py/markdown_it/rules_inline/fragments_join.py b/third_party/python/markdown_it_py/markdown_it/rules_inline/fragments_join.py
new file mode 100644
index 000000000000..f795c1364b8a
--- /dev/null
+++ b/third_party/python/markdown_it_py/markdown_it/rules_inline/fragments_join.py
@@ -0,0 +1,43 @@
+from .state_inline import StateInline
+
+
+def fragments_join(state: StateInline) -> None:
+ """
+ Clean up tokens after emphasis and strikethrough postprocessing:
+ merge adjacent text nodes into one and re-calculate all token levels
+
+ This is necessary because initially emphasis delimiter markers (``*, _, ~``)
+ are treated as their own separate text tokens. Then emphasis rule either
+ leaves them as text (needed to merge with adjacent text) or turns them
+ into opening/closing tags (which messes up levels inside).
+ """
+ level = 0
+ maximum = len(state.tokens)
+
+ curr = last = 0
+ while curr < maximum:
+ # re-calculate levels after emphasis/strikethrough turns some text nodes
+ # into opening/closing tags
+ if state.tokens[curr].nesting < 0:
+ level -= 1 # closing tag
+ state.tokens[curr].level = level
+ if state.tokens[curr].nesting > 0:
+ level += 1 # opening tag
+
+ if (
+ state.tokens[curr].type == "text"
+ and curr + 1 < maximum
+ and state.tokens[curr + 1].type == "text"
+ ):
+ # collapse two adjacent text nodes
+ state.tokens[curr + 1].content = (
+ state.tokens[curr].content + state.tokens[curr + 1].content
+ )
+ else:
+ if curr != last:
+ state.tokens[last] = state.tokens[curr]
+ last += 1
+ curr += 1
+
+ if curr != last:
+ del state.tokens[last:]
diff --git a/third_party/python/markdown_it_py/markdown_it/rules_inline/html_inline.py b/third_party/python/markdown_it_py/markdown_it/rules_inline/html_inline.py
new file mode 100644
index 000000000000..9065e1d034da
--- /dev/null
+++ b/third_party/python/markdown_it_py/markdown_it/rules_inline/html_inline.py
@@ -0,0 +1,43 @@
+# Process html tags
+from ..common.html_re import HTML_TAG_RE
+from ..common.utils import isLinkClose, isLinkOpen
+from .state_inline import StateInline
+
+
+def isLetter(ch: int) -> bool:
+ lc = ch | 0x20 # to lower case
+ # /* a */ and /* z */
+ return (lc >= 0x61) and (lc <= 0x7A)
+
+
+def html_inline(state: StateInline, silent: bool) -> bool:
+ pos = state.pos
+
+ if not state.md.options.get("html", None):
+ return False
+
+ # Check start
+ maximum = state.posMax
+ if state.src[pos] != "<" or pos + 2 >= maximum:
+ return False
+
+ # Quick fail on second char
+ ch = state.src[pos + 1]
+ if ch not in ("!", "?", "/") and not isLetter(ord(ch)): # /* / */
+ return False
+
+ match = HTML_TAG_RE.search(state.src[pos:])
+ if not match:
+ return False
+
+ if not silent:
+ token = state.push("html_inline", "", 0)
+ token.content = state.src[pos : pos + len(match.group(0))]
+
+ if isLinkOpen(token.content):
+ state.linkLevel += 1
+ if isLinkClose(token.content):
+ state.linkLevel -= 1
+
+ state.pos += len(match.group(0))
+ return True
diff --git a/third_party/python/markdown_it_py/markdown_it/rules_inline/image.py b/third_party/python/markdown_it_py/markdown_it/rules_inline/image.py
new file mode 100644
index 000000000000..b4a32a9f5880
--- /dev/null
+++ b/third_party/python/markdown_it_py/markdown_it/rules_inline/image.py
@@ -0,0 +1,148 @@
+# Process 
+from __future__ import annotations
+
+from ..common.utils import isStrSpace, normalizeReference
+from ..token import Token
+from .state_inline import StateInline
+
+
+def image(state: StateInline, silent: bool) -> bool:
+ label = None
+ href = ""
+ oldPos = state.pos
+ max = state.posMax
+
+ if state.src[state.pos] != "!":
+ return False
+
+ if state.pos + 1 < state.posMax and state.src[state.pos + 1] != "[":
+ return False
+
+ labelStart = state.pos + 2
+ labelEnd = state.md.helpers.parseLinkLabel(state, state.pos + 1, False)
+
+ # parser failed to find ']', so it's not a valid link
+ if labelEnd < 0:
+ return False
+
+ pos = labelEnd + 1
+
+ if pos < max and state.src[pos] == "(":
+ #
+ # Inline link
+ #
+
+ # [link]( "title" )
+ # ^^ skipping these spaces
+ pos += 1
+ while pos < max:
+ ch = state.src[pos]
+ if not isStrSpace(ch) and ch != "\n":
+ break
+ pos += 1
+
+ if pos >= max:
+ return False
+
+ # [link]( "title" )
+ # ^^^^^^ parsing link destination
+ start = pos
+ res = state.md.helpers.parseLinkDestination(state.src, pos, state.posMax)
+ if res.ok:
+ href = state.md.normalizeLink(res.str)
+ if state.md.validateLink(href):
+ pos = res.pos
+ else:
+ href = ""
+
+ # [link]( "title" )
+ # ^^ skipping these spaces
+ start = pos
+ while pos < max:
+ ch = state.src[pos]
+ if not isStrSpace(ch) and ch != "\n":
+ break
+ pos += 1
+
+ # [link]( "title" )
+ # ^^^^^^^ parsing link title
+ res = state.md.helpers.parseLinkTitle(state.src, pos, state.posMax)
+ if pos < max and start != pos and res.ok:
+ title = res.str
+ pos = res.pos
+
+ # [link](